diff --git a/.gitignore b/.gitignore
index f105f88..ff9dcbb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,6 @@
-dist
-node_modules
-.env.keys
-data
-db
-coverage
+dist
+node_modules
+.env.keys
+data
+db
+coverage
diff --git a/.kilocode/rules/memory-bank-instructions.md b/.kilocode/rules/memory-bank-instructions.md
index 13405ef..a235fcf 100644
--- a/.kilocode/rules/memory-bank-instructions.md
+++ b/.kilocode/rules/memory-bank-instructions.md
@@ -1,179 +1,179 @@
-# Memory Bank
-
-I am an expert software engineer with a unique characteristic: my memory resets completely between sessions. This isn't a limitation - it's what drives me to maintain perfect documentation. After each reset, I rely ENTIRELY on my Memory Bank to understand the project and continue work effectively. I MUST read ALL memory bank files at the start of EVERY task - this is not optional. The memory bank files are located in `.kilocode/rules/memory-bank` folder.
-
-When I start a task, I will include `[Memory Bank: Active]` at the beginning of my response if I successfully read the memory bank files, or `[Memory Bank: Missing]` if the folder doesn't exist or is empty. If memory bank is missing, I will warn the user about potential issues and suggest initialization.
-
-## Memory Bank Structure
-
-The Memory Bank consists of core files and optional context files, all in Markdown format.
-
-### Core Files (Required)
-
-1. `brief.md`
- This file is created and maintained manually by the developer. Don't edit this file directly but suggest to user to update it if it can be improved.
- - Foundation document that shapes all other files
- - Created at project start if it doesn't exist
- - Defines core requirements and goals
- - Source of truth for project scope
-
-2. `product.md`
- - Why this project exists
- - Problems it solves
- - How it should work
- - User experience goals
-
-3. `context.md`
- This file should be short and factual, not creative or speculative.
- - Current work focus
- - Recent changes
- - Next steps
-
-4. `architecture.md`
- - System architecture
- - Source Code paths
- - Key technical decisions
- - Design patterns in use
- - Component relationships
- - Critical implementation paths
-
-5. `tech.md`
- - Technologies used
- - Development setup
- - Technical constraints
- - Dependencies
- - Tool usage patterns
-
-### Additional Files
-
-Create additional files/folders within memory-bank/ when they help organize:
-
-- `tasks.md` - Documentation of repetitive tasks and their workflows
-- Complex feature documentation
-- Integration specifications
-- API documentation
-- Testing strategies
-- Deployment procedures
-
-## Core workflows
-
-### Memory Bank Initialization
-
-The initialization step is CRITICALLY IMPORTANT and must be done with extreme thoroughness as it defines all future effectiveness of the Memory Bank. This is the foundation upon which all future interactions will be built.
-
-When user requests initialization of the memory bank (command `initialize memory bank`), I'll perform an exhaustive analysis of the project, including:
-
-- All source code files and their relationships
-- Configuration files and build system setup
-- Project structure and organization patterns
-- Documentation and comments
-- Dependencies and external integrations
-- Testing frameworks and patterns
-
-I must be extremely thorough during initialization, spending extra time and effort to build a comprehensive understanding of the project. A high-quality initialization will dramatically improve all future interactions, while a rushed or incomplete initialization will permanently limit my effectiveness.
-
-After initialization, I will ask the user to read through the memory bank files and verify product description, used technologies and other information. I should provide a summary of what I've understood about the project to help the user verify the accuracy of the memory bank files. I should encourage the user to correct any misunderstandings or add missing information, as this will significantly improve future interactions.
-
-### Memory Bank Update
-
-Memory Bank updates occur when:
-
-1. Discovering new project patterns
-2. After implementing significant changes
-3. When user explicitly requests with the phrase **update memory bank** (MUST review ALL files)
-4. When context needs clarification
-
-If I notice significant changes that should be preserved but the user hasn't explicitly requested an update, I should suggest: "Would you like me to update the memory bank to reflect these changes?"
-
-To execute Memory Bank update, I will:
-
-1. Review ALL project files
-2. Document current state
-3. Document Insights & Patterns
-4. If requested with additional context (e.g., "update memory bank using information from @/Makefile"), focus special attention on that source
-
-Note: When triggered by **update memory bank**, I MUST review every memory bank file, even if some don't require updates. Focus particularly on context.md as it tracks current state.
-
-### Add Task
-
-When user completes a repetitive task (like adding support for a new model version) and wants to document it for future reference, they can request: **add task** or **store this as a task**.
-
-This workflow is designed for repetitive tasks that follow similar patterns and require editing the same files. Examples include:
-
-- Adding support for new AI model versions
-- Implementing new API endpoints following established patterns
-- Adding new features that follow existing architecture
-
-Tasks are stored in the file `tasks.md` in the memory bank folder. The file is optional and can be empty. The file can store many tasks.
-
-To execute Add Task workflow:
-
-1. Create or update `tasks.md` in the memory bank folder
-2. Document the task with:
- - Task name and description
- - Files that need to be modified
- - Step-by-step workflow followed
- - Important considerations or gotchas
- - Example of the completed implementation
-3. Include any context that was discovered during task execution but wasn't previously documented
-
-Example task entry:
-
-```markdown
-## Add New Model Support
-
-**Last performed:** [date]
-**Files to modify:**
-
-- `/providers/gemini.md` - Add model to documentation
-- `/src/providers/gemini-config.ts` - Add model configuration
-- `/src/constants/models.ts` - Add to model list
-- `/tests/providers/gemini.test.ts` - Add test cases
-
-**Steps:**
-
-1. Add model configuration with proper token limits
-2. Update documentation with model capabilities
-3. Add to constants file for UI display
-4. Write tests for new model configuration
-
-**Important notes:**
-
-- Check Google's documentation for exact token limits
-- Ensure backward compatibility with existing configurations
-- Test with actual API calls before committing
-```
-
-### Regular Task Execution
-
-In the beginning of EVERY task I MUST read ALL memory bank files - this is not optional.
-
-The memory bank files are located in `.kilocode/rules/memory-bank` folder. If the folder doesn't exist or is empty, I will warn user about potential issues with the memory bank. I will include `[Memory Bank: Active]` at the beginning of my response if I successfully read the memory bank files, or `[Memory Bank: Missing]` if the folder doesn't exist or is empty. If memory bank is missing, I will warn the user about potential issues and suggest initialization. I should briefly summarize my understanding of the project to confirm alignment with the user's expectations, like:
-
-"[Memory Bank: Active] I understand we're building a React inventory system with barcode scanning. Currently implementing the scanner component that needs to work with the backend API."
-
-When starting a task that matches a documented task in `tasks.md`, I should mention this and follow the documented workflow to ensure no steps are missed.
-
-If the task was repetitive and might be needed again, I should suggest: "Would you like me to add this task to the memory bank for future reference?"
-
-In the end of the task, when it seems to be completed, I will update `context.md` accordingly. If the change seems significant, I will suggest to the user: "Would you like me to update memory bank to reflect these changes?" I will not suggest updates for minor changes.
-
-## Context Window Management
-
-When the context window fills up during an extended session:
-
-1. I should suggest updating the memory bank to preserve the current state
-2. Recommend starting a fresh conversation/task
-3. In the new conversation, I will automatically load the memory bank files to maintain continuity
-
-## Technical Implementation
-
-Memory Bank is built on Kilo Code's Custom Rules feature, with files stored as standard markdown documents that both the user and I can access.
-
-## Important Notes
-
-REMEMBER: After every memory reset, I begin completely fresh. The Memory Bank is my only link to previous work. It must be maintained with precision and clarity, as my effectiveness depends entirely on its accuracy.
-
-If I detect inconsistencies between memory bank files, I should prioritize brief.md and note any discrepancies to the user.
-
-IMPORTANT: I MUST read ALL memory bank files at the start of EVERY task - this is not optional. The memory bank files are located in `.kilocode/rules/memory-bank` folder.
+# Memory Bank
+
+I am an expert software engineer with a unique characteristic: my memory resets completely between sessions. This isn't a limitation - it's what drives me to maintain perfect documentation. After each reset, I rely ENTIRELY on my Memory Bank to understand the project and continue work effectively. I MUST read ALL memory bank files at the start of EVERY task - this is not optional. The memory bank files are located in `.kilocode/rules/memory-bank` folder.
+
+When I start a task, I will include `[Memory Bank: Active]` at the beginning of my response if I successfully read the memory bank files, or `[Memory Bank: Missing]` if the folder doesn't exist or is empty. If memory bank is missing, I will warn the user about potential issues and suggest initialization.
+
+## Memory Bank Structure
+
+The Memory Bank consists of core files and optional context files, all in Markdown format.
+
+### Core Files (Required)
+
+1. `brief.md`
+ This file is created and maintained manually by the developer. Don't edit this file directly but suggest to user to update it if it can be improved.
+ - Foundation document that shapes all other files
+ - Created at project start if it doesn't exist
+ - Defines core requirements and goals
+ - Source of truth for project scope
+
+2. `product.md`
+ - Why this project exists
+ - Problems it solves
+ - How it should work
+ - User experience goals
+
+3. `context.md`
+ This file should be short and factual, not creative or speculative.
+ - Current work focus
+ - Recent changes
+ - Next steps
+
+4. `architecture.md`
+ - System architecture
+ - Source Code paths
+ - Key technical decisions
+ - Design patterns in use
+ - Component relationships
+ - Critical implementation paths
+
+5. `tech.md`
+ - Technologies used
+ - Development setup
+ - Technical constraints
+ - Dependencies
+ - Tool usage patterns
+
+### Additional Files
+
+Create additional files/folders within memory-bank/ when they help organize:
+
+- `tasks.md` - Documentation of repetitive tasks and their workflows
+- Complex feature documentation
+- Integration specifications
+- API documentation
+- Testing strategies
+- Deployment procedures
+
+## Core workflows
+
+### Memory Bank Initialization
+
+The initialization step is CRITICALLY IMPORTANT and must be done with extreme thoroughness as it defines all future effectiveness of the Memory Bank. This is the foundation upon which all future interactions will be built.
+
+When user requests initialization of the memory bank (command `initialize memory bank`), I'll perform an exhaustive analysis of the project, including:
+
+- All source code files and their relationships
+- Configuration files and build system setup
+- Project structure and organization patterns
+- Documentation and comments
+- Dependencies and external integrations
+- Testing frameworks and patterns
+
+I must be extremely thorough during initialization, spending extra time and effort to build a comprehensive understanding of the project. A high-quality initialization will dramatically improve all future interactions, while a rushed or incomplete initialization will permanently limit my effectiveness.
+
+After initialization, I will ask the user to read through the memory bank files and verify product description, used technologies and other information. I should provide a summary of what I've understood about the project to help the user verify the accuracy of the memory bank files. I should encourage the user to correct any misunderstandings or add missing information, as this will significantly improve future interactions.
+
+### Memory Bank Update
+
+Memory Bank updates occur when:
+
+1. Discovering new project patterns
+2. After implementing significant changes
+3. When user explicitly requests with the phrase **update memory bank** (MUST review ALL files)
+4. When context needs clarification
+
+If I notice significant changes that should be preserved but the user hasn't explicitly requested an update, I should suggest: "Would you like me to update the memory bank to reflect these changes?"
+
+To execute Memory Bank update, I will:
+
+1. Review ALL project files
+2. Document current state
+3. Document Insights & Patterns
+4. If requested with additional context (e.g., "update memory bank using information from @/Makefile"), focus special attention on that source
+
+Note: When triggered by **update memory bank**, I MUST review every memory bank file, even if some don't require updates. Focus particularly on context.md as it tracks current state.
+
+### Add Task
+
+When user completes a repetitive task (like adding support for a new model version) and wants to document it for future reference, they can request: **add task** or **store this as a task**.
+
+This workflow is designed for repetitive tasks that follow similar patterns and require editing the same files. Examples include:
+
+- Adding support for new AI model versions
+- Implementing new API endpoints following established patterns
+- Adding new features that follow existing architecture
+
+Tasks are stored in the file `tasks.md` in the memory bank folder. The file is optional and can be empty. The file can store many tasks.
+
+To execute Add Task workflow:
+
+1. Create or update `tasks.md` in the memory bank folder
+2. Document the task with:
+ - Task name and description
+ - Files that need to be modified
+ - Step-by-step workflow followed
+ - Important considerations or gotchas
+ - Example of the completed implementation
+3. Include any context that was discovered during task execution but wasn't previously documented
+
+Example task entry:
+
+```markdown
+## Add New Model Support
+
+**Last performed:** [date]
+**Files to modify:**
+
+- `/providers/gemini.md` - Add model to documentation
+- `/src/providers/gemini-config.ts` - Add model configuration
+- `/src/constants/models.ts` - Add to model list
+- `/tests/providers/gemini.test.ts` - Add test cases
+
+**Steps:**
+
+1. Add model configuration with proper token limits
+2. Update documentation with model capabilities
+3. Add to constants file for UI display
+4. Write tests for new model configuration
+
+**Important notes:**
+
+- Check Google's documentation for exact token limits
+- Ensure backward compatibility with existing configurations
+- Test with actual API calls before committing
+```
+
+### Regular Task Execution
+
+In the beginning of EVERY task I MUST read ALL memory bank files - this is not optional.
+
+The memory bank files are located in `.kilocode/rules/memory-bank` folder. If the folder doesn't exist or is empty, I will warn user about potential issues with the memory bank. I will include `[Memory Bank: Active]` at the beginning of my response if I successfully read the memory bank files, or `[Memory Bank: Missing]` if the folder doesn't exist or is empty. If memory bank is missing, I will warn the user about potential issues and suggest initialization. I should briefly summarize my understanding of the project to confirm alignment with the user's expectations, like:
+
+"[Memory Bank: Active] I understand we're building a React inventory system with barcode scanning. Currently implementing the scanner component that needs to work with the backend API."
+
+When starting a task that matches a documented task in `tasks.md`, I should mention this and follow the documented workflow to ensure no steps are missed.
+
+If the task was repetitive and might be needed again, I should suggest: "Would you like me to add this task to the memory bank for future reference?"
+
+In the end of the task, when it seems to be completed, I will update `context.md` accordingly. If the change seems significant, I will suggest to the user: "Would you like me to update memory bank to reflect these changes?" I will not suggest updates for minor changes.
+
+## Context Window Management
+
+When the context window fills up during an extended session:
+
+1. I should suggest updating the memory bank to preserve the current state
+2. Recommend starting a fresh conversation/task
+3. In the new conversation, I will automatically load the memory bank files to maintain continuity
+
+## Technical Implementation
+
+Memory Bank is built on Kilo Code's Custom Rules feature, with files stored as standard markdown documents that both the user and I can access.
+
+## Important Notes
+
+REMEMBER: After every memory reset, I begin completely fresh. The Memory Bank is my only link to previous work. It must be maintained with precision and clarity, as my effectiveness depends entirely on its accuracy.
+
+If I detect inconsistencies between memory bank files, I should prioritize brief.md and note any discrepancies to the user.
+
+IMPORTANT: I MUST read ALL memory bank files at the start of EVERY task - this is not optional. The memory bank files are located in `.kilocode/rules/memory-bank` folder.
diff --git a/.kilocode/rules/memory-bank/architecture.md b/.kilocode/rules/memory-bank/architecture.md
index 6c035c0..8730e62 100644
--- a/.kilocode/rules/memory-bank/architecture.md
+++ b/.kilocode/rules/memory-bank/architecture.md
@@ -1,213 +1,213 @@
-# Architecture Overview - Star Kitten
-
-## System Architecture
-
-Star Kitten follows a modular monorepo architecture with four main packages and two applications:
-
-```mermaid
-graph TB
- subgraph "Applications"
- EB[eve-bot
Discord Bot]
- EW[eve-web
Brisa Web App]
- end
-
- subgraph "Core Packages"
- D[@star-kitten/discord
Discord Framework]
- E[@star-kitten/eve
EVE Online Integration]
- U[@star-kitten/util
Shared Utilities]
- end
-
- subgraph "External Services"
- DS[Discord API]
- ESI[EVE ESI API]
- JA[Janice API]
- ET[EveTycoon API]
- end
-
- subgraph "Data Layer"
- DB[(SQLite Database)]
- RD[(Reference Data
JSON Files)]
- end
-
- EB --> D
- EB --> E
- EW --> E
- EW --> U
- D --> DS
- E --> ESI
- E --> JA
- E --> ET
- E --> DB
- E --> RD
- U --> DB
-```
-
-## Source Code Paths
-
-### Core Packages
-
-#### [@star-kitten/discord](packages/discord/)
-
-- **Entry Point**: [`packages/discord/src/index.ts`](packages/discord/src/index.ts)
-- **Command System**: [`packages/discord/src/commands/`](packages/discord/src/commands/)
- - [`import-commands.ts`](packages/discord/src/commands/import-commands.ts) - Auto-discovery of command files
- - [`handle-commands.ts`](packages/discord/src/commands/handle-commands.ts) - Command execution handler
-- **Localization**: [`packages/discord/src/locales.ts`](packages/discord/src/locales.ts)
-
-#### [@star-kitten/eve](packages/eve/)
-
-- **Entry Point**: [`packages/eve/src/index.ts`](packages/eve/src/index.ts)
-- **Database Layer**: [`packages/eve/src/db/`](packages/eve/src/db/)
- - [`schema.ts`](packages/eve/src/db/schema.ts) - Drizzle ORM schema definitions
- - [`index.ts`](packages/eve/src/db/index.ts) - Database connection and exports
- - [`models/`](packages/eve/src/db/models/) - Character and user model helpers
-- **ESI Integration**: [`packages/eve/src/esi/`](packages/eve/src/esi/)
- - [`auth.ts`](packages/eve/src/esi/auth.ts) - EVE SSO authentication flow
- - [`scopes.ts`](packages/eve/src/esi/scopes.ts) - ESI scope definitions and token validation
- - [`character.ts`](packages/eve/src/esi/character.ts) - Character API endpoints
- - [`fetch.ts`](packages/eve/src/esi/fetch.ts) - ESI API client wrapper
-- **Data Models**: [`packages/eve/src/models/`](packages/eve/src/models/)
- - [`type.ts`](packages/eve/src/models/type.ts) - EVE item type definitions and utilities
- - [`skill.ts`](packages/eve/src/models/skill.ts) - Skill-related models
-- **Third-party APIs**: [`packages/eve/src/third-party/`](packages/eve/src/third-party/)
- - [`janice.ts`](packages/eve/src/third-party/janice.ts) - Market appraisal integration
- - [`evetycoon.ts`](packages/eve/src/third-party/evetycoon.ts) - Market data integration
-- **Utilities**: [`packages/eve/src/utils/`](packages/eve/src/utils/)
- - [`markdown.ts`](packages/eve/src/utils/markdown.ts) - EVE markup to Discord formatting
-
-#### [@star-kitten/util](packages/util/)
-
-- **Entry Point**: [`packages/util/src/`](packages/util/src/) (no index.ts, exports individual modules)
-- **Core Utilities**:
- - [`text.ts`](packages/util/src/text.ts) - Text processing and formatting
- - [`jsonQuery.ts`](packages/util/src/jsonQuery.ts) - Streaming JSON querying for large files
- - [`time.ts`](packages/util/src/time.ts) - Time utilities
- - [`logger.ts`](packages/util/src/logger.ts) - Logging utilities
-- **Scheduler System**: [`packages/util/src/scheduler/`](packages/util/src/scheduler/)
- - [`scheduler.service.ts`](packages/util/src/scheduler/scheduler.service.ts) - Job scheduling service
- - [`queue.ts`](packages/util/src/scheduler/queue.ts) - Job queue implementation
- - [`workers/`](packages/util/src/scheduler/workers/) - Background worker implementations
-
-### Applications
-
-#### [eve-bot](packages/eve-bot/)
-
-- **Entry Point**: [`packages/eve-bot/src/main.ts`](packages/eve-bot/src/main.ts)
-- **Commands**: [`packages/eve-bot/src/commands/`](packages/eve-bot/src/commands/)
- - [`appraise.command.ts`](packages/eve-bot/src/commands/appraise.command.ts) - Market appraisal command
-- **Types**: [`packages/eve-bot/src/types/global.d.ts`](packages/eve-bot/src/types/global.d.ts)
-
-#### [eve-web](packages/eve-web/)
-
-- **Entry Point**: [`packages/eve-web/src/pages/index.tsx`](packages/eve-web/src/pages/index.tsx)
-- **Middleware**: [`packages/eve-web/src/middleware.ts`](packages/eve-web/src/middleware.ts) - EVE SSO integration
-- **Components**: [`packages/eve-web/src/components/stats/`](packages/eve-web/src/components/stats/)
- - [`skill-queue.tsx`](packages/eve-web/src/components/stats/skill-queue.tsx) - Real-time skill training display
- - [`wallet.tsx`](packages/eve-web/src/components/stats/wallet.tsx) - Wallet balance and changes
-- **API Routes**: [`packages/eve-web/src/api/auth/`](packages/eve-web/src/api/auth/) - Authentication endpoints
-- **Utilities**: [`packages/eve-web/src/utils/cookies.ts`](packages/eve-web/src/utils/cookies.ts)
-
-## Key Technical Decisions
-
-### Command System Architecture
-
-- **Auto-discovery**: Commands are automatically discovered using glob patterns (`**/*.command.{js,ts}`)
-- **Convention-based**: Each command exports a default Discord command definition
-- **Event-driven**: Commands handle their own interaction events using global event listeners
-- **Localized**: Full internationalization support with description translations
-
-### Database Architecture
-
-- **ORM**: Drizzle ORM with SQLite for local data storage
-- **Schema**: [`packages/eve/src/db/schema.ts`](packages/eve/src/db/schema.ts) defines all tables
-- **Models**: Active Record pattern with helper classes for complex operations
-- **Migrations**: Drizzle Kit handles schema migrations
-
-### EVE Online Integration
-
-- **OAuth Flow**: Complete EVE SSO implementation with token management
-- **Scope Management**: Comprehensive ESI scope definitions and validation
-- **Token Refresh**: Automatic token refresh with scope preservation
-- **Data Caching**: Smart caching of EVE reference data and API responses
-
-### Web Interface Architecture
-
-- **Framework**: Brisa for server-side rendering with progressive enhancement
-- **Authentication**: EVE SSO integrated at middleware level
-- **Components**: Server-side components with suspense for async data loading
-- **Styling**: Tailwind CSS with DaisyUI components
-
-## Design Patterns
-
-### Package Exports
-
-Each package uses structured exports for different concerns:
-
-```typescript
-// @star-kitten/eve exports
-export * from "./esi"; // ESI API integration
-export * as CharacterAPI from "./esi/character";
-export * as models from "./models"; // Data models
-export * as db from "./db"; // Database access
-export * from "./third-party"; // External APIs
-```
-
-### Error Handling
-
-- **API Errors**: Consistent error wrapping for external API calls
-- **Token Validation**: Graceful handling of expired/invalid tokens
-- **Database Errors**: Transaction rollback and error logging
-
-### Data Processing
-
-- **Streaming**: Large JSON files processed via streaming for memory efficiency
-- **Caching**: Multi-level caching (in-memory, database, file system)
-- **Type Safety**: Full TypeScript coverage with strict type checking
-
-## Component Relationships
-
-### Discord Bot Flow
-
-1. [`main.ts`](packages/eve-bot/src/main.ts) initializes Dysnomia client
-2. [`importCommands()`](packages/discord/src/commands/import-commands.ts) discovers command files
-3. Commands register interaction handlers on global client
-4. User interactions trigger command-specific handlers
-
-### Web Authentication Flow
-
-1. [`middleware.ts`](packages/eve-web/src/middleware.ts) intercepts requests
-2. EVE SSO redirect initiated for unauthenticated users
-3. OAuth callback validates tokens and creates/updates user records
-4. Character data synchronized from ESI API
-5. Dashboard components display real-time character statistics
-
-### Data Synchronization
-
-1. Reference data downloaded from external sources
-2. JSON files processed using streaming query utilities
-3. Character data fetched from ESI API
-4. Local database updated with character and user information
-5. Web components display cached data with real-time updates
-
-## Critical Implementation Paths
-
-### Adding New Commands
-
-1. Create `*.command.ts` file in [`packages/eve-bot/src/commands/`](packages/eve-bot/src/commands/)
-2. Export Discord command definition as default
-3. Add interaction handlers to global client event listeners
-4. Commands automatically discovered and registered
-
-### EVE API Integration
-
-1. Define required scopes in [`scopes.ts`](packages/eve/src/esi/scopes.ts)
-2. Implement API client in appropriate ESI module
-3. Add character model methods for data access
-4. Create web components for data display
-
-### Database Schema Changes
-
-1. Update [`schema.ts`](packages/eve/src/db/schema.ts) with new tables/columns
-2. Generate migration using Drizzle Kit
-3. Update model classes with new methods
-4. Add database exports to [`db/index.ts`](packages/eve/src/db/index.ts)
+# Architecture Overview - Star Kitten
+
+## System Architecture
+
+Star Kitten follows a modular monorepo architecture with four main packages and two applications:
+
+```mermaid
+graph TB
+ subgraph "Applications"
+ EB[eve-bot
Discord Bot]
+ EW[eve-web
Brisa Web App]
+ end
+
+ subgraph "Core Packages"
+ D[@star-kitten/discord
Discord Framework]
+ E[@star-kitten/eve
EVE Online Integration]
+ U[@star-kitten/util
Shared Utilities]
+ end
+
+ subgraph "External Services"
+ DS[Discord API]
+ ESI[EVE ESI API]
+ JA[Janice API]
+ ET[EveTycoon API]
+ end
+
+ subgraph "Data Layer"
+ DB[(SQLite Database)]
+ RD[(Reference Data
JSON Files)]
+ end
+
+ EB --> D
+ EB --> E
+ EW --> E
+ EW --> U
+ D --> DS
+ E --> ESI
+ E --> JA
+ E --> ET
+ E --> DB
+ E --> RD
+ U --> DB
+```
+
+## Source Code Paths
+
+### Core Packages
+
+#### [@star-kitten/discord](packages/discord/)
+
+- **Entry Point**: [`packages/discord/src/index.ts`](packages/discord/src/index.ts)
+- **Command System**: [`packages/discord/src/commands/`](packages/discord/src/commands/)
+ - [`import-commands.ts`](packages/discord/src/commands/import-commands.ts) - Auto-discovery of command files
+ - [`handle-commands.ts`](packages/discord/src/commands/handle-commands.ts) - Command execution handler
+- **Localization**: [`packages/discord/src/locales.ts`](packages/discord/src/locales.ts)
+
+#### [@star-kitten/eve](packages/eve/)
+
+- **Entry Point**: [`packages/eve/src/index.ts`](packages/eve/src/index.ts)
+- **Database Layer**: [`packages/eve/src/db/`](packages/eve/src/db/)
+ - [`schema.ts`](packages/eve/src/db/schema.ts) - Drizzle ORM schema definitions
+ - [`index.ts`](packages/eve/src/db/index.ts) - Database connection and exports
+ - [`models/`](packages/eve/src/db/models/) - Character and user model helpers
+- **ESI Integration**: [`packages/eve/src/esi/`](packages/eve/src/esi/)
+ - [`auth.ts`](packages/eve/src/esi/auth.ts) - EVE SSO authentication flow
+ - [`scopes.ts`](packages/eve/src/esi/scopes.ts) - ESI scope definitions and token validation
+ - [`character.ts`](packages/eve/src/esi/character.ts) - Character API endpoints
+ - [`fetch.ts`](packages/eve/src/esi/fetch.ts) - ESI API client wrapper
+- **Data Models**: [`packages/eve/src/models/`](packages/eve/src/models/)
+ - [`type.ts`](packages/eve/src/models/type.ts) - EVE item type definitions and utilities
+ - [`skill.ts`](packages/eve/src/models/skill.ts) - Skill-related models
+- **Third-party APIs**: [`packages/eve/src/third-party/`](packages/eve/src/third-party/)
+ - [`janice.ts`](packages/eve/src/third-party/janice.ts) - Market appraisal integration
+ - [`evetycoon.ts`](packages/eve/src/third-party/evetycoon.ts) - Market data integration
+- **Utilities**: [`packages/eve/src/utils/`](packages/eve/src/utils/)
+ - [`markdown.ts`](packages/eve/src/utils/markdown.ts) - EVE markup to Discord formatting
+
+#### [@star-kitten/util](packages/util/)
+
+- **Entry Point**: [`packages/util/src/`](packages/util/src/) (no index.ts, exports individual modules)
+- **Core Utilities**:
+ - [`text.ts`](packages/util/src/text.ts) - Text processing and formatting
+ - [`jsonQuery.ts`](packages/util/src/jsonQuery.ts) - Streaming JSON querying for large files
+ - [`time.ts`](packages/util/src/time.ts) - Time utilities
+ - [`logger.ts`](packages/util/src/logger.ts) - Logging utilities
+- **Scheduler System**: [`packages/util/src/scheduler/`](packages/util/src/scheduler/)
+ - [`scheduler.service.ts`](packages/util/src/scheduler/scheduler.service.ts) - Job scheduling service
+ - [`queue.ts`](packages/util/src/scheduler/queue.ts) - Job queue implementation
+ - [`workers/`](packages/util/src/scheduler/workers/) - Background worker implementations
+
+### Applications
+
+#### [eve-bot](packages/eve-bot/)
+
+- **Entry Point**: [`packages/eve-bot/src/main.ts`](packages/eve-bot/src/main.ts)
+- **Commands**: [`packages/eve-bot/src/commands/`](packages/eve-bot/src/commands/)
+ - [`appraise.command.ts`](packages/eve-bot/src/commands/appraise.command.ts) - Market appraisal command
+- **Types**: [`packages/eve-bot/src/types/global.d.ts`](packages/eve-bot/src/types/global.d.ts)
+
+#### [eve-web](packages/eve-web/)
+
+- **Entry Point**: [`packages/eve-web/src/pages/index.tsx`](packages/eve-web/src/pages/index.tsx)
+- **Middleware**: [`packages/eve-web/src/middleware.ts`](packages/eve-web/src/middleware.ts) - EVE SSO integration
+- **Components**: [`packages/eve-web/src/components/stats/`](packages/eve-web/src/components/stats/)
+ - [`skill-queue.tsx`](packages/eve-web/src/components/stats/skill-queue.tsx) - Real-time skill training display
+ - [`wallet.tsx`](packages/eve-web/src/components/stats/wallet.tsx) - Wallet balance and changes
+- **API Routes**: [`packages/eve-web/src/api/auth/`](packages/eve-web/src/api/auth/) - Authentication endpoints
+- **Utilities**: [`packages/eve-web/src/utils/cookies.ts`](packages/eve-web/src/utils/cookies.ts)
+
+## Key Technical Decisions
+
+### Command System Architecture
+
+- **Auto-discovery**: Commands are automatically discovered using glob patterns (`**/*.command.{js,ts}`)
+- **Convention-based**: Each command exports a default Discord command definition
+- **Event-driven**: Commands handle their own interaction events using global event listeners
+- **Localized**: Full internationalization support with description translations
+
+### Database Architecture
+
+- **ORM**: Drizzle ORM with SQLite for local data storage
+- **Schema**: [`packages/eve/src/db/schema.ts`](packages/eve/src/db/schema.ts) defines all tables
+- **Models**: Active Record pattern with helper classes for complex operations
+- **Migrations**: Drizzle Kit handles schema migrations
+
+### EVE Online Integration
+
+- **OAuth Flow**: Complete EVE SSO implementation with token management
+- **Scope Management**: Comprehensive ESI scope definitions and validation
+- **Token Refresh**: Automatic token refresh with scope preservation
+- **Data Caching**: Smart caching of EVE reference data and API responses
+
+### Web Interface Architecture
+
+- **Framework**: Brisa for server-side rendering with progressive enhancement
+- **Authentication**: EVE SSO integrated at middleware level
+- **Components**: Server-side components with suspense for async data loading
+- **Styling**: Tailwind CSS with DaisyUI components
+
+## Design Patterns
+
+### Package Exports
+
+Each package uses structured exports for different concerns:
+
+```typescript
+// @star-kitten/eve exports
+export * from "./esi"; // ESI API integration
+export * as CharacterAPI from "./esi/character";
+export * as models from "./models"; // Data models
+export * as db from "./db"; // Database access
+export * from "./third-party"; // External APIs
+```
+
+### Error Handling
+
+- **API Errors**: Consistent error wrapping for external API calls
+- **Token Validation**: Graceful handling of expired/invalid tokens
+- **Database Errors**: Transaction rollback and error logging
+
+### Data Processing
+
+- **Streaming**: Large JSON files processed via streaming for memory efficiency
+- **Caching**: Multi-level caching (in-memory, database, file system)
+- **Type Safety**: Full TypeScript coverage with strict type checking
+
+## Component Relationships
+
+### Discord Bot Flow
+
+1. [`main.ts`](packages/eve-bot/src/main.ts) initializes Dysnomia client
+2. [`importCommands()`](packages/discord/src/commands/import-commands.ts) discovers command files
+3. Commands register interaction handlers on global client
+4. User interactions trigger command-specific handlers
+
+### Web Authentication Flow
+
+1. [`middleware.ts`](packages/eve-web/src/middleware.ts) intercepts requests
+2. EVE SSO redirect initiated for unauthenticated users
+3. OAuth callback validates tokens and creates/updates user records
+4. Character data synchronized from ESI API
+5. Dashboard components display real-time character statistics
+
+### Data Synchronization
+
+1. Reference data downloaded from external sources
+2. JSON files processed using streaming query utilities
+3. Character data fetched from ESI API
+4. Local database updated with character and user information
+5. Web components display cached data with real-time updates
+
+## Critical Implementation Paths
+
+### Adding New Commands
+
+1. Create `*.command.ts` file in [`packages/eve-bot/src/commands/`](packages/eve-bot/src/commands/)
+2. Export Discord command definition as default
+3. Add interaction handlers to global client event listeners
+4. Commands automatically discovered and registered
+
+### EVE API Integration
+
+1. Define required scopes in [`scopes.ts`](packages/eve/src/esi/scopes.ts)
+2. Implement API client in appropriate ESI module
+3. Add character model methods for data access
+4. Create web components for data display
+
+### Database Schema Changes
+
+1. Update [`schema.ts`](packages/eve/src/db/schema.ts) with new tables/columns
+2. Generate migration using Drizzle Kit
+3. Update model classes with new methods
+4. Add database exports to [`db/index.ts`](packages/eve/src/db/index.ts)
diff --git a/.kilocode/rules/memory-bank/brief.md b/.kilocode/rules/memory-bank/brief.md
index 2751207..16331a7 100644
--- a/.kilocode/rules/memory-bank/brief.md
+++ b/.kilocode/rules/memory-bank/brief.md
@@ -1,7 +1,7 @@
-This project, Star Kitten, is a personal project of mine which will be a set of packges for building discord bots and websites focused on the games I play. I am starting with an eve online bot and webpage and will be building a star citizen discord bot later.
-
-This project used bun, Dysnomia js, and currently Brisa, but I plan to change that to an Elysia server with Ripple SPA.
-
-I use TypeScript and focus on re-usable functional components as much as I can.
-
-I would like to do my best to maintain at least 80% coverage with all major functionality tested using bun:test.
+This project, Star Kitten, is a personal project of mine which will be a set of packges for building discord bots and websites focused on the games I play. I am starting with an eve online bot and webpage and will be building a star citizen discord bot later.
+
+This project used bun, Dysnomia js, and currently Brisa, but I plan to change that to an Elysia server with Ripple SPA.
+
+I use TypeScript and focus on re-usable functional components as much as I can.
+
+I would like to do my best to maintain at least 80% coverage with all major functionality tested using bun:test.
diff --git a/.kilocode/rules/memory-bank/context.md b/.kilocode/rules/memory-bank/context.md
index f9abd5d..21af969 100644
--- a/.kilocode/rules/memory-bank/context.md
+++ b/.kilocode/rules/memory-bank/context.md
@@ -1,167 +1,167 @@
-# Project Context - Star Kitten
-
-## Current Development State
-
-### Project Maturity
-
-- **Phase**: Active Development
-- **Version**: 0.0.0 (pre-release)
-- **Status**: Core framework established, basic functionality implemented
-- **Last Major Update**: Memory bank initialization (January 2025)
-
-### Current Work Focus
-
-- **Primary**: EVE Online Discord bot and web interface development
-- **Secondary**: Framework stabilization and documentation
-- **Future**: Star Citizen integration planning
-
-### Recent Changes
-
-- Memory bank system initialized with comprehensive documentation
-- Core architecture established across four packages
-- Basic EVE Online integration functional
-- Discord command system with auto-discovery implemented
-- Web interface with EVE SSO authentication working
-
-## Active Features
-
-### Discord Bot (`eve-bot`)
-
-- **Status**: Basic functionality working
-- **Commands**:
- - Market appraisal command (partial implementation)
-- **Authentication**: Global client setup with Dysnomia
-- **Deployment**: Environment-based configuration ready
-
-### Web Interface (`eve-web`)
-
-- **Status**: Basic dashboard working
-- **Authentication**: EVE SSO OAuth flow implemented
-- **Components**:
- - Skill queue display with progress tracking
- - Wallet balance with daily change calculation
-- **Framework**: Brisa SSR with Tailwind CSS + DaisyUI
-
-### Core Packages
-
-- **@star-kitten/discord**: Command auto-discovery and handling
-- **@star-kitten/eve**: ESI API integration, database models, third-party APIs
-- **@star-kitten/util**: Streaming JSON queries, text processing, job scheduling
-
-## Technical Debt & Known Issues
-
-### Architecture Decisions Pending
-
-- **Web Framework Migration**: Planned switch from Brisa to Elysia + Ripple SPA
-- **Package Versioning**: All packages at 0.0.0, versioning strategy needed
-- **Testing Coverage**: Current coverage unknown, target is 80%
-
-### Implementation Gaps
-
-- **Command System**: [`handle-commands.ts`](packages/discord/src/commands/handle-commands.ts) references global commands object not used in current pattern
-- **Appraisal Command**: Modal submission handling incomplete
-- **Mining Fleet Module**: Database schema exists but no implementation
-- **API Error Handling**: Needs standardization across packages
-
-### Database Schema
-
-- **Current Tables**: users, characters, resumeCommands, miningFleets, miningFleetParticipants
-- **Migration Status**: Drizzle Kit configured but migration history unclear
-- **Data Location**: SQLite database at configurable path
-
-## Development Environment
-
-### Setup Requirements
-
-- **Runtime**: Bun (JavaScript runtime and package manager)
-- **Language**: TypeScript with strict type checking
-- **Database**: SQLite with Drizzle ORM
-- **Development**: VS Code with format-on-save configuration
-
-### Build System
-
-- **Package Manager**: Bun workspaces
-- **Build Tool**: tsdown for TypeScript compilation
-- **Scripts**: Unified commands across packages (build, dev, test)
-
-### External Dependencies
-
-- **EVE Online**: ESI API access requires client credentials
-- **Janice API**: Market appraisal service requires API key
-- **Discord**: Bot token required for Discord API access
-
-## Next Steps Priority
-
-### Immediate (Current Sprint)
-
-1. Complete appraisal command implementation
-2. Add comprehensive error handling to ESI integration
-3. Implement basic test coverage for core functionality
-4. Document API authentication setup process
-
-### Short Term (Next Month)
-
-1. Implement mining fleet management functionality
-2. Add more Discord commands (character lookup, skill planning)
-3. Expand web interface with more character statistics
-4. Establish proper versioning and release process
-
-### Medium Term (Next Quarter)
-
-1. Migrate web framework to Elysia + Ripple SPA
-2. Add support for corporation and alliance management
-3. Implement data synchronization and caching strategies
-4. Create documentation for third-party developers
-
-### Long Term (Next Year)
-
-1. Star Citizen integration architecture
-2. Multi-game framework abstraction
-3. Plugin system for community extensions
-4. Performance optimization and scaling
-
-## Key Stakeholders
-
-### Internal Development
-
-- **Primary Developer**: j-b-3 (project owner and main developer)
-- **Target Users**: EVE Online corporations and alliances
-- **Future Contributors**: Open source community (planned)
-
-### External Dependencies
-
-- **CCP Games**: EVE Online ESI API provider
-- **Discord**: Platform and API provider
-- **Community**: EVE Online player community feedback
-
-## Risk Assessment
-
-### Technical Risks
-
-- **Framework Migration**: Brisa to Elysia migration complexity
-- **API Rate Limits**: EVE ESI and third-party API limitations
-- **Database Performance**: SQLite scalability for large datasets
-- **Token Management**: OAuth token refresh reliability
-
-### Project Risks
-
-- **Single Developer**: No backup maintainer currently
-- **Community Adoption**: Uncertain uptake by EVE Online communities
-- **Game API Changes**: Dependency on external game APIs
-- **Competition**: Existing EVE Online bot solutions
-
-## Success Metrics
-
-### Current Measurements
-
-- **Code Quality**: Type safety across all packages
-- **Architecture**: Modular design with clear separation
-- **Documentation**: Comprehensive memory bank established
-- **Functionality**: Basic bot and web interface working
-
-### Target Metrics
-
-- **Test Coverage**: 80% across major functionality
-- **Performance**: <2 second Discord command response times
-- **Reliability**: 99%+ uptime for deployed services
-- **Adoption**: Usage by multiple EVE Online communities
+# Project Context - Star Kitten
+
+## Current Development State
+
+### Project Maturity
+
+- **Phase**: Active Development
+- **Version**: 0.0.0 (pre-release)
+- **Status**: Core framework established, basic functionality implemented
+- **Last Major Update**: Memory bank initialization (January 2025)
+
+### Current Work Focus
+
+- **Primary**: EVE Online Discord bot and web interface development
+- **Secondary**: Framework stabilization and documentation
+- **Future**: Star Citizen integration planning
+
+### Recent Changes
+
+- Memory bank system initialized with comprehensive documentation
+- Core architecture established across four packages
+- Basic EVE Online integration functional
+- Discord command system with auto-discovery implemented
+- Web interface with EVE SSO authentication working
+
+## Active Features
+
+### Discord Bot (`eve-bot`)
+
+- **Status**: Basic functionality working
+- **Commands**:
+ - Market appraisal command (partial implementation)
+- **Authentication**: Global client setup with Dysnomia
+- **Deployment**: Environment-based configuration ready
+
+### Web Interface (`eve-web`)
+
+- **Status**: Basic dashboard working
+- **Authentication**: EVE SSO OAuth flow implemented
+- **Components**:
+ - Skill queue display with progress tracking
+ - Wallet balance with daily change calculation
+- **Framework**: Brisa SSR with Tailwind CSS + DaisyUI
+
+### Core Packages
+
+- **@star-kitten/discord**: Command auto-discovery and handling
+- **@star-kitten/eve**: ESI API integration, database models, third-party APIs
+- **@star-kitten/util**: Streaming JSON queries, text processing, job scheduling
+
+## Technical Debt & Known Issues
+
+### Architecture Decisions Pending
+
+- **Web Framework Migration**: Planned switch from Brisa to Elysia + Ripple SPA
+- **Package Versioning**: All packages at 0.0.0, versioning strategy needed
+- **Testing Coverage**: Current coverage unknown, target is 80%
+
+### Implementation Gaps
+
+- **Command System**: [`handle-commands.ts`](packages/discord/src/commands/handle-commands.ts) references global commands object not used in current pattern
+- **Appraisal Command**: Modal submission handling incomplete
+- **Mining Fleet Module**: Database schema exists but no implementation
+- **API Error Handling**: Needs standardization across packages
+
+### Database Schema
+
+- **Current Tables**: users, characters, resumeCommands, miningFleets, miningFleetParticipants
+- **Migration Status**: Drizzle Kit configured but migration history unclear
+- **Data Location**: SQLite database at configurable path
+
+## Development Environment
+
+### Setup Requirements
+
+- **Runtime**: Bun (JavaScript runtime and package manager)
+- **Language**: TypeScript with strict type checking
+- **Database**: SQLite with Drizzle ORM
+- **Development**: VS Code with format-on-save configuration
+
+### Build System
+
+- **Package Manager**: Bun workspaces
+- **Build Tool**: tsdown for TypeScript compilation
+- **Scripts**: Unified commands across packages (build, dev, test)
+
+### External Dependencies
+
+- **EVE Online**: ESI API access requires client credentials
+- **Janice API**: Market appraisal service requires API key
+- **Discord**: Bot token required for Discord API access
+
+## Next Steps Priority
+
+### Immediate (Current Sprint)
+
+1. Complete appraisal command implementation
+2. Add comprehensive error handling to ESI integration
+3. Implement basic test coverage for core functionality
+4. Document API authentication setup process
+
+### Short Term (Next Month)
+
+1. Implement mining fleet management functionality
+2. Add more Discord commands (character lookup, skill planning)
+3. Expand web interface with more character statistics
+4. Establish proper versioning and release process
+
+### Medium Term (Next Quarter)
+
+1. Migrate web framework to Elysia + Ripple SPA
+2. Add support for corporation and alliance management
+3. Implement data synchronization and caching strategies
+4. Create documentation for third-party developers
+
+### Long Term (Next Year)
+
+1. Star Citizen integration architecture
+2. Multi-game framework abstraction
+3. Plugin system for community extensions
+4. Performance optimization and scaling
+
+## Key Stakeholders
+
+### Internal Development
+
+- **Primary Developer**: j-b-3 (project owner and main developer)
+- **Target Users**: EVE Online corporations and alliances
+- **Future Contributors**: Open source community (planned)
+
+### External Dependencies
+
+- **CCP Games**: EVE Online ESI API provider
+- **Discord**: Platform and API provider
+- **Community**: EVE Online player community feedback
+
+## Risk Assessment
+
+### Technical Risks
+
+- **Framework Migration**: Brisa to Elysia migration complexity
+- **API Rate Limits**: EVE ESI and third-party API limitations
+- **Database Performance**: SQLite scalability for large datasets
+- **Token Management**: OAuth token refresh reliability
+
+### Project Risks
+
+- **Single Developer**: No backup maintainer currently
+- **Community Adoption**: Uncertain uptake by EVE Online communities
+- **Game API Changes**: Dependency on external game APIs
+- **Competition**: Existing EVE Online bot solutions
+
+## Success Metrics
+
+### Current Measurements
+
+- **Code Quality**: Type safety across all packages
+- **Architecture**: Modular design with clear separation
+- **Documentation**: Comprehensive memory bank established
+- **Functionality**: Basic bot and web interface working
+
+### Target Metrics
+
+- **Test Coverage**: 80% across major functionality
+- **Performance**: <2 second Discord command response times
+- **Reliability**: 99%+ uptime for deployed services
+- **Adoption**: Usage by multiple EVE Online communities
diff --git a/.kilocode/rules/memory-bank/product.md b/.kilocode/rules/memory-bank/product.md
index 4d9fe73..2d066e1 100644
--- a/.kilocode/rules/memory-bank/product.md
+++ b/.kilocode/rules/memory-bank/product.md
@@ -1,100 +1,100 @@
-# Product Overview - Star Kitten
-
-## What Star Kitten Is
-
-Star Kitten is a comprehensive framework for building Discord bots and web applications focused on gaming communities, specifically MMO games like EVE Online and Star Citizen. It provides reusable packages and components that handle common gaming bot functionality including authentication, API integrations, data management, and user interfaces.
-
-## Problems It Solves
-
-### For Gaming Community Managers
-
-- **Fragmented Tools**: Gaming communities often use multiple disconnected tools for different functions (Discord bots, web dashboards, data analysis)
-- **Complex Authentication**: Managing OAuth flows for game APIs (EVE ESI, future Star Citizen APIs) is complex and error-prone
-- **Data Integration**: Combining game data with Discord interactions and web interfaces requires significant development effort
-- **Repetitive Development**: Building similar functionality across different gaming communities involves recreating the same patterns
-
-### For Developers
-
-- **Discord Bot Boilerplate**: Eliminates the need to write command handling, interaction management, and Discord client setup from scratch
-- **Game API Complexity**: Abstracts complex game API authentication, token management, and data fetching
-- **Database Management**: Provides pre-built schemas and models for common gaming bot use cases
-- **Type Safety**: Offers comprehensive TypeScript definitions for all game data types and API responses
-
-## How It Works
-
-### Architecture Philosophy
-
-Star Kitten follows a modular, package-based architecture where each package serves a specific purpose:
-
-1. **[@star-kitten/discord](packages/discord/)** - Core Discord bot functionality with command handling and interaction management
-2. **[@star-kitten/eve](packages/eve/)** - EVE Online specific integrations including ESI API, authentication, and data models
-3. **[@star-kitten/util](packages/util/)** - Shared utilities including schedulers, text processing, and JSON querying
-4. **[eve-bot](packages/eve-bot/)** - Complete EVE Online Discord bot implementation
-5. **[eve-web](packages/eve-web/)** - Web interface for EVE Online bot management and statistics
-
-### Key Workflows
-
-#### Discord Bot Creation
-
-1. Import command handling from `@star-kitten/discord`
-2. Create command files with `.command.ts` extension
-3. Bot automatically discovers and registers commands
-4. Handle interactions through standardized command structure
-
-#### EVE Online Integration
-
-1. User authenticates via EVE SSO through web interface
-2. Tokens stored securely with automatic refresh handling
-3. ESI API calls abstracted through helper functions
-4. Character data synchronized and cached in local database
-
-#### Web Dashboard
-
-1. Users authenticate via EVE SSO
-2. Character data displayed through reactive components
-3. Real-time statistics from ESI API
-4. Admin functions for bot management
-
-## User Experience Goals
-
-### Discord Users
-
-- **Intuitive Commands**: Slash commands with clear descriptions and localization support
-- **Rich Interactions**: Modal forms, select menus, and interactive components for complex workflows
-- **Immediate Feedback**: Fast response times with proper loading states and error handling
-- **Contextual Help**: Commands provide guidance and examples for proper usage
-
-### Web Users
-
-- **Seamless Authentication**: Single sign-on through EVE Online credentials
-- **Responsive Design**: Works well on desktop and mobile devices
-- **Real-time Data**: Live updates of character stats, wallet balances, and skill queues
-- **Progressive Enhancement**: Basic functionality works without JavaScript
-
-### Bot Administrators
-
-- **Easy Deployment**: Simple configuration through environment variables
-- **Monitoring**: Built-in logging and error tracking
-- **Scalability**: Modular architecture supports adding new features without breaking existing functionality
-- **Data Control**: Local database with full control over user data and privacy
-
-## Success Metrics
-
-### Technical Success
-
-- **Reliability**: 99%+ uptime for bot and web services
-- **Performance**: < 2 second response times for Discord commands
-- **Code Quality**: 80%+ test coverage maintained across all packages
-- **Developer Experience**: New features can be added without modifying core packages
-
-### User Adoption
-
-- **Community Growth**: Framework adoption by multiple EVE Online corporations/alliances
-- **Feature Usage**: High engagement with key features like appraisals, fleet management, and character tracking
-- **Feedback Integration**: Regular updates based on user feedback and pain points
-
-### Long-term Vision
-
-- **Multi-Game Support**: Expand to Star Citizen and other MMO games
-- **Ecosystem Growth**: Third-party packages extending Star Kitten functionality
-- **Open Source Community**: Active contributor base improving and extending the framework
+# Product Overview - Star Kitten
+
+## What Star Kitten Is
+
+Star Kitten is a comprehensive framework for building Discord bots and web applications focused on gaming communities, specifically MMO games like EVE Online and Star Citizen. It provides reusable packages and components that handle common gaming bot functionality including authentication, API integrations, data management, and user interfaces.
+
+## Problems It Solves
+
+### For Gaming Community Managers
+
+- **Fragmented Tools**: Gaming communities often use multiple disconnected tools for different functions (Discord bots, web dashboards, data analysis)
+- **Complex Authentication**: Managing OAuth flows for game APIs (EVE ESI, future Star Citizen APIs) is complex and error-prone
+- **Data Integration**: Combining game data with Discord interactions and web interfaces requires significant development effort
+- **Repetitive Development**: Building similar functionality across different gaming communities involves recreating the same patterns
+
+### For Developers
+
+- **Discord Bot Boilerplate**: Eliminates the need to write command handling, interaction management, and Discord client setup from scratch
+- **Game API Complexity**: Abstracts complex game API authentication, token management, and data fetching
+- **Database Management**: Provides pre-built schemas and models for common gaming bot use cases
+- **Type Safety**: Offers comprehensive TypeScript definitions for all game data types and API responses
+
+## How It Works
+
+### Architecture Philosophy
+
+Star Kitten follows a modular, package-based architecture where each package serves a specific purpose:
+
+1. **[@star-kitten/discord](packages/discord/)** - Core Discord bot functionality with command handling and interaction management
+2. **[@star-kitten/eve](packages/eve/)** - EVE Online specific integrations including ESI API, authentication, and data models
+3. **[@star-kitten/util](packages/util/)** - Shared utilities including schedulers, text processing, and JSON querying
+4. **[eve-bot](packages/eve-bot/)** - Complete EVE Online Discord bot implementation
+5. **[eve-web](packages/eve-web/)** - Web interface for EVE Online bot management and statistics
+
+### Key Workflows
+
+#### Discord Bot Creation
+
+1. Import command handling from `@star-kitten/discord`
+2. Create command files with `.command.ts` extension
+3. Bot automatically discovers and registers commands
+4. Handle interactions through standardized command structure
+
+#### EVE Online Integration
+
+1. User authenticates via EVE SSO through web interface
+2. Tokens stored securely with automatic refresh handling
+3. ESI API calls abstracted through helper functions
+4. Character data synchronized and cached in local database
+
+#### Web Dashboard
+
+1. Users authenticate via EVE SSO
+2. Character data displayed through reactive components
+3. Real-time statistics from ESI API
+4. Admin functions for bot management
+
+## User Experience Goals
+
+### Discord Users
+
+- **Intuitive Commands**: Slash commands with clear descriptions and localization support
+- **Rich Interactions**: Modal forms, select menus, and interactive components for complex workflows
+- **Immediate Feedback**: Fast response times with proper loading states and error handling
+- **Contextual Help**: Commands provide guidance and examples for proper usage
+
+### Web Users
+
+- **Seamless Authentication**: Single sign-on through EVE Online credentials
+- **Responsive Design**: Works well on desktop and mobile devices
+- **Real-time Data**: Live updates of character stats, wallet balances, and skill queues
+- **Progressive Enhancement**: Basic functionality works without JavaScript
+
+### Bot Administrators
+
+- **Easy Deployment**: Simple configuration through environment variables
+- **Monitoring**: Built-in logging and error tracking
+- **Scalability**: Modular architecture supports adding new features without breaking existing functionality
+- **Data Control**: Local database with full control over user data and privacy
+
+## Success Metrics
+
+### Technical Success
+
+- **Reliability**: 99%+ uptime for bot and web services
+- **Performance**: < 2 second response times for Discord commands
+- **Code Quality**: 80%+ test coverage maintained across all packages
+- **Developer Experience**: New features can be added without modifying core packages
+
+### User Adoption
+
+- **Community Growth**: Framework adoption by multiple EVE Online corporations/alliances
+- **Feature Usage**: High engagement with key features like appraisals, fleet management, and character tracking
+- **Feedback Integration**: Regular updates based on user feedback and pain points
+
+### Long-term Vision
+
+- **Multi-Game Support**: Expand to Star Citizen and other MMO games
+- **Ecosystem Growth**: Third-party packages extending Star Kitten functionality
+- **Open Source Community**: Active contributor base improving and extending the framework
diff --git a/.kilocode/rules/memory-bank/tasks.md b/.kilocode/rules/memory-bank/tasks.md
index 6105aa1..1d37826 100644
--- a/.kilocode/rules/memory-bank/tasks.md
+++ b/.kilocode/rules/memory-bank/tasks.md
@@ -1,151 +1,151 @@
-# Tasks - Star Kitten
-
-## Add New Discord Command
-
-**Last performed:** Initial setup
-**Files to modify:**
-
-- `packages/eve-bot/src/commands/[command-name].command.ts` - New command file
-- Global Discord client automatically registers new commands
-
-**Steps:**
-
-1. Create new command file following naming convention `[name].command.ts`
-2. Export Discord command definition as default export
-3. Add interaction handlers using global client event listeners
-4. Include localization for command names and descriptions
-5. Test command registration and interaction handling
-
-**Important notes:**
-
-- Commands are auto-discovered using glob patterns
-- Each command handles its own interactions via global client
-- Follow existing pattern from `appraise.command.ts`
-- Include comprehensive error handling for all interactions
-
-## Add New EVE ESI Integration
-
-**Last performed:** Character and wallet integration
-**Files to modify:**
-
-- `packages/eve/src/esi/[module].ts` - New ESI module
-- `packages/eve/src/esi/index.ts` - Export new module
-- `packages/eve/src/esi/scopes.ts` - Add required scopes if needed
-- `packages/eve/src/db/models/character.model.ts` - Add helper methods if needed
-
-**Steps:**
-
-1. Define required ESI scopes in scopes.ts
-2. Create new ESI module with fetch functions
-3. Add proper TypeScript interfaces for API responses
-4. Implement caching where appropriate
-5. Add character model helper methods for data access
-6. Update exports in index.ts
-
-**Important notes:**
-
-- Always handle token refresh automatically
-- Include comprehensive error handling for API failures
-- Follow existing patterns from character.ts and wallet integrations
-- Cache responses appropriately to respect rate limits
-
-## Database Schema Migration
-
-**Last performed:** Initial schema setup
-**Files to modify:**
-
-- `packages/eve/src/db/schema.ts` - Schema definitions
-- `packages/eve/src/db/models/` - Model helpers if needed
-- `packages/eve/src/db/index.ts` - Export new tables
-
-**Steps:**
-
-1. Update schema.ts with new tables/columns
-2. Generate migration using `bun run generate-migrations`
-3. Test migration with `bun run migrate`
-4. Update model classes with new methods
-5. Add exports to db/index.ts
-6. Update database initialization in main applications
-
-**Important notes:**
-
-- Always backup database before migrations
-- Test migrations on development database first
-- Update all references to schema changes
-- Consider data migration scripts for existing data
-
-## Add New Web Component
-
-**Last performed:** Skill queue and wallet components
-**Files to modify:**
-
-- `packages/eve-web/src/components/[category]/[component].tsx` - New component
-- `packages/eve-web/src/pages/index.tsx` - Import and use component
-- Related ESI integration if data source needed
-
-**Steps:**
-
-1. Create new component following existing patterns
-2. Implement async data loading with suspense fallback
-3. Add proper TypeScript interfaces for props
-4. Style using Tailwind CSS and DaisyUI components
-5. Import and integrate into appropriate page
-6. Test with real data and loading states
-
-**Important notes:**
-
-- Always provide suspense fallback for loading states
-- Follow existing component patterns from skill-queue.tsx and wallet.tsx
-- Use server-side rendering capabilities of Brisa
-- Ensure responsive design for mobile devices
-
-## Add Third-Party API Integration
-
-**Last performed:** Janice API integration
-**Files to modify:**
-
-- `packages/eve/src/third-party/[service].ts` - New API integration
-- `packages/eve/src/third-party/index.ts` - Export new service
-- Environment configuration for API keys
-
-**Steps:**
-
-1. Create new service module with TypeScript interfaces
-2. Implement API client with proper error handling
-3. Add caching layer for performance
-4. Include comprehensive validation for inputs/outputs
-5. Add tests for all API functions
-6. Update exports and environment configuration
-
-**Important notes:**
-
-- Always implement proper rate limiting and caching
-- Include comprehensive error handling and validation
-- Follow existing patterns from janice.ts
-- Add API key management through environment variables
-- Test with real API to ensure compatibility
-
-## Update Reference Data
-
-**Last performed:** Initial data setup
-**Files to modify:**
-
-- `data/reference-data/` - Static reference files
-- `data/hoboleaks/` - SDE data files
-- `packages/eve/src/models/` - Data model updates if needed
-
-**Steps:**
-
-1. Run `bun get-data` to download latest reference data
-2. Verify data integrity and format consistency
-3. Update data models if schema changes detected
-4. Test applications with new reference data
-5. Commit updated data files to repository
-
-**Important notes:**
-
-- Reference data updates can be large (hundreds of MB)
-- Always verify data integrity before committing
-- Test critical functionality after data updates
-- Consider data migration scripts for breaking changes
-- Monitor for EVE Online patch changes that affect data structure
+# Tasks - Star Kitten
+
+## Add New Discord Command
+
+**Last performed:** Initial setup
+**Files to modify:**
+
+- `packages/eve-bot/src/commands/[command-name].command.ts` - New command file
+- Global Discord client automatically registers new commands
+
+**Steps:**
+
+1. Create new command file following naming convention `[name].command.ts`
+2. Export Discord command definition as default export
+3. Add interaction handlers using global client event listeners
+4. Include localization for command names and descriptions
+5. Test command registration and interaction handling
+
+**Important notes:**
+
+- Commands are auto-discovered using glob patterns
+- Each command handles its own interactions via global client
+- Follow existing pattern from `appraise.command.ts`
+- Include comprehensive error handling for all interactions
+
+## Add New EVE ESI Integration
+
+**Last performed:** Character and wallet integration
+**Files to modify:**
+
+- `packages/eve/src/esi/[module].ts` - New ESI module
+- `packages/eve/src/esi/index.ts` - Export new module
+- `packages/eve/src/esi/scopes.ts` - Add required scopes if needed
+- `packages/eve/src/db/models/character.model.ts` - Add helper methods if needed
+
+**Steps:**
+
+1. Define required ESI scopes in scopes.ts
+2. Create new ESI module with fetch functions
+3. Add proper TypeScript interfaces for API responses
+4. Implement caching where appropriate
+5. Add character model helper methods for data access
+6. Update exports in index.ts
+
+**Important notes:**
+
+- Always handle token refresh automatically
+- Include comprehensive error handling for API failures
+- Follow existing patterns from character.ts and wallet integrations
+- Cache responses appropriately to respect rate limits
+
+## Database Schema Migration
+
+**Last performed:** Initial schema setup
+**Files to modify:**
+
+- `packages/eve/src/db/schema.ts` - Schema definitions
+- `packages/eve/src/db/models/` - Model helpers if needed
+- `packages/eve/src/db/index.ts` - Export new tables
+
+**Steps:**
+
+1. Update schema.ts with new tables/columns
+2. Generate migration using `bun run generate-migrations`
+3. Test migration with `bun run migrate`
+4. Update model classes with new methods
+5. Add exports to db/index.ts
+6. Update database initialization in main applications
+
+**Important notes:**
+
+- Always backup database before migrations
+- Test migrations on development database first
+- Update all references to schema changes
+- Consider data migration scripts for existing data
+
+## Add New Web Component
+
+**Last performed:** Skill queue and wallet components
+**Files to modify:**
+
+- `packages/eve-web/src/components/[category]/[component].tsx` - New component
+- `packages/eve-web/src/pages/index.tsx` - Import and use component
+- Related ESI integration if data source needed
+
+**Steps:**
+
+1. Create new component following existing patterns
+2. Implement async data loading with suspense fallback
+3. Add proper TypeScript interfaces for props
+4. Style using Tailwind CSS and DaisyUI components
+5. Import and integrate into appropriate page
+6. Test with real data and loading states
+
+**Important notes:**
+
+- Always provide suspense fallback for loading states
+- Follow existing component patterns from skill-queue.tsx and wallet.tsx
+- Use server-side rendering capabilities of Brisa
+- Ensure responsive design for mobile devices
+
+## Add Third-Party API Integration
+
+**Last performed:** Janice API integration
+**Files to modify:**
+
+- `packages/eve/src/third-party/[service].ts` - New API integration
+- `packages/eve/src/third-party/index.ts` - Export new service
+- Environment configuration for API keys
+
+**Steps:**
+
+1. Create new service module with TypeScript interfaces
+2. Implement API client with proper error handling
+3. Add caching layer for performance
+4. Include comprehensive validation for inputs/outputs
+5. Add tests for all API functions
+6. Update exports and environment configuration
+
+**Important notes:**
+
+- Always implement proper rate limiting and caching
+- Include comprehensive error handling and validation
+- Follow existing patterns from janice.ts
+- Add API key management through environment variables
+- Test with real API to ensure compatibility
+
+## Update Reference Data
+
+**Last performed:** Initial data setup
+**Files to modify:**
+
+- `data/reference-data/` - Static reference files
+- `data/hoboleaks/` - SDE data files
+- `packages/eve/src/models/` - Data model updates if needed
+
+**Steps:**
+
+1. Run `bun get-data` to download latest reference data
+2. Verify data integrity and format consistency
+3. Update data models if schema changes detected
+4. Test applications with new reference data
+5. Commit updated data files to repository
+
+**Important notes:**
+
+- Reference data updates can be large (hundreds of MB)
+- Always verify data integrity before committing
+- Test critical functionality after data updates
+- Consider data migration scripts for breaking changes
+- Monitor for EVE Online patch changes that affect data structure
diff --git a/.kilocode/rules/memory-bank/tech.md b/.kilocode/rules/memory-bank/tech.md
index 0d29dc4..1723eaf 100644
--- a/.kilocode/rules/memory-bank/tech.md
+++ b/.kilocode/rules/memory-bank/tech.md
@@ -1,249 +1,249 @@
-# Technology Stack - Star Kitten
-
-## Core Technologies
-
-### Runtime & Package Management
-
-- **Bun** - JavaScript runtime and package manager
- - Fast package installation and script execution
- - Native TypeScript support
- - Built-in test runner (`bun test`)
- - WebAPI compatibility for modern web standards
-
-### Language & Type System
-
-- **TypeScript** - Primary development language
- - Strict type checking enabled across all packages
- - Comprehensive type definitions for EVE Online data structures
- - Interface-driven development for API integrations
- - Global type declarations for shared client instances
-
-### Build System
-
-- **Workspace Architecture** - Bun workspaces for monorepo management
- - Four core packages: `@star-kitten/discord`, `@star-kitten/eve`, `@star-kitten/util`, plus applications
- - Cross-package dependencies managed through workspace references
- - Unified build commands across all packages (`bun build`, `bun dev`, `bun test`)
-- **tsdown** - TypeScript bundler for package builds
- - Zero-config TypeScript compilation
- - Watch mode support for development
- - Declaration file generation
-
-## Discord Integration
-
-### Discord Framework
-
-- **Dysnomia** - Discord API library
- - Modern JavaScript Discord library with full TypeScript support
- - Gateway intents configuration for minimal resource usage
- - Built-in interaction handling (slash commands, modals, components)
- - Event-driven architecture for command processing
-
-### Command Architecture
-
-- **Auto-discovery Pattern** - Commands automatically registered via file system scanning
- - Glob patterns (`**/*.command.{js,ts}`) for command file detection
- - Convention-based naming and structure
- - Global client registration with event listeners
-- **Internationalization** - Full i18n support
- - Command names and descriptions localized across multiple languages
- - Structured translation files for consistent localization
-
-## Database & Data Management
-
-### Database Layer
-
-- **SQLite** - Local database storage
- - Single-file database for simple deployment
- - ACID compliance for data integrity
- - Excellent performance for read-heavy workloads
-- **Drizzle ORM** - Type-safe database access
- - Schema-first approach with TypeScript definitions
- - Automatic migration generation via Drizzle Kit
- - Relationship mapping and query builder
- - Active Record pattern implementation in model helpers
-
-### Data Processing
-
-- **Streaming JSON Processing** - Memory-efficient handling of large datasets
- - `stream-json` library for parsing large EVE reference data files
- - Query-based filtering during stream processing
- - In-memory caching with TTL for frequently accessed data
-- **Reference Data Management**
- - External data sources (everef.net, hoboleaks)
- - Automated download and extraction scripts
- - Static export processes for optimized data formats
-
-## Web Framework
-
-### Frontend Framework
-
-- **Brisa** - Server-side rendering framework
- - Modern SSR with progressive enhancement
- - Component-based architecture
- - Built-in suspense support for async data loading
- - TypeScript-first development experience
-
-### Styling & UI
-
-- **Tailwind CSS** - Utility-first CSS framework
- - Responsive design system
- - Component-level styling
-- **DaisyUI** - Tailwind CSS component library
- - Pre-built UI components (stats, progress bars, modals)
- - Consistent design language across web interface
-
-### Authentication & Middleware
-
-- **EVE SSO Integration** - OAuth2 flow implementation
- - Complete authentication middleware stack
- - Token management with automatic refresh
- - Scope validation and permission handling
-- **Cookie Management** - Custom utilities for session handling
- - Secure cookie implementation
- - State management for OAuth flows
-
-## External API Integrations
-
-### EVE Online APIs
-
-- **ESI (EVE Swagger Interface)** - Official EVE Online API
- - Complete OAuth2 flow with scope management
- - Character, corporation, and alliance data access
- - Market data, skill queues, wallet information
- - Automatic token refresh with scope preservation
-- **JWT Token Validation** - Secure token handling
- - Public key verification against EVE's JWKS endpoint
- - Token scope extraction and validation
- - Character ID resolution from JWT payloads
-
-### Third-Party APIs
-
-- **Janice API** - Market appraisal service
- - Price checking and market analysis
- - Bulk item appraisal functionality
- - Caching layer for improved performance
-- **EveTycoon API** - Market data integration
- - Historical price data
- - Market trend analysis
-
-## Development Tools & Practices
-
-### Code Quality
-
-- **Prettier** - Code formatting
- - Consistent formatting across all packages
- - Integration with VS Code for format-on-save
- - Shared configuration files (`.prettierrc.yaml`)
-- **ESLint** - Code linting (implied by VS Code settings)
- - TypeScript-aware linting rules
- - Automatic fixing on save
-
-### Testing Framework
-
-- **Bun Test** - Native test runner
- - Fast test execution with TypeScript support
- - Coverage reporting capabilities
- - Target: 80%+ test coverage across major functionality
-
-### Development Environment
-
-- **VS Code Configuration**
- - Consistent editor settings across team
- - Format on save enabled
- - Trailing whitespace removal
- - Final newline insertion
-- **Environment Management**
- - dotenvx for environment variable management
- - Separate configurations for development and production
- - Secure key management for API credentials
-
-## Utility Libraries
-
-### Scheduling & Background Jobs
-
-- **Cron Parser** - Schedule management
- - Cron expression parsing and validation
- - Job scheduling with repeat patterns
-- **Custom Queue System** - Background job processing
- - SQLite-based job queue
- - Worker thread implementation
- - Email notifications and other background tasks
-
-### Text & Data Processing
-
-- **Date Utilities** - Time manipulation
- - date-fns for date calculations
- - EVE time conversion utilities
-- **Logging** - Structured application logs
- - Winston logging framework
- - Configurable log levels and outputs
-- **Text Processing** - Formatting and conversion
- - Number formatting (K, M, B suffixes)
- - EVE markup to Discord markdown conversion
- - Text truncation and cleaning utilities
-
-## Deployment & Configuration
-
-### Environment Configuration
-
-- **Multi-Environment Support**
- - Development, production environment files
- - Secure API key management
- - Database path configuration
-- **Docker Ready** - Containerization support
- - Bun-based container builds
- - SQLite database volume mounting
-
-### Database Management
-
-- **Migration System** - Schema version control
- - Drizzle Kit migration generation
- - Automated migration execution
- - Schema evolution tracking
-
-## Architecture Patterns
-
-### Package Organization
-
-- **Modular Monorepo** - Clear separation of concerns
- - Core packages for reusable functionality
- - Application packages for specific implementations
- - Shared utilities across packages
-- **Export Patterns** - Structured package APIs
- - Namespace exports for logical grouping
- - Direct exports for commonly used functions
- - Type-only exports where appropriate
-
-### Error Handling
-
-- **Consistent Error Patterns** - Standardized error handling
- - API error wrapping and propagation
- - Graceful degradation for external service failures
- - Comprehensive error logging
-
-### Performance Optimizations
-
-- **Caching Strategy** - Multi-level caching
- - In-memory caching for frequently accessed data
- - Database-level caching for computed results
- - HTTP response caching for external APIs
-- **Streaming Processing** - Memory-efficient data handling
- - Large file processing without memory overflow
- - Real-time data updates through streaming APIs
-
-## Future Technology Considerations
-
-### Migration Plans
-
-- **Web Framework Migration** - Planned transition from Brisa to Elysia + Ripple SPA
- - Backend: Elysia for high-performance HTTP server
- - Frontend: Ripple SPA for modern client-side architecture
- - Gradual migration strategy maintaining backward compatibility
-
-### Expansion Capabilities
-
-- **Multi-Game Support** - Architecture designed for game expansion
- - Pluggable game integration modules
- - Shared utilities across different game APIs
- - Common authentication and data patterns
+# Technology Stack - Star Kitten
+
+## Core Technologies
+
+### Runtime & Package Management
+
+- **Bun** - JavaScript runtime and package manager
+ - Fast package installation and script execution
+ - Native TypeScript support
+ - Built-in test runner (`bun test`)
+ - WebAPI compatibility for modern web standards
+
+### Language & Type System
+
+- **TypeScript** - Primary development language
+ - Strict type checking enabled across all packages
+ - Comprehensive type definitions for EVE Online data structures
+ - Interface-driven development for API integrations
+ - Global type declarations for shared client instances
+
+### Build System
+
+- **Workspace Architecture** - Bun workspaces for monorepo management
+ - Four core packages: `@star-kitten/discord`, `@star-kitten/eve`, `@star-kitten/util`, plus applications
+ - Cross-package dependencies managed through workspace references
+ - Unified build commands across all packages (`bun build`, `bun dev`, `bun test`)
+- **tsdown** - TypeScript bundler for package builds
+ - Zero-config TypeScript compilation
+ - Watch mode support for development
+ - Declaration file generation
+
+## Discord Integration
+
+### Discord Framework
+
+- **Dysnomia** - Discord API library
+ - Modern JavaScript Discord library with full TypeScript support
+ - Gateway intents configuration for minimal resource usage
+ - Built-in interaction handling (slash commands, modals, components)
+ - Event-driven architecture for command processing
+
+### Command Architecture
+
+- **Auto-discovery Pattern** - Commands automatically registered via file system scanning
+ - Glob patterns (`**/*.command.{js,ts}`) for command file detection
+ - Convention-based naming and structure
+ - Global client registration with event listeners
+- **Internationalization** - Full i18n support
+ - Command names and descriptions localized across multiple languages
+ - Structured translation files for consistent localization
+
+## Database & Data Management
+
+### Database Layer
+
+- **SQLite** - Local database storage
+ - Single-file database for simple deployment
+ - ACID compliance for data integrity
+ - Excellent performance for read-heavy workloads
+- **Drizzle ORM** - Type-safe database access
+ - Schema-first approach with TypeScript definitions
+ - Automatic migration generation via Drizzle Kit
+ - Relationship mapping and query builder
+ - Active Record pattern implementation in model helpers
+
+### Data Processing
+
+- **Streaming JSON Processing** - Memory-efficient handling of large datasets
+ - `stream-json` library for parsing large EVE reference data files
+ - Query-based filtering during stream processing
+ - In-memory caching with TTL for frequently accessed data
+- **Reference Data Management**
+ - External data sources (everef.net, hoboleaks)
+ - Automated download and extraction scripts
+ - Static export processes for optimized data formats
+
+## Web Framework
+
+### Frontend Framework
+
+- **Brisa** - Server-side rendering framework
+ - Modern SSR with progressive enhancement
+ - Component-based architecture
+ - Built-in suspense support for async data loading
+ - TypeScript-first development experience
+
+### Styling & UI
+
+- **Tailwind CSS** - Utility-first CSS framework
+ - Responsive design system
+ - Component-level styling
+- **DaisyUI** - Tailwind CSS component library
+ - Pre-built UI components (stats, progress bars, modals)
+ - Consistent design language across web interface
+
+### Authentication & Middleware
+
+- **EVE SSO Integration** - OAuth2 flow implementation
+ - Complete authentication middleware stack
+ - Token management with automatic refresh
+ - Scope validation and permission handling
+- **Cookie Management** - Custom utilities for session handling
+ - Secure cookie implementation
+ - State management for OAuth flows
+
+## External API Integrations
+
+### EVE Online APIs
+
+- **ESI (EVE Swagger Interface)** - Official EVE Online API
+ - Complete OAuth2 flow with scope management
+ - Character, corporation, and alliance data access
+ - Market data, skill queues, wallet information
+ - Automatic token refresh with scope preservation
+- **JWT Token Validation** - Secure token handling
+ - Public key verification against EVE's JWKS endpoint
+ - Token scope extraction and validation
+ - Character ID resolution from JWT payloads
+
+### Third-Party APIs
+
+- **Janice API** - Market appraisal service
+ - Price checking and market analysis
+ - Bulk item appraisal functionality
+ - Caching layer for improved performance
+- **EveTycoon API** - Market data integration
+ - Historical price data
+ - Market trend analysis
+
+## Development Tools & Practices
+
+### Code Quality
+
+- **Prettier** - Code formatting
+ - Consistent formatting across all packages
+ - Integration with VS Code for format-on-save
+ - Shared configuration files (`.prettierrc.yaml`)
+- **ESLint** - Code linting (implied by VS Code settings)
+ - TypeScript-aware linting rules
+ - Automatic fixing on save
+
+### Testing Framework
+
+- **Bun Test** - Native test runner
+ - Fast test execution with TypeScript support
+ - Coverage reporting capabilities
+ - Target: 80%+ test coverage across major functionality
+
+### Development Environment
+
+- **VS Code Configuration**
+ - Consistent editor settings across team
+ - Format on save enabled
+ - Trailing whitespace removal
+ - Final newline insertion
+- **Environment Management**
+ - dotenvx for environment variable management
+ - Separate configurations for development and production
+ - Secure key management for API credentials
+
+## Utility Libraries
+
+### Scheduling & Background Jobs
+
+- **Cron Parser** - Schedule management
+ - Cron expression parsing and validation
+ - Job scheduling with repeat patterns
+- **Custom Queue System** - Background job processing
+ - SQLite-based job queue
+ - Worker thread implementation
+ - Email notifications and other background tasks
+
+### Text & Data Processing
+
+- **Date Utilities** - Time manipulation
+ - date-fns for date calculations
+ - EVE time conversion utilities
+- **Logging** - Structured application logs
+ - Winston logging framework
+ - Configurable log levels and outputs
+- **Text Processing** - Formatting and conversion
+ - Number formatting (K, M, B suffixes)
+ - EVE markup to Discord markdown conversion
+ - Text truncation and cleaning utilities
+
+## Deployment & Configuration
+
+### Environment Configuration
+
+- **Multi-Environment Support**
+ - Development, production environment files
+ - Secure API key management
+ - Database path configuration
+- **Docker Ready** - Containerization support
+ - Bun-based container builds
+ - SQLite database volume mounting
+
+### Database Management
+
+- **Migration System** - Schema version control
+ - Drizzle Kit migration generation
+ - Automated migration execution
+ - Schema evolution tracking
+
+## Architecture Patterns
+
+### Package Organization
+
+- **Modular Monorepo** - Clear separation of concerns
+ - Core packages for reusable functionality
+ - Application packages for specific implementations
+ - Shared utilities across packages
+- **Export Patterns** - Structured package APIs
+ - Namespace exports for logical grouping
+ - Direct exports for commonly used functions
+ - Type-only exports where appropriate
+
+### Error Handling
+
+- **Consistent Error Patterns** - Standardized error handling
+ - API error wrapping and propagation
+ - Graceful degradation for external service failures
+ - Comprehensive error logging
+
+### Performance Optimizations
+
+- **Caching Strategy** - Multi-level caching
+ - In-memory caching for frequently accessed data
+ - Database-level caching for computed results
+ - HTTP response caching for external APIs
+- **Streaming Processing** - Memory-efficient data handling
+ - Large file processing without memory overflow
+ - Real-time data updates through streaming APIs
+
+## Future Technology Considerations
+
+### Migration Plans
+
+- **Web Framework Migration** - Planned transition from Brisa to Elysia + Ripple SPA
+ - Backend: Elysia for high-performance HTTP server
+ - Frontend: Ripple SPA for modern client-side architecture
+ - Gradual migration strategy maintaining backward compatibility
+
+### Expansion Capabilities
+
+- **Multi-Game Support** - Architecture designed for game expansion
+ - Pluggable game integration modules
+ - Shared utilities across different game APIs
+ - Common authentication and data patterns
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index c83e263..53dd67c 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -1,3 +1,3 @@
-{
- "recommendations": ["esbenp.prettier-vscode"]
-}
+{
+ "recommendations": ["esbenp.prettier-vscode"]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index ece9620..aa17f84 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,12 +1,12 @@
-{
- "editor.formatOnSave": true,
- "editor.codeActionsOnSave": {
- "source.fixAll": "explicit"
- },
- "files.trimTrailingWhitespace": true,
- "files.insertFinalNewline": true,
- "editor.tabSize": 2,
- "editor.insertSpaces": true,
- "editor.defaultFormatter": "esbenp.prettier-vscode",
- "typescript.tsdk": "node_modules\\typescript\\lib"
-}
+{
+ "editor.formatOnSave": true,
+ "editor.codeActionsOnSave": {
+ "source.fixAll": "explicit"
+ },
+ "files.trimTrailingWhitespace": true,
+ "files.insertFinalNewline": true,
+ "editor.tabSize": 2,
+ "editor.insertSpaces": true,
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "typescript.tsdk": "node_modules\\typescript\\lib"
+}
diff --git a/bun.lock b/bun.lock
index a0cfa44..b7f021b 100644
--- a/bun.lock
+++ b/bun.lock
@@ -1,5 +1,6 @@
{
"lockfileVersion": 1,
+ "configVersion": 1,
"workspaces": {
"": {
"name": "star-kitten",
@@ -62,6 +63,7 @@
"@star-kitten/discord": "workspace:^0.0.0",
"@star-kitten/eve": "workspace:^0.0.0",
"@star-kitten/util": "workspace:^0.0.0",
+ "mkdirp": "^3.0.1",
},
"devDependencies": {
"@dotenvx/dotenvx": "^1.49.0",
@@ -71,21 +73,24 @@
"typescript": "^5.9.2",
},
},
- "packages/eve-web": {
- "name": "@star-kitten/eve-web",
+ "packages/freight-web": {
+ "name": "freight-web",
+ "version": "1.0.0",
"dependencies": {
"@star-kitten/eve": "workspace:^0.0.0",
- "@star-kitten/util": "workspace:^0.0.0",
- "brisa": "0.2.7",
- "brisa-tailwindcss": "0.2.7",
- "drizzle-orm": "^0.40.0",
- "oslo": "^1.2.1",
+ "lucide-ripple": "^0.0.6",
+ "ripple": "latest",
+ "vite-tsconfig-paths": "^5.1.4",
},
"devDependencies": {
- "@types/bun": "latest",
- "daisyui": "^5.0.0",
- "drizzle-kit": "^0.30.5",
- "typescript": "latest",
+ "@ripple-ts/eslint-plugin": "latest",
+ "@ripple-ts/prettier-plugin": "latest",
+ "@ripple-ts/typescript-plugin": "latest",
+ "@ripple-ts/vite-plugin": "latest",
+ "eslint": "^9.0.0",
+ "prettier": "^3.6.2",
+ "typescript": "^5.9.2",
+ "vite": "^7.1.4",
},
},
"packages/util": {
@@ -114,43 +119,41 @@
},
},
"packages": {
- "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
-
"@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="],
- "@augment-vir/assert": ["@augment-vir/assert@31.34.1", "", { "dependencies": { "@augment-vir/core": "^31.34.1", "@date-vir/duration": "^7.4.2", "deep-eql": "^5.0.2", "expect-type": "^1.2.2", "type-fest": "^4.41.0" } }, "sha512-VqIN8muhVrU5A5SqZNrq/siO3+DoY1g+EzypJvw44xxHK398dVPLk5caJIcPRPJSPHOaE7osADh5nFf69aSsoQ=="],
+ "@augment-vir/assert": ["@augment-vir/assert@31.51.1", "", { "dependencies": { "@augment-vir/core": "^31.51.1", "@date-vir/duration": "^8.0.0", "deep-eql": "^5.0.2", "expect-type": "^1.2.2", "type-fest": "^5.2.0" } }, "sha512-N6/7SokwxedFCAL5xm+IU4ekXBmQ2C2mjPnZ81SAtYUJhn0y52WjGzFyoKIQI25tludcHiwt0aRGsGCkgGIZGw=="],
- "@augment-vir/common": ["@augment-vir/common@31.34.1", "", { "dependencies": { "@augment-vir/assert": "^31.34.1", "@augment-vir/core": "^31.34.1", "@date-vir/duration": "^7.4.2", "ansi-styles": "^6.2.1", "deepcopy-esm": "^2.1.1", "json5": "^2.2.3", "type-fest": "^4.41.0", "typed-event-target": "^4.1.0" } }, "sha512-pXDdldftWKltkpaXv/DeLhoYmyIVEumg7nhovDH0XssNm24VfzbbQqi2aYxOHL/MBni5sAfLM2saMEOxMgWOYQ=="],
+ "@augment-vir/common": ["@augment-vir/common@31.51.1", "", { "dependencies": { "@augment-vir/assert": "^31.51.1", "@augment-vir/core": "^31.51.1", "@date-vir/duration": "^8.0.0", "ansi-styles": "^6.2.3", "deepcopy-esm": "^2.1.1", "json5": "^2.2.3", "type-fest": "^5.2.0", "typed-event-target": "^4.1.0" } }, "sha512-lem5Pwzht7oHwCwwe4hSxUjoChdjW6PVI5xHSZoiUpgygrQAbEjMEribR+6qyB42oRaihDjpbden/c/KuLdkGg=="],
- "@augment-vir/core": ["@augment-vir/core@31.34.1", "", { "dependencies": { "@date-vir/duration": "^7.4.2", "browser-or-node": "^3.0.0", "json5": "^2.2.3", "type-fest": "^4.41.0" } }, "sha512-YhMCvtNw887dKJpk5DMZqHuejZgcsVJyeEVTDVJ3t6EF+ejtm2wctMRmtVtciOtnRamWEJ6QPwfiXiD/Jbe7LA=="],
+ "@augment-vir/core": ["@augment-vir/core@31.51.1", "", { "dependencies": { "@date-vir/duration": "^8.0.0", "browser-or-node": "^3.0.0", "diff": "^8.0.2", "json5": "^2.2.3", "type-fest": "^5.2.0" } }, "sha512-o/eQVXILuRit+tF/Ll0+xbef+jT9WnP84fTrVgO9iZ0GT3ngprM3gepxImrr0pI5vFidiLIhfTxhl+kHHtpYpg=="],
- "@babel/generator": ["@babel/generator@7.28.3", "", { "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw=="],
+ "@babel/generator": ["@babel/generator@7.28.5", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ=="],
"@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
- "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="],
+ "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="],
- "@babel/parser": ["@babel/parser@7.28.4", "", { "dependencies": { "@babel/types": "^7.28.4" }, "bin": "./bin/babel-parser.js" }, "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg=="],
+ "@babel/parser": ["@babel/parser@7.28.5", "", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": "./bin/babel-parser.js" }, "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="],
- "@babel/types": ["@babel/types@7.28.4", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q=="],
+ "@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="],
"@bcoe/v8-coverage": ["@bcoe/v8-coverage@1.0.2", "", {}, "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA=="],
"@colors/colors": ["@colors/colors@1.6.0", "", {}, "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA=="],
- "@dabh/diagnostics": ["@dabh/diagnostics@2.0.3", "", { "dependencies": { "colorspace": "1.1.x", "enabled": "2.0.x", "kuler": "^2.0.0" } }, "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA=="],
+ "@dabh/diagnostics": ["@dabh/diagnostics@2.0.8", "", { "dependencies": { "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", "kuler": "^2.0.0" } }, "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q=="],
- "@date-vir/duration": ["@date-vir/duration@7.4.2", "", { "dependencies": { "@types/luxon": "^3.7.1", "luxon": "^3.7.1", "type-fest": "^4.41.0" } }, "sha512-6SNXMv8SncOo6Yla4twZseWxmi37oBOvnXS59TXRm6LJ28lgqtaOd5YCzW5qOsT/jstgfO0ax7qGUsmm812unw=="],
+ "@date-vir/duration": ["@date-vir/duration@8.0.0", "", { "dependencies": { "@types/luxon": "^3.7.1", "luxon": "^3.7.2", "type-fest": "^5.0.1" } }, "sha512-zuliBiCkSdmTTZZAYrKXB70X6SbY0iN3xaO+E0pA2tVp+zyDCdOJfhY4XSkUyIBhp7aF2HC/C2xVOIJ3n/5h8A=="],
- "@dotenvx/dotenvx": ["@dotenvx/dotenvx@1.49.0", "", { "dependencies": { "commander": "^11.1.0", "dotenv": "^17.2.1", "eciesjs": "^0.4.10", "execa": "^5.1.1", "fdir": "^6.2.0", "ignore": "^5.3.0", "object-treeify": "1.1.33", "picomatch": "^4.0.2", "which": "^4.0.0" }, "bin": { "dotenvx": "src/cli/dotenvx.js" } }, "sha512-M1cyP6YstFQCjih54SAxCqHLMMi8QqV8tenpgGE48RTXWD7vfMYJiw/6xcCDpS2h28AcLpTsFCZA863Ge9yxzA=="],
+ "@dotenvx/dotenvx": ["@dotenvx/dotenvx@1.51.1", "", { "dependencies": { "commander": "^11.1.0", "dotenv": "^17.2.1", "eciesjs": "^0.4.10", "execa": "^5.1.1", "fdir": "^6.2.0", "ignore": "^5.3.0", "object-treeify": "1.1.33", "picomatch": "^4.0.2", "which": "^4.0.0" }, "bin": { "dotenvx": "src/cli/dotenvx.js" } }, "sha512-fqcQxcxC4LOaUlW8IkyWw8x0yirlLUkbxohz9OnWvVWjf73J5yyw7jxWnkOJaUKXZotcGEScDox9MU6rSkcDgg=="],
"@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="],
- "@ecies/ciphers": ["@ecies/ciphers@0.2.4", "", { "peerDependencies": { "@noble/ciphers": "^1.0.0" } }, "sha512-t+iX+Wf5nRKyNzk8dviW3Ikb/280+aEJAnw9YXvCp2tYGPSkMki+NRY+8aNLmVFv3eNtMdvViPNOPxS8SZNP+w=="],
+ "@ecies/ciphers": ["@ecies/ciphers@0.2.5", "", { "peerDependencies": { "@noble/ciphers": "^1.0.0" } }, "sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A=="],
- "@emnapi/core": ["@emnapi/core@0.45.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw=="],
+ "@emnapi/core": ["@emnapi/core@1.7.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg=="],
- "@emnapi/runtime": ["@emnapi/runtime@0.45.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w=="],
+ "@emnapi/runtime": ["@emnapi/runtime@1.7.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA=="],
"@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="],
@@ -158,73 +161,95 @@
"@esbuild-kit/esm-loader": ["@esbuild-kit/esm-loader@2.6.5", "", { "dependencies": { "@esbuild-kit/core-utils": "^3.3.2", "get-tsconfig": "^4.7.0" } }, "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA=="],
- "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.9", "", { "os": "aix", "cpu": "ppc64" }, "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA=="],
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA=="],
- "@esbuild/android-arm": ["@esbuild/android-arm@0.25.9", "", { "os": "android", "cpu": "arm" }, "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ=="],
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.25.12", "", { "os": "android", "cpu": "arm" }, "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg=="],
- "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.9", "", { "os": "android", "cpu": "arm64" }, "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg=="],
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.12", "", { "os": "android", "cpu": "arm64" }, "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg=="],
- "@esbuild/android-x64": ["@esbuild/android-x64@0.25.9", "", { "os": "android", "cpu": "x64" }, "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw=="],
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.25.12", "", { "os": "android", "cpu": "x64" }, "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg=="],
- "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg=="],
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg=="],
- "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ=="],
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA=="],
- "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.9", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q=="],
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg=="],
- "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg=="],
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ=="],
- "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.9", "", { "os": "linux", "cpu": "arm" }, "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw=="],
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.12", "", { "os": "linux", "cpu": "arm" }, "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw=="],
- "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw=="],
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ=="],
- "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.9", "", { "os": "linux", "cpu": "ia32" }, "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A=="],
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA=="],
- "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ=="],
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng=="],
- "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA=="],
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw=="],
- "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.9", "", { "os": "linux", "cpu": "ppc64" }, "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w=="],
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA=="],
- "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg=="],
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.12", "", { "os": "linux", "cpu": "none" }, "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w=="],
- "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.9", "", { "os": "linux", "cpu": "s390x" }, "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA=="],
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg=="],
- "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.9", "", { "os": "linux", "cpu": "x64" }, "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg=="],
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.12", "", { "os": "linux", "cpu": "x64" }, "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw=="],
- "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.9", "", { "os": "none", "cpu": "arm64" }, "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q=="],
+ "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg=="],
- "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.9", "", { "os": "none", "cpu": "x64" }, "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g=="],
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.12", "", { "os": "none", "cpu": "x64" }, "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ=="],
- "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.9", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ=="],
+ "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.12", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A=="],
- "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.9", "", { "os": "openbsd", "cpu": "x64" }, "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA=="],
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw=="],
- "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.9", "", { "os": "none", "cpu": "arm64" }, "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg=="],
+ "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.12", "", { "os": "none", "cpu": "arm64" }, "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg=="],
- "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.9", "", { "os": "sunos", "cpu": "x64" }, "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw=="],
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w=="],
- "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ=="],
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg=="],
- "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.9", "", { "os": "win32", "cpu": "ia32" }, "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww=="],
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ=="],
- "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.9", "", { "os": "win32", "cpu": "x64" }, "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ=="],
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="],
+
+ "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="],
+
+ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="],
+
+ "@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="],
+
+ "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="],
+
+ "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="],
+
+ "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="],
+
+ "@eslint/js": ["@eslint/js@9.39.1", "", {}, "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw=="],
+
+ "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="],
+
+ "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="],
+
+ "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
+
+ "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="],
+
+ "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
+
+ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="],
"@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
- "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="],
-
"@istanbuljs/schema": ["@istanbuljs/schema@0.1.3", "", {}, "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA=="],
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
- "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
-
"@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
- "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.30", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q=="],
+ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
"@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="],
@@ -234,83 +259,27 @@
"@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="],
- "@node-rs/argon2": ["@node-rs/argon2@1.7.0", "", { "optionalDependencies": { "@node-rs/argon2-android-arm-eabi": "1.7.0", "@node-rs/argon2-android-arm64": "1.7.0", "@node-rs/argon2-darwin-arm64": "1.7.0", "@node-rs/argon2-darwin-x64": "1.7.0", "@node-rs/argon2-freebsd-x64": "1.7.0", "@node-rs/argon2-linux-arm-gnueabihf": "1.7.0", "@node-rs/argon2-linux-arm64-gnu": "1.7.0", "@node-rs/argon2-linux-arm64-musl": "1.7.0", "@node-rs/argon2-linux-x64-gnu": "1.7.0", "@node-rs/argon2-linux-x64-musl": "1.7.0", "@node-rs/argon2-wasm32-wasi": "1.7.0", "@node-rs/argon2-win32-arm64-msvc": "1.7.0", "@node-rs/argon2-win32-ia32-msvc": "1.7.0", "@node-rs/argon2-win32-x64-msvc": "1.7.0" } }, "sha512-zfULc+/tmcWcxn+nHkbyY8vP3+MpEqKORbszt4UkpqZgBgDAAIYvuDN/zukfTgdmo6tmJKKVfzigZOPk4LlIog=="],
-
- "@node-rs/argon2-android-arm-eabi": ["@node-rs/argon2-android-arm-eabi@1.7.0", "", { "os": "android", "cpu": "arm" }, "sha512-udDqkr5P9E+wYX1SZwAVPdyfYvaF4ry9Tm+R9LkfSHbzWH0uhU6zjIwNRp7m+n4gx691rk+lqqDAIP8RLKwbhg=="],
-
- "@node-rs/argon2-android-arm64": ["@node-rs/argon2-android-arm64@1.7.0", "", { "os": "android", "cpu": "arm64" }, "sha512-s9j/G30xKUx8WU50WIhF0fIl1EdhBGq0RQ06lEhZ0Gi0ap8lhqbE2Bn5h3/G2D1k0Dx+yjeVVNmt/xOQIRG38A=="],
-
- "@node-rs/argon2-darwin-arm64": ["@node-rs/argon2-darwin-arm64@1.7.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ZIz4L6HGOB9U1kW23g+m7anGNuTZ0RuTw0vNp3o+2DWpb8u8rODq6A8tH4JRL79S+Co/Nq608m9uackN2pe0Rw=="],
-
- "@node-rs/argon2-darwin-x64": ["@node-rs/argon2-darwin-x64@1.7.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-5oi/pxqVhODW/pj1+3zElMTn/YukQeywPHHYDbcAW3KsojFjKySfhcJMd1DjKTc+CHQI+4lOxZzSUzK7mI14Hw=="],
-
- "@node-rs/argon2-freebsd-x64": ["@node-rs/argon2-freebsd-x64@1.7.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Ify08683hA4QVXYoIm5SUWOY5DPIT/CMB0CQT+IdxQAg/F+qp342+lUkeAtD5bvStQuCx/dFO3bnnzoe2clMhA=="],
-
- "@node-rs/argon2-linux-arm-gnueabihf": ["@node-rs/argon2-linux-arm-gnueabihf@1.7.0", "", { "os": "linux", "cpu": "arm" }, "sha512-7DjDZ1h5AUHAtRNjD19RnQatbhL+uuxBASuuXIBu4/w6Dx8n7YPxwTP4MXfsvuRgKuMWiOb/Ub/HJ3kXVCXRkg=="],
-
- "@node-rs/argon2-linux-arm64-gnu": ["@node-rs/argon2-linux-arm64-gnu@1.7.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-nJDoMP4Y3YcqGswE4DvP080w6O24RmnFEDnL0emdI8Nou17kNYBzP2546Nasx9GCyLzRcYQwZOUjrtUuQ+od2g=="],
-
- "@node-rs/argon2-linux-arm64-musl": ["@node-rs/argon2-linux-arm64-musl@1.7.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-BKWS8iVconhE3jrb9mj6t1J9vwUqQPpzCbUKxfTGJfc+kNL58F1SXHBoe2cDYGnHrFEHTY0YochzXoAfm4Dm/A=="],
-
- "@node-rs/argon2-linux-x64-gnu": ["@node-rs/argon2-linux-x64-gnu@1.7.0", "", { "os": "linux", "cpu": "x64" }, "sha512-EmgqZOlf4Jurk/szW1iTsVISx25bKksVC5uttJDUloTgsAgIGReCpUUO1R24pBhu9ESJa47iv8NSf3yAfGv6jQ=="],
-
- "@node-rs/argon2-linux-x64-musl": ["@node-rs/argon2-linux-x64-musl@1.7.0", "", { "os": "linux", "cpu": "x64" }, "sha512-/o1efYCYIxjfuoRYyBTi2Iy+1iFfhqHCvvVsnjNSgO1xWiWrX0Rrt/xXW5Zsl7vS2Y+yu8PL8KFWRzZhaVxfKA=="],
-
- "@node-rs/argon2-wasm32-wasi": ["@node-rs/argon2-wasm32-wasi@1.7.0", "", { "dependencies": { "@emnapi/core": "^0.45.0", "@emnapi/runtime": "^0.45.0", "@tybys/wasm-util": "^0.8.1", "memfs-browser": "^3.4.13000" }, "cpu": "none" }, "sha512-Evmk9VcxqnuwQftfAfYEr6YZYSPLzmKUsbFIMep5nTt9PT4XYRFAERj7wNYp+rOcBenF3X4xoB+LhwcOMTNE5w=="],
-
- "@node-rs/argon2-win32-arm64-msvc": ["@node-rs/argon2-win32-arm64-msvc@1.7.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-qgsU7T004COWWpSA0tppDqDxbPLgg8FaU09krIJ7FBl71Sz8SFO40h7fDIjfbTT5w7u6mcaINMQ5bSHu75PCaA=="],
-
- "@node-rs/argon2-win32-ia32-msvc": ["@node-rs/argon2-win32-ia32-msvc@1.7.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-JGafwWYQ/HpZ3XSwP4adQ6W41pRvhcdXvpzIWtKvX+17+xEXAe2nmGWM6s27pVkg1iV2ZtoYLRDkOUoGqZkCcg=="],
-
- "@node-rs/argon2-win32-x64-msvc": ["@node-rs/argon2-win32-x64-msvc@1.7.0", "", { "os": "win32", "cpu": "x64" }, "sha512-9oq4ShyFakw8AG3mRls0AoCpxBFcimYx7+jvXeAf2OqKNO+mSA6eZ9z7KQeVCi0+SOEUYxMGf5UiGiDb9R6+9Q=="],
-
- "@node-rs/bcrypt": ["@node-rs/bcrypt@1.9.0", "", { "optionalDependencies": { "@node-rs/bcrypt-android-arm-eabi": "1.9.0", "@node-rs/bcrypt-android-arm64": "1.9.0", "@node-rs/bcrypt-darwin-arm64": "1.9.0", "@node-rs/bcrypt-darwin-x64": "1.9.0", "@node-rs/bcrypt-freebsd-x64": "1.9.0", "@node-rs/bcrypt-linux-arm-gnueabihf": "1.9.0", "@node-rs/bcrypt-linux-arm64-gnu": "1.9.0", "@node-rs/bcrypt-linux-arm64-musl": "1.9.0", "@node-rs/bcrypt-linux-x64-gnu": "1.9.0", "@node-rs/bcrypt-linux-x64-musl": "1.9.0", "@node-rs/bcrypt-wasm32-wasi": "1.9.0", "@node-rs/bcrypt-win32-arm64-msvc": "1.9.0", "@node-rs/bcrypt-win32-ia32-msvc": "1.9.0", "@node-rs/bcrypt-win32-x64-msvc": "1.9.0" } }, "sha512-u2OlIxW264bFUfvbFqDz9HZKFjwe8FHFtn7T/U8mYjPZ7DWYpbUB+/dkW/QgYfMSfR0ejkyuWaBBe0coW7/7ig=="],
-
- "@node-rs/bcrypt-android-arm-eabi": ["@node-rs/bcrypt-android-arm-eabi@1.9.0", "", { "os": "android", "cpu": "arm" }, "sha512-nOCFISGtnodGHNiLrG0WYLWr81qQzZKYfmwHc7muUeq+KY0sQXyHOwZk9OuNQAWv/lnntmtbwkwT0QNEmOyLvA=="],
-
- "@node-rs/bcrypt-android-arm64": ["@node-rs/bcrypt-android-arm64@1.9.0", "", { "os": "android", "cpu": "arm64" }, "sha512-+ZrIAtigVmjYkqZQTThHVlz0+TG6D+GDHWhVKvR2DifjtqJ0i+mb9gjo++hN+fWEQdWNGxKCiBBjwgT4EcXd6A=="],
-
- "@node-rs/bcrypt-darwin-arm64": ["@node-rs/bcrypt-darwin-arm64@1.9.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-CQiS+F9Pa0XozvkXR1g7uXE9QvBOPOplDg0iCCPRYTN9PqA5qYxhwe48G3o+v2UeQceNRrbnEtWuANm7JRqIhw=="],
-
- "@node-rs/bcrypt-darwin-x64": ["@node-rs/bcrypt-darwin-x64@1.9.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-4pTKGawYd7sNEjdJ7R/R67uwQH1VvwPZ0SSUMmeNHbxD5QlwAPXdDH11q22uzVXsvNFZ6nGQBg8No5OUGpx6Ug=="],
-
- "@node-rs/bcrypt-freebsd-x64": ["@node-rs/bcrypt-freebsd-x64@1.9.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-UmWzySX4BJhT/B8xmTru6iFif3h0Rpx3TqxRLCcbgmH43r7k5/9QuhpiyzpvKGpKHJCFNm4F3rC2wghvw5FCIg=="],
-
- "@node-rs/bcrypt-linux-arm-gnueabihf": ["@node-rs/bcrypt-linux-arm-gnueabihf@1.9.0", "", { "os": "linux", "cpu": "arm" }, "sha512-8qoX4PgBND2cVwsbajoAWo3NwdfJPEXgpCsZQZURz42oMjbGyhhSYbovBCskGU3EBLoC8RA2B1jFWooeYVn5BA=="],
-
- "@node-rs/bcrypt-linux-arm64-gnu": ["@node-rs/bcrypt-linux-arm64-gnu@1.9.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-TuAC6kx0SbcIA4mSEWPi+OCcDjTQUMl213v5gMNlttF+D4ieIZx6pPDGTaMO6M2PDHTeCG0CBzZl0Lu+9b0c7Q=="],
-
- "@node-rs/bcrypt-linux-arm64-musl": ["@node-rs/bcrypt-linux-arm64-musl@1.9.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-/sIvKDABOI8QOEnLD7hIj02BVaNOuCIWBKvxcJOt8+TuwJ6zmY1UI5kSv9d99WbiHjTp97wtAUbZQwauU4b9ew=="],
-
- "@node-rs/bcrypt-linux-x64-gnu": ["@node-rs/bcrypt-linux-x64-gnu@1.9.0", "", { "os": "linux", "cpu": "x64" }, "sha512-DyyhDHDsLBsCKz1tZ1hLvUZSc1DK0FU0v52jK6IBQxrj24WscSU9zZe7ie/V9kdmA4Ep57BfpWX8Dsa2JxGdgQ=="],
-
- "@node-rs/bcrypt-linux-x64-musl": ["@node-rs/bcrypt-linux-x64-musl@1.9.0", "", { "os": "linux", "cpu": "x64" }, "sha512-duIiuqQ+Lew8ASSAYm6ZRqcmfBGWwsi81XLUwz86a2HR7Qv6V4yc3ZAUQovAikhjCsIqe8C11JlAZSK6+PlXYg=="],
-
- "@node-rs/bcrypt-wasm32-wasi": ["@node-rs/bcrypt-wasm32-wasi@1.9.0", "", { "dependencies": { "@emnapi/core": "^0.45.0", "@emnapi/runtime": "^0.45.0", "@tybys/wasm-util": "^0.8.1", "memfs-browser": "^3.4.13000" }, "cpu": "none" }, "sha512-ylaGmn9Wjwv/D5lxtawttx3H6Uu2WTTR7lWlRHGT6Ga/MB1Vj4OjSGUW8G8zIVnKuXpGbZ92pgHlt4HUpSLctw=="],
-
- "@node-rs/bcrypt-win32-arm64-msvc": ["@node-rs/bcrypt-win32-arm64-msvc@1.9.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-2h86gF7QFyEzODuDFml/Dp1MSJoZjxJ4yyT2Erf4NkwsiA5MqowUhUsorRwZhX6+2CtlGa7orbwi13AKMsYndw=="],
-
- "@node-rs/bcrypt-win32-ia32-msvc": ["@node-rs/bcrypt-win32-ia32-msvc@1.9.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-kqxalCvhs4FkN0+gWWfa4Bdy2NQAkfiqq/CEf6mNXC13RSV673Ev9V8sRlQyNpCHCNkeXfOT9pgoBdJmMs9muA=="],
-
- "@node-rs/bcrypt-win32-x64-msvc": ["@node-rs/bcrypt-win32-x64-msvc@1.9.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2y0Tuo6ZAT2Cz8V7DHulSlv1Bip3zbzeXyeur+uR25IRNYXKvI/P99Zl85Fbuu/zzYAZRLLlGTRe6/9IHofe/w=="],
-
- "@orama/orama": ["@orama/orama@3.1.13", "", {}, "sha512-O0hdKt4K31i8fpq8Bw5RfdPVAqm0EdduBUcluPo2MRcfCOwUEf5JlnvRhf/J0ezOYOD8jQ/LumYZxOVi/XK/BA=="],
+ "@orama/orama": ["@orama/orama@3.1.16", "", {}, "sha512-scSmQBD8eANlMUOglxHrN1JdSW8tDghsPuS83otqealBiIeMukCQMOf/wc0JJjDXomqwNdEQFLXLGHrU6PGxuA=="],
"@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="],
- "@oxc-project/runtime": ["@oxc-project/runtime@0.82.3", "", {}, "sha512-LNh5GlJvYHAnMurO+EyA8jJwN1rki7l3PSHuosDh2I7h00T6/u9rCkUjg/SvPmT1CZzvhuW0y+gf7jcqUy/Usg=="],
-
"@oxc-project/types": ["@oxc-project/types@0.70.0", "", {}, "sha512-ngyLUpUjO3dpqygSRQDx7nMx8+BmXbWOU4oIwTJFV2MVIDG7knIZwgdwXlQWLg3C3oxg1lS7ppMtPKqKFb7wzw=="],
- "@petamoriken/float16": ["@petamoriken/float16@3.9.2", "", {}, "sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog=="],
-
"@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="],
- "@projectdysnomia/dysnomia": ["@projectdysnomia/dysnomia@github:projectdysnomia/dysnomia#49d00d7", { "dependencies": { "ws": "^8.18.0" }, "optionalDependencies": { "@snazzah/davey": "^0.1.6", "@stablelib/xchacha20poly1305": "~1.0.1", "opusscript": "^0.1.1" }, "peerDependencies": { "@discordjs/opus": "^0.9.0", "erlpack": "github:discord/erlpack", "eventemitter3": "^5.0.1", "pako": "^2.1.0", "sodium-native": "^4.1.1", "zlib-sync": "^0.1.9" }, "optionalPeers": ["@discordjs/opus", "erlpack", "eventemitter3", "pako", "sodium-native", "zlib-sync"] }, "projectdysnomia-dysnomia-49d00d7"],
+ "@projectdysnomia/dysnomia": ["@projectdysnomia/dysnomia@github:projectdysnomia/dysnomia#11cf04e", { "dependencies": { "ws": "^8.18.0" }, "optionalDependencies": { "@snazzah/davey": "^0.1.6", "@stablelib/xchacha20poly1305": "~1.0.1", "opusscript": "^0.1.1" }, "peerDependencies": { "@discordjs/opus": "^0.9.0", "erlpack": "github:discord/erlpack", "eventemitter3": "^5.0.1", "pako": "^2.1.0", "sodium-native": "^4.1.1", "zlib-sync": "^0.1.9" }, "optionalPeers": ["@discordjs/opus", "erlpack", "eventemitter3", "pako", "sodium-native", "zlib-sync"] }, "projectdysnomia-dysnomia-11cf04e"],
"@quansync/fs": ["@quansync/fs@0.1.5", "", { "dependencies": { "quansync": "^0.2.11" } }, "sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA=="],
- "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-beta.35", "", { "os": "android", "cpu": "arm64" }, "sha512-zVTg0544Ib1ldJSWwjy8URWYHlLFJ98rLnj+2FIj5fRs4KqGKP4VgH/pVUbXNGxeLFjItie6NSK1Un7nJixneQ=="],
+ "@ripple-ts/eslint-plugin": ["@ripple-ts/eslint-plugin@0.2.175", "", { "peerDependencies": { "@ripple-ts/eslint-parser": "0.2.175", "@typescript-eslint/parser": "^8.20.0", "eslint": ">=9.0.0" }, "optionalPeers": ["@ripple-ts/eslint-parser", "@typescript-eslint/parser"] }, "sha512-gYqLfsRrX04Am0vPnfoKS5hNH42JwIOue9c+CFKkHdpzAaW+upRlEr/+oEUPZpIuSB4B/M3qSA3OG87MXVEgkw=="],
+
+ "@ripple-ts/prettier-plugin": ["@ripple-ts/prettier-plugin@0.2.175", "", { "peerDependencies": { "prettier": ">=2.0.0", "ripple": "*" } }, "sha512-xn855drAq048wIFqibismA7VBjDnvCE+Cs7F1Ji1lv/KC5xkAGEsMuoGdNjPthmEMWl8DLupfPGcl/PpzetrDA=="],
+
+ "@ripple-ts/typescript-plugin": ["@ripple-ts/typescript-plugin@0.2.175", "", { "dependencies": { "@volar/language-core": "~2.4.23", "@volar/typescript": "~2.4.23" }, "peerDependencies": { "ripple": "0.2.175", "typescript": "^5.9.2" } }, "sha512-FXLmOmMaOjDRKEkj6iZ4YTd3PmKs21+3IDx4X9jkzTz5DXLvViklTe2sZqF5B8iact/zhQuOaw8mKgGWPC6h5Q=="],
+
+ "@ripple-ts/vite-plugin": ["@ripple-ts/vite-plugin@0.2.175", "", {}, "sha512-RmgTtjXo5wX95RsmKggmBUzw9Gz1wBYj4CI4FcMF6gQm5cXIxFhRnJjjp20QHOwc5tioUafecWEz9t8M1qkrjQ=="],
+
+ "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-beta.50", "", { "os": "android", "cpu": "arm64" }, "sha512-XlEkrOIHLyGT3avOgzfTFSjG+f+dZMw+/qd+Y3HLN86wlndrB/gSimrJCk4gOhr1XtRtEKfszpadI3Md4Z4/Ag=="],
"@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-geUG/FUpm+membLC0NQBb39vVyOfguYZ2oyXc7emr6UjH6TeEECT4b0CPZXKFnELareTiU/Jfl70/eEgNxyQeA=="],
@@ -328,7 +297,7 @@
"@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.9", "", { "os": "linux", "cpu": "x64" }, "sha512-AMb0dicw+QHh6RxvWo4BRcuTMgS0cwUejJRMpSyIcHYnKTbj6nUW4HbWNQuDfZiF27l6F5gEwBS+YLUdVzL9vg=="],
- "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-beta.35", "", { "os": "none", "cpu": "arm64" }, "sha512-Tuwb8vPs+TVJlHhyLik+nwln/burvIgaPDgg6wjNZ23F1ttjZi0w0rQSZfAgsX4jaUbylwCETXQmTp3w6vcJMw=="],
+ "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-beta.50", "", { "os": "none", "cpu": "arm64" }, "sha512-eZUssog7qljrrRU9Mi0eqYEPm3Ch0UwB+qlWPMKSUXHNqhm3TvDZarJQdTevGEfu3EHAXJvBIe0YFYr0TPVaMA=="],
"@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.9", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.4" }, "cpu": "none" }, "sha512-+pdaiTx7L8bWKvsAuCE0HAxP1ze1WOLoWGCawcrZbMSY10dMh2i82lJiH6tXGXbfYYwsNWhWE2NyG4peFZvRfQ=="],
@@ -340,77 +309,81 @@
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.9", "", {}, "sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w=="],
- "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.50.1", "", { "os": "android", "cpu": "arm" }, "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag=="],
+ "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.53.2", "", { "os": "android", "cpu": "arm" }, "sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA=="],
- "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.50.1", "", { "os": "android", "cpu": "arm64" }, "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw=="],
+ "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.53.2", "", { "os": "android", "cpu": "arm64" }, "sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g=="],
- "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.50.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw=="],
+ "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.53.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ=="],
- "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.50.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw=="],
+ "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.53.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw=="],
- "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.50.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA=="],
+ "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.53.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-v0E9lJW8VsrwPux5Qe5CwmH/CF/2mQs6xU1MF3nmUxmZUCHazCjLgYvToOk+YuuUqLQBio1qkkREhxhc656ViA=="],
- "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.50.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ=="],
+ "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.53.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA=="],
- "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.50.1", "", { "os": "linux", "cpu": "arm" }, "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg=="],
+ "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.53.2", "", { "os": "linux", "cpu": "arm" }, "sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg=="],
- "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.50.1", "", { "os": "linux", "cpu": "arm" }, "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw=="],
+ "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.53.2", "", { "os": "linux", "cpu": "arm" }, "sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q=="],
- "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.50.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw=="],
+ "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.53.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA=="],
- "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.50.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w=="],
+ "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.53.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ=="],
- "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.50.1", "", { "os": "linux", "cpu": "none" }, "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q=="],
+ "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.53.2", "", { "os": "linux", "cpu": "none" }, "sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ=="],
- "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.50.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q=="],
+ "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.53.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g=="],
- "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.50.1", "", { "os": "linux", "cpu": "none" }, "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ=="],
+ "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.53.2", "", { "os": "linux", "cpu": "none" }, "sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA=="],
- "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.50.1", "", { "os": "linux", "cpu": "none" }, "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg=="],
+ "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.53.2", "", { "os": "linux", "cpu": "none" }, "sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ=="],
- "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.50.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg=="],
+ "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.53.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w=="],
- "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.50.1", "", { "os": "linux", "cpu": "x64" }, "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA=="],
+ "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.53.2", "", { "os": "linux", "cpu": "x64" }, "sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw=="],
- "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.50.1", "", { "os": "linux", "cpu": "x64" }, "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg=="],
+ "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.53.2", "", { "os": "linux", "cpu": "x64" }, "sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA=="],
- "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.50.1", "", { "os": "none", "cpu": "arm64" }, "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA=="],
+ "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.53.2", "", { "os": "none", "cpu": "arm64" }, "sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A=="],
- "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.50.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ=="],
+ "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.53.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA=="],
- "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.50.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A=="],
+ "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.53.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg=="],
- "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.50.1", "", { "os": "win32", "cpu": "x64" }, "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA=="],
+ "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.53.2", "", { "os": "win32", "cpu": "x64" }, "sha512-S6YojNVrHybQis2lYov1sd+uj7K0Q05NxHcGktuMMdIQ2VixGwAfbJ23NnlvvVV1bdpR2m5MsNBViHJKcA4ADw=="],
- "@snazzah/davey": ["@snazzah/davey@0.1.6", "", { "optionalDependencies": { "@snazzah/davey-android-arm-eabi": "0.1.6", "@snazzah/davey-android-arm64": "0.1.6", "@snazzah/davey-darwin-arm64": "0.1.6", "@snazzah/davey-darwin-x64": "0.1.6", "@snazzah/davey-freebsd-x64": "0.1.6", "@snazzah/davey-linux-arm-gnueabihf": "0.1.6", "@snazzah/davey-linux-arm64-gnu": "0.1.6", "@snazzah/davey-linux-arm64-musl": "0.1.6", "@snazzah/davey-linux-x64-gnu": "0.1.6", "@snazzah/davey-linux-x64-musl": "0.1.6", "@snazzah/davey-wasm32-wasi": "0.1.6", "@snazzah/davey-win32-arm64-msvc": "0.1.6", "@snazzah/davey-win32-ia32-msvc": "0.1.6", "@snazzah/davey-win32-x64-msvc": "0.1.6" } }, "sha512-wKJDQ7iobl3rvuQDXLC2yZdpuVxPvMnbyjyPpkcETqPfqNVrdyX9zSdV74dnkpx7aLpINEmKh8ZEIlCIJA2h1w=="],
+ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.53.2", "", { "os": "win32", "cpu": "x64" }, "sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA=="],
- "@snazzah/davey-android-arm-eabi": ["@snazzah/davey-android-arm-eabi@0.1.6", "", { "os": "android", "cpu": "arm" }, "sha512-6Fso+kxvvIcmUdTgU4etHjvEZUwGwvIk+SUYxKTRZKz/S62pZvcFeZfbofpQC5ZIlt/rdp7l+4IM62J7PUduxQ=="],
+ "@snazzah/davey": ["@snazzah/davey@0.1.7", "", { "optionalDependencies": { "@snazzah/davey-android-arm-eabi": "0.1.7", "@snazzah/davey-android-arm64": "0.1.7", "@snazzah/davey-darwin-arm64": "0.1.7", "@snazzah/davey-darwin-x64": "0.1.7", "@snazzah/davey-freebsd-x64": "0.1.7", "@snazzah/davey-linux-arm-gnueabihf": "0.1.7", "@snazzah/davey-linux-arm64-gnu": "0.1.7", "@snazzah/davey-linux-arm64-musl": "0.1.7", "@snazzah/davey-linux-x64-gnu": "0.1.7", "@snazzah/davey-linux-x64-musl": "0.1.7", "@snazzah/davey-wasm32-wasi": "0.1.7", "@snazzah/davey-win32-arm64-msvc": "0.1.7", "@snazzah/davey-win32-ia32-msvc": "0.1.7", "@snazzah/davey-win32-x64-msvc": "0.1.7" } }, "sha512-qBWp9sHf9vvKqDhg2AGOgWjB9q7MZat2CAPIcaXe+XFWl7nCmriRnDcdIRy7CwKWK+ECiuO29/RSxxKuulo28w=="],
- "@snazzah/davey-android-arm64": ["@snazzah/davey-android-arm64@0.1.6", "", { "os": "android", "cpu": "arm64" }, "sha512-5ZGLumjewJAmGAcHqSHb2+KZSSufdNY++/GouzqdQXfhs2bSNBPuHpNn94u6//5UK0o73udJ6B1H/uLOLfEBLQ=="],
+ "@snazzah/davey-android-arm-eabi": ["@snazzah/davey-android-arm-eabi@0.1.7", "", { "os": "android", "cpu": "arm" }, "sha512-GxkEpfFtaS8xZHN42NkTQhLFdYCQ9qxJvmG+qwYDL+wdv3s7Dl44o2lg5gwGOtQU8EZw9/lZkYi9TenYkStbFg=="],
- "@snazzah/davey-darwin-arm64": ["@snazzah/davey-darwin-arm64@0.1.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-0k6gOm29bcznz4ND1gfJVKeCxfyFw/EtfhPQvQ2PPJToSIaSvVqfYIlj/v9ogWW/lzuPI4EbLP0b6hnZkKidbQ=="],
+ "@snazzah/davey-android-arm64": ["@snazzah/davey-android-arm64@0.1.7", "", { "os": "android", "cpu": "arm64" }, "sha512-EkC1Wz3IMBZfbaCE82+peV+vEFVCRL3HxTRKGIY5AXzkKGQSJJ7Est/6h9vTcQbBEbMj2RAXRbwcydukWJR2vg=="],
- "@snazzah/davey-darwin-x64": ["@snazzah/davey-darwin-x64@0.1.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-y9UuymB5JTi9LSwjsCZDf/mjI6nAum1+uYX2h4xdO+VUxXQSAR4B2mr3lCI7l9KwYqW7JVDN5wETithAkXcTYA=="],
+ "@snazzah/davey-darwin-arm64": ["@snazzah/davey-darwin-arm64@0.1.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Iov5NUjhl5Q9XZHIuGLzd9PgQPm8ELI9NPiNt3r6VtSVHLp9/ktOgzaeEji0WnvvirrSb9MdpfTuyHnJjEXuRQ=="],
- "@snazzah/davey-freebsd-x64": ["@snazzah/davey-freebsd-x64@0.1.6", "", { "os": "freebsd", "cpu": "x64" }, "sha512-G0XzHi+pZqTZ5Zr7Z66J6oGOG07+Obw7f0CwD9nAJcSFlKnd8wYzTjL+krHfQxmLHnuA5w/9df+M9oDJDcGcJw=="],
+ "@snazzah/davey-darwin-x64": ["@snazzah/davey-darwin-x64@0.1.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-P7WqV/9ttSW2kHlC1WME8ykMeo0LJBzqbC9lZ2aYH4IEdb5mp4lCzb82mcEc99Nxi8878c0k5Qaza6z4KeSdIA=="],
- "@snazzah/davey-linux-arm-gnueabihf": ["@snazzah/davey-linux-arm-gnueabihf@0.1.6", "", { "os": "linux", "cpu": "arm" }, "sha512-RaxTzO8iJfDvj4a8OcXRwcP+2WfaCcno28ZWFMTI0pHEviG3MfLH5COAIvtMQvg0XfC+HgFC4YA1d29S8Dhvbg=="],
+ "@snazzah/davey-freebsd-x64": ["@snazzah/davey-freebsd-x64@0.1.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-O8QxS4jGPCvvHa5EJIvP0Dm2JkMqe1RnfDU0qnIcSwzJseqQqwpM5vXSMt9E2Mi58RiUGwTRefr0I9+ttCrDzg=="],
- "@snazzah/davey-linux-arm64-gnu": ["@snazzah/davey-linux-arm64-gnu@0.1.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-2BIJSWs4rHq4U9A7B6WtF1LzwYJrbFUz5SQVmwqwQXKJ8cm81iizqclDGWr3zFGiVPTXLZ/+G3wnQNDB54oABQ=="],
+ "@snazzah/davey-linux-arm-gnueabihf": ["@snazzah/davey-linux-arm-gnueabihf@0.1.7", "", { "os": "linux", "cpu": "arm" }, "sha512-30Gzhbg7kBbbg/Vdb75c5DUvHrwRglIXtTK0L3paxo5TCNXNFdfnSX5oLGjV4s1pyoFL8nWyq3/IzCcUIcHx5Q=="],
- "@snazzah/davey-linux-arm64-musl": ["@snazzah/davey-linux-arm64-musl@0.1.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-N1egO+HT8cvSdIGCzJNRVH3ZhxCIYKVYxEkfzVZaBx26snN8NF737YTVRldl84w//3tdgohyl27yrn+dMkWS2Q=="],
+ "@snazzah/davey-linux-arm64-gnu": ["@snazzah/davey-linux-arm64-gnu@0.1.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-kDpbZEb24bn84yDG7gG8KTLL1sTl+UHPEt83qD5G3Sm7L37DN+uABN4nw51wst1JzxWphq7tvSSjfqz9NES4Xg=="],
- "@snazzah/davey-linux-x64-gnu": ["@snazzah/davey-linux-x64-gnu@0.1.6", "", { "os": "linux", "cpu": "x64" }, "sha512-RAC96Y//HHoMP+1MUf4rOkBq5Nx6GCiOGeGsNXt7r02lbIthoFEPYFQdbfc9jYA79k67gpzmCa0N5ws7ZLVU5A=="],
+ "@snazzah/davey-linux-arm64-musl": ["@snazzah/davey-linux-arm64-musl@0.1.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-J+6CnJ34OaoFYq9f8BQPSXWMF3HRjKg5UCEb0E64Q7wMz5+6o7hACd7kVjKnG3as7IjGMcgp6/SNtrht79ntjQ=="],
- "@snazzah/davey-linux-x64-musl": ["@snazzah/davey-linux-x64-musl@0.1.6", "", { "os": "linux", "cpu": "x64" }, "sha512-nBvxJTKlQFP9UsQ7ah78L+rGdcwLWKDR8z/knut/M+UZLe37vaponJAbY3F5ZqGAcfqJbwUi/CXR77t9E+TDmw=="],
+ "@snazzah/davey-linux-x64-gnu": ["@snazzah/davey-linux-x64-gnu@0.1.7", "", { "os": "linux", "cpu": "x64" }, "sha512-7+I6LN43WkALjrQGm/pp1fQg84pSnwicsLPZKthlEi1L2UP2d9k8JEtnhHXJ4pymLuPsAZu5nC8QMDoIJy+exw=="],
- "@snazzah/davey-wasm32-wasi": ["@snazzah/davey-wasm32-wasi@0.1.6", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-hvpZH6a4mYZiXv6vdZaFwjPProgFtb3k4BoMvEEJZDXsEPuIDgp+d2BX5Q9nVazdnJa/6JR/XCuObzugPWp0Ew=="],
+ "@snazzah/davey-linux-x64-musl": ["@snazzah/davey-linux-x64-musl@0.1.7", "", { "os": "linux", "cpu": "x64" }, "sha512-N17vBRkU401w8EOvHVem2di/zAqv3CDgm7LAnONm8S/CNpAeLQWrhbHdN6RHZEyhQk2trnfPh4+wiZbAoXek0A=="],
- "@snazzah/davey-win32-arm64-msvc": ["@snazzah/davey-win32-arm64-msvc@0.1.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-iuxYXXa0Z8eAEZotAlMYUc5DCy3VonRXQMm8/w2EvM/ZzGBI7SMap0GhPf6HjArEW32ETarTLh1s/Yi/jhFPDQ=="],
+ "@snazzah/davey-wasm32-wasi": ["@snazzah/davey-wasm32-wasi@0.1.7", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.5" }, "cpu": "none" }, "sha512-BhtNJpqmP69sdSf5eyDqlIsZSjkHo6FebaXaYVH0qf3V9YYQdEbbjep3MrcIL2F0STfpceSi2v+vZTTwlZBbKw=="],
- "@snazzah/davey-win32-ia32-msvc": ["@snazzah/davey-win32-ia32-msvc@0.1.6", "", { "os": "win32", "cpu": "ia32" }, "sha512-QEubcCIBR+ZZoQzRzJuOuKcH2IaF2pFXU+t48ITHG1o2WL4NAnvc3IpfVQGhbkr+DlydZ6fKNMMEemd1pRZzRA=="],
+ "@snazzah/davey-win32-arm64-msvc": ["@snazzah/davey-win32-arm64-msvc@0.1.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-oj/F1eQRQggMwqXNq6CY4UTqcFcCi/Wug99jWH8LepLVsYUdFxQUNTqkp51qarT+lbuX4L/ZZqZX4y4dhz6Lvg=="],
- "@snazzah/davey-win32-x64-msvc": ["@snazzah/davey-win32-x64-msvc@0.1.6", "", { "os": "win32", "cpu": "x64" }, "sha512-8tR3o+amQOHJL8QzSwuSCCave+jm3SC1m1OKSh9Coy4wN/XoJN0XQUxqzA7ineSClAMW3yIO0ShFmMlMIXsC0A=="],
+ "@snazzah/davey-win32-ia32-msvc": ["@snazzah/davey-win32-ia32-msvc@0.1.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-T1qPP/pQm0qDaM7QGCYMzeXE1Xes0b3ckAQS2m27dt3FkD1Ki8FX2g77dcGOWqGkzDlNJj1drw/9QlgCt3Tcrw=="],
+
+ "@snazzah/davey-win32-x64-msvc": ["@snazzah/davey-win32-x64-msvc@0.1.7", "", { "os": "win32", "cpu": "x64" }, "sha512-Z2NhImUYeApi/lNn7MBcn14dPa2dtgnp5taz43JDaPpl+2cinDm9kYjpFzJE9SZMlfsa//p2dhE9B8TEVi9bHQ=="],
+
+ "@so-ric/colorspace": ["@so-ric/colorspace@1.1.6", "", { "dependencies": { "color": "^5.0.2", "text-hex": "1.0.x" } }, "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw=="],
"@stablelib/aead": ["@stablelib/aead@1.0.1", "", {}, "sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg=="],
@@ -436,50 +409,22 @@
"@star-kitten/eve": ["@star-kitten/eve@workspace:packages/eve"],
- "@star-kitten/eve-web": ["@star-kitten/eve-web@workspace:packages/eve-web"],
-
"@star-kitten/util": ["@star-kitten/util@workspace:packages/util"],
- "@tailwindcss/node": ["@tailwindcss/node@4.1.13", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.5.1", "lightningcss": "1.30.1", "magic-string": "^0.30.18", "source-map-js": "^1.2.1", "tailwindcss": "4.1.13" } }, "sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw=="],
+ "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.6", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ=="],
- "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.13", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.13", "@tailwindcss/oxide-darwin-arm64": "4.1.13", "@tailwindcss/oxide-darwin-x64": "4.1.13", "@tailwindcss/oxide-freebsd-x64": "4.1.13", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.13", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.13", "@tailwindcss/oxide-linux-arm64-musl": "4.1.13", "@tailwindcss/oxide-linux-x64-gnu": "4.1.13", "@tailwindcss/oxide-linux-x64-musl": "4.1.13", "@tailwindcss/oxide-wasm32-wasi": "4.1.13", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.13", "@tailwindcss/oxide-win32-x64-msvc": "4.1.13" } }, "sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA=="],
+ "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
- "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.13", "", { "os": "android", "cpu": "arm64" }, "sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew=="],
+ "@types/bun": ["@types/bun@1.3.2", "", { "dependencies": { "bun-types": "1.3.2" } }, "sha512-t15P7k5UIgHKkxwnMNkJbWlh/617rkDGEdSsDbu+qNHTaz9SKf7aC8fiIlUdD5RPpH6GEkP0cK7WlvmrEBRtWg=="],
- "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.13", "", { "os": "darwin", "cpu": "arm64" }, "sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ=="],
-
- "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.13", "", { "os": "darwin", "cpu": "x64" }, "sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw=="],
-
- "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.13", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ=="],
-
- "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.13", "", { "os": "linux", "cpu": "arm" }, "sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw=="],
-
- "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ=="],
-
- "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg=="],
-
- "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.13", "", { "os": "linux", "cpu": "x64" }, "sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ=="],
-
- "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.13", "", { "os": "linux", "cpu": "x64" }, "sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ=="],
-
- "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.13", "", { "dependencies": { "@emnapi/core": "^1.4.5", "@emnapi/runtime": "^1.4.5", "@emnapi/wasi-threads": "^1.0.4", "@napi-rs/wasm-runtime": "^0.2.12", "@tybys/wasm-util": "^0.10.0", "tslib": "^2.8.0" }, "cpu": "none" }, "sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA=="],
-
- "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.13", "", { "os": "win32", "cpu": "arm64" }, "sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg=="],
-
- "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.13", "", { "os": "win32", "cpu": "x64" }, "sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw=="],
-
- "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.13", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.13", "@tailwindcss/oxide": "4.1.13", "postcss": "^8.4.41", "tailwindcss": "4.1.13" } }, "sha512-HLgx6YSFKJT7rJqh9oJs/TkBFhxuMOfUKSBEPYwV+t78POOBsdQ7crhZLzwcH3T0UyUuOzU/GK5pk5eKr3wCiQ=="],
-
- "@tybys/wasm-util": ["@tybys/wasm-util@0.8.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q=="],
-
- "@types/bun": ["@types/bun@1.2.21", "", { "dependencies": { "bun-types": "1.2.21" } }, "sha512-NiDnvEqmbfQ6dmZ3EeUO577s4P5bf4HCTXtI6trMc6f6RzirY5IrF3aIookuSpyslFzrnvv2lmEWv5HyC1X79A=="],
-
- "@types/chai": ["@types/chai@5.2.2", "", { "dependencies": { "@types/deep-eql": "*" } }, "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg=="],
+ "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="],
"@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="],
"@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
+ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
+
"@types/jsonwebtoken": ["@types/jsonwebtoken@9.0.10", "", { "dependencies": { "@types/ms": "*", "@types/node": "*" } }, "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA=="],
"@types/jwk-to-pem": ["@types/jwk-to-pem@2.0.3", "", {}, "sha512-I/WFyFgk5GrNbkpmt14auGO3yFK1Wt4jXzkLuI+fDBNtO5ZI2rbymyGd6bKzfSBEuyRdM64ZUwxU1+eDcPSOEQ=="],
@@ -490,11 +435,11 @@
"@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
- "@types/node": ["@types/node@22.18.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-rzSDyhn4cYznVG+PCzGe1lwuMYJrcBS1fc3JqSa2PvtABwWo+dZ1ij5OVok3tqfpEBCBoaR4d7upFJk73HRJDw=="],
+ "@types/node": ["@types/node@22.19.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ=="],
"@types/node-cache": ["@types/node-cache@4.2.5", "", { "dependencies": { "node-cache": "*" } }, "sha512-faK2Owokboz53g8ooq2dw3iDJ6/HMTCIa2RvMte5WMTiABy+wA558K+iuyRtlR67Un5q9gEKysSDtqZYbSa0Pg=="],
- "@types/react": ["@types/react@19.1.12", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w=="],
+ "@types/react": ["@types/react@19.2.5", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-keKxkZMqnDicuvFoJbzrhbtdLSPhj/rZThDlKWCDbgXmUg0rEUFtRssDXKYmtXluZlIqiC5VqkCgRwzuyLHKHw=="],
"@types/stream-chain": ["@types/stream-chain@2.1.0", "", { "dependencies": { "@types/node": "*" } }, "sha512-guDyAl6s/CAzXUOWpGK2bHvdiopLIwpGu8v10+lb9hnQOyo4oj/ZUQFOvqFjKGsE3wJP1fpIesCcMvbXuWsqOg=="],
@@ -518,15 +463,25 @@
"@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="],
+ "@volar/language-core": ["@volar/language-core@2.4.23", "", { "dependencies": { "@volar/source-map": "2.4.23" } }, "sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ=="],
+
+ "@volar/source-map": ["@volar/source-map@2.4.23", "", {}, "sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q=="],
+
+ "@volar/typescript": ["@volar/typescript@2.4.23", "", { "dependencies": { "@volar/language-core": "2.4.23", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag=="],
+
"acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
"acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
- "ansi-regex": ["ansi-regex@6.2.0", "", {}, "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg=="],
+ "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
- "ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="],
+ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
- "ansis": ["ansis@4.1.0", "", {}, "sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w=="],
+ "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+
+ "ansis": ["ansis@4.2.0", "", {}, "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig=="],
+
+ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
"args-tokenizer": ["args-tokenizer@0.3.0", "", {}, "sha512-xXAd7G2Mll5W8uo37GETpQ2VrE84M181Z7ugHFGQnJZ50M2mbOv0osSZ9VsSgPfJQ+LVG0prSi0th+ELMsno7Q=="],
@@ -534,25 +489,19 @@
"assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="],
- "ast-kit": ["ast-kit@2.1.2", "", { "dependencies": { "@babel/parser": "^7.28.0", "pathe": "^2.0.3" } }, "sha512-cl76xfBQM6pztbrFWRnxbrDm9EOqDr1BF6+qQnnDZG2Co2LjyUktkN9GTJfBAfdae+DbT2nJf2nCGAdDDN7W2g=="],
+ "ast-kit": ["ast-kit@2.2.0", "", { "dependencies": { "@babel/parser": "^7.28.5", "pathe": "^2.0.3" } }, "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw=="],
- "ast-v8-to-istanbul": ["ast-v8-to-istanbul@0.3.5", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.30", "estree-walker": "^3.0.3", "js-tokens": "^9.0.1" } }, "sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA=="],
-
- "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="],
+ "ast-v8-to-istanbul": ["ast-v8-to-istanbul@0.3.8", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", "js-tokens": "^9.0.1" } }, "sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ=="],
"async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="],
"balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
- "birpc": ["birpc@2.5.0", "", {}, "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ=="],
+ "birpc": ["birpc@2.8.0", "", {}, "sha512-Bz2a4qD/5GRhiHSwj30c/8kC8QGj12nNDwz3D4ErQ4Xhy35dsSDvF+RA/tWpjyU0pdGtSDiEk6B5fBGE1qNVhw=="],
"bn.js": ["bn.js@4.12.2", "", {}, "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw=="],
- "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
-
- "brisa": ["brisa@0.2.7", "", { "dependencies": { "astring": "1.9.0", "csstype": "3.1.3", "diff-dom-streaming": "0.6.5", "meriyah": "6.0.5" }, "bin": { "brisa": "index.js" } }, "sha512-76fjLQkwfbAxdkA7bpQf7RUdvwsuC6l1nsNndn3yL6C2uD+SQ9RvHTuqwt8hWOz37j2zfN31AIxkJkuA9zwFMg=="],
-
- "brisa-tailwindcss": ["brisa-tailwindcss@0.2.7", "", { "peerDependencies": { "@tailwindcss/postcss": "^4.0.0", "postcss": "^8.4.48", "tailwindcss": "^4.0.1" } }, "sha512-ZH4iSEWqY1V+G2sfn7l9YpR/d0AcEK+pWbpIQgoPeFG/qeyDVihHahg7Vp2ZWVp8Bbqq4v0vUhI09zV+OJLFdA=="],
+ "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="],
"brorand": ["brorand@1.1.0", "", {}, "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="],
@@ -562,68 +511,70 @@
"buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
- "bumpp": ["bumpp@10.2.3", "", { "dependencies": { "ansis": "^4.1.0", "args-tokenizer": "^0.3.0", "c12": "^3.2.0", "cac": "^6.7.14", "escalade": "^3.2.0", "jsonc-parser": "^3.3.1", "package-manager-detector": "^1.3.0", "semver": "^7.7.2", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.14", "yaml": "^2.8.1" }, "bin": { "bumpp": "bin/bumpp.mjs" } }, "sha512-nsFBZACxuBVu6yzDSaZZaWpX5hTQ+++9WtYkmO+0Bd3cpSq0Mzvqw5V83n+fOyRj3dYuZRFCQf5Z9NNfZj+Rnw=="],
+ "bumpp": ["bumpp@10.3.1", "", { "dependencies": { "ansis": "^4.2.0", "args-tokenizer": "^0.3.0", "c12": "^3.3.0", "cac": "^6.7.14", "escalade": "^3.2.0", "jsonc-parser": "^3.3.1", "package-manager-detector": "^1.3.0", "semver": "^7.7.2", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.15", "yaml": "^2.8.1" }, "bin": { "bumpp": "bin/bumpp.mjs" } }, "sha512-cOKPRFCWvHcYPJQAHN6V7Jp/wAfnyqQRXQ+2fgWIL6Gao20rpu7xQ1cGGo1APOfmbQmmHngEPg9Fy7nJ3giRkQ=="],
- "bun-types": ["bun-types@1.2.21", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-sa2Tj77Ijc/NTLS0/Odjq/qngmEPZfbfnOERi0KRUYhT9R8M4VBioWVmMWE5GrYbKMc+5lVybXygLdibHaqVqw=="],
+ "bun-types": ["bun-types@1.3.2", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-i/Gln4tbzKNuxP70OWhJRZz1MRfvqExowP7U6JKoI8cntFrtxg7RJK3jvz7wQW54UuvNC8tbKHHri5fy74FVqg=="],
- "c12": ["c12@3.2.0", "", { "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^17.2.1", "exsolve": "^1.0.7", "giget": "^2.0.0", "jiti": "^2.5.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^1.0.0", "pkg-types": "^2.2.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-ixkEtbYafL56E6HiFuonMm1ZjoKtIo7TH68/uiEq4DAwv9NcUX2nJ95F8TrbMeNjqIkZpruo3ojXQJ+MGG5gcQ=="],
+ "c12": ["c12@3.3.2", "", { "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^17.2.3", "exsolve": "^1.0.8", "giget": "^2.0.0", "jiti": "^2.6.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.0.0", "pkg-types": "^2.3.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "*" }, "optionalPeers": ["magicast"] }, "sha512-QkikB2X5voO1okL3QsES0N690Sn/K9WokXqUsDQsWy5SnYb+psYQFGA10iy1bZHj3fjISKsI67Q90gruvWWM3A=="],
"cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],
+ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
+
"chai": ["chai@5.3.3", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw=="],
+ "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
"check-error": ["check-error@2.1.1", "", {}, "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw=="],
"chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
- "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="],
-
"citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="],
"clone": ["clone@2.1.2", "", {}, "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="],
- "color": ["color@3.2.1", "", { "dependencies": { "color-convert": "^1.9.3", "color-string": "^1.6.0" } }, "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA=="],
+ "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
- "color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="],
+ "color": ["color@5.0.3", "", { "dependencies": { "color-convert": "^3.1.3", "color-string": "^2.1.3" } }, "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA=="],
- "color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="],
+ "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
- "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="],
+ "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
- "colorspace": ["colorspace@1.1.4", "", { "dependencies": { "color": "^3.1.3", "text-hex": "1.0.x" } }, "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w=="],
+ "color-string": ["color-string@2.1.3", "", { "dependencies": { "color-name": "^2.0.0" } }, "sha512-r/wfcFshhORndnDjn3GtNVLA4QL4TAi0A/XIBNuWUIEAVyUBNWYLuckrDz/JM1aQlpIDzKuY5hAYdHcLYgwJsg=="],
"commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
+ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
+
"confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="],
"consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="],
- "cron-parser": ["cron-parser@5.3.1", "", { "dependencies": { "luxon": "^3.7.1" } }, "sha512-Mu5Jk1b4cUfY8u34+thI9TZxvQiuhaMBS2Ag84rOSoHlU33xtIPkXwr6lWuw3XPmxSxq317B+hl0o4J+LdhwNg=="],
+ "cron-parser": ["cron-parser@5.4.0", "", { "dependencies": { "luxon": "^3.7.1" } }, "sha512-HxYB8vTvnQFx4dLsZpGRa0uHp6X3qIzS3ZJgJ9v6l/5TJMgeWQbLkR5yiJ5hOxGbc9+jCADDnydIe15ReLZnJA=="],
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
- "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
-
- "daisyui": ["daisyui@5.1.8", "", {}, "sha512-MJd683sm8ydToKrPoY8q72cht4j2EKellmTex51alY7L4p782gUtXTAZwiMOZixeKda/qb/c94XgoyLWSm4VNg=="],
+ "csstype": ["csstype@3.2.0", "", {}, "sha512-si++xzRAY9iPp60roQiFta7OFbhrgvcthrhlNAGeQptSY25uJjkfUV8OArC3KLocB8JT8ohz+qgxWCmz8RhjIg=="],
"date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="],
- "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="],
+ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
"deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="],
+ "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
+
"deepcopy-esm": ["deepcopy-esm@2.1.1", "", {}, "sha512-0lopQd/gi3excE3sgBrjuR3gJv6ZElk027i30pUgdjtvSJl/OoZ8B6L42GUBm6C3G8hD1EB5ir2gTYnINzWx4g=="],
"defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="],
"destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="],
- "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="],
+ "devalue": ["devalue@5.5.0", "", {}, "sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w=="],
"diff": ["diff@8.0.2", "", {}, "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg=="],
- "diff-dom-streaming": ["diff-dom-streaming@0.6.5", "", {}, "sha512-S6a7AVm5S0cwOkIYLTg+ilPaCnHM4/QoPol11PLYRKYqud/MfW+wW54+K2zBFqNY3DoNZZXO8yaF3iwFeJkz+A=="],
-
"dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="],
"domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="],
@@ -632,19 +583,19 @@
"domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="],
- "dotenv": ["dotenv@17.2.2", "", {}, "sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q=="],
+ "dotenv": ["dotenv@17.2.3", "", {}, "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w=="],
- "drizzle-kit": ["drizzle-kit@0.31.4", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.4", "esbuild-register": "^3.5.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-tCPWVZWZqWVx2XUsVpJRnH9Mx0ClVOf5YUHerZ5so1OKSlqww4zy1R5ksEdGRcO3tM3zj0PYN6V48TbQCL1RfA=="],
+ "drizzle-kit": ["drizzle-kit@0.31.7", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.4", "esbuild-register": "^3.5.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-hOzRGSdyKIU4FcTSFYGKdXEjFsncVwHZ43gY3WU5Bz9j5Iadp6Rh6hxLSQ1IWXpKLBKt/d5y1cpSPcV+FcoQ1A=="],
- "drizzle-orm": ["drizzle-orm@0.44.5", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-jBe37K7d8ZSKptdKfakQFdeljtu3P2Cbo7tJoJSVZADzIKOBo9IAJPOmMsH2bZl90bZgh8FQlD8BjxXA/zuBkQ=="],
+ "drizzle-orm": ["drizzle-orm@0.44.7", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ=="],
- "dts-resolver": ["dts-resolver@2.1.2", "", { "peerDependencies": { "oxc-resolver": ">=11.0.0" }, "optionalPeers": ["oxc-resolver"] }, "sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg=="],
+ "dts-resolver": ["dts-resolver@2.1.3", "", { "peerDependencies": { "oxc-resolver": ">=11.0.0" }, "optionalPeers": ["oxc-resolver"] }, "sha512-bihc7jPC90VrosXNzK0LTE2cuLP6jr0Ro8jk+kMugHReJVLIpHz/xadeq3MhuwyO4TD4OA3L1Q8pBBFRc08Tsw=="],
"eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="],
"ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="],
- "eciesjs": ["eciesjs@0.4.15", "", { "dependencies": { "@ecies/ciphers": "^0.2.3", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.1", "@noble/hashes": "^1.8.0" } }, "sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA=="],
+ "eciesjs": ["eciesjs@0.4.16", "", { "dependencies": { "@ecies/ciphers": "^0.2.4", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.7", "@noble/hashes": "^1.8.0" } }, "sha512-dS5cbA9rA2VR4Ybuvhg6jvdmp46ubLn3E+px8cG/35aEDNclrqoCjg6mt0HYZ/M+OoESS3jSkCrqk1kWAEhWAw=="],
"elliptic": ["elliptic@6.6.1", "", { "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g=="],
@@ -654,55 +605,89 @@
"enabled": ["enabled@2.0.0", "", {}, "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="],
- "enhanced-resolve": ["enhanced-resolve@5.18.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww=="],
-
"entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
- "env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="],
-
"es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="],
- "esbuild": ["esbuild@0.25.9", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.9", "@esbuild/android-arm": "0.25.9", "@esbuild/android-arm64": "0.25.9", "@esbuild/android-x64": "0.25.9", "@esbuild/darwin-arm64": "0.25.9", "@esbuild/darwin-x64": "0.25.9", "@esbuild/freebsd-arm64": "0.25.9", "@esbuild/freebsd-x64": "0.25.9", "@esbuild/linux-arm": "0.25.9", "@esbuild/linux-arm64": "0.25.9", "@esbuild/linux-ia32": "0.25.9", "@esbuild/linux-loong64": "0.25.9", "@esbuild/linux-mips64el": "0.25.9", "@esbuild/linux-ppc64": "0.25.9", "@esbuild/linux-riscv64": "0.25.9", "@esbuild/linux-s390x": "0.25.9", "@esbuild/linux-x64": "0.25.9", "@esbuild/netbsd-arm64": "0.25.9", "@esbuild/netbsd-x64": "0.25.9", "@esbuild/openbsd-arm64": "0.25.9", "@esbuild/openbsd-x64": "0.25.9", "@esbuild/openharmony-arm64": "0.25.9", "@esbuild/sunos-x64": "0.25.9", "@esbuild/win32-arm64": "0.25.9", "@esbuild/win32-ia32": "0.25.9", "@esbuild/win32-x64": "0.25.9" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g=="],
+ "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="],
"esbuild-register": ["esbuild-register@3.6.0", "", { "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { "esbuild": ">=0.12 <1" } }, "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg=="],
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
+ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
+
+ "eslint": ["eslint@9.39.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.1", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g=="],
+
+ "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="],
+
+ "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="],
+
+ "esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="],
+
+ "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="],
+
+ "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="],
+
+ "esrap": ["esrap@2.1.2", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-DgvlIQeowRNyvLPWW4PT7Gu13WznY288Du086E751mwwbsgr29ytBiYeLzAGIo0qk3Ujob0SDk8TiSaM5WQzNg=="],
+
+ "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
+
+ "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
+
"estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="],
+ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
+
"execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="],
"expect-type": ["expect-type@1.2.2", "", {}, "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA=="],
- "exsolve": ["exsolve@1.0.7", "", {}, "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw=="],
+ "exsolve": ["exsolve@1.0.8", "", {}, "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="],
+
+ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
+
+ "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
+
+ "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
"fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
"fecha": ["fecha@4.2.3", "", {}, "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="],
+ "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
+
+ "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
+
+ "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
+
+ "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="],
+
"fn.name": ["fn.name@1.1.0", "", {}, "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="],
"foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
"fp-booleans": ["fp-booleans@0.5.2", "", {}, "sha512-H5FFrtD2zNKL1if70v6duGyOYlTS1XqhZANsVk90wrTn8M/LXk4pFRnEQN3MGfzfCXUmEU/ofUGku5wSXkbtfA=="],
- "fp-filters": ["fp-filters@0.5.4", "", { "dependencies": { "fp-booleans": "0.5.2" } }, "sha512-jwrnD0wTOe6OPc757jI/kR6s5gJi45OqnSeQp1SnAlUZTDpJCn/T6IXfPn0xmbaHc2utkMFI8QQ/TVc4TYMirw=="],
+ "fp-filters": ["fp-filters@0.5.5", "", { "dependencies": { "fp-booleans": "0.5.2" } }, "sha512-QuB1+Kdd8fojeprAUuml1gP5StD809R6emIEvgd70E1+APJxlZ6WlGXndlSHSVpqZmFFMnizzuVUd+hKBsK0oA=="],
- "fs-monkey": ["fs-monkey@1.1.0", "", {}, "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw=="],
+ "freight-web": ["freight-web@workspace:packages/freight-web"],
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
- "gel": ["gel@2.1.1", "", { "dependencies": { "@petamoriken/float16": "^3.8.7", "debug": "^4.3.4", "env-paths": "^3.0.0", "semver": "^7.6.2", "shell-quote": "^1.8.1", "which": "^4.0.0" }, "bin": { "gel": "dist/cli.mjs" } }, "sha512-Newg9X7mRYskoBjSw70l1YnJ/ZGbq64VPyR821H5WVkTGpHG2O0mQILxCeUhxdYERLFY9B4tUyKLyf3uMTjtKw=="],
-
"get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
- "get-tsconfig": ["get-tsconfig@4.10.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ=="],
+ "get-tsconfig": ["get-tsconfig@4.13.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="],
"giget": ["giget@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="],
"glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="],
- "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
+ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
+
+ "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
+
+ "globrex": ["globrex@0.1.2", "", {}, "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="],
"has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
@@ -722,12 +707,20 @@
"ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
+ "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
+
+ "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
+
"inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
- "is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="],
+ "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
"is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
+ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
+
+ "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="],
+
"is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
"isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="],
@@ -742,12 +735,20 @@
"jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
- "jiti": ["jiti@2.5.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w=="],
+ "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
"js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="],
+ "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+
"jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
+ "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
+
+ "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
+
+ "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
+
"json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
"jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="],
@@ -762,29 +763,13 @@
"jwt-decode": ["jwt-decode@4.0.0", "", {}, "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA=="],
+ "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
+
"kuler": ["kuler@2.0.0", "", {}, "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="],
- "lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="],
+ "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
- "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="],
-
- "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA=="],
-
- "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig=="],
-
- "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.1", "", { "os": "linux", "cpu": "arm" }, "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q=="],
-
- "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw=="],
-
- "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ=="],
-
- "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw=="],
-
- "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ=="],
-
- "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA=="],
-
- "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="],
+ "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
"lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="],
@@ -800,6 +785,8 @@
"lodash.isstring": ["lodash.isstring@4.0.1", "", {}, "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="],
+ "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
+
"lodash.once": ["lodash.once@4.1.1", "", {}, "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="],
"logform": ["logform@2.7.0", "", { "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", "fecha": "^4.2.0", "ms": "^2.1.1", "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" } }, "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ=="],
@@ -808,47 +795,45 @@
"lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
+ "lucide-ripple": ["lucide-ripple@0.0.6", "", { "peerDependencies": { "ripple": ">=0.2.0" } }, "sha512-jZ+m71SmoJ0TMExInMJ1BpFL3Yi61td+o0HglvsmQbGFXnesp0V/EGgJA/THbbujhIJ+NbLl2qr8rKVhrsuwhQ=="],
+
"luxon": ["luxon@3.7.2", "", {}, "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew=="],
- "magic-string": ["magic-string@0.30.18", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ=="],
+ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
"magicast": ["magicast@0.3.5", "", { "dependencies": { "@babel/parser": "^7.25.4", "@babel/types": "^7.25.4", "source-map-js": "^1.2.0" } }, "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ=="],
"make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="],
- "memfs": ["memfs@3.5.3", "", { "dependencies": { "fs-monkey": "^1.0.4" } }, "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw=="],
-
- "memfs-browser": ["memfs-browser@3.5.10302", "", { "dependencies": { "memfs": "3.5.3" } }, "sha512-JJTc/nh3ig05O0gBBGZjTCPOyydaTxNF0uHYBrcc1gHNnO+KIHIvo0Y1FKCJsaei6FCl8C6xfQomXqu+cuzkIw=="],
-
"merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
- "meriyah": ["meriyah@6.0.5", "", {}, "sha512-SrMqQCox7TTwtftWKHy/ZaVe+ZRpRl20pAgDo+PS9hzcAJrMjYsBJQPPiLXTnjztrqdfGS+Zz99r6Bwvydta1w=="],
-
"mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
"minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="],
"minimalistic-crypto-utils": ["minimalistic-crypto-utils@1.0.1", "", {}, "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="],
- "minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+ "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
"minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
- "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="],
-
"mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="],
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+ "muggle-string": ["muggle-string@0.4.1", "", {}, "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="],
+
"nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
+ "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
+
"node-cache": ["node-cache@5.1.2", "", { "dependencies": { "clone": "2.x" } }, "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg=="],
"node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="],
"npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="],
- "nypm": ["nypm@0.6.1", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.2", "pathe": "^2.0.3", "pkg-types": "^2.2.0", "tinyexec": "^1.0.1" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-hlacBiRiv1k9hZFiphPUkfSQ/ZfQzZDzC+8z0wL3lvDAOUu/2NnChkKuMoMjNur/9OpKuz2QsIeiPVN0xM5Q0w=="],
+ "nypm": ["nypm@0.6.2", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.2", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "tinyexec": "^1.0.1" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g=="],
"object-treeify": ["object-treeify@1.1.33", "", {}, "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A=="],
@@ -858,13 +843,23 @@
"onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
+ "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
+
"opusscript": ["opusscript@0.1.1", "", {}, "sha512-mL0fZZOUnXdZ78woRXp18lApwpp0lF5tozJOD1Wut0dgrA9WuQTgSels/CSmFleaAZrJi/nci5KOVtbuxeWoQA=="],
- "oslo": ["oslo@1.2.1", "", { "dependencies": { "@node-rs/argon2": "1.7.0", "@node-rs/bcrypt": "1.9.0" } }, "sha512-HfIhB5ruTdQv0XX2XlncWQiJ5SIHZ7NHZhVyHth0CSZ/xzge00etRyYy/3wp/Dsu+PkxMC+6+B2lS/GcKoewkA=="],
+ "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
+
+ "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
"package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
- "package-manager-detector": ["package-manager-detector@1.3.0", "", {}, "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ=="],
+ "package-manager-detector": ["package-manager-detector@1.5.0", "", {}, "sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw=="],
+
+ "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
+
+ "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
+
+ "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
@@ -874,7 +869,7 @@
"pathval": ["pathval@2.0.1", "", {}, "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ=="],
- "perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="],
+ "perfect-debounce": ["perfect-debounce@2.0.0", "", {}, "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow=="],
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
@@ -884,12 +879,16 @@
"postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
+ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
+
"prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="],
"prettier-plugin-multiline-arrays": ["prettier-plugin-multiline-arrays@4.0.3", "", { "dependencies": { "@augment-vir/common": "^31.10.1", "proxy-vir": "^2.0.1" }, "peerDependencies": { "prettier": ">=3.0.0" } }, "sha512-H1f/0zbvlO/FR0Fmyl31sSBodsIZkuQF0Omi9BrptLU31rZ+Almt9BbrE8IS3BFT/DGKePKb55XqN660LTnmsQ=="],
"proxy-vir": ["proxy-vir@2.0.1", "", { "dependencies": { "@augment-vir/assert": "^31.1.0", "@augment-vir/common": "^31.1.0" } }, "sha512-hjy5mWzHZhgRGh0f90f0Bz3VrGUe0T+AlhwnETakzRdvaN9RtPYLQG1+ZuEzSDK95FAhPYd26nEi1xVrXqvBwg=="],
+ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
+
"quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="],
"rc9": ["rc9@2.1.2", "", { "dependencies": { "defu": "^6.1.4", "destr": "^2.0.3" } }, "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg=="],
@@ -898,13 +897,17 @@
"readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
+ "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
+
"resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
+ "ripple": ["ripple@0.2.175", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5", "@sveltejs/acorn-typescript": "^1.0.6", "acorn": "^8.15.0", "clsx": "^2.1.1", "devalue": "^5.3.2", "esm-env": "^1.2.2", "esrap": "^2.1.0", "is-reference": "^3.0.3", "magic-string": "^0.30.18", "muggle-string": "^0.4.1", "zimmerframe": "^1.1.2" }, "peerDependencies": { "ripple": "0.2.175" } }, "sha512-ebNSIKl32hC7JDwtZH4gOP+ykzy9U8wCGIhCatZG8qiMnk410pZdrjVqmNr/L73ftfd4LmV1OyJIo1whNJveIw=="],
+
"rolldown": ["rolldown@1.0.0-beta.9", "", { "dependencies": { "@oxc-project/types": "0.70.0", "@rolldown/pluginutils": "1.0.0-beta.9", "ansis": "^4.0.0" }, "optionalDependencies": { "@rolldown/binding-darwin-arm64": "1.0.0-beta.9", "@rolldown/binding-darwin-x64": "1.0.0-beta.9", "@rolldown/binding-freebsd-x64": "1.0.0-beta.9", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.9", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.9", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.9", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.9", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.9", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.9", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.9", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.9", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.9" }, "peerDependencies": { "@oxc-project/runtime": "0.70.0" }, "optionalPeers": ["@oxc-project/runtime"], "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-ZgZky52n6iF0UainGKjptKGrOG4Con2S5sdc4C4y2Oj25D5PHAY8Y8E5f3M2TSd/zlhQs574JlMeTe3vREczSg=="],
"rolldown-plugin-dts": ["rolldown-plugin-dts@0.13.14", "", { "dependencies": { "@babel/generator": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/types": "^7.28.1", "ast-kit": "^2.1.1", "birpc": "^2.5.0", "debug": "^4.4.1", "dts-resolver": "^2.1.1", "get-tsconfig": "^4.10.1" }, "peerDependencies": { "@typescript/native-preview": ">=7.0.0-dev.20250601.1", "rolldown": "^1.0.0-beta.9", "typescript": "^5.0.0", "vue-tsc": "^2.2.0 || ^3.0.0" }, "optionalPeers": ["@typescript/native-preview", "typescript", "vue-tsc"] }, "sha512-wjNhHZz9dlN6PTIXyizB6u/mAg1wEFMW9yw7imEVe3CxHSRnNHVyycIX0yDEOVJfDNISLPbkCIPEpFpizy5+PQ=="],
- "rollup": ["rollup@4.50.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.50.1", "@rollup/rollup-android-arm64": "4.50.1", "@rollup/rollup-darwin-arm64": "4.50.1", "@rollup/rollup-darwin-x64": "4.50.1", "@rollup/rollup-freebsd-arm64": "4.50.1", "@rollup/rollup-freebsd-x64": "4.50.1", "@rollup/rollup-linux-arm-gnueabihf": "4.50.1", "@rollup/rollup-linux-arm-musleabihf": "4.50.1", "@rollup/rollup-linux-arm64-gnu": "4.50.1", "@rollup/rollup-linux-arm64-musl": "4.50.1", "@rollup/rollup-linux-loongarch64-gnu": "4.50.1", "@rollup/rollup-linux-ppc64-gnu": "4.50.1", "@rollup/rollup-linux-riscv64-gnu": "4.50.1", "@rollup/rollup-linux-riscv64-musl": "4.50.1", "@rollup/rollup-linux-s390x-gnu": "4.50.1", "@rollup/rollup-linux-x64-gnu": "4.50.1", "@rollup/rollup-linux-x64-musl": "4.50.1", "@rollup/rollup-openharmony-arm64": "4.50.1", "@rollup/rollup-win32-arm64-msvc": "4.50.1", "@rollup/rollup-win32-ia32-msvc": "4.50.1", "@rollup/rollup-win32-x64-msvc": "4.50.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA=="],
+ "rollup": ["rollup@4.53.2", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.53.2", "@rollup/rollup-android-arm64": "4.53.2", "@rollup/rollup-darwin-arm64": "4.53.2", "@rollup/rollup-darwin-x64": "4.53.2", "@rollup/rollup-freebsd-arm64": "4.53.2", "@rollup/rollup-freebsd-x64": "4.53.2", "@rollup/rollup-linux-arm-gnueabihf": "4.53.2", "@rollup/rollup-linux-arm-musleabihf": "4.53.2", "@rollup/rollup-linux-arm64-gnu": "4.53.2", "@rollup/rollup-linux-arm64-musl": "4.53.2", "@rollup/rollup-linux-loong64-gnu": "4.53.2", "@rollup/rollup-linux-ppc64-gnu": "4.53.2", "@rollup/rollup-linux-riscv64-gnu": "4.53.2", "@rollup/rollup-linux-riscv64-musl": "4.53.2", "@rollup/rollup-linux-s390x-gnu": "4.53.2", "@rollup/rollup-linux-x64-gnu": "4.53.2", "@rollup/rollup-linux-x64-musl": "4.53.2", "@rollup/rollup-openharmony-arm64": "4.53.2", "@rollup/rollup-win32-arm64-msvc": "4.53.2", "@rollup/rollup-win32-ia32-msvc": "4.53.2", "@rollup/rollup-win32-x64-gnu": "4.53.2", "@rollup/rollup-win32-x64-msvc": "4.53.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g=="],
"safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
@@ -912,20 +915,16 @@
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
- "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
+ "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
"shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
- "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="],
-
"siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="],
"signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
- "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="],
-
"source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
@@ -938,7 +937,7 @@
"star-kitten": ["star-kitten@workspace:packages/eve-bot"],
- "std-env": ["std-env@3.9.0", "", {}, "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw=="],
+ "std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="],
"stream-chain": ["stream-chain@3.4.0", "", {}, "sha512-cyDiaDqAfgmeiv0PWFXCg9oKNVYNzYxHK9j5CMsYMHZDk+/yYcSV+CXQZliZ0U4mNU8DLqiVNZXUfs8BqhgwMw=="],
@@ -950,21 +949,19 @@
"string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="],
- "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
+ "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
"strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
"strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="],
- "strip-literal": ["strip-literal@3.0.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA=="],
+ "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
+
+ "strip-literal": ["strip-literal@3.1.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg=="],
"supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
- "tailwindcss": ["tailwindcss@4.1.13", "", {}, "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w=="],
-
- "tapable": ["tapable@2.2.3", "", {}, "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg=="],
-
- "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="],
+ "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="],
"test-exclude": ["test-exclude@7.0.1", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^10.4.1", "minimatch": "^9.0.4" } }, "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg=="],
@@ -972,7 +969,7 @@
"tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="],
- "tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="],
+ "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="],
"tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
@@ -980,89 +977,91 @@
"tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="],
- "tinyspy": ["tinyspy@4.0.3", "", {}, "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A=="],
+ "tinyspy": ["tinyspy@4.0.4", "", {}, "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q=="],
"tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="],
"triple-beam": ["triple-beam@1.4.1", "", {}, "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg=="],
+ "tsconfck": ["tsconfck@3.1.6", "", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="],
+
"tsdown": ["tsdown@0.11.13", "", { "dependencies": { "ansis": "^4.0.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "debug": "^4.4.1", "diff": "^8.0.1", "empathic": "^1.1.0", "hookable": "^5.5.3", "rolldown": "1.0.0-beta.9", "rolldown-plugin-dts": "^0.13.3", "semver": "^7.7.2", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.13", "unconfig": "^7.3.2" }, "peerDependencies": { "publint": "^0.3.0", "typescript": "^5.0.0", "unplugin-lightningcss": "^0.4.0", "unplugin-unused": "^0.5.0" }, "optionalPeers": ["publint", "typescript", "unplugin-lightningcss", "unplugin-unused"], "bin": { "tsdown": "dist/run.js" } }, "sha512-VSfoNm8MJXFdg7PJ4p2javgjMRiQQHpkP9N3iBBTrmCixcT6YZ9ZtqYMW3NDHczqR0C0Qnur1HMQr1ZfZcmrng=="],
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
- "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
+ "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
+
+ "type-fest": ["type-fest@5.2.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA=="],
"typed-event-target": ["typed-event-target@4.1.0", "", { "dependencies": { "@augment-vir/assert": "^31.19.1", "@augment-vir/common": "^31.19.1", "@augment-vir/core": "^31.19.1" } }, "sha512-fDFhZb7ofywLsVv8mYePD6ONfCpVHyM1t2dboEJx/XMsnflljnu3GQ5qH09hS1USuypGMR7wRbdWQPydgJ8nGQ=="],
- "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="],
+ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
- "unconfig": ["unconfig@7.3.3", "", { "dependencies": { "@quansync/fs": "^0.1.5", "defu": "^6.1.4", "jiti": "^2.5.1", "quansync": "^0.2.11" } }, "sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA=="],
+ "unconfig": ["unconfig@7.4.1", "", { "dependencies": { "@quansync/fs": "^0.1.5", "defu": "^6.1.4", "jiti": "^2.6.1", "quansync": "^0.2.11", "unconfig-core": "7.4.1" } }, "sha512-uyQ7LElcGizrOGZyIq9KU+xkuEjcRf9IpmDTkCSYv5mEeZzrXSj6rb51C0L+WTedsmAoVxW9WKrLWhSwebIM9Q=="],
+
+ "unconfig-core": ["unconfig-core@7.4.1", "", { "dependencies": { "@quansync/fs": "^0.1.5", "quansync": "^0.2.11" } }, "sha512-Bp/bPZjV2Vl/fofoA2OYLSnw1Z0MOhCX7zHnVCYrazpfZvseBbGhwcNQMxsg185Mqh7VZQqK3C8hFG/Dyng+yA=="],
"undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+ "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
+
"util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
- "vite": ["vite@7.1.4", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.14" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw=="],
+ "vite": ["vite@7.2.2", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ=="],
"vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="],
+ "vite-tsconfig-paths": ["vite-tsconfig-paths@5.1.4", "", { "dependencies": { "debug": "^4.1.1", "globrex": "^0.1.2", "tsconfck": "^3.0.3" }, "peerDependencies": { "vite": "*" }, "optionalPeers": ["vite"] }, "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w=="],
+
"vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.4", "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="],
+ "vscode-uri": ["vscode-uri@3.1.0", "", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="],
+
"which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="],
"why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="],
- "winston": ["winston@3.17.0", "", { "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", "logform": "^2.7.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", "winston-transport": "^4.9.0" } }, "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw=="],
+ "winston": ["winston@3.18.3", "", { "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", "async": "^3.2.3", "is-stream": "^2.0.0", "logform": "^2.7.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", "winston-transport": "^4.9.0" } }, "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww=="],
"winston-transport": ["winston-transport@4.9.0", "", { "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" } }, "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A=="],
+ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
+
"wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],
"wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
"ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="],
- "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="],
-
"yaml": ["yaml@2.8.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw=="],
+ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
+
+ "zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="],
+
"@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="],
- "@napi-rs/wasm-runtime/@emnapi/core": ["@emnapi/core@1.5.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg=="],
+ "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
- "@napi-rs/wasm-runtime/@emnapi/runtime": ["@emnapi/runtime@1.5.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="],
-
- "@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="],
+ "@snazzah/davey-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.7", "", { "dependencies": { "@emnapi/core": "^1.5.0", "@emnapi/runtime": "^1.5.0", "@tybys/wasm-util": "^0.10.1" } }, "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw=="],
"@star-kitten/eve/tsdown": ["tsdown@0.14.2", "", { "dependencies": { "ansis": "^4.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "debug": "^4.4.1", "diff": "^8.0.2", "empathic": "^2.0.0", "hookable": "^5.5.3", "rolldown": "latest", "rolldown-plugin-dts": "^0.15.8", "semver": "^7.7.2", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.14", "tree-kill": "^1.2.2", "unconfig": "^7.3.3" }, "peerDependencies": { "@arethetypeswrong/core": "^0.18.1", "publint": "^0.3.0", "typescript": "^5.0.0", "unplugin-lightningcss": "^0.4.0", "unplugin-unused": "^0.5.0" }, "optionalPeers": ["@arethetypeswrong/core", "publint", "typescript", "unplugin-lightningcss", "unplugin-unused"], "bin": { "tsdown": "dist/run.mjs" } }, "sha512-6ThtxVZoTlR5YJov5rYvH8N1+/S/rD/pGfehdCLGznGgbxz+73EASV1tsIIZkLw2n+SXcERqHhcB/OkyxdKv3A=="],
- "@star-kitten/eve-web/drizzle-kit": ["drizzle-kit@0.30.6", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.19.7", "esbuild-register": "^3.5.0", "gel": "^2.0.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-U4wWit0fyZuGuP7iNmRleQyK2V8wCuv57vf5l3MnG4z4fzNTjY/U13M8owyQ5RavqvqxBifWORaR3wIUzlN64g=="],
-
- "@star-kitten/eve-web/drizzle-orm": ["drizzle-orm@0.40.1", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-aPNhtiJiPfm3qxz1czrnIDkfvkSdKGXYeZkpG55NPTVI186LmK2fBLMi4dsHpPHlJrZeQ92D322YFPHADBALew=="],
-
"@star-kitten/util/tsdown": ["tsdown@0.14.2", "", { "dependencies": { "ansis": "^4.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "debug": "^4.4.1", "diff": "^8.0.2", "empathic": "^2.0.0", "hookable": "^5.5.3", "rolldown": "latest", "rolldown-plugin-dts": "^0.15.8", "semver": "^7.7.2", "tinyexec": "^1.0.1", "tinyglobby": "^0.2.14", "tree-kill": "^1.2.2", "unconfig": "^7.3.3" }, "peerDependencies": { "@arethetypeswrong/core": "^0.18.1", "publint": "^0.3.0", "typescript": "^5.0.0", "unplugin-lightningcss": "^0.4.0", "unplugin-unused": "^0.5.0" }, "optionalPeers": ["@arethetypeswrong/core", "publint", "typescript", "unplugin-lightningcss", "unplugin-unused"], "bin": { "tsdown": "dist/run.mjs" } }, "sha512-6ThtxVZoTlR5YJov5rYvH8N1+/S/rD/pGfehdCLGznGgbxz+73EASV1tsIIZkLw2n+SXcERqHhcB/OkyxdKv3A=="],
- "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.5.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg=="],
+ "@types/jsonwebtoken/@types/node": ["@types/node@24.10.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ=="],
- "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.5.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="],
+ "@types/stream-chain/@types/node": ["@types/node@24.10.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ=="],
- "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="],
+ "@types/stream-json/@types/node": ["@types/node@24.10.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ=="],
- "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" }, "bundled": true }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="],
+ "bun-types/@types/node": ["@types/node@24.10.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ=="],
- "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="],
+ "chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
- "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+ "color/color-convert": ["color-convert@3.1.3", "", { "dependencies": { "color-name": "^2.0.0" } }, "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg=="],
- "@types/jsonwebtoken/@types/node": ["@types/node@24.3.1", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g=="],
-
- "@types/stream-chain/@types/node": ["@types/node@24.3.1", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g=="],
-
- "@types/stream-json/@types/node": ["@types/node@24.3.1", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g=="],
-
- "bun-types/@types/node": ["@types/node@24.3.1", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g=="],
-
- "color-string/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
+ "color-string/color-name": ["color-name@2.1.0", "", {}, "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="],
"cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
@@ -1070,9 +1069,9 @@
"foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
- "star-kitten/@projectdysnomia/dysnomia": ["@projectdysnomia/dysnomia@github:projectdysnomia/dysnomia#fc8b561", { "dependencies": { "ws": "^8.18.0" }, "optionalDependencies": { "@snazzah/davey": "^0.1.6", "@stablelib/xchacha20poly1305": "~1.0.1", "opusscript": "^0.1.1" }, "peerDependencies": { "@discordjs/opus": "^0.9.0", "erlpack": "github:discord/erlpack", "eventemitter3": "^5.0.1", "pako": "^2.1.0", "sodium-native": "^4.1.1", "zlib-sync": "^0.1.9" }, "optionalPeers": ["@discordjs/opus", "erlpack", "eventemitter3", "pako", "sodium-native", "zlib-sync"] }, "projectdysnomia-dysnomia-fc8b561"],
+ "glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
- "star-kitten/@types/node": ["@types/node@24.3.1", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g=="],
+ "star-kitten/@types/node": ["@types/node@24.10.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ=="],
"stream-json/stream-chain": ["stream-chain@2.2.5", "", {}, "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA=="],
@@ -1082,6 +1081,8 @@
"strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+ "test-exclude/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+
"vitest/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
"wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
@@ -1134,158 +1135,100 @@
"@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild": ["esbuild@0.19.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.19.12", "@esbuild/android-arm": "0.19.12", "@esbuild/android-arm64": "0.19.12", "@esbuild/android-x64": "0.19.12", "@esbuild/darwin-arm64": "0.19.12", "@esbuild/darwin-x64": "0.19.12", "@esbuild/freebsd-arm64": "0.19.12", "@esbuild/freebsd-x64": "0.19.12", "@esbuild/linux-arm": "0.19.12", "@esbuild/linux-arm64": "0.19.12", "@esbuild/linux-ia32": "0.19.12", "@esbuild/linux-loong64": "0.19.12", "@esbuild/linux-mips64el": "0.19.12", "@esbuild/linux-ppc64": "0.19.12", "@esbuild/linux-riscv64": "0.19.12", "@esbuild/linux-s390x": "0.19.12", "@esbuild/linux-x64": "0.19.12", "@esbuild/netbsd-x64": "0.19.12", "@esbuild/openbsd-x64": "0.19.12", "@esbuild/sunos-x64": "0.19.12", "@esbuild/win32-arm64": "0.19.12", "@esbuild/win32-ia32": "0.19.12", "@esbuild/win32-x64": "0.19.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg=="],
-
"@star-kitten/eve/tsdown/empathic": ["empathic@2.0.0", "", {}, "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA=="],
- "@star-kitten/eve/tsdown/rolldown": ["rolldown@1.0.0-beta.35", "", { "dependencies": { "@oxc-project/runtime": "=0.82.3", "@oxc-project/types": "=0.82.3", "@rolldown/pluginutils": "1.0.0-beta.35", "ansis": "^4.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.35", "@rolldown/binding-darwin-arm64": "1.0.0-beta.35", "@rolldown/binding-darwin-x64": "1.0.0-beta.35", "@rolldown/binding-freebsd-x64": "1.0.0-beta.35", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.35", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.35", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.35", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.35", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.35", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.35", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.35", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.35", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.35", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.35" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-gJATyqcsJe0Cs8RMFO8XgFjfTc0lK1jcSvirDQDSIfsJE+vt53QH/Ob+OBSJsXb98YtZXHfP/bHpELpPwCprow=="],
+ "@star-kitten/eve/tsdown/rolldown": ["rolldown@1.0.0-beta.50", "", { "dependencies": { "@oxc-project/types": "=0.97.0", "@rolldown/pluginutils": "1.0.0-beta.50" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.50", "@rolldown/binding-darwin-arm64": "1.0.0-beta.50", "@rolldown/binding-darwin-x64": "1.0.0-beta.50", "@rolldown/binding-freebsd-x64": "1.0.0-beta.50", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.50", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.50", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.50", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.50", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.50", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.50", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.50", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.50", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.50", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.50" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-JFULvCNl/anKn99eKjOSEubi0lLmNqQDAjyEMME2T4CwezUDL0i6t1O9xZsu2OMehPnV2caNefWpGF+8TnzB6A=="],
"@star-kitten/eve/tsdown/rolldown-plugin-dts": ["rolldown-plugin-dts@0.15.10", "", { "dependencies": { "@babel/generator": "^7.28.3", "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "ast-kit": "^2.1.2", "birpc": "^2.5.0", "debug": "^4.4.1", "dts-resolver": "^2.1.2", "get-tsconfig": "^4.10.1" }, "peerDependencies": { "@typescript/native-preview": ">=7.0.0-dev.20250601.1", "rolldown": "^1.0.0-beta.9", "typescript": "^5.0.0", "vue-tsc": "~3.0.3" }, "optionalPeers": ["@typescript/native-preview", "typescript", "vue-tsc"] }, "sha512-8cPVAVQUo9tYAoEpc3jFV9RxSil13hrRRg8cHC9gLXxRMNtWPc1LNMSDXzjyD+5Vny49sDZH77JlXp/vlc4I3g=="],
"@star-kitten/util/tsdown/empathic": ["empathic@2.0.0", "", {}, "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA=="],
- "@star-kitten/util/tsdown/rolldown": ["rolldown@1.0.0-beta.35", "", { "dependencies": { "@oxc-project/runtime": "=0.82.3", "@oxc-project/types": "=0.82.3", "@rolldown/pluginutils": "1.0.0-beta.35", "ansis": "^4.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.35", "@rolldown/binding-darwin-arm64": "1.0.0-beta.35", "@rolldown/binding-darwin-x64": "1.0.0-beta.35", "@rolldown/binding-freebsd-x64": "1.0.0-beta.35", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.35", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.35", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.35", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.35", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.35", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.35", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.35", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.35", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.35", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.35" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-gJATyqcsJe0Cs8RMFO8XgFjfTc0lK1jcSvirDQDSIfsJE+vt53QH/Ob+OBSJsXb98YtZXHfP/bHpELpPwCprow=="],
+ "@star-kitten/util/tsdown/rolldown": ["rolldown@1.0.0-beta.50", "", { "dependencies": { "@oxc-project/types": "=0.97.0", "@rolldown/pluginutils": "1.0.0-beta.50" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.50", "@rolldown/binding-darwin-arm64": "1.0.0-beta.50", "@rolldown/binding-darwin-x64": "1.0.0-beta.50", "@rolldown/binding-freebsd-x64": "1.0.0-beta.50", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.50", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.50", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.50", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.50", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.50", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.50", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.50", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.50", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.50", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.50" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-JFULvCNl/anKn99eKjOSEubi0lLmNqQDAjyEMME2T4CwezUDL0i6t1O9xZsu2OMehPnV2caNefWpGF+8TnzB6A=="],
"@star-kitten/util/tsdown/rolldown-plugin-dts": ["rolldown-plugin-dts@0.15.10", "", { "dependencies": { "@babel/generator": "^7.28.3", "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "ast-kit": "^2.1.2", "birpc": "^2.5.0", "debug": "^4.4.1", "dts-resolver": "^2.1.2", "get-tsconfig": "^4.10.1" }, "peerDependencies": { "@typescript/native-preview": ">=7.0.0-dev.20250601.1", "rolldown": "^1.0.0-beta.9", "typescript": "^5.0.0", "vue-tsc": "~3.0.3" }, "optionalPeers": ["@typescript/native-preview", "typescript", "vue-tsc"] }, "sha512-8cPVAVQUo9tYAoEpc3jFV9RxSil13hrRRg8cHC9gLXxRMNtWPc1LNMSDXzjyD+5Vny49sDZH77JlXp/vlc4I3g=="],
- "@types/jsonwebtoken/@types/node/undici-types": ["undici-types@7.10.0", "", {}, "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag=="],
+ "@types/jsonwebtoken/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
- "@types/stream-chain/@types/node/undici-types": ["undici-types@7.10.0", "", {}, "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag=="],
+ "@types/stream-chain/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
- "@types/stream-json/@types/node/undici-types": ["undici-types@7.10.0", "", {}, "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag=="],
+ "@types/stream-json/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
- "bun-types/@types/node/undici-types": ["undici-types@7.10.0", "", {}, "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag=="],
+ "bun-types/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
+
+ "color/color-convert/color-name": ["color-name@2.1.0", "", {}, "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="],
"cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
- "star-kitten/@types/node/undici-types": ["undici-types@7.10.0", "", {}, "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag=="],
+ "glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
+
+ "star-kitten/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
"string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
- "wrap-ansi-cjs/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
+ "test-exclude/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
"wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
"wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.19.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA=="],
+ "@star-kitten/eve/tsdown/rolldown/@oxc-project/types": ["@oxc-project/types@0.97.0", "", {}, "sha512-lxmZK4xFrdvU0yZiDwgVQTCvh2gHWBJCBk5ALsrtsBWhs0uDIi+FTOnXRQeQfs304imdvTdaakT/lqwQ8hkOXQ=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.19.12", "", { "os": "android", "cpu": "arm" }, "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w=="],
+ "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.50", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+JRqKJhoFlt5r9q+DecAGPLZ5PxeLva+wCMtAuoFMWPoZzgcYrr599KQ+Ix0jwll4B4HGP43avu9My8KtSOR+w=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.19.12", "", { "os": "android", "cpu": "arm64" }, "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA=="],
+ "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.50", "", { "os": "darwin", "cpu": "x64" }, "sha512-fFXDjXnuX7/gQZQm/1FoivVtRcyAzdjSik7Eo+9iwPQ9EgtA5/nB2+jmbzaKtMGG3q+BnZbdKHCtOacmNrkIDA=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.19.12", "", { "os": "android", "cpu": "x64" }, "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew=="],
+ "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.50", "", { "os": "freebsd", "cpu": "x64" }, "sha512-F1b6vARy49tjmT/hbloplzgJS7GIvwWZqt+tAHEstCh0JIh9sa8FAMVqEmYxDviqKBaAI8iVvUREm/Kh/PD26Q=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.19.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g=="],
+ "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.50", "", { "os": "linux", "cpu": "arm" }, "sha512-U6cR76N8T8M6lHj7EZrQ3xunLPxSvYYxA8vJsBKZiFZkT8YV4kjgCO3KwMJL0NOjQCPGKyiXO07U+KmJzdPGRw=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.19.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A=="],
+ "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.50", "", { "os": "linux", "cpu": "arm64" }, "sha512-ONgyjofCrrE3bnh5GZb8EINSFyR/hmwTzZ7oVuyUB170lboza1VMCnb8jgE6MsyyRgHYmN8Lb59i3NKGrxrYjw=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.19.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA=="],
+ "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.50", "", { "os": "linux", "cpu": "arm64" }, "sha512-L0zRdH2oDPkmB+wvuTl+dJbXCsx62SkqcEqdM+79LOcB+PxbAxxjzHU14BuZIQdXcAVDzfpMfaHWzZuwhhBTcw=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.19.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg=="],
+ "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.50", "", { "os": "linux", "cpu": "x64" }, "sha512-gyoI8o/TGpQd3OzkJnh1M2kxy1Bisg8qJ5Gci0sXm9yLFzEXIFdtc4EAzepxGvrT2ri99ar5rdsmNG0zP0SbIg=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.19.12", "", { "os": "linux", "cpu": "arm" }, "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w=="],
+ "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.50", "", { "os": "linux", "cpu": "x64" }, "sha512-zti8A7M+xFDpKlghpcCAzyOi+e5nfUl3QhU023ce5NCgUxRG5zGP2GR9LTydQ1rnIPwZUVBWd4o7NjZDaQxaXA=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.19.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA=="],
+ "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.50", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.7" }, "cpu": "none" }, "sha512-nmCN0nIdeUnmgeDXiQ+2HU6FT162o+rxnF7WMkBm4M5Ds8qTU7Dzv2Wrf22bo4ftnlrb2hKK6FSwAJSAe2FWLg=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.19.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA=="],
+ "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.50", "", { "os": "win32", "cpu": "arm64" }, "sha512-7kcNLi7Ua59JTTLvbe1dYb028QEPaJPJQHqkmSZ5q3tJueUeb6yjRtx8mw4uIqgWZcnQHAR3PrLN4XRJxvgIkA=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA=="],
+ "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.50", "", { "os": "win32", "cpu": "ia32" }, "sha512-lL70VTNvSCdSZkDPPVMwWn/M2yQiYvSoXw9hTLgdIWdUfC3g72UaruezusR6ceRuwHCY1Ayu2LtKqXkBO5LIwg=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w=="],
+ "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.50", "", { "os": "win32", "cpu": "x64" }, "sha512-4qU4x5DXWB4JPjyTne/wBNPqkbQU8J45bl21geERBKtEittleonioACBL1R0PsBu0Aq21SwMK5a9zdBkWSlQtQ=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.19.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg=="],
+ "@star-kitten/eve/tsdown/rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.50", "", {}, "sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg=="],
+ "@star-kitten/util/tsdown/rolldown/@oxc-project/types": ["@oxc-project/types@0.97.0", "", {}, "sha512-lxmZK4xFrdvU0yZiDwgVQTCvh2gHWBJCBk5ALsrtsBWhs0uDIi+FTOnXRQeQfs304imdvTdaakT/lqwQ8hkOXQ=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.19.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg=="],
+ "@star-kitten/util/tsdown/rolldown/@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.50", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+JRqKJhoFlt5r9q+DecAGPLZ5PxeLva+wCMtAuoFMWPoZzgcYrr599KQ+Ix0jwll4B4HGP43avu9My8KtSOR+w=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.19.12", "", { "os": "linux", "cpu": "x64" }, "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg=="],
+ "@star-kitten/util/tsdown/rolldown/@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.50", "", { "os": "darwin", "cpu": "x64" }, "sha512-fFXDjXnuX7/gQZQm/1FoivVtRcyAzdjSik7Eo+9iwPQ9EgtA5/nB2+jmbzaKtMGG3q+BnZbdKHCtOacmNrkIDA=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.19.12", "", { "os": "none", "cpu": "x64" }, "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA=="],
+ "@star-kitten/util/tsdown/rolldown/@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.50", "", { "os": "freebsd", "cpu": "x64" }, "sha512-F1b6vARy49tjmT/hbloplzgJS7GIvwWZqt+tAHEstCh0JIh9sa8FAMVqEmYxDviqKBaAI8iVvUREm/Kh/PD26Q=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.19.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw=="],
+ "@star-kitten/util/tsdown/rolldown/@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.50", "", { "os": "linux", "cpu": "arm" }, "sha512-U6cR76N8T8M6lHj7EZrQ3xunLPxSvYYxA8vJsBKZiFZkT8YV4kjgCO3KwMJL0NOjQCPGKyiXO07U+KmJzdPGRw=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.19.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA=="],
+ "@star-kitten/util/tsdown/rolldown/@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.50", "", { "os": "linux", "cpu": "arm64" }, "sha512-ONgyjofCrrE3bnh5GZb8EINSFyR/hmwTzZ7oVuyUB170lboza1VMCnb8jgE6MsyyRgHYmN8Lb59i3NKGrxrYjw=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.19.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A=="],
+ "@star-kitten/util/tsdown/rolldown/@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.50", "", { "os": "linux", "cpu": "arm64" }, "sha512-L0zRdH2oDPkmB+wvuTl+dJbXCsx62SkqcEqdM+79LOcB+PxbAxxjzHU14BuZIQdXcAVDzfpMfaHWzZuwhhBTcw=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.19.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ=="],
+ "@star-kitten/util/tsdown/rolldown/@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.50", "", { "os": "linux", "cpu": "x64" }, "sha512-gyoI8o/TGpQd3OzkJnh1M2kxy1Bisg8qJ5Gci0sXm9yLFzEXIFdtc4EAzepxGvrT2ri99ar5rdsmNG0zP0SbIg=="],
- "@star-kitten/eve-web/drizzle-kit/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.19.12", "", { "os": "win32", "cpu": "x64" }, "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA=="],
+ "@star-kitten/util/tsdown/rolldown/@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.50", "", { "os": "linux", "cpu": "x64" }, "sha512-zti8A7M+xFDpKlghpcCAzyOi+e5nfUl3QhU023ce5NCgUxRG5zGP2GR9LTydQ1rnIPwZUVBWd4o7NjZDaQxaXA=="],
- "@star-kitten/eve/tsdown/rolldown/@oxc-project/types": ["@oxc-project/types@0.82.3", "", {}, "sha512-6nCUxBnGX0c6qfZW5MaF6/fmu5dHJDMiMPaioKHKs5mi5+8/FHQ7WGjgQIz1zxpmceMYfdIXkOaLYE+ejbuOtA=="],
+ "@star-kitten/util/tsdown/rolldown/@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.50", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.7" }, "cpu": "none" }, "sha512-nmCN0nIdeUnmgeDXiQ+2HU6FT162o+rxnF7WMkBm4M5Ds8qTU7Dzv2Wrf22bo4ftnlrb2hKK6FSwAJSAe2FWLg=="],
- "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.35", "", { "os": "darwin", "cpu": "arm64" }, "sha512-WPy0qx22CABTKDldEExfpYHWHulRoPo+m/YpyxP+6ODUPTQexWl8Wp12fn1CVP0xi0rOBj7ugs6+kKMAJW56wQ=="],
+ "@star-kitten/util/tsdown/rolldown/@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.50", "", { "os": "win32", "cpu": "arm64" }, "sha512-7kcNLi7Ua59JTTLvbe1dYb028QEPaJPJQHqkmSZ5q3tJueUeb6yjRtx8mw4uIqgWZcnQHAR3PrLN4XRJxvgIkA=="],
- "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.35", "", { "os": "darwin", "cpu": "x64" }, "sha512-3k1TabJafF/GgNubXMkfp93d5p30SfIMOmQ5gm1tFwO+baMxxVPwDs3FDvSl+feCWwXxBA+bzemgkaDlInmp1Q=="],
+ "@star-kitten/util/tsdown/rolldown/@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.50", "", { "os": "win32", "cpu": "ia32" }, "sha512-lL70VTNvSCdSZkDPPVMwWn/M2yQiYvSoXw9hTLgdIWdUfC3g72UaruezusR6ceRuwHCY1Ayu2LtKqXkBO5LIwg=="],
- "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.35", "", { "os": "freebsd", "cpu": "x64" }, "sha512-GAiapN5YyIocnBVNEiOxMfWO9NqIeEKKWohj1sPLGc61P+9N1meXOOCiAPbLU+adXq0grtbYySid+Or7f2q+Mg=="],
+ "@star-kitten/util/tsdown/rolldown/@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.50", "", { "os": "win32", "cpu": "x64" }, "sha512-4qU4x5DXWB4JPjyTne/wBNPqkbQU8J45bl21geERBKtEittleonioACBL1R0PsBu0Aq21SwMK5a9zdBkWSlQtQ=="],
- "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.35", "", { "os": "linux", "cpu": "arm" }, "sha512-okPKKIE73qkUMvq7dxDyzD0VIysdV4AirHqjf8tGTjuNoddUAl3WAtMYbuZCEKJwUyI67UINKO1peFVlYEb+8w=="],
+ "@star-kitten/util/tsdown/rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.50", "", {}, "sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA=="],
- "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.35", "", { "os": "linux", "cpu": "arm64" }, "sha512-Nky8Q2cxyKVkEETntrvcmlzNir5khQbDfX3PflHPbZY7XVZalllRqw7+MW5vn+jTsk5BfKVeLsvrF4344IU55g=="],
+ "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.7", "", { "dependencies": { "@emnapi/core": "^1.5.0", "@emnapi/runtime": "^1.5.0", "@tybys/wasm-util": "^0.10.1" } }, "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw=="],
- "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.35", "", { "os": "linux", "cpu": "arm64" }, "sha512-8aHpWVSfZl3Dy2VNFG9ywmlCPAJx45g0z+qdOeqmYceY7PBAT4QGzii9ig1hPb1pY8K45TXH44UzQwr2fx352Q=="],
-
- "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.35", "", { "os": "linux", "cpu": "x64" }, "sha512-1r1Ac/vTcm1q4kRiX/NB6qtorF95PhjdCxKH3Z5pb+bWMDZnmcz18fzFlT/3C6Qpj/ZqUF+EUrG4QEDXtVXGgg=="],
-
- "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.35", "", { "os": "linux", "cpu": "x64" }, "sha512-AFl1LnuhUBDfX2j+cE6DlVGROv4qG7GCPDhR1kJqi2+OuXGDkeEjqRvRQOFErhKz1ckkP/YakvN7JheLJ2PKHQ=="],
-
- "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.35", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.3" }, "cpu": "none" }, "sha512-rG0OozgqNUYcpu50MpICMlJflexRVtQfjlN9QYf6hoel46VvY0FbKGwBKoeUp2K5D4i8lV04DpEMfTZlzRjeiA=="],
-
- "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.35", "", { "os": "win32", "cpu": "arm64" }, "sha512-WeOfAZrycFo9+ZqTDp3YDCAOLolymtKGwImrr9n+OW0lpwI2UKyKXbAwGXRhydAYbfrNmuqWyfyoAnLh3X9Hjg=="],
-
- "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.35", "", { "os": "win32", "cpu": "ia32" }, "sha512-XkLT7ikKGiUDvLh7qtJHRukbyyP1BIrD1xb7A+w4PjIiOKeOH8NqZ+PBaO4plT7JJnLxx+j9g/3B7iylR1nTFQ=="],
-
- "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.35", "", { "os": "win32", "cpu": "x64" }, "sha512-rftASFKVzjbcQHTCYHaBIDrnQFzbeV50tm4hVugG3tPjd435RHZC2pbeGV5IPdKEqyJSuurM/GfbV3kLQ3LY/A=="],
-
- "@star-kitten/eve/tsdown/rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.35", "", {}, "sha512-slYrCpoxJUqzFDDNlvrOYRazQUNRvWPjXA17dAOISY3rDMxX6k8K4cj2H+hEYMHF81HO3uNd5rHVigAWRM5dSg=="],
-
- "@star-kitten/util/tsdown/rolldown/@oxc-project/types": ["@oxc-project/types@0.82.3", "", {}, "sha512-6nCUxBnGX0c6qfZW5MaF6/fmu5dHJDMiMPaioKHKs5mi5+8/FHQ7WGjgQIz1zxpmceMYfdIXkOaLYE+ejbuOtA=="],
-
- "@star-kitten/util/tsdown/rolldown/@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.35", "", { "os": "darwin", "cpu": "arm64" }, "sha512-WPy0qx22CABTKDldEExfpYHWHulRoPo+m/YpyxP+6ODUPTQexWl8Wp12fn1CVP0xi0rOBj7ugs6+kKMAJW56wQ=="],
-
- "@star-kitten/util/tsdown/rolldown/@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.35", "", { "os": "darwin", "cpu": "x64" }, "sha512-3k1TabJafF/GgNubXMkfp93d5p30SfIMOmQ5gm1tFwO+baMxxVPwDs3FDvSl+feCWwXxBA+bzemgkaDlInmp1Q=="],
-
- "@star-kitten/util/tsdown/rolldown/@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.35", "", { "os": "freebsd", "cpu": "x64" }, "sha512-GAiapN5YyIocnBVNEiOxMfWO9NqIeEKKWohj1sPLGc61P+9N1meXOOCiAPbLU+adXq0grtbYySid+Or7f2q+Mg=="],
-
- "@star-kitten/util/tsdown/rolldown/@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.35", "", { "os": "linux", "cpu": "arm" }, "sha512-okPKKIE73qkUMvq7dxDyzD0VIysdV4AirHqjf8tGTjuNoddUAl3WAtMYbuZCEKJwUyI67UINKO1peFVlYEb+8w=="],
-
- "@star-kitten/util/tsdown/rolldown/@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.35", "", { "os": "linux", "cpu": "arm64" }, "sha512-Nky8Q2cxyKVkEETntrvcmlzNir5khQbDfX3PflHPbZY7XVZalllRqw7+MW5vn+jTsk5BfKVeLsvrF4344IU55g=="],
-
- "@star-kitten/util/tsdown/rolldown/@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.35", "", { "os": "linux", "cpu": "arm64" }, "sha512-8aHpWVSfZl3Dy2VNFG9ywmlCPAJx45g0z+qdOeqmYceY7PBAT4QGzii9ig1hPb1pY8K45TXH44UzQwr2fx352Q=="],
-
- "@star-kitten/util/tsdown/rolldown/@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.35", "", { "os": "linux", "cpu": "x64" }, "sha512-1r1Ac/vTcm1q4kRiX/NB6qtorF95PhjdCxKH3Z5pb+bWMDZnmcz18fzFlT/3C6Qpj/ZqUF+EUrG4QEDXtVXGgg=="],
-
- "@star-kitten/util/tsdown/rolldown/@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.35", "", { "os": "linux", "cpu": "x64" }, "sha512-AFl1LnuhUBDfX2j+cE6DlVGROv4qG7GCPDhR1kJqi2+OuXGDkeEjqRvRQOFErhKz1ckkP/YakvN7JheLJ2PKHQ=="],
-
- "@star-kitten/util/tsdown/rolldown/@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.35", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.3" }, "cpu": "none" }, "sha512-rG0OozgqNUYcpu50MpICMlJflexRVtQfjlN9QYf6hoel46VvY0FbKGwBKoeUp2K5D4i8lV04DpEMfTZlzRjeiA=="],
-
- "@star-kitten/util/tsdown/rolldown/@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.35", "", { "os": "win32", "cpu": "arm64" }, "sha512-WeOfAZrycFo9+ZqTDp3YDCAOLolymtKGwImrr9n+OW0lpwI2UKyKXbAwGXRhydAYbfrNmuqWyfyoAnLh3X9Hjg=="],
-
- "@star-kitten/util/tsdown/rolldown/@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.35", "", { "os": "win32", "cpu": "ia32" }, "sha512-XkLT7ikKGiUDvLh7qtJHRukbyyP1BIrD1xb7A+w4PjIiOKeOH8NqZ+PBaO4plT7JJnLxx+j9g/3B7iylR1nTFQ=="],
-
- "@star-kitten/util/tsdown/rolldown/@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.35", "", { "os": "win32", "cpu": "x64" }, "sha512-rftASFKVzjbcQHTCYHaBIDrnQFzbeV50tm4hVugG3tPjd435RHZC2pbeGV5IPdKEqyJSuurM/GfbV3kLQ3LY/A=="],
-
- "@star-kitten/util/tsdown/rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.35", "", {}, "sha512-slYrCpoxJUqzFDDNlvrOYRazQUNRvWPjXA17dAOISY3rDMxX6k8K4cj2H+hEYMHF81HO3uNd5rHVigAWRM5dSg=="],
-
- "wrap-ansi-cjs/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
-
- "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.3", "", { "dependencies": { "@emnapi/core": "^1.4.5", "@emnapi/runtime": "^1.4.5", "@tybys/wasm-util": "^0.10.0" } }, "sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q=="],
-
- "@star-kitten/util/tsdown/rolldown/@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.3", "", { "dependencies": { "@emnapi/core": "^1.4.5", "@emnapi/runtime": "^1.4.5", "@tybys/wasm-util": "^0.10.0" } }, "sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q=="],
-
- "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime/@emnapi/core": ["@emnapi/core@1.5.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg=="],
-
- "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime/@emnapi/runtime": ["@emnapi/runtime@1.5.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="],
-
- "@star-kitten/eve/tsdown/rolldown/@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="],
-
- "@star-kitten/util/tsdown/rolldown/@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime/@emnapi/core": ["@emnapi/core@1.5.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg=="],
-
- "@star-kitten/util/tsdown/rolldown/@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime/@emnapi/runtime": ["@emnapi/runtime@1.5.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="],
-
- "@star-kitten/util/tsdown/rolldown/@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="],
+ "@star-kitten/util/tsdown/rolldown/@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.7", "", { "dependencies": { "@emnapi/core": "^1.5.0", "@emnapi/runtime": "^1.5.0", "@tybys/wasm-util": "^0.10.1" } }, "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw=="],
}
}
diff --git a/packages/discord/fixtures/jsd/test.ts b/packages/discord/fixtures/jsd/test.ts
index 8173563..417574d 100644
--- a/packages/discord/fixtures/jsd/test.ts
+++ b/packages/discord/fixtures/jsd/test.ts
@@ -1,21 +1,21 @@
-import * as StarKitten from '@star-kitten/discord';
-import type { ExecutableInteraction } from '@star-kitten/discord';
-import { createActionRow, createButton, createContainer, createTextDisplay } from '@star-kitten/discord/components';
-import type { PageContext } from '@star-kitten/discord/pages';
-import { type Appraisal } from '@star-kitten/eve/third-party/janice.js';
-import { formatNumberToShortForm } from '@star-kitten/util/text.js';
-
-export function renderAppraisal(
- appraisal: Appraisal,
- pageCtx: PageContext,
- interaction: ExecutableInteraction,
-) {
- const formatter = new Intl.NumberFormat(interaction.locale || 'en-US', {
- maximumFractionDigits: 2,
- minimumFractionDigits: 2,
- });
- const world = 'world';
- return (
- StarKitten.createElement("ActionRow", {}, StarKitten.createElement("Container", {"color":"0x1da57a"}, StarKitten.createElement("TextDisplay", {}, ""+ `Hello ${world}` +""), pageCtx.state.currentPage !== "share" ? StarKitten.createElement("ActionRow", {}, StarKitten.createElement("Button", {"key":"share","disabled":"{!unknown}"}, "Share in Channel")) : undefined))
- )
-}
+import * as StarKitten from '@star-kitten/discord';
+import type { ExecutableInteraction } from '@star-kitten/discord';
+import { createActionRow, createButton, createContainer, createTextDisplay } from '@star-kitten/discord/components';
+import type { PageContext } from '@star-kitten/discord/pages';
+import { type Appraisal } from '@star-kitten/eve/third-party/janice.js';
+import { formatNumberToShortForm } from '@star-kitten/util/text.js';
+
+export function renderAppraisal(
+ appraisal: Appraisal,
+ pageCtx: PageContext,
+ interaction: ExecutableInteraction,
+) {
+ const formatter = new Intl.NumberFormat(interaction.locale || 'en-US', {
+ maximumFractionDigits: 2,
+ minimumFractionDigits: 2,
+ });
+ const world = 'world';
+ return (
+ StarKitten.createElement("ActionRow", {}, StarKitten.createElement("Container", {"color":"0x1da57a"}, StarKitten.createElement("TextDisplay", {}, ""+ `Hello ${world}` +""), pageCtx.state.currentPage !== "share" ? StarKitten.createElement("ActionRow", {}, StarKitten.createElement("Button", {"key":"share","disabled":"{!unknown}"}, "Share in Channel")) : undefined))
+ )
+}
diff --git a/packages/discord/fixtures/jsd/test.tsx b/packages/discord/fixtures/jsd/test.tsx
deleted file mode 100644
index 4bcfab0..0000000
--- a/packages/discord/fixtures/jsd/test.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import type {} from '@star-kitten/discord/jsx';
-import { ActionRow, Container, Button, TextDisplay } from '@star-kitten/discord';
-
-export function renderAppraisal() {
- const formatter = new Intl.NumberFormat('en-US', {
- maximumFractionDigits: 2,
- minimumFractionDigits: 2,
- });
- const world = 'world';
- const rand = Math.random() * 1000;
- const pageCtx = { state: { currentPage: 'home' } };
-
- let jsx = (
-
-
-
- {pageCtx.state.currentPage !== 'share' ?
-
-
-
- : undefined}
-
-
- );
-
- console.log(jsx);
-}
-
-renderAppraisal();
diff --git a/packages/discord/index.d.ts b/packages/discord/index.d.ts
index 9f4d8e4..2fbcb99 100644
--- a/packages/discord/index.d.ts
+++ b/packages/discord/index.d.ts
@@ -1,69 +1,69 @@
-import {
- type ActionRow,
- type Button,
- type ChannelSelectMenu,
- type GuildChannelTypes,
- type MentionableSelectMenu,
- type PartialEmoji,
- type RoleSelectMenu,
- type StringSelectMenu,
- type TextInput,
- type UserSelectMenu,
- type LabelComponent,
- type ContainerComponent,
- type TextDisplayComponent,
- type SectionComponent,
- type MediaGalleryComponent,
- type SeparatorComponent,
- type FileComponent,
- type InteractionButton,
- type URLButton,
- type PremiumButton,
- type ThumbnailComponent,
-} from '@projectdysnomia/dysnomia';
-
-declare namespace JSX {
- type Component =
- | ActionRow
- | Button
- | StringSelectMenu
- | UserSelectMenu
- | RoleSelectMenu
- | MentionableSelectMenu
- | ChannelSelectMenu
- | TextInput
- | LabelComponent
- | ContainerComponent
- | {
- type: 10;
- content: string;
- }
- | SectionComponent
- | MediaGalleryComponent
- | SeparatorComponent
- | FileComponent
- | InteractionButton
- | URLButton
- | PremiumButton
- | ThumbnailComponent;
-
- type Element = Component | Promise;
-
- interface ElementClass {
- render: any;
- }
-
- interface ElementAttributesProperty {
- props: {};
- }
-
- interface IntrinsicElements {
- // Allow any element, but prefer known elements
- [elemName: string]: any;
- // Known elements
- ActionRow: { children: any | any[] };
- Button: { label: string; customId: string; style?: number; emoji?: PartialEmoji; disabled?: boolean };
- Container: { accent?: number; spoiler?: boolean; children: any | any[] };
- TextDisplay: { content: string };
- }
-}
+import {
+ type ActionRow,
+ type Button,
+ type ChannelSelectMenu,
+ type GuildChannelTypes,
+ type MentionableSelectMenu,
+ type PartialEmoji,
+ type RoleSelectMenu,
+ type StringSelectMenu,
+ type TextInput,
+ type UserSelectMenu,
+ type LabelComponent,
+ type ContainerComponent,
+ type TextDisplayComponent,
+ type SectionComponent,
+ type MediaGalleryComponent,
+ type SeparatorComponent,
+ type FileComponent,
+ type InteractionButton,
+ type URLButton,
+ type PremiumButton,
+ type ThumbnailComponent,
+} from '@projectdysnomia/dysnomia';
+
+declare namespace JSX {
+ type Component =
+ | ActionRow
+ | Button
+ | StringSelectMenu
+ | UserSelectMenu
+ | RoleSelectMenu
+ | MentionableSelectMenu
+ | ChannelSelectMenu
+ | TextInput
+ | LabelComponent
+ | ContainerComponent
+ | {
+ type: 10;
+ content: string;
+ }
+ | SectionComponent
+ | MediaGalleryComponent
+ | SeparatorComponent
+ | FileComponent
+ | InteractionButton
+ | URLButton
+ | PremiumButton
+ | ThumbnailComponent;
+
+ type Element = Component | Promise;
+
+ interface ElementClass {
+ render: any;
+ }
+
+ interface ElementAttributesProperty {
+ props: {};
+ }
+
+ interface IntrinsicElements {
+ // Allow any element, but prefer known elements
+ [elemName: string]: any;
+ // Known elements
+ ActionRow: { children: any | any[] };
+ Button: { label: string; customId: string; style?: number; emoji?: PartialEmoji; disabled?: boolean };
+ Container: { accent?: number; spoiler?: boolean; children: any | any[] };
+ TextDisplay: { content: string };
+ }
+}
diff --git a/packages/discord/package.json b/packages/discord/package.json
index 3019e4a..547266b 100644
--- a/packages/discord/package.json
+++ b/packages/discord/package.json
@@ -14,7 +14,8 @@
},
"author": "Author Name ",
"files": [
- "dist"
+ "dist",
+ "src"
],
"main": "./dist/index.js",
"module": "./dist/index.js",
@@ -26,9 +27,15 @@
"./pages": "./dist/pages/index.js",
"./common": "./dist/common/index.js",
"./package.json": "./package.json",
- "./jsx": "./src/jsx/jsx.ts",
- "./jsx-runtime": "./dist/jsx/index.js",
- "./jsx-dev-runtime": "./dist/jsx/index.js"
+ "./jsx": "./dist/jsx/index.js",
+ "./jsx-runtime": {
+ "types": "./src/jsx/types.d.ts",
+ "default": "./dist/jsx/jsx-runtime.js"
+ },
+ "./jsx-dev-runtime": {
+ "types": "./src/jsx/types.d.ts",
+ "default": "./dist/jsx/jsx-dev-runtime.js"
+ }
},
"publishConfig": {
"access": "public"
diff --git a/packages/discord/src/commands/command-context.type.ts b/packages/discord/src/commands/command-context.type.ts
index 2ec6903..dd603d2 100644
--- a/packages/discord/src/commands/command-context.type.ts
+++ b/packages/discord/src/commands/command-context.type.ts
@@ -1,14 +1,14 @@
-import type { Cache } from '@core/cache.type';
-import type { KVStore } from '@core/kv-store.type.ts';
-import type { Client } from '@projectdysnomia/dysnomia';
-import type { CommandState } from './command-state';
-
-export interface PartialContext {
- client: Client;
- cache: Cache;
- kv: KVStore;
- id?: string; // unique id for this command instance
- state?: CommandState; // state associated with this command instance
-}
-
-export type CommandContext = Required>;
+import type { Cache } from '@core/cache.type';
+import type { KVStore } from '@core/kv-store.type.ts';
+import type { Client } from '@projectdysnomia/dysnomia';
+import type { CommandState } from './command-state';
+
+export interface PartialContext {
+ client: Client;
+ cache: Cache;
+ kv: KVStore;
+ id?: string; // unique id for this command instance
+ state?: CommandState; // state associated with this command instance
+}
+
+export type CommandContext = Required>;
diff --git a/packages/discord/src/commands/command-handler.ts b/packages/discord/src/commands/command-handler.ts
index aad6d6c..46bd8f6 100644
--- a/packages/discord/src/commands/command-handler.ts
+++ b/packages/discord/src/commands/command-handler.ts
@@ -1,32 +1,32 @@
-import {
- AutocompleteInteraction,
- CommandInteraction,
- ComponentInteraction,
- Constants,
- ModalSubmitInteraction,
- type ApplicationCommandOptionAutocomplete,
- type ApplicationCommandOptions,
- type ApplicationCommandStructure,
- type ChatInputApplicationCommandStructure,
-} from '@projectdysnomia/dysnomia';
-import type { CommandContext, PartialContext } from './command-context.type';
-
-export interface CommandHandler {
- definition: T;
- execute: (interaction: ExecutableInteraction, ctx: CommandContext) => Promise;
-}
-
-export type ExecutableInteraction = CommandInteraction | ModalSubmitInteraction | ComponentInteraction | AutocompleteInteraction;
-
-export type ChatCommandDefinition = Omit;
-export function createChatCommand(
- definition: ChatCommandDefinition,
- execute: (interaction: CommandInteraction, ctx: CommandContext) => Promise,
-): CommandHandler {
- const def = definition as ChatInputApplicationCommandStructure;
- def.type = 1; // CHAT_INPUT
- return {
- definition: def,
- execute,
- };
-}
+import {
+ AutocompleteInteraction,
+ CommandInteraction,
+ ComponentInteraction,
+ Constants,
+ ModalSubmitInteraction,
+ type ApplicationCommandOptionAutocomplete,
+ type ApplicationCommandOptions,
+ type ApplicationCommandStructure,
+ type ChatInputApplicationCommandStructure,
+} from '@projectdysnomia/dysnomia';
+import type { CommandContext, PartialContext } from './command-context.type';
+
+export interface CommandHandler {
+ definition: T;
+ execute: (interaction: ExecutableInteraction, ctx: CommandContext) => Promise;
+}
+
+export type ExecutableInteraction = CommandInteraction | ModalSubmitInteraction | ComponentInteraction | AutocompleteInteraction;
+
+export type ChatCommandDefinition = Omit;
+export function createChatCommand(
+ definition: ChatCommandDefinition,
+ execute: (interaction: CommandInteraction, ctx: CommandContext) => Promise,
+): CommandHandler {
+ const def = definition as ChatInputApplicationCommandStructure;
+ def.type = 1; // CHAT_INPUT
+ return {
+ definition: def,
+ execute,
+ };
+}
diff --git a/packages/discord/src/commands/command-helpers.ts b/packages/discord/src/commands/command-helpers.ts
index 259da61..bac1efb 100644
--- a/packages/discord/src/commands/command-helpers.ts
+++ b/packages/discord/src/commands/command-helpers.ts
@@ -1,45 +1,45 @@
-import {
- Interaction,
- CommandInteraction,
- Constants,
- ModalSubmitInteraction,
- ComponentInteraction,
- AutocompleteInteraction,
- PingInteraction,
-} from '@projectdysnomia/dysnomia';
-import type { ExecutableInteraction } from './command-handler';
-
-export function isApplicationCommand(interaction: Interaction): interaction is CommandInteraction {
- return interaction.type === Constants.InteractionTypes.APPLICATION_COMMAND;
-}
-
-export function isModalSubmit(interaction: Interaction): interaction is ModalSubmitInteraction {
- return interaction.type === Constants.InteractionTypes.MODAL_SUBMIT;
-}
-
-export function isMessageComponent(interaction: Interaction): interaction is ComponentInteraction {
- return interaction.type === Constants.InteractionTypes.MESSAGE_COMPONENT;
-}
-
-export function isAutocomplete(interaction: Interaction): interaction is AutocompleteInteraction {
- return interaction.type === Constants.InteractionTypes.APPLICATION_COMMAND_AUTOCOMPLETE;
-}
-
-export function isPing(interaction: Interaction): interaction is PingInteraction {
- return interaction.type === Constants.InteractionTypes.PING;
-}
-
-export function commandHasName(interaction: Interaction, name: string): boolean {
- return isApplicationCommand(interaction) && interaction.data.name === name;
-}
-
-export function commandHasIdPrefix(interaction: Interaction, prefix: string): boolean {
- return (isModalSubmit(interaction) || isMessageComponent(interaction)) && interaction.data.custom_id.startsWith(prefix);
-}
-
-export function getCommandName(interaction: ExecutableInteraction): string | undefined {
- if (isApplicationCommand(interaction) || isAutocomplete(interaction)) {
- return interaction.data.name;
- }
- return undefined;
-}
+import {
+ Interaction,
+ CommandInteraction,
+ Constants,
+ ModalSubmitInteraction,
+ ComponentInteraction,
+ AutocompleteInteraction,
+ PingInteraction,
+} from '@projectdysnomia/dysnomia';
+import type { ExecutableInteraction } from './command-handler';
+
+export function isApplicationCommand(interaction: Interaction): interaction is CommandInteraction {
+ return interaction.type === Constants.InteractionTypes.APPLICATION_COMMAND;
+}
+
+export function isModalSubmit(interaction: Interaction): interaction is ModalSubmitInteraction {
+ return interaction.type === Constants.InteractionTypes.MODAL_SUBMIT;
+}
+
+export function isMessageComponent(interaction: Interaction): interaction is ComponentInteraction {
+ return interaction.type === Constants.InteractionTypes.MESSAGE_COMPONENT;
+}
+
+export function isAutocomplete(interaction: Interaction): interaction is AutocompleteInteraction {
+ return interaction.type === Constants.InteractionTypes.APPLICATION_COMMAND_AUTOCOMPLETE;
+}
+
+export function isPing(interaction: Interaction): interaction is PingInteraction {
+ return interaction.type === Constants.InteractionTypes.PING;
+}
+
+export function commandHasName(interaction: Interaction, name: string): boolean {
+ return isApplicationCommand(interaction) && interaction.data.name === name;
+}
+
+export function commandHasIdPrefix(interaction: Interaction, prefix: string): boolean {
+ return (isModalSubmit(interaction) || isMessageComponent(interaction)) && interaction.data.custom_id.startsWith(prefix);
+}
+
+export function getCommandName(interaction: ExecutableInteraction): string | undefined {
+ if (isApplicationCommand(interaction) || isAutocomplete(interaction)) {
+ return interaction.data.name;
+ }
+ return undefined;
+}
diff --git a/packages/discord/src/commands/command-injection.ts b/packages/discord/src/commands/command-injection.ts
index 2c313e8..d98b662 100644
--- a/packages/discord/src/commands/command-injection.ts
+++ b/packages/discord/src/commands/command-injection.ts
@@ -1,63 +1,63 @@
-import { type InteractionModalContent, type Component } from '@projectdysnomia/dysnomia';
-import type { CommandContext, PartialContext } from './command-context.type';
-import { isApplicationCommand, isMessageComponent } from './command-helpers';
-import type { ExecutableInteraction } from './command-handler';
-
-export function injectInteraction(interaction: ExecutableInteraction, ctx: PartialContext): [ExecutableInteraction, CommandContext] {
- // Wrap the interaction methods to inject command tracking ids into all custom_ids for modals and components.
- if (ctx.state.name && (isApplicationCommand(interaction) || isMessageComponent(interaction))) {
- const _originalCreateModal = interaction.createModal.bind(interaction);
- interaction.createModal = (content: InteractionModalContent) => {
- validateCustomIdLength(content.custom_id);
- content.custom_id = `${content.custom_id}_${ctx.state.id}`;
- return _originalCreateModal(content);
- };
-
- const _originalCreateMessage = interaction.createMessage.bind(interaction);
- interaction.createMessage = (content) => {
- if (typeof content === 'string') return _originalCreateMessage(content);
- if (content.components) {
- addCommandIdToComponentCustomIds(content.components, ctx.state.id);
- }
- return _originalCreateMessage(content);
- };
-
- const _originalEditMessage = interaction.editMessage.bind(interaction);
- interaction.editMessage = (messageID, content) => {
- if (typeof content === 'string') return _originalEditMessage(messageID, content);
- if (content.components) {
- addCommandIdToComponentCustomIds(content.components, ctx.state.id);
- }
- return _originalEditMessage(messageID, content);
- };
-
- const _originalCreateFollowup = interaction.createFollowup.bind(interaction);
- interaction.createFollowup = (content) => {
- if (typeof content === 'string') return _originalCreateFollowup(content);
- if (content.components) {
- addCommandIdToComponentCustomIds(content.components, ctx.state.id);
- }
- return _originalCreateFollowup(content);
- };
- }
- return [interaction, ctx as CommandContext];
-}
-
-function validateCustomIdLength(customId: string) {
- if (customId.length > 80) {
- throw new Error(`Custom ID too long: ${customId.length} characters (max 80) with this framework. Consider using shorter IDs.`);
- }
-}
-
-function addCommandIdToComponentCustomIds(components: Component[], commandId: string) {
- components.forEach((component) => {
- if (!component) return;
- if ('custom_id' in component) {
- validateCustomIdLength(component.custom_id as string);
- component.custom_id = `${component.custom_id}_${commandId}`;
- }
- if ('components' in component && Array.isArray(component.components)) {
- addCommandIdToComponentCustomIds(component.components, commandId);
- }
- });
-}
+import { type InteractionModalContent, type Component } from '@projectdysnomia/dysnomia';
+import type { CommandContext, PartialContext } from './command-context.type';
+import { isApplicationCommand, isMessageComponent } from './command-helpers';
+import type { ExecutableInteraction } from './command-handler';
+
+export function injectInteraction(interaction: ExecutableInteraction, ctx: PartialContext): [ExecutableInteraction, CommandContext] {
+ // Wrap the interaction methods to inject command tracking ids into all custom_ids for modals and components.
+ if (ctx.state.name && (isApplicationCommand(interaction) || isMessageComponent(interaction))) {
+ const _originalCreateModal = interaction.createModal.bind(interaction);
+ interaction.createModal = (content: InteractionModalContent) => {
+ validateCustomIdLength(content.custom_id);
+ content.custom_id = `${content.custom_id}_${ctx.state.id}`;
+ return _originalCreateModal(content);
+ };
+
+ const _originalCreateMessage = interaction.createMessage.bind(interaction);
+ interaction.createMessage = (content) => {
+ if (typeof content === 'string') return _originalCreateMessage(content);
+ if (content.components) {
+ addCommandIdToComponentCustomIds(content.components, ctx.state.id);
+ }
+ return _originalCreateMessage(content);
+ };
+
+ const _originalEditMessage = interaction.editMessage.bind(interaction);
+ interaction.editMessage = (messageID, content) => {
+ if (typeof content === 'string') return _originalEditMessage(messageID, content);
+ if (content.components) {
+ addCommandIdToComponentCustomIds(content.components, ctx.state.id);
+ }
+ return _originalEditMessage(messageID, content);
+ };
+
+ const _originalCreateFollowup = interaction.createFollowup.bind(interaction);
+ interaction.createFollowup = (content) => {
+ if (typeof content === 'string') return _originalCreateFollowup(content);
+ if (content.components) {
+ addCommandIdToComponentCustomIds(content.components, ctx.state.id);
+ }
+ return _originalCreateFollowup(content);
+ };
+ }
+ return [interaction, ctx as CommandContext];
+}
+
+function validateCustomIdLength(customId: string) {
+ if (customId.length > 80) {
+ throw new Error(`Custom ID too long: ${customId.length} characters (max 80) with this framework. Consider using shorter IDs.`);
+ }
+}
+
+function addCommandIdToComponentCustomIds(components: Component[], commandId: string) {
+ components.forEach((component) => {
+ if (!component) return;
+ if ('custom_id' in component) {
+ validateCustomIdLength(component.custom_id as string);
+ component.custom_id = `${component.custom_id}_${commandId}`;
+ }
+ if ('components' in component && Array.isArray(component.components)) {
+ addCommandIdToComponentCustomIds(component.components, commandId);
+ }
+ });
+}
diff --git a/packages/discord/src/commands/command-state.ts b/packages/discord/src/commands/command-state.ts
index 7e8267b..733f12d 100644
--- a/packages/discord/src/commands/command-state.ts
+++ b/packages/discord/src/commands/command-state.ts
@@ -1,56 +1,56 @@
-import { createReactiveState } from '@star-kitten/util/reactive-state.js';
-import type { PartialContext } from './command-context.type';
-import { isApplicationCommand, isAutocomplete } from './command-helpers';
-import type { ExecutableInteraction } from './command-handler';
-
-export interface CommandState {
- id: string; // unique id for this command instance
- name: string; // command name
- data: T; // internal data storage
-}
-
-export async function getCommandState(interaction: ExecutableInteraction, ctx: PartialContext): Promise> {
- const id = instanceIdFromInteraction(interaction);
-
- let state: CommandState;
-
- // get state from kv store if possible
- if (ctx.kv.has(`command-state:${id}`)) {
- state = await ctx.kv.get>(`command-state:${id}`);
- }
- if (!state) {
- state = { id: id, name: '', data: {} as T };
- }
- const [reactiveState, subscribe] = createReactiveState(state);
- subscribe(async (newState) => {
- if (ctx.kv) {
- await ctx.kv.set(`command-state:${id}`, newState);
- }
- });
- ctx.state = reactiveState;
- return reactiveState;
-}
-
-function instanceIdFromInteraction(interaction: ExecutableInteraction) {
- if (isAutocomplete(interaction)) {
- // autocomplete should not be stateful, they get no id
- return '';
- }
-
- if (isApplicationCommand(interaction)) {
- // for application commands, we create a new instance id
- const instance_id = crypto.randomUUID();
- return instance_id;
- }
-
- const interact = interaction;
- const customId: string = interact.data.custom_id;
- const commandId = customId.split('_').pop();
- interaction;
- // command id should be a uuid
- if (commandId && /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(commandId)) {
- return commandId;
- }
- console.error(`Invalid command id extracted from interaction: ${customId}`);
- return '';
-}
+import { createReactiveState } from '@star-kitten/util/reactive-state.js';
+import type { PartialContext } from './command-context.type';
+import { isApplicationCommand, isAutocomplete } from './command-helpers';
+import type { ExecutableInteraction } from './command-handler';
+
+export interface CommandState {
+ id: string; // unique id for this command instance
+ name: string; // command name
+ data: T; // internal data storage
+}
+
+export async function getCommandState(interaction: ExecutableInteraction, ctx: PartialContext): Promise> {
+ const id = instanceIdFromInteraction(interaction);
+
+ let state: CommandState;
+
+ // get state from kv store if possible
+ if (ctx.kv.has(`command-state:${id}`)) {
+ state = await ctx.kv.get>(`command-state:${id}`);
+ }
+ if (!state) {
+ state = { id: id, name: '', data: {} as T };
+ }
+ const [reactiveState, subscribe] = createReactiveState(state);
+ subscribe(async (newState) => {
+ if (ctx.kv) {
+ await ctx.kv.set(`command-state:${id}`, newState);
+ }
+ });
+ ctx.state = reactiveState;
+ return reactiveState;
+}
+
+function instanceIdFromInteraction(interaction: ExecutableInteraction) {
+ if (isAutocomplete(interaction)) {
+ // autocomplete should not be stateful, they get no id
+ return '';
+ }
+
+ if (isApplicationCommand(interaction)) {
+ // for application commands, we create a new instance id
+ const instance_id = crypto.randomUUID();
+ return instance_id;
+ }
+
+ const interact = interaction;
+ const customId: string = interact.data.custom_id;
+ const commandId = customId.split('_').pop();
+ interaction;
+ // command id should be a uuid
+ if (commandId && /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(commandId)) {
+ return commandId;
+ }
+ console.error(`Invalid command id extracted from interaction: ${customId}`);
+ return '';
+}
diff --git a/packages/discord/src/commands/handle-commands.ts b/packages/discord/src/commands/handle-commands.ts
index 6305d1a..4b5f8fc 100644
--- a/packages/discord/src/commands/handle-commands.ts
+++ b/packages/discord/src/commands/handle-commands.ts
@@ -1,73 +1,73 @@
-import { type ApplicationCommandStructure } from '@projectdysnomia/dysnomia';
-import { getCommandName, isApplicationCommand, isAutocomplete, isMessageComponent, isModalSubmit } from './command-helpers';
-import type { PartialContext } from './command-context.type';
-import type { CommandHandler, ExecutableInteraction } from './command-handler';
-import { injectInteraction } from './command-injection';
-import { getCommandState } from './command-state';
-
-export async function handleCommands(
- interaction: ExecutableInteraction,
- commands: Record>,
- ctx: PartialContext,
-) {
- ctx.state = await getCommandState(interaction, ctx);
- if (!ctx.state.name) {
- ctx.state.name = getCommandName(interaction);
- }
-
- if (isAutocomplete(interaction) && ctx.state.name) {
- const acCommand = commands[ctx.state.name];
- return acCommand.execute(interaction, ctx as any);
- }
-
- if (!ctx.state.id) {
- console.error(`No command ID found for interaction ${interaction.id}`);
- return;
- }
-
- const command = commands[ctx.state.name || ''];
- if (!command) {
- console.warn(`No command found for interaction: ${JSON.stringify(interaction, undefined, 2)}`);
- return;
- }
- cleanInteractionCustomIds(interaction, ctx.state.id);
- const [injectedInteraction, fullContext] = await injectInteraction(interaction, ctx);
- return command.execute(injectedInteraction, fullContext);
-}
-
-export function initializeCommandHandling(commands: Record>, ctx: PartialContext) {
- ctx.client.on('interactionCreate', async (interaction) => {
- if (isApplicationCommand(interaction) || isModalSubmit(interaction) || isMessageComponent(interaction) || isAutocomplete(interaction)) {
- handleCommands(interaction, commands, ctx);
- }
- });
-}
-
-function cleanInteractionCustomIds(interaction: ExecutableInteraction, id: string) {
- if ('components' in interaction && Array.isArray(interaction.components) && id) {
- removeCommandIdFromComponentCustomIds(interaction.components, id);
- }
- if ('data' in interaction && id) {
- if ('custom_id' in interaction.data && typeof interaction.data.custom_id === 'string') {
- interaction.data.custom_id = interaction.data.custom_id.replace(`_${id}`, '');
- }
- if ('components' in interaction.data && Array.isArray(interaction.data.components)) {
- removeCommandIdFromComponentCustomIds(interaction.data.components as any, id);
- }
- }
-}
-
-function removeCommandIdFromComponentCustomIds(components: { custom_id?: string; components?: any[] }[], commandId: string) {
- components.forEach((component) => {
- if ('custom_id' in component) {
- component.custom_id = component.custom_id.replace(`_${commandId}`, '');
- }
- if ('components' in component && Array.isArray(component.components)) {
- removeCommandIdFromComponentCustomIds(component.components, commandId);
- }
-
- if ('component' in component && 'custom_id' in (component as any).component && Array.isArray(component.components)) {
- (component.component as any).custom_id = (component.component as any).custom_id.replace(`_${commandId}`, '');
- }
- });
-}
+import { type ApplicationCommandStructure } from '@projectdysnomia/dysnomia';
+import { getCommandName, isApplicationCommand, isAutocomplete, isMessageComponent, isModalSubmit } from './command-helpers';
+import type { PartialContext } from './command-context.type';
+import type { CommandHandler, ExecutableInteraction } from './command-handler';
+import { injectInteraction } from './command-injection';
+import { getCommandState } from './command-state';
+
+export async function handleCommands(
+ interaction: ExecutableInteraction,
+ commands: Record>,
+ ctx: PartialContext,
+) {
+ ctx.state = await getCommandState(interaction, ctx);
+ if (!ctx.state.name) {
+ ctx.state.name = getCommandName(interaction);
+ }
+
+ if (isAutocomplete(interaction) && ctx.state.name) {
+ const acCommand = commands[ctx.state.name];
+ return acCommand.execute(interaction, ctx as any);
+ }
+
+ if (!ctx.state.id) {
+ console.error(`No command ID found for interaction ${interaction.id}`);
+ return;
+ }
+
+ const command = commands[ctx.state.name || ''];
+ if (!command) {
+ console.warn(`No command found for interaction: ${JSON.stringify(interaction, undefined, 2)}`);
+ return;
+ }
+ cleanInteractionCustomIds(interaction, ctx.state.id);
+ const [injectedInteraction, fullContext] = await injectInteraction(interaction, ctx);
+ return command.execute(injectedInteraction, fullContext);
+}
+
+export function initializeCommandHandling(commands: Record>, ctx: PartialContext) {
+ ctx.client.on('interactionCreate', async (interaction) => {
+ if (isApplicationCommand(interaction) || isModalSubmit(interaction) || isMessageComponent(interaction) || isAutocomplete(interaction)) {
+ handleCommands(interaction, commands, ctx);
+ }
+ });
+}
+
+function cleanInteractionCustomIds(interaction: ExecutableInteraction, id: string) {
+ if ('components' in interaction && Array.isArray(interaction.components) && id) {
+ removeCommandIdFromComponentCustomIds(interaction.components, id);
+ }
+ if ('data' in interaction && id) {
+ if ('custom_id' in interaction.data && typeof interaction.data.custom_id === 'string') {
+ interaction.data.custom_id = interaction.data.custom_id.replace(`_${id}`, '');
+ }
+ if ('components' in interaction.data && Array.isArray(interaction.data.components)) {
+ removeCommandIdFromComponentCustomIds(interaction.data.components as any, id);
+ }
+ }
+}
+
+function removeCommandIdFromComponentCustomIds(components: { custom_id?: string; components?: any[] }[], commandId: string) {
+ components.forEach((component) => {
+ if ('custom_id' in component) {
+ component.custom_id = component.custom_id.replace(`_${commandId}`, '');
+ }
+ if ('components' in component && Array.isArray(component.components)) {
+ removeCommandIdFromComponentCustomIds(component.components, commandId);
+ }
+
+ if ('component' in component && 'custom_id' in (component as any).component && Array.isArray(component.components)) {
+ (component.component as any).custom_id = (component.component as any).custom_id.replace(`_${commandId}`, '');
+ }
+ });
+}
diff --git a/packages/discord/src/commands/import-commands.ts b/packages/discord/src/commands/import-commands.ts
index dc02848..fa55a90 100644
--- a/packages/discord/src/commands/import-commands.ts
+++ b/packages/discord/src/commands/import-commands.ts
@@ -1,19 +1,19 @@
-import { Glob } from 'bun';
-import { join } from 'node:path';
-import type { CommandHandler } from './command-handler';
-import type { ApplicationCommandStructure } from '@projectdysnomia/dysnomia';
-
-export async function importCommands(
- pattern: string = '**/*.command.{js,ts}',
- baseDir: string = join(process.cwd(), 'src'),
- commandRegistry: Record> = {},
-): Promise>> {
- const glob = new Glob(pattern);
-
- for await (const file of glob.scan({ cwd: baseDir, absolute: true })) {
- const command = (await import(file)).default as CommandHandler;
- commandRegistry[command.definition.name] = command;
- }
-
- return commandRegistry;
-}
+import { Glob } from 'bun';
+import { join } from 'node:path';
+import type { CommandHandler } from './command-handler';
+import type { ApplicationCommandStructure } from '@projectdysnomia/dysnomia';
+
+export async function importCommands(
+ pattern: string = '**/*.command.{js,ts}',
+ baseDir: string = join(process.cwd(), 'src'),
+ commandRegistry: Record> = {},
+): Promise>> {
+ const glob = new Glob(pattern);
+
+ for await (const file of glob.scan({ cwd: baseDir, absolute: true })) {
+ const command = (await import(file)).default as CommandHandler;
+ commandRegistry[command.definition.name] = command;
+ }
+
+ return commandRegistry;
+}
diff --git a/packages/discord/src/commands/option-builders.ts b/packages/discord/src/commands/option-builders.ts
index 82196db..a1ca076 100644
--- a/packages/discord/src/commands/option-builders.ts
+++ b/packages/discord/src/commands/option-builders.ts
@@ -1,80 +1,80 @@
-import {
- Constants,
- type ApplicationCommandOptions,
- type ApplicationCommandOptionsBoolean,
- type ApplicationCommandOptionsInteger,
- type ApplicationCommandOptionsMentionable,
- type ApplicationCommandOptionsNumber,
- type ApplicationCommandOptionsRole,
- type ApplicationCommandOptionsString,
- type ApplicationCommandOptionsSubCommand,
- type ApplicationCommandOptionsSubCommandGroup,
- type ApplicationCommandOptionsUser,
-} from '@projectdysnomia/dysnomia';
-
-export type StringOptionDefinition = Omit & { autocomplete?: boolean };
-export function stringOption(options: StringOptionDefinition): ApplicationCommandOptionsString {
- const def = options as ApplicationCommandOptionsString;
- def.type = Constants.ApplicationCommandOptionTypes.STRING;
- return def;
-}
-export type IntegerOptionDefinition = Omit & { autocomplete?: boolean };
-export function integerOption(options: IntegerOptionDefinition): ApplicationCommandOptionsInteger {
- const def = options as ApplicationCommandOptionsInteger;
- def.type = Constants.ApplicationCommandOptionTypes.INTEGER;
- return def;
-}
-export type BooleanOptionDefinition = Omit;
-export function booleanOption(options: BooleanOptionDefinition): ApplicationCommandOptionsBoolean {
- const def = options as ApplicationCommandOptionsBoolean;
- def.type = Constants.ApplicationCommandOptionTypes.BOOLEAN;
- return def;
-}
-export type UserOptionDefinition = Omit & { autocomplete?: boolean };
-export function userOption(options: UserOptionDefinition): ApplicationCommandOptionsUser {
- const def = options as ApplicationCommandOptionsUser;
- def.type = Constants.ApplicationCommandOptionTypes.USER;
- return def;
-}
-export type ChannelOptionDefinition = Omit & { autocomplete?: boolean };
-export function channelOption(options: ChannelOptionDefinition): ApplicationCommandOptions {
- const def = options as ApplicationCommandOptions;
- def.type = Constants.ApplicationCommandOptionTypes.CHANNEL;
- return def;
-}
-export type RoleOptionDefinition = Omit & { autocomplete?: boolean };
-export function roleOption(options: RoleOptionDefinition): ApplicationCommandOptionsRole {
- const def = options as ApplicationCommandOptionsRole;
- def.type = Constants.ApplicationCommandOptionTypes.ROLE;
- return def;
-}
-export type MentionableOptionDefinition = Omit;
-export function mentionableOption(options: MentionableOptionDefinition): ApplicationCommandOptionsMentionable {
- const def = options as ApplicationCommandOptionsMentionable;
- def.type = Constants.ApplicationCommandOptionTypes.MENTIONABLE;
- return def;
-}
-export type NumberOptionDefinition = Omit & { autocomplete?: boolean };
-export function numberOption(options: NumberOptionDefinition): ApplicationCommandOptionsNumber {
- const def = options as ApplicationCommandOptionsNumber;
- def.type = Constants.ApplicationCommandOptionTypes.NUMBER;
- return def;
-}
-export type AttachmentOptionDefinition = Omit;
-export function attachmentOption(options: AttachmentOptionDefinition): ApplicationCommandOptions {
- const def = options as ApplicationCommandOptions;
- def.type = Constants.ApplicationCommandOptionTypes.ATTACHMENT;
- return def;
-}
-export type SubCommandOptionDefinition = Omit;
-export function subCommandOption(options: SubCommandOptionDefinition): ApplicationCommandOptionsSubCommand {
- const def = options as ApplicationCommandOptionsSubCommand;
- def.type = Constants.ApplicationCommandOptionTypes.SUB_COMMAND;
- return def;
-}
-export type SubCommandGroupOptionDefinition = Omit;
-export function subCommandGroupOption(options: SubCommandGroupOptionDefinition): ApplicationCommandOptionsSubCommandGroup {
- const def = options as ApplicationCommandOptionsSubCommandGroup;
- def.type = Constants.ApplicationCommandOptionTypes.SUB_COMMAND_GROUP;
- return def;
-}
+import {
+ Constants,
+ type ApplicationCommandOptions,
+ type ApplicationCommandOptionsBoolean,
+ type ApplicationCommandOptionsInteger,
+ type ApplicationCommandOptionsMentionable,
+ type ApplicationCommandOptionsNumber,
+ type ApplicationCommandOptionsRole,
+ type ApplicationCommandOptionsString,
+ type ApplicationCommandOptionsSubCommand,
+ type ApplicationCommandOptionsSubCommandGroup,
+ type ApplicationCommandOptionsUser,
+} from '@projectdysnomia/dysnomia';
+
+export type StringOptionDefinition = Omit & { autocomplete?: boolean };
+export function stringOption(options: StringOptionDefinition): ApplicationCommandOptionsString {
+ const def = options as ApplicationCommandOptionsString;
+ def.type = Constants.ApplicationCommandOptionTypes.STRING;
+ return def;
+}
+export type IntegerOptionDefinition = Omit & { autocomplete?: boolean };
+export function integerOption(options: IntegerOptionDefinition): ApplicationCommandOptionsInteger {
+ const def = options as ApplicationCommandOptionsInteger;
+ def.type = Constants.ApplicationCommandOptionTypes.INTEGER;
+ return def;
+}
+export type BooleanOptionDefinition = Omit;
+export function booleanOption(options: BooleanOptionDefinition): ApplicationCommandOptionsBoolean {
+ const def = options as ApplicationCommandOptionsBoolean;
+ def.type = Constants.ApplicationCommandOptionTypes.BOOLEAN;
+ return def;
+}
+export type UserOptionDefinition = Omit & { autocomplete?: boolean };
+export function userOption(options: UserOptionDefinition): ApplicationCommandOptionsUser {
+ const def = options as ApplicationCommandOptionsUser;
+ def.type = Constants.ApplicationCommandOptionTypes.USER;
+ return def;
+}
+export type ChannelOptionDefinition = Omit & { autocomplete?: boolean };
+export function channelOption(options: ChannelOptionDefinition): ApplicationCommandOptions {
+ const def = options as ApplicationCommandOptions;
+ def.type = Constants.ApplicationCommandOptionTypes.CHANNEL;
+ return def;
+}
+export type RoleOptionDefinition = Omit & { autocomplete?: boolean };
+export function roleOption(options: RoleOptionDefinition): ApplicationCommandOptionsRole {
+ const def = options as ApplicationCommandOptionsRole;
+ def.type = Constants.ApplicationCommandOptionTypes.ROLE;
+ return def;
+}
+export type MentionableOptionDefinition = Omit;
+export function mentionableOption(options: MentionableOptionDefinition): ApplicationCommandOptionsMentionable {
+ const def = options as ApplicationCommandOptionsMentionable;
+ def.type = Constants.ApplicationCommandOptionTypes.MENTIONABLE;
+ return def;
+}
+export type NumberOptionDefinition = Omit & { autocomplete?: boolean };
+export function numberOption(options: NumberOptionDefinition): ApplicationCommandOptionsNumber {
+ const def = options as ApplicationCommandOptionsNumber;
+ def.type = Constants.ApplicationCommandOptionTypes.NUMBER;
+ return def;
+}
+export type AttachmentOptionDefinition = Omit;
+export function attachmentOption(options: AttachmentOptionDefinition): ApplicationCommandOptions {
+ const def = options as ApplicationCommandOptions;
+ def.type = Constants.ApplicationCommandOptionTypes.ATTACHMENT;
+ return def;
+}
+export type SubCommandOptionDefinition = Omit;
+export function subCommandOption(options: SubCommandOptionDefinition): ApplicationCommandOptionsSubCommand {
+ const def = options as ApplicationCommandOptionsSubCommand;
+ def.type = Constants.ApplicationCommandOptionTypes.SUB_COMMAND;
+ return def;
+}
+export type SubCommandGroupOptionDefinition = Omit;
+export function subCommandGroupOption(options: SubCommandGroupOptionDefinition): ApplicationCommandOptionsSubCommandGroup {
+ const def = options as ApplicationCommandOptionsSubCommandGroup;
+ def.type = Constants.ApplicationCommandOptionTypes.SUB_COMMAND_GROUP;
+ return def;
+}
diff --git a/packages/discord/src/commands/register-commands.ts b/packages/discord/src/commands/register-commands.ts
index 4fe5f04..dd3e52f 100644
--- a/packages/discord/src/commands/register-commands.ts
+++ b/packages/discord/src/commands/register-commands.ts
@@ -1,11 +1,11 @@
-import type { ApplicationCommandStructure, Client } from '@projectdysnomia/dysnomia';
-
-export async function registerCommands(client: Client, commands: ApplicationCommandStructure[]) {
- if (!client) throw new Error('Client not initialized');
- if (!(await client.getCommands()).length || process.env.RESET_COMMANDS === 'true' || process.env.NODE_ENV === 'development') {
- console.debug('Registering commands...');
- const response = await client.bulkEditCommands(commands);
- console.debug(`Registered ${response.length} commands.`);
- }
- return commands;
-}
+import type { ApplicationCommandStructure, Client } from '@projectdysnomia/dysnomia';
+
+export async function registerCommands(client: Client, commands: ApplicationCommandStructure[]) {
+ if (!client) throw new Error('Client not initialized');
+ if (!(await client.getCommands()).length || process.env.RESET_COMMANDS === 'true' || process.env.NODE_ENV === 'development') {
+ console.debug('Registering commands...');
+ const response = await client.bulkEditCommands(commands);
+ console.debug(`Registered ${response.length} commands.`);
+ }
+ return commands;
+}
diff --git a/packages/discord/src/common/index.ts b/packages/discord/src/common/index.ts
index 1a9ac14..ea84ff9 100644
--- a/packages/discord/src/common/index.ts
+++ b/packages/discord/src/common/index.ts
@@ -1 +1 @@
-export * from './text';
+export * from './text';
diff --git a/packages/discord/src/common/text.ts b/packages/discord/src/common/text.ts
index 0eb08e0..71cb0b3 100644
--- a/packages/discord/src/common/text.ts
+++ b/packages/discord/src/common/text.ts
@@ -1,2 +1,2 @@
-export const WHITE_SPACE = ' '; // non-breaking space
-export const BREAKING_WHITE_SPACE = '\u200B';
+export const WHITE_SPACE = ' '; // non-breaking space
+export const BREAKING_WHITE_SPACE = '\u200B';
diff --git a/packages/discord/src/components/builders.ts b/packages/discord/src/components/builders.ts
index 09fddaa..281c7cc 100644
--- a/packages/discord/src/components/builders.ts
+++ b/packages/discord/src/components/builders.ts
@@ -1,314 +1,314 @@
-import {
- Constants,
- type ActionRow,
- type Button,
- type ChannelSelectMenu,
- type GuildChannelTypes,
- type MentionableSelectMenu,
- type PartialEmoji,
- type RoleSelectMenu,
- type StringSelectMenu,
- type TextInput,
- type UserSelectMenu,
- type LabelComponent,
- type ContainerComponent,
- type TextDisplayComponent,
- type SectionComponent,
- type MediaGalleryComponent,
- type SeparatorComponent,
- type FileComponent,
- type InteractionButton,
- type URLButton,
- type PremiumButton,
- type ThumbnailComponent,
-} from '@projectdysnomia/dysnomia';
-
-export type ActionRowItem = Button | StringSelectMenu | UserSelectMenu | RoleSelectMenu | MentionableSelectMenu | ChannelSelectMenu;
-export const createActionRow = (...components: ActionRowItem[]): ActionRow => ({
- type: Constants.ComponentTypes.ACTION_ROW,
- components,
-});
-
-export enum ButtonStyle {
- PRIMARY = 1,
- SECONDARY = 2,
- SUCCESS = 3,
- DANGER = 4,
-}
-
-export interface ButtonOptions {
- style?: ButtonStyle;
- emoji?: PartialEmoji;
- disabled?: boolean;
-}
-
-export const createButton = (label: string, custom_id: string, options?: ButtonOptions): InteractionButton => ({
- type: Constants.ComponentTypes.BUTTON,
- style: options?.style ?? Constants.ButtonStyles.PRIMARY,
- label,
- custom_id,
- ...options,
-});
-
-export interface URLButtonOptions {
- emoji?: PartialEmoji;
- disabled?: boolean;
-}
-
-export const createURLButton = (label: string, url: string, options?: URLButtonOptions): URLButton => ({
- type: Constants.ComponentTypes.BUTTON,
- style: Constants.ButtonStyles.LINK,
- label,
- url,
- ...options,
-});
-
-export interface PremiumButtonOptions {
- emoji?: PartialEmoji;
- disabled?: boolean;
-}
-
-export const createPremiumButton = (sku_id: string, options?: PremiumButtonOptions): PremiumButton => ({
- type: Constants.ComponentTypes.BUTTON,
- style: Constants.ButtonStyles.PREMIUM,
- sku_id,
- ...options,
-});
-
-export interface StringSelectOpts {
- placeholder?: string;
- min_values?: number;
- max_values?: number;
- disabled?: boolean;
- required?: boolean; // Note: not actually a property of StringSelectMenu, but useful for modals
-}
-
-export interface StringSelectOption {
- label: string;
- value: string;
- description?: string;
- emoji?: {
- name?: string;
- id?: string;
- animated?: boolean;
- };
- default?: boolean;
-}
-
-export const createStringSelect = (
- custom_id: string,
- selectOpts: StringSelectOpts,
- ...options: StringSelectOption[]
-): StringSelectMenu => ({
- type: Constants.ComponentTypes.STRING_SELECT,
- custom_id,
- options,
- placeholder: selectOpts.placeholder ?? '',
- min_values: selectOpts.min_values ?? 1,
- max_values: selectOpts.max_values ?? 1,
- disabled: selectOpts.disabled ?? false,
- required: selectOpts.required ?? false, // Note: not actually a property of StringSelectMenu, but useful for modals
-});
-
-export interface TextInputOptions {
- isParagraph?: boolean;
- label?: string;
- min_length?: number;
- max_length?: number;
- required?: boolean;
- value?: string;
- placeholder?: string;
-}
-
-export const createTextInput = (custom_id: string, options?: TextInputOptions): TextInput => ({
- type: Constants.ComponentTypes.TEXT_INPUT,
- custom_id,
- style: options.isParagraph ? Constants.TextInputStyles.PARAGRAPH : Constants.TextInputStyles.SHORT,
- label: options?.label ?? '',
- min_length: options?.min_length ?? 0,
- max_length: options?.max_length ?? 4000,
- required: options?.required ?? false,
- value: options?.value ?? '',
- placeholder: options?.placeholder ?? '',
-});
-
-export interface UserSelectOptions {
- placeholder?: string;
- min_values?: number;
- max_values?: number;
- disabled?: boolean;
- default_values?: Array<{ id: string; type: 'user' }>;
-}
-
-export const createUserSelect = (custom_id: string, options?: UserSelectOptions): UserSelectMenu => ({
- type: Constants.ComponentTypes.USER_SELECT,
- custom_id,
- placeholder: options?.placeholder ?? '',
- min_values: options?.min_values ?? 1,
- max_values: options?.max_values ?? 1,
- disabled: options?.disabled ?? false,
- default_values: options?.default_values ?? [],
-});
-
-export interface RoleSelectOptions {
- placeholder?: string;
- min_values?: number;
- max_values?: number;
- disabled?: boolean;
- default_values?: Array<{ id: string; type: 'role' }>;
-}
-
-export const createRoleSelect = (custom_id: string, options?: RoleSelectOptions): RoleSelectMenu => ({
- type: Constants.ComponentTypes.ROLE_SELECT,
- custom_id,
- placeholder: options?.placeholder ?? '',
- min_values: options?.min_values ?? 1,
- max_values: options?.max_values ?? 1,
- disabled: options?.disabled ?? false,
- default_values: options?.default_values ?? [],
-});
-
-export interface MentionableSelectOptions {
- placeholder?: string;
- min_values?: number;
- max_values?: number;
- disabled?: boolean;
- default_values?: Array<{ id: string; type: 'user' | 'role' }>;
-}
-
-export const createMentionableSelect = (custom_id: string, options?: MentionableSelectOptions): MentionableSelectMenu => ({
- type: Constants.ComponentTypes.MENTIONABLE_SELECT,
- custom_id,
- placeholder: options?.placeholder ?? '',
- min_values: options?.min_values ?? 1,
- max_values: options?.max_values ?? 1,
- disabled: options?.disabled ?? false,
- default_values: options?.default_values ?? [],
-});
-
-export interface ChannelSelectOptions {
- channel_types?: GuildChannelTypes[];
- placeholder?: string;
- min_values?: number;
- max_values?: number;
- disabled?: boolean;
- default_values?: Array<{ id: string; type: 'channel' }>;
-}
-
-export const createChannelSelect = (custom_id: string, options?: ChannelSelectOptions): ChannelSelectMenu => ({
- type: Constants.ComponentTypes.CHANNEL_SELECT,
- custom_id,
- channel_types: options?.channel_types ?? [],
- placeholder: options?.placeholder ?? '',
- min_values: options?.min_values ?? 1,
- max_values: options?.max_values ?? 1,
- disabled: options?.disabled ?? false,
- default_values: options?.default_values ?? [],
-});
-
-export interface SectionOptions {
- components: Array;
- accessory: Button | ThumbnailComponent;
-}
-
-export const createSection = (accessory: Button | ThumbnailComponent, ...components: Array): SectionComponent => ({
- type: Constants.ComponentTypes.SECTION,
- accessory,
- components,
-});
-
-/**
- * Creates a text display component where the text will be displayed similar to a message: supports markdown
- * @param content The text content to display.
- * @returns The created text display component.
- */
-export const createTextDisplay = (content: string) => ({
- type: Constants.ComponentTypes.TEXT_DISPLAY,
- content,
-});
-
-export interface ThumbnailOptions {
- media: {
- url: string; // Supports arbitrary urls and attachment:// references
- };
- description?: string;
- spoiler?: boolean;
-}
-
-export const createThumbnail = (url: string, description?: string, spoiler?: boolean): ThumbnailComponent => ({
- type: Constants.ComponentTypes.THUMBNAIL,
- media: {
- url,
- },
- description,
- spoiler,
-});
-
-export interface MediaItem {
- url: string; // Supports arbitrary urls and attachment:// references
- description?: string;
- spoiler?: boolean;
-}
-
-export const createMediaGallery = (...items: MediaItem[]): MediaGalleryComponent => ({
- type: Constants.ComponentTypes.MEDIA_GALLERY,
- items: items.map((item) => ({
- type: Constants.ComponentTypes.FILE,
- media: { url: item.url },
- description: item.description,
- spoiler: item.spoiler,
- })),
-});
-
-export interface FileOptions {
- url: string; // Supports only attachment:// references
- spoiler?: boolean;
-}
-
-export const createFile = (url: string, spoiler?: boolean): FileComponent => ({
- type: Constants.ComponentTypes.FILE,
- file: {
- url,
- },
- spoiler,
-});
-
-export enum Padding {
- SMALL = 1,
- LARGE = 2,
-}
-
-export interface SeparatorOptions {
- divider?: boolean;
- spacing?: Padding;
-}
-export const createSeparator = (spacing?: Padding, divider?: boolean): SeparatorComponent => ({
- type: Constants.ComponentTypes.SEPARATOR,
- divider,
- spacing: spacing ?? Padding.SMALL,
-});
-
-export interface ContainerOptions {
- accent_color?: number;
- spoiler?: boolean;
-}
-
-export type ContainerItems =
- | ActionRow
- | TextDisplayComponent
- | SectionComponent
- | MediaGalleryComponent
- | SeparatorComponent
- | FileComponent;
-
-export const createContainer = (options: ContainerOptions, ...components: ContainerItems[]): ContainerComponent => ({
- type: Constants.ComponentTypes.CONTAINER,
- ...options,
- components,
-});
-
-export const createModalLabel = (label: string, component: TextInput | StringSelectMenu): LabelComponent => ({
- type: Constants.ComponentTypes.LABEL,
- label,
- component,
-});
+import {
+ Constants,
+ type ActionRow,
+ type Button,
+ type ChannelSelectMenu,
+ type GuildChannelTypes,
+ type MentionableSelectMenu,
+ type PartialEmoji,
+ type RoleSelectMenu,
+ type StringSelectMenu,
+ type TextInput,
+ type UserSelectMenu,
+ type LabelComponent,
+ type ContainerComponent,
+ type TextDisplayComponent,
+ type SectionComponent,
+ type MediaGalleryComponent,
+ type SeparatorComponent,
+ type FileComponent,
+ type InteractionButton,
+ type URLButton,
+ type PremiumButton,
+ type ThumbnailComponent,
+} from '@projectdysnomia/dysnomia';
+
+export type ActionRowItem = Button | StringSelectMenu | UserSelectMenu | RoleSelectMenu | MentionableSelectMenu | ChannelSelectMenu;
+export const createActionRow = (...components: ActionRowItem[]): ActionRow => ({
+ type: Constants.ComponentTypes.ACTION_ROW,
+ components,
+});
+
+export enum ButtonStyle {
+ PRIMARY = 1,
+ SECONDARY = 2,
+ SUCCESS = 3,
+ DANGER = 4,
+}
+
+export interface ButtonOptions {
+ style?: ButtonStyle;
+ emoji?: PartialEmoji;
+ disabled?: boolean;
+}
+
+export const createButton = (label: string, custom_id: string, options?: ButtonOptions): InteractionButton => ({
+ type: Constants.ComponentTypes.BUTTON,
+ style: options?.style ?? Constants.ButtonStyles.PRIMARY,
+ label,
+ custom_id,
+ ...options,
+});
+
+export interface URLButtonOptions {
+ emoji?: PartialEmoji;
+ disabled?: boolean;
+}
+
+export const createURLButton = (label: string, url: string, options?: URLButtonOptions): URLButton => ({
+ type: Constants.ComponentTypes.BUTTON,
+ style: Constants.ButtonStyles.LINK,
+ label,
+ url,
+ ...options,
+});
+
+export interface PremiumButtonOptions {
+ emoji?: PartialEmoji;
+ disabled?: boolean;
+}
+
+export const createPremiumButton = (sku_id: string, options?: PremiumButtonOptions): PremiumButton => ({
+ type: Constants.ComponentTypes.BUTTON,
+ style: Constants.ButtonStyles.PREMIUM,
+ sku_id,
+ ...options,
+});
+
+export interface StringSelectOpts {
+ placeholder?: string;
+ min_values?: number;
+ max_values?: number;
+ disabled?: boolean;
+ required?: boolean; // Note: not actually a property of StringSelectMenu, but useful for modals
+}
+
+export interface StringSelectOption {
+ label: string;
+ value: string;
+ description?: string;
+ emoji?: {
+ name?: string;
+ id?: string;
+ animated?: boolean;
+ };
+ default?: boolean;
+}
+
+export const createStringSelect = (
+ custom_id: string,
+ selectOpts: StringSelectOpts,
+ ...options: StringSelectOption[]
+): StringSelectMenu => ({
+ type: Constants.ComponentTypes.STRING_SELECT,
+ custom_id,
+ options,
+ placeholder: selectOpts.placeholder ?? '',
+ min_values: selectOpts.min_values ?? 1,
+ max_values: selectOpts.max_values ?? 1,
+ disabled: selectOpts.disabled ?? false,
+ required: selectOpts.required ?? false, // Note: not actually a property of StringSelectMenu, but useful for modals
+});
+
+export interface TextInputOptions {
+ isParagraph?: boolean;
+ label?: string;
+ min_length?: number;
+ max_length?: number;
+ required?: boolean;
+ value?: string;
+ placeholder?: string;
+}
+
+export const createTextInput = (custom_id: string, options?: TextInputOptions): TextInput => ({
+ type: Constants.ComponentTypes.TEXT_INPUT,
+ custom_id,
+ style: options.isParagraph ? Constants.TextInputStyles.PARAGRAPH : Constants.TextInputStyles.SHORT,
+ label: options?.label ?? '',
+ min_length: options?.min_length ?? 0,
+ max_length: options?.max_length ?? 4000,
+ required: options?.required ?? false,
+ value: options?.value ?? '',
+ placeholder: options?.placeholder ?? '',
+});
+
+export interface UserSelectOptions {
+ placeholder?: string;
+ min_values?: number;
+ max_values?: number;
+ disabled?: boolean;
+ default_values?: Array<{ id: string; type: 'user' }>;
+}
+
+export const createUserSelect = (custom_id: string, options?: UserSelectOptions): UserSelectMenu => ({
+ type: Constants.ComponentTypes.USER_SELECT,
+ custom_id,
+ placeholder: options?.placeholder ?? '',
+ min_values: options?.min_values ?? 1,
+ max_values: options?.max_values ?? 1,
+ disabled: options?.disabled ?? false,
+ default_values: options?.default_values ?? [],
+});
+
+export interface RoleSelectOptions {
+ placeholder?: string;
+ min_values?: number;
+ max_values?: number;
+ disabled?: boolean;
+ default_values?: Array<{ id: string; type: 'role' }>;
+}
+
+export const createRoleSelect = (custom_id: string, options?: RoleSelectOptions): RoleSelectMenu => ({
+ type: Constants.ComponentTypes.ROLE_SELECT,
+ custom_id,
+ placeholder: options?.placeholder ?? '',
+ min_values: options?.min_values ?? 1,
+ max_values: options?.max_values ?? 1,
+ disabled: options?.disabled ?? false,
+ default_values: options?.default_values ?? [],
+});
+
+export interface MentionableSelectOptions {
+ placeholder?: string;
+ min_values?: number;
+ max_values?: number;
+ disabled?: boolean;
+ default_values?: Array<{ id: string; type: 'user' | 'role' }>;
+}
+
+export const createMentionableSelect = (custom_id: string, options?: MentionableSelectOptions): MentionableSelectMenu => ({
+ type: Constants.ComponentTypes.MENTIONABLE_SELECT,
+ custom_id,
+ placeholder: options?.placeholder ?? '',
+ min_values: options?.min_values ?? 1,
+ max_values: options?.max_values ?? 1,
+ disabled: options?.disabled ?? false,
+ default_values: options?.default_values ?? [],
+});
+
+export interface ChannelSelectOptions {
+ channel_types?: GuildChannelTypes[];
+ placeholder?: string;
+ min_values?: number;
+ max_values?: number;
+ disabled?: boolean;
+ default_values?: Array<{ id: string; type: 'channel' }>;
+}
+
+export const createChannelSelect = (custom_id: string, options?: ChannelSelectOptions): ChannelSelectMenu => ({
+ type: Constants.ComponentTypes.CHANNEL_SELECT,
+ custom_id,
+ channel_types: options?.channel_types ?? [],
+ placeholder: options?.placeholder ?? '',
+ min_values: options?.min_values ?? 1,
+ max_values: options?.max_values ?? 1,
+ disabled: options?.disabled ?? false,
+ default_values: options?.default_values ?? [],
+});
+
+export interface SectionOptions {
+ components: Array;
+ accessory: Button | ThumbnailComponent;
+}
+
+export const createSection = (accessory: Button | ThumbnailComponent, ...components: Array): SectionComponent => ({
+ type: Constants.ComponentTypes.SECTION,
+ accessory,
+ components,
+});
+
+/**
+ * Creates a text display component where the text will be displayed similar to a message: supports markdown
+ * @param content The text content to display.
+ * @returns The created text display component.
+ */
+export const createTextDisplay = (content: string) => ({
+ type: Constants.ComponentTypes.TEXT_DISPLAY,
+ content,
+});
+
+export interface ThumbnailOptions {
+ media: {
+ url: string; // Supports arbitrary urls and attachment:// references
+ };
+ description?: string;
+ spoiler?: boolean;
+}
+
+export const createThumbnail = (url: string, description?: string, spoiler?: boolean): ThumbnailComponent => ({
+ type: Constants.ComponentTypes.THUMBNAIL,
+ media: {
+ url,
+ },
+ description,
+ spoiler,
+});
+
+export interface MediaItem {
+ url: string; // Supports arbitrary urls and attachment:// references
+ description?: string;
+ spoiler?: boolean;
+}
+
+export const createMediaGallery = (...items: MediaItem[]): MediaGalleryComponent => ({
+ type: Constants.ComponentTypes.MEDIA_GALLERY,
+ items: items.map((item) => ({
+ type: Constants.ComponentTypes.FILE,
+ media: { url: item.url },
+ description: item.description,
+ spoiler: item.spoiler,
+ })),
+});
+
+export interface FileOptions {
+ url: string; // Supports only attachment:// references
+ spoiler?: boolean;
+}
+
+export const createFile = (url: string, spoiler?: boolean): FileComponent => ({
+ type: Constants.ComponentTypes.FILE,
+ file: {
+ url,
+ },
+ spoiler,
+});
+
+export enum Padding {
+ SMALL = 1,
+ LARGE = 2,
+}
+
+export interface SeparatorOptions {
+ divider?: boolean;
+ spacing?: Padding;
+}
+export const createSeparator = (spacing?: Padding, divider?: boolean): SeparatorComponent => ({
+ type: Constants.ComponentTypes.SEPARATOR,
+ divider,
+ spacing: spacing ?? Padding.SMALL,
+});
+
+export interface ContainerOptions {
+ accent_color?: number;
+ spoiler?: boolean;
+}
+
+export type ContainerItems =
+ | ActionRow
+ | TextDisplayComponent
+ | SectionComponent
+ | MediaGalleryComponent
+ | SeparatorComponent
+ | FileComponent;
+
+export const createContainer = (options: ContainerOptions, ...components: ContainerItems[]): ContainerComponent => ({
+ type: Constants.ComponentTypes.CONTAINER,
+ ...options,
+ components,
+});
+
+export const createModalLabel = (label: string, component: TextInput | StringSelectMenu): LabelComponent => ({
+ type: Constants.ComponentTypes.LABEL,
+ label,
+ component,
+});
diff --git a/packages/discord/src/components/helpers.ts b/packages/discord/src/components/helpers.ts
index 6b5a7db..ad60474 100644
--- a/packages/discord/src/components/helpers.ts
+++ b/packages/discord/src/components/helpers.ts
@@ -1,23 +1,23 @@
-import {
- Constants,
- type ComponentBase,
- type ModalSubmitInteractionDataLabelComponent,
- type ModalSubmitInteractionDataStringSelectComponent,
- type ModalSubmitInteractionDataTextInputComponent,
-} from '@projectdysnomia/dysnomia';
-
-export function isModalLabel(component: ComponentBase): component is ModalSubmitInteractionDataLabelComponent {
- return component.type === Constants.ComponentTypes.LABEL;
-}
-
-export function isModalTextInput(component: ComponentBase): component is ModalSubmitInteractionDataTextInputComponent {
- return component.type === Constants.ComponentTypes.TEXT_INPUT;
-}
-
-export function isModalSelect(component: ComponentBase): component is ModalSubmitInteractionDataStringSelectComponent {
- return component.type === Constants.ComponentTypes.STRING_SELECT;
-}
-
-export function componentHasIdPrefix(component: ComponentBase, prefix: string): boolean {
- return (isModalTextInput(component) || isModalSelect(component)) && component.custom_id.startsWith(prefix);
-}
+import {
+ Constants,
+ type ComponentBase,
+ type ModalSubmitInteractionDataLabelComponent,
+ type ModalSubmitInteractionDataStringSelectComponent,
+ type ModalSubmitInteractionDataTextInputComponent,
+} from '@projectdysnomia/dysnomia';
+
+export function isModalLabel(component: ComponentBase): component is ModalSubmitInteractionDataLabelComponent {
+ return component.type === Constants.ComponentTypes.LABEL;
+}
+
+export function isModalTextInput(component: ComponentBase): component is ModalSubmitInteractionDataTextInputComponent {
+ return component.type === Constants.ComponentTypes.TEXT_INPUT;
+}
+
+export function isModalSelect(component: ComponentBase): component is ModalSubmitInteractionDataStringSelectComponent {
+ return component.type === Constants.ComponentTypes.STRING_SELECT;
+}
+
+export function componentHasIdPrefix(component: ComponentBase, prefix: string): boolean {
+ return (isModalTextInput(component) || isModalSelect(component)) && component.custom_id.startsWith(prefix);
+}
diff --git a/packages/discord/src/components/index.ts b/packages/discord/src/components/index.ts
index 44a9da7..bc58a99 100644
--- a/packages/discord/src/components/index.ts
+++ b/packages/discord/src/components/index.ts
@@ -1,2 +1,2 @@
-export * from './helpers';
-export * from './builders';
+export * from './helpers';
+export * from './builders';
diff --git a/packages/discord/src/core/bot.ts b/packages/discord/src/core/bot.ts
index 784f8c5..5d21bae 100644
--- a/packages/discord/src/core/bot.ts
+++ b/packages/discord/src/core/bot.ts
@@ -1,54 +1,54 @@
-import { importCommands, initializeCommandHandling, registerCommands } from '@commands';
-import { Client } from '@projectdysnomia/dysnomia';
-import kv, { asyncKV } from '@star-kitten/util/kv.js';
-import type { KVStore } from './kv-store.type.ts';
-import type { Cache } from './cache.type.ts';
-
-export interface DiscordBotOptions {
- token?: string;
- intents?: number[];
- commandPattern?: string;
- commandBaseDir?: string;
- keyStore?: KVStore;
- cache?: Cache;
- onError?: (error: Error) => void;
- onReady?: () => void;
-}
-
-export function startDiscordBot({
- token = process.env.DISCORD_BOT_TOKEN || '',
- intents = [],
- commandPattern = '**/*.command.{js,ts}',
- commandBaseDir = 'src',
- keyStore = asyncKV,
- cache = kv,
- onError,
- onReady,
-}: DiscordBotOptions = {}): Client {
- const client = new Client(`Bot ${token}`, {
- gateway: {
- intents,
- },
- });
-
- client.on('ready', async () => {
- console.debug(`Logged in as ${client.user?.username}#${client.user?.discriminator}`);
- onReady?.();
- const commands = await importCommands(commandPattern, commandBaseDir);
- await registerCommands(
- client,
- Object.values(commands).map((cmd) => cmd.definition),
- );
- initializeCommandHandling(commands, { client, cache, kv: keyStore });
- console.debug('Bot is ready and command handling is initialized.');
- });
-
- client.on('error', (error) => {
- console.error('An error occurred:', error);
- onError?.(error);
- });
-
- client.connect().catch(console.error);
-
- return client;
-}
+import { importCommands, initializeCommandHandling, registerCommands } from '@commands';
+import { Client } from '@projectdysnomia/dysnomia';
+import kv, { asyncKV } from '@star-kitten/util/kv.js';
+import type { KVStore } from './kv-store.type.ts';
+import type { Cache } from './cache.type.ts';
+
+export interface DiscordBotOptions {
+ token?: string;
+ intents?: number[];
+ commandPattern?: string;
+ commandBaseDir?: string;
+ keyStore?: KVStore;
+ cache?: Cache;
+ onError?: (error: Error) => void;
+ onReady?: () => void;
+}
+
+export function startDiscordBot({
+ token = process.env.DISCORD_BOT_TOKEN || '',
+ intents = [],
+ commandPattern = '**/*.command.{js,ts}',
+ commandBaseDir = 'src',
+ keyStore = asyncKV,
+ cache = kv,
+ onError,
+ onReady,
+}: DiscordBotOptions = {}): Client {
+ const client = new Client(`Bot ${token}`, {
+ gateway: {
+ intents,
+ },
+ });
+
+ client.on('ready', async () => {
+ console.debug(`Logged in as ${client.user?.username}#${client.user?.discriminator}`);
+ onReady?.();
+ const commands = await importCommands(commandPattern, commandBaseDir);
+ await registerCommands(
+ client,
+ Object.values(commands).map((cmd) => cmd.definition),
+ );
+ initializeCommandHandling(commands, { client, cache, kv: keyStore });
+ console.debug('Bot is ready and command handling is initialized.');
+ });
+
+ client.on('error', (error) => {
+ console.error('An error occurred:', error);
+ onError?.(error);
+ });
+
+ client.connect().catch(console.error);
+
+ return client;
+}
diff --git a/packages/discord/src/core/cache.type.ts b/packages/discord/src/core/cache.type.ts
index 260de3e..0802208 100644
--- a/packages/discord/src/core/cache.type.ts
+++ b/packages/discord/src/core/cache.type.ts
@@ -1,6 +1,6 @@
-export interface Cache {
- get: (key: string) => T | undefined;
- set: (key: string, value: T, ttl?: number | string) => boolean;
- del: (key: string | string[]) => number;
- has: (key: string) => boolean;
-}
+export interface Cache {
+ get: (key: string) => T | undefined;
+ set: (key: string, value: T, ttl?: number | string) => boolean;
+ del: (key: string | string[]) => number;
+ has: (key: string) => boolean;
+}
diff --git a/packages/discord/src/core/index.ts b/packages/discord/src/core/index.ts
index 600a945..b1b8b9d 100644
--- a/packages/discord/src/core/index.ts
+++ b/packages/discord/src/core/index.ts
@@ -1,3 +1,3 @@
-export * from './bot';
-export * from './cache.type';
-export * from './kv-store.type.ts';
+export * from './bot';
+export * from './cache.type';
+export * from './kv-store.type.ts';
diff --git a/packages/discord/src/core/kv-store.type.ts.ts b/packages/discord/src/core/kv-store.type.ts.ts
index 37f4f09..d36ce91 100644
--- a/packages/discord/src/core/kv-store.type.ts.ts
+++ b/packages/discord/src/core/kv-store.type.ts.ts
@@ -1,7 +1,7 @@
-export interface KVStore {
- get: (key: string) => Promise;
- set: (key: string, value: any) => Promise;
- delete: (key: string) => Promise;
- has: (key: string) => Promise;
- clear: () => Promise;
-}
+export interface KVStore {
+ get: (key: string) => Promise;
+ set: (key: string, value: any) => Promise;
+ delete: (key: string) => Promise;
+ has: (key: string) => Promise;
+ clear: () => Promise;
+}
diff --git a/packages/discord/src/index.ts b/packages/discord/src/index.ts
index 95cc37b..5c7542c 100644
--- a/packages/discord/src/index.ts
+++ b/packages/discord/src/index.ts
@@ -2,3 +2,5 @@ export * from './locales';
export * from './commands';
export * from './core';
export * from './jsx';
+export * from './components';
+export * from './pages';
diff --git a/packages/discord/src/jsd/createElement.ts b/packages/discord/src/jsd/createElement.ts
index 0672a5e..0d0273b 100644
--- a/packages/discord/src/jsd/createElement.ts
+++ b/packages/discord/src/jsd/createElement.ts
@@ -1,7 +1,7 @@
-export function createElement(tag: string, attrs: Record = {}, ...children: any[]) {
- return {
- tag,
- attrs,
- children,
- };
-}
+export function createElement(tag: string, attrs: Record = {}, ...children: any[]) {
+ return {
+ tag,
+ attrs,
+ children,
+ };
+}
diff --git a/packages/discord/src/jsd/index.ts b/packages/discord/src/jsd/index.ts
index 2e56645..c0c9786 100644
--- a/packages/discord/src/jsd/index.ts
+++ b/packages/discord/src/jsd/index.ts
@@ -1,2 +1,2 @@
-export * from './parser';
-export * from './createElement';
+export * from './parser';
+export * from './createElement';
diff --git a/packages/discord/src/jsd/parser.test.ts b/packages/discord/src/jsd/parser.test.ts
index 972b831..b14a985 100644
--- a/packages/discord/src/jsd/parser.test.ts
+++ b/packages/discord/src/jsd/parser.test.ts
@@ -1,10 +1,10 @@
-import { describe, it, expect } from 'bun:test';
-import { parseJSDFile } from './parser_new';
-import path from 'node:path';
-
-describe('parseJSDFile', () => {
- it('should parse a JSD file', async () => {
- const result = await parseJSDFile(path.join(__dirname, '../../fixtures/jsd/test.tsd'));
- expect(result).toEqual(true);
- });
-});
+import { describe, it, expect } from 'bun:test';
+import { parseJSDFile } from './parser_new';
+import path from 'node:path';
+
+describe('parseJSDFile', () => {
+ it('should parse a JSD file', async () => {
+ const result = await parseJSDFile(path.join(__dirname, '../../fixtures/jsd/test.tsd'));
+ expect(result).toEqual(true);
+ });
+});
diff --git a/packages/discord/src/jsd/parser.ts b/packages/discord/src/jsd/parser.ts
index 2372326..c10a1a4 100644
--- a/packages/discord/src/jsd/parser.ts
+++ b/packages/discord/src/jsd/parser.ts
@@ -1,97 +1,97 @@
-import fs from 'node:fs/promises';
-import parse, { type DOMNode } from 'html-dom-parser';
-import type { ChildNode } from 'domhandler';
-
-const JSD_STRING = /\(\s*(<.*)>\s*\)/gs;
-
-export async function parseJSDFile(filename: string) {
- const content = (await fs.readFile(filename)).toString();
-
- const matches = JSD_STRING.exec(content);
- if (matches) {
- let html = matches[1] + '>';
- const root = parse(html);
- const translated = translate(root[0]);
- const str = content.replace(matches[1] + '>', translated);
- await fs.writeFile(filename.replace('.tsd', '.ts'), str);
- }
- return true;
-}
-
-interface state {
- inInterpolation?: boolean;
- children?: string[][];
- parent?: Text[];
-}
-
-function translate(root: DOMNode | ChildNode | null, state: state = {}): string | null {
- if (!root || typeof root !== 'object') return null;
-
- let children = [];
- if ('children' in root && Array.isArray(root.children) && root.children.length > 0) {
- for (const child of root.children) {
- const translated = translate(child, state);
- if (translated) {
- if (state.inInterpolation && state.parent[state.children.length - 1] === child) {
- state.children[state.children.length - 1].push(translated);
- } else {
- children.push(translated);
- }
- }
- }
- }
-
- if ('nodeType' in root && root.nodeType === 3) {
- if (root.data.trim() === '') return null;
- return parseText(root.data.trim(), state, root);
- }
-
- if ('name' in root && root.name) {
- let tagName = root.name || 'unknown';
- let attrs = 'attribs' in root ? root.attribs : {};
- return `StarKitten.createElement("${tagName}", ${JSON.stringify(attrs)}${children.length > 0 ? ', ' + children.join(', ') : ''})`;
- }
-}
-
-const JSD_INTERPOLATION = /\{(.+)\}/gs;
-const JSD_START_EXP_INTERPOLATION = /\{(.+)\(/gs;
-const JSD_END_EXP_INTERPOLATION = /\)(.+)\}/gs;
-
-function parseText(text: string, state: state = {}, parent: Text = {}): string {
- let interpolations = text.match(JSD_INTERPOLATION);
- if (!interpolations) {
- if (text.match(JSD_START_EXP_INTERPOLATION)) {
- state.inInterpolation = true;
- state.children = state.children || [[]];
- state.parent = state.parent || [];
- state.parent.push(parent);
- return text.substring(1, text.length - 1);
- } else if (text.match(JSD_END_EXP_INTERPOLATION)) {
- const combined = state.children?.[state.children.length - 1].join(' ');
- state.children?.[state.children.length - 1].splice(0);
- state.children?.pop();
- state.parent?.pop();
- if (state.children.length === 0) {
- state.inInterpolation = false;
- return combined + ' ' + text.substring(1, text.length - 1);
- }
- }
- return `"${text}"`;
- } else {
- text = replaceInterpolations(text);
- return `"${text}"`;
- }
-}
-
-function replaceInterpolations(text: string, isOnJSON: boolean = false) {
- let interpolations = null;
-
- while ((interpolations = JSD_INTERPOLATION.exec(text))) {
- if (isOnJSON) {
- text = text.replace(`"{${interpolations[1]}}"`, interpolations[1]);
- } else {
- text = text.replace(`{${interpolations[1]}}`, `"+ ${interpolations[1]} +"`);
- }
- }
- return text;
-}
+import fs from 'node:fs/promises';
+import parse, { type DOMNode } from 'html-dom-parser';
+import type { ChildNode } from 'domhandler';
+
+const JSD_STRING = /\(\s*(<.*)>\s*\)/gs;
+
+export async function parseJSDFile(filename: string) {
+ const content = (await fs.readFile(filename)).toString();
+
+ const matches = JSD_STRING.exec(content);
+ if (matches) {
+ let html = matches[1] + '>';
+ const root = parse(html);
+ const translated = translate(root[0]);
+ const str = content.replace(matches[1] + '>', translated);
+ await fs.writeFile(filename.replace('.tsd', '.ts'), str);
+ }
+ return true;
+}
+
+interface state {
+ inInterpolation?: boolean;
+ children?: string[][];
+ parent?: Text[];
+}
+
+function translate(root: DOMNode | ChildNode | null, state: state = {}): string | null {
+ if (!root || typeof root !== 'object') return null;
+
+ let children = [];
+ if ('children' in root && Array.isArray(root.children) && root.children.length > 0) {
+ for (const child of root.children) {
+ const translated = translate(child, state);
+ if (translated) {
+ if (state.inInterpolation && state.parent[state.children.length - 1] === child) {
+ state.children[state.children.length - 1].push(translated);
+ } else {
+ children.push(translated);
+ }
+ }
+ }
+ }
+
+ if ('nodeType' in root && root.nodeType === 3) {
+ if (root.data.trim() === '') return null;
+ return parseText(root.data.trim(), state, root);
+ }
+
+ if ('name' in root && root.name) {
+ let tagName = root.name || 'unknown';
+ let attrs = 'attribs' in root ? root.attribs : {};
+ return `StarKitten.createElement("${tagName}", ${JSON.stringify(attrs)}${children.length > 0 ? ', ' + children.join(', ') : ''})`;
+ }
+}
+
+const JSD_INTERPOLATION = /\{(.+)\}/gs;
+const JSD_START_EXP_INTERPOLATION = /\{(.+)\(/gs;
+const JSD_END_EXP_INTERPOLATION = /\)(.+)\}/gs;
+
+function parseText(text: string, state: state = {}, parent: Text = {}): string {
+ let interpolations = text.match(JSD_INTERPOLATION);
+ if (!interpolations) {
+ if (text.match(JSD_START_EXP_INTERPOLATION)) {
+ state.inInterpolation = true;
+ state.children = state.children || [[]];
+ state.parent = state.parent || [];
+ state.parent.push(parent);
+ return text.substring(1, text.length - 1);
+ } else if (text.match(JSD_END_EXP_INTERPOLATION)) {
+ const combined = state.children?.[state.children.length - 1].join(' ');
+ state.children?.[state.children.length - 1].splice(0);
+ state.children?.pop();
+ state.parent?.pop();
+ if (state.children.length === 0) {
+ state.inInterpolation = false;
+ return combined + ' ' + text.substring(1, text.length - 1);
+ }
+ }
+ return `"${text}"`;
+ } else {
+ text = replaceInterpolations(text);
+ return `"${text}"`;
+ }
+}
+
+function replaceInterpolations(text: string, isOnJSON: boolean = false) {
+ let interpolations = null;
+
+ while ((interpolations = JSD_INTERPOLATION.exec(text))) {
+ if (isOnJSON) {
+ text = text.replace(`"{${interpolations[1]}}"`, interpolations[1]);
+ } else {
+ text = text.replace(`{${interpolations[1]}}`, `"+ ${interpolations[1]} +"`);
+ }
+ }
+ return text;
+}
diff --git a/packages/discord/src/jsd/parser_new.ts b/packages/discord/src/jsd/parser_new.ts
index 1b23ee5..bddc70c 100644
--- a/packages/discord/src/jsd/parser_new.ts
+++ b/packages/discord/src/jsd/parser_new.ts
@@ -1,101 +1,101 @@
-import fs from 'node:fs/promises';
-import * as acorn from 'acorn';
-import jsx from 'acorn-jsx';
-
-const JSD_STRING = /\(\s*(<.*)>\s*\)/gs;
-
-const parser = acorn.Parser.extend(jsx());
-
-export async function parseJSDFile(filename: string) {
- const content = (await fs.readFile(filename)).toString();
-
- const matches = JSD_STRING.exec(content);
- if (matches) {
- const jsxc = matches[1] + '>';
- const ast = parser.parse(jsxc, { ecmaVersion: 2020, sourceType: 'module' });
- const translated = traverseJSX((ast.body[0] as any).expression);
- const str = content.replace(matches[1] + '>', translated);
- await fs.writeFile(filename.replace('.tsd', '.ts'), str);
- }
- return true;
-}
-
-function traverseJSX(node: any): string {
- if (node.type === 'JSXElement') {
- const tag = node.openingElement.name.name;
- const attrs: Record = {};
- for (const attr of node.openingElement.attributes) {
- if (attr.type === 'JSXAttribute') {
- const name = attr.name.name;
- const value = attr.value;
- if (value.type === 'Literal') {
- attrs[name] = value.value;
- } else if (value.type === 'JSXExpressionContainer') {
- attrs[name] = `{${generateCode(value.expression)}}`;
- } else if (value) {
- attrs[name] = value.raw;
- }
- }
- }
- const children = [];
- for (const child of node.children) {
- const translated = traverseJSX(child);
- if (translated) {
- children.push(translated);
- }
- }
- return `StarKitten.createElement("${tag}", ${JSON.stringify(attrs)}${children.length > 0 ? ', ' + children.join(', ') : ''})`;
- } else if (node.type === 'JSXExpressionContainer') {
- const expr = generateCode(node.expression);
- if (node.expression.type === 'TemplateLiteral' || (node.expression.type === 'Literal' && typeof node.expression.value === 'string')) {
- return `""+ ${expr} +""`;
- } else {
- return expr;
- }
- } else if (node.type === 'JSXText') {
- const text = node.value.trim();
- if (text) {
- return `"${text}"`;
- }
- }
- return '';
-}
-
-function generateCode(node: any): string {
- if (node.type === 'JSXElement') {
- return traverseJSX(node);
- } else if (node.type === 'Identifier') {
- return node.name;
- } else if (node.type === 'Literal') {
- return JSON.stringify(node.value);
- } else if (node.type === 'TemplateLiteral') {
- const quasis = node.quasis.map((q: any) => q.value.raw);
- const expressions = node.expressions.map((e: any) => generateCode(e));
- let result = quasis[0];
- for (let i = 0; i < expressions.length; i++) {
- result += '${' + expressions[i] + '}' + quasis[i + 1];
- }
- return '`' + result + '`';
- } else if (node.type === 'MemberExpression') {
- const op = node.optional ? '?.' : '.';
- return generateCode(node.object) + op + (node.computed ? '[' + generateCode(node.property) + ']' : generateCode(node.property));
- } else if (node.type === 'OptionalMemberExpression') {
- return generateCode(node.object) + '?.' + (node.computed ? '[' + generateCode(node.property) + ']' : generateCode(node.property));
- } else if (node.type === 'CallExpression') {
- return generateCode(node.callee) + '(' + node.arguments.map((a: any) => generateCode(a)).join(', ') + ')';
- } else if (node.type === 'BinaryExpression') {
- return generateCode(node.left) + ' ' + node.operator + ' ' + generateCode(node.right);
- } else if (node.type === 'ConditionalExpression') {
- return generateCode(node.test) + ' ? ' + generateCode(node.consequent) + ' : ' + generateCode(node.alternate);
- } else if (node.type === 'LogicalExpression') {
- return generateCode(node.left) + ' ' + node.operator + ' ' + generateCode(node.right);
- } else if (node.type === 'UnaryExpression') {
- return node.operator + generateCode(node.argument);
- } else if (node.type === 'ObjectExpression') {
- return '{' + node.properties.map((p: any) => generateCode(p.key) + ': ' + generateCode(p.value)).join(', ') + '}';
- } else if (node.type === 'ArrayExpression') {
- return '[' + node.elements.map((e: any) => generateCode(e)).join(', ') + ']';
- } else {
- return node.raw || node.name || 'unknown';
- }
-}
+import fs from 'node:fs/promises';
+import * as acorn from 'acorn';
+import jsx from 'acorn-jsx';
+
+const JSD_STRING = /\(\s*(<.*)>\s*\)/gs;
+
+const parser = acorn.Parser.extend(jsx());
+
+export async function parseJSDFile(filename: string) {
+ const content = (await fs.readFile(filename)).toString();
+
+ const matches = JSD_STRING.exec(content);
+ if (matches) {
+ const jsxc = matches[1] + '>';
+ const ast = parser.parse(jsxc, { ecmaVersion: 2020, sourceType: 'module' });
+ const translated = traverseJSX((ast.body[0] as any).expression);
+ const str = content.replace(matches[1] + '>', translated);
+ await fs.writeFile(filename.replace('.tsd', '.ts'), str);
+ }
+ return true;
+}
+
+function traverseJSX(node: any): string {
+ if (node.type === 'JSXElement') {
+ const tag = node.openingElement.name.name;
+ const attrs: Record = {};
+ for (const attr of node.openingElement.attributes) {
+ if (attr.type === 'JSXAttribute') {
+ const name = attr.name.name;
+ const value = attr.value;
+ if (value.type === 'Literal') {
+ attrs[name] = value.value;
+ } else if (value.type === 'JSXExpressionContainer') {
+ attrs[name] = `{${generateCode(value.expression)}}`;
+ } else if (value) {
+ attrs[name] = value.raw;
+ }
+ }
+ }
+ const children = [];
+ for (const child of node.children) {
+ const translated = traverseJSX(child);
+ if (translated) {
+ children.push(translated);
+ }
+ }
+ return `StarKitten.createElement("${tag}", ${JSON.stringify(attrs)}${children.length > 0 ? ', ' + children.join(', ') : ''})`;
+ } else if (node.type === 'JSXExpressionContainer') {
+ const expr = generateCode(node.expression);
+ if (node.expression.type === 'TemplateLiteral' || (node.expression.type === 'Literal' && typeof node.expression.value === 'string')) {
+ return `""+ ${expr} +""`;
+ } else {
+ return expr;
+ }
+ } else if (node.type === 'JSXText') {
+ const text = node.value.trim();
+ if (text) {
+ return `"${text}"`;
+ }
+ }
+ return '';
+}
+
+function generateCode(node: any): string {
+ if (node.type === 'JSXElement') {
+ return traverseJSX(node);
+ } else if (node.type === 'Identifier') {
+ return node.name;
+ } else if (node.type === 'Literal') {
+ return JSON.stringify(node.value);
+ } else if (node.type === 'TemplateLiteral') {
+ const quasis = node.quasis.map((q: any) => q.value.raw);
+ const expressions = node.expressions.map((e: any) => generateCode(e));
+ let result = quasis[0];
+ for (let i = 0; i < expressions.length; i++) {
+ result += '${' + expressions[i] + '}' + quasis[i + 1];
+ }
+ return '`' + result + '`';
+ } else if (node.type === 'MemberExpression') {
+ const op = node.optional ? '?.' : '.';
+ return generateCode(node.object) + op + (node.computed ? '[' + generateCode(node.property) + ']' : generateCode(node.property));
+ } else if (node.type === 'OptionalMemberExpression') {
+ return generateCode(node.object) + '?.' + (node.computed ? '[' + generateCode(node.property) + ']' : generateCode(node.property));
+ } else if (node.type === 'CallExpression') {
+ return generateCode(node.callee) + '(' + node.arguments.map((a: any) => generateCode(a)).join(', ') + ')';
+ } else if (node.type === 'BinaryExpression') {
+ return generateCode(node.left) + ' ' + node.operator + ' ' + generateCode(node.right);
+ } else if (node.type === 'ConditionalExpression') {
+ return generateCode(node.test) + ' ? ' + generateCode(node.consequent) + ' : ' + generateCode(node.alternate);
+ } else if (node.type === 'LogicalExpression') {
+ return generateCode(node.left) + ' ' + node.operator + ' ' + generateCode(node.right);
+ } else if (node.type === 'UnaryExpression') {
+ return node.operator + generateCode(node.argument);
+ } else if (node.type === 'ObjectExpression') {
+ return '{' + node.properties.map((p: any) => generateCode(p.key) + ': ' + generateCode(p.value)).join(', ') + '}';
+ } else if (node.type === 'ArrayExpression') {
+ return '[' + node.elements.map((e: any) => generateCode(e)).join(', ') + ']';
+ } else {
+ return node.raw || node.name || 'unknown';
+ }
+}
diff --git a/packages/discord/src/jsx/components/action-row.ts b/packages/discord/src/jsx/components/action-row.ts
index 500173a..c60ab50 100644
--- a/packages/discord/src/jsx/components/action-row.ts
+++ b/packages/discord/src/jsx/components/action-row.ts
@@ -1,5 +1,5 @@
-import { createActionRow } from '@components';
-
-export function ActionRow(props: { children: any | any[] }) {
- return createActionRow(...(Array.isArray(props.children) ? props.children : [props.children]));
-}
+import { createActionRow } from '@components';
+
+export function ActionRow(props: { children: any | any[] }) {
+ return createActionRow(...(Array.isArray(props.children) ? props.children : [props.children]));
+}
diff --git a/packages/discord/src/jsx/components/button.ts b/packages/discord/src/jsx/components/button.ts
index 7b3fad6..643fec5 100644
--- a/packages/discord/src/jsx/components/button.ts
+++ b/packages/discord/src/jsx/components/button.ts
@@ -1,6 +1,6 @@
-import { createButton, type ButtonStyle } from '@components';
-import type { PartialEmoji } from '@projectdysnomia/dysnomia';
-
-export function Button(props: { label: string; customId: string; style?: ButtonStyle; emoji?: PartialEmoji; disabled?: boolean }) {
- return createButton(props.label, props.customId, { style: props.style, emoji: props.emoji, disabled: props.disabled });
-}
+import { createButton, type ButtonStyle } from '@components';
+import type { PartialEmoji } from '@projectdysnomia/dysnomia';
+
+export function Button(props: { label: string; customId: string; style: ButtonStyle; emoji?: PartialEmoji; disabled?: boolean }) {
+ return createButton(props.label, props.customId, { style: props.style, emoji: props.emoji, disabled: props.disabled });
+}
diff --git a/packages/discord/src/jsx/components/container.ts b/packages/discord/src/jsx/components/container.ts
index d04f4aa..51f06b2 100644
--- a/packages/discord/src/jsx/components/container.ts
+++ b/packages/discord/src/jsx/components/container.ts
@@ -1,8 +1,8 @@
-import { createContainer } from '@components';
-
-export function Container(props: { accent?: number; spoiler?: boolean; children: any | any[] }) {
- return createContainer(
- { accent_color: props.accent, spoiler: props.spoiler },
- ...(Array.isArray(props.children) ? props.children : [props.children]),
- );
-}
+import { createContainer } from '@components';
+
+export function Container(props: { accent?: number; spoiler?: boolean; children: any | any[] }) {
+ return createContainer(
+ { accent_color: props.accent, spoiler: props.spoiler },
+ ...(Array.isArray(props.children) ? props.children : [props.children]),
+ );
+}
diff --git a/packages/discord/src/jsx/components/index.ts b/packages/discord/src/jsx/components/index.ts
index a7576db..ee42d08 100644
--- a/packages/discord/src/jsx/components/index.ts
+++ b/packages/discord/src/jsx/components/index.ts
@@ -1,4 +1,4 @@
-export * from './action-row';
-export * from './button';
-export * from './container';
-export * from './text-display';
+export * from './action-row';
+export * from './button';
+export * from './container';
+export * from './text-display';
diff --git a/packages/discord/src/jsx/components/text-display.ts b/packages/discord/src/jsx/components/text-display.ts
index e78f952..c79eaa7 100644
--- a/packages/discord/src/jsx/components/text-display.ts
+++ b/packages/discord/src/jsx/components/text-display.ts
@@ -1,5 +1,5 @@
-import { createTextDisplay } from '@components/builders';
-
-export function TextDisplay(props: { content: string }) {
- return createTextDisplay(props.content);
-}
+import { createTextDisplay } from '@components/builders';
+
+export function TextDisplay(props: { content: string }) {
+ return createTextDisplay(props.content);
+}
diff --git a/packages/discord/src/jsx/index.ts b/packages/discord/src/jsx/index.ts
index b3cf233..423c34c 100644
--- a/packages/discord/src/jsx/index.ts
+++ b/packages/discord/src/jsx/index.ts
@@ -1,3 +1,3 @@
-export * from './runtime';
-export * from './components';
-export * as JSX from './jsx';
+export * from './components';
+export * from './jsx';
+export * from './runtime';
diff --git a/packages/discord/src/jsx/jsx-dev-runtime.ts b/packages/discord/src/jsx/jsx-dev-runtime.ts
new file mode 100644
index 0000000..5c95f0d
--- /dev/null
+++ b/packages/discord/src/jsx/jsx-dev-runtime.ts
@@ -0,0 +1 @@
+export { jsxDEV } from './runtime';
diff --git a/packages/discord/src/jsx/jsx-runtime.ts b/packages/discord/src/jsx/jsx-runtime.ts
new file mode 100644
index 0000000..50592a8
--- /dev/null
+++ b/packages/discord/src/jsx/jsx-runtime.ts
@@ -0,0 +1 @@
+export { jsx } from './runtime';
diff --git a/packages/discord/src/jsx/jsx.ts b/packages/discord/src/jsx/jsx.ts
index 72f13e6..d31b5d1 100644
--- a/packages/discord/src/jsx/jsx.ts
+++ b/packages/discord/src/jsx/jsx.ts
@@ -1,69 +1,69 @@
-import {
- type ActionRow,
- type Button,
- type ChannelSelectMenu,
- type MentionableSelectMenu,
- type PartialEmoji,
- type RoleSelectMenu,
- type StringSelectMenu,
- type TextInput,
- type UserSelectMenu,
- type LabelComponent,
- type ContainerComponent,
- type TextDisplayComponent,
- type SectionComponent,
- type MediaGalleryComponent,
- type SeparatorComponent,
- type FileComponent,
- type InteractionButton,
- type URLButton,
- type PremiumButton,
- type ThumbnailComponent,
-} from '@projectdysnomia/dysnomia';
-
-export type Component =
- | ActionRow
- | Button
- | StringSelectMenu
- | UserSelectMenu
- | RoleSelectMenu
- | MentionableSelectMenu
- | ChannelSelectMenu
- | TextInput
- | LabelComponent
- | ContainerComponent
- | TextDisplayComponent
- | SectionComponent
- | MediaGalleryComponent
- | SeparatorComponent
- | FileComponent
- | InteractionButton
- | URLButton
- | PremiumButton
- | ThumbnailComponent;
-
-export type Element = Component | Promise;
-
-export interface ElementClass {
- render: any;
-}
-
-export interface ElementAttributesProperty {
- props: {};
-}
-
-export interface IntrinsicElements {
- // Allow any element, but prefer known elements
- [elemName: string]: any;
- // Known elements
- ActionRow: { children: any | any[] };
- Button: {
- label: string;
- customId: string;
- style?: number;
- emoji?: PartialEmoji;
- disabled?: boolean;
- };
- Container: { color?: string; accent?: number; spoiler?: boolean; children: any | any[] };
- TextDisplay: { content: string };
-}
+import {
+ type ActionRow,
+ type Button,
+ type ChannelSelectMenu,
+ type MentionableSelectMenu,
+ type PartialEmoji,
+ type RoleSelectMenu,
+ type StringSelectMenu,
+ type TextInput,
+ type UserSelectMenu,
+ type LabelComponent,
+ type ContainerComponent,
+ type TextDisplayComponent,
+ type SectionComponent,
+ type MediaGalleryComponent,
+ type SeparatorComponent,
+ type FileComponent,
+ type InteractionButton,
+ type URLButton,
+ type PremiumButton,
+ type ThumbnailComponent,
+} from '@projectdysnomia/dysnomia';
+
+export type Component =
+ | ActionRow
+ | Button
+ | StringSelectMenu
+ | UserSelectMenu
+ | RoleSelectMenu
+ | MentionableSelectMenu
+ | ChannelSelectMenu
+ | TextInput
+ | LabelComponent
+ | ContainerComponent
+ | TextDisplayComponent
+ | SectionComponent
+ | MediaGalleryComponent
+ | SeparatorComponent
+ | FileComponent
+ | InteractionButton
+ | URLButton
+ | PremiumButton
+ | ThumbnailComponent;
+
+export type Element = Component | Promise;
+
+export interface ElementClass {
+ render: any;
+}
+
+export interface ElementAttributesProperty {
+ props: {};
+}
+
+export interface IntrinsicElements {
+ // Allow any element, but prefer known elements
+ // [elemName: string]: any;
+ // Known elements (forcing re-parse)
+ actionRow: { children: any | any[] };
+ button: {
+ label: string;
+ customId: string;
+ style: number;
+ emoji?: PartialEmoji;
+ disabled?: boolean;
+ };
+ container: { color?: string; accent?: number; spoiler?: boolean; children: any | any[] };
+ textDisplay: { content: string };
+}
diff --git a/packages/discord/src/jsx/runtime.ts b/packages/discord/src/jsx/runtime.ts
index 43e971b..08f5e61 100644
--- a/packages/discord/src/jsx/runtime.ts
+++ b/packages/discord/src/jsx/runtime.ts
@@ -1,30 +1,52 @@
-export function jsx(type: any, props: Record) {
- console.log('JSX', type, props);
- if (typeof type === 'function') {
- return type(props);
- }
- return {
- type,
- props,
- };
-}
-
-export function jsxDEV(
- type: any,
- props: Record,
- key: string | number | symbol,
- isStaticChildren: boolean,
- source: any,
- self: any,
-) {
- console.log('JSX DEV', type, props);
- if (typeof type === 'function') {
- return type(props);
- }
- return {
- type,
- props: { ...props, key },
- _source: source,
- _self: self,
- };
-}
+import { ActionRow } from './components/action-row';
+import { Button } from './components/button';
+import { Container } from './components/container';
+import { TextDisplay } from './components/text-display';
+
+const intrinsicComponentMap: Record any> = {
+ actionRow: ActionRow,
+ button: Button,
+ container: Container,
+ textDisplay: TextDisplay,
+};
+
+export function jsx(type: any, props: Record) {
+ console.log('JSX', type, props);
+ if (typeof type === 'function') {
+ return type(props);
+ }
+
+ if (typeof type === 'string' && intrinsicComponentMap[type]) {
+ return intrinsicComponentMap[type](props);
+ }
+
+ return {
+ type,
+ props,
+ };
+}
+
+export function jsxDEV(
+ type: any,
+ props: Record,
+ key: string | number | symbol,
+ isStaticChildren: boolean,
+ source: any,
+ self: any,
+) {
+ console.log('JSX DEV', type, props);
+ if (typeof type === 'function') {
+ return type(props);
+ }
+
+ if (typeof type === 'string' && intrinsicComponentMap[type]) {
+ return intrinsicComponentMap[type](props);
+ }
+
+ return {
+ type,
+ props: { ...props, key },
+ _source: source,
+ _self: self,
+ };
+}
diff --git a/packages/discord/src/jsx/types.d.ts b/packages/discord/src/jsx/types.d.ts
index 6710220..0dcdcb4 100644
--- a/packages/discord/src/jsx/types.d.ts
+++ b/packages/discord/src/jsx/types.d.ts
@@ -1,8 +1,8 @@
-import type { Component, IntrinsicElements as StarKittenIntrinsicElements } from './jsx';
-
-declare global {
- namespace JSX {
- type Element = Component;
- interface IntrinsicElements extends StarKittenIntrinsicElements {}
- }
-}
+import type { Component, IntrinsicElements as StarKittenIntrinsicElements } from './jsx';
+
+declare global {
+ namespace JSX {
+ type Element = Component;
+ interface IntrinsicElements extends StarKittenIntrinsicElements {}
+ }
+}
diff --git a/packages/discord/src/locales.ts b/packages/discord/src/locales.ts
index 300f294..5446668 100644
--- a/packages/discord/src/locales.ts
+++ b/packages/discord/src/locales.ts
@@ -1,26 +1,26 @@
-export type Locales = 'en' | 'ru' | 'de' | 'fr' | 'ja' | 'es' | 'zh' | 'ko';
-export const ALL_LOCALES: Locales[] = ['en', 'ru', 'de', 'fr', 'ja', 'es', 'zh', 'ko'];
-export const DEFAULT_LOCALE: Locales = 'en';
-export const LOCALE_NAMES: { [key in Locales]: string } = {
- en: 'English',
- ru: 'Русский',
- de: 'Deutsch',
- fr: 'Français',
- ja: '日本語',
- es: 'Español',
- zh: '中文',
- ko: '한국어',
-};
-export function toDiscordLocale(locale: Locales): string {
- switch (locale) {
- case 'en': return 'en-US';
- case 'ru': return 'ru';
- case 'de': return 'de';
- case 'fr': return 'fr';
- case 'ja': return 'ja';
- case 'es': return 'es-ES';
- case 'zh': return 'zh-CN';
- case 'ko': return 'ko';
- default: return 'en-US';
- }
+export type Locales = 'en' | 'ru' | 'de' | 'fr' | 'ja' | 'es' | 'zh' | 'ko';
+export const ALL_LOCALES: Locales[] = ['en', 'ru', 'de', 'fr', 'ja', 'es', 'zh', 'ko'];
+export const DEFAULT_LOCALE: Locales = 'en';
+export const LOCALE_NAMES: { [key in Locales]: string } = {
+ en: 'English',
+ ru: 'Русский',
+ de: 'Deutsch',
+ fr: 'Français',
+ ja: '日本語',
+ es: 'Español',
+ zh: '中文',
+ ko: '한국어',
+};
+export function toDiscordLocale(locale: Locales): string {
+ switch (locale) {
+ case 'en': return 'en-US';
+ case 'ru': return 'ru';
+ case 'de': return 'de';
+ case 'fr': return 'fr';
+ case 'ja': return 'ja';
+ case 'es': return 'es-ES';
+ case 'zh': return 'zh-CN';
+ case 'ko': return 'ko';
+ default: return 'en-US';
+ }
}
\ No newline at end of file
diff --git a/packages/discord/src/pages/index.ts b/packages/discord/src/pages/index.ts
index 77bac48..0cfb168 100644
--- a/packages/discord/src/pages/index.ts
+++ b/packages/discord/src/pages/index.ts
@@ -1,2 +1,2 @@
-export * from './pages';
-export * from './subroutes';
+export * from './pages';
+export * from './subroutes';
diff --git a/packages/discord/src/pages/pages.ts b/packages/discord/src/pages/pages.ts
index 8e81250..9a01c0c 100644
--- a/packages/discord/src/pages/pages.ts
+++ b/packages/discord/src/pages/pages.ts
@@ -1,166 +1,166 @@
-import { isAutocomplete, isMessageComponent, isModalSubmit, isPing, type CommandContext } from '@commands';
-import {
- Constants,
- type InteractionContentEdit,
- type InteractionModalContent,
- type CommandInteraction,
- type ComponentInteraction,
- type ModalSubmitInteraction,
- Interaction,
-} from '@projectdysnomia/dysnomia';
-
-export type PagesInteraction = CommandInteraction | ModalSubmitInteraction | ComponentInteraction;
-export enum PageType {
- MODAL = 'modal',
- MESSAGE = 'message',
- FOLLOWUP = 'followup',
-}
-
-export interface Page {
- key: string;
- type?: PageType; // defaults to MESSAGE
- followUpFlags?: number;
- render: (
- ctx: PageContext,
- ) => (InteractionModalContent | InteractionContentEdit) | Promise;
-}
-
-export interface PagesOptions {
- pages: Record>;
- initialPage?: string;
- timeout?: number; // in seconds
- ephemeral?: boolean; // whether the initial message should be ephemeral
- useEmbeds?: boolean; // will not enable components v2
- initialStateData?: T; // initial state to merge with default state
- router?: (ctx: PageContext) => string; // function to determine the next page key
-}
-
-export interface PageState {
- currentPage: string;
- timeoutAt: number; // timestamp in ms
- lastInteractionAt?: number; // timestamp in ms
- messageId?: string;
- channelId?: string;
- data: T;
-}
-
-export interface PageContext {
- state: PageState;
- custom_id: string; // current interaction custom_id
- interaction: PagesInteraction;
- goToPage: (pageKey: string) => Promise;
-}
-
-function createPageContext(interaction: PagesInteraction, options: PagesOptions, state: PageState): PageContext {
- return {
- state,
- interaction,
- custom_id: 'custom_id' in interaction.data ? interaction.data.custom_id : (options.initialPage ?? 'root'),
- goToPage: (pageKey: string) => {
- const page = options.pages[pageKey];
- this.state.currentPage = pageKey;
- if (!page) {
- throw new Error(`Page with key "${pageKey}" not found`);
- }
- return page.render(createPageContext(interaction, options, { ...state, currentPage: pageKey })) as Promise;
- },
- };
-}
-
-function defaultPageState(options: PagesOptions): PageState {
- const timeoutAt = options.timeout ? Date.now() + options.timeout * 1000 : Infinity;
- return {
- currentPage: options.initialPage ?? options.pages[0].key,
- timeoutAt,
- lastInteractionAt: Date.now(),
- data: options.initialStateData ?? ({} as T),
- };
-}
-
-function getPageState(options: PagesOptions, cmdCtx: CommandContext & { state: { __pageState?: PageState } }) {
- const cmdState = cmdCtx.state;
- if ('__pageState' in cmdState && cmdState.__pageState) {
- return cmdState.__pageState as PageState;
- }
- cmdState.__pageState = defaultPageState(options);
- return cmdState.__pageState as PageState;
-}
-
-function validateOptions(options: PagesOptions) {
- const keys = Object.keys(options.pages);
- const uniqueKeys = new Set(keys);
- if (uniqueKeys.size !== keys.length) {
- throw new Error('Duplicate page keys found');
- }
-}
-
-function getFlags(options: PagesOptions) {
- let flags = 0;
- if (options.ephemeral) {
- flags |= Constants.MessageFlags.EPHEMERAL;
- }
- if (!options.useEmbeds) {
- flags |= Constants.MessageFlags.IS_COMPONENTS_V2;
- }
- return flags;
-}
-
-export async function usePages(options: PagesOptions, interaction: Interaction, cmdCtx: CommandContext) {
- if (isAutocomplete(interaction) || isPing(interaction)) {
- throw new Error('usePages cannot be used with autocomplete or ping interactions');
- }
- const pagesInteraction = interaction as PagesInteraction;
- validateOptions(options);
- const pageState = getPageState(options, cmdCtx);
- const pageContext = createPageContext(pagesInteraction, options, pageState);
- const pageKey =
- options.router ? options.router(pageContext) : (pageContext.custom_id ?? options.initialPage ?? Object.keys(options.pages)[0]);
- // if we have subroutes, we only want the main route from the page key
- const page = options.pages[pageKey.split(':')[0]] ?? options.pages[0];
- pageContext.state.currentPage = page.key;
-
- if (page.type === PageType.MODAL && !isModalSubmit(pagesInteraction)) {
- // we don't defer modals and can't respond to a modal with a modal.
- const cnt = page.render(pageContext);
- const content = isPromise(cnt) ? await cnt : cnt;
- return await pagesInteraction.createModal(content as InteractionModalContent);
- }
-
- if (page.type === PageType.FOLLOWUP) {
- if (!pageState.messageId) {
- throw new Error('Cannot send a followup message before an initial message has been sent');
- }
- const flags = page.type === PageType.FOLLOWUP ? (page.followUpFlags ?? getFlags(options)) : getFlags(options);
- await pagesInteraction.defer(flags);
- const cnt = page.render(pageContext);
- const content = isPromise(cnt) ? await cnt : cnt;
- return await pagesInteraction.createFollowup({
- flags,
- ...(content as InteractionContentEdit),
- });
- }
-
- if (pageState.messageId && isMessageComponent(pagesInteraction)) {
- await pagesInteraction.deferUpdate();
- const cnt = page.render(pageContext);
- const content = isPromise(cnt) ? await cnt : cnt;
- return await pagesInteraction.editMessage(pageState.messageId, content as InteractionContentEdit);
- }
-
- {
- await pagesInteraction.defer(getFlags(options));
- const cnt = page.render(pageContext);
- const content = isPromise(cnt) ? await cnt : cnt;
- const message = await pagesInteraction.createFollowup({
- flags: getFlags(options),
- ...(content as InteractionContentEdit),
- });
- pageState.messageId = message.id;
- pageState.channelId = message.channel?.id;
- return message;
- }
-}
-
-function isPromise(value: T | Promise): value is Promise {
- return typeof (value as Promise)?.then === 'function';
-}
+import { isAutocomplete, isMessageComponent, isModalSubmit, isPing, type CommandContext } from '@commands';
+import {
+ Constants,
+ type InteractionContentEdit,
+ type InteractionModalContent,
+ type CommandInteraction,
+ type ComponentInteraction,
+ type ModalSubmitInteraction,
+ Interaction,
+} from '@projectdysnomia/dysnomia';
+
+export type PagesInteraction = CommandInteraction | ModalSubmitInteraction | ComponentInteraction;
+export enum PageType {
+ MODAL = 'modal',
+ MESSAGE = 'message',
+ FOLLOWUP = 'followup',
+}
+
+export interface Page {
+ key: string;
+ type?: PageType; // defaults to MESSAGE
+ followUpFlags?: number;
+ render: (
+ ctx: PageContext,
+ ) => (InteractionModalContent | InteractionContentEdit) | Promise;
+}
+
+export interface PagesOptions {
+ pages: Record>;
+ initialPage?: string;
+ timeout?: number; // in seconds
+ ephemeral?: boolean; // whether the initial message should be ephemeral
+ useEmbeds?: boolean; // will not enable components v2
+ initialStateData?: T; // initial state to merge with default state
+ router?: (ctx: PageContext) => string; // function to determine the next page key
+}
+
+export interface PageState {
+ currentPage: string;
+ timeoutAt: number; // timestamp in ms
+ lastInteractionAt?: number; // timestamp in ms
+ messageId?: string;
+ channelId?: string;
+ data: T;
+}
+
+export interface PageContext {
+ state: PageState;
+ custom_id: string; // current interaction custom_id
+ interaction: PagesInteraction;
+ goToPage: (pageKey: string) => Promise;
+}
+
+function createPageContext(interaction: PagesInteraction, options: PagesOptions, state: PageState): PageContext {
+ return {
+ state,
+ interaction,
+ custom_id: 'custom_id' in interaction.data ? interaction.data.custom_id : (options.initialPage ?? 'root'),
+ goToPage: (pageKey: string) => {
+ const page = options.pages[pageKey];
+ this.state.currentPage = pageKey;
+ if (!page) {
+ throw new Error(`Page with key "${pageKey}" not found`);
+ }
+ return page.render(createPageContext(interaction, options, { ...state, currentPage: pageKey })) as Promise;
+ },
+ };
+}
+
+function defaultPageState(options: PagesOptions): PageState {
+ const timeoutAt = options.timeout ? Date.now() + options.timeout * 1000 : Infinity;
+ return {
+ currentPage: options.initialPage ?? options.pages[0].key,
+ timeoutAt,
+ lastInteractionAt: Date.now(),
+ data: options.initialStateData ?? ({} as T),
+ };
+}
+
+function getPageState(options: PagesOptions, cmdCtx: CommandContext & { state: { __pageState?: PageState } }) {
+ const cmdState = cmdCtx.state;
+ if ('__pageState' in cmdState && cmdState.__pageState) {
+ return cmdState.__pageState as PageState;
+ }
+ cmdState.__pageState = defaultPageState(options);
+ return cmdState.__pageState as PageState;
+}
+
+function validateOptions(options: PagesOptions) {
+ const keys = Object.keys(options.pages);
+ const uniqueKeys = new Set(keys);
+ if (uniqueKeys.size !== keys.length) {
+ throw new Error('Duplicate page keys found');
+ }
+}
+
+function getFlags(options: PagesOptions) {
+ let flags = 0;
+ if (options.ephemeral) {
+ flags |= Constants.MessageFlags.EPHEMERAL;
+ }
+ if (!options.useEmbeds) {
+ flags |= Constants.MessageFlags.IS_COMPONENTS_V2;
+ }
+ return flags;
+}
+
+export async function usePages(options: PagesOptions, interaction: Interaction, cmdCtx: CommandContext) {
+ if (isAutocomplete(interaction) || isPing(interaction)) {
+ throw new Error('usePages cannot be used with autocomplete or ping interactions');
+ }
+ const pagesInteraction = interaction as PagesInteraction;
+ validateOptions(options);
+ const pageState = getPageState(options, cmdCtx);
+ const pageContext = createPageContext(pagesInteraction, options, pageState);
+ const pageKey =
+ options.router ? options.router(pageContext) : (pageContext.custom_id ?? options.initialPage ?? Object.keys(options.pages)[0]);
+ // if we have subroutes, we only want the main route from the page key
+ const page = options.pages[pageKey.split(':')[0]] ?? options.pages[0];
+ pageContext.state.currentPage = page.key;
+
+ if (page.type === PageType.MODAL && !isModalSubmit(pagesInteraction)) {
+ // we don't defer modals and can't respond to a modal with a modal.
+ const cnt = page.render(pageContext);
+ const content = isPromise(cnt) ? await cnt : cnt;
+ return await pagesInteraction.createModal(content as InteractionModalContent);
+ }
+
+ if (page.type === PageType.FOLLOWUP) {
+ if (!pageState.messageId) {
+ throw new Error('Cannot send a followup message before an initial message has been sent');
+ }
+ const flags = page.type === PageType.FOLLOWUP ? (page.followUpFlags ?? getFlags(options)) : getFlags(options);
+ await pagesInteraction.defer(flags);
+ const cnt = page.render(pageContext);
+ const content = isPromise(cnt) ? await cnt : cnt;
+ return await pagesInteraction.createFollowup({
+ flags,
+ ...(content as InteractionContentEdit),
+ });
+ }
+
+ if (pageState.messageId && isMessageComponent(pagesInteraction)) {
+ await pagesInteraction.deferUpdate();
+ const cnt = page.render(pageContext);
+ const content = isPromise(cnt) ? await cnt : cnt;
+ return await pagesInteraction.editMessage(pageState.messageId, content as InteractionContentEdit);
+ }
+
+ {
+ await pagesInteraction.defer(getFlags(options));
+ const cnt = page.render(pageContext);
+ const content = isPromise(cnt) ? await cnt : cnt;
+ const message = await pagesInteraction.createFollowup({
+ flags: getFlags(options),
+ ...(content as InteractionContentEdit),
+ });
+ pageState.messageId = message.id;
+ pageState.channelId = message.channel?.id;
+ return message;
+ }
+}
+
+function isPromise(value: T | Promise): value is Promise {
+ return typeof (value as Promise)?.then === 'function';
+}
diff --git a/packages/discord/src/pages/subroutes.ts b/packages/discord/src/pages/subroutes.ts
index 160d819..5950af8 100644
--- a/packages/discord/src/pages/subroutes.ts
+++ b/packages/discord/src/pages/subroutes.ts
@@ -1,99 +1,99 @@
-import type { PartialEmoji } from '@projectdysnomia/dysnomia';
-import { createActionRow, createButton, createMediaGallery, type ButtonOptions, type ContainerItems } from '@components';
-import type { PageContext } from './pages';
-
-export function getSubrouteKey(prefix: string, subroutes: string[]) {
- return `${prefix}:${subroutes.join(':')}`;
-}
-
-export function parseSubrouteKey(key: string, expectedPrefix: string, expectedLength: number, defaults: string[] = []) {
- const parts = key.split(':');
- if (parts[0] !== expectedPrefix) {
- throw new Error(`Unexpected prefix: ${parts[0]}`);
- }
- if (parts.length - 1 < expectedLength && defaults.length) {
- // fill in defaults
- parts.push(...defaults.slice(parts.length - 1));
- }
- if (parts.length !== expectedLength + 1) {
- throw new Error(`Expected ${expectedLength} subroutes, but got ${parts.length - 1}`);
- }
- return parts.slice(1);
-}
-
-export function renderSubrouteButtons(
- currentSubroute: string,
- subRoutes: string[],
- subrouteIndex: number,
- prefix: string,
- subroutes: { label: string; value: string; emoji?: PartialEmoji }[],
- options?: Partial,
-) {
- return subroutes
- .filter((sr) => sr !== undefined)
- .map(({ label, value, emoji }) => {
- const routes = [...subRoutes];
- routes[subrouteIndex] = currentSubroute == value ? '_' : value;
- return createButton(label, getSubrouteKey(prefix, routes), {
- ...options,
- disabled: value === currentSubroute,
- emoji,
- });
- });
-}
-
-export interface SubrouteOptions {
- label: string;
- value: string;
- emoji?: PartialEmoji;
-}
-
-export function renderSubroutes(
- context: PageContext,
- prefix: string,
- subroutes: (SubrouteOptions & {
- banner?: string;
- actionRowPosition?: 'top' | 'bottom';
- })[][],
- render: (currentSubroute: string, ctx: PageContext) => CType,
- btnOptions?: Partial,
- defaultSubroutes?: string[], // if not provided, will use the first option of each subroute
-): CType[] {
- const currentSubroutes = parseSubrouteKey(
- context.custom_id,
- prefix,
- subroutes.length,
- defaultSubroutes || subroutes.map((s) => s[0].value),
- );
-
- const components = subroutes
- .filter((sr) => sr.length > 0)
- .map((srOpts, index) => {
- const opts = srOpts.filter((sr) => sr !== undefined);
- if (opts.length === 0) return undefined;
- // find the current subroute, or default to the first
- const sri = opts.findIndex((s) => s.value === currentSubroutes[index]);
- const current = opts[sri] || opts[0];
- const components = [];
-
- const actionRow = createActionRow(...renderSubrouteButtons(current.value, currentSubroutes, index, prefix, opts, btnOptions));
-
- if (current.banner) {
- components.push(createMediaGallery({ url: current.banner }));
- }
-
- if (!current.actionRowPosition || current.actionRowPosition === 'top') {
- components.push(actionRow);
- }
-
- components.push(render(current.value, context));
-
- if (current.actionRowPosition === 'bottom') {
- components.push(actionRow);
- }
- return components;
- })
- .flat()
- .filter((c) => c !== undefined);
- return components;
-}
+import type { PartialEmoji } from '@projectdysnomia/dysnomia';
+import { createActionRow, createButton, createMediaGallery, type ButtonOptions, type ContainerItems } from '@components';
+import type { PageContext } from './pages';
+
+export function getSubrouteKey(prefix: string, subroutes: string[]) {
+ return `${prefix}:${subroutes.join(':')}`;
+}
+
+export function parseSubrouteKey(key: string, expectedPrefix: string, expectedLength: number, defaults: string[] = []) {
+ const parts = key.split(':');
+ if (parts[0] !== expectedPrefix) {
+ throw new Error(`Unexpected prefix: ${parts[0]}`);
+ }
+ if (parts.length - 1 < expectedLength && defaults.length) {
+ // fill in defaults
+ parts.push(...defaults.slice(parts.length - 1));
+ }
+ if (parts.length !== expectedLength + 1) {
+ throw new Error(`Expected ${expectedLength} subroutes, but got ${parts.length - 1}`);
+ }
+ return parts.slice(1);
+}
+
+export function renderSubrouteButtons(
+ currentSubroute: string,
+ subRoutes: string[],
+ subrouteIndex: number,
+ prefix: string,
+ subroutes: { label: string; value: string; emoji?: PartialEmoji }[],
+ options?: Partial,
+) {
+ return subroutes
+ .filter((sr) => sr !== undefined)
+ .map(({ label, value, emoji }) => {
+ const routes = [...subRoutes];
+ routes[subrouteIndex] = currentSubroute == value ? '_' : value;
+ return createButton(label, getSubrouteKey(prefix, routes), {
+ ...options,
+ disabled: value === currentSubroute,
+ emoji,
+ });
+ });
+}
+
+export interface SubrouteOptions {
+ label: string;
+ value: string;
+ emoji?: PartialEmoji;
+}
+
+export function renderSubroutes(
+ context: PageContext,
+ prefix: string,
+ subroutes: (SubrouteOptions & {
+ banner?: string;
+ actionRowPosition?: 'top' | 'bottom';
+ })[][],
+ render: (currentSubroute: string, ctx: PageContext) => CType,
+ btnOptions?: Partial,
+ defaultSubroutes?: string[], // if not provided, will use the first option of each subroute
+): CType[] {
+ const currentSubroutes = parseSubrouteKey(
+ context.custom_id,
+ prefix,
+ subroutes.length,
+ defaultSubroutes || subroutes.map((s) => s[0].value),
+ );
+
+ const components = subroutes
+ .filter((sr) => sr.length > 0)
+ .map((srOpts, index) => {
+ const opts = srOpts.filter((sr) => sr !== undefined);
+ if (opts.length === 0) return undefined;
+ // find the current subroute, or default to the first
+ const sri = opts.findIndex((s) => s.value === currentSubroutes[index]);
+ const current = opts[sri] || opts[0];
+ const components = [];
+
+ const actionRow = createActionRow(...renderSubrouteButtons(current.value, currentSubroutes, index, prefix, opts, btnOptions));
+
+ if (current.banner) {
+ components.push(createMediaGallery({ url: current.banner }));
+ }
+
+ if (!current.actionRowPosition || current.actionRowPosition === 'top') {
+ components.push(actionRow);
+ }
+
+ components.push(render(current.value, context));
+
+ if (current.actionRowPosition === 'bottom') {
+ components.push(actionRow);
+ }
+ return components;
+ })
+ .flat()
+ .filter((c) => c !== undefined);
+ return components;
+}
diff --git a/packages/discord/tsconfig.json b/packages/discord/tsconfig.json
index 54142bc..82f2563 100644
--- a/packages/discord/tsconfig.json
+++ b/packages/discord/tsconfig.json
@@ -1,40 +1,15 @@
{
+ "extends": "../../tsconfig.base.json",
"compilerOptions": {
- // Enable latest features
- "lib": ["ESNext"],
- "target": "ESNext",
- "module": "ESNext",
- "moduleDetection": "force",
+ "composite": true,
"jsx": "react-jsx",
"jsxImportSource": "@star-kitten/discord",
- "allowJs": true,
-
- // Bundler mode
- "moduleResolution": "bundler",
- "allowImportingTsExtensions": true,
- "verbatimModuleSyntax": true,
- "noEmit": true,
-
- // Best practices
- "strict": false,
- "skipLibCheck": true,
- "noFallthroughCasesInSwitch": true,
-
- // Some stricter flags (disabled by default)
- "noUnusedLocals": false,
- "noUnusedParameters": false,
- "noPropertyAccessFromIndexSignature": false,
-
- // Paths
"paths": {
"@*": ["./src/*"],
"@types": ["./types/*"]
},
-
- "experimentalDecorators": true,
- "emitDecoratorMetadata": true,
-
- "typeRoots": ["src/types", "./node_modules/@types"]
+ "typeRoots": ["src/types", "./node_modules/@types"],
+ "types": []
},
"include": ["src", "types", "src/jsx/types.d.ts"],
"exclude": ["node_modules", "dist", "build", "**/*.test.ts"]
diff --git a/packages/discord/tsdown.config.ts b/packages/discord/tsdown.config.ts
index 858f0e5..9a73187 100644
--- a/packages/discord/tsdown.config.ts
+++ b/packages/discord/tsdown.config.ts
@@ -9,6 +9,8 @@ export default defineConfig([
'./src/pages/index.ts',
'./src/common/index.ts',
'./src/jsx/index.ts',
+ './src/jsx/jsx-runtime.ts',
+ './src/jsx/jsx-dev-runtime.ts',
],
platform: 'node',
dts: true,
diff --git a/packages/discord/types/index.d.ts b/packages/discord/types/index.d.ts
index a799770..2268c2b 100644
--- a/packages/discord/types/index.d.ts
+++ b/packages/discord/types/index.d.ts
@@ -1,65 +1,65 @@
-import {
- type ActionRow,
- type Button,
- type ChannelSelectMenu,
- type GuildChannelTypes,
- type MentionableSelectMenu,
- type PartialEmoji,
- type RoleSelectMenu,
- type StringSelectMenu,
- type TextInput,
- type UserSelectMenu,
- type LabelComponent,
- type ContainerComponent,
- type TextDisplayComponent,
- type SectionComponent,
- type MediaGalleryComponent,
- type SeparatorComponent,
- type FileComponent,
- type InteractionButton,
- type URLButton,
- type PremiumButton,
- type ThumbnailComponent,
-} from '@projectdysnomia/dysnomia';
-
-declare namespace JSX {
- type Component =
- | Button
- | StringSelectMenu
- | UserSelectMenu
- | RoleSelectMenu
- | MentionableSelectMenu
- | ChannelSelectMenu
- | TextInput
- | LabelComponent
- | ContainerComponent
- | TextDisplayComponent
- | SectionComponent
- | MediaGalleryComponent
- | SeparatorComponent
- | FileComponent
- | InteractionButton
- | URLButton
- | PremiumButton
- | ThumbnailComponent;
-
- type Element = Component | Promise;
-
- interface ElementClass {
- render: any;
- }
-
- interface ElementAttributesProperty {
- props: {};
- }
-
- interface IntrinsicElements {
- // Allow any element, but prefer known elements
- [elemName: string]: any;
- // Known elements
- ActionRow: { children: any | any[] };
- Button: { label: string; customId: string; style?: number; emoji?: PartialEmoji; disabled?: boolean };
- Container: { accent?: number; spoiler?: boolean; children: any | any[] };
- TextDisplay: { content: string };
- }
-}
+import {
+ type ActionRow,
+ type Button,
+ type ChannelSelectMenu,
+ type GuildChannelTypes,
+ type MentionableSelectMenu,
+ type PartialEmoji,
+ type RoleSelectMenu,
+ type StringSelectMenu,
+ type TextInput,
+ type UserSelectMenu,
+ type LabelComponent,
+ type ContainerComponent,
+ type TextDisplayComponent,
+ type SectionComponent,
+ type MediaGalleryComponent,
+ type SeparatorComponent,
+ type FileComponent,
+ type InteractionButton,
+ type URLButton,
+ type PremiumButton,
+ type ThumbnailComponent,
+} from '@projectdysnomia/dysnomia';
+
+declare namespace JSX {
+ type Component =
+ | Button
+ | StringSelectMenu
+ | UserSelectMenu
+ | RoleSelectMenu
+ | MentionableSelectMenu
+ | ChannelSelectMenu
+ | TextInput
+ | LabelComponent
+ | ContainerComponent
+ | TextDisplayComponent
+ | SectionComponent
+ | MediaGalleryComponent
+ | SeparatorComponent
+ | FileComponent
+ | InteractionButton
+ | URLButton
+ | PremiumButton
+ | ThumbnailComponent;
+
+ type Element = Component | Promise;
+
+ interface ElementClass {
+ render: any;
+ }
+
+ interface ElementAttributesProperty {
+ props: {};
+ }
+
+ interface IntrinsicElements {
+ // Allow any element, but prefer known elements
+ [elemName: string]: any;
+ // Known elements
+ ActionRow: { children: any | any[] };
+ Button: { label: string; customId: string; style?: number; emoji?: PartialEmoji; disabled?: boolean };
+ Container: { accent?: number; spoiler?: boolean; children: any | any[] };
+ TextDisplay: { content: string };
+ }
+}
diff --git a/packages/eve-bot/package.json b/packages/eve-bot/package.json
index 9caf31b..8040778 100644
--- a/packages/eve-bot/package.json
+++ b/packages/eve-bot/package.json
@@ -16,7 +16,8 @@
"@projectdysnomia/dysnomia": "github:projectdysnomia/dysnomia#dev",
"@star-kitten/discord": "workspace:^0.0.0",
"@star-kitten/eve": "workspace:^0.0.0",
- "@star-kitten/util": "workspace:^0.0.0"
+ "@star-kitten/util": "workspace:^0.0.0",
+ "mkdirp": "^3.0.1"
},
"scripts": {
"dev": "bunx dotenvx run -f .env.development -- bun run --watch src/main.ts",
diff --git a/packages/eve-bot/src/commands/appraise/appraise.command.ts b/packages/eve-bot/src/commands/appraise/appraise.command.ts
index 1e47b46..e3e9a3e 100644
--- a/packages/eve-bot/src/commands/appraise/appraise.command.ts
+++ b/packages/eve-bot/src/commands/appraise/appraise.command.ts
@@ -1,90 +1,90 @@
-import { Constants, type ChatInputApplicationCommandStructure } from '@projectdysnomia/dysnomia';
-import { appraiseItems, type Appraisal } from '@star-kitten/eve/third-party/janice.js';
-import { isModalSubmit } from '@star-kitten/discord/commands';
-import { componentHasIdPrefix, isModalLabel, isModalSelect, isModalTextInput } from '@star-kitten/discord/components';
-import type { CommandContext, ExecutableInteraction } from '@star-kitten/discord/commands';
-import { PageType, usePages } from '@star-kitten/discord/pages';
-import { renderAppraisal } from './renderAppraisal';
-import { renderAppraisalModal } from './renderAppraisalModal';
-
-const definition: ChatInputApplicationCommandStructure = {
- type: Constants.ApplicationCommandTypes.CHAT_INPUT,
- name: 'appraise',
- nameLocalizations: {
- de: 'bewerten',
- 'es-ES': 'tasar',
- fr: 'estimer',
- ja: '査定',
- ko: '감정',
- ru: 'оценить',
- 'zh-CN': '评估',
- },
- description: 'Evaluate the worth of your space junk',
- descriptionLocalizations: {
- de: 'Bewerten Sie den Wert Ihres Weltraumschrotts',
- 'es-ES': 'Evalúa el valor de tu chatarra espacial',
- fr: 'Évaluez la valeur de vos déchets spatiaux',
- ja: 'あなたの宇宙のガラクタの価値を評価します',
- ko: '우주 쓰레기의 가치를 평가하십시오',
- ru: 'Оцените стоимость вашего космического мусора',
- 'zh-CN': '评估您宇宙垃圾的价值',
- },
-};
-
-export interface AppraisalState {
- appraisal?: Appraisal;
-}
-
-async function execute(interaction: ExecutableInteraction, ctx: CommandContext) {
- return await usePages(
- {
- pages: {
- appraiseModal: {
- key: 'appraiseModal',
- type: PageType.MODAL,
- render: async () => renderAppraisalModal(interaction),
- },
- appraisalResult: {
- key: 'appraisalResult',
- render: async (pageCtx) => {
- if (!isModalSubmit(interaction)) {
- throw new Error('Expected a modal submit interaction for appraisalResult page');
- }
- let marketId = 2; // Default to Jita
- let items = '';
-
- interaction.data.components.forEach((comp) => {
- if (isModalLabel(comp)) {
- if (isModalSelect(comp.component) && componentHasIdPrefix(comp.component, `market`)) {
- marketId = Number.parseInt(comp.component.values[0]) || marketId;
- } else if (isModalTextInput(comp.component) && componentHasIdPrefix(comp.component, `input`)) {
- items = comp.component.value || items;
- }
- }
- });
-
- const appraisal = await appraiseItems(items, marketId);
- pageCtx.state.data.appraisal = appraisal;
- return renderAppraisal(appraisal, pageCtx, interaction);
- },
- },
- share: {
- key: 'share',
- type: PageType.FOLLOWUP,
- followUpFlags: Constants.MessageFlags.IS_COMPONENTS_V2,
- render: async (pageCtx) => renderAppraisal(pageCtx.state.data.appraisal!, pageCtx, interaction),
- },
- },
- initialPage: 'appraiseModal',
- timeout: 300, // 5 minutes
- ephemeral: true,
- },
- interaction,
- ctx,
- );
-}
-
-export default {
- definition,
- execute,
-};
+import { Constants, type ChatInputApplicationCommandStructure } from '@projectdysnomia/dysnomia';
+import { appraiseItems, type Appraisal } from '@star-kitten/eve/third-party/janice.js';
+import { isModalSubmit } from '@star-kitten/discord/commands';
+import { componentHasIdPrefix, isModalLabel, isModalSelect, isModalTextInput } from '@star-kitten/discord/components';
+import type { CommandContext, ExecutableInteraction } from '@star-kitten/discord/commands';
+import { PageType, usePages } from '@star-kitten/discord/pages';
+import { renderAppraisal } from './renderAppraisal';
+import { renderAppraisalModal } from './renderAppraisalModal';
+
+const definition: ChatInputApplicationCommandStructure = {
+ type: Constants.ApplicationCommandTypes.CHAT_INPUT,
+ name: 'appraise',
+ nameLocalizations: {
+ de: 'bewerten',
+ 'es-ES': 'tasar',
+ fr: 'estimer',
+ ja: '査定',
+ ko: '감정',
+ ru: 'оценить',
+ 'zh-CN': '评估',
+ },
+ description: 'Evaluate the worth of your space junk',
+ descriptionLocalizations: {
+ de: 'Bewerten Sie den Wert Ihres Weltraumschrotts',
+ 'es-ES': 'Evalúa el valor de tu chatarra espacial',
+ fr: 'Évaluez la valeur de vos déchets spatiaux',
+ ja: 'あなたの宇宙のガラクタの価値を評価します',
+ ko: '우주 쓰레기의 가치를 평가하십시오',
+ ru: 'Оцените стоимость вашего космического мусора',
+ 'zh-CN': '评估您宇宙垃圾的价值',
+ },
+};
+
+export interface AppraisalState {
+ appraisal?: Appraisal;
+}
+
+async function execute(interaction: ExecutableInteraction, ctx: CommandContext) {
+ return await usePages(
+ {
+ pages: {
+ appraiseModal: {
+ key: 'appraiseModal',
+ type: PageType.MODAL,
+ render: async () => renderAppraisalModal(interaction),
+ },
+ appraisalResult: {
+ key: 'appraisalResult',
+ render: async (pageCtx) => {
+ if (!isModalSubmit(interaction)) {
+ throw new Error('Expected a modal submit interaction for appraisalResult page');
+ }
+ let marketId = 2; // Default to Jita
+ let items = '';
+
+ interaction.data.components.forEach((comp) => {
+ if (isModalLabel(comp)) {
+ if (isModalSelect(comp.component) && componentHasIdPrefix(comp.component, `market`)) {
+ marketId = Number.parseInt(comp.component.values[0]) || marketId;
+ } else if (isModalTextInput(comp.component) && componentHasIdPrefix(comp.component, `input`)) {
+ items = comp.component.value || items;
+ }
+ }
+ });
+
+ const appraisal = await appraiseItems(items, marketId);
+ pageCtx.state.data.appraisal = appraisal;
+ return renderAppraisal(appraisal, pageCtx, interaction);
+ },
+ },
+ share: {
+ key: 'share',
+ type: PageType.FOLLOWUP,
+ followUpFlags: Constants.MessageFlags.IS_COMPONENTS_V2,
+ render: async (pageCtx) => renderAppraisal(pageCtx.state.data.appraisal!, pageCtx, interaction),
+ },
+ },
+ initialPage: 'appraiseModal',
+ timeout: 300, // 5 minutes
+ ephemeral: true,
+ },
+ interaction,
+ ctx,
+ );
+}
+
+export default {
+ definition,
+ execute,
+};
diff --git a/packages/eve-bot/src/commands/appraise/renderAppraisal.ts b/packages/eve-bot/src/commands/appraise/renderAppraisal.ts
deleted file mode 100644
index 7ee03ce..0000000
--- a/packages/eve-bot/src/commands/appraise/renderAppraisal.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import type { ExecutableInteraction } from '@star-kitten/discord';
-import { createActionRow, createButton, createContainer, createTextDisplay } from '@star-kitten/discord/components';
-import type { PageContext } from '@star-kitten/discord/pages';
-import { type Appraisal } from '@star-kitten/eve/third-party/janice.js';
-import { formatNumberToShortForm } from '@star-kitten/util/text.js';
-import type { AppraisalState } from './appraise.command';
-
-export function renderAppraisal(
- appraisal: Appraisal,
- pageCtx: PageContext,
- interaction: ExecutableInteraction,
-) {
- const formatter = new Intl.NumberFormat(interaction.locale || 'en-US', {
- maximumFractionDigits: 2,
- minimumFractionDigits: 2,
- });
-
- const container = createContainer(
- {
- accent_color: 0x1da57a,
- },
- createTextDisplay(`
-# [Appraisal ${appraisal.id} @ ${appraisal.market.name}](https://janice.e-351.com/a/${appraisal.id})
-### Buy: \`${formatter.format(appraisal.effectivePrices.totalBuyPrice)}\` ISK
-### Split: \`${formatter.format(appraisal.effectivePrices.totalSplitPrice)}\` ISK
-### Sell: \`${formatter.format(appraisal.effectivePrices.totalSellPrice)}\` ISK
--# Volume: ${formatter.format(appraisal.totalPackagedVolume)} m³
-\`\`\`
-Buy: Sell: Qty: Item:
-${appraisal.items.map((i) => `${formatNumberToShortForm(i.effectivePrices.buyPrice).padEnd(10)}${formatNumberToShortForm(i.effectivePrices.sellPrice).padEnd(10)}${formatNumberToShortForm(i.amount).padEnd(10)}${i.itemType.name}`).join('\n')}
-\`\`\`
--# https://janice.e-351.com/a/${appraisal.id}\n\n
-`),
- );
-
- if (pageCtx.state.currentPage !== 'share') {
- container.components.push(
- createActionRow(
- createButton('Share in Channel', 'share', {
- disabled: !interaction.channel?.id,
- }),
- ),
- );
- }
-
- return {
- type: 1,
- components: [container],
- };
-}
diff --git a/packages/eve-bot/src/commands/appraise/renderAppraisal.tsx b/packages/eve-bot/src/commands/appraise/renderAppraisal.tsx
new file mode 100644
index 0000000..5e796a2
--- /dev/null
+++ b/packages/eve-bot/src/commands/appraise/renderAppraisal.tsx
@@ -0,0 +1,79 @@
+import type { ExecutableInteraction } from '@star-kitten/discord';
+import * as StarKitten from '@star-kitten/discord';
+import { createActionRow, createButton, createContainer, createTextDisplay } from '@star-kitten/discord/components';
+import type { PageContext } from '@star-kitten/discord/pages';
+import { type Appraisal } from '@star-kitten/eve/third-party/janice.js';
+import { formatNumberToShortForm } from '@star-kitten/util/text.js';
+import type { AppraisalState } from './appraise.command';
+
+export function renderAppraisal(
+ appraisal: Appraisal,
+ pageCtx: PageContext,
+ interaction: ExecutableInteraction,
+): StarKitten.Component {
+ const formatter = new Intl.NumberFormat(interaction.locale || 'en-US', {
+ maximumFractionDigits: 2,
+ minimumFractionDigits: 2,
+ });
+
+ // const container = createContainer(
+ // {
+ // accent_color: 0x1da57a,
+ // },
+ // createTextDisplay(`
+ // # [Appraisal ${appraisal.id} @ ${appraisal.market.name}](https://janice.e-351.com/a/${appraisal.id})
+ // ### Buy: \`${formatter.format(appraisal.effectivePrices.totalBuyPrice)}\` ISK
+ // ### Split: \`${formatter.format(appraisal.effectivePrices.totalSplitPrice)}\` ISK
+ // ### Sell: \`${formatter.format(appraisal.effectivePrices.totalSellPrice)}\` ISK
+ // -# Volume: ${formatter.format(appraisal.totalPackagedVolume)} m³
+ // \`\`\`
+ // Buy: Sell: Qty: Item:
+ // ${appraisal.items.map((i) => `${formatNumberToShortForm(i.effectivePrices.buyPrice).padEnd(10)}${formatNumberToShortForm(i.effectivePrices.sellPrice).padEnd(10)}${formatNumberToShortForm(i.amount).padEnd(10)}${i.itemType.name}`).join('\n')}
+ // \`\`\`
+ // -# https://janice.e-351.com/a/${appraisal.id}\n\n
+ // `),
+ // );
+
+ // if (pageCtx.state.currentPage !== 'share') {
+ // container.components.push(
+ // createActionRow(
+ // createButton('Share in Channel', 'share', {
+ // disabled: !interaction.channel?.id,
+ // }),
+ // ),
+ // );
+ // }
+
+ // return {
+ // type: 1,
+ // components: [container],
+ // };
+ return (
+
+ `${formatNumberToShortForm(i.effectivePrices.buyPrice).padEnd(10)}${formatNumberToShortForm(i.effectivePrices.sellPrice).padEnd(10)}${formatNumberToShortForm(i.amount).padEnd(10)}${i.itemType.name}`).join('\n')}
+\`\`\`
+-# https://janice.e-351.com/a/${appraisal.id}\n\n
+ `}
+ />
+ {pageCtx.state.currentPage !== 'share' ? (
+
+
+
+ ) : undefined}
+
+ );
+}
diff --git a/packages/eve-bot/src/commands/appraise/renderAppraisalModal.ts b/packages/eve-bot/src/commands/appraise/renderAppraisalModal.ts
index d07658c..93a5370 100644
--- a/packages/eve-bot/src/commands/appraise/renderAppraisalModal.ts
+++ b/packages/eve-bot/src/commands/appraise/renderAppraisalModal.ts
@@ -1,37 +1,37 @@
-import type { Interaction } from '@projectdysnomia/dysnomia';
-import { createModalLabel, createStringSelect, createTextInput } from '@star-kitten/discord/components';
-import { markets } from '@star-kitten/eve/third-party/janice.js';
-
-export function renderAppraisalModal(interaction: Interaction) {
- return {
- // next page to render will be appraisalResult
- custom_id: `appraisalResult`,
- title: 'Appraise Items',
- components: [
- createModalLabel(
- 'Select your market (default: Jita)',
- createStringSelect(
- 'market',
- {
- placeholder: 'Select a market',
- },
- ...markets.map((m) => ({
- label: m.name,
- value: m.id.toString(),
- default: m.id === 2, // Jita
- })),
- ),
- ),
- createModalLabel(
- 'Enter items to appraise',
- createTextInput('input', {
- isParagraph: true,
- placeholder: `Enter list of items to be appraised.
-Tritanium 22222
-Pyerite 8000
-Mexallon 2444`,
- }),
- ),
- ],
- };
-}
+import type { Interaction } from '@projectdysnomia/dysnomia';
+import { createModalLabel, createStringSelect, createTextInput } from '@star-kitten/discord/components';
+import { markets } from '@star-kitten/eve/third-party/janice.js';
+
+export function renderAppraisalModal(interaction: Interaction) {
+ return {
+ // next page to render will be appraisalResult
+ custom_id: `appraisalResult`,
+ title: 'Appraise Items',
+ components: [
+ createModalLabel(
+ 'Select your market (default: Jita)',
+ createStringSelect(
+ 'market',
+ {
+ placeholder: 'Select a market',
+ },
+ ...markets.map((m) => ({
+ label: m.name,
+ value: m.id.toString(),
+ default: m.id === 2, // Jita
+ })),
+ ),
+ ),
+ createModalLabel(
+ 'Enter items to appraise',
+ createTextInput('input', {
+ isParagraph: true,
+ placeholder: `Enter list of items to be appraised.
+Tritanium 22222
+Pyerite 8000
+Mexallon 2444`,
+ }),
+ ),
+ ],
+ };
+}
diff --git a/packages/eve-bot/src/commands/search/pages/attributes.ts b/packages/eve-bot/src/commands/search/pages/attributes.ts
index 165f840..8c90c93 100644
--- a/packages/eve-bot/src/commands/search/pages/attributes.ts
+++ b/packages/eve-bot/src/commands/search/pages/attributes.ts
@@ -1,140 +1,140 @@
-import { renderSubroutes, type Page } from '@star-kitten/discord/pages';
-import type { SearchState } from '../search.command';
-import {
- ButtonStyle,
- createContainer,
- createSection,
- createSeparator,
- createTextDisplay,
- createThumbnail,
- Padding,
-} from '@star-kitten/discord/components';
-import {
- getGroup,
- getType,
- getUnit,
- renderUnit,
- typeGetAttribute,
- typeHasAnyAttribute,
- type Type,
-} from '@star-kitten/eve/models';
-import { attributeOrdering } from '@star-kitten/eve';
-import { searchActionRow } from './helpers';
-import { toTitleCase } from '@star-kitten/util/text.js';
-
-enum Images {
- ATTRIBUTES = 'https://iili.io/KTbaMR2.md.webp',
- DEFENSES = 'https://iili.io/KTbSVoX.md.webp',
- FITTING = 'https://iili.io/KufiFYG.md.webp',
- FACILITIES = 'https://iili.io/KufikGt.md.webp',
-}
-
-const attributeCategoryMap = {
- structure: 'UI/Fitting/Structure',
- armor: 'UI/Common/Armor',
- shield: 'UI/Common/Shield',
- ewar: 'UI/Common/EWarResistances',
- capacitor: 'UI/Fitting/FittingWindow/Capacitor',
- targeting: 'UI/Fitting/FittingWindow/Targeting',
- facilities: 'UI/InfoWindow/SharedFacilities',
- fighters: 'UI/InfoWindow/FighterFacilities',
- on_death: 'UI/InfoWindow/OnDeath',
- jump_drive: 'UI/InfoWindow/JumpDriveSystems',
- propulsion: 'UI/Compare/Propulsion',
-};
-
-const groupedCategories = [
- // defenses
- ['shield', 'armor', 'structure', 'ewar'],
- // fittings
- ['capacitor', 'targeting', 'propulsion'],
- // facilities
- ['facilities', 'fighters', 'on_death', 'jump_drive'],
-];
-
-function getAttributeOrdering(type: Type) {
- const group = getGroup(type.group_id);
- switch (group.category_id) {
- case 11:
- return attributeOrdering['11'];
- case 87:
- return attributeOrdering['87'];
- default:
- return attributeOrdering.default;
- }
-}
-
-const bannerMap = {
- shield: Images.DEFENSES,
- armor: Images.DEFENSES,
- structure: Images.DEFENSES,
- ewar: Images.DEFENSES,
-
- capacitor: Images.FITTING,
- targeting: Images.FITTING,
- propulsion: Images.FITTING,
-
- facilities: Images.FACILITIES,
- fighters: Images.FACILITIES,
- on_death: Images.FACILITIES,
- jump_drive: Images.FACILITIES,
-};
-
-const page: Page = {
- key: 'attributes',
- render: (context) => {
- const type = getType(context.state.data.type_id);
- const ordering = getAttributeOrdering(type);
-
- return {
- components: [
- createContainer(
- {},
- createSection(
- createThumbnail(`https://images.evetech.net/types/${type.type_id}/icon`),
- createTextDisplay(`# [${type.name.en}](https://everef.net/types/${type.type_id})\n## Attributes`),
- ),
- ...renderSubroutes(
- context,
- 'attributes',
- groupedCategories.map((group) =>
- group.map((cat) => {
- const attrCat = ordering[attributeCategoryMap[cat]];
- const attrs = attrCat.groupedCategories
- ? attrCat.groupedCategories.map(([name, id]) => id).concat(attrCat.normalAttributes) || []
- : attrCat.normalAttributes;
- if (!typeHasAnyAttribute(type, attrs)) {
- return undefined;
- }
- return {
- label: toTitleCase(cat.replace('_', ' ')),
- value: cat,
- banner: bannerMap[cat],
- };
- }),
- ),
- (currentRoute) => {
- const lines: string[] = [];
- const attrCat = ordering[attributeCategoryMap[currentRoute]];
- const attrs = attrCat.groupedCategories
- ? attrCat.groupedCategories.map(([name, id]) => id).concat(attrCat.normalAttributes) || []
- : attrCat.normalAttributes;
- attrs.map((attrId) => {
- const attr = typeGetAttribute(type, attrId);
- if (!attr) return;
- const unit = attr.attribute.unit_id ? renderUnit(getUnit(attr.attribute.unit_id), attr.value) : '';
- lines.push(`${attr.attribute.display_name.en.padEnd(24)} ${unit}`);
- });
- return createTextDisplay('```\n' + lines.join('\n') + '\n```');
- },
- { style: ButtonStyle.SECONDARY },
- ),
- createSeparator(Padding.LARGE),
- searchActionRow('attributes'),
- ),
- ],
- };
- },
-};
-
-export default page;
+import { renderSubroutes, type Page } from '@star-kitten/discord/pages';
+import type { SearchState } from '../search.command';
+import {
+ ButtonStyle,
+ createContainer,
+ createSection,
+ createSeparator,
+ createTextDisplay,
+ createThumbnail,
+ Padding,
+} from '@star-kitten/discord/components';
+import {
+ getGroup,
+ getType,
+ getUnit,
+ renderUnit,
+ typeGetAttribute,
+ typeHasAnyAttribute,
+ type Type,
+} from '@star-kitten/eve/models';
+import { attributeOrdering } from '@star-kitten/eve';
+import { searchActionRow } from './helpers';
+import { toTitleCase } from '@star-kitten/util/text.js';
+
+enum Images {
+ ATTRIBUTES = 'https://iili.io/KTbaMR2.md.webp',
+ DEFENSES = 'https://iili.io/KTbSVoX.md.webp',
+ FITTING = 'https://iili.io/KufiFYG.md.webp',
+ FACILITIES = 'https://iili.io/KufikGt.md.webp',
+}
+
+const attributeCategoryMap = {
+ structure: 'UI/Fitting/Structure',
+ armor: 'UI/Common/Armor',
+ shield: 'UI/Common/Shield',
+ ewar: 'UI/Common/EWarResistances',
+ capacitor: 'UI/Fitting/FittingWindow/Capacitor',
+ targeting: 'UI/Fitting/FittingWindow/Targeting',
+ facilities: 'UI/InfoWindow/SharedFacilities',
+ fighters: 'UI/InfoWindow/FighterFacilities',
+ on_death: 'UI/InfoWindow/OnDeath',
+ jump_drive: 'UI/InfoWindow/JumpDriveSystems',
+ propulsion: 'UI/Compare/Propulsion',
+};
+
+const groupedCategories = [
+ // defenses
+ ['shield', 'armor', 'structure', 'ewar'],
+ // fittings
+ ['capacitor', 'targeting', 'propulsion'],
+ // facilities
+ ['facilities', 'fighters', 'on_death', 'jump_drive'],
+];
+
+function getAttributeOrdering(type: Type) {
+ const group = getGroup(type.group_id);
+ switch (group.category_id) {
+ case 11:
+ return attributeOrdering['11'];
+ case 87:
+ return attributeOrdering['87'];
+ default:
+ return attributeOrdering.default;
+ }
+}
+
+const bannerMap = {
+ shield: Images.DEFENSES,
+ armor: Images.DEFENSES,
+ structure: Images.DEFENSES,
+ ewar: Images.DEFENSES,
+
+ capacitor: Images.FITTING,
+ targeting: Images.FITTING,
+ propulsion: Images.FITTING,
+
+ facilities: Images.FACILITIES,
+ fighters: Images.FACILITIES,
+ on_death: Images.FACILITIES,
+ jump_drive: Images.FACILITIES,
+};
+
+const page: Page = {
+ key: 'attributes',
+ render: (context) => {
+ const type = getType(context.state.data.type_id);
+ const ordering = getAttributeOrdering(type);
+
+ return {
+ components: [
+ createContainer(
+ {},
+ createSection(
+ createThumbnail(`https://images.evetech.net/types/${type.type_id}/icon`),
+ createTextDisplay(`# [${type.name.en}](https://everef.net/types/${type.type_id})\n## Attributes`),
+ ),
+ ...renderSubroutes(
+ context,
+ 'attributes',
+ groupedCategories.map((group) =>
+ group.map((cat) => {
+ const attrCat = ordering[attributeCategoryMap[cat]];
+ const attrs = attrCat.groupedCategories
+ ? attrCat.groupedCategories.map(([name, id]) => id).concat(attrCat.normalAttributes) || []
+ : attrCat.normalAttributes;
+ if (!typeHasAnyAttribute(type, attrs)) {
+ return undefined;
+ }
+ return {
+ label: toTitleCase(cat.replace('_', ' ')),
+ value: cat,
+ banner: bannerMap[cat],
+ };
+ }),
+ ),
+ (currentRoute) => {
+ const lines: string[] = [];
+ const attrCat = ordering[attributeCategoryMap[currentRoute]];
+ const attrs = attrCat.groupedCategories
+ ? attrCat.groupedCategories.map(([name, id]) => id).concat(attrCat.normalAttributes) || []
+ : attrCat.normalAttributes;
+ attrs.map((attrId) => {
+ const attr = typeGetAttribute(type, attrId);
+ if (!attr) return;
+ const unit = attr.attribute.unit_id ? renderUnit(getUnit(attr.attribute.unit_id), attr.value) : '';
+ lines.push(`${attr.attribute.display_name.en.padEnd(24)} ${unit}`);
+ });
+ return createTextDisplay('```\n' + lines.join('\n') + '\n```');
+ },
+ { style: ButtonStyle.SECONDARY },
+ ),
+ createSeparator(Padding.LARGE),
+ searchActionRow('attributes'),
+ ),
+ ],
+ };
+ },
+};
+
+export default page;
diff --git a/packages/eve-bot/src/commands/search/pages/helpers.ts b/packages/eve-bot/src/commands/search/pages/helpers.ts
index 138ae6f..85673d6 100644
--- a/packages/eve-bot/src/commands/search/pages/helpers.ts
+++ b/packages/eve-bot/src/commands/search/pages/helpers.ts
@@ -1,11 +1,11 @@
-import { createActionRow, createButton } from '@star-kitten/discord/components';
-
-export function searchActionRow(pageKey: string) {
- return createActionRow(
- createButton('Main', 'main', { disabled: pageKey === 'main' }),
- createButton('Attributes', 'attributes', { disabled: pageKey === 'attributes' }),
- createButton('Fittings', 'fittings', { disabled: pageKey === 'fittings' }),
- createButton('Skills', 'skills', { disabled: pageKey === 'skills' }),
- createButton('Industry', 'industry', { disabled: pageKey === 'industry' }),
- );
-}
+import { createActionRow, createButton } from '@star-kitten/discord/components';
+
+export function searchActionRow(pageKey: string) {
+ return createActionRow(
+ createButton('Main', 'main', { disabled: pageKey === 'main' }),
+ createButton('Attributes', 'attributes', { disabled: pageKey === 'attributes' }),
+ createButton('Fittings', 'fittings', { disabled: pageKey === 'fittings' }),
+ createButton('Skills', 'skills', { disabled: pageKey === 'skills' }),
+ createButton('Industry', 'industry', { disabled: pageKey === 'industry' }),
+ );
+}
diff --git a/packages/eve-bot/src/commands/search/pages/main.ts b/packages/eve-bot/src/commands/search/pages/main.ts
index 603acea..50134d3 100644
--- a/packages/eve-bot/src/commands/search/pages/main.ts
+++ b/packages/eve-bot/src/commands/search/pages/main.ts
@@ -1,89 +1,89 @@
-import type { Page } from '@star-kitten/discord/pages';
-import type { SearchState } from '../search.command';
-import {
- createContainer,
- createMediaGallery,
- createSection,
- createTextDisplay,
- createThumbnail,
- createURLButton,
-} from '@star-kitten/discord/components';
-import { getRoleBonuses, getSkillBonuses, getType } from '@star-kitten/eve/models/type.js';
-import { cleanText } from '@star-kitten/eve/utils/markdown.js';
-import { typeSearch } from '@star-kitten/eve/utils/typeSearch.js';
-import { isApplicationCommand } from '@star-kitten/discord';
-import { fetchPrice } from '@star-kitten/eve/third-party/evetycoon.js';
-import { formatNumberToShortForm } from '@star-kitten/util/text.js';
-import { searchActionRow } from './helpers';
-
-const page: Page = {
- key: 'main',
- render: async (context) => {
- if (!context.state.data.type_id && isApplicationCommand(context.interaction)) {
- const typeName = context.interaction.data.options?.find((opt) => opt.name === 'name')?.value;
- const found = await typeSearch(typeName as string);
-
- if (!found) {
- return {
- components: [createTextDisplay(`No item found for: ${typeName}`)],
- };
- }
-
- context.state.data.type_id = found.type_id;
- }
-
- const type = getType(context.state.data.type_id);
-
- const skillBonuses = getSkillBonuses(type);
- const roleBonuses = getRoleBonuses(type);
- const price = await fetchPrice(type.type_id);
-
- return {
- components: [
- createContainer(
- {},
- createSection(
- createThumbnail(`https://images.evetech.net/types/${type.type_id}/icon`),
- createTextDisplay(`
-# [${type.name.en}](https://everef.net/types/${type.type_id})
-
-${skillBonuses
- .map((bonus) => {
- return `## Bonus per level of ${bonus.skill.name.en}
-${bonus.bonuses
- .sort((a, b) => a.importance - b.importance)
- .map((b) => `${b.bonus}${b.unit?.display_name ?? '-'} ${cleanText(b.bonus_text.en)}`)
- .join('\n')}`;
- })
- .join('\n')}
- ${
- roleBonuses.length > 0
- ? `\n## Role Bonuses
-${roleBonuses
- .sort((a, b) => a.importance - b.importance)
- .map((b) => `${b.bonus ?? ''}${b.unit?.display_name ?? '-'} ${cleanText(b.bonus_text.en)}`)
- .join('\n')}`
- : ''
- }
-`),
- ),
- createMediaGallery({
- url: 'https://iili.io/KTPCFRt.md.webp',
- }),
- // createSeparator(Padding.LARGE),
- createSection(
- createURLButton('View on EVE Tycoon', `https://evetycoon.com/market/${type.type_id}`),
- createTextDisplay(
- `## Buy: ${price ? formatNumberToShortForm(price.buyAvgFivePercent) : '--'} ISK
-## Sell: ${price ? formatNumberToShortForm(price.sellAvgFivePercent) : '--'} ISK`,
- ),
- ),
- createTextDisplay(`-# Type Id: ${type.type_id}`),
- searchActionRow('main'),
- ),
- ],
- };
- },
-};
-
-export default page;
+import type { Page } from '@star-kitten/discord/pages';
+import type { SearchState } from '../search.command';
+import {
+ createContainer,
+ createMediaGallery,
+ createSection,
+ createTextDisplay,
+ createThumbnail,
+ createURLButton,
+} from '@star-kitten/discord/components';
+import { getRoleBonuses, getSkillBonuses, getType } from '@star-kitten/eve/models/type.js';
+import { cleanText } from '@star-kitten/eve/utils/markdown.js';
+import { typeSearch } from '@star-kitten/eve/utils/typeSearch.js';
+import { isApplicationCommand } from '@star-kitten/discord';
+import { fetchPrice } from '@star-kitten/eve/third-party/evetycoon.js';
+import { formatNumberToShortForm } from '@star-kitten/util/text.js';
+import { searchActionRow } from './helpers';
+
+const page: Page = {
+ key: 'main',
+ render: async (context) => {
+ if (!context.state.data.type_id && isApplicationCommand(context.interaction)) {
+ const typeName = context.interaction.data.options?.find((opt) => opt.name === 'name')?.value;
+ const found = await typeSearch(typeName as string);
+
+ if (!found) {
+ return {
+ components: [createTextDisplay(`No item found for: ${typeName}`)],
+ };
+ }
+
+ context.state.data.type_id = found.type_id;
+ }
+
+ const type = getType(context.state.data.type_id);
+
+ const skillBonuses = getSkillBonuses(type);
+ const roleBonuses = getRoleBonuses(type);
+ const price = await fetchPrice(type.type_id);
+
+ return {
+ components: [
+ createContainer(
+ {},
+ createSection(
+ createThumbnail(`https://images.evetech.net/types/${type.type_id}/icon`),
+ createTextDisplay(`
+# [${type.name.en}](https://everef.net/types/${type.type_id})
+
+${skillBonuses
+ .map((bonus) => {
+ return `## Bonus per level of ${bonus.skill.name.en}
+${bonus.bonuses
+ .sort((a, b) => a.importance - b.importance)
+ .map((b) => `${b.bonus}${b.unit?.display_name ?? '-'} ${cleanText(b.bonus_text.en)}`)
+ .join('\n')}`;
+ })
+ .join('\n')}
+ ${
+ roleBonuses.length > 0
+ ? `\n## Role Bonuses
+${roleBonuses
+ .sort((a, b) => a.importance - b.importance)
+ .map((b) => `${b.bonus ?? ''}${b.unit?.display_name ?? '-'} ${cleanText(b.bonus_text.en)}`)
+ .join('\n')}`
+ : ''
+ }
+`),
+ ),
+ createMediaGallery({
+ url: 'https://iili.io/KTPCFRt.md.webp',
+ }),
+ // createSeparator(Padding.LARGE),
+ createSection(
+ createURLButton('View on EVE Tycoon', `https://evetycoon.com/market/${type.type_id}`),
+ createTextDisplay(
+ `## Buy: ${price ? formatNumberToShortForm(price.buyAvgFivePercent) : '--'} ISK
+## Sell: ${price ? formatNumberToShortForm(price.sellAvgFivePercent) : '--'} ISK`,
+ ),
+ ),
+ createTextDisplay(`-# Type Id: ${type.type_id}`),
+ searchActionRow('main'),
+ ),
+ ],
+ };
+ },
+};
+
+export default page;
diff --git a/packages/eve-bot/src/commands/search/search.command.ts b/packages/eve-bot/src/commands/search/search.command.ts
index 34dc1fd..f7e5c6f 100644
--- a/packages/eve-bot/src/commands/search/search.command.ts
+++ b/packages/eve-bot/src/commands/search/search.command.ts
@@ -1,69 +1,69 @@
-import {
- createChatCommand,
- isAutocomplete,
- stringOption,
- type CommandContext,
- type ExecutableInteraction,
-} from '@star-kitten/discord';
-import { usePages } from '@star-kitten/discord/pages';
-import { initializeTypeSearch, typeSearchAutoComplete } from '@star-kitten/eve/utils/typeSearch.js';
-
-import main from './pages/main';
-import attributes from './pages/attributes';
-
-let now = Date.now();
-console.debug('Initializing type search...');
-await initializeTypeSearch().catch((e) => {
- console.error('Failed to initialize type search', e);
- process.exit(1);
-});
-console.debug(`Type search initialized. Took ${Date.now() - now}ms`);
-
-export interface SearchState {
- type_id: number;
-}
-
-export default createChatCommand(
- {
- name: 'search',
- description: 'Search for a type',
- options: [
- stringOption({
- name: 'name',
- description: 'The type name to search for',
- autocomplete: true,
- required: true,
- }),
- ],
- },
- execute,
-);
-
-async function execute(interaction: ExecutableInteraction, ctx: CommandContext) {
- if (isAutocomplete(interaction)) {
- const focusedOption = interaction.data.options?.find((opt) => opt.focused);
- if (focusedOption?.name === 'name') {
- const value = focusedOption.value as string;
- const results = await typeSearchAutoComplete(value);
- if (results) {
- await interaction.result(results);
- } else {
- await interaction.result([]);
- }
- }
- return;
- }
-
- usePages(
- {
- pages: {
- main,
- attributes,
- },
- initialPage: 'main',
- ephemeral: false,
- },
- interaction,
- ctx,
- );
-}
+import {
+ createChatCommand,
+ isAutocomplete,
+ stringOption,
+ type CommandContext,
+ type ExecutableInteraction,
+} from '@star-kitten/discord';
+import { usePages } from '@star-kitten/discord/pages';
+import { initializeTypeSearch, typeSearchAutoComplete } from '@star-kitten/eve/utils/typeSearch.js';
+
+import main from './pages/main';
+import attributes from './pages/attributes';
+
+let now = Date.now();
+console.debug('Initializing type search...');
+await initializeTypeSearch().catch((e) => {
+ console.error('Failed to initialize type search', e);
+ process.exit(1);
+});
+console.debug(`Type search initialized. Took ${Date.now() - now}ms`);
+
+export interface SearchState {
+ type_id: number;
+}
+
+export default createChatCommand(
+ {
+ name: 'search',
+ description: 'Search for a type',
+ options: [
+ stringOption({
+ name: 'name',
+ description: 'The type name to search for',
+ autocomplete: true,
+ required: true,
+ }),
+ ],
+ },
+ execute,
+);
+
+async function execute(interaction: ExecutableInteraction, ctx: CommandContext) {
+ if (isAutocomplete(interaction)) {
+ const focusedOption = interaction.data.options?.find((opt) => opt.focused);
+ if (focusedOption?.name === 'name') {
+ const value = focusedOption.value as string;
+ const results = await typeSearchAutoComplete(value);
+ if (results) {
+ await interaction.result(results);
+ } else {
+ await interaction.result([]);
+ }
+ }
+ return;
+ }
+
+ usePages(
+ {
+ pages: {
+ main,
+ attributes,
+ },
+ initialPage: 'main',
+ ephemeral: false,
+ },
+ interaction,
+ ctx,
+ );
+}
diff --git a/packages/eve-bot/src/main.ts b/packages/eve-bot/src/main.ts
index 3bb632e..ac7cc4d 100644
--- a/packages/eve-bot/src/main.ts
+++ b/packages/eve-bot/src/main.ts
@@ -1,3 +1,3 @@
-import { startDiscordBot } from '@star-kitten/discord';
-
-startDiscordBot();
+import { startDiscordBot } from '@star-kitten/discord';
+
+startDiscordBot();
diff --git a/packages/eve-bot/src/test.tsx b/packages/eve-bot/src/test.tsx
new file mode 100644
index 0000000..56a0bae
--- /dev/null
+++ b/packages/eve-bot/src/test.tsx
@@ -0,0 +1,26 @@
+export function renderAppraisal() {
+ const formatter = new Intl.NumberFormat('en-US', {
+ maximumFractionDigits: 2,
+ minimumFractionDigits: 2,
+ });
+ const world = 'world';
+ const rand = Math.random() * 1000;
+ const pageCtx = { state: { currentPage: 'home' } };
+
+ let jsx = (
+
+
+
+ {pageCtx.state.currentPage !== 'share' ? (
+
+
+
+ ) : undefined}
+
+
+ );
+
+ console.log(jsx);
+}
+
+renderAppraisal();
diff --git a/packages/eve-bot/tsconfig.json b/packages/eve-bot/tsconfig.json
index 67d77be..886670c 100644
--- a/packages/eve-bot/tsconfig.json
+++ b/packages/eve-bot/tsconfig.json
@@ -1,38 +1,12 @@
{
+ "extends": "../../tsconfig.base.json",
"compilerOptions": {
- // Enable latest features
- "lib": ["ESNext"],
- "target": "ESNext",
- "module": "ESNext",
- "moduleDetection": "force",
+ "composite": true,
"jsx": "react-jsx",
"jsxImportSource": "@star-kitten/discord",
- "allowJs": true,
-
- // Bundler mode
- "moduleResolution": "bundler",
- "allowImportingTsExtensions": true,
- "verbatimModuleSyntax": true,
- "noEmit": true,
-
- // Best practices
- "strict": false,
- "skipLibCheck": true,
- "noFallthroughCasesInSwitch": true,
-
- // Some stricter flags (disabled by default)
- "noUnusedLocals": false,
- "noUnusedParameters": false,
- "noPropertyAccessFromIndexSignature": false,
-
- // Paths
"paths": {
"@*": ["./src/*"]
},
-
- "experimentalDecorators": true,
- "emitDecoratorMetadata": true,
-
"typeRoots": ["src/types", "./node_modules/@types"]
},
"include": ["src", "types"],
diff --git a/packages/eve-web/.env.development b/packages/eve-web/.env.development
deleted file mode 100644
index a3ea242..0000000
--- a/packages/eve-web/.env.development
+++ /dev/null
@@ -1,30 +0,0 @@
-#/-------------------[DOTENV_PUBLIC_KEY]--------------------/
-#/ public-key encryption for .env files /
-#/ [how it works](https://dotenvx.com/encryption) /
-#/----------------------------------------------------------/
-DOTENV_PUBLIC_KEY_DEVELOPMENT="02572da3d4f3a844588a944214c0e142a5a01deaa6551456af146d34b574024416"
-
-# .env.development
-#/-------------------[DOTENV_PUBLIC_KEY]--------------------/
-#/ public-key encryption for .env files /
-#/ [how it works](https://dotenvx.com/encryption) /
-#/----------------------------------------------------------/
-DOTENV_PUBLIC_KEY="02292a330aa041b5f7efc51504e0c208accba67a6877a217ab43cbb59c3c0c3e66"
-
-# .env
-DEBUG="encrypted:BC7p62nrs3NV7XdxnBbO1WsHGm8IgDEbOS1RmgORHSqh05vGIv+hmqwau61FamrU/puT4btAsG+iLcSeypCQV5e7bBpr0qu0HQoVyMzunBvrN5ivzNY0Af800lNynsBXzq0cXTY="
-PORT="encrypted:BJpY7J2J+0z4LUNnKRr7HzcpETcdnWFuRAOC3hVl2cZyiCBl706vJqv+iY3BgA0mus73t9fwYjGRrPSXSQbcSEBzr+Jquj8Gkvy7loXKkKp4Gz1tqX554txfY0XjrgMO3oHATO8="
-NODE_ENV="encrypted:BJun6Kdf/kBSrIYUgw7pfnMwlrTjvUUq/w2yjqn+X5UgaxUxzLsI0JabYlxQCxoDMSEagQYWI5HkRaZvYuXHzyN2aXm6drC2bahg9aWZTVyWYu00FFwIah7l/tuMA/caeO7s5dwkuOgCvlOQ"
-LOG_LEVEL="encrypted:BKBvZDS7xkzgg5IqiTc9izmt4om4CjX7t4LA8gMY+0ru0NtVBpkSkchil4PvaRNhktcNjtIzfE6sduRoFw5T1tt88PjtKWIhORyACZk2ZtR3vuO/xecq2q1rIIp5kD1gcp4ujltK"
-BASE_URL="encrypted:BMueek9QzKR3k+Foe0xUruZUxwwIXBcrL7B6ksdBNFaF92nHHy2HLLOhOpKNebGfSwb9mBR5kOXb095+hsDEcqAiv5nc5BjWGfk/wkFpRfFcmyEGYlmrxLclbFdQFXIqYrzmN7ae/VV1VlRzNLBipO0smJj4LZY649oV2A=="
-EVE_CLIENT_ID="encrypted:BPOAohc2MmP7VvvLybwvcl7XgzYRqWC6IzBkOf+T73kN8YlHYKt611uYNjU27G6hkVRK3DSfgCuxTPzrQBPxvAY6pDbqFG8pVU9cKDmoeHYtiKh7KkHuBN/cEzll6x8hpIwwrY32nzQjxYMvyVO5UgG7OHK1T/jkeya2TW2DSgGn"
-EVE_CLIENT_SECRET="encrypted:BE0VYniO3JEFNt1R4iUrGA7W7cSp7gQtG7Y86VQeWnte+idjnqSFmv2lmz83rc7Idvi/VU+ipuY6RL2+49jAb/oUaXGUiwguBAnlFU+ypOVy2Ed29o7yggqiB2+dUuu4xDAsLAfSXErnw4gsDsEPAMqaKhCYz0LHEvJX5ZdwfAcfrpWoLeI/Vm0="
-EVE_CALLBACK_URL="encrypted:BIjACAnGtL06X0vkvmydydup9HZDcPA+DAYUAhlH3lsq8GJPD5XxlRwVx02VzZQuATfqm1JwGDyYbw8ceaWD2RLlcjSXPF7MWDpYzG1FExE7FZbFRBBO8XqGH9X8kfxYsuca/Td8KuIPjyS5BNkyM4GQcTlojKa15Hk4GXmpNP6Gyb45XNPCegRJL5aARQ=="
-ESI_USER_AGENT="encrypted:BEUaqMbwPNvJeF/d5q5LJ5Owd5wcQ8Jg/BTGn6qns4cwlX/e6QqLLmfp8E8SxQ8Z6h+qDLpZj0HROJIOK9Y2Xb6qjB+hCnjceRMTx1QWpNS6jXQ85TQiZfYzee57QFleau621B77KIuM5DjPUZZ02efAL+2Yk83amrh3vnzvwrnvM5mMGTzc2TbeQwB6MEdjAdvAz65VGX9DnCwbtP3bMKE7og4+sKMUrTYZpCsILug="
-DISCORD_APP_ID="encrypted:BM3yHCf9kTxcIQzzmNseT0/xol6ZLYTjZ3m3NKybW1oD2joZ/gTUIg2+mgfaeCqY1CPaSGppxguDPFgthMbWihAdeGuxiITiwLDulCTLcgjBsyT6IlsKUSsE5ZiEZl1A+ikNG1/8rxrF0MsIjVqfw+U+ev8="
-DISCORD_APP_SECRET="encrypted:BNVLmKb2ZJq1+iIYKwGaCtcM+hak5NPXLNgJnPzTlpd/5zUTKc8OtYZLhg2oqtOYv8rxf8sbjpXNWB6lZL5J5NUuPcQSfVOMr3U1BN6b9WsfWZ/2Pr4cm8kqqqjJVTF49/DasRQU5VlIXodvCI2XfWrcPFV20NvE8HzsJQz/g5cF"
-DISCORD_PUBLIC_KEY="encrypted:BEmxCcAqODfgukOza3EGzsXdrnXv3qVbzlLFYsD4Iba9mQFCaOwChIQNkN/+Ve5NV5sZeefU5sEXZRYbb/hRjJjMRX4NrhEZn2Pg3mI5/FG/+uCD0cWWs4JGzTRwUcBcG8FZ2Mw/kP1ymUqMRkJCYC+XdyYqcP8zNrQ6/aca3HLcqPma7j2/1lsbX4UJ3QcKDg3bsY+107MLLJJ4+TYiwcE="
-DISCORD_BOT_TOKEN="encrypted:BCLvoICUVOYz7pkV3f+dufxEZiWcKxQ7E56cCUXtLQjjorW5WsCftgoCdP5NXKSbhHYZBqrTCAHqPp/kLgaVjDXxXu2+61DiCNjB3t/kNIudkfsuzJ0vusKcVzgnQOmTmYnOZ+SYo7hKPrjLi2/Vk8r6K26TATp9t+iuSBMsEs7t9nnnySSYIXyHfXRXbRBg4NUFOmeDRUqBhhix9mgr+MI5SPmQgsXCvA=="
-DISCORD_TEST_GUILD_ID="encrypted:BKRJRRvQw2aoBrVoVZpPPYSzCy+2VXLLzBb1zNzUR5510qobPNDbUoIlJdm41moQS0ALG94l8miVLtkOKW6MGZyepq+gE1zSEu7eIJWHB8/eSUnGuNeqSghI4Kxr8kn04Bl4eDb1UgP1Fu+8XSXjVel85Q=="
-JANICE_KEY="encrypted:BPq+CJycBbmmoDHNmHHYiQ00PeISDQTqp2IdlLZD52V2wWPOmXnRnqgvoXff64ebUayySaW1sQtvoaMJE3Gt9E/FUquYiRTPUMT5+oW7Xo60IRgAhRW9n2m/YUDIORxR0J0qxKc9cdE75VWJNqLELKKwsriBdpqj0+4yM/Mn6IaU"
-PERPLEXITY_API_KEY="encrypted:BHxscbb6WwhFgt5Cp/WzrYGJ6nJvIFeoS3JrTaibPbQ7kiu3C/Zx8klgRhlBF25+HAA8chZHT5MeE99FSD59RqIQTcnKAyfUnxNq+ovoXMV7Nk2Fb/rrdLnvUf8VoeH7L4ZyOVF1wv0r4xm/7Qqc1JN50fME6Qa47KnnQekq/n6o2e5HVI153yJnlCQu/SvcyXCY6VW2"
diff --git a/packages/eve-web/.env.production b/packages/eve-web/.env.production
deleted file mode 100644
index 93fc0e7..0000000
--- a/packages/eve-web/.env.production
+++ /dev/null
@@ -1,23 +0,0 @@
-#/-------------------[DOTENV_PUBLIC_KEY]--------------------/
-#/ public-key encryption for .env files /
-#/ [how it works](https://dotenvx.com/encryption) /
-#/----------------------------------------------------------/
-DOTENV_PUBLIC_KEY_PRODUCTION="02f0469506f6722d8fcc179c199ff159ca32f082000c8e7a1465891adb50a4c031"
-
-# .env.production
-DEBUG="encrypted:BKnKyDjoQANl7bGi3568JTnA/7sUBdUVlc8nNznTwxs5Lu/4iMDu1cY0x0iE7b0z+RXEuA/w6bERB5uTmWkCdglEI5S6LhnXZzcV55iLBY8rHO/MIDBF39vn/PBsMiA86gBmtaIn"
-PORT="encrypted:BKaGvooBBBWB13491yjfYwYT2zG1MZiYi3+Y6wW8ZhuvMOEsfPuW94rv3cE2LoguALsBFXH9rn3lQJysZLJcYd9AxJoLqxmWHkEpbQ35PYDSvkJ0GsEGlrd74hVbnh57A7Dmqqc="
-NODE_ENV="encrypted:BIiY7XZ9vy9stbiNC2u+o4ibruGTtMuRXUJPs3lMxkHKlK6gksg0ddTPbia/qZkZudGjnEhmqYDUPfSWQDdmf8gFsuBgSgYGhR2GCNw7mCCmsDO/wE3ojNnlvuetnVfLeJa7ugvOGjX5QTs="
-LOG_LEVEL="encrypted:BEAJviH6nTAR4AdFEoiud4ZHV+dwvURoZys4M9KsYAn5MD+nlNEnzS+9vtE3NPwqzfkpK0Z/46xB+SUIXwhwaJ9Yzgz2WqLK1UXEB6fhQqHXdIqvW2ug/+hUxW9k0ueMu5I9btE="
-BASE_URL="encrypted:BJ6YYd2cX31HuTvGnNxLK33KQgzWxU9yRtlwAc79hhbuioHP5lMu7LxCu8NnXfcaEvevWsEt3cG4I7PNqzlBmU1WhTwsdJ4Kqi2cvs6hKwMeVWvtgdI+ymojG/GoglkbHjSc9737dsth2+erI4qbjkafqYuOC9S9"
-DISCORD_APP_ID="encrypted:BMqY+6wep/q7bWO9Yc/tJukPHH5H6vvItZpOFK5zaLP92Fx4S+qyZvH/LZKfUBSxZ1d1vbAqo4V+HPxNPyvwXaZyu/qlRf5ZTP/hkt1k9RoNb5UNOMSoD6GSZFS24/JEKuDPzQnvEOb0+prPHEJknvTMXmI="
-DISCORD_APP_SECRET="encrypted:BBBWkXA3zi8rCWEiMH66v1hFb6Jqw0Bn4H/6b5qWbVakm5UDckOmgQSjXosJLA1VX0vY+38s5fT1ICPIBv2b0rzpaQ09GpRIwryyTT+VLvMcZfrt1CP4ISC0uzlE2p9qceK9EG+6I7ge4pRkzpxotwnWAg9SCqVcNb04kRwPhUvj"
-DISCORD_PUBLIC_KEY="encrypted:BPqsvWPJ7/IBYynqFMHmEcpMBS+T5CXyfnzZU3flouPwcCaKkIc3xkLhtVco7nWdv2v/hw9ulysmVJhT6CiW9r1k0XRqRnv4q1PDDSTLrP0c1cXPg6pFLcOEv7e2CU+Gkj7UEFZz3xgrb6aWkkLRO0yATcA20xbdnOv3rbigOrJCfJwbbAWPQk7yun8oF6O/mGvWW9Blv8if54fp8vBOeUs="
-DISCORD_BOT_TOKEN="encrypted:BMfVvYAKvIsMW+dS1X5SZcXfUIxrsunb3q4iXM2ifTlSP8ZlFpA2jxvgYj16jKcexiyVUBhWMSyUC4eS2AuIY/6fKCuA/5JtvqMltzcxPYAi3VEYIz3AgURiMRNy2QsNnqEXxNiakNaPq5Tv4dqVB4z7YeQ16QdvpDWxD4XUQFtG8Q5jZQK/ISj4xJT9cmaxLUJB9XQcbAa8Oseghpk/A1i5JXO05Rx4vQ=="
-EVE_CLIENT_ID="encrypted:BCBtASu/2DN+EvLPM//WQjBdfwRscwSC5zKBHLTTTcXMfVur8GtDB6ZcBWstmC4YdiimjPobi1RJ+qdYndu1SM300g6UwOmmO2sNhOpG5nyP0mT2HNgwcJzl+Z7Ad1Vr/iByzYyqkc+uYr9NwhvJDPud+HP11dTjKvw+9Ht9/abA"
-EVE_CLIENT_SECRET="encrypted:BMccZ43R9rT33amzo0zfIgLM8hKDCMXLrj+5h0TNLH1RhwrsUxcKgl17MAVqV+8uPBbB171kRRnjKLaQDjjJM27Jv1SV5bn316qrIx35Tkl2Ocd5wjEs7TSAjf8HwzUhiH9F68+IrQ36Vm8w27+RmsaRtvTtiWWVmYvBXw4PFMprTE7SG0bFq3M="
-EVE_CALLBACK_URL="encrypted:BDsEZqRGXFzRigkBq50UYj14UvNjRM4Ao3PLSxVTeyc+2Fad1DQa9mfFE9yBnp3l1H5KMQcPJdWf/MxyAa9J0RvXm9l01lbmkgXu+C+HJXWHKJ7/b91NrQqngm2l76jp80WjtmdJ2D5WOUGrIxZatQaqgh8TexQAjVwjkTeQO97PJnbF0FyNQOlu"
-ESI_USER_AGENT="encrypted:BJ9Pib5a8/qxfROzBfjlAKr/fEvgepN8o6NCI0l3aiYvFuk5hczaA57TKPMP6P2Ct/Juj47YuU8bqF147y8C556NMiY2HDPbrnenXKdAh4xCerjXhkFqowPvEMVxoeuiyhRM7mPmUSAw7AbYi7AxDtCTw80/6S2/b9/32XBk4eCnSdJmM9kFxwHVFQNK83V0Sr5XEymT4S1kntvqlFsBel/5KxMMfNieqTiT+b5mVyM="
-AUTH_DB_PATH="encrypted:BAqssA/4tJHhxv+pQuSXln5reiqtIdaJzIakctW9fs3omlsZr8j7pXHvZEPQAyYnH2u396tXQxZLXSfdj68q5odUEXUDt6kxN70h3ikL/4gbkfpPkW24wd4NlVPA21GZR+rBpvfpZN1u57Lvp8Lm/QvUfTlka4H5"
-JANICE_KEY="encrypted:BFEsjnnZNfYFIXvGXKVtko5c8zh5sZze7hjFORfAb4QsHqHh/SqXVKClMCyEa8OMCjNtd8Zmz8LOckaOUYAh09Xi57KM6Eh33CirHipys0rdeURcwSkI9RSXPZOvmOfKZ9yDmhd3iov3AF6b+wwDQ9/rhYZrqh/NWETeHV98Xgv1"
-PERPLEXITY_API_KEY="encrypted:BIRn8UX4BgL/4QOCaz2cNZVfiJY3zR/Qclr2UI8FnDsUR8mu+hWi8SVWeaauzLSRwiWU1Ihc3/sWUxi8Jz/Ma1dGcDdPwPO7kiZuN2a1Tl3NKiSMmDlNYszLekhpESoUzVOa/605lcKsTemqC8SvVfq7rOPuC2QP7/7bIGSPGDShIfBjU7dUpvfpDX0/Vf++kLHkNiV1"
diff --git a/packages/eve-web/.prettierrc.yaml b/packages/eve-web/.prettierrc.yaml
deleted file mode 100644
index 1a5a004..0000000
--- a/packages/eve-web/.prettierrc.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-trailingComma: all
-tabWidth: 2
-useTabs: false
-semi: true
-singleQuote: true
-printWidth: 140
-experimentalTernaries: true
-quoteProps: consistent
diff --git a/packages/eve-web/README.md b/packages/eve-web/README.md
deleted file mode 100644
index 33e222d..0000000
--- a/packages/eve-web/README.md
+++ /dev/null
@@ -1,83 +0,0 @@
-# Star Kitten Web
-
-Project created with [Brisa](https://github.com/brisa-build/brisa).
-
-## Getting Started
-
-### Installation
-
-```bash
-bun install
-```
-
-### Link the Library
-
-`star-kitten-lib` has not been published, so link to it locally before running this web project.
-
-```bash
-cd star-kitten-lib
-bun link
-cd ../web
-bun link star-kitten-lib
-```
-
-### Download static eve reference data & Hoboleaks archive from [EVE Ref](https://everef.net/).
-
-```bash
-cd star-kitten-lib
-bun get-data
-```
-
-### Initialize the sqlite database
-
-```bash
-cd star-kitten-lib
-bun generate-migrations
-bun migrate
-```
-Drizzle's migrations seems to fail on the first try sometimes, so just grab the .sql from the generation and run those against the kitten.db file to create the tables & indexes.
-
-## Environment Variables
-
-Create a .env file in the root directory with the following values:
-
-```yaml
-#General
-BASE_URL=http://localhost:3000
-DEBUG=true
-PORT=3000
-NODE_ENV=development
-LOG_LEVEL=debug
-
-
-# EVE - https://developers.eveonline.com/applications
-EVE_CLIENT_ID=YOUR_EVE_CLIENT_ID
-EVE_CLIENT_SECRET=YOUR_EVE_SECRET
-EVE_CALLBACK_URL=http://localhost:3000/auth/callback
-ESI_USER_AGENT=ADD_YOUR_USER_AGENT_INFO_HERE
-
-# For using Janice's Appraisal API
-JANICE_KEY=XXX
-
-# For using Perplexities AI API
-PERPLEXITY_API_KEY=XXX
-```
-
-### Development
-
-```bash
-bun dev
-```
-
-### Build
-
-```bash
-bun build
-```
-
-### Start
-
-```bash
-bun start
-```
-
diff --git a/packages/eve-web/brisa.config.ts b/packages/eve-web/brisa.config.ts
deleted file mode 100644
index b45e554..0000000
--- a/packages/eve-web/brisa.config.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import type { Configuration } from "brisa";
-import tailwindcss from 'brisa-tailwindcss';
-
-export default {
- integrations: [tailwindcss()],
-} as Configuration;
-
diff --git a/packages/eve-web/build/_brisa/types.ts b/packages/eve-web/build/_brisa/types.ts
deleted file mode 100644
index 3bb8312..0000000
--- a/packages/eve-web/build/_brisa/types.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export interface IntrinsicCustomElements {
- 'counter-client': JSX.WebComponentAttributes;
- }
-export type PageRoute = "/" | "/about" | "/auth/error" | "/auth/success";
\ No newline at end of file
diff --git a/packages/eve-web/build/api/auth/callback.js b/packages/eve-web/build/api/auth/callback.js
deleted file mode 100644
index 99a1551..0000000
--- a/packages/eve-web/build/api/auth/callback.js
+++ /dev/null
@@ -1,18258 +0,0 @@
-// @bun
-var __create = Object.create;
-var __getProtoOf = Object.getPrototypeOf;
-var __defProp = Object.defineProperty;
-var __getOwnPropNames = Object.getOwnPropertyNames;
-var __hasOwnProp = Object.prototype.hasOwnProperty;
-var __toESM = (mod, isNodeMode, target) => {
- target = mod != null ? __create(__getProtoOf(mod)) : {};
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
- for (let key of __getOwnPropNames(mod))
- if (!__hasOwnProp.call(to, key))
- __defProp(to, key, {
- get: () => mod[key],
- enumerable: true
- });
- return to;
-};
-var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
-var __require = import.meta.require;
-
-// ../eve/node_modules/safe-buffer/index.js
-var require_safe_buffer = __commonJS((exports, module) => {
- /*! safe-buffer. MIT License. Feross Aboukhadijeh */
- var buffer = __require("buffer");
- var Buffer2 = buffer.Buffer;
- function copyProps(src, dst) {
- for (var key in src) {
- dst[key] = src[key];
- }
- }
- if (Buffer2.from && Buffer2.alloc && Buffer2.allocUnsafe && Buffer2.allocUnsafeSlow) {
- module.exports = buffer;
- } else {
- copyProps(buffer, exports);
- exports.Buffer = SafeBuffer;
- }
- function SafeBuffer(arg, encodingOrOffset, length) {
- return Buffer2(arg, encodingOrOffset, length);
- }
- SafeBuffer.prototype = Object.create(Buffer2.prototype);
- copyProps(Buffer2, SafeBuffer);
- SafeBuffer.from = function(arg, encodingOrOffset, length) {
- if (typeof arg === "number") {
- throw new TypeError("Argument must not be a number");
- }
- return Buffer2(arg, encodingOrOffset, length);
- };
- SafeBuffer.alloc = function(size, fill, encoding) {
- if (typeof size !== "number") {
- throw new TypeError("Argument must be a number");
- }
- var buf = Buffer2(size);
- if (fill !== undefined) {
- if (typeof encoding === "string") {
- buf.fill(fill, encoding);
- } else {
- buf.fill(fill);
- }
- } else {
- buf.fill(0);
- }
- return buf;
- };
- SafeBuffer.allocUnsafe = function(size) {
- if (typeof size !== "number") {
- throw new TypeError("Argument must be a number");
- }
- return Buffer2(size);
- };
- SafeBuffer.allocUnsafeSlow = function(size) {
- if (typeof size !== "number") {
- throw new TypeError("Argument must be a number");
- }
- return buffer.SlowBuffer(size);
- };
-});
-
-// ../eve/node_modules/jws/lib/data-stream.js
-var require_data_stream = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var Stream = __require("stream");
- var util = __require("util");
- function DataStream(data) {
- this.buffer = null;
- this.writable = true;
- this.readable = true;
- if (!data) {
- this.buffer = Buffer2.alloc(0);
- return this;
- }
- if (typeof data.pipe === "function") {
- this.buffer = Buffer2.alloc(0);
- data.pipe(this);
- return this;
- }
- if (data.length || typeof data === "object") {
- this.buffer = data;
- this.writable = false;
- process.nextTick(function() {
- this.emit("end", data);
- this.readable = false;
- this.emit("close");
- }.bind(this));
- return this;
- }
- throw new TypeError("Unexpected data type (" + typeof data + ")");
- }
- util.inherits(DataStream, Stream);
- DataStream.prototype.write = function write(data) {
- this.buffer = Buffer2.concat([this.buffer, Buffer2.from(data)]);
- this.emit("data", data);
- };
- DataStream.prototype.end = function end(data) {
- if (data)
- this.write(data);
- this.emit("end", data);
- this.emit("close");
- this.writable = false;
- this.readable = false;
- };
- module.exports = DataStream;
-});
-
-// ../eve/node_modules/ecdsa-sig-formatter/src/param-bytes-for-alg.js
-var require_param_bytes_for_alg = __commonJS((exports, module) => {
- function getParamSize(keySize) {
- var result = (keySize / 8 | 0) + (keySize % 8 === 0 ? 0 : 1);
- return result;
- }
- var paramBytesForAlg = {
- ES256: getParamSize(256),
- ES384: getParamSize(384),
- ES512: getParamSize(521)
- };
- function getParamBytesForAlg(alg) {
- var paramBytes = paramBytesForAlg[alg];
- if (paramBytes) {
- return paramBytes;
- }
- throw new Error('Unknown algorithm "' + alg + '"');
- }
- module.exports = getParamBytesForAlg;
-});
-
-// ../eve/node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.js
-var require_ecdsa_sig_formatter = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var getParamBytesForAlg = require_param_bytes_for_alg();
- var MAX_OCTET = 128;
- var CLASS_UNIVERSAL = 0;
- var PRIMITIVE_BIT = 32;
- var TAG_SEQ = 16;
- var TAG_INT = 2;
- var ENCODED_TAG_SEQ = TAG_SEQ | PRIMITIVE_BIT | CLASS_UNIVERSAL << 6;
- var ENCODED_TAG_INT = TAG_INT | CLASS_UNIVERSAL << 6;
- function base64Url(base64) {
- return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
- }
- function signatureAsBuffer(signature) {
- if (Buffer2.isBuffer(signature)) {
- return signature;
- } else if (typeof signature === "string") {
- return Buffer2.from(signature, "base64");
- }
- throw new TypeError("ECDSA signature must be a Base64 string or a Buffer");
- }
- function derToJose(signature, alg) {
- signature = signatureAsBuffer(signature);
- var paramBytes = getParamBytesForAlg(alg);
- var maxEncodedParamLength = paramBytes + 1;
- var inputLength = signature.length;
- var offset = 0;
- if (signature[offset++] !== ENCODED_TAG_SEQ) {
- throw new Error('Could not find expected "seq"');
- }
- var seqLength = signature[offset++];
- if (seqLength === (MAX_OCTET | 1)) {
- seqLength = signature[offset++];
- }
- if (inputLength - offset < seqLength) {
- throw new Error('"seq" specified length of "' + seqLength + '", only "' + (inputLength - offset) + '" remaining');
- }
- if (signature[offset++] !== ENCODED_TAG_INT) {
- throw new Error('Could not find expected "int" for "r"');
- }
- var rLength = signature[offset++];
- if (inputLength - offset - 2 < rLength) {
- throw new Error('"r" specified length of "' + rLength + '", only "' + (inputLength - offset - 2) + '" available');
- }
- if (maxEncodedParamLength < rLength) {
- throw new Error('"r" specified length of "' + rLength + '", max of "' + maxEncodedParamLength + '" is acceptable');
- }
- var rOffset = offset;
- offset += rLength;
- if (signature[offset++] !== ENCODED_TAG_INT) {
- throw new Error('Could not find expected "int" for "s"');
- }
- var sLength = signature[offset++];
- if (inputLength - offset !== sLength) {
- throw new Error('"s" specified length of "' + sLength + '", expected "' + (inputLength - offset) + '"');
- }
- if (maxEncodedParamLength < sLength) {
- throw new Error('"s" specified length of "' + sLength + '", max of "' + maxEncodedParamLength + '" is acceptable');
- }
- var sOffset = offset;
- offset += sLength;
- if (offset !== inputLength) {
- throw new Error('Expected to consume entire buffer, but "' + (inputLength - offset) + '" bytes remain');
- }
- var rPadding = paramBytes - rLength, sPadding = paramBytes - sLength;
- var dst = Buffer2.allocUnsafe(rPadding + rLength + sPadding + sLength);
- for (offset = 0;offset < rPadding; ++offset) {
- dst[offset] = 0;
- }
- signature.copy(dst, offset, rOffset + Math.max(-rPadding, 0), rOffset + rLength);
- offset = paramBytes;
- for (var o = offset;offset < o + sPadding; ++offset) {
- dst[offset] = 0;
- }
- signature.copy(dst, offset, sOffset + Math.max(-sPadding, 0), sOffset + sLength);
- dst = dst.toString("base64");
- dst = base64Url(dst);
- return dst;
- }
- function countPadding(buf, start, stop) {
- var padding = 0;
- while (start + padding < stop && buf[start + padding] === 0) {
- ++padding;
- }
- var needsSign = buf[start + padding] >= MAX_OCTET;
- if (needsSign) {
- --padding;
- }
- return padding;
- }
- function joseToDer(signature, alg) {
- signature = signatureAsBuffer(signature);
- var paramBytes = getParamBytesForAlg(alg);
- var signatureBytes = signature.length;
- if (signatureBytes !== paramBytes * 2) {
- throw new TypeError('"' + alg + '" signatures must be "' + paramBytes * 2 + '" bytes, saw "' + signatureBytes + '"');
- }
- var rPadding = countPadding(signature, 0, paramBytes);
- var sPadding = countPadding(signature, paramBytes, signature.length);
- var rLength = paramBytes - rPadding;
- var sLength = paramBytes - sPadding;
- var rsBytes = 1 + 1 + rLength + 1 + 1 + sLength;
- var shortLength = rsBytes < MAX_OCTET;
- var dst = Buffer2.allocUnsafe((shortLength ? 2 : 3) + rsBytes);
- var offset = 0;
- dst[offset++] = ENCODED_TAG_SEQ;
- if (shortLength) {
- dst[offset++] = rsBytes;
- } else {
- dst[offset++] = MAX_OCTET | 1;
- dst[offset++] = rsBytes & 255;
- }
- dst[offset++] = ENCODED_TAG_INT;
- dst[offset++] = rLength;
- if (rPadding < 0) {
- dst[offset++] = 0;
- offset += signature.copy(dst, offset, 0, paramBytes);
- } else {
- offset += signature.copy(dst, offset, rPadding, paramBytes);
- }
- dst[offset++] = ENCODED_TAG_INT;
- dst[offset++] = sLength;
- if (sPadding < 0) {
- dst[offset++] = 0;
- signature.copy(dst, offset, paramBytes);
- } else {
- signature.copy(dst, offset, paramBytes + sPadding);
- }
- return dst;
- }
- module.exports = {
- derToJose,
- joseToDer
- };
-});
-
-// ../eve/node_modules/buffer-equal-constant-time/index.js
-var require_buffer_equal_constant_time = __commonJS((exports, module) => {
- var Buffer2 = __require("buffer").Buffer;
- var SlowBuffer = __require("buffer").SlowBuffer;
- module.exports = bufferEq;
- function bufferEq(a, b) {
- if (!Buffer2.isBuffer(a) || !Buffer2.isBuffer(b)) {
- return false;
- }
- if (a.length !== b.length) {
- return false;
- }
- var c = 0;
- for (var i = 0;i < a.length; i++) {
- c |= a[i] ^ b[i];
- }
- return c === 0;
- }
- bufferEq.install = function() {
- Buffer2.prototype.equal = SlowBuffer.prototype.equal = function equal(that) {
- return bufferEq(this, that);
- };
- };
- var origBufEqual = Buffer2.prototype.equal;
- var origSlowBufEqual = SlowBuffer.prototype.equal;
- bufferEq.restore = function() {
- Buffer2.prototype.equal = origBufEqual;
- SlowBuffer.prototype.equal = origSlowBufEqual;
- };
-});
-
-// ../eve/node_modules/jwa/index.js
-var require_jwa = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var crypto2 = __require("crypto");
- var formatEcdsa = require_ecdsa_sig_formatter();
- var util = __require("util");
- var MSG_INVALID_ALGORITHM = `"%s" is not a valid algorithm.
- Supported algorithms are:
- "HS256", "HS384", "HS512", "RS256", "RS384", "RS512", "PS256", "PS384", "PS512", "ES256", "ES384", "ES512" and "none".`;
- var MSG_INVALID_SECRET = "secret must be a string or buffer";
- var MSG_INVALID_VERIFIER_KEY = "key must be a string or a buffer";
- var MSG_INVALID_SIGNER_KEY = "key must be a string, a buffer or an object";
- var supportsKeyObjects = typeof crypto2.createPublicKey === "function";
- if (supportsKeyObjects) {
- MSG_INVALID_VERIFIER_KEY += " or a KeyObject";
- MSG_INVALID_SECRET += "or a KeyObject";
- }
- function checkIsPublicKey(key) {
- if (Buffer2.isBuffer(key)) {
- return;
- }
- if (typeof key === "string") {
- return;
- }
- if (!supportsKeyObjects) {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key !== "object") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key.type !== "string") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key.asymmetricKeyType !== "string") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key.export !== "function") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- }
- function checkIsPrivateKey(key) {
- if (Buffer2.isBuffer(key)) {
- return;
- }
- if (typeof key === "string") {
- return;
- }
- if (typeof key === "object") {
- return;
- }
- throw typeError(MSG_INVALID_SIGNER_KEY);
- }
- function checkIsSecretKey(key) {
- if (Buffer2.isBuffer(key)) {
- return;
- }
- if (typeof key === "string") {
- return key;
- }
- if (!supportsKeyObjects) {
- throw typeError(MSG_INVALID_SECRET);
- }
- if (typeof key !== "object") {
- throw typeError(MSG_INVALID_SECRET);
- }
- if (key.type !== "secret") {
- throw typeError(MSG_INVALID_SECRET);
- }
- if (typeof key.export !== "function") {
- throw typeError(MSG_INVALID_SECRET);
- }
- }
- function fromBase64(base64) {
- return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
- }
- function toBase64(base64url) {
- base64url = base64url.toString();
- var padding = 4 - base64url.length % 4;
- if (padding !== 4) {
- for (var i = 0;i < padding; ++i) {
- base64url += "=";
- }
- }
- return base64url.replace(/\-/g, "+").replace(/_/g, "/");
- }
- function typeError(template) {
- var args = [].slice.call(arguments, 1);
- var errMsg = util.format.bind(util, template).apply(null, args);
- return new TypeError(errMsg);
- }
- function bufferOrString(obj) {
- return Buffer2.isBuffer(obj) || typeof obj === "string";
- }
- function normalizeInput(thing) {
- if (!bufferOrString(thing))
- thing = JSON.stringify(thing);
- return thing;
- }
- function createHmacSigner(bits) {
- return function sign(thing, secret) {
- checkIsSecretKey(secret);
- thing = normalizeInput(thing);
- var hmac = crypto2.createHmac("sha" + bits, secret);
- var sig = (hmac.update(thing), hmac.digest("base64"));
- return fromBase64(sig);
- };
- }
- var bufferEqual;
- var timingSafeEqual = "timingSafeEqual" in crypto2 ? function timingSafeEqual(a, b) {
- if (a.byteLength !== b.byteLength) {
- return false;
- }
- return crypto2.timingSafeEqual(a, b);
- } : function timingSafeEqual(a, b) {
- if (!bufferEqual) {
- bufferEqual = require_buffer_equal_constant_time();
- }
- return bufferEqual(a, b);
- };
- function createHmacVerifier(bits) {
- return function verify(thing, signature, secret) {
- var computedSig = createHmacSigner(bits)(thing, secret);
- return timingSafeEqual(Buffer2.from(signature), Buffer2.from(computedSig));
- };
- }
- function createKeySigner(bits) {
- return function sign(thing, privateKey) {
- checkIsPrivateKey(privateKey);
- thing = normalizeInput(thing);
- var signer = crypto2.createSign("RSA-SHA" + bits);
- var sig = (signer.update(thing), signer.sign(privateKey, "base64"));
- return fromBase64(sig);
- };
- }
- function createKeyVerifier(bits) {
- return function verify(thing, signature, publicKey) {
- checkIsPublicKey(publicKey);
- thing = normalizeInput(thing);
- signature = toBase64(signature);
- var verifier = crypto2.createVerify("RSA-SHA" + bits);
- verifier.update(thing);
- return verifier.verify(publicKey, signature, "base64");
- };
- }
- function createPSSKeySigner(bits) {
- return function sign(thing, privateKey) {
- checkIsPrivateKey(privateKey);
- thing = normalizeInput(thing);
- var signer = crypto2.createSign("RSA-SHA" + bits);
- var sig = (signer.update(thing), signer.sign({
- key: privateKey,
- padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
- saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
- }, "base64"));
- return fromBase64(sig);
- };
- }
- function createPSSKeyVerifier(bits) {
- return function verify(thing, signature, publicKey) {
- checkIsPublicKey(publicKey);
- thing = normalizeInput(thing);
- signature = toBase64(signature);
- var verifier = crypto2.createVerify("RSA-SHA" + bits);
- verifier.update(thing);
- return verifier.verify({
- key: publicKey,
- padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
- saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
- }, signature, "base64");
- };
- }
- function createECDSASigner(bits) {
- var inner = createKeySigner(bits);
- return function sign() {
- var signature = inner.apply(null, arguments);
- signature = formatEcdsa.derToJose(signature, "ES" + bits);
- return signature;
- };
- }
- function createECDSAVerifer(bits) {
- var inner = createKeyVerifier(bits);
- return function verify(thing, signature, publicKey) {
- signature = formatEcdsa.joseToDer(signature, "ES" + bits).toString("base64");
- var result = inner(thing, signature, publicKey);
- return result;
- };
- }
- function createNoneSigner() {
- return function sign() {
- return "";
- };
- }
- function createNoneVerifier() {
- return function verify(thing, signature) {
- return signature === "";
- };
- }
- module.exports = function jwa(algorithm) {
- var signerFactories = {
- hs: createHmacSigner,
- rs: createKeySigner,
- ps: createPSSKeySigner,
- es: createECDSASigner,
- none: createNoneSigner
- };
- var verifierFactories = {
- hs: createHmacVerifier,
- rs: createKeyVerifier,
- ps: createPSSKeyVerifier,
- es: createECDSAVerifer,
- none: createNoneVerifier
- };
- var match = algorithm.match(/^(RS|PS|ES|HS)(256|384|512)$|^(none)$/i);
- if (!match)
- throw typeError(MSG_INVALID_ALGORITHM, algorithm);
- var algo = (match[1] || match[3]).toLowerCase();
- var bits = match[2];
- return {
- sign: signerFactories[algo](bits),
- verify: verifierFactories[algo](bits)
- };
- };
-});
-
-// ../eve/node_modules/jws/lib/tostring.js
-var require_tostring = __commonJS((exports, module) => {
- var Buffer2 = __require("buffer").Buffer;
- module.exports = function toString(obj) {
- if (typeof obj === "string")
- return obj;
- if (typeof obj === "number" || Buffer2.isBuffer(obj))
- return obj.toString();
- return JSON.stringify(obj);
- };
-});
-
-// ../eve/node_modules/jws/lib/sign-stream.js
-var require_sign_stream = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var DataStream = require_data_stream();
- var jwa = require_jwa();
- var Stream = __require("stream");
- var toString = require_tostring();
- var util = __require("util");
- function base64url(string, encoding) {
- return Buffer2.from(string, encoding).toString("base64").replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
- }
- function jwsSecuredInput(header, payload, encoding) {
- encoding = encoding || "utf8";
- var encodedHeader = base64url(toString(header), "binary");
- var encodedPayload = base64url(toString(payload), encoding);
- return util.format("%s.%s", encodedHeader, encodedPayload);
- }
- function jwsSign(opts) {
- var header = opts.header;
- var payload = opts.payload;
- var secretOrKey = opts.secret || opts.privateKey;
- var encoding = opts.encoding;
- var algo = jwa(header.alg);
- var securedInput = jwsSecuredInput(header, payload, encoding);
- var signature = algo.sign(securedInput, secretOrKey);
- return util.format("%s.%s", securedInput, signature);
- }
- function SignStream(opts) {
- var secret = opts.secret || opts.privateKey || opts.key;
- var secretStream = new DataStream(secret);
- this.readable = true;
- this.header = opts.header;
- this.encoding = opts.encoding;
- this.secret = this.privateKey = this.key = secretStream;
- this.payload = new DataStream(opts.payload);
- this.secret.once("close", function() {
- if (!this.payload.writable && this.readable)
- this.sign();
- }.bind(this));
- this.payload.once("close", function() {
- if (!this.secret.writable && this.readable)
- this.sign();
- }.bind(this));
- }
- util.inherits(SignStream, Stream);
- SignStream.prototype.sign = function sign() {
- try {
- var signature = jwsSign({
- header: this.header,
- payload: this.payload.buffer,
- secret: this.secret.buffer,
- encoding: this.encoding
- });
- this.emit("done", signature);
- this.emit("data", signature);
- this.emit("end");
- this.readable = false;
- return signature;
- } catch (e) {
- this.readable = false;
- this.emit("error", e);
- this.emit("close");
- }
- };
- SignStream.sign = jwsSign;
- module.exports = SignStream;
-});
-
-// ../eve/node_modules/jws/lib/verify-stream.js
-var require_verify_stream = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var DataStream = require_data_stream();
- var jwa = require_jwa();
- var Stream = __require("stream");
- var toString = require_tostring();
- var util = __require("util");
- var JWS_REGEX = /^[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?\.([a-zA-Z0-9\-_]+)?$/;
- function isObject(thing) {
- return Object.prototype.toString.call(thing) === "[object Object]";
- }
- function safeJsonParse(thing) {
- if (isObject(thing))
- return thing;
- try {
- return JSON.parse(thing);
- } catch (e) {
- return;
- }
- }
- function headerFromJWS(jwsSig) {
- var encodedHeader = jwsSig.split(".", 1)[0];
- return safeJsonParse(Buffer2.from(encodedHeader, "base64").toString("binary"));
- }
- function securedInputFromJWS(jwsSig) {
- return jwsSig.split(".", 2).join(".");
- }
- function signatureFromJWS(jwsSig) {
- return jwsSig.split(".")[2];
- }
- function payloadFromJWS(jwsSig, encoding) {
- encoding = encoding || "utf8";
- var payload = jwsSig.split(".")[1];
- return Buffer2.from(payload, "base64").toString(encoding);
- }
- function isValidJws(string) {
- return JWS_REGEX.test(string) && !!headerFromJWS(string);
- }
- function jwsVerify(jwsSig, algorithm, secretOrKey) {
- if (!algorithm) {
- var err = new Error("Missing algorithm parameter for jws.verify");
- err.code = "MISSING_ALGORITHM";
- throw err;
- }
- jwsSig = toString(jwsSig);
- var signature = signatureFromJWS(jwsSig);
- var securedInput = securedInputFromJWS(jwsSig);
- var algo = jwa(algorithm);
- return algo.verify(securedInput, signature, secretOrKey);
- }
- function jwsDecode(jwsSig, opts) {
- opts = opts || {};
- jwsSig = toString(jwsSig);
- if (!isValidJws(jwsSig))
- return null;
- var header = headerFromJWS(jwsSig);
- if (!header)
- return null;
- var payload = payloadFromJWS(jwsSig);
- if (header.typ === "JWT" || opts.json)
- payload = JSON.parse(payload, opts.encoding);
- return {
- header,
- payload,
- signature: signatureFromJWS(jwsSig)
- };
- }
- function VerifyStream(opts) {
- opts = opts || {};
- var secretOrKey = opts.secret || opts.publicKey || opts.key;
- var secretStream = new DataStream(secretOrKey);
- this.readable = true;
- this.algorithm = opts.algorithm;
- this.encoding = opts.encoding;
- this.secret = this.publicKey = this.key = secretStream;
- this.signature = new DataStream(opts.signature);
- this.secret.once("close", function() {
- if (!this.signature.writable && this.readable)
- this.verify();
- }.bind(this));
- this.signature.once("close", function() {
- if (!this.secret.writable && this.readable)
- this.verify();
- }.bind(this));
- }
- util.inherits(VerifyStream, Stream);
- VerifyStream.prototype.verify = function verify() {
- try {
- var valid = jwsVerify(this.signature.buffer, this.algorithm, this.key.buffer);
- var obj = jwsDecode(this.signature.buffer, this.encoding);
- this.emit("done", valid, obj);
- this.emit("data", valid);
- this.emit("end");
- this.readable = false;
- return valid;
- } catch (e) {
- this.readable = false;
- this.emit("error", e);
- this.emit("close");
- }
- };
- VerifyStream.decode = jwsDecode;
- VerifyStream.isValid = isValidJws;
- VerifyStream.verify = jwsVerify;
- module.exports = VerifyStream;
-});
-
-// ../eve/node_modules/jws/index.js
-var require_jws = __commonJS((exports) => {
- var SignStream = require_sign_stream();
- var VerifyStream = require_verify_stream();
- var ALGORITHMS = [
- "HS256",
- "HS384",
- "HS512",
- "RS256",
- "RS384",
- "RS512",
- "PS256",
- "PS384",
- "PS512",
- "ES256",
- "ES384",
- "ES512"
- ];
- exports.ALGORITHMS = ALGORITHMS;
- exports.sign = SignStream.sign;
- exports.verify = VerifyStream.verify;
- exports.decode = VerifyStream.decode;
- exports.isValid = VerifyStream.isValid;
- exports.createSign = function createSign(opts) {
- return new SignStream(opts);
- };
- exports.createVerify = function createVerify(opts) {
- return new VerifyStream(opts);
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/decode.js
-var require_decode = __commonJS((exports, module) => {
- var jws = require_jws();
- module.exports = function(jwt, options2) {
- options2 = options2 || {};
- var decoded = jws.decode(jwt, options2);
- if (!decoded) {
- return null;
- }
- var payload = decoded.payload;
- if (typeof payload === "string") {
- try {
- var obj = JSON.parse(payload);
- if (obj !== null && typeof obj === "object") {
- payload = obj;
- }
- } catch (e) {}
- }
- if (options2.complete === true) {
- return {
- header: decoded.header,
- payload,
- signature: decoded.signature
- };
- }
- return payload;
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/JsonWebTokenError.js
-var require_JsonWebTokenError = __commonJS((exports, module) => {
- var JsonWebTokenError = function(message, error) {
- Error.call(this, message);
- if (Error.captureStackTrace) {
- Error.captureStackTrace(this, this.constructor);
- }
- this.name = "JsonWebTokenError";
- this.message = message;
- if (error)
- this.inner = error;
- };
- JsonWebTokenError.prototype = Object.create(Error.prototype);
- JsonWebTokenError.prototype.constructor = JsonWebTokenError;
- module.exports = JsonWebTokenError;
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/NotBeforeError.js
-var require_NotBeforeError = __commonJS((exports, module) => {
- var JsonWebTokenError = require_JsonWebTokenError();
- var NotBeforeError = function(message, date) {
- JsonWebTokenError.call(this, message);
- this.name = "NotBeforeError";
- this.date = date;
- };
- NotBeforeError.prototype = Object.create(JsonWebTokenError.prototype);
- NotBeforeError.prototype.constructor = NotBeforeError;
- module.exports = NotBeforeError;
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/TokenExpiredError.js
-var require_TokenExpiredError = __commonJS((exports, module) => {
- var JsonWebTokenError = require_JsonWebTokenError();
- var TokenExpiredError = function(message, expiredAt) {
- JsonWebTokenError.call(this, message);
- this.name = "TokenExpiredError";
- this.expiredAt = expiredAt;
- };
- TokenExpiredError.prototype = Object.create(JsonWebTokenError.prototype);
- TokenExpiredError.prototype.constructor = TokenExpiredError;
- module.exports = TokenExpiredError;
-});
-
-// ../eve/node_modules/ms/index.js
-var require_ms = __commonJS((exports, module) => {
- var s = 1000;
- var m = s * 60;
- var h = m * 60;
- var d = h * 24;
- var w = d * 7;
- var y = d * 365.25;
- module.exports = function(val, options2) {
- options2 = options2 || {};
- var type = typeof val;
- if (type === "string" && val.length > 0) {
- return parse(val);
- } else if (type === "number" && isFinite(val)) {
- return options2.long ? fmtLong(val) : fmtShort(val);
- }
- throw new Error("val is not a non-empty string or a valid number. val=" + JSON.stringify(val));
- };
- function parse(str) {
- str = String(str);
- if (str.length > 100) {
- return;
- }
- var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);
- if (!match) {
- return;
- }
- var n = parseFloat(match[1]);
- var type = (match[2] || "ms").toLowerCase();
- switch (type) {
- case "years":
- case "year":
- case "yrs":
- case "yr":
- case "y":
- return n * y;
- case "weeks":
- case "week":
- case "w":
- return n * w;
- case "days":
- case "day":
- case "d":
- return n * d;
- case "hours":
- case "hour":
- case "hrs":
- case "hr":
- case "h":
- return n * h;
- case "minutes":
- case "minute":
- case "mins":
- case "min":
- case "m":
- return n * m;
- case "seconds":
- case "second":
- case "secs":
- case "sec":
- case "s":
- return n * s;
- case "milliseconds":
- case "millisecond":
- case "msecs":
- case "msec":
- case "ms":
- return n;
- default:
- return;
- }
- }
- function fmtShort(ms) {
- var msAbs = Math.abs(ms);
- if (msAbs >= d) {
- return Math.round(ms / d) + "d";
- }
- if (msAbs >= h) {
- return Math.round(ms / h) + "h";
- }
- if (msAbs >= m) {
- return Math.round(ms / m) + "m";
- }
- if (msAbs >= s) {
- return Math.round(ms / s) + "s";
- }
- return ms + "ms";
- }
- function fmtLong(ms) {
- var msAbs = Math.abs(ms);
- if (msAbs >= d) {
- return plural(ms, msAbs, d, "day");
- }
- if (msAbs >= h) {
- return plural(ms, msAbs, h, "hour");
- }
- if (msAbs >= m) {
- return plural(ms, msAbs, m, "minute");
- }
- if (msAbs >= s) {
- return plural(ms, msAbs, s, "second");
- }
- return ms + " ms";
- }
- function plural(ms, msAbs, n, name) {
- var isPlural = msAbs >= n * 1.5;
- return Math.round(ms / n) + " " + name + (isPlural ? "s" : "");
- }
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/timespan.js
-var require_timespan = __commonJS((exports, module) => {
- var ms = require_ms();
- module.exports = function(time, iat) {
- var timestamp = iat || Math.floor(Date.now() / 1000);
- if (typeof time === "string") {
- var milliseconds = ms(time);
- if (typeof milliseconds === "undefined") {
- return;
- }
- return Math.floor(timestamp + milliseconds / 1000);
- } else if (typeof time === "number") {
- return timestamp + time;
- } else {
- return;
- }
- };
-});
-
-// ../eve/node_modules/semver/internal/constants.js
-var require_constants = __commonJS((exports, module) => {
- var SEMVER_SPEC_VERSION = "2.0.0";
- var MAX_LENGTH = 256;
- var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
- var MAX_SAFE_COMPONENT_LENGTH = 16;
- var MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6;
- var RELEASE_TYPES = [
- "major",
- "premajor",
- "minor",
- "preminor",
- "patch",
- "prepatch",
- "prerelease"
- ];
- module.exports = {
- MAX_LENGTH,
- MAX_SAFE_COMPONENT_LENGTH,
- MAX_SAFE_BUILD_LENGTH,
- MAX_SAFE_INTEGER,
- RELEASE_TYPES,
- SEMVER_SPEC_VERSION,
- FLAG_INCLUDE_PRERELEASE: 1,
- FLAG_LOOSE: 2
- };
-});
-
-// ../eve/node_modules/semver/internal/debug.js
-var require_debug = __commonJS((exports, module) => {
- var debug = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => {};
- module.exports = debug;
-});
-
-// ../eve/node_modules/semver/internal/re.js
-var require_re = __commonJS((exports, module) => {
- var {
- MAX_SAFE_COMPONENT_LENGTH,
- MAX_SAFE_BUILD_LENGTH,
- MAX_LENGTH
- } = require_constants();
- var debug = require_debug();
- exports = module.exports = {};
- var re = exports.re = [];
- var safeRe = exports.safeRe = [];
- var src = exports.src = [];
- var safeSrc = exports.safeSrc = [];
- var t = exports.t = {};
- var R = 0;
- var LETTERDASHNUMBER = "[a-zA-Z0-9-]";
- var safeRegexReplacements = [
- ["\\s", 1],
- ["\\d", MAX_LENGTH],
- [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH]
- ];
- var makeSafeRegex = (value) => {
- for (const [token, max] of safeRegexReplacements) {
- value = value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);
- }
- return value;
- };
- var createToken = (name, value, isGlobal) => {
- const safe = makeSafeRegex(value);
- const index = R++;
- debug(name, index, value);
- t[name] = index;
- src[index] = value;
- safeSrc[index] = safe;
- re[index] = new RegExp(value, isGlobal ? "g" : undefined);
- safeRe[index] = new RegExp(safe, isGlobal ? "g" : undefined);
- };
- createToken("NUMERICIDENTIFIER", "0|[1-9]\\d*");
- createToken("NUMERICIDENTIFIERLOOSE", "\\d+");
- createToken("NONNUMERICIDENTIFIER", `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);
- createToken("MAINVERSION", `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})`);
- createToken("MAINVERSIONLOOSE", `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})`);
- createToken("PRERELEASEIDENTIFIER", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIER]})`);
- createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIERLOOSE]})`);
- createToken("PRERELEASE", `(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);
- createToken("PRERELEASELOOSE", `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);
- createToken("BUILDIDENTIFIER", `${LETTERDASHNUMBER}+`);
- createToken("BUILD", `(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);
- createToken("FULLPLAIN", `v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);
- createToken("FULL", `^${src[t.FULLPLAIN]}$`);
- createToken("LOOSEPLAIN", `[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);
- createToken("LOOSE", `^${src[t.LOOSEPLAIN]}$`);
- createToken("GTLT", "((?:<|>)?=?)");
- createToken("XRANGEIDENTIFIERLOOSE", `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);
- createToken("XRANGEIDENTIFIER", `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);
- createToken("XRANGEPLAIN", `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?` + `)?)?`);
- createToken("XRANGEPLAINLOOSE", `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?` + `)?)?`);
- createToken("XRANGE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);
- createToken("XRANGELOOSE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);
- createToken("COERCEPLAIN", `${"(^|[^\\d])" + "(\\d{1,"}${MAX_SAFE_COMPONENT_LENGTH}})` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);
- createToken("COERCE", `${src[t.COERCEPLAIN]}(?:$|[^\\d])`);
- createToken("COERCEFULL", src[t.COERCEPLAIN] + `(?:${src[t.PRERELEASE]})?` + `(?:${src[t.BUILD]})?` + `(?:$|[^\\d])`);
- createToken("COERCERTL", src[t.COERCE], true);
- createToken("COERCERTLFULL", src[t.COERCEFULL], true);
- createToken("LONETILDE", "(?:~>?)");
- createToken("TILDETRIM", `(\\s*)${src[t.LONETILDE]}\\s+`, true);
- exports.tildeTrimReplace = "$1~";
- createToken("TILDE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);
- createToken("TILDELOOSE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);
- createToken("LONECARET", "(?:\\^)");
- createToken("CARETTRIM", `(\\s*)${src[t.LONECARET]}\\s+`, true);
- exports.caretTrimReplace = "$1^";
- createToken("CARET", `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);
- createToken("CARETLOOSE", `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);
- createToken("COMPARATORLOOSE", `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);
- createToken("COMPARATOR", `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);
- createToken("COMPARATORTRIM", `(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true);
- exports.comparatorTrimReplace = "$1$2$3";
- createToken("HYPHENRANGE", `^\\s*(${src[t.XRANGEPLAIN]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAIN]})` + `\\s*$`);
- createToken("HYPHENRANGELOOSE", `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAINLOOSE]})` + `\\s*$`);
- createToken("STAR", "(<|>)?=?\\s*\\*");
- createToken("GTE0", "^\\s*>=\\s*0\\.0\\.0\\s*$");
- createToken("GTE0PRE", "^\\s*>=\\s*0\\.0\\.0-0\\s*$");
-});
-
-// ../eve/node_modules/semver/internal/parse-options.js
-var require_parse_options = __commonJS((exports, module) => {
- var looseOption = Object.freeze({ loose: true });
- var emptyOpts = Object.freeze({});
- var parseOptions = (options2) => {
- if (!options2) {
- return emptyOpts;
- }
- if (typeof options2 !== "object") {
- return looseOption;
- }
- return options2;
- };
- module.exports = parseOptions;
-});
-
-// ../eve/node_modules/semver/internal/identifiers.js
-var require_identifiers = __commonJS((exports, module) => {
- var numeric = /^[0-9]+$/;
- var compareIdentifiers = (a, b) => {
- const anum = numeric.test(a);
- const bnum = numeric.test(b);
- if (anum && bnum) {
- a = +a;
- b = +b;
- }
- return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;
- };
- var rcompareIdentifiers = (a, b) => compareIdentifiers(b, a);
- module.exports = {
- compareIdentifiers,
- rcompareIdentifiers
- };
-});
-
-// ../eve/node_modules/semver/classes/semver.js
-var require_semver = __commonJS((exports, module) => {
- var debug = require_debug();
- var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants();
- var { safeRe: re, t } = require_re();
- var parseOptions = require_parse_options();
- var { compareIdentifiers } = require_identifiers();
-
- class SemVer {
- constructor(version, options2) {
- options2 = parseOptions(options2);
- if (version instanceof SemVer) {
- if (version.loose === !!options2.loose && version.includePrerelease === !!options2.includePrerelease) {
- return version;
- } else {
- version = version.version;
- }
- } else if (typeof version !== "string") {
- throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`);
- }
- if (version.length > MAX_LENGTH) {
- throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);
- }
- debug("SemVer", version, options2);
- this.options = options2;
- this.loose = !!options2.loose;
- this.includePrerelease = !!options2.includePrerelease;
- const m = version.trim().match(options2.loose ? re[t.LOOSE] : re[t.FULL]);
- if (!m) {
- throw new TypeError(`Invalid Version: ${version}`);
- }
- this.raw = version;
- this.major = +m[1];
- this.minor = +m[2];
- this.patch = +m[3];
- if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
- throw new TypeError("Invalid major version");
- }
- if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
- throw new TypeError("Invalid minor version");
- }
- if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
- throw new TypeError("Invalid patch version");
- }
- if (!m[4]) {
- this.prerelease = [];
- } else {
- this.prerelease = m[4].split(".").map((id) => {
- if (/^[0-9]+$/.test(id)) {
- const num = +id;
- if (num >= 0 && num < MAX_SAFE_INTEGER) {
- return num;
- }
- }
- return id;
- });
- }
- this.build = m[5] ? m[5].split(".") : [];
- this.format();
- }
- format() {
- this.version = `${this.major}.${this.minor}.${this.patch}`;
- if (this.prerelease.length) {
- this.version += `-${this.prerelease.join(".")}`;
- }
- return this.version;
- }
- toString() {
- return this.version;
- }
- compare(other) {
- debug("SemVer.compare", this.version, this.options, other);
- if (!(other instanceof SemVer)) {
- if (typeof other === "string" && other === this.version) {
- return 0;
- }
- other = new SemVer(other, this.options);
- }
- if (other.version === this.version) {
- return 0;
- }
- return this.compareMain(other) || this.comparePre(other);
- }
- compareMain(other) {
- if (!(other instanceof SemVer)) {
- other = new SemVer(other, this.options);
- }
- return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch);
- }
- comparePre(other) {
- if (!(other instanceof SemVer)) {
- other = new SemVer(other, this.options);
- }
- if (this.prerelease.length && !other.prerelease.length) {
- return -1;
- } else if (!this.prerelease.length && other.prerelease.length) {
- return 1;
- } else if (!this.prerelease.length && !other.prerelease.length) {
- return 0;
- }
- let i = 0;
- do {
- const a = this.prerelease[i];
- const b = other.prerelease[i];
- debug("prerelease compare", i, a, b);
- if (a === undefined && b === undefined) {
- return 0;
- } else if (b === undefined) {
- return 1;
- } else if (a === undefined) {
- return -1;
- } else if (a === b) {
- continue;
- } else {
- return compareIdentifiers(a, b);
- }
- } while (++i);
- }
- compareBuild(other) {
- if (!(other instanceof SemVer)) {
- other = new SemVer(other, this.options);
- }
- let i = 0;
- do {
- const a = this.build[i];
- const b = other.build[i];
- debug("build compare", i, a, b);
- if (a === undefined && b === undefined) {
- return 0;
- } else if (b === undefined) {
- return 1;
- } else if (a === undefined) {
- return -1;
- } else if (a === b) {
- continue;
- } else {
- return compareIdentifiers(a, b);
- }
- } while (++i);
- }
- inc(release, identifier, identifierBase) {
- if (release.startsWith("pre")) {
- if (!identifier && identifierBase === false) {
- throw new Error("invalid increment argument: identifier is empty");
- }
- if (identifier) {
- const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]);
- if (!match || match[1] !== identifier) {
- throw new Error(`invalid identifier: ${identifier}`);
- }
- }
- }
- switch (release) {
- case "premajor":
- this.prerelease.length = 0;
- this.patch = 0;
- this.minor = 0;
- this.major++;
- this.inc("pre", identifier, identifierBase);
- break;
- case "preminor":
- this.prerelease.length = 0;
- this.patch = 0;
- this.minor++;
- this.inc("pre", identifier, identifierBase);
- break;
- case "prepatch":
- this.prerelease.length = 0;
- this.inc("patch", identifier, identifierBase);
- this.inc("pre", identifier, identifierBase);
- break;
- case "prerelease":
- if (this.prerelease.length === 0) {
- this.inc("patch", identifier, identifierBase);
- }
- this.inc("pre", identifier, identifierBase);
- break;
- case "release":
- if (this.prerelease.length === 0) {
- throw new Error(`version ${this.raw} is not a prerelease`);
- }
- this.prerelease.length = 0;
- break;
- case "major":
- if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) {
- this.major++;
- }
- this.minor = 0;
- this.patch = 0;
- this.prerelease = [];
- break;
- case "minor":
- if (this.patch !== 0 || this.prerelease.length === 0) {
- this.minor++;
- }
- this.patch = 0;
- this.prerelease = [];
- break;
- case "patch":
- if (this.prerelease.length === 0) {
- this.patch++;
- }
- this.prerelease = [];
- break;
- case "pre": {
- const base = Number(identifierBase) ? 1 : 0;
- if (this.prerelease.length === 0) {
- this.prerelease = [base];
- } else {
- let i = this.prerelease.length;
- while (--i >= 0) {
- if (typeof this.prerelease[i] === "number") {
- this.prerelease[i]++;
- i = -2;
- }
- }
- if (i === -1) {
- if (identifier === this.prerelease.join(".") && identifierBase === false) {
- throw new Error("invalid increment argument: identifier already exists");
- }
- this.prerelease.push(base);
- }
- }
- if (identifier) {
- let prerelease = [identifier, base];
- if (identifierBase === false) {
- prerelease = [identifier];
- }
- if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
- if (isNaN(this.prerelease[1])) {
- this.prerelease = prerelease;
- }
- } else {
- this.prerelease = prerelease;
- }
- }
- break;
- }
- default:
- throw new Error(`invalid increment argument: ${release}`);
- }
- this.raw = this.format();
- if (this.build.length) {
- this.raw += `+${this.build.join(".")}`;
- }
- return this;
- }
- }
- module.exports = SemVer;
-});
-
-// ../eve/node_modules/semver/functions/parse.js
-var require_parse = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var parse = (version, options2, throwErrors = false) => {
- if (version instanceof SemVer) {
- return version;
- }
- try {
- return new SemVer(version, options2);
- } catch (er) {
- if (!throwErrors) {
- return null;
- }
- throw er;
- }
- };
- module.exports = parse;
-});
-
-// ../eve/node_modules/semver/functions/valid.js
-var require_valid = __commonJS((exports, module) => {
- var parse = require_parse();
- var valid = (version, options2) => {
- const v = parse(version, options2);
- return v ? v.version : null;
- };
- module.exports = valid;
-});
-
-// ../eve/node_modules/semver/functions/clean.js
-var require_clean = __commonJS((exports, module) => {
- var parse = require_parse();
- var clean = (version, options2) => {
- const s = parse(version.trim().replace(/^[=v]+/, ""), options2);
- return s ? s.version : null;
- };
- module.exports = clean;
-});
-
-// ../eve/node_modules/semver/functions/inc.js
-var require_inc = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var inc = (version, release, options2, identifier, identifierBase) => {
- if (typeof options2 === "string") {
- identifierBase = identifier;
- identifier = options2;
- options2 = undefined;
- }
- try {
- return new SemVer(version instanceof SemVer ? version.version : version, options2).inc(release, identifier, identifierBase).version;
- } catch (er) {
- return null;
- }
- };
- module.exports = inc;
-});
-
-// ../eve/node_modules/semver/functions/diff.js
-var require_diff = __commonJS((exports, module) => {
- var parse = require_parse();
- var diff = (version1, version2) => {
- const v1 = parse(version1, null, true);
- const v2 = parse(version2, null, true);
- const comparison = v1.compare(v2);
- if (comparison === 0) {
- return null;
- }
- const v1Higher = comparison > 0;
- const highVersion = v1Higher ? v1 : v2;
- const lowVersion = v1Higher ? v2 : v1;
- const highHasPre = !!highVersion.prerelease.length;
- const lowHasPre = !!lowVersion.prerelease.length;
- if (lowHasPre && !highHasPre) {
- if (!lowVersion.patch && !lowVersion.minor) {
- return "major";
- }
- if (lowVersion.compareMain(highVersion) === 0) {
- if (lowVersion.minor && !lowVersion.patch) {
- return "minor";
- }
- return "patch";
- }
- }
- const prefix = highHasPre ? "pre" : "";
- if (v1.major !== v2.major) {
- return prefix + "major";
- }
- if (v1.minor !== v2.minor) {
- return prefix + "minor";
- }
- if (v1.patch !== v2.patch) {
- return prefix + "patch";
- }
- return "prerelease";
- };
- module.exports = diff;
-});
-
-// ../eve/node_modules/semver/functions/major.js
-var require_major = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var major = (a, loose) => new SemVer(a, loose).major;
- module.exports = major;
-});
-
-// ../eve/node_modules/semver/functions/minor.js
-var require_minor = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var minor = (a, loose) => new SemVer(a, loose).minor;
- module.exports = minor;
-});
-
-// ../eve/node_modules/semver/functions/patch.js
-var require_patch = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var patch = (a, loose) => new SemVer(a, loose).patch;
- module.exports = patch;
-});
-
-// ../eve/node_modules/semver/functions/prerelease.js
-var require_prerelease = __commonJS((exports, module) => {
- var parse = require_parse();
- var prerelease = (version, options2) => {
- const parsed = parse(version, options2);
- return parsed && parsed.prerelease.length ? parsed.prerelease : null;
- };
- module.exports = prerelease;
-});
-
-// ../eve/node_modules/semver/functions/compare.js
-var require_compare = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose));
- module.exports = compare;
-});
-
-// ../eve/node_modules/semver/functions/rcompare.js
-var require_rcompare = __commonJS((exports, module) => {
- var compare = require_compare();
- var rcompare = (a, b, loose) => compare(b, a, loose);
- module.exports = rcompare;
-});
-
-// ../eve/node_modules/semver/functions/compare-loose.js
-var require_compare_loose = __commonJS((exports, module) => {
- var compare = require_compare();
- var compareLoose = (a, b) => compare(a, b, true);
- module.exports = compareLoose;
-});
-
-// ../eve/node_modules/semver/functions/compare-build.js
-var require_compare_build = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var compareBuild = (a, b, loose) => {
- const versionA = new SemVer(a, loose);
- const versionB = new SemVer(b, loose);
- return versionA.compare(versionB) || versionA.compareBuild(versionB);
- };
- module.exports = compareBuild;
-});
-
-// ../eve/node_modules/semver/functions/sort.js
-var require_sort = __commonJS((exports, module) => {
- var compareBuild = require_compare_build();
- var sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose));
- module.exports = sort;
-});
-
-// ../eve/node_modules/semver/functions/rsort.js
-var require_rsort = __commonJS((exports, module) => {
- var compareBuild = require_compare_build();
- var rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose));
- module.exports = rsort;
-});
-
-// ../eve/node_modules/semver/functions/gt.js
-var require_gt = __commonJS((exports, module) => {
- var compare = require_compare();
- var gt = (a, b, loose) => compare(a, b, loose) > 0;
- module.exports = gt;
-});
-
-// ../eve/node_modules/semver/functions/lt.js
-var require_lt = __commonJS((exports, module) => {
- var compare = require_compare();
- var lt = (a, b, loose) => compare(a, b, loose) < 0;
- module.exports = lt;
-});
-
-// ../eve/node_modules/semver/functions/eq.js
-var require_eq = __commonJS((exports, module) => {
- var compare = require_compare();
- var eq = (a, b, loose) => compare(a, b, loose) === 0;
- module.exports = eq;
-});
-
-// ../eve/node_modules/semver/functions/neq.js
-var require_neq = __commonJS((exports, module) => {
- var compare = require_compare();
- var neq = (a, b, loose) => compare(a, b, loose) !== 0;
- module.exports = neq;
-});
-
-// ../eve/node_modules/semver/functions/gte.js
-var require_gte = __commonJS((exports, module) => {
- var compare = require_compare();
- var gte = (a, b, loose) => compare(a, b, loose) >= 0;
- module.exports = gte;
-});
-
-// ../eve/node_modules/semver/functions/lte.js
-var require_lte = __commonJS((exports, module) => {
- var compare = require_compare();
- var lte = (a, b, loose) => compare(a, b, loose) <= 0;
- module.exports = lte;
-});
-
-// ../eve/node_modules/semver/functions/cmp.js
-var require_cmp = __commonJS((exports, module) => {
- var eq = require_eq();
- var neq = require_neq();
- var gt = require_gt();
- var gte = require_gte();
- var lt = require_lt();
- var lte = require_lte();
- var cmp = (a, op, b, loose) => {
- switch (op) {
- case "===":
- if (typeof a === "object") {
- a = a.version;
- }
- if (typeof b === "object") {
- b = b.version;
- }
- return a === b;
- case "!==":
- if (typeof a === "object") {
- a = a.version;
- }
- if (typeof b === "object") {
- b = b.version;
- }
- return a !== b;
- case "":
- case "=":
- case "==":
- return eq(a, b, loose);
- case "!=":
- return neq(a, b, loose);
- case ">":
- return gt(a, b, loose);
- case ">=":
- return gte(a, b, loose);
- case "<":
- return lt(a, b, loose);
- case "<=":
- return lte(a, b, loose);
- default:
- throw new TypeError(`Invalid operator: ${op}`);
- }
- };
- module.exports = cmp;
-});
-
-// ../eve/node_modules/semver/functions/coerce.js
-var require_coerce = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var parse = require_parse();
- var { safeRe: re, t } = require_re();
- var coerce = (version, options2) => {
- if (version instanceof SemVer) {
- return version;
- }
- if (typeof version === "number") {
- version = String(version);
- }
- if (typeof version !== "string") {
- return null;
- }
- options2 = options2 || {};
- let match = null;
- if (!options2.rtl) {
- match = version.match(options2.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]);
- } else {
- const coerceRtlRegex = options2.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL];
- let next;
- while ((next = coerceRtlRegex.exec(version)) && (!match || match.index + match[0].length !== version.length)) {
- if (!match || next.index + next[0].length !== match.index + match[0].length) {
- match = next;
- }
- coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length;
- }
- coerceRtlRegex.lastIndex = -1;
- }
- if (match === null) {
- return null;
- }
- const major = match[2];
- const minor = match[3] || "0";
- const patch = match[4] || "0";
- const prerelease = options2.includePrerelease && match[5] ? `-${match[5]}` : "";
- const build = options2.includePrerelease && match[6] ? `+${match[6]}` : "";
- return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options2);
- };
- module.exports = coerce;
-});
-
-// ../eve/node_modules/semver/internal/lrucache.js
-var require_lrucache = __commonJS((exports, module) => {
- class LRUCache {
- constructor() {
- this.max = 1000;
- this.map = new Map;
- }
- get(key) {
- const value = this.map.get(key);
- if (value === undefined) {
- return;
- } else {
- this.map.delete(key);
- this.map.set(key, value);
- return value;
- }
- }
- delete(key) {
- return this.map.delete(key);
- }
- set(key, value) {
- const deleted = this.delete(key);
- if (!deleted && value !== undefined) {
- if (this.map.size >= this.max) {
- const firstKey = this.map.keys().next().value;
- this.delete(firstKey);
- }
- this.map.set(key, value);
- }
- return this;
- }
- }
- module.exports = LRUCache;
-});
-
-// ../eve/node_modules/semver/classes/range.js
-var require_range = __commonJS((exports, module) => {
- var SPACE_CHARACTERS = /\s+/g;
-
- class Range {
- constructor(range, options2) {
- options2 = parseOptions(options2);
- if (range instanceof Range) {
- if (range.loose === !!options2.loose && range.includePrerelease === !!options2.includePrerelease) {
- return range;
- } else {
- return new Range(range.raw, options2);
- }
- }
- if (range instanceof Comparator) {
- this.raw = range.value;
- this.set = [[range]];
- this.formatted = undefined;
- return this;
- }
- this.options = options2;
- this.loose = !!options2.loose;
- this.includePrerelease = !!options2.includePrerelease;
- this.raw = range.trim().replace(SPACE_CHARACTERS, " ");
- this.set = this.raw.split("||").map((r) => this.parseRange(r.trim())).filter((c) => c.length);
- if (!this.set.length) {
- throw new TypeError(`Invalid SemVer Range: ${this.raw}`);
- }
- if (this.set.length > 1) {
- const first = this.set[0];
- this.set = this.set.filter((c) => !isNullSet(c[0]));
- if (this.set.length === 0) {
- this.set = [first];
- } else if (this.set.length > 1) {
- for (const c of this.set) {
- if (c.length === 1 && isAny(c[0])) {
- this.set = [c];
- break;
- }
- }
- }
- }
- this.formatted = undefined;
- }
- get range() {
- if (this.formatted === undefined) {
- this.formatted = "";
- for (let i = 0;i < this.set.length; i++) {
- if (i > 0) {
- this.formatted += "||";
- }
- const comps = this.set[i];
- for (let k = 0;k < comps.length; k++) {
- if (k > 0) {
- this.formatted += " ";
- }
- this.formatted += comps[k].toString().trim();
- }
- }
- }
- return this.formatted;
- }
- format() {
- return this.range;
- }
- toString() {
- return this.range;
- }
- parseRange(range) {
- const memoOpts = (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | (this.options.loose && FLAG_LOOSE);
- const memoKey = memoOpts + ":" + range;
- const cached = cache.get(memoKey);
- if (cached) {
- return cached;
- }
- const loose = this.options.loose;
- const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE];
- range = range.replace(hr, hyphenReplace(this.options.includePrerelease));
- debug("hyphen replace", range);
- range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace);
- debug("comparator trim", range);
- range = range.replace(re[t.TILDETRIM], tildeTrimReplace);
- debug("tilde trim", range);
- range = range.replace(re[t.CARETTRIM], caretTrimReplace);
- debug("caret trim", range);
- let rangeList = range.split(" ").map((comp) => parseComparator(comp, this.options)).join(" ").split(/\s+/).map((comp) => replaceGTE0(comp, this.options));
- if (loose) {
- rangeList = rangeList.filter((comp) => {
- debug("loose invalid filter", comp, this.options);
- return !!comp.match(re[t.COMPARATORLOOSE]);
- });
- }
- debug("range list", rangeList);
- const rangeMap = new Map;
- const comparators = rangeList.map((comp) => new Comparator(comp, this.options));
- for (const comp of comparators) {
- if (isNullSet(comp)) {
- return [comp];
- }
- rangeMap.set(comp.value, comp);
- }
- if (rangeMap.size > 1 && rangeMap.has("")) {
- rangeMap.delete("");
- }
- const result = [...rangeMap.values()];
- cache.set(memoKey, result);
- return result;
- }
- intersects(range, options2) {
- if (!(range instanceof Range)) {
- throw new TypeError("a Range is required");
- }
- return this.set.some((thisComparators) => {
- return isSatisfiable(thisComparators, options2) && range.set.some((rangeComparators) => {
- return isSatisfiable(rangeComparators, options2) && thisComparators.every((thisComparator) => {
- return rangeComparators.every((rangeComparator) => {
- return thisComparator.intersects(rangeComparator, options2);
- });
- });
- });
- });
- }
- test(version) {
- if (!version) {
- return false;
- }
- if (typeof version === "string") {
- try {
- version = new SemVer(version, this.options);
- } catch (er) {
- return false;
- }
- }
- for (let i = 0;i < this.set.length; i++) {
- if (testSet(this.set[i], version, this.options)) {
- return true;
- }
- }
- return false;
- }
- }
- module.exports = Range;
- var LRU = require_lrucache();
- var cache = new LRU;
- var parseOptions = require_parse_options();
- var Comparator = require_comparator();
- var debug = require_debug();
- var SemVer = require_semver();
- var {
- safeRe: re,
- t,
- comparatorTrimReplace,
- tildeTrimReplace,
- caretTrimReplace
- } = require_re();
- var { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require_constants();
- var isNullSet = (c) => c.value === "<0.0.0-0";
- var isAny = (c) => c.value === "";
- var isSatisfiable = (comparators, options2) => {
- let result = true;
- const remainingComparators = comparators.slice();
- let testComparator = remainingComparators.pop();
- while (result && remainingComparators.length) {
- result = remainingComparators.every((otherComparator) => {
- return testComparator.intersects(otherComparator, options2);
- });
- testComparator = remainingComparators.pop();
- }
- return result;
- };
- var parseComparator = (comp, options2) => {
- debug("comp", comp, options2);
- comp = replaceCarets(comp, options2);
- debug("caret", comp);
- comp = replaceTildes(comp, options2);
- debug("tildes", comp);
- comp = replaceXRanges(comp, options2);
- debug("xrange", comp);
- comp = replaceStars(comp, options2);
- debug("stars", comp);
- return comp;
- };
- var isX = (id) => !id || id.toLowerCase() === "x" || id === "*";
- var replaceTildes = (comp, options2) => {
- return comp.trim().split(/\s+/).map((c) => replaceTilde(c, options2)).join(" ");
- };
- var replaceTilde = (comp, options2) => {
- const r = options2.loose ? re[t.TILDELOOSE] : re[t.TILDE];
- return comp.replace(r, (_, M, m, p, pr) => {
- debug("tilde", comp, _, M, m, p, pr);
- let ret;
- if (isX(M)) {
- ret = "";
- } else if (isX(m)) {
- ret = `>=${M}.0.0 <${+M + 1}.0.0-0`;
- } else if (isX(p)) {
- ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;
- } else if (pr) {
- debug("replaceTilde pr", pr);
- ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
- } else {
- ret = `>=${M}.${m}.${p} <${M}.${+m + 1}.0-0`;
- }
- debug("tilde return", ret);
- return ret;
- });
- };
- var replaceCarets = (comp, options2) => {
- return comp.trim().split(/\s+/).map((c) => replaceCaret(c, options2)).join(" ");
- };
- var replaceCaret = (comp, options2) => {
- debug("caret", comp, options2);
- const r = options2.loose ? re[t.CARETLOOSE] : re[t.CARET];
- const z = options2.includePrerelease ? "-0" : "";
- return comp.replace(r, (_, M, m, p, pr) => {
- debug("caret", comp, _, M, m, p, pr);
- let ret;
- if (isX(M)) {
- ret = "";
- } else if (isX(m)) {
- ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`;
- } else if (isX(p)) {
- if (M === "0") {
- ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`;
- } else {
- ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`;
- }
- } else if (pr) {
- debug("replaceCaret pr", pr);
- if (M === "0") {
- if (m === "0") {
- ret = `>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p + 1}-0`;
- } else {
- ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
- }
- } else {
- ret = `>=${M}.${m}.${p}-${pr} <${+M + 1}.0.0-0`;
- }
- } else {
- debug("no pr");
- if (M === "0") {
- if (m === "0") {
- ret = `>=${M}.${m}.${p}${z} <${M}.${m}.${+p + 1}-0`;
- } else {
- ret = `>=${M}.${m}.${p}${z} <${M}.${+m + 1}.0-0`;
- }
- } else {
- ret = `>=${M}.${m}.${p} <${+M + 1}.0.0-0`;
- }
- }
- debug("caret return", ret);
- return ret;
- });
- };
- var replaceXRanges = (comp, options2) => {
- debug("replaceXRanges", comp, options2);
- return comp.split(/\s+/).map((c) => replaceXRange(c, options2)).join(" ");
- };
- var replaceXRange = (comp, options2) => {
- comp = comp.trim();
- const r = options2.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];
- return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
- debug("xRange", comp, ret, gtlt, M, m, p, pr);
- const xM = isX(M);
- const xm = xM || isX(m);
- const xp = xm || isX(p);
- const anyX = xp;
- if (gtlt === "=" && anyX) {
- gtlt = "";
- }
- pr = options2.includePrerelease ? "-0" : "";
- if (xM) {
- if (gtlt === ">" || gtlt === "<") {
- ret = "<0.0.0-0";
- } else {
- ret = "*";
- }
- } else if (gtlt && anyX) {
- if (xm) {
- m = 0;
- }
- p = 0;
- if (gtlt === ">") {
- gtlt = ">=";
- if (xm) {
- M = +M + 1;
- m = 0;
- p = 0;
- } else {
- m = +m + 1;
- p = 0;
- }
- } else if (gtlt === "<=") {
- gtlt = "<";
- if (xm) {
- M = +M + 1;
- } else {
- m = +m + 1;
- }
- }
- if (gtlt === "<") {
- pr = "-0";
- }
- ret = `${gtlt + M}.${m}.${p}${pr}`;
- } else if (xm) {
- ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`;
- } else if (xp) {
- ret = `>=${M}.${m}.0${pr} <${M}.${+m + 1}.0-0`;
- }
- debug("xRange return", ret);
- return ret;
- });
- };
- var replaceStars = (comp, options2) => {
- debug("replaceStars", comp, options2);
- return comp.trim().replace(re[t.STAR], "");
- };
- var replaceGTE0 = (comp, options2) => {
- debug("replaceGTE0", comp, options2);
- return comp.trim().replace(re[options2.includePrerelease ? t.GTE0PRE : t.GTE0], "");
- };
- var hyphenReplace = (incPr) => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr) => {
- if (isX(fM)) {
- from = "";
- } else if (isX(fm)) {
- from = `>=${fM}.0.0${incPr ? "-0" : ""}`;
- } else if (isX(fp)) {
- from = `>=${fM}.${fm}.0${incPr ? "-0" : ""}`;
- } else if (fpr) {
- from = `>=${from}`;
- } else {
- from = `>=${from}${incPr ? "-0" : ""}`;
- }
- if (isX(tM)) {
- to = "";
- } else if (isX(tm)) {
- to = `<${+tM + 1}.0.0-0`;
- } else if (isX(tp)) {
- to = `<${tM}.${+tm + 1}.0-0`;
- } else if (tpr) {
- to = `<=${tM}.${tm}.${tp}-${tpr}`;
- } else if (incPr) {
- to = `<${tM}.${tm}.${+tp + 1}-0`;
- } else {
- to = `<=${to}`;
- }
- return `${from} ${to}`.trim();
- };
- var testSet = (set, version, options2) => {
- for (let i = 0;i < set.length; i++) {
- if (!set[i].test(version)) {
- return false;
- }
- }
- if (version.prerelease.length && !options2.includePrerelease) {
- for (let i = 0;i < set.length; i++) {
- debug(set[i].semver);
- if (set[i].semver === Comparator.ANY) {
- continue;
- }
- if (set[i].semver.prerelease.length > 0) {
- const allowed = set[i].semver;
- if (allowed.major === version.major && allowed.minor === version.minor && allowed.patch === version.patch) {
- return true;
- }
- }
- }
- return false;
- }
- return true;
- };
-});
-
-// ../eve/node_modules/semver/classes/comparator.js
-var require_comparator = __commonJS((exports, module) => {
- var ANY = Symbol("SemVer ANY");
-
- class Comparator {
- static get ANY() {
- return ANY;
- }
- constructor(comp, options2) {
- options2 = parseOptions(options2);
- if (comp instanceof Comparator) {
- if (comp.loose === !!options2.loose) {
- return comp;
- } else {
- comp = comp.value;
- }
- }
- comp = comp.trim().split(/\s+/).join(" ");
- debug("comparator", comp, options2);
- this.options = options2;
- this.loose = !!options2.loose;
- this.parse(comp);
- if (this.semver === ANY) {
- this.value = "";
- } else {
- this.value = this.operator + this.semver.version;
- }
- debug("comp", this);
- }
- parse(comp) {
- const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR];
- const m = comp.match(r);
- if (!m) {
- throw new TypeError(`Invalid comparator: ${comp}`);
- }
- this.operator = m[1] !== undefined ? m[1] : "";
- if (this.operator === "=") {
- this.operator = "";
- }
- if (!m[2]) {
- this.semver = ANY;
- } else {
- this.semver = new SemVer(m[2], this.options.loose);
- }
- }
- toString() {
- return this.value;
- }
- test(version) {
- debug("Comparator.test", version, this.options.loose);
- if (this.semver === ANY || version === ANY) {
- return true;
- }
- if (typeof version === "string") {
- try {
- version = new SemVer(version, this.options);
- } catch (er) {
- return false;
- }
- }
- return cmp(version, this.operator, this.semver, this.options);
- }
- intersects(comp, options2) {
- if (!(comp instanceof Comparator)) {
- throw new TypeError("a Comparator is required");
- }
- if (this.operator === "") {
- if (this.value === "") {
- return true;
- }
- return new Range(comp.value, options2).test(this.value);
- } else if (comp.operator === "") {
- if (comp.value === "") {
- return true;
- }
- return new Range(this.value, options2).test(comp.semver);
- }
- options2 = parseOptions(options2);
- if (options2.includePrerelease && (this.value === "<0.0.0-0" || comp.value === "<0.0.0-0")) {
- return false;
- }
- if (!options2.includePrerelease && (this.value.startsWith("<0.0.0") || comp.value.startsWith("<0.0.0"))) {
- return false;
- }
- if (this.operator.startsWith(">") && comp.operator.startsWith(">")) {
- return true;
- }
- if (this.operator.startsWith("<") && comp.operator.startsWith("<")) {
- return true;
- }
- if (this.semver.version === comp.semver.version && this.operator.includes("=") && comp.operator.includes("=")) {
- return true;
- }
- if (cmp(this.semver, "<", comp.semver, options2) && this.operator.startsWith(">") && comp.operator.startsWith("<")) {
- return true;
- }
- if (cmp(this.semver, ">", comp.semver, options2) && this.operator.startsWith("<") && comp.operator.startsWith(">")) {
- return true;
- }
- return false;
- }
- }
- module.exports = Comparator;
- var parseOptions = require_parse_options();
- var { safeRe: re, t } = require_re();
- var cmp = require_cmp();
- var debug = require_debug();
- var SemVer = require_semver();
- var Range = require_range();
-});
-
-// ../eve/node_modules/semver/functions/satisfies.js
-var require_satisfies = __commonJS((exports, module) => {
- var Range = require_range();
- var satisfies = (version, range, options2) => {
- try {
- range = new Range(range, options2);
- } catch (er) {
- return false;
- }
- return range.test(version);
- };
- module.exports = satisfies;
-});
-
-// ../eve/node_modules/semver/ranges/to-comparators.js
-var require_to_comparators = __commonJS((exports, module) => {
- var Range = require_range();
- var toComparators = (range, options2) => new Range(range, options2).set.map((comp) => comp.map((c) => c.value).join(" ").trim().split(" "));
- module.exports = toComparators;
-});
-
-// ../eve/node_modules/semver/ranges/max-satisfying.js
-var require_max_satisfying = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Range = require_range();
- var maxSatisfying = (versions, range, options2) => {
- let max = null;
- let maxSV = null;
- let rangeObj = null;
- try {
- rangeObj = new Range(range, options2);
- } catch (er) {
- return null;
- }
- versions.forEach((v) => {
- if (rangeObj.test(v)) {
- if (!max || maxSV.compare(v) === -1) {
- max = v;
- maxSV = new SemVer(max, options2);
- }
- }
- });
- return max;
- };
- module.exports = maxSatisfying;
-});
-
-// ../eve/node_modules/semver/ranges/min-satisfying.js
-var require_min_satisfying = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Range = require_range();
- var minSatisfying = (versions, range, options2) => {
- let min = null;
- let minSV = null;
- let rangeObj = null;
- try {
- rangeObj = new Range(range, options2);
- } catch (er) {
- return null;
- }
- versions.forEach((v) => {
- if (rangeObj.test(v)) {
- if (!min || minSV.compare(v) === 1) {
- min = v;
- minSV = new SemVer(min, options2);
- }
- }
- });
- return min;
- };
- module.exports = minSatisfying;
-});
-
-// ../eve/node_modules/semver/ranges/min-version.js
-var require_min_version = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Range = require_range();
- var gt = require_gt();
- var minVersion = (range, loose) => {
- range = new Range(range, loose);
- let minver = new SemVer("0.0.0");
- if (range.test(minver)) {
- return minver;
- }
- minver = new SemVer("0.0.0-0");
- if (range.test(minver)) {
- return minver;
- }
- minver = null;
- for (let i = 0;i < range.set.length; ++i) {
- const comparators = range.set[i];
- let setMin = null;
- comparators.forEach((comparator) => {
- const compver = new SemVer(comparator.semver.version);
- switch (comparator.operator) {
- case ">":
- if (compver.prerelease.length === 0) {
- compver.patch++;
- } else {
- compver.prerelease.push(0);
- }
- compver.raw = compver.format();
- case "":
- case ">=":
- if (!setMin || gt(compver, setMin)) {
- setMin = compver;
- }
- break;
- case "<":
- case "<=":
- break;
- default:
- throw new Error(`Unexpected operation: ${comparator.operator}`);
- }
- });
- if (setMin && (!minver || gt(minver, setMin))) {
- minver = setMin;
- }
- }
- if (minver && range.test(minver)) {
- return minver;
- }
- return null;
- };
- module.exports = minVersion;
-});
-
-// ../eve/node_modules/semver/ranges/valid.js
-var require_valid2 = __commonJS((exports, module) => {
- var Range = require_range();
- var validRange = (range, options2) => {
- try {
- return new Range(range, options2).range || "*";
- } catch (er) {
- return null;
- }
- };
- module.exports = validRange;
-});
-
-// ../eve/node_modules/semver/ranges/outside.js
-var require_outside = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Comparator = require_comparator();
- var { ANY } = Comparator;
- var Range = require_range();
- var satisfies = require_satisfies();
- var gt = require_gt();
- var lt = require_lt();
- var lte = require_lte();
- var gte = require_gte();
- var outside = (version, range, hilo, options2) => {
- version = new SemVer(version, options2);
- range = new Range(range, options2);
- let gtfn, ltefn, ltfn, comp, ecomp;
- switch (hilo) {
- case ">":
- gtfn = gt;
- ltefn = lte;
- ltfn = lt;
- comp = ">";
- ecomp = ">=";
- break;
- case "<":
- gtfn = lt;
- ltefn = gte;
- ltfn = gt;
- comp = "<";
- ecomp = "<=";
- break;
- default:
- throw new TypeError('Must provide a hilo val of "<" or ">"');
- }
- if (satisfies(version, range, options2)) {
- return false;
- }
- for (let i = 0;i < range.set.length; ++i) {
- const comparators = range.set[i];
- let high = null;
- let low = null;
- comparators.forEach((comparator) => {
- if (comparator.semver === ANY) {
- comparator = new Comparator(">=0.0.0");
- }
- high = high || comparator;
- low = low || comparator;
- if (gtfn(comparator.semver, high.semver, options2)) {
- high = comparator;
- } else if (ltfn(comparator.semver, low.semver, options2)) {
- low = comparator;
- }
- });
- if (high.operator === comp || high.operator === ecomp) {
- return false;
- }
- if ((!low.operator || low.operator === comp) && ltefn(version, low.semver)) {
- return false;
- } else if (low.operator === ecomp && ltfn(version, low.semver)) {
- return false;
- }
- }
- return true;
- };
- module.exports = outside;
-});
-
-// ../eve/node_modules/semver/ranges/gtr.js
-var require_gtr = __commonJS((exports, module) => {
- var outside = require_outside();
- var gtr = (version, range, options2) => outside(version, range, ">", options2);
- module.exports = gtr;
-});
-
-// ../eve/node_modules/semver/ranges/ltr.js
-var require_ltr = __commonJS((exports, module) => {
- var outside = require_outside();
- var ltr = (version, range, options2) => outside(version, range, "<", options2);
- module.exports = ltr;
-});
-
-// ../eve/node_modules/semver/ranges/intersects.js
-var require_intersects = __commonJS((exports, module) => {
- var Range = require_range();
- var intersects = (r1, r2, options2) => {
- r1 = new Range(r1, options2);
- r2 = new Range(r2, options2);
- return r1.intersects(r2, options2);
- };
- module.exports = intersects;
-});
-
-// ../eve/node_modules/semver/ranges/simplify.js
-var require_simplify = __commonJS((exports, module) => {
- var satisfies = require_satisfies();
- var compare = require_compare();
- module.exports = (versions, range, options2) => {
- const set = [];
- let first = null;
- let prev = null;
- const v = versions.sort((a, b) => compare(a, b, options2));
- for (const version of v) {
- const included = satisfies(version, range, options2);
- if (included) {
- prev = version;
- if (!first) {
- first = version;
- }
- } else {
- if (prev) {
- set.push([first, prev]);
- }
- prev = null;
- first = null;
- }
- }
- if (first) {
- set.push([first, null]);
- }
- const ranges = [];
- for (const [min, max] of set) {
- if (min === max) {
- ranges.push(min);
- } else if (!max && min === v[0]) {
- ranges.push("*");
- } else if (!max) {
- ranges.push(`>=${min}`);
- } else if (min === v[0]) {
- ranges.push(`<=${max}`);
- } else {
- ranges.push(`${min} - ${max}`);
- }
- }
- const simplified = ranges.join(" || ");
- const original = typeof range.raw === "string" ? range.raw : String(range);
- return simplified.length < original.length ? simplified : range;
- };
-});
-
-// ../eve/node_modules/semver/ranges/subset.js
-var require_subset = __commonJS((exports, module) => {
- var Range = require_range();
- var Comparator = require_comparator();
- var { ANY } = Comparator;
- var satisfies = require_satisfies();
- var compare = require_compare();
- var subset = (sub, dom, options2 = {}) => {
- if (sub === dom) {
- return true;
- }
- sub = new Range(sub, options2);
- dom = new Range(dom, options2);
- let sawNonNull = false;
- OUTER:
- for (const simpleSub of sub.set) {
- for (const simpleDom of dom.set) {
- const isSub = simpleSubset(simpleSub, simpleDom, options2);
- sawNonNull = sawNonNull || isSub !== null;
- if (isSub) {
- continue OUTER;
- }
- }
- if (sawNonNull) {
- return false;
- }
- }
- return true;
- };
- var minimumVersionWithPreRelease = [new Comparator(">=0.0.0-0")];
- var minimumVersion = [new Comparator(">=0.0.0")];
- var simpleSubset = (sub, dom, options2) => {
- if (sub === dom) {
- return true;
- }
- if (sub.length === 1 && sub[0].semver === ANY) {
- if (dom.length === 1 && dom[0].semver === ANY) {
- return true;
- } else if (options2.includePrerelease) {
- sub = minimumVersionWithPreRelease;
- } else {
- sub = minimumVersion;
- }
- }
- if (dom.length === 1 && dom[0].semver === ANY) {
- if (options2.includePrerelease) {
- return true;
- } else {
- dom = minimumVersion;
- }
- }
- const eqSet = new Set;
- let gt, lt;
- for (const c of sub) {
- if (c.operator === ">" || c.operator === ">=") {
- gt = higherGT(gt, c, options2);
- } else if (c.operator === "<" || c.operator === "<=") {
- lt = lowerLT(lt, c, options2);
- } else {
- eqSet.add(c.semver);
- }
- }
- if (eqSet.size > 1) {
- return null;
- }
- let gtltComp;
- if (gt && lt) {
- gtltComp = compare(gt.semver, lt.semver, options2);
- if (gtltComp > 0) {
- return null;
- } else if (gtltComp === 0 && (gt.operator !== ">=" || lt.operator !== "<=")) {
- return null;
- }
- }
- for (const eq of eqSet) {
- if (gt && !satisfies(eq, String(gt), options2)) {
- return null;
- }
- if (lt && !satisfies(eq, String(lt), options2)) {
- return null;
- }
- for (const c of dom) {
- if (!satisfies(eq, String(c), options2)) {
- return false;
- }
- }
- return true;
- }
- let higher, lower;
- let hasDomLT, hasDomGT;
- let needDomLTPre = lt && !options2.includePrerelease && lt.semver.prerelease.length ? lt.semver : false;
- let needDomGTPre = gt && !options2.includePrerelease && gt.semver.prerelease.length ? gt.semver : false;
- if (needDomLTPre && needDomLTPre.prerelease.length === 1 && lt.operator === "<" && needDomLTPre.prerelease[0] === 0) {
- needDomLTPre = false;
- }
- for (const c of dom) {
- hasDomGT = hasDomGT || c.operator === ">" || c.operator === ">=";
- hasDomLT = hasDomLT || c.operator === "<" || c.operator === "<=";
- if (gt) {
- if (needDomGTPre) {
- if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomGTPre.major && c.semver.minor === needDomGTPre.minor && c.semver.patch === needDomGTPre.patch) {
- needDomGTPre = false;
- }
- }
- if (c.operator === ">" || c.operator === ">=") {
- higher = higherGT(gt, c, options2);
- if (higher === c && higher !== gt) {
- return false;
- }
- } else if (gt.operator === ">=" && !satisfies(gt.semver, String(c), options2)) {
- return false;
- }
- }
- if (lt) {
- if (needDomLTPre) {
- if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomLTPre.major && c.semver.minor === needDomLTPre.minor && c.semver.patch === needDomLTPre.patch) {
- needDomLTPre = false;
- }
- }
- if (c.operator === "<" || c.operator === "<=") {
- lower = lowerLT(lt, c, options2);
- if (lower === c && lower !== lt) {
- return false;
- }
- } else if (lt.operator === "<=" && !satisfies(lt.semver, String(c), options2)) {
- return false;
- }
- }
- if (!c.operator && (lt || gt) && gtltComp !== 0) {
- return false;
- }
- }
- if (gt && hasDomLT && !lt && gtltComp !== 0) {
- return false;
- }
- if (lt && hasDomGT && !gt && gtltComp !== 0) {
- return false;
- }
- if (needDomGTPre || needDomLTPre) {
- return false;
- }
- return true;
- };
- var higherGT = (a, b, options2) => {
- if (!a) {
- return b;
- }
- const comp = compare(a.semver, b.semver, options2);
- return comp > 0 ? a : comp < 0 ? b : b.operator === ">" && a.operator === ">=" ? b : a;
- };
- var lowerLT = (a, b, options2) => {
- if (!a) {
- return b;
- }
- const comp = compare(a.semver, b.semver, options2);
- return comp < 0 ? a : comp > 0 ? b : b.operator === "<" && a.operator === "<=" ? b : a;
- };
- module.exports = subset;
-});
-
-// ../eve/node_modules/semver/index.js
-var require_semver2 = __commonJS((exports, module) => {
- var internalRe = require_re();
- var constants = require_constants();
- var SemVer = require_semver();
- var identifiers = require_identifiers();
- var parse = require_parse();
- var valid = require_valid();
- var clean = require_clean();
- var inc = require_inc();
- var diff = require_diff();
- var major = require_major();
- var minor = require_minor();
- var patch = require_patch();
- var prerelease = require_prerelease();
- var compare = require_compare();
- var rcompare = require_rcompare();
- var compareLoose = require_compare_loose();
- var compareBuild = require_compare_build();
- var sort = require_sort();
- var rsort = require_rsort();
- var gt = require_gt();
- var lt = require_lt();
- var eq = require_eq();
- var neq = require_neq();
- var gte = require_gte();
- var lte = require_lte();
- var cmp = require_cmp();
- var coerce = require_coerce();
- var Comparator = require_comparator();
- var Range = require_range();
- var satisfies = require_satisfies();
- var toComparators = require_to_comparators();
- var maxSatisfying = require_max_satisfying();
- var minSatisfying = require_min_satisfying();
- var minVersion = require_min_version();
- var validRange = require_valid2();
- var outside = require_outside();
- var gtr = require_gtr();
- var ltr = require_ltr();
- var intersects = require_intersects();
- var simplifyRange = require_simplify();
- var subset = require_subset();
- module.exports = {
- parse,
- valid,
- clean,
- inc,
- diff,
- major,
- minor,
- patch,
- prerelease,
- compare,
- rcompare,
- compareLoose,
- compareBuild,
- sort,
- rsort,
- gt,
- lt,
- eq,
- neq,
- gte,
- lte,
- cmp,
- coerce,
- Comparator,
- Range,
- satisfies,
- toComparators,
- maxSatisfying,
- minSatisfying,
- minVersion,
- validRange,
- outside,
- gtr,
- ltr,
- intersects,
- simplifyRange,
- subset,
- SemVer,
- re: internalRe.re,
- src: internalRe.src,
- tokens: internalRe.t,
- SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,
- RELEASE_TYPES: constants.RELEASE_TYPES,
- compareIdentifiers: identifiers.compareIdentifiers,
- rcompareIdentifiers: identifiers.rcompareIdentifiers
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/asymmetricKeyDetailsSupported.js
-var require_asymmetricKeyDetailsSupported = __commonJS((exports, module) => {
- var semver = require_semver2();
- module.exports = semver.satisfies(process.version, ">=15.7.0");
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/rsaPssKeyDetailsSupported.js
-var require_rsaPssKeyDetailsSupported = __commonJS((exports, module) => {
- var semver = require_semver2();
- module.exports = semver.satisfies(process.version, ">=16.9.0");
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/validateAsymmetricKey.js
-var require_validateAsymmetricKey = __commonJS((exports, module) => {
- var ASYMMETRIC_KEY_DETAILS_SUPPORTED = require_asymmetricKeyDetailsSupported();
- var RSA_PSS_KEY_DETAILS_SUPPORTED = require_rsaPssKeyDetailsSupported();
- var allowedAlgorithmsForKeys = {
- ec: ["ES256", "ES384", "ES512"],
- rsa: ["RS256", "PS256", "RS384", "PS384", "RS512", "PS512"],
- "rsa-pss": ["PS256", "PS384", "PS512"]
- };
- var allowedCurves = {
- ES256: "prime256v1",
- ES384: "secp384r1",
- ES512: "secp521r1"
- };
- module.exports = function(algorithm, key) {
- if (!algorithm || !key)
- return;
- const keyType = key.asymmetricKeyType;
- if (!keyType)
- return;
- const allowedAlgorithms = allowedAlgorithmsForKeys[keyType];
- if (!allowedAlgorithms) {
- throw new Error(`Unknown key type "${keyType}".`);
- }
- if (!allowedAlgorithms.includes(algorithm)) {
- throw new Error(`"alg" parameter for "${keyType}" key type must be one of: ${allowedAlgorithms.join(", ")}.`);
- }
- if (ASYMMETRIC_KEY_DETAILS_SUPPORTED) {
- switch (keyType) {
- case "ec":
- const keyCurve = key.asymmetricKeyDetails.namedCurve;
- const allowedCurve = allowedCurves[algorithm];
- if (keyCurve !== allowedCurve) {
- throw new Error(`"alg" parameter "${algorithm}" requires curve "${allowedCurve}".`);
- }
- break;
- case "rsa-pss":
- if (RSA_PSS_KEY_DETAILS_SUPPORTED) {
- const length = parseInt(algorithm.slice(-3), 10);
- const { hashAlgorithm, mgf1HashAlgorithm, saltLength } = key.asymmetricKeyDetails;
- if (hashAlgorithm !== `sha${length}` || mgf1HashAlgorithm !== hashAlgorithm) {
- throw new Error(`Invalid key for this operation, its RSA-PSS parameters do not meet the requirements of "alg" ${algorithm}.`);
- }
- if (saltLength !== undefined && saltLength > length >> 3) {
- throw new Error(`Invalid key for this operation, its RSA-PSS parameter saltLength does not meet the requirements of "alg" ${algorithm}.`);
- }
- }
- break;
- }
- }
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/psSupported.js
-var require_psSupported = __commonJS((exports, module) => {
- var semver = require_semver2();
- module.exports = semver.satisfies(process.version, "^6.12.0 || >=8.0.0");
-});
-
-// ../eve/node_modules/jsonwebtoken/verify.js
-var require_verify = __commonJS((exports, module) => {
- var JsonWebTokenError = require_JsonWebTokenError();
- var NotBeforeError = require_NotBeforeError();
- var TokenExpiredError = require_TokenExpiredError();
- var decode = require_decode();
- var timespan = require_timespan();
- var validateAsymmetricKey = require_validateAsymmetricKey();
- var PS_SUPPORTED = require_psSupported();
- var jws = require_jws();
- var { KeyObject, createSecretKey, createPublicKey } = __require("crypto");
- var PUB_KEY_ALGS = ["RS256", "RS384", "RS512"];
- var EC_KEY_ALGS = ["ES256", "ES384", "ES512"];
- var RSA_KEY_ALGS = ["RS256", "RS384", "RS512"];
- var HS_ALGS = ["HS256", "HS384", "HS512"];
- if (PS_SUPPORTED) {
- PUB_KEY_ALGS.splice(PUB_KEY_ALGS.length, 0, "PS256", "PS384", "PS512");
- RSA_KEY_ALGS.splice(RSA_KEY_ALGS.length, 0, "PS256", "PS384", "PS512");
- }
- module.exports = function(jwtString, secretOrPublicKey, options2, callback) {
- if (typeof options2 === "function" && !callback) {
- callback = options2;
- options2 = {};
- }
- if (!options2) {
- options2 = {};
- }
- options2 = Object.assign({}, options2);
- let done;
- if (callback) {
- done = callback;
- } else {
- done = function(err, data) {
- if (err)
- throw err;
- return data;
- };
- }
- if (options2.clockTimestamp && typeof options2.clockTimestamp !== "number") {
- return done(new JsonWebTokenError("clockTimestamp must be a number"));
- }
- if (options2.nonce !== undefined && (typeof options2.nonce !== "string" || options2.nonce.trim() === "")) {
- return done(new JsonWebTokenError("nonce must be a non-empty string"));
- }
- if (options2.allowInvalidAsymmetricKeyTypes !== undefined && typeof options2.allowInvalidAsymmetricKeyTypes !== "boolean") {
- return done(new JsonWebTokenError("allowInvalidAsymmetricKeyTypes must be a boolean"));
- }
- const clockTimestamp = options2.clockTimestamp || Math.floor(Date.now() / 1000);
- if (!jwtString) {
- return done(new JsonWebTokenError("jwt must be provided"));
- }
- if (typeof jwtString !== "string") {
- return done(new JsonWebTokenError("jwt must be a string"));
- }
- const parts = jwtString.split(".");
- if (parts.length !== 3) {
- return done(new JsonWebTokenError("jwt malformed"));
- }
- let decodedToken;
- try {
- decodedToken = decode(jwtString, { complete: true });
- } catch (err) {
- return done(err);
- }
- if (!decodedToken) {
- return done(new JsonWebTokenError("invalid token"));
- }
- const header = decodedToken.header;
- let getSecret;
- if (typeof secretOrPublicKey === "function") {
- if (!callback) {
- return done(new JsonWebTokenError("verify must be called asynchronous if secret or public key is provided as a callback"));
- }
- getSecret = secretOrPublicKey;
- } else {
- getSecret = function(header2, secretCallback) {
- return secretCallback(null, secretOrPublicKey);
- };
- }
- return getSecret(header, function(err, secretOrPublicKey2) {
- if (err) {
- return done(new JsonWebTokenError("error in secret or public key callback: " + err.message));
- }
- const hasSignature = parts[2].trim() !== "";
- if (!hasSignature && secretOrPublicKey2) {
- return done(new JsonWebTokenError("jwt signature is required"));
- }
- if (hasSignature && !secretOrPublicKey2) {
- return done(new JsonWebTokenError("secret or public key must be provided"));
- }
- if (!hasSignature && !options2.algorithms) {
- return done(new JsonWebTokenError('please specify "none" in "algorithms" to verify unsigned tokens'));
- }
- if (secretOrPublicKey2 != null && !(secretOrPublicKey2 instanceof KeyObject)) {
- try {
- secretOrPublicKey2 = createPublicKey(secretOrPublicKey2);
- } catch (_) {
- try {
- secretOrPublicKey2 = createSecretKey(typeof secretOrPublicKey2 === "string" ? Buffer.from(secretOrPublicKey2) : secretOrPublicKey2);
- } catch (_2) {
- return done(new JsonWebTokenError("secretOrPublicKey is not valid key material"));
- }
- }
- }
- if (!options2.algorithms) {
- if (secretOrPublicKey2.type === "secret") {
- options2.algorithms = HS_ALGS;
- } else if (["rsa", "rsa-pss"].includes(secretOrPublicKey2.asymmetricKeyType)) {
- options2.algorithms = RSA_KEY_ALGS;
- } else if (secretOrPublicKey2.asymmetricKeyType === "ec") {
- options2.algorithms = EC_KEY_ALGS;
- } else {
- options2.algorithms = PUB_KEY_ALGS;
- }
- }
- if (options2.algorithms.indexOf(decodedToken.header.alg) === -1) {
- return done(new JsonWebTokenError("invalid algorithm"));
- }
- if (header.alg.startsWith("HS") && secretOrPublicKey2.type !== "secret") {
- return done(new JsonWebTokenError(`secretOrPublicKey must be a symmetric key when using ${header.alg}`));
- } else if (/^(?:RS|PS|ES)/.test(header.alg) && secretOrPublicKey2.type !== "public") {
- return done(new JsonWebTokenError(`secretOrPublicKey must be an asymmetric key when using ${header.alg}`));
- }
- if (!options2.allowInvalidAsymmetricKeyTypes) {
- try {
- validateAsymmetricKey(header.alg, secretOrPublicKey2);
- } catch (e) {
- return done(e);
- }
- }
- let valid;
- try {
- valid = jws.verify(jwtString, decodedToken.header.alg, secretOrPublicKey2);
- } catch (e) {
- return done(e);
- }
- if (!valid) {
- return done(new JsonWebTokenError("invalid signature"));
- }
- const payload = decodedToken.payload;
- if (typeof payload.nbf !== "undefined" && !options2.ignoreNotBefore) {
- if (typeof payload.nbf !== "number") {
- return done(new JsonWebTokenError("invalid nbf value"));
- }
- if (payload.nbf > clockTimestamp + (options2.clockTolerance || 0)) {
- return done(new NotBeforeError("jwt not active", new Date(payload.nbf * 1000)));
- }
- }
- if (typeof payload.exp !== "undefined" && !options2.ignoreExpiration) {
- if (typeof payload.exp !== "number") {
- return done(new JsonWebTokenError("invalid exp value"));
- }
- if (clockTimestamp >= payload.exp + (options2.clockTolerance || 0)) {
- return done(new TokenExpiredError("jwt expired", new Date(payload.exp * 1000)));
- }
- }
- if (options2.audience) {
- const audiences = Array.isArray(options2.audience) ? options2.audience : [options2.audience];
- const target = Array.isArray(payload.aud) ? payload.aud : [payload.aud];
- const match = target.some(function(targetAudience) {
- return audiences.some(function(audience) {
- return audience instanceof RegExp ? audience.test(targetAudience) : audience === targetAudience;
- });
- });
- if (!match) {
- return done(new JsonWebTokenError("jwt audience invalid. expected: " + audiences.join(" or ")));
- }
- }
- if (options2.issuer) {
- const invalid_issuer = typeof options2.issuer === "string" && payload.iss !== options2.issuer || Array.isArray(options2.issuer) && options2.issuer.indexOf(payload.iss) === -1;
- if (invalid_issuer) {
- return done(new JsonWebTokenError("jwt issuer invalid. expected: " + options2.issuer));
- }
- }
- if (options2.subject) {
- if (payload.sub !== options2.subject) {
- return done(new JsonWebTokenError("jwt subject invalid. expected: " + options2.subject));
- }
- }
- if (options2.jwtid) {
- if (payload.jti !== options2.jwtid) {
- return done(new JsonWebTokenError("jwt jwtid invalid. expected: " + options2.jwtid));
- }
- }
- if (options2.nonce) {
- if (payload.nonce !== options2.nonce) {
- return done(new JsonWebTokenError("jwt nonce invalid. expected: " + options2.nonce));
- }
- }
- if (options2.maxAge) {
- if (typeof payload.iat !== "number") {
- return done(new JsonWebTokenError("iat required when maxAge is specified"));
- }
- const maxAgeTimestamp = timespan(options2.maxAge, payload.iat);
- if (typeof maxAgeTimestamp === "undefined") {
- return done(new JsonWebTokenError('"maxAge" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
- }
- if (clockTimestamp >= maxAgeTimestamp + (options2.clockTolerance || 0)) {
- return done(new TokenExpiredError("maxAge exceeded", new Date(maxAgeTimestamp * 1000)));
- }
- }
- if (options2.complete === true) {
- const signature = decodedToken.signature;
- return done(null, {
- header,
- payload,
- signature
- });
- }
- return done(null, payload);
- });
- };
-});
-
-// ../eve/node_modules/lodash.includes/index.js
-var require_lodash = __commonJS((exports, module) => {
- var INFINITY = 1 / 0;
- var MAX_SAFE_INTEGER = 9007199254740991;
- var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
- var NAN = 0 / 0;
- var argsTag = "[object Arguments]";
- var funcTag = "[object Function]";
- var genTag = "[object GeneratorFunction]";
- var stringTag = "[object String]";
- var symbolTag = "[object Symbol]";
- var reTrim = /^\s+|\s+$/g;
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
- var reIsBinary = /^0b[01]+$/i;
- var reIsOctal = /^0o[0-7]+$/i;
- var reIsUint = /^(?:0|[1-9]\d*)$/;
- var freeParseInt = parseInt;
- function arrayMap(array, iteratee) {
- var index = -1, length = array ? array.length : 0, result = Array(length);
- while (++index < length) {
- result[index] = iteratee(array[index], index, array);
- }
- return result;
- }
- function baseFindIndex(array, predicate, fromIndex, fromRight) {
- var length = array.length, index = fromIndex + (fromRight ? 1 : -1);
- while (fromRight ? index-- : ++index < length) {
- if (predicate(array[index], index, array)) {
- return index;
- }
- }
- return -1;
- }
- function baseIndexOf(array, value, fromIndex) {
- if (value !== value) {
- return baseFindIndex(array, baseIsNaN, fromIndex);
- }
- var index = fromIndex - 1, length = array.length;
- while (++index < length) {
- if (array[index] === value) {
- return index;
- }
- }
- return -1;
- }
- function baseIsNaN(value) {
- return value !== value;
- }
- function baseTimes(n, iteratee) {
- var index = -1, result = Array(n);
- while (++index < n) {
- result[index] = iteratee(index);
- }
- return result;
- }
- function baseValues(object, props) {
- return arrayMap(props, function(key) {
- return object[key];
- });
- }
- function overArg(func, transform) {
- return function(arg) {
- return func(transform(arg));
- };
- }
- var objectProto = Object.prototype;
- var hasOwnProperty = objectProto.hasOwnProperty;
- var objectToString = objectProto.toString;
- var propertyIsEnumerable = objectProto.propertyIsEnumerable;
- var nativeKeys = overArg(Object.keys, Object);
- var nativeMax = Math.max;
- function arrayLikeKeys(value, inherited) {
- var result = isArray(value) || isArguments(value) ? baseTimes(value.length, String) : [];
- var length = result.length, skipIndexes = !!length;
- for (var key in value) {
- if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && (key == "length" || isIndex(key, length)))) {
- result.push(key);
- }
- }
- return result;
- }
- function baseKeys(object) {
- if (!isPrototype(object)) {
- return nativeKeys(object);
- }
- var result = [];
- for (var key in Object(object)) {
- if (hasOwnProperty.call(object, key) && key != "constructor") {
- result.push(key);
- }
- }
- return result;
- }
- function isIndex(value, length) {
- length = length == null ? MAX_SAFE_INTEGER : length;
- return !!length && (typeof value == "number" || reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
- }
- function isPrototype(value) {
- var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto;
- return value === proto;
- }
- function includes(collection, value, fromIndex, guard) {
- collection = isArrayLike(collection) ? collection : values(collection);
- fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0;
- var length = collection.length;
- if (fromIndex < 0) {
- fromIndex = nativeMax(length + fromIndex, 0);
- }
- return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;
- }
- function isArguments(value) {
- return isArrayLikeObject(value) && hasOwnProperty.call(value, "callee") && (!propertyIsEnumerable.call(value, "callee") || objectToString.call(value) == argsTag);
- }
- var isArray = Array.isArray;
- function isArrayLike(value) {
- return value != null && isLength(value.length) && !isFunction(value);
- }
- function isArrayLikeObject(value) {
- return isObjectLike(value) && isArrayLike(value);
- }
- function isFunction(value) {
- var tag = isObject(value) ? objectToString.call(value) : "";
- return tag == funcTag || tag == genTag;
- }
- function isLength(value) {
- return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
- }
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == "object" || type == "function");
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isString(value) {
- return typeof value == "string" || !isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag;
- }
- function isSymbol(value) {
- return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
- }
- function toFinite(value) {
- if (!value) {
- return value === 0 ? value : 0;
- }
- value = toNumber(value);
- if (value === INFINITY || value === -INFINITY) {
- var sign = value < 0 ? -1 : 1;
- return sign * MAX_INTEGER;
- }
- return value === value ? value : 0;
- }
- function toInteger(value) {
- var result = toFinite(value), remainder = result % 1;
- return result === result ? remainder ? result - remainder : result : 0;
- }
- function toNumber(value) {
- if (typeof value == "number") {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == "function" ? value.valueOf() : value;
- value = isObject(other) ? other + "" : other;
- }
- if (typeof value != "string") {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, "");
- var isBinary = reIsBinary.test(value);
- return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
- }
- function keys(object) {
- return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
- }
- function values(object) {
- return object ? baseValues(object, keys(object)) : [];
- }
- module.exports = includes;
-});
-
-// ../eve/node_modules/lodash.isboolean/index.js
-var require_lodash2 = __commonJS((exports, module) => {
- var boolTag = "[object Boolean]";
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function isBoolean(value) {
- return value === true || value === false || isObjectLike(value) && objectToString.call(value) == boolTag;
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- module.exports = isBoolean;
-});
-
-// ../eve/node_modules/lodash.isinteger/index.js
-var require_lodash3 = __commonJS((exports, module) => {
- var INFINITY = 1 / 0;
- var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
- var NAN = 0 / 0;
- var symbolTag = "[object Symbol]";
- var reTrim = /^\s+|\s+$/g;
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
- var reIsBinary = /^0b[01]+$/i;
- var reIsOctal = /^0o[0-7]+$/i;
- var freeParseInt = parseInt;
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function isInteger(value) {
- return typeof value == "number" && value == toInteger(value);
- }
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == "object" || type == "function");
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isSymbol(value) {
- return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
- }
- function toFinite(value) {
- if (!value) {
- return value === 0 ? value : 0;
- }
- value = toNumber(value);
- if (value === INFINITY || value === -INFINITY) {
- var sign = value < 0 ? -1 : 1;
- return sign * MAX_INTEGER;
- }
- return value === value ? value : 0;
- }
- function toInteger(value) {
- var result = toFinite(value), remainder = result % 1;
- return result === result ? remainder ? result - remainder : result : 0;
- }
- function toNumber(value) {
- if (typeof value == "number") {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == "function" ? value.valueOf() : value;
- value = isObject(other) ? other + "" : other;
- }
- if (typeof value != "string") {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, "");
- var isBinary = reIsBinary.test(value);
- return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
- }
- module.exports = isInteger;
-});
-
-// ../eve/node_modules/lodash.isnumber/index.js
-var require_lodash4 = __commonJS((exports, module) => {
- var numberTag = "[object Number]";
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isNumber(value) {
- return typeof value == "number" || isObjectLike(value) && objectToString.call(value) == numberTag;
- }
- module.exports = isNumber;
-});
-
-// ../eve/node_modules/lodash.isplainobject/index.js
-var require_lodash5 = __commonJS((exports, module) => {
- var objectTag = "[object Object]";
- function isHostObject(value) {
- var result = false;
- if (value != null && typeof value.toString != "function") {
- try {
- result = !!(value + "");
- } catch (e) {}
- }
- return result;
- }
- function overArg(func, transform) {
- return function(arg) {
- return func(transform(arg));
- };
- }
- var funcProto = Function.prototype;
- var objectProto = Object.prototype;
- var funcToString = funcProto.toString;
- var hasOwnProperty = objectProto.hasOwnProperty;
- var objectCtorString = funcToString.call(Object);
- var objectToString = objectProto.toString;
- var getPrototype = overArg(Object.getPrototypeOf, Object);
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isPlainObject(value) {
- if (!isObjectLike(value) || objectToString.call(value) != objectTag || isHostObject(value)) {
- return false;
- }
- var proto = getPrototype(value);
- if (proto === null) {
- return true;
- }
- var Ctor = hasOwnProperty.call(proto, "constructor") && proto.constructor;
- return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
- }
- module.exports = isPlainObject;
-});
-
-// ../eve/node_modules/lodash.isstring/index.js
-var require_lodash6 = __commonJS((exports, module) => {
- var stringTag = "[object String]";
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- var isArray = Array.isArray;
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isString(value) {
- return typeof value == "string" || !isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag;
- }
- module.exports = isString;
-});
-
-// ../eve/node_modules/lodash.once/index.js
-var require_lodash7 = __commonJS((exports, module) => {
- var FUNC_ERROR_TEXT = "Expected a function";
- var INFINITY = 1 / 0;
- var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
- var NAN = 0 / 0;
- var symbolTag = "[object Symbol]";
- var reTrim = /^\s+|\s+$/g;
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
- var reIsBinary = /^0b[01]+$/i;
- var reIsOctal = /^0o[0-7]+$/i;
- var freeParseInt = parseInt;
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function before(n, func) {
- var result;
- if (typeof func != "function") {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- n = toInteger(n);
- return function() {
- if (--n > 0) {
- result = func.apply(this, arguments);
- }
- if (n <= 1) {
- func = undefined;
- }
- return result;
- };
- }
- function once(func) {
- return before(2, func);
- }
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == "object" || type == "function");
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isSymbol(value) {
- return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
- }
- function toFinite(value) {
- if (!value) {
- return value === 0 ? value : 0;
- }
- value = toNumber(value);
- if (value === INFINITY || value === -INFINITY) {
- var sign = value < 0 ? -1 : 1;
- return sign * MAX_INTEGER;
- }
- return value === value ? value : 0;
- }
- function toInteger(value) {
- var result = toFinite(value), remainder = result % 1;
- return result === result ? remainder ? result - remainder : result : 0;
- }
- function toNumber(value) {
- if (typeof value == "number") {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == "function" ? value.valueOf() : value;
- value = isObject(other) ? other + "" : other;
- }
- if (typeof value != "string") {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, "");
- var isBinary = reIsBinary.test(value);
- return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
- }
- module.exports = once;
-});
-
-// ../eve/node_modules/jsonwebtoken/sign.js
-var require_sign = __commonJS((exports, module) => {
- var timespan = require_timespan();
- var PS_SUPPORTED = require_psSupported();
- var validateAsymmetricKey = require_validateAsymmetricKey();
- var jws = require_jws();
- var includes = require_lodash();
- var isBoolean = require_lodash2();
- var isInteger = require_lodash3();
- var isNumber = require_lodash4();
- var isPlainObject = require_lodash5();
- var isString = require_lodash6();
- var once = require_lodash7();
- var { KeyObject, createSecretKey, createPrivateKey } = __require("crypto");
- var SUPPORTED_ALGS = ["RS256", "RS384", "RS512", "ES256", "ES384", "ES512", "HS256", "HS384", "HS512", "none"];
- if (PS_SUPPORTED) {
- SUPPORTED_ALGS.splice(3, 0, "PS256", "PS384", "PS512");
- }
- var sign_options_schema = {
- expiresIn: { isValid: function(value) {
- return isInteger(value) || isString(value) && value;
- }, message: '"expiresIn" should be a number of seconds or string representing a timespan' },
- notBefore: { isValid: function(value) {
- return isInteger(value) || isString(value) && value;
- }, message: '"notBefore" should be a number of seconds or string representing a timespan' },
- audience: { isValid: function(value) {
- return isString(value) || Array.isArray(value);
- }, message: '"audience" must be a string or array' },
- algorithm: { isValid: includes.bind(null, SUPPORTED_ALGS), message: '"algorithm" must be a valid string enum value' },
- header: { isValid: isPlainObject, message: '"header" must be an object' },
- encoding: { isValid: isString, message: '"encoding" must be a string' },
- issuer: { isValid: isString, message: '"issuer" must be a string' },
- subject: { isValid: isString, message: '"subject" must be a string' },
- jwtid: { isValid: isString, message: '"jwtid" must be a string' },
- noTimestamp: { isValid: isBoolean, message: '"noTimestamp" must be a boolean' },
- keyid: { isValid: isString, message: '"keyid" must be a string' },
- mutatePayload: { isValid: isBoolean, message: '"mutatePayload" must be a boolean' },
- allowInsecureKeySizes: { isValid: isBoolean, message: '"allowInsecureKeySizes" must be a boolean' },
- allowInvalidAsymmetricKeyTypes: { isValid: isBoolean, message: '"allowInvalidAsymmetricKeyTypes" must be a boolean' }
- };
- var registered_claims_schema = {
- iat: { isValid: isNumber, message: '"iat" should be a number of seconds' },
- exp: { isValid: isNumber, message: '"exp" should be a number of seconds' },
- nbf: { isValid: isNumber, message: '"nbf" should be a number of seconds' }
- };
- function validate(schema, allowUnknown, object, parameterName) {
- if (!isPlainObject(object)) {
- throw new Error('Expected "' + parameterName + '" to be a plain object.');
- }
- Object.keys(object).forEach(function(key) {
- const validator = schema[key];
- if (!validator) {
- if (!allowUnknown) {
- throw new Error('"' + key + '" is not allowed in "' + parameterName + '"');
- }
- return;
- }
- if (!validator.isValid(object[key])) {
- throw new Error(validator.message);
- }
- });
- }
- function validateOptions(options2) {
- return validate(sign_options_schema, false, options2, "options");
- }
- function validatePayload(payload) {
- return validate(registered_claims_schema, true, payload, "payload");
- }
- var options_to_payload = {
- audience: "aud",
- issuer: "iss",
- subject: "sub",
- jwtid: "jti"
- };
- var options_for_objects = [
- "expiresIn",
- "notBefore",
- "noTimestamp",
- "audience",
- "issuer",
- "subject",
- "jwtid"
- ];
- module.exports = function(payload, secretOrPrivateKey, options2, callback) {
- if (typeof options2 === "function") {
- callback = options2;
- options2 = {};
- } else {
- options2 = options2 || {};
- }
- const isObjectPayload = typeof payload === "object" && !Buffer.isBuffer(payload);
- const header = Object.assign({
- alg: options2.algorithm || "HS256",
- typ: isObjectPayload ? "JWT" : undefined,
- kid: options2.keyid
- }, options2.header);
- function failure(err) {
- if (callback) {
- return callback(err);
- }
- throw err;
- }
- if (!secretOrPrivateKey && options2.algorithm !== "none") {
- return failure(new Error("secretOrPrivateKey must have a value"));
- }
- if (secretOrPrivateKey != null && !(secretOrPrivateKey instanceof KeyObject)) {
- try {
- secretOrPrivateKey = createPrivateKey(secretOrPrivateKey);
- } catch (_) {
- try {
- secretOrPrivateKey = createSecretKey(typeof secretOrPrivateKey === "string" ? Buffer.from(secretOrPrivateKey) : secretOrPrivateKey);
- } catch (_2) {
- return failure(new Error("secretOrPrivateKey is not valid key material"));
- }
- }
- }
- if (header.alg.startsWith("HS") && secretOrPrivateKey.type !== "secret") {
- return failure(new Error(`secretOrPrivateKey must be a symmetric key when using ${header.alg}`));
- } else if (/^(?:RS|PS|ES)/.test(header.alg)) {
- if (secretOrPrivateKey.type !== "private") {
- return failure(new Error(`secretOrPrivateKey must be an asymmetric key when using ${header.alg}`));
- }
- if (!options2.allowInsecureKeySizes && !header.alg.startsWith("ES") && secretOrPrivateKey.asymmetricKeyDetails !== undefined && secretOrPrivateKey.asymmetricKeyDetails.modulusLength < 2048) {
- return failure(new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`));
- }
- }
- if (typeof payload === "undefined") {
- return failure(new Error("payload is required"));
- } else if (isObjectPayload) {
- try {
- validatePayload(payload);
- } catch (error) {
- return failure(error);
- }
- if (!options2.mutatePayload) {
- payload = Object.assign({}, payload);
- }
- } else {
- const invalid_options = options_for_objects.filter(function(opt) {
- return typeof options2[opt] !== "undefined";
- });
- if (invalid_options.length > 0) {
- return failure(new Error("invalid " + invalid_options.join(",") + " option for " + typeof payload + " payload"));
- }
- }
- if (typeof payload.exp !== "undefined" && typeof options2.expiresIn !== "undefined") {
- return failure(new Error('Bad "options.expiresIn" option the payload already has an "exp" property.'));
- }
- if (typeof payload.nbf !== "undefined" && typeof options2.notBefore !== "undefined") {
- return failure(new Error('Bad "options.notBefore" option the payload already has an "nbf" property.'));
- }
- try {
- validateOptions(options2);
- } catch (error) {
- return failure(error);
- }
- if (!options2.allowInvalidAsymmetricKeyTypes) {
- try {
- validateAsymmetricKey(header.alg, secretOrPrivateKey);
- } catch (error) {
- return failure(error);
- }
- }
- const timestamp = payload.iat || Math.floor(Date.now() / 1000);
- if (options2.noTimestamp) {
- delete payload.iat;
- } else if (isObjectPayload) {
- payload.iat = timestamp;
- }
- if (typeof options2.notBefore !== "undefined") {
- try {
- payload.nbf = timespan(options2.notBefore, timestamp);
- } catch (err) {
- return failure(err);
- }
- if (typeof payload.nbf === "undefined") {
- return failure(new Error('"notBefore" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
- }
- }
- if (typeof options2.expiresIn !== "undefined" && typeof payload === "object") {
- try {
- payload.exp = timespan(options2.expiresIn, timestamp);
- } catch (err) {
- return failure(err);
- }
- if (typeof payload.exp === "undefined") {
- return failure(new Error('"expiresIn" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
- }
- }
- Object.keys(options_to_payload).forEach(function(key) {
- const claim = options_to_payload[key];
- if (typeof options2[key] !== "undefined") {
- if (typeof payload[claim] !== "undefined") {
- return failure(new Error('Bad "options.' + key + '" option. The payload already has an "' + claim + '" property.'));
- }
- payload[claim] = options2[key];
- }
- });
- const encoding = options2.encoding || "utf8";
- if (typeof callback === "function") {
- callback = callback && once(callback);
- jws.createSign({
- header,
- privateKey: secretOrPrivateKey,
- payload,
- encoding
- }).once("error", callback).once("done", function(signature) {
- if (!options2.allowInsecureKeySizes && /^(?:RS|PS)/.test(header.alg) && signature.length < 256) {
- return callback(new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`));
- }
- callback(null, signature);
- });
- } else {
- let signature = jws.sign({ header, payload, secret: secretOrPrivateKey, encoding });
- if (!options2.allowInsecureKeySizes && /^(?:RS|PS)/.test(header.alg) && signature.length < 256) {
- throw new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`);
- }
- return signature;
- }
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/index.js
-var require_jsonwebtoken = __commonJS((exports, module) => {
- module.exports = {
- decode: require_decode(),
- verify: require_verify(),
- sign: require_sign(),
- JsonWebTokenError: require_JsonWebTokenError(),
- NotBeforeError: require_NotBeforeError(),
- TokenExpiredError: require_TokenExpiredError()
- };
-});
-
-// ../eve/node_modules/bn.js/lib/bn.js
-var require_bn = __commonJS((exports, module) => {
- (function(module2, exports2) {
- function assert(val, msg) {
- if (!val)
- throw new Error(msg || "Assertion failed");
- }
- function inherits(ctor, superCtor) {
- ctor.super_ = superCtor;
- var TempCtor = function() {};
- TempCtor.prototype = superCtor.prototype;
- ctor.prototype = new TempCtor;
- ctor.prototype.constructor = ctor;
- }
- function BN(number, base, endian) {
- if (BN.isBN(number)) {
- return number;
- }
- this.negative = 0;
- this.words = null;
- this.length = 0;
- this.red = null;
- if (number !== null) {
- if (base === "le" || base === "be") {
- endian = base;
- base = 10;
- }
- this._init(number || 0, base || 10, endian || "be");
- }
- }
- if (typeof module2 === "object") {
- module2.exports = BN;
- } else {
- exports2.BN = BN;
- }
- BN.BN = BN;
- BN.wordSize = 26;
- var Buffer2;
- try {
- if (typeof window !== "undefined" && typeof window.Buffer !== "undefined") {
- Buffer2 = window.Buffer;
- } else {
- Buffer2 = __require("buffer").Buffer;
- }
- } catch (e) {}
- BN.isBN = function isBN(num) {
- if (num instanceof BN) {
- return true;
- }
- return num !== null && typeof num === "object" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);
- };
- BN.max = function max(left, right) {
- if (left.cmp(right) > 0)
- return left;
- return right;
- };
- BN.min = function min(left, right) {
- if (left.cmp(right) < 0)
- return left;
- return right;
- };
- BN.prototype._init = function init(number, base, endian) {
- if (typeof number === "number") {
- return this._initNumber(number, base, endian);
- }
- if (typeof number === "object") {
- return this._initArray(number, base, endian);
- }
- if (base === "hex") {
- base = 16;
- }
- assert(base === (base | 0) && base >= 2 && base <= 36);
- number = number.toString().replace(/\s+/g, "");
- var start = 0;
- if (number[0] === "-") {
- start++;
- this.negative = 1;
- }
- if (start < number.length) {
- if (base === 16) {
- this._parseHex(number, start, endian);
- } else {
- this._parseBase(number, base, start);
- if (endian === "le") {
- this._initArray(this.toArray(), base, endian);
- }
- }
- }
- };
- BN.prototype._initNumber = function _initNumber(number, base, endian) {
- if (number < 0) {
- this.negative = 1;
- number = -number;
- }
- if (number < 67108864) {
- this.words = [number & 67108863];
- this.length = 1;
- } else if (number < 4503599627370496) {
- this.words = [
- number & 67108863,
- number / 67108864 & 67108863
- ];
- this.length = 2;
- } else {
- assert(number < 9007199254740992);
- this.words = [
- number & 67108863,
- number / 67108864 & 67108863,
- 1
- ];
- this.length = 3;
- }
- if (endian !== "le")
- return;
- this._initArray(this.toArray(), base, endian);
- };
- BN.prototype._initArray = function _initArray(number, base, endian) {
- assert(typeof number.length === "number");
- if (number.length <= 0) {
- this.words = [0];
- this.length = 1;
- return this;
- }
- this.length = Math.ceil(number.length / 3);
- this.words = new Array(this.length);
- for (var i = 0;i < this.length; i++) {
- this.words[i] = 0;
- }
- var j, w;
- var off = 0;
- if (endian === "be") {
- for (i = number.length - 1, j = 0;i >= 0; i -= 3) {
- w = number[i] | number[i - 1] << 8 | number[i - 2] << 16;
- this.words[j] |= w << off & 67108863;
- this.words[j + 1] = w >>> 26 - off & 67108863;
- off += 24;
- if (off >= 26) {
- off -= 26;
- j++;
- }
- }
- } else if (endian === "le") {
- for (i = 0, j = 0;i < number.length; i += 3) {
- w = number[i] | number[i + 1] << 8 | number[i + 2] << 16;
- this.words[j] |= w << off & 67108863;
- this.words[j + 1] = w >>> 26 - off & 67108863;
- off += 24;
- if (off >= 26) {
- off -= 26;
- j++;
- }
- }
- }
- return this.strip();
- };
- function parseHex4Bits(string, index) {
- var c = string.charCodeAt(index);
- if (c >= 65 && c <= 70) {
- return c - 55;
- } else if (c >= 97 && c <= 102) {
- return c - 87;
- } else {
- return c - 48 & 15;
- }
- }
- function parseHexByte(string, lowerBound, index) {
- var r = parseHex4Bits(string, index);
- if (index - 1 >= lowerBound) {
- r |= parseHex4Bits(string, index - 1) << 4;
- }
- return r;
- }
- BN.prototype._parseHex = function _parseHex(number, start, endian) {
- this.length = Math.ceil((number.length - start) / 6);
- this.words = new Array(this.length);
- for (var i = 0;i < this.length; i++) {
- this.words[i] = 0;
- }
- var off = 0;
- var j = 0;
- var w;
- if (endian === "be") {
- for (i = number.length - 1;i >= start; i -= 2) {
- w = parseHexByte(number, start, i) << off;
- this.words[j] |= w & 67108863;
- if (off >= 18) {
- off -= 18;
- j += 1;
- this.words[j] |= w >>> 26;
- } else {
- off += 8;
- }
- }
- } else {
- var parseLength = number.length - start;
- for (i = parseLength % 2 === 0 ? start + 1 : start;i < number.length; i += 2) {
- w = parseHexByte(number, start, i) << off;
- this.words[j] |= w & 67108863;
- if (off >= 18) {
- off -= 18;
- j += 1;
- this.words[j] |= w >>> 26;
- } else {
- off += 8;
- }
- }
- }
- this.strip();
- };
- function parseBase(str, start, end, mul) {
- var r = 0;
- var len = Math.min(str.length, end);
- for (var i = start;i < len; i++) {
- var c = str.charCodeAt(i) - 48;
- r *= mul;
- if (c >= 49) {
- r += c - 49 + 10;
- } else if (c >= 17) {
- r += c - 17 + 10;
- } else {
- r += c;
- }
- }
- return r;
- }
- BN.prototype._parseBase = function _parseBase(number, base, start) {
- this.words = [0];
- this.length = 1;
- for (var limbLen = 0, limbPow = 1;limbPow <= 67108863; limbPow *= base) {
- limbLen++;
- }
- limbLen--;
- limbPow = limbPow / base | 0;
- var total = number.length - start;
- var mod = total % limbLen;
- var end = Math.min(total, total - mod) + start;
- var word = 0;
- for (var i = start;i < end; i += limbLen) {
- word = parseBase(number, i, i + limbLen, base);
- this.imuln(limbPow);
- if (this.words[0] + word < 67108864) {
- this.words[0] += word;
- } else {
- this._iaddn(word);
- }
- }
- if (mod !== 0) {
- var pow = 1;
- word = parseBase(number, i, number.length, base);
- for (i = 0;i < mod; i++) {
- pow *= base;
- }
- this.imuln(pow);
- if (this.words[0] + word < 67108864) {
- this.words[0] += word;
- } else {
- this._iaddn(word);
- }
- }
- this.strip();
- };
- BN.prototype.copy = function copy(dest) {
- dest.words = new Array(this.length);
- for (var i = 0;i < this.length; i++) {
- dest.words[i] = this.words[i];
- }
- dest.length = this.length;
- dest.negative = this.negative;
- dest.red = this.red;
- };
- BN.prototype.clone = function clone() {
- var r = new BN(null);
- this.copy(r);
- return r;
- };
- BN.prototype._expand = function _expand(size) {
- while (this.length < size) {
- this.words[this.length++] = 0;
- }
- return this;
- };
- BN.prototype.strip = function strip() {
- while (this.length > 1 && this.words[this.length - 1] === 0) {
- this.length--;
- }
- return this._normSign();
- };
- BN.prototype._normSign = function _normSign() {
- if (this.length === 1 && this.words[0] === 0) {
- this.negative = 0;
- }
- return this;
- };
- BN.prototype.inspect = function inspect() {
- return (this.red ? "";
- };
- var zeros = [
- "",
- "0",
- "00",
- "000",
- "0000",
- "00000",
- "000000",
- "0000000",
- "00000000",
- "000000000",
- "0000000000",
- "00000000000",
- "000000000000",
- "0000000000000",
- "00000000000000",
- "000000000000000",
- "0000000000000000",
- "00000000000000000",
- "000000000000000000",
- "0000000000000000000",
- "00000000000000000000",
- "000000000000000000000",
- "0000000000000000000000",
- "00000000000000000000000",
- "000000000000000000000000",
- "0000000000000000000000000"
- ];
- var groupSizes = [
- 0,
- 0,
- 25,
- 16,
- 12,
- 11,
- 10,
- 9,
- 8,
- 8,
- 7,
- 7,
- 7,
- 7,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5
- ];
- var groupBases = [
- 0,
- 0,
- 33554432,
- 43046721,
- 16777216,
- 48828125,
- 60466176,
- 40353607,
- 16777216,
- 43046721,
- 1e7,
- 19487171,
- 35831808,
- 62748517,
- 7529536,
- 11390625,
- 16777216,
- 24137569,
- 34012224,
- 47045881,
- 64000000,
- 4084101,
- 5153632,
- 6436343,
- 7962624,
- 9765625,
- 11881376,
- 14348907,
- 17210368,
- 20511149,
- 24300000,
- 28629151,
- 33554432,
- 39135393,
- 45435424,
- 52521875,
- 60466176
- ];
- BN.prototype.toString = function toString(base, padding) {
- base = base || 10;
- padding = padding | 0 || 1;
- var out;
- if (base === 16 || base === "hex") {
- out = "";
- var off = 0;
- var carry = 0;
- for (var i = 0;i < this.length; i++) {
- var w = this.words[i];
- var word = ((w << off | carry) & 16777215).toString(16);
- carry = w >>> 24 - off & 16777215;
- off += 2;
- if (off >= 26) {
- off -= 26;
- i--;
- }
- if (carry !== 0 || i !== this.length - 1) {
- out = zeros[6 - word.length] + word + out;
- } else {
- out = word + out;
- }
- }
- if (carry !== 0) {
- out = carry.toString(16) + out;
- }
- while (out.length % padding !== 0) {
- out = "0" + out;
- }
- if (this.negative !== 0) {
- out = "-" + out;
- }
- return out;
- }
- if (base === (base | 0) && base >= 2 && base <= 36) {
- var groupSize = groupSizes[base];
- var groupBase = groupBases[base];
- out = "";
- var c = this.clone();
- c.negative = 0;
- while (!c.isZero()) {
- var r = c.modn(groupBase).toString(base);
- c = c.idivn(groupBase);
- if (!c.isZero()) {
- out = zeros[groupSize - r.length] + r + out;
- } else {
- out = r + out;
- }
- }
- if (this.isZero()) {
- out = "0" + out;
- }
- while (out.length % padding !== 0) {
- out = "0" + out;
- }
- if (this.negative !== 0) {
- out = "-" + out;
- }
- return out;
- }
- assert(false, "Base should be between 2 and 36");
- };
- BN.prototype.toNumber = function toNumber() {
- var ret = this.words[0];
- if (this.length === 2) {
- ret += this.words[1] * 67108864;
- } else if (this.length === 3 && this.words[2] === 1) {
- ret += 4503599627370496 + this.words[1] * 67108864;
- } else if (this.length > 2) {
- assert(false, "Number can only safely store up to 53 bits");
- }
- return this.negative !== 0 ? -ret : ret;
- };
- BN.prototype.toJSON = function toJSON() {
- return this.toString(16);
- };
- BN.prototype.toBuffer = function toBuffer(endian, length) {
- assert(typeof Buffer2 !== "undefined");
- return this.toArrayLike(Buffer2, endian, length);
- };
- BN.prototype.toArray = function toArray(endian, length) {
- return this.toArrayLike(Array, endian, length);
- };
- BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) {
- var byteLength = this.byteLength();
- var reqLength = length || Math.max(1, byteLength);
- assert(byteLength <= reqLength, "byte array longer than desired length");
- assert(reqLength > 0, "Requested array length <= 0");
- this.strip();
- var littleEndian = endian === "le";
- var res = new ArrayType(reqLength);
- var b, i;
- var q = this.clone();
- if (!littleEndian) {
- for (i = 0;i < reqLength - byteLength; i++) {
- res[i] = 0;
- }
- for (i = 0;!q.isZero(); i++) {
- b = q.andln(255);
- q.iushrn(8);
- res[reqLength - i - 1] = b;
- }
- } else {
- for (i = 0;!q.isZero(); i++) {
- b = q.andln(255);
- q.iushrn(8);
- res[i] = b;
- }
- for (;i < reqLength; i++) {
- res[i] = 0;
- }
- }
- return res;
- };
- if (Math.clz32) {
- BN.prototype._countBits = function _countBits(w) {
- return 32 - Math.clz32(w);
- };
- } else {
- BN.prototype._countBits = function _countBits(w) {
- var t = w;
- var r = 0;
- if (t >= 4096) {
- r += 13;
- t >>>= 13;
- }
- if (t >= 64) {
- r += 7;
- t >>>= 7;
- }
- if (t >= 8) {
- r += 4;
- t >>>= 4;
- }
- if (t >= 2) {
- r += 2;
- t >>>= 2;
- }
- return r + t;
- };
- }
- BN.prototype._zeroBits = function _zeroBits(w) {
- if (w === 0)
- return 26;
- var t = w;
- var r = 0;
- if ((t & 8191) === 0) {
- r += 13;
- t >>>= 13;
- }
- if ((t & 127) === 0) {
- r += 7;
- t >>>= 7;
- }
- if ((t & 15) === 0) {
- r += 4;
- t >>>= 4;
- }
- if ((t & 3) === 0) {
- r += 2;
- t >>>= 2;
- }
- if ((t & 1) === 0) {
- r++;
- }
- return r;
- };
- BN.prototype.bitLength = function bitLength() {
- var w = this.words[this.length - 1];
- var hi = this._countBits(w);
- return (this.length - 1) * 26 + hi;
- };
- function toBitArray(num) {
- var w = new Array(num.bitLength());
- for (var bit = 0;bit < w.length; bit++) {
- var off = bit / 26 | 0;
- var wbit = bit % 26;
- w[bit] = (num.words[off] & 1 << wbit) >>> wbit;
- }
- return w;
- }
- BN.prototype.zeroBits = function zeroBits() {
- if (this.isZero())
- return 0;
- var r = 0;
- for (var i = 0;i < this.length; i++) {
- var b = this._zeroBits(this.words[i]);
- r += b;
- if (b !== 26)
- break;
- }
- return r;
- };
- BN.prototype.byteLength = function byteLength() {
- return Math.ceil(this.bitLength() / 8);
- };
- BN.prototype.toTwos = function toTwos(width) {
- if (this.negative !== 0) {
- return this.abs().inotn(width).iaddn(1);
- }
- return this.clone();
- };
- BN.prototype.fromTwos = function fromTwos(width) {
- if (this.testn(width - 1)) {
- return this.notn(width).iaddn(1).ineg();
- }
- return this.clone();
- };
- BN.prototype.isNeg = function isNeg() {
- return this.negative !== 0;
- };
- BN.prototype.neg = function neg() {
- return this.clone().ineg();
- };
- BN.prototype.ineg = function ineg() {
- if (!this.isZero()) {
- this.negative ^= 1;
- }
- return this;
- };
- BN.prototype.iuor = function iuor(num) {
- while (this.length < num.length) {
- this.words[this.length++] = 0;
- }
- for (var i = 0;i < num.length; i++) {
- this.words[i] = this.words[i] | num.words[i];
- }
- return this.strip();
- };
- BN.prototype.ior = function ior(num) {
- assert((this.negative | num.negative) === 0);
- return this.iuor(num);
- };
- BN.prototype.or = function or(num) {
- if (this.length > num.length)
- return this.clone().ior(num);
- return num.clone().ior(this);
- };
- BN.prototype.uor = function uor(num) {
- if (this.length > num.length)
- return this.clone().iuor(num);
- return num.clone().iuor(this);
- };
- BN.prototype.iuand = function iuand(num) {
- var b;
- if (this.length > num.length) {
- b = num;
- } else {
- b = this;
- }
- for (var i = 0;i < b.length; i++) {
- this.words[i] = this.words[i] & num.words[i];
- }
- this.length = b.length;
- return this.strip();
- };
- BN.prototype.iand = function iand(num) {
- assert((this.negative | num.negative) === 0);
- return this.iuand(num);
- };
- BN.prototype.and = function and(num) {
- if (this.length > num.length)
- return this.clone().iand(num);
- return num.clone().iand(this);
- };
- BN.prototype.uand = function uand(num) {
- if (this.length > num.length)
- return this.clone().iuand(num);
- return num.clone().iuand(this);
- };
- BN.prototype.iuxor = function iuxor(num) {
- var a;
- var b;
- if (this.length > num.length) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
- for (var i = 0;i < b.length; i++) {
- this.words[i] = a.words[i] ^ b.words[i];
- }
- if (this !== a) {
- for (;i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
- this.length = a.length;
- return this.strip();
- };
- BN.prototype.ixor = function ixor(num) {
- assert((this.negative | num.negative) === 0);
- return this.iuxor(num);
- };
- BN.prototype.xor = function xor(num) {
- if (this.length > num.length)
- return this.clone().ixor(num);
- return num.clone().ixor(this);
- };
- BN.prototype.uxor = function uxor(num) {
- if (this.length > num.length)
- return this.clone().iuxor(num);
- return num.clone().iuxor(this);
- };
- BN.prototype.inotn = function inotn(width) {
- assert(typeof width === "number" && width >= 0);
- var bytesNeeded = Math.ceil(width / 26) | 0;
- var bitsLeft = width % 26;
- this._expand(bytesNeeded);
- if (bitsLeft > 0) {
- bytesNeeded--;
- }
- for (var i = 0;i < bytesNeeded; i++) {
- this.words[i] = ~this.words[i] & 67108863;
- }
- if (bitsLeft > 0) {
- this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft;
- }
- return this.strip();
- };
- BN.prototype.notn = function notn(width) {
- return this.clone().inotn(width);
- };
- BN.prototype.setn = function setn(bit, val) {
- assert(typeof bit === "number" && bit >= 0);
- var off = bit / 26 | 0;
- var wbit = bit % 26;
- this._expand(off + 1);
- if (val) {
- this.words[off] = this.words[off] | 1 << wbit;
- } else {
- this.words[off] = this.words[off] & ~(1 << wbit);
- }
- return this.strip();
- };
- BN.prototype.iadd = function iadd(num) {
- var r;
- if (this.negative !== 0 && num.negative === 0) {
- this.negative = 0;
- r = this.isub(num);
- this.negative ^= 1;
- return this._normSign();
- } else if (this.negative === 0 && num.negative !== 0) {
- num.negative = 0;
- r = this.isub(num);
- num.negative = 1;
- return r._normSign();
- }
- var a, b;
- if (this.length > num.length) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
- var carry = 0;
- for (var i = 0;i < b.length; i++) {
- r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
- this.words[i] = r & 67108863;
- carry = r >>> 26;
- }
- for (;carry !== 0 && i < a.length; i++) {
- r = (a.words[i] | 0) + carry;
- this.words[i] = r & 67108863;
- carry = r >>> 26;
- }
- this.length = a.length;
- if (carry !== 0) {
- this.words[this.length] = carry;
- this.length++;
- } else if (a !== this) {
- for (;i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
- return this;
- };
- BN.prototype.add = function add(num) {
- var res;
- if (num.negative !== 0 && this.negative === 0) {
- num.negative = 0;
- res = this.sub(num);
- num.negative ^= 1;
- return res;
- } else if (num.negative === 0 && this.negative !== 0) {
- this.negative = 0;
- res = num.sub(this);
- this.negative = 1;
- return res;
- }
- if (this.length > num.length)
- return this.clone().iadd(num);
- return num.clone().iadd(this);
- };
- BN.prototype.isub = function isub(num) {
- if (num.negative !== 0) {
- num.negative = 0;
- var r = this.iadd(num);
- num.negative = 1;
- return r._normSign();
- } else if (this.negative !== 0) {
- this.negative = 0;
- this.iadd(num);
- this.negative = 1;
- return this._normSign();
- }
- var cmp = this.cmp(num);
- if (cmp === 0) {
- this.negative = 0;
- this.length = 1;
- this.words[0] = 0;
- return this;
- }
- var a, b;
- if (cmp > 0) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
- var carry = 0;
- for (var i = 0;i < b.length; i++) {
- r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
- carry = r >> 26;
- this.words[i] = r & 67108863;
- }
- for (;carry !== 0 && i < a.length; i++) {
- r = (a.words[i] | 0) + carry;
- carry = r >> 26;
- this.words[i] = r & 67108863;
- }
- if (carry === 0 && i < a.length && a !== this) {
- for (;i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
- this.length = Math.max(this.length, i);
- if (a !== this) {
- this.negative = 1;
- }
- return this.strip();
- };
- BN.prototype.sub = function sub(num) {
- return this.clone().isub(num);
- };
- function smallMulTo(self2, num, out) {
- out.negative = num.negative ^ self2.negative;
- var len = self2.length + num.length | 0;
- out.length = len;
- len = len - 1 | 0;
- var a = self2.words[0] | 0;
- var b = num.words[0] | 0;
- var r = a * b;
- var lo = r & 67108863;
- var carry = r / 67108864 | 0;
- out.words[0] = lo;
- for (var k = 1;k < len; k++) {
- var ncarry = carry >>> 26;
- var rword = carry & 67108863;
- var maxJ = Math.min(k, num.length - 1);
- for (var j = Math.max(0, k - self2.length + 1);j <= maxJ; j++) {
- var i = k - j | 0;
- a = self2.words[i] | 0;
- b = num.words[j] | 0;
- r = a * b + rword;
- ncarry += r / 67108864 | 0;
- rword = r & 67108863;
- }
- out.words[k] = rword | 0;
- carry = ncarry | 0;
- }
- if (carry !== 0) {
- out.words[k] = carry | 0;
- } else {
- out.length--;
- }
- return out.strip();
- }
- var comb10MulTo = function comb10MulTo(self2, num, out) {
- var a = self2.words;
- var b = num.words;
- var o = out.words;
- var c = 0;
- var lo;
- var mid;
- var hi;
- var a0 = a[0] | 0;
- var al0 = a0 & 8191;
- var ah0 = a0 >>> 13;
- var a1 = a[1] | 0;
- var al1 = a1 & 8191;
- var ah1 = a1 >>> 13;
- var a2 = a[2] | 0;
- var al2 = a2 & 8191;
- var ah2 = a2 >>> 13;
- var a3 = a[3] | 0;
- var al3 = a3 & 8191;
- var ah3 = a3 >>> 13;
- var a4 = a[4] | 0;
- var al4 = a4 & 8191;
- var ah4 = a4 >>> 13;
- var a5 = a[5] | 0;
- var al5 = a5 & 8191;
- var ah5 = a5 >>> 13;
- var a6 = a[6] | 0;
- var al6 = a6 & 8191;
- var ah6 = a6 >>> 13;
- var a7 = a[7] | 0;
- var al7 = a7 & 8191;
- var ah7 = a7 >>> 13;
- var a8 = a[8] | 0;
- var al8 = a8 & 8191;
- var ah8 = a8 >>> 13;
- var a9 = a[9] | 0;
- var al9 = a9 & 8191;
- var ah9 = a9 >>> 13;
- var b0 = b[0] | 0;
- var bl0 = b0 & 8191;
- var bh0 = b0 >>> 13;
- var b1 = b[1] | 0;
- var bl1 = b1 & 8191;
- var bh1 = b1 >>> 13;
- var b2 = b[2] | 0;
- var bl2 = b2 & 8191;
- var bh2 = b2 >>> 13;
- var b3 = b[3] | 0;
- var bl3 = b3 & 8191;
- var bh3 = b3 >>> 13;
- var b4 = b[4] | 0;
- var bl4 = b4 & 8191;
- var bh4 = b4 >>> 13;
- var b5 = b[5] | 0;
- var bl5 = b5 & 8191;
- var bh5 = b5 >>> 13;
- var b6 = b[6] | 0;
- var bl6 = b6 & 8191;
- var bh6 = b6 >>> 13;
- var b7 = b[7] | 0;
- var bl7 = b7 & 8191;
- var bh7 = b7 >>> 13;
- var b8 = b[8] | 0;
- var bl8 = b8 & 8191;
- var bh8 = b8 >>> 13;
- var b9 = b[9] | 0;
- var bl9 = b9 & 8191;
- var bh9 = b9 >>> 13;
- out.negative = self2.negative ^ num.negative;
- out.length = 19;
- lo = Math.imul(al0, bl0);
- mid = Math.imul(al0, bh0);
- mid = mid + Math.imul(ah0, bl0) | 0;
- hi = Math.imul(ah0, bh0);
- var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0;
- w0 &= 67108863;
- lo = Math.imul(al1, bl0);
- mid = Math.imul(al1, bh0);
- mid = mid + Math.imul(ah1, bl0) | 0;
- hi = Math.imul(ah1, bh0);
- lo = lo + Math.imul(al0, bl1) | 0;
- mid = mid + Math.imul(al0, bh1) | 0;
- mid = mid + Math.imul(ah0, bl1) | 0;
- hi = hi + Math.imul(ah0, bh1) | 0;
- var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0;
- w1 &= 67108863;
- lo = Math.imul(al2, bl0);
- mid = Math.imul(al2, bh0);
- mid = mid + Math.imul(ah2, bl0) | 0;
- hi = Math.imul(ah2, bh0);
- lo = lo + Math.imul(al1, bl1) | 0;
- mid = mid + Math.imul(al1, bh1) | 0;
- mid = mid + Math.imul(ah1, bl1) | 0;
- hi = hi + Math.imul(ah1, bh1) | 0;
- lo = lo + Math.imul(al0, bl2) | 0;
- mid = mid + Math.imul(al0, bh2) | 0;
- mid = mid + Math.imul(ah0, bl2) | 0;
- hi = hi + Math.imul(ah0, bh2) | 0;
- var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0;
- w2 &= 67108863;
- lo = Math.imul(al3, bl0);
- mid = Math.imul(al3, bh0);
- mid = mid + Math.imul(ah3, bl0) | 0;
- hi = Math.imul(ah3, bh0);
- lo = lo + Math.imul(al2, bl1) | 0;
- mid = mid + Math.imul(al2, bh1) | 0;
- mid = mid + Math.imul(ah2, bl1) | 0;
- hi = hi + Math.imul(ah2, bh1) | 0;
- lo = lo + Math.imul(al1, bl2) | 0;
- mid = mid + Math.imul(al1, bh2) | 0;
- mid = mid + Math.imul(ah1, bl2) | 0;
- hi = hi + Math.imul(ah1, bh2) | 0;
- lo = lo + Math.imul(al0, bl3) | 0;
- mid = mid + Math.imul(al0, bh3) | 0;
- mid = mid + Math.imul(ah0, bl3) | 0;
- hi = hi + Math.imul(ah0, bh3) | 0;
- var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0;
- w3 &= 67108863;
- lo = Math.imul(al4, bl0);
- mid = Math.imul(al4, bh0);
- mid = mid + Math.imul(ah4, bl0) | 0;
- hi = Math.imul(ah4, bh0);
- lo = lo + Math.imul(al3, bl1) | 0;
- mid = mid + Math.imul(al3, bh1) | 0;
- mid = mid + Math.imul(ah3, bl1) | 0;
- hi = hi + Math.imul(ah3, bh1) | 0;
- lo = lo + Math.imul(al2, bl2) | 0;
- mid = mid + Math.imul(al2, bh2) | 0;
- mid = mid + Math.imul(ah2, bl2) | 0;
- hi = hi + Math.imul(ah2, bh2) | 0;
- lo = lo + Math.imul(al1, bl3) | 0;
- mid = mid + Math.imul(al1, bh3) | 0;
- mid = mid + Math.imul(ah1, bl3) | 0;
- hi = hi + Math.imul(ah1, bh3) | 0;
- lo = lo + Math.imul(al0, bl4) | 0;
- mid = mid + Math.imul(al0, bh4) | 0;
- mid = mid + Math.imul(ah0, bl4) | 0;
- hi = hi + Math.imul(ah0, bh4) | 0;
- var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0;
- w4 &= 67108863;
- lo = Math.imul(al5, bl0);
- mid = Math.imul(al5, bh0);
- mid = mid + Math.imul(ah5, bl0) | 0;
- hi = Math.imul(ah5, bh0);
- lo = lo + Math.imul(al4, bl1) | 0;
- mid = mid + Math.imul(al4, bh1) | 0;
- mid = mid + Math.imul(ah4, bl1) | 0;
- hi = hi + Math.imul(ah4, bh1) | 0;
- lo = lo + Math.imul(al3, bl2) | 0;
- mid = mid + Math.imul(al3, bh2) | 0;
- mid = mid + Math.imul(ah3, bl2) | 0;
- hi = hi + Math.imul(ah3, bh2) | 0;
- lo = lo + Math.imul(al2, bl3) | 0;
- mid = mid + Math.imul(al2, bh3) | 0;
- mid = mid + Math.imul(ah2, bl3) | 0;
- hi = hi + Math.imul(ah2, bh3) | 0;
- lo = lo + Math.imul(al1, bl4) | 0;
- mid = mid + Math.imul(al1, bh4) | 0;
- mid = mid + Math.imul(ah1, bl4) | 0;
- hi = hi + Math.imul(ah1, bh4) | 0;
- lo = lo + Math.imul(al0, bl5) | 0;
- mid = mid + Math.imul(al0, bh5) | 0;
- mid = mid + Math.imul(ah0, bl5) | 0;
- hi = hi + Math.imul(ah0, bh5) | 0;
- var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0;
- w5 &= 67108863;
- lo = Math.imul(al6, bl0);
- mid = Math.imul(al6, bh0);
- mid = mid + Math.imul(ah6, bl0) | 0;
- hi = Math.imul(ah6, bh0);
- lo = lo + Math.imul(al5, bl1) | 0;
- mid = mid + Math.imul(al5, bh1) | 0;
- mid = mid + Math.imul(ah5, bl1) | 0;
- hi = hi + Math.imul(ah5, bh1) | 0;
- lo = lo + Math.imul(al4, bl2) | 0;
- mid = mid + Math.imul(al4, bh2) | 0;
- mid = mid + Math.imul(ah4, bl2) | 0;
- hi = hi + Math.imul(ah4, bh2) | 0;
- lo = lo + Math.imul(al3, bl3) | 0;
- mid = mid + Math.imul(al3, bh3) | 0;
- mid = mid + Math.imul(ah3, bl3) | 0;
- hi = hi + Math.imul(ah3, bh3) | 0;
- lo = lo + Math.imul(al2, bl4) | 0;
- mid = mid + Math.imul(al2, bh4) | 0;
- mid = mid + Math.imul(ah2, bl4) | 0;
- hi = hi + Math.imul(ah2, bh4) | 0;
- lo = lo + Math.imul(al1, bl5) | 0;
- mid = mid + Math.imul(al1, bh5) | 0;
- mid = mid + Math.imul(ah1, bl5) | 0;
- hi = hi + Math.imul(ah1, bh5) | 0;
- lo = lo + Math.imul(al0, bl6) | 0;
- mid = mid + Math.imul(al0, bh6) | 0;
- mid = mid + Math.imul(ah0, bl6) | 0;
- hi = hi + Math.imul(ah0, bh6) | 0;
- var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0;
- w6 &= 67108863;
- lo = Math.imul(al7, bl0);
- mid = Math.imul(al7, bh0);
- mid = mid + Math.imul(ah7, bl0) | 0;
- hi = Math.imul(ah7, bh0);
- lo = lo + Math.imul(al6, bl1) | 0;
- mid = mid + Math.imul(al6, bh1) | 0;
- mid = mid + Math.imul(ah6, bl1) | 0;
- hi = hi + Math.imul(ah6, bh1) | 0;
- lo = lo + Math.imul(al5, bl2) | 0;
- mid = mid + Math.imul(al5, bh2) | 0;
- mid = mid + Math.imul(ah5, bl2) | 0;
- hi = hi + Math.imul(ah5, bh2) | 0;
- lo = lo + Math.imul(al4, bl3) | 0;
- mid = mid + Math.imul(al4, bh3) | 0;
- mid = mid + Math.imul(ah4, bl3) | 0;
- hi = hi + Math.imul(ah4, bh3) | 0;
- lo = lo + Math.imul(al3, bl4) | 0;
- mid = mid + Math.imul(al3, bh4) | 0;
- mid = mid + Math.imul(ah3, bl4) | 0;
- hi = hi + Math.imul(ah3, bh4) | 0;
- lo = lo + Math.imul(al2, bl5) | 0;
- mid = mid + Math.imul(al2, bh5) | 0;
- mid = mid + Math.imul(ah2, bl5) | 0;
- hi = hi + Math.imul(ah2, bh5) | 0;
- lo = lo + Math.imul(al1, bl6) | 0;
- mid = mid + Math.imul(al1, bh6) | 0;
- mid = mid + Math.imul(ah1, bl6) | 0;
- hi = hi + Math.imul(ah1, bh6) | 0;
- lo = lo + Math.imul(al0, bl7) | 0;
- mid = mid + Math.imul(al0, bh7) | 0;
- mid = mid + Math.imul(ah0, bl7) | 0;
- hi = hi + Math.imul(ah0, bh7) | 0;
- var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0;
- w7 &= 67108863;
- lo = Math.imul(al8, bl0);
- mid = Math.imul(al8, bh0);
- mid = mid + Math.imul(ah8, bl0) | 0;
- hi = Math.imul(ah8, bh0);
- lo = lo + Math.imul(al7, bl1) | 0;
- mid = mid + Math.imul(al7, bh1) | 0;
- mid = mid + Math.imul(ah7, bl1) | 0;
- hi = hi + Math.imul(ah7, bh1) | 0;
- lo = lo + Math.imul(al6, bl2) | 0;
- mid = mid + Math.imul(al6, bh2) | 0;
- mid = mid + Math.imul(ah6, bl2) | 0;
- hi = hi + Math.imul(ah6, bh2) | 0;
- lo = lo + Math.imul(al5, bl3) | 0;
- mid = mid + Math.imul(al5, bh3) | 0;
- mid = mid + Math.imul(ah5, bl3) | 0;
- hi = hi + Math.imul(ah5, bh3) | 0;
- lo = lo + Math.imul(al4, bl4) | 0;
- mid = mid + Math.imul(al4, bh4) | 0;
- mid = mid + Math.imul(ah4, bl4) | 0;
- hi = hi + Math.imul(ah4, bh4) | 0;
- lo = lo + Math.imul(al3, bl5) | 0;
- mid = mid + Math.imul(al3, bh5) | 0;
- mid = mid + Math.imul(ah3, bl5) | 0;
- hi = hi + Math.imul(ah3, bh5) | 0;
- lo = lo + Math.imul(al2, bl6) | 0;
- mid = mid + Math.imul(al2, bh6) | 0;
- mid = mid + Math.imul(ah2, bl6) | 0;
- hi = hi + Math.imul(ah2, bh6) | 0;
- lo = lo + Math.imul(al1, bl7) | 0;
- mid = mid + Math.imul(al1, bh7) | 0;
- mid = mid + Math.imul(ah1, bl7) | 0;
- hi = hi + Math.imul(ah1, bh7) | 0;
- lo = lo + Math.imul(al0, bl8) | 0;
- mid = mid + Math.imul(al0, bh8) | 0;
- mid = mid + Math.imul(ah0, bl8) | 0;
- hi = hi + Math.imul(ah0, bh8) | 0;
- var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0;
- w8 &= 67108863;
- lo = Math.imul(al9, bl0);
- mid = Math.imul(al9, bh0);
- mid = mid + Math.imul(ah9, bl0) | 0;
- hi = Math.imul(ah9, bh0);
- lo = lo + Math.imul(al8, bl1) | 0;
- mid = mid + Math.imul(al8, bh1) | 0;
- mid = mid + Math.imul(ah8, bl1) | 0;
- hi = hi + Math.imul(ah8, bh1) | 0;
- lo = lo + Math.imul(al7, bl2) | 0;
- mid = mid + Math.imul(al7, bh2) | 0;
- mid = mid + Math.imul(ah7, bl2) | 0;
- hi = hi + Math.imul(ah7, bh2) | 0;
- lo = lo + Math.imul(al6, bl3) | 0;
- mid = mid + Math.imul(al6, bh3) | 0;
- mid = mid + Math.imul(ah6, bl3) | 0;
- hi = hi + Math.imul(ah6, bh3) | 0;
- lo = lo + Math.imul(al5, bl4) | 0;
- mid = mid + Math.imul(al5, bh4) | 0;
- mid = mid + Math.imul(ah5, bl4) | 0;
- hi = hi + Math.imul(ah5, bh4) | 0;
- lo = lo + Math.imul(al4, bl5) | 0;
- mid = mid + Math.imul(al4, bh5) | 0;
- mid = mid + Math.imul(ah4, bl5) | 0;
- hi = hi + Math.imul(ah4, bh5) | 0;
- lo = lo + Math.imul(al3, bl6) | 0;
- mid = mid + Math.imul(al3, bh6) | 0;
- mid = mid + Math.imul(ah3, bl6) | 0;
- hi = hi + Math.imul(ah3, bh6) | 0;
- lo = lo + Math.imul(al2, bl7) | 0;
- mid = mid + Math.imul(al2, bh7) | 0;
- mid = mid + Math.imul(ah2, bl7) | 0;
- hi = hi + Math.imul(ah2, bh7) | 0;
- lo = lo + Math.imul(al1, bl8) | 0;
- mid = mid + Math.imul(al1, bh8) | 0;
- mid = mid + Math.imul(ah1, bl8) | 0;
- hi = hi + Math.imul(ah1, bh8) | 0;
- lo = lo + Math.imul(al0, bl9) | 0;
- mid = mid + Math.imul(al0, bh9) | 0;
- mid = mid + Math.imul(ah0, bl9) | 0;
- hi = hi + Math.imul(ah0, bh9) | 0;
- var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0;
- w9 &= 67108863;
- lo = Math.imul(al9, bl1);
- mid = Math.imul(al9, bh1);
- mid = mid + Math.imul(ah9, bl1) | 0;
- hi = Math.imul(ah9, bh1);
- lo = lo + Math.imul(al8, bl2) | 0;
- mid = mid + Math.imul(al8, bh2) | 0;
- mid = mid + Math.imul(ah8, bl2) | 0;
- hi = hi + Math.imul(ah8, bh2) | 0;
- lo = lo + Math.imul(al7, bl3) | 0;
- mid = mid + Math.imul(al7, bh3) | 0;
- mid = mid + Math.imul(ah7, bl3) | 0;
- hi = hi + Math.imul(ah7, bh3) | 0;
- lo = lo + Math.imul(al6, bl4) | 0;
- mid = mid + Math.imul(al6, bh4) | 0;
- mid = mid + Math.imul(ah6, bl4) | 0;
- hi = hi + Math.imul(ah6, bh4) | 0;
- lo = lo + Math.imul(al5, bl5) | 0;
- mid = mid + Math.imul(al5, bh5) | 0;
- mid = mid + Math.imul(ah5, bl5) | 0;
- hi = hi + Math.imul(ah5, bh5) | 0;
- lo = lo + Math.imul(al4, bl6) | 0;
- mid = mid + Math.imul(al4, bh6) | 0;
- mid = mid + Math.imul(ah4, bl6) | 0;
- hi = hi + Math.imul(ah4, bh6) | 0;
- lo = lo + Math.imul(al3, bl7) | 0;
- mid = mid + Math.imul(al3, bh7) | 0;
- mid = mid + Math.imul(ah3, bl7) | 0;
- hi = hi + Math.imul(ah3, bh7) | 0;
- lo = lo + Math.imul(al2, bl8) | 0;
- mid = mid + Math.imul(al2, bh8) | 0;
- mid = mid + Math.imul(ah2, bl8) | 0;
- hi = hi + Math.imul(ah2, bh8) | 0;
- lo = lo + Math.imul(al1, bl9) | 0;
- mid = mid + Math.imul(al1, bh9) | 0;
- mid = mid + Math.imul(ah1, bl9) | 0;
- hi = hi + Math.imul(ah1, bh9) | 0;
- var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0;
- w10 &= 67108863;
- lo = Math.imul(al9, bl2);
- mid = Math.imul(al9, bh2);
- mid = mid + Math.imul(ah9, bl2) | 0;
- hi = Math.imul(ah9, bh2);
- lo = lo + Math.imul(al8, bl3) | 0;
- mid = mid + Math.imul(al8, bh3) | 0;
- mid = mid + Math.imul(ah8, bl3) | 0;
- hi = hi + Math.imul(ah8, bh3) | 0;
- lo = lo + Math.imul(al7, bl4) | 0;
- mid = mid + Math.imul(al7, bh4) | 0;
- mid = mid + Math.imul(ah7, bl4) | 0;
- hi = hi + Math.imul(ah7, bh4) | 0;
- lo = lo + Math.imul(al6, bl5) | 0;
- mid = mid + Math.imul(al6, bh5) | 0;
- mid = mid + Math.imul(ah6, bl5) | 0;
- hi = hi + Math.imul(ah6, bh5) | 0;
- lo = lo + Math.imul(al5, bl6) | 0;
- mid = mid + Math.imul(al5, bh6) | 0;
- mid = mid + Math.imul(ah5, bl6) | 0;
- hi = hi + Math.imul(ah5, bh6) | 0;
- lo = lo + Math.imul(al4, bl7) | 0;
- mid = mid + Math.imul(al4, bh7) | 0;
- mid = mid + Math.imul(ah4, bl7) | 0;
- hi = hi + Math.imul(ah4, bh7) | 0;
- lo = lo + Math.imul(al3, bl8) | 0;
- mid = mid + Math.imul(al3, bh8) | 0;
- mid = mid + Math.imul(ah3, bl8) | 0;
- hi = hi + Math.imul(ah3, bh8) | 0;
- lo = lo + Math.imul(al2, bl9) | 0;
- mid = mid + Math.imul(al2, bh9) | 0;
- mid = mid + Math.imul(ah2, bl9) | 0;
- hi = hi + Math.imul(ah2, bh9) | 0;
- var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0;
- w11 &= 67108863;
- lo = Math.imul(al9, bl3);
- mid = Math.imul(al9, bh3);
- mid = mid + Math.imul(ah9, bl3) | 0;
- hi = Math.imul(ah9, bh3);
- lo = lo + Math.imul(al8, bl4) | 0;
- mid = mid + Math.imul(al8, bh4) | 0;
- mid = mid + Math.imul(ah8, bl4) | 0;
- hi = hi + Math.imul(ah8, bh4) | 0;
- lo = lo + Math.imul(al7, bl5) | 0;
- mid = mid + Math.imul(al7, bh5) | 0;
- mid = mid + Math.imul(ah7, bl5) | 0;
- hi = hi + Math.imul(ah7, bh5) | 0;
- lo = lo + Math.imul(al6, bl6) | 0;
- mid = mid + Math.imul(al6, bh6) | 0;
- mid = mid + Math.imul(ah6, bl6) | 0;
- hi = hi + Math.imul(ah6, bh6) | 0;
- lo = lo + Math.imul(al5, bl7) | 0;
- mid = mid + Math.imul(al5, bh7) | 0;
- mid = mid + Math.imul(ah5, bl7) | 0;
- hi = hi + Math.imul(ah5, bh7) | 0;
- lo = lo + Math.imul(al4, bl8) | 0;
- mid = mid + Math.imul(al4, bh8) | 0;
- mid = mid + Math.imul(ah4, bl8) | 0;
- hi = hi + Math.imul(ah4, bh8) | 0;
- lo = lo + Math.imul(al3, bl9) | 0;
- mid = mid + Math.imul(al3, bh9) | 0;
- mid = mid + Math.imul(ah3, bl9) | 0;
- hi = hi + Math.imul(ah3, bh9) | 0;
- var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0;
- w12 &= 67108863;
- lo = Math.imul(al9, bl4);
- mid = Math.imul(al9, bh4);
- mid = mid + Math.imul(ah9, bl4) | 0;
- hi = Math.imul(ah9, bh4);
- lo = lo + Math.imul(al8, bl5) | 0;
- mid = mid + Math.imul(al8, bh5) | 0;
- mid = mid + Math.imul(ah8, bl5) | 0;
- hi = hi + Math.imul(ah8, bh5) | 0;
- lo = lo + Math.imul(al7, bl6) | 0;
- mid = mid + Math.imul(al7, bh6) | 0;
- mid = mid + Math.imul(ah7, bl6) | 0;
- hi = hi + Math.imul(ah7, bh6) | 0;
- lo = lo + Math.imul(al6, bl7) | 0;
- mid = mid + Math.imul(al6, bh7) | 0;
- mid = mid + Math.imul(ah6, bl7) | 0;
- hi = hi + Math.imul(ah6, bh7) | 0;
- lo = lo + Math.imul(al5, bl8) | 0;
- mid = mid + Math.imul(al5, bh8) | 0;
- mid = mid + Math.imul(ah5, bl8) | 0;
- hi = hi + Math.imul(ah5, bh8) | 0;
- lo = lo + Math.imul(al4, bl9) | 0;
- mid = mid + Math.imul(al4, bh9) | 0;
- mid = mid + Math.imul(ah4, bl9) | 0;
- hi = hi + Math.imul(ah4, bh9) | 0;
- var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0;
- w13 &= 67108863;
- lo = Math.imul(al9, bl5);
- mid = Math.imul(al9, bh5);
- mid = mid + Math.imul(ah9, bl5) | 0;
- hi = Math.imul(ah9, bh5);
- lo = lo + Math.imul(al8, bl6) | 0;
- mid = mid + Math.imul(al8, bh6) | 0;
- mid = mid + Math.imul(ah8, bl6) | 0;
- hi = hi + Math.imul(ah8, bh6) | 0;
- lo = lo + Math.imul(al7, bl7) | 0;
- mid = mid + Math.imul(al7, bh7) | 0;
- mid = mid + Math.imul(ah7, bl7) | 0;
- hi = hi + Math.imul(ah7, bh7) | 0;
- lo = lo + Math.imul(al6, bl8) | 0;
- mid = mid + Math.imul(al6, bh8) | 0;
- mid = mid + Math.imul(ah6, bl8) | 0;
- hi = hi + Math.imul(ah6, bh8) | 0;
- lo = lo + Math.imul(al5, bl9) | 0;
- mid = mid + Math.imul(al5, bh9) | 0;
- mid = mid + Math.imul(ah5, bl9) | 0;
- hi = hi + Math.imul(ah5, bh9) | 0;
- var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0;
- w14 &= 67108863;
- lo = Math.imul(al9, bl6);
- mid = Math.imul(al9, bh6);
- mid = mid + Math.imul(ah9, bl6) | 0;
- hi = Math.imul(ah9, bh6);
- lo = lo + Math.imul(al8, bl7) | 0;
- mid = mid + Math.imul(al8, bh7) | 0;
- mid = mid + Math.imul(ah8, bl7) | 0;
- hi = hi + Math.imul(ah8, bh7) | 0;
- lo = lo + Math.imul(al7, bl8) | 0;
- mid = mid + Math.imul(al7, bh8) | 0;
- mid = mid + Math.imul(ah7, bl8) | 0;
- hi = hi + Math.imul(ah7, bh8) | 0;
- lo = lo + Math.imul(al6, bl9) | 0;
- mid = mid + Math.imul(al6, bh9) | 0;
- mid = mid + Math.imul(ah6, bl9) | 0;
- hi = hi + Math.imul(ah6, bh9) | 0;
- var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0;
- w15 &= 67108863;
- lo = Math.imul(al9, bl7);
- mid = Math.imul(al9, bh7);
- mid = mid + Math.imul(ah9, bl7) | 0;
- hi = Math.imul(ah9, bh7);
- lo = lo + Math.imul(al8, bl8) | 0;
- mid = mid + Math.imul(al8, bh8) | 0;
- mid = mid + Math.imul(ah8, bl8) | 0;
- hi = hi + Math.imul(ah8, bh8) | 0;
- lo = lo + Math.imul(al7, bl9) | 0;
- mid = mid + Math.imul(al7, bh9) | 0;
- mid = mid + Math.imul(ah7, bl9) | 0;
- hi = hi + Math.imul(ah7, bh9) | 0;
- var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0;
- w16 &= 67108863;
- lo = Math.imul(al9, bl8);
- mid = Math.imul(al9, bh8);
- mid = mid + Math.imul(ah9, bl8) | 0;
- hi = Math.imul(ah9, bh8);
- lo = lo + Math.imul(al8, bl9) | 0;
- mid = mid + Math.imul(al8, bh9) | 0;
- mid = mid + Math.imul(ah8, bl9) | 0;
- hi = hi + Math.imul(ah8, bh9) | 0;
- var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0;
- w17 &= 67108863;
- lo = Math.imul(al9, bl9);
- mid = Math.imul(al9, bh9);
- mid = mid + Math.imul(ah9, bl9) | 0;
- hi = Math.imul(ah9, bh9);
- var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0;
- w18 &= 67108863;
- o[0] = w0;
- o[1] = w1;
- o[2] = w2;
- o[3] = w3;
- o[4] = w4;
- o[5] = w5;
- o[6] = w6;
- o[7] = w7;
- o[8] = w8;
- o[9] = w9;
- o[10] = w10;
- o[11] = w11;
- o[12] = w12;
- o[13] = w13;
- o[14] = w14;
- o[15] = w15;
- o[16] = w16;
- o[17] = w17;
- o[18] = w18;
- if (c !== 0) {
- o[19] = c;
- out.length++;
- }
- return out;
- };
- if (!Math.imul) {
- comb10MulTo = smallMulTo;
- }
- function bigMulTo(self2, num, out) {
- out.negative = num.negative ^ self2.negative;
- out.length = self2.length + num.length;
- var carry = 0;
- var hncarry = 0;
- for (var k = 0;k < out.length - 1; k++) {
- var ncarry = hncarry;
- hncarry = 0;
- var rword = carry & 67108863;
- var maxJ = Math.min(k, num.length - 1);
- for (var j = Math.max(0, k - self2.length + 1);j <= maxJ; j++) {
- var i = k - j;
- var a = self2.words[i] | 0;
- var b = num.words[j] | 0;
- var r = a * b;
- var lo = r & 67108863;
- ncarry = ncarry + (r / 67108864 | 0) | 0;
- lo = lo + rword | 0;
- rword = lo & 67108863;
- ncarry = ncarry + (lo >>> 26) | 0;
- hncarry += ncarry >>> 26;
- ncarry &= 67108863;
- }
- out.words[k] = rword;
- carry = ncarry;
- ncarry = hncarry;
- }
- if (carry !== 0) {
- out.words[k] = carry;
- } else {
- out.length--;
- }
- return out.strip();
- }
- function jumboMulTo(self2, num, out) {
- var fftm = new FFTM;
- return fftm.mulp(self2, num, out);
- }
- BN.prototype.mulTo = function mulTo(num, out) {
- var res;
- var len = this.length + num.length;
- if (this.length === 10 && num.length === 10) {
- res = comb10MulTo(this, num, out);
- } else if (len < 63) {
- res = smallMulTo(this, num, out);
- } else if (len < 1024) {
- res = bigMulTo(this, num, out);
- } else {
- res = jumboMulTo(this, num, out);
- }
- return res;
- };
- function FFTM(x, y) {
- this.x = x;
- this.y = y;
- }
- FFTM.prototype.makeRBT = function makeRBT(N) {
- var t = new Array(N);
- var l = BN.prototype._countBits(N) - 1;
- for (var i = 0;i < N; i++) {
- t[i] = this.revBin(i, l, N);
- }
- return t;
- };
- FFTM.prototype.revBin = function revBin(x, l, N) {
- if (x === 0 || x === N - 1)
- return x;
- var rb = 0;
- for (var i = 0;i < l; i++) {
- rb |= (x & 1) << l - i - 1;
- x >>= 1;
- }
- return rb;
- };
- FFTM.prototype.permute = function permute(rbt, rws, iws, rtws, itws, N) {
- for (var i = 0;i < N; i++) {
- rtws[i] = rws[rbt[i]];
- itws[i] = iws[rbt[i]];
- }
- };
- FFTM.prototype.transform = function transform(rws, iws, rtws, itws, N, rbt) {
- this.permute(rbt, rws, iws, rtws, itws, N);
- for (var s = 1;s < N; s <<= 1) {
- var l = s << 1;
- var rtwdf = Math.cos(2 * Math.PI / l);
- var itwdf = Math.sin(2 * Math.PI / l);
- for (var p = 0;p < N; p += l) {
- var rtwdf_ = rtwdf;
- var itwdf_ = itwdf;
- for (var j = 0;j < s; j++) {
- var re = rtws[p + j];
- var ie = itws[p + j];
- var ro = rtws[p + j + s];
- var io = itws[p + j + s];
- var rx = rtwdf_ * ro - itwdf_ * io;
- io = rtwdf_ * io + itwdf_ * ro;
- ro = rx;
- rtws[p + j] = re + ro;
- itws[p + j] = ie + io;
- rtws[p + j + s] = re - ro;
- itws[p + j + s] = ie - io;
- if (j !== l) {
- rx = rtwdf * rtwdf_ - itwdf * itwdf_;
- itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;
- rtwdf_ = rx;
- }
- }
- }
- }
- };
- FFTM.prototype.guessLen13b = function guessLen13b(n, m) {
- var N = Math.max(m, n) | 1;
- var odd = N & 1;
- var i = 0;
- for (N = N / 2 | 0;N; N = N >>> 1) {
- i++;
- }
- return 1 << i + 1 + odd;
- };
- FFTM.prototype.conjugate = function conjugate(rws, iws, N) {
- if (N <= 1)
- return;
- for (var i = 0;i < N / 2; i++) {
- var t = rws[i];
- rws[i] = rws[N - i - 1];
- rws[N - i - 1] = t;
- t = iws[i];
- iws[i] = -iws[N - i - 1];
- iws[N - i - 1] = -t;
- }
- };
- FFTM.prototype.normalize13b = function normalize13b(ws, N) {
- var carry = 0;
- for (var i = 0;i < N / 2; i++) {
- var w = Math.round(ws[2 * i + 1] / N) * 8192 + Math.round(ws[2 * i] / N) + carry;
- ws[i] = w & 67108863;
- if (w < 67108864) {
- carry = 0;
- } else {
- carry = w / 67108864 | 0;
- }
- }
- return ws;
- };
- FFTM.prototype.convert13b = function convert13b(ws, len, rws, N) {
- var carry = 0;
- for (var i = 0;i < len; i++) {
- carry = carry + (ws[i] | 0);
- rws[2 * i] = carry & 8191;
- carry = carry >>> 13;
- rws[2 * i + 1] = carry & 8191;
- carry = carry >>> 13;
- }
- for (i = 2 * len;i < N; ++i) {
- rws[i] = 0;
- }
- assert(carry === 0);
- assert((carry & ~8191) === 0);
- };
- FFTM.prototype.stub = function stub(N) {
- var ph = new Array(N);
- for (var i = 0;i < N; i++) {
- ph[i] = 0;
- }
- return ph;
- };
- FFTM.prototype.mulp = function mulp(x, y, out) {
- var N = 2 * this.guessLen13b(x.length, y.length);
- var rbt = this.makeRBT(N);
- var _ = this.stub(N);
- var rws = new Array(N);
- var rwst = new Array(N);
- var iwst = new Array(N);
- var nrws = new Array(N);
- var nrwst = new Array(N);
- var niwst = new Array(N);
- var rmws = out.words;
- rmws.length = N;
- this.convert13b(x.words, x.length, rws, N);
- this.convert13b(y.words, y.length, nrws, N);
- this.transform(rws, _, rwst, iwst, N, rbt);
- this.transform(nrws, _, nrwst, niwst, N, rbt);
- for (var i = 0;i < N; i++) {
- var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];
- iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];
- rwst[i] = rx;
- }
- this.conjugate(rwst, iwst, N);
- this.transform(rwst, iwst, rmws, _, N, rbt);
- this.conjugate(rmws, _, N);
- this.normalize13b(rmws, N);
- out.negative = x.negative ^ y.negative;
- out.length = x.length + y.length;
- return out.strip();
- };
- BN.prototype.mul = function mul(num) {
- var out = new BN(null);
- out.words = new Array(this.length + num.length);
- return this.mulTo(num, out);
- };
- BN.prototype.mulf = function mulf(num) {
- var out = new BN(null);
- out.words = new Array(this.length + num.length);
- return jumboMulTo(this, num, out);
- };
- BN.prototype.imul = function imul(num) {
- return this.clone().mulTo(num, this);
- };
- BN.prototype.imuln = function imuln(num) {
- assert(typeof num === "number");
- assert(num < 67108864);
- var carry = 0;
- for (var i = 0;i < this.length; i++) {
- var w = (this.words[i] | 0) * num;
- var lo = (w & 67108863) + (carry & 67108863);
- carry >>= 26;
- carry += w / 67108864 | 0;
- carry += lo >>> 26;
- this.words[i] = lo & 67108863;
- }
- if (carry !== 0) {
- this.words[i] = carry;
- this.length++;
- }
- this.length = num === 0 ? 1 : this.length;
- return this;
- };
- BN.prototype.muln = function muln(num) {
- return this.clone().imuln(num);
- };
- BN.prototype.sqr = function sqr() {
- return this.mul(this);
- };
- BN.prototype.isqr = function isqr() {
- return this.imul(this.clone());
- };
- BN.prototype.pow = function pow(num) {
- var w = toBitArray(num);
- if (w.length === 0)
- return new BN(1);
- var res = this;
- for (var i = 0;i < w.length; i++, res = res.sqr()) {
- if (w[i] !== 0)
- break;
- }
- if (++i < w.length) {
- for (var q = res.sqr();i < w.length; i++, q = q.sqr()) {
- if (w[i] === 0)
- continue;
- res = res.mul(q);
- }
- }
- return res;
- };
- BN.prototype.iushln = function iushln(bits) {
- assert(typeof bits === "number" && bits >= 0);
- var r = bits % 26;
- var s = (bits - r) / 26;
- var carryMask = 67108863 >>> 26 - r << 26 - r;
- var i;
- if (r !== 0) {
- var carry = 0;
- for (i = 0;i < this.length; i++) {
- var newCarry = this.words[i] & carryMask;
- var c = (this.words[i] | 0) - newCarry << r;
- this.words[i] = c | carry;
- carry = newCarry >>> 26 - r;
- }
- if (carry) {
- this.words[i] = carry;
- this.length++;
- }
- }
- if (s !== 0) {
- for (i = this.length - 1;i >= 0; i--) {
- this.words[i + s] = this.words[i];
- }
- for (i = 0;i < s; i++) {
- this.words[i] = 0;
- }
- this.length += s;
- }
- return this.strip();
- };
- BN.prototype.ishln = function ishln(bits) {
- assert(this.negative === 0);
- return this.iushln(bits);
- };
- BN.prototype.iushrn = function iushrn(bits, hint, extended) {
- assert(typeof bits === "number" && bits >= 0);
- var h;
- if (hint) {
- h = (hint - hint % 26) / 26;
- } else {
- h = 0;
- }
- var r = bits % 26;
- var s = Math.min((bits - r) / 26, this.length);
- var mask = 67108863 ^ 67108863 >>> r << r;
- var maskedWords = extended;
- h -= s;
- h = Math.max(0, h);
- if (maskedWords) {
- for (var i = 0;i < s; i++) {
- maskedWords.words[i] = this.words[i];
- }
- maskedWords.length = s;
- }
- if (s === 0) {} else if (this.length > s) {
- this.length -= s;
- for (i = 0;i < this.length; i++) {
- this.words[i] = this.words[i + s];
- }
- } else {
- this.words[0] = 0;
- this.length = 1;
- }
- var carry = 0;
- for (i = this.length - 1;i >= 0 && (carry !== 0 || i >= h); i--) {
- var word = this.words[i] | 0;
- this.words[i] = carry << 26 - r | word >>> r;
- carry = word & mask;
- }
- if (maskedWords && carry !== 0) {
- maskedWords.words[maskedWords.length++] = carry;
- }
- if (this.length === 0) {
- this.words[0] = 0;
- this.length = 1;
- }
- return this.strip();
- };
- BN.prototype.ishrn = function ishrn(bits, hint, extended) {
- assert(this.negative === 0);
- return this.iushrn(bits, hint, extended);
- };
- BN.prototype.shln = function shln(bits) {
- return this.clone().ishln(bits);
- };
- BN.prototype.ushln = function ushln(bits) {
- return this.clone().iushln(bits);
- };
- BN.prototype.shrn = function shrn(bits) {
- return this.clone().ishrn(bits);
- };
- BN.prototype.ushrn = function ushrn(bits) {
- return this.clone().iushrn(bits);
- };
- BN.prototype.testn = function testn(bit) {
- assert(typeof bit === "number" && bit >= 0);
- var r = bit % 26;
- var s = (bit - r) / 26;
- var q = 1 << r;
- if (this.length <= s)
- return false;
- var w = this.words[s];
- return !!(w & q);
- };
- BN.prototype.imaskn = function imaskn(bits) {
- assert(typeof bits === "number" && bits >= 0);
- var r = bits % 26;
- var s = (bits - r) / 26;
- assert(this.negative === 0, "imaskn works only with positive numbers");
- if (this.length <= s) {
- return this;
- }
- if (r !== 0) {
- s++;
- }
- this.length = Math.min(s, this.length);
- if (r !== 0) {
- var mask = 67108863 ^ 67108863 >>> r << r;
- this.words[this.length - 1] &= mask;
- }
- return this.strip();
- };
- BN.prototype.maskn = function maskn(bits) {
- return this.clone().imaskn(bits);
- };
- BN.prototype.iaddn = function iaddn(num) {
- assert(typeof num === "number");
- assert(num < 67108864);
- if (num < 0)
- return this.isubn(-num);
- if (this.negative !== 0) {
- if (this.length === 1 && (this.words[0] | 0) < num) {
- this.words[0] = num - (this.words[0] | 0);
- this.negative = 0;
- return this;
- }
- this.negative = 0;
- this.isubn(num);
- this.negative = 1;
- return this;
- }
- return this._iaddn(num);
- };
- BN.prototype._iaddn = function _iaddn(num) {
- this.words[0] += num;
- for (var i = 0;i < this.length && this.words[i] >= 67108864; i++) {
- this.words[i] -= 67108864;
- if (i === this.length - 1) {
- this.words[i + 1] = 1;
- } else {
- this.words[i + 1]++;
- }
- }
- this.length = Math.max(this.length, i + 1);
- return this;
- };
- BN.prototype.isubn = function isubn(num) {
- assert(typeof num === "number");
- assert(num < 67108864);
- if (num < 0)
- return this.iaddn(-num);
- if (this.negative !== 0) {
- this.negative = 0;
- this.iaddn(num);
- this.negative = 1;
- return this;
- }
- this.words[0] -= num;
- if (this.length === 1 && this.words[0] < 0) {
- this.words[0] = -this.words[0];
- this.negative = 1;
- } else {
- for (var i = 0;i < this.length && this.words[i] < 0; i++) {
- this.words[i] += 67108864;
- this.words[i + 1] -= 1;
- }
- }
- return this.strip();
- };
- BN.prototype.addn = function addn(num) {
- return this.clone().iaddn(num);
- };
- BN.prototype.subn = function subn(num) {
- return this.clone().isubn(num);
- };
- BN.prototype.iabs = function iabs() {
- this.negative = 0;
- return this;
- };
- BN.prototype.abs = function abs() {
- return this.clone().iabs();
- };
- BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) {
- var len = num.length + shift;
- var i;
- this._expand(len);
- var w;
- var carry = 0;
- for (i = 0;i < num.length; i++) {
- w = (this.words[i + shift] | 0) + carry;
- var right = (num.words[i] | 0) * mul;
- w -= right & 67108863;
- carry = (w >> 26) - (right / 67108864 | 0);
- this.words[i + shift] = w & 67108863;
- }
- for (;i < this.length - shift; i++) {
- w = (this.words[i + shift] | 0) + carry;
- carry = w >> 26;
- this.words[i + shift] = w & 67108863;
- }
- if (carry === 0)
- return this.strip();
- assert(carry === -1);
- carry = 0;
- for (i = 0;i < this.length; i++) {
- w = -(this.words[i] | 0) + carry;
- carry = w >> 26;
- this.words[i] = w & 67108863;
- }
- this.negative = 1;
- return this.strip();
- };
- BN.prototype._wordDiv = function _wordDiv(num, mode) {
- var shift = this.length - num.length;
- var a = this.clone();
- var b = num;
- var bhi = b.words[b.length - 1] | 0;
- var bhiBits = this._countBits(bhi);
- shift = 26 - bhiBits;
- if (shift !== 0) {
- b = b.ushln(shift);
- a.iushln(shift);
- bhi = b.words[b.length - 1] | 0;
- }
- var m = a.length - b.length;
- var q;
- if (mode !== "mod") {
- q = new BN(null);
- q.length = m + 1;
- q.words = new Array(q.length);
- for (var i = 0;i < q.length; i++) {
- q.words[i] = 0;
- }
- }
- var diff = a.clone()._ishlnsubmul(b, 1, m);
- if (diff.negative === 0) {
- a = diff;
- if (q) {
- q.words[m] = 1;
- }
- }
- for (var j = m - 1;j >= 0; j--) {
- var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0);
- qj = Math.min(qj / bhi | 0, 67108863);
- a._ishlnsubmul(b, qj, j);
- while (a.negative !== 0) {
- qj--;
- a.negative = 0;
- a._ishlnsubmul(b, 1, j);
- if (!a.isZero()) {
- a.negative ^= 1;
- }
- }
- if (q) {
- q.words[j] = qj;
- }
- }
- if (q) {
- q.strip();
- }
- a.strip();
- if (mode !== "div" && shift !== 0) {
- a.iushrn(shift);
- }
- return {
- div: q || null,
- mod: a
- };
- };
- BN.prototype.divmod = function divmod(num, mode, positive) {
- assert(!num.isZero());
- if (this.isZero()) {
- return {
- div: new BN(0),
- mod: new BN(0)
- };
- }
- var div, mod, res;
- if (this.negative !== 0 && num.negative === 0) {
- res = this.neg().divmod(num, mode);
- if (mode !== "mod") {
- div = res.div.neg();
- }
- if (mode !== "div") {
- mod = res.mod.neg();
- if (positive && mod.negative !== 0) {
- mod.iadd(num);
- }
- }
- return {
- div,
- mod
- };
- }
- if (this.negative === 0 && num.negative !== 0) {
- res = this.divmod(num.neg(), mode);
- if (mode !== "mod") {
- div = res.div.neg();
- }
- return {
- div,
- mod: res.mod
- };
- }
- if ((this.negative & num.negative) !== 0) {
- res = this.neg().divmod(num.neg(), mode);
- if (mode !== "div") {
- mod = res.mod.neg();
- if (positive && mod.negative !== 0) {
- mod.isub(num);
- }
- }
- return {
- div: res.div,
- mod
- };
- }
- if (num.length > this.length || this.cmp(num) < 0) {
- return {
- div: new BN(0),
- mod: this
- };
- }
- if (num.length === 1) {
- if (mode === "div") {
- return {
- div: this.divn(num.words[0]),
- mod: null
- };
- }
- if (mode === "mod") {
- return {
- div: null,
- mod: new BN(this.modn(num.words[0]))
- };
- }
- return {
- div: this.divn(num.words[0]),
- mod: new BN(this.modn(num.words[0]))
- };
- }
- return this._wordDiv(num, mode);
- };
- BN.prototype.div = function div(num) {
- return this.divmod(num, "div", false).div;
- };
- BN.prototype.mod = function mod(num) {
- return this.divmod(num, "mod", false).mod;
- };
- BN.prototype.umod = function umod(num) {
- return this.divmod(num, "mod", true).mod;
- };
- BN.prototype.divRound = function divRound(num) {
- var dm = this.divmod(num);
- if (dm.mod.isZero())
- return dm.div;
- var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;
- var half = num.ushrn(1);
- var r2 = num.andln(1);
- var cmp = mod.cmp(half);
- if (cmp < 0 || r2 === 1 && cmp === 0)
- return dm.div;
- return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
- };
- BN.prototype.modn = function modn(num) {
- assert(num <= 67108863);
- var p = (1 << 26) % num;
- var acc = 0;
- for (var i = this.length - 1;i >= 0; i--) {
- acc = (p * acc + (this.words[i] | 0)) % num;
- }
- return acc;
- };
- BN.prototype.idivn = function idivn(num) {
- assert(num <= 67108863);
- var carry = 0;
- for (var i = this.length - 1;i >= 0; i--) {
- var w = (this.words[i] | 0) + carry * 67108864;
- this.words[i] = w / num | 0;
- carry = w % num;
- }
- return this.strip();
- };
- BN.prototype.divn = function divn(num) {
- return this.clone().idivn(num);
- };
- BN.prototype.egcd = function egcd(p) {
- assert(p.negative === 0);
- assert(!p.isZero());
- var x = this;
- var y = p.clone();
- if (x.negative !== 0) {
- x = x.umod(p);
- } else {
- x = x.clone();
- }
- var A = new BN(1);
- var B = new BN(0);
- var C = new BN(0);
- var D = new BN(1);
- var g = 0;
- while (x.isEven() && y.isEven()) {
- x.iushrn(1);
- y.iushrn(1);
- ++g;
- }
- var yp = y.clone();
- var xp = x.clone();
- while (!x.isZero()) {
- for (var i = 0, im = 1;(x.words[0] & im) === 0 && i < 26; ++i, im <<= 1)
- ;
- if (i > 0) {
- x.iushrn(i);
- while (i-- > 0) {
- if (A.isOdd() || B.isOdd()) {
- A.iadd(yp);
- B.isub(xp);
- }
- A.iushrn(1);
- B.iushrn(1);
- }
- }
- for (var j = 0, jm = 1;(y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1)
- ;
- if (j > 0) {
- y.iushrn(j);
- while (j-- > 0) {
- if (C.isOdd() || D.isOdd()) {
- C.iadd(yp);
- D.isub(xp);
- }
- C.iushrn(1);
- D.iushrn(1);
- }
- }
- if (x.cmp(y) >= 0) {
- x.isub(y);
- A.isub(C);
- B.isub(D);
- } else {
- y.isub(x);
- C.isub(A);
- D.isub(B);
- }
- }
- return {
- a: C,
- b: D,
- gcd: y.iushln(g)
- };
- };
- BN.prototype._invmp = function _invmp(p) {
- assert(p.negative === 0);
- assert(!p.isZero());
- var a = this;
- var b = p.clone();
- if (a.negative !== 0) {
- a = a.umod(p);
- } else {
- a = a.clone();
- }
- var x1 = new BN(1);
- var x2 = new BN(0);
- var delta = b.clone();
- while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
- for (var i = 0, im = 1;(a.words[0] & im) === 0 && i < 26; ++i, im <<= 1)
- ;
- if (i > 0) {
- a.iushrn(i);
- while (i-- > 0) {
- if (x1.isOdd()) {
- x1.iadd(delta);
- }
- x1.iushrn(1);
- }
- }
- for (var j = 0, jm = 1;(b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1)
- ;
- if (j > 0) {
- b.iushrn(j);
- while (j-- > 0) {
- if (x2.isOdd()) {
- x2.iadd(delta);
- }
- x2.iushrn(1);
- }
- }
- if (a.cmp(b) >= 0) {
- a.isub(b);
- x1.isub(x2);
- } else {
- b.isub(a);
- x2.isub(x1);
- }
- }
- var res;
- if (a.cmpn(1) === 0) {
- res = x1;
- } else {
- res = x2;
- }
- if (res.cmpn(0) < 0) {
- res.iadd(p);
- }
- return res;
- };
- BN.prototype.gcd = function gcd(num) {
- if (this.isZero())
- return num.abs();
- if (num.isZero())
- return this.abs();
- var a = this.clone();
- var b = num.clone();
- a.negative = 0;
- b.negative = 0;
- for (var shift = 0;a.isEven() && b.isEven(); shift++) {
- a.iushrn(1);
- b.iushrn(1);
- }
- do {
- while (a.isEven()) {
- a.iushrn(1);
- }
- while (b.isEven()) {
- b.iushrn(1);
- }
- var r = a.cmp(b);
- if (r < 0) {
- var t = a;
- a = b;
- b = t;
- } else if (r === 0 || b.cmpn(1) === 0) {
- break;
- }
- a.isub(b);
- } while (true);
- return b.iushln(shift);
- };
- BN.prototype.invm = function invm(num) {
- return this.egcd(num).a.umod(num);
- };
- BN.prototype.isEven = function isEven() {
- return (this.words[0] & 1) === 0;
- };
- BN.prototype.isOdd = function isOdd() {
- return (this.words[0] & 1) === 1;
- };
- BN.prototype.andln = function andln(num) {
- return this.words[0] & num;
- };
- BN.prototype.bincn = function bincn(bit) {
- assert(typeof bit === "number");
- var r = bit % 26;
- var s = (bit - r) / 26;
- var q = 1 << r;
- if (this.length <= s) {
- this._expand(s + 1);
- this.words[s] |= q;
- return this;
- }
- var carry = q;
- for (var i = s;carry !== 0 && i < this.length; i++) {
- var w = this.words[i] | 0;
- w += carry;
- carry = w >>> 26;
- w &= 67108863;
- this.words[i] = w;
- }
- if (carry !== 0) {
- this.words[i] = carry;
- this.length++;
- }
- return this;
- };
- BN.prototype.isZero = function isZero() {
- return this.length === 1 && this.words[0] === 0;
- };
- BN.prototype.cmpn = function cmpn(num) {
- var negative = num < 0;
- if (this.negative !== 0 && !negative)
- return -1;
- if (this.negative === 0 && negative)
- return 1;
- this.strip();
- var res;
- if (this.length > 1) {
- res = 1;
- } else {
- if (negative) {
- num = -num;
- }
- assert(num <= 67108863, "Number is too big");
- var w = this.words[0] | 0;
- res = w === num ? 0 : w < num ? -1 : 1;
- }
- if (this.negative !== 0)
- return -res | 0;
- return res;
- };
- BN.prototype.cmp = function cmp(num) {
- if (this.negative !== 0 && num.negative === 0)
- return -1;
- if (this.negative === 0 && num.negative !== 0)
- return 1;
- var res = this.ucmp(num);
- if (this.negative !== 0)
- return -res | 0;
- return res;
- };
- BN.prototype.ucmp = function ucmp(num) {
- if (this.length > num.length)
- return 1;
- if (this.length < num.length)
- return -1;
- var res = 0;
- for (var i = this.length - 1;i >= 0; i--) {
- var a = this.words[i] | 0;
- var b = num.words[i] | 0;
- if (a === b)
- continue;
- if (a < b) {
- res = -1;
- } else if (a > b) {
- res = 1;
- }
- break;
- }
- return res;
- };
- BN.prototype.gtn = function gtn(num) {
- return this.cmpn(num) === 1;
- };
- BN.prototype.gt = function gt(num) {
- return this.cmp(num) === 1;
- };
- BN.prototype.gten = function gten(num) {
- return this.cmpn(num) >= 0;
- };
- BN.prototype.gte = function gte(num) {
- return this.cmp(num) >= 0;
- };
- BN.prototype.ltn = function ltn(num) {
- return this.cmpn(num) === -1;
- };
- BN.prototype.lt = function lt(num) {
- return this.cmp(num) === -1;
- };
- BN.prototype.lten = function lten(num) {
- return this.cmpn(num) <= 0;
- };
- BN.prototype.lte = function lte(num) {
- return this.cmp(num) <= 0;
- };
- BN.prototype.eqn = function eqn(num) {
- return this.cmpn(num) === 0;
- };
- BN.prototype.eq = function eq(num) {
- return this.cmp(num) === 0;
- };
- BN.red = function red(num) {
- return new Red(num);
- };
- BN.prototype.toRed = function toRed(ctx) {
- assert(!this.red, "Already a number in reduction context");
- assert(this.negative === 0, "red works only with positives");
- return ctx.convertTo(this)._forceRed(ctx);
- };
- BN.prototype.fromRed = function fromRed() {
- assert(this.red, "fromRed works only with numbers in reduction context");
- return this.red.convertFrom(this);
- };
- BN.prototype._forceRed = function _forceRed(ctx) {
- this.red = ctx;
- return this;
- };
- BN.prototype.forceRed = function forceRed(ctx) {
- assert(!this.red, "Already a number in reduction context");
- return this._forceRed(ctx);
- };
- BN.prototype.redAdd = function redAdd(num) {
- assert(this.red, "redAdd works only with red numbers");
- return this.red.add(this, num);
- };
- BN.prototype.redIAdd = function redIAdd(num) {
- assert(this.red, "redIAdd works only with red numbers");
- return this.red.iadd(this, num);
- };
- BN.prototype.redSub = function redSub(num) {
- assert(this.red, "redSub works only with red numbers");
- return this.red.sub(this, num);
- };
- BN.prototype.redISub = function redISub(num) {
- assert(this.red, "redISub works only with red numbers");
- return this.red.isub(this, num);
- };
- BN.prototype.redShl = function redShl(num) {
- assert(this.red, "redShl works only with red numbers");
- return this.red.shl(this, num);
- };
- BN.prototype.redMul = function redMul(num) {
- assert(this.red, "redMul works only with red numbers");
- this.red._verify2(this, num);
- return this.red.mul(this, num);
- };
- BN.prototype.redIMul = function redIMul(num) {
- assert(this.red, "redMul works only with red numbers");
- this.red._verify2(this, num);
- return this.red.imul(this, num);
- };
- BN.prototype.redSqr = function redSqr() {
- assert(this.red, "redSqr works only with red numbers");
- this.red._verify1(this);
- return this.red.sqr(this);
- };
- BN.prototype.redISqr = function redISqr() {
- assert(this.red, "redISqr works only with red numbers");
- this.red._verify1(this);
- return this.red.isqr(this);
- };
- BN.prototype.redSqrt = function redSqrt() {
- assert(this.red, "redSqrt works only with red numbers");
- this.red._verify1(this);
- return this.red.sqrt(this);
- };
- BN.prototype.redInvm = function redInvm() {
- assert(this.red, "redInvm works only with red numbers");
- this.red._verify1(this);
- return this.red.invm(this);
- };
- BN.prototype.redNeg = function redNeg() {
- assert(this.red, "redNeg works only with red numbers");
- this.red._verify1(this);
- return this.red.neg(this);
- };
- BN.prototype.redPow = function redPow(num) {
- assert(this.red && !num.red, "redPow(normalNum)");
- this.red._verify1(this);
- return this.red.pow(this, num);
- };
- var primes = {
- k256: null,
- p224: null,
- p192: null,
- p25519: null
- };
- function MPrime(name, p) {
- this.name = name;
- this.p = new BN(p, 16);
- this.n = this.p.bitLength();
- this.k = new BN(1).iushln(this.n).isub(this.p);
- this.tmp = this._tmp();
- }
- MPrime.prototype._tmp = function _tmp() {
- var tmp = new BN(null);
- tmp.words = new Array(Math.ceil(this.n / 13));
- return tmp;
- };
- MPrime.prototype.ireduce = function ireduce(num) {
- var r = num;
- var rlen;
- do {
- this.split(r, this.tmp);
- r = this.imulK(r);
- r = r.iadd(this.tmp);
- rlen = r.bitLength();
- } while (rlen > this.n);
- var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
- if (cmp === 0) {
- r.words[0] = 0;
- r.length = 1;
- } else if (cmp > 0) {
- r.isub(this.p);
- } else {
- if (r.strip !== undefined) {
- r.strip();
- } else {
- r._strip();
- }
- }
- return r;
- };
- MPrime.prototype.split = function split(input, out) {
- input.iushrn(this.n, 0, out);
- };
- MPrime.prototype.imulK = function imulK(num) {
- return num.imul(this.k);
- };
- function K256() {
- MPrime.call(this, "k256", "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f");
- }
- inherits(K256, MPrime);
- K256.prototype.split = function split(input, output) {
- var mask = 4194303;
- var outLen = Math.min(input.length, 9);
- for (var i = 0;i < outLen; i++) {
- output.words[i] = input.words[i];
- }
- output.length = outLen;
- if (input.length <= 9) {
- input.words[0] = 0;
- input.length = 1;
- return;
- }
- var prev = input.words[9];
- output.words[output.length++] = prev & mask;
- for (i = 10;i < input.length; i++) {
- var next = input.words[i] | 0;
- input.words[i - 10] = (next & mask) << 4 | prev >>> 22;
- prev = next;
- }
- prev >>>= 22;
- input.words[i - 10] = prev;
- if (prev === 0 && input.length > 10) {
- input.length -= 10;
- } else {
- input.length -= 9;
- }
- };
- K256.prototype.imulK = function imulK(num) {
- num.words[num.length] = 0;
- num.words[num.length + 1] = 0;
- num.length += 2;
- var lo = 0;
- for (var i = 0;i < num.length; i++) {
- var w = num.words[i] | 0;
- lo += w * 977;
- num.words[i] = lo & 67108863;
- lo = w * 64 + (lo / 67108864 | 0);
- }
- if (num.words[num.length - 1] === 0) {
- num.length--;
- if (num.words[num.length - 1] === 0) {
- num.length--;
- }
- }
- return num;
- };
- function P224() {
- MPrime.call(this, "p224", "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001");
- }
- inherits(P224, MPrime);
- function P192() {
- MPrime.call(this, "p192", "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff");
- }
- inherits(P192, MPrime);
- function P25519() {
- MPrime.call(this, "25519", "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed");
- }
- inherits(P25519, MPrime);
- P25519.prototype.imulK = function imulK(num) {
- var carry = 0;
- for (var i = 0;i < num.length; i++) {
- var hi = (num.words[i] | 0) * 19 + carry;
- var lo = hi & 67108863;
- hi >>>= 26;
- num.words[i] = lo;
- carry = hi;
- }
- if (carry !== 0) {
- num.words[num.length++] = carry;
- }
- return num;
- };
- BN._prime = function prime(name) {
- if (primes[name])
- return primes[name];
- var prime;
- if (name === "k256") {
- prime = new K256;
- } else if (name === "p224") {
- prime = new P224;
- } else if (name === "p192") {
- prime = new P192;
- } else if (name === "p25519") {
- prime = new P25519;
- } else {
- throw new Error("Unknown prime " + name);
- }
- primes[name] = prime;
- return prime;
- };
- function Red(m) {
- if (typeof m === "string") {
- var prime = BN._prime(m);
- this.m = prime.p;
- this.prime = prime;
- } else {
- assert(m.gtn(1), "modulus must be greater than 1");
- this.m = m;
- this.prime = null;
- }
- }
- Red.prototype._verify1 = function _verify1(a) {
- assert(a.negative === 0, "red works only with positives");
- assert(a.red, "red works only with red numbers");
- };
- Red.prototype._verify2 = function _verify2(a, b) {
- assert((a.negative | b.negative) === 0, "red works only with positives");
- assert(a.red && a.red === b.red, "red works only with red numbers");
- };
- Red.prototype.imod = function imod(a) {
- if (this.prime)
- return this.prime.ireduce(a)._forceRed(this);
- return a.umod(this.m)._forceRed(this);
- };
- Red.prototype.neg = function neg(a) {
- if (a.isZero()) {
- return a.clone();
- }
- return this.m.sub(a)._forceRed(this);
- };
- Red.prototype.add = function add(a, b) {
- this._verify2(a, b);
- var res = a.add(b);
- if (res.cmp(this.m) >= 0) {
- res.isub(this.m);
- }
- return res._forceRed(this);
- };
- Red.prototype.iadd = function iadd(a, b) {
- this._verify2(a, b);
- var res = a.iadd(b);
- if (res.cmp(this.m) >= 0) {
- res.isub(this.m);
- }
- return res;
- };
- Red.prototype.sub = function sub(a, b) {
- this._verify2(a, b);
- var res = a.sub(b);
- if (res.cmpn(0) < 0) {
- res.iadd(this.m);
- }
- return res._forceRed(this);
- };
- Red.prototype.isub = function isub(a, b) {
- this._verify2(a, b);
- var res = a.isub(b);
- if (res.cmpn(0) < 0) {
- res.iadd(this.m);
- }
- return res;
- };
- Red.prototype.shl = function shl(a, num) {
- this._verify1(a);
- return this.imod(a.ushln(num));
- };
- Red.prototype.imul = function imul(a, b) {
- this._verify2(a, b);
- return this.imod(a.imul(b));
- };
- Red.prototype.mul = function mul(a, b) {
- this._verify2(a, b);
- return this.imod(a.mul(b));
- };
- Red.prototype.isqr = function isqr(a) {
- return this.imul(a, a.clone());
- };
- Red.prototype.sqr = function sqr(a) {
- return this.mul(a, a);
- };
- Red.prototype.sqrt = function sqrt(a) {
- if (a.isZero())
- return a.clone();
- var mod3 = this.m.andln(3);
- assert(mod3 % 2 === 1);
- if (mod3 === 3) {
- var pow = this.m.add(new BN(1)).iushrn(2);
- return this.pow(a, pow);
- }
- var q = this.m.subn(1);
- var s = 0;
- while (!q.isZero() && q.andln(1) === 0) {
- s++;
- q.iushrn(1);
- }
- assert(!q.isZero());
- var one = new BN(1).toRed(this);
- var nOne = one.redNeg();
- var lpow = this.m.subn(1).iushrn(1);
- var z = this.m.bitLength();
- z = new BN(2 * z * z).toRed(this);
- while (this.pow(z, lpow).cmp(nOne) !== 0) {
- z.redIAdd(nOne);
- }
- var c = this.pow(z, q);
- var r = this.pow(a, q.addn(1).iushrn(1));
- var t = this.pow(a, q);
- var m = s;
- while (t.cmp(one) !== 0) {
- var tmp = t;
- for (var i = 0;tmp.cmp(one) !== 0; i++) {
- tmp = tmp.redSqr();
- }
- assert(i < m);
- var b = this.pow(c, new BN(1).iushln(m - i - 1));
- r = r.redMul(b);
- c = b.redSqr();
- t = t.redMul(c);
- m = i;
- }
- return r;
- };
- Red.prototype.invm = function invm(a) {
- var inv = a._invmp(this.m);
- if (inv.negative !== 0) {
- inv.negative = 0;
- return this.imod(inv).redNeg();
- } else {
- return this.imod(inv);
- }
- };
- Red.prototype.pow = function pow(a, num) {
- if (num.isZero())
- return new BN(1).toRed(this);
- if (num.cmpn(1) === 0)
- return a.clone();
- var windowSize = 4;
- var wnd = new Array(1 << windowSize);
- wnd[0] = new BN(1).toRed(this);
- wnd[1] = a;
- for (var i = 2;i < wnd.length; i++) {
- wnd[i] = this.mul(wnd[i - 1], a);
- }
- var res = wnd[0];
- var current = 0;
- var currentLen = 0;
- var start = num.bitLength() % 26;
- if (start === 0) {
- start = 26;
- }
- for (i = num.length - 1;i >= 0; i--) {
- var word = num.words[i];
- for (var j = start - 1;j >= 0; j--) {
- var bit = word >> j & 1;
- if (res !== wnd[0]) {
- res = this.sqr(res);
- }
- if (bit === 0 && current === 0) {
- currentLen = 0;
- continue;
- }
- current <<= 1;
- current |= bit;
- currentLen++;
- if (currentLen !== windowSize && (i !== 0 || j !== 0))
- continue;
- res = this.mul(res, wnd[current]);
- currentLen = 0;
- current = 0;
- }
- start = 26;
- }
- return res;
- };
- Red.prototype.convertTo = function convertTo(num) {
- var r = num.umod(this.m);
- return r === num ? r.clone() : r;
- };
- Red.prototype.convertFrom = function convertFrom(num) {
- var res = num.clone();
- res.red = null;
- return res;
- };
- BN.mont = function mont(num) {
- return new Mont(num);
- };
- function Mont(m) {
- Red.call(this, m);
- this.shift = this.m.bitLength();
- if (this.shift % 26 !== 0) {
- this.shift += 26 - this.shift % 26;
- }
- this.r = new BN(1).iushln(this.shift);
- this.r2 = this.imod(this.r.sqr());
- this.rinv = this.r._invmp(this.m);
- this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);
- this.minv = this.minv.umod(this.r);
- this.minv = this.r.sub(this.minv);
- }
- inherits(Mont, Red);
- Mont.prototype.convertTo = function convertTo(num) {
- return this.imod(num.ushln(this.shift));
- };
- Mont.prototype.convertFrom = function convertFrom(num) {
- var r = this.imod(num.mul(this.rinv));
- r.red = null;
- return r;
- };
- Mont.prototype.imul = function imul(a, b) {
- if (a.isZero() || b.isZero()) {
- a.words[0] = 0;
- a.length = 1;
- return a;
- }
- var t = a.imul(b);
- var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
- var u = t.isub(c).iushrn(this.shift);
- var res = u;
- if (u.cmp(this.m) >= 0) {
- res = u.isub(this.m);
- } else if (u.cmpn(0) < 0) {
- res = u.iadd(this.m);
- }
- return res._forceRed(this);
- };
- Mont.prototype.mul = function mul(a, b) {
- if (a.isZero() || b.isZero())
- return new BN(0)._forceRed(this);
- var t = a.mul(b);
- var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
- var u = t.isub(c).iushrn(this.shift);
- var res = u;
- if (u.cmp(this.m) >= 0) {
- res = u.isub(this.m);
- } else if (u.cmpn(0) < 0) {
- res = u.iadd(this.m);
- }
- return res._forceRed(this);
- };
- Mont.prototype.invm = function invm(a) {
- var res = this.imod(a._invmp(this.m).mul(this.r2));
- return res._forceRed(this);
- };
- })(typeof module === "undefined" || module, exports);
-});
-
-// ../eve/node_modules/inherits/inherits_browser.js
-var require_inherits_browser = __commonJS((exports, module) => {
- if (typeof Object.create === "function") {
- module.exports = function inherits(ctor, superCtor) {
- if (superCtor) {
- ctor.super_ = superCtor;
- ctor.prototype = Object.create(superCtor.prototype, {
- constructor: {
- value: ctor,
- enumerable: false,
- writable: true,
- configurable: true
- }
- });
- }
- };
- } else {
- module.exports = function inherits(ctor, superCtor) {
- if (superCtor) {
- ctor.super_ = superCtor;
- var TempCtor = function() {};
- TempCtor.prototype = superCtor.prototype;
- ctor.prototype = new TempCtor;
- ctor.prototype.constructor = ctor;
- }
- };
- }
-});
-
-// ../eve/node_modules/inherits/inherits.js
-var require_inherits = __commonJS((exports, module) => {
- try {
- util = __require("util");
- if (typeof util.inherits !== "function")
- throw "";
- module.exports = util.inherits;
- } catch (e) {
- module.exports = require_inherits_browser();
- }
- var util;
-});
-
-// ../eve/node_modules/safer-buffer/safer.js
-var require_safer = __commonJS((exports, module) => {
- var buffer = __require("buffer");
- var Buffer2 = buffer.Buffer;
- var safer = {};
- var key;
- for (key in buffer) {
- if (!buffer.hasOwnProperty(key))
- continue;
- if (key === "SlowBuffer" || key === "Buffer")
- continue;
- safer[key] = buffer[key];
- }
- var Safer = safer.Buffer = {};
- for (key in Buffer2) {
- if (!Buffer2.hasOwnProperty(key))
- continue;
- if (key === "allocUnsafe" || key === "allocUnsafeSlow")
- continue;
- Safer[key] = Buffer2[key];
- }
- safer.Buffer.prototype = Buffer2.prototype;
- if (!Safer.from || Safer.from === Uint8Array.from) {
- Safer.from = function(value, encodingOrOffset, length) {
- if (typeof value === "number") {
- throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value);
- }
- if (value && typeof value.length === "undefined") {
- throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value);
- }
- return Buffer2(value, encodingOrOffset, length);
- };
- }
- if (!Safer.alloc) {
- Safer.alloc = function(size, fill, encoding) {
- if (typeof size !== "number") {
- throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size);
- }
- if (size < 0 || size >= 2 * (1 << 30)) {
- throw new RangeError('The value "' + size + '" is invalid for option "size"');
- }
- var buf = Buffer2(size);
- if (!fill || fill.length === 0) {
- buf.fill(0);
- } else if (typeof encoding === "string") {
- buf.fill(fill, encoding);
- } else {
- buf.fill(fill);
- }
- return buf;
- };
- }
- if (!safer.kStringMaxLength) {
- try {
- safer.kStringMaxLength = process.binding("buffer").kStringMaxLength;
- } catch (e) {}
- }
- if (!safer.constants) {
- safer.constants = {
- MAX_LENGTH: safer.kMaxLength
- };
- if (safer.kStringMaxLength) {
- safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength;
- }
- }
- module.exports = safer;
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/reporter.js
-var require_reporter = __commonJS((exports) => {
- var inherits = require_inherits();
- function Reporter(options2) {
- this._reporterState = {
- obj: null,
- path: [],
- options: options2 || {},
- errors: []
- };
- }
- exports.Reporter = Reporter;
- Reporter.prototype.isError = function isError(obj) {
- return obj instanceof ReporterError;
- };
- Reporter.prototype.save = function save() {
- const state = this._reporterState;
- return { obj: state.obj, pathLen: state.path.length };
- };
- Reporter.prototype.restore = function restore(data) {
- const state = this._reporterState;
- state.obj = data.obj;
- state.path = state.path.slice(0, data.pathLen);
- };
- Reporter.prototype.enterKey = function enterKey(key) {
- return this._reporterState.path.push(key);
- };
- Reporter.prototype.exitKey = function exitKey(index) {
- const state = this._reporterState;
- state.path = state.path.slice(0, index - 1);
- };
- Reporter.prototype.leaveKey = function leaveKey(index, key, value) {
- const state = this._reporterState;
- this.exitKey(index);
- if (state.obj !== null)
- state.obj[key] = value;
- };
- Reporter.prototype.path = function path() {
- return this._reporterState.path.join("/");
- };
- Reporter.prototype.enterObject = function enterObject() {
- const state = this._reporterState;
- const prev = state.obj;
- state.obj = {};
- return prev;
- };
- Reporter.prototype.leaveObject = function leaveObject(prev) {
- const state = this._reporterState;
- const now = state.obj;
- state.obj = prev;
- return now;
- };
- Reporter.prototype.error = function error(msg) {
- let err;
- const state = this._reporterState;
- const inherited = msg instanceof ReporterError;
- if (inherited) {
- err = msg;
- } else {
- err = new ReporterError(state.path.map(function(elem) {
- return "[" + JSON.stringify(elem) + "]";
- }).join(""), msg.message || msg, msg.stack);
- }
- if (!state.options.partial)
- throw err;
- if (!inherited)
- state.errors.push(err);
- return err;
- };
- Reporter.prototype.wrapResult = function wrapResult(result) {
- const state = this._reporterState;
- if (!state.options.partial)
- return result;
- return {
- result: this.isError(result) ? null : result,
- errors: state.errors
- };
- };
- function ReporterError(path, msg) {
- this.path = path;
- this.rethrow(msg);
- }
- inherits(ReporterError, Error);
- ReporterError.prototype.rethrow = function rethrow(msg) {
- this.message = msg + " at: " + (this.path || "(shallow)");
- if (Error.captureStackTrace)
- Error.captureStackTrace(this, ReporterError);
- if (!this.stack) {
- try {
- throw new Error(this.message);
- } catch (e) {
- this.stack = e.stack;
- }
- }
- return this;
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/buffer.js
-var require_buffer = __commonJS((exports) => {
- var inherits = require_inherits();
- var Reporter = require_reporter().Reporter;
- var Buffer2 = require_safer().Buffer;
- function DecoderBuffer(base, options2) {
- Reporter.call(this, options2);
- if (!Buffer2.isBuffer(base)) {
- this.error("Input not Buffer");
- return;
- }
- this.base = base;
- this.offset = 0;
- this.length = base.length;
- }
- inherits(DecoderBuffer, Reporter);
- exports.DecoderBuffer = DecoderBuffer;
- DecoderBuffer.isDecoderBuffer = function isDecoderBuffer(data) {
- if (data instanceof DecoderBuffer) {
- return true;
- }
- const isCompatible = typeof data === "object" && Buffer2.isBuffer(data.base) && data.constructor.name === "DecoderBuffer" && typeof data.offset === "number" && typeof data.length === "number" && typeof data.save === "function" && typeof data.restore === "function" && typeof data.isEmpty === "function" && typeof data.readUInt8 === "function" && typeof data.skip === "function" && typeof data.raw === "function";
- return isCompatible;
- };
- DecoderBuffer.prototype.save = function save() {
- return { offset: this.offset, reporter: Reporter.prototype.save.call(this) };
- };
- DecoderBuffer.prototype.restore = function restore(save) {
- const res = new DecoderBuffer(this.base);
- res.offset = save.offset;
- res.length = this.offset;
- this.offset = save.offset;
- Reporter.prototype.restore.call(this, save.reporter);
- return res;
- };
- DecoderBuffer.prototype.isEmpty = function isEmpty() {
- return this.offset === this.length;
- };
- DecoderBuffer.prototype.readUInt8 = function readUInt8(fail) {
- if (this.offset + 1 <= this.length)
- return this.base.readUInt8(this.offset++, true);
- else
- return this.error(fail || "DecoderBuffer overrun");
- };
- DecoderBuffer.prototype.skip = function skip(bytes, fail) {
- if (!(this.offset + bytes <= this.length))
- return this.error(fail || "DecoderBuffer overrun");
- const res = new DecoderBuffer(this.base);
- res._reporterState = this._reporterState;
- res.offset = this.offset;
- res.length = this.offset + bytes;
- this.offset += bytes;
- return res;
- };
- DecoderBuffer.prototype.raw = function raw(save) {
- return this.base.slice(save ? save.offset : this.offset, this.length);
- };
- function EncoderBuffer(value, reporter) {
- if (Array.isArray(value)) {
- this.length = 0;
- this.value = value.map(function(item) {
- if (!EncoderBuffer.isEncoderBuffer(item))
- item = new EncoderBuffer(item, reporter);
- this.length += item.length;
- return item;
- }, this);
- } else if (typeof value === "number") {
- if (!(0 <= value && value <= 255))
- return reporter.error("non-byte EncoderBuffer value");
- this.value = value;
- this.length = 1;
- } else if (typeof value === "string") {
- this.value = value;
- this.length = Buffer2.byteLength(value);
- } else if (Buffer2.isBuffer(value)) {
- this.value = value;
- this.length = value.length;
- } else {
- return reporter.error("Unsupported type: " + typeof value);
- }
- }
- exports.EncoderBuffer = EncoderBuffer;
- EncoderBuffer.isEncoderBuffer = function isEncoderBuffer(data) {
- if (data instanceof EncoderBuffer) {
- return true;
- }
- const isCompatible = typeof data === "object" && data.constructor.name === "EncoderBuffer" && typeof data.length === "number" && typeof data.join === "function";
- return isCompatible;
- };
- EncoderBuffer.prototype.join = function join(out, offset) {
- if (!out)
- out = Buffer2.alloc(this.length);
- if (!offset)
- offset = 0;
- if (this.length === 0)
- return out;
- if (Array.isArray(this.value)) {
- this.value.forEach(function(item) {
- item.join(out, offset);
- offset += item.length;
- });
- } else {
- if (typeof this.value === "number")
- out[offset] = this.value;
- else if (typeof this.value === "string")
- out.write(this.value, offset);
- else if (Buffer2.isBuffer(this.value))
- this.value.copy(out, offset);
- offset += this.length;
- }
- return out;
- };
-});
-
-// ../eve/node_modules/minimalistic-assert/index.js
-var require_minimalistic_assert = __commonJS((exports, module) => {
- module.exports = assert;
- function assert(val, msg) {
- if (!val)
- throw new Error(msg || "Assertion failed");
- }
- assert.equal = function assertEqual(l, r, msg) {
- if (l != r)
- throw new Error(msg || "Assertion failed: " + l + " != " + r);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/node.js
-var require_node = __commonJS((exports, module) => {
- var Reporter = require_reporter().Reporter;
- var EncoderBuffer = require_buffer().EncoderBuffer;
- var DecoderBuffer = require_buffer().DecoderBuffer;
- var assert = require_minimalistic_assert();
- var tags = [
- "seq",
- "seqof",
- "set",
- "setof",
- "objid",
- "bool",
- "gentime",
- "utctime",
- "null_",
- "enum",
- "int",
- "objDesc",
- "bitstr",
- "bmpstr",
- "charstr",
- "genstr",
- "graphstr",
- "ia5str",
- "iso646str",
- "numstr",
- "octstr",
- "printstr",
- "t61str",
- "unistr",
- "utf8str",
- "videostr"
- ];
- var methods = [
- "key",
- "obj",
- "use",
- "optional",
- "explicit",
- "implicit",
- "def",
- "choice",
- "any",
- "contains"
- ].concat(tags);
- var overrided = [
- "_peekTag",
- "_decodeTag",
- "_use",
- "_decodeStr",
- "_decodeObjid",
- "_decodeTime",
- "_decodeNull",
- "_decodeInt",
- "_decodeBool",
- "_decodeList",
- "_encodeComposite",
- "_encodeStr",
- "_encodeObjid",
- "_encodeTime",
- "_encodeNull",
- "_encodeInt",
- "_encodeBool"
- ];
- function Node(enc, parent, name) {
- const state = {};
- this._baseState = state;
- state.name = name;
- state.enc = enc;
- state.parent = parent || null;
- state.children = null;
- state.tag = null;
- state.args = null;
- state.reverseArgs = null;
- state.choice = null;
- state.optional = false;
- state.any = false;
- state.obj = false;
- state.use = null;
- state.useDecoder = null;
- state.key = null;
- state["default"] = null;
- state.explicit = null;
- state.implicit = null;
- state.contains = null;
- if (!state.parent) {
- state.children = [];
- this._wrap();
- }
- }
- module.exports = Node;
- var stateProps = [
- "enc",
- "parent",
- "children",
- "tag",
- "args",
- "reverseArgs",
- "choice",
- "optional",
- "any",
- "obj",
- "use",
- "alteredUse",
- "key",
- "default",
- "explicit",
- "implicit",
- "contains"
- ];
- Node.prototype.clone = function clone() {
- const state = this._baseState;
- const cstate = {};
- stateProps.forEach(function(prop) {
- cstate[prop] = state[prop];
- });
- const res = new this.constructor(cstate.parent);
- res._baseState = cstate;
- return res;
- };
- Node.prototype._wrap = function wrap() {
- const state = this._baseState;
- methods.forEach(function(method) {
- this[method] = function _wrappedMethod() {
- const clone = new this.constructor(this);
- state.children.push(clone);
- return clone[method].apply(clone, arguments);
- };
- }, this);
- };
- Node.prototype._init = function init(body) {
- const state = this._baseState;
- assert(state.parent === null);
- body.call(this);
- state.children = state.children.filter(function(child) {
- return child._baseState.parent === this;
- }, this);
- assert.equal(state.children.length, 1, "Root node can have only one child");
- };
- Node.prototype._useArgs = function useArgs(args) {
- const state = this._baseState;
- const children = args.filter(function(arg) {
- return arg instanceof this.constructor;
- }, this);
- args = args.filter(function(arg) {
- return !(arg instanceof this.constructor);
- }, this);
- if (children.length !== 0) {
- assert(state.children === null);
- state.children = children;
- children.forEach(function(child) {
- child._baseState.parent = this;
- }, this);
- }
- if (args.length !== 0) {
- assert(state.args === null);
- state.args = args;
- state.reverseArgs = args.map(function(arg) {
- if (typeof arg !== "object" || arg.constructor !== Object)
- return arg;
- const res = {};
- Object.keys(arg).forEach(function(key) {
- if (key == (key | 0))
- key |= 0;
- const value = arg[key];
- res[value] = key;
- });
- return res;
- });
- }
- };
- overrided.forEach(function(method) {
- Node.prototype[method] = function _overrided() {
- const state = this._baseState;
- throw new Error(method + " not implemented for encoding: " + state.enc);
- };
- });
- tags.forEach(function(tag) {
- Node.prototype[tag] = function _tagMethod() {
- const state = this._baseState;
- const args = Array.prototype.slice.call(arguments);
- assert(state.tag === null);
- state.tag = tag;
- this._useArgs(args);
- return this;
- };
- });
- Node.prototype.use = function use(item) {
- assert(item);
- const state = this._baseState;
- assert(state.use === null);
- state.use = item;
- return this;
- };
- Node.prototype.optional = function optional() {
- const state = this._baseState;
- state.optional = true;
- return this;
- };
- Node.prototype.def = function def(val) {
- const state = this._baseState;
- assert(state["default"] === null);
- state["default"] = val;
- state.optional = true;
- return this;
- };
- Node.prototype.explicit = function explicit(num) {
- const state = this._baseState;
- assert(state.explicit === null && state.implicit === null);
- state.explicit = num;
- return this;
- };
- Node.prototype.implicit = function implicit(num) {
- const state = this._baseState;
- assert(state.explicit === null && state.implicit === null);
- state.implicit = num;
- return this;
- };
- Node.prototype.obj = function obj() {
- const state = this._baseState;
- const args = Array.prototype.slice.call(arguments);
- state.obj = true;
- if (args.length !== 0)
- this._useArgs(args);
- return this;
- };
- Node.prototype.key = function key(newKey) {
- const state = this._baseState;
- assert(state.key === null);
- state.key = newKey;
- return this;
- };
- Node.prototype.any = function any() {
- const state = this._baseState;
- state.any = true;
- return this;
- };
- Node.prototype.choice = function choice(obj) {
- const state = this._baseState;
- assert(state.choice === null);
- state.choice = obj;
- this._useArgs(Object.keys(obj).map(function(key) {
- return obj[key];
- }));
- return this;
- };
- Node.prototype.contains = function contains(item) {
- const state = this._baseState;
- assert(state.use === null);
- state.contains = item;
- return this;
- };
- Node.prototype._decode = function decode(input, options2) {
- const state = this._baseState;
- if (state.parent === null)
- return input.wrapResult(state.children[0]._decode(input, options2));
- let result = state["default"];
- let present = true;
- let prevKey = null;
- if (state.key !== null)
- prevKey = input.enterKey(state.key);
- if (state.optional) {
- let tag = null;
- if (state.explicit !== null)
- tag = state.explicit;
- else if (state.implicit !== null)
- tag = state.implicit;
- else if (state.tag !== null)
- tag = state.tag;
- if (tag === null && !state.any) {
- const save = input.save();
- try {
- if (state.choice === null)
- this._decodeGeneric(state.tag, input, options2);
- else
- this._decodeChoice(input, options2);
- present = true;
- } catch (e) {
- present = false;
- }
- input.restore(save);
- } else {
- present = this._peekTag(input, tag, state.any);
- if (input.isError(present))
- return present;
- }
- }
- let prevObj;
- if (state.obj && present)
- prevObj = input.enterObject();
- if (present) {
- if (state.explicit !== null) {
- const explicit = this._decodeTag(input, state.explicit);
- if (input.isError(explicit))
- return explicit;
- input = explicit;
- }
- const start = input.offset;
- if (state.use === null && state.choice === null) {
- let save;
- if (state.any)
- save = input.save();
- const body = this._decodeTag(input, state.implicit !== null ? state.implicit : state.tag, state.any);
- if (input.isError(body))
- return body;
- if (state.any)
- result = input.raw(save);
- else
- input = body;
- }
- if (options2 && options2.track && state.tag !== null)
- options2.track(input.path(), start, input.length, "tagged");
- if (options2 && options2.track && state.tag !== null)
- options2.track(input.path(), input.offset, input.length, "content");
- if (state.any) {} else if (state.choice === null) {
- result = this._decodeGeneric(state.tag, input, options2);
- } else {
- result = this._decodeChoice(input, options2);
- }
- if (input.isError(result))
- return result;
- if (!state.any && state.choice === null && state.children !== null) {
- state.children.forEach(function decodeChildren(child) {
- child._decode(input, options2);
- });
- }
- if (state.contains && (state.tag === "octstr" || state.tag === "bitstr")) {
- const data = new DecoderBuffer(result);
- result = this._getUse(state.contains, input._reporterState.obj)._decode(data, options2);
- }
- }
- if (state.obj && present)
- result = input.leaveObject(prevObj);
- if (state.key !== null && (result !== null || present === true))
- input.leaveKey(prevKey, state.key, result);
- else if (prevKey !== null)
- input.exitKey(prevKey);
- return result;
- };
- Node.prototype._decodeGeneric = function decodeGeneric(tag, input, options2) {
- const state = this._baseState;
- if (tag === "seq" || tag === "set")
- return null;
- if (tag === "seqof" || tag === "setof")
- return this._decodeList(input, tag, state.args[0], options2);
- else if (/str$/.test(tag))
- return this._decodeStr(input, tag, options2);
- else if (tag === "objid" && state.args)
- return this._decodeObjid(input, state.args[0], state.args[1], options2);
- else if (tag === "objid")
- return this._decodeObjid(input, null, null, options2);
- else if (tag === "gentime" || tag === "utctime")
- return this._decodeTime(input, tag, options2);
- else if (tag === "null_")
- return this._decodeNull(input, options2);
- else if (tag === "bool")
- return this._decodeBool(input, options2);
- else if (tag === "objDesc")
- return this._decodeStr(input, tag, options2);
- else if (tag === "int" || tag === "enum")
- return this._decodeInt(input, state.args && state.args[0], options2);
- if (state.use !== null) {
- return this._getUse(state.use, input._reporterState.obj)._decode(input, options2);
- } else {
- return input.error("unknown tag: " + tag);
- }
- };
- Node.prototype._getUse = function _getUse(entity, obj) {
- const state = this._baseState;
- state.useDecoder = this._use(entity, obj);
- assert(state.useDecoder._baseState.parent === null);
- state.useDecoder = state.useDecoder._baseState.children[0];
- if (state.implicit !== state.useDecoder._baseState.implicit) {
- state.useDecoder = state.useDecoder.clone();
- state.useDecoder._baseState.implicit = state.implicit;
- }
- return state.useDecoder;
- };
- Node.prototype._decodeChoice = function decodeChoice(input, options2) {
- const state = this._baseState;
- let result = null;
- let match = false;
- Object.keys(state.choice).some(function(key) {
- const save = input.save();
- const node = state.choice[key];
- try {
- const value = node._decode(input, options2);
- if (input.isError(value))
- return false;
- result = { type: key, value };
- match = true;
- } catch (e) {
- input.restore(save);
- return false;
- }
- return true;
- }, this);
- if (!match)
- return input.error("Choice not matched");
- return result;
- };
- Node.prototype._createEncoderBuffer = function createEncoderBuffer(data) {
- return new EncoderBuffer(data, this.reporter);
- };
- Node.prototype._encode = function encode(data, reporter, parent) {
- const state = this._baseState;
- if (state["default"] !== null && state["default"] === data)
- return;
- const result = this._encodeValue(data, reporter, parent);
- if (result === undefined)
- return;
- if (this._skipDefault(result, reporter, parent))
- return;
- return result;
- };
- Node.prototype._encodeValue = function encode(data, reporter, parent) {
- const state = this._baseState;
- if (state.parent === null)
- return state.children[0]._encode(data, reporter || new Reporter);
- let result = null;
- this.reporter = reporter;
- if (state.optional && data === undefined) {
- if (state["default"] !== null)
- data = state["default"];
- else
- return;
- }
- let content = null;
- let primitive = false;
- if (state.any) {
- result = this._createEncoderBuffer(data);
- } else if (state.choice) {
- result = this._encodeChoice(data, reporter);
- } else if (state.contains) {
- content = this._getUse(state.contains, parent)._encode(data, reporter);
- primitive = true;
- } else if (state.children) {
- content = state.children.map(function(child) {
- if (child._baseState.tag === "null_")
- return child._encode(null, reporter, data);
- if (child._baseState.key === null)
- return reporter.error("Child should have a key");
- const prevKey = reporter.enterKey(child._baseState.key);
- if (typeof data !== "object")
- return reporter.error("Child expected, but input is not object");
- const res = child._encode(data[child._baseState.key], reporter, data);
- reporter.leaveKey(prevKey);
- return res;
- }, this).filter(function(child) {
- return child;
- });
- content = this._createEncoderBuffer(content);
- } else {
- if (state.tag === "seqof" || state.tag === "setof") {
- if (!(state.args && state.args.length === 1))
- return reporter.error("Too many args for : " + state.tag);
- if (!Array.isArray(data))
- return reporter.error("seqof/setof, but data is not Array");
- const child = this.clone();
- child._baseState.implicit = null;
- content = this._createEncoderBuffer(data.map(function(item) {
- const state2 = this._baseState;
- return this._getUse(state2.args[0], data)._encode(item, reporter);
- }, child));
- } else if (state.use !== null) {
- result = this._getUse(state.use, parent)._encode(data, reporter);
- } else {
- content = this._encodePrimitive(state.tag, data);
- primitive = true;
- }
- }
- if (!state.any && state.choice === null) {
- const tag = state.implicit !== null ? state.implicit : state.tag;
- const cls = state.implicit === null ? "universal" : "context";
- if (tag === null) {
- if (state.use === null)
- reporter.error("Tag could be omitted only for .use()");
- } else {
- if (state.use === null)
- result = this._encodeComposite(tag, primitive, cls, content);
- }
- }
- if (state.explicit !== null)
- result = this._encodeComposite(state.explicit, false, "context", result);
- return result;
- };
- Node.prototype._encodeChoice = function encodeChoice(data, reporter) {
- const state = this._baseState;
- const node = state.choice[data.type];
- if (!node) {
- assert(false, data.type + " not found in " + JSON.stringify(Object.keys(state.choice)));
- }
- return node._encode(data.value, reporter);
- };
- Node.prototype._encodePrimitive = function encodePrimitive(tag, data) {
- const state = this._baseState;
- if (/str$/.test(tag))
- return this._encodeStr(data, tag);
- else if (tag === "objid" && state.args)
- return this._encodeObjid(data, state.reverseArgs[0], state.args[1]);
- else if (tag === "objid")
- return this._encodeObjid(data, null, null);
- else if (tag === "gentime" || tag === "utctime")
- return this._encodeTime(data, tag);
- else if (tag === "null_")
- return this._encodeNull();
- else if (tag === "int" || tag === "enum")
- return this._encodeInt(data, state.args && state.reverseArgs[0]);
- else if (tag === "bool")
- return this._encodeBool(data);
- else if (tag === "objDesc")
- return this._encodeStr(data, tag);
- else
- throw new Error("Unsupported tag: " + tag);
- };
- Node.prototype._isNumstr = function isNumstr(str) {
- return /^[0-9 ]*$/.test(str);
- };
- Node.prototype._isPrintstr = function isPrintstr(str) {
- return /^[A-Za-z0-9 '()+,-./:=?]*$/.test(str);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/constants/der.js
-var require_der = __commonJS((exports) => {
- function reverse(map) {
- const res = {};
- Object.keys(map).forEach(function(key) {
- if ((key | 0) == key)
- key = key | 0;
- const value = map[key];
- res[value] = key;
- });
- return res;
- }
- exports.tagClass = {
- 0: "universal",
- 1: "application",
- 2: "context",
- 3: "private"
- };
- exports.tagClassByName = reverse(exports.tagClass);
- exports.tag = {
- 0: "end",
- 1: "bool",
- 2: "int",
- 3: "bitstr",
- 4: "octstr",
- 5: "null_",
- 6: "objid",
- 7: "objDesc",
- 8: "external",
- 9: "real",
- 10: "enum",
- 11: "embed",
- 12: "utf8str",
- 13: "relativeOid",
- 16: "seq",
- 17: "set",
- 18: "numstr",
- 19: "printstr",
- 20: "t61str",
- 21: "videostr",
- 22: "ia5str",
- 23: "utctime",
- 24: "gentime",
- 25: "graphstr",
- 26: "iso646str",
- 27: "genstr",
- 28: "unistr",
- 29: "charstr",
- 30: "bmpstr"
- };
- exports.tagByName = reverse(exports.tag);
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/encoders/der.js
-var require_der2 = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var Buffer2 = require_safer().Buffer;
- var Node = require_node();
- var der = require_der();
- function DEREncoder(entity) {
- this.enc = "der";
- this.name = entity.name;
- this.entity = entity;
- this.tree = new DERNode;
- this.tree._init(entity.body);
- }
- module.exports = DEREncoder;
- DEREncoder.prototype.encode = function encode(data, reporter) {
- return this.tree._encode(data, reporter).join();
- };
- function DERNode(parent) {
- Node.call(this, "der", parent);
- }
- inherits(DERNode, Node);
- DERNode.prototype._encodeComposite = function encodeComposite(tag, primitive, cls, content) {
- const encodedTag = encodeTag(tag, primitive, cls, this.reporter);
- if (content.length < 128) {
- const header2 = Buffer2.alloc(2);
- header2[0] = encodedTag;
- header2[1] = content.length;
- return this._createEncoderBuffer([header2, content]);
- }
- let lenOctets = 1;
- for (let i = content.length;i >= 256; i >>= 8)
- lenOctets++;
- const header = Buffer2.alloc(1 + 1 + lenOctets);
- header[0] = encodedTag;
- header[1] = 128 | lenOctets;
- for (let i = 1 + lenOctets, j = content.length;j > 0; i--, j >>= 8)
- header[i] = j & 255;
- return this._createEncoderBuffer([header, content]);
- };
- DERNode.prototype._encodeStr = function encodeStr(str, tag) {
- if (tag === "bitstr") {
- return this._createEncoderBuffer([str.unused | 0, str.data]);
- } else if (tag === "bmpstr") {
- const buf = Buffer2.alloc(str.length * 2);
- for (let i = 0;i < str.length; i++) {
- buf.writeUInt16BE(str.charCodeAt(i), i * 2);
- }
- return this._createEncoderBuffer(buf);
- } else if (tag === "numstr") {
- if (!this._isNumstr(str)) {
- return this.reporter.error("Encoding of string type: numstr supports " + "only digits and space");
- }
- return this._createEncoderBuffer(str);
- } else if (tag === "printstr") {
- if (!this._isPrintstr(str)) {
- return this.reporter.error("Encoding of string type: printstr supports " + "only latin upper and lower case letters, " + "digits, space, apostrophe, left and rigth " + "parenthesis, plus sign, comma, hyphen, " + "dot, slash, colon, equal sign, " + "question mark");
- }
- return this._createEncoderBuffer(str);
- } else if (/str$/.test(tag)) {
- return this._createEncoderBuffer(str);
- } else if (tag === "objDesc") {
- return this._createEncoderBuffer(str);
- } else {
- return this.reporter.error("Encoding of string type: " + tag + " unsupported");
- }
- };
- DERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) {
- if (typeof id === "string") {
- if (!values)
- return this.reporter.error("string objid given, but no values map found");
- if (!values.hasOwnProperty(id))
- return this.reporter.error("objid not found in values map");
- id = values[id].split(/[\s.]+/g);
- for (let i = 0;i < id.length; i++)
- id[i] |= 0;
- } else if (Array.isArray(id)) {
- id = id.slice();
- for (let i = 0;i < id.length; i++)
- id[i] |= 0;
- }
- if (!Array.isArray(id)) {
- return this.reporter.error("objid() should be either array or string, " + "got: " + JSON.stringify(id));
- }
- if (!relative) {
- if (id[1] >= 40)
- return this.reporter.error("Second objid identifier OOB");
- id.splice(0, 2, id[0] * 40 + id[1]);
- }
- let size = 0;
- for (let i = 0;i < id.length; i++) {
- let ident = id[i];
- for (size++;ident >= 128; ident >>= 7)
- size++;
- }
- const objid = Buffer2.alloc(size);
- let offset = objid.length - 1;
- for (let i = id.length - 1;i >= 0; i--) {
- let ident = id[i];
- objid[offset--] = ident & 127;
- while ((ident >>= 7) > 0)
- objid[offset--] = 128 | ident & 127;
- }
- return this._createEncoderBuffer(objid);
- };
- function two(num) {
- if (num < 10)
- return "0" + num;
- else
- return num;
- }
- DERNode.prototype._encodeTime = function encodeTime(time, tag) {
- let str;
- const date = new Date(time);
- if (tag === "gentime") {
- str = [
- two(date.getUTCFullYear()),
- two(date.getUTCMonth() + 1),
- two(date.getUTCDate()),
- two(date.getUTCHours()),
- two(date.getUTCMinutes()),
- two(date.getUTCSeconds()),
- "Z"
- ].join("");
- } else if (tag === "utctime") {
- str = [
- two(date.getUTCFullYear() % 100),
- two(date.getUTCMonth() + 1),
- two(date.getUTCDate()),
- two(date.getUTCHours()),
- two(date.getUTCMinutes()),
- two(date.getUTCSeconds()),
- "Z"
- ].join("");
- } else {
- this.reporter.error("Encoding " + tag + " time is not supported yet");
- }
- return this._encodeStr(str, "octstr");
- };
- DERNode.prototype._encodeNull = function encodeNull() {
- return this._createEncoderBuffer("");
- };
- DERNode.prototype._encodeInt = function encodeInt(num, values) {
- if (typeof num === "string") {
- if (!values)
- return this.reporter.error("String int or enum given, but no values map");
- if (!values.hasOwnProperty(num)) {
- return this.reporter.error("Values map doesn't contain: " + JSON.stringify(num));
- }
- num = values[num];
- }
- if (typeof num !== "number" && !Buffer2.isBuffer(num)) {
- const numArray = num.toArray();
- if (!num.sign && numArray[0] & 128) {
- numArray.unshift(0);
- }
- num = Buffer2.from(numArray);
- }
- if (Buffer2.isBuffer(num)) {
- let size2 = num.length;
- if (num.length === 0)
- size2++;
- const out2 = Buffer2.alloc(size2);
- num.copy(out2);
- if (num.length === 0)
- out2[0] = 0;
- return this._createEncoderBuffer(out2);
- }
- if (num < 128)
- return this._createEncoderBuffer(num);
- if (num < 256)
- return this._createEncoderBuffer([0, num]);
- let size = 1;
- for (let i = num;i >= 256; i >>= 8)
- size++;
- const out = new Array(size);
- for (let i = out.length - 1;i >= 0; i--) {
- out[i] = num & 255;
- num >>= 8;
- }
- if (out[0] & 128) {
- out.unshift(0);
- }
- return this._createEncoderBuffer(Buffer2.from(out));
- };
- DERNode.prototype._encodeBool = function encodeBool(value) {
- return this._createEncoderBuffer(value ? 255 : 0);
- };
- DERNode.prototype._use = function use(entity, obj) {
- if (typeof entity === "function")
- entity = entity(obj);
- return entity._getEncoder("der").tree;
- };
- DERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) {
- const state = this._baseState;
- let i;
- if (state["default"] === null)
- return false;
- const data = dataBuffer.join();
- if (state.defaultBuffer === undefined)
- state.defaultBuffer = this._encodeValue(state["default"], reporter, parent).join();
- if (data.length !== state.defaultBuffer.length)
- return false;
- for (i = 0;i < data.length; i++)
- if (data[i] !== state.defaultBuffer[i])
- return false;
- return true;
- };
- function encodeTag(tag, primitive, cls, reporter) {
- let res;
- if (tag === "seqof")
- tag = "seq";
- else if (tag === "setof")
- tag = "set";
- if (der.tagByName.hasOwnProperty(tag))
- res = der.tagByName[tag];
- else if (typeof tag === "number" && (tag | 0) === tag)
- res = tag;
- else
- return reporter.error("Unknown tag: " + tag);
- if (res >= 31)
- return reporter.error("Multi-octet tag encoding unsupported");
- if (!primitive)
- res |= 32;
- res |= der.tagClassByName[cls || "universal"] << 6;
- return res;
- }
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/encoders/pem.js
-var require_pem = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var DEREncoder = require_der2();
- function PEMEncoder(entity) {
- DEREncoder.call(this, entity);
- this.enc = "pem";
- }
- inherits(PEMEncoder, DEREncoder);
- module.exports = PEMEncoder;
- PEMEncoder.prototype.encode = function encode(data, options2) {
- const buf = DEREncoder.prototype.encode.call(this, data);
- const p = buf.toString("base64");
- const out = ["-----BEGIN " + options2.label + "-----"];
- for (let i = 0;i < p.length; i += 64)
- out.push(p.slice(i, i + 64));
- out.push("-----END " + options2.label + "-----");
- return out.join(`
-`);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/encoders/index.js
-var require_encoders = __commonJS((exports) => {
- var encoders = exports;
- encoders.der = require_der2();
- encoders.pem = require_pem();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/decoders/der.js
-var require_der3 = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var bignum = require_bn();
- var DecoderBuffer = require_buffer().DecoderBuffer;
- var Node = require_node();
- var der = require_der();
- function DERDecoder(entity) {
- this.enc = "der";
- this.name = entity.name;
- this.entity = entity;
- this.tree = new DERNode;
- this.tree._init(entity.body);
- }
- module.exports = DERDecoder;
- DERDecoder.prototype.decode = function decode(data, options2) {
- if (!DecoderBuffer.isDecoderBuffer(data)) {
- data = new DecoderBuffer(data, options2);
- }
- return this.tree._decode(data, options2);
- };
- function DERNode(parent) {
- Node.call(this, "der", parent);
- }
- inherits(DERNode, Node);
- DERNode.prototype._peekTag = function peekTag(buffer, tag, any) {
- if (buffer.isEmpty())
- return false;
- const state = buffer.save();
- const decodedTag = derDecodeTag(buffer, 'Failed to peek tag: "' + tag + '"');
- if (buffer.isError(decodedTag))
- return decodedTag;
- buffer.restore(state);
- return decodedTag.tag === tag || decodedTag.tagStr === tag || decodedTag.tagStr + "of" === tag || any;
- };
- DERNode.prototype._decodeTag = function decodeTag(buffer, tag, any) {
- const decodedTag = derDecodeTag(buffer, 'Failed to decode tag of "' + tag + '"');
- if (buffer.isError(decodedTag))
- return decodedTag;
- let len = derDecodeLen(buffer, decodedTag.primitive, 'Failed to get length of "' + tag + '"');
- if (buffer.isError(len))
- return len;
- if (!any && decodedTag.tag !== tag && decodedTag.tagStr !== tag && decodedTag.tagStr + "of" !== tag) {
- return buffer.error('Failed to match tag: "' + tag + '"');
- }
- if (decodedTag.primitive || len !== null)
- return buffer.skip(len, 'Failed to match body of: "' + tag + '"');
- const state = buffer.save();
- const res = this._skipUntilEnd(buffer, 'Failed to skip indefinite length body: "' + this.tag + '"');
- if (buffer.isError(res))
- return res;
- len = buffer.offset - state.offset;
- buffer.restore(state);
- return buffer.skip(len, 'Failed to match body of: "' + tag + '"');
- };
- DERNode.prototype._skipUntilEnd = function skipUntilEnd(buffer, fail) {
- for (;; ) {
- const tag = derDecodeTag(buffer, fail);
- if (buffer.isError(tag))
- return tag;
- const len = derDecodeLen(buffer, tag.primitive, fail);
- if (buffer.isError(len))
- return len;
- let res;
- if (tag.primitive || len !== null)
- res = buffer.skip(len);
- else
- res = this._skipUntilEnd(buffer, fail);
- if (buffer.isError(res))
- return res;
- if (tag.tagStr === "end")
- break;
- }
- };
- DERNode.prototype._decodeList = function decodeList(buffer, tag, decoder, options2) {
- const result = [];
- while (!buffer.isEmpty()) {
- const possibleEnd = this._peekTag(buffer, "end");
- if (buffer.isError(possibleEnd))
- return possibleEnd;
- const res = decoder.decode(buffer, "der", options2);
- if (buffer.isError(res) && possibleEnd)
- break;
- result.push(res);
- }
- return result;
- };
- DERNode.prototype._decodeStr = function decodeStr(buffer, tag) {
- if (tag === "bitstr") {
- const unused = buffer.readUInt8();
- if (buffer.isError(unused))
- return unused;
- return { unused, data: buffer.raw() };
- } else if (tag === "bmpstr") {
- const raw = buffer.raw();
- if (raw.length % 2 === 1)
- return buffer.error("Decoding of string type: bmpstr length mismatch");
- let str = "";
- for (let i = 0;i < raw.length / 2; i++) {
- str += String.fromCharCode(raw.readUInt16BE(i * 2));
- }
- return str;
- } else if (tag === "numstr") {
- const numstr = buffer.raw().toString("ascii");
- if (!this._isNumstr(numstr)) {
- return buffer.error("Decoding of string type: " + "numstr unsupported characters");
- }
- return numstr;
- } else if (tag === "octstr") {
- return buffer.raw();
- } else if (tag === "objDesc") {
- return buffer.raw();
- } else if (tag === "printstr") {
- const printstr = buffer.raw().toString("ascii");
- if (!this._isPrintstr(printstr)) {
- return buffer.error("Decoding of string type: " + "printstr unsupported characters");
- }
- return printstr;
- } else if (/str$/.test(tag)) {
- return buffer.raw().toString();
- } else {
- return buffer.error("Decoding of string type: " + tag + " unsupported");
- }
- };
- DERNode.prototype._decodeObjid = function decodeObjid(buffer, values, relative) {
- let result;
- const identifiers = [];
- let ident = 0;
- let subident = 0;
- while (!buffer.isEmpty()) {
- subident = buffer.readUInt8();
- ident <<= 7;
- ident |= subident & 127;
- if ((subident & 128) === 0) {
- identifiers.push(ident);
- ident = 0;
- }
- }
- if (subident & 128)
- identifiers.push(ident);
- const first = identifiers[0] / 40 | 0;
- const second = identifiers[0] % 40;
- if (relative)
- result = identifiers;
- else
- result = [first, second].concat(identifiers.slice(1));
- if (values) {
- let tmp = values[result.join(" ")];
- if (tmp === undefined)
- tmp = values[result.join(".")];
- if (tmp !== undefined)
- result = tmp;
- }
- return result;
- };
- DERNode.prototype._decodeTime = function decodeTime(buffer, tag) {
- const str = buffer.raw().toString();
- let year;
- let mon;
- let day;
- let hour;
- let min;
- let sec;
- if (tag === "gentime") {
- year = str.slice(0, 4) | 0;
- mon = str.slice(4, 6) | 0;
- day = str.slice(6, 8) | 0;
- hour = str.slice(8, 10) | 0;
- min = str.slice(10, 12) | 0;
- sec = str.slice(12, 14) | 0;
- } else if (tag === "utctime") {
- year = str.slice(0, 2) | 0;
- mon = str.slice(2, 4) | 0;
- day = str.slice(4, 6) | 0;
- hour = str.slice(6, 8) | 0;
- min = str.slice(8, 10) | 0;
- sec = str.slice(10, 12) | 0;
- if (year < 70)
- year = 2000 + year;
- else
- year = 1900 + year;
- } else {
- return buffer.error("Decoding " + tag + " time is not supported yet");
- }
- return Date.UTC(year, mon - 1, day, hour, min, sec, 0);
- };
- DERNode.prototype._decodeNull = function decodeNull() {
- return null;
- };
- DERNode.prototype._decodeBool = function decodeBool(buffer) {
- const res = buffer.readUInt8();
- if (buffer.isError(res))
- return res;
- else
- return res !== 0;
- };
- DERNode.prototype._decodeInt = function decodeInt(buffer, values) {
- const raw = buffer.raw();
- let res = new bignum(raw);
- if (values)
- res = values[res.toString(10)] || res;
- return res;
- };
- DERNode.prototype._use = function use(entity, obj) {
- if (typeof entity === "function")
- entity = entity(obj);
- return entity._getDecoder("der").tree;
- };
- function derDecodeTag(buf, fail) {
- let tag = buf.readUInt8(fail);
- if (buf.isError(tag))
- return tag;
- const cls = der.tagClass[tag >> 6];
- const primitive = (tag & 32) === 0;
- if ((tag & 31) === 31) {
- let oct = tag;
- tag = 0;
- while ((oct & 128) === 128) {
- oct = buf.readUInt8(fail);
- if (buf.isError(oct))
- return oct;
- tag <<= 7;
- tag |= oct & 127;
- }
- } else {
- tag &= 31;
- }
- const tagStr = der.tag[tag];
- return {
- cls,
- primitive,
- tag,
- tagStr
- };
- }
- function derDecodeLen(buf, primitive, fail) {
- let len = buf.readUInt8(fail);
- if (buf.isError(len))
- return len;
- if (!primitive && len === 128)
- return null;
- if ((len & 128) === 0) {
- return len;
- }
- const num = len & 127;
- if (num > 4)
- return buf.error("length octect is too long");
- len = 0;
- for (let i = 0;i < num; i++) {
- len <<= 8;
- const j = buf.readUInt8(fail);
- if (buf.isError(j))
- return j;
- len |= j;
- }
- return len;
- }
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/decoders/pem.js
-var require_pem2 = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var Buffer2 = require_safer().Buffer;
- var DERDecoder = require_der3();
- function PEMDecoder(entity) {
- DERDecoder.call(this, entity);
- this.enc = "pem";
- }
- inherits(PEMDecoder, DERDecoder);
- module.exports = PEMDecoder;
- PEMDecoder.prototype.decode = function decode(data, options2) {
- const lines = data.toString().split(/[\r\n]+/g);
- const label = options2.label.toUpperCase();
- const re = /^-----(BEGIN|END) ([^-]+)-----$/;
- let start = -1;
- let end = -1;
- for (let i = 0;i < lines.length; i++) {
- const match = lines[i].match(re);
- if (match === null)
- continue;
- if (match[2] !== label)
- continue;
- if (start === -1) {
- if (match[1] !== "BEGIN")
- break;
- start = i;
- } else {
- if (match[1] !== "END")
- break;
- end = i;
- break;
- }
- }
- if (start === -1 || end === -1)
- throw new Error("PEM section not found for: " + label);
- const base64 = lines.slice(start + 1, end).join("");
- base64.replace(/[^a-z0-9+/=]+/gi, "");
- const input = Buffer2.from(base64, "base64");
- return DERDecoder.prototype.decode.call(this, input, options2);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/decoders/index.js
-var require_decoders = __commonJS((exports) => {
- var decoders = exports;
- decoders.der = require_der3();
- decoders.pem = require_pem2();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/api.js
-var require_api = __commonJS((exports) => {
- var encoders = require_encoders();
- var decoders = require_decoders();
- var inherits = require_inherits();
- var api = exports;
- api.define = function define(name, body) {
- return new Entity(name, body);
- };
- function Entity(name, body) {
- this.name = name;
- this.body = body;
- this.decoders = {};
- this.encoders = {};
- }
- Entity.prototype._createNamed = function createNamed(Base) {
- const name = this.name;
- function Generated(entity) {
- this._initNamed(entity, name);
- }
- inherits(Generated, Base);
- Generated.prototype._initNamed = function _initNamed(entity, name2) {
- Base.call(this, entity, name2);
- };
- return new Generated(this);
- };
- Entity.prototype._getDecoder = function _getDecoder(enc) {
- enc = enc || "der";
- if (!this.decoders.hasOwnProperty(enc))
- this.decoders[enc] = this._createNamed(decoders[enc]);
- return this.decoders[enc];
- };
- Entity.prototype.decode = function decode(data, enc, options2) {
- return this._getDecoder(enc).decode(data, options2);
- };
- Entity.prototype._getEncoder = function _getEncoder(enc) {
- enc = enc || "der";
- if (!this.encoders.hasOwnProperty(enc))
- this.encoders[enc] = this._createNamed(encoders[enc]);
- return this.encoders[enc];
- };
- Entity.prototype.encode = function encode(data, enc, reporter) {
- return this._getEncoder(enc).encode(data, reporter);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/index.js
-var require_base = __commonJS((exports) => {
- var base = exports;
- base.Reporter = require_reporter().Reporter;
- base.DecoderBuffer = require_buffer().DecoderBuffer;
- base.EncoderBuffer = require_buffer().EncoderBuffer;
- base.Node = require_node();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/constants/index.js
-var require_constants2 = __commonJS((exports) => {
- var constants = exports;
- constants._reverse = function reverse(map) {
- const res = {};
- Object.keys(map).forEach(function(key) {
- if ((key | 0) == key)
- key = key | 0;
- const value = map[key];
- res[value] = key;
- });
- return res;
- };
- constants.der = require_der();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1.js
-var require_asn1 = __commonJS((exports) => {
- var asn1 = exports;
- asn1.bignum = require_bn();
- asn1.define = require_api().define;
- asn1.base = require_base();
- asn1.constants = require_constants2();
- asn1.decoders = require_decoders();
- asn1.encoders = require_encoders();
-});
-
-// ../eve/node_modules/elliptic/package.json
-var require_package = __commonJS((exports, module) => {
- module.exports = {
- name: "elliptic",
- version: "6.6.1",
- description: "EC cryptography",
- main: "lib/elliptic.js",
- files: [
- "lib"
- ],
- scripts: {
- lint: "eslint lib test",
- "lint:fix": "npm run lint -- --fix",
- unit: "istanbul test _mocha --reporter=spec test/index.js",
- test: "npm run lint && npm run unit",
- version: "grunt dist && git add dist/"
- },
- repository: {
- type: "git",
- url: "git@github.com:indutny/elliptic"
- },
- keywords: [
- "EC",
- "Elliptic",
- "curve",
- "Cryptography"
- ],
- author: "Fedor Indutny ",
- license: "MIT",
- bugs: {
- url: "https://github.com/indutny/elliptic/issues"
- },
- homepage: "https://github.com/indutny/elliptic",
- devDependencies: {
- brfs: "^2.0.2",
- coveralls: "^3.1.0",
- eslint: "^7.6.0",
- grunt: "^1.2.1",
- "grunt-browserify": "^5.3.0",
- "grunt-cli": "^1.3.2",
- "grunt-contrib-connect": "^3.0.0",
- "grunt-contrib-copy": "^1.0.0",
- "grunt-contrib-uglify": "^5.0.0",
- "grunt-mocha-istanbul": "^5.0.2",
- "grunt-saucelabs": "^9.0.1",
- istanbul: "^0.4.5",
- mocha: "^8.0.1"
- },
- dependencies: {
- "bn.js": "^4.11.9",
- brorand: "^1.1.0",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.1",
- inherits: "^2.0.4",
- "minimalistic-assert": "^1.0.1",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- };
-});
-
-// ../eve/node_modules/minimalistic-crypto-utils/lib/utils.js
-var require_utils = __commonJS((exports) => {
- var utils = exports;
- function toArray(msg, enc) {
- if (Array.isArray(msg))
- return msg.slice();
- if (!msg)
- return [];
- var res = [];
- if (typeof msg !== "string") {
- for (var i = 0;i < msg.length; i++)
- res[i] = msg[i] | 0;
- return res;
- }
- if (enc === "hex") {
- msg = msg.replace(/[^a-z0-9]+/ig, "");
- if (msg.length % 2 !== 0)
- msg = "0" + msg;
- for (var i = 0;i < msg.length; i += 2)
- res.push(parseInt(msg[i] + msg[i + 1], 16));
- } else {
- for (var i = 0;i < msg.length; i++) {
- var c = msg.charCodeAt(i);
- var hi = c >> 8;
- var lo = c & 255;
- if (hi)
- res.push(hi, lo);
- else
- res.push(lo);
- }
- }
- return res;
- }
- utils.toArray = toArray;
- function zero2(word) {
- if (word.length === 1)
- return "0" + word;
- else
- return word;
- }
- utils.zero2 = zero2;
- function toHex(msg) {
- var res = "";
- for (var i = 0;i < msg.length; i++)
- res += zero2(msg[i].toString(16));
- return res;
- }
- utils.toHex = toHex;
- utils.encode = function encode(arr, enc) {
- if (enc === "hex")
- return toHex(arr);
- else
- return arr;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/utils.js
-var require_utils2 = __commonJS((exports) => {
- var utils = exports;
- var BN = require_bn();
- var minAssert = require_minimalistic_assert();
- var minUtils = require_utils();
- utils.assert = minAssert;
- utils.toArray = minUtils.toArray;
- utils.zero2 = minUtils.zero2;
- utils.toHex = minUtils.toHex;
- utils.encode = minUtils.encode;
- function getNAF(num, w, bits) {
- var naf = new Array(Math.max(num.bitLength(), bits) + 1);
- var i;
- for (i = 0;i < naf.length; i += 1) {
- naf[i] = 0;
- }
- var ws = 1 << w + 1;
- var k = num.clone();
- for (i = 0;i < naf.length; i++) {
- var z;
- var mod = k.andln(ws - 1);
- if (k.isOdd()) {
- if (mod > (ws >> 1) - 1)
- z = (ws >> 1) - mod;
- else
- z = mod;
- k.isubn(z);
- } else {
- z = 0;
- }
- naf[i] = z;
- k.iushrn(1);
- }
- return naf;
- }
- utils.getNAF = getNAF;
- function getJSF(k1, k2) {
- var jsf = [
- [],
- []
- ];
- k1 = k1.clone();
- k2 = k2.clone();
- var d1 = 0;
- var d2 = 0;
- var m8;
- while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {
- var m14 = k1.andln(3) + d1 & 3;
- var m24 = k2.andln(3) + d2 & 3;
- if (m14 === 3)
- m14 = -1;
- if (m24 === 3)
- m24 = -1;
- var u1;
- if ((m14 & 1) === 0) {
- u1 = 0;
- } else {
- m8 = k1.andln(7) + d1 & 7;
- if ((m8 === 3 || m8 === 5) && m24 === 2)
- u1 = -m14;
- else
- u1 = m14;
- }
- jsf[0].push(u1);
- var u2;
- if ((m24 & 1) === 0) {
- u2 = 0;
- } else {
- m8 = k2.andln(7) + d2 & 7;
- if ((m8 === 3 || m8 === 5) && m14 === 2)
- u2 = -m24;
- else
- u2 = m24;
- }
- jsf[1].push(u2);
- if (2 * d1 === u1 + 1)
- d1 = 1 - d1;
- if (2 * d2 === u2 + 1)
- d2 = 1 - d2;
- k1.iushrn(1);
- k2.iushrn(1);
- }
- return jsf;
- }
- utils.getJSF = getJSF;
- function cachedProperty(obj, name, computer) {
- var key = "_" + name;
- obj.prototype[name] = function cachedProperty() {
- return this[key] !== undefined ? this[key] : this[key] = computer.call(this);
- };
- }
- utils.cachedProperty = cachedProperty;
- function parseBytes(bytes) {
- return typeof bytes === "string" ? utils.toArray(bytes, "hex") : bytes;
- }
- utils.parseBytes = parseBytes;
- function intFromLE(bytes) {
- return new BN(bytes, "hex", "le");
- }
- utils.intFromLE = intFromLE;
-});
-
-// ../eve/node_modules/brorand/index.js
-var require_brorand = __commonJS((exports, module) => {
- var r;
- module.exports = function rand(len) {
- if (!r)
- r = new Rand(null);
- return r.generate(len);
- };
- function Rand(rand) {
- this.rand = rand;
- }
- module.exports.Rand = Rand;
- Rand.prototype.generate = function generate(len) {
- return this._rand(len);
- };
- Rand.prototype._rand = function _rand(n) {
- if (this.rand.getBytes)
- return this.rand.getBytes(n);
- var res = new Uint8Array(n);
- for (var i = 0;i < res.length; i++)
- res[i] = this.rand.getByte();
- return res;
- };
- if (typeof self === "object") {
- if (self.crypto && self.crypto.getRandomValues) {
- Rand.prototype._rand = function _rand(n) {
- var arr = new Uint8Array(n);
- self.crypto.getRandomValues(arr);
- return arr;
- };
- } else if (self.msCrypto && self.msCrypto.getRandomValues) {
- Rand.prototype._rand = function _rand(n) {
- var arr = new Uint8Array(n);
- self.msCrypto.getRandomValues(arr);
- return arr;
- };
- } else if (typeof window === "object") {
- Rand.prototype._rand = function() {
- throw new Error("Not implemented yet");
- };
- }
- } else {
- try {
- crypto2 = __require("crypto");
- if (typeof crypto2.randomBytes !== "function")
- throw new Error("Not supported");
- Rand.prototype._rand = function _rand(n) {
- return crypto2.randomBytes(n);
- };
- } catch (e) {}
- }
- var crypto2;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/base.js
-var require_base2 = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var getNAF = utils.getNAF;
- var getJSF = utils.getJSF;
- var assert = utils.assert;
- function BaseCurve(type, conf) {
- this.type = type;
- this.p = new BN(conf.p, 16);
- this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p);
- this.zero = new BN(0).toRed(this.red);
- this.one = new BN(1).toRed(this.red);
- this.two = new BN(2).toRed(this.red);
- this.n = conf.n && new BN(conf.n, 16);
- this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed);
- this._wnafT1 = new Array(4);
- this._wnafT2 = new Array(4);
- this._wnafT3 = new Array(4);
- this._wnafT4 = new Array(4);
- this._bitLength = this.n ? this.n.bitLength() : 0;
- var adjustCount = this.n && this.p.div(this.n);
- if (!adjustCount || adjustCount.cmpn(100) > 0) {
- this.redN = null;
- } else {
- this._maxwellTrick = true;
- this.redN = this.n.toRed(this.red);
- }
- }
- module.exports = BaseCurve;
- BaseCurve.prototype.point = function point() {
- throw new Error("Not implemented");
- };
- BaseCurve.prototype.validate = function validate() {
- throw new Error("Not implemented");
- };
- BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) {
- assert(p.precomputed);
- var doubles = p._getDoubles();
- var naf = getNAF(k, 1, this._bitLength);
- var I = (1 << doubles.step + 1) - (doubles.step % 2 === 0 ? 2 : 1);
- I /= 3;
- var repr = [];
- var j;
- var nafW;
- for (j = 0;j < naf.length; j += doubles.step) {
- nafW = 0;
- for (var l = j + doubles.step - 1;l >= j; l--)
- nafW = (nafW << 1) + naf[l];
- repr.push(nafW);
- }
- var a = this.jpoint(null, null, null);
- var b = this.jpoint(null, null, null);
- for (var i = I;i > 0; i--) {
- for (j = 0;j < repr.length; j++) {
- nafW = repr[j];
- if (nafW === i)
- b = b.mixedAdd(doubles.points[j]);
- else if (nafW === -i)
- b = b.mixedAdd(doubles.points[j].neg());
- }
- a = a.add(b);
- }
- return a.toP();
- };
- BaseCurve.prototype._wnafMul = function _wnafMul(p, k) {
- var w = 4;
- var nafPoints = p._getNAFPoints(w);
- w = nafPoints.wnd;
- var wnd = nafPoints.points;
- var naf = getNAF(k, w, this._bitLength);
- var acc = this.jpoint(null, null, null);
- for (var i = naf.length - 1;i >= 0; i--) {
- for (var l = 0;i >= 0 && naf[i] === 0; i--)
- l++;
- if (i >= 0)
- l++;
- acc = acc.dblp(l);
- if (i < 0)
- break;
- var z = naf[i];
- assert(z !== 0);
- if (p.type === "affine") {
- if (z > 0)
- acc = acc.mixedAdd(wnd[z - 1 >> 1]);
- else
- acc = acc.mixedAdd(wnd[-z - 1 >> 1].neg());
- } else {
- if (z > 0)
- acc = acc.add(wnd[z - 1 >> 1]);
- else
- acc = acc.add(wnd[-z - 1 >> 1].neg());
- }
- }
- return p.type === "affine" ? acc.toP() : acc;
- };
- BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, points, coeffs, len, jacobianResult) {
- var wndWidth = this._wnafT1;
- var wnd = this._wnafT2;
- var naf = this._wnafT3;
- var max = 0;
- var i;
- var j;
- var p;
- for (i = 0;i < len; i++) {
- p = points[i];
- var nafPoints = p._getNAFPoints(defW);
- wndWidth[i] = nafPoints.wnd;
- wnd[i] = nafPoints.points;
- }
- for (i = len - 1;i >= 1; i -= 2) {
- var a = i - 1;
- var b = i;
- if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {
- naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength);
- naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength);
- max = Math.max(naf[a].length, max);
- max = Math.max(naf[b].length, max);
- continue;
- }
- var comb = [
- points[a],
- null,
- null,
- points[b]
- ];
- if (points[a].y.cmp(points[b].y) === 0) {
- comb[1] = points[a].add(points[b]);
- comb[2] = points[a].toJ().mixedAdd(points[b].neg());
- } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) {
- comb[1] = points[a].toJ().mixedAdd(points[b]);
- comb[2] = points[a].add(points[b].neg());
- } else {
- comb[1] = points[a].toJ().mixedAdd(points[b]);
- comb[2] = points[a].toJ().mixedAdd(points[b].neg());
- }
- var index = [
- -3,
- -1,
- -5,
- -7,
- 0,
- 7,
- 5,
- 1,
- 3
- ];
- var jsf = getJSF(coeffs[a], coeffs[b]);
- max = Math.max(jsf[0].length, max);
- naf[a] = new Array(max);
- naf[b] = new Array(max);
- for (j = 0;j < max; j++) {
- var ja = jsf[0][j] | 0;
- var jb = jsf[1][j] | 0;
- naf[a][j] = index[(ja + 1) * 3 + (jb + 1)];
- naf[b][j] = 0;
- wnd[a] = comb;
- }
- }
- var acc = this.jpoint(null, null, null);
- var tmp = this._wnafT4;
- for (i = max;i >= 0; i--) {
- var k = 0;
- while (i >= 0) {
- var zero = true;
- for (j = 0;j < len; j++) {
- tmp[j] = naf[j][i] | 0;
- if (tmp[j] !== 0)
- zero = false;
- }
- if (!zero)
- break;
- k++;
- i--;
- }
- if (i >= 0)
- k++;
- acc = acc.dblp(k);
- if (i < 0)
- break;
- for (j = 0;j < len; j++) {
- var z = tmp[j];
- if (z === 0)
- continue;
- else if (z > 0)
- p = wnd[j][z - 1 >> 1];
- else if (z < 0)
- p = wnd[j][-z - 1 >> 1].neg();
- if (p.type === "affine")
- acc = acc.mixedAdd(p);
- else
- acc = acc.add(p);
- }
- }
- for (i = 0;i < len; i++)
- wnd[i] = null;
- if (jacobianResult)
- return acc;
- else
- return acc.toP();
- };
- function BasePoint(curve, type) {
- this.curve = curve;
- this.type = type;
- this.precomputed = null;
- }
- BaseCurve.BasePoint = BasePoint;
- BasePoint.prototype.eq = function eq() {
- throw new Error("Not implemented");
- };
- BasePoint.prototype.validate = function validate() {
- return this.curve.validate(this);
- };
- BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
- bytes = utils.toArray(bytes, enc);
- var len = this.p.byteLength();
- if ((bytes[0] === 4 || bytes[0] === 6 || bytes[0] === 7) && bytes.length - 1 === 2 * len) {
- if (bytes[0] === 6)
- assert(bytes[bytes.length - 1] % 2 === 0);
- else if (bytes[0] === 7)
- assert(bytes[bytes.length - 1] % 2 === 1);
- var res = this.point(bytes.slice(1, 1 + len), bytes.slice(1 + len, 1 + 2 * len));
- return res;
- } else if ((bytes[0] === 2 || bytes[0] === 3) && bytes.length - 1 === len) {
- return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 3);
- }
- throw new Error("Unknown point format");
- };
- BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) {
- return this.encode(enc, true);
- };
- BasePoint.prototype._encode = function _encode(compact) {
- var len = this.curve.p.byteLength();
- var x = this.getX().toArray("be", len);
- if (compact)
- return [this.getY().isEven() ? 2 : 3].concat(x);
- return [4].concat(x, this.getY().toArray("be", len));
- };
- BasePoint.prototype.encode = function encode(enc, compact) {
- return utils.encode(this._encode(compact), enc);
- };
- BasePoint.prototype.precompute = function precompute(power) {
- if (this.precomputed)
- return this;
- var precomputed = {
- doubles: null,
- naf: null,
- beta: null
- };
- precomputed.naf = this._getNAFPoints(8);
- precomputed.doubles = this._getDoubles(4, power);
- precomputed.beta = this._getBeta();
- this.precomputed = precomputed;
- return this;
- };
- BasePoint.prototype._hasDoubles = function _hasDoubles(k) {
- if (!this.precomputed)
- return false;
- var doubles = this.precomputed.doubles;
- if (!doubles)
- return false;
- return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step);
- };
- BasePoint.prototype._getDoubles = function _getDoubles(step, power) {
- if (this.precomputed && this.precomputed.doubles)
- return this.precomputed.doubles;
- var doubles = [this];
- var acc = this;
- for (var i = 0;i < power; i += step) {
- for (var j = 0;j < step; j++)
- acc = acc.dbl();
- doubles.push(acc);
- }
- return {
- step,
- points: doubles
- };
- };
- BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) {
- if (this.precomputed && this.precomputed.naf)
- return this.precomputed.naf;
- var res = [this];
- var max = (1 << wnd) - 1;
- var dbl = max === 1 ? null : this.dbl();
- for (var i = 1;i < max; i++)
- res[i] = res[i - 1].add(dbl);
- return {
- wnd,
- points: res
- };
- };
- BasePoint.prototype._getBeta = function _getBeta() {
- return null;
- };
- BasePoint.prototype.dblp = function dblp(k) {
- var r = this;
- for (var i = 0;i < k; i++)
- r = r.dbl();
- return r;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/short.js
-var require_short = __commonJS((exports, module) => {
- var utils = require_utils2();
- var BN = require_bn();
- var inherits = require_inherits();
- var Base = require_base2();
- var assert = utils.assert;
- function ShortCurve(conf) {
- Base.call(this, "short", conf);
- this.a = new BN(conf.a, 16).toRed(this.red);
- this.b = new BN(conf.b, 16).toRed(this.red);
- this.tinv = this.two.redInvm();
- this.zeroA = this.a.fromRed().cmpn(0) === 0;
- this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0;
- this.endo = this._getEndomorphism(conf);
- this._endoWnafT1 = new Array(4);
- this._endoWnafT2 = new Array(4);
- }
- inherits(ShortCurve, Base);
- module.exports = ShortCurve;
- ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) {
- if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1)
- return;
- var beta;
- var lambda;
- if (conf.beta) {
- beta = new BN(conf.beta, 16).toRed(this.red);
- } else {
- var betas = this._getEndoRoots(this.p);
- beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1];
- beta = beta.toRed(this.red);
- }
- if (conf.lambda) {
- lambda = new BN(conf.lambda, 16);
- } else {
- var lambdas = this._getEndoRoots(this.n);
- if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) {
- lambda = lambdas[0];
- } else {
- lambda = lambdas[1];
- assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0);
- }
- }
- var basis;
- if (conf.basis) {
- basis = conf.basis.map(function(vec) {
- return {
- a: new BN(vec.a, 16),
- b: new BN(vec.b, 16)
- };
- });
- } else {
- basis = this._getEndoBasis(lambda);
- }
- return {
- beta,
- lambda,
- basis
- };
- };
- ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) {
- var red = num === this.p ? this.red : BN.mont(num);
- var tinv = new BN(2).toRed(red).redInvm();
- var ntinv = tinv.redNeg();
- var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv);
- var l1 = ntinv.redAdd(s).fromRed();
- var l2 = ntinv.redSub(s).fromRed();
- return [l1, l2];
- };
- ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) {
- var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2));
- var u = lambda;
- var v = this.n.clone();
- var x1 = new BN(1);
- var y1 = new BN(0);
- var x2 = new BN(0);
- var y2 = new BN(1);
- var a0;
- var b0;
- var a1;
- var b1;
- var a2;
- var b2;
- var prevR;
- var i = 0;
- var r;
- var x;
- while (u.cmpn(0) !== 0) {
- var q = v.div(u);
- r = v.sub(q.mul(u));
- x = x2.sub(q.mul(x1));
- var y = y2.sub(q.mul(y1));
- if (!a1 && r.cmp(aprxSqrt) < 0) {
- a0 = prevR.neg();
- b0 = x1;
- a1 = r.neg();
- b1 = x;
- } else if (a1 && ++i === 2) {
- break;
- }
- prevR = r;
- v = u;
- u = r;
- x2 = x1;
- x1 = x;
- y2 = y1;
- y1 = y;
- }
- a2 = r.neg();
- b2 = x;
- var len1 = a1.sqr().add(b1.sqr());
- var len2 = a2.sqr().add(b2.sqr());
- if (len2.cmp(len1) >= 0) {
- a2 = a0;
- b2 = b0;
- }
- if (a1.negative) {
- a1 = a1.neg();
- b1 = b1.neg();
- }
- if (a2.negative) {
- a2 = a2.neg();
- b2 = b2.neg();
- }
- return [
- { a: a1, b: b1 },
- { a: a2, b: b2 }
- ];
- };
- ShortCurve.prototype._endoSplit = function _endoSplit(k) {
- var basis = this.endo.basis;
- var v1 = basis[0];
- var v2 = basis[1];
- var c1 = v2.b.mul(k).divRound(this.n);
- var c2 = v1.b.neg().mul(k).divRound(this.n);
- var p1 = c1.mul(v1.a);
- var p2 = c2.mul(v2.a);
- var q1 = c1.mul(v1.b);
- var q2 = c2.mul(v2.b);
- var k1 = k.sub(p1).sub(p2);
- var k2 = q1.add(q2).neg();
- return { k1, k2 };
- };
- ShortCurve.prototype.pointFromX = function pointFromX(x, odd) {
- x = new BN(x, 16);
- if (!x.red)
- x = x.toRed(this.red);
- var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b);
- var y = y2.redSqrt();
- if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
- throw new Error("invalid point");
- var isOdd = y.fromRed().isOdd();
- if (odd && !isOdd || !odd && isOdd)
- y = y.redNeg();
- return this.point(x, y);
- };
- ShortCurve.prototype.validate = function validate(point) {
- if (point.inf)
- return true;
- var x = point.x;
- var y = point.y;
- var ax = this.a.redMul(x);
- var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b);
- return y.redSqr().redISub(rhs).cmpn(0) === 0;
- };
- ShortCurve.prototype._endoWnafMulAdd = function _endoWnafMulAdd(points, coeffs, jacobianResult) {
- var npoints = this._endoWnafT1;
- var ncoeffs = this._endoWnafT2;
- for (var i = 0;i < points.length; i++) {
- var split = this._endoSplit(coeffs[i]);
- var p = points[i];
- var beta = p._getBeta();
- if (split.k1.negative) {
- split.k1.ineg();
- p = p.neg(true);
- }
- if (split.k2.negative) {
- split.k2.ineg();
- beta = beta.neg(true);
- }
- npoints[i * 2] = p;
- npoints[i * 2 + 1] = beta;
- ncoeffs[i * 2] = split.k1;
- ncoeffs[i * 2 + 1] = split.k2;
- }
- var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult);
- for (var j = 0;j < i * 2; j++) {
- npoints[j] = null;
- ncoeffs[j] = null;
- }
- return res;
- };
- function Point(curve, x, y, isRed) {
- Base.BasePoint.call(this, curve, "affine");
- if (x === null && y === null) {
- this.x = null;
- this.y = null;
- this.inf = true;
- } else {
- this.x = new BN(x, 16);
- this.y = new BN(y, 16);
- if (isRed) {
- this.x.forceRed(this.curve.red);
- this.y.forceRed(this.curve.red);
- }
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.y.red)
- this.y = this.y.toRed(this.curve.red);
- this.inf = false;
- }
- }
- inherits(Point, Base.BasePoint);
- ShortCurve.prototype.point = function point(x, y, isRed) {
- return new Point(this, x, y, isRed);
- };
- ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) {
- return Point.fromJSON(this, obj, red);
- };
- Point.prototype._getBeta = function _getBeta() {
- if (!this.curve.endo)
- return;
- var pre = this.precomputed;
- if (pre && pre.beta)
- return pre.beta;
- var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);
- if (pre) {
- var curve = this.curve;
- var endoMul = function(p) {
- return curve.point(p.x.redMul(curve.endo.beta), p.y);
- };
- pre.beta = beta;
- beta.precomputed = {
- beta: null,
- naf: pre.naf && {
- wnd: pre.naf.wnd,
- points: pre.naf.points.map(endoMul)
- },
- doubles: pre.doubles && {
- step: pre.doubles.step,
- points: pre.doubles.points.map(endoMul)
- }
- };
- }
- return beta;
- };
- Point.prototype.toJSON = function toJSON() {
- if (!this.precomputed)
- return [this.x, this.y];
- return [this.x, this.y, this.precomputed && {
- doubles: this.precomputed.doubles && {
- step: this.precomputed.doubles.step,
- points: this.precomputed.doubles.points.slice(1)
- },
- naf: this.precomputed.naf && {
- wnd: this.precomputed.naf.wnd,
- points: this.precomputed.naf.points.slice(1)
- }
- }];
- };
- Point.fromJSON = function fromJSON(curve, obj, red) {
- if (typeof obj === "string")
- obj = JSON.parse(obj);
- var res = curve.point(obj[0], obj[1], red);
- if (!obj[2])
- return res;
- function obj2point(obj2) {
- return curve.point(obj2[0], obj2[1], red);
- }
- var pre = obj[2];
- res.precomputed = {
- beta: null,
- doubles: pre.doubles && {
- step: pre.doubles.step,
- points: [res].concat(pre.doubles.points.map(obj2point))
- },
- naf: pre.naf && {
- wnd: pre.naf.wnd,
- points: [res].concat(pre.naf.points.map(obj2point))
- }
- };
- return res;
- };
- Point.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- Point.prototype.isInfinity = function isInfinity() {
- return this.inf;
- };
- Point.prototype.add = function add(p) {
- if (this.inf)
- return p;
- if (p.inf)
- return this;
- if (this.eq(p))
- return this.dbl();
- if (this.neg().eq(p))
- return this.curve.point(null, null);
- if (this.x.cmp(p.x) === 0)
- return this.curve.point(null, null);
- var c = this.y.redSub(p.y);
- if (c.cmpn(0) !== 0)
- c = c.redMul(this.x.redSub(p.x).redInvm());
- var nx = c.redSqr().redISub(this.x).redISub(p.x);
- var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
- return this.curve.point(nx, ny);
- };
- Point.prototype.dbl = function dbl() {
- if (this.inf)
- return this;
- var ys1 = this.y.redAdd(this.y);
- if (ys1.cmpn(0) === 0)
- return this.curve.point(null, null);
- var a = this.curve.a;
- var x2 = this.x.redSqr();
- var dyinv = ys1.redInvm();
- var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv);
- var nx = c.redSqr().redISub(this.x.redAdd(this.x));
- var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
- return this.curve.point(nx, ny);
- };
- Point.prototype.getX = function getX() {
- return this.x.fromRed();
- };
- Point.prototype.getY = function getY() {
- return this.y.fromRed();
- };
- Point.prototype.mul = function mul(k) {
- k = new BN(k, 16);
- if (this.isInfinity())
- return this;
- else if (this._hasDoubles(k))
- return this.curve._fixedNafMul(this, k);
- else if (this.curve.endo)
- return this.curve._endoWnafMulAdd([this], [k]);
- else
- return this.curve._wnafMul(this, k);
- };
- Point.prototype.mulAdd = function mulAdd(k1, p2, k2) {
- var points = [this, p2];
- var coeffs = [k1, k2];
- if (this.curve.endo)
- return this.curve._endoWnafMulAdd(points, coeffs);
- else
- return this.curve._wnafMulAdd(1, points, coeffs, 2);
- };
- Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) {
- var points = [this, p2];
- var coeffs = [k1, k2];
- if (this.curve.endo)
- return this.curve._endoWnafMulAdd(points, coeffs, true);
- else
- return this.curve._wnafMulAdd(1, points, coeffs, 2, true);
- };
- Point.prototype.eq = function eq(p) {
- return this === p || this.inf === p.inf && (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0);
- };
- Point.prototype.neg = function neg(_precompute) {
- if (this.inf)
- return this;
- var res = this.curve.point(this.x, this.y.redNeg());
- if (_precompute && this.precomputed) {
- var pre = this.precomputed;
- var negate = function(p) {
- return p.neg();
- };
- res.precomputed = {
- naf: pre.naf && {
- wnd: pre.naf.wnd,
- points: pre.naf.points.map(negate)
- },
- doubles: pre.doubles && {
- step: pre.doubles.step,
- points: pre.doubles.points.map(negate)
- }
- };
- }
- return res;
- };
- Point.prototype.toJ = function toJ() {
- if (this.inf)
- return this.curve.jpoint(null, null, null);
- var res = this.curve.jpoint(this.x, this.y, this.curve.one);
- return res;
- };
- function JPoint(curve, x, y, z) {
- Base.BasePoint.call(this, curve, "jacobian");
- if (x === null && y === null && z === null) {
- this.x = this.curve.one;
- this.y = this.curve.one;
- this.z = new BN(0);
- } else {
- this.x = new BN(x, 16);
- this.y = new BN(y, 16);
- this.z = new BN(z, 16);
- }
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.y.red)
- this.y = this.y.toRed(this.curve.red);
- if (!this.z.red)
- this.z = this.z.toRed(this.curve.red);
- this.zOne = this.z === this.curve.one;
- }
- inherits(JPoint, Base.BasePoint);
- ShortCurve.prototype.jpoint = function jpoint(x, y, z) {
- return new JPoint(this, x, y, z);
- };
- JPoint.prototype.toP = function toP() {
- if (this.isInfinity())
- return this.curve.point(null, null);
- var zinv = this.z.redInvm();
- var zinv2 = zinv.redSqr();
- var ax = this.x.redMul(zinv2);
- var ay = this.y.redMul(zinv2).redMul(zinv);
- return this.curve.point(ax, ay);
- };
- JPoint.prototype.neg = function neg() {
- return this.curve.jpoint(this.x, this.y.redNeg(), this.z);
- };
- JPoint.prototype.add = function add(p) {
- if (this.isInfinity())
- return p;
- if (p.isInfinity())
- return this;
- var pz2 = p.z.redSqr();
- var z2 = this.z.redSqr();
- var u1 = this.x.redMul(pz2);
- var u2 = p.x.redMul(z2);
- var s1 = this.y.redMul(pz2.redMul(p.z));
- var s2 = p.y.redMul(z2.redMul(this.z));
- var h = u1.redSub(u2);
- var r = s1.redSub(s2);
- if (h.cmpn(0) === 0) {
- if (r.cmpn(0) !== 0)
- return this.curve.jpoint(null, null, null);
- else
- return this.dbl();
- }
- var h2 = h.redSqr();
- var h3 = h2.redMul(h);
- var v = u1.redMul(h2);
- var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
- var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
- var nz = this.z.redMul(p.z).redMul(h);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.mixedAdd = function mixedAdd(p) {
- if (this.isInfinity())
- return p.toJ();
- if (p.isInfinity())
- return this;
- var z2 = this.z.redSqr();
- var u1 = this.x;
- var u2 = p.x.redMul(z2);
- var s1 = this.y;
- var s2 = p.y.redMul(z2).redMul(this.z);
- var h = u1.redSub(u2);
- var r = s1.redSub(s2);
- if (h.cmpn(0) === 0) {
- if (r.cmpn(0) !== 0)
- return this.curve.jpoint(null, null, null);
- else
- return this.dbl();
- }
- var h2 = h.redSqr();
- var h3 = h2.redMul(h);
- var v = u1.redMul(h2);
- var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
- var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
- var nz = this.z.redMul(h);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.dblp = function dblp(pow) {
- if (pow === 0)
- return this;
- if (this.isInfinity())
- return this;
- if (!pow)
- return this.dbl();
- var i;
- if (this.curve.zeroA || this.curve.threeA) {
- var r = this;
- for (i = 0;i < pow; i++)
- r = r.dbl();
- return r;
- }
- var a = this.curve.a;
- var tinv = this.curve.tinv;
- var jx = this.x;
- var jy = this.y;
- var jz = this.z;
- var jz4 = jz.redSqr().redSqr();
- var jyd = jy.redAdd(jy);
- for (i = 0;i < pow; i++) {
- var jx2 = jx.redSqr();
- var jyd2 = jyd.redSqr();
- var jyd4 = jyd2.redSqr();
- var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));
- var t1 = jx.redMul(jyd2);
- var nx = c.redSqr().redISub(t1.redAdd(t1));
- var t2 = t1.redISub(nx);
- var dny = c.redMul(t2);
- dny = dny.redIAdd(dny).redISub(jyd4);
- var nz = jyd.redMul(jz);
- if (i + 1 < pow)
- jz4 = jz4.redMul(jyd4);
- jx = nx;
- jz = nz;
- jyd = dny;
- }
- return this.curve.jpoint(jx, jyd.redMul(tinv), jz);
- };
- JPoint.prototype.dbl = function dbl() {
- if (this.isInfinity())
- return this;
- if (this.curve.zeroA)
- return this._zeroDbl();
- else if (this.curve.threeA)
- return this._threeDbl();
- else
- return this._dbl();
- };
- JPoint.prototype._zeroDbl = function _zeroDbl() {
- var nx;
- var ny;
- var nz;
- if (this.zOne) {
- var xx = this.x.redSqr();
- var yy = this.y.redSqr();
- var yyyy = yy.redSqr();
- var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
- s = s.redIAdd(s);
- var m = xx.redAdd(xx).redIAdd(xx);
- var t = m.redSqr().redISub(s).redISub(s);
- var yyyy8 = yyyy.redIAdd(yyyy);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- nx = t;
- ny = m.redMul(s.redISub(t)).redISub(yyyy8);
- nz = this.y.redAdd(this.y);
- } else {
- var a = this.x.redSqr();
- var b = this.y.redSqr();
- var c = b.redSqr();
- var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c);
- d = d.redIAdd(d);
- var e = a.redAdd(a).redIAdd(a);
- var f = e.redSqr();
- var c8 = c.redIAdd(c);
- c8 = c8.redIAdd(c8);
- c8 = c8.redIAdd(c8);
- nx = f.redISub(d).redISub(d);
- ny = e.redMul(d.redISub(nx)).redISub(c8);
- nz = this.y.redMul(this.z);
- nz = nz.redIAdd(nz);
- }
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype._threeDbl = function _threeDbl() {
- var nx;
- var ny;
- var nz;
- if (this.zOne) {
- var xx = this.x.redSqr();
- var yy = this.y.redSqr();
- var yyyy = yy.redSqr();
- var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
- s = s.redIAdd(s);
- var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a);
- var t = m.redSqr().redISub(s).redISub(s);
- nx = t;
- var yyyy8 = yyyy.redIAdd(yyyy);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- ny = m.redMul(s.redISub(t)).redISub(yyyy8);
- nz = this.y.redAdd(this.y);
- } else {
- var delta = this.z.redSqr();
- var gamma = this.y.redSqr();
- var beta = this.x.redMul(gamma);
- var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta));
- alpha = alpha.redAdd(alpha).redIAdd(alpha);
- var beta4 = beta.redIAdd(beta);
- beta4 = beta4.redIAdd(beta4);
- var beta8 = beta4.redAdd(beta4);
- nx = alpha.redSqr().redISub(beta8);
- nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta);
- var ggamma8 = gamma.redSqr();
- ggamma8 = ggamma8.redIAdd(ggamma8);
- ggamma8 = ggamma8.redIAdd(ggamma8);
- ggamma8 = ggamma8.redIAdd(ggamma8);
- ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8);
- }
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype._dbl = function _dbl() {
- var a = this.curve.a;
- var jx = this.x;
- var jy = this.y;
- var jz = this.z;
- var jz4 = jz.redSqr().redSqr();
- var jx2 = jx.redSqr();
- var jy2 = jy.redSqr();
- var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));
- var jxd4 = jx.redAdd(jx);
- jxd4 = jxd4.redIAdd(jxd4);
- var t1 = jxd4.redMul(jy2);
- var nx = c.redSqr().redISub(t1.redAdd(t1));
- var t2 = t1.redISub(nx);
- var jyd8 = jy2.redSqr();
- jyd8 = jyd8.redIAdd(jyd8);
- jyd8 = jyd8.redIAdd(jyd8);
- jyd8 = jyd8.redIAdd(jyd8);
- var ny = c.redMul(t2).redISub(jyd8);
- var nz = jy.redAdd(jy).redMul(jz);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.trpl = function trpl() {
- if (!this.curve.zeroA)
- return this.dbl().add(this);
- var xx = this.x.redSqr();
- var yy = this.y.redSqr();
- var zz = this.z.redSqr();
- var yyyy = yy.redSqr();
- var m = xx.redAdd(xx).redIAdd(xx);
- var mm = m.redSqr();
- var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
- e = e.redIAdd(e);
- e = e.redAdd(e).redIAdd(e);
- e = e.redISub(mm);
- var ee = e.redSqr();
- var t = yyyy.redIAdd(yyyy);
- t = t.redIAdd(t);
- t = t.redIAdd(t);
- t = t.redIAdd(t);
- var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t);
- var yyu4 = yy.redMul(u);
- yyu4 = yyu4.redIAdd(yyu4);
- yyu4 = yyu4.redIAdd(yyu4);
- var nx = this.x.redMul(ee).redISub(yyu4);
- nx = nx.redIAdd(nx);
- nx = nx.redIAdd(nx);
- var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee)));
- ny = ny.redIAdd(ny);
- ny = ny.redIAdd(ny);
- ny = ny.redIAdd(ny);
- var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.mul = function mul(k, kbase) {
- k = new BN(k, kbase);
- return this.curve._wnafMul(this, k);
- };
- JPoint.prototype.eq = function eq(p) {
- if (p.type === "affine")
- return this.eq(p.toJ());
- if (this === p)
- return true;
- var z2 = this.z.redSqr();
- var pz2 = p.z.redSqr();
- if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0)
- return false;
- var z3 = z2.redMul(this.z);
- var pz3 = pz2.redMul(p.z);
- return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0;
- };
- JPoint.prototype.eqXToP = function eqXToP(x) {
- var zs = this.z.redSqr();
- var rx = x.toRed(this.curve.red).redMul(zs);
- if (this.x.cmp(rx) === 0)
- return true;
- var xc = x.clone();
- var t = this.curve.redN.redMul(zs);
- for (;; ) {
- xc.iadd(this.curve.n);
- if (xc.cmp(this.curve.p) >= 0)
- return false;
- rx.redIAdd(t);
- if (this.x.cmp(rx) === 0)
- return true;
- }
- };
- JPoint.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- JPoint.prototype.isInfinity = function isInfinity() {
- return this.z.cmpn(0) === 0;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/mont.js
-var require_mont = __commonJS((exports, module) => {
- var BN = require_bn();
- var inherits = require_inherits();
- var Base = require_base2();
- var utils = require_utils2();
- function MontCurve(conf) {
- Base.call(this, "mont", conf);
- this.a = new BN(conf.a, 16).toRed(this.red);
- this.b = new BN(conf.b, 16).toRed(this.red);
- this.i4 = new BN(4).toRed(this.red).redInvm();
- this.two = new BN(2).toRed(this.red);
- this.a24 = this.i4.redMul(this.a.redAdd(this.two));
- }
- inherits(MontCurve, Base);
- module.exports = MontCurve;
- MontCurve.prototype.validate = function validate(point) {
- var x = point.normalize().x;
- var x2 = x.redSqr();
- var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x);
- var y = rhs.redSqrt();
- return y.redSqr().cmp(rhs) === 0;
- };
- function Point(curve, x, z) {
- Base.BasePoint.call(this, curve, "projective");
- if (x === null && z === null) {
- this.x = this.curve.one;
- this.z = this.curve.zero;
- } else {
- this.x = new BN(x, 16);
- this.z = new BN(z, 16);
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.z.red)
- this.z = this.z.toRed(this.curve.red);
- }
- }
- inherits(Point, Base.BasePoint);
- MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
- return this.point(utils.toArray(bytes, enc), 1);
- };
- MontCurve.prototype.point = function point(x, z) {
- return new Point(this, x, z);
- };
- MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
- return Point.fromJSON(this, obj);
- };
- Point.prototype.precompute = function precompute() {};
- Point.prototype._encode = function _encode() {
- return this.getX().toArray("be", this.curve.p.byteLength());
- };
- Point.fromJSON = function fromJSON(curve, obj) {
- return new Point(curve, obj[0], obj[1] || curve.one);
- };
- Point.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- Point.prototype.isInfinity = function isInfinity() {
- return this.z.cmpn(0) === 0;
- };
- Point.prototype.dbl = function dbl() {
- var a = this.x.redAdd(this.z);
- var aa = a.redSqr();
- var b = this.x.redSub(this.z);
- var bb = b.redSqr();
- var c = aa.redSub(bb);
- var nx = aa.redMul(bb);
- var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c)));
- return this.curve.point(nx, nz);
- };
- Point.prototype.add = function add() {
- throw new Error("Not supported on Montgomery curve");
- };
- Point.prototype.diffAdd = function diffAdd(p, diff) {
- var a = this.x.redAdd(this.z);
- var b = this.x.redSub(this.z);
- var c = p.x.redAdd(p.z);
- var d = p.x.redSub(p.z);
- var da = d.redMul(a);
- var cb = c.redMul(b);
- var nx = diff.z.redMul(da.redAdd(cb).redSqr());
- var nz = diff.x.redMul(da.redISub(cb).redSqr());
- return this.curve.point(nx, nz);
- };
- Point.prototype.mul = function mul(k) {
- var t = k.clone();
- var a = this;
- var b = this.curve.point(null, null);
- var c = this;
- for (var bits = [];t.cmpn(0) !== 0; t.iushrn(1))
- bits.push(t.andln(1));
- for (var i = bits.length - 1;i >= 0; i--) {
- if (bits[i] === 0) {
- a = a.diffAdd(b, c);
- b = b.dbl();
- } else {
- b = a.diffAdd(b, c);
- a = a.dbl();
- }
- }
- return b;
- };
- Point.prototype.mulAdd = function mulAdd() {
- throw new Error("Not supported on Montgomery curve");
- };
- Point.prototype.jumlAdd = function jumlAdd() {
- throw new Error("Not supported on Montgomery curve");
- };
- Point.prototype.eq = function eq(other) {
- return this.getX().cmp(other.getX()) === 0;
- };
- Point.prototype.normalize = function normalize() {
- this.x = this.x.redMul(this.z.redInvm());
- this.z = this.curve.one;
- return this;
- };
- Point.prototype.getX = function getX() {
- this.normalize();
- return this.x.fromRed();
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/edwards.js
-var require_edwards = __commonJS((exports, module) => {
- var utils = require_utils2();
- var BN = require_bn();
- var inherits = require_inherits();
- var Base = require_base2();
- var assert = utils.assert;
- function EdwardsCurve(conf) {
- this.twisted = (conf.a | 0) !== 1;
- this.mOneA = this.twisted && (conf.a | 0) === -1;
- this.extended = this.mOneA;
- Base.call(this, "edwards", conf);
- this.a = new BN(conf.a, 16).umod(this.red.m);
- this.a = this.a.toRed(this.red);
- this.c = new BN(conf.c, 16).toRed(this.red);
- this.c2 = this.c.redSqr();
- this.d = new BN(conf.d, 16).toRed(this.red);
- this.dd = this.d.redAdd(this.d);
- assert(!this.twisted || this.c.fromRed().cmpn(1) === 0);
- this.oneC = (conf.c | 0) === 1;
- }
- inherits(EdwardsCurve, Base);
- module.exports = EdwardsCurve;
- EdwardsCurve.prototype._mulA = function _mulA(num) {
- if (this.mOneA)
- return num.redNeg();
- else
- return this.a.redMul(num);
- };
- EdwardsCurve.prototype._mulC = function _mulC(num) {
- if (this.oneC)
- return num;
- else
- return this.c.redMul(num);
- };
- EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) {
- return this.point(x, y, z, t);
- };
- EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) {
- x = new BN(x, 16);
- if (!x.red)
- x = x.toRed(this.red);
- var x2 = x.redSqr();
- var rhs = this.c2.redSub(this.a.redMul(x2));
- var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2));
- var y2 = rhs.redMul(lhs.redInvm());
- var y = y2.redSqrt();
- if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
- throw new Error("invalid point");
- var isOdd = y.fromRed().isOdd();
- if (odd && !isOdd || !odd && isOdd)
- y = y.redNeg();
- return this.point(x, y);
- };
- EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) {
- y = new BN(y, 16);
- if (!y.red)
- y = y.toRed(this.red);
- var y2 = y.redSqr();
- var lhs = y2.redSub(this.c2);
- var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a);
- var x2 = lhs.redMul(rhs.redInvm());
- if (x2.cmp(this.zero) === 0) {
- if (odd)
- throw new Error("invalid point");
- else
- return this.point(this.zero, y);
- }
- var x = x2.redSqrt();
- if (x.redSqr().redSub(x2).cmp(this.zero) !== 0)
- throw new Error("invalid point");
- if (x.fromRed().isOdd() !== odd)
- x = x.redNeg();
- return this.point(x, y);
- };
- EdwardsCurve.prototype.validate = function validate(point) {
- if (point.isInfinity())
- return true;
- point.normalize();
- var x2 = point.x.redSqr();
- var y2 = point.y.redSqr();
- var lhs = x2.redMul(this.a).redAdd(y2);
- var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2)));
- return lhs.cmp(rhs) === 0;
- };
- function Point(curve, x, y, z, t) {
- Base.BasePoint.call(this, curve, "projective");
- if (x === null && y === null && z === null) {
- this.x = this.curve.zero;
- this.y = this.curve.one;
- this.z = this.curve.one;
- this.t = this.curve.zero;
- this.zOne = true;
- } else {
- this.x = new BN(x, 16);
- this.y = new BN(y, 16);
- this.z = z ? new BN(z, 16) : this.curve.one;
- this.t = t && new BN(t, 16);
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.y.red)
- this.y = this.y.toRed(this.curve.red);
- if (!this.z.red)
- this.z = this.z.toRed(this.curve.red);
- if (this.t && !this.t.red)
- this.t = this.t.toRed(this.curve.red);
- this.zOne = this.z === this.curve.one;
- if (this.curve.extended && !this.t) {
- this.t = this.x.redMul(this.y);
- if (!this.zOne)
- this.t = this.t.redMul(this.z.redInvm());
- }
- }
- }
- inherits(Point, Base.BasePoint);
- EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
- return Point.fromJSON(this, obj);
- };
- EdwardsCurve.prototype.point = function point(x, y, z, t) {
- return new Point(this, x, y, z, t);
- };
- Point.fromJSON = function fromJSON(curve, obj) {
- return new Point(curve, obj[0], obj[1], obj[2]);
- };
- Point.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- Point.prototype.isInfinity = function isInfinity() {
- return this.x.cmpn(0) === 0 && (this.y.cmp(this.z) === 0 || this.zOne && this.y.cmp(this.curve.c) === 0);
- };
- Point.prototype._extDbl = function _extDbl() {
- var a = this.x.redSqr();
- var b = this.y.redSqr();
- var c = this.z.redSqr();
- c = c.redIAdd(c);
- var d = this.curve._mulA(a);
- var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b);
- var g = d.redAdd(b);
- var f = g.redSub(c);
- var h = d.redSub(b);
- var nx = e.redMul(f);
- var ny = g.redMul(h);
- var nt = e.redMul(h);
- var nz = f.redMul(g);
- return this.curve.point(nx, ny, nz, nt);
- };
- Point.prototype._projDbl = function _projDbl() {
- var b = this.x.redAdd(this.y).redSqr();
- var c = this.x.redSqr();
- var d = this.y.redSqr();
- var nx;
- var ny;
- var nz;
- var e;
- var h;
- var j;
- if (this.curve.twisted) {
- e = this.curve._mulA(c);
- var f = e.redAdd(d);
- if (this.zOne) {
- nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two));
- ny = f.redMul(e.redSub(d));
- nz = f.redSqr().redSub(f).redSub(f);
- } else {
- h = this.z.redSqr();
- j = f.redSub(h).redISub(h);
- nx = b.redSub(c).redISub(d).redMul(j);
- ny = f.redMul(e.redSub(d));
- nz = f.redMul(j);
- }
- } else {
- e = c.redAdd(d);
- h = this.curve._mulC(this.z).redSqr();
- j = e.redSub(h).redSub(h);
- nx = this.curve._mulC(b.redISub(e)).redMul(j);
- ny = this.curve._mulC(e).redMul(c.redISub(d));
- nz = e.redMul(j);
- }
- return this.curve.point(nx, ny, nz);
- };
- Point.prototype.dbl = function dbl() {
- if (this.isInfinity())
- return this;
- if (this.curve.extended)
- return this._extDbl();
- else
- return this._projDbl();
- };
- Point.prototype._extAdd = function _extAdd(p) {
- var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x));
- var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x));
- var c = this.t.redMul(this.curve.dd).redMul(p.t);
- var d = this.z.redMul(p.z.redAdd(p.z));
- var e = b.redSub(a);
- var f = d.redSub(c);
- var g = d.redAdd(c);
- var h = b.redAdd(a);
- var nx = e.redMul(f);
- var ny = g.redMul(h);
- var nt = e.redMul(h);
- var nz = f.redMul(g);
- return this.curve.point(nx, ny, nz, nt);
- };
- Point.prototype._projAdd = function _projAdd(p) {
- var a = this.z.redMul(p.z);
- var b = a.redSqr();
- var c = this.x.redMul(p.x);
- var d = this.y.redMul(p.y);
- var e = this.curve.d.redMul(c).redMul(d);
- var f = b.redSub(e);
- var g = b.redAdd(e);
- var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d);
- var nx = a.redMul(f).redMul(tmp);
- var ny;
- var nz;
- if (this.curve.twisted) {
- ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c)));
- nz = f.redMul(g);
- } else {
- ny = a.redMul(g).redMul(d.redSub(c));
- nz = this.curve._mulC(f).redMul(g);
- }
- return this.curve.point(nx, ny, nz);
- };
- Point.prototype.add = function add(p) {
- if (this.isInfinity())
- return p;
- if (p.isInfinity())
- return this;
- if (this.curve.extended)
- return this._extAdd(p);
- else
- return this._projAdd(p);
- };
- Point.prototype.mul = function mul(k) {
- if (this._hasDoubles(k))
- return this.curve._fixedNafMul(this, k);
- else
- return this.curve._wnafMul(this, k);
- };
- Point.prototype.mulAdd = function mulAdd(k1, p, k2) {
- return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, false);
- };
- Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) {
- return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, true);
- };
- Point.prototype.normalize = function normalize() {
- if (this.zOne)
- return this;
- var zi = this.z.redInvm();
- this.x = this.x.redMul(zi);
- this.y = this.y.redMul(zi);
- if (this.t)
- this.t = this.t.redMul(zi);
- this.z = this.curve.one;
- this.zOne = true;
- return this;
- };
- Point.prototype.neg = function neg() {
- return this.curve.point(this.x.redNeg(), this.y, this.z, this.t && this.t.redNeg());
- };
- Point.prototype.getX = function getX() {
- this.normalize();
- return this.x.fromRed();
- };
- Point.prototype.getY = function getY() {
- this.normalize();
- return this.y.fromRed();
- };
- Point.prototype.eq = function eq(other) {
- return this === other || this.getX().cmp(other.getX()) === 0 && this.getY().cmp(other.getY()) === 0;
- };
- Point.prototype.eqXToP = function eqXToP(x) {
- var rx = x.toRed(this.curve.red).redMul(this.z);
- if (this.x.cmp(rx) === 0)
- return true;
- var xc = x.clone();
- var t = this.curve.redN.redMul(this.z);
- for (;; ) {
- xc.iadd(this.curve.n);
- if (xc.cmp(this.curve.p) >= 0)
- return false;
- rx.redIAdd(t);
- if (this.x.cmp(rx) === 0)
- return true;
- }
- };
- Point.prototype.toP = Point.prototype.normalize;
- Point.prototype.mixedAdd = Point.prototype.add;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/index.js
-var require_curve = __commonJS((exports) => {
- var curve = exports;
- curve.base = require_base2();
- curve.short = require_short();
- curve.mont = require_mont();
- curve.edwards = require_edwards();
-});
-
-// ../eve/node_modules/hash.js/lib/hash/utils.js
-var require_utils3 = __commonJS((exports) => {
- var assert = require_minimalistic_assert();
- var inherits = require_inherits();
- exports.inherits = inherits;
- function isSurrogatePair(msg, i) {
- if ((msg.charCodeAt(i) & 64512) !== 55296) {
- return false;
- }
- if (i < 0 || i + 1 >= msg.length) {
- return false;
- }
- return (msg.charCodeAt(i + 1) & 64512) === 56320;
- }
- function toArray(msg, enc) {
- if (Array.isArray(msg))
- return msg.slice();
- if (!msg)
- return [];
- var res = [];
- if (typeof msg === "string") {
- if (!enc) {
- var p = 0;
- for (var i = 0;i < msg.length; i++) {
- var c = msg.charCodeAt(i);
- if (c < 128) {
- res[p++] = c;
- } else if (c < 2048) {
- res[p++] = c >> 6 | 192;
- res[p++] = c & 63 | 128;
- } else if (isSurrogatePair(msg, i)) {
- c = 65536 + ((c & 1023) << 10) + (msg.charCodeAt(++i) & 1023);
- res[p++] = c >> 18 | 240;
- res[p++] = c >> 12 & 63 | 128;
- res[p++] = c >> 6 & 63 | 128;
- res[p++] = c & 63 | 128;
- } else {
- res[p++] = c >> 12 | 224;
- res[p++] = c >> 6 & 63 | 128;
- res[p++] = c & 63 | 128;
- }
- }
- } else if (enc === "hex") {
- msg = msg.replace(/[^a-z0-9]+/ig, "");
- if (msg.length % 2 !== 0)
- msg = "0" + msg;
- for (i = 0;i < msg.length; i += 2)
- res.push(parseInt(msg[i] + msg[i + 1], 16));
- }
- } else {
- for (i = 0;i < msg.length; i++)
- res[i] = msg[i] | 0;
- }
- return res;
- }
- exports.toArray = toArray;
- function toHex(msg) {
- var res = "";
- for (var i = 0;i < msg.length; i++)
- res += zero2(msg[i].toString(16));
- return res;
- }
- exports.toHex = toHex;
- function htonl(w) {
- var res = w >>> 24 | w >>> 8 & 65280 | w << 8 & 16711680 | (w & 255) << 24;
- return res >>> 0;
- }
- exports.htonl = htonl;
- function toHex32(msg, endian) {
- var res = "";
- for (var i = 0;i < msg.length; i++) {
- var w = msg[i];
- if (endian === "little")
- w = htonl(w);
- res += zero8(w.toString(16));
- }
- return res;
- }
- exports.toHex32 = toHex32;
- function zero2(word) {
- if (word.length === 1)
- return "0" + word;
- else
- return word;
- }
- exports.zero2 = zero2;
- function zero8(word) {
- if (word.length === 7)
- return "0" + word;
- else if (word.length === 6)
- return "00" + word;
- else if (word.length === 5)
- return "000" + word;
- else if (word.length === 4)
- return "0000" + word;
- else if (word.length === 3)
- return "00000" + word;
- else if (word.length === 2)
- return "000000" + word;
- else if (word.length === 1)
- return "0000000" + word;
- else
- return word;
- }
- exports.zero8 = zero8;
- function join32(msg, start, end, endian) {
- var len = end - start;
- assert(len % 4 === 0);
- var res = new Array(len / 4);
- for (var i = 0, k = start;i < res.length; i++, k += 4) {
- var w;
- if (endian === "big")
- w = msg[k] << 24 | msg[k + 1] << 16 | msg[k + 2] << 8 | msg[k + 3];
- else
- w = msg[k + 3] << 24 | msg[k + 2] << 16 | msg[k + 1] << 8 | msg[k];
- res[i] = w >>> 0;
- }
- return res;
- }
- exports.join32 = join32;
- function split32(msg, endian) {
- var res = new Array(msg.length * 4);
- for (var i = 0, k = 0;i < msg.length; i++, k += 4) {
- var m = msg[i];
- if (endian === "big") {
- res[k] = m >>> 24;
- res[k + 1] = m >>> 16 & 255;
- res[k + 2] = m >>> 8 & 255;
- res[k + 3] = m & 255;
- } else {
- res[k + 3] = m >>> 24;
- res[k + 2] = m >>> 16 & 255;
- res[k + 1] = m >>> 8 & 255;
- res[k] = m & 255;
- }
- }
- return res;
- }
- exports.split32 = split32;
- function rotr32(w, b) {
- return w >>> b | w << 32 - b;
- }
- exports.rotr32 = rotr32;
- function rotl32(w, b) {
- return w << b | w >>> 32 - b;
- }
- exports.rotl32 = rotl32;
- function sum32(a, b) {
- return a + b >>> 0;
- }
- exports.sum32 = sum32;
- function sum32_3(a, b, c) {
- return a + b + c >>> 0;
- }
- exports.sum32_3 = sum32_3;
- function sum32_4(a, b, c, d) {
- return a + b + c + d >>> 0;
- }
- exports.sum32_4 = sum32_4;
- function sum32_5(a, b, c, d, e) {
- return a + b + c + d + e >>> 0;
- }
- exports.sum32_5 = sum32_5;
- function sum64(buf, pos, ah, al) {
- var bh = buf[pos];
- var bl = buf[pos + 1];
- var lo = al + bl >>> 0;
- var hi = (lo < al ? 1 : 0) + ah + bh;
- buf[pos] = hi >>> 0;
- buf[pos + 1] = lo;
- }
- exports.sum64 = sum64;
- function sum64_hi(ah, al, bh, bl) {
- var lo = al + bl >>> 0;
- var hi = (lo < al ? 1 : 0) + ah + bh;
- return hi >>> 0;
- }
- exports.sum64_hi = sum64_hi;
- function sum64_lo(ah, al, bh, bl) {
- var lo = al + bl;
- return lo >>> 0;
- }
- exports.sum64_lo = sum64_lo;
- function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) {
- var carry = 0;
- var lo = al;
- lo = lo + bl >>> 0;
- carry += lo < al ? 1 : 0;
- lo = lo + cl >>> 0;
- carry += lo < cl ? 1 : 0;
- lo = lo + dl >>> 0;
- carry += lo < dl ? 1 : 0;
- var hi = ah + bh + ch + dh + carry;
- return hi >>> 0;
- }
- exports.sum64_4_hi = sum64_4_hi;
- function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) {
- var lo = al + bl + cl + dl;
- return lo >>> 0;
- }
- exports.sum64_4_lo = sum64_4_lo;
- function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
- var carry = 0;
- var lo = al;
- lo = lo + bl >>> 0;
- carry += lo < al ? 1 : 0;
- lo = lo + cl >>> 0;
- carry += lo < cl ? 1 : 0;
- lo = lo + dl >>> 0;
- carry += lo < dl ? 1 : 0;
- lo = lo + el >>> 0;
- carry += lo < el ? 1 : 0;
- var hi = ah + bh + ch + dh + eh + carry;
- return hi >>> 0;
- }
- exports.sum64_5_hi = sum64_5_hi;
- function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
- var lo = al + bl + cl + dl + el;
- return lo >>> 0;
- }
- exports.sum64_5_lo = sum64_5_lo;
- function rotr64_hi(ah, al, num) {
- var r = al << 32 - num | ah >>> num;
- return r >>> 0;
- }
- exports.rotr64_hi = rotr64_hi;
- function rotr64_lo(ah, al, num) {
- var r = ah << 32 - num | al >>> num;
- return r >>> 0;
- }
- exports.rotr64_lo = rotr64_lo;
- function shr64_hi(ah, al, num) {
- return ah >>> num;
- }
- exports.shr64_hi = shr64_hi;
- function shr64_lo(ah, al, num) {
- var r = ah << 32 - num | al >>> num;
- return r >>> 0;
- }
- exports.shr64_lo = shr64_lo;
-});
-
-// ../eve/node_modules/hash.js/lib/hash/common.js
-var require_common = __commonJS((exports) => {
- var utils = require_utils3();
- var assert = require_minimalistic_assert();
- function BlockHash() {
- this.pending = null;
- this.pendingTotal = 0;
- this.blockSize = this.constructor.blockSize;
- this.outSize = this.constructor.outSize;
- this.hmacStrength = this.constructor.hmacStrength;
- this.padLength = this.constructor.padLength / 8;
- this.endian = "big";
- this._delta8 = this.blockSize / 8;
- this._delta32 = this.blockSize / 32;
- }
- exports.BlockHash = BlockHash;
- BlockHash.prototype.update = function update(msg, enc) {
- msg = utils.toArray(msg, enc);
- if (!this.pending)
- this.pending = msg;
- else
- this.pending = this.pending.concat(msg);
- this.pendingTotal += msg.length;
- if (this.pending.length >= this._delta8) {
- msg = this.pending;
- var r = msg.length % this._delta8;
- this.pending = msg.slice(msg.length - r, msg.length);
- if (this.pending.length === 0)
- this.pending = null;
- msg = utils.join32(msg, 0, msg.length - r, this.endian);
- for (var i = 0;i < msg.length; i += this._delta32)
- this._update(msg, i, i + this._delta32);
- }
- return this;
- };
- BlockHash.prototype.digest = function digest(enc) {
- this.update(this._pad());
- assert(this.pending === null);
- return this._digest(enc);
- };
- BlockHash.prototype._pad = function pad() {
- var len = this.pendingTotal;
- var bytes = this._delta8;
- var k = bytes - (len + this.padLength) % bytes;
- var res = new Array(k + this.padLength);
- res[0] = 128;
- for (var i = 1;i < k; i++)
- res[i] = 0;
- len <<= 3;
- if (this.endian === "big") {
- for (var t = 8;t < this.padLength; t++)
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = len >>> 24 & 255;
- res[i++] = len >>> 16 & 255;
- res[i++] = len >>> 8 & 255;
- res[i++] = len & 255;
- } else {
- res[i++] = len & 255;
- res[i++] = len >>> 8 & 255;
- res[i++] = len >>> 16 & 255;
- res[i++] = len >>> 24 & 255;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- for (t = 8;t < this.padLength; t++)
- res[i++] = 0;
- }
- return res;
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/common.js
-var require_common2 = __commonJS((exports) => {
- var utils = require_utils3();
- var rotr32 = utils.rotr32;
- function ft_1(s, x, y, z) {
- if (s === 0)
- return ch32(x, y, z);
- if (s === 1 || s === 3)
- return p32(x, y, z);
- if (s === 2)
- return maj32(x, y, z);
- }
- exports.ft_1 = ft_1;
- function ch32(x, y, z) {
- return x & y ^ ~x & z;
- }
- exports.ch32 = ch32;
- function maj32(x, y, z) {
- return x & y ^ x & z ^ y & z;
- }
- exports.maj32 = maj32;
- function p32(x, y, z) {
- return x ^ y ^ z;
- }
- exports.p32 = p32;
- function s0_256(x) {
- return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22);
- }
- exports.s0_256 = s0_256;
- function s1_256(x) {
- return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25);
- }
- exports.s1_256 = s1_256;
- function g0_256(x) {
- return rotr32(x, 7) ^ rotr32(x, 18) ^ x >>> 3;
- }
- exports.g0_256 = g0_256;
- function g1_256(x) {
- return rotr32(x, 17) ^ rotr32(x, 19) ^ x >>> 10;
- }
- exports.g1_256 = g1_256;
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/1.js
-var require_1 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var common = require_common();
- var shaCommon = require_common2();
- var rotl32 = utils.rotl32;
- var sum32 = utils.sum32;
- var sum32_5 = utils.sum32_5;
- var ft_1 = shaCommon.ft_1;
- var BlockHash = common.BlockHash;
- var sha1_K = [
- 1518500249,
- 1859775393,
- 2400959708,
- 3395469782
- ];
- function SHA1() {
- if (!(this instanceof SHA1))
- return new SHA1;
- BlockHash.call(this);
- this.h = [
- 1732584193,
- 4023233417,
- 2562383102,
- 271733878,
- 3285377520
- ];
- this.W = new Array(80);
- }
- utils.inherits(SHA1, BlockHash);
- module.exports = SHA1;
- SHA1.blockSize = 512;
- SHA1.outSize = 160;
- SHA1.hmacStrength = 80;
- SHA1.padLength = 64;
- SHA1.prototype._update = function _update(msg, start) {
- var W = this.W;
- for (var i = 0;i < 16; i++)
- W[i] = msg[start + i];
- for (;i < W.length; i++)
- W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
- var a = this.h[0];
- var b = this.h[1];
- var c = this.h[2];
- var d = this.h[3];
- var e = this.h[4];
- for (i = 0;i < W.length; i++) {
- var s = ~~(i / 20);
- var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]);
- e = d;
- d = c;
- c = rotl32(b, 30);
- b = a;
- a = t;
- }
- this.h[0] = sum32(this.h[0], a);
- this.h[1] = sum32(this.h[1], b);
- this.h[2] = sum32(this.h[2], c);
- this.h[3] = sum32(this.h[3], d);
- this.h[4] = sum32(this.h[4], e);
- };
- SHA1.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "big");
- else
- return utils.split32(this.h, "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/256.js
-var require_256 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var common = require_common();
- var shaCommon = require_common2();
- var assert = require_minimalistic_assert();
- var sum32 = utils.sum32;
- var sum32_4 = utils.sum32_4;
- var sum32_5 = utils.sum32_5;
- var ch32 = shaCommon.ch32;
- var maj32 = shaCommon.maj32;
- var s0_256 = shaCommon.s0_256;
- var s1_256 = shaCommon.s1_256;
- var g0_256 = shaCommon.g0_256;
- var g1_256 = shaCommon.g1_256;
- var BlockHash = common.BlockHash;
- var sha256_K = [
- 1116352408,
- 1899447441,
- 3049323471,
- 3921009573,
- 961987163,
- 1508970993,
- 2453635748,
- 2870763221,
- 3624381080,
- 310598401,
- 607225278,
- 1426881987,
- 1925078388,
- 2162078206,
- 2614888103,
- 3248222580,
- 3835390401,
- 4022224774,
- 264347078,
- 604807628,
- 770255983,
- 1249150122,
- 1555081692,
- 1996064986,
- 2554220882,
- 2821834349,
- 2952996808,
- 3210313671,
- 3336571891,
- 3584528711,
- 113926993,
- 338241895,
- 666307205,
- 773529912,
- 1294757372,
- 1396182291,
- 1695183700,
- 1986661051,
- 2177026350,
- 2456956037,
- 2730485921,
- 2820302411,
- 3259730800,
- 3345764771,
- 3516065817,
- 3600352804,
- 4094571909,
- 275423344,
- 430227734,
- 506948616,
- 659060556,
- 883997877,
- 958139571,
- 1322822218,
- 1537002063,
- 1747873779,
- 1955562222,
- 2024104815,
- 2227730452,
- 2361852424,
- 2428436474,
- 2756734187,
- 3204031479,
- 3329325298
- ];
- function SHA256() {
- if (!(this instanceof SHA256))
- return new SHA256;
- BlockHash.call(this);
- this.h = [
- 1779033703,
- 3144134277,
- 1013904242,
- 2773480762,
- 1359893119,
- 2600822924,
- 528734635,
- 1541459225
- ];
- this.k = sha256_K;
- this.W = new Array(64);
- }
- utils.inherits(SHA256, BlockHash);
- module.exports = SHA256;
- SHA256.blockSize = 512;
- SHA256.outSize = 256;
- SHA256.hmacStrength = 192;
- SHA256.padLength = 64;
- SHA256.prototype._update = function _update(msg, start) {
- var W = this.W;
- for (var i = 0;i < 16; i++)
- W[i] = msg[start + i];
- for (;i < W.length; i++)
- W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]);
- var a = this.h[0];
- var b = this.h[1];
- var c = this.h[2];
- var d = this.h[3];
- var e = this.h[4];
- var f = this.h[5];
- var g = this.h[6];
- var h = this.h[7];
- assert(this.k.length === W.length);
- for (i = 0;i < W.length; i++) {
- var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]);
- var T2 = sum32(s0_256(a), maj32(a, b, c));
- h = g;
- g = f;
- f = e;
- e = sum32(d, T1);
- d = c;
- c = b;
- b = a;
- a = sum32(T1, T2);
- }
- this.h[0] = sum32(this.h[0], a);
- this.h[1] = sum32(this.h[1], b);
- this.h[2] = sum32(this.h[2], c);
- this.h[3] = sum32(this.h[3], d);
- this.h[4] = sum32(this.h[4], e);
- this.h[5] = sum32(this.h[5], f);
- this.h[6] = sum32(this.h[6], g);
- this.h[7] = sum32(this.h[7], h);
- };
- SHA256.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "big");
- else
- return utils.split32(this.h, "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/224.js
-var require_224 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var SHA256 = require_256();
- function SHA224() {
- if (!(this instanceof SHA224))
- return new SHA224;
- SHA256.call(this);
- this.h = [
- 3238371032,
- 914150663,
- 812702999,
- 4144912697,
- 4290775857,
- 1750603025,
- 1694076839,
- 3204075428
- ];
- }
- utils.inherits(SHA224, SHA256);
- module.exports = SHA224;
- SHA224.blockSize = 512;
- SHA224.outSize = 224;
- SHA224.hmacStrength = 192;
- SHA224.padLength = 64;
- SHA224.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h.slice(0, 7), "big");
- else
- return utils.split32(this.h.slice(0, 7), "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/512.js
-var require_512 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var common = require_common();
- var assert = require_minimalistic_assert();
- var rotr64_hi = utils.rotr64_hi;
- var rotr64_lo = utils.rotr64_lo;
- var shr64_hi = utils.shr64_hi;
- var shr64_lo = utils.shr64_lo;
- var sum64 = utils.sum64;
- var sum64_hi = utils.sum64_hi;
- var sum64_lo = utils.sum64_lo;
- var sum64_4_hi = utils.sum64_4_hi;
- var sum64_4_lo = utils.sum64_4_lo;
- var sum64_5_hi = utils.sum64_5_hi;
- var sum64_5_lo = utils.sum64_5_lo;
- var BlockHash = common.BlockHash;
- var sha512_K = [
- 1116352408,
- 3609767458,
- 1899447441,
- 602891725,
- 3049323471,
- 3964484399,
- 3921009573,
- 2173295548,
- 961987163,
- 4081628472,
- 1508970993,
- 3053834265,
- 2453635748,
- 2937671579,
- 2870763221,
- 3664609560,
- 3624381080,
- 2734883394,
- 310598401,
- 1164996542,
- 607225278,
- 1323610764,
- 1426881987,
- 3590304994,
- 1925078388,
- 4068182383,
- 2162078206,
- 991336113,
- 2614888103,
- 633803317,
- 3248222580,
- 3479774868,
- 3835390401,
- 2666613458,
- 4022224774,
- 944711139,
- 264347078,
- 2341262773,
- 604807628,
- 2007800933,
- 770255983,
- 1495990901,
- 1249150122,
- 1856431235,
- 1555081692,
- 3175218132,
- 1996064986,
- 2198950837,
- 2554220882,
- 3999719339,
- 2821834349,
- 766784016,
- 2952996808,
- 2566594879,
- 3210313671,
- 3203337956,
- 3336571891,
- 1034457026,
- 3584528711,
- 2466948901,
- 113926993,
- 3758326383,
- 338241895,
- 168717936,
- 666307205,
- 1188179964,
- 773529912,
- 1546045734,
- 1294757372,
- 1522805485,
- 1396182291,
- 2643833823,
- 1695183700,
- 2343527390,
- 1986661051,
- 1014477480,
- 2177026350,
- 1206759142,
- 2456956037,
- 344077627,
- 2730485921,
- 1290863460,
- 2820302411,
- 3158454273,
- 3259730800,
- 3505952657,
- 3345764771,
- 106217008,
- 3516065817,
- 3606008344,
- 3600352804,
- 1432725776,
- 4094571909,
- 1467031594,
- 275423344,
- 851169720,
- 430227734,
- 3100823752,
- 506948616,
- 1363258195,
- 659060556,
- 3750685593,
- 883997877,
- 3785050280,
- 958139571,
- 3318307427,
- 1322822218,
- 3812723403,
- 1537002063,
- 2003034995,
- 1747873779,
- 3602036899,
- 1955562222,
- 1575990012,
- 2024104815,
- 1125592928,
- 2227730452,
- 2716904306,
- 2361852424,
- 442776044,
- 2428436474,
- 593698344,
- 2756734187,
- 3733110249,
- 3204031479,
- 2999351573,
- 3329325298,
- 3815920427,
- 3391569614,
- 3928383900,
- 3515267271,
- 566280711,
- 3940187606,
- 3454069534,
- 4118630271,
- 4000239992,
- 116418474,
- 1914138554,
- 174292421,
- 2731055270,
- 289380356,
- 3203993006,
- 460393269,
- 320620315,
- 685471733,
- 587496836,
- 852142971,
- 1086792851,
- 1017036298,
- 365543100,
- 1126000580,
- 2618297676,
- 1288033470,
- 3409855158,
- 1501505948,
- 4234509866,
- 1607167915,
- 987167468,
- 1816402316,
- 1246189591
- ];
- function SHA512() {
- if (!(this instanceof SHA512))
- return new SHA512;
- BlockHash.call(this);
- this.h = [
- 1779033703,
- 4089235720,
- 3144134277,
- 2227873595,
- 1013904242,
- 4271175723,
- 2773480762,
- 1595750129,
- 1359893119,
- 2917565137,
- 2600822924,
- 725511199,
- 528734635,
- 4215389547,
- 1541459225,
- 327033209
- ];
- this.k = sha512_K;
- this.W = new Array(160);
- }
- utils.inherits(SHA512, BlockHash);
- module.exports = SHA512;
- SHA512.blockSize = 1024;
- SHA512.outSize = 512;
- SHA512.hmacStrength = 192;
- SHA512.padLength = 128;
- SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) {
- var W = this.W;
- for (var i = 0;i < 32; i++)
- W[i] = msg[start + i];
- for (;i < W.length; i += 2) {
- var c0_hi = g1_512_hi(W[i - 4], W[i - 3]);
- var c0_lo = g1_512_lo(W[i - 4], W[i - 3]);
- var c1_hi = W[i - 14];
- var c1_lo = W[i - 13];
- var c2_hi = g0_512_hi(W[i - 30], W[i - 29]);
- var c2_lo = g0_512_lo(W[i - 30], W[i - 29]);
- var c3_hi = W[i - 32];
- var c3_lo = W[i - 31];
- W[i] = sum64_4_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo);
- W[i + 1] = sum64_4_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo);
- }
- };
- SHA512.prototype._update = function _update(msg, start) {
- this._prepareBlock(msg, start);
- var W = this.W;
- var ah = this.h[0];
- var al = this.h[1];
- var bh = this.h[2];
- var bl = this.h[3];
- var ch = this.h[4];
- var cl = this.h[5];
- var dh = this.h[6];
- var dl = this.h[7];
- var eh = this.h[8];
- var el = this.h[9];
- var fh = this.h[10];
- var fl = this.h[11];
- var gh = this.h[12];
- var gl = this.h[13];
- var hh = this.h[14];
- var hl = this.h[15];
- assert(this.k.length === W.length);
- for (var i = 0;i < W.length; i += 2) {
- var c0_hi = hh;
- var c0_lo = hl;
- var c1_hi = s1_512_hi(eh, el);
- var c1_lo = s1_512_lo(eh, el);
- var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl);
- var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl);
- var c3_hi = this.k[i];
- var c3_lo = this.k[i + 1];
- var c4_hi = W[i];
- var c4_lo = W[i + 1];
- var T1_hi = sum64_5_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo);
- var T1_lo = sum64_5_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo);
- c0_hi = s0_512_hi(ah, al);
- c0_lo = s0_512_lo(ah, al);
- c1_hi = maj64_hi(ah, al, bh, bl, ch, cl);
- c1_lo = maj64_lo(ah, al, bh, bl, ch, cl);
- var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo);
- var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo);
- hh = gh;
- hl = gl;
- gh = fh;
- gl = fl;
- fh = eh;
- fl = el;
- eh = sum64_hi(dh, dl, T1_hi, T1_lo);
- el = sum64_lo(dl, dl, T1_hi, T1_lo);
- dh = ch;
- dl = cl;
- ch = bh;
- cl = bl;
- bh = ah;
- bl = al;
- ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo);
- al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo);
- }
- sum64(this.h, 0, ah, al);
- sum64(this.h, 2, bh, bl);
- sum64(this.h, 4, ch, cl);
- sum64(this.h, 6, dh, dl);
- sum64(this.h, 8, eh, el);
- sum64(this.h, 10, fh, fl);
- sum64(this.h, 12, gh, gl);
- sum64(this.h, 14, hh, hl);
- };
- SHA512.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "big");
- else
- return utils.split32(this.h, "big");
- };
- function ch64_hi(xh, xl, yh, yl, zh) {
- var r = xh & yh ^ ~xh & zh;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function ch64_lo(xh, xl, yh, yl, zh, zl) {
- var r = xl & yl ^ ~xl & zl;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function maj64_hi(xh, xl, yh, yl, zh) {
- var r = xh & yh ^ xh & zh ^ yh & zh;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function maj64_lo(xh, xl, yh, yl, zh, zl) {
- var r = xl & yl ^ xl & zl ^ yl & zl;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s0_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 28);
- var c1_hi = rotr64_hi(xl, xh, 2);
- var c2_hi = rotr64_hi(xl, xh, 7);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s0_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 28);
- var c1_lo = rotr64_lo(xl, xh, 2);
- var c2_lo = rotr64_lo(xl, xh, 7);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s1_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 14);
- var c1_hi = rotr64_hi(xh, xl, 18);
- var c2_hi = rotr64_hi(xl, xh, 9);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s1_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 14);
- var c1_lo = rotr64_lo(xh, xl, 18);
- var c2_lo = rotr64_lo(xl, xh, 9);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g0_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 1);
- var c1_hi = rotr64_hi(xh, xl, 8);
- var c2_hi = shr64_hi(xh, xl, 7);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g0_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 1);
- var c1_lo = rotr64_lo(xh, xl, 8);
- var c2_lo = shr64_lo(xh, xl, 7);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g1_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 19);
- var c1_hi = rotr64_hi(xl, xh, 29);
- var c2_hi = shr64_hi(xh, xl, 6);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g1_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 19);
- var c1_lo = rotr64_lo(xl, xh, 29);
- var c2_lo = shr64_lo(xh, xl, 6);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/384.js
-var require_384 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var SHA512 = require_512();
- function SHA384() {
- if (!(this instanceof SHA384))
- return new SHA384;
- SHA512.call(this);
- this.h = [
- 3418070365,
- 3238371032,
- 1654270250,
- 914150663,
- 2438529370,
- 812702999,
- 355462360,
- 4144912697,
- 1731405415,
- 4290775857,
- 2394180231,
- 1750603025,
- 3675008525,
- 1694076839,
- 1203062813,
- 3204075428
- ];
- }
- utils.inherits(SHA384, SHA512);
- module.exports = SHA384;
- SHA384.blockSize = 1024;
- SHA384.outSize = 384;
- SHA384.hmacStrength = 192;
- SHA384.padLength = 128;
- SHA384.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h.slice(0, 12), "big");
- else
- return utils.split32(this.h.slice(0, 12), "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha.js
-var require_sha = __commonJS((exports) => {
- exports.sha1 = require_1();
- exports.sha224 = require_224();
- exports.sha256 = require_256();
- exports.sha384 = require_384();
- exports.sha512 = require_512();
-});
-
-// ../eve/node_modules/hash.js/lib/hash/ripemd.js
-var require_ripemd = __commonJS((exports) => {
- var utils = require_utils3();
- var common = require_common();
- var rotl32 = utils.rotl32;
- var sum32 = utils.sum32;
- var sum32_3 = utils.sum32_3;
- var sum32_4 = utils.sum32_4;
- var BlockHash = common.BlockHash;
- function RIPEMD160() {
- if (!(this instanceof RIPEMD160))
- return new RIPEMD160;
- BlockHash.call(this);
- this.h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];
- this.endian = "little";
- }
- utils.inherits(RIPEMD160, BlockHash);
- exports.ripemd160 = RIPEMD160;
- RIPEMD160.blockSize = 512;
- RIPEMD160.outSize = 160;
- RIPEMD160.hmacStrength = 192;
- RIPEMD160.padLength = 64;
- RIPEMD160.prototype._update = function update(msg, start) {
- var A = this.h[0];
- var B = this.h[1];
- var C = this.h[2];
- var D = this.h[3];
- var E = this.h[4];
- var Ah = A;
- var Bh = B;
- var Ch = C;
- var Dh = D;
- var Eh = E;
- for (var j = 0;j < 80; j++) {
- var T = sum32(rotl32(sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), s[j]), E);
- A = E;
- E = D;
- D = rotl32(C, 10);
- C = B;
- B = T;
- T = sum32(rotl32(sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), sh[j]), Eh);
- Ah = Eh;
- Eh = Dh;
- Dh = rotl32(Ch, 10);
- Ch = Bh;
- Bh = T;
- }
- T = sum32_3(this.h[1], C, Dh);
- this.h[1] = sum32_3(this.h[2], D, Eh);
- this.h[2] = sum32_3(this.h[3], E, Ah);
- this.h[3] = sum32_3(this.h[4], A, Bh);
- this.h[4] = sum32_3(this.h[0], B, Ch);
- this.h[0] = T;
- };
- RIPEMD160.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "little");
- else
- return utils.split32(this.h, "little");
- };
- function f(j, x, y, z) {
- if (j <= 15)
- return x ^ y ^ z;
- else if (j <= 31)
- return x & y | ~x & z;
- else if (j <= 47)
- return (x | ~y) ^ z;
- else if (j <= 63)
- return x & z | y & ~z;
- else
- return x ^ (y | ~z);
- }
- function K(j) {
- if (j <= 15)
- return 0;
- else if (j <= 31)
- return 1518500249;
- else if (j <= 47)
- return 1859775393;
- else if (j <= 63)
- return 2400959708;
- else
- return 2840853838;
- }
- function Kh(j) {
- if (j <= 15)
- return 1352829926;
- else if (j <= 31)
- return 1548603684;
- else if (j <= 47)
- return 1836072691;
- else if (j <= 63)
- return 2053994217;
- else
- return 0;
- }
- var r = [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 7,
- 4,
- 13,
- 1,
- 10,
- 6,
- 15,
- 3,
- 12,
- 0,
- 9,
- 5,
- 2,
- 14,
- 11,
- 8,
- 3,
- 10,
- 14,
- 4,
- 9,
- 15,
- 8,
- 1,
- 2,
- 7,
- 0,
- 6,
- 13,
- 11,
- 5,
- 12,
- 1,
- 9,
- 11,
- 10,
- 0,
- 8,
- 12,
- 4,
- 13,
- 3,
- 7,
- 15,
- 14,
- 5,
- 6,
- 2,
- 4,
- 0,
- 5,
- 9,
- 7,
- 12,
- 2,
- 10,
- 14,
- 1,
- 3,
- 8,
- 11,
- 6,
- 15,
- 13
- ];
- var rh = [
- 5,
- 14,
- 7,
- 0,
- 9,
- 2,
- 11,
- 4,
- 13,
- 6,
- 15,
- 8,
- 1,
- 10,
- 3,
- 12,
- 6,
- 11,
- 3,
- 7,
- 0,
- 13,
- 5,
- 10,
- 14,
- 15,
- 8,
- 12,
- 4,
- 9,
- 1,
- 2,
- 15,
- 5,
- 1,
- 3,
- 7,
- 14,
- 6,
- 9,
- 11,
- 8,
- 12,
- 2,
- 10,
- 0,
- 4,
- 13,
- 8,
- 6,
- 4,
- 1,
- 3,
- 11,
- 15,
- 0,
- 5,
- 12,
- 2,
- 13,
- 9,
- 7,
- 10,
- 14,
- 12,
- 15,
- 10,
- 4,
- 1,
- 5,
- 8,
- 7,
- 6,
- 2,
- 13,
- 14,
- 0,
- 3,
- 9,
- 11
- ];
- var s = [
- 11,
- 14,
- 15,
- 12,
- 5,
- 8,
- 7,
- 9,
- 11,
- 13,
- 14,
- 15,
- 6,
- 7,
- 9,
- 8,
- 7,
- 6,
- 8,
- 13,
- 11,
- 9,
- 7,
- 15,
- 7,
- 12,
- 15,
- 9,
- 11,
- 7,
- 13,
- 12,
- 11,
- 13,
- 6,
- 7,
- 14,
- 9,
- 13,
- 15,
- 14,
- 8,
- 13,
- 6,
- 5,
- 12,
- 7,
- 5,
- 11,
- 12,
- 14,
- 15,
- 14,
- 15,
- 9,
- 8,
- 9,
- 14,
- 5,
- 6,
- 8,
- 6,
- 5,
- 12,
- 9,
- 15,
- 5,
- 11,
- 6,
- 8,
- 13,
- 12,
- 5,
- 12,
- 13,
- 14,
- 11,
- 8,
- 5,
- 6
- ];
- var sh = [
- 8,
- 9,
- 9,
- 11,
- 13,
- 15,
- 15,
- 5,
- 7,
- 7,
- 8,
- 11,
- 14,
- 14,
- 12,
- 6,
- 9,
- 13,
- 15,
- 7,
- 12,
- 8,
- 9,
- 11,
- 7,
- 7,
- 12,
- 7,
- 6,
- 15,
- 13,
- 11,
- 9,
- 7,
- 15,
- 11,
- 8,
- 6,
- 6,
- 14,
- 12,
- 13,
- 5,
- 14,
- 13,
- 13,
- 7,
- 5,
- 15,
- 5,
- 8,
- 11,
- 14,
- 14,
- 6,
- 14,
- 6,
- 9,
- 12,
- 9,
- 12,
- 5,
- 15,
- 8,
- 8,
- 5,
- 12,
- 9,
- 12,
- 5,
- 14,
- 6,
- 8,
- 13,
- 6,
- 5,
- 15,
- 13,
- 11,
- 11
- ];
-});
-
-// ../eve/node_modules/hash.js/lib/hash/hmac.js
-var require_hmac = __commonJS((exports, module) => {
- var utils = require_utils3();
- var assert = require_minimalistic_assert();
- function Hmac(hash, key, enc) {
- if (!(this instanceof Hmac))
- return new Hmac(hash, key, enc);
- this.Hash = hash;
- this.blockSize = hash.blockSize / 8;
- this.outSize = hash.outSize / 8;
- this.inner = null;
- this.outer = null;
- this._init(utils.toArray(key, enc));
- }
- module.exports = Hmac;
- Hmac.prototype._init = function init(key) {
- if (key.length > this.blockSize)
- key = new this.Hash().update(key).digest();
- assert(key.length <= this.blockSize);
- for (var i = key.length;i < this.blockSize; i++)
- key.push(0);
- for (i = 0;i < key.length; i++)
- key[i] ^= 54;
- this.inner = new this.Hash().update(key);
- for (i = 0;i < key.length; i++)
- key[i] ^= 106;
- this.outer = new this.Hash().update(key);
- };
- Hmac.prototype.update = function update(msg, enc) {
- this.inner.update(msg, enc);
- return this;
- };
- Hmac.prototype.digest = function digest(enc) {
- this.outer.update(this.inner.digest());
- return this.outer.digest(enc);
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash.js
-var require_hash = __commonJS((exports) => {
- var hash = exports;
- hash.utils = require_utils3();
- hash.common = require_common();
- hash.sha = require_sha();
- hash.ripemd = require_ripemd();
- hash.hmac = require_hmac();
- hash.sha1 = hash.sha.sha1;
- hash.sha256 = hash.sha.sha256;
- hash.sha224 = hash.sha.sha224;
- hash.sha384 = hash.sha.sha384;
- hash.sha512 = hash.sha.sha512;
- hash.ripemd160 = hash.ripemd.ripemd160;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js
-var require_secp256k1 = __commonJS((exports, module) => {
- module.exports = {
- doubles: {
- step: 4,
- points: [
- [
- "e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a",
- "f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821"
- ],
- [
- "8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508",
- "11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"
- ],
- [
- "175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739",
- "d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695"
- ],
- [
- "363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640",
- "4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9"
- ],
- [
- "8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c",
- "4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36"
- ],
- [
- "723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda",
- "96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f"
- ],
- [
- "eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa",
- "5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999"
- ],
- [
- "100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0",
- "cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09"
- ],
- [
- "e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d",
- "9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d"
- ],
- [
- "feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d",
- "e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088"
- ],
- [
- "da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1",
- "9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d"
- ],
- [
- "53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0",
- "5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8"
- ],
- [
- "8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047",
- "10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a"
- ],
- [
- "385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862",
- "283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453"
- ],
- [
- "6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7",
- "7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160"
- ],
- [
- "3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd",
- "56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0"
- ],
- [
- "85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83",
- "7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6"
- ],
- [
- "948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a",
- "53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589"
- ],
- [
- "6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8",
- "bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17"
- ],
- [
- "e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d",
- "4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda"
- ],
- [
- "e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725",
- "7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd"
- ],
- [
- "213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754",
- "4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2"
- ],
- [
- "4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c",
- "17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6"
- ],
- [
- "fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6",
- "6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f"
- ],
- [
- "76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39",
- "c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01"
- ],
- [
- "c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891",
- "893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3"
- ],
- [
- "d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b",
- "febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f"
- ],
- [
- "b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03",
- "2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7"
- ],
- [
- "e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d",
- "eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78"
- ],
- [
- "a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070",
- "7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1"
- ],
- [
- "90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4",
- "e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150"
- ],
- [
- "8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da",
- "662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82"
- ],
- [
- "e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11",
- "1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc"
- ],
- [
- "8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e",
- "efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b"
- ],
- [
- "e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41",
- "2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51"
- ],
- [
- "b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef",
- "67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45"
- ],
- [
- "d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8",
- "db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120"
- ],
- [
- "324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d",
- "648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84"
- ],
- [
- "4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96",
- "35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d"
- ],
- [
- "9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd",
- "ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d"
- ],
- [
- "6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5",
- "9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8"
- ],
- [
- "a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266",
- "40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8"
- ],
- [
- "7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71",
- "34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac"
- ],
- [
- "928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac",
- "c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f"
- ],
- [
- "85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751",
- "1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962"
- ],
- [
- "ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e",
- "493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907"
- ],
- [
- "827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241",
- "c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec"
- ],
- [
- "eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3",
- "be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d"
- ],
- [
- "e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f",
- "4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414"
- ],
- [
- "1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19",
- "aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd"
- ],
- [
- "146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be",
- "b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0"
- ],
- [
- "fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9",
- "6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811"
- ],
- [
- "da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2",
- "8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1"
- ],
- [
- "a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13",
- "7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c"
- ],
- [
- "174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c",
- "ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73"
- ],
- [
- "959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba",
- "2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd"
- ],
- [
- "d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151",
- "e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405"
- ],
- [
- "64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073",
- "d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589"
- ],
- [
- "8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458",
- "38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e"
- ],
- [
- "13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b",
- "69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27"
- ],
- [
- "bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366",
- "d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1"
- ],
- [
- "8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa",
- "40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482"
- ],
- [
- "8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0",
- "620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945"
- ],
- [
- "dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787",
- "7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573"
- ],
- [
- "f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e",
- "ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82"
- ]
- ]
- },
- naf: {
- wnd: 7,
- points: [
- [
- "f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9",
- "388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672"
- ],
- [
- "2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4",
- "d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6"
- ],
- [
- "5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc",
- "6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da"
- ],
- [
- "acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe",
- "cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37"
- ],
- [
- "774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb",
- "d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b"
- ],
- [
- "f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8",
- "ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81"
- ],
- [
- "d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e",
- "581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58"
- ],
- [
- "defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34",
- "4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77"
- ],
- [
- "2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c",
- "85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a"
- ],
- [
- "352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5",
- "321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c"
- ],
- [
- "2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f",
- "2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67"
- ],
- [
- "9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714",
- "73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402"
- ],
- [
- "daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729",
- "a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55"
- ],
- [
- "c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db",
- "2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482"
- ],
- [
- "6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4",
- "e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82"
- ],
- [
- "1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5",
- "b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396"
- ],
- [
- "605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479",
- "2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49"
- ],
- [
- "62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d",
- "80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf"
- ],
- [
- "80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f",
- "1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a"
- ],
- [
- "7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb",
- "d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7"
- ],
- [
- "d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9",
- "eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933"
- ],
- [
- "49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963",
- "758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a"
- ],
- [
- "77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74",
- "958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6"
- ],
- [
- "f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530",
- "e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37"
- ],
- [
- "463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b",
- "5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e"
- ],
- [
- "f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247",
- "cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6"
- ],
- [
- "caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1",
- "cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476"
- ],
- [
- "2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120",
- "4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40"
- ],
- [
- "7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435",
- "91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61"
- ],
- [
- "754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18",
- "673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683"
- ],
- [
- "e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8",
- "59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5"
- ],
- [
- "186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb",
- "3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b"
- ],
- [
- "df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f",
- "55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417"
- ],
- [
- "5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143",
- "efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868"
- ],
- [
- "290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba",
- "e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a"
- ],
- [
- "af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45",
- "f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6"
- ],
- [
- "766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a",
- "744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996"
- ],
- [
- "59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e",
- "c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e"
- ],
- [
- "f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8",
- "e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d"
- ],
- [
- "7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c",
- "30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2"
- ],
- [
- "948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519",
- "e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e"
- ],
- [
- "7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab",
- "100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437"
- ],
- [
- "3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca",
- "ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311"
- ],
- [
- "d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf",
- "8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4"
- ],
- [
- "1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610",
- "68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575"
- ],
- [
- "733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4",
- "f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d"
- ],
- [
- "15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c",
- "d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d"
- ],
- [
- "a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940",
- "edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629"
- ],
- [
- "e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980",
- "a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06"
- ],
- [
- "311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3",
- "66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374"
- ],
- [
- "34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf",
- "9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee"
- ],
- [
- "f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63",
- "4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1"
- ],
- [
- "d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448",
- "fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b"
- ],
- [
- "32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf",
- "5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661"
- ],
- [
- "7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5",
- "8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6"
- ],
- [
- "ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6",
- "8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e"
- ],
- [
- "16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5",
- "5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d"
- ],
- [
- "eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99",
- "f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc"
- ],
- [
- "78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51",
- "f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4"
- ],
- [
- "494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5",
- "42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c"
- ],
- [
- "a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5",
- "204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b"
- ],
- [
- "c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997",
- "4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913"
- ],
- [
- "841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881",
- "73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154"
- ],
- [
- "5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5",
- "39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865"
- ],
- [
- "36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66",
- "d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc"
- ],
- [
- "336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726",
- "ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224"
- ],
- [
- "8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede",
- "6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e"
- ],
- [
- "1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94",
- "60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6"
- ],
- [
- "85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31",
- "3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511"
- ],
- [
- "29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51",
- "b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b"
- ],
- [
- "a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252",
- "ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2"
- ],
- [
- "4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5",
- "cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c"
- ],
- [
- "d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b",
- "6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3"
- ],
- [
- "ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4",
- "322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d"
- ],
- [
- "af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f",
- "6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700"
- ],
- [
- "e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889",
- "2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4"
- ],
- [
- "591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246",
- "b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196"
- ],
- [
- "11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984",
- "998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4"
- ],
- [
- "3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a",
- "b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257"
- ],
- [
- "cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030",
- "bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13"
- ],
- [
- "c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197",
- "6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096"
- ],
- [
- "c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593",
- "c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38"
- ],
- [
- "a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef",
- "21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f"
- ],
- [
- "347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38",
- "60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448"
- ],
- [
- "da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a",
- "49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a"
- ],
- [
- "c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111",
- "5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4"
- ],
- [
- "4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502",
- "7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437"
- ],
- [
- "3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea",
- "be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7"
- ],
- [
- "cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26",
- "8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d"
- ],
- [
- "b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986",
- "39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a"
- ],
- [
- "d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e",
- "62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54"
- ],
- [
- "48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4",
- "25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77"
- ],
- [
- "dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda",
- "ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517"
- ],
- [
- "6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859",
- "cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10"
- ],
- [
- "e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f",
- "f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125"
- ],
- [
- "eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c",
- "6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e"
- ],
- [
- "13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942",
- "fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1"
- ],
- [
- "ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a",
- "1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2"
- ],
- [
- "b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80",
- "5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423"
- ],
- [
- "ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d",
- "438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8"
- ],
- [
- "8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1",
- "cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758"
- ],
- [
- "52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63",
- "c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375"
- ],
- [
- "e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352",
- "6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d"
- ],
- [
- "7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193",
- "ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec"
- ],
- [
- "5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00",
- "9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0"
- ],
- [
- "32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58",
- "ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c"
- ],
- [
- "e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7",
- "d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4"
- ],
- [
- "8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8",
- "c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f"
- ],
- [
- "4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e",
- "67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649"
- ],
- [
- "3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d",
- "cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826"
- ],
- [
- "674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b",
- "299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5"
- ],
- [
- "d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f",
- "f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87"
- ],
- [
- "30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6",
- "462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b"
- ],
- [
- "be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297",
- "62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc"
- ],
- [
- "93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a",
- "7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c"
- ],
- [
- "b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c",
- "ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f"
- ],
- [
- "d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52",
- "4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a"
- ],
- [
- "d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb",
- "bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46"
- ],
- [
- "463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065",
- "bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f"
- ],
- [
- "7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917",
- "603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03"
- ],
- [
- "74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9",
- "cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08"
- ],
- [
- "30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3",
- "553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8"
- ],
- [
- "9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57",
- "712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373"
- ],
- [
- "176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66",
- "ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3"
- ],
- [
- "75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8",
- "9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8"
- ],
- [
- "809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721",
- "9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1"
- ],
- [
- "1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180",
- "4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9"
- ]
- ]
- }
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curves.js
-var require_curves = __commonJS((exports) => {
- var curves = exports;
- var hash = require_hash();
- var curve = require_curve();
- var utils = require_utils2();
- var assert = utils.assert;
- function PresetCurve(options2) {
- if (options2.type === "short")
- this.curve = new curve.short(options2);
- else if (options2.type === "edwards")
- this.curve = new curve.edwards(options2);
- else
- this.curve = new curve.mont(options2);
- this.g = this.curve.g;
- this.n = this.curve.n;
- this.hash = options2.hash;
- assert(this.g.validate(), "Invalid curve");
- assert(this.g.mul(this.n).isInfinity(), "Invalid curve, G*N != O");
- }
- curves.PresetCurve = PresetCurve;
- function defineCurve(name, options2) {
- Object.defineProperty(curves, name, {
- configurable: true,
- enumerable: true,
- get: function() {
- var curve2 = new PresetCurve(options2);
- Object.defineProperty(curves, name, {
- configurable: true,
- enumerable: true,
- value: curve2
- });
- return curve2;
- }
- });
- }
- defineCurve("p192", {
- type: "short",
- prime: "p192",
- p: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff",
- a: "ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc",
- b: "64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1",
- n: "ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831",
- hash: hash.sha256,
- gRed: false,
- g: [
- "188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012",
- "07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"
- ]
- });
- defineCurve("p224", {
- type: "short",
- prime: "p224",
- p: "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001",
- a: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe",
- b: "b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4",
- n: "ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d",
- hash: hash.sha256,
- gRed: false,
- g: [
- "b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21",
- "bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"
- ]
- });
- defineCurve("p256", {
- type: "short",
- prime: null,
- p: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff",
- a: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc",
- b: "5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b",
- n: "ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551",
- hash: hash.sha256,
- gRed: false,
- g: [
- "6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296",
- "4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"
- ]
- });
- defineCurve("p384", {
- type: "short",
- prime: null,
- p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "fffffffe ffffffff 00000000 00000000 ffffffff",
- a: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "fffffffe ffffffff 00000000 00000000 fffffffc",
- b: "b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f " + "5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef",
- n: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 " + "f4372ddf 581a0db2 48b0a77a ecec196a ccc52973",
- hash: hash.sha384,
- gRed: false,
- g: [
- "aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 " + "5502f25d bf55296c 3a545e38 72760ab7",
- "3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 " + "0a60b1ce 1d7e819d 7a431d7c 90ea0e5f"
- ]
- });
- defineCurve("p521", {
- type: "short",
- prime: null,
- p: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff",
- a: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff fffffffc",
- b: "00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b " + "99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd " + "3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00",
- n: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 " + "f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409",
- hash: hash.sha512,
- gRed: false,
- g: [
- "000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 " + "053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 " + "a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66",
- "00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 " + "579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 " + "3fad0761 353c7086 a272c240 88be9476 9fd16650"
- ]
- });
- defineCurve("curve25519", {
- type: "mont",
- prime: "p25519",
- p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",
- a: "76d06",
- b: "1",
- n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",
- hash: hash.sha256,
- gRed: false,
- g: [
- "9"
- ]
- });
- defineCurve("ed25519", {
- type: "edwards",
- prime: "p25519",
- p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",
- a: "-1",
- c: "1",
- d: "52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3",
- n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",
- hash: hash.sha256,
- gRed: false,
- g: [
- "216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a",
- "6666666666666666666666666666666666666666666666666666666666666658"
- ]
- });
- var pre;
- try {
- pre = require_secp256k1();
- } catch (e) {
- pre = undefined;
- }
- defineCurve("secp256k1", {
- type: "short",
- prime: "k256",
- p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f",
- a: "0",
- b: "7",
- n: "ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141",
- h: "1",
- hash: hash.sha256,
- beta: "7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee",
- lambda: "5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72",
- basis: [
- {
- a: "3086d221a7d46bcde86c90e49284eb15",
- b: "-e4437ed6010e88286f547fa90abfe4c3"
- },
- {
- a: "114ca50f7a8e2f3f657c1108d9d44cfd8",
- b: "3086d221a7d46bcde86c90e49284eb15"
- }
- ],
- gRed: false,
- g: [
- "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
- "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
- pre
- ]
- });
-});
-
-// ../eve/node_modules/hmac-drbg/lib/hmac-drbg.js
-var require_hmac_drbg = __commonJS((exports, module) => {
- var hash = require_hash();
- var utils = require_utils();
- var assert = require_minimalistic_assert();
- function HmacDRBG(options2) {
- if (!(this instanceof HmacDRBG))
- return new HmacDRBG(options2);
- this.hash = options2.hash;
- this.predResist = !!options2.predResist;
- this.outLen = this.hash.outSize;
- this.minEntropy = options2.minEntropy || this.hash.hmacStrength;
- this._reseed = null;
- this.reseedInterval = null;
- this.K = null;
- this.V = null;
- var entropy = utils.toArray(options2.entropy, options2.entropyEnc || "hex");
- var nonce = utils.toArray(options2.nonce, options2.nonceEnc || "hex");
- var pers = utils.toArray(options2.pers, options2.persEnc || "hex");
- assert(entropy.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits");
- this._init(entropy, nonce, pers);
- }
- module.exports = HmacDRBG;
- HmacDRBG.prototype._init = function init(entropy, nonce, pers) {
- var seed = entropy.concat(nonce).concat(pers);
- this.K = new Array(this.outLen / 8);
- this.V = new Array(this.outLen / 8);
- for (var i = 0;i < this.V.length; i++) {
- this.K[i] = 0;
- this.V[i] = 1;
- }
- this._update(seed);
- this._reseed = 1;
- this.reseedInterval = 281474976710656;
- };
- HmacDRBG.prototype._hmac = function hmac() {
- return new hash.hmac(this.hash, this.K);
- };
- HmacDRBG.prototype._update = function update(seed) {
- var kmac = this._hmac().update(this.V).update([0]);
- if (seed)
- kmac = kmac.update(seed);
- this.K = kmac.digest();
- this.V = this._hmac().update(this.V).digest();
- if (!seed)
- return;
- this.K = this._hmac().update(this.V).update([1]).update(seed).digest();
- this.V = this._hmac().update(this.V).digest();
- };
- HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) {
- if (typeof entropyEnc !== "string") {
- addEnc = add;
- add = entropyEnc;
- entropyEnc = null;
- }
- entropy = utils.toArray(entropy, entropyEnc);
- add = utils.toArray(add, addEnc);
- assert(entropy.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits");
- this._update(entropy.concat(add || []));
- this._reseed = 1;
- };
- HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) {
- if (this._reseed > this.reseedInterval)
- throw new Error("Reseed is required");
- if (typeof enc !== "string") {
- addEnc = add;
- add = enc;
- enc = null;
- }
- if (add) {
- add = utils.toArray(add, addEnc || "hex");
- this._update(add);
- }
- var temp = [];
- while (temp.length < len) {
- this.V = this._hmac().update(this.V).digest();
- temp = temp.concat(this.V);
- }
- var res = temp.slice(0, len);
- this._update(add);
- this._reseed++;
- return utils.encode(res, enc);
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/ec/key.js
-var require_key = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var assert = utils.assert;
- function KeyPair(ec, options2) {
- this.ec = ec;
- this.priv = null;
- this.pub = null;
- if (options2.priv)
- this._importPrivate(options2.priv, options2.privEnc);
- if (options2.pub)
- this._importPublic(options2.pub, options2.pubEnc);
- }
- module.exports = KeyPair;
- KeyPair.fromPublic = function fromPublic(ec, pub, enc) {
- if (pub instanceof KeyPair)
- return pub;
- return new KeyPair(ec, {
- pub,
- pubEnc: enc
- });
- };
- KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) {
- if (priv instanceof KeyPair)
- return priv;
- return new KeyPair(ec, {
- priv,
- privEnc: enc
- });
- };
- KeyPair.prototype.validate = function validate() {
- var pub = this.getPublic();
- if (pub.isInfinity())
- return { result: false, reason: "Invalid public key" };
- if (!pub.validate())
- return { result: false, reason: "Public key is not a point" };
- if (!pub.mul(this.ec.curve.n).isInfinity())
- return { result: false, reason: "Public key * N != O" };
- return { result: true, reason: null };
- };
- KeyPair.prototype.getPublic = function getPublic(compact, enc) {
- if (typeof compact === "string") {
- enc = compact;
- compact = null;
- }
- if (!this.pub)
- this.pub = this.ec.g.mul(this.priv);
- if (!enc)
- return this.pub;
- return this.pub.encode(enc, compact);
- };
- KeyPair.prototype.getPrivate = function getPrivate(enc) {
- if (enc === "hex")
- return this.priv.toString(16, 2);
- else
- return this.priv;
- };
- KeyPair.prototype._importPrivate = function _importPrivate(key, enc) {
- this.priv = new BN(key, enc || 16);
- this.priv = this.priv.umod(this.ec.curve.n);
- };
- KeyPair.prototype._importPublic = function _importPublic(key, enc) {
- if (key.x || key.y) {
- if (this.ec.curve.type === "mont") {
- assert(key.x, "Need x coordinate");
- } else if (this.ec.curve.type === "short" || this.ec.curve.type === "edwards") {
- assert(key.x && key.y, "Need both x and y coordinate");
- }
- this.pub = this.ec.curve.point(key.x, key.y);
- return;
- }
- this.pub = this.ec.curve.decodePoint(key, enc);
- };
- KeyPair.prototype.derive = function derive(pub) {
- if (!pub.validate()) {
- assert(pub.validate(), "public point not validated");
- }
- return pub.mul(this.priv).getX();
- };
- KeyPair.prototype.sign = function sign(msg, enc, options2) {
- return this.ec.sign(msg, this, enc, options2);
- };
- KeyPair.prototype.verify = function verify(msg, signature, options2) {
- return this.ec.verify(msg, signature, this, undefined, options2);
- };
- KeyPair.prototype.inspect = function inspect() {
- return "";
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/ec/signature.js
-var require_signature = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var assert = utils.assert;
- function Signature(options2, enc) {
- if (options2 instanceof Signature)
- return options2;
- if (this._importDER(options2, enc))
- return;
- assert(options2.r && options2.s, "Signature without r or s");
- this.r = new BN(options2.r, 16);
- this.s = new BN(options2.s, 16);
- if (options2.recoveryParam === undefined)
- this.recoveryParam = null;
- else
- this.recoveryParam = options2.recoveryParam;
- }
- module.exports = Signature;
- function Position() {
- this.place = 0;
- }
- function getLength(buf, p) {
- var initial = buf[p.place++];
- if (!(initial & 128)) {
- return initial;
- }
- var octetLen = initial & 15;
- if (octetLen === 0 || octetLen > 4) {
- return false;
- }
- if (buf[p.place] === 0) {
- return false;
- }
- var val = 0;
- for (var i = 0, off = p.place;i < octetLen; i++, off++) {
- val <<= 8;
- val |= buf[off];
- val >>>= 0;
- }
- if (val <= 127) {
- return false;
- }
- p.place = off;
- return val;
- }
- function rmPadding(buf) {
- var i = 0;
- var len = buf.length - 1;
- while (!buf[i] && !(buf[i + 1] & 128) && i < len) {
- i++;
- }
- if (i === 0) {
- return buf;
- }
- return buf.slice(i);
- }
- Signature.prototype._importDER = function _importDER(data, enc) {
- data = utils.toArray(data, enc);
- var p = new Position;
- if (data[p.place++] !== 48) {
- return false;
- }
- var len = getLength(data, p);
- if (len === false) {
- return false;
- }
- if (len + p.place !== data.length) {
- return false;
- }
- if (data[p.place++] !== 2) {
- return false;
- }
- var rlen = getLength(data, p);
- if (rlen === false) {
- return false;
- }
- if ((data[p.place] & 128) !== 0) {
- return false;
- }
- var r = data.slice(p.place, rlen + p.place);
- p.place += rlen;
- if (data[p.place++] !== 2) {
- return false;
- }
- var slen = getLength(data, p);
- if (slen === false) {
- return false;
- }
- if (data.length !== slen + p.place) {
- return false;
- }
- if ((data[p.place] & 128) !== 0) {
- return false;
- }
- var s = data.slice(p.place, slen + p.place);
- if (r[0] === 0) {
- if (r[1] & 128) {
- r = r.slice(1);
- } else {
- return false;
- }
- }
- if (s[0] === 0) {
- if (s[1] & 128) {
- s = s.slice(1);
- } else {
- return false;
- }
- }
- this.r = new BN(r);
- this.s = new BN(s);
- this.recoveryParam = null;
- return true;
- };
- function constructLength(arr, len) {
- if (len < 128) {
- arr.push(len);
- return;
- }
- var octets = 1 + (Math.log(len) / Math.LN2 >>> 3);
- arr.push(octets | 128);
- while (--octets) {
- arr.push(len >>> (octets << 3) & 255);
- }
- arr.push(len);
- }
- Signature.prototype.toDER = function toDER(enc) {
- var r = this.r.toArray();
- var s = this.s.toArray();
- if (r[0] & 128)
- r = [0].concat(r);
- if (s[0] & 128)
- s = [0].concat(s);
- r = rmPadding(r);
- s = rmPadding(s);
- while (!s[0] && !(s[1] & 128)) {
- s = s.slice(1);
- }
- var arr = [2];
- constructLength(arr, r.length);
- arr = arr.concat(r);
- arr.push(2);
- constructLength(arr, s.length);
- var backHalf = arr.concat(s);
- var res = [48];
- constructLength(res, backHalf.length);
- res = res.concat(backHalf);
- return utils.encode(res, enc);
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/ec/index.js
-var require_ec = __commonJS((exports, module) => {
- var BN = require_bn();
- var HmacDRBG = require_hmac_drbg();
- var utils = require_utils2();
- var curves = require_curves();
- var rand = require_brorand();
- var assert = utils.assert;
- var KeyPair = require_key();
- var Signature = require_signature();
- function EC(options2) {
- if (!(this instanceof EC))
- return new EC(options2);
- if (typeof options2 === "string") {
- assert(Object.prototype.hasOwnProperty.call(curves, options2), "Unknown curve " + options2);
- options2 = curves[options2];
- }
- if (options2 instanceof curves.PresetCurve)
- options2 = { curve: options2 };
- this.curve = options2.curve.curve;
- this.n = this.curve.n;
- this.nh = this.n.ushrn(1);
- this.g = this.curve.g;
- this.g = options2.curve.g;
- this.g.precompute(options2.curve.n.bitLength() + 1);
- this.hash = options2.hash || options2.curve.hash;
- }
- module.exports = EC;
- EC.prototype.keyPair = function keyPair(options2) {
- return new KeyPair(this, options2);
- };
- EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) {
- return KeyPair.fromPrivate(this, priv, enc);
- };
- EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) {
- return KeyPair.fromPublic(this, pub, enc);
- };
- EC.prototype.genKeyPair = function genKeyPair(options2) {
- if (!options2)
- options2 = {};
- var drbg = new HmacDRBG({
- hash: this.hash,
- pers: options2.pers,
- persEnc: options2.persEnc || "utf8",
- entropy: options2.entropy || rand(this.hash.hmacStrength),
- entropyEnc: options2.entropy && options2.entropyEnc || "utf8",
- nonce: this.n.toArray()
- });
- var bytes = this.n.byteLength();
- var ns2 = this.n.sub(new BN(2));
- for (;; ) {
- var priv = new BN(drbg.generate(bytes));
- if (priv.cmp(ns2) > 0)
- continue;
- priv.iaddn(1);
- return this.keyFromPrivate(priv);
- }
- };
- EC.prototype._truncateToN = function _truncateToN(msg, truncOnly, bitLength) {
- var byteLength;
- if (BN.isBN(msg) || typeof msg === "number") {
- msg = new BN(msg, 16);
- byteLength = msg.byteLength();
- } else if (typeof msg === "object") {
- byteLength = msg.length;
- msg = new BN(msg, 16);
- } else {
- var str = msg.toString();
- byteLength = str.length + 1 >>> 1;
- msg = new BN(str, 16);
- }
- if (typeof bitLength !== "number") {
- bitLength = byteLength * 8;
- }
- var delta = bitLength - this.n.bitLength();
- if (delta > 0)
- msg = msg.ushrn(delta);
- if (!truncOnly && msg.cmp(this.n) >= 0)
- return msg.sub(this.n);
- else
- return msg;
- };
- EC.prototype.sign = function sign(msg, key, enc, options2) {
- if (typeof enc === "object") {
- options2 = enc;
- enc = null;
- }
- if (!options2)
- options2 = {};
- if (typeof msg !== "string" && typeof msg !== "number" && !BN.isBN(msg)) {
- assert(typeof msg === "object" && msg && typeof msg.length === "number", "Expected message to be an array-like, a hex string, or a BN instance");
- assert(msg.length >>> 0 === msg.length);
- for (var i = 0;i < msg.length; i++)
- assert((msg[i] & 255) === msg[i]);
- }
- key = this.keyFromPrivate(key, enc);
- msg = this._truncateToN(msg, false, options2.msgBitLength);
- assert(!msg.isNeg(), "Can not sign a negative message");
- var bytes = this.n.byteLength();
- var bkey = key.getPrivate().toArray("be", bytes);
- var nonce = msg.toArray("be", bytes);
- assert(new BN(nonce).eq(msg), "Can not sign message");
- var drbg = new HmacDRBG({
- hash: this.hash,
- entropy: bkey,
- nonce,
- pers: options2.pers,
- persEnc: options2.persEnc || "utf8"
- });
- var ns1 = this.n.sub(new BN(1));
- for (var iter = 0;; iter++) {
- var k = options2.k ? options2.k(iter) : new BN(drbg.generate(this.n.byteLength()));
- k = this._truncateToN(k, true);
- if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0)
- continue;
- var kp = this.g.mul(k);
- if (kp.isInfinity())
- continue;
- var kpX = kp.getX();
- var r = kpX.umod(this.n);
- if (r.cmpn(0) === 0)
- continue;
- var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg));
- s = s.umod(this.n);
- if (s.cmpn(0) === 0)
- continue;
- var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | (kpX.cmp(r) !== 0 ? 2 : 0);
- if (options2.canonical && s.cmp(this.nh) > 0) {
- s = this.n.sub(s);
- recoveryParam ^= 1;
- }
- return new Signature({ r, s, recoveryParam });
- }
- };
- EC.prototype.verify = function verify(msg, signature, key, enc, options2) {
- if (!options2)
- options2 = {};
- msg = this._truncateToN(msg, false, options2.msgBitLength);
- key = this.keyFromPublic(key, enc);
- signature = new Signature(signature, "hex");
- var r = signature.r;
- var s = signature.s;
- if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0)
- return false;
- if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0)
- return false;
- var sinv = s.invm(this.n);
- var u1 = sinv.mul(msg).umod(this.n);
- var u2 = sinv.mul(r).umod(this.n);
- var p;
- if (!this.curve._maxwellTrick) {
- p = this.g.mulAdd(u1, key.getPublic(), u2);
- if (p.isInfinity())
- return false;
- return p.getX().umod(this.n).cmp(r) === 0;
- }
- p = this.g.jmulAdd(u1, key.getPublic(), u2);
- if (p.isInfinity())
- return false;
- return p.eqXToP(r);
- };
- EC.prototype.recoverPubKey = function(msg, signature, j, enc) {
- assert((3 & j) === j, "The recovery param is more than two bits");
- signature = new Signature(signature, enc);
- var n = this.n;
- var e = new BN(msg);
- var r = signature.r;
- var s = signature.s;
- var isYOdd = j & 1;
- var isSecondKey = j >> 1;
- if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey)
- throw new Error("Unable to find sencond key candinate");
- if (isSecondKey)
- r = this.curve.pointFromX(r.add(this.curve.n), isYOdd);
- else
- r = this.curve.pointFromX(r, isYOdd);
- var rInv = signature.r.invm(n);
- var s1 = n.sub(e).mul(rInv).umod(n);
- var s2 = s.mul(rInv).umod(n);
- return this.g.mulAdd(s1, r, s2);
- };
- EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) {
- signature = new Signature(signature, enc);
- if (signature.recoveryParam !== null)
- return signature.recoveryParam;
- for (var i = 0;i < 4; i++) {
- var Qprime;
- try {
- Qprime = this.recoverPubKey(e, signature, i);
- } catch (e2) {
- continue;
- }
- if (Qprime.eq(Q))
- return i;
- }
- throw new Error("Unable to find valid recovery factor");
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/eddsa/key.js
-var require_key2 = __commonJS((exports, module) => {
- var utils = require_utils2();
- var assert = utils.assert;
- var parseBytes = utils.parseBytes;
- var cachedProperty = utils.cachedProperty;
- function KeyPair(eddsa, params) {
- this.eddsa = eddsa;
- this._secret = parseBytes(params.secret);
- if (eddsa.isPoint(params.pub))
- this._pub = params.pub;
- else
- this._pubBytes = parseBytes(params.pub);
- }
- KeyPair.fromPublic = function fromPublic(eddsa, pub) {
- if (pub instanceof KeyPair)
- return pub;
- return new KeyPair(eddsa, { pub });
- };
- KeyPair.fromSecret = function fromSecret(eddsa, secret) {
- if (secret instanceof KeyPair)
- return secret;
- return new KeyPair(eddsa, { secret });
- };
- KeyPair.prototype.secret = function secret() {
- return this._secret;
- };
- cachedProperty(KeyPair, "pubBytes", function pubBytes() {
- return this.eddsa.encodePoint(this.pub());
- });
- cachedProperty(KeyPair, "pub", function pub() {
- if (this._pubBytes)
- return this.eddsa.decodePoint(this._pubBytes);
- return this.eddsa.g.mul(this.priv());
- });
- cachedProperty(KeyPair, "privBytes", function privBytes() {
- var eddsa = this.eddsa;
- var hash = this.hash();
- var lastIx = eddsa.encodingLength - 1;
- var a = hash.slice(0, eddsa.encodingLength);
- a[0] &= 248;
- a[lastIx] &= 127;
- a[lastIx] |= 64;
- return a;
- });
- cachedProperty(KeyPair, "priv", function priv() {
- return this.eddsa.decodeInt(this.privBytes());
- });
- cachedProperty(KeyPair, "hash", function hash() {
- return this.eddsa.hash().update(this.secret()).digest();
- });
- cachedProperty(KeyPair, "messagePrefix", function messagePrefix() {
- return this.hash().slice(this.eddsa.encodingLength);
- });
- KeyPair.prototype.sign = function sign(message) {
- assert(this._secret, "KeyPair can only verify");
- return this.eddsa.sign(message, this);
- };
- KeyPair.prototype.verify = function verify(message, sig) {
- return this.eddsa.verify(message, sig, this);
- };
- KeyPair.prototype.getSecret = function getSecret(enc) {
- assert(this._secret, "KeyPair is public only");
- return utils.encode(this.secret(), enc);
- };
- KeyPair.prototype.getPublic = function getPublic(enc) {
- return utils.encode(this.pubBytes(), enc);
- };
- module.exports = KeyPair;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/eddsa/signature.js
-var require_signature2 = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var assert = utils.assert;
- var cachedProperty = utils.cachedProperty;
- var parseBytes = utils.parseBytes;
- function Signature(eddsa, sig) {
- this.eddsa = eddsa;
- if (typeof sig !== "object")
- sig = parseBytes(sig);
- if (Array.isArray(sig)) {
- assert(sig.length === eddsa.encodingLength * 2, "Signature has invalid size");
- sig = {
- R: sig.slice(0, eddsa.encodingLength),
- S: sig.slice(eddsa.encodingLength)
- };
- }
- assert(sig.R && sig.S, "Signature without R or S");
- if (eddsa.isPoint(sig.R))
- this._R = sig.R;
- if (sig.S instanceof BN)
- this._S = sig.S;
- this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded;
- this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded;
- }
- cachedProperty(Signature, "S", function S() {
- return this.eddsa.decodeInt(this.Sencoded());
- });
- cachedProperty(Signature, "R", function R() {
- return this.eddsa.decodePoint(this.Rencoded());
- });
- cachedProperty(Signature, "Rencoded", function Rencoded() {
- return this.eddsa.encodePoint(this.R());
- });
- cachedProperty(Signature, "Sencoded", function Sencoded() {
- return this.eddsa.encodeInt(this.S());
- });
- Signature.prototype.toBytes = function toBytes() {
- return this.Rencoded().concat(this.Sencoded());
- };
- Signature.prototype.toHex = function toHex() {
- return utils.encode(this.toBytes(), "hex").toUpperCase();
- };
- module.exports = Signature;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/eddsa/index.js
-var require_eddsa = __commonJS((exports, module) => {
- var hash = require_hash();
- var curves = require_curves();
- var utils = require_utils2();
- var assert = utils.assert;
- var parseBytes = utils.parseBytes;
- var KeyPair = require_key2();
- var Signature = require_signature2();
- function EDDSA(curve) {
- assert(curve === "ed25519", "only tested with ed25519 so far");
- if (!(this instanceof EDDSA))
- return new EDDSA(curve);
- curve = curves[curve].curve;
- this.curve = curve;
- this.g = curve.g;
- this.g.precompute(curve.n.bitLength() + 1);
- this.pointClass = curve.point().constructor;
- this.encodingLength = Math.ceil(curve.n.bitLength() / 8);
- this.hash = hash.sha512;
- }
- module.exports = EDDSA;
- EDDSA.prototype.sign = function sign(message, secret) {
- message = parseBytes(message);
- var key = this.keyFromSecret(secret);
- var r = this.hashInt(key.messagePrefix(), message);
- var R = this.g.mul(r);
- var Rencoded = this.encodePoint(R);
- var s_ = this.hashInt(Rencoded, key.pubBytes(), message).mul(key.priv());
- var S = r.add(s_).umod(this.curve.n);
- return this.makeSignature({ R, S, Rencoded });
- };
- EDDSA.prototype.verify = function verify(message, sig, pub) {
- message = parseBytes(message);
- sig = this.makeSignature(sig);
- if (sig.S().gte(sig.eddsa.curve.n) || sig.S().isNeg()) {
- return false;
- }
- var key = this.keyFromPublic(pub);
- var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message);
- var SG = this.g.mul(sig.S());
- var RplusAh = sig.R().add(key.pub().mul(h));
- return RplusAh.eq(SG);
- };
- EDDSA.prototype.hashInt = function hashInt() {
- var hash2 = this.hash();
- for (var i = 0;i < arguments.length; i++)
- hash2.update(arguments[i]);
- return utils.intFromLE(hash2.digest()).umod(this.curve.n);
- };
- EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) {
- return KeyPair.fromPublic(this, pub);
- };
- EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) {
- return KeyPair.fromSecret(this, secret);
- };
- EDDSA.prototype.makeSignature = function makeSignature(sig) {
- if (sig instanceof Signature)
- return sig;
- return new Signature(this, sig);
- };
- EDDSA.prototype.encodePoint = function encodePoint(point) {
- var enc = point.getY().toArray("le", this.encodingLength);
- enc[this.encodingLength - 1] |= point.getX().isOdd() ? 128 : 0;
- return enc;
- };
- EDDSA.prototype.decodePoint = function decodePoint(bytes) {
- bytes = utils.parseBytes(bytes);
- var lastIx = bytes.length - 1;
- var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~128);
- var xIsOdd = (bytes[lastIx] & 128) !== 0;
- var y = utils.intFromLE(normed);
- return this.curve.pointFromY(y, xIsOdd);
- };
- EDDSA.prototype.encodeInt = function encodeInt(num) {
- return num.toArray("le", this.encodingLength);
- };
- EDDSA.prototype.decodeInt = function decodeInt(bytes) {
- return utils.intFromLE(bytes);
- };
- EDDSA.prototype.isPoint = function isPoint(val) {
- return val instanceof this.pointClass;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic.js
-var require_elliptic = __commonJS((exports) => {
- var elliptic = exports;
- elliptic.version = require_package().version;
- elliptic.utils = require_utils2();
- elliptic.rand = require_brorand();
- elliptic.curve = require_curve();
- elliptic.curves = require_curves();
- elliptic.ec = require_ec();
- elliptic.eddsa = require_eddsa();
-});
-
-// ../eve/node_modules/jwk-to-pem/src/b64-to-bn.js
-var require_b64_to_bn = __commonJS((exports, module) => {
- var BN = require_asn1().bignum;
- var Buffer2 = require_safe_buffer().Buffer;
- module.exports = function base64ToBigNum(val, zero) {
- var buf = Buffer2.from(val, "base64");
- var bn = val = new BN(buf, 10, "be").iabs();
- if (zero) {
- buf.fill(0);
- }
- return bn;
- };
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/algorithm-identifier.js
-var require_algorithm_identifier = __commonJS((exports, module) => {
- module.exports = require_asn1().define("AlgorithmIdentifer", function() {
- this.seq().obj(this.key("algorithm").objid(), this.key("parameters").optional().any());
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/public-key-info.js
-var require_public_key_info = __commonJS((exports, module) => {
- var AlgorithmIdentifier = require_algorithm_identifier();
- module.exports = require_asn1().define("PublicKeyInfo", function() {
- this.seq().obj(this.key("algorithm").use(AlgorithmIdentifier), this.key("PublicKey").bitstr());
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/version.js
-var require_version = __commonJS((exports, module) => {
- module.exports = require_asn1().define("Version", function() {
- this.int();
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/private-key-info.js
-var require_private_key_info = __commonJS((exports, module) => {
- var AlgorithmIdentifier = require_algorithm_identifier();
- var Version = require_version();
- module.exports = require_asn1().define("PrivateKeyInfo", function() {
- this.seq().obj(this.key("version").use(Version), this.key("privateKeyAlgorithm").use(AlgorithmIdentifier), this.key("privateKey").octstr(), this.key("attributes").optional().any());
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/ec.js
-var require_ec2 = __commonJS((exports, module) => {
- var asn1 = require_asn1();
- var Buffer2 = require_safe_buffer().Buffer;
- var EC = require_elliptic().ec;
- var b64ToBn = require_b64_to_bn();
- var PublicKeyInfo = require_public_key_info();
- var PrivateKeyInfo = require_private_key_info();
- var Version = require_version();
- var ECParameters = asn1.define("ECParameters", function() {
- this.choice({
- namedCurve: this.objid()
- });
- });
- var ecPrivkeyVer1 = 1;
- var ECPrivateKey = asn1.define("ECPrivateKey", function() {
- this.seq().obj(this.key("version").use(Version), this.key("privateKey").octstr(), this.key("parameters").explicit(0).optional().any(), this.key("publicKey").explicit(1).optional().bitstr());
- });
- var curves = {
- "P-256": "p256",
- "P-384": "p384",
- "P-521": "p521"
- };
- var oids = {
- "P-256": [1, 2, 840, 10045, 3, 1, 7],
- "P-384": [1, 3, 132, 0, 34],
- "P-521": [1, 3, 132, 0, 35]
- };
- var parameters = {};
- var algorithms = {};
- Object.keys(oids).forEach(function(crv) {
- parameters[crv] = ECParameters.encode({
- type: "namedCurve",
- value: oids[crv]
- }, "der");
- algorithms[crv] = {
- algorithm: [1, 2, 840, 10045, 2, 1],
- parameters: parameters[crv]
- };
- });
- oids = null;
- function ecJwkToBuffer(jwk, opts) {
- if (typeof jwk.crv !== "string") {
- throw new TypeError('Expected "jwk.crv" to be a String');
- }
- var hasD = typeof jwk.d === "string";
- var xyTypes = hasD ? ["undefined", "string"] : ["string"];
- if (xyTypes.indexOf(typeof jwk.x) === -1) {
- throw new TypeError('Expected "jwk.x" to be a String');
- }
- if (xyTypes.indexOf(typeof jwk.y) === -1) {
- throw new TypeError('Expected "jwk.y" to be a String');
- }
- if (opts.private && !hasD) {
- throw new TypeError('Expected "jwk.d" to be a String');
- }
- var curveName = curves[jwk.crv];
- if (!curveName) {
- throw new Error('Unsupported curve "' + jwk.crv + '"');
- }
- var curve = new EC(curveName);
- var key = {};
- var hasPub = jwk.x && jwk.y;
- if (hasPub) {
- key.pub = {
- x: b64ToBn(jwk.x, false),
- y: b64ToBn(jwk.y, false)
- };
- }
- if (opts.private || !hasPub) {
- key.priv = b64ToBn(jwk.d, true);
- }
- key = curve.keyPair(key);
- var keyValidation = key.validate();
- if (!keyValidation.result) {
- throw new Error('Invalid key for curve: "' + keyValidation.reason + '"');
- }
- var result = keyToPem(jwk.crv, key, opts);
- return result;
- }
- function keyToPem(crv, key, opts) {
- var compact = false;
- var publicKey = key.getPublic(compact, "hex");
- publicKey = Buffer2.from(publicKey, "hex");
- publicKey = {
- unused: 0,
- data: publicKey
- };
- var result;
- if (opts.private) {
- var privateKey = key.getPrivate("hex");
- privateKey = Buffer2.from(privateKey, "hex");
- result = PrivateKeyInfo.encode({
- version: 0,
- privateKeyAlgorithm: algorithms[crv],
- privateKey: ECPrivateKey.encode({
- version: ecPrivkeyVer1,
- privateKey,
- parameters: parameters[crv],
- publicKey
- }, "der")
- }, "pem", {
- label: "PRIVATE KEY"
- });
- privateKey.fill(0);
- } else {
- result = PublicKeyInfo.encode({
- algorithm: algorithms[crv],
- PublicKey: publicKey
- }, "pem", {
- label: "PUBLIC KEY"
- });
- }
- if (result.slice(-1) !== `
-`) {
- result += `
-`;
- }
- return result;
- }
- module.exports = ecJwkToBuffer;
-});
-
-// ../eve/node_modules/jwk-to-pem/src/rsa.js
-var require_rsa = __commonJS((exports, module) => {
- var asn1 = require_asn1();
- var b64ToBn = require_b64_to_bn();
- var PublicKeyInfo = require_public_key_info();
- var PrivateKeyInfo = require_private_key_info();
- var Version = require_version();
- var RSAPrivateKey = asn1.define("RSAPrivateKey", function() {
- this.seq().obj(this.key("version").use(Version), this.key("modulus").int(), this.key("publicExponent").int(), this.key("privateExponent").int(), this.key("prime1").int(), this.key("prime2").int(), this.key("exponent1").int(), this.key("exponent2").int(), this.key("coefficient").int());
- });
- var RSAPublicKey = asn1.define("RSAPublicKey", function() {
- this.seq().obj(this.key("modulus").int(), this.key("publicExponent").int());
- });
- var algorithm = {
- algorithm: [1, 2, 840, 113549, 1, 1, 1],
- parameters: [5, 0]
- };
- function rsaJwkToBuffer(jwk, opts) {
- if (typeof jwk.e !== "string") {
- throw new TypeError('Expected "jwk.e" to be a String');
- }
- if (typeof jwk.n !== "string") {
- throw new TypeError('Expected "jwk.n" to be a String');
- }
- if (opts.private) {
- if (typeof jwk.d !== "string") {
- throw new TypeError('Expected "jwk.d" to be a String');
- }
- if (typeof jwk.p !== "string") {
- throw new TypeError('Expected "jwk.p" to be a String');
- }
- if (typeof jwk.q !== "string") {
- throw new TypeError('Expected "jwk.q" to be a String');
- }
- if (typeof jwk.dp !== "string") {
- throw new TypeError('Expected "jwk.dp" to be a String');
- }
- if (typeof jwk.dq !== "string") {
- throw new TypeError('Expected "jwk.dq" to be a String');
- }
- if (typeof jwk.qi !== "string") {
- throw new TypeError('Expected "jwk.qi" to be a String');
- }
- }
- var pem;
- if (opts.private) {
- pem = PrivateKeyInfo.encode({
- version: 0,
- privateKeyAlgorithm: algorithm,
- privateKey: RSAPrivateKey.encode({
- version: 0,
- modulus: b64ToBn(jwk.n, false),
- publicExponent: b64ToBn(jwk.e, false),
- privateExponent: b64ToBn(jwk.d, true),
- prime1: b64ToBn(jwk.p, true),
- prime2: b64ToBn(jwk.q, true),
- exponent1: b64ToBn(jwk.dp, true),
- exponent2: b64ToBn(jwk.dq, true),
- coefficient: b64ToBn(jwk.qi, true)
- }, "der")
- }, "pem", {
- label: "PRIVATE KEY"
- });
- } else {
- pem = PublicKeyInfo.encode({
- algorithm,
- PublicKey: {
- unused: 0,
- data: RSAPublicKey.encode({
- modulus: b64ToBn(jwk.n, false),
- publicExponent: b64ToBn(jwk.e, false)
- }, "der")
- }
- }, "pem", {
- label: "PUBLIC KEY"
- });
- }
- if (pem.slice(-1) !== `
-`) {
- pem += `
-`;
- }
- return pem;
- }
- module.exports = rsaJwkToBuffer;
-});
-
-// ../eve/node_modules/jwk-to-pem/src/jwk-to-pem.js
-var require_jwk_to_pem = __commonJS((exports, module) => {
- var ec = require_ec2();
- var rsa = require_rsa();
- function jwkToBuffer(jwk, opts) {
- if (typeof jwk !== "object" || jwk === null) {
- throw new TypeError('Expected "jwk" to be an Object');
- }
- var kty = jwk.kty;
- if (typeof kty !== "string") {
- throw new TypeError('Expected "jwk.kty" to be a String');
- }
- opts = opts || {};
- opts.private = opts.private === true;
- switch (kty) {
- case "EC": {
- return ec(jwk, opts);
- }
- case "RSA": {
- return rsa(jwk, opts);
- }
- default: {
- throw new Error('Unsupported key type "' + kty + '"');
- }
- }
- }
- module.exports = jwkToBuffer;
-});
-
-// src/utils/cookies.ts
-function getCookies(headers) {
- if (!headers)
- return {};
- const cookieHeader = headers.get("Cookie");
- const cookies = {};
- if (cookieHeader === null)
- return {};
- for (const kv of cookieHeader.split(";")) {
- const [cookieKey, ...cookieVal] = kv.split("=");
- const key = cookieKey.trim();
- cookies[key] = cookieVal.join("=");
- }
- return cookies;
-}
-function setCookie(response, key, value, maxAge) {
- response.headers.append("Set-Cookie", `${key}=${value}${maxAge ? "; Path=/; Max-Age=" + maxAge : ""}`);
-}
-function removeCookie(response, key) {
- response.headers.append("Set-Cookie", `${key}=""; Path=/; Max-Age=-1;`);
-}
-// ../eve/dist/esi/options.js
-var CLIENT_ID = process.env.EVE_CLIENT_ID || "";
-var CLIENT_SECRET = process.env.EVE_CLIENT_SECRET || "";
-var CALLBACK_URL = process.env.EVE_CALLBACK_URL || "";
-var USER_AGENT = process.env.ESI_USER_AGENT || "";
-var options = {
- client_id: CLIENT_ID,
- client_secret: CLIENT_SECRET,
- callback_url: CALLBACK_URL,
- user_agent: USER_AGENT
-};
-
-// ../eve/dist/_virtual/rolldown_runtime.js
-var __defProp2 = Object.defineProperty;
-var __export = (target, all) => {
- for (var name in all)
- __defProp2(target, name, {
- get: all[name],
- enumerable: true
- });
-};
-
-// ../eve/node_modules/jwt-decode/build/esm/index.js
-class InvalidTokenError extends Error {
-}
-InvalidTokenError.prototype.name = "InvalidTokenError";
-function b64DecodeUnicode(str) {
- return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {
- let code = p.charCodeAt(0).toString(16).toUpperCase();
- if (code.length < 2) {
- code = "0" + code;
- }
- return "%" + code;
- }));
-}
-function base64UrlDecode(str) {
- let output = str.replace(/-/g, "+").replace(/_/g, "/");
- switch (output.length % 4) {
- case 0:
- break;
- case 2:
- output += "==";
- break;
- case 3:
- output += "=";
- break;
- default:
- throw new Error("base64 string is not of the correct length");
- }
- try {
- return b64DecodeUnicode(output);
- } catch (err) {
- return atob(output);
- }
-}
-function jwtDecode(token, options2) {
- if (typeof token !== "string") {
- throw new InvalidTokenError("Invalid token specified: must be a string");
- }
- options2 || (options2 = {});
- const pos = options2.header === true ? 0 : 1;
- const part = token.split(".")[pos];
- if (typeof part !== "string") {
- throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);
- }
- let decoded;
- try {
- decoded = base64UrlDecode(part);
- } catch (e) {
- throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);
- }
- try {
- return JSON.parse(decoded);
- } catch (e) {
- throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);
- }
-}
-// ../eve/node_modules/@oslojs/encoding/dist/base32.js
-var EncodingPadding;
-(function(EncodingPadding2) {
- EncodingPadding2[EncodingPadding2["Include"] = 0] = "Include";
- EncodingPadding2[EncodingPadding2["None"] = 1] = "None";
-})(EncodingPadding || (EncodingPadding = {}));
-var DecodingPadding;
-(function(DecodingPadding2) {
- DecodingPadding2[DecodingPadding2["Required"] = 0] = "Required";
- DecodingPadding2[DecodingPadding2["Ignore"] = 1] = "Ignore";
-})(DecodingPadding || (DecodingPadding = {}));
-// ../eve/node_modules/@oslojs/encoding/dist/base64.js
-function encodeBase64urlNoPadding(bytes) {
- return encodeBase64_internal(bytes, base64urlAlphabet, EncodingPadding2.None);
-}
-function encodeBase64_internal(bytes, alphabet, padding) {
- let result = "";
- for (let i = 0;i < bytes.byteLength; i += 3) {
- let buffer = 0;
- let bufferBitSize = 0;
- for (let j = 0;j < 3 && i + j < bytes.byteLength; j++) {
- buffer = buffer << 8 | bytes[i + j];
- bufferBitSize += 8;
- }
- for (let j = 0;j < 4; j++) {
- if (bufferBitSize >= 6) {
- result += alphabet[buffer >> bufferBitSize - 6 & 63];
- bufferBitSize -= 6;
- } else if (bufferBitSize > 0) {
- result += alphabet[buffer << 6 - bufferBitSize & 63];
- bufferBitSize = 0;
- } else if (padding === EncodingPadding2.Include) {
- result += "=";
- }
- }
- }
- return result;
-}
-var base64urlAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
-var EncodingPadding2;
-(function(EncodingPadding3) {
- EncodingPadding3[EncodingPadding3["Include"] = 0] = "Include";
- EncodingPadding3[EncodingPadding3["None"] = 1] = "None";
-})(EncodingPadding2 || (EncodingPadding2 = {}));
-var DecodingPadding2;
-(function(DecodingPadding3) {
- DecodingPadding3[DecodingPadding3["Required"] = 0] = "Required";
- DecodingPadding3[DecodingPadding3["Ignore"] = 1] = "Ignore";
-})(DecodingPadding2 || (DecodingPadding2 = {}));
-// ../eve/dist/esi/auth.js
-var import_jsonwebtoken = __toESM(require_jsonwebtoken(), 1);
-var import_jwk_to_pem = __toESM(require_jwk_to_pem(), 1);
-var auth_exports = {};
-__export(auth_exports, {
- characterIdFromToken: () => characterIdFromToken,
- createAuthorizationURL: () => createAuthorizationURL,
- refresh: () => refresh,
- validateAuthorizationCode: () => validateAuthorizationCode,
- validateToken: () => validateToken
-});
-function generateState() {
- const randomValues = new Uint8Array(32);
- crypto.getRandomValues(randomValues);
- return encodeBase64urlNoPadding(randomValues);
-}
-async function createAuthorizationURL(scopes = "publicData") {
- const state = generateState();
- const url = new URL("https://login.eveonline.com/v2/oauth/authorize/");
- url.searchParams.set("response_type", "code");
- url.searchParams.set("redirect_uri", options.callback_url);
- url.searchParams.set("client_id", options.client_id);
- url.searchParams.set("state", state);
- url.searchParams.set("scope", Array.isArray(scopes) ? scopes.join(" ") : scopes);
- return {
- url,
- state
- };
-}
-async function validateAuthorizationCode(code) {
- try {
- const response = await fetch("https://login.eveonline.com/v2/oauth/token", {
- method: "POST",
- headers: {
- "Content-Type": "application/x-www-form-urlencoded",
- Authorization: `Basic ${Buffer.from(`${options.client_id}:${options.client_secret}`).toString("base64")}`
- },
- body: new URLSearchParams({
- grant_type: "authorization_code",
- code
- })
- });
- return await response.json();
- } catch (error) {
- console.error(`failed to validate EVE authorization code`, error);
- throw `${error}`;
- }
-}
-var eveAuthPublicKey;
-async function validateToken(token) {
- if (!eveAuthPublicKey)
- try {
- const eveJWKS = await (await fetch("https://login.eveonline.com/oauth/jwks")).json();
- eveAuthPublicKey = import_jwk_to_pem.default(eveJWKS.keys[0]);
- } catch (err) {
- console.error(`failed to get EVE Auth public keys`, err);
- }
- try {
- const decoded = import_jsonwebtoken.default.verify(token, eveAuthPublicKey);
- return decoded;
- } catch (err) {
- console.error(`failed to validate EVE token`, err);
- return null;
- }
-}
-async function refresh({ refresh_token }, scopes) {
- const params = {
- grant_type: "refresh_token",
- refresh_token,
- scope: ""
- };
- if (scopes)
- params["scope"] = Array.isArray(scopes) ? scopes.join(" ") : scopes;
- const response = await fetch("https://login.eveonline.com/v2/oauth/token", {
- method: "POST",
- headers: {
- "Content-Type": "application/x-www-form-urlencoded",
- Authorization: `Basic ${Buffer.from(`${options.client_id}:${options.client_secret}`).toString("base64")}`
- },
- body: new URLSearchParams(params)
- });
- return await response.json();
-}
-function characterIdFromToken(token) {
- const payload = jwtDecode(token);
- return parseInt(payload.sub.split(":")[2]);
-}
-
-// ../eve/dist/esi/scopes.js
-var ESI_LATEST_URL = "https://esi.evetech.net/latest";
-function joinScopes(...scopes) {
- return scopes.join(" ");
-}
-var SCOPES = /* @__PURE__ */ function(SCOPES$1) {
- SCOPES$1["PUBLIC_DATA"] = "publicData";
- SCOPES$1["CALENDAR_RESPOND_CALENDAR_EVENTS"] = "esi-calendar.respond_calendar_events.v1";
- SCOPES$1["CALENDAR_READ_CALENDAR_EVENTS"] = "esi-calendar.read_calendar_events.v1";
- SCOPES$1["LOCATION_READ_LOCATION"] = "esi-location.read_location.v1";
- SCOPES$1["LOCATION_READ_SHIP_TYPE"] = "esi-location.read_ship_type.v1";
- SCOPES$1["MAIL_ORGANIZE_MAIL"] = "esi-mail.organize_mail.v1";
- SCOPES$1["MAIL_READ_MAIL"] = "esi-mail.read_mail.v1";
- SCOPES$1["MAIL_SEND_MAIL"] = "esi-mail.send_mail.v1";
- SCOPES$1["SKILLS_READ_SKILLS"] = "esi-skills.read_skills.v1";
- SCOPES$1["SKILLS_READ_SKILLQUEUE"] = "esi-skills.read_skillqueue.v1";
- SCOPES$1["WALLET_READ_CHARACTER_WALLET"] = "esi-wallet.read_character_wallet.v1";
- SCOPES$1["WALLET_READ_CORPORATION_WALLET"] = "esi-wallet.read_corporation_wallet.v1";
- SCOPES$1["SEARCH_SEARCH_STRUCTURES"] = "esi-search.search_structures.v1";
- SCOPES$1["CLONES_READ_CLONES"] = "esi-clones.read_clones.v1";
- SCOPES$1["CHARACTERS_READ_CONTACTS"] = "esi-characters.read_contacts.v1";
- SCOPES$1["UNIVERSE_READ_STRUCTURES"] = "esi-universe.read_structures.v1";
- SCOPES$1["KILLMAILS_READ_KILLMAILS"] = "esi-killmails.read_killmails.v1";
- SCOPES$1["CORPORATIONS_READ_CORPORATION_MEMBERSHIP"] = "esi-corporations.read_corporation_membership.v1";
- SCOPES$1["ASSETS_READ_ASSETS"] = "esi-assets.read_assets.v1";
- SCOPES$1["PLANETS_MANAGE_PLANETS"] = "esi-planets.manage_planets.v1";
- SCOPES$1["FLEETS_READ_FLEET"] = "esi-fleets.read_fleet.v1";
- SCOPES$1["FLEETS_WRITE_FLEET"] = "esi-fleets.write_fleet.v1";
- SCOPES$1["UI_OPEN_WINDOW"] = "esi-ui.open_window.v1";
- SCOPES$1["UI_WRITE_WAYPOINT"] = "esi-ui.write_waypoint.v1";
- SCOPES$1["CHARACTERS_WRITE_CONTACTS"] = "esi-characters.write_contacts.v1";
- SCOPES$1["FITTINGS_READ_FITTINGS"] = "esi-fittings.read_fittings.v1";
- SCOPES$1["FITTINGS_WRITE_FITTINGS"] = "esi-fittings.write_fittings.v1";
- SCOPES$1["MARKETS_STRUCTURE_MARKETS"] = "esi-markets.structure_markets.v1";
- SCOPES$1["CORPORATIONS_READ_STRUCTURES"] = "esi-corporations.read_structures.v1";
- SCOPES$1["CHARACTERS_READ_LOYALTY"] = "esi-characters.read_loyalty.v1";
- SCOPES$1["CHARACTERS_READ_OPPORTUNITIES"] = "esi-characters.read_opportunities.v1";
- SCOPES$1["CHARACTERS_READ_CHAT_CHANNELS"] = "esi-characters.read_chat_channels.v1";
- SCOPES$1["CHARACTERS_READ_MEDALS"] = "esi-characters.read_medals.v1";
- SCOPES$1["CHARACTERS_READ_STANDINGS"] = "esi-characters.read_standings.v1";
- SCOPES$1["CHARACTERS_READ_AGENTS_RESEARCH"] = "esi-characters.read_agents_research.v1";
- SCOPES$1["INDUSTRY_READ_CHARACTER_JOBS"] = "esi-industry.read_character_jobs.v1";
- SCOPES$1["MARKETS_READ_CHARACTER_ORDERS"] = "esi-markets.read_character_orders.v1";
- SCOPES$1["CHARACTERS_READ_BLUEPRINTS"] = "esi-characters.read_blueprints.v1";
- SCOPES$1["CHARACTERS_READ_CORPORATION_ROLES"] = "esi-characters.read_corporation_roles.v1";
- SCOPES$1["LOCATION_READ_ONLINE"] = "esi-location.read_online.v1";
- SCOPES$1["CONTRACTS_READ_CHARACTER_CONTRACTS"] = "esi-contracts.read_character_contracts.v1";
- SCOPES$1["CLONES_READ_IMPLANTS"] = "esi-clones.read_implants.v1";
- SCOPES$1["CHARACTERS_READ_FATIGUE"] = "esi-characters.read_fatigue.v1";
- SCOPES$1["KILLMAILS_READ_CORPORATION_KILLMAILS"] = "esi-killmails.read_corporation_killmails.v1";
- SCOPES$1["CORPORATIONS_TRACK_MEMBERS"] = "esi-corporations.track_members.v1";
- SCOPES$1["WALLET_READ_CORPORATION_WALLETS"] = "esi-wallet.read_corporation_wallets.v1";
- SCOPES$1["CHARACTERS_READ_NOTIFICATIONS"] = "esi-characters.read_notifications.v1";
- SCOPES$1["CORPORATIONS_READ_DIVISIONS"] = "esi-corporations.read_divisions.v1";
- SCOPES$1["CORPORATIONS_READ_CONTACTS"] = "esi-corporations.read_contacts.v1";
- SCOPES$1["ASSETS_READ_CORPORATION_ASSETS"] = "esi-assets.read_corporation_assets.v1";
- SCOPES$1["CORPORATIONS_READ_TITLES"] = "esi-corporations.read_titles.v1";
- SCOPES$1["CORPORATIONS_READ_BLUEPRINTS"] = "esi-corporations.read_blueprints.v1";
- SCOPES$1["CONTRACTS_READ_CORPORATION_CONTRACTS"] = "esi-contracts.read_corporation_contracts.v1";
- SCOPES$1["CORPORATIONS_READ_STANDINGS"] = "esi-corporations.read_standings.v1";
- SCOPES$1["CORPORATIONS_READ_STARBASES"] = "esi-corporations.read_starbases.v1";
- SCOPES$1["INDUSTRY_READ_CORPORATION_JOBS"] = "esi-industry.read_corporation_jobs.v1";
- SCOPES$1["MARKETS_READ_CORPORATION_ORDERS"] = "esi-markets.read_corporation_orders.v1";
- SCOPES$1["CORPORATIONS_READ_CONTAINER_LOGS"] = "esi-corporations.read_container_logs.v1";
- SCOPES$1["INDUSTRY_READ_CHARACTER_MINING"] = "esi-industry.read_character_mining.v1";
- SCOPES$1["INDUSTRY_READ_CORPORATION_MINING"] = "esi-industry.read_corporation_mining.v1";
- SCOPES$1["PLANETS_READ_CUSTOMS_OFFICES"] = "esi-planets.read_customs_offices.v1";
- SCOPES$1["CORPORATIONS_READ_FACILITIES"] = "esi-corporations.read_facilities.v1";
- SCOPES$1["CORPORATIONS_READ_MEDALS"] = "esi-corporations.read_medals.v1";
- SCOPES$1["CHARACTERS_READ_TITLES"] = "esi-characters.read_titles.v1";
- SCOPES$1["ALLIANCES_READ_CONTACTS"] = "esi-alliances.read_contacts.v1";
- SCOPES$1["CHARACTERS_READ_FW_STATS"] = "esi-characters.read_fw_stats.v1";
- SCOPES$1["CORPORATIONS_READ_FW_STATS"] = "esi-corporations.read_fw_stats.v1";
- return SCOPES$1;
-}({});
-
-// ../eve/node_modules/drizzle-orm/entity.js
-var entityKind = Symbol.for("drizzle:entityKind");
-var hasOwnEntityKind = Symbol.for("drizzle:hasOwnEntityKind");
-function is(value, type) {
- if (!value || typeof value !== "object") {
- return false;
- }
- if (value instanceof type) {
- return true;
- }
- if (!Object.prototype.hasOwnProperty.call(type, entityKind)) {
- throw new Error(`Class "${type.name ?? ""}" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`);
- }
- let cls = Object.getPrototypeOf(value).constructor;
- if (cls) {
- while (cls) {
- if (entityKind in cls && cls[entityKind] === type[entityKind]) {
- return true;
- }
- cls = Object.getPrototypeOf(cls);
- }
- }
- return false;
-}
-
-// ../eve/node_modules/drizzle-orm/column.js
-class Column {
- constructor(table, config) {
- this.table = table;
- this.config = config;
- this.name = config.name;
- this.keyAsName = config.keyAsName;
- this.notNull = config.notNull;
- this.default = config.default;
- this.defaultFn = config.defaultFn;
- this.onUpdateFn = config.onUpdateFn;
- this.hasDefault = config.hasDefault;
- this.primary = config.primaryKey;
- this.isUnique = config.isUnique;
- this.uniqueName = config.uniqueName;
- this.uniqueType = config.uniqueType;
- this.dataType = config.dataType;
- this.columnType = config.columnType;
- this.generated = config.generated;
- this.generatedIdentity = config.generatedIdentity;
- }
- static [entityKind] = "Column";
- name;
- keyAsName;
- primary;
- notNull;
- default;
- defaultFn;
- onUpdateFn;
- hasDefault;
- isUnique;
- uniqueName;
- uniqueType;
- dataType;
- columnType;
- enumValues = undefined;
- generated = undefined;
- generatedIdentity = undefined;
- config;
- mapFromDriverValue(value) {
- return value;
- }
- mapToDriverValue(value) {
- return value;
- }
- shouldDisableInsert() {
- return this.config.generated !== undefined && this.config.generated.type !== "byDefault";
- }
-}
-
-// ../eve/node_modules/drizzle-orm/column-builder.js
-class ColumnBuilder {
- static [entityKind] = "ColumnBuilder";
- config;
- constructor(name, dataType, columnType) {
- this.config = {
- name,
- keyAsName: name === "",
- notNull: false,
- default: undefined,
- hasDefault: false,
- primaryKey: false,
- isUnique: false,
- uniqueName: undefined,
- uniqueType: undefined,
- dataType,
- columnType,
- generated: undefined
- };
- }
- $type() {
- return this;
- }
- notNull() {
- this.config.notNull = true;
- return this;
- }
- default(value) {
- this.config.default = value;
- this.config.hasDefault = true;
- return this;
- }
- $defaultFn(fn) {
- this.config.defaultFn = fn;
- this.config.hasDefault = true;
- return this;
- }
- $default = this.$defaultFn;
- $onUpdateFn(fn) {
- this.config.onUpdateFn = fn;
- this.config.hasDefault = true;
- return this;
- }
- $onUpdate = this.$onUpdateFn;
- primaryKey() {
- this.config.primaryKey = true;
- this.config.notNull = true;
- return this;
- }
- setName(name) {
- if (this.config.name !== "")
- return;
- this.config.name = name;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/table.utils.js
-var TableName = Symbol.for("drizzle:Name");
-
-// ../eve/node_modules/drizzle-orm/tracing-utils.js
-function iife(fn, ...args) {
- return fn(...args);
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/unique-constraint.js
-function uniqueKeyName(table, columns) {
- return `${table[TableName]}_${columns.join("_")}_unique`;
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/columns/common.js
-class PgColumn extends Column {
- constructor(table, config) {
- if (!config.uniqueName) {
- config.uniqueName = uniqueKeyName(table, [config.name]);
- }
- super(table, config);
- this.table = table;
- }
- static [entityKind] = "PgColumn";
-}
-
-class ExtraConfigColumn extends PgColumn {
- static [entityKind] = "ExtraConfigColumn";
- getSQLType() {
- return this.getSQLType();
- }
- indexConfig = {
- order: this.config.order ?? "asc",
- nulls: this.config.nulls ?? "last",
- opClass: this.config.opClass
- };
- defaultConfig = {
- order: "asc",
- nulls: "last",
- opClass: undefined
- };
- asc() {
- this.indexConfig.order = "asc";
- return this;
- }
- desc() {
- this.indexConfig.order = "desc";
- return this;
- }
- nullsFirst() {
- this.indexConfig.nulls = "first";
- return this;
- }
- nullsLast() {
- this.indexConfig.nulls = "last";
- return this;
- }
- op(opClass) {
- this.indexConfig.opClass = opClass;
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/columns/enum.js
-class PgEnumObjectColumn extends PgColumn {
- static [entityKind] = "PgEnumObjectColumn";
- enum;
- enumValues = this.config.enum.enumValues;
- constructor(table, config) {
- super(table, config);
- this.enum = config.enum;
- }
- getSQLType() {
- return this.enum.enumName;
- }
-}
-var isPgEnumSym = Symbol.for("drizzle:isPgEnum");
-function isPgEnum(obj) {
- return !!obj && typeof obj === "function" && isPgEnumSym in obj && obj[isPgEnumSym] === true;
-}
-class PgEnumColumn extends PgColumn {
- static [entityKind] = "PgEnumColumn";
- enum = this.config.enum;
- enumValues = this.config.enum.enumValues;
- constructor(table, config) {
- super(table, config);
- this.enum = config.enum;
- }
- getSQLType() {
- return this.enum.enumName;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/subquery.js
-class Subquery {
- static [entityKind] = "Subquery";
- constructor(sql, fields, alias, isWith = false, usedTables = []) {
- this._ = {
- brand: "Subquery",
- sql,
- selectedFields: fields,
- alias,
- isWith,
- usedTables
- };
- }
-}
-
-class WithSubquery extends Subquery {
- static [entityKind] = "WithSubquery";
-}
-
-// ../eve/node_modules/drizzle-orm/version.js
-var version = "0.44.5";
-
-// ../eve/node_modules/drizzle-orm/tracing.js
-var otel;
-var rawTracer;
-var tracer = {
- startActiveSpan(name, fn) {
- if (!otel) {
- return fn();
- }
- if (!rawTracer) {
- rawTracer = otel.trace.getTracer("drizzle-orm", version);
- }
- return iife((otel2, rawTracer2) => rawTracer2.startActiveSpan(name, (span) => {
- try {
- return fn(span);
- } catch (e) {
- span.setStatus({
- code: otel2.SpanStatusCode.ERROR,
- message: e instanceof Error ? e.message : "Unknown error"
- });
- throw e;
- } finally {
- span.end();
- }
- }), otel, rawTracer);
- }
-};
-
-// ../eve/node_modules/drizzle-orm/view-common.js
-var ViewBaseConfig = Symbol.for("drizzle:ViewBaseConfig");
-
-// ../eve/node_modules/drizzle-orm/table.js
-var Schema = Symbol.for("drizzle:Schema");
-var Columns = Symbol.for("drizzle:Columns");
-var ExtraConfigColumns = Symbol.for("drizzle:ExtraConfigColumns");
-var OriginalName = Symbol.for("drizzle:OriginalName");
-var BaseName = Symbol.for("drizzle:BaseName");
-var IsAlias = Symbol.for("drizzle:IsAlias");
-var ExtraConfigBuilder = Symbol.for("drizzle:ExtraConfigBuilder");
-var IsDrizzleTable = Symbol.for("drizzle:IsDrizzleTable");
-
-class Table {
- static [entityKind] = "Table";
- static Symbol = {
- Name: TableName,
- Schema,
- OriginalName,
- Columns,
- ExtraConfigColumns,
- BaseName,
- IsAlias,
- ExtraConfigBuilder
- };
- [TableName];
- [OriginalName];
- [Schema];
- [Columns];
- [ExtraConfigColumns];
- [BaseName];
- [IsAlias] = false;
- [IsDrizzleTable] = true;
- [ExtraConfigBuilder] = undefined;
- constructor(name, schema, baseName) {
- this[TableName] = this[OriginalName] = name;
- this[Schema] = schema;
- this[BaseName] = baseName;
- }
-}
-function getTableName(table) {
- return table[TableName];
-}
-function getTableUniqueName(table) {
- return `${table[Schema] ?? "public"}.${table[TableName]}`;
-}
-
-// ../eve/node_modules/drizzle-orm/sql/sql.js
-function isSQLWrapper(value) {
- return value !== null && value !== undefined && typeof value.getSQL === "function";
-}
-function mergeQueries(queries) {
- const result = { sql: "", params: [] };
- for (const query of queries) {
- result.sql += query.sql;
- result.params.push(...query.params);
- if (query.typings?.length) {
- if (!result.typings) {
- result.typings = [];
- }
- result.typings.push(...query.typings);
- }
- }
- return result;
-}
-
-class StringChunk {
- static [entityKind] = "StringChunk";
- value;
- constructor(value) {
- this.value = Array.isArray(value) ? value : [value];
- }
- getSQL() {
- return new SQL([this]);
- }
-}
-
-class SQL {
- constructor(queryChunks) {
- this.queryChunks = queryChunks;
- for (const chunk of queryChunks) {
- if (is(chunk, Table)) {
- const schemaName = chunk[Table.Symbol.Schema];
- this.usedTables.push(schemaName === undefined ? chunk[Table.Symbol.Name] : schemaName + "." + chunk[Table.Symbol.Name]);
- }
- }
- }
- static [entityKind] = "SQL";
- decoder = noopDecoder;
- shouldInlineParams = false;
- usedTables = [];
- append(query) {
- this.queryChunks.push(...query.queryChunks);
- return this;
- }
- toQuery(config) {
- return tracer.startActiveSpan("drizzle.buildSQL", (span) => {
- const query = this.buildQueryFromSourceParams(this.queryChunks, config);
- span?.setAttributes({
- "drizzle.query.text": query.sql,
- "drizzle.query.params": JSON.stringify(query.params)
- });
- return query;
- });
- }
- buildQueryFromSourceParams(chunks, _config) {
- const config = Object.assign({}, _config, {
- inlineParams: _config.inlineParams || this.shouldInlineParams,
- paramStartIndex: _config.paramStartIndex || { value: 0 }
- });
- const {
- casing,
- escapeName,
- escapeParam,
- prepareTyping,
- inlineParams,
- paramStartIndex
- } = config;
- return mergeQueries(chunks.map((chunk) => {
- if (is(chunk, StringChunk)) {
- return { sql: chunk.value.join(""), params: [] };
- }
- if (is(chunk, Name)) {
- return { sql: escapeName(chunk.value), params: [] };
- }
- if (chunk === undefined) {
- return { sql: "", params: [] };
- }
- if (Array.isArray(chunk)) {
- const result = [new StringChunk("(")];
- for (const [i, p] of chunk.entries()) {
- result.push(p);
- if (i < chunk.length - 1) {
- result.push(new StringChunk(", "));
- }
- }
- result.push(new StringChunk(")"));
- return this.buildQueryFromSourceParams(result, config);
- }
- if (is(chunk, SQL)) {
- return this.buildQueryFromSourceParams(chunk.queryChunks, {
- ...config,
- inlineParams: inlineParams || chunk.shouldInlineParams
- });
- }
- if (is(chunk, Table)) {
- const schemaName = chunk[Table.Symbol.Schema];
- const tableName = chunk[Table.Symbol.Name];
- return {
- sql: schemaName === undefined || chunk[IsAlias] ? escapeName(tableName) : escapeName(schemaName) + "." + escapeName(tableName),
- params: []
- };
- }
- if (is(chunk, Column)) {
- const columnName = casing.getColumnCasing(chunk);
- if (_config.invokeSource === "indexes") {
- return { sql: escapeName(columnName), params: [] };
- }
- const schemaName = chunk.table[Table.Symbol.Schema];
- return {
- sql: chunk.table[IsAlias] || schemaName === undefined ? escapeName(chunk.table[Table.Symbol.Name]) + "." + escapeName(columnName) : escapeName(schemaName) + "." + escapeName(chunk.table[Table.Symbol.Name]) + "." + escapeName(columnName),
- params: []
- };
- }
- if (is(chunk, View)) {
- const schemaName = chunk[ViewBaseConfig].schema;
- const viewName = chunk[ViewBaseConfig].name;
- return {
- sql: schemaName === undefined || chunk[ViewBaseConfig].isAlias ? escapeName(viewName) : escapeName(schemaName) + "." + escapeName(viewName),
- params: []
- };
- }
- if (is(chunk, Param)) {
- if (is(chunk.value, Placeholder)) {
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
- }
- const mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);
- if (is(mappedValue, SQL)) {
- return this.buildQueryFromSourceParams([mappedValue], config);
- }
- if (inlineParams) {
- return { sql: this.mapInlineParam(mappedValue, config), params: [] };
- }
- let typings = ["none"];
- if (prepareTyping) {
- typings = [prepareTyping(chunk.encoder)];
- }
- return { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };
- }
- if (is(chunk, Placeholder)) {
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
- }
- if (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {
- return { sql: escapeName(chunk.fieldAlias), params: [] };
- }
- if (is(chunk, Subquery)) {
- if (chunk._.isWith) {
- return { sql: escapeName(chunk._.alias), params: [] };
- }
- return this.buildQueryFromSourceParams([
- new StringChunk("("),
- chunk._.sql,
- new StringChunk(") "),
- new Name(chunk._.alias)
- ], config);
- }
- if (isPgEnum(chunk)) {
- if (chunk.schema) {
- return { sql: escapeName(chunk.schema) + "." + escapeName(chunk.enumName), params: [] };
- }
- return { sql: escapeName(chunk.enumName), params: [] };
- }
- if (isSQLWrapper(chunk)) {
- if (chunk.shouldOmitSQLParens?.()) {
- return this.buildQueryFromSourceParams([chunk.getSQL()], config);
- }
- return this.buildQueryFromSourceParams([
- new StringChunk("("),
- chunk.getSQL(),
- new StringChunk(")")
- ], config);
- }
- if (inlineParams) {
- return { sql: this.mapInlineParam(chunk, config), params: [] };
- }
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
- }));
- }
- mapInlineParam(chunk, { escapeString }) {
- if (chunk === null) {
- return "null";
- }
- if (typeof chunk === "number" || typeof chunk === "boolean") {
- return chunk.toString();
- }
- if (typeof chunk === "string") {
- return escapeString(chunk);
- }
- if (typeof chunk === "object") {
- const mappedValueAsString = chunk.toString();
- if (mappedValueAsString === "[object Object]") {
- return escapeString(JSON.stringify(chunk));
- }
- return escapeString(mappedValueAsString);
- }
- throw new Error("Unexpected param value: " + chunk);
- }
- getSQL() {
- return this;
- }
- as(alias) {
- if (alias === undefined) {
- return this;
- }
- return new SQL.Aliased(this, alias);
- }
- mapWith(decoder) {
- this.decoder = typeof decoder === "function" ? { mapFromDriverValue: decoder } : decoder;
- return this;
- }
- inlineParams() {
- this.shouldInlineParams = true;
- return this;
- }
- if(condition) {
- return condition ? this : undefined;
- }
-}
-
-class Name {
- constructor(value) {
- this.value = value;
- }
- static [entityKind] = "Name";
- brand;
- getSQL() {
- return new SQL([this]);
- }
-}
-function isDriverValueEncoder(value) {
- return typeof value === "object" && value !== null && "mapToDriverValue" in value && typeof value.mapToDriverValue === "function";
-}
-var noopDecoder = {
- mapFromDriverValue: (value) => value
-};
-var noopEncoder = {
- mapToDriverValue: (value) => value
-};
-var noopMapper = {
- ...noopDecoder,
- ...noopEncoder
-};
-
-class Param {
- constructor(value, encoder = noopEncoder) {
- this.value = value;
- this.encoder = encoder;
- }
- static [entityKind] = "Param";
- brand;
- getSQL() {
- return new SQL([this]);
- }
-}
-function sql(strings, ...params) {
- const queryChunks = [];
- if (params.length > 0 || strings.length > 0 && strings[0] !== "") {
- queryChunks.push(new StringChunk(strings[0]));
- }
- for (const [paramIndex, param2] of params.entries()) {
- queryChunks.push(param2, new StringChunk(strings[paramIndex + 1]));
- }
- return new SQL(queryChunks);
-}
-((sql2) => {
- function empty() {
- return new SQL([]);
- }
- sql2.empty = empty;
- function fromList(list) {
- return new SQL(list);
- }
- sql2.fromList = fromList;
- function raw(str) {
- return new SQL([new StringChunk(str)]);
- }
- sql2.raw = raw;
- function join(chunks, separator) {
- const result = [];
- for (const [i, chunk] of chunks.entries()) {
- if (i > 0 && separator !== undefined) {
- result.push(separator);
- }
- result.push(chunk);
- }
- return new SQL(result);
- }
- sql2.join = join;
- function identifier(value) {
- return new Name(value);
- }
- sql2.identifier = identifier;
- function placeholder2(name2) {
- return new Placeholder(name2);
- }
- sql2.placeholder = placeholder2;
- function param2(value, encoder) {
- return new Param(value, encoder);
- }
- sql2.param = param2;
-})(sql || (sql = {}));
-((SQL2) => {
-
- class Aliased {
- constructor(sql2, fieldAlias) {
- this.sql = sql2;
- this.fieldAlias = fieldAlias;
- }
- static [entityKind] = "SQL.Aliased";
- isSelectionField = false;
- getSQL() {
- return this.sql;
- }
- clone() {
- return new Aliased(this.sql, this.fieldAlias);
- }
- }
- SQL2.Aliased = Aliased;
-})(SQL || (SQL = {}));
-
-class Placeholder {
- constructor(name2) {
- this.name = name2;
- }
- static [entityKind] = "Placeholder";
- getSQL() {
- return new SQL([this]);
- }
-}
-function fillPlaceholders(params, values) {
- return params.map((p) => {
- if (is(p, Placeholder)) {
- if (!(p.name in values)) {
- throw new Error(`No value for placeholder "${p.name}" was provided`);
- }
- return values[p.name];
- }
- if (is(p, Param) && is(p.value, Placeholder)) {
- if (!(p.value.name in values)) {
- throw new Error(`No value for placeholder "${p.value.name}" was provided`);
- }
- return p.encoder.mapToDriverValue(values[p.value.name]);
- }
- return p;
- });
-}
-var IsDrizzleView = Symbol.for("drizzle:IsDrizzleView");
-
-class View {
- static [entityKind] = "View";
- [ViewBaseConfig];
- [IsDrizzleView] = true;
- constructor({ name: name2, schema, selectedFields, query }) {
- this[ViewBaseConfig] = {
- name: name2,
- originalName: name2,
- schema,
- selectedFields,
- query,
- isExisting: !query,
- isAlias: false
- };
- }
- getSQL() {
- return new SQL([this]);
- }
-}
-Column.prototype.getSQL = function() {
- return new SQL([this]);
-};
-Table.prototype.getSQL = function() {
- return new SQL([this]);
-};
-Subquery.prototype.getSQL = function() {
- return new SQL([this]);
-};
-
-// ../eve/node_modules/drizzle-orm/alias.js
-class ColumnAliasProxyHandler {
- constructor(table) {
- this.table = table;
- }
- static [entityKind] = "ColumnAliasProxyHandler";
- get(columnObj, prop) {
- if (prop === "table") {
- return this.table;
- }
- return columnObj[prop];
- }
-}
-
-class TableAliasProxyHandler {
- constructor(alias, replaceOriginalName) {
- this.alias = alias;
- this.replaceOriginalName = replaceOriginalName;
- }
- static [entityKind] = "TableAliasProxyHandler";
- get(target, prop) {
- if (prop === Table.Symbol.IsAlias) {
- return true;
- }
- if (prop === Table.Symbol.Name) {
- return this.alias;
- }
- if (this.replaceOriginalName && prop === Table.Symbol.OriginalName) {
- return this.alias;
- }
- if (prop === ViewBaseConfig) {
- return {
- ...target[ViewBaseConfig],
- name: this.alias,
- isAlias: true
- };
- }
- if (prop === Table.Symbol.Columns) {
- const columns = target[Table.Symbol.Columns];
- if (!columns) {
- return columns;
- }
- const proxiedColumns = {};
- Object.keys(columns).map((key) => {
- proxiedColumns[key] = new Proxy(columns[key], new ColumnAliasProxyHandler(new Proxy(target, this)));
- });
- return proxiedColumns;
- }
- const value = target[prop];
- if (is(value, Column)) {
- return new Proxy(value, new ColumnAliasProxyHandler(new Proxy(target, this)));
- }
- return value;
- }
-}
-function aliasedTable(table, tableAlias) {
- return new Proxy(table, new TableAliasProxyHandler(tableAlias, false));
-}
-function aliasedTableColumn(column, tableAlias) {
- return new Proxy(column, new ColumnAliasProxyHandler(new Proxy(column.table, new TableAliasProxyHandler(tableAlias, false))));
-}
-function mapColumnsInAliasedSQLToAlias(query, alias) {
- return new SQL.Aliased(mapColumnsInSQLToAlias(query.sql, alias), query.fieldAlias);
-}
-function mapColumnsInSQLToAlias(query, alias) {
- return sql.join(query.queryChunks.map((c) => {
- if (is(c, Column)) {
- return aliasedTableColumn(c, alias);
- }
- if (is(c, SQL)) {
- return mapColumnsInSQLToAlias(c, alias);
- }
- if (is(c, SQL.Aliased)) {
- return mapColumnsInAliasedSQLToAlias(c, alias);
- }
- return c;
- }));
-}
-
-// ../eve/node_modules/drizzle-orm/utils.js
-function mapResultRow(columns, row, joinsNotNullableMap) {
- const nullifyMap = {};
- const result = columns.reduce((result2, { path, field }, columnIndex) => {
- let decoder;
- if (is(field, Column)) {
- decoder = field;
- } else if (is(field, SQL)) {
- decoder = field.decoder;
- } else {
- decoder = field.sql.decoder;
- }
- let node = result2;
- for (const [pathChunkIndex, pathChunk] of path.entries()) {
- if (pathChunkIndex < path.length - 1) {
- if (!(pathChunk in node)) {
- node[pathChunk] = {};
- }
- node = node[pathChunk];
- } else {
- const rawValue = row[columnIndex];
- const value = node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue);
- if (joinsNotNullableMap && is(field, Column) && path.length === 2) {
- const objectName = path[0];
- if (!(objectName in nullifyMap)) {
- nullifyMap[objectName] = value === null ? getTableName(field.table) : false;
- } else if (typeof nullifyMap[objectName] === "string" && nullifyMap[objectName] !== getTableName(field.table)) {
- nullifyMap[objectName] = false;
- }
- }
- }
- }
- return result2;
- }, {});
- if (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {
- for (const [objectName, tableName] of Object.entries(nullifyMap)) {
- if (typeof tableName === "string" && !joinsNotNullableMap[tableName]) {
- result[objectName] = null;
- }
- }
- }
- return result;
-}
-function orderSelectedFields(fields, pathPrefix) {
- return Object.entries(fields).reduce((result, [name, field]) => {
- if (typeof name !== "string") {
- return result;
- }
- const newPath = pathPrefix ? [...pathPrefix, name] : [name];
- if (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased)) {
- result.push({ path: newPath, field });
- } else if (is(field, Table)) {
- result.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath));
- } else {
- result.push(...orderSelectedFields(field, newPath));
- }
- return result;
- }, []);
-}
-function haveSameKeys(left, right) {
- const leftKeys = Object.keys(left);
- const rightKeys = Object.keys(right);
- if (leftKeys.length !== rightKeys.length) {
- return false;
- }
- for (const [index, key] of leftKeys.entries()) {
- if (key !== rightKeys[index]) {
- return false;
- }
- }
- return true;
-}
-function mapUpdateSet(table, values) {
- const entries = Object.entries(values).filter(([, value]) => value !== undefined).map(([key, value]) => {
- if (is(value, SQL) || is(value, Column)) {
- return [key, value];
- } else {
- return [key, new Param(value, table[Table.Symbol.Columns][key])];
- }
- });
- if (entries.length === 0) {
- throw new Error("No values to set");
- }
- return Object.fromEntries(entries);
-}
-function applyMixins(baseClass, extendedClasses) {
- for (const extendedClass of extendedClasses) {
- for (const name of Object.getOwnPropertyNames(extendedClass.prototype)) {
- if (name === "constructor")
- continue;
- Object.defineProperty(baseClass.prototype, name, Object.getOwnPropertyDescriptor(extendedClass.prototype, name) || /* @__PURE__ */ Object.create(null));
- }
- }
-}
-function getTableColumns(table) {
- return table[Table.Symbol.Columns];
-}
-function getTableLikeName(table) {
- return is(table, Subquery) ? table._.alias : is(table, View) ? table[ViewBaseConfig].name : is(table, SQL) ? undefined : table[Table.Symbol.IsAlias] ? table[Table.Symbol.Name] : table[Table.Symbol.BaseName];
-}
-function getColumnNameAndConfig(a, b) {
- return {
- name: typeof a === "string" && a.length > 0 ? a : "",
- config: typeof a === "object" ? a : b
- };
-}
-function isConfig(data) {
- if (typeof data !== "object" || data === null)
- return false;
- if (data.constructor.name !== "Object")
- return false;
- if ("logger" in data) {
- const type = typeof data["logger"];
- if (type !== "boolean" && (type !== "object" || typeof data["logger"]["logQuery"] !== "function") && type !== "undefined")
- return false;
- return true;
- }
- if ("schema" in data) {
- const type = typeof data["schema"];
- if (type !== "object" && type !== "undefined")
- return false;
- return true;
- }
- if ("casing" in data) {
- const type = typeof data["casing"];
- if (type !== "string" && type !== "undefined")
- return false;
- return true;
- }
- if ("mode" in data) {
- if (data["mode"] !== "default" || data["mode"] !== "planetscale" || data["mode"] !== undefined)
- return false;
- return true;
- }
- if ("connection" in data) {
- const type = typeof data["connection"];
- if (type !== "string" && type !== "object" && type !== "undefined")
- return false;
- return true;
- }
- if ("client" in data) {
- const type = typeof data["client"];
- if (type !== "object" && type !== "function" && type !== "undefined")
- return false;
- return true;
- }
- if (Object.keys(data).length === 0)
- return true;
- return false;
-}
-var textDecoder = typeof TextDecoder === "undefined" ? null : new TextDecoder;
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/foreign-keys.js
-class ForeignKeyBuilder {
- static [entityKind] = "SQLiteForeignKeyBuilder";
- reference;
- _onUpdate;
- _onDelete;
- constructor(config, actions) {
- this.reference = () => {
- const { name, columns, foreignColumns } = config();
- return { name, columns, foreignTable: foreignColumns[0].table, foreignColumns };
- };
- if (actions) {
- this._onUpdate = actions.onUpdate;
- this._onDelete = actions.onDelete;
- }
- }
- onUpdate(action) {
- this._onUpdate = action;
- return this;
- }
- onDelete(action) {
- this._onDelete = action;
- return this;
- }
- build(table) {
- return new ForeignKey(table, this);
- }
-}
-
-class ForeignKey {
- constructor(table, builder) {
- this.table = table;
- this.reference = builder.reference;
- this.onUpdate = builder._onUpdate;
- this.onDelete = builder._onDelete;
- }
- static [entityKind] = "SQLiteForeignKey";
- reference;
- onUpdate;
- onDelete;
- getName() {
- const { name, columns, foreignColumns } = this.reference();
- const columnNames = columns.map((column) => column.name);
- const foreignColumnNames = foreignColumns.map((column) => column.name);
- const chunks = [
- this.table[TableName],
- ...columnNames,
- foreignColumns[0].table[TableName],
- ...foreignColumnNames
- ];
- return name ?? `${chunks.join("_")}_fk`;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/unique-constraint.js
-function uniqueKeyName2(table, columns) {
- return `${table[TableName]}_${columns.join("_")}_unique`;
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/common.js
-class SQLiteColumnBuilder extends ColumnBuilder {
- static [entityKind] = "SQLiteColumnBuilder";
- foreignKeyConfigs = [];
- references(ref, actions = {}) {
- this.foreignKeyConfigs.push({ ref, actions });
- return this;
- }
- unique(name) {
- this.config.isUnique = true;
- this.config.uniqueName = name;
- return this;
- }
- generatedAlwaysAs(as, config) {
- this.config.generated = {
- as,
- type: "always",
- mode: config?.mode ?? "virtual"
- };
- return this;
- }
- buildForeignKeys(column, table) {
- return this.foreignKeyConfigs.map(({ ref, actions }) => {
- return ((ref2, actions2) => {
- const builder = new ForeignKeyBuilder(() => {
- const foreignColumn = ref2();
- return { columns: [column], foreignColumns: [foreignColumn] };
- });
- if (actions2.onUpdate) {
- builder.onUpdate(actions2.onUpdate);
- }
- if (actions2.onDelete) {
- builder.onDelete(actions2.onDelete);
- }
- return builder.build(table);
- })(ref, actions);
- });
- }
-}
-
-class SQLiteColumn extends Column {
- constructor(table, config) {
- if (!config.uniqueName) {
- config.uniqueName = uniqueKeyName2(table, [config.name]);
- }
- super(table, config);
- this.table = table;
- }
- static [entityKind] = "SQLiteColumn";
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/blob.js
-class SQLiteBigIntBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBigIntBuilder";
- constructor(name) {
- super(name, "bigint", "SQLiteBigInt");
- }
- build(table) {
- return new SQLiteBigInt(table, this.config);
- }
-}
-
-class SQLiteBigInt extends SQLiteColumn {
- static [entityKind] = "SQLiteBigInt";
- getSQLType() {
- return "blob";
- }
- mapFromDriverValue(value) {
- if (typeof Buffer !== "undefined" && Buffer.from) {
- const buf = Buffer.isBuffer(value) ? value : value instanceof ArrayBuffer ? Buffer.from(value) : value.buffer ? Buffer.from(value.buffer, value.byteOffset, value.byteLength) : Buffer.from(value);
- return BigInt(buf.toString("utf8"));
- }
- return BigInt(textDecoder.decode(value));
- }
- mapToDriverValue(value) {
- return Buffer.from(value.toString());
- }
-}
-
-class SQLiteBlobJsonBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBlobJsonBuilder";
- constructor(name) {
- super(name, "json", "SQLiteBlobJson");
- }
- build(table) {
- return new SQLiteBlobJson(table, this.config);
- }
-}
-
-class SQLiteBlobJson extends SQLiteColumn {
- static [entityKind] = "SQLiteBlobJson";
- getSQLType() {
- return "blob";
- }
- mapFromDriverValue(value) {
- if (typeof Buffer !== "undefined" && Buffer.from) {
- const buf = Buffer.isBuffer(value) ? value : value instanceof ArrayBuffer ? Buffer.from(value) : value.buffer ? Buffer.from(value.buffer, value.byteOffset, value.byteLength) : Buffer.from(value);
- return JSON.parse(buf.toString("utf8"));
- }
- return JSON.parse(textDecoder.decode(value));
- }
- mapToDriverValue(value) {
- return Buffer.from(JSON.stringify(value));
- }
-}
-
-class SQLiteBlobBufferBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBlobBufferBuilder";
- constructor(name) {
- super(name, "buffer", "SQLiteBlobBuffer");
- }
- build(table) {
- return new SQLiteBlobBuffer(table, this.config);
- }
-}
-
-class SQLiteBlobBuffer extends SQLiteColumn {
- static [entityKind] = "SQLiteBlobBuffer";
- mapFromDriverValue(value) {
- if (Buffer.isBuffer(value)) {
- return value;
- }
- return Buffer.from(value);
- }
- getSQLType() {
- return "blob";
- }
-}
-function blob(a, b) {
- const { name, config } = getColumnNameAndConfig(a, b);
- if (config?.mode === "json") {
- return new SQLiteBlobJsonBuilder(name);
- }
- if (config?.mode === "bigint") {
- return new SQLiteBigIntBuilder(name);
- }
- return new SQLiteBlobBufferBuilder(name);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/custom.js
-class SQLiteCustomColumnBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteCustomColumnBuilder";
- constructor(name, fieldConfig, customTypeParams) {
- super(name, "custom", "SQLiteCustomColumn");
- this.config.fieldConfig = fieldConfig;
- this.config.customTypeParams = customTypeParams;
- }
- build(table) {
- return new SQLiteCustomColumn(table, this.config);
- }
-}
-
-class SQLiteCustomColumn extends SQLiteColumn {
- static [entityKind] = "SQLiteCustomColumn";
- sqlName;
- mapTo;
- mapFrom;
- constructor(table, config) {
- super(table, config);
- this.sqlName = config.customTypeParams.dataType(config.fieldConfig);
- this.mapTo = config.customTypeParams.toDriver;
- this.mapFrom = config.customTypeParams.fromDriver;
- }
- getSQLType() {
- return this.sqlName;
- }
- mapFromDriverValue(value) {
- return typeof this.mapFrom === "function" ? this.mapFrom(value) : value;
- }
- mapToDriverValue(value) {
- return typeof this.mapTo === "function" ? this.mapTo(value) : value;
- }
-}
-function customType(customTypeParams) {
- return (a, b) => {
- const { name, config } = getColumnNameAndConfig(a, b);
- return new SQLiteCustomColumnBuilder(name, config, customTypeParams);
- };
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/integer.js
-class SQLiteBaseIntegerBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBaseIntegerBuilder";
- constructor(name, dataType, columnType) {
- super(name, dataType, columnType);
- this.config.autoIncrement = false;
- }
- primaryKey(config) {
- if (config?.autoIncrement) {
- this.config.autoIncrement = true;
- }
- this.config.hasDefault = true;
- return super.primaryKey();
- }
-}
-
-class SQLiteBaseInteger extends SQLiteColumn {
- static [entityKind] = "SQLiteBaseInteger";
- autoIncrement = this.config.autoIncrement;
- getSQLType() {
- return "integer";
- }
-}
-
-class SQLiteIntegerBuilder extends SQLiteBaseIntegerBuilder {
- static [entityKind] = "SQLiteIntegerBuilder";
- constructor(name) {
- super(name, "number", "SQLiteInteger");
- }
- build(table) {
- return new SQLiteInteger(table, this.config);
- }
-}
-
-class SQLiteInteger extends SQLiteBaseInteger {
- static [entityKind] = "SQLiteInteger";
-}
-
-class SQLiteTimestampBuilder extends SQLiteBaseIntegerBuilder {
- static [entityKind] = "SQLiteTimestampBuilder";
- constructor(name, mode) {
- super(name, "date", "SQLiteTimestamp");
- this.config.mode = mode;
- }
- defaultNow() {
- return this.default(sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`);
- }
- build(table) {
- return new SQLiteTimestamp(table, this.config);
- }
-}
-
-class SQLiteTimestamp extends SQLiteBaseInteger {
- static [entityKind] = "SQLiteTimestamp";
- mode = this.config.mode;
- mapFromDriverValue(value) {
- if (this.config.mode === "timestamp") {
- return new Date(value * 1000);
- }
- return new Date(value);
- }
- mapToDriverValue(value) {
- const unix = value.getTime();
- if (this.config.mode === "timestamp") {
- return Math.floor(unix / 1000);
- }
- return unix;
- }
-}
-
-class SQLiteBooleanBuilder extends SQLiteBaseIntegerBuilder {
- static [entityKind] = "SQLiteBooleanBuilder";
- constructor(name, mode) {
- super(name, "boolean", "SQLiteBoolean");
- this.config.mode = mode;
- }
- build(table) {
- return new SQLiteBoolean(table, this.config);
- }
-}
-
-class SQLiteBoolean extends SQLiteBaseInteger {
- static [entityKind] = "SQLiteBoolean";
- mode = this.config.mode;
- mapFromDriverValue(value) {
- return Number(value) === 1;
- }
- mapToDriverValue(value) {
- return value ? 1 : 0;
- }
-}
-function integer(a, b) {
- const { name, config } = getColumnNameAndConfig(a, b);
- if (config?.mode === "timestamp" || config?.mode === "timestamp_ms") {
- return new SQLiteTimestampBuilder(name, config.mode);
- }
- if (config?.mode === "boolean") {
- return new SQLiteBooleanBuilder(name, config.mode);
- }
- return new SQLiteIntegerBuilder(name);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/numeric.js
-class SQLiteNumericBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteNumericBuilder";
- constructor(name) {
- super(name, "string", "SQLiteNumeric");
- }
- build(table) {
- return new SQLiteNumeric(table, this.config);
- }
-}
-
-class SQLiteNumeric extends SQLiteColumn {
- static [entityKind] = "SQLiteNumeric";
- mapFromDriverValue(value) {
- if (typeof value === "string")
- return value;
- return String(value);
- }
- getSQLType() {
- return "numeric";
- }
-}
-
-class SQLiteNumericNumberBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteNumericNumberBuilder";
- constructor(name) {
- super(name, "number", "SQLiteNumericNumber");
- }
- build(table) {
- return new SQLiteNumericNumber(table, this.config);
- }
-}
-
-class SQLiteNumericNumber extends SQLiteColumn {
- static [entityKind] = "SQLiteNumericNumber";
- mapFromDriverValue(value) {
- if (typeof value === "number")
- return value;
- return Number(value);
- }
- mapToDriverValue = String;
- getSQLType() {
- return "numeric";
- }
-}
-
-class SQLiteNumericBigIntBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteNumericBigIntBuilder";
- constructor(name) {
- super(name, "bigint", "SQLiteNumericBigInt");
- }
- build(table) {
- return new SQLiteNumericBigInt(table, this.config);
- }
-}
-
-class SQLiteNumericBigInt extends SQLiteColumn {
- static [entityKind] = "SQLiteNumericBigInt";
- mapFromDriverValue = BigInt;
- mapToDriverValue = String;
- getSQLType() {
- return "numeric";
- }
-}
-function numeric(a, b) {
- const { name, config } = getColumnNameAndConfig(a, b);
- const mode = config?.mode;
- return mode === "number" ? new SQLiteNumericNumberBuilder(name) : mode === "bigint" ? new SQLiteNumericBigIntBuilder(name) : new SQLiteNumericBuilder(name);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/real.js
-class SQLiteRealBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteRealBuilder";
- constructor(name) {
- super(name, "number", "SQLiteReal");
- }
- build(table) {
- return new SQLiteReal(table, this.config);
- }
-}
-
-class SQLiteReal extends SQLiteColumn {
- static [entityKind] = "SQLiteReal";
- getSQLType() {
- return "real";
- }
-}
-function real(name) {
- return new SQLiteRealBuilder(name ?? "");
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/text.js
-class SQLiteTextBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteTextBuilder";
- constructor(name, config) {
- super(name, "string", "SQLiteText");
- this.config.enumValues = config.enum;
- this.config.length = config.length;
- }
- build(table) {
- return new SQLiteText(table, this.config);
- }
-}
-
-class SQLiteText extends SQLiteColumn {
- static [entityKind] = "SQLiteText";
- enumValues = this.config.enumValues;
- length = this.config.length;
- constructor(table, config) {
- super(table, config);
- }
- getSQLType() {
- return `text${this.config.length ? `(${this.config.length})` : ""}`;
- }
-}
-
-class SQLiteTextJsonBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteTextJsonBuilder";
- constructor(name) {
- super(name, "json", "SQLiteTextJson");
- }
- build(table) {
- return new SQLiteTextJson(table, this.config);
- }
-}
-
-class SQLiteTextJson extends SQLiteColumn {
- static [entityKind] = "SQLiteTextJson";
- getSQLType() {
- return "text";
- }
- mapFromDriverValue(value) {
- return JSON.parse(value);
- }
- mapToDriverValue(value) {
- return JSON.stringify(value);
- }
-}
-function text(a, b = {}) {
- const { name, config } = getColumnNameAndConfig(a, b);
- if (config.mode === "json") {
- return new SQLiteTextJsonBuilder(name);
- }
- return new SQLiteTextBuilder(name, config);
-}
-
-// ../eve/node_modules/drizzle-orm/selection-proxy.js
-class SelectionProxyHandler {
- static [entityKind] = "SelectionProxyHandler";
- config;
- constructor(config) {
- this.config = { ...config };
- }
- get(subquery, prop) {
- if (prop === "_") {
- return {
- ...subquery["_"],
- selectedFields: new Proxy(subquery._.selectedFields, this)
- };
- }
- if (prop === ViewBaseConfig) {
- return {
- ...subquery[ViewBaseConfig],
- selectedFields: new Proxy(subquery[ViewBaseConfig].selectedFields, this)
- };
- }
- if (typeof prop === "symbol") {
- return subquery[prop];
- }
- const columns = is(subquery, Subquery) ? subquery._.selectedFields : is(subquery, View) ? subquery[ViewBaseConfig].selectedFields : subquery;
- const value = columns[prop];
- if (is(value, SQL.Aliased)) {
- if (this.config.sqlAliasedBehavior === "sql" && !value.isSelectionField) {
- return value.sql;
- }
- const newValue = value.clone();
- newValue.isSelectionField = true;
- return newValue;
- }
- if (is(value, SQL)) {
- if (this.config.sqlBehavior === "sql") {
- return value;
- }
- throw new Error(`You tried to reference "${prop}" field from a subquery, which is a raw SQL field, but it doesn't have an alias declared. Please add an alias to the field using ".as('alias')" method.`);
- }
- if (is(value, Column)) {
- if (this.config.alias) {
- return new Proxy(value, new ColumnAliasProxyHandler(new Proxy(value.table, new TableAliasProxyHandler(this.config.alias, this.config.replaceOriginalName ?? false))));
- }
- return value;
- }
- if (typeof value !== "object" || value === null) {
- return value;
- }
- return new Proxy(value, new SelectionProxyHandler(this.config));
- }
-}
-
-// ../eve/node_modules/drizzle-orm/query-promise.js
-class QueryPromise {
- static [entityKind] = "QueryPromise";
- [Symbol.toStringTag] = "QueryPromise";
- catch(onRejected) {
- return this.then(undefined, onRejected);
- }
- finally(onFinally) {
- return this.then((value) => {
- onFinally?.();
- return value;
- }, (reason) => {
- onFinally?.();
- throw reason;
- });
- }
- then(onFulfilled, onRejected) {
- return this.execute().then(onFulfilled, onRejected);
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/all.js
-function getSQLiteColumnBuilders() {
- return {
- blob,
- customType,
- integer,
- numeric,
- real,
- text
- };
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/table.js
-var InlineForeignKeys = Symbol.for("drizzle:SQLiteInlineForeignKeys");
-
-class SQLiteTable extends Table {
- static [entityKind] = "SQLiteTable";
- static Symbol = Object.assign({}, Table.Symbol, {
- InlineForeignKeys
- });
- [Table.Symbol.Columns];
- [InlineForeignKeys] = [];
- [Table.Symbol.ExtraConfigBuilder] = undefined;
-}
-function sqliteTableBase(name, columns, extraConfig, schema, baseName = name) {
- const rawTable = new SQLiteTable(name, schema, baseName);
- const parsedColumns = typeof columns === "function" ? columns(getSQLiteColumnBuilders()) : columns;
- const builtColumns = Object.fromEntries(Object.entries(parsedColumns).map(([name2, colBuilderBase]) => {
- const colBuilder = colBuilderBase;
- colBuilder.setName(name2);
- const column = colBuilder.build(rawTable);
- rawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));
- return [name2, column];
- }));
- const table = Object.assign(rawTable, builtColumns);
- table[Table.Symbol.Columns] = builtColumns;
- table[Table.Symbol.ExtraConfigColumns] = builtColumns;
- if (extraConfig) {
- table[SQLiteTable.Symbol.ExtraConfigBuilder] = extraConfig;
- }
- return table;
-}
-var sqliteTable = (name, columns, extraConfig) => {
- return sqliteTableBase(name, columns, extraConfig);
-};
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/indexes.js
-class IndexBuilderOn {
- constructor(name, unique) {
- this.name = name;
- this.unique = unique;
- }
- static [entityKind] = "SQLiteIndexBuilderOn";
- on(...columns) {
- return new IndexBuilder(this.name, columns, this.unique);
- }
-}
-
-class IndexBuilder {
- static [entityKind] = "SQLiteIndexBuilder";
- config;
- constructor(name, columns, unique) {
- this.config = {
- name,
- columns,
- unique,
- where: undefined
- };
- }
- where(condition) {
- this.config.where = condition;
- return this;
- }
- build(table) {
- return new Index(this.config, table);
- }
-}
-
-class Index {
- static [entityKind] = "SQLiteIndex";
- config;
- constructor(config, table) {
- this.config = { ...config, table };
- }
-}
-function index(name) {
- return new IndexBuilderOn(name, false);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/utils.js
-function extractUsedTable(table) {
- if (is(table, SQLiteTable)) {
- return [`${table[Table.Symbol.BaseName]}`];
- }
- if (is(table, Subquery)) {
- return table._.usedTables ?? [];
- }
- if (is(table, SQL)) {
- return table.usedTables ?? [];
- }
- return [];
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js
-class SQLiteDeleteBase extends QueryPromise {
- constructor(table, session, dialect, withList) {
- super();
- this.table = table;
- this.session = session;
- this.dialect = dialect;
- this.config = { table, withList };
- }
- static [entityKind] = "SQLiteDelete";
- config;
- where(where) {
- this.config.where = where;
- return this;
- }
- orderBy(...columns) {
- if (typeof columns[0] === "function") {
- const orderBy = columns[0](new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
- this.config.orderBy = orderByArray;
- } else {
- const orderByArray = columns;
- this.config.orderBy = orderByArray;
- }
- return this;
- }
- limit(limit) {
- this.config.limit = limit;
- return this;
- }
- returning(fields = this.table[SQLiteTable.Symbol.Columns]) {
- this.config.returning = orderSelectedFields(fields);
- return this;
- }
- getSQL() {
- return this.dialect.buildDeleteQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- _prepare(isOneTimeQuery = true) {
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
- type: "delete",
- tables: extractUsedTable(this.config.table)
- });
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute(placeholderValues) {
- return this._prepare().execute(placeholderValues);
- }
- $dynamic() {
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/casing.js
-function toSnakeCase(input) {
- const words = input.replace(/['\u2019]/g, "").match(/[\da-z]+|[A-Z]+(?![a-z])|[A-Z][\da-z]+/g) ?? [];
- return words.map((word) => word.toLowerCase()).join("_");
-}
-function toCamelCase(input) {
- const words = input.replace(/['\u2019]/g, "").match(/[\da-z]+|[A-Z]+(?![a-z])|[A-Z][\da-z]+/g) ?? [];
- return words.reduce((acc, word, i) => {
- const formattedWord = i === 0 ? word.toLowerCase() : `${word[0].toUpperCase()}${word.slice(1)}`;
- return acc + formattedWord;
- }, "");
-}
-function noopCase(input) {
- return input;
-}
-
-class CasingCache {
- static [entityKind] = "CasingCache";
- cache = {};
- cachedTables = {};
- convert;
- constructor(casing) {
- this.convert = casing === "snake_case" ? toSnakeCase : casing === "camelCase" ? toCamelCase : noopCase;
- }
- getColumnCasing(column) {
- if (!column.keyAsName)
- return column.name;
- const schema = column.table[Table.Symbol.Schema] ?? "public";
- const tableName = column.table[Table.Symbol.OriginalName];
- const key = `${schema}.${tableName}.${column.name}`;
- if (!this.cache[key]) {
- this.cacheTable(column.table);
- }
- return this.cache[key];
- }
- cacheTable(table) {
- const schema = table[Table.Symbol.Schema] ?? "public";
- const tableName = table[Table.Symbol.OriginalName];
- const tableKey = `${schema}.${tableName}`;
- if (!this.cachedTables[tableKey]) {
- for (const column of Object.values(table[Table.Symbol.Columns])) {
- const columnKey = `${tableKey}.${column.name}`;
- this.cache[columnKey] = this.convert(column.name);
- }
- this.cachedTables[tableKey] = true;
- }
- }
- clearCache() {
- this.cache = {};
- this.cachedTables = {};
- }
-}
-
-// ../eve/node_modules/drizzle-orm/errors.js
-class DrizzleError extends Error {
- static [entityKind] = "DrizzleError";
- constructor({ message, cause }) {
- super(message);
- this.name = "DrizzleError";
- this.cause = cause;
- }
-}
-
-class DrizzleQueryError extends Error {
- constructor(query, params, cause) {
- super(`Failed query: ${query}
-params: ${params}`);
- this.query = query;
- this.params = params;
- this.cause = cause;
- Error.captureStackTrace(this, DrizzleQueryError);
- if (cause)
- this.cause = cause;
- }
-}
-
-class TransactionRollbackError extends DrizzleError {
- static [entityKind] = "TransactionRollbackError";
- constructor() {
- super({ message: "Rollback" });
- }
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/table.js
-var InlineForeignKeys2 = Symbol.for("drizzle:PgInlineForeignKeys");
-var EnableRLS = Symbol.for("drizzle:EnableRLS");
-
-class PgTable extends Table {
- static [entityKind] = "PgTable";
- static Symbol = Object.assign({}, Table.Symbol, {
- InlineForeignKeys: InlineForeignKeys2,
- EnableRLS
- });
- [InlineForeignKeys2] = [];
- [EnableRLS] = false;
- [Table.Symbol.ExtraConfigBuilder] = undefined;
- [Table.Symbol.ExtraConfigColumns] = {};
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/primary-keys.js
-class PrimaryKeyBuilder {
- static [entityKind] = "PgPrimaryKeyBuilder";
- columns;
- name;
- constructor(columns, name) {
- this.columns = columns;
- this.name = name;
- }
- build(table) {
- return new PrimaryKey(table, this.columns, this.name);
- }
-}
-
-class PrimaryKey {
- constructor(table, columns, name) {
- this.table = table;
- this.columns = columns;
- this.name = name;
- }
- static [entityKind] = "PgPrimaryKey";
- columns;
- name;
- getName() {
- return this.name ?? `${this.table[PgTable.Symbol.Name]}_${this.columns.map((column) => column.name).join("_")}_pk`;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sql/expressions/conditions.js
-function bindIfParam(value, column) {
- if (isDriverValueEncoder(column) && !isSQLWrapper(value) && !is(value, Param) && !is(value, Placeholder) && !is(value, Column) && !is(value, Table) && !is(value, View)) {
- return new Param(value, column);
- }
- return value;
-}
-var eq = (left, right) => {
- return sql`${left} = ${bindIfParam(right, left)}`;
-};
-var ne = (left, right) => {
- return sql`${left} <> ${bindIfParam(right, left)}`;
-};
-function and(...unfilteredConditions) {
- const conditions = unfilteredConditions.filter((c) => c !== undefined);
- if (conditions.length === 0) {
- return;
- }
- if (conditions.length === 1) {
- return new SQL(conditions);
- }
- return new SQL([
- new StringChunk("("),
- sql.join(conditions, new StringChunk(" and ")),
- new StringChunk(")")
- ]);
-}
-function or(...unfilteredConditions) {
- const conditions = unfilteredConditions.filter((c) => c !== undefined);
- if (conditions.length === 0) {
- return;
- }
- if (conditions.length === 1) {
- return new SQL(conditions);
- }
- return new SQL([
- new StringChunk("("),
- sql.join(conditions, new StringChunk(" or ")),
- new StringChunk(")")
- ]);
-}
-function not(condition) {
- return sql`not ${condition}`;
-}
-var gt = (left, right) => {
- return sql`${left} > ${bindIfParam(right, left)}`;
-};
-var gte = (left, right) => {
- return sql`${left} >= ${bindIfParam(right, left)}`;
-};
-var lt = (left, right) => {
- return sql`${left} < ${bindIfParam(right, left)}`;
-};
-var lte = (left, right) => {
- return sql`${left} <= ${bindIfParam(right, left)}`;
-};
-function inArray(column, values) {
- if (Array.isArray(values)) {
- if (values.length === 0) {
- return sql`false`;
- }
- return sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;
- }
- return sql`${column} in ${bindIfParam(values, column)}`;
-}
-function notInArray(column, values) {
- if (Array.isArray(values)) {
- if (values.length === 0) {
- return sql`true`;
- }
- return sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;
- }
- return sql`${column} not in ${bindIfParam(values, column)}`;
-}
-function isNull(value) {
- return sql`${value} is null`;
-}
-function isNotNull(value) {
- return sql`${value} is not null`;
-}
-function exists(subquery) {
- return sql`exists ${subquery}`;
-}
-function notExists(subquery) {
- return sql`not exists ${subquery}`;
-}
-function between(column, min, max) {
- return sql`${column} between ${bindIfParam(min, column)} and ${bindIfParam(max, column)}`;
-}
-function notBetween(column, min, max) {
- return sql`${column} not between ${bindIfParam(min, column)} and ${bindIfParam(max, column)}`;
-}
-function like(column, value) {
- return sql`${column} like ${value}`;
-}
-function notLike(column, value) {
- return sql`${column} not like ${value}`;
-}
-function ilike(column, value) {
- return sql`${column} ilike ${value}`;
-}
-function notIlike(column, value) {
- return sql`${column} not ilike ${value}`;
-}
-
-// ../eve/node_modules/drizzle-orm/sql/expressions/select.js
-function asc(column) {
- return sql`${column} asc`;
-}
-function desc(column) {
- return sql`${column} desc`;
-}
-
-// ../eve/node_modules/drizzle-orm/relations.js
-class Relation {
- constructor(sourceTable, referencedTable, relationName) {
- this.sourceTable = sourceTable;
- this.referencedTable = referencedTable;
- this.relationName = relationName;
- this.referencedTableName = referencedTable[Table.Symbol.Name];
- }
- static [entityKind] = "Relation";
- referencedTableName;
- fieldName;
-}
-
-class Relations {
- constructor(table, config) {
- this.table = table;
- this.config = config;
- }
- static [entityKind] = "Relations";
-}
-
-class One extends Relation {
- constructor(sourceTable, referencedTable, config, isNullable) {
- super(sourceTable, referencedTable, config?.relationName);
- this.config = config;
- this.isNullable = isNullable;
- }
- static [entityKind] = "One";
- withFieldName(fieldName) {
- const relation = new One(this.sourceTable, this.referencedTable, this.config, this.isNullable);
- relation.fieldName = fieldName;
- return relation;
- }
-}
-
-class Many extends Relation {
- constructor(sourceTable, referencedTable, config) {
- super(sourceTable, referencedTable, config?.relationName);
- this.config = config;
- }
- static [entityKind] = "Many";
- withFieldName(fieldName) {
- const relation = new Many(this.sourceTable, this.referencedTable, this.config);
- relation.fieldName = fieldName;
- return relation;
- }
-}
-function getOperators() {
- return {
- and,
- between,
- eq,
- exists,
- gt,
- gte,
- ilike,
- inArray,
- isNull,
- isNotNull,
- like,
- lt,
- lte,
- ne,
- not,
- notBetween,
- notExists,
- notLike,
- notIlike,
- notInArray,
- or,
- sql
- };
-}
-function getOrderByOperators() {
- return {
- sql,
- asc,
- desc
- };
-}
-function extractTablesRelationalConfig(schema, configHelpers) {
- if (Object.keys(schema).length === 1 && "default" in schema && !is(schema["default"], Table)) {
- schema = schema["default"];
- }
- const tableNamesMap = {};
- const relationsBuffer = {};
- const tablesConfig = {};
- for (const [key, value] of Object.entries(schema)) {
- if (is(value, Table)) {
- const dbName = getTableUniqueName(value);
- const bufferedRelations = relationsBuffer[dbName];
- tableNamesMap[dbName] = key;
- tablesConfig[key] = {
- tsName: key,
- dbName: value[Table.Symbol.Name],
- schema: value[Table.Symbol.Schema],
- columns: value[Table.Symbol.Columns],
- relations: bufferedRelations?.relations ?? {},
- primaryKey: bufferedRelations?.primaryKey ?? []
- };
- for (const column of Object.values(value[Table.Symbol.Columns])) {
- if (column.primary) {
- tablesConfig[key].primaryKey.push(column);
- }
- }
- const extraConfig = value[Table.Symbol.ExtraConfigBuilder]?.(value[Table.Symbol.ExtraConfigColumns]);
- if (extraConfig) {
- for (const configEntry of Object.values(extraConfig)) {
- if (is(configEntry, PrimaryKeyBuilder)) {
- tablesConfig[key].primaryKey.push(...configEntry.columns);
- }
- }
- }
- } else if (is(value, Relations)) {
- const dbName = getTableUniqueName(value.table);
- const tableName = tableNamesMap[dbName];
- const relations2 = value.config(configHelpers(value.table));
- let primaryKey;
- for (const [relationName, relation] of Object.entries(relations2)) {
- if (tableName) {
- const tableConfig = tablesConfig[tableName];
- tableConfig.relations[relationName] = relation;
- if (primaryKey) {
- tableConfig.primaryKey.push(...primaryKey);
- }
- } else {
- if (!(dbName in relationsBuffer)) {
- relationsBuffer[dbName] = {
- relations: {},
- primaryKey
- };
- }
- relationsBuffer[dbName].relations[relationName] = relation;
- }
- }
- }
- }
- return { tables: tablesConfig, tableNamesMap };
-}
-function relations(table, relations2) {
- return new Relations(table, (helpers) => Object.fromEntries(Object.entries(relations2(helpers)).map(([key, value]) => [
- key,
- value.withFieldName(key)
- ])));
-}
-function createOne(sourceTable) {
- return function one(table, config) {
- return new One(sourceTable, table, config, config?.fields.reduce((res, f) => res && f.notNull, true) ?? false);
- };
-}
-function createMany(sourceTable) {
- return function many(referencedTable, config) {
- return new Many(sourceTable, referencedTable, config);
- };
-}
-function normalizeRelation(schema, tableNamesMap, relation) {
- if (is(relation, One) && relation.config) {
- return {
- fields: relation.config.fields,
- references: relation.config.references
- };
- }
- const referencedTableTsName = tableNamesMap[getTableUniqueName(relation.referencedTable)];
- if (!referencedTableTsName) {
- throw new Error(`Table "${relation.referencedTable[Table.Symbol.Name]}" not found in schema`);
- }
- const referencedTableConfig = schema[referencedTableTsName];
- if (!referencedTableConfig) {
- throw new Error(`Table "${referencedTableTsName}" not found in schema`);
- }
- const sourceTable = relation.sourceTable;
- const sourceTableTsName = tableNamesMap[getTableUniqueName(sourceTable)];
- if (!sourceTableTsName) {
- throw new Error(`Table "${sourceTable[Table.Symbol.Name]}" not found in schema`);
- }
- const reverseRelations = [];
- for (const referencedTableRelation of Object.values(referencedTableConfig.relations)) {
- if (relation.relationName && relation !== referencedTableRelation && referencedTableRelation.relationName === relation.relationName || !relation.relationName && referencedTableRelation.referencedTable === relation.sourceTable) {
- reverseRelations.push(referencedTableRelation);
- }
- }
- if (reverseRelations.length > 1) {
- throw relation.relationName ? new Error(`There are multiple relations with name "${relation.relationName}" in table "${referencedTableTsName}"`) : new Error(`There are multiple relations between "${referencedTableTsName}" and "${relation.sourceTable[Table.Symbol.Name]}". Please specify relation name`);
- }
- if (reverseRelations[0] && is(reverseRelations[0], One) && reverseRelations[0].config) {
- return {
- fields: reverseRelations[0].config.references,
- references: reverseRelations[0].config.fields
- };
- }
- throw new Error(`There is not enough information to infer relation "${sourceTableTsName}.${relation.fieldName}"`);
-}
-function createTableRelationsHelpers(sourceTable) {
- return {
- one: createOne(sourceTable),
- many: createMany(sourceTable)
- };
-}
-function mapRelationalRow(tablesConfig, tableConfig, row, buildQueryResultSelection, mapColumnValue = (value) => value) {
- const result = {};
- for (const [
- selectionItemIndex,
- selectionItem
- ] of buildQueryResultSelection.entries()) {
- if (selectionItem.isJson) {
- const relation = tableConfig.relations[selectionItem.tsKey];
- const rawSubRows = row[selectionItemIndex];
- const subRows = typeof rawSubRows === "string" ? JSON.parse(rawSubRows) : rawSubRows;
- result[selectionItem.tsKey] = is(relation, One) ? subRows && mapRelationalRow(tablesConfig, tablesConfig[selectionItem.relationTableTsKey], subRows, selectionItem.selection, mapColumnValue) : subRows.map((subRow) => mapRelationalRow(tablesConfig, tablesConfig[selectionItem.relationTableTsKey], subRow, selectionItem.selection, mapColumnValue));
- } else {
- const value = mapColumnValue(row[selectionItemIndex]);
- const field = selectionItem.field;
- let decoder;
- if (is(field, Column)) {
- decoder = field;
- } else if (is(field, SQL)) {
- decoder = field.decoder;
- } else {
- decoder = field.sql.decoder;
- }
- result[selectionItem.tsKey] = value === null ? null : decoder.mapFromDriverValue(value);
- }
- }
- return result;
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/view-base.js
-class SQLiteViewBase extends View {
- static [entityKind] = "SQLiteViewBase";
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/dialect.js
-class SQLiteDialect {
- static [entityKind] = "SQLiteDialect";
- casing;
- constructor(config) {
- this.casing = new CasingCache(config?.casing);
- }
- escapeName(name) {
- return `"${name}"`;
- }
- escapeParam(_num) {
- return "?";
- }
- escapeString(str) {
- return `'${str.replace(/'/g, "''")}'`;
- }
- buildWithCTE(queries) {
- if (!queries?.length)
- return;
- const withSqlChunks = [sql`with `];
- for (const [i, w] of queries.entries()) {
- withSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);
- if (i < queries.length - 1) {
- withSqlChunks.push(sql`, `);
- }
- }
- withSqlChunks.push(sql` `);
- return sql.join(withSqlChunks);
- }
- buildDeleteQuery({ table, where, returning, withList, limit, orderBy }) {
- const withSql = this.buildWithCTE(withList);
- const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
- const whereSql = where ? sql` where ${where}` : undefined;
- const orderBySql = this.buildOrderBy(orderBy);
- const limitSql = this.buildLimit(limit);
- return sql`${withSql}delete from ${table}${whereSql}${returningSql}${orderBySql}${limitSql}`;
- }
- buildUpdateSet(table, set) {
- const tableColumns = table[Table.Symbol.Columns];
- const columnNames = Object.keys(tableColumns).filter((colName) => set[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined);
- const setSize = columnNames.length;
- return sql.join(columnNames.flatMap((colName, i) => {
- const col = tableColumns[colName];
- const value = set[colName] ?? sql.param(col.onUpdateFn(), col);
- const res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;
- if (i < setSize - 1) {
- return [res, sql.raw(", ")];
- }
- return [res];
- }));
- }
- buildUpdateQuery({ table, set, where, returning, withList, joins, from, limit, orderBy }) {
- const withSql = this.buildWithCTE(withList);
- const setSql = this.buildUpdateSet(table, set);
- const fromSql = from && sql.join([sql.raw(" from "), this.buildFromTable(from)]);
- const joinsSql = this.buildJoins(joins);
- const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
- const whereSql = where ? sql` where ${where}` : undefined;
- const orderBySql = this.buildOrderBy(orderBy);
- const limitSql = this.buildLimit(limit);
- return sql`${withSql}update ${table} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}${orderBySql}${limitSql}`;
- }
- buildSelection(fields, { isSingleTable = false } = {}) {
- const columnsLen = fields.length;
- const chunks = fields.flatMap(({ field }, i) => {
- const chunk = [];
- if (is(field, SQL.Aliased) && field.isSelectionField) {
- chunk.push(sql.identifier(field.fieldAlias));
- } else if (is(field, SQL.Aliased) || is(field, SQL)) {
- const query = is(field, SQL.Aliased) ? field.sql : field;
- if (isSingleTable) {
- chunk.push(new SQL(query.queryChunks.map((c) => {
- if (is(c, Column)) {
- return sql.identifier(this.casing.getColumnCasing(c));
- }
- return c;
- })));
- } else {
- chunk.push(query);
- }
- if (is(field, SQL.Aliased)) {
- chunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);
- }
- } else if (is(field, Column)) {
- const tableName = field.table[Table.Symbol.Name];
- if (field.columnType === "SQLiteNumericBigInt") {
- if (isSingleTable) {
- chunk.push(sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`);
- } else {
- chunk.push(sql`cast(${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))} as text)`);
- }
- } else {
- if (isSingleTable) {
- chunk.push(sql.identifier(this.casing.getColumnCasing(field)));
- } else {
- chunk.push(sql`${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))}`);
- }
- }
- }
- if (i < columnsLen - 1) {
- chunk.push(sql`, `);
- }
- return chunk;
- });
- return sql.join(chunks);
- }
- buildJoins(joins) {
- if (!joins || joins.length === 0) {
- return;
- }
- const joinsArray = [];
- if (joins) {
- for (const [index2, joinMeta] of joins.entries()) {
- if (index2 === 0) {
- joinsArray.push(sql` `);
- }
- const table = joinMeta.table;
- const onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;
- if (is(table, SQLiteTable)) {
- const tableName = table[SQLiteTable.Symbol.Name];
- const tableSchema = table[SQLiteTable.Symbol.Schema];
- const origTableName = table[SQLiteTable.Symbol.OriginalName];
- const alias = tableName === origTableName ? undefined : joinMeta.alias;
- joinsArray.push(sql`${sql.raw(joinMeta.joinType)} join ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${sql.identifier(origTableName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`);
- } else {
- joinsArray.push(sql`${sql.raw(joinMeta.joinType)} join ${table}${onSql}`);
- }
- if (index2 < joins.length - 1) {
- joinsArray.push(sql` `);
- }
- }
- }
- return sql.join(joinsArray);
- }
- buildLimit(limit) {
- return typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : undefined;
- }
- buildOrderBy(orderBy) {
- const orderByList = [];
- if (orderBy) {
- for (const [index2, orderByValue] of orderBy.entries()) {
- orderByList.push(orderByValue);
- if (index2 < orderBy.length - 1) {
- orderByList.push(sql`, `);
- }
- }
- }
- return orderByList.length > 0 ? sql` order by ${sql.join(orderByList)}` : undefined;
- }
- buildFromTable(table) {
- if (is(table, Table) && table[Table.Symbol.IsAlias]) {
- return sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? "")}.`.if(table[Table.Symbol.Schema])}${sql.identifier(table[Table.Symbol.OriginalName])} ${sql.identifier(table[Table.Symbol.Name])}`;
- }
- return table;
- }
- buildSelectQuery({
- withList,
- fields,
- fieldsFlat,
- where,
- having,
- table,
- joins,
- orderBy,
- groupBy,
- limit,
- offset,
- distinct,
- setOperators
- }) {
- const fieldsList = fieldsFlat ?? orderSelectedFields(fields);
- for (const f of fieldsList) {
- if (is(f.field, Column) && getTableName(f.field.table) !== (is(table, Subquery) ? table._.alias : is(table, SQLiteViewBase) ? table[ViewBaseConfig].name : is(table, SQL) ? undefined : getTableName(table)) && !((table2) => joins?.some(({ alias }) => alias === (table2[Table.Symbol.IsAlias] ? getTableName(table2) : table2[Table.Symbol.BaseName])))(f.field.table)) {
- const tableName = getTableName(f.field.table);
- throw new Error(`Your "${f.path.join("->")}" field references a column "${tableName}"."${f.field.name}", but the table "${tableName}" is not part of the query! Did you forget to join it?`);
- }
- }
- const isSingleTable = !joins || joins.length === 0;
- const withSql = this.buildWithCTE(withList);
- const distinctSql = distinct ? sql` distinct` : undefined;
- const selection = this.buildSelection(fieldsList, { isSingleTable });
- const tableSql = this.buildFromTable(table);
- const joinsSql = this.buildJoins(joins);
- const whereSql = where ? sql` where ${where}` : undefined;
- const havingSql = having ? sql` having ${having}` : undefined;
- const groupByList = [];
- if (groupBy) {
- for (const [index2, groupByValue] of groupBy.entries()) {
- groupByList.push(groupByValue);
- if (index2 < groupBy.length - 1) {
- groupByList.push(sql`, `);
- }
- }
- }
- const groupBySql = groupByList.length > 0 ? sql` group by ${sql.join(groupByList)}` : undefined;
- const orderBySql = this.buildOrderBy(orderBy);
- const limitSql = this.buildLimit(limit);
- const offsetSql = offset ? sql` offset ${offset}` : undefined;
- const finalQuery = sql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}`;
- if (setOperators.length > 0) {
- return this.buildSetOperations(finalQuery, setOperators);
- }
- return finalQuery;
- }
- buildSetOperations(leftSelect, setOperators) {
- const [setOperator, ...rest] = setOperators;
- if (!setOperator) {
- throw new Error("Cannot pass undefined values to any set operator");
- }
- if (rest.length === 0) {
- return this.buildSetOperationQuery({ leftSelect, setOperator });
- }
- return this.buildSetOperations(this.buildSetOperationQuery({ leftSelect, setOperator }), rest);
- }
- buildSetOperationQuery({
- leftSelect,
- setOperator: { type, isAll, rightSelect, limit, orderBy, offset }
- }) {
- const leftChunk = sql`${leftSelect.getSQL()} `;
- const rightChunk = sql`${rightSelect.getSQL()}`;
- let orderBySql;
- if (orderBy && orderBy.length > 0) {
- const orderByValues = [];
- for (const singleOrderBy of orderBy) {
- if (is(singleOrderBy, SQLiteColumn)) {
- orderByValues.push(sql.identifier(singleOrderBy.name));
- } else if (is(singleOrderBy, SQL)) {
- for (let i = 0;i < singleOrderBy.queryChunks.length; i++) {
- const chunk = singleOrderBy.queryChunks[i];
- if (is(chunk, SQLiteColumn)) {
- singleOrderBy.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk));
- }
- }
- orderByValues.push(sql`${singleOrderBy}`);
- } else {
- orderByValues.push(sql`${singleOrderBy}`);
- }
- }
- orderBySql = sql` order by ${sql.join(orderByValues, sql`, `)}`;
- }
- const limitSql = typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : undefined;
- const operatorChunk = sql.raw(`${type} ${isAll ? "all " : ""}`);
- const offsetSql = offset ? sql` offset ${offset}` : undefined;
- return sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;
- }
- buildInsertQuery({ table, values: valuesOrSelect, onConflict, returning, withList, select }) {
- const valuesSqlList = [];
- const columns = table[Table.Symbol.Columns];
- const colEntries = Object.entries(columns).filter(([_, col]) => !col.shouldDisableInsert());
- const insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));
- if (select) {
- const select2 = valuesOrSelect;
- if (is(select2, SQL)) {
- valuesSqlList.push(select2);
- } else {
- valuesSqlList.push(select2.getSQL());
- }
- } else {
- const values = valuesOrSelect;
- valuesSqlList.push(sql.raw("values "));
- for (const [valueIndex, value] of values.entries()) {
- const valueList = [];
- for (const [fieldName, col] of colEntries) {
- const colValue = value[fieldName];
- if (colValue === undefined || is(colValue, Param) && colValue.value === undefined) {
- let defaultValue;
- if (col.default !== null && col.default !== undefined) {
- defaultValue = is(col.default, SQL) ? col.default : sql.param(col.default, col);
- } else if (col.defaultFn !== undefined) {
- const defaultFnResult = col.defaultFn();
- defaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);
- } else if (!col.default && col.onUpdateFn !== undefined) {
- const onUpdateFnResult = col.onUpdateFn();
- defaultValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);
- } else {
- defaultValue = sql`null`;
- }
- valueList.push(defaultValue);
- } else {
- valueList.push(colValue);
- }
- }
- valuesSqlList.push(valueList);
- if (valueIndex < values.length - 1) {
- valuesSqlList.push(sql`, `);
- }
- }
- }
- const withSql = this.buildWithCTE(withList);
- const valuesSql = sql.join(valuesSqlList);
- const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
- const onConflictSql = onConflict?.length ? sql.join(onConflict) : undefined;
- return sql`${withSql}insert into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${returningSql}`;
- }
- sqlToQuery(sql2, invokeSource) {
- return sql2.toQuery({
- casing: this.casing,
- escapeName: this.escapeName,
- escapeParam: this.escapeParam,
- escapeString: this.escapeString,
- invokeSource
- });
- }
- buildRelationalQuery({
- fullSchema,
- schema,
- tableNamesMap,
- table,
- tableConfig,
- queryConfig: config,
- tableAlias,
- nestedQueryRelation,
- joinOn
- }) {
- let selection = [];
- let limit, offset, orderBy = [], where;
- const joins = [];
- if (config === true) {
- const selectionEntries = Object.entries(tableConfig.columns);
- selection = selectionEntries.map(([key, value]) => ({
- dbKey: value.name,
- tsKey: key,
- field: aliasedTableColumn(value, tableAlias),
- relationTableTsKey: undefined,
- isJson: false,
- selection: []
- }));
- } else {
- const aliasedColumns = Object.fromEntries(Object.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]));
- if (config.where) {
- const whereSql = typeof config.where === "function" ? config.where(aliasedColumns, getOperators()) : config.where;
- where = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);
- }
- const fieldsSelection = [];
- let selectedColumns = [];
- if (config.columns) {
- let isIncludeMode = false;
- for (const [field, value] of Object.entries(config.columns)) {
- if (value === undefined) {
- continue;
- }
- if (field in tableConfig.columns) {
- if (!isIncludeMode && value === true) {
- isIncludeMode = true;
- }
- selectedColumns.push(field);
- }
- }
- if (selectedColumns.length > 0) {
- selectedColumns = isIncludeMode ? selectedColumns.filter((c) => config.columns?.[c] === true) : Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));
- }
- } else {
- selectedColumns = Object.keys(tableConfig.columns);
- }
- for (const field of selectedColumns) {
- const column = tableConfig.columns[field];
- fieldsSelection.push({ tsKey: field, value: column });
- }
- let selectedRelations = [];
- if (config.with) {
- selectedRelations = Object.entries(config.with).filter((entry) => !!entry[1]).map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey] }));
- }
- let extras;
- if (config.extras) {
- extras = typeof config.extras === "function" ? config.extras(aliasedColumns, { sql }) : config.extras;
- for (const [tsKey, value] of Object.entries(extras)) {
- fieldsSelection.push({
- tsKey,
- value: mapColumnsInAliasedSQLToAlias(value, tableAlias)
- });
- }
- }
- for (const { tsKey, value } of fieldsSelection) {
- selection.push({
- dbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey].name,
- tsKey,
- field: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,
- relationTableTsKey: undefined,
- isJson: false,
- selection: []
- });
- }
- let orderByOrig = typeof config.orderBy === "function" ? config.orderBy(aliasedColumns, getOrderByOperators()) : config.orderBy ?? [];
- if (!Array.isArray(orderByOrig)) {
- orderByOrig = [orderByOrig];
- }
- orderBy = orderByOrig.map((orderByValue) => {
- if (is(orderByValue, Column)) {
- return aliasedTableColumn(orderByValue, tableAlias);
- }
- return mapColumnsInSQLToAlias(orderByValue, tableAlias);
- });
- limit = config.limit;
- offset = config.offset;
- for (const {
- tsKey: selectedRelationTsKey,
- queryConfig: selectedRelationConfigValue,
- relation
- } of selectedRelations) {
- const normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);
- const relationTableName = getTableUniqueName(relation.referencedTable);
- const relationTableTsName = tableNamesMap[relationTableName];
- const relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;
- const joinOn2 = and(...normalizedRelation.fields.map((field2, i) => eq(aliasedTableColumn(normalizedRelation.references[i], relationTableAlias), aliasedTableColumn(field2, tableAlias))));
- const builtRelation = this.buildRelationalQuery({
- fullSchema,
- schema,
- tableNamesMap,
- table: fullSchema[relationTableTsName],
- tableConfig: schema[relationTableTsName],
- queryConfig: is(relation, One) ? selectedRelationConfigValue === true ? { limit: 1 } : { ...selectedRelationConfigValue, limit: 1 } : selectedRelationConfigValue,
- tableAlias: relationTableAlias,
- joinOn: joinOn2,
- nestedQueryRelation: relation
- });
- const field = sql`(${builtRelation.sql})`.as(selectedRelationTsKey);
- selection.push({
- dbKey: selectedRelationTsKey,
- tsKey: selectedRelationTsKey,
- field,
- relationTableTsKey: relationTableTsName,
- isJson: true,
- selection: builtRelation.selection
- });
- }
- }
- if (selection.length === 0) {
- throw new DrizzleError({
- message: `No fields selected for table "${tableConfig.tsName}" ("${tableAlias}"). You need to have at least one item in "columns", "with" or "extras". If you need to select all columns, omit the "columns" key or set it to undefined.`
- });
- }
- let result;
- where = and(joinOn, where);
- if (nestedQueryRelation) {
- let field = sql`json_array(${sql.join(selection.map(({ field: field2 }) => is(field2, SQLiteColumn) ? sql.identifier(this.casing.getColumnCasing(field2)) : is(field2, SQL.Aliased) ? field2.sql : field2), sql`, `)})`;
- if (is(nestedQueryRelation, Many)) {
- field = sql`coalesce(json_group_array(${field}), json_array())`;
- }
- const nestedSelection = [{
- dbKey: "data",
- tsKey: "data",
- field: field.as("data"),
- isJson: true,
- relationTableTsKey: tableConfig.tsName,
- selection
- }];
- const needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;
- if (needsSubquery) {
- result = this.buildSelectQuery({
- table: aliasedTable(table, tableAlias),
- fields: {},
- fieldsFlat: [
- {
- path: [],
- field: sql.raw("*")
- }
- ],
- where,
- limit,
- offset,
- orderBy,
- setOperators: []
- });
- where = undefined;
- limit = undefined;
- offset = undefined;
- orderBy = undefined;
- } else {
- result = aliasedTable(table, tableAlias);
- }
- result = this.buildSelectQuery({
- table: is(result, SQLiteTable) ? result : new Subquery(result, {}, tableAlias),
- fields: {},
- fieldsFlat: nestedSelection.map(({ field: field2 }) => ({
- path: [],
- field: is(field2, Column) ? aliasedTableColumn(field2, tableAlias) : field2
- })),
- joins,
- where,
- limit,
- offset,
- orderBy,
- setOperators: []
- });
- } else {
- result = this.buildSelectQuery({
- table: aliasedTable(table, tableAlias),
- fields: {},
- fieldsFlat: selection.map(({ field }) => ({
- path: [],
- field: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field
- })),
- joins,
- where,
- limit,
- offset,
- orderBy,
- setOperators: []
- });
- }
- return {
- tableTsKey: tableConfig.tsName,
- sql: result,
- selection
- };
- }
-}
-
-class SQLiteSyncDialect extends SQLiteDialect {
- static [entityKind] = "SQLiteSyncDialect";
- migrate(migrations, session, config) {
- const migrationsTable = config === undefined ? "__drizzle_migrations" : typeof config === "string" ? "__drizzle_migrations" : config.migrationsTable ?? "__drizzle_migrations";
- const migrationTableCreate = sql`
- CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (
- id SERIAL PRIMARY KEY,
- hash text NOT NULL,
- created_at numeric
- )
- `;
- session.run(migrationTableCreate);
- const dbMigrations = session.values(sql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`);
- const lastDbMigration = dbMigrations[0] ?? undefined;
- session.run(sql`BEGIN`);
- try {
- for (const migration of migrations) {
- if (!lastDbMigration || Number(lastDbMigration[2]) < migration.folderMillis) {
- for (const stmt of migration.sql) {
- session.run(sql.raw(stmt));
- }
- session.run(sql`INSERT INTO ${sql.identifier(migrationsTable)} ("hash", "created_at") VALUES(${migration.hash}, ${migration.folderMillis})`);
- }
- }
- session.run(sql`COMMIT`);
- } catch (e) {
- session.run(sql`ROLLBACK`);
- throw e;
- }
- }
-}
-
-// ../eve/node_modules/drizzle-orm/query-builders/query-builder.js
-class TypedQueryBuilder {
- static [entityKind] = "TypedQueryBuilder";
- getSelectedFields() {
- return this._.selectedFields;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/select.js
-class SQLiteSelectBuilder {
- static [entityKind] = "SQLiteSelectBuilder";
- fields;
- session;
- dialect;
- withList;
- distinct;
- constructor(config) {
- this.fields = config.fields;
- this.session = config.session;
- this.dialect = config.dialect;
- this.withList = config.withList;
- this.distinct = config.distinct;
- }
- from(source) {
- const isPartialSelect = !!this.fields;
- let fields;
- if (this.fields) {
- fields = this.fields;
- } else if (is(source, Subquery)) {
- fields = Object.fromEntries(Object.keys(source._.selectedFields).map((key) => [key, source[key]]));
- } else if (is(source, SQLiteViewBase)) {
- fields = source[ViewBaseConfig].selectedFields;
- } else if (is(source, SQL)) {
- fields = {};
- } else {
- fields = getTableColumns(source);
- }
- return new SQLiteSelectBase({
- table: source,
- fields,
- isPartialSelect,
- session: this.session,
- dialect: this.dialect,
- withList: this.withList,
- distinct: this.distinct
- });
- }
-}
-
-class SQLiteSelectQueryBuilderBase extends TypedQueryBuilder {
- static [entityKind] = "SQLiteSelectQueryBuilder";
- _;
- config;
- joinsNotNullableMap;
- tableName;
- isPartialSelect;
- session;
- dialect;
- cacheConfig = undefined;
- usedTables = /* @__PURE__ */ new Set;
- constructor({ table, fields, isPartialSelect, session, dialect, withList, distinct }) {
- super();
- this.config = {
- withList,
- table,
- fields: { ...fields },
- distinct,
- setOperators: []
- };
- this.isPartialSelect = isPartialSelect;
- this.session = session;
- this.dialect = dialect;
- this._ = {
- selectedFields: fields,
- config: this.config
- };
- this.tableName = getTableLikeName(table);
- this.joinsNotNullableMap = typeof this.tableName === "string" ? { [this.tableName]: true } : {};
- for (const item of extractUsedTable(table))
- this.usedTables.add(item);
- }
- getUsedTables() {
- return [...this.usedTables];
- }
- createJoin(joinType) {
- return (table, on) => {
- const baseTableName = this.tableName;
- const tableName = getTableLikeName(table);
- for (const item of extractUsedTable(table))
- this.usedTables.add(item);
- if (typeof tableName === "string" && this.config.joins?.some((join) => join.alias === tableName)) {
- throw new Error(`Alias "${tableName}" is already used in this query`);
- }
- if (!this.isPartialSelect) {
- if (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === "string") {
- this.config.fields = {
- [baseTableName]: this.config.fields
- };
- }
- if (typeof tableName === "string" && !is(table, SQL)) {
- const selection = is(table, Subquery) ? table._.selectedFields : is(table, View) ? table[ViewBaseConfig].selectedFields : table[Table.Symbol.Columns];
- this.config.fields[tableName] = selection;
- }
- }
- if (typeof on === "function") {
- on = on(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- if (!this.config.joins) {
- this.config.joins = [];
- }
- this.config.joins.push({ on, table, joinType, alias: tableName });
- if (typeof tableName === "string") {
- switch (joinType) {
- case "left": {
- this.joinsNotNullableMap[tableName] = false;
- break;
- }
- case "right": {
- this.joinsNotNullableMap = Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([key]) => [key, false]));
- this.joinsNotNullableMap[tableName] = true;
- break;
- }
- case "cross":
- case "inner": {
- this.joinsNotNullableMap[tableName] = true;
- break;
- }
- case "full": {
- this.joinsNotNullableMap = Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([key]) => [key, false]));
- this.joinsNotNullableMap[tableName] = false;
- break;
- }
- }
- }
- return this;
- };
- }
- leftJoin = this.createJoin("left");
- rightJoin = this.createJoin("right");
- innerJoin = this.createJoin("inner");
- fullJoin = this.createJoin("full");
- crossJoin = this.createJoin("cross");
- createSetOperator(type, isAll) {
- return (rightSelection) => {
- const rightSelect = typeof rightSelection === "function" ? rightSelection(getSQLiteSetOperators()) : rightSelection;
- if (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) {
- throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");
- }
- this.config.setOperators.push({ type, isAll, rightSelect });
- return this;
- };
- }
- union = this.createSetOperator("union", false);
- unionAll = this.createSetOperator("union", true);
- intersect = this.createSetOperator("intersect", false);
- except = this.createSetOperator("except", false);
- addSetOperators(setOperators) {
- this.config.setOperators.push(...setOperators);
- return this;
- }
- where(where) {
- if (typeof where === "function") {
- where = where(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- this.config.where = where;
- return this;
- }
- having(having) {
- if (typeof having === "function") {
- having = having(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- this.config.having = having;
- return this;
- }
- groupBy(...columns) {
- if (typeof columns[0] === "function") {
- const groupBy = columns[0](new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- this.config.groupBy = Array.isArray(groupBy) ? groupBy : [groupBy];
- } else {
- this.config.groupBy = columns;
- }
- return this;
- }
- orderBy(...columns) {
- if (typeof columns[0] === "function") {
- const orderBy = columns[0](new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).orderBy = orderByArray;
- } else {
- this.config.orderBy = orderByArray;
- }
- } else {
- const orderByArray = columns;
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).orderBy = orderByArray;
- } else {
- this.config.orderBy = orderByArray;
- }
- }
- return this;
- }
- limit(limit) {
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).limit = limit;
- } else {
- this.config.limit = limit;
- }
- return this;
- }
- offset(offset) {
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).offset = offset;
- } else {
- this.config.offset = offset;
- }
- return this;
- }
- getSQL() {
- return this.dialect.buildSelectQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- as(alias) {
- const usedTables = [];
- usedTables.push(...extractUsedTable(this.config.table));
- if (this.config.joins) {
- for (const it of this.config.joins)
- usedTables.push(...extractUsedTable(it.table));
- }
- return new Proxy(new Subquery(this.getSQL(), this.config.fields, alias, false, [...new Set(usedTables)]), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- }
- getSelectedFields() {
- return new Proxy(this.config.fields, new SelectionProxyHandler({ alias: this.tableName, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- }
- $dynamic() {
- return this;
- }
-}
-
-class SQLiteSelectBase extends SQLiteSelectQueryBuilderBase {
- static [entityKind] = "SQLiteSelect";
- _prepare(isOneTimeQuery = true) {
- if (!this.session) {
- throw new Error("Cannot execute a query on a query builder. Please use a database instance instead.");
- }
- const fieldsList = orderSelectedFields(this.config.fields);
- const query = this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), fieldsList, "all", true, undefined, {
- type: "select",
- tables: [...this.usedTables]
- }, this.cacheConfig);
- query.joinsNotNullableMap = this.joinsNotNullableMap;
- return query;
- }
- $withCache(config) {
- this.cacheConfig = config === undefined ? { config: {}, enable: true, autoInvalidate: true } : config === false ? { enable: false } : { enable: true, autoInvalidate: true, ...config };
- return this;
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute() {
- return this.all();
- }
-}
-applyMixins(SQLiteSelectBase, [QueryPromise]);
-function createSetOperator(type, isAll) {
- return (leftSelect, rightSelect, ...restSelects) => {
- const setOperators = [rightSelect, ...restSelects].map((select) => ({
- type,
- isAll,
- rightSelect: select
- }));
- for (const setOperator of setOperators) {
- if (!haveSameKeys(leftSelect.getSelectedFields(), setOperator.rightSelect.getSelectedFields())) {
- throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");
- }
- }
- return leftSelect.addSetOperators(setOperators);
- };
-}
-var getSQLiteSetOperators = () => ({
- union,
- unionAll,
- intersect,
- except
-});
-var union = createSetOperator("union", false);
-var unionAll = createSetOperator("union", true);
-var intersect = createSetOperator("intersect", false);
-var except = createSetOperator("except", false);
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.js
-class QueryBuilder {
- static [entityKind] = "SQLiteQueryBuilder";
- dialect;
- dialectConfig;
- constructor(dialect) {
- this.dialect = is(dialect, SQLiteDialect) ? dialect : undefined;
- this.dialectConfig = is(dialect, SQLiteDialect) ? undefined : dialect;
- }
- $with = (alias, selection) => {
- const queryBuilder = this;
- const as = (qb) => {
- if (typeof qb === "function") {
- qb = qb(queryBuilder);
- }
- return new Proxy(new WithSubquery(qb.getSQL(), selection ?? ("getSelectedFields" in qb ? qb.getSelectedFields() ?? {} : {}), alias, true), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- };
- return { as };
- };
- with(...queries) {
- const self2 = this;
- function select(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: undefined,
- dialect: self2.getDialect(),
- withList: queries
- });
- }
- function selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: undefined,
- dialect: self2.getDialect(),
- withList: queries,
- distinct: true
- });
- }
- return { select, selectDistinct };
- }
- select(fields) {
- return new SQLiteSelectBuilder({ fields: fields ?? undefined, session: undefined, dialect: this.getDialect() });
- }
- selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: undefined,
- dialect: this.getDialect(),
- distinct: true
- });
- }
- getDialect() {
- if (!this.dialect) {
- this.dialect = new SQLiteSyncDialect(this.dialectConfig);
- }
- return this.dialect;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/insert.js
-class SQLiteInsertBuilder {
- constructor(table, session, dialect, withList) {
- this.table = table;
- this.session = session;
- this.dialect = dialect;
- this.withList = withList;
- }
- static [entityKind] = "SQLiteInsertBuilder";
- values(values) {
- values = Array.isArray(values) ? values : [values];
- if (values.length === 0) {
- throw new Error("values() must be called with at least one value");
- }
- const mappedValues = values.map((entry) => {
- const result = {};
- const cols = this.table[Table.Symbol.Columns];
- for (const colKey of Object.keys(entry)) {
- const colValue = entry[colKey];
- result[colKey] = is(colValue, SQL) ? colValue : new Param(colValue, cols[colKey]);
- }
- return result;
- });
- return new SQLiteInsertBase(this.table, mappedValues, this.session, this.dialect, this.withList);
- }
- select(selectQuery) {
- const select = typeof selectQuery === "function" ? selectQuery(new QueryBuilder) : selectQuery;
- if (!is(select, SQL) && !haveSameKeys(this.table[Columns], select._.selectedFields)) {
- throw new Error("Insert select error: selected fields are not the same or are in a different order compared to the table definition");
- }
- return new SQLiteInsertBase(this.table, select, this.session, this.dialect, this.withList, true);
- }
-}
-
-class SQLiteInsertBase extends QueryPromise {
- constructor(table, values, session, dialect, withList, select) {
- super();
- this.session = session;
- this.dialect = dialect;
- this.config = { table, values, withList, select };
- }
- static [entityKind] = "SQLiteInsert";
- config;
- returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) {
- this.config.returning = orderSelectedFields(fields);
- return this;
- }
- onConflictDoNothing(config = {}) {
- if (!this.config.onConflict)
- this.config.onConflict = [];
- if (config.target === undefined) {
- this.config.onConflict.push(sql` on conflict do nothing`);
- } else {
- const targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;
- const whereSql = config.where ? sql` where ${config.where}` : sql``;
- this.config.onConflict.push(sql` on conflict ${targetSql} do nothing${whereSql}`);
- }
- return this;
- }
- onConflictDoUpdate(config) {
- if (config.where && (config.targetWhere || config.setWhere)) {
- throw new Error('You cannot use both "where" and "targetWhere"/"setWhere" at the same time - "where" is deprecated, use "targetWhere" or "setWhere" instead.');
- }
- if (!this.config.onConflict)
- this.config.onConflict = [];
- const whereSql = config.where ? sql` where ${config.where}` : undefined;
- const targetWhereSql = config.targetWhere ? sql` where ${config.targetWhere}` : undefined;
- const setWhereSql = config.setWhere ? sql` where ${config.setWhere}` : undefined;
- const targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;
- const setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));
- this.config.onConflict.push(sql` on conflict ${targetSql}${targetWhereSql} do update set ${setSql}${whereSql}${setWhereSql}`);
- return this;
- }
- getSQL() {
- return this.dialect.buildInsertQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- _prepare(isOneTimeQuery = true) {
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
- type: "insert",
- tables: extractUsedTable(this.config.table)
- });
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute() {
- return this.config.returning ? this.all() : this.run();
- }
- $dynamic() {
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/update.js
-class SQLiteUpdateBuilder {
- constructor(table, session, dialect, withList) {
- this.table = table;
- this.session = session;
- this.dialect = dialect;
- this.withList = withList;
- }
- static [entityKind] = "SQLiteUpdateBuilder";
- set(values) {
- return new SQLiteUpdateBase(this.table, mapUpdateSet(this.table, values), this.session, this.dialect, this.withList);
- }
-}
-
-class SQLiteUpdateBase extends QueryPromise {
- constructor(table, set, session, dialect, withList) {
- super();
- this.session = session;
- this.dialect = dialect;
- this.config = { set, table, withList, joins: [] };
- }
- static [entityKind] = "SQLiteUpdate";
- config;
- from(source) {
- this.config.from = source;
- return this;
- }
- createJoin(joinType) {
- return (table, on) => {
- const tableName = getTableLikeName(table);
- if (typeof tableName === "string" && this.config.joins.some((join) => join.alias === tableName)) {
- throw new Error(`Alias "${tableName}" is already used in this query`);
- }
- if (typeof on === "function") {
- const from = this.config.from ? is(table, SQLiteTable) ? table[Table.Symbol.Columns] : is(table, Subquery) ? table._.selectedFields : is(table, SQLiteViewBase) ? table[ViewBaseConfig].selectedFields : undefined : undefined;
- on = on(new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })), from && new Proxy(from, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- this.config.joins.push({ on, table, joinType, alias: tableName });
- return this;
- };
- }
- leftJoin = this.createJoin("left");
- rightJoin = this.createJoin("right");
- innerJoin = this.createJoin("inner");
- fullJoin = this.createJoin("full");
- where(where) {
- this.config.where = where;
- return this;
- }
- orderBy(...columns) {
- if (typeof columns[0] === "function") {
- const orderBy = columns[0](new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
- this.config.orderBy = orderByArray;
- } else {
- const orderByArray = columns;
- this.config.orderBy = orderByArray;
- }
- return this;
- }
- limit(limit) {
- this.config.limit = limit;
- return this;
- }
- returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) {
- this.config.returning = orderSelectedFields(fields);
- return this;
- }
- getSQL() {
- return this.dialect.buildUpdateQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- _prepare(isOneTimeQuery = true) {
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
- type: "insert",
- tables: extractUsedTable(this.config.table)
- });
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute() {
- return this.config.returning ? this.all() : this.run();
- }
- $dynamic() {
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/count.js
-class SQLiteCountBuilder extends SQL {
- constructor(params) {
- super(SQLiteCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);
- this.params = params;
- this.session = params.session;
- this.sql = SQLiteCountBuilder.buildCount(params.source, params.filters);
- }
- sql;
- static [entityKind] = "SQLiteCountBuilderAsync";
- [Symbol.toStringTag] = "SQLiteCountBuilderAsync";
- session;
- static buildEmbeddedCount(source, filters) {
- return sql`(select count(*) from ${source}${sql.raw(" where ").if(filters)}${filters})`;
- }
- static buildCount(source, filters) {
- return sql`select count(*) from ${source}${sql.raw(" where ").if(filters)}${filters}`;
- }
- then(onfulfilled, onrejected) {
- return Promise.resolve(this.session.count(this.sql)).then(onfulfilled, onrejected);
- }
- catch(onRejected) {
- return this.then(undefined, onRejected);
- }
- finally(onFinally) {
- return this.then((value) => {
- onFinally?.();
- return value;
- }, (reason) => {
- onFinally?.();
- throw reason;
- });
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/query.js
-class RelationalQueryBuilder {
- constructor(mode, fullSchema, schema, tableNamesMap, table, tableConfig, dialect, session) {
- this.mode = mode;
- this.fullSchema = fullSchema;
- this.schema = schema;
- this.tableNamesMap = tableNamesMap;
- this.table = table;
- this.tableConfig = tableConfig;
- this.dialect = dialect;
- this.session = session;
- }
- static [entityKind] = "SQLiteAsyncRelationalQueryBuilder";
- findMany(config) {
- return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? config : {}, "many") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? config : {}, "many");
- }
- findFirst(config) {
- return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? { ...config, limit: 1 } : { limit: 1 }, "first") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? { ...config, limit: 1 } : { limit: 1 }, "first");
- }
-}
-
-class SQLiteRelationalQuery extends QueryPromise {
- constructor(fullSchema, schema, tableNamesMap, table, tableConfig, dialect, session, config, mode) {
- super();
- this.fullSchema = fullSchema;
- this.schema = schema;
- this.tableNamesMap = tableNamesMap;
- this.table = table;
- this.tableConfig = tableConfig;
- this.dialect = dialect;
- this.session = session;
- this.config = config;
- this.mode = mode;
- }
- static [entityKind] = "SQLiteAsyncRelationalQuery";
- mode;
- getSQL() {
- return this.dialect.buildRelationalQuery({
- fullSchema: this.fullSchema,
- schema: this.schema,
- tableNamesMap: this.tableNamesMap,
- table: this.table,
- tableConfig: this.tableConfig,
- queryConfig: this.config,
- tableAlias: this.tableConfig.tsName
- }).sql;
- }
- _prepare(isOneTimeQuery = false) {
- const { query, builtQuery } = this._toSQL();
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](builtQuery, undefined, this.mode === "first" ? "get" : "all", true, (rawRows, mapColumnValue) => {
- const rows = rawRows.map((row) => mapRelationalRow(this.schema, this.tableConfig, row, query.selection, mapColumnValue));
- if (this.mode === "first") {
- return rows[0];
- }
- return rows;
- });
- }
- prepare() {
- return this._prepare(false);
- }
- _toSQL() {
- const query = this.dialect.buildRelationalQuery({
- fullSchema: this.fullSchema,
- schema: this.schema,
- tableNamesMap: this.tableNamesMap,
- table: this.table,
- tableConfig: this.tableConfig,
- queryConfig: this.config,
- tableAlias: this.tableConfig.tsName
- });
- const builtQuery = this.dialect.sqlToQuery(query.sql);
- return { query, builtQuery };
- }
- toSQL() {
- return this._toSQL().builtQuery;
- }
- executeRaw() {
- if (this.mode === "first") {
- return this._prepare(false).get();
- }
- return this._prepare(false).all();
- }
- async execute() {
- return this.executeRaw();
- }
-}
-
-class SQLiteSyncRelationalQuery extends SQLiteRelationalQuery {
- static [entityKind] = "SQLiteSyncRelationalQuery";
- sync() {
- return this.executeRaw();
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/raw.js
-class SQLiteRaw extends QueryPromise {
- constructor(execute, getSQL, action, dialect, mapBatchResult) {
- super();
- this.execute = execute;
- this.getSQL = getSQL;
- this.dialect = dialect;
- this.mapBatchResult = mapBatchResult;
- this.config = { action };
- }
- static [entityKind] = "SQLiteRaw";
- config;
- getQuery() {
- return { ...this.dialect.sqlToQuery(this.getSQL()), method: this.config.action };
- }
- mapResult(result, isFromBatch) {
- return isFromBatch ? this.mapBatchResult(result) : result;
- }
- _prepare() {
- return this;
- }
- isResponseInArrayMode() {
- return false;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/db.js
-class BaseSQLiteDatabase {
- constructor(resultKind, dialect, session, schema) {
- this.resultKind = resultKind;
- this.dialect = dialect;
- this.session = session;
- this._ = schema ? {
- schema: schema.schema,
- fullSchema: schema.fullSchema,
- tableNamesMap: schema.tableNamesMap
- } : {
- schema: undefined,
- fullSchema: {},
- tableNamesMap: {}
- };
- this.query = {};
- const query = this.query;
- if (this._.schema) {
- for (const [tableName, columns] of Object.entries(this._.schema)) {
- query[tableName] = new RelationalQueryBuilder(resultKind, schema.fullSchema, this._.schema, this._.tableNamesMap, schema.fullSchema[tableName], columns, dialect, session);
- }
- }
- this.$cache = { invalidate: async (_params) => {} };
- }
- static [entityKind] = "BaseSQLiteDatabase";
- query;
- $with = (alias, selection) => {
- const self2 = this;
- const as = (qb) => {
- if (typeof qb === "function") {
- qb = qb(new QueryBuilder(self2.dialect));
- }
- return new Proxy(new WithSubquery(qb.getSQL(), selection ?? ("getSelectedFields" in qb ? qb.getSelectedFields() ?? {} : {}), alias, true), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- };
- return { as };
- };
- $count(source, filters) {
- return new SQLiteCountBuilder({ source, filters, session: this.session });
- }
- with(...queries) {
- const self2 = this;
- function select(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: self2.session,
- dialect: self2.dialect,
- withList: queries
- });
- }
- function selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: self2.session,
- dialect: self2.dialect,
- withList: queries,
- distinct: true
- });
- }
- function update(table) {
- return new SQLiteUpdateBuilder(table, self2.session, self2.dialect, queries);
- }
- function insert(into) {
- return new SQLiteInsertBuilder(into, self2.session, self2.dialect, queries);
- }
- function delete_(from) {
- return new SQLiteDeleteBase(from, self2.session, self2.dialect, queries);
- }
- return { select, selectDistinct, update, insert, delete: delete_ };
- }
- select(fields) {
- return new SQLiteSelectBuilder({ fields: fields ?? undefined, session: this.session, dialect: this.dialect });
- }
- selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: this.session,
- dialect: this.dialect,
- distinct: true
- });
- }
- update(table) {
- return new SQLiteUpdateBuilder(table, this.session, this.dialect);
- }
- $cache;
- insert(into) {
- return new SQLiteInsertBuilder(into, this.session, this.dialect);
- }
- delete(from) {
- return new SQLiteDeleteBase(from, this.session, this.dialect);
- }
- run(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.run(sequel), () => sequel, "run", this.dialect, this.session.extractRawRunValueFromBatchResult.bind(this.session));
- }
- return this.session.run(sequel);
- }
- all(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.all(sequel), () => sequel, "all", this.dialect, this.session.extractRawAllValueFromBatchResult.bind(this.session));
- }
- return this.session.all(sequel);
- }
- get(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.get(sequel), () => sequel, "get", this.dialect, this.session.extractRawGetValueFromBatchResult.bind(this.session));
- }
- return this.session.get(sequel);
- }
- values(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.values(sequel), () => sequel, "values", this.dialect, this.session.extractRawValuesValueFromBatchResult.bind(this.session));
- }
- return this.session.values(sequel);
- }
- transaction(transaction, config) {
- return this.session.transaction(transaction, config);
- }
-}
-
-// ../eve/node_modules/drizzle-orm/cache/core/cache.js
-class Cache {
- static [entityKind] = "Cache";
-}
-
-class NoopCache extends Cache {
- strategy() {
- return "all";
- }
- static [entityKind] = "NoopCache";
- async get(_key) {
- return;
- }
- async put(_hashedQuery, _response, _tables, _config) {}
- async onMutate(_params) {}
-}
-async function hashQuery(sql2, params) {
- const dataToHash = `${sql2}-${JSON.stringify(params)}`;
- const encoder = new TextEncoder;
- const data = encoder.encode(dataToHash);
- const hashBuffer = await crypto.subtle.digest("SHA-256", data);
- const hashArray = [...new Uint8Array(hashBuffer)];
- const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
- return hashHex;
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/session.js
-class ExecuteResultSync extends QueryPromise {
- constructor(resultCb) {
- super();
- this.resultCb = resultCb;
- }
- static [entityKind] = "ExecuteResultSync";
- async execute() {
- return this.resultCb();
- }
- sync() {
- return this.resultCb();
- }
-}
-
-class SQLitePreparedQuery {
- constructor(mode, executeMethod, query, cache, queryMetadata, cacheConfig) {
- this.mode = mode;
- this.executeMethod = executeMethod;
- this.query = query;
- this.cache = cache;
- this.queryMetadata = queryMetadata;
- this.cacheConfig = cacheConfig;
- if (cache && cache.strategy() === "all" && cacheConfig === undefined) {
- this.cacheConfig = { enable: true, autoInvalidate: true };
- }
- if (!this.cacheConfig?.enable) {
- this.cacheConfig = undefined;
- }
- }
- static [entityKind] = "PreparedQuery";
- joinsNotNullableMap;
- async queryWithCache(queryString, params, query) {
- if (this.cache === undefined || is(this.cache, NoopCache) || this.queryMetadata === undefined) {
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if (this.cacheConfig && !this.cacheConfig.enable) {
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if ((this.queryMetadata.type === "insert" || this.queryMetadata.type === "update" || this.queryMetadata.type === "delete") && this.queryMetadata.tables.length > 0) {
- try {
- const [res] = await Promise.all([
- query(),
- this.cache.onMutate({ tables: this.queryMetadata.tables })
- ]);
- return res;
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if (!this.cacheConfig) {
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if (this.queryMetadata.type === "select") {
- const fromCache = await this.cache.get(this.cacheConfig.tag ?? await hashQuery(queryString, params), this.queryMetadata.tables, this.cacheConfig.tag !== undefined, this.cacheConfig.autoInvalidate);
- if (fromCache === undefined) {
- let result;
- try {
- result = await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- await this.cache.put(this.cacheConfig.tag ?? await hashQuery(queryString, params), result, this.cacheConfig.autoInvalidate ? this.queryMetadata.tables : [], this.cacheConfig.tag !== undefined, this.cacheConfig.config);
- return result;
- }
- return fromCache;
- }
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- getQuery() {
- return this.query;
- }
- mapRunResult(result, _isFromBatch) {
- return result;
- }
- mapAllResult(_result, _isFromBatch) {
- throw new Error("Not implemented");
- }
- mapGetResult(_result, _isFromBatch) {
- throw new Error("Not implemented");
- }
- execute(placeholderValues) {
- if (this.mode === "async") {
- return this[this.executeMethod](placeholderValues);
- }
- return new ExecuteResultSync(() => this[this.executeMethod](placeholderValues));
- }
- mapResult(response, isFromBatch) {
- switch (this.executeMethod) {
- case "run": {
- return this.mapRunResult(response, isFromBatch);
- }
- case "all": {
- return this.mapAllResult(response, isFromBatch);
- }
- case "get": {
- return this.mapGetResult(response, isFromBatch);
- }
- }
- }
-}
-
-class SQLiteSession {
- constructor(dialect) {
- this.dialect = dialect;
- }
- static [entityKind] = "SQLiteSession";
- prepareOneTimeQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper, queryMetadata, cacheConfig) {
- return this.prepareQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper, queryMetadata, cacheConfig);
- }
- run(query) {
- const staticQuery = this.dialect.sqlToQuery(query);
- try {
- return this.prepareOneTimeQuery(staticQuery, undefined, "run", false).run();
- } catch (err) {
- throw new DrizzleError({ cause: err, message: `Failed to run the query '${staticQuery.sql}'` });
- }
- }
- extractRawRunValueFromBatchResult(result) {
- return result;
- }
- all(query) {
- return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).all();
- }
- extractRawAllValueFromBatchResult(_result) {
- throw new Error("Not implemented");
- }
- get(query) {
- return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).get();
- }
- extractRawGetValueFromBatchResult(_result) {
- throw new Error("Not implemented");
- }
- values(query) {
- return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).values();
- }
- async count(sql2) {
- const result = await this.values(sql2);
- return result[0][0];
- }
- extractRawValuesValueFromBatchResult(_result) {
- throw new Error("Not implemented");
- }
-}
-
-class SQLiteTransaction extends BaseSQLiteDatabase {
- constructor(resultType, dialect, session, schema, nestedIndex = 0) {
- super(resultType, dialect, session, schema);
- this.schema = schema;
- this.nestedIndex = nestedIndex;
- }
- static [entityKind] = "SQLiteTransaction";
- rollback() {
- throw new TransactionRollbackError;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/logger.js
-class ConsoleLogWriter {
- static [entityKind] = "ConsoleLogWriter";
- write(message) {
- console.log(message);
- }
-}
-
-class DefaultLogger {
- static [entityKind] = "DefaultLogger";
- writer;
- constructor(config) {
- this.writer = config?.writer ?? new ConsoleLogWriter;
- }
- logQuery(query, params) {
- const stringifiedParams = params.map((p) => {
- try {
- return JSON.stringify(p);
- } catch {
- return String(p);
- }
- });
- const paramsStr = stringifiedParams.length ? ` -- params: [${stringifiedParams.join(", ")}]` : "";
- this.writer.write(`Query: ${query}${paramsStr}`);
- }
-}
-
-class NoopLogger {
- static [entityKind] = "NoopLogger";
- logQuery() {}
-}
-
-// ../eve/dist/db/schema.js
-var schema_exports = {};
-__export(schema_exports, {
- characters: () => characters,
- charactersRelations: () => charactersRelations,
- miningFleetParticipants: () => miningFleetParticipants,
- miningFleetParticipantsRelations: () => miningFleetParticipantsRelations,
- miningFleets: () => miningFleets,
- miningFleetsRelations: () => miningFleetsRelations,
- resumeCommands: () => resumeCommands,
- shared: () => shared,
- users: () => users,
- usersRelations: () => usersRelations
-});
-var shared = {
- createdAt: integer("created_at").notNull(),
- updatedAt: integer("updated_at")
-};
-var users = sqliteTable("users", {
- id: integer().primaryKey().unique().notNull(),
- discordID: text("discord_id").unique().notNull(),
- mainCharacter: integer("main_character"),
- ...shared
-}, (table) => [index("idx_discord_id").on(table.discordID), index("idx_main_character").on(table.mainCharacter)]);
-var usersRelations = relations(users, ({ one, many }) => ({
- characters: many(characters),
- main: one(characters, {
- fields: [users.mainCharacter],
- references: [characters.id]
- })
-}));
-var characters = sqliteTable("characters", {
- id: integer("id").primaryKey({ autoIncrement: true }),
- eveID: integer("eve_id").notNull(),
- userID: integer("user_id").notNull(),
- name: text().notNull(),
- accessToken: text("access_token").notNull(),
- expiresAt: integer("expires_at").notNull(),
- refreshToken: text("refresh_token").notNull(),
- ...shared
-}, (table) => [index("idx_user_id").on(table.userID), index("idx_eve_id").on(table.eveID)]);
-var charactersRelations = relations(characters, ({ one }) => ({ user: one(users, {
- fields: [characters.userID],
- references: [users.id]
-}) }));
-var resumeCommands = sqliteTable("resumecommands", {
- id: text().primaryKey(),
- command: text().notNull(),
- params: text().notNull(),
- context: text().notNull(),
- ...shared
-});
-var miningFleets = sqliteTable("mining_fleets", {
- id: integer("id").primaryKey({ autoIncrement: true }),
- name: text("name").notNull(),
- description: text("description"),
- creatorDiscordId: text("creator_discord_id").notNull(),
- startTime: integer("start_time").notNull(),
- endTime: integer("end_time"),
- status: text("status", { enum: [
- "configuring",
- "active",
- "ended",
- "generating_report",
- "completed",
- "failed"
- ] }).notNull().default("configuring"),
- taxRate: real("tax_rate").notNull().default(0),
- publicMessageId: text("public_message_id").unique(),
- publicChannelId: text("public_channel_id"),
- reportData: text("report_data"),
- creatorEphemeralMessageId: text("creator_ephemeral_message_id"),
- ...shared
-}, (table) => [
- index("idx_fleet_creator_discord_id").on(table.creatorDiscordId),
- index("idx_fleet_status").on(table.status),
- index("idx_fleet_public_message_id").on(table.publicMessageId)
-]);
-var miningFleetParticipants = sqliteTable("mining_fleet_participants", {
- id: integer("id").primaryKey({ autoIncrement: true }),
- fleetId: integer("fleet_id").notNull().references(() => miningFleets.id, { onDelete: "cascade" }),
- characterId: integer("character_id").notNull().references(() => characters.id, { onDelete: "cascade" }),
- discordId: text("discord_id").notNull(),
- role: text("role", { enum: [
- "miner",
- "security",
- "hauler"
- ] }).notNull(),
- joinTime: integer("join_time").notNull(),
- ...shared
-}, (table) => [
- index("idx_participant_fleet_id").on(table.fleetId),
- index("idx_participant_character_id").on(table.characterId),
- index("idx_participant_discord_id").on(table.discordId)
-]);
-var miningFleetsRelations = relations(miningFleets, ({ many }) => ({ participants: many(miningFleetParticipants) }));
-var miningFleetParticipantsRelations = relations(miningFleetParticipants, ({ one }) => ({
- fleet: one(miningFleets, {
- fields: [miningFleetParticipants.fleetId],
- references: [miningFleets.id]
- }),
- character: one(characters, {
- fields: [miningFleetParticipants.characterId],
- references: [characters.id]
- })
-}));
-
-// ../eve/dist/db/models/user.model.js
-var UserHelper = class {
- static find(id) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).where(eq(users.id, id)).leftJoin(characters, eq(users.id, characters.userID)).get();
- return this.createFromQuery(result);
- }
- static findByDiscordId(id) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).where(eq(users.discordID, id)).leftJoin(characters, eq(users.id, characters.userID)).get();
- return this.createFromQuery(result);
- }
- static findAll() {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).leftJoin(characters, eq(users.id, characters.userID)).all();
- return this.createFromQuery(result);
- }
- static findByCharacterId(id) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).leftJoin(characters, eq(users.id, characters.userID)).where(eq(characters.id, id)).all();
- return this.createFromQuery(result);
- }
- static findByCharacterName(name) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).leftJoin(characters, eq(users.id, characters.userID)).where(eq(characters.name, name)).all();
- return this.createFromQuery(result);
- }
- static createFromQuery(query) {
- if (!query)
- return [];
- if (Array.isArray(query))
- return query.map((user) => {
- return {
- id: user.id,
- discordID: user.discordID,
- createdAt: new Date(user.createdAt),
- updatedAt: new Date(user.updatedAt),
- characterIDs: user.characterIDsString ? JSON.parse(user.characterIDsString ?? "[]").map((s) => Number(s)).sort() : [],
- mainCharacterID: user.mainCharacterID
- };
- });
- else
- return {
- id: query.id,
- discordID: query.discordID,
- createdAt: new Date(query.createdAt),
- updatedAt: new Date(query.updatedAt),
- characterIDs: query.characterIDsString ? JSON.parse(query.characterIDsString ?? "[]").map((s) => Number(s)).sort() : [],
- mainCharacterID: query.mainCharacterID
- };
- }
- static create(discordID) {
- this.save({
- discordID,
- createdAt: /* @__PURE__ */ new Date,
- updatedAt: /* @__PURE__ */ new Date
- });
- return this.findByDiscordId(discordID);
- }
- static save(user) {
- db.insert(users).values({
- id: user.id,
- discordID: user.discordID,
- mainCharacter: user.mainCharacterID,
- createdAt: user.createdAt.getTime(),
- updatedAt: user.updatedAt.getTime()
- }).onConflictDoUpdate({
- target: users.id,
- set: {
- discordID: user.discordID,
- mainCharacter: user.mainCharacterID,
- updatedAt: user.updatedAt.getTime()
- }
- }).run();
- return user;
- }
- static delete(user) {
- db.delete(users).where(eq(users.id, user.id)).run();
- }
- static getCharacter(user, index2) {
- if (!user.characterIDs)
- return;
- if (index2 >= user.characterIDs.length)
- return;
- return CharacterHelper.find(user.characterIDs[index2]);
- }
-};
-
-// ../eve/dist/db/models/resume-command.model.js
-var ResumeCommand = class ResumeCommand2 {
- id;
- command;
- params;
- context;
- created = /* @__PURE__ */ new Date;
- constructor() {
- this.created = /* @__PURE__ */ new Date;
- }
- static find(messageId) {
- const result = db.select().from(resumeCommands).where(eq(resumeCommands.id, messageId)).get();
- return this.createFromQuery(result);
- }
- static create(messageId, command, params = {}, context = {}) {
- const resume = new ResumeCommand2;
- resume.id = messageId;
- resume.command = command;
- resume.params = JSON.stringify(params);
- resume.context = JSON.stringify(context);
- return resume;
- }
- static createFromQuery(query) {
- if (!query)
- return null;
- const resume = new ResumeCommand2;
- resume.id = query.id;
- resume.command = query.command;
- resume.params = query.params;
- resume.context = query.context;
- resume.created = query.created;
- return resume;
- }
- save() {
- db.insert(resumeCommands).values({
- id: this.id,
- command: this.command,
- params: this.params,
- context: this.context,
- createdAt: this.created.getTime()
- }).onConflictDoUpdate({
- target: resumeCommands.id,
- set: {
- command: this.command,
- params: this.params,
- context: this.context
- }
- }).run();
- return this;
- }
- delete() {
- db.delete(resumeCommands).where(eq(resumeCommands.id, this.id)).run();
- }
- static delete(messageId) {
- db.delete(resumeCommands).where(eq(resumeCommands.id, messageId)).run();
- }
-};
-
-// ../eve/dist/db/models/index.js
-var models_exports = {};
-__export(models_exports, {
- CharacterHelper: () => CharacterHelper,
- ResumeCommand: () => ResumeCommand,
- UserHelper: () => UserHelper
-});
-
-// ../eve/node_modules/drizzle-orm/bun-sqlite/driver.js
-import { Database } from "bun:sqlite";
-
-// ../eve/node_modules/drizzle-orm/bun-sqlite/session.js
-class SQLiteBunSession extends SQLiteSession {
- constructor(client, dialect, schema, options2 = {}) {
- super(dialect);
- this.client = client;
- this.schema = schema;
- this.logger = options2.logger ?? new NoopLogger;
- }
- static [entityKind] = "SQLiteBunSession";
- logger;
- exec(query) {
- this.client.exec(query);
- }
- prepareQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper) {
- const stmt = this.client.prepare(query.sql);
- return new PreparedQuery(stmt, query, this.logger, fields, executeMethod, isResponseInArrayMode, customResultMapper);
- }
- transaction(transaction, config = {}) {
- const tx = new SQLiteBunTransaction("sync", this.dialect, this, this.schema);
- let result;
- const nativeTx = this.client.transaction(() => {
- result = transaction(tx);
- });
- nativeTx[config.behavior ?? "deferred"]();
- return result;
- }
-}
-
-class SQLiteBunTransaction extends SQLiteTransaction {
- static [entityKind] = "SQLiteBunTransaction";
- transaction(transaction) {
- const savepointName = `sp${this.nestedIndex}`;
- const tx = new SQLiteBunTransaction("sync", this.dialect, this.session, this.schema, this.nestedIndex + 1);
- this.session.run(sql.raw(`savepoint ${savepointName}`));
- try {
- const result = transaction(tx);
- this.session.run(sql.raw(`release savepoint ${savepointName}`));
- return result;
- } catch (err) {
- this.session.run(sql.raw(`rollback to savepoint ${savepointName}`));
- throw err;
- }
- }
-}
-
-class PreparedQuery extends SQLitePreparedQuery {
- constructor(stmt, query, logger, fields, executeMethod, _isResponseInArrayMode, customResultMapper) {
- super("sync", executeMethod, query);
- this.stmt = stmt;
- this.logger = logger;
- this.fields = fields;
- this._isResponseInArrayMode = _isResponseInArrayMode;
- this.customResultMapper = customResultMapper;
- }
- static [entityKind] = "SQLiteBunPreparedQuery";
- run(placeholderValues) {
- const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
- this.logger.logQuery(this.query.sql, params);
- return this.stmt.run(...params);
- }
- all(placeholderValues) {
- const { fields, query, logger, joinsNotNullableMap, stmt, customResultMapper } = this;
- if (!fields && !customResultMapper) {
- const params = fillPlaceholders(query.params, placeholderValues ?? {});
- logger.logQuery(query.sql, params);
- return stmt.all(...params);
- }
- const rows = this.values(placeholderValues);
- if (customResultMapper) {
- return customResultMapper(rows);
- }
- return rows.map((row) => mapResultRow(fields, row, joinsNotNullableMap));
- }
- get(placeholderValues) {
- const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
- this.logger.logQuery(this.query.sql, params);
- const row = this.stmt.values(...params)[0];
- if (!row) {
- return;
- }
- const { fields, joinsNotNullableMap, customResultMapper } = this;
- if (!fields && !customResultMapper) {
- return row;
- }
- if (customResultMapper) {
- return customResultMapper([row]);
- }
- return mapResultRow(fields, row, joinsNotNullableMap);
- }
- values(placeholderValues) {
- const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
- this.logger.logQuery(this.query.sql, params);
- return this.stmt.values(...params);
- }
- isResponseInArrayMode() {
- return this._isResponseInArrayMode;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/bun-sqlite/driver.js
-class BunSQLiteDatabase extends BaseSQLiteDatabase {
- static [entityKind] = "BunSQLiteDatabase";
-}
-function construct(client, config = {}) {
- const dialect = new SQLiteSyncDialect({ casing: config.casing });
- let logger;
- if (config.logger === true) {
- logger = new DefaultLogger;
- } else if (config.logger !== false) {
- logger = config.logger;
- }
- let schema;
- if (config.schema) {
- const tablesConfig = extractTablesRelationalConfig(config.schema, createTableRelationsHelpers);
- schema = {
- fullSchema: config.schema,
- schema: tablesConfig.tables,
- tableNamesMap: tablesConfig.tableNamesMap
- };
- }
- const session = new SQLiteBunSession(client, dialect, schema, { logger });
- const db2 = new BunSQLiteDatabase("sync", dialect, session, schema);
- db2.$client = client;
- return db2;
-}
-function drizzle(...params) {
- if (params[0] === undefined || typeof params[0] === "string") {
- const instance = params[0] === undefined ? new Database : new Database(params[0]);
- return construct(instance, params[1]);
- }
- if (isConfig(params[0])) {
- const { connection, client, ...drizzleConfig } = params[0];
- if (client)
- return construct(client, drizzleConfig);
- if (typeof connection === "object") {
- const { source, ...opts } = connection;
- const options2 = Object.values(opts).filter((v) => v !== undefined).length ? opts : undefined;
- const instance2 = new Database(source, options2);
- return construct(instance2, drizzleConfig);
- }
- const instance = new Database(connection);
- return construct(instance, drizzleConfig);
- }
- return construct(params[0], params[1]);
-}
-((drizzle2) => {
- function mock(config) {
- return construct({}, config);
- }
- drizzle2.mock = mock;
-})(drizzle || (drizzle = {}));
-
-// ../eve/dist/db/index.js
-import { Database as Database2 } from "bun:sqlite";
-import { join } from "path";
-var DB_PATH = process.env.AUTH_DB_PATH || join(process.cwd(), "../../db/kitten.db");
-console.log("Using DB_PATH:", DB_PATH);
-var sqlite = new Database2(DB_PATH);
-var db = drizzle(sqlite, { schema: {
- users,
- characters,
- resumeCommands,
- miningFleets,
- miningFleetParticipants
-} });
-
-// ../eve/dist/db/models/character.model.js
-var CharacterHelper = class CharacterHelper2 {
- static hasValidToken(character) {
- return /* @__PURE__ */ new Date < character.expiresAt;
- }
- static getScopes(character) {
- const decoded = jwtDecode(character.accessToken);
- return typeof decoded.scp === "string" ? [decoded.scp] : decoded.scp;
- }
- static hasOnlyPublicScope(character) {
- return this.getScopes(character).length === 1 && this.hasScope(character, "publicData");
- }
- static getTokens(character) {
- return {
- access_token: character.accessToken,
- refresh_token: character.refreshToken,
- expires_in: (character.expiresAt.getTime() - Date.now()) / 1000
- };
- }
- static hasScope(character, scope) {
- return this.getScopes(character).includes(scope);
- }
- static hasAllScopes(character, scopes) {
- const has = this.getScopes(character);
- return scopes.every((scope) => has.includes(scope));
- }
- static find(id) {
- const result = db.select().from(characters).where(eq(characters.id, id)).limit(1).get();
- const c = this.createCharacters(result);
- return c ? c[0] : undefined;
- }
- static findByUser(user) {
- const result = db.select().from(characters).where(eq(characters.userID, user.id)).all();
- return this.createCharacters(result);
- }
- static findByUserAndEveID(userID, eveID) {
- const result = db.select().from(characters).where(and(eq(characters.userID, userID), eq(characters.eveID, eveID))).limit(1).get();
- const c = this.createCharacters(result);
- return c ? c[0] : undefined;
- }
- static findByName(userID, name) {
- const result = db.select().from(characters).where(and(eq(characters.name, name), eq(characters.userID, userID))).limit(1).get();
- const c = this.createCharacters(result);
- return c ? c[0] : undefined;
- }
- static findAll() {
- const result = db.select().from(characters).all();
- return this.createCharacters(result);
- }
- static create(eveID, name, user, tokens) {
- return this.save({
- eveID,
- userID: user.id,
- accessToken: tokens.access_token,
- expiresAt: /* @__PURE__ */ new Date(tokens.expires_in * 1000),
- refreshToken: tokens.refresh_token,
- name,
- createdAt: /* @__PURE__ */ new Date
- });
- }
- static createCharacters(query) {
- if (!query)
- return [];
- if (Array.isArray(query))
- return query.map((character) => {
- return {
- id: character.id,
- eveID: character.eveID,
- userID: character.userID,
- accessToken: character.accessToken,
- expiresAt: new Date(character.expiresAt),
- refreshToken: character.refreshToken,
- name: character.name,
- createdAt: new Date(character.createdAt),
- updatedAt: new Date(character.updatedAt)
- };
- });
- else
- return [{
- id: query.id,
- eveID: query.eveID,
- userID: query.userID,
- accessToken: query.accessToken,
- expiresAt: new Date(query.expiresAt),
- refreshToken: query.refreshToken,
- name: query.name,
- createdAt: new Date(query.createdAt),
- updatedAt: new Date(query.updatedAt)
- }];
- }
- static save(character) {
- db.insert(characters).values({
- id: character.id,
- eveID: character.eveID,
- userID: character.userID,
- name: character.name,
- accessToken: character.accessToken,
- expiresAt: character.expiresAt.getTime(),
- refreshToken: character.refreshToken,
- createdAt: Date.now(),
- updatedAt: Date.now()
- }).onConflictDoUpdate({
- target: characters.id,
- set: {
- eveID: character.eveID,
- userID: character.userID,
- name: character.name,
- accessToken: character.accessToken,
- expiresAt: character.expiresAt.getTime(),
- refreshToken: character.refreshToken,
- updatedAt: Date.now()
- }
- }).run();
- return CharacterHelper2.findByUserAndEveID(character.userID, character.eveID);
- }
- static delete(character) {
- db.delete(characters).where(eq(characters.id, character.id)).run();
- }
- static async refreshTokens(character, scopes) {
- const tokens = await refresh({ refresh_token: character.refreshToken }, scopes);
- const decoded = await validateToken(tokens.access_token);
- if (!decoded) {
- console.error(`Failed to validate token for character ${character.eveID}`);
- return character;
- }
- character.accessToken = tokens.access_token;
- character.expiresAt = new Date(Date.now() + tokens.expires_in * 1000);
- character.refreshToken = tokens.refresh_token;
- this.save(character);
- return character;
- }
-};
-
-// ../eve/dist/esi/fetch.js
-var cache = /* @__PURE__ */ new Map;
-function cleanCache() {
- const now = Date.now();
- for (const [key, value] of cache)
- if (value.expires < now)
- cache.delete(key);
-}
-setInterval(cleanCache, 1000 * 60 * 15);
-var defaultCacheDuration = 1000 * 60 * 30;
-async function esiFetch(path, character, { method = "GET", body, noCache = false, cacheDuration = defaultCacheDuration } = {}) {
- try {
- const headers = {
- "User-Agent": options.user_agent,
- Accept: "application/json"
- };
- if (character) {
- if (!CharacterHelper.hasValidToken(character)) {
- await CharacterHelper.refreshTokens(character);
- if (!CharacterHelper.hasValidToken(character))
- throw new Error(`Failed to refresh token for character: ${character.eveID}`);
- }
- headers["Authorization"] = `Bearer ${character.accessToken}`;
- }
- const init = {
- headers,
- method: method || "GET",
- body: body || undefined
- };
- const url = new URL(`${ESI_LATEST_URL}${path.startsWith("/") ? path : "/" + path}`);
- url.searchParams.set("datasource", "tranquility");
- if (!noCache && init.method === "GET") {
- const cached = cache.get(url.href);
- if (cached && cached?.expires > Date.now())
- return cached.data;
- }
- const res = await fetch(url, init);
- const data = await res.json();
- if (!res.ok) {
- console.error(`ESI request failure at ${path} | ${res.status}:${res.statusText} => ${JSON.stringify(data)}`);
- return null;
- }
- if (init.method === "GET")
- cache.set(url.href, {
- expires: Math.max(res.headers.get("expires") && new Date(Number(res.headers.get("expires") || "")).getTime() || 0, Date.now() + cacheDuration),
- data
- });
- return data;
- } catch (err) {
- console.error(`ESI request failure at ${path} | ${JSON.stringify(err)}`, err);
- return null;
- }
-}
-
-// ../eve/dist/esi/character.js
-var character_exports = {};
-__export(character_exports, {
- getCharacterAffiliations: () => getCharacterAffiliations,
- getCharacterAgentResearch: () => getCharacterAgentResearch,
- getCharacterAssetLocations: () => getCharacterAssetLocations,
- getCharacterAssetNames: () => getCharacterAssetNames,
- getCharacterAssets: () => getCharacterAssets,
- getCharacterBlueprints: () => getCharacterBlueprints,
- getCharacterClones: () => getCharacterClones,
- getCharacterContactNotifications: () => getCharacterContactNotifications,
- getCharacterCorporationHistory: () => getCharacterCorporationHistory,
- getCharacterCurrentShip: () => getCharacterCurrentShip,
- getCharacterImplants: () => getCharacterImplants,
- getCharacterJumpFatigue: () => getCharacterJumpFatigue,
- getCharacterLocation: () => getCharacterLocation,
- getCharacterMedals: () => getCharacterMedals,
- getCharacterNotifications: () => getCharacterNotifications,
- getCharacterOnline: () => getCharacterOnline,
- getCharacterPortraits: () => getCharacterPortraits,
- getCharacterPublicData: () => getCharacterPublicData,
- getCharacterRoles: () => getCharacterRoles,
- getCharacterStandings: () => getCharacterStandings,
- getCharacterTitles: () => getCharacterTitles,
- getCharacterWallet: () => getCharacterWallet,
- getCharacterWalletJournal: () => getCharacterWalletJournal,
- getCharacterWalletTransactions: () => getCharacterWalletTransactions,
- getPortraitURL: () => getPortraitURL
-});
-function getCharacterPublicData(id) {
- return esiFetch(`/characters/${id}/`);
-}
-function getCharacterAffiliations(ids) {
- return esiFetch(`/characters/affiliation/`, undefined, {
- method: "POST",
- body: JSON.stringify(ids)
- })[0];
-}
-function getCharacterPortraits(id) {
- return esiFetch(`/characters/${id}/portrait/`);
-}
-function getCharacterCorporationHistory(id) {
- return esiFetch(`/characters/${id}/corporationhistory/`);
-}
-function getPortraitURL(id) {
- return `https://images.evetech.net/characters/${id}/portrait`;
-}
-function getCharacterRoles(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_corporation_roles.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/roles/`, character);
-}
-function getCharacterTitles(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_titles.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/titles/`, character);
-}
-function getCharacterStandings(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_standings.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/standings/`, character);
-}
-function getCharacterNotifications(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_notifications.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/notifications/`, character);
-}
-function getCharacterContactNotifications(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_notifications.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/notifications/contacts`, character);
-}
-function getCharacterMedals(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_medals.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/medals/`, character);
-}
-function getCharacterJumpFatigue(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_fatigue.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/fatigue/`, character);
-}
-function getCharacterBlueprints(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_blueprints.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/blueprints/`, character);
-}
-function getCharacterAgentResearch(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_agents_research.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/agents_research/`, character);
-}
-function getCharacterClones(character) {
- if (!CharacterHelper.hasScope(character, "esi-clones.read_clones.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/clones/`, character);
-}
-function getCharacterImplants(character) {
- if (!CharacterHelper.hasScope(character, "esi-clones.read_implants.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/implants/`, character);
-}
-function getCharacterAssets(character) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_assets.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/assets/`, character);
-}
-function getCharacterAssetLocations(character, ids) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_assets.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/assets/locations/`, character, {
- method: "POST",
- body: JSON.stringify(ids)
- });
-}
-function getCharacterAssetNames(character, ids) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_assets.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/assets/names/`, character, {
- method: "POST",
- body: JSON.stringify(ids)
- });
-}
-function getCharacterWallet(character) {
- if (!CharacterHelper.hasScope(character, "esi-wallet.read_character_wallet.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/wallet/`, character);
-}
-function getCharacterWalletTransactions(character, fromId) {
- if (!CharacterHelper.hasScope(character, "esi-wallet.read_character_wallet.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/wallet/transactions/`, character, {
- method: "POST",
- body: JSON.stringify(fromId)
- });
-}
-function getCharacterWalletJournal(character, page = 1) {
- if (!CharacterHelper.hasScope(character, "esi-wallet.read_character_wallet.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/wallet/journal/?page=${page}`, character);
-}
-function getCharacterLocation(character) {
- if (!CharacterHelper.hasScope(character, "esi-location.read_location.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/location/`, character);
-}
-function getCharacterOnline(character) {
- if (!CharacterHelper.hasScope(character, "esi-location.read_online.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/online/`, character);
-}
-function getCharacterCurrentShip(character) {
- if (!CharacterHelper.hasScope(character, "esi-location.read_ship_type.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/ship/`, character);
-}
-
-// ../eve/dist/esi/corporation.js
-var corporation_exports = {};
-__export(corporation_exports, {
- getCorporationAllianceHistory: () => getCorporationAllianceHistory,
- getCorporationAssetLocations: () => getCorporationAssetLocations,
- getCorporationAssetNames: () => getCorporationAssetNames,
- getCorporationAssets: () => getCorporationAssets,
- getCorporationData: () => getCorporationData,
- getCorporationIcons: () => getCorporationIcons
-});
-async function getCorporationData(id) {
- return await esiFetch(`/corporations/${id}/`);
-}
-async function getCorporationAllianceHistory(id) {
- return await esiFetch(`/corporations/${id}/alliancehistory/`);
-}
-async function getCorporationIcons(id) {
- return await esiFetch(`/corporations/${id}/icons/`);
-}
-async function getCorporationAssets(id, character) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_corporation_assets.v1"))
- return null;
- return await esiFetch(`/corporations/${id}/assets/`, character);
-}
-async function getCorporationAssetLocations(id, character, ids) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_corporation_assets.v1"))
- return null;
- return await esiFetch(`/corporations/${id}/assets/locations/`, character, {
- method: "POST",
- body: JSON.stringify(ids)
- });
-}
-async function getCorporationAssetNames(id, character, ids) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_corporation_assets.v1"))
- return null;
- return await esiFetch(`/corporations/${id}/assets/names/`, character, {
- method: "POST",
- body: JSON.stringify(ids)
- });
-}
-
-// ../eve/dist/esi/alliance.js
-var alliance_exports = {};
-__export(alliance_exports, {
- getAllianceCorporations: () => getAllianceCorporations,
- getAllianceData: () => getAllianceData,
- getAllianceIcons: () => getAllianceIcons
-});
-async function getAllianceData(id) {
- return await esiFetch(`/alliances/${id}/`);
-}
-async function getAllianceCorporations(id) {
- return await esiFetch(`/alliances/${id}/corporations/`);
-}
-async function getAllianceIcons(id) {
- return await esiFetch(`/alliances/${id}/icons/`);
-}
-
-// ../eve/dist/esi/skills.js
-function getCharacterSkillQueue(character) {
- if (!CharacterHelper.hasScope(character, "esi-skills.read_skillqueue.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/skillqueue`, character);
-}
-function calculateTrainingPercentage(queuedSkill) {
- const trainingStartPosition = (queuedSkill.training_start_sp - queuedSkill.level_start_sp) / queuedSkill.level_end_sp;
- const timePosition = ((/* @__PURE__ */ new Date()).getTime() - new Date(queuedSkill.start_date).getTime()) / (new Date(queuedSkill.finish_date).getTime() - new Date(queuedSkill.start_date).getTime());
- return trainingStartPosition + (1 - trainingStartPosition) * timePosition;
-}
-
-// src/api/auth/callback.ts
-async function GET(request) {
- const eveauth = request.store.get("eveauth");
- const response = new Response("", { status: 302 });
- try {
- const cookies2 = getCookies(request.headers);
- const cookieDiscordID = cookies2["discordID"];
- if (!cookieDiscordID) {
- throw new Error(`Missing discordID cookie in /api/auth/callback`);
- }
- const cookieCharacterID = cookies2["characterID"];
- const token = await eveauth.validate(response);
- const characterID = characterIdFromToken(token.access_token);
- if (cookieCharacterID && parseInt(cookieCharacterID) !== characterID) {
- throw new Error(`Character ID mismatch: ${cookieCharacterID} !== ${characterID}`);
- }
- let user = UserHelper.findByDiscordId(cookieDiscordID);
- let character = CharacterHelper.findByUserAndEveID(user.id, Number(characterID));
- if (!user) {
- user = UserHelper.create(cookieDiscordID);
- }
- if (!user) {
- throw new Error(`Something went wrong with creating a user for id: ${cookieDiscordID}`);
- }
- if (!character) {
- console.log(`Creating new character for user: ${user.id} with id: ${characterID}`);
- const data = await character_exports.getCharacterPublicData(characterID);
- if (!data) {
- throw new Error(`Failed to retreive character public data for id: ${characterID} - unable to create character`);
- }
- character = CharacterHelper.create(characterID, data.name || "UNKNOWN NAME", user, token);
- user = UserHelper.findByDiscordId(cookieDiscordID);
- character = CharacterHelper.findByUserAndEveID(user.id, Number(characterID));
- if (!character) {
- throw new Error(`Failed to retreive character from db for id: ${characterID}`);
- }
- if (!user.mainCharacterID) {
- user.mainCharacterID = character.id;
- UserHelper.save(user);
- }
- } else {
- console.log(`Updating existing character: ${character.name} (${character.eveID}) with new token`);
- character.accessToken = token.access_token;
- character.expiresAt = new Date(Date.now() + token.expires_in * 1000);
- character.refreshToken = token.refresh_token;
- CharacterHelper.save(character);
- }
- setCookie(response, "currentUser", user.id + "", 60 * 60 * 24 * 30);
- response.headers.set("location", "/auth/success");
- } catch (err) {
- console.error(`Error: Callback failed with ${err}`);
- response.headers.set("location", "/auth/error");
- return response;
- } finally {
- removeCookie(response, "discordID");
- removeCookie(response, "characterID");
- removeCookie(response, "state");
- }
- return response;
-}
-export {
- GET
-};
-
-//# debugId=AB938D765FF7305764756E2164756E21
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2FmZS1idWZmZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3c1xcbGliXFxkYXRhLXN0cmVhbS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlY2RzYS1zaWctZm9ybWF0dGVyXFxzcmNcXHBhcmFtLWJ5dGVzLWZvci1hbGcuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWNkc2Etc2lnLWZvcm1hdHRlclxcc3JjXFxlY2RzYS1zaWctZm9ybWF0dGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGJ1ZmZlci1lcXVhbC1jb25zdGFudC10aW1lXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd2FcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3c1xcbGliXFx0b3N0cmluZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd3NcXGxpYlxcc2lnbi1zdHJlYW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandzXFxsaWJcXHZlcmlmeS1zdHJlYW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGRlY29kZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxcSnNvbldlYlRva2VuRXJyb3IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcanNvbndlYnRva2VuXFxsaWJcXE5vdEJlZm9yZUVycm9yLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxUb2tlbkV4cGlyZWRFcnJvci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxtc1xcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcanNvbndlYnRva2VuXFxsaWJcXHRpbWVzcGFuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcaW50ZXJuYWxcXGNvbnN0YW50cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxkZWJ1Zy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxyZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxwYXJzZS1vcHRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcaW50ZXJuYWxcXGlkZW50aWZpZXJzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcY2xhc3Nlc1xcc2VtdmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxwYXJzZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcdmFsaWQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGNsZWFuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxpbmMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGRpZmYuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXG1ham9yLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxtaW5vci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xccGF0Y2guanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHByZXJlbGVhc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGNvbXBhcmUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHJjb21wYXJlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb21wYXJlLWxvb3NlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb21wYXJlLWJ1aWxkLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxzb3J0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxyc29ydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcZ3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGx0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxlcS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcbmVxLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxndGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGx0ZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcY21wLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb2VyY2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxpbnRlcm5hbFxcbHJ1Y2FjaGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxjbGFzc2VzXFxyYW5nZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGNsYXNzZXNcXGNvbXBhcmF0b3IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHNhdGlzZmllcy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcdG8tY29tcGFyYXRvcnMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXG1heC1zYXRpc2Z5aW5nLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxtaW4tc2F0aXNmeWluZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcbWluLXZlcnNpb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXHZhbGlkLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxvdXRzaWRlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxndHIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXGx0ci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcaW50ZXJzZWN0cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcc2ltcGxpZnkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXHN1YnNldC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxhc3ltbWV0cmljS2V5RGV0YWlsc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxccnNhUHNzS2V5RGV0YWlsc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxcdmFsaWRhdGVBc3ltbWV0cmljS2V5LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxwc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXHZlcmlmeS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxsb2Rhc2guaW5jbHVkZXNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc2Jvb2xlYW5cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc2ludGVnZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc251bWJlclxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbG9kYXNoLmlzcGxhaW5vYmplY3RcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc3N0cmluZ1xcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbG9kYXNoLm9uY2VcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcc2lnbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGJuLmpzXFxsaWJcXGJuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGluaGVyaXRzXFxpbmhlcml0c19icm93c2VyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGluaGVyaXRzXFxpbmhlcml0cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzYWZlci1idWZmZXJcXHNhZmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYmFzZVxccmVwb3J0ZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxiYXNlXFxidWZmZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbWluaW1hbGlzdGljLWFzc2VydFxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxiYXNlXFxub2RlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcY29uc3RhbnRzXFxkZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxlbmNvZGVyc1xcZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcZW5jb2RlcnNcXHBlbS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxhc24xLmpzXFxsaWJcXGFzbjFcXGVuY29kZXJzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxhc24xLmpzXFxsaWJcXGFzbjFcXGRlY29kZXJzXFxkZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxkZWNvZGVyc1xccGVtLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcZGVjb2RlcnNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYXBpLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYmFzZVxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxjb25zdGFudHNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzXFxsaWJcXHV0aWxzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxicm9yYW5kXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVcXGJhc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGN1cnZlXFxzaG9ydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVcXG1vbnQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGN1cnZlXFxlZHdhcmRzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljXFxjdXJ2ZVxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXGNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXHNoYVxcY29tbW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwxLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwyNTYuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxzaGFcXDIyNC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXHNoYVxcNTEyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwzODQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxzaGEuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxyaXBlbWQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxobWFjLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xccHJlY29tcHV0ZWRcXHNlY3AyNTZrMS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhtYWMtZHJiZ1xcbGliXFxobWFjLWRyYmcuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxrZXkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxzaWduYXR1cmUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXGtleS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXHNpZ25hdHVyZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYjY0LXRvLWJuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYXNuMVxcYWxnb3JpdGhtLWlkZW50aWZpZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandrLXRvLXBlbVxcc3JjXFxhc24xXFxwdWJsaWMta2V5LWluZm8uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandrLXRvLXBlbVxcc3JjXFxhc24xXFx2ZXJzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYXNuMVxccHJpdmF0ZS1rZXktaW5mby5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd2stdG8tcGVtXFxzcmNcXGVjLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xccnNhLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcandrLXRvLXBlbS5qcyIsICIuLlxcc3JjXFx1dGlsc1xcY29va2llcy50cyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxvcHRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxfdmlydHVhbFxccm9sbGRvd25fcnVudGltZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd3QtZGVjb2RlXFxidWlsZFxcZXNtXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxAb3Nsb2pzXFxlbmNvZGluZ1xcZGlzdFxcYmFzZTMyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXEBvc2xvanNcXGVuY29kaW5nXFxkaXN0XFxiYXNlNjQuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGVzaVxcYXV0aC5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxzY29wZXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGVudGl0eS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcY29sdW1uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxjb2x1bW4tYnVpbGRlci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdGFibGUudXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHRyYWNpbmctdXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHBnLWNvcmVcXHVuaXF1ZS1jb25zdHJhaW50LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxwZy1jb3JlXFxjb2x1bW5zXFxjb21tb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHBnLWNvcmVcXGNvbHVtbnNcXGVudW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHN1YnF1ZXJ5LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx2ZXJzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx0cmFjaW5nLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx2aWV3LWNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdGFibGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbFxcc3FsLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxhbGlhcy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxmb3JlaWduLWtleXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx1bmlxdWUtY29uc3RyYWludC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXGNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXGJsb2IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxjdXN0b20uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxpbnRlZ2VyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxcY29sdW1uc1xcbnVtZXJpYy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXHJlYWwuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFx0ZXh0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzZWxlY3Rpb24tcHJveHkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHF1ZXJ5LXByb21pc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxhbGwuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx0YWJsZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGluZGV4ZXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFxkZWxldGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGNhc2luZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcZXJyb3JzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxwZy1jb3JlXFx0YWJsZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxccGctY29yZVxccHJpbWFyeS1rZXlzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxcXGV4cHJlc3Npb25zXFxjb25kaXRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxcXGV4cHJlc3Npb25zXFxzZWxlY3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHJlbGF0aW9ucy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHZpZXctYmFzZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGRpYWxlY3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHF1ZXJ5LWJ1aWxkZXJzXFxxdWVyeS1idWlsZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxccXVlcnktYnVpbGRlcnNcXHNlbGVjdC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFxxdWVyeS1idWlsZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxccXVlcnktYnVpbGRlcnNcXGluc2VydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFx1cGRhdGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xcY291bnQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xccXVlcnkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xccmF3LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxcZGIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGNhY2hlXFxjb3JlXFxjYWNoZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHNlc3Npb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGxvZ2dlci5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZGJcXHNjaGVtYS5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZGJcXG1vZGVsc1xcdXNlci5tb2RlbC5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZGJcXG1vZGVsc1xccmVzdW1lLWNvbW1hbmQubW9kZWwuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGRiXFxtb2RlbHNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxidW4tc3FsaXRlXFxkcml2ZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGJ1bi1zcWxpdGVcXHNlc3Npb24uanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGRiXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZGJcXG1vZGVsc1xcY2hhcmFjdGVyLm1vZGVsLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxlc2lcXGZldGNoLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxlc2lcXGNoYXJhY3Rlci5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxjb3Jwb3JhdGlvbi5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxhbGxpYW5jZS5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxza2lsbHMuanMiLCAiLi5cXHNyY1xcYXBpXFxhdXRoXFxjYWxsYmFjay50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKiEgc2FmZS1idWZmZXIuIE1JVCBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuU2FmZUJ1ZmZlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEJ1ZmZlci5wcm90b3R5cGUpXG5cbi8vIENvcHkgc3RhdGljIG1ldGhvZHMgZnJvbSBCdWZmZXJcbmNvcHlQcm9wcyhCdWZmZXIsIFNhZmVCdWZmZXIpXG5cblNhZmVCdWZmZXIuZnJvbSA9IGZ1bmN0aW9uIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuU2FmZUJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgdmFyIGJ1ZiA9IEJ1ZmZlcihzaXplKVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuZmlsbChmaWxsKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBidWYuZmlsbCgwKVxuICB9XG4gIHJldHVybiBidWZcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKHNpemUpXG59XG5cblNhZmVCdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBidWZmZXIuU2xvd0J1ZmZlcihzaXplKVxufVxuIiwKICAgICIvKmdsb2JhbCBtb2R1bGUsIHByb2Nlc3MqL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbmZ1bmN0aW9uIERhdGFTdHJlYW0oZGF0YSkge1xuICB0aGlzLmJ1ZmZlciA9IG51bGw7XG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyBObyBpbnB1dFxuICBpZiAoIWRhdGEpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFN0cmVhbVxuICBpZiAodHlwZW9mIGRhdGEucGlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuICAgIGRhdGEucGlwZSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEJ1ZmZlciBvciBTdHJpbmdcbiAgLy8gb3IgT2JqZWN0IChhc3N1bWVkbHkgYSBwYXNzd29yZGVkIGtleSlcbiAgaWYgKGRhdGEubGVuZ3RoIHx8IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xuICAgIHRoaXMuYnVmZmVyID0gZGF0YTtcbiAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmVtaXQoJ2VuZCcsIGRhdGEpO1xuICAgICAgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5lbWl0KCdjbG9zZScpO1xuICAgIH0uYmluZCh0aGlzKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmV4cGVjdGVkIGRhdGEgdHlwZSAoJysgdHlwZW9mIGRhdGEgKyAnKScpO1xufVxudXRpbC5pbmhlcml0cyhEYXRhU3RyZWFtLCBTdHJlYW0pO1xuXG5EYXRhU3RyZWFtLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlKGRhdGEpIHtcbiAgdGhpcy5idWZmZXIgPSBCdWZmZXIuY29uY2F0KFt0aGlzLmJ1ZmZlciwgQnVmZmVyLmZyb20oZGF0YSldKTtcbiAgdGhpcy5lbWl0KCdkYXRhJywgZGF0YSk7XG59O1xuXG5EYXRhU3RyZWFtLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiBlbmQoZGF0YSkge1xuICBpZiAoZGF0YSlcbiAgICB0aGlzLndyaXRlKGRhdGEpO1xuICB0aGlzLmVtaXQoJ2VuZCcsIGRhdGEpO1xuICB0aGlzLmVtaXQoJ2Nsb3NlJyk7XG4gIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBEYXRhU3RyZWFtO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGdldFBhcmFtU2l6ZShrZXlTaXplKSB7XG5cdHZhciByZXN1bHQgPSAoKGtleVNpemUgLyA4KSB8IDApICsgKGtleVNpemUgJSA4ID09PSAwID8gMCA6IDEpO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG52YXIgcGFyYW1CeXRlc0ZvckFsZyA9IHtcblx0RVMyNTY6IGdldFBhcmFtU2l6ZSgyNTYpLFxuXHRFUzM4NDogZ2V0UGFyYW1TaXplKDM4NCksXG5cdEVTNTEyOiBnZXRQYXJhbVNpemUoNTIxKVxufTtcblxuZnVuY3Rpb24gZ2V0UGFyYW1CeXRlc0ZvckFsZyhhbGcpIHtcblx0dmFyIHBhcmFtQnl0ZXMgPSBwYXJhbUJ5dGVzRm9yQWxnW2FsZ107XG5cdGlmIChwYXJhbUJ5dGVzKSB7XG5cdFx0cmV0dXJuIHBhcmFtQnl0ZXM7XG5cdH1cblxuXHR0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gYWxnb3JpdGhtIFwiJyArIGFsZyArICdcIicpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFBhcmFtQnl0ZXNGb3JBbGc7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgZ2V0UGFyYW1CeXRlc0ZvckFsZyA9IHJlcXVpcmUoJy4vcGFyYW0tYnl0ZXMtZm9yLWFsZycpO1xuXG52YXIgTUFYX09DVEVUID0gMHg4MCxcblx0Q0xBU1NfVU5JVkVSU0FMID0gMCxcblx0UFJJTUlUSVZFX0JJVCA9IDB4MjAsXG5cdFRBR19TRVEgPSAweDEwLFxuXHRUQUdfSU5UID0gMHgwMixcblx0RU5DT0RFRF9UQUdfU0VRID0gKFRBR19TRVEgfCBQUklNSVRJVkVfQklUKSB8IChDTEFTU19VTklWRVJTQUwgPDwgNiksXG5cdEVOQ09ERURfVEFHX0lOVCA9IFRBR19JTlQgfCAoQ0xBU1NfVU5JVkVSU0FMIDw8IDYpO1xuXG5mdW5jdGlvbiBiYXNlNjRVcmwoYmFzZTY0KSB7XG5cdHJldHVybiBiYXNlNjRcblx0XHQucmVwbGFjZSgvPS9nLCAnJylcblx0XHQucmVwbGFjZSgvXFwrL2csICctJylcblx0XHQucmVwbGFjZSgvXFwvL2csICdfJyk7XG59XG5cbmZ1bmN0aW9uIHNpZ25hdHVyZUFzQnVmZmVyKHNpZ25hdHVyZSkge1xuXHRpZiAoQnVmZmVyLmlzQnVmZmVyKHNpZ25hdHVyZSkpIHtcblx0XHRyZXR1cm4gc2lnbmF0dXJlO1xuXHR9IGVsc2UgaWYgKCdzdHJpbmcnID09PSB0eXBlb2Ygc2lnbmF0dXJlKSB7XG5cdFx0cmV0dXJuIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSwgJ2Jhc2U2NCcpO1xuXHR9XG5cblx0dGhyb3cgbmV3IFR5cGVFcnJvcignRUNEU0Egc2lnbmF0dXJlIG11c3QgYmUgYSBCYXNlNjQgc3RyaW5nIG9yIGEgQnVmZmVyJyk7XG59XG5cbmZ1bmN0aW9uIGRlclRvSm9zZShzaWduYXR1cmUsIGFsZykge1xuXHRzaWduYXR1cmUgPSBzaWduYXR1cmVBc0J1ZmZlcihzaWduYXR1cmUpO1xuXHR2YXIgcGFyYW1CeXRlcyA9IGdldFBhcmFtQnl0ZXNGb3JBbGcoYWxnKTtcblxuXHQvLyB0aGUgREVSIGVuY29kZWQgcGFyYW0gc2hvdWxkIGF0IG1vc3QgYmUgdGhlIHBhcmFtIHNpemUsIHBsdXMgYSBwYWRkaW5nXG5cdC8vIHplcm8sIHNpbmNlIGR1ZSB0byBiZWluZyBhIHNpZ25lZCBpbnRlZ2VyXG5cdHZhciBtYXhFbmNvZGVkUGFyYW1MZW5ndGggPSBwYXJhbUJ5dGVzICsgMTtcblxuXHR2YXIgaW5wdXRMZW5ndGggPSBzaWduYXR1cmUubGVuZ3RoO1xuXG5cdHZhciBvZmZzZXQgPSAwO1xuXHRpZiAoc2lnbmF0dXJlW29mZnNldCsrXSAhPT0gRU5DT0RFRF9UQUdfU0VRKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBleHBlY3RlZCBcInNlcVwiJyk7XG5cdH1cblxuXHR2YXIgc2VxTGVuZ3RoID0gc2lnbmF0dXJlW29mZnNldCsrXTtcblx0aWYgKHNlcUxlbmd0aCA9PT0gKE1BWF9PQ1RFVCB8IDEpKSB7XG5cdFx0c2VxTGVuZ3RoID0gc2lnbmF0dXJlW29mZnNldCsrXTtcblx0fVxuXG5cdGlmIChpbnB1dExlbmd0aCAtIG9mZnNldCA8IHNlcUxlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJzZXFcIiBzcGVjaWZpZWQgbGVuZ3RoIG9mIFwiJyArIHNlcUxlbmd0aCArICdcIiwgb25seSBcIicgKyAoaW5wdXRMZW5ndGggLSBvZmZzZXQpICsgJ1wiIHJlbWFpbmluZycpO1xuXHR9XG5cblx0aWYgKHNpZ25hdHVyZVtvZmZzZXQrK10gIT09IEVOQ09ERURfVEFHX0lOVCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgZXhwZWN0ZWQgXCJpbnRcIiBmb3IgXCJyXCInKTtcblx0fVxuXG5cdHZhciByTGVuZ3RoID0gc2lnbmF0dXJlW29mZnNldCsrXTtcblxuXHRpZiAoaW5wdXRMZW5ndGggLSBvZmZzZXQgLSAyIDwgckxlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJyXCIgc3BlY2lmaWVkIGxlbmd0aCBvZiBcIicgKyByTGVuZ3RoICsgJ1wiLCBvbmx5IFwiJyArIChpbnB1dExlbmd0aCAtIG9mZnNldCAtIDIpICsgJ1wiIGF2YWlsYWJsZScpO1xuXHR9XG5cblx0aWYgKG1heEVuY29kZWRQYXJhbUxlbmd0aCA8IHJMZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1wiclwiIHNwZWNpZmllZCBsZW5ndGggb2YgXCInICsgckxlbmd0aCArICdcIiwgbWF4IG9mIFwiJyArIG1heEVuY29kZWRQYXJhbUxlbmd0aCArICdcIiBpcyBhY2NlcHRhYmxlJyk7XG5cdH1cblxuXHR2YXIgck9mZnNldCA9IG9mZnNldDtcblx0b2Zmc2V0ICs9IHJMZW5ndGg7XG5cblx0aWYgKHNpZ25hdHVyZVtvZmZzZXQrK10gIT09IEVOQ09ERURfVEFHX0lOVCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgZXhwZWN0ZWQgXCJpbnRcIiBmb3IgXCJzXCInKTtcblx0fVxuXG5cdHZhciBzTGVuZ3RoID0gc2lnbmF0dXJlW29mZnNldCsrXTtcblxuXHRpZiAoaW5wdXRMZW5ndGggLSBvZmZzZXQgIT09IHNMZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1wic1wiIHNwZWNpZmllZCBsZW5ndGggb2YgXCInICsgc0xlbmd0aCArICdcIiwgZXhwZWN0ZWQgXCInICsgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0KSArICdcIicpO1xuXHR9XG5cblx0aWYgKG1heEVuY29kZWRQYXJhbUxlbmd0aCA8IHNMZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1wic1wiIHNwZWNpZmllZCBsZW5ndGggb2YgXCInICsgc0xlbmd0aCArICdcIiwgbWF4IG9mIFwiJyArIG1heEVuY29kZWRQYXJhbUxlbmd0aCArICdcIiBpcyBhY2NlcHRhYmxlJyk7XG5cdH1cblxuXHR2YXIgc09mZnNldCA9IG9mZnNldDtcblx0b2Zmc2V0ICs9IHNMZW5ndGg7XG5cblx0aWYgKG9mZnNldCAhPT0gaW5wdXRMZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGNvbnN1bWUgZW50aXJlIGJ1ZmZlciwgYnV0IFwiJyArIChpbnB1dExlbmd0aCAtIG9mZnNldCkgKyAnXCIgYnl0ZXMgcmVtYWluJyk7XG5cdH1cblxuXHR2YXIgclBhZGRpbmcgPSBwYXJhbUJ5dGVzIC0gckxlbmd0aCxcblx0XHRzUGFkZGluZyA9IHBhcmFtQnl0ZXMgLSBzTGVuZ3RoO1xuXG5cdHZhciBkc3QgPSBCdWZmZXIuYWxsb2NVbnNhZmUoclBhZGRpbmcgKyByTGVuZ3RoICsgc1BhZGRpbmcgKyBzTGVuZ3RoKTtcblxuXHRmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IHJQYWRkaW5nOyArK29mZnNldCkge1xuXHRcdGRzdFtvZmZzZXRdID0gMDtcblx0fVxuXHRzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgck9mZnNldCArIE1hdGgubWF4KC1yUGFkZGluZywgMCksIHJPZmZzZXQgKyByTGVuZ3RoKTtcblxuXHRvZmZzZXQgPSBwYXJhbUJ5dGVzO1xuXG5cdGZvciAodmFyIG8gPSBvZmZzZXQ7IG9mZnNldCA8IG8gKyBzUGFkZGluZzsgKytvZmZzZXQpIHtcblx0XHRkc3Rbb2Zmc2V0XSA9IDA7XG5cdH1cblx0c2lnbmF0dXJlLmNvcHkoZHN0LCBvZmZzZXQsIHNPZmZzZXQgKyBNYXRoLm1heCgtc1BhZGRpbmcsIDApLCBzT2Zmc2V0ICsgc0xlbmd0aCk7XG5cblx0ZHN0ID0gZHN0LnRvU3RyaW5nKCdiYXNlNjQnKTtcblx0ZHN0ID0gYmFzZTY0VXJsKGRzdCk7XG5cblx0cmV0dXJuIGRzdDtcbn1cblxuZnVuY3Rpb24gY291bnRQYWRkaW5nKGJ1Ziwgc3RhcnQsIHN0b3ApIHtcblx0dmFyIHBhZGRpbmcgPSAwO1xuXHR3aGlsZSAoc3RhcnQgKyBwYWRkaW5nIDwgc3RvcCAmJiBidWZbc3RhcnQgKyBwYWRkaW5nXSA9PT0gMCkge1xuXHRcdCsrcGFkZGluZztcblx0fVxuXG5cdHZhciBuZWVkc1NpZ24gPSBidWZbc3RhcnQgKyBwYWRkaW5nXSA+PSBNQVhfT0NURVQ7XG5cdGlmIChuZWVkc1NpZ24pIHtcblx0XHQtLXBhZGRpbmc7XG5cdH1cblxuXHRyZXR1cm4gcGFkZGluZztcbn1cblxuZnVuY3Rpb24gam9zZVRvRGVyKHNpZ25hdHVyZSwgYWxnKSB7XG5cdHNpZ25hdHVyZSA9IHNpZ25hdHVyZUFzQnVmZmVyKHNpZ25hdHVyZSk7XG5cdHZhciBwYXJhbUJ5dGVzID0gZ2V0UGFyYW1CeXRlc0ZvckFsZyhhbGcpO1xuXG5cdHZhciBzaWduYXR1cmVCeXRlcyA9IHNpZ25hdHVyZS5sZW5ndGg7XG5cdGlmIChzaWduYXR1cmVCeXRlcyAhPT0gcGFyYW1CeXRlcyAqIDIpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdcIicgKyBhbGcgKyAnXCIgc2lnbmF0dXJlcyBtdXN0IGJlIFwiJyArIHBhcmFtQnl0ZXMgKiAyICsgJ1wiIGJ5dGVzLCBzYXcgXCInICsgc2lnbmF0dXJlQnl0ZXMgKyAnXCInKTtcblx0fVxuXG5cdHZhciByUGFkZGluZyA9IGNvdW50UGFkZGluZyhzaWduYXR1cmUsIDAsIHBhcmFtQnl0ZXMpO1xuXHR2YXIgc1BhZGRpbmcgPSBjb3VudFBhZGRpbmcoc2lnbmF0dXJlLCBwYXJhbUJ5dGVzLCBzaWduYXR1cmUubGVuZ3RoKTtcblx0dmFyIHJMZW5ndGggPSBwYXJhbUJ5dGVzIC0gclBhZGRpbmc7XG5cdHZhciBzTGVuZ3RoID0gcGFyYW1CeXRlcyAtIHNQYWRkaW5nO1xuXG5cdHZhciByc0J5dGVzID0gMSArIDEgKyByTGVuZ3RoICsgMSArIDEgKyBzTGVuZ3RoO1xuXG5cdHZhciBzaG9ydExlbmd0aCA9IHJzQnl0ZXMgPCBNQVhfT0NURVQ7XG5cblx0dmFyIGRzdCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgoc2hvcnRMZW5ndGggPyAyIDogMykgKyByc0J5dGVzKTtcblxuXHR2YXIgb2Zmc2V0ID0gMDtcblx0ZHN0W29mZnNldCsrXSA9IEVOQ09ERURfVEFHX1NFUTtcblx0aWYgKHNob3J0TGVuZ3RoKSB7XG5cdFx0Ly8gQml0IDggaGFzIHZhbHVlIFwiMFwiXG5cdFx0Ly8gYml0cyA3LTEgZ2l2ZSB0aGUgbGVuZ3RoLlxuXHRcdGRzdFtvZmZzZXQrK10gPSByc0J5dGVzO1xuXHR9IGVsc2Uge1xuXHRcdC8vIEJpdCA4IG9mIGZpcnN0IG9jdGV0IGhhcyB2YWx1ZSBcIjFcIlxuXHRcdC8vIGJpdHMgNy0xIGdpdmUgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGxlbmd0aCBvY3RldHMuXG5cdFx0ZHN0W29mZnNldCsrXSA9IE1BWF9PQ1RFVFx0fCAxO1xuXHRcdC8vIGxlbmd0aCwgYmFzZSAyNTZcblx0XHRkc3Rbb2Zmc2V0KytdID0gcnNCeXRlcyAmIDB4ZmY7XG5cdH1cblx0ZHN0W29mZnNldCsrXSA9IEVOQ09ERURfVEFHX0lOVDtcblx0ZHN0W29mZnNldCsrXSA9IHJMZW5ndGg7XG5cdGlmIChyUGFkZGluZyA8IDApIHtcblx0XHRkc3Rbb2Zmc2V0KytdID0gMDtcblx0XHRvZmZzZXQgKz0gc2lnbmF0dXJlLmNvcHkoZHN0LCBvZmZzZXQsIDAsIHBhcmFtQnl0ZXMpO1xuXHR9IGVsc2Uge1xuXHRcdG9mZnNldCArPSBzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgclBhZGRpbmcsIHBhcmFtQnl0ZXMpO1xuXHR9XG5cdGRzdFtvZmZzZXQrK10gPSBFTkNPREVEX1RBR19JTlQ7XG5cdGRzdFtvZmZzZXQrK10gPSBzTGVuZ3RoO1xuXHRpZiAoc1BhZGRpbmcgPCAwKSB7XG5cdFx0ZHN0W29mZnNldCsrXSA9IDA7XG5cdFx0c2lnbmF0dXJlLmNvcHkoZHN0LCBvZmZzZXQsIHBhcmFtQnl0ZXMpO1xuXHR9IGVsc2Uge1xuXHRcdHNpZ25hdHVyZS5jb3B5KGRzdCwgb2Zmc2V0LCBwYXJhbUJ5dGVzICsgc1BhZGRpbmcpO1xuXHR9XG5cblx0cmV0dXJuIGRzdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGRlclRvSm9zZTogZGVyVG9Kb3NlLFxuXHRqb3NlVG9EZXI6IGpvc2VUb0RlclxufTtcbiIsCiAgICAiLypqc2hpbnQgbm9kZTp0cnVlICovXG4ndXNlIHN0cmljdCc7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyOyAvLyBicm93c2VyaWZ5XG52YXIgU2xvd0J1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLlNsb3dCdWZmZXI7XG5cbm1vZHVsZS5leHBvcnRzID0gYnVmZmVyRXE7XG5cbmZ1bmN0aW9uIGJ1ZmZlckVxKGEsIGIpIHtcblxuICAvLyBzaG9ydGN1dHRpbmcgb24gdHlwZSBpcyBuZWNlc3NhcnkgZm9yIGNvcnJlY3RuZXNzXG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBidWZmZXIgc2l6ZXMgc2hvdWxkIGJlIHdlbGwta25vd24gaW5mb3JtYXRpb24sIHNvIGRlc3BpdGUgdGhpc1xuICAvLyBzaG9ydGN1dHRpbmcsIGl0IGRvZXNuJ3QgbGVhayBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlICpjb250ZW50cyogb2YgdGhlXG4gIC8vIGJ1ZmZlcnMuXG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgYyA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgIC8qanNoaW50IGJpdHdpc2U6ZmFsc2UgKi9cbiAgICBjIHw9IGFbaV0gXiBiW2ldOyAvLyBYT1JcbiAgfVxuICByZXR1cm4gYyA9PT0gMDtcbn1cblxuYnVmZmVyRXEuaW5zdGFsbCA9IGZ1bmN0aW9uKCkge1xuICBCdWZmZXIucHJvdG90eXBlLmVxdWFsID0gU2xvd0J1ZmZlci5wcm90b3R5cGUuZXF1YWwgPSBmdW5jdGlvbiBlcXVhbCh0aGF0KSB7XG4gICAgcmV0dXJuIGJ1ZmZlckVxKHRoaXMsIHRoYXQpO1xuICB9O1xufTtcblxudmFyIG9yaWdCdWZFcXVhbCA9IEJ1ZmZlci5wcm90b3R5cGUuZXF1YWw7XG52YXIgb3JpZ1Nsb3dCdWZFcXVhbCA9IFNsb3dCdWZmZXIucHJvdG90eXBlLmVxdWFsO1xuYnVmZmVyRXEucmVzdG9yZSA9IGZ1bmN0aW9uKCkge1xuICBCdWZmZXIucHJvdG90eXBlLmVxdWFsID0gb3JpZ0J1ZkVxdWFsO1xuICBTbG93QnVmZmVyLnByb3RvdHlwZS5lcXVhbCA9IG9yaWdTbG93QnVmRXF1YWw7XG59O1xuIiwKICAgICJ2YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG52YXIgZm9ybWF0RWNkc2EgPSByZXF1aXJlKCdlY2RzYS1zaWctZm9ybWF0dGVyJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxudmFyIE1TR19JTlZBTElEX0FMR09SSVRITSA9ICdcIiVzXCIgaXMgbm90IGEgdmFsaWQgYWxnb3JpdGhtLlxcbiAgU3VwcG9ydGVkIGFsZ29yaXRobXMgYXJlOlxcbiAgXCJIUzI1NlwiLCBcIkhTMzg0XCIsIFwiSFM1MTJcIiwgXCJSUzI1NlwiLCBcIlJTMzg0XCIsIFwiUlM1MTJcIiwgXCJQUzI1NlwiLCBcIlBTMzg0XCIsIFwiUFM1MTJcIiwgXCJFUzI1NlwiLCBcIkVTMzg0XCIsIFwiRVM1MTJcIiBhbmQgXCJub25lXCIuJ1xudmFyIE1TR19JTlZBTElEX1NFQ1JFVCA9ICdzZWNyZXQgbXVzdCBiZSBhIHN0cmluZyBvciBidWZmZXInO1xudmFyIE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSA9ICdrZXkgbXVzdCBiZSBhIHN0cmluZyBvciBhIGJ1ZmZlcic7XG52YXIgTVNHX0lOVkFMSURfU0lHTkVSX0tFWSA9ICdrZXkgbXVzdCBiZSBhIHN0cmluZywgYSBidWZmZXIgb3IgYW4gb2JqZWN0JztcblxudmFyIHN1cHBvcnRzS2V5T2JqZWN0cyA9IHR5cGVvZiBjcnlwdG8uY3JlYXRlUHVibGljS2V5ID09PSAnZnVuY3Rpb24nO1xuaWYgKHN1cHBvcnRzS2V5T2JqZWN0cykge1xuICBNU0dfSU5WQUxJRF9WRVJJRklFUl9LRVkgKz0gJyBvciBhIEtleU9iamVjdCc7XG4gIE1TR19JTlZBTElEX1NFQ1JFVCArPSAnb3IgYSBLZXlPYmplY3QnO1xufVxuXG5mdW5jdGlvbiBjaGVja0lzUHVibGljS2V5KGtleSkge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGtleSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXN1cHBvcnRzS2V5T2JqZWN0cykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9WRVJJRklFUl9LRVkpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleS50eXBlICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9WRVJJRklFUl9LRVkpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkuYXN5bW1ldHJpY0tleVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleS5leHBvcnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gY2hlY2tJc1ByaXZhdGVLZXkoa2V5KSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9TSUdORVJfS0VZKTtcbn07XG5cbmZ1bmN0aW9uIGNoZWNrSXNTZWNyZXRLZXkoa2V5KSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICBpZiAoIXN1cHBvcnRzS2V5T2JqZWN0cykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9TRUNSRVQpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1NFQ1JFVCk7XG4gIH1cblxuICBpZiAoa2V5LnR5cGUgIT09ICdzZWNyZXQnKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1NFQ1JFVCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleS5leHBvcnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfU0VDUkVUKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmcm9tQmFzZTY0KGJhc2U2NCkge1xuICByZXR1cm4gYmFzZTY0XG4gICAgLnJlcGxhY2UoLz0vZywgJycpXG4gICAgLnJlcGxhY2UoL1xcKy9nLCAnLScpXG4gICAgLnJlcGxhY2UoL1xcLy9nLCAnXycpO1xufVxuXG5mdW5jdGlvbiB0b0Jhc2U2NChiYXNlNjR1cmwpIHtcbiAgYmFzZTY0dXJsID0gYmFzZTY0dXJsLnRvU3RyaW5nKCk7XG5cbiAgdmFyIHBhZGRpbmcgPSA0IC0gYmFzZTY0dXJsLmxlbmd0aCAlIDQ7XG4gIGlmIChwYWRkaW5nICE9PSA0KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWRkaW5nOyArK2kpIHtcbiAgICAgIGJhc2U2NHVybCArPSAnPSc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhc2U2NHVybFxuICAgIC5yZXBsYWNlKC9cXC0vZywgJysnKVxuICAgIC5yZXBsYWNlKC9fL2csICcvJyk7XG59XG5cbmZ1bmN0aW9uIHR5cGVFcnJvcih0ZW1wbGF0ZSkge1xuICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgdmFyIGVyck1zZyA9IHV0aWwuZm9ybWF0LmJpbmQodXRpbCwgdGVtcGxhdGUpLmFwcGx5KG51bGwsIGFyZ3MpO1xuICByZXR1cm4gbmV3IFR5cGVFcnJvcihlcnJNc2cpO1xufVxuXG5mdW5jdGlvbiBidWZmZXJPclN0cmluZyhvYmopIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihvYmopIHx8IHR5cGVvZiBvYmogPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVJbnB1dCh0aGluZykge1xuICBpZiAoIWJ1ZmZlck9yU3RyaW5nKHRoaW5nKSlcbiAgICB0aGluZyA9IEpTT04uc3RyaW5naWZ5KHRoaW5nKTtcbiAgcmV0dXJuIHRoaW5nO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIbWFjU2lnbmVyKGJpdHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNpZ24odGhpbmcsIHNlY3JldCkge1xuICAgIGNoZWNrSXNTZWNyZXRLZXkoc2VjcmV0KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICB2YXIgaG1hYyA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGEnICsgYml0cywgc2VjcmV0KTtcbiAgICB2YXIgc2lnID0gKGhtYWMudXBkYXRlKHRoaW5nKSwgaG1hYy5kaWdlc3QoJ2Jhc2U2NCcpKVxuICAgIHJldHVybiBmcm9tQmFzZTY0KHNpZyk7XG4gIH1cbn1cblxudmFyIGJ1ZmZlckVxdWFsO1xudmFyIHRpbWluZ1NhZmVFcXVhbCA9ICd0aW1pbmdTYWZlRXF1YWwnIGluIGNyeXB0byA/IGZ1bmN0aW9uIHRpbWluZ1NhZmVFcXVhbChhLCBiKSB7XG4gIGlmIChhLmJ5dGVMZW5ndGggIT09IGIuYnl0ZUxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBjcnlwdG8udGltaW5nU2FmZUVxdWFsKGEsIGIpXG59IDogZnVuY3Rpb24gdGltaW5nU2FmZUVxdWFsKGEsIGIpIHtcbiAgaWYgKCFidWZmZXJFcXVhbCkge1xuICAgIGJ1ZmZlckVxdWFsID0gcmVxdWlyZSgnYnVmZmVyLWVxdWFsLWNvbnN0YW50LXRpbWUnKTtcbiAgfVxuXG4gIHJldHVybiBidWZmZXJFcXVhbChhLCBiKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVIbWFjVmVyaWZpZXIoYml0cykge1xuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KHRoaW5nLCBzaWduYXR1cmUsIHNlY3JldCkge1xuICAgIHZhciBjb21wdXRlZFNpZyA9IGNyZWF0ZUhtYWNTaWduZXIoYml0cykodGhpbmcsIHNlY3JldCk7XG4gICAgcmV0dXJuIHRpbWluZ1NhZmVFcXVhbChCdWZmZXIuZnJvbShzaWduYXR1cmUpLCBCdWZmZXIuZnJvbShjb21wdXRlZFNpZykpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleVNpZ25lcihiaXRzKSB7XG4gcmV0dXJuIGZ1bmN0aW9uIHNpZ24odGhpbmcsIHByaXZhdGVLZXkpIHtcbiAgICBjaGVja0lzUHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICAvLyBFdmVuIHRob3VnaCB3ZSBhcmUgc3BlY2lmeWluZyBcIlJTQVwiIGhlcmUsIHRoaXMgd29ya3Mgd2l0aCBFQ0RTQVxuICAgIC8vIGtleXMgYXMgd2VsbC5cbiAgICB2YXIgc2lnbmVyID0gY3J5cHRvLmNyZWF0ZVNpZ24oJ1JTQS1TSEEnICsgYml0cyk7XG4gICAgdmFyIHNpZyA9IChzaWduZXIudXBkYXRlKHRoaW5nKSwgc2lnbmVyLnNpZ24ocHJpdmF0ZUtleSwgJ2Jhc2U2NCcpKTtcbiAgICByZXR1cm4gZnJvbUJhc2U2NChzaWcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleVZlcmlmaWVyKGJpdHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZlcmlmeSh0aGluZywgc2lnbmF0dXJlLCBwdWJsaWNLZXkpIHtcbiAgICBjaGVja0lzUHVibGljS2V5KHB1YmxpY0tleSk7XG4gICAgdGhpbmcgPSBub3JtYWxpemVJbnB1dCh0aGluZyk7XG4gICAgc2lnbmF0dXJlID0gdG9CYXNlNjQoc2lnbmF0dXJlKTtcbiAgICB2YXIgdmVyaWZpZXIgPSBjcnlwdG8uY3JlYXRlVmVyaWZ5KCdSU0EtU0hBJyArIGJpdHMpO1xuICAgIHZlcmlmaWVyLnVwZGF0ZSh0aGluZyk7XG4gICAgcmV0dXJuIHZlcmlmaWVyLnZlcmlmeShwdWJsaWNLZXksIHNpZ25hdHVyZSwgJ2Jhc2U2NCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBTU0tleVNpZ25lcihiaXRzKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzaWduKHRoaW5nLCBwcml2YXRlS2V5KSB7XG4gICAgY2hlY2tJc1ByaXZhdGVLZXkocHJpdmF0ZUtleSk7XG4gICAgdGhpbmcgPSBub3JtYWxpemVJbnB1dCh0aGluZyk7XG4gICAgdmFyIHNpZ25lciA9IGNyeXB0by5jcmVhdGVTaWduKCdSU0EtU0hBJyArIGJpdHMpO1xuICAgIHZhciBzaWcgPSAoc2lnbmVyLnVwZGF0ZSh0aGluZyksIHNpZ25lci5zaWduKHtcbiAgICAgIGtleTogcHJpdmF0ZUtleSxcbiAgICAgIHBhZGRpbmc6IGNyeXB0by5jb25zdGFudHMuUlNBX1BLQ1MxX1BTU19QQURESU5HLFxuICAgICAgc2FsdExlbmd0aDogY3J5cHRvLmNvbnN0YW50cy5SU0FfUFNTX1NBTFRMRU5fRElHRVNUXG4gICAgfSwgJ2Jhc2U2NCcpKTtcbiAgICByZXR1cm4gZnJvbUJhc2U2NChzaWcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBTU0tleVZlcmlmaWVyKGJpdHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZlcmlmeSh0aGluZywgc2lnbmF0dXJlLCBwdWJsaWNLZXkpIHtcbiAgICBjaGVja0lzUHVibGljS2V5KHB1YmxpY0tleSk7XG4gICAgdGhpbmcgPSBub3JtYWxpemVJbnB1dCh0aGluZyk7XG4gICAgc2lnbmF0dXJlID0gdG9CYXNlNjQoc2lnbmF0dXJlKTtcbiAgICB2YXIgdmVyaWZpZXIgPSBjcnlwdG8uY3JlYXRlVmVyaWZ5KCdSU0EtU0hBJyArIGJpdHMpO1xuICAgIHZlcmlmaWVyLnVwZGF0ZSh0aGluZyk7XG4gICAgcmV0dXJuIHZlcmlmaWVyLnZlcmlmeSh7XG4gICAgICBrZXk6IHB1YmxpY0tleSxcbiAgICAgIHBhZGRpbmc6IGNyeXB0by5jb25zdGFudHMuUlNBX1BLQ1MxX1BTU19QQURESU5HLFxuICAgICAgc2FsdExlbmd0aDogY3J5cHRvLmNvbnN0YW50cy5SU0FfUFNTX1NBTFRMRU5fRElHRVNUXG4gICAgfSwgc2lnbmF0dXJlLCAnYmFzZTY0Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRUNEU0FTaWduZXIoYml0cykge1xuICB2YXIgaW5uZXIgPSBjcmVhdGVLZXlTaWduZXIoYml0cyk7XG4gIHJldHVybiBmdW5jdGlvbiBzaWduKCkge1xuICAgIHZhciBzaWduYXR1cmUgPSBpbm5lci5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIHNpZ25hdHVyZSA9IGZvcm1hdEVjZHNhLmRlclRvSm9zZShzaWduYXR1cmUsICdFUycgKyBiaXRzKTtcbiAgICByZXR1cm4gc2lnbmF0dXJlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVFQ0RTQVZlcmlmZXIoYml0cykge1xuICB2YXIgaW5uZXIgPSBjcmVhdGVLZXlWZXJpZmllcihiaXRzKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZlcmlmeSh0aGluZywgc2lnbmF0dXJlLCBwdWJsaWNLZXkpIHtcbiAgICBzaWduYXR1cmUgPSBmb3JtYXRFY2RzYS5qb3NlVG9EZXIoc2lnbmF0dXJlLCAnRVMnICsgYml0cykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIHZhciByZXN1bHQgPSBpbm5lcih0aGluZywgc2lnbmF0dXJlLCBwdWJsaWNLZXkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5vbmVTaWduZXIoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzaWduKCkge1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVOb25lVmVyaWZpZXIoKSB7XG4gIHJldHVybiBmdW5jdGlvbiB2ZXJpZnkodGhpbmcsIHNpZ25hdHVyZSkge1xuICAgIHJldHVybiBzaWduYXR1cmUgPT09ICcnO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gandhKGFsZ29yaXRobSkge1xuICB2YXIgc2lnbmVyRmFjdG9yaWVzID0ge1xuICAgIGhzOiBjcmVhdGVIbWFjU2lnbmVyLFxuICAgIHJzOiBjcmVhdGVLZXlTaWduZXIsXG4gICAgcHM6IGNyZWF0ZVBTU0tleVNpZ25lcixcbiAgICBlczogY3JlYXRlRUNEU0FTaWduZXIsXG4gICAgbm9uZTogY3JlYXRlTm9uZVNpZ25lcixcbiAgfVxuICB2YXIgdmVyaWZpZXJGYWN0b3JpZXMgPSB7XG4gICAgaHM6IGNyZWF0ZUhtYWNWZXJpZmllcixcbiAgICByczogY3JlYXRlS2V5VmVyaWZpZXIsXG4gICAgcHM6IGNyZWF0ZVBTU0tleVZlcmlmaWVyLFxuICAgIGVzOiBjcmVhdGVFQ0RTQVZlcmlmZXIsXG4gICAgbm9uZTogY3JlYXRlTm9uZVZlcmlmaWVyLFxuICB9XG4gIHZhciBtYXRjaCA9IGFsZ29yaXRobS5tYXRjaCgvXihSU3xQU3xFU3xIUykoMjU2fDM4NHw1MTIpJHxeKG5vbmUpJC9pKTtcbiAgaWYgKCFtYXRjaClcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfQUxHT1JJVEhNLCBhbGdvcml0aG0pO1xuICB2YXIgYWxnbyA9IChtYXRjaFsxXSB8fCBtYXRjaFszXSkudG9Mb3dlckNhc2UoKTtcbiAgdmFyIGJpdHMgPSBtYXRjaFsyXTtcblxuICByZXR1cm4ge1xuICAgIHNpZ246IHNpZ25lckZhY3Rvcmllc1thbGdvXShiaXRzKSxcbiAgICB2ZXJpZnk6IHZlcmlmaWVyRmFjdG9yaWVzW2FsZ29dKGJpdHMpLFxuICB9XG59O1xuIiwKICAgICIvKmdsb2JhbCBtb2R1bGUqL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0b1N0cmluZyhvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKVxuICAgIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyB8fCBCdWZmZXIuaXNCdWZmZXIob2JqKSlcbiAgICByZXR1cm4gb2JqLnRvU3RyaW5nKCk7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopO1xufTtcbiIsCiAgICAiLypnbG9iYWwgbW9kdWxlKi9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBEYXRhU3RyZWFtID0gcmVxdWlyZSgnLi9kYXRhLXN0cmVhbScpO1xudmFyIGp3YSA9IHJlcXVpcmUoJ2p3YScpO1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b3N0cmluZycpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbmZ1bmN0aW9uIGJhc2U2NHVybChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIHJldHVybiBCdWZmZXJcbiAgICAuZnJvbShzdHJpbmcsIGVuY29kaW5nKVxuICAgIC50b1N0cmluZygnYmFzZTY0JylcbiAgICAucmVwbGFjZSgvPS9nLCAnJylcbiAgICAucmVwbGFjZSgvXFwrL2csICctJylcbiAgICAucmVwbGFjZSgvXFwvL2csICdfJyk7XG59XG5cbmZ1bmN0aW9uIGp3c1NlY3VyZWRJbnB1dChoZWFkZXIsIHBheWxvYWQsIGVuY29kaW5nKSB7XG4gIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0ZjgnO1xuICB2YXIgZW5jb2RlZEhlYWRlciA9IGJhc2U2NHVybCh0b1N0cmluZyhoZWFkZXIpLCAnYmluYXJ5Jyk7XG4gIHZhciBlbmNvZGVkUGF5bG9hZCA9IGJhc2U2NHVybCh0b1N0cmluZyhwYXlsb2FkKSwgZW5jb2RpbmcpO1xuICByZXR1cm4gdXRpbC5mb3JtYXQoJyVzLiVzJywgZW5jb2RlZEhlYWRlciwgZW5jb2RlZFBheWxvYWQpO1xufVxuXG5mdW5jdGlvbiBqd3NTaWduKG9wdHMpIHtcbiAgdmFyIGhlYWRlciA9IG9wdHMuaGVhZGVyO1xuICB2YXIgcGF5bG9hZCA9IG9wdHMucGF5bG9hZDtcbiAgdmFyIHNlY3JldE9yS2V5ID0gb3B0cy5zZWNyZXQgfHwgb3B0cy5wcml2YXRlS2V5O1xuICB2YXIgZW5jb2RpbmcgPSBvcHRzLmVuY29kaW5nO1xuICB2YXIgYWxnbyA9IGp3YShoZWFkZXIuYWxnKTtcbiAgdmFyIHNlY3VyZWRJbnB1dCA9IGp3c1NlY3VyZWRJbnB1dChoZWFkZXIsIHBheWxvYWQsIGVuY29kaW5nKTtcbiAgdmFyIHNpZ25hdHVyZSA9IGFsZ28uc2lnbihzZWN1cmVkSW5wdXQsIHNlY3JldE9yS2V5KTtcbiAgcmV0dXJuIHV0aWwuZm9ybWF0KCclcy4lcycsIHNlY3VyZWRJbnB1dCwgc2lnbmF0dXJlKTtcbn1cblxuZnVuY3Rpb24gU2lnblN0cmVhbShvcHRzKSB7XG4gIHZhciBzZWNyZXQgPSBvcHRzLnNlY3JldHx8b3B0cy5wcml2YXRlS2V5fHxvcHRzLmtleTtcbiAgdmFyIHNlY3JldFN0cmVhbSA9IG5ldyBEYXRhU3RyZWFtKHNlY3JldCk7XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuICB0aGlzLmhlYWRlciA9IG9wdHMuaGVhZGVyO1xuICB0aGlzLmVuY29kaW5nID0gb3B0cy5lbmNvZGluZztcbiAgdGhpcy5zZWNyZXQgPSB0aGlzLnByaXZhdGVLZXkgPSB0aGlzLmtleSA9IHNlY3JldFN0cmVhbTtcbiAgdGhpcy5wYXlsb2FkID0gbmV3IERhdGFTdHJlYW0ob3B0cy5wYXlsb2FkKTtcbiAgdGhpcy5zZWNyZXQub25jZSgnY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLnBheWxvYWQud3JpdGFibGUgJiYgdGhpcy5yZWFkYWJsZSlcbiAgICAgIHRoaXMuc2lnbigpO1xuICB9LmJpbmQodGhpcykpO1xuXG4gIHRoaXMucGF5bG9hZC5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuc2VjcmV0LndyaXRhYmxlICYmIHRoaXMucmVhZGFibGUpXG4gICAgICB0aGlzLnNpZ24oKTtcbiAgfS5iaW5kKHRoaXMpKTtcbn1cbnV0aWwuaW5oZXJpdHMoU2lnblN0cmVhbSwgU3RyZWFtKTtcblxuU2lnblN0cmVhbS5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24oKSB7XG4gIHRyeSB7XG4gICAgdmFyIHNpZ25hdHVyZSA9IGp3c1NpZ24oe1xuICAgICAgaGVhZGVyOiB0aGlzLmhlYWRlcixcbiAgICAgIHBheWxvYWQ6IHRoaXMucGF5bG9hZC5idWZmZXIsXG4gICAgICBzZWNyZXQ6IHRoaXMuc2VjcmV0LmJ1ZmZlcixcbiAgICAgIGVuY29kaW5nOiB0aGlzLmVuY29kaW5nXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0KCdkb25lJywgc2lnbmF0dXJlKTtcbiAgICB0aGlzLmVtaXQoJ2RhdGEnLCBzaWduYXR1cmUpO1xuICAgIHRoaXMuZW1pdCgnZW5kJyk7XG4gICAgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHJldHVybiBzaWduYXR1cmU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGUpO1xuICAgIHRoaXMuZW1pdCgnY2xvc2UnKTtcbiAgfVxufTtcblxuU2lnblN0cmVhbS5zaWduID0gandzU2lnbjtcblxubW9kdWxlLmV4cG9ydHMgPSBTaWduU3RyZWFtO1xuIiwKICAgICIvKmdsb2JhbCBtb2R1bGUqL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIERhdGFTdHJlYW0gPSByZXF1aXJlKCcuL2RhdGEtc3RyZWFtJyk7XG52YXIgandhID0gcmVxdWlyZSgnandhJyk7XG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3Rvc3RyaW5nJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBKV1NfUkVHRVggPSAvXlthLXpBLVowLTlcXC1fXSs/XFwuW2EtekEtWjAtOVxcLV9dKz9cXC4oW2EtekEtWjAtOVxcLV9dKyk/JC87XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHRoaW5nKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpbmcpID09PSAnW29iamVjdCBPYmplY3RdJztcbn1cblxuZnVuY3Rpb24gc2FmZUpzb25QYXJzZSh0aGluZykge1xuICBpZiAoaXNPYmplY3QodGhpbmcpKVxuICAgIHJldHVybiB0aGluZztcbiAgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2UodGhpbmcpOyB9XG4gIGNhdGNoIChlKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbn1cblxuZnVuY3Rpb24gaGVhZGVyRnJvbUpXUyhqd3NTaWcpIHtcbiAgdmFyIGVuY29kZWRIZWFkZXIgPSBqd3NTaWcuc3BsaXQoJy4nLCAxKVswXTtcbiAgcmV0dXJuIHNhZmVKc29uUGFyc2UoQnVmZmVyLmZyb20oZW5jb2RlZEhlYWRlciwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdiaW5hcnknKSk7XG59XG5cbmZ1bmN0aW9uIHNlY3VyZWRJbnB1dEZyb21KV1MoandzU2lnKSB7XG4gIHJldHVybiBqd3NTaWcuc3BsaXQoJy4nLCAyKS5qb2luKCcuJyk7XG59XG5cbmZ1bmN0aW9uIHNpZ25hdHVyZUZyb21KV1MoandzU2lnKSB7XG4gIHJldHVybiBqd3NTaWcuc3BsaXQoJy4nKVsyXTtcbn1cblxuZnVuY3Rpb24gcGF5bG9hZEZyb21KV1MoandzU2lnLCBlbmNvZGluZykge1xuICBlbmNvZGluZyA9IGVuY29kaW5nIHx8ICd1dGY4JztcbiAgdmFyIHBheWxvYWQgPSBqd3NTaWcuc3BsaXQoJy4nKVsxXTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHBheWxvYWQsICdiYXNlNjQnKS50b1N0cmluZyhlbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRKd3Moc3RyaW5nKSB7XG4gIHJldHVybiBKV1NfUkVHRVgudGVzdChzdHJpbmcpICYmICEhaGVhZGVyRnJvbUpXUyhzdHJpbmcpO1xufVxuXG5mdW5jdGlvbiBqd3NWZXJpZnkoandzU2lnLCBhbGdvcml0aG0sIHNlY3JldE9yS2V5KSB7XG4gIGlmICghYWxnb3JpdGhtKSB7XG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIk1pc3NpbmcgYWxnb3JpdGhtIHBhcmFtZXRlciBmb3IgandzLnZlcmlmeVwiKTtcbiAgICBlcnIuY29kZSA9IFwiTUlTU0lOR19BTEdPUklUSE1cIjtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbiAgandzU2lnID0gdG9TdHJpbmcoandzU2lnKTtcbiAgdmFyIHNpZ25hdHVyZSA9IHNpZ25hdHVyZUZyb21KV1MoandzU2lnKTtcbiAgdmFyIHNlY3VyZWRJbnB1dCA9IHNlY3VyZWRJbnB1dEZyb21KV1MoandzU2lnKTtcbiAgdmFyIGFsZ28gPSBqd2EoYWxnb3JpdGhtKTtcbiAgcmV0dXJuIGFsZ28udmVyaWZ5KHNlY3VyZWRJbnB1dCwgc2lnbmF0dXJlLCBzZWNyZXRPcktleSk7XG59XG5cbmZ1bmN0aW9uIGp3c0RlY29kZShqd3NTaWcsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge307XG4gIGp3c1NpZyA9IHRvU3RyaW5nKGp3c1NpZyk7XG5cbiAgaWYgKCFpc1ZhbGlkSndzKGp3c1NpZykpXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgdmFyIGhlYWRlciA9IGhlYWRlckZyb21KV1MoandzU2lnKTtcblxuICBpZiAoIWhlYWRlcilcbiAgICByZXR1cm4gbnVsbDtcblxuICB2YXIgcGF5bG9hZCA9IHBheWxvYWRGcm9tSldTKGp3c1NpZyk7XG4gIGlmIChoZWFkZXIudHlwID09PSAnSldUJyB8fCBvcHRzLmpzb24pXG4gICAgcGF5bG9hZCA9IEpTT04ucGFyc2UocGF5bG9hZCwgb3B0cy5lbmNvZGluZyk7XG5cbiAgcmV0dXJuIHtcbiAgICBoZWFkZXI6IGhlYWRlcixcbiAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlRnJvbUpXUyhqd3NTaWcpXG4gIH07XG59XG5cbmZ1bmN0aW9uIFZlcmlmeVN0cmVhbShvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICB2YXIgc2VjcmV0T3JLZXkgPSBvcHRzLnNlY3JldHx8b3B0cy5wdWJsaWNLZXl8fG9wdHMua2V5O1xuICB2YXIgc2VjcmV0U3RyZWFtID0gbmV3IERhdGFTdHJlYW0oc2VjcmV0T3JLZXkpO1xuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgdGhpcy5hbGdvcml0aG0gPSBvcHRzLmFsZ29yaXRobTtcbiAgdGhpcy5lbmNvZGluZyA9IG9wdHMuZW5jb2Rpbmc7XG4gIHRoaXMuc2VjcmV0ID0gdGhpcy5wdWJsaWNLZXkgPSB0aGlzLmtleSA9IHNlY3JldFN0cmVhbTtcbiAgdGhpcy5zaWduYXR1cmUgPSBuZXcgRGF0YVN0cmVhbShvcHRzLnNpZ25hdHVyZSk7XG4gIHRoaXMuc2VjcmV0Lm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5zaWduYXR1cmUud3JpdGFibGUgJiYgdGhpcy5yZWFkYWJsZSlcbiAgICAgIHRoaXMudmVyaWZ5KCk7XG4gIH0uYmluZCh0aGlzKSk7XG5cbiAgdGhpcy5zaWduYXR1cmUub25jZSgnY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLnNlY3JldC53cml0YWJsZSAmJiB0aGlzLnJlYWRhYmxlKVxuICAgICAgdGhpcy52ZXJpZnkoKTtcbiAgfS5iaW5kKHRoaXMpKTtcbn1cbnV0aWwuaW5oZXJpdHMoVmVyaWZ5U3RyZWFtLCBTdHJlYW0pO1xuVmVyaWZ5U3RyZWFtLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHZhbGlkID0gandzVmVyaWZ5KHRoaXMuc2lnbmF0dXJlLmJ1ZmZlciwgdGhpcy5hbGdvcml0aG0sIHRoaXMua2V5LmJ1ZmZlcik7XG4gICAgdmFyIG9iaiA9IGp3c0RlY29kZSh0aGlzLnNpZ25hdHVyZS5idWZmZXIsIHRoaXMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW1pdCgnZG9uZScsIHZhbGlkLCBvYmopO1xuICAgIHRoaXMuZW1pdCgnZGF0YScsIHZhbGlkKTtcbiAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbiAgICByZXR1cm4gdmFsaWQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGUpO1xuICAgIHRoaXMuZW1pdCgnY2xvc2UnKTtcbiAgfVxufTtcblxuVmVyaWZ5U3RyZWFtLmRlY29kZSA9IGp3c0RlY29kZTtcblZlcmlmeVN0cmVhbS5pc1ZhbGlkID0gaXNWYWxpZEp3cztcblZlcmlmeVN0cmVhbS52ZXJpZnkgPSBqd3NWZXJpZnk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVyaWZ5U3RyZWFtO1xuIiwKICAgICIvKmdsb2JhbCBleHBvcnRzKi9cbnZhciBTaWduU3RyZWFtID0gcmVxdWlyZSgnLi9saWIvc2lnbi1zdHJlYW0nKTtcbnZhciBWZXJpZnlTdHJlYW0gPSByZXF1aXJlKCcuL2xpYi92ZXJpZnktc3RyZWFtJyk7XG5cbnZhciBBTEdPUklUSE1TID0gW1xuICAnSFMyNTYnLCAnSFMzODQnLCAnSFM1MTInLFxuICAnUlMyNTYnLCAnUlMzODQnLCAnUlM1MTInLFxuICAnUFMyNTYnLCAnUFMzODQnLCAnUFM1MTInLFxuICAnRVMyNTYnLCAnRVMzODQnLCAnRVM1MTInXG5dO1xuXG5leHBvcnRzLkFMR09SSVRITVMgPSBBTEdPUklUSE1TO1xuZXhwb3J0cy5zaWduID0gU2lnblN0cmVhbS5zaWduO1xuZXhwb3J0cy52ZXJpZnkgPSBWZXJpZnlTdHJlYW0udmVyaWZ5O1xuZXhwb3J0cy5kZWNvZGUgPSBWZXJpZnlTdHJlYW0uZGVjb2RlO1xuZXhwb3J0cy5pc1ZhbGlkID0gVmVyaWZ5U3RyZWFtLmlzVmFsaWQ7XG5leHBvcnRzLmNyZWF0ZVNpZ24gPSBmdW5jdGlvbiBjcmVhdGVTaWduKG9wdHMpIHtcbiAgcmV0dXJuIG5ldyBTaWduU3RyZWFtKG9wdHMpO1xufTtcbmV4cG9ydHMuY3JlYXRlVmVyaWZ5ID0gZnVuY3Rpb24gY3JlYXRlVmVyaWZ5KG9wdHMpIHtcbiAgcmV0dXJuIG5ldyBWZXJpZnlTdHJlYW0ob3B0cyk7XG59O1xuIiwKICAgICJ2YXIgandzID0gcmVxdWlyZSgnandzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGp3dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGRlY29kZWQgPSBqd3MuZGVjb2RlKGp3dCwgb3B0aW9ucyk7XG4gIGlmICghZGVjb2RlZCkgeyByZXR1cm4gbnVsbDsgfVxuICB2YXIgcGF5bG9hZCA9IGRlY29kZWQucGF5bG9hZDtcblxuICAvL3RyeSBwYXJzZSB0aGUgcGF5bG9hZFxuICBpZih0eXBlb2YgcGF5bG9hZCA9PT0gJ3N0cmluZycpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIG9iaiA9IEpTT04ucGFyc2UocGF5bG9hZCk7XG4gICAgICBpZihvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcGF5bG9hZCA9IG9iajtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IH1cbiAgfVxuXG4gIC8vcmV0dXJuIGhlYWRlciBpZiBgY29tcGxldGVgIG9wdGlvbiBpcyBlbmFibGVkLiAgaGVhZGVyIGluY2x1ZGVzIGNsYWltc1xuICAvL3N1Y2ggYXMgYGtpZGAgYW5kIGBhbGdgIHVzZWQgdG8gc2VsZWN0IHRoZSBrZXkgd2l0aGluIGEgSldLUyBuZWVkZWQgdG9cbiAgLy92ZXJpZnkgdGhlIHNpZ25hdHVyZVxuICBpZiAob3B0aW9ucy5jb21wbGV0ZSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB7XG4gICAgICBoZWFkZXI6IGRlY29kZWQuaGVhZGVyLFxuICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgIHNpZ25hdHVyZTogZGVjb2RlZC5zaWduYXR1cmVcbiAgICB9O1xuICB9XG4gIHJldHVybiBwYXlsb2FkO1xufTtcbiIsCiAgICAidmFyIEpzb25XZWJUb2tlbkVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UsIGVycm9yKSB7XG4gIEVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gIGlmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbiAgdGhpcy5uYW1lID0gJ0pzb25XZWJUb2tlbkVycm9yJztcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgaWYgKGVycm9yKSB0aGlzLmlubmVyID0gZXJyb3I7XG59O1xuXG5Kc29uV2ViVG9rZW5FcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5Kc29uV2ViVG9rZW5FcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBKc29uV2ViVG9rZW5FcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBKc29uV2ViVG9rZW5FcnJvcjtcbiIsCiAgICAidmFyIEpzb25XZWJUb2tlbkVycm9yID0gcmVxdWlyZSgnLi9Kc29uV2ViVG9rZW5FcnJvcicpO1xuXG52YXIgTm90QmVmb3JlRXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSwgZGF0ZSkge1xuICBKc29uV2ViVG9rZW5FcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UpO1xuICB0aGlzLm5hbWUgPSAnTm90QmVmb3JlRXJyb3InO1xuICB0aGlzLmRhdGUgPSBkYXRlO1xufTtcblxuTm90QmVmb3JlRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShKc29uV2ViVG9rZW5FcnJvci5wcm90b3R5cGUpO1xuXG5Ob3RCZWZvcmVFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBOb3RCZWZvcmVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBOb3RCZWZvcmVFcnJvcjsiLAogICAgInZhciBKc29uV2ViVG9rZW5FcnJvciA9IHJlcXVpcmUoJy4vSnNvbldlYlRva2VuRXJyb3InKTtcblxudmFyIFRva2VuRXhwaXJlZEVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UsIGV4cGlyZWRBdCkge1xuICBKc29uV2ViVG9rZW5FcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UpO1xuICB0aGlzLm5hbWUgPSAnVG9rZW5FeHBpcmVkRXJyb3InO1xuICB0aGlzLmV4cGlyZWRBdCA9IGV4cGlyZWRBdDtcbn07XG5cblRva2VuRXhwaXJlZEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSnNvbldlYlRva2VuRXJyb3IucHJvdG90eXBlKTtcblxuVG9rZW5FeHBpcmVkRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9rZW5FeHBpcmVkRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gVG9rZW5FeHBpcmVkRXJyb3I7IiwKICAgICIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHcgPSBkICogNztcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnd2Vla3MnOlxuICAgIGNhc2UgJ3dlZWsnOlxuICAgIGNhc2UgJ3cnOlxuICAgICAgcmV0dXJuIG4gKiB3O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICB9XG4gIHJldHVybiBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBuKSArICcgJyArIG5hbWUgKyAoaXNQbHVyYWwgPyAncycgOiAnJyk7XG59XG4iLAogICAgInZhciBtcyA9IHJlcXVpcmUoJ21zJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRpbWUsIGlhdCkge1xuICB2YXIgdGltZXN0YW1wID0gaWF0IHx8IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuXG4gIGlmICh0eXBlb2YgdGltZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gbXModGltZSk7XG4gICAgaWYgKHR5cGVvZiBtaWxsaXNlY29uZHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBNYXRoLmZsb29yKHRpbWVzdGFtcCArIG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB0aW1lID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB0aW1lc3RhbXAgKyB0aW1lO1xuICB9IGVsc2Uge1xuICAgIHJldHVybjtcbiAgfVxuXG59OyIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8vIE5vdGU6IHRoaXMgaXMgdGhlIHNlbXZlci5vcmcgdmVyc2lvbiBvZiB0aGUgc3BlYyB0aGF0IGl0IGltcGxlbWVudHNcbi8vIE5vdCBuZWNlc3NhcmlseSB0aGUgcGFja2FnZSB2ZXJzaW9uIG9mIHRoaXMgY29kZS5cbmNvbnN0IFNFTVZFUl9TUEVDX1ZFUlNJT04gPSAnMi4wLjAnXG5cbmNvbnN0IE1BWF9MRU5HVEggPSAyNTZcbmNvbnN0IE1BWF9TQUZFX0lOVEVHRVIgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fFxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gOTAwNzE5OTI1NDc0MDk5MVxuXG4vLyBNYXggc2FmZSBzZWdtZW50IGxlbmd0aCBmb3IgY29lcmNpb24uXG5jb25zdCBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIID0gMTZcblxuLy8gTWF4IHNhZmUgbGVuZ3RoIGZvciBhIGJ1aWxkIGlkZW50aWZpZXIuIFRoZSBtYXggbGVuZ3RoIG1pbnVzIDYgY2hhcmFjdGVycyBmb3Jcbi8vIHRoZSBzaG9ydGVzdCB2ZXJzaW9uIHdpdGggYSBidWlsZCAwLjAuMCtCVUlMRC5cbmNvbnN0IE1BWF9TQUZFX0JVSUxEX0xFTkdUSCA9IE1BWF9MRU5HVEggLSA2XG5cbmNvbnN0IFJFTEVBU0VfVFlQRVMgPSBbXG4gICdtYWpvcicsXG4gICdwcmVtYWpvcicsXG4gICdtaW5vcicsXG4gICdwcmVtaW5vcicsXG4gICdwYXRjaCcsXG4gICdwcmVwYXRjaCcsXG4gICdwcmVyZWxlYXNlJyxcbl1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE1BWF9MRU5HVEgsXG4gIE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEgsXG4gIE1BWF9TQUZFX0JVSUxEX0xFTkdUSCxcbiAgTUFYX1NBRkVfSU5URUdFUixcbiAgUkVMRUFTRV9UWVBFUyxcbiAgU0VNVkVSX1NQRUNfVkVSU0lPTixcbiAgRkxBR19JTkNMVURFX1BSRVJFTEVBU0U6IDBiMDAxLFxuICBGTEFHX0xPT1NFOiAwYjAxMCxcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGRlYnVnID0gKFxuICB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgcHJvY2Vzcy5lbnYgJiZcbiAgcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyAmJlxuICAvXFxic2VtdmVyXFxiL2kudGVzdChwcm9jZXNzLmVudi5OT0RFX0RFQlVHKVxuKSA/ICguLi5hcmdzKSA9PiBjb25zb2xlLmVycm9yKCdTRU1WRVInLCAuLi5hcmdzKVxuICA6ICgpID0+IHt9XG5cbm1vZHVsZS5leHBvcnRzID0gZGVidWdcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCxcbiAgTUFYX1NBRkVfQlVJTERfTEVOR1RILFxuICBNQVhfTEVOR1RILFxufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi9kZWJ1ZycpXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB7fVxuXG4vLyBUaGUgYWN0dWFsIHJlZ2V4cHMgZ28gb24gZXhwb3J0cy5yZVxuY29uc3QgcmUgPSBleHBvcnRzLnJlID0gW11cbmNvbnN0IHNhZmVSZSA9IGV4cG9ydHMuc2FmZVJlID0gW11cbmNvbnN0IHNyYyA9IGV4cG9ydHMuc3JjID0gW11cbmNvbnN0IHNhZmVTcmMgPSBleHBvcnRzLnNhZmVTcmMgPSBbXVxuY29uc3QgdCA9IGV4cG9ydHMudCA9IHt9XG5sZXQgUiA9IDBcblxuY29uc3QgTEVUVEVSREFTSE5VTUJFUiA9ICdbYS16QS1aMC05LV0nXG5cbi8vIFJlcGxhY2Ugc29tZSBncmVlZHkgcmVnZXggdG9rZW5zIHRvIHByZXZlbnQgcmVnZXggZG9zIGlzc3Vlcy4gVGhlc2UgcmVnZXggYXJlXG4vLyB1c2VkIGludGVybmFsbHkgdmlhIHRoZSBzYWZlUmUgb2JqZWN0IHNpbmNlIGFsbCBpbnB1dHMgaW4gdGhpcyBsaWJyYXJ5IGdldFxuLy8gbm9ybWFsaXplZCBmaXJzdCB0byB0cmltIGFuZCBjb2xsYXBzZSBhbGwgZXh0cmEgd2hpdGVzcGFjZS4gVGhlIG9yaWdpbmFsXG4vLyByZWdleGVzIGFyZSBleHBvcnRlZCBmb3IgdXNlcmxhbmQgY29uc3VtcHRpb24gYW5kIGxvd2VyIGxldmVsIHVzYWdlLiBBXG4vLyBmdXR1cmUgYnJlYWtpbmcgY2hhbmdlIGNvdWxkIGV4cG9ydCB0aGUgc2FmZXIgcmVnZXggb25seSB3aXRoIGEgbm90ZSB0aGF0XG4vLyBhbGwgaW5wdXQgc2hvdWxkIGhhdmUgZXh0cmEgd2hpdGVzcGFjZSByZW1vdmVkLlxuY29uc3Qgc2FmZVJlZ2V4UmVwbGFjZW1lbnRzID0gW1xuICBbJ1xcXFxzJywgMV0sXG4gIFsnXFxcXGQnLCBNQVhfTEVOR1RIXSxcbiAgW0xFVFRFUkRBU0hOVU1CRVIsIE1BWF9TQUZFX0JVSUxEX0xFTkdUSF0sXG5dXG5cbmNvbnN0IG1ha2VTYWZlUmVnZXggPSAodmFsdWUpID0+IHtcbiAgZm9yIChjb25zdCBbdG9rZW4sIG1heF0gb2Ygc2FmZVJlZ2V4UmVwbGFjZW1lbnRzKSB7XG4gICAgdmFsdWUgPSB2YWx1ZVxuICAgICAgLnNwbGl0KGAke3Rva2VufSpgKS5qb2luKGAke3Rva2VufXswLCR7bWF4fX1gKVxuICAgICAgLnNwbGl0KGAke3Rva2VufStgKS5qb2luKGAke3Rva2VufXsxLCR7bWF4fX1gKVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG5jb25zdCBjcmVhdGVUb2tlbiA9IChuYW1lLCB2YWx1ZSwgaXNHbG9iYWwpID0+IHtcbiAgY29uc3Qgc2FmZSA9IG1ha2VTYWZlUmVnZXgodmFsdWUpXG4gIGNvbnN0IGluZGV4ID0gUisrXG4gIGRlYnVnKG5hbWUsIGluZGV4LCB2YWx1ZSlcbiAgdFtuYW1lXSA9IGluZGV4XG4gIHNyY1tpbmRleF0gPSB2YWx1ZVxuICBzYWZlU3JjW2luZGV4XSA9IHNhZmVcbiAgcmVbaW5kZXhdID0gbmV3IFJlZ0V4cCh2YWx1ZSwgaXNHbG9iYWwgPyAnZycgOiB1bmRlZmluZWQpXG4gIHNhZmVSZVtpbmRleF0gPSBuZXcgUmVnRXhwKHNhZmUsIGlzR2xvYmFsID8gJ2cnIDogdW5kZWZpbmVkKVxufVxuXG4vLyBUaGUgZm9sbG93aW5nIFJlZ3VsYXIgRXhwcmVzc2lvbnMgY2FuIGJlIHVzZWQgZm9yIHRva2VuaXppbmcsXG4vLyB2YWxpZGF0aW5nLCBhbmQgcGFyc2luZyBTZW1WZXIgdmVyc2lvbiBzdHJpbmdzLlxuXG4vLyAjIyBOdW1lcmljIElkZW50aWZpZXJcbi8vIEEgc2luZ2xlIGAwYCwgb3IgYSBub24temVybyBkaWdpdCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgZGlnaXRzLlxuXG5jcmVhdGVUb2tlbignTlVNRVJJQ0lERU5USUZJRVInLCAnMHxbMS05XVxcXFxkKicpXG5jcmVhdGVUb2tlbignTlVNRVJJQ0lERU5USUZJRVJMT09TRScsICdcXFxcZCsnKVxuXG4vLyAjIyBOb24tbnVtZXJpYyBJZGVudGlmaWVyXG4vLyBaZXJvIG9yIG1vcmUgZGlnaXRzLCBmb2xsb3dlZCBieSBhIGxldHRlciBvciBoeXBoZW4sIGFuZCB0aGVuIHplcm8gb3Jcbi8vIG1vcmUgbGV0dGVycywgZGlnaXRzLCBvciBoeXBoZW5zLlxuXG5jcmVhdGVUb2tlbignTk9OTlVNRVJJQ0lERU5USUZJRVInLCBgXFxcXGQqW2EtekEtWi1dJHtMRVRURVJEQVNITlVNQkVSfSpgKVxuXG4vLyAjIyBNYWluIFZlcnNpb25cbi8vIFRocmVlIGRvdC1zZXBhcmF0ZWQgbnVtZXJpYyBpZGVudGlmaWVycy5cblxuY3JlYXRlVG9rZW4oJ01BSU5WRVJTSU9OJywgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KWApXG5cbmNyZWF0ZVRva2VuKCdNQUlOVkVSU0lPTkxPT1NFJywgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlgKVxuXG4vLyAjIyBQcmUtcmVsZWFzZSBWZXJzaW9uIElkZW50aWZpZXJcbi8vIEEgbnVtZXJpYyBpZGVudGlmaWVyLCBvciBhIG5vbi1udW1lcmljIGlkZW50aWZpZXIuXG4vLyBOb24tbnVtYmVyaWMgaWRlbnRpZmllcnMgaW5jbHVkZSBudW1iZXJpYyBpZGVudGlmaWVycyBidXQgY2FuIGJlIGxvbmdlci5cbi8vIFRoZXJlZm9yZSBub24tbnVtYmVyaWMgaWRlbnRpZmllcnMgbXVzdCBnbyBmaXJzdC5cblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VJREVOVElGSUVSJywgYCg/OiR7c3JjW3QuTk9OTlVNRVJJQ0lERU5USUZJRVJdXG59fCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlgKVxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRScsIGAoPzoke3NyY1t0Lk5PTk5VTUVSSUNJREVOVElGSUVSXVxufXwke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlgKVxuXG4vLyAjIyBQcmUtcmVsZWFzZSBWZXJzaW9uXG4vLyBIeXBoZW4sIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGRvdC1zZXBhcmF0ZWQgcHJlLXJlbGVhc2UgdmVyc2lvblxuLy8gaWRlbnRpZmllcnMuXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFJywgYCg/Oi0oJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUl1cbn0oPzpcXFxcLiR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJdfSkqKSlgKVxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRUxPT1NFJywgYCg/Oi0/KCR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRV1cbn0oPzpcXFxcLiR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRV19KSopKWApXG5cbi8vICMjIEJ1aWxkIE1ldGFkYXRhIElkZW50aWZpZXJcbi8vIEFueSBjb21iaW5hdGlvbiBvZiBkaWdpdHMsIGxldHRlcnMsIG9yIGh5cGhlbnMuXG5cbmNyZWF0ZVRva2VuKCdCVUlMRElERU5USUZJRVInLCBgJHtMRVRURVJEQVNITlVNQkVSfStgKVxuXG4vLyAjIyBCdWlsZCBNZXRhZGF0YVxuLy8gUGx1cyBzaWduLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwZXJpb2Qtc2VwYXJhdGVkIGJ1aWxkIG1ldGFkYXRhXG4vLyBpZGVudGlmaWVycy5cblxuY3JlYXRlVG9rZW4oJ0JVSUxEJywgYCg/OlxcXFwrKCR7c3JjW3QuQlVJTERJREVOVElGSUVSXVxufSg/OlxcXFwuJHtzcmNbdC5CVUlMRElERU5USUZJRVJdfSkqKSlgKVxuXG4vLyAjIyBGdWxsIFZlcnNpb24gU3RyaW5nXG4vLyBBIG1haW4gdmVyc2lvbiwgZm9sbG93ZWQgb3B0aW9uYWxseSBieSBhIHByZS1yZWxlYXNlIHZlcnNpb24gYW5kXG4vLyBidWlsZCBtZXRhZGF0YS5cblxuLy8gTm90ZSB0aGF0IHRoZSBvbmx5IG1ham9yLCBtaW5vciwgcGF0Y2gsIGFuZCBwcmUtcmVsZWFzZSBzZWN0aW9ucyBvZlxuLy8gdGhlIHZlcnNpb24gc3RyaW5nIGFyZSBjYXB0dXJpbmcgZ3JvdXBzLiAgVGhlIGJ1aWxkIG1ldGFkYXRhIGlzIG5vdCBhXG4vLyBjYXB0dXJpbmcgZ3JvdXAsIGJlY2F1c2UgaXQgc2hvdWxkIG5vdCBldmVyIGJlIHVzZWQgaW4gdmVyc2lvblxuLy8gY29tcGFyaXNvbi5cblxuY3JlYXRlVG9rZW4oJ0ZVTExQTEFJTicsIGB2PyR7c3JjW3QuTUFJTlZFUlNJT05dXG59JHtzcmNbdC5QUkVSRUxFQVNFXX0/JHtcbiAgc3JjW3QuQlVJTERdfT9gKVxuXG5jcmVhdGVUb2tlbignRlVMTCcsIGBeJHtzcmNbdC5GVUxMUExBSU5dfSRgKVxuXG4vLyBsaWtlIGZ1bGwsIGJ1dCBhbGxvd3MgdjEuMi4zIGFuZCA9MS4yLjMsIHdoaWNoIHBlb3BsZSBkbyBzb21ldGltZXMuXG4vLyBhbHNvLCAxLjAuMGFscGhhMSAocHJlcmVsZWFzZSB3aXRob3V0IHRoZSBoeXBoZW4pIHdoaWNoIGlzIHByZXR0eVxuLy8gY29tbW9uIGluIHRoZSBucG0gcmVnaXN0cnkuXG5jcmVhdGVUb2tlbignTE9PU0VQTEFJTicsIGBbdj1cXFxcc10qJHtzcmNbdC5NQUlOVkVSU0lPTkxPT1NFXVxufSR7c3JjW3QuUFJFUkVMRUFTRUxPT1NFXX0/JHtcbiAgc3JjW3QuQlVJTERdfT9gKVxuXG5jcmVhdGVUb2tlbignTE9PU0UnLCBgXiR7c3JjW3QuTE9PU0VQTEFJTl19JGApXG5cbmNyZWF0ZVRva2VuKCdHVExUJywgJygoPzo8fD4pPz0/KScpXG5cbi8vIFNvbWV0aGluZyBsaWtlIFwiMi4qXCIgb3IgXCIxLjIueFwiLlxuLy8gTm90ZSB0aGF0IFwieC54XCIgaXMgYSB2YWxpZCB4UmFuZ2UgaWRlbnRpZmVyLCBtZWFuaW5nIFwiYW55IHZlcnNpb25cIlxuLy8gT25seSB0aGUgZmlyc3QgaXRlbSBpcyBzdHJpY3RseSByZXF1aXJlZC5cbmNyZWF0ZVRva2VuKCdYUkFOR0VJREVOVElGSUVSTE9PU0UnLCBgJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX18eHxYfFxcXFwqYClcbmNyZWF0ZVRva2VuKCdYUkFOR0VJREVOVElGSUVSJywgYCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfXx4fFh8XFxcXCpgKVxuXG5jcmVhdGVUb2tlbignWFJBTkdFUExBSU4nLCBgW3Y9XFxcXHNdKigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJdfSlgICtcbiAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VdfSk/JHtcbiAgICAgICAgICAgICAgICAgICAgIHNyY1t0LkJVSUxEXX0/YCArXG4gICAgICAgICAgICAgICAgICAgYCk/KT9gKVxuXG5jcmVhdGVUb2tlbignWFJBTkdFUExBSU5MT09TRScsIGBbdj1cXFxcc10qKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuUFJFUkVMRUFTRUxPT1NFXX0pPyR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1t0LkJVSUxEXX0/YCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKT8pP2ApXG5cbmNyZWF0ZVRva2VuKCdYUkFOR0UnLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqJHtzcmNbdC5YUkFOR0VQTEFJTl19JGApXG5jcmVhdGVUb2tlbignWFJBTkdFTE9PU0UnLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqJHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0kYClcblxuLy8gQ29lcmNpb24uXG4vLyBFeHRyYWN0IGFueXRoaW5nIHRoYXQgY291bGQgY29uY2VpdmFibHkgYmUgYSBwYXJ0IG9mIGEgdmFsaWQgc2VtdmVyXG5jcmVhdGVUb2tlbignQ09FUkNFUExBSU4nLCBgJHsnKF58W15cXFxcZF0pJyArXG4gICAgICAgICAgICAgICcoXFxcXGR7MSwnfSR7TUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSH19KWAgK1xuICAgICAgICAgICAgICBgKD86XFxcXC4oXFxcXGR7MSwke01BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEh9fSkpP2AgK1xuICAgICAgICAgICAgICBgKD86XFxcXC4oXFxcXGR7MSwke01BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEh9fSkpP2ApXG5jcmVhdGVUb2tlbignQ09FUkNFJywgYCR7c3JjW3QuQ09FUkNFUExBSU5dfSg/OiR8W15cXFxcZF0pYClcbmNyZWF0ZVRva2VuKCdDT0VSQ0VGVUxMJywgc3JjW3QuQ09FUkNFUExBSU5dICtcbiAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuUFJFUkVMRUFTRV19KT9gICtcbiAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuQlVJTERdfSk/YCArXG4gICAgICAgICAgICAgIGAoPzokfFteXFxcXGRdKWApXG5jcmVhdGVUb2tlbignQ09FUkNFUlRMJywgc3JjW3QuQ09FUkNFXSwgdHJ1ZSlcbmNyZWF0ZVRva2VuKCdDT0VSQ0VSVExGVUxMJywgc3JjW3QuQ09FUkNFRlVMTF0sIHRydWUpXG5cbi8vIFRpbGRlIHJhbmdlcy5cbi8vIE1lYW5pbmcgaXMgXCJyZWFzb25hYmx5IGF0IG9yIGdyZWF0ZXIgdGhhblwiXG5jcmVhdGVUb2tlbignTE9ORVRJTERFJywgJyg/On4+PyknKVxuXG5jcmVhdGVUb2tlbignVElMREVUUklNJywgYChcXFxccyopJHtzcmNbdC5MT05FVElMREVdfVxcXFxzK2AsIHRydWUpXG5leHBvcnRzLnRpbGRlVHJpbVJlcGxhY2UgPSAnJDF+J1xuXG5jcmVhdGVUb2tlbignVElMREUnLCBgXiR7c3JjW3QuTE9ORVRJTERFXX0ke3NyY1t0LlhSQU5HRVBMQUlOXX0kYClcbmNyZWF0ZVRva2VuKCdUSUxERUxPT1NFJywgYF4ke3NyY1t0LkxPTkVUSUxERV19JHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0kYClcblxuLy8gQ2FyZXQgcmFuZ2VzLlxuLy8gTWVhbmluZyBpcyBcImF0IGxlYXN0IGFuZCBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoXCJcbmNyZWF0ZVRva2VuKCdMT05FQ0FSRVQnLCAnKD86XFxcXF4pJylcblxuY3JlYXRlVG9rZW4oJ0NBUkVUVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuTE9ORUNBUkVUXX1cXFxccytgLCB0cnVlKVxuZXhwb3J0cy5jYXJldFRyaW1SZXBsYWNlID0gJyQxXidcblxuY3JlYXRlVG9rZW4oJ0NBUkVUJywgYF4ke3NyY1t0LkxPTkVDQVJFVF19JHtzcmNbdC5YUkFOR0VQTEFJTl19JGApXG5jcmVhdGVUb2tlbignQ0FSRVRMT09TRScsIGBeJHtzcmNbdC5MT05FQ0FSRVRdfSR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIEEgc2ltcGxlIGd0L2x0L2VxIHRoaW5nLCBvciBqdXN0IFwiXCIgdG8gaW5kaWNhdGUgXCJhbnkgdmVyc2lvblwiXG5jcmVhdGVUb2tlbignQ09NUEFSQVRPUkxPT1NFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKigke3NyY1t0LkxPT1NFUExBSU5dfSkkfF4kYClcbmNyZWF0ZVRva2VuKCdDT01QQVJBVE9SJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKigke3NyY1t0LkZVTExQTEFJTl19KSR8XiRgKVxuXG4vLyBBbiBleHByZXNzaW9uIHRvIHN0cmlwIGFueSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlIGd0bHQgYW5kIHRoZSB0aGluZ1xuLy8gaXQgbW9kaWZpZXMsIHNvIHRoYXQgYD4gMS4yLjNgID09PiBgPjEuMi4zYFxuY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1JUUklNJywgYChcXFxccyopJHtzcmNbdC5HVExUXVxufVxcXFxzKigke3NyY1t0LkxPT1NFUExBSU5dfXwke3NyY1t0LlhSQU5HRVBMQUlOXX0pYCwgdHJ1ZSlcbmV4cG9ydHMuY29tcGFyYXRvclRyaW1SZXBsYWNlID0gJyQxJDIkMydcblxuLy8gU29tZXRoaW5nIGxpa2UgYDEuMi4zIC0gMS4yLjRgXG4vLyBOb3RlIHRoYXQgdGhlc2UgYWxsIHVzZSB0aGUgbG9vc2UgZm9ybSwgYmVjYXVzZSB0aGV5J2xsIGJlXG4vLyBjaGVja2VkIGFnYWluc3QgZWl0aGVyIHRoZSBzdHJpY3Qgb3IgbG9vc2UgY29tcGFyYXRvciBmb3JtXG4vLyBsYXRlci5cbmNyZWF0ZVRva2VuKCdIWVBIRU5SQU5HRScsIGBeXFxcXHMqKCR7c3JjW3QuWFJBTkdFUExBSU5dfSlgICtcbiAgICAgICAgICAgICAgICAgICBgXFxcXHMrLVxcXFxzK2AgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5YUkFOR0VQTEFJTl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGBcXFxccyokYClcblxuY3JlYXRlVG9rZW4oJ0hZUEhFTlJBTkdFTE9PU0UnLCBgXlxcXFxzKigke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBcXFxccystXFxcXHMrYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYFxcXFxzKiRgKVxuXG4vLyBTdGFyIHJhbmdlcyBiYXNpY2FsbHkganVzdCBhbGxvdyBhbnl0aGluZyBhdCBhbGwuXG5jcmVhdGVUb2tlbignU1RBUicsICcoPHw+KT89P1xcXFxzKlxcXFwqJylcbi8vID49MC4wLjAgaXMgbGlrZSBhIHN0YXJcbmNyZWF0ZVRva2VuKCdHVEUwJywgJ15cXFxccyo+PVxcXFxzKjBcXFxcLjBcXFxcLjBcXFxccyokJylcbmNyZWF0ZVRva2VuKCdHVEUwUFJFJywgJ15cXFxccyo+PVxcXFxzKjBcXFxcLjBcXFxcLjAtMFxcXFxzKiQnKVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuLy8gcGFyc2Ugb3V0IGp1c3QgdGhlIG9wdGlvbnMgd2UgY2FyZSBhYm91dFxuY29uc3QgbG9vc2VPcHRpb24gPSBPYmplY3QuZnJlZXplKHsgbG9vc2U6IHRydWUgfSlcbmNvbnN0IGVtcHR5T3B0cyA9IE9iamVjdC5mcmVlemUoeyB9KVxuY29uc3QgcGFyc2VPcHRpb25zID0gb3B0aW9ucyA9PiB7XG4gIGlmICghb3B0aW9ucykge1xuICAgIHJldHVybiBlbXB0eU9wdHNcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbG9vc2VPcHRpb25cbiAgfVxuXG4gIHJldHVybiBvcHRpb25zXG59XG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlT3B0aW9uc1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgbnVtZXJpYyA9IC9eWzAtOV0rJC9cbmNvbnN0IGNvbXBhcmVJZGVudGlmaWVycyA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IGFudW0gPSBudW1lcmljLnRlc3QoYSlcbiAgY29uc3QgYm51bSA9IG51bWVyaWMudGVzdChiKVxuXG4gIGlmIChhbnVtICYmIGJudW0pIHtcbiAgICBhID0gK2FcbiAgICBiID0gK2JcbiAgfVxuXG4gIHJldHVybiBhID09PSBiID8gMFxuICAgIDogKGFudW0gJiYgIWJudW0pID8gLTFcbiAgICA6IChibnVtICYmICFhbnVtKSA/IDFcbiAgICA6IGEgPCBiID8gLTFcbiAgICA6IDFcbn1cblxuY29uc3QgcmNvbXBhcmVJZGVudGlmaWVycyA9IChhLCBiKSA9PiBjb21wYXJlSWRlbnRpZmllcnMoYiwgYSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbXBhcmVJZGVudGlmaWVycyxcbiAgcmNvbXBhcmVJZGVudGlmaWVycyxcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvZGVidWcnKVxuY29uc3QgeyBNQVhfTEVOR1RILCBNQVhfU0FGRV9JTlRFR0VSIH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9jb25zdGFudHMnKVxuY29uc3QgeyBzYWZlUmU6IHJlLCB0IH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZScpXG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3BhcnNlLW9wdGlvbnMnKVxuY29uc3QgeyBjb21wYXJlSWRlbnRpZmllcnMgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lkZW50aWZpZXJzJylcbmNsYXNzIFNlbVZlciB7XG4gIGNvbnN0cnVjdG9yICh2ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICAgIGlmICh2ZXJzaW9uLmxvb3NlID09PSAhIW9wdGlvbnMubG9vc2UgJiZcbiAgICAgICAgdmVyc2lvbi5pbmNsdWRlUHJlcmVsZWFzZSA9PT0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi52ZXJzaW9uXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgdmVyc2lvbi4gTXVzdCBiZSBhIHN0cmluZy4gR290IHR5cGUgXCIke3R5cGVvZiB2ZXJzaW9ufVwiLmApXG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24ubGVuZ3RoID4gTUFYX0xFTkdUSCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYHZlcnNpb24gaXMgbG9uZ2VyIHRoYW4gJHtNQVhfTEVOR1RIfSBjaGFyYWN0ZXJzYFxuICAgICAgKVxuICAgIH1cblxuICAgIGRlYnVnKCdTZW1WZXInLCB2ZXJzaW9uLCBvcHRpb25zKVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgLy8gdGhpcyBpc24ndCBhY3R1YWxseSByZWxldmFudCBmb3IgdmVyc2lvbnMsIGJ1dCBrZWVwIGl0IHNvIHRoYXQgd2VcbiAgICAvLyBkb24ndCBydW4gaW50byB0cm91YmxlIHBhc3NpbmcgdGhpcy5vcHRpb25zIGFyb3VuZC5cbiAgICB0aGlzLmluY2x1ZGVQcmVyZWxlYXNlID0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlXG5cbiAgICBjb25zdCBtID0gdmVyc2lvbi50cmltKCkubWF0Y2gob3B0aW9ucy5sb29zZSA/IHJlW3QuTE9PU0VdIDogcmVbdC5GVUxMXSlcblxuICAgIGlmICghbSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBWZXJzaW9uOiAke3ZlcnNpb259YClcbiAgICB9XG5cbiAgICB0aGlzLnJhdyA9IHZlcnNpb25cblxuICAgIC8vIHRoZXNlIGFyZSBhY3R1YWxseSBudW1iZXJzXG4gICAgdGhpcy5tYWpvciA9ICttWzFdXG4gICAgdGhpcy5taW5vciA9ICttWzJdXG4gICAgdGhpcy5wYXRjaCA9ICttWzNdXG5cbiAgICBpZiAodGhpcy5tYWpvciA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5tYWpvciA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWFqb3IgdmVyc2lvbicpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWlub3IgPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMubWlub3IgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1pbm9yIHZlcnNpb24nKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBhdGNoID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLnBhdGNoIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBwYXRjaCB2ZXJzaW9uJylcbiAgICB9XG5cbiAgICAvLyBudW1iZXJpZnkgYW55IHByZXJlbGVhc2UgbnVtZXJpYyBpZHNcbiAgICBpZiAoIW1bNF0pIHtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IG1bNF0uc3BsaXQoJy4nKS5tYXAoKGlkKSA9PiB7XG4gICAgICAgIGlmICgvXlswLTldKyQvLnRlc3QoaWQpKSB7XG4gICAgICAgICAgY29uc3QgbnVtID0gK2lkXG4gICAgICAgICAgaWYgKG51bSA+PSAwICYmIG51bSA8IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlkXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuYnVpbGQgPSBtWzVdID8gbVs1XS5zcGxpdCgnLicpIDogW11cbiAgICB0aGlzLmZvcm1hdCgpXG4gIH1cblxuICBmb3JtYXQgKCkge1xuICAgIHRoaXMudmVyc2lvbiA9IGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLnBhdGNofWBcbiAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgdGhpcy52ZXJzaW9uICs9IGAtJHt0aGlzLnByZXJlbGVhc2Uuam9pbignLicpfWBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmVyc2lvblxuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLnZlcnNpb25cbiAgfVxuXG4gIGNvbXBhcmUgKG90aGVyKSB7XG4gICAgZGVidWcoJ1NlbVZlci5jb21wYXJlJywgdGhpcy52ZXJzaW9uLCB0aGlzLm9wdGlvbnMsIG90aGVyKVxuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gJ3N0cmluZycgJiYgb3RoZXIgPT09IHRoaXMudmVyc2lvbikge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgaWYgKG90aGVyLnZlcnNpb24gPT09IHRoaXMudmVyc2lvbikge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21wYXJlTWFpbihvdGhlcikgfHwgdGhpcy5jb21wYXJlUHJlKG90aGVyKVxuICB9XG5cbiAgY29tcGFyZU1haW4gKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWFqb3IsIG90aGVyLm1ham9yKSB8fFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWlub3IsIG90aGVyLm1pbm9yKSB8fFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMucGF0Y2gsIG90aGVyLnBhdGNoKVxuICAgIClcbiAgfVxuXG4gIGNvbXBhcmVQcmUgKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICAvLyBOT1QgaGF2aW5nIGEgcHJlcmVsZWFzZSBpcyA+IGhhdmluZyBvbmVcbiAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH0gZWxzZSBpZiAoIXRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAxXG4gICAgfSBlbHNlIGlmICghdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAwXG4gICAgfVxuXG4gICAgbGV0IGkgPSAwXG4gICAgZG8ge1xuICAgICAgY29uc3QgYSA9IHRoaXMucHJlcmVsZWFzZVtpXVxuICAgICAgY29uc3QgYiA9IG90aGVyLnByZXJlbGVhc2VbaV1cbiAgICAgIGRlYnVnKCdwcmVyZWxlYXNlIGNvbXBhcmUnLCBpLCBhLCBiKVxuICAgICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0gZWxzZSBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyhhLCBiKVxuICAgICAgfVxuICAgIH0gd2hpbGUgKCsraSlcbiAgfVxuXG4gIGNvbXBhcmVCdWlsZCAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIGxldCBpID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmJ1aWxkW2ldXG4gICAgICBjb25zdCBiID0gb3RoZXIuYnVpbGRbaV1cbiAgICAgIGRlYnVnKCdidWlsZCBjb21wYXJlJywgaSwgYSwgYilcbiAgICAgIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9IGVsc2UgaWYgKGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMVxuICAgICAgfSBlbHNlIGlmIChhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlSWRlbnRpZmllcnMoYSwgYilcbiAgICAgIH1cbiAgICB9IHdoaWxlICgrK2kpXG4gIH1cblxuICAvLyBwcmVtaW5vciB3aWxsIGJ1bXAgdGhlIHZlcnNpb24gdXAgdG8gdGhlIG5leHQgbWlub3IgcmVsZWFzZSwgYW5kIGltbWVkaWF0ZWx5XG4gIC8vIGRvd24gdG8gcHJlLXJlbGVhc2UuIHByZW1ham9yIGFuZCBwcmVwYXRjaCB3b3JrIHRoZSBzYW1lIHdheS5cbiAgaW5jIChyZWxlYXNlLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkge1xuICAgIGlmIChyZWxlYXNlLnN0YXJ0c1dpdGgoJ3ByZScpKSB7XG4gICAgICBpZiAoIWlkZW50aWZpZXIgJiYgaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6IGlkZW50aWZpZXIgaXMgZW1wdHknKVxuICAgICAgfVxuICAgICAgLy8gQXZvaWQgYW4gaW52YWxpZCBzZW12ZXIgcmVzdWx0c1xuICAgICAgaWYgKGlkZW50aWZpZXIpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBgLSR7aWRlbnRpZmllcn1gLm1hdGNoKHRoaXMub3B0aW9ucy5sb29zZSA/IHJlW3QuUFJFUkVMRUFTRUxPT1NFXSA6IHJlW3QuUFJFUkVMRUFTRV0pXG4gICAgICAgIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gIT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaWRlbnRpZmllcjogJHtpZGVudGlmaWVyfWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJlbGVhc2UpIHtcbiAgICAgIGNhc2UgJ3ByZW1ham9yJzpcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5taW5vciA9IDBcbiAgICAgICAgdGhpcy5tYWpvcisrXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3ByZW1pbm9yJzpcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5taW5vcisrXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3ByZXBhdGNoJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhbHJlYWR5IGEgcHJlcmVsZWFzZSwgaXQgd2lsbCBidW1wIHRvIHRoZSBuZXh0IHZlcnNpb25cbiAgICAgICAgLy8gZHJvcCBhbnkgcHJlcmVsZWFzZXMgdGhhdCBtaWdodCBhbHJlYWR5IGV4aXN0LCBzaW5jZSB0aGV5IGFyZSBub3RcbiAgICAgICAgLy8gcmVsZXZhbnQgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5pbmMoJ3BhdGNoJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBhIG5vbi1wcmVyZWxlYXNlIHZlcnNpb24sIHRoaXMgYWN0cyB0aGUgc2FtZSBhc1xuICAgICAgLy8gcHJlcGF0Y2guXG4gICAgICBjYXNlICdwcmVyZWxlYXNlJzpcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmluYygncGF0Y2gnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdyZWxlYXNlJzpcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHZlcnNpb24gJHt0aGlzLnJhd30gaXMgbm90IGEgcHJlcmVsZWFzZWApXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSAnbWFqb3InOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlLW1ham9yIHZlcnNpb24sIGJ1bXAgdXAgdG8gdGhlIHNhbWUgbWFqb3IgdmVyc2lvbi5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGluY3JlbWVudCBtYWpvci5cbiAgICAgICAgLy8gMS4wLjAtNSBidW1wcyB0byAxLjAuMFxuICAgICAgICAvLyAxLjEuMCBidW1wcyB0byAyLjAuMFxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5taW5vciAhPT0gMCB8fFxuICAgICAgICAgIHRoaXMucGF0Y2ggIT09IDAgfHxcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMubWFqb3IrK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWlub3IgPSAwXG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdtaW5vcic6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmUtbWlub3IgdmVyc2lvbiwgYnVtcCB1cCB0byB0aGUgc2FtZSBtaW5vciB2ZXJzaW9uLlxuICAgICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IG1pbm9yLlxuICAgICAgICAvLyAxLjIuMC01IGJ1bXBzIHRvIDEuMi4wXG4gICAgICAgIC8vIDEuMi4xIGJ1bXBzIHRvIDEuMy4wXG4gICAgICAgIGlmICh0aGlzLnBhdGNoICE9PSAwIHx8IHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLm1pbm9yKytcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncGF0Y2gnOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIHByZS1yZWxlYXNlIHZlcnNpb24sIGl0IHdpbGwgaW5jcmVtZW50IHRoZSBwYXRjaC5cbiAgICAgICAgLy8gSWYgaXQgaXMgYSBwcmUtcmVsZWFzZSBpdCB3aWxsIGJ1bXAgdXAgdG8gdGhlIHNhbWUgcGF0Y2ggdmVyc2lvbi5cbiAgICAgICAgLy8gMS4yLjAtNSBwYXRjaGVzIHRvIDEuMi4wXG4gICAgICAgIC8vIDEuMi4wIHBhdGNoZXMgdG8gMS4yLjFcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnBhdGNoKytcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgICBicmVha1xuICAgICAgLy8gVGhpcyBwcm9iYWJseSBzaG91bGRuJ3QgYmUgdXNlZCBwdWJsaWNseS5cbiAgICAgIC8vIDEuMC4wICdwcmUnIHdvdWxkIGJlY29tZSAxLjAuMC0wIHdoaWNoIGlzIHRoZSB3cm9uZyBkaXJlY3Rpb24uXG4gICAgICBjYXNlICdwcmUnOiB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBOdW1iZXIoaWRlbnRpZmllckJhc2UpID8gMSA6IDBcblxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtiYXNlXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBpID0gdGhpcy5wcmVyZWxlYXNlLmxlbmd0aFxuICAgICAgICAgIHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByZXJlbGVhc2VbaV0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZVtpXSsrXG4gICAgICAgICAgICAgIGkgPSAtMlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIGRpZG4ndCBpbmNyZW1lbnQgYW55dGhpbmdcbiAgICAgICAgICAgIGlmIChpZGVudGlmaWVyID09PSB0aGlzLnByZXJlbGVhc2Uuam9pbignLicpICYmIGlkZW50aWZpZXJCYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiBpZGVudGlmaWVyIGFscmVhZHkgZXhpc3RzJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZS5wdXNoKGJhc2UpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpZGVudGlmaWVyKSB7XG4gICAgICAgICAgLy8gMS4yLjAtYmV0YS4xIGJ1bXBzIHRvIDEuMi4wLWJldGEuMixcbiAgICAgICAgICAvLyAxLjIuMC1iZXRhLmZvb2JseiBvciAxLjIuMC1iZXRhIGJ1bXBzIHRvIDEuMi4wLWJldGEuMFxuICAgICAgICAgIGxldCBwcmVyZWxlYXNlID0gW2lkZW50aWZpZXIsIGJhc2VdXG4gICAgICAgICAgaWYgKGlkZW50aWZpZXJCYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcHJlcmVsZWFzZSA9IFtpZGVudGlmaWVyXVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29tcGFyZUlkZW50aWZpZXJzKHRoaXMucHJlcmVsZWFzZVswXSwgaWRlbnRpZmllcikgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChpc05hTih0aGlzLnByZXJlbGVhc2VbMV0pKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IHByZXJlbGVhc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gcHJlcmVsZWFzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogJHtyZWxlYXNlfWApXG4gICAgfVxuICAgIHRoaXMucmF3ID0gdGhpcy5mb3JtYXQoKVxuICAgIGlmICh0aGlzLmJ1aWxkLmxlbmd0aCkge1xuICAgICAgdGhpcy5yYXcgKz0gYCske3RoaXMuYnVpbGQuam9pbignLicpfWBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNlbVZlclxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgcGFyc2UgPSAodmVyc2lvbiwgb3B0aW9ucywgdGhyb3dFcnJvcnMgPSBmYWxzZSkgPT4ge1xuICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcikge1xuICAgIHJldHVybiB2ZXJzaW9uXG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFNlbVZlcih2ZXJzaW9uLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIGlmICghdGhyb3dFcnJvcnMpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIHRocm93IGVyXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHZhbGlkID0gKHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgdiA9IHBhcnNlKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJldHVybiB2ID8gdi52ZXJzaW9uIDogbnVsbFxufVxubW9kdWxlLmV4cG9ydHMgPSB2YWxpZFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IGNsZWFuID0gKHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgcyA9IHBhcnNlKHZlcnNpb24udHJpbSgpLnJlcGxhY2UoL15bPXZdKy8sICcnKSwgb3B0aW9ucylcbiAgcmV0dXJuIHMgPyBzLnZlcnNpb24gOiBudWxsXG59XG5tb2R1bGUuZXhwb3J0cyA9IGNsZWFuXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5cbmNvbnN0IGluYyA9ICh2ZXJzaW9uLCByZWxlYXNlLCBvcHRpb25zLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkgPT4ge1xuICBpZiAodHlwZW9mIChvcHRpb25zKSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZGVudGlmaWVyQmFzZSA9IGlkZW50aWZpZXJcbiAgICBpZGVudGlmaWVyID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSB1bmRlZmluZWRcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBTZW1WZXIoXG4gICAgICB2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyID8gdmVyc2lvbi52ZXJzaW9uIDogdmVyc2lvbixcbiAgICAgIG9wdGlvbnNcbiAgICApLmluYyhyZWxlYXNlLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkudmVyc2lvblxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gaW5jXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UuanMnKVxuXG5jb25zdCBkaWZmID0gKHZlcnNpb24xLCB2ZXJzaW9uMikgPT4ge1xuICBjb25zdCB2MSA9IHBhcnNlKHZlcnNpb24xLCBudWxsLCB0cnVlKVxuICBjb25zdCB2MiA9IHBhcnNlKHZlcnNpb24yLCBudWxsLCB0cnVlKVxuICBjb25zdCBjb21wYXJpc29uID0gdjEuY29tcGFyZSh2MilcblxuICBpZiAoY29tcGFyaXNvbiA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCB2MUhpZ2hlciA9IGNvbXBhcmlzb24gPiAwXG4gIGNvbnN0IGhpZ2hWZXJzaW9uID0gdjFIaWdoZXIgPyB2MSA6IHYyXG4gIGNvbnN0IGxvd1ZlcnNpb24gPSB2MUhpZ2hlciA/IHYyIDogdjFcbiAgY29uc3QgaGlnaEhhc1ByZSA9ICEhaGlnaFZlcnNpb24ucHJlcmVsZWFzZS5sZW5ndGhcbiAgY29uc3QgbG93SGFzUHJlID0gISFsb3dWZXJzaW9uLnByZXJlbGVhc2UubGVuZ3RoXG5cbiAgaWYgKGxvd0hhc1ByZSAmJiAhaGlnaEhhc1ByZSkge1xuICAgIC8vIEdvaW5nIGZyb20gcHJlcmVsZWFzZSAtPiBubyBwcmVyZWxlYXNlIHJlcXVpcmVzIHNvbWUgc3BlY2lhbCBjYXNpbmdcblxuICAgIC8vIElmIHRoZSBsb3cgdmVyc2lvbiBoYXMgb25seSBhIG1ham9yLCB0aGVuIGl0IHdpbGwgYWx3YXlzIGJlIGEgbWFqb3JcbiAgICAvLyBTb21lIGV4YW1wbGVzOlxuICAgIC8vIDEuMC4wLTEgLT4gMS4wLjBcbiAgICAvLyAxLjAuMC0xIC0+IDEuMS4xXG4gICAgLy8gMS4wLjAtMSAtPiAyLjAuMFxuICAgIGlmICghbG93VmVyc2lvbi5wYXRjaCAmJiAhbG93VmVyc2lvbi5taW5vcikge1xuICAgICAgcmV0dXJuICdtYWpvcidcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbWFpbiBwYXJ0IGhhcyBubyBkaWZmZXJlbmNlXG4gICAgaWYgKGxvd1ZlcnNpb24uY29tcGFyZU1haW4oaGlnaFZlcnNpb24pID09PSAwKSB7XG4gICAgICBpZiAobG93VmVyc2lvbi5taW5vciAmJiAhbG93VmVyc2lvbi5wYXRjaCkge1xuICAgICAgICByZXR1cm4gJ21pbm9yJ1xuICAgICAgfVxuICAgICAgcmV0dXJuICdwYXRjaCdcbiAgICB9XG4gIH1cblxuICAvLyBhZGQgdGhlIGBwcmVgIHByZWZpeCBpZiB3ZSBhcmUgZ29pbmcgdG8gYSBwcmVyZWxlYXNlIHZlcnNpb25cbiAgY29uc3QgcHJlZml4ID0gaGlnaEhhc1ByZSA/ICdwcmUnIDogJydcblxuICBpZiAodjEubWFqb3IgIT09IHYyLm1ham9yKSB7XG4gICAgcmV0dXJuIHByZWZpeCArICdtYWpvcidcbiAgfVxuXG4gIGlmICh2MS5taW5vciAhPT0gdjIubWlub3IpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgJ21pbm9yJ1xuICB9XG5cbiAgaWYgKHYxLnBhdGNoICE9PSB2Mi5wYXRjaCkge1xuICAgIHJldHVybiBwcmVmaXggKyAncGF0Y2gnXG4gIH1cblxuICAvLyBoaWdoIGFuZCBsb3cgYXJlIHByZWxlYXNlc1xuICByZXR1cm4gJ3ByZXJlbGVhc2UnXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGlmZlxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgbWFqb3IgPSAoYSwgbG9vc2UpID0+IG5ldyBTZW1WZXIoYSwgbG9vc2UpLm1ham9yXG5tb2R1bGUuZXhwb3J0cyA9IG1ham9yXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBtaW5vciA9IChhLCBsb29zZSkgPT4gbmV3IFNlbVZlcihhLCBsb29zZSkubWlub3Jcbm1vZHVsZS5leHBvcnRzID0gbWlub3JcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IHBhdGNoID0gKGEsIGxvb3NlKSA9PiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5wYXRjaFxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHByZXJlbGVhc2UgPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZSh2ZXJzaW9uLCBvcHRpb25zKVxuICByZXR1cm4gKHBhcnNlZCAmJiBwYXJzZWQucHJlcmVsZWFzZS5sZW5ndGgpID8gcGFyc2VkLnByZXJlbGVhc2UgOiBudWxsXG59XG5tb2R1bGUuZXhwb3J0cyA9IHByZXJlbGVhc2VcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGNvbXBhcmUgPSAoYSwgYiwgbG9vc2UpID0+XG4gIG5ldyBTZW1WZXIoYSwgbG9vc2UpLmNvbXBhcmUobmV3IFNlbVZlcihiLCBsb29zZSkpXG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCByY29tcGFyZSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShiLCBhLCBsb29zZSlcbm1vZHVsZS5leHBvcnRzID0gcmNvbXBhcmVcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgY29tcGFyZUxvb3NlID0gKGEsIGIpID0+IGNvbXBhcmUoYSwgYiwgdHJ1ZSlcbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZUxvb3NlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBjb21wYXJlQnVpbGQgPSAoYSwgYiwgbG9vc2UpID0+IHtcbiAgY29uc3QgdmVyc2lvbkEgPSBuZXcgU2VtVmVyKGEsIGxvb3NlKVxuICBjb25zdCB2ZXJzaW9uQiA9IG5ldyBTZW1WZXIoYiwgbG9vc2UpXG4gIHJldHVybiB2ZXJzaW9uQS5jb21wYXJlKHZlcnNpb25CKSB8fCB2ZXJzaW9uQS5jb21wYXJlQnVpbGQodmVyc2lvbkIpXG59XG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVCdWlsZFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZUJ1aWxkID0gcmVxdWlyZSgnLi9jb21wYXJlLWJ1aWxkJylcbmNvbnN0IHNvcnQgPSAobGlzdCwgbG9vc2UpID0+IGxpc3Quc29ydCgoYSwgYikgPT4gY29tcGFyZUJ1aWxkKGEsIGIsIGxvb3NlKSlcbm1vZHVsZS5leHBvcnRzID0gc29ydFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZUJ1aWxkID0gcmVxdWlyZSgnLi9jb21wYXJlLWJ1aWxkJylcbmNvbnN0IHJzb3J0ID0gKGxpc3QsIGxvb3NlKSA9PiBsaXN0LnNvcnQoKGEsIGIpID0+IGNvbXBhcmVCdWlsZChiLCBhLCBsb29zZSkpXG5tb2R1bGUuZXhwb3J0cyA9IHJzb3J0XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGd0ID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA+IDBcbm1vZHVsZS5leHBvcnRzID0gZ3RcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgbHQgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpIDwgMFxubW9kdWxlLmV4cG9ydHMgPSBsdFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBlcSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPT09IDBcbm1vZHVsZS5leHBvcnRzID0gZXFcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgbmVxID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSAhPT0gMFxubW9kdWxlLmV4cG9ydHMgPSBuZXFcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgZ3RlID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA+PSAwXG5tb2R1bGUuZXhwb3J0cyA9IGd0ZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBsdGUgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpIDw9IDBcbm1vZHVsZS5leHBvcnRzID0gbHRlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBlcSA9IHJlcXVpcmUoJy4vZXEnKVxuY29uc3QgbmVxID0gcmVxdWlyZSgnLi9uZXEnKVxuY29uc3QgZ3QgPSByZXF1aXJlKCcuL2d0JylcbmNvbnN0IGd0ZSA9IHJlcXVpcmUoJy4vZ3RlJylcbmNvbnN0IGx0ID0gcmVxdWlyZSgnLi9sdCcpXG5jb25zdCBsdGUgPSByZXF1aXJlKCcuL2x0ZScpXG5cbmNvbnN0IGNtcCA9IChhLCBvcCwgYiwgbG9vc2UpID0+IHtcbiAgc3dpdGNoIChvcCkge1xuICAgIGNhc2UgJz09PSc6XG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGEgPSBhLnZlcnNpb25cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYiA9IGIudmVyc2lvblxuICAgICAgfVxuICAgICAgcmV0dXJuIGEgPT09IGJcblxuICAgIGNhc2UgJyE9PSc6XG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGEgPSBhLnZlcnNpb25cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYiA9IGIudmVyc2lvblxuICAgICAgfVxuICAgICAgcmV0dXJuIGEgIT09IGJcblxuICAgIGNhc2UgJyc6XG4gICAgY2FzZSAnPSc6XG4gICAgY2FzZSAnPT0nOlxuICAgICAgcmV0dXJuIGVxKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnIT0nOlxuICAgICAgcmV0dXJuIG5lcShhLCBiLCBsb29zZSlcblxuICAgIGNhc2UgJz4nOlxuICAgICAgcmV0dXJuIGd0KGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPj0nOlxuICAgICAgcmV0dXJuIGd0ZShhLCBiLCBsb29zZSlcblxuICAgIGNhc2UgJzwnOlxuICAgICAgcmV0dXJuIGx0KGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPD0nOlxuICAgICAgcmV0dXJuIGx0ZShhLCBiLCBsb29zZSlcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIG9wZXJhdG9yOiAke29wfWApXG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gY21wXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgeyBzYWZlUmU6IHJlLCB0IH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZScpXG5cbmNvbnN0IGNvZXJjZSA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgcmV0dXJuIHZlcnNpb25cbiAgfVxuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ251bWJlcicpIHtcbiAgICB2ZXJzaW9uID0gU3RyaW5nKHZlcnNpb24pXG4gIH1cblxuICBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgbGV0IG1hdGNoID0gbnVsbFxuICBpZiAoIW9wdGlvbnMucnRsKSB7XG4gICAgbWF0Y2ggPSB2ZXJzaW9uLm1hdGNoKG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyByZVt0LkNPRVJDRUZVTExdIDogcmVbdC5DT0VSQ0VdKVxuICB9IGVsc2Uge1xuICAgIC8vIEZpbmQgdGhlIHJpZ2h0LW1vc3QgY29lcmNpYmxlIHN0cmluZyB0aGF0IGRvZXMgbm90IHNoYXJlXG4gICAgLy8gYSB0ZXJtaW51cyB3aXRoIGEgbW9yZSBsZWZ0LXdhcmQgY29lcmNpYmxlIHN0cmluZy5cbiAgICAvLyBFZywgJzEuMi4zLjQnIHdhbnRzIHRvIGNvZXJjZSAnMi4zLjQnLCBub3QgJzMuNCcgb3IgJzQnXG4gICAgLy8gV2l0aCBpbmNsdWRlUHJlcmVsZWFzZSBvcHRpb24gc2V0LCAnMS4yLjMuNC1yYycgd2FudHMgdG8gY29lcmNlICcyLjMuNC1yYycsIG5vdCAnMi4zLjQnXG4gICAgLy9cbiAgICAvLyBXYWxrIHRocm91Z2ggdGhlIHN0cmluZyBjaGVja2luZyB3aXRoIGEgL2cgcmVnZXhwXG4gICAgLy8gTWFudWFsbHkgc2V0IHRoZSBpbmRleCBzbyBhcyB0byBwaWNrIHVwIG92ZXJsYXBwaW5nIG1hdGNoZXMuXG4gICAgLy8gU3RvcCB3aGVuIHdlIGdldCBhIG1hdGNoIHRoYXQgZW5kcyBhdCB0aGUgc3RyaW5nIGVuZCwgc2luY2Ugbm9cbiAgICAvLyBjb2VyY2libGUgc3RyaW5nIGNhbiBiZSBtb3JlIHJpZ2h0LXdhcmQgd2l0aG91dCB0aGUgc2FtZSB0ZXJtaW51cy5cbiAgICBjb25zdCBjb2VyY2VSdGxSZWdleCA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyByZVt0LkNPRVJDRVJUTEZVTExdIDogcmVbdC5DT0VSQ0VSVExdXG4gICAgbGV0IG5leHRcbiAgICB3aGlsZSAoKG5leHQgPSBjb2VyY2VSdGxSZWdleC5leGVjKHZlcnNpb24pKSAmJlxuICAgICAgICAoIW1hdGNoIHx8IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoICE9PSB2ZXJzaW9uLmxlbmd0aClcbiAgICApIHtcbiAgICAgIGlmICghbWF0Y2ggfHxcbiAgICAgICAgICAgIG5leHQuaW5kZXggKyBuZXh0WzBdLmxlbmd0aCAhPT0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpIHtcbiAgICAgICAgbWF0Y2ggPSBuZXh0XG4gICAgICB9XG4gICAgICBjb2VyY2VSdGxSZWdleC5sYXN0SW5kZXggPSBuZXh0LmluZGV4ICsgbmV4dFsxXS5sZW5ndGggKyBuZXh0WzJdLmxlbmd0aFxuICAgIH1cbiAgICAvLyBsZWF2ZSBpdCBpbiBhIGNsZWFuIHN0YXRlXG4gICAgY29lcmNlUnRsUmVnZXgubGFzdEluZGV4ID0gLTFcbiAgfVxuXG4gIGlmIChtYXRjaCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBtYWpvciA9IG1hdGNoWzJdXG4gIGNvbnN0IG1pbm9yID0gbWF0Y2hbM10gfHwgJzAnXG4gIGNvbnN0IHBhdGNoID0gbWF0Y2hbNF0gfHwgJzAnXG4gIGNvbnN0IHByZXJlbGVhc2UgPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmIG1hdGNoWzVdID8gYC0ke21hdGNoWzVdfWAgOiAnJ1xuICBjb25zdCBidWlsZCA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiYgbWF0Y2hbNl0gPyBgKyR7bWF0Y2hbNl19YCA6ICcnXG5cbiAgcmV0dXJuIHBhcnNlKGAke21ham9yfS4ke21pbm9yfS4ke3BhdGNofSR7cHJlcmVsZWFzZX0ke2J1aWxkfWAsIG9wdGlvbnMpXG59XG5tb2R1bGUuZXhwb3J0cyA9IGNvZXJjZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY2xhc3MgTFJVQ2FjaGUge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5tYXggPSAxMDAwXG4gICAgdGhpcy5tYXAgPSBuZXcgTWFwKClcbiAgfVxuXG4gIGdldCAoa2V5KSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm1hcC5nZXQoa2V5KVxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUga2V5IGZyb20gdGhlIG1hcCBhbmQgYWRkIGl0IHRvIHRoZSBlbmRcbiAgICAgIHRoaXMubWFwLmRlbGV0ZShrZXkpXG4gICAgICB0aGlzLm1hcC5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZSAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmRlbGV0ZShrZXkpXG4gIH1cblxuICBzZXQgKGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy5kZWxldGUoa2V5KVxuXG4gICAgaWYgKCFkZWxldGVkICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIElmIGNhY2hlIGlzIGZ1bGwsIGRlbGV0ZSB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBpdGVtXG4gICAgICBpZiAodGhpcy5tYXAuc2l6ZSA+PSB0aGlzLm1heCkge1xuICAgICAgICBjb25zdCBmaXJzdEtleSA9IHRoaXMubWFwLmtleXMoKS5uZXh0KCkudmFsdWVcbiAgICAgICAgdGhpcy5kZWxldGUoZmlyc3RLZXkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFwLnNldChrZXksIHZhbHVlKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMUlVDYWNoZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU1BBQ0VfQ0hBUkFDVEVSUyA9IC9cXHMrL2dcblxuLy8gaG9pc3RlZCBjbGFzcyBmb3IgY3ljbGljIGRlcGVuZGVuY3lcbmNsYXNzIFJhbmdlIHtcbiAgY29uc3RydWN0b3IgKHJhbmdlLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKHJhbmdlIGluc3RhbmNlb2YgUmFuZ2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcmFuZ2UubG9vc2UgPT09ICEhb3B0aW9ucy5sb29zZSAmJlxuICAgICAgICByYW5nZS5pbmNsdWRlUHJlcmVsZWFzZSA9PT0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLnJhdywgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmFuZ2UgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSB7XG4gICAgICAvLyBqdXN0IHB1dCBpdCBpbiB0aGUgc2V0IGFuZCByZXR1cm5cbiAgICAgIHRoaXMucmF3ID0gcmFuZ2UudmFsdWVcbiAgICAgIHRoaXMuc2V0ID0gW1tyYW5nZV1dXG4gICAgICB0aGlzLmZvcm1hdHRlZCA9IHVuZGVmaW5lZFxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5sb29zZSA9ICEhb3B0aW9ucy5sb29zZVxuICAgIHRoaXMuaW5jbHVkZVByZXJlbGVhc2UgPSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2VcblxuICAgIC8vIEZpcnN0IHJlZHVjZSBhbGwgd2hpdGVzcGFjZSBhcyBtdWNoIGFzIHBvc3NpYmxlIHNvIHdlIGRvIG5vdCBoYXZlIHRvIHJlbHlcbiAgICAvLyBvbiBwb3RlbnRpYWxseSBzbG93IHJlZ2V4ZXMgbGlrZSBcXHMqLiBUaGlzIGlzIHRoZW4gc3RvcmVkIGFuZCB1c2VkIGZvclxuICAgIC8vIGZ1dHVyZSBlcnJvciBtZXNzYWdlcyBhcyB3ZWxsLlxuICAgIHRoaXMucmF3ID0gcmFuZ2UudHJpbSgpLnJlcGxhY2UoU1BBQ0VfQ0hBUkFDVEVSUywgJyAnKVxuXG4gICAgLy8gRmlyc3QsIHNwbGl0IG9uIHx8XG4gICAgdGhpcy5zZXQgPSB0aGlzLnJhd1xuICAgICAgLnNwbGl0KCd8fCcpXG4gICAgICAvLyBtYXAgdGhlIHJhbmdlIHRvIGEgMmQgYXJyYXkgb2YgY29tcGFyYXRvcnNcbiAgICAgIC5tYXAociA9PiB0aGlzLnBhcnNlUmFuZ2Uoci50cmltKCkpKVxuICAgICAgLy8gdGhyb3cgb3V0IGFueSBjb21wYXJhdG9yIGxpc3RzIHRoYXQgYXJlIGVtcHR5XG4gICAgICAvLyB0aGlzIGdlbmVyYWxseSBtZWFucyB0aGF0IGl0IHdhcyBub3QgYSB2YWxpZCByYW5nZSwgd2hpY2ggaXMgYWxsb3dlZFxuICAgICAgLy8gaW4gbG9vc2UgbW9kZSwgYnV0IHdpbGwgc3RpbGwgdGhyb3cgaWYgdGhlIFdIT0xFIHJhbmdlIGlzIGludmFsaWQuXG4gICAgICAuZmlsdGVyKGMgPT4gYy5sZW5ndGgpXG5cbiAgICBpZiAoIXRoaXMuc2V0Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBTZW1WZXIgUmFuZ2U6ICR7dGhpcy5yYXd9YClcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBoYXZlIGFueSB0aGF0IGFyZSBub3QgdGhlIG51bGwgc2V0LCB0aHJvdyBvdXQgbnVsbCBzZXRzLlxuICAgIGlmICh0aGlzLnNldC5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBrZWVwIHRoZSBmaXJzdCBvbmUsIGluIGNhc2UgdGhleSdyZSBhbGwgbnVsbCBzZXRzXG4gICAgICBjb25zdCBmaXJzdCA9IHRoaXMuc2V0WzBdXG4gICAgICB0aGlzLnNldCA9IHRoaXMuc2V0LmZpbHRlcihjID0+ICFpc051bGxTZXQoY1swXSkpXG4gICAgICBpZiAodGhpcy5zZXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuc2V0ID0gW2ZpcnN0XVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNldC5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIGlmIHdlIGhhdmUgYW55IHRoYXQgYXJlICosIHRoZW4gdGhlIHJhbmdlIGlzIGp1c3QgKlxuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5zZXQpIHtcbiAgICAgICAgICBpZiAoYy5sZW5ndGggPT09IDEgJiYgaXNBbnkoY1swXSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0ID0gW2NdXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZm9ybWF0dGVkID0gdW5kZWZpbmVkXG4gIH1cblxuICBnZXQgcmFuZ2UgKCkge1xuICAgIGlmICh0aGlzLmZvcm1hdHRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZvcm1hdHRlZCA9ICcnXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgIHRoaXMuZm9ybWF0dGVkICs9ICd8fCdcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wcyA9IHRoaXMuc2V0W2ldXG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY29tcHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICBpZiAoayA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0dGVkICs9ICcgJ1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmZvcm1hdHRlZCArPSBjb21wc1trXS50b1N0cmluZygpLnRyaW0oKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZvcm1hdHRlZFxuICB9XG5cbiAgZm9ybWF0ICgpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5nZVxuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmdlXG4gIH1cblxuICBwYXJzZVJhbmdlIChyYW5nZSkge1xuICAgIC8vIG1lbW9pemUgcmFuZ2UgcGFyc2luZyBmb3IgcGVyZm9ybWFuY2UuXG4gICAgLy8gdGhpcyBpcyBhIHZlcnkgaG90IHBhdGgsIGFuZCBmdWxseSBkZXRlcm1pbmlzdGljLlxuICAgIGNvbnN0IG1lbW9PcHRzID1cbiAgICAgICh0aGlzLm9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiYgRkxBR19JTkNMVURFX1BSRVJFTEVBU0UpIHxcbiAgICAgICh0aGlzLm9wdGlvbnMubG9vc2UgJiYgRkxBR19MT09TRSlcbiAgICBjb25zdCBtZW1vS2V5ID0gbWVtb09wdHMgKyAnOicgKyByYW5nZVxuICAgIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChtZW1vS2V5KVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRcbiAgICB9XG5cbiAgICBjb25zdCBsb29zZSA9IHRoaXMub3B0aW9ucy5sb29zZVxuICAgIC8vIGAxLjIuMyAtIDEuMi40YCA9PiBgPj0xLjIuMyA8PTEuMi40YFxuICAgIGNvbnN0IGhyID0gbG9vc2UgPyByZVt0LkhZUEhFTlJBTkdFTE9PU0VdIDogcmVbdC5IWVBIRU5SQU5HRV1cbiAgICByYW5nZSA9IHJhbmdlLnJlcGxhY2UoaHIsIGh5cGhlblJlcGxhY2UodGhpcy5vcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSlcbiAgICBkZWJ1ZygnaHlwaGVuIHJlcGxhY2UnLCByYW5nZSlcblxuICAgIC8vIGA+IDEuMi4zIDwgMS4yLjVgID0+IGA+MS4yLjMgPDEuMi41YFxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVt0LkNPTVBBUkFUT1JUUklNXSwgY29tcGFyYXRvclRyaW1SZXBsYWNlKVxuICAgIGRlYnVnKCdjb21wYXJhdG9yIHRyaW0nLCByYW5nZSlcblxuICAgIC8vIGB+IDEuMi4zYCA9PiBgfjEuMi4zYFxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVt0LlRJTERFVFJJTV0sIHRpbGRlVHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ3RpbGRlIHRyaW0nLCByYW5nZSlcblxuICAgIC8vIGBeIDEuMi4zYCA9PiBgXjEuMi4zYFxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVt0LkNBUkVUVFJJTV0sIGNhcmV0VHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ2NhcmV0IHRyaW0nLCByYW5nZSlcblxuICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSByYW5nZSBpcyBjb21wbGV0ZWx5IHRyaW1tZWQgYW5kXG4gICAgLy8gcmVhZHkgdG8gYmUgc3BsaXQgaW50byBjb21wYXJhdG9ycy5cblxuICAgIGxldCByYW5nZUxpc3QgPSByYW5nZVxuICAgICAgLnNwbGl0KCcgJylcbiAgICAgIC5tYXAoY29tcCA9PiBwYXJzZUNvbXBhcmF0b3IoY29tcCwgdGhpcy5vcHRpb25zKSlcbiAgICAgIC5qb2luKCcgJylcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAvLyA+PTAuMC4wIGlzIGVxdWl2YWxlbnQgdG8gKlxuICAgICAgLm1hcChjb21wID0+IHJlcGxhY2VHVEUwKGNvbXAsIHRoaXMub3B0aW9ucykpXG5cbiAgICBpZiAobG9vc2UpIHtcbiAgICAgIC8vIGluIGxvb3NlIG1vZGUsIHRocm93IG91dCBhbnkgdGhhdCBhcmUgbm90IHZhbGlkIGNvbXBhcmF0b3JzXG4gICAgICByYW5nZUxpc3QgPSByYW5nZUxpc3QuZmlsdGVyKGNvbXAgPT4ge1xuICAgICAgICBkZWJ1ZygnbG9vc2UgaW52YWxpZCBmaWx0ZXInLCBjb21wLCB0aGlzLm9wdGlvbnMpXG4gICAgICAgIHJldHVybiAhIWNvbXAubWF0Y2gocmVbdC5DT01QQVJBVE9STE9PU0VdKVxuICAgICAgfSlcbiAgICB9XG4gICAgZGVidWcoJ3JhbmdlIGxpc3QnLCByYW5nZUxpc3QpXG5cbiAgICAvLyBpZiBhbnkgY29tcGFyYXRvcnMgYXJlIHRoZSBudWxsIHNldCwgdGhlbiByZXBsYWNlIHdpdGggSlVTVCBudWxsIHNldFxuICAgIC8vIGlmIG1vcmUgdGhhbiBvbmUgY29tcGFyYXRvciwgcmVtb3ZlIGFueSAqIGNvbXBhcmF0b3JzXG4gICAgLy8gYWxzbywgZG9uJ3QgaW5jbHVkZSB0aGUgc2FtZSBjb21wYXJhdG9yIG1vcmUgdGhhbiBvbmNlXG4gICAgY29uc3QgcmFuZ2VNYXAgPSBuZXcgTWFwKClcbiAgICBjb25zdCBjb21wYXJhdG9ycyA9IHJhbmdlTGlzdC5tYXAoY29tcCA9PiBuZXcgQ29tcGFyYXRvcihjb21wLCB0aGlzLm9wdGlvbnMpKVxuICAgIGZvciAoY29uc3QgY29tcCBvZiBjb21wYXJhdG9ycykge1xuICAgICAgaWYgKGlzTnVsbFNldChjb21wKSkge1xuICAgICAgICByZXR1cm4gW2NvbXBdXG4gICAgICB9XG4gICAgICByYW5nZU1hcC5zZXQoY29tcC52YWx1ZSwgY29tcClcbiAgICB9XG4gICAgaWYgKHJhbmdlTWFwLnNpemUgPiAxICYmIHJhbmdlTWFwLmhhcygnJykpIHtcbiAgICAgIHJhbmdlTWFwLmRlbGV0ZSgnJylcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBbLi4ucmFuZ2VNYXAudmFsdWVzKCldXG4gICAgY2FjaGUuc2V0KG1lbW9LZXksIHJlc3VsdClcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBpbnRlcnNlY3RzIChyYW5nZSwgb3B0aW9ucykge1xuICAgIGlmICghKHJhbmdlIGluc3RhbmNlb2YgUmFuZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhIFJhbmdlIGlzIHJlcXVpcmVkJylcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXQuc29tZSgodGhpc0NvbXBhcmF0b3JzKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpc1NhdGlzZmlhYmxlKHRoaXNDb21wYXJhdG9ycywgb3B0aW9ucykgJiZcbiAgICAgICAgcmFuZ2Uuc2V0LnNvbWUoKHJhbmdlQ29tcGFyYXRvcnMpID0+IHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaXNTYXRpc2ZpYWJsZShyYW5nZUNvbXBhcmF0b3JzLCBvcHRpb25zKSAmJlxuICAgICAgICAgICAgdGhpc0NvbXBhcmF0b3JzLmV2ZXJ5KCh0aGlzQ29tcGFyYXRvcikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gcmFuZ2VDb21wYXJhdG9ycy5ldmVyeSgocmFuZ2VDb21wYXJhdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNDb21wYXJhdG9yLmludGVyc2VjdHMocmFuZ2VDb21wYXJhdG9yLCBvcHRpb25zKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfSlcbiAgfVxuXG4gIC8vIGlmIEFOWSBvZiB0aGUgc2V0cyBtYXRjaCBBTEwgb2YgaXRzIGNvbXBhcmF0b3JzLCB0aGVuIHBhc3NcbiAgdGVzdCAodmVyc2lvbikge1xuICAgIGlmICghdmVyc2lvbikge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgdGhpcy5vcHRpb25zKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNldC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRlc3RTZXQodGhpcy5zZXRbaV0sIHZlcnNpb24sIHRoaXMub3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSYW5nZVxuXG5jb25zdCBMUlUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9scnVjYWNoZScpXG5jb25zdCBjYWNoZSA9IG5ldyBMUlUoKVxuXG5jb25zdCBwYXJzZU9wdGlvbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9wYXJzZS1vcHRpb25zJylcbmNvbnN0IENvbXBhcmF0b3IgPSByZXF1aXJlKCcuL2NvbXBhcmF0b3InKVxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9kZWJ1ZycpXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuL3NlbXZlcicpXG5jb25zdCB7XG4gIHNhZmVSZTogcmUsXG4gIHQsXG4gIGNvbXBhcmF0b3JUcmltUmVwbGFjZSxcbiAgdGlsZGVUcmltUmVwbGFjZSxcbiAgY2FyZXRUcmltUmVwbGFjZSxcbn0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZScpXG5jb25zdCB7IEZMQUdfSU5DTFVERV9QUkVSRUxFQVNFLCBGTEFHX0xPT1NFIH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9jb25zdGFudHMnKVxuXG5jb25zdCBpc051bGxTZXQgPSBjID0+IGMudmFsdWUgPT09ICc8MC4wLjAtMCdcbmNvbnN0IGlzQW55ID0gYyA9PiBjLnZhbHVlID09PSAnJ1xuXG4vLyB0YWtlIGEgc2V0IG9mIGNvbXBhcmF0b3JzIGFuZCBkZXRlcm1pbmUgd2hldGhlciB0aGVyZVxuLy8gZXhpc3RzIGEgdmVyc2lvbiB3aGljaCBjYW4gc2F0aXNmeSBpdFxuY29uc3QgaXNTYXRpc2ZpYWJsZSA9IChjb21wYXJhdG9ycywgb3B0aW9ucykgPT4ge1xuICBsZXQgcmVzdWx0ID0gdHJ1ZVxuICBjb25zdCByZW1haW5pbmdDb21wYXJhdG9ycyA9IGNvbXBhcmF0b3JzLnNsaWNlKClcbiAgbGV0IHRlc3RDb21wYXJhdG9yID0gcmVtYWluaW5nQ29tcGFyYXRvcnMucG9wKClcblxuICB3aGlsZSAocmVzdWx0ICYmIHJlbWFpbmluZ0NvbXBhcmF0b3JzLmxlbmd0aCkge1xuICAgIHJlc3VsdCA9IHJlbWFpbmluZ0NvbXBhcmF0b3JzLmV2ZXJ5KChvdGhlckNvbXBhcmF0b3IpID0+IHtcbiAgICAgIHJldHVybiB0ZXN0Q29tcGFyYXRvci5pbnRlcnNlY3RzKG90aGVyQ29tcGFyYXRvciwgb3B0aW9ucylcbiAgICB9KVxuXG4gICAgdGVzdENvbXBhcmF0b3IgPSByZW1haW5pbmdDb21wYXJhdG9ycy5wb3AoKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vLyBjb21wcmlzZWQgb2YgeHJhbmdlcywgdGlsZGVzLCBzdGFycywgYW5kIGd0bHQncyBhdCB0aGlzIHBvaW50LlxuLy8gYWxyZWFkeSByZXBsYWNlZCB0aGUgaHlwaGVuIHJhbmdlc1xuLy8gdHVybiBpbnRvIGEgc2V0IG9mIEpVU1QgY29tcGFyYXRvcnMuXG5jb25zdCBwYXJzZUNvbXBhcmF0b3IgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygnY29tcCcsIGNvbXAsIG9wdGlvbnMpXG4gIGNvbXAgPSByZXBsYWNlQ2FyZXRzKGNvbXAsIG9wdGlvbnMpXG4gIGRlYnVnKCdjYXJldCcsIGNvbXApXG4gIGNvbXAgPSByZXBsYWNlVGlsZGVzKGNvbXAsIG9wdGlvbnMpXG4gIGRlYnVnKCd0aWxkZXMnLCBjb21wKVxuICBjb21wID0gcmVwbGFjZVhSYW5nZXMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ3hyYW5nZScsIGNvbXApXG4gIGNvbXAgPSByZXBsYWNlU3RhcnMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ3N0YXJzJywgY29tcClcbiAgcmV0dXJuIGNvbXBcbn1cblxuY29uc3QgaXNYID0gaWQgPT4gIWlkIHx8IGlkLnRvTG93ZXJDYXNlKCkgPT09ICd4JyB8fCBpZCA9PT0gJyonXG5cbi8vIH4sIH4+IC0tPiAqIChhbnksIGtpbmRhIHNpbGx5KVxuLy8gfjIsIH4yLngsIH4yLngueCwgfj4yLCB+PjIueCB+PjIueC54IC0tPiA+PTIuMC4wIDwzLjAuMC0wXG4vLyB+Mi4wLCB+Mi4wLngsIH4+Mi4wLCB+PjIuMC54IC0tPiA+PTIuMC4wIDwyLjEuMC0wXG4vLyB+MS4yLCB+MS4yLngsIH4+MS4yLCB+PjEuMi54IC0tPiA+PTEuMi4wIDwxLjMuMC0wXG4vLyB+MS4yLjMsIH4+MS4yLjMgLS0+ID49MS4yLjMgPDEuMy4wLTBcbi8vIH4xLjIuMCwgfj4xLjIuMCAtLT4gPj0xLjIuMCA8MS4zLjAtMFxuLy8gfjAuMC4xIC0tPiA+PTAuMC4xIDwwLjEuMC0wXG5jb25zdCByZXBsYWNlVGlsZGVzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgcmV0dXJuIGNvbXBcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChjKSA9PiByZXBsYWNlVGlsZGUoYywgb3B0aW9ucykpXG4gICAgLmpvaW4oJyAnKVxufVxuXG5jb25zdCByZXBsYWNlVGlsZGUgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBjb25zdCByID0gb3B0aW9ucy5sb29zZSA/IHJlW3QuVElMREVMT09TRV0gOiByZVt0LlRJTERFXVxuICByZXR1cm4gY29tcC5yZXBsYWNlKHIsIChfLCBNLCBtLCBwLCBwcikgPT4ge1xuICAgIGRlYnVnKCd0aWxkZScsIGNvbXAsIF8sIE0sIG0sIHAsIHByKVxuICAgIGxldCByZXRcblxuICAgIGlmIChpc1goTSkpIHtcbiAgICAgIHJldCA9ICcnXG4gICAgfSBlbHNlIGlmIChpc1gobSkpIHtcbiAgICAgIHJldCA9IGA+PSR7TX0uMC4wIDwkeytNICsgMX0uMC4wLTBgXG4gICAgfSBlbHNlIGlmIChpc1gocCkpIHtcbiAgICAgIC8vIH4xLjIgPT0gPj0xLjIuMCA8MS4zLjAtMFxuICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAgPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9IGVsc2UgaWYgKHByKSB7XG4gICAgICBkZWJ1ZygncmVwbGFjZVRpbGRlIHByJywgcHIpXG4gICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwfS0ke3ByXG4gICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIH4xLjIuMyA9PSA+PTEuMi4zIDwxLjMuMC0wXG4gICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwXG4gICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgfVxuXG4gICAgZGVidWcoJ3RpbGRlIHJldHVybicsIHJldClcbiAgICByZXR1cm4gcmV0XG4gIH0pXG59XG5cbi8vIF4gLS0+ICogKGFueSwga2luZGEgc2lsbHkpXG4vLyBeMiwgXjIueCwgXjIueC54IC0tPiA+PTIuMC4wIDwzLjAuMC0wXG4vLyBeMi4wLCBeMi4wLnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIF4xLjIsIF4xLjIueCAtLT4gPj0xLjIuMCA8Mi4wLjAtMFxuLy8gXjEuMi4zIC0tPiA+PTEuMi4zIDwyLjAuMC0wXG4vLyBeMS4yLjAgLS0+ID49MS4yLjAgPDIuMC4wLTBcbi8vIF4wLjAuMSAtLT4gPj0wLjAuMSA8MC4wLjItMFxuLy8gXjAuMS4wIC0tPiA+PTAuMS4wIDwwLjIuMC0wXG5jb25zdCByZXBsYWNlQ2FyZXRzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgcmV0dXJuIGNvbXBcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChjKSA9PiByZXBsYWNlQ2FyZXQoYywgb3B0aW9ucykpXG4gICAgLmpvaW4oJyAnKVxufVxuXG5jb25zdCByZXBsYWNlQ2FyZXQgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygnY2FyZXQnLCBjb21wLCBvcHRpb25zKVxuICBjb25zdCByID0gb3B0aW9ucy5sb29zZSA/IHJlW3QuQ0FSRVRMT09TRV0gOiByZVt0LkNBUkVUXVxuICBjb25zdCB6ID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/ICctMCcgOiAnJ1xuICByZXR1cm4gY29tcC5yZXBsYWNlKHIsIChfLCBNLCBtLCBwLCBwcikgPT4ge1xuICAgIGRlYnVnKCdjYXJldCcsIGNvbXAsIF8sIE0sIG0sIHAsIHByKVxuICAgIGxldCByZXRcblxuICAgIGlmIChpc1goTSkpIHtcbiAgICAgIHJldCA9ICcnXG4gICAgfSBlbHNlIGlmIChpc1gobSkpIHtcbiAgICAgIHJldCA9IGA+PSR7TX0uMC4wJHt6fSA8JHsrTSArIDF9LjAuMC0wYFxuICAgIH0gZWxzZSBpZiAoaXNYKHApKSB7XG4gICAgICBpZiAoTSA9PT0gJzAnKSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wJHt6fSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAke3p9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcikge1xuICAgICAgZGVidWcoJ3JlcGxhY2VDYXJldCBwcicsIHByKVxuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICBpZiAobSA9PT0gJzAnKSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cH0tJHtwclxuICAgICAgICAgIH0gPCR7TX0uJHttfS4keytwICsgMX0tMGBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwfS0ke3ByXG4gICAgICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwfS0ke3ByXG4gICAgICAgIH0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWcoJ25vIHByJylcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgaWYgKG0gPT09ICcwJykge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgICAgICB9JHt6fSA8JHtNfS4ke219LiR7K3AgKyAxfS0wYFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgICAgICB9JHt6fSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwXG4gICAgICAgIH0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWJ1ZygnY2FyZXQgcmV0dXJuJywgcmV0KVxuICAgIHJldHVybiByZXRcbiAgfSlcbn1cblxuY29uc3QgcmVwbGFjZVhSYW5nZXMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygncmVwbGFjZVhSYW5nZXMnLCBjb21wLCBvcHRpb25zKVxuICByZXR1cm4gY29tcFxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoYykgPT4gcmVwbGFjZVhSYW5nZShjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VYUmFuZ2UgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBjb21wID0gY29tcC50cmltKClcbiAgY29uc3QgciA9IG9wdGlvbnMubG9vc2UgPyByZVt0LlhSQU5HRUxPT1NFXSA6IHJlW3QuWFJBTkdFXVxuICByZXR1cm4gY29tcC5yZXBsYWNlKHIsIChyZXQsIGd0bHQsIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ3hSYW5nZScsIGNvbXAsIHJldCwgZ3RsdCwgTSwgbSwgcCwgcHIpXG4gICAgY29uc3QgeE0gPSBpc1goTSlcbiAgICBjb25zdCB4bSA9IHhNIHx8IGlzWChtKVxuICAgIGNvbnN0IHhwID0geG0gfHwgaXNYKHApXG4gICAgY29uc3QgYW55WCA9IHhwXG5cbiAgICBpZiAoZ3RsdCA9PT0gJz0nICYmIGFueVgpIHtcbiAgICAgIGd0bHQgPSAnJ1xuICAgIH1cblxuICAgIC8vIGlmIHdlJ3JlIGluY2x1ZGluZyBwcmVyZWxlYXNlcyBpbiB0aGUgbWF0Y2gsIHRoZW4gd2UgbmVlZFxuICAgIC8vIHRvIGZpeCB0aGlzIHRvIC0wLCB0aGUgbG93ZXN0IHBvc3NpYmxlIHByZXJlbGVhc2UgdmFsdWVcbiAgICBwciA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyAnLTAnIDogJydcblxuICAgIGlmICh4TSkge1xuICAgICAgaWYgKGd0bHQgPT09ICc+JyB8fCBndGx0ID09PSAnPCcpIHtcbiAgICAgICAgLy8gbm90aGluZyBpcyBhbGxvd2VkXG4gICAgICAgIHJldCA9ICc8MC4wLjAtMCdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vdGhpbmcgaXMgZm9yYmlkZGVuXG4gICAgICAgIHJldCA9ICcqJ1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZ3RsdCAmJiBhbnlYKSB7XG4gICAgICAvLyB3ZSBrbm93IHBhdGNoIGlzIGFuIHgsIGJlY2F1c2Ugd2UgaGF2ZSBhbnkgeCBhdCBhbGwuXG4gICAgICAvLyByZXBsYWNlIFggd2l0aCAwXG4gICAgICBpZiAoeG0pIHtcbiAgICAgICAgbSA9IDBcbiAgICAgIH1cbiAgICAgIHAgPSAwXG5cbiAgICAgIGlmIChndGx0ID09PSAnPicpIHtcbiAgICAgICAgLy8gPjEgPT4gPj0yLjAuMFxuICAgICAgICAvLyA+MS4yID0+ID49MS4zLjBcbiAgICAgICAgZ3RsdCA9ICc+PSdcbiAgICAgICAgaWYgKHhtKSB7XG4gICAgICAgICAgTSA9ICtNICsgMVxuICAgICAgICAgIG0gPSAwXG4gICAgICAgICAgcCA9IDBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtID0gK20gKyAxXG4gICAgICAgICAgcCA9IDBcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChndGx0ID09PSAnPD0nKSB7XG4gICAgICAgIC8vIDw9MC43LnggaXMgYWN0dWFsbHkgPDAuOC4wLCBzaW5jZSBhbnkgMC43Lnggc2hvdWxkXG4gICAgICAgIC8vIHBhc3MuICBTaW1pbGFybHksIDw9Ny54IGlzIGFjdHVhbGx5IDw4LjAuMCwgZXRjLlxuICAgICAgICBndGx0ID0gJzwnXG4gICAgICAgIGlmICh4bSkge1xuICAgICAgICAgIE0gPSArTSArIDFcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtID0gK20gKyAxXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGd0bHQgPT09ICc8Jykge1xuICAgICAgICBwciA9ICctMCdcbiAgICAgIH1cblxuICAgICAgcmV0ID0gYCR7Z3RsdCArIE19LiR7bX0uJHtwfSR7cHJ9YFxuICAgIH0gZWxzZSBpZiAoeG0pIHtcbiAgICAgIHJldCA9IGA+PSR7TX0uMC4wJHtwcn0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICB9IGVsc2UgaWYgKHhwKSB7XG4gICAgICByZXQgPSBgPj0ke019LiR7bX0uMCR7cHJcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9XG5cbiAgICBkZWJ1ZygneFJhbmdlIHJldHVybicsIHJldClcblxuICAgIHJldHVybiByZXRcbiAgfSlcbn1cblxuLy8gQmVjYXVzZSAqIGlzIEFORC1lZCB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgY29tcGFyYXRvcixcbi8vIGFuZCAnJyBtZWFucyBcImFueSB2ZXJzaW9uXCIsIGp1c3QgcmVtb3ZlIHRoZSAqcyBlbnRpcmVseS5cbmNvbnN0IHJlcGxhY2VTdGFycyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdyZXBsYWNlU3RhcnMnLCBjb21wLCBvcHRpb25zKVxuICAvLyBMb29zZW5lc3MgaXMgaWdub3JlZCBoZXJlLiAgc3RhciBpcyBhbHdheXMgYXMgbG9vc2UgYXMgaXQgZ2V0cyFcbiAgcmV0dXJuIGNvbXBcbiAgICAudHJpbSgpXG4gICAgLnJlcGxhY2UocmVbdC5TVEFSXSwgJycpXG59XG5cbmNvbnN0IHJlcGxhY2VHVEUwID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ3JlcGxhY2VHVEUwJywgY29tcCwgb3B0aW9ucylcbiAgcmV0dXJuIGNvbXBcbiAgICAudHJpbSgpXG4gICAgLnJlcGxhY2UocmVbb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHQuR1RFMFBSRSA6IHQuR1RFMF0sICcnKVxufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byBzdHJpbmcucmVwbGFjZShyZVt0LkhZUEhFTlJBTkdFXSlcbi8vIE0sIG0sIHBhdGNoLCBwcmVyZWxlYXNlLCBidWlsZFxuLy8gMS4yIC0gMy40LjUgPT4gPj0xLjIuMCA8PTMuNC41XG4vLyAxLjIuMyAtIDMuNCA9PiA+PTEuMi4wIDwzLjUuMC0wIEFueSAzLjQueCB3aWxsIGRvXG4vLyAxLjIgLSAzLjQgPT4gPj0xLjIuMCA8My41LjAtMFxuLy8gVE9ETyBidWlsZD9cbmNvbnN0IGh5cGhlblJlcGxhY2UgPSBpbmNQciA9PiAoJDAsXG4gIGZyb20sIGZNLCBmbSwgZnAsIGZwciwgZmIsXG4gIHRvLCB0TSwgdG0sIHRwLCB0cHIpID0+IHtcbiAgaWYgKGlzWChmTSkpIHtcbiAgICBmcm9tID0gJydcbiAgfSBlbHNlIGlmIChpc1goZm0pKSB7XG4gICAgZnJvbSA9IGA+PSR7Zk19LjAuMCR7aW5jUHIgPyAnLTAnIDogJyd9YFxuICB9IGVsc2UgaWYgKGlzWChmcCkpIHtcbiAgICBmcm9tID0gYD49JHtmTX0uJHtmbX0uMCR7aW5jUHIgPyAnLTAnIDogJyd9YFxuICB9IGVsc2UgaWYgKGZwcikge1xuICAgIGZyb20gPSBgPj0ke2Zyb219YFxuICB9IGVsc2Uge1xuICAgIGZyb20gPSBgPj0ke2Zyb219JHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH1cblxuICBpZiAoaXNYKHRNKSkge1xuICAgIHRvID0gJydcbiAgfSBlbHNlIGlmIChpc1godG0pKSB7XG4gICAgdG8gPSBgPCR7K3RNICsgMX0uMC4wLTBgXG4gIH0gZWxzZSBpZiAoaXNYKHRwKSkge1xuICAgIHRvID0gYDwke3RNfS4keyt0bSArIDF9LjAtMGBcbiAgfSBlbHNlIGlmICh0cHIpIHtcbiAgICB0byA9IGA8PSR7dE19LiR7dG19LiR7dHB9LSR7dHByfWBcbiAgfSBlbHNlIGlmIChpbmNQcikge1xuICAgIHRvID0gYDwke3RNfS4ke3RtfS4keyt0cCArIDF9LTBgXG4gIH0gZWxzZSB7XG4gICAgdG8gPSBgPD0ke3RvfWBcbiAgfVxuXG4gIHJldHVybiBgJHtmcm9tfSAke3RvfWAudHJpbSgpXG59XG5cbmNvbnN0IHRlc3RTZXQgPSAoc2V0LCB2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFzZXRbaV0udGVzdCh2ZXJzaW9uKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgaWYgKHZlcnNpb24ucHJlcmVsZWFzZS5sZW5ndGggJiYgIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAvLyBGaW5kIHRoZSBzZXQgb2YgdmVyc2lvbnMgdGhhdCBhcmUgYWxsb3dlZCB0byBoYXZlIHByZXJlbGVhc2VzXG4gICAgLy8gRm9yIGV4YW1wbGUsIF4xLjIuMy1wci4xIGRlc3VnYXJzIHRvID49MS4yLjMtcHIuMSA8Mi4wLjBcbiAgICAvLyBUaGF0IHNob3VsZCBhbGxvdyBgMS4yLjMtcHIuMmAgdG8gcGFzcy5cbiAgICAvLyBIb3dldmVyLCBgMS4yLjQtYWxwaGEubm90cmVhZHlgIHNob3VsZCBOT1QgYmUgYWxsb3dlZCxcbiAgICAvLyBldmVuIHRob3VnaCBpdCdzIHdpdGhpbiB0aGUgcmFuZ2Ugc2V0IGJ5IHRoZSBjb21wYXJhdG9ycy5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgZGVidWcoc2V0W2ldLnNlbXZlcilcbiAgICAgIGlmIChzZXRbaV0uc2VtdmVyID09PSBDb21wYXJhdG9yLkFOWSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoc2V0W2ldLnNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYWxsb3dlZCA9IHNldFtpXS5zZW12ZXJcbiAgICAgICAgaWYgKGFsbG93ZWQubWFqb3IgPT09IHZlcnNpb24ubWFqb3IgJiZcbiAgICAgICAgICAgIGFsbG93ZWQubWlub3IgPT09IHZlcnNpb24ubWlub3IgJiZcbiAgICAgICAgICAgIGFsbG93ZWQucGF0Y2ggPT09IHZlcnNpb24ucGF0Y2gpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmVyc2lvbiBoYXMgYSAtcHJlLCBidXQgaXQncyBub3Qgb25lIG9mIHRoZSBvbmVzIHdlIGxpa2UuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgQU5ZID0gU3ltYm9sKCdTZW1WZXIgQU5ZJylcbi8vIGhvaXN0ZWQgY2xhc3MgZm9yIGN5Y2xpYyBkZXBlbmRlbmN5XG5jbGFzcyBDb21wYXJhdG9yIHtcbiAgc3RhdGljIGdldCBBTlkgKCkge1xuICAgIHJldHVybiBBTllcbiAgfVxuXG4gIGNvbnN0cnVjdG9yIChjb21wLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSB7XG4gICAgICBpZiAoY29tcC5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlKSB7XG4gICAgICAgIHJldHVybiBjb21wXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wID0gY29tcC52YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXAgPSBjb21wLnRyaW0oKS5zcGxpdCgvXFxzKy8pLmpvaW4oJyAnKVxuICAgIGRlYnVnKCdjb21wYXJhdG9yJywgY29tcCwgb3B0aW9ucylcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5sb29zZSA9ICEhb3B0aW9ucy5sb29zZVxuICAgIHRoaXMucGFyc2UoY29tcClcblxuICAgIGlmICh0aGlzLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICB0aGlzLnZhbHVlID0gJydcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMub3BlcmF0b3IgKyB0aGlzLnNlbXZlci52ZXJzaW9uXG4gICAgfVxuXG4gICAgZGVidWcoJ2NvbXAnLCB0aGlzKVxuICB9XG5cbiAgcGFyc2UgKGNvbXApIHtcbiAgICBjb25zdCByID0gdGhpcy5vcHRpb25zLmxvb3NlID8gcmVbdC5DT01QQVJBVE9STE9PU0VdIDogcmVbdC5DT01QQVJBVE9SXVxuICAgIGNvbnN0IG0gPSBjb21wLm1hdGNoKHIpXG5cbiAgICBpZiAoIW0pIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgY29tcGFyYXRvcjogJHtjb21wfWApXG4gICAgfVxuXG4gICAgdGhpcy5vcGVyYXRvciA9IG1bMV0gIT09IHVuZGVmaW5lZCA/IG1bMV0gOiAnJ1xuICAgIGlmICh0aGlzLm9wZXJhdG9yID09PSAnPScpIHtcbiAgICAgIHRoaXMub3BlcmF0b3IgPSAnJ1xuICAgIH1cblxuICAgIC8vIGlmIGl0IGxpdGVyYWxseSBpcyBqdXN0ICc+JyBvciAnJyB0aGVuIGFsbG93IGFueXRoaW5nLlxuICAgIGlmICghbVsyXSkge1xuICAgICAgdGhpcy5zZW12ZXIgPSBBTllcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW12ZXIgPSBuZXcgU2VtVmVyKG1bMl0sIHRoaXMub3B0aW9ucy5sb29zZSlcbiAgICB9XG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVcbiAgfVxuXG4gIHRlc3QgKHZlcnNpb24pIHtcbiAgICBkZWJ1ZygnQ29tcGFyYXRvci50ZXN0JywgdmVyc2lvbiwgdGhpcy5vcHRpb25zLmxvb3NlKVxuXG4gICAgaWYgKHRoaXMuc2VtdmVyID09PSBBTlkgfHwgdmVyc2lvbiA9PT0gQU5ZKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIHRoaXMub3B0aW9ucylcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbXAodmVyc2lvbiwgdGhpcy5vcGVyYXRvciwgdGhpcy5zZW12ZXIsIHRoaXMub3B0aW9ucylcbiAgfVxuXG4gIGludGVyc2VjdHMgKGNvbXAsIG9wdGlvbnMpIHtcbiAgICBpZiAoIShjb21wIGluc3RhbmNlb2YgQ29tcGFyYXRvcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgQ29tcGFyYXRvciBpcyByZXF1aXJlZCcpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICcnKSB7XG4gICAgICBpZiAodGhpcy52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmFuZ2UoY29tcC52YWx1ZSwgb3B0aW9ucykudGVzdCh0aGlzLnZhbHVlKVxuICAgIH0gZWxzZSBpZiAoY29tcC5vcGVyYXRvciA9PT0gJycpIHtcbiAgICAgIGlmIChjb21wLnZhbHVlID09PSAnJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnZhbHVlLCBvcHRpb25zKS50ZXN0KGNvbXAuc2VtdmVyKVxuICAgIH1cblxuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIC8vIFNwZWNpYWwgY2FzZXMgd2hlcmUgbm90aGluZyBjYW4gcG9zc2libHkgYmUgbG93ZXJcbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgICAgKHRoaXMudmFsdWUgPT09ICc8MC4wLjAtMCcgfHwgY29tcC52YWx1ZSA9PT0gJzwwLjAuMC0wJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICAgICh0aGlzLnZhbHVlLnN0YXJ0c1dpdGgoJzwwLjAuMCcpIHx8IGNvbXAudmFsdWUuc3RhcnRzV2l0aCgnPDAuMC4wJykpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBTYW1lIGRpcmVjdGlvbiBpbmNyZWFzaW5nICg+IG9yID49KVxuICAgIGlmICh0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gU2FtZSBkaXJlY3Rpb24gZGVjcmVhc2luZyAoPCBvciA8PSlcbiAgICBpZiAodGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIHNhbWUgU2VtVmVyIGFuZCBib3RoIHNpZGVzIGFyZSBpbmNsdXNpdmUgKDw9IG9yID49KVxuICAgIGlmIChcbiAgICAgICh0aGlzLnNlbXZlci52ZXJzaW9uID09PSBjb21wLnNlbXZlci52ZXJzaW9uKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5pbmNsdWRlcygnPScpICYmIGNvbXAub3BlcmF0b3IuaW5jbHVkZXMoJz0nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gb3Bwb3NpdGUgZGlyZWN0aW9ucyBsZXNzIHRoYW5cbiAgICBpZiAoY21wKHRoaXMuc2VtdmVyLCAnPCcsIGNvbXAuc2VtdmVyLCBvcHRpb25zKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIG9wcG9zaXRlIGRpcmVjdGlvbnMgZ3JlYXRlciB0aGFuXG4gICAgaWYgKGNtcCh0aGlzLnNlbXZlciwgJz4nLCBjb21wLnNlbXZlciwgb3B0aW9ucykgJiZcbiAgICAgIHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPCcpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBhcmF0b3JcblxuY29uc3QgcGFyc2VPcHRpb25zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcGFyc2Utb3B0aW9ucycpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcbmNvbnN0IGNtcCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9jbXAnKVxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9kZWJ1ZycpXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2UnKVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHNhdGlzZmllcyA9ICh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICB0cnkge1xuICAgIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiByYW5nZS50ZXN0KHZlcnNpb24pXG59XG5tb2R1bGUuZXhwb3J0cyA9IHNhdGlzZmllc1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcblxuLy8gTW9zdGx5IGp1c3QgZm9yIHRlc3RpbmcgYW5kIGxlZ2FjeSBBUEkgcmVhc29uc1xuY29uc3QgdG9Db21wYXJhdG9ycyA9IChyYW5nZSwgb3B0aW9ucykgPT5cbiAgbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKS5zZXRcbiAgICAubWFwKGNvbXAgPT4gY29tcC5tYXAoYyA9PiBjLnZhbHVlKS5qb2luKCcgJykudHJpbSgpLnNwbGl0KCcgJykpXG5cbm1vZHVsZS5leHBvcnRzID0gdG9Db21wYXJhdG9yc1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcblxuY29uc3QgbWF4U2F0aXNmeWluZyA9ICh2ZXJzaW9ucywgcmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgbGV0IG1heCA9IG51bGxcbiAgbGV0IG1heFNWID0gbnVsbFxuICBsZXQgcmFuZ2VPYmogPSBudWxsXG4gIHRyeSB7XG4gICAgcmFuZ2VPYmogPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICB2ZXJzaW9ucy5mb3JFYWNoKCh2KSA9PiB7XG4gICAgaWYgKHJhbmdlT2JqLnRlc3QodikpIHtcbiAgICAgIC8vIHNhdGlzZmllcyh2LCByYW5nZSwgb3B0aW9ucylcbiAgICAgIGlmICghbWF4IHx8IG1heFNWLmNvbXBhcmUodikgPT09IC0xKSB7XG4gICAgICAgIC8vIGNvbXBhcmUobWF4LCB2LCB0cnVlKVxuICAgICAgICBtYXggPSB2XG4gICAgICAgIG1heFNWID0gbmV3IFNlbVZlcihtYXgsIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gbWF4XG59XG5tb2R1bGUuZXhwb3J0cyA9IG1heFNhdGlzZnlpbmdcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBtaW5TYXRpc2Z5aW5nID0gKHZlcnNpb25zLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICBsZXQgbWluID0gbnVsbFxuICBsZXQgbWluU1YgPSBudWxsXG4gIGxldCByYW5nZU9iaiA9IG51bGxcbiAgdHJ5IHtcbiAgICByYW5nZU9iaiA9IG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHZlcnNpb25zLmZvckVhY2goKHYpID0+IHtcbiAgICBpZiAocmFuZ2VPYmoudGVzdCh2KSkge1xuICAgICAgLy8gc2F0aXNmaWVzKHYsIHJhbmdlLCBvcHRpb25zKVxuICAgICAgaWYgKCFtaW4gfHwgbWluU1YuY29tcGFyZSh2KSA9PT0gMSkge1xuICAgICAgICAvLyBjb21wYXJlKG1pbiwgdiwgdHJ1ZSlcbiAgICAgICAgbWluID0gdlxuICAgICAgICBtaW5TViA9IG5ldyBTZW1WZXIobWluLCBvcHRpb25zKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1pblxufVxubW9kdWxlLmV4cG9ydHMgPSBtaW5TYXRpc2Z5aW5nXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgZ3QgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvZ3QnKVxuXG5jb25zdCBtaW5WZXJzaW9uID0gKHJhbmdlLCBsb29zZSkgPT4ge1xuICByYW5nZSA9IG5ldyBSYW5nZShyYW5nZSwgbG9vc2UpXG5cbiAgbGV0IG1pbnZlciA9IG5ldyBTZW1WZXIoJzAuMC4wJylcbiAgaWYgKHJhbmdlLnRlc3QobWludmVyKSkge1xuICAgIHJldHVybiBtaW52ZXJcbiAgfVxuXG4gIG1pbnZlciA9IG5ldyBTZW1WZXIoJzAuMC4wLTAnKVxuICBpZiAocmFuZ2UudGVzdChtaW52ZXIpKSB7XG4gICAgcmV0dXJuIG1pbnZlclxuICB9XG5cbiAgbWludmVyID0gbnVsbFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlLnNldC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGNvbXBhcmF0b3JzID0gcmFuZ2Uuc2V0W2ldXG5cbiAgICBsZXQgc2V0TWluID0gbnVsbFxuICAgIGNvbXBhcmF0b3JzLmZvckVhY2goKGNvbXBhcmF0b3IpID0+IHtcbiAgICAgIC8vIENsb25lIHRvIGF2b2lkIG1hbmlwdWxhdGluZyB0aGUgY29tcGFyYXRvcidzIHNlbXZlciBvYmplY3QuXG4gICAgICBjb25zdCBjb21wdmVyID0gbmV3IFNlbVZlcihjb21wYXJhdG9yLnNlbXZlci52ZXJzaW9uKVxuICAgICAgc3dpdGNoIChjb21wYXJhdG9yLm9wZXJhdG9yKSB7XG4gICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgIGlmIChjb21wdmVyLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb21wdmVyLnBhdGNoKytcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tcHZlci5wcmVyZWxlYXNlLnB1c2goMClcbiAgICAgICAgICB9XG4gICAgICAgICAgY29tcHZlci5yYXcgPSBjb21wdmVyLmZvcm1hdCgpXG4gICAgICAgICAgLyogZmFsbHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAnJzpcbiAgICAgICAgY2FzZSAnPj0nOlxuICAgICAgICAgIGlmICghc2V0TWluIHx8IGd0KGNvbXB2ZXIsIHNldE1pbikpIHtcbiAgICAgICAgICAgIHNldE1pbiA9IGNvbXB2ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgIGNhc2UgJzw9JzpcbiAgICAgICAgICAvKiBJZ25vcmUgbWF4aW11bSB2ZXJzaW9ucyAqL1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIG9wZXJhdGlvbjogJHtjb21wYXJhdG9yLm9wZXJhdG9yfWApXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoc2V0TWluICYmICghbWludmVyIHx8IGd0KG1pbnZlciwgc2V0TWluKSkpIHtcbiAgICAgIG1pbnZlciA9IHNldE1pblxuICAgIH1cbiAgfVxuXG4gIGlmIChtaW52ZXIgJiYgcmFuZ2UudGVzdChtaW52ZXIpKSB7XG4gICAgcmV0dXJuIG1pbnZlclxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gbWluVmVyc2lvblxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHZhbGlkUmFuZ2UgPSAocmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBSZXR1cm4gJyonIGluc3RlYWQgb2YgJycgc28gdGhhdCB0cnV0aGluZXNzIHdvcmtzLlxuICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBpZiBpdCdzIGludmFsaWQgYW55d2F5XG4gICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucykucmFuZ2UgfHwgJyonXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB2YWxpZFJhbmdlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBDb21wYXJhdG9yID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9jb21wYXJhdG9yJylcbmNvbnN0IHsgQU5ZIH0gPSBDb21wYXJhdG9yXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3Qgc2F0aXNmaWVzID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL3NhdGlzZmllcycpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndCcpXG5jb25zdCBsdCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9sdCcpXG5jb25zdCBsdGUgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvbHRlJylcbmNvbnN0IGd0ZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndGUnKVxuXG5jb25zdCBvdXRzaWRlID0gKHZlcnNpb24sIHJhbmdlLCBoaWxvLCBvcHRpb25zKSA9PiB7XG4gIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuXG4gIGxldCBndGZuLCBsdGVmbiwgbHRmbiwgY29tcCwgZWNvbXBcbiAgc3dpdGNoIChoaWxvKSB7XG4gICAgY2FzZSAnPic6XG4gICAgICBndGZuID0gZ3RcbiAgICAgIGx0ZWZuID0gbHRlXG4gICAgICBsdGZuID0gbHRcbiAgICAgIGNvbXAgPSAnPidcbiAgICAgIGVjb21wID0gJz49J1xuICAgICAgYnJlYWtcbiAgICBjYXNlICc8JzpcbiAgICAgIGd0Zm4gPSBsdFxuICAgICAgbHRlZm4gPSBndGVcbiAgICAgIGx0Zm4gPSBndFxuICAgICAgY29tcCA9ICc8J1xuICAgICAgZWNvbXAgPSAnPD0nXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNdXN0IHByb3ZpZGUgYSBoaWxvIHZhbCBvZiBcIjxcIiBvciBcIj5cIicpXG4gIH1cblxuICAvLyBJZiBpdCBzYXRpc2ZpZXMgdGhlIHJhbmdlIGl0IGlzIG5vdCBvdXRzaWRlXG4gIGlmIChzYXRpc2ZpZXModmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBGcm9tIG5vdyBvbiwgdmFyaWFibGUgdGVybXMgYXJlIGFzIGlmIHdlJ3JlIGluIFwiZ3RyXCIgbW9kZS5cbiAgLy8gYnV0IG5vdGUgdGhhdCBldmVyeXRoaW5nIGlzIGZsaXBwZWQgZm9yIHRoZSBcImx0clwiIGZ1bmN0aW9uLlxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2Uuc2V0Lmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSByYW5nZS5zZXRbaV1cblxuICAgIGxldCBoaWdoID0gbnVsbFxuICAgIGxldCBsb3cgPSBudWxsXG5cbiAgICBjb21wYXJhdG9ycy5mb3JFYWNoKChjb21wYXJhdG9yKSA9PiB7XG4gICAgICBpZiAoY29tcGFyYXRvci5zZW12ZXIgPT09IEFOWSkge1xuICAgICAgICBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoJz49MC4wLjAnKVxuICAgICAgfVxuICAgICAgaGlnaCA9IGhpZ2ggfHwgY29tcGFyYXRvclxuICAgICAgbG93ID0gbG93IHx8IGNvbXBhcmF0b3JcbiAgICAgIGlmIChndGZuKGNvbXBhcmF0b3Iuc2VtdmVyLCBoaWdoLnNlbXZlciwgb3B0aW9ucykpIHtcbiAgICAgICAgaGlnaCA9IGNvbXBhcmF0b3JcbiAgICAgIH0gZWxzZSBpZiAobHRmbihjb21wYXJhdG9yLnNlbXZlciwgbG93LnNlbXZlciwgb3B0aW9ucykpIHtcbiAgICAgICAgbG93ID0gY29tcGFyYXRvclxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBJZiB0aGUgZWRnZSB2ZXJzaW9uIGNvbXBhcmF0b3IgaGFzIGEgb3BlcmF0b3IgdGhlbiBvdXIgdmVyc2lvblxuICAgIC8vIGlzbid0IG91dHNpZGUgaXRcbiAgICBpZiAoaGlnaC5vcGVyYXRvciA9PT0gY29tcCB8fCBoaWdoLm9wZXJhdG9yID09PSBlY29tcCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGxvd2VzdCB2ZXJzaW9uIGNvbXBhcmF0b3IgaGFzIGFuIG9wZXJhdG9yIGFuZCBvdXIgdmVyc2lvblxuICAgIC8vIGlzIGxlc3MgdGhhbiBpdCB0aGVuIGl0IGlzbid0IGhpZ2hlciB0aGFuIHRoZSByYW5nZVxuICAgIGlmICgoIWxvdy5vcGVyYXRvciB8fCBsb3cub3BlcmF0b3IgPT09IGNvbXApICYmXG4gICAgICAgIGx0ZWZuKHZlcnNpb24sIGxvdy5zZW12ZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKGxvdy5vcGVyYXRvciA9PT0gZWNvbXAgJiYgbHRmbih2ZXJzaW9uLCBsb3cuc2VtdmVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3V0c2lkZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuLy8gRGV0ZXJtaW5lIGlmIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIGFsbCB0aGUgdmVyc2lvbnMgcG9zc2libGUgaW4gdGhlIHJhbmdlLlxuY29uc3Qgb3V0c2lkZSA9IHJlcXVpcmUoJy4vb3V0c2lkZScpXG5jb25zdCBndHIgPSAodmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IG91dHNpZGUodmVyc2lvbiwgcmFuZ2UsICc+Jywgb3B0aW9ucylcbm1vZHVsZS5leHBvcnRzID0gZ3RyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBvdXRzaWRlID0gcmVxdWlyZSgnLi9vdXRzaWRlJylcbi8vIERldGVybWluZSBpZiB2ZXJzaW9uIGlzIGxlc3MgdGhhbiBhbGwgdGhlIHZlcnNpb25zIHBvc3NpYmxlIGluIHRoZSByYW5nZVxuY29uc3QgbHRyID0gKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKSA9PiBvdXRzaWRlKHZlcnNpb24sIHJhbmdlLCAnPCcsIG9wdGlvbnMpXG5tb2R1bGUuZXhwb3J0cyA9IGx0clxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IGludGVyc2VjdHMgPSAocjEsIHIyLCBvcHRpb25zKSA9PiB7XG4gIHIxID0gbmV3IFJhbmdlKHIxLCBvcHRpb25zKVxuICByMiA9IG5ldyBSYW5nZShyMiwgb3B0aW9ucylcbiAgcmV0dXJuIHIxLmludGVyc2VjdHMocjIsIG9wdGlvbnMpXG59XG5tb2R1bGUuZXhwb3J0cyA9IGludGVyc2VjdHNcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8vIGdpdmVuIGEgc2V0IG9mIHZlcnNpb25zIGFuZCBhIHJhbmdlLCBjcmVhdGUgYSBcInNpbXBsaWZpZWRcIiByYW5nZVxuLy8gdGhhdCBpbmNsdWRlcyB0aGUgc2FtZSB2ZXJzaW9ucyB0aGF0IHRoZSBvcmlnaW5hbCByYW5nZSBkb2VzXG4vLyBJZiB0aGUgb3JpZ2luYWwgcmFuZ2UgaXMgc2hvcnRlciB0aGFuIHRoZSBzaW1wbGlmaWVkIG9uZSwgcmV0dXJuIHRoYXQuXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvc2F0aXNmaWVzLmpzJylcbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvY29tcGFyZS5qcycpXG5tb2R1bGUuZXhwb3J0cyA9ICh2ZXJzaW9ucywgcmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qgc2V0ID0gW11cbiAgbGV0IGZpcnN0ID0gbnVsbFxuICBsZXQgcHJldiA9IG51bGxcbiAgY29uc3QgdiA9IHZlcnNpb25zLnNvcnQoKGEsIGIpID0+IGNvbXBhcmUoYSwgYiwgb3B0aW9ucykpXG4gIGZvciAoY29uc3QgdmVyc2lvbiBvZiB2KSB7XG4gICAgY29uc3QgaW5jbHVkZWQgPSBzYXRpc2ZpZXModmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpXG4gICAgaWYgKGluY2x1ZGVkKSB7XG4gICAgICBwcmV2ID0gdmVyc2lvblxuICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICBmaXJzdCA9IHZlcnNpb25cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgc2V0LnB1c2goW2ZpcnN0LCBwcmV2XSlcbiAgICAgIH1cbiAgICAgIHByZXYgPSBudWxsXG4gICAgICBmaXJzdCA9IG51bGxcbiAgICB9XG4gIH1cbiAgaWYgKGZpcnN0KSB7XG4gICAgc2V0LnB1c2goW2ZpcnN0LCBudWxsXSlcbiAgfVxuXG4gIGNvbnN0IHJhbmdlcyA9IFtdXG4gIGZvciAoY29uc3QgW21pbiwgbWF4XSBvZiBzZXQpIHtcbiAgICBpZiAobWluID09PSBtYXgpIHtcbiAgICAgIHJhbmdlcy5wdXNoKG1pbilcbiAgICB9IGVsc2UgaWYgKCFtYXggJiYgbWluID09PSB2WzBdKSB7XG4gICAgICByYW5nZXMucHVzaCgnKicpXG4gICAgfSBlbHNlIGlmICghbWF4KSB7XG4gICAgICByYW5nZXMucHVzaChgPj0ke21pbn1gKVxuICAgIH0gZWxzZSBpZiAobWluID09PSB2WzBdKSB7XG4gICAgICByYW5nZXMucHVzaChgPD0ke21heH1gKVxuICAgIH0gZWxzZSB7XG4gICAgICByYW5nZXMucHVzaChgJHttaW59IC0gJHttYXh9YClcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2ltcGxpZmllZCA9IHJhbmdlcy5qb2luKCcgfHwgJylcbiAgY29uc3Qgb3JpZ2luYWwgPSB0eXBlb2YgcmFuZ2UucmF3ID09PSAnc3RyaW5nJyA/IHJhbmdlLnJhdyA6IFN0cmluZyhyYW5nZSlcbiAgcmV0dXJuIHNpbXBsaWZpZWQubGVuZ3RoIDwgb3JpZ2luYWwubGVuZ3RoID8gc2ltcGxpZmllZCA6IHJhbmdlXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UuanMnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvY29tcGFyYXRvci5qcycpXG5jb25zdCB7IEFOWSB9ID0gQ29tcGFyYXRvclxuY29uc3Qgc2F0aXNmaWVzID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL3NhdGlzZmllcy5qcycpXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2NvbXBhcmUuanMnKVxuXG4vLyBDb21wbGV4IHJhbmdlIGByMSB8fCByMiB8fCAuLi5gIGlzIGEgc3Vic2V0IG9mIGBSMSB8fCBSMiB8fCAuLi5gIGlmZjpcbi8vIC0gRXZlcnkgc2ltcGxlIHJhbmdlIGByMSwgcjIsIC4uLmAgaXMgYSBudWxsIHNldCwgT1Jcbi8vIC0gRXZlcnkgc2ltcGxlIHJhbmdlIGByMSwgcjIsIC4uLmAgd2hpY2ggaXMgbm90IGEgbnVsbCBzZXQgaXMgYSBzdWJzZXQgb2Zcbi8vICAgc29tZSBgUjEsIFIyLCAuLi5gXG4vL1xuLy8gU2ltcGxlIHJhbmdlIGBjMSBjMiAuLi5gIGlzIGEgc3Vic2V0IG9mIHNpbXBsZSByYW5nZSBgQzEgQzIgLi4uYCBpZmY6XG4vLyAtIElmIGMgaXMgb25seSB0aGUgQU5ZIGNvbXBhcmF0b3Jcbi8vICAgLSBJZiBDIGlzIG9ubHkgdGhlIEFOWSBjb21wYXJhdG9yLCByZXR1cm4gdHJ1ZVxuLy8gICAtIEVsc2UgaWYgaW4gcHJlcmVsZWFzZSBtb2RlLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBlbHNlIHJlcGxhY2UgYyB3aXRoIGBbPj0wLjAuMF1gXG4vLyAtIElmIEMgaXMgb25seSB0aGUgQU5ZIGNvbXBhcmF0b3Jcbi8vICAgLSBpZiBpbiBwcmVyZWxlYXNlIG1vZGUsIHJldHVybiB0cnVlXG4vLyAgIC0gZWxzZSByZXBsYWNlIEMgd2l0aCBgWz49MC4wLjBdYFxuLy8gLSBMZXQgRVEgYmUgdGhlIHNldCBvZiA9IGNvbXBhcmF0b3JzIGluIGNcbi8vIC0gSWYgRVEgaXMgbW9yZSB0aGFuIG9uZSwgcmV0dXJuIHRydWUgKG51bGwgc2V0KVxuLy8gLSBMZXQgR1QgYmUgdGhlIGhpZ2hlc3QgPiBvciA+PSBjb21wYXJhdG9yIGluIGNcbi8vIC0gTGV0IExUIGJlIHRoZSBsb3dlc3QgPCBvciA8PSBjb21wYXJhdG9yIGluIGNcbi8vIC0gSWYgR1QgYW5kIExULCBhbmQgR1Quc2VtdmVyID4gTFQuc2VtdmVyLCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAtIElmIGFueSBDIGlzIGEgPSByYW5nZSwgYW5kIEdUIG9yIExUIGFyZSBzZXQsIHJldHVybiBmYWxzZVxuLy8gLSBJZiBFUVxuLy8gICAtIElmIEdULCBhbmQgRVEgZG9lcyBub3Qgc2F0aXNmeSBHVCwgcmV0dXJuIHRydWUgKG51bGwgc2V0KVxuLy8gICAtIElmIExULCBhbmQgRVEgZG9lcyBub3Qgc2F0aXNmeSBMVCwgcmV0dXJuIHRydWUgKG51bGwgc2V0KVxuLy8gICAtIElmIEVRIHNhdGlzZmllcyBldmVyeSBDLCByZXR1cm4gdHJ1ZVxuLy8gICAtIEVsc2UgcmV0dXJuIGZhbHNlXG4vLyAtIElmIEdUXG4vLyAgIC0gSWYgR1Quc2VtdmVyIGlzIGxvd2VyIHRoYW4gYW55ID4gb3IgPj0gY29tcCBpbiBDLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBJZiBHVCBpcyA+PSwgYW5kIEdULnNlbXZlciBkb2VzIG5vdCBzYXRpc2Z5IGV2ZXJ5IEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIEdULnNlbXZlciBoYXMgYSBwcmVyZWxlYXNlLCBhbmQgbm90IGluIHByZXJlbGVhc2UgbW9kZVxuLy8gICAgIC0gSWYgbm8gQyBoYXMgYSBwcmVyZWxlYXNlIGFuZCB0aGUgR1Quc2VtdmVyIHR1cGxlLCByZXR1cm4gZmFsc2Vcbi8vIC0gSWYgTFRcbi8vICAgLSBJZiBMVC5zZW12ZXIgaXMgZ3JlYXRlciB0aGFuIGFueSA8IG9yIDw9IGNvbXAgaW4gQywgcmV0dXJuIGZhbHNlXG4vLyAgIC0gSWYgTFQgaXMgPD0sIGFuZCBMVC5zZW12ZXIgZG9lcyBub3Qgc2F0aXNmeSBldmVyeSBDLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBJZiBHVC5zZW12ZXIgaGFzIGEgcHJlcmVsZWFzZSwgYW5kIG5vdCBpbiBwcmVyZWxlYXNlIG1vZGVcbi8vICAgICAtIElmIG5vIEMgaGFzIGEgcHJlcmVsZWFzZSBhbmQgdGhlIExULnNlbXZlciB0dXBsZSwgcmV0dXJuIGZhbHNlXG4vLyAtIEVsc2UgcmV0dXJuIHRydWVcblxuY29uc3Qgc3Vic2V0ID0gKHN1YiwgZG9tLCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKHN1YiA9PT0gZG9tKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHN1YiA9IG5ldyBSYW5nZShzdWIsIG9wdGlvbnMpXG4gIGRvbSA9IG5ldyBSYW5nZShkb20sIG9wdGlvbnMpXG4gIGxldCBzYXdOb25OdWxsID0gZmFsc2VcblxuICBPVVRFUjogZm9yIChjb25zdCBzaW1wbGVTdWIgb2Ygc3ViLnNldCkge1xuICAgIGZvciAoY29uc3Qgc2ltcGxlRG9tIG9mIGRvbS5zZXQpIHtcbiAgICAgIGNvbnN0IGlzU3ViID0gc2ltcGxlU3Vic2V0KHNpbXBsZVN1Yiwgc2ltcGxlRG9tLCBvcHRpb25zKVxuICAgICAgc2F3Tm9uTnVsbCA9IHNhd05vbk51bGwgfHwgaXNTdWIgIT09IG51bGxcbiAgICAgIGlmIChpc1N1Yikge1xuICAgICAgICBjb250aW51ZSBPVVRFUlxuICAgICAgfVxuICAgIH1cbiAgICAvLyB0aGUgbnVsbCBzZXQgaXMgYSBzdWJzZXQgb2YgZXZlcnl0aGluZywgYnV0IG51bGwgc2ltcGxlIHJhbmdlcyBpblxuICAgIC8vIGEgY29tcGxleCByYW5nZSBzaG91bGQgYmUgaWdub3JlZC4gIHNvIGlmIHdlIHNhdyBhIG5vbi1udWxsIHJhbmdlLFxuICAgIC8vIHRoZW4gd2Uga25vdyB0aGlzIGlzbid0IGEgc3Vic2V0LCBidXQgaWYgRVZFUlkgc2ltcGxlIHJhbmdlIHdhcyBudWxsLFxuICAgIC8vIHRoZW4gaXQgaXMgYSBzdWJzZXQuXG4gICAgaWYgKHNhd05vbk51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5jb25zdCBtaW5pbXVtVmVyc2lvbldpdGhQcmVSZWxlYXNlID0gW25ldyBDb21wYXJhdG9yKCc+PTAuMC4wLTAnKV1cbmNvbnN0IG1pbmltdW1WZXJzaW9uID0gW25ldyBDb21wYXJhdG9yKCc+PTAuMC4wJyldXG5cbmNvbnN0IHNpbXBsZVN1YnNldCA9IChzdWIsIGRvbSwgb3B0aW9ucykgPT4ge1xuICBpZiAoc3ViID09PSBkb20pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHN1Yi5sZW5ndGggPT09IDEgJiYgc3ViWzBdLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgaWYgKGRvbS5sZW5ndGggPT09IDEgJiYgZG9tWzBdLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgICAgc3ViID0gbWluaW11bVZlcnNpb25XaXRoUHJlUmVsZWFzZVxuICAgIH0gZWxzZSB7XG4gICAgICBzdWIgPSBtaW5pbXVtVmVyc2lvblxuICAgIH1cbiAgfVxuXG4gIGlmIChkb20ubGVuZ3RoID09PSAxICYmIGRvbVswXS5zZW12ZXIgPT09IEFOWSkge1xuICAgIGlmIChvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICBkb20gPSBtaW5pbXVtVmVyc2lvblxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGVxU2V0ID0gbmV3IFNldCgpXG4gIGxldCBndCwgbHRcbiAgZm9yIChjb25zdCBjIG9mIHN1Yikge1xuICAgIGlmIChjLm9wZXJhdG9yID09PSAnPicgfHwgYy5vcGVyYXRvciA9PT0gJz49Jykge1xuICAgICAgZ3QgPSBoaWdoZXJHVChndCwgYywgb3B0aW9ucylcbiAgICB9IGVsc2UgaWYgKGMub3BlcmF0b3IgPT09ICc8JyB8fCBjLm9wZXJhdG9yID09PSAnPD0nKSB7XG4gICAgICBsdCA9IGxvd2VyTFQobHQsIGMsIG9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVxU2V0LmFkZChjLnNlbXZlcilcbiAgICB9XG4gIH1cblxuICBpZiAoZXFTZXQuc2l6ZSA+IDEpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgbGV0IGd0bHRDb21wXG4gIGlmIChndCAmJiBsdCkge1xuICAgIGd0bHRDb21wID0gY29tcGFyZShndC5zZW12ZXIsIGx0LnNlbXZlciwgb3B0aW9ucylcbiAgICBpZiAoZ3RsdENvbXAgPiAwKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0gZWxzZSBpZiAoZ3RsdENvbXAgPT09IDAgJiYgKGd0Lm9wZXJhdG9yICE9PSAnPj0nIHx8IGx0Lm9wZXJhdG9yICE9PSAnPD0nKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvLyB3aWxsIGl0ZXJhdGUgb25lIG9yIHplcm8gdGltZXNcbiAgZm9yIChjb25zdCBlcSBvZiBlcVNldCkge1xuICAgIGlmIChndCAmJiAhc2F0aXNmaWVzKGVxLCBTdHJpbmcoZ3QpLCBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBpZiAobHQgJiYgIXNhdGlzZmllcyhlcSwgU3RyaW5nKGx0KSwgb3B0aW9ucykpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjIG9mIGRvbSkge1xuICAgICAgaWYgKCFzYXRpc2ZpZXMoZXEsIFN0cmluZyhjKSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGxldCBoaWdoZXIsIGxvd2VyXG4gIGxldCBoYXNEb21MVCwgaGFzRG9tR1RcbiAgLy8gaWYgdGhlIHN1YnNldCBoYXMgYSBwcmVyZWxlYXNlLCB3ZSBuZWVkIGEgY29tcGFyYXRvciBpbiB0aGUgc3VwZXJzZXRcbiAgLy8gd2l0aCB0aGUgc2FtZSB0dXBsZSBhbmQgYSBwcmVyZWxlYXNlLCBvciBpdCdzIG5vdCBhIHN1YnNldFxuICBsZXQgbmVlZERvbUxUUHJlID0gbHQgJiZcbiAgICAhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgIGx0LnNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCA/IGx0LnNlbXZlciA6IGZhbHNlXG4gIGxldCBuZWVkRG9tR1RQcmUgPSBndCAmJlxuICAgICFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmXG4gICAgZ3Quc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID8gZ3Quc2VtdmVyIDogZmFsc2VcbiAgLy8gZXhjZXB0aW9uOiA8MS4yLjMtMCBpcyB0aGUgc2FtZSBhcyA8MS4yLjNcbiAgaWYgKG5lZWREb21MVFByZSAmJiBuZWVkRG9tTFRQcmUucHJlcmVsZWFzZS5sZW5ndGggPT09IDEgJiZcbiAgICAgIGx0Lm9wZXJhdG9yID09PSAnPCcgJiYgbmVlZERvbUxUUHJlLnByZXJlbGVhc2VbMF0gPT09IDApIHtcbiAgICBuZWVkRG9tTFRQcmUgPSBmYWxzZVxuICB9XG5cbiAgZm9yIChjb25zdCBjIG9mIGRvbSkge1xuICAgIGhhc0RvbUdUID0gaGFzRG9tR1QgfHwgYy5vcGVyYXRvciA9PT0gJz4nIHx8IGMub3BlcmF0b3IgPT09ICc+PSdcbiAgICBoYXNEb21MVCA9IGhhc0RvbUxUIHx8IGMub3BlcmF0b3IgPT09ICc8JyB8fCBjLm9wZXJhdG9yID09PSAnPD0nXG4gICAgaWYgKGd0KSB7XG4gICAgICBpZiAobmVlZERvbUdUUHJlKSB7XG4gICAgICAgIGlmIChjLnNlbXZlci5wcmVyZWxlYXNlICYmIGMuc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoICYmXG4gICAgICAgICAgICBjLnNlbXZlci5tYWpvciA9PT0gbmVlZERvbUdUUHJlLm1ham9yICYmXG4gICAgICAgICAgICBjLnNlbXZlci5taW5vciA9PT0gbmVlZERvbUdUUHJlLm1pbm9yICYmXG4gICAgICAgICAgICBjLnNlbXZlci5wYXRjaCA9PT0gbmVlZERvbUdUUHJlLnBhdGNoKSB7XG4gICAgICAgICAgbmVlZERvbUdUUHJlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGMub3BlcmF0b3IgPT09ICc+JyB8fCBjLm9wZXJhdG9yID09PSAnPj0nKSB7XG4gICAgICAgIGhpZ2hlciA9IGhpZ2hlckdUKGd0LCBjLCBvcHRpb25zKVxuICAgICAgICBpZiAoaGlnaGVyID09PSBjICYmIGhpZ2hlciAhPT0gZ3QpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChndC5vcGVyYXRvciA9PT0gJz49JyAmJiAhc2F0aXNmaWVzKGd0LnNlbXZlciwgU3RyaW5nKGMpLCBvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGx0KSB7XG4gICAgICBpZiAobmVlZERvbUxUUHJlKSB7XG4gICAgICAgIGlmIChjLnNlbXZlci5wcmVyZWxlYXNlICYmIGMuc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoICYmXG4gICAgICAgICAgICBjLnNlbXZlci5tYWpvciA9PT0gbmVlZERvbUxUUHJlLm1ham9yICYmXG4gICAgICAgICAgICBjLnNlbXZlci5taW5vciA9PT0gbmVlZERvbUxUUHJlLm1pbm9yICYmXG4gICAgICAgICAgICBjLnNlbXZlci5wYXRjaCA9PT0gbmVlZERvbUxUUHJlLnBhdGNoKSB7XG4gICAgICAgICAgbmVlZERvbUxUUHJlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGMub3BlcmF0b3IgPT09ICc8JyB8fCBjLm9wZXJhdG9yID09PSAnPD0nKSB7XG4gICAgICAgIGxvd2VyID0gbG93ZXJMVChsdCwgYywgb3B0aW9ucylcbiAgICAgICAgaWYgKGxvd2VyID09PSBjICYmIGxvd2VyICE9PSBsdCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGx0Lm9wZXJhdG9yID09PSAnPD0nICYmICFzYXRpc2ZpZXMobHQuc2VtdmVyLCBTdHJpbmcoYyksIG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWMub3BlcmF0b3IgJiYgKGx0IHx8IGd0KSAmJiBndGx0Q29tcCAhPT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlcmUgd2FzIGEgPCBvciA+LCBhbmQgbm90aGluZyBpbiB0aGUgZG9tLCB0aGVuIG11c3QgYmUgZmFsc2VcbiAgLy8gVU5MRVNTIGl0IHdhcyBsaW1pdGVkIGJ5IGFub3RoZXIgcmFuZ2UgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi5cbiAgLy8gRWcsID4xLjAuMCA8MS4wLjEgaXMgc3RpbGwgYSBzdWJzZXQgb2YgPDIuMC4wXG4gIGlmIChndCAmJiBoYXNEb21MVCAmJiAhbHQgJiYgZ3RsdENvbXAgIT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChsdCAmJiBoYXNEb21HVCAmJiAhZ3QgJiYgZ3RsdENvbXAgIT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIHdlIG5lZWRlZCBhIHByZXJlbGVhc2UgcmFuZ2UgaW4gYSBzcGVjaWZpYyB0dXBsZSwgYnV0IGRpZG4ndCBnZXQgb25lXG4gIC8vIHRoZW4gdGhpcyBpc24ndCBhIHN1YnNldC4gIGVnID49MS4yLjMtcHJlIGlzIG5vdCBhIHN1YnNldCBvZiA+PTEuMC4wLFxuICAvLyBiZWNhdXNlIGl0IGluY2x1ZGVzIHByZXJlbGVhc2VzIGluIHRoZSAxLjIuMyB0dXBsZVxuICBpZiAobmVlZERvbUdUUHJlIHx8IG5lZWREb21MVFByZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLy8gPj0xLjIuMyBpcyBsb3dlciB0aGFuID4xLjIuM1xuY29uc3QgaGlnaGVyR1QgPSAoYSwgYiwgb3B0aW9ucykgPT4ge1xuICBpZiAoIWEpIHtcbiAgICByZXR1cm4gYlxuICB9XG4gIGNvbnN0IGNvbXAgPSBjb21wYXJlKGEuc2VtdmVyLCBiLnNlbXZlciwgb3B0aW9ucylcbiAgcmV0dXJuIGNvbXAgPiAwID8gYVxuICAgIDogY29tcCA8IDAgPyBiXG4gICAgOiBiLm9wZXJhdG9yID09PSAnPicgJiYgYS5vcGVyYXRvciA9PT0gJz49JyA/IGJcbiAgICA6IGFcbn1cblxuLy8gPD0xLjIuMyBpcyBoaWdoZXIgdGhhbiA8MS4yLjNcbmNvbnN0IGxvd2VyTFQgPSAoYSwgYiwgb3B0aW9ucykgPT4ge1xuICBpZiAoIWEpIHtcbiAgICByZXR1cm4gYlxuICB9XG4gIGNvbnN0IGNvbXAgPSBjb21wYXJlKGEuc2VtdmVyLCBiLnNlbXZlciwgb3B0aW9ucylcbiAgcmV0dXJuIGNvbXAgPCAwID8gYVxuICAgIDogY29tcCA+IDAgPyBiXG4gICAgOiBiLm9wZXJhdG9yID09PSAnPCcgJiYgYS5vcGVyYXRvciA9PT0gJzw9JyA/IGJcbiAgICA6IGFcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdWJzZXRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8vIGp1c3QgcHJlLWxvYWQgYWxsIHRoZSBzdHVmZiB0aGF0IGluZGV4LmpzIGxhemlseSBleHBvcnRzXG5jb25zdCBpbnRlcm5hbFJlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9yZScpXG5jb25zdCBjb25zdGFudHMgPSByZXF1aXJlKCcuL2ludGVybmFsL2NvbnN0YW50cycpXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGlkZW50aWZpZXJzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9pZGVudGlmaWVycycpXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3BhcnNlJylcbmNvbnN0IHZhbGlkID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvdmFsaWQnKVxuY29uc3QgY2xlYW4gPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jbGVhbicpXG5jb25zdCBpbmMgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9pbmMnKVxuY29uc3QgZGlmZiA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2RpZmYnKVxuY29uc3QgbWFqb3IgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9tYWpvcicpXG5jb25zdCBtaW5vciA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL21pbm9yJylcbmNvbnN0IHBhdGNoID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcGF0Y2gnKVxuY29uc3QgcHJlcmVsZWFzZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3ByZXJlbGVhc2UnKVxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvbXBhcmUnKVxuY29uc3QgcmNvbXBhcmUgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9yY29tcGFyZScpXG5jb25zdCBjb21wYXJlTG9vc2UgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jb21wYXJlLWxvb3NlJylcbmNvbnN0IGNvbXBhcmVCdWlsZCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvbXBhcmUtYnVpbGQnKVxuY29uc3Qgc29ydCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3NvcnQnKVxuY29uc3QgcnNvcnQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9yc29ydCcpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2d0JylcbmNvbnN0IGx0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbHQnKVxuY29uc3QgZXEgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9lcScpXG5jb25zdCBuZXEgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9uZXEnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZ3RlJylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2x0ZScpXG5jb25zdCBjbXAgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jbXAnKVxuY29uc3QgY29lcmNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29lcmNlJylcbmNvbnN0IENvbXBhcmF0b3IgPSByZXF1aXJlKCcuL2NsYXNzZXMvY29tcGFyYXRvcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9zYXRpc2ZpZXMnKVxuY29uc3QgdG9Db21wYXJhdG9ycyA9IHJlcXVpcmUoJy4vcmFuZ2VzL3RvLWNvbXBhcmF0b3JzJylcbmNvbnN0IG1heFNhdGlzZnlpbmcgPSByZXF1aXJlKCcuL3Jhbmdlcy9tYXgtc2F0aXNmeWluZycpXG5jb25zdCBtaW5TYXRpc2Z5aW5nID0gcmVxdWlyZSgnLi9yYW5nZXMvbWluLXNhdGlzZnlpbmcnKVxuY29uc3QgbWluVmVyc2lvbiA9IHJlcXVpcmUoJy4vcmFuZ2VzL21pbi12ZXJzaW9uJylcbmNvbnN0IHZhbGlkUmFuZ2UgPSByZXF1aXJlKCcuL3Jhbmdlcy92YWxpZCcpXG5jb25zdCBvdXRzaWRlID0gcmVxdWlyZSgnLi9yYW5nZXMvb3V0c2lkZScpXG5jb25zdCBndHIgPSByZXF1aXJlKCcuL3Jhbmdlcy9ndHInKVxuY29uc3QgbHRyID0gcmVxdWlyZSgnLi9yYW5nZXMvbHRyJylcbmNvbnN0IGludGVyc2VjdHMgPSByZXF1aXJlKCcuL3Jhbmdlcy9pbnRlcnNlY3RzJylcbmNvbnN0IHNpbXBsaWZ5UmFuZ2UgPSByZXF1aXJlKCcuL3Jhbmdlcy9zaW1wbGlmeScpXG5jb25zdCBzdWJzZXQgPSByZXF1aXJlKCcuL3Jhbmdlcy9zdWJzZXQnKVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBhcnNlLFxuICB2YWxpZCxcbiAgY2xlYW4sXG4gIGluYyxcbiAgZGlmZixcbiAgbWFqb3IsXG4gIG1pbm9yLFxuICBwYXRjaCxcbiAgcHJlcmVsZWFzZSxcbiAgY29tcGFyZSxcbiAgcmNvbXBhcmUsXG4gIGNvbXBhcmVMb29zZSxcbiAgY29tcGFyZUJ1aWxkLFxuICBzb3J0LFxuICByc29ydCxcbiAgZ3QsXG4gIGx0LFxuICBlcSxcbiAgbmVxLFxuICBndGUsXG4gIGx0ZSxcbiAgY21wLFxuICBjb2VyY2UsXG4gIENvbXBhcmF0b3IsXG4gIFJhbmdlLFxuICBzYXRpc2ZpZXMsXG4gIHRvQ29tcGFyYXRvcnMsXG4gIG1heFNhdGlzZnlpbmcsXG4gIG1pblNhdGlzZnlpbmcsXG4gIG1pblZlcnNpb24sXG4gIHZhbGlkUmFuZ2UsXG4gIG91dHNpZGUsXG4gIGd0cixcbiAgbHRyLFxuICBpbnRlcnNlY3RzLFxuICBzaW1wbGlmeVJhbmdlLFxuICBzdWJzZXQsXG4gIFNlbVZlcixcbiAgcmU6IGludGVybmFsUmUucmUsXG4gIHNyYzogaW50ZXJuYWxSZS5zcmMsXG4gIHRva2VuczogaW50ZXJuYWxSZS50LFxuICBTRU1WRVJfU1BFQ19WRVJTSU9OOiBjb25zdGFudHMuU0VNVkVSX1NQRUNfVkVSU0lPTixcbiAgUkVMRUFTRV9UWVBFUzogY29uc3RhbnRzLlJFTEVBU0VfVFlQRVMsXG4gIGNvbXBhcmVJZGVudGlmaWVyczogaWRlbnRpZmllcnMuY29tcGFyZUlkZW50aWZpZXJzLFxuICByY29tcGFyZUlkZW50aWZpZXJzOiBpZGVudGlmaWVycy5yY29tcGFyZUlkZW50aWZpZXJzLFxufVxuIiwKICAgICJjb25zdCBzZW12ZXIgPSByZXF1aXJlKCdzZW12ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZW12ZXIuc2F0aXNmaWVzKHByb2Nlc3MudmVyc2lvbiwgJz49MTUuNy4wJyk7XG4iLAogICAgImNvbnN0IHNlbXZlciA9IHJlcXVpcmUoJ3NlbXZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbXZlci5zYXRpc2ZpZXMocHJvY2Vzcy52ZXJzaW9uLCAnPj0xNi45LjAnKTtcbiIsCiAgICAiY29uc3QgQVNZTU1FVFJJQ19LRVlfREVUQUlMU19TVVBQT1JURUQgPSByZXF1aXJlKCcuL2FzeW1tZXRyaWNLZXlEZXRhaWxzU3VwcG9ydGVkJyk7XG5jb25zdCBSU0FfUFNTX0tFWV9ERVRBSUxTX1NVUFBPUlRFRCA9IHJlcXVpcmUoJy4vcnNhUHNzS2V5RGV0YWlsc1N1cHBvcnRlZCcpO1xuXG5jb25zdCBhbGxvd2VkQWxnb3JpdGhtc0ZvcktleXMgPSB7XG4gICdlYyc6IFsnRVMyNTYnLCAnRVMzODQnLCAnRVM1MTInXSxcbiAgJ3JzYSc6IFsnUlMyNTYnLCAnUFMyNTYnLCAnUlMzODQnLCAnUFMzODQnLCAnUlM1MTInLCAnUFM1MTInXSxcbiAgJ3JzYS1wc3MnOiBbJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJ11cbn07XG5cbmNvbnN0IGFsbG93ZWRDdXJ2ZXMgPSB7XG4gIEVTMjU2OiAncHJpbWUyNTZ2MScsXG4gIEVTMzg0OiAnc2VjcDM4NHIxJyxcbiAgRVM1MTI6ICdzZWNwNTIxcjEnLFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihhbGdvcml0aG0sIGtleSkge1xuICBpZiAoIWFsZ29yaXRobSB8fCAha2V5KSByZXR1cm47XG5cbiAgY29uc3Qga2V5VHlwZSA9IGtleS5hc3ltbWV0cmljS2V5VHlwZTtcbiAgaWYgKCFrZXlUeXBlKSByZXR1cm47XG5cbiAgY29uc3QgYWxsb3dlZEFsZ29yaXRobXMgPSBhbGxvd2VkQWxnb3JpdGhtc0ZvcktleXNba2V5VHlwZV07XG5cbiAgaWYgKCFhbGxvd2VkQWxnb3JpdGhtcykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBrZXkgdHlwZSBcIiR7a2V5VHlwZX1cIi5gKTtcbiAgfVxuXG4gIGlmICghYWxsb3dlZEFsZ29yaXRobXMuaW5jbHVkZXMoYWxnb3JpdGhtKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgXCJhbGdcIiBwYXJhbWV0ZXIgZm9yIFwiJHtrZXlUeXBlfVwiIGtleSB0eXBlIG11c3QgYmUgb25lIG9mOiAke2FsbG93ZWRBbGdvcml0aG1zLmpvaW4oJywgJyl9LmApXG4gIH1cblxuICAvKlxuICAgKiBJZ25vcmUgdGhlIG5leHQgYmxvY2sgZnJvbSB0ZXN0IGNvdmVyYWdlIGJlY2F1c2UgaXQgZ2V0cyBleGVjdXRlZFxuICAgKiBjb25kaXRpb25hbGx5IGRlcGVuZGluZyBvbiB0aGUgTm9kZSB2ZXJzaW9uLiBOb3QgaWdub3JpbmcgaXQgd291bGRcbiAgICogcHJldmVudCB1cyBmcm9tIHJlYWNoaW5nIHRoZSB0YXJnZXQgJSBvZiBjb3ZlcmFnZSBmb3IgdmVyc2lvbnMgb2ZcbiAgICogTm9kZSB1bmRlciAxNS43LjAuXG4gICAqL1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoQVNZTU1FVFJJQ19LRVlfREVUQUlMU19TVVBQT1JURUQpIHtcbiAgICBzd2l0Y2ggKGtleVR5cGUpIHtcbiAgICBjYXNlICdlYyc6XG4gICAgICBjb25zdCBrZXlDdXJ2ZSA9IGtleS5hc3ltbWV0cmljS2V5RGV0YWlscy5uYW1lZEN1cnZlO1xuICAgICAgY29uc3QgYWxsb3dlZEN1cnZlID0gYWxsb3dlZEN1cnZlc1thbGdvcml0aG1dO1xuXG4gICAgICBpZiAoa2V5Q3VydmUgIT09IGFsbG93ZWRDdXJ2ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwiYWxnXCIgcGFyYW1ldGVyIFwiJHthbGdvcml0aG19XCIgcmVxdWlyZXMgY3VydmUgXCIke2FsbG93ZWRDdXJ2ZX1cIi5gKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncnNhLXBzcyc6XG4gICAgICBpZiAoUlNBX1BTU19LRVlfREVUQUlMU19TVVBQT1JURUQpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gcGFyc2VJbnQoYWxnb3JpdGhtLnNsaWNlKC0zKSwgMTApO1xuICAgICAgICBjb25zdCB7IGhhc2hBbGdvcml0aG0sIG1nZjFIYXNoQWxnb3JpdGhtLCBzYWx0TGVuZ3RoIH0gPSBrZXkuYXN5bW1ldHJpY0tleURldGFpbHM7XG5cbiAgICAgICAgaWYgKGhhc2hBbGdvcml0aG0gIT09IGBzaGEke2xlbmd0aH1gIHx8IG1nZjFIYXNoQWxnb3JpdGhtICE9PSBoYXNoQWxnb3JpdGhtKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleSBmb3IgdGhpcyBvcGVyYXRpb24sIGl0cyBSU0EtUFNTIHBhcmFtZXRlcnMgZG8gbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBvZiBcImFsZ1wiICR7YWxnb3JpdGhtfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzYWx0TGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgc2FsdExlbmd0aCA+IGxlbmd0aCA+PiAzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleSBmb3IgdGhpcyBvcGVyYXRpb24sIGl0cyBSU0EtUFNTIHBhcmFtZXRlciBzYWx0TGVuZ3RoIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBvZiBcImFsZ1wiICR7YWxnb3JpdGhtfS5gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAidmFyIHNlbXZlciA9IHJlcXVpcmUoJ3NlbXZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbXZlci5zYXRpc2ZpZXMocHJvY2Vzcy52ZXJzaW9uLCAnXjYuMTIuMCB8fCA+PTguMC4wJyk7XG4iLAogICAgImNvbnN0IEpzb25XZWJUb2tlbkVycm9yID0gcmVxdWlyZSgnLi9saWIvSnNvbldlYlRva2VuRXJyb3InKTtcbmNvbnN0IE5vdEJlZm9yZUVycm9yID0gcmVxdWlyZSgnLi9saWIvTm90QmVmb3JlRXJyb3InKTtcbmNvbnN0IFRva2VuRXhwaXJlZEVycm9yID0gcmVxdWlyZSgnLi9saWIvVG9rZW5FeHBpcmVkRXJyb3InKTtcbmNvbnN0IGRlY29kZSA9IHJlcXVpcmUoJy4vZGVjb2RlJyk7XG5jb25zdCB0aW1lc3BhbiA9IHJlcXVpcmUoJy4vbGliL3RpbWVzcGFuJyk7XG5jb25zdCB2YWxpZGF0ZUFzeW1tZXRyaWNLZXkgPSByZXF1aXJlKCcuL2xpYi92YWxpZGF0ZUFzeW1tZXRyaWNLZXknKTtcbmNvbnN0IFBTX1NVUFBPUlRFRCA9IHJlcXVpcmUoJy4vbGliL3BzU3VwcG9ydGVkJyk7XG5jb25zdCBqd3MgPSByZXF1aXJlKCdqd3MnKTtcbmNvbnN0IHtLZXlPYmplY3QsIGNyZWF0ZVNlY3JldEtleSwgY3JlYXRlUHVibGljS2V5fSA9IHJlcXVpcmUoXCJjcnlwdG9cIik7XG5cbmNvbnN0IFBVQl9LRVlfQUxHUyA9IFsnUlMyNTYnLCAnUlMzODQnLCAnUlM1MTInXTtcbmNvbnN0IEVDX0tFWV9BTEdTID0gWydFUzI1NicsICdFUzM4NCcsICdFUzUxMiddO1xuY29uc3QgUlNBX0tFWV9BTEdTID0gWydSUzI1NicsICdSUzM4NCcsICdSUzUxMiddO1xuY29uc3QgSFNfQUxHUyA9IFsnSFMyNTYnLCAnSFMzODQnLCAnSFM1MTInXTtcblxuaWYgKFBTX1NVUFBPUlRFRCkge1xuICBQVUJfS0VZX0FMR1Muc3BsaWNlKFBVQl9LRVlfQUxHUy5sZW5ndGgsIDAsICdQUzI1NicsICdQUzM4NCcsICdQUzUxMicpO1xuICBSU0FfS0VZX0FMR1Muc3BsaWNlKFJTQV9LRVlfQUxHUy5sZW5ndGgsIDAsICdQUzI1NicsICdQUzM4NCcsICdQUzUxMicpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChqd3RTdHJpbmcsIHNlY3JldE9yUHVibGljS2V5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZiAoKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSAmJiAhY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgLy9jbG9uZSB0aGlzIG9iamVjdCBzaW5jZSB3ZSBhcmUgZ29pbmcgdG8gbXV0YXRlIGl0LlxuICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG5cbiAgbGV0IGRvbmU7XG5cbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgZG9uZSA9IGNhbGxiYWNrO1xuICB9IGVsc2Uge1xuICAgIGRvbmUgPSBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHRocm93IGVycjtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH07XG4gIH1cblxuICBpZiAob3B0aW9ucy5jbG9ja1RpbWVzdGFtcCAmJiB0eXBlb2Ygb3B0aW9ucy5jbG9ja1RpbWVzdGFtcCAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2Nsb2NrVGltZXN0YW1wIG11c3QgYmUgYSBudW1iZXInKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5ub25jZSAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2Ygb3B0aW9ucy5ub25jZSAhPT0gJ3N0cmluZycgfHwgb3B0aW9ucy5ub25jZS50cmltKCkgPT09ICcnKSkge1xuICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignbm9uY2UgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5hbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5hbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXMgIT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignYWxsb3dJbnZhbGlkQXN5bW1ldHJpY0tleVR5cGVzIG11c3QgYmUgYSBib29sZWFuJykpO1xuICB9XG5cbiAgY29uc3QgY2xvY2tUaW1lc3RhbXAgPSBvcHRpb25zLmNsb2NrVGltZXN0YW1wIHx8IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuXG4gIGlmICghand0U3RyaW5nKXtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBtdXN0IGJlIHByb3ZpZGVkJykpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBqd3RTdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3QgbXVzdCBiZSBhIHN0cmluZycpKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gand0U3RyaW5nLnNwbGl0KCcuJyk7XG5cbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMyl7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3QgbWFsZm9ybWVkJykpO1xuICB9XG5cbiAgbGV0IGRlY29kZWRUb2tlbjtcblxuICB0cnkge1xuICAgIGRlY29kZWRUb2tlbiA9IGRlY29kZShqd3RTdHJpbmcsIHsgY29tcGxldGU6IHRydWUgfSk7XG4gIH0gY2F0Y2goZXJyKSB7XG4gICAgcmV0dXJuIGRvbmUoZXJyKTtcbiAgfVxuXG4gIGlmICghZGVjb2RlZFRva2VuKSB7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpbnZhbGlkIHRva2VuJykpO1xuICB9XG5cbiAgY29uc3QgaGVhZGVyID0gZGVjb2RlZFRva2VuLmhlYWRlcjtcbiAgbGV0IGdldFNlY3JldDtcblxuICBpZih0eXBlb2Ygc2VjcmV0T3JQdWJsaWNLZXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZighY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcigndmVyaWZ5IG11c3QgYmUgY2FsbGVkIGFzeW5jaHJvbm91cyBpZiBzZWNyZXQgb3IgcHVibGljIGtleSBpcyBwcm92aWRlZCBhcyBhIGNhbGxiYWNrJykpO1xuICAgIH1cblxuICAgIGdldFNlY3JldCA9IHNlY3JldE9yUHVibGljS2V5O1xuICB9XG4gIGVsc2Uge1xuICAgIGdldFNlY3JldCA9IGZ1bmN0aW9uKGhlYWRlciwgc2VjcmV0Q2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBzZWNyZXRDYWxsYmFjayhudWxsLCBzZWNyZXRPclB1YmxpY0tleSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBnZXRTZWNyZXQoaGVhZGVyLCBmdW5jdGlvbihlcnIsIHNlY3JldE9yUHVibGljS2V5KSB7XG4gICAgaWYoZXJyKSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2Vycm9yIGluIHNlY3JldCBvciBwdWJsaWMga2V5IGNhbGxiYWNrOiAnICsgZXJyLm1lc3NhZ2UpKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNTaWduYXR1cmUgPSBwYXJ0c1syXS50cmltKCkgIT09ICcnO1xuXG4gICAgaWYgKCFoYXNTaWduYXR1cmUgJiYgc2VjcmV0T3JQdWJsaWNLZXkpe1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3Qgc2lnbmF0dXJlIGlzIHJlcXVpcmVkJykpO1xuICAgIH1cblxuICAgIGlmIChoYXNTaWduYXR1cmUgJiYgIXNlY3JldE9yUHVibGljS2V5KSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ3NlY3JldCBvciBwdWJsaWMga2V5IG11c3QgYmUgcHJvdmlkZWQnKSk7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNTaWduYXR1cmUgJiYgIW9wdGlvbnMuYWxnb3JpdGhtcykge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdwbGVhc2Ugc3BlY2lmeSBcIm5vbmVcIiBpbiBcImFsZ29yaXRobXNcIiB0byB2ZXJpZnkgdW5zaWduZWQgdG9rZW5zJykpO1xuICAgIH1cblxuICAgIGlmIChzZWNyZXRPclB1YmxpY0tleSAhPSBudWxsICYmICEoc2VjcmV0T3JQdWJsaWNLZXkgaW5zdGFuY2VvZiBLZXlPYmplY3QpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZWNyZXRPclB1YmxpY0tleSA9IGNyZWF0ZVB1YmxpY0tleShzZWNyZXRPclB1YmxpY0tleSk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2VjcmV0T3JQdWJsaWNLZXkgPSBjcmVhdGVTZWNyZXRLZXkodHlwZW9mIHNlY3JldE9yUHVibGljS2V5ID09PSAnc3RyaW5nJyA/IEJ1ZmZlci5mcm9tKHNlY3JldE9yUHVibGljS2V5KSA6IHNlY3JldE9yUHVibGljS2V5KTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignc2VjcmV0T3JQdWJsaWNLZXkgaXMgbm90IHZhbGlkIGtleSBtYXRlcmlhbCcpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmFsZ29yaXRobXMpIHtcbiAgICAgIGlmIChzZWNyZXRPclB1YmxpY0tleS50eXBlID09PSAnc2VjcmV0Jykge1xuICAgICAgICBvcHRpb25zLmFsZ29yaXRobXMgPSBIU19BTEdTO1xuICAgICAgfSBlbHNlIGlmIChbJ3JzYScsICdyc2EtcHNzJ10uaW5jbHVkZXMoc2VjcmV0T3JQdWJsaWNLZXkuYXN5bW1ldHJpY0tleVR5cGUpKSB7XG4gICAgICAgIG9wdGlvbnMuYWxnb3JpdGhtcyA9IFJTQV9LRVlfQUxHU1xuICAgICAgfSBlbHNlIGlmIChzZWNyZXRPclB1YmxpY0tleS5hc3ltbWV0cmljS2V5VHlwZSA9PT0gJ2VjJykge1xuICAgICAgICBvcHRpb25zLmFsZ29yaXRobXMgPSBFQ19LRVlfQUxHU1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy5hbGdvcml0aG1zID0gUFVCX0tFWV9BTEdTXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYWxnb3JpdGhtcy5pbmRleE9mKGRlY29kZWRUb2tlbi5oZWFkZXIuYWxnKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignaW52YWxpZCBhbGdvcml0aG0nKSk7XG4gICAgfVxuXG4gICAgaWYgKGhlYWRlci5hbGcuc3RhcnRzV2l0aCgnSFMnKSAmJiBzZWNyZXRPclB1YmxpY0tleS50eXBlICE9PSAnc2VjcmV0Jykge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKChgc2VjcmV0T3JQdWJsaWNLZXkgbXVzdCBiZSBhIHN5bW1ldHJpYyBrZXkgd2hlbiB1c2luZyAke2hlYWRlci5hbGd9YCkpKVxuICAgIH0gZWxzZSBpZiAoL14oPzpSU3xQU3xFUykvLnRlc3QoaGVhZGVyLmFsZykgJiYgc2VjcmV0T3JQdWJsaWNLZXkudHlwZSAhPT0gJ3B1YmxpYycpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcigoYHNlY3JldE9yUHVibGljS2V5IG11c3QgYmUgYW4gYXN5bW1ldHJpYyBrZXkgd2hlbiB1c2luZyAke2hlYWRlci5hbGd9YCkpKVxuICAgIH1cblxuICAgIGlmICghb3B0aW9ucy5hbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbGlkYXRlQXN5bW1ldHJpY0tleShoZWFkZXIuYWxnLCBzZWNyZXRPclB1YmxpY0tleSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBkb25lKGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCB2YWxpZDtcblxuICAgIHRyeSB7XG4gICAgICB2YWxpZCA9IGp3cy52ZXJpZnkoand0U3RyaW5nLCBkZWNvZGVkVG9rZW4uaGVhZGVyLmFsZywgc2VjcmV0T3JQdWJsaWNLZXkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBkb25lKGUpO1xuICAgIH1cblxuICAgIGlmICghdmFsaWQpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignaW52YWxpZCBzaWduYXR1cmUnKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZCA9IGRlY29kZWRUb2tlbi5wYXlsb2FkO1xuXG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkLm5iZiAhPT0gJ3VuZGVmaW5lZCcgJiYgIW9wdGlvbnMuaWdub3JlTm90QmVmb3JlKSB7XG4gICAgICBpZiAodHlwZW9mIHBheWxvYWQubmJmICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2ludmFsaWQgbmJmIHZhbHVlJykpO1xuICAgICAgfVxuICAgICAgaWYgKHBheWxvYWQubmJmID4gY2xvY2tUaW1lc3RhbXAgKyAob3B0aW9ucy5jbG9ja1RvbGVyYW5jZSB8fCAwKSkge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgTm90QmVmb3JlRXJyb3IoJ2p3dCBub3QgYWN0aXZlJywgbmV3IERhdGUocGF5bG9hZC5uYmYgKiAxMDAwKSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcGF5bG9hZC5leHAgIT09ICd1bmRlZmluZWQnICYmICFvcHRpb25zLmlnbm9yZUV4cGlyYXRpb24pIHtcbiAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC5leHAgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignaW52YWxpZCBleHAgdmFsdWUnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY2xvY2tUaW1lc3RhbXAgPj0gcGF5bG9hZC5leHAgKyAob3B0aW9ucy5jbG9ja1RvbGVyYW5jZSB8fCAwKSkge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgVG9rZW5FeHBpcmVkRXJyb3IoJ2p3dCBleHBpcmVkJywgbmV3IERhdGUocGF5bG9hZC5leHAgKiAxMDAwKSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmF1ZGllbmNlKSB7XG4gICAgICBjb25zdCBhdWRpZW5jZXMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuYXVkaWVuY2UpID8gb3B0aW9ucy5hdWRpZW5jZSA6IFtvcHRpb25zLmF1ZGllbmNlXTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IEFycmF5LmlzQXJyYXkocGF5bG9hZC5hdWQpID8gcGF5bG9hZC5hdWQgOiBbcGF5bG9hZC5hdWRdO1xuXG4gICAgICBjb25zdCBtYXRjaCA9IHRhcmdldC5zb21lKGZ1bmN0aW9uICh0YXJnZXRBdWRpZW5jZSkge1xuICAgICAgICByZXR1cm4gYXVkaWVuY2VzLnNvbWUoZnVuY3Rpb24gKGF1ZGllbmNlKSB7XG4gICAgICAgICAgcmV0dXJuIGF1ZGllbmNlIGluc3RhbmNlb2YgUmVnRXhwID8gYXVkaWVuY2UudGVzdCh0YXJnZXRBdWRpZW5jZSkgOiBhdWRpZW5jZSA9PT0gdGFyZ2V0QXVkaWVuY2U7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3QgYXVkaWVuY2UgaW52YWxpZC4gZXhwZWN0ZWQ6ICcgKyBhdWRpZW5jZXMuam9pbignIG9yICcpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaXNzdWVyKSB7XG4gICAgICBjb25zdCBpbnZhbGlkX2lzc3VlciA9XG4gICAgICAgICAgICAgICh0eXBlb2Ygb3B0aW9ucy5pc3N1ZXIgPT09ICdzdHJpbmcnICYmIHBheWxvYWQuaXNzICE9PSBvcHRpb25zLmlzc3VlcikgfHxcbiAgICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5pc3N1ZXIpICYmIG9wdGlvbnMuaXNzdWVyLmluZGV4T2YocGF5bG9hZC5pc3MpID09PSAtMSk7XG5cbiAgICAgIGlmIChpbnZhbGlkX2lzc3Vlcikge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBpc3N1ZXIgaW52YWxpZC4gZXhwZWN0ZWQ6ICcgKyBvcHRpb25zLmlzc3VlcikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnN1YmplY3QpIHtcbiAgICAgIGlmIChwYXlsb2FkLnN1YiAhPT0gb3B0aW9ucy5zdWJqZWN0KSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IHN1YmplY3QgaW52YWxpZC4gZXhwZWN0ZWQ6ICcgKyBvcHRpb25zLnN1YmplY3QpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5qd3RpZCkge1xuICAgICAgaWYgKHBheWxvYWQuanRpICE9PSBvcHRpb25zLmp3dGlkKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IGp3dGlkIGludmFsaWQuIGV4cGVjdGVkOiAnICsgb3B0aW9ucy5qd3RpZCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm5vbmNlKSB7XG4gICAgICBpZiAocGF5bG9hZC5ub25jZSAhPT0gb3B0aW9ucy5ub25jZSkge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBub25jZSBpbnZhbGlkLiBleHBlY3RlZDogJyArIG9wdGlvbnMubm9uY2UpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5tYXhBZ2UpIHtcbiAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC5pYXQgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignaWF0IHJlcXVpcmVkIHdoZW4gbWF4QWdlIGlzIHNwZWNpZmllZCcpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF4QWdlVGltZXN0YW1wID0gdGltZXNwYW4ob3B0aW9ucy5tYXhBZ2UsIHBheWxvYWQuaWF0KTtcbiAgICAgIGlmICh0eXBlb2YgbWF4QWdlVGltZXN0YW1wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ1wibWF4QWdlXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMgb3Igc3RyaW5nIHJlcHJlc2VudGluZyBhIHRpbWVzcGFuIGVnOiBcIjFkXCIsIFwiMjBoXCIsIDYwJykpO1xuICAgICAgfVxuICAgICAgaWYgKGNsb2NrVGltZXN0YW1wID49IG1heEFnZVRpbWVzdGFtcCArIChvcHRpb25zLmNsb2NrVG9sZXJhbmNlIHx8IDApKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBUb2tlbkV4cGlyZWRFcnJvcignbWF4QWdlIGV4Y2VlZGVkJywgbmV3IERhdGUobWF4QWdlVGltZXN0YW1wICogMTAwMCkpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5jb21wbGV0ZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZGVjb2RlZFRva2VuLnNpZ25hdHVyZTtcblxuICAgICAgcmV0dXJuIGRvbmUobnVsbCwge1xuICAgICAgICBoZWFkZXI6IGhlYWRlcixcbiAgICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgICAgc2lnbmF0dXJlOiBzaWduYXR1cmVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkb25lKG51bGwsIHBheWxvYWQpO1xuICB9KTtcbn07XG4iLAogICAgIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxLFxuICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgsXG4gICAgTkFOID0gMCAvIDA7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW0gPSAvXlxccyt8XFxzKyQvZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tYXBgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICogc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4LCBmcm9tUmlnaHQpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIGlmICh2YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBmcm9tSW5kZXgpO1xuICB9XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYU5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbnVtYmVyIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICogb2YgYHByb3BzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KSxcbiAgICBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gIC8vIFNhZmFyaSA4LjEgbWFrZXMgYGFyZ3VtZW50cy5jYWxsZWVgIGVudW1lcmFibGUgaW4gc3RyaWN0IG1vZGUuXG4gIC8vIFNhZmFyaSA5IG1ha2VzIGBhcmd1bWVudHMubGVuZ3RoYCBlbnVtZXJhYmxlIGluIHN0cmljdCBtb2RlLlxuICB2YXIgcmVzdWx0ID0gKGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSlcbiAgICA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZylcbiAgICA6IFtdO1xuXG4gIHZhciBsZW5ndGggPSByZXN1bHQubGVuZ3RoLFxuICAgICAgc2tpcEluZGV4ZXMgPSAhIWxlbmd0aDtcblxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAhKHNraXBJbmRleGVzICYmIChrZXkgPT0gJ2xlbmd0aCcgfHwgaXNJbmRleChrZXksIGxlbmd0aCkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICBpZiAoIWlzUHJvdG90eXBlKG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG4gIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgfHwgcmVJc1VpbnQudGVzdCh2YWx1ZSkpICYmXG4gICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xuXG4gIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gYGNvbGxlY3Rpb25gLiBJZiBgY29sbGVjdGlvbmAgaXMgYSBzdHJpbmcsIGl0J3NcbiAqIGNoZWNrZWQgZm9yIGEgc3Vic3RyaW5nIG9mIGB2YWx1ZWAsIG90aGVyd2lzZVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGlzIHVzZWQgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQncyB1c2VkIGFzXG4gKiB0aGUgb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgY29sbGVjdGlvbmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLnJlZHVjZWAuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pbmNsdWRlcyhbMSwgMiwgM10sIDEsIDIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmluY2x1ZGVzKHsgJ2EnOiAxLCAnYic6IDIgfSwgMSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pbmNsdWRlcygnYWJjZCcsICdiYycpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpbmNsdWRlcyhjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4LCBndWFyZCkge1xuICBjb2xsZWN0aW9uID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uIDogdmFsdWVzKGNvbGxlY3Rpb24pO1xuICBmcm9tSW5kZXggPSAoZnJvbUluZGV4ICYmICFndWFyZCkgPyB0b0ludGVnZXIoZnJvbUluZGV4KSA6IDA7XG5cbiAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBmcm9tSW5kZXgsIDApO1xuICB9XG4gIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKVxuICAgID8gKGZyb21JbmRleCA8PSBsZW5ndGggJiYgY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpXG4gICAgOiAoISFsZW5ndGggJiYgYmFzZUluZGV4T2YoY29sbGVjdGlvbiwgdmFsdWUsIGZyb21JbmRleCkgPiAtMSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG4gIC8vIFNhZmFyaSA4LjEgbWFrZXMgYGFyZ3VtZW50cy5jYWxsZWVgIGVudW1lcmFibGUgaW4gc3RyaWN0IG1vZGUuXG4gIHJldHVybiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgKCFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgfHwgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gYXJnc1RhZyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gKiBpcyBhbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDgtOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheSBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gaXNPYmplY3QodmFsdWUpID8gb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTdHJpbmdgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzdHJpbmcsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N0cmluZygnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N0cmluZygxKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAoIWlzQXJyYXkodmFsdWUpICYmIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3RyaW5nVGFnKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8ua2V5cygnaGknKTtcbiAqIC8vID0+IFsnMCcsICcxJ11cbiAqL1xuZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8udmFsdWVzKG5ldyBGb28pO1xuICogLy8gPT4gWzEsIDJdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy52YWx1ZXMoJ2hpJyk7XG4gKiAvLyA9PiBbJ2gnLCAnaSddXG4gKi9cbmZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCA/IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzKG9iamVjdCkpIDogW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5jbHVkZXM7XG4iLAogICAgIi8qKlxuICogbG9kYXNoIDMuMC4zIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgMjAxMi0yMDE2IFRoZSBEb2pvIEZvdW5kYXRpb24gPGh0dHA6Ly9kb2pvZm91bmRhdGlvbi5vcmcvPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCAyMDA5LTIwMTYgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqIEF2YWlsYWJsZSB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKi9cblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZSBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGJvb2xlYW4gcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Jvb2xlYW4oZmFsc2UpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNCb29sZWFuKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2UgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBib29sVGFnKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQm9vbGVhbjtcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gKiBbYE51bWJlci5pc0ludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNJbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBpbnRlZ2VyLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNJbnRlZ2VyKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzSW50ZWdlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNJbnRlZ2VyKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSA9PSB0b0ludGVnZXIodmFsdWUpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIGZpbml0ZSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEyLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0Zpbml0ZSgzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9GaW5pdGUoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvRmluaXRlKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b0Zpbml0ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiAwO1xuICB9XG4gIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICBpZiAodmFsdWUgPT09IElORklOSVRZIHx8IHZhbHVlID09PSAtSU5GSU5JVFkpIHtcbiAgICB2YXIgc2lnbiA9ICh2YWx1ZSA8IDAgPyAtMSA6IDEpO1xuICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gIH1cbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/IHZhbHVlIDogMDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvaW50ZWdlcikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0ludGVnZXIoMy4yKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDBcbiAqXG4gKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICByZW1haW5kZXIgPSByZXN1bHQgJSAxO1xuXG4gIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzSW50ZWdlcjtcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggMy4wLjMgKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCAyMDEyLTIwMTYgVGhlIERvam8gRm91bmRhdGlvbiA8aHR0cDovL2Rvam9mb3VuZGF0aW9uLm9yZy8+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IDIwMDktMjAxNiBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICogQXZhaWxhYmxlIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqL1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZSBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE51bWJlcmAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiAqKk5vdGU6KiogVG8gZXhjbHVkZSBgSW5maW5pdHlgLCBgLUluZmluaXR5YCwgYW5kIGBOYU5gLCB3aGljaCBhcmUgY2xhc3NpZmllZFxuICogYXMgbnVtYmVycywgdXNlIHRoZSBgXy5pc0Zpbml0ZWAgbWV0aG9kLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTnVtYmVyKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNOdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcignMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IG51bWJlclRhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNOdW1iZXI7XG4iLAogICAgIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBob3N0IG9iamVjdCBpbiBJRSA8IDkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBob3N0IG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0hvc3RPYmplY3QodmFsdWUpIHtcbiAgLy8gTWFueSBob3N0IG9iamVjdHMgYXJlIGBPYmplY3RgIG9iamVjdHMgdGhhdCBjYW4gY29lcmNlIHRvIHN0cmluZ3NcbiAgLy8gZGVzcGl0ZSBoYXZpbmcgaW1wcm9wZXJseSBkZWZpbmVkIGB0b1N0cmluZ2AgbWV0aG9kcy5cbiAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuICBpZiAodmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSAhISh2YWx1ZSArICcnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICB9O1xufVxuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xudmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGVcbiAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuOC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiB9XG4gKlxuICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fFxuICAgICAgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgIT0gb2JqZWN0VGFnIHx8IGlzSG9zdE9iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIEN0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCAnY29uc3RydWN0b3InKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgcmV0dXJuICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmXG4gICAgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiYgZnVuY1RvU3RyaW5nLmNhbGwoQ3RvcikgPT0gb2JqZWN0Q3RvclN0cmluZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQbGFpbk9iamVjdDtcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggNC4wLjEgKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCAyMDEyLTIwMTYgVGhlIERvam8gRm91bmRhdGlvbiA8aHR0cDovL2Rvam9mb3VuZGF0aW9uLm9yZy8+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IDIwMDktMjAxNiBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICogQXZhaWxhYmxlIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqL1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZSBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHR5cGUgRnVuY3Rpb25cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N0cmluZygnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N0cmluZygxKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAoIWlzQXJyYXkodmFsdWUpICYmIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3RyaW5nVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N0cmluZztcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHRoZSBgVHlwZUVycm9yYCBtZXNzYWdlIGZvciBcIkZ1bmN0aW9uc1wiIG1ldGhvZHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgsXG4gICAgTkFOID0gMCAvIDA7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW0gPSAvXlxccyt8XFxzKyQvZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCwgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50c1xuICogb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoaWxlIGl0J3MgY2FsbGVkIGxlc3MgdGhhbiBgbmAgdGltZXMuIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBjYWxscyBhdCB3aGljaCBgZnVuY2AgaXMgbm8gbG9uZ2VyIGludm9rZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmJlZm9yZSg1LCBhZGRDb250YWN0VG9MaXN0KSk7XG4gKiAvLyA9PiBBbGxvd3MgYWRkaW5nIHVwIHRvIDQgY29udGFjdHMgdG8gdGhlIGxpc3QuXG4gKi9cbmZ1bmN0aW9uIGJlZm9yZShuLCBmdW5jKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIG4gPSB0b0ludGVnZXIobik7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpZiAoLS1uID4gMCkge1xuICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgICBpZiAobiA8PSAxKSB7XG4gICAgICBmdW5jID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIHJlc3RyaWN0ZWQgdG8gaW52b2tpbmcgYGZ1bmNgIG9uY2UuIFJlcGVhdCBjYWxsc1xuICogdG8gdGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludm9jYXRpb24uIFRoZSBgZnVuY2AgaXNcbiAqIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGluaXRpYWxpemUgPSBfLm9uY2UoY3JlYXRlQXBwbGljYXRpb24pO1xuICogaW5pdGlhbGl6ZSgpO1xuICogaW5pdGlhbGl6ZSgpO1xuICogLy8gPT4gYGNyZWF0ZUFwcGxpY2F0aW9uYCBpcyBpbnZva2VkIG9uY2VcbiAqL1xuZnVuY3Rpb24gb25jZShmdW5jKSB7XG4gIHJldHVybiBiZWZvcmUoMiwgZnVuYyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb25jZTtcbiIsCiAgICAiY29uc3QgdGltZXNwYW4gPSByZXF1aXJlKCcuL2xpYi90aW1lc3BhbicpO1xuY29uc3QgUFNfU1VQUE9SVEVEID0gcmVxdWlyZSgnLi9saWIvcHNTdXBwb3J0ZWQnKTtcbmNvbnN0IHZhbGlkYXRlQXN5bW1ldHJpY0tleSA9IHJlcXVpcmUoJy4vbGliL3ZhbGlkYXRlQXN5bW1ldHJpY0tleScpO1xuY29uc3QgandzID0gcmVxdWlyZSgnandzJyk7XG5jb25zdCBpbmNsdWRlcyA9IHJlcXVpcmUoJ2xvZGFzaC5pbmNsdWRlcycpO1xuY29uc3QgaXNCb29sZWFuID0gcmVxdWlyZSgnbG9kYXNoLmlzYm9vbGVhbicpO1xuY29uc3QgaXNJbnRlZ2VyID0gcmVxdWlyZSgnbG9kYXNoLmlzaW50ZWdlcicpO1xuY29uc3QgaXNOdW1iZXIgPSByZXF1aXJlKCdsb2Rhc2guaXNudW1iZXInKTtcbmNvbnN0IGlzUGxhaW5PYmplY3QgPSByZXF1aXJlKCdsb2Rhc2guaXNwbGFpbm9iamVjdCcpO1xuY29uc3QgaXNTdHJpbmcgPSByZXF1aXJlKCdsb2Rhc2guaXNzdHJpbmcnKTtcbmNvbnN0IG9uY2UgPSByZXF1aXJlKCdsb2Rhc2gub25jZScpO1xuY29uc3QgeyBLZXlPYmplY3QsIGNyZWF0ZVNlY3JldEtleSwgY3JlYXRlUHJpdmF0ZUtleSB9ID0gcmVxdWlyZSgnY3J5cHRvJylcblxuY29uc3QgU1VQUE9SVEVEX0FMR1MgPSBbJ1JTMjU2JywgJ1JTMzg0JywgJ1JTNTEyJywgJ0VTMjU2JywgJ0VTMzg0JywgJ0VTNTEyJywgJ0hTMjU2JywgJ0hTMzg0JywgJ0hTNTEyJywgJ25vbmUnXTtcbmlmIChQU19TVVBQT1JURUQpIHtcbiAgU1VQUE9SVEVEX0FMR1Muc3BsaWNlKDMsIDAsICdQUzI1NicsICdQUzM4NCcsICdQUzUxMicpO1xufVxuXG5jb25zdCBzaWduX29wdGlvbnNfc2NoZW1hID0ge1xuICBleHBpcmVzSW46IHsgaXNWYWxpZDogZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIGlzSW50ZWdlcih2YWx1ZSkgfHwgKGlzU3RyaW5nKHZhbHVlKSAmJiB2YWx1ZSk7IH0sIG1lc3NhZ2U6ICdcImV4cGlyZXNJblwiIHNob3VsZCBiZSBhIG51bWJlciBvZiBzZWNvbmRzIG9yIHN0cmluZyByZXByZXNlbnRpbmcgYSB0aW1lc3BhbicgfSxcbiAgbm90QmVmb3JlOiB7IGlzVmFsaWQ6IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiBpc0ludGVnZXIodmFsdWUpIHx8IChpc1N0cmluZyh2YWx1ZSkgJiYgdmFsdWUpOyB9LCBtZXNzYWdlOiAnXCJub3RCZWZvcmVcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcyBvciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgdGltZXNwYW4nIH0sXG4gIGF1ZGllbmNlOiB7IGlzVmFsaWQ6IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiBpc1N0cmluZyh2YWx1ZSkgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSk7IH0sIG1lc3NhZ2U6ICdcImF1ZGllbmNlXCIgbXVzdCBiZSBhIHN0cmluZyBvciBhcnJheScgfSxcbiAgYWxnb3JpdGhtOiB7IGlzVmFsaWQ6IGluY2x1ZGVzLmJpbmQobnVsbCwgU1VQUE9SVEVEX0FMR1MpLCBtZXNzYWdlOiAnXCJhbGdvcml0aG1cIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVudW0gdmFsdWUnIH0sXG4gIGhlYWRlcjogeyBpc1ZhbGlkOiBpc1BsYWluT2JqZWN0LCBtZXNzYWdlOiAnXCJoZWFkZXJcIiBtdXN0IGJlIGFuIG9iamVjdCcgfSxcbiAgZW5jb2Rpbmc6IHsgaXNWYWxpZDogaXNTdHJpbmcsIG1lc3NhZ2U6ICdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHN0cmluZycgfSxcbiAgaXNzdWVyOiB7IGlzVmFsaWQ6IGlzU3RyaW5nLCBtZXNzYWdlOiAnXCJpc3N1ZXJcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBzdWJqZWN0OiB7IGlzVmFsaWQ6IGlzU3RyaW5nLCBtZXNzYWdlOiAnXCJzdWJqZWN0XCIgbXVzdCBiZSBhIHN0cmluZycgfSxcbiAgand0aWQ6IHsgaXNWYWxpZDogaXNTdHJpbmcsIG1lc3NhZ2U6ICdcImp3dGlkXCIgbXVzdCBiZSBhIHN0cmluZycgfSxcbiAgbm9UaW1lc3RhbXA6IHsgaXNWYWxpZDogaXNCb29sZWFuLCBtZXNzYWdlOiAnXCJub1RpbWVzdGFtcFwiIG11c3QgYmUgYSBib29sZWFuJyB9LFxuICBrZXlpZDogeyBpc1ZhbGlkOiBpc1N0cmluZywgbWVzc2FnZTogJ1wia2V5aWRcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBtdXRhdGVQYXlsb2FkOiB7IGlzVmFsaWQ6IGlzQm9vbGVhbiwgbWVzc2FnZTogJ1wibXV0YXRlUGF5bG9hZFwiIG11c3QgYmUgYSBib29sZWFuJyB9LFxuICBhbGxvd0luc2VjdXJlS2V5U2l6ZXM6IHsgaXNWYWxpZDogaXNCb29sZWFuLCBtZXNzYWdlOiAnXCJhbGxvd0luc2VjdXJlS2V5U2l6ZXNcIiBtdXN0IGJlIGEgYm9vbGVhbid9LFxuICBhbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXM6IHsgaXNWYWxpZDogaXNCb29sZWFuLCBtZXNzYWdlOiAnXCJhbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXNcIiBtdXN0IGJlIGEgYm9vbGVhbid9XG59O1xuXG5jb25zdCByZWdpc3RlcmVkX2NsYWltc19zY2hlbWEgPSB7XG4gIGlhdDogeyBpc1ZhbGlkOiBpc051bWJlciwgbWVzc2FnZTogJ1wiaWF0XCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMnIH0sXG4gIGV4cDogeyBpc1ZhbGlkOiBpc051bWJlciwgbWVzc2FnZTogJ1wiZXhwXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMnIH0sXG4gIG5iZjogeyBpc1ZhbGlkOiBpc051bWJlciwgbWVzc2FnZTogJ1wibmJmXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMnIH1cbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlKHNjaGVtYSwgYWxsb3dVbmtub3duLCBvYmplY3QsIHBhcmFtZXRlck5hbWUpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KG9iamVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIFwiJyArIHBhcmFtZXRlck5hbWUgKyAnXCIgdG8gYmUgYSBwbGFpbiBvYmplY3QuJyk7XG4gIH1cbiAgT2JqZWN0LmtleXMob2JqZWN0KVxuICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gc2NoZW1hW2tleV07XG4gICAgICBpZiAoIXZhbGlkYXRvcikge1xuICAgICAgICBpZiAoIWFsbG93VW5rbm93bikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsga2V5ICsgJ1wiIGlzIG5vdCBhbGxvd2VkIGluIFwiJyArIHBhcmFtZXRlck5hbWUgKyAnXCInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXZhbGlkYXRvci5pc1ZhbGlkKG9iamVjdFtrZXldKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodmFsaWRhdG9yLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucykge1xuICByZXR1cm4gdmFsaWRhdGUoc2lnbl9vcHRpb25zX3NjaGVtYSwgZmFsc2UsIG9wdGlvbnMsICdvcHRpb25zJyk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUGF5bG9hZChwYXlsb2FkKSB7XG4gIHJldHVybiB2YWxpZGF0ZShyZWdpc3RlcmVkX2NsYWltc19zY2hlbWEsIHRydWUsIHBheWxvYWQsICdwYXlsb2FkJyk7XG59XG5cbmNvbnN0IG9wdGlvbnNfdG9fcGF5bG9hZCA9IHtcbiAgJ2F1ZGllbmNlJzogJ2F1ZCcsXG4gICdpc3N1ZXInOiAnaXNzJyxcbiAgJ3N1YmplY3QnOiAnc3ViJyxcbiAgJ2p3dGlkJzogJ2p0aSdcbn07XG5cbmNvbnN0IG9wdGlvbnNfZm9yX29iamVjdHMgPSBbXG4gICdleHBpcmVzSW4nLFxuICAnbm90QmVmb3JlJyxcbiAgJ25vVGltZXN0YW1wJyxcbiAgJ2F1ZGllbmNlJyxcbiAgJ2lzc3VlcicsXG4gICdzdWJqZWN0JyxcbiAgJ2p3dGlkJyxcbl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHBheWxvYWQsIHNlY3JldE9yUHJpdmF0ZUtleSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgfVxuXG4gIGNvbnN0IGlzT2JqZWN0UGF5bG9hZCA9IHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIUJ1ZmZlci5pc0J1ZmZlcihwYXlsb2FkKTtcblxuICBjb25zdCBoZWFkZXIgPSBPYmplY3QuYXNzaWduKHtcbiAgICBhbGc6IG9wdGlvbnMuYWxnb3JpdGhtIHx8ICdIUzI1NicsXG4gICAgdHlwOiBpc09iamVjdFBheWxvYWQgPyAnSldUJyA6IHVuZGVmaW5lZCxcbiAgICBraWQ6IG9wdGlvbnMua2V5aWRcbiAgfSwgb3B0aW9ucy5oZWFkZXIpO1xuXG4gIGZ1bmN0aW9uIGZhaWx1cmUoZXJyKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgaWYgKCFzZWNyZXRPclByaXZhdGVLZXkgJiYgb3B0aW9ucy5hbGdvcml0aG0gIT09ICdub25lJykge1xuICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignc2VjcmV0T3JQcml2YXRlS2V5IG11c3QgaGF2ZSBhIHZhbHVlJykpO1xuICB9XG5cbiAgaWYgKHNlY3JldE9yUHJpdmF0ZUtleSAhPSBudWxsICYmICEoc2VjcmV0T3JQcml2YXRlS2V5IGluc3RhbmNlb2YgS2V5T2JqZWN0KSkge1xuICAgIHRyeSB7XG4gICAgICBzZWNyZXRPclByaXZhdGVLZXkgPSBjcmVhdGVQcml2YXRlS2V5KHNlY3JldE9yUHJpdmF0ZUtleSlcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZWNyZXRPclByaXZhdGVLZXkgPSBjcmVhdGVTZWNyZXRLZXkodHlwZW9mIHNlY3JldE9yUHJpdmF0ZUtleSA9PT0gJ3N0cmluZycgPyBCdWZmZXIuZnJvbShzZWNyZXRPclByaXZhdGVLZXkpIDogc2VjcmV0T3JQcml2YXRlS2V5KVxuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ3NlY3JldE9yUHJpdmF0ZUtleSBpcyBub3QgdmFsaWQga2V5IG1hdGVyaWFsJykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChoZWFkZXIuYWxnLnN0YXJ0c1dpdGgoJ0hTJykgJiYgc2VjcmV0T3JQcml2YXRlS2V5LnR5cGUgIT09ICdzZWNyZXQnKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKChgc2VjcmV0T3JQcml2YXRlS2V5IG11c3QgYmUgYSBzeW1tZXRyaWMga2V5IHdoZW4gdXNpbmcgJHtoZWFkZXIuYWxnfWApKSlcbiAgfSBlbHNlIGlmICgvXig/OlJTfFBTfEVTKS8udGVzdChoZWFkZXIuYWxnKSkge1xuICAgIGlmIChzZWNyZXRPclByaXZhdGVLZXkudHlwZSAhPT0gJ3ByaXZhdGUnKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoKGBzZWNyZXRPclByaXZhdGVLZXkgbXVzdCBiZSBhbiBhc3ltbWV0cmljIGtleSB3aGVuIHVzaW5nICR7aGVhZGVyLmFsZ31gKSkpXG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5hbGxvd0luc2VjdXJlS2V5U2l6ZXMgJiZcbiAgICAgICFoZWFkZXIuYWxnLnN0YXJ0c1dpdGgoJ0VTJykgJiZcbiAgICAgIHNlY3JldE9yUHJpdmF0ZUtleS5hc3ltbWV0cmljS2V5RGV0YWlscyAhPT0gdW5kZWZpbmVkICYmIC8vS2V5T2JqZWN0LmFzeW1tZXRyaWNLZXlEZXRhaWxzIGlzIHN1cHBvcnRlZCBpbiBOb2RlIDE1K1xuICAgICAgc2VjcmV0T3JQcml2YXRlS2V5LmFzeW1tZXRyaWNLZXlEZXRhaWxzLm1vZHVsdXNMZW5ndGggPCAyMDQ4KSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoYHNlY3JldE9yUHJpdmF0ZUtleSBoYXMgYSBtaW5pbXVtIGtleSBzaXplIG9mIDIwNDggYml0cyBmb3IgJHtoZWFkZXIuYWxnfWApKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHBheWxvYWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdwYXlsb2FkIGlzIHJlcXVpcmVkJykpO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0UGF5bG9hZCkge1xuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZVBheWxvYWQocGF5bG9hZCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhaWx1cmUoZXJyb3IpO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMubXV0YXRlUGF5bG9hZCkge1xuICAgICAgcGF5bG9hZCA9IE9iamVjdC5hc3NpZ24oe30scGF5bG9hZCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGludmFsaWRfb3B0aW9ucyA9IG9wdGlvbnNfZm9yX29iamVjdHMuZmlsdGVyKGZ1bmN0aW9uIChvcHQpIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb3B0aW9uc1tvcHRdICE9PSAndW5kZWZpbmVkJztcbiAgICB9KTtcblxuICAgIGlmIChpbnZhbGlkX29wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdpbnZhbGlkICcgKyBpbnZhbGlkX29wdGlvbnMuam9pbignLCcpICsgJyBvcHRpb24gZm9yICcgKyAodHlwZW9mIHBheWxvYWQgKSArICcgcGF5bG9hZCcpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHBheWxvYWQuZXhwICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0aW9ucy5leHBpcmVzSW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdCYWQgXCJvcHRpb25zLmV4cGlyZXNJblwiIG9wdGlvbiB0aGUgcGF5bG9hZCBhbHJlYWR5IGhhcyBhbiBcImV4cFwiIHByb3BlcnR5LicpKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF5bG9hZC5uYmYgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLm5vdEJlZm9yZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ0JhZCBcIm9wdGlvbnMubm90QmVmb3JlXCIgb3B0aW9uIHRoZSBwYXlsb2FkIGFscmVhZHkgaGFzIGFuIFwibmJmXCIgcHJvcGVydHkuJykpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7XG4gIH1cbiAgY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUoZXJyb3IpO1xuICB9XG5cbiAgaWYgKCFvcHRpb25zLmFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlcykge1xuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZUFzeW1tZXRyaWNLZXkoaGVhZGVyLmFsZywgc2VjcmV0T3JQcml2YXRlS2V5KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhaWx1cmUoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRpbWVzdGFtcCA9IHBheWxvYWQuaWF0IHx8IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuXG4gIGlmIChvcHRpb25zLm5vVGltZXN0YW1wKSB7XG4gICAgZGVsZXRlIHBheWxvYWQuaWF0O1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0UGF5bG9hZCkge1xuICAgIHBheWxvYWQuaWF0ID0gdGltZXN0YW1wO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLm5vdEJlZm9yZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0cnkge1xuICAgICAgcGF5bG9hZC5uYmYgPSB0aW1lc3BhbihvcHRpb25zLm5vdEJlZm9yZSwgdGltZXN0YW1wKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIGZhaWx1cmUoZXJyKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkLm5iZiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignXCJub3RCZWZvcmVcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcyBvciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgdGltZXNwYW4gZWc6IFwiMWRcIiwgXCIyMGhcIiwgNjAnKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmV4cGlyZXNJbiAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBheWxvYWQuZXhwID0gdGltZXNwYW4ob3B0aW9ucy5leHBpcmVzSW4sIHRpbWVzdGFtcCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKGVycik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGF5bG9hZC5leHAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ1wiZXhwaXJlc0luXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMgb3Igc3RyaW5nIHJlcHJlc2VudGluZyBhIHRpbWVzcGFuIGVnOiBcIjFkXCIsIFwiMjBoXCIsIDYwJykpO1xuICAgIH1cbiAgfVxuXG4gIE9iamVjdC5rZXlzKG9wdGlvbnNfdG9fcGF5bG9hZCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgY29uc3QgY2xhaW0gPSBvcHRpb25zX3RvX3BheWxvYWRba2V5XTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnNba2V5XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmICh0eXBlb2YgcGF5bG9hZFtjbGFpbV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignQmFkIFwib3B0aW9ucy4nICsga2V5ICsgJ1wiIG9wdGlvbi4gVGhlIHBheWxvYWQgYWxyZWFkeSBoYXMgYW4gXCInICsgY2xhaW0gKyAnXCIgcHJvcGVydHkuJykpO1xuICAgICAgfVxuICAgICAgcGF5bG9hZFtjbGFpbV0gPSBvcHRpb25zW2tleV07XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBlbmNvZGluZyA9IG9wdGlvbnMuZW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrICYmIG9uY2UoY2FsbGJhY2spO1xuXG4gICAgandzLmNyZWF0ZVNpZ24oe1xuICAgICAgaGVhZGVyOiBoZWFkZXIsXG4gICAgICBwcml2YXRlS2V5OiBzZWNyZXRPclByaXZhdGVLZXksXG4gICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nXG4gICAgfSkub25jZSgnZXJyb3InLCBjYWxsYmFjaylcbiAgICAgIC5vbmNlKCdkb25lJywgZnVuY3Rpb24gKHNpZ25hdHVyZSkge1xuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgaW4gZmF2b3Igb2YgdGhlIG1vZHVsdXMgbGVuZ3RoIGNoZWNrIGJlZm9yZSBzaWduaW5nIG9uY2Ugbm9kZSAxNSsgaXMgdGhlIG1pbmltdW0gc3VwcG9ydGVkIHZlcnNpb25cbiAgICAgICAgaWYoIW9wdGlvbnMuYWxsb3dJbnNlY3VyZUtleVNpemVzICYmIC9eKD86UlN8UFMpLy50ZXN0KGhlYWRlci5hbGcpICYmIHNpZ25hdHVyZS5sZW5ndGggPCAyNTYpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBzZWNyZXRPclByaXZhdGVLZXkgaGFzIGEgbWluaW11bSBrZXkgc2l6ZSBvZiAyMDQ4IGJpdHMgZm9yICR7aGVhZGVyLmFsZ31gKSlcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayhudWxsLCBzaWduYXR1cmUpO1xuICAgICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHNpZ25hdHVyZSA9IGp3cy5zaWduKHtoZWFkZXI6IGhlYWRlciwgcGF5bG9hZDogcGF5bG9hZCwgc2VjcmV0OiBzZWNyZXRPclByaXZhdGVLZXksIGVuY29kaW5nOiBlbmNvZGluZ30pO1xuICAgIC8vIFRPRE86IFJlbW92ZSBpbiBmYXZvciBvZiB0aGUgbW9kdWx1cyBsZW5ndGggY2hlY2sgYmVmb3JlIHNpZ25pbmcgb25jZSBub2RlIDE1KyBpcyB0aGUgbWluaW11bSBzdXBwb3J0ZWQgdmVyc2lvblxuICAgIGlmKCFvcHRpb25zLmFsbG93SW5zZWN1cmVLZXlTaXplcyAmJiAvXig/OlJTfFBTKS8udGVzdChoZWFkZXIuYWxnKSAmJiBzaWduYXR1cmUubGVuZ3RoIDwgMjU2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHNlY3JldE9yUHJpdmF0ZUtleSBoYXMgYSBtaW5pbXVtIGtleSBzaXplIG9mIDIwNDggYml0cyBmb3IgJHtoZWFkZXIuYWxnfWApXG4gICAgfVxuICAgIHJldHVybiBzaWduYXR1cmVcbiAgfVxufTtcbiIsCiAgICAibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlY29kZTogcmVxdWlyZSgnLi9kZWNvZGUnKSxcbiAgdmVyaWZ5OiByZXF1aXJlKCcuL3ZlcmlmeScpLFxuICBzaWduOiByZXF1aXJlKCcuL3NpZ24nKSxcbiAgSnNvbldlYlRva2VuRXJyb3I6IHJlcXVpcmUoJy4vbGliL0pzb25XZWJUb2tlbkVycm9yJyksXG4gIE5vdEJlZm9yZUVycm9yOiByZXF1aXJlKCcuL2xpYi9Ob3RCZWZvcmVFcnJvcicpLFxuICBUb2tlbkV4cGlyZWRFcnJvcjogcmVxdWlyZSgnLi9saWIvVG9rZW5FeHBpcmVkRXJyb3InKSxcbn07XG4iLAogICAgIihmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBVdGlsc1xuICBmdW5jdGlvbiBhc3NlcnQgKHZhbCwgbXNnKSB7XG4gICAgaWYgKCF2YWwpIHRocm93IG5ldyBFcnJvcihtc2cgfHwgJ0Fzc2VydGlvbiBmYWlsZWQnKTtcbiAgfVxuXG4gIC8vIENvdWxkIHVzZSBgaW5oZXJpdHNgIG1vZHVsZSwgYnV0IGRvbid0IHdhbnQgdG8gbW92ZSBmcm9tIHNpbmdsZSBmaWxlXG4gIC8vIGFyY2hpdGVjdHVyZSB5ZXQuXG4gIGZ1bmN0aW9uIGluaGVyaXRzIChjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvcjtcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlO1xuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKCk7XG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yO1xuICB9XG5cbiAgLy8gQk5cblxuICBmdW5jdGlvbiBCTiAobnVtYmVyLCBiYXNlLCBlbmRpYW4pIHtcbiAgICBpZiAoQk4uaXNCTihudW1iZXIpKSB7XG4gICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH1cblxuICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgIHRoaXMud29yZHMgPSBudWxsO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgIC8vIFJlZHVjdGlvbiBjb250ZXh0XG4gICAgdGhpcy5yZWQgPSBudWxsO1xuXG4gICAgaWYgKG51bWJlciAhPT0gbnVsbCkge1xuICAgICAgaWYgKGJhc2UgPT09ICdsZScgfHwgYmFzZSA9PT0gJ2JlJykge1xuICAgICAgICBlbmRpYW4gPSBiYXNlO1xuICAgICAgICBiYXNlID0gMTA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2luaXQobnVtYmVyIHx8IDAsIGJhc2UgfHwgMTAsIGVuZGlhbiB8fCAnYmUnKTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBCTjtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRzLkJOID0gQk47XG4gIH1cblxuICBCTi5CTiA9IEJOO1xuICBCTi53b3JkU2l6ZSA9IDI2O1xuXG4gIHZhciBCdWZmZXI7XG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuQnVmZmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgQnVmZmVyID0gd2luZG93LkJ1ZmZlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICB9XG5cbiAgQk4uaXNCTiA9IGZ1bmN0aW9uIGlzQk4gKG51bSkge1xuICAgIGlmIChudW0gaW5zdGFuY2VvZiBCTikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bSAhPT0gbnVsbCAmJiB0eXBlb2YgbnVtID09PSAnb2JqZWN0JyAmJlxuICAgICAgbnVtLmNvbnN0cnVjdG9yLndvcmRTaXplID09PSBCTi53b3JkU2l6ZSAmJiBBcnJheS5pc0FycmF5KG51bS53b3Jkcyk7XG4gIH07XG5cbiAgQk4ubWF4ID0gZnVuY3Rpb24gbWF4IChsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0LmNtcChyaWdodCkgPiAwKSByZXR1cm4gbGVmdDtcbiAgICByZXR1cm4gcmlnaHQ7XG4gIH07XG5cbiAgQk4ubWluID0gZnVuY3Rpb24gbWluIChsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0LmNtcChyaWdodCkgPCAwKSByZXR1cm4gbGVmdDtcbiAgICByZXR1cm4gcmlnaHQ7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gaW5pdCAobnVtYmVyLCBiYXNlLCBlbmRpYW4pIHtcbiAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0TnVtYmVyKG51bWJlciwgYmFzZSwgZW5kaWFuKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0QXJyYXkobnVtYmVyLCBiYXNlLCBlbmRpYW4pO1xuICAgIH1cblxuICAgIGlmIChiYXNlID09PSAnaGV4Jykge1xuICAgICAgYmFzZSA9IDE2O1xuICAgIH1cbiAgICBhc3NlcnQoYmFzZSA9PT0gKGJhc2UgfCAwKSAmJiBiYXNlID49IDIgJiYgYmFzZSA8PSAzNik7XG5cbiAgICBudW1iZXIgPSBudW1iZXIudG9TdHJpbmcoKS5yZXBsYWNlKC9cXHMrL2csICcnKTtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGlmIChudW1iZXJbMF0gPT09ICctJykge1xuICAgICAgc3RhcnQrKztcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA8IG51bWJlci5sZW5ndGgpIHtcbiAgICAgIGlmIChiYXNlID09PSAxNikge1xuICAgICAgICB0aGlzLl9wYXJzZUhleChudW1iZXIsIHN0YXJ0LCBlbmRpYW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcGFyc2VCYXNlKG51bWJlciwgYmFzZSwgc3RhcnQpO1xuICAgICAgICBpZiAoZW5kaWFuID09PSAnbGUnKSB7XG4gICAgICAgICAgdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLCBiYXNlLCBlbmRpYW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faW5pdE51bWJlciA9IGZ1bmN0aW9uIF9pbml0TnVtYmVyIChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIG51bWJlciA9IC1udW1iZXI7XG4gICAgfVxuICAgIGlmIChudW1iZXIgPCAweDQwMDAwMDApIHtcbiAgICAgIHRoaXMud29yZHMgPSBbIG51bWJlciAmIDB4M2ZmZmZmZiBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgMHgxMDAwMDAwMDAwMDAwMCkge1xuICAgICAgdGhpcy53b3JkcyA9IFtcbiAgICAgICAgbnVtYmVyICYgMHgzZmZmZmZmLFxuICAgICAgICAobnVtYmVyIC8gMHg0MDAwMDAwKSAmIDB4M2ZmZmZmZlxuICAgICAgXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KG51bWJlciA8IDB4MjAwMDAwMDAwMDAwMDApOyAvLyAyIF4gNTMgKHVuc2FmZSlcbiAgICAgIHRoaXMud29yZHMgPSBbXG4gICAgICAgIG51bWJlciAmIDB4M2ZmZmZmZixcbiAgICAgICAgKG51bWJlciAvIDB4NDAwMDAwMCkgJiAweDNmZmZmZmYsXG4gICAgICAgIDFcbiAgICAgIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDM7XG4gICAgfVxuXG4gICAgaWYgKGVuZGlhbiAhPT0gJ2xlJykgcmV0dXJuO1xuXG4gICAgLy8gUmV2ZXJzZSB0aGUgYnl0ZXNcbiAgICB0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksIGJhc2UsIGVuZGlhbik7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0QXJyYXkgPSBmdW5jdGlvbiBfaW5pdEFycmF5IChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIC8vIFBlcmhhcHMgYSBVaW50OEFycmF5XG4gICAgYXNzZXJ0KHR5cGVvZiBudW1iZXIubGVuZ3RoID09PSAnbnVtYmVyJyk7XG4gICAgaWYgKG51bWJlci5sZW5ndGggPD0gMCkge1xuICAgICAgdGhpcy53b3JkcyA9IFsgMCBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwobnVtYmVyLmxlbmd0aCAvIDMpO1xuICAgIHRoaXMud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IDA7XG4gICAgfVxuXG4gICAgdmFyIGosIHc7XG4gICAgdmFyIG9mZiA9IDA7XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2JlJykge1xuICAgICAgZm9yIChpID0gbnVtYmVyLmxlbmd0aCAtIDEsIGogPSAwOyBpID49IDA7IGkgLT0gMykge1xuICAgICAgICB3ID0gbnVtYmVyW2ldIHwgKG51bWJlcltpIC0gMV0gPDwgOCkgfCAobnVtYmVyW2kgLSAyXSA8PCAxNik7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gKHcgPDwgb2ZmKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgdGhpcy53b3Jkc1tqICsgMV0gPSAodyA+Pj4gKDI2IC0gb2ZmKSkgJiAweDNmZmZmZmY7XG4gICAgICAgIG9mZiArPSAyNDtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVuZGlhbiA9PT0gJ2xlJykge1xuICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBudW1iZXIubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgdyA9IG51bWJlcltpXSB8IChudW1iZXJbaSArIDFdIDw8IDgpIHwgKG51bWJlcltpICsgMl0gPDwgMTYpO1xuICAgICAgICB0aGlzLndvcmRzW2pdIHw9ICh3IDw8IG9mZikgJiAweDNmZmZmZmY7XG4gICAgICAgIHRoaXMud29yZHNbaiArIDFdID0gKHcgPj4+ICgyNiAtIG9mZikpICYgMHgzZmZmZmZmO1xuICAgICAgICBvZmYgKz0gMjQ7XG4gICAgICAgIGlmIChvZmYgPj0gMjYpIHtcbiAgICAgICAgICBvZmYgLT0gMjY7XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gcGFyc2VIZXg0Qml0cyAoc3RyaW5nLCBpbmRleCkge1xuICAgIHZhciBjID0gc3RyaW5nLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgIC8vICdBJyAtICdGJ1xuICAgIGlmIChjID49IDY1ICYmIGMgPD0gNzApIHtcbiAgICAgIHJldHVybiBjIC0gNTU7XG4gICAgLy8gJ2EnIC0gJ2YnXG4gICAgfSBlbHNlIGlmIChjID49IDk3ICYmIGMgPD0gMTAyKSB7XG4gICAgICByZXR1cm4gYyAtIDg3O1xuICAgIC8vICcwJyAtICc5J1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKGMgLSA0OCkgJiAweGY7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VIZXhCeXRlIChzdHJpbmcsIGxvd2VyQm91bmQsIGluZGV4KSB7XG4gICAgdmFyIHIgPSBwYXJzZUhleDRCaXRzKHN0cmluZywgaW5kZXgpO1xuICAgIGlmIChpbmRleCAtIDEgPj0gbG93ZXJCb3VuZCkge1xuICAgICAgciB8PSBwYXJzZUhleDRCaXRzKHN0cmluZywgaW5kZXggLSAxKSA8PCA0O1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5fcGFyc2VIZXggPSBmdW5jdGlvbiBfcGFyc2VIZXggKG51bWJlciwgc3RhcnQsIGVuZGlhbikge1xuICAgIC8vIENyZWF0ZSBwb3NzaWJseSBiaWdnZXIgYXJyYXkgdG8gZW5zdXJlIHRoYXQgaXQgZml0cyB0aGUgbnVtYmVyXG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwoKG51bWJlci5sZW5ndGggLSBzdGFydCkgLyA2KTtcbiAgICB0aGlzLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAwO1xuICAgIH1cblxuICAgIC8vIDI0LWJpdHMgY2h1bmtzXG4gICAgdmFyIG9mZiA9IDA7XG4gICAgdmFyIGogPSAwO1xuXG4gICAgdmFyIHc7XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2JlJykge1xuICAgICAgZm9yIChpID0gbnVtYmVyLmxlbmd0aCAtIDE7IGkgPj0gc3RhcnQ7IGkgLT0gMikge1xuICAgICAgICB3ID0gcGFyc2VIZXhCeXRlKG51bWJlciwgc3RhcnQsIGkpIDw8IG9mZjtcbiAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSB3ICYgMHgzZmZmZmZmO1xuICAgICAgICBpZiAob2ZmID49IDE4KSB7XG4gICAgICAgICAgb2ZmIC09IDE4O1xuICAgICAgICAgIGogKz0gMTtcbiAgICAgICAgICB0aGlzLndvcmRzW2pdIHw9IHcgPj4+IDI2O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9mZiArPSA4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwYXJzZUxlbmd0aCA9IG51bWJlci5sZW5ndGggLSBzdGFydDtcbiAgICAgIGZvciAoaSA9IHBhcnNlTGVuZ3RoICUgMiA9PT0gMCA/IHN0YXJ0ICsgMSA6IHN0YXJ0OyBpIDwgbnVtYmVyLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHcgPSBwYXJzZUhleEJ5dGUobnVtYmVyLCBzdGFydCwgaSkgPDwgb2ZmO1xuICAgICAgICB0aGlzLndvcmRzW2pdIHw9IHcgJiAweDNmZmZmZmY7XG4gICAgICAgIGlmIChvZmYgPj0gMTgpIHtcbiAgICAgICAgICBvZmYgLT0gMTg7XG4gICAgICAgICAgaiArPSAxO1xuICAgICAgICAgIHRoaXMud29yZHNbal0gfD0gdyA+Pj4gMjY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2ZmICs9IDg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gcGFyc2VCYXNlIChzdHIsIHN0YXJ0LCBlbmQsIG11bCkge1xuICAgIHZhciByID0gMDtcbiAgICB2YXIgbGVuID0gTWF0aC5taW4oc3RyLmxlbmd0aCwgZW5kKTtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBsZW47IGkrKykge1xuICAgICAgdmFyIGMgPSBzdHIuY2hhckNvZGVBdChpKSAtIDQ4O1xuXG4gICAgICByICo9IG11bDtcblxuICAgICAgLy8gJ2EnXG4gICAgICBpZiAoYyA+PSA0OSkge1xuICAgICAgICByICs9IGMgLSA0OSArIDB4YTtcblxuICAgICAgLy8gJ0EnXG4gICAgICB9IGVsc2UgaWYgKGMgPj0gMTcpIHtcbiAgICAgICAgciArPSBjIC0gMTcgKyAweGE7XG5cbiAgICAgIC8vICcwJyAtICc5J1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgciArPSBjO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5fcGFyc2VCYXNlID0gZnVuY3Rpb24gX3BhcnNlQmFzZSAobnVtYmVyLCBiYXNlLCBzdGFydCkge1xuICAgIC8vIEluaXRpYWxpemUgYXMgemVyb1xuICAgIHRoaXMud29yZHMgPSBbIDAgXTtcbiAgICB0aGlzLmxlbmd0aCA9IDE7XG5cbiAgICAvLyBGaW5kIGxlbmd0aCBvZiBsaW1iIGluIGJhc2VcbiAgICBmb3IgKHZhciBsaW1iTGVuID0gMCwgbGltYlBvdyA9IDE7IGxpbWJQb3cgPD0gMHgzZmZmZmZmOyBsaW1iUG93ICo9IGJhc2UpIHtcbiAgICAgIGxpbWJMZW4rKztcbiAgICB9XG4gICAgbGltYkxlbi0tO1xuICAgIGxpbWJQb3cgPSAobGltYlBvdyAvIGJhc2UpIHwgMDtcblxuICAgIHZhciB0b3RhbCA9IG51bWJlci5sZW5ndGggLSBzdGFydDtcbiAgICB2YXIgbW9kID0gdG90YWwgJSBsaW1iTGVuO1xuICAgIHZhciBlbmQgPSBNYXRoLm1pbih0b3RhbCwgdG90YWwgLSBtb2QpICsgc3RhcnQ7XG5cbiAgICB2YXIgd29yZCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGxpbWJMZW4pIHtcbiAgICAgIHdvcmQgPSBwYXJzZUJhc2UobnVtYmVyLCBpLCBpICsgbGltYkxlbiwgYmFzZSk7XG5cbiAgICAgIHRoaXMuaW11bG4obGltYlBvdyk7XG4gICAgICBpZiAodGhpcy53b3Jkc1swXSArIHdvcmQgPCAweDQwMDAwMDApIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSArPSB3b3JkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faWFkZG4od29yZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vZCAhPT0gMCkge1xuICAgICAgdmFyIHBvdyA9IDE7XG4gICAgICB3b3JkID0gcGFyc2VCYXNlKG51bWJlciwgaSwgbnVtYmVyLmxlbmd0aCwgYmFzZSk7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBtb2Q7IGkrKykge1xuICAgICAgICBwb3cgKj0gYmFzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbXVsbihwb3cpO1xuICAgICAgaWYgKHRoaXMud29yZHNbMF0gKyB3b3JkIDwgMHg0MDAwMDAwKSB7XG4gICAgICAgIHRoaXMud29yZHNbMF0gKz0gd29yZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2lhZGRuKHdvcmQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKGRlc3QpIHtcbiAgICBkZXN0LndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlc3Qud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldO1xuICAgIH1cbiAgICBkZXN0Lmxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgIGRlc3QubmVnYXRpdmUgPSB0aGlzLm5lZ2F0aXZlO1xuICAgIGRlc3QucmVkID0gdGhpcy5yZWQ7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gY2xvbmUgKCkge1xuICAgIHZhciByID0gbmV3IEJOKG51bGwpO1xuICAgIHRoaXMuY29weShyKTtcbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2V4cGFuZCA9IGZ1bmN0aW9uIF9leHBhbmQgKHNpemUpIHtcbiAgICB3aGlsZSAodGhpcy5sZW5ndGggPCBzaXplKSB7XG4gICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gUmVtb3ZlIGxlYWRpbmcgYDBgIGZyb20gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zdHJpcCA9IGZ1bmN0aW9uIHN0cmlwICgpIHtcbiAgICB3aGlsZSAodGhpcy5sZW5ndGggPiAxICYmIHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSA9PT0gMCkge1xuICAgICAgdGhpcy5sZW5ndGgtLTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX25vcm1TaWduKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9ub3JtU2lnbiA9IGZ1bmN0aW9uIF9ub3JtU2lnbiAoKSB7XG4gICAgLy8gLTAgPSAwXG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICAgIHJldHVybiAodGhpcy5yZWQgPyAnPEJOLVI6ICcgOiAnPEJOOiAnKSArIHRoaXMudG9TdHJpbmcoMTYpICsgJz4nO1xuICB9O1xuXG4gIC8qXG5cbiAgdmFyIHplcm9zID0gW107XG4gIHZhciBncm91cFNpemVzID0gW107XG4gIHZhciBncm91cEJhc2VzID0gW107XG5cbiAgdmFyIHMgPSAnJztcbiAgdmFyIGkgPSAtMTtcbiAgd2hpbGUgKCsraSA8IEJOLndvcmRTaXplKSB7XG4gICAgemVyb3NbaV0gPSBzO1xuICAgIHMgKz0gJzAnO1xuICB9XG4gIGdyb3VwU2l6ZXNbMF0gPSAwO1xuICBncm91cFNpemVzWzFdID0gMDtcbiAgZ3JvdXBCYXNlc1swXSA9IDA7XG4gIGdyb3VwQmFzZXNbMV0gPSAwO1xuICB2YXIgYmFzZSA9IDIgLSAxO1xuICB3aGlsZSAoKytiYXNlIDwgMzYgKyAxKSB7XG4gICAgdmFyIGdyb3VwU2l6ZSA9IDA7XG4gICAgdmFyIGdyb3VwQmFzZSA9IDE7XG4gICAgd2hpbGUgKGdyb3VwQmFzZSA8ICgxIDw8IEJOLndvcmRTaXplKSAvIGJhc2UpIHtcbiAgICAgIGdyb3VwQmFzZSAqPSBiYXNlO1xuICAgICAgZ3JvdXBTaXplICs9IDE7XG4gICAgfVxuICAgIGdyb3VwU2l6ZXNbYmFzZV0gPSBncm91cFNpemU7XG4gICAgZ3JvdXBCYXNlc1tiYXNlXSA9IGdyb3VwQmFzZTtcbiAgfVxuXG4gICovXG5cbiAgdmFyIHplcm9zID0gW1xuICAgICcnLFxuICAgICcwJyxcbiAgICAnMDAnLFxuICAgICcwMDAnLFxuICAgICcwMDAwJyxcbiAgICAnMDAwMDAnLFxuICAgICcwMDAwMDAnLFxuICAgICcwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuICBdO1xuXG4gIHZhciBncm91cFNpemVzID0gW1xuICAgIDAsIDAsXG4gICAgMjUsIDE2LCAxMiwgMTEsIDEwLCA5LCA4LFxuICAgIDgsIDcsIDcsIDcsIDcsIDYsIDYsXG4gICAgNiwgNiwgNiwgNiwgNiwgNSwgNSxcbiAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LFxuICAgIDUsIDUsIDUsIDUsIDUsIDUsIDVcbiAgXTtcblxuICB2YXIgZ3JvdXBCYXNlcyA9IFtcbiAgICAwLCAwLFxuICAgIDMzNTU0NDMyLCA0MzA0NjcyMSwgMTY3NzcyMTYsIDQ4ODI4MTI1LCA2MDQ2NjE3NiwgNDAzNTM2MDcsIDE2Nzc3MjE2LFxuICAgIDQzMDQ2NzIxLCAxMDAwMDAwMCwgMTk0ODcxNzEsIDM1ODMxODA4LCA2Mjc0ODUxNywgNzUyOTUzNiwgMTEzOTA2MjUsXG4gICAgMTY3NzcyMTYsIDI0MTM3NTY5LCAzNDAxMjIyNCwgNDcwNDU4ODEsIDY0MDAwMDAwLCA0MDg0MTAxLCA1MTUzNjMyLFxuICAgIDY0MzYzNDMsIDc5NjI2MjQsIDk3NjU2MjUsIDExODgxMzc2LCAxNDM0ODkwNywgMTcyMTAzNjgsIDIwNTExMTQ5LFxuICAgIDI0MzAwMDAwLCAyODYyOTE1MSwgMzM1NTQ0MzIsIDM5MTM1MzkzLCA0NTQzNTQyNCwgNTI1MjE4NzUsIDYwNDY2MTc2XG4gIF07XG5cbiAgQk4ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKGJhc2UsIHBhZGRpbmcpIHtcbiAgICBiYXNlID0gYmFzZSB8fCAxMDtcbiAgICBwYWRkaW5nID0gcGFkZGluZyB8IDAgfHwgMTtcblxuICAgIHZhciBvdXQ7XG4gICAgaWYgKGJhc2UgPT09IDE2IHx8IGJhc2UgPT09ICdoZXgnKSB7XG4gICAgICBvdXQgPSAnJztcbiAgICAgIHZhciBvZmYgPSAwO1xuICAgICAgdmFyIGNhcnJ5ID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdyA9IHRoaXMud29yZHNbaV07XG4gICAgICAgIHZhciB3b3JkID0gKCgodyA8PCBvZmYpIHwgY2FycnkpICYgMHhmZmZmZmYpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgY2FycnkgPSAodyA+Pj4gKDI0IC0gb2ZmKSkgJiAweGZmZmZmZjtcbiAgICAgICAgb2ZmICs9IDI7XG4gICAgICAgIGlmIChvZmYgPj0gMjYpIHtcbiAgICAgICAgICBvZmYgLT0gMjY7XG4gICAgICAgICAgaS0tO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYXJyeSAhPT0gMCB8fCBpICE9PSB0aGlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBvdXQgPSB6ZXJvc1s2IC0gd29yZC5sZW5ndGhdICsgd29yZCArIG91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgPSB3b3JkICsgb3V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgICAgb3V0ID0gY2FycnkudG9TdHJpbmcoMTYpICsgb3V0O1xuICAgICAgfVxuICAgICAgd2hpbGUgKG91dC5sZW5ndGggJSBwYWRkaW5nICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICcwJyArIG91dDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICctJyArIG91dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgaWYgKGJhc2UgPT09IChiYXNlIHwgMCkgJiYgYmFzZSA+PSAyICYmIGJhc2UgPD0gMzYpIHtcbiAgICAgIC8vIHZhciBncm91cFNpemUgPSBNYXRoLmZsb29yKEJOLndvcmRTaXplICogTWF0aC5MTjIgLyBNYXRoLmxvZyhiYXNlKSk7XG4gICAgICB2YXIgZ3JvdXBTaXplID0gZ3JvdXBTaXplc1tiYXNlXTtcbiAgICAgIC8vIHZhciBncm91cEJhc2UgPSBNYXRoLnBvdyhiYXNlLCBncm91cFNpemUpO1xuICAgICAgdmFyIGdyb3VwQmFzZSA9IGdyb3VwQmFzZXNbYmFzZV07XG4gICAgICBvdXQgPSAnJztcbiAgICAgIHZhciBjID0gdGhpcy5jbG9uZSgpO1xuICAgICAgYy5uZWdhdGl2ZSA9IDA7XG4gICAgICB3aGlsZSAoIWMuaXNaZXJvKCkpIHtcbiAgICAgICAgdmFyIHIgPSBjLm1vZG4oZ3JvdXBCYXNlKS50b1N0cmluZyhiYXNlKTtcbiAgICAgICAgYyA9IGMuaWRpdm4oZ3JvdXBCYXNlKTtcblxuICAgICAgICBpZiAoIWMuaXNaZXJvKCkpIHtcbiAgICAgICAgICBvdXQgPSB6ZXJvc1tncm91cFNpemUgLSByLmxlbmd0aF0gKyByICsgb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCA9IHIgKyBvdXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzWmVybygpKSB7XG4gICAgICAgIG91dCA9ICcwJyArIG91dDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChvdXQubGVuZ3RoICUgcGFkZGluZyAhPT0gMCkge1xuICAgICAgICBvdXQgPSAnMCcgKyBvdXQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICBvdXQgPSAnLScgKyBvdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIGFzc2VydChmYWxzZSwgJ0Jhc2Ugc2hvdWxkIGJlIGJldHdlZW4gMiBhbmQgMzYnKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9OdW1iZXIgPSBmdW5jdGlvbiB0b051bWJlciAoKSB7XG4gICAgdmFyIHJldCA9IHRoaXMud29yZHNbMF07XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAyKSB7XG4gICAgICByZXQgKz0gdGhpcy53b3Jkc1sxXSAqIDB4NDAwMDAwMDtcbiAgICB9IGVsc2UgaWYgKHRoaXMubGVuZ3RoID09PSAzICYmIHRoaXMud29yZHNbMl0gPT09IDB4MDEpIHtcbiAgICAgIC8vIE5PVEU6IGF0IHRoaXMgc3RhZ2UgaXQgaXMga25vd24gdGhhdCB0aGUgdG9wIGJpdCBpcyBzZXRcbiAgICAgIHJldCArPSAweDEwMDAwMDAwMDAwMDAwICsgKHRoaXMud29yZHNbMV0gKiAweDQwMDAwMDApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sZW5ndGggPiAyKSB7XG4gICAgICBhc3NlcnQoZmFsc2UsICdOdW1iZXIgY2FuIG9ubHkgc2FmZWx5IHN0b3JlIHVwIHRvIDUzIGJpdHMnKTtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLm5lZ2F0aXZlICE9PSAwKSA/IC1yZXQgOiByZXQ7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoMTYpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b0J1ZmZlciA9IGZ1bmN0aW9uIHRvQnVmZmVyIChlbmRpYW4sIGxlbmd0aCkge1xuICAgIGFzc2VydCh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJyk7XG4gICAgcmV0dXJuIHRoaXMudG9BcnJheUxpa2UoQnVmZmVyLCBlbmRpYW4sIGxlbmd0aCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiB0b0FycmF5IChlbmRpYW4sIGxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLnRvQXJyYXlMaWtlKEFycmF5LCBlbmRpYW4sIGxlbmd0aCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvQXJyYXlMaWtlID0gZnVuY3Rpb24gdG9BcnJheUxpa2UgKEFycmF5VHlwZSwgZW5kaWFuLCBsZW5ndGgpIHtcbiAgICB2YXIgYnl0ZUxlbmd0aCA9IHRoaXMuYnl0ZUxlbmd0aCgpO1xuICAgIHZhciByZXFMZW5ndGggPSBsZW5ndGggfHwgTWF0aC5tYXgoMSwgYnl0ZUxlbmd0aCk7XG4gICAgYXNzZXJ0KGJ5dGVMZW5ndGggPD0gcmVxTGVuZ3RoLCAnYnl0ZSBhcnJheSBsb25nZXIgdGhhbiBkZXNpcmVkIGxlbmd0aCcpO1xuICAgIGFzc2VydChyZXFMZW5ndGggPiAwLCAnUmVxdWVzdGVkIGFycmF5IGxlbmd0aCA8PSAwJyk7XG5cbiAgICB0aGlzLnN0cmlwKCk7XG4gICAgdmFyIGxpdHRsZUVuZGlhbiA9IGVuZGlhbiA9PT0gJ2xlJztcbiAgICB2YXIgcmVzID0gbmV3IEFycmF5VHlwZShyZXFMZW5ndGgpO1xuXG4gICAgdmFyIGIsIGk7XG4gICAgdmFyIHEgPSB0aGlzLmNsb25lKCk7XG4gICAgaWYgKCFsaXR0bGVFbmRpYW4pIHtcbiAgICAgIC8vIEFzc3VtZSBiaWctZW5kaWFuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgcmVxTGVuZ3RoIC0gYnl0ZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc1tpXSA9IDA7XG4gICAgICB9XG5cbiAgICAgIGZvciAoaSA9IDA7ICFxLmlzWmVybygpOyBpKyspIHtcbiAgICAgICAgYiA9IHEuYW5kbG4oMHhmZik7XG4gICAgICAgIHEuaXVzaHJuKDgpO1xuXG4gICAgICAgIHJlc1tyZXFMZW5ndGggLSBpIC0gMV0gPSBiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGkgPSAwOyAhcS5pc1plcm8oKTsgaSsrKSB7XG4gICAgICAgIGIgPSBxLmFuZGxuKDB4ZmYpO1xuICAgICAgICBxLml1c2hybig4KTtcblxuICAgICAgICByZXNbaV0gPSBiO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgaSA8IHJlcUxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc1tpXSA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBpZiAoTWF0aC5jbHozMikge1xuICAgIEJOLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24gX2NvdW50Qml0cyAodykge1xuICAgICAgcmV0dXJuIDMyIC0gTWF0aC5jbHozMih3KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIEJOLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24gX2NvdW50Qml0cyAodykge1xuICAgICAgdmFyIHQgPSB3O1xuICAgICAgdmFyIHIgPSAwO1xuICAgICAgaWYgKHQgPj0gMHgxMDAwKSB7XG4gICAgICAgIHIgKz0gMTM7XG4gICAgICAgIHQgPj4+PSAxMztcbiAgICAgIH1cbiAgICAgIGlmICh0ID49IDB4NDApIHtcbiAgICAgICAgciArPSA3O1xuICAgICAgICB0ID4+Pj0gNztcbiAgICAgIH1cbiAgICAgIGlmICh0ID49IDB4OCkge1xuICAgICAgICByICs9IDQ7XG4gICAgICAgIHQgPj4+PSA0O1xuICAgICAgfVxuICAgICAgaWYgKHQgPj0gMHgwMikge1xuICAgICAgICByICs9IDI7XG4gICAgICAgIHQgPj4+PSAyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHIgKyB0O1xuICAgIH07XG4gIH1cblxuICBCTi5wcm90b3R5cGUuX3plcm9CaXRzID0gZnVuY3Rpb24gX3plcm9CaXRzICh3KSB7XG4gICAgLy8gU2hvcnQtY3V0XG4gICAgaWYgKHcgPT09IDApIHJldHVybiAyNjtcblxuICAgIHZhciB0ID0gdztcbiAgICB2YXIgciA9IDA7XG4gICAgaWYgKCh0ICYgMHgxZmZmKSA9PT0gMCkge1xuICAgICAgciArPSAxMztcbiAgICAgIHQgPj4+PSAxMztcbiAgICB9XG4gICAgaWYgKCh0ICYgMHg3ZikgPT09IDApIHtcbiAgICAgIHIgKz0gNztcbiAgICAgIHQgPj4+PSA3O1xuICAgIH1cbiAgICBpZiAoKHQgJiAweGYpID09PSAwKSB7XG4gICAgICByICs9IDQ7XG4gICAgICB0ID4+Pj0gNDtcbiAgICB9XG4gICAgaWYgKCh0ICYgMHgzKSA9PT0gMCkge1xuICAgICAgciArPSAyO1xuICAgICAgdCA+Pj49IDI7XG4gICAgfVxuICAgIGlmICgodCAmIDB4MSkgPT09IDApIHtcbiAgICAgIHIrKztcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG51bWJlciBvZiB1c2VkIGJpdHMgaW4gYSBCTlxuICBCTi5wcm90b3R5cGUuYml0TGVuZ3RoID0gZnVuY3Rpb24gYml0TGVuZ3RoICgpIHtcbiAgICB2YXIgdyA9IHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXTtcbiAgICB2YXIgaGkgPSB0aGlzLl9jb3VudEJpdHModyk7XG4gICAgcmV0dXJuICh0aGlzLmxlbmd0aCAtIDEpICogMjYgKyBoaTtcbiAgfTtcblxuICBmdW5jdGlvbiB0b0JpdEFycmF5IChudW0pIHtcbiAgICB2YXIgdyA9IG5ldyBBcnJheShudW0uYml0TGVuZ3RoKCkpO1xuXG4gICAgZm9yICh2YXIgYml0ID0gMDsgYml0IDwgdy5sZW5ndGg7IGJpdCsrKSB7XG4gICAgICB2YXIgb2ZmID0gKGJpdCAvIDI2KSB8IDA7XG4gICAgICB2YXIgd2JpdCA9IGJpdCAlIDI2O1xuXG4gICAgICB3W2JpdF0gPSAobnVtLndvcmRzW29mZl0gJiAoMSA8PCB3Yml0KSkgPj4+IHdiaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHc7XG4gIH1cblxuICAvLyBOdW1iZXIgb2YgdHJhaWxpbmcgemVybyBiaXRzXG4gIEJOLnByb3RvdHlwZS56ZXJvQml0cyA9IGZ1bmN0aW9uIHplcm9CaXRzICgpIHtcbiAgICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIDA7XG5cbiAgICB2YXIgciA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYiA9IHRoaXMuX3plcm9CaXRzKHRoaXMud29yZHNbaV0pO1xuICAgICAgciArPSBiO1xuICAgICAgaWYgKGIgIT09IDI2KSBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmJ5dGVMZW5ndGggPSBmdW5jdGlvbiBieXRlTGVuZ3RoICgpIHtcbiAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMuYml0TGVuZ3RoKCkgLyA4KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9Ud29zID0gZnVuY3Rpb24gdG9Ud29zICh3aWR0aCkge1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5hYnMoKS5pbm90bih3aWR0aCkuaWFkZG4oMSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb25lKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmZyb21Ud29zID0gZnVuY3Rpb24gZnJvbVR3b3MgKHdpZHRoKSB7XG4gICAgaWYgKHRoaXMudGVzdG4od2lkdGggLSAxKSkge1xuICAgICAgcmV0dXJuIHRoaXMubm90bih3aWR0aCkuaWFkZG4oMSkuaW5lZygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc05lZyA9IGZ1bmN0aW9uIGlzTmVnICgpIHtcbiAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMDtcbiAgfTtcblxuICAvLyBSZXR1cm4gbmVnYXRpdmUgY2xvbmUgb2YgYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcgKCkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW5lZygpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pbmVnID0gZnVuY3Rpb24gaW5lZyAoKSB7XG4gICAgaWYgKCF0aGlzLmlzWmVybygpKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlIF49IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gT3IgYG51bWAgd2l0aCBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1b3IgPSBmdW5jdGlvbiBpdW9yIChudW0pIHtcbiAgICB3aGlsZSAodGhpcy5sZW5ndGggPCBudW0ubGVuZ3RoKSB7XG4gICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV0gfCBudW0ud29yZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaW9yID0gZnVuY3Rpb24gaW9yIChudW0pIHtcbiAgICBhc3NlcnQoKHRoaXMubmVnYXRpdmUgfCBudW0ubmVnYXRpdmUpID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdW9yKG51bSk7XG4gIH07XG5cbiAgLy8gT3IgYG51bWAgd2l0aCBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLm9yID0gZnVuY3Rpb24gb3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaW9yKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLmlvcih0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudW9yID0gZnVuY3Rpb24gdW9yIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLml1b3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXVvcih0aGlzKTtcbiAgfTtcblxuICAvLyBBbmQgYG51bWAgd2l0aCBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1YW5kID0gZnVuY3Rpb24gaXVhbmQgKG51bSkge1xuICAgIC8vIGIgPSBtaW4tbGVuZ3RoKG51bSwgdGhpcylcbiAgICB2YXIgYjtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSB7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldICYgbnVtLndvcmRzW2ldO1xuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gYi5sZW5ndGg7XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pYW5kID0gZnVuY3Rpb24gaWFuZCAobnVtKSB7XG4gICAgYXNzZXJ0KCh0aGlzLm5lZ2F0aXZlIHwgbnVtLm5lZ2F0aXZlKSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXVhbmQobnVtKTtcbiAgfTtcblxuICAvLyBBbmQgYG51bWAgd2l0aCBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uIGFuZCAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYW5kKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLmlhbmQodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVhbmQgPSBmdW5jdGlvbiB1YW5kIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLml1YW5kKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLml1YW5kKHRoaXMpO1xuICB9O1xuXG4gIC8vIFhvciBgbnVtYCB3aXRoIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXV4b3IgPSBmdW5jdGlvbiBpdXhvciAobnVtKSB7XG4gICAgLy8gYS5sZW5ndGggPiBiLmxlbmd0aFxuICAgIHZhciBhO1xuICAgIHZhciBiO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHtcbiAgICAgIGEgPSB0aGlzO1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IG51bTtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGEud29yZHNbaV0gXiBiLndvcmRzW2ldO1xuICAgIH1cblxuICAgIGlmICh0aGlzICE9PSBhKSB7XG4gICAgICBmb3IgKDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGEud29yZHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBhLmxlbmd0aDtcblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLml4b3IgPSBmdW5jdGlvbiBpeG9yIChudW0pIHtcbiAgICBhc3NlcnQoKHRoaXMubmVnYXRpdmUgfCBudW0ubmVnYXRpdmUpID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdXhvcihudW0pO1xuICB9O1xuXG4gIC8vIFhvciBgbnVtYCB3aXRoIGB0aGlzYFxuICBCTi5wcm90b3R5cGUueG9yID0gZnVuY3Rpb24geG9yIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLml4b3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXhvcih0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudXhvciA9IGZ1bmN0aW9uIHV4b3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXV4b3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXV4b3IodGhpcyk7XG4gIH07XG5cbiAgLy8gTm90IGBgdGhpc2BgIHdpdGggYGB3aWR0aGBgIGJpdHdpZHRoXG4gIEJOLnByb3RvdHlwZS5pbm90biA9IGZ1bmN0aW9uIGlub3RuICh3aWR0aCkge1xuICAgIGFzc2VydCh0eXBlb2Ygd2lkdGggPT09ICdudW1iZXInICYmIHdpZHRoID49IDApO1xuXG4gICAgdmFyIGJ5dGVzTmVlZGVkID0gTWF0aC5jZWlsKHdpZHRoIC8gMjYpIHwgMDtcbiAgICB2YXIgYml0c0xlZnQgPSB3aWR0aCAlIDI2O1xuXG4gICAgLy8gRXh0ZW5kIHRoZSBidWZmZXIgd2l0aCBsZWFkaW5nIHplcm9lc1xuICAgIHRoaXMuX2V4cGFuZChieXRlc05lZWRlZCk7XG5cbiAgICBpZiAoYml0c0xlZnQgPiAwKSB7XG4gICAgICBieXRlc05lZWRlZC0tO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBjb21wbGV0ZSB3b3Jkc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXNOZWVkZWQ7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IH50aGlzLndvcmRzW2ldICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0aGUgcmVzaWR1ZVxuICAgIGlmIChiaXRzTGVmdCA+IDApIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB+dGhpcy53b3Jkc1tpXSAmICgweDNmZmZmZmYgPj4gKDI2IC0gYml0c0xlZnQpKTtcbiAgICB9XG5cbiAgICAvLyBBbmQgcmVtb3ZlIGxlYWRpbmcgemVyb2VzXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubm90biA9IGZ1bmN0aW9uIG5vdG4gKHdpZHRoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbm90bih3aWR0aCk7XG4gIH07XG5cbiAgLy8gU2V0IGBiaXRgIG9mIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuc2V0biA9IGZ1bmN0aW9uIHNldG4gKGJpdCwgdmFsKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXQgPT09ICdudW1iZXInICYmIGJpdCA+PSAwKTtcblxuICAgIHZhciBvZmYgPSAoYml0IC8gMjYpIHwgMDtcbiAgICB2YXIgd2JpdCA9IGJpdCAlIDI2O1xuXG4gICAgdGhpcy5fZXhwYW5kKG9mZiArIDEpO1xuXG4gICAgaWYgKHZhbCkge1xuICAgICAgdGhpcy53b3Jkc1tvZmZdID0gdGhpcy53b3Jkc1tvZmZdIHwgKDEgPDwgd2JpdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud29yZHNbb2ZmXSA9IHRoaXMud29yZHNbb2ZmXSAmIH4oMSA8PCB3Yml0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIC8vIEFkZCBgbnVtYCB0byBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLmlhZGQgPSBmdW5jdGlvbiBpYWRkIChudW0pIHtcbiAgICB2YXIgcjtcblxuICAgIC8vIG5lZ2F0aXZlICsgcG9zaXRpdmVcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBudW0ubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgciA9IHRoaXMuaXN1YihudW0pO1xuICAgICAgdGhpcy5uZWdhdGl2ZSBePSAxO1xuICAgICAgcmV0dXJuIHRoaXMuX25vcm1TaWduKCk7XG5cbiAgICAvLyBwb3NpdGl2ZSArIG5lZ2F0aXZlXG4gICAgfSBlbHNlIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG51bS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMDtcbiAgICAgIHIgPSB0aGlzLmlzdWIobnVtKTtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gci5fbm9ybVNpZ24oKTtcbiAgICB9XG5cbiAgICAvLyBhLmxlbmd0aCA+IGIubGVuZ3RoXG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkge1xuICAgICAgYSA9IHRoaXM7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gbnVtO1xuICAgICAgYiA9IHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSAoYS53b3Jkc1tpXSB8IDApICsgKGIud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgICBjYXJyeSA9IHIgPj4+IDI2O1xuICAgIH1cbiAgICBmb3IgKDsgY2FycnkgIT09IDAgJiYgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSAoYS53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICAgIGNhcnJ5ID0gciA+Pj4gMjY7XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBhLmxlbmd0aDtcbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGhdID0gY2Fycnk7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIC8vIENvcHkgdGhlIHJlc3Qgb2YgdGhlIHdvcmRzXG4gICAgfSBlbHNlIGlmIChhICE9PSB0aGlzKSB7XG4gICAgICBmb3IgKDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGEud29yZHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gQWRkIGBudW1gIHRvIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkIChudW0pIHtcbiAgICB2YXIgcmVzO1xuICAgIGlmIChudW0ubmVnYXRpdmUgIT09IDAgJiYgdGhpcy5uZWdhdGl2ZSA9PT0gMCkge1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMDtcbiAgICAgIHJlcyA9IHRoaXMuc3ViKG51bSk7XG4gICAgICBudW0ubmVnYXRpdmUgXj0gMTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSBlbHNlIGlmIChudW0ubmVnYXRpdmUgPT09IDAgJiYgdGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICByZXMgPSBudW0uc3ViKHRoaXMpO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaWFkZChudW0pO1xuXG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLmlhZGQodGhpcyk7XG4gIH07XG5cbiAgLy8gU3VidHJhY3QgYG51bWAgZnJvbSBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLmlzdWIgPSBmdW5jdGlvbiBpc3ViIChudW0pIHtcbiAgICAvLyB0aGlzIC0gKC1udW0pID0gdGhpcyArIG51bVxuICAgIGlmIChudW0ubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDA7XG4gICAgICB2YXIgciA9IHRoaXMuaWFkZChudW0pO1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiByLl9ub3JtU2lnbigpO1xuXG4gICAgLy8gLXRoaXMgLSBudW0gPSAtKHRoaXMgKyBudW0pXG4gICAgfSBlbHNlIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHRoaXMuaWFkZChudW0pO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcbiAgICB9XG5cbiAgICAvLyBBdCB0aGlzIHBvaW50IGJvdGggbnVtYmVycyBhcmUgcG9zaXRpdmVcbiAgICB2YXIgY21wID0gdGhpcy5jbXAobnVtKTtcblxuICAgIC8vIE9wdGltaXphdGlvbiAtIHplcm9pZnlcbiAgICBpZiAoY21wID09PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAwO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gYSA+IGJcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAoY21wID4gMCkge1xuICAgICAgYSA9IHRoaXM7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gbnVtO1xuICAgICAgYiA9IHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSAoYS53b3Jkc1tpXSB8IDApIC0gKGIud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgY2FycnkgPSByID4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgfVxuICAgIGZvciAoOyBjYXJyeSAhPT0gMCAmJiBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gciA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIC8vIENvcHkgcmVzdCBvZiB0aGUgd29yZHNcbiAgICBpZiAoY2FycnkgPT09IDAgJiYgaSA8IGEubGVuZ3RoICYmIGEgIT09IHRoaXMpIHtcbiAgICAgIGZvciAoOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoLCBpKTtcblxuICAgIGlmIChhICE9PSB0aGlzKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIC8vIFN1YnRyYWN0IGBudW1gIGZyb20gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zdWIgPSBmdW5jdGlvbiBzdWIgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXN1YihudW0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHNtYWxsTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgb3V0Lm5lZ2F0aXZlID0gbnVtLm5lZ2F0aXZlIF4gc2VsZi5uZWdhdGl2ZTtcbiAgICB2YXIgbGVuID0gKHNlbGYubGVuZ3RoICsgbnVtLmxlbmd0aCkgfCAwO1xuICAgIG91dC5sZW5ndGggPSBsZW47XG4gICAgbGVuID0gKGxlbiAtIDEpIHwgMDtcblxuICAgIC8vIFBlZWwgb25lIGl0ZXJhdGlvbiAoY29tcGlsZXIgY2FuJ3QgZG8gaXQsIGJlY2F1c2Ugb2YgY29kZSBjb21wbGV4aXR5KVxuICAgIHZhciBhID0gc2VsZi53b3Jkc1swXSB8IDA7XG4gICAgdmFyIGIgPSBudW0ud29yZHNbMF0gfCAwO1xuICAgIHZhciByID0gYSAqIGI7XG5cbiAgICB2YXIgbG8gPSByICYgMHgzZmZmZmZmO1xuICAgIHZhciBjYXJyeSA9IChyIC8gMHg0MDAwMDAwKSB8IDA7XG4gICAgb3V0LndvcmRzWzBdID0gbG87XG5cbiAgICBmb3IgKHZhciBrID0gMTsgayA8IGxlbjsgaysrKSB7XG4gICAgICAvLyBTdW0gYWxsIHdvcmRzIHdpdGggdGhlIHNhbWUgYGkgKyBqID0ga2AgYW5kIGFjY3VtdWxhdGUgYG5jYXJyeWAsXG4gICAgICAvLyBub3RlIHRoYXQgbmNhcnJ5IGNvdWxkIGJlID49IDB4M2ZmZmZmZlxuICAgICAgdmFyIG5jYXJyeSA9IGNhcnJ5ID4+PiAyNjtcbiAgICAgIHZhciByd29yZCA9IGNhcnJ5ICYgMHgzZmZmZmZmO1xuICAgICAgdmFyIG1heEogPSBNYXRoLm1pbihrLCBudW0ubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBqID0gTWF0aC5tYXgoMCwgayAtIHNlbGYubGVuZ3RoICsgMSk7IGogPD0gbWF4SjsgaisrKSB7XG4gICAgICAgIHZhciBpID0gKGsgLSBqKSB8IDA7XG4gICAgICAgIGEgPSBzZWxmLndvcmRzW2ldIHwgMDtcbiAgICAgICAgYiA9IG51bS53b3Jkc1tqXSB8IDA7XG4gICAgICAgIHIgPSBhICogYiArIHJ3b3JkO1xuICAgICAgICBuY2FycnkgKz0gKHIgLyAweDQwMDAwMDApIHwgMDtcbiAgICAgICAgcndvcmQgPSByICYgMHgzZmZmZmZmO1xuICAgICAgfVxuICAgICAgb3V0LndvcmRzW2tdID0gcndvcmQgfCAwO1xuICAgICAgY2FycnkgPSBuY2FycnkgfCAwO1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIG91dC53b3Jkc1trXSA9IGNhcnJ5IHwgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0Lmxlbmd0aC0tO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQuc3RyaXAoKTtcbiAgfVxuXG4gIC8vIFRPRE8oaW5kdXRueSk6IGl0IG1heSBiZSByZWFzb25hYmxlIHRvIG9taXQgaXQgZm9yIHVzZXJzIHdobyBkb24ndCBuZWVkXG4gIC8vIHRvIHdvcmsgd2l0aCAyNTYtYml0IG51bWJlcnMsIG90aGVyd2lzZSBpdCBnaXZlcyAyMCUgaW1wcm92ZW1lbnQgZm9yIDI1Ni1iaXRcbiAgLy8gbXVsdGlwbGljYXRpb24gKGxpa2UgZWxsaXB0aWMgc2VjcDI1NmsxKS5cbiAgdmFyIGNvbWIxME11bFRvID0gZnVuY3Rpb24gY29tYjEwTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgdmFyIGEgPSBzZWxmLndvcmRzO1xuICAgIHZhciBiID0gbnVtLndvcmRzO1xuICAgIHZhciBvID0gb3V0LndvcmRzO1xuICAgIHZhciBjID0gMDtcbiAgICB2YXIgbG87XG4gICAgdmFyIG1pZDtcbiAgICB2YXIgaGk7XG4gICAgdmFyIGEwID0gYVswXSB8IDA7XG4gICAgdmFyIGFsMCA9IGEwICYgMHgxZmZmO1xuICAgIHZhciBhaDAgPSBhMCA+Pj4gMTM7XG4gICAgdmFyIGExID0gYVsxXSB8IDA7XG4gICAgdmFyIGFsMSA9IGExICYgMHgxZmZmO1xuICAgIHZhciBhaDEgPSBhMSA+Pj4gMTM7XG4gICAgdmFyIGEyID0gYVsyXSB8IDA7XG4gICAgdmFyIGFsMiA9IGEyICYgMHgxZmZmO1xuICAgIHZhciBhaDIgPSBhMiA+Pj4gMTM7XG4gICAgdmFyIGEzID0gYVszXSB8IDA7XG4gICAgdmFyIGFsMyA9IGEzICYgMHgxZmZmO1xuICAgIHZhciBhaDMgPSBhMyA+Pj4gMTM7XG4gICAgdmFyIGE0ID0gYVs0XSB8IDA7XG4gICAgdmFyIGFsNCA9IGE0ICYgMHgxZmZmO1xuICAgIHZhciBhaDQgPSBhNCA+Pj4gMTM7XG4gICAgdmFyIGE1ID0gYVs1XSB8IDA7XG4gICAgdmFyIGFsNSA9IGE1ICYgMHgxZmZmO1xuICAgIHZhciBhaDUgPSBhNSA+Pj4gMTM7XG4gICAgdmFyIGE2ID0gYVs2XSB8IDA7XG4gICAgdmFyIGFsNiA9IGE2ICYgMHgxZmZmO1xuICAgIHZhciBhaDYgPSBhNiA+Pj4gMTM7XG4gICAgdmFyIGE3ID0gYVs3XSB8IDA7XG4gICAgdmFyIGFsNyA9IGE3ICYgMHgxZmZmO1xuICAgIHZhciBhaDcgPSBhNyA+Pj4gMTM7XG4gICAgdmFyIGE4ID0gYVs4XSB8IDA7XG4gICAgdmFyIGFsOCA9IGE4ICYgMHgxZmZmO1xuICAgIHZhciBhaDggPSBhOCA+Pj4gMTM7XG4gICAgdmFyIGE5ID0gYVs5XSB8IDA7XG4gICAgdmFyIGFsOSA9IGE5ICYgMHgxZmZmO1xuICAgIHZhciBhaDkgPSBhOSA+Pj4gMTM7XG4gICAgdmFyIGIwID0gYlswXSB8IDA7XG4gICAgdmFyIGJsMCA9IGIwICYgMHgxZmZmO1xuICAgIHZhciBiaDAgPSBiMCA+Pj4gMTM7XG4gICAgdmFyIGIxID0gYlsxXSB8IDA7XG4gICAgdmFyIGJsMSA9IGIxICYgMHgxZmZmO1xuICAgIHZhciBiaDEgPSBiMSA+Pj4gMTM7XG4gICAgdmFyIGIyID0gYlsyXSB8IDA7XG4gICAgdmFyIGJsMiA9IGIyICYgMHgxZmZmO1xuICAgIHZhciBiaDIgPSBiMiA+Pj4gMTM7XG4gICAgdmFyIGIzID0gYlszXSB8IDA7XG4gICAgdmFyIGJsMyA9IGIzICYgMHgxZmZmO1xuICAgIHZhciBiaDMgPSBiMyA+Pj4gMTM7XG4gICAgdmFyIGI0ID0gYls0XSB8IDA7XG4gICAgdmFyIGJsNCA9IGI0ICYgMHgxZmZmO1xuICAgIHZhciBiaDQgPSBiNCA+Pj4gMTM7XG4gICAgdmFyIGI1ID0gYls1XSB8IDA7XG4gICAgdmFyIGJsNSA9IGI1ICYgMHgxZmZmO1xuICAgIHZhciBiaDUgPSBiNSA+Pj4gMTM7XG4gICAgdmFyIGI2ID0gYls2XSB8IDA7XG4gICAgdmFyIGJsNiA9IGI2ICYgMHgxZmZmO1xuICAgIHZhciBiaDYgPSBiNiA+Pj4gMTM7XG4gICAgdmFyIGI3ID0gYls3XSB8IDA7XG4gICAgdmFyIGJsNyA9IGI3ICYgMHgxZmZmO1xuICAgIHZhciBiaDcgPSBiNyA+Pj4gMTM7XG4gICAgdmFyIGI4ID0gYls4XSB8IDA7XG4gICAgdmFyIGJsOCA9IGI4ICYgMHgxZmZmO1xuICAgIHZhciBiaDggPSBiOCA+Pj4gMTM7XG4gICAgdmFyIGI5ID0gYls5XSB8IDA7XG4gICAgdmFyIGJsOSA9IGI5ICYgMHgxZmZmO1xuICAgIHZhciBiaDkgPSBiOSA+Pj4gMTM7XG5cbiAgICBvdXQubmVnYXRpdmUgPSBzZWxmLm5lZ2F0aXZlIF4gbnVtLm5lZ2F0aXZlO1xuICAgIG91dC5sZW5ndGggPSAxOTtcbiAgICAvKiBrID0gMCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMCwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwwLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgwLCBiaDApO1xuICAgIHZhciB3MCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzAgPj4+IDI2KSkgfCAwO1xuICAgIHcwICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMSwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwxLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgxLCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoMSkpIHwgMDtcbiAgICB2YXIgdzEgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxID4+PiAyNikpIHwgMDtcbiAgICB3MSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDIgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDIsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsMiwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoMiwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmgyKSkgfCAwO1xuICAgIHZhciB3MiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzIgPj4+IDI2KSkgfCAwO1xuICAgIHcyICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMywgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwzLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgzLCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmgzKSkgfCAwO1xuICAgIHZhciB3MyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzMgPj4+IDI2KSkgfCAwO1xuICAgIHczICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNCwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw0LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg0LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoNCkpIHwgMDtcbiAgICB2YXIgdzQgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc0ID4+PiAyNikpIHwgMDtcbiAgICB3NCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDUgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDUsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsNSwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoNSwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg1KSkgfCAwO1xuICAgIHZhciB3NSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzUgPj4+IDI2KSkgfCAwO1xuICAgIHc1ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNiwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw2LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg2LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg2KSkgfCAwO1xuICAgIHZhciB3NiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzYgPj4+IDI2KSkgfCAwO1xuICAgIHc2ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNywgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw3LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg3LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoNykpIHwgMDtcbiAgICB2YXIgdzcgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc3ID4+PiAyNikpIHwgMDtcbiAgICB3NyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDggKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDgsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOCwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOCwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg4KSkgfCAwO1xuICAgIHZhciB3OCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzggPj4+IDI2KSkgfCAwO1xuICAgIHc4ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gOSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg5KSkgfCAwO1xuICAgIHZhciB3OSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzkgPj4+IDI2KSkgfCAwO1xuICAgIHc5ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTAgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMSk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgxKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmwxKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgxKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTAgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMCA+Pj4gMjYpKSB8IDA7XG4gICAgdzEwICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTEgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMik7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgyKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmwyKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgyKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxMSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzExID4+PiAyNikpIHwgMDtcbiAgICB3MTEgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwzKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDMpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDMpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDMpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg5KSkgfCAwO1xuICAgIHZhciB3MTIgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMiA+Pj4gMjYpKSB8IDA7XG4gICAgdzEyICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTMgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg0KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw0KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg0KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTMgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMyA+Pj4gMjYpKSB8IDA7XG4gICAgdzEzICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTQgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNSk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg1KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw1KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg1KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE0ID4+PiAyNikpIHwgMDtcbiAgICB3MTQgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw2KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDYpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDYpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDYpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTUgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxNSA+Pj4gMjYpKSB8IDA7XG4gICAgdzE1ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTYgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNyk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg3KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw3KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg3KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg5KSkgfCAwO1xuICAgIHZhciB3MTYgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxNiA+Pj4gMjYpKSB8IDA7XG4gICAgdzE2ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTcgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsOCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg4KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw4KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg4KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE3ID4+PiAyNikpIHwgMDtcbiAgICB3MTcgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxOCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw5KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDkpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDkpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDkpO1xuICAgIHZhciB3MTggPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxOCA+Pj4gMjYpKSB8IDA7XG4gICAgdzE4ICY9IDB4M2ZmZmZmZjtcbiAgICBvWzBdID0gdzA7XG4gICAgb1sxXSA9IHcxO1xuICAgIG9bMl0gPSB3MjtcbiAgICBvWzNdID0gdzM7XG4gICAgb1s0XSA9IHc0O1xuICAgIG9bNV0gPSB3NTtcbiAgICBvWzZdID0gdzY7XG4gICAgb1s3XSA9IHc3O1xuICAgIG9bOF0gPSB3ODtcbiAgICBvWzldID0gdzk7XG4gICAgb1sxMF0gPSB3MTA7XG4gICAgb1sxMV0gPSB3MTE7XG4gICAgb1sxMl0gPSB3MTI7XG4gICAgb1sxM10gPSB3MTM7XG4gICAgb1sxNF0gPSB3MTQ7XG4gICAgb1sxNV0gPSB3MTU7XG4gICAgb1sxNl0gPSB3MTY7XG4gICAgb1sxN10gPSB3MTc7XG4gICAgb1sxOF0gPSB3MTg7XG4gICAgaWYgKGMgIT09IDApIHtcbiAgICAgIG9bMTldID0gYztcbiAgICAgIG91dC5sZW5ndGgrKztcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfTtcblxuICAvLyBQb2x5ZmlsbCBjb21iXG4gIGlmICghTWF0aC5pbXVsKSB7XG4gICAgY29tYjEwTXVsVG8gPSBzbWFsbE11bFRvO1xuICB9XG5cbiAgZnVuY3Rpb24gYmlnTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgb3V0Lm5lZ2F0aXZlID0gbnVtLm5lZ2F0aXZlIF4gc2VsZi5uZWdhdGl2ZTtcbiAgICBvdXQubGVuZ3RoID0gc2VsZi5sZW5ndGggKyBudW0ubGVuZ3RoO1xuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICB2YXIgaG5jYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBvdXQubGVuZ3RoIC0gMTsgaysrKSB7XG4gICAgICAvLyBTdW0gYWxsIHdvcmRzIHdpdGggdGhlIHNhbWUgYGkgKyBqID0ga2AgYW5kIGFjY3VtdWxhdGUgYG5jYXJyeWAsXG4gICAgICAvLyBub3RlIHRoYXQgbmNhcnJ5IGNvdWxkIGJlID49IDB4M2ZmZmZmZlxuICAgICAgdmFyIG5jYXJyeSA9IGhuY2Fycnk7XG4gICAgICBobmNhcnJ5ID0gMDtcbiAgICAgIHZhciByd29yZCA9IGNhcnJ5ICYgMHgzZmZmZmZmO1xuICAgICAgdmFyIG1heEogPSBNYXRoLm1pbihrLCBudW0ubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBqID0gTWF0aC5tYXgoMCwgayAtIHNlbGYubGVuZ3RoICsgMSk7IGogPD0gbWF4SjsgaisrKSB7XG4gICAgICAgIHZhciBpID0gayAtIGo7XG4gICAgICAgIHZhciBhID0gc2VsZi53b3Jkc1tpXSB8IDA7XG4gICAgICAgIHZhciBiID0gbnVtLndvcmRzW2pdIHwgMDtcbiAgICAgICAgdmFyIHIgPSBhICogYjtcblxuICAgICAgICB2YXIgbG8gPSByICYgMHgzZmZmZmZmO1xuICAgICAgICBuY2FycnkgPSAobmNhcnJ5ICsgKChyIC8gMHg0MDAwMDAwKSB8IDApKSB8IDA7XG4gICAgICAgIGxvID0gKGxvICsgcndvcmQpIHwgMDtcbiAgICAgICAgcndvcmQgPSBsbyAmIDB4M2ZmZmZmZjtcbiAgICAgICAgbmNhcnJ5ID0gKG5jYXJyeSArIChsbyA+Pj4gMjYpKSB8IDA7XG5cbiAgICAgICAgaG5jYXJyeSArPSBuY2FycnkgPj4+IDI2O1xuICAgICAgICBuY2FycnkgJj0gMHgzZmZmZmZmO1xuICAgICAgfVxuICAgICAgb3V0LndvcmRzW2tdID0gcndvcmQ7XG4gICAgICBjYXJyeSA9IG5jYXJyeTtcbiAgICAgIG5jYXJyeSA9IGhuY2Fycnk7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgb3V0LndvcmRzW2tdID0gY2Fycnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5sZW5ndGgtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0LnN0cmlwKCk7XG4gIH1cblxuICBmdW5jdGlvbiBqdW1ib011bFRvIChzZWxmLCBudW0sIG91dCkge1xuICAgIHZhciBmZnRtID0gbmV3IEZGVE0oKTtcbiAgICByZXR1cm4gZmZ0bS5tdWxwKHNlbGYsIG51bSwgb3V0KTtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5tdWxUbyA9IGZ1bmN0aW9uIG11bFRvIChudW0sIG91dCkge1xuICAgIHZhciByZXM7XG4gICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoICsgbnVtLmxlbmd0aDtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEwICYmIG51bS5sZW5ndGggPT09IDEwKSB7XG4gICAgICByZXMgPSBjb21iMTBNdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfSBlbHNlIGlmIChsZW4gPCA2Mykge1xuICAgICAgcmVzID0gc21hbGxNdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfSBlbHNlIGlmIChsZW4gPCAxMDI0KSB7XG4gICAgICByZXMgPSBiaWdNdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IGp1bWJvTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gQ29vbGV5LVR1a2V5IGFsZ29yaXRobSBmb3IgRkZUXG4gIC8vIHNsaWdodGx5IHJldmlzaXRlZCB0byByZWx5IG9uIGxvb3BpbmcgaW5zdGVhZCBvZiByZWN1cnNpb25cblxuICBmdW5jdGlvbiBGRlRNICh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICB9XG5cbiAgRkZUTS5wcm90b3R5cGUubWFrZVJCVCA9IGZ1bmN0aW9uIG1ha2VSQlQgKE4pIHtcbiAgICB2YXIgdCA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgbCA9IEJOLnByb3RvdHlwZS5fY291bnRCaXRzKE4pIC0gMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgdFtpXSA9IHRoaXMucmV2QmluKGksIGwsIE4pO1xuICAgIH1cblxuICAgIHJldHVybiB0O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYmluYXJ5LXJldmVyc2VkIHJlcHJlc2VudGF0aW9uIG9mIGB4YFxuICBGRlRNLnByb3RvdHlwZS5yZXZCaW4gPSBmdW5jdGlvbiByZXZCaW4gKHgsIGwsIE4pIHtcbiAgICBpZiAoeCA9PT0gMCB8fCB4ID09PSBOIC0gMSkgcmV0dXJuIHg7XG5cbiAgICB2YXIgcmIgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICByYiB8PSAoeCAmIDEpIDw8IChsIC0gaSAtIDEpO1xuICAgICAgeCA+Pj0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmI7XG4gIH07XG5cbiAgLy8gUGVyZm9ybXMgXCJ0d2VlZGxpbmdcIiBwaGFzZSwgdGhlcmVmb3JlICdlbXVsYXRpbmcnXG4gIC8vIGJlaGF2aW91ciBvZiB0aGUgcmVjdXJzaXZlIGFsZ29yaXRobVxuICBGRlRNLnByb3RvdHlwZS5wZXJtdXRlID0gZnVuY3Rpb24gcGVybXV0ZSAocmJ0LCByd3MsIGl3cywgcnR3cywgaXR3cywgTikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICBydHdzW2ldID0gcndzW3JidFtpXV07XG4gICAgICBpdHdzW2ldID0gaXdzW3JidFtpXV07XG4gICAgfVxuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIHRyYW5zZm9ybSAocndzLCBpd3MsIHJ0d3MsIGl0d3MsIE4sIHJidCkge1xuICAgIHRoaXMucGVybXV0ZShyYnQsIHJ3cywgaXdzLCBydHdzLCBpdHdzLCBOKTtcblxuICAgIGZvciAodmFyIHMgPSAxOyBzIDwgTjsgcyA8PD0gMSkge1xuICAgICAgdmFyIGwgPSBzIDw8IDE7XG5cbiAgICAgIHZhciBydHdkZiA9IE1hdGguY29zKDIgKiBNYXRoLlBJIC8gbCk7XG4gICAgICB2YXIgaXR3ZGYgPSBNYXRoLnNpbigyICogTWF0aC5QSSAvIGwpO1xuXG4gICAgICBmb3IgKHZhciBwID0gMDsgcCA8IE47IHAgKz0gbCkge1xuICAgICAgICB2YXIgcnR3ZGZfID0gcnR3ZGY7XG4gICAgICAgIHZhciBpdHdkZl8gPSBpdHdkZjtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHM7IGorKykge1xuICAgICAgICAgIHZhciByZSA9IHJ0d3NbcCArIGpdO1xuICAgICAgICAgIHZhciBpZSA9IGl0d3NbcCArIGpdO1xuXG4gICAgICAgICAgdmFyIHJvID0gcnR3c1twICsgaiArIHNdO1xuICAgICAgICAgIHZhciBpbyA9IGl0d3NbcCArIGogKyBzXTtcblxuICAgICAgICAgIHZhciByeCA9IHJ0d2RmXyAqIHJvIC0gaXR3ZGZfICogaW87XG5cbiAgICAgICAgICBpbyA9IHJ0d2RmXyAqIGlvICsgaXR3ZGZfICogcm87XG4gICAgICAgICAgcm8gPSByeDtcblxuICAgICAgICAgIHJ0d3NbcCArIGpdID0gcmUgKyBybztcbiAgICAgICAgICBpdHdzW3AgKyBqXSA9IGllICsgaW87XG5cbiAgICAgICAgICBydHdzW3AgKyBqICsgc10gPSByZSAtIHJvO1xuICAgICAgICAgIGl0d3NbcCArIGogKyBzXSA9IGllIC0gaW87XG5cbiAgICAgICAgICAvKiBqc2hpbnQgbWF4ZGVwdGggOiBmYWxzZSAqL1xuICAgICAgICAgIGlmIChqICE9PSBsKSB7XG4gICAgICAgICAgICByeCA9IHJ0d2RmICogcnR3ZGZfIC0gaXR3ZGYgKiBpdHdkZl87XG5cbiAgICAgICAgICAgIGl0d2RmXyA9IHJ0d2RmICogaXR3ZGZfICsgaXR3ZGYgKiBydHdkZl87XG4gICAgICAgICAgICBydHdkZl8gPSByeDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuZ3Vlc3NMZW4xM2IgPSBmdW5jdGlvbiBndWVzc0xlbjEzYiAobiwgbSkge1xuICAgIHZhciBOID0gTWF0aC5tYXgobSwgbikgfCAxO1xuICAgIHZhciBvZGQgPSBOICYgMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgZm9yIChOID0gTiAvIDIgfCAwOyBOOyBOID0gTiA+Pj4gMSkge1xuICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybiAxIDw8IGkgKyAxICsgb2RkO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLmNvbmp1Z2F0ZSA9IGZ1bmN0aW9uIGNvbmp1Z2F0ZSAocndzLCBpd3MsIE4pIHtcbiAgICBpZiAoTiA8PSAxKSByZXR1cm47XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE4gLyAyOyBpKyspIHtcbiAgICAgIHZhciB0ID0gcndzW2ldO1xuXG4gICAgICByd3NbaV0gPSByd3NbTiAtIGkgLSAxXTtcbiAgICAgIHJ3c1tOIC0gaSAtIDFdID0gdDtcblxuICAgICAgdCA9IGl3c1tpXTtcblxuICAgICAgaXdzW2ldID0gLWl3c1tOIC0gaSAtIDFdO1xuICAgICAgaXdzW04gLSBpIC0gMV0gPSAtdDtcbiAgICB9XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUubm9ybWFsaXplMTNiID0gZnVuY3Rpb24gbm9ybWFsaXplMTNiICh3cywgTikge1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOIC8gMjsgaSsrKSB7XG4gICAgICB2YXIgdyA9IE1hdGgucm91bmQod3NbMiAqIGkgKyAxXSAvIE4pICogMHgyMDAwICtcbiAgICAgICAgTWF0aC5yb3VuZCh3c1syICogaV0gLyBOKSArXG4gICAgICAgIGNhcnJ5O1xuXG4gICAgICB3c1tpXSA9IHcgJiAweDNmZmZmZmY7XG5cbiAgICAgIGlmICh3IDwgMHg0MDAwMDAwKSB7XG4gICAgICAgIGNhcnJ5ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhcnJ5ID0gdyAvIDB4NDAwMDAwMCB8IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHdzO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLmNvbnZlcnQxM2IgPSBmdW5jdGlvbiBjb252ZXJ0MTNiICh3cywgbGVuLCByd3MsIE4pIHtcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNhcnJ5ID0gY2FycnkgKyAod3NbaV0gfCAwKTtcblxuICAgICAgcndzWzIgKiBpXSA9IGNhcnJ5ICYgMHgxZmZmOyBjYXJyeSA9IGNhcnJ5ID4+PiAxMztcbiAgICAgIHJ3c1syICogaSArIDFdID0gY2FycnkgJiAweDFmZmY7IGNhcnJ5ID0gY2FycnkgPj4+IDEzO1xuICAgIH1cblxuICAgIC8vIFBhZCB3aXRoIHplcm9lc1xuICAgIGZvciAoaSA9IDIgKiBsZW47IGkgPCBOOyArK2kpIHtcbiAgICAgIHJ3c1tpXSA9IDA7XG4gICAgfVxuXG4gICAgYXNzZXJ0KGNhcnJ5ID09PSAwKTtcbiAgICBhc3NlcnQoKGNhcnJ5ICYgfjB4MWZmZikgPT09IDApO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLnN0dWIgPSBmdW5jdGlvbiBzdHViIChOKSB7XG4gICAgdmFyIHBoID0gbmV3IEFycmF5KE4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICBwaFtpXSA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBoO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLm11bHAgPSBmdW5jdGlvbiBtdWxwICh4LCB5LCBvdXQpIHtcbiAgICB2YXIgTiA9IDIgKiB0aGlzLmd1ZXNzTGVuMTNiKHgubGVuZ3RoLCB5Lmxlbmd0aCk7XG5cbiAgICB2YXIgcmJ0ID0gdGhpcy5tYWtlUkJUKE4pO1xuXG4gICAgdmFyIF8gPSB0aGlzLnN0dWIoTik7XG5cbiAgICB2YXIgcndzID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciByd3N0ID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBpd3N0ID0gbmV3IEFycmF5KE4pO1xuXG4gICAgdmFyIG5yd3MgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIG5yd3N0ID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBuaXdzdCA9IG5ldyBBcnJheShOKTtcblxuICAgIHZhciBybXdzID0gb3V0LndvcmRzO1xuICAgIHJtd3MubGVuZ3RoID0gTjtcblxuICAgIHRoaXMuY29udmVydDEzYih4LndvcmRzLCB4Lmxlbmd0aCwgcndzLCBOKTtcbiAgICB0aGlzLmNvbnZlcnQxM2IoeS53b3JkcywgeS5sZW5ndGgsIG5yd3MsIE4pO1xuXG4gICAgdGhpcy50cmFuc2Zvcm0ocndzLCBfLCByd3N0LCBpd3N0LCBOLCByYnQpO1xuICAgIHRoaXMudHJhbnNmb3JtKG5yd3MsIF8sIG5yd3N0LCBuaXdzdCwgTiwgcmJ0KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICB2YXIgcnggPSByd3N0W2ldICogbnJ3c3RbaV0gLSBpd3N0W2ldICogbml3c3RbaV07XG4gICAgICBpd3N0W2ldID0gcndzdFtpXSAqIG5pd3N0W2ldICsgaXdzdFtpXSAqIG5yd3N0W2ldO1xuICAgICAgcndzdFtpXSA9IHJ4O1xuICAgIH1cblxuICAgIHRoaXMuY29uanVnYXRlKHJ3c3QsIGl3c3QsIE4pO1xuICAgIHRoaXMudHJhbnNmb3JtKHJ3c3QsIGl3c3QsIHJtd3MsIF8sIE4sIHJidCk7XG4gICAgdGhpcy5jb25qdWdhdGUocm13cywgXywgTik7XG4gICAgdGhpcy5ub3JtYWxpemUxM2Iocm13cywgTik7XG5cbiAgICBvdXQubmVnYXRpdmUgPSB4Lm5lZ2F0aXZlIF4geS5uZWdhdGl2ZTtcbiAgICBvdXQubGVuZ3RoID0geC5sZW5ndGggKyB5Lmxlbmd0aDtcbiAgICByZXR1cm4gb3V0LnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gTXVsdGlwbHkgYHRoaXNgIGJ5IGBudW1gXG4gIEJOLnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwgKG51bSkge1xuICAgIHZhciBvdXQgPSBuZXcgQk4obnVsbCk7XG4gICAgb3V0LndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoICsgbnVtLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRoaXMubXVsVG8obnVtLCBvdXQpO1xuICB9O1xuXG4gIC8vIE11bHRpcGx5IGVtcGxveWluZyBGRlRcbiAgQk4ucHJvdG90eXBlLm11bGYgPSBmdW5jdGlvbiBtdWxmIChudW0pIHtcbiAgICB2YXIgb3V0ID0gbmV3IEJOKG51bGwpO1xuICAgIG91dC53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCArIG51bS5sZW5ndGgpO1xuICAgIHJldHVybiBqdW1ib011bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgfTtcblxuICAvLyBJbi1wbGFjZSBNdWx0aXBsaWNhdGlvblxuICBCTi5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uIGltdWwgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkubXVsVG8obnVtLCB0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaW11bG4gPSBmdW5jdGlvbiBpbXVsbiAobnVtKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBudW0gPT09ICdudW1iZXInKTtcbiAgICBhc3NlcnQobnVtIDwgMHg0MDAwMDAwKTtcblxuICAgIC8vIENhcnJ5XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3ID0gKHRoaXMud29yZHNbaV0gfCAwKSAqIG51bTtcbiAgICAgIHZhciBsbyA9ICh3ICYgMHgzZmZmZmZmKSArIChjYXJyeSAmIDB4M2ZmZmZmZik7XG4gICAgICBjYXJyeSA+Pj0gMjY7XG4gICAgICBjYXJyeSArPSAodyAvIDB4NDAwMDAwMCkgfCAwO1xuICAgICAgLy8gTk9URTogbG8gaXMgMjdiaXQgbWF4aW11bVxuICAgICAgY2FycnkgKz0gbG8gPj4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGxvICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGNhcnJ5O1xuICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICB9XG4gICAgdGhpcy5sZW5ndGggPSBudW0gPT09IDAgPyAxIDogdGhpcy5sZW5ndGg7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubXVsbiA9IGZ1bmN0aW9uIG11bG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW11bG4obnVtKTtcbiAgfTtcblxuICAvLyBgdGhpc2AgKiBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uIHNxciAoKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsKHRoaXMpO1xuICB9O1xuXG4gIC8vIGB0aGlzYCAqIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXNxciA9IGZ1bmN0aW9uIGlzcXIgKCkge1xuICAgIHJldHVybiB0aGlzLmltdWwodGhpcy5jbG9uZSgpKTtcbiAgfTtcblxuICAvLyBNYXRoLnBvdyhgdGhpc2AsIGBudW1gKVxuICBCTi5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24gcG93IChudW0pIHtcbiAgICB2YXIgdyA9IHRvQml0QXJyYXkobnVtKTtcbiAgICBpZiAody5sZW5ndGggPT09IDApIHJldHVybiBuZXcgQk4oMSk7XG5cbiAgICAvLyBTa2lwIGxlYWRpbmcgemVyb2VzXG4gICAgdmFyIHJlcyA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3Lmxlbmd0aDsgaSsrLCByZXMgPSByZXMuc3FyKCkpIHtcbiAgICAgIGlmICh3W2ldICE9PSAwKSBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoKytpIDwgdy5sZW5ndGgpIHtcbiAgICAgIGZvciAodmFyIHEgPSByZXMuc3FyKCk7IGkgPCB3Lmxlbmd0aDsgaSsrLCBxID0gcS5zcXIoKSkge1xuICAgICAgICBpZiAod1tpXSA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgcmVzID0gcmVzLm11bChxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIFNoaWZ0LWxlZnQgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1c2hsbiA9IGZ1bmN0aW9uIGl1c2hsbiAoYml0cykge1xuICAgIGFzc2VydCh0eXBlb2YgYml0cyA9PT0gJ251bWJlcicgJiYgYml0cyA+PSAwKTtcbiAgICB2YXIgciA9IGJpdHMgJSAyNjtcbiAgICB2YXIgcyA9IChiaXRzIC0gcikgLyAyNjtcbiAgICB2YXIgY2FycnlNYXNrID0gKDB4M2ZmZmZmZiA+Pj4gKDI2IC0gcikpIDw8ICgyNiAtIHIpO1xuICAgIHZhciBpO1xuXG4gICAgaWYgKHIgIT09IDApIHtcbiAgICAgIHZhciBjYXJyeSA9IDA7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBuZXdDYXJyeSA9IHRoaXMud29yZHNbaV0gJiBjYXJyeU1hc2s7XG4gICAgICAgIHZhciBjID0gKCh0aGlzLndvcmRzW2ldIHwgMCkgLSBuZXdDYXJyeSkgPDwgcjtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGMgfCBjYXJyeTtcbiAgICAgICAgY2FycnkgPSBuZXdDYXJyeSA+Pj4gKDI2IC0gcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChjYXJyeSkge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gY2Fycnk7XG4gICAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHMgIT09IDApIHtcbiAgICAgIGZvciAoaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpICsgc10gPSB0aGlzLndvcmRzW2ldO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSAwO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxlbmd0aCArPSBzO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzaGxuID0gZnVuY3Rpb24gaXNobG4gKGJpdHMpIHtcbiAgICAvLyBUT0RPKGluZHV0bnkpOiBpbXBsZW1lbnQgbWVcbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXVzaGxuKGJpdHMpO1xuICB9O1xuXG4gIC8vIFNoaWZ0LXJpZ2h0IGluLXBsYWNlXG4gIC8vIE5PVEU6IGBoaW50YCBpcyBhIGxvd2VzdCBiaXQgYmVmb3JlIHRyYWlsaW5nIHplcm9lc1xuICAvLyBOT1RFOiBpZiBgZXh0ZW5kZWRgIGlzIHByZXNlbnQgLSBpdCB3aWxsIGJlIGZpbGxlZCB3aXRoIGRlc3Ryb3llZCBiaXRzXG4gIEJOLnByb3RvdHlwZS5pdXNocm4gPSBmdW5jdGlvbiBpdXNocm4gKGJpdHMsIGhpbnQsIGV4dGVuZGVkKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXRzID09PSAnbnVtYmVyJyAmJiBiaXRzID49IDApO1xuICAgIHZhciBoO1xuICAgIGlmIChoaW50KSB7XG4gICAgICBoID0gKGhpbnQgLSAoaGludCAlIDI2KSkgLyAyNjtcbiAgICB9IGVsc2Uge1xuICAgICAgaCA9IDA7XG4gICAgfVxuXG4gICAgdmFyIHIgPSBiaXRzICUgMjY7XG4gICAgdmFyIHMgPSBNYXRoLm1pbigoYml0cyAtIHIpIC8gMjYsIHRoaXMubGVuZ3RoKTtcbiAgICB2YXIgbWFzayA9IDB4M2ZmZmZmZiBeICgoMHgzZmZmZmZmID4+PiByKSA8PCByKTtcbiAgICB2YXIgbWFza2VkV29yZHMgPSBleHRlbmRlZDtcblxuICAgIGggLT0gcztcbiAgICBoID0gTWF0aC5tYXgoMCwgaCk7XG5cbiAgICAvLyBFeHRlbmRlZCBtb2RlLCBjb3B5IG1hc2tlZCBwYXJ0XG4gICAgaWYgKG1hc2tlZFdvcmRzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgICAgICBtYXNrZWRXb3Jkcy53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV07XG4gICAgICB9XG4gICAgICBtYXNrZWRXb3Jkcy5sZW5ndGggPSBzO1xuICAgIH1cblxuICAgIGlmIChzID09PSAwKSB7XG4gICAgICAvLyBOby1vcCwgd2Ugc2hvdWxkIG5vdCBtb3ZlIGFueXRoaW5nIGF0IGFsbFxuICAgIH0gZWxzZSBpZiAodGhpcy5sZW5ndGggPiBzKSB7XG4gICAgICB0aGlzLmxlbmd0aCAtPSBzO1xuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IHRoaXMud29yZHNbaSArIHNdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndvcmRzWzBdID0gMDtcbiAgICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgICB9XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAoaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwICYmIChjYXJyeSAhPT0gMCB8fCBpID49IGgpOyBpLS0pIHtcbiAgICAgIHZhciB3b3JkID0gdGhpcy53b3Jkc1tpXSB8IDA7XG4gICAgICB0aGlzLndvcmRzW2ldID0gKGNhcnJ5IDw8ICgyNiAtIHIpKSB8ICh3b3JkID4+PiByKTtcbiAgICAgIGNhcnJ5ID0gd29yZCAmIG1hc2s7XG4gICAgfVxuXG4gICAgLy8gUHVzaCBjYXJyaWVkIGJpdHMgYXMgYSBtYXNrXG4gICAgaWYgKG1hc2tlZFdvcmRzICYmIGNhcnJ5ICE9PSAwKSB7XG4gICAgICBtYXNrZWRXb3Jkcy53b3Jkc1ttYXNrZWRXb3Jkcy5sZW5ndGgrK10gPSBjYXJyeTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAwO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzaHJuID0gZnVuY3Rpb24gaXNocm4gKGJpdHMsIGhpbnQsIGV4dGVuZGVkKSB7XG4gICAgLy8gVE9ETyhpbmR1dG55KTogaW1wbGVtZW50IG1lXG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1c2hybihiaXRzLCBoaW50LCBleHRlbmRlZCk7XG4gIH07XG5cbiAgLy8gU2hpZnQtbGVmdFxuICBCTi5wcm90b3R5cGUuc2hsbiA9IGZ1bmN0aW9uIHNobG4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaGxuKGJpdHMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51c2hsbiA9IGZ1bmN0aW9uIHVzaGxuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNobG4oYml0cyk7XG4gIH07XG5cbiAgLy8gU2hpZnQtcmlnaHRcbiAgQk4ucHJvdG90eXBlLnNocm4gPSBmdW5jdGlvbiBzaHJuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hybihiaXRzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudXNocm4gPSBmdW5jdGlvbiB1c2hybiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXVzaHJuKGJpdHMpO1xuICB9O1xuXG4gIC8vIFRlc3QgaWYgbiBiaXQgaXMgc2V0XG4gIEJOLnByb3RvdHlwZS50ZXN0biA9IGZ1bmN0aW9uIHRlc3RuIChiaXQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdCA9PT0gJ251bWJlcicgJiYgYml0ID49IDApO1xuICAgIHZhciByID0gYml0ICUgMjY7XG4gICAgdmFyIHMgPSAoYml0IC0gcikgLyAyNjtcbiAgICB2YXIgcSA9IDEgPDwgcjtcblxuICAgIC8vIEZhc3QgY2FzZTogYml0IGlzIG11Y2ggaGlnaGVyIHRoYW4gYWxsIGV4aXN0aW5nIHdvcmRzXG4gICAgaWYgKHRoaXMubGVuZ3RoIDw9IHMpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIENoZWNrIGJpdCBhbmQgcmV0dXJuXG4gICAgdmFyIHcgPSB0aGlzLndvcmRzW3NdO1xuXG4gICAgcmV0dXJuICEhKHcgJiBxKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gb25seSBsb3dlcnMgYml0cyBvZiBudW1iZXIgKGluLXBsYWNlKVxuICBCTi5wcm90b3R5cGUuaW1hc2tuID0gZnVuY3Rpb24gaW1hc2tuIChiaXRzKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXRzID09PSAnbnVtYmVyJyAmJiBiaXRzID49IDApO1xuICAgIHZhciByID0gYml0cyAlIDI2O1xuICAgIHZhciBzID0gKGJpdHMgLSByKSAvIDI2O1xuXG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDAsICdpbWFza24gd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlIG51bWJlcnMnKTtcblxuICAgIGlmICh0aGlzLmxlbmd0aCA8PSBzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAociAhPT0gMCkge1xuICAgICAgcysrO1xuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGgubWluKHMsIHRoaXMubGVuZ3RoKTtcblxuICAgIGlmIChyICE9PSAwKSB7XG4gICAgICB2YXIgbWFzayA9IDB4M2ZmZmZmZiBeICgoMHgzZmZmZmZmID4+PiByKSA8PCByKTtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSAmPSBtYXNrO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG9ubHkgbG93ZXJzIGJpdHMgb2YgbnVtYmVyXG4gIEJOLnByb3RvdHlwZS5tYXNrbiA9IGZ1bmN0aW9uIG1hc2tuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbWFza24oYml0cyk7XG4gIH07XG5cbiAgLy8gQWRkIHBsYWluIG51bWJlciBgbnVtYCB0byBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmlhZGRuID0gZnVuY3Rpb24gaWFkZG4gKG51bSkge1xuICAgIGFzc2VydCh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyk7XG4gICAgYXNzZXJ0KG51bSA8IDB4NDAwMDAwMCk7XG4gICAgaWYgKG51bSA8IDApIHJldHVybiB0aGlzLmlzdWJuKC1udW0pO1xuXG4gICAgLy8gUG9zc2libGUgc2lnbiBjaGFuZ2VcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAxICYmICh0aGlzLndvcmRzWzBdIHwgMCkgPCBudW0pIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSA9IG51bSAtICh0aGlzLndvcmRzWzBdIHwgMCk7XG4gICAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmlzdWJuKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCB3aXRob3V0IGNoZWNrc1xuICAgIHJldHVybiB0aGlzLl9pYWRkbihudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faWFkZG4gPSBmdW5jdGlvbiBfaWFkZG4gKG51bSkge1xuICAgIHRoaXMud29yZHNbMF0gKz0gbnVtO1xuXG4gICAgLy8gQ2FycnlcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbaV0gPj0gMHg0MDAwMDAwOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gLT0gMHg0MDAwMDAwO1xuICAgICAgaWYgKGkgPT09IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgICB0aGlzLndvcmRzW2kgKyAxXSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndvcmRzW2kgKyAxXSsrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoLCBpICsgMSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBTdWJ0cmFjdCBwbGFpbiBudW1iZXIgYG51bWAgZnJvbSBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmlzdWJuID0gZnVuY3Rpb24gaXN1Ym4gKG51bSkge1xuICAgIGFzc2VydCh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyk7XG4gICAgYXNzZXJ0KG51bSA8IDB4NDAwMDAwMCk7XG4gICAgaWYgKG51bSA8IDApIHJldHVybiB0aGlzLmlhZGRuKC1udW0pO1xuXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5pYWRkbihudW0pO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLndvcmRzWzBdIC09IG51bTtcblxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdIDwgMCkge1xuICAgICAgdGhpcy53b3Jkc1swXSA9IC10aGlzLndvcmRzWzBdO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhcnJ5XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbaV0gPCAwOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSArPSAweDQwMDAwMDA7XG4gICAgICAgIHRoaXMud29yZHNbaSArIDFdIC09IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuYWRkbiA9IGZ1bmN0aW9uIGFkZG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWFkZG4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuc3VibiA9IGZ1bmN0aW9uIHN1Ym4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXN1Ym4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaWFicyA9IGZ1bmN0aW9uIGlhYnMgKCkge1xuICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmFicyA9IGZ1bmN0aW9uIGFicyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWJzKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pc2hsbnN1Ym11bCA9IGZ1bmN0aW9uIF9pc2hsbnN1Ym11bCAobnVtLCBtdWwsIHNoaWZ0KSB7XG4gICAgdmFyIGxlbiA9IG51bS5sZW5ndGggKyBzaGlmdDtcbiAgICB2YXIgaTtcblxuICAgIHRoaXMuX2V4cGFuZChsZW4pO1xuXG4gICAgdmFyIHc7XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICB3ID0gKHRoaXMud29yZHNbaSArIHNoaWZ0XSB8IDApICsgY2Fycnk7XG4gICAgICB2YXIgcmlnaHQgPSAobnVtLndvcmRzW2ldIHwgMCkgKiBtdWw7XG4gICAgICB3IC09IHJpZ2h0ICYgMHgzZmZmZmZmO1xuICAgICAgY2FycnkgPSAodyA+PiAyNikgLSAoKHJpZ2h0IC8gMHg0MDAwMDAwKSB8IDApO1xuICAgICAgdGhpcy53b3Jkc1tpICsgc2hpZnRdID0gdyAmIDB4M2ZmZmZmZjtcbiAgICB9XG4gICAgZm9yICg7IGkgPCB0aGlzLmxlbmd0aCAtIHNoaWZ0OyBpKyspIHtcbiAgICAgIHcgPSAodGhpcy53b3Jkc1tpICsgc2hpZnRdIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gdyA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaSArIHNoaWZ0XSA9IHcgJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgaWYgKGNhcnJ5ID09PSAwKSByZXR1cm4gdGhpcy5zdHJpcCgpO1xuXG4gICAgLy8gU3VidHJhY3Rpb24gb3ZlcmZsb3dcbiAgICBhc3NlcnQoY2FycnkgPT09IC0xKTtcbiAgICBjYXJyeSA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHcgPSAtKHRoaXMud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgY2FycnkgPSB3ID4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHcgJiAweDNmZmZmZmY7XG4gICAgfVxuICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX3dvcmREaXYgPSBmdW5jdGlvbiBfd29yZERpdiAobnVtLCBtb2RlKSB7XG4gICAgdmFyIHNoaWZ0ID0gdGhpcy5sZW5ndGggLSBudW0ubGVuZ3RoO1xuXG4gICAgdmFyIGEgPSB0aGlzLmNsb25lKCk7XG4gICAgdmFyIGIgPSBudW07XG5cbiAgICAvLyBOb3JtYWxpemVcbiAgICB2YXIgYmhpID0gYi53b3Jkc1tiLmxlbmd0aCAtIDFdIHwgMDtcbiAgICB2YXIgYmhpQml0cyA9IHRoaXMuX2NvdW50Qml0cyhiaGkpO1xuICAgIHNoaWZ0ID0gMjYgLSBiaGlCaXRzO1xuICAgIGlmIChzaGlmdCAhPT0gMCkge1xuICAgICAgYiA9IGIudXNobG4oc2hpZnQpO1xuICAgICAgYS5pdXNobG4oc2hpZnQpO1xuICAgICAgYmhpID0gYi53b3Jkc1tiLmxlbmd0aCAtIDFdIHwgMDtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHF1b3RpZW50XG4gICAgdmFyIG0gPSBhLmxlbmd0aCAtIGIubGVuZ3RoO1xuICAgIHZhciBxO1xuXG4gICAgaWYgKG1vZGUgIT09ICdtb2QnKSB7XG4gICAgICBxID0gbmV3IEJOKG51bGwpO1xuICAgICAgcS5sZW5ndGggPSBtICsgMTtcbiAgICAgIHEud29yZHMgPSBuZXcgQXJyYXkocS5sZW5ndGgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHEud29yZHNbaV0gPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkaWZmID0gYS5jbG9uZSgpLl9pc2hsbnN1Ym11bChiLCAxLCBtKTtcbiAgICBpZiAoZGlmZi5uZWdhdGl2ZSA9PT0gMCkge1xuICAgICAgYSA9IGRpZmY7XG4gICAgICBpZiAocSkge1xuICAgICAgICBxLndvcmRzW21dID0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBqID0gbSAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICB2YXIgcWogPSAoYS53b3Jkc1tiLmxlbmd0aCArIGpdIHwgMCkgKiAweDQwMDAwMDAgK1xuICAgICAgICAoYS53b3Jkc1tiLmxlbmd0aCArIGogLSAxXSB8IDApO1xuXG4gICAgICAvLyBOT1RFOiAocWogLyBiaGkpIGlzICgweDNmZmZmZmYgKiAweDQwMDAwMDAgKyAweDNmZmZmZmYpIC8gMHgyMDAwMDAwIG1heFxuICAgICAgLy8gKDB4N2ZmZmZmZilcbiAgICAgIHFqID0gTWF0aC5taW4oKHFqIC8gYmhpKSB8IDAsIDB4M2ZmZmZmZik7XG5cbiAgICAgIGEuX2lzaGxuc3VibXVsKGIsIHFqLCBqKTtcbiAgICAgIHdoaWxlIChhLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgIHFqLS07XG4gICAgICAgIGEubmVnYXRpdmUgPSAwO1xuICAgICAgICBhLl9pc2hsbnN1Ym11bChiLCAxLCBqKTtcbiAgICAgICAgaWYgKCFhLmlzWmVybygpKSB7XG4gICAgICAgICAgYS5uZWdhdGl2ZSBePSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocSkge1xuICAgICAgICBxLndvcmRzW2pdID0gcWo7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChxKSB7XG4gICAgICBxLnN0cmlwKCk7XG4gICAgfVxuICAgIGEuc3RyaXAoKTtcblxuICAgIC8vIERlbm9ybWFsaXplXG4gICAgaWYgKG1vZGUgIT09ICdkaXYnICYmIHNoaWZ0ICE9PSAwKSB7XG4gICAgICBhLml1c2hybihzaGlmdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpdjogcSB8fCBudWxsLFxuICAgICAgbW9kOiBhXG4gICAgfTtcbiAgfTtcblxuICAvLyBOT1RFOiAxKSBgbW9kZWAgY2FuIGJlIHNldCB0byBgbW9kYCB0byByZXF1ZXN0IG1vZCBvbmx5LFxuICAvLyAgICAgICB0byBgZGl2YCB0byByZXF1ZXN0IGRpdiBvbmx5LCBvciBiZSBhYnNlbnQgdG9cbiAgLy8gICAgICAgcmVxdWVzdCBib3RoIGRpdiAmIG1vZFxuICAvLyAgICAgICAyKSBgcG9zaXRpdmVgIGlzIHRydWUgaWYgdW5zaWduZWQgbW9kIGlzIHJlcXVlc3RlZFxuICBCTi5wcm90b3R5cGUuZGl2bW9kID0gZnVuY3Rpb24gZGl2bW9kIChudW0sIG1vZGUsIHBvc2l0aXZlKSB7XG4gICAgYXNzZXJ0KCFudW0uaXNaZXJvKCkpO1xuXG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogbmV3IEJOKDApLFxuICAgICAgICBtb2Q6IG5ldyBCTigwKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgZGl2LCBtb2QsIHJlcztcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBudW0ubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIHJlcyA9IHRoaXMubmVnKCkuZGl2bW9kKG51bSwgbW9kZSk7XG5cbiAgICAgIGlmIChtb2RlICE9PSAnbW9kJykge1xuICAgICAgICBkaXYgPSByZXMuZGl2Lm5lZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kZSAhPT0gJ2RpdicpIHtcbiAgICAgICAgbW9kID0gcmVzLm1vZC5uZWcoKTtcbiAgICAgICAgaWYgKHBvc2l0aXZlICYmIG1vZC5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICAgIG1vZC5pYWRkKG51bSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiBkaXYsXG4gICAgICAgIG1vZDogbW9kXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG51bS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgcmVzID0gdGhpcy5kaXZtb2QobnVtLm5lZygpLCBtb2RlKTtcblxuICAgICAgaWYgKG1vZGUgIT09ICdtb2QnKSB7XG4gICAgICAgIGRpdiA9IHJlcy5kaXYubmVnKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogZGl2LFxuICAgICAgICBtb2Q6IHJlcy5tb2RcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCh0aGlzLm5lZ2F0aXZlICYgbnVtLm5lZ2F0aXZlKSAhPT0gMCkge1xuICAgICAgcmVzID0gdGhpcy5uZWcoKS5kaXZtb2QobnVtLm5lZygpLCBtb2RlKTtcblxuICAgICAgaWYgKG1vZGUgIT09ICdkaXYnKSB7XG4gICAgICAgIG1vZCA9IHJlcy5tb2QubmVnKCk7XG4gICAgICAgIGlmIChwb3NpdGl2ZSAmJiBtb2QubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgICBtb2QuaXN1YihudW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogcmVzLmRpdixcbiAgICAgICAgbW9kOiBtb2RcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQm90aCBudW1iZXJzIGFyZSBwb3NpdGl2ZSBhdCB0aGlzIHBvaW50XG5cbiAgICAvLyBTdHJpcCBib3RoIG51bWJlcnMgdG8gYXBwcm94aW1hdGUgc2hpZnQgdmFsdWVcbiAgICBpZiAobnVtLmxlbmd0aCA+IHRoaXMubGVuZ3RoIHx8IHRoaXMuY21wKG51bSkgPCAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IG5ldyBCTigwKSxcbiAgICAgICAgbW9kOiB0aGlzXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFZlcnkgc2hvcnQgcmVkdWN0aW9uXG4gICAgaWYgKG51bS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmIChtb2RlID09PSAnZGl2Jykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRpdjogdGhpcy5kaXZuKG51bS53b3Jkc1swXSksXG4gICAgICAgICAgbW9kOiBudWxsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2RlID09PSAnbW9kJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRpdjogbnVsbCxcbiAgICAgICAgICBtb2Q6IG5ldyBCTih0aGlzLm1vZG4obnVtLndvcmRzWzBdKSlcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiB0aGlzLmRpdm4obnVtLndvcmRzWzBdKSxcbiAgICAgICAgbW9kOiBuZXcgQk4odGhpcy5tb2RuKG51bS53b3Jkc1swXSkpXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3JkRGl2KG51bSwgbW9kZSk7XG4gIH07XG5cbiAgLy8gRmluZCBgdGhpc2AgLyBgbnVtYFxuICBCTi5wcm90b3R5cGUuZGl2ID0gZnVuY3Rpb24gZGl2IChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5kaXZtb2QobnVtLCAnZGl2JywgZmFsc2UpLmRpdjtcbiAgfTtcblxuICAvLyBGaW5kIGB0aGlzYCAlIGBudW1gXG4gIEJOLnByb3RvdHlwZS5tb2QgPSBmdW5jdGlvbiBtb2QgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmRpdm1vZChudW0sICdtb2QnLCBmYWxzZSkubW9kO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51bW9kID0gZnVuY3Rpb24gdW1vZCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2bW9kKG51bSwgJ21vZCcsIHRydWUpLm1vZDtcbiAgfTtcblxuICAvLyBGaW5kIFJvdW5kKGB0aGlzYCAvIGBudW1gKVxuICBCTi5wcm90b3R5cGUuZGl2Um91bmQgPSBmdW5jdGlvbiBkaXZSb3VuZCAobnVtKSB7XG4gICAgdmFyIGRtID0gdGhpcy5kaXZtb2QobnVtKTtcblxuICAgIC8vIEZhc3QgY2FzZSAtIGV4YWN0IGRpdmlzaW9uXG4gICAgaWYgKGRtLm1vZC5pc1plcm8oKSkgcmV0dXJuIGRtLmRpdjtcblxuICAgIHZhciBtb2QgPSBkbS5kaXYubmVnYXRpdmUgIT09IDAgPyBkbS5tb2QuaXN1YihudW0pIDogZG0ubW9kO1xuXG4gICAgdmFyIGhhbGYgPSBudW0udXNocm4oMSk7XG4gICAgdmFyIHIyID0gbnVtLmFuZGxuKDEpO1xuICAgIHZhciBjbXAgPSBtb2QuY21wKGhhbGYpO1xuXG4gICAgLy8gUm91bmQgZG93blxuICAgIGlmIChjbXAgPCAwIHx8IHIyID09PSAxICYmIGNtcCA9PT0gMCkgcmV0dXJuIGRtLmRpdjtcblxuICAgIC8vIFJvdW5kIHVwXG4gICAgcmV0dXJuIGRtLmRpdi5uZWdhdGl2ZSAhPT0gMCA/IGRtLmRpdi5pc3VibigxKSA6IGRtLmRpdi5pYWRkbigxKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubW9kbiA9IGZ1bmN0aW9uIG1vZG4gKG51bSkge1xuICAgIGFzc2VydChudW0gPD0gMHgzZmZmZmZmKTtcbiAgICB2YXIgcCA9ICgxIDw8IDI2KSAlIG51bTtcblxuICAgIHZhciBhY2MgPSAwO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBhY2MgPSAocCAqIGFjYyArICh0aGlzLndvcmRzW2ldIHwgMCkpICUgbnVtO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH07XG5cbiAgLy8gSW4tcGxhY2UgZGl2aXNpb24gYnkgbnVtYmVyXG4gIEJOLnByb3RvdHlwZS5pZGl2biA9IGZ1bmN0aW9uIGlkaXZuIChudW0pIHtcbiAgICBhc3NlcnQobnVtIDw9IDB4M2ZmZmZmZik7XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgdyA9ICh0aGlzLndvcmRzW2ldIHwgMCkgKyBjYXJyeSAqIDB4NDAwMDAwMDtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAodyAvIG51bSkgfCAwO1xuICAgICAgY2FycnkgPSB3ICUgbnVtO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmRpdm4gPSBmdW5jdGlvbiBkaXZuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlkaXZuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmVnY2QgPSBmdW5jdGlvbiBlZ2NkIChwKSB7XG4gICAgYXNzZXJ0KHAubmVnYXRpdmUgPT09IDApO1xuICAgIGFzc2VydCghcC5pc1plcm8oKSk7XG5cbiAgICB2YXIgeCA9IHRoaXM7XG4gICAgdmFyIHkgPSBwLmNsb25lKCk7XG5cbiAgICBpZiAoeC5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgeCA9IHgudW1vZChwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IHguY2xvbmUoKTtcbiAgICB9XG5cbiAgICAvLyBBICogeCArIEIgKiB5ID0geFxuICAgIHZhciBBID0gbmV3IEJOKDEpO1xuICAgIHZhciBCID0gbmV3IEJOKDApO1xuXG4gICAgLy8gQyAqIHggKyBEICogeSA9IHlcbiAgICB2YXIgQyA9IG5ldyBCTigwKTtcbiAgICB2YXIgRCA9IG5ldyBCTigxKTtcblxuICAgIHZhciBnID0gMDtcblxuICAgIHdoaWxlICh4LmlzRXZlbigpICYmIHkuaXNFdmVuKCkpIHtcbiAgICAgIHguaXVzaHJuKDEpO1xuICAgICAgeS5pdXNocm4oMSk7XG4gICAgICArK2c7XG4gICAgfVxuXG4gICAgdmFyIHlwID0geS5jbG9uZSgpO1xuICAgIHZhciB4cCA9IHguY2xvbmUoKTtcblxuICAgIHdoaWxlICgheC5pc1plcm8oKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGltID0gMTsgKHgud29yZHNbMF0gJiBpbSkgPT09IDAgJiYgaSA8IDI2OyArK2ksIGltIDw8PSAxKTtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICB4Lml1c2hybihpKTtcbiAgICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgICBpZiAoQS5pc09kZCgpIHx8IEIuaXNPZGQoKSkge1xuICAgICAgICAgICAgQS5pYWRkKHlwKTtcbiAgICAgICAgICAgIEIuaXN1Yih4cCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQS5pdXNocm4oMSk7XG4gICAgICAgICAgQi5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaiA9IDAsIGptID0gMTsgKHkud29yZHNbMF0gJiBqbSkgPT09IDAgJiYgaiA8IDI2OyArK2osIGptIDw8PSAxKTtcbiAgICAgIGlmIChqID4gMCkge1xuICAgICAgICB5Lml1c2hybihqKTtcbiAgICAgICAgd2hpbGUgKGotLSA+IDApIHtcbiAgICAgICAgICBpZiAoQy5pc09kZCgpIHx8IEQuaXNPZGQoKSkge1xuICAgICAgICAgICAgQy5pYWRkKHlwKTtcbiAgICAgICAgICAgIEQuaXN1Yih4cCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQy5pdXNocm4oMSk7XG4gICAgICAgICAgRC5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHguY21wKHkpID49IDApIHtcbiAgICAgICAgeC5pc3ViKHkpO1xuICAgICAgICBBLmlzdWIoQyk7XG4gICAgICAgIEIuaXN1YihEKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHkuaXN1Yih4KTtcbiAgICAgICAgQy5pc3ViKEEpO1xuICAgICAgICBELmlzdWIoQik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGE6IEMsXG4gICAgICBiOiBELFxuICAgICAgZ2NkOiB5Lml1c2hsbihnKVxuICAgIH07XG4gIH07XG5cbiAgLy8gVGhpcyBpcyByZWR1Y2VkIGluY2FybmF0aW9uIG9mIHRoZSBiaW5hcnkgRUVBXG4gIC8vIGFib3ZlLCBkZXNpZ25hdGVkIHRvIGludmVydCBtZW1iZXJzIG9mIHRoZVxuICAvLyBfcHJpbWVfIGZpZWxkcyBGKHApIGF0IGEgbWF4aW1hbCBzcGVlZFxuICBCTi5wcm90b3R5cGUuX2ludm1wID0gZnVuY3Rpb24gX2ludm1wIChwKSB7XG4gICAgYXNzZXJ0KHAubmVnYXRpdmUgPT09IDApO1xuICAgIGFzc2VydCghcC5pc1plcm8oKSk7XG5cbiAgICB2YXIgYSA9IHRoaXM7XG4gICAgdmFyIGIgPSBwLmNsb25lKCk7XG5cbiAgICBpZiAoYS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgYSA9IGEudW1vZChwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IGEuY2xvbmUoKTtcbiAgICB9XG5cbiAgICB2YXIgeDEgPSBuZXcgQk4oMSk7XG4gICAgdmFyIHgyID0gbmV3IEJOKDApO1xuXG4gICAgdmFyIGRlbHRhID0gYi5jbG9uZSgpO1xuXG4gICAgd2hpbGUgKGEuY21wbigxKSA+IDAgJiYgYi5jbXBuKDEpID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGltID0gMTsgKGEud29yZHNbMF0gJiBpbSkgPT09IDAgJiYgaSA8IDI2OyArK2ksIGltIDw8PSAxKTtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBhLml1c2hybihpKTtcbiAgICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgICBpZiAoeDEuaXNPZGQoKSkge1xuICAgICAgICAgICAgeDEuaWFkZChkZWx0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgeDEuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGogPSAwLCBqbSA9IDE7IChiLndvcmRzWzBdICYgam0pID09PSAwICYmIGogPCAyNjsgKytqLCBqbSA8PD0gMSk7XG4gICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgYi5pdXNocm4oaik7XG4gICAgICAgIHdoaWxlIChqLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKHgyLmlzT2RkKCkpIHtcbiAgICAgICAgICAgIHgyLmlhZGQoZGVsdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHgyLml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYS5jbXAoYikgPj0gMCkge1xuICAgICAgICBhLmlzdWIoYik7XG4gICAgICAgIHgxLmlzdWIoeDIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYi5pc3ViKGEpO1xuICAgICAgICB4Mi5pc3ViKHgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVzO1xuICAgIGlmIChhLmNtcG4oMSkgPT09IDApIHtcbiAgICAgIHJlcyA9IHgxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMgPSB4MjtcbiAgICB9XG5cbiAgICBpZiAocmVzLmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMuaWFkZChwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5nY2QgPSBmdW5jdGlvbiBnY2QgKG51bSkge1xuICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gbnVtLmFicygpO1xuICAgIGlmIChudW0uaXNaZXJvKCkpIHJldHVybiB0aGlzLmFicygpO1xuXG4gICAgdmFyIGEgPSB0aGlzLmNsb25lKCk7XG4gICAgdmFyIGIgPSBudW0uY2xvbmUoKTtcbiAgICBhLm5lZ2F0aXZlID0gMDtcbiAgICBiLm5lZ2F0aXZlID0gMDtcblxuICAgIC8vIFJlbW92ZSBjb21tb24gZmFjdG9yIG9mIHR3b1xuICAgIGZvciAodmFyIHNoaWZ0ID0gMDsgYS5pc0V2ZW4oKSAmJiBiLmlzRXZlbigpOyBzaGlmdCsrKSB7XG4gICAgICBhLml1c2hybigxKTtcbiAgICAgIGIuaXVzaHJuKDEpO1xuICAgIH1cblxuICAgIGRvIHtcbiAgICAgIHdoaWxlIChhLmlzRXZlbigpKSB7XG4gICAgICAgIGEuaXVzaHJuKDEpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKGIuaXNFdmVuKCkpIHtcbiAgICAgICAgYi5pdXNocm4oMSk7XG4gICAgICB9XG5cbiAgICAgIHZhciByID0gYS5jbXAoYik7XG4gICAgICBpZiAociA8IDApIHtcbiAgICAgICAgLy8gU3dhcCBgYWAgYW5kIGBiYCB0byBtYWtlIGBhYCBhbHdheXMgYmlnZ2VyIHRoYW4gYGJgXG4gICAgICAgIHZhciB0ID0gYTtcbiAgICAgICAgYSA9IGI7XG4gICAgICAgIGIgPSB0O1xuICAgICAgfSBlbHNlIGlmIChyID09PSAwIHx8IGIuY21wbigxKSA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgYS5pc3ViKGIpO1xuICAgIH0gd2hpbGUgKHRydWUpO1xuXG4gICAgcmV0dXJuIGIuaXVzaGxuKHNoaWZ0KTtcbiAgfTtcblxuICAvLyBJbnZlcnQgbnVtYmVyIGluIHRoZSBmaWVsZCBGKG51bSlcbiAgQk4ucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbiBpbnZtIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5lZ2NkKG51bSkuYS51bW9kKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzRXZlbiA9IGZ1bmN0aW9uIGlzRXZlbiAoKSB7XG4gICAgcmV0dXJuICh0aGlzLndvcmRzWzBdICYgMSkgPT09IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzT2RkID0gZnVuY3Rpb24gaXNPZGQgKCkge1xuICAgIHJldHVybiAodGhpcy53b3Jkc1swXSAmIDEpID09PSAxO1xuICB9O1xuXG4gIC8vIEFuZCBmaXJzdCB3b3JkIGFuZCBudW1cbiAgQk4ucHJvdG90eXBlLmFuZGxuID0gZnVuY3Rpb24gYW5kbG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLndvcmRzWzBdICYgbnVtO1xuICB9O1xuXG4gIC8vIEluY3JlbWVudCBhdCB0aGUgYml0IHBvc2l0aW9uIGluLWxpbmVcbiAgQk4ucHJvdG90eXBlLmJpbmNuID0gZnVuY3Rpb24gYmluY24gKGJpdCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0ID09PSAnbnVtYmVyJyk7XG4gICAgdmFyIHIgPSBiaXQgJSAyNjtcbiAgICB2YXIgcyA9IChiaXQgLSByKSAvIDI2O1xuICAgIHZhciBxID0gMSA8PCByO1xuXG4gICAgLy8gRmFzdCBjYXNlOiBiaXQgaXMgbXVjaCBoaWdoZXIgdGhhbiBhbGwgZXhpc3Rpbmcgd29yZHNcbiAgICBpZiAodGhpcy5sZW5ndGggPD0gcykge1xuICAgICAgdGhpcy5fZXhwYW5kKHMgKyAxKTtcbiAgICAgIHRoaXMud29yZHNbc10gfD0gcTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBiaXQgYW5kIHByb3BhZ2F0ZSwgaWYgbmVlZGVkXG4gICAgdmFyIGNhcnJ5ID0gcTtcbiAgICBmb3IgKHZhciBpID0gczsgY2FycnkgIT09IDAgJiYgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1tpXSB8IDA7XG4gICAgICB3ICs9IGNhcnJ5O1xuICAgICAgY2FycnkgPSB3ID4+PiAyNjtcbiAgICAgIHcgJj0gMHgzZmZmZmZmO1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHc7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGNhcnJ5O1xuICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybyAoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPT09IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmNtcG4gPSBmdW5jdGlvbiBjbXBuIChudW0pIHtcbiAgICB2YXIgbmVnYXRpdmUgPSBudW0gPCAwO1xuXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgIW5lZ2F0aXZlKSByZXR1cm4gLTE7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbmVnYXRpdmUpIHJldHVybiAxO1xuXG4gICAgdGhpcy5zdHJpcCgpO1xuXG4gICAgdmFyIHJlcztcbiAgICBpZiAodGhpcy5sZW5ndGggPiAxKSB7XG4gICAgICByZXMgPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmVnYXRpdmUpIHtcbiAgICAgICAgbnVtID0gLW51bTtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0KG51bSA8PSAweDNmZmZmZmYsICdOdW1iZXIgaXMgdG9vIGJpZycpO1xuXG4gICAgICB2YXIgdyA9IHRoaXMud29yZHNbMF0gfCAwO1xuICAgICAgcmVzID0gdyA9PT0gbnVtID8gMCA6IHcgPCBudW0gPyAtMSA6IDE7XG4gICAgfVxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSByZXR1cm4gLXJlcyB8IDA7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBDb21wYXJlIHR3byBudW1iZXJzIGFuZCByZXR1cm46XG4gIC8vIDEgLSBpZiBgdGhpc2AgPiBgbnVtYFxuICAvLyAwIC0gaWYgYHRoaXNgID09IGBudW1gXG4gIC8vIC0xIC0gaWYgYHRoaXNgIDwgYG51bWBcbiAgQk4ucHJvdG90eXBlLmNtcCA9IGZ1bmN0aW9uIGNtcCAobnVtKSB7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgbnVtLm5lZ2F0aXZlID09PSAwKSByZXR1cm4gLTE7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbnVtLm5lZ2F0aXZlICE9PSAwKSByZXR1cm4gMTtcblxuICAgIHZhciByZXMgPSB0aGlzLnVjbXAobnVtKTtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkgcmV0dXJuIC1yZXMgfCAwO1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gVW5zaWduZWQgY29tcGFyaXNvblxuICBCTi5wcm90b3R5cGUudWNtcCA9IGZ1bmN0aW9uIHVjbXAgKG51bSkge1xuICAgIC8vIEF0IHRoaXMgcG9pbnQgYm90aCBudW1iZXJzIGhhdmUgdGhlIHNhbWUgc2lnblxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiAxO1xuICAgIGlmICh0aGlzLmxlbmd0aCA8IG51bS5sZW5ndGgpIHJldHVybiAtMTtcblxuICAgIHZhciByZXMgPSAwO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgYSA9IHRoaXMud29yZHNbaV0gfCAwO1xuICAgICAgdmFyIGIgPSBudW0ud29yZHNbaV0gfCAwO1xuXG4gICAgICBpZiAoYSA9PT0gYikgY29udGludWU7XG4gICAgICBpZiAoYSA8IGIpIHtcbiAgICAgICAgcmVzID0gLTE7XG4gICAgICB9IGVsc2UgaWYgKGEgPiBiKSB7XG4gICAgICAgIHJlcyA9IDE7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3RuID0gZnVuY3Rpb24gZ3RuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPT09IDE7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0ID0gZnVuY3Rpb24gZ3QgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID09PSAxO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndGVuID0gZnVuY3Rpb24gZ3RlbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID49IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0ZSA9IGZ1bmN0aW9uIGd0ZSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPj0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHRuID0gZnVuY3Rpb24gbHRuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPT09IC0xO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdCA9IGZ1bmN0aW9uIGx0IChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA9PT0gLTE7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0ZW4gPSBmdW5jdGlvbiBsdGVuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPD0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHRlID0gZnVuY3Rpb24gbHRlIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA8PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5lcW4gPSBmdW5jdGlvbiBlcW4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA9PT0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPT09IDA7XG4gIH07XG5cbiAgLy9cbiAgLy8gQSByZWR1Y2UgY29udGV4dCwgY291bGQgYmUgdXNpbmcgbW9udGdvbWVyeSBvciBzb21ldGhpbmcgYmV0dGVyLCBkZXBlbmRpbmdcbiAgLy8gb24gdGhlIGBtYCBpdHNlbGYuXG4gIC8vXG4gIEJOLnJlZCA9IGZ1bmN0aW9uIHJlZCAobnVtKSB7XG4gICAgcmV0dXJuIG5ldyBSZWQobnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9SZWQgPSBmdW5jdGlvbiB0b1JlZCAoY3R4KSB7XG4gICAgYXNzZXJ0KCF0aGlzLnJlZCwgJ0FscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQnKTtcbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCwgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzJyk7XG4gICAgcmV0dXJuIGN0eC5jb252ZXJ0VG8odGhpcykuX2ZvcmNlUmVkKGN0eCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmZyb21SZWQgPSBmdW5jdGlvbiBmcm9tUmVkICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdmcm9tUmVkIHdvcmtzIG9ubHkgd2l0aCBudW1iZXJzIGluIHJlZHVjdGlvbiBjb250ZXh0Jyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmNvbnZlcnRGcm9tKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fZm9yY2VSZWQgPSBmdW5jdGlvbiBfZm9yY2VSZWQgKGN0eCkge1xuICAgIHRoaXMucmVkID0gY3R4O1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5mb3JjZVJlZCA9IGZ1bmN0aW9uIGZvcmNlUmVkIChjdHgpIHtcbiAgICBhc3NlcnQoIXRoaXMucmVkLCAnQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCcpO1xuICAgIHJldHVybiB0aGlzLl9mb3JjZVJlZChjdHgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRBZGQgPSBmdW5jdGlvbiByZWRBZGQgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZEFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuYWRkKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElBZGQgPSBmdW5jdGlvbiByZWRJQWRkIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pYWRkKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFN1YiA9IGZ1bmN0aW9uIHJlZFN1YiAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zdWIodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSVN1YiA9IGZ1bmN0aW9uIHJlZElTdWIgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZElTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmlzdWIodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkU2hsID0gZnVuY3Rpb24gcmVkU2hsIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTaGwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnNobCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRNdWwgPSBmdW5jdGlvbiByZWRNdWwgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLCBudW0pO1xuICAgIHJldHVybiB0aGlzLnJlZC5tdWwodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSU11bCA9IGZ1bmN0aW9uIHJlZElNdWwgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLCBudW0pO1xuICAgIHJldHVybiB0aGlzLnJlZC5pbXVsKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFNxciA9IGZ1bmN0aW9uIHJlZFNxciAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zcXIodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElTcXIgPSBmdW5jdGlvbiByZWRJU3FyICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pc3FyKHRoaXMpO1xuICB9O1xuXG4gIC8vIFNxdWFyZSByb290IG92ZXIgcFxuICBCTi5wcm90b3R5cGUucmVkU3FydCA9IGZ1bmN0aW9uIHJlZFNxcnQgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFNxcnQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnNxcnQodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZEludm0gPSBmdW5jdGlvbiByZWRJbnZtICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJbnZtIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pbnZtKHRoaXMpO1xuICB9O1xuXG4gIC8vIFJldHVybiBuZWdhdGl2ZSBjbG9uZSBvZiBgdGhpc2AgJSBgcmVkIG1vZHVsb2BcbiAgQk4ucHJvdG90eXBlLnJlZE5lZyA9IGZ1bmN0aW9uIHJlZE5lZyAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkTmVnIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5uZWcodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFBvdyA9IGZ1bmN0aW9uIHJlZFBvdyAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkICYmICFudW0ucmVkLCAncmVkUG93KG5vcm1hbE51bSknKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQucG93KHRoaXMsIG51bSk7XG4gIH07XG5cbiAgLy8gUHJpbWUgbnVtYmVycyB3aXRoIGVmZmljaWVudCByZWR1Y3Rpb25cbiAgdmFyIHByaW1lcyA9IHtcbiAgICBrMjU2OiBudWxsLFxuICAgIHAyMjQ6IG51bGwsXG4gICAgcDE5MjogbnVsbCxcbiAgICBwMjU1MTk6IG51bGxcbiAgfTtcblxuICAvLyBQc2V1ZG8tTWVyc2VubmUgcHJpbWVcbiAgZnVuY3Rpb24gTVByaW1lIChuYW1lLCBwKSB7XG4gICAgLy8gUCA9IDIgXiBOIC0gS1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5wID0gbmV3IEJOKHAsIDE2KTtcbiAgICB0aGlzLm4gPSB0aGlzLnAuYml0TGVuZ3RoKCk7XG4gICAgdGhpcy5rID0gbmV3IEJOKDEpLml1c2hsbih0aGlzLm4pLmlzdWIodGhpcy5wKTtcblxuICAgIHRoaXMudG1wID0gdGhpcy5fdG1wKCk7XG4gIH1cblxuICBNUHJpbWUucHJvdG90eXBlLl90bXAgPSBmdW5jdGlvbiBfdG1wICgpIHtcbiAgICB2YXIgdG1wID0gbmV3IEJOKG51bGwpO1xuICAgIHRtcC53b3JkcyA9IG5ldyBBcnJheShNYXRoLmNlaWwodGhpcy5uIC8gMTMpKTtcbiAgICByZXR1cm4gdG1wO1xuICB9O1xuXG4gIE1QcmltZS5wcm90b3R5cGUuaXJlZHVjZSA9IGZ1bmN0aW9uIGlyZWR1Y2UgKG51bSkge1xuICAgIC8vIEFzc3VtZXMgdGhhdCBgbnVtYCBpcyBsZXNzIHRoYW4gYFBeMmBcbiAgICAvLyBudW0gPSBISSAqICgyIF4gTiAtIEspICsgSEkgKiBLICsgTE8gPSBISSAqIEsgKyBMTyAobW9kIFApXG4gICAgdmFyIHIgPSBudW07XG4gICAgdmFyIHJsZW47XG5cbiAgICBkbyB7XG4gICAgICB0aGlzLnNwbGl0KHIsIHRoaXMudG1wKTtcbiAgICAgIHIgPSB0aGlzLmltdWxLKHIpO1xuICAgICAgciA9IHIuaWFkZCh0aGlzLnRtcCk7XG4gICAgICBybGVuID0gci5iaXRMZW5ndGgoKTtcbiAgICB9IHdoaWxlIChybGVuID4gdGhpcy5uKTtcblxuICAgIHZhciBjbXAgPSBybGVuIDwgdGhpcy5uID8gLTEgOiByLnVjbXAodGhpcy5wKTtcbiAgICBpZiAoY21wID09PSAwKSB7XG4gICAgICByLndvcmRzWzBdID0gMDtcbiAgICAgIHIubGVuZ3RoID0gMTtcbiAgICB9IGVsc2UgaWYgKGNtcCA+IDApIHtcbiAgICAgIHIuaXN1Yih0aGlzLnApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoci5zdHJpcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIHIgaXMgQk4gdjQgaW5zdGFuY2VcbiAgICAgICAgci5zdHJpcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gciBpcyBCTiB2NSBpbnN0YW5jZVxuICAgICAgICByLl9zdHJpcCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIE1QcmltZS5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbiBzcGxpdCAoaW5wdXQsIG91dCkge1xuICAgIGlucHV0Lml1c2hybih0aGlzLm4sIDAsIG91dCk7XG4gIH07XG5cbiAgTVByaW1lLnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uIGltdWxLIChudW0pIHtcbiAgICByZXR1cm4gbnVtLmltdWwodGhpcy5rKTtcbiAgfTtcblxuICBmdW5jdGlvbiBLMjU2ICgpIHtcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAnazI1NicsXG4gICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZjMmYnKTtcbiAgfVxuICBpbmhlcml0cyhLMjU2LCBNUHJpbWUpO1xuXG4gIEsyNTYucHJvdG90eXBlLnNwbGl0ID0gZnVuY3Rpb24gc3BsaXQgKGlucHV0LCBvdXRwdXQpIHtcbiAgICAvLyAyNTYgPSA5ICogMjYgKyAyMlxuICAgIHZhciBtYXNrID0gMHgzZmZmZmY7XG5cbiAgICB2YXIgb3V0TGVuID0gTWF0aC5taW4oaW5wdXQubGVuZ3RoLCA5KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG91dExlbjsgaSsrKSB7XG4gICAgICBvdXRwdXQud29yZHNbaV0gPSBpbnB1dC53b3Jkc1tpXTtcbiAgICB9XG4gICAgb3V0cHV0Lmxlbmd0aCA9IG91dExlbjtcblxuICAgIGlmIChpbnB1dC5sZW5ndGggPD0gOSkge1xuICAgICAgaW5wdXQud29yZHNbMF0gPSAwO1xuICAgICAgaW5wdXQubGVuZ3RoID0gMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTaGlmdCBieSA5IGxpbWJzXG4gICAgdmFyIHByZXYgPSBpbnB1dC53b3Jkc1s5XTtcbiAgICBvdXRwdXQud29yZHNbb3V0cHV0Lmxlbmd0aCsrXSA9IHByZXYgJiBtYXNrO1xuXG4gICAgZm9yIChpID0gMTA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5leHQgPSBpbnB1dC53b3Jkc1tpXSB8IDA7XG4gICAgICBpbnB1dC53b3Jkc1tpIC0gMTBdID0gKChuZXh0ICYgbWFzaykgPDwgNCkgfCAocHJldiA+Pj4gMjIpO1xuICAgICAgcHJldiA9IG5leHQ7XG4gICAgfVxuICAgIHByZXYgPj4+PSAyMjtcbiAgICBpbnB1dC53b3Jkc1tpIC0gMTBdID0gcHJldjtcbiAgICBpZiAocHJldiA9PT0gMCAmJiBpbnB1dC5sZW5ndGggPiAxMCkge1xuICAgICAgaW5wdXQubGVuZ3RoIC09IDEwO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnB1dC5sZW5ndGggLT0gOTtcbiAgICB9XG4gIH07XG5cbiAgSzI1Ni5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbiBpbXVsSyAobnVtKSB7XG4gICAgLy8gSyA9IDB4MTAwMDAwM2QxID0gWyAweDQwLCAweDNkMSBdXG4gICAgbnVtLndvcmRzW251bS5sZW5ndGhdID0gMDtcbiAgICBudW0ud29yZHNbbnVtLmxlbmd0aCArIDFdID0gMDtcbiAgICBudW0ubGVuZ3RoICs9IDI7XG5cbiAgICAvLyBib3VuZGVkIGF0OiAweDQwICogMHgzZmZmZmZmICsgMHgzZDAgPSAweDEwMDAwMDM5MFxuICAgIHZhciBsbyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3ID0gbnVtLndvcmRzW2ldIHwgMDtcbiAgICAgIGxvICs9IHcgKiAweDNkMTtcbiAgICAgIG51bS53b3Jkc1tpXSA9IGxvICYgMHgzZmZmZmZmO1xuICAgICAgbG8gPSB3ICogMHg0MCArICgobG8gLyAweDQwMDAwMDApIHwgMCk7XG4gICAgfVxuXG4gICAgLy8gRmFzdCBsZW5ndGggcmVkdWN0aW9uXG4gICAgaWYgKG51bS53b3Jkc1tudW0ubGVuZ3RoIC0gMV0gPT09IDApIHtcbiAgICAgIG51bS5sZW5ndGgtLTtcbiAgICAgIGlmIChudW0ud29yZHNbbnVtLmxlbmd0aCAtIDFdID09PSAwKSB7XG4gICAgICAgIG51bS5sZW5ndGgtLTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bTtcbiAgfTtcblxuICBmdW5jdGlvbiBQMjI0ICgpIHtcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAncDIyNCcsXG4gICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEnKTtcbiAgfVxuICBpbmhlcml0cyhQMjI0LCBNUHJpbWUpO1xuXG4gIGZ1bmN0aW9uIFAxOTIgKCkge1xuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICdwMTkyJyxcbiAgICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZicpO1xuICB9XG4gIGluaGVyaXRzKFAxOTIsIE1QcmltZSk7XG5cbiAgZnVuY3Rpb24gUDI1NTE5ICgpIHtcbiAgICAvLyAyIF4gMjU1IC0gMTlcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAnMjU1MTknLFxuICAgICAgJzdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQnKTtcbiAgfVxuICBpbmhlcml0cyhQMjU1MTksIE1QcmltZSk7XG5cbiAgUDI1NTE5LnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uIGltdWxLIChudW0pIHtcbiAgICAvLyBLID0gMHgxM1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoaSA9IChudW0ud29yZHNbaV0gfCAwKSAqIDB4MTMgKyBjYXJyeTtcbiAgICAgIHZhciBsbyA9IGhpICYgMHgzZmZmZmZmO1xuICAgICAgaGkgPj4+PSAyNjtcblxuICAgICAgbnVtLndvcmRzW2ldID0gbG87XG4gICAgICBjYXJyeSA9IGhpO1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIG51bS53b3Jkc1tudW0ubGVuZ3RoKytdID0gY2Fycnk7XG4gICAgfVxuICAgIHJldHVybiBudW07XG4gIH07XG5cbiAgLy8gRXhwb3J0ZWQgbW9zdGx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB1c2UgcGxhaW4gbmFtZSBpbnN0ZWFkXG4gIEJOLl9wcmltZSA9IGZ1bmN0aW9uIHByaW1lIChuYW1lKSB7XG4gICAgLy8gQ2FjaGVkIHZlcnNpb24gb2YgcHJpbWVcbiAgICBpZiAocHJpbWVzW25hbWVdKSByZXR1cm4gcHJpbWVzW25hbWVdO1xuXG4gICAgdmFyIHByaW1lO1xuICAgIGlmIChuYW1lID09PSAnazI1NicpIHtcbiAgICAgIHByaW1lID0gbmV3IEsyNTYoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdwMjI0Jykge1xuICAgICAgcHJpbWUgPSBuZXcgUDIyNCgpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3AxOTInKSB7XG4gICAgICBwcmltZSA9IG5ldyBQMTkyKCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAncDI1NTE5Jykge1xuICAgICAgcHJpbWUgPSBuZXcgUDI1NTE5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBwcmltZSAnICsgbmFtZSk7XG4gICAgfVxuICAgIHByaW1lc1tuYW1lXSA9IHByaW1lO1xuXG4gICAgcmV0dXJuIHByaW1lO1xuICB9O1xuXG4gIC8vXG4gIC8vIEJhc2UgcmVkdWN0aW9uIGVuZ2luZVxuICAvL1xuICBmdW5jdGlvbiBSZWQgKG0pIHtcbiAgICBpZiAodHlwZW9mIG0gPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgcHJpbWUgPSBCTi5fcHJpbWUobSk7XG4gICAgICB0aGlzLm0gPSBwcmltZS5wO1xuICAgICAgdGhpcy5wcmltZSA9IHByaW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQobS5ndG4oMSksICdtb2R1bHVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEnKTtcbiAgICAgIHRoaXMubSA9IG07XG4gICAgICB0aGlzLnByaW1lID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBSZWQucHJvdG90eXBlLl92ZXJpZnkxID0gZnVuY3Rpb24gX3ZlcmlmeTEgKGEpIHtcbiAgICBhc3NlcnQoYS5uZWdhdGl2ZSA9PT0gMCwgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzJyk7XG4gICAgYXNzZXJ0KGEucmVkLCAncmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuX3ZlcmlmeTIgPSBmdW5jdGlvbiBfdmVyaWZ5MiAoYSwgYikge1xuICAgIGFzc2VydCgoYS5uZWdhdGl2ZSB8IGIubmVnYXRpdmUpID09PSAwLCAncmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMnKTtcbiAgICBhc3NlcnQoYS5yZWQgJiYgYS5yZWQgPT09IGIucmVkLFxuICAgICAgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmltb2QgPSBmdW5jdGlvbiBpbW9kIChhKSB7XG4gICAgaWYgKHRoaXMucHJpbWUpIHJldHVybiB0aGlzLnByaW1lLmlyZWR1Y2UoYSkuX2ZvcmNlUmVkKHRoaXMpO1xuICAgIHJldHVybiBhLnVtb2QodGhpcy5tKS5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcgKGEpIHtcbiAgICBpZiAoYS5pc1plcm8oKSkge1xuICAgICAgcmV0dXJuIGEuY2xvbmUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tLnN1YihhKS5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuXG4gICAgdmFyIHJlcyA9IGEuYWRkKGIpO1xuICAgIGlmIChyZXMuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzLmlzdWIodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24gaWFkZCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5pYWRkKGIpO1xuICAgIGlmIChyZXMuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzLmlzdWIodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uIHN1YiAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5zdWIoYik7XG4gICAgaWYgKHJlcy5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzLmlhZGQodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pc3ViID0gZnVuY3Rpb24gaXN1YiAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5pc3ViKGIpO1xuICAgIGlmIChyZXMuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcy5pYWRkKHRoaXMubSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5zaGwgPSBmdW5jdGlvbiBzaGwgKGEsIG51bSkge1xuICAgIHRoaXMuX3ZlcmlmeTEoYSk7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLnVzaGxuKG51bSkpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uIGltdWwgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuICAgIHJldHVybiB0aGlzLmltb2QoYS5pbXVsKGIpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLm11bChiKSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pc3FyID0gZnVuY3Rpb24gaXNxciAoYSkge1xuICAgIHJldHVybiB0aGlzLmltdWwoYSwgYS5jbG9uZSgpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uIHNxciAoYSkge1xuICAgIHJldHVybiB0aGlzLm11bChhLCBhKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNxcnQgPSBmdW5jdGlvbiBzcXJ0IChhKSB7XG4gICAgaWYgKGEuaXNaZXJvKCkpIHJldHVybiBhLmNsb25lKCk7XG5cbiAgICB2YXIgbW9kMyA9IHRoaXMubS5hbmRsbigzKTtcbiAgICBhc3NlcnQobW9kMyAlIDIgPT09IDEpO1xuXG4gICAgLy8gRmFzdCBjYXNlXG4gICAgaWYgKG1vZDMgPT09IDMpIHtcbiAgICAgIHZhciBwb3cgPSB0aGlzLm0uYWRkKG5ldyBCTigxKSkuaXVzaHJuKDIpO1xuICAgICAgcmV0dXJuIHRoaXMucG93KGEsIHBvdyk7XG4gICAgfVxuXG4gICAgLy8gVG9uZWxsaS1TaGFua3MgYWxnb3JpdGhtIChUb3RhbGx5IHVub3B0aW1pemVkIGFuZCBzbG93KVxuICAgIC8vXG4gICAgLy8gRmluZCBRIGFuZCBTLCB0aGF0IFEgKiAyIF4gUyA9IChQIC0gMSlcbiAgICB2YXIgcSA9IHRoaXMubS5zdWJuKDEpO1xuICAgIHZhciBzID0gMDtcbiAgICB3aGlsZSAoIXEuaXNaZXJvKCkgJiYgcS5hbmRsbigxKSA9PT0gMCkge1xuICAgICAgcysrO1xuICAgICAgcS5pdXNocm4oMSk7XG4gICAgfVxuICAgIGFzc2VydCghcS5pc1plcm8oKSk7XG5cbiAgICB2YXIgb25lID0gbmV3IEJOKDEpLnRvUmVkKHRoaXMpO1xuICAgIHZhciBuT25lID0gb25lLnJlZE5lZygpO1xuXG4gICAgLy8gRmluZCBxdWFkcmF0aWMgbm9uLXJlc2lkdWVcbiAgICAvLyBOT1RFOiBNYXggaXMgc3VjaCBiZWNhdXNlIG9mIGdlbmVyYWxpemVkIFJpZW1hbm4gaHlwb3RoZXNpcy5cbiAgICB2YXIgbHBvdyA9IHRoaXMubS5zdWJuKDEpLml1c2hybigxKTtcbiAgICB2YXIgeiA9IHRoaXMubS5iaXRMZW5ndGgoKTtcbiAgICB6ID0gbmV3IEJOKDIgKiB6ICogeikudG9SZWQodGhpcyk7XG5cbiAgICB3aGlsZSAodGhpcy5wb3coeiwgbHBvdykuY21wKG5PbmUpICE9PSAwKSB7XG4gICAgICB6LnJlZElBZGQobk9uZSk7XG4gICAgfVxuXG4gICAgdmFyIGMgPSB0aGlzLnBvdyh6LCBxKTtcbiAgICB2YXIgciA9IHRoaXMucG93KGEsIHEuYWRkbigxKS5pdXNocm4oMSkpO1xuICAgIHZhciB0ID0gdGhpcy5wb3coYSwgcSk7XG4gICAgdmFyIG0gPSBzO1xuICAgIHdoaWxlICh0LmNtcChvbmUpICE9PSAwKSB7XG4gICAgICB2YXIgdG1wID0gdDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyB0bXAuY21wKG9uZSkgIT09IDA7IGkrKykge1xuICAgICAgICB0bXAgPSB0bXAucmVkU3FyKCk7XG4gICAgICB9XG4gICAgICBhc3NlcnQoaSA8IG0pO1xuICAgICAgdmFyIGIgPSB0aGlzLnBvdyhjLCBuZXcgQk4oMSkuaXVzaGxuKG0gLSBpIC0gMSkpO1xuXG4gICAgICByID0gci5yZWRNdWwoYik7XG4gICAgICBjID0gYi5yZWRTcXIoKTtcbiAgICAgIHQgPSB0LnJlZE11bChjKTtcbiAgICAgIG0gPSBpO1xuICAgIH1cblxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uIGludm0gKGEpIHtcbiAgICB2YXIgaW52ID0gYS5faW52bXAodGhpcy5tKTtcbiAgICBpZiAoaW52Lm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBpbnYubmVnYXRpdmUgPSAwO1xuICAgICAgcmV0dXJuIHRoaXMuaW1vZChpbnYpLnJlZE5lZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5pbW9kKGludik7XG4gICAgfVxuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24gcG93IChhLCBudW0pIHtcbiAgICBpZiAobnVtLmlzWmVybygpKSByZXR1cm4gbmV3IEJOKDEpLnRvUmVkKHRoaXMpO1xuICAgIGlmIChudW0uY21wbigxKSA9PT0gMCkgcmV0dXJuIGEuY2xvbmUoKTtcblxuICAgIHZhciB3aW5kb3dTaXplID0gNDtcbiAgICB2YXIgd25kID0gbmV3IEFycmF5KDEgPDwgd2luZG93U2l6ZSk7XG4gICAgd25kWzBdID0gbmV3IEJOKDEpLnRvUmVkKHRoaXMpO1xuICAgIHduZFsxXSA9IGE7XG4gICAgZm9yICh2YXIgaSA9IDI7IGkgPCB3bmQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHduZFtpXSA9IHRoaXMubXVsKHduZFtpIC0gMV0sIGEpO1xuICAgIH1cblxuICAgIHZhciByZXMgPSB3bmRbMF07XG4gICAgdmFyIGN1cnJlbnQgPSAwO1xuICAgIHZhciBjdXJyZW50TGVuID0gMDtcbiAgICB2YXIgc3RhcnQgPSBudW0uYml0TGVuZ3RoKCkgJSAyNjtcbiAgICBpZiAoc3RhcnQgPT09IDApIHtcbiAgICAgIHN0YXJ0ID0gMjY7XG4gICAgfVxuXG4gICAgZm9yIChpID0gbnVtLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgd29yZCA9IG51bS53b3Jkc1tpXTtcbiAgICAgIGZvciAodmFyIGogPSBzdGFydCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIHZhciBiaXQgPSAod29yZCA+PiBqKSAmIDE7XG4gICAgICAgIGlmIChyZXMgIT09IHduZFswXSkge1xuICAgICAgICAgIHJlcyA9IHRoaXMuc3FyKHJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYml0ID09PSAwICYmIGN1cnJlbnQgPT09IDApIHtcbiAgICAgICAgICBjdXJyZW50TGVuID0gMDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnQgPDw9IDE7XG4gICAgICAgIGN1cnJlbnQgfD0gYml0O1xuICAgICAgICBjdXJyZW50TGVuKys7XG4gICAgICAgIGlmIChjdXJyZW50TGVuICE9PSB3aW5kb3dTaXplICYmIChpICE9PSAwIHx8IGogIT09IDApKSBjb250aW51ZTtcblxuICAgICAgICByZXMgPSB0aGlzLm11bChyZXMsIHduZFtjdXJyZW50XSk7XG4gICAgICAgIGN1cnJlbnRMZW4gPSAwO1xuICAgICAgICBjdXJyZW50ID0gMDtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gMjY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmNvbnZlcnRUbyA9IGZ1bmN0aW9uIGNvbnZlcnRUbyAobnVtKSB7XG4gICAgdmFyIHIgPSBudW0udW1vZCh0aGlzLm0pO1xuXG4gICAgcmV0dXJuIHIgPT09IG51bSA/IHIuY2xvbmUoKSA6IHI7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uIGNvbnZlcnRGcm9tIChudW0pIHtcbiAgICB2YXIgcmVzID0gbnVtLmNsb25lKCk7XG4gICAgcmVzLnJlZCA9IG51bGw7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvL1xuICAvLyBNb250Z29tZXJ5IG1ldGhvZCBlbmdpbmVcbiAgLy9cblxuICBCTi5tb250ID0gZnVuY3Rpb24gbW9udCAobnVtKSB7XG4gICAgcmV0dXJuIG5ldyBNb250KG51bSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gTW9udCAobSkge1xuICAgIFJlZC5jYWxsKHRoaXMsIG0pO1xuXG4gICAgdGhpcy5zaGlmdCA9IHRoaXMubS5iaXRMZW5ndGgoKTtcbiAgICBpZiAodGhpcy5zaGlmdCAlIDI2ICE9PSAwKSB7XG4gICAgICB0aGlzLnNoaWZ0ICs9IDI2IC0gKHRoaXMuc2hpZnQgJSAyNik7XG4gICAgfVxuXG4gICAgdGhpcy5yID0gbmV3IEJOKDEpLml1c2hsbih0aGlzLnNoaWZ0KTtcbiAgICB0aGlzLnIyID0gdGhpcy5pbW9kKHRoaXMuci5zcXIoKSk7XG4gICAgdGhpcy5yaW52ID0gdGhpcy5yLl9pbnZtcCh0aGlzLm0pO1xuXG4gICAgdGhpcy5taW52ID0gdGhpcy5yaW52Lm11bCh0aGlzLnIpLmlzdWJuKDEpLmRpdih0aGlzLm0pO1xuICAgIHRoaXMubWludiA9IHRoaXMubWludi51bW9kKHRoaXMucik7XG4gICAgdGhpcy5taW52ID0gdGhpcy5yLnN1Yih0aGlzLm1pbnYpO1xuICB9XG4gIGluaGVyaXRzKE1vbnQsIFJlZCk7XG5cbiAgTW9udC5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24gY29udmVydFRvIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5pbW9kKG51bS51c2hsbih0aGlzLnNoaWZ0KSk7XG4gIH07XG5cbiAgTW9udC5wcm90b3R5cGUuY29udmVydEZyb20gPSBmdW5jdGlvbiBjb252ZXJ0RnJvbSAobnVtKSB7XG4gICAgdmFyIHIgPSB0aGlzLmltb2QobnVtLm11bCh0aGlzLnJpbnYpKTtcbiAgICByLnJlZCA9IG51bGw7XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgTW9udC5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uIGltdWwgKGEsIGIpIHtcbiAgICBpZiAoYS5pc1plcm8oKSB8fCBiLmlzWmVybygpKSB7XG4gICAgICBhLndvcmRzWzBdID0gMDtcbiAgICAgIGEubGVuZ3RoID0gMTtcbiAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIHZhciB0ID0gYS5pbXVsKGIpO1xuICAgIHZhciBjID0gdC5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSk7XG4gICAgdmFyIHUgPSB0LmlzdWIoYykuaXVzaHJuKHRoaXMuc2hpZnQpO1xuICAgIHZhciByZXMgPSB1O1xuXG4gICAgaWYgKHUuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzID0gdS5pc3ViKHRoaXMubSk7XG4gICAgfSBlbHNlIGlmICh1LmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMgPSB1LmlhZGQodGhpcy5tKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwgKGEsIGIpIHtcbiAgICBpZiAoYS5pc1plcm8oKSB8fCBiLmlzWmVybygpKSByZXR1cm4gbmV3IEJOKDApLl9mb3JjZVJlZCh0aGlzKTtcblxuICAgIHZhciB0ID0gYS5tdWwoYik7XG4gICAgdmFyIGMgPSB0Lm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKTtcbiAgICB2YXIgdSA9IHQuaXN1YihjKS5pdXNocm4odGhpcy5zaGlmdCk7XG4gICAgdmFyIHJlcyA9IHU7XG4gICAgaWYgKHUuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzID0gdS5pc3ViKHRoaXMubSk7XG4gICAgfSBlbHNlIGlmICh1LmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMgPSB1LmlhZGQodGhpcy5tKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24gaW52bSAoYSkge1xuICAgIC8vIChBUileLTEgKiBSXjIgPSAoQV4tMSAqIFJeLTEpICogUl4yID0gQV4tMSAqIFJcbiAgICB2YXIgcmVzID0gdGhpcy5pbW9kKGEuX2ludm1wKHRoaXMubSkubXVsKHRoaXMucjIpKTtcbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcbn0pKHR5cGVvZiBtb2R1bGUgPT09ICd1bmRlZmluZWQnIHx8IG1vZHVsZSwgdGhpcyk7XG4iLAogICAgImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAidHJ5IHtcbiAgdmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmICh0eXBlb2YgdXRpbC5pbmhlcml0cyAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgJyc7XG4gIG1vZHVsZS5leHBvcnRzID0gdXRpbC5pbmhlcml0cztcbn0gY2F0Y2ggKGUpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2luaGVyaXRzX2Jyb3dzZXIuanMnKTtcbn1cbiIsCiAgICAiLyogZXNsaW50LWRpc2FibGUgbm9kZS9uby1kZXByZWNhdGVkLWFwaSAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpXG52YXIgQnVmZmVyID0gYnVmZmVyLkJ1ZmZlclxuXG52YXIgc2FmZXIgPSB7fVxuXG52YXIga2V5XG5cbmZvciAoa2V5IGluIGJ1ZmZlcikge1xuICBpZiAoIWJ1ZmZlci5oYXNPd25Qcm9wZXJ0eShrZXkpKSBjb250aW51ZVxuICBpZiAoa2V5ID09PSAnU2xvd0J1ZmZlcicgfHwga2V5ID09PSAnQnVmZmVyJykgY29udGludWVcbiAgc2FmZXJba2V5XSA9IGJ1ZmZlcltrZXldXG59XG5cbnZhciBTYWZlciA9IHNhZmVyLkJ1ZmZlciA9IHt9XG5mb3IgKGtleSBpbiBCdWZmZXIpIHtcbiAgaWYgKCFCdWZmZXIuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWVcbiAgaWYgKGtleSA9PT0gJ2FsbG9jVW5zYWZlJyB8fCBrZXkgPT09ICdhbGxvY1Vuc2FmZVNsb3cnKSBjb250aW51ZVxuICBTYWZlcltrZXldID0gQnVmZmVyW2tleV1cbn1cblxuc2FmZXIuQnVmZmVyLnByb3RvdHlwZSA9IEJ1ZmZlci5wcm90b3R5cGVcblxuaWYgKCFTYWZlci5mcm9tIHx8IFNhZmVyLmZyb20gPT09IFVpbnQ4QXJyYXkuZnJvbSkge1xuICBTYWZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwidmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHZhbHVlKVxuICAgIH1cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgdmFsdWUpXG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxufVxuXG5pZiAoIVNhZmVyLmFsbG9jKSB7XG4gIFNhZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzaXplKVxuICAgIH1cbiAgICBpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA+PSAyICogKDEgPDwgMzApKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIHNpemUgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgICB9XG4gICAgdmFyIGJ1ZiA9IEJ1ZmZlcihzaXplKVxuICAgIGlmICghZmlsbCB8fCBmaWxsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYnVmLmZpbGwoMClcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuZmlsbChmaWxsKVxuICAgIH1cbiAgICByZXR1cm4gYnVmXG4gIH1cbn1cblxuaWYgKCFzYWZlci5rU3RyaW5nTWF4TGVuZ3RoKSB7XG4gIHRyeSB7XG4gICAgc2FmZXIua1N0cmluZ01heExlbmd0aCA9IHByb2Nlc3MuYmluZGluZygnYnVmZmVyJykua1N0cmluZ01heExlbmd0aFxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gd2UgY2FuJ3QgZGV0ZXJtaW5lIGtTdHJpbmdNYXhMZW5ndGggaW4gZW52aXJvbm1lbnRzIHdoZXJlIHByb2Nlc3MuYmluZGluZ1xuICAgIC8vIGlzIHVuc3VwcG9ydGVkLCBzbyBsZXQncyBub3Qgc2V0IGl0XG4gIH1cbn1cblxuaWYgKCFzYWZlci5jb25zdGFudHMpIHtcbiAgc2FmZXIuY29uc3RhbnRzID0ge1xuICAgIE1BWF9MRU5HVEg6IHNhZmVyLmtNYXhMZW5ndGhcbiAgfVxuICBpZiAoc2FmZXIua1N0cmluZ01heExlbmd0aCkge1xuICAgIHNhZmVyLmNvbnN0YW50cy5NQVhfU1RSSU5HX0xFTkdUSCA9IHNhZmVyLmtTdHJpbmdNYXhMZW5ndGhcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNhZmVyXG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5mdW5jdGlvbiBSZXBvcnRlcihvcHRpb25zKSB7XG4gIHRoaXMuX3JlcG9ydGVyU3RhdGUgPSB7XG4gICAgb2JqOiBudWxsLFxuICAgIHBhdGg6IFtdLFxuICAgIG9wdGlvbnM6IG9wdGlvbnMgfHwge30sXG4gICAgZXJyb3JzOiBbXVxuICB9O1xufVxuZXhwb3J0cy5SZXBvcnRlciA9IFJlcG9ydGVyO1xuXG5SZXBvcnRlci5wcm90b3R5cGUuaXNFcnJvciA9IGZ1bmN0aW9uIGlzRXJyb3Iob2JqKSB7XG4gIHJldHVybiBvYmogaW5zdGFuY2VvZiBSZXBvcnRlckVycm9yO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbiBzYXZlKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgcmV0dXJuIHsgb2JqOiBzdGF0ZS5vYmosIHBhdGhMZW46IHN0YXRlLnBhdGgubGVuZ3RoIH07XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUucmVzdG9yZSA9IGZ1bmN0aW9uIHJlc3RvcmUoZGF0YSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgc3RhdGUub2JqID0gZGF0YS5vYmo7XG4gIHN0YXRlLnBhdGggPSBzdGF0ZS5wYXRoLnNsaWNlKDAsIGRhdGEucGF0aExlbik7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuZW50ZXJLZXkgPSBmdW5jdGlvbiBlbnRlcktleShrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX3JlcG9ydGVyU3RhdGUucGF0aC5wdXNoKGtleSk7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuZXhpdEtleSA9IGZ1bmN0aW9uIGV4aXRLZXkoaW5kZXgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIHN0YXRlLnBhdGggPSBzdGF0ZS5wYXRoLnNsaWNlKDAsIGluZGV4IC0gMSk7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUubGVhdmVLZXkgPSBmdW5jdGlvbiBsZWF2ZUtleShpbmRleCwga2V5LCB2YWx1ZSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgdGhpcy5leGl0S2V5KGluZGV4KTtcbiAgaWYgKHN0YXRlLm9iaiAhPT0gbnVsbClcbiAgICBzdGF0ZS5vYmpba2V5XSA9IHZhbHVlO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLnBhdGggPSBmdW5jdGlvbiBwYXRoKCkge1xuICByZXR1cm4gdGhpcy5fcmVwb3J0ZXJTdGF0ZS5wYXRoLmpvaW4oJy8nKTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5lbnRlck9iamVjdCA9IGZ1bmN0aW9uIGVudGVyT2JqZWN0KCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgY29uc3QgcHJldiA9IHN0YXRlLm9iajtcbiAgc3RhdGUub2JqID0ge307XG4gIHJldHVybiBwcmV2O1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmxlYXZlT2JqZWN0ID0gZnVuY3Rpb24gbGVhdmVPYmplY3QocHJldikge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgY29uc3Qgbm93ID0gc3RhdGUub2JqO1xuICBzdGF0ZS5vYmogPSBwcmV2O1xuICByZXR1cm4gbm93O1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gZXJyb3IobXNnKSB7XG4gIGxldCBlcnI7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBjb25zdCBpbmhlcml0ZWQgPSBtc2cgaW5zdGFuY2VvZiBSZXBvcnRlckVycm9yO1xuICBpZiAoaW5oZXJpdGVkKSB7XG4gICAgZXJyID0gbXNnO1xuICB9IGVsc2Uge1xuICAgIGVyciA9IG5ldyBSZXBvcnRlckVycm9yKHN0YXRlLnBhdGgubWFwKGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgIHJldHVybiAnWycgKyBKU09OLnN0cmluZ2lmeShlbGVtKSArICddJztcbiAgICB9KS5qb2luKCcnKSwgbXNnLm1lc3NhZ2UgfHwgbXNnLCBtc2cuc3RhY2spO1xuICB9XG5cbiAgaWYgKCFzdGF0ZS5vcHRpb25zLnBhcnRpYWwpXG4gICAgdGhyb3cgZXJyO1xuXG4gIGlmICghaW5oZXJpdGVkKVxuICAgIHN0YXRlLmVycm9ycy5wdXNoKGVycik7XG5cbiAgcmV0dXJuIGVycjtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS53cmFwUmVzdWx0ID0gZnVuY3Rpb24gd3JhcFJlc3VsdChyZXN1bHQpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuICBpZiAoIXN0YXRlLm9wdGlvbnMucGFydGlhbClcbiAgICByZXR1cm4gcmVzdWx0O1xuXG4gIHJldHVybiB7XG4gICAgcmVzdWx0OiB0aGlzLmlzRXJyb3IocmVzdWx0KSA/IG51bGwgOiByZXN1bHQsXG4gICAgZXJyb3JzOiBzdGF0ZS5lcnJvcnNcbiAgfTtcbn07XG5cbmZ1bmN0aW9uIFJlcG9ydGVyRXJyb3IocGF0aCwgbXNnKSB7XG4gIHRoaXMucGF0aCA9IHBhdGg7XG4gIHRoaXMucmV0aHJvdyhtc2cpO1xufVxuaW5oZXJpdHMoUmVwb3J0ZXJFcnJvciwgRXJyb3IpO1xuXG5SZXBvcnRlckVycm9yLnByb3RvdHlwZS5yZXRocm93ID0gZnVuY3Rpb24gcmV0aHJvdyhtc2cpIHtcbiAgdGhpcy5tZXNzYWdlID0gbXNnICsgJyBhdDogJyArICh0aGlzLnBhdGggfHwgJyhzaGFsbG93KScpO1xuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgUmVwb3J0ZXJFcnJvcik7XG5cbiAgaWYgKCF0aGlzLnN0YWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIElFIG9ubHkgYWRkcyBzdGFjayB3aGVuIHRocm93blxuICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMubWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5zdGFjayA9IGUuc3RhY2s7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5jb25zdCBSZXBvcnRlciA9IHJlcXVpcmUoJy4uL2Jhc2UvcmVwb3J0ZXInKS5SZXBvcnRlcjtcbmNvbnN0IEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmVyLWJ1ZmZlcicpLkJ1ZmZlcjtcblxuZnVuY3Rpb24gRGVjb2RlckJ1ZmZlcihiYXNlLCBvcHRpb25zKSB7XG4gIFJlcG9ydGVyLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJhc2UpKSB7XG4gICAgdGhpcy5lcnJvcignSW5wdXQgbm90IEJ1ZmZlcicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuYmFzZSA9IGJhc2U7XG4gIHRoaXMub2Zmc2V0ID0gMDtcbiAgdGhpcy5sZW5ndGggPSBiYXNlLmxlbmd0aDtcbn1cbmluaGVyaXRzKERlY29kZXJCdWZmZXIsIFJlcG9ydGVyKTtcbmV4cG9ydHMuRGVjb2RlckJ1ZmZlciA9IERlY29kZXJCdWZmZXI7XG5cbkRlY29kZXJCdWZmZXIuaXNEZWNvZGVyQnVmZmVyID0gZnVuY3Rpb24gaXNEZWNvZGVyQnVmZmVyKGRhdGEpIHtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBEZWNvZGVyQnVmZmVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBPciBhY2NlcHQgY29tcGF0aWJsZSBBUElcbiAgY29uc3QgaXNDb21wYXRpYmxlID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgQnVmZmVyLmlzQnVmZmVyKGRhdGEuYmFzZSkgJiZcbiAgICBkYXRhLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdEZWNvZGVyQnVmZmVyJyAmJlxuICAgIHR5cGVvZiBkYXRhLm9mZnNldCA9PT0gJ251bWJlcicgJiZcbiAgICB0eXBlb2YgZGF0YS5sZW5ndGggPT09ICdudW1iZXInICYmXG4gICAgdHlwZW9mIGRhdGEuc2F2ZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBkYXRhLnJlc3RvcmUgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZGF0YS5pc0VtcHR5ID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIGRhdGEucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIGRhdGEuc2tpcCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBkYXRhLnJhdyA9PT0gJ2Z1bmN0aW9uJztcblxuICByZXR1cm4gaXNDb21wYXRpYmxlO1xufTtcblxuRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uIHNhdmUoKSB7XG4gIHJldHVybiB7IG9mZnNldDogdGhpcy5vZmZzZXQsIHJlcG9ydGVyOiBSZXBvcnRlci5wcm90b3R5cGUuc2F2ZS5jYWxsKHRoaXMpIH07XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5yZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZShzYXZlKSB7XG4gIC8vIFJldHVybiBza2lwcGVkIGRhdGFcbiAgY29uc3QgcmVzID0gbmV3IERlY29kZXJCdWZmZXIodGhpcy5iYXNlKTtcbiAgcmVzLm9mZnNldCA9IHNhdmUub2Zmc2V0O1xuICByZXMubGVuZ3RoID0gdGhpcy5vZmZzZXQ7XG5cbiAgdGhpcy5vZmZzZXQgPSBzYXZlLm9mZnNldDtcbiAgUmVwb3J0ZXIucHJvdG90eXBlLnJlc3RvcmUuY2FsbCh0aGlzLCBzYXZlLnJlcG9ydGVyKTtcblxuICByZXR1cm4gcmVzO1xufTtcblxuRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uIGlzRW1wdHkoKSB7XG4gIHJldHVybiB0aGlzLm9mZnNldCA9PT0gdGhpcy5sZW5ndGg7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDgoZmFpbCkge1xuICBpZiAodGhpcy5vZmZzZXQgKyAxIDw9IHRoaXMubGVuZ3RoKVxuICAgIHJldHVybiB0aGlzLmJhc2UucmVhZFVJbnQ4KHRoaXMub2Zmc2V0KyssIHRydWUpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuZXJyb3IoZmFpbCB8fCAnRGVjb2RlckJ1ZmZlciBvdmVycnVuJyk7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24gc2tpcChieXRlcywgZmFpbCkge1xuICBpZiAoISh0aGlzLm9mZnNldCArIGJ5dGVzIDw9IHRoaXMubGVuZ3RoKSlcbiAgICByZXR1cm4gdGhpcy5lcnJvcihmYWlsIHx8ICdEZWNvZGVyQnVmZmVyIG92ZXJydW4nKTtcblxuICBjb25zdCByZXMgPSBuZXcgRGVjb2RlckJ1ZmZlcih0aGlzLmJhc2UpO1xuXG4gIC8vIFNoYXJlIHJlcG9ydGVyIHN0YXRlXG4gIHJlcy5fcmVwb3J0ZXJTdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgcmVzLm9mZnNldCA9IHRoaXMub2Zmc2V0O1xuICByZXMubGVuZ3RoID0gdGhpcy5vZmZzZXQgKyBieXRlcztcbiAgdGhpcy5vZmZzZXQgKz0gYnl0ZXM7XG4gIHJldHVybiByZXM7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5yYXcgPSBmdW5jdGlvbiByYXcoc2F2ZSkge1xuICByZXR1cm4gdGhpcy5iYXNlLnNsaWNlKHNhdmUgPyBzYXZlLm9mZnNldCA6IHRoaXMub2Zmc2V0LCB0aGlzLmxlbmd0aCk7XG59O1xuXG5mdW5jdGlvbiBFbmNvZGVyQnVmZmVyKHZhbHVlLCByZXBvcnRlcikge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICBpZiAoIUVuY29kZXJCdWZmZXIuaXNFbmNvZGVyQnVmZmVyKGl0ZW0pKVxuICAgICAgICBpdGVtID0gbmV3IEVuY29kZXJCdWZmZXIoaXRlbSwgcmVwb3J0ZXIpO1xuICAgICAgdGhpcy5sZW5ndGggKz0gaXRlbS5sZW5ndGg7XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9LCB0aGlzKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKCEoMCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAweGZmKSlcbiAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignbm9uLWJ5dGUgRW5jb2RlckJ1ZmZlciB2YWx1ZScpO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmxlbmd0aCA9IDE7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHZhbHVlKTtcbiAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXBvcnRlci5lcnJvcignVW5zdXBwb3J0ZWQgdHlwZTogJyArIHR5cGVvZiB2YWx1ZSk7XG4gIH1cbn1cbmV4cG9ydHMuRW5jb2RlckJ1ZmZlciA9IEVuY29kZXJCdWZmZXI7XG5cbkVuY29kZXJCdWZmZXIuaXNFbmNvZGVyQnVmZmVyID0gZnVuY3Rpb24gaXNFbmNvZGVyQnVmZmVyKGRhdGEpIHtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBFbmNvZGVyQnVmZmVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBPciBhY2NlcHQgY29tcGF0aWJsZSBBUElcbiAgY29uc3QgaXNDb21wYXRpYmxlID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgZGF0YS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnRW5jb2RlckJ1ZmZlcicgJiZcbiAgICB0eXBlb2YgZGF0YS5sZW5ndGggPT09ICdudW1iZXInICYmXG4gICAgdHlwZW9mIGRhdGEuam9pbiA9PT0gJ2Z1bmN0aW9uJztcblxuICByZXR1cm4gaXNDb21wYXRpYmxlO1xufTtcblxuRW5jb2RlckJ1ZmZlci5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIGpvaW4ob3V0LCBvZmZzZXQpIHtcbiAgaWYgKCFvdXQpXG4gICAgb3V0ID0gQnVmZmVyLmFsbG9jKHRoaXMubGVuZ3RoKTtcbiAgaWYgKCFvZmZzZXQpXG4gICAgb2Zmc2V0ID0gMDtcblxuICBpZiAodGhpcy5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIG91dDtcblxuICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgIHRoaXMudmFsdWUuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XG4gICAgICBpdGVtLmpvaW4ob3V0LCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IGl0ZW0ubGVuZ3RoO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ251bWJlcicpXG4gICAgICBvdXRbb2Zmc2V0XSA9IHRoaXMudmFsdWU7XG4gICAgZWxzZSBpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgb3V0LndyaXRlKHRoaXMudmFsdWUsIG9mZnNldCk7XG4gICAgZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKHRoaXMudmFsdWUpKVxuICAgICAgdGhpcy52YWx1ZS5jb3B5KG91dCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gdGhpcy5sZW5ndGg7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufTtcbiIsCiAgICAibW9kdWxlLmV4cG9ydHMgPSBhc3NlcnQ7XG5cbmZ1bmN0aW9uIGFzc2VydCh2YWwsIG1zZykge1xuICBpZiAoIXZhbClcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnIHx8ICdBc3NlcnRpb24gZmFpbGVkJyk7XG59XG5cbmFzc2VydC5lcXVhbCA9IGZ1bmN0aW9uIGFzc2VydEVxdWFsKGwsIHIsIG1zZykge1xuICBpZiAobCAhPSByKVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cgfHwgKCdBc3NlcnRpb24gZmFpbGVkOiAnICsgbCArICcgIT0gJyArIHIpKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgUmVwb3J0ZXIgPSByZXF1aXJlKCcuLi9iYXNlL3JlcG9ydGVyJykuUmVwb3J0ZXI7XG5jb25zdCBFbmNvZGVyQnVmZmVyID0gcmVxdWlyZSgnLi4vYmFzZS9idWZmZXInKS5FbmNvZGVyQnVmZmVyO1xuY29uc3QgRGVjb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4uL2Jhc2UvYnVmZmVyJykuRGVjb2RlckJ1ZmZlcjtcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuLy8gU3VwcG9ydGVkIHRhZ3NcbmNvbnN0IHRhZ3MgPSBbXG4gICdzZXEnLCAnc2Vxb2YnLCAnc2V0JywgJ3NldG9mJywgJ29iamlkJywgJ2Jvb2wnLFxuICAnZ2VudGltZScsICd1dGN0aW1lJywgJ251bGxfJywgJ2VudW0nLCAnaW50JywgJ29iakRlc2MnLFxuICAnYml0c3RyJywgJ2JtcHN0cicsICdjaGFyc3RyJywgJ2dlbnN0cicsICdncmFwaHN0cicsICdpYTVzdHInLCAnaXNvNjQ2c3RyJyxcbiAgJ251bXN0cicsICdvY3RzdHInLCAncHJpbnRzdHInLCAndDYxc3RyJywgJ3VuaXN0cicsICd1dGY4c3RyJywgJ3ZpZGVvc3RyJ1xuXTtcblxuLy8gUHVibGljIG1ldGhvZHMgbGlzdFxuY29uc3QgbWV0aG9kcyA9IFtcbiAgJ2tleScsICdvYmonLCAndXNlJywgJ29wdGlvbmFsJywgJ2V4cGxpY2l0JywgJ2ltcGxpY2l0JywgJ2RlZicsICdjaG9pY2UnLFxuICAnYW55JywgJ2NvbnRhaW5zJ1xuXS5jb25jYXQodGFncyk7XG5cbi8vIE92ZXJyaWRlZCBtZXRob2RzIGxpc3RcbmNvbnN0IG92ZXJyaWRlZCA9IFtcbiAgJ19wZWVrVGFnJywgJ19kZWNvZGVUYWcnLCAnX3VzZScsXG4gICdfZGVjb2RlU3RyJywgJ19kZWNvZGVPYmppZCcsICdfZGVjb2RlVGltZScsXG4gICdfZGVjb2RlTnVsbCcsICdfZGVjb2RlSW50JywgJ19kZWNvZGVCb29sJywgJ19kZWNvZGVMaXN0JyxcblxuICAnX2VuY29kZUNvbXBvc2l0ZScsICdfZW5jb2RlU3RyJywgJ19lbmNvZGVPYmppZCcsICdfZW5jb2RlVGltZScsXG4gICdfZW5jb2RlTnVsbCcsICdfZW5jb2RlSW50JywgJ19lbmNvZGVCb29sJ1xuXTtcblxuZnVuY3Rpb24gTm9kZShlbmMsIHBhcmVudCwgbmFtZSkge1xuICBjb25zdCBzdGF0ZSA9IHt9O1xuICB0aGlzLl9iYXNlU3RhdGUgPSBzdGF0ZTtcblxuICBzdGF0ZS5uYW1lID0gbmFtZTtcbiAgc3RhdGUuZW5jID0gZW5jO1xuXG4gIHN0YXRlLnBhcmVudCA9IHBhcmVudCB8fCBudWxsO1xuICBzdGF0ZS5jaGlsZHJlbiA9IG51bGw7XG5cbiAgLy8gU3RhdGVcbiAgc3RhdGUudGFnID0gbnVsbDtcbiAgc3RhdGUuYXJncyA9IG51bGw7XG4gIHN0YXRlLnJldmVyc2VBcmdzID0gbnVsbDtcbiAgc3RhdGUuY2hvaWNlID0gbnVsbDtcbiAgc3RhdGUub3B0aW9uYWwgPSBmYWxzZTtcbiAgc3RhdGUuYW55ID0gZmFsc2U7XG4gIHN0YXRlLm9iaiA9IGZhbHNlO1xuICBzdGF0ZS51c2UgPSBudWxsO1xuICBzdGF0ZS51c2VEZWNvZGVyID0gbnVsbDtcbiAgc3RhdGUua2V5ID0gbnVsbDtcbiAgc3RhdGVbJ2RlZmF1bHQnXSA9IG51bGw7XG4gIHN0YXRlLmV4cGxpY2l0ID0gbnVsbDtcbiAgc3RhdGUuaW1wbGljaXQgPSBudWxsO1xuICBzdGF0ZS5jb250YWlucyA9IG51bGw7XG5cbiAgLy8gU2hvdWxkIGNyZWF0ZSBuZXcgaW5zdGFuY2Ugb24gZWFjaCBtZXRob2RcbiAgaWYgKCFzdGF0ZS5wYXJlbnQpIHtcbiAgICBzdGF0ZS5jaGlsZHJlbiA9IFtdO1xuICAgIHRoaXMuX3dyYXAoKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBOb2RlO1xuXG5jb25zdCBzdGF0ZVByb3BzID0gW1xuICAnZW5jJywgJ3BhcmVudCcsICdjaGlsZHJlbicsICd0YWcnLCAnYXJncycsICdyZXZlcnNlQXJncycsICdjaG9pY2UnLFxuICAnb3B0aW9uYWwnLCAnYW55JywgJ29iaicsICd1c2UnLCAnYWx0ZXJlZFVzZScsICdrZXknLCAnZGVmYXVsdCcsICdleHBsaWNpdCcsXG4gICdpbXBsaWNpdCcsICdjb250YWlucydcbl07XG5cbk5vZGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gY2xvbmUoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBjb25zdCBjc3RhdGUgPSB7fTtcbiAgc3RhdGVQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcbiAgICBjc3RhdGVbcHJvcF0gPSBzdGF0ZVtwcm9wXTtcbiAgfSk7XG4gIGNvbnN0IHJlcyA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGNzdGF0ZS5wYXJlbnQpO1xuICByZXMuX2Jhc2VTdGF0ZSA9IGNzdGF0ZTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbk5vZGUucHJvdG90eXBlLl93cmFwID0gZnVuY3Rpb24gd3JhcCgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIG1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICB0aGlzW21ldGhvZF0gPSBmdW5jdGlvbiBfd3JhcHBlZE1ldGhvZCgpIHtcbiAgICAgIGNvbnN0IGNsb25lID0gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyk7XG4gICAgICBzdGF0ZS5jaGlsZHJlbi5wdXNoKGNsb25lKTtcbiAgICAgIHJldHVybiBjbG9uZVttZXRob2RdLmFwcGx5KGNsb25lLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0sIHRoaXMpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0KGJvZHkpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLnBhcmVudCA9PT0gbnVsbCk7XG4gIGJvZHkuY2FsbCh0aGlzKTtcblxuICAvLyBGaWx0ZXIgY2hpbGRyZW5cbiAgc3RhdGUuY2hpbGRyZW4gPSBzdGF0ZS5jaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24oY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQuX2Jhc2VTdGF0ZS5wYXJlbnQgPT09IHRoaXM7XG4gIH0sIHRoaXMpO1xuICBhc3NlcnQuZXF1YWwoc3RhdGUuY2hpbGRyZW4ubGVuZ3RoLCAxLCAnUm9vdCBub2RlIGNhbiBoYXZlIG9ubHkgb25lIGNoaWxkJyk7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fdXNlQXJncyA9IGZ1bmN0aW9uIHVzZUFyZ3MoYXJncykge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAvLyBGaWx0ZXIgY2hpbGRyZW4gYW5kIGFyZ3NcbiAgY29uc3QgY2hpbGRyZW4gPSBhcmdzLmZpbHRlcihmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gYXJnIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3RvcjtcbiAgfSwgdGhpcyk7XG4gIGFyZ3MgPSBhcmdzLmZpbHRlcihmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gIShhcmcgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfSwgdGhpcyk7XG5cbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCAhPT0gMCkge1xuICAgIGFzc2VydChzdGF0ZS5jaGlsZHJlbiA9PT0gbnVsbCk7XG4gICAgc3RhdGUuY2hpbGRyZW4gPSBjaGlsZHJlbjtcblxuICAgIC8vIFJlcGxhY2UgcGFyZW50IHRvIG1haW50YWluIGJhY2t3YXJkIGxpbmtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBjaGlsZC5fYmFzZVN0YXRlLnBhcmVudCA9IHRoaXM7XG4gICAgfSwgdGhpcyk7XG4gIH1cbiAgaWYgKGFyZ3MubGVuZ3RoICE9PSAwKSB7XG4gICAgYXNzZXJ0KHN0YXRlLmFyZ3MgPT09IG51bGwpO1xuICAgIHN0YXRlLmFyZ3MgPSBhcmdzO1xuICAgIHN0YXRlLnJldmVyc2VBcmdzID0gYXJncy5tYXAoZnVuY3Rpb24oYXJnKSB7XG4gICAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ29iamVjdCcgfHwgYXJnLmNvbnN0cnVjdG9yICE9PSBPYmplY3QpXG4gICAgICAgIHJldHVybiBhcmc7XG5cbiAgICAgIGNvbnN0IHJlcyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMoYXJnKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAoa2V5ID09IChrZXkgfCAwKSlcbiAgICAgICAgICBrZXkgfD0gMDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhcmdba2V5XTtcbiAgICAgICAgcmVzW3ZhbHVlXSA9IGtleTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcbiAgfVxufTtcblxuLy9cbi8vIE92ZXJyaWRlZCBtZXRob2RzXG4vL1xuXG5vdmVycmlkZWQuZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgTm9kZS5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIF9vdmVycmlkZWQoKSB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1ldGhvZCArICcgbm90IGltcGxlbWVudGVkIGZvciBlbmNvZGluZzogJyArIHN0YXRlLmVuYyk7XG4gIH07XG59KTtcblxuLy9cbi8vIFB1YmxpYyBtZXRob2RzXG4vL1xuXG50YWdzLmZvckVhY2goZnVuY3Rpb24odGFnKSB7XG4gIE5vZGUucHJvdG90eXBlW3RhZ10gPSBmdW5jdGlvbiBfdGFnTWV0aG9kKCkge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gICAgYXNzZXJ0KHN0YXRlLnRhZyA9PT0gbnVsbCk7XG4gICAgc3RhdGUudGFnID0gdGFnO1xuXG4gICAgdGhpcy5fdXNlQXJncyhhcmdzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufSk7XG5cbk5vZGUucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIHVzZShpdGVtKSB7XG4gIGFzc2VydChpdGVtKTtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLnVzZSA9PT0gbnVsbCk7XG4gIHN0YXRlLnVzZSA9IGl0ZW07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5vcHRpb25hbCA9IGZ1bmN0aW9uIG9wdGlvbmFsKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBzdGF0ZS5vcHRpb25hbCA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5kZWYgPSBmdW5jdGlvbiBkZWYodmFsKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZVsnZGVmYXVsdCddID09PSBudWxsKTtcbiAgc3RhdGVbJ2RlZmF1bHQnXSA9IHZhbDtcbiAgc3RhdGUub3B0aW9uYWwgPSB0cnVlO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuZXhwbGljaXQgPSBmdW5jdGlvbiBleHBsaWNpdChudW0pIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLmV4cGxpY2l0ID09PSBudWxsICYmIHN0YXRlLmltcGxpY2l0ID09PSBudWxsKTtcbiAgc3RhdGUuZXhwbGljaXQgPSBudW07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5pbXBsaWNpdCA9IGZ1bmN0aW9uIGltcGxpY2l0KG51bSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUuZXhwbGljaXQgPT09IG51bGwgJiYgc3RhdGUuaW1wbGljaXQgPT09IG51bGwpO1xuICBzdGF0ZS5pbXBsaWNpdCA9IG51bTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLm9iaiA9IGZ1bmN0aW9uIG9iaigpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gIHN0YXRlLm9iaiA9IHRydWU7XG5cbiAgaWYgKGFyZ3MubGVuZ3RoICE9PSAwKVxuICAgIHRoaXMuX3VzZUFyZ3MoYXJncyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5rZXkgPSBmdW5jdGlvbiBrZXkobmV3S2V5KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS5rZXkgPT09IG51bGwpO1xuICBzdGF0ZS5rZXkgPSBuZXdLZXk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5hbnkgPSBmdW5jdGlvbiBhbnkoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIHN0YXRlLmFueSA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5jaG9pY2UgPSBmdW5jdGlvbiBjaG9pY2Uob2JqKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS5jaG9pY2UgPT09IG51bGwpO1xuICBzdGF0ZS5jaG9pY2UgPSBvYmo7XG4gIHRoaXMuX3VzZUFyZ3MoT2JqZWN0LmtleXMob2JqKS5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIG9ialtrZXldO1xuICB9KSk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIGNvbnRhaW5zKGl0ZW0pIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLnVzZSA9PT0gbnVsbCk7XG4gIHN0YXRlLmNvbnRhaW5zID0gaXRlbTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vXG4vLyBEZWNvZGluZ1xuLy9cblxuTm9kZS5wcm90b3R5cGUuX2RlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgb3B0aW9ucykge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAvLyBEZWNvZGUgcm9vdCBub2RlXG4gIGlmIChzdGF0ZS5wYXJlbnQgPT09IG51bGwpXG4gICAgcmV0dXJuIGlucHV0LndyYXBSZXN1bHQoc3RhdGUuY2hpbGRyZW5bMF0uX2RlY29kZShpbnB1dCwgb3B0aW9ucykpO1xuXG4gIGxldCByZXN1bHQgPSBzdGF0ZVsnZGVmYXVsdCddO1xuICBsZXQgcHJlc2VudCA9IHRydWU7XG5cbiAgbGV0IHByZXZLZXkgPSBudWxsO1xuICBpZiAoc3RhdGUua2V5ICE9PSBudWxsKVxuICAgIHByZXZLZXkgPSBpbnB1dC5lbnRlcktleShzdGF0ZS5rZXkpO1xuXG4gIC8vIENoZWNrIGlmIHRhZyBpcyB0aGVyZVxuICBpZiAoc3RhdGUub3B0aW9uYWwpIHtcbiAgICBsZXQgdGFnID0gbnVsbDtcbiAgICBpZiAoc3RhdGUuZXhwbGljaXQgIT09IG51bGwpXG4gICAgICB0YWcgPSBzdGF0ZS5leHBsaWNpdDtcbiAgICBlbHNlIGlmIChzdGF0ZS5pbXBsaWNpdCAhPT0gbnVsbClcbiAgICAgIHRhZyA9IHN0YXRlLmltcGxpY2l0O1xuICAgIGVsc2UgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbClcbiAgICAgIHRhZyA9IHN0YXRlLnRhZztcblxuICAgIGlmICh0YWcgPT09IG51bGwgJiYgIXN0YXRlLmFueSkge1xuICAgICAgLy8gVHJpYWwgYW5kIEVycm9yXG4gICAgICBjb25zdCBzYXZlID0gaW5wdXQuc2F2ZSgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHN0YXRlLmNob2ljZSA9PT0gbnVsbClcbiAgICAgICAgICB0aGlzLl9kZWNvZGVHZW5lcmljKHN0YXRlLnRhZywgaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhpcy5fZGVjb2RlQ2hvaWNlKGlucHV0LCBvcHRpb25zKTtcbiAgICAgICAgcHJlc2VudCA9IHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHByZXNlbnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlucHV0LnJlc3RvcmUoc2F2ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZXNlbnQgPSB0aGlzLl9wZWVrVGFnKGlucHV0LCB0YWcsIHN0YXRlLmFueSk7XG5cbiAgICAgIGlmIChpbnB1dC5pc0Vycm9yKHByZXNlbnQpKVxuICAgICAgICByZXR1cm4gcHJlc2VudDtcbiAgICB9XG4gIH1cblxuICAvLyBQdXNoIG9iamVjdCBvbiBzdGFja1xuICBsZXQgcHJldk9iajtcbiAgaWYgKHN0YXRlLm9iaiAmJiBwcmVzZW50KVxuICAgIHByZXZPYmogPSBpbnB1dC5lbnRlck9iamVjdCgpO1xuXG4gIGlmIChwcmVzZW50KSB7XG4gICAgLy8gVW53cmFwIGV4cGxpY2l0IHZhbHVlc1xuICAgIGlmIChzdGF0ZS5leHBsaWNpdCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgZXhwbGljaXQgPSB0aGlzLl9kZWNvZGVUYWcoaW5wdXQsIHN0YXRlLmV4cGxpY2l0KTtcbiAgICAgIGlmIChpbnB1dC5pc0Vycm9yKGV4cGxpY2l0KSlcbiAgICAgICAgcmV0dXJuIGV4cGxpY2l0O1xuICAgICAgaW5wdXQgPSBleHBsaWNpdDtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydCA9IGlucHV0Lm9mZnNldDtcblxuICAgIC8vIFVud3JhcCBpbXBsaWNpdCBhbmQgbm9ybWFsIHZhbHVlc1xuICAgIGlmIChzdGF0ZS51c2UgPT09IG51bGwgJiYgc3RhdGUuY2hvaWNlID09PSBudWxsKSB7XG4gICAgICBsZXQgc2F2ZTtcbiAgICAgIGlmIChzdGF0ZS5hbnkpXG4gICAgICAgIHNhdmUgPSBpbnB1dC5zYXZlKCk7XG4gICAgICBjb25zdCBib2R5ID0gdGhpcy5fZGVjb2RlVGFnKFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgc3RhdGUuaW1wbGljaXQgIT09IG51bGwgPyBzdGF0ZS5pbXBsaWNpdCA6IHN0YXRlLnRhZyxcbiAgICAgICAgc3RhdGUuYW55XG4gICAgICApO1xuICAgICAgaWYgKGlucHV0LmlzRXJyb3IoYm9keSkpXG4gICAgICAgIHJldHVybiBib2R5O1xuXG4gICAgICBpZiAoc3RhdGUuYW55KVxuICAgICAgICByZXN1bHQgPSBpbnB1dC5yYXcoc2F2ZSk7XG4gICAgICBlbHNlXG4gICAgICAgIGlucHV0ID0gYm9keTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRyYWNrICYmIHN0YXRlLnRhZyAhPT0gbnVsbClcbiAgICAgIG9wdGlvbnMudHJhY2soaW5wdXQucGF0aCgpLCBzdGFydCwgaW5wdXQubGVuZ3RoLCAndGFnZ2VkJyk7XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRyYWNrICYmIHN0YXRlLnRhZyAhPT0gbnVsbClcbiAgICAgIG9wdGlvbnMudHJhY2soaW5wdXQucGF0aCgpLCBpbnB1dC5vZmZzZXQsIGlucHV0Lmxlbmd0aCwgJ2NvbnRlbnQnKTtcblxuICAgIC8vIFNlbGVjdCBwcm9wZXIgbWV0aG9kIGZvciB0YWdcbiAgICBpZiAoc3RhdGUuYW55KSB7XG4gICAgICAvLyBuby1vcFxuICAgIH0gZWxzZSBpZiAoc3RhdGUuY2hvaWNlID09PSBudWxsKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLl9kZWNvZGVHZW5lcmljKHN0YXRlLnRhZywgaW5wdXQsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLl9kZWNvZGVDaG9pY2UoaW5wdXQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChpbnB1dC5pc0Vycm9yKHJlc3VsdCkpXG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgLy8gRGVjb2RlIGNoaWxkcmVuXG4gICAgaWYgKCFzdGF0ZS5hbnkgJiYgc3RhdGUuY2hvaWNlID09PSBudWxsICYmIHN0YXRlLmNoaWxkcmVuICE9PSBudWxsKSB7XG4gICAgICBzdGF0ZS5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIGRlY29kZUNoaWxkcmVuKGNoaWxkKSB7XG4gICAgICAgIC8vIE5PVEU6IFdlIGFyZSBpZ25vcmluZyBlcnJvcnMgaGVyZSwgdG8gbGV0IHBhcnNlciBjb250aW51ZSB3aXRoIG90aGVyXG4gICAgICAgIC8vIHBhcnRzIG9mIGVuY29kZWQgZGF0YVxuICAgICAgICBjaGlsZC5fZGVjb2RlKGlucHV0LCBvcHRpb25zKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERlY29kZSBjb250YWluZWQvZW5jb2RlZCBieSBzY2hlbWEsIG9ubHkgaW4gYml0IG9yIG9jdGV0IHN0cmluZ3NcbiAgICBpZiAoc3RhdGUuY29udGFpbnMgJiYgKHN0YXRlLnRhZyA9PT0gJ29jdHN0cicgfHwgc3RhdGUudGFnID09PSAnYml0c3RyJykpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgRGVjb2RlckJ1ZmZlcihyZXN1bHQpO1xuICAgICAgcmVzdWx0ID0gdGhpcy5fZ2V0VXNlKHN0YXRlLmNvbnRhaW5zLCBpbnB1dC5fcmVwb3J0ZXJTdGF0ZS5vYmopXG4gICAgICAgIC5fZGVjb2RlKGRhdGEsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBvcCBvYmplY3RcbiAgaWYgKHN0YXRlLm9iaiAmJiBwcmVzZW50KVxuICAgIHJlc3VsdCA9IGlucHV0LmxlYXZlT2JqZWN0KHByZXZPYmopO1xuXG4gIC8vIFNldCBrZXlcbiAgaWYgKHN0YXRlLmtleSAhPT0gbnVsbCAmJiAocmVzdWx0ICE9PSBudWxsIHx8IHByZXNlbnQgPT09IHRydWUpKVxuICAgIGlucHV0LmxlYXZlS2V5KHByZXZLZXksIHN0YXRlLmtleSwgcmVzdWx0KTtcbiAgZWxzZSBpZiAocHJldktleSAhPT0gbnVsbClcbiAgICBpbnB1dC5leGl0S2V5KHByZXZLZXkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZGVjb2RlR2VuZXJpYyA9IGZ1bmN0aW9uIGRlY29kZUdlbmVyaWModGFnLCBpbnB1dCwgb3B0aW9ucykge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBpZiAodGFnID09PSAnc2VxJyB8fCB0YWcgPT09ICdzZXQnKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAodGFnID09PSAnc2Vxb2YnIHx8IHRhZyA9PT0gJ3NldG9mJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlTGlzdChpbnB1dCwgdGFnLCBzdGF0ZS5hcmdzWzBdLCBvcHRpb25zKTtcbiAgZWxzZSBpZiAoL3N0ciQvLnRlc3QodGFnKSlcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlU3RyKGlucHV0LCB0YWcsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmppZCcgJiYgc3RhdGUuYXJncylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlT2JqaWQoaW5wdXQsIHN0YXRlLmFyZ3NbMF0sIHN0YXRlLmFyZ3NbMV0sIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmppZCcpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZU9iamlkKGlucHV0LCBudWxsLCBudWxsLCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnZ2VudGltZScgfHwgdGFnID09PSAndXRjdGltZScpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZVRpbWUoaW5wdXQsIHRhZywgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ251bGxfJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlTnVsbChpbnB1dCwgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2Jvb2wnKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVCb29sKGlucHV0LCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnb2JqRGVzYycpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZVN0cihpbnB1dCwgdGFnLCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnaW50JyB8fCB0YWcgPT09ICdlbnVtJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlSW50KGlucHV0LCBzdGF0ZS5hcmdzICYmIHN0YXRlLmFyZ3NbMF0sIG9wdGlvbnMpO1xuXG4gIGlmIChzdGF0ZS51c2UgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0VXNlKHN0YXRlLnVzZSwgaW5wdXQuX3JlcG9ydGVyU3RhdGUub2JqKVxuICAgICAgLl9kZWNvZGUoaW5wdXQsIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBpbnB1dC5lcnJvcigndW5rbm93biB0YWc6ICcgKyB0YWcpO1xuICB9XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZ2V0VXNlID0gZnVuY3Rpb24gX2dldFVzZShlbnRpdHksIG9iaikge1xuXG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICAvLyBDcmVhdGUgYWx0ZXJlZCB1c2UgZGVjb2RlciBpZiBpbXBsaWNpdCBpcyBzZXRcbiAgc3RhdGUudXNlRGVjb2RlciA9IHRoaXMuX3VzZShlbnRpdHksIG9iaik7XG4gIGFzc2VydChzdGF0ZS51c2VEZWNvZGVyLl9iYXNlU3RhdGUucGFyZW50ID09PSBudWxsKTtcbiAgc3RhdGUudXNlRGVjb2RlciA9IHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5jaGlsZHJlblswXTtcbiAgaWYgKHN0YXRlLmltcGxpY2l0ICE9PSBzdGF0ZS51c2VEZWNvZGVyLl9iYXNlU3RhdGUuaW1wbGljaXQpIHtcbiAgICBzdGF0ZS51c2VEZWNvZGVyID0gc3RhdGUudXNlRGVjb2Rlci5jbG9uZSgpO1xuICAgIHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5pbXBsaWNpdCA9IHN0YXRlLmltcGxpY2l0O1xuICB9XG4gIHJldHVybiBzdGF0ZS51c2VEZWNvZGVyO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2RlY29kZUNob2ljZSA9IGZ1bmN0aW9uIGRlY29kZUNob2ljZShpbnB1dCwgb3B0aW9ucykge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgbGV0IHJlc3VsdCA9IG51bGw7XG4gIGxldCBtYXRjaCA9IGZhbHNlO1xuXG4gIE9iamVjdC5rZXlzKHN0YXRlLmNob2ljZSkuc29tZShmdW5jdGlvbihrZXkpIHtcbiAgICBjb25zdCBzYXZlID0gaW5wdXQuc2F2ZSgpO1xuICAgIGNvbnN0IG5vZGUgPSBzdGF0ZS5jaG9pY2Vba2V5XTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsdWUgPSBub2RlLl9kZWNvZGUoaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgaWYgKGlucHV0LmlzRXJyb3IodmFsdWUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJlc3VsdCA9IHsgdHlwZToga2V5LCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgIG1hdGNoID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpbnB1dC5yZXN0b3JlKHNhdmUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSwgdGhpcyk7XG5cbiAgaWYgKCFtYXRjaClcbiAgICByZXR1cm4gaW5wdXQuZXJyb3IoJ0Nob2ljZSBub3QgbWF0Y2hlZCcpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vL1xuLy8gRW5jb2Rpbmdcbi8vXG5cbk5vZGUucHJvdG90eXBlLl9jcmVhdGVFbmNvZGVyQnVmZmVyID0gZnVuY3Rpb24gY3JlYXRlRW5jb2RlckJ1ZmZlcihkYXRhKSB7XG4gIHJldHVybiBuZXcgRW5jb2RlckJ1ZmZlcihkYXRhLCB0aGlzLnJlcG9ydGVyKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgcmVwb3J0ZXIsIHBhcmVudCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgaWYgKHN0YXRlWydkZWZhdWx0J10gIT09IG51bGwgJiYgc3RhdGVbJ2RlZmF1bHQnXSA9PT0gZGF0YSlcbiAgICByZXR1cm47XG5cbiAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZW5jb2RlVmFsdWUoZGF0YSwgcmVwb3J0ZXIsIHBhcmVudCk7XG4gIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm47XG5cbiAgaWYgKHRoaXMuX3NraXBEZWZhdWx0KHJlc3VsdCwgcmVwb3J0ZXIsIHBhcmVudCkpXG4gICAgcmV0dXJuO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZW5jb2RlVmFsdWUgPSBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgcmVwb3J0ZXIsIHBhcmVudCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAvLyBEZWNvZGUgcm9vdCBub2RlXG4gIGlmIChzdGF0ZS5wYXJlbnQgPT09IG51bGwpXG4gICAgcmV0dXJuIHN0YXRlLmNoaWxkcmVuWzBdLl9lbmNvZGUoZGF0YSwgcmVwb3J0ZXIgfHwgbmV3IFJlcG9ydGVyKCkpO1xuXG4gIGxldCByZXN1bHQgPSBudWxsO1xuXG4gIC8vIFNldCByZXBvcnRlciB0byBzaGFyZSBpdCB3aXRoIGEgY2hpbGQgY2xhc3NcbiAgdGhpcy5yZXBvcnRlciA9IHJlcG9ydGVyO1xuXG4gIC8vIENoZWNrIGlmIGRhdGEgaXMgdGhlcmVcbiAgaWYgKHN0YXRlLm9wdGlvbmFsICYmIGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzdGF0ZVsnZGVmYXVsdCddICE9PSBudWxsKVxuICAgICAgZGF0YSA9IHN0YXRlWydkZWZhdWx0J107XG4gICAgZWxzZVxuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRW5jb2RlIGNoaWxkcmVuIGZpcnN0XG4gIGxldCBjb250ZW50ID0gbnVsbDtcbiAgbGV0IHByaW1pdGl2ZSA9IGZhbHNlO1xuICBpZiAoc3RhdGUuYW55KSB7XG4gICAgLy8gQW55dGhpbmcgdGhhdCB3YXMgZ2l2ZW4gaXMgdHJhbnNsYXRlZCB0byBidWZmZXJcbiAgICByZXN1bHQgPSB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGRhdGEpO1xuICB9IGVsc2UgaWYgKHN0YXRlLmNob2ljZSkge1xuICAgIHJlc3VsdCA9IHRoaXMuX2VuY29kZUNob2ljZShkYXRhLCByZXBvcnRlcik7XG4gIH0gZWxzZSBpZiAoc3RhdGUuY29udGFpbnMpIHtcbiAgICBjb250ZW50ID0gdGhpcy5fZ2V0VXNlKHN0YXRlLmNvbnRhaW5zLCBwYXJlbnQpLl9lbmNvZGUoZGF0YSwgcmVwb3J0ZXIpO1xuICAgIHByaW1pdGl2ZSA9IHRydWU7XG4gIH0gZWxzZSBpZiAoc3RhdGUuY2hpbGRyZW4pIHtcbiAgICBjb250ZW50ID0gc3RhdGUuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBpZiAoY2hpbGQuX2Jhc2VTdGF0ZS50YWcgPT09ICdudWxsXycpXG4gICAgICAgIHJldHVybiBjaGlsZC5fZW5jb2RlKG51bGwsIHJlcG9ydGVyLCBkYXRhKTtcblxuICAgICAgaWYgKGNoaWxkLl9iYXNlU3RhdGUua2V5ID09PSBudWxsKVxuICAgICAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ0NoaWxkIHNob3VsZCBoYXZlIGEga2V5Jyk7XG4gICAgICBjb25zdCBwcmV2S2V5ID0gcmVwb3J0ZXIuZW50ZXJLZXkoY2hpbGQuX2Jhc2VTdGF0ZS5rZXkpO1xuXG4gICAgICBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKVxuICAgICAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ0NoaWxkIGV4cGVjdGVkLCBidXQgaW5wdXQgaXMgbm90IG9iamVjdCcpO1xuXG4gICAgICBjb25zdCByZXMgPSBjaGlsZC5fZW5jb2RlKGRhdGFbY2hpbGQuX2Jhc2VTdGF0ZS5rZXldLCByZXBvcnRlciwgZGF0YSk7XG4gICAgICByZXBvcnRlci5sZWF2ZUtleShwcmV2S2V5KTtcblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LCB0aGlzKS5maWx0ZXIoZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9KTtcbiAgICBjb250ZW50ID0gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihjb250ZW50KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoc3RhdGUudGFnID09PSAnc2Vxb2YnIHx8IHN0YXRlLnRhZyA9PT0gJ3NldG9mJykge1xuICAgICAgLy8gVE9ETyhpbmR1dG55KTogdGhpcyBzaG91bGQgYmUgdGhyb3duIG9uIERTTCBsZXZlbFxuICAgICAgaWYgKCEoc3RhdGUuYXJncyAmJiBzdGF0ZS5hcmdzLmxlbmd0aCA9PT0gMSkpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignVG9vIG1hbnkgYXJncyBmb3IgOiAnICsgc3RhdGUudGFnKTtcblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKVxuICAgICAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ3NlcW9mL3NldG9mLCBidXQgZGF0YSBpcyBub3QgQXJyYXknKTtcblxuICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLmNsb25lKCk7XG4gICAgICBjaGlsZC5fYmFzZVN0YXRlLmltcGxpY2l0ID0gbnVsbDtcbiAgICAgIGNvbnRlbnQgPSB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGRhdGEubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFVzZShzdGF0ZS5hcmdzWzBdLCBkYXRhKS5fZW5jb2RlKGl0ZW0sIHJlcG9ydGVyKTtcbiAgICAgIH0sIGNoaWxkKSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS51c2UgIT09IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2dldFVzZShzdGF0ZS51c2UsIHBhcmVudCkuX2VuY29kZShkYXRhLCByZXBvcnRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnQgPSB0aGlzLl9lbmNvZGVQcmltaXRpdmUoc3RhdGUudGFnLCBkYXRhKTtcbiAgICAgIHByaW1pdGl2ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gRW5jb2RlIGRhdGEgaXRzZWxmXG4gIGlmICghc3RhdGUuYW55ICYmIHN0YXRlLmNob2ljZSA9PT0gbnVsbCkge1xuICAgIGNvbnN0IHRhZyA9IHN0YXRlLmltcGxpY2l0ICE9PSBudWxsID8gc3RhdGUuaW1wbGljaXQgOiBzdGF0ZS50YWc7XG4gICAgY29uc3QgY2xzID0gc3RhdGUuaW1wbGljaXQgPT09IG51bGwgPyAndW5pdmVyc2FsJyA6ICdjb250ZXh0JztcblxuICAgIGlmICh0YWcgPT09IG51bGwpIHtcbiAgICAgIGlmIChzdGF0ZS51c2UgPT09IG51bGwpXG4gICAgICAgIHJlcG9ydGVyLmVycm9yKCdUYWcgY291bGQgYmUgb21pdHRlZCBvbmx5IGZvciAudXNlKCknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXRlLnVzZSA9PT0gbnVsbClcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fZW5jb2RlQ29tcG9zaXRlKHRhZywgcHJpbWl0aXZlLCBjbHMsIGNvbnRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdyYXAgaW4gZXhwbGljaXRcbiAgaWYgKHN0YXRlLmV4cGxpY2l0ICE9PSBudWxsKVxuICAgIHJlc3VsdCA9IHRoaXMuX2VuY29kZUNvbXBvc2l0ZShzdGF0ZS5leHBsaWNpdCwgZmFsc2UsICdjb250ZXh0JywgcmVzdWx0KTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2VuY29kZUNob2ljZSA9IGZ1bmN0aW9uIGVuY29kZUNob2ljZShkYXRhLCByZXBvcnRlcikge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBjb25zdCBub2RlID0gc3RhdGUuY2hvaWNlW2RhdGEudHlwZV07XG4gIGlmICghbm9kZSkge1xuICAgIGFzc2VydChcbiAgICAgIGZhbHNlLFxuICAgICAgZGF0YS50eXBlICsgJyBub3QgZm91bmQgaW4gJyArXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhzdGF0ZS5jaG9pY2UpKSk7XG4gIH1cbiAgcmV0dXJuIG5vZGUuX2VuY29kZShkYXRhLnZhbHVlLCByZXBvcnRlcik7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZW5jb2RlUHJpbWl0aXZlID0gZnVuY3Rpb24gZW5jb2RlUHJpbWl0aXZlKHRhZywgZGF0YSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBpZiAoL3N0ciQvLnRlc3QodGFnKSlcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlU3RyKGRhdGEsIHRhZyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJyAmJiBzdGF0ZS5hcmdzKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVPYmppZChkYXRhLCBzdGF0ZS5yZXZlcnNlQXJnc1swXSwgc3RhdGUuYXJnc1sxXSk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlT2JqaWQoZGF0YSwgbnVsbCwgbnVsbCk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2dlbnRpbWUnIHx8IHRhZyA9PT0gJ3V0Y3RpbWUnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVUaW1lKGRhdGEsIHRhZyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ251bGxfJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlTnVsbCgpO1xuICBlbHNlIGlmICh0YWcgPT09ICdpbnQnIHx8IHRhZyA9PT0gJ2VudW0nKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVJbnQoZGF0YSwgc3RhdGUuYXJncyAmJiBzdGF0ZS5yZXZlcnNlQXJnc1swXSk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2Jvb2wnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVCb29sKGRhdGEpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmpEZXNjJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlU3RyKGRhdGEsIHRhZyk7XG4gIGVsc2VcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHRhZzogJyArIHRhZyk7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5faXNOdW1zdHIgPSBmdW5jdGlvbiBpc051bXN0cihzdHIpIHtcbiAgcmV0dXJuIC9eWzAtOSBdKiQvLnRlc3Qoc3RyKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9pc1ByaW50c3RyID0gZnVuY3Rpb24gaXNQcmludHN0cihzdHIpIHtcbiAgcmV0dXJuIC9eW0EtWmEtejAtOSAnKCkrLC0uLzo9P10qJC8udGVzdChzdHIpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG4vLyBIZWxwZXJcbmZ1bmN0aW9uIHJldmVyc2UobWFwKSB7XG4gIGNvbnN0IHJlcyA9IHt9O1xuXG4gIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAvLyBDb252ZXJ0IGtleSB0byBpbnRlZ2VyIGlmIGl0IGlzIHN0cmluZ2lmaWVkXG4gICAgaWYgKChrZXkgfCAwKSA9PSBrZXkpXG4gICAgICBrZXkgPSBrZXkgfCAwO1xuXG4gICAgY29uc3QgdmFsdWUgPSBtYXBba2V5XTtcbiAgICByZXNbdmFsdWVdID0ga2V5O1xuICB9KTtcblxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnRzLnRhZ0NsYXNzID0ge1xuICAwOiAndW5pdmVyc2FsJyxcbiAgMTogJ2FwcGxpY2F0aW9uJyxcbiAgMjogJ2NvbnRleHQnLFxuICAzOiAncHJpdmF0ZSdcbn07XG5leHBvcnRzLnRhZ0NsYXNzQnlOYW1lID0gcmV2ZXJzZShleHBvcnRzLnRhZ0NsYXNzKTtcblxuZXhwb3J0cy50YWcgPSB7XG4gIDB4MDA6ICdlbmQnLFxuICAweDAxOiAnYm9vbCcsXG4gIDB4MDI6ICdpbnQnLFxuICAweDAzOiAnYml0c3RyJyxcbiAgMHgwNDogJ29jdHN0cicsXG4gIDB4MDU6ICdudWxsXycsXG4gIDB4MDY6ICdvYmppZCcsXG4gIDB4MDc6ICdvYmpEZXNjJyxcbiAgMHgwODogJ2V4dGVybmFsJyxcbiAgMHgwOTogJ3JlYWwnLFxuICAweDBhOiAnZW51bScsXG4gIDB4MGI6ICdlbWJlZCcsXG4gIDB4MGM6ICd1dGY4c3RyJyxcbiAgMHgwZDogJ3JlbGF0aXZlT2lkJyxcbiAgMHgxMDogJ3NlcScsXG4gIDB4MTE6ICdzZXQnLFxuICAweDEyOiAnbnVtc3RyJyxcbiAgMHgxMzogJ3ByaW50c3RyJyxcbiAgMHgxNDogJ3Q2MXN0cicsXG4gIDB4MTU6ICd2aWRlb3N0cicsXG4gIDB4MTY6ICdpYTVzdHInLFxuICAweDE3OiAndXRjdGltZScsXG4gIDB4MTg6ICdnZW50aW1lJyxcbiAgMHgxOTogJ2dyYXBoc3RyJyxcbiAgMHgxYTogJ2lzbzY0NnN0cicsXG4gIDB4MWI6ICdnZW5zdHInLFxuICAweDFjOiAndW5pc3RyJyxcbiAgMHgxZDogJ2NoYXJzdHInLFxuICAweDFlOiAnYm1wc3RyJ1xufTtcbmV4cG9ydHMudGFnQnlOYW1lID0gcmV2ZXJzZShleHBvcnRzLnRhZyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuY29uc3QgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xuY29uc3QgTm9kZSA9IHJlcXVpcmUoJy4uL2Jhc2Uvbm9kZScpO1xuXG4vLyBJbXBvcnQgREVSIGNvbnN0YW50c1xuY29uc3QgZGVyID0gcmVxdWlyZSgnLi4vY29uc3RhbnRzL2RlcicpO1xuXG5mdW5jdGlvbiBERVJFbmNvZGVyKGVudGl0eSkge1xuICB0aGlzLmVuYyA9ICdkZXInO1xuICB0aGlzLm5hbWUgPSBlbnRpdHkubmFtZTtcbiAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG5cbiAgLy8gQ29uc3RydWN0IGJhc2UgdHJlZVxuICB0aGlzLnRyZWUgPSBuZXcgREVSTm9kZSgpO1xuICB0aGlzLnRyZWUuX2luaXQoZW50aXR5LmJvZHkpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBERVJFbmNvZGVyO1xuXG5ERVJFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgcmVwb3J0ZXIpIHtcbiAgcmV0dXJuIHRoaXMudHJlZS5fZW5jb2RlKGRhdGEsIHJlcG9ydGVyKS5qb2luKCk7XG59O1xuXG4vLyBUcmVlIG1ldGhvZHNcblxuZnVuY3Rpb24gREVSTm9kZShwYXJlbnQpIHtcbiAgTm9kZS5jYWxsKHRoaXMsICdkZXInLCBwYXJlbnQpO1xufVxuaW5oZXJpdHMoREVSTm9kZSwgTm9kZSk7XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVDb21wb3NpdGUgPSBmdW5jdGlvbiBlbmNvZGVDb21wb3NpdGUodGFnLFxuICBwcmltaXRpdmUsXG4gIGNscyxcbiAgY29udGVudCkge1xuICBjb25zdCBlbmNvZGVkVGFnID0gZW5jb2RlVGFnKHRhZywgcHJpbWl0aXZlLCBjbHMsIHRoaXMucmVwb3J0ZXIpO1xuXG4gIC8vIFNob3J0IGZvcm1cbiAgaWYgKGNvbnRlbnQubGVuZ3RoIDwgMHg4MCkge1xuICAgIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYygyKTtcbiAgICBoZWFkZXJbMF0gPSBlbmNvZGVkVGFnO1xuICAgIGhlYWRlclsxXSA9IGNvbnRlbnQubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFsgaGVhZGVyLCBjb250ZW50IF0pO1xuICB9XG5cbiAgLy8gTG9uZyBmb3JtXG4gIC8vIENvdW50IG9jdGV0cyByZXF1aXJlZCB0byBzdG9yZSBsZW5ndGhcbiAgbGV0IGxlbk9jdGV0cyA9IDE7XG4gIGZvciAobGV0IGkgPSBjb250ZW50Lmxlbmd0aDsgaSA+PSAweDEwMDsgaSA+Pj0gOClcbiAgICBsZW5PY3RldHMrKztcblxuICBjb25zdCBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMSArIDEgKyBsZW5PY3RldHMpO1xuICBoZWFkZXJbMF0gPSBlbmNvZGVkVGFnO1xuICBoZWFkZXJbMV0gPSAweDgwIHwgbGVuT2N0ZXRzO1xuXG4gIGZvciAobGV0IGkgPSAxICsgbGVuT2N0ZXRzLCBqID0gY29udGVudC5sZW5ndGg7IGogPiAwOyBpLS0sIGogPj49IDgpXG4gICAgaGVhZGVyW2ldID0gaiAmIDB4ZmY7XG5cbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoWyBoZWFkZXIsIGNvbnRlbnQgXSk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlU3RyID0gZnVuY3Rpb24gZW5jb2RlU3RyKHN0ciwgdGFnKSB7XG4gIGlmICh0YWcgPT09ICdiaXRzdHInKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoWyBzdHIudW51c2VkIHwgMCwgc3RyLmRhdGEgXSk7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnYm1wc3RyJykge1xuICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5hbGxvYyhzdHIubGVuZ3RoICogMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGJ1Zi53cml0ZVVJbnQxNkJFKHN0ci5jaGFyQ29kZUF0KGkpLCBpICogMik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGJ1Zik7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnbnVtc3RyJykge1xuICAgIGlmICghdGhpcy5faXNOdW1zdHIoc3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ0VuY29kaW5nIG9mIHN0cmluZyB0eXBlOiBudW1zdHIgc3VwcG9ydHMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25seSBkaWdpdHMgYW5kIHNwYWNlJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik7XG4gIH0gZWxzZSBpZiAodGFnID09PSAncHJpbnRzdHInKSB7XG4gICAgaWYgKCF0aGlzLl9pc1ByaW50c3RyKHN0cikpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogcHJpbnRzdHIgc3VwcG9ydHMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25seSBsYXRpbiB1cHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXJzLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaWdpdHMsIHNwYWNlLCBhcG9zdHJvcGhlLCBsZWZ0IGFuZCByaWd0aCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXJlbnRoZXNpcywgcGx1cyBzaWduLCBjb21tYSwgaHlwaGVuLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkb3QsIHNsYXNoLCBjb2xvbiwgZXF1YWwgc2lnbiwgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncXVlc3Rpb24gbWFyaycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzdHIpO1xuICB9IGVsc2UgaWYgKC9zdHIkLy50ZXN0KHRhZykpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzdHIpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ29iakRlc2MnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoc3RyKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignRW5jb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6ICcgKyB0YWcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgdW5zdXBwb3J0ZWQnKTtcbiAgfVxufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZU9iamlkID0gZnVuY3Rpb24gZW5jb2RlT2JqaWQoaWQsIHZhbHVlcywgcmVsYXRpdmUpIHtcbiAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIXZhbHVlcylcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdzdHJpbmcgb2JqaWQgZ2l2ZW4sIGJ1dCBubyB2YWx1ZXMgbWFwIGZvdW5kJyk7XG4gICAgaWYgKCF2YWx1ZXMuaGFzT3duUHJvcGVydHkoaWQpKVxuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ29iamlkIG5vdCBmb3VuZCBpbiB2YWx1ZXMgbWFwJyk7XG4gICAgaWQgPSB2YWx1ZXNbaWRdLnNwbGl0KC9bXFxzLl0rL2cpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWQubGVuZ3RoOyBpKyspXG4gICAgICBpZFtpXSB8PSAwO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaWQpKSB7XG4gICAgaWQgPSBpZC5zbGljZSgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWQubGVuZ3RoOyBpKyspXG4gICAgICBpZFtpXSB8PSAwO1xuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGlkKSkge1xuICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdvYmppZCgpIHNob3VsZCBiZSBlaXRoZXIgYXJyYXkgb3Igc3RyaW5nLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ290OiAnICsgSlNPTi5zdHJpbmdpZnkoaWQpKTtcbiAgfVxuXG4gIGlmICghcmVsYXRpdmUpIHtcbiAgICBpZiAoaWRbMV0gPj0gNDApXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignU2Vjb25kIG9iamlkIGlkZW50aWZpZXIgT09CJyk7XG4gICAgaWQuc3BsaWNlKDAsIDIsIGlkWzBdICogNDAgKyBpZFsxXSk7XG4gIH1cblxuICAvLyBDb3VudCBudW1iZXIgb2Ygb2N0ZXRzXG4gIGxldCBzaXplID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZC5sZW5ndGg7IGkrKykge1xuICAgIGxldCBpZGVudCA9IGlkW2ldO1xuICAgIGZvciAoc2l6ZSsrOyBpZGVudCA+PSAweDgwOyBpZGVudCA+Pj0gNylcbiAgICAgIHNpemUrKztcbiAgfVxuXG4gIGNvbnN0IG9iamlkID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICBsZXQgb2Zmc2V0ID0gb2JqaWQubGVuZ3RoIC0gMTtcbiAgZm9yIChsZXQgaSA9IGlkLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgbGV0IGlkZW50ID0gaWRbaV07XG4gICAgb2JqaWRbb2Zmc2V0LS1dID0gaWRlbnQgJiAweDdmO1xuICAgIHdoaWxlICgoaWRlbnQgPj49IDcpID4gMClcbiAgICAgIG9iamlkW29mZnNldC0tXSA9IDB4ODAgfCAoaWRlbnQgJiAweDdmKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG9iamlkKTtcbn07XG5cbmZ1bmN0aW9uIHR3byhudW0pIHtcbiAgaWYgKG51bSA8IDEwKVxuICAgIHJldHVybiAnMCcgKyBudW07XG4gIGVsc2VcbiAgICByZXR1cm4gbnVtO1xufVxuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlVGltZSA9IGZ1bmN0aW9uIGVuY29kZVRpbWUodGltZSwgdGFnKSB7XG4gIGxldCBzdHI7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aW1lKTtcblxuICBpZiAodGFnID09PSAnZ2VudGltZScpIHtcbiAgICBzdHIgPSBbXG4gICAgICB0d28oZGF0ZS5nZXRVVENGdWxsWWVhcigpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ01vbnRoKCkgKyAxKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ0RhdGUoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENIb3VycygpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ01pbnV0ZXMoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENTZWNvbmRzKCkpLFxuICAgICAgJ1onXG4gICAgXS5qb2luKCcnKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICd1dGN0aW1lJykge1xuICAgIHN0ciA9IFtcbiAgICAgIHR3byhkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgJSAxMDApLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDRGF0ZSgpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ0hvdXJzKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTWludXRlcygpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ1NlY29uZHMoKSksXG4gICAgICAnWidcbiAgICBdLmpvaW4oJycpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ0VuY29kaW5nICcgKyB0YWcgKyAnIHRpbWUgaXMgbm90IHN1cHBvcnRlZCB5ZXQnKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9lbmNvZGVTdHIoc3RyLCAnb2N0c3RyJyk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlTnVsbCA9IGZ1bmN0aW9uIGVuY29kZU51bGwoKSB7XG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKCcnKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVJbnQgPSBmdW5jdGlvbiBlbmNvZGVJbnQobnVtLCB2YWx1ZXMpIHtcbiAgaWYgKHR5cGVvZiBudW0gPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCF2YWx1ZXMpXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignU3RyaW5nIGludCBvciBlbnVtIGdpdmVuLCBidXQgbm8gdmFsdWVzIG1hcCcpO1xuICAgIGlmICghdmFsdWVzLmhhc093blByb3BlcnR5KG51bSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdWYWx1ZXMgbWFwIGRvZXNuXFwndCBjb250YWluOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG51bSkpO1xuICAgIH1cbiAgICBudW0gPSB2YWx1ZXNbbnVtXTtcbiAgfVxuXG4gIC8vIEJpZ251bSwgYXNzdW1lIGJpZyBlbmRpYW5cbiAgaWYgKHR5cGVvZiBudW0gIT09ICdudW1iZXInICYmICFCdWZmZXIuaXNCdWZmZXIobnVtKSkge1xuICAgIGNvbnN0IG51bUFycmF5ID0gbnVtLnRvQXJyYXkoKTtcbiAgICBpZiAoIW51bS5zaWduICYmIG51bUFycmF5WzBdICYgMHg4MCkge1xuICAgICAgbnVtQXJyYXkudW5zaGlmdCgwKTtcbiAgICB9XG4gICAgbnVtID0gQnVmZmVyLmZyb20obnVtQXJyYXkpO1xuICB9XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihudW0pKSB7XG4gICAgbGV0IHNpemUgPSBudW0ubGVuZ3RoO1xuICAgIGlmIChudW0ubGVuZ3RoID09PSAwKVxuICAgICAgc2l6ZSsrO1xuXG4gICAgY29uc3Qgb3V0ID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICAgIG51bS5jb3B5KG91dCk7XG4gICAgaWYgKG51bS5sZW5ndGggPT09IDApXG4gICAgICBvdXRbMF0gPSAwO1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG91dCk7XG4gIH1cblxuICBpZiAobnVtIDwgMHg4MClcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihudW0pO1xuXG4gIGlmIChudW0gPCAweDEwMClcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbMCwgbnVtXSk7XG5cbiAgbGV0IHNpemUgPSAxO1xuICBmb3IgKGxldCBpID0gbnVtOyBpID49IDB4MTAwOyBpID4+PSA4KVxuICAgIHNpemUrKztcblxuICBjb25zdCBvdXQgPSBuZXcgQXJyYXkoc2l6ZSk7XG4gIGZvciAobGV0IGkgPSBvdXQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBvdXRbaV0gPSBudW0gJiAweGZmO1xuICAgIG51bSA+Pj0gODtcbiAgfVxuICBpZihvdXRbMF0gJiAweDgwKSB7XG4gICAgb3V0LnVuc2hpZnQoMCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihCdWZmZXIuZnJvbShvdXQpKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVCb29sID0gZnVuY3Rpb24gZW5jb2RlQm9vbCh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcih2YWx1ZSA/IDB4ZmYgOiAwKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl91c2UgPSBmdW5jdGlvbiB1c2UoZW50aXR5LCBvYmopIHtcbiAgaWYgKHR5cGVvZiBlbnRpdHkgPT09ICdmdW5jdGlvbicpXG4gICAgZW50aXR5ID0gZW50aXR5KG9iaik7XG4gIHJldHVybiBlbnRpdHkuX2dldEVuY29kZXIoJ2RlcicpLnRyZWU7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fc2tpcERlZmF1bHQgPSBmdW5jdGlvbiBza2lwRGVmYXVsdChkYXRhQnVmZmVyLCByZXBvcnRlciwgcGFyZW50KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBsZXQgaTtcbiAgaWYgKHN0YXRlWydkZWZhdWx0J10gPT09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGRhdGEgPSBkYXRhQnVmZmVyLmpvaW4oKTtcbiAgaWYgKHN0YXRlLmRlZmF1bHRCdWZmZXIgPT09IHVuZGVmaW5lZClcbiAgICBzdGF0ZS5kZWZhdWx0QnVmZmVyID0gdGhpcy5fZW5jb2RlVmFsdWUoc3RhdGVbJ2RlZmF1bHQnXSwgcmVwb3J0ZXIsIHBhcmVudCkuam9pbigpO1xuXG4gIGlmIChkYXRhLmxlbmd0aCAhPT0gc3RhdGUuZGVmYXVsdEJ1ZmZlci5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGZvciAoaT0wOyBpIDwgZGF0YS5sZW5ndGg7IGkrKylcbiAgICBpZiAoZGF0YVtpXSAhPT0gc3RhdGUuZGVmYXVsdEJ1ZmZlcltpXSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIFV0aWxpdHkgbWV0aG9kc1xuXG5mdW5jdGlvbiBlbmNvZGVUYWcodGFnLCBwcmltaXRpdmUsIGNscywgcmVwb3J0ZXIpIHtcbiAgbGV0IHJlcztcblxuICBpZiAodGFnID09PSAnc2Vxb2YnKVxuICAgIHRhZyA9ICdzZXEnO1xuICBlbHNlIGlmICh0YWcgPT09ICdzZXRvZicpXG4gICAgdGFnID0gJ3NldCc7XG5cbiAgaWYgKGRlci50YWdCeU5hbWUuaGFzT3duUHJvcGVydHkodGFnKSlcbiAgICByZXMgPSBkZXIudGFnQnlOYW1lW3RhZ107XG4gIGVsc2UgaWYgKHR5cGVvZiB0YWcgPT09ICdudW1iZXInICYmICh0YWcgfCAwKSA9PT0gdGFnKVxuICAgIHJlcyA9IHRhZztcbiAgZWxzZVxuICAgIHJldHVybiByZXBvcnRlci5lcnJvcignVW5rbm93biB0YWc6ICcgKyB0YWcpO1xuXG4gIGlmIChyZXMgPj0gMHgxZilcbiAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ011bHRpLW9jdGV0IHRhZyBlbmNvZGluZyB1bnN1cHBvcnRlZCcpO1xuXG4gIGlmICghcHJpbWl0aXZlKVxuICAgIHJlcyB8PSAweDIwO1xuXG4gIHJlcyB8PSAoZGVyLnRhZ0NsYXNzQnlOYW1lW2NscyB8fCAndW5pdmVyc2FsJ10gPDwgNik7XG5cbiAgcmV0dXJuIHJlcztcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmNvbnN0IERFUkVuY29kZXIgPSByZXF1aXJlKCcuL2RlcicpO1xuXG5mdW5jdGlvbiBQRU1FbmNvZGVyKGVudGl0eSkge1xuICBERVJFbmNvZGVyLmNhbGwodGhpcywgZW50aXR5KTtcbiAgdGhpcy5lbmMgPSAncGVtJztcbn1cbmluaGVyaXRzKFBFTUVuY29kZXIsIERFUkVuY29kZXIpO1xubW9kdWxlLmV4cG9ydHMgPSBQRU1FbmNvZGVyO1xuXG5QRU1FbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgb3B0aW9ucykge1xuICBjb25zdCBidWYgPSBERVJFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUuY2FsbCh0aGlzLCBkYXRhKTtcblxuICBjb25zdCBwID0gYnVmLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgY29uc3Qgb3V0ID0gWyAnLS0tLS1CRUdJTiAnICsgb3B0aW9ucy5sYWJlbCArICctLS0tLScgXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwLmxlbmd0aDsgaSArPSA2NClcbiAgICBvdXQucHVzaChwLnNsaWNlKGksIGkgKyA2NCkpO1xuICBvdXQucHVzaCgnLS0tLS1FTkQgJyArIG9wdGlvbnMubGFiZWwgKyAnLS0tLS0nKTtcbiAgcmV0dXJuIG91dC5qb2luKCdcXG4nKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZW5jb2RlcnMgPSBleHBvcnRzO1xuXG5lbmNvZGVycy5kZXIgPSByZXF1aXJlKCcuL2RlcicpO1xuZW5jb2RlcnMucGVtID0gcmVxdWlyZSgnLi9wZW0nKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmNvbnN0IGJpZ251bSA9IHJlcXVpcmUoJ2JuLmpzJyk7XG5jb25zdCBEZWNvZGVyQnVmZmVyID0gcmVxdWlyZSgnLi4vYmFzZS9idWZmZXInKS5EZWNvZGVyQnVmZmVyO1xuY29uc3QgTm9kZSA9IHJlcXVpcmUoJy4uL2Jhc2Uvbm9kZScpO1xuXG4vLyBJbXBvcnQgREVSIGNvbnN0YW50c1xuY29uc3QgZGVyID0gcmVxdWlyZSgnLi4vY29uc3RhbnRzL2RlcicpO1xuXG5mdW5jdGlvbiBERVJEZWNvZGVyKGVudGl0eSkge1xuICB0aGlzLmVuYyA9ICdkZXInO1xuICB0aGlzLm5hbWUgPSBlbnRpdHkubmFtZTtcbiAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG5cbiAgLy8gQ29uc3RydWN0IGJhc2UgdHJlZVxuICB0aGlzLnRyZWUgPSBuZXcgREVSTm9kZSgpO1xuICB0aGlzLnRyZWUuX2luaXQoZW50aXR5LmJvZHkpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBERVJEZWNvZGVyO1xuXG5ERVJEZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoZGF0YSwgb3B0aW9ucykge1xuICBpZiAoIURlY29kZXJCdWZmZXIuaXNEZWNvZGVyQnVmZmVyKGRhdGEpKSB7XG4gICAgZGF0YSA9IG5ldyBEZWNvZGVyQnVmZmVyKGRhdGEsIG9wdGlvbnMpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMudHJlZS5fZGVjb2RlKGRhdGEsIG9wdGlvbnMpO1xufTtcblxuLy8gVHJlZSBtZXRob2RzXG5cbmZ1bmN0aW9uIERFUk5vZGUocGFyZW50KSB7XG4gIE5vZGUuY2FsbCh0aGlzLCAnZGVyJywgcGFyZW50KTtcbn1cbmluaGVyaXRzKERFUk5vZGUsIE5vZGUpO1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fcGVla1RhZyA9IGZ1bmN0aW9uIHBlZWtUYWcoYnVmZmVyLCB0YWcsIGFueSkge1xuICBpZiAoYnVmZmVyLmlzRW1wdHkoKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3Qgc3RhdGUgPSBidWZmZXIuc2F2ZSgpO1xuICBjb25zdCBkZWNvZGVkVGFnID0gZGVyRGVjb2RlVGFnKGJ1ZmZlciwgJ0ZhaWxlZCB0byBwZWVrIHRhZzogXCInICsgdGFnICsgJ1wiJyk7XG4gIGlmIChidWZmZXIuaXNFcnJvcihkZWNvZGVkVGFnKSlcbiAgICByZXR1cm4gZGVjb2RlZFRhZztcblxuICBidWZmZXIucmVzdG9yZShzdGF0ZSk7XG5cbiAgcmV0dXJuIGRlY29kZWRUYWcudGFnID09PSB0YWcgfHwgZGVjb2RlZFRhZy50YWdTdHIgPT09IHRhZyB8fFxuICAgIChkZWNvZGVkVGFnLnRhZ1N0ciArICdvZicpID09PSB0YWcgfHwgYW55O1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZVRhZyA9IGZ1bmN0aW9uIGRlY29kZVRhZyhidWZmZXIsIHRhZywgYW55KSB7XG4gIGNvbnN0IGRlY29kZWRUYWcgPSBkZXJEZWNvZGVUYWcoYnVmZmVyLFxuICAgICdGYWlsZWQgdG8gZGVjb2RlIHRhZyBvZiBcIicgKyB0YWcgKyAnXCInKTtcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKGRlY29kZWRUYWcpKVxuICAgIHJldHVybiBkZWNvZGVkVGFnO1xuXG4gIGxldCBsZW4gPSBkZXJEZWNvZGVMZW4oYnVmZmVyLFxuICAgIGRlY29kZWRUYWcucHJpbWl0aXZlLFxuICAgICdGYWlsZWQgdG8gZ2V0IGxlbmd0aCBvZiBcIicgKyB0YWcgKyAnXCInKTtcblxuICAvLyBGYWlsdXJlXG4gIGlmIChidWZmZXIuaXNFcnJvcihsZW4pKVxuICAgIHJldHVybiBsZW47XG5cbiAgaWYgKCFhbnkgJiZcbiAgICAgIGRlY29kZWRUYWcudGFnICE9PSB0YWcgJiZcbiAgICAgIGRlY29kZWRUYWcudGFnU3RyICE9PSB0YWcgJiZcbiAgICAgIGRlY29kZWRUYWcudGFnU3RyICsgJ29mJyAhPT0gdGFnKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRmFpbGVkIHRvIG1hdGNoIHRhZzogXCInICsgdGFnICsgJ1wiJyk7XG4gIH1cblxuICBpZiAoZGVjb2RlZFRhZy5wcmltaXRpdmUgfHwgbGVuICE9PSBudWxsKVxuICAgIHJldHVybiBidWZmZXIuc2tpcChsZW4sICdGYWlsZWQgdG8gbWF0Y2ggYm9keSBvZjogXCInICsgdGFnICsgJ1wiJyk7XG5cbiAgLy8gSW5kZWZpbml0ZSBsZW5ndGguLi4gZmluZCBFTkQgdGFnXG4gIGNvbnN0IHN0YXRlID0gYnVmZmVyLnNhdmUoKTtcbiAgY29uc3QgcmVzID0gdGhpcy5fc2tpcFVudGlsRW5kKFxuICAgIGJ1ZmZlcixcbiAgICAnRmFpbGVkIHRvIHNraXAgaW5kZWZpbml0ZSBsZW5ndGggYm9keTogXCInICsgdGhpcy50YWcgKyAnXCInKTtcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKHJlcykpXG4gICAgcmV0dXJuIHJlcztcblxuICBsZW4gPSBidWZmZXIub2Zmc2V0IC0gc3RhdGUub2Zmc2V0O1xuICBidWZmZXIucmVzdG9yZShzdGF0ZSk7XG4gIHJldHVybiBidWZmZXIuc2tpcChsZW4sICdGYWlsZWQgdG8gbWF0Y2ggYm9keSBvZjogXCInICsgdGFnICsgJ1wiJyk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fc2tpcFVudGlsRW5kID0gZnVuY3Rpb24gc2tpcFVudGlsRW5kKGJ1ZmZlciwgZmFpbCkge1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgdGFnID0gZGVyRGVjb2RlVGFnKGJ1ZmZlciwgZmFpbCk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKHRhZykpXG4gICAgICByZXR1cm4gdGFnO1xuICAgIGNvbnN0IGxlbiA9IGRlckRlY29kZUxlbihidWZmZXIsIHRhZy5wcmltaXRpdmUsIGZhaWwpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcihsZW4pKVxuICAgICAgcmV0dXJuIGxlbjtcblxuICAgIGxldCByZXM7XG4gICAgaWYgKHRhZy5wcmltaXRpdmUgfHwgbGVuICE9PSBudWxsKVxuICAgICAgcmVzID0gYnVmZmVyLnNraXAobGVuKTtcbiAgICBlbHNlXG4gICAgICByZXMgPSB0aGlzLl9za2lwVW50aWxFbmQoYnVmZmVyLCBmYWlsKTtcblxuICAgIC8vIEZhaWx1cmVcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IocmVzKSlcbiAgICAgIHJldHVybiByZXM7XG5cbiAgICBpZiAodGFnLnRhZ1N0ciA9PT0gJ2VuZCcpXG4gICAgICBicmVhaztcbiAgfVxufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZUxpc3QgPSBmdW5jdGlvbiBkZWNvZGVMaXN0KGJ1ZmZlciwgdGFnLCBkZWNvZGVyLFxuICBvcHRpb25zKSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICB3aGlsZSAoIWJ1ZmZlci5pc0VtcHR5KCkpIHtcbiAgICBjb25zdCBwb3NzaWJsZUVuZCA9IHRoaXMuX3BlZWtUYWcoYnVmZmVyLCAnZW5kJyk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKHBvc3NpYmxlRW5kKSlcbiAgICAgIHJldHVybiBwb3NzaWJsZUVuZDtcblxuICAgIGNvbnN0IHJlcyA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlciwgJ2RlcicsIG9wdGlvbnMpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcihyZXMpICYmIHBvc3NpYmxlRW5kKVxuICAgICAgYnJlYWs7XG4gICAgcmVzdWx0LnB1c2gocmVzKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZVN0ciA9IGZ1bmN0aW9uIGRlY29kZVN0cihidWZmZXIsIHRhZykge1xuICBpZiAodGFnID09PSAnYml0c3RyJykge1xuICAgIGNvbnN0IHVudXNlZCA9IGJ1ZmZlci5yZWFkVUludDgoKTtcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IodW51c2VkKSlcbiAgICAgIHJldHVybiB1bnVzZWQ7XG4gICAgcmV0dXJuIHsgdW51c2VkOiB1bnVzZWQsIGRhdGE6IGJ1ZmZlci5yYXcoKSB9O1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ2JtcHN0cicpIHtcbiAgICBjb25zdCByYXcgPSBidWZmZXIucmF3KCk7XG4gICAgaWYgKHJhdy5sZW5ndGggJSAyID09PSAxKVxuICAgICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IGJtcHN0ciBsZW5ndGggbWlzbWF0Y2gnKTtcblxuICAgIGxldCBzdHIgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhdy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHJhdy5yZWFkVUludDE2QkUoaSAqIDIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdudW1zdHInKSB7XG4gICAgY29uc3QgbnVtc3RyID0gYnVmZmVyLnJhdygpLnRvU3RyaW5nKCdhc2NpaScpO1xuICAgIGlmICghdGhpcy5faXNOdW1zdHIobnVtc3RyKSkge1xuICAgICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnbnVtc3RyIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnMnKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bXN0cjtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdvY3RzdHInKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5yYXcoKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdvYmpEZXNjJykge1xuICAgIHJldHVybiBidWZmZXIucmF3KCk7XG4gIH0gZWxzZSBpZiAodGFnID09PSAncHJpbnRzdHInKSB7XG4gICAgY29uc3QgcHJpbnRzdHIgPSBidWZmZXIucmF3KCkudG9TdHJpbmcoJ2FzY2lpJyk7XG4gICAgaWYgKCF0aGlzLl9pc1ByaW50c3RyKHByaW50c3RyKSkge1xuICAgICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAncHJpbnRzdHIgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgICByZXR1cm4gcHJpbnRzdHI7XG4gIH0gZWxzZSBpZiAoL3N0ciQvLnRlc3QodGFnKSkge1xuICAgIHJldHVybiBidWZmZXIucmF3KCkudG9TdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArIHRhZyArICcgdW5zdXBwb3J0ZWQnKTtcbiAgfVxufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZU9iamlkID0gZnVuY3Rpb24gZGVjb2RlT2JqaWQoYnVmZmVyLCB2YWx1ZXMsIHJlbGF0aXZlKSB7XG4gIGxldCByZXN1bHQ7XG4gIGNvbnN0IGlkZW50aWZpZXJzID0gW107XG4gIGxldCBpZGVudCA9IDA7XG4gIGxldCBzdWJpZGVudCA9IDA7XG4gIHdoaWxlICghYnVmZmVyLmlzRW1wdHkoKSkge1xuICAgIHN1YmlkZW50ID0gYnVmZmVyLnJlYWRVSW50OCgpO1xuICAgIGlkZW50IDw8PSA3O1xuICAgIGlkZW50IHw9IHN1YmlkZW50ICYgMHg3ZjtcbiAgICBpZiAoKHN1YmlkZW50ICYgMHg4MCkgPT09IDApIHtcbiAgICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnQpO1xuICAgICAgaWRlbnQgPSAwO1xuICAgIH1cbiAgfVxuICBpZiAoc3ViaWRlbnQgJiAweDgwKVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnQpO1xuXG4gIGNvbnN0IGZpcnN0ID0gKGlkZW50aWZpZXJzWzBdIC8gNDApIHwgMDtcbiAgY29uc3Qgc2Vjb25kID0gaWRlbnRpZmllcnNbMF0gJSA0MDtcblxuICBpZiAocmVsYXRpdmUpXG4gICAgcmVzdWx0ID0gaWRlbnRpZmllcnM7XG4gIGVsc2VcbiAgICByZXN1bHQgPSBbZmlyc3QsIHNlY29uZF0uY29uY2F0KGlkZW50aWZpZXJzLnNsaWNlKDEpKTtcblxuICBpZiAodmFsdWVzKSB7XG4gICAgbGV0IHRtcCA9IHZhbHVlc1tyZXN1bHQuam9pbignICcpXTtcbiAgICBpZiAodG1wID09PSB1bmRlZmluZWQpXG4gICAgICB0bXAgPSB2YWx1ZXNbcmVzdWx0LmpvaW4oJy4nKV07XG4gICAgaWYgKHRtcCAhPT0gdW5kZWZpbmVkKVxuICAgICAgcmVzdWx0ID0gdG1wO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVUaW1lID0gZnVuY3Rpb24gZGVjb2RlVGltZShidWZmZXIsIHRhZykge1xuICBjb25zdCBzdHIgPSBidWZmZXIucmF3KCkudG9TdHJpbmcoKTtcblxuICBsZXQgeWVhcjtcbiAgbGV0IG1vbjtcbiAgbGV0IGRheTtcbiAgbGV0IGhvdXI7XG4gIGxldCBtaW47XG4gIGxldCBzZWM7XG4gIGlmICh0YWcgPT09ICdnZW50aW1lJykge1xuICAgIHllYXIgPSBzdHIuc2xpY2UoMCwgNCkgfCAwO1xuICAgIG1vbiA9IHN0ci5zbGljZSg0LCA2KSB8IDA7XG4gICAgZGF5ID0gc3RyLnNsaWNlKDYsIDgpIHwgMDtcbiAgICBob3VyID0gc3RyLnNsaWNlKDgsIDEwKSB8IDA7XG4gICAgbWluID0gc3RyLnNsaWNlKDEwLCAxMikgfCAwO1xuICAgIHNlYyA9IHN0ci5zbGljZSgxMiwgMTQpIHwgMDtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICd1dGN0aW1lJykge1xuICAgIHllYXIgPSBzdHIuc2xpY2UoMCwgMikgfCAwO1xuICAgIG1vbiA9IHN0ci5zbGljZSgyLCA0KSB8IDA7XG4gICAgZGF5ID0gc3RyLnNsaWNlKDQsIDYpIHwgMDtcbiAgICBob3VyID0gc3RyLnNsaWNlKDYsIDgpIHwgMDtcbiAgICBtaW4gPSBzdHIuc2xpY2UoOCwgMTApIHwgMDtcbiAgICBzZWMgPSBzdHIuc2xpY2UoMTAsIDEyKSB8IDA7XG4gICAgaWYgKHllYXIgPCA3MClcbiAgICAgIHllYXIgPSAyMDAwICsgeWVhcjtcbiAgICBlbHNlXG4gICAgICB5ZWFyID0gMTkwMCArIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2RpbmcgJyArIHRhZyArICcgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldCcpO1xuICB9XG5cbiAgcmV0dXJuIERhdGUuVVRDKHllYXIsIG1vbiAtIDEsIGRheSwgaG91ciwgbWluLCBzZWMsIDApO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZU51bGwgPSBmdW5jdGlvbiBkZWNvZGVOdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVCb29sID0gZnVuY3Rpb24gZGVjb2RlQm9vbChidWZmZXIpIHtcbiAgY29uc3QgcmVzID0gYnVmZmVyLnJlYWRVSW50OCgpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IocmVzKSlcbiAgICByZXR1cm4gcmVzO1xuICBlbHNlXG4gICAgcmV0dXJuIHJlcyAhPT0gMDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVJbnQgPSBmdW5jdGlvbiBkZWNvZGVJbnQoYnVmZmVyLCB2YWx1ZXMpIHtcbiAgLy8gQmlnaW50LCByZXR1cm4gYXMgaXQgaXMgKGFzc3VtZSBiaWcgZW5kaWFuKVxuICBjb25zdCByYXcgPSBidWZmZXIucmF3KCk7XG4gIGxldCByZXMgPSBuZXcgYmlnbnVtKHJhdyk7XG5cbiAgaWYgKHZhbHVlcylcbiAgICByZXMgPSB2YWx1ZXNbcmVzLnRvU3RyaW5nKDEwKV0gfHwgcmVzO1xuXG4gIHJldHVybiByZXM7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fdXNlID0gZnVuY3Rpb24gdXNlKGVudGl0eSwgb2JqKSB7XG4gIGlmICh0eXBlb2YgZW50aXR5ID09PSAnZnVuY3Rpb24nKVxuICAgIGVudGl0eSA9IGVudGl0eShvYmopO1xuICByZXR1cm4gZW50aXR5Ll9nZXREZWNvZGVyKCdkZXInKS50cmVlO1xufTtcblxuLy8gVXRpbGl0eSBtZXRob2RzXG5cbmZ1bmN0aW9uIGRlckRlY29kZVRhZyhidWYsIGZhaWwpIHtcbiAgbGV0IHRhZyA9IGJ1Zi5yZWFkVUludDgoZmFpbCk7XG4gIGlmIChidWYuaXNFcnJvcih0YWcpKVxuICAgIHJldHVybiB0YWc7XG5cbiAgY29uc3QgY2xzID0gZGVyLnRhZ0NsYXNzW3RhZyA+PiA2XTtcbiAgY29uc3QgcHJpbWl0aXZlID0gKHRhZyAmIDB4MjApID09PSAwO1xuXG4gIC8vIE11bHRpLW9jdGV0IHRhZyAtIGxvYWRcbiAgaWYgKCh0YWcgJiAweDFmKSA9PT0gMHgxZikge1xuICAgIGxldCBvY3QgPSB0YWc7XG4gICAgdGFnID0gMDtcbiAgICB3aGlsZSAoKG9jdCAmIDB4ODApID09PSAweDgwKSB7XG4gICAgICBvY3QgPSBidWYucmVhZFVJbnQ4KGZhaWwpO1xuICAgICAgaWYgKGJ1Zi5pc0Vycm9yKG9jdCkpXG4gICAgICAgIHJldHVybiBvY3Q7XG5cbiAgICAgIHRhZyA8PD0gNztcbiAgICAgIHRhZyB8PSBvY3QgJiAweDdmO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0YWcgJj0gMHgxZjtcbiAgfVxuICBjb25zdCB0YWdTdHIgPSBkZXIudGFnW3RhZ107XG5cbiAgcmV0dXJuIHtcbiAgICBjbHM6IGNscyxcbiAgICBwcmltaXRpdmU6IHByaW1pdGl2ZSxcbiAgICB0YWc6IHRhZyxcbiAgICB0YWdTdHI6IHRhZ1N0clxuICB9O1xufVxuXG5mdW5jdGlvbiBkZXJEZWNvZGVMZW4oYnVmLCBwcmltaXRpdmUsIGZhaWwpIHtcbiAgbGV0IGxlbiA9IGJ1Zi5yZWFkVUludDgoZmFpbCk7XG4gIGlmIChidWYuaXNFcnJvcihsZW4pKVxuICAgIHJldHVybiBsZW47XG5cbiAgLy8gSW5kZWZpbml0ZSBmb3JtXG4gIGlmICghcHJpbWl0aXZlICYmIGxlbiA9PT0gMHg4MClcbiAgICByZXR1cm4gbnVsbDtcblxuICAvLyBEZWZpbml0ZSBmb3JtXG4gIGlmICgobGVuICYgMHg4MCkgPT09IDApIHtcbiAgICAvLyBTaG9ydCBmb3JtXG4gICAgcmV0dXJuIGxlbjtcbiAgfVxuXG4gIC8vIExvbmcgZm9ybVxuICBjb25zdCBudW0gPSBsZW4gJiAweDdmO1xuICBpZiAobnVtID4gNClcbiAgICByZXR1cm4gYnVmLmVycm9yKCdsZW5ndGggb2N0ZWN0IGlzIHRvbyBsb25nJyk7XG5cbiAgbGVuID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW07IGkrKykge1xuICAgIGxlbiA8PD0gODtcbiAgICBjb25zdCBqID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgICBpZiAoYnVmLmlzRXJyb3IoaikpXG4gICAgICByZXR1cm4gajtcbiAgICBsZW4gfD0gajtcbiAgfVxuXG4gIHJldHVybiBsZW47XG59XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuY29uc3QgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xuXG5jb25zdCBERVJEZWNvZGVyID0gcmVxdWlyZSgnLi9kZXInKTtcblxuZnVuY3Rpb24gUEVNRGVjb2RlcihlbnRpdHkpIHtcbiAgREVSRGVjb2Rlci5jYWxsKHRoaXMsIGVudGl0eSk7XG4gIHRoaXMuZW5jID0gJ3BlbSc7XG59XG5pbmhlcml0cyhQRU1EZWNvZGVyLCBERVJEZWNvZGVyKTtcbm1vZHVsZS5leHBvcnRzID0gUEVNRGVjb2RlcjtcblxuUEVNRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGRhdGEsIG9wdGlvbnMpIHtcbiAgY29uc3QgbGluZXMgPSBkYXRhLnRvU3RyaW5nKCkuc3BsaXQoL1tcXHJcXG5dKy9nKTtcblxuICBjb25zdCBsYWJlbCA9IG9wdGlvbnMubGFiZWwudG9VcHBlckNhc2UoKTtcblxuICBjb25zdCByZSA9IC9eLS0tLS0oQkVHSU58RU5EKSAoW14tXSspLS0tLS0kLztcbiAgbGV0IHN0YXJ0ID0gLTE7XG4gIGxldCBlbmQgPSAtMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG1hdGNoID0gbGluZXNbaV0ubWF0Y2gocmUpO1xuICAgIGlmIChtYXRjaCA9PT0gbnVsbClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgaWYgKG1hdGNoWzJdICE9PSBsYWJlbClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgaWYgKHN0YXJ0ID09PSAtMSkge1xuICAgICAgaWYgKG1hdGNoWzFdICE9PSAnQkVHSU4nKVxuICAgICAgICBicmVhaztcbiAgICAgIHN0YXJ0ID0gaTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1hdGNoWzFdICE9PSAnRU5EJylcbiAgICAgICAgYnJlYWs7XG4gICAgICBlbmQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChzdGFydCA9PT0gLTEgfHwgZW5kID09PSAtMSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BFTSBzZWN0aW9uIG5vdCBmb3VuZCBmb3I6ICcgKyBsYWJlbCk7XG5cbiAgY29uc3QgYmFzZTY0ID0gbGluZXMuc2xpY2Uoc3RhcnQgKyAxLCBlbmQpLmpvaW4oJycpO1xuICAvLyBSZW1vdmUgZXhjZXNzaXZlIHN5bWJvbHNcbiAgYmFzZTY0LnJlcGxhY2UoL1teYS16MC05Ky89XSsvZ2ksICcnKTtcblxuICBjb25zdCBpbnB1dCA9IEJ1ZmZlci5mcm9tKGJhc2U2NCwgJ2Jhc2U2NCcpO1xuICByZXR1cm4gREVSRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlLmNhbGwodGhpcywgaW5wdXQsIG9wdGlvbnMpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBkZWNvZGVycyA9IGV4cG9ydHM7XG5cbmRlY29kZXJzLmRlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG5kZWNvZGVycy5wZW0gPSByZXF1aXJlKCcuL3BlbScpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGVuY29kZXJzID0gcmVxdWlyZSgnLi9lbmNvZGVycycpO1xuY29uc3QgZGVjb2RlcnMgPSByZXF1aXJlKCcuL2RlY29kZXJzJyk7XG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmNvbnN0IGFwaSA9IGV4cG9ydHM7XG5cbmFwaS5kZWZpbmUgPSBmdW5jdGlvbiBkZWZpbmUobmFtZSwgYm9keSkge1xuICByZXR1cm4gbmV3IEVudGl0eShuYW1lLCBib2R5KTtcbn07XG5cbmZ1bmN0aW9uIEVudGl0eShuYW1lLCBib2R5KSB7XG4gIHRoaXMubmFtZSA9IG5hbWU7XG4gIHRoaXMuYm9keSA9IGJvZHk7XG5cbiAgdGhpcy5kZWNvZGVycyA9IHt9O1xuICB0aGlzLmVuY29kZXJzID0ge307XG59XG5cbkVudGl0eS5wcm90b3R5cGUuX2NyZWF0ZU5hbWVkID0gZnVuY3Rpb24gY3JlYXRlTmFtZWQoQmFzZSkge1xuICBjb25zdCBuYW1lID0gdGhpcy5uYW1lO1xuXG4gIGZ1bmN0aW9uIEdlbmVyYXRlZChlbnRpdHkpIHtcbiAgICB0aGlzLl9pbml0TmFtZWQoZW50aXR5LCBuYW1lKTtcbiAgfVxuICBpbmhlcml0cyhHZW5lcmF0ZWQsIEJhc2UpO1xuICBHZW5lcmF0ZWQucHJvdG90eXBlLl9pbml0TmFtZWQgPSBmdW5jdGlvbiBfaW5pdE5hbWVkKGVudGl0eSwgbmFtZSkge1xuICAgIEJhc2UuY2FsbCh0aGlzLCBlbnRpdHksIG5hbWUpO1xuICB9O1xuXG4gIHJldHVybiBuZXcgR2VuZXJhdGVkKHRoaXMpO1xufTtcblxuRW50aXR5LnByb3RvdHlwZS5fZ2V0RGVjb2RlciA9IGZ1bmN0aW9uIF9nZXREZWNvZGVyKGVuYykge1xuICBlbmMgPSBlbmMgfHwgJ2Rlcic7XG4gIC8vIExhemlseSBjcmVhdGUgZGVjb2RlclxuICBpZiAoIXRoaXMuZGVjb2RlcnMuaGFzT3duUHJvcGVydHkoZW5jKSlcbiAgICB0aGlzLmRlY29kZXJzW2VuY10gPSB0aGlzLl9jcmVhdGVOYW1lZChkZWNvZGVyc1tlbmNdKTtcbiAgcmV0dXJuIHRoaXMuZGVjb2RlcnNbZW5jXTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGRhdGEsIGVuYywgb3B0aW9ucykge1xuICByZXR1cm4gdGhpcy5fZ2V0RGVjb2RlcihlbmMpLmRlY29kZShkYXRhLCBvcHRpb25zKTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuX2dldEVuY29kZXIgPSBmdW5jdGlvbiBfZ2V0RW5jb2RlcihlbmMpIHtcbiAgZW5jID0gZW5jIHx8ICdkZXInO1xuICAvLyBMYXppbHkgY3JlYXRlIGVuY29kZXJcbiAgaWYgKCF0aGlzLmVuY29kZXJzLmhhc093blByb3BlcnR5KGVuYykpXG4gICAgdGhpcy5lbmNvZGVyc1tlbmNdID0gdGhpcy5fY3JlYXRlTmFtZWQoZW5jb2RlcnNbZW5jXSk7XG4gIHJldHVybiB0aGlzLmVuY29kZXJzW2VuY107XG59O1xuXG5FbnRpdHkucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCBlbmMsIC8qIGludGVybmFsICovIHJlcG9ydGVyKSB7XG4gIHJldHVybiB0aGlzLl9nZXRFbmNvZGVyKGVuYykuZW5jb2RlKGRhdGEsIHJlcG9ydGVyKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgYmFzZSA9IGV4cG9ydHM7XG5cbmJhc2UuUmVwb3J0ZXIgPSByZXF1aXJlKCcuL3JlcG9ydGVyJykuUmVwb3J0ZXI7XG5iYXNlLkRlY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuL2J1ZmZlcicpLkRlY29kZXJCdWZmZXI7XG5iYXNlLkVuY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuL2J1ZmZlcicpLkVuY29kZXJCdWZmZXI7XG5iYXNlLk5vZGUgPSByZXF1aXJlKCcuL25vZGUnKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBjb25zdGFudHMgPSBleHBvcnRzO1xuXG4vLyBIZWxwZXJcbmNvbnN0YW50cy5fcmV2ZXJzZSA9IGZ1bmN0aW9uIHJldmVyc2UobWFwKSB7XG4gIGNvbnN0IHJlcyA9IHt9O1xuXG4gIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAvLyBDb252ZXJ0IGtleSB0byBpbnRlZ2VyIGlmIGl0IGlzIHN0cmluZ2lmaWVkXG4gICAgaWYgKChrZXkgfCAwKSA9PSBrZXkpXG4gICAgICBrZXkgPSBrZXkgfCAwO1xuXG4gICAgY29uc3QgdmFsdWUgPSBtYXBba2V5XTtcbiAgICByZXNbdmFsdWVdID0ga2V5O1xuICB9KTtcblxuICByZXR1cm4gcmVzO1xufTtcblxuY29uc3RhbnRzLmRlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgYXNuMSA9IGV4cG9ydHM7XG5cbmFzbjEuYmlnbnVtID0gcmVxdWlyZSgnYm4uanMnKTtcblxuYXNuMS5kZWZpbmUgPSByZXF1aXJlKCcuL2FzbjEvYXBpJykuZGVmaW5lO1xuYXNuMS5iYXNlID0gcmVxdWlyZSgnLi9hc24xL2Jhc2UnKTtcbmFzbjEuY29uc3RhbnRzID0gcmVxdWlyZSgnLi9hc24xL2NvbnN0YW50cycpO1xuYXNuMS5kZWNvZGVycyA9IHJlcXVpcmUoJy4vYXNuMS9kZWNvZGVycycpO1xuYXNuMS5lbmNvZGVycyA9IHJlcXVpcmUoJy4vYXNuMS9lbmNvZGVycycpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IGV4cG9ydHM7XG5cbmZ1bmN0aW9uIHRvQXJyYXkobXNnLCBlbmMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobXNnKSlcbiAgICByZXR1cm4gbXNnLnNsaWNlKCk7XG4gIGlmICghbXNnKVxuICAgIHJldHVybiBbXTtcbiAgdmFyIHJlcyA9IFtdO1xuICBpZiAodHlwZW9mIG1zZyAhPT0gJ3N0cmluZycpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKylcbiAgICAgIHJlc1tpXSA9IG1zZ1tpXSB8IDA7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBpZiAoZW5jID09PSAnaGV4Jykge1xuICAgIG1zZyA9IG1zZy5yZXBsYWNlKC9bXmEtejAtOV0rL2lnLCAnJyk7XG4gICAgaWYgKG1zZy5sZW5ndGggJSAyICE9PSAwKVxuICAgICAgbXNnID0gJzAnICsgbXNnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSAyKVxuICAgICAgcmVzLnB1c2gocGFyc2VJbnQobXNnW2ldICsgbXNnW2kgKyAxXSwgMTYpKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGMgPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICAgIHZhciBoaSA9IGMgPj4gODtcbiAgICAgIHZhciBsbyA9IGMgJiAweGZmO1xuICAgICAgaWYgKGhpKVxuICAgICAgICByZXMucHVzaChoaSwgbG8pO1xuICAgICAgZWxzZVxuICAgICAgICByZXMucHVzaChsbyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG51dGlscy50b0FycmF5ID0gdG9BcnJheTtcblxuZnVuY3Rpb24gemVybzIod29yZCkge1xuICBpZiAod29yZC5sZW5ndGggPT09IDEpXG4gICAgcmV0dXJuICcwJyArIHdvcmQ7XG4gIGVsc2VcbiAgICByZXR1cm4gd29yZDtcbn1cbnV0aWxzLnplcm8yID0gemVybzI7XG5cbmZ1bmN0aW9uIHRvSGV4KG1zZykge1xuICB2YXIgcmVzID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgIHJlcyArPSB6ZXJvMihtc2dbaV0udG9TdHJpbmcoMTYpKTtcbiAgcmV0dXJuIHJlcztcbn1cbnV0aWxzLnRvSGV4ID0gdG9IZXg7XG5cbnV0aWxzLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShhcnIsIGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdG9IZXgoYXJyKTtcbiAgZWxzZVxuICAgIHJldHVybiBhcnI7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IGV4cG9ydHM7XG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIG1pbkFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcbnZhciBtaW5VdGlscyA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1jcnlwdG8tdXRpbHMnKTtcblxudXRpbHMuYXNzZXJ0ID0gbWluQXNzZXJ0O1xudXRpbHMudG9BcnJheSA9IG1pblV0aWxzLnRvQXJyYXk7XG51dGlscy56ZXJvMiA9IG1pblV0aWxzLnplcm8yO1xudXRpbHMudG9IZXggPSBtaW5VdGlscy50b0hleDtcbnV0aWxzLmVuY29kZSA9IG1pblV0aWxzLmVuY29kZTtcblxuLy8gUmVwcmVzZW50IG51bSBpbiBhIHctTkFGIGZvcm1cbmZ1bmN0aW9uIGdldE5BRihudW0sIHcsIGJpdHMpIHtcbiAgdmFyIG5hZiA9IG5ldyBBcnJheShNYXRoLm1heChudW0uYml0TGVuZ3RoKCksIGJpdHMpICsgMSk7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgbmFmLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgbmFmW2ldID0gMDtcbiAgfVxuXG4gIHZhciB3cyA9IDEgPDwgKHcgKyAxKTtcbiAgdmFyIGsgPSBudW0uY2xvbmUoKTtcblxuICBmb3IgKGkgPSAwOyBpIDwgbmFmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHo7XG4gICAgdmFyIG1vZCA9IGsuYW5kbG4od3MgLSAxKTtcbiAgICBpZiAoay5pc09kZCgpKSB7XG4gICAgICBpZiAobW9kID4gKHdzID4+IDEpIC0gMSlcbiAgICAgICAgeiA9ICh3cyA+PiAxKSAtIG1vZDtcbiAgICAgIGVsc2VcbiAgICAgICAgeiA9IG1vZDtcbiAgICAgIGsuaXN1Ym4oeik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHogPSAwO1xuICAgIH1cblxuICAgIG5hZltpXSA9IHo7XG4gICAgay5pdXNocm4oMSk7XG4gIH1cblxuICByZXR1cm4gbmFmO1xufVxudXRpbHMuZ2V0TkFGID0gZ2V0TkFGO1xuXG4vLyBSZXByZXNlbnQgazEsIGsyIGluIGEgSm9pbnQgU3BhcnNlIEZvcm1cbmZ1bmN0aW9uIGdldEpTRihrMSwgazIpIHtcbiAgdmFyIGpzZiA9IFtcbiAgICBbXSxcbiAgICBbXSxcbiAgXTtcblxuICBrMSA9IGsxLmNsb25lKCk7XG4gIGsyID0gazIuY2xvbmUoKTtcbiAgdmFyIGQxID0gMDtcbiAgdmFyIGQyID0gMDtcbiAgdmFyIG04O1xuICB3aGlsZSAoazEuY21wbigtZDEpID4gMCB8fCBrMi5jbXBuKC1kMikgPiAwKSB7XG4gICAgLy8gRmlyc3QgcGhhc2VcbiAgICB2YXIgbTE0ID0gKGsxLmFuZGxuKDMpICsgZDEpICYgMztcbiAgICB2YXIgbTI0ID0gKGsyLmFuZGxuKDMpICsgZDIpICYgMztcbiAgICBpZiAobTE0ID09PSAzKVxuICAgICAgbTE0ID0gLTE7XG4gICAgaWYgKG0yNCA9PT0gMylcbiAgICAgIG0yNCA9IC0xO1xuICAgIHZhciB1MTtcbiAgICBpZiAoKG0xNCAmIDEpID09PSAwKSB7XG4gICAgICB1MSA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG04ID0gKGsxLmFuZGxuKDcpICsgZDEpICYgNztcbiAgICAgIGlmICgobTggPT09IDMgfHwgbTggPT09IDUpICYmIG0yNCA9PT0gMilcbiAgICAgICAgdTEgPSAtbTE0O1xuICAgICAgZWxzZVxuICAgICAgICB1MSA9IG0xNDtcbiAgICB9XG4gICAganNmWzBdLnB1c2godTEpO1xuXG4gICAgdmFyIHUyO1xuICAgIGlmICgobTI0ICYgMSkgPT09IDApIHtcbiAgICAgIHUyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgbTggPSAoazIuYW5kbG4oNykgKyBkMikgJiA3O1xuICAgICAgaWYgKChtOCA9PT0gMyB8fCBtOCA9PT0gNSkgJiYgbTE0ID09PSAyKVxuICAgICAgICB1MiA9IC1tMjQ7XG4gICAgICBlbHNlXG4gICAgICAgIHUyID0gbTI0O1xuICAgIH1cbiAgICBqc2ZbMV0ucHVzaCh1Mik7XG5cbiAgICAvLyBTZWNvbmQgcGhhc2VcbiAgICBpZiAoMiAqIGQxID09PSB1MSArIDEpXG4gICAgICBkMSA9IDEgLSBkMTtcbiAgICBpZiAoMiAqIGQyID09PSB1MiArIDEpXG4gICAgICBkMiA9IDEgLSBkMjtcbiAgICBrMS5pdXNocm4oMSk7XG4gICAgazIuaXVzaHJuKDEpO1xuICB9XG5cbiAgcmV0dXJuIGpzZjtcbn1cbnV0aWxzLmdldEpTRiA9IGdldEpTRjtcblxuZnVuY3Rpb24gY2FjaGVkUHJvcGVydHkob2JqLCBuYW1lLCBjb21wdXRlcikge1xuICB2YXIga2V5ID0gJ18nICsgbmFtZTtcbiAgb2JqLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uIGNhY2hlZFByb3BlcnR5KCkge1xuICAgIHJldHVybiB0aGlzW2tleV0gIT09IHVuZGVmaW5lZCA/IHRoaXNba2V5XSA6XG4gICAgICB0aGlzW2tleV0gPSBjb21wdXRlci5jYWxsKHRoaXMpO1xuICB9O1xufVxudXRpbHMuY2FjaGVkUHJvcGVydHkgPSBjYWNoZWRQcm9wZXJ0eTtcblxuZnVuY3Rpb24gcGFyc2VCeXRlcyhieXRlcykge1xuICByZXR1cm4gdHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJyA/IHV0aWxzLnRvQXJyYXkoYnl0ZXMsICdoZXgnKSA6XG4gICAgYnl0ZXM7XG59XG51dGlscy5wYXJzZUJ5dGVzID0gcGFyc2VCeXRlcztcblxuZnVuY3Rpb24gaW50RnJvbUxFKGJ5dGVzKSB7XG4gIHJldHVybiBuZXcgQk4oYnl0ZXMsICdoZXgnLCAnbGUnKTtcbn1cbnV0aWxzLmludEZyb21MRSA9IGludEZyb21MRTtcblxuIiwKICAgICJ2YXIgcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByYW5kKGxlbikge1xuICBpZiAoIXIpXG4gICAgciA9IG5ldyBSYW5kKG51bGwpO1xuXG4gIHJldHVybiByLmdlbmVyYXRlKGxlbik7XG59O1xuXG5mdW5jdGlvbiBSYW5kKHJhbmQpIHtcbiAgdGhpcy5yYW5kID0gcmFuZDtcbn1cbm1vZHVsZS5leHBvcnRzLlJhbmQgPSBSYW5kO1xuXG5SYW5kLnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uIGdlbmVyYXRlKGxlbikge1xuICByZXR1cm4gdGhpcy5fcmFuZChsZW4pO1xufTtcblxuLy8gRW11bGF0ZSBjcnlwdG8gQVBJIHVzaW5nIHJhbmR5XG5SYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgaWYgKHRoaXMucmFuZC5nZXRCeXRlcylcbiAgICByZXR1cm4gdGhpcy5yYW5kLmdldEJ5dGVzKG4pO1xuXG4gIHZhciByZXMgPSBuZXcgVWludDhBcnJheShuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspXG4gICAgcmVzW2ldID0gdGhpcy5yYW5kLmdldEJ5dGUoKTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbmlmICh0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcpIHtcbiAgaWYgKHNlbGYuY3J5cHRvICYmIHNlbGYuY3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIE1vZGVybiBicm93c2Vyc1xuICAgIFJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICAgICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KG4pO1xuICAgICAgc2VsZi5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycik7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH07XG4gIH0gZWxzZSBpZiAoc2VsZi5tc0NyeXB0byAmJiBzZWxmLm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIElFXG4gICAgUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbiBfcmFuZChuKSB7XG4gICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gICAgICBzZWxmLm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnIpO1xuICAgICAgcmV0dXJuIGFycjtcbiAgICB9O1xuXG4gIC8vIFNhZmFyaSdzIFdlYldvcmtlcnMgZG8gbm90IGhhdmUgYGNyeXB0b2BcbiAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0Jykge1xuICAgIC8vIE9sZCBqdW5rXG4gICAgUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkIHlldCcpO1xuICAgIH07XG4gIH1cbn0gZWxzZSB7XG4gIC8vIE5vZGUuanMgb3IgV2ViIHdvcmtlciB3aXRoIG5vIGNyeXB0byBzdXBwb3J0XG4gIHRyeSB7XG4gICAgdmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuICAgIGlmICh0eXBlb2YgY3J5cHRvLnJhbmRvbUJ5dGVzICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkJyk7XG5cbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgICAgIHJldHVybiBjcnlwdG8ucmFuZG9tQnl0ZXMobik7XG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICB9XG59XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgZ2V0TkFGID0gdXRpbHMuZ2V0TkFGO1xudmFyIGdldEpTRiA9IHV0aWxzLmdldEpTRjtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIEJhc2VDdXJ2ZSh0eXBlLCBjb25mKSB7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMucCA9IG5ldyBCTihjb25mLnAsIDE2KTtcblxuICAvLyBVc2UgTW9udGdvbWVyeSwgd2hlbiB0aGVyZSBpcyBubyBmYXN0IHJlZHVjdGlvbiBmb3IgdGhlIHByaW1lXG4gIHRoaXMucmVkID0gY29uZi5wcmltZSA/IEJOLnJlZChjb25mLnByaW1lKSA6IEJOLm1vbnQodGhpcy5wKTtcblxuICAvLyBVc2VmdWwgZm9yIG1hbnkgY3VydmVzXG4gIHRoaXMuemVybyA9IG5ldyBCTigwKS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMub25lID0gbmV3IEJOKDEpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy50d28gPSBuZXcgQk4oMikudG9SZWQodGhpcy5yZWQpO1xuXG4gIC8vIEN1cnZlIGNvbmZpZ3VyYXRpb24sIG9wdGlvbmFsXG4gIHRoaXMubiA9IGNvbmYubiAmJiBuZXcgQk4oY29uZi5uLCAxNik7XG4gIHRoaXMuZyA9IGNvbmYuZyAmJiB0aGlzLnBvaW50RnJvbUpTT04oY29uZi5nLCBjb25mLmdSZWQpO1xuXG4gIC8vIFRlbXBvcmFyeSBhcnJheXNcbiAgdGhpcy5fd25hZlQxID0gbmV3IEFycmF5KDQpO1xuICB0aGlzLl93bmFmVDIgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX3duYWZUMyA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fd25hZlQ0ID0gbmV3IEFycmF5KDQpO1xuXG4gIHRoaXMuX2JpdExlbmd0aCA9IHRoaXMubiA/IHRoaXMubi5iaXRMZW5ndGgoKSA6IDA7XG5cbiAgLy8gR2VuZXJhbGl6ZWQgR3JlZyBNYXh3ZWxsJ3MgdHJpY2tcbiAgdmFyIGFkanVzdENvdW50ID0gdGhpcy5uICYmIHRoaXMucC5kaXYodGhpcy5uKTtcbiAgaWYgKCFhZGp1c3RDb3VudCB8fCBhZGp1c3RDb3VudC5jbXBuKDEwMCkgPiAwKSB7XG4gICAgdGhpcy5yZWROID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9tYXh3ZWxsVHJpY2sgPSB0cnVlO1xuICAgIHRoaXMucmVkTiA9IHRoaXMubi50b1JlZCh0aGlzLnJlZCk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gQmFzZUN1cnZlO1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24gcG9pbnQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLl9maXhlZE5hZk11bCA9IGZ1bmN0aW9uIF9maXhlZE5hZk11bChwLCBrKSB7XG4gIGFzc2VydChwLnByZWNvbXB1dGVkKTtcbiAgdmFyIGRvdWJsZXMgPSBwLl9nZXREb3VibGVzKCk7XG5cbiAgdmFyIG5hZiA9IGdldE5BRihrLCAxLCB0aGlzLl9iaXRMZW5ndGgpO1xuICB2YXIgSSA9ICgxIDw8IChkb3VibGVzLnN0ZXAgKyAxKSkgLSAoZG91Ymxlcy5zdGVwICUgMiA9PT0gMCA/IDIgOiAxKTtcbiAgSSAvPSAzO1xuXG4gIC8vIFRyYW5zbGF0ZSBpbnRvIG1vcmUgd2luZG93ZWQgZm9ybVxuICB2YXIgcmVwciA9IFtdO1xuICB2YXIgajtcbiAgdmFyIG5hZlc7XG4gIGZvciAoaiA9IDA7IGogPCBuYWYubGVuZ3RoOyBqICs9IGRvdWJsZXMuc3RlcCkge1xuICAgIG5hZlcgPSAwO1xuICAgIGZvciAodmFyIGwgPSBqICsgZG91Ymxlcy5zdGVwIC0gMTsgbCA+PSBqOyBsLS0pXG4gICAgICBuYWZXID0gKG5hZlcgPDwgMSkgKyBuYWZbbF07XG4gICAgcmVwci5wdXNoKG5hZlcpO1xuICB9XG5cbiAgdmFyIGEgPSB0aGlzLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgdmFyIGIgPSB0aGlzLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgZm9yICh2YXIgaSA9IEk7IGkgPiAwOyBpLS0pIHtcbiAgICBmb3IgKGogPSAwOyBqIDwgcmVwci5sZW5ndGg7IGorKykge1xuICAgICAgbmFmVyA9IHJlcHJbal07XG4gICAgICBpZiAobmFmVyA9PT0gaSlcbiAgICAgICAgYiA9IGIubWl4ZWRBZGQoZG91Ymxlcy5wb2ludHNbal0pO1xuICAgICAgZWxzZSBpZiAobmFmVyA9PT0gLWkpXG4gICAgICAgIGIgPSBiLm1peGVkQWRkKGRvdWJsZXMucG9pbnRzW2pdLm5lZygpKTtcbiAgICB9XG4gICAgYSA9IGEuYWRkKGIpO1xuICB9XG4gIHJldHVybiBhLnRvUCgpO1xufTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS5fd25hZk11bCA9IGZ1bmN0aW9uIF93bmFmTXVsKHAsIGspIHtcbiAgdmFyIHcgPSA0O1xuXG4gIC8vIFByZWNvbXB1dGUgd2luZG93XG4gIHZhciBuYWZQb2ludHMgPSBwLl9nZXROQUZQb2ludHModyk7XG4gIHcgPSBuYWZQb2ludHMud25kO1xuICB2YXIgd25kID0gbmFmUG9pbnRzLnBvaW50cztcblxuICAvLyBHZXQgTkFGIGZvcm1cbiAgdmFyIG5hZiA9IGdldE5BRihrLCB3LCB0aGlzLl9iaXRMZW5ndGgpO1xuXG4gIC8vIEFkZCBgdGhpc2AqKE4rMSkgZm9yIGV2ZXJ5IHctTkFGIGluZGV4XG4gIHZhciBhY2MgPSB0aGlzLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgZm9yICh2YXIgaSA9IG5hZi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIC8vIENvdW50IHplcm9lc1xuICAgIGZvciAodmFyIGwgPSAwOyBpID49IDAgJiYgbmFmW2ldID09PSAwOyBpLS0pXG4gICAgICBsKys7XG4gICAgaWYgKGkgPj0gMClcbiAgICAgIGwrKztcbiAgICBhY2MgPSBhY2MuZGJscChsKTtcblxuICAgIGlmIChpIDwgMClcbiAgICAgIGJyZWFrO1xuICAgIHZhciB6ID0gbmFmW2ldO1xuICAgIGFzc2VydCh6ICE9PSAwKTtcbiAgICBpZiAocC50eXBlID09PSAnYWZmaW5lJykge1xuICAgICAgLy8gSiArLSBQXG4gICAgICBpZiAoeiA+IDApXG4gICAgICAgIGFjYyA9IGFjYy5taXhlZEFkZCh3bmRbKHogLSAxKSA+PiAxXSk7XG4gICAgICBlbHNlXG4gICAgICAgIGFjYyA9IGFjYy5taXhlZEFkZCh3bmRbKC16IC0gMSkgPj4gMV0ubmVnKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBKICstIEpcbiAgICAgIGlmICh6ID4gMClcbiAgICAgICAgYWNjID0gYWNjLmFkZCh3bmRbKHogLSAxKSA+PiAxXSk7XG4gICAgICBlbHNlXG4gICAgICAgIGFjYyA9IGFjYy5hZGQod25kWygteiAtIDEpID4+IDFdLm5lZygpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHAudHlwZSA9PT0gJ2FmZmluZScgPyBhY2MudG9QKCkgOiBhY2M7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLl93bmFmTXVsQWRkID0gZnVuY3Rpb24gX3duYWZNdWxBZGQoZGVmVyxcbiAgcG9pbnRzLFxuICBjb2VmZnMsXG4gIGxlbixcbiAgamFjb2JpYW5SZXN1bHQpIHtcbiAgdmFyIHduZFdpZHRoID0gdGhpcy5fd25hZlQxO1xuICB2YXIgd25kID0gdGhpcy5fd25hZlQyO1xuICB2YXIgbmFmID0gdGhpcy5fd25hZlQzO1xuXG4gIC8vIEZpbGwgYWxsIGFycmF5c1xuICB2YXIgbWF4ID0gMDtcbiAgdmFyIGk7XG4gIHZhciBqO1xuICB2YXIgcDtcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgcCA9IHBvaW50c1tpXTtcbiAgICB2YXIgbmFmUG9pbnRzID0gcC5fZ2V0TkFGUG9pbnRzKGRlZlcpO1xuICAgIHduZFdpZHRoW2ldID0gbmFmUG9pbnRzLnduZDtcbiAgICB3bmRbaV0gPSBuYWZQb2ludHMucG9pbnRzO1xuICB9XG5cbiAgLy8gQ29tYiBzbWFsbCB3aW5kb3cgTkFGc1xuICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDE7IGkgLT0gMikge1xuICAgIHZhciBhID0gaSAtIDE7XG4gICAgdmFyIGIgPSBpO1xuICAgIGlmICh3bmRXaWR0aFthXSAhPT0gMSB8fCB3bmRXaWR0aFtiXSAhPT0gMSkge1xuICAgICAgbmFmW2FdID0gZ2V0TkFGKGNvZWZmc1thXSwgd25kV2lkdGhbYV0sIHRoaXMuX2JpdExlbmd0aCk7XG4gICAgICBuYWZbYl0gPSBnZXROQUYoY29lZmZzW2JdLCB3bmRXaWR0aFtiXSwgdGhpcy5fYml0TGVuZ3RoKTtcbiAgICAgIG1heCA9IE1hdGgubWF4KG5hZlthXS5sZW5ndGgsIG1heCk7XG4gICAgICBtYXggPSBNYXRoLm1heChuYWZbYl0ubGVuZ3RoLCBtYXgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGNvbWIgPSBbXG4gICAgICBwb2ludHNbYV0sIC8qIDEgKi9cbiAgICAgIG51bGwsIC8qIDMgKi9cbiAgICAgIG51bGwsIC8qIDUgKi9cbiAgICAgIHBvaW50c1tiXSwgLyogNyAqL1xuICAgIF07XG5cbiAgICAvLyBUcnkgdG8gYXZvaWQgUHJvamVjdGl2ZSBwb2ludHMsIGlmIHBvc3NpYmxlXG4gICAgaWYgKHBvaW50c1thXS55LmNtcChwb2ludHNbYl0ueSkgPT09IDApIHtcbiAgICAgIGNvbWJbMV0gPSBwb2ludHNbYV0uYWRkKHBvaW50c1tiXSk7XG4gICAgICBjb21iWzJdID0gcG9pbnRzW2FdLnRvSigpLm1peGVkQWRkKHBvaW50c1tiXS5uZWcoKSk7XG4gICAgfSBlbHNlIGlmIChwb2ludHNbYV0ueS5jbXAocG9pbnRzW2JdLnkucmVkTmVnKCkpID09PSAwKSB7XG4gICAgICBjb21iWzFdID0gcG9pbnRzW2FdLnRvSigpLm1peGVkQWRkKHBvaW50c1tiXSk7XG4gICAgICBjb21iWzJdID0gcG9pbnRzW2FdLmFkZChwb2ludHNbYl0ubmVnKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21iWzFdID0gcG9pbnRzW2FdLnRvSigpLm1peGVkQWRkKHBvaW50c1tiXSk7XG4gICAgICBjb21iWzJdID0gcG9pbnRzW2FdLnRvSigpLm1peGVkQWRkKHBvaW50c1tiXS5uZWcoKSk7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4ID0gW1xuICAgICAgLTMsIC8qIC0xIC0xICovXG4gICAgICAtMSwgLyogLTEgMCAqL1xuICAgICAgLTUsIC8qIC0xIDEgKi9cbiAgICAgIC03LCAvKiAwIC0xICovXG4gICAgICAwLCAvKiAwIDAgKi9cbiAgICAgIDcsIC8qIDAgMSAqL1xuICAgICAgNSwgLyogMSAtMSAqL1xuICAgICAgMSwgLyogMSAwICovXG4gICAgICAzLCAgLyogMSAxICovXG4gICAgXTtcblxuICAgIHZhciBqc2YgPSBnZXRKU0YoY29lZmZzW2FdLCBjb2VmZnNbYl0pO1xuICAgIG1heCA9IE1hdGgubWF4KGpzZlswXS5sZW5ndGgsIG1heCk7XG4gICAgbmFmW2FdID0gbmV3IEFycmF5KG1heCk7XG4gICAgbmFmW2JdID0gbmV3IEFycmF5KG1heCk7XG4gICAgZm9yIChqID0gMDsgaiA8IG1heDsgaisrKSB7XG4gICAgICB2YXIgamEgPSBqc2ZbMF1bal0gfCAwO1xuICAgICAgdmFyIGpiID0ganNmWzFdW2pdIHwgMDtcblxuICAgICAgbmFmW2FdW2pdID0gaW5kZXhbKGphICsgMSkgKiAzICsgKGpiICsgMSldO1xuICAgICAgbmFmW2JdW2pdID0gMDtcbiAgICAgIHduZFthXSA9IGNvbWI7XG4gICAgfVxuICB9XG5cbiAgdmFyIGFjYyA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICB2YXIgdG1wID0gdGhpcy5fd25hZlQ0O1xuICBmb3IgKGkgPSBtYXg7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGsgPSAwO1xuXG4gICAgd2hpbGUgKGkgPj0gMCkge1xuICAgICAgdmFyIHplcm8gPSB0cnVlO1xuICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgIHRtcFtqXSA9IG5hZltqXVtpXSB8IDA7XG4gICAgICAgIGlmICh0bXBbal0gIT09IDApXG4gICAgICAgICAgemVybyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCF6ZXJvKVxuICAgICAgICBicmVhaztcbiAgICAgIGsrKztcbiAgICAgIGktLTtcbiAgICB9XG4gICAgaWYgKGkgPj0gMClcbiAgICAgIGsrKztcbiAgICBhY2MgPSBhY2MuZGJscChrKTtcbiAgICBpZiAoaSA8IDApXG4gICAgICBicmVhaztcblxuICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykge1xuICAgICAgdmFyIHogPSB0bXBbal07XG4gICAgICBwO1xuICAgICAgaWYgKHogPT09IDApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgZWxzZSBpZiAoeiA+IDApXG4gICAgICAgIHAgPSB3bmRbal1bKHogLSAxKSA+PiAxXTtcbiAgICAgIGVsc2UgaWYgKHogPCAwKVxuICAgICAgICBwID0gd25kW2pdWygteiAtIDEpID4+IDFdLm5lZygpO1xuXG4gICAgICBpZiAocC50eXBlID09PSAnYWZmaW5lJylcbiAgICAgICAgYWNjID0gYWNjLm1peGVkQWRkKHApO1xuICAgICAgZWxzZVxuICAgICAgICBhY2MgPSBhY2MuYWRkKHApO1xuICAgIH1cbiAgfVxuICAvLyBaZXJvaWZ5IHJlZmVyZW5jZXNcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgIHduZFtpXSA9IG51bGw7XG5cbiAgaWYgKGphY29iaWFuUmVzdWx0KVxuICAgIHJldHVybiBhY2M7XG4gIGVsc2VcbiAgICByZXR1cm4gYWNjLnRvUCgpO1xufTtcblxuZnVuY3Rpb24gQmFzZVBvaW50KGN1cnZlLCB0eXBlKSB7XG4gIHRoaXMuY3VydmUgPSBjdXJ2ZTtcbiAgdGhpcy50eXBlID0gdHlwZTtcbiAgdGhpcy5wcmVjb21wdXRlZCA9IG51bGw7XG59XG5CYXNlQ3VydmUuQmFzZVBvaW50ID0gQmFzZVBvaW50O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEoLypvdGhlciovKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG4gIHJldHVybiB0aGlzLmN1cnZlLnZhbGlkYXRlKHRoaXMpO1xufTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS5kZWNvZGVQb2ludCA9IGZ1bmN0aW9uIGRlY29kZVBvaW50KGJ5dGVzLCBlbmMpIHtcbiAgYnl0ZXMgPSB1dGlscy50b0FycmF5KGJ5dGVzLCBlbmMpO1xuXG4gIHZhciBsZW4gPSB0aGlzLnAuYnl0ZUxlbmd0aCgpO1xuXG4gIC8vIHVuY29tcHJlc3NlZCwgaHlicmlkLW9kZCwgaHlicmlkLWV2ZW5cbiAgaWYgKChieXRlc1swXSA9PT0gMHgwNCB8fCBieXRlc1swXSA9PT0gMHgwNiB8fCBieXRlc1swXSA9PT0gMHgwNykgJiZcbiAgICAgIGJ5dGVzLmxlbmd0aCAtIDEgPT09IDIgKiBsZW4pIHtcbiAgICBpZiAoYnl0ZXNbMF0gPT09IDB4MDYpXG4gICAgICBhc3NlcnQoYnl0ZXNbYnl0ZXMubGVuZ3RoIC0gMV0gJSAyID09PSAwKTtcbiAgICBlbHNlIGlmIChieXRlc1swXSA9PT0gMHgwNylcbiAgICAgIGFzc2VydChieXRlc1tieXRlcy5sZW5ndGggLSAxXSAlIDIgPT09IDEpO1xuXG4gICAgdmFyIHJlcyA9ICB0aGlzLnBvaW50KGJ5dGVzLnNsaWNlKDEsIDEgKyBsZW4pLFxuICAgICAgYnl0ZXMuc2xpY2UoMSArIGxlbiwgMSArIDIgKiBsZW4pKTtcblxuICAgIHJldHVybiByZXM7XG4gIH0gZWxzZSBpZiAoKGJ5dGVzWzBdID09PSAweDAyIHx8IGJ5dGVzWzBdID09PSAweDAzKSAmJlxuICAgICAgICAgICAgICBieXRlcy5sZW5ndGggLSAxID09PSBsZW4pIHtcbiAgICByZXR1cm4gdGhpcy5wb2ludEZyb21YKGJ5dGVzLnNsaWNlKDEsIDEgKyBsZW4pLCBieXRlc1swXSA9PT0gMHgwMyk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHBvaW50IGZvcm1hdCcpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5lbmNvZGVDb21wcmVzc2VkID0gZnVuY3Rpb24gZW5jb2RlQ29tcHJlc3NlZChlbmMpIHtcbiAgcmV0dXJuIHRoaXMuZW5jb2RlKGVuYywgdHJ1ZSk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9lbmNvZGUgPSBmdW5jdGlvbiBfZW5jb2RlKGNvbXBhY3QpIHtcbiAgdmFyIGxlbiA9IHRoaXMuY3VydmUucC5ieXRlTGVuZ3RoKCk7XG4gIHZhciB4ID0gdGhpcy5nZXRYKCkudG9BcnJheSgnYmUnLCBsZW4pO1xuXG4gIGlmIChjb21wYWN0KVxuICAgIHJldHVybiBbIHRoaXMuZ2V0WSgpLmlzRXZlbigpID8gMHgwMiA6IDB4MDMgXS5jb25jYXQoeCk7XG5cbiAgcmV0dXJuIFsgMHgwNCBdLmNvbmNhdCh4LCB0aGlzLmdldFkoKS50b0FycmF5KCdiZScsIGxlbikpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoZW5jLCBjb21wYWN0KSB7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy5fZW5jb2RlKGNvbXBhY3QpLCBlbmMpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5wcmVjb21wdXRlID0gZnVuY3Rpb24gcHJlY29tcHV0ZShwb3dlcikge1xuICBpZiAodGhpcy5wcmVjb21wdXRlZClcbiAgICByZXR1cm4gdGhpcztcblxuICB2YXIgcHJlY29tcHV0ZWQgPSB7XG4gICAgZG91YmxlczogbnVsbCxcbiAgICBuYWY6IG51bGwsXG4gICAgYmV0YTogbnVsbCxcbiAgfTtcbiAgcHJlY29tcHV0ZWQubmFmID0gdGhpcy5fZ2V0TkFGUG9pbnRzKDgpO1xuICBwcmVjb21wdXRlZC5kb3VibGVzID0gdGhpcy5fZ2V0RG91Ymxlcyg0LCBwb3dlcik7XG4gIHByZWNvbXB1dGVkLmJldGEgPSB0aGlzLl9nZXRCZXRhKCk7XG4gIHRoaXMucHJlY29tcHV0ZWQgPSBwcmVjb21wdXRlZDtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2hhc0RvdWJsZXMgPSBmdW5jdGlvbiBfaGFzRG91YmxlcyhrKSB7XG4gIGlmICghdGhpcy5wcmVjb21wdXRlZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGRvdWJsZXMgPSB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXM7XG4gIGlmICghZG91YmxlcylcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGRvdWJsZXMucG9pbnRzLmxlbmd0aCA+PSBNYXRoLmNlaWwoKGsuYml0TGVuZ3RoKCkgKyAxKSAvIGRvdWJsZXMuc3RlcCk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9nZXREb3VibGVzID0gZnVuY3Rpb24gX2dldERvdWJsZXMoc3RlcCwgcG93ZXIpIHtcbiAgaWYgKHRoaXMucHJlY29tcHV0ZWQgJiYgdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzKVxuICAgIHJldHVybiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXM7XG5cbiAgdmFyIGRvdWJsZXMgPSBbIHRoaXMgXTtcbiAgdmFyIGFjYyA9IHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG93ZXI7IGkgKz0gc3RlcCkge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3RlcDsgaisrKVxuICAgICAgYWNjID0gYWNjLmRibCgpO1xuICAgIGRvdWJsZXMucHVzaChhY2MpO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RlcDogc3RlcCxcbiAgICBwb2ludHM6IGRvdWJsZXMsXG4gIH07XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9nZXROQUZQb2ludHMgPSBmdW5jdGlvbiBfZ2V0TkFGUG9pbnRzKHduZCkge1xuICBpZiAodGhpcy5wcmVjb21wdXRlZCAmJiB0aGlzLnByZWNvbXB1dGVkLm5hZilcbiAgICByZXR1cm4gdGhpcy5wcmVjb21wdXRlZC5uYWY7XG5cbiAgdmFyIHJlcyA9IFsgdGhpcyBdO1xuICB2YXIgbWF4ID0gKDEgPDwgd25kKSAtIDE7XG4gIHZhciBkYmwgPSBtYXggPT09IDEgPyBudWxsIDogdGhpcy5kYmwoKTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBtYXg7IGkrKylcbiAgICByZXNbaV0gPSByZXNbaSAtIDFdLmFkZChkYmwpO1xuICByZXR1cm4ge1xuICAgIHduZDogd25kLFxuICAgIHBvaW50czogcmVzLFxuICB9O1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5fZ2V0QmV0YSA9IGZ1bmN0aW9uIF9nZXRCZXRhKCkge1xuICByZXR1cm4gbnVsbDtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuZGJscCA9IGZ1bmN0aW9uIGRibHAoaykge1xuICB2YXIgciA9IHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgazsgaSsrKVxuICAgIHIgPSByLmRibCgpO1xuICByZXR1cm4gcjtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIEJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcblxudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gU2hvcnRDdXJ2ZShjb25mKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCAnc2hvcnQnLCBjb25mKTtcblxuICB0aGlzLmEgPSBuZXcgQk4oY29uZi5hLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmIgPSBuZXcgQk4oY29uZi5iLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLnRpbnYgPSB0aGlzLnR3by5yZWRJbnZtKCk7XG5cbiAgdGhpcy56ZXJvQSA9IHRoaXMuYS5mcm9tUmVkKCkuY21wbigwKSA9PT0gMDtcbiAgdGhpcy50aHJlZUEgPSB0aGlzLmEuZnJvbVJlZCgpLnN1Yih0aGlzLnApLmNtcG4oLTMpID09PSAwO1xuXG4gIC8vIElmIHRoZSBjdXJ2ZSBpcyBlbmRvbW9ycGhpYywgcHJlY2FsY3VsYXRlIGJldGEgYW5kIGxhbWJkYVxuICB0aGlzLmVuZG8gPSB0aGlzLl9nZXRFbmRvbW9ycGhpc20oY29uZik7XG4gIHRoaXMuX2VuZG9XbmFmVDEgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX2VuZG9XbmFmVDIgPSBuZXcgQXJyYXkoNCk7XG59XG5pbmhlcml0cyhTaG9ydEN1cnZlLCBCYXNlKTtcbm1vZHVsZS5leHBvcnRzID0gU2hvcnRDdXJ2ZTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2dldEVuZG9tb3JwaGlzbSA9IGZ1bmN0aW9uIF9nZXRFbmRvbW9ycGhpc20oY29uZikge1xuICAvLyBObyBlZmZpY2llbnQgZW5kb21vcnBoaXNtXG4gIGlmICghdGhpcy56ZXJvQSB8fCAhdGhpcy5nIHx8ICF0aGlzLm4gfHwgdGhpcy5wLm1vZG4oMykgIT09IDEpXG4gICAgcmV0dXJuO1xuXG4gIC8vIENvbXB1dGUgYmV0YSBhbmQgbGFtYmRhLCB0aGF0IGxhbWJkYSAqIFAgPSAoYmV0YSAqIFB4OyBQeSlcbiAgdmFyIGJldGE7XG4gIHZhciBsYW1iZGE7XG4gIGlmIChjb25mLmJldGEpIHtcbiAgICBiZXRhID0gbmV3IEJOKGNvbmYuYmV0YSwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYmV0YXMgPSB0aGlzLl9nZXRFbmRvUm9vdHModGhpcy5wKTtcbiAgICAvLyBDaG9vc2UgdGhlIHNtYWxsZXN0IGJldGFcbiAgICBiZXRhID0gYmV0YXNbMF0uY21wKGJldGFzWzFdKSA8IDAgPyBiZXRhc1swXSA6IGJldGFzWzFdO1xuICAgIGJldGEgPSBiZXRhLnRvUmVkKHRoaXMucmVkKTtcbiAgfVxuICBpZiAoY29uZi5sYW1iZGEpIHtcbiAgICBsYW1iZGEgPSBuZXcgQk4oY29uZi5sYW1iZGEsIDE2KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDaG9vc2UgdGhlIGxhbWJkYSB0aGF0IGlzIG1hdGNoaW5nIHNlbGVjdGVkIGJldGFcbiAgICB2YXIgbGFtYmRhcyA9IHRoaXMuX2dldEVuZG9Sb290cyh0aGlzLm4pO1xuICAgIGlmICh0aGlzLmcubXVsKGxhbWJkYXNbMF0pLnguY21wKHRoaXMuZy54LnJlZE11bChiZXRhKSkgPT09IDApIHtcbiAgICAgIGxhbWJkYSA9IGxhbWJkYXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhbWJkYSA9IGxhbWJkYXNbMV07XG4gICAgICBhc3NlcnQodGhpcy5nLm11bChsYW1iZGEpLnguY21wKHRoaXMuZy54LnJlZE11bChiZXRhKSkgPT09IDApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdldCBiYXNpcyB2ZWN0b3JzLCB1c2VkIGZvciBiYWxhbmNlZCBsZW5ndGgtdHdvIHJlcHJlc2VudGF0aW9uXG4gIHZhciBiYXNpcztcbiAgaWYgKGNvbmYuYmFzaXMpIHtcbiAgICBiYXNpcyA9IGNvbmYuYmFzaXMubWFwKGZ1bmN0aW9uKHZlYykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYTogbmV3IEJOKHZlYy5hLCAxNiksXG4gICAgICAgIGI6IG5ldyBCTih2ZWMuYiwgMTYpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBiYXNpcyA9IHRoaXMuX2dldEVuZG9CYXNpcyhsYW1iZGEpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBiZXRhOiBiZXRhLFxuICAgIGxhbWJkYTogbGFtYmRhLFxuICAgIGJhc2lzOiBiYXNpcyxcbiAgfTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9nZXRFbmRvUm9vdHMgPSBmdW5jdGlvbiBfZ2V0RW5kb1Jvb3RzKG51bSkge1xuICAvLyBGaW5kIHJvb3RzIG9mIGZvciB4XjIgKyB4ICsgMSBpbiBGXG4gIC8vIFJvb3QgPSAoLTEgKy0gU3FydCgtMykpIC8gMlxuICAvL1xuICB2YXIgcmVkID0gbnVtID09PSB0aGlzLnAgPyB0aGlzLnJlZCA6IEJOLm1vbnQobnVtKTtcbiAgdmFyIHRpbnYgPSBuZXcgQk4oMikudG9SZWQocmVkKS5yZWRJbnZtKCk7XG4gIHZhciBudGludiA9IHRpbnYucmVkTmVnKCk7XG5cbiAgdmFyIHMgPSBuZXcgQk4oMykudG9SZWQocmVkKS5yZWROZWcoKS5yZWRTcXJ0KCkucmVkTXVsKHRpbnYpO1xuXG4gIHZhciBsMSA9IG50aW52LnJlZEFkZChzKS5mcm9tUmVkKCk7XG4gIHZhciBsMiA9IG50aW52LnJlZFN1YihzKS5mcm9tUmVkKCk7XG4gIHJldHVybiBbIGwxLCBsMiBdO1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2dldEVuZG9CYXNpcyA9IGZ1bmN0aW9uIF9nZXRFbmRvQmFzaXMobGFtYmRhKSB7XG4gIC8vIGFwcnhTcXJ0ID49IHNxcnQodGhpcy5uKVxuICB2YXIgYXByeFNxcnQgPSB0aGlzLm4udXNocm4oTWF0aC5mbG9vcih0aGlzLm4uYml0TGVuZ3RoKCkgLyAyKSk7XG5cbiAgLy8gMy43NFxuICAvLyBSdW4gRUdDRCwgdW50aWwgcihMICsgMSkgPCBhcHJ4U3FydFxuICB2YXIgdSA9IGxhbWJkYTtcbiAgdmFyIHYgPSB0aGlzLm4uY2xvbmUoKTtcbiAgdmFyIHgxID0gbmV3IEJOKDEpO1xuICB2YXIgeTEgPSBuZXcgQk4oMCk7XG4gIHZhciB4MiA9IG5ldyBCTigwKTtcbiAgdmFyIHkyID0gbmV3IEJOKDEpO1xuXG4gIC8vIE5PVEU6IGFsbCB2ZWN0b3JzIGFyZSByb290cyBvZjogYSArIGIgKiBsYW1iZGEgPSAwIChtb2QgbilcbiAgdmFyIGEwO1xuICB2YXIgYjA7XG4gIC8vIEZpcnN0IHZlY3RvclxuICB2YXIgYTE7XG4gIHZhciBiMTtcbiAgLy8gU2Vjb25kIHZlY3RvclxuICB2YXIgYTI7XG4gIHZhciBiMjtcblxuICB2YXIgcHJldlI7XG4gIHZhciBpID0gMDtcbiAgdmFyIHI7XG4gIHZhciB4O1xuICB3aGlsZSAodS5jbXBuKDApICE9PSAwKSB7XG4gICAgdmFyIHEgPSB2LmRpdih1KTtcbiAgICByID0gdi5zdWIocS5tdWwodSkpO1xuICAgIHggPSB4Mi5zdWIocS5tdWwoeDEpKTtcbiAgICB2YXIgeSA9IHkyLnN1YihxLm11bCh5MSkpO1xuXG4gICAgaWYgKCFhMSAmJiByLmNtcChhcHJ4U3FydCkgPCAwKSB7XG4gICAgICBhMCA9IHByZXZSLm5lZygpO1xuICAgICAgYjAgPSB4MTtcbiAgICAgIGExID0gci5uZWcoKTtcbiAgICAgIGIxID0geDtcbiAgICB9IGVsc2UgaWYgKGExICYmICsraSA9PT0gMikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHByZXZSID0gcjtcblxuICAgIHYgPSB1O1xuICAgIHUgPSByO1xuICAgIHgyID0geDE7XG4gICAgeDEgPSB4O1xuICAgIHkyID0geTE7XG4gICAgeTEgPSB5O1xuICB9XG4gIGEyID0gci5uZWcoKTtcbiAgYjIgPSB4O1xuXG4gIHZhciBsZW4xID0gYTEuc3FyKCkuYWRkKGIxLnNxcigpKTtcbiAgdmFyIGxlbjIgPSBhMi5zcXIoKS5hZGQoYjIuc3FyKCkpO1xuICBpZiAobGVuMi5jbXAobGVuMSkgPj0gMCkge1xuICAgIGEyID0gYTA7XG4gICAgYjIgPSBiMDtcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBzaWduc1xuICBpZiAoYTEubmVnYXRpdmUpIHtcbiAgICBhMSA9IGExLm5lZygpO1xuICAgIGIxID0gYjEubmVnKCk7XG4gIH1cbiAgaWYgKGEyLm5lZ2F0aXZlKSB7XG4gICAgYTIgPSBhMi5uZWcoKTtcbiAgICBiMiA9IGIyLm5lZygpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICB7IGE6IGExLCBiOiBiMSB9LFxuICAgIHsgYTogYTIsIGI6IGIyIH0sXG4gIF07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZW5kb1NwbGl0ID0gZnVuY3Rpb24gX2VuZG9TcGxpdChrKSB7XG4gIHZhciBiYXNpcyA9IHRoaXMuZW5kby5iYXNpcztcbiAgdmFyIHYxID0gYmFzaXNbMF07XG4gIHZhciB2MiA9IGJhc2lzWzFdO1xuXG4gIHZhciBjMSA9IHYyLmIubXVsKGspLmRpdlJvdW5kKHRoaXMubik7XG4gIHZhciBjMiA9IHYxLmIubmVnKCkubXVsKGspLmRpdlJvdW5kKHRoaXMubik7XG5cbiAgdmFyIHAxID0gYzEubXVsKHYxLmEpO1xuICB2YXIgcDIgPSBjMi5tdWwodjIuYSk7XG4gIHZhciBxMSA9IGMxLm11bCh2MS5iKTtcbiAgdmFyIHEyID0gYzIubXVsKHYyLmIpO1xuXG4gIC8vIENhbGN1bGF0ZSBhbnN3ZXJcbiAgdmFyIGsxID0gay5zdWIocDEpLnN1YihwMik7XG4gIHZhciBrMiA9IHExLmFkZChxMikubmVnKCk7XG4gIHJldHVybiB7IGsxOiBrMSwgazI6IGsyIH07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5wb2ludEZyb21YID0gZnVuY3Rpb24gcG9pbnRGcm9tWCh4LCBvZGQpIHtcbiAgeCA9IG5ldyBCTih4LCAxNik7XG4gIGlmICgheC5yZWQpXG4gICAgeCA9IHgudG9SZWQodGhpcy5yZWQpO1xuXG4gIHZhciB5MiA9IHgucmVkU3FyKCkucmVkTXVsKHgpLnJlZElBZGQoeC5yZWRNdWwodGhpcy5hKSkucmVkSUFkZCh0aGlzLmIpO1xuICB2YXIgeSA9IHkyLnJlZFNxcnQoKTtcbiAgaWYgKHkucmVkU3FyKCkucmVkU3ViKHkyKS5jbXAodGhpcy56ZXJvKSAhPT0gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcG9pbnQnKTtcblxuICAvLyBYWFggSXMgdGhlcmUgYW55IHdheSB0byB0ZWxsIGlmIHRoZSBudW1iZXIgaXMgb2RkIHdpdGhvdXQgY29udmVydGluZyBpdFxuICAvLyB0byBub24tcmVkIGZvcm0/XG4gIHZhciBpc09kZCA9IHkuZnJvbVJlZCgpLmlzT2RkKCk7XG4gIGlmIChvZGQgJiYgIWlzT2RkIHx8ICFvZGQgJiYgaXNPZGQpXG4gICAgeSA9IHkucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHBvaW50KSB7XG4gIGlmIChwb2ludC5pbmYpXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgdmFyIHggPSBwb2ludC54O1xuICB2YXIgeSA9IHBvaW50Lnk7XG5cbiAgdmFyIGF4ID0gdGhpcy5hLnJlZE11bCh4KTtcbiAgdmFyIHJocyA9IHgucmVkU3FyKCkucmVkTXVsKHgpLnJlZElBZGQoYXgpLnJlZElBZGQodGhpcy5iKTtcbiAgcmV0dXJuIHkucmVkU3FyKCkucmVkSVN1YihyaHMpLmNtcG4oMCkgPT09IDA7XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZW5kb1duYWZNdWxBZGQgPVxuICAgIGZ1bmN0aW9uIF9lbmRvV25hZk11bEFkZChwb2ludHMsIGNvZWZmcywgamFjb2JpYW5SZXN1bHQpIHtcbiAgICAgIHZhciBucG9pbnRzID0gdGhpcy5fZW5kb1duYWZUMTtcbiAgICAgIHZhciBuY29lZmZzID0gdGhpcy5fZW5kb1duYWZUMjtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzcGxpdCA9IHRoaXMuX2VuZG9TcGxpdChjb2VmZnNbaV0pO1xuICAgICAgICB2YXIgcCA9IHBvaW50c1tpXTtcbiAgICAgICAgdmFyIGJldGEgPSBwLl9nZXRCZXRhKCk7XG5cbiAgICAgICAgaWYgKHNwbGl0LmsxLm5lZ2F0aXZlKSB7XG4gICAgICAgICAgc3BsaXQuazEuaW5lZygpO1xuICAgICAgICAgIHAgPSBwLm5lZyh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3BsaXQuazIubmVnYXRpdmUpIHtcbiAgICAgICAgICBzcGxpdC5rMi5pbmVnKCk7XG4gICAgICAgICAgYmV0YSA9IGJldGEubmVnKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbnBvaW50c1tpICogMl0gPSBwO1xuICAgICAgICBucG9pbnRzW2kgKiAyICsgMV0gPSBiZXRhO1xuICAgICAgICBuY29lZmZzW2kgKiAyXSA9IHNwbGl0LmsxO1xuICAgICAgICBuY29lZmZzW2kgKiAyICsgMV0gPSBzcGxpdC5rMjtcbiAgICAgIH1cbiAgICAgIHZhciByZXMgPSB0aGlzLl93bmFmTXVsQWRkKDEsIG5wb2ludHMsIG5jb2VmZnMsIGkgKiAyLCBqYWNvYmlhblJlc3VsdCk7XG5cbiAgICAgIC8vIENsZWFuLXVwIHJlZmVyZW5jZXMgdG8gcG9pbnRzIGFuZCBjb2VmZmljaWVudHNcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaSAqIDI7IGorKykge1xuICAgICAgICBucG9pbnRzW2pdID0gbnVsbDtcbiAgICAgICAgbmNvZWZmc1tqXSA9IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG5cbmZ1bmN0aW9uIFBvaW50KGN1cnZlLCB4LCB5LCBpc1JlZCkge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAnYWZmaW5lJyk7XG4gIGlmICh4ID09PSBudWxsICYmIHkgPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSBudWxsO1xuICAgIHRoaXMueSA9IG51bGw7XG4gICAgdGhpcy5pbmYgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IG5ldyBCTih4LCAxNik7XG4gICAgdGhpcy55ID0gbmV3IEJOKHksIDE2KTtcbiAgICAvLyBGb3JjZSByZWRnb21lcnkgcmVwcmVzZW50YXRpb24gd2hlbiBsb2FkaW5nIGZyb20gSlNPTlxuICAgIGlmIChpc1JlZCkge1xuICAgICAgdGhpcy54LmZvcmNlUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICAgIHRoaXMueS5mb3JjZVJlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgfVxuICAgIGlmICghdGhpcy54LnJlZClcbiAgICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKCF0aGlzLnkucmVkKVxuICAgICAgdGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICB0aGlzLmluZiA9IGZhbHNlO1xuICB9XG59XG5pbmhlcml0cyhQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KHgsIHksIGlzUmVkKSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcywgeCwgeSwgaXNSZWQpO1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uIHBvaW50RnJvbUpTT04ob2JqLCByZWQpIHtcbiAgcmV0dXJuIFBvaW50LmZyb21KU09OKHRoaXMsIG9iaiwgcmVkKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZ2V0QmV0YSA9IGZ1bmN0aW9uIF9nZXRCZXRhKCkge1xuICBpZiAoIXRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm47XG5cbiAgdmFyIHByZSA9IHRoaXMucHJlY29tcHV0ZWQ7XG4gIGlmIChwcmUgJiYgcHJlLmJldGEpXG4gICAgcmV0dXJuIHByZS5iZXRhO1xuXG4gIHZhciBiZXRhID0gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngucmVkTXVsKHRoaXMuY3VydmUuZW5kby5iZXRhKSwgdGhpcy55KTtcbiAgaWYgKHByZSkge1xuICAgIHZhciBjdXJ2ZSA9IHRoaXMuY3VydmU7XG4gICAgdmFyIGVuZG9NdWwgPSBmdW5jdGlvbihwKSB7XG4gICAgICByZXR1cm4gY3VydmUucG9pbnQocC54LnJlZE11bChjdXJ2ZS5lbmRvLmJldGEpLCBwLnkpO1xuICAgIH07XG4gICAgcHJlLmJldGEgPSBiZXRhO1xuICAgIGJldGEucHJlY29tcHV0ZWQgPSB7XG4gICAgICBiZXRhOiBudWxsLFxuICAgICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgICAgd25kOiBwcmUubmFmLnduZCxcbiAgICAgICAgcG9pbnRzOiBwcmUubmFmLnBvaW50cy5tYXAoZW5kb011bCksXG4gICAgICB9LFxuICAgICAgZG91YmxlczogcHJlLmRvdWJsZXMgJiYge1xuICAgICAgICBzdGVwOiBwcmUuZG91Ymxlcy5zdGVwLFxuICAgICAgICBwb2ludHM6IHByZS5kb3VibGVzLnBvaW50cy5tYXAoZW5kb011bCksXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGJldGE7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xuICBpZiAoIXRoaXMucHJlY29tcHV0ZWQpXG4gICAgcmV0dXJuIFsgdGhpcy54LCB0aGlzLnkgXTtcblxuICByZXR1cm4gWyB0aGlzLngsIHRoaXMueSwgdGhpcy5wcmVjb21wdXRlZCAmJiB7XG4gICAgZG91YmxlczogdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzICYmIHtcbiAgICAgIHN0ZXA6IHRoaXMucHJlY29tcHV0ZWQuZG91Ymxlcy5zdGVwLFxuICAgICAgcG9pbnRzOiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMucG9pbnRzLnNsaWNlKDEpLFxuICAgIH0sXG4gICAgbmFmOiB0aGlzLnByZWNvbXB1dGVkLm5hZiAmJiB7XG4gICAgICB3bmQ6IHRoaXMucHJlY29tcHV0ZWQubmFmLnduZCxcbiAgICAgIHBvaW50czogdGhpcy5wcmVjb21wdXRlZC5uYWYucG9pbnRzLnNsaWNlKDEpLFxuICAgIH0sXG4gIH0gXTtcbn07XG5cblBvaW50LmZyb21KU09OID0gZnVuY3Rpb24gZnJvbUpTT04oY3VydmUsIG9iaiwgcmVkKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJylcbiAgICBvYmogPSBKU09OLnBhcnNlKG9iaik7XG4gIHZhciByZXMgPSBjdXJ2ZS5wb2ludChvYmpbMF0sIG9ialsxXSwgcmVkKTtcbiAgaWYgKCFvYmpbMl0pXG4gICAgcmV0dXJuIHJlcztcblxuICBmdW5jdGlvbiBvYmoycG9pbnQob2JqKSB7XG4gICAgcmV0dXJuIGN1cnZlLnBvaW50KG9ialswXSwgb2JqWzFdLCByZWQpO1xuICB9XG5cbiAgdmFyIHByZSA9IG9ialsyXTtcbiAgcmVzLnByZWNvbXB1dGVkID0ge1xuICAgIGJldGE6IG51bGwsXG4gICAgZG91YmxlczogcHJlLmRvdWJsZXMgJiYge1xuICAgICAgc3RlcDogcHJlLmRvdWJsZXMuc3RlcCxcbiAgICAgIHBvaW50czogWyByZXMgXS5jb25jYXQocHJlLmRvdWJsZXMucG9pbnRzLm1hcChvYmoycG9pbnQpKSxcbiAgICB9LFxuICAgIG5hZjogcHJlLm5hZiAmJiB7XG4gICAgICB3bmQ6IHByZS5uYWYud25kLFxuICAgICAgcG9pbnRzOiBbIHJlcyBdLmNvbmNhdChwcmUubmFmLnBvaW50cy5tYXAob2JqMnBvaW50KSksXG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIHJlcztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkuZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgcmV0dXJuIHRoaXMuaW5mO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZChwKSB7XG4gIC8vIE8gKyBQID0gUFxuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHA7XG5cbiAgLy8gUCArIE8gPSBQXG4gIGlmIChwLmluZilcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBQICsgUCA9IDJQXG4gIGlmICh0aGlzLmVxKHApKVxuICAgIHJldHVybiB0aGlzLmRibCgpO1xuXG4gIC8vIFAgKyAoLVApID0gT1xuICBpZiAodGhpcy5uZWcoKS5lcShwKSlcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICAvLyBQICsgUSA9IE9cbiAgaWYgKHRoaXMueC5jbXAocC54KSA9PT0gMClcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICB2YXIgYyA9IHRoaXMueS5yZWRTdWIocC55KTtcbiAgaWYgKGMuY21wbigwKSAhPT0gMClcbiAgICBjID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihwLngpLnJlZEludm0oKSk7XG4gIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0aGlzLngpLnJlZElTdWIocC54KTtcbiAgdmFyIG55ID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihueCkpLnJlZElTdWIodGhpcy55KTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kYmwgPSBmdW5jdGlvbiBkYmwoKSB7XG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyAyUCA9IE9cbiAgdmFyIHlzMSA9IHRoaXMueS5yZWRBZGQodGhpcy55KTtcbiAgaWYgKHlzMS5jbXBuKDApID09PSAwKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIHZhciBhID0gdGhpcy5jdXJ2ZS5hO1xuXG4gIHZhciB4MiA9IHRoaXMueC5yZWRTcXIoKTtcbiAgdmFyIGR5aW52ID0geXMxLnJlZEludm0oKTtcbiAgdmFyIGMgPSB4Mi5yZWRBZGQoeDIpLnJlZElBZGQoeDIpLnJlZElBZGQoYSkucmVkTXVsKGR5aW52KTtcblxuICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodGhpcy54LnJlZEFkZCh0aGlzLngpKTtcbiAgdmFyIG55ID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihueCkpLnJlZElTdWIodGhpcy55KTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gZ2V0WCgpIHtcbiAgcmV0dXJuIHRoaXMueC5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uIGdldFkoKSB7XG4gIHJldHVybiB0aGlzLnkuZnJvbVJlZCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrKSB7XG4gIGsgPSBuZXcgQk4oaywgMTYpO1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG4gIGVsc2UgaWYgKHRoaXMuX2hhc0RvdWJsZXMoaykpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2ZpeGVkTmFmTXVsKHRoaXMsIGspO1xuICBlbHNlIGlmICh0aGlzLmN1cnZlLmVuZG8pXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2VuZG9XbmFmTXVsQWRkKFsgdGhpcyBdLCBbIGsgXSk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bCh0aGlzLCBrKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWxBZGQgPSBmdW5jdGlvbiBtdWxBZGQoazEsIHAyLCBrMikge1xuICB2YXIgcG9pbnRzID0gWyB0aGlzLCBwMiBdO1xuICB2YXIgY29lZmZzID0gWyBrMSwgazIgXTtcbiAgaWYgKHRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQocG9pbnRzLCBjb2VmZnMpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgcG9pbnRzLCBjb2VmZnMsIDIpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmptdWxBZGQgPSBmdW5jdGlvbiBqbXVsQWRkKGsxLCBwMiwgazIpIHtcbiAgdmFyIHBvaW50cyA9IFsgdGhpcywgcDIgXTtcbiAgdmFyIGNvZWZmcyA9IFsgazEsIGsyIF07XG4gIGlmICh0aGlzLmN1cnZlLmVuZG8pXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2VuZG9XbmFmTXVsQWRkKHBvaW50cywgY29lZmZzLCB0cnVlKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsIHBvaW50cywgY29lZmZzLCAyLCB0cnVlKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKHApIHtcbiAgcmV0dXJuIHRoaXMgPT09IHAgfHxcbiAgICAgICAgIHRoaXMuaW5mID09PSBwLmluZiAmJlxuICAgICAgICAgICAgICh0aGlzLmluZiB8fCB0aGlzLnguY21wKHAueCkgPT09IDAgJiYgdGhpcy55LmNtcChwLnkpID09PSAwKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcoX3ByZWNvbXB1dGUpIHtcbiAgaWYgKHRoaXMuaW5mKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIHZhciByZXMgPSB0aGlzLmN1cnZlLnBvaW50KHRoaXMueCwgdGhpcy55LnJlZE5lZygpKTtcbiAgaWYgKF9wcmVjb21wdXRlICYmIHRoaXMucHJlY29tcHV0ZWQpIHtcbiAgICB2YXIgcHJlID0gdGhpcy5wcmVjb21wdXRlZDtcbiAgICB2YXIgbmVnYXRlID0gZnVuY3Rpb24ocCkge1xuICAgICAgcmV0dXJuIHAubmVnKCk7XG4gICAgfTtcbiAgICByZXMucHJlY29tcHV0ZWQgPSB7XG4gICAgICBuYWY6IHByZS5uYWYgJiYge1xuICAgICAgICB3bmQ6IHByZS5uYWYud25kLFxuICAgICAgICBwb2ludHM6IHByZS5uYWYucG9pbnRzLm1hcChuZWdhdGUpLFxuICAgICAgfSxcbiAgICAgIGRvdWJsZXM6IHByZS5kb3VibGVzICYmIHtcbiAgICAgICAgc3RlcDogcHJlLmRvdWJsZXMuc3RlcCxcbiAgICAgICAgcG9pbnRzOiBwcmUuZG91Ymxlcy5wb2ludHMubWFwKG5lZ2F0ZSksXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cblBvaW50LnByb3RvdHlwZS50b0ogPSBmdW5jdGlvbiB0b0ooKSB7XG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG5cbiAgdmFyIHJlcyA9IHRoaXMuY3VydmUuanBvaW50KHRoaXMueCwgdGhpcy55LCB0aGlzLmN1cnZlLm9uZSk7XG4gIHJldHVybiByZXM7XG59O1xuXG5mdW5jdGlvbiBKUG9pbnQoY3VydmUsIHgsIHksIHopIHtcbiAgQmFzZS5CYXNlUG9pbnQuY2FsbCh0aGlzLCBjdXJ2ZSwgJ2phY29iaWFuJyk7XG4gIGlmICh4ID09PSBudWxsICYmIHkgPT09IG51bGwgJiYgeiA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMueSA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMueiA9IG5ldyBCTigwKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSBuZXcgQk4oeCwgMTYpO1xuICAgIHRoaXMueSA9IG5ldyBCTih5LCAxNik7XG4gICAgdGhpcy56ID0gbmV3IEJOKHosIDE2KTtcbiAgfVxuICBpZiAoIXRoaXMueC5yZWQpXG4gICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgaWYgKCF0aGlzLnkucmVkKVxuICAgIHRoaXMueSA9IHRoaXMueS50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gIGlmICghdGhpcy56LnJlZClcbiAgICB0aGlzLnogPSB0aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuXG4gIHRoaXMuek9uZSA9IHRoaXMueiA9PT0gdGhpcy5jdXJ2ZS5vbmU7XG59XG5pbmhlcml0cyhKUG9pbnQsIEJhc2UuQmFzZVBvaW50KTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuanBvaW50ID0gZnVuY3Rpb24ganBvaW50KHgsIHksIHopIHtcbiAgcmV0dXJuIG5ldyBKUG9pbnQodGhpcywgeCwgeSwgeik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLnRvUCA9IGZ1bmN0aW9uIHRvUCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIHZhciB6aW52ID0gdGhpcy56LnJlZEludm0oKTtcbiAgdmFyIHppbnYyID0gemludi5yZWRTcXIoKTtcbiAgdmFyIGF4ID0gdGhpcy54LnJlZE11bCh6aW52Mik7XG4gIHZhciBheSA9IHRoaXMueS5yZWRNdWwoemludjIpLnJlZE11bCh6aW52KTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChheCwgYXkpO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcoKSB7XG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludCh0aGlzLngsIHRoaXMueS5yZWROZWcoKSwgdGhpcy56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKHApIHtcbiAgLy8gTyArIFAgPSBQXG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gcDtcblxuICAvLyBQICsgTyA9IFBcbiAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIDEyTSArIDRTICsgN0FcbiAgdmFyIHB6MiA9IHAuei5yZWRTcXIoKTtcbiAgdmFyIHoyID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgdTEgPSB0aGlzLngucmVkTXVsKHB6Mik7XG4gIHZhciB1MiA9IHAueC5yZWRNdWwoejIpO1xuICB2YXIgczEgPSB0aGlzLnkucmVkTXVsKHB6Mi5yZWRNdWwocC56KSk7XG4gIHZhciBzMiA9IHAueS5yZWRNdWwoejIucmVkTXVsKHRoaXMueikpO1xuXG4gIHZhciBoID0gdTEucmVkU3ViKHUyKTtcbiAgdmFyIHIgPSBzMS5yZWRTdWIoczIpO1xuICBpZiAoaC5jbXBuKDApID09PSAwKSB7XG4gICAgaWYgKHIuY21wbigwKSAhPT0gMClcbiAgICAgIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5kYmwoKTtcbiAgfVxuXG4gIHZhciBoMiA9IGgucmVkU3FyKCk7XG4gIHZhciBoMyA9IGgyLnJlZE11bChoKTtcbiAgdmFyIHYgPSB1MS5yZWRNdWwoaDIpO1xuXG4gIHZhciBueCA9IHIucmVkU3FyKCkucmVkSUFkZChoMykucmVkSVN1Yih2KS5yZWRJU3ViKHYpO1xuICB2YXIgbnkgPSByLnJlZE11bCh2LnJlZElTdWIobngpKS5yZWRJU3ViKHMxLnJlZE11bChoMykpO1xuICB2YXIgbnogPSB0aGlzLnoucmVkTXVsKHAueikucmVkTXVsKGgpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUubWl4ZWRBZGQgPSBmdW5jdGlvbiBtaXhlZEFkZChwKSB7XG4gIC8vIE8gKyBQID0gUFxuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHAudG9KKCk7XG5cbiAgLy8gUCArIE8gPSBQXG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyA4TSArIDNTICsgN0FcbiAgdmFyIHoyID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgdTEgPSB0aGlzLng7XG4gIHZhciB1MiA9IHAueC5yZWRNdWwoejIpO1xuICB2YXIgczEgPSB0aGlzLnk7XG4gIHZhciBzMiA9IHAueS5yZWRNdWwoejIpLnJlZE11bCh0aGlzLnopO1xuXG4gIHZhciBoID0gdTEucmVkU3ViKHUyKTtcbiAgdmFyIHIgPSBzMS5yZWRTdWIoczIpO1xuICBpZiAoaC5jbXBuKDApID09PSAwKSB7XG4gICAgaWYgKHIuY21wbigwKSAhPT0gMClcbiAgICAgIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5kYmwoKTtcbiAgfVxuXG4gIHZhciBoMiA9IGgucmVkU3FyKCk7XG4gIHZhciBoMyA9IGgyLnJlZE11bChoKTtcbiAgdmFyIHYgPSB1MS5yZWRNdWwoaDIpO1xuXG4gIHZhciBueCA9IHIucmVkU3FyKCkucmVkSUFkZChoMykucmVkSVN1Yih2KS5yZWRJU3ViKHYpO1xuICB2YXIgbnkgPSByLnJlZE11bCh2LnJlZElTdWIobngpKS5yZWRJU3ViKHMxLnJlZE11bChoMykpO1xuICB2YXIgbnogPSB0aGlzLnoucmVkTXVsKGgpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZGJscCA9IGZ1bmN0aW9uIGRibHAocG93KSB7XG4gIGlmIChwb3cgPT09IDApXG4gICAgcmV0dXJuIHRoaXM7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcbiAgaWYgKCFwb3cpXG4gICAgcmV0dXJuIHRoaXMuZGJsKCk7XG5cbiAgdmFyIGk7XG4gIGlmICh0aGlzLmN1cnZlLnplcm9BIHx8IHRoaXMuY3VydmUudGhyZWVBKSB7XG4gICAgdmFyIHIgPSB0aGlzO1xuICAgIGZvciAoaSA9IDA7IGkgPCBwb3c7IGkrKylcbiAgICAgIHIgPSByLmRibCgpO1xuICAgIHJldHVybiByO1xuICB9XG5cbiAgLy8gMU0gKyAyUyArIDFBICsgTiAqICg0UyArIDVNICsgOEEpXG4gIC8vIE4gPSAxID0+IDZNICsgNlMgKyA5QVxuICB2YXIgYSA9IHRoaXMuY3VydmUuYTtcbiAgdmFyIHRpbnYgPSB0aGlzLmN1cnZlLnRpbnY7XG5cbiAgdmFyIGp4ID0gdGhpcy54O1xuICB2YXIgankgPSB0aGlzLnk7XG4gIHZhciBqeiA9IHRoaXMuejtcbiAgdmFyIGp6NCA9IGp6LnJlZFNxcigpLnJlZFNxcigpO1xuXG4gIC8vIFJldXNlIHJlc3VsdHNcbiAgdmFyIGp5ZCA9IGp5LnJlZEFkZChqeSk7XG4gIGZvciAoaSA9IDA7IGkgPCBwb3c7IGkrKykge1xuICAgIHZhciBqeDIgPSBqeC5yZWRTcXIoKTtcbiAgICB2YXIganlkMiA9IGp5ZC5yZWRTcXIoKTtcbiAgICB2YXIganlkNCA9IGp5ZDIucmVkU3FyKCk7XG4gICAgdmFyIGMgPSBqeDIucmVkQWRkKGp4MikucmVkSUFkZChqeDIpLnJlZElBZGQoYS5yZWRNdWwoano0KSk7XG5cbiAgICB2YXIgdDEgPSBqeC5yZWRNdWwoanlkMik7XG4gICAgdmFyIG54ID0gYy5yZWRTcXIoKS5yZWRJU3ViKHQxLnJlZEFkZCh0MSkpO1xuICAgIHZhciB0MiA9IHQxLnJlZElTdWIobngpO1xuICAgIHZhciBkbnkgPSBjLnJlZE11bCh0Mik7XG4gICAgZG55ID0gZG55LnJlZElBZGQoZG55KS5yZWRJU3ViKGp5ZDQpO1xuICAgIHZhciBueiA9IGp5ZC5yZWRNdWwoanopO1xuICAgIGlmIChpICsgMSA8IHBvdylcbiAgICAgIGp6NCA9IGp6NC5yZWRNdWwoanlkNCk7XG5cbiAgICBqeCA9IG54O1xuICAgIGp6ID0gbno7XG4gICAganlkID0gZG55O1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KGp4LCBqeWQucmVkTXVsKHRpbnYpLCBqeik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIGlmICh0aGlzLmN1cnZlLnplcm9BKVxuICAgIHJldHVybiB0aGlzLl96ZXJvRGJsKCk7XG4gIGVsc2UgaWYgKHRoaXMuY3VydmUudGhyZWVBKVxuICAgIHJldHVybiB0aGlzLl90aHJlZURibCgpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuX2RibCgpO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5femVyb0RibCA9IGZ1bmN0aW9uIF96ZXJvRGJsKCkge1xuICB2YXIgbng7XG4gIHZhciBueTtcbiAgdmFyIG56O1xuICAvLyBaID0gMVxuICBpZiAodGhpcy56T25lKSB7XG4gICAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0wLmh0bWxcbiAgICAvLyAgICAgI2RvdWJsaW5nLW1kYmwtMjAwNy1ibFxuICAgIC8vIDFNICsgNVMgKyAxNEFcblxuICAgIC8vIFhYID0gWDFeMlxuICAgIHZhciB4eCA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBZWSA9IFkxXjJcbiAgICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gICAgLy8gWVlZWSA9IFlZXjJcbiAgICB2YXIgeXl5eSA9IHl5LnJlZFNxcigpO1xuICAgIC8vIFMgPSAyICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKVxuICAgIHZhciBzID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgICBzID0gcy5yZWRJQWRkKHMpO1xuICAgIC8vIE0gPSAzICogWFggKyBhOyBhID0gMFxuICAgIHZhciBtID0geHgucmVkQWRkKHh4KS5yZWRJQWRkKHh4KTtcbiAgICAvLyBUID0gTSBeIDIgLSAyKlNcbiAgICB2YXIgdCA9IG0ucmVkU3FyKCkucmVkSVN1YihzKS5yZWRJU3ViKHMpO1xuXG4gICAgLy8gOCAqIFlZWVlcbiAgICB2YXIgeXl5eTggPSB5eXl5LnJlZElBZGQoeXl5eSk7XG4gICAgeXl5eTggPSB5eXl5OC5yZWRJQWRkKHl5eXk4KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuXG4gICAgLy8gWDMgPSBUXG4gICAgbnggPSB0O1xuICAgIC8vIFkzID0gTSAqIChTIC0gVCkgLSA4ICogWVlZWVxuICAgIG55ID0gbS5yZWRNdWwocy5yZWRJU3ViKHQpKS5yZWRJU3ViKHl5eXk4KTtcbiAgICAvLyBaMyA9IDIqWTFcbiAgICBueiA9IHRoaXMueS5yZWRBZGQodGhpcy55KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbFxuICAgIC8vICAgICAjZG91YmxpbmctZGJsLTIwMDktbFxuICAgIC8vIDJNICsgNVMgKyAxM0FcblxuICAgIC8vIEEgPSBYMV4yXG4gICAgdmFyIGEgPSB0aGlzLngucmVkU3FyKCk7XG4gICAgLy8gQiA9IFkxXjJcbiAgICB2YXIgYiA9IHRoaXMueS5yZWRTcXIoKTtcbiAgICAvLyBDID0gQl4yXG4gICAgdmFyIGMgPSBiLnJlZFNxcigpO1xuICAgIC8vIEQgPSAyICogKChYMSArIEIpXjIgLSBBIC0gQylcbiAgICB2YXIgZCA9IHRoaXMueC5yZWRBZGQoYikucmVkU3FyKCkucmVkSVN1YihhKS5yZWRJU3ViKGMpO1xuICAgIGQgPSBkLnJlZElBZGQoZCk7XG4gICAgLy8gRSA9IDMgKiBBXG4gICAgdmFyIGUgPSBhLnJlZEFkZChhKS5yZWRJQWRkKGEpO1xuICAgIC8vIEYgPSBFXjJcbiAgICB2YXIgZiA9IGUucmVkU3FyKCk7XG5cbiAgICAvLyA4ICogQ1xuICAgIHZhciBjOCA9IGMucmVkSUFkZChjKTtcbiAgICBjOCA9IGM4LnJlZElBZGQoYzgpO1xuICAgIGM4ID0gYzgucmVkSUFkZChjOCk7XG5cbiAgICAvLyBYMyA9IEYgLSAyICogRFxuICAgIG54ID0gZi5yZWRJU3ViKGQpLnJlZElTdWIoZCk7XG4gICAgLy8gWTMgPSBFICogKEQgLSBYMykgLSA4ICogQ1xuICAgIG55ID0gZS5yZWRNdWwoZC5yZWRJU3ViKG54KSkucmVkSVN1YihjOCk7XG4gICAgLy8gWjMgPSAyICogWTEgKiBaMVxuICAgIG56ID0gdGhpcy55LnJlZE11bCh0aGlzLnopO1xuICAgIG56ID0gbnoucmVkSUFkZChueik7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl90aHJlZURibCA9IGZ1bmN0aW9uIF90aHJlZURibCgpIHtcbiAgdmFyIG54O1xuICB2YXIgbnk7XG4gIHZhciBuejtcbiAgLy8gWiA9IDFcbiAgaWYgKHRoaXMuek9uZSkge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMy5odG1sXG4gICAgLy8gICAgICNkb3VibGluZy1tZGJsLTIwMDctYmxcbiAgICAvLyAxTSArIDVTICsgMTVBXG5cbiAgICAvLyBYWCA9IFgxXjJcbiAgICB2YXIgeHggPSB0aGlzLngucmVkU3FyKCk7XG4gICAgLy8gWVkgPSBZMV4yXG4gICAgdmFyIHl5ID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIFlZWVkgPSBZWV4yXG4gICAgdmFyIHl5eXkgPSB5eS5yZWRTcXIoKTtcbiAgICAvLyBTID0gMiAqICgoWDEgKyBZWSleMiAtIFhYIC0gWVlZWSlcbiAgICB2YXIgcyA9IHRoaXMueC5yZWRBZGQoeXkpLnJlZFNxcigpLnJlZElTdWIoeHgpLnJlZElTdWIoeXl5eSk7XG4gICAgcyA9IHMucmVkSUFkZChzKTtcbiAgICAvLyBNID0gMyAqIFhYICsgYVxuICAgIHZhciBtID0geHgucmVkQWRkKHh4KS5yZWRJQWRkKHh4KS5yZWRJQWRkKHRoaXMuY3VydmUuYSk7XG4gICAgLy8gVCA9IE1eMiAtIDIgKiBTXG4gICAgdmFyIHQgPSBtLnJlZFNxcigpLnJlZElTdWIocykucmVkSVN1YihzKTtcbiAgICAvLyBYMyA9IFRcbiAgICBueCA9IHQ7XG4gICAgLy8gWTMgPSBNICogKFMgLSBUKSAtIDggKiBZWVlZXG4gICAgdmFyIHl5eXk4ID0geXl5eS5yZWRJQWRkKHl5eXkpO1xuICAgIHl5eXk4ID0geXl5eTgucmVkSUFkZCh5eXl5OCk7XG4gICAgeXl5eTggPSB5eXl5OC5yZWRJQWRkKHl5eXk4KTtcbiAgICBueSA9IG0ucmVkTXVsKHMucmVkSVN1Yih0KSkucmVkSVN1Yih5eXl5OCk7XG4gICAgLy8gWjMgPSAyICogWTFcbiAgICBueiA9IHRoaXMueS5yZWRBZGQodGhpcy55KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTMuaHRtbCNkb3VibGluZy1kYmwtMjAwMS1iXG4gICAgLy8gM00gKyA1U1xuXG4gICAgLy8gZGVsdGEgPSBaMV4yXG4gICAgdmFyIGRlbHRhID0gdGhpcy56LnJlZFNxcigpO1xuICAgIC8vIGdhbW1hID0gWTFeMlxuICAgIHZhciBnYW1tYSA9IHRoaXMueS5yZWRTcXIoKTtcbiAgICAvLyBiZXRhID0gWDEgKiBnYW1tYVxuICAgIHZhciBiZXRhID0gdGhpcy54LnJlZE11bChnYW1tYSk7XG4gICAgLy8gYWxwaGEgPSAzICogKFgxIC0gZGVsdGEpICogKFgxICsgZGVsdGEpXG4gICAgdmFyIGFscGhhID0gdGhpcy54LnJlZFN1YihkZWx0YSkucmVkTXVsKHRoaXMueC5yZWRBZGQoZGVsdGEpKTtcbiAgICBhbHBoYSA9IGFscGhhLnJlZEFkZChhbHBoYSkucmVkSUFkZChhbHBoYSk7XG4gICAgLy8gWDMgPSBhbHBoYV4yIC0gOCAqIGJldGFcbiAgICB2YXIgYmV0YTQgPSBiZXRhLnJlZElBZGQoYmV0YSk7XG4gICAgYmV0YTQgPSBiZXRhNC5yZWRJQWRkKGJldGE0KTtcbiAgICB2YXIgYmV0YTggPSBiZXRhNC5yZWRBZGQoYmV0YTQpO1xuICAgIG54ID0gYWxwaGEucmVkU3FyKCkucmVkSVN1YihiZXRhOCk7XG4gICAgLy8gWjMgPSAoWTEgKyBaMSleMiAtIGdhbW1hIC0gZGVsdGFcbiAgICBueiA9IHRoaXMueS5yZWRBZGQodGhpcy56KS5yZWRTcXIoKS5yZWRJU3ViKGdhbW1hKS5yZWRJU3ViKGRlbHRhKTtcbiAgICAvLyBZMyA9IGFscGhhICogKDQgKiBiZXRhIC0gWDMpIC0gOCAqIGdhbW1hXjJcbiAgICB2YXIgZ2dhbW1hOCA9IGdhbW1hLnJlZFNxcigpO1xuICAgIGdnYW1tYTggPSBnZ2FtbWE4LnJlZElBZGQoZ2dhbW1hOCk7XG4gICAgZ2dhbW1hOCA9IGdnYW1tYTgucmVkSUFkZChnZ2FtbWE4KTtcbiAgICBnZ2FtbWE4ID0gZ2dhbW1hOC5yZWRJQWRkKGdnYW1tYTgpO1xuICAgIG55ID0gYWxwaGEucmVkTXVsKGJldGE0LnJlZElTdWIobngpKS5yZWRJU3ViKGdnYW1tYTgpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5fZGJsID0gZnVuY3Rpb24gX2RibCgpIHtcbiAgdmFyIGEgPSB0aGlzLmN1cnZlLmE7XG5cbiAgLy8gNE0gKyA2UyArIDEwQVxuICB2YXIganggPSB0aGlzLng7XG4gIHZhciBqeSA9IHRoaXMueTtcbiAgdmFyIGp6ID0gdGhpcy56O1xuICB2YXIgano0ID0ganoucmVkU3FyKCkucmVkU3FyKCk7XG5cbiAgdmFyIGp4MiA9IGp4LnJlZFNxcigpO1xuICB2YXIgankyID0gankucmVkU3FyKCk7XG5cbiAgdmFyIGMgPSBqeDIucmVkQWRkKGp4MikucmVkSUFkZChqeDIpLnJlZElBZGQoYS5yZWRNdWwoano0KSk7XG5cbiAgdmFyIGp4ZDQgPSBqeC5yZWRBZGQoangpO1xuICBqeGQ0ID0ganhkNC5yZWRJQWRkKGp4ZDQpO1xuICB2YXIgdDEgPSBqeGQ0LnJlZE11bChqeTIpO1xuICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodDEucmVkQWRkKHQxKSk7XG4gIHZhciB0MiA9IHQxLnJlZElTdWIobngpO1xuXG4gIHZhciBqeWQ4ID0gankyLnJlZFNxcigpO1xuICBqeWQ4ID0ganlkOC5yZWRJQWRkKGp5ZDgpO1xuICBqeWQ4ID0ganlkOC5yZWRJQWRkKGp5ZDgpO1xuICBqeWQ4ID0ganlkOC5yZWRJQWRkKGp5ZDgpO1xuICB2YXIgbnkgPSBjLnJlZE11bCh0MikucmVkSVN1YihqeWQ4KTtcbiAgdmFyIG56ID0gankucmVkQWRkKGp5KS5yZWRNdWwoanopO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUudHJwbCA9IGZ1bmN0aW9uIHRycGwoKSB7XG4gIGlmICghdGhpcy5jdXJ2ZS56ZXJvQSlcbiAgICByZXR1cm4gdGhpcy5kYmwoKS5hZGQodGhpcyk7XG5cbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0wLmh0bWwjdHJpcGxpbmctdHBsLTIwMDctYmxcbiAgLy8gNU0gKyAxMFMgKyAuLi5cblxuICAvLyBYWCA9IFgxXjJcbiAgdmFyIHh4ID0gdGhpcy54LnJlZFNxcigpO1xuICAvLyBZWSA9IFkxXjJcbiAgdmFyIHl5ID0gdGhpcy55LnJlZFNxcigpO1xuICAvLyBaWiA9IFoxXjJcbiAgdmFyIHp6ID0gdGhpcy56LnJlZFNxcigpO1xuICAvLyBZWVlZID0gWVleMlxuICB2YXIgeXl5eSA9IHl5LnJlZFNxcigpO1xuICAvLyBNID0gMyAqIFhYICsgYSAqIFpaMjsgYSA9IDBcbiAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpO1xuICAvLyBNTSA9IE1eMlxuICB2YXIgbW0gPSBtLnJlZFNxcigpO1xuICAvLyBFID0gNiAqICgoWDEgKyBZWSleMiAtIFhYIC0gWVlZWSkgLSBNTVxuICB2YXIgZSA9IHRoaXMueC5yZWRBZGQoeXkpLnJlZFNxcigpLnJlZElTdWIoeHgpLnJlZElTdWIoeXl5eSk7XG4gIGUgPSBlLnJlZElBZGQoZSk7XG4gIGUgPSBlLnJlZEFkZChlKS5yZWRJQWRkKGUpO1xuICBlID0gZS5yZWRJU3ViKG1tKTtcbiAgLy8gRUUgPSBFXjJcbiAgdmFyIGVlID0gZS5yZWRTcXIoKTtcbiAgLy8gVCA9IDE2KllZWVlcbiAgdmFyIHQgPSB5eXl5LnJlZElBZGQoeXl5eSk7XG4gIHQgPSB0LnJlZElBZGQodCk7XG4gIHQgPSB0LnJlZElBZGQodCk7XG4gIHQgPSB0LnJlZElBZGQodCk7XG4gIC8vIFUgPSAoTSArIEUpXjIgLSBNTSAtIEVFIC0gVFxuICB2YXIgdSA9IG0ucmVkSUFkZChlKS5yZWRTcXIoKS5yZWRJU3ViKG1tKS5yZWRJU3ViKGVlKS5yZWRJU3ViKHQpO1xuICAvLyBYMyA9IDQgKiAoWDEgKiBFRSAtIDQgKiBZWSAqIFUpXG4gIHZhciB5eXU0ID0geXkucmVkTXVsKHUpO1xuICB5eXU0ID0geXl1NC5yZWRJQWRkKHl5dTQpO1xuICB5eXU0ID0geXl1NC5yZWRJQWRkKHl5dTQpO1xuICB2YXIgbnggPSB0aGlzLngucmVkTXVsKGVlKS5yZWRJU3ViKHl5dTQpO1xuICBueCA9IG54LnJlZElBZGQobngpO1xuICBueCA9IG54LnJlZElBZGQobngpO1xuICAvLyBZMyA9IDggKiBZMSAqIChVICogKFQgLSBVKSAtIEUgKiBFRSlcbiAgdmFyIG55ID0gdGhpcy55LnJlZE11bCh1LnJlZE11bCh0LnJlZElTdWIodSkpLnJlZElTdWIoZS5yZWRNdWwoZWUpKSk7XG4gIG55ID0gbnkucmVkSUFkZChueSk7XG4gIG55ID0gbnkucmVkSUFkZChueSk7XG4gIG55ID0gbnkucmVkSUFkZChueSk7XG4gIC8vIFozID0gKFoxICsgRSleMiAtIFpaIC0gRUVcbiAgdmFyIG56ID0gdGhpcy56LnJlZEFkZChlKS5yZWRTcXIoKS5yZWRJU3ViKHp6KS5yZWRJU3ViKGVlKTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrLCBrYmFzZSkge1xuICBrID0gbmV3IEJOKGssIGtiYXNlKTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bCh0aGlzLCBrKTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShwKSB7XG4gIGlmIChwLnR5cGUgPT09ICdhZmZpbmUnKVxuICAgIHJldHVybiB0aGlzLmVxKHAudG9KKCkpO1xuXG4gIGlmICh0aGlzID09PSBwKVxuICAgIHJldHVybiB0cnVlO1xuXG4gIC8vIHgxICogejJeMiA9PSB4MiAqIHoxXjJcbiAgdmFyIHoyID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgcHoyID0gcC56LnJlZFNxcigpO1xuICBpZiAodGhpcy54LnJlZE11bChwejIpLnJlZElTdWIocC54LnJlZE11bCh6MikpLmNtcG4oMCkgIT09IDApXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIHkxICogejJeMyA9PSB5MiAqIHoxXjNcbiAgdmFyIHozID0gejIucmVkTXVsKHRoaXMueik7XG4gIHZhciBwejMgPSBwejIucmVkTXVsKHAueik7XG4gIHJldHVybiB0aGlzLnkucmVkTXVsKHB6MykucmVkSVN1YihwLnkucmVkTXVsKHozKSkuY21wbigwKSA9PT0gMDtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZXFYVG9QID0gZnVuY3Rpb24gZXFYVG9QKHgpIHtcbiAgdmFyIHpzID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgcnggPSB4LnRvUmVkKHRoaXMuY3VydmUucmVkKS5yZWRNdWwoenMpO1xuICBpZiAodGhpcy54LmNtcChyeCkgPT09IDApXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgdmFyIHhjID0geC5jbG9uZSgpO1xuICB2YXIgdCA9IHRoaXMuY3VydmUucmVkTi5yZWRNdWwoenMpO1xuICBmb3IgKDs7KSB7XG4gICAgeGMuaWFkZCh0aGlzLmN1cnZlLm4pO1xuICAgIGlmICh4Yy5jbXAodGhpcy5jdXJ2ZS5wKSA+PSAwKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgcngucmVkSUFkZCh0KTtcbiAgICBpZiAodGhpcy54LmNtcChyeCkgPT09IDApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuSlBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIEpQb2ludCBJbmZpbml0eT4nO1xuICByZXR1cm4gJzxFQyBKUG9pbnQgeDogJyArIHRoaXMueC50b1N0cmluZygxNiwgMikgK1xuICAgICAgJyB5OiAnICsgdGhpcy55LnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHo6ICcgKyB0aGlzLnoudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgLy8gWFhYIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgemVybyBpcyBhbHdheXMgemVybyBpbiByZWRcbiAgcmV0dXJuIHRoaXMuei5jbXBuKDApID09PSAwO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbnZhciBCYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIE1vbnRDdXJ2ZShjb25mKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCAnbW9udCcsIGNvbmYpO1xuXG4gIHRoaXMuYSA9IG5ldyBCTihjb25mLmEsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYiA9IG5ldyBCTihjb25mLmIsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuaTQgPSBuZXcgQk4oNCkudG9SZWQodGhpcy5yZWQpLnJlZEludm0oKTtcbiAgdGhpcy50d28gPSBuZXcgQk4oMikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmEyNCA9IHRoaXMuaTQucmVkTXVsKHRoaXMuYS5yZWRBZGQodGhpcy50d28pKTtcbn1cbmluaGVyaXRzKE1vbnRDdXJ2ZSwgQmFzZSk7XG5tb2R1bGUuZXhwb3J0cyA9IE1vbnRDdXJ2ZTtcblxuTW9udEN1cnZlLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHBvaW50KSB7XG4gIHZhciB4ID0gcG9pbnQubm9ybWFsaXplKCkueDtcbiAgdmFyIHgyID0geC5yZWRTcXIoKTtcbiAgdmFyIHJocyA9IHgyLnJlZE11bCh4KS5yZWRBZGQoeDIucmVkTXVsKHRoaXMuYSkpLnJlZEFkZCh4KTtcbiAgdmFyIHkgPSByaHMucmVkU3FydCgpO1xuXG4gIHJldHVybiB5LnJlZFNxcigpLmNtcChyaHMpID09PSAwO1xufTtcblxuZnVuY3Rpb24gUG9pbnQoY3VydmUsIHgsIHopIHtcbiAgQmFzZS5CYXNlUG9pbnQuY2FsbCh0aGlzLCBjdXJ2ZSwgJ3Byb2plY3RpdmUnKTtcbiAgaWYgKHggPT09IG51bGwgJiYgeiA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMueiA9IHRoaXMuY3VydmUuemVybztcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSBuZXcgQk4oeCwgMTYpO1xuICAgIHRoaXMueiA9IG5ldyBCTih6LCAxNik7XG4gICAgaWYgKCF0aGlzLngucmVkKVxuICAgICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMuei5yZWQpXG4gICAgICB0aGlzLnogPSB0aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICB9XG59XG5pbmhlcml0cyhQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5Nb250Q3VydmUucHJvdG90eXBlLmRlY29kZVBvaW50ID0gZnVuY3Rpb24gZGVjb2RlUG9pbnQoYnl0ZXMsIGVuYykge1xuICByZXR1cm4gdGhpcy5wb2ludCh1dGlscy50b0FycmF5KGJ5dGVzLCBlbmMpLCAxKTtcbn07XG5cbk1vbnRDdXJ2ZS5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbiBwb2ludCh4LCB6KSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcywgeCwgeik7XG59O1xuXG5Nb250Q3VydmUucHJvdG90eXBlLnBvaW50RnJvbUpTT04gPSBmdW5jdGlvbiBwb2ludEZyb21KU09OKG9iaikge1xuICByZXR1cm4gUG9pbnQuZnJvbUpTT04odGhpcywgb2JqKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5wcmVjb21wdXRlID0gZnVuY3Rpb24gcHJlY29tcHV0ZSgpIHtcbiAgLy8gTm8tb3Bcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZW5jb2RlID0gZnVuY3Rpb24gX2VuY29kZSgpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0WCgpLnRvQXJyYXkoJ2JlJywgdGhpcy5jdXJ2ZS5wLmJ5dGVMZW5ndGgoKSk7XG59O1xuXG5Qb2ludC5mcm9tSlNPTiA9IGZ1bmN0aW9uIGZyb21KU09OKGN1cnZlLCBvYmopIHtcbiAgcmV0dXJuIG5ldyBQb2ludChjdXJ2ZSwgb2JqWzBdLCBvYmpbMV0gfHwgY3VydmUub25lKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHo6ICcgKyB0aGlzLnouZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgLy8gWFhYIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgemVybyBpcyBhbHdheXMgemVybyBpbiByZWRcbiAgcmV0dXJuIHRoaXMuei5jbXBuKDApID09PSAwO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgLy8gaHR0cDovL2h5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1tb250Z29tLXh6Lmh0bWwjZG91YmxpbmctZGJsLTE5ODctbS0zXG4gIC8vIDJNICsgMlMgKyA0QVxuXG4gIC8vIEEgPSBYMSArIFoxXG4gIHZhciBhID0gdGhpcy54LnJlZEFkZCh0aGlzLnopO1xuICAvLyBBQSA9IEFeMlxuICB2YXIgYWEgPSBhLnJlZFNxcigpO1xuICAvLyBCID0gWDEgLSBaMVxuICB2YXIgYiA9IHRoaXMueC5yZWRTdWIodGhpcy56KTtcbiAgLy8gQkIgPSBCXjJcbiAgdmFyIGJiID0gYi5yZWRTcXIoKTtcbiAgLy8gQyA9IEFBIC0gQkJcbiAgdmFyIGMgPSBhYS5yZWRTdWIoYmIpO1xuICAvLyBYMyA9IEFBICogQkJcbiAgdmFyIG54ID0gYWEucmVkTXVsKGJiKTtcbiAgLy8gWjMgPSBDICogKEJCICsgQTI0ICogQylcbiAgdmFyIG56ID0gYy5yZWRNdWwoYmIucmVkQWRkKHRoaXMuY3VydmUuYTI0LnJlZE11bChjKSkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUnKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kaWZmQWRkID0gZnVuY3Rpb24gZGlmZkFkZChwLCBkaWZmKSB7XG4gIC8vIGh0dHA6Ly9oeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tbW9udGdvbS14ei5odG1sI2RpZmZhZGQtZGFkZC0xOTg3LW0tM1xuICAvLyA0TSArIDJTICsgNkFcblxuICAvLyBBID0gWDIgKyBaMlxuICB2YXIgYSA9IHRoaXMueC5yZWRBZGQodGhpcy56KTtcbiAgLy8gQiA9IFgyIC0gWjJcbiAgdmFyIGIgPSB0aGlzLngucmVkU3ViKHRoaXMueik7XG4gIC8vIEMgPSBYMyArIFozXG4gIHZhciBjID0gcC54LnJlZEFkZChwLnopO1xuICAvLyBEID0gWDMgLSBaM1xuICB2YXIgZCA9IHAueC5yZWRTdWIocC56KTtcbiAgLy8gREEgPSBEICogQVxuICB2YXIgZGEgPSBkLnJlZE11bChhKTtcbiAgLy8gQ0IgPSBDICogQlxuICB2YXIgY2IgPSBjLnJlZE11bChiKTtcbiAgLy8gWDUgPSBaMSAqIChEQSArIENCKV4yXG4gIHZhciBueCA9IGRpZmYuei5yZWRNdWwoZGEucmVkQWRkKGNiKS5yZWRTcXIoKSk7XG4gIC8vIFo1ID0gWDEgKiAoREEgLSBDQileMlxuICB2YXIgbnogPSBkaWZmLngucmVkTXVsKGRhLnJlZElTdWIoY2IpLnJlZFNxcigpKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG56KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwoaykge1xuICB2YXIgdCA9IGsuY2xvbmUoKTtcbiAgdmFyIGEgPSB0aGlzOyAvLyAoTiAvIDIpICogUSArIFFcbiAgdmFyIGIgPSB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpOyAvLyAoTiAvIDIpICogUVxuICB2YXIgYyA9IHRoaXM7IC8vIFFcblxuICBmb3IgKHZhciBiaXRzID0gW107IHQuY21wbigwKSAhPT0gMDsgdC5pdXNocm4oMSkpXG4gICAgYml0cy5wdXNoKHQuYW5kbG4oMSkpO1xuXG4gIGZvciAodmFyIGkgPSBiaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGJpdHNbaV0gPT09IDApIHtcbiAgICAgIC8vIE4gKiBRICsgUSA9ICgoTiAvIDIpICogUSArIFEpKSArIChOIC8gMikgKiBRXG4gICAgICBhID0gYS5kaWZmQWRkKGIsIGMpO1xuICAgICAgLy8gTiAqIFEgPSAyICogKChOIC8gMikgKiBRICsgUSkpXG4gICAgICBiID0gYi5kYmwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTiAqIFEgPSAoKE4gLyAyKSAqIFEgKyBRKSArICgoTiAvIDIpICogUSlcbiAgICAgIGIgPSBhLmRpZmZBZGQoYiwgYyk7XG4gICAgICAvLyBOICogUSArIFEgPSAyICogKChOIC8gMikgKiBRICsgUSlcbiAgICAgIGEgPSBhLmRibCgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYjtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWxBZGQgPSBmdW5jdGlvbiBtdWxBZGQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlJyk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuanVtbEFkZCA9IGZ1bmN0aW9uIGp1bWxBZGQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlJyk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShvdGhlcikge1xuICByZXR1cm4gdGhpcy5nZXRYKCkuY21wKG90aGVyLmdldFgoKSkgPT09IDA7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKCkge1xuICB0aGlzLnggPSB0aGlzLngucmVkTXVsKHRoaXMuei5yZWRJbnZtKCkpO1xuICB0aGlzLnogPSB0aGlzLmN1cnZlLm9uZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uIGdldFgoKSB7XG4gIC8vIE5vcm1hbGl6ZSBjb29yZGluYXRlc1xuICB0aGlzLm5vcm1hbGl6ZSgpO1xuXG4gIHJldHVybiB0aGlzLnguZnJvbVJlZCgpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xuXG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBFZHdhcmRzQ3VydmUoY29uZikge1xuICAvLyBOT1RFOiBJbXBvcnRhbnQgYXMgd2UgYXJlIGNyZWF0aW5nIHBvaW50IGluIEJhc2UuY2FsbCgpXG4gIHRoaXMudHdpc3RlZCA9IChjb25mLmEgfCAwKSAhPT0gMTtcbiAgdGhpcy5tT25lQSA9IHRoaXMudHdpc3RlZCAmJiAoY29uZi5hIHwgMCkgPT09IC0xO1xuICB0aGlzLmV4dGVuZGVkID0gdGhpcy5tT25lQTtcblxuICBCYXNlLmNhbGwodGhpcywgJ2Vkd2FyZHMnLCBjb25mKTtcblxuICB0aGlzLmEgPSBuZXcgQk4oY29uZi5hLCAxNikudW1vZCh0aGlzLnJlZC5tKTtcbiAgdGhpcy5hID0gdGhpcy5hLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5jID0gbmV3IEJOKGNvbmYuYywgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5jMiA9IHRoaXMuYy5yZWRTcXIoKTtcbiAgdGhpcy5kID0gbmV3IEJOKGNvbmYuZCwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5kZCA9IHRoaXMuZC5yZWRBZGQodGhpcy5kKTtcblxuICBhc3NlcnQoIXRoaXMudHdpc3RlZCB8fCB0aGlzLmMuZnJvbVJlZCgpLmNtcG4oMSkgPT09IDApO1xuICB0aGlzLm9uZUMgPSAoY29uZi5jIHwgMCkgPT09IDE7XG59XG5pbmhlcml0cyhFZHdhcmRzQ3VydmUsIEJhc2UpO1xubW9kdWxlLmV4cG9ydHMgPSBFZHdhcmRzQ3VydmU7XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuX211bEEgPSBmdW5jdGlvbiBfbXVsQShudW0pIHtcbiAgaWYgKHRoaXMubU9uZUEpXG4gICAgcmV0dXJuIG51bS5yZWROZWcoKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmEucmVkTXVsKG51bSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLl9tdWxDID0gZnVuY3Rpb24gX211bEMobnVtKSB7XG4gIGlmICh0aGlzLm9uZUMpXG4gICAgcmV0dXJuIG51bTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmMucmVkTXVsKG51bSk7XG59O1xuXG4vLyBKdXN0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggU2hvcnQgY3VydmVcbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuanBvaW50ID0gZnVuY3Rpb24ganBvaW50KHgsIHksIHosIHQpIHtcbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSwgeiwgdCk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50RnJvbVggPSBmdW5jdGlvbiBwb2ludEZyb21YKHgsIG9kZCkge1xuICB4ID0gbmV3IEJOKHgsIDE2KTtcbiAgaWYgKCF4LnJlZClcbiAgICB4ID0geC50b1JlZCh0aGlzLnJlZCk7XG5cbiAgdmFyIHgyID0geC5yZWRTcXIoKTtcbiAgdmFyIHJocyA9IHRoaXMuYzIucmVkU3ViKHRoaXMuYS5yZWRNdWwoeDIpKTtcbiAgdmFyIGxocyA9IHRoaXMub25lLnJlZFN1Yih0aGlzLmMyLnJlZE11bCh0aGlzLmQpLnJlZE11bCh4MikpO1xuXG4gIHZhciB5MiA9IHJocy5yZWRNdWwobGhzLnJlZEludm0oKSk7XG4gIHZhciB5ID0geTIucmVkU3FydCgpO1xuICBpZiAoeS5yZWRTcXIoKS5yZWRTdWIoeTIpLmNtcCh0aGlzLnplcm8pICE9PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuXG4gIHZhciBpc09kZCA9IHkuZnJvbVJlZCgpLmlzT2RkKCk7XG4gIGlmIChvZGQgJiYgIWlzT2RkIHx8ICFvZGQgJiYgaXNPZGQpXG4gICAgeSA9IHkucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50RnJvbVkgPSBmdW5jdGlvbiBwb2ludEZyb21ZKHksIG9kZCkge1xuICB5ID0gbmV3IEJOKHksIDE2KTtcbiAgaWYgKCF5LnJlZClcbiAgICB5ID0geS50b1JlZCh0aGlzLnJlZCk7XG5cbiAgLy8geF4yID0gKHleMiAtIGNeMikgLyAoY14yIGQgeV4yIC0gYSlcbiAgdmFyIHkyID0geS5yZWRTcXIoKTtcbiAgdmFyIGxocyA9IHkyLnJlZFN1Yih0aGlzLmMyKTtcbiAgdmFyIHJocyA9IHkyLnJlZE11bCh0aGlzLmQpLnJlZE11bCh0aGlzLmMyKS5yZWRTdWIodGhpcy5hKTtcbiAgdmFyIHgyID0gbGhzLnJlZE11bChyaHMucmVkSW52bSgpKTtcblxuICBpZiAoeDIuY21wKHRoaXMuemVybykgPT09IDApIHtcbiAgICBpZiAob2RkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBvaW50Jyk7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHRoaXMucG9pbnQodGhpcy56ZXJvLCB5KTtcbiAgfVxuXG4gIHZhciB4ID0geDIucmVkU3FydCgpO1xuICBpZiAoeC5yZWRTcXIoKS5yZWRTdWIoeDIpLmNtcCh0aGlzLnplcm8pICE9PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuXG4gIGlmICh4LmZyb21SZWQoKS5pc09kZCgpICE9PSBvZGQpXG4gICAgeCA9IHgucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpIHtcbiAgaWYgKHBvaW50LmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdHJ1ZTtcblxuICAvLyBDdXJ2ZTogQSAqIFheMiArIFleMiA9IENeMiAqICgxICsgRCAqIFheMiAqIFleMilcbiAgcG9pbnQubm9ybWFsaXplKCk7XG5cbiAgdmFyIHgyID0gcG9pbnQueC5yZWRTcXIoKTtcbiAgdmFyIHkyID0gcG9pbnQueS5yZWRTcXIoKTtcbiAgdmFyIGxocyA9IHgyLnJlZE11bCh0aGlzLmEpLnJlZEFkZCh5Mik7XG4gIHZhciByaHMgPSB0aGlzLmMyLnJlZE11bCh0aGlzLm9uZS5yZWRBZGQodGhpcy5kLnJlZE11bCh4MikucmVkTXVsKHkyKSkpO1xuXG4gIHJldHVybiBsaHMuY21wKHJocykgPT09IDA7XG59O1xuXG5mdW5jdGlvbiBQb2ludChjdXJ2ZSwgeCwgeSwgeiwgdCkge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAncHJvamVjdGl2ZScpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB5ID09PSBudWxsICYmIHogPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSB0aGlzLmN1cnZlLnplcm87XG4gICAgdGhpcy55ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy56ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy50ID0gdGhpcy5jdXJ2ZS56ZXJvO1xuICAgIHRoaXMuek9uZSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0gbmV3IEJOKHgsIDE2KTtcbiAgICB0aGlzLnkgPSBuZXcgQk4oeSwgMTYpO1xuICAgIHRoaXMueiA9IHogPyBuZXcgQk4oeiwgMTYpIDogdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy50ID0gdCAmJiBuZXcgQk4odCwgMTYpO1xuICAgIGlmICghdGhpcy54LnJlZClcbiAgICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKCF0aGlzLnkucmVkKVxuICAgICAgdGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMuei5yZWQpXG4gICAgICB0aGlzLnogPSB0aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICh0aGlzLnQgJiYgIXRoaXMudC5yZWQpXG4gICAgICB0aGlzLnQgPSB0aGlzLnQudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIHRoaXMuek9uZSA9IHRoaXMueiA9PT0gdGhpcy5jdXJ2ZS5vbmU7XG5cbiAgICAvLyBVc2UgZXh0ZW5kZWQgY29vcmRpbmF0ZXNcbiAgICBpZiAodGhpcy5jdXJ2ZS5leHRlbmRlZCAmJiAhdGhpcy50KSB7XG4gICAgICB0aGlzLnQgPSB0aGlzLngucmVkTXVsKHRoaXMueSk7XG4gICAgICBpZiAoIXRoaXMuek9uZSlcbiAgICAgICAgdGhpcy50ID0gdGhpcy50LnJlZE11bCh0aGlzLnoucmVkSW52bSgpKTtcbiAgICB9XG4gIH1cbn1cbmluaGVyaXRzKFBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uIHBvaW50RnJvbUpTT04ob2JqKSB7XG4gIHJldHVybiBQb2ludC5mcm9tSlNPTih0aGlzLCBvYmopO1xufTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KHgsIHksIHosIHQpIHtcbiAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLCB4LCB5LCB6LCB0KTtcbn07XG5cblBvaW50LmZyb21KU09OID0gZnVuY3Rpb24gZnJvbUpTT04oY3VydmUsIG9iaikge1xuICByZXR1cm4gbmV3IFBvaW50KGN1cnZlLCBvYmpbMF0sIG9ialsxXSwgb2JqWzJdKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkuZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHo6ICcgKyB0aGlzLnouZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgLy8gWFhYIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgemVybyBpcyBhbHdheXMgemVybyBpbiByZWRcbiAgcmV0dXJuIHRoaXMueC5jbXBuKDApID09PSAwICYmXG4gICAgKHRoaXMueS5jbXAodGhpcy56KSA9PT0gMCB8fFxuICAgICh0aGlzLnpPbmUgJiYgdGhpcy55LmNtcCh0aGlzLmN1cnZlLmMpID09PSAwKSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuX2V4dERibCA9IGZ1bmN0aW9uIF9leHREYmwoKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLWV4dGVuZGVkLTEuaHRtbFxuICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA4LWh3Y2RcbiAgLy8gNE0gKyA0U1xuXG4gIC8vIEEgPSBYMV4yXG4gIHZhciBhID0gdGhpcy54LnJlZFNxcigpO1xuICAvLyBCID0gWTFeMlxuICB2YXIgYiA9IHRoaXMueS5yZWRTcXIoKTtcbiAgLy8gQyA9IDIgKiBaMV4yXG4gIHZhciBjID0gdGhpcy56LnJlZFNxcigpO1xuICBjID0gYy5yZWRJQWRkKGMpO1xuICAvLyBEID0gYSAqIEFcbiAgdmFyIGQgPSB0aGlzLmN1cnZlLl9tdWxBKGEpO1xuICAvLyBFID0gKFgxICsgWTEpXjIgLSBBIC0gQlxuICB2YXIgZSA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKS5yZWRJU3ViKGEpLnJlZElTdWIoYik7XG4gIC8vIEcgPSBEICsgQlxuICB2YXIgZyA9IGQucmVkQWRkKGIpO1xuICAvLyBGID0gRyAtIENcbiAgdmFyIGYgPSBnLnJlZFN1YihjKTtcbiAgLy8gSCA9IEQgLSBCXG4gIHZhciBoID0gZC5yZWRTdWIoYik7XG4gIC8vIFgzID0gRSAqIEZcbiAgdmFyIG54ID0gZS5yZWRNdWwoZik7XG4gIC8vIFkzID0gRyAqIEhcbiAgdmFyIG55ID0gZy5yZWRNdWwoaCk7XG4gIC8vIFQzID0gRSAqIEhcbiAgdmFyIG50ID0gZS5yZWRNdWwoaCk7XG4gIC8vIFozID0gRiAqIEdcbiAgdmFyIG56ID0gZi5yZWRNdWwoZyk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnosIG50KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fcHJvakRibCA9IGZ1bmN0aW9uIF9wcm9qRGJsKCkge1xuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tdHdpc3RlZC1wcm9qZWN0aXZlLmh0bWxcbiAgLy8gICAgICNkb3VibGluZy1kYmwtMjAwOC1iYmpscFxuICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA3LWJsXG4gIC8vIGFuZCBvdGhlcnNcbiAgLy8gR2VuZXJhbGx5IDNNICsgNFMgb3IgMk0gKyA0U1xuXG4gIC8vIEIgPSAoWDEgKyBZMSleMlxuICB2YXIgYiA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKTtcbiAgLy8gQyA9IFgxXjJcbiAgdmFyIGMgPSB0aGlzLngucmVkU3FyKCk7XG4gIC8vIEQgPSBZMV4yXG4gIHZhciBkID0gdGhpcy55LnJlZFNxcigpO1xuXG4gIHZhciBueDtcbiAgdmFyIG55O1xuICB2YXIgbno7XG4gIHZhciBlO1xuICB2YXIgaDtcbiAgdmFyIGo7XG4gIGlmICh0aGlzLmN1cnZlLnR3aXN0ZWQpIHtcbiAgICAvLyBFID0gYSAqIENcbiAgICBlID0gdGhpcy5jdXJ2ZS5fbXVsQShjKTtcbiAgICAvLyBGID0gRSArIERcbiAgICB2YXIgZiA9IGUucmVkQWRkKGQpO1xuICAgIGlmICh0aGlzLnpPbmUpIHtcbiAgICAgIC8vIFgzID0gKEIgLSBDIC0gRCkgKiAoRiAtIDIpXG4gICAgICBueCA9IGIucmVkU3ViKGMpLnJlZFN1YihkKS5yZWRNdWwoZi5yZWRTdWIodGhpcy5jdXJ2ZS50d28pKTtcbiAgICAgIC8vIFkzID0gRiAqIChFIC0gRClcbiAgICAgIG55ID0gZi5yZWRNdWwoZS5yZWRTdWIoZCkpO1xuICAgICAgLy8gWjMgPSBGXjIgLSAyICogRlxuICAgICAgbnogPSBmLnJlZFNxcigpLnJlZFN1YihmKS5yZWRTdWIoZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEggPSBaMV4yXG4gICAgICBoID0gdGhpcy56LnJlZFNxcigpO1xuICAgICAgLy8gSiA9IEYgLSAyICogSFxuICAgICAgaiA9IGYucmVkU3ViKGgpLnJlZElTdWIoaCk7XG4gICAgICAvLyBYMyA9IChCLUMtRCkqSlxuICAgICAgbnggPSBiLnJlZFN1YihjKS5yZWRJU3ViKGQpLnJlZE11bChqKTtcbiAgICAgIC8vIFkzID0gRiAqIChFIC0gRClcbiAgICAgIG55ID0gZi5yZWRNdWwoZS5yZWRTdWIoZCkpO1xuICAgICAgLy8gWjMgPSBGICogSlxuICAgICAgbnogPSBmLnJlZE11bChqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRSA9IEMgKyBEXG4gICAgZSA9IGMucmVkQWRkKGQpO1xuICAgIC8vIEggPSAoYyAqIFoxKV4yXG4gICAgaCA9IHRoaXMuY3VydmUuX211bEModGhpcy56KS5yZWRTcXIoKTtcbiAgICAvLyBKID0gRSAtIDIgKiBIXG4gICAgaiA9IGUucmVkU3ViKGgpLnJlZFN1YihoKTtcbiAgICAvLyBYMyA9IGMgKiAoQiAtIEUpICogSlxuICAgIG54ID0gdGhpcy5jdXJ2ZS5fbXVsQyhiLnJlZElTdWIoZSkpLnJlZE11bChqKTtcbiAgICAvLyBZMyA9IGMgKiBFICogKEMgLSBEKVxuICAgIG55ID0gdGhpcy5jdXJ2ZS5fbXVsQyhlKS5yZWRNdWwoYy5yZWRJU3ViKGQpKTtcbiAgICAvLyBaMyA9IEUgKiBKXG4gICAgbnogPSBlLnJlZE11bChqKTtcbiAgfVxuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnksIG56KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kYmwgPSBmdW5jdGlvbiBkYmwoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBEb3VibGUgaW4gZXh0ZW5kZWQgY29vcmRpbmF0ZXNcbiAgaWYgKHRoaXMuY3VydmUuZXh0ZW5kZWQpXG4gICAgcmV0dXJuIHRoaXMuX2V4dERibCgpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuX3Byb2pEYmwoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZXh0QWRkID0gZnVuY3Rpb24gX2V4dEFkZChwKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLWV4dGVuZGVkLTEuaHRtbFxuICAvLyAgICAgI2FkZGl0aW9uLWFkZC0yMDA4LWh3Y2QtM1xuICAvLyA4TVxuXG4gIC8vIEEgPSAoWTEgLSBYMSkgKiAoWTIgLSBYMilcbiAgdmFyIGEgPSB0aGlzLnkucmVkU3ViKHRoaXMueCkucmVkTXVsKHAueS5yZWRTdWIocC54KSk7XG4gIC8vIEIgPSAoWTEgKyBYMSkgKiAoWTIgKyBYMilcbiAgdmFyIGIgPSB0aGlzLnkucmVkQWRkKHRoaXMueCkucmVkTXVsKHAueS5yZWRBZGQocC54KSk7XG4gIC8vIEMgPSBUMSAqIGsgKiBUMlxuICB2YXIgYyA9IHRoaXMudC5yZWRNdWwodGhpcy5jdXJ2ZS5kZCkucmVkTXVsKHAudCk7XG4gIC8vIEQgPSBaMSAqIDIgKiBaMlxuICB2YXIgZCA9IHRoaXMuei5yZWRNdWwocC56LnJlZEFkZChwLnopKTtcbiAgLy8gRSA9IEIgLSBBXG4gIHZhciBlID0gYi5yZWRTdWIoYSk7XG4gIC8vIEYgPSBEIC0gQ1xuICB2YXIgZiA9IGQucmVkU3ViKGMpO1xuICAvLyBHID0gRCArIENcbiAgdmFyIGcgPSBkLnJlZEFkZChjKTtcbiAgLy8gSCA9IEIgKyBBXG4gIHZhciBoID0gYi5yZWRBZGQoYSk7XG4gIC8vIFgzID0gRSAqIEZcbiAgdmFyIG54ID0gZS5yZWRNdWwoZik7XG4gIC8vIFkzID0gRyAqIEhcbiAgdmFyIG55ID0gZy5yZWRNdWwoaCk7XG4gIC8vIFQzID0gRSAqIEhcbiAgdmFyIG50ID0gZS5yZWRNdWwoaCk7XG4gIC8vIFozID0gRiAqIEdcbiAgdmFyIG56ID0gZi5yZWRNdWwoZyk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnosIG50KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fcHJvakFkZCA9IGZ1bmN0aW9uIF9wcm9qQWRkKHApIHtcbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtcHJvamVjdGl2ZS5odG1sXG4gIC8vICAgICAjYWRkaXRpb24tYWRkLTIwMDgtYmJqbHBcbiAgLy8gICAgICNhZGRpdGlvbi1hZGQtMjAwNy1ibFxuICAvLyAxME0gKyAxU1xuXG4gIC8vIEEgPSBaMSAqIFoyXG4gIHZhciBhID0gdGhpcy56LnJlZE11bChwLnopO1xuICAvLyBCID0gQV4yXG4gIHZhciBiID0gYS5yZWRTcXIoKTtcbiAgLy8gQyA9IFgxICogWDJcbiAgdmFyIGMgPSB0aGlzLngucmVkTXVsKHAueCk7XG4gIC8vIEQgPSBZMSAqIFkyXG4gIHZhciBkID0gdGhpcy55LnJlZE11bChwLnkpO1xuICAvLyBFID0gZCAqIEMgKiBEXG4gIHZhciBlID0gdGhpcy5jdXJ2ZS5kLnJlZE11bChjKS5yZWRNdWwoZCk7XG4gIC8vIEYgPSBCIC0gRVxuICB2YXIgZiA9IGIucmVkU3ViKGUpO1xuICAvLyBHID0gQiArIEVcbiAgdmFyIGcgPSBiLnJlZEFkZChlKTtcbiAgLy8gWDMgPSBBICogRiAqICgoWDEgKyBZMSkgKiAoWDIgKyBZMikgLSBDIC0gRClcbiAgdmFyIHRtcCA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRNdWwocC54LnJlZEFkZChwLnkpKS5yZWRJU3ViKGMpLnJlZElTdWIoZCk7XG4gIHZhciBueCA9IGEucmVkTXVsKGYpLnJlZE11bCh0bXApO1xuICB2YXIgbnk7XG4gIHZhciBuejtcbiAgaWYgKHRoaXMuY3VydmUudHdpc3RlZCkge1xuICAgIC8vIFkzID0gQSAqIEcgKiAoRCAtIGEgKiBDKVxuICAgIG55ID0gYS5yZWRNdWwoZykucmVkTXVsKGQucmVkU3ViKHRoaXMuY3VydmUuX211bEEoYykpKTtcbiAgICAvLyBaMyA9IEYgKiBHXG4gICAgbnogPSBmLnJlZE11bChnKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBZMyA9IEEgKiBHICogKEQgLSBDKVxuICAgIG55ID0gYS5yZWRNdWwoZykucmVkTXVsKGQucmVkU3ViKGMpKTtcbiAgICAvLyBaMyA9IGMgKiBGICogR1xuICAgIG56ID0gdGhpcy5jdXJ2ZS5fbXVsQyhmKS5yZWRNdWwoZyk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55LCBueik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKHApIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBwO1xuICBpZiAocC5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgaWYgKHRoaXMuY3VydmUuZXh0ZW5kZWQpXG4gICAgcmV0dXJuIHRoaXMuX2V4dEFkZChwKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLl9wcm9qQWRkKHApO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrKSB7XG4gIGlmICh0aGlzLl9oYXNEb3VibGVzKGspKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9maXhlZE5hZk11bCh0aGlzLCBrKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uIG11bEFkZChrMSwgcCwgazIpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgWyB0aGlzLCBwIF0sIFsgazEsIGsyIF0sIDIsIGZhbHNlKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5qbXVsQWRkID0gZnVuY3Rpb24gam11bEFkZChrMSwgcCwgazIpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgWyB0aGlzLCBwIF0sIFsgazEsIGsyIF0sIDIsIHRydWUpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZSgpIHtcbiAgaWYgKHRoaXMuek9uZSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBOb3JtYWxpemUgY29vcmRpbmF0ZXNcbiAgdmFyIHppID0gdGhpcy56LnJlZEludm0oKTtcbiAgdGhpcy54ID0gdGhpcy54LnJlZE11bCh6aSk7XG4gIHRoaXMueSA9IHRoaXMueS5yZWRNdWwoemkpO1xuICBpZiAodGhpcy50KVxuICAgIHRoaXMudCA9IHRoaXMudC5yZWRNdWwoemkpO1xuICB0aGlzLnogPSB0aGlzLmN1cnZlLm9uZTtcbiAgdGhpcy56T25lID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnKCkge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngucmVkTmVnKCksXG4gICAgdGhpcy55LFxuICAgIHRoaXMueixcbiAgICB0aGlzLnQgJiYgdGhpcy50LnJlZE5lZygpKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gZ2V0WCgpIHtcbiAgdGhpcy5ub3JtYWxpemUoKTtcbiAgcmV0dXJuIHRoaXMueC5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uIGdldFkoKSB7XG4gIHRoaXMubm9ybWFsaXplKCk7XG4gIHJldHVybiB0aGlzLnkuZnJvbVJlZCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEob3RoZXIpIHtcbiAgcmV0dXJuIHRoaXMgPT09IG90aGVyIHx8XG4gICAgICAgICB0aGlzLmdldFgoKS5jbXAob3RoZXIuZ2V0WCgpKSA9PT0gMCAmJlxuICAgICAgICAgdGhpcy5nZXRZKCkuY21wKG90aGVyLmdldFkoKSkgPT09IDA7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXFYVG9QID0gZnVuY3Rpb24gZXFYVG9QKHgpIHtcbiAgdmFyIHJ4ID0geC50b1JlZCh0aGlzLmN1cnZlLnJlZCkucmVkTXVsKHRoaXMueik7XG4gIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB2YXIgeGMgPSB4LmNsb25lKCk7XG4gIHZhciB0ID0gdGhpcy5jdXJ2ZS5yZWROLnJlZE11bCh0aGlzLnopO1xuICBmb3IgKDs7KSB7XG4gICAgeGMuaWFkZCh0aGlzLmN1cnZlLm4pO1xuICAgIGlmICh4Yy5jbXAodGhpcy5jdXJ2ZS5wKSA+PSAwKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgcngucmVkSUFkZCh0KTtcbiAgICBpZiAodGhpcy54LmNtcChyeCkgPT09IDApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuLy8gQ29tcGF0aWJpbGl0eSB3aXRoIEJhc2VDdXJ2ZVxuUG9pbnQucHJvdG90eXBlLnRvUCA9IFBvaW50LnByb3RvdHlwZS5ub3JtYWxpemU7XG5Qb2ludC5wcm90b3R5cGUubWl4ZWRBZGQgPSBQb2ludC5wcm90b3R5cGUuYWRkO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBjdXJ2ZSA9IGV4cG9ydHM7XG5cbmN1cnZlLmJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcbmN1cnZlLnNob3J0ID0gcmVxdWlyZSgnLi9zaG9ydCcpO1xuY3VydmUubW9udCA9IHJlcXVpcmUoJy4vbW9udCcpO1xuY3VydmUuZWR3YXJkcyA9IHJlcXVpcmUoJy4vZWR3YXJkcycpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLmluaGVyaXRzID0gaW5oZXJpdHM7XG5cbmZ1bmN0aW9uIGlzU3Vycm9nYXRlUGFpcihtc2csIGkpIHtcbiAgaWYgKChtc2cuY2hhckNvZGVBdChpKSAmIDB4RkMwMCkgIT09IDB4RDgwMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoaSA8IDAgfHwgaSArIDEgPj0gbXNnLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gKG1zZy5jaGFyQ29kZUF0KGkgKyAxKSAmIDB4RkMwMCkgPT09IDB4REMwMDtcbn1cblxuZnVuY3Rpb24gdG9BcnJheShtc2csIGVuYykge1xuICBpZiAoQXJyYXkuaXNBcnJheShtc2cpKVxuICAgIHJldHVybiBtc2cuc2xpY2UoKTtcbiAgaWYgKCFtc2cpXG4gICAgcmV0dXJuIFtdO1xuICB2YXIgcmVzID0gW107XG4gIGlmICh0eXBlb2YgbXNnID09PSAnc3RyaW5nJykge1xuICAgIGlmICghZW5jKSB7XG4gICAgICAvLyBJbnNwaXJlZCBieSBzdHJpbmdUb1V0ZjhCeXRlQXJyYXkoKSBpbiBjbG9zdXJlLWxpYnJhcnkgYnkgR29vZ2xlXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtbGlicmFyeS9ibG9iLzg1OThkODcyNDJhZjU5YWFjMjMzMjcwNzQyYzg5ODRlMmIyYmRiZTAvY2xvc3VyZS9nb29nL2NyeXB0L2NyeXB0LmpzI0wxMTctTDE0M1xuICAgICAgLy8gQXBhY2hlIExpY2Vuc2UgMi4wXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtbGlicmFyeS9ibG9iL21hc3Rlci9MSUNFTlNFXG4gICAgICB2YXIgcCA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYyA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoYyA8IDEyOCkge1xuICAgICAgICAgIHJlc1twKytdID0gYztcbiAgICAgICAgfSBlbHNlIGlmIChjIDwgMjA0OCkge1xuICAgICAgICAgIHJlc1twKytdID0gKGMgPj4gNikgfCAxOTI7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyAmIDYzKSB8IDEyODtcbiAgICAgICAgfSBlbHNlIGlmIChpc1N1cnJvZ2F0ZVBhaXIobXNnLCBpKSkge1xuICAgICAgICAgIGMgPSAweDEwMDAwICsgKChjICYgMHgwM0ZGKSA8PCAxMCkgKyAobXNnLmNoYXJDb2RlQXQoKytpKSAmIDB4MDNGRik7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyA+PiAxOCkgfCAyNDA7XG4gICAgICAgICAgcmVzW3ArK10gPSAoKGMgPj4gMTIpICYgNjMpIHwgMTI4O1xuICAgICAgICAgIHJlc1twKytdID0gKChjID4+IDYpICYgNjMpIHwgMTI4O1xuICAgICAgICAgIHJlc1twKytdID0gKGMgJiA2MykgfCAxMjg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyA+PiAxMikgfCAyMjQ7XG4gICAgICAgICAgcmVzW3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyAmIDYzKSB8IDEyODtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5jID09PSAnaGV4Jykge1xuICAgICAgbXNnID0gbXNnLnJlcGxhY2UoL1teYS16MC05XSsvaWcsICcnKTtcbiAgICAgIGlmIChtc2cubGVuZ3RoICUgMiAhPT0gMClcbiAgICAgICAgbXNnID0gJzAnICsgbXNnO1xuICAgICAgZm9yIChpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgcmVzLnB1c2gocGFyc2VJbnQobXNnW2ldICsgbXNnW2kgKyAxXSwgMTYpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKylcbiAgICAgIHJlc1tpXSA9IG1zZ1tpXSB8IDA7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudG9BcnJheSA9IHRvQXJyYXk7XG5cbmZ1bmN0aW9uIHRvSGV4KG1zZykge1xuICB2YXIgcmVzID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgIHJlcyArPSB6ZXJvMihtc2dbaV0udG9TdHJpbmcoMTYpKTtcbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudG9IZXggPSB0b0hleDtcblxuZnVuY3Rpb24gaHRvbmwodykge1xuICB2YXIgcmVzID0gKHcgPj4+IDI0KSB8XG4gICAgICAgICAgICAoKHcgPj4+IDgpICYgMHhmZjAwKSB8XG4gICAgICAgICAgICAoKHcgPDwgOCkgJiAweGZmMDAwMCkgfFxuICAgICAgICAgICAgKCh3ICYgMHhmZikgPDwgMjQpO1xuICByZXR1cm4gcmVzID4+PiAwO1xufVxuZXhwb3J0cy5odG9ubCA9IGh0b25sO1xuXG5mdW5jdGlvbiB0b0hleDMyKG1zZywgZW5kaWFuKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdyA9IG1zZ1tpXTtcbiAgICBpZiAoZW5kaWFuID09PSAnbGl0dGxlJylcbiAgICAgIHcgPSBodG9ubCh3KTtcbiAgICByZXMgKz0gemVybzgody50b1N0cmluZygxNikpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5leHBvcnRzLnRvSGV4MzIgPSB0b0hleDMyO1xuXG5mdW5jdGlvbiB6ZXJvMih3b3JkKSB7XG4gIGlmICh3b3JkLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gJzAnICsgd29yZDtcbiAgZWxzZVxuICAgIHJldHVybiB3b3JkO1xufVxuZXhwb3J0cy56ZXJvMiA9IHplcm8yO1xuXG5mdW5jdGlvbiB6ZXJvOCh3b3JkKSB7XG4gIGlmICh3b3JkLmxlbmd0aCA9PT0gNylcbiAgICByZXR1cm4gJzAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDYpXG4gICAgcmV0dXJuICcwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNSlcbiAgICByZXR1cm4gJzAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNClcbiAgICByZXR1cm4gJzAwMDAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDMpXG4gICAgcmV0dXJuICcwMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMilcbiAgICByZXR1cm4gJzAwMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gJzAwMDAwMDAnICsgd29yZDtcbiAgZWxzZVxuICAgIHJldHVybiB3b3JkO1xufVxuZXhwb3J0cy56ZXJvOCA9IHplcm84O1xuXG5mdW5jdGlvbiBqb2luMzIobXNnLCBzdGFydCwgZW5kLCBlbmRpYW4pIHtcbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0O1xuICBhc3NlcnQobGVuICUgNCA9PT0gMCk7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkobGVuIC8gNCk7XG4gIGZvciAodmFyIGkgPSAwLCBrID0gc3RhcnQ7IGkgPCByZXMubGVuZ3RoOyBpKyssIGsgKz0gNCkge1xuICAgIHZhciB3O1xuICAgIGlmIChlbmRpYW4gPT09ICdiaWcnKVxuICAgICAgdyA9IChtc2dba10gPDwgMjQpIHwgKG1zZ1trICsgMV0gPDwgMTYpIHwgKG1zZ1trICsgMl0gPDwgOCkgfCBtc2dbayArIDNdO1xuICAgIGVsc2VcbiAgICAgIHcgPSAobXNnW2sgKyAzXSA8PCAyNCkgfCAobXNnW2sgKyAyXSA8PCAxNikgfCAobXNnW2sgKyAxXSA8PCA4KSB8IG1zZ1trXTtcbiAgICByZXNbaV0gPSB3ID4+PiAwO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5leHBvcnRzLmpvaW4zMiA9IGpvaW4zMjtcblxuZnVuY3Rpb24gc3BsaXQzMihtc2csIGVuZGlhbikge1xuICB2YXIgcmVzID0gbmV3IEFycmF5KG1zZy5sZW5ndGggKiA0KTtcbiAgZm9yICh2YXIgaSA9IDAsIGsgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrLCBrICs9IDQpIHtcbiAgICB2YXIgbSA9IG1zZ1tpXTtcbiAgICBpZiAoZW5kaWFuID09PSAnYmlnJykge1xuICAgICAgcmVzW2tdID0gbSA+Pj4gMjQ7XG4gICAgICByZXNbayArIDFdID0gKG0gPj4+IDE2KSAmIDB4ZmY7XG4gICAgICByZXNbayArIDJdID0gKG0gPj4+IDgpICYgMHhmZjtcbiAgICAgIHJlc1trICsgM10gPSBtICYgMHhmZjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzW2sgKyAzXSA9IG0gPj4+IDI0O1xuICAgICAgcmVzW2sgKyAyXSA9IChtID4+PiAxNikgJiAweGZmO1xuICAgICAgcmVzW2sgKyAxXSA9IChtID4+PiA4KSAmIDB4ZmY7XG4gICAgICByZXNba10gPSBtICYgMHhmZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMuc3BsaXQzMiA9IHNwbGl0MzI7XG5cbmZ1bmN0aW9uIHJvdHIzMih3LCBiKSB7XG4gIHJldHVybiAodyA+Pj4gYikgfCAodyA8PCAoMzIgLSBiKSk7XG59XG5leHBvcnRzLnJvdHIzMiA9IHJvdHIzMjtcblxuZnVuY3Rpb24gcm90bDMyKHcsIGIpIHtcbiAgcmV0dXJuICh3IDw8IGIpIHwgKHcgPj4+ICgzMiAtIGIpKTtcbn1cbmV4cG9ydHMucm90bDMyID0gcm90bDMyO1xuXG5mdW5jdGlvbiBzdW0zMihhLCBiKSB7XG4gIHJldHVybiAoYSArIGIpID4+PiAwO1xufVxuZXhwb3J0cy5zdW0zMiA9IHN1bTMyO1xuXG5mdW5jdGlvbiBzdW0zMl8zKGEsIGIsIGMpIHtcbiAgcmV0dXJuIChhICsgYiArIGMpID4+PiAwO1xufVxuZXhwb3J0cy5zdW0zMl8zID0gc3VtMzJfMztcblxuZnVuY3Rpb24gc3VtMzJfNChhLCBiLCBjLCBkKSB7XG4gIHJldHVybiAoYSArIGIgKyBjICsgZCkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyXzQgPSBzdW0zMl80O1xuXG5mdW5jdGlvbiBzdW0zMl81KGEsIGIsIGMsIGQsIGUpIHtcbiAgcmV0dXJuIChhICsgYiArIGMgKyBkICsgZSkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyXzUgPSBzdW0zMl81O1xuXG5mdW5jdGlvbiBzdW02NChidWYsIHBvcywgYWgsIGFsKSB7XG4gIHZhciBiaCA9IGJ1Zltwb3NdO1xuICB2YXIgYmwgPSBidWZbcG9zICsgMV07XG5cbiAgdmFyIGxvID0gKGFsICsgYmwpID4+PiAwO1xuICB2YXIgaGkgPSAobG8gPCBhbCA/IDEgOiAwKSArIGFoICsgYmg7XG4gIGJ1Zltwb3NdID0gaGkgPj4+IDA7XG4gIGJ1Zltwb3MgKyAxXSA9IGxvO1xufVxuZXhwb3J0cy5zdW02NCA9IHN1bTY0O1xuXG5mdW5jdGlvbiBzdW02NF9oaShhaCwgYWwsIGJoLCBibCkge1xuICB2YXIgbG8gPSAoYWwgKyBibCkgPj4+IDA7XG4gIHZhciBoaSA9IChsbyA8IGFsID8gMSA6IDApICsgYWggKyBiaDtcbiAgcmV0dXJuIGhpID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF9oaSA9IHN1bTY0X2hpO1xuXG5mdW5jdGlvbiBzdW02NF9sbyhhaCwgYWwsIGJoLCBibCkge1xuICB2YXIgbG8gPSBhbCArIGJsO1xuICByZXR1cm4gbG8gPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0X2xvID0gc3VtNjRfbG87XG5cbmZ1bmN0aW9uIHN1bTY0XzRfaGkoYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIHZhciBsbyA9IGFsO1xuICBsbyA9IChsbyArIGJsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBhbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGNsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBjbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGRsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBkbCA/IDEgOiAwO1xuXG4gIHZhciBoaSA9IGFoICsgYmggKyBjaCArIGRoICsgY2Fycnk7XG4gIHJldHVybiBoaSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfNF9oaSA9IHN1bTY0XzRfaGk7XG5cbmZ1bmN0aW9uIHN1bTY0XzRfbG8oYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsKSB7XG4gIHZhciBsbyA9IGFsICsgYmwgKyBjbCArIGRsO1xuICByZXR1cm4gbG8gPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0XzRfbG8gPSBzdW02NF80X2xvO1xuXG5mdW5jdGlvbiBzdW02NF81X2hpKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCwgZWgsIGVsKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIHZhciBsbyA9IGFsO1xuICBsbyA9IChsbyArIGJsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBhbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGNsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBjbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGRsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBkbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGVsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBlbCA/IDEgOiAwO1xuXG4gIHZhciBoaSA9IGFoICsgYmggKyBjaCArIGRoICsgZWggKyBjYXJyeTtcbiAgcmV0dXJuIGhpID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF81X2hpID0gc3VtNjRfNV9oaTtcblxuZnVuY3Rpb24gc3VtNjRfNV9sbyhhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwsIGVoLCBlbCkge1xuICB2YXIgbG8gPSBhbCArIGJsICsgY2wgKyBkbCArIGVsO1xuXG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfNV9sbyA9IHN1bTY0XzVfbG87XG5cbmZ1bmN0aW9uIHJvdHI2NF9oaShhaCwgYWwsIG51bSkge1xuICB2YXIgciA9IChhbCA8PCAoMzIgLSBudW0pKSB8IChhaCA+Pj4gbnVtKTtcbiAgcmV0dXJuIHIgPj4+IDA7XG59XG5leHBvcnRzLnJvdHI2NF9oaSA9IHJvdHI2NF9oaTtcblxuZnVuY3Rpb24gcm90cjY0X2xvKGFoLCBhbCwgbnVtKSB7XG4gIHZhciByID0gKGFoIDw8ICgzMiAtIG51bSkpIHwgKGFsID4+PiBudW0pO1xuICByZXR1cm4gciA+Pj4gMDtcbn1cbmV4cG9ydHMucm90cjY0X2xvID0gcm90cjY0X2xvO1xuXG5mdW5jdGlvbiBzaHI2NF9oaShhaCwgYWwsIG51bSkge1xuICByZXR1cm4gYWggPj4+IG51bTtcbn1cbmV4cG9ydHMuc2hyNjRfaGkgPSBzaHI2NF9oaTtcblxuZnVuY3Rpb24gc2hyNjRfbG8oYWgsIGFsLCBudW0pIHtcbiAgdmFyIHIgPSAoYWggPDwgKDMyIC0gbnVtKSkgfCAoYWwgPj4+IG51bSk7XG4gIHJldHVybiByID4+PiAwO1xufVxuZXhwb3J0cy5zaHI2NF9sbyA9IHNocjY0X2xvO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbmZ1bmN0aW9uIEJsb2NrSGFzaCgpIHtcbiAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nVG90YWwgPSAwO1xuICB0aGlzLmJsb2NrU2l6ZSA9IHRoaXMuY29uc3RydWN0b3IuYmxvY2tTaXplO1xuICB0aGlzLm91dFNpemUgPSB0aGlzLmNvbnN0cnVjdG9yLm91dFNpemU7XG4gIHRoaXMuaG1hY1N0cmVuZ3RoID0gdGhpcy5jb25zdHJ1Y3Rvci5obWFjU3RyZW5ndGg7XG4gIHRoaXMucGFkTGVuZ3RoID0gdGhpcy5jb25zdHJ1Y3Rvci5wYWRMZW5ndGggLyA4O1xuICB0aGlzLmVuZGlhbiA9ICdiaWcnO1xuXG4gIHRoaXMuX2RlbHRhOCA9IHRoaXMuYmxvY2tTaXplIC8gODtcbiAgdGhpcy5fZGVsdGEzMiA9IHRoaXMuYmxvY2tTaXplIC8gMzI7XG59XG5leHBvcnRzLkJsb2NrSGFzaCA9IEJsb2NrSGFzaDtcblxuQmxvY2tIYXNoLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUobXNnLCBlbmMpIHtcbiAgLy8gQ29udmVydCBtZXNzYWdlIHRvIGFycmF5LCBwYWQgaXQsIGFuZCBqb2luIGludG8gMzJiaXQgYmxvY2tzXG4gIG1zZyA9IHV0aWxzLnRvQXJyYXkobXNnLCBlbmMpO1xuICBpZiAoIXRoaXMucGVuZGluZylcbiAgICB0aGlzLnBlbmRpbmcgPSBtc2c7XG4gIGVsc2VcbiAgICB0aGlzLnBlbmRpbmcgPSB0aGlzLnBlbmRpbmcuY29uY2F0KG1zZyk7XG4gIHRoaXMucGVuZGluZ1RvdGFsICs9IG1zZy5sZW5ndGg7XG5cbiAgLy8gRW5vdWdoIGRhdGEsIHRyeSB1cGRhdGluZ1xuICBpZiAodGhpcy5wZW5kaW5nLmxlbmd0aCA+PSB0aGlzLl9kZWx0YTgpIHtcbiAgICBtc2cgPSB0aGlzLnBlbmRpbmc7XG5cbiAgICAvLyBQcm9jZXNzIHBlbmRpbmcgZGF0YSBpbiBibG9ja3NcbiAgICB2YXIgciA9IG1zZy5sZW5ndGggJSB0aGlzLl9kZWx0YTg7XG4gICAgdGhpcy5wZW5kaW5nID0gbXNnLnNsaWNlKG1zZy5sZW5ndGggLSByLCBtc2cubGVuZ3RoKTtcbiAgICBpZiAodGhpcy5wZW5kaW5nLmxlbmd0aCA9PT0gMClcbiAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG5cbiAgICBtc2cgPSB1dGlscy5qb2luMzIobXNnLCAwLCBtc2cubGVuZ3RoIC0gciwgdGhpcy5lbmRpYW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSB0aGlzLl9kZWx0YTMyKVxuICAgICAgdGhpcy5fdXBkYXRlKG1zZywgaSwgaSArIHRoaXMuX2RlbHRhMzIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5CbG9ja0hhc2gucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgdGhpcy51cGRhdGUodGhpcy5fcGFkKCkpO1xuICBhc3NlcnQodGhpcy5wZW5kaW5nID09PSBudWxsKTtcblxuICByZXR1cm4gdGhpcy5fZGlnZXN0KGVuYyk7XG59O1xuXG5CbG9ja0hhc2gucHJvdG90eXBlLl9wYWQgPSBmdW5jdGlvbiBwYWQoKSB7XG4gIHZhciBsZW4gPSB0aGlzLnBlbmRpbmdUb3RhbDtcbiAgdmFyIGJ5dGVzID0gdGhpcy5fZGVsdGE4O1xuICB2YXIgayA9IGJ5dGVzIC0gKChsZW4gKyB0aGlzLnBhZExlbmd0aCkgJSBieXRlcyk7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkoayArIHRoaXMucGFkTGVuZ3RoKTtcbiAgcmVzWzBdID0gMHg4MDtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBrOyBpKyspXG4gICAgcmVzW2ldID0gMDtcblxuICAvLyBBcHBlbmQgbGVuZ3RoXG4gIGxlbiA8PD0gMztcbiAgaWYgKHRoaXMuZW5kaWFuID09PSAnYmlnJykge1xuICAgIGZvciAodmFyIHQgPSA4OyB0IDwgdGhpcy5wYWRMZW5ndGg7IHQrKylcbiAgICAgIHJlc1tpKytdID0gMDtcblxuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDI0KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAxNikgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gOCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gbGVuICYgMHhmZjtcbiAgfSBlbHNlIHtcbiAgICByZXNbaSsrXSA9IGxlbiAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiA4KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAxNikgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMjQpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG5cbiAgICBmb3IgKHQgPSA4OyB0IDwgdGhpcy5wYWRMZW5ndGg7IHQrKylcbiAgICAgIHJlc1tpKytdID0gMDtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgcm90cjMyID0gdXRpbHMucm90cjMyO1xuXG5mdW5jdGlvbiBmdF8xKHMsIHgsIHksIHopIHtcbiAgaWYgKHMgPT09IDApXG4gICAgcmV0dXJuIGNoMzIoeCwgeSwgeik7XG4gIGlmIChzID09PSAxIHx8IHMgPT09IDMpXG4gICAgcmV0dXJuIHAzMih4LCB5LCB6KTtcbiAgaWYgKHMgPT09IDIpXG4gICAgcmV0dXJuIG1hajMyKHgsIHksIHopO1xufVxuZXhwb3J0cy5mdF8xID0gZnRfMTtcblxuZnVuY3Rpb24gY2gzMih4LCB5LCB6KSB7XG4gIHJldHVybiAoeCAmIHkpIF4gKCh+eCkgJiB6KTtcbn1cbmV4cG9ydHMuY2gzMiA9IGNoMzI7XG5cbmZ1bmN0aW9uIG1hajMyKHgsIHksIHopIHtcbiAgcmV0dXJuICh4ICYgeSkgXiAoeCAmIHopIF4gKHkgJiB6KTtcbn1cbmV4cG9ydHMubWFqMzIgPSBtYWozMjtcblxuZnVuY3Rpb24gcDMyKHgsIHksIHopIHtcbiAgcmV0dXJuIHggXiB5IF4gejtcbn1cbmV4cG9ydHMucDMyID0gcDMyO1xuXG5mdW5jdGlvbiBzMF8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDIpIF4gcm90cjMyKHgsIDEzKSBeIHJvdHIzMih4LCAyMik7XG59XG5leHBvcnRzLnMwXzI1NiA9IHMwXzI1NjtcblxuZnVuY3Rpb24gczFfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCA2KSBeIHJvdHIzMih4LCAxMSkgXiByb3RyMzIoeCwgMjUpO1xufVxuZXhwb3J0cy5zMV8yNTYgPSBzMV8yNTY7XG5cbmZ1bmN0aW9uIGcwXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgNykgXiByb3RyMzIoeCwgMTgpIF4gKHggPj4+IDMpO1xufVxuZXhwb3J0cy5nMF8yNTYgPSBnMF8yNTY7XG5cbmZ1bmN0aW9uIGcxXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgMTcpIF4gcm90cjMyKHgsIDE5KSBeICh4ID4+PiAxMCk7XG59XG5leHBvcnRzLmcxXzI1NiA9IGcxXzI1NjtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4uL2NvbW1vbicpO1xudmFyIHNoYUNvbW1vbiA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG5cbnZhciByb3RsMzIgPSB1dGlscy5yb3RsMzI7XG52YXIgc3VtMzIgPSB1dGlscy5zdW0zMjtcbnZhciBzdW0zMl81ID0gdXRpbHMuc3VtMzJfNTtcbnZhciBmdF8xID0gc2hhQ29tbW9uLmZ0XzE7XG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxudmFyIHNoYTFfSyA9IFtcbiAgMHg1QTgyNzk5OSwgMHg2RUQ5RUJBMSxcbiAgMHg4RjFCQkNEQywgMHhDQTYyQzFENlxuXTtcblxuZnVuY3Rpb24gU0hBMSgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTEpKVxuICAgIHJldHVybiBuZXcgU0hBMSgpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSxcbiAgICAweDEwMzI1NDc2LCAweGMzZDJlMWYwIF07XG4gIHRoaXMuVyA9IG5ldyBBcnJheSg4MCk7XG59XG5cbnV0aWxzLmluaGVyaXRzKFNIQTEsIEJsb2NrSGFzaCk7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTE7XG5cblNIQTEuYmxvY2tTaXplID0gNTEyO1xuU0hBMS5vdXRTaXplID0gMTYwO1xuU0hBMS5obWFjU3RyZW5ndGggPSA4MDtcblNIQTEucGFkTGVuZ3RoID0gNjQ7XG5cblNIQTEucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcblxuICBmb3IoOyBpIDwgVy5sZW5ndGg7IGkrKylcbiAgICBXW2ldID0gcm90bDMyKFdbaSAtIDNdIF4gV1tpIC0gOF0gXiBXW2kgLSAxNF0gXiBXW2kgLSAxNl0sIDEpO1xuXG4gIHZhciBhID0gdGhpcy5oWzBdO1xuICB2YXIgYiA9IHRoaXMuaFsxXTtcbiAgdmFyIGMgPSB0aGlzLmhbMl07XG4gIHZhciBkID0gdGhpcy5oWzNdO1xuICB2YXIgZSA9IHRoaXMuaFs0XTtcblxuICBmb3IgKGkgPSAwOyBpIDwgVy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzID0gfn4oaSAvIDIwKTtcbiAgICB2YXIgdCA9IHN1bTMyXzUocm90bDMyKGEsIDUpLCBmdF8xKHMsIGIsIGMsIGQpLCBlLCBXW2ldLCBzaGExX0tbc10pO1xuICAgIGUgPSBkO1xuICAgIGQgPSBjO1xuICAgIGMgPSByb3RsMzIoYiwgMzApO1xuICAgIGIgPSBhO1xuICAgIGEgPSB0O1xuICB9XG5cbiAgdGhpcy5oWzBdID0gc3VtMzIodGhpcy5oWzBdLCBhKTtcbiAgdGhpcy5oWzFdID0gc3VtMzIodGhpcy5oWzFdLCBiKTtcbiAgdGhpcy5oWzJdID0gc3VtMzIodGhpcy5oWzJdLCBjKTtcbiAgdGhpcy5oWzNdID0gc3VtMzIodGhpcy5oWzNdLCBkKTtcbiAgdGhpcy5oWzRdID0gc3VtMzIodGhpcy5oWzRdLCBlKTtcbn07XG5cblNIQTEucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnYmlnJyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgc2hhQ29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbnZhciBzdW0zMiA9IHV0aWxzLnN1bTMyO1xudmFyIHN1bTMyXzQgPSB1dGlscy5zdW0zMl80O1xudmFyIHN1bTMyXzUgPSB1dGlscy5zdW0zMl81O1xudmFyIGNoMzIgPSBzaGFDb21tb24uY2gzMjtcbnZhciBtYWozMiA9IHNoYUNvbW1vbi5tYWozMjtcbnZhciBzMF8yNTYgPSBzaGFDb21tb24uczBfMjU2O1xudmFyIHMxXzI1NiA9IHNoYUNvbW1vbi5zMV8yNTY7XG52YXIgZzBfMjU2ID0gc2hhQ29tbW9uLmcwXzI1NjtcbnZhciBnMV8yNTYgPSBzaGFDb21tb24uZzFfMjU2O1xuXG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxudmFyIHNoYTI1Nl9LID0gW1xuICAweDQyOGEyZjk4LCAweDcxMzc0NDkxLCAweGI1YzBmYmNmLCAweGU5YjVkYmE1LFxuICAweDM5NTZjMjViLCAweDU5ZjExMWYxLCAweDkyM2Y4MmE0LCAweGFiMWM1ZWQ1LFxuICAweGQ4MDdhYTk4LCAweDEyODM1YjAxLCAweDI0MzE4NWJlLCAweDU1MGM3ZGMzLFxuICAweDcyYmU1ZDc0LCAweDgwZGViMWZlLCAweDliZGMwNmE3LCAweGMxOWJmMTc0LFxuICAweGU0OWI2OWMxLCAweGVmYmU0Nzg2LCAweDBmYzE5ZGM2LCAweDI0MGNhMWNjLFxuICAweDJkZTkyYzZmLCAweDRhNzQ4NGFhLCAweDVjYjBhOWRjLCAweDc2Zjk4OGRhLFxuICAweDk4M2U1MTUyLCAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3LFxuICAweGM2ZTAwYmYzLCAweGQ1YTc5MTQ3LCAweDA2Y2E2MzUxLCAweDE0MjkyOTY3LFxuICAweDI3YjcwYTg1LCAweDJlMWIyMTM4LCAweDRkMmM2ZGZjLCAweDUzMzgwZDEzLFxuICAweDY1MGE3MzU0LCAweDc2NmEwYWJiLCAweDgxYzJjOTJlLCAweDkyNzIyYzg1LFxuICAweGEyYmZlOGExLCAweGE4MWE2NjRiLCAweGMyNGI4YjcwLCAweGM3NmM1MWEzLFxuICAweGQxOTJlODE5LCAweGQ2OTkwNjI0LCAweGY0MGUzNTg1LCAweDEwNmFhMDcwLFxuICAweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1LFxuICAweDM5MWMwY2IzLCAweDRlZDhhYTRhLCAweDViOWNjYTRmLCAweDY4MmU2ZmYzLFxuICAweDc0OGY4MmVlLCAweDc4YTU2MzZmLCAweDg0Yzg3ODE0LCAweDhjYzcwMjA4LFxuICAweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyXG5dO1xuXG5mdW5jdGlvbiBTSEEyNTYoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEyNTYpKVxuICAgIHJldHVybiBuZXcgU0hBMjU2KCk7XG5cbiAgQmxvY2tIYXNoLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweDZhMDllNjY3LCAweGJiNjdhZTg1LCAweDNjNmVmMzcyLCAweGE1NGZmNTNhLFxuICAgIDB4NTEwZTUyN2YsIDB4OWIwNTY4OGMsIDB4MWY4M2Q5YWIsIDB4NWJlMGNkMTlcbiAgXTtcbiAgdGhpcy5rID0gc2hhMjU2X0s7XG4gIHRoaXMuVyA9IG5ldyBBcnJheSg2NCk7XG59XG51dGlscy5pbmhlcml0cyhTSEEyNTYsIEJsb2NrSGFzaCk7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTI1NjtcblxuU0hBMjU2LmJsb2NrU2l6ZSA9IDUxMjtcblNIQTI1Ni5vdXRTaXplID0gMjU2O1xuU0hBMjU2LmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTI1Ni5wYWRMZW5ndGggPSA2NDtcblxuU0hBMjU2LnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gX3VwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHZhciBXID0gdGhpcy5XO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKylcbiAgICBXW2ldID0gbXNnW3N0YXJ0ICsgaV07XG4gIGZvciAoOyBpIDwgVy5sZW5ndGg7IGkrKylcbiAgICBXW2ldID0gc3VtMzJfNChnMV8yNTYoV1tpIC0gMl0pLCBXW2kgLSA3XSwgZzBfMjU2KFdbaSAtIDE1XSksIFdbaSAtIDE2XSk7XG5cbiAgdmFyIGEgPSB0aGlzLmhbMF07XG4gIHZhciBiID0gdGhpcy5oWzFdO1xuICB2YXIgYyA9IHRoaXMuaFsyXTtcbiAgdmFyIGQgPSB0aGlzLmhbM107XG4gIHZhciBlID0gdGhpcy5oWzRdO1xuICB2YXIgZiA9IHRoaXMuaFs1XTtcbiAgdmFyIGcgPSB0aGlzLmhbNl07XG4gIHZhciBoID0gdGhpcy5oWzddO1xuXG4gIGFzc2VydCh0aGlzLmsubGVuZ3RoID09PSBXLmxlbmd0aCk7XG4gIGZvciAoaSA9IDA7IGkgPCBXLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIFQxID0gc3VtMzJfNShoLCBzMV8yNTYoZSksIGNoMzIoZSwgZiwgZyksIHRoaXMua1tpXSwgV1tpXSk7XG4gICAgdmFyIFQyID0gc3VtMzIoczBfMjU2KGEpLCBtYWozMihhLCBiLCBjKSk7XG4gICAgaCA9IGc7XG4gICAgZyA9IGY7XG4gICAgZiA9IGU7XG4gICAgZSA9IHN1bTMyKGQsIFQxKTtcbiAgICBkID0gYztcbiAgICBjID0gYjtcbiAgICBiID0gYTtcbiAgICBhID0gc3VtMzIoVDEsIFQyKTtcbiAgfVxuXG4gIHRoaXMuaFswXSA9IHN1bTMyKHRoaXMuaFswXSwgYSk7XG4gIHRoaXMuaFsxXSA9IHN1bTMyKHRoaXMuaFsxXSwgYik7XG4gIHRoaXMuaFsyXSA9IHN1bTMyKHRoaXMuaFsyXSwgYyk7XG4gIHRoaXMuaFszXSA9IHN1bTMyKHRoaXMuaFszXSwgZCk7XG4gIHRoaXMuaFs0XSA9IHN1bTMyKHRoaXMuaFs0XSwgZSk7XG4gIHRoaXMuaFs1XSA9IHN1bTMyKHRoaXMuaFs1XSwgZik7XG4gIHRoaXMuaFs2XSA9IHN1bTMyKHRoaXMuaFs2XSwgZyk7XG4gIHRoaXMuaFs3XSA9IHN1bTMyKHRoaXMuaFs3XSwgaCk7XG59O1xuXG5TSEEyNTYucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnYmlnJyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgU0hBMjU2ID0gcmVxdWlyZSgnLi8yNTYnKTtcblxuZnVuY3Rpb24gU0hBMjI0KCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBMjI0KSlcbiAgICByZXR1cm4gbmV3IFNIQTIyNCgpO1xuXG4gIFNIQTI1Ni5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHhjMTA1OWVkOCwgMHgzNjdjZDUwNywgMHgzMDcwZGQxNywgMHhmNzBlNTkzOSxcbiAgICAweGZmYzAwYjMxLCAweDY4NTgxNTExLCAweDY0Zjk4ZmE3LCAweGJlZmE0ZmE0IF07XG59XG51dGlscy5pbmhlcml0cyhTSEEyMjQsIFNIQTI1Nik7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTIyNDtcblxuU0hBMjI0LmJsb2NrU2l6ZSA9IDUxMjtcblNIQTIyNC5vdXRTaXplID0gMjI0O1xuU0hBMjI0LmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTIyNC5wYWRMZW5ndGggPSA2NDtcblxuU0hBMjI0LnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICAvLyBKdXN0IHRydW5jYXRlIG91dHB1dFxuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmguc2xpY2UoMCwgNyksICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaC5zbGljZSgwLCA3KSwgJ2JpZycpO1xufTtcblxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG52YXIgcm90cjY0X2hpID0gdXRpbHMucm90cjY0X2hpO1xudmFyIHJvdHI2NF9sbyA9IHV0aWxzLnJvdHI2NF9sbztcbnZhciBzaHI2NF9oaSA9IHV0aWxzLnNocjY0X2hpO1xudmFyIHNocjY0X2xvID0gdXRpbHMuc2hyNjRfbG87XG52YXIgc3VtNjQgPSB1dGlscy5zdW02NDtcbnZhciBzdW02NF9oaSA9IHV0aWxzLnN1bTY0X2hpO1xudmFyIHN1bTY0X2xvID0gdXRpbHMuc3VtNjRfbG87XG52YXIgc3VtNjRfNF9oaSA9IHV0aWxzLnN1bTY0XzRfaGk7XG52YXIgc3VtNjRfNF9sbyA9IHV0aWxzLnN1bTY0XzRfbG87XG52YXIgc3VtNjRfNV9oaSA9IHV0aWxzLnN1bTY0XzVfaGk7XG52YXIgc3VtNjRfNV9sbyA9IHV0aWxzLnN1bTY0XzVfbG87XG5cbnZhciBCbG9ja0hhc2ggPSBjb21tb24uQmxvY2tIYXNoO1xuXG52YXIgc2hhNTEyX0sgPSBbXG4gIDB4NDI4YTJmOTgsIDB4ZDcyOGFlMjIsIDB4NzEzNzQ0OTEsIDB4MjNlZjY1Y2QsXG4gIDB4YjVjMGZiY2YsIDB4ZWM0ZDNiMmYsIDB4ZTliNWRiYTUsIDB4ODE4OWRiYmMsXG4gIDB4Mzk1NmMyNWIsIDB4ZjM0OGI1MzgsIDB4NTlmMTExZjEsIDB4YjYwNWQwMTksXG4gIDB4OTIzZjgyYTQsIDB4YWYxOTRmOWIsIDB4YWIxYzVlZDUsIDB4ZGE2ZDgxMTgsXG4gIDB4ZDgwN2FhOTgsIDB4YTMwMzAyNDIsIDB4MTI4MzViMDEsIDB4NDU3MDZmYmUsXG4gIDB4MjQzMTg1YmUsIDB4NGVlNGIyOGMsIDB4NTUwYzdkYzMsIDB4ZDVmZmI0ZTIsXG4gIDB4NzJiZTVkNzQsIDB4ZjI3Yjg5NmYsIDB4ODBkZWIxZmUsIDB4M2IxNjk2YjEsXG4gIDB4OWJkYzA2YTcsIDB4MjVjNzEyMzUsIDB4YzE5YmYxNzQsIDB4Y2Y2OTI2OTQsXG4gIDB4ZTQ5YjY5YzEsIDB4OWVmMTRhZDIsIDB4ZWZiZTQ3ODYsIDB4Mzg0ZjI1ZTMsXG4gIDB4MGZjMTlkYzYsIDB4OGI4Y2Q1YjUsIDB4MjQwY2ExY2MsIDB4NzdhYzljNjUsXG4gIDB4MmRlOTJjNmYsIDB4NTkyYjAyNzUsIDB4NGE3NDg0YWEsIDB4NmVhNmU0ODMsXG4gIDB4NWNiMGE5ZGMsIDB4YmQ0MWZiZDQsIDB4NzZmOTg4ZGEsIDB4ODMxMTUzYjUsXG4gIDB4OTgzZTUxNTIsIDB4ZWU2NmRmYWIsIDB4YTgzMWM2NmQsIDB4MmRiNDMyMTAsXG4gIDB4YjAwMzI3YzgsIDB4OThmYjIxM2YsIDB4YmY1OTdmYzcsIDB4YmVlZjBlZTQsXG4gIDB4YzZlMDBiZjMsIDB4M2RhODhmYzIsIDB4ZDVhNzkxNDcsIDB4OTMwYWE3MjUsXG4gIDB4MDZjYTYzNTEsIDB4ZTAwMzgyNmYsIDB4MTQyOTI5NjcsIDB4MGEwZTZlNzAsXG4gIDB4MjdiNzBhODUsIDB4NDZkMjJmZmMsIDB4MmUxYjIxMzgsIDB4NWMyNmM5MjYsXG4gIDB4NGQyYzZkZmMsIDB4NWFjNDJhZWQsIDB4NTMzODBkMTMsIDB4OWQ5NWIzZGYsXG4gIDB4NjUwYTczNTQsIDB4OGJhZjYzZGUsIDB4NzY2YTBhYmIsIDB4M2M3N2IyYTgsXG4gIDB4ODFjMmM5MmUsIDB4NDdlZGFlZTYsIDB4OTI3MjJjODUsIDB4MTQ4MjM1M2IsXG4gIDB4YTJiZmU4YTEsIDB4NGNmMTAzNjQsIDB4YTgxYTY2NGIsIDB4YmM0MjMwMDEsXG4gIDB4YzI0YjhiNzAsIDB4ZDBmODk3OTEsIDB4Yzc2YzUxYTMsIDB4MDY1NGJlMzAsXG4gIDB4ZDE5MmU4MTksIDB4ZDZlZjUyMTgsIDB4ZDY5OTA2MjQsIDB4NTU2NWE5MTAsXG4gIDB4ZjQwZTM1ODUsIDB4NTc3MTIwMmEsIDB4MTA2YWEwNzAsIDB4MzJiYmQxYjgsXG4gIDB4MTlhNGMxMTYsIDB4YjhkMmQwYzgsIDB4MWUzNzZjMDgsIDB4NTE0MWFiNTMsXG4gIDB4Mjc0ODc3NGMsIDB4ZGY4ZWViOTksIDB4MzRiMGJjYjUsIDB4ZTE5YjQ4YTgsXG4gIDB4MzkxYzBjYjMsIDB4YzVjOTVhNjMsIDB4NGVkOGFhNGEsIDB4ZTM0MThhY2IsXG4gIDB4NWI5Y2NhNGYsIDB4Nzc2M2UzNzMsIDB4NjgyZTZmZjMsIDB4ZDZiMmI4YTMsXG4gIDB4NzQ4ZjgyZWUsIDB4NWRlZmIyZmMsIDB4NzhhNTYzNmYsIDB4NDMxNzJmNjAsXG4gIDB4ODRjODc4MTQsIDB4YTFmMGFiNzIsIDB4OGNjNzAyMDgsIDB4MWE2NDM5ZWMsXG4gIDB4OTBiZWZmZmEsIDB4MjM2MzFlMjgsIDB4YTQ1MDZjZWIsIDB4ZGU4MmJkZTksXG4gIDB4YmVmOWEzZjcsIDB4YjJjNjc5MTUsIDB4YzY3MTc4ZjIsIDB4ZTM3MjUzMmIsXG4gIDB4Y2EyNzNlY2UsIDB4ZWEyNjYxOWMsIDB4ZDE4NmI4YzcsIDB4MjFjMGMyMDcsXG4gIDB4ZWFkYTdkZDYsIDB4Y2RlMGViMWUsIDB4ZjU3ZDRmN2YsIDB4ZWU2ZWQxNzgsXG4gIDB4MDZmMDY3YWEsIDB4NzIxNzZmYmEsIDB4MGE2MzdkYzUsIDB4YTJjODk4YTYsXG4gIDB4MTEzZjk4MDQsIDB4YmVmOTBkYWUsIDB4MWI3MTBiMzUsIDB4MTMxYzQ3MWIsXG4gIDB4MjhkYjc3ZjUsIDB4MjMwNDdkODQsIDB4MzJjYWFiN2IsIDB4NDBjNzI0OTMsXG4gIDB4M2M5ZWJlMGEsIDB4MTVjOWJlYmMsIDB4NDMxZDY3YzQsIDB4OWMxMDBkNGMsXG4gIDB4NGNjNWQ0YmUsIDB4Y2IzZTQyYjYsIDB4NTk3ZjI5OWMsIDB4ZmM2NTdlMmEsXG4gIDB4NWZjYjZmYWIsIDB4M2FkNmZhZWMsIDB4NmM0NDE5OGMsIDB4NGE0NzU4MTdcbl07XG5cbmZ1bmN0aW9uIFNIQTUxMigpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTUxMikpXG4gICAgcmV0dXJuIG5ldyBTSEE1MTIoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4NmEwOWU2NjcsIDB4ZjNiY2M5MDgsXG4gICAgMHhiYjY3YWU4NSwgMHg4NGNhYTczYixcbiAgICAweDNjNmVmMzcyLCAweGZlOTRmODJiLFxuICAgIDB4YTU0ZmY1M2EsIDB4NWYxZDM2ZjEsXG4gICAgMHg1MTBlNTI3ZiwgMHhhZGU2ODJkMSxcbiAgICAweDliMDU2ODhjLCAweDJiM2U2YzFmLFxuICAgIDB4MWY4M2Q5YWIsIDB4ZmI0MWJkNmIsXG4gICAgMHg1YmUwY2QxOSwgMHgxMzdlMjE3OSBdO1xuICB0aGlzLmsgPSBzaGE1MTJfSztcbiAgdGhpcy5XID0gbmV3IEFycmF5KDE2MCk7XG59XG51dGlscy5pbmhlcml0cyhTSEE1MTIsIEJsb2NrSGFzaCk7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTUxMjtcblxuU0hBNTEyLmJsb2NrU2l6ZSA9IDEwMjQ7XG5TSEE1MTIub3V0U2l6ZSA9IDUxMjtcblNIQTUxMi5obWFjU3RyZW5ndGggPSAxOTI7XG5TSEE1MTIucGFkTGVuZ3RoID0gMTI4O1xuXG5TSEE1MTIucHJvdG90eXBlLl9wcmVwYXJlQmxvY2sgPSBmdW5jdGlvbiBfcHJlcGFyZUJsb2NrKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgLy8gMzIgeCAzMmJpdCB3b3Jkc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDMyOyBpKyspXG4gICAgV1tpXSA9IG1zZ1tzdGFydCArIGldO1xuICBmb3IgKDsgaSA8IFcubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgYzBfaGkgPSBnMV81MTJfaGkoV1tpIC0gNF0sIFdbaSAtIDNdKTsgIC8vIGkgLSAyXG4gICAgdmFyIGMwX2xvID0gZzFfNTEyX2xvKFdbaSAtIDRdLCBXW2kgLSAzXSk7XG4gICAgdmFyIGMxX2hpID0gV1tpIC0gMTRdOyAgLy8gaSAtIDdcbiAgICB2YXIgYzFfbG8gPSBXW2kgLSAxM107XG4gICAgdmFyIGMyX2hpID0gZzBfNTEyX2hpKFdbaSAtIDMwXSwgV1tpIC0gMjldKTsgIC8vIGkgLSAxNVxuICAgIHZhciBjMl9sbyA9IGcwXzUxMl9sbyhXW2kgLSAzMF0sIFdbaSAtIDI5XSk7XG4gICAgdmFyIGMzX2hpID0gV1tpIC0gMzJdOyAgLy8gaSAtIDE2XG4gICAgdmFyIGMzX2xvID0gV1tpIC0gMzFdO1xuXG4gICAgV1tpXSA9IHN1bTY0XzRfaGkoXG4gICAgICBjMF9oaSwgYzBfbG8sXG4gICAgICBjMV9oaSwgYzFfbG8sXG4gICAgICBjMl9oaSwgYzJfbG8sXG4gICAgICBjM19oaSwgYzNfbG8pO1xuICAgIFdbaSArIDFdID0gc3VtNjRfNF9sbyhcbiAgICAgIGMwX2hpLCBjMF9sbyxcbiAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgIGMzX2hpLCBjM19sbyk7XG4gIH1cbn07XG5cblNIQTUxMi5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIF91cGRhdGUobXNnLCBzdGFydCkge1xuICB0aGlzLl9wcmVwYXJlQmxvY2sobXNnLCBzdGFydCk7XG5cbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgdmFyIGFoID0gdGhpcy5oWzBdO1xuICB2YXIgYWwgPSB0aGlzLmhbMV07XG4gIHZhciBiaCA9IHRoaXMuaFsyXTtcbiAgdmFyIGJsID0gdGhpcy5oWzNdO1xuICB2YXIgY2ggPSB0aGlzLmhbNF07XG4gIHZhciBjbCA9IHRoaXMuaFs1XTtcbiAgdmFyIGRoID0gdGhpcy5oWzZdO1xuICB2YXIgZGwgPSB0aGlzLmhbN107XG4gIHZhciBlaCA9IHRoaXMuaFs4XTtcbiAgdmFyIGVsID0gdGhpcy5oWzldO1xuICB2YXIgZmggPSB0aGlzLmhbMTBdO1xuICB2YXIgZmwgPSB0aGlzLmhbMTFdO1xuICB2YXIgZ2ggPSB0aGlzLmhbMTJdO1xuICB2YXIgZ2wgPSB0aGlzLmhbMTNdO1xuICB2YXIgaGggPSB0aGlzLmhbMTRdO1xuICB2YXIgaGwgPSB0aGlzLmhbMTVdO1xuXG4gIGFzc2VydCh0aGlzLmsubGVuZ3RoID09PSBXLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgVy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBjMF9oaSA9IGhoO1xuICAgIHZhciBjMF9sbyA9IGhsO1xuICAgIHZhciBjMV9oaSA9IHMxXzUxMl9oaShlaCwgZWwpO1xuICAgIHZhciBjMV9sbyA9IHMxXzUxMl9sbyhlaCwgZWwpO1xuICAgIHZhciBjMl9oaSA9IGNoNjRfaGkoZWgsIGVsLCBmaCwgZmwsIGdoLCBnbCk7XG4gICAgdmFyIGMyX2xvID0gY2g2NF9sbyhlaCwgZWwsIGZoLCBmbCwgZ2gsIGdsKTtcbiAgICB2YXIgYzNfaGkgPSB0aGlzLmtbaV07XG4gICAgdmFyIGMzX2xvID0gdGhpcy5rW2kgKyAxXTtcbiAgICB2YXIgYzRfaGkgPSBXW2ldO1xuICAgIHZhciBjNF9sbyA9IFdbaSArIDFdO1xuXG4gICAgdmFyIFQxX2hpID0gc3VtNjRfNV9oaShcbiAgICAgIGMwX2hpLCBjMF9sbyxcbiAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgIGMzX2hpLCBjM19sbyxcbiAgICAgIGM0X2hpLCBjNF9sbyk7XG4gICAgdmFyIFQxX2xvID0gc3VtNjRfNV9sbyhcbiAgICAgIGMwX2hpLCBjMF9sbyxcbiAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgIGMzX2hpLCBjM19sbyxcbiAgICAgIGM0X2hpLCBjNF9sbyk7XG5cbiAgICBjMF9oaSA9IHMwXzUxMl9oaShhaCwgYWwpO1xuICAgIGMwX2xvID0gczBfNTEyX2xvKGFoLCBhbCk7XG4gICAgYzFfaGkgPSBtYWo2NF9oaShhaCwgYWwsIGJoLCBibCwgY2gsIGNsKTtcbiAgICBjMV9sbyA9IG1hajY0X2xvKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wpO1xuXG4gICAgdmFyIFQyX2hpID0gc3VtNjRfaGkoYzBfaGksIGMwX2xvLCBjMV9oaSwgYzFfbG8pO1xuICAgIHZhciBUMl9sbyA9IHN1bTY0X2xvKGMwX2hpLCBjMF9sbywgYzFfaGksIGMxX2xvKTtcblxuICAgIGhoID0gZ2g7XG4gICAgaGwgPSBnbDtcblxuICAgIGdoID0gZmg7XG4gICAgZ2wgPSBmbDtcblxuICAgIGZoID0gZWg7XG4gICAgZmwgPSBlbDtcblxuICAgIGVoID0gc3VtNjRfaGkoZGgsIGRsLCBUMV9oaSwgVDFfbG8pO1xuICAgIGVsID0gc3VtNjRfbG8oZGwsIGRsLCBUMV9oaSwgVDFfbG8pO1xuXG4gICAgZGggPSBjaDtcbiAgICBkbCA9IGNsO1xuXG4gICAgY2ggPSBiaDtcbiAgICBjbCA9IGJsO1xuXG4gICAgYmggPSBhaDtcbiAgICBibCA9IGFsO1xuXG4gICAgYWggPSBzdW02NF9oaShUMV9oaSwgVDFfbG8sIFQyX2hpLCBUMl9sbyk7XG4gICAgYWwgPSBzdW02NF9sbyhUMV9oaSwgVDFfbG8sIFQyX2hpLCBUMl9sbyk7XG4gIH1cblxuICBzdW02NCh0aGlzLmgsIDAsIGFoLCBhbCk7XG4gIHN1bTY0KHRoaXMuaCwgMiwgYmgsIGJsKTtcbiAgc3VtNjQodGhpcy5oLCA0LCBjaCwgY2wpO1xuICBzdW02NCh0aGlzLmgsIDYsIGRoLCBkbCk7XG4gIHN1bTY0KHRoaXMuaCwgOCwgZWgsIGVsKTtcbiAgc3VtNjQodGhpcy5oLCAxMCwgZmgsIGZsKTtcbiAgc3VtNjQodGhpcy5oLCAxMiwgZ2gsIGdsKTtcbiAgc3VtNjQodGhpcy5oLCAxNCwgaGgsIGhsKTtcbn07XG5cblNIQTUxMi5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdiaWcnKTtcbn07XG5cbmZ1bmN0aW9uIGNoNjRfaGkoeGgsIHhsLCB5aCwgeWwsIHpoKSB7XG4gIHZhciByID0gKHhoICYgeWgpIF4gKCh+eGgpICYgemgpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGNoNjRfbG8oeGgsIHhsLCB5aCwgeWwsIHpoLCB6bCkge1xuICB2YXIgciA9ICh4bCAmIHlsKSBeICgofnhsKSAmIHpsKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBtYWo2NF9oaSh4aCwgeGwsIHloLCB5bCwgemgpIHtcbiAgdmFyIHIgPSAoeGggJiB5aCkgXiAoeGggJiB6aCkgXiAoeWggJiB6aCk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gbWFqNjRfbG8oeGgsIHhsLCB5aCwgeWwsIHpoLCB6bCkge1xuICB2YXIgciA9ICh4bCAmIHlsKSBeICh4bCAmIHpsKSBeICh5bCAmIHpsKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBzMF81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDI4KTtcbiAgdmFyIGMxX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgMik7ICAvLyAzNFxuICB2YXIgYzJfaGkgPSByb3RyNjRfaGkoeGwsIHhoLCA3KTsgIC8vIDM5XG5cbiAgdmFyIHIgPSBjMF9oaSBeIGMxX2hpIF4gYzJfaGk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gczBfNTEyX2xvKHhoLCB4bCkge1xuICB2YXIgYzBfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAyOCk7XG4gIHZhciBjMV9sbyA9IHJvdHI2NF9sbyh4bCwgeGgsIDIpOyAgLy8gMzRcbiAgdmFyIGMyX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgNyk7ICAvLyAzOVxuXG4gIHZhciByID0gYzBfbG8gXiBjMV9sbyBeIGMyX2xvO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMxXzUxMl9oaSh4aCwgeGwpIHtcbiAgdmFyIGMwX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMTQpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAxOCk7XG4gIHZhciBjMl9oaSA9IHJvdHI2NF9oaSh4bCwgeGgsIDkpOyAgLy8gNDFcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBzMV81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDE0KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMTgpO1xuICB2YXIgYzJfbG8gPSByb3RyNjRfbG8oeGwsIHhoLCA5KTsgIC8vIDQxXG5cbiAgdmFyIHIgPSBjMF9sbyBeIGMxX2xvIF4gYzJfbG87XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gZzBfNTEyX2hpKHhoLCB4bCkge1xuICB2YXIgYzBfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAxKTtcbiAgdmFyIGMxX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgOCk7XG4gIHZhciBjMl9oaSA9IHNocjY0X2hpKHhoLCB4bCwgNyk7XG5cbiAgdmFyIHIgPSBjMF9oaSBeIGMxX2hpIF4gYzJfaGk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gZzBfNTEyX2xvKHhoLCB4bCkge1xuICB2YXIgYzBfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAxKTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgOCk7XG4gIHZhciBjMl9sbyA9IHNocjY0X2xvKHhoLCB4bCwgNyk7XG5cbiAgdmFyIHIgPSBjMF9sbyBeIGMxX2xvIF4gYzJfbG87XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gZzFfNTEyX2hpKHhoLCB4bCkge1xuICB2YXIgYzBfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAxOSk7XG4gIHZhciBjMV9oaSA9IHJvdHI2NF9oaSh4bCwgeGgsIDI5KTsgIC8vIDYxXG4gIHZhciBjMl9oaSA9IHNocjY0X2hpKHhoLCB4bCwgNik7XG5cbiAgdmFyIHIgPSBjMF9oaSBeIGMxX2hpIF4gYzJfaGk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gZzFfNTEyX2xvKHhoLCB4bCkge1xuICB2YXIgYzBfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAxOSk7XG4gIHZhciBjMV9sbyA9IHJvdHI2NF9sbyh4bCwgeGgsIDI5KTsgIC8vIDYxXG4gIHZhciBjMl9sbyA9IHNocjY0X2xvKHhoLCB4bCwgNik7XG5cbiAgdmFyIHIgPSBjMF9sbyBeIGMxX2xvIF4gYzJfbG87XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG52YXIgU0hBNTEyID0gcmVxdWlyZSgnLi81MTInKTtcblxuZnVuY3Rpb24gU0hBMzg0KCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBMzg0KSlcbiAgICByZXR1cm4gbmV3IFNIQTM4NCgpO1xuXG4gIFNIQTUxMi5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHhjYmJiOWQ1ZCwgMHhjMTA1OWVkOCxcbiAgICAweDYyOWEyOTJhLCAweDM2N2NkNTA3LFxuICAgIDB4OTE1OTAxNWEsIDB4MzA3MGRkMTcsXG4gICAgMHgxNTJmZWNkOCwgMHhmNzBlNTkzOSxcbiAgICAweDY3MzMyNjY3LCAweGZmYzAwYjMxLFxuICAgIDB4OGViNDRhODcsIDB4Njg1ODE1MTEsXG4gICAgMHhkYjBjMmUwZCwgMHg2NGY5OGZhNyxcbiAgICAweDQ3YjU0ODFkLCAweGJlZmE0ZmE0IF07XG59XG51dGlscy5pbmhlcml0cyhTSEEzODQsIFNIQTUxMik7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTM4NDtcblxuU0hBMzg0LmJsb2NrU2l6ZSA9IDEwMjQ7XG5TSEEzODQub3V0U2l6ZSA9IDM4NDtcblNIQTM4NC5obWFjU3RyZW5ndGggPSAxOTI7XG5TSEEzODQucGFkTGVuZ3RoID0gMTI4O1xuXG5TSEEzODQucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaC5zbGljZSgwLCAxMiksICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaC5zbGljZSgwLCAxMiksICdiaWcnKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5zaGExID0gcmVxdWlyZSgnLi9zaGEvMScpO1xuZXhwb3J0cy5zaGEyMjQgPSByZXF1aXJlKCcuL3NoYS8yMjQnKTtcbmV4cG9ydHMuc2hhMjU2ID0gcmVxdWlyZSgnLi9zaGEvMjU2Jyk7XG5leHBvcnRzLnNoYTM4NCA9IHJlcXVpcmUoJy4vc2hhLzM4NCcpO1xuZXhwb3J0cy5zaGE1MTIgPSByZXF1aXJlKCcuL3NoYS81MTInKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxudmFyIHJvdGwzMiA9IHV0aWxzLnJvdGwzMjtcbnZhciBzdW0zMiA9IHV0aWxzLnN1bTMyO1xudmFyIHN1bTMyXzMgPSB1dGlscy5zdW0zMl8zO1xudmFyIHN1bTMyXzQgPSB1dGlscy5zdW0zMl80O1xudmFyIEJsb2NrSGFzaCA9IGNvbW1vbi5CbG9ja0hhc2g7XG5cbmZ1bmN0aW9uIFJJUEVNRDE2MCgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJJUEVNRDE2MCkpXG4gICAgcmV0dXJuIG5ldyBSSVBFTUQxNjAoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcblxuICB0aGlzLmggPSBbIDB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjAgXTtcbiAgdGhpcy5lbmRpYW4gPSAnbGl0dGxlJztcbn1cbnV0aWxzLmluaGVyaXRzKFJJUEVNRDE2MCwgQmxvY2tIYXNoKTtcbmV4cG9ydHMucmlwZW1kMTYwID0gUklQRU1EMTYwO1xuXG5SSVBFTUQxNjAuYmxvY2tTaXplID0gNTEyO1xuUklQRU1EMTYwLm91dFNpemUgPSAxNjA7XG5SSVBFTUQxNjAuaG1hY1N0cmVuZ3RoID0gMTkyO1xuUklQRU1EMTYwLnBhZExlbmd0aCA9IDY0O1xuXG5SSVBFTUQxNjAucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUobXNnLCBzdGFydCkge1xuICB2YXIgQSA9IHRoaXMuaFswXTtcbiAgdmFyIEIgPSB0aGlzLmhbMV07XG4gIHZhciBDID0gdGhpcy5oWzJdO1xuICB2YXIgRCA9IHRoaXMuaFszXTtcbiAgdmFyIEUgPSB0aGlzLmhbNF07XG4gIHZhciBBaCA9IEE7XG4gIHZhciBCaCA9IEI7XG4gIHZhciBDaCA9IEM7XG4gIHZhciBEaCA9IEQ7XG4gIHZhciBFaCA9IEU7XG4gIGZvciAodmFyIGogPSAwOyBqIDwgODA7IGorKykge1xuICAgIHZhciBUID0gc3VtMzIoXG4gICAgICByb3RsMzIoXG4gICAgICAgIHN1bTMyXzQoQSwgZihqLCBCLCBDLCBEKSwgbXNnW3Jbal0gKyBzdGFydF0sIEsoaikpLFxuICAgICAgICBzW2pdKSxcbiAgICAgIEUpO1xuICAgIEEgPSBFO1xuICAgIEUgPSBEO1xuICAgIEQgPSByb3RsMzIoQywgMTApO1xuICAgIEMgPSBCO1xuICAgIEIgPSBUO1xuICAgIFQgPSBzdW0zMihcbiAgICAgIHJvdGwzMihcbiAgICAgICAgc3VtMzJfNChBaCwgZig3OSAtIGosIEJoLCBDaCwgRGgpLCBtc2dbcmhbal0gKyBzdGFydF0sIEtoKGopKSxcbiAgICAgICAgc2hbal0pLFxuICAgICAgRWgpO1xuICAgIEFoID0gRWg7XG4gICAgRWggPSBEaDtcbiAgICBEaCA9IHJvdGwzMihDaCwgMTApO1xuICAgIENoID0gQmg7XG4gICAgQmggPSBUO1xuICB9XG4gIFQgPSBzdW0zMl8zKHRoaXMuaFsxXSwgQywgRGgpO1xuICB0aGlzLmhbMV0gPSBzdW0zMl8zKHRoaXMuaFsyXSwgRCwgRWgpO1xuICB0aGlzLmhbMl0gPSBzdW0zMl8zKHRoaXMuaFszXSwgRSwgQWgpO1xuICB0aGlzLmhbM10gPSBzdW0zMl8zKHRoaXMuaFs0XSwgQSwgQmgpO1xuICB0aGlzLmhbNF0gPSBzdW0zMl8zKHRoaXMuaFswXSwgQiwgQ2gpO1xuICB0aGlzLmhbMF0gPSBUO1xufTtcblxuUklQRU1EMTYwLnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmgsICdsaXR0bGUnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaCwgJ2xpdHRsZScpO1xufTtcblxuZnVuY3Rpb24gZihqLCB4LCB5LCB6KSB7XG4gIGlmIChqIDw9IDE1KVxuICAgIHJldHVybiB4IF4geSBeIHo7XG4gIGVsc2UgaWYgKGogPD0gMzEpXG4gICAgcmV0dXJuICh4ICYgeSkgfCAoKH54KSAmIHopO1xuICBlbHNlIGlmIChqIDw9IDQ3KVxuICAgIHJldHVybiAoeCB8ICh+eSkpIF4gejtcbiAgZWxzZSBpZiAoaiA8PSA2MylcbiAgICByZXR1cm4gKHggJiB6KSB8ICh5ICYgKH56KSk7XG4gIGVsc2VcbiAgICByZXR1cm4geCBeICh5IHwgKH56KSk7XG59XG5cbmZ1bmN0aW9uIEsoaikge1xuICBpZiAoaiA8PSAxNSlcbiAgICByZXR1cm4gMHgwMDAwMDAwMDtcbiAgZWxzZSBpZiAoaiA8PSAzMSlcbiAgICByZXR1cm4gMHg1YTgyNzk5OTtcbiAgZWxzZSBpZiAoaiA8PSA0NylcbiAgICByZXR1cm4gMHg2ZWQ5ZWJhMTtcbiAgZWxzZSBpZiAoaiA8PSA2MylcbiAgICByZXR1cm4gMHg4ZjFiYmNkYztcbiAgZWxzZVxuICAgIHJldHVybiAweGE5NTNmZDRlO1xufVxuXG5mdW5jdGlvbiBLaChqKSB7XG4gIGlmIChqIDw9IDE1KVxuICAgIHJldHVybiAweDUwYTI4YmU2O1xuICBlbHNlIGlmIChqIDw9IDMxKVxuICAgIHJldHVybiAweDVjNGRkMTI0O1xuICBlbHNlIGlmIChqIDw9IDQ3KVxuICAgIHJldHVybiAweDZkNzAzZWYzO1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAweDdhNmQ3NmU5O1xuICBlbHNlXG4gICAgcmV0dXJuIDB4MDAwMDAwMDA7XG59XG5cbnZhciByID0gW1xuICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LFxuICA3LCA0LCAxMywgMSwgMTAsIDYsIDE1LCAzLCAxMiwgMCwgOSwgNSwgMiwgMTQsIDExLCA4LFxuICAzLCAxMCwgMTQsIDQsIDksIDE1LCA4LCAxLCAyLCA3LCAwLCA2LCAxMywgMTEsIDUsIDEyLFxuICAxLCA5LCAxMSwgMTAsIDAsIDgsIDEyLCA0LCAxMywgMywgNywgMTUsIDE0LCA1LCA2LCAyLFxuICA0LCAwLCA1LCA5LCA3LCAxMiwgMiwgMTAsIDE0LCAxLCAzLCA4LCAxMSwgNiwgMTUsIDEzXG5dO1xuXG52YXIgcmggPSBbXG4gIDUsIDE0LCA3LCAwLCA5LCAyLCAxMSwgNCwgMTMsIDYsIDE1LCA4LCAxLCAxMCwgMywgMTIsXG4gIDYsIDExLCAzLCA3LCAwLCAxMywgNSwgMTAsIDE0LCAxNSwgOCwgMTIsIDQsIDksIDEsIDIsXG4gIDE1LCA1LCAxLCAzLCA3LCAxNCwgNiwgOSwgMTEsIDgsIDEyLCAyLCAxMCwgMCwgNCwgMTMsXG4gIDgsIDYsIDQsIDEsIDMsIDExLCAxNSwgMCwgNSwgMTIsIDIsIDEzLCA5LCA3LCAxMCwgMTQsXG4gIDEyLCAxNSwgMTAsIDQsIDEsIDUsIDgsIDcsIDYsIDIsIDEzLCAxNCwgMCwgMywgOSwgMTFcbl07XG5cbnZhciBzID0gW1xuICAxMSwgMTQsIDE1LCAxMiwgNSwgOCwgNywgOSwgMTEsIDEzLCAxNCwgMTUsIDYsIDcsIDksIDgsXG4gIDcsIDYsIDgsIDEzLCAxMSwgOSwgNywgMTUsIDcsIDEyLCAxNSwgOSwgMTEsIDcsIDEzLCAxMixcbiAgMTEsIDEzLCA2LCA3LCAxNCwgOSwgMTMsIDE1LCAxNCwgOCwgMTMsIDYsIDUsIDEyLCA3LCA1LFxuICAxMSwgMTIsIDE0LCAxNSwgMTQsIDE1LCA5LCA4LCA5LCAxNCwgNSwgNiwgOCwgNiwgNSwgMTIsXG4gIDksIDE1LCA1LCAxMSwgNiwgOCwgMTMsIDEyLCA1LCAxMiwgMTMsIDE0LCAxMSwgOCwgNSwgNlxuXTtcblxudmFyIHNoID0gW1xuICA4LCA5LCA5LCAxMSwgMTMsIDE1LCAxNSwgNSwgNywgNywgOCwgMTEsIDE0LCAxNCwgMTIsIDYsXG4gIDksIDEzLCAxNSwgNywgMTIsIDgsIDksIDExLCA3LCA3LCAxMiwgNywgNiwgMTUsIDEzLCAxMSxcbiAgOSwgNywgMTUsIDExLCA4LCA2LCA2LCAxNCwgMTIsIDEzLCA1LCAxNCwgMTMsIDEzLCA3LCA1LFxuICAxNSwgNSwgOCwgMTEsIDE0LCAxNCwgNiwgMTQsIDYsIDksIDEyLCA5LCAxMiwgNSwgMTUsIDgsXG4gIDgsIDUsIDEyLCA5LCAxMiwgNSwgMTQsIDYsIDgsIDEzLCA2LCA1LCAxNSwgMTMsIDExLCAxMVxuXTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG5mdW5jdGlvbiBIbWFjKGhhc2gsIGtleSwgZW5jKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBIbWFjKSlcbiAgICByZXR1cm4gbmV3IEhtYWMoaGFzaCwga2V5LCBlbmMpO1xuICB0aGlzLkhhc2ggPSBoYXNoO1xuICB0aGlzLmJsb2NrU2l6ZSA9IGhhc2guYmxvY2tTaXplIC8gODtcbiAgdGhpcy5vdXRTaXplID0gaGFzaC5vdXRTaXplIC8gODtcbiAgdGhpcy5pbm5lciA9IG51bGw7XG4gIHRoaXMub3V0ZXIgPSBudWxsO1xuXG4gIHRoaXMuX2luaXQodXRpbHMudG9BcnJheShrZXksIGVuYykpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBIbWFjO1xuXG5IbWFjLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIGluaXQoa2V5KSB7XG4gIC8vIFNob3J0ZW4ga2V5LCBpZiBuZWVkZWRcbiAgaWYgKGtleS5sZW5ndGggPiB0aGlzLmJsb2NrU2l6ZSlcbiAgICBrZXkgPSBuZXcgdGhpcy5IYXNoKCkudXBkYXRlKGtleSkuZGlnZXN0KCk7XG4gIGFzc2VydChrZXkubGVuZ3RoIDw9IHRoaXMuYmxvY2tTaXplKTtcblxuICAvLyBBZGQgcGFkZGluZyB0byBrZXlcbiAgZm9yICh2YXIgaSA9IGtleS5sZW5ndGg7IGkgPCB0aGlzLmJsb2NrU2l6ZTsgaSsrKVxuICAgIGtleS5wdXNoKDApO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBrZXkubGVuZ3RoOyBpKyspXG4gICAga2V5W2ldIF49IDB4MzY7XG4gIHRoaXMuaW5uZXIgPSBuZXcgdGhpcy5IYXNoKCkudXBkYXRlKGtleSk7XG5cbiAgLy8gMHgzNiBeIDB4NWMgPSAweDZhXG4gIGZvciAoaSA9IDA7IGkgPCBrZXkubGVuZ3RoOyBpKyspXG4gICAga2V5W2ldIF49IDB4NmE7XG4gIHRoaXMub3V0ZXIgPSBuZXcgdGhpcy5IYXNoKCkudXBkYXRlKGtleSk7XG59O1xuXG5IbWFjLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUobXNnLCBlbmMpIHtcbiAgdGhpcy5pbm5lci51cGRhdGUobXNnLCBlbmMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkhtYWMucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgdGhpcy5vdXRlci51cGRhdGUodGhpcy5pbm5lci5kaWdlc3QoKSk7XG4gIHJldHVybiB0aGlzLm91dGVyLmRpZ2VzdChlbmMpO1xufTtcbiIsCiAgICAidmFyIGhhc2ggPSBleHBvcnRzO1xuXG5oYXNoLnV0aWxzID0gcmVxdWlyZSgnLi9oYXNoL3V0aWxzJyk7XG5oYXNoLmNvbW1vbiA9IHJlcXVpcmUoJy4vaGFzaC9jb21tb24nKTtcbmhhc2guc2hhID0gcmVxdWlyZSgnLi9oYXNoL3NoYScpO1xuaGFzaC5yaXBlbWQgPSByZXF1aXJlKCcuL2hhc2gvcmlwZW1kJyk7XG5oYXNoLmhtYWMgPSByZXF1aXJlKCcuL2hhc2gvaG1hYycpO1xuXG4vLyBQcm94eSBoYXNoIGZ1bmN0aW9ucyB0byB0aGUgbWFpbiBvYmplY3Rcbmhhc2guc2hhMSA9IGhhc2guc2hhLnNoYTE7XG5oYXNoLnNoYTI1NiA9IGhhc2guc2hhLnNoYTI1Njtcbmhhc2guc2hhMjI0ID0gaGFzaC5zaGEuc2hhMjI0O1xuaGFzaC5zaGEzODQgPSBoYXNoLnNoYS5zaGEzODQ7XG5oYXNoLnNoYTUxMiA9IGhhc2guc2hhLnNoYTUxMjtcbmhhc2gucmlwZW1kMTYwID0gaGFzaC5yaXBlbWQucmlwZW1kMTYwO1xuIiwKICAgICJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgZG91Ymxlczoge1xuICAgIHN0ZXA6IDQsXG4gICAgcG9pbnRzOiBbXG4gICAgICBbXG4gICAgICAgICdlNjBmY2U5M2I1OWU5ZWM1MzAxMWFhYmMyMWMyM2U5N2IyYTMxMzY5Yjg3YTVhZTljNDRlZTg5ZTJhNmRlYzBhJyxcbiAgICAgICAgJ2Y3ZTM1MDczOTllNTk1OTI5ZGI5OWYzNGY1NzkzNzEwMTI5Njg5MWU0NGQyM2YwYmUxZjMyY2NlNjk2MTY4MjEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzgyODIyNjMyMTJjNjA5ZDllYTJhNmUzZTE3MmRlMjM4ZDhjMzljYWJkNWFjMWNhMTA2NDZlMjNmZDVmNTE1MDgnLFxuICAgICAgICAnMTFmOGE4MDk4NTU3ZGZlNDVlODI1NmU4MzBiNjBhY2U2MmQ2MTNhYzJmN2IxN2JlZDMxYjZlYWZmNmUyNmNhZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTc1ZTE1OWY3MjhiODY1YTcyZjk5Y2M2YzZmYzg0NmRlMGI5MzgzM2ZkMjIyMmVkNzNmY2U1YjU1MWU1YjczOScsXG4gICAgICAgICdkMzUwNmUwZDllM2M3OWViYTRlZjk3YTUxZmY3MWY1ZWFjYjU5NTVhZGQyNDM0NWM2ZWZhNmZmZWU5ZmVkNjk1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNjNkOTBkNDQ3YjAwYzljOTljZWFjMDViNjI2MmVlMDUzNDQxYzdlNTU1NTJmZmU1MjZiYWQ4ZjgzZmY0NjQwJyxcbiAgICAgICAgJzRlMjczYWRmYzczMjIyMTk1M2I0NDUzOTdmMzM2MzE0NWI5YTg5MDA4MTk5ZWNiNjIwMDNjN2YzYmVlOWRlOScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGI0YjVmMTY1ZGYzYzJiZThjNjI0NGI1Yjc0NTYzODg0M2U0YTc4MWExNWJjZDFiNjlmNzlhNTVkZmZkZjgwYycsXG4gICAgICAgICc0YWFkMGE2ZjY4ZDMwOGI0YjNmYmQ3ODEzYWIwZGEwNGY5ZTMzNjU0NjE2MmVlNTZiM2VmZjBjNjVmZDRmZDM2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3MjNjYmFhNmU1ZGI5OTZkNmJmNzcxYzAwYmQ1NDhjN2I3MDBkYmZmYTZjMGU3N2JjYjYxMTU5MjUyMzJmY2RhJyxcbiAgICAgICAgJzk2ZTg2N2I1NTk1Y2M0OThhOTIxMTM3NDg4ODI0ZDZlMjY2MGEwNjUzNzc5NDk0ODAxZGMwNjlkOWViMzlmNWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VlYmZhNGQ0OTNiZWJmOThiYTVmZWVjODEyYzJkM2I1MDk0Nzk2MTIzN2E5MTk4MzlhNTMzZWNhMGU3ZGQ3ZmEnLFxuICAgICAgICAnNWQ5YThjYTM5NzBlZjBmMjY5ZWU3ZWRhZjE3ODA4OWQ5YWU0Y2RjM2E3MTFmNzEyZGRmZDRmZGFlMWRlODk5OScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTAwZjQ0ZGE2OTZlNzE2NzI3OTFkMGEwOWI3YmRlNDU5ZjEyMTVhMjliM2MwM2JmZWZkNzgzNWIzOWE0OGRiMCcsXG4gICAgICAgICdjZGQ5ZTEzMTkyYTAwYjc3MmVjOGYzMzAwYzA5MDY2NmI3ZmY0YTE4ZmY1MTk1YWMwZmJkNWNkNjJiYzY1YTA5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlMTAzMWJlMjYyYzdlZDFiMWRjOTIyN2E0YTA0YzAxN2E3N2Y4ZDQ0NjRmM2IzODUyYzhhY2RlNmU1MzRmZDJkJyxcbiAgICAgICAgJzlkNzA2MTkyODk0MDQwNWU2YmI2YTQxNzY1OTc1MzVhZjI5MmRkNDE5ZTFjZWQ3OWE0NGYxOGYyOTQ1NmEwMGQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ZlZWE2Y2FlNDZkNTViNTMwYWMyODM5ZjE0M2JkN2VjNWNmOGIyNjZhNDFkNmFmNTJkNWU2ODhkOTA5NDY5NmQnLFxuICAgICAgICAnZTU3YzZiNmM5N2RjZTFiYWIwNmU0ZTEyYmYzZWNkNWM5ODFjODk1N2NjNDE0NDJkMzE1NWRlYmYxODA5MDA4OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGE2N2E5MWQ5MTA0OWNkY2IzNjdiZTRiZTZmZmNhM2NmZWVkNjU3ZDgwODU4M2RlMzNmYTk3OGJjMWVjNmNiMScsXG4gICAgICAgICc5YmFjYWEzNTQ4MTY0MmJjNDFmNDYzZjdlYzk3ODBlNWRlYzdhZGM1MDhmNzQwYTE3ZTllYThlMjdhNjhiZTFkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1MzkwNGZhYTBiMzM0Y2RkYTZlMDAwOTM1ZWYyMjE1MWVjMDhkMGY3YmIxMTA2OWY1NzU0NWNjYzFhMzdiN2MwJyxcbiAgICAgICAgJzViYzA4N2QwYmM4MDEwNmQ4OGM5ZWNjYWMyMGQzYzFjMTM5OTk5ODFlMTQ0MzQ2OTlkY2IwOTZiMDIyNzcxYzgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhlN2JjZDBiZDM1OTgzYTc3MTljY2E3NzY0Y2E5MDY3NzliNTNhMDQzYTliOGJjYWVmZjk1OWY0M2FkODYwNDcnLFxuICAgICAgICAnMTBiNzc3MGIyYTNkYTRiMzk0MDMxMDQyMGNhOTUxNDU3OWU4OGUyZTQ3ZmQ2OGIzZWExMDA0N2U4NDYwMzcyYScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzg1ZWVkMzRjMWNkZmYyMWU2ZDA4MTg2ODliODFiZGU3MWE3ZjRmMTgzOTdlNjY5MGE4NDFlMTU5OWM0Mzg2MicsXG4gICAgICAgICcyODNiZWJjM2U4ZWEyM2Y1NjcwMWRlMTllOWViZjQ1NzZiMzA0ZWVjMjA4NmRjOGNjMDQ1OGZlNTU0MmU1NDUzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2ZjlkOWI4MDNlY2YxOTE2MzdjNzNhNDQxM2RmYTE4MGZkZGY4NGE1OTQ3ZmJjOWM2MDZlZDg2YzNmYWMzYTcnLFxuICAgICAgICAnN2M4MGM2OGU2MDMwNTliYTY5YjhlMmEzMGU0NWM0ZDQ3ZWE0ZGQyZjVjMjgxMDAyZDg2ODkwNjAzYTg0MjE2MCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzMyMmQ0MDEyNDNjNGUyNTgyYTIxNDdjMTA0ZDZlY2JmNzc0ZDE2M2RiMGY1ZTUzMTNiN2UwZTc0MmQwZTZiZCcsXG4gICAgICAgICc1NmU3MDc5N2U5NjY0ZWY1YmZiMDE5YmM0ZGRhZjliNzI4MDVmNjNlYTI4NzNhZjYyNGYzYTJlOTZjMjhiMmEwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NTY3MmM3ZDJkZTBiN2RhMmJkMTc3MGQ4OTY2NTg2ODc0MWIzZjlhZjc2NDMzOTc3MjFkNzRkMjgxMzRhYjgzJyxcbiAgICAgICAgJzdjNDgxYjliNWI0M2IyZWI2Mzc0MDQ5YmZhNjJjMmU1ZTc3ZjE3ZmNjNTI5OGY0NGM4ZTMwOTRmNzkwMzEzYTYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzk0OGJmODA5YjE5ODhhNDZiMDZjOWYxOTE5NDEzYjEwZjkyMjZjNjBmNjY4ODMyZmZkOTU5YWY2MGM4MmEwYScsXG4gICAgICAgICc1M2E1NjI4NTZkY2I2NjQ2ZGM2Yjc0YzVkMWMzNDE4YzZkNGRmZjA4Yzk3Y2QyYmVkNGNiN2Y4OGQ4YzhlNTg5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2MjYwY2U3ZjQ2MTgwMWMzNGYwNjdjZTBmMDI4NzNhOGYxYjBlNDRkZmM2OTc1MmFjY2VjZDgxOWYzOGZkOGU4JyxcbiAgICAgICAgJ2JjMmRhODJiNmZhNWI1NzFhN2YwOTA0OTc3NmExZWY3ZWNkMjkyMjM4MDUxYzE5OGMxYTg0ZTk1YjJiNGFlMTcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U1MDM3ZGUwYWZjMWQ4ZDQzZDgzNDg0MTRiYmY0MTAzMDQzZWM4ZjU3NWJmZGM0MzI5NTNjYzhkMjAzN2ZhMmQnLFxuICAgICAgICAnNDU3MTUzNGJhYTk0ZDNiNWY5Zjk4ZDA5ZmI5OTBiZGRiZDVmNWIwM2VjNDgxZjEwZTBlNWRjODQxZDc1NWJkYScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTA2MzcyYjBmNGEyMDdhZGY1ZWE5MDVlOGYxNzcxYjRlN2U4ZGJkMWM2YTZjNWI3MjU4NjZhMGFlNGZjZTcyNScsXG4gICAgICAgICc3YTkwODk3NGJjZTE4Y2ZlMTJhMjdiYjJhZDVhNDg4Y2Q3NDg0YTc3ODcxMDQ4NzBiMjcwMzRmOTRlZWUzMWRkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyMTNjN2E3MTVjZDVkNDUzNThkMGJiZjlkYzBjZTAyMjA0YjEwYmRkZTJhM2Y1ODU0MGFkNjkwOGQwNTU5NzU0JyxcbiAgICAgICAgJzRiNmRhZDBiNWFlNDYyNTA3MDEzYWQwNjI0NWJhMTkwYmI0ODUwZjVmMzZhN2VlZGRmZjJjMjc1MzRiNDU4ZjInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRlN2MyNzJhN2FmNGIzNGU4ZGJiOTM1MmE1NDE5YTg3ZTI4MzhjNzBhZGM2MmNkZGYwY2MzYTNiMDhmYmQ1M2MnLFxuICAgICAgICAnMTc3NDljNzY2YzlkMGIxOGUxNmZkMDlmNmRlZjY4MWI1MzBiOTYxNGJmZjdkZDMzZTBiMzk0MTgxN2RjYWFlNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmVhNzRlM2RiZTc3OGIxYjEwZjIzOGFkNjE2ODZhYTVjNzZlM2RiMmJlNDMwNTc2MzI0MjdlMjg0MGZiMjdiNicsXG4gICAgICAgICc2ZTA1NjhkYjliMGIxMzI5N2NmNjc0ZGVjY2I2YWY5MzEyNmI1OTZiOTczZjdiNzc3MDFkM2RiN2YyM2NiOTZmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NmU2NDExM2Y2NzdjZjBlMTBhMjU3MGQ1OTk5NjhkMzE1NDRlMTc5Yjc2MDQzMjk1MmMwMmE0NDE3YmRkZTM5JyxcbiAgICAgICAgJ2M5MGRkZjhkZWU0ZTk1Y2Y1NzcwNjZkNzA2ODFmMGQzNWUyYTMzZDJiNTZkMjAzMmI0YjE3NTJkMTkwMWFjMDEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M3MzhjNTZiMDNiMmFiZTFlODI4MWJhYTc0M2Y4ZjlhOGY3Y2M2NDNkZjI2Y2JlZTNhYjE1MDI0MmJjYmI4OTEnLFxuICAgICAgICAnODkzZmI1Nzg5NTFhZDI1MzdmNzE4ZjJlYWNiZmJiYmI4MjMxNGVlZjc4ODBjZmU5MTdlNzM1ZDk2OTlhODRjMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDg5NTYyNjU0OGI2NWI4MWUyNjRjNzYzN2M5NzI4NzdkMWQ3MmU1ZjNhOTI1MDE0MzcyZTlmNjU4OGY2YzE0YicsXG4gICAgICAgICdmZWJmYWEzOGYyYmM3ZWFlNzI4ZWM2MDgxOGMzNDBlYjAzNDI4ZDYzMmJiMDY3ZTE3OTM2M2VkNzVkN2Q5OTFmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiOGRhOTQwMzJhOTU3NTE4ZWIwZjY0MzM1NzFlODc2MWNlZmZjNzM2OTNlODRlZGQ0OTE1MGE1NjRmNjc2ZTAzJyxcbiAgICAgICAgJzI4MDRkZmE0NDgwNWExZTRkN2M5OWNjOTc2MjgwOGIwOTJjYzU4NGQ5NWZmM2I1MTE0ODhlNGU3NGVmZGY2ZTcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U4MGZlYTE0NDQxZmIzM2E3ZDhhZGFiOTQ3NWQ3ZmFiMjAxOWVmZmI1MTU2YTc5MmYxYTExNzc4ZTNjMGRmNWQnLFxuICAgICAgICAnZWVkMWRlN2Y2MzhlMDA3NzFlODk3NjhjYTNjYTk0NDcyZDE1NWU4MGFmMzIyZWE5ZmNiNDI5MWI2YWM5ZWM3OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTMwMTY5N2JkZmNkNzA0MzEzYmE0OGU1MWQ1Njc1NDNmMmExODIwMzFlZmQ2OTE1ZGRjMDdiYmNjNGUxNjA3MCcsXG4gICAgICAgICc3MzcwZjkxY2ZiNjdlNGY1MDgxODA5ZmEyNWQ0MGY5YjE3MzVkYmY3YzBhMTFhMTMwYzBkMWEwNDFlMTc3ZWExJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5MGFkODViMzg5ZDZiOTM2NDYzZjlkMDUxMjY3OGRlMjA4Y2MzMzBiMTEzMDdmZmZhYjdhYzYzZTNmYjA0ZWQ0JyxcbiAgICAgICAgJ2U1MDdhMzYyMGEzODI2MWFmZmRjYmQ5NDI3MjIyYjgzOWFlZmFiZTE1ODI4OTRkOTkxZDRkNDhjYjZlZjE1MCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGY2OGI5ZDJmNjNiNWYzMzkyMzljMWFkOTgxZjE2MmVlODhjNTY3ODcyM2VhMzM1MWI3YjQ0NGM5ZWM0YzBkYScsXG4gICAgICAgICc2NjJhOWYyZGJhMDYzOTg2ZGUxZDkwYzJiNmJlMjE1ZGJiZWEyY2ZlOTU1MTBiZmRmMjNjYmY3OTUwMWZmZjgyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNGYzZmIwMTc2YWY4NWQ2NWZmOTlmZjkxOThjMzYwOTFmNDhlODY1MDM2ODFlM2U2Njg2ZmQ1MDUzMjMxZTExJyxcbiAgICAgICAgJzFlNjM2MzNhZDBlZjRmMWMxNjYxYTZkMGVhMDJiNzI4NmNjN2U3NGVjOTUxZDFjOTgyMmMzODU3NmZlYjczYmMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhjMDBmYTliMThlYmYzMzFlYjk2MTUzN2E0NWE0MjY2YzcwMzRmMmYwZDRlMWQwNzE2ZmI2ZWFlMjBlYWUyOWUnLFxuICAgICAgICAnZWZhNDcyNjdmZWE1MjFhMWE5ZGMzNDNhMzczNmM5NzRjMmZhZGFmYTgxZTM2YzU0ZTdkMmE0YzY2NzAyNDE0YicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTdhMjZjZTY5ZGQ0ODI5ZjNlMTBjZWMwYTllOThlZDMxNDNkMDg0ZjMwOGI5MmMwOTk3ZmRkZmM2MGNiM2U0MScsXG4gICAgICAgICcyYTc1OGUzMDBmYTc5ODRiNDcxYjAwNmExYWFmYmIxOGQwYTZiMmMwNDIwZTgzZTIwZThhOTQyMWNmMmNmZDUxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiNjQ1OWUwZWUzNjYyZWM4ZDIzNTQwYzIyM2JjYmRjNTcxY2JjYjk2N2Q3OTQyNGYzY2YyOWViM2RlNmI4MGVmJyxcbiAgICAgICAgJzY3Yzg3NmQwNmYzZTA2ZGUxZGFkZjE2ZTU2NjFkYjNjNGIzYWU2ZDQ4ZTM1YjJmZjMwYmYwYjYxYTcxYmE0NScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDY4YTgwYzgyODBiYjg0MDc5MzIzNGFhMTE4ZjA2MjMxZDZmMWZjNjdlNzNjNWE1ZGVkYTBmNWI0OTY5NDNlOCcsXG4gICAgICAgICdkYjhiYTlmZmY0YjU4NmQwMGM0YjFmOTE3N2IwZTI4YjViMGU3YjhmNzg0NTI5NWEyOTRjODQyNjZiMTMzMTIwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMjRhZWQ3ZGY2NWM4MDQyNTJkYzAyNzA5MDdhMzBiMDk2MTJhZWI5NzM0NDljZWE0MDk1OTgwZmMyOGQzZDVkJyxcbiAgICAgICAgJzY0OGEzNjU3NzRiNjFmMmZmMTMwYzBjMzVhZWMxZjRmMTkyMTNiMGM3ZTMzMjg0Mzk2NzIyNGFmOTZhYjdjODQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRkZjljMTQ5MTljZGU2MWY2ZDUxZGZkYmU1ZmVlNWRjZWVjNDE0M2JhOGQxY2E4ODhlOGJkMzczZmQwNTRjOTYnLFxuICAgICAgICAnMzVlYzUxMDkyZDg3MjgwNTA5NzRjMjNhMWQ4NWQ0YjVkNTA2Y2RjMjg4NDkwMTkyZWJhYzA2Y2FkMTBkNWQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzljMzkxOWE4NGE0NzQ4NzBmYWVkOGE5YzFjYzY2MDIxNTIzNDg5MDU0ZDdmMDMwOGNiZmM5OWM4YWMxZjk4Y2QnLFxuICAgICAgICAnZGRiODRmMGY0YTRkZGQ1NzU4NGYwNDRiZjI2MGU2NDE5MDUzMjZmNzZjNjRjOGU2YmU3ZTVlMDNkNGZjNTk5ZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjA1NzE3MGIxZGQxMmZkZjhkZTA1ZjI4MWQ4ZTA2YmI5MWUxNDkzYThiOTFkNGNjNWEyMTM4MjEyMGE5NTllNScsXG4gICAgICAgICc5YTFhZjBiMjZhNmE0ODA3YWRkOWEyZGFmNzFkZjI2MjQ2NTE1MmJjM2VlMjRjNjVlODk5YmU5MzIzODVhMmE4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhNTc2ZGY4ZTIzYTA4NDExNDIxNDM5YTQ1MThkYTMxODgwY2VmMGZiYTdkNGRmMTJiMWE2OTczZWVjYjk0MjY2JyxcbiAgICAgICAgJzQwYTZiZjIwZTc2NjQwYjJjOTJiOTdhZmU1OGNkODJjNDMyZTEwYTdmNTE0ZDlmM2VlOGJlMTFhZTFiMjhlYzgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3NzhhNzhjMjhkZWMzZTMwYTA1ZmU5NjI5ZGU4YzM4YmIzMGQxZjVjZjlhM2EyMDhmNzYzODg5YmU1OGFkNzEnLFxuICAgICAgICAnMzQ2MjZkOWFiNWE1YjIyZmY3MDk4ZTEyZjJmZjU4MDA4N2IzODQxMWZmMjRhYzU2M2I1MTNmYzFmZDlmNDNhYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTI4OTU1ZWU2MzdhODQ0NjM3MjlmZDMwZTdhZmQyZWQ1Zjk2Mjc0ZTVhZDdlNWNiMDllZGE5YzA2ZDkwM2FjJyxcbiAgICAgICAgJ2MyNTYyMTAwM2QzZjQyYTgyN2I3OGExMzA5M2E5NWVlYWMzZDI2ZWZhOGE4ZDgzZmM1MTgwZTkzNWJjZDA5MWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg1ZDBmZWYzZWM2ZGIxMDkzOTkwNjRmM2EwZTNiMjg1NTY0NWI0YTkwN2FkMzU0NTI3YWFlNzUxNjNkODI3NTEnLFxuICAgICAgICAnMWYwMzY0ODQxM2EzOGMwYmUyOWQ0OTZlNTgyY2Y1NjYzZTg3NTFlOTY4NzczMzE1ODJjMjM3YTI0ZWIxZjk2MicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmYyYjBkY2U5N2VlY2U5N2MxYzliNjA0MTc5OGI4NWRmZGZiNmQ4ODgyZGEyMDMwOGY1NDA0ODI0NTI2MDg3ZScsXG4gICAgICAgICc0OTNkMTNmZWY1MjRiYTE4OGFmNGM0ZGM1NGQwNzkzNmM3YjdlZDZmYjkwZTJjZWIyYzk1MWUwMWYwYzI5OTA3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4MjdmYmJlNGIxZTg4MGVhOWVkMmIyZTYzMDFiMjEyYjU3ZjFlZTE0OGNkNmRkMjg3ODBlNWUyY2Y4NTZlMjQxJyxcbiAgICAgICAgJ2M2MGY5YzkyM2M3MjdiMGI3MWJlZjJjNjdkMWQxMjY4N2ZmN2E2MzE4NjkwMzE2NmQ2MDViNjhiYWVjMjkzZWMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VhYTY0OWYyMWY1MWJkYmFlN2JlNGFlMzRjZTZlNTIxN2E1OGZkY2U3ZjQ3ZjlhYTdmM2I1OGZhMjEyMGUyYjMnLFxuICAgICAgICAnYmUzMjc5ZWQ1YmJiYjAzYWM2OWE4MGY4OTg3OWFhNWEwMWE2Yjk2NWYxM2Y3ZTU5ZDQ3YTUzMDViYTVhZDkzZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTRhNDJkNDNjNWNmMTY5ZDkzOTFkZjZkZWNmNDJlZTU0MWI2ZDhmMGM5YTEzNzQwMWUyMzYzMmRkYTM0ZDI0ZicsXG4gICAgICAgICc0ZDlmOTJlNzE2ZDFjNzM1MjZmYzk5Y2NmYjhhZDM0Y2U4ODZlZWRmYThkOGU0ZjEzYTdmNzEzMWRlYmE5NDE0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxZWM4MGZlZjM2MGNiZGQ5NTQxNjBmYWRhYjM1MmI2YjkyYjUzNTc2YTg4ZmVhNDk0NzE3M2I5ZDQzMDBiZjE5JyxcbiAgICAgICAgJ2FlZWZlOTM3NTZiNTM0MGQyZjNhNDk1OGE3YWJiZjVlMDE0NmU3N2Y2Mjk1YTA3YjY3MWNkYzFjYzEwN2NlZmQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE0NmE3NzhjMDQ2NzBjMmY5MWIwMGFmNDY4MGRmYThiY2UzNDkwNzE3ZDU4YmE4ODlkZGI1OTI4MzY2NjQyYmUnLFxuICAgICAgICAnYjMxOGUwZWMzMzU0MDI4YWRkNjY5ODI3ZjlkNGIyODcwYWFhOTcxZDJmN2U1ZWQxZDBiMjk3NDgzZDgzZWZkMCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmE1MGMwZjYxZDIyZTVmMDdlM2FjZWJiMWFhMDdiMTI4ZDAwMTIyMDlhMjhiOTc3NmQ3NmE4NzkzMTgwZWVmOScsXG4gICAgICAgICc2Yjg0YzY5MjIzOTdlYmE5YjcyY2QyODcyMjgxYTY4YTVlNjgzMjkzYTU3YTIxM2IzOGNkOGQ3ZDNmNGYyODExJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkYTFkNjFkMGNhNzIxYTExYjFhNWJmNmI3ZDg4ZTg0MjFhMjg4YWI1ZDViYmE1MjIwZTUzZDMyYjVmMDY3ZWMyJyxcbiAgICAgICAgJzgxNTdmNTVhN2M5OTMwNmM3OWMwNzY2MTYxYzkxZTI5NjZhNzM4OTlkMjc5YjQ4YTY1NWZiYTBmMWFkODM2ZjEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E4ZTI4MmZmMGM5NzA2OTA3MjE1ZmY5OGU4ZmQ0MTY2MTUzMTFkZTA0NDZmMWUwNjJhNzNiMDYxMGQwNjRlMTMnLFxuICAgICAgICAnN2Y5NzM1NWI4ZGI4MWMwOWFiZmI3ZjNjNWIyNTE1ODg4YjY3OWEzZTUwZGQ2YmQ2Y2VmN2M3MzExMWY0Y2MwYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTc0YTUzYjljOWEyODU4NzJkMzllNTZlNjkxM2NhYjE1ZDU5YjFmYTUxMjUwOGMwMjJmMzgyZGU4MzE5NDk3YycsXG4gICAgICAgICdjY2M5ZGMzN2FiZmM5YzE2NTdiNDE1NWYyYzQ3ZjllNjY0NmIzYTFkOGNiOTg1NDM4M2RhMTNhYzA3OWFmYTczJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5NTkzOTY5ODE5NDM3ODVjM2QzZTU3ZWRmNTAxOGNkYmUwMzllNzMwZTQ5MThiM2Q4ODRmZGZmMDk0NzViN2JhJyxcbiAgICAgICAgJzJlN2U1NTI4ODhjMzMxZGQ4YmEwMzg2YTRiOWNkNjg0OWM2NTNmNjRjODcwOTM4NWU5YjhhYmY4NzUyNGYyZmQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QyYTYzYTUwYWU0MDFlNTZkNjQ1YTExNTNiMTA5YThmY2NhMGE0M2Q1NjFmYmEyZGJiNTEzNDBjOWQ4MmIxNTEnLFxuICAgICAgICAnZTgyZDg2ZmI2NDQzZmNiNzU2NWFlZTU4YjI5NDgyMjBhNzBmNzUwYWY0ODRjYTUyZDQxNDIxNzRkY2Y4OTQwNScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjQ1ODdlMjMzNTQ3MWViODkwZWU3ODk2ZDdjZmRjODY2YmFjYmRiZDM4MzkzMTdiMzQzNmY5YjQ1NjE3ZTA3MycsXG4gICAgICAgICdkOTlmY2RkNWJmNjkwMmUyYWU5NmRkNjQ0N2MyOTlhMTg1YjkwYTM5MTMzYWVhYjM1ODI5OWU1ZTlmYWY2NTg5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NDgxYmRlMGU0ZTRkODg1YjNhNTQ2ZDNlNTQ5ZGUwNDJmMGFhNmNlYTI1MGU3ZmQzNThkNmM4NmRkNDVlNDU4JyxcbiAgICAgICAgJzM4ZWU3YjhjYmE1NDA0ZGQ4NGEyNWJmMzljZWNiMmNhOTAwYTc5YzQyYjI2MmU1NTZkNjRiMWI1OTc3OTA1N2UnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzEzNDY0YTU3YTc4MTAyYWE2MmI2OTc5YWU4MTdmNDYzN2ZmY2ZlZDNjNGIxY2UzMGJjZDYzMDNmNmNhZjY2NmInLFxuICAgICAgICAnNjliZTE1OTAwNDYxNDU4MGVmN2U0MzM0NTNjY2IwY2E0OGYzMDBhODFkMDk0MmUxM2Y0OTVhOTA3ZjZlY2MyNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYmM0YTlkZjViNzEzZmUyZTlhZWY0MzBiY2MxZGM5N2EwY2Q5Y2NlZGUyZjI4NTg4Y2FkYTNhMGQyZDgzZjM2NicsXG4gICAgICAgICdkM2E4MWNhNmU3ODVjMDYzODM5MzdhZGY0Yjc5OGNhYTZlOGE5ZmJmYTU0N2IxNmQ3NThkNjY2NTgxZjMzYzEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhjMjhhOTdiZjgyOThiYzBkMjNkOGM3NDk0NTJhMzJlNjk0YjY1ZTMwYTk0NzJhMzk1NGFiMzBmZTUzMjRjYWEnLFxuICAgICAgICAnNDBhMzA0NjNhMzMwNTE5MzM3OGZlZGYzMWY3Y2MwZWI3YWU3ODRmMDQ1MWNiOTQ1OWU3MWRjNzNjYmVmOTQ4MicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGVhOTY2NjEzOTUyN2E4YzFkZDk0Y2U0ZjA3MWZkMjNjOGIzNTBjNWE0YmIzMzc0OGM0YmExMTFmYWNjYWUwJyxcbiAgICAgICAgJzYyMGVmYWJiYzhlZTI3ODJlMjRlN2MwY2ZiOTVjNWQ3MzViNzgzYmU5Y2YwZjhlOTU1YWYzNGEzMGU2MmI5NDUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RkMzYyNWZhZWY1YmEwNjA3NDY2OTcxNmJiZDM3ODhkODliZGRlODE1OTU5OTY4MDkyZjc2Y2M0ZWI5YTk3ODcnLFxuICAgICAgICAnN2ExODhmYTM1MjBlMzBkNDYxZGEyNTAxMDQ1NzMxY2E5NDE0NjE5ODI4ODMzOTU5MzdmNjhkMDBjNjQ0YTU3MycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjcxMGQ3OWQ5ZWI5NjIyOTdlNGY2MjMyYjQwZThmN2ZlYjJiYzYzODE0NjE0ZDY5MmMxMmRlNzUyNDA4MjIxZScsXG4gICAgICAgICdlYTk4ZTY3MjMyZDNiMzI5NWQzYjUzNTUzMjExNWNjYWM4NjEyYzcyMTg1MTYxNzUyNmFlNDdhOWM3N2JmYzgyJyxcbiAgICAgIF0sXG4gICAgXSxcbiAgfSxcbiAgbmFmOiB7XG4gICAgd25kOiA3LFxuICAgIHBvaW50czogW1xuICAgICAgW1xuICAgICAgICAnZjkzMDhhMDE5MjU4YzMxMDQ5MzQ0Zjg1Zjg5ZDUyMjliNTMxYzg0NTgzNmY5OWIwODYwMWYxMTNiY2UwMzZmOScsXG4gICAgICAgICczODhmN2IwZjYzMmRlODE0MGZlMzM3ZTYyYTM3ZjM1NjY1MDBhOTk5MzRjMjIzMWI2Y2I5ZmQ3NTg0YjhlNjcyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyZjhiZGU0ZDFhMDcyMDkzNTViNGE3MjUwYTVjNTEyOGU4OGI4NGJkZGM2MTlhYjdjYmE4ZDU2OWIyNDBlZmU0JyxcbiAgICAgICAgJ2Q4YWMyMjI2MzZlNWUzZDZkNGRiYTlkZGE2YzljNDI2Zjc4ODI3MWJhYjBkNjg0MGRjYTg3ZDNhYTZhYzYyZDYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzVjYmRmMDY0NmU1ZGI0ZWFhMzk4ZjM2NWYyZWE3YTBlM2Q0MTliN2UwMzMwZTM5Y2U5MmJkZGVkY2FjNGY5YmMnLFxuICAgICAgICAnNmFlYmNhNDBiYTI1NTk2MGEzMTc4ZDZkODYxYTU0ZGJhODEzZDBiODEzZmRlN2I1YTUwODI2MjgwODcyNjRkYScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYWNkNDg0ZTJmMGM3ZjY1MzA5YWQxNzhhOWY1NTlhYmRlMDk3OTY5NzRjNTdlNzE0YzM1ZjExMGRmYzI3Y2NiZScsXG4gICAgICAgICdjYzMzODkyMWIwYTdkOWZkNjQzODA5NzE3NjNiNjFlOWFkZDg4OGE0Mzc1ZjhlMGYwNWNjMjYyYWM2NGY5YzM3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NzRhZTdmODU4YTk0MTFlNWVmNDI0NmI3MGM2NWFhYzU2NDk5ODBiZTVjMTc4OTFiYmVjMTc4OTVkYTAwOGNiJyxcbiAgICAgICAgJ2Q5ODRhMDMyZWI2YjVlMTkwMjQzZGQ1NmQ3YjdiMzY1MzcyZGIxZTJkZmY5ZDZhODMwMWQ3NGM5Yzk1M2M2MWInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YyODc3M2MyZDk3NTI4OGJjN2QxZDIwNWMzNzQ4NjUxYjA3NWZiYzY2MTBlNThjZGRlZWRkZjhmMTk0MDVhYTgnLFxuICAgICAgICAnYWIwOTAyZThkODgwYTg5NzU4MjEyZWI2NWNkYWY0NzNhMWEwNmRhNTIxZmE5MWYyOWI1Y2I1MmRiMDNlZDgxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNzkyNGQ0ZjdkNDNlYTk2NWE0NjVhZTMwOTVmZjQxMTMxZTU5NDZmM2M4NWY3OWU0NGFkYmNmOGUyN2UwODBlJyxcbiAgICAgICAgJzU4MWUyODcyYTg2YzcyYTY4Mzg0MmVjMjI4Y2M2ZGVmZWE0MGFmMmJkODk2ZDNhNWM1MDRkYzlmZjZhMjZiNTgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RlZmRlYTRjZGI2Nzc3NTBhNDIwZmVlODA3ZWFjZjIxZWI5ODk4YWU3OWI5NzY4NzY2ZTRmYWEwNGEyZDRhMzQnLFxuICAgICAgICAnNDIxMWFiMDY5NDYzNTE2OGU5OTdiMGVhZDJhOTNkYWVjZWQxZjRhMDRhOTVjMGY2Y2ZiMTk5ZjY5ZTU2ZWI3NycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMmI0ZWEwYTc5N2E0NDNkMjkzZWY1Y2ZmNDQ0ZjQ5NzlmMDZhY2ZlYmQ3ZTg2ZDI3NzQ3NTY1NjEzODM4NWI2YycsXG4gICAgICAgICc4NWU4OWJjMDM3OTQ1ZDkzYjM0MzA4M2I1YTFjODYxMzFhMDFmNjBjNTAyNjk3NjNiNTcwYzg1NGU1YzA5YjdhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNTJiYmY0YTRjZGQxMjU2NGY5M2ZhMzMyY2UzMzMzMDFkOWFkNDAyNzFmODEwNzE4MTM0MGFlZjI1YmU1OWQ1JyxcbiAgICAgICAgJzMyMWViNDA3NTM0OGY1MzRkNTljMTgyNTlkZGEzZTFmNGExYjNiMmU3MWIxMDM5YzY3YmQzZDhiY2Y4MTk5OGMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzJmYTIxMDRkNmIzOGQxMWIwMjMwMDEwNTU5ODc5MTI0ZTQyYWI4ZGZlZmY1ZmYyOWRjOWNkYWRkNGVjYWNjM2YnLFxuICAgICAgICAnMmRlMTA2ODI5NWRkODY1YjY0NTY5MzM1YmQ1ZGQ4MDE4MWQ3MGVjZmM4ODI2NDg0MjNiYTc2YjUzMmI3ZDY3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5MjQ4Mjc5YjA5YjRkNjhkYWIyMWE5YjA2NmVkZGE4MzI2M2MzZDg0ZTA5NTcyZTI2OWNhMGNkN2Y1NDUzNzE0JyxcbiAgICAgICAgJzczMDE2ZjdiZjIzNGFhZGU1ZDFhYTcxYmRlYTJiMWZmM2ZjMGRlMmE4ODc5MTJmZmU1NGEzMmNlOTdjYjM0MDInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RhZWQ0ZjJiZTNhOGJmMjc4ZTcwMTMyZmIwYmViNzUyMmY1NzBlMTQ0YmY2MTVjMDdlOTk2ZDQ0M2RlZTg3MjknLFxuICAgICAgICAnYTY5ZGNlNGE3ZDZjOThlOGQ0YTFhY2E4N2VmOGQ3MDAzZjgzYzIzMGYzYWZhNzI2YWI0MGU1MjI5MGJlMWM1NScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzQ0ZDEyYzcwNjVkODEyZThhY2YyOGQ3Y2JiMTlmOTAxMWVjZDllOWZkZjI4MWIwZTZhM2I1ZTg3ZDIyZTdkYicsXG4gICAgICAgICcyMTE5YTQ2MGNlMzI2Y2RjNzZjNDU5MjZjOTgyZmRhYzBlMTA2ZTg2MWVkZjYxYzVhMDM5MDYzZjBlMGU2NDgyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2YTI0NWJmNmRjNjk4NTA0Yzg5YTIwY2ZkZWQ2MDg1MzE1MmI2OTUzMzZjMjgwNjNiNjFjNjVjYmQyNjllNmI0JyxcbiAgICAgICAgJ2UwMjJjZjQyYzJiZDRhNzA4YjNmNTEyNmYxNmEyNGFkOGIzM2JhNDhkMDQyM2I2ZWZkNWU2MzQ4MTAwZDhhODInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE2OTdmZmE2ZmQ5ZGU2MjdjMDc3ZTNkMmZlNTQxMDg0Y2UxMzMwMGIwYmVjMTE0NmY5NWFlNTdmMGQwYmQ2YTUnLFxuICAgICAgICAnYjljMzk4ZjE4NjgwNmY1ZDI3NTYxNTA2ZTQ1NTc0MzNhMmNmMTUwMDllNDk4YWU3YWRlZTlkNjNkMDFiMjM5NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjA1YmRiMDE5OTgxNzE4Yjk4NmQwZjA3ZTgzNGNiMGQ5ZGViODM2MGZmYjdmNjFkZjk4MjM0NWVmMjdhNzQ3OScsXG4gICAgICAgICcyOTcyZDJkZTRmOGQyMDY4MWE3OGQ5M2VjOTZmZTIzYzI2YmZhZTg0ZmIxNGRiNDNiMDFlMWU5MDU2YjhjNDknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzYyZDE0ZGFiNDE1MGJmNDk3NDAyZmRjNDVhMjE1ZTEwZGNiMDFjMzU0OTU5YjEwY2ZlMzFjN2U5ZDg3ZmYzM2QnLFxuICAgICAgICAnODBmYzA2YmQ4Y2M1YjAxMDk4MDg4YTE5NTBlZWQwZGIwMWFhMTMyOTY3YWI0NzIyMzVmNTY0MjQ4M2IyNWVhZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODBjNjBhZDAwNDBmMjdkYWRlNWI0YjA2YzQwOGU1NmIyYzUwZTlmNTZiOWI4YjQyNWU1NTVjMmY4NjMwOGI2ZicsXG4gICAgICAgICcxYzM4MzAzZjFjYzVjMzBmMjZlNjZiYWQ3ZmU3MmY3MGE2NWVlZDRjYmU3MDI0ZWIxYWEwMWY1NjQzMGJkNTdhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3YTkzNzVhZDYxNjdhZDU0YWE3NGM2MzQ4Y2M1NGQzNDRjYzVkYzk0ODdkODQ3MDQ5ZDVlYWJiMGZhMDNjOGZiJyxcbiAgICAgICAgJ2QwZTNmYTllY2E4NzI2OTA5NTU5ZTBkNzkyNjkwNDZiZGM1OWVhMTBjNzBjZTJiMDJkNDk5ZWMyMjRkYzdmNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDUyOGVjZDliNjk2YjU0YzkwN2E5ZWQwNDU0NDdhNzliYjQwOGVjMzliNjhkZjUwNGJiNTFmNDU5YmMzZmZjOScsXG4gICAgICAgICdlZWNmNDEyNTMxMzZlNWY5OTk2NmYyMTg4MWZkNjU2ZWJjNDM0NTQwNWM1MjBkYmMwNjM0NjViNTIxNDA5OTMzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0OTM3MGE0YjVmNDM0MTJlYTI1ZjUxNGU4ZWNkYWQwNTI2NjExNWU0YTdlY2IxMzg3MjMxODA4ZjhiNDU5NjMnLFxuICAgICAgICAnNzU4ZjNmNDFhZmQ2ZWQ0MjhiMzA4MWIwNTEyZmQ2MmE1NGMzZjNhZmJiNWI2NzY0YjY1MzA1MmExMjk0OWM5YScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzdmMjMwOTM2ZWU4OGNiYmQ3M2RmOTMwZDY0NzAyZWY4ODFkODExZTBlMTQ5OGUyZjFjMTNlYjFmYzM0NWQ3NCcsXG4gICAgICAgICc5NThlZjQyYTc4ODZiNjQwMGEwODI2NmU5YmExYjM3ODk2Yzk1MzMwZDk3MDc3Y2JiZThlYjNjNzY3MWM2MGQ2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMmRhYzk5MWNjNGNlNGI5ZWE0NDg4N2U1YzdjMGJjZTU4YzgwMDc0YWI5ZDRkYmFlYjI4NTMxYjc3MzlmNTMwJyxcbiAgICAgICAgJ2UwZGVkYzliM2IyZjhkYWQ0ZGExZjMyZGVjMjUzMWRmOWViNWZiZWIwNTk4ZTRmZDFhMTE3ZGJhNzAzYTNjMzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQ2M2IzZDlmNjYyNjIxZmIxYjRiZThmYmJlMjUyMDEyNWEyMTZjZGZjOWRhZTNkZWJjYmE0ODUwYzY5MGQ0NWInLFxuICAgICAgICAnNWVkNDMwZDc4YzI5NmMzNTQzMTE0MzA2ZGQ4NjIyZDdjNjIyZTI3Yzk3MGExZGUzMWNiMzc3YjAxYWY3MzA3ZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjE2ZjgwNDI0NGU0NmUyYTA5MjMyZDRhZmYzYjU5OTc2Yjk4ZmFjMTQzMjhhMmQxYTMyNDk2YjQ5OTk4ZjI0NycsXG4gICAgICAgICdjZWRhYmQ5YjgyMjAzZjdlMTNkMjA2ZmNkZjRlMzNkOTJhNmM1M2MyNmU1Y2NlMjZkNjU3OTk2MmM0ZTMxZGY2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjYWY3NTQyNzJkYzg0NTYzYjAzNTJiN2ExNDMxMWFmNTVkMjQ1MzE1YWNlMjdjNjUzNjllMTVmNzE1MWQ0MWQxJyxcbiAgICAgICAgJ2NiNDc0NjYwZWYzNWY1ZjJhNDFiNjQzZmE1ZTQ2MDU3NWY0ZmE5Yjc5NjIyMzJhNWMzMmY5MDgzMThhMDQ0NzYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzI2MDBjYTRiMjgyY2I5ODZmODVkMGYxNzA5OTc5ZDhiNDRhMDljMDdjYjg2ZDdjMTI0NDk3YmM4NmYwODIxMjAnLFxuICAgICAgICAnNDExOWI4ODc1M2MxNWJkNmE2OTNiMDNmY2RkYmI0NWQ1YWM2YmU3NGFiNWYwZWY0NGIwYmU5NDc1YTdlNGI0MCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzYzNWNhNzJkN2U4NDMyYzMzOGVjNTNjZDEyMjIwYmMwMWM0ODY4NWUyNGY3ZGM4YzYwMmE3NzQ2OTk4ZTQzNScsXG4gICAgICAgICc5MWI2NDk2MDk0ODlkNjEzZDFkNWU1OTBmNzhlNmQ3NGVjZmMwNjFkNTcwNDhiYWQ5ZTc2ZjMwMmM1YjljNjEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc1NGUzMjM5ZjMyNTU3MGNkYmJmNGE4N2RlZWU4YTY2YjdmMmIzMzQ3OWQ0NjhmYmMxYTUwNzQzYmY1NmNjMTgnLFxuICAgICAgICAnNjczZmI4NmU1YmRhMzBmYjNjZDBlZDMwNGVhNDlhMDIzZWUzM2QwMTk3YTY5NWQwYzVkOTgwOTNjNTM2NjgzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlM2U2YmQxMDcxYTFlOTZhZmY1Nzg1OWM4MmQ1NzBmMDMzMDgwMDY2MWQxYzk1MmY5ZmUyNjk0NjkxZDliOWU4JyxcbiAgICAgICAgJzU5YzllMGJiYTM5NGU3NmY0MGMwYWE1ODM3OWEzY2I2YTVhMjI4Mzk5M2U5MGM0MTY3MDAyYWY0OTIwZTM3ZjUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE4NmI0ODNkMDU2YTAzMzgyNmFlNzNkODhmNzMyOTg1YzRjY2IxZjMyYmEzNWY0YjRjYzQ3ZmRjZjA0YWE2ZWInLFxuICAgICAgICAnM2I5NTJkMzJjNjdjZjc3ZTJlMTc0NDZlMjA0MTgwYWIyMWZiODA5MDg5NTEzOGI0YTRhNzk3Zjg2ZTgwODg4YicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGY5ZDcwYTZiOTg3NmNlNTQ0Yzk4NTYxZjRiZTRmNzI1NDQyZTZkMmI3MzdkOWM5MWE4MzIxNzI0Y2UwOTYzZicsXG4gICAgICAgICc1NWViMmRhZmQ4NGQ2Y2NkNWY4NjJiNzg1ZGMzOWQ0YWIxNTcyMjI3MjBlZjlkYTIxN2I4YzQ1Y2YyYmEyNDE3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1ZWRkNWNjMjNjNTFlODdhNDk3Y2E4MTVkNWRjZTBmOGFiNTI1NTRmODQ5ZWQ4OTk1ZGU2NGM1ZjM0Y2U3MTQzJyxcbiAgICAgICAgJ2VmYWU5YzhkYmMxNDEzMDY2MWU4Y2VjMDMwYzg5YWQwYzEzYzY2YzBkMTdhMjkwNWNkYzcwNmFiNzM5OWE4NjgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzI5MDc5OGMyYjY0NzY4MzBkYTEyZmUwMjI4N2U5ZTc3N2FhM2ZiYTFjMzU1YjE3YTcyMmQzNjJmODQ2MTRmYmEnLFxuICAgICAgICAnZTM4ZGE3NmRjZDQ0MDYyMTk4OGQwMGJjZjc5YWYyNWQ1YjI5YzA5NGRiMmEyMzE0NmQwMDNhZmQ0MTk0M2U3YScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYWYzYzQyM2E5NWQ5ZjViMzA1NDc1NGVmYTE1MGFjMzljZDI5NTUyZmUzNjAyNTczNjJkZmRlY2VmNDA1M2I0NScsXG4gICAgICAgICdmOThhM2ZkODMxZWIyYjc0OWE5M2IwZTZmMzVjZmI0MGM4Y2Q1YWE2NjdhMTU1ODFiYzJmZWRlZDQ5OGZkOWM2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NjZkYmIyNGQxMzRlNzQ1Y2NjYWEyOGM5OWJmMjc0OTA2YmI2NmIyNmRjZjk4ZGY4ZDJmZWQ1MGQ4ODQyNDlhJyxcbiAgICAgICAgJzc0NGIxMTUyZWFjYmU1ZTM4ZGNjODg3OTgwZGEzOGI4OTc1ODRhNjVmYTA2Y2VkZDJjOTI0Zjk3Y2JhYzU5OTYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzU5ZGJmNDZmOGM5NDc1OWJhMjEyNzdjMzM3ODRmNDE2NDVmN2I0NGY2YzU5NmE1OGNlOTJlNjY2MTkxYWJlM2UnLFxuICAgICAgICAnYzUzNGFkNDQxNzVmYmMzMDBmNGVhNmNlNjQ4MzA5YTA0MmNlNzM5YTc5MTk3OThjZDg1ZTIxNmM0YTMwN2Y2ZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjEzYWRhOTUxMDNjNDUzNzMwNWU2OTFlNzRlOWE0YThkZDY0N2U3MTFhOTVlNzNjYjYyZGM2MDE4Y2ZkODdiOCcsXG4gICAgICAgICdlMTM4MTdiNDRlZTE0ZGU2NjNiZjRiYzgwODM0MWYzMjY5NDllMjFhNmE3NWMyNTcwNzc4NDE5YmRhZjU3MzNkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NzU0YjRmYTBlOGFjZWQwNmQ0MTY3YTJjNTljY2E0Y2RhMTg2OWMwNmViYWRmYjY0ODg1NTAwMTVhODg1MjJjJyxcbiAgICAgICAgJzMwZTkzZTg2NGU2NjlkODIyMjRiOTY3YzMwMjBiOGZhOGQxZTRlMzUwYjZjYmNjNTM3YTQ4YjU3ODQxMTYzYTInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzk0OGRjYWRmNTk5MGUwNDhhYTM4NzRkNDZhYmVmOWQ3MDE4NThmOTVkZTgwNDFkMmE2ODI4Yzk5ZTIyNjI1MTknLFxuICAgICAgICAnZTQ5MWE0MjUzN2Y2ZTU5N2Q1ZDI4YTMyMjRiMWJjMjVkZjkxNTRlZmJkMmVmMWQyY2JiYTJjYWU1MzQ3ZDU3ZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzk2MjQxNDQ1MGM3NmMxNjg5YzdiNDhmODIwMmVjMzdmYjIyNGNmNWFjMGJmYTE1NzAzMjhhOGEzZDdjNzdhYicsXG4gICAgICAgICcxMDBiNjEwZWM0ZmZiNDc2MGQ1YzFmYzEzM2VmNmY2YjEyNTA3YTA1MWYwNGFjNTc2MGFmYTViMjlkYjgzNDM3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNTE0MDg3ODM0OTY0YjU0YjE1YjE2MDY0NGQ5MTU0ODVhMTY5NzcyMjViODg0N2JiMGRkMDg1MTM3ZWM0N2NhJyxcbiAgICAgICAgJ2VmMGFmYmIyMDU2MjA1NDQ4ZTE2NTJjNDhlODEyN2ZjNjAzOWU3N2MxNWMyMzc4YjdlN2QxNWEwZGUyOTMzMTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QzY2MzMGFkNmI0ODNlNGJjNzljZTJjOWRkOGJjNTQ5OTNlOTQ3ZWI4ZGY3ODdiNDQyOTQzZDNmN2I1MjdlYWYnLFxuICAgICAgICAnOGIzNzhhMjJkODI3Mjc4ZDg5YzVlOWJlOGY5NTA4YWUzYzJhZDQ2MjkwMzU4NjMwYWZiMzRkYjA0ZWVkZTBhNCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTYyNGQ4NDc4MDczMjg2MGNlMWM3OGZjYmZlZmUwOGIyYjI5ODIzZGI5MTNmNjQ5Mzk3NWJhMGZmNDg0NzYxMCcsXG4gICAgICAgICc2ODY1MWNmOWI2ZGE5MDNlMDkxNDQ0OGM2Y2Q5ZDRjYTg5Njg3OGY1MjgyYmU0YzhjYzA2ZTJhNDA0MDc4NTc1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3MzNjZTgwZGE5NTVhOGEyNjkwMmM5NTYzM2U2MmE5ODUxOTI0NzRiNWFmMjA3ZGE2ZGY3YjRmZDVmYzYxY2Q0JyxcbiAgICAgICAgJ2Y1NDM1YTJiZDJiYWRmN2Q0ODVhNGQ4YjhkYjlmY2NlM2UxZWY4ZTAyMDFlNDU3OGM1NDY3M2JjMWRjNWVhMWQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE1ZDk0NDEyNTQ5NDUwNjRjZjFhMWMzM2JiZDNiNDlmODk2NmM1MDkyMTcxZTY5OWVmMjU4ZGZhYjgxYzA0NWMnLFxuICAgICAgICAnZDU2ZWIzMGI2OTQ2M2U3MjM0ZjUxMzdiNzNiODQxNzc0MzQ4MDBiYWNlYmZjNjg1ZmMzN2JiZTllZmU0MDcwZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTFkMGZjZjJlYzlkZTY3NWI2MTIxMzZlNWNlNzBkMjcxYzIxNDE3YzlkMmI4YWFhYWMxMzg1OTlkMDcxNzk0MCcsXG4gICAgICAgICdlZGQ3N2Y1MGJjYjVhM2NhYjJlOTA3MzczMDk2NjdmMjY0MTQ2MmE1NDA3MGYzZDUxOTIxMmQzOWMxOTdhNjI5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlMjJmYmUxNWMwYWY4Y2NjNTc4MGMwNzM1Zjg0ZGJlOWE3OTBiYWRlZTgyNDVjMDZjN2NhMzczMzFjYjM2OTgwJyxcbiAgICAgICAgJ2E4NTViYWJhZDVjZDYwYzg4YjQzMGE2OWY1M2ExYTdhMzgyODkxNTQ5NjQ3OTliZTQzZDA2ZDc3ZDMxZGEwNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzExMDkxZGQ5ODYwZThlMjBlZTEzNDczYzExNTVmNWY2OTYzNWUzOTQ3MDRlYWE3NDAwOTQ1MjI0NmNmYTliMycsXG4gICAgICAgICc2NmRiNjU2Zjg3ZDFmMDRmZmZkMWYwNDc4OGMwNjgzMDg3MWVjNWE2NGZlZWU2ODViZDgwZjBiMTI4NmQ4Mzc0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNGMxZmQwNGQzMDFiZTg5YjMxYzA0NDJkM2U2YWMyNDg4MzkyOGI0NWE5MzQwNzgxODY3ZDQyMzJlYzJkYmRmJyxcbiAgICAgICAgJzk0MTQ2ODVlOTdiMWI1OTU0YmQ0NmY3MzAxNzQxMzZkNTdmMWNlZWI0ODc0NDNkYzUzMjE4NTdiYTczYWJlZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjIxOWVhNWQ2YjU0NzAxYzFjMTRkZTViNTU3ZWI0MmE4ZDEzZjNhYmJjZDA4YWZmY2MyYTVlNmIwNDliOGQ2MycsXG4gICAgICAgICc0Y2I5NTk1N2U4M2Q0MGIwZjczYWY0NTQ0Y2NjZjZiMWY0YjA4ZDNjMDdiMjdmYjhkOGMyOTYyYTQwMDc2NmQxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkN2I4NzQwZjc0YThmYmFhYjFmNjgzZGI4ZjQ1ZGUyNjU0M2E1NDkwYmNhNjI3MDg3MjM2OTEyNDY5YTBiNDQ4JyxcbiAgICAgICAgJ2ZhNzc5NjgxMjhkOWM5MmVlMTAxMGYzMzdhZDQ3MTdlZmYxNWRiNWVkM2MwNDliMzQxMWUwMzE1ZWFhNDU5M2InLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMyZDMxYzIyMmY4ZjZmMGVmODZmN2M5OGQzYTMzMzVlYWQ1YmNkMzJhYmRkOTQyODlmZTRkMzA5MWFhODI0YmYnLFxuICAgICAgICAnNWYzMDMyZjU4OTIxNTZlMzljY2QzZDc5MTViOWUxZGEyZTZkYWM5ZTZmMjZlOTYxMTE4ZDE0Yjg0NjJlMTY2MScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzQ2MWYzNzE5MTRhYjMyNjcxMDQ1YTE1NWQ5ODMxZWE4NzkzZDc3Y2Q1OTU5MmM0MzQwZjg2Y2JjMTgzNDdiNScsXG4gICAgICAgICc4ZWMwYmEyMzhiOTZiZWMwY2JkZGRjYWUwYWE0NDI1NDJlZWUxZmY1MGM5ODZlYTZiMzk4NDdiM2NjMDkyZmY2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlZTA3OWFkYjFkZjE4NjAwNzQzNTZhMjVhYTM4MjA2YTZkNzE2YjJjM2U2NzQ1M2QyODc2OThiYWQ3YjJiMmQ2JyxcbiAgICAgICAgJzhkYzI0MTJhYWZlM2JlNWM0YzVmMzdlMGVjYzVmOWY2YTQ0Njk4OWFmMDRjNGUyNWViYWFjNDc5ZWMxYzhjMWUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE2ZWM5M2U0NDdlYzgzZjA0NjdiMTgzMDJlZTYyMGY3ZTY1ZGUzMzE4NzRjOWRjNzJiZmQ4NjE2YmE5ZGE2YjUnLFxuICAgICAgICAnNWU0NjMxMTUwZTYyZmI0MGQwZThjMmE3Y2E1ODA0YTM5ZDU4MTg2YTUwZTQ5NzEzOTYyNjc3OGUyNWIwNjc0ZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWFhNWY5ODBjMjQ1ZjZmMDM4OTc4MjkwYWZhNzBiNmJkODg1NTg5N2Y5OGI2YWE0ODViOTYwNjVkNTM3YmQ5OScsXG4gICAgICAgICdmNjVmNWQzZTI5MmMyZTA4MTlhNTI4MzkxYzk5NDYyNGQ3ODQ4NjlkN2U2ZWE2N2ZiMTgwNDEwMjRlZGMwN2RjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3OGM5NDA3NTQ0YWMxMzI2OTJlZTE5MTBhMDI0Mzk5NThhZTA0ODc3MTUxMzQyZWE5NmM0YjZiMzVhNDlmNTEnLFxuICAgICAgICAnZjNlMDMxOTE2OWViOWI4NWQ1NDA0Nzk1NTM5YTVlNjhmYTFmYmQ1ODNjMDY0ZDI0NjJiNjc1ZjE5NGEzZGRiNCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDk0ZjRiZTIxOWExYTc3MDE2ZGNkODM4NDMxYWVhMDAwMWNkYzhhZTdhNmZjNjg4NzI2NTc4ZDk3MDI4NTdhNScsXG4gICAgICAgICc0MjI0MmE5NjkyODNhNWYzMzliYTdmMDc1ZTM2YmEyYWY5MjVjZTMwZDc2N2VkNmU1NWY0YjAzMTg4MGQ1NjJjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhNTk4YTgwMzBkYTZkODZjNmJjN2YyZjUxNDRlYTU0OWQyODIxMWVhNThmYWE3MGViZjRjMWU2NjVjMWZlOWI1JyxcbiAgICAgICAgJzIwNGI1ZDZmODQ4MjJjMzA3ZTRiNGE3MTQwNzM3YWVjMjNmYzYzYjY1YjM1Zjg2YTEwMDI2ZGJkMmQ4NjRlNmInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M0MTkxNjM2NWFiYjJiNWQwOTE5MmY1ZjJkYmVhZmVjMjA4ZjAyMGYxMjU3MGExODRkYmFkYzNlNTg1OTU5OTcnLFxuICAgICAgICAnNGYxNDM1MWQwMDg3ZWZhNDlkMjQ1YjMyODk4NDk4OWQ1Y2FmOTQ1MGYzNGJmYzBlZDE2ZTk2YjU4ZmE5OTEzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NDFkNjA2M2E1ODZmYTQ3NWE3MjQ2MDRkYTAzYmM1YjkyYTJlMGQyZTBhMzZhY2ZlNGM3M2E1NTE0NzQyODgxJyxcbiAgICAgICAgJzczODY3ZjU5YzA2NTllODE5MDRmOWExYzc1NDM2OThlNjI1NjJkNjc0NGMxNjljZTdhMzZkZTAxYThkNjE1NCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNWU5NWJiMzk5YTY5NzFkMzc2MDI2OTQ3Zjg5YmRlMmYyODJiMzM4MTA5MjhiZTRkZWQxMTJhYzRkNzBlMjBkNScsXG4gICAgICAgICczOWYyM2YzNjY4MDkwODViZWViZmM3MTE4MTMxMzc3NWE5OWM5YWVkN2Q4YmEzOGIxNjEzODRjNzQ2MDEyODY1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNmU0NjQxYTUzOTQ4ZmQ0NzZjMzlmOGE5OWZkOTc0ZTVlYzA3NTY0YjUzMTVkOGJmOTk0NzFiY2EwZWYyZjY2JyxcbiAgICAgICAgJ2QyNDI0YjFiMWFiZTRlYjgxNjQyMjdiMDg1YzlhYTk0NTZlYTEzNDkzZmQ1NjNlMDZmZDUxY2Y1Njk0Yzc4ZmMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMzNjU4MWVhN2JmYmJiMjkwYzE5MWEyZjUwN2E0MWNmNTY0Mzg0MjE3MGU5MTRmYWVhYjI3YzJjNTc5ZjcyNicsXG4gICAgICAgICdlYWQxMjE2ODU5NWZlMWJlOTkyNTIxMjliNmU1NmIzMzkxZjdhYjE0MTBjZDFlMGVmM2RjZGNhYmQyZmRhMjI0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4YWI4OTgxNmRhZGZkNmI2YTFmMjYzNGZjZjAwZWM4NDAzNzgxMDI1ZWQ2ODkwYzQ4NDk3NDI3MDZiZDQzZWRlJyxcbiAgICAgICAgJzZmZGNlZjA5ZjJmNmQwYTA0NGU2NTRhZWY2MjQxMzZmNTAzZDQ1OWMzZTg5ODQ1ODU4YTQ3YTkxMjljZGQyNGUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzFlMzNmMWE3NDZjOWM1Nzc4MTMzMzQ0ZDkyOTlmY2FhMjBiMDkzOGU4YWNmZjI1NDRiYjQwMjg0YjhjNWZiOTQnLFxuICAgICAgICAnNjA2NjAyNTdkZDExYjNhYTljOGVkNjE4ZDI0ZWRmZjIzMDZkMzIwZjFkMDMwMTBlMzNhN2QyMDU3ZjNiM2I2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NWI3YzFkY2IzY2VjMWI3ZWU3ZjMwZGVkNzlkZDIwYTBlZDFmNGNjMThjYmNmY2ZhNDEwMzYxZmQ4ZjA4ZjMxJyxcbiAgICAgICAgJzNkOThhOWNkZDAyNmRkNDNmMzkwNDhmMjVhODg0N2Y0ZmNhZmFkMTg5NWQ3YTYzM2M2ZmVkM2MzNWU5OTk1MTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzI5ZGY5ZmJkOGQ5ZTQ2NTA5Mjc1ZjRiMTI1ZDZkNDVkN2ZiZTlhM2I4NzhhN2FmODcyYTI4MDA2NjFhYzVmNTEnLFxuICAgICAgICAnYjRjNGZlOTljNzc1YTYwNmUyZDg4NjIxNzkxMzlmZmRhNjFkYzg2MWMwMTllNTVjZDI4NzZlYjJhMjdkODRiJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhMGIxY2FlMDZiMGE4NDdhM2ZlYTZlNjcxYWFmOGFkZmRmZTU4Y2EyZjc2ODEwNWM4MDgyYjJlNDQ5ZmNlMjUyJyxcbiAgICAgICAgJ2FlNDM0MTAyZWRkZTA5NThlYzRiMTlkOTE3YTZhMjhlNmI3MmRhMTgzNGFmZjBlNjUwZjA0OTUwM2EyOTZjZjInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRlOGNlYWZiOWIzZTlhMTM2ZGM3ZmY2N2U4NDAyOTViNDk5ZGZiM2IyMTMzZTRiYTExM2YyZTRjMGUxMjFlNScsXG4gICAgICAgICdjZjIxNzQxMThjOGI2ZDdhNGI0OGY2ZDUzNGNlNWM3OTQyMmMwODZhNjM0NjA1MDJiODI3Y2U2MmEzMjY2ODNjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkMjRhNDRlMDQ3ZTE5YjZmNWFmYjgxYzdjYTJmNjkwODBhNTA3NjY4OWEwMTA5MTlmNDI3MjVjMmI3ODlhMzNiJyxcbiAgICAgICAgJzZmYjhkNTU5MWI0NjZmOGZjNjNkYjUwZjFjMGYxYzY5MDEzZjk5Njg4N2I4MjQ0ZDJjZGVjNDE3YWZlYThmYTMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VhMDE2MDZhN2E2YzljZGQyNDlmZGZjZmFjYjk5NTg0MDAxZWRkMjhhYmJhYjc3YjUxMDRlOThlOGUzYjM1ZDQnLFxuICAgICAgICAnMzIyYWY0OTA4YzczMTJiMGNmYmZlMzY5ZjdhN2IzY2RiN2Q0NDk0YmMyODIzNzAwY2ZkNjUyMTg4YTNlYTk4ZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYWY4YWRkYmYyYjY2MWM4YTZjNjMyODY1NWViOTY2NTEyNTIwMDdkOGM1ZWEzMWJlNGFkMTk2ZGU4Y2UyMTMxZicsXG4gICAgICAgICc2NzQ5ZTY3YzAyOWI4NWY1MmEwMzRlYWZkMDk2ODM2YjI1MjA4MTg2ODBlMjZhYzhmM2RmYmNkYjcxNzQ5NzAwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlM2FlMTk3NDU2NmNhMDZjYzUxNmQ0N2UwZmIxNjVhNjc0YTNkYWJjZmNhMTVlNzIyZjBlMzQ1MGY0NTg4OScsXG4gICAgICAgICcyYWVhYmU3ZTQ1MzE1MTAxMTYyMTdmMDdiZjRkMDczMDBkZTk3ZTQ4NzRmODFmNTMzNDIwYTcyZWViMGJkNmE0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1OTFlZTM1NTMxM2Q5OTcyMWNmNjk5M2ZmZWQxZTNlMzAxOTkzZmYzZWQyNTg4MDIwNzVlYThjZWQzOTdlMjQ2JyxcbiAgICAgICAgJ2IwZWE1NThhMTEzYzMwYmVhNjBmYzQ3NzU0NjBjNzkwMWZmMGIwNTNkMjVjYTJiZGVlZTk4ZjFhNGJlNWQxOTYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzExMzk2ZDU1ZmRhNTRjNDlmMTlhYTk3MzE4ZDhkYTYxZmE4NTg0ZTQ3YjA4NDk0NTA3N2NmMDMyNTViNTI5ODQnLFxuICAgICAgICAnOTk4Yzc0YThjZDQ1YWMwMTI4OWQ1ODMzYTdiZWI0NzQ0ZmY1MzZiMDFiMjU3YmU0YzU3NjdiZWE5M2VhNTdhNCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnM2M1ZDJhMWJhMzljNWExNzkwMDAwNzM4YzllMGM0MGI4ZGNkZmQ1NDY4NzU0YjY0MDU1NDAxNTdlMDE3YWE3YScsXG4gICAgICAgICdiMjI4NDI3OTk5NWEzNGUyZjlkNGRlNzM5NmZjMThiODBmOWI4YjlmZGQyNzBmNjY2MWY3OWNhNGM4MWJkMjU3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjYzg3MDRiOGE2MGEwZGVmYTNhOTlhNzI5OWYyZTljM2ZiYzM5NWFmYjA0YWMwNzg0MjVlZjhhMTc5M2NjMDMwJyxcbiAgICAgICAgJ2JkZDQ2MDM5ZmVlZDE3ODgxZDFlMDg2MmRiMzQ3ZjhjZjM5NWI3NGZjNGJjZGM0ZTk0MGI3NGUzYWMxZjFiMTMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M1MzNlNGY3ZWE4NTU1YWFjZDk3NzdhYzVjYWQyOWI5N2RkNGRlZmNjYzUzZWU3ZWEyMDQxMTliMjg4OWIxOTcnLFxuICAgICAgICAnNmYwYTI1NmJjNWVmZGY0MjlhMmZiNjI0MmYxYTQzYTJkOWI5MjViYjRhNGIzYTI2YmI4ZTBmNDVlYjU5NjA5NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzE0ZjhmMmNjYjI3ZDZmMTA5ZjZkMDhkMDNjYzk2YTY5YmE4YzM0ZWVjMDdiYmNmNTY2ZDQ4ZTMzZGE2NTkzJyxcbiAgICAgICAgJ2MzNTlkNjkyM2JiMzk4ZjdmZDQ0NzNlMTZmZTFjMjg0NzViNzQwZGQwOTgwNzVlNmMwZTg2NDkxMTNkYzNhMzgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E2Y2JjMzA0NmJjNmE0NTBiYWMyNDc4OWZhMTcxMTVhNGM5NzM5ZWQ3NWY4ZjIxY2U0NDFmNzJlMGI5MGU2ZWYnLFxuICAgICAgICAnMjFhZTdmNDY4MGU4ODliYjEzMDYxOWUyYzBmOTVhMzYwY2ViNTczYzcwNjAzMTM5ODYyYWZkNjE3ZmE5YjlmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNDdkNmQ5YTAyYzQ4OTI3ZWJmYjg2YzEzNTliMWNhZjEzMGEzYzAyNjdkMTFjZTYzNDRiMzlmOTlkNDNjYzM4JyxcbiAgICAgICAgJzYwZWE3ZjYxYTM1MzUyNGQxYzk4N2Y2ZWNlYzkyZjA4NmQ1NjVhYjY4Nzg3MGNiMTI2ODlmZjFlMzFjNzQ0NDgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RhNjU0NWQyMTgxZGI4ZDk4M2Y3ZGNiMzc1ZWY1ODY2ZDQ3YzY3YjFiZjMxYzhjZjg1NWVmNzQzN2I3MjY1NmEnLFxuICAgICAgICAnNDliOTY3MTVhYjY4NzhhNzllNzhmMDdjZTU2ODBjNWQ2NjczMDUxYjQ5MzViZDg5N2ZlYTgyNGI3N2RjMjA4YScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzQwNzQ3Y2M5ZDAxMmNiMWExM2I4MTQ4MzA5YzZkZTdlYzI1ZDY5NDVkNjU3MTQ2YjlkNTk5NGI4ZmViMTExMScsXG4gICAgICAgICc1Y2E1NjA3NTNiZTJhMTJmYzZkZTZjYWYyY2I0ODk1NjVkYjkzNjE1NmI5NTE0ZTFiYjVlODMwMzdlMGZhMmQ0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0ZTQyYzhlYzgyYzk5Nzk4Y2NmM2E2MTBiZTg3MGU3ODMzOGM3ZjcxMzM0OGJkMzRjODIwM2VmNDAzN2YzNTAyJyxcbiAgICAgICAgJzc1NzFkNzRlZTVlMGZiOTJhN2E4YjMzYTA3NzgzMzQxYTU0OTIxNDRjYzU0YmNjNDBhOTQ0NzM2OTM2MDY0MzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM3NzVhYjcwODliYzZhZjgyM2FiYTJlMWFmNzBiMjM2ZDI1MWNhZGIwYzg2NzQzMjg3NTIyYTFiM2IwZGVkZWEnLFxuICAgICAgICAnYmU1MmQxMDdiY2ZhMDlkOGJjYjk3MzZhODI4Y2ZhN2ZhYzhkYjE3YmY3YTc2YTJjNDJhZDk2MTQwOTAxOGNmNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnY2VlMzFjYmY3ZTM0ZWMzNzlkOTRmYjgxNGQzZDc3NWFkOTU0NTk1ZDEzMTRiYTg4NDY5NTllM2U4MmY3NGUyNicsXG4gICAgICAgICc4ZmQ2NGExNGMwNmI1ODljMjZiOTQ3YWUyYmNmNmJmYTAxNDllZjBiZTE0ZWQ0ZDgwZjQ0OGEwMWM0M2IxYzZkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiNGY5ZWFlYTA5YjY5MTc2MTlmNmVhNmE0ZWI1NDY0ZWZkZGI1OGZkNDViMWViZWZjZGMxYTAxZDA4YjQ3OTg2JyxcbiAgICAgICAgJzM5ZTVjOTkyNWI1YTU0YjA3NDMzYTRmMThjNjE3MjZmOGJiMTMxYzAxMmNhNTQyZWIyNGE4YWMwNzIwMDY4MmEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q0MjYzZGZjM2QyZGY5MjNhMDE3OWE0ODk2NmQzMGNlODRlMjUxNWFmYzNkY2NjMWI3NzkwNzc5MmViY2M2MGUnLFxuICAgICAgICAnNjJkZmFmMDdhMGY3OGZlYjMwZTMwZDYyOTU4NTNjZTE4OWUxMjc3NjBhZDZjZjdmYWUxNjRlMTIyYTIwOGQ1NCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDg0NTc1MjQ4MjBmYTY1YTRmOGQzNWViNjkzMDg1N2MwMDMyYWNjMGE0YTJkZTQyMjIzM2VlZGE4OTc2MTJjNCcsXG4gICAgICAgICcyNWE3NDhhYjM2Nzk3OWQ5ODczM2MzOGExZmExYzJlN2RjNmNjMDdkYjJkNjBhOWFlN2E3NmFhYTQ5YmQwZjc3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkZmVlZWYxODgxMTAxZjJjYjExNjQ0ZjNhMmFmZGZjMjA0NWUxOTkxOTE1MjkyM2YzNjdhMTc2N2MxMWNjZWRhJyxcbiAgICAgICAgJ2VjZmI3MDU2Y2YxZGUwNDJmOTQyMGJhYjM5Njc5M2MwYzM5MGJkZTc0YjRiYmRmZjE2YTgzYWUwOWE5YTc1MTcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzZkN2VmNmIxNzU0M2Y4MzczYzU3M2Y0NGUxZjM4OTgzNWQ4OWJjYmM2MDYyY2VkMzZjODJkZjgzYjhmYWU4NTknLFxuICAgICAgICAnY2Q0NTBlYzMzNTQzODk4NmRmZWZhMTBjNTdmZWE5YmNjNTIxYTA5NTliMmQ4MGJiZjc0YjE5MGRjYTcxMmQxMCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTc1NjA1ZDU5MTAyYTVhMjY4NDUwMGQzYjk5MWYyZTNmM2M4OGI5MzIyNTU0NzAzNWFmMjVhZjY2ZTA0NTQxZicsXG4gICAgICAgICdmNWM1NDc1NGE4ZjcxZWU1NDBiOWI0ODcyODQ3M2UzMTRmNzI5YWM1MzA4YjA2OTM4MzYwOTkwZTJiZmFkMTI1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlYjk4NjYwZjRjNGRmYWEwNmEyYmU0NTNkNTAyMGJjOTlhMGMyZTYwYWJlMzg4NDU3ZGQ0M2ZlZmIxZWQ2MjBjJyxcbiAgICAgICAgJzZjYjlhODg3NmQ5Y2I4NTIwNjA5YWYzYWRkMjZjZDIwYTBhN2NkOGE5NDExMTMxY2U4NWY0NDEwMDA5OTIyM2UnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzEzZTg3YjAyN2Q4NTE0ZDM1OTM5ZjJlNjg5MmIxOTkyMjE1NDU5Njk0MTg4ODMzNmRjMzU2M2UzYjhkYmE5NDInLFxuICAgICAgICAnZmVmNWEzYzY4MDU5YTZkZWM1ZDYyNDExNGJmMWU5MWFhYzJiOWRhNTY4ZDZhYmViMjU3MGQ1NTY0NmI4YWRmMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWUxNjMwMjZlOWZkNmZlMDE3YzM4ZjA2YTViZTZmYzEyNTQyNGIzNzFjZTI3MDhlN2JmNDQ5MTY5MWU1NzY0YScsXG4gICAgICAgICcxYWNiMjUwZjI1NWRkNjFjNDNkOTRjY2M2NzBkMGY1OGY0OWFlM2ZhMTViOTY2MjNlNTQzMGRhMGFkNmM2MmIyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiMjY4ZjVlZjlhZDUxZTRkNzhkZTNhNzUwYzJkYzg5YjFlNjI2ZDQzNTA1ODY3OTk5OTMyZTVkYjMzYWYzZDgwJyxcbiAgICAgICAgJzVmMzEwZDRiM2M5OWI5ZWJiMTlmNzdkNDFjMWRlZTAxOGNmMGQzNGZkNDE5MTYxNDAwM2U5NDVhMTIxNmU0MjMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ZmMDdmMzExOGE5ZGYwMzVlOWZhZDg1ZWI2YzdiZmU0MmIwMmYwMWNhOTljZWVhM2JmN2ZmZGJhOTNjNDc1MGQnLFxuICAgICAgICAnNDM4MTM2ZDYwM2U4NThhM2E1YzQ0MGMzOGVjY2JhZGRjMWQyOTQyMTE0ZTJlZGRkNDc0MGQwOThjZWQxZjBkOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGQ4Yjk4NTVjN2MwNTJhMzQxNDZmZDIwZmZiNjU4YmVhNGI5ZjY5ZTBkODI1ZWJlYzE2ZThjM2NlMmI1MjZhMScsXG4gICAgICAgICdjZGI1NTllZWRjMmQ3OWY5MjZiYWY0NGZiODRlYTRkNDRiY2Y1MGZlZTUxZDdjZWIzMGUyZTdmNDYzMDM2NzU4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1MmRiMGI1Mzg0ZGZiZjA1YmZhOWQ0NzJkN2FlMjZkZmU0Yjg1MWNlY2E5MWIxZWJhNTQyNjMxODBkYTMyYjYzJyxcbiAgICAgICAgJ2MzYjk5N2QwNTBlZTVkNDIzZWJhZjY2YTZkYjlmNTdiMzE4MGM5MDI4NzU2NzlkZTkyNGI2OWQ4NGE3YjM3NScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTYyZjk0OTBkM2Q1MWRhNjM5NWVmZDI0ZTgwOTE5Y2M3ZDBmMjljM2YzZmE0OGM2ZmZmNTQzYmVjYmQ0MzM1MicsXG4gICAgICAgICc2ZDg5YWQ3YmE0ODc2YjBiMjJjMmNhMjgwYzY4Mjg2MmYzNDJjODU5MWYxZGFmNTE3MGUwN2JmZDljY2FmYTdkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3ZjMwZWEyNDc2YjM5OWI0OTU3NTA5Yzg4Zjc3ZDAxOTFhZmEyZmY1Y2I3YjE0ZmQ2ZDhlN2Q2NWFhYWIxMTkzJyxcbiAgICAgICAgJ2NhNWVmN2Q0YjIzMWM5NGMzYjE1Mzg5YTVmNjMxMWU5ZGFmZjdiYjY3YjEwM2U5ODgwZWY0YmZmNjM3YWNhZWMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzUwOThmZjFlMWQ5ZjE0ZmI0NmEyMTBmYWRhNmM5MDNmZWYwZmI3YjRhMWRkMWQ5YWM2MGEwMzYxODAwYjdhMDAnLFxuICAgICAgICAnOTczMTE0MWQ4MWZjOGY4MDg0ZDM3YzZlNzU0MjAwNmIzZWUxYjQwZDYwZGZlNTM2MmE1YjEzMmZkMTdkZGMwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMmI3OGM3ZGU5ZWU1MTJhNzI4OTViZTZiOWNiZWZhNmUyZjNjNGNjY2U0NDVjOTZiOWYyYzgxZTI3NzhhZDU4JyxcbiAgICAgICAgJ2VlMTg0OWY1MTNkZjcxZTMyZWZjMzg5NmVlMjgyNjBjNzNiYjgwNTQ3YWUyMjc1YmE0OTcyMzc3OTRjODc1M2MnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UyY2I3NGZkZGM4ZTlmYmNkMDc2ZWVmMmE3YzcyYjBjZTM3ZDUwZjA4MjY5ZGZjMDc0YjU4MTU1MDU0N2E0ZjcnLFxuICAgICAgICAnZDNhYTJlZDcxYzlkZDIyNDdhNjJkZjA2MjczNmViMGJhZGRlYTllMzYxMjJkMmJlODY0MWFiY2IwMDVjYzRhNCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODQzODQ0NzU2NmQ0ZDdiZWRhZGMyOTk0OTZhYjM1NzQyNjAwOWEzNWYyMzVjYjE0MWJlMGQ5OWNkMTBhZTNhOCcsXG4gICAgICAgICdjNGUxMDIwOTE2OTgwYTRkYTVkMDFhYzVlNmFkMzMwNzM0ZWYwZDc5MDY2MzFjNGYyMzkwNDI2YjJlZGQ3OTFmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0MTYyZDQ4OGI4OTQwMjAzOWI1ODRjNmZjNmMzMDg4NzA1ODdkOWM0NmY2NjBiODc4YWI2NWM4MmM3MTFkNjdlJyxcbiAgICAgICAgJzY3MTYzZTkwMzIzNjI4OWY3NzZmMjJjMjVmYjhhM2FmYzE3MzJmMmI4NGI0ZTk1ZGJkYTQ3YWU1YTA4NTI2NDknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzNmYWQzZmE4NGNhZjBmMzRmMGY4OWJmZDJkY2Y1NGZjMTc1ZDc2N2FlYzNlNTA2ODRmM2JhNGE0YmY1ZjY4M2QnLFxuICAgICAgICAnY2QxYmM3Y2I2Y2M0MDdiYjJmMGNhNjQ3YzcxOGE3MzBjZjcxODcyZTdkMGQyYTUzZmEyMGVmY2RmZTYxODI2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2NzRmMjYwMGEzMDA3YTAwNTY4YzFhN2NlMDVkMDgxNmMxZmI4NGJmMTM3MDc5OGYxYzY5NTMyZmFlYjFhODZiJyxcbiAgICAgICAgJzI5OWQyMWY5NDEzZjMzYjNlZGY0M2IyNTcwMDQ1ODBiNzBkYjU3ZGEwYjE4MjI1OWUwOWVlY2M2OWUwZDM4YTUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QzMmY0ZGE1NGFkZTc0YWJiODFiODE1YWQxZmIzYjI2M2Q4MmQ2YzY5MjcxNGJjZmY4N2QyOWJkNWVlOWYwOGYnLFxuICAgICAgICAnZjk0MjllNzM4YjhlNTNiOTY4ZTk5MDE2YzA1OTcwNzc4MmUxNGY0NTM1MzU5ZDU4MmZjNDE2OTEwYjNlZWE4NycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzBlNGU2NzA0MzUzODU1NTZlNTkzNjU3MTM1ODQ1ZDM2ZmJiNjkzMWY3MmIwOGNiMWVkOTU0ZjFlM2NlM2ZmNicsXG4gICAgICAgICc0NjJmOWJjZTYxOTg5ODYzODQ5OTM1MDExM2JiYzliMTBhODc4ZDM1ZGE3MDc0MGRjNjk1YTU1OWViODhkYjdiJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiZTIwNjIwMDNjNTFjYzMwMDQ2ODI5MDQzMzBlNGRlZTdmM2RjZDEwYjAxZTU4MGJmMTk3MWIwNGQ0Y2FkMjk3JyxcbiAgICAgICAgJzYyMTg4YmM0OWQ2MWU1NDI4NTczZDQ4YTc0ZTFjNjU1YjFjNjEwOTA5MDU2ODJhMGQ1NTU4ZWQ3MmRjY2I5YmMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkzMTQ0NDIzYWNlMzQ1MWVkMjllMGZiOWFjMmFmMjExY2I2ZTg0YTYwMWRmNTk5M2M0MTk4NTlmZmY1ZGYwNGEnLFxuICAgICAgICAnN2MxMGRmYjE2NGMzNDI1ZjVjNzFhM2Y5ZDc5OTIwMzhmMTA2NTIyNGY3MmJiOWQxZDkwMmE2ZDEzMDM3YjQ3YycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYjAxNWY4MDQ0ZjVmY2JkY2YyMWNhMjZkNmMzNGZiODE5NzgyOTIwNWM3YjdkMmE3Y2I2NjQxOGMxNTdiMTEyYycsXG4gICAgICAgICdhYjhjMWUwODZkMDRlODEzNzQ0YTY1NWIyZGY4ZDVmODNiM2NkYzZmYWEzMDg4YzFkM2FlYTE0NTRlM2ExZDVmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNWU5ZTFkYTY0OWQ5N2Q4OWU0ODY4MTE3YTQ2NWEzYTRmOGExOGRlNTdhMTQwZDM2YjNmMmFmMzQxYTIxYjUyJyxcbiAgICAgICAgJzRjYjA0NDM3ZjM5MWVkNzMxMTFhMTNjYzFkNGRkMGRiMTY5MzQ2NWMyMjQwNDgwZDg5NTVlODU5MmYyNzQ0N2EnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QzYWU0MTA0N2RkN2NhMDY1ZGJmOGVkNzdiOTkyNDM5OTgzMDA1Y2Q3MmUxNmQ2Zjk5NmE1MzE2ZDM2OTY2YmInLFxuICAgICAgICAnYmQxYWViMjFhZDIyZWJiMjJhMTBmMDMwMzQxN2M2ZDk2NGY4Y2RkN2RmMGFjYTYxNGIxMGRjMTRkMTI1YWM0NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDYzZTI3NjNkODg1Zjk1OGZjNjZjZGQyMjgwMGYwYTQ4NzE5N2QwYTgyZTM3N2I0OWY4MGFmODdjODk3YjA2NScsXG4gICAgICAgICdiZmVmYWNkYjBlNWQwZmQ3ZGYzYTMxMWE5NGRlMDYyYjI2YjgwYzYxZmJjOTc1MDhiNzk5OTI2NzFlZjdjYTdmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3OTg1ZmRmZDEyN2MwNTY3YzZmNTNlYzFiYjYzZWMzMTU4ZTU5N2M0MGJmZTc0N2M4M2NkZGZjOTEwNjQxOTE3JyxcbiAgICAgICAgJzYwM2MxMmRhZjNkOTg2MmVmMmIyNWZlMWRlMjg5YWVkMjRlZDI5MWUwZWM2NzA4NzAzYTViZDU2N2YzMmVkMDMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc0YTFhZDZiNWY3NmUzOWRiMmRkMjQ5NDEwZWFjN2Y5OWU3NGM1OWNiODNkMmQwZWQ1ZmYxNTQzZGE3NzAzZTknLFxuICAgICAgICAnY2M2MTU3ZWYxOGM5YzYzY2Q2MTkzZDgzNjMxYmJlYTAwOTNlMDk2ODk0MmU4YzMzZDU3MzdmZDc5MGUwZGIwOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzA2ODJhNTA3MDMzNzVmNjAyZDQxNjY2NGJhMTliN2ZjOWJhYjQyYzcyNzQ3NDYzYTcxZDA4OTZiMjJmNmRhMycsXG4gICAgICAgICc1NTNlMDRmNmIwMThiNGZhNmM4ZjM5ZTdmMzExZDMxNzYyOTBkMGUwZjE5Y2E3M2YxNzcxNGQ5OTc3YTIyZmY4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5ZTIxNThmMGQ3YzBkNWYyNmMzNzkxZWZlZmE3OTU5NzY1NGU3YTJiMjQ2NGY1MmIxZWU2YzEzNDc3NjllZjU3JyxcbiAgICAgICAgJzcxMmZjZGQxYjkwNTNmMDkwMDNhMzQ4MWZhNzc2MmU5ZmZkN2M4ZWYzNWEzODUwOWUyZmJmMjYyOTAwODM3MycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTc2ZTI2OTg5YTQzYzljZmViYTQwMjljMjAyNTM4YzI4MTcyZTU2NmUzYzRmY2U3MzIyODU3ZjNiZTMyN2Q2NicsXG4gICAgICAgICdlZDhjYzlkMDRiMjllYjg3N2QyNzBiNDg3OGRjNDNjMTlhZWZkMzFmNGVlZTA5ZWU3YjQ3ODM0YzFmYTRiMWMzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NWQ0NmVmZWEzNzcxZTZlNjhhYmI4OWExM2FkNzQ3ZWNmMTg5MjM5M2RmYzRmMWI3MDA0Nzg4YzUwMzc0ZGE4JyxcbiAgICAgICAgJzk4NTIzOTBhOTk1MDc2NzlmZDBiODZmZDJiMzlhODY4ZDdlZmMyMjE1MTM0NmUxYTNjYTQ3MjY1ODZhNmJlZDgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzgwOWEyMGM2N2Q2NDkwMGZmYjY5OGM0YzgyNWY2ZDVmMjMxMGZiMDQ1MWM4NjkzNDViNzMxOWY2NDU2MDU3MjEnLFxuICAgICAgICAnOWU5OTQ5ODBkOTkxN2UyMmI3NmIwNjE5MjdmYTA0MTQzZDA5NmNjYzU0OTYzZTZhNWViZmE1ZjNmOGUyODZjMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMWIzODkwM2E0M2Y3ZjExNGVkNDUwMGI0ZWFjNzA4M2ZkZWZlY2UxY2YyOWM2MzUyOGQ1NjM0NDZmOTcyYzE4MCcsXG4gICAgICAgICc0MDM2ZWRjOTMxYTYwYWU4ODkzNTNmNzdmZDUzZGU0YTI3MDhiMjZiNmY1ZGE3MmFkMzM5NDExOWRhZjQwOGY5JyxcbiAgICAgIF0sXG4gICAgXSxcbiAgfSxcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGN1cnZlcyA9IGV4cG9ydHM7XG5cbnZhciBoYXNoID0gcmVxdWlyZSgnaGFzaC5qcycpO1xudmFyIGN1cnZlID0gcmVxdWlyZSgnLi9jdXJ2ZScpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBQcmVzZXRDdXJ2ZShvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLnR5cGUgPT09ICdzaG9ydCcpXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBjdXJ2ZS5zaG9ydChvcHRpb25zKTtcbiAgZWxzZSBpZiAob3B0aW9ucy50eXBlID09PSAnZWR3YXJkcycpXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBjdXJ2ZS5lZHdhcmRzKG9wdGlvbnMpO1xuICBlbHNlXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBjdXJ2ZS5tb250KG9wdGlvbnMpO1xuICB0aGlzLmcgPSB0aGlzLmN1cnZlLmc7XG4gIHRoaXMubiA9IHRoaXMuY3VydmUubjtcbiAgdGhpcy5oYXNoID0gb3B0aW9ucy5oYXNoO1xuXG4gIGFzc2VydCh0aGlzLmcudmFsaWRhdGUoKSwgJ0ludmFsaWQgY3VydmUnKTtcbiAgYXNzZXJ0KHRoaXMuZy5tdWwodGhpcy5uKS5pc0luZmluaXR5KCksICdJbnZhbGlkIGN1cnZlLCBHKk4gIT0gTycpO1xufVxuY3VydmVzLlByZXNldEN1cnZlID0gUHJlc2V0Q3VydmU7XG5cbmZ1bmN0aW9uIGRlZmluZUN1cnZlKG5hbWUsIG9wdGlvbnMpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1cnZlcywgbmFtZSwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY3VydmUgPSBuZXcgUHJlc2V0Q3VydmUob3B0aW9ucyk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VydmVzLCBuYW1lLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGN1cnZlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gY3VydmU7XG4gICAgfSxcbiAgfSk7XG59XG5cbmRlZmluZUN1cnZlKCdwMTkyJywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogJ3AxOTInLFxuICBwOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYnLFxuICBhOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmMnLFxuICBiOiAnNjQyMTA1MTkgZTU5YzgwZTcgMGZhN2U5YWIgNzIyNDMwNDkgZmViOGRlZWMgYzE0NmI5YjEnLFxuICBuOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgOTlkZWY4MzYgMTQ2YmM5YjEgYjRkMjI4MzEnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnMTg4ZGE4MGUgYjAzMDkwZjYgN2NiZjIwZWIgNDNhMTg4MDAgZjRmZjBhZmQgODJmZjEwMTInLFxuICAgICcwNzE5MmI5NSBmZmM4ZGE3OCA2MzEwMTFlZCA2YjI0Y2RkNSA3M2Y5NzdhMSAxZTc5NDgxMScsXG4gIF0sXG59KTtcblxuZGVmaW5lQ3VydmUoJ3AyMjQnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiAncDIyNCcsXG4gIHA6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMScsXG4gIGE6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZScsXG4gIGI6ICdiNDA1MGE4NSAwYzA0YjNhYiBmNTQxMzI1NiA1MDQ0YjBiNyBkN2JmZDhiYSAyNzBiMzk0MyAyMzU1ZmZiNCcsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmMTZhMiBlMGI4ZjAzZSAxM2RkMjk0NSA1YzVjMmEzZCcsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICdiNzBlMGNiZCA2YmI0YmY3ZiAzMjEzOTBiOSA0YTAzYzFkMyA1NmMyMTEyMiAzNDMyODBkNiAxMTVjMWQyMScsXG4gICAgJ2JkMzc2Mzg4IGI1ZjcyM2ZiIDRjMjJkZmU2IGNkNDM3NWEwIDVhMDc0NzY0IDQ0ZDU4MTk5IDg1MDA3ZTM0JyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDI1NicsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6IG51bGwsXG4gIHA6ICdmZmZmZmZmZiAwMDAwMDAwMSAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZicsXG4gIGE6ICdmZmZmZmZmZiAwMDAwMDAwMSAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYycsXG4gIGI6ICc1YWM2MzVkOCBhYTNhOTNlNyBiM2ViYmQ1NSA3Njk4ODZiYyA2NTFkMDZiMCBjYzUzYjBmNiAzYmNlM2MzZSAyN2QyNjA0YicsXG4gIG46ICdmZmZmZmZmZiAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBiY2U2ZmFhZCBhNzE3OWU4NCBmM2I5Y2FjMiBmYzYzMjU1MScsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICc2YjE3ZDFmMiBlMTJjNDI0NyBmOGJjZTZlNSA2M2E0NDBmMiA3NzAzN2Q4MSAyZGViMzNhMCBmNGExMzk0NSBkODk4YzI5NicsXG4gICAgJzRmZTM0MmUyIGZlMWE3ZjliIDhlZTdlYjRhIDdjMGY5ZTE2IDJiY2UzMzU3IDZiMzE1ZWNlIGNiYjY0MDY4IDM3YmY1MWY1JyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDM4NCcsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6IG51bGwsXG4gIHA6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZlIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmJyxcbiAgYTogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmUgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmMnLFxuICBiOiAnYjMzMTJmYTcgZTIzZWU3ZTQgOTg4ZTA1NmIgZTNmODJkMTkgMTgxZDljNmUgZmU4MTQxMTIgMDMxNDA4OGYgJyArXG4gICAgICc1MDEzODc1YSBjNjU2Mzk4ZCA4YTJlZDE5ZCAyYTg1YzhlZCBkM2VjMmFlZicsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBjNzYzNGQ4MSAnICtcbiAgICAgJ2Y0MzcyZGRmIDU4MWEwZGIyIDQ4YjBhNzdhIGVjZWMxOTZhIGNjYzUyOTczJyxcbiAgaGFzaDogaGFzaC5zaGEzODQsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJ2FhODdjYTIyIGJlOGIwNTM3IDhlYjFjNzFlIGYzMjBhZDc0IDZlMWQzYjYyIDhiYTc5Yjk4IDU5Zjc0MWUwIDgyNTQyYTM4ICcgK1xuICAgICc1NTAyZjI1ZCBiZjU1Mjk2YyAzYTU0NWUzOCA3Mjc2MGFiNycsXG4gICAgJzM2MTdkZTRhIDk2MjYyYzZmIDVkOWU5OGJmIDkyOTJkYzI5IGY4ZjQxZGJkIDI4OWExNDdjIGU5ZGEzMTEzIGI1ZjBiOGMwICcgK1xuICAgICcwYTYwYjFjZSAxZDdlODE5ZCA3YTQzMWQ3YyA5MGVhMGU1ZicsXG4gIF0sXG59KTtcblxuZGVmaW5lQ3VydmUoJ3A1MjEnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiBudWxsLFxuICBwOiAnMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmJyxcbiAgYTogJzAwMDAwMWZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYycsXG4gIGI6ICcwMDAwMDA1MSA5NTNlYjk2MSA4ZTFjOWExZiA5MjlhMjFhMCBiNjg1NDBlZSBhMmRhNzI1YiAnICtcbiAgICAgJzk5YjMxNWYzIGI4YjQ4OTkxIDhlZjEwOWUxIDU2MTkzOTUxIGVjN2U5MzdiIDE2NTJjMGJkICcgK1xuICAgICAnM2JiMWJmMDcgMzU3M2RmODggM2QyYzM0ZjEgZWY0NTFmZDQgNmI1MDNmMDAnLFxuICBuOiAnMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYSA1MTg2ODc4MyBiZjJmOTY2YiA3ZmNjMDE0OCAnICtcbiAgICAgJ2Y3MDlhNWQwIDNiYjVjOWI4IDg5OWM0N2FlIGJiNmZiNzFlIDkxMzg2NDA5JyxcbiAgaGFzaDogaGFzaC5zaGE1MTIsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzAwMDAwMGM2IDg1OGUwNmI3IDA0MDRlOWNkIDllM2VjYjY2IDIzOTViNDQyIDljNjQ4MTM5ICcgK1xuICAgICcwNTNmYjUyMSBmODI4YWY2MCA2YjRkM2RiYSBhMTRiNWU3NyBlZmU3NTkyOCBmZTFkYzEyNyAnICtcbiAgICAnYTJmZmE4ZGUgMzM0OGIzYzEgODU2YTQyOWIgZjk3ZTdlMzEgYzJlNWJkNjYnLFxuICAgICcwMDAwMDExOCAzOTI5NmE3OCA5YTNiYzAwNCA1YzhhNWZiNCAyYzdkMWJkOSA5OGY1NDQ0OSAnICtcbiAgICAnNTc5YjQ0NjggMTdhZmJkMTcgMjczZTY2MmMgOTdlZTcyOTkgNWVmNDI2NDAgYzU1MGI5MDEgJyArXG4gICAgJzNmYWQwNzYxIDM1M2M3MDg2IGEyNzJjMjQwIDg4YmU5NDc2IDlmZDE2NjUwJyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgnY3VydmUyNTUxOScsIHtcbiAgdHlwZTogJ21vbnQnLFxuICBwcmltZTogJ3AyNTUxOScsXG4gIHA6ICc3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkJyxcbiAgYTogJzc2ZDA2JyxcbiAgYjogJzEnLFxuICBuOiAnMTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIDE0ZGVmOWRlYTJmNzljZDYgNTgxMjYzMWE1Y2Y1ZDNlZCcsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICc5JyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgnZWQyNTUxOScsIHtcbiAgdHlwZTogJ2Vkd2FyZHMnLFxuICBwcmltZTogJ3AyNTUxOScsXG4gIHA6ICc3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkJyxcbiAgYTogJy0xJyxcbiAgYzogJzEnLFxuICAvLyAtMTIxNjY1ICogKDEyMTY2Nl4oLTEpKSAobW9kIFApXG4gIGQ6ICc1MjAzNmNlZTJiNmZmZTczIDhjYzc0MDc5Nzc3OWU4OTggMDA3MDBhNGQ0MTQxZDhhYiA3NWViNGRjYTEzNTk3OGEzJyxcbiAgbjogJzEwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAxNGRlZjlkZWEyZjc5Y2Q2IDU4MTI2MzFhNWNmNWQzZWQnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnMjE2OTM2ZDNjZDZlNTNmZWMwYTRlMjMxZmRkNmRjNWM2OTJjYzc2MDk1MjVhN2IyYzk1NjJkNjA4ZjI1ZDUxYScsXG5cbiAgICAvLyA0LzVcbiAgICAnNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY1OCcsXG4gIF0sXG59KTtcblxudmFyIHByZTtcbnRyeSB7XG4gIHByZSA9IHJlcXVpcmUoJy4vcHJlY29tcHV0ZWQvc2VjcDI1NmsxJyk7XG59IGNhdGNoIChlKSB7XG4gIHByZSA9IHVuZGVmaW5lZDtcbn1cblxuZGVmaW5lQ3VydmUoJ3NlY3AyNTZrMScsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6ICdrMjU2JyxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmJyxcbiAgYTogJzAnLFxuICBiOiAnNycsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBiYWFlZGNlNiBhZjQ4YTAzYiBiZmQyNWU4YyBkMDM2NDE0MScsXG4gIGg6ICcxJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG5cbiAgLy8gUHJlY29tcHV0ZWQgZW5kb21vcnBoaXNtXG4gIGJldGE6ICc3YWU5NmEyYjY1N2MwNzEwNmU2NDQ3OWVhYzM0MzRlOTljZjA0OTc1MTJmNTg5OTVjMTM5NmMyODcxOTUwMWVlJyxcbiAgbGFtYmRhOiAnNTM2M2FkNGNjMDVjMzBlMGE1MjYxYzAyODgxMjY0NWExMjJlMjJlYTIwODE2Njc4ZGYwMjk2N2MxYjIzYmQ3MicsXG4gIGJhc2lzOiBbXG4gICAge1xuICAgICAgYTogJzMwODZkMjIxYTdkNDZiY2RlODZjOTBlNDkyODRlYjE1JyxcbiAgICAgIGI6ICctZTQ0MzdlZDYwMTBlODgyODZmNTQ3ZmE5MGFiZmU0YzMnLFxuICAgIH0sXG4gICAge1xuICAgICAgYTogJzExNGNhNTBmN2E4ZTJmM2Y2NTdjMTEwOGQ5ZDQ0Y2ZkOCcsXG4gICAgICBiOiAnMzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTUnLFxuICAgIH0sXG4gIF0sXG5cbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnNzliZTY2N2VmOWRjYmJhYzU1YTA2Mjk1Y2U4NzBiMDcwMjliZmNkYjJkY2UyOGQ5NTlmMjgxNWIxNmY4MTc5OCcsXG4gICAgJzQ4M2FkYTc3MjZhM2M0NjU1ZGE0ZmJmYzBlMTEwOGE4ZmQxN2I0NDhhNjg1NTQxOTljNDdkMDhmZmIxMGQ0YjgnLFxuICAgIHByZSxcbiAgXSxcbn0pO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNoID0gcmVxdWlyZSgnaGFzaC5qcycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWNyeXB0by11dGlscycpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuZnVuY3Rpb24gSG1hY0RSQkcob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSG1hY0RSQkcpKVxuICAgIHJldHVybiBuZXcgSG1hY0RSQkcob3B0aW9ucyk7XG4gIHRoaXMuaGFzaCA9IG9wdGlvbnMuaGFzaDtcbiAgdGhpcy5wcmVkUmVzaXN0ID0gISFvcHRpb25zLnByZWRSZXNpc3Q7XG5cbiAgdGhpcy5vdXRMZW4gPSB0aGlzLmhhc2gub3V0U2l6ZTtcbiAgdGhpcy5taW5FbnRyb3B5ID0gb3B0aW9ucy5taW5FbnRyb3B5IHx8IHRoaXMuaGFzaC5obWFjU3RyZW5ndGg7XG5cbiAgdGhpcy5fcmVzZWVkID0gbnVsbDtcbiAgdGhpcy5yZXNlZWRJbnRlcnZhbCA9IG51bGw7XG4gIHRoaXMuSyA9IG51bGw7XG4gIHRoaXMuViA9IG51bGw7XG5cbiAgdmFyIGVudHJvcHkgPSB1dGlscy50b0FycmF5KG9wdGlvbnMuZW50cm9weSwgb3B0aW9ucy5lbnRyb3B5RW5jIHx8ICdoZXgnKTtcbiAgdmFyIG5vbmNlID0gdXRpbHMudG9BcnJheShvcHRpb25zLm5vbmNlLCBvcHRpb25zLm5vbmNlRW5jIHx8ICdoZXgnKTtcbiAgdmFyIHBlcnMgPSB1dGlscy50b0FycmF5KG9wdGlvbnMucGVycywgb3B0aW9ucy5wZXJzRW5jIHx8ICdoZXgnKTtcbiAgYXNzZXJ0KGVudHJvcHkubGVuZ3RoID49ICh0aGlzLm1pbkVudHJvcHkgLyA4KSxcbiAgICAgICAgICdOb3QgZW5vdWdoIGVudHJvcHkuIE1pbmltdW0gaXM6ICcgKyB0aGlzLm1pbkVudHJvcHkgKyAnIGJpdHMnKTtcbiAgdGhpcy5faW5pdChlbnRyb3B5LCBub25jZSwgcGVycyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEhtYWNEUkJHO1xuXG5IbWFjRFJCRy5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0KGVudHJvcHksIG5vbmNlLCBwZXJzKSB7XG4gIHZhciBzZWVkID0gZW50cm9weS5jb25jYXQobm9uY2UpLmNvbmNhdChwZXJzKTtcblxuICB0aGlzLksgPSBuZXcgQXJyYXkodGhpcy5vdXRMZW4gLyA4KTtcbiAgdGhpcy5WID0gbmV3IEFycmF5KHRoaXMub3V0TGVuIC8gOCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5WLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5LW2ldID0gMHgwMDtcbiAgICB0aGlzLlZbaV0gPSAweDAxO1xuICB9XG5cbiAgdGhpcy5fdXBkYXRlKHNlZWQpO1xuICB0aGlzLl9yZXNlZWQgPSAxO1xuICB0aGlzLnJlc2VlZEludGVydmFsID0gMHgxMDAwMDAwMDAwMDAwOyAgLy8gMl40OFxufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLl9obWFjID0gZnVuY3Rpb24gaG1hYygpIHtcbiAgcmV0dXJuIG5ldyBoYXNoLmhtYWModGhpcy5oYXNoLCB0aGlzLkspO1xufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoc2VlZCkge1xuICB2YXIga21hYyA9IHRoaXMuX2htYWMoKVxuICAgICAgICAgICAgICAgICAudXBkYXRlKHRoaXMuVilcbiAgICAgICAgICAgICAgICAgLnVwZGF0ZShbIDB4MDAgXSk7XG4gIGlmIChzZWVkKVxuICAgIGttYWMgPSBrbWFjLnVwZGF0ZShzZWVkKTtcbiAgdGhpcy5LID0ga21hYy5kaWdlc3QoKTtcbiAgdGhpcy5WID0gdGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLmRpZ2VzdCgpO1xuICBpZiAoIXNlZWQpXG4gICAgcmV0dXJuO1xuXG4gIHRoaXMuSyA9IHRoaXMuX2htYWMoKVxuICAgICAgICAgICAgICAgLnVwZGF0ZSh0aGlzLlYpXG4gICAgICAgICAgICAgICAudXBkYXRlKFsgMHgwMSBdKVxuICAgICAgICAgICAgICAgLnVwZGF0ZShzZWVkKVxuICAgICAgICAgICAgICAgLmRpZ2VzdCgpO1xuICB0aGlzLlYgPSB0aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCk7XG59O1xuXG5IbWFjRFJCRy5wcm90b3R5cGUucmVzZWVkID0gZnVuY3Rpb24gcmVzZWVkKGVudHJvcHksIGVudHJvcHlFbmMsIGFkZCwgYWRkRW5jKSB7XG4gIC8vIE9wdGlvbmFsIGVudHJvcHkgZW5jXG4gIGlmICh0eXBlb2YgZW50cm9weUVuYyAhPT0gJ3N0cmluZycpIHtcbiAgICBhZGRFbmMgPSBhZGQ7XG4gICAgYWRkID0gZW50cm9weUVuYztcbiAgICBlbnRyb3B5RW5jID0gbnVsbDtcbiAgfVxuXG4gIGVudHJvcHkgPSB1dGlscy50b0FycmF5KGVudHJvcHksIGVudHJvcHlFbmMpO1xuICBhZGQgPSB1dGlscy50b0FycmF5KGFkZCwgYWRkRW5jKTtcblxuICBhc3NlcnQoZW50cm9weS5sZW5ndGggPj0gKHRoaXMubWluRW50cm9weSAvIDgpLFxuICAgICAgICAgJ05vdCBlbm91Z2ggZW50cm9weS4gTWluaW11bSBpczogJyArIHRoaXMubWluRW50cm9weSArICcgYml0cycpO1xuXG4gIHRoaXMuX3VwZGF0ZShlbnRyb3B5LmNvbmNhdChhZGQgfHwgW10pKTtcbiAgdGhpcy5fcmVzZWVkID0gMTtcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uIGdlbmVyYXRlKGxlbiwgZW5jLCBhZGQsIGFkZEVuYykge1xuICBpZiAodGhpcy5fcmVzZWVkID4gdGhpcy5yZXNlZWRJbnRlcnZhbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc2VlZCBpcyByZXF1aXJlZCcpO1xuXG4gIC8vIE9wdGlvbmFsIGVuY29kaW5nXG4gIGlmICh0eXBlb2YgZW5jICE9PSAnc3RyaW5nJykge1xuICAgIGFkZEVuYyA9IGFkZDtcbiAgICBhZGQgPSBlbmM7XG4gICAgZW5jID0gbnVsbDtcbiAgfVxuXG4gIC8vIE9wdGlvbmFsIGFkZGl0aW9uYWwgZGF0YVxuICBpZiAoYWRkKSB7XG4gICAgYWRkID0gdXRpbHMudG9BcnJheShhZGQsIGFkZEVuYyB8fCAnaGV4Jyk7XG4gICAgdGhpcy5fdXBkYXRlKGFkZCk7XG4gIH1cblxuICB2YXIgdGVtcCA9IFtdO1xuICB3aGlsZSAodGVtcC5sZW5ndGggPCBsZW4pIHtcbiAgICB0aGlzLlYgPSB0aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCk7XG4gICAgdGVtcCA9IHRlbXAuY29uY2F0KHRoaXMuVik7XG4gIH1cblxuICB2YXIgcmVzID0gdGVtcC5zbGljZSgwLCBsZW4pO1xuICB0aGlzLl91cGRhdGUoYWRkKTtcbiAgdGhpcy5fcmVzZWVkKys7XG4gIHJldHVybiB1dGlscy5lbmNvZGUocmVzLCBlbmMpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIEtleVBhaXIoZWMsIG9wdGlvbnMpIHtcbiAgdGhpcy5lYyA9IGVjO1xuICB0aGlzLnByaXYgPSBudWxsO1xuICB0aGlzLnB1YiA9IG51bGw7XG5cbiAgLy8gS2V5UGFpcihlYywgeyBwcml2OiAuLi4sIHB1YjogLi4uIH0pXG4gIGlmIChvcHRpb25zLnByaXYpXG4gICAgdGhpcy5faW1wb3J0UHJpdmF0ZShvcHRpb25zLnByaXYsIG9wdGlvbnMucHJpdkVuYyk7XG4gIGlmIChvcHRpb25zLnB1YilcbiAgICB0aGlzLl9pbXBvcnRQdWJsaWMob3B0aW9ucy5wdWIsIG9wdGlvbnMucHViRW5jKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gS2V5UGFpcjtcblxuS2V5UGFpci5mcm9tUHVibGljID0gZnVuY3Rpb24gZnJvbVB1YmxpYyhlYywgcHViLCBlbmMpIHtcbiAgaWYgKHB1YiBpbnN0YW5jZW9mIEtleVBhaXIpXG4gICAgcmV0dXJuIHB1YjtcblxuICByZXR1cm4gbmV3IEtleVBhaXIoZWMsIHtcbiAgICBwdWI6IHB1YixcbiAgICBwdWJFbmM6IGVuYyxcbiAgfSk7XG59O1xuXG5LZXlQYWlyLmZyb21Qcml2YXRlID0gZnVuY3Rpb24gZnJvbVByaXZhdGUoZWMsIHByaXYsIGVuYykge1xuICBpZiAocHJpdiBpbnN0YW5jZW9mIEtleVBhaXIpXG4gICAgcmV0dXJuIHByaXY7XG5cbiAgcmV0dXJuIG5ldyBLZXlQYWlyKGVjLCB7XG4gICAgcHJpdjogcHJpdixcbiAgICBwcml2RW5jOiBlbmMsXG4gIH0pO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgdmFyIHB1YiA9IHRoaXMuZ2V0UHVibGljKCk7XG5cbiAgaWYgKHB1Yi5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgcmVhc29uOiAnSW52YWxpZCBwdWJsaWMga2V5JyB9O1xuICBpZiAoIXB1Yi52YWxpZGF0ZSgpKVxuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIHJlYXNvbjogJ1B1YmxpYyBrZXkgaXMgbm90IGEgcG9pbnQnIH07XG4gIGlmICghcHViLm11bCh0aGlzLmVjLmN1cnZlLm4pLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCByZWFzb246ICdQdWJsaWMga2V5ICogTiAhPSBPJyB9O1xuXG4gIHJldHVybiB7IHJlc3VsdDogdHJ1ZSwgcmVhc29uOiBudWxsIH07XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRQdWJsaWMgPSBmdW5jdGlvbiBnZXRQdWJsaWMoY29tcGFjdCwgZW5jKSB7XG4gIC8vIGNvbXBhY3QgaXMgb3B0aW9uYWwgYXJndW1lbnRcbiAgaWYgKHR5cGVvZiBjb21wYWN0ID09PSAnc3RyaW5nJykge1xuICAgIGVuYyA9IGNvbXBhY3Q7XG4gICAgY29tcGFjdCA9IG51bGw7XG4gIH1cblxuICBpZiAoIXRoaXMucHViKVxuICAgIHRoaXMucHViID0gdGhpcy5lYy5nLm11bCh0aGlzLnByaXYpO1xuXG4gIGlmICghZW5jKVxuICAgIHJldHVybiB0aGlzLnB1YjtcblxuICByZXR1cm4gdGhpcy5wdWIuZW5jb2RlKGVuYywgY29tcGFjdCk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRQcml2YXRlID0gZnVuY3Rpb24gZ2V0UHJpdmF0ZShlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHRoaXMucHJpdi50b1N0cmluZygxNiwgMik7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5wcml2O1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuX2ltcG9ydFByaXZhdGUgPSBmdW5jdGlvbiBfaW1wb3J0UHJpdmF0ZShrZXksIGVuYykge1xuICB0aGlzLnByaXYgPSBuZXcgQk4oa2V5LCBlbmMgfHwgMTYpO1xuXG4gIC8vIEVuc3VyZSB0aGF0IHRoZSBwcml2IHdvbid0IGJlIGJpZ2dlciB0aGFuIG4sIG90aGVyd2lzZSB3ZSBtYXkgZmFpbFxuICAvLyBpbiBmaXhlZCBtdWx0aXBsaWNhdGlvbiBtZXRob2RcbiAgdGhpcy5wcml2ID0gdGhpcy5wcml2LnVtb2QodGhpcy5lYy5jdXJ2ZS5uKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLl9pbXBvcnRQdWJsaWMgPSBmdW5jdGlvbiBfaW1wb3J0UHVibGljKGtleSwgZW5jKSB7XG4gIGlmIChrZXkueCB8fCBrZXkueSkge1xuICAgIC8vIE1vbnRnb21lcnkgcG9pbnRzIG9ubHkgaGF2ZSBhbiBgeGAgY29vcmRpbmF0ZS5cbiAgICAvLyBXZWllcnN0cmFzcy9FZHdhcmRzIHBvaW50cyBvbiB0aGUgb3RoZXIgaGFuZCBoYXZlIGJvdGggYHhgIGFuZFxuICAgIC8vIGB5YCBjb29yZGluYXRlcy5cbiAgICBpZiAodGhpcy5lYy5jdXJ2ZS50eXBlID09PSAnbW9udCcpIHtcbiAgICAgIGFzc2VydChrZXkueCwgJ05lZWQgeCBjb29yZGluYXRlJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmVjLmN1cnZlLnR5cGUgPT09ICdzaG9ydCcgfHxcbiAgICAgICAgICAgICAgIHRoaXMuZWMuY3VydmUudHlwZSA9PT0gJ2Vkd2FyZHMnKSB7XG4gICAgICBhc3NlcnQoa2V5LnggJiYga2V5LnksICdOZWVkIGJvdGggeCBhbmQgeSBjb29yZGluYXRlJyk7XG4gICAgfVxuICAgIHRoaXMucHViID0gdGhpcy5lYy5jdXJ2ZS5wb2ludChrZXkueCwga2V5LnkpO1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnB1YiA9IHRoaXMuZWMuY3VydmUuZGVjb2RlUG9pbnQoa2V5LCBlbmMpO1xufTtcblxuLy8gRUNESFxuS2V5UGFpci5wcm90b3R5cGUuZGVyaXZlID0gZnVuY3Rpb24gZGVyaXZlKHB1Yikge1xuICBpZighcHViLnZhbGlkYXRlKCkpIHtcbiAgICBhc3NlcnQocHViLnZhbGlkYXRlKCksICdwdWJsaWMgcG9pbnQgbm90IHZhbGlkYXRlZCcpO1xuICB9XG4gIHJldHVybiBwdWIubXVsKHRoaXMucHJpdikuZ2V0WCgpO1xufTtcblxuLy8gRUNEU0FcbktleVBhaXIucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduKG1zZywgZW5jLCBvcHRpb25zKSB7XG4gIHJldHVybiB0aGlzLmVjLnNpZ24obXNnLCB0aGlzLCBlbmMsIG9wdGlvbnMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KG1zZywgc2lnbmF0dXJlLCBvcHRpb25zKSB7XG4gIHJldHVybiB0aGlzLmVjLnZlcmlmeShtc2csIHNpZ25hdHVyZSwgdGhpcywgdW5kZWZpbmVkLCBvcHRpb25zKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICByZXR1cm4gJzxLZXkgcHJpdjogJyArICh0aGlzLnByaXYgJiYgdGhpcy5wcml2LnRvU3RyaW5nKDE2LCAyKSkgK1xuICAgICAgICAgJyBwdWI6ICcgKyAodGhpcy5wdWIgJiYgdGhpcy5wdWIuaW5zcGVjdCgpKSArICcgPic7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBTaWduYXR1cmUob3B0aW9ucywgZW5jKSB7XG4gIGlmIChvcHRpb25zIGluc3RhbmNlb2YgU2lnbmF0dXJlKVxuICAgIHJldHVybiBvcHRpb25zO1xuXG4gIGlmICh0aGlzLl9pbXBvcnRERVIob3B0aW9ucywgZW5jKSlcbiAgICByZXR1cm47XG5cbiAgYXNzZXJ0KG9wdGlvbnMuciAmJiBvcHRpb25zLnMsICdTaWduYXR1cmUgd2l0aG91dCByIG9yIHMnKTtcbiAgdGhpcy5yID0gbmV3IEJOKG9wdGlvbnMuciwgMTYpO1xuICB0aGlzLnMgPSBuZXcgQk4ob3B0aW9ucy5zLCAxNik7XG4gIGlmIChvcHRpb25zLnJlY292ZXJ5UGFyYW0gPT09IHVuZGVmaW5lZClcbiAgICB0aGlzLnJlY292ZXJ5UGFyYW0gPSBudWxsO1xuICBlbHNlXG4gICAgdGhpcy5yZWNvdmVyeVBhcmFtID0gb3B0aW9ucy5yZWNvdmVyeVBhcmFtO1xufVxubW9kdWxlLmV4cG9ydHMgPSBTaWduYXR1cmU7XG5cbmZ1bmN0aW9uIFBvc2l0aW9uKCkge1xuICB0aGlzLnBsYWNlID0gMDtcbn1cblxuZnVuY3Rpb24gZ2V0TGVuZ3RoKGJ1ZiwgcCkge1xuICB2YXIgaW5pdGlhbCA9IGJ1ZltwLnBsYWNlKytdO1xuICBpZiAoIShpbml0aWFsICYgMHg4MCkpIHtcbiAgICByZXR1cm4gaW5pdGlhbDtcbiAgfVxuICB2YXIgb2N0ZXRMZW4gPSBpbml0aWFsICYgMHhmO1xuXG4gIC8vIEluZGVmaW5pdGUgbGVuZ3RoIG9yIG92ZXJmbG93XG4gIGlmIChvY3RldExlbiA9PT0gMCB8fCBvY3RldExlbiA+IDQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZihidWZbcC5wbGFjZV0gPT09IDB4MDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdmFsID0gMDtcbiAgZm9yICh2YXIgaSA9IDAsIG9mZiA9IHAucGxhY2U7IGkgPCBvY3RldExlbjsgaSsrLCBvZmYrKykge1xuICAgIHZhbCA8PD0gODtcbiAgICB2YWwgfD0gYnVmW29mZl07XG4gICAgdmFsID4+Pj0gMDtcbiAgfVxuXG4gIC8vIExlYWRpbmcgemVyb2VzXG4gIGlmICh2YWwgPD0gMHg3Zikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHAucGxhY2UgPSBvZmY7XG4gIHJldHVybiB2YWw7XG59XG5cbmZ1bmN0aW9uIHJtUGFkZGluZyhidWYpIHtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aCAtIDE7XG4gIHdoaWxlICghYnVmW2ldICYmICEoYnVmW2kgKyAxXSAmIDB4ODApICYmIGkgPCBsZW4pIHtcbiAgICBpKys7XG4gIH1cbiAgaWYgKGkgPT09IDApIHtcbiAgICByZXR1cm4gYnVmO1xuICB9XG4gIHJldHVybiBidWYuc2xpY2UoaSk7XG59XG5cblNpZ25hdHVyZS5wcm90b3R5cGUuX2ltcG9ydERFUiA9IGZ1bmN0aW9uIF9pbXBvcnRERVIoZGF0YSwgZW5jKSB7XG4gIGRhdGEgPSB1dGlscy50b0FycmF5KGRhdGEsIGVuYyk7XG4gIHZhciBwID0gbmV3IFBvc2l0aW9uKCk7XG4gIGlmIChkYXRhW3AucGxhY2UrK10gIT09IDB4MzApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGxlbiA9IGdldExlbmd0aChkYXRhLCBwKTtcbiAgaWYgKGxlbiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKChsZW4gKyBwLnBsYWNlKSAhPT0gZGF0YS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGRhdGFbcC5wbGFjZSsrXSAhPT0gMHgwMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcmxlbiA9IGdldExlbmd0aChkYXRhLCBwKTtcbiAgaWYgKHJsZW4gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICgoZGF0YVtwLnBsYWNlXSAmIDEyOCkgIT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHIgPSBkYXRhLnNsaWNlKHAucGxhY2UsIHJsZW4gKyBwLnBsYWNlKTtcbiAgcC5wbGFjZSArPSBybGVuO1xuICBpZiAoZGF0YVtwLnBsYWNlKytdICE9PSAweDAyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBzbGVuID0gZ2V0TGVuZ3RoKGRhdGEsIHApO1xuICBpZiAoc2xlbiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGRhdGEubGVuZ3RoICE9PSBzbGVuICsgcC5wbGFjZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoKGRhdGFbcC5wbGFjZV0gJiAxMjgpICE9PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBzID0gZGF0YS5zbGljZShwLnBsYWNlLCBzbGVuICsgcC5wbGFjZSk7XG4gIGlmIChyWzBdID09PSAwKSB7XG4gICAgaWYgKHJbMV0gJiAweDgwKSB7XG4gICAgICByID0gci5zbGljZSgxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGVhZGluZyB6ZXJvZXNcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKHNbMF0gPT09IDApIHtcbiAgICBpZiAoc1sxXSAmIDB4ODApIHtcbiAgICAgIHMgPSBzLnNsaWNlKDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMZWFkaW5nIHplcm9lc1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuciA9IG5ldyBCTihyKTtcbiAgdGhpcy5zID0gbmV3IEJOKHMpO1xuICB0aGlzLnJlY292ZXJ5UGFyYW0gPSBudWxsO1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gY29uc3RydWN0TGVuZ3RoKGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPCAweDgwKSB7XG4gICAgYXJyLnB1c2gobGVuKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG9jdGV0cyA9IDEgKyAoTWF0aC5sb2cobGVuKSAvIE1hdGguTE4yID4+PiAzKTtcbiAgYXJyLnB1c2gob2N0ZXRzIHwgMHg4MCk7XG4gIHdoaWxlICgtLW9jdGV0cykge1xuICAgIGFyci5wdXNoKChsZW4gPj4+IChvY3RldHMgPDwgMykpICYgMHhmZik7XG4gIH1cbiAgYXJyLnB1c2gobGVuKTtcbn1cblxuU2lnbmF0dXJlLnByb3RvdHlwZS50b0RFUiA9IGZ1bmN0aW9uIHRvREVSKGVuYykge1xuICB2YXIgciA9IHRoaXMuci50b0FycmF5KCk7XG4gIHZhciBzID0gdGhpcy5zLnRvQXJyYXkoKTtcblxuICAvLyBQYWQgdmFsdWVzXG4gIGlmIChyWzBdICYgMHg4MClcbiAgICByID0gWyAwIF0uY29uY2F0KHIpO1xuICAvLyBQYWQgdmFsdWVzXG4gIGlmIChzWzBdICYgMHg4MClcbiAgICBzID0gWyAwIF0uY29uY2F0KHMpO1xuXG4gIHIgPSBybVBhZGRpbmcocik7XG4gIHMgPSBybVBhZGRpbmcocyk7XG5cbiAgd2hpbGUgKCFzWzBdICYmICEoc1sxXSAmIDB4ODApKSB7XG4gICAgcyA9IHMuc2xpY2UoMSk7XG4gIH1cbiAgdmFyIGFyciA9IFsgMHgwMiBdO1xuICBjb25zdHJ1Y3RMZW5ndGgoYXJyLCByLmxlbmd0aCk7XG4gIGFyciA9IGFyci5jb25jYXQocik7XG4gIGFyci5wdXNoKDB4MDIpO1xuICBjb25zdHJ1Y3RMZW5ndGgoYXJyLCBzLmxlbmd0aCk7XG4gIHZhciBiYWNrSGFsZiA9IGFyci5jb25jYXQocyk7XG4gIHZhciByZXMgPSBbIDB4MzAgXTtcbiAgY29uc3RydWN0TGVuZ3RoKHJlcywgYmFja0hhbGYubGVuZ3RoKTtcbiAgcmVzID0gcmVzLmNvbmNhdChiYWNrSGFsZik7XG4gIHJldHVybiB1dGlscy5lbmNvZGUocmVzLCBlbmMpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIEhtYWNEUkJHID0gcmVxdWlyZSgnaG1hYy1kcmJnJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGN1cnZlcyA9IHJlcXVpcmUoJy4uL2N1cnZlcycpO1xudmFyIHJhbmQgPSByZXF1aXJlKCdicm9yYW5kJyk7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG52YXIgS2V5UGFpciA9IHJlcXVpcmUoJy4va2V5Jyk7XG52YXIgU2lnbmF0dXJlID0gcmVxdWlyZSgnLi9zaWduYXR1cmUnKTtcblxuZnVuY3Rpb24gRUMob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRUMpKVxuICAgIHJldHVybiBuZXcgRUMob3B0aW9ucyk7XG5cbiAgLy8gU2hvcnRjdXQgYGVsbGlwdGljLmVjKGN1cnZlLW5hbWUpYFxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgYXNzZXJ0KE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJ2ZXMsIG9wdGlvbnMpLFxuICAgICAgJ1Vua25vd24gY3VydmUgJyArIG9wdGlvbnMpO1xuXG4gICAgb3B0aW9ucyA9IGN1cnZlc1tvcHRpb25zXTtcbiAgfVxuXG4gIC8vIFNob3J0Y3V0IGZvciBgZWxsaXB0aWMuZWMoZWxsaXB0aWMuY3VydmVzLmN1cnZlTmFtZSlgXG4gIGlmIChvcHRpb25zIGluc3RhbmNlb2YgY3VydmVzLlByZXNldEN1cnZlKVxuICAgIG9wdGlvbnMgPSB7IGN1cnZlOiBvcHRpb25zIH07XG5cbiAgdGhpcy5jdXJ2ZSA9IG9wdGlvbnMuY3VydmUuY3VydmU7XG4gIHRoaXMubiA9IHRoaXMuY3VydmUubjtcbiAgdGhpcy5uaCA9IHRoaXMubi51c2hybigxKTtcbiAgdGhpcy5nID0gdGhpcy5jdXJ2ZS5nO1xuXG4gIC8vIFBvaW50IG9uIGN1cnZlXG4gIHRoaXMuZyA9IG9wdGlvbnMuY3VydmUuZztcbiAgdGhpcy5nLnByZWNvbXB1dGUob3B0aW9ucy5jdXJ2ZS5uLmJpdExlbmd0aCgpICsgMSk7XG5cbiAgLy8gSGFzaCBmb3IgZnVuY3Rpb24gZm9yIERSQkdcbiAgdGhpcy5oYXNoID0gb3B0aW9ucy5oYXNoIHx8IG9wdGlvbnMuY3VydmUuaGFzaDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRUM7XG5cbkVDLnByb3RvdHlwZS5rZXlQYWlyID0gZnVuY3Rpb24ga2V5UGFpcihvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgS2V5UGFpcih0aGlzLCBvcHRpb25zKTtcbn07XG5cbkVDLnByb3RvdHlwZS5rZXlGcm9tUHJpdmF0ZSA9IGZ1bmN0aW9uIGtleUZyb21Qcml2YXRlKHByaXYsIGVuYykge1xuICByZXR1cm4gS2V5UGFpci5mcm9tUHJpdmF0ZSh0aGlzLCBwcml2LCBlbmMpO1xufTtcblxuRUMucHJvdG90eXBlLmtleUZyb21QdWJsaWMgPSBmdW5jdGlvbiBrZXlGcm9tUHVibGljKHB1YiwgZW5jKSB7XG4gIHJldHVybiBLZXlQYWlyLmZyb21QdWJsaWModGhpcywgcHViLCBlbmMpO1xufTtcblxuRUMucHJvdG90eXBlLmdlbktleVBhaXIgPSBmdW5jdGlvbiBnZW5LZXlQYWlyKG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKVxuICAgIG9wdGlvbnMgPSB7fTtcblxuICAvLyBJbnN0YW50aWF0ZSBIbWFjX0RSQkdcbiAgdmFyIGRyYmcgPSBuZXcgSG1hY0RSQkcoe1xuICAgIGhhc2g6IHRoaXMuaGFzaCxcbiAgICBwZXJzOiBvcHRpb25zLnBlcnMsXG4gICAgcGVyc0VuYzogb3B0aW9ucy5wZXJzRW5jIHx8ICd1dGY4JyxcbiAgICBlbnRyb3B5OiBvcHRpb25zLmVudHJvcHkgfHwgcmFuZCh0aGlzLmhhc2guaG1hY1N0cmVuZ3RoKSxcbiAgICBlbnRyb3B5RW5jOiBvcHRpb25zLmVudHJvcHkgJiYgb3B0aW9ucy5lbnRyb3B5RW5jIHx8ICd1dGY4JyxcbiAgICBub25jZTogdGhpcy5uLnRvQXJyYXkoKSxcbiAgfSk7XG5cbiAgdmFyIGJ5dGVzID0gdGhpcy5uLmJ5dGVMZW5ndGgoKTtcbiAgdmFyIG5zMiA9IHRoaXMubi5zdWIobmV3IEJOKDIpKTtcbiAgZm9yICg7Oykge1xuICAgIHZhciBwcml2ID0gbmV3IEJOKGRyYmcuZ2VuZXJhdGUoYnl0ZXMpKTtcbiAgICBpZiAocHJpdi5jbXAobnMyKSA+IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHByaXYuaWFkZG4oMSk7XG4gICAgcmV0dXJuIHRoaXMua2V5RnJvbVByaXZhdGUocHJpdik7XG4gIH1cbn07XG5cbkVDLnByb3RvdHlwZS5fdHJ1bmNhdGVUb04gPSBmdW5jdGlvbiBfdHJ1bmNhdGVUb04obXNnLCB0cnVuY09ubHksIGJpdExlbmd0aCkge1xuICB2YXIgYnl0ZUxlbmd0aDtcbiAgaWYgKEJOLmlzQk4obXNnKSB8fCB0eXBlb2YgbXNnID09PSAnbnVtYmVyJykge1xuICAgIG1zZyA9IG5ldyBCTihtc2csIDE2KTtcbiAgICBieXRlTGVuZ3RoID0gbXNnLmJ5dGVMZW5ndGgoKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbXNnID09PSAnb2JqZWN0Jykge1xuICAgIC8vIEJOIGFzc3VtZXMgYW4gYXJyYXktbGlrZSBpbnB1dCBhbmQgYXNzZXJ0cyBsZW5ndGhcbiAgICBieXRlTGVuZ3RoID0gbXNnLmxlbmd0aDtcbiAgICBtc2cgPSBuZXcgQk4obXNnLCAxNik7XG4gIH0gZWxzZSB7XG4gICAgLy8gQk4gY29udmVydHMgdGhlIHZhbHVlIHRvIHN0cmluZ1xuICAgIHZhciBzdHIgPSBtc2cudG9TdHJpbmcoKTtcbiAgICAvLyBIRVggZW5jb2RpbmdcbiAgICBieXRlTGVuZ3RoID0gKHN0ci5sZW5ndGggKyAxKSA+Pj4gMTtcbiAgICBtc2cgPSBuZXcgQk4oc3RyLCAxNik7XG4gIH1cbiAgLy8gQWxsb3cgb3ZlcnJpZGluZ1xuICBpZiAodHlwZW9mIGJpdExlbmd0aCAhPT0gJ251bWJlcicpIHtcbiAgICBiaXRMZW5ndGggPSBieXRlTGVuZ3RoICogODtcbiAgfVxuICB2YXIgZGVsdGEgPSBiaXRMZW5ndGggLSB0aGlzLm4uYml0TGVuZ3RoKCk7XG4gIGlmIChkZWx0YSA+IDApXG4gICAgbXNnID0gbXNnLnVzaHJuKGRlbHRhKTtcbiAgaWYgKCF0cnVuY09ubHkgJiYgbXNnLmNtcCh0aGlzLm4pID49IDApXG4gICAgcmV0dXJuIG1zZy5zdWIodGhpcy5uKTtcbiAgZWxzZVxuICAgIHJldHVybiBtc2c7XG59O1xuXG5FQy5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obXNnLCBrZXksIGVuYywgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGVuYyA9PT0gJ29iamVjdCcpIHtcbiAgICBvcHRpb25zID0gZW5jO1xuICAgIGVuYyA9IG51bGw7XG4gIH1cbiAgaWYgKCFvcHRpb25zKVxuICAgIG9wdGlvbnMgPSB7fTtcblxuICBpZiAodHlwZW9mIG1zZyAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIG1zZyAhPT0gJ251bWJlcicgJiYgIUJOLmlzQk4obXNnKSkge1xuICAgIGFzc2VydCh0eXBlb2YgbXNnID09PSAnb2JqZWN0JyAmJiBtc2cgJiYgdHlwZW9mIG1zZy5sZW5ndGggPT09ICdudW1iZXInLFxuICAgICAgJ0V4cGVjdGVkIG1lc3NhZ2UgdG8gYmUgYW4gYXJyYXktbGlrZSwgYSBoZXggc3RyaW5nLCBvciBhIEJOIGluc3RhbmNlJyk7XG4gICAgYXNzZXJ0KChtc2cubGVuZ3RoID4+PiAwKSA9PT0gbXNnLmxlbmd0aCk7IC8vIG5vbi1uZWdhdGl2ZSAzMi1iaXQgaW50ZWdlclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSBhc3NlcnQoKG1zZ1tpXSAmIDI1NSkgPT09IG1zZ1tpXSk7XG4gIH1cblxuICBrZXkgPSB0aGlzLmtleUZyb21Qcml2YXRlKGtleSwgZW5jKTtcbiAgbXNnID0gdGhpcy5fdHJ1bmNhdGVUb04obXNnLCBmYWxzZSwgb3B0aW9ucy5tc2dCaXRMZW5ndGgpO1xuXG4gIC8vIFdvdWxkIGZhaWwgZnVydGhlciBjaGVja3MsIGJ1dCBsZXQncyBtYWtlIHRoZSBlcnJvciBtZXNzYWdlIGNsZWFyXG4gIGFzc2VydCghbXNnLmlzTmVnKCksICdDYW4gbm90IHNpZ24gYSBuZWdhdGl2ZSBtZXNzYWdlJyk7XG5cbiAgLy8gWmVyby1leHRlbmQga2V5IHRvIHByb3ZpZGUgZW5vdWdoIGVudHJvcHlcbiAgdmFyIGJ5dGVzID0gdGhpcy5uLmJ5dGVMZW5ndGgoKTtcbiAgdmFyIGJrZXkgPSBrZXkuZ2V0UHJpdmF0ZSgpLnRvQXJyYXkoJ2JlJywgYnl0ZXMpO1xuXG4gIC8vIFplcm8tZXh0ZW5kIG5vbmNlIHRvIGhhdmUgdGhlIHNhbWUgYnl0ZSBzaXplIGFzIE5cbiAgdmFyIG5vbmNlID0gbXNnLnRvQXJyYXkoJ2JlJywgYnl0ZXMpO1xuXG4gIC8vIFJlY2hlY2sgbm9uY2UgdG8gYmUgYmlqZWN0aXZlIHRvIG1zZ1xuICBhc3NlcnQoKG5ldyBCTihub25jZSkpLmVxKG1zZyksICdDYW4gbm90IHNpZ24gbWVzc2FnZScpO1xuXG4gIC8vIEluc3RhbnRpYXRlIEhtYWNfRFJCR1xuICB2YXIgZHJiZyA9IG5ldyBIbWFjRFJCRyh7XG4gICAgaGFzaDogdGhpcy5oYXNoLFxuICAgIGVudHJvcHk6IGJrZXksXG4gICAgbm9uY2U6IG5vbmNlLFxuICAgIHBlcnM6IG9wdGlvbnMucGVycyxcbiAgICBwZXJzRW5jOiBvcHRpb25zLnBlcnNFbmMgfHwgJ3V0ZjgnLFxuICB9KTtcblxuICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gZ2VuZXJhdGVcbiAgdmFyIG5zMSA9IHRoaXMubi5zdWIobmV3IEJOKDEpKTtcblxuICBmb3IgKHZhciBpdGVyID0gMDsgOyBpdGVyKyspIHtcbiAgICB2YXIgayA9IG9wdGlvbnMuayA/XG4gICAgICBvcHRpb25zLmsoaXRlcikgOlxuICAgICAgbmV3IEJOKGRyYmcuZ2VuZXJhdGUodGhpcy5uLmJ5dGVMZW5ndGgoKSkpO1xuICAgIGsgPSB0aGlzLl90cnVuY2F0ZVRvTihrLCB0cnVlKTtcbiAgICBpZiAoay5jbXBuKDEpIDw9IDAgfHwgay5jbXAobnMxKSA+PSAwKVxuICAgICAgY29udGludWU7XG5cbiAgICB2YXIga3AgPSB0aGlzLmcubXVsKGspO1xuICAgIGlmIChrcC5pc0luZmluaXR5KCkpXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBrcFggPSBrcC5nZXRYKCk7XG4gICAgdmFyIHIgPSBrcFgudW1vZCh0aGlzLm4pO1xuICAgIGlmIChyLmNtcG4oMCkgPT09IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBzID0gay5pbnZtKHRoaXMubikubXVsKHIubXVsKGtleS5nZXRQcml2YXRlKCkpLmlhZGQobXNnKSk7XG4gICAgcyA9IHMudW1vZCh0aGlzLm4pO1xuICAgIGlmIChzLmNtcG4oMCkgPT09IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciByZWNvdmVyeVBhcmFtID0gKGtwLmdldFkoKS5pc09kZCgpID8gMSA6IDApIHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChrcFguY21wKHIpICE9PSAwID8gMiA6IDApO1xuXG4gICAgLy8gVXNlIGNvbXBsZW1lbnQgb2YgYHNgLCBpZiBpdCBpcyA+IGBuIC8gMmBcbiAgICBpZiAob3B0aW9ucy5jYW5vbmljYWwgJiYgcy5jbXAodGhpcy5uaCkgPiAwKSB7XG4gICAgICBzID0gdGhpcy5uLnN1YihzKTtcbiAgICAgIHJlY292ZXJ5UGFyYW0gXj0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFNpZ25hdHVyZSh7IHI6IHIsIHM6IHMsIHJlY292ZXJ5UGFyYW06IHJlY292ZXJ5UGFyYW0gfSk7XG4gIH1cbn07XG5cbkVDLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkobXNnLCBzaWduYXR1cmUsIGtleSwgZW5jLCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucylcbiAgICBvcHRpb25zID0ge307XG5cbiAgbXNnID0gdGhpcy5fdHJ1bmNhdGVUb04obXNnLCBmYWxzZSwgb3B0aW9ucy5tc2dCaXRMZW5ndGgpO1xuICBrZXkgPSB0aGlzLmtleUZyb21QdWJsaWMoa2V5LCBlbmMpO1xuICBzaWduYXR1cmUgPSBuZXcgU2lnbmF0dXJlKHNpZ25hdHVyZSwgJ2hleCcpO1xuXG4gIC8vIFBlcmZvcm0gcHJpbWl0aXZlIHZhbHVlcyB2YWxpZGF0aW9uXG4gIHZhciByID0gc2lnbmF0dXJlLnI7XG4gIHZhciBzID0gc2lnbmF0dXJlLnM7XG4gIGlmIChyLmNtcG4oMSkgPCAwIHx8IHIuY21wKHRoaXMubikgPj0gMClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChzLmNtcG4oMSkgPCAwIHx8IHMuY21wKHRoaXMubikgPj0gMClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gVmFsaWRhdGUgc2lnbmF0dXJlXG4gIHZhciBzaW52ID0gcy5pbnZtKHRoaXMubik7XG4gIHZhciB1MSA9IHNpbnYubXVsKG1zZykudW1vZCh0aGlzLm4pO1xuICB2YXIgdTIgPSBzaW52Lm11bChyKS51bW9kKHRoaXMubik7XG4gIHZhciBwO1xuXG4gIGlmICghdGhpcy5jdXJ2ZS5fbWF4d2VsbFRyaWNrKSB7XG4gICAgcCA9IHRoaXMuZy5tdWxBZGQodTEsIGtleS5nZXRQdWJsaWMoKSwgdTIpO1xuICAgIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBwLmdldFgoKS51bW9kKHRoaXMubikuY21wKHIpID09PSAwO1xuICB9XG5cbiAgLy8gTk9URTogR3JlZyBNYXh3ZWxsJ3MgdHJpY2ssIGluc3BpcmVkIGJ5OlxuICAvLyBodHRwczovL2dpdC5pby92YWQzS1xuXG4gIHAgPSB0aGlzLmcuam11bEFkZCh1MSwga2V5LmdldFB1YmxpYygpLCB1Mik7XG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gQ29tcGFyZSBgcC54YCBvZiBKYWNvYmlhbiBwb2ludCB3aXRoIGByYCxcbiAgLy8gdGhpcyB3aWxsIGRvIGBwLnggPT0gciAqIHAuel4yYCBpbnN0ZWFkIG9mIG11bHRpcGx5aW5nIGBwLnhgIGJ5IHRoZVxuICAvLyBpbnZlcnNlIG9mIGBwLnpeMmBcbiAgcmV0dXJuIHAuZXFYVG9QKHIpO1xufTtcblxuRUMucHJvdG90eXBlLnJlY292ZXJQdWJLZXkgPSBmdW5jdGlvbihtc2csIHNpZ25hdHVyZSwgaiwgZW5jKSB7XG4gIGFzc2VydCgoMyAmIGopID09PSBqLCAnVGhlIHJlY292ZXJ5IHBhcmFtIGlzIG1vcmUgdGhhbiB0d28gYml0cycpO1xuICBzaWduYXR1cmUgPSBuZXcgU2lnbmF0dXJlKHNpZ25hdHVyZSwgZW5jKTtcblxuICB2YXIgbiA9IHRoaXMubjtcbiAgdmFyIGUgPSBuZXcgQk4obXNnKTtcbiAgdmFyIHIgPSBzaWduYXR1cmUucjtcbiAgdmFyIHMgPSBzaWduYXR1cmUucztcblxuICAvLyBBIHNldCBMU0Igc2lnbmlmaWVzIHRoYXQgdGhlIHktY29vcmRpbmF0ZSBpcyBvZGRcbiAgdmFyIGlzWU9kZCA9IGogJiAxO1xuICB2YXIgaXNTZWNvbmRLZXkgPSBqID4+IDE7XG4gIGlmIChyLmNtcCh0aGlzLmN1cnZlLnAudW1vZCh0aGlzLmN1cnZlLm4pKSA+PSAwICYmIGlzU2Vjb25kS2V5KVxuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgc2VuY29uZCBrZXkgY2FuZGluYXRlJyk7XG5cbiAgLy8gMS4xLiBMZXQgeCA9IHIgKyBqbi5cbiAgaWYgKGlzU2Vjb25kS2V5KVxuICAgIHIgPSB0aGlzLmN1cnZlLnBvaW50RnJvbVgoci5hZGQodGhpcy5jdXJ2ZS5uKSwgaXNZT2RkKTtcbiAgZWxzZVxuICAgIHIgPSB0aGlzLmN1cnZlLnBvaW50RnJvbVgociwgaXNZT2RkKTtcblxuICB2YXIgckludiA9IHNpZ25hdHVyZS5yLmludm0obik7XG4gIHZhciBzMSA9IG4uc3ViKGUpLm11bChySW52KS51bW9kKG4pO1xuICB2YXIgczIgPSBzLm11bChySW52KS51bW9kKG4pO1xuXG4gIC8vIDEuNi4xIENvbXB1dGUgUSA9IHJeLTEgKHNSIC0gIGVHKVxuICAvLyAgICAgICAgICAgICAgIFEgPSByXi0xIChzUiArIC1lRylcbiAgcmV0dXJuIHRoaXMuZy5tdWxBZGQoczEsIHIsIHMyKTtcbn07XG5cbkVDLnByb3RvdHlwZS5nZXRLZXlSZWNvdmVyeVBhcmFtID0gZnVuY3Rpb24oZSwgc2lnbmF0dXJlLCBRLCBlbmMpIHtcbiAgc2lnbmF0dXJlID0gbmV3IFNpZ25hdHVyZShzaWduYXR1cmUsIGVuYyk7XG4gIGlmIChzaWduYXR1cmUucmVjb3ZlcnlQYXJhbSAhPT0gbnVsbClcbiAgICByZXR1cm4gc2lnbmF0dXJlLnJlY292ZXJ5UGFyYW07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICB2YXIgUXByaW1lO1xuICAgIHRyeSB7XG4gICAgICBRcHJpbWUgPSB0aGlzLnJlY292ZXJQdWJLZXkoZSwgc2lnbmF0dXJlLCBpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoUXByaW1lLmVxKFEpKVxuICAgICAgcmV0dXJuIGk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCB2YWxpZCByZWNvdmVyeSBmYWN0b3InKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG52YXIgcGFyc2VCeXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXM7XG52YXIgY2FjaGVkUHJvcGVydHkgPSB1dGlscy5jYWNoZWRQcm9wZXJ0eTtcblxuLyoqXG4qIEBwYXJhbSB7RUREU0F9IGVkZHNhIC0gaW5zdGFuY2VcbiogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHB1YmxpYy9wcml2YXRlIGtleSBwYXJhbWV0ZXJzXG4qXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZT59IFtwYXJhbXMuc2VjcmV0XSAtIHNlY3JldCBzZWVkIGJ5dGVzXG4qIEBwYXJhbSB7UG9pbnR9IFtwYXJhbXMucHViXSAtIHB1YmxpYyBrZXkgcG9pbnQgKGFrYSBgQWAgaW4gZWRkc2EgdGVybXMpXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZT59IFtwYXJhbXMucHViXSAtIHB1YmxpYyBrZXkgcG9pbnQgZW5jb2RlZCBhcyBieXRlc1xuKlxuKi9cbmZ1bmN0aW9uIEtleVBhaXIoZWRkc2EsIHBhcmFtcykge1xuICB0aGlzLmVkZHNhID0gZWRkc2E7XG4gIHRoaXMuX3NlY3JldCA9IHBhcnNlQnl0ZXMocGFyYW1zLnNlY3JldCk7XG4gIGlmIChlZGRzYS5pc1BvaW50KHBhcmFtcy5wdWIpKVxuICAgIHRoaXMuX3B1YiA9IHBhcmFtcy5wdWI7XG4gIGVsc2VcbiAgICB0aGlzLl9wdWJCeXRlcyA9IHBhcnNlQnl0ZXMocGFyYW1zLnB1Yik7XG59XG5cbktleVBhaXIuZnJvbVB1YmxpYyA9IGZ1bmN0aW9uIGZyb21QdWJsaWMoZWRkc2EsIHB1Yikge1xuICBpZiAocHViIGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gcHViO1xuICByZXR1cm4gbmV3IEtleVBhaXIoZWRkc2EsIHsgcHViOiBwdWIgfSk7XG59O1xuXG5LZXlQYWlyLmZyb21TZWNyZXQgPSBmdW5jdGlvbiBmcm9tU2VjcmV0KGVkZHNhLCBzZWNyZXQpIHtcbiAgaWYgKHNlY3JldCBpbnN0YW5jZW9mIEtleVBhaXIpXG4gICAgcmV0dXJuIHNlY3JldDtcbiAgcmV0dXJuIG5ldyBLZXlQYWlyKGVkZHNhLCB7IHNlY3JldDogc2VjcmV0IH0pO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuc2VjcmV0ID0gZnVuY3Rpb24gc2VjcmV0KCkge1xuICByZXR1cm4gdGhpcy5fc2VjcmV0O1xufTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ3B1YkJ5dGVzJywgZnVuY3Rpb24gcHViQnl0ZXMoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmVuY29kZVBvaW50KHRoaXMucHViKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsICdwdWInLCBmdW5jdGlvbiBwdWIoKSB7XG4gIGlmICh0aGlzLl9wdWJCeXRlcylcbiAgICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVQb2ludCh0aGlzLl9wdWJCeXRlcyk7XG4gIHJldHVybiB0aGlzLmVkZHNhLmcubXVsKHRoaXMucHJpdigpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAncHJpdkJ5dGVzJywgZnVuY3Rpb24gcHJpdkJ5dGVzKCkge1xuICB2YXIgZWRkc2EgPSB0aGlzLmVkZHNhO1xuICB2YXIgaGFzaCA9IHRoaXMuaGFzaCgpO1xuICB2YXIgbGFzdEl4ID0gZWRkc2EuZW5jb2RpbmdMZW5ndGggLSAxO1xuXG4gIHZhciBhID0gaGFzaC5zbGljZSgwLCBlZGRzYS5lbmNvZGluZ0xlbmd0aCk7XG4gIGFbMF0gJj0gMjQ4O1xuICBhW2xhc3RJeF0gJj0gMTI3O1xuICBhW2xhc3RJeF0gfD0gNjQ7XG5cbiAgcmV0dXJuIGE7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ3ByaXYnLCBmdW5jdGlvbiBwcml2KCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVJbnQodGhpcy5wcml2Qnl0ZXMoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ2hhc2gnLCBmdW5jdGlvbiBoYXNoKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5oYXNoKCkudXBkYXRlKHRoaXMuc2VjcmV0KCkpLmRpZ2VzdCgpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsICdtZXNzYWdlUHJlZml4JywgZnVuY3Rpb24gbWVzc2FnZVByZWZpeCgpIHtcbiAgcmV0dXJuIHRoaXMuaGFzaCgpLnNsaWNlKHRoaXMuZWRkc2EuZW5jb2RpbmdMZW5ndGgpO1xufSk7XG5cbktleVBhaXIucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduKG1lc3NhZ2UpIHtcbiAgYXNzZXJ0KHRoaXMuX3NlY3JldCwgJ0tleVBhaXIgY2FuIG9ubHkgdmVyaWZ5Jyk7XG4gIHJldHVybiB0aGlzLmVkZHNhLnNpZ24obWVzc2FnZSwgdGhpcyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkobWVzc2FnZSwgc2lnKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLnZlcmlmeShtZXNzYWdlLCBzaWcsIHRoaXMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuZ2V0U2VjcmV0ID0gZnVuY3Rpb24gZ2V0U2VjcmV0KGVuYykge1xuICBhc3NlcnQodGhpcy5fc2VjcmV0LCAnS2V5UGFpciBpcyBwdWJsaWMgb25seScpO1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHRoaXMuc2VjcmV0KCksIGVuYyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRQdWJsaWMgPSBmdW5jdGlvbiBnZXRQdWJsaWMoZW5jKSB7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy5wdWJCeXRlcygpLCBlbmMpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBLZXlQYWlyO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcbnZhciBjYWNoZWRQcm9wZXJ0eSA9IHV0aWxzLmNhY2hlZFByb3BlcnR5O1xudmFyIHBhcnNlQnl0ZXMgPSB1dGlscy5wYXJzZUJ5dGVzO1xuXG4vKipcbiogQHBhcmFtIHtFRERTQX0gZWRkc2EgLSBlZGRzYSBpbnN0YW5jZVxuKiBAcGFyYW0ge0FycmF5PEJ5dGVzPnxPYmplY3R9IHNpZyAtXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fFBvaW50fSBbc2lnLlJdIC0gUiBwb2ludCBhcyBQb2ludCBvciBieXRlc1xuKiBAcGFyYW0ge0FycmF5PEJ5dGVzPnxibn0gW3NpZy5TXSAtIFMgc2NhbGFyIGFzIGJuIG9yIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fSBbc2lnLlJlbmNvZGVkXSAtIFIgcG9pbnQgZW5jb2RlZFxuKiBAcGFyYW0ge0FycmF5PEJ5dGVzPn0gW3NpZy5TZW5jb2RlZF0gLSBTIHNjYWxhciBlbmNvZGVkXG4qL1xuZnVuY3Rpb24gU2lnbmF0dXJlKGVkZHNhLCBzaWcpIHtcbiAgdGhpcy5lZGRzYSA9IGVkZHNhO1xuXG4gIGlmICh0eXBlb2Ygc2lnICE9PSAnb2JqZWN0JylcbiAgICBzaWcgPSBwYXJzZUJ5dGVzKHNpZyk7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc2lnKSkge1xuICAgIGFzc2VydChzaWcubGVuZ3RoID09PSBlZGRzYS5lbmNvZGluZ0xlbmd0aCAqIDIsICdTaWduYXR1cmUgaGFzIGludmFsaWQgc2l6ZScpO1xuICAgIHNpZyA9IHtcbiAgICAgIFI6IHNpZy5zbGljZSgwLCBlZGRzYS5lbmNvZGluZ0xlbmd0aCksXG4gICAgICBTOiBzaWcuc2xpY2UoZWRkc2EuZW5jb2RpbmdMZW5ndGgpLFxuICAgIH07XG4gIH1cblxuICBhc3NlcnQoc2lnLlIgJiYgc2lnLlMsICdTaWduYXR1cmUgd2l0aG91dCBSIG9yIFMnKTtcblxuICBpZiAoZWRkc2EuaXNQb2ludChzaWcuUikpXG4gICAgdGhpcy5fUiA9IHNpZy5SO1xuICBpZiAoc2lnLlMgaW5zdGFuY2VvZiBCTilcbiAgICB0aGlzLl9TID0gc2lnLlM7XG5cbiAgdGhpcy5fUmVuY29kZWQgPSBBcnJheS5pc0FycmF5KHNpZy5SKSA/IHNpZy5SIDogc2lnLlJlbmNvZGVkO1xuICB0aGlzLl9TZW5jb2RlZCA9IEFycmF5LmlzQXJyYXkoc2lnLlMpID8gc2lnLlMgOiBzaWcuU2VuY29kZWQ7XG59XG5cbmNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwgJ1MnLCBmdW5jdGlvbiBTKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVJbnQodGhpcy5TZW5jb2RlZCgpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShTaWduYXR1cmUsICdSJywgZnVuY3Rpb24gUigpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZGVjb2RlUG9pbnQodGhpcy5SZW5jb2RlZCgpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShTaWduYXR1cmUsICdSZW5jb2RlZCcsIGZ1bmN0aW9uIFJlbmNvZGVkKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVQb2ludCh0aGlzLlIoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoU2lnbmF0dXJlLCAnU2VuY29kZWQnLCBmdW5jdGlvbiBTZW5jb2RlZCgpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZW5jb2RlSW50KHRoaXMuUygpKTtcbn0pO1xuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvQnl0ZXMgPSBmdW5jdGlvbiB0b0J5dGVzKCkge1xuICByZXR1cm4gdGhpcy5SZW5jb2RlZCgpLmNvbmNhdCh0aGlzLlNlbmNvZGVkKCkpO1xufTtcblxuU2lnbmF0dXJlLnByb3RvdHlwZS50b0hleCA9IGZ1bmN0aW9uIHRvSGV4KCkge1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHRoaXMudG9CeXRlcygpLCAnaGV4JykudG9VcHBlckNhc2UoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gU2lnbmF0dXJlO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNoID0gcmVxdWlyZSgnaGFzaC5qcycpO1xudmFyIGN1cnZlcyA9IHJlcXVpcmUoJy4uL2N1cnZlcycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG52YXIgcGFyc2VCeXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXM7XG52YXIgS2V5UGFpciA9IHJlcXVpcmUoJy4va2V5Jyk7XG52YXIgU2lnbmF0dXJlID0gcmVxdWlyZSgnLi9zaWduYXR1cmUnKTtcblxuZnVuY3Rpb24gRUREU0EoY3VydmUpIHtcbiAgYXNzZXJ0KGN1cnZlID09PSAnZWQyNTUxOScsICdvbmx5IHRlc3RlZCB3aXRoIGVkMjU1MTkgc28gZmFyJyk7XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEVERFNBKSlcbiAgICByZXR1cm4gbmV3IEVERFNBKGN1cnZlKTtcblxuICBjdXJ2ZSA9IGN1cnZlc1tjdXJ2ZV0uY3VydmU7XG4gIHRoaXMuY3VydmUgPSBjdXJ2ZTtcbiAgdGhpcy5nID0gY3VydmUuZztcbiAgdGhpcy5nLnByZWNvbXB1dGUoY3VydmUubi5iaXRMZW5ndGgoKSArIDEpO1xuXG4gIHRoaXMucG9pbnRDbGFzcyA9IGN1cnZlLnBvaW50KCkuY29uc3RydWN0b3I7XG4gIHRoaXMuZW5jb2RpbmdMZW5ndGggPSBNYXRoLmNlaWwoY3VydmUubi5iaXRMZW5ndGgoKSAvIDgpO1xuICB0aGlzLmhhc2ggPSBoYXNoLnNoYTUxMjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBFRERTQTtcblxuLyoqXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBtZXNzYWdlIC0gbWVzc2FnZSBieXRlc1xuKiBAcGFyYW0ge0FycmF5fFN0cmluZ3xLZXlQYWlyfSBzZWNyZXQgLSBzZWNyZXQgYnl0ZXMgb3IgYSBrZXlwYWlyXG4qIEByZXR1cm5zIHtTaWduYXR1cmV9IC0gc2lnbmF0dXJlXG4qL1xuRUREU0EucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduKG1lc3NhZ2UsIHNlY3JldCkge1xuICBtZXNzYWdlID0gcGFyc2VCeXRlcyhtZXNzYWdlKTtcbiAgdmFyIGtleSA9IHRoaXMua2V5RnJvbVNlY3JldChzZWNyZXQpO1xuICB2YXIgciA9IHRoaXMuaGFzaEludChrZXkubWVzc2FnZVByZWZpeCgpLCBtZXNzYWdlKTtcbiAgdmFyIFIgPSB0aGlzLmcubXVsKHIpO1xuICB2YXIgUmVuY29kZWQgPSB0aGlzLmVuY29kZVBvaW50KFIpO1xuICB2YXIgc18gPSB0aGlzLmhhc2hJbnQoUmVuY29kZWQsIGtleS5wdWJCeXRlcygpLCBtZXNzYWdlKVxuICAgIC5tdWwoa2V5LnByaXYoKSk7XG4gIHZhciBTID0gci5hZGQoc18pLnVtb2QodGhpcy5jdXJ2ZS5uKTtcbiAgcmV0dXJuIHRoaXMubWFrZVNpZ25hdHVyZSh7IFI6IFIsIFM6IFMsIFJlbmNvZGVkOiBSZW5jb2RlZCB9KTtcbn07XG5cbi8qKlxuKiBAcGFyYW0ge0FycmF5fSBtZXNzYWdlIC0gbWVzc2FnZSBieXRlc1xuKiBAcGFyYW0ge0FycmF5fFN0cmluZ3xTaWduYXR1cmV9IHNpZyAtIHNpZyBieXRlc1xuKiBAcGFyYW0ge0FycmF5fFN0cmluZ3xQb2ludHxLZXlQYWlyfSBwdWIgLSBwdWJsaWMga2V5XG4qIEByZXR1cm5zIHtCb29sZWFufSAtIHRydWUgaWYgcHVibGljIGtleSBtYXRjaGVzIHNpZyBvZiBtZXNzYWdlXG4qL1xuRUREU0EucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtZXNzYWdlLCBzaWcsIHB1Yikge1xuICBtZXNzYWdlID0gcGFyc2VCeXRlcyhtZXNzYWdlKTtcbiAgc2lnID0gdGhpcy5tYWtlU2lnbmF0dXJlKHNpZyk7XG4gIGlmIChzaWcuUygpLmd0ZShzaWcuZWRkc2EuY3VydmUubikgfHwgc2lnLlMoKS5pc05lZygpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBrZXkgPSB0aGlzLmtleUZyb21QdWJsaWMocHViKTtcbiAgdmFyIGggPSB0aGlzLmhhc2hJbnQoc2lnLlJlbmNvZGVkKCksIGtleS5wdWJCeXRlcygpLCBtZXNzYWdlKTtcbiAgdmFyIFNHID0gdGhpcy5nLm11bChzaWcuUygpKTtcbiAgdmFyIFJwbHVzQWggPSBzaWcuUigpLmFkZChrZXkucHViKCkubXVsKGgpKTtcbiAgcmV0dXJuIFJwbHVzQWguZXEoU0cpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmhhc2hJbnQgPSBmdW5jdGlvbiBoYXNoSW50KCkge1xuICB2YXIgaGFzaCA9IHRoaXMuaGFzaCgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICBoYXNoLnVwZGF0ZShhcmd1bWVudHNbaV0pO1xuICByZXR1cm4gdXRpbHMuaW50RnJvbUxFKGhhc2guZGlnZXN0KCkpLnVtb2QodGhpcy5jdXJ2ZS5uKTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5rZXlGcm9tUHVibGljID0gZnVuY3Rpb24ga2V5RnJvbVB1YmxpYyhwdWIpIHtcbiAgcmV0dXJuIEtleVBhaXIuZnJvbVB1YmxpYyh0aGlzLCBwdWIpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmtleUZyb21TZWNyZXQgPSBmdW5jdGlvbiBrZXlGcm9tU2VjcmV0KHNlY3JldCkge1xuICByZXR1cm4gS2V5UGFpci5mcm9tU2VjcmV0KHRoaXMsIHNlY3JldCk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUubWFrZVNpZ25hdHVyZSA9IGZ1bmN0aW9uIG1ha2VTaWduYXR1cmUoc2lnKSB7XG4gIGlmIChzaWcgaW5zdGFuY2VvZiBTaWduYXR1cmUpXG4gICAgcmV0dXJuIHNpZztcbiAgcmV0dXJuIG5ldyBTaWduYXR1cmUodGhpcywgc2lnKTtcbn07XG5cbi8qKlxuKiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1qb3NlZnNzb24tZWRkc2EtZWQyNTUxOS0wMyNzZWN0aW9uLTUuMlxuKlxuKiBFRERTQSBkZWZpbmVzIG1ldGhvZHMgZm9yIGVuY29kaW5nIGFuZCBkZWNvZGluZyBwb2ludHMgYW5kIGludGVnZXJzLiBUaGVzZSBhcmVcbiogaGVscGVyIGNvbnZlbmllbmNlIG1ldGhvZHMsIHRoYXQgcGFzcyBhbG9uZyB0byB1dGlsaXR5IGZ1bmN0aW9ucyBpbXBsaWVkXG4qIHBhcmFtZXRlcnMuXG4qXG4qL1xuRUREU0EucHJvdG90eXBlLmVuY29kZVBvaW50ID0gZnVuY3Rpb24gZW5jb2RlUG9pbnQocG9pbnQpIHtcbiAgdmFyIGVuYyA9IHBvaW50LmdldFkoKS50b0FycmF5KCdsZScsIHRoaXMuZW5jb2RpbmdMZW5ndGgpO1xuICBlbmNbdGhpcy5lbmNvZGluZ0xlbmd0aCAtIDFdIHw9IHBvaW50LmdldFgoKS5pc09kZCgpID8gMHg4MCA6IDA7XG4gIHJldHVybiBlbmM7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuZGVjb2RlUG9pbnQgPSBmdW5jdGlvbiBkZWNvZGVQb2ludChieXRlcykge1xuICBieXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXMoYnl0ZXMpO1xuXG4gIHZhciBsYXN0SXggPSBieXRlcy5sZW5ndGggLSAxO1xuICB2YXIgbm9ybWVkID0gYnl0ZXMuc2xpY2UoMCwgbGFzdEl4KS5jb25jYXQoYnl0ZXNbbGFzdEl4XSAmIH4weDgwKTtcbiAgdmFyIHhJc09kZCA9IChieXRlc1tsYXN0SXhdICYgMHg4MCkgIT09IDA7XG5cbiAgdmFyIHkgPSB1dGlscy5pbnRGcm9tTEUobm9ybWVkKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnRGcm9tWSh5LCB4SXNPZGQpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmVuY29kZUludCA9IGZ1bmN0aW9uIGVuY29kZUludChudW0pIHtcbiAgcmV0dXJuIG51bS50b0FycmF5KCdsZScsIHRoaXMuZW5jb2RpbmdMZW5ndGgpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmRlY29kZUludCA9IGZ1bmN0aW9uIGRlY29kZUludChieXRlcykge1xuICByZXR1cm4gdXRpbHMuaW50RnJvbUxFKGJ5dGVzKTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5pc1BvaW50ID0gZnVuY3Rpb24gaXNQb2ludCh2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIHRoaXMucG9pbnRDbGFzcztcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGVsbGlwdGljID0gZXhwb3J0cztcblxuZWxsaXB0aWMudmVyc2lvbiA9IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpLnZlcnNpb247XG5lbGxpcHRpYy51dGlscyA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvdXRpbHMnKTtcbmVsbGlwdGljLnJhbmQgPSByZXF1aXJlKCdicm9yYW5kJyk7XG5lbGxpcHRpYy5jdXJ2ZSA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvY3VydmUnKTtcbmVsbGlwdGljLmN1cnZlcyA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvY3VydmVzJyk7XG5cbi8vIFByb3RvY29sc1xuZWxsaXB0aWMuZWMgPSByZXF1aXJlKCcuL2VsbGlwdGljL2VjJyk7XG5lbGxpcHRpYy5lZGRzYSA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvZWRkc2EnKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdhc24xLmpzJykuYmlnbnVtLFxuXHRCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiYXNlNjRUb0JpZ051bSh2YWwsIHplcm8pIHtcblx0dmFyIGJ1ZiA9IEJ1ZmZlci5mcm9tKHZhbCwgJ2Jhc2U2NCcpO1xuXHR2YXIgYm4gPSB2YWwgPSBuZXcgQk4oYnVmLCAxMCwgJ2JlJykuaWFicygpO1xuXHRpZiAoemVybykge1xuXHRcdGJ1Zi5maWxsKDApO1xuXHR9XG5cdHJldHVybiBibjtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdhc24xLmpzJykuZGVmaW5lKCdBbGdvcml0aG1JZGVudGlmZXInLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5zZXEoKS5vYmooXG5cdFx0dGhpcy5rZXkoJ2FsZ29yaXRobScpLm9iamlkKCksXG5cdFx0dGhpcy5rZXkoJ3BhcmFtZXRlcnMnKS5vcHRpb25hbCgpLmFueSgpXG5cdCk7XG59KTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQWxnb3JpdGhtSWRlbnRpZmllciA9IHJlcXVpcmUoJy4vYWxnb3JpdGhtLWlkZW50aWZpZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdhc24xLmpzJykuZGVmaW5lKCdQdWJsaWNLZXlJbmZvJywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCdhbGdvcml0aG0nKS51c2UoQWxnb3JpdGhtSWRlbnRpZmllciksXG5cdFx0dGhpcy5rZXkoJ1B1YmxpY0tleScpLmJpdHN0cigpXG5cdCk7XG59KTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2FzbjEuanMnKS5kZWZpbmUoJ1ZlcnNpb24nLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5pbnQoKTtcbn0pO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBBbGdvcml0aG1JZGVudGlmaWVyID0gcmVxdWlyZSgnLi9hbGdvcml0aG0taWRlbnRpZmllcicpO1xudmFyIFZlcnNpb24gPSByZXF1aXJlKCcuL3ZlcnNpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdhc24xLmpzJykuZGVmaW5lKCdQcml2YXRlS2V5SW5mbycsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLnNlcSgpLm9iaihcblx0XHR0aGlzLmtleSgndmVyc2lvbicpLnVzZShWZXJzaW9uKSxcblx0XHR0aGlzLmtleSgncHJpdmF0ZUtleUFsZ29yaXRobScpLnVzZShBbGdvcml0aG1JZGVudGlmaWVyKSxcblx0XHR0aGlzLmtleSgncHJpdmF0ZUtleScpLm9jdHN0cigpLFxuXHRcdHRoaXMua2V5KCdhdHRyaWJ1dGVzJykub3B0aW9uYWwoKS5hbnkoKVxuXHQpO1xufSk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGFzbjEgPSByZXF1aXJlKCdhc24xLmpzJyksXG5cdEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyLFxuXHRFQyA9IHJlcXVpcmUoJ2VsbGlwdGljJykuZWM7XG5cbnZhciBiNjRUb0JuID0gcmVxdWlyZSgnLi9iNjQtdG8tYm4nKTtcblxudmFyIFB1YmxpY0tleUluZm8gPSByZXF1aXJlKCcuL2FzbjEvcHVibGljLWtleS1pbmZvJyksXG5cdFByaXZhdGVLZXlJbmZvID0gcmVxdWlyZSgnLi9hc24xL3ByaXZhdGUta2V5LWluZm8nKSxcblx0VmVyc2lvbiA9IHJlcXVpcmUoJy4vYXNuMS92ZXJzaW9uJyk7XG5cbnZhciBFQ1BhcmFtZXRlcnMgPSBhc24xLmRlZmluZSgnRUNQYXJhbWV0ZXJzJywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuY2hvaWNlKHtcblx0XHRuYW1lZEN1cnZlOiB0aGlzLm9iamlkKClcblx0fSk7XG59KTtcblxudmFyIGVjUHJpdmtleVZlcjEgPSAxO1xuXG52YXIgRUNQcml2YXRlS2V5ID0gYXNuMS5kZWZpbmUoJ0VDUHJpdmF0ZUtleScsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLnNlcSgpLm9iaihcblx0XHR0aGlzLmtleSgndmVyc2lvbicpLnVzZShWZXJzaW9uKSxcblx0XHR0aGlzLmtleSgncHJpdmF0ZUtleScpLm9jdHN0cigpLFxuXHRcdHRoaXMua2V5KCdwYXJhbWV0ZXJzJykuZXhwbGljaXQoMCkub3B0aW9uYWwoKS5hbnkoKSxcblx0XHR0aGlzLmtleSgncHVibGljS2V5JykuZXhwbGljaXQoMSkub3B0aW9uYWwoKS5iaXRzdHIoKVxuXHQpO1xufSk7XG5cbnZhciBjdXJ2ZXMgPSB7XG5cdCdQLTI1Nic6ICdwMjU2Jyxcblx0J1AtMzg0JzogJ3AzODQnLFxuXHQnUC01MjEnOiAncDUyMSdcbn07XG5cbnZhciBvaWRzID0ge1xuXHQnUC0yNTYnOiBbMSwgMiwgODQwLCAxMDA0NSwgMywgMSwgN10sXG5cdCdQLTM4NCc6IFsxLCAzLCAxMzIsIDAsIDM0XSxcblx0J1AtNTIxJzogWzEsIDMsIDEzMiwgMCwgMzVdXG59O1xudmFyIHBhcmFtZXRlcnMgPSB7fTtcbnZhciBhbGdvcml0aG1zID0ge307XG5PYmplY3Qua2V5cyhvaWRzKS5mb3JFYWNoKGZ1bmN0aW9uKGNydikge1xuXHRwYXJhbWV0ZXJzW2Nydl0gPSBFQ1BhcmFtZXRlcnMuZW5jb2RlKHtcblx0XHR0eXBlOiAnbmFtZWRDdXJ2ZScsXG5cdFx0dmFsdWU6IG9pZHNbY3J2XVxuXHR9LCAnZGVyJyk7XG5cdGFsZ29yaXRobXNbY3J2XSA9IHtcblx0XHRhbGdvcml0aG06ICBbMSwgMiwgODQwLCAxMDA0NSwgMiwgMV0sXG5cdFx0cGFyYW1ldGVyczogcGFyYW1ldGVyc1tjcnZdXG5cdH07XG59KTtcbm9pZHMgPSBudWxsO1xuXG5mdW5jdGlvbiBlY0p3a1RvQnVmZmVyKGp3aywgb3B0cykge1xuXHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2suY3J2KSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2suY3J2XCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdHZhciBoYXNEID0gJ3N0cmluZycgPT09IHR5cGVvZiBqd2suZDtcblx0dmFyIHh5VHlwZXMgPSBoYXNEXG5cdFx0PyBbJ3VuZGVmaW5lZCcsICdzdHJpbmcnXVxuXHRcdDogWydzdHJpbmcnXTtcblxuXHRpZiAoLTEgPT09IHh5VHlwZXMuaW5kZXhPZih0eXBlb2YgandrLngpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sueFwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHRpZiAoLTEgPT09IHh5VHlwZXMuaW5kZXhPZih0eXBlb2YgandrLnkpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sueVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHRpZiAob3B0cy5wcml2YXRlICYmICFoYXNEKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2suZFwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHR2YXIgY3VydmVOYW1lID0gY3VydmVzW2p3ay5jcnZdO1xuXHRpZiAoIWN1cnZlTmFtZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY3VydmUgXCInICsgandrLmNydiArICdcIicpO1xuXHR9XG5cblx0dmFyIGN1cnZlID0gbmV3IEVDKGN1cnZlTmFtZSk7XG5cblx0dmFyIGtleSA9IHt9O1xuXG5cdHZhciBoYXNQdWIgPSBqd2sueCAmJiBqd2sueTtcblx0aWYgKGhhc1B1Yikge1xuXHRcdGtleS5wdWIgPSB7XG5cdFx0XHR4OiBiNjRUb0JuKGp3ay54LCBmYWxzZSksXG5cdFx0XHR5OiBiNjRUb0JuKGp3ay55LCBmYWxzZSlcblx0XHR9O1xuXHR9XG5cblx0aWYgKG9wdHMucHJpdmF0ZSB8fCAhaGFzUHViKSB7XG5cdFx0a2V5LnByaXYgPSBiNjRUb0JuKGp3ay5kLCB0cnVlKTtcblx0fVxuXG5cdGtleSA9IGN1cnZlLmtleVBhaXIoa2V5KTtcblxuXHR2YXIga2V5VmFsaWRhdGlvbiA9IGtleS52YWxpZGF0ZSgpO1xuXHRpZiAoIWtleVZhbGlkYXRpb24ucmVzdWx0KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleSBmb3IgY3VydmU6IFwiJyArIGtleVZhbGlkYXRpb24ucmVhc29uICsgJ1wiJyk7XG5cdH1cblxuXHR2YXIgcmVzdWx0ID0ga2V5VG9QZW0oandrLmNydiwga2V5LCBvcHRzKTtcblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBrZXlUb1BlbShjcnYsIGtleSwgb3B0cykge1xuXHR2YXIgY29tcGFjdCA9IGZhbHNlO1xuXHR2YXIgcHVibGljS2V5ID0ga2V5LmdldFB1YmxpYyhjb21wYWN0LCAnaGV4Jyk7XG5cdHB1YmxpY0tleSA9IEJ1ZmZlci5mcm9tKHB1YmxpY0tleSwgJ2hleCcpO1xuXHRwdWJsaWNLZXkgPSB7XG5cdFx0dW51c2VkOiAwLFxuXHRcdGRhdGE6IHB1YmxpY0tleVxuXHR9O1xuXG5cdHZhciByZXN1bHQ7XG5cdGlmIChvcHRzLnByaXZhdGUpIHtcblx0XHR2YXIgcHJpdmF0ZUtleSA9IGtleS5nZXRQcml2YXRlKCdoZXgnKTtcblx0XHRwcml2YXRlS2V5ID0gQnVmZmVyLmZyb20ocHJpdmF0ZUtleSwgJ2hleCcpO1xuXG5cdFx0cmVzdWx0ID0gUHJpdmF0ZUtleUluZm8uZW5jb2RlKHtcblx0XHRcdHZlcnNpb246IDAsXG5cdFx0XHRwcml2YXRlS2V5QWxnb3JpdGhtOiBhbGdvcml0aG1zW2Nydl0sXG5cdFx0XHRwcml2YXRlS2V5OiBFQ1ByaXZhdGVLZXkuZW5jb2RlKHtcblx0XHRcdFx0dmVyc2lvbjogZWNQcml2a2V5VmVyMSxcblx0XHRcdFx0cHJpdmF0ZUtleTogcHJpdmF0ZUtleSxcblx0XHRcdFx0cGFyYW1ldGVyczogcGFyYW1ldGVyc1tjcnZdLFxuXHRcdFx0XHRwdWJsaWNLZXk6IHB1YmxpY0tleVxuXHRcdFx0fSwgJ2RlcicpXG5cdFx0fSwgJ3BlbScsIHtcblx0XHRcdGxhYmVsOiAnUFJJVkFURSBLRVknXG5cdFx0fSk7XG5cblx0XHRwcml2YXRlS2V5LmZpbGwoMCk7XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gUHVibGljS2V5SW5mby5lbmNvZGUoe1xuXHRcdFx0YWxnb3JpdGhtOiBhbGdvcml0aG1zW2Nydl0sXG5cdFx0XHRQdWJsaWNLZXk6IHB1YmxpY0tleVxuXHRcdH0sICdwZW0nLCB7XG5cdFx0XHRsYWJlbDogJ1BVQkxJQyBLRVknXG5cdFx0fSk7XG5cdH1cblxuXHQvLyBUaGlzIGlzIGluIGFuIGlmIGluY2FzZSBhc24xLmpzIGFkZHMgYSB0cmFpbGluZyBcXG5cblx0Ly8gaXN0YW5idWwgaWdub3JlIGVsc2Vcblx0aWYgKCdcXG4nICE9PSByZXN1bHQuc2xpY2UoLTEpKSB7XG5cdFx0cmVzdWx0ICs9ICdcXG4nO1xuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlY0p3a1RvQnVmZmVyO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBhc24xID0gcmVxdWlyZSgnYXNuMS5qcycpO1xuXG52YXIgYjY0VG9CbiA9IHJlcXVpcmUoJy4vYjY0LXRvLWJuJyk7XG5cbnZhciBQdWJsaWNLZXlJbmZvID0gcmVxdWlyZSgnLi9hc24xL3B1YmxpYy1rZXktaW5mbycpLFxuXHRQcml2YXRlS2V5SW5mbyA9IHJlcXVpcmUoJy4vYXNuMS9wcml2YXRlLWtleS1pbmZvJyksXG5cdFZlcnNpb24gPSByZXF1aXJlKCcuL2FzbjEvdmVyc2lvbicpO1xuXG52YXIgUlNBUHJpdmF0ZUtleSA9IGFzbjEuZGVmaW5lKCdSU0FQcml2YXRlS2V5JywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCd2ZXJzaW9uJykudXNlKFZlcnNpb24pLFxuXHRcdHRoaXMua2V5KCdtb2R1bHVzJykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ3B1YmxpY0V4cG9uZW50JykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ3ByaXZhdGVFeHBvbmVudCcpLmludCgpLFxuXHRcdHRoaXMua2V5KCdwcmltZTEnKS5pbnQoKSxcblx0XHR0aGlzLmtleSgncHJpbWUyJykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ2V4cG9uZW50MScpLmludCgpLFxuXHRcdHRoaXMua2V5KCdleHBvbmVudDInKS5pbnQoKSxcblx0XHR0aGlzLmtleSgnY29lZmZpY2llbnQnKS5pbnQoKVxuXHQpO1xufSk7XG5cbnZhciBSU0FQdWJsaWNLZXkgPSBhc24xLmRlZmluZSgnUlNBUHVibGljS2V5JywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCdtb2R1bHVzJykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ3B1YmxpY0V4cG9uZW50JykuaW50KClcblx0KTtcbn0pO1xuXG52YXIgYWxnb3JpdGhtID0ge1xuXHRhbGdvcml0aG06IFsxLCAyLCA4NDAsIDExMzU0OSwgMSwgMSwgMV0sXG5cdHBhcmFtZXRlcnM6IFs1LCAwXVxufTtcblxuZnVuY3Rpb24gcnNhSndrVG9CdWZmZXIoandrLCBvcHRzKSB7XG5cdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5lKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2suZVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2subikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLm5cIiB0byBiZSBhIFN0cmluZycpO1xuXHR9XG5cblx0aWYgKG9wdHMucHJpdmF0ZSkge1xuXHRcdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5kKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5kXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cblx0XHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2sucCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sucFwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLnEpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLnFcIiB0byBiZSBhIFN0cmluZycpO1xuXHRcdH1cblxuXHRcdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5kcCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2suZHBcIiB0byBiZSBhIFN0cmluZycpO1xuXHRcdH1cblxuXHRcdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5kcSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2suZHFcIiB0byBiZSBhIFN0cmluZycpO1xuXHRcdH1cblxuXHRcdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5xaSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sucWlcIiB0byBiZSBhIFN0cmluZycpO1xuXHRcdH1cblx0fVxuXG5cdHZhciBwZW07XG5cdGlmIChvcHRzLnByaXZhdGUpIHtcblx0XHRwZW0gPSBQcml2YXRlS2V5SW5mby5lbmNvZGUoe1xuXHRcdFx0dmVyc2lvbjogMCxcblx0XHRcdHByaXZhdGVLZXlBbGdvcml0aG06IGFsZ29yaXRobSxcblx0XHRcdHByaXZhdGVLZXk6IFJTQVByaXZhdGVLZXkuZW5jb2RlKHtcblx0XHRcdFx0dmVyc2lvbjogMCxcblx0XHRcdFx0bW9kdWx1czogYjY0VG9Cbihqd2subiwgZmFsc2UpLFxuXHRcdFx0XHRwdWJsaWNFeHBvbmVudDogYjY0VG9Cbihqd2suZSwgZmFsc2UpLFxuXHRcdFx0XHRwcml2YXRlRXhwb25lbnQ6IGI2NFRvQm4oandrLmQsIHRydWUpLFxuXHRcdFx0XHRwcmltZTE6IGI2NFRvQm4oandrLnAsIHRydWUpLFxuXHRcdFx0XHRwcmltZTI6IGI2NFRvQm4oandrLnEsIHRydWUpLFxuXHRcdFx0XHRleHBvbmVudDE6IGI2NFRvQm4oandrLmRwLCB0cnVlKSxcblx0XHRcdFx0ZXhwb25lbnQyOiBiNjRUb0JuKGp3ay5kcSwgdHJ1ZSksXG5cdFx0XHRcdGNvZWZmaWNpZW50OiBiNjRUb0JuKGp3ay5xaSwgdHJ1ZSlcblx0XHRcdH0sICdkZXInKVxuXHRcdH0sICdwZW0nLCB7XG5cdFx0XHRsYWJlbDogJ1BSSVZBVEUgS0VZJ1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHBlbSA9IFB1YmxpY0tleUluZm8uZW5jb2RlKHtcblx0XHRcdGFsZ29yaXRobTogYWxnb3JpdGhtLFxuXHRcdFx0UHVibGljS2V5OiB7XG5cdFx0XHRcdHVudXNlZDogMCxcblx0XHRcdFx0ZGF0YTogUlNBUHVibGljS2V5LmVuY29kZSh7XG5cdFx0XHRcdFx0bW9kdWx1czogYjY0VG9Cbihqd2subiwgZmFsc2UpLFxuXHRcdFx0XHRcdHB1YmxpY0V4cG9uZW50OiBiNjRUb0JuKGp3ay5lLCBmYWxzZSlcblx0XHRcdFx0fSwgJ2RlcicpXG5cdFx0XHR9XG5cdFx0fSwgJ3BlbScsIHtcblx0XHRcdGxhYmVsOiAnUFVCTElDIEtFWSdcblx0XHR9KTtcblx0fVxuXG5cdC8vIFRoaXMgaXMgaW4gYW4gaWYgaW5jYXNlIGFzbjEuanMgYWRkcyBhIHRyYWlsaW5nIFxcblxuXHQvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuXHRpZiAoJ1xcbicgIT09IHBlbS5zbGljZSgtMSkpIHtcblx0XHRwZW0gKz0gJ1xcbic7XG5cdH1cblxuXHRyZXR1cm4gcGVtO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJzYUp3a1RvQnVmZmVyO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBlYyA9IHJlcXVpcmUoJy4vZWMnKSxcblx0cnNhID0gcmVxdWlyZSgnLi9yc2EnKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHt7a3R5OidFQycsIGNydjpzdHJpbmcsIGQ6c3RyaW5nLCB4PzpzdHJpbmcsIHk/OnN0cmluZ30gfCB7a3R5OidFQycsIGNydjpzdHJpbmcsIHg6c3RyaW5nLCB5OnN0cmluZ30gfCB7a3R5OidSU0EnLCBlOnN0cmluZywgbjpzdHJpbmcsIGQ/OnN0cmluZywgcD86c3RyaW5nLCBxPzpzdHJpbmcsIGRwPzpzdHJpbmcsIGRxPzpzdHJpbmcsIHFpPzpzdHJpbmd9fSBqd2tcbiAqIEBwYXJhbSB7e3ByaXZhdGU6Ym9vbGVhbn09fSBvcHRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBqd2tUb0J1ZmZlcihqd2ssIG9wdHMpIHtcblx0aWYgKCdvYmplY3QnICE9PSB0eXBlb2YgandrIHx8IG51bGwgPT09IGp3aykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrXCIgdG8gYmUgYW4gT2JqZWN0Jyk7XG5cdH1cblxuXHR2YXIga3R5ID0gandrLmt0eTtcblx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2Yga3R5KSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sua3R5XCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdG9wdHMgPSBvcHRzIHx8IHt9O1xuXHRvcHRzLnByaXZhdGUgPSBvcHRzLnByaXZhdGUgPT09IHRydWU7XG5cblx0c3dpdGNoIChrdHkpIHtcblx0XHRjYXNlICdFQyc6IHtcblx0XHRcdHJldHVybiBlYyhqd2ssIG9wdHMpO1xuXHRcdH1cblx0XHRjYXNlICdSU0EnOiB7XG5cdFx0XHRyZXR1cm4gcnNhKGp3aywgb3B0cyk7XG5cdFx0fVxuXHRcdGRlZmF1bHQ6IHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQga2V5IHR5cGUgXCInICsga3R5ICsgJ1wiJyk7XG5cdFx0fVxuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gandrVG9CdWZmZXI7XG4iLAogICAgIlxuZXhwb3J0IGZ1bmN0aW9uIGdldENvb2tpZXMoaGVhZGVyczogSGVhZGVycykge1xuICBpZiAoIWhlYWRlcnMpIHJldHVybiB7fTtcbiAgY29uc3QgY29va2llSGVhZGVyID0gaGVhZGVycy5nZXQoXCJDb29raWVcIik7XG4gIGNvbnN0IGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBpZiAoY29va2llSGVhZGVyID09PSBudWxsKSByZXR1cm4ge307XG5cbiAgZm9yIChjb25zdCBrdiBvZiBjb29raWVIZWFkZXIuc3BsaXQoXCI7XCIpKSB7XG4gICAgY29uc3QgW2Nvb2tpZUtleSwgLi4uY29va2llVmFsXSA9IGt2LnNwbGl0KFwiPVwiKTtcbiAgICBjb25zdCBrZXkgPSBjb29raWVLZXkudHJpbSgpO1xuICAgIGNvb2tpZXNba2V5XSA9IGNvb2tpZVZhbC5qb2luKFwiPVwiKTtcbiAgfVxuXG4gIHJldHVybiBjb29raWVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29va2llKHJlc3BvbnNlOiBSZXNwb25zZSwga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG1heEFnZT86IG51bWJlcikge1xuICByZXNwb25zZS5oZWFkZXJzLmFwcGVuZCgnU2V0LUNvb2tpZScsIGAke2tleX09JHt2YWx1ZX0ke21heEFnZSA/ICc7IFBhdGg9LzsgTWF4LUFnZT0nICsgbWF4QWdlIDogJyd9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDb29raWUocmVzcG9uc2U6IFJlc3BvbnNlLCBrZXk6IHN0cmluZykge1xuICByZXNwb25zZS5oZWFkZXJzLmFwcGVuZCgnU2V0LUNvb2tpZScsIGAke2tleX09XCJcIjsgUGF0aD0vOyBNYXgtQWdlPS0xO2ApO1xufSIsCiAgICAiLy8jcmVnaW9uIHNyYy9lc2kvb3B0aW9ucy50c1xuY29uc3QgQ0xJRU5UX0lEID0gcHJvY2Vzcy5lbnYuRVZFX0NMSUVOVF9JRCB8fCBcIlwiO1xuY29uc3QgQ0xJRU5UX1NFQ1JFVCA9IHByb2Nlc3MuZW52LkVWRV9DTElFTlRfU0VDUkVUIHx8IFwiXCI7XG5jb25zdCBDQUxMQkFDS19VUkwgPSBwcm9jZXNzLmVudi5FVkVfQ0FMTEJBQ0tfVVJMIHx8IFwiXCI7XG5jb25zdCBVU0VSX0FHRU5UID0gcHJvY2Vzcy5lbnYuRVNJX1VTRVJfQUdFTlQgfHwgXCJcIjtcbmNvbnN0IG9wdGlvbnMgPSB7XG5cdGNsaWVudF9pZDogQ0xJRU5UX0lELFxuXHRjbGllbnRfc2VjcmV0OiBDTElFTlRfU0VDUkVULFxuXHRjYWxsYmFja191cmw6IENBTExCQUNLX1VSTCxcblx0dXNlcl9hZ2VudDogVVNFUl9BR0VOVFxufTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBvcHRpb25zIH07IiwKICAgICIvLyNyZWdpb24gcm9sbGRvd246cnVudGltZVxudmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2V4cG9ydCA9ICh0YXJnZXQsIGFsbCkgPT4ge1xuXHRmb3IgKHZhciBuYW1lIGluIGFsbCkgX19kZWZQcm9wKHRhcmdldCwgbmFtZSwge1xuXHRcdGdldDogYWxsW25hbWVdLFxuXHRcdGVudW1lcmFibGU6IHRydWVcblx0fSk7XG59O1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IF9fZXhwb3J0IH07IiwKICAgICJleHBvcnQgY2xhc3MgSW52YWxpZFRva2VuRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG5JbnZhbGlkVG9rZW5FcnJvci5wcm90b3R5cGUubmFtZSA9IFwiSW52YWxpZFRva2VuRXJyb3JcIjtcbmZ1bmN0aW9uIGI2NERlY29kZVVuaWNvZGUoc3RyKSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChhdG9iKHN0cikucmVwbGFjZSgvKC4pL2csIChtLCBwKSA9PiB7XG4gICAgICAgIGxldCBjb2RlID0gcC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBpZiAoY29kZS5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICBjb2RlID0gXCIwXCIgKyBjb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIiVcIiArIGNvZGU7XG4gICAgfSkpO1xufVxuZnVuY3Rpb24gYmFzZTY0VXJsRGVjb2RlKHN0cikge1xuICAgIGxldCBvdXRwdXQgPSBzdHIucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIik7XG4gICAgc3dpdGNoIChvdXRwdXQubGVuZ3RoICUgNCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgb3V0cHV0ICs9IFwiPT1cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBvdXRwdXQgKz0gXCI9XCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImJhc2U2NCBzdHJpbmcgaXMgbm90IG9mIHRoZSBjb3JyZWN0IGxlbmd0aFwiKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGI2NERlY29kZVVuaWNvZGUob3V0cHV0KTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gYXRvYihvdXRwdXQpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBqd3REZWNvZGUodG9rZW4sIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHRva2VuICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FcnJvcihcIkludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBtdXN0IGJlIGEgc3RyaW5nXCIpO1xuICAgIH1cbiAgICBvcHRpb25zIHx8IChvcHRpb25zID0ge30pO1xuICAgIGNvbnN0IHBvcyA9IG9wdGlvbnMuaGVhZGVyID09PSB0cnVlID8gMCA6IDE7XG4gICAgY29uc3QgcGFydCA9IHRva2VuLnNwbGl0KFwiLlwiKVtwb3NdO1xuICAgIGlmICh0eXBlb2YgcGFydCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBtaXNzaW5nIHBhcnQgIyR7cG9zICsgMX1gKTtcbiAgICB9XG4gICAgbGV0IGRlY29kZWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgZGVjb2RlZCA9IGJhc2U2NFVybERlY29kZShwYXJ0KTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbkVycm9yKGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogaW52YWxpZCBiYXNlNjQgZm9yIHBhcnQgIyR7cG9zICsgMX0gKCR7ZS5tZXNzYWdlfSlgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FcnJvcihgSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IGludmFsaWQganNvbiBmb3IgcGFydCAjJHtwb3MgKyAxfSAoJHtlLm1lc3NhZ2V9KWApO1xuICAgIH1cbn1cbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMlVwcGVyQ2FzZShieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJfaW50ZXJuYWwoYnl0ZXMsIGJhc2UzMlVwcGVyQ2FzZUFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTMyVXBwZXJDYXNlTm9QYWRkaW5nKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2UzMl9pbnRlcm5hbChieXRlcywgYmFzZTMyVXBwZXJDYXNlQWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5Ob25lKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlMzJMb3dlckNhc2UoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTMyX2ludGVybmFsKGJ5dGVzLCBiYXNlMzJMb3dlckNhc2VBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLkluY2x1ZGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMkxvd2VyQ2FzZU5vUGFkZGluZyhieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJfaW50ZXJuYWwoYnl0ZXMsIGJhc2UzMkxvd2VyQ2FzZUFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuTm9uZSk7XG59XG4vKiogUmVwbGFjZWQ6IFVzZSBlbmNvZGVCYXNlMzJVcHBlckNhc2UoKSBpbnN0ZWFkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMihieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJVcHBlckNhc2UoYnl0ZXMpO1xufVxuLyoqIFJlcGxhY2VkOiBVc2UgZW5jb2RlQmFzZTMyVXBwZXJDYXNlTm9QYWRkaW5nKCkgaW5zdGVhZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlMzJOb1BhZGRpbmcoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTMyVXBwZXJDYXNlTm9QYWRkaW5nKGJ5dGVzKTtcbn1cbmZ1bmN0aW9uIGVuY29kZUJhc2UzMl9pbnRlcm5hbChieXRlcywgYWxwaGFiZXQsIHBhZGRpbmcpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmJ5dGVMZW5ndGg7IGkgKz0gNSkge1xuICAgICAgICBsZXQgYnVmZmVyID0gMG47XG4gICAgICAgIGxldCBidWZmZXJCaXRTaXplID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA1ICYmIGkgKyBqIDwgYnl0ZXMuYnl0ZUxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBidWZmZXIgPSAoYnVmZmVyIDw8IDhuKSB8IEJpZ0ludChieXRlc1tpICsgal0pO1xuICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChidWZmZXJCaXRTaXplICUgNSAhPT0gMCkge1xuICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyIDw8IEJpZ0ludCg1IC0gKGJ1ZmZlckJpdFNpemUgJSA1KSk7XG4gICAgICAgICAgICBidWZmZXJCaXRTaXplICs9IDUgLSAoYnVmZmVyQml0U2l6ZSAlIDUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgODsgaisrKSB7XG4gICAgICAgICAgICBpZiAoYnVmZmVyQml0U2l6ZSA+PSA1KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFscGhhYmV0W051bWJlcigoYnVmZmVyID4+IEJpZ0ludChidWZmZXJCaXRTaXplIC0gNSkpICYgMHgxZm4pXTtcbiAgICAgICAgICAgICAgICBidWZmZXJCaXRTaXplIC09IDU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChidWZmZXJCaXRTaXplID4gMCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhbHBoYWJldFtOdW1iZXIoKGJ1ZmZlciA8PCBCaWdJbnQoNiAtIGJ1ZmZlckJpdFNpemUpKSAmIDB4M2ZuKV07XG4gICAgICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYWRkaW5nID09PSBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIj1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2UzMihlbmNvZGVkKSB7XG4gICAgcmV0dXJuIGRlY29kZUJhc2UzMl9pbnRlcm5hbChlbmNvZGVkLCBiYXNlMzJEZWNvZGVNYXAsIERlY29kaW5nUGFkZGluZy5SZXF1aXJlZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTMySWdub3JlUGFkZGluZyhlbmNvZGVkKSB7XG4gICAgcmV0dXJuIGRlY29kZUJhc2UzMl9pbnRlcm5hbChlbmNvZGVkLCBiYXNlMzJEZWNvZGVNYXAsIERlY29kaW5nUGFkZGluZy5JZ25vcmUpO1xufVxuZnVuY3Rpb24gZGVjb2RlQmFzZTMyX2ludGVybmFsKGVuY29kZWQsIGRlY29kZU1hcCwgcGFkZGluZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KE1hdGguY2VpbChlbmNvZGVkLmxlbmd0aCAvIDgpICogNSk7XG4gICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RlZC5sZW5ndGg7IGkgKz0gOCkge1xuICAgICAgICBsZXQgY2h1bmsgPSAwbjtcbiAgICAgICAgbGV0IGJpdHNSZWFkID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA4OyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYWRkaW5nID09PSBEZWNvZGluZ1BhZGRpbmcuUmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW5jb2RlZFtpICsgal0gPT09IFwiPVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSArIGogPj0gZW5jb2RlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWRkaW5nID09PSBEZWNvZGluZ1BhZGRpbmcuSWdub3JlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgKyBqID49IGVuY29kZWQubGVuZ3RoIHx8IGVuY29kZWRbaSArIGpdID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaiA+IDAgJiYgZW5jb2RlZFtpICsgaiAtIDFdID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKGVuY29kZWRbaSArIGpdIGluIGRlY29kZU1hcCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNoYXJhY3RlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNodW5rIHw9IEJpZ0ludChkZWNvZGVNYXBbZW5jb2RlZFtpICsgal1dKSA8PCBCaWdJbnQoKDcgLSBqKSAqIDUpO1xuICAgICAgICAgICAgYml0c1JlYWQgKz0gNTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYml0c1JlYWQgPCA0MCkge1xuICAgICAgICAgICAgbGV0IHVudXNlZDtcbiAgICAgICAgICAgIGlmIChiaXRzUmVhZCA9PT0gMTApIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmZmZmZmZmZuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYml0c1JlYWQgPT09IDIwKSB7XG4gICAgICAgICAgICAgICAgdW51c2VkID0gY2h1bmsgJiAweGZmZmZmZm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaXRzUmVhZCA9PT0gMjUpIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmZmZm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaXRzUmVhZCA9PT0gMzUpIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmZuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVudXNlZCAhPT0gMG4pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnl0ZUxlbmd0aCA9IE1hdGguZmxvb3IoYml0c1JlYWQgLyA4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdFt0b3RhbEJ5dGVzXSA9IE51bWJlcigoY2h1bmsgPj4gQmlnSW50KDMyIC0gaSAqIDgpKSAmIDB4ZmZuKTtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LnNsaWNlKDAsIHRvdGFsQnl0ZXMpO1xufVxuY29uc3QgYmFzZTMyVXBwZXJDYXNlQWxwaGFiZXQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMjM0NTY3XCI7XG5jb25zdCBiYXNlMzJMb3dlckNhc2VBbHBoYWJldCA9IFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoyMzQ1NjdcIjtcbmNvbnN0IGJhc2UzMkRlY29kZU1hcCA9IHtcbiAgICBBOiAwLFxuICAgIEI6IDEsXG4gICAgQzogMixcbiAgICBEOiAzLFxuICAgIEU6IDQsXG4gICAgRjogNSxcbiAgICBHOiA2LFxuICAgIEg6IDcsXG4gICAgSTogOCxcbiAgICBKOiA5LFxuICAgIEs6IDEwLFxuICAgIEw6IDExLFxuICAgIE06IDEyLFxuICAgIE46IDEzLFxuICAgIE86IDE0LFxuICAgIFA6IDE1LFxuICAgIFE6IDE2LFxuICAgIFI6IDE3LFxuICAgIFM6IDE4LFxuICAgIFQ6IDE5LFxuICAgIFU6IDIwLFxuICAgIFY6IDIxLFxuICAgIFc6IDIyLFxuICAgIFg6IDIzLFxuICAgIFk6IDI0LFxuICAgIFo6IDI1LFxuICAgIGE6IDAsXG4gICAgYjogMSxcbiAgICBjOiAyLFxuICAgIGQ6IDMsXG4gICAgZTogNCxcbiAgICBmOiA1LFxuICAgIGc6IDYsXG4gICAgaDogNyxcbiAgICBpOiA4LFxuICAgIGo6IDksXG4gICAgazogMTAsXG4gICAgbDogMTEsXG4gICAgbTogMTIsXG4gICAgbjogMTMsXG4gICAgbzogMTQsXG4gICAgcDogMTUsXG4gICAgcTogMTYsXG4gICAgcjogMTcsXG4gICAgczogMTgsXG4gICAgdDogMTksXG4gICAgdTogMjAsXG4gICAgdjogMjEsXG4gICAgdzogMjIsXG4gICAgeDogMjMsXG4gICAgeTogMjQsXG4gICAgejogMjUsXG4gICAgXCIyXCI6IDI2LFxuICAgIFwiM1wiOiAyNyxcbiAgICBcIjRcIjogMjgsXG4gICAgXCI1XCI6IDI5LFxuICAgIFwiNlwiOiAzMCxcbiAgICBcIjdcIjogMzFcbn07XG52YXIgRW5jb2RpbmdQYWRkaW5nO1xuKGZ1bmN0aW9uIChFbmNvZGluZ1BhZGRpbmcpIHtcbiAgICBFbmNvZGluZ1BhZGRpbmdbRW5jb2RpbmdQYWRkaW5nW1wiSW5jbHVkZVwiXSA9IDBdID0gXCJJbmNsdWRlXCI7XG4gICAgRW5jb2RpbmdQYWRkaW5nW0VuY29kaW5nUGFkZGluZ1tcIk5vbmVcIl0gPSAxXSA9IFwiTm9uZVwiO1xufSkoRW5jb2RpbmdQYWRkaW5nIHx8IChFbmNvZGluZ1BhZGRpbmcgPSB7fSkpO1xudmFyIERlY29kaW5nUGFkZGluZztcbihmdW5jdGlvbiAoRGVjb2RpbmdQYWRkaW5nKSB7XG4gICAgRGVjb2RpbmdQYWRkaW5nW0RlY29kaW5nUGFkZGluZ1tcIlJlcXVpcmVkXCJdID0gMF0gPSBcIlJlcXVpcmVkXCI7XG4gICAgRGVjb2RpbmdQYWRkaW5nW0RlY29kaW5nUGFkZGluZ1tcIklnbm9yZVwiXSA9IDFdID0gXCJJZ25vcmVcIjtcbn0pKERlY29kaW5nUGFkZGluZyB8fCAoRGVjb2RpbmdQYWRkaW5nID0ge30pKTtcbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2U2NChieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlNjRfaW50ZXJuYWwoYnl0ZXMsIGJhc2U2NEFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTY0Tm9QYWRkaW5nKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2U2NF9pbnRlcm5hbChieXRlcywgYmFzZTY0QWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5Ob25lKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlNjR1cmwoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTY0X2ludGVybmFsKGJ5dGVzLCBiYXNlNjR1cmxBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLkluY2x1ZGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2U2NHVybE5vUGFkZGluZyhieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlNjRfaW50ZXJuYWwoYnl0ZXMsIGJhc2U2NHVybEFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuTm9uZSk7XG59XG5mdW5jdGlvbiBlbmNvZGVCYXNlNjRfaW50ZXJuYWwoYnl0ZXMsIGFscGhhYmV0LCBwYWRkaW5nKSB7XG4gICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5ieXRlTGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgbGV0IGJ1ZmZlciA9IDA7XG4gICAgICAgIGxldCBidWZmZXJCaXRTaXplID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAzICYmIGkgKyBqIDwgYnl0ZXMuYnl0ZUxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBidWZmZXIgPSAoYnVmZmVyIDw8IDgpIHwgYnl0ZXNbaSArIGpdO1xuICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoYnVmZmVyQml0U2l6ZSA+PSA2KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFscGhhYmV0WyhidWZmZXIgPj4gKGJ1ZmZlckJpdFNpemUgLSA2KSkgJiAweDNmXTtcbiAgICAgICAgICAgICAgICBidWZmZXJCaXRTaXplIC09IDY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChidWZmZXJCaXRTaXplID4gMCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhbHBoYWJldFsoYnVmZmVyIDw8ICg2IC0gYnVmZmVyQml0U2l6ZSkpICYgMHgzZl07XG4gICAgICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYWRkaW5nID09PSBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIj1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgYmFzZTY0QWxwaGFiZXQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9cIjtcbmNvbnN0IGJhc2U2NHVybEFscGhhYmV0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fXCI7XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTY0KGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGJhc2U2NERlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLlJlcXVpcmVkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlNjRJZ25vcmVQYWRkaW5nKGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGJhc2U2NERlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLklnbm9yZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTY0dXJsKGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGJhc2U2NHVybERlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLlJlcXVpcmVkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlNjR1cmxJZ25vcmVQYWRkaW5nKGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGJhc2U2NHVybERlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLklnbm9yZSk7XG59XG5mdW5jdGlvbiBkZWNvZGVCYXNlNjRfaW50ZXJuYWwoZW5jb2RlZCwgZGVjb2RlTWFwLCBwYWRkaW5nKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKGVuY29kZWQubGVuZ3RoIC8gNCkgKiAzKTtcbiAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbmNvZGVkLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGxldCBjaHVuayA9IDA7XG4gICAgICAgIGxldCBiaXRzUmVhZCA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgICBpZiAocGFkZGluZyA9PT0gRGVjb2RpbmdQYWRkaW5nLlJlcXVpcmVkICYmIGVuY29kZWRbaSArIGpdID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhZGRpbmcgPT09IERlY29kaW5nUGFkZGluZy5JZ25vcmUgJiZcbiAgICAgICAgICAgICAgICAoaSArIGogPj0gZW5jb2RlZC5sZW5ndGggfHwgZW5jb2RlZFtpICsgal0gPT09IFwiPVwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGogPiAwICYmIGVuY29kZWRbaSArIGogLSAxXSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShlbmNvZGVkW2kgKyBqXSBpbiBkZWNvZGVNYXApKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjaGFyYWN0ZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVuayB8PSBkZWNvZGVNYXBbZW5jb2RlZFtpICsgal1dIDw8ICgoMyAtIGopICogNik7XG4gICAgICAgICAgICBiaXRzUmVhZCArPSA2O1xuICAgICAgICB9XG4gICAgICAgIGlmIChiaXRzUmVhZCA8IDI0KSB7XG4gICAgICAgICAgICBsZXQgdW51c2VkO1xuICAgICAgICAgICAgaWYgKGJpdHNSZWFkID09PSAxMikge1xuICAgICAgICAgICAgICAgIHVudXNlZCA9IGNodW5rICYgMHhmZmZmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYml0c1JlYWQgPT09IDE4KSB7XG4gICAgICAgICAgICAgICAgdW51c2VkID0gY2h1bmsgJiAweGZmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVudXNlZCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBieXRlTGVuZ3RoID0gTWF0aC5mbG9vcihiaXRzUmVhZCAvIDgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0W3RvdGFsQnl0ZXNdID0gKGNodW5rID4+ICgxNiAtIGkgKiA4KSkgJiAweGZmO1xuICAgICAgICAgICAgdG90YWxCeXRlcysrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuc2xpY2UoMCwgdG90YWxCeXRlcyk7XG59XG52YXIgRW5jb2RpbmdQYWRkaW5nO1xuKGZ1bmN0aW9uIChFbmNvZGluZ1BhZGRpbmcpIHtcbiAgICBFbmNvZGluZ1BhZGRpbmdbRW5jb2RpbmdQYWRkaW5nW1wiSW5jbHVkZVwiXSA9IDBdID0gXCJJbmNsdWRlXCI7XG4gICAgRW5jb2RpbmdQYWRkaW5nW0VuY29kaW5nUGFkZGluZ1tcIk5vbmVcIl0gPSAxXSA9IFwiTm9uZVwiO1xufSkoRW5jb2RpbmdQYWRkaW5nIHx8IChFbmNvZGluZ1BhZGRpbmcgPSB7fSkpO1xudmFyIERlY29kaW5nUGFkZGluZztcbihmdW5jdGlvbiAoRGVjb2RpbmdQYWRkaW5nKSB7XG4gICAgRGVjb2RpbmdQYWRkaW5nW0RlY29kaW5nUGFkZGluZ1tcIlJlcXVpcmVkXCJdID0gMF0gPSBcIlJlcXVpcmVkXCI7XG4gICAgRGVjb2RpbmdQYWRkaW5nW0RlY29kaW5nUGFkZGluZ1tcIklnbm9yZVwiXSA9IDFdID0gXCJJZ25vcmVcIjtcbn0pKERlY29kaW5nUGFkZGluZyB8fCAoRGVjb2RpbmdQYWRkaW5nID0ge30pKTtcbmNvbnN0IGJhc2U2NERlY29kZU1hcCA9IHtcbiAgICBcIjBcIjogNTIsXG4gICAgXCIxXCI6IDUzLFxuICAgIFwiMlwiOiA1NCxcbiAgICBcIjNcIjogNTUsXG4gICAgXCI0XCI6IDU2LFxuICAgIFwiNVwiOiA1NyxcbiAgICBcIjZcIjogNTgsXG4gICAgXCI3XCI6IDU5LFxuICAgIFwiOFwiOiA2MCxcbiAgICBcIjlcIjogNjEsXG4gICAgQTogMCxcbiAgICBCOiAxLFxuICAgIEM6IDIsXG4gICAgRDogMyxcbiAgICBFOiA0LFxuICAgIEY6IDUsXG4gICAgRzogNixcbiAgICBIOiA3LFxuICAgIEk6IDgsXG4gICAgSjogOSxcbiAgICBLOiAxMCxcbiAgICBMOiAxMSxcbiAgICBNOiAxMixcbiAgICBOOiAxMyxcbiAgICBPOiAxNCxcbiAgICBQOiAxNSxcbiAgICBROiAxNixcbiAgICBSOiAxNyxcbiAgICBTOiAxOCxcbiAgICBUOiAxOSxcbiAgICBVOiAyMCxcbiAgICBWOiAyMSxcbiAgICBXOiAyMixcbiAgICBYOiAyMyxcbiAgICBZOiAyNCxcbiAgICBaOiAyNSxcbiAgICBhOiAyNixcbiAgICBiOiAyNyxcbiAgICBjOiAyOCxcbiAgICBkOiAyOSxcbiAgICBlOiAzMCxcbiAgICBmOiAzMSxcbiAgICBnOiAzMixcbiAgICBoOiAzMyxcbiAgICBpOiAzNCxcbiAgICBqOiAzNSxcbiAgICBrOiAzNixcbiAgICBsOiAzNyxcbiAgICBtOiAzOCxcbiAgICBuOiAzOSxcbiAgICBvOiA0MCxcbiAgICBwOiA0MSxcbiAgICBxOiA0MixcbiAgICByOiA0MyxcbiAgICBzOiA0NCxcbiAgICB0OiA0NSxcbiAgICB1OiA0NixcbiAgICB2OiA0NyxcbiAgICB3OiA0OCxcbiAgICB4OiA0OSxcbiAgICB5OiA1MCxcbiAgICB6OiA1MSxcbiAgICBcIitcIjogNjIsXG4gICAgXCIvXCI6IDYzXG59O1xuY29uc3QgYmFzZTY0dXJsRGVjb2RlTWFwID0ge1xuICAgIFwiMFwiOiA1MixcbiAgICBcIjFcIjogNTMsXG4gICAgXCIyXCI6IDU0LFxuICAgIFwiM1wiOiA1NSxcbiAgICBcIjRcIjogNTYsXG4gICAgXCI1XCI6IDU3LFxuICAgIFwiNlwiOiA1OCxcbiAgICBcIjdcIjogNTksXG4gICAgXCI4XCI6IDYwLFxuICAgIFwiOVwiOiA2MSxcbiAgICBBOiAwLFxuICAgIEI6IDEsXG4gICAgQzogMixcbiAgICBEOiAzLFxuICAgIEU6IDQsXG4gICAgRjogNSxcbiAgICBHOiA2LFxuICAgIEg6IDcsXG4gICAgSTogOCxcbiAgICBKOiA5LFxuICAgIEs6IDEwLFxuICAgIEw6IDExLFxuICAgIE06IDEyLFxuICAgIE46IDEzLFxuICAgIE86IDE0LFxuICAgIFA6IDE1LFxuICAgIFE6IDE2LFxuICAgIFI6IDE3LFxuICAgIFM6IDE4LFxuICAgIFQ6IDE5LFxuICAgIFU6IDIwLFxuICAgIFY6IDIxLFxuICAgIFc6IDIyLFxuICAgIFg6IDIzLFxuICAgIFk6IDI0LFxuICAgIFo6IDI1LFxuICAgIGE6IDI2LFxuICAgIGI6IDI3LFxuICAgIGM6IDI4LFxuICAgIGQ6IDI5LFxuICAgIGU6IDMwLFxuICAgIGY6IDMxLFxuICAgIGc6IDMyLFxuICAgIGg6IDMzLFxuICAgIGk6IDM0LFxuICAgIGo6IDM1LFxuICAgIGs6IDM2LFxuICAgIGw6IDM3LFxuICAgIG06IDM4LFxuICAgIG46IDM5LFxuICAgIG86IDQwLFxuICAgIHA6IDQxLFxuICAgIHE6IDQyLFxuICAgIHI6IDQzLFxuICAgIHM6IDQ0LFxuICAgIHQ6IDQ1LFxuICAgIHU6IDQ2LFxuICAgIHY6IDQ3LFxuICAgIHc6IDQ4LFxuICAgIHg6IDQ5LFxuICAgIHk6IDUwLFxuICAgIHo6IDUxLFxuICAgIFwiLVwiOiA2MixcbiAgICBfOiA2M1xufTtcbiIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gXCIuL29wdGlvbnMuanNcIjtcbmltcG9ydCB7IGp3dERlY29kZSB9IGZyb20gXCJqd3QtZGVjb2RlXCI7XG5pbXBvcnQgeyBlbmNvZGVCYXNlNjR1cmxOb1BhZGRpbmcgfSBmcm9tIFwiQG9zbG9qcy9lbmNvZGluZ1wiO1xuaW1wb3J0IGp3dCBmcm9tIFwianNvbndlYnRva2VuXCI7XG5pbXBvcnQgandrVG9QZW0gZnJvbSBcImp3ay10by1wZW1cIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvYXV0aC50c1xudmFyIGF1dGhfZXhwb3J0cyA9IHt9O1xuX19leHBvcnQoYXV0aF9leHBvcnRzLCB7XG5cdGNoYXJhY3RlcklkRnJvbVRva2VuOiAoKSA9PiBjaGFyYWN0ZXJJZEZyb21Ub2tlbixcblx0Y3JlYXRlQXV0aG9yaXphdGlvblVSTDogKCkgPT4gY3JlYXRlQXV0aG9yaXphdGlvblVSTCxcblx0cmVmcmVzaDogKCkgPT4gcmVmcmVzaCxcblx0dmFsaWRhdGVBdXRob3JpemF0aW9uQ29kZTogKCkgPT4gdmFsaWRhdGVBdXRob3JpemF0aW9uQ29kZSxcblx0dmFsaWRhdGVUb2tlbjogKCkgPT4gdmFsaWRhdGVUb2tlblxufSk7XG5mdW5jdGlvbiBnZW5lcmF0ZVN0YXRlKCkge1xuXHRjb25zdCByYW5kb21WYWx1ZXMgPSBuZXcgVWludDhBcnJheSgzMik7XG5cdGNyeXB0by5nZXRSYW5kb21WYWx1ZXMocmFuZG9tVmFsdWVzKTtcblx0cmV0dXJuIGVuY29kZUJhc2U2NHVybE5vUGFkZGluZyhyYW5kb21WYWx1ZXMpO1xufVxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXV0aG9yaXphdGlvblVSTChzY29wZXMgPSBcInB1YmxpY0RhdGFcIikge1xuXHRjb25zdCBzdGF0ZSA9IGdlbmVyYXRlU3RhdGUoKTtcblx0Y29uc3QgdXJsID0gbmV3IFVSTChcImh0dHBzOi8vbG9naW4uZXZlb25saW5lLmNvbS92Mi9vYXV0aC9hdXRob3JpemUvXCIpO1xuXHR1cmwuc2VhcmNoUGFyYW1zLnNldChcInJlc3BvbnNlX3R5cGVcIiwgXCJjb2RlXCIpO1xuXHR1cmwuc2VhcmNoUGFyYW1zLnNldChcInJlZGlyZWN0X3VyaVwiLCBvcHRpb25zLmNhbGxiYWNrX3VybCk7XG5cdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiY2xpZW50X2lkXCIsIG9wdGlvbnMuY2xpZW50X2lkKTtcblx0dXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJzdGF0ZVwiLCBzdGF0ZSk7XG5cdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwic2NvcGVcIiwgQXJyYXkuaXNBcnJheShzY29wZXMpID8gc2NvcGVzLmpvaW4oXCIgXCIpIDogc2NvcGVzKTtcblx0cmV0dXJuIHtcblx0XHR1cmwsXG5cdFx0c3RhdGVcblx0fTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQXV0aG9yaXphdGlvbkNvZGUoY29kZSkge1xuXHR0cnkge1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCJodHRwczovL2xvZ2luLmV2ZW9ubGluZS5jb20vdjIvb2F1dGgvdG9rZW5cIiwge1xuXHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0XCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIixcblx0XHRcdFx0QXV0aG9yaXphdGlvbjogYEJhc2ljICR7QnVmZmVyLmZyb20oYCR7b3B0aW9ucy5jbGllbnRfaWR9OiR7b3B0aW9ucy5jbGllbnRfc2VjcmV0fWApLnRvU3RyaW5nKFwiYmFzZTY0XCIpfWBcblx0XHRcdH0sXG5cdFx0XHRib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcblx0XHRcdFx0Z3JhbnRfdHlwZTogXCJhdXRob3JpemF0aW9uX2NvZGVcIixcblx0XHRcdFx0Y29kZVxuXHRcdFx0fSlcblx0XHR9KTtcblx0XHRyZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdGNvbnNvbGUuZXJyb3IoYGZhaWxlZCB0byB2YWxpZGF0ZSBFVkUgYXV0aG9yaXphdGlvbiBjb2RlYCwgZXJyb3IpO1xuXHRcdHRocm93IGAke2Vycm9yfWA7XG5cdH1cbn1cbmxldCBldmVBdXRoUHVibGljS2V5O1xuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVUb2tlbih0b2tlbikge1xuXHRpZiAoIWV2ZUF1dGhQdWJsaWNLZXkpIHRyeSB7XG5cdFx0Y29uc3QgZXZlSldLUyA9IGF3YWl0IChhd2FpdCBmZXRjaChcImh0dHBzOi8vbG9naW4uZXZlb25saW5lLmNvbS9vYXV0aC9qd2tzXCIpKS5qc29uKCk7XG5cdFx0ZXZlQXV0aFB1YmxpY0tleSA9IGp3a1RvUGVtKGV2ZUpXS1Mua2V5c1swXSk7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGNvbnNvbGUuZXJyb3IoYGZhaWxlZCB0byBnZXQgRVZFIEF1dGggcHVibGljIGtleXNgLCBlcnIpO1xuXHR9XG5cdHRyeSB7XG5cdFx0Y29uc3QgZGVjb2RlZCA9IGp3dC52ZXJpZnkodG9rZW4sIGV2ZUF1dGhQdWJsaWNLZXkpO1xuXHRcdHJldHVybiBkZWNvZGVkO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRjb25zb2xlLmVycm9yKGBmYWlsZWQgdG8gdmFsaWRhdGUgRVZFIHRva2VuYCwgZXJyKTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxufVxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaCh7IHJlZnJlc2hfdG9rZW4gfSwgc2NvcGVzKSB7XG5cdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRncmFudF90eXBlOiBcInJlZnJlc2hfdG9rZW5cIixcblx0XHRyZWZyZXNoX3Rva2VuLFxuXHRcdHNjb3BlOiBcIlwiXG5cdH07XG5cdGlmIChzY29wZXMpIHBhcmFtc1tcInNjb3BlXCJdID0gQXJyYXkuaXNBcnJheShzY29wZXMpID8gc2NvcGVzLmpvaW4oXCIgXCIpIDogc2NvcGVzO1xuXHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9sb2dpbi5ldmVvbmxpbmUuY29tL3YyL29hdXRoL3Rva2VuXCIsIHtcblx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdGhlYWRlcnM6IHtcblx0XHRcdFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIsXG5cdFx0XHRBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtvcHRpb25zLmNsaWVudF9pZH06JHtvcHRpb25zLmNsaWVudF9zZWNyZXR9YCkudG9TdHJpbmcoXCJiYXNlNjRcIil9YFxuXHRcdH0sXG5cdFx0Ym9keTogbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpXG5cdH0pO1xuXHRyZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xufVxuZnVuY3Rpb24gY2hhcmFjdGVySWRGcm9tVG9rZW4odG9rZW4pIHtcblx0Y29uc3QgcGF5bG9hZCA9IGp3dERlY29kZSh0b2tlbik7XG5cdHJldHVybiBwYXJzZUludChwYXlsb2FkLnN1Yi5zcGxpdChcIjpcIilbMl0pO1xufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGF1dGhfZXhwb3J0cywgY2hhcmFjdGVySWRGcm9tVG9rZW4sIGNyZWF0ZUF1dGhvcml6YXRpb25VUkwsIHJlZnJlc2gsIHZhbGlkYXRlQXV0aG9yaXphdGlvbkNvZGUsIHZhbGlkYXRlVG9rZW4gfTsiLAogICAgImltcG9ydCB7IGp3dERlY29kZSB9IGZyb20gXCJqd3QtZGVjb2RlXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZXNpL3Njb3Blcy50c1xuY29uc3QgRVZFX0pXS1NfVVJMID0gXCJodHRwczovL2xvZ2luLmV2ZW9ubGluZS5jb20vb2F1dGgvandrc1wiO1xuY29uc3QgRVZFX0lTU1VFUiA9IFwibG9naW4uZXZlb25saW5lLmNvbVwiO1xuY29uc3QgRVZFX0FVRElFTkNFID0gXCJldmVvbmxpbmVcIjtcbmNvbnN0IEVTSV9MQVRFU1RfVVJMID0gXCJodHRwczovL2VzaS5ldmV0ZWNoLm5ldC9sYXRlc3RcIjtcbmNvbnN0IERBVEFfU09VUkNFID0gXCJ0cmFucXVpbGl0eVwiO1xuZnVuY3Rpb24gam9pblNjb3BlcyguLi5zY29wZXMpIHtcblx0cmV0dXJuIHNjb3Blcy5qb2luKFwiIFwiKTtcbn1cbmxldCBTQ09QRVMgPSAvKiBAX19QVVJFX18gKi8gZnVuY3Rpb24oU0NPUEVTJDEpIHtcblx0U0NPUEVTJDFbXCJQVUJMSUNfREFUQVwiXSA9IFwicHVibGljRGF0YVwiO1xuXHRTQ09QRVMkMVtcIkNBTEVOREFSX1JFU1BPTkRfQ0FMRU5EQVJfRVZFTlRTXCJdID0gXCJlc2ktY2FsZW5kYXIucmVzcG9uZF9jYWxlbmRhcl9ldmVudHMudjFcIjtcblx0U0NPUEVTJDFbXCJDQUxFTkRBUl9SRUFEX0NBTEVOREFSX0VWRU5UU1wiXSA9IFwiZXNpLWNhbGVuZGFyLnJlYWRfY2FsZW5kYXJfZXZlbnRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiTE9DQVRJT05fUkVBRF9MT0NBVElPTlwiXSA9IFwiZXNpLWxvY2F0aW9uLnJlYWRfbG9jYXRpb24udjFcIjtcblx0U0NPUEVTJDFbXCJMT0NBVElPTl9SRUFEX1NISVBfVFlQRVwiXSA9IFwiZXNpLWxvY2F0aW9uLnJlYWRfc2hpcF90eXBlLnYxXCI7XG5cdFNDT1BFUyQxW1wiTUFJTF9PUkdBTklaRV9NQUlMXCJdID0gXCJlc2ktbWFpbC5vcmdhbml6ZV9tYWlsLnYxXCI7XG5cdFNDT1BFUyQxW1wiTUFJTF9SRUFEX01BSUxcIl0gPSBcImVzaS1tYWlsLnJlYWRfbWFpbC52MVwiO1xuXHRTQ09QRVMkMVtcIk1BSUxfU0VORF9NQUlMXCJdID0gXCJlc2ktbWFpbC5zZW5kX21haWwudjFcIjtcblx0U0NPUEVTJDFbXCJTS0lMTFNfUkVBRF9TS0lMTFNcIl0gPSBcImVzaS1za2lsbHMucmVhZF9za2lsbHMudjFcIjtcblx0U0NPUEVTJDFbXCJTS0lMTFNfUkVBRF9TS0lMTFFVRVVFXCJdID0gXCJlc2ktc2tpbGxzLnJlYWRfc2tpbGxxdWV1ZS52MVwiO1xuXHRTQ09QRVMkMVtcIldBTExFVF9SRUFEX0NIQVJBQ1RFUl9XQUxMRVRcIl0gPSBcImVzaS13YWxsZXQucmVhZF9jaGFyYWN0ZXJfd2FsbGV0LnYxXCI7XG5cdFNDT1BFUyQxW1wiV0FMTEVUX1JFQURfQ09SUE9SQVRJT05fV0FMTEVUXCJdID0gXCJlc2ktd2FsbGV0LnJlYWRfY29ycG9yYXRpb25fd2FsbGV0LnYxXCI7XG5cdFNDT1BFUyQxW1wiU0VBUkNIX1NFQVJDSF9TVFJVQ1RVUkVTXCJdID0gXCJlc2ktc2VhcmNoLnNlYXJjaF9zdHJ1Y3R1cmVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0xPTkVTX1JFQURfQ0xPTkVTXCJdID0gXCJlc2ktY2xvbmVzLnJlYWRfY2xvbmVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0NPTlRBQ1RTXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX2NvbnRhY3RzLnYxXCI7XG5cdFNDT1BFUyQxW1wiVU5JVkVSU0VfUkVBRF9TVFJVQ1RVUkVTXCJdID0gXCJlc2ktdW5pdmVyc2UucmVhZF9zdHJ1Y3R1cmVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiS0lMTE1BSUxTX1JFQURfS0lMTE1BSUxTXCJdID0gXCJlc2kta2lsbG1haWxzLnJlYWRfa2lsbG1haWxzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfQ09SUE9SQVRJT05fTUVNQkVSU0hJUFwiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX2NvcnBvcmF0aW9uX21lbWJlcnNoaXAudjFcIjtcblx0U0NPUEVTJDFbXCJBU1NFVFNfUkVBRF9BU1NFVFNcIl0gPSBcImVzaS1hc3NldHMucmVhZF9hc3NldHMudjFcIjtcblx0U0NPUEVTJDFbXCJQTEFORVRTX01BTkFHRV9QTEFORVRTXCJdID0gXCJlc2ktcGxhbmV0cy5tYW5hZ2VfcGxhbmV0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkZMRUVUU19SRUFEX0ZMRUVUXCJdID0gXCJlc2ktZmxlZXRzLnJlYWRfZmxlZXQudjFcIjtcblx0U0NPUEVTJDFbXCJGTEVFVFNfV1JJVEVfRkxFRVRcIl0gPSBcImVzaS1mbGVldHMud3JpdGVfZmxlZXQudjFcIjtcblx0U0NPUEVTJDFbXCJVSV9PUEVOX1dJTkRPV1wiXSA9IFwiZXNpLXVpLm9wZW5fd2luZG93LnYxXCI7XG5cdFNDT1BFUyQxW1wiVUlfV1JJVEVfV0FZUE9JTlRcIl0gPSBcImVzaS11aS53cml0ZV93YXlwb2ludC52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfV1JJVEVfQ09OVEFDVFNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLndyaXRlX2NvbnRhY3RzLnYxXCI7XG5cdFNDT1BFUyQxW1wiRklUVElOR1NfUkVBRF9GSVRUSU5HU1wiXSA9IFwiZXNpLWZpdHRpbmdzLnJlYWRfZml0dGluZ3MudjFcIjtcblx0U0NPUEVTJDFbXCJGSVRUSU5HU19XUklURV9GSVRUSU5HU1wiXSA9IFwiZXNpLWZpdHRpbmdzLndyaXRlX2ZpdHRpbmdzLnYxXCI7XG5cdFNDT1BFUyQxW1wiTUFSS0VUU19TVFJVQ1RVUkVfTUFSS0VUU1wiXSA9IFwiZXNpLW1hcmtldHMuc3RydWN0dXJlX21hcmtldHMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9TVFJVQ1RVUkVTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfc3RydWN0dXJlcy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9MT1lBTFRZXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX2xveWFsdHkudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfT1BQT1JUVU5JVElFU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9vcHBvcnR1bml0aWVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0NIQVRfQ0hBTk5FTFNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfY2hhdF9jaGFubmVscy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9NRURBTFNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfbWVkYWxzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX1NUQU5ESU5HU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9zdGFuZGluZ3MudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfQUdFTlRTX1JFU0VBUkNIXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX2FnZW50c19yZXNlYXJjaC52MVwiO1xuXHRTQ09QRVMkMVtcIklORFVTVFJZX1JFQURfQ0hBUkFDVEVSX0pPQlNcIl0gPSBcImVzaS1pbmR1c3RyeS5yZWFkX2NoYXJhY3Rlcl9qb2JzLnYxXCI7XG5cdFNDT1BFUyQxW1wiTUFSS0VUU19SRUFEX0NIQVJBQ1RFUl9PUkRFUlNcIl0gPSBcImVzaS1tYXJrZXRzLnJlYWRfY2hhcmFjdGVyX29yZGVycy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9CTFVFUFJJTlRTXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX2JsdWVwcmludHMudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfQ09SUE9SQVRJT05fUk9MRVNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfY29ycG9yYXRpb25fcm9sZXMudjFcIjtcblx0U0NPUEVTJDFbXCJMT0NBVElPTl9SRUFEX09OTElORVwiXSA9IFwiZXNpLWxvY2F0aW9uLnJlYWRfb25saW5lLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09OVFJBQ1RTX1JFQURfQ0hBUkFDVEVSX0NPTlRSQUNUU1wiXSA9IFwiZXNpLWNvbnRyYWN0cy5yZWFkX2NoYXJhY3Rlcl9jb250cmFjdHMudjFcIjtcblx0U0NPUEVTJDFbXCJDTE9ORVNfUkVBRF9JTVBMQU5UU1wiXSA9IFwiZXNpLWNsb25lcy5yZWFkX2ltcGxhbnRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0ZBVElHVUVcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfZmF0aWd1ZS52MVwiO1xuXHRTQ09QRVMkMVtcIktJTExNQUlMU19SRUFEX0NPUlBPUkFUSU9OX0tJTExNQUlMU1wiXSA9IFwiZXNpLWtpbGxtYWlscy5yZWFkX2NvcnBvcmF0aW9uX2tpbGxtYWlscy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19UUkFDS19NRU1CRVJTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnRyYWNrX21lbWJlcnMudjFcIjtcblx0U0NPUEVTJDFbXCJXQUxMRVRfUkVBRF9DT1JQT1JBVElPTl9XQUxMRVRTXCJdID0gXCJlc2ktd2FsbGV0LnJlYWRfY29ycG9yYXRpb25fd2FsbGV0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9OT1RJRklDQVRJT05TXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX25vdGlmaWNhdGlvbnMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9ESVZJU0lPTlNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9kaXZpc2lvbnMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9DT05UQUNUU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX2NvbnRhY3RzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQVNTRVRTX1JFQURfQ09SUE9SQVRJT05fQVNTRVRTXCJdID0gXCJlc2ktYXNzZXRzLnJlYWRfY29ycG9yYXRpb25fYXNzZXRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfVElUTEVTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfdGl0bGVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfQkxVRVBSSU5UU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX2JsdWVwcmludHMudjFcIjtcblx0U0NPUEVTJDFbXCJDT05UUkFDVFNfUkVBRF9DT1JQT1JBVElPTl9DT05UUkFDVFNcIl0gPSBcImVzaS1jb250cmFjdHMucmVhZF9jb3Jwb3JhdGlvbl9jb250cmFjdHMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9TVEFORElOR1NcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9zdGFuZGluZ3MudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9TVEFSQkFTRVNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9zdGFyYmFzZXMudjFcIjtcblx0U0NPUEVTJDFbXCJJTkRVU1RSWV9SRUFEX0NPUlBPUkFUSU9OX0pPQlNcIl0gPSBcImVzaS1pbmR1c3RyeS5yZWFkX2NvcnBvcmF0aW9uX2pvYnMudjFcIjtcblx0U0NPUEVTJDFbXCJNQVJLRVRTX1JFQURfQ09SUE9SQVRJT05fT1JERVJTXCJdID0gXCJlc2ktbWFya2V0cy5yZWFkX2NvcnBvcmF0aW9uX29yZGVycy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX0NPTlRBSU5FUl9MT0dTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfY29udGFpbmVyX2xvZ3MudjFcIjtcblx0U0NPUEVTJDFbXCJJTkRVU1RSWV9SRUFEX0NIQVJBQ1RFUl9NSU5JTkdcIl0gPSBcImVzaS1pbmR1c3RyeS5yZWFkX2NoYXJhY3Rlcl9taW5pbmcudjFcIjtcblx0U0NPUEVTJDFbXCJJTkRVU1RSWV9SRUFEX0NPUlBPUkFUSU9OX01JTklOR1wiXSA9IFwiZXNpLWluZHVzdHJ5LnJlYWRfY29ycG9yYXRpb25fbWluaW5nLnYxXCI7XG5cdFNDT1BFUyQxW1wiUExBTkVUU19SRUFEX0NVU1RPTVNfT0ZGSUNFU1wiXSA9IFwiZXNpLXBsYW5ldHMucmVhZF9jdXN0b21zX29mZmljZXMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9GQUNJTElUSUVTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfZmFjaWxpdGllcy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX01FREFMU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX21lZGFscy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9USVRMRVNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfdGl0bGVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQUxMSUFOQ0VTX1JFQURfQ09OVEFDVFNcIl0gPSBcImVzaS1hbGxpYW5jZXMucmVhZF9jb250YWN0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9GV19TVEFUU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9md19zdGF0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX0ZXX1NUQVRTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfZndfc3RhdHMudjFcIjtcblx0cmV0dXJuIFNDT1BFUyQxO1xufSh7fSk7XG5mdW5jdGlvbiB0b2tlbkhhc1Njb3BlcyhhY2Nlc3NfdG9rZW4sIC4uLnNjb3Blcykge1xuXHRsZXQgdG9rZW5TY29wZXMgPSBnZXRTY29wZXNGcm9tVG9rZW4oYWNjZXNzX3Rva2VuKTtcblx0cmV0dXJuIHNjb3Blcy5ldmVyeSgoc2NvcGUpID0+IHRva2VuU2NvcGVzLmluY2x1ZGVzKHNjb3BlKSk7XG59XG5mdW5jdGlvbiBnZXRTY29wZXNGcm9tVG9rZW4oYWNjZXNzX3Rva2VuKSB7XG5cdGNvbnN0IGRlY29kZWQgPSBqd3REZWNvZGUoYWNjZXNzX3Rva2VuKTtcblx0cmV0dXJuIHR5cGVvZiBkZWNvZGVkLnNjcCA9PT0gXCJzdHJpbmdcIiA/IFtkZWNvZGVkLnNjcF0gOiBkZWNvZGVkLnNjcDtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBEQVRBX1NPVVJDRSwgRVNJX0xBVEVTVF9VUkwsIEVWRV9BVURJRU5DRSwgRVZFX0lTU1VFUiwgRVZFX0pXS1NfVVJMLCBTQ09QRVMsIGdldFNjb3Blc0Zyb21Ub2tlbiwgam9pblNjb3BlcywgdG9rZW5IYXNTY29wZXMgfTsiLAogICAgImNvbnN0IGVudGl0eUtpbmQgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTplbnRpdHlLaW5kXCIpO1xuY29uc3QgaGFzT3duRW50aXR5S2luZCA9IFN5bWJvbC5mb3IoXCJkcml6emxlOmhhc093bkVudGl0eUtpbmRcIik7XG5mdW5jdGlvbiBpcyh2YWx1ZSwgdHlwZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiB0eXBlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodHlwZSwgZW50aXR5S2luZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2xhc3MgXCIke3R5cGUubmFtZSA/PyBcIjx1bmtub3duPlwifVwiIGRvZXNuJ3QgbG9vayBsaWtlIGEgRHJpenpsZSBlbnRpdHkuIElmIHRoaXMgaXMgaW5jb3JyZWN0IGFuZCB0aGUgY2xhc3MgaXMgcHJvdmlkZWQgYnkgRHJpenpsZSwgcGxlYXNlIHJlcG9ydCB0aGlzIGFzIGEgYnVnLmBcbiAgICApO1xuICB9XG4gIGxldCBjbHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpLmNvbnN0cnVjdG9yO1xuICBpZiAoY2xzKSB7XG4gICAgd2hpbGUgKGNscykge1xuICAgICAgaWYgKGVudGl0eUtpbmQgaW4gY2xzICYmIGNsc1tlbnRpdHlLaW5kXSA9PT0gdHlwZVtlbnRpdHlLaW5kXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNscyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjbHMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQge1xuICBlbnRpdHlLaW5kLFxuICBoYXNPd25FbnRpdHlLaW5kLFxuICBpc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVudGl0eS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIENvbHVtbiB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy5rZXlBc05hbWUgPSBjb25maWcua2V5QXNOYW1lO1xuICAgIHRoaXMubm90TnVsbCA9IGNvbmZpZy5ub3ROdWxsO1xuICAgIHRoaXMuZGVmYXVsdCA9IGNvbmZpZy5kZWZhdWx0O1xuICAgIHRoaXMuZGVmYXVsdEZuID0gY29uZmlnLmRlZmF1bHRGbjtcbiAgICB0aGlzLm9uVXBkYXRlRm4gPSBjb25maWcub25VcGRhdGVGbjtcbiAgICB0aGlzLmhhc0RlZmF1bHQgPSBjb25maWcuaGFzRGVmYXVsdDtcbiAgICB0aGlzLnByaW1hcnkgPSBjb25maWcucHJpbWFyeUtleTtcbiAgICB0aGlzLmlzVW5pcXVlID0gY29uZmlnLmlzVW5pcXVlO1xuICAgIHRoaXMudW5pcXVlTmFtZSA9IGNvbmZpZy51bmlxdWVOYW1lO1xuICAgIHRoaXMudW5pcXVlVHlwZSA9IGNvbmZpZy51bmlxdWVUeXBlO1xuICAgIHRoaXMuZGF0YVR5cGUgPSBjb25maWcuZGF0YVR5cGU7XG4gICAgdGhpcy5jb2x1bW5UeXBlID0gY29uZmlnLmNvbHVtblR5cGU7XG4gICAgdGhpcy5nZW5lcmF0ZWQgPSBjb25maWcuZ2VuZXJhdGVkO1xuICAgIHRoaXMuZ2VuZXJhdGVkSWRlbnRpdHkgPSBjb25maWcuZ2VuZXJhdGVkSWRlbnRpdHk7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQ29sdW1uXCI7XG4gIG5hbWU7XG4gIGtleUFzTmFtZTtcbiAgcHJpbWFyeTtcbiAgbm90TnVsbDtcbiAgZGVmYXVsdDtcbiAgZGVmYXVsdEZuO1xuICBvblVwZGF0ZUZuO1xuICBoYXNEZWZhdWx0O1xuICBpc1VuaXF1ZTtcbiAgdW5pcXVlTmFtZTtcbiAgdW5pcXVlVHlwZTtcbiAgZGF0YVR5cGU7XG4gIGNvbHVtblR5cGU7XG4gIGVudW1WYWx1ZXMgPSB2b2lkIDA7XG4gIGdlbmVyYXRlZCA9IHZvaWQgMDtcbiAgZ2VuZXJhdGVkSWRlbnRpdHkgPSB2b2lkIDA7XG4gIGNvbmZpZztcbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgLy8gKiogQGludGVybmFsICovXG4gIHNob3VsZERpc2FibGVJbnNlcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmdlbmVyYXRlZCAhPT0gdm9pZCAwICYmIHRoaXMuY29uZmlnLmdlbmVyYXRlZC50eXBlICE9PSBcImJ5RGVmYXVsdFwiO1xuICB9XG59XG5leHBvcnQge1xuICBDb2x1bW5cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb2x1bW4uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5jbGFzcyBDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQ29sdW1uQnVpbGRlclwiO1xuICBjb25maWc7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGRhdGFUeXBlLCBjb2x1bW5UeXBlKSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBuYW1lLFxuICAgICAga2V5QXNOYW1lOiBuYW1lID09PSBcIlwiLFxuICAgICAgbm90TnVsbDogZmFsc2UsXG4gICAgICBkZWZhdWx0OiB2b2lkIDAsXG4gICAgICBoYXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgIHByaW1hcnlLZXk6IGZhbHNlLFxuICAgICAgaXNVbmlxdWU6IGZhbHNlLFxuICAgICAgdW5pcXVlTmFtZTogdm9pZCAwLFxuICAgICAgdW5pcXVlVHlwZTogdm9pZCAwLFxuICAgICAgZGF0YVR5cGUsXG4gICAgICBjb2x1bW5UeXBlLFxuICAgICAgZ2VuZXJhdGVkOiB2b2lkIDBcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBDaGFuZ2VzIHRoZSBkYXRhIHR5cGUgb2YgdGhlIGNvbHVtbi4gQ29tbW9ubHkgdXNlZCB3aXRoIGBqc29uYCBjb2x1bW5zLiBBbHNvLCB1c2VmdWwgZm9yIGJyYW5kZWQgdHlwZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGNvbnN0IHVzZXJzID0gcGdUYWJsZSgndXNlcnMnLCB7XG4gICAqIFx0aWQ6IGludGVnZXIoJ2lkJykuJHR5cGU8VXNlcklkPigpLnByaW1hcnlLZXkoKSxcbiAgICogXHRkZXRhaWxzOiBqc29uKCdkZXRhaWxzJykuJHR5cGU8VXNlckRldGFpbHM+KCkubm90TnVsbCgpLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICAkdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGBub3QgbnVsbGAgY2xhdXNlIHRvIHRoZSBjb2x1bW4gZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQWZmZWN0cyB0aGUgYHNlbGVjdGAgbW9kZWwgb2YgdGhlIHRhYmxlIC0gY29sdW1ucyAqd2l0aG91dCogYG5vdCBudWxsYCB3aWxsIGJlIG51bGxhYmxlIG9uIHNlbGVjdC5cbiAgICovXG4gIG5vdE51bGwoKSB7XG4gICAgdGhpcy5jb25maWcubm90TnVsbCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBgZGVmYXVsdCA8dmFsdWU+YCBjbGF1c2UgdG8gdGhlIGNvbHVtbiBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBBZmZlY3RzIHRoZSBgaW5zZXJ0YCBtb2RlbCBvZiB0aGUgdGFibGUgLSBjb2x1bW5zICp3aXRoKiBgZGVmYXVsdGAgYXJlIG9wdGlvbmFsIG9uIGluc2VydC5cbiAgICpcbiAgICogSWYgeW91IG5lZWQgdG8gc2V0IGEgZHluYW1pYyBkZWZhdWx0IHZhbHVlLCB1c2Uge0BsaW5rICRkZWZhdWx0Rm59IGluc3RlYWQuXG4gICAqL1xuICBkZWZhdWx0KHZhbHVlKSB7XG4gICAgdGhpcy5jb25maWcuZGVmYXVsdCA9IHZhbHVlO1xuICAgIHRoaXMuY29uZmlnLmhhc0RlZmF1bHQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgZHluYW1pYyBkZWZhdWx0IHZhbHVlIHRvIHRoZSBjb2x1bW4uXG4gICAqIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSByb3cgaXMgaW5zZXJ0ZWQsIGFuZCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIHRoZSBjb2x1bW4gdmFsdWUuXG4gICAqXG4gICAqICoqTm90ZToqKiBUaGlzIHZhbHVlIGRvZXMgbm90IGFmZmVjdCB0aGUgYGRyaXp6bGUta2l0YCBiZWhhdmlvciwgaXQgaXMgb25seSB1c2VkIGF0IHJ1bnRpbWUgaW4gYGRyaXp6bGUtb3JtYC5cbiAgICovXG4gICRkZWZhdWx0Rm4oZm4pIHtcbiAgICB0aGlzLmNvbmZpZy5kZWZhdWx0Rm4gPSBmbjtcbiAgICB0aGlzLmNvbmZpZy5oYXNEZWZhdWx0ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWxpYXMgZm9yIHtAbGluayAkZGVmYXVsdEZufS5cbiAgICovXG4gICRkZWZhdWx0ID0gdGhpcy4kZGVmYXVsdEZuO1xuICAvKipcbiAgICogQWRkcyBhIGR5bmFtaWMgdXBkYXRlIHZhbHVlIHRvIHRoZSBjb2x1bW4uXG4gICAqIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSByb3cgaXMgdXBkYXRlZCwgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbHVtbiB2YWx1ZSBpZiBub25lIGlzIHByb3ZpZGVkLlxuICAgKiBJZiBubyBgZGVmYXVsdGAgKG9yIGAkZGVmYXVsdEZuYCkgdmFsdWUgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSByb3cgaXMgaW5zZXJ0ZWQgYXMgd2VsbCwgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbHVtbiB2YWx1ZS5cbiAgICpcbiAgICogKipOb3RlOioqIFRoaXMgdmFsdWUgZG9lcyBub3QgYWZmZWN0IHRoZSBgZHJpenpsZS1raXRgIGJlaGF2aW9yLCBpdCBpcyBvbmx5IHVzZWQgYXQgcnVudGltZSBpbiBgZHJpenpsZS1vcm1gLlxuICAgKi9cbiAgJG9uVXBkYXRlRm4oZm4pIHtcbiAgICB0aGlzLmNvbmZpZy5vblVwZGF0ZUZuID0gZm47XG4gICAgdGhpcy5jb25maWcuaGFzRGVmYXVsdCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFsaWFzIGZvciB7QGxpbmsgJG9uVXBkYXRlRm59LlxuICAgKi9cbiAgJG9uVXBkYXRlID0gdGhpcy4kb25VcGRhdGVGbjtcbiAgLyoqXG4gICAqIEFkZHMgYSBgcHJpbWFyeSBrZXlgIGNsYXVzZSB0byB0aGUgY29sdW1uIGRlZmluaXRpb24uIFRoaXMgaW1wbGljaXRseSBtYWtlcyB0aGUgY29sdW1uIGBub3QgbnVsbGAuXG4gICAqXG4gICAqIEluIFNRTGl0ZSwgYGludGVnZXIgcHJpbWFyeSBrZXlgIGltcGxpY2l0bHkgbWFrZXMgdGhlIGNvbHVtbiBhdXRvLWluY3JlbWVudGluZy5cbiAgICovXG4gIHByaW1hcnlLZXkoKSB7XG4gICAgdGhpcy5jb25maWcucHJpbWFyeUtleSA9IHRydWU7XG4gICAgdGhpcy5jb25maWcubm90TnVsbCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCBTZXRzIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gdGhlIGtleSB3aXRoaW4gdGhlIHRhYmxlIGRlZmluaXRpb24gaWYgYSBuYW1lIHdhcyBub3QgZ2l2ZW4uICovXG4gIHNldE5hbWUobmFtZSkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5uYW1lICE9PSBcIlwiKSByZXR1cm47XG4gICAgdGhpcy5jb25maWcubmFtZSA9IG5hbWU7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIENvbHVtbkJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb2x1bW4tYnVpbGRlci5qcy5tYXAiLAogICAgImNvbnN0IFRhYmxlTmFtZSA9IFN5bWJvbC5mb3IoXCJkcml6emxlOk5hbWVcIik7XG5leHBvcnQge1xuICBUYWJsZU5hbWVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YWJsZS51dGlscy5qcy5tYXAiLAogICAgImZ1bmN0aW9uIGlpZmUoZm4sIC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xufVxuZXhwb3J0IHtcbiAgaWlmZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYWNpbmctdXRpbHMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGVOYW1lIH0gZnJvbSBcIi4uL3RhYmxlLnV0aWxzLmpzXCI7XG5mdW5jdGlvbiB1bmlxdWUobmFtZSkge1xuICByZXR1cm4gbmV3IFVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXIobmFtZSk7XG59XG5mdW5jdGlvbiB1bmlxdWVLZXlOYW1lKHRhYmxlLCBjb2x1bW5zKSB7XG4gIHJldHVybiBgJHt0YWJsZVtUYWJsZU5hbWVdfV8ke2NvbHVtbnMuam9pbihcIl9cIil9X3VuaXF1ZWA7XG59XG5jbGFzcyBVbmlxdWVDb25zdHJhaW50QnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKGNvbHVtbnMsIG5hbWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdVbmlxdWVDb25zdHJhaW50QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbHVtbnM7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbnVsbHNOb3REaXN0aW5jdENvbmZpZyA9IGZhbHNlO1xuICBudWxsc05vdERpc3RpbmN0KCkge1xuICAgIHRoaXMubnVsbHNOb3REaXN0aW5jdENvbmZpZyA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludCh0YWJsZSwgdGhpcy5jb2x1bW5zLCB0aGlzLm51bGxzTm90RGlzdGluY3RDb25maWcsIHRoaXMubmFtZSk7XG4gIH1cbn1cbmNsYXNzIFVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ1VuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBuYW1lO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuICBvbiguLi5jb2x1bW5zKSB7XG4gICAgcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50QnVpbGRlcihjb2x1bW5zLCB0aGlzLm5hbWUpO1xuICB9XG59XG5jbGFzcyBVbmlxdWVDb25zdHJhaW50IHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbHVtbnMsIG51bGxzTm90RGlzdGluY3QsIG5hbWUpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgICB0aGlzLm5hbWUgPSBuYW1lID8/IHVuaXF1ZUtleU5hbWUodGhpcy50YWJsZSwgdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSkpO1xuICAgIHRoaXMubnVsbHNOb3REaXN0aW5jdCA9IG51bGxzTm90RGlzdGluY3Q7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdVbmlxdWVDb25zdHJhaW50XCI7XG4gIGNvbHVtbnM7XG4gIG5hbWU7XG4gIG51bGxzTm90RGlzdGluY3QgPSBmYWxzZTtcbiAgZ2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG59XG5leHBvcnQge1xuICBVbmlxdWVDb25zdHJhaW50LFxuICBVbmlxdWVDb25zdHJhaW50QnVpbGRlcixcbiAgVW5pcXVlT25Db25zdHJhaW50QnVpbGRlcixcbiAgdW5pcXVlLFxuICB1bmlxdWVLZXlOYW1lXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5pcXVlLWNvbnN0cmFpbnQuanMubWFwIiwKICAgICJpbXBvcnQgeyBDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4uLy4uL2NvbHVtbi1idWlsZGVyLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi4vLi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IEZvcmVpZ25LZXlCdWlsZGVyIH0gZnJvbSBcIi4uL2ZvcmVpZ24ta2V5cy5qc1wiO1xuaW1wb3J0IHsgaWlmZSB9IGZyb20gXCIuLi8uLi90cmFjaW5nLXV0aWxzLmpzXCI7XG5pbXBvcnQgeyB1bmlxdWVLZXlOYW1lIH0gZnJvbSBcIi4uL3VuaXF1ZS1jb25zdHJhaW50LmpzXCI7XG5pbXBvcnQgeyBtYWtlUGdBcnJheSwgcGFyc2VQZ0FycmF5IH0gZnJvbSBcIi4uL3V0aWxzL2FycmF5LmpzXCI7XG5jbGFzcyBQZ0NvbHVtbkJ1aWxkZXIgZXh0ZW5kcyBDb2x1bW5CdWlsZGVyIHtcbiAgZm9yZWlnbktleUNvbmZpZ3MgPSBbXTtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdDb2x1bW5CdWlsZGVyXCI7XG4gIGFycmF5KHNpemUpIHtcbiAgICByZXR1cm4gbmV3IFBnQXJyYXlCdWlsZGVyKHRoaXMuY29uZmlnLm5hbWUsIHRoaXMsIHNpemUpO1xuICB9XG4gIHJlZmVyZW5jZXMocmVmLCBhY3Rpb25zID0ge30pIHtcbiAgICB0aGlzLmZvcmVpZ25LZXlDb25maWdzLnB1c2goeyByZWYsIGFjdGlvbnMgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdW5pcXVlKG5hbWUsIGNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnLmlzVW5pcXVlID0gdHJ1ZTtcbiAgICB0aGlzLmNvbmZpZy51bmlxdWVOYW1lID0gbmFtZTtcbiAgICB0aGlzLmNvbmZpZy51bmlxdWVUeXBlID0gY29uZmlnPy5udWxscztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZW5lcmF0ZWRBbHdheXNBcyhhcykge1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZCA9IHtcbiAgICAgIGFzLFxuICAgICAgdHlwZTogXCJhbHdheXNcIixcbiAgICAgIG1vZGU6IFwic3RvcmVkXCJcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGRGb3JlaWduS2V5cyhjb2x1bW4sIHRhYmxlKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9yZWlnbktleUNvbmZpZ3MubWFwKCh7IHJlZiwgYWN0aW9ucyB9KSA9PiB7XG4gICAgICByZXR1cm4gaWlmZShcbiAgICAgICAgKHJlZjIsIGFjdGlvbnMyKSA9PiB7XG4gICAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBGb3JlaWduS2V5QnVpbGRlcigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb3JlaWduQ29sdW1uID0gcmVmMigpO1xuICAgICAgICAgICAgcmV0dXJuIHsgY29sdW1uczogW2NvbHVtbl0sIGZvcmVpZ25Db2x1bW5zOiBbZm9yZWlnbkNvbHVtbl0gfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoYWN0aW9uczIub25VcGRhdGUpIHtcbiAgICAgICAgICAgIGJ1aWxkZXIub25VcGRhdGUoYWN0aW9uczIub25VcGRhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYWN0aW9uczIub25EZWxldGUpIHtcbiAgICAgICAgICAgIGJ1aWxkZXIub25EZWxldGUoYWN0aW9uczIub25EZWxldGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCh0YWJsZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZixcbiAgICAgICAgYWN0aW9uc1xuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkRXh0cmFDb25maWdDb2x1bW4odGFibGUpIHtcbiAgICByZXR1cm4gbmV3IEV4dHJhQ29uZmlnQ29sdW1uKHRhYmxlLCB0aGlzLmNvbmZpZyk7XG4gIH1cbn1cbmNsYXNzIFBnQ29sdW1uIGV4dGVuZHMgQ29sdW1uIHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIGlmICghY29uZmlnLnVuaXF1ZU5hbWUpIHtcbiAgICAgIGNvbmZpZy51bmlxdWVOYW1lID0gdW5pcXVlS2V5TmFtZSh0YWJsZSwgW2NvbmZpZy5uYW1lXSk7XG4gICAgfVxuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0NvbHVtblwiO1xufVxuY2xhc3MgRXh0cmFDb25maWdDb2x1bW4gZXh0ZW5kcyBQZ0NvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkV4dHJhQ29uZmlnQ29sdW1uXCI7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U1FMVHlwZSgpO1xuICB9XG4gIGluZGV4Q29uZmlnID0ge1xuICAgIG9yZGVyOiB0aGlzLmNvbmZpZy5vcmRlciA/PyBcImFzY1wiLFxuICAgIG51bGxzOiB0aGlzLmNvbmZpZy5udWxscyA/PyBcImxhc3RcIixcbiAgICBvcENsYXNzOiB0aGlzLmNvbmZpZy5vcENsYXNzXG4gIH07XG4gIGRlZmF1bHRDb25maWcgPSB7XG4gICAgb3JkZXI6IFwiYXNjXCIsXG4gICAgbnVsbHM6IFwibGFzdFwiLFxuICAgIG9wQ2xhc3M6IHZvaWQgMFxuICB9O1xuICBhc2MoKSB7XG4gICAgdGhpcy5pbmRleENvbmZpZy5vcmRlciA9IFwiYXNjXCI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZGVzYygpIHtcbiAgICB0aGlzLmluZGV4Q29uZmlnLm9yZGVyID0gXCJkZXNjXCI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgbnVsbHNGaXJzdCgpIHtcbiAgICB0aGlzLmluZGV4Q29uZmlnLm51bGxzID0gXCJmaXJzdFwiO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG51bGxzTGFzdCgpIHtcbiAgICB0aGlzLmluZGV4Q29uZmlnLm51bGxzID0gXCJsYXN0XCI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqICMjIyBQb3N0Z3JlU1FMIGRvY3VtZW50YXRpb24gcXVvdGVcbiAgICpcbiAgICogPiBBbiBvcGVyYXRvciBjbGFzcyB3aXRoIG9wdGlvbmFsIHBhcmFtZXRlcnMgY2FuIGJlIHNwZWNpZmllZCBmb3IgZWFjaCBjb2x1bW4gb2YgYW4gaW5kZXguXG4gICAqIFRoZSBvcGVyYXRvciBjbGFzcyBpZGVudGlmaWVzIHRoZSBvcGVyYXRvcnMgdG8gYmUgdXNlZCBieSB0aGUgaW5kZXggZm9yIHRoYXQgY29sdW1uLlxuICAgKiBGb3IgZXhhbXBsZSwgYSBCLXRyZWUgaW5kZXggb24gZm91ci1ieXRlIGludGVnZXJzIHdvdWxkIHVzZSB0aGUgaW50NF9vcHMgY2xhc3M7XG4gICAqIHRoaXMgb3BlcmF0b3IgY2xhc3MgaW5jbHVkZXMgY29tcGFyaXNvbiBmdW5jdGlvbnMgZm9yIGZvdXItYnl0ZSBpbnRlZ2Vycy5cbiAgICogSW4gcHJhY3RpY2UgdGhlIGRlZmF1bHQgb3BlcmF0b3IgY2xhc3MgZm9yIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUgaXMgdXN1YWxseSBzdWZmaWNpZW50LlxuICAgKiBUaGUgbWFpbiBwb2ludCBvZiBoYXZpbmcgb3BlcmF0b3IgY2xhc3NlcyBpcyB0aGF0IGZvciBzb21lIGRhdGEgdHlwZXMsIHRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgbWVhbmluZ2Z1bCBvcmRlcmluZy5cbiAgICogRm9yIGV4YW1wbGUsIHdlIG1pZ2h0IHdhbnQgdG8gc29ydCBhIGNvbXBsZXgtbnVtYmVyIGRhdGEgdHlwZSBlaXRoZXIgYnkgYWJzb2x1dGUgdmFsdWUgb3IgYnkgcmVhbCBwYXJ0LlxuICAgKiBXZSBjb3VsZCBkbyB0aGlzIGJ5IGRlZmluaW5nIHR3byBvcGVyYXRvciBjbGFzc2VzIGZvciB0aGUgZGF0YSB0eXBlIGFuZCB0aGVuIHNlbGVjdGluZyB0aGUgcHJvcGVyIGNsYXNzIHdoZW4gY3JlYXRpbmcgYW4gaW5kZXguXG4gICAqIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3BlcmF0b3IgY2xhc3NlcyBjaGVjazpcbiAgICpcbiAgICogIyMjIFVzZWZ1bCBsaW5rc1xuICAgKiBodHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzL2N1cnJlbnQvc3FsLWNyZWF0ZWluZGV4Lmh0bWxcbiAgICpcbiAgICogaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvZG9jcy9jdXJyZW50L2luZGV4ZXMtb3BjbGFzcy5odG1sXG4gICAqXG4gICAqIGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC94aW5kZXguaHRtbFxuICAgKlxuICAgKiAjIyMgQWRkaXRpb25hbCB0eXBlc1xuICAgKiBJZiB5b3UgaGF2ZSB0aGUgYHBnX3ZlY3RvcmAgZXh0ZW5zaW9uIGluc3RhbGxlZCBpbiB5b3VyIGRhdGFiYXNlLCB5b3UgY2FuIHVzZSB0aGVcbiAgICogYHZlY3Rvcl9sMl9vcHNgLCBgdmVjdG9yX2lwX29wc2AsIGB2ZWN0b3JfY29zaW5lX29wc2AsIGB2ZWN0b3JfbDFfb3BzYCwgYGJpdF9oYW1taW5nX29wc2AsIGBiaXRfamFjY2FyZF9vcHNgLCBgaGFsZnZlY19sMl9vcHNgLCBgc3BhcnNldmVjX2wyX29wc2Agb3B0aW9ucywgd2hpY2ggYXJlIHByZWRlZmluZWQgdHlwZXMuXG4gICAqXG4gICAqICoqWW91IGNhbiBhbHdheXMgc3BlY2lmeSBhbnkgc3RyaW5nIHlvdSB3YW50IGluIHRoZSBvcGVyYXRvciBjbGFzcywgaW4gY2FzZSBEcml6emxlIGRvZXNuJ3QgaGF2ZSBpdCBuYXRpdmVseSBpbiBpdHMgdHlwZXMqKlxuICAgKlxuICAgKiBAcGFyYW0gb3BDbGFzc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgb3Aob3BDbGFzcykge1xuICAgIHRoaXMuaW5kZXhDb25maWcub3BDbGFzcyA9IG9wQ2xhc3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmNsYXNzIEluZGV4ZWRDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJJbmRleGVkQ29sdW1uXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGtleUFzTmFtZSwgdHlwZSwgaW5kZXhDb25maWcpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMua2V5QXNOYW1lID0ga2V5QXNOYW1lO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5pbmRleENvbmZpZyA9IGluZGV4Q29uZmlnO1xuICB9XG4gIG5hbWU7XG4gIGtleUFzTmFtZTtcbiAgdHlwZTtcbiAgaW5kZXhDb25maWc7XG59XG5jbGFzcyBQZ0FycmF5QnVpbGRlciBleHRlbmRzIFBnQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnQXJyYXlCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGJhc2VCdWlsZGVyLCBzaXplKSB7XG4gICAgc3VwZXIobmFtZSwgXCJhcnJheVwiLCBcIlBnQXJyYXlcIik7XG4gICAgdGhpcy5jb25maWcuYmFzZUJ1aWxkZXIgPSBiYXNlQnVpbGRlcjtcbiAgICB0aGlzLmNvbmZpZy5zaXplID0gc2l6ZTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgY29uc3QgYmFzZUNvbHVtbiA9IHRoaXMuY29uZmlnLmJhc2VCdWlsZGVyLmJ1aWxkKHRhYmxlKTtcbiAgICByZXR1cm4gbmV3IFBnQXJyYXkoXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgYmFzZUNvbHVtblxuICAgICk7XG4gIH1cbn1cbmNsYXNzIFBnQXJyYXkgZXh0ZW5kcyBQZ0NvbHVtbiB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcsIGJhc2VDb2x1bW4sIHJhbmdlKSB7XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gICAgdGhpcy5iYXNlQ29sdW1uID0gYmFzZUNvbHVtbjtcbiAgICB0aGlzLnJhbmdlID0gcmFuZ2U7XG4gICAgdGhpcy5zaXplID0gY29uZmlnLnNpemU7XG4gIH1cbiAgc2l6ZTtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdBcnJheVwiO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmJhc2VDb2x1bW4uZ2V0U1FMVHlwZSgpfVske3R5cGVvZiB0aGlzLnNpemUgPT09IFwibnVtYmVyXCIgPyB0aGlzLnNpemUgOiBcIlwifV1gO1xuICB9XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZhbHVlID0gcGFyc2VQZ0FycmF5KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLm1hcCgodikgPT4gdGhpcy5iYXNlQ29sdW1uLm1hcEZyb21Ecml2ZXJWYWx1ZSh2KSk7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSwgaXNOZXN0ZWRBcnJheSA9IGZhbHNlKSB7XG4gICAgY29uc3QgYSA9IHZhbHVlLm1hcChcbiAgICAgICh2KSA9PiB2ID09PSBudWxsID8gbnVsbCA6IGlzKHRoaXMuYmFzZUNvbHVtbiwgUGdBcnJheSkgPyB0aGlzLmJhc2VDb2x1bW4ubWFwVG9Ecml2ZXJWYWx1ZSh2LCB0cnVlKSA6IHRoaXMuYmFzZUNvbHVtbi5tYXBUb0RyaXZlclZhbHVlKHYpXG4gICAgKTtcbiAgICBpZiAoaXNOZXN0ZWRBcnJheSkgcmV0dXJuIGE7XG4gICAgcmV0dXJuIG1ha2VQZ0FycmF5KGEpO1xuICB9XG59XG5leHBvcnQge1xuICBFeHRyYUNvbmZpZ0NvbHVtbixcbiAgSW5kZXhlZENvbHVtbixcbiAgUGdBcnJheSxcbiAgUGdBcnJheUJ1aWxkZXIsXG4gIFBnQ29sdW1uLFxuICBQZ0NvbHVtbkJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21tb24uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUGdDb2x1bW4sIFBnQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgUGdFbnVtT2JqZWN0Q29sdW1uQnVpbGRlciBleHRlbmRzIFBnQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnRW51bU9iamVjdENvbHVtbkJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgZW51bUluc3RhbmNlKSB7XG4gICAgc3VwZXIobmFtZSwgXCJzdHJpbmdcIiwgXCJQZ0VudW1PYmplY3RDb2x1bW5cIik7XG4gICAgdGhpcy5jb25maWcuZW51bSA9IGVudW1JbnN0YW5jZTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBQZ0VudW1PYmplY3RDb2x1bW4oXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgUGdFbnVtT2JqZWN0Q29sdW1uIGV4dGVuZHMgUGdDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0VudW1PYmplY3RDb2x1bW5cIjtcbiAgZW51bTtcbiAgZW51bVZhbHVlcyA9IHRoaXMuY29uZmlnLmVudW0uZW51bVZhbHVlcztcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICAgIHRoaXMuZW51bSA9IGNvbmZpZy5lbnVtO1xuICB9XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW51bS5lbnVtTmFtZTtcbiAgfVxufVxuY29uc3QgaXNQZ0VudW1TeW0gPSBTeW1ib2wuZm9yKFwiZHJpenpsZTppc1BnRW51bVwiKTtcbmZ1bmN0aW9uIGlzUGdFbnVtKG9iaikge1xuICByZXR1cm4gISFvYmogJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiICYmIGlzUGdFbnVtU3ltIGluIG9iaiAmJiBvYmpbaXNQZ0VudW1TeW1dID09PSB0cnVlO1xufVxuY2xhc3MgUGdFbnVtQ29sdW1uQnVpbGRlciBleHRlbmRzIFBnQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnRW51bUNvbHVtbkJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgZW51bUluc3RhbmNlKSB7XG4gICAgc3VwZXIobmFtZSwgXCJzdHJpbmdcIiwgXCJQZ0VudW1Db2x1bW5cIik7XG4gICAgdGhpcy5jb25maWcuZW51bSA9IGVudW1JbnN0YW5jZTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBQZ0VudW1Db2x1bW4oXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgUGdFbnVtQ29sdW1uIGV4dGVuZHMgUGdDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0VudW1Db2x1bW5cIjtcbiAgZW51bSA9IHRoaXMuY29uZmlnLmVudW07XG4gIGVudW1WYWx1ZXMgPSB0aGlzLmNvbmZpZy5lbnVtLmVudW1WYWx1ZXM7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICBzdXBlcih0YWJsZSwgY29uZmlnKTtcbiAgICB0aGlzLmVudW0gPSBjb25maWcuZW51bTtcbiAgfVxuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmVudW0uZW51bU5hbWU7XG4gIH1cbn1cbmZ1bmN0aW9uIHBnRW51bShlbnVtTmFtZSwgaW5wdXQpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5wdXQpID8gcGdFbnVtV2l0aFNjaGVtYShlbnVtTmFtZSwgWy4uLmlucHV0XSwgdm9pZCAwKSA6IHBnRW51bU9iamVjdFdpdGhTY2hlbWEoZW51bU5hbWUsIGlucHV0LCB2b2lkIDApO1xufVxuZnVuY3Rpb24gcGdFbnVtV2l0aFNjaGVtYShlbnVtTmFtZSwgdmFsdWVzLCBzY2hlbWEpIHtcbiAgY29uc3QgZW51bUluc3RhbmNlID0gT2JqZWN0LmFzc2lnbihcbiAgICAobmFtZSkgPT4gbmV3IFBnRW51bUNvbHVtbkJ1aWxkZXIobmFtZSA/PyBcIlwiLCBlbnVtSW5zdGFuY2UpLFxuICAgIHtcbiAgICAgIGVudW1OYW1lLFxuICAgICAgZW51bVZhbHVlczogdmFsdWVzLFxuICAgICAgc2NoZW1hLFxuICAgICAgW2lzUGdFbnVtU3ltXTogdHJ1ZVxuICAgIH1cbiAgKTtcbiAgcmV0dXJuIGVudW1JbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIHBnRW51bU9iamVjdFdpdGhTY2hlbWEoZW51bU5hbWUsIHZhbHVlcywgc2NoZW1hKSB7XG4gIGNvbnN0IGVudW1JbnN0YW5jZSA9IE9iamVjdC5hc3NpZ24oXG4gICAgKG5hbWUpID0+IG5ldyBQZ0VudW1PYmplY3RDb2x1bW5CdWlsZGVyKG5hbWUgPz8gXCJcIiwgZW51bUluc3RhbmNlKSxcbiAgICB7XG4gICAgICBlbnVtTmFtZSxcbiAgICAgIGVudW1WYWx1ZXM6IE9iamVjdC52YWx1ZXModmFsdWVzKSxcbiAgICAgIHNjaGVtYSxcbiAgICAgIFtpc1BnRW51bVN5bV06IHRydWVcbiAgICB9XG4gICk7XG4gIHJldHVybiBlbnVtSW5zdGFuY2U7XG59XG5leHBvcnQge1xuICBQZ0VudW1Db2x1bW4sXG4gIFBnRW51bUNvbHVtbkJ1aWxkZXIsXG4gIFBnRW51bU9iamVjdENvbHVtbixcbiAgUGdFbnVtT2JqZWN0Q29sdW1uQnVpbGRlcixcbiAgaXNQZ0VudW0sXG4gIHBnRW51bSxcbiAgcGdFbnVtT2JqZWN0V2l0aFNjaGVtYSxcbiAgcGdFbnVtV2l0aFNjaGVtYVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVudW0uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5jbGFzcyBTdWJxdWVyeSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlN1YnF1ZXJ5XCI7XG4gIGNvbnN0cnVjdG9yKHNxbCwgZmllbGRzLCBhbGlhcywgaXNXaXRoID0gZmFsc2UsIHVzZWRUYWJsZXMgPSBbXSkge1xuICAgIHRoaXMuXyA9IHtcbiAgICAgIGJyYW5kOiBcIlN1YnF1ZXJ5XCIsXG4gICAgICBzcWwsXG4gICAgICBzZWxlY3RlZEZpZWxkczogZmllbGRzLFxuICAgICAgYWxpYXMsXG4gICAgICBpc1dpdGgsXG4gICAgICB1c2VkVGFibGVzXG4gICAgfTtcbiAgfVxuICAvLyBnZXRTUUwoKTogU1FMPHVua25vd24+IHtcbiAgLy8gXHRyZXR1cm4gbmV3IFNRTChbdGhpc10pO1xuICAvLyB9XG59XG5jbGFzcyBXaXRoU3VicXVlcnkgZXh0ZW5kcyBTdWJxdWVyeSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIldpdGhTdWJxdWVyeVwiO1xufVxuZXhwb3J0IHtcbiAgU3VicXVlcnksXG4gIFdpdGhTdWJxdWVyeVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1YnF1ZXJ5LmpzLm1hcCIsCiAgICAiLy8gcGFja2FnZS5qc29uXG52YXIgdmVyc2lvbiA9IFwiMC40NC41XCI7XG5cbi8vIHNyYy92ZXJzaW9uLnRzXG52YXIgY29tcGF0aWJpbGl0eVZlcnNpb24gPSAxMDtcbmV4cG9ydCB7XG4gIGNvbXBhdGliaWxpdHlWZXJzaW9uLFxuICB2ZXJzaW9uIGFzIG5wbVZlcnNpb25cbn07XG4iLAogICAgImltcG9ydCB7IGlpZmUgfSBmcm9tIFwiLi90cmFjaW5nLXV0aWxzLmpzXCI7XG5pbXBvcnQgeyBucG1WZXJzaW9uIH0gZnJvbSBcIi4vdmVyc2lvbi5qc1wiO1xubGV0IG90ZWw7XG5sZXQgcmF3VHJhY2VyO1xuY29uc3QgdHJhY2VyID0ge1xuICBzdGFydEFjdGl2ZVNwYW4obmFtZSwgZm4pIHtcbiAgICBpZiAoIW90ZWwpIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cbiAgICBpZiAoIXJhd1RyYWNlcikge1xuICAgICAgcmF3VHJhY2VyID0gb3RlbC50cmFjZS5nZXRUcmFjZXIoXCJkcml6emxlLW9ybVwiLCBucG1WZXJzaW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIGlpZmUoXG4gICAgICAob3RlbDIsIHJhd1RyYWNlcjIpID0+IHJhd1RyYWNlcjIuc3RhcnRBY3RpdmVTcGFuKFxuICAgICAgICBuYW1lLFxuICAgICAgICAoc3BhbikgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZm4oc3Bhbik7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgICAgICBjb2RlOiBvdGVsMi5TcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogXCJVbmtub3duIGVycm9yXCJcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1pbnN0YW5jZW9mL25vLWluc3RhbmNlb2ZcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgICBvdGVsLFxuICAgICAgcmF3VHJhY2VyXG4gICAgKTtcbiAgfVxufTtcbmV4cG9ydCB7XG4gIHRyYWNlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYWNpbmcuanMubWFwIiwKICAgICJjb25zdCBWaWV3QmFzZUNvbmZpZyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOlZpZXdCYXNlQ29uZmlnXCIpO1xuZXhwb3J0IHtcbiAgVmlld0Jhc2VDb25maWdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD12aWV3LWNvbW1vbi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlTmFtZSB9IGZyb20gXCIuL3RhYmxlLnV0aWxzLmpzXCI7XG5jb25zdCBTY2hlbWEgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpTY2hlbWFcIik7XG5jb25zdCBDb2x1bW5zID0gU3ltYm9sLmZvcihcImRyaXp6bGU6Q29sdW1uc1wiKTtcbmNvbnN0IEV4dHJhQ29uZmlnQ29sdW1ucyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOkV4dHJhQ29uZmlnQ29sdW1uc1wiKTtcbmNvbnN0IE9yaWdpbmFsTmFtZSA9IFN5bWJvbC5mb3IoXCJkcml6emxlOk9yaWdpbmFsTmFtZVwiKTtcbmNvbnN0IEJhc2VOYW1lID0gU3ltYm9sLmZvcihcImRyaXp6bGU6QmFzZU5hbWVcIik7XG5jb25zdCBJc0FsaWFzID0gU3ltYm9sLmZvcihcImRyaXp6bGU6SXNBbGlhc1wiKTtcbmNvbnN0IEV4dHJhQ29uZmlnQnVpbGRlciA9IFN5bWJvbC5mb3IoXCJkcml6emxlOkV4dHJhQ29uZmlnQnVpbGRlclwiKTtcbmNvbnN0IElzRHJpenpsZVRhYmxlID0gU3ltYm9sLmZvcihcImRyaXp6bGU6SXNEcml6emxlVGFibGVcIik7XG5jbGFzcyBUYWJsZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlRhYmxlXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIFN5bWJvbCA9IHtcbiAgICBOYW1lOiBUYWJsZU5hbWUsXG4gICAgU2NoZW1hLFxuICAgIE9yaWdpbmFsTmFtZSxcbiAgICBDb2x1bW5zLFxuICAgIEV4dHJhQ29uZmlnQ29sdW1ucyxcbiAgICBCYXNlTmFtZSxcbiAgICBJc0FsaWFzLFxuICAgIEV4dHJhQ29uZmlnQnVpbGRlclxuICB9O1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIENhbiBiZSBjaGFuZ2VkIGlmIHRoZSB0YWJsZSBpcyBhbGlhc2VkLlxuICAgKi9cbiAgW1RhYmxlTmFtZV07XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogVXNlZCB0byBzdG9yZSB0aGUgb3JpZ2luYWwgbmFtZSBvZiB0aGUgdGFibGUsIGJlZm9yZSBhbnkgYWxpYXNpbmcuXG4gICAqL1xuICBbT3JpZ2luYWxOYW1lXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbU2NoZW1hXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbQ29sdW1uc107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0V4dHJhQ29uZmlnQ29sdW1uc107XG4gIC8qKlxuICAgKiAgQGludGVybmFsXG4gICAqIFVzZWQgdG8gc3RvcmUgdGhlIHRhYmxlIG5hbWUgYmVmb3JlIHRoZSB0cmFuc2Zvcm1hdGlvbiB2aWEgdGhlIGB0YWJsZUNyZWF0b3JgIGZ1bmN0aW9ucy5cbiAgICovXG4gIFtCYXNlTmFtZV07XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0lzQWxpYXNdID0gZmFsc2U7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0lzRHJpenpsZVRhYmxlXSA9IHRydWU7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0V4dHJhQ29uZmlnQnVpbGRlcl0gPSB2b2lkIDA7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIHNjaGVtYSwgYmFzZU5hbWUpIHtcbiAgICB0aGlzW1RhYmxlTmFtZV0gPSB0aGlzW09yaWdpbmFsTmFtZV0gPSBuYW1lO1xuICAgIHRoaXNbU2NoZW1hXSA9IHNjaGVtYTtcbiAgICB0aGlzW0Jhc2VOYW1lXSA9IGJhc2VOYW1lO1xuICB9XG59XG5mdW5jdGlvbiBpc1RhYmxlKHRhYmxlKSB7XG4gIHJldHVybiB0eXBlb2YgdGFibGUgPT09IFwib2JqZWN0XCIgJiYgdGFibGUgIT09IG51bGwgJiYgSXNEcml6emxlVGFibGUgaW4gdGFibGU7XG59XG5mdW5jdGlvbiBnZXRUYWJsZU5hbWUodGFibGUpIHtcbiAgcmV0dXJuIHRhYmxlW1RhYmxlTmFtZV07XG59XG5mdW5jdGlvbiBnZXRUYWJsZVVuaXF1ZU5hbWUodGFibGUpIHtcbiAgcmV0dXJuIGAke3RhYmxlW1NjaGVtYV0gPz8gXCJwdWJsaWNcIn0uJHt0YWJsZVtUYWJsZU5hbWVdfWA7XG59XG5leHBvcnQge1xuICBCYXNlTmFtZSxcbiAgQ29sdW1ucyxcbiAgRXh0cmFDb25maWdCdWlsZGVyLFxuICBFeHRyYUNvbmZpZ0NvbHVtbnMsXG4gIElzQWxpYXMsXG4gIE9yaWdpbmFsTmFtZSxcbiAgU2NoZW1hLFxuICBUYWJsZSxcbiAgZ2V0VGFibGVOYW1lLFxuICBnZXRUYWJsZVVuaXF1ZU5hbWUsXG4gIGlzVGFibGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YWJsZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgaXNQZ0VudW0gfSBmcm9tIFwiLi4vcGctY29yZS9jb2x1bW5zL2VudW0uanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyB0cmFjZXIgfSBmcm9tIFwiLi4vdHJhY2luZy5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi4vdmlldy1jb21tb24uanNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IElzQWxpYXMsIFRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5jbGFzcyBGYWtlUHJpbWl0aXZlUGFyYW0ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJGYWtlUHJpbWl0aXZlUGFyYW1cIjtcbn1cbmZ1bmN0aW9uIGlzU1FMV3JhcHBlcih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCAmJiB0eXBlb2YgdmFsdWUuZ2V0U1FMID09PSBcImZ1bmN0aW9uXCI7XG59XG5mdW5jdGlvbiBtZXJnZVF1ZXJpZXMocXVlcmllcykge1xuICBjb25zdCByZXN1bHQgPSB7IHNxbDogXCJcIiwgcGFyYW1zOiBbXSB9O1xuICBmb3IgKGNvbnN0IHF1ZXJ5IG9mIHF1ZXJpZXMpIHtcbiAgICByZXN1bHQuc3FsICs9IHF1ZXJ5LnNxbDtcbiAgICByZXN1bHQucGFyYW1zLnB1c2goLi4ucXVlcnkucGFyYW1zKTtcbiAgICBpZiAocXVlcnkudHlwaW5ncz8ubGVuZ3RoKSB7XG4gICAgICBpZiAoIXJlc3VsdC50eXBpbmdzKSB7XG4gICAgICAgIHJlc3VsdC50eXBpbmdzID0gW107XG4gICAgICB9XG4gICAgICByZXN1bHQudHlwaW5ncy5wdXNoKC4uLnF1ZXJ5LnR5cGluZ3MpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuY2xhc3MgU3RyaW5nQ2h1bmsge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTdHJpbmdDaHVua1wiO1xuICB2YWx1ZTtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICB0aGlzLnZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gIH1cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG4gIH1cbn1cbmNsYXNzIFNRTCB7XG4gIGNvbnN0cnVjdG9yKHF1ZXJ5Q2h1bmtzKSB7XG4gICAgdGhpcy5xdWVyeUNodW5rcyA9IHF1ZXJ5Q2h1bmtzO1xuICAgIGZvciAoY29uc3QgY2h1bmsgb2YgcXVlcnlDaHVua3MpIHtcbiAgICAgIGlmIChpcyhjaHVuaywgVGFibGUpKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBjaHVua1tUYWJsZS5TeW1ib2wuU2NoZW1hXTtcbiAgICAgICAgdGhpcy51c2VkVGFibGVzLnB1c2goXG4gICAgICAgICAgc2NoZW1hTmFtZSA9PT0gdm9pZCAwID8gY2h1bmtbVGFibGUuU3ltYm9sLk5hbWVdIDogc2NoZW1hTmFtZSArIFwiLlwiICsgY2h1bmtbVGFibGUuU3ltYm9sLk5hbWVdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTFwiO1xuICAvKiogQGludGVybmFsICovXG4gIGRlY29kZXIgPSBub29wRGVjb2RlcjtcbiAgc2hvdWxkSW5saW5lUGFyYW1zID0gZmFsc2U7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgdXNlZFRhYmxlcyA9IFtdO1xuICBhcHBlbmQocXVlcnkpIHtcbiAgICB0aGlzLnF1ZXJ5Q2h1bmtzLnB1c2goLi4ucXVlcnkucXVlcnlDaHVua3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHRvUXVlcnkoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRyYWNlci5zdGFydEFjdGl2ZVNwYW4oXCJkcml6emxlLmJ1aWxkU1FMXCIsIChzcGFuKSA9PiB7XG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXModGhpcy5xdWVyeUNodW5rcywgY29uZmlnKTtcbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICBcImRyaXp6bGUucXVlcnkudGV4dFwiOiBxdWVyeS5zcWwsXG4gICAgICAgIFwiZHJpenpsZS5xdWVyeS5wYXJhbXNcIjogSlNPTi5zdHJpbmdpZnkocXVlcnkucGFyYW1zKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcXVlcnk7XG4gICAgfSk7XG4gIH1cbiAgYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMoY2h1bmtzLCBfY29uZmlnKSB7XG4gICAgY29uc3QgY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgX2NvbmZpZywge1xuICAgICAgaW5saW5lUGFyYW1zOiBfY29uZmlnLmlubGluZVBhcmFtcyB8fCB0aGlzLnNob3VsZElubGluZVBhcmFtcyxcbiAgICAgIHBhcmFtU3RhcnRJbmRleDogX2NvbmZpZy5wYXJhbVN0YXJ0SW5kZXggfHwgeyB2YWx1ZTogMCB9XG4gICAgfSk7XG4gICAgY29uc3Qge1xuICAgICAgY2FzaW5nLFxuICAgICAgZXNjYXBlTmFtZSxcbiAgICAgIGVzY2FwZVBhcmFtLFxuICAgICAgcHJlcGFyZVR5cGluZyxcbiAgICAgIGlubGluZVBhcmFtcyxcbiAgICAgIHBhcmFtU3RhcnRJbmRleFxuICAgIH0gPSBjb25maWc7XG4gICAgcmV0dXJuIG1lcmdlUXVlcmllcyhjaHVua3MubWFwKChjaHVuaykgPT4ge1xuICAgICAgaWYgKGlzKGNodW5rLCBTdHJpbmdDaHVuaykpIHtcbiAgICAgICAgcmV0dXJuIHsgc3FsOiBjaHVuay52YWx1ZS5qb2luKFwiXCIpLCBwYXJhbXM6IFtdIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIE5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjaHVuay52YWx1ZSksIHBhcmFtczogW10gfTtcbiAgICAgIH1cbiAgICAgIGlmIChjaHVuayA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHJldHVybiB7IHNxbDogXCJcIiwgcGFyYW1zOiBbXSB9O1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2h1bmspKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtuZXcgU3RyaW5nQ2h1bmsoXCIoXCIpXTtcbiAgICAgICAgZm9yIChjb25zdCBbaSwgcF0gb2YgY2h1bmsuZW50cmllcygpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2gocCk7XG4gICAgICAgICAgaWYgKGkgPCBjaHVuay5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChuZXcgU3RyaW5nQ2h1bmsoXCIsIFwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKG5ldyBTdHJpbmdDaHVuayhcIilcIikpO1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhyZXN1bHQsIGNvbmZpZyk7XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFNRTCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMoY2h1bmsucXVlcnlDaHVua3MsIHtcbiAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgaW5saW5lUGFyYW1zOiBpbmxpbmVQYXJhbXMgfHwgY2h1bmsuc2hvdWxkSW5saW5lUGFyYW1zXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBUYWJsZSkpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IGNodW5rW1RhYmxlLlN5bWJvbC5TY2hlbWFdO1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBjaHVua1tUYWJsZS5TeW1ib2wuTmFtZV07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3FsOiBzY2hlbWFOYW1lID09PSB2b2lkIDAgfHwgY2h1bmtbSXNBbGlhc10gPyBlc2NhcGVOYW1lKHRhYmxlTmFtZSkgOiBlc2NhcGVOYW1lKHNjaGVtYU5hbWUpICsgXCIuXCIgKyBlc2NhcGVOYW1lKHRhYmxlTmFtZSksXG4gICAgICAgICAgcGFyYW1zOiBbXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBDb2x1bW4pKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBjYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGNodW5rKTtcbiAgICAgICAgaWYgKF9jb25maWcuaW52b2tlU291cmNlID09PSBcImluZGV4ZXNcIikge1xuICAgICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjb2x1bW5OYW1lKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBjaHVuay50YWJsZVtUYWJsZS5TeW1ib2wuU2NoZW1hXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzcWw6IGNodW5rLnRhYmxlW0lzQWxpYXNdIHx8IHNjaGVtYU5hbWUgPT09IHZvaWQgMCA/IGVzY2FwZU5hbWUoY2h1bmsudGFibGVbVGFibGUuU3ltYm9sLk5hbWVdKSArIFwiLlwiICsgZXNjYXBlTmFtZShjb2x1bW5OYW1lKSA6IGVzY2FwZU5hbWUoc2NoZW1hTmFtZSkgKyBcIi5cIiArIGVzY2FwZU5hbWUoY2h1bmsudGFibGVbVGFibGUuU3ltYm9sLk5hbWVdKSArIFwiLlwiICsgZXNjYXBlTmFtZShjb2x1bW5OYW1lKSxcbiAgICAgICAgICBwYXJhbXM6IFtdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFZpZXcpKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBjaHVua1tWaWV3QmFzZUNvbmZpZ10uc2NoZW1hO1xuICAgICAgICBjb25zdCB2aWV3TmFtZSA9IGNodW5rW1ZpZXdCYXNlQ29uZmlnXS5uYW1lO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNxbDogc2NoZW1hTmFtZSA9PT0gdm9pZCAwIHx8IGNodW5rW1ZpZXdCYXNlQ29uZmlnXS5pc0FsaWFzID8gZXNjYXBlTmFtZSh2aWV3TmFtZSkgOiBlc2NhcGVOYW1lKHNjaGVtYU5hbWUpICsgXCIuXCIgKyBlc2NhcGVOYW1lKHZpZXdOYW1lKSxcbiAgICAgICAgICBwYXJhbXM6IFtdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFBhcmFtKSkge1xuICAgICAgICBpZiAoaXMoY2h1bmsudmFsdWUsIFBsYWNlaG9sZGVyKSkge1xuICAgICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlUGFyYW0ocGFyYW1TdGFydEluZGV4LnZhbHVlKyssIGNodW5rKSwgcGFyYW1zOiBbY2h1bmtdLCB0eXBpbmdzOiBbXCJub25lXCJdIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWFwcGVkVmFsdWUgPSBjaHVuay52YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBjaHVuay5lbmNvZGVyLm1hcFRvRHJpdmVyVmFsdWUoY2h1bmsudmFsdWUpO1xuICAgICAgICBpZiAoaXMobWFwcGVkVmFsdWUsIFNRTCkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhbbWFwcGVkVmFsdWVdLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmxpbmVQYXJhbXMpIHtcbiAgICAgICAgICByZXR1cm4geyBzcWw6IHRoaXMubWFwSW5saW5lUGFyYW0obWFwcGVkVmFsdWUsIGNvbmZpZyksIHBhcmFtczogW10gfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdHlwaW5ncyA9IFtcIm5vbmVcIl07XG4gICAgICAgIGlmIChwcmVwYXJlVHlwaW5nKSB7XG4gICAgICAgICAgdHlwaW5ncyA9IFtwcmVwYXJlVHlwaW5nKGNodW5rLmVuY29kZXIpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZVBhcmFtKHBhcmFtU3RhcnRJbmRleC52YWx1ZSsrLCBtYXBwZWRWYWx1ZSksIHBhcmFtczogW21hcHBlZFZhbHVlXSwgdHlwaW5ncyB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBQbGFjZWhvbGRlcikpIHtcbiAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVQYXJhbShwYXJhbVN0YXJ0SW5kZXgudmFsdWUrKywgY2h1bmspLCBwYXJhbXM6IFtjaHVua10sIHR5cGluZ3M6IFtcIm5vbmVcIl0gfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgU1FMLkFsaWFzZWQpICYmIGNodW5rLmZpZWxkQWxpYXMgIT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZU5hbWUoY2h1bmsuZmllbGRBbGlhcyksIHBhcmFtczogW10gfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgU3VicXVlcnkpKSB7XG4gICAgICAgIGlmIChjaHVuay5fLmlzV2l0aCkge1xuICAgICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjaHVuay5fLmFsaWFzKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKFtcbiAgICAgICAgICBuZXcgU3RyaW5nQ2h1bmsoXCIoXCIpLFxuICAgICAgICAgIGNodW5rLl8uc3FsLFxuICAgICAgICAgIG5ldyBTdHJpbmdDaHVuayhcIikgXCIpLFxuICAgICAgICAgIG5ldyBOYW1lKGNodW5rLl8uYWxpYXMpXG4gICAgICAgIF0sIGNvbmZpZyk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQZ0VudW0oY2h1bmspKSB7XG4gICAgICAgIGlmIChjaHVuay5zY2hlbWEpIHtcbiAgICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZU5hbWUoY2h1bmsuc2NoZW1hKSArIFwiLlwiICsgZXNjYXBlTmFtZShjaHVuay5lbnVtTmFtZSksIHBhcmFtczogW10gfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZU5hbWUoY2h1bmsuZW51bU5hbWUpLCBwYXJhbXM6IFtdIH07XG4gICAgICB9XG4gICAgICBpZiAoaXNTUUxXcmFwcGVyKGNodW5rKSkge1xuICAgICAgICBpZiAoY2h1bmsuc2hvdWxkT21pdFNRTFBhcmVucz8uKCkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhbY2h1bmsuZ2V0U1FMKCldLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKFtcbiAgICAgICAgICBuZXcgU3RyaW5nQ2h1bmsoXCIoXCIpLFxuICAgICAgICAgIGNodW5rLmdldFNRTCgpLFxuICAgICAgICAgIG5ldyBTdHJpbmdDaHVuayhcIilcIilcbiAgICAgICAgXSwgY29uZmlnKTtcbiAgICAgIH1cbiAgICAgIGlmIChpbmxpbmVQYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIHsgc3FsOiB0aGlzLm1hcElubGluZVBhcmFtKGNodW5rLCBjb25maWcpLCBwYXJhbXM6IFtdIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBzcWw6IGVzY2FwZVBhcmFtKHBhcmFtU3RhcnRJbmRleC52YWx1ZSsrLCBjaHVuayksIHBhcmFtczogW2NodW5rXSwgdHlwaW5nczogW1wibm9uZVwiXSB9O1xuICAgIH0pKTtcbiAgfVxuICBtYXBJbmxpbmVQYXJhbShjaHVuaywgeyBlc2NhcGVTdHJpbmcgfSkge1xuICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNodW5rID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiBjaHVuayA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiBjaHVuay50b1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZXNjYXBlU3RyaW5nKGNodW5rKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgbWFwcGVkVmFsdWVBc1N0cmluZyA9IGNodW5rLnRvU3RyaW5nKCk7XG4gICAgICBpZiAobWFwcGVkVmFsdWVBc1N0cmluZyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgICAgICByZXR1cm4gZXNjYXBlU3RyaW5nKEpTT04uc3RyaW5naWZ5KGNodW5rKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXNjYXBlU3RyaW5nKG1hcHBlZFZhbHVlQXNTdHJpbmcpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIHBhcmFtIHZhbHVlOiBcIiArIGNodW5rKTtcbiAgfVxuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgYXMoYWxpYXMpIHtcbiAgICBpZiAoYWxpYXMgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU1FMLkFsaWFzZWQodGhpcywgYWxpYXMpO1xuICB9XG4gIG1hcFdpdGgoZGVjb2Rlcikge1xuICAgIHRoaXMuZGVjb2RlciA9IHR5cGVvZiBkZWNvZGVyID09PSBcImZ1bmN0aW9uXCIgPyB7IG1hcEZyb21Ecml2ZXJWYWx1ZTogZGVjb2RlciB9IDogZGVjb2RlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBpbmxpbmVQYXJhbXMoKSB7XG4gICAgdGhpcy5zaG91bGRJbmxpbmVQYXJhbXMgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgaW5jbHVkZSBhIHBhcnQgb2YgdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBAcGFyYW0gY29uZGl0aW9uIC0gQ29uZGl0aW9uIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIGl0c2VsZiBpZiB0aGUgY29uZGl0aW9uIGlzIGB0cnVlYCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgXG4gICAqL1xuICBpZihjb25kaXRpb24pIHtcbiAgICByZXR1cm4gY29uZGl0aW9uID8gdGhpcyA6IHZvaWQgMDtcbiAgfVxufVxuY2xhc3MgTmFtZSB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIk5hbWVcIjtcbiAgYnJhbmQ7XG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xuICB9XG59XG5mdW5jdGlvbiBuYW1lKHZhbHVlKSB7XG4gIHJldHVybiBuZXcgTmFtZSh2YWx1ZSk7XG59XG5mdW5jdGlvbiBpc0RyaXZlclZhbHVlRW5jb2Rlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIFwibWFwVG9Ecml2ZXJWYWx1ZVwiIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5tYXBUb0RyaXZlclZhbHVlID09PSBcImZ1bmN0aW9uXCI7XG59XG5jb25zdCBub29wRGVjb2RlciA9IHtcbiAgbWFwRnJvbURyaXZlclZhbHVlOiAodmFsdWUpID0+IHZhbHVlXG59O1xuY29uc3Qgbm9vcEVuY29kZXIgPSB7XG4gIG1hcFRvRHJpdmVyVmFsdWU6ICh2YWx1ZSkgPT4gdmFsdWVcbn07XG5jb25zdCBub29wTWFwcGVyID0ge1xuICAuLi5ub29wRGVjb2RlcixcbiAgLi4ubm9vcEVuY29kZXJcbn07XG5jbGFzcyBQYXJhbSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBQYXJhbWV0ZXIgdmFsdWVcbiAgICogQHBhcmFtIGVuY29kZXIgLSBFbmNvZGVyIHRvIGNvbnZlcnQgdGhlIHZhbHVlIHRvIGEgZHJpdmVyIHBhcmFtZXRlclxuICAgKi9cbiAgY29uc3RydWN0b3IodmFsdWUsIGVuY29kZXIgPSBub29wRW5jb2Rlcikge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmVuY29kZXIgPSBlbmNvZGVyO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBhcmFtXCI7XG4gIGJyYW5kO1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbiAgfVxufVxuZnVuY3Rpb24gcGFyYW0odmFsdWUsIGVuY29kZXIpIHtcbiAgcmV0dXJuIG5ldyBQYXJhbSh2YWx1ZSwgZW5jb2Rlcik7XG59XG5mdW5jdGlvbiBzcWwoc3RyaW5ncywgLi4ucGFyYW1zKSB7XG4gIGNvbnN0IHF1ZXJ5Q2h1bmtzID0gW107XG4gIGlmIChwYXJhbXMubGVuZ3RoID4gMCB8fCBzdHJpbmdzLmxlbmd0aCA+IDAgJiYgc3RyaW5nc1swXSAhPT0gXCJcIikge1xuICAgIHF1ZXJ5Q2h1bmtzLnB1c2gobmV3IFN0cmluZ0NodW5rKHN0cmluZ3NbMF0pKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtwYXJhbUluZGV4LCBwYXJhbTJdIG9mIHBhcmFtcy5lbnRyaWVzKCkpIHtcbiAgICBxdWVyeUNodW5rcy5wdXNoKHBhcmFtMiwgbmV3IFN0cmluZ0NodW5rKHN0cmluZ3NbcGFyYW1JbmRleCArIDFdKSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTUUwocXVlcnlDaHVua3MpO1xufVxuKChzcWwyKSA9PiB7XG4gIGZ1bmN0aW9uIGVtcHR5KCkge1xuICAgIHJldHVybiBuZXcgU1FMKFtdKTtcbiAgfVxuICBzcWwyLmVtcHR5ID0gZW1wdHk7XG4gIGZ1bmN0aW9uIGZyb21MaXN0KGxpc3QpIHtcbiAgICByZXR1cm4gbmV3IFNRTChsaXN0KTtcbiAgfVxuICBzcWwyLmZyb21MaXN0ID0gZnJvbUxpc3Q7XG4gIGZ1bmN0aW9uIHJhdyhzdHIpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbbmV3IFN0cmluZ0NodW5rKHN0cildKTtcbiAgfVxuICBzcWwyLnJhdyA9IHJhdztcbiAgZnVuY3Rpb24gam9pbihjaHVua3MsIHNlcGFyYXRvcikge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAoY29uc3QgW2ksIGNodW5rXSBvZiBjaHVua3MuZW50cmllcygpKSB7XG4gICAgICBpZiAoaSA+IDAgJiYgc2VwYXJhdG9yICE9PSB2b2lkIDApIHtcbiAgICAgICAgcmVzdWx0LnB1c2goc2VwYXJhdG9yKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKGNodW5rKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTUUwocmVzdWx0KTtcbiAgfVxuICBzcWwyLmpvaW4gPSBqb2luO1xuICBmdW5jdGlvbiBpZGVudGlmaWVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBOYW1lKHZhbHVlKTtcbiAgfVxuICBzcWwyLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICBmdW5jdGlvbiBwbGFjZWhvbGRlcjIobmFtZTIpIHtcbiAgICByZXR1cm4gbmV3IFBsYWNlaG9sZGVyKG5hbWUyKTtcbiAgfVxuICBzcWwyLnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXIyO1xuICBmdW5jdGlvbiBwYXJhbTIodmFsdWUsIGVuY29kZXIpIHtcbiAgICByZXR1cm4gbmV3IFBhcmFtKHZhbHVlLCBlbmNvZGVyKTtcbiAgfVxuICBzcWwyLnBhcmFtID0gcGFyYW0yO1xufSkoc3FsIHx8IChzcWwgPSB7fSkpO1xuKChTUUwyKSA9PiB7XG4gIGNsYXNzIEFsaWFzZWQge1xuICAgIGNvbnN0cnVjdG9yKHNxbDIsIGZpZWxkQWxpYXMpIHtcbiAgICAgIHRoaXMuc3FsID0gc3FsMjtcbiAgICAgIHRoaXMuZmllbGRBbGlhcyA9IGZpZWxkQWxpYXM7XG4gICAgfVxuICAgIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTC5BbGlhc2VkXCI7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGlzU2VsZWN0aW9uRmllbGQgPSBmYWxzZTtcbiAgICBnZXRTUUwoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcWw7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBjbG9uZSgpIHtcbiAgICAgIHJldHVybiBuZXcgQWxpYXNlZCh0aGlzLnNxbCwgdGhpcy5maWVsZEFsaWFzKTtcbiAgICB9XG4gIH1cbiAgU1FMMi5BbGlhc2VkID0gQWxpYXNlZDtcbn0pKFNRTCB8fCAoU1FMID0ge30pKTtcbmNsYXNzIFBsYWNlaG9sZGVyIHtcbiAgY29uc3RydWN0b3IobmFtZTIpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lMjtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQbGFjZWhvbGRlclwiO1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbiAgfVxufVxuZnVuY3Rpb24gcGxhY2Vob2xkZXIobmFtZTIpIHtcbiAgcmV0dXJuIG5ldyBQbGFjZWhvbGRlcihuYW1lMik7XG59XG5mdW5jdGlvbiBmaWxsUGxhY2Vob2xkZXJzKHBhcmFtcywgdmFsdWVzKSB7XG4gIHJldHVybiBwYXJhbXMubWFwKChwKSA9PiB7XG4gICAgaWYgKGlzKHAsIFBsYWNlaG9sZGVyKSkge1xuICAgICAgaWYgKCEocC5uYW1lIGluIHZhbHVlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB2YWx1ZSBmb3IgcGxhY2Vob2xkZXIgXCIke3AubmFtZX1cIiB3YXMgcHJvdmlkZWRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZXNbcC5uYW1lXTtcbiAgICB9XG4gICAgaWYgKGlzKHAsIFBhcmFtKSAmJiBpcyhwLnZhbHVlLCBQbGFjZWhvbGRlcikpIHtcbiAgICAgIGlmICghKHAudmFsdWUubmFtZSBpbiB2YWx1ZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdmFsdWUgZm9yIHBsYWNlaG9sZGVyIFwiJHtwLnZhbHVlLm5hbWV9XCIgd2FzIHByb3ZpZGVkYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcC5lbmNvZGVyLm1hcFRvRHJpdmVyVmFsdWUodmFsdWVzW3AudmFsdWUubmFtZV0pO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSk7XG59XG5jb25zdCBJc0RyaXp6bGVWaWV3ID0gU3ltYm9sLmZvcihcImRyaXp6bGU6SXNEcml6emxlVmlld1wiKTtcbmNsYXNzIFZpZXcge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJWaWV3XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW1ZpZXdCYXNlQ29uZmlnXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbSXNEcml6emxlVmlld10gPSB0cnVlO1xuICBjb25zdHJ1Y3Rvcih7IG5hbWU6IG5hbWUyLCBzY2hlbWEsIHNlbGVjdGVkRmllbGRzLCBxdWVyeSB9KSB7XG4gICAgdGhpc1tWaWV3QmFzZUNvbmZpZ10gPSB7XG4gICAgICBuYW1lOiBuYW1lMixcbiAgICAgIG9yaWdpbmFsTmFtZTogbmFtZTIsXG4gICAgICBzY2hlbWEsXG4gICAgICBzZWxlY3RlZEZpZWxkcyxcbiAgICAgIHF1ZXJ5LFxuICAgICAgaXNFeGlzdGluZzogIXF1ZXJ5LFxuICAgICAgaXNBbGlhczogZmFsc2VcbiAgICB9O1xuICB9XG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xuICB9XG59XG5mdW5jdGlvbiBpc1ZpZXcodmlldykge1xuICByZXR1cm4gdHlwZW9mIHZpZXcgPT09IFwib2JqZWN0XCIgJiYgdmlldyAhPT0gbnVsbCAmJiBJc0RyaXp6bGVWaWV3IGluIHZpZXc7XG59XG5mdW5jdGlvbiBnZXRWaWV3TmFtZSh2aWV3KSB7XG4gIHJldHVybiB2aWV3W1ZpZXdCYXNlQ29uZmlnXS5uYW1lO1xufVxuQ29sdW1uLnByb3RvdHlwZS5nZXRTUUwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbn07XG5UYWJsZS5wcm90b3R5cGUuZ2V0U1FMID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG59O1xuU3VicXVlcnkucHJvdG90eXBlLmdldFNRTCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xufTtcbmV4cG9ydCB7XG4gIEZha2VQcmltaXRpdmVQYXJhbSxcbiAgTmFtZSxcbiAgUGFyYW0sXG4gIFBsYWNlaG9sZGVyLFxuICBTUUwsXG4gIFN0cmluZ0NodW5rLFxuICBWaWV3LFxuICBmaWxsUGxhY2Vob2xkZXJzLFxuICBnZXRWaWV3TmFtZSxcbiAgaXNEcml2ZXJWYWx1ZUVuY29kZXIsXG4gIGlzU1FMV3JhcHBlcixcbiAgaXNWaWV3LFxuICBuYW1lLFxuICBub29wRGVjb2RlcixcbiAgbm9vcEVuY29kZXIsXG4gIG5vb3BNYXBwZXIsXG4gIHBhcmFtLFxuICBwbGFjZWhvbGRlcixcbiAgc3FsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3FsLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU1FMLCBzcWwgfSBmcm9tIFwiLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuL3ZpZXctY29tbW9uLmpzXCI7XG5jbGFzcyBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkNvbHVtbkFsaWFzUHJveHlIYW5kbGVyXCI7XG4gIGdldChjb2x1bW5PYmosIHByb3ApIHtcbiAgICBpZiAocHJvcCA9PT0gXCJ0YWJsZVwiKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWJsZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbk9ialtwcm9wXTtcbiAgfVxufVxuY2xhc3MgVGFibGVBbGlhc1Byb3h5SGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKGFsaWFzLCByZXBsYWNlT3JpZ2luYWxOYW1lKSB7XG4gICAgdGhpcy5hbGlhcyA9IGFsaWFzO1xuICAgIHRoaXMucmVwbGFjZU9yaWdpbmFsTmFtZSA9IHJlcGxhY2VPcmlnaW5hbE5hbWU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiVGFibGVBbGlhc1Byb3h5SGFuZGxlclwiO1xuICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgaWYgKHByb3AgPT09IFRhYmxlLlN5bWJvbC5Jc0FsaWFzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByb3AgPT09IFRhYmxlLlN5bWJvbC5OYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5hbGlhcztcbiAgICB9XG4gICAgaWYgKHRoaXMucmVwbGFjZU9yaWdpbmFsTmFtZSAmJiBwcm9wID09PSBUYWJsZS5TeW1ib2wuT3JpZ2luYWxOYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5hbGlhcztcbiAgICB9XG4gICAgaWYgKHByb3AgPT09IFZpZXdCYXNlQ29uZmlnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50YXJnZXRbVmlld0Jhc2VDb25maWddLFxuICAgICAgICBuYW1lOiB0aGlzLmFsaWFzLFxuICAgICAgICBpc0FsaWFzOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAocHJvcCA9PT0gVGFibGUuU3ltYm9sLkNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSB0YXJnZXRbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xuICAgICAgaWYgKCFjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgICAgfVxuICAgICAgY29uc3QgcHJveGllZENvbHVtbnMgPSB7fTtcbiAgICAgIE9iamVjdC5rZXlzKGNvbHVtbnMpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgIHByb3hpZWRDb2x1bW5zW2tleV0gPSBuZXcgUHJveHkoXG4gICAgICAgICAgY29sdW1uc1trZXldLFxuICAgICAgICAgIG5ldyBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlcihuZXcgUHJveHkodGFyZ2V0LCB0aGlzKSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHByb3hpZWRDb2x1bW5zO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHRhcmdldFtwcm9wXTtcbiAgICBpZiAoaXModmFsdWUsIENvbHVtbikpIHtcbiAgICAgIHJldHVybiBuZXcgUHJveHkodmFsdWUsIG5ldyBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlcihuZXcgUHJveHkodGFyZ2V0LCB0aGlzKSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbmNsYXNzIFJlbGF0aW9uVGFibGVBbGlhc1Byb3h5SGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKGFsaWFzKSB7XG4gICAgdGhpcy5hbGlhcyA9IGFsaWFzO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlJlbGF0aW9uVGFibGVBbGlhc1Byb3h5SGFuZGxlclwiO1xuICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgaWYgKHByb3AgPT09IFwic291cmNlVGFibGVcIikge1xuICAgICAgcmV0dXJuIGFsaWFzZWRUYWJsZSh0YXJnZXQuc291cmNlVGFibGUsIHRoaXMuYWxpYXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICB9XG59XG5mdW5jdGlvbiBhbGlhc2VkVGFibGUodGFibGUsIHRhYmxlQWxpYXMpIHtcbiAgcmV0dXJuIG5ldyBQcm94eSh0YWJsZSwgbmV3IFRhYmxlQWxpYXNQcm94eUhhbmRsZXIodGFibGVBbGlhcywgZmFsc2UpKTtcbn1cbmZ1bmN0aW9uIGFsaWFzZWRSZWxhdGlvbihyZWxhdGlvbiwgdGFibGVBbGlhcykge1xuICByZXR1cm4gbmV3IFByb3h5KHJlbGF0aW9uLCBuZXcgUmVsYXRpb25UYWJsZUFsaWFzUHJveHlIYW5kbGVyKHRhYmxlQWxpYXMpKTtcbn1cbmZ1bmN0aW9uIGFsaWFzZWRUYWJsZUNvbHVtbihjb2x1bW4sIHRhYmxlQWxpYXMpIHtcbiAgcmV0dXJuIG5ldyBQcm94eShcbiAgICBjb2x1bW4sXG4gICAgbmV3IENvbHVtbkFsaWFzUHJveHlIYW5kbGVyKG5ldyBQcm94eShjb2x1bW4udGFibGUsIG5ldyBUYWJsZUFsaWFzUHJveHlIYW5kbGVyKHRhYmxlQWxpYXMsIGZhbHNlKSkpXG4gICk7XG59XG5mdW5jdGlvbiBtYXBDb2x1bW5zSW5BbGlhc2VkU1FMVG9BbGlhcyhxdWVyeSwgYWxpYXMpIHtcbiAgcmV0dXJuIG5ldyBTUUwuQWxpYXNlZChtYXBDb2x1bW5zSW5TUUxUb0FsaWFzKHF1ZXJ5LnNxbCwgYWxpYXMpLCBxdWVyeS5maWVsZEFsaWFzKTtcbn1cbmZ1bmN0aW9uIG1hcENvbHVtbnNJblNRTFRvQWxpYXMocXVlcnksIGFsaWFzKSB7XG4gIHJldHVybiBzcWwuam9pbihxdWVyeS5xdWVyeUNodW5rcy5tYXAoKGMpID0+IHtcbiAgICBpZiAoaXMoYywgQ29sdW1uKSkge1xuICAgICAgcmV0dXJuIGFsaWFzZWRUYWJsZUNvbHVtbihjLCBhbGlhcyk7XG4gICAgfVxuICAgIGlmIChpcyhjLCBTUUwpKSB7XG4gICAgICByZXR1cm4gbWFwQ29sdW1uc0luU1FMVG9BbGlhcyhjLCBhbGlhcyk7XG4gICAgfVxuICAgIGlmIChpcyhjLCBTUUwuQWxpYXNlZCkpIHtcbiAgICAgIHJldHVybiBtYXBDb2x1bW5zSW5BbGlhc2VkU1FMVG9BbGlhcyhjLCBhbGlhcyk7XG4gICAgfVxuICAgIHJldHVybiBjO1xuICB9KSk7XG59XG5leHBvcnQge1xuICBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlcixcbiAgUmVsYXRpb25UYWJsZUFsaWFzUHJveHlIYW5kbGVyLFxuICBUYWJsZUFsaWFzUHJveHlIYW5kbGVyLFxuICBhbGlhc2VkUmVsYXRpb24sXG4gIGFsaWFzZWRUYWJsZSxcbiAgYWxpYXNlZFRhYmxlQ29sdW1uLFxuICBtYXBDb2x1bW5zSW5BbGlhc2VkU1FMVG9BbGlhcyxcbiAgbWFwQ29sdW1uc0luU1FMVG9BbGlhc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFsaWFzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBpcyB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUGFyYW0sIFNRTCwgVmlldyB9IGZyb20gXCIuL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IGdldFRhYmxlTmFtZSwgVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi92aWV3LWNvbW1vbi5qc1wiO1xuZnVuY3Rpb24gbWFwUmVzdWx0Um93KGNvbHVtbnMsIHJvdywgam9pbnNOb3ROdWxsYWJsZU1hcCkge1xuICBjb25zdCBudWxsaWZ5TWFwID0ge307XG4gIGNvbnN0IHJlc3VsdCA9IGNvbHVtbnMucmVkdWNlKFxuICAgIChyZXN1bHQyLCB7IHBhdGgsIGZpZWxkIH0sIGNvbHVtbkluZGV4KSA9PiB7XG4gICAgICBsZXQgZGVjb2RlcjtcbiAgICAgIGlmIChpcyhmaWVsZCwgQ29sdW1uKSkge1xuICAgICAgICBkZWNvZGVyID0gZmllbGQ7XG4gICAgICB9IGVsc2UgaWYgKGlzKGZpZWxkLCBTUUwpKSB7XG4gICAgICAgIGRlY29kZXIgPSBmaWVsZC5kZWNvZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb2RlciA9IGZpZWxkLnNxbC5kZWNvZGVyO1xuICAgICAgfVxuICAgICAgbGV0IG5vZGUgPSByZXN1bHQyO1xuICAgICAgZm9yIChjb25zdCBbcGF0aENodW5rSW5kZXgsIHBhdGhDaHVua10gb2YgcGF0aC5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKHBhdGhDaHVua0luZGV4IDwgcGF0aC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgaWYgKCEocGF0aENodW5rIGluIG5vZGUpKSB7XG4gICAgICAgICAgICBub2RlW3BhdGhDaHVua10gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZSA9IG5vZGVbcGF0aENodW5rXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHJvd1tjb2x1bW5JbmRleF07XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBub2RlW3BhdGhDaHVua10gPSByYXdWYWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBkZWNvZGVyLm1hcEZyb21Ecml2ZXJWYWx1ZShyYXdWYWx1ZSk7XG4gICAgICAgICAgaWYgKGpvaW5zTm90TnVsbGFibGVNYXAgJiYgaXMoZmllbGQsIENvbHVtbikgJiYgcGF0aC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdE5hbWUgPSBwYXRoWzBdO1xuICAgICAgICAgICAgaWYgKCEob2JqZWN0TmFtZSBpbiBudWxsaWZ5TWFwKSkge1xuICAgICAgICAgICAgICBudWxsaWZ5TWFwW29iamVjdE5hbWVdID0gdmFsdWUgPT09IG51bGwgPyBnZXRUYWJsZU5hbWUoZmllbGQudGFibGUpIDogZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBudWxsaWZ5TWFwW29iamVjdE5hbWVdID09PSBcInN0cmluZ1wiICYmIG51bGxpZnlNYXBbb2JqZWN0TmFtZV0gIT09IGdldFRhYmxlTmFtZShmaWVsZC50YWJsZSkpIHtcbiAgICAgICAgICAgICAgbnVsbGlmeU1hcFtvYmplY3ROYW1lXSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDI7XG4gICAgfSxcbiAgICB7fVxuICApO1xuICBpZiAoam9pbnNOb3ROdWxsYWJsZU1hcCAmJiBPYmplY3Qua2V5cyhudWxsaWZ5TWFwKS5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBbb2JqZWN0TmFtZSwgdGFibGVOYW1lXSBvZiBPYmplY3QuZW50cmllcyhudWxsaWZ5TWFwKSkge1xuICAgICAgaWYgKHR5cGVvZiB0YWJsZU5hbWUgPT09IFwic3RyaW5nXCIgJiYgIWpvaW5zTm90TnVsbGFibGVNYXBbdGFibGVOYW1lXSkge1xuICAgICAgICByZXN1bHRbb2JqZWN0TmFtZV0gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gb3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZHMsIHBhdGhQcmVmaXgpIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGZpZWxkcykucmVkdWNlKChyZXN1bHQsIFtuYW1lLCBmaWVsZF0pID0+IHtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IG5ld1BhdGggPSBwYXRoUHJlZml4ID8gWy4uLnBhdGhQcmVmaXgsIG5hbWVdIDogW25hbWVdO1xuICAgIGlmIChpcyhmaWVsZCwgQ29sdW1uKSB8fCBpcyhmaWVsZCwgU1FMKSB8fCBpcyhmaWVsZCwgU1FMLkFsaWFzZWQpKSB7XG4gICAgICByZXN1bHQucHVzaCh7IHBhdGg6IG5ld1BhdGgsIGZpZWxkIH0pO1xuICAgIH0gZWxzZSBpZiAoaXMoZmllbGQsIFRhYmxlKSkge1xuICAgICAgcmVzdWx0LnB1c2goLi4ub3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZFtUYWJsZS5TeW1ib2wuQ29sdW1uc10sIG5ld1BhdGgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2goLi4ub3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZCwgbmV3UGF0aCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCBbXSk7XG59XG5mdW5jdGlvbiBoYXZlU2FtZUtleXMobGVmdCwgcmlnaHQpIHtcbiAgY29uc3QgbGVmdEtleXMgPSBPYmplY3Qua2V5cyhsZWZ0KTtcbiAgY29uc3QgcmlnaHRLZXlzID0gT2JqZWN0LmtleXMocmlnaHQpO1xuICBpZiAobGVmdEtleXMubGVuZ3RoICE9PSByaWdodEtleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3QgW2luZGV4LCBrZXldIG9mIGxlZnRLZXlzLmVudHJpZXMoKSkge1xuICAgIGlmIChrZXkgIT09IHJpZ2h0S2V5c1tpbmRleF0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBtYXBVcGRhdGVTZXQodGFibGUsIHZhbHVlcykge1xuICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModmFsdWVzKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHZvaWQgMCkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBpZiAoaXModmFsdWUsIFNRTCkgfHwgaXModmFsdWUsIENvbHVtbikpIHtcbiAgICAgIHJldHVybiBba2V5LCB2YWx1ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBba2V5LCBuZXcgUGFyYW0odmFsdWUsIHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXVtrZXldKV07XG4gICAgfVxuICB9KTtcbiAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gdmFsdWVzIHRvIHNldFwiKTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpO1xufVxuZnVuY3Rpb24gYXBwbHlNaXhpbnMoYmFzZUNsYXNzLCBleHRlbmRlZENsYXNzZXMpIHtcbiAgZm9yIChjb25zdCBleHRlbmRlZENsYXNzIG9mIGV4dGVuZGVkQ2xhc3Nlcykge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhleHRlbmRlZENsYXNzLnByb3RvdHlwZSkpIHtcbiAgICAgIGlmIChuYW1lID09PSBcImNvbnN0cnVjdG9yXCIpIGNvbnRpbnVlO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICBiYXNlQ2xhc3MucHJvdG90eXBlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGV4dGVuZGVkQ2xhc3MucHJvdG90eXBlLCBuYW1lKSB8fCAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRhYmxlQ29sdW1ucyh0YWJsZSkge1xuICByZXR1cm4gdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xufVxuZnVuY3Rpb24gZ2V0Vmlld1NlbGVjdGVkRmllbGRzKHZpZXcpIHtcbiAgcmV0dXJuIHZpZXdbVmlld0Jhc2VDb25maWddLnNlbGVjdGVkRmllbGRzO1xufVxuZnVuY3Rpb24gZ2V0VGFibGVMaWtlTmFtZSh0YWJsZSkge1xuICByZXR1cm4gaXModGFibGUsIFN1YnF1ZXJ5KSA/IHRhYmxlLl8uYWxpYXMgOiBpcyh0YWJsZSwgVmlldykgPyB0YWJsZVtWaWV3QmFzZUNvbmZpZ10ubmFtZSA6IGlzKHRhYmxlLCBTUUwpID8gdm9pZCAwIDogdGFibGVbVGFibGUuU3ltYm9sLklzQWxpYXNdID8gdGFibGVbVGFibGUuU3ltYm9sLk5hbWVdIDogdGFibGVbVGFibGUuU3ltYm9sLkJhc2VOYW1lXTtcbn1cbmZ1bmN0aW9uIGdldENvbHVtbk5hbWVBbmRDb25maWcoYSwgYikge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IHR5cGVvZiBhID09PSBcInN0cmluZ1wiICYmIGEubGVuZ3RoID4gMCA/IGEgOiBcIlwiLFxuICAgIGNvbmZpZzogdHlwZW9mIGEgPT09IFwib2JqZWN0XCIgPyBhIDogYlxuICB9O1xufVxuY29uc3QgXyA9IHt9O1xuY29uc3QgX18gPSB7fTtcbmZ1bmN0aW9uIGlzQ29uZmlnKGRhdGEpIHtcbiAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKGRhdGEuY29uc3RydWN0b3IubmFtZSAhPT0gXCJPYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICBpZiAoXCJsb2dnZXJcIiBpbiBkYXRhKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBkYXRhW1wibG9nZ2VyXCJdO1xuICAgIGlmICh0eXBlICE9PSBcImJvb2xlYW5cIiAmJiAodHlwZSAhPT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgZGF0YVtcImxvZ2dlclwiXVtcImxvZ1F1ZXJ5XCJdICE9PSBcImZ1bmN0aW9uXCIpICYmIHR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoXCJzY2hlbWFcIiBpbiBkYXRhKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBkYXRhW1wic2NoZW1hXCJdO1xuICAgIGlmICh0eXBlICE9PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoXCJjYXNpbmdcIiBpbiBkYXRhKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBkYXRhW1wiY2FzaW5nXCJdO1xuICAgIGlmICh0eXBlICE9PSBcInN0cmluZ1wiICYmIHR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoXCJtb2RlXCIgaW4gZGF0YSkge1xuICAgIGlmIChkYXRhW1wibW9kZVwiXSAhPT0gXCJkZWZhdWx0XCIgfHwgZGF0YVtcIm1vZGVcIl0gIT09IFwicGxhbmV0c2NhbGVcIiB8fCBkYXRhW1wibW9kZVwiXSAhPT0gdm9pZCAwKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKFwiY29ubmVjdGlvblwiIGluIGRhdGEpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGRhdGFbXCJjb25uZWN0aW9uXCJdO1xuICAgIGlmICh0eXBlICE9PSBcInN0cmluZ1wiICYmIHR5cGUgIT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChcImNsaWVudFwiIGluIGRhdGEpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGRhdGFbXCJjbGllbnRcIl07XG4gICAgaWYgKHR5cGUgIT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuY29uc3QgdGV4dERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgPT09IFwidW5kZWZpbmVkXCIgPyBudWxsIDogbmV3IFRleHREZWNvZGVyKCk7XG5leHBvcnQge1xuICBhcHBseU1peGlucyxcbiAgZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyxcbiAgZ2V0VGFibGVDb2x1bW5zLFxuICBnZXRUYWJsZUxpa2VOYW1lLFxuICBnZXRWaWV3U2VsZWN0ZWRGaWVsZHMsXG4gIGhhdmVTYW1lS2V5cyxcbiAgaXNDb25maWcsXG4gIG1hcFJlc3VsdFJvdyxcbiAgbWFwVXBkYXRlU2V0LFxuICBvcmRlclNlbGVjdGVkRmllbGRzLFxuICB0ZXh0RGVjb2RlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlTmFtZSB9IGZyb20gXCIuLi90YWJsZS51dGlscy5qc1wiO1xuY2xhc3MgRm9yZWlnbktleUJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVGb3JlaWduS2V5QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIHJlZmVyZW5jZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfb25VcGRhdGU7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX29uRGVsZXRlO1xuICBjb25zdHJ1Y3Rvcihjb25maWcsIGFjdGlvbnMpIHtcbiAgICB0aGlzLnJlZmVyZW5jZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgY29sdW1ucywgZm9yZWlnbkNvbHVtbnMgfSA9IGNvbmZpZygpO1xuICAgICAgcmV0dXJuIHsgbmFtZSwgY29sdW1ucywgZm9yZWlnblRhYmxlOiBmb3JlaWduQ29sdW1uc1swXS50YWJsZSwgZm9yZWlnbkNvbHVtbnMgfTtcbiAgICB9O1xuICAgIGlmIChhY3Rpb25zKSB7XG4gICAgICB0aGlzLl9vblVwZGF0ZSA9IGFjdGlvbnMub25VcGRhdGU7XG4gICAgICB0aGlzLl9vbkRlbGV0ZSA9IGFjdGlvbnMub25EZWxldGU7XG4gICAgfVxuICB9XG4gIG9uVXBkYXRlKGFjdGlvbikge1xuICAgIHRoaXMuX29uVXBkYXRlID0gYWN0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9uRGVsZXRlKGFjdGlvbikge1xuICAgIHRoaXMuX29uRGVsZXRlID0gYWN0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IEZvcmVpZ25LZXkodGFibGUsIHRoaXMpO1xuICB9XG59XG5jbGFzcyBGb3JlaWduS2V5IHtcbiAgY29uc3RydWN0b3IodGFibGUsIGJ1aWxkZXIpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5yZWZlcmVuY2UgPSBidWlsZGVyLnJlZmVyZW5jZTtcbiAgICB0aGlzLm9uVXBkYXRlID0gYnVpbGRlci5fb25VcGRhdGU7XG4gICAgdGhpcy5vbkRlbGV0ZSA9IGJ1aWxkZXIuX29uRGVsZXRlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUZvcmVpZ25LZXlcIjtcbiAgcmVmZXJlbmNlO1xuICBvblVwZGF0ZTtcbiAgb25EZWxldGU7XG4gIGdldE5hbWUoKSB7XG4gICAgY29uc3QgeyBuYW1lLCBjb2x1bW5zLCBmb3JlaWduQ29sdW1ucyB9ID0gdGhpcy5yZWZlcmVuY2UoKTtcbiAgICBjb25zdCBjb2x1bW5OYW1lcyA9IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKTtcbiAgICBjb25zdCBmb3JlaWduQ29sdW1uTmFtZXMgPSBmb3JlaWduQ29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpO1xuICAgIGNvbnN0IGNodW5rcyA9IFtcbiAgICAgIHRoaXMudGFibGVbVGFibGVOYW1lXSxcbiAgICAgIC4uLmNvbHVtbk5hbWVzLFxuICAgICAgZm9yZWlnbkNvbHVtbnNbMF0udGFibGVbVGFibGVOYW1lXSxcbiAgICAgIC4uLmZvcmVpZ25Db2x1bW5OYW1lc1xuICAgIF07XG4gICAgcmV0dXJuIG5hbWUgPz8gYCR7Y2h1bmtzLmpvaW4oXCJfXCIpfV9ma2A7XG4gIH1cbn1cbmZ1bmN0aW9uIGZvcmVpZ25LZXkoY29uZmlnKSB7XG4gIGZ1bmN0aW9uIG1hcHBlZENvbmZpZygpIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCB7IG5hbWUsIGNvbHVtbnMsIGZvcmVpZ25Db2x1bW5zIH0gPSBjb25maWcoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNvbHVtbnMsXG4gICAgICAgIGZvcmVpZ25Db2x1bW5zXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG4gIHJldHVybiBuZXcgRm9yZWlnbktleUJ1aWxkZXIobWFwcGVkQ29uZmlnKTtcbn1cbmV4cG9ydCB7XG4gIEZvcmVpZ25LZXksXG4gIEZvcmVpZ25LZXlCdWlsZGVyLFxuICBmb3JlaWduS2V5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9yZWlnbi1rZXlzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlTmFtZSB9IGZyb20gXCIuLi90YWJsZS51dGlscy5qc1wiO1xuZnVuY3Rpb24gdW5pcXVlS2V5TmFtZSh0YWJsZSwgY29sdW1ucykge1xuICByZXR1cm4gYCR7dGFibGVbVGFibGVOYW1lXX1fJHtjb2x1bW5zLmpvaW4oXCJfXCIpfV91bmlxdWVgO1xufVxuZnVuY3Rpb24gdW5pcXVlKG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyKG5hbWUpO1xufVxuY2xhc3MgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIge1xuICBjb25zdHJ1Y3Rvcihjb2x1bW5zLCBuYW1lKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29sdW1ucztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludCh0YWJsZSwgdGhpcy5jb2x1bW5zLCB0aGlzLm5hbWUpO1xuICB9XG59XG5jbGFzcyBVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVW5pcXVlT25Db25zdHJhaW50QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIG5hbWU7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG4gIG9uKC4uLmNvbHVtbnMpIHtcbiAgICByZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyKGNvbHVtbnMsIHRoaXMubmFtZSk7XG4gIH1cbn1cbmNsYXNzIFVuaXF1ZUNvbnN0cmFpbnQge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29sdW1ucywgbmFtZSkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICAgIHRoaXMubmFtZSA9IG5hbWUgPz8gdW5pcXVlS2V5TmFtZSh0aGlzLnRhYmxlLCB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKSk7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVW5pcXVlQ29uc3RyYWludFwiO1xuICBjb2x1bW5zO1xuICBuYW1lO1xuICBnZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFVuaXF1ZUNvbnN0cmFpbnQsXG4gIFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyLFxuICBVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyLFxuICB1bmlxdWUsXG4gIHVuaXF1ZUtleU5hbWVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmlxdWUtY29uc3RyYWludC5qcy5tYXAiLAogICAgImltcG9ydCB7IENvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi4vLi4vY29sdW1uLWJ1aWxkZXIuanNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuLi8uLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBGb3JlaWduS2V5QnVpbGRlciB9IGZyb20gXCIuLi9mb3JlaWduLWtleXMuanNcIjtcbmltcG9ydCB7IHVuaXF1ZUtleU5hbWUgfSBmcm9tIFwiLi4vdW5pcXVlLWNvbnN0cmFpbnQuanNcIjtcbmNsYXNzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgZXh0ZW5kcyBDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQ29sdW1uQnVpbGRlclwiO1xuICBmb3JlaWduS2V5Q29uZmlncyA9IFtdO1xuICByZWZlcmVuY2VzKHJlZiwgYWN0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5mb3JlaWduS2V5Q29uZmlncy5wdXNoKHsgcmVmLCBhY3Rpb25zIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHVuaXF1ZShuYW1lKSB7XG4gICAgdGhpcy5jb25maWcuaXNVbmlxdWUgPSB0cnVlO1xuICAgIHRoaXMuY29uZmlnLnVuaXF1ZU5hbWUgPSBuYW1lO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdlbmVyYXRlZEFsd2F5c0FzKGFzLCBjb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQgPSB7XG4gICAgICBhcyxcbiAgICAgIHR5cGU6IFwiYWx3YXlzXCIsXG4gICAgICBtb2RlOiBjb25maWc/Lm1vZGUgPz8gXCJ2aXJ0dWFsXCJcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGRGb3JlaWduS2V5cyhjb2x1bW4sIHRhYmxlKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9yZWlnbktleUNvbmZpZ3MubWFwKCh7IHJlZiwgYWN0aW9ucyB9KSA9PiB7XG4gICAgICByZXR1cm4gKChyZWYyLCBhY3Rpb25zMikgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IEZvcmVpZ25LZXlCdWlsZGVyKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBmb3JlaWduQ29sdW1uID0gcmVmMigpO1xuICAgICAgICAgIHJldHVybiB7IGNvbHVtbnM6IFtjb2x1bW5dLCBmb3JlaWduQ29sdW1uczogW2ZvcmVpZ25Db2x1bW5dIH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoYWN0aW9uczIub25VcGRhdGUpIHtcbiAgICAgICAgICBidWlsZGVyLm9uVXBkYXRlKGFjdGlvbnMyLm9uVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aW9uczIub25EZWxldGUpIHtcbiAgICAgICAgICBidWlsZGVyLm9uRGVsZXRlKGFjdGlvbnMyLm9uRGVsZXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCh0YWJsZSk7XG4gICAgICB9KShyZWYsIGFjdGlvbnMpO1xuICAgIH0pO1xuICB9XG59XG5jbGFzcyBTUUxpdGVDb2x1bW4gZXh0ZW5kcyBDb2x1bW4ge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgaWYgKCFjb25maWcudW5pcXVlTmFtZSkge1xuICAgICAgY29uZmlnLnVuaXF1ZU5hbWUgPSB1bmlxdWVLZXlOYW1lKHRhYmxlLCBbY29uZmlnLm5hbWVdKTtcbiAgICB9XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUNvbHVtblwiO1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlQ29sdW1uLFxuICBTUUxpdGVDb2x1bW5CdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbW9uLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWVBbmRDb25maWcsIHRleHREZWNvZGVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4sIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFNRTGl0ZUJpZ0ludEJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmlnSW50QnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJiaWdpbnRcIiwgXCJTUUxpdGVCaWdJbnRcIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQmlnSW50KHRhYmxlLCB0aGlzLmNvbmZpZyk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJpZ0ludCBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJpZ0ludFwiO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcImJsb2JcIjtcbiAgfVxuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBCdWZmZXIuZnJvbSkge1xuICAgICAgY29uc3QgYnVmID0gQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSA/IHZhbHVlIDogdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciA/IEJ1ZmZlci5mcm9tKHZhbHVlKSA6IHZhbHVlLmJ1ZmZlciA/IEJ1ZmZlci5mcm9tKHZhbHVlLmJ1ZmZlciwgdmFsdWUuYnl0ZU9mZnNldCwgdmFsdWUuYnl0ZUxlbmd0aCkgOiBCdWZmZXIuZnJvbSh2YWx1ZSk7XG4gICAgICByZXR1cm4gQmlnSW50KGJ1Zi50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgIH1cbiAgICByZXR1cm4gQmlnSW50KHRleHREZWNvZGVyLmRlY29kZSh2YWx1ZSkpO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUudG9TdHJpbmcoKSk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJsb2JKc29uQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCbG9iSnNvbkJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwianNvblwiLCBcIlNRTGl0ZUJsb2JKc29uXCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJsb2JKc29uKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJsb2JKc29uIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmxvYkpzb25cIjtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJibG9iXCI7XG4gIH1cbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgQnVmZmVyLmZyb20pIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBCdWZmZXIuZnJvbSh2YWx1ZSkgOiB2YWx1ZS5idWZmZXIgPyBCdWZmZXIuZnJvbSh2YWx1ZS5idWZmZXIsIHZhbHVlLmJ5dGVPZmZzZXQsIHZhbHVlLmJ5dGVMZW5ndGgpIDogQnVmZmVyLmZyb20odmFsdWUpO1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoYnVmLnRvU3RyaW5nKFwidXRmOFwiKSk7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnBhcnNlKHRleHREZWNvZGVyLmRlY29kZSh2YWx1ZSkpO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQmxvYkJ1ZmZlckJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmxvYkJ1ZmZlckJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwiYnVmZmVyXCIsIFwiU1FMaXRlQmxvYkJ1ZmZlclwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCbG9iQnVmZmVyKHRhYmxlLCB0aGlzLmNvbmZpZyk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJsb2JCdWZmZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCbG9iQnVmZmVyXCI7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSk7XG4gIH1cbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJibG9iXCI7XG4gIH1cbn1cbmZ1bmN0aW9uIGJsb2IoYSwgYikge1xuICBjb25zdCB7IG5hbWUsIGNvbmZpZyB9ID0gZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyhhLCBiKTtcbiAgaWYgKGNvbmZpZz8ubW9kZSA9PT0gXCJqc29uXCIpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJsb2JKc29uQnVpbGRlcihuYW1lKTtcbiAgfVxuICBpZiAoY29uZmlnPy5tb2RlID09PSBcImJpZ2ludFwiKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCaWdJbnRCdWlsZGVyKG5hbWUpO1xuICB9XG4gIHJldHVybiBuZXcgU1FMaXRlQmxvYkJ1ZmZlckJ1aWxkZXIobmFtZSk7XG59XG5leHBvcnQge1xuICBTUUxpdGVCaWdJbnQsXG4gIFNRTGl0ZUJpZ0ludEJ1aWxkZXIsXG4gIFNRTGl0ZUJsb2JCdWZmZXIsXG4gIFNRTGl0ZUJsb2JCdWZmZXJCdWlsZGVyLFxuICBTUUxpdGVCbG9iSnNvbixcbiAgU1FMaXRlQmxvYkpzb25CdWlsZGVyLFxuICBibG9iXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmxvYi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4sIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFNRTGl0ZUN1c3RvbUNvbHVtbkJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQ3VzdG9tQ29sdW1uQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBmaWVsZENvbmZpZywgY3VzdG9tVHlwZVBhcmFtcykge1xuICAgIHN1cGVyKG5hbWUsIFwiY3VzdG9tXCIsIFwiU1FMaXRlQ3VzdG9tQ29sdW1uXCIpO1xuICAgIHRoaXMuY29uZmlnLmZpZWxkQ29uZmlnID0gZmllbGRDb25maWc7XG4gICAgdGhpcy5jb25maWcuY3VzdG9tVHlwZVBhcmFtcyA9IGN1c3RvbVR5cGVQYXJhbXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQ3VzdG9tQ29sdW1uKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUN1c3RvbUNvbHVtbiBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUN1c3RvbUNvbHVtblwiO1xuICBzcWxOYW1lO1xuICBtYXBUbztcbiAgbWFwRnJvbTtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICAgIHRoaXMuc3FsTmFtZSA9IGNvbmZpZy5jdXN0b21UeXBlUGFyYW1zLmRhdGFUeXBlKGNvbmZpZy5maWVsZENvbmZpZyk7XG4gICAgdGhpcy5tYXBUbyA9IGNvbmZpZy5jdXN0b21UeXBlUGFyYW1zLnRvRHJpdmVyO1xuICAgIHRoaXMubWFwRnJvbSA9IGNvbmZpZy5jdXN0b21UeXBlUGFyYW1zLmZyb21Ecml2ZXI7XG4gIH1cbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zcWxOYW1lO1xuICB9XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5tYXBGcm9tID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLm1hcEZyb20odmFsdWUpIDogdmFsdWU7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5tYXBUbyA9PT0gXCJmdW5jdGlvblwiID8gdGhpcy5tYXBUbyh2YWx1ZSkgOiB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gY3VzdG9tVHlwZShjdXN0b21UeXBlUGFyYW1zKSB7XG4gIHJldHVybiAoYSwgYikgPT4ge1xuICAgIGNvbnN0IHsgbmFtZSwgY29uZmlnIH0gPSBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnKGEsIGIpO1xuICAgIHJldHVybiBuZXcgU1FMaXRlQ3VzdG9tQ29sdW1uQnVpbGRlcihcbiAgICAgIG5hbWUsXG4gICAgICBjb25maWcsXG4gICAgICBjdXN0b21UeXBlUGFyYW1zXG4gICAgKTtcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZUN1c3RvbUNvbHVtbixcbiAgU1FMaXRlQ3VzdG9tQ29sdW1uQnVpbGRlcixcbiAgY3VzdG9tVHlwZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWN1c3RvbS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBzcWwgfSBmcm9tIFwiLi4vLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uLCBTUUxpdGVDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmFzZUludGVnZXJCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGRhdGFUeXBlLCBjb2x1bW5UeXBlKSB7XG4gICAgc3VwZXIobmFtZSwgZGF0YVR5cGUsIGNvbHVtblR5cGUpO1xuICAgIHRoaXMuY29uZmlnLmF1dG9JbmNyZW1lbnQgPSBmYWxzZTtcbiAgfVxuICBwcmltYXJ5S2V5KGNvbmZpZykge1xuICAgIGlmIChjb25maWc/LmF1dG9JbmNyZW1lbnQpIHtcbiAgICAgIHRoaXMuY29uZmlnLmF1dG9JbmNyZW1lbnQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy5oYXNEZWZhdWx0ID0gdHJ1ZTtcbiAgICByZXR1cm4gc3VwZXIucHJpbWFyeUtleSgpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVCYXNlSW50ZWdlciBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJhc2VJbnRlZ2VyXCI7XG4gIGF1dG9JbmNyZW1lbnQgPSB0aGlzLmNvbmZpZy5hdXRvSW5jcmVtZW50O1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcImludGVnZXJcIjtcbiAgfVxufVxuY2xhc3MgU1FMaXRlSW50ZWdlckJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVJbnRlZ2VyQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJudW1iZXJcIiwgXCJTUUxpdGVJbnRlZ2VyXCIpO1xuICB9XG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVJbnRlZ2VyKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUludGVnZXIgZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUludGVnZXJcIjtcbn1cbmNsYXNzIFNRTGl0ZVRpbWVzdGFtcEJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUaW1lc3RhbXBCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIG1vZGUpIHtcbiAgICBzdXBlcihuYW1lLCBcImRhdGVcIiwgXCJTUUxpdGVUaW1lc3RhbXBcIik7XG4gICAgdGhpcy5jb25maWcubW9kZSA9IG1vZGU7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgZGVmYXVsdCgpYCB3aXRoIHlvdXIgb3duIGV4cHJlc3Npb24gaW5zdGVhZC5cbiAgICpcbiAgICogQWRkcyBgREVGQVVMVCAoY2FzdCgoanVsaWFuZGF5KCdub3cnKSAtIDI0NDA1ODcuNSkqODY0MDAwMDAgYXMgaW50ZWdlcikpYCB0byB0aGUgY29sdW1uLCB3aGljaCBpcyB0aGUgY3VycmVudCBlcG9jaCB0aW1lc3RhbXAgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgZGVmYXVsdE5vdygpIHtcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0KHNxbGAoY2FzdCgoanVsaWFuZGF5KCdub3cnKSAtIDI0NDA1ODcuNSkqODY0MDAwMDAgYXMgaW50ZWdlcikpYCk7XG4gIH1cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVRpbWVzdGFtcChcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVUaW1lc3RhbXAgZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRpbWVzdGFtcFwiO1xuICBtb2RlID0gdGhpcy5jb25maWcubW9kZTtcbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm1vZGUgPT09IFwidGltZXN0YW1wXCIpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSAqIDFlMyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGNvbnN0IHVuaXggPSB2YWx1ZS5nZXRUaW1lKCk7XG4gICAgaWYgKHRoaXMuY29uZmlnLm1vZGUgPT09IFwidGltZXN0YW1wXCIpIHtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKHVuaXggLyAxZTMpO1xuICAgIH1cbiAgICByZXR1cm4gdW5peDtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQm9vbGVhbkJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCb29sZWFuQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBtb2RlKSB7XG4gICAgc3VwZXIobmFtZSwgXCJib29sZWFuXCIsIFwiU1FMaXRlQm9vbGVhblwiKTtcbiAgICB0aGlzLmNvbmZpZy5tb2RlID0gbW9kZTtcbiAgfVxuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQm9vbGVhbihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVCb29sZWFuIGV4dGVuZHMgU1FMaXRlQmFzZUludGVnZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCb29sZWFuXCI7XG4gIG1vZGUgPSB0aGlzLmNvbmZpZy5tb2RlO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKSA9PT0gMTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID8gMSA6IDA7XG4gIH1cbn1cbmZ1bmN0aW9uIGludGVnZXIoYSwgYikge1xuICBjb25zdCB7IG5hbWUsIGNvbmZpZyB9ID0gZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyhhLCBiKTtcbiAgaWYgKGNvbmZpZz8ubW9kZSA9PT0gXCJ0aW1lc3RhbXBcIiB8fCBjb25maWc/Lm1vZGUgPT09IFwidGltZXN0YW1wX21zXCIpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVRpbWVzdGFtcEJ1aWxkZXIobmFtZSwgY29uZmlnLm1vZGUpO1xuICB9XG4gIGlmIChjb25maWc/Lm1vZGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCb29sZWFuQnVpbGRlcihuYW1lLCBjb25maWcubW9kZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTUUxpdGVJbnRlZ2VyQnVpbGRlcihuYW1lKTtcbn1cbmNvbnN0IGludCA9IGludGVnZXI7XG5leHBvcnQge1xuICBTUUxpdGVCYXNlSW50ZWdlcixcbiAgU1FMaXRlQmFzZUludGVnZXJCdWlsZGVyLFxuICBTUUxpdGVCb29sZWFuLFxuICBTUUxpdGVCb29sZWFuQnVpbGRlcixcbiAgU1FMaXRlSW50ZWdlcixcbiAgU1FMaXRlSW50ZWdlckJ1aWxkZXIsXG4gIFNRTGl0ZVRpbWVzdGFtcCxcbiAgU1FMaXRlVGltZXN0YW1wQnVpbGRlcixcbiAgaW50LFxuICBpbnRlZ2VyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50ZWdlci5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4sIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFNRTGl0ZU51bWVyaWNCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZU51bWVyaWNCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcInN0cmluZ1wiLCBcIlNRTGl0ZU51bWVyaWNcIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlTnVtZXJpYyhcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVOdW1lcmljIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY1wiO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJudW1lcmljXCI7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZU51bWVyaWNOdW1iZXJCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZU51bWVyaWNOdW1iZXJCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcIm51bWJlclwiLCBcIlNRTGl0ZU51bWVyaWNOdW1iZXJcIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlTnVtZXJpY051bWJlcihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVOdW1lcmljTnVtYmVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY051bWJlclwiO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSA9IFN0cmluZztcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJudW1lcmljXCI7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZU51bWVyaWNCaWdJbnRCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZU51bWVyaWNCaWdJbnRCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcImJpZ2ludFwiLCBcIlNRTGl0ZU51bWVyaWNCaWdJbnRcIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlTnVtZXJpY0JpZ0ludChcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVOdW1lcmljQmlnSW50IGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY0JpZ0ludFwiO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUgPSBCaWdJbnQ7XG4gIG1hcFRvRHJpdmVyVmFsdWUgPSBTdHJpbmc7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwibnVtZXJpY1wiO1xuICB9XG59XG5mdW5jdGlvbiBudW1lcmljKGEsIGIpIHtcbiAgY29uc3QgeyBuYW1lLCBjb25maWcgfSA9IGdldENvbHVtbk5hbWVBbmRDb25maWcoYSwgYik7XG4gIGNvbnN0IG1vZGUgPSBjb25maWc/Lm1vZGU7XG4gIHJldHVybiBtb2RlID09PSBcIm51bWJlclwiID8gbmV3IFNRTGl0ZU51bWVyaWNOdW1iZXJCdWlsZGVyKG5hbWUpIDogbW9kZSA9PT0gXCJiaWdpbnRcIiA/IG5ldyBTUUxpdGVOdW1lcmljQmlnSW50QnVpbGRlcihuYW1lKSA6IG5ldyBTUUxpdGVOdW1lcmljQnVpbGRlcihuYW1lKTtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZU51bWVyaWMsXG4gIFNRTGl0ZU51bWVyaWNCaWdJbnQsXG4gIFNRTGl0ZU51bWVyaWNCaWdJbnRCdWlsZGVyLFxuICBTUUxpdGVOdW1lcmljQnVpbGRlcixcbiAgU1FMaXRlTnVtZXJpY051bWJlcixcbiAgU1FMaXRlTnVtZXJpY051bWJlckJ1aWxkZXIsXG4gIG51bWVyaWNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1udW1lcmljLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiwgU1FMaXRlQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgU1FMaXRlUmVhbEJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlUmVhbEJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwibnVtYmVyXCIsIFwiU1FMaXRlUmVhbFwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVSZWFsKHRhYmxlLCB0aGlzLmNvbmZpZyk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVJlYWwgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVSZWFsXCI7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwicmVhbFwiO1xuICB9XG59XG5mdW5jdGlvbiByZWFsKG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBTUUxpdGVSZWFsQnVpbGRlcihuYW1lID8/IFwiXCIpO1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlUmVhbCxcbiAgU1FMaXRlUmVhbEJ1aWxkZXIsXG4gIHJlYWxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWFsLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWVBbmRDb25maWcgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiwgU1FMaXRlQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgU1FMaXRlVGV4dEJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGV4dEJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgY29uZmlnKSB7XG4gICAgc3VwZXIobmFtZSwgXCJzdHJpbmdcIiwgXCJTUUxpdGVUZXh0XCIpO1xuICAgIHRoaXMuY29uZmlnLmVudW1WYWx1ZXMgPSBjb25maWcuZW51bTtcbiAgICB0aGlzLmNvbmZpZy5sZW5ndGggPSBjb25maWcubGVuZ3RoO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVRleHQoXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlVGV4dCBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRleHRcIjtcbiAgZW51bVZhbHVlcyA9IHRoaXMuY29uZmlnLmVudW1WYWx1ZXM7XG4gIGxlbmd0aCA9IHRoaXMuY29uZmlnLmxlbmd0aDtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICB9XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIGB0ZXh0JHt0aGlzLmNvbmZpZy5sZW5ndGggPyBgKCR7dGhpcy5jb25maWcubGVuZ3RofSlgIDogXCJcIn1gO1xuICB9XG59XG5jbGFzcyBTUUxpdGVUZXh0SnNvbkJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGV4dEpzb25CdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcImpzb25cIiwgXCJTUUxpdGVUZXh0SnNvblwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVUZXh0SnNvbihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVUZXh0SnNvbiBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRleHRKc29uXCI7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwidGV4dFwiO1xuICB9XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfVxufVxuZnVuY3Rpb24gdGV4dChhLCBiID0ge30pIHtcbiAgY29uc3QgeyBuYW1lLCBjb25maWcgfSA9IGdldENvbHVtbk5hbWVBbmRDb25maWcoYSwgYik7XG4gIGlmIChjb25maWcubW9kZSA9PT0gXCJqc29uXCIpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVRleHRKc29uQnVpbGRlcihuYW1lKTtcbiAgfVxuICByZXR1cm4gbmV3IFNRTGl0ZVRleHRCdWlsZGVyKG5hbWUsIGNvbmZpZyk7XG59XG5leHBvcnQge1xuICBTUUxpdGVUZXh0LFxuICBTUUxpdGVUZXh0QnVpbGRlcixcbiAgU1FMaXRlVGV4dEpzb24sXG4gIFNRTGl0ZVRleHRKc29uQnVpbGRlcixcbiAgdGV4dFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRleHQuanMubWFwIiwKICAgICJpbXBvcnQgeyBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlciwgVGFibGVBbGlhc1Byb3h5SGFuZGxlciB9IGZyb20gXCIuL2FsaWFzLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTUUwsIFZpZXcgfSBmcm9tIFwiLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTdWJxdWVyeSB9IGZyb20gXCIuL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuL3ZpZXctY29tbW9uLmpzXCI7XG5jbGFzcyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTZWxlY3Rpb25Qcm94eUhhbmRsZXJcIjtcbiAgY29uZmlnO1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uY29uZmlnIH07XG4gIH1cbiAgZ2V0KHN1YnF1ZXJ5LCBwcm9wKSB7XG4gICAgaWYgKHByb3AgPT09IFwiX1wiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdWJxdWVyeVtcIl9cIl0sXG4gICAgICAgIHNlbGVjdGVkRmllbGRzOiBuZXcgUHJveHkoXG4gICAgICAgICAgc3VicXVlcnkuXy5zZWxlY3RlZEZpZWxkcyxcbiAgICAgICAgICB0aGlzXG4gICAgICAgIClcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChwcm9wID09PSBWaWV3QmFzZUNvbmZpZykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3VicXVlcnlbVmlld0Jhc2VDb25maWddLFxuICAgICAgICBzZWxlY3RlZEZpZWxkczogbmV3IFByb3h5KFxuICAgICAgICAgIHN1YnF1ZXJ5W1ZpZXdCYXNlQ29uZmlnXS5zZWxlY3RlZEZpZWxkcyxcbiAgICAgICAgICB0aGlzXG4gICAgICAgIClcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgcmV0dXJuIHN1YnF1ZXJ5W3Byb3BdO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW5zID0gaXMoc3VicXVlcnksIFN1YnF1ZXJ5KSA/IHN1YnF1ZXJ5Ll8uc2VsZWN0ZWRGaWVsZHMgOiBpcyhzdWJxdWVyeSwgVmlldykgPyBzdWJxdWVyeVtWaWV3QmFzZUNvbmZpZ10uc2VsZWN0ZWRGaWVsZHMgOiBzdWJxdWVyeTtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbHVtbnNbcHJvcF07XG4gICAgaWYgKGlzKHZhbHVlLCBTUUwuQWxpYXNlZCkpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5zcWxBbGlhc2VkQmVoYXZpb3IgPT09IFwic3FsXCIgJiYgIXZhbHVlLmlzU2VsZWN0aW9uRmllbGQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNxbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUuY2xvbmUoKTtcbiAgICAgIG5ld1ZhbHVlLmlzU2VsZWN0aW9uRmllbGQgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXModmFsdWUsIFNRTCkpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5zcWxCZWhhdmlvciA9PT0gXCJzcWxcIikge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBZb3UgdHJpZWQgdG8gcmVmZXJlbmNlIFwiJHtwcm9wfVwiIGZpZWxkIGZyb20gYSBzdWJxdWVyeSwgd2hpY2ggaXMgYSByYXcgU1FMIGZpZWxkLCBidXQgaXQgZG9lc24ndCBoYXZlIGFuIGFsaWFzIGRlY2xhcmVkLiBQbGVhc2UgYWRkIGFuIGFsaWFzIHRvIHRoZSBmaWVsZCB1c2luZyBcIi5hcygnYWxpYXMnKVwiIG1ldGhvZC5gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoaXModmFsdWUsIENvbHVtbikpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5hbGlhcykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIG5ldyBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlcihcbiAgICAgICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICAgICAgdmFsdWUudGFibGUsXG4gICAgICAgICAgICAgIG5ldyBUYWJsZUFsaWFzUHJveHlIYW5kbGVyKHRoaXMuY29uZmlnLmFsaWFzLCB0aGlzLmNvbmZpZy5yZXBsYWNlT3JpZ2luYWxOYW1lID8/IGZhbHNlKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb3h5KHZhbHVlLCBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHRoaXMuY29uZmlnKSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNlbGVjdGlvblByb3h5SGFuZGxlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlbGVjdGlvbi1wcm94eS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIFF1ZXJ5UHJvbWlzZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlF1ZXJ5UHJvbWlzZVwiO1xuICBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9IFwiUXVlcnlQcm9taXNlXCI7XG4gIGNhdGNoKG9uUmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKHZvaWQgMCwgb25SZWplY3RlZCk7XG4gIH1cbiAgZmluYWxseShvbkZpbmFsbHkpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKFxuICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgIG9uRmluYWxseT8uKCk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICAocmVhc29uKSA9PiB7XG4gICAgICAgIG9uRmluYWxseT8uKCk7XG4gICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKCkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFF1ZXJ5UHJvbWlzZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1ZXJ5LXByb21pc2UuanMubWFwIiwKICAgICJpbXBvcnQgeyBibG9iIH0gZnJvbSBcIi4vYmxvYi5qc1wiO1xuaW1wb3J0IHsgY3VzdG9tVHlwZSB9IGZyb20gXCIuL2N1c3RvbS5qc1wiO1xuaW1wb3J0IHsgaW50ZWdlciB9IGZyb20gXCIuL2ludGVnZXIuanNcIjtcbmltcG9ydCB7IG51bWVyaWMgfSBmcm9tIFwiLi9udW1lcmljLmpzXCI7XG5pbXBvcnQgeyByZWFsIH0gZnJvbSBcIi4vcmVhbC5qc1wiO1xuaW1wb3J0IHsgdGV4dCB9IGZyb20gXCIuL3RleHQuanNcIjtcbmZ1bmN0aW9uIGdldFNRTGl0ZUNvbHVtbkJ1aWxkZXJzKCkge1xuICByZXR1cm4ge1xuICAgIGJsb2IsXG4gICAgY3VzdG9tVHlwZSxcbiAgICBpbnRlZ2VyLFxuICAgIG51bWVyaWMsXG4gICAgcmVhbCxcbiAgICB0ZXh0XG4gIH07XG59XG5leHBvcnQge1xuICBnZXRTUUxpdGVDb2x1bW5CdWlsZGVyc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFsbC5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgZ2V0U1FMaXRlQ29sdW1uQnVpbGRlcnMgfSBmcm9tIFwiLi9jb2x1bW5zL2FsbC5qc1wiO1xuY29uc3QgSW5saW5lRm9yZWlnbktleXMgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpTUUxpdGVJbmxpbmVGb3JlaWduS2V5c1wiKTtcbmNsYXNzIFNRTGl0ZVRhYmxlIGV4dGVuZHMgVGFibGUge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUYWJsZVwiO1xuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBTeW1ib2wgPSBPYmplY3QuYXNzaWduKHt9LCBUYWJsZS5TeW1ib2wsIHtcbiAgICBJbmxpbmVGb3JlaWduS2V5c1xuICB9KTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xuICAvKiogQGludGVybmFsICovXG4gIFtJbmxpbmVGb3JlaWduS2V5c10gPSBbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQnVpbGRlcl0gPSB2b2lkIDA7XG59XG5mdW5jdGlvbiBzcWxpdGVUYWJsZUJhc2UobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcsIHNjaGVtYSwgYmFzZU5hbWUgPSBuYW1lKSB7XG4gIGNvbnN0IHJhd1RhYmxlID0gbmV3IFNRTGl0ZVRhYmxlKG5hbWUsIHNjaGVtYSwgYmFzZU5hbWUpO1xuICBjb25zdCBwYXJzZWRDb2x1bW5zID0gdHlwZW9mIGNvbHVtbnMgPT09IFwiZnVuY3Rpb25cIiA/IGNvbHVtbnMoZ2V0U1FMaXRlQ29sdW1uQnVpbGRlcnMoKSkgOiBjb2x1bW5zO1xuICBjb25zdCBidWlsdENvbHVtbnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMocGFyc2VkQ29sdW1ucykubWFwKChbbmFtZTIsIGNvbEJ1aWxkZXJCYXNlXSkgPT4ge1xuICAgICAgY29uc3QgY29sQnVpbGRlciA9IGNvbEJ1aWxkZXJCYXNlO1xuICAgICAgY29sQnVpbGRlci5zZXROYW1lKG5hbWUyKTtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbEJ1aWxkZXIuYnVpbGQocmF3VGFibGUpO1xuICAgICAgcmF3VGFibGVbSW5saW5lRm9yZWlnbktleXNdLnB1c2goLi4uY29sQnVpbGRlci5idWlsZEZvcmVpZ25LZXlzKGNvbHVtbiwgcmF3VGFibGUpKTtcbiAgICAgIHJldHVybiBbbmFtZTIsIGNvbHVtbl07XG4gICAgfSlcbiAgKTtcbiAgY29uc3QgdGFibGUgPSBPYmplY3QuYXNzaWduKHJhd1RhYmxlLCBidWlsdENvbHVtbnMpO1xuICB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10gPSBidWlsdENvbHVtbnM7XG4gIHRhYmxlW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0NvbHVtbnNdID0gYnVpbHRDb2x1bW5zO1xuICBpZiAoZXh0cmFDb25maWcpIHtcbiAgICB0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdCdWlsZGVyXSA9IGV4dHJhQ29uZmlnO1xuICB9XG4gIHJldHVybiB0YWJsZTtcbn1cbmNvbnN0IHNxbGl0ZVRhYmxlID0gKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnKSA9PiB7XG4gIHJldHVybiBzcWxpdGVUYWJsZUJhc2UobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcpO1xufTtcbmZ1bmN0aW9uIHNxbGl0ZVRhYmxlQ3JlYXRvcihjdXN0b21pemVUYWJsZU5hbWUpIHtcbiAgcmV0dXJuIChuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZykgPT4ge1xuICAgIHJldHVybiBzcWxpdGVUYWJsZUJhc2UoY3VzdG9taXplVGFibGVOYW1lKG5hbWUpLCBjb2x1bW5zLCBleHRyYUNvbmZpZywgdm9pZCAwLCBuYW1lKTtcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIElubGluZUZvcmVpZ25LZXlzLFxuICBTUUxpdGVUYWJsZSxcbiAgc3FsaXRlVGFibGUsXG4gIHNxbGl0ZVRhYmxlQ3JlYXRvclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhYmxlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmNsYXNzIEluZGV4QnVpbGRlck9uIHtcbiAgY29uc3RydWN0b3IobmFtZSwgdW5pcXVlKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnVuaXF1ZSA9IHVuaXF1ZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVJbmRleEJ1aWxkZXJPblwiO1xuICBvbiguLi5jb2x1bW5zKSB7XG4gICAgcmV0dXJuIG5ldyBJbmRleEJ1aWxkZXIodGhpcy5uYW1lLCBjb2x1bW5zLCB0aGlzLnVuaXF1ZSk7XG4gIH1cbn1cbmNsYXNzIEluZGV4QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUluZGV4QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbmZpZztcbiAgY29uc3RydWN0b3IobmFtZSwgY29sdW1ucywgdW5pcXVlKSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBuYW1lLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHVuaXF1ZSxcbiAgICAgIHdoZXJlOiB2b2lkIDBcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBDb25kaXRpb24gZm9yIHBhcnRpYWwgaW5kZXguXG4gICAqL1xuICB3aGVyZShjb25kaXRpb24pIHtcbiAgICB0aGlzLmNvbmZpZy53aGVyZSA9IGNvbmRpdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBJbmRleCh0aGlzLmNvbmZpZywgdGFibGUpO1xuICB9XG59XG5jbGFzcyBJbmRleCB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUluZGV4XCI7XG4gIGNvbmZpZztcbiAgY29uc3RydWN0b3IoY29uZmlnLCB0YWJsZSkge1xuICAgIHRoaXMuY29uZmlnID0geyAuLi5jb25maWcsIHRhYmxlIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGluZGV4KG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBJbmRleEJ1aWxkZXJPbihuYW1lLCBmYWxzZSk7XG59XG5mdW5jdGlvbiB1bmlxdWVJbmRleChuYW1lKSB7XG4gIHJldHVybiBuZXcgSW5kZXhCdWlsZGVyT24obmFtZSwgdHJ1ZSk7XG59XG5leHBvcnQge1xuICBJbmRleCxcbiAgSW5kZXhCdWlsZGVyLFxuICBJbmRleEJ1aWxkZXJPbixcbiAgaW5kZXgsXG4gIHVuaXF1ZUluZGV4XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXhlcy5qcy5tYXAiLAogICAgImltcG9ydCB7IGlzIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU1FMIH0gZnJvbSBcIi4uL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi4vdmlldy1jb21tb24uanNcIjtcbmltcG9ydCB7IENoZWNrQnVpbGRlciB9IGZyb20gXCIuL2NoZWNrcy5qc1wiO1xuaW1wb3J0IHsgRm9yZWlnbktleUJ1aWxkZXIgfSBmcm9tIFwiLi9mb3JlaWduLWtleXMuanNcIjtcbmltcG9ydCB7IEluZGV4QnVpbGRlciB9IGZyb20gXCIuL2luZGV4ZXMuanNcIjtcbmltcG9ydCB7IFByaW1hcnlLZXlCdWlsZGVyIH0gZnJvbSBcIi4vcHJpbWFyeS1rZXlzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBVbmlxdWVDb25zdHJhaW50QnVpbGRlciB9IGZyb20gXCIuL3VuaXF1ZS1jb25zdHJhaW50LmpzXCI7XG5mdW5jdGlvbiBnZXRUYWJsZUNvbmZpZyh0YWJsZSkge1xuICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LnZhbHVlcyh0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuQ29sdW1uc10pO1xuICBjb25zdCBpbmRleGVzID0gW107XG4gIGNvbnN0IGNoZWNrcyA9IFtdO1xuICBjb25zdCBwcmltYXJ5S2V5cyA9IFtdO1xuICBjb25zdCB1bmlxdWVDb25zdHJhaW50cyA9IFtdO1xuICBjb25zdCBmb3JlaWduS2V5cyA9IE9iamVjdC52YWx1ZXModGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLklubGluZUZvcmVpZ25LZXlzXSk7XG4gIGNvbnN0IG5hbWUgPSB0YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV07XG4gIGNvbnN0IGV4dHJhQ29uZmlnQnVpbGRlciA9IHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0J1aWxkZXJdO1xuICBpZiAoZXh0cmFDb25maWdCdWlsZGVyICE9PSB2b2lkIDApIHtcbiAgICBjb25zdCBleHRyYUNvbmZpZyA9IGV4dHJhQ29uZmlnQnVpbGRlcih0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuQ29sdW1uc10pO1xuICAgIGNvbnN0IGV4dHJhVmFsdWVzID0gQXJyYXkuaXNBcnJheShleHRyYUNvbmZpZykgPyBleHRyYUNvbmZpZy5mbGF0KDEpIDogT2JqZWN0LnZhbHVlcyhleHRyYUNvbmZpZyk7XG4gICAgZm9yIChjb25zdCBidWlsZGVyIG9mIE9iamVjdC52YWx1ZXMoZXh0cmFWYWx1ZXMpKSB7XG4gICAgICBpZiAoaXMoYnVpbGRlciwgSW5kZXhCdWlsZGVyKSkge1xuICAgICAgICBpbmRleGVzLnB1c2goYnVpbGRlci5idWlsZCh0YWJsZSkpO1xuICAgICAgfSBlbHNlIGlmIChpcyhidWlsZGVyLCBDaGVja0J1aWxkZXIpKSB7XG4gICAgICAgIGNoZWNrcy5wdXNoKGJ1aWxkZXIuYnVpbGQodGFibGUpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXMoYnVpbGRlciwgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIpKSB7XG4gICAgICAgIHVuaXF1ZUNvbnN0cmFpbnRzLnB1c2goYnVpbGRlci5idWlsZCh0YWJsZSkpO1xuICAgICAgfSBlbHNlIGlmIChpcyhidWlsZGVyLCBQcmltYXJ5S2V5QnVpbGRlcikpIHtcbiAgICAgICAgcHJpbWFyeUtleXMucHVzaChidWlsZGVyLmJ1aWxkKHRhYmxlKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzKGJ1aWxkZXIsIEZvcmVpZ25LZXlCdWlsZGVyKSkge1xuICAgICAgICBmb3JlaWduS2V5cy5wdXNoKGJ1aWxkZXIuYnVpbGQodGFibGUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb2x1bW5zLFxuICAgIGluZGV4ZXMsXG4gICAgZm9yZWlnbktleXMsXG4gICAgY2hlY2tzLFxuICAgIHByaW1hcnlLZXlzLFxuICAgIHVuaXF1ZUNvbnN0cmFpbnRzLFxuICAgIG5hbWVcbiAgfTtcbn1cbmZ1bmN0aW9uIGV4dHJhY3RVc2VkVGFibGUodGFibGUpIHtcbiAgaWYgKGlzKHRhYmxlLCBTUUxpdGVUYWJsZSkpIHtcbiAgICByZXR1cm4gW2Ake3RhYmxlW1RhYmxlLlN5bWJvbC5CYXNlTmFtZV19YF07XG4gIH1cbiAgaWYgKGlzKHRhYmxlLCBTdWJxdWVyeSkpIHtcbiAgICByZXR1cm4gdGFibGUuXy51c2VkVGFibGVzID8/IFtdO1xuICB9XG4gIGlmIChpcyh0YWJsZSwgU1FMKSkge1xuICAgIHJldHVybiB0YWJsZS51c2VkVGFibGVzID8/IFtdO1xuICB9XG4gIHJldHVybiBbXTtcbn1cbmZ1bmN0aW9uIGdldFZpZXdDb25maWcodmlldykge1xuICByZXR1cm4ge1xuICAgIC4uLnZpZXdbVmlld0Jhc2VDb25maWddXG4gICAgLy8gLi4udmlld1tTUUxpdGVWaWV3Q29uZmlnXSxcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIGV4dHJhY3RVc2VkVGFibGUsXG4gIGdldFRhYmxlQ29uZmlnLFxuICBnZXRWaWV3Q29uZmlnXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmltcG9ydCB7IFNlbGVjdGlvblByb3h5SGFuZGxlciB9IGZyb20gXCIuLi8uLi9zZWxlY3Rpb24tcHJveHkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgb3JkZXJTZWxlY3RlZEZpZWxkcyB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgZXh0cmFjdFVzZWRUYWJsZSB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuY2xhc3MgU1FMaXRlRGVsZXRlQmFzZSBleHRlbmRzIFF1ZXJ5UHJvbWlzZSB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBzZXNzaW9uLCBkaWFsZWN0LCB3aXRoTGlzdCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLmNvbmZpZyA9IHsgdGFibGUsIHdpdGhMaXN0IH07XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlRGVsZXRlXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uZmlnO1xuICAvKipcbiAgICogQWRkcyBhIGB3aGVyZWAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGRlbGV0ZSBvbmx5IHRob3NlIHJvd3MgdGhhdCBmdWxmaWxsIGEgc3BlY2lmaWVkIGNvbmRpdGlvbi5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9kZWxldGV9XG4gICAqXG4gICAqIEBwYXJhbSB3aGVyZSB0aGUgYHdoZXJlYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFlvdSBjYW4gdXNlIGNvbmRpdGlvbmFsIG9wZXJhdG9ycyBhbmQgYHNxbCBmdW5jdGlvbmAgdG8gZmlsdGVyIHRoZSByb3dzIHRvIGJlIGRlbGV0ZWQuXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIERlbGV0ZSBhbGwgY2FycyB3aXRoIGdyZWVuIGNvbG9yXG4gICAqIGRiLmRlbGV0ZShjYXJzKS53aGVyZShlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSk7XG4gICAqIC8vIG9yXG4gICAqIGRiLmRlbGV0ZShjYXJzKS53aGVyZShzcWxgJHtjYXJzLmNvbG9yfSA9ICdncmVlbidgKVxuICAgKiBgYGBcbiAgICpcbiAgICogWW91IGNhbiBsb2dpY2FsbHkgY29tYmluZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgd2l0aCBgYW5kKClgIGFuZCBgb3IoKWAgb3BlcmF0b3JzOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBEZWxldGUgYWxsIEJNVyBjYXJzIHdpdGggYSBncmVlbiBjb2xvclxuICAgKiBkYi5kZWxldGUoY2Fycykud2hlcmUoYW5kKGVxKGNhcnMuY29sb3IsICdncmVlbicpLCBlcShjYXJzLmJyYW5kLCAnQk1XJykpKTtcbiAgICpcbiAgICogLy8gRGVsZXRlIGFsbCBjYXJzIHdpdGggdGhlIGdyZWVuIG9yIGJsdWUgY29sb3JcbiAgICogZGIuZGVsZXRlKGNhcnMpLndoZXJlKG9yKGVxKGNhcnMuY29sb3IsICdncmVlbicpLCBlcShjYXJzLmNvbG9yLCAnYmx1ZScpKSk7XG4gICAqIGBgYFxuICAgKi9cbiAgd2hlcmUod2hlcmUpIHtcbiAgICB0aGlzLmNvbmZpZy53aGVyZSA9IHdoZXJlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9yZGVyQnkoLi4uY29sdW1ucykge1xuICAgIGlmICh0eXBlb2YgY29sdW1uc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmRlckJ5ID0gY29sdW1uc1swXShcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLnRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCBvcmRlckJ5QXJyYXkgPSBBcnJheS5pc0FycmF5KG9yZGVyQnkpID8gb3JkZXJCeSA6IFtvcmRlckJ5XTtcbiAgICAgIHRoaXMuY29uZmlnLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9yZGVyQnlBcnJheSA9IGNvbHVtbnM7XG4gICAgICB0aGlzLmNvbmZpZy5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBsaW1pdChsaW1pdCkge1xuICAgIHRoaXMuY29uZmlnLmxpbWl0ID0gbGltaXQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgcmV0dXJuaW5nKGZpZWxkcyA9IHRoaXMudGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkNvbHVtbnNdKSB7XG4gICAgdGhpcy5jb25maWcucmV0dXJuaW5nID0gb3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiB0aGlzLmRpYWxlY3QuYnVpbGREZWxldGVRdWVyeSh0aGlzLmNvbmZpZyk7XG4gIH1cbiAgdG9TUUwoKSB7XG4gICAgY29uc3QgeyB0eXBpbmdzOiBfdHlwaW5ncywgLi4ucmVzdCB9ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSk7XG4gICAgcmV0dXJuIHJlc3Q7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJlcGFyZShpc09uZVRpbWVRdWVyeSA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uW2lzT25lVGltZVF1ZXJ5ID8gXCJwcmVwYXJlT25lVGltZVF1ZXJ5XCIgOiBcInByZXBhcmVRdWVyeVwiXShcbiAgICAgIHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nID8gXCJhbGxcIiA6IFwicnVuXCIsXG4gICAgICB0cnVlLFxuICAgICAgdm9pZCAwLFxuICAgICAge1xuICAgICAgICB0eXBlOiBcImRlbGV0ZVwiLFxuICAgICAgICB0YWJsZXM6IGV4dHJhY3RVc2VkVGFibGUodGhpcy5jb25maWcudGFibGUpXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwcmVwYXJlKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKTtcbiAgfVxuICBydW4gPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnJ1bihwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFsbCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuYWxsKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgZ2V0ID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5nZXQocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICB2YWx1ZXMgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFzeW5jIGV4ZWN1dGUocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmV4ZWN1dGUocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9XG4gICRkeW5hbWljKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5leHBvcnQge1xuICBTUUxpdGVEZWxldGVCYXNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVsZXRlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuZnVuY3Rpb24gdG9TbmFrZUNhc2UoaW5wdXQpIHtcbiAgY29uc3Qgd29yZHMgPSBpbnB1dC5yZXBsYWNlKC9bJ1xcdTIwMTldL2csIFwiXCIpLm1hdGNoKC9bXFxkYS16XSt8W0EtWl0rKD8hW2Etel0pfFtBLVpdW1xcZGEtel0rL2cpID8/IFtdO1xuICByZXR1cm4gd29yZHMubWFwKCh3b3JkKSA9PiB3b3JkLnRvTG93ZXJDYXNlKCkpLmpvaW4oXCJfXCIpO1xufVxuZnVuY3Rpb24gdG9DYW1lbENhc2UoaW5wdXQpIHtcbiAgY29uc3Qgd29yZHMgPSBpbnB1dC5yZXBsYWNlKC9bJ1xcdTIwMTldL2csIFwiXCIpLm1hdGNoKC9bXFxkYS16XSt8W0EtWl0rKD8hW2Etel0pfFtBLVpdW1xcZGEtel0rL2cpID8/IFtdO1xuICByZXR1cm4gd29yZHMucmVkdWNlKChhY2MsIHdvcmQsIGkpID0+IHtcbiAgICBjb25zdCBmb3JtYXR0ZWRXb3JkID0gaSA9PT0gMCA/IHdvcmQudG9Mb3dlckNhc2UoKSA6IGAke3dvcmRbMF0udG9VcHBlckNhc2UoKX0ke3dvcmQuc2xpY2UoMSl9YDtcbiAgICByZXR1cm4gYWNjICsgZm9ybWF0dGVkV29yZDtcbiAgfSwgXCJcIik7XG59XG5mdW5jdGlvbiBub29wQ2FzZShpbnB1dCkge1xuICByZXR1cm4gaW5wdXQ7XG59XG5jbGFzcyBDYXNpbmdDYWNoZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkNhc2luZ0NhY2hlXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY2FjaGUgPSB7fTtcbiAgY2FjaGVkVGFibGVzID0ge307XG4gIGNvbnZlcnQ7XG4gIGNvbnN0cnVjdG9yKGNhc2luZykge1xuICAgIHRoaXMuY29udmVydCA9IGNhc2luZyA9PT0gXCJzbmFrZV9jYXNlXCIgPyB0b1NuYWtlQ2FzZSA6IGNhc2luZyA9PT0gXCJjYW1lbENhc2VcIiA/IHRvQ2FtZWxDYXNlIDogbm9vcENhc2U7XG4gIH1cbiAgZ2V0Q29sdW1uQ2FzaW5nKGNvbHVtbikge1xuICAgIGlmICghY29sdW1uLmtleUFzTmFtZSkgcmV0dXJuIGNvbHVtbi5uYW1lO1xuICAgIGNvbnN0IHNjaGVtYSA9IGNvbHVtbi50YWJsZVtUYWJsZS5TeW1ib2wuU2NoZW1hXSA/PyBcInB1YmxpY1wiO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IGNvbHVtbi50YWJsZVtUYWJsZS5TeW1ib2wuT3JpZ2luYWxOYW1lXTtcbiAgICBjb25zdCBrZXkgPSBgJHtzY2hlbWF9LiR7dGFibGVOYW1lfS4ke2NvbHVtbi5uYW1lfWA7XG4gICAgaWYgKCF0aGlzLmNhY2hlW2tleV0pIHtcbiAgICAgIHRoaXMuY2FjaGVUYWJsZShjb2x1bW4udGFibGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZVtrZXldO1xuICB9XG4gIGNhY2hlVGFibGUodGFibGUpIHtcbiAgICBjb25zdCBzY2hlbWEgPSB0YWJsZVtUYWJsZS5TeW1ib2wuU2NoZW1hXSA/PyBcInB1YmxpY1wiO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRhYmxlW1RhYmxlLlN5bWJvbC5PcmlnaW5hbE5hbWVdO1xuICAgIGNvbnN0IHRhYmxlS2V5ID0gYCR7c2NoZW1hfS4ke3RhYmxlTmFtZX1gO1xuICAgIGlmICghdGhpcy5jYWNoZWRUYWJsZXNbdGFibGVLZXldKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBPYmplY3QudmFsdWVzKHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSkpIHtcbiAgICAgICAgY29uc3QgY29sdW1uS2V5ID0gYCR7dGFibGVLZXl9LiR7Y29sdW1uLm5hbWV9YDtcbiAgICAgICAgdGhpcy5jYWNoZVtjb2x1bW5LZXldID0gdGhpcy5jb252ZXJ0KGNvbHVtbi5uYW1lKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FjaGVkVGFibGVzW3RhYmxlS2V5XSA9IHRydWU7XG4gICAgfVxuICB9XG4gIGNsZWFyQ2FjaGUoKSB7XG4gICAgdGhpcy5jYWNoZSA9IHt9O1xuICAgIHRoaXMuY2FjaGVkVGFibGVzID0ge307XG4gIH1cbn1cbmV4cG9ydCB7XG4gIENhc2luZ0NhY2hlLFxuICB0b0NhbWVsQ2FzZSxcbiAgdG9TbmFrZUNhc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYXNpbmcuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5jbGFzcyBEcml6emxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkRyaXp6bGVFcnJvclwiO1xuICBjb25zdHJ1Y3Rvcih7IG1lc3NhZ2UsIGNhdXNlIH0pIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIkRyaXp6bGVFcnJvclwiO1xuICAgIHRoaXMuY2F1c2UgPSBjYXVzZTtcbiAgfVxufVxuY2xhc3MgRHJpenpsZVF1ZXJ5RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHF1ZXJ5LCBwYXJhbXMsIGNhdXNlKSB7XG4gICAgc3VwZXIoYEZhaWxlZCBxdWVyeTogJHtxdWVyeX1cbnBhcmFtczogJHtwYXJhbXN9YCk7XG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5O1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMuY2F1c2UgPSBjYXVzZTtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBEcml6emxlUXVlcnlFcnJvcik7XG4gICAgaWYgKGNhdXNlKSB0aGlzLmNhdXNlID0gY2F1c2U7XG4gIH1cbn1cbmNsYXNzIFRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvciBleHRlbmRzIERyaXp6bGVFcnJvciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvclwiO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7IG1lc3NhZ2U6IFwiUm9sbGJhY2tcIiB9KTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgRHJpenpsZUVycm9yLFxuICBEcml6emxlUXVlcnlFcnJvcixcbiAgVHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3JzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBnZXRQZ0NvbHVtbkJ1aWxkZXJzIH0gZnJvbSBcIi4vY29sdW1ucy9hbGwuanNcIjtcbmNvbnN0IElubGluZUZvcmVpZ25LZXlzID0gU3ltYm9sLmZvcihcImRyaXp6bGU6UGdJbmxpbmVGb3JlaWduS2V5c1wiKTtcbmNvbnN0IEVuYWJsZVJMUyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOkVuYWJsZVJMU1wiKTtcbmNsYXNzIFBnVGFibGUgZXh0ZW5kcyBUYWJsZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnVGFibGVcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgU3ltYm9sID0gT2JqZWN0LmFzc2lnbih7fSwgVGFibGUuU3ltYm9sLCB7XG4gICAgSW5saW5lRm9yZWlnbktleXMsXG4gICAgRW5hYmxlUkxTXG4gIH0pO1xuICAvKipAaW50ZXJuYWwgKi9cbiAgW0lubGluZUZvcmVpZ25LZXlzXSA9IFtdO1xuICAvKiogQGludGVybmFsICovXG4gIFtFbmFibGVSTFNdID0gZmFsc2U7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0J1aWxkZXJdID0gdm9pZCAwO1xuICAvKiogQGludGVybmFsICovXG4gIFtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdDb2x1bW5zXSA9IHt9O1xufVxuZnVuY3Rpb24gcGdUYWJsZVdpdGhTY2hlbWEobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcsIHNjaGVtYSwgYmFzZU5hbWUgPSBuYW1lKSB7XG4gIGNvbnN0IHJhd1RhYmxlID0gbmV3IFBnVGFibGUobmFtZSwgc2NoZW1hLCBiYXNlTmFtZSk7XG4gIGNvbnN0IHBhcnNlZENvbHVtbnMgPSB0eXBlb2YgY29sdW1ucyA9PT0gXCJmdW5jdGlvblwiID8gY29sdW1ucyhnZXRQZ0NvbHVtbkJ1aWxkZXJzKCkpIDogY29sdW1ucztcbiAgY29uc3QgYnVpbHRDb2x1bW5zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHBhcnNlZENvbHVtbnMpLm1hcCgoW25hbWUyLCBjb2xCdWlsZGVyQmFzZV0pID0+IHtcbiAgICAgIGNvbnN0IGNvbEJ1aWxkZXIgPSBjb2xCdWlsZGVyQmFzZTtcbiAgICAgIGNvbEJ1aWxkZXIuc2V0TmFtZShuYW1lMik7XG4gICAgICBjb25zdCBjb2x1bW4gPSBjb2xCdWlsZGVyLmJ1aWxkKHJhd1RhYmxlKTtcbiAgICAgIHJhd1RhYmxlW0lubGluZUZvcmVpZ25LZXlzXS5wdXNoKC4uLmNvbEJ1aWxkZXIuYnVpbGRGb3JlaWduS2V5cyhjb2x1bW4sIHJhd1RhYmxlKSk7XG4gICAgICByZXR1cm4gW25hbWUyLCBjb2x1bW5dO1xuICAgIH0pXG4gICk7XG4gIGNvbnN0IGJ1aWx0Q29sdW1uc0ZvckV4dHJhQ29uZmlnID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHBhcnNlZENvbHVtbnMpLm1hcCgoW25hbWUyLCBjb2xCdWlsZGVyQmFzZV0pID0+IHtcbiAgICAgIGNvbnN0IGNvbEJ1aWxkZXIgPSBjb2xCdWlsZGVyQmFzZTtcbiAgICAgIGNvbEJ1aWxkZXIuc2V0TmFtZShuYW1lMik7XG4gICAgICBjb25zdCBjb2x1bW4gPSBjb2xCdWlsZGVyLmJ1aWxkRXh0cmFDb25maWdDb2x1bW4ocmF3VGFibGUpO1xuICAgICAgcmV0dXJuIFtuYW1lMiwgY29sdW1uXTtcbiAgICB9KVxuICApO1xuICBjb25zdCB0YWJsZSA9IE9iamVjdC5hc3NpZ24ocmF3VGFibGUsIGJ1aWx0Q29sdW1ucyk7XG4gIHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSA9IGJ1aWx0Q29sdW1ucztcbiAgdGFibGVbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQ29sdW1uc10gPSBidWlsdENvbHVtbnNGb3JFeHRyYUNvbmZpZztcbiAgaWYgKGV4dHJhQ29uZmlnKSB7XG4gICAgdGFibGVbUGdUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdCdWlsZGVyXSA9IGV4dHJhQ29uZmlnO1xuICB9XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHRhYmxlLCB7XG4gICAgZW5hYmxlUkxTOiAoKSA9PiB7XG4gICAgICB0YWJsZVtQZ1RhYmxlLlN5bWJvbC5FbmFibGVSTFNdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG4gIH0pO1xufVxuY29uc3QgcGdUYWJsZSA9IChuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZykgPT4ge1xuICByZXR1cm4gcGdUYWJsZVdpdGhTY2hlbWEobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcsIHZvaWQgMCk7XG59O1xuZnVuY3Rpb24gcGdUYWJsZUNyZWF0b3IoY3VzdG9taXplVGFibGVOYW1lKSB7XG4gIHJldHVybiAobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcpID0+IHtcbiAgICByZXR1cm4gcGdUYWJsZVdpdGhTY2hlbWEoY3VzdG9taXplVGFibGVOYW1lKG5hbWUpLCBjb2x1bW5zLCBleHRyYUNvbmZpZywgdm9pZCAwLCBuYW1lKTtcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIEVuYWJsZVJMUyxcbiAgSW5saW5lRm9yZWlnbktleXMsXG4gIFBnVGFibGUsXG4gIHBnVGFibGUsXG4gIHBnVGFibGVDcmVhdG9yLFxuICBwZ1RhYmxlV2l0aFNjaGVtYVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhYmxlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFBnVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuZnVuY3Rpb24gcHJpbWFyeUtleSguLi5jb25maWcpIHtcbiAgaWYgKGNvbmZpZ1swXS5jb2x1bW5zKSB7XG4gICAgcmV0dXJuIG5ldyBQcmltYXJ5S2V5QnVpbGRlcihjb25maWdbMF0uY29sdW1ucywgY29uZmlnWzBdLm5hbWUpO1xuICB9XG4gIHJldHVybiBuZXcgUHJpbWFyeUtleUJ1aWxkZXIoY29uZmlnKTtcbn1cbmNsYXNzIFByaW1hcnlLZXlCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdQcmltYXJ5S2V5QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbHVtbnM7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbmFtZTtcbiAgY29uc3RydWN0b3IoY29sdW1ucywgbmFtZSkge1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBQcmltYXJ5S2V5KHRhYmxlLCB0aGlzLmNvbHVtbnMsIHRoaXMubmFtZSk7XG4gIH1cbn1cbmNsYXNzIFByaW1hcnlLZXkge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29sdW1ucywgbmFtZSkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdQcmltYXJ5S2V5XCI7XG4gIGNvbHVtbnM7XG4gIG5hbWU7XG4gIGdldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZSA/PyBgJHt0aGlzLnRhYmxlW1BnVGFibGUuU3ltYm9sLk5hbWVdfV8ke3RoaXMuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpLmpvaW4oXCJfXCIpfV9wa2A7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFByaW1hcnlLZXksXG4gIFByaW1hcnlLZXlCdWlsZGVyLFxuICBwcmltYXJ5S2V5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJpbWFyeS1rZXlzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uLy4uL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgaXMgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS5qc1wiO1xuaW1wb3J0IHtcbiAgaXNEcml2ZXJWYWx1ZUVuY29kZXIsXG4gIGlzU1FMV3JhcHBlcixcbiAgUGFyYW0sXG4gIFBsYWNlaG9sZGVyLFxuICBTUUwsXG4gIHNxbCxcbiAgU3RyaW5nQ2h1bmssXG4gIFZpZXdcbn0gZnJvbSBcIi4uL3NxbC5qc1wiO1xuZnVuY3Rpb24gYmluZElmUGFyYW0odmFsdWUsIGNvbHVtbikge1xuICBpZiAoaXNEcml2ZXJWYWx1ZUVuY29kZXIoY29sdW1uKSAmJiAhaXNTUUxXcmFwcGVyKHZhbHVlKSAmJiAhaXModmFsdWUsIFBhcmFtKSAmJiAhaXModmFsdWUsIFBsYWNlaG9sZGVyKSAmJiAhaXModmFsdWUsIENvbHVtbikgJiYgIWlzKHZhbHVlLCBUYWJsZSkgJiYgIWlzKHZhbHVlLCBWaWV3KSkge1xuICAgIHJldHVybiBuZXcgUGFyYW0odmFsdWUsIGNvbHVtbik7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuY29uc3QgZXEgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIHNxbGAke2xlZnR9ID0gJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5jb25zdCBuZSA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPD4gJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5mdW5jdGlvbiBhbmQoLi4udW5maWx0ZXJlZENvbmRpdGlvbnMpIHtcbiAgY29uc3QgY29uZGl0aW9ucyA9IHVuZmlsdGVyZWRDb25kaXRpb25zLmZpbHRlcihcbiAgICAoYykgPT4gYyAhPT0gdm9pZCAwXG4gICk7XG4gIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoY29uZGl0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTUUwoW1xuICAgIG5ldyBTdHJpbmdDaHVuayhcIihcIiksXG4gICAgc3FsLmpvaW4oY29uZGl0aW9ucywgbmV3IFN0cmluZ0NodW5rKFwiIGFuZCBcIikpLFxuICAgIG5ldyBTdHJpbmdDaHVuayhcIilcIilcbiAgXSk7XG59XG5mdW5jdGlvbiBvciguLi51bmZpbHRlcmVkQ29uZGl0aW9ucykge1xuICBjb25zdCBjb25kaXRpb25zID0gdW5maWx0ZXJlZENvbmRpdGlvbnMuZmlsdGVyKFxuICAgIChjKSA9PiBjICE9PSB2b2lkIDBcbiAgKTtcbiAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gbmV3IFNRTChjb25kaXRpb25zKTtcbiAgfVxuICByZXR1cm4gbmV3IFNRTChbXG4gICAgbmV3IFN0cmluZ0NodW5rKFwiKFwiKSxcbiAgICBzcWwuam9pbihjb25kaXRpb25zLCBuZXcgU3RyaW5nQ2h1bmsoXCIgb3IgXCIpKSxcbiAgICBuZXcgU3RyaW5nQ2h1bmsoXCIpXCIpXG4gIF0pO1xufVxuZnVuY3Rpb24gbm90KGNvbmRpdGlvbikge1xuICByZXR1cm4gc3FsYG5vdCAke2NvbmRpdGlvbn1gO1xufVxuY29uc3QgZ3QgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIHNxbGAke2xlZnR9ID4gJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5jb25zdCBndGUgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIHNxbGAke2xlZnR9ID49ICR7YmluZElmUGFyYW0ocmlnaHQsIGxlZnQpfWA7XG59O1xuY29uc3QgbHQgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIHNxbGAke2xlZnR9IDwgJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5jb25zdCBsdGUgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIHNxbGAke2xlZnR9IDw9ICR7YmluZElmUGFyYW0ocmlnaHQsIGxlZnQpfWA7XG59O1xuZnVuY3Rpb24gaW5BcnJheShjb2x1bW4sIHZhbHVlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBzcWxgZmFsc2VgO1xuICAgIH1cbiAgICByZXR1cm4gc3FsYCR7Y29sdW1ufSBpbiAke3ZhbHVlcy5tYXAoKHYpID0+IGJpbmRJZlBhcmFtKHYsIGNvbHVtbikpfWA7XG4gIH1cbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gaW4gJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbn1cbmZ1bmN0aW9uIG5vdEluQXJyYXkoY29sdW1uLCB2YWx1ZXMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gc3FsYHRydWVgO1xuICAgIH1cbiAgICByZXR1cm4gc3FsYCR7Y29sdW1ufSBub3QgaW4gJHt2YWx1ZXMubWFwKCh2KSA9PiBiaW5kSWZQYXJhbSh2LCBjb2x1bW4pKX1gO1xuICB9XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IG5vdCBpbiAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xufVxuZnVuY3Rpb24gaXNOdWxsKHZhbHVlKSB7XG4gIHJldHVybiBzcWxgJHt2YWx1ZX0gaXMgbnVsbGA7XG59XG5mdW5jdGlvbiBpc05vdE51bGwodmFsdWUpIHtcbiAgcmV0dXJuIHNxbGAke3ZhbHVlfSBpcyBub3QgbnVsbGA7XG59XG5mdW5jdGlvbiBleGlzdHMoc3VicXVlcnkpIHtcbiAgcmV0dXJuIHNxbGBleGlzdHMgJHtzdWJxdWVyeX1gO1xufVxuZnVuY3Rpb24gbm90RXhpc3RzKHN1YnF1ZXJ5KSB7XG4gIHJldHVybiBzcWxgbm90IGV4aXN0cyAke3N1YnF1ZXJ5fWA7XG59XG5mdW5jdGlvbiBiZXR3ZWVuKGNvbHVtbiwgbWluLCBtYXgpIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gYmV0d2VlbiAke2JpbmRJZlBhcmFtKG1pbiwgY29sdW1uKX0gYW5kICR7YmluZElmUGFyYW0oXG4gICAgbWF4LFxuICAgIGNvbHVtblxuICApfWA7XG59XG5mdW5jdGlvbiBub3RCZXR3ZWVuKGNvbHVtbiwgbWluLCBtYXgpIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gbm90IGJldHdlZW4gJHtiaW5kSWZQYXJhbShcbiAgICBtaW4sXG4gICAgY29sdW1uXG4gICl9IGFuZCAke2JpbmRJZlBhcmFtKG1heCwgY29sdW1uKX1gO1xufVxuZnVuY3Rpb24gbGlrZShjb2x1bW4sIHZhbHVlKSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IGxpa2UgJHt2YWx1ZX1gO1xufVxuZnVuY3Rpb24gbm90TGlrZShjb2x1bW4sIHZhbHVlKSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IG5vdCBsaWtlICR7dmFsdWV9YDtcbn1cbmZ1bmN0aW9uIGlsaWtlKGNvbHVtbiwgdmFsdWUpIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gaWxpa2UgJHt2YWx1ZX1gO1xufVxuZnVuY3Rpb24gbm90SWxpa2UoY29sdW1uLCB2YWx1ZSkge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBub3QgaWxpa2UgJHt2YWx1ZX1gO1xufVxuZnVuY3Rpb24gYXJyYXlDb250YWlucyhjb2x1bW4sIHZhbHVlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFycmF5Q29udGFpbnMgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHZhbHVlXCIpO1xuICAgIH1cbiAgICBjb25zdCBhcnJheSA9IHNxbGAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xuICAgIHJldHVybiBzcWxgJHtjb2x1bW59IEA+ICR7YXJyYXl9YDtcbiAgfVxuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBAPiAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xufVxuZnVuY3Rpb24gYXJyYXlDb250YWluZWQoY29sdW1uLCB2YWx1ZXMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhcnJheUNvbnRhaW5lZCByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdmFsdWVcIik7XG4gICAgfVxuICAgIGNvbnN0IGFycmF5ID0gc3FsYCR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG4gICAgcmV0dXJuIHNxbGAke2NvbHVtbn0gPEAgJHthcnJheX1gO1xuICB9XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IDxAICR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG59XG5mdW5jdGlvbiBhcnJheU92ZXJsYXBzKGNvbHVtbiwgdmFsdWVzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXJyYXlPdmVybGFwcyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdmFsdWVcIik7XG4gICAgfVxuICAgIGNvbnN0IGFycmF5ID0gc3FsYCR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG4gICAgcmV0dXJuIHNxbGAke2NvbHVtbn0gJiYgJHthcnJheX1gO1xuICB9XG4gIHJldHVybiBzcWxgJHtjb2x1bW59ICYmICR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG59XG5leHBvcnQge1xuICBhbmQsXG4gIGFycmF5Q29udGFpbmVkLFxuICBhcnJheUNvbnRhaW5zLFxuICBhcnJheU92ZXJsYXBzLFxuICBiZXR3ZWVuLFxuICBiaW5kSWZQYXJhbSxcbiAgZXEsXG4gIGV4aXN0cyxcbiAgZ3QsXG4gIGd0ZSxcbiAgaWxpa2UsXG4gIGluQXJyYXksXG4gIGlzTm90TnVsbCxcbiAgaXNOdWxsLFxuICBsaWtlLFxuICBsdCxcbiAgbHRlLFxuICBuZSxcbiAgbm90LFxuICBub3RCZXR3ZWVuLFxuICBub3RFeGlzdHMsXG4gIG5vdElsaWtlLFxuICBub3RJbkFycmF5LFxuICBub3RMaWtlLFxuICBvclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmRpdGlvbnMuanMubWFwIiwKICAgICJpbXBvcnQgeyBzcWwgfSBmcm9tIFwiLi4vc3FsLmpzXCI7XG5mdW5jdGlvbiBhc2MoY29sdW1uKSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IGFzY2A7XG59XG5mdW5jdGlvbiBkZXNjKGNvbHVtbikge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBkZXNjYDtcbn1cbmV4cG9ydCB7XG4gIGFzYyxcbiAgZGVzY1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlbGVjdC5qcy5tYXAiLAogICAgImltcG9ydCB7IGdldFRhYmxlVW5pcXVlTmFtZSwgVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUHJpbWFyeUtleUJ1aWxkZXIgfSBmcm9tIFwiLi9wZy1jb3JlL3ByaW1hcnkta2V5cy5qc1wiO1xuaW1wb3J0IHtcbiAgYW5kLFxuICBhc2MsXG4gIGJldHdlZW4sXG4gIGRlc2MsXG4gIGVxLFxuICBleGlzdHMsXG4gIGd0LFxuICBndGUsXG4gIGlsaWtlLFxuICBpbkFycmF5LFxuICBpc05vdE51bGwsXG4gIGlzTnVsbCxcbiAgbGlrZSxcbiAgbHQsXG4gIGx0ZSxcbiAgbmUsXG4gIG5vdCxcbiAgbm90QmV0d2VlbixcbiAgbm90RXhpc3RzLFxuICBub3RJbGlrZSxcbiAgbm90SW5BcnJheSxcbiAgbm90TGlrZSxcbiAgb3Jcbn0gZnJvbSBcIi4vc3FsL2V4cHJlc3Npb25zL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTUUwsIHNxbCB9IGZyb20gXCIuL3NxbC9zcWwuanNcIjtcbmNsYXNzIFJlbGF0aW9uIHtcbiAgY29uc3RydWN0b3Ioc291cmNlVGFibGUsIHJlZmVyZW5jZWRUYWJsZSwgcmVsYXRpb25OYW1lKSB7XG4gICAgdGhpcy5zb3VyY2VUYWJsZSA9IHNvdXJjZVRhYmxlO1xuICAgIHRoaXMucmVmZXJlbmNlZFRhYmxlID0gcmVmZXJlbmNlZFRhYmxlO1xuICAgIHRoaXMucmVsYXRpb25OYW1lID0gcmVsYXRpb25OYW1lO1xuICAgIHRoaXMucmVmZXJlbmNlZFRhYmxlTmFtZSA9IHJlZmVyZW5jZWRUYWJsZVtUYWJsZS5TeW1ib2wuTmFtZV07XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUmVsYXRpb25cIjtcbiAgcmVmZXJlbmNlZFRhYmxlTmFtZTtcbiAgZmllbGROYW1lO1xufVxuY2xhc3MgUmVsYXRpb25zIHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJSZWxhdGlvbnNcIjtcbn1cbmNsYXNzIE9uZSBleHRlbmRzIFJlbGF0aW9uIHtcbiAgY29uc3RydWN0b3Ioc291cmNlVGFibGUsIHJlZmVyZW5jZWRUYWJsZSwgY29uZmlnLCBpc051bGxhYmxlKSB7XG4gICAgc3VwZXIoc291cmNlVGFibGUsIHJlZmVyZW5jZWRUYWJsZSwgY29uZmlnPy5yZWxhdGlvbk5hbWUpO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuaXNOdWxsYWJsZSA9IGlzTnVsbGFibGU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiT25lXCI7XG4gIHdpdGhGaWVsZE5hbWUoZmllbGROYW1lKSB7XG4gICAgY29uc3QgcmVsYXRpb24gPSBuZXcgT25lKFxuICAgICAgdGhpcy5zb3VyY2VUYWJsZSxcbiAgICAgIHRoaXMucmVmZXJlbmNlZFRhYmxlLFxuICAgICAgdGhpcy5jb25maWcsXG4gICAgICB0aGlzLmlzTnVsbGFibGVcbiAgICApO1xuICAgIHJlbGF0aW9uLmZpZWxkTmFtZSA9IGZpZWxkTmFtZTtcbiAgICByZXR1cm4gcmVsYXRpb247XG4gIH1cbn1cbmNsYXNzIE1hbnkgZXh0ZW5kcyBSZWxhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZVRhYmxlLCByZWZlcmVuY2VkVGFibGUsIGNvbmZpZykge1xuICAgIHN1cGVyKHNvdXJjZVRhYmxlLCByZWZlcmVuY2VkVGFibGUsIGNvbmZpZz8ucmVsYXRpb25OYW1lKTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJNYW55XCI7XG4gIHdpdGhGaWVsZE5hbWUoZmllbGROYW1lKSB7XG4gICAgY29uc3QgcmVsYXRpb24gPSBuZXcgTWFueShcbiAgICAgIHRoaXMuc291cmNlVGFibGUsXG4gICAgICB0aGlzLnJlZmVyZW5jZWRUYWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgICByZWxhdGlvbi5maWVsZE5hbWUgPSBmaWVsZE5hbWU7XG4gICAgcmV0dXJuIHJlbGF0aW9uO1xuICB9XG59XG5mdW5jdGlvbiBnZXRPcGVyYXRvcnMoKSB7XG4gIHJldHVybiB7XG4gICAgYW5kLFxuICAgIGJldHdlZW4sXG4gICAgZXEsXG4gICAgZXhpc3RzLFxuICAgIGd0LFxuICAgIGd0ZSxcbiAgICBpbGlrZSxcbiAgICBpbkFycmF5LFxuICAgIGlzTnVsbCxcbiAgICBpc05vdE51bGwsXG4gICAgbGlrZSxcbiAgICBsdCxcbiAgICBsdGUsXG4gICAgbmUsXG4gICAgbm90LFxuICAgIG5vdEJldHdlZW4sXG4gICAgbm90RXhpc3RzLFxuICAgIG5vdExpa2UsXG4gICAgbm90SWxpa2UsXG4gICAgbm90SW5BcnJheSxcbiAgICBvcixcbiAgICBzcWxcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldE9yZGVyQnlPcGVyYXRvcnMoKSB7XG4gIHJldHVybiB7XG4gICAgc3FsLFxuICAgIGFzYyxcbiAgICBkZXNjXG4gIH07XG59XG5mdW5jdGlvbiBleHRyYWN0VGFibGVzUmVsYXRpb25hbENvbmZpZyhzY2hlbWEsIGNvbmZpZ0hlbHBlcnMpIHtcbiAgaWYgKE9iamVjdC5rZXlzKHNjaGVtYSkubGVuZ3RoID09PSAxICYmIFwiZGVmYXVsdFwiIGluIHNjaGVtYSAmJiAhaXMoc2NoZW1hW1wiZGVmYXVsdFwiXSwgVGFibGUpKSB7XG4gICAgc2NoZW1hID0gc2NoZW1hW1wiZGVmYXVsdFwiXTtcbiAgfVxuICBjb25zdCB0YWJsZU5hbWVzTWFwID0ge307XG4gIGNvbnN0IHJlbGF0aW9uc0J1ZmZlciA9IHt9O1xuICBjb25zdCB0YWJsZXNDb25maWcgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgIGlmIChpcyh2YWx1ZSwgVGFibGUpKSB7XG4gICAgICBjb25zdCBkYk5hbWUgPSBnZXRUYWJsZVVuaXF1ZU5hbWUodmFsdWUpO1xuICAgICAgY29uc3QgYnVmZmVyZWRSZWxhdGlvbnMgPSByZWxhdGlvbnNCdWZmZXJbZGJOYW1lXTtcbiAgICAgIHRhYmxlTmFtZXNNYXBbZGJOYW1lXSA9IGtleTtcbiAgICAgIHRhYmxlc0NvbmZpZ1trZXldID0ge1xuICAgICAgICB0c05hbWU6IGtleSxcbiAgICAgICAgZGJOYW1lOiB2YWx1ZVtUYWJsZS5TeW1ib2wuTmFtZV0sXG4gICAgICAgIHNjaGVtYTogdmFsdWVbVGFibGUuU3ltYm9sLlNjaGVtYV0sXG4gICAgICAgIGNvbHVtbnM6IHZhbHVlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSxcbiAgICAgICAgcmVsYXRpb25zOiBidWZmZXJlZFJlbGF0aW9ucz8ucmVsYXRpb25zID8/IHt9LFxuICAgICAgICBwcmltYXJ5S2V5OiBidWZmZXJlZFJlbGF0aW9ucz8ucHJpbWFyeUtleSA/PyBbXVxuICAgICAgfTtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIE9iamVjdC52YWx1ZXMoXG4gICAgICAgIHZhbHVlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXVxuICAgICAgKSkge1xuICAgICAgICBpZiAoY29sdW1uLnByaW1hcnkpIHtcbiAgICAgICAgICB0YWJsZXNDb25maWdba2V5XS5wcmltYXJ5S2V5LnB1c2goY29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZXh0cmFDb25maWcgPSB2YWx1ZVtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdCdWlsZGVyXT8uKHZhbHVlW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0NvbHVtbnNdKTtcbiAgICAgIGlmIChleHRyYUNvbmZpZykge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbmZpZ0VudHJ5IG9mIE9iamVjdC52YWx1ZXMoZXh0cmFDb25maWcpKSB7XG4gICAgICAgICAgaWYgKGlzKGNvbmZpZ0VudHJ5LCBQcmltYXJ5S2V5QnVpbGRlcikpIHtcbiAgICAgICAgICAgIHRhYmxlc0NvbmZpZ1trZXldLnByaW1hcnlLZXkucHVzaCguLi5jb25maWdFbnRyeS5jb2x1bW5zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzKHZhbHVlLCBSZWxhdGlvbnMpKSB7XG4gICAgICBjb25zdCBkYk5hbWUgPSBnZXRUYWJsZVVuaXF1ZU5hbWUodmFsdWUudGFibGUpO1xuICAgICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVOYW1lc01hcFtkYk5hbWVdO1xuICAgICAgY29uc3QgcmVsYXRpb25zMiA9IHZhbHVlLmNvbmZpZyhcbiAgICAgICAgY29uZmlnSGVscGVycyh2YWx1ZS50YWJsZSlcbiAgICAgICk7XG4gICAgICBsZXQgcHJpbWFyeUtleTtcbiAgICAgIGZvciAoY29uc3QgW3JlbGF0aW9uTmFtZSwgcmVsYXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKHJlbGF0aW9uczIpKSB7XG4gICAgICAgIGlmICh0YWJsZU5hbWUpIHtcbiAgICAgICAgICBjb25zdCB0YWJsZUNvbmZpZyA9IHRhYmxlc0NvbmZpZ1t0YWJsZU5hbWVdO1xuICAgICAgICAgIHRhYmxlQ29uZmlnLnJlbGF0aW9uc1tyZWxhdGlvbk5hbWVdID0gcmVsYXRpb247XG4gICAgICAgICAgaWYgKHByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgIHRhYmxlQ29uZmlnLnByaW1hcnlLZXkucHVzaCguLi5wcmltYXJ5S2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCEoZGJOYW1lIGluIHJlbGF0aW9uc0J1ZmZlcikpIHtcbiAgICAgICAgICAgIHJlbGF0aW9uc0J1ZmZlcltkYk5hbWVdID0ge1xuICAgICAgICAgICAgICByZWxhdGlvbnM6IHt9LFxuICAgICAgICAgICAgICBwcmltYXJ5S2V5XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWxhdGlvbnNCdWZmZXJbZGJOYW1lXS5yZWxhdGlvbnNbcmVsYXRpb25OYW1lXSA9IHJlbGF0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHRhYmxlczogdGFibGVzQ29uZmlnLCB0YWJsZU5hbWVzTWFwIH07XG59XG5mdW5jdGlvbiByZWxhdGlvbnModGFibGUsIHJlbGF0aW9uczIpIHtcbiAgcmV0dXJuIG5ldyBSZWxhdGlvbnMoXG4gICAgdGFibGUsXG4gICAgKGhlbHBlcnMpID0+IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJlbGF0aW9uczIoaGVscGVycykpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWUud2l0aEZpZWxkTmFtZShrZXkpXG4gICAgICBdKVxuICAgIClcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZU9uZShzb3VyY2VUYWJsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gb25lKHRhYmxlLCBjb25maWcpIHtcbiAgICByZXR1cm4gbmV3IE9uZShcbiAgICAgIHNvdXJjZVRhYmxlLFxuICAgICAgdGFibGUsXG4gICAgICBjb25maWcsXG4gICAgICBjb25maWc/LmZpZWxkcy5yZWR1Y2UoKHJlcywgZikgPT4gcmVzICYmIGYubm90TnVsbCwgdHJ1ZSkgPz8gZmFsc2VcbiAgICApO1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlTWFueShzb3VyY2VUYWJsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gbWFueShyZWZlcmVuY2VkVGFibGUsIGNvbmZpZykge1xuICAgIHJldHVybiBuZXcgTWFueShzb3VyY2VUYWJsZSwgcmVmZXJlbmNlZFRhYmxlLCBjb25maWcpO1xuICB9O1xufVxuZnVuY3Rpb24gbm9ybWFsaXplUmVsYXRpb24oc2NoZW1hLCB0YWJsZU5hbWVzTWFwLCByZWxhdGlvbikge1xuICBpZiAoaXMocmVsYXRpb24sIE9uZSkgJiYgcmVsYXRpb24uY29uZmlnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpZWxkczogcmVsYXRpb24uY29uZmlnLmZpZWxkcyxcbiAgICAgIHJlZmVyZW5jZXM6IHJlbGF0aW9uLmNvbmZpZy5yZWZlcmVuY2VzXG4gICAgfTtcbiAgfVxuICBjb25zdCByZWZlcmVuY2VkVGFibGVUc05hbWUgPSB0YWJsZU5hbWVzTWFwW2dldFRhYmxlVW5pcXVlTmFtZShyZWxhdGlvbi5yZWZlcmVuY2VkVGFibGUpXTtcbiAgaWYgKCFyZWZlcmVuY2VkVGFibGVUc05hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGFibGUgXCIke3JlbGF0aW9uLnJlZmVyZW5jZWRUYWJsZVtUYWJsZS5TeW1ib2wuTmFtZV19XCIgbm90IGZvdW5kIGluIHNjaGVtYWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHJlZmVyZW5jZWRUYWJsZUNvbmZpZyA9IHNjaGVtYVtyZWZlcmVuY2VkVGFibGVUc05hbWVdO1xuICBpZiAoIXJlZmVyZW5jZWRUYWJsZUNvbmZpZykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3JlZmVyZW5jZWRUYWJsZVRzTmFtZX1cIiBub3QgZm91bmQgaW4gc2NoZW1hYCk7XG4gIH1cbiAgY29uc3Qgc291cmNlVGFibGUgPSByZWxhdGlvbi5zb3VyY2VUYWJsZTtcbiAgY29uc3Qgc291cmNlVGFibGVUc05hbWUgPSB0YWJsZU5hbWVzTWFwW2dldFRhYmxlVW5pcXVlTmFtZShzb3VyY2VUYWJsZSldO1xuICBpZiAoIXNvdXJjZVRhYmxlVHNOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRhYmxlIFwiJHtzb3VyY2VUYWJsZVtUYWJsZS5TeW1ib2wuTmFtZV19XCIgbm90IGZvdW5kIGluIHNjaGVtYWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHJldmVyc2VSZWxhdGlvbnMgPSBbXTtcbiAgZm9yIChjb25zdCByZWZlcmVuY2VkVGFibGVSZWxhdGlvbiBvZiBPYmplY3QudmFsdWVzKFxuICAgIHJlZmVyZW5jZWRUYWJsZUNvbmZpZy5yZWxhdGlvbnNcbiAgKSkge1xuICAgIGlmIChyZWxhdGlvbi5yZWxhdGlvbk5hbWUgJiYgcmVsYXRpb24gIT09IHJlZmVyZW5jZWRUYWJsZVJlbGF0aW9uICYmIHJlZmVyZW5jZWRUYWJsZVJlbGF0aW9uLnJlbGF0aW9uTmFtZSA9PT0gcmVsYXRpb24ucmVsYXRpb25OYW1lIHx8ICFyZWxhdGlvbi5yZWxhdGlvbk5hbWUgJiYgcmVmZXJlbmNlZFRhYmxlUmVsYXRpb24ucmVmZXJlbmNlZFRhYmxlID09PSByZWxhdGlvbi5zb3VyY2VUYWJsZSkge1xuICAgICAgcmV2ZXJzZVJlbGF0aW9ucy5wdXNoKHJlZmVyZW5jZWRUYWJsZVJlbGF0aW9uKTtcbiAgICB9XG4gIH1cbiAgaWYgKHJldmVyc2VSZWxhdGlvbnMubGVuZ3RoID4gMSkge1xuICAgIHRocm93IHJlbGF0aW9uLnJlbGF0aW9uTmFtZSA/IG5ldyBFcnJvcihcbiAgICAgIGBUaGVyZSBhcmUgbXVsdGlwbGUgcmVsYXRpb25zIHdpdGggbmFtZSBcIiR7cmVsYXRpb24ucmVsYXRpb25OYW1lfVwiIGluIHRhYmxlIFwiJHtyZWZlcmVuY2VkVGFibGVUc05hbWV9XCJgXG4gICAgKSA6IG5ldyBFcnJvcihcbiAgICAgIGBUaGVyZSBhcmUgbXVsdGlwbGUgcmVsYXRpb25zIGJldHdlZW4gXCIke3JlZmVyZW5jZWRUYWJsZVRzTmFtZX1cIiBhbmQgXCIke3JlbGF0aW9uLnNvdXJjZVRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXX1cIi4gUGxlYXNlIHNwZWNpZnkgcmVsYXRpb24gbmFtZWBcbiAgICApO1xuICB9XG4gIGlmIChyZXZlcnNlUmVsYXRpb25zWzBdICYmIGlzKHJldmVyc2VSZWxhdGlvbnNbMF0sIE9uZSkgJiYgcmV2ZXJzZVJlbGF0aW9uc1swXS5jb25maWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmllbGRzOiByZXZlcnNlUmVsYXRpb25zWzBdLmNvbmZpZy5yZWZlcmVuY2VzLFxuICAgICAgcmVmZXJlbmNlczogcmV2ZXJzZVJlbGF0aW9uc1swXS5jb25maWcuZmllbGRzXG4gICAgfTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFRoZXJlIGlzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gaW5mZXIgcmVsYXRpb24gXCIke3NvdXJjZVRhYmxlVHNOYW1lfS4ke3JlbGF0aW9uLmZpZWxkTmFtZX1cImBcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRhYmxlUmVsYXRpb25zSGVscGVycyhzb3VyY2VUYWJsZSkge1xuICByZXR1cm4ge1xuICAgIG9uZTogY3JlYXRlT25lKHNvdXJjZVRhYmxlKSxcbiAgICBtYW55OiBjcmVhdGVNYW55KHNvdXJjZVRhYmxlKVxuICB9O1xufVxuZnVuY3Rpb24gbWFwUmVsYXRpb25hbFJvdyh0YWJsZXNDb25maWcsIHRhYmxlQ29uZmlnLCByb3csIGJ1aWxkUXVlcnlSZXN1bHRTZWxlY3Rpb24sIG1hcENvbHVtblZhbHVlID0gKHZhbHVlKSA9PiB2YWx1ZSkge1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgZm9yIChjb25zdCBbXG4gICAgc2VsZWN0aW9uSXRlbUluZGV4LFxuICAgIHNlbGVjdGlvbkl0ZW1cbiAgXSBvZiBidWlsZFF1ZXJ5UmVzdWx0U2VsZWN0aW9uLmVudHJpZXMoKSkge1xuICAgIGlmIChzZWxlY3Rpb25JdGVtLmlzSnNvbikge1xuICAgICAgY29uc3QgcmVsYXRpb24gPSB0YWJsZUNvbmZpZy5yZWxhdGlvbnNbc2VsZWN0aW9uSXRlbS50c0tleV07XG4gICAgICBjb25zdCByYXdTdWJSb3dzID0gcm93W3NlbGVjdGlvbkl0ZW1JbmRleF07XG4gICAgICBjb25zdCBzdWJSb3dzID0gdHlwZW9mIHJhd1N1YlJvd3MgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHJhd1N1YlJvd3MpIDogcmF3U3ViUm93cztcbiAgICAgIHJlc3VsdFtzZWxlY3Rpb25JdGVtLnRzS2V5XSA9IGlzKHJlbGF0aW9uLCBPbmUpID8gc3ViUm93cyAmJiBtYXBSZWxhdGlvbmFsUm93KFxuICAgICAgICB0YWJsZXNDb25maWcsXG4gICAgICAgIHRhYmxlc0NvbmZpZ1tzZWxlY3Rpb25JdGVtLnJlbGF0aW9uVGFibGVUc0tleV0sXG4gICAgICAgIHN1YlJvd3MsXG4gICAgICAgIHNlbGVjdGlvbkl0ZW0uc2VsZWN0aW9uLFxuICAgICAgICBtYXBDb2x1bW5WYWx1ZVxuICAgICAgKSA6IHN1YlJvd3MubWFwKFxuICAgICAgICAoc3ViUm93KSA9PiBtYXBSZWxhdGlvbmFsUm93KFxuICAgICAgICAgIHRhYmxlc0NvbmZpZyxcbiAgICAgICAgICB0YWJsZXNDb25maWdbc2VsZWN0aW9uSXRlbS5yZWxhdGlvblRhYmxlVHNLZXldLFxuICAgICAgICAgIHN1YlJvdyxcbiAgICAgICAgICBzZWxlY3Rpb25JdGVtLnNlbGVjdGlvbixcbiAgICAgICAgICBtYXBDb2x1bW5WYWx1ZVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG1hcENvbHVtblZhbHVlKHJvd1tzZWxlY3Rpb25JdGVtSW5kZXhdKTtcbiAgICAgIGNvbnN0IGZpZWxkID0gc2VsZWN0aW9uSXRlbS5maWVsZDtcbiAgICAgIGxldCBkZWNvZGVyO1xuICAgICAgaWYgKGlzKGZpZWxkLCBDb2x1bW4pKSB7XG4gICAgICAgIGRlY29kZXIgPSBmaWVsZDtcbiAgICAgIH0gZWxzZSBpZiAoaXMoZmllbGQsIFNRTCkpIHtcbiAgICAgICAgZGVjb2RlciA9IGZpZWxkLmRlY29kZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvZGVyID0gZmllbGQuc3FsLmRlY29kZXI7XG4gICAgICB9XG4gICAgICByZXN1bHRbc2VsZWN0aW9uSXRlbS50c0tleV0gPSB2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBkZWNvZGVyLm1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQge1xuICBNYW55LFxuICBPbmUsXG4gIFJlbGF0aW9uLFxuICBSZWxhdGlvbnMsXG4gIGNyZWF0ZU1hbnksXG4gIGNyZWF0ZU9uZSxcbiAgY3JlYXRlVGFibGVSZWxhdGlvbnNIZWxwZXJzLFxuICBleHRyYWN0VGFibGVzUmVsYXRpb25hbENvbmZpZyxcbiAgZ2V0T3BlcmF0b3JzLFxuICBnZXRPcmRlckJ5T3BlcmF0b3JzLFxuICBtYXBSZWxhdGlvbmFsUm93LFxuICBub3JtYWxpemVSZWxhdGlvbixcbiAgcmVsYXRpb25zXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVsYXRpb25zLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFZpZXcgfSBmcm9tIFwiLi4vc3FsL3NxbC5qc1wiO1xuY2xhc3MgU1FMaXRlVmlld0Jhc2UgZXh0ZW5kcyBWaWV3IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVmlld0Jhc2VcIjtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZVZpZXdCYXNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmlldy1iYXNlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgYWxpYXNlZFRhYmxlLCBhbGlhc2VkVGFibGVDb2x1bW4sIG1hcENvbHVtbnNJbkFsaWFzZWRTUUxUb0FsaWFzLCBtYXBDb2x1bW5zSW5TUUxUb0FsaWFzIH0gZnJvbSBcIi4uL2FsaWFzLmpzXCI7XG5pbXBvcnQgeyBDYXNpbmdDYWNoZSB9IGZyb20gXCIuLi9jYXNpbmcuanNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgRHJpenpsZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHtcbiAgZ2V0T3BlcmF0b3JzLFxuICBnZXRPcmRlckJ5T3BlcmF0b3JzLFxuICBNYW55LFxuICBub3JtYWxpemVSZWxhdGlvbixcbiAgT25lXG59IGZyb20gXCIuLi9yZWxhdGlvbnMuanNcIjtcbmltcG9ydCB7IGFuZCwgZXEgfSBmcm9tIFwiLi4vc3FsL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBQYXJhbSwgU1FMLCBzcWwgfSBmcm9tIFwiLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uIH0gZnJvbSBcIi4vY29sdW1ucy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IGdldFRhYmxlTmFtZSwgZ2V0VGFibGVVbmlxdWVOYW1lLCBUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgb3JkZXJTZWxlY3RlZEZpZWxkcyB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi4vdmlldy1jb21tb24uanNcIjtcbmltcG9ydCB7IFNRTGl0ZVZpZXdCYXNlIH0gZnJvbSBcIi4vdmlldy1iYXNlLmpzXCI7XG5jbGFzcyBTUUxpdGVEaWFsZWN0IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlRGlhbGVjdFwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNhc2luZztcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy5jYXNpbmcgPSBuZXcgQ2FzaW5nQ2FjaGUoY29uZmlnPy5jYXNpbmcpO1xuICB9XG4gIGVzY2FwZU5hbWUobmFtZSkge1xuICAgIHJldHVybiBgXCIke25hbWV9XCJgO1xuICB9XG4gIGVzY2FwZVBhcmFtKF9udW0pIHtcbiAgICByZXR1cm4gXCI/XCI7XG4gIH1cbiAgZXNjYXBlU3RyaW5nKHN0cikge1xuICAgIHJldHVybiBgJyR7c3RyLnJlcGxhY2UoLycvZywgXCInJ1wiKX0nYDtcbiAgfVxuICBidWlsZFdpdGhDVEUocXVlcmllcykge1xuICAgIGlmICghcXVlcmllcz8ubGVuZ3RoKSByZXR1cm4gdm9pZCAwO1xuICAgIGNvbnN0IHdpdGhTcWxDaHVua3MgPSBbc3FsYHdpdGggYF07XG4gICAgZm9yIChjb25zdCBbaSwgd10gb2YgcXVlcmllcy5lbnRyaWVzKCkpIHtcbiAgICAgIHdpdGhTcWxDaHVua3MucHVzaChzcWxgJHtzcWwuaWRlbnRpZmllcih3Ll8uYWxpYXMpfSBhcyAoJHt3Ll8uc3FsfSlgKTtcbiAgICAgIGlmIChpIDwgcXVlcmllcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHdpdGhTcWxDaHVua3MucHVzaChzcWxgLCBgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgd2l0aFNxbENodW5rcy5wdXNoKHNxbGAgYCk7XG4gICAgcmV0dXJuIHNxbC5qb2luKHdpdGhTcWxDaHVua3MpO1xuICB9XG4gIGJ1aWxkRGVsZXRlUXVlcnkoeyB0YWJsZSwgd2hlcmUsIHJldHVybmluZywgd2l0aExpc3QsIGxpbWl0LCBvcmRlckJ5IH0pIHtcbiAgICBjb25zdCB3aXRoU3FsID0gdGhpcy5idWlsZFdpdGhDVEUod2l0aExpc3QpO1xuICAgIGNvbnN0IHJldHVybmluZ1NxbCA9IHJldHVybmluZyA/IHNxbGAgcmV0dXJuaW5nICR7dGhpcy5idWlsZFNlbGVjdGlvbihyZXR1cm5pbmcsIHsgaXNTaW5nbGVUYWJsZTogdHJ1ZSB9KX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IHdoZXJlU3FsID0gd2hlcmUgPyBzcWxgIHdoZXJlICR7d2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBvcmRlckJ5U3FsID0gdGhpcy5idWlsZE9yZGVyQnkob3JkZXJCeSk7XG4gICAgY29uc3QgbGltaXRTcWwgPSB0aGlzLmJ1aWxkTGltaXQobGltaXQpO1xuICAgIHJldHVybiBzcWxgJHt3aXRoU3FsfWRlbGV0ZSBmcm9tICR7dGFibGV9JHt3aGVyZVNxbH0ke3JldHVybmluZ1NxbH0ke29yZGVyQnlTcWx9JHtsaW1pdFNxbH1gO1xuICB9XG4gIGJ1aWxkVXBkYXRlU2V0KHRhYmxlLCBzZXQpIHtcbiAgICBjb25zdCB0YWJsZUNvbHVtbnMgPSB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG4gICAgY29uc3QgY29sdW1uTmFtZXMgPSBPYmplY3Qua2V5cyh0YWJsZUNvbHVtbnMpLmZpbHRlcihcbiAgICAgIChjb2xOYW1lKSA9PiBzZXRbY29sTmFtZV0gIT09IHZvaWQgMCB8fCB0YWJsZUNvbHVtbnNbY29sTmFtZV0/Lm9uVXBkYXRlRm4gIT09IHZvaWQgMFxuICAgICk7XG4gICAgY29uc3Qgc2V0U2l6ZSA9IGNvbHVtbk5hbWVzLmxlbmd0aDtcbiAgICByZXR1cm4gc3FsLmpvaW4oY29sdW1uTmFtZXMuZmxhdE1hcCgoY29sTmFtZSwgaSkgPT4ge1xuICAgICAgY29uc3QgY29sID0gdGFibGVDb2x1bW5zW2NvbE5hbWVdO1xuICAgICAgY29uc3QgdmFsdWUgPSBzZXRbY29sTmFtZV0gPz8gc3FsLnBhcmFtKGNvbC5vblVwZGF0ZUZuKCksIGNvbCk7XG4gICAgICBjb25zdCByZXMgPSBzcWxgJHtzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoY29sKSl9ID0gJHt2YWx1ZX1gO1xuICAgICAgaWYgKGkgPCBzZXRTaXplIC0gMSkge1xuICAgICAgICByZXR1cm4gW3Jlcywgc3FsLnJhdyhcIiwgXCIpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbcmVzXTtcbiAgICB9KSk7XG4gIH1cbiAgYnVpbGRVcGRhdGVRdWVyeSh7IHRhYmxlLCBzZXQsIHdoZXJlLCByZXR1cm5pbmcsIHdpdGhMaXN0LCBqb2lucywgZnJvbSwgbGltaXQsIG9yZGVyQnkgfSkge1xuICAgIGNvbnN0IHdpdGhTcWwgPSB0aGlzLmJ1aWxkV2l0aENURSh3aXRoTGlzdCk7XG4gICAgY29uc3Qgc2V0U3FsID0gdGhpcy5idWlsZFVwZGF0ZVNldCh0YWJsZSwgc2V0KTtcbiAgICBjb25zdCBmcm9tU3FsID0gZnJvbSAmJiBzcWwuam9pbihbc3FsLnJhdyhcIiBmcm9tIFwiKSwgdGhpcy5idWlsZEZyb21UYWJsZShmcm9tKV0pO1xuICAgIGNvbnN0IGpvaW5zU3FsID0gdGhpcy5idWlsZEpvaW5zKGpvaW5zKTtcbiAgICBjb25zdCByZXR1cm5pbmdTcWwgPSByZXR1cm5pbmcgPyBzcWxgIHJldHVybmluZyAke3RoaXMuYnVpbGRTZWxlY3Rpb24ocmV0dXJuaW5nLCB7IGlzU2luZ2xlVGFibGU6IHRydWUgfSl9YCA6IHZvaWQgMDtcbiAgICBjb25zdCB3aGVyZVNxbCA9IHdoZXJlID8gc3FsYCB3aGVyZSAke3doZXJlfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgb3JkZXJCeVNxbCA9IHRoaXMuYnVpbGRPcmRlckJ5KG9yZGVyQnkpO1xuICAgIGNvbnN0IGxpbWl0U3FsID0gdGhpcy5idWlsZExpbWl0KGxpbWl0KTtcbiAgICByZXR1cm4gc3FsYCR7d2l0aFNxbH11cGRhdGUgJHt0YWJsZX0gc2V0ICR7c2V0U3FsfSR7ZnJvbVNxbH0ke2pvaW5zU3FsfSR7d2hlcmVTcWx9JHtyZXR1cm5pbmdTcWx9JHtvcmRlckJ5U3FsfSR7bGltaXRTcWx9YDtcbiAgfVxuICAvKipcbiAgICogQnVpbGRzIHNlbGVjdGlvbiBTUUwgd2l0aCBwcm92aWRlZCBmaWVsZHMvZXhwcmVzc2lvbnNcbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqXG4gICAqIGBzZWxlY3QgPHNlbGVjdGlvbj4gZnJvbWBcbiAgICpcbiAgICogYGluc2VydCAuLi4gcmV0dXJuaW5nIDxzZWxlY3Rpb24+YFxuICAgKlxuICAgKiBJZiBgaXNTaW5nbGVUYWJsZWAgaXMgdHJ1ZSwgdGhlbiBjb2x1bW5zIHdvbid0IGJlIHByZWZpeGVkIHdpdGggdGFibGUgbmFtZVxuICAgKi9cbiAgYnVpbGRTZWxlY3Rpb24oZmllbGRzLCB7IGlzU2luZ2xlVGFibGUgPSBmYWxzZSB9ID0ge30pIHtcbiAgICBjb25zdCBjb2x1bW5zTGVuID0gZmllbGRzLmxlbmd0aDtcbiAgICBjb25zdCBjaHVua3MgPSBmaWVsZHMuZmxhdE1hcCgoeyBmaWVsZCB9LCBpKSA9PiB7XG4gICAgICBjb25zdCBjaHVuayA9IFtdO1xuICAgICAgaWYgKGlzKGZpZWxkLCBTUUwuQWxpYXNlZCkgJiYgZmllbGQuaXNTZWxlY3Rpb25GaWVsZCkge1xuICAgICAgICBjaHVuay5wdXNoKHNxbC5pZGVudGlmaWVyKGZpZWxkLmZpZWxkQWxpYXMpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXMoZmllbGQsIFNRTC5BbGlhc2VkKSB8fCBpcyhmaWVsZCwgU1FMKSkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGlzKGZpZWxkLCBTUUwuQWxpYXNlZCkgPyBmaWVsZC5zcWwgOiBmaWVsZDtcbiAgICAgICAgaWYgKGlzU2luZ2xlVGFibGUpIHtcbiAgICAgICAgICBjaHVuay5wdXNoKFxuICAgICAgICAgICAgbmV3IFNRTChcbiAgICAgICAgICAgICAgcXVlcnkucXVlcnlDaHVua3MubWFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlzKGMsIENvbHVtbikpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoYykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNodW5rLnB1c2gocXVlcnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpcyhmaWVsZCwgU1FMLkFsaWFzZWQpKSB7XG4gICAgICAgICAgY2h1bmsucHVzaChzcWxgIGFzICR7c3FsLmlkZW50aWZpZXIoZmllbGQuZmllbGRBbGlhcyl9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXMoZmllbGQsIENvbHVtbikpIHtcbiAgICAgICAgY29uc3QgdGFibGVOYW1lID0gZmllbGQudGFibGVbVGFibGUuU3ltYm9sLk5hbWVdO1xuICAgICAgICBpZiAoZmllbGQuY29sdW1uVHlwZSA9PT0gXCJTUUxpdGVOdW1lcmljQmlnSW50XCIpIHtcbiAgICAgICAgICBpZiAoaXNTaW5nbGVUYWJsZSkge1xuICAgICAgICAgICAgY2h1bmsucHVzaChzcWxgY2FzdCgke3NxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhmaWVsZCkpfSBhcyB0ZXh0KWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaHVuay5wdXNoKFxuICAgICAgICAgICAgICBzcWxgY2FzdCgke3NxbC5pZGVudGlmaWVyKHRhYmxlTmFtZSl9LiR7c3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGZpZWxkKSl9IGFzIHRleHQpYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGlzU2luZ2xlVGFibGUpIHtcbiAgICAgICAgICAgIGNodW5rLnB1c2goc3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGZpZWxkKSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaHVuay5wdXNoKHNxbGAke3NxbC5pZGVudGlmaWVyKHRhYmxlTmFtZSl9LiR7c3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGZpZWxkKSl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA8IGNvbHVtbnNMZW4gLSAxKSB7XG4gICAgICAgIGNodW5rLnB1c2goc3FsYCwgYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2h1bms7XG4gICAgfSk7XG4gICAgcmV0dXJuIHNxbC5qb2luKGNodW5rcyk7XG4gIH1cbiAgYnVpbGRKb2lucyhqb2lucykge1xuICAgIGlmICgham9pbnMgfHwgam9pbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBjb25zdCBqb2luc0FycmF5ID0gW107XG4gICAgaWYgKGpvaW5zKSB7XG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgam9pbk1ldGFdIG9mIGpvaW5zLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICBqb2luc0FycmF5LnB1c2goc3FsYCBgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZSA9IGpvaW5NZXRhLnRhYmxlO1xuICAgICAgICBjb25zdCBvblNxbCA9IGpvaW5NZXRhLm9uID8gc3FsYCBvbiAke2pvaW5NZXRhLm9ufWAgOiB2b2lkIDA7XG4gICAgICAgIGlmIChpcyh0YWJsZSwgU1FMaXRlVGFibGUpKSB7XG4gICAgICAgICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLk5hbWVdO1xuICAgICAgICAgIGNvbnN0IHRhYmxlU2NoZW1hID0gdGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLlNjaGVtYV07XG4gICAgICAgICAgY29uc3Qgb3JpZ1RhYmxlTmFtZSA9IHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5PcmlnaW5hbE5hbWVdO1xuICAgICAgICAgIGNvbnN0IGFsaWFzID0gdGFibGVOYW1lID09PSBvcmlnVGFibGVOYW1lID8gdm9pZCAwIDogam9pbk1ldGEuYWxpYXM7XG4gICAgICAgICAgam9pbnNBcnJheS5wdXNoKFxuICAgICAgICAgICAgc3FsYCR7c3FsLnJhdyhqb2luTWV0YS5qb2luVHlwZSl9IGpvaW4gJHt0YWJsZVNjaGVtYSA/IHNxbGAke3NxbC5pZGVudGlmaWVyKHRhYmxlU2NoZW1hKX0uYCA6IHZvaWQgMH0ke3NxbC5pZGVudGlmaWVyKG9yaWdUYWJsZU5hbWUpfSR7YWxpYXMgJiYgc3FsYCAke3NxbC5pZGVudGlmaWVyKGFsaWFzKX1gfSR7b25TcWx9YFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgam9pbnNBcnJheS5wdXNoKFxuICAgICAgICAgICAgc3FsYCR7c3FsLnJhdyhqb2luTWV0YS5qb2luVHlwZSl9IGpvaW4gJHt0YWJsZX0ke29uU3FsfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA8IGpvaW5zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBqb2luc0FycmF5LnB1c2goc3FsYCBgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3FsLmpvaW4oam9pbnNBcnJheSk7XG4gIH1cbiAgYnVpbGRMaW1pdChsaW1pdCkge1xuICAgIHJldHVybiB0eXBlb2YgbGltaXQgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGxpbWl0ID09PSBcIm51bWJlclwiICYmIGxpbWl0ID49IDAgPyBzcWxgIGxpbWl0ICR7bGltaXR9YCA6IHZvaWQgMDtcbiAgfVxuICBidWlsZE9yZGVyQnkob3JkZXJCeSkge1xuICAgIGNvbnN0IG9yZGVyQnlMaXN0ID0gW107XG4gICAgaWYgKG9yZGVyQnkpIHtcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBvcmRlckJ5VmFsdWVdIG9mIG9yZGVyQnkuZW50cmllcygpKSB7XG4gICAgICAgIG9yZGVyQnlMaXN0LnB1c2gob3JkZXJCeVZhbHVlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgb3JkZXJCeS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgb3JkZXJCeUxpc3QucHVzaChzcWxgLCBgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3JkZXJCeUxpc3QubGVuZ3RoID4gMCA/IHNxbGAgb3JkZXIgYnkgJHtzcWwuam9pbihvcmRlckJ5TGlzdCl9YCA6IHZvaWQgMDtcbiAgfVxuICBidWlsZEZyb21UYWJsZSh0YWJsZSkge1xuICAgIGlmIChpcyh0YWJsZSwgVGFibGUpICYmIHRhYmxlW1RhYmxlLlN5bWJvbC5Jc0FsaWFzXSkge1xuICAgICAgcmV0dXJuIHNxbGAke3NxbGAke3NxbC5pZGVudGlmaWVyKHRhYmxlW1RhYmxlLlN5bWJvbC5TY2hlbWFdID8/IFwiXCIpfS5gLmlmKHRhYmxlW1RhYmxlLlN5bWJvbC5TY2hlbWFdKX0ke3NxbC5pZGVudGlmaWVyKHRhYmxlW1RhYmxlLlN5bWJvbC5PcmlnaW5hbE5hbWVdKX0gJHtzcWwuaWRlbnRpZmllcih0YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV0pfWA7XG4gICAgfVxuICAgIHJldHVybiB0YWJsZTtcbiAgfVxuICBidWlsZFNlbGVjdFF1ZXJ5KHtcbiAgICB3aXRoTGlzdCxcbiAgICBmaWVsZHMsXG4gICAgZmllbGRzRmxhdCxcbiAgICB3aGVyZSxcbiAgICBoYXZpbmcsXG4gICAgdGFibGUsXG4gICAgam9pbnMsXG4gICAgb3JkZXJCeSxcbiAgICBncm91cEJ5LFxuICAgIGxpbWl0LFxuICAgIG9mZnNldCxcbiAgICBkaXN0aW5jdCxcbiAgICBzZXRPcGVyYXRvcnNcbiAgfSkge1xuICAgIGNvbnN0IGZpZWxkc0xpc3QgPSBmaWVsZHNGbGF0ID8/IG9yZGVyU2VsZWN0ZWRGaWVsZHMoZmllbGRzKTtcbiAgICBmb3IgKGNvbnN0IGYgb2YgZmllbGRzTGlzdCkge1xuICAgICAgaWYgKGlzKGYuZmllbGQsIENvbHVtbikgJiYgZ2V0VGFibGVOYW1lKGYuZmllbGQudGFibGUpICE9PSAoaXModGFibGUsIFN1YnF1ZXJ5KSA/IHRhYmxlLl8uYWxpYXMgOiBpcyh0YWJsZSwgU1FMaXRlVmlld0Jhc2UpID8gdGFibGVbVmlld0Jhc2VDb25maWddLm5hbWUgOiBpcyh0YWJsZSwgU1FMKSA/IHZvaWQgMCA6IGdldFRhYmxlTmFtZSh0YWJsZSkpICYmICEoKHRhYmxlMikgPT4gam9pbnM/LnNvbWUoXG4gICAgICAgICh7IGFsaWFzIH0pID0+IGFsaWFzID09PSAodGFibGUyW1RhYmxlLlN5bWJvbC5Jc0FsaWFzXSA/IGdldFRhYmxlTmFtZSh0YWJsZTIpIDogdGFibGUyW1RhYmxlLlN5bWJvbC5CYXNlTmFtZV0pXG4gICAgICApKShmLmZpZWxkLnRhYmxlKSkge1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBnZXRUYWJsZU5hbWUoZi5maWVsZC50YWJsZSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgWW91ciBcIiR7Zi5wYXRoLmpvaW4oXCItPlwiKX1cIiBmaWVsZCByZWZlcmVuY2VzIGEgY29sdW1uIFwiJHt0YWJsZU5hbWV9XCIuXCIke2YuZmllbGQubmFtZX1cIiwgYnV0IHRoZSB0YWJsZSBcIiR7dGFibGVOYW1lfVwiIGlzIG5vdCBwYXJ0IG9mIHRoZSBxdWVyeSEgRGlkIHlvdSBmb3JnZXQgdG8gam9pbiBpdD9gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlzU2luZ2xlVGFibGUgPSAham9pbnMgfHwgam9pbnMubGVuZ3RoID09PSAwO1xuICAgIGNvbnN0IHdpdGhTcWwgPSB0aGlzLmJ1aWxkV2l0aENURSh3aXRoTGlzdCk7XG4gICAgY29uc3QgZGlzdGluY3RTcWwgPSBkaXN0aW5jdCA/IHNxbGAgZGlzdGluY3RgIDogdm9pZCAwO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuYnVpbGRTZWxlY3Rpb24oZmllbGRzTGlzdCwgeyBpc1NpbmdsZVRhYmxlIH0pO1xuICAgIGNvbnN0IHRhYmxlU3FsID0gdGhpcy5idWlsZEZyb21UYWJsZSh0YWJsZSk7XG4gICAgY29uc3Qgam9pbnNTcWwgPSB0aGlzLmJ1aWxkSm9pbnMoam9pbnMpO1xuICAgIGNvbnN0IHdoZXJlU3FsID0gd2hlcmUgPyBzcWxgIHdoZXJlICR7d2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBoYXZpbmdTcWwgPSBoYXZpbmcgPyBzcWxgIGhhdmluZyAke2hhdmluZ31gIDogdm9pZCAwO1xuICAgIGNvbnN0IGdyb3VwQnlMaXN0ID0gW107XG4gICAgaWYgKGdyb3VwQnkpIHtcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBncm91cEJ5VmFsdWVdIG9mIGdyb3VwQnkuZW50cmllcygpKSB7XG4gICAgICAgIGdyb3VwQnlMaXN0LnB1c2goZ3JvdXBCeVZhbHVlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgZ3JvdXBCeS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgZ3JvdXBCeUxpc3QucHVzaChzcWxgLCBgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBncm91cEJ5U3FsID0gZ3JvdXBCeUxpc3QubGVuZ3RoID4gMCA/IHNxbGAgZ3JvdXAgYnkgJHtzcWwuam9pbihncm91cEJ5TGlzdCl9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBvcmRlckJ5U3FsID0gdGhpcy5idWlsZE9yZGVyQnkob3JkZXJCeSk7XG4gICAgY29uc3QgbGltaXRTcWwgPSB0aGlzLmJ1aWxkTGltaXQobGltaXQpO1xuICAgIGNvbnN0IG9mZnNldFNxbCA9IG9mZnNldCA/IHNxbGAgb2Zmc2V0ICR7b2Zmc2V0fWAgOiB2b2lkIDA7XG4gICAgY29uc3QgZmluYWxRdWVyeSA9IHNxbGAke3dpdGhTcWx9c2VsZWN0JHtkaXN0aW5jdFNxbH0gJHtzZWxlY3Rpb259IGZyb20gJHt0YWJsZVNxbH0ke2pvaW5zU3FsfSR7d2hlcmVTcWx9JHtncm91cEJ5U3FsfSR7aGF2aW5nU3FsfSR7b3JkZXJCeVNxbH0ke2xpbWl0U3FsfSR7b2Zmc2V0U3FsfWA7XG4gICAgaWYgKHNldE9wZXJhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZFNldE9wZXJhdGlvbnMoZmluYWxRdWVyeSwgc2V0T3BlcmF0b3JzKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbmFsUXVlcnk7XG4gIH1cbiAgYnVpbGRTZXRPcGVyYXRpb25zKGxlZnRTZWxlY3QsIHNldE9wZXJhdG9ycykge1xuICAgIGNvbnN0IFtzZXRPcGVyYXRvciwgLi4ucmVzdF0gPSBzZXRPcGVyYXRvcnM7XG4gICAgaWYgKCFzZXRPcGVyYXRvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHBhc3MgdW5kZWZpbmVkIHZhbHVlcyB0byBhbnkgc2V0IG9wZXJhdG9yXCIpO1xuICAgIH1cbiAgICBpZiAocmVzdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkU2V0T3BlcmF0aW9uUXVlcnkoeyBsZWZ0U2VsZWN0LCBzZXRPcGVyYXRvciB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRTZXRPcGVyYXRpb25zKFxuICAgICAgdGhpcy5idWlsZFNldE9wZXJhdGlvblF1ZXJ5KHsgbGVmdFNlbGVjdCwgc2V0T3BlcmF0b3IgfSksXG4gICAgICByZXN0XG4gICAgKTtcbiAgfVxuICBidWlsZFNldE9wZXJhdGlvblF1ZXJ5KHtcbiAgICBsZWZ0U2VsZWN0LFxuICAgIHNldE9wZXJhdG9yOiB7IHR5cGUsIGlzQWxsLCByaWdodFNlbGVjdCwgbGltaXQsIG9yZGVyQnksIG9mZnNldCB9XG4gIH0pIHtcbiAgICBjb25zdCBsZWZ0Q2h1bmsgPSBzcWxgJHtsZWZ0U2VsZWN0LmdldFNRTCgpfSBgO1xuICAgIGNvbnN0IHJpZ2h0Q2h1bmsgPSBzcWxgJHtyaWdodFNlbGVjdC5nZXRTUUwoKX1gO1xuICAgIGxldCBvcmRlckJ5U3FsO1xuICAgIGlmIChvcmRlckJ5ICYmIG9yZGVyQnkubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgb3JkZXJCeVZhbHVlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBzaW5nbGVPcmRlckJ5IG9mIG9yZGVyQnkpIHtcbiAgICAgICAgaWYgKGlzKHNpbmdsZU9yZGVyQnksIFNRTGl0ZUNvbHVtbikpIHtcbiAgICAgICAgICBvcmRlckJ5VmFsdWVzLnB1c2goc3FsLmlkZW50aWZpZXIoc2luZ2xlT3JkZXJCeS5uYW1lKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXMoc2luZ2xlT3JkZXJCeSwgU1FMKSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2luZ2xlT3JkZXJCeS5xdWVyeUNodW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBzaW5nbGVPcmRlckJ5LnF1ZXJ5Q2h1bmtzW2ldO1xuICAgICAgICAgICAgaWYgKGlzKGNodW5rLCBTUUxpdGVDb2x1bW4pKSB7XG4gICAgICAgICAgICAgIHNpbmdsZU9yZGVyQnkucXVlcnlDaHVua3NbaV0gPSBzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoY2h1bmspKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgb3JkZXJCeVZhbHVlcy5wdXNoKHNxbGAke3NpbmdsZU9yZGVyQnl9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3JkZXJCeVZhbHVlcy5wdXNoKHNxbGAke3NpbmdsZU9yZGVyQnl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9yZGVyQnlTcWwgPSBzcWxgIG9yZGVyIGJ5ICR7c3FsLmpvaW4ob3JkZXJCeVZhbHVlcywgc3FsYCwgYCl9YDtcbiAgICB9XG4gICAgY29uc3QgbGltaXRTcWwgPSB0eXBlb2YgbGltaXQgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGxpbWl0ID09PSBcIm51bWJlclwiICYmIGxpbWl0ID49IDAgPyBzcWxgIGxpbWl0ICR7bGltaXR9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBvcGVyYXRvckNodW5rID0gc3FsLnJhdyhgJHt0eXBlfSAke2lzQWxsID8gXCJhbGwgXCIgOiBcIlwifWApO1xuICAgIGNvbnN0IG9mZnNldFNxbCA9IG9mZnNldCA/IHNxbGAgb2Zmc2V0ICR7b2Zmc2V0fWAgOiB2b2lkIDA7XG4gICAgcmV0dXJuIHNxbGAke2xlZnRDaHVua30ke29wZXJhdG9yQ2h1bmt9JHtyaWdodENodW5rfSR7b3JkZXJCeVNxbH0ke2xpbWl0U3FsfSR7b2Zmc2V0U3FsfWA7XG4gIH1cbiAgYnVpbGRJbnNlcnRRdWVyeSh7IHRhYmxlLCB2YWx1ZXM6IHZhbHVlc09yU2VsZWN0LCBvbkNvbmZsaWN0LCByZXR1cm5pbmcsIHdpdGhMaXN0LCBzZWxlY3QgfSkge1xuICAgIGNvbnN0IHZhbHVlc1NxbExpc3QgPSBbXTtcbiAgICBjb25zdCBjb2x1bW5zID0gdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xuICAgIGNvbnN0IGNvbEVudHJpZXMgPSBPYmplY3QuZW50cmllcyhjb2x1bW5zKS5maWx0ZXIoXG4gICAgICAoW18sIGNvbF0pID0+ICFjb2wuc2hvdWxkRGlzYWJsZUluc2VydCgpXG4gICAgKTtcbiAgICBjb25zdCBpbnNlcnRPcmRlciA9IGNvbEVudHJpZXMubWFwKChbLCBjb2x1bW5dKSA9PiBzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoY29sdW1uKSkpO1xuICAgIGlmIChzZWxlY3QpIHtcbiAgICAgIGNvbnN0IHNlbGVjdDIgPSB2YWx1ZXNPclNlbGVjdDtcbiAgICAgIGlmIChpcyhzZWxlY3QyLCBTUUwpKSB7XG4gICAgICAgIHZhbHVlc1NxbExpc3QucHVzaChzZWxlY3QyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlc1NxbExpc3QucHVzaChzZWxlY3QyLmdldFNRTCgpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdmFsdWVzID0gdmFsdWVzT3JTZWxlY3Q7XG4gICAgICB2YWx1ZXNTcWxMaXN0LnB1c2goc3FsLnJhdyhcInZhbHVlcyBcIikpO1xuICAgICAgZm9yIChjb25zdCBbdmFsdWVJbmRleCwgdmFsdWVdIG9mIHZhbHVlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgY29uc3QgdmFsdWVMaXN0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgW2ZpZWxkTmFtZSwgY29sXSBvZiBjb2xFbnRyaWVzKSB7XG4gICAgICAgICAgY29uc3QgY29sVmFsdWUgPSB2YWx1ZVtmaWVsZE5hbWVdO1xuICAgICAgICAgIGlmIChjb2xWYWx1ZSA9PT0gdm9pZCAwIHx8IGlzKGNvbFZhbHVlLCBQYXJhbSkgJiYgY29sVmFsdWUudmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIGlmIChjb2wuZGVmYXVsdCAhPT0gbnVsbCAmJiBjb2wuZGVmYXVsdCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGlzKGNvbC5kZWZhdWx0LCBTUUwpID8gY29sLmRlZmF1bHQgOiBzcWwucGFyYW0oY29sLmRlZmF1bHQsIGNvbCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbC5kZWZhdWx0Rm4gIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0Rm5SZXN1bHQgPSBjb2wuZGVmYXVsdEZuKCk7XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGlzKGRlZmF1bHRGblJlc3VsdCwgU1FMKSA/IGRlZmF1bHRGblJlc3VsdCA6IHNxbC5wYXJhbShkZWZhdWx0Rm5SZXN1bHQsIGNvbCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFjb2wuZGVmYXVsdCAmJiBjb2wub25VcGRhdGVGbiAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9uVXBkYXRlRm5SZXN1bHQgPSBjb2wub25VcGRhdGVGbigpO1xuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBpcyhvblVwZGF0ZUZuUmVzdWx0LCBTUUwpID8gb25VcGRhdGVGblJlc3VsdCA6IHNxbC5wYXJhbShvblVwZGF0ZUZuUmVzdWx0LCBjb2wpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gc3FsYG51bGxgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWVMaXN0LnB1c2goZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVMaXN0LnB1c2goY29sVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YWx1ZXNTcWxMaXN0LnB1c2godmFsdWVMaXN0KTtcbiAgICAgICAgaWYgKHZhbHVlSW5kZXggPCB2YWx1ZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHZhbHVlc1NxbExpc3QucHVzaChzcWxgLCBgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB3aXRoU3FsID0gdGhpcy5idWlsZFdpdGhDVEUod2l0aExpc3QpO1xuICAgIGNvbnN0IHZhbHVlc1NxbCA9IHNxbC5qb2luKHZhbHVlc1NxbExpc3QpO1xuICAgIGNvbnN0IHJldHVybmluZ1NxbCA9IHJldHVybmluZyA/IHNxbGAgcmV0dXJuaW5nICR7dGhpcy5idWlsZFNlbGVjdGlvbihyZXR1cm5pbmcsIHsgaXNTaW5nbGVUYWJsZTogdHJ1ZSB9KX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IG9uQ29uZmxpY3RTcWwgPSBvbkNvbmZsaWN0Py5sZW5ndGggPyBzcWwuam9pbihvbkNvbmZsaWN0KSA6IHZvaWQgMDtcbiAgICByZXR1cm4gc3FsYCR7d2l0aFNxbH1pbnNlcnQgaW50byAke3RhYmxlfSAke2luc2VydE9yZGVyfSAke3ZhbHVlc1NxbH0ke29uQ29uZmxpY3RTcWx9JHtyZXR1cm5pbmdTcWx9YDtcbiAgfVxuICBzcWxUb1F1ZXJ5KHNxbDIsIGludm9rZVNvdXJjZSkge1xuICAgIHJldHVybiBzcWwyLnRvUXVlcnkoe1xuICAgICAgY2FzaW5nOiB0aGlzLmNhc2luZyxcbiAgICAgIGVzY2FwZU5hbWU6IHRoaXMuZXNjYXBlTmFtZSxcbiAgICAgIGVzY2FwZVBhcmFtOiB0aGlzLmVzY2FwZVBhcmFtLFxuICAgICAgZXNjYXBlU3RyaW5nOiB0aGlzLmVzY2FwZVN0cmluZyxcbiAgICAgIGludm9rZVNvdXJjZVxuICAgIH0pO1xuICB9XG4gIGJ1aWxkUmVsYXRpb25hbFF1ZXJ5KHtcbiAgICBmdWxsU2NoZW1hLFxuICAgIHNjaGVtYSxcbiAgICB0YWJsZU5hbWVzTWFwLFxuICAgIHRhYmxlLFxuICAgIHRhYmxlQ29uZmlnLFxuICAgIHF1ZXJ5Q29uZmlnOiBjb25maWcsXG4gICAgdGFibGVBbGlhcyxcbiAgICBuZXN0ZWRRdWVyeVJlbGF0aW9uLFxuICAgIGpvaW5PblxuICB9KSB7XG4gICAgbGV0IHNlbGVjdGlvbiA9IFtdO1xuICAgIGxldCBsaW1pdCwgb2Zmc2V0LCBvcmRlckJ5ID0gW10sIHdoZXJlO1xuICAgIGNvbnN0IGpvaW5zID0gW107XG4gICAgaWYgKGNvbmZpZyA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRhYmxlQ29uZmlnLmNvbHVtbnMpO1xuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uRW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgZGJLZXk6IHZhbHVlLm5hbWUsXG4gICAgICAgIHRzS2V5OiBrZXksXG4gICAgICAgIGZpZWxkOiBhbGlhc2VkVGFibGVDb2x1bW4odmFsdWUsIHRhYmxlQWxpYXMpLFxuICAgICAgICByZWxhdGlvblRhYmxlVHNLZXk6IHZvaWQgMCxcbiAgICAgICAgaXNKc29uOiBmYWxzZSxcbiAgICAgICAgc2VsZWN0aW9uOiBbXVxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhbGlhc2VkQ29sdW1ucyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXModGFibGVDb25maWcuY29sdW1ucykubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIGFsaWFzZWRUYWJsZUNvbHVtbih2YWx1ZSwgdGFibGVBbGlhcyldKVxuICAgICAgKTtcbiAgICAgIGlmIChjb25maWcud2hlcmUpIHtcbiAgICAgICAgY29uc3Qgd2hlcmVTcWwgPSB0eXBlb2YgY29uZmlnLndoZXJlID09PSBcImZ1bmN0aW9uXCIgPyBjb25maWcud2hlcmUoYWxpYXNlZENvbHVtbnMsIGdldE9wZXJhdG9ycygpKSA6IGNvbmZpZy53aGVyZTtcbiAgICAgICAgd2hlcmUgPSB3aGVyZVNxbCAmJiBtYXBDb2x1bW5zSW5TUUxUb0FsaWFzKHdoZXJlU3FsLCB0YWJsZUFsaWFzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpZWxkc1NlbGVjdGlvbiA9IFtdO1xuICAgICAgbGV0IHNlbGVjdGVkQ29sdW1ucyA9IFtdO1xuICAgICAgaWYgKGNvbmZpZy5jb2x1bW5zKSB7XG4gICAgICAgIGxldCBpc0luY2x1ZGVNb2RlID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgW2ZpZWxkLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmNvbHVtbnMpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmllbGQgaW4gdGFibGVDb25maWcuY29sdW1ucykge1xuICAgICAgICAgICAgaWYgKCFpc0luY2x1ZGVNb2RlICYmIHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIGlzSW5jbHVkZU1vZGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZWN0ZWRDb2x1bW5zLnB1c2goZmllbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZWN0ZWRDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZWxlY3RlZENvbHVtbnMgPSBpc0luY2x1ZGVNb2RlID8gc2VsZWN0ZWRDb2x1bW5zLmZpbHRlcigoYykgPT4gY29uZmlnLmNvbHVtbnM/LltjXSA9PT0gdHJ1ZSkgOiBPYmplY3Qua2V5cyh0YWJsZUNvbmZpZy5jb2x1bW5zKS5maWx0ZXIoKGtleSkgPT4gIXNlbGVjdGVkQ29sdW1ucy5pbmNsdWRlcyhrZXkpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWRDb2x1bW5zID0gT2JqZWN0LmtleXModGFibGVDb25maWcuY29sdW1ucyk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHNlbGVjdGVkQ29sdW1ucykge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0YWJsZUNvbmZpZy5jb2x1bW5zW2ZpZWxkXTtcbiAgICAgICAgZmllbGRzU2VsZWN0aW9uLnB1c2goeyB0c0tleTogZmllbGQsIHZhbHVlOiBjb2x1bW4gfSk7XG4gICAgICB9XG4gICAgICBsZXQgc2VsZWN0ZWRSZWxhdGlvbnMgPSBbXTtcbiAgICAgIGlmIChjb25maWcud2l0aCkge1xuICAgICAgICBzZWxlY3RlZFJlbGF0aW9ucyA9IE9iamVjdC5lbnRyaWVzKGNvbmZpZy53aXRoKS5maWx0ZXIoKGVudHJ5KSA9PiAhIWVudHJ5WzFdKS5tYXAoKFt0c0tleSwgcXVlcnlDb25maWddKSA9PiAoeyB0c0tleSwgcXVlcnlDb25maWcsIHJlbGF0aW9uOiB0YWJsZUNvbmZpZy5yZWxhdGlvbnNbdHNLZXldIH0pKTtcbiAgICAgIH1cbiAgICAgIGxldCBleHRyYXM7XG4gICAgICBpZiAoY29uZmlnLmV4dHJhcykge1xuICAgICAgICBleHRyYXMgPSB0eXBlb2YgY29uZmlnLmV4dHJhcyA9PT0gXCJmdW5jdGlvblwiID8gY29uZmlnLmV4dHJhcyhhbGlhc2VkQ29sdW1ucywgeyBzcWwgfSkgOiBjb25maWcuZXh0cmFzO1xuICAgICAgICBmb3IgKGNvbnN0IFt0c0tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV4dHJhcykpIHtcbiAgICAgICAgICBmaWVsZHNTZWxlY3Rpb24ucHVzaCh7XG4gICAgICAgICAgICB0c0tleSxcbiAgICAgICAgICAgIHZhbHVlOiBtYXBDb2x1bW5zSW5BbGlhc2VkU1FMVG9BbGlhcyh2YWx1ZSwgdGFibGVBbGlhcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB7IHRzS2V5LCB2YWx1ZSB9IG9mIGZpZWxkc1NlbGVjdGlvbikge1xuICAgICAgICBzZWxlY3Rpb24ucHVzaCh7XG4gICAgICAgICAgZGJLZXk6IGlzKHZhbHVlLCBTUUwuQWxpYXNlZCkgPyB2YWx1ZS5maWVsZEFsaWFzIDogdGFibGVDb25maWcuY29sdW1uc1t0c0tleV0ubmFtZSxcbiAgICAgICAgICB0c0tleSxcbiAgICAgICAgICBmaWVsZDogaXModmFsdWUsIENvbHVtbikgPyBhbGlhc2VkVGFibGVDb2x1bW4odmFsdWUsIHRhYmxlQWxpYXMpIDogdmFsdWUsXG4gICAgICAgICAgcmVsYXRpb25UYWJsZVRzS2V5OiB2b2lkIDAsXG4gICAgICAgICAgaXNKc29uOiBmYWxzZSxcbiAgICAgICAgICBzZWxlY3Rpb246IFtdXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgbGV0IG9yZGVyQnlPcmlnID0gdHlwZW9mIGNvbmZpZy5vcmRlckJ5ID09PSBcImZ1bmN0aW9uXCIgPyBjb25maWcub3JkZXJCeShhbGlhc2VkQ29sdW1ucywgZ2V0T3JkZXJCeU9wZXJhdG9ycygpKSA6IGNvbmZpZy5vcmRlckJ5ID8/IFtdO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9yZGVyQnlPcmlnKSkge1xuICAgICAgICBvcmRlckJ5T3JpZyA9IFtvcmRlckJ5T3JpZ107XG4gICAgICB9XG4gICAgICBvcmRlckJ5ID0gb3JkZXJCeU9yaWcubWFwKChvcmRlckJ5VmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGlzKG9yZGVyQnlWYWx1ZSwgQ29sdW1uKSkge1xuICAgICAgICAgIHJldHVybiBhbGlhc2VkVGFibGVDb2x1bW4ob3JkZXJCeVZhbHVlLCB0YWJsZUFsaWFzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwQ29sdW1uc0luU1FMVG9BbGlhcyhvcmRlckJ5VmFsdWUsIHRhYmxlQWxpYXMpO1xuICAgICAgfSk7XG4gICAgICBsaW1pdCA9IGNvbmZpZy5saW1pdDtcbiAgICAgIG9mZnNldCA9IGNvbmZpZy5vZmZzZXQ7XG4gICAgICBmb3IgKGNvbnN0IHtcbiAgICAgICAgdHNLZXk6IHNlbGVjdGVkUmVsYXRpb25Uc0tleSxcbiAgICAgICAgcXVlcnlDb25maWc6IHNlbGVjdGVkUmVsYXRpb25Db25maWdWYWx1ZSxcbiAgICAgICAgcmVsYXRpb25cbiAgICAgIH0gb2Ygc2VsZWN0ZWRSZWxhdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFJlbGF0aW9uID0gbm9ybWFsaXplUmVsYXRpb24oc2NoZW1hLCB0YWJsZU5hbWVzTWFwLCByZWxhdGlvbik7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uVGFibGVOYW1lID0gZ2V0VGFibGVVbmlxdWVOYW1lKHJlbGF0aW9uLnJlZmVyZW5jZWRUYWJsZSk7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uVGFibGVUc05hbWUgPSB0YWJsZU5hbWVzTWFwW3JlbGF0aW9uVGFibGVOYW1lXTtcbiAgICAgICAgY29uc3QgcmVsYXRpb25UYWJsZUFsaWFzID0gYCR7dGFibGVBbGlhc31fJHtzZWxlY3RlZFJlbGF0aW9uVHNLZXl9YDtcbiAgICAgICAgY29uc3Qgam9pbk9uMiA9IGFuZChcbiAgICAgICAgICAuLi5ub3JtYWxpemVkUmVsYXRpb24uZmllbGRzLm1hcChcbiAgICAgICAgICAgIChmaWVsZDIsIGkpID0+IGVxKFxuICAgICAgICAgICAgICBhbGlhc2VkVGFibGVDb2x1bW4obm9ybWFsaXplZFJlbGF0aW9uLnJlZmVyZW5jZXNbaV0sIHJlbGF0aW9uVGFibGVBbGlhcyksXG4gICAgICAgICAgICAgIGFsaWFzZWRUYWJsZUNvbHVtbihmaWVsZDIsIHRhYmxlQWxpYXMpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBidWlsdFJlbGF0aW9uID0gdGhpcy5idWlsZFJlbGF0aW9uYWxRdWVyeSh7XG4gICAgICAgICAgZnVsbFNjaGVtYSxcbiAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgdGFibGVOYW1lc01hcCxcbiAgICAgICAgICB0YWJsZTogZnVsbFNjaGVtYVtyZWxhdGlvblRhYmxlVHNOYW1lXSxcbiAgICAgICAgICB0YWJsZUNvbmZpZzogc2NoZW1hW3JlbGF0aW9uVGFibGVUc05hbWVdLFxuICAgICAgICAgIHF1ZXJ5Q29uZmlnOiBpcyhyZWxhdGlvbiwgT25lKSA/IHNlbGVjdGVkUmVsYXRpb25Db25maWdWYWx1ZSA9PT0gdHJ1ZSA/IHsgbGltaXQ6IDEgfSA6IHsgLi4uc2VsZWN0ZWRSZWxhdGlvbkNvbmZpZ1ZhbHVlLCBsaW1pdDogMSB9IDogc2VsZWN0ZWRSZWxhdGlvbkNvbmZpZ1ZhbHVlLFxuICAgICAgICAgIHRhYmxlQWxpYXM6IHJlbGF0aW9uVGFibGVBbGlhcyxcbiAgICAgICAgICBqb2luT246IGpvaW5PbjIsXG4gICAgICAgICAgbmVzdGVkUXVlcnlSZWxhdGlvbjogcmVsYXRpb25cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gc3FsYCgke2J1aWx0UmVsYXRpb24uc3FsfSlgLmFzKHNlbGVjdGVkUmVsYXRpb25Uc0tleSk7XG4gICAgICAgIHNlbGVjdGlvbi5wdXNoKHtcbiAgICAgICAgICBkYktleTogc2VsZWN0ZWRSZWxhdGlvblRzS2V5LFxuICAgICAgICAgIHRzS2V5OiBzZWxlY3RlZFJlbGF0aW9uVHNLZXksXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgcmVsYXRpb25UYWJsZVRzS2V5OiByZWxhdGlvblRhYmxlVHNOYW1lLFxuICAgICAgICAgIGlzSnNvbjogdHJ1ZSxcbiAgICAgICAgICBzZWxlY3Rpb246IGJ1aWx0UmVsYXRpb24uc2VsZWN0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IERyaXp6bGVFcnJvcih7XG4gICAgICAgIG1lc3NhZ2U6IGBObyBmaWVsZHMgc2VsZWN0ZWQgZm9yIHRhYmxlIFwiJHt0YWJsZUNvbmZpZy50c05hbWV9XCIgKFwiJHt0YWJsZUFsaWFzfVwiKS4gWW91IG5lZWQgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgaXRlbSBpbiBcImNvbHVtbnNcIiwgXCJ3aXRoXCIgb3IgXCJleHRyYXNcIi4gSWYgeW91IG5lZWQgdG8gc2VsZWN0IGFsbCBjb2x1bW5zLCBvbWl0IHRoZSBcImNvbHVtbnNcIiBrZXkgb3Igc2V0IGl0IHRvIHVuZGVmaW5lZC5gXG4gICAgICB9KTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDtcbiAgICB3aGVyZSA9IGFuZChqb2luT24sIHdoZXJlKTtcbiAgICBpZiAobmVzdGVkUXVlcnlSZWxhdGlvbikge1xuICAgICAgbGV0IGZpZWxkID0gc3FsYGpzb25fYXJyYXkoJHtzcWwuam9pbihcbiAgICAgICAgc2VsZWN0aW9uLm1hcChcbiAgICAgICAgICAoeyBmaWVsZDogZmllbGQyIH0pID0+IGlzKGZpZWxkMiwgU1FMaXRlQ29sdW1uKSA/IHNxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhmaWVsZDIpKSA6IGlzKGZpZWxkMiwgU1FMLkFsaWFzZWQpID8gZmllbGQyLnNxbCA6IGZpZWxkMlxuICAgICAgICApLFxuICAgICAgICBzcWxgLCBgXG4gICAgICApfSlgO1xuICAgICAgaWYgKGlzKG5lc3RlZFF1ZXJ5UmVsYXRpb24sIE1hbnkpKSB7XG4gICAgICAgIGZpZWxkID0gc3FsYGNvYWxlc2NlKGpzb25fZ3JvdXBfYXJyYXkoJHtmaWVsZH0pLCBqc29uX2FycmF5KCkpYDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5lc3RlZFNlbGVjdGlvbiA9IFt7XG4gICAgICAgIGRiS2V5OiBcImRhdGFcIixcbiAgICAgICAgdHNLZXk6IFwiZGF0YVwiLFxuICAgICAgICBmaWVsZDogZmllbGQuYXMoXCJkYXRhXCIpLFxuICAgICAgICBpc0pzb246IHRydWUsXG4gICAgICAgIHJlbGF0aW9uVGFibGVUc0tleTogdGFibGVDb25maWcudHNOYW1lLFxuICAgICAgICBzZWxlY3Rpb25cbiAgICAgIH1dO1xuICAgICAgY29uc3QgbmVlZHNTdWJxdWVyeSA9IGxpbWl0ICE9PSB2b2lkIDAgfHwgb2Zmc2V0ICE9PSB2b2lkIDAgfHwgb3JkZXJCeS5sZW5ndGggPiAwO1xuICAgICAgaWYgKG5lZWRzU3VicXVlcnkpIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5idWlsZFNlbGVjdFF1ZXJ5KHtcbiAgICAgICAgICB0YWJsZTogYWxpYXNlZFRhYmxlKHRhYmxlLCB0YWJsZUFsaWFzKSxcbiAgICAgICAgICBmaWVsZHM6IHt9LFxuICAgICAgICAgIGZpZWxkc0ZsYXQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcGF0aDogW10sXG4gICAgICAgICAgICAgIGZpZWxkOiBzcWwucmF3KFwiKlwiKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgd2hlcmUsXG4gICAgICAgICAgbGltaXQsXG4gICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgIG9yZGVyQnksXG4gICAgICAgICAgc2V0T3BlcmF0b3JzOiBbXVxuICAgICAgICB9KTtcbiAgICAgICAgd2hlcmUgPSB2b2lkIDA7XG4gICAgICAgIGxpbWl0ID0gdm9pZCAwO1xuICAgICAgICBvZmZzZXQgPSB2b2lkIDA7XG4gICAgICAgIG9yZGVyQnkgPSB2b2lkIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBhbGlhc2VkVGFibGUodGFibGUsIHRhYmxlQWxpYXMpO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gdGhpcy5idWlsZFNlbGVjdFF1ZXJ5KHtcbiAgICAgICAgdGFibGU6IGlzKHJlc3VsdCwgU1FMaXRlVGFibGUpID8gcmVzdWx0IDogbmV3IFN1YnF1ZXJ5KHJlc3VsdCwge30sIHRhYmxlQWxpYXMpLFxuICAgICAgICBmaWVsZHM6IHt9LFxuICAgICAgICBmaWVsZHNGbGF0OiBuZXN0ZWRTZWxlY3Rpb24ubWFwKCh7IGZpZWxkOiBmaWVsZDIgfSkgPT4gKHtcbiAgICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgICBmaWVsZDogaXMoZmllbGQyLCBDb2x1bW4pID8gYWxpYXNlZFRhYmxlQ29sdW1uKGZpZWxkMiwgdGFibGVBbGlhcykgOiBmaWVsZDJcbiAgICAgICAgfSkpLFxuICAgICAgICBqb2lucyxcbiAgICAgICAgd2hlcmUsXG4gICAgICAgIGxpbWl0LFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIG9yZGVyQnksXG4gICAgICAgIHNldE9wZXJhdG9yczogW11cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmJ1aWxkU2VsZWN0UXVlcnkoe1xuICAgICAgICB0YWJsZTogYWxpYXNlZFRhYmxlKHRhYmxlLCB0YWJsZUFsaWFzKSxcbiAgICAgICAgZmllbGRzOiB7fSxcbiAgICAgICAgZmllbGRzRmxhdDogc2VsZWN0aW9uLm1hcCgoeyBmaWVsZCB9KSA9PiAoe1xuICAgICAgICAgIHBhdGg6IFtdLFxuICAgICAgICAgIGZpZWxkOiBpcyhmaWVsZCwgQ29sdW1uKSA/IGFsaWFzZWRUYWJsZUNvbHVtbihmaWVsZCwgdGFibGVBbGlhcykgOiBmaWVsZFxuICAgICAgICB9KSksXG4gICAgICAgIGpvaW5zLFxuICAgICAgICB3aGVyZSxcbiAgICAgICAgbGltaXQsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgb3JkZXJCeSxcbiAgICAgICAgc2V0T3BlcmF0b3JzOiBbXVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0YWJsZVRzS2V5OiB0YWJsZUNvbmZpZy50c05hbWUsXG4gICAgICBzcWw6IHJlc3VsdCxcbiAgICAgIHNlbGVjdGlvblxuICAgIH07XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVN5bmNEaWFsZWN0IGV4dGVuZHMgU1FMaXRlRGlhbGVjdCB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVN5bmNEaWFsZWN0XCI7XG4gIG1pZ3JhdGUobWlncmF0aW9ucywgc2Vzc2lvbiwgY29uZmlnKSB7XG4gICAgY29uc3QgbWlncmF0aW9uc1RhYmxlID0gY29uZmlnID09PSB2b2lkIDAgPyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCIgOiB0eXBlb2YgY29uZmlnID09PSBcInN0cmluZ1wiID8gXCJfX2RyaXp6bGVfbWlncmF0aW9uc1wiIDogY29uZmlnLm1pZ3JhdGlvbnNUYWJsZSA/PyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCI7XG4gICAgY29uc3QgbWlncmF0aW9uVGFibGVDcmVhdGUgPSBzcWxgXG5cdFx0XHRDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAke3NxbC5pZGVudGlmaWVyKG1pZ3JhdGlvbnNUYWJsZSl9IChcblx0XHRcdFx0aWQgU0VSSUFMIFBSSU1BUlkgS0VZLFxuXHRcdFx0XHRoYXNoIHRleHQgTk9UIE5VTEwsXG5cdFx0XHRcdGNyZWF0ZWRfYXQgbnVtZXJpY1xuXHRcdFx0KVxuXHRcdGA7XG4gICAgc2Vzc2lvbi5ydW4obWlncmF0aW9uVGFibGVDcmVhdGUpO1xuICAgIGNvbnN0IGRiTWlncmF0aW9ucyA9IHNlc3Npb24udmFsdWVzKFxuICAgICAgc3FsYFNFTEVDVCBpZCwgaGFzaCwgY3JlYXRlZF9hdCBGUk9NICR7c3FsLmlkZW50aWZpZXIobWlncmF0aW9uc1RhYmxlKX0gT1JERVIgQlkgY3JlYXRlZF9hdCBERVNDIExJTUlUIDFgXG4gICAgKTtcbiAgICBjb25zdCBsYXN0RGJNaWdyYXRpb24gPSBkYk1pZ3JhdGlvbnNbMF0gPz8gdm9pZCAwO1xuICAgIHNlc3Npb24ucnVuKHNxbGBCRUdJTmApO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IG1pZ3JhdGlvbiBvZiBtaWdyYXRpb25zKSB7XG4gICAgICAgIGlmICghbGFzdERiTWlncmF0aW9uIHx8IE51bWJlcihsYXN0RGJNaWdyYXRpb25bMl0pIDwgbWlncmF0aW9uLmZvbGRlck1pbGxpcykge1xuICAgICAgICAgIGZvciAoY29uc3Qgc3RtdCBvZiBtaWdyYXRpb24uc3FsKSB7XG4gICAgICAgICAgICBzZXNzaW9uLnJ1bihzcWwucmF3KHN0bXQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2Vzc2lvbi5ydW4oXG4gICAgICAgICAgICBzcWxgSU5TRVJUIElOVE8gJHtzcWwuaWRlbnRpZmllcihtaWdyYXRpb25zVGFibGUpfSAoXCJoYXNoXCIsIFwiY3JlYXRlZF9hdFwiKSBWQUxVRVMoJHttaWdyYXRpb24uaGFzaH0sICR7bWlncmF0aW9uLmZvbGRlck1pbGxpc30pYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNlc3Npb24ucnVuKHNxbGBDT01NSVRgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZXNzaW9uLnJ1bihzcWxgUk9MTEJBQ0tgKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59XG5jbGFzcyBTUUxpdGVBc3luY0RpYWxlY3QgZXh0ZW5kcyBTUUxpdGVEaWFsZWN0IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQXN5bmNEaWFsZWN0XCI7XG4gIGFzeW5jIG1pZ3JhdGUobWlncmF0aW9ucywgc2Vzc2lvbiwgY29uZmlnKSB7XG4gICAgY29uc3QgbWlncmF0aW9uc1RhYmxlID0gY29uZmlnID09PSB2b2lkIDAgPyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCIgOiB0eXBlb2YgY29uZmlnID09PSBcInN0cmluZ1wiID8gXCJfX2RyaXp6bGVfbWlncmF0aW9uc1wiIDogY29uZmlnLm1pZ3JhdGlvbnNUYWJsZSA/PyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCI7XG4gICAgY29uc3QgbWlncmF0aW9uVGFibGVDcmVhdGUgPSBzcWxgXG5cdFx0XHRDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAke3NxbC5pZGVudGlmaWVyKG1pZ3JhdGlvbnNUYWJsZSl9IChcblx0XHRcdFx0aWQgU0VSSUFMIFBSSU1BUlkgS0VZLFxuXHRcdFx0XHRoYXNoIHRleHQgTk9UIE5VTEwsXG5cdFx0XHRcdGNyZWF0ZWRfYXQgbnVtZXJpY1xuXHRcdFx0KVxuXHRcdGA7XG4gICAgYXdhaXQgc2Vzc2lvbi5ydW4obWlncmF0aW9uVGFibGVDcmVhdGUpO1xuICAgIGNvbnN0IGRiTWlncmF0aW9ucyA9IGF3YWl0IHNlc3Npb24udmFsdWVzKFxuICAgICAgc3FsYFNFTEVDVCBpZCwgaGFzaCwgY3JlYXRlZF9hdCBGUk9NICR7c3FsLmlkZW50aWZpZXIobWlncmF0aW9uc1RhYmxlKX0gT1JERVIgQlkgY3JlYXRlZF9hdCBERVNDIExJTUlUIDFgXG4gICAgKTtcbiAgICBjb25zdCBsYXN0RGJNaWdyYXRpb24gPSBkYk1pZ3JhdGlvbnNbMF0gPz8gdm9pZCAwO1xuICAgIGF3YWl0IHNlc3Npb24udHJhbnNhY3Rpb24oYXN5bmMgKHR4KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG1pZ3JhdGlvbiBvZiBtaWdyYXRpb25zKSB7XG4gICAgICAgIGlmICghbGFzdERiTWlncmF0aW9uIHx8IE51bWJlcihsYXN0RGJNaWdyYXRpb25bMl0pIDwgbWlncmF0aW9uLmZvbGRlck1pbGxpcykge1xuICAgICAgICAgIGZvciAoY29uc3Qgc3RtdCBvZiBtaWdyYXRpb24uc3FsKSB7XG4gICAgICAgICAgICBhd2FpdCB0eC5ydW4oc3FsLnJhdyhzdG10KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHR4LnJ1bihcbiAgICAgICAgICAgIHNxbGBJTlNFUlQgSU5UTyAke3NxbC5pZGVudGlmaWVyKG1pZ3JhdGlvbnNUYWJsZSl9IChcImhhc2hcIiwgXCJjcmVhdGVkX2F0XCIpIFZBTFVFUygke21pZ3JhdGlvbi5oYXNofSwgJHttaWdyYXRpb24uZm9sZGVyTWlsbGlzfSlgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5leHBvcnQge1xuICBTUUxpdGVBc3luY0RpYWxlY3QsXG4gIFNRTGl0ZURpYWxlY3QsXG4gIFNRTGl0ZVN5bmNEaWFsZWN0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlhbGVjdC5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5jbGFzcyBUeXBlZFF1ZXJ5QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlR5cGVkUXVlcnlCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U2VsZWN0ZWRGaWVsZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuXy5zZWxlY3RlZEZpZWxkcztcbiAgfVxufVxuZXhwb3J0IHtcbiAgVHlwZWRRdWVyeUJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1xdWVyeS1idWlsZGVyLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUeXBlZFF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuLi8uLi9xdWVyeS1idWlsZGVycy9xdWVyeS1idWlsZGVyLmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuaW1wb3J0IHsgU2VsZWN0aW9uUHJveHlIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL3NlbGVjdGlvbi1wcm94eS5qc1wiO1xuaW1wb3J0IHsgU1FMLCBWaWV3IH0gZnJvbSBcIi4uLy4uL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4uLy4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS5qc1wiO1xuaW1wb3J0IHtcbiAgYXBwbHlNaXhpbnMsXG4gIGdldFRhYmxlQ29sdW1ucyxcbiAgZ2V0VGFibGVMaWtlTmFtZSxcbiAgaGF2ZVNhbWVLZXlzLFxuICBvcmRlclNlbGVjdGVkRmllbGRzXG59IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi4vLi4vdmlldy1jb21tb24uanNcIjtcbmltcG9ydCB7IGV4dHJhY3RVc2VkVGFibGUgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVZpZXdCYXNlIH0gZnJvbSBcIi4uL3ZpZXctYmFzZS5qc1wiO1xuY2xhc3MgU1FMaXRlU2VsZWN0QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVNlbGVjdEJ1aWxkZXJcIjtcbiAgZmllbGRzO1xuICBzZXNzaW9uO1xuICBkaWFsZWN0O1xuICB3aXRoTGlzdDtcbiAgZGlzdGluY3Q7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHRoaXMuZmllbGRzID0gY29uZmlnLmZpZWxkcztcbiAgICB0aGlzLnNlc3Npb24gPSBjb25maWcuc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBjb25maWcuZGlhbGVjdDtcbiAgICB0aGlzLndpdGhMaXN0ID0gY29uZmlnLndpdGhMaXN0O1xuICAgIHRoaXMuZGlzdGluY3QgPSBjb25maWcuZGlzdGluY3Q7XG4gIH1cbiAgZnJvbShzb3VyY2UpIHtcbiAgICBjb25zdCBpc1BhcnRpYWxTZWxlY3QgPSAhIXRoaXMuZmllbGRzO1xuICAgIGxldCBmaWVsZHM7XG4gICAgaWYgKHRoaXMuZmllbGRzKSB7XG4gICAgICBmaWVsZHMgPSB0aGlzLmZpZWxkcztcbiAgICB9IGVsc2UgaWYgKGlzKHNvdXJjZSwgU3VicXVlcnkpKSB7XG4gICAgICBmaWVsZHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5rZXlzKHNvdXJjZS5fLnNlbGVjdGVkRmllbGRzKS5tYXAoKGtleSkgPT4gW2tleSwgc291cmNlW2tleV1dKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGlzKHNvdXJjZSwgU1FMaXRlVmlld0Jhc2UpKSB7XG4gICAgICBmaWVsZHMgPSBzb3VyY2VbVmlld0Jhc2VDb25maWddLnNlbGVjdGVkRmllbGRzO1xuICAgIH0gZWxzZSBpZiAoaXMoc291cmNlLCBTUUwpKSB7XG4gICAgICBmaWVsZHMgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmllbGRzID0gZ2V0VGFibGVDb2x1bW5zKHNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QmFzZSh7XG4gICAgICB0YWJsZTogc291cmNlLFxuICAgICAgZmllbGRzLFxuICAgICAgaXNQYXJ0aWFsU2VsZWN0LFxuICAgICAgc2Vzc2lvbjogdGhpcy5zZXNzaW9uLFxuICAgICAgZGlhbGVjdDogdGhpcy5kaWFsZWN0LFxuICAgICAgd2l0aExpc3Q6IHRoaXMud2l0aExpc3QsXG4gICAgICBkaXN0aW5jdDogdGhpcy5kaXN0aW5jdFxuICAgIH0pO1xuICB9XG59XG5jbGFzcyBTUUxpdGVTZWxlY3RRdWVyeUJ1aWxkZXJCYXNlIGV4dGVuZHMgVHlwZWRRdWVyeUJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVTZWxlY3RRdWVyeUJ1aWxkZXJcIjtcbiAgXztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25maWc7XG4gIGpvaW5zTm90TnVsbGFibGVNYXA7XG4gIHRhYmxlTmFtZTtcbiAgaXNQYXJ0aWFsU2VsZWN0O1xuICBzZXNzaW9uO1xuICBkaWFsZWN0O1xuICBjYWNoZUNvbmZpZyA9IHZvaWQgMDtcbiAgdXNlZFRhYmxlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGNvbnN0cnVjdG9yKHsgdGFibGUsIGZpZWxkcywgaXNQYXJ0aWFsU2VsZWN0LCBzZXNzaW9uLCBkaWFsZWN0LCB3aXRoTGlzdCwgZGlzdGluY3QgfSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICB3aXRoTGlzdCxcbiAgICAgIHRhYmxlLFxuICAgICAgZmllbGRzOiB7IC4uLmZpZWxkcyB9LFxuICAgICAgZGlzdGluY3QsXG4gICAgICBzZXRPcGVyYXRvcnM6IFtdXG4gICAgfTtcbiAgICB0aGlzLmlzUGFydGlhbFNlbGVjdCA9IGlzUGFydGlhbFNlbGVjdDtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5fID0ge1xuICAgICAgc2VsZWN0ZWRGaWVsZHM6IGZpZWxkcyxcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWdcbiAgICB9O1xuICAgIHRoaXMudGFibGVOYW1lID0gZ2V0VGFibGVMaWtlTmFtZSh0YWJsZSk7XG4gICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwID0gdHlwZW9mIHRoaXMudGFibGVOYW1lID09PSBcInN0cmluZ1wiID8geyBbdGhpcy50YWJsZU5hbWVdOiB0cnVlIH0gOiB7fTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZXh0cmFjdFVzZWRUYWJsZSh0YWJsZSkpIHRoaXMudXNlZFRhYmxlcy5hZGQoaXRlbSk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRVc2VkVGFibGVzKCkge1xuICAgIHJldHVybiBbLi4udGhpcy51c2VkVGFibGVzXTtcbiAgfVxuICBjcmVhdGVKb2luKGpvaW5UeXBlKSB7XG4gICAgcmV0dXJuICh0YWJsZSwgb24pID0+IHtcbiAgICAgIGNvbnN0IGJhc2VUYWJsZU5hbWUgPSB0aGlzLnRhYmxlTmFtZTtcbiAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGdldFRhYmxlTGlrZU5hbWUodGFibGUpO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGV4dHJhY3RVc2VkVGFibGUodGFibGUpKSB0aGlzLnVzZWRUYWJsZXMuYWRkKGl0ZW0pO1xuICAgICAgaWYgKHR5cGVvZiB0YWJsZU5hbWUgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5jb25maWcuam9pbnM/LnNvbWUoKGpvaW4pID0+IGpvaW4uYWxpYXMgPT09IHRhYmxlTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbGlhcyBcIiR7dGFibGVOYW1lfVwiIGlzIGFscmVhZHkgdXNlZCBpbiB0aGlzIHF1ZXJ5YCk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNQYXJ0aWFsU2VsZWN0KSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmpvaW5zTm90TnVsbGFibGVNYXApLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYmFzZVRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyA9IHtcbiAgICAgICAgICAgIFtiYXNlVGFibGVOYW1lXTogdGhpcy5jb25maWcuZmllbGRzXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiAhaXModGFibGUsIFNRTCkpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBpcyh0YWJsZSwgU3VicXVlcnkpID8gdGFibGUuXy5zZWxlY3RlZEZpZWxkcyA6IGlzKHRhYmxlLCBWaWV3KSA/IHRhYmxlW1ZpZXdCYXNlQ29uZmlnXS5zZWxlY3RlZEZpZWxkcyA6IHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHNbdGFibGVOYW1lXSA9IHNlbGVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG9uID0gb24oXG4gICAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzLFxuICAgICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJzcWxcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuY29uZmlnLmpvaW5zKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLmpvaW5zID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLmNvbmZpZy5qb2lucy5wdXNoKHsgb24sIHRhYmxlLCBqb2luVHlwZSwgYWxpYXM6IHRhYmxlTmFtZSB9KTtcbiAgICAgIGlmICh0eXBlb2YgdGFibGVOYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHN3aXRjaCAoam9pblR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwibGVmdFwiOiB7XG4gICAgICAgICAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXBbdGFibGVOYW1lXSA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJyaWdodFwiOiB7XG4gICAgICAgICAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXAgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcCkubWFwKChba2V5XSkgPT4gW2tleSwgZmFsc2VdKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcFt0YWJsZU5hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiY3Jvc3NcIjpcbiAgICAgICAgICBjYXNlIFwiaW5uZXJcIjoge1xuICAgICAgICAgICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwW3RhYmxlTmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJmdWxsXCI6IHtcbiAgICAgICAgICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5qb2luc05vdE51bGxhYmxlTWFwKS5tYXAoKFtrZXldKSA9PiBba2V5LCBmYWxzZV0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwW3RhYmxlTmFtZV0gPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBgbGVmdCBqb2luYCBvcGVyYXRpb24gYnkgYWRkaW5nIGFub3RoZXIgdGFibGUgdG8gdGhlIGN1cnJlbnQgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2QgYXNzb2NpYXRlcyBlYWNoIHJvdyBvZiB0aGUgdGFibGUgd2l0aCB0aGUgY29ycmVzcG9uZGluZyByb3cgZnJvbSB0aGUgam9pbmVkIHRhYmxlLCBpZiBhIG1hdGNoIGlzIGZvdW5kLiBJZiBubyBtYXRjaGluZyByb3cgZXhpc3RzLCBpdCBzZXRzIGFsbCBjb2x1bW5zIG9mIHRoZSBqb2luZWQgdGFibGUgdG8gbnVsbC5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9qb2lucyNsZWZ0LWpvaW59XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdG8gam9pbi5cbiAgICogQHBhcmFtIG9uIHRoZSBgb25gIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB1c2VycyBhbmQgdGhlaXIgcGV0c1xuICAgKiBjb25zdCB1c2Vyc1dpdGhQZXRzOiB7IHVzZXI6IFVzZXI7IHBldHM6IFBldCB8IG51bGw7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCgpXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmxlZnRKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKlxuICAgKiAvLyBTZWxlY3QgdXNlcklkIGFuZCBwZXRJZFxuICAgKiBjb25zdCB1c2Vyc0lkc0FuZFBldElkczogeyB1c2VySWQ6IG51bWJlcjsgcGV0SWQ6IG51bWJlciB8IG51bGw7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCh7XG4gICAqICAgdXNlcklkOiB1c2Vycy5pZCxcbiAgICogICBwZXRJZDogcGV0cy5pZCxcbiAgICogfSlcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAubGVmdEpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqIGBgYFxuICAgKi9cbiAgbGVmdEpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJsZWZ0XCIpO1xuICAvKipcbiAgICogRXhlY3V0ZXMgYSBgcmlnaHQgam9pbmAgb3BlcmF0aW9uIGJ5IGFkZGluZyBhbm90aGVyIHRhYmxlIHRvIHRoZSBjdXJyZW50IHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGFzc29jaWF0ZXMgZWFjaCByb3cgb2YgdGhlIGpvaW5lZCB0YWJsZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHJvdyBmcm9tIHRoZSBtYWluIHRhYmxlLCBpZiBhIG1hdGNoIGlzIGZvdW5kLiBJZiBubyBtYXRjaGluZyByb3cgZXhpc3RzLCBpdCBzZXRzIGFsbCBjb2x1bW5zIG9mIHRoZSBtYWluIHRhYmxlIHRvIG51bGwuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvam9pbnMjcmlnaHQtam9pbn1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBqb2luLlxuICAgKiBAcGFyYW0gb24gdGhlIGBvbmAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHVzZXJzIGFuZCB0aGVpciBwZXRzXG4gICAqIGNvbnN0IHVzZXJzV2l0aFBldHM6IHsgdXNlcjogVXNlciB8IG51bGw7IHBldHM6IFBldDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KClcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAucmlnaHRKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKlxuICAgKiAvLyBTZWxlY3QgdXNlcklkIGFuZCBwZXRJZFxuICAgKiBjb25zdCB1c2Vyc0lkc0FuZFBldElkczogeyB1c2VySWQ6IG51bWJlciB8IG51bGw7IHBldElkOiBudW1iZXI7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCh7XG4gICAqICAgdXNlcklkOiB1c2Vycy5pZCxcbiAgICogICBwZXRJZDogcGV0cy5pZCxcbiAgICogfSlcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAucmlnaHRKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKiBgYGBcbiAgICovXG4gIHJpZ2h0Sm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcInJpZ2h0XCIpO1xuICAvKipcbiAgICogRXhlY3V0ZXMgYW4gYGlubmVyIGpvaW5gIG9wZXJhdGlvbiwgY3JlYXRpbmcgYSBuZXcgdGFibGUgYnkgY29tYmluaW5nIHJvd3MgZnJvbSB0d28gdGFibGVzIHRoYXQgaGF2ZSBtYXRjaGluZyB2YWx1ZXMuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2QgcmV0cmlldmVzIHJvd3MgdGhhdCBoYXZlIGNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiBib3RoIGpvaW5lZCB0YWJsZXMuIFJvd3Mgd2l0aG91dCBtYXRjaGluZyBlbnRyaWVzIGluIGVpdGhlciB0YWJsZSBhcmUgZXhjbHVkZWQsIHJlc3VsdGluZyBpbiBhIHRhYmxlIHRoYXQgaW5jbHVkZXMgb25seSBtYXRjaGluZyBwYWlycy5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9qb2lucyNpbm5lci1qb2lufVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRvIGpvaW4uXG4gICAqIEBwYXJhbSBvbiB0aGUgYG9uYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdXNlcnMgYW5kIHRoZWlyIHBldHNcbiAgICogY29uc3QgdXNlcnNXaXRoUGV0czogeyB1c2VyOiBVc2VyOyBwZXRzOiBQZXQ7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCgpXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmlubmVySm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICpcbiAgICogLy8gU2VsZWN0IHVzZXJJZCBhbmQgcGV0SWRcbiAgICogY29uc3QgdXNlcnNJZHNBbmRQZXRJZHM6IHsgdXNlcklkOiBudW1iZXI7IHBldElkOiBudW1iZXI7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCh7XG4gICAqICAgdXNlcklkOiB1c2Vycy5pZCxcbiAgICogICBwZXRJZDogcGV0cy5pZCxcbiAgICogfSlcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAuaW5uZXJKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKiBgYGBcbiAgICovXG4gIGlubmVySm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImlubmVyXCIpO1xuICAvKipcbiAgICogRXhlY3V0ZXMgYSBgZnVsbCBqb2luYCBvcGVyYXRpb24gYnkgY29tYmluaW5nIHJvd3MgZnJvbSB0d28gdGFibGVzIGludG8gYSBuZXcgdGFibGUuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2QgcmV0cmlldmVzIGFsbCByb3dzIGZyb20gYm90aCBtYWluIGFuZCBqb2luZWQgdGFibGVzLCBtZXJnaW5nIHJvd3Mgd2l0aCBtYXRjaGluZyB2YWx1ZXMgYW5kIGZpbGxpbmcgaW4gYG51bGxgIGZvciBub24tbWF0Y2hpbmcgY29sdW1ucy5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9qb2lucyNmdWxsLWpvaW59XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdG8gam9pbi5cbiAgICogQHBhcmFtIG9uIHRoZSBgb25gIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB1c2VycyBhbmQgdGhlaXIgcGV0c1xuICAgKiBjb25zdCB1c2Vyc1dpdGhQZXRzOiB7IHVzZXI6IFVzZXIgfCBudWxsOyBwZXRzOiBQZXQgfCBudWxsOyB9W10gPSBhd2FpdCBkYi5zZWxlY3QoKVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5mdWxsSm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICpcbiAgICogLy8gU2VsZWN0IHVzZXJJZCBhbmQgcGV0SWRcbiAgICogY29uc3QgdXNlcnNJZHNBbmRQZXRJZHM6IHsgdXNlcklkOiBudW1iZXIgfCBudWxsOyBwZXRJZDogbnVtYmVyIHwgbnVsbDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KHtcbiAgICogICB1c2VySWQ6IHVzZXJzLmlkLFxuICAgKiAgIHBldElkOiBwZXRzLmlkLFxuICAgKiB9KVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5mdWxsSm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICogYGBgXG4gICAqL1xuICBmdWxsSm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImZ1bGxcIik7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGBjcm9zcyBqb2luYCBvcGVyYXRpb24gYnkgY29tYmluaW5nIHJvd3MgZnJvbSB0d28gdGFibGVzIGludG8gYSBuZXcgdGFibGUuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2QgcmV0cmlldmVzIGFsbCByb3dzIGZyb20gYm90aCBtYWluIGFuZCBqb2luZWQgdGFibGVzLCBtZXJnaW5nIGFsbCByb3dzIGZyb20gZWFjaCB0YWJsZS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9qb2lucyNjcm9zcy1qb2lufVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRvIGpvaW4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdXNlcnMsIGVhY2ggdXNlciB3aXRoIGV2ZXJ5IHBldFxuICAgKiBjb25zdCB1c2Vyc1dpdGhQZXRzOiB7IHVzZXI6IFVzZXI7IHBldHM6IFBldDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KClcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAuY3Jvc3NKb2luKHBldHMpXG4gICAqXG4gICAqIC8vIFNlbGVjdCB1c2VySWQgYW5kIHBldElkXG4gICAqIGNvbnN0IHVzZXJzSWRzQW5kUGV0SWRzOiB7IHVzZXJJZDogbnVtYmVyOyBwZXRJZDogbnVtYmVyOyB9W10gPSBhd2FpdCBkYi5zZWxlY3Qoe1xuICAgKiAgIHVzZXJJZDogdXNlcnMuaWQsXG4gICAqICAgcGV0SWQ6IHBldHMuaWQsXG4gICAqIH0pXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmNyb3NzSm9pbihwZXRzKVxuICAgKiBgYGBcbiAgICovXG4gIGNyb3NzSm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImNyb3NzXCIpO1xuICBjcmVhdGVTZXRPcGVyYXRvcih0eXBlLCBpc0FsbCkge1xuICAgIHJldHVybiAocmlnaHRTZWxlY3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IHJpZ2h0U2VsZWN0ID0gdHlwZW9mIHJpZ2h0U2VsZWN0aW9uID09PSBcImZ1bmN0aW9uXCIgPyByaWdodFNlbGVjdGlvbihnZXRTUUxpdGVTZXRPcGVyYXRvcnMoKSkgOiByaWdodFNlbGVjdGlvbjtcbiAgICAgIGlmICghaGF2ZVNhbWVLZXlzKHRoaXMuZ2V0U2VsZWN0ZWRGaWVsZHMoKSwgcmlnaHRTZWxlY3QuZ2V0U2VsZWN0ZWRGaWVsZHMoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiU2V0IG9wZXJhdG9yIGVycm9yICh1bmlvbiAvIGludGVyc2VjdCAvIGV4Y2VwdCk6IHNlbGVjdGVkIGZpZWxkcyBhcmUgbm90IHRoZSBzYW1lIG9yIGFyZSBpbiBhIGRpZmZlcmVudCBvcmRlclwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMucHVzaCh7IHR5cGUsIGlzQWxsLCByaWdodFNlbGVjdCB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYHVuaW9uYCBzZXQgb3BlcmF0b3IgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgY29tYmluZSB0aGUgcmVzdWx0IHNldHMgb2YgdGhlIGBzZWxlY3RgIHN0YXRlbWVudHMgYW5kIHJlbW92ZSBhbnkgZHVwbGljYXRlIHJvd3MgdGhhdCBhcHBlYXIgYWNyb3NzIHRoZW0uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2V0LW9wZXJhdGlvbnMjdW5pb259XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdW5pcXVlIG5hbWVzIGZyb20gY3VzdG9tZXJzIGFuZCB1c2VycyB0YWJsZXNcbiAgICogYXdhaXQgZGIuc2VsZWN0KHsgbmFtZTogdXNlcnMubmFtZSB9KVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC51bmlvbihcbiAgICogICAgIGRiLnNlbGVjdCh7IG5hbWU6IGN1c3RvbWVycy5uYW1lIH0pLmZyb20oY3VzdG9tZXJzKVxuICAgKiAgICk7XG4gICAqIC8vIG9yXG4gICAqIGltcG9ydCB7IHVuaW9uIH0gZnJvbSAnZHJpenpsZS1vcm0vc3FsaXRlLWNvcmUnXG4gICAqXG4gICAqIGF3YWl0IHVuaW9uKFxuICAgKiAgIGRiLnNlbGVjdCh7IG5hbWU6IHVzZXJzLm5hbWUgfSkuZnJvbSh1c2VycyksXG4gICAqICAgZGIuc2VsZWN0KHsgbmFtZTogY3VzdG9tZXJzLm5hbWUgfSkuZnJvbShjdXN0b21lcnMpXG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgdW5pb24gPSB0aGlzLmNyZWF0ZVNldE9wZXJhdG9yKFwidW5pb25cIiwgZmFsc2UpO1xuICAvKipcbiAgICogQWRkcyBgdW5pb24gYWxsYCBzZXQgb3BlcmF0b3IgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgY29tYmluZSB0aGUgcmVzdWx0LXNldCBvZiB0aGUgYHNlbGVjdGAgc3RhdGVtZW50cyBhbmQga2VlcCBhbGwgZHVwbGljYXRlIHJvd3MgdGhhdCBhcHBlYXIgYWNyb3NzIHRoZW0uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2V0LW9wZXJhdGlvbnMjdW5pb24tYWxsfVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHRyYW5zYWN0aW9uIGlkcyBmcm9tIGJvdGggb25saW5lIGFuZCBpbi1zdG9yZSBzYWxlc1xuICAgKiBhd2FpdCBkYi5zZWxlY3QoeyB0cmFuc2FjdGlvbjogb25saW5lU2FsZXMudHJhbnNhY3Rpb25JZCB9KVxuICAgKiAgIC5mcm9tKG9ubGluZVNhbGVzKVxuICAgKiAgIC51bmlvbkFsbChcbiAgICogICAgIGRiLnNlbGVjdCh7IHRyYW5zYWN0aW9uOiBpblN0b3JlU2FsZXMudHJhbnNhY3Rpb25JZCB9KS5mcm9tKGluU3RvcmVTYWxlcylcbiAgICogICApO1xuICAgKiAvLyBvclxuICAgKiBpbXBvcnQgeyB1bmlvbkFsbCB9IGZyb20gJ2RyaXp6bGUtb3JtL3NxbGl0ZS1jb3JlJ1xuICAgKlxuICAgKiBhd2FpdCB1bmlvbkFsbChcbiAgICogICBkYi5zZWxlY3QoeyB0cmFuc2FjdGlvbjogb25saW5lU2FsZXMudHJhbnNhY3Rpb25JZCB9KS5mcm9tKG9ubGluZVNhbGVzKSxcbiAgICogICBkYi5zZWxlY3QoeyB0cmFuc2FjdGlvbjogaW5TdG9yZVNhbGVzLnRyYW5zYWN0aW9uSWQgfSkuZnJvbShpblN0b3JlU2FsZXMpXG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgdW5pb25BbGwgPSB0aGlzLmNyZWF0ZVNldE9wZXJhdG9yKFwidW5pb25cIiwgdHJ1ZSk7XG4gIC8qKlxuICAgKiBBZGRzIGBpbnRlcnNlY3RgIHNldCBvcGVyYXRvciB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCByZXRhaW4gb25seSB0aGUgcm93cyB0aGF0IGFyZSBwcmVzZW50IGluIGJvdGggcmVzdWx0IHNldHMgYW5kIGVsaW1pbmF0ZSBkdXBsaWNhdGVzLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NldC1vcGVyYXRpb25zI2ludGVyc2VjdH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGNvdXJzZSBuYW1lcyB0aGF0IGFyZSBvZmZlcmVkIGluIGJvdGggZGVwYXJ0bWVudHMgQSBhbmQgQlxuICAgKiBhd2FpdCBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBBLmNvdXJzZU5hbWUgfSlcbiAgICogICAuZnJvbShkZXBBKVxuICAgKiAgIC5pbnRlcnNlY3QoXG4gICAqICAgICBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBCLmNvdXJzZU5hbWUgfSkuZnJvbShkZXBCKVxuICAgKiAgICk7XG4gICAqIC8vIG9yXG4gICAqIGltcG9ydCB7IGludGVyc2VjdCB9IGZyb20gJ2RyaXp6bGUtb3JtL3NxbGl0ZS1jb3JlJ1xuICAgKlxuICAgKiBhd2FpdCBpbnRlcnNlY3QoXG4gICAqICAgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQS5jb3Vyc2VOYW1lIH0pLmZyb20oZGVwQSksXG4gICAqICAgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQi5jb3Vyc2VOYW1lIH0pLmZyb20oZGVwQilcbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBpbnRlcnNlY3QgPSB0aGlzLmNyZWF0ZVNldE9wZXJhdG9yKFwiaW50ZXJzZWN0XCIsIGZhbHNlKTtcbiAgLyoqXG4gICAqIEFkZHMgYGV4Y2VwdGAgc2V0IG9wZXJhdG9yIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHJldHJpZXZlIGFsbCB1bmlxdWUgcm93cyBmcm9tIHRoZSBsZWZ0IHF1ZXJ5LCBleGNlcHQgZm9yIHRoZSByb3dzIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIHJlc3VsdCBzZXQgb2YgdGhlIHJpZ2h0IHF1ZXJ5LlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NldC1vcGVyYXRpb25zI2V4Y2VwdH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCBjb3Vyc2VzIG9mZmVyZWQgaW4gZGVwYXJ0bWVudCBBIGJ1dCBub3QgaW4gZGVwYXJ0bWVudCBCXG4gICAqIGF3YWl0IGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEEuY291cnNlTmFtZSB9KVxuICAgKiAgIC5mcm9tKGRlcEEpXG4gICAqICAgLmV4Y2VwdChcbiAgICogICAgIGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEIuY291cnNlTmFtZSB9KS5mcm9tKGRlcEIpXG4gICAqICAgKTtcbiAgICogLy8gb3JcbiAgICogaW1wb3J0IHsgZXhjZXB0IH0gZnJvbSAnZHJpenpsZS1vcm0vc3FsaXRlLWNvcmUnXG4gICAqXG4gICAqIGF3YWl0IGV4Y2VwdChcbiAgICogICBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBBLmNvdXJzZU5hbWUgfSkuZnJvbShkZXBBKSxcbiAgICogICBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBCLmNvdXJzZU5hbWUgfSkuZnJvbShkZXBCKVxuICAgKiApO1xuICAgKiBgYGBcbiAgICovXG4gIGV4Y2VwdCA9IHRoaXMuY3JlYXRlU2V0T3BlcmF0b3IoXCJleGNlcHRcIiwgZmFsc2UpO1xuICAvKiogQGludGVybmFsICovXG4gIGFkZFNldE9wZXJhdG9ycyhzZXRPcGVyYXRvcnMpIHtcbiAgICB0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMucHVzaCguLi5zZXRPcGVyYXRvcnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgYHdoZXJlYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgc2VsZWN0IG9ubHkgdGhvc2Ugcm93cyB0aGF0IGZ1bGZpbGwgYSBzcGVjaWZpZWQgY29uZGl0aW9uLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NlbGVjdCNmaWx0ZXJpbmd9XG4gICAqXG4gICAqIEBwYXJhbSB3aGVyZSB0aGUgYHdoZXJlYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFlvdSBjYW4gdXNlIGNvbmRpdGlvbmFsIG9wZXJhdG9ycyBhbmQgYHNxbCBmdW5jdGlvbmAgdG8gZmlsdGVyIHRoZSByb3dzIHRvIGJlIHNlbGVjdGVkLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIGNhcnMgd2l0aCBncmVlbiBjb2xvclxuICAgKiBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKGNhcnMpLndoZXJlKGVxKGNhcnMuY29sb3IsICdncmVlbicpKTtcbiAgICogLy8gb3JcbiAgICogYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShjYXJzKS53aGVyZShzcWxgJHtjYXJzLmNvbG9yfSA9ICdncmVlbidgKVxuICAgKiBgYGBcbiAgICpcbiAgICogWW91IGNhbiBsb2dpY2FsbHkgY29tYmluZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgd2l0aCBgYW5kKClgIGFuZCBgb3IoKWAgb3BlcmF0b3JzOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIEJNVyBjYXJzIHdpdGggYSBncmVlbiBjb2xvclxuICAgKiBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKGNhcnMpLndoZXJlKGFuZChlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSwgZXEoY2Fycy5icmFuZCwgJ0JNVycpKSk7XG4gICAqXG4gICAqIC8vIFNlbGVjdCBhbGwgY2FycyB3aXRoIHRoZSBncmVlbiBvciBibHVlIGNvbG9yXG4gICAqIGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oY2Fycykud2hlcmUob3IoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJyksIGVxKGNhcnMuY29sb3IsICdibHVlJykpKTtcbiAgICogYGBgXG4gICAqL1xuICB3aGVyZSh3aGVyZSkge1xuICAgIGlmICh0eXBlb2Ygd2hlcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgd2hlcmUgPSB3aGVyZShcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcInNxbFwiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy53aGVyZSA9IHdoZXJlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgYGhhdmluZ2AgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHNlbGVjdCBvbmx5IHRob3NlIHJvd3MgdGhhdCBmdWxmaWxsIGEgc3BlY2lmaWVkIGNvbmRpdGlvbi4gSXQgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCBhZ2dyZWdhdGUgZnVuY3Rpb25zIHRvIGZpbHRlciB0aGUgYWdncmVnYXRlZCBkYXRhIGJhc2VkIG9uIGEgc3BlY2lmaWVkIGNvbmRpdGlvbi5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZWxlY3QjYWdncmVnYXRpb25zfVxuICAgKlxuICAgKiBAcGFyYW0gaGF2aW5nIHRoZSBgaGF2aW5nYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgYnJhbmRzIHdpdGggbW9yZSB0aGFuIG9uZSBjYXJcbiAgICogYXdhaXQgZGIuc2VsZWN0KHtcbiAgICogXHRicmFuZDogY2Fycy5icmFuZCxcbiAgICogXHRjb3VudDogc3FsPG51bWJlcj5gY2FzdChjb3VudCgke2NhcnMuaWR9KSBhcyBpbnQpYCxcbiAgICogfSlcbiAgICogICAuZnJvbShjYXJzKVxuICAgKiAgIC5ncm91cEJ5KGNhcnMuYnJhbmQpXG4gICAqICAgLmhhdmluZygoeyBjb3VudCB9KSA9PiBndChjb3VudCwgMSkpO1xuICAgKiBgYGBcbiAgICovXG4gIGhhdmluZyhoYXZpbmcpIHtcbiAgICBpZiAodHlwZW9mIGhhdmluZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBoYXZpbmcgPSBoYXZpbmcoXG4gICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMsXG4gICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJzcWxcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5jb25maWcuaGF2aW5nID0gaGF2aW5nO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdyb3VwQnkoLi4uY29sdW1ucykge1xuICAgIGlmICh0eXBlb2YgY29sdW1uc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBncm91cEJ5ID0gY29sdW1uc1swXShcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbmZpZy5ncm91cEJ5ID0gQXJyYXkuaXNBcnJheShncm91cEJ5KSA/IGdyb3VwQnkgOiBbZ3JvdXBCeV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZmlnLmdyb3VwQnkgPSBjb2x1bW5zO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcmRlckJ5KC4uLmNvbHVtbnMpIHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbnNbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3Qgb3JkZXJCeSA9IGNvbHVtbnNbMF0oXG4gICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMsXG4gICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgY29uc3Qgb3JkZXJCeUFycmF5ID0gQXJyYXkuaXNBcnJheShvcmRlckJ5KSA/IG9yZGVyQnkgOiBbb3JkZXJCeV07XG4gICAgICBpZiAodGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmF0KC0xKS5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25maWcub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3JkZXJCeUFycmF5ID0gY29sdW1ucztcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMuYXQoLTEpLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbmZpZy5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGBsaW1pdGAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkgdGhpcyBxdWVyeS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZWxlY3QjbGltaXQtLW9mZnNldH1cbiAgICpcbiAgICogQHBhcmFtIGxpbWl0IHRoZSBgbGltaXRgIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gR2V0IHRoZSBmaXJzdCAxMCBwZW9wbGUgZnJvbSB0aGlzIHF1ZXJ5LlxuICAgKiBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKHBlb3BsZSkubGltaXQoMTApO1xuICAgKiBgYGBcbiAgICovXG4gIGxpbWl0KGxpbWl0KSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMuYXQoLTEpLmxpbWl0ID0gbGltaXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZmlnLmxpbWl0ID0gbGltaXQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGFuIGBvZmZzZXRgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBza2lwIGEgbnVtYmVyIG9mIHJvd3Mgd2hlbiByZXR1cm5pbmcgcmVzdWx0cyBmcm9tIHRoaXMgcXVlcnkuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2VsZWN0I2xpbWl0LS1vZmZzZXR9XG4gICAqXG4gICAqIEBwYXJhbSBvZmZzZXQgdGhlIGBvZmZzZXRgIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gR2V0IHRoZSAxMHRoLTIwdGggcGVvcGxlIGZyb20gdGhpcyBxdWVyeS5cbiAgICogYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShwZW9wbGUpLm9mZnNldCgxMCkubGltaXQoMTApO1xuICAgKiBgYGBcbiAgICovXG4gIG9mZnNldChvZmZzZXQpIHtcbiAgICBpZiAodGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5hdCgtMSkub2Zmc2V0ID0gb2Zmc2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbmZpZy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiB0aGlzLmRpYWxlY3QuYnVpbGRTZWxlY3RRdWVyeSh0aGlzLmNvbmZpZyk7XG4gIH1cbiAgdG9TUUwoKSB7XG4gICAgY29uc3QgeyB0eXBpbmdzOiBfdHlwaW5ncywgLi4ucmVzdCB9ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSk7XG4gICAgcmV0dXJuIHJlc3Q7XG4gIH1cbiAgYXMoYWxpYXMpIHtcbiAgICBjb25zdCB1c2VkVGFibGVzID0gW107XG4gICAgdXNlZFRhYmxlcy5wdXNoKC4uLmV4dHJhY3RVc2VkVGFibGUodGhpcy5jb25maWcudGFibGUpKTtcbiAgICBpZiAodGhpcy5jb25maWcuam9pbnMpIHtcbiAgICAgIGZvciAoY29uc3QgaXQgb2YgdGhpcy5jb25maWcuam9pbnMpIHVzZWRUYWJsZXMucHVzaCguLi5leHRyYWN0VXNlZFRhYmxlKGl0LnRhYmxlKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICBuZXcgU3VicXVlcnkodGhpcy5nZXRTUUwoKSwgdGhpcy5jb25maWcuZmllbGRzLCBhbGlhcywgZmFsc2UsIFsuLi5uZXcgU2V0KHVzZWRUYWJsZXMpXSksXG4gICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgYWxpYXMsIHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJlcnJvclwiIH0pXG4gICAgKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGdldFNlbGVjdGVkRmllbGRzKCkge1xuICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICB0aGlzLmNvbmZpZy5maWVsZHMsXG4gICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgYWxpYXM6IHRoaXMudGFibGVOYW1lLCBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwiZXJyb3JcIiB9KVxuICAgICk7XG4gIH1cbiAgJGR5bmFtaWMoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVNlbGVjdEJhc2UgZXh0ZW5kcyBTUUxpdGVTZWxlY3RRdWVyeUJ1aWxkZXJCYXNlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlU2VsZWN0XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ByZXBhcmUoaXNPbmVUaW1lUXVlcnkgPSB0cnVlKSB7XG4gICAgaWYgKCF0aGlzLnNlc3Npb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBleGVjdXRlIGEgcXVlcnkgb24gYSBxdWVyeSBidWlsZGVyLiBQbGVhc2UgdXNlIGEgZGF0YWJhc2UgaW5zdGFuY2UgaW5zdGVhZC5cIik7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkc0xpc3QgPSBvcmRlclNlbGVjdGVkRmllbGRzKHRoaXMuY29uZmlnLmZpZWxkcyk7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNlc3Npb25baXNPbmVUaW1lUXVlcnkgPyBcInByZXBhcmVPbmVUaW1lUXVlcnlcIiA6IFwicHJlcGFyZVF1ZXJ5XCJdKFxuICAgICAgdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSksXG4gICAgICBmaWVsZHNMaXN0LFxuICAgICAgXCJhbGxcIixcbiAgICAgIHRydWUsXG4gICAgICB2b2lkIDAsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwic2VsZWN0XCIsXG4gICAgICAgIHRhYmxlczogWy4uLnRoaXMudXNlZFRhYmxlc11cbiAgICAgIH0sXG4gICAgICB0aGlzLmNhY2hlQ29uZmlnXG4gICAgKTtcbiAgICBxdWVyeS5qb2luc05vdE51bGxhYmxlTWFwID0gdGhpcy5qb2luc05vdE51bGxhYmxlTWFwO1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuICAkd2l0aENhY2hlKGNvbmZpZykge1xuICAgIHRoaXMuY2FjaGVDb25maWcgPSBjb25maWcgPT09IHZvaWQgMCA/IHsgY29uZmlnOiB7fSwgZW5hYmxlOiB0cnVlLCBhdXRvSW52YWxpZGF0ZTogdHJ1ZSB9IDogY29uZmlnID09PSBmYWxzZSA/IHsgZW5hYmxlOiBmYWxzZSB9IDogeyBlbmFibGU6IHRydWUsIGF1dG9JbnZhbGlkYXRlOiB0cnVlLCAuLi5jb25maWcgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBwcmVwYXJlKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKTtcbiAgfVxuICBydW4gPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnJ1bihwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFsbCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuYWxsKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgZ2V0ID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5nZXQocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICB2YWx1ZXMgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWxsKCk7XG4gIH1cbn1cbmFwcGx5TWl4aW5zKFNRTGl0ZVNlbGVjdEJhc2UsIFtRdWVyeVByb21pc2VdKTtcbmZ1bmN0aW9uIGNyZWF0ZVNldE9wZXJhdG9yKHR5cGUsIGlzQWxsKSB7XG4gIHJldHVybiAobGVmdFNlbGVjdCwgcmlnaHRTZWxlY3QsIC4uLnJlc3RTZWxlY3RzKSA9PiB7XG4gICAgY29uc3Qgc2V0T3BlcmF0b3JzID0gW3JpZ2h0U2VsZWN0LCAuLi5yZXN0U2VsZWN0c10ubWFwKChzZWxlY3QpID0+ICh7XG4gICAgICB0eXBlLFxuICAgICAgaXNBbGwsXG4gICAgICByaWdodFNlbGVjdDogc2VsZWN0XG4gICAgfSkpO1xuICAgIGZvciAoY29uc3Qgc2V0T3BlcmF0b3Igb2Ygc2V0T3BlcmF0b3JzKSB7XG4gICAgICBpZiAoIWhhdmVTYW1lS2V5cyhsZWZ0U2VsZWN0LmdldFNlbGVjdGVkRmllbGRzKCksIHNldE9wZXJhdG9yLnJpZ2h0U2VsZWN0LmdldFNlbGVjdGVkRmllbGRzKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIlNldCBvcGVyYXRvciBlcnJvciAodW5pb24gLyBpbnRlcnNlY3QgLyBleGNlcHQpOiBzZWxlY3RlZCBmaWVsZHMgYXJlIG5vdCB0aGUgc2FtZSBvciBhcmUgaW4gYSBkaWZmZXJlbnQgb3JkZXJcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGVmdFNlbGVjdC5hZGRTZXRPcGVyYXRvcnMoc2V0T3BlcmF0b3JzKTtcbiAgfTtcbn1cbmNvbnN0IGdldFNRTGl0ZVNldE9wZXJhdG9ycyA9ICgpID0+ICh7XG4gIHVuaW9uLFxuICB1bmlvbkFsbCxcbiAgaW50ZXJzZWN0LFxuICBleGNlcHRcbn0pO1xuY29uc3QgdW5pb24gPSBjcmVhdGVTZXRPcGVyYXRvcihcInVuaW9uXCIsIGZhbHNlKTtcbmNvbnN0IHVuaW9uQWxsID0gY3JlYXRlU2V0T3BlcmF0b3IoXCJ1bmlvblwiLCB0cnVlKTtcbmNvbnN0IGludGVyc2VjdCA9IGNyZWF0ZVNldE9wZXJhdG9yKFwiaW50ZXJzZWN0XCIsIGZhbHNlKTtcbmNvbnN0IGV4Y2VwdCA9IGNyZWF0ZVNldE9wZXJhdG9yKFwiZXhjZXB0XCIsIGZhbHNlKTtcbmV4cG9ydCB7XG4gIFNRTGl0ZVNlbGVjdEJhc2UsXG4gIFNRTGl0ZVNlbGVjdEJ1aWxkZXIsXG4gIFNRTGl0ZVNlbGVjdFF1ZXJ5QnVpbGRlckJhc2UsXG4gIGV4Y2VwdCxcbiAgaW50ZXJzZWN0LFxuICB1bmlvbixcbiAgdW5pb25BbGxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWxlY3QuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNlbGVjdGlvblByb3h5SGFuZGxlciB9IGZyb20gXCIuLi8uLi9zZWxlY3Rpb24tcHJveHkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZURpYWxlY3QsIFNRTGl0ZVN5bmNEaWFsZWN0IH0gZnJvbSBcIi4uL2RpYWxlY3QuanNcIjtcbmltcG9ydCB7IFdpdGhTdWJxdWVyeSB9IGZyb20gXCIuLi8uLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlU2VsZWN0QnVpbGRlciB9IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuY2xhc3MgUXVlcnlCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlUXVlcnlCdWlsZGVyXCI7XG4gIGRpYWxlY3Q7XG4gIGRpYWxlY3RDb25maWc7XG4gIGNvbnN0cnVjdG9yKGRpYWxlY3QpIHtcbiAgICB0aGlzLmRpYWxlY3QgPSBpcyhkaWFsZWN0LCBTUUxpdGVEaWFsZWN0KSA/IGRpYWxlY3QgOiB2b2lkIDA7XG4gICAgdGhpcy5kaWFsZWN0Q29uZmlnID0gaXMoZGlhbGVjdCwgU1FMaXRlRGlhbGVjdCkgPyB2b2lkIDAgOiBkaWFsZWN0O1xuICB9XG4gICR3aXRoID0gKGFsaWFzLCBzZWxlY3Rpb24pID0+IHtcbiAgICBjb25zdCBxdWVyeUJ1aWxkZXIgPSB0aGlzO1xuICAgIGNvbnN0IGFzID0gKHFiKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHFiID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcWIgPSBxYihxdWVyeUJ1aWxkZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQcm94eShcbiAgICAgICAgbmV3IFdpdGhTdWJxdWVyeShcbiAgICAgICAgICBxYi5nZXRTUUwoKSxcbiAgICAgICAgICBzZWxlY3Rpb24gPz8gKFwiZ2V0U2VsZWN0ZWRGaWVsZHNcIiBpbiBxYiA/IHFiLmdldFNlbGVjdGVkRmllbGRzKCkgPz8ge30gOiB7fSksXG4gICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApLFxuICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgYWxpYXMsIHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJlcnJvclwiIH0pXG4gICAgICApO1xuICAgIH07XG4gICAgcmV0dXJuIHsgYXMgfTtcbiAgfTtcbiAgd2l0aCguLi5xdWVyaWVzKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgZnVuY3Rpb24gc2VsZWN0KGZpZWxkcykge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHtcbiAgICAgICAgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLFxuICAgICAgICBzZXNzaW9uOiB2b2lkIDAsXG4gICAgICAgIGRpYWxlY3Q6IHNlbGYuZ2V0RGlhbGVjdCgpLFxuICAgICAgICB3aXRoTGlzdDogcXVlcmllc1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNlbGVjdERpc3RpbmN0KGZpZWxkcykge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHtcbiAgICAgICAgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLFxuICAgICAgICBzZXNzaW9uOiB2b2lkIDAsXG4gICAgICAgIGRpYWxlY3Q6IHNlbGYuZ2V0RGlhbGVjdCgpLFxuICAgICAgICB3aXRoTGlzdDogcXVlcmllcyxcbiAgICAgICAgZGlzdGluY3Q6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4geyBzZWxlY3QsIHNlbGVjdERpc3RpbmN0IH07XG4gIH1cbiAgc2VsZWN0KGZpZWxkcykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7IGZpZWxkczogZmllbGRzID8/IHZvaWQgMCwgc2Vzc2lvbjogdm9pZCAwLCBkaWFsZWN0OiB0aGlzLmdldERpYWxlY3QoKSB9KTtcbiAgfVxuICBzZWxlY3REaXN0aW5jdChmaWVsZHMpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoe1xuICAgICAgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLFxuICAgICAgc2Vzc2lvbjogdm9pZCAwLFxuICAgICAgZGlhbGVjdDogdGhpcy5nZXREaWFsZWN0KCksXG4gICAgICBkaXN0aW5jdDogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIC8vIExhenkgbG9hZCBkaWFsZWN0IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3lcbiAgZ2V0RGlhbGVjdCgpIHtcbiAgICBpZiAoIXRoaXMuZGlhbGVjdCkge1xuICAgICAgdGhpcy5kaWFsZWN0ID0gbmV3IFNRTGl0ZVN5bmNEaWFsZWN0KHRoaXMuZGlhbGVjdENvbmZpZyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRpYWxlY3Q7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFF1ZXJ5QnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1ZXJ5LWJ1aWxkZXIuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi8uLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5pbXBvcnQgeyBQYXJhbSwgU1FMLCBzcWwgfSBmcm9tIFwiLi4vLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IENvbHVtbnMsIFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBoYXZlU2FtZUtleXMsIG1hcFVwZGF0ZVNldCwgb3JkZXJTZWxlY3RlZEZpZWxkcyB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgZXh0cmFjdFVzZWRUYWJsZSB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlci5qc1wiO1xuY2xhc3MgU1FMaXRlSW5zZXJ0QnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBzZXNzaW9uLCBkaWFsZWN0LCB3aXRoTGlzdCkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy53aXRoTGlzdCA9IHdpdGhMaXN0O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUluc2VydEJ1aWxkZXJcIjtcbiAgdmFsdWVzKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IEFycmF5LmlzQXJyYXkodmFsdWVzKSA/IHZhbHVlcyA6IFt2YWx1ZXNdO1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ2YWx1ZXMoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIGF0IGxlYXN0IG9uZSB2YWx1ZVwiKTtcbiAgICB9XG4gICAgY29uc3QgbWFwcGVkVmFsdWVzID0gdmFsdWVzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgY29uc3QgY29scyA9IHRoaXMudGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xuICAgICAgZm9yIChjb25zdCBjb2xLZXkgb2YgT2JqZWN0LmtleXMoZW50cnkpKSB7XG4gICAgICAgIGNvbnN0IGNvbFZhbHVlID0gZW50cnlbY29sS2V5XTtcbiAgICAgICAgcmVzdWx0W2NvbEtleV0gPSBpcyhjb2xWYWx1ZSwgU1FMKSA/IGNvbFZhbHVlIDogbmV3IFBhcmFtKGNvbFZhbHVlLCBjb2xzW2NvbEtleV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUluc2VydEJhc2UodGhpcy50YWJsZSwgbWFwcGVkVmFsdWVzLCB0aGlzLnNlc3Npb24sIHRoaXMuZGlhbGVjdCwgdGhpcy53aXRoTGlzdCk7XG4gIH1cbiAgc2VsZWN0KHNlbGVjdFF1ZXJ5KSB7XG4gICAgY29uc3Qgc2VsZWN0ID0gdHlwZW9mIHNlbGVjdFF1ZXJ5ID09PSBcImZ1bmN0aW9uXCIgPyBzZWxlY3RRdWVyeShuZXcgUXVlcnlCdWlsZGVyKCkpIDogc2VsZWN0UXVlcnk7XG4gICAgaWYgKCFpcyhzZWxlY3QsIFNRTCkgJiYgIWhhdmVTYW1lS2V5cyh0aGlzLnRhYmxlW0NvbHVtbnNdLCBzZWxlY3QuXy5zZWxlY3RlZEZpZWxkcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJJbnNlcnQgc2VsZWN0IGVycm9yOiBzZWxlY3RlZCBmaWVsZHMgYXJlIG5vdCB0aGUgc2FtZSBvciBhcmUgaW4gYSBkaWZmZXJlbnQgb3JkZXIgY29tcGFyZWQgdG8gdGhlIHRhYmxlIGRlZmluaXRpb25cIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVJbnNlcnRCYXNlKHRoaXMudGFibGUsIHNlbGVjdCwgdGhpcy5zZXNzaW9uLCB0aGlzLmRpYWxlY3QsIHRoaXMud2l0aExpc3QsIHRydWUpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVJbnNlcnRCYXNlIGV4dGVuZHMgUXVlcnlQcm9taXNlIHtcbiAgY29uc3RydWN0b3IodGFibGUsIHZhbHVlcywgc2Vzc2lvbiwgZGlhbGVjdCwgd2l0aExpc3QsIHNlbGVjdCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuY29uZmlnID0geyB0YWJsZSwgdmFsdWVzLCB3aXRoTGlzdCwgc2VsZWN0IH07XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW5zZXJ0XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uZmlnO1xuICByZXR1cm5pbmcoZmllbGRzID0gdGhpcy5jb25maWcudGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkNvbHVtbnNdKSB7XG4gICAgdGhpcy5jb25maWcucmV0dXJuaW5nID0gb3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGFuIGBvbiBjb25mbGljdCBkbyBub3RoaW5nYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHNpbXBseSBhdm9pZHMgaW5zZXJ0aW5nIGEgcm93IGFzIGl0cyBhbHRlcm5hdGl2ZSBhY3Rpb24uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvaW5zZXJ0I29uLWNvbmZsaWN0LWRvLW5vdGhpbmd9XG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgVGhlIGB0YXJnZXRgIGFuZCBgd2hlcmVgIGNsYXVzZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIC8vIEluc2VydCBvbmUgcm93IGFuZCBjYW5jZWwgdGhlIGluc2VydCBpZiB0aGVyZSdzIGEgY29uZmxpY3RcbiAgICogYXdhaXQgZGIuaW5zZXJ0KGNhcnMpXG4gICAqICAgLnZhbHVlcyh7IGlkOiAxLCBicmFuZDogJ0JNVycgfSlcbiAgICogICAub25Db25mbGljdERvTm90aGluZygpO1xuICAgKlxuICAgKiAvLyBFeHBsaWNpdGx5IHNwZWNpZnkgY29uZmxpY3QgdGFyZ2V0XG4gICAqIGF3YWl0IGRiLmluc2VydChjYXJzKVxuICAgKiAgIC52YWx1ZXMoeyBpZDogMSwgYnJhbmQ6ICdCTVcnIH0pXG4gICAqICAgLm9uQ29uZmxpY3REb05vdGhpbmcoeyB0YXJnZXQ6IGNhcnMuaWQgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgb25Db25mbGljdERvTm90aGluZyhjb25maWcgPSB7fSkge1xuICAgIGlmICghdGhpcy5jb25maWcub25Db25mbGljdCkgdGhpcy5jb25maWcub25Db25mbGljdCA9IFtdO1xuICAgIGlmIChjb25maWcudGFyZ2V0ID09PSB2b2lkIDApIHtcbiAgICAgIHRoaXMuY29uZmlnLm9uQ29uZmxpY3QucHVzaChzcWxgIG9uIGNvbmZsaWN0IGRvIG5vdGhpbmdgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0U3FsID0gQXJyYXkuaXNBcnJheShjb25maWcudGFyZ2V0KSA/IHNxbGAke2NvbmZpZy50YXJnZXR9YCA6IHNxbGAke1tjb25maWcudGFyZ2V0XX1gO1xuICAgICAgY29uc3Qgd2hlcmVTcWwgPSBjb25maWcud2hlcmUgPyBzcWxgIHdoZXJlICR7Y29uZmlnLndoZXJlfWAgOiBzcWxgYDtcbiAgICAgIHRoaXMuY29uZmlnLm9uQ29uZmxpY3QucHVzaChzcWxgIG9uIGNvbmZsaWN0ICR7dGFyZ2V0U3FsfSBkbyBub3RoaW5nJHt3aGVyZVNxbH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYW4gYG9uIGNvbmZsaWN0IGRvIHVwZGF0ZWAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGUgZXhpc3Rpbmcgcm93IHRoYXQgY29uZmxpY3RzIHdpdGggdGhlIHJvdyBwcm9wb3NlZCBmb3IgaW5zZXJ0aW9uIGFzIGl0cyBhbHRlcm5hdGl2ZSBhY3Rpb24uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvaW5zZXJ0I3Vwc2VydHMtYW5kLWNvbmZsaWN0c31cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyBUaGUgYHRhcmdldGAsIGBzZXRgIGFuZCBgd2hlcmVgIGNsYXVzZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIC8vIFVwZGF0ZSB0aGUgcm93IGlmIHRoZXJlJ3MgYSBjb25mbGljdFxuICAgKiBhd2FpdCBkYi5pbnNlcnQoY2FycylcbiAgICogICAudmFsdWVzKHsgaWQ6IDEsIGJyYW5kOiAnQk1XJyB9KVxuICAgKiAgIC5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgKiAgICAgdGFyZ2V0OiBjYXJzLmlkLFxuICAgKiAgICAgc2V0OiB7IGJyYW5kOiAnUG9yc2NoZScgfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiAvLyBVcHNlcnQgd2l0aCAnd2hlcmUnIGNsYXVzZVxuICAgKiBhd2FpdCBkYi5pbnNlcnQoY2FycylcbiAgICogICAudmFsdWVzKHsgaWQ6IDEsIGJyYW5kOiAnQk1XJyB9KVxuICAgKiAgIC5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgKiAgICAgdGFyZ2V0OiBjYXJzLmlkLFxuICAgKiAgICAgc2V0OiB7IGJyYW5kOiAnbmV3Qk1XJyB9LFxuICAgKiAgICAgd2hlcmU6IHNxbGAke2NhcnMuY3JlYXRlZEF0fSA+ICcyMDIzLTAxLTAxJzo6ZGF0ZWAsXG4gICAqICAgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgb25Db25mbGljdERvVXBkYXRlKGNvbmZpZykge1xuICAgIGlmIChjb25maWcud2hlcmUgJiYgKGNvbmZpZy50YXJnZXRXaGVyZSB8fCBjb25maWcuc2V0V2hlcmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdZb3UgY2Fubm90IHVzZSBib3RoIFwid2hlcmVcIiBhbmQgXCJ0YXJnZXRXaGVyZVwiL1wic2V0V2hlcmVcIiBhdCB0aGUgc2FtZSB0aW1lIC0gXCJ3aGVyZVwiIGlzIGRlcHJlY2F0ZWQsIHVzZSBcInRhcmdldFdoZXJlXCIgb3IgXCJzZXRXaGVyZVwiIGluc3RlYWQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5vbkNvbmZsaWN0KSB0aGlzLmNvbmZpZy5vbkNvbmZsaWN0ID0gW107XG4gICAgY29uc3Qgd2hlcmVTcWwgPSBjb25maWcud2hlcmUgPyBzcWxgIHdoZXJlICR7Y29uZmlnLndoZXJlfWAgOiB2b2lkIDA7XG4gICAgY29uc3QgdGFyZ2V0V2hlcmVTcWwgPSBjb25maWcudGFyZ2V0V2hlcmUgPyBzcWxgIHdoZXJlICR7Y29uZmlnLnRhcmdldFdoZXJlfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgc2V0V2hlcmVTcWwgPSBjb25maWcuc2V0V2hlcmUgPyBzcWxgIHdoZXJlICR7Y29uZmlnLnNldFdoZXJlfWAgOiB2b2lkIDA7XG4gICAgY29uc3QgdGFyZ2V0U3FsID0gQXJyYXkuaXNBcnJheShjb25maWcudGFyZ2V0KSA/IHNxbGAke2NvbmZpZy50YXJnZXR9YCA6IHNxbGAke1tjb25maWcudGFyZ2V0XX1gO1xuICAgIGNvbnN0IHNldFNxbCA9IHRoaXMuZGlhbGVjdC5idWlsZFVwZGF0ZVNldCh0aGlzLmNvbmZpZy50YWJsZSwgbWFwVXBkYXRlU2V0KHRoaXMuY29uZmlnLnRhYmxlLCBjb25maWcuc2V0KSk7XG4gICAgdGhpcy5jb25maWcub25Db25mbGljdC5wdXNoKFxuICAgICAgc3FsYCBvbiBjb25mbGljdCAke3RhcmdldFNxbH0ke3RhcmdldFdoZXJlU3FsfSBkbyB1cGRhdGUgc2V0ICR7c2V0U3FsfSR7d2hlcmVTcWx9JHtzZXRXaGVyZVNxbH1gXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsZWN0LmJ1aWxkSW5zZXJ0UXVlcnkodGhpcy5jb25maWcpO1xuICB9XG4gIHRvU1FMKCkge1xuICAgIGNvbnN0IHsgdHlwaW5nczogX3R5cGluZ3MsIC4uLnJlc3QgfSA9IHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpO1xuICAgIHJldHVybiByZXN0O1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ByZXBhcmUoaXNPbmVUaW1lUXVlcnkgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbltpc09uZVRpbWVRdWVyeSA/IFwicHJlcGFyZU9uZVRpbWVRdWVyeVwiIDogXCJwcmVwYXJlUXVlcnlcIl0oXG4gICAgICB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKSxcbiAgICAgIHRoaXMuY29uZmlnLnJldHVybmluZyxcbiAgICAgIHRoaXMuY29uZmlnLnJldHVybmluZyA/IFwiYWxsXCIgOiBcInJ1blwiLFxuICAgICAgdHJ1ZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJpbnNlcnRcIixcbiAgICAgICAgdGFibGVzOiBleHRyYWN0VXNlZFRhYmxlKHRoaXMuY29uZmlnLnRhYmxlKVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJlcGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSk7XG4gIH1cbiAgcnVuID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5ydW4ocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhbGwgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmFsbChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGdldCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuZ2V0KHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgdmFsdWVzID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS52YWx1ZXMocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPyB0aGlzLmFsbCgpIDogdGhpcy5ydW4oKTtcbiAgfVxuICAkZHluYW1pYygpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuZXhwb3J0IHtcbiAgU1FMaXRlSW5zZXJ0QmFzZSxcbiAgU1FMaXRlSW5zZXJ0QnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluc2VydC5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmltcG9ydCB7IFNlbGVjdGlvblByb3h5SGFuZGxlciB9IGZyb20gXCIuLi8uLi9zZWxlY3Rpb24tcHJveHkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBTdWJxdWVyeSB9IGZyb20gXCIuLi8uLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUuanNcIjtcbmltcG9ydCB7XG4gIGdldFRhYmxlTGlrZU5hbWUsXG4gIG1hcFVwZGF0ZVNldCxcbiAgb3JkZXJTZWxlY3RlZEZpZWxkc1xufSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3ZpZXctY29tbW9uLmpzXCI7XG5pbXBvcnQgeyBleHRyYWN0VXNlZFRhYmxlIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVWaWV3QmFzZSB9IGZyb20gXCIuLi92aWV3LWJhc2UuanNcIjtcbmNsYXNzIFNRTGl0ZVVwZGF0ZUJ1aWxkZXIge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgc2Vzc2lvbiwgZGlhbGVjdCwgd2l0aExpc3QpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMud2l0aExpc3QgPSB3aXRoTGlzdDtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVVcGRhdGVCdWlsZGVyXCI7XG4gIHNldCh2YWx1ZXMpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVVwZGF0ZUJhc2UoXG4gICAgICB0aGlzLnRhYmxlLFxuICAgICAgbWFwVXBkYXRlU2V0KHRoaXMudGFibGUsIHZhbHVlcyksXG4gICAgICB0aGlzLnNlc3Npb24sXG4gICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICB0aGlzLndpdGhMaXN0XG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlVXBkYXRlQmFzZSBleHRlbmRzIFF1ZXJ5UHJvbWlzZSB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBzZXQsIHNlc3Npb24sIGRpYWxlY3QsIHdpdGhMaXN0KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5jb25maWcgPSB7IHNldCwgdGFibGUsIHdpdGhMaXN0LCBqb2luczogW10gfTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVVcGRhdGVcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25maWc7XG4gIGZyb20oc291cmNlKSB7XG4gICAgdGhpcy5jb25maWcuZnJvbSA9IHNvdXJjZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBjcmVhdGVKb2luKGpvaW5UeXBlKSB7XG4gICAgcmV0dXJuICh0YWJsZSwgb24pID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGdldFRhYmxlTGlrZU5hbWUodGFibGUpO1xuICAgICAgaWYgKHR5cGVvZiB0YWJsZU5hbWUgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5jb25maWcuam9pbnMuc29tZSgoam9pbikgPT4gam9pbi5hbGlhcyA9PT0gdGFibGVOYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFsaWFzIFwiJHt0YWJsZU5hbWV9XCIgaXMgYWxyZWFkeSB1c2VkIGluIHRoaXMgcXVlcnlgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25zdCBmcm9tID0gdGhpcy5jb25maWcuZnJvbSA/IGlzKHRhYmxlLCBTUUxpdGVUYWJsZSkgPyB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10gOiBpcyh0YWJsZSwgU3VicXVlcnkpID8gdGFibGUuXy5zZWxlY3RlZEZpZWxkcyA6IGlzKHRhYmxlLCBTUUxpdGVWaWV3QmFzZSkgPyB0YWJsZVtWaWV3QmFzZUNvbmZpZ10uc2VsZWN0ZWRGaWVsZHMgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICAgIG9uID0gb24oXG4gICAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgICAgdGhpcy5jb25maWcudGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdLFxuICAgICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJzcWxcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgICApLFxuICAgICAgICAgIGZyb20gJiYgbmV3IFByb3h5KFxuICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwic3FsXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25maWcuam9pbnMucHVzaCh7IG9uLCB0YWJsZSwgam9pblR5cGUsIGFsaWFzOiB0YWJsZU5hbWUgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9XG4gIGxlZnRKb2luID0gdGhpcy5jcmVhdGVKb2luKFwibGVmdFwiKTtcbiAgcmlnaHRKb2luID0gdGhpcy5jcmVhdGVKb2luKFwicmlnaHRcIik7XG4gIGlubmVySm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImlubmVyXCIpO1xuICBmdWxsSm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImZ1bGxcIik7XG4gIC8qKlxuICAgKiBBZGRzIGEgJ3doZXJlJyBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIG9ubHkgdGhvc2Ugcm93cyB0aGF0IGZ1bGZpbGwgYSBzcGVjaWZpZWQgY29uZGl0aW9uLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3VwZGF0ZX1cbiAgICpcbiAgICogQHBhcmFtIHdoZXJlIHRoZSAnd2hlcmUnIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogWW91IGNhbiB1c2UgY29uZGl0aW9uYWwgb3BlcmF0b3JzIGFuZCBgc3FsIGZ1bmN0aW9uYCB0byBmaWx0ZXIgdGhlIHJvd3MgdG8gYmUgdXBkYXRlZC5cbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gVXBkYXRlIGFsbCBjYXJzIHdpdGggZ3JlZW4gY29sb3JcbiAgICogZGIudXBkYXRlKGNhcnMpLnNldCh7IGNvbG9yOiAncmVkJyB9KVxuICAgKiAgIC53aGVyZShlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSk7XG4gICAqIC8vIG9yXG4gICAqIGRiLnVwZGF0ZShjYXJzKS5zZXQoeyBjb2xvcjogJ3JlZCcgfSlcbiAgICogICAud2hlcmUoc3FsYCR7Y2Fycy5jb2xvcn0gPSAnZ3JlZW4nYClcbiAgICogYGBgXG4gICAqXG4gICAqIFlvdSBjYW4gbG9naWNhbGx5IGNvbWJpbmUgY29uZGl0aW9uYWwgb3BlcmF0b3JzIHdpdGggYGFuZCgpYCBhbmQgYG9yKClgIG9wZXJhdG9yczpcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gVXBkYXRlIGFsbCBCTVcgY2FycyB3aXRoIGEgZ3JlZW4gY29sb3JcbiAgICogZGIudXBkYXRlKGNhcnMpLnNldCh7IGNvbG9yOiAncmVkJyB9KVxuICAgKiAgIC53aGVyZShhbmQoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJyksIGVxKGNhcnMuYnJhbmQsICdCTVcnKSkpO1xuICAgKlxuICAgKiAvLyBVcGRhdGUgYWxsIGNhcnMgd2l0aCB0aGUgZ3JlZW4gb3IgYmx1ZSBjb2xvclxuICAgKiBkYi51cGRhdGUoY2Fycykuc2V0KHsgY29sb3I6ICdyZWQnIH0pXG4gICAqICAgLndoZXJlKG9yKGVxKGNhcnMuY29sb3IsICdncmVlbicpLCBlcShjYXJzLmNvbG9yLCAnYmx1ZScpKSk7XG4gICAqIGBgYFxuICAgKi9cbiAgd2hlcmUod2hlcmUpIHtcbiAgICB0aGlzLmNvbmZpZy53aGVyZSA9IHdoZXJlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9yZGVyQnkoLi4uY29sdW1ucykge1xuICAgIGlmICh0eXBlb2YgY29sdW1uc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmRlckJ5ID0gY29sdW1uc1swXShcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLnRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCBvcmRlckJ5QXJyYXkgPSBBcnJheS5pc0FycmF5KG9yZGVyQnkpID8gb3JkZXJCeSA6IFtvcmRlckJ5XTtcbiAgICAgIHRoaXMuY29uZmlnLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9yZGVyQnlBcnJheSA9IGNvbHVtbnM7XG4gICAgICB0aGlzLmNvbmZpZy5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBsaW1pdChsaW1pdCkge1xuICAgIHRoaXMuY29uZmlnLmxpbWl0ID0gbGltaXQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgcmV0dXJuaW5nKGZpZWxkcyA9IHRoaXMuY29uZmlnLnRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5Db2x1bW5zXSkge1xuICAgIHRoaXMuY29uZmlnLnJldHVybmluZyA9IG9yZGVyU2VsZWN0ZWRGaWVsZHMoZmllbGRzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsZWN0LmJ1aWxkVXBkYXRlUXVlcnkodGhpcy5jb25maWcpO1xuICB9XG4gIHRvU1FMKCkge1xuICAgIGNvbnN0IHsgdHlwaW5nczogX3R5cGluZ3MsIC4uLnJlc3QgfSA9IHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpO1xuICAgIHJldHVybiByZXN0O1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ByZXBhcmUoaXNPbmVUaW1lUXVlcnkgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbltpc09uZVRpbWVRdWVyeSA/IFwicHJlcGFyZU9uZVRpbWVRdWVyeVwiIDogXCJwcmVwYXJlUXVlcnlcIl0oXG4gICAgICB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKSxcbiAgICAgIHRoaXMuY29uZmlnLnJldHVybmluZyxcbiAgICAgIHRoaXMuY29uZmlnLnJldHVybmluZyA/IFwiYWxsXCIgOiBcInJ1blwiLFxuICAgICAgdHJ1ZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJpbnNlcnRcIixcbiAgICAgICAgdGFibGVzOiBleHRyYWN0VXNlZFRhYmxlKHRoaXMuY29uZmlnLnRhYmxlKVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJlcGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSk7XG4gIH1cbiAgcnVuID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5ydW4ocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhbGwgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmFsbChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGdldCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuZ2V0KHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgdmFsdWVzID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS52YWx1ZXMocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPyB0aGlzLmFsbCgpIDogdGhpcy5ydW4oKTtcbiAgfVxuICAkZHluYW1pYygpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuZXhwb3J0IHtcbiAgU1FMaXRlVXBkYXRlQmFzZSxcbiAgU1FMaXRlVXBkYXRlQnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVwZGF0ZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTUUwsIHNxbCB9IGZyb20gXCIuLi8uLi9zcWwvc3FsLmpzXCI7XG5jbGFzcyBTUUxpdGVDb3VudEJ1aWxkZXIgZXh0ZW5kcyBTUUwge1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcihTUUxpdGVDb3VudEJ1aWxkZXIuYnVpbGRFbWJlZGRlZENvdW50KHBhcmFtcy5zb3VyY2UsIHBhcmFtcy5maWx0ZXJzKS5xdWVyeUNodW5rcyk7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5zZXNzaW9uID0gcGFyYW1zLnNlc3Npb247XG4gICAgdGhpcy5zcWwgPSBTUUxpdGVDb3VudEJ1aWxkZXIuYnVpbGRDb3VudChcbiAgICAgIHBhcmFtcy5zb3VyY2UsXG4gICAgICBwYXJhbXMuZmlsdGVyc1xuICAgICk7XG4gIH1cbiAgc3FsO1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVDb3VudEJ1aWxkZXJBc3luY1wiO1xuICBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9IFwiU1FMaXRlQ291bnRCdWlsZGVyQXN5bmNcIjtcbiAgc2Vzc2lvbjtcbiAgc3RhdGljIGJ1aWxkRW1iZWRkZWRDb3VudChzb3VyY2UsIGZpbHRlcnMpIHtcbiAgICByZXR1cm4gc3FsYChzZWxlY3QgY291bnQoKikgZnJvbSAke3NvdXJjZX0ke3NxbC5yYXcoXCIgd2hlcmUgXCIpLmlmKGZpbHRlcnMpfSR7ZmlsdGVyc30pYDtcbiAgfVxuICBzdGF0aWMgYnVpbGRDb3VudChzb3VyY2UsIGZpbHRlcnMpIHtcbiAgICByZXR1cm4gc3FsYHNlbGVjdCBjb3VudCgqKSBmcm9tICR7c291cmNlfSR7c3FsLnJhdyhcIiB3aGVyZSBcIikuaWYoZmlsdGVycyl9JHtmaWx0ZXJzfWA7XG4gIH1cbiAgdGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5zZXNzaW9uLmNvdW50KHRoaXMuc3FsKSkudGhlbihcbiAgICAgIG9uZnVsZmlsbGVkLFxuICAgICAgb25yZWplY3RlZFxuICAgICk7XG4gIH1cbiAgY2F0Y2gob25SZWplY3RlZCkge1xuICAgIHJldHVybiB0aGlzLnRoZW4odm9pZCAwLCBvblJlamVjdGVkKTtcbiAgfVxuICBmaW5hbGx5KG9uRmluYWxseSkge1xuICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgb25GaW5hbGx5Py4oKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSxcbiAgICAgIChyZWFzb24pID0+IHtcbiAgICAgICAgb25GaW5hbGx5Py4oKTtcbiAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZUNvdW50QnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvdW50LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi8uLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5pbXBvcnQge1xuICBtYXBSZWxhdGlvbmFsUm93XG59IGZyb20gXCIuLi8uLi9yZWxhdGlvbnMuanNcIjtcbmNsYXNzIFJlbGF0aW9uYWxRdWVyeUJ1aWxkZXIge1xuICBjb25zdHJ1Y3Rvcihtb2RlLCBmdWxsU2NoZW1hLCBzY2hlbWEsIHRhYmxlTmFtZXNNYXAsIHRhYmxlLCB0YWJsZUNvbmZpZywgZGlhbGVjdCwgc2Vzc2lvbikge1xuICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgdGhpcy5mdWxsU2NoZW1hID0gZnVsbFNjaGVtYTtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLnRhYmxlTmFtZXNNYXAgPSB0YWJsZU5hbWVzTWFwO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnRhYmxlQ29uZmlnID0gdGFibGVDb25maWc7XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUFzeW5jUmVsYXRpb25hbFF1ZXJ5QnVpbGRlclwiO1xuICBmaW5kTWFueShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBcInN5bmNcIiA/IG5ldyBTUUxpdGVTeW5jUmVsYXRpb25hbFF1ZXJ5KFxuICAgICAgdGhpcy5mdWxsU2NoZW1hLFxuICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0aGlzLnRhYmxlLFxuICAgICAgdGhpcy50YWJsZUNvbmZpZyxcbiAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgIHRoaXMuc2Vzc2lvbixcbiAgICAgIGNvbmZpZyA/IGNvbmZpZyA6IHt9LFxuICAgICAgXCJtYW55XCJcbiAgICApIDogbmV3IFNRTGl0ZVJlbGF0aW9uYWxRdWVyeShcbiAgICAgIHRoaXMuZnVsbFNjaGVtYSxcbiAgICAgIHRoaXMuc2NoZW1hLFxuICAgICAgdGhpcy50YWJsZU5hbWVzTWFwLFxuICAgICAgdGhpcy50YWJsZSxcbiAgICAgIHRoaXMudGFibGVDb25maWcsXG4gICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICB0aGlzLnNlc3Npb24sXG4gICAgICBjb25maWcgPyBjb25maWcgOiB7fSxcbiAgICAgIFwibWFueVwiXG4gICAgKTtcbiAgfVxuICBmaW5kRmlyc3QoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gXCJzeW5jXCIgPyBuZXcgU1FMaXRlU3luY1JlbGF0aW9uYWxRdWVyeShcbiAgICAgIHRoaXMuZnVsbFNjaGVtYSxcbiAgICAgIHRoaXMuc2NoZW1hLFxuICAgICAgdGhpcy50YWJsZU5hbWVzTWFwLFxuICAgICAgdGhpcy50YWJsZSxcbiAgICAgIHRoaXMudGFibGVDb25maWcsXG4gICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICB0aGlzLnNlc3Npb24sXG4gICAgICBjb25maWcgPyB7IC4uLmNvbmZpZywgbGltaXQ6IDEgfSA6IHsgbGltaXQ6IDEgfSxcbiAgICAgIFwiZmlyc3RcIlxuICAgICkgOiBuZXcgU1FMaXRlUmVsYXRpb25hbFF1ZXJ5KFxuICAgICAgdGhpcy5mdWxsU2NoZW1hLFxuICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0aGlzLnRhYmxlLFxuICAgICAgdGhpcy50YWJsZUNvbmZpZyxcbiAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgIHRoaXMuc2Vzc2lvbixcbiAgICAgIGNvbmZpZyA/IHsgLi4uY29uZmlnLCBsaW1pdDogMSB9IDogeyBsaW1pdDogMSB9LFxuICAgICAgXCJmaXJzdFwiXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlUmVsYXRpb25hbFF1ZXJ5IGV4dGVuZHMgUXVlcnlQcm9taXNlIHtcbiAgY29uc3RydWN0b3IoZnVsbFNjaGVtYSwgc2NoZW1hLCB0YWJsZU5hbWVzTWFwLCB0YWJsZSwgdGFibGVDb25maWcsIGRpYWxlY3QsIHNlc3Npb24sIGNvbmZpZywgbW9kZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5mdWxsU2NoZW1hID0gZnVsbFNjaGVtYTtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLnRhYmxlTmFtZXNNYXAgPSB0YWJsZU5hbWVzTWFwO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnRhYmxlQ29uZmlnID0gdGFibGVDb25maWc7XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQXN5bmNSZWxhdGlvbmFsUXVlcnlcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBtb2RlO1xuICAvKiogQGludGVybmFsICovXG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsZWN0LmJ1aWxkUmVsYXRpb25hbFF1ZXJ5KHtcbiAgICAgIGZ1bGxTY2hlbWE6IHRoaXMuZnVsbFNjaGVtYSxcbiAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICB0YWJsZU5hbWVzTWFwOiB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0YWJsZTogdGhpcy50YWJsZSxcbiAgICAgIHRhYmxlQ29uZmlnOiB0aGlzLnRhYmxlQ29uZmlnLFxuICAgICAgcXVlcnlDb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgdGFibGVBbGlhczogdGhpcy50YWJsZUNvbmZpZy50c05hbWVcbiAgICB9KS5zcWw7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJlcGFyZShpc09uZVRpbWVRdWVyeSA9IGZhbHNlKSB7XG4gICAgY29uc3QgeyBxdWVyeSwgYnVpbHRRdWVyeSB9ID0gdGhpcy5fdG9TUUwoKTtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uW2lzT25lVGltZVF1ZXJ5ID8gXCJwcmVwYXJlT25lVGltZVF1ZXJ5XCIgOiBcInByZXBhcmVRdWVyeVwiXShcbiAgICAgIGJ1aWx0UXVlcnksXG4gICAgICB2b2lkIDAsXG4gICAgICB0aGlzLm1vZGUgPT09IFwiZmlyc3RcIiA/IFwiZ2V0XCIgOiBcImFsbFwiLFxuICAgICAgdHJ1ZSxcbiAgICAgIChyYXdSb3dzLCBtYXBDb2x1bW5WYWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCByb3dzID0gcmF3Um93cy5tYXAoXG4gICAgICAgICAgKHJvdykgPT4gbWFwUmVsYXRpb25hbFJvdyh0aGlzLnNjaGVtYSwgdGhpcy50YWJsZUNvbmZpZywgcm93LCBxdWVyeS5zZWxlY3Rpb24sIG1hcENvbHVtblZhbHVlKVxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5tb2RlID09PSBcImZpcnN0XCIpIHtcbiAgICAgICAgICByZXR1cm4gcm93c1swXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93cztcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByZXBhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpO1xuICB9XG4gIF90b1NRTCgpIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuZGlhbGVjdC5idWlsZFJlbGF0aW9uYWxRdWVyeSh7XG4gICAgICBmdWxsU2NoZW1hOiB0aGlzLmZ1bGxTY2hlbWEsXG4gICAgICBzY2hlbWE6IHRoaXMuc2NoZW1hLFxuICAgICAgdGFibGVOYW1lc01hcDogdGhpcy50YWJsZU5hbWVzTWFwLFxuICAgICAgdGFibGU6IHRoaXMudGFibGUsXG4gICAgICB0YWJsZUNvbmZpZzogdGhpcy50YWJsZUNvbmZpZyxcbiAgICAgIHF1ZXJ5Q29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIHRhYmxlQWxpYXM6IHRoaXMudGFibGVDb25maWcudHNOYW1lXG4gICAgfSk7XG4gICAgY29uc3QgYnVpbHRRdWVyeSA9IHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHF1ZXJ5LnNxbCk7XG4gICAgcmV0dXJuIHsgcXVlcnksIGJ1aWx0UXVlcnkgfTtcbiAgfVxuICB0b1NRTCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdG9TUUwoKS5idWlsdFF1ZXJ5O1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZXhlY3V0ZVJhdygpIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSBcImZpcnN0XCIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKS5nZXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpLmFsbCgpO1xuICB9XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJhdygpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVTeW5jUmVsYXRpb25hbFF1ZXJ5IGV4dGVuZHMgU1FMaXRlUmVsYXRpb25hbFF1ZXJ5IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlU3luY1JlbGF0aW9uYWxRdWVyeVwiO1xuICBzeW5jKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVSYXcoKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgUmVsYXRpb25hbFF1ZXJ5QnVpbGRlcixcbiAgU1FMaXRlUmVsYXRpb25hbFF1ZXJ5LFxuICBTUUxpdGVTeW5jUmVsYXRpb25hbFF1ZXJ5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnkuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmNsYXNzIFNRTGl0ZVJhdyBleHRlbmRzIFF1ZXJ5UHJvbWlzZSB7XG4gIGNvbnN0cnVjdG9yKGV4ZWN1dGUsIGdldFNRTCwgYWN0aW9uLCBkaWFsZWN0LCBtYXBCYXRjaFJlc3VsdCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5leGVjdXRlID0gZXhlY3V0ZTtcbiAgICB0aGlzLmdldFNRTCA9IGdldFNRTDtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMubWFwQmF0Y2hSZXN1bHQgPSBtYXBCYXRjaFJlc3VsdDtcbiAgICB0aGlzLmNvbmZpZyA9IHsgYWN0aW9uIH07XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlUmF3XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uZmlnO1xuICBnZXRRdWVyeSgpIHtcbiAgICByZXR1cm4geyAuLi50aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKSwgbWV0aG9kOiB0aGlzLmNvbmZpZy5hY3Rpb24gfTtcbiAgfVxuICBtYXBSZXN1bHQocmVzdWx0LCBpc0Zyb21CYXRjaCkge1xuICAgIHJldHVybiBpc0Zyb21CYXRjaCA/IHRoaXMubWFwQmF0Y2hSZXN1bHQocmVzdWx0KSA6IHJlc3VsdDtcbiAgfVxuICBfcHJlcGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGlzUmVzcG9uc2VJbkFycmF5TW9kZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZVJhd1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJhdy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIgfSBmcm9tIFwiLi4vc2VsZWN0aW9uLXByb3h5LmpzXCI7XG5pbXBvcnQgeyBzcWwgfSBmcm9tIFwiLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHtcbiAgUXVlcnlCdWlsZGVyLFxuICBTUUxpdGVEZWxldGVCYXNlLFxuICBTUUxpdGVJbnNlcnRCdWlsZGVyLFxuICBTUUxpdGVTZWxlY3RCdWlsZGVyLFxuICBTUUxpdGVVcGRhdGVCdWlsZGVyXG59IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXJzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBXaXRoU3VicXVlcnkgfSBmcm9tIFwiLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvdW50QnVpbGRlciB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXJzL2NvdW50LmpzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbmFsUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlcnMvcXVlcnkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVJhdyB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXJzL3Jhdy5qc1wiO1xuY2xhc3MgQmFzZVNRTGl0ZURhdGFiYXNlIHtcbiAgY29uc3RydWN0b3IocmVzdWx0S2luZCwgZGlhbGVjdCwgc2Vzc2lvbiwgc2NoZW1hKSB7XG4gICAgdGhpcy5yZXN1bHRLaW5kID0gcmVzdWx0S2luZDtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5fID0gc2NoZW1hID8ge1xuICAgICAgc2NoZW1hOiBzY2hlbWEuc2NoZW1hLFxuICAgICAgZnVsbFNjaGVtYTogc2NoZW1hLmZ1bGxTY2hlbWEsXG4gICAgICB0YWJsZU5hbWVzTWFwOiBzY2hlbWEudGFibGVOYW1lc01hcFxuICAgIH0gOiB7XG4gICAgICBzY2hlbWE6IHZvaWQgMCxcbiAgICAgIGZ1bGxTY2hlbWE6IHt9LFxuICAgICAgdGFibGVOYW1lc01hcDoge31cbiAgICB9O1xuICAgIHRoaXMucXVlcnkgPSB7fTtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMucXVlcnk7XG4gICAgaWYgKHRoaXMuXy5zY2hlbWEpIHtcbiAgICAgIGZvciAoY29uc3QgW3RhYmxlTmFtZSwgY29sdW1uc10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fLnNjaGVtYSkpIHtcbiAgICAgICAgcXVlcnlbdGFibGVOYW1lXSA9IG5ldyBSZWxhdGlvbmFsUXVlcnlCdWlsZGVyKFxuICAgICAgICAgIHJlc3VsdEtpbmQsXG4gICAgICAgICAgc2NoZW1hLmZ1bGxTY2hlbWEsXG4gICAgICAgICAgdGhpcy5fLnNjaGVtYSxcbiAgICAgICAgICB0aGlzLl8udGFibGVOYW1lc01hcCxcbiAgICAgICAgICBzY2hlbWEuZnVsbFNjaGVtYVt0YWJsZU5hbWVdLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgZGlhbGVjdCxcbiAgICAgICAgICBzZXNzaW9uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuJGNhY2hlID0geyBpbnZhbGlkYXRlOiBhc3luYyAoX3BhcmFtcykgPT4ge1xuICAgIH0gfTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJCYXNlU1FMaXRlRGF0YWJhc2VcIjtcbiAgcXVlcnk7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc3VicXVlcnkgdGhhdCBkZWZpbmVzIGEgdGVtcG9yYXJ5IG5hbWVkIHJlc3VsdCBzZXQgYXMgYSBDVEUuXG4gICAqXG4gICAqIEl0IGlzIHVzZWZ1bCBmb3IgYnJlYWtpbmcgZG93biBjb21wbGV4IHF1ZXJpZXMgaW50byBzaW1wbGVyIHBhcnRzIGFuZCBmb3IgcmV1c2luZyB0aGUgcmVzdWx0IHNldCBpbiBzdWJzZXF1ZW50IHBhcnRzIG9mIHRoZSBxdWVyeS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZWxlY3Qjd2l0aC1jbGF1c2V9XG4gICAqXG4gICAqIEBwYXJhbSBhbGlhcyBUaGUgYWxpYXMgZm9yIHRoZSBzdWJxdWVyeS5cbiAgICpcbiAgICogRmFpbHVyZSB0byBwcm92aWRlIGFuIGFsaWFzIHdpbGwgcmVzdWx0IGluIGEgRHJpenpsZVR5cGVFcnJvciwgcHJldmVudGluZyB0aGUgc3VicXVlcnkgZnJvbSBiZWluZyByZWZlcmVuY2VkIGluIG90aGVyIHF1ZXJpZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIENyZWF0ZSBhIHN1YnF1ZXJ5IHdpdGggYWxpYXMgJ3NxJyBhbmQgdXNlIGl0IGluIHRoZSBzZWxlY3QgcXVlcnlcbiAgICogY29uc3Qgc3EgPSBkYi4kd2l0aCgnc3EnKS5hcyhkYi5zZWxlY3QoKS5mcm9tKHVzZXJzKS53aGVyZShlcSh1c2Vycy5pZCwgNDIpKSk7XG4gICAqXG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLndpdGgoc3EpLnNlbGVjdCgpLmZyb20oc3EpO1xuICAgKiBgYGBcbiAgICpcbiAgICogVG8gc2VsZWN0IGFyYml0cmFyeSBTUUwgdmFsdWVzIGFzIGZpZWxkcyBpbiBhIENURSBhbmQgcmVmZXJlbmNlIHRoZW0gaW4gb3RoZXIgQ1RFcyBvciBpbiB0aGUgbWFpbiBxdWVyeSwgeW91IG5lZWQgdG8gYWRkIGFsaWFzZXMgdG8gdGhlbTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFuIGFyYml0cmFyeSBTUUwgdmFsdWUgYXMgYSBmaWVsZCBpbiBhIENURSBhbmQgcmVmZXJlbmNlIGl0IGluIHRoZSBtYWluIHF1ZXJ5XG4gICAqIGNvbnN0IHNxID0gZGIuJHdpdGgoJ3NxJykuYXMoZGIuc2VsZWN0KHtcbiAgICogICBuYW1lOiBzcWw8c3RyaW5nPmB1cHBlcigke3VzZXJzLm5hbWV9KWAuYXMoJ25hbWUnKSxcbiAgICogfSlcbiAgICogLmZyb20odXNlcnMpKTtcbiAgICpcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIud2l0aChzcSkuc2VsZWN0KHsgbmFtZTogc3EubmFtZSB9KS5mcm9tKHNxKTtcbiAgICogYGBgXG4gICAqL1xuICAkd2l0aCA9IChhbGlhcywgc2VsZWN0aW9uKSA9PiB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgYXMgPSAocWIpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcWIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBxYiA9IHFiKG5ldyBRdWVyeUJ1aWxkZXIoc2VsZi5kaWFsZWN0KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFByb3h5KFxuICAgICAgICBuZXcgV2l0aFN1YnF1ZXJ5KFxuICAgICAgICAgIHFiLmdldFNRTCgpLFxuICAgICAgICAgIHNlbGVjdGlvbiA/PyAoXCJnZXRTZWxlY3RlZEZpZWxkc1wiIGluIHFiID8gcWIuZ2V0U2VsZWN0ZWRGaWVsZHMoKSA/PyB7fSA6IHt9KSxcbiAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICksXG4gICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBhbGlhcywgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcImVycm9yXCIgfSlcbiAgICAgICk7XG4gICAgfTtcbiAgICByZXR1cm4geyBhcyB9O1xuICB9O1xuICAkY291bnQoc291cmNlLCBmaWx0ZXJzKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVDb3VudEJ1aWxkZXIoeyBzb3VyY2UsIGZpbHRlcnMsIHNlc3Npb246IHRoaXMuc2Vzc2lvbiB9KTtcbiAgfVxuICAvKipcbiAgICogSW5jb3Jwb3JhdGVzIGEgcHJldmlvdXNseSBkZWZpbmVkIENURSAodXNpbmcgYCR3aXRoYCkgaW50byB0aGUgbWFpbiBxdWVyeS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgYWxsb3dzIHRoZSBtYWluIHF1ZXJ5IHRvIHJlZmVyZW5jZSBhIHRlbXBvcmFyeSBuYW1lZCByZXN1bHQgc2V0LlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NlbGVjdCN3aXRoLWNsYXVzZX1cbiAgICpcbiAgICogQHBhcmFtIHF1ZXJpZXMgVGhlIENURXMgdG8gaW5jb3Jwb3JhdGUgaW50byB0aGUgbWFpbiBxdWVyeS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gRGVmaW5lIGEgc3VicXVlcnkgJ3NxJyBhcyBhIENURSB1c2luZyAkd2l0aFxuICAgKiBjb25zdCBzcSA9IGRiLiR3aXRoKCdzcScpLmFzKGRiLnNlbGVjdCgpLmZyb20odXNlcnMpLndoZXJlKGVxKHVzZXJzLmlkLCA0MikpKTtcbiAgICpcbiAgICogLy8gSW5jb3Jwb3JhdGUgdGhlIENURSAnc3EnIGludG8gdGhlIG1haW4gcXVlcnkgYW5kIHNlbGVjdCBmcm9tIGl0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLndpdGgoc3EpLnNlbGVjdCgpLmZyb20oc3EpO1xuICAgKiBgYGBcbiAgICovXG4gIHdpdGgoLi4ucXVlcmllcykge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGZ1bmN0aW9uIHNlbGVjdChmaWVsZHMpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7XG4gICAgICAgIGZpZWxkczogZmllbGRzID8/IHZvaWQgMCxcbiAgICAgICAgc2Vzc2lvbjogc2VsZi5zZXNzaW9uLFxuICAgICAgICBkaWFsZWN0OiBzZWxmLmRpYWxlY3QsXG4gICAgICAgIHdpdGhMaXN0OiBxdWVyaWVzXG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2VsZWN0RGlzdGluY3QoZmllbGRzKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoe1xuICAgICAgICBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsXG4gICAgICAgIHNlc3Npb246IHNlbGYuc2Vzc2lvbixcbiAgICAgICAgZGlhbGVjdDogc2VsZi5kaWFsZWN0LFxuICAgICAgICB3aXRoTGlzdDogcXVlcmllcyxcbiAgICAgICAgZGlzdGluY3Q6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGUodGFibGUpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlVXBkYXRlQnVpbGRlcih0YWJsZSwgc2VsZi5zZXNzaW9uLCBzZWxmLmRpYWxlY3QsIHF1ZXJpZXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbnNlcnQoaW50bykge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVJbnNlcnRCdWlsZGVyKGludG8sIHNlbGYuc2Vzc2lvbiwgc2VsZi5kaWFsZWN0LCBxdWVyaWVzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVsZXRlXyhmcm9tKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZURlbGV0ZUJhc2UoZnJvbSwgc2VsZi5zZXNzaW9uLCBzZWxmLmRpYWxlY3QsIHF1ZXJpZXMpO1xuICAgIH1cbiAgICByZXR1cm4geyBzZWxlY3QsIHNlbGVjdERpc3RpbmN0LCB1cGRhdGUsIGluc2VydCwgZGVsZXRlOiBkZWxldGVfIH07XG4gIH1cbiAgc2VsZWN0KGZpZWxkcykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7IGZpZWxkczogZmllbGRzID8/IHZvaWQgMCwgc2Vzc2lvbjogdGhpcy5zZXNzaW9uLCBkaWFsZWN0OiB0aGlzLmRpYWxlY3QgfSk7XG4gIH1cbiAgc2VsZWN0RGlzdGluY3QoZmllbGRzKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHtcbiAgICAgIGZpZWxkczogZmllbGRzID8/IHZvaWQgMCxcbiAgICAgIHNlc3Npb246IHRoaXMuc2Vzc2lvbixcbiAgICAgIGRpYWxlY3Q6IHRoaXMuZGlhbGVjdCxcbiAgICAgIGRpc3RpbmN0OiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gdXBkYXRlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGhvdXQgYC53aGVyZSgpYCBjbGF1c2Ugd2lsbCB1cGRhdGUgYWxsIHJvd3MgaW4gYSB0YWJsZS4gVGhlIGAud2hlcmUoKWAgY2xhdXNlIHNwZWNpZmllcyB3aGljaCByb3dzIHNob3VsZCBiZSB1cGRhdGVkLlxuICAgKlxuICAgKiBVc2UgYC5zZXQoKWAgbWV0aG9kIHRvIHNwZWNpZnkgd2hpY2ggdmFsdWVzIHRvIHVwZGF0ZS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy91cGRhdGV9XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgdG8gdXBkYXRlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBVcGRhdGUgYWxsIHJvd3MgaW4gdGhlICdjYXJzJyB0YWJsZVxuICAgKiBhd2FpdCBkYi51cGRhdGUoY2Fycykuc2V0KHsgY29sb3I6ICdyZWQnIH0pO1xuICAgKlxuICAgKiAvLyBVcGRhdGUgcm93cyB3aXRoIGZpbHRlcnMgYW5kIGNvbmRpdGlvbnNcbiAgICogYXdhaXQgZGIudXBkYXRlKGNhcnMpLnNldCh7IGNvbG9yOiAncmVkJyB9KS53aGVyZShlcShjYXJzLmJyYW5kLCAnQk1XJykpO1xuICAgKlxuICAgKiAvLyBVcGRhdGUgd2l0aCByZXR1cm5pbmcgY2xhdXNlXG4gICAqIGNvbnN0IHVwZGF0ZWRDYXI6IENhcltdID0gYXdhaXQgZGIudXBkYXRlKGNhcnMpXG4gICAqICAgLnNldCh7IGNvbG9yOiAncmVkJyB9KVxuICAgKiAgIC53aGVyZShlcShjYXJzLmlkLCAxKSlcbiAgICogICAucmV0dXJuaW5nKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgdXBkYXRlKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVVcGRhdGVCdWlsZGVyKHRhYmxlLCB0aGlzLnNlc3Npb24sIHRoaXMuZGlhbGVjdCk7XG4gIH1cbiAgJGNhY2hlO1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnNlcnQgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgbmV3IHJvd3MgaW4gYSB0YWJsZS4gVXNlIGAudmFsdWVzKClgIG1ldGhvZCB0byBzcGVjaWZ5IHdoaWNoIHZhbHVlcyB0byBpbnNlcnQuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvaW5zZXJ0fVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHRvIGluc2VydCBpbnRvLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBJbnNlcnQgb25lIHJvd1xuICAgKiBhd2FpdCBkYi5pbnNlcnQoY2FycykudmFsdWVzKHsgYnJhbmQ6ICdCTVcnIH0pO1xuICAgKlxuICAgKiAvLyBJbnNlcnQgbXVsdGlwbGUgcm93c1xuICAgKiBhd2FpdCBkYi5pbnNlcnQoY2FycykudmFsdWVzKFt7IGJyYW5kOiAnQk1XJyB9LCB7IGJyYW5kOiAnUG9yc2NoZScgfV0pO1xuICAgKlxuICAgKiAvLyBJbnNlcnQgd2l0aCByZXR1cm5pbmcgY2xhdXNlXG4gICAqIGNvbnN0IGluc2VydGVkQ2FyOiBDYXJbXSA9IGF3YWl0IGRiLmluc2VydChjYXJzKVxuICAgKiAgIC52YWx1ZXMoeyBicmFuZDogJ0JNVycgfSlcbiAgICogICAucmV0dXJuaW5nKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgaW5zZXJ0KGludG8pIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUluc2VydEJ1aWxkZXIoaW50bywgdGhpcy5zZXNzaW9uLCB0aGlzLmRpYWxlY3QpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGVsZXRlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGhvdXQgYC53aGVyZSgpYCBjbGF1c2Ugd2lsbCBkZWxldGUgYWxsIHJvd3MgaW4gYSB0YWJsZS4gVGhlIGAud2hlcmUoKWAgY2xhdXNlIHNwZWNpZmllcyB3aGljaCByb3dzIHNob3VsZCBiZSBkZWxldGVkLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2RlbGV0ZX1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB0byBkZWxldGUgZnJvbS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gRGVsZXRlIGFsbCByb3dzIGluIHRoZSAnY2FycycgdGFibGVcbiAgICogYXdhaXQgZGIuZGVsZXRlKGNhcnMpO1xuICAgKlxuICAgKiAvLyBEZWxldGUgcm93cyB3aXRoIGZpbHRlcnMgYW5kIGNvbmRpdGlvbnNcbiAgICogYXdhaXQgZGIuZGVsZXRlKGNhcnMpLndoZXJlKGVxKGNhcnMuY29sb3IsICdncmVlbicpKTtcbiAgICpcbiAgICogLy8gRGVsZXRlIHdpdGggcmV0dXJuaW5nIGNsYXVzZVxuICAgKiBjb25zdCBkZWxldGVkQ2FyOiBDYXJbXSA9IGF3YWl0IGRiLmRlbGV0ZShjYXJzKVxuICAgKiAgIC53aGVyZShlcShjYXJzLmlkLCAxKSlcbiAgICogICAucmV0dXJuaW5nKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgZGVsZXRlKGZyb20pIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZURlbGV0ZUJhc2UoZnJvbSwgdGhpcy5zZXNzaW9uLCB0aGlzLmRpYWxlY3QpO1xuICB9XG4gIHJ1bihxdWVyeSkge1xuICAgIGNvbnN0IHNlcXVlbCA9IHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiA/IHNxbC5yYXcocXVlcnkpIDogcXVlcnkuZ2V0U1FMKCk7XG4gICAgaWYgKHRoaXMucmVzdWx0S2luZCA9PT0gXCJhc3luY1wiKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVJhdyhcbiAgICAgICAgYXN5bmMgKCkgPT4gdGhpcy5zZXNzaW9uLnJ1bihzZXF1ZWwpLFxuICAgICAgICAoKSA9PiBzZXF1ZWwsXG4gICAgICAgIFwicnVuXCIsXG4gICAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgICAgdGhpcy5zZXNzaW9uLmV4dHJhY3RSYXdSdW5WYWx1ZUZyb21CYXRjaFJlc3VsdC5iaW5kKHRoaXMuc2Vzc2lvbilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlc3Npb24ucnVuKHNlcXVlbCk7XG4gIH1cbiAgYWxsKHF1ZXJ5KSB7XG4gICAgY29uc3Qgc2VxdWVsID0gdHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiID8gc3FsLnJhdyhxdWVyeSkgOiBxdWVyeS5nZXRTUUwoKTtcbiAgICBpZiAodGhpcy5yZXN1bHRLaW5kID09PSBcImFzeW5jXCIpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlUmF3KFxuICAgICAgICBhc3luYyAoKSA9PiB0aGlzLnNlc3Npb24uYWxsKHNlcXVlbCksXG4gICAgICAgICgpID0+IHNlcXVlbCxcbiAgICAgICAgXCJhbGxcIixcbiAgICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgICB0aGlzLnNlc3Npb24uZXh0cmFjdFJhd0FsbFZhbHVlRnJvbUJhdGNoUmVzdWx0LmJpbmQodGhpcy5zZXNzaW9uKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5hbGwoc2VxdWVsKTtcbiAgfVxuICBnZXQocXVlcnkpIHtcbiAgICBjb25zdCBzZXF1ZWwgPSB0eXBlb2YgcXVlcnkgPT09IFwic3RyaW5nXCIgPyBzcWwucmF3KHF1ZXJ5KSA6IHF1ZXJ5LmdldFNRTCgpO1xuICAgIGlmICh0aGlzLnJlc3VsdEtpbmQgPT09IFwiYXN5bmNcIikge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVSYXcoXG4gICAgICAgIGFzeW5jICgpID0+IHRoaXMuc2Vzc2lvbi5nZXQoc2VxdWVsKSxcbiAgICAgICAgKCkgPT4gc2VxdWVsLFxuICAgICAgICBcImdldFwiLFxuICAgICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICAgIHRoaXMuc2Vzc2lvbi5leHRyYWN0UmF3R2V0VmFsdWVGcm9tQmF0Y2hSZXN1bHQuYmluZCh0aGlzLnNlc3Npb24pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmdldChzZXF1ZWwpO1xuICB9XG4gIHZhbHVlcyhxdWVyeSkge1xuICAgIGNvbnN0IHNlcXVlbCA9IHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiA/IHNxbC5yYXcocXVlcnkpIDogcXVlcnkuZ2V0U1FMKCk7XG4gICAgaWYgKHRoaXMucmVzdWx0S2luZCA9PT0gXCJhc3luY1wiKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVJhdyhcbiAgICAgICAgYXN5bmMgKCkgPT4gdGhpcy5zZXNzaW9uLnZhbHVlcyhzZXF1ZWwpLFxuICAgICAgICAoKSA9PiBzZXF1ZWwsXG4gICAgICAgIFwidmFsdWVzXCIsXG4gICAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgICAgdGhpcy5zZXNzaW9uLmV4dHJhY3RSYXdWYWx1ZXNWYWx1ZUZyb21CYXRjaFJlc3VsdC5iaW5kKHRoaXMuc2Vzc2lvbilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlc3Npb24udmFsdWVzKHNlcXVlbCk7XG4gIH1cbiAgdHJhbnNhY3Rpb24odHJhbnNhY3Rpb24sIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb24udHJhbnNhY3Rpb24odHJhbnNhY3Rpb24sIGNvbmZpZyk7XG4gIH1cbn1cbmNvbnN0IHdpdGhSZXBsaWNhcyA9IChwcmltYXJ5LCByZXBsaWNhcywgZ2V0UmVwbGljYSA9ICgpID0+IHJlcGxpY2FzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHJlcGxpY2FzLmxlbmd0aCldKSA9PiB7XG4gIGNvbnN0IHNlbGVjdCA9ICguLi5hcmdzKSA9PiBnZXRSZXBsaWNhKHJlcGxpY2FzKS5zZWxlY3QoLi4uYXJncyk7XG4gIGNvbnN0IHNlbGVjdERpc3RpbmN0ID0gKC4uLmFyZ3MpID0+IGdldFJlcGxpY2EocmVwbGljYXMpLnNlbGVjdERpc3RpbmN0KC4uLmFyZ3MpO1xuICBjb25zdCAkY291bnQgPSAoLi4uYXJncykgPT4gZ2V0UmVwbGljYShyZXBsaWNhcykuJGNvdW50KC4uLmFyZ3MpO1xuICBjb25zdCAkd2l0aCA9ICguLi5hcmdzKSA9PiBnZXRSZXBsaWNhKHJlcGxpY2FzKS53aXRoKC4uLmFyZ3MpO1xuICBjb25zdCB1cGRhdGUgPSAoLi4uYXJncykgPT4gcHJpbWFyeS51cGRhdGUoLi4uYXJncyk7XG4gIGNvbnN0IGluc2VydCA9ICguLi5hcmdzKSA9PiBwcmltYXJ5Lmluc2VydCguLi5hcmdzKTtcbiAgY29uc3QgJGRlbGV0ZSA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LmRlbGV0ZSguLi5hcmdzKTtcbiAgY29uc3QgcnVuID0gKC4uLmFyZ3MpID0+IHByaW1hcnkucnVuKC4uLmFyZ3MpO1xuICBjb25zdCBhbGwgPSAoLi4uYXJncykgPT4gcHJpbWFyeS5hbGwoLi4uYXJncyk7XG4gIGNvbnN0IGdldCA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LmdldCguLi5hcmdzKTtcbiAgY29uc3QgdmFsdWVzID0gKC4uLmFyZ3MpID0+IHByaW1hcnkudmFsdWVzKC4uLmFyZ3MpO1xuICBjb25zdCB0cmFuc2FjdGlvbiA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LnRyYW5zYWN0aW9uKC4uLmFyZ3MpO1xuICByZXR1cm4ge1xuICAgIC4uLnByaW1hcnksXG4gICAgdXBkYXRlLFxuICAgIGluc2VydCxcbiAgICBkZWxldGU6ICRkZWxldGUsXG4gICAgcnVuLFxuICAgIGFsbCxcbiAgICBnZXQsXG4gICAgdmFsdWVzLFxuICAgIHRyYW5zYWN0aW9uLFxuICAgICRwcmltYXJ5OiBwcmltYXJ5LFxuICAgIHNlbGVjdCxcbiAgICBzZWxlY3REaXN0aW5jdCxcbiAgICAkY291bnQsXG4gICAgd2l0aDogJHdpdGgsXG4gICAgZ2V0IHF1ZXJ5KCkge1xuICAgICAgcmV0dXJuIGdldFJlcGxpY2EocmVwbGljYXMpLnF1ZXJ5O1xuICAgIH1cbiAgfTtcbn07XG5leHBvcnQge1xuICBCYXNlU1FMaXRlRGF0YWJhc2UsXG4gIHdpdGhSZXBsaWNhc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRiLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmNsYXNzIENhY2hlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQ2FjaGVcIjtcbn1cbmNsYXNzIE5vb3BDYWNoZSBleHRlbmRzIENhY2hlIHtcbiAgc3RyYXRlZ3koKSB7XG4gICAgcmV0dXJuIFwiYWxsXCI7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiTm9vcENhY2hlXCI7XG4gIGFzeW5jIGdldChfa2V5KSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBhc3luYyBwdXQoX2hhc2hlZFF1ZXJ5LCBfcmVzcG9uc2UsIF90YWJsZXMsIF9jb25maWcpIHtcbiAgfVxuICBhc3luYyBvbk11dGF0ZShfcGFyYW1zKSB7XG4gIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIGhhc2hRdWVyeShzcWwsIHBhcmFtcykge1xuICBjb25zdCBkYXRhVG9IYXNoID0gYCR7c3FsfS0ke0pTT04uc3RyaW5naWZ5KHBhcmFtcyl9YDtcbiAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICBjb25zdCBkYXRhID0gZW5jb2Rlci5lbmNvZGUoZGF0YVRvSGFzaCk7XG4gIGNvbnN0IGhhc2hCdWZmZXIgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdChcIlNIQS0yNTZcIiwgZGF0YSk7XG4gIGNvbnN0IGhhc2hBcnJheSA9IFsuLi5uZXcgVWludDhBcnJheShoYXNoQnVmZmVyKV07XG4gIGNvbnN0IGhhc2hIZXggPSBoYXNoQXJyYXkubWFwKChiKSA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpLmpvaW4oXCJcIik7XG4gIHJldHVybiBoYXNoSGV4O1xufVxuZXhwb3J0IHtcbiAgQ2FjaGUsXG4gIE5vb3BDYWNoZSxcbiAgaGFzaFF1ZXJ5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2FjaGUuanMubWFwIiwKICAgICJpbXBvcnQgeyBoYXNoUXVlcnksIE5vb3BDYWNoZSB9IGZyb20gXCIuLi9jYWNoZS9jb3JlL2NhY2hlLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IERyaXp6bGVFcnJvciwgRHJpenpsZVF1ZXJ5RXJyb3IsIFRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5pbXBvcnQgeyBCYXNlU1FMaXRlRGF0YWJhc2UgfSBmcm9tIFwiLi9kYi5qc1wiO1xuY2xhc3MgRXhlY3V0ZVJlc3VsdFN5bmMgZXh0ZW5kcyBRdWVyeVByb21pc2Uge1xuICBjb25zdHJ1Y3RvcihyZXN1bHRDYikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5yZXN1bHRDYiA9IHJlc3VsdENiO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkV4ZWN1dGVSZXN1bHRTeW5jXCI7XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0Q2IoKTtcbiAgfVxuICBzeW5jKCkge1xuICAgIHJldHVybiB0aGlzLnJlc3VsdENiKCk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVByZXBhcmVkUXVlcnkge1xuICBjb25zdHJ1Y3Rvcihtb2RlLCBleGVjdXRlTWV0aG9kLCBxdWVyeSwgY2FjaGUsIHF1ZXJ5TWV0YWRhdGEsIGNhY2hlQ29uZmlnKSB7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICB0aGlzLmV4ZWN1dGVNZXRob2QgPSBleGVjdXRlTWV0aG9kO1xuICAgIHRoaXMucXVlcnkgPSBxdWVyeTtcbiAgICB0aGlzLmNhY2hlID0gY2FjaGU7XG4gICAgdGhpcy5xdWVyeU1ldGFkYXRhID0gcXVlcnlNZXRhZGF0YTtcbiAgICB0aGlzLmNhY2hlQ29uZmlnID0gY2FjaGVDb25maWc7XG4gICAgaWYgKGNhY2hlICYmIGNhY2hlLnN0cmF0ZWd5KCkgPT09IFwiYWxsXCIgJiYgY2FjaGVDb25maWcgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5jYWNoZUNvbmZpZyA9IHsgZW5hYmxlOiB0cnVlLCBhdXRvSW52YWxpZGF0ZTogdHJ1ZSB9O1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY2FjaGVDb25maWc/LmVuYWJsZSkge1xuICAgICAgdGhpcy5jYWNoZUNvbmZpZyA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUHJlcGFyZWRRdWVyeVwiO1xuICAvKiogQGludGVybmFsICovXG4gIGpvaW5zTm90TnVsbGFibGVNYXA7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYXN5bmMgcXVlcnlXaXRoQ2FjaGUocXVlcnlTdHJpbmcsIHBhcmFtcywgcXVlcnkpIHtcbiAgICBpZiAodGhpcy5jYWNoZSA9PT0gdm9pZCAwIHx8IGlzKHRoaXMuY2FjaGUsIE5vb3BDYWNoZSkgfHwgdGhpcy5xdWVyeU1ldGFkYXRhID09PSB2b2lkIDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBxdWVyeSgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRHJpenpsZVF1ZXJ5RXJyb3IocXVlcnlTdHJpbmcsIHBhcmFtcywgZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmNhY2hlQ29uZmlnICYmICF0aGlzLmNhY2hlQ29uZmlnLmVuYWJsZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBEcml6emxlUXVlcnlFcnJvcihxdWVyeVN0cmluZywgcGFyYW1zLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCh0aGlzLnF1ZXJ5TWV0YWRhdGEudHlwZSA9PT0gXCJpbnNlcnRcIiB8fCB0aGlzLnF1ZXJ5TWV0YWRhdGEudHlwZSA9PT0gXCJ1cGRhdGVcIiB8fCB0aGlzLnF1ZXJ5TWV0YWRhdGEudHlwZSA9PT0gXCJkZWxldGVcIikgJiYgdGhpcy5xdWVyeU1ldGFkYXRhLnRhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBbcmVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICBxdWVyeSgpLFxuICAgICAgICAgIHRoaXMuY2FjaGUub25NdXRhdGUoeyB0YWJsZXM6IHRoaXMucXVlcnlNZXRhZGF0YS50YWJsZXMgfSlcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBEcml6emxlUXVlcnlFcnJvcihxdWVyeVN0cmluZywgcGFyYW1zLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0aGlzLmNhY2hlQ29uZmlnKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcXVlcnkoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IERyaXp6bGVRdWVyeUVycm9yKHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5xdWVyeU1ldGFkYXRhLnR5cGUgPT09IFwic2VsZWN0XCIpIHtcbiAgICAgIGNvbnN0IGZyb21DYWNoZSA9IGF3YWl0IHRoaXMuY2FjaGUuZ2V0KFxuICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLnRhZyA/PyAoYXdhaXQgaGFzaFF1ZXJ5KHF1ZXJ5U3RyaW5nLCBwYXJhbXMpKSxcbiAgICAgICAgdGhpcy5xdWVyeU1ldGFkYXRhLnRhYmxlcyxcbiAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy50YWcgIT09IHZvaWQgMCxcbiAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy5hdXRvSW52YWxpZGF0ZVxuICAgICAgKTtcbiAgICAgIGlmIChmcm9tQ2FjaGUgPT09IHZvaWQgMCkge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHF1ZXJ5KCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRHJpenpsZVF1ZXJ5RXJyb3IocXVlcnlTdHJpbmcsIHBhcmFtcywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5jYWNoZS5wdXQoXG4gICAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy50YWcgPz8gKGF3YWl0IGhhc2hRdWVyeShxdWVyeVN0cmluZywgcGFyYW1zKSksXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBzZW5kIHRhYmxlcyB0aGF0IHdlcmUgdXNlZCBpbiBhIHF1ZXJ5IG9ubHkgaWYgdXNlciB3YW50cyB0byBpbnZhbGlkYXRlIGl0IG9uIGVhY2ggd3JpdGVcbiAgICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLmF1dG9JbnZhbGlkYXRlID8gdGhpcy5xdWVyeU1ldGFkYXRhLnRhYmxlcyA6IFtdLFxuICAgICAgICAgIHRoaXMuY2FjaGVDb25maWcudGFnICE9PSB2b2lkIDAsXG4gICAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy5jb25maWdcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmcm9tQ2FjaGU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcXVlcnkoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRHJpenpsZVF1ZXJ5RXJyb3IocXVlcnlTdHJpbmcsIHBhcmFtcywgZSk7XG4gICAgfVxuICB9XG4gIGdldFF1ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5O1xuICB9XG4gIG1hcFJ1blJlc3VsdChyZXN1bHQsIF9pc0Zyb21CYXRjaCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgbWFwQWxsUmVzdWx0KF9yZXN1bHQsIF9pc0Zyb21CYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICBtYXBHZXRSZXN1bHQoX3Jlc3VsdCwgX2lzRnJvbUJhdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIGV4ZWN1dGUocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSBcImFzeW5jXCIpIHtcbiAgICAgIHJldHVybiB0aGlzW3RoaXMuZXhlY3V0ZU1ldGhvZF0ocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEV4ZWN1dGVSZXN1bHRTeW5jKCgpID0+IHRoaXNbdGhpcy5leGVjdXRlTWV0aG9kXShwbGFjZWhvbGRlclZhbHVlcykpO1xuICB9XG4gIG1hcFJlc3VsdChyZXNwb25zZSwgaXNGcm9tQmF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRoaXMuZXhlY3V0ZU1ldGhvZCkge1xuICAgICAgY2FzZSBcInJ1blwiOiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcFJ1blJlc3VsdChyZXNwb25zZSwgaXNGcm9tQmF0Y2gpO1xuICAgICAgfVxuICAgICAgY2FzZSBcImFsbFwiOiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcEFsbFJlc3VsdChyZXNwb25zZSwgaXNGcm9tQmF0Y2gpO1xuICAgICAgfVxuICAgICAgY2FzZSBcImdldFwiOiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcEdldFJlc3VsdChyZXNwb25zZSwgaXNGcm9tQmF0Y2gpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuY2xhc3MgU1FMaXRlU2Vzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKGRpYWxlY3QpIHtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVNlc3Npb25cIjtcbiAgcHJlcGFyZU9uZVRpbWVRdWVyeShxdWVyeSwgZmllbGRzLCBleGVjdXRlTWV0aG9kLCBpc1Jlc3BvbnNlSW5BcnJheU1vZGUsIGN1c3RvbVJlc3VsdE1hcHBlciwgcXVlcnlNZXRhZGF0YSwgY2FjaGVDb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlUXVlcnkoXG4gICAgICBxdWVyeSxcbiAgICAgIGZpZWxkcyxcbiAgICAgIGV4ZWN1dGVNZXRob2QsXG4gICAgICBpc1Jlc3BvbnNlSW5BcnJheU1vZGUsXG4gICAgICBjdXN0b21SZXN1bHRNYXBwZXIsXG4gICAgICBxdWVyeU1ldGFkYXRhLFxuICAgICAgY2FjaGVDb25maWdcbiAgICApO1xuICB9XG4gIHJ1bihxdWVyeSkge1xuICAgIGNvbnN0IHN0YXRpY1F1ZXJ5ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkocXVlcnkpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5wcmVwYXJlT25lVGltZVF1ZXJ5KHN0YXRpY1F1ZXJ5LCB2b2lkIDAsIFwicnVuXCIsIGZhbHNlKS5ydW4oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBEcml6emxlRXJyb3IoeyBjYXVzZTogZXJyLCBtZXNzYWdlOiBgRmFpbGVkIHRvIHJ1biB0aGUgcXVlcnkgJyR7c3RhdGljUXVlcnkuc3FsfSdgIH0pO1xuICAgIH1cbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGV4dHJhY3RSYXdSdW5WYWx1ZUZyb21CYXRjaFJlc3VsdChyZXN1bHQpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGFsbChxdWVyeSkge1xuICAgIHJldHVybiB0aGlzLnByZXBhcmVPbmVUaW1lUXVlcnkodGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkocXVlcnkpLCB2b2lkIDAsIFwicnVuXCIsIGZhbHNlKS5hbGwoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGV4dHJhY3RSYXdBbGxWYWx1ZUZyb21CYXRjaFJlc3VsdChfcmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIGdldChxdWVyeSkge1xuICAgIHJldHVybiB0aGlzLnByZXBhcmVPbmVUaW1lUXVlcnkodGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkocXVlcnkpLCB2b2lkIDAsIFwicnVuXCIsIGZhbHNlKS5nZXQoKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGV4dHJhY3RSYXdHZXRWYWx1ZUZyb21CYXRjaFJlc3VsdChfcmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHZhbHVlcyhxdWVyeSkge1xuICAgIHJldHVybiB0aGlzLnByZXBhcmVPbmVUaW1lUXVlcnkodGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkocXVlcnkpLCB2b2lkIDAsIFwicnVuXCIsIGZhbHNlKS52YWx1ZXMoKTtcbiAgfVxuICBhc3luYyBjb3VudChzcWwpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnZhbHVlcyhzcWwpO1xuICAgIHJldHVybiByZXN1bHRbMF1bMF07XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBleHRyYWN0UmF3VmFsdWVzVmFsdWVGcm9tQmF0Y2hSZXN1bHQoX3Jlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlU1FMaXRlRGF0YWJhc2Uge1xuICBjb25zdHJ1Y3RvcihyZXN1bHRUeXBlLCBkaWFsZWN0LCBzZXNzaW9uLCBzY2hlbWEsIG5lc3RlZEluZGV4ID0gMCkge1xuICAgIHN1cGVyKHJlc3VsdFR5cGUsIGRpYWxlY3QsIHNlc3Npb24sIHNjaGVtYSk7XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5uZXN0ZWRJbmRleCA9IG5lc3RlZEluZGV4O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRyYW5zYWN0aW9uXCI7XG4gIHJvbGxiYWNrKCkge1xuICAgIHRocm93IG5ldyBUcmFuc2FjdGlvblJvbGxiYWNrRXJyb3IoKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgRXhlY3V0ZVJlc3VsdFN5bmMsXG4gIFNRTGl0ZVByZXBhcmVkUXVlcnksXG4gIFNRTGl0ZVNlc3Npb24sXG4gIFNRTGl0ZVRyYW5zYWN0aW9uXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2Vzc2lvbi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIENvbnNvbGVMb2dXcml0ZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJDb25zb2xlTG9nV3JpdGVyXCI7XG4gIHdyaXRlKG1lc3NhZ2UpIHtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbiAgfVxufVxuY2xhc3MgRGVmYXVsdExvZ2dlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkRlZmF1bHRMb2dnZXJcIjtcbiAgd3JpdGVyO1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLndyaXRlciA9IGNvbmZpZz8ud3JpdGVyID8/IG5ldyBDb25zb2xlTG9nV3JpdGVyKCk7XG4gIH1cbiAgbG9nUXVlcnkocXVlcnksIHBhcmFtcykge1xuICAgIGNvbnN0IHN0cmluZ2lmaWVkUGFyYW1zID0gcGFyYW1zLm1hcCgocCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBTdHJpbmcocCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcGFyYW1zU3RyID0gc3RyaW5naWZpZWRQYXJhbXMubGVuZ3RoID8gYCAtLSBwYXJhbXM6IFske3N0cmluZ2lmaWVkUGFyYW1zLmpvaW4oXCIsIFwiKX1dYCA6IFwiXCI7XG4gICAgdGhpcy53cml0ZXIud3JpdGUoYFF1ZXJ5OiAke3F1ZXJ5fSR7cGFyYW1zU3RyfWApO1xuICB9XG59XG5jbGFzcyBOb29wTG9nZ2VyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiTm9vcExvZ2dlclwiO1xuICBsb2dRdWVyeSgpIHtcbiAgfVxufVxuZXhwb3J0IHtcbiAgQ29uc29sZUxvZ1dyaXRlcixcbiAgRGVmYXVsdExvZ2dlcixcbiAgTm9vcExvZ2dlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZ2dlci5qcy5tYXAiLAogICAgImltcG9ydCB7IF9fZXhwb3J0IH0gZnJvbSBcIi4uL192aXJ0dWFsL3JvbGxkb3duX3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IGluZGV4LCBpbnRlZ2VyLCByZWFsLCBzcWxpdGVUYWJsZSwgdGV4dCB9IGZyb20gXCJkcml6emxlLW9ybS9zcWxpdGUtY29yZVwiO1xuaW1wb3J0IHsgcmVsYXRpb25zIH0gZnJvbSBcImRyaXp6bGUtb3JtXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZGIvc2NoZW1hLnRzXG52YXIgc2NoZW1hX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KHNjaGVtYV9leHBvcnRzLCB7XG5cdGNoYXJhY3RlcnM6ICgpID0+IGNoYXJhY3RlcnMsXG5cdGNoYXJhY3RlcnNSZWxhdGlvbnM6ICgpID0+IGNoYXJhY3RlcnNSZWxhdGlvbnMsXG5cdG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzOiAoKSA9PiBtaW5pbmdGbGVldFBhcnRpY2lwYW50cyxcblx0bWluaW5nRmxlZXRQYXJ0aWNpcGFudHNSZWxhdGlvbnM6ICgpID0+IG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzUmVsYXRpb25zLFxuXHRtaW5pbmdGbGVldHM6ICgpID0+IG1pbmluZ0ZsZWV0cyxcblx0bWluaW5nRmxlZXRzUmVsYXRpb25zOiAoKSA9PiBtaW5pbmdGbGVldHNSZWxhdGlvbnMsXG5cdHJlc3VtZUNvbW1hbmRzOiAoKSA9PiByZXN1bWVDb21tYW5kcyxcblx0c2hhcmVkOiAoKSA9PiBzaGFyZWQsXG5cdHVzZXJzOiAoKSA9PiB1c2Vycyxcblx0dXNlcnNSZWxhdGlvbnM6ICgpID0+IHVzZXJzUmVsYXRpb25zXG59KTtcbmNvbnN0IHNoYXJlZCA9IHtcblx0Y3JlYXRlZEF0OiBpbnRlZ2VyKFwiY3JlYXRlZF9hdFwiKS5ub3ROdWxsKCksXG5cdHVwZGF0ZWRBdDogaW50ZWdlcihcInVwZGF0ZWRfYXRcIilcbn07XG5jb25zdCB1c2VycyA9IHNxbGl0ZVRhYmxlKFwidXNlcnNcIiwge1xuXHRpZDogaW50ZWdlcigpLnByaW1hcnlLZXkoKS51bmlxdWUoKS5ub3ROdWxsKCksXG5cdGRpc2NvcmRJRDogdGV4dChcImRpc2NvcmRfaWRcIikudW5pcXVlKCkubm90TnVsbCgpLFxuXHRtYWluQ2hhcmFjdGVyOiBpbnRlZ2VyKFwibWFpbl9jaGFyYWN0ZXJcIiksXG5cdC4uLnNoYXJlZFxufSwgKHRhYmxlKSA9PiBbaW5kZXgoXCJpZHhfZGlzY29yZF9pZFwiKS5vbih0YWJsZS5kaXNjb3JkSUQpLCBpbmRleChcImlkeF9tYWluX2NoYXJhY3RlclwiKS5vbih0YWJsZS5tYWluQ2hhcmFjdGVyKV0pO1xuY29uc3QgdXNlcnNSZWxhdGlvbnMgPSByZWxhdGlvbnModXNlcnMsICh7IG9uZSwgbWFueSB9KSA9PiAoe1xuXHRjaGFyYWN0ZXJzOiBtYW55KGNoYXJhY3RlcnMpLFxuXHRtYWluOiBvbmUoY2hhcmFjdGVycywge1xuXHRcdGZpZWxkczogW3VzZXJzLm1haW5DaGFyYWN0ZXJdLFxuXHRcdHJlZmVyZW5jZXM6IFtjaGFyYWN0ZXJzLmlkXVxuXHR9KVxufSkpO1xuY29uc3QgY2hhcmFjdGVycyA9IHNxbGl0ZVRhYmxlKFwiY2hhcmFjdGVyc1wiLCB7XG5cdGlkOiBpbnRlZ2VyKFwiaWRcIikucHJpbWFyeUtleSh7IGF1dG9JbmNyZW1lbnQ6IHRydWUgfSksXG5cdGV2ZUlEOiBpbnRlZ2VyKFwiZXZlX2lkXCIpLm5vdE51bGwoKSxcblx0dXNlcklEOiBpbnRlZ2VyKFwidXNlcl9pZFwiKS5ub3ROdWxsKCksXG5cdG5hbWU6IHRleHQoKS5ub3ROdWxsKCksXG5cdGFjY2Vzc1Rva2VuOiB0ZXh0KFwiYWNjZXNzX3Rva2VuXCIpLm5vdE51bGwoKSxcblx0ZXhwaXJlc0F0OiBpbnRlZ2VyKFwiZXhwaXJlc19hdFwiKS5ub3ROdWxsKCksXG5cdHJlZnJlc2hUb2tlbjogdGV4dChcInJlZnJlc2hfdG9rZW5cIikubm90TnVsbCgpLFxuXHQuLi5zaGFyZWRcbn0sICh0YWJsZSkgPT4gW2luZGV4KFwiaWR4X3VzZXJfaWRcIikub24odGFibGUudXNlcklEKSwgaW5kZXgoXCJpZHhfZXZlX2lkXCIpLm9uKHRhYmxlLmV2ZUlEKV0pO1xuY29uc3QgY2hhcmFjdGVyc1JlbGF0aW9ucyA9IHJlbGF0aW9ucyhjaGFyYWN0ZXJzLCAoeyBvbmUgfSkgPT4gKHsgdXNlcjogb25lKHVzZXJzLCB7XG5cdGZpZWxkczogW2NoYXJhY3RlcnMudXNlcklEXSxcblx0cmVmZXJlbmNlczogW3VzZXJzLmlkXVxufSkgfSkpO1xuY29uc3QgcmVzdW1lQ29tbWFuZHMgPSBzcWxpdGVUYWJsZShcInJlc3VtZWNvbW1hbmRzXCIsIHtcblx0aWQ6IHRleHQoKS5wcmltYXJ5S2V5KCksXG5cdGNvbW1hbmQ6IHRleHQoKS5ub3ROdWxsKCksXG5cdHBhcmFtczogdGV4dCgpLm5vdE51bGwoKSxcblx0Y29udGV4dDogdGV4dCgpLm5vdE51bGwoKSxcblx0Li4uc2hhcmVkXG59KTtcbmNvbnN0IG1pbmluZ0ZsZWV0cyA9IHNxbGl0ZVRhYmxlKFwibWluaW5nX2ZsZWV0c1wiLCB7XG5cdGlkOiBpbnRlZ2VyKFwiaWRcIikucHJpbWFyeUtleSh7IGF1dG9JbmNyZW1lbnQ6IHRydWUgfSksXG5cdG5hbWU6IHRleHQoXCJuYW1lXCIpLm5vdE51bGwoKSxcblx0ZGVzY3JpcHRpb246IHRleHQoXCJkZXNjcmlwdGlvblwiKSxcblx0Y3JlYXRvckRpc2NvcmRJZDogdGV4dChcImNyZWF0b3JfZGlzY29yZF9pZFwiKS5ub3ROdWxsKCksXG5cdHN0YXJ0VGltZTogaW50ZWdlcihcInN0YXJ0X3RpbWVcIikubm90TnVsbCgpLFxuXHRlbmRUaW1lOiBpbnRlZ2VyKFwiZW5kX3RpbWVcIiksXG5cdHN0YXR1czogdGV4dChcInN0YXR1c1wiLCB7IGVudW06IFtcblx0XHRcImNvbmZpZ3VyaW5nXCIsXG5cdFx0XCJhY3RpdmVcIixcblx0XHRcImVuZGVkXCIsXG5cdFx0XCJnZW5lcmF0aW5nX3JlcG9ydFwiLFxuXHRcdFwiY29tcGxldGVkXCIsXG5cdFx0XCJmYWlsZWRcIlxuXHRdIH0pLm5vdE51bGwoKS5kZWZhdWx0KFwiY29uZmlndXJpbmdcIiksXG5cdHRheFJhdGU6IHJlYWwoXCJ0YXhfcmF0ZVwiKS5ub3ROdWxsKCkuZGVmYXVsdCgwKSxcblx0cHVibGljTWVzc2FnZUlkOiB0ZXh0KFwicHVibGljX21lc3NhZ2VfaWRcIikudW5pcXVlKCksXG5cdHB1YmxpY0NoYW5uZWxJZDogdGV4dChcInB1YmxpY19jaGFubmVsX2lkXCIpLFxuXHRyZXBvcnREYXRhOiB0ZXh0KFwicmVwb3J0X2RhdGFcIiksXG5cdGNyZWF0b3JFcGhlbWVyYWxNZXNzYWdlSWQ6IHRleHQoXCJjcmVhdG9yX2VwaGVtZXJhbF9tZXNzYWdlX2lkXCIpLFxuXHQuLi5zaGFyZWRcbn0sICh0YWJsZSkgPT4gW1xuXHRpbmRleChcImlkeF9mbGVldF9jcmVhdG9yX2Rpc2NvcmRfaWRcIikub24odGFibGUuY3JlYXRvckRpc2NvcmRJZCksXG5cdGluZGV4KFwiaWR4X2ZsZWV0X3N0YXR1c1wiKS5vbih0YWJsZS5zdGF0dXMpLFxuXHRpbmRleChcImlkeF9mbGVldF9wdWJsaWNfbWVzc2FnZV9pZFwiKS5vbih0YWJsZS5wdWJsaWNNZXNzYWdlSWQpXG5dKTtcbmNvbnN0IG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzID0gc3FsaXRlVGFibGUoXCJtaW5pbmdfZmxlZXRfcGFydGljaXBhbnRzXCIsIHtcblx0aWQ6IGludGVnZXIoXCJpZFwiKS5wcmltYXJ5S2V5KHsgYXV0b0luY3JlbWVudDogdHJ1ZSB9KSxcblx0ZmxlZXRJZDogaW50ZWdlcihcImZsZWV0X2lkXCIpLm5vdE51bGwoKS5yZWZlcmVuY2VzKCgpID0+IG1pbmluZ0ZsZWV0cy5pZCwgeyBvbkRlbGV0ZTogXCJjYXNjYWRlXCIgfSksXG5cdGNoYXJhY3RlcklkOiBpbnRlZ2VyKFwiY2hhcmFjdGVyX2lkXCIpLm5vdE51bGwoKS5yZWZlcmVuY2VzKCgpID0+IGNoYXJhY3RlcnMuaWQsIHsgb25EZWxldGU6IFwiY2FzY2FkZVwiIH0pLFxuXHRkaXNjb3JkSWQ6IHRleHQoXCJkaXNjb3JkX2lkXCIpLm5vdE51bGwoKSxcblx0cm9sZTogdGV4dChcInJvbGVcIiwgeyBlbnVtOiBbXG5cdFx0XCJtaW5lclwiLFxuXHRcdFwic2VjdXJpdHlcIixcblx0XHRcImhhdWxlclwiXG5cdF0gfSkubm90TnVsbCgpLFxuXHRqb2luVGltZTogaW50ZWdlcihcImpvaW5fdGltZVwiKS5ub3ROdWxsKCksXG5cdC4uLnNoYXJlZFxufSwgKHRhYmxlKSA9PiBbXG5cdGluZGV4KFwiaWR4X3BhcnRpY2lwYW50X2ZsZWV0X2lkXCIpLm9uKHRhYmxlLmZsZWV0SWQpLFxuXHRpbmRleChcImlkeF9wYXJ0aWNpcGFudF9jaGFyYWN0ZXJfaWRcIikub24odGFibGUuY2hhcmFjdGVySWQpLFxuXHRpbmRleChcImlkeF9wYXJ0aWNpcGFudF9kaXNjb3JkX2lkXCIpLm9uKHRhYmxlLmRpc2NvcmRJZClcbl0pO1xuY29uc3QgbWluaW5nRmxlZXRzUmVsYXRpb25zID0gcmVsYXRpb25zKG1pbmluZ0ZsZWV0cywgKHsgbWFueSB9KSA9PiAoeyBwYXJ0aWNpcGFudHM6IG1hbnkobWluaW5nRmxlZXRQYXJ0aWNpcGFudHMpIH0pKTtcbmNvbnN0IG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzUmVsYXRpb25zID0gcmVsYXRpb25zKG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzLCAoeyBvbmUgfSkgPT4gKHtcblx0ZmxlZXQ6IG9uZShtaW5pbmdGbGVldHMsIHtcblx0XHRmaWVsZHM6IFttaW5pbmdGbGVldFBhcnRpY2lwYW50cy5mbGVldElkXSxcblx0XHRyZWZlcmVuY2VzOiBbbWluaW5nRmxlZXRzLmlkXVxuXHR9KSxcblx0Y2hhcmFjdGVyOiBvbmUoY2hhcmFjdGVycywge1xuXHRcdGZpZWxkczogW21pbmluZ0ZsZWV0UGFydGljaXBhbnRzLmNoYXJhY3RlcklkXSxcblx0XHRyZWZlcmVuY2VzOiBbY2hhcmFjdGVycy5pZF1cblx0fSlcbn0pKTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBjaGFyYWN0ZXJzLCBtaW5pbmdGbGVldFBhcnRpY2lwYW50cywgbWluaW5nRmxlZXRzLCByZXN1bWVDb21tYW5kcywgc2NoZW1hX2V4cG9ydHMsIHVzZXJzIH07IiwKICAgICJpbXBvcnQgeyBjaGFyYWN0ZXJzLCB1c2VycyB9IGZyb20gXCIuLi9zY2hlbWEuanNcIjtcbmltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuL2NoYXJhY3Rlci5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgZGIgfSBmcm9tIFwiLi4vaW5kZXguanNcIjtcbmltcG9ydCB7IGVxLCBzcWwgfSBmcm9tIFwiZHJpenpsZS1vcm1cIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9tb2RlbHMvdXNlci5tb2RlbC50c1xudmFyIFVzZXJIZWxwZXIgPSBjbGFzcyB7XG5cdHN0YXRpYyBmaW5kKGlkKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KHtcblx0XHRcdGlkOiB1c2Vycy5pZCxcblx0XHRcdGRpc2NvcmRJRDogdXNlcnMuZGlzY29yZElELFxuXHRcdFx0Y3JlYXRlZEF0OiB1c2Vycy5jcmVhdGVkQXQsXG5cdFx0XHR1cGRhdGVkQXQ6IHVzZXJzLnVwZGF0ZWRBdCxcblx0XHRcdG1haW5DaGFyYWN0ZXJJRDogdXNlcnMubWFpbkNoYXJhY3Rlcixcblx0XHRcdGNoYXJhY3RlcklEc1N0cmluZzogc3FsYGpzb25fZ3JvdXBfYXJyYXkoY2hhcmFjdGVycy5pZClgXG5cdFx0fSkuZnJvbSh1c2Vycykud2hlcmUoZXEodXNlcnMuaWQsIGlkKSkubGVmdEpvaW4oY2hhcmFjdGVycywgZXEodXNlcnMuaWQsIGNoYXJhY3RlcnMudXNlcklEKSkuZ2V0KCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRnJvbVF1ZXJ5KHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGZpbmRCeURpc2NvcmRJZChpZCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCh7XG5cdFx0XHRpZDogdXNlcnMuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHVzZXJzLmRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogdXNlcnMuY3JlYXRlZEF0LFxuXHRcdFx0dXBkYXRlZEF0OiB1c2Vycy51cGRhdGVkQXQsXG5cdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHVzZXJzLm1haW5DaGFyYWN0ZXIsXG5cdFx0XHRjaGFyYWN0ZXJJRHNTdHJpbmc6IHNxbGBqc29uX2dyb3VwX2FycmF5KGNoYXJhY3RlcnMuaWQpYFxuXHRcdH0pLmZyb20odXNlcnMpLndoZXJlKGVxKHVzZXJzLmRpc2NvcmRJRCwgaWQpKS5sZWZ0Sm9pbihjaGFyYWN0ZXJzLCBlcSh1c2Vycy5pZCwgY2hhcmFjdGVycy51c2VySUQpKS5nZXQoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGcm9tUXVlcnkocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgZmluZEFsbCgpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3Qoe1xuXHRcdFx0aWQ6IHVzZXJzLmlkLFxuXHRcdFx0ZGlzY29yZElEOiB1c2Vycy5kaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IHVzZXJzLmNyZWF0ZWRBdCxcblx0XHRcdHVwZGF0ZWRBdDogdXNlcnMudXBkYXRlZEF0LFxuXHRcdFx0bWFpbkNoYXJhY3RlcklEOiB1c2Vycy5tYWluQ2hhcmFjdGVyLFxuXHRcdFx0Y2hhcmFjdGVySURzU3RyaW5nOiBzcWxganNvbl9ncm91cF9hcnJheShjaGFyYWN0ZXJzLmlkKWBcblx0XHR9KS5mcm9tKHVzZXJzKS5sZWZ0Sm9pbihjaGFyYWN0ZXJzLCBlcSh1c2Vycy5pZCwgY2hhcmFjdGVycy51c2VySUQpKS5hbGwoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGcm9tUXVlcnkocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgZmluZEJ5Q2hhcmFjdGVySWQoaWQpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3Qoe1xuXHRcdFx0aWQ6IHVzZXJzLmlkLFxuXHRcdFx0ZGlzY29yZElEOiB1c2Vycy5kaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IHVzZXJzLmNyZWF0ZWRBdCxcblx0XHRcdHVwZGF0ZWRBdDogdXNlcnMudXBkYXRlZEF0LFxuXHRcdFx0bWFpbkNoYXJhY3RlcklEOiB1c2Vycy5tYWluQ2hhcmFjdGVyLFxuXHRcdFx0Y2hhcmFjdGVySURzU3RyaW5nOiBzcWxganNvbl9ncm91cF9hcnJheShjaGFyYWN0ZXJzLmlkKWBcblx0XHR9KS5mcm9tKHVzZXJzKS5sZWZ0Sm9pbihjaGFyYWN0ZXJzLCBlcSh1c2Vycy5pZCwgY2hhcmFjdGVycy51c2VySUQpKS53aGVyZShlcShjaGFyYWN0ZXJzLmlkLCBpZCkpLmFsbCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUZyb21RdWVyeShyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlDaGFyYWN0ZXJOYW1lKG5hbWUpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3Qoe1xuXHRcdFx0aWQ6IHVzZXJzLmlkLFxuXHRcdFx0ZGlzY29yZElEOiB1c2Vycy5kaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IHVzZXJzLmNyZWF0ZWRBdCxcblx0XHRcdHVwZGF0ZWRBdDogdXNlcnMudXBkYXRlZEF0LFxuXHRcdFx0bWFpbkNoYXJhY3RlcklEOiB1c2Vycy5tYWluQ2hhcmFjdGVyLFxuXHRcdFx0Y2hhcmFjdGVySURzU3RyaW5nOiBzcWxganNvbl9ncm91cF9hcnJheShjaGFyYWN0ZXJzLmlkKWBcblx0XHR9KS5mcm9tKHVzZXJzKS5sZWZ0Sm9pbihjaGFyYWN0ZXJzLCBlcSh1c2Vycy5pZCwgY2hhcmFjdGVycy51c2VySUQpKS53aGVyZShlcShjaGFyYWN0ZXJzLm5hbWUsIG5hbWUpKS5hbGwoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGcm9tUXVlcnkocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlRnJvbVF1ZXJ5KHF1ZXJ5KSB7XG5cdFx0aWYgKCFxdWVyeSkgcmV0dXJuIFtdO1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5KSkgcmV0dXJuIHF1ZXJ5Lm1hcCgodXNlcikgPT4ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aWQ6IHVzZXIuaWQsXG5cdFx0XHRcdGRpc2NvcmRJRDogdXNlci5kaXNjb3JkSUQsXG5cdFx0XHRcdGNyZWF0ZWRBdDogbmV3IERhdGUodXNlci5jcmVhdGVkQXQpLFxuXHRcdFx0XHR1cGRhdGVkQXQ6IG5ldyBEYXRlKHVzZXIudXBkYXRlZEF0KSxcblx0XHRcdFx0Y2hhcmFjdGVySURzOiB1c2VyLmNoYXJhY3RlcklEc1N0cmluZyA/IEpTT04ucGFyc2UodXNlci5jaGFyYWN0ZXJJRHNTdHJpbmcgPz8gXCJbXVwiKS5tYXAoKHMpID0+IE51bWJlcihzKSkuc29ydCgpIDogW10sXG5cdFx0XHRcdG1haW5DaGFyYWN0ZXJJRDogdXNlci5tYWluQ2hhcmFjdGVySURcblx0XHRcdH07XG5cdFx0fSk7XG5cdFx0ZWxzZSByZXR1cm4ge1xuXHRcdFx0aWQ6IHF1ZXJ5LmlkLFxuXHRcdFx0ZGlzY29yZElEOiBxdWVyeS5kaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKHF1ZXJ5LmNyZWF0ZWRBdCksXG5cdFx0XHR1cGRhdGVkQXQ6IG5ldyBEYXRlKHF1ZXJ5LnVwZGF0ZWRBdCksXG5cdFx0XHRjaGFyYWN0ZXJJRHM6IHF1ZXJ5LmNoYXJhY3RlcklEc1N0cmluZyA/IEpTT04ucGFyc2UocXVlcnkuY2hhcmFjdGVySURzU3RyaW5nID8/IFwiW11cIikubWFwKChzKSA9PiBOdW1iZXIocykpLnNvcnQoKSA6IFtdLFxuXHRcdFx0bWFpbkNoYXJhY3RlcklEOiBxdWVyeS5tYWluQ2hhcmFjdGVySURcblx0XHR9O1xuXHR9XG5cdHN0YXRpYyBjcmVhdGUoZGlzY29yZElEKSB7XG5cdFx0dGhpcy5zYXZlKHtcblx0XHRcdGRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksXG5cdFx0XHR1cGRhdGVkQXQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpXG5cdFx0fSk7XG5cdFx0cmV0dXJuIHRoaXMuZmluZEJ5RGlzY29yZElkKGRpc2NvcmRJRCk7XG5cdH1cblx0c3RhdGljIHNhdmUodXNlcikge1xuXHRcdGRiLmluc2VydCh1c2VycykudmFsdWVzKHtcblx0XHRcdGlkOiB1c2VyLmlkLFxuXHRcdFx0ZGlzY29yZElEOiB1c2VyLmRpc2NvcmRJRCxcblx0XHRcdG1haW5DaGFyYWN0ZXI6IHVzZXIubWFpbkNoYXJhY3RlcklELFxuXHRcdFx0Y3JlYXRlZEF0OiB1c2VyLmNyZWF0ZWRBdC5nZXRUaW1lKCksXG5cdFx0XHR1cGRhdGVkQXQ6IHVzZXIudXBkYXRlZEF0LmdldFRpbWUoKVxuXHRcdH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG5cdFx0XHR0YXJnZXQ6IHVzZXJzLmlkLFxuXHRcdFx0c2V0OiB7XG5cdFx0XHRcdGRpc2NvcmRJRDogdXNlci5kaXNjb3JkSUQsXG5cdFx0XHRcdG1haW5DaGFyYWN0ZXI6IHVzZXIubWFpbkNoYXJhY3RlcklELFxuXHRcdFx0XHR1cGRhdGVkQXQ6IHVzZXIudXBkYXRlZEF0LmdldFRpbWUoKVxuXHRcdFx0fVxuXHRcdH0pLnJ1bigpO1xuXHRcdHJldHVybiB1c2VyO1xuXHR9XG5cdHN0YXRpYyBkZWxldGUodXNlcikge1xuXHRcdGRiLmRlbGV0ZSh1c2Vycykud2hlcmUoZXEodXNlcnMuaWQsIHVzZXIuaWQpKS5ydW4oKTtcblx0fVxuXHRzdGF0aWMgZ2V0Q2hhcmFjdGVyKHVzZXIsIGluZGV4KSB7XG5cdFx0aWYgKCF1c2VyLmNoYXJhY3RlcklEcykgcmV0dXJuIHZvaWQgMDtcblx0XHRpZiAoaW5kZXggPj0gdXNlci5jaGFyYWN0ZXJJRHMubGVuZ3RoKSByZXR1cm4gdm9pZCAwO1xuXHRcdHJldHVybiBDaGFyYWN0ZXJIZWxwZXIuZmluZCh1c2VyLmNoYXJhY3RlcklEc1tpbmRleF0pO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IFVzZXJIZWxwZXIgfTsiLAogICAgImltcG9ydCB7IHJlc3VtZUNvbW1hbmRzIH0gZnJvbSBcIi4uL3NjaGVtYS5qc1wiO1xuaW1wb3J0IHsgZGIgfSBmcm9tIFwiLi4vaW5kZXguanNcIjtcbmltcG9ydCB7IGVxIH0gZnJvbSBcImRyaXp6bGUtb3JtXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZGIvbW9kZWxzL3Jlc3VtZS1jb21tYW5kLm1vZGVsLnRzXG52YXIgUmVzdW1lQ29tbWFuZCA9IGNsYXNzIFJlc3VtZUNvbW1hbmQge1xuXHRpZDtcblx0Y29tbWFuZDtcblx0cGFyYW1zO1xuXHRjb250ZXh0O1xuXHRjcmVhdGVkID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7XG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHRoaXMuY3JlYXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpO1xuXHR9XG5cdHN0YXRpYyBmaW5kKG1lc3NhZ2VJZCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20ocmVzdW1lQ29tbWFuZHMpLndoZXJlKGVxKHJlc3VtZUNvbW1hbmRzLmlkLCBtZXNzYWdlSWQpKS5nZXQoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGcm9tUXVlcnkocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlKG1lc3NhZ2VJZCwgY29tbWFuZCwgcGFyYW1zID0ge30sIGNvbnRleHQgPSB7fSkge1xuXHRcdGNvbnN0IHJlc3VtZSA9IG5ldyBSZXN1bWVDb21tYW5kKCk7XG5cdFx0cmVzdW1lLmlkID0gbWVzc2FnZUlkO1xuXHRcdHJlc3VtZS5jb21tYW5kID0gY29tbWFuZDtcblx0XHRyZXN1bWUucGFyYW1zID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcblx0XHRyZXN1bWUuY29udGV4dCA9IEpTT04uc3RyaW5naWZ5KGNvbnRleHQpO1xuXHRcdHJldHVybiByZXN1bWU7XG5cdH1cblx0c3RhdGljIGNyZWF0ZUZyb21RdWVyeShxdWVyeSkge1xuXHRcdGlmICghcXVlcnkpIHJldHVybiBudWxsO1xuXHRcdGNvbnN0IHJlc3VtZSA9IG5ldyBSZXN1bWVDb21tYW5kKCk7XG5cdFx0cmVzdW1lLmlkID0gcXVlcnkuaWQ7XG5cdFx0cmVzdW1lLmNvbW1hbmQgPSBxdWVyeS5jb21tYW5kO1xuXHRcdHJlc3VtZS5wYXJhbXMgPSBxdWVyeS5wYXJhbXM7XG5cdFx0cmVzdW1lLmNvbnRleHQgPSBxdWVyeS5jb250ZXh0O1xuXHRcdHJlc3VtZS5jcmVhdGVkID0gcXVlcnkuY3JlYXRlZDtcblx0XHRyZXR1cm4gcmVzdW1lO1xuXHR9XG5cdHNhdmUoKSB7XG5cdFx0ZGIuaW5zZXJ0KHJlc3VtZUNvbW1hbmRzKS52YWx1ZXMoe1xuXHRcdFx0aWQ6IHRoaXMuaWQsXG5cdFx0XHRjb21tYW5kOiB0aGlzLmNvbW1hbmQsXG5cdFx0XHRwYXJhbXM6IHRoaXMucGFyYW1zLFxuXHRcdFx0Y29udGV4dDogdGhpcy5jb250ZXh0LFxuXHRcdFx0Y3JlYXRlZEF0OiB0aGlzLmNyZWF0ZWQuZ2V0VGltZSgpXG5cdFx0fSkub25Db25mbGljdERvVXBkYXRlKHtcblx0XHRcdHRhcmdldDogcmVzdW1lQ29tbWFuZHMuaWQsXG5cdFx0XHRzZXQ6IHtcblx0XHRcdFx0Y29tbWFuZDogdGhpcy5jb21tYW5kLFxuXHRcdFx0XHRwYXJhbXM6IHRoaXMucGFyYW1zLFxuXHRcdFx0XHRjb250ZXh0OiB0aGlzLmNvbnRleHRcblx0XHRcdH1cblx0XHR9KS5ydW4oKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHRkZWxldGUoKSB7XG5cdFx0ZGIuZGVsZXRlKHJlc3VtZUNvbW1hbmRzKS53aGVyZShlcShyZXN1bWVDb21tYW5kcy5pZCwgdGhpcy5pZCkpLnJ1bigpO1xuXHR9XG5cdHN0YXRpYyBkZWxldGUobWVzc2FnZUlkKSB7XG5cdFx0ZGIuZGVsZXRlKHJlc3VtZUNvbW1hbmRzKS53aGVyZShlcShyZXN1bWVDb21tYW5kcy5pZCwgbWVzc2FnZUlkKSkucnVuKCk7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgUmVzdW1lQ29tbWFuZCB9OyIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgQ2hhcmFjdGVySGVscGVyIH0gZnJvbSBcIi4vY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBVc2VySGVscGVyIH0gZnJvbSBcIi4vdXNlci5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgUmVzdW1lQ29tbWFuZCB9IGZyb20gXCIuL3Jlc3VtZS1jb21tYW5kLm1vZGVsLmpzXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZGIvbW9kZWxzL2luZGV4LnRzXG52YXIgbW9kZWxzX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KG1vZGVsc19leHBvcnRzLCB7XG5cdENoYXJhY3RlckhlbHBlcjogKCkgPT4gQ2hhcmFjdGVySGVscGVyLFxuXHRSZXN1bWVDb21tYW5kOiAoKSA9PiBSZXN1bWVDb21tYW5kLFxuXHRVc2VySGVscGVyOiAoKSA9PiBVc2VySGVscGVyXG59KTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBtb2RlbHNfZXhwb3J0cyB9OyIsCiAgICAiaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tIFwiYnVuOnNxbGl0ZVwiO1xuaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IERlZmF1bHRMb2dnZXIgfSBmcm9tIFwiLi4vbG9nZ2VyLmpzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVUYWJsZVJlbGF0aW9uc0hlbHBlcnMsXG4gIGV4dHJhY3RUYWJsZXNSZWxhdGlvbmFsQ29uZmlnXG59IGZyb20gXCIuLi9yZWxhdGlvbnMuanNcIjtcbmltcG9ydCB7IEJhc2VTUUxpdGVEYXRhYmFzZSB9IGZyb20gXCIuLi9zcWxpdGUtY29yZS9kYi5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlU3luY0RpYWxlY3QgfSBmcm9tIFwiLi4vc3FsaXRlLWNvcmUvZGlhbGVjdC5qc1wiO1xuaW1wb3J0IHsgaXNDb25maWcgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUJ1blNlc3Npb24gfSBmcm9tIFwiLi9zZXNzaW9uLmpzXCI7XG5jbGFzcyBCdW5TUUxpdGVEYXRhYmFzZSBleHRlbmRzIEJhc2VTUUxpdGVEYXRhYmFzZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkJ1blNRTGl0ZURhdGFiYXNlXCI7XG59XG5mdW5jdGlvbiBjb25zdHJ1Y3QoY2xpZW50LCBjb25maWcgPSB7fSkge1xuICBjb25zdCBkaWFsZWN0ID0gbmV3IFNRTGl0ZVN5bmNEaWFsZWN0KHsgY2FzaW5nOiBjb25maWcuY2FzaW5nIH0pO1xuICBsZXQgbG9nZ2VyO1xuICBpZiAoY29uZmlnLmxvZ2dlciA9PT0gdHJ1ZSkge1xuICAgIGxvZ2dlciA9IG5ldyBEZWZhdWx0TG9nZ2VyKCk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmxvZ2dlciAhPT0gZmFsc2UpIHtcbiAgICBsb2dnZXIgPSBjb25maWcubG9nZ2VyO1xuICB9XG4gIGxldCBzY2hlbWE7XG4gIGlmIChjb25maWcuc2NoZW1hKSB7XG4gICAgY29uc3QgdGFibGVzQ29uZmlnID0gZXh0cmFjdFRhYmxlc1JlbGF0aW9uYWxDb25maWcoXG4gICAgICBjb25maWcuc2NoZW1hLFxuICAgICAgY3JlYXRlVGFibGVSZWxhdGlvbnNIZWxwZXJzXG4gICAgKTtcbiAgICBzY2hlbWEgPSB7XG4gICAgICBmdWxsU2NoZW1hOiBjb25maWcuc2NoZW1hLFxuICAgICAgc2NoZW1hOiB0YWJsZXNDb25maWcudGFibGVzLFxuICAgICAgdGFibGVOYW1lc01hcDogdGFibGVzQ29uZmlnLnRhYmxlTmFtZXNNYXBcbiAgICB9O1xuICB9XG4gIGNvbnN0IHNlc3Npb24gPSBuZXcgU1FMaXRlQnVuU2Vzc2lvbihjbGllbnQsIGRpYWxlY3QsIHNjaGVtYSwgeyBsb2dnZXIgfSk7XG4gIGNvbnN0IGRiID0gbmV3IEJ1blNRTGl0ZURhdGFiYXNlKFwic3luY1wiLCBkaWFsZWN0LCBzZXNzaW9uLCBzY2hlbWEpO1xuICBkYi4kY2xpZW50ID0gY2xpZW50O1xuICByZXR1cm4gZGI7XG59XG5mdW5jdGlvbiBkcml6emxlKC4uLnBhcmFtcykge1xuICBpZiAocGFyYW1zWzBdID09PSB2b2lkIDAgfHwgdHlwZW9mIHBhcmFtc1swXSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGluc3RhbmNlID0gcGFyYW1zWzBdID09PSB2b2lkIDAgPyBuZXcgRGF0YWJhc2UoKSA6IG5ldyBEYXRhYmFzZShwYXJhbXNbMF0pO1xuICAgIHJldHVybiBjb25zdHJ1Y3QoaW5zdGFuY2UsIHBhcmFtc1sxXSk7XG4gIH1cbiAgaWYgKGlzQ29uZmlnKHBhcmFtc1swXSkpIHtcbiAgICBjb25zdCB7IGNvbm5lY3Rpb24sIGNsaWVudCwgLi4uZHJpenpsZUNvbmZpZyB9ID0gcGFyYW1zWzBdO1xuICAgIGlmIChjbGllbnQpIHJldHVybiBjb25zdHJ1Y3QoY2xpZW50LCBkcml6emxlQ29uZmlnKTtcbiAgICBpZiAodHlwZW9mIGNvbm5lY3Rpb24gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IHsgc291cmNlLCAuLi5vcHRzIH0gPSBjb25uZWN0aW9uO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC52YWx1ZXMob3B0cykuZmlsdGVyKCh2KSA9PiB2ICE9PSB2b2lkIDApLmxlbmd0aCA/IG9wdHMgOiB2b2lkIDA7XG4gICAgICBjb25zdCBpbnN0YW5jZTIgPSBuZXcgRGF0YWJhc2Uoc291cmNlLCBvcHRpb25zKTtcbiAgICAgIHJldHVybiBjb25zdHJ1Y3QoaW5zdGFuY2UyLCBkcml6emxlQ29uZmlnKTtcbiAgICB9XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRGF0YWJhc2UoY29ubmVjdGlvbik7XG4gICAgcmV0dXJuIGNvbnN0cnVjdChpbnN0YW5jZSwgZHJpenpsZUNvbmZpZyk7XG4gIH1cbiAgcmV0dXJuIGNvbnN0cnVjdChwYXJhbXNbMF0sIHBhcmFtc1sxXSk7XG59XG4oKGRyaXp6bGUyKSA9PiB7XG4gIGZ1bmN0aW9uIG1vY2soY29uZmlnKSB7XG4gICAgcmV0dXJuIGNvbnN0cnVjdCh7fSwgY29uZmlnKTtcbiAgfVxuICBkcml6emxlMi5tb2NrID0gbW9jaztcbn0pKGRyaXp6bGUgfHwgKGRyaXp6bGUgPSB7fSkpO1xuZXhwb3J0IHtcbiAgQnVuU1FMaXRlRGF0YWJhc2UsXG4gIGRyaXp6bGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kcml2ZXIuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgTm9vcExvZ2dlciB9IGZyb20gXCIuLi9sb2dnZXIuanNcIjtcbmltcG9ydCB7IGZpbGxQbGFjZWhvbGRlcnMsIHNxbCB9IGZyb20gXCIuLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVUcmFuc2FjdGlvbiB9IGZyb20gXCIuLi9zcWxpdGUtY29yZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlUHJlcGFyZWRRdWVyeSBhcyBQcmVwYXJlZFF1ZXJ5QmFzZSwgU1FMaXRlU2Vzc2lvbiB9IGZyb20gXCIuLi9zcWxpdGUtY29yZS9zZXNzaW9uLmpzXCI7XG5pbXBvcnQgeyBtYXBSZXN1bHRSb3cgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmNsYXNzIFNRTGl0ZUJ1blNlc3Npb24gZXh0ZW5kcyBTUUxpdGVTZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoY2xpZW50LCBkaWFsZWN0LCBzY2hlbWEsIG9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKGRpYWxlY3QpO1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgPz8gbmV3IE5vb3BMb2dnZXIoKTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCdW5TZXNzaW9uXCI7XG4gIGxvZ2dlcjtcbiAgZXhlYyhxdWVyeSkge1xuICAgIHRoaXMuY2xpZW50LmV4ZWMocXVlcnkpO1xuICB9XG4gIHByZXBhcmVRdWVyeShxdWVyeSwgZmllbGRzLCBleGVjdXRlTWV0aG9kLCBpc1Jlc3BvbnNlSW5BcnJheU1vZGUsIGN1c3RvbVJlc3VsdE1hcHBlcikge1xuICAgIGNvbnN0IHN0bXQgPSB0aGlzLmNsaWVudC5wcmVwYXJlKHF1ZXJ5LnNxbCk7XG4gICAgcmV0dXJuIG5ldyBQcmVwYXJlZFF1ZXJ5KFxuICAgICAgc3RtdCxcbiAgICAgIHF1ZXJ5LFxuICAgICAgdGhpcy5sb2dnZXIsXG4gICAgICBmaWVsZHMsXG4gICAgICBleGVjdXRlTWV0aG9kLFxuICAgICAgaXNSZXNwb25zZUluQXJyYXlNb2RlLFxuICAgICAgY3VzdG9tUmVzdWx0TWFwcGVyXG4gICAgKTtcbiAgfVxuICB0cmFuc2FjdGlvbih0cmFuc2FjdGlvbiwgY29uZmlnID0ge30pIHtcbiAgICBjb25zdCB0eCA9IG5ldyBTUUxpdGVCdW5UcmFuc2FjdGlvbihcInN5bmNcIiwgdGhpcy5kaWFsZWN0LCB0aGlzLCB0aGlzLnNjaGVtYSk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBjb25zdCBuYXRpdmVUeCA9IHRoaXMuY2xpZW50LnRyYW5zYWN0aW9uKCgpID0+IHtcbiAgICAgIHJlc3VsdCA9IHRyYW5zYWN0aW9uKHR4KTtcbiAgICB9KTtcbiAgICBuYXRpdmVUeFtjb25maWcuYmVoYXZpb3IgPz8gXCJkZWZlcnJlZFwiXSgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJ1blRyYW5zYWN0aW9uIGV4dGVuZHMgU1FMaXRlVHJhbnNhY3Rpb24ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCdW5UcmFuc2FjdGlvblwiO1xuICB0cmFuc2FjdGlvbih0cmFuc2FjdGlvbikge1xuICAgIGNvbnN0IHNhdmVwb2ludE5hbWUgPSBgc3Ake3RoaXMubmVzdGVkSW5kZXh9YDtcbiAgICBjb25zdCB0eCA9IG5ldyBTUUxpdGVCdW5UcmFuc2FjdGlvbihcInN5bmNcIiwgdGhpcy5kaWFsZWN0LCB0aGlzLnNlc3Npb24sIHRoaXMuc2NoZW1hLCB0aGlzLm5lc3RlZEluZGV4ICsgMSk7XG4gICAgdGhpcy5zZXNzaW9uLnJ1bihzcWwucmF3KGBzYXZlcG9pbnQgJHtzYXZlcG9pbnROYW1lfWApKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdHJhbnNhY3Rpb24odHgpO1xuICAgICAgdGhpcy5zZXNzaW9uLnJ1bihzcWwucmF3KGByZWxlYXNlIHNhdmVwb2ludCAke3NhdmVwb2ludE5hbWV9YCkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc2Vzc2lvbi5ydW4oc3FsLnJhdyhgcm9sbGJhY2sgdG8gc2F2ZXBvaW50ICR7c2F2ZXBvaW50TmFtZX1gKSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG59XG5jbGFzcyBQcmVwYXJlZFF1ZXJ5IGV4dGVuZHMgUHJlcGFyZWRRdWVyeUJhc2Uge1xuICBjb25zdHJ1Y3RvcihzdG10LCBxdWVyeSwgbG9nZ2VyLCBmaWVsZHMsIGV4ZWN1dGVNZXRob2QsIF9pc1Jlc3BvbnNlSW5BcnJheU1vZGUsIGN1c3RvbVJlc3VsdE1hcHBlcikge1xuICAgIHN1cGVyKFwic3luY1wiLCBleGVjdXRlTWV0aG9kLCBxdWVyeSk7XG4gICAgdGhpcy5zdG10ID0gc3RtdDtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgICB0aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgICB0aGlzLl9pc1Jlc3BvbnNlSW5BcnJheU1vZGUgPSBfaXNSZXNwb25zZUluQXJyYXlNb2RlO1xuICAgIHRoaXMuY3VzdG9tUmVzdWx0TWFwcGVyID0gY3VzdG9tUmVzdWx0TWFwcGVyO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJ1blByZXBhcmVkUXVlcnlcIjtcbiAgcnVuKHBsYWNlaG9sZGVyVmFsdWVzKSB7XG4gICAgY29uc3QgcGFyYW1zID0gZmlsbFBsYWNlaG9sZGVycyh0aGlzLnF1ZXJ5LnBhcmFtcywgcGxhY2Vob2xkZXJWYWx1ZXMgPz8ge30pO1xuICAgIHRoaXMubG9nZ2VyLmxvZ1F1ZXJ5KHRoaXMucXVlcnkuc3FsLCBwYXJhbXMpO1xuICAgIHJldHVybiB0aGlzLnN0bXQucnVuKC4uLnBhcmFtcyk7XG4gIH1cbiAgYWxsKHBsYWNlaG9sZGVyVmFsdWVzKSB7XG4gICAgY29uc3QgeyBmaWVsZHMsIHF1ZXJ5LCBsb2dnZXIsIGpvaW5zTm90TnVsbGFibGVNYXAsIHN0bXQsIGN1c3RvbVJlc3VsdE1hcHBlciB9ID0gdGhpcztcbiAgICBpZiAoIWZpZWxkcyAmJiAhY3VzdG9tUmVzdWx0TWFwcGVyKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBmaWxsUGxhY2Vob2xkZXJzKHF1ZXJ5LnBhcmFtcywgcGxhY2Vob2xkZXJWYWx1ZXMgPz8ge30pO1xuICAgICAgbG9nZ2VyLmxvZ1F1ZXJ5KHF1ZXJ5LnNxbCwgcGFyYW1zKTtcbiAgICAgIHJldHVybiBzdG10LmFsbCguLi5wYXJhbXMpO1xuICAgIH1cbiAgICBjb25zdCByb3dzID0gdGhpcy52YWx1ZXMocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICAgIGlmIChjdXN0b21SZXN1bHRNYXBwZXIpIHtcbiAgICAgIHJldHVybiBjdXN0b21SZXN1bHRNYXBwZXIocm93cyk7XG4gICAgfVxuICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiBtYXBSZXN1bHRSb3coZmllbGRzLCByb3csIGpvaW5zTm90TnVsbGFibGVNYXApKTtcbiAgfVxuICBnZXQocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBmaWxsUGxhY2Vob2xkZXJzKHRoaXMucXVlcnkucGFyYW1zLCBwbGFjZWhvbGRlclZhbHVlcyA/PyB7fSk7XG4gICAgdGhpcy5sb2dnZXIubG9nUXVlcnkodGhpcy5xdWVyeS5zcWwsIHBhcmFtcyk7XG4gICAgY29uc3Qgcm93ID0gdGhpcy5zdG10LnZhbHVlcyguLi5wYXJhbXMpWzBdO1xuICAgIGlmICghcm93KSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBjb25zdCB7IGZpZWxkcywgam9pbnNOb3ROdWxsYWJsZU1hcCwgY3VzdG9tUmVzdWx0TWFwcGVyIH0gPSB0aGlzO1xuICAgIGlmICghZmllbGRzICYmICFjdXN0b21SZXN1bHRNYXBwZXIpIHtcbiAgICAgIHJldHVybiByb3c7XG4gICAgfVxuICAgIGlmIChjdXN0b21SZXN1bHRNYXBwZXIpIHtcbiAgICAgIHJldHVybiBjdXN0b21SZXN1bHRNYXBwZXIoW3Jvd10pO1xuICAgIH1cbiAgICByZXR1cm4gbWFwUmVzdWx0Um93KGZpZWxkcywgcm93LCBqb2luc05vdE51bGxhYmxlTWFwKTtcbiAgfVxuICB2YWx1ZXMocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBmaWxsUGxhY2Vob2xkZXJzKHRoaXMucXVlcnkucGFyYW1zLCBwbGFjZWhvbGRlclZhbHVlcyA/PyB7fSk7XG4gICAgdGhpcy5sb2dnZXIubG9nUXVlcnkodGhpcy5xdWVyeS5zcWwsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXMuc3RtdC52YWx1ZXMoLi4ucGFyYW1zKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGlzUmVzcG9uc2VJbkFycmF5TW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZXNwb25zZUluQXJyYXlNb2RlO1xuICB9XG59XG5leHBvcnQge1xuICBQcmVwYXJlZFF1ZXJ5LFxuICBTUUxpdGVCdW5TZXNzaW9uLFxuICBTUUxpdGVCdW5UcmFuc2FjdGlvblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlc3Npb24uanMubWFwIiwKICAgICJpbXBvcnQgeyBjaGFyYWN0ZXJzLCBtaW5pbmdGbGVldFBhcnRpY2lwYW50cywgbWluaW5nRmxlZXRzLCByZXN1bWVDb21tYW5kcywgc2NoZW1hX2V4cG9ydHMsIHVzZXJzIH0gZnJvbSBcIi4vc2NoZW1hLmpzXCI7XG5pbXBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIgfSBmcm9tIFwiLi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBVc2VySGVscGVyIH0gZnJvbSBcIi4vbW9kZWxzL3VzZXIubW9kZWwuanNcIjtcbmltcG9ydCB7IFJlc3VtZUNvbW1hbmQgfSBmcm9tIFwiLi9tb2RlbHMvcmVzdW1lLWNvbW1hbmQubW9kZWwuanNcIjtcbmltcG9ydCB7IG1vZGVsc19leHBvcnRzIH0gZnJvbSBcIi4vbW9kZWxzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBkcml6emxlIH0gZnJvbSBcImRyaXp6bGUtb3JtL2J1bi1zcWxpdGVcIjtcbmltcG9ydCB7IERhdGFiYXNlIH0gZnJvbSBcImJ1bjpzcWxpdGVcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZGIvaW5kZXgudHNcbmNvbnN0IERCX1BBVEggPSBwcm9jZXNzLmVudi5BVVRIX0RCX1BBVEggfHwgam9pbihwcm9jZXNzLmN3ZCgpLCBcIi4uLy4uL2RiL2tpdHRlbi5kYlwiKTtcbmNvbnNvbGUubG9nKFwiVXNpbmcgREJfUEFUSDpcIiwgREJfUEFUSCk7XG5jb25zdCBzcWxpdGUgPSBuZXcgRGF0YWJhc2UoREJfUEFUSCk7XG5jb25zdCBkYiA9IGRyaXp6bGUoc3FsaXRlLCB7IHNjaGVtYToge1xuXHR1c2Vycyxcblx0Y2hhcmFjdGVycyxcblx0cmVzdW1lQ29tbWFuZHMsXG5cdG1pbmluZ0ZsZWV0cyxcblx0bWluaW5nRmxlZXRQYXJ0aWNpcGFudHNcbn0gfSk7XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgQ2hhcmFjdGVySGVscGVyLCBEQl9QQVRILCBSZXN1bWVDb21tYW5kLCBVc2VySGVscGVyLCBkYiwgbW9kZWxzX2V4cG9ydHMgYXMgbW9kZWxzLCBzY2hlbWFfZXhwb3J0cyBhcyBzY2hlbWEgfTsiLAogICAgImltcG9ydCB7IGNoYXJhY3RlcnMgfSBmcm9tIFwiLi4vc2NoZW1hLmpzXCI7XG5pbXBvcnQgeyByZWZyZXNoLCB2YWxpZGF0ZVRva2VuIH0gZnJvbSBcIi4uLy4uL2VzaS9hdXRoLmpzXCI7XG5pbXBvcnQgeyBkYiB9IGZyb20gXCIuLi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgYW5kLCBlcSB9IGZyb20gXCJkcml6emxlLW9ybVwiO1xuaW1wb3J0IHsgand0RGVjb2RlIH0gZnJvbSBcImp3dC1kZWNvZGVcIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLnRzXG52YXIgQ2hhcmFjdGVySGVscGVyID0gY2xhc3MgQ2hhcmFjdGVySGVscGVyIHtcblx0c3RhdGljIGhhc1ZhbGlkVG9rZW4oY2hhcmFjdGVyKSB7XG5cdFx0cmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpIDwgY2hhcmFjdGVyLmV4cGlyZXNBdDtcblx0fVxuXHRzdGF0aWMgZ2V0U2NvcGVzKGNoYXJhY3Rlcikge1xuXHRcdGNvbnN0IGRlY29kZWQgPSBqd3REZWNvZGUoY2hhcmFjdGVyLmFjY2Vzc1Rva2VuKTtcblx0XHRyZXR1cm4gdHlwZW9mIGRlY29kZWQuc2NwID09PSBcInN0cmluZ1wiID8gW2RlY29kZWQuc2NwXSA6IGRlY29kZWQuc2NwO1xuXHR9XG5cdHN0YXRpYyBoYXNPbmx5UHVibGljU2NvcGUoY2hhcmFjdGVyKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2NvcGVzKGNoYXJhY3RlcikubGVuZ3RoID09PSAxICYmIHRoaXMuaGFzU2NvcGUoY2hhcmFjdGVyLCBcInB1YmxpY0RhdGFcIik7XG5cdH1cblx0c3RhdGljIGdldFRva2VucyhjaGFyYWN0ZXIpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0YWNjZXNzX3Rva2VuOiBjaGFyYWN0ZXIuYWNjZXNzVG9rZW4sXG5cdFx0XHRyZWZyZXNoX3Rva2VuOiBjaGFyYWN0ZXIucmVmcmVzaFRva2VuLFxuXHRcdFx0ZXhwaXJlc19pbjogKGNoYXJhY3Rlci5leHBpcmVzQXQuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAxZTNcblx0XHR9O1xuXHR9XG5cdHN0YXRpYyBoYXNTY29wZShjaGFyYWN0ZXIsIHNjb3BlKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2NvcGVzKGNoYXJhY3RlcikuaW5jbHVkZXMoc2NvcGUpO1xuXHR9XG5cdHN0YXRpYyBoYXNBbGxTY29wZXMoY2hhcmFjdGVyLCBzY29wZXMpIHtcblx0XHRjb25zdCBoYXMgPSB0aGlzLmdldFNjb3BlcyhjaGFyYWN0ZXIpO1xuXHRcdHJldHVybiBzY29wZXMuZXZlcnkoKHNjb3BlKSA9PiBoYXMuaW5jbHVkZXMoc2NvcGUpKTtcblx0fVxuXHRzdGF0aWMgZmluZChpZCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20oY2hhcmFjdGVycykud2hlcmUoZXEoY2hhcmFjdGVycy5pZCwgaWQpKS5saW1pdCgxKS5nZXQoKTtcblx0XHRjb25zdCBjID0gdGhpcy5jcmVhdGVDaGFyYWN0ZXJzKHJlc3VsdCk7XG5cdFx0cmV0dXJuIGMgPyBjWzBdIDogdm9pZCAwO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlVc2VyKHVzZXIpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3QoKS5mcm9tKGNoYXJhY3RlcnMpLndoZXJlKGVxKGNoYXJhY3RlcnMudXNlcklELCB1c2VyLmlkKSkuYWxsKCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ2hhcmFjdGVycyhyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlVc2VyQW5kRXZlSUQodXNlcklELCBldmVJRCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20oY2hhcmFjdGVycykud2hlcmUoYW5kKGVxKGNoYXJhY3RlcnMudXNlcklELCB1c2VySUQpLCBlcShjaGFyYWN0ZXJzLmV2ZUlELCBldmVJRCkpKS5saW1pdCgxKS5nZXQoKTtcblx0XHRjb25zdCBjID0gdGhpcy5jcmVhdGVDaGFyYWN0ZXJzKHJlc3VsdCk7XG5cdFx0cmV0dXJuIGMgPyBjWzBdIDogdm9pZCAwO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlOYW1lKHVzZXJJRCwgbmFtZSkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20oY2hhcmFjdGVycykud2hlcmUoYW5kKGVxKGNoYXJhY3RlcnMubmFtZSwgbmFtZSksIGVxKGNoYXJhY3RlcnMudXNlcklELCB1c2VySUQpKSkubGltaXQoMSkuZ2V0KCk7XG5cdFx0Y29uc3QgYyA9IHRoaXMuY3JlYXRlQ2hhcmFjdGVycyhyZXN1bHQpO1xuXHRcdHJldHVybiBjID8gY1swXSA6IHZvaWQgMDtcblx0fVxuXHRzdGF0aWMgZmluZEFsbCgpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3QoKS5mcm9tKGNoYXJhY3RlcnMpLmFsbCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUNoYXJhY3RlcnMocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlKGV2ZUlELCBuYW1lLCB1c2VyLCB0b2tlbnMpIHtcblx0XHRyZXR1cm4gdGhpcy5zYXZlKHtcblx0XHRcdGV2ZUlELFxuXHRcdFx0dXNlcklEOiB1c2VyLmlkLFxuXHRcdFx0YWNjZXNzVG9rZW46IHRva2Vucy5hY2Nlc3NfdG9rZW4sXG5cdFx0XHRleHBpcmVzQXQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSh0b2tlbnMuZXhwaXJlc19pbiAqIDFlMyksXG5cdFx0XHRyZWZyZXNoVG9rZW46IHRva2Vucy5yZWZyZXNoX3Rva2VuLFxuXHRcdFx0bmFtZSxcblx0XHRcdGNyZWF0ZWRBdDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKClcblx0XHR9KTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlQ2hhcmFjdGVycyhxdWVyeSkge1xuXHRcdGlmICghcXVlcnkpIHJldHVybiBbXTtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShxdWVyeSkpIHJldHVybiBxdWVyeS5tYXAoKGNoYXJhY3RlcikgPT4ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aWQ6IGNoYXJhY3Rlci5pZCxcblx0XHRcdFx0ZXZlSUQ6IGNoYXJhY3Rlci5ldmVJRCxcblx0XHRcdFx0dXNlcklEOiBjaGFyYWN0ZXIudXNlcklELFxuXHRcdFx0XHRhY2Nlc3NUb2tlbjogY2hhcmFjdGVyLmFjY2Vzc1Rva2VuLFxuXHRcdFx0XHRleHBpcmVzQXQ6IG5ldyBEYXRlKGNoYXJhY3Rlci5leHBpcmVzQXQpLFxuXHRcdFx0XHRyZWZyZXNoVG9rZW46IGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4sXG5cdFx0XHRcdG5hbWU6IGNoYXJhY3Rlci5uYW1lLFxuXHRcdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKGNoYXJhY3Rlci5jcmVhdGVkQXQpLFxuXHRcdFx0XHR1cGRhdGVkQXQ6IG5ldyBEYXRlKGNoYXJhY3Rlci51cGRhdGVkQXQpXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHRcdGVsc2UgcmV0dXJuIFt7XG5cdFx0XHRpZDogcXVlcnkuaWQsXG5cdFx0XHRldmVJRDogcXVlcnkuZXZlSUQsXG5cdFx0XHR1c2VySUQ6IHF1ZXJ5LnVzZXJJRCxcblx0XHRcdGFjY2Vzc1Rva2VuOiBxdWVyeS5hY2Nlc3NUb2tlbixcblx0XHRcdGV4cGlyZXNBdDogbmV3IERhdGUocXVlcnkuZXhwaXJlc0F0KSxcblx0XHRcdHJlZnJlc2hUb2tlbjogcXVlcnkucmVmcmVzaFRva2VuLFxuXHRcdFx0bmFtZTogcXVlcnkubmFtZSxcblx0XHRcdGNyZWF0ZWRBdDogbmV3IERhdGUocXVlcnkuY3JlYXRlZEF0KSxcblx0XHRcdHVwZGF0ZWRBdDogbmV3IERhdGUocXVlcnkudXBkYXRlZEF0KVxuXHRcdH1dO1xuXHR9XG5cdHN0YXRpYyBzYXZlKGNoYXJhY3Rlcikge1xuXHRcdGRiLmluc2VydChjaGFyYWN0ZXJzKS52YWx1ZXMoe1xuXHRcdFx0aWQ6IGNoYXJhY3Rlci5pZCxcblx0XHRcdGV2ZUlEOiBjaGFyYWN0ZXIuZXZlSUQsXG5cdFx0XHR1c2VySUQ6IGNoYXJhY3Rlci51c2VySUQsXG5cdFx0XHRuYW1lOiBjaGFyYWN0ZXIubmFtZSxcblx0XHRcdGFjY2Vzc1Rva2VuOiBjaGFyYWN0ZXIuYWNjZXNzVG9rZW4sXG5cdFx0XHRleHBpcmVzQXQ6IGNoYXJhY3Rlci5leHBpcmVzQXQuZ2V0VGltZSgpLFxuXHRcdFx0cmVmcmVzaFRva2VuOiBjaGFyYWN0ZXIucmVmcmVzaFRva2VuLFxuXHRcdFx0Y3JlYXRlZEF0OiBEYXRlLm5vdygpLFxuXHRcdFx0dXBkYXRlZEF0OiBEYXRlLm5vdygpXG5cdFx0fSkub25Db25mbGljdERvVXBkYXRlKHtcblx0XHRcdHRhcmdldDogY2hhcmFjdGVycy5pZCxcblx0XHRcdHNldDoge1xuXHRcdFx0XHRldmVJRDogY2hhcmFjdGVyLmV2ZUlELFxuXHRcdFx0XHR1c2VySUQ6IGNoYXJhY3Rlci51c2VySUQsXG5cdFx0XHRcdG5hbWU6IGNoYXJhY3Rlci5uYW1lLFxuXHRcdFx0XHRhY2Nlc3NUb2tlbjogY2hhcmFjdGVyLmFjY2Vzc1Rva2VuLFxuXHRcdFx0XHRleHBpcmVzQXQ6IGNoYXJhY3Rlci5leHBpcmVzQXQuZ2V0VGltZSgpLFxuXHRcdFx0XHRyZWZyZXNoVG9rZW46IGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4sXG5cdFx0XHRcdHVwZGF0ZWRBdDogRGF0ZS5ub3coKVxuXHRcdFx0fVxuXHRcdH0pLnJ1bigpO1xuXHRcdHJldHVybiBDaGFyYWN0ZXJIZWxwZXIuZmluZEJ5VXNlckFuZEV2ZUlEKGNoYXJhY3Rlci51c2VySUQsIGNoYXJhY3Rlci5ldmVJRCk7XG5cdH1cblx0c3RhdGljIGRlbGV0ZShjaGFyYWN0ZXIpIHtcblx0XHRkYi5kZWxldGUoY2hhcmFjdGVycykud2hlcmUoZXEoY2hhcmFjdGVycy5pZCwgY2hhcmFjdGVyLmlkKSkucnVuKCk7XG5cdH1cblx0c3RhdGljIGFzeW5jIHJlZnJlc2hUb2tlbnMoY2hhcmFjdGVyLCBzY29wZXMpIHtcblx0XHRjb25zdCB0b2tlbnMgPSBhd2FpdCByZWZyZXNoKHsgcmVmcmVzaF90b2tlbjogY2hhcmFjdGVyLnJlZnJlc2hUb2tlbiB9LCBzY29wZXMpO1xuXHRcdGNvbnN0IGRlY29kZWQgPSBhd2FpdCB2YWxpZGF0ZVRva2VuKHRva2Vucy5hY2Nlc3NfdG9rZW4pO1xuXHRcdGlmICghZGVjb2RlZCkge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHZhbGlkYXRlIHRva2VuIGZvciBjaGFyYWN0ZXIgJHtjaGFyYWN0ZXIuZXZlSUR9YCk7XG5cdFx0XHRyZXR1cm4gY2hhcmFjdGVyO1xuXHRcdH1cblx0XHRjaGFyYWN0ZXIuYWNjZXNzVG9rZW4gPSB0b2tlbnMuYWNjZXNzX3Rva2VuO1xuXHRcdGNoYXJhY3Rlci5leHBpcmVzQXQgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgdG9rZW5zLmV4cGlyZXNfaW4gKiAxZTMpO1xuXHRcdGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4gPSB0b2tlbnMucmVmcmVzaF90b2tlbjtcblx0XHR0aGlzLnNhdmUoY2hhcmFjdGVyKTtcblx0XHRyZXR1cm4gY2hhcmFjdGVyO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IENoYXJhY3RlckhlbHBlciB9OyIsCiAgICAiaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gXCIuL29wdGlvbnMuanNcIjtcbmltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuLi9kYi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgXCIuLi9kYi9tb2RlbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IEVTSV9MQVRFU1RfVVJMIH0gZnJvbSBcIi4vc2NvcGVzLmpzXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZXNpL2ZldGNoLnRzXG5jb25zdCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5mdW5jdGlvbiBjbGVhbkNhY2hlKCkge1xuXHRjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBjYWNoZSkgaWYgKHZhbHVlLmV4cGlyZXMgPCBub3cpIGNhY2hlLmRlbGV0ZShrZXkpO1xufVxuc2V0SW50ZXJ2YWwoY2xlYW5DYWNoZSwgMWUzICogNjAgKiAxNSk7XG5jb25zdCBkZWZhdWx0Q2FjaGVEdXJhdGlvbiA9IDFlMyAqIDYwICogMzA7XG5hc3luYyBmdW5jdGlvbiBlc2lGZXRjaChwYXRoLCBjaGFyYWN0ZXIsIHsgbWV0aG9kID0gXCJHRVRcIiwgYm9keSwgbm9DYWNoZSA9IGZhbHNlLCBjYWNoZUR1cmF0aW9uID0gZGVmYXVsdENhY2hlRHVyYXRpb24gfSA9IHt9KSB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgaGVhZGVycyA9IHtcblx0XHRcdFwiVXNlci1BZ2VudFwiOiBvcHRpb25zLnVzZXJfYWdlbnQsXG5cdFx0XHRcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuXHRcdH07XG5cdFx0aWYgKGNoYXJhY3Rlcikge1xuXHRcdFx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzVmFsaWRUb2tlbihjaGFyYWN0ZXIpKSB7XG5cdFx0XHRcdGF3YWl0IENoYXJhY3RlckhlbHBlci5yZWZyZXNoVG9rZW5zKGNoYXJhY3Rlcik7XG5cdFx0XHRcdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1ZhbGlkVG9rZW4oY2hhcmFjdGVyKSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCB0b2tlbiBmb3IgY2hhcmFjdGVyOiAke2NoYXJhY3Rlci5ldmVJRH1gKTtcblx0XHRcdH1cblx0XHRcdGhlYWRlcnNbXCJBdXRob3JpemF0aW9uXCJdID0gYEJlYXJlciAke2NoYXJhY3Rlci5hY2Nlc3NUb2tlbn1gO1xuXHRcdH1cblx0XHRjb25zdCBpbml0ID0ge1xuXHRcdFx0aGVhZGVycyxcblx0XHRcdG1ldGhvZDogbWV0aG9kIHx8IFwiR0VUXCIsXG5cdFx0XHRib2R5OiBib2R5IHx8IHZvaWQgMFxuXHRcdH07XG5cdFx0Y29uc3QgdXJsID0gbmV3IFVSTChgJHtFU0lfTEFURVNUX1VSTH0ke3BhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogXCIvXCIgKyBwYXRofWApO1xuXHRcdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiZGF0YXNvdXJjZVwiLCBcInRyYW5xdWlsaXR5XCIpO1xuXHRcdGlmICghbm9DYWNoZSAmJiBpbml0Lm1ldGhvZCA9PT0gXCJHRVRcIikge1xuXHRcdFx0Y29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KHVybC5ocmVmKTtcblx0XHRcdGlmIChjYWNoZWQgJiYgY2FjaGVkPy5leHBpcmVzID4gRGF0ZS5ub3coKSkgcmV0dXJuIGNhY2hlZC5kYXRhO1xuXHRcdH1cblx0XHRjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIGluaXQpO1xuXHRcdGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXHRcdGlmICghcmVzLm9rKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGBFU0kgcmVxdWVzdCBmYWlsdXJlIGF0ICR7cGF0aH0gfCAke3Jlcy5zdGF0dXN9OiR7cmVzLnN0YXR1c1RleHR9ID0+ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YCk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0aWYgKGluaXQubWV0aG9kID09PSBcIkdFVFwiKSBjYWNoZS5zZXQodXJsLmhyZWYsIHtcblx0XHRcdGV4cGlyZXM6IE1hdGgubWF4KHJlcy5oZWFkZXJzLmdldChcImV4cGlyZXNcIikgJiYgbmV3IERhdGUoTnVtYmVyKHJlcy5oZWFkZXJzLmdldChcImV4cGlyZXNcIikgfHwgXCJcIikpLmdldFRpbWUoKSB8fCAwLCBEYXRlLm5vdygpICsgY2FjaGVEdXJhdGlvbiksXG5cdFx0XHRkYXRhXG5cdFx0fSk7XG5cdFx0cmV0dXJuIGRhdGE7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGNvbnNvbGUuZXJyb3IoYEVTSSByZXF1ZXN0IGZhaWx1cmUgYXQgJHtwYXRofSB8ICR7SlNPTi5zdHJpbmdpZnkoZXJyKX1gLCBlcnIpO1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgZXNpRmV0Y2ggfTsiLAogICAgImltcG9ydCB7IF9fZXhwb3J0IH0gZnJvbSBcIi4uL192aXJ0dWFsL3JvbGxkb3duX3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuLi9kYi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgXCIuLi9kYi9pbmRleC5qc1wiO1xuaW1wb3J0IFwiLi9zY29wZXMuanNcIjtcbmltcG9ydCB7IGVzaUZldGNoIH0gZnJvbSBcIi4vZmV0Y2guanNcIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvY2hhcmFjdGVyLnRzXG52YXIgY2hhcmFjdGVyX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGNoYXJhY3Rlcl9leHBvcnRzLCB7XG5cdGdldENoYXJhY3RlckFmZmlsaWF0aW9uczogKCkgPT4gZ2V0Q2hhcmFjdGVyQWZmaWxpYXRpb25zLFxuXHRnZXRDaGFyYWN0ZXJBZ2VudFJlc2VhcmNoOiAoKSA9PiBnZXRDaGFyYWN0ZXJBZ2VudFJlc2VhcmNoLFxuXHRnZXRDaGFyYWN0ZXJBc3NldExvY2F0aW9uczogKCkgPT4gZ2V0Q2hhcmFjdGVyQXNzZXRMb2NhdGlvbnMsXG5cdGdldENoYXJhY3RlckFzc2V0TmFtZXM6ICgpID0+IGdldENoYXJhY3RlckFzc2V0TmFtZXMsXG5cdGdldENoYXJhY3RlckFzc2V0czogKCkgPT4gZ2V0Q2hhcmFjdGVyQXNzZXRzLFxuXHRnZXRDaGFyYWN0ZXJCbHVlcHJpbnRzOiAoKSA9PiBnZXRDaGFyYWN0ZXJCbHVlcHJpbnRzLFxuXHRnZXRDaGFyYWN0ZXJDbG9uZXM6ICgpID0+IGdldENoYXJhY3RlckNsb25lcyxcblx0Z2V0Q2hhcmFjdGVyQ29udGFjdE5vdGlmaWNhdGlvbnM6ICgpID0+IGdldENoYXJhY3RlckNvbnRhY3ROb3RpZmljYXRpb25zLFxuXHRnZXRDaGFyYWN0ZXJDb3Jwb3JhdGlvbkhpc3Rvcnk6ICgpID0+IGdldENoYXJhY3RlckNvcnBvcmF0aW9uSGlzdG9yeSxcblx0Z2V0Q2hhcmFjdGVyQ3VycmVudFNoaXA6ICgpID0+IGdldENoYXJhY3RlckN1cnJlbnRTaGlwLFxuXHRnZXRDaGFyYWN0ZXJJbXBsYW50czogKCkgPT4gZ2V0Q2hhcmFjdGVySW1wbGFudHMsXG5cdGdldENoYXJhY3Rlckp1bXBGYXRpZ3VlOiAoKSA9PiBnZXRDaGFyYWN0ZXJKdW1wRmF0aWd1ZSxcblx0Z2V0Q2hhcmFjdGVyTG9jYXRpb246ICgpID0+IGdldENoYXJhY3RlckxvY2F0aW9uLFxuXHRnZXRDaGFyYWN0ZXJNZWRhbHM6ICgpID0+IGdldENoYXJhY3Rlck1lZGFscyxcblx0Z2V0Q2hhcmFjdGVyTm90aWZpY2F0aW9uczogKCkgPT4gZ2V0Q2hhcmFjdGVyTm90aWZpY2F0aW9ucyxcblx0Z2V0Q2hhcmFjdGVyT25saW5lOiAoKSA9PiBnZXRDaGFyYWN0ZXJPbmxpbmUsXG5cdGdldENoYXJhY3RlclBvcnRyYWl0czogKCkgPT4gZ2V0Q2hhcmFjdGVyUG9ydHJhaXRzLFxuXHRnZXRDaGFyYWN0ZXJQdWJsaWNEYXRhOiAoKSA9PiBnZXRDaGFyYWN0ZXJQdWJsaWNEYXRhLFxuXHRnZXRDaGFyYWN0ZXJSb2xlczogKCkgPT4gZ2V0Q2hhcmFjdGVyUm9sZXMsXG5cdGdldENoYXJhY3RlclN0YW5kaW5nczogKCkgPT4gZ2V0Q2hhcmFjdGVyU3RhbmRpbmdzLFxuXHRnZXRDaGFyYWN0ZXJUaXRsZXM6ICgpID0+IGdldENoYXJhY3RlclRpdGxlcyxcblx0Z2V0Q2hhcmFjdGVyV2FsbGV0OiAoKSA9PiBnZXRDaGFyYWN0ZXJXYWxsZXQsXG5cdGdldENoYXJhY3RlcldhbGxldEpvdXJuYWw6ICgpID0+IGdldENoYXJhY3RlcldhbGxldEpvdXJuYWwsXG5cdGdldENoYXJhY3RlcldhbGxldFRyYW5zYWN0aW9uczogKCkgPT4gZ2V0Q2hhcmFjdGVyV2FsbGV0VHJhbnNhY3Rpb25zLFxuXHRnZXRQb3J0cmFpdFVSTDogKCkgPT4gZ2V0UG9ydHJhaXRVUkxcbn0pO1xuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyUHVibGljRGF0YShpZCkge1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7aWR9L2ApO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQWZmaWxpYXRpb25zKGlkcykge1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzL2FmZmlsaWF0aW9uL2AsIHZvaWQgMCwge1xuXHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoaWRzKVxuXHR9KVswXTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlclBvcnRyYWl0cyhpZCkge1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7aWR9L3BvcnRyYWl0L2ApO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQ29ycG9yYXRpb25IaXN0b3J5KGlkKSB7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtpZH0vY29ycG9yYXRpb25oaXN0b3J5L2ApO1xufVxuZnVuY3Rpb24gZ2V0UG9ydHJhaXRVUkwoaWQpIHtcblx0cmV0dXJuIGBodHRwczovL2ltYWdlcy5ldmV0ZWNoLm5ldC9jaGFyYWN0ZXJzLyR7aWR9L3BvcnRyYWl0YDtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlclJvbGVzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9jb3Jwb3JhdGlvbl9yb2xlcy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3JvbGVzL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJUaXRsZXMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX3RpdGxlcy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3RpdGxlcy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyU3RhbmRpbmdzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9zdGFuZGluZ3MudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9zdGFuZGluZ3MvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3Rlck5vdGlmaWNhdGlvbnMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX25vdGlmaWNhdGlvbnMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9ub3RpZmljYXRpb25zL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJDb250YWN0Tm90aWZpY2F0aW9ucyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfbm90aWZpY2F0aW9ucy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L25vdGlmaWNhdGlvbnMvY29udGFjdHNgLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyTWVkYWxzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9tZWRhbHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9tZWRhbHMvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3Rlckp1bXBGYXRpZ3VlKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9mYXRpZ3VlLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vZmF0aWd1ZS9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQmx1ZXByaW50cyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfYmx1ZXByaW50cy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2JsdWVwcmludHMvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckFnZW50UmVzZWFyY2goY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX2FnZW50c19yZXNlYXJjaC52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2FnZW50c19yZXNlYXJjaC9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQ2xvbmVzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNsb25lcy5yZWFkX2Nsb25lcy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2Nsb25lcy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVySW1wbGFudHMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2xvbmVzLnJlYWRfaW1wbGFudHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9pbXBsYW50cy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQXNzZXRzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWFzc2V0cy5yZWFkX2Fzc2V0cy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2Fzc2V0cy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQXNzZXRMb2NhdGlvbnMoY2hhcmFjdGVyLCBpZHMpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1hc3NldHMucmVhZF9hc3NldHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9hc3NldHMvbG9jYXRpb25zL2AsIGNoYXJhY3Rlciwge1xuXHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoaWRzKVxuXHR9KTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckFzc2V0TmFtZXMoY2hhcmFjdGVyLCBpZHMpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1hc3NldHMucmVhZF9hc3NldHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9hc3NldHMvbmFtZXMvYCwgY2hhcmFjdGVyLCB7XG5cdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRib2R5OiBKU09OLnN0cmluZ2lmeShpZHMpXG5cdH0pO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyV2FsbGV0KGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXdhbGxldC5yZWFkX2NoYXJhY3Rlcl93YWxsZXQudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS93YWxsZXQvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlcldhbGxldFRyYW5zYWN0aW9ucyhjaGFyYWN0ZXIsIGZyb21JZCkge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXdhbGxldC5yZWFkX2NoYXJhY3Rlcl93YWxsZXQudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS93YWxsZXQvdHJhbnNhY3Rpb25zL2AsIGNoYXJhY3Rlciwge1xuXHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoZnJvbUlkKVxuXHR9KTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlcldhbGxldEpvdXJuYWwoY2hhcmFjdGVyLCBwYWdlID0gMSkge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXdhbGxldC5yZWFkX2NoYXJhY3Rlcl93YWxsZXQudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS93YWxsZXQvam91cm5hbC8/cGFnZT0ke3BhZ2V9YCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckxvY2F0aW9uKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWxvY2F0aW9uLnJlYWRfbG9jYXRpb24udjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9sb2NhdGlvbi9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyT25saW5lKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWxvY2F0aW9uLnJlYWRfb25saW5lLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vb25saW5lL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJDdXJyZW50U2hpcChjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1sb2NhdGlvbi5yZWFkX3NoaXBfdHlwZS52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3NoaXAvYCwgY2hhcmFjdGVyKTtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBjaGFyYWN0ZXJfZXhwb3J0cywgZ2V0Q2hhcmFjdGVyQWZmaWxpYXRpb25zLCBnZXRDaGFyYWN0ZXJBZ2VudFJlc2VhcmNoLCBnZXRDaGFyYWN0ZXJBc3NldExvY2F0aW9ucywgZ2V0Q2hhcmFjdGVyQXNzZXROYW1lcywgZ2V0Q2hhcmFjdGVyQXNzZXRzLCBnZXRDaGFyYWN0ZXJCbHVlcHJpbnRzLCBnZXRDaGFyYWN0ZXJDbG9uZXMsIGdldENoYXJhY3RlckNvbnRhY3ROb3RpZmljYXRpb25zLCBnZXRDaGFyYWN0ZXJDb3Jwb3JhdGlvbkhpc3RvcnksIGdldENoYXJhY3RlckN1cnJlbnRTaGlwLCBnZXRDaGFyYWN0ZXJJbXBsYW50cywgZ2V0Q2hhcmFjdGVySnVtcEZhdGlndWUsIGdldENoYXJhY3RlckxvY2F0aW9uLCBnZXRDaGFyYWN0ZXJNZWRhbHMsIGdldENoYXJhY3Rlck5vdGlmaWNhdGlvbnMsIGdldENoYXJhY3Rlck9ubGluZSwgZ2V0Q2hhcmFjdGVyUG9ydHJhaXRzLCBnZXRDaGFyYWN0ZXJQdWJsaWNEYXRhLCBnZXRDaGFyYWN0ZXJSb2xlcywgZ2V0Q2hhcmFjdGVyU3RhbmRpbmdzLCBnZXRDaGFyYWN0ZXJUaXRsZXMsIGdldENoYXJhY3RlcldhbGxldCwgZ2V0Q2hhcmFjdGVyV2FsbGV0Sm91cm5hbCwgZ2V0Q2hhcmFjdGVyV2FsbGV0VHJhbnNhY3Rpb25zLCBnZXRQb3J0cmFpdFVSTCB9OyIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgQ2hhcmFjdGVySGVscGVyIH0gZnJvbSBcIi4uL2RiL21vZGVscy9jaGFyYWN0ZXIubW9kZWwuanNcIjtcbmltcG9ydCBcIi4uL2RiL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBlc2lGZXRjaCB9IGZyb20gXCIuL2ZldGNoLmpzXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZXNpL2NvcnBvcmF0aW9uLnRzXG52YXIgY29ycG9yYXRpb25fZXhwb3J0cyA9IHt9O1xuX19leHBvcnQoY29ycG9yYXRpb25fZXhwb3J0cywge1xuXHRnZXRDb3Jwb3JhdGlvbkFsbGlhbmNlSGlzdG9yeTogKCkgPT4gZ2V0Q29ycG9yYXRpb25BbGxpYW5jZUhpc3RvcnksXG5cdGdldENvcnBvcmF0aW9uQXNzZXRMb2NhdGlvbnM6ICgpID0+IGdldENvcnBvcmF0aW9uQXNzZXRMb2NhdGlvbnMsXG5cdGdldENvcnBvcmF0aW9uQXNzZXROYW1lczogKCkgPT4gZ2V0Q29ycG9yYXRpb25Bc3NldE5hbWVzLFxuXHRnZXRDb3Jwb3JhdGlvbkFzc2V0czogKCkgPT4gZ2V0Q29ycG9yYXRpb25Bc3NldHMsXG5cdGdldENvcnBvcmF0aW9uRGF0YTogKCkgPT4gZ2V0Q29ycG9yYXRpb25EYXRhLFxuXHRnZXRDb3Jwb3JhdGlvbkljb25zOiAoKSA9PiBnZXRDb3Jwb3JhdGlvbkljb25zXG59KTtcbmFzeW5jIGZ1bmN0aW9uIGdldENvcnBvcmF0aW9uRGF0YShpZCkge1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vYCk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRDb3Jwb3JhdGlvbkFsbGlhbmNlSGlzdG9yeShpZCkge1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vYWxsaWFuY2VoaXN0b3J5L2ApO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ycG9yYXRpb25JY29ucyhpZCkge1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vaWNvbnMvYCk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRDb3Jwb3JhdGlvbkFzc2V0cyhpZCwgY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktYXNzZXRzLnJlYWRfY29ycG9yYXRpb25fYXNzZXRzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvY29ycG9yYXRpb25zLyR7aWR9L2Fzc2V0cy9gLCBjaGFyYWN0ZXIpO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ycG9yYXRpb25Bc3NldExvY2F0aW9ucyhpZCwgY2hhcmFjdGVyLCBpZHMpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1hc3NldHMucmVhZF9jb3Jwb3JhdGlvbl9hc3NldHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vYXNzZXRzL2xvY2F0aW9ucy9gLCBjaGFyYWN0ZXIsIHtcblx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KGlkcylcblx0fSk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRDb3Jwb3JhdGlvbkFzc2V0TmFtZXMoaWQsIGNoYXJhY3RlciwgaWRzKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktYXNzZXRzLnJlYWRfY29ycG9yYXRpb25fYXNzZXRzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvY29ycG9yYXRpb25zLyR7aWR9L2Fzc2V0cy9uYW1lcy9gLCBjaGFyYWN0ZXIsIHtcblx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KGlkcylcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgY29ycG9yYXRpb25fZXhwb3J0cyB9OyIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgZXNpRmV0Y2ggfSBmcm9tIFwiLi9mZXRjaC5qc1wiO1xuXG4vLyNyZWdpb24gc3JjL2VzaS9hbGxpYW5jZS50c1xudmFyIGFsbGlhbmNlX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGFsbGlhbmNlX2V4cG9ydHMsIHtcblx0Z2V0QWxsaWFuY2VDb3Jwb3JhdGlvbnM6ICgpID0+IGdldEFsbGlhbmNlQ29ycG9yYXRpb25zLFxuXHRnZXRBbGxpYW5jZURhdGE6ICgpID0+IGdldEFsbGlhbmNlRGF0YSxcblx0Z2V0QWxsaWFuY2VJY29uczogKCkgPT4gZ2V0QWxsaWFuY2VJY29uc1xufSk7XG5hc3luYyBmdW5jdGlvbiBnZXRBbGxpYW5jZURhdGEoaWQpIHtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvYWxsaWFuY2VzLyR7aWR9L2ApO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsaWFuY2VDb3Jwb3JhdGlvbnMoaWQpIHtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvYWxsaWFuY2VzLyR7aWR9L2NvcnBvcmF0aW9ucy9gKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbGlhbmNlSWNvbnMoaWQpIHtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvYWxsaWFuY2VzLyR7aWR9L2ljb25zL2ApO1xufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGFsbGlhbmNlX2V4cG9ydHMsIGdldEFsbGlhbmNlQ29ycG9yYXRpb25zLCBnZXRBbGxpYW5jZURhdGEsIGdldEFsbGlhbmNlSWNvbnMgfTsiLAogICAgImltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuLi9kYi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgXCIuLi9kYi9tb2RlbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IGVzaUZldGNoIH0gZnJvbSBcIi4vZmV0Y2guanNcIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvc2tpbGxzLnRzXG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJBdHRyaWJ1dGVzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXNraWxscy5yZWFkX3NraWxscy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2F0dHJpYnV0ZXNgLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyU2tpbGxRdWV1ZShjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1za2lsbHMucmVhZF9za2lsbHF1ZXVlLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vc2tpbGxxdWV1ZWAsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJTa2lsbHMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktc2tpbGxzLnJlYWRfc2tpbGxzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vc2tpbGxzYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGNhbGN1bGF0ZVRyYWluaW5nUGVyY2VudGFnZShxdWV1ZWRTa2lsbCkge1xuXHRjb25zdCB0cmFpbmluZ1N0YXJ0UG9zaXRpb24gPSAocXVldWVkU2tpbGwudHJhaW5pbmdfc3RhcnRfc3AgLSBxdWV1ZWRTa2lsbC5sZXZlbF9zdGFydF9zcCkgLyBxdWV1ZWRTa2lsbC5sZXZlbF9lbmRfc3A7XG5cdGNvbnN0IHRpbWVQb3NpdGlvbiA9ICgoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLmdldFRpbWUoKSAtIG5ldyBEYXRlKHF1ZXVlZFNraWxsLnN0YXJ0X2RhdGUpLmdldFRpbWUoKSkgLyAobmV3IERhdGUocXVldWVkU2tpbGwuZmluaXNoX2RhdGUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKHF1ZXVlZFNraWxsLnN0YXJ0X2RhdGUpLmdldFRpbWUoKSk7XG5cdHJldHVybiB0cmFpbmluZ1N0YXJ0UG9zaXRpb24gKyAoMSAtIHRyYWluaW5nU3RhcnRQb3NpdGlvbikgKiB0aW1lUG9zaXRpb247XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgY2FsY3VsYXRlVHJhaW5pbmdQZXJjZW50YWdlLCBnZXRDaGFyYWN0ZXJBdHRyaWJ1dGVzLCBnZXRDaGFyYWN0ZXJTa2lsbFF1ZXVlLCBnZXRDaGFyYWN0ZXJTa2lsbHMgfTsiLAogICAgImltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tICdicmlzYSc7XG5pbXBvcnQgdHlwZSB7IEVWRUF1dGggfSBmcm9tICdAL21pZGRsZXdhcmUnO1xuaW1wb3J0IHsgZ2V0Q29va2llcywgcmVtb3ZlQ29va2llLCBzZXRDb29raWUgfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCB7IENoYXJhY3RlckFQSSwgY2hhcmFjdGVySWRGcm9tVG9rZW4gfSBmcm9tICdAc3Rhci1raXR0ZW4vZXZlL2VzaSc7XG5pbXBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIsIFVzZXJIZWxwZXIgfSBmcm9tICdAc3Rhci1raXR0ZW4vZXZlL2RiJztcblxuLy8gR0VUIC9hcGkvYXV0aC9jYWxsYmFja1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIEdFVChyZXF1ZXN0OiBSZXF1ZXN0Q29udGV4dCkge1xuICBjb25zdCBldmVhdXRoOiBFVkVBdXRoID0gcmVxdWVzdC5zdG9yZS5nZXQoJ2V2ZWF1dGgnKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoJycsIHsgc3RhdHVzOiAzMDIgfSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb29raWVzID0gZ2V0Q29va2llcyhyZXF1ZXN0LmhlYWRlcnMpO1xuICAgIGNvbnN0IGNvb2tpZURpc2NvcmRJRCA9IGNvb2tpZXNbJ2Rpc2NvcmRJRCddO1xuICAgIGlmICghY29va2llRGlzY29yZElEKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZGlzY29yZElEIGNvb2tpZSBpbiAvYXBpL2F1dGgvY2FsbGJhY2tgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb29raWVDaGFyYWN0ZXJJRCA9IGNvb2tpZXNbJ2NoYXJhY3RlcklEJ107XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCBldmVhdXRoLnZhbGlkYXRlKHJlc3BvbnNlKTtcbiAgICBjb25zdCBjaGFyYWN0ZXJJRCA9IGNoYXJhY3RlcklkRnJvbVRva2VuKHRva2VuLmFjY2Vzc190b2tlbik7XG4gICAgaWYgKGNvb2tpZUNoYXJhY3RlcklEICYmIHBhcnNlSW50KGNvb2tpZUNoYXJhY3RlcklEKSAhPT0gY2hhcmFjdGVySUQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2hhcmFjdGVyIElEIG1pc21hdGNoOiAke2Nvb2tpZUNoYXJhY3RlcklEfSAhPT0gJHtjaGFyYWN0ZXJJRH1gKTtcbiAgICB9XG5cbiAgICBsZXQgdXNlciA9IFVzZXJIZWxwZXIuZmluZEJ5RGlzY29yZElkKGNvb2tpZURpc2NvcmRJRCk7XG4gICAgbGV0IGNoYXJhY3RlciA9IENoYXJhY3RlckhlbHBlci5maW5kQnlVc2VyQW5kRXZlSUQodXNlci5pZCwgTnVtYmVyKGNoYXJhY3RlcklEKSk7XG5cbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHVzZXIgPSBVc2VySGVscGVyLmNyZWF0ZShjb29raWVEaXNjb3JkSUQpO1xuICAgIH1cblxuICAgIGlmICghdXNlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIGNyZWF0aW5nIGEgdXNlciBmb3IgaWQ6ICR7Y29va2llRGlzY29yZElEfWApO1xuICAgIH1cblxuICAgIGlmICghY2hhcmFjdGVyKSB7XG4gICAgICBjb25zb2xlLmxvZyhgQ3JlYXRpbmcgbmV3IGNoYXJhY3RlciBmb3IgdXNlcjogJHt1c2VyLmlkfSB3aXRoIGlkOiAke2NoYXJhY3RlcklEfWApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IENoYXJhY3RlckFQSS5nZXRDaGFyYWN0ZXJQdWJsaWNEYXRhKGNoYXJhY3RlcklEKTtcbiAgICAgIGlmICghZGF0YSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXRyZWl2ZSBjaGFyYWN0ZXIgcHVibGljIGRhdGEgZm9yIGlkOiAke2NoYXJhY3RlcklEfSAtIHVuYWJsZSB0byBjcmVhdGUgY2hhcmFjdGVyYCk7XG4gICAgICB9XG4gICAgICBjaGFyYWN0ZXIgPSBDaGFyYWN0ZXJIZWxwZXIuY3JlYXRlKGNoYXJhY3RlcklELCBkYXRhLm5hbWUgfHwgJ1VOS05PV04gTkFNRScsIHVzZXIsIHRva2VuKTtcblxuICAgICAgLy8gcmVmZXRjaCBmcm9tIGRiIHRvIGdldCBpZFxuICAgICAgdXNlciA9IFVzZXJIZWxwZXIuZmluZEJ5RGlzY29yZElkKGNvb2tpZURpc2NvcmRJRCk7XG4gICAgICBjaGFyYWN0ZXIgPSBDaGFyYWN0ZXJIZWxwZXIuZmluZEJ5VXNlckFuZEV2ZUlEKHVzZXIuaWQsIE51bWJlcihjaGFyYWN0ZXJJRCkpO1xuICAgICAgaWYgKCFjaGFyYWN0ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmV0cmVpdmUgY2hhcmFjdGVyIGZyb20gZGIgZm9yIGlkOiAke2NoYXJhY3RlcklEfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXVzZXIubWFpbkNoYXJhY3RlcklEKSB7XG4gICAgICAgIHVzZXIubWFpbkNoYXJhY3RlcklEID0gY2hhcmFjdGVyLmlkO1xuICAgICAgICBVc2VySGVscGVyLnNhdmUodXNlcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBjaGFyYWN0ZXIgd2l0aCBuZXcgdG9rZW5cbiAgICAgIGNvbnNvbGUubG9nKGBVcGRhdGluZyBleGlzdGluZyBjaGFyYWN0ZXI6ICR7Y2hhcmFjdGVyLm5hbWV9ICgke2NoYXJhY3Rlci5ldmVJRH0pIHdpdGggbmV3IHRva2VuYCk7XG4gICAgICBjaGFyYWN0ZXIuYWNjZXNzVG9rZW4gPSB0b2tlbi5hY2Nlc3NfdG9rZW47XG4gICAgICBjaGFyYWN0ZXIuZXhwaXJlc0F0ID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIHRva2VuLmV4cGlyZXNfaW4gKiAxMDAwKTtcbiAgICAgIGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4gPSB0b2tlbi5yZWZyZXNoX3Rva2VuO1xuICAgICAgQ2hhcmFjdGVySGVscGVyLnNhdmUoY2hhcmFjdGVyKTtcbiAgICB9XG5cbiAgICBzZXRDb29raWUocmVzcG9uc2UsICdjdXJyZW50VXNlcicsIHVzZXIuaWQgKyAnJywgNjAgKiA2MCAqIDI0ICogMzAgLyogMzAgZGF5cyAqLyk7XG4gICAgcmVzcG9uc2UuaGVhZGVycy5zZXQoJ2xvY2F0aW9uJywgJy9hdXRoL3N1Y2Nlc3MnKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihgRXJyb3I6IENhbGxiYWNrIGZhaWxlZCB3aXRoICR7ZXJyfWApO1xuICAgIHJlc3BvbnNlLmhlYWRlcnMuc2V0KCdsb2NhdGlvbicsICcvYXV0aC9lcnJvcicpO1xuICAgIHJldHVybiByZXNwb25zZTtcblxuICB9IGZpbmFsbHkge1xuICAgIHJlbW92ZUNvb2tpZShyZXNwb25zZSwgJ2Rpc2NvcmRJRCcpO1xuICAgIHJlbW92ZUNvb2tpZShyZXNwb25zZSwgJ2NoYXJhY3RlcklEJyk7XG4gICAgcmVtb3ZlQ29va2llKHJlc3BvbnNlLCAnc3RhdGUnKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZTtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBRUEsSUFBSTtBQUFBLEVBQ0osSUFBSSxVQUFTLE9BQU87QUFBQSxFQUdwQixTQUFTLFNBQVUsQ0FBQyxLQUFLLEtBQUs7QUFBQSxJQUM1QixTQUFTLE9BQU8sS0FBSztBQUFBLE1BQ25CLElBQUksT0FBTyxJQUFJO0FBQUEsSUFDakI7QUFBQTtBQUFBLEVBRUYsSUFBSSxRQUFPLFFBQVEsUUFBTyxTQUFTLFFBQU8sZUFBZSxRQUFPLGlCQUFpQjtBQUFBLElBQy9FLE9BQU8sVUFBVTtBQUFBLEVBQ25CLEVBQU87QUFBQSxJQUVMLFVBQVUsUUFBUSxPQUFPO0FBQUEsSUFDekIsUUFBUSxTQUFTO0FBQUE7QUFBQSxFQUduQixTQUFTLFVBQVcsQ0FBQyxLQUFLLGtCQUFrQixRQUFRO0FBQUEsSUFDbEQsT0FBTyxRQUFPLEtBQUssa0JBQWtCLE1BQU07QUFBQTtBQUFBLEVBRzdDLFdBQVcsWUFBWSxPQUFPLE9BQU8sUUFBTyxT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O0FBQUEsTUFDTixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsTUFBTSxPQUFPLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxRQUFPO0FBQUEsSUFDaEQsT0FBTyxPQUFPLElBQUksSUFDZCxPQUFPLElBQUksSUFDWCxFQUFFLGFBQWEsT0FBTyxFQUFFLGFBQWEsT0FBTyxJQUM1QztBQUFBO0FBQUEsRUFHTixPQUFPLFVBQVU7QUFBQTs7OztFQ3JQakIsSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sT0FBTyxVQUFVO0FBQUEsSUFDZjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElB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QTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsSUFFQSxJQUFJLGFBQWE7QUFBQSxNQUNmO0FBQUEsTUFBRztBQUFBLE1BQ0g7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUc7QUFBQSxNQUN2QjtBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQ2xCO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFDbEI7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUNsQjtBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLElBQ3BCO0FBQUEsSUFFQSxJQUFJLGFBQWE7QUFBQSxNQUNmO0FBQUEsTUFBRztBQUFBLE1BQ0g7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUM1RDtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBUztBQUFBLE1BQzNEO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFTO0FBQUEsTUFDM0Q7QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUN6RDtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLElBQzlEO0FBQUEsSUFF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LElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BRWpCLElBQUksV0FBVyxNQUFLLFdBQVcsSUFBSTtBQUFBLE1BQ25DLElBQUksU0FBUztBQUFBLE1BRWIsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE1BQVEsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUNyRCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sT0FBTyxNQUFPO0FBQUEsTUFDaEQsTUFBTTtBQUFBLE1BRU4sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE1BQVEsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUNyRCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sT0FBTyxNQUFPO0FBQUEsTUFDaEQsTUFBTTtBQUFBLE1BRU4sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE1BQVEsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUNyRCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sT0FBTyxNQUFPO0FBQUEsTUFDaEQsTUFBTTtBQUFBLE1BRU4sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE9BQVMsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUN0RCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sUUFBUSxNQUFPO0FBQUEsTUFDakQsT0FBTztBQUFBLE1BRVAsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE9BQVMsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUN0RCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sUUFBUSxNQUFPO0FBQUEsTUFDakQsT0FBTztBQUFBLE1BRVAsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxL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Q3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElB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QUksQ0FBQyxLQUFLO0FBQUEsTUFDcEMsT0FBTyxLQUFLLEtBQUssR0FBRyxNQUFNO0FBQUE7QUFBQSxJQUc1QixHQUFHLFVBQVUsS0FBSyxTQUFTLEVBQUcsQ0FBQyxLQUFLO0FBQUEsTUFDbEMsT0FBTyxLQUFLLElBQUksR0FBRyxNQUFNO0FBQUE7QUFBQSxJQUczQixHQUFHLFVBQVUsT0FBTyxTQUFTLElBQUssQ0FBQyxLQUFLO0FBQUEsTUFDdEMsT0FBTyxLQUFLLEtBQUssR0FBRyxLQUFLO0FBQUE7QUFBQSxJQUczQixHQUFHLFVBQVUsTUFBTSxTQUFTLEdBQUksQ0FBQyxLQUFLO0FBQUEsTUFDcEMsT0FBTyxLQUFLLElBQUksR0FBRyxLQUFLO0FBQUE7QUFBQSxJQUcxQixHQUFHLFVBQVUsTUFBTSxTQUFTLEdBQUksQ0FBQyxLQUFLO0FBQUEsTUFDcEMsT0FBTyxLQUFLLEtBQUssR0FBRyxNQUFNO0FBQUE7QUFBQSxJQUc1QixHQUFHLFVBQVUsS0FBSyxTQUFTLEVBQUcsQ0FBQyxLQUFLO0FBQUEsTUFDbEMsT0FBTyxLQUFLLElBQUksR0FBRyxNQUFNO0FBQUE7QUFBQSxJQUczQixHQUFHLFVBQVUsT0FBTyxTQUFTLElBQUssQ0FBQyxLQUFLO0FBQUEsTUFDdEMsT0FBTyxLQUFLLEtBQUssR0FBRyxLQUFLO0FBQUE7QUFBQSxJQUczQixHQUFHLFVBQVUsTUFBTSxTQUFTLEdBQUksQ0FBQyxLQUFLO0FBQUEsTUFDcEMsT0FBTyxLQUFLLElBQUksR0FBRyxLQUFLO0FBQUE7QUFBQSxJQUcxQixHQUFHLFVBQVUsTUFBTSxTQUFTLEdBQUksQ0FBQyxLQUFLO0FBQUEsTUFDcEMsT0FBTyxLQUFLLEtBQUssR0FBRyxNQUFNO0FBQUE7QUFBQSxJQUc1QixHQUFHLFVBQVUsS0FBSyxTQUFTLEVBQUcsQ0FBQyxLQUFLO0FBQUEsTUFDbEMsT0FBTyxLQUFLLElBQUksR0FBRyxNQUFNO0FBQUE7QUFBQSxJQU8zQixHQUFHLE1BQU0sU0FBUyxHQUFJLENBQUMsS0FBSztBQUFBLE1BQzFCLE9BQU8sSUFBSSxJ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QyxJQUFJLE1BQU0sUUFBUSxNQUFNLFFBQVEsTUFBTSxNQUFNO0FBQUEsTUFDMUMsS0FBSyxJQUFJLEtBQUssTUFBTTtBQUFBLE1BQ3BCLEtBQUssSUFBSSxLQUFLLE1BQU07QUFBQSxNQUNwQixLQUFLLElBQUksS0FBSyxNQUFNO0FBQUEsTUFDcEIsS0FBSyxJQUFJLEtBQUssTUFBTTtBQUFBLE1BQ3BCLEtBQUssT0FBTztBQUFBLElBQ2QsRUFBTztBQUFBLE1BQ0wsS0FBSyxJQUFJLElBQUksR0FBRyxHQUFHLEVBQUU7QUFBQSxNQUNyQixLQUFLLElBQUksSUFBSSxHQUFHLEdBQUcsRUFBRTtBQUFBLE1BQ3JCLEtBQUssSUFBSSxJQUFJLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxLQUFLLE1BQU07QUFBQSxNQUN4QyxLQUFLLElBQUksS0FBSyxJQUFJLEdBQUcsR0FBRyxFQUFFO0FBQUEsTUFDMUIsS0FBSyxLQUFLLEVBQUU7QUFBQSxRQUNWLEtBQUssSUFBSSxLQUFLLEVBQUUsTUFBTSxLQUFLLE1BQU0sR0FBRztBQUFBLE1BQ3RDLEtBQUssS0FBSyxFQUFFO0FBQUEsUUFDVixLQUFLLElBQUksS0FBSyxFQUFFLE1BQU0sS0FBSyxNQUFNLEdBQUc7QUFBQSxNQUN0QyxLQUFLLEtBQUssRUFBRTtBQUFBLFFBQ1YsS0FBSyxJQUFJLEtBQUssRUFBRSxNQUFNLEtBQUssTUFBTSxHQUFHO0FBQUEsTUFDdEMsSUFBSSxLQUFLLE1BQU0sS0FBSyxFQUFFO0FBQUEsUUFDcEIsS0FBSyxJQUFJLEtBQUssRUFBRSxNQUFNLEtBQUssTUFBTSxHQUFHO0FBQUEsTUFDdEMsS0FBSyxPQUFPLEtBQUssTUFBTSxLQUFLLE1BQU07QUFBQSxNQUdsQyxJQUFJLEtBQUssTUFBTSxhQUFhLEtBQUssR0FBRztBQUFBLFFBQ2xDLEtBQUssSUFBSSxLQUFLLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFBQSxRQUM3QixLQUFLLEtBQUs7QUFBQSxVQUNSLEtBQUssSUFBSSxLQUFLLEVBQUUsT0FBTyxLQUFLLEVBQUUsUUFBUSxDQUFDO0FBQUEsTUFDM0M7QUFBQTtBQUFBO0FBQUEsRUFHSixTQUFTLE9BQU8sS0FBSyxTQUFTO0FBQUEsRUFFOUIsYUFBYSxVQUFVLGdCQUFnQixTQUFTLGFBQWEsQ0FBQyxLQUFLO0FBQUEsSUFDakUsT0FBTyxNQUFNLFNBQVMsTUFBTSxHQUFHO0FBQUE7QUFBQSxFQUdqQyxhQUFhLFVBQVUsUUFBUSxTQUFTLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHO0FBQUEsSUFDeEQsT0FBTyxJQUFJLE1BQU0sTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQUE7QUFBQSxFQUduQyxNQUFNLFdBQVcsU0FBUyxRQUFRLENBQUMsT0FBTyxLQUFLO0FBQUEsSUFDN0MsT0FBTyxJQUFJLE1BQU0sT0FBTyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtBQUFBO0FBQUEsRUFHaEQsTUFBTSxVQUFVLFVBQVUsU0FBUyxPQUFPLEdBQUc7QUFBQSxJQUMzQyxJQUFJLEtBQUssV0FBVztBQUFBLE1BQ2xCLE9BQU87QUFBQSxJQUNULE9BQU8sa0JBQWtCLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxJQUFJLENBQUMsSUFDcEQsU0FBUyxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsSUFBSSxDQUFDLElBQ3hDLFNBQVMsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLElBQUksQ0FBQyxJQUFJO0FBQUE7QUFBQSxFQUdsRCxNQUFNLFVBQVUsYUFBYSxTQUFTLFVBQVUsR0FBRztBQUFBLElBRWpELE9BQU8sS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLE1BQ3ZCLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQ3ZCLEtBQUssUUFBUSxLQUFLLEVBQUUsSUFBSSxLQUFLLE1BQU0sQ0FBQyxNQUFNO0FBQUE7QUFBQSxFQUcvQyxNQUFNLFVBQVUsVUFBVSxTQUFTLE9BQU8sR0FBRztBQUFBLElBTTNDLElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTztBQUFBLElBRXRCLElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTztBQUFBLElBRXRCLElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTztBQUFBLElBQ3RCLElBQUksRUFBRSxRQUFRLENBQUM7QUFBQSxJQUVmLElBQUksSUFBSSxLQUFLLE1BQU0sTUFBTSxDQUFDO0FBQUEsSUFFMUIsSUFBSSxJQUFJLEtBQUssRUFBRSxPQUFPLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUM7QUFBQSxJQUUzRCxJQUFJLElBQUksRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVsQixJQUFJLElBQUksRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVsQixJQUFJLElBQUksRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVsQixJQUFJLEtBQUssRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVuQixJQUFJLEtBQUssRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVuQixJQUFJLEtBQUssRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVuQixJQUFJLEtBQUssRUFBRSxPQUFPLENBQUM7QUFBQSxJQUNuQixPQUFPLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxJQUFJLEVBQUU7QUFBQTtBQUFBLEVBR3hDLE1BQU0sVUFBVSxXQUFXLFNBQVMsUUFBUSxHQUFHO0FBQUEsSUFRN0MsSUFBSSxJQUFJLEtBQUssRUFBRSxPQUFPLEtBQUssQ0FBQyxFQUFFLE9BQU87QUFBQSxJQUVyQyxJQUFJLElBQUksS0FBSyxFQUFFLE9BQU87QUFBQSxJQUV0QixJQUFJLElBQUksS0FBSyxFQUFFLE9BQU87QUFBQSxJQUV0QixJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFDSixJQUFJLEtBQUssTUFBTSxTQUFTO0FBQUEsTUFFdEIsSUFBSSxLQUFLLE1BQU0sTUFBTSxDQUFDO0FBQUEsTUFFdEIsSUFBSSxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQUEsTUFDbEIsSUFBSSxLQUFLLE1BQU07QUFBQSxRQUVi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QUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7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QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFDbEQ7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUNuRDtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLEVBQ3BEO0FBQUEsRUFFQSxJQUFJLEtBQUs7QUFBQSxJQUNQO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFDbEQ7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUNuRDtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQ2xEO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFDbEQ7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxFQUNwRDtBQUFBLEVBRUEsSUFBSSxJQUFJO0FBQUEsSUFDTjtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQ3JEO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFDcEQ7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUNyRDtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQ3BEO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsRUFDdkQ7QUFBQSxFQUVBLElBQUksS0FBSztBQUFBLElBQ1A7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUNyRDtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQ3BEO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFDckQ7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFB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Q0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsS0FBSztBQUFBLE1BQ0gsS0FBSztBQUFBLE1BQ0wsUUFBUTtBQUFBLFFBQ047QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQTs7OztFQ3p3QkEsSUFBSSxTQUFTO0FBQUEsRUFFYixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFFSixJQUFJLFNBQVMsTUFBTTtBQUFBLEVBRW5CLFNBQVMsV0FBVyxDQUFDLFVBQVM7QUFBQSxJQUM1QixJQUFJLFNBQVEsU0FBUztBQUFBLE1BQ25CLEtBQUssUUFBUSxJQUFJLE1BQU0sTUFBTSxRQUFPO0FBQUEsSUFDakMsU0FBSSxTQUFRLFNBQVM7QUFBQSxNQUN4QixLQUFLLFFBQVEsSUFBSSxNQUFNLFFBQVEsUUFBTztBQUFBLElBRXRDO0FBQUEsV0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLFFBQU87QUFBQSxJQUNyQyxLQUFLLElBQUksS0FBSyxNQUFNO0FBQUEsSUFDcEIsS0FBSyxJQUFJLEtBQUssTUFBTTtBQUFBLElBQ3BCLEtBQUssT0FBTyxTQUFRO0FBQUEsSUFFcEIsT0FBTyxLQUFLLEVBQUUsU0FBUyxHQUFHLGVBQWU7QUFBQSxJQUN6QyxPQUFPLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxFQUFFLFdBQVcsR0FBRyx5QkFBeUI7QUFBQTtBQUFBLEVBRW5FLE9BQU8sY0FBYztBQUFBLEVBRXJCLFNBQVMsV0FBVyxDQUFDLE1BQU0sVUFBUztBQUFBLElBQ2xDLE9BQU8sZUFBZSxRQUFRLE1BQU07QUFBQSxNQUNsQyxjQUFjO0FBQUEsTUFDZCxZQUFZO0FBQUEsTUFDWixLQUFLLFFBQVEsR0FBRztBQUFBLFFBQ2QsSUFBSSxTQUFRLElBQUksWUFBWSxRQUFPO0FBQUEsUUFDbkMsT0FBTyxlQUFlLFFBQVEsTUFBTTtBQUFBLFVBQ2xDLGNBQWM7QUFBQSxVQUNkLFlBQVk7QUFBQSxVQUNaLE9BQU87QUFBQSxRQUNULENBQUM7QUFBQSxRQUNELE9BQU87QUFBQTtBQUFBLElBRVgsQ0FBQztBQUFBO0FBQUEsRUFHSCxZQUFZLFFBQVE7QUFBQSxJQUNsQixNQUFNO0FBQUEsSUFDTixPQUFPO0FBQUEsSUFDUCxHQUFHO0FBQUEsSUFDSCxHQUFHO0FBQUEsSUFDSCxHQUFHO0FBQUEsSUFDSCxHQUFHO0FBQUEsSUFDSCxNQUFNLEtBQUs7QUFBQSxJQUNYLE1BQU07QUFBQSxJQUNOLEdBQUc7QUFBQSxNQUNEO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFBQSxFQUVELFlBQVksUUFBUTtBQUFBLElBQ2xCLE1BQU07QUFBQSxJQUNOLE9BQU87QUFBQSxJQUNQLEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxJQUNILE1BQU0sS0FBSztBQUFBLElBQ1gsTUFBTTtBQUFBLElBQ04sR0FBRztBQUFBLE1BQ0Q7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUFBLEVBRUQsWUFBWSxRQUFRO0FBQUEsSUFDbEIsTUFBTTtBQUFBLElBQ04sT0FBTztBQUFBLElBQ1AsR0FBRztBQUFBLElBQ0gsR0FBRztBQUFBLElBQ0gsR0FBRztBQUFBLElBQ0gsR0FBRztBQUFBLElBQ0gsTUFBTSxLQUFLO0FBQUEsSUFDWCxNQUFNO0FBQUEsSUFDTixHQUFHO0FBQUEsTUFDRDtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDO0FBQUEsRUFFRCxZQUFZLFFBQVE7QUFBQSxJQUNsQixNQUFNO0FBQUEsSUFDTixPQUFPO0FBQUEsSUFDUCxHQUFHLG9FQUNBO0FBQUEsSUFDSCxHQUFHLG9FQUNBO0FBQUEsSUFDSCxHQUFHLG9FQUNBO0FBQUEsSUFDSCxHQUFHLG9FQUNBO0FBQUEsSUFDSCxNQUFNLEtBQUs7QUFBQSxJQUNYLE1BQU07QUFBQSxJQUNOLEdBQUc7QUFBQSxNQUNELDZFQUNBO0FBQUEsTUFDQSw2RUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFBQSxFQUVELFlBQVksUUFBUTtBQUFBLElBQ2xCLE1BQU07QUFBQSxJQUNOLE9BQU87QUFBQSxJQUNQLEdBQUcsMkRBQ0EsMkRBQ0E7QUFBQSxJQUNILEdBQUcsMkRBQ0EsMkRBQ0E7QUFBQSxJQUNILEdBQUcsMkRBQ0EsMkRBQ0E7QUFBQSxJQUNILEdBQUcsMkRBQ0EsMkRBQ0E7QUFBQSxJQUNILE1BQU0sS0FBSztBQUFBLElBQ1gsTUFBTTtBQUFBLElBQ04sR0FBRztBQUFBLE1BQ0QsMkRBQ0EsMkRBQ0E7QUFBQSxNQUNBLDJEQUNBLDJEQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUFBLEVBRUQsWUFBWSxjQUFjO0FBQUEsSUFDeEIsTUFBTTtBQUFBLElBQ04sT0FBTztBQUFBLElBQ1AsR0FBRztBQUFBLElBQ0gsR0FBRztBQUFBLElBQ0gsR0FBRztBQUFBLElBQ0gsR0FBRztBQUFBLElBQ0gsTUFBTSxLQUFLO0FBQUEsSUFDWCxNQUFNO0FBQUEsSUFDTixHQUFHO0FBQUEsTUFDRDtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFBQSxFQUVELFlBQVksV0FBVztBQUFBLElBQ3JCLE1BQU07QUFBQSxJQUNOLE9BQU87QUFBQSxJQUNQLEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxJQUVILEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxJQUNILE1BQU0sS0FBSztBQUFBLElBQ1gsTUFBTTtBQUFBLElBQ04sR0FBRztBQUFBLE1BQ0Q7QUFBQSxNQUdBO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUFBLEVBRUQsSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLElBQ0Y7QUFBQSxJQUNBLE9BQU8sR0FBRztBQUFBLElBQ1YsTUFBTTtBQUFBO0FBQUEsRUFHUixZQUFZLGFBQWE7QUFBQSxJQUN2QixNQUFNO0FBQUEsSUFDTixPQUFPO0FBQUEsSUFDUCxHQUFHO0FBQUEsSUFDSCxHQUFHO0FBQUEsSUFDSCxHQUFHO0FBQUEsSUFDSCxHQUFHO0FBQUEsSUFDSCxHQUFHO0FBQUEsSUFDSCxNQUFNLEtBQUs7QUFBQSxJQUdYLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxNQUNMO0FBQUEsUUFDRSxHQUFHO0FBQUEsUUFDSCxHQUFHO0FBQUEsTUFDTDtBQUFBLE1BQ0E7QUFBQSxRQUNFLEdBQUc7QUFBQSxRQUNILEdBQUc7QUFBQSxNQUNMO0FBQUEsSUFDRjtBQUFBLElBRUEsTUFBTTtBQUFBLElBQ04sR0FBRztBQUFBLE1BQ0Q7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFBQTs7OztFQzNNRCxJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFFSixTQUFTLFFBQVEsQ0FBQyxVQUFTO0FBQUEsSUFDekIsTUFBTSxnQkFBZ0I7QUFBQSxNQUNwQixPQUFPLElBQUksU0FBUyxRQUFPO0FBQUEsSUFDN0IsS0FBSyxPQUFPLFNBQVE7QUFBQSxJQUNwQixLQUFLLGVBQWUsU0FBUTtBQUFBLElBRTVCLEtBQUssU0FBUyxLQUFLLEtBQUs7QUFBQSxJQUN4QixLQUFLLGFBQWEsU0FBUSxjQUFjLEtBQUssS0FBSztBQUFBLElBRWxELEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxpQkFBaUI7QUFBQSxJQUN0QixLQUFLLElBQUk7QUFBQSxJQUNULEtBQUssSUFBSTtBQUFBLElBRVQsSUFBSSxVQUFVLE1BQU0sUUFBUSxTQUFRLFNBQVMsU0FBUSxjQUFjLEtBQUs7QUFBQSxJQUN4RSxJQUFJLFFBQVEsTUFBTSxRQUFRLFNBQVEsT0FBTyxTQUFRLFlBQVksS0FBSztBQUFBLElBQ2xFLElBQUksT0FBTyxNQUFNLFFBQVEsU0FBUSxNQUFNLFNBQVEsV0FBVyxLQUFLO0FBQUEsSUFDL0QsT0FBTyxRQUFRLFVBQVcsS0FBSyxhQUFhLEdBQ3JDLHFDQUFxQyxLQUFLLGFBQWEsT0FBTztBQUFBLElBQ3JFLEtBQUssTUFBTSxTQUFTLE9BQU8sSUFBSTtBQUFBO0FBQUEsRUFFakMsT0FBTyxVQUFVO0FBQUEsRUFFakIsU0FBUyxVQUFVLFFBQVEsU0FBUyxJQUFJLENBQUMsU0FBUyxPQUFPLE1BQU07QUFBQSxJQUM3RCxJQUFJLE9BQU8sUUFBUSxPQUFPLEtBQUssRUFBRSxPQUFPLElBQUk7QUFBQSxJQUU1QyxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDbEMsS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFNBQVMsQ0FBQztBQUFBLElBQ2xDLFNBQVMsSUFBSSxFQUFHLElBQUksS0FBSyxFQUFFLFFBQVEsS0FBSztBQUFBLE1BQ3RDLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDWixLQUFLLEVBQUUsS0FBSztBQUFBLElBQ2Q7QUFBQSxJQUVBLEtBQUssUUFBUSxJQUFJO0FBQUEsSUFDakIsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLGlCQUFpQjtBQUFBO0FBQUEsRUFHeEIsU0FBUyxVQUFVLFFBQVEsU0FBUyxJQUFJLEdBQUc7QUFBQSxJQUN6QyxPQUFPLElBQUksS0FBSyxLQUFLLEtBQUssTUFBTSxLQUFLLENBQUM7QUFBQTtBQUFBLEVBR3hDLFNBQVMsVUFBVSxVQUFVLFNBQVMsTUFBTSxDQUFDLE1BQU07QUFBQSxJQUNqRCxJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQ04sT0FBTyxLQUFLLENBQUMsRUFDYixPQUFPLENBQUUsQ0FBSyxDQUFDO0FBQUEsSUFDL0IsSUFBSTtBQUFBLE1BQ0YsT0FBTyxLQUFLLE9BQU8sSUFBSTtBQUFBLElBQ3pCLEtBQUssSUFBSSxLQUFLLE9BQU87QUFBQSxJQUNyQixLQUFLLElBQUksS0FBSyxNQUFNLEVBQUUsT0FBTyxLQUFLLENBQUMsRUFBRSxPQUFPO0FBQUEsSUFDNUMsS0FBSztBQUFBLE1BQ0g7QUFBQSxJQUVGLEtBQUssSUFBSSxLQUFLLE1BQU0sRUFDTixPQUFPLEtBQUssQ0FBQyxFQUNiLE9BQU8sQ0FBRSxDQUFLLENBQUMsRUFDZixPQUFPLElBQUksRUFDWCxPQUFPO0FBQUEsSUFDckIsS0FBSyxJQUFJLEtBQUssTUFBTSxFQUFFLE9BQU8sS0FBSyxDQUFDLEVBQUUsT0FBTztBQUFBO0FBQUEsRUFHOUMsU0FBUyxVQUFVLFNBQVMsU0FBUyxNQUFNLENBQUMsU0FBUyxZQUFZLEtBQUssUUFBUTtBQUFBLElBRTVFLElBQUksT0FBTyxlQUFlLFVBQVU7QUFBQSxNQUNsQyxTQUFTO0FBQUEsTUFDVCxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsSUFDZjtBQUFBLElBRUEsVUFBVSxNQUFNLFFBQVEsU0FBUyxVQUFVO0FBQUEsSUFDM0MsTUFBTSxNQUFNLFFBQVEsS0FBSyxNQUFNO0FBQUEsSUFFL0IsT0FBTyxRQUFRLFVBQVcsS0FBSyxhQUFhLEdBQ3JDLHFDQUFxQyxLQUFLLGFBQWEsT0FBTztBQUFBLElBRXJFLEtBQUssUUFBUSxRQUFRLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQztBQUFBLElBQ3RDLEtBQUssVUFBVTtBQUFBO0FBQUEsRUFHakIsU0FBUyxVQUFVLFdBQVcsU0FBUyxRQUFRLENBQUMsS0FBSyxLQUFLLEtBQUssUUFBUTtBQUFBLElBQ3JFLElBQUksS0FBSyxVQUFVLEtBQUs7QUFBQSxNQUN0QixNQUFNLElBQUksTUFBTSxvQkFBb0I7QUFBQSxJQUd0QyxJQUFJLE9BQU8sUUFBUSxVQUFVO0FBQUEsTUFDM0IsU0FBUztBQUFBLE1BQ1QsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUdBLElBQUksS0FBSztBQUFBLE1BQ1AsTUFBTSxNQUFNLFFBQVEsS0FBSyxVQUFVLEtBQUs7QUFBQSxNQUN4QyxLQUFLLFFBQVEsR0FBRztBQUFBLElBQ2xCO0FBQUEsSUFFQSxJQUFJLE9BQU8sQ0FBQztBQUFBLElBQ1osT0FBTyxLQUFLLFNBQVMsS0FBSztBQUFBLE1BQ3hCLEtBQUssSUFBSSxLQUFLLE1BQU0sRUFBRSxPQUFPLEtBQUssQ0FBQyxFQUFFLE9BQU87QUFBQSxNQUM1QyxPQUFPLEtBQUssT0FBTyxLQUFLLENBQUM7QUFBQSxJQUMzQjtBQUFBLElBRUEsSUFBSSxNQUFNLEtBQUssTUFBTSxHQUFHLEdBQUc7QUFBQSxJQUMzQixLQUFLLFFBQVEsR0FBRztBQUFBLElBQ2hCLEtBQUs7QUFBQSxJQUNMLE9BQU8sTUFBTSxPQUFPLEtBQUssR0FBRztBQUFBO0FBQUE7Ozs7RUM3RzlCLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUksU0FBUyxNQUFNO0FBQUEsRUFFbkIsU0FBUyxPQUFPLENBQUMsSUFBSSxVQUFTO0FBQUEsSUFDNUIsS0FBSyxLQUFLO0FBQUEsSUFDVixLQUFLLE9BQU87QUFBQSxJQUNaLEtBQUssTUFBTTtBQUFBLElBR1gsSUFBSSxTQUFRO0FBQUEsTUFDVixLQUFLLGVBQWUsU0FBUSxNQUFNLFNBQVEsT0FBTztBQUFBLElBQ25ELElBQUksU0FBUTtBQUFBLE1BQ1YsS0FBSyxjQUFjLFNBQVEsS0FBSyxTQUFRLE1BQU07QUFBQTtBQUFBLEVBRWxELE9BQU8sVUFBVTtBQUFBLEVBRWpCLFFBQVEsYUFBYSxTQUFTLFVBQVUsQ0FBQyxJQUFJLEtBQUssS0FBSztBQUFBLElBQ3JELElBQUksZUFBZTtBQUFBLE1BQ2pCLE9BQU87QUFBQSxJQUVULE9BQU8sSUFBSSxRQUFRLElBQUk7QUFBQSxNQUNyQjtBQUFBLE1BQ0EsUUFBUTtBQUFBLElBQ1YsQ0FBQztBQUFBO0FBQUEsRUFHSCxRQUFRLGNBQWMsU0FBUyxXQUFXLENBQUMsSUFBSSxNQUFNLEtBQUs7QUFBQSxJQUN4RCxJQUFJLGdCQUFnQjtBQUFBLE1BQ2xCLE9BQU87QUFBQSxJQUVULE9BQU8sSUFBSSxRQUFRLElBQUk7QUFBQSxNQUNyQjtBQUFBLE1BQ0EsU0FBUztBQUFBLElBQ1gsQ0FBQztBQUFBO0FBQUEsRUFHSCxRQUFRLFVBQVUsV0FBVyxTQUFTLFFBQVEsR0FBRztBQUFBLElBQy9DLElBQUksTUFBTSxLQUFLLFVBQVU7QUFBQSxJQUV6QixJQUFJLElBQUksV0FBVztBQUFBLE1BQ2pCLE9BQU8sRUFBRSxRQUFRLE9BQU8sUUFBUSxxQkFBcUI7QUFBQSxJQUN2RCxLQUFLLElBQUksU0FBUztBQUFBLE1BQ2hCLE9BQU8sRUFBRSxRQUFRLE9BQU8sUUFBUSw0QkFBNEI7QUFBQSxJQUM5RCxLQUFLLElBQUksSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEVBQUUsV0FBVztBQUFBLE1BQ3ZDLE9BQU8sRUFBRSxRQUFRLE9BQU8sUUFBUSxzQkFBc0I7QUFBQSxJQUV4RCxPQUFPLEVBQUUsUUFBUSxNQUFNLFFBQVEsS0FBSztBQUFBO0FBQUEsRUFHdEMsUUFBUSxVQUFVLFlBQVksU0FBUyxTQUFTLENBQUMsU0FBUyxLQUFLO0FBQUEsSUFFN0QsSUFBSSxPQUFPLFlBQVksVUFBVTtBQUFBLE1BQy9CLE1BQU07QUFBQSxNQUNOLFVBQVU7QUFBQSxJQUNaO0FBQUEsSUFFQSxLQUFLLEtBQUs7QUFBQSxNQUNSLEtBQUssTUFBTSxLQUFLLEdBQUcsRUFBRSxJQUFJLEtBQUssSUFBSTtBQUFBLElBRXBDLEtBQUs7QUFBQSxNQUNILE9BQU8sS0FBSztBQUFBLElBRWQsT0FBTyxLQUFLLElBQUksT0FBTyxLQUFLLE9BQU87QUFBQTtBQUFBLEVBR3JDLFFBQVEsVUFBVSxhQUFhLFNBQVMsVUFBVSxDQUFDLEtBQUs7QUFBQSxJQUN0RCxJQUFJLFFBQVE7QUFBQSxNQUNWLE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDO0FBQUEsSUFFL0I7QUFBQSxhQUFPLEtBQUs7QUFBQTtBQUFBLEVBR2hCLFFBQVEsVUFBVSxpQkFBaUIsU0FBUyxjQUFjLENBQUMsS0FBSyxLQUFLO0FBQUEsSUFDbkUsS0FBSyxPQUFPLElBQUksR0FBRyxLQUFLLE9BQU8sRUFBRTtBQUFBLElBSWpDLEtBQUssT0FBTyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsTUFBTSxDQUFDO0FBQUE7QUFBQSxFQUc1QyxRQUFRLFVBQVUsZ0JBQWdCLFNBQVMsYUFBYSxDQUFDLEtBQUssS0FBSztBQUFBLElBQ2pFLElBQUksSUFBSSxLQUFLLElBQUksR0FBRztBQUFBLE1BSWxCLElBQUksS0FBSyxHQUFHLE1BQU0sU0FBUyxRQUFRO0FBQUEsUUFDakMsT0FBTyxJQUFJLEdBQUcsbUJBQW1CO0FBQUEsTUFDbkMsRUFBTyxTQUFJLEtBQUssR0FBRyxNQUFNLFNBQVMsV0FDdkIsS0FBSyxHQUFHLE1BQU0sU0FBUyxXQUFXO0FBQUEsUUFDM0MsT0FBTyxJQUFJLEtBQUssSUFBSSxHQUFHLDhCQUE4QjtBQUFBLE1BQ3ZEO0FBQUEsTUFDQSxLQUFLLE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQUEsTUFDM0M7QUFBQSxJQUNGO0FBQUEsSUFDQSxLQUFLLE1BQU0sS0FBSyxHQUFHLE1BQU0sWUFBWSxLQUFLLEdBQUc7QUFBQTtBQUFBLEVBSS9DLFFBQVEsVUFBVSxTQUFTLFNBQVMsTUFBTSxDQUFDLEtBQUs7QUFBQSxJQUM5QyxLQUFJLElBQUksU0FBUyxHQUFHO0FBQUEsTUFDbEIsT0FBTyxJQUFJLFNBQVMsR0FBRyw0QkFBNEI7QUFBQSxJQUNyRDtBQUFBLElBQ0EsT0FBTyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsS0FBSztBQUFBO0FBQUEsRUFJakMsUUFBUSxVQUFVLE9BQU8sU0FBUyxJQUFJLENBQUMsS0FBSyxLQUFLLFVBQVM7QUFBQSxJQUN4RCxPQUFPLEtBQUssR0FBRyxLQUFLLEtBQUssTUFBTSxLQUFLLFFBQU87QUFBQTtBQUFBLEVBRzdDLFFBQVEsVUFBVSxTQUFTLFNBQVMsTUFBTSxDQUFDLEtBQUssV0FBVyxVQUFTO0FBQUEsSUFDbEUsT0FBTyxLQUFLLEdBQUcsT0FBTyxLQUFLLFdBQVcsTUFBTSxXQUFXLFFBQU87QUFBQTtBQUFBLEVBR2hFLFFBQVEsVUFBVSxVQUFVLFNBQVMsT0FBTyxHQUFHO0FBQUEsSUFDN0MsT0FBTyxpQkFBaUIsS0FBSyxRQUFRLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxLQUN0RCxZQUFZLEtBQUssT0FBTyxLQUFLLElBQUksUUFBUSxLQUFLO0FBQUE7QUFBQTs7OztFQ3JIdkQsSUFBSTtBQUFBLEVBRUosSUFBSTtBQUFBLEVBQ0osSUFBSSxTQUFTLE1BQU07QUFBQSxFQUVuQixTQUFTLFNBQVMsQ0FBQyxVQUFTLEtBQUs7QUFBQSxJQUMvQixJQUFJLG9CQUFtQjtBQUFBLE1BQ3JCLE9BQU87QUFBQSxJQUVULElBQUksS0FBSyxXQUFXLFVBQVMsR0FBRztBQUFBLE1BQzlCO0FBQUEsSUFFRixPQUFPLFNBQVEsS0FBSyxTQUFRLEdBQUcsMEJBQTBCO0FBQUEsSUFDekQsS0FBSyxJQUFJLElBQUksR0FBRyxTQUFRLEdBQUcsRUFBRTtBQUFBLElBQzdCLEtBQUssSUFBSSxJQUFJLEdBQUcsU0FBUSxHQUFHLEVBQUU7QUFBQSxJQUM3QixJQUFJLFNBQVEsa0JBQWtCO0FBQUEsTUFDNUIsS0FBSyxnQkFBZ0I7QUFBQSxJQUVyQjtBQUFBLFdBQUssZ0JBQWdCLFNBQVE7QUFBQTtBQUFBLEVBRWpDLE9BQU8sVUFBVTtBQUFBLEVBRWpCLFNBQVMsUUFBUSxHQUFHO0FBQUEsSUFDbEIsS0FBSyxRQUFRO0FBQUE7QUFBQSxFQUdmLFNBQVMsU0FBUyxDQUFDLEtBQUssR0FBRztBQUFBLElBQ3pCLElBQUksVUFBVSxJQUFJLEVBQUU7QUFBQSxJQUNwQixNQUFNLFVBQVUsTUFBTztBQUFBLE1BQ3JCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFJLFdBQVcsVUFBVTtBQUFBLElBR3pCLElBQUksYUFBYSxLQUFLLFdBQVcsR0FBRztBQUFBLE1BQ2xDLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxJQUFHLElBQUksRUFBRSxXQUFXLEdBQU07QUFBQSxNQUN4QixPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsSUFBSSxNQUFNO0FBQUEsSUFDVixTQUFTLElBQUksR0FBRyxNQUFNLEVBQUUsTUFBTyxJQUFJLFVBQVUsS0FBSyxPQUFPO0FBQUEsTUFDdkQsUUFBUTtBQUFBLE1BQ1IsT0FBTyxJQUFJO0FBQUEsTUFDWCxTQUFTO0FBQUEsSUFDWDtBQUFBLElBR0EsSUFBSSxPQUFPLEtBQU07QUFBQSxNQUNmLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxFQUFFLFFBQVE7QUFBQSxJQUNWLE9BQU87QUFBQTtBQUFBLEVBR1QsU0FBUyxTQUFTLENBQUMsS0FBSztBQUFBLElBQ3RCLElBQUksSUFBSTtBQUFBLElBQ1IsSUFBSSxNQUFNLElBQUksU0FBUztBQUFBLElBQ3ZCLFFBQVEsSUFBSSxRQUFRLElBQUksSUFBSSxLQUFLLFFBQVMsSUFBSSxLQUFLO0FBQUEsTUFDakQ7QUFBQSxJQUNGO0FBQUEsSUFDQSxJQUFJLE1BQU0sR0FBRztBQUFBLE1BQ1gsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLE9BQU8sSUFBSSxNQUFNLENBQUM7QUFBQTtBQUFBLEVBR3BCLFVBQVUsVUFBVSxhQUFhLFNBQVMsVUFBVSxDQUFDLE1BQU0sS0FBSztBQUFBLElBQzlELE9BQU8sTUFBTSxRQUFRLE1BQU0sR0FBRztBQUFBLElBQzlCLElBQUksSUFBSSxJQUFJO0FBQUEsSUFDWixJQUFJLEtBQUssRUFBRSxhQUFhLElBQU07QUFBQSxNQUM1QixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsSUFBSSxNQUFNLFVBQVUsTUFBTSxDQUFDO0FBQUEsSUFDM0IsSUFBSSxRQUFRLE9BQU87QUFBQSxNQUNqQixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsSUFBSyxNQUFNLEVBQUUsVUFBVyxLQUFLLFFBQVE7QUFBQSxNQUNuQyxPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsSUFBSSxLQUFLLEVBQUUsYUFBYSxHQUFNO0FBQUEsTUFDNUIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLElBQUksT0FBTyxVQUFVLE1BQU0sQ0FBQztBQUFBLElBQzVCLElBQUksU0FBUyxPQUFPO0FBQUEsTUFDbEIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLEtBQUssS0FBSyxFQUFFLFNBQVMsU0FBUyxHQUFHO0FBQUEsTUFDL0IsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRSxPQUFPLE9BQU8sRUFBRSxLQUFLO0FBQUEsSUFDMUMsRUFBRSxTQUFTO0FBQUEsSUFDWCxJQUFJLEtBQUssRUFBRSxhQUFhLEdBQU07QUFBQSxNQUM1QixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsSUFBSSxPQUFPLFVBQVUsTUFBTSxDQUFDO0FBQUEsSUFDNUIsSUFBSSxTQUFTLE9BQU87QUFBQSxNQUNsQixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsSUFBSSxLQUFLLFdBQVcsT0FBTyxFQUFFLE9BQU87QUFBQSxNQUNsQyxPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsS0FBSyxLQUFLLEVBQUUsU0FBUyxTQUFTLEdBQUc7QUFBQSxNQUMvQixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFLE9BQU8sT0FBTyxFQUFFLEtBQUs7QUFBQSxJQUMxQyxJQUFJLEVBQUUsT0FBTyxHQUFHO0FBQUEsTUFDZCxJQUFJLEVBQUUsS0FBSyxLQUFNO0FBQUEsUUFDZixJQUFJLEVBQUUsTUFBTSxDQUFDO0FBQUEsTUFDZixFQUFPO0FBQUEsUUFFTCxPQUFPO0FBQUE7QUFBQSxJQUVYO0FBQUEsSUFDQSxJQUFJLEVBQUUsT0FBTyxHQUFHO0FBQUEsTUFDZCxJQUFJLEVBQUUsS0FBSyxLQUFNO0FBQUEsUUFDZixJQUFJLEVBQUUsTUFBTSxDQUFDO0FBQUEsTUFDZixFQUFPO0FBQUEsUUFFTCxPQUFPO0FBQUE7QUFBQSxJQUVYO0FBQUEsSUFFQSxLQUFLLElBQUksSUFBSSxHQUFHLENBQUM7QUFBQSxJQUNqQixLQUFLLElBQUksSUFBSSxHQUFHLENBQUM7QUFBQSxJQUNqQixLQUFLLGdCQUFnQjtBQUFBLElBRXJCLE9BQU87QUFBQTtBQUFBLEVBR1QsU0FBUyxlQUFlLENBQUMsS0FBSyxLQUFLO0FBQUEsSUFDakMsSUFBSSxNQUFNLEtBQU07QUFBQSxNQUNkLElBQUksS0FBSyxHQUFHO0FBQUEsTUFDWjtBQUFBLElBQ0Y7QUFBQSxJQUNBLElBQUksU0FBUyxLQUFLLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRO0FBQUEsSUFDL0MsSUFBSSxLQUFLLFNBQVMsR0FBSTtBQUFBLElBQ3RCLFNBQVMsUUFBUTtBQUFBLE1BQ2YsSUFBSSxLQUFNLFNBQVMsVUFBVSxLQUFNLEdBQUk7QUFBQSxJQUN6QztBQUFBLElBQ0EsSUFBSSxLQUFLLEdBQUc7QUFBQTtBQUFBLEVBR2QsVUFBVSxVQUFVLFFBQVEsU0FBUyxLQUFLLENBQUMsS0FBSztBQUFBLElBQzlDLElBQUksSUFBSSxLQUFLLEVBQUUsUUFBUTtBQUFBLElBQ3ZCLElBQUksSUFBSSxLQUFLLEVBQUUsUUFBUTtBQUFBLElBR3ZCLElBQUksRUFBRSxLQUFLO0FBQUEsTUFDVCxJQUFJLENBQUUsQ0FBRSxFQUFFLE9BQU8sQ0FBQztBQUFBLElBRXBCLElBQUksRUFBRSxLQUFLO0FBQUEsTUFDVCxJQUFJLENBQUUsQ0FBRSxFQUFFLE9BQU8sQ0FBQztBQUFBLElBRXBCLElBQUksVUFBVSxDQUFDO0FBQUEsSUFDZixJQUFJLFVBQVUsQ0FBQztBQUFBLElBRWYsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLE1BQU87QUFBQSxNQUM5QixJQUFJLEVBQUUsTUFBTSxDQUFDO0FBQUEsSUFDZjtBQUFBLElBQ0EsSUFBSSxNQUFNLENBQUUsQ0FBSztBQUFBLElBQ2pCLGdCQUFnQixLQUFLLEVBQUUsTUFBTTtBQUFBLElBQzdCLE1BQU0sSUFBSSxPQUFPLENBQUM7QUFBQSxJQUNsQixJQUFJLEtBQUssQ0FBSTtBQUFBLElBQ2IsZ0JBQWdCLEtBQUssRUFBRSxNQUFNO0FBQUEsSUFDN0IsSUFBSSxXQUFXLElBQUksT0FBTyxDQUFDO0FBQUEsSUFDM0IsSUFBSSxNQUFNLENBQUUsRUFBSztBQUFBLElBQ2pCLGdCQUFnQixLQUFLLFNBQVMsTUFBTTtBQUFBLElBQ3BDLE1BQU0sSUFBSSxPQUFPLFFBQVE7QUFBQSxJQUN6QixPQUFPLE1BQU0sT0FBTyxLQUFLLEdBQUc7QUFBQTtBQUFBOzs7O0VDNUs5QixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJLFNBQVMsTUFBTTtBQUFBLEVBRW5CLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUVKLFNBQVMsRUFBRSxDQUFDLFVBQVM7QUFBQSxJQUNuQixNQUFNLGdCQUFnQjtBQUFBLE1BQ3BCLE9BQU8sSUFBSSxHQUFHLFFBQU87QUFBQSxJQUd2QixJQUFJLE9BQU8sYUFBWSxVQUFVO0FBQUEsTUFDL0IsT0FBTyxPQUFPLFVBQVUsZUFBZSxLQUFLLFFBQVEsUUFBTyxHQUN6RCxtQkFBbUIsUUFBTztBQUFBLE1BRTVCLFdBQVUsT0FBTztBQUFBLElBQ25CO0FBQUEsSUFHQSxJQUFJLG9CQUFtQixPQUFPO0FBQUEsTUFDNUIsV0FBVSxFQUFFLE9BQU8sU0FBUTtBQUFBLElBRTdCLEtBQUssUUFBUSxTQUFRLE1BQU07QUFBQSxJQUMzQixLQUFLLElBQUksS0FBSyxNQUFNO0FBQUEsSUFDcEIsS0FBSyxLQUFLLEtBQUssRUFBRSxNQUFNLENBQUM7QUFBQSxJQUN4QixLQUFLLElBQUksS0FBSyxNQUFNO0FBQUEsSUFHcEIsS0FBSyxJQUFJLFNBQVEsTUFBTTtBQUFBLElBQ3ZCLEtBQUssRUFBRSxXQUFXLFNBQVEsTUFBTSxFQUFFLFVBQVUsSUFBSSxDQUFDO0FBQUEsSUFHakQsS0FBSyxPQUFPLFNBQVEsUUFBUSxTQUFRLE1BQU07QUFBQTtBQUFBLEVBRTVDLE9BQU8sVUFBVTtBQUFBLEVBRWpCLEdBQUcsVUFBVSxVQUFVLFNBQVMsT0FBTyxDQUFDLFVBQVM7QUFBQSxJQUMvQyxPQUFPLElBQUksUUFBUSxNQUFNLFFBQU87QUFBQTtBQUFBLEVBR2xDLEdBQUcsVUFBVSxpQkFBaUIsU0FBUyxjQUFjLENBQUMsTUFBTSxLQUFLO0FBQUEsSUFDL0QsT0FBTyxRQUFRLFlBQVksTUFBTSxNQUFNLEdBQUc7QUFBQTtBQUFBLEVBRzVDLEdBQUcsVUFBVSxnQkFBZ0IsU0FBUyxhQUFhLENBQUMsS0FBSyxLQUFLO0FBQUEsSUFDNUQsT0FBTyxRQUFRLFdBQVcsTUFBTSxLQUFLLEdBQUc7QUFBQTtBQUFBLEVBRzFDLEdBQUcsVUFBVSxhQUFhLFNBQVMsVUFBVSxDQUFDLFVBQVM7QUFBQSxJQUNyRCxLQUFLO0FBQUEsTUFDSCxXQUFVLENBQUM7QUFBQSxJQUdiLElBQUksT0FBTyxJQUFJLFNBQVM7QUFBQSxNQUN0QixNQUFNLEtBQUs7QUFBQSxNQUNYLE1BQU0sU0FBUTtBQUFBLE1BQ2QsU0FBUyxTQUFRLFdBQVc7QUFBQSxNQUM1QixTQUFTLFNBQVEsV0FBVyxLQUFLLEtBQUssS0FBSyxZQUFZO0FBQUEsTUFDdkQsWUFBWSxTQUFRLFdBQVcsU0FBUSxjQUFjO0FBQUEsTUFDckQsT0FBTyxLQUFLLEVBQUUsUUFBUTtBQUFBLElBQ3hCLENBQUM7QUFBQSxJQUVELElBQUksUUFBUSxLQUFLLEVBQUUsV0FBVztBQUFBLElBQzlCLElBQUksTUFBTSxLQUFLLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQUEsSUFDOUIsVUFBUztBQUFBLE1BQ1AsSUFBSSxPQUFPLElBQUksR0FBRyxLQUFLLFNBQVMsS0FBSyxDQUFDO0FBQUEsTUFDdEMsSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJO0FBQUEsUUFDbEI7QUFBQSxNQUVGLEtBQUssTUFBTSxDQUFDO0FBQUEsTUFDWixPQUFPLEtBQUssZUFBZSxJQUFJO0FBQUEsSUFDakM7QUFBQTtBQUFBLEVBR0YsR0FBRyxVQUFVLGVBQWUsU0FBUyxZQUFZLENBQUMsS0FBSyxXQUFXLFdBQVc7QUFBQSxJQUMzRSxJQUFJO0FBQUEsSUFDSixJQUFJLEdBQUcsS0FBSyxHQUFHLEtBQUssT0FBTyxRQUFRLFVBQVU7QUFBQSxNQUMzQyxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUU7QUFBQSxNQUNwQixhQUFhLElBQUksV0FBVztBQUFBLElBQzlCLEVBQU8sU0FBSSxPQUFPLFFBQVEsVUFBVTtBQUFBLE1BRWxDLGFBQWEsSUFBSTtBQUFBLE1BQ2pCLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFBRTtBQUFBLElBQ3RCLEVBQU87QUFBQSxNQUVMLElBQUksTUFBTSxJQUFJLFNBQVM7QUFBQSxNQUV2QixhQUFjLElBQUksU0FBUyxNQUFPO0FBQUEsTUFDbEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFO0FBQUE7QUFBQSxJQUd0QixJQUFJLE9BQU8sY0FBYyxVQUFVO0FBQUEsTUFDakMsWUFBWSxhQUFhO0FBQUEsSUFDM0I7QUFBQSxJQUNBLElBQUksUUFBUSxZQUFZLEtBQUssRUFBRSxVQUFVO0FBQUEsSUFDekMsSUFBSSxRQUFRO0FBQUEsTUFDVixNQUFNLElBQUksTUFBTSxLQUFLO0FBQUEsSUFDdkIsS0FBSyxhQUFhLElBQUksSUFBSSxLQUFLLENBQUMsS0FBSztBQUFBLE1BQ25DLE9BQU8sSUFBSSxJQUFJLEtBQUssQ0FBQztBQUFBLElBRXJCO0FBQUEsYUFBTztBQUFBO0FBQUEsRUFHWCxHQUFHLFVBQVUsT0FBTyxTQUFTLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxVQUFTO0FBQUEsSUFDeEQsSUFBSSxPQUFPLFFBQVEsVUFBVTtBQUFBLE1BQzNCLFdBQVU7QUFBQSxNQUNWLE1BQU07QUFBQSxJQUNSO0FBQUEsSUFDQSxLQUFLO0FBQUEsTUFDSCxXQUFVLENBQUM7QUFBQSxJQUViLElBQUksT0FBTyxRQUFRLFlBQVksT0FBTyxRQUFRLGFBQWEsR0FBRyxLQUFLLEdBQUcsR0FBRztBQUFBLE1BQ3ZFLE9BQU8sT0FBTyxRQUFRLFlBQVksT0FBTyxPQUFPLElBQUksV0FBVyxVQUM3RCxzRUFBc0U7QUFBQSxNQUN4RSxPQUFRLElBQUksV0FBVyxNQUFPLElBQUksTUFBTTtBQUFBLE1BQ3hDLFNBQVMsSUFBSSxFQUFHLElBQUksSUFBSSxRQUFRO0FBQUEsUUFBSyxRQUFRLElBQUksS0FBSyxTQUFTLElBQUksRUFBRTtBQUFBLElBQ3ZFO0FBQUEsSUFFQSxNQUFNLEtBQUssZUFBZSxLQUFLLEdBQUc7QUFBQSxJQUNsQyxNQUFNLEtBQUssYUFBYSxLQUFLLE9BQU8sU0FBUSxZQUFZO0FBQUEsSUFHeEQsUUFBUSxJQUFJLE1BQU0sR0FBRyxpQ0FBaUM7QUFBQSxJQUd0RCxJQUFJLFFBQVEsS0FBSyxFQUFFLFdBQVc7QUFBQSxJQUM5QixJQUFJLE9BQU8sSUFBSSxXQUFXLEVBQUUsUUFBUSxNQUFNLEtBQUs7QUFBQSxJQUcvQyxJQUFJLFFBQVEsSUFBSSxRQUFRLE1BQU0sS0FBSztBQUFBLElBR25DLE9BQVEsSUFBSSxHQUFHLEtBQUssRUFBRyxHQUFHLEdBQUcsR0FBRyxzQkFBc0I7QUFBQSxJQUd0RCxJQUFJLE9BQU8sSUFBSSxTQUFTO0FBQUEsTUFDdEIsTUFBTSxLQUFLO0FBQUEsTUFDWCxTQUFTO0FBQUEsTUFDVDtBQUFBLE1BQ0EsTUFBTSxTQUFRO0FBQUEsTUFDZCxTQUFTLFNBQVEsV0FBVztBQUFBLElBQzlCLENBQUM7QUFBQSxJQUdELElBQUksTUFBTSxLQUFLLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQUEsSUFFOUIsU0FBUyxPQUFPLElBQUssUUFBUTtBQUFBLE1BQzNCLElBQUksSUFBSSxTQUFRLElBQ2QsU0FBUSxFQUFFLElBQUksSUFDZCxJQUFJLEdBQUcsS0FBSyxTQUFTLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztBQUFBLE1BQzNDLElBQUksS0FBSyxhQUFhLEdBQUcsSUFBSTtBQUFBLE1BQzdCLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxLQUFLLEVBQUUsSUFBSSxHQUFHLEtBQUs7QUFBQSxRQUNsQztBQUFBLE1BRUYsSUFBSSxLQUFLLEtBQUssRUFBRSxJQUFJLENBQUM7QUFBQSxNQUNyQixJQUFJLEdBQUcsV0FBVztBQUFBLFFBQ2hCO0FBQUEsTUFFRixJQUFJLE1BQU0sR0FBRyxLQUFLO0FBQUEsTUFDbEIsSUFBSSxJQUFJLElBQUksS0FBSyxLQUFLLENBQUM7QUFBQSxNQUN2QixJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU07QUFBQSxRQUNoQjtBQUFBLE1BRUYsSUFBSSxJQUFJLEVBQUUsS0FBSyxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDO0FBQUEsTUFDNUQsSUFBSSxFQUFFLEtBQUssS0FBSyxDQUFDO0FBQUEsTUFDakIsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNO0FBQUEsUUFDaEI7QUFBQSxNQUVGLElBQUksaUJBQWlCLEdBQUcsS0FBSyxFQUFFLE1BQU0sSUFBSSxJQUFJLE1BQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJO0FBQUEsTUFHNUMsSUFBSSxTQUFRLGFBQWEsRUFBRSxJQUFJLEtBQUssRUFBRSxJQUFJLEdBQUc7QUFBQSxRQUMzQyxJQUFJLEtBQUssRUFBRSxJQUFJLENBQUM7QUFBQSxRQUNoQixpQkFBaUI7QUFBQSxNQUNuQjtBQUFBLE1BRUEsT0FBTyxJQUFJLFVBQVUsRUFBRSxHQUFNLEdBQU0sY0FBNkIsQ0FBQztBQUFBLElBQ25FO0FBQUE7QUFBQSxFQUdGLEdBQUcsVUFBVSxTQUFTLFNBQVMsTUFBTSxDQUFDLEtBQUssV0FBVyxLQUFLLEtBQUssVUFBUztBQUFBLElBQ3ZFLEtBQUs7QUFBQSxNQUNILFdBQVUsQ0FBQztBQUFBLElBRWIsTUFBTSxLQUFLLGFBQWEsS0FBSyxPQUFPLFNBQVEsWUFBWTtBQUFBLElBQ3hELE1BQU0sS0FBSyxjQUFjLEtBQUssR0FBRztBQUFBLElBQ2pDLFlBQVksSUFBSSxVQUFVLFdBQVcsS0FBSztBQUFBLElBRzFDLElBQUksSUFBSSxVQUFVO0FBQUEsSUFDbEIsSUFBSSxJQUFJLFVBQVU7QUFBQSxJQUNsQixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLEtBQUs7QUFBQSxNQUNwQyxPQUFPO0FBQUEsSUFDVCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLEtBQUs7QUFBQSxNQUNwQyxPQUFPO0FBQUEsSUFHVCxJQUFJLE9BQU8sRUFBRSxLQUFLLEtBQUssQ0FBQztBQUFBLElBQ3hCLElBQUksS0FBSyxLQUFLLElBQUksR0FBRyxFQUFFLEtBQUssS0FBSyxDQUFDO0FBQUEsSUFDbEMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUM7QUFBQSxJQUNoQyxJQUFJO0FBQUEsSUFFSixLQUFLLEtBQUssTUFBTSxlQUFlO0FBQUEsTUFDN0IsSUFBSSxLQUFLLEVBQUUsT0FBTyxJQUFJLElBQUksVUFBVSxHQUFHLEVBQUU7QUFBQSxNQUN6QyxJQUFJLEVBQUUsV0FBVztBQUFBLFFBQ2YsT0FBTztBQUFBLE1BRVQsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNO0FBQUEsSUFDMUM7QUFBQSxJQUtBLElBQUksS0FBSyxFQUFFLFFBQVEsSUFBSSxJQUFJLFVBQVUsR0FBRyxFQUFFO0FBQUEsSUFDMUMsSUFBSSxFQUFFLFdBQVc7QUFBQSxNQUNmLE9BQU87QUFBQSxJQUtULE9BQU8sRUFBRSxPQUFPLENBQUM7QUFBQTtBQUFBLEVBR25CLEdBQUcsVUFBVSxnQkFBZ0IsUUFBUSxDQUFDLEtBQUssV0FBVyxHQUFHLEtBQUs7QUFBQSxJQUM1RCxRQUFRLElBQUksT0FBTyxHQUFHLDBDQUEwQztBQUFBLElBQ2hFLFlBQVksSUFBSSxVQUFVLFdBQVcsR0FBRztBQUFBLElBRXhDLElBQUksSUFBSSxLQUFLO0FBQUEsSUFDYixJQUFJLElBQUksSUFBSSxHQUFHLEdBQUc7QUFBQSxJQUNsQixJQUFJLElBQUksVUFBVTtBQUFBLElBQ2xCLElBQUksSUFBSSxVQUFVO0FBQUEsSUFHbEIsSUFBSSxTQUFTLElBQUk7QUFBQSxJQUNqQixJQUFJLGNBQWMsS0FBSztBQUFBLElBQ3ZCLElBQUksRUFBRSxJQUFJLEtBQUssTUFBTSxFQUFFLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQyxLQUFLLEtBQUs7QUFBQSxNQUNqRCxNQUFNLElBQUksTUFBTSxzQ0FBc0M7QUFBQSxJQUd4RCxJQUFJO0FBQUEsTUFDRixJQUFJLEtBQUssTUFBTSxXQUFXLEVBQUUsSUFBSSxLQUFLLE1BQU0sQ0FBQyxHQUFHLE1BQU07QUFBQSxJQUVyRDtBQUFBLFVBQUksS0FBSyxNQUFNLFdBQVcsR0FBRyxNQUFNO0FBQUEsSUFFckMsSUFBSSxPQUFPLFVBQVUsRUFBRSxLQUFLLENBQUM7QUFBQSxJQUM3QixJQUFJLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxLQUFLLENBQUM7QUFBQSxJQUNsQyxJQUFJLEtBQUssRUFBRSxJQUFJLElBQUksRUFBRSxLQUFLLENBQUM7QUFBQSxJQUkzQixPQUFPLEtBQUssRUFBRSxPQUFPLElBQUksR0FBRyxFQUFFO0FBQUE7QUFBQSxFQUdoQyxHQUFHLFVBQVUsc0JBQXNCLFFBQVEsQ0FBQyxHQUFHLFdBQVcsR0FBRyxLQUFLO0FBQUEsSUFDaEUsWUFBWSxJQUFJLFVBQVUsV0FBVyxHQUFHO0FBQUEsSUFDeEMsSUFBSSxVQUFVLGtCQUFrQjtBQUFBLE1BQzlCLE9BQU8sVUFBVTtBQUFBLElBRW5CLFNBQVMsSUFBSSxFQUFHLElBQUksR0FBRyxLQUFLO0FBQUEsTUFDMUIsSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLFFBQ0YsU0FBUyxLQUFLLGNBQWMsR0FBRyxXQUFXLENBQUM7QUFBQSxRQUMzQyxPQUFPLElBQUc7QUFBQSxRQUNWO0FBQUE7QUFBQSxNQUdGLElBQUksT0FBTyxHQUFHLENBQUM7QUFBQSxRQUNiLE9BQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxNQUFNLElBQUksTUFBTSxzQ0FBc0M7QUFBQTtBQUFBOzs7O0VDbFJ4RCxJQUFJO0FBQUEsRUFDSixJQUFJLFNBQVMsTUFBTTtBQUFBLEVBQ25CLElBQUksYUFBYSxNQUFNO0FBQUEsRUFDdkIsSUFBSSxpQkFBaUIsTUFBTTtBQUFBLEVBVzNCLFNBQVMsT0FBTyxDQUFDLE9BQU8sUUFBUTtBQUFBLElBQzlCLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxVQUFVLFdBQVcsT0FBTyxNQUFNO0FBQUEsSUFDdkMsSUFBSSxNQUFNLFFBQVEsT0FBTyxHQUFHO0FBQUEsTUFDMUIsS0FBSyxPQUFPLE9BQU87QUFBQSxJQUVuQjtBQUFBLFdBQUssWUFBWSxXQUFXLE9BQU8sR0FBRztBQUFBO0FBQUEsRUFHMUMsUUFBUSxhQUFhLFNBQVMsVUFBVSxDQUFDLE9BQU8sS0FBSztBQUFBLElBQ25ELElBQUksZUFBZTtBQUFBLE1BQ2pCLE9BQU87QUFBQSxJQUNULE9BQU8sSUFBSSxRQUFRLE9BQU8sRUFBRSxJQUFTLENBQUM7QUFBQTtBQUFBLEVBR3hDLFFBQVEsYUFBYSxTQUFTLFVBQVUsQ0FBQyxPQUFPLFFBQVE7QUFBQSxJQUN0RCxJQUFJLGtCQUFrQjtBQUFBLE1BQ3BCLE9BQU87QUFBQSxJQUNULE9BQU8sSUFBSSxRQUFRLE9BQU8sRUFBRSxPQUFlLENBQUM7QUFBQTtBQUFBLEVBRzlDLFFBQVEsVUFBVSxTQUFTLFNBQVMsTUFBTSxHQUFHO0FBQUEsSUFDM0MsT0FBTyxLQUFLO0FBQUE7QUFBQSxFQUdkLGVBQWUsU0FBUyxZQUFZLFNBQVMsUUFBUSxHQUFHO0FBQUEsSUFDdEQsT0FBTyxLQUFLLE1BQU0sWUFBWSxLQUFLLElBQUksQ0FBQztBQUFBLEdBQ3pDO0FBQUEsRUFFRCxlQUFlLFNBQVMsT0FBTyxTQUFTLEdBQUcsR0FBRztBQUFBLElBQzVDLElBQUksS0FBSztBQUFBLE1BQ1AsT0FBTyxLQUFLLE1BQU0sWUFBWSxLQUFLLFNBQVM7QUFBQSxJQUM5QyxPQUFPLEtBQUssTUFBTSxFQUFFLElBQUksS0FBSyxLQUFLLENBQUM7QUFBQSxHQUNwQztBQUFBLEVBRUQsZUFBZSxTQUFTLGFBQWEsU0FBUyxTQUFTLEdBQUc7QUFBQSxJQUN4RCxJQUFJLFFBQVEsS0FBSztBQUFBLElBQ2pCLElBQUksT0FBTyxLQUFLLEtBQUs7QUFBQSxJQUNyQixJQUFJLFNBQVMsTUFBTSxpQkFBaUI7QUFBQSxJQUVwQyxJQUFJLElBQUksS0FBSyxNQUFNLEdBQUcsTUFBTSxjQUFjO0FBQUEsSUFDMUMsRUFBRSxNQUFNO0FBQUEsSUFDUixFQUFFLFdBQVc7QUFBQSxJQUNiLEVBQUUsV0FBVztBQUFBLElBRWIsT0FBTztBQUFBLEdBQ1I7QUFBQSxFQUVELGVBQWUsU0FBUyxRQUFRLFNBQVMsSUFBSSxHQUFHO0FBQUEsSUFDOUMsT0FBTyxLQUFLLE1BQU0sVUFBVSxLQUFLLFVBQVUsQ0FBQztBQUFBLEdBQzdDO0FBQUEsRUFFRCxlQUFlLFNBQVMsUUFBUSxTQUFTLElBQUksR0FBRztBQUFBLElBQzlDLE9BQU8sS0FBSyxNQUFNLEtBQUssRUFBRSxPQUFPLEtBQUssT0FBTyxDQUFDLEVBQUUsT0FBTztBQUFBLEdBQ3ZEO0FBQUEsRUFFRCxlQUFlLFNBQVMsaUJBQWlCLFNBQVMsYUFBYSxHQUFHO0FBQUEsSUFDaEUsT0FBTyxLQUFLLEtBQUssRUFBRSxNQUFNLEtBQUssTUFBTSxjQUFjO0FBQUEsR0FDbkQ7QUFBQSxFQUVELFFBQVEsVUFBVSxPQUFPLFNBQVMsSUFBSSxDQUFDLFNBQVM7QUFBQSxJQUM5QyxPQUFPLEtBQUssU0FBUyx5QkFBeUI7QUFBQSxJQUM5QyxPQUFPLEtBQUssTUFBTSxLQUFLLFNBQVMsSUFBSTtBQUFBO0FBQUEsRUFHdEMsUUFBUSxVQUFVLFNBQVMsU0FBUyxNQUFNLENBQUMsU0FBUyxLQUFLO0FBQUEsSUFDdkQsT0FBTyxLQUFLLE1BQU0sT0FBTyxTQUFTLEtBQUssSUFBSTtBQUFBO0FBQUEsRUFHN0MsUUFBUSxVQUFVLFlBQVksU0FBUyxTQUFTLENBQUMsS0FBSztBQUFBLElBQ3BELE9BQU8sS0FBSyxTQUFTLHdCQUF3QjtBQUFBLElBQzdDLE9BQU8sTUFBTSxPQUFPLEtBQUssT0FBTyxHQUFHLEdBQUc7QUFBQTtBQUFBLEVBR3hDLFFBQVEsVUFBVSxZQUFZLFNBQVMsU0FBUyxDQUFDLEtBQUs7QUFBQSxJQUNwRCxPQUFPLE1BQU0sT0FBTyxLQUFLLFNBQVMsR0FBRyxHQUFHO0FBQUE7QUFBQSxFQUcxQyxPQUFPLFVBQVU7QUFBQTs7OztFQzVGakIsSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBQ0osSUFBSSxTQUFTLE1BQU07QUFBQSxFQUNuQixJQUFJLGlCQUFpQixNQUFNO0FBQUEsRUFDM0IsSUFBSSxhQUFhLE1BQU07QUFBQSxFQVV2QixTQUFTLFNBQVMsQ0FBQyxPQUFPLEtBQUs7QUFBQSxJQUM3QixLQUFLLFFBQVE7QUFBQSxJQUViLElBQUksT0FBTyxRQUFRO0FBQUEsTUFDakIsTUFBTSxXQUFXLEdBQUc7QUFBQSxJQUV0QixJQUFJLE1BQU0sUUFBUSxHQUFHLEdBQUc7QUFBQSxNQUN0QixPQUFPLElBQUksV0FBVyxNQUFNLGlCQUFpQixHQUFHLDRCQUE0QjtBQUFBLE1BQzVFLE1BQU07QUFBQSxRQUNKLEdBQUcsSUFBSSxNQUFNLEdBQUcsTUFBTSxjQUFjO0FBQUEsUUFDcEMsR0FBRyxJQUFJLE1BQU0sTUFBTSxjQUFjO0FBQUEsTUFDbkM7QUFBQSxJQUNGO0FBQUEsSUFFQSxPQUFPLElBQUksS0FBSyxJQUFJLEdBQUcsMEJBQTBCO0FBQUEsSUFFakQsSUFBSSxNQUFNLFFBQVEsSUFBSSxDQUFDO0FBQUEsTUFDckIsS0FBSyxLQUFLLElBQUk7QUFBQSxJQUNoQixJQUFJLElBQUksYUFBYTtBQUFBLE1BQ25CLEtBQUssS0FBSyxJQUFJO0FBQUEsSUFFaEIsS0FBSyxZQUFZLE1BQU0sUUFBUSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSTtBQUFBLElBQ3BELEtBQUssWUFBWSxNQUFNLFFBQVEsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUk7QUFBQTtBQUFBLEVBR3RELGVBQWUsV0FBVyxLQUFLLFNBQVMsQ0FBQyxHQUFHO0FBQUEsSUFDMUMsT0FBTyxLQUFLLE1BQU0sVUFBVSxLQUFLLFNBQVMsQ0FBQztBQUFBLEdBQzVDO0FBQUEsRUFFRCxlQUFlLFdBQVcsS0FBSyxTQUFTLENBQUMsR0FBRztBQUFBLElBQzFDLE9BQU8sS0FBSyxNQUFNLFlBQVksS0FBSyxTQUFTLENBQUM7QUFBQSxHQUM5QztBQUFBLEVBRUQsZUFBZSxXQUFXLFlBQVksU0FBUyxRQUFRLEdBQUc7QUFBQSxJQUN4RCxPQUFPLEtBQUssTUFBTSxZQUFZLEtBQUssRUFBRSxDQUFDO0FBQUEsR0FDdkM7QUFBQSxFQUVELGVBQWUsV0FBVyxZQUFZLFNBQVMsUUFBUSxHQUFHO0FBQUEsSUFDeEQsT0FBTyxLQUFLLE1BQU0sVUFBVSxLQUFLLEVBQUUsQ0FBQztBQUFBLEdBQ3JDO0FBQUEsRUFFRCxVQUFVLFVBQVUsVUFBVSxTQUFTLE9BQU8sR0FBRztBQUFBLElBQy9DLE9BQU8sS0FBSyxTQUFTLEVBQUUsT0FBTyxLQUFLLFNBQVMsQ0FBQztBQUFBO0FBQUEsRUFHL0MsVUFBVSxVQUFVLFFBQVEsU0FBUyxLQUFLLEdBQUc7QUFBQSxJQUMzQyxPQUFPLE1BQU0sT0FBTyxLQUFLLFFBQVEsR0FBRyxLQUFLLEVBQUUsWUFBWTtBQUFBO0FBQUEsRUFHekQsT0FBTyxVQUFVO0FBQUE7Ozs7RUMvRGpCLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUksU0FBUyxNQUFNO0FBQUEsRUFDbkIsSUFBSSxhQUFhLE1BQU07QUFBQSxFQUN2QixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFFSixTQUFTLEtBQUssQ0FBQyxPQUFPO0FBQUEsSUFDcEIsT0FBTyxVQUFVLFdBQVcsaUNBQWlDO0FBQUEsSUFFN0QsTUFBTSxnQkFBZ0I7QUFBQSxNQUNwQixPQUFPLElBQUksTUFBTSxLQUFLO0FBQUEsSUFFeEIsUUFBUSxPQUFPLE9BQU87QUFBQSxJQUN0QixLQUFLLFFBQVE7QUFBQSxJQUNiLEtBQUssSUFBSSxNQUFNO0FBQUEsSUFDZixLQUFLLEVBQUUsV0FBVyxNQUFNLEVBQUUsVUFBVSxJQUFJLENBQUM7QUFBQSxJQUV6QyxLQUFLLGFBQWEsTUFBTSxNQUFNLEVBQUU7QUFBQSxJQUNoQyxLQUFLLGlCQUFpQixLQUFLLEtBQUssTUFBTSxFQUFFLFVBQVUsSUFBSSxDQUFDO0FBQUEsSUFDdkQsS0FBSyxPQUFPLEtBQUs7QUFBQTtBQUFBLEVBR25CLE9BQU8sVUFBVTtBQUFBLEVBT2pCLE1BQU0sVUFBVSxPQUFPLFNBQVMsSUFBSSxDQUFDLFNBQVMsUUFBUTtBQUFBLElBQ3BELFVBQVUsV0FBVyxPQUFPO0FBQUEsSUFDNUIsSUFBSSxNQUFNLEtBQUssY0FBYyxNQUFNO0FBQUEsSUFDbkMsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLGNBQWMsR0FBRyxPQUFPO0FBQUEsSUFDakQsSUFBSSxJQUFJLEtBQUssRUFBRSxJQUFJLENBQUM7QUFBQSxJQUNwQixJQUFJLFdBQVcsS0FBSyxZQUFZLENBQUM7QUFBQSxJQUNqQyxJQUFJLEtBQUssS0FBSyxRQUFRLFVBQVUsSUFBSSxTQUFTLEdBQUcsT0FBTyxFQUNwRCxJQUFJLElBQUksS0FBSyxDQUFDO0FBQUEsSUFDakIsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxLQUFLLE1BQU0sQ0FBQztBQUFBLElBQ25DLE9BQU8sS0FBSyxjQUFjLEVBQUUsR0FBTSxHQUFNLFNBQW1CLENBQUM7QUFBQTtBQUFBLEVBUzlELE1BQU0sVUFBVSxTQUFTLFNBQVMsTUFBTSxDQUFDLFNBQVMsS0FBSyxLQUFLO0FBQUEsSUFDMUQsVUFBVSxXQUFXLE9BQU87QUFBQSxJQUM1QixNQUFNLEtBQUssY0FBYyxHQUFHO0FBQUEsSUFDNUIsSUFBSSxJQUFJLEVBQUUsRUFBRSxJQUFJLElBQUksTUFBTSxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxNQUFNLEdBQUc7QUFBQSxNQUNyRCxPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsSUFBSSxNQUFNLEtBQUssY0FBYyxHQUFHO0FBQUEsSUFDaEMsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLFNBQVMsR0FBRyxJQUFJLFNBQVMsR0FBRyxPQUFPO0FBQUEsSUFDNUQsSUFBSSxLQUFLLEtBQUssRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO0FBQUEsSUFDM0IsSUFBSSxVQUFVLElBQUksRUFBRSxFQUFFLElBQUksSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFBQSxJQUMxQyxPQUFPLFFBQVEsR0FBRyxFQUFFO0FBQUE7QUFBQSxFQUd0QixNQUFNLFVBQVUsVUFBVSxTQUFTLE9BQU8sR0FBRztBQUFBLElBQzNDLElBQUksUUFBTyxLQUFLLEtBQUs7QUFBQSxJQUNyQixTQUFTLElBQUksRUFBRyxJQUFJLFVBQVUsUUFBUTtBQUFBLE1BQ3BDLE1BQUssT0FBTyxVQUFVLEVBQUU7QUFBQSxJQUMxQixPQUFPLE1BQU0sVUFBVSxNQUFLLE9BQU8sQ0FBQyxFQUFFLEtBQUssS0FBSyxNQUFNLENBQUM7QUFBQTtBQUFBLEVBR3pELE1BQU0sVUFBVSxnQkFBZ0IsU0FBUyxhQUFhLENBQUMsS0FBSztBQUFBLElBQzFELE9BQU8sUUFBUSxXQUFXLE1BQU0sR0FBRztBQUFBO0FBQUEsRUFHckMsTUFBTSxVQUFVLGdCQUFnQixTQUFTLGFBQWEsQ0FBQyxRQUFRO0FBQUEsSUFDN0QsT0FBTyxRQUFRLFdBQVcsTUFBTSxNQUFNO0FBQUE7QUFBQSxFQUd4QyxNQUFNLFVBQVUsZ0JBQWdCLFNBQVMsYUFBYSxDQUFDLEtBQUs7QUFBQSxJQUMxRCxJQUFJLGVBQWU7QUFBQSxNQUNqQixPQUFPO0FBQUEsSUFDVCxPQUFPLElBQUksVUFBVSxNQUFNLEdBQUc7QUFBQTtBQUFBLEVBV2hDLE1BQU0sVUFBVSxjQUFjLFNBQVMsV0FBVyxDQUFDLE9BQU87QUFBQSxJQUN4RCxJQUFJLE1BQU0sTUFBTSxLQUFLLEVBQUUsUUFBUSxNQUFNLEtBQUssY0FBYztBQUFBLElBQ3hELElBQUksS0FBSyxpQkFBaUIsTUFBTSxNQUFNLEtBQUssRUFBRSxNQUFNLElBQUksTUFBTztBQUFBLElBQzlELE9BQU87QUFBQTtBQUFBLEVBR1QsTUFBTSxVQUFVLGNBQWMsU0FBUyxXQUFXLENBQUMsT0FBTztBQUFBLElBQ3hELFFBQVEsTUFBTSxXQUFXLEtBQUs7QUFBQSxJQUU5QixJQUFJLFNBQVMsTUFBTSxTQUFTO0FBQUEsSUFDNUIsSUFBSSxTQUFTLE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxPQUFPLE1BQU0sV0FBVyxHQUFJO0FBQUEsSUFDaEUsSUFBSSxVQUFVLE1BQU0sVUFBVSxTQUFVO0FBQUEsSUFFeEMsSUFBSSxJQUFJLE1BQU0sVUFBVSxNQUFNO0FBQUEsSUFDOUIsT0FBTyxLQUFLLE1BQU0sV0FBVyxHQUFHLE1BQU07QUFBQTtBQUFBLEVBR3hDLE1BQU0sVUFBVSxZQUFZLFNBQVMsU0FBUyxDQUFDLEtBQUs7QUFBQSxJQUNsRCxPQUFPLElBQUksUUFBUSxNQUFNLEtBQUssY0FBYztBQUFBO0FBQUEsRUFHOUMsTUFBTSxVQUFVLFlBQVksU0FBUyxTQUFTLENBQUMsT0FBTztBQUFBLElBQ3BELE9BQU8sTUFBTSxVQUFVLEtBQUs7QUFBQTtBQUFBLEVBRzlCLE1BQU0sVUFBVSxVQUFVLFNBQVMsT0FBTyxDQUFDLEtBQUs7QUFBQSxJQUM5QyxPQUFPLGVBQWUsS0FBSztBQUFBO0FBQUE7Ozs7RUNySDdCLElBQUksV0FBVztBQUFBLEVBRWYsU0FBUyw0QkFBcUM7QUFBQSxFQUM5QyxTQUFTO0FBQUEsRUFDVCxTQUFTO0FBQUEsRUFDVCxTQUFTO0FBQUEsRUFDVCxTQUFTO0FBQUEsRUFHVCxTQUFTO0FBQUEsRUFDVCxTQUFTO0FBQUE7Ozs7RUNWVCxJQUFJLG9CQUF3QjtBQUFBLEVBQTVCLElBQ0MsZ0NBQWdDO0FBQUEsRUFFakMsT0FBTyxVQUFVLFNBQVMsY0FBYyxDQUFDLEtBQUssTUFBTTtBQUFBLElBQ25ELElBQUksTUFBTSxRQUFPLEtBQUssS0FBSyxRQUFRO0FBQUEsSUFDbkMsSUFBSSxLQUFLLE1BQU0sSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEVBQUUsS0FBSztBQUFBLElBQzFDLElBQUksTUFBTTtBQUFBLE1BQ1QsSUFBSSxLQUFLLENBQUM7QUFBQSxJQUNYO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQTs7OztFQ1RSLE9BQU8seUJBQTZCLE9BQU8sc0JBQWtDLFFBQVEsR0FBRztBQUFBLElBQ3ZGLEtBQUssSUFBSSxFQUFFLElBQ1YsS0FBSyxJQUFJLFdBQVcsRUFBRSxNQUFNLEdBQzVCLEtBQUssSUFBSSxZQUFZLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FDdkM7QUFBQSxHQUNBO0FBQUE7Ozs7RUNMRCxJQUFJO0FBQUEsRUFFSixPQUFPLHlCQUE2QixPQUFPLGlCQUE2QixRQUFRLEdBQUc7QUFBQSxJQUNsRixLQUFLLElBQUksRUFBRSxJQUNWLEtBQUssSUFBSSxXQUFXLEVBQUUsSUFBSSxtQkFBbUIsR0FDN0MsS0FBSyxJQUFJLFdBQVcsRUFBRSxPQUFPLENBQzlCO0FBQUEsR0FDQTtBQUFBOzs7O0VDUEQsT0FBTyx5QkFBNkIsT0FBTyxXQUF1QixRQUFRLEdBQUc7QUFBQSxJQUM1RSxLQUFLLElBQUk7QUFBQSxHQUNUO0FBQUE7Ozs7RUNGRCxJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFFSixPQUFPLHlCQUE2QixPQUFPLGtCQUE4QixRQUFRLEdBQUc7QUFBQSxJQUNuRixLQUFLLElBQUksRUFBRSxJQUNWLEtBQUssSUFBSSxTQUFTLEVBQUUsSUFBSSxPQUFPLEdBQy9CLEtBQUssSUFBSSxxQkFBcUIsRUFBRSxJQUFJLG1CQUFtQixHQUN2RCxLQUFLLElBQUksWUFBWSxFQUFFLE9BQU8sR0FDOUIsS0FBSyxJQUFJLFlBQVksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUN2QztBQUFBLEdBQ0E7QUFBQTs7OztFQ1ZELElBQUk7QUFBQSxFQUFKLElBQ0MsZ0NBQWdDO0FBQUEsRUFEakMsSUFFQyx3QkFBeUI7QUFBQSxFQUUxQixJQUFJO0FBQUEsRUFFSixJQUFJO0FBQUEsRUFBSixJQUNDO0FBQUEsRUFERCxJQUVDO0FBQUEsRUFFRCxJQUFJLGVBQWUsS0FBSyxPQUFPLGdCQUE0QixRQUFRLEdBQUc7QUFBQSxJQUNyRSxLQUFLLE9BQU87QUFBQSxNQUNYLFlBQVksS0FBSyxNQUFNO0FBQUEsSUFDeEIsQ0FBQztBQUFBLEdBQ0Q7QUFBQSxFQUVELElBQUksZ0JBQWdCO0FBQUEsRUFFcEIsSUFBSSxlQUFlLEtBQUssT0FBTyxnQkFBNEIsUUFBUSxHQUFHO0FBQUEsSUFDckUsS0FBSyxJQUFJLEVBQUUsSUFDVixLQUFLLElBQUksU0FBUyxFQUFFLElBQUksT0FBTyxHQUMvQixLQUFLLElBQUksWUFBWSxFQUFFLE9BQU8sR0FDOUIsS0FBSyxJQUFJLFlBQVksRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxHQUNsRCxLQUFLLElBQUksV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQ3JEO0FBQUEsR0FDQTtBQUFBLEVBRUQsSUFBSSxTQUFTO0FBQUEsSUFDWixTQUFTO0FBQUEsSUFDVCxTQUFTO0FBQUEsSUFDVCxTQUFTO0FBQUEsRUFDVjtBQUFBLEVBRUEsSUFBSSxPQUFPO0FBQUEsSUFDVixTQUFTLENBQUMsR0FBRyxHQUFHLEtBQUssT0FBTyxHQUFHLEdBQUcsQ0FBQztBQUFBLElBQ25DLFNBQVMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLEVBQUU7QUFBQSxJQUMxQixTQUFTLENBQUMsR0FBRyxHQUFHLEtBQUssR0FBRyxFQUFFO0FBQUEsRUFDM0I7QUFBQSxFQUNBLElBQUksYUFBYSxDQUFDO0FBQUEsRUFDbEIsSUFBSSxhQUFhLENBQUM7QUFBQSxFQUNsQixPQUFPLEtBQUssSUFBSSxFQUFFLFFBQVEsUUFBUSxDQUFDLEtBQUs7QUFBQSxJQUN2QyxXQUFXLE9BQU8sYUFBYSxPQUFPO0FBQUEsTUFDckMsTUFBTTtBQUFBLE1BQ04sT0FBTyxLQUFLO0FBQUEsSUFDYixHQUFHLEtBQUs7QUFBQSxJQUNSLFdBQVcsT0FBTztBQUFBLE1BQ2pCLFdBQVksQ0FBQyxHQUFHLEdBQUcsS0FBSyxPQUFPLEdBQUcsQ0FBQztBQUFBLE1BQ25DLFlBQVksV0FBVztBQUFBLElBQ3hCO0FBQUEsR0FDQTtBQUFBLEVBQ0QsT0FBTztBQUFBLEVBRVAsU0FBUyxhQUFhLENBQUMsS0FBSyxNQUFNO0FBQUEsSUFDakMsSUFBaUIsT0FBTyxJQUFJLFFBQXhCLFVBQTZCO0FBQUEsTUFDaEMsTUFBTSxJQUFJLFVBQVUsbUNBQW1DO0FBQUEsSUFDeEQ7QUFBQSxJQUVBLElBQUksT0FBb0IsT0FBTyxJQUFJLE1BQXhCO0FBQUEsSUFDWCxJQUFJLFVBQVUsT0FDWCxDQUFDLGFBQWEsUUFBUSxJQUN0QixDQUFDLFFBQVE7QUFBQSxJQUVaLElBQVcsUUFBUSxRQUFRLE9BQU8sSUFBSSxDQUFDLE1BQW5DLElBQXNDO0FBQUEsTUFDekMsTUFBTSxJQUFJLFVBQVUsaUNBQWlDO0FBQUEsSUFDdEQ7QUFBQSxJQUVBLElBQVcsUUFBUSxRQUFRLE9BQU8sSUFBSSxDQUFDLE1BQW5DLElBQXNDO0FBQUEsTUFDekMsTUFBTSxJQUFJLFVBQVUsaUNBQWlDO0FBQUEsSUFDdEQ7QUFBQSxJQUVBLElBQUksS0FBSyxZQUFZLE1BQU07QUFBQSxNQUMxQixNQUFNLElBQUksVUFBVSxpQ0FBaUM7QUFBQSxJQUN0RDtBQUFBLElBRUEsSUFBSSxZQUFZLE9BQU8sSUFBSTtBQUFBLElBQzNCLEtBQUssV0FBVztBQUFBLE1BQ2YsTUFBTSxJQUFJLE1BQU0sd0JBQXdCLElBQUksTUFBTSxHQUFHO0FBQUEsSUFDdEQ7QUFBQSxJQUVBLElBQUksUUFBUSxJQUFJLEdBQUcsU0FBUztBQUFBLElBRTVCLElBQUksTUFBTSxDQUFDO0FBQUEsSUFFWCxJQUFJLFNBQVMsSUFBSSxLQUFLLElBQUk7QUFBQSxJQUMxQixJQUFJLFFBQVE7QUFBQSxNQUNYLElBQUksTUFBTTtBQUFBLFFBQ1QsR0FBRyxRQUFRLElBQUksR0FBRyxLQUFLO0FBQUEsUUFDdkIsR0FBRyxRQUFRLElBQUksR0FBRyxLQUFLO0FBQUEsTUFDeEI7QUFBQSxJQUNEO0FBQUEsSUFFQSxJQUFJLEtBQUssWUFBWSxRQUFRO0FBQUEsTUFDNUIsSUFBSSxPQUFPLFFBQVEsSUFBSSxHQUFHLElBQUk7QUFBQSxJQUMvQjtBQUFBLElBRUEsTUFBTSxNQUFNLFFBQVEsR0FBRztBQUFBLElBRXZCLElBQUksZ0JBQWdCLElBQUksU0FBUztBQUFBLElBQ2pDLEtBQUssY0FBYyxRQUFRO0FBQUEsTUFDMUIsTUFBTSxJQUFJLE1BQU0sNkJBQTZCLGNBQWMsU0FBUyxHQUFHO0FBQUEsSUFDeEU7QUFBQSxJQUVBLElBQUksU0FBUyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUk7QUFBQSxJQUV4QyxPQUFPO0FBQUE7QUFBQSxFQUdSLFNBQVMsUUFBUSxDQUFDLEtBQUssS0FBSyxNQUFNO0FBQUEsSUFDakMsSUFBSSxVQUFVO0FBQUEsSUFDZCxJQUFJLFlBQVksSUFBSSxVQUFVLFNBQVMsS0FBSztBQUFBLElBQzVDLFlBQVksUUFBTyxLQUFLLFdBQVcsS0FBSztBQUFBLElBQ3hDLFlBQVk7QUFBQSxNQUNYLFFBQVE7QUFBQSxNQUNSLE1BQU07QUFBQSxJQUNQO0FBQUEsSUFFQSxJQUFJO0FBQUEsSUFDSixJQUFJLEtBQUssU0FBUztBQUFBLE1BQ2pCLElBQUksYUFBYSxJQUFJLFdBQVcsS0FBSztBQUFBLE1BQ3JDLGFBQWEsUUFBTyxLQUFLLFlBQVksS0FBSztBQUFBLE1BRTFDLFNBQVMsZUFBZSxPQUFPO0FBQUEsUUFDOUIsU0FBUztBQUFBLFFBQ1QscUJBQXFCLFdBQVc7QUFBQSxRQUNoQyxZQUFZLGFBQWEsT0FBTztBQUFBLFVBQy9CLFNBQVM7QUFBQSxVQUNUO0FBQUEsVUFDQSxZQUFZLFdBQVc7QUFBQSxVQUN2QjtBQUFBLFFBQ0QsR0FBRyxLQUFLO0FBQUEsTUFDVCxHQUFHLE9BQU87QUFBQSxRQUNULE9BQU87QUFBQSxNQUNSLENBQUM7QUFBQSxNQUVELFdBQVcsS0FBSyxDQUFDO0FBQUEsSUFDbEIsRUFBTztBQUFBLE1BQ04sU0FBUyxjQUFjLE9BQU87QUFBQSxRQUM3QixXQUFXLFdBQVc7QUFBQSxRQUN0QixXQUFXO0FBQUEsTUFDWixHQUFHLE9BQU87QUFBQSxRQUNULE9BQU87QUFBQSxNQUNSLENBQUM7QUFBQTtBQUFBLElBS0YsSUFBYSxPQUFPLE1BQU0sRUFBRSxNQUF4QjtBQUFBLEdBQTJCO0FBQUEsTUFDOUIsVUFBVTtBQUFBO0FBQUEsSUFDWDtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUEsRUFHUixPQUFPLFVBQVU7QUFBQTs7OztFQ3pKakIsSUFBSTtBQUFBLEVBRUosSUFBSTtBQUFBLEVBRUosSUFBSTtBQUFBLEVBQUosSUFDQztBQUFBLEVBREQsSUFFQztBQUFBLEVBRUQsSUFBSSxnQkFBZ0IsS0FBSyxPQUFPLGlCQUE2QixRQUFRLEdBQUc7QUFBQSxJQUN2RSxLQUFLLElBQUksRUFBRSxJQUNWLEtBQUssSUFBSSxTQUFTLEVBQUUsSUFBSSxPQUFPLEdBQy9CLEtBQUssSUFBSSxTQUFTLEVBQUUsSUFBSSxHQUN4QixLQUFLLElBQUksZ0JBQWdCLEVBQUUsSUFBSSxHQUMvQixLQUFLLElBQUksaUJBQWlCLEVBQUUsSUFBSSxHQUNoQyxLQUFLLElBQUksUUFBUSxFQUFFLElBQUksR0FDdkIsS0FBSyxJQUFJLFFBQVEsRUFBRSxJQUFJLEdBQ3ZCLEtBQUssSUFBSSxXQUFXLEVBQUUsSUFBSSxHQUMxQixLQUFLLElBQUksV0FBVyxFQUFFLElBQUksR0FDMUIsS0FBSyxJQUFJLGFBQWEsRUFBRSxJQUFJLENBQzdCO0FBQUEsR0FDQTtBQUFBLEVBRUQsSUFBSSxlQUFlLEtBQUssT0FBTyxnQkFBNEIsUUFBUSxHQUFHO0FBQUEsSUFDckUsS0FBSyxJQUFJLEVBQUUsSUFDVixLQUFLLElBQUksU0FBUyxFQUFFLElBQUksR0FDeEIsS0FBSyxJQUFJLGdCQUFnQixFQUFFLElBQUksQ0FDaEM7QUFBQSxHQUNBO0FBQUEsRUFFRCxJQUFJLFlBQVk7QUFBQSxJQUNmLFdBQVcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQUEsSUFDdEMsWUFBWSxDQUFDLEdBQUcsQ0FBQztBQUFBLEVBQ2xCO0FBQUEsRUFFQSxTQUFTLGNBQWMsQ0FBQyxLQUFLLE1BQU07QUFBQSxJQUNsQyxJQUFpQixPQUFPLElBQUksTUFBeEIsVUFBMkI7QUFBQSxNQUM5QixNQUFNLElBQUksVUFBVSxpQ0FBaUM7QUFBQSxJQUN0RDtBQUFBLElBRUEsSUFBaUIsT0FBTyxJQUFJLE1BQXhCLFVBQTJCO0FBQUEsTUFDOUIsTUFBTSxJQUFJLFVBQVUsaUNBQWlDO0FBQUEsSUFDdEQ7QUFBQSxJQUVBLElBQUksS0FBSyxTQUFTO0FBQUEsTUFDakIsSUFBaUIsT0FBTyxJQUFJLE1BQXhCLFVBQTJCO0FBQUEsUUFDOUIsTUFBTSxJQUFJLFVBQVUsaUNBQWlDO0FBQUEsTUFDdEQ7QUFBQSxNQUVBLElBQWlCLE9BQU8sSUFBSSxNQUF4QixVQUEyQjtBQUFBLFFBQzlCLE1BQU0sSUFBSSxVQUFVLGlDQUFpQztBQUFBLE1BQ3REO0FBQUEsTUFFQSxJQUFpQixPQUFPLElBQUksTUFBeEIsVUFBMkI7QUFBQSxRQUM5QixNQUFNLElBQUksVUFBVSxpQ0FBaUM7QUFBQSxNQUN0RDtBQUFBLE1BRUEsSUFBaUIsT0FBTyxJQUFJLE9BQXhCLFVBQTRCO0FBQUEsUUFDL0IsTUFBTSxJQUFJLFVBQVUsa0NBQWtDO0FBQUEsTUFDdkQ7QUFBQSxNQUVBLElBQWlCLE9BQU8sSUFBSSxPQUF4QixVQUE0QjtBQUFBLFFBQy9CLE1BQU0sSUFBSSxVQUFVLGtDQUFrQztBQUFBLE1BQ3ZEO0FBQUEsTUFFQSxJQUFpQixPQUFPLElBQUksT0FBeEIsVUFBNEI7QUFBQSxRQUMvQixNQUFNLElBQUksVUFBVSxrQ0FBa0M7QUFBQSxNQUN2RDtBQUFBLElBQ0Q7QUFBQSxJQUVBLElBQUk7QUFBQSxJQUNKLElBQUksS0FBSyxTQUFTO0FBQUEsTUFDakIsTUFBTSxlQUFlLE9BQU87QUFBQSxRQUMzQixTQUFTO0FBQUEsUUFDVCxxQkFBcUI7QUFBQSxRQUNyQixZQUFZLGNBQWMsT0FBTztBQUFBLFVBQ2hDLFNBQVM7QUFBQSxVQUNULFNBQVMsUUFBUSxJQUFJLEdBQUcsS0FBSztBQUFBLFVBQzdCLGdCQUFnQixRQUFRLElBQUksR0FBRyxLQUFLO0FBQUEsVUFDcEMsaUJBQWlCLFFBQVEsSUFBSSxHQUFHLElBQUk7QUFBQSxVQUNwQyxRQUFRLFFBQVEsSUFBSSxHQUFHLElBQUk7QUFBQSxVQUMzQixRQUFRLFFBQVEsSUFBSSxHQUFHLElBQUk7QUFBQSxVQUMzQixXQUFXLFFBQVEsSUFBSSxJQUFJLElBQUk7QUFBQSxVQUMvQixXQUFXLFFBQVEsSUFBSSxJQUFJLElBQUk7QUFBQSxVQUMvQixhQUFhLFFBQVEsSUFBSSxJQUFJLElBQUk7QUFBQSxRQUNsQyxHQUFHLEtBQUs7QUFBQSxNQUNULEdBQUcsT0FBTztBQUFBLFFBQ1QsT0FBTztBQUFBLE1BQ1IsQ0FBQztBQUFBLElBQ0YsRUFBTztBQUFBLE1BQ04sTUFBTSxjQUFjLE9BQU87QUFBQSxRQUMxQjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1YsUUFBUTtBQUFBLFVBQ1IsTUFBTSxhQUFhLE9BQU87QUFBQSxZQUN6QixTQUFTLFFBQVEsSUFBSSxHQUFHLEtBQUs7QUFBQSxZQUM3QixnQkFBZ0IsUUFBUSxJQUFJLEdBQUcsS0FBSztBQUFBLFVBQ3JDLEdBQUcsS0FBSztBQUFBLFFBQ1Q7QUFBQSxNQUNELEdBQUcsT0FBTztBQUFBLFFBQ1QsT0FBTztBQUFBLE1BQ1IsQ0FBQztBQUFBO0FBQUEsSUFLRixJQUFhLElBQUksTUFBTSxFQUFFLE1BQXJCO0FBQUEsR0FBd0I7QUFBQSxNQUMzQixPQUFPO0FBQUE7QUFBQSxJQUNSO0FBQUEsSUFFQSxPQUFPO0FBQUE7QUFBQSxFQUdSLE9BQU8sVUFBVTtBQUFBOzs7O0VDaEhqQixJQUFJO0FBQUEsRUFBSixJQUNDO0FBQUEsRUFRRCxTQUFTLFdBQVcsQ0FBQyxLQUFLLE1BQU07QUFBQSxJQUMvQixJQUFpQixPQUFPLFFBQXBCLFlBQW9DLFFBQVQsTUFBYztBQUFBLE1BQzVDLE1BQU0sSUFBSSxVQUFVLGdDQUFnQztBQUFBLElBQ3JEO0FBQUEsSUFFQSxJQUFJLE1BQU0sSUFBSTtBQUFBLElBQ2QsSUFBaUIsT0FBTyxRQUFwQixVQUF5QjtBQUFBLE1BQzVCLE1BQU0sSUFBSSxVQUFVLG1DQUFtQztBQUFBLElBQ3hEO0FBQUEsSUFFQSxPQUFPLFFBQVEsQ0FBQztBQUFBLElBQ2hCLEtBQUssVUFBVSxLQUFLLFlBQVk7QUFBQSxJQUVoQyxRQUFRO0FBQUEsV0FDRixNQUFNO0FBQUEsUUFDVixPQUFPLEdBQUcsS0FBSyxJQUFJO0FBQUEsTUFDcEI7QUFBQSxXQUNLLE9BQU87QUFBQSxRQUNYLE9BQU8sSUFBSSxLQUFLLElBQUk7QUFBQSxNQUNyQjtBQUFBLGVBQ1M7QUFBQSxRQUNSLE1BQU0sSUFBSSxNQUFNLDJCQUEyQixNQUFNLEdBQUc7QUFBQSxNQUNyRDtBQUFBO0FBQUE7QUFBQSxFQUlGLE9BQU8sVUFBVTtBQUFBOzs7QUNwQ1YsU0FBUyxVQUFVLENBQUMsU0FBa0I7QUFBQSxFQUMzQyxLQUFLO0FBQUEsSUFBUyxPQUFPLENBQUM7QUFBQSxFQUN0QixNQUFNLGVBQWUsUUFBUSxJQUFJLFFBQVE7QUFBQSxFQUN6QyxNQUFNLFVBQWtDLENBQUM7QUFBQSxFQUV6QyxJQUFJLGlCQUFpQjtBQUFBLElBQU0sT0FBTyxDQUFDO0FBQUEsRUFFbkMsV0FBVyxNQUFNLGFBQWEsTUFBTSxHQUFHLEdBQUc7QUFBQSxJQUN4QyxPQUFPLGNBQWMsYUFBYSxHQUFHLE1BQU0sR0FBRztBQUFBLElBQzlDLE1BQU0sTUFBTSxVQUFVLEtBQUs7QUFBQSxJQUMzQixRQUFRLE9BQU8sVUFBVSxLQUFLLEdBQUc7QUFBQSxFQUNuQztBQUFBLEVBRUEsT0FBTztBQUFBO0FBR0YsU0FBUyxTQUFTLENBQUMsVUFBb0IsS0FBYSxPQUFlLFFBQWlCO0FBQUEsRUFDekYsU0FBUyxRQUFRLE9BQU8sY0FBYyxHQUFHLE9BQU8sUUFBUSxTQUFTLHVCQUF1QixTQUFTLElBQUk7QUFBQTtBQUdoRyxTQUFTLFlBQVksQ0FBQyxVQUFvQixLQUFhO0FBQUEsRUFDNUQsU0FBUyxRQUFRLE9BQU8sY0FBYyxHQUFHLDZCQUE2QjtBQUFBOztBQ3JCeEUsSUFBTSxZQUFZLFFBQVEsSUFBSSxpQkFBaUI7QUFDL0MsSUFBTSxnQkFBZ0IsUUFBUSxJQUFJLHFCQUFxQjtBQUN2RCxJQUFNLGVBQWUsUUFBUSxJQUFJLG9CQUFvQjtBQUNyRCxJQUFNLGFBQWEsUUFBUSxJQUFJLGtCQUFrQjtBQUNqRCxJQUFNLFVBQVU7QUFBQSxFQUNmLFdBQVc7QUFBQSxFQUNYLGVBQWU7QUFBQSxFQUNmLGNBQWM7QUFBQSxFQUNkLFlBQVk7QUFDYjs7O0FDVEEsSUFBSSxhQUFZLE9BQU87QUFDdkIsSUFBSSxXQUFXLENBQUMsUUFBUSxRQUFRO0FBQUEsRUFDL0IsU0FBUyxRQUFRO0FBQUEsSUFBSyxXQUFVLFFBQVEsTUFBTTtBQUFBLE1BQzdDLEtBQUssSUFBSTtBQUFBLE1BQ1QsWUFBWTtBQUFBLElBQ2IsQ0FBQztBQUFBOzs7QUNOSyxNQUFNLDBCQUEwQixNQUFNO0FBQzdDO0FBQ0Esa0JBQWtCLFVBQVUsT0FBTztBQUNuQyxTQUFTLGdCQUFnQixDQUFDLEtBQUs7QUFBQSxFQUMzQixPQUFPLG1CQUFtQixLQUFLLEdBQUcsRUFBRSxRQUFRLFFBQVEsQ0FBQyxHQUFHLE1BQU07QUFBQSxJQUMxRCxJQUFJLE9BQU8sRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxZQUFZO0FBQUEsSUFDcEQsSUFBSSxLQUFLLFNBQVMsR0FBRztBQUFBLE1BQ2pCLE9BQU8sTUFBTTtBQUFBLElBQ2pCO0FBQUEsSUFDQSxPQUFPLE1BQU07QUFBQSxHQUNoQixDQUFDO0FBQUE7QUFFTixTQUFTLGVBQWUsQ0FBQyxLQUFLO0FBQUEsRUFDMUIsSUFBSSxTQUFTLElBQUksUUFBUSxNQUFNLEdBQUcsRUFBRSxRQUFRLE1BQU0sR0FBRztBQUFBLEVBQ3JELFFBQVEsT0FBTyxTQUFTO0FBQUEsU0FDZjtBQUFBLE1BQ0Q7QUFBQSxTQUNDO0FBQUEsTUFDRCxVQUFVO0FBQUEsTUFDVjtBQUFBLFNBQ0M7QUFBQSxNQUNELFVBQVU7QUFBQSxNQUNWO0FBQUE7QUFBQSxNQUVBLE1BQU0sSUFBSSxNQUFNLDRDQUE0QztBQUFBO0FBQUEsRUFFcEUsSUFBSTtBQUFBLElBQ0EsT0FBTyxpQkFBaUIsTUFBTTtBQUFBLElBRWxDLE9BQU8sS0FBSztBQUFBLElBQ1IsT0FBTyxLQUFLLE1BQU07QUFBQTtBQUFBO0FBR25CLFNBQVMsU0FBUyxDQUFDLE9BQU8sVUFBUztBQUFBLEVBQ3RDLElBQUksT0FBTyxVQUFVLFVBQVU7QUFBQSxJQUMzQixNQUFNLElBQUksa0JBQWtCLDJDQUEyQztBQUFBLEVBQzNFO0FBQUEsRUFDQSxhQUFZLFdBQVUsQ0FBQztBQUFBLEVBQ3ZCLE1BQU0sTUFBTSxTQUFRLFdBQVcsT0FBTyxJQUFJO0FBQUEsRUFDMUMsTUFBTSxPQUFPLE1BQU0sTUFBTSxHQUFHLEVBQUU7QUFBQSxFQUM5QixJQUFJLE9BQU8sU0FBUyxVQUFVO0FBQUEsSUFDMUIsTUFBTSxJQUFJLGtCQUFrQiwwQ0FBMEMsTUFBTSxHQUFHO0FBQUEsRUFDbkY7QUFBQSxFQUNBLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxJQUNBLFVBQVUsZ0JBQWdCLElBQUk7QUFBQSxJQUVsQyxPQUFPLEdBQUc7QUFBQSxJQUNOLE1BQU0sSUFBSSxrQkFBa0IscURBQXFELE1BQU0sTUFBTSxFQUFFLFVBQVU7QUFBQTtBQUFBLEVBRTdHLElBQUk7QUFBQSxJQUNBLE9BQU8sS0FBSyxNQUFNLE9BQU87QUFBQSxJQUU3QixPQUFPLEdBQUc7QUFBQSxJQUNOLE1BQU0sSUFBSSxrQkFBa0IsbURBQW1ELE1BQU0sTUFBTSxFQUFFLFVBQVU7QUFBQTtBQUFBOztBQ3lIL0csSUFBSTtBQUFBLENBQ0gsUUFBUyxDQUFDLGtCQUFpQjtBQUFBLEVBQ3hCLGlCQUFnQixpQkFBZ0IsYUFBYSxLQUFLO0FBQUEsRUFDbEQsaUJBQWdCLGlCQUFnQixVQUFVLEtBQUs7QUFBQSxHQUNoRCxvQkFBb0Isa0JBQWtCLENBQUMsRUFBRTtBQUM1QyxJQUFJO0FBQUEsQ0FDSCxRQUFTLENBQUMsa0JBQWlCO0FBQUEsRUFDeEIsaUJBQWdCLGlCQUFnQixjQUFjLEtBQUs7QUFBQSxFQUNuRCxpQkFBZ0IsaUJBQWdCLFlBQVksS0FBSztBQUFBLEdBQ2xELG9CQUFvQixrQkFBa0IsQ0FBQyxFQUFFOztBQy9LckMsU0FBUyx3QkFBd0IsQ0FBQyxPQUFPO0FBQUEsRUFDNUMsT0FBTyxzQkFBc0IsT0FBTyxtQkFBbUIsaUJBQWdCLElBQUk7QUFBQTtBQUUvRSxTQUFTLHFCQUFxQixDQUFDLE9BQU8sVUFBVSxTQUFTO0FBQUEsRUFDckQsSUFBSSxTQUFTO0FBQUEsRUFDYixTQUFTLElBQUksRUFBRyxJQUFJLE1BQU0sWUFBWSxLQUFLLEdBQUc7QUFBQSxJQUMxQyxJQUFJLFNBQVM7QUFBQSxJQUNiLElBQUksZ0JBQWdCO0FBQUEsSUFDcEIsU0FBUyxJQUFJLEVBQUcsSUFBSSxLQUFLLElBQUksSUFBSSxNQUFNLFlBQVksS0FBSztBQUFBLE1BQ3BELFNBQVUsVUFBVSxJQUFLLE1BQU0sSUFBSTtBQUFBLE1BQ25DLGlCQUFpQjtBQUFBLElBQ3JCO0FBQUEsSUFDQSxTQUFTLElBQUksRUFBRyxJQUFJLEdBQUcsS0FBSztBQUFBLE1BQ3hCLElBQUksaUJBQWlCLEdBQUc7QUFBQSxRQUNwQixVQUFVLFNBQVUsVUFBVyxnQkFBZ0IsSUFBTTtBQUFBLFFBQ3JELGlCQUFpQjtBQUFBLE1BQ3JCLEVBQ0ssU0FBSSxnQkFBZ0IsR0FBRztBQUFBLFFBQ3hCLFVBQVUsU0FBVSxVQUFXLElBQUksZ0JBQWtCO0FBQUEsUUFDckQsZ0JBQWdCO0FBQUEsTUFDcEIsRUFDSyxTQUFJLFlBQVksaUJBQWdCLFNBQVM7QUFBQSxRQUMxQyxVQUFVO0FBQUEsTUFDZDtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUEsRUFDQSxPQUFPO0FBQUE7QUFHWCxJQUFNLG9CQUFvQjtBQTJEMUIsSUFBSTtBQUFBLENBQ0gsUUFBUyxDQUFDLGtCQUFpQjtBQUFBLEVBQ3hCLGlCQUFnQixpQkFBZ0IsYUFBYSxLQUFLO0FBQUEsRUFDbEQsaUJBQWdCLGlCQUFnQixVQUFVLEtBQUs7QUFBQSxHQUNoRCxxQkFBb0IsbUJBQWtCLENBQUMsRUFBRTtBQUM1QyxJQUFJO0FBQUEsQ0FDSCxRQUFTLENBQUMsa0JBQWlCO0FBQUEsRUFDeEIsaUJBQWdCLGlCQUFnQixjQUFjLEtBQUs7QUFBQSxFQUNuRCxpQkFBZ0IsaUJBQWdCLFlBQVksS0FBSztBQUFBLEdBQ2xELHFCQUFvQixtQkFBa0IsQ0FBQyxFQUFFOztBQ3RHNUM7QUFDQTtBQUdBLElBQUksZUFBZSxDQUFDO0FBQ3BCLFNBQVMsY0FBYztBQUFBLEVBQ3RCLHNCQUFzQixNQUFNO0FBQUEsRUFDNUIsd0JBQXdCLE1BQU07QUFBQSxFQUM5QixTQUFTLE1BQU07QUFBQSxFQUNmLDJCQUEyQixNQUFNO0FBQUEsRUFDakMsZUFBZSxNQUFNO0FBQ3RCLENBQUM7QUFDRCxTQUFTLGFBQWEsR0FBRztBQUFBLEVBQ3hCLE1BQU0sZUFBZSxJQUFJLFdBQVcsRUFBRTtBQUFBLEVBQ3RDLE9BQU8sZ0JBQWdCLFlBQVk7QUFBQSxFQUNuQyxPQUFPLHlCQUF5QixZQUFZO0FBQUE7QUFFN0MsZUFBZSxzQkFBc0IsQ0FBQyxTQUFTLGNBQWM7QUFBQSxFQUM1RCxNQUFNLFFBQVEsY0FBYztBQUFBLEVBQzVCLE1BQU0sTUFBTSxJQUFJLElBQUksaURBQWlEO0FBQUEsRUFDckUsSUFBSSxhQUFhLElBQUksaUJBQWlCLE1BQU07QUFBQSxFQUM1QyxJQUFJLGFBQWEsSUFBSSxnQkFBZ0IsUUFBUSxZQUFZO0FBQUEsRUFDekQsSUFBSSxhQUFhLElBQUksYUFBYSxRQUFRLFNBQVM7QUFBQSxFQUNuRCxJQUFJLGFBQWEsSUFBSSxTQUFTLEtBQUs7QUFBQSxFQUNuQyxJQUFJLGFBQWEsSUFBSSxTQUFTLE1BQU0sUUFBUSxNQUFNLElBQUksT0FBTyxLQUFLLEdBQUcsSUFBSSxNQUFNO0FBQUEsRUFDL0UsT0FBTztBQUFBLElBQ047QUFBQSxJQUNBO0FBQUEsRUFDRDtBQUFBO0FBRUQsZUFBZSx5QkFBeUIsQ0FBQyxNQUFNO0FBQUEsRUFDOUMsSUFBSTtBQUFBLElBQ0gsTUFBTSxXQUFXLE1BQU0sTUFBTSw4Q0FBOEM7QUFBQSxNQUMxRSxRQUFRO0FBQUEsTUFDUixTQUFTO0FBQUEsUUFDUixnQkFBZ0I7QUFBQSxRQUNoQixlQUFlLFNBQVMsT0FBTyxLQUFLLEdBQUcsUUFBUSxhQUFhLFFBQVEsZUFBZSxFQUFFLFNBQVMsUUFBUTtBQUFBLE1BQ3ZHO0FBQUEsTUFDQSxNQUFNLElBQUksZ0JBQWdCO0FBQUEsUUFDekIsWUFBWTtBQUFBLFFBQ1o7QUFBQSxNQUNELENBQUM7QUFBQSxJQUNGLENBQUM7QUFBQSxJQUNELE9BQU8sTUFBTSxTQUFTLEtBQUs7QUFBQSxJQUMxQixPQUFPLE9BQU87QUFBQSxJQUNmLFFBQVEsTUFBTSw2Q0FBNkMsS0FBSztBQUFBLElBQ2hFLE1BQU0sR0FBRztBQUFBO0FBQUE7QUFHWCxJQUFJO0FBQ0osZUFBZSxhQUFhLENBQUMsT0FBTztBQUFBLEVBQ25DLEtBQUs7QUFBQSxJQUFrQixJQUFJO0FBQUEsTUFDMUIsTUFBTSxVQUFVLE9BQU8sTUFBTSxNQUFNLHdDQUF3QyxHQUFHLEtBQUs7QUFBQSxNQUNuRixtQkFBbUIsMEJBQVMsUUFBUSxLQUFLLEVBQUU7QUFBQSxNQUMxQyxPQUFPLEtBQUs7QUFBQSxNQUNiLFFBQVEsTUFBTSxzQ0FBc0MsR0FBRztBQUFBO0FBQUEsRUFFeEQsSUFBSTtBQUFBLElBQ0gsTUFBTSxVQUFVLDRCQUFJLE9BQU8sT0FBTyxnQkFBZ0I7QUFBQSxJQUNsRCxPQUFPO0FBQUEsSUFDTixPQUFPLEtBQUs7QUFBQSxJQUNiLFFBQVEsTUFBTSxnQ0FBZ0MsR0FBRztBQUFBLElBQ2pELE9BQU87QUFBQTtBQUFBO0FBR1QsZUFBZSxPQUFPLEdBQUcsaUJBQWlCLFFBQVE7QUFBQSxFQUNqRCxNQUFNLFNBQVM7QUFBQSxJQUNkLFlBQVk7QUFBQSxJQUNaO0FBQUEsSUFDQSxPQUFPO0FBQUEsRUFDUjtBQUFBLEVBQ0EsSUFBSTtBQUFBLElBQVEsT0FBTyxXQUFXLE1BQU0sUUFBUSxNQUFNLElBQUksT0FBTyxLQUFLLEdBQUcsSUFBSTtBQUFBLEVBQ3pFLE1BQU0sV0FBVyxNQUFNLE1BQU0sOENBQThDO0FBQUEsSUFDMUUsUUFBUTtBQUFBLElBQ1IsU0FBUztBQUFBLE1BQ1IsZ0JBQWdCO0FBQUEsTUFDaEIsZUFBZSxTQUFTLE9BQU8sS0FBSyxHQUFHLFFBQVEsYUFBYSxRQUFRLGVBQWUsRUFBRSxTQUFTLFFBQVE7QUFBQSxJQUN2RztBQUFBLElBQ0EsTUFBTSxJQUFJLGdCQUFnQixNQUFNO0FBQUEsRUFDakMsQ0FBQztBQUFBLEVBQ0QsT0FBTyxNQUFNLFNBQVMsS0FBSztBQUFBO0FBRTVCLFNBQVMsb0JBQW9CLENBQUMsT0FBTztBQUFBLEVBQ3BDLE1BQU0sVUFBVSxVQUFVLEtBQUs7QUFBQSxFQUMvQixPQUFPLFNBQVMsUUFBUSxJQUFJLE1BQU0sR0FBRyxFQUFFLEVBQUU7QUFBQTs7O0FDbEYxQyxJQUFNLGlCQUFpQjtBQUV2QixTQUFTLFVBQVUsSUFBSSxRQUFRO0FBQUEsRUFDOUIsT0FBTyxPQUFPLEtBQUssR0FBRztBQUFBO0FBRXZCLElBQUkseUJBQXlCLFFBQVEsQ0FBQyxVQUFVO0FBQUEsRUFDL0MsU0FBUyxpQkFBaUI7QUFBQSxFQUMxQixTQUFTLHNDQUFzQztBQUFBLEVBQy9DLFNBQVMsbUNBQW1DO0FBQUEsRUFDNUMsU0FBUyw0QkFBNEI7QUFBQSxFQUNyQyxTQUFTLDZCQUE2QjtBQUFBLEVBQ3RDLFNBQVMsd0JBQXdCO0FBQUEsRUFDakMsU0FBUyxvQkFBb0I7QUFBQSxFQUM3QixTQUFTLG9CQUFvQjtBQUFBLEVBQzdCLFNBQVMsd0JBQXdCO0FBQUEsRUFDakMsU0FBUyw0QkFBNEI7QUFBQSxFQUNyQyxTQUFTLGtDQUFrQztBQUFBLEVBQzNDLFNBQVMsb0NBQW9DO0FBQUEsRUFDN0MsU0FBUyw4QkFBOEI7QUFBQSxFQUN2QyxTQUFTLHdCQUF3QjtBQUFBLEVBQ2pDLFNBQVMsOEJBQThCO0FBQUEsRUFDdkMsU0FBUyw4QkFBOEI7QUFBQSxFQUN2QyxTQUFTLDhCQUE4QjtBQUFBLEVBQ3ZDLFNBQVMsOENBQThDO0FBQUEsRUFDdkQsU0FBUyx3QkFBd0I7QUFBQSxFQUNqQyxTQUFTLDRCQUE0QjtBQUFBLEVBQ3JDLFNBQVMsdUJBQXVCO0FBQUEsRUFDaEMsU0FBUyx3QkFBd0I7QUFBQSxFQUNqQyxTQUFTLG9CQUFvQjtBQUFBLEVBQzdCLFNBQVMsdUJBQXVCO0FBQUEsRUFDaEMsU0FBUywrQkFBK0I7QUFBQSxFQUN4QyxTQUFTLDRCQUE0QjtBQUFBLEVBQ3JDLFNBQVMsNkJBQTZCO0FBQUEsRUFDdEMsU0FBUywrQkFBK0I7QUFBQSxFQUN4QyxTQUFTLGtDQUFrQztBQUFBLEVBQzNDLFNBQVMsNkJBQTZCO0FBQUEsRUFDdEMsU0FBUyxtQ0FBbUM7QUFBQSxFQUM1QyxTQUFTLG1DQUFtQztBQUFBLEVBQzVDLFNBQVMsNEJBQTRCO0FBQUEsRUFDckMsU0FBUywrQkFBK0I7QUFBQSxFQUN4QyxTQUFTLHFDQUFxQztBQUFBLEVBQzlDLFNBQVMsa0NBQWtDO0FBQUEsRUFDM0MsU0FBUyxtQ0FBbUM7QUFBQSxFQUM1QyxTQUFTLGdDQUFnQztBQUFBLEVBQ3pDLFNBQVMsdUNBQXVDO0FBQUEsRUFDaEQsU0FBUywwQkFBMEI7QUFBQSxFQUNuQyxTQUFTLHdDQUF3QztBQUFBLEVBQ2pELFNBQVMsMEJBQTBCO0FBQUEsRUFDbkMsU0FBUyw2QkFBNkI7QUFBQSxFQUN0QyxTQUFTLDBDQUEwQztBQUFBLEVBQ25ELFNBQVMsZ0NBQWdDO0FBQUEsRUFDekMsU0FBUyxxQ0FBcUM7QUFBQSxFQUM5QyxTQUFTLG1DQUFtQztBQUFBLEVBQzVDLFNBQVMsaUNBQWlDO0FBQUEsRUFDMUMsU0FBUyxnQ0FBZ0M7QUFBQSxFQUN6QyxTQUFTLG9DQUFvQztBQUFBLEVBQzdDLFNBQVMsOEJBQThCO0FBQUEsRUFDdkMsU0FBUyxrQ0FBa0M7QUFBQSxFQUMzQyxTQUFTLDBDQUEwQztBQUFBLEVBQ25ELFNBQVMsaUNBQWlDO0FBQUEsRUFDMUMsU0FBUyxpQ0FBaUM7QUFBQSxFQUMxQyxTQUFTLG9DQUFvQztBQUFBLEVBQzdDLFNBQVMscUNBQXFDO0FBQUEsRUFDOUMsU0FBUyxzQ0FBc0M7QUFBQSxFQUMvQyxTQUFTLG9DQUFvQztBQUFBLEVBQzdDLFNBQVMsc0NBQXNDO0FBQUEsRUFDL0MsU0FBUyxrQ0FBa0M7QUFBQSxFQUMzQyxTQUFTLGtDQUFrQztBQUFBLEVBQzNDLFNBQVMsOEJBQThCO0FBQUEsRUFDdkMsU0FBUyw0QkFBNEI7QUFBQSxFQUNyQyxTQUFTLDZCQUE2QjtBQUFBLEVBQ3RDLFNBQVMsOEJBQThCO0FBQUEsRUFDdkMsU0FBUyxnQ0FBZ0M7QUFBQSxFQUN6QyxPQUFPO0FBQUEsRUFDTixDQUFDLENBQUM7OztBQ2hGSixJQUFNLGFBQWEsT0FBTyxJQUFJLG9CQUFvQjtBQUNsRCxJQUFNLG1CQUFtQixPQUFPLElBQUksMEJBQTBCO0FBQzlELFNBQVMsRUFBRSxDQUFDLE9BQU8sTUFBTTtBQUFBLEVBQ3ZCLEtBQUssU0FBUyxPQUFPLFVBQVUsVUFBVTtBQUFBLElBQ3ZDLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFDQSxJQUFJLGlCQUFpQixNQUFNO0FBQUEsSUFDekIsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLEtBQUssT0FBTyxVQUFVLGVBQWUsS0FBSyxNQUFNLFVBQVUsR0FBRztBQUFBLElBQzNELE1BQU0sSUFBSSxNQUNSLFVBQVUsS0FBSyxRQUFRLDBJQUN6QjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLElBQUksTUFBTSxPQUFPLGVBQWUsS0FBSyxFQUFFO0FBQUEsRUFDdkMsSUFBSSxLQUFLO0FBQUEsSUFDUCxPQUFPLEtBQUs7QUFBQSxNQUNWLElBQUksY0FBYyxPQUFPLElBQUksZ0JBQWdCLEtBQUssYUFBYTtBQUFBLFFBQzdELE9BQU87QUFBQSxNQUNUO0FBQUEsTUFDQSxNQUFNLE9BQU8sZUFBZSxHQUFHO0FBQUEsSUFDakM7QUFBQSxFQUNGO0FBQUEsRUFDQSxPQUFPO0FBQUE7OztBQ3RCVCxNQUFNLE9BQU87QUFBQSxFQUNYLFdBQVcsQ0FBQyxPQUFPLFFBQVE7QUFBQSxJQUN6QixLQUFLLFFBQVE7QUFBQSxJQUNiLEtBQUssU0FBUztBQUFBLElBQ2QsS0FBSyxPQUFPLE9BQU87QUFBQSxJQUNuQixLQUFLLFlBQVksT0FBTztBQUFBLElBQ3hCLEtBQUssVUFBVSxPQUFPO0FBQUEsSUFDdEIsS0FBSyxVQUFVLE9BQU87QUFBQSxJQUN0QixLQUFLLFlBQVksT0FBTztBQUFBLElBQ3hCLEtBQUssYUFBYSxPQUFPO0FBQUEsSUFDekIsS0FBSyxhQUFhLE9BQU87QUFBQSxJQUN6QixLQUFLLFVBQVUsT0FBTztBQUFBLElBQ3RCLEtBQUssV0FBVyxPQUFPO0FBQUEsSUFDdkIsS0FBSyxhQUFhLE9BQU87QUFBQSxJQUN6QixLQUFLLGFBQWEsT0FBTztBQUFBLElBQ3pCLEtBQUssV0FBVyxPQUFPO0FBQUEsSUFDdkIsS0FBSyxhQUFhLE9BQU87QUFBQSxJQUN6QixLQUFLLFlBQVksT0FBTztBQUFBLElBQ3hCLEtBQUssb0JBQW9CLE9BQU87QUFBQTtBQUFBLFVBRTFCLGNBQWM7QUFBQSxFQUN0QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsYUFBa0I7QUFBQSxFQUNsQixZQUFpQjtBQUFBLEVBQ2pCLG9CQUF5QjtBQUFBLEVBQ3pCO0FBQUEsRUFDQSxrQkFBa0IsQ0FBQyxPQUFPO0FBQUEsSUFDeEIsT0FBTztBQUFBO0FBQUEsRUFFVCxnQkFBZ0IsQ0FBQyxPQUFPO0FBQUEsSUFDdEIsT0FBTztBQUFBO0FBQUEsRUFHVCxtQkFBbUIsR0FBRztBQUFBLElBQ3BCLE9BQU8sS0FBSyxPQUFPLGNBQW1CLGFBQUssS0FBSyxPQUFPLFVBQVUsU0FBUztBQUFBO0FBRTlFOzs7QUNoREEsTUFBTSxjQUFjO0FBQUEsVUFDVixjQUFjO0FBQUEsRUFDdEI7QUFBQSxFQUNBLFdBQVcsQ0FBQyxNQUFNLFVBQVUsWUFBWTtBQUFBLElBQ3RDLEtBQUssU0FBUztBQUFBLE1BQ1o7QUFBQSxNQUNBLFdBQVcsU0FBUztBQUFBLE1BQ3BCLFNBQVM7QUFBQSxNQUNULFNBQWM7QUFBQSxNQUNkLFlBQVk7QUFBQSxNQUNaLFlBQVk7QUFBQSxNQUNaLFVBQVU7QUFBQSxNQUNWLFlBQWlCO0FBQUEsTUFDakIsWUFBaUI7QUFBQSxNQUNqQjtBQUFBLE1BQ0E7QUFBQSxNQUNBLFdBQWdCO0FBQUEsSUFDbEI7QUFBQTtBQUFBLEVBYUYsS0FBSyxHQUFHO0FBQUEsSUFDTixPQUFPO0FBQUE7QUFBQSxFQU9ULE9BQU8sR0FBRztBQUFBLElBQ1IsS0FBSyxPQUFPLFVBQVU7QUFBQSxJQUN0QixPQUFPO0FBQUE7QUFBQSxFQVNULE9BQU8sQ0FBQyxPQUFPO0FBQUEsSUFDYixLQUFLLE9BQU8sVUFBVTtBQUFBLElBQ3RCLEtBQUssT0FBTyxhQUFhO0FBQUEsSUFDekIsT0FBTztBQUFBO0FBQUEsRUFRVCxVQUFVLENBQUMsSUFBSTtBQUFBLElBQ2IsS0FBSyxPQUFPLFlBQVk7QUFBQSxJQUN4QixLQUFLLE9BQU8sYUFBYTtBQUFBLElBQ3pCLE9BQU87QUFBQTtBQUFBLEVBS1QsV0FBVyxLQUFLO0FBQUEsRUFRaEIsV0FBVyxDQUFDLElBQUk7QUFBQSxJQUNkLEtBQUssT0FBTyxhQUFhO0FBQUEsSUFDekIsS0FBSyxPQUFPLGFBQWE7QUFBQSxJQUN6QixPQUFPO0FBQUE7QUFBQSxFQUtULFlBQVksS0FBSztBQUFBLEVBTWpCLFVBQVUsR0FBRztBQUFBLElBQ1gsS0FBSyxPQUFPLGFBQWE7QUFBQSxJQUN6QixLQUFLLE9BQU8sVUFBVTtBQUFBLElBQ3RCLE9BQU87QUFBQTtBQUFBLEVBR1QsT0FBTyxDQUFDLE1BQU07QUFBQSxJQUNaLElBQUksS0FBSyxPQUFPLFNBQVM7QUFBQSxNQUFJO0FBQUEsSUFDN0IsS0FBSyxPQUFPLE9BQU87QUFBQTtBQUV2Qjs7O0FDckdBLElBQU0sWUFBWSxPQUFPLElBQUksY0FBYzs7O0FDQTNDLFNBQVMsSUFBSSxDQUFDLE9BQU8sTUFBTTtBQUFBLEVBQ3pCLE9BQU8sR0FBRyxHQUFHLElBQUk7QUFBQTs7O0FDSW5CLFNBQVMsYUFBYSxDQUFDLE9BQU8sU0FBUztBQUFBLEVBQ3JDLE9BQU8sR0FBRyxNQUFNLGNBQWMsUUFBUSxLQUFLLEdBQUc7QUFBQTs7O0FDb0RoRCxNQUFNLGlCQUFpQixPQUFPO0FBQUEsRUFDNUIsV0FBVyxDQUFDLE9BQU8sUUFBUTtBQUFBLElBQ3pCLEtBQUssT0FBTyxZQUFZO0FBQUEsTUFDdEIsT0FBTyxhQUFhLGNBQWMsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDO0FBQUEsSUFDeEQ7QUFBQSxJQUNBLE1BQU0sT0FBTyxNQUFNO0FBQUEsSUFDbkIsS0FBSyxRQUFRO0FBQUE7QUFBQSxVQUVQLGNBQWM7QUFDeEI7QUFBQTtBQUNBLE1BQU0sMEJBQTBCLFNBQVM7QUFBQSxVQUMvQixjQUFjO0FBQUEsRUFDdEIsVUFBVSxHQUFHO0FBQUEsSUFDWCxPQUFPLEtBQUssV0FBVztBQUFBO0FBQUEsRUFFekIsY0FBYztBQUFBLElBQ1osT0FBTyxLQUFLLE9BQU8sU0FBUztBQUFBLElBQzVCLE9BQU8sS0FBSyxPQUFPLFNBQVM7QUFBQSxJQUM1QixTQUFTLEtBQUssT0FBTztBQUFBLEVBQ3ZCO0FBQUEsRUFDQSxnQkFBZ0I7QUFBQSxJQUNkLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLFNBQWM7QUFBQSxFQUNoQjtBQUFBLEVBQ0EsR0FBRyxHQUFHO0FBQUEsSUFDSixLQUFLLFlBQVksUUFBUTtBQUFBLElBQ3pCLE9BQU87QUFBQTtBQUFBLEVBRVQsSUFBSSxHQUFHO0FBQUEsSUFDTCxLQUFLLFlBQVksUUFBUTtBQUFBLElBQ3pCLE9BQU87QUFBQTtBQUFBLEVBRVQsVUFBVSxHQUFHO0FBQUEsSUFDWCxLQUFLLFlBQVksUUFBUTtBQUFBLElBQ3pCLE9BQU87QUFBQTtBQUFBLEVBRVQsU0FBUyxHQUFHO0FBQUEsSUFDVixLQUFLLFlBQVksUUFBUTtBQUFBLElBQ3pCLE9BQU87QUFBQTtBQUFBLEVBK0JULEVBQUUsQ0FBQyxTQUFTO0FBQUEsSUFDVixLQUFLLFlBQVksVUFBVTtBQUFBLElBQzNCLE9BQU87QUFBQTtBQUVYOzs7QUNwSEEsTUFBTSwyQkFBMkIsU0FBUztBQUFBLFVBQ2hDLGNBQWM7QUFBQSxFQUN0QjtBQUFBLEVBQ0EsYUFBYSxLQUFLLE9BQU8sS0FBSztBQUFBLEVBQzlCLFdBQVcsQ0FBQyxPQUFPLFFBQVE7QUFBQSxJQUN6QixNQUFNLE9BQU8sTUFBTTtBQUFBLElBQ25CLEtBQUssT0FBTyxPQUFPO0FBQUE7QUFBQSxFQUVyQixVQUFVLEdBQUc7QUFBQSxJQUNYLE9BQU8sS0FBSyxLQUFLO0FBQUE7QUFFckI7QUFDQSxJQUFNLGNBQWMsT0FBTyxJQUFJLGtCQUFrQjtBQUNqRCxTQUFTLFFBQVEsQ0FBQyxLQUFLO0FBQUEsRUFDckIsU0FBUyxPQUFPLE9BQU8sUUFBUSxjQUFjLGVBQWUsT0FBTyxJQUFJLGlCQUFpQjtBQUFBO0FBZ0IxRixNQUFNLHFCQUFxQixTQUFTO0FBQUEsVUFDMUIsY0FBYztBQUFBLEVBQ3RCLE9BQU8sS0FBSyxPQUFPO0FBQUEsRUFDbkIsYUFBYSxLQUFLLE9BQU8sS0FBSztBQUFBLEVBQzlCLFdBQVcsQ0FBQyxPQUFPLFFBQVE7QUFBQSxJQUN6QixNQUFNLE9BQU8sTUFBTTtBQUFBLElBQ25CLEtBQUssT0FBTyxPQUFPO0FBQUE7QUFBQSxFQUVyQixVQUFVLEdBQUc7QUFBQSxJQUNYLE9BQU8sS0FBSyxLQUFLO0FBQUE7QUFFckI7OztBQ3hEQSxNQUFNLFNBQVM7QUFBQSxVQUNMLGNBQWM7QUFBQSxFQUN0QixXQUFXLENBQUMsS0FBSyxRQUFRLE9BQU8sU0FBUyxPQUFPLGFBQWEsQ0FBQyxHQUFHO0FBQUEsSUFDL0QsS0FBSyxJQUFJO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUDtBQUFBLE1BQ0EsZ0JBQWdCO0FBQUEsTUFDaEI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQTtBQUtKO0FBQUE7QUFDQSxNQUFNLHFCQUFxQixTQUFTO0FBQUEsVUFDMUIsY0FBYztBQUN4Qjs7O0FDbEJBLElBQUksVUFBVTs7O0FDQ2QsSUFBSTtBQUNKLElBQUk7QUFDSixJQUFNLFNBQVM7QUFBQSxFQUNiLGVBQWUsQ0FBQyxNQUFNLElBQUk7QUFBQSxJQUN4QixLQUFLLE1BQU07QUFBQSxNQUNULE9BQU8sR0FBRztBQUFBLElBQ1o7QUFBQSxJQUNBLEtBQUssV0FBVztBQUFBLE1BQ2QsWUFBWSxLQUFLLE1BQU0sVUFBVSxlQUFlLE9BQVU7QUFBQSxJQUM1RDtBQUFBLElBQ0EsT0FBTyxLQUNMLENBQUMsT0FBTyxlQUFlLFdBQVcsZ0JBQ2hDLE1BQ0EsQ0FBQyxTQUFTO0FBQUEsTUFDUixJQUFJO0FBQUEsUUFDRixPQUFPLEdBQUcsSUFBSTtBQUFBLFFBQ2QsT0FBTyxHQUFHO0FBQUEsUUFDVixLQUFLLFVBQVU7QUFBQSxVQUNiLE1BQU0sTUFBTSxlQUFlO0FBQUEsVUFDM0IsU0FBUyxhQUFhLFFBQVEsRUFBRSxVQUFVO0FBQUEsUUFFNUMsQ0FBQztBQUFBLFFBQ0QsTUFBTTtBQUFBLGdCQUNOO0FBQUEsUUFDQSxLQUFLLElBQUk7QUFBQTtBQUFBLEtBR2YsR0FDQSxNQUNBLFNBQ0Y7QUFBQTtBQUVKOzs7QUNsQ0EsSUFBTSxpQkFBaUIsT0FBTyxJQUFJLHdCQUF3Qjs7O0FDRTFELElBQU0sU0FBUyxPQUFPLElBQUksZ0JBQWdCO0FBQzFDLElBQU0sVUFBVSxPQUFPLElBQUksaUJBQWlCO0FBQzVDLElBQU0scUJBQXFCLE9BQU8sSUFBSSw0QkFBNEI7QUFDbEUsSUFBTSxlQUFlLE9BQU8sSUFBSSxzQkFBc0I7QUFDdEQsSUFBTSxXQUFXLE9BQU8sSUFBSSxrQkFBa0I7QUFDOUMsSUFBTSxVQUFVLE9BQU8sSUFBSSxpQkFBaUI7QUFDNUMsSUFBTSxxQkFBcUIsT0FBTyxJQUFJLDRCQUE0QjtBQUNsRSxJQUFNLGlCQUFpQixPQUFPLElBQUksd0JBQXdCO0FBQUE7QUFDMUQsTUFBTSxNQUFNO0FBQUEsVUFDRixjQUFjO0FBQUEsU0FFZixTQUFTO0FBQUEsSUFDZCxNQUFNO0FBQUEsSUFDTjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFBQSxHQUtDO0FBQUEsR0FLQTtBQUFBLEdBRUE7QUFBQSxHQUVBO0FBQUEsR0FFQTtBQUFBLEdBS0E7QUFBQSxHQUVBLFdBQVc7QUFBQSxHQUVYLGtCQUFrQjtBQUFBLEdBRWxCLHNCQUEyQjtBQUFBLEVBQzVCLFdBQVcsQ0FBQyxNQUFNLFFBQVEsVUFBVTtBQUFBLElBQ2xDLEtBQUssYUFBYSxLQUFLLGdCQUFnQjtBQUFBLElBQ3ZDLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxZQUFZO0FBQUE7QUFFckI7QUFJQSxTQUFTLFlBQVksQ0FBQyxPQUFPO0FBQUEsRUFDM0IsT0FBTyxNQUFNO0FBQUE7QUFFZixTQUFTLGtCQUFrQixDQUFDLE9BQU87QUFBQSxFQUNqQyxPQUFPLEdBQUcsTUFBTSxXQUFXLFlBQVksTUFBTTtBQUFBOzs7QUNyRC9DLFNBQVMsWUFBWSxDQUFDLE9BQU87QUFBQSxFQUMzQixPQUFPLFVBQVUsUUFBUSxVQUFlLGFBQUssT0FBTyxNQUFNLFdBQVc7QUFBQTtBQUV2RSxTQUFTLFlBQVksQ0FBQyxTQUFTO0FBQUEsRUFDN0IsTUFBTSxTQUFTLEVBQUUsS0FBSyxJQUFJLFFBQVEsQ0FBQyxFQUFFO0FBQUEsRUFDckMsV0FBVyxTQUFTLFNBQVM7QUFBQSxJQUMzQixPQUFPLE9BQU8sTUFBTTtBQUFBLElBQ3BCLE9BQU8sT0FBTyxLQUFLLEdBQUcsTUFBTSxNQUFNO0FBQUEsSUFDbEMsSUFBSSxNQUFNLFNBQVMsUUFBUTtBQUFBLE1BQ3pCLEtBQUssT0FBTyxTQUFTO0FBQUEsUUFDbkIsT0FBTyxVQUFVLENBQUM7QUFBQSxNQUNwQjtBQUFBLE1BQ0EsT0FBTyxRQUFRLEtBQUssR0FBRyxNQUFNLE9BQU87QUFBQSxJQUN0QztBQUFBLEVBQ0Y7QUFBQSxFQUNBLE9BQU87QUFBQTtBQUFBO0FBRVQsTUFBTSxZQUFZO0FBQUEsVUFDUixjQUFjO0FBQUEsRUFDdEI7QUFBQSxFQUNBLFdBQVcsQ0FBQyxPQUFPO0FBQUEsSUFDakIsS0FBSyxRQUFRLE1BQU0sUUFBUSxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUs7QUFBQTtBQUFBLEVBRXBELE1BQU0sR0FBRztBQUFBLElBQ1AsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7QUFBQTtBQUV6QjtBQUFBO0FBQ0EsTUFBTSxJQUFJO0FBQUEsRUFDUixXQUFXLENBQUMsYUFBYTtBQUFBLElBQ3ZCLEtBQUssY0FBYztBQUFBLElBQ25CLFdBQVcsU0FBUyxhQUFhO0FBQUEsTUFDL0IsSUFBSSxHQUFHLE9BQU8sS0FBSyxHQUFHO0FBQUEsUUFDcEIsTUFBTSxhQUFhLE1BQU0sTUFBTSxPQUFPO0FBQUEsUUFDdEMsS0FBSyxXQUFXLEtBQ2QsZUFBb0IsWUFBSSxNQUFNLE1BQU0sT0FBTyxRQUFRLGFBQWEsTUFBTSxNQUFNLE1BQU0sT0FBTyxLQUMzRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUE7QUFBQSxVQUVNLGNBQWM7QUFBQSxFQUV0QixVQUFVO0FBQUEsRUFDVixxQkFBcUI7QUFBQSxFQUVyQixhQUFhLENBQUM7QUFBQSxFQUNkLE1BQU0sQ0FBQyxPQUFPO0FBQUEsSUFDWixLQUFLLFlBQVksS0FBSyxHQUFHLE1BQU0sV0FBVztBQUFBLElBQzFDLE9BQU87QUFBQTtBQUFBLEVBRVQsT0FBTyxDQUFDLFFBQVE7QUFBQSxJQUNkLE9BQU8sT0FBTyxnQkFBZ0Isb0JBQW9CLENBQUMsU0FBUztBQUFBLE1BQzFELE1BQU0sUUFBUSxLQUFLLDJCQUEyQixLQUFLLGFBQWEsTUFBTTtBQUFBLE1BQ3RFLE1BQU0sY0FBYztBQUFBLFFBQ2xCLHNCQUFzQixNQUFNO0FBQUEsUUFDNUIsd0JBQXdCLEtBQUssVUFBVSxNQUFNLE1BQU07QUFBQSxNQUNyRCxDQUFDO0FBQUEsTUFDRCxPQUFPO0FBQUEsS0FDUjtBQUFBO0FBQUEsRUFFSCwwQkFBMEIsQ0FBQyxRQUFRLFNBQVM7QUFBQSxJQUMxQyxNQUFNLFNBQVMsT0FBTyxPQUFPLENBQUMsR0FBRyxTQUFTO0FBQUEsTUFDeEMsY0FBYyxRQUFRLGdCQUFnQixLQUFLO0FBQUEsTUFDM0MsaUJBQWlCLFFBQVEsbUJBQW1CLEVBQUUsT0FBTyxFQUFFO0FBQUEsSUFDekQsQ0FBQztBQUFBLElBQ0Q7QUFBQSxNQUNFO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxRQUNFO0FBQUEsSUFDSixPQUFPLGFBQWEsT0FBTyxJQUFJLENBQUMsVUFBVTtBQUFBLE1BQ3hDLElBQUksR0FBRyxPQUFPLFdBQVcsR0FBRztBQUFBLFFBQzFCLE9BQU8sRUFBRSxLQUFLLE1BQU0sTUFBTSxLQUFLLEVBQUUsR0FBRyxRQUFRLENBQUMsRUFBRTtBQUFBLE1BQ2pEO0FBQUEsTUFDQSxJQUFJLEdBQUcsT0FBTyxJQUFJLEdBQUc7QUFBQSxRQUNuQixPQUFPLEVBQUUsS0FBSyxXQUFXLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxFQUFFO0FBQUEsTUFDcEQ7QUFBQSxNQUNBLElBQUksVUFBZSxXQUFHO0FBQUEsUUFDcEIsT0FBTyxFQUFFLEtBQUssSUFBSSxRQUFRLENBQUMsRUFBRTtBQUFBLE1BQy9CO0FBQUEsTUFDQSxJQUFJLE1BQU0sUUFBUSxLQUFLLEdBQUc7QUFBQSxRQUN4QixNQUFNLFNBQVMsQ0FBQyxJQUFJLFlBQVksR0FBRyxDQUFDO0FBQUEsUUFDcEMsWUFBWSxHQUFHLE1BQU0sTUFBTSxRQUFRLEdBQUc7QUFBQSxVQUNwQyxPQUFPLEtBQUssQ0FBQztBQUFBLFVBQ2IsSUFBSSxJQUFJLE1BQU0sU0FBUyxHQUFHO0FBQUEsWUFDeEIsT0FBTyxLQUFLLElBQUksWUFBWSxJQUFJLENBQUM7QUFBQSxVQUNuQztBQUFBLFFBQ0Y7QUFBQSxRQUNBLE9BQU8sS0FBSyxJQUFJLFlBQVksR0FBRyxDQUFDO0FBQUEsUUFDaEMsT0FBTyxLQUFLLDJCQUEyQixRQUFRLE1BQU07QUFBQSxNQUN2RDtBQUFBLE1BQ0EsSUFBSSxHQUFHLE9BQU8sR0FBRyxHQUFHO0FBQUEsUUFDbEIsT0FBTyxLQUFLLDJCQUEyQixNQUFNLGFBQWE7QUFBQSxhQUNyRDtBQUFBLFVBQ0gsY0FBYyxnQkFBZ0IsTUFBTTtBQUFBLFFBQ3RDLENBQUM7QUFBQSxNQUNIO0FBQUEsTUFDQSxJQUFJLEdBQUcsT0FBTyxLQUFLLEdBQUc7QUFBQSxRQUNwQixNQUFNLGFBQWEsTUFBTSxNQUFNLE9BQU87QUFBQSxRQUN0QyxNQUFNLFlBQVksTUFBTSxNQUFNLE9BQU87QUFBQSxRQUNyQyxPQUFPO0FBQUEsVUFDTCxLQUFLLGVBQW9CLGFBQUssTUFBTSxXQUFXLFdBQVcsU0FBUyxJQUFJLFdBQVcsVUFBVSxJQUFJLE1BQU0sV0FBVyxTQUFTO0FBQUEsVUFDMUgsUUFBUSxDQUFDO0FBQUEsUUFDWDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLElBQUksR0FBRyxPQUFPLE1BQU0sR0FBRztBQUFBLFFBQ3JCLE1BQU0sYUFBYSxPQUFPLGdCQUFnQixLQUFLO0FBQUEsUUFDL0MsSUFBSSxRQUFRLGlCQUFpQixXQUFXO0FBQUEsVUFDdEMsT0FBTyxFQUFFLEtBQUssV0FBVyxVQUFVLEdBQUcsUUFBUSxDQUFDLEVBQUU7QUFBQSxRQUNuRDtBQUFBLFFBQ0EsTUFBTSxhQUFhLE1BQU0sTUFBTSxNQUFNLE9BQU87QUFBQSxRQUM1QyxPQUFPO0FBQUEsVUFDTCxLQUFLLE1BQU0sTUFBTSxZQUFZLGVBQW9CLFlBQUksV0FBVyxNQUFNLE1BQU0sTUFBTSxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsVUFBVSxJQUFJLFdBQVcsVUFBVSxJQUFJLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsVUFBVTtBQUFBLFVBQ3hPLFFBQVEsQ0FBQztBQUFBLFFBQ1g7QUFBQSxNQUNGO0FBQUEsTUFDQSxJQUFJLEdBQUcsT0FBTyxJQUFJLEdBQUc7QUFBQSxRQUNuQixNQUFNLGFBQWEsTUFBTSxnQkFBZ0I7QUFBQSxRQUN6QyxNQUFNLFdBQVcsTUFBTSxnQkFBZ0I7QUFBQSxRQUN2QyxPQUFPO0FBQUEsVUFDTCxLQUFLLGVBQW9CLGFBQUssTUFBTSxnQkFBZ0IsVUFBVSxXQUFXLFFBQVEsSUFBSSxXQUFXLFVBQVUsSUFBSSxNQUFNLFdBQVcsUUFBUTtBQUFBLFVBQ3ZJLFFBQVEsQ0FBQztBQUFBLFFBQ1g7QUFBQSxNQUNGO0FBQUEsTUFDQSxJQUFJLEdBQUcsT0FBTyxLQUFLLEdBQUc7QUFBQSxRQUNwQixJQUFJLEdBQUcsTUFBTSxPQUFPLFdBQVcsR0FBRztBQUFBLFVBQ2hDLE9BQU8sRUFBRSxLQUFLLFlBQVksZ0JBQWdCLFNBQVMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRTtBQUFBLFFBQ2hHO0FBQUEsUUFDQSxNQUFNLGNBQWMsTUFBTSxVQUFVLE9BQU8sT0FBTyxNQUFNLFFBQVEsaUJBQWlCLE1BQU0sS0FBSztBQUFBLFFBQzVGLElBQUksR0FBRyxhQUFhLEdBQUcsR0FBRztBQUFBLFVBQ3hCLE9BQU8sS0FBSywyQkFBMkIsQ0FBQyxXQUFXLEdBQUcsTUFBTTtBQUFBLFFBQzlEO0FBQUEsUUFDQSxJQUFJLGNBQWM7QUFBQSxVQUNoQixPQUFPLEVBQUUsS0FBSyxLQUFLLGVBQWUsYUFBYSxNQUFNLEdBQUcsUUFBUSxDQUFDLEVBQUU7QUFBQSxRQUNyRTtBQUFBLFFBQ0EsSUFBSSxVQUFVLENBQUMsTUFBTTtBQUFBLFFBQ3JCLElBQUksZUFBZTtBQUFBLFVBQ2pCLFVBQVUsQ0FBQyxjQUFjLE1BQU0sT0FBTyxDQUFDO0FBQUEsUUFDekM7QUFBQSxRQUNBLE9BQU8sRUFBRSxLQUFLLFlBQVksZ0JBQWdCLFNBQVMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEdBQUcsUUFBUTtBQUFBLE1BQ2xHO0FBQUEsTUFDQSxJQUFJLEdBQUcsT0FBTyxXQUFXLEdBQUc7QUFBQSxRQUMxQixPQUFPLEVBQUUsS0FBSyxZQUFZLGdCQUFnQixTQUFTLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUU7QUFBQSxNQUNoRztBQUFBLE1BQ0EsSUFBSSxHQUFHLE9BQU8sSUFBSSxPQUFPLEtBQUssTUFBTSxlQUFvQixXQUFHO0FBQUEsUUFDekQsT0FBTyxFQUFFLEtBQUssV0FBVyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsRUFBRTtBQUFBLE1BQ3pEO0FBQUEsTUFDQSxJQUFJLEdBQUcsT0FBTyxRQUFRLEdBQUc7QUFBQSxRQUN2QixJQUFJLE1BQU0sRUFBRSxRQUFRO0FBQUEsVUFDbEIsT0FBTyxFQUFFLEtBQUssV0FBVyxNQUFNLEVBQUUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxFQUFFO0FBQUEsUUFDdEQ7QUFBQSxRQUNBLE9BQU8sS0FBSywyQkFBMkI7QUFBQSxVQUNyQyxJQUFJLFlBQVksR0FBRztBQUFBLFVBQ25CLE1BQU0sRUFBRTtBQUFBLFVBQ1IsSUFBSSxZQUFZLElBQUk7QUFBQSxVQUNwQixJQUFJLEtBQUssTUFBTSxFQUFFLEtBQUs7QUFBQSxRQUN4QixHQUFHLE1BQU07QUFBQSxNQUNYO0FBQUEsTUFDQSxJQUFJLFNBQVMsS0FBSyxHQUFHO0FBQUEsUUFDbkIsSUFBSSxNQUFNLFFBQVE7QUFBQSxVQUNoQixPQUFPLEVBQUUsS0FBSyxXQUFXLE1BQU0sTUFBTSxJQUFJLE1BQU0sV0FBVyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsRUFBRTtBQUFBLFFBQ3hGO0FBQUEsUUFDQSxPQUFPLEVBQUUsS0FBSyxXQUFXLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxFQUFFO0FBQUEsTUFDdkQ7QUFBQSxNQUNBLElBQUksYUFBYSxLQUFLLEdBQUc7QUFBQSxRQUN2QixJQUFJLE1BQU0sc0JBQXNCLEdBQUc7QUFBQSxVQUNqQyxPQUFPLEtBQUssMkJBQTJCLENBQUMsTUFBTSxPQUFPLENBQUMsR0FBRyxNQUFNO0FBQUEsUUFDakU7QUFBQSxRQUNBLE9BQU8sS0FBSywyQkFBMkI7QUFBQSxVQUNyQyxJQUFJLFlBQVksR0FBRztBQUFBLFVBQ25CLE1BQU0sT0FBTztBQUFBLFVBQ2IsSUFBSSxZQUFZLEdBQUc7QUFBQSxRQUNyQixHQUFHLE1BQU07QUFBQSxNQUNYO0FBQUEsTUFDQSxJQUFJLGNBQWM7QUFBQSxRQUNoQixPQUFPLEVBQUUsS0FBSyxLQUFLLGVBQWUsT0FBTyxNQUFNLEdBQUcsUUFBUSxDQUFDLEVBQUU7QUFBQSxNQUMvRDtBQUFBLE1BQ0EsT0FBTyxFQUFFLEtBQUssWUFBWSxnQkFBZ0IsU0FBUyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFO0FBQUEsS0FDL0YsQ0FBQztBQUFBO0FBQUEsRUFFSixjQUFjLENBQUMsU0FBUyxnQkFBZ0I7QUFBQSxJQUN0QyxJQUFJLFVBQVUsTUFBTTtBQUFBLE1BQ2xCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFJLE9BQU8sVUFBVSxZQUFZLE9BQU8sVUFBVSxXQUFXO0FBQUEsTUFDM0QsT0FBTyxNQUFNLFNBQVM7QUFBQSxJQUN4QjtBQUFBLElBQ0EsSUFBSSxPQUFPLFVBQVUsVUFBVTtBQUFBLE1BQzdCLE9BQU8sYUFBYSxLQUFLO0FBQUEsSUFDM0I7QUFBQSxJQUNBLElBQUksT0FBTyxVQUFVLFVBQVU7QUFBQSxNQUM3QixNQUFNLHNCQUFzQixNQUFNLFNBQVM7QUFBQSxNQUMzQyxJQUFJLHdCQUF3QixtQkFBbUI7QUFBQSxRQUM3QyxPQUFPLGFBQWEsS0FBSyxVQUFVLEtBQUssQ0FBQztBQUFBLE1BQzNDO0FBQUEsTUFDQSxPQUFPLGFBQWEsbUJBQW1CO0FBQUEsSUFDekM7QUFBQSxJQUNBLE1BQU0sSUFBSSxNQUFNLDZCQUE2QixLQUFLO0FBQUE7QUFBQSxFQUVwRCxNQUFNLEdBQUc7QUFBQSxJQUNQLE9BQU87QUFBQTtBQUFBLEVBRVQsRUFBRSxDQUFDLE9BQU87QUFBQSxJQUNSLElBQUksVUFBZSxXQUFHO0FBQUEsTUFDcEIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLE9BQU8sSUFBSSxJQUFJLFFBQVEsTUFBTSxLQUFLO0FBQUE7QUFBQSxFQUVwQyxPQUFPLENBQUMsU0FBUztBQUFBLElBQ2YsS0FBSyxVQUFVLE9BQU8sWUFBWSxhQUFhLEVBQUUsb0JBQW9CLFFBQVEsSUFBSTtBQUFBLElBQ2pGLE9BQU87QUFBQTtBQUFBLEVBRVQsWUFBWSxHQUFHO0FBQUEsSUFDYixLQUFLLHFCQUFxQjtBQUFBLElBQzFCLE9BQU87QUFBQTtBQUFBLEVBUVQsRUFBRSxDQUFDLFdBQVc7QUFBQSxJQUNaLE9BQU8sWUFBWSxPQUFZO0FBQUE7QUFFbkM7QUFBQTtBQUNBLE1BQU0sS0FBSztBQUFBLEVBQ1QsV0FBVyxDQUFDLE9BQU87QUFBQSxJQUNqQixLQUFLLFFBQVE7QUFBQTtBQUFBLFVBRVAsY0FBYztBQUFBLEVBQ3RCO0FBQUEsRUFDQSxNQUFNLEdBQUc7QUFBQSxJQUNQLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQUE7QUFFekI7QUFJQSxTQUFTLG9CQUFvQixDQUFDLE9BQU87QUFBQSxFQUNuQyxPQUFPLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxzQkFBc0IsU0FBUyxPQUFPLE1BQU0scUJBQXFCO0FBQUE7QUFFekgsSUFBTSxjQUFjO0FBQUEsRUFDbEIsb0JBQW9CLENBQUMsVUFBVTtBQUNqQztBQUNBLElBQU0sY0FBYztBQUFBLEVBQ2xCLGtCQUFrQixDQUFDLFVBQVU7QUFDL0I7QUFDQSxJQUFNLGFBQWE7QUFBQSxLQUNkO0FBQUEsS0FDQTtBQUNMO0FBQUE7QUFDQSxNQUFNLE1BQU07QUFBQSxFQUtWLFdBQVcsQ0FBQyxPQUFPLFVBQVUsYUFBYTtBQUFBLElBQ3hDLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxVQUFVO0FBQUE7QUFBQSxVQUVULGNBQWM7QUFBQSxFQUN0QjtBQUFBLEVBQ0EsTUFBTSxHQUFHO0FBQUEsSUFDUCxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztBQUFBO0FBRXpCO0FBSUEsU0FBUyxHQUFHLENBQUMsWUFBWSxRQUFRO0FBQUEsRUFDL0IsTUFBTSxjQUFjLENBQUM7QUFBQSxFQUNyQixJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsU0FBUyxLQUFLLFFBQVEsT0FBTyxJQUFJO0FBQUEsSUFDaEUsWUFBWSxLQUFLLElBQUksWUFBWSxRQUFRLEVBQUUsQ0FBQztBQUFBLEVBQzlDO0FBQUEsRUFDQSxZQUFZLFlBQVksV0FBVyxPQUFPLFFBQVEsR0FBRztBQUFBLElBQ25ELFlBQVksS0FBSyxRQUFRLElBQUksWUFBWSxRQUFRLGFBQWEsRUFBRSxDQUFDO0FBQUEsRUFDbkU7QUFBQSxFQUNBLE9BQU8sSUFBSSxJQUFJLFdBQVc7QUFBQTtBQUFBLENBRTNCLENBQUMsU0FBUztBQUFBLEVBQ1QsU0FBUyxLQUFLLEdBQUc7QUFBQSxJQUNmLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQztBQUFBO0FBQUEsRUFFbkIsS0FBSyxRQUFRO0FBQUEsRUFDYixTQUFTLFFBQVEsQ0FBQyxNQUFNO0FBQUEsSUFDdEIsT0FBTyxJQUFJLElBQUksSUFBSTtBQUFBO0FBQUEsRUFFckIsS0FBSyxXQUFXO0FBQUEsRUFDaEIsU0FBUyxHQUFHLENBQUMsS0FBSztBQUFBLElBQ2hCLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBQUE7QUFBQSxFQUV2QyxLQUFLLE1BQU07QUFBQSxFQUNYLFNBQVMsSUFBSSxDQUFDLFFBQVEsV0FBVztBQUFBLElBQy9CLE1BQU0sU0FBUyxDQUFDO0FBQUEsSUFDaEIsWUFBWSxHQUFHLFVBQVUsT0FBTyxRQUFRLEdBQUc7QUFBQSxNQUN6QyxJQUFJLElBQUksS0FBSyxjQUFtQixXQUFHO0FBQUEsUUFDakMsT0FBTyxLQUFLLFNBQVM7QUFBQSxNQUN2QjtBQUFBLE1BQ0EsT0FBTyxLQUFLLEtBQUs7QUFBQSxJQUNuQjtBQUFBLElBQ0EsT0FBTyxJQUFJLElBQUksTUFBTTtBQUFBO0FBQUEsRUFFdkIsS0FBSyxPQUFPO0FBQUEsRUFDWixTQUFTLFVBQVUsQ0FBQyxPQUFPO0FBQUEsSUFDekIsT0FBTyxJQUFJLEtBQUssS0FBSztBQUFBO0FBQUEsRUFFdkIsS0FBSyxhQUFhO0FBQUEsRUFDbEIsU0FBUyxZQUFZLENBQUMsT0FBTztBQUFBLElBQzNCLE9BQU8sSUFBSSxZQUFZLEtBQUs7QUFBQTtBQUFBLEVBRTlCLEtBQUssY0FBYztBQUFBLEVBQ25CLFNBQVMsTUFBTSxDQUFDLE9BQU8sU0FBUztBQUFBLElBQzlCLE9BQU8sSUFBSSxNQUFNLE9BQU8sT0FBTztBQUFBO0FBQUEsRUFFakMsS0FBSyxRQUFRO0FBQUEsR0FDWixRQUFRLE1BQU0sQ0FBQyxFQUFFO0FBQUEsQ0FDbkIsQ0FBQyxTQUFTO0FBQUE7QUFBQSxFQUNULE1BQU0sUUFBUTtBQUFBLElBQ1osV0FBVyxDQUFDLE1BQU0sWUFBWTtBQUFBLE1BQzVCLEtBQUssTUFBTTtBQUFBLE1BQ1gsS0FBSyxhQUFhO0FBQUE7QUFBQSxZQUVaLGNBQWM7QUFBQSxJQUV0QixtQkFBbUI7QUFBQSxJQUNuQixNQUFNLEdBQUc7QUFBQSxNQUNQLE9BQU8sS0FBSztBQUFBO0FBQUEsSUFHZCxLQUFLLEdBQUc7QUFBQSxNQUNOLE9BQU8sSUFBSSxRQUFRLEtBQUssS0FBSyxLQUFLLFVBQVU7QUFBQTtBQUFBLEVBRWhEO0FBQUEsRUFDQSxLQUFLLFVBQVU7QUFBQSxHQUNkLFFBQVEsTUFBTSxDQUFDLEVBQUU7QUFBQTtBQUNwQixNQUFNLFlBQVk7QUFBQSxFQUNoQixXQUFXLENBQUMsT0FBTztBQUFBLElBQ2pCLEtBQUssT0FBTztBQUFBO0FBQUEsVUFFTixjQUFjO0FBQUEsRUFDdEIsTUFBTSxHQUFHO0FBQUEsSUFDUCxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztBQUFBO0FBRXpCO0FBSUEsU0FBUyxnQkFBZ0IsQ0FBQyxRQUFRLFFBQVE7QUFBQSxFQUN4QyxPQUFPLE9BQU8sSUFBSSxDQUFDLE1BQU07QUFBQSxJQUN2QixJQUFJLEdBQUcsR0FBRyxXQUFXLEdBQUc7QUFBQSxNQUN0QixNQUFNLEVBQUUsUUFBUSxTQUFTO0FBQUEsUUFDdkIsTUFBTSxJQUFJLE1BQU0sNkJBQTZCLEVBQUUsb0JBQW9CO0FBQUEsTUFDckU7QUFBQSxNQUNBLE9BQU8sT0FBTyxFQUFFO0FBQUEsSUFDbEI7QUFBQSxJQUNBLElBQUksR0FBRyxHQUFHLEtBQUssS0FBSyxHQUFHLEVBQUUsT0FBTyxXQUFXLEdBQUc7QUFBQSxNQUM1QyxNQUFNLEVBQUUsTUFBTSxRQUFRLFNBQVM7QUFBQSxRQUM3QixNQUFNLElBQUksTUFBTSw2QkFBNkIsRUFBRSxNQUFNLG9CQUFvQjtBQUFBLE1BQzNFO0FBQUEsTUFDQSxPQUFPLEVBQUUsUUFBUSxpQkFBaUIsT0FBTyxFQUFFLE1BQU0sS0FBSztBQUFBLElBQ3hEO0FBQUEsSUFDQSxPQUFPO0FBQUEsR0FDUjtBQUFBO0FBRUgsSUFBTSxnQkFBZ0IsT0FBTyxJQUFJLHVCQUF1QjtBQUFBO0FBQ3hELE1BQU0sS0FBSztBQUFBLFVBQ0QsY0FBYztBQUFBLEdBRXJCO0FBQUEsR0FFQSxpQkFBaUI7QUFBQSxFQUNsQixXQUFXLEdBQUcsTUFBTSxPQUFPLFFBQVEsZ0JBQWdCLFNBQVM7QUFBQSxJQUMxRCxLQUFLLGtCQUFrQjtBQUFBLE1BQ3JCLE1BQU07QUFBQSxNQUNOLGNBQWM7QUFBQSxNQUNkO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBLGFBQWE7QUFBQSxNQUNiLFNBQVM7QUFBQSxJQUNYO0FBQUE7QUFBQSxFQUVGLE1BQU0sR0FBRztBQUFBLElBQ1AsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7QUFBQTtBQUV6QjtBQU9BLE9BQU8sVUFBVSxTQUFTLFFBQVEsR0FBRztBQUFBLEVBQ25DLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQUE7QUFFdkIsTUFBTSxVQUFVLFNBQVMsUUFBUSxHQUFHO0FBQUEsRUFDbEMsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7QUFBQTtBQUV2QixTQUFTLFVBQVUsU0FBUyxRQUFRLEdBQUc7QUFBQSxFQUNyQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztBQUFBOzs7QUN2WnZCLE1BQU0sd0JBQXdCO0FBQUEsRUFDNUIsV0FBVyxDQUFDLE9BQU87QUFBQSxJQUNqQixLQUFLLFFBQVE7QUFBQTtBQUFBLFVBRVAsY0FBYztBQUFBLEVBQ3RCLEdBQUcsQ0FBQyxXQUFXLE1BQU07QUFBQSxJQUNuQixJQUFJLFNBQVMsU0FBUztBQUFBLE1BQ3BCLE9BQU8sS0FBSztBQUFBLElBQ2Q7QUFBQSxJQUNBLE9BQU8sVUFBVTtBQUFBO0FBRXJCO0FBQUE7QUFDQSxNQUFNLHVCQUF1QjtBQUFBLEVBQzNCLFdBQVcsQ0FBQyxPQUFPLHFCQUFxQjtBQUFBLElBQ3RDLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxzQkFBc0I7QUFBQTtBQUFBLFVBRXJCLGNBQWM7QUFBQSxFQUN0QixHQUFHLENBQUMsUUFBUSxNQUFNO0FBQUEsSUFDaEIsSUFBSSxTQUFTLE1BQU0sT0FBTyxTQUFTO0FBQUEsTUFDakMsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLElBQUksU0FBUyxNQUFNLE9BQU8sTUFBTTtBQUFBLE1BQzlCLE9BQU8sS0FBSztBQUFBLElBQ2Q7QUFBQSxJQUNBLElBQUksS0FBSyx1QkFBdUIsU0FBUyxNQUFNLE9BQU8sY0FBYztBQUFBLE1BQ2xFLE9BQU8sS0FBSztBQUFBLElBQ2Q7QUFBQSxJQUNBLElBQUksU0FBUyxnQkFBZ0I7QUFBQSxNQUMzQixPQUFPO0FBQUEsV0FDRixPQUFPO0FBQUEsUUFDVixNQUFNLEtBQUs7QUFBQSxRQUNYLFNBQVM7QUFBQSxNQUNYO0FBQUEsSUFDRjtBQUFBLElBQ0EsSUFBSSxTQUFTLE1BQU0sT0FBTyxTQUFTO0FBQUEsTUFDakMsTUFBTSxVQUFVLE9BQU8sTUFBTSxPQUFPO0FBQUEsTUFDcEMsS0FBSyxTQUFTO0FBQUEsUUFDWixPQUFPO0FBQUEsTUFDVDtBQUFBLE1BQ0EsTUFBTSxpQkFBaUIsQ0FBQztBQUFBLE1BQ3hCLE9BQU8sS0FBSyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVE7QUFBQSxRQUNoQyxlQUFlLE9BQU8sSUFBSSxNQUN4QixRQUFRLE1BQ1IsSUFBSSx3QkFBd0IsSUFBSSxNQUFNLFFBQVEsSUFBSSxDQUFDLENBQ3JEO0FBQUEsT0FDRDtBQUFBLE1BQ0QsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLE1BQU0sUUFBUSxPQUFPO0FBQUEsSUFDckIsSUFBSSxHQUFHLE9BQU8sTUFBTSxHQUFHO0FBQUEsTUFDckIsT0FBTyxJQUFJLE1BQU0sT0FBTyxJQUFJLHdCQUF3QixJQUFJLE1BQU0sUUFBUSxJQUFJLENBQUMsQ0FBQztBQUFBLElBQzlFO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFFWDtBQWFBLFNBQVMsWUFBWSxDQUFDLE9BQU8sWUFBWTtBQUFBLEVBQ3ZDLE9BQU8sSUFBSSxNQUFNLE9BQU8sSUFBSSx1QkFBdUIsWUFBWSxLQUFLLENBQUM7QUFBQTtBQUt2RSxTQUFTLGtCQUFrQixDQUFDLFFBQVEsWUFBWTtBQUFBLEVBQzlDLE9BQU8sSUFBSSxNQUNULFFBQ0EsSUFBSSx3QkFBd0IsSUFBSSxNQUFNLE9BQU8sT0FBTyxJQUFJLHVCQUF1QixZQUFZLEtBQUssQ0FBQyxDQUFDLENBQ3BHO0FBQUE7QUFFRixTQUFTLDZCQUE2QixDQUFDLE9BQU8sT0FBTztBQUFBLEVBQ25ELE9BQU8sSUFBSSxJQUFJLFFBQVEsdUJBQXVCLE1BQU0sS0FBSyxLQUFLLEdBQUcsTUFBTSxVQUFVO0FBQUE7QUFFbkYsU0FBUyxzQkFBc0IsQ0FBQyxPQUFPLE9BQU87QUFBQSxFQUM1QyxPQUFPLElBQUksS0FBSyxNQUFNLFlBQVksSUFBSSxDQUFDLE1BQU07QUFBQSxJQUMzQyxJQUFJLEdBQUcsR0FBRyxNQUFNLEdBQUc7QUFBQSxNQUNqQixPQUFPLG1CQUFtQixHQUFHLEtBQUs7QUFBQSxJQUNwQztBQUFBLElBQ0EsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHO0FBQUEsTUFDZCxPQUFPLHVCQUF1QixHQUFHLEtBQUs7QUFBQSxJQUN4QztBQUFBLElBQ0EsSUFBSSxHQUFHLEdBQUcsSUFBSSxPQUFPLEdBQUc7QUFBQSxNQUN0QixPQUFPLDhCQUE4QixHQUFHLEtBQUs7QUFBQSxJQUMvQztBQUFBLElBQ0EsT0FBTztBQUFBLEdBQ1IsQ0FBQztBQUFBOzs7QUM5RkosU0FBUyxZQUFZLENBQUMsU0FBUyxLQUFLLHFCQUFxQjtBQUFBLEVBQ3ZELE1BQU0sYUFBYSxDQUFDO0FBQUEsRUFDcEIsTUFBTSxTQUFTLFFBQVEsT0FDckIsQ0FBQyxXQUFXLE1BQU0sU0FBUyxnQkFBZ0I7QUFBQSxJQUN6QyxJQUFJO0FBQUEsSUFDSixJQUFJLEdBQUcsT0FBTyxNQUFNLEdBQUc7QUFBQSxNQUNyQixVQUFVO0FBQUEsSUFDWixFQUFPLFNBQUksR0FBRyxPQUFPLEdBQUcsR0FBRztBQUFBLE1BQ3pCLFVBQVUsTUFBTTtBQUFBLElBQ2xCLEVBQU87QUFBQSxNQUNMLFVBQVUsTUFBTSxJQUFJO0FBQUE7QUFBQSxJQUV0QixJQUFJLE9BQU87QUFBQSxJQUNYLFlBQVksZ0JBQWdCLGNBQWMsS0FBSyxRQUFRLEdBQUc7QUFBQSxNQUN4RCxJQUFJLGlCQUFpQixLQUFLLFNBQVMsR0FBRztBQUFBLFFBQ3BDLE1BQU0sYUFBYSxPQUFPO0FBQUEsVUFDeEIsS0FBSyxhQUFhLENBQUM7QUFBQSxRQUNyQjtBQUFBLFFBQ0EsT0FBTyxLQUFLO0FBQUEsTUFDZCxFQUFPO0FBQUEsUUFDTCxNQUFNLFdBQVcsSUFBSTtBQUFBLFFBQ3JCLE1BQU0sUUFBUSxLQUFLLGFBQWEsYUFBYSxPQUFPLE9BQU8sUUFBUSxtQkFBbUIsUUFBUTtBQUFBLFFBQzlGLElBQUksdUJBQXVCLEdBQUcsT0FBTyxNQUFNLEtBQUssS0FBSyxXQUFXLEdBQUc7QUFBQSxVQUNqRSxNQUFNLGFBQWEsS0FBSztBQUFBLFVBQ3hCLE1BQU0sY0FBYyxhQUFhO0FBQUEsWUFDL0IsV0FBVyxjQUFjLFVBQVUsT0FBTyxhQUFhLE1BQU0sS0FBSyxJQUFJO0FBQUEsVUFDeEUsRUFBTyxTQUFJLE9BQU8sV0FBVyxnQkFBZ0IsWUFBWSxXQUFXLGdCQUFnQixhQUFhLE1BQU0sS0FBSyxHQUFHO0FBQUEsWUFDN0csV0FBVyxjQUFjO0FBQUEsVUFDM0I7QUFBQSxRQUNGO0FBQUE7QUFBQSxJQUVKO0FBQUEsSUFDQSxPQUFPO0FBQUEsS0FFVCxDQUFDLENBQ0g7QUFBQSxFQUNBLElBQUksdUJBQXVCLE9BQU8sS0FBSyxVQUFVLEVBQUUsU0FBUyxHQUFHO0FBQUEsSUFDN0QsWUFBWSxZQUFZLGNBQWMsT0FBTyxRQUFRLFVBQVUsR0FBRztBQUFBLE1BQ2hFLElBQUksT0FBTyxjQUFjLGFBQWEsb0JBQW9CLFlBQVk7QUFBQSxRQUNwRSxPQUFPLGNBQWM7QUFBQSxNQUN2QjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFDQSxPQUFPO0FBQUE7QUFFVCxTQUFTLG1CQUFtQixDQUFDLFFBQVEsWUFBWTtBQUFBLEVBQy9DLE9BQU8sT0FBTyxRQUFRLE1BQU0sRUFBRSxPQUFPLENBQUMsU0FBUyxNQUFNLFdBQVc7QUFBQSxJQUM5RCxJQUFJLE9BQU8sU0FBUyxVQUFVO0FBQUEsTUFDNUIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBRyxZQUFZLElBQUksSUFBSSxDQUFDLElBQUk7QUFBQSxJQUMxRCxJQUFJLEdBQUcsT0FBTyxNQUFNLEtBQUssR0FBRyxPQUFPLEdBQUcsS0FBSyxHQUFHLE9BQU8sSUFBSSxPQUFPLEdBQUc7QUFBQSxNQUNqRSxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsTUFBTSxDQUFDO0FBQUEsSUFDdEMsRUFBTyxTQUFJLEdBQUcsT0FBTyxLQUFLLEdBQUc7QUFBQSxNQUMzQixPQUFPLEtBQUssR0FBRyxvQkFBb0IsTUFBTSxNQUFNLE9BQU8sVUFBVSxPQUFPLENBQUM7QUFBQSxJQUMxRSxFQUFPO0FBQUEsTUFDTCxPQUFPLEtBQUssR0FBRyxvQkFBb0IsT0FBTyxPQUFPLENBQUM7QUFBQTtBQUFBLElBRXBELE9BQU87QUFBQSxLQUNOLENBQUMsQ0FBQztBQUFBO0FBRVAsU0FBUyxZQUFZLENBQUMsTUFBTSxPQUFPO0FBQUEsRUFDakMsTUFBTSxXQUFXLE9BQU8sS0FBSyxJQUFJO0FBQUEsRUFDakMsTUFBTSxZQUFZLE9BQU8sS0FBSyxLQUFLO0FBQUEsRUFDbkMsSUFBSSxTQUFTLFdBQVcsVUFBVSxRQUFRO0FBQUEsSUFDeEMsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLFlBQVksT0FBTyxRQUFRLFNBQVMsUUFBUSxHQUFHO0FBQUEsSUFDN0MsSUFBSSxRQUFRLFVBQVUsUUFBUTtBQUFBLE1BQzVCLE9BQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUFBLEVBQ0EsT0FBTztBQUFBO0FBRVQsU0FBUyxZQUFZLENBQUMsT0FBTyxRQUFRO0FBQUEsRUFDbkMsTUFBTSxVQUFVLE9BQU8sUUFBUSxNQUFNLEVBQUUsT0FBTyxJQUFJLFdBQVcsVUFBZSxTQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssV0FBVztBQUFBLElBQ25HLElBQUksR0FBRyxPQUFPLEdBQUcsS0FBSyxHQUFHLE9BQU8sTUFBTSxHQUFHO0FBQUEsTUFDdkMsT0FBTyxDQUFDLEtBQUssS0FBSztBQUFBLElBQ3BCLEVBQU87QUFBQSxNQUNMLE9BQU8sQ0FBQyxLQUFLLElBQUksTUFBTSxPQUFPLE1BQU0sTUFBTSxPQUFPLFNBQVMsSUFBSSxDQUFDO0FBQUE7QUFBQSxHQUVsRTtBQUFBLEVBQ0QsSUFBSSxRQUFRLFdBQVcsR0FBRztBQUFBLElBQ3hCLE1BQU0sSUFBSSxNQUFNLGtCQUFrQjtBQUFBLEVBQ3BDO0FBQUEsRUFDQSxPQUFPLE9BQU8sWUFBWSxPQUFPO0FBQUE7QUFFbkMsU0FBUyxXQUFXLENBQUMsV0FBVyxpQkFBaUI7QUFBQSxFQUMvQyxXQUFXLGlCQUFpQixpQkFBaUI7QUFBQSxJQUMzQyxXQUFXLFFBQVEsT0FBTyxvQkFBb0IsY0FBYyxTQUFTLEdBQUc7QUFBQSxNQUN0RSxJQUFJLFNBQVM7QUFBQSxRQUFlO0FBQUEsTUFDNUIsT0FBTyxlQUNMLFVBQVUsV0FDVixNQUNBLE9BQU8seUJBQXlCLGNBQWMsV0FBVyxJQUFJLHFCQUFxQixPQUFPLE9BQU8sSUFBSSxDQUN0RztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUE7QUFFRixTQUFTLGVBQWUsQ0FBQyxPQUFPO0FBQUEsRUFDOUIsT0FBTyxNQUFNLE1BQU0sT0FBTztBQUFBO0FBSzVCLFNBQVMsZ0JBQWdCLENBQUMsT0FBTztBQUFBLEVBQy9CLE9BQU8sR0FBRyxPQUFPLFFBQVEsSUFBSSxNQUFNLEVBQUUsUUFBUSxHQUFHLE9BQU8sSUFBSSxJQUFJLE1BQU0sZ0JBQWdCLE9BQU8sR0FBRyxPQUFPLEdBQUcsSUFBUyxZQUFJLE1BQU0sTUFBTSxPQUFPLFdBQVcsTUFBTSxNQUFNLE9BQU8sUUFBUSxNQUFNLE1BQU0sT0FBTztBQUFBO0FBRXBNLFNBQVMsc0JBQXNCLENBQUMsR0FBRyxHQUFHO0FBQUEsRUFDcEMsT0FBTztBQUFBLElBQ0wsTUFBTSxPQUFPLE1BQU0sWUFBWSxFQUFFLFNBQVMsSUFBSSxJQUFJO0FBQUEsSUFDbEQsUUFBUSxPQUFPLE1BQU0sV0FBVyxJQUFJO0FBQUEsRUFDdEM7QUFBQTtBQUlGLFNBQVMsUUFBUSxDQUFDLE1BQU07QUFBQSxFQUN0QixJQUFJLE9BQU8sU0FBUyxZQUFZLFNBQVM7QUFBQSxJQUFNLE9BQU87QUFBQSxFQUN0RCxJQUFJLEtBQUssWUFBWSxTQUFTO0FBQUEsSUFBVSxPQUFPO0FBQUEsRUFDL0MsSUFBSSxZQUFZLE1BQU07QUFBQSxJQUNwQixNQUFNLE9BQU8sT0FBTyxLQUFLO0FBQUEsSUFDekIsSUFBSSxTQUFTLGNBQWMsU0FBUyxZQUFZLE9BQU8sS0FBSyxVQUFVLGdCQUFnQixlQUFlLFNBQVM7QUFBQSxNQUFhLE9BQU87QUFBQSxJQUNsSSxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBQ0EsSUFBSSxZQUFZLE1BQU07QUFBQSxJQUNwQixNQUFNLE9BQU8sT0FBTyxLQUFLO0FBQUEsSUFDekIsSUFBSSxTQUFTLFlBQVksU0FBUztBQUFBLE1BQWEsT0FBTztBQUFBLElBQ3RELE9BQU87QUFBQSxFQUNUO0FBQUEsRUFDQSxJQUFJLFlBQVksTUFBTTtBQUFBLElBQ3BCLE1BQU0sT0FBTyxPQUFPLEtBQUs7QUFBQSxJQUN6QixJQUFJLFNBQVMsWUFBWSxTQUFTO0FBQUEsTUFBYSxPQUFPO0FBQUEsSUFDdEQsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUNBLElBQUksVUFBVSxNQUFNO0FBQUEsSUFDbEIsSUFBSSxLQUFLLFlBQVksYUFBYSxLQUFLLFlBQVksaUJBQWlCLEtBQUssWUFBaUI7QUFBQSxNQUFHLE9BQU87QUFBQSxJQUNwRyxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBQ0EsSUFBSSxnQkFBZ0IsTUFBTTtBQUFBLElBQ3hCLE1BQU0sT0FBTyxPQUFPLEtBQUs7QUFBQSxJQUN6QixJQUFJLFNBQVMsWUFBWSxTQUFTLFlBQVksU0FBUztBQUFBLE1BQWEsT0FBTztBQUFBLElBQzNFLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFDQSxJQUFJLFlBQVksTUFBTTtBQUFBLElBQ3BCLE1BQU0sT0FBTyxPQUFPLEtBQUs7QUFBQSxJQUN6QixJQUFJLFNBQVMsWUFBWSxTQUFTLGNBQWMsU0FBUztBQUFBLE1BQWEsT0FBTztBQUFBLElBQzdFLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFDQSxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUUsV0FBVztBQUFBLElBQUcsT0FBTztBQUFBLEVBQzNDLE9BQU87QUFBQTtBQUVULElBQU0sY0FBYyxPQUFPLGdCQUFnQixjQUFjLE9BQU8sSUFBSTs7O0FDM0pwRSxNQUFNLGtCQUFrQjtBQUFBLFVBQ2QsY0FBYztBQUFBLEVBRXRCO0FBQUEsRUFFQTtBQUFBLEVBRUE7QUFBQSxFQUNBLFdBQVcsQ0FBQyxRQUFRLFNBQVM7QUFBQSxJQUMzQixLQUFLLFlBQVksTUFBTTtBQUFBLE1BQ3JCLFFBQVEsTUFBTSxTQUFTLG1CQUFtQixPQUFPO0FBQUEsTUFDakQsT0FBTyxFQUFFLE1BQU0sU0FBUyxjQUFjLGVBQWUsR0FBRyxPQUFPLGVBQWU7QUFBQTtBQUFBLElBRWhGLElBQUksU0FBUztBQUFBLE1BQ1gsS0FBSyxZQUFZLFFBQVE7QUFBQSxNQUN6QixLQUFLLFlBQVksUUFBUTtBQUFBLElBQzNCO0FBQUE7QUFBQSxFQUVGLFFBQVEsQ0FBQyxRQUFRO0FBQUEsSUFDZixLQUFLLFlBQVk7QUFBQSxJQUNqQixPQUFPO0FBQUE7QUFBQSxFQUVULFFBQVEsQ0FBQyxRQUFRO0FBQUEsSUFDZixLQUFLLFlBQVk7QUFBQSxJQUNqQixPQUFPO0FBQUE7QUFBQSxFQUdULEtBQUssQ0FBQyxPQUFPO0FBQUEsSUFDWCxPQUFPLElBQUksV0FBVyxPQUFPLElBQUk7QUFBQTtBQUVyQztBQUFBO0FBQ0EsTUFBTSxXQUFXO0FBQUEsRUFDZixXQUFXLENBQUMsT0FBTyxTQUFTO0FBQUEsSUFDMUIsS0FBSyxRQUFRO0FBQUEsSUFDYixLQUFLLFlBQVksUUFBUTtBQUFBLElBQ3pCLEtBQUssV0FBVyxRQUFRO0FBQUEsSUFDeEIsS0FBSyxXQUFXLFFBQVE7QUFBQTtBQUFBLFVBRWxCLGNBQWM7QUFBQSxFQUN0QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxPQUFPLEdBQUc7QUFBQSxJQUNSLFFBQVEsTUFBTSxTQUFTLG1CQUFtQixLQUFLLFVBQVU7QUFBQSxJQUN6RCxNQUFNLGNBQWMsUUFBUSxJQUFJLENBQUMsV0FBVyxPQUFPLElBQUk7QUFBQSxJQUN2RCxNQUFNLHFCQUFxQixlQUFlLElBQUksQ0FBQyxXQUFXLE9BQU8sSUFBSTtBQUFBLElBQ3JFLE1BQU0sU0FBUztBQUFBLE1BQ2IsS0FBSyxNQUFNO0FBQUEsTUFDWCxHQUFHO0FBQUEsTUFDSCxlQUFlLEdBQUcsTUFBTTtBQUFBLE1BQ3hCLEdBQUc7QUFBQSxJQUNMO0FBQUEsSUFDQSxPQUFPLFFBQVEsR0FBRyxPQUFPLEtBQUssR0FBRztBQUFBO0FBRXJDOzs7QUN0REEsU0FBUyxjQUFhLENBQUMsT0FBTyxTQUFTO0FBQUEsRUFDckMsT0FBTyxHQUFHLE1BQU0sY0FBYyxRQUFRLEtBQUssR0FBRztBQUFBOzs7QUNFaEQsTUFBTSw0QkFBNEIsY0FBYztBQUFBLFVBQ3RDLGNBQWM7QUFBQSxFQUN0QixvQkFBb0IsQ0FBQztBQUFBLEVBQ3JCLFVBQVUsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxHQUFHO0FBQUEsSUFDNUIsS0FBSyxrQkFBa0IsS0FBSyxFQUFFLEtBQUssUUFBUSxDQUFDO0FBQUEsSUFDNUMsT0FBTztBQUFBO0FBQUEsRUFFVCxNQUFNLENBQUMsTUFBTTtBQUFBLElBQ1gsS0FBSyxPQUFPLFdBQVc7QUFBQSxJQUN2QixLQUFLLE9BQU8sYUFBYTtBQUFBLElBQ3pCLE9BQU87QUFBQTtBQUFBLEVBRVQsaUJBQWlCLENBQUMsSUFBSSxRQUFRO0FBQUEsSUFDNUIsS0FBSyxPQUFPLFlBQVk7QUFBQSxNQUN0QjtBQUFBLE1BQ0EsTUFBTTtBQUFBLE1BQ04sTUFBTSxRQUFRLFFBQVE7QUFBQSxJQUN4QjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFHVCxnQkFBZ0IsQ0FBQyxRQUFRLE9BQU87QUFBQSxJQUM5QixPQUFPLEtBQUssa0JBQWtCLElBQUksR0FBRyxLQUFLLGNBQWM7QUFBQSxNQUN0RCxRQUFRLENBQUMsTUFBTSxhQUFhO0FBQUEsUUFDMUIsTUFBTSxVQUFVLElBQUksa0JBQWtCLE1BQU07QUFBQSxVQUMxQyxNQUFNLGdCQUFnQixLQUFLO0FBQUEsVUFDM0IsT0FBTyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxFQUFFO0FBQUEsU0FDN0Q7QUFBQSxRQUNELElBQUksU0FBUyxVQUFVO0FBQUEsVUFDckIsUUFBUSxTQUFTLFNBQVMsUUFBUTtBQUFBLFFBQ3BDO0FBQUEsUUFDQSxJQUFJLFNBQVMsVUFBVTtBQUFBLFVBQ3JCLFFBQVEsU0FBUyxTQUFTLFFBQVE7QUFBQSxRQUNwQztBQUFBLFFBQ0EsT0FBTyxRQUFRLE1BQU0sS0FBSztBQUFBLFNBQ3pCLEtBQUssT0FBTztBQUFBLEtBQ2hCO0FBQUE7QUFFTDtBQUFBO0FBQ0EsTUFBTSxxQkFBcUIsT0FBTztBQUFBLEVBQ2hDLFdBQVcsQ0FBQyxPQUFPLFFBQVE7QUFBQSxJQUN6QixLQUFLLE9BQU8sWUFBWTtBQUFBLE1BQ3RCLE9BQU8sYUFBYSxlQUFjLE9BQU8sQ0FBQyxPQUFPLElBQUksQ0FBQztBQUFBLElBQ3hEO0FBQUEsSUFDQSxNQUFNLE9BQU8sTUFBTTtBQUFBLElBQ25CLEtBQUssUUFBUTtBQUFBO0FBQUEsVUFFUCxjQUFjO0FBQ3hCOzs7QUNsREEsTUFBTSw0QkFBNEIsb0JBQW9CO0FBQUEsVUFDNUMsY0FBYztBQUFBLEVBQ3RCLFdBQVcsQ0FBQyxNQUFNO0FBQUEsSUFDaEIsTUFBTSxNQUFNLFVBQVUsY0FBYztBQUFBO0FBQUEsRUFHdEMsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLE9BQU8sSUFBSSxhQUFhLE9BQU8sS0FBSyxNQUFNO0FBQUE7QUFFOUM7QUFBQTtBQUNBLE1BQU0scUJBQXFCLGFBQWE7QUFBQSxVQUM5QixjQUFjO0FBQUEsRUFDdEIsVUFBVSxHQUFHO0FBQUEsSUFDWCxPQUFPO0FBQUE7QUFBQSxFQUVULGtCQUFrQixDQUFDLE9BQU87QUFBQSxJQUN4QixJQUFJLE9BQU8sV0FBVyxlQUFlLE9BQU8sTUFBTTtBQUFBLE1BQ2hELE1BQU0sTUFBTSxPQUFPLFNBQVMsS0FBSyxJQUFJLFFBQVEsaUJBQWlCLGNBQWMsT0FBTyxLQUFLLEtBQUssSUFBSSxNQUFNLFNBQVMsT0FBTyxLQUFLLE1BQU0sUUFBUSxNQUFNLFlBQVksTUFBTSxVQUFVLElBQUksT0FBTyxLQUFLLEtBQUs7QUFBQSxNQUNqTSxPQUFPLE9BQU8sSUFBSSxTQUFTLE1BQU0sQ0FBQztBQUFBLElBQ3BDO0FBQUEsSUFDQSxPQUFPLE9BQU8sWUFBWSxPQUFPLEtBQUssQ0FBQztBQUFBO0FBQUEsRUFFekMsZ0JBQWdCLENBQUMsT0FBTztBQUFBLElBQ3RCLE9BQU8sT0FBTyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBQUE7QUFFdkM7QUFBQTtBQUNBLE1BQU0sOEJBQThCLG9CQUFvQjtBQUFBLFVBQzlDLGNBQWM7QUFBQSxFQUN0QixXQUFXLENBQUMsTUFBTTtBQUFBLElBQ2hCLE1BQU0sTUFBTSxRQUFRLGdCQUFnQjtBQUFBO0FBQUEsRUFHdEMsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLE9BQU8sSUFBSSxlQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSx1QkFBdUIsYUFBYTtBQUFBLFVBQ2hDLGNBQWM7QUFBQSxFQUN0QixVQUFVLEdBQUc7QUFBQSxJQUNYLE9BQU87QUFBQTtBQUFBLEVBRVQsa0JBQWtCLENBQUMsT0FBTztBQUFBLElBQ3hCLElBQUksT0FBTyxXQUFXLGVBQWUsT0FBTyxNQUFNO0FBQUEsTUFDaEQsTUFBTSxNQUFNLE9BQU8sU0FBUyxLQUFLLElBQUksUUFBUSxpQkFBaUIsY0FBYyxPQUFPLEtBQUssS0FBSyxJQUFJLE1BQU0sU0FBUyxPQUFPLEtBQUssTUFBTSxRQUFRLE1BQU0sWUFBWSxNQUFNLFVBQVUsSUFBSSxPQUFPLEtBQUssS0FBSztBQUFBLE1BQ2pNLE9BQU8sS0FBSyxNQUFNLElBQUksU0FBUyxNQUFNLENBQUM7QUFBQSxJQUN4QztBQUFBLElBQ0EsT0FBTyxLQUFLLE1BQU0sWUFBWSxPQUFPLEtBQUssQ0FBQztBQUFBO0FBQUEsRUFFN0MsZ0JBQWdCLENBQUMsT0FBTztBQUFBLElBQ3RCLE9BQU8sT0FBTyxLQUFLLEtBQUssVUFBVSxLQUFLLENBQUM7QUFBQTtBQUU1QztBQUFBO0FBQ0EsTUFBTSxnQ0FBZ0Msb0JBQW9CO0FBQUEsVUFDaEQsY0FBYztBQUFBLEVBQ3RCLFdBQVcsQ0FBQyxNQUFNO0FBQUEsSUFDaEIsTUFBTSxNQUFNLFVBQVUsa0JBQWtCO0FBQUE7QUFBQSxFQUcxQyxLQUFLLENBQUMsT0FBTztBQUFBLElBQ1gsT0FBTyxJQUFJLGlCQUFpQixPQUFPLEtBQUssTUFBTTtBQUFBO0FBRWxEO0FBQUE7QUFDQSxNQUFNLHlCQUF5QixhQUFhO0FBQUEsVUFDbEMsY0FBYztBQUFBLEVBQ3RCLGtCQUFrQixDQUFDLE9BQU87QUFBQSxJQUN4QixJQUFJLE9BQU8sU0FBUyxLQUFLLEdBQUc7QUFBQSxNQUMxQixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsT0FBTyxPQUFPLEtBQUssS0FBSztBQUFBO0FBQUEsRUFFMUIsVUFBVSxHQUFHO0FBQUEsSUFDWCxPQUFPO0FBQUE7QUFFWDtBQUNBLFNBQVMsSUFBSSxDQUFDLEdBQUcsR0FBRztBQUFBLEVBQ2xCLFFBQVEsTUFBTSxXQUFXLHVCQUF1QixHQUFHLENBQUM7QUFBQSxFQUNwRCxJQUFJLFFBQVEsU0FBUyxRQUFRO0FBQUEsSUFDM0IsT0FBTyxJQUFJLHNCQUFzQixJQUFJO0FBQUEsRUFDdkM7QUFBQSxFQUNBLElBQUksUUFBUSxTQUFTLFVBQVU7QUFBQSxJQUM3QixPQUFPLElBQUksb0JBQW9CLElBQUk7QUFBQSxFQUNyQztBQUFBLEVBQ0EsT0FBTyxJQUFJLHdCQUF3QixJQUFJO0FBQUE7OztBQ3JGekMsTUFBTSxrQ0FBa0Msb0JBQW9CO0FBQUEsVUFDbEQsY0FBYztBQUFBLEVBQ3RCLFdBQVcsQ0FBQyxNQUFNLGFBQWEsa0JBQWtCO0FBQUEsSUFDL0MsTUFBTSxNQUFNLFVBQVUsb0JBQW9CO0FBQUEsSUFDMUMsS0FBSyxPQUFPLGNBQWM7QUFBQSxJQUMxQixLQUFLLE9BQU8sbUJBQW1CO0FBQUE7QUFBQSxFQUdqQyxLQUFLLENBQUMsT0FBTztBQUFBLElBQ1gsT0FBTyxJQUFJLG1CQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSwyQkFBMkIsYUFBYTtBQUFBLFVBQ3BDLGNBQWM7QUFBQSxFQUN0QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxXQUFXLENBQUMsT0FBTyxRQUFRO0FBQUEsSUFDekIsTUFBTSxPQUFPLE1BQU07QUFBQSxJQUNuQixLQUFLLFVBQVUsT0FBTyxpQkFBaUIsU0FBUyxPQUFPLFdBQVc7QUFBQSxJQUNsRSxLQUFLLFFBQVEsT0FBTyxpQkFBaUI7QUFBQSxJQUNyQyxLQUFLLFVBQVUsT0FBTyxpQkFBaUI7QUFBQTtBQUFBLEVBRXpDLFVBQVUsR0FBRztBQUFBLElBQ1gsT0FBTyxLQUFLO0FBQUE7QUFBQSxFQUVkLGtCQUFrQixDQUFDLE9BQU87QUFBQSxJQUN4QixPQUFPLE9BQU8sS0FBSyxZQUFZLGFBQWEsS0FBSyxRQUFRLEtBQUssSUFBSTtBQUFBO0FBQUEsRUFFcEUsZ0JBQWdCLENBQUMsT0FBTztBQUFBLElBQ3RCLE9BQU8sT0FBTyxLQUFLLFVBQVUsYUFBYSxLQUFLLE1BQU0sS0FBSyxJQUFJO0FBQUE7QUFFbEU7QUFDQSxTQUFTLFVBQVUsQ0FBQyxrQkFBa0I7QUFBQSxFQUNwQyxPQUFPLENBQUMsR0FBRyxNQUFNO0FBQUEsSUFDZixRQUFRLE1BQU0sV0FBVyx1QkFBdUIsR0FBRyxDQUFDO0FBQUEsSUFDcEQsT0FBTyxJQUFJLDBCQUNULE1BQ0EsUUFDQSxnQkFDRjtBQUFBO0FBQUE7OztBQzFDSixNQUFNLGlDQUFpQyxvQkFBb0I7QUFBQSxVQUNqRCxjQUFjO0FBQUEsRUFDdEIsV0FBVyxDQUFDLE1BQU0sVUFBVSxZQUFZO0FBQUEsSUFDdEMsTUFBTSxNQUFNLFVBQVUsVUFBVTtBQUFBLElBQ2hDLEtBQUssT0FBTyxnQkFBZ0I7QUFBQTtBQUFBLEVBRTlCLFVBQVUsQ0FBQyxRQUFRO0FBQUEsSUFDakIsSUFBSSxRQUFRLGVBQWU7QUFBQSxNQUN6QixLQUFLLE9BQU8sZ0JBQWdCO0FBQUEsSUFDOUI7QUFBQSxJQUNBLEtBQUssT0FBTyxhQUFhO0FBQUEsSUFDekIsT0FBTyxNQUFNLFdBQVc7QUFBQTtBQUU1QjtBQUFBO0FBQ0EsTUFBTSwwQkFBMEIsYUFBYTtBQUFBLFVBQ25DLGNBQWM7QUFBQSxFQUN0QixnQkFBZ0IsS0FBSyxPQUFPO0FBQUEsRUFDNUIsVUFBVSxHQUFHO0FBQUEsSUFDWCxPQUFPO0FBQUE7QUFFWDtBQUFBO0FBQ0EsTUFBTSw2QkFBNkIseUJBQXlCO0FBQUEsVUFDbEQsY0FBYztBQUFBLEVBQ3RCLFdBQVcsQ0FBQyxNQUFNO0FBQUEsSUFDaEIsTUFBTSxNQUFNLFVBQVUsZUFBZTtBQUFBO0FBQUEsRUFFdkMsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLE9BQU8sSUFBSSxjQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSxzQkFBc0Isa0JBQWtCO0FBQUEsVUFDcEMsY0FBYztBQUN4QjtBQUFBO0FBQ0EsTUFBTSwrQkFBK0IseUJBQXlCO0FBQUEsVUFDcEQsY0FBYztBQUFBLEVBQ3RCLFdBQVcsQ0FBQyxNQUFNLE1BQU07QUFBQSxJQUN0QixNQUFNLE1BQU0sUUFBUSxpQkFBaUI7QUFBQSxJQUNyQyxLQUFLLE9BQU8sT0FBTztBQUFBO0FBQUEsRUFPckIsVUFBVSxHQUFHO0FBQUEsSUFDWCxPQUFPLEtBQUssUUFBUSwrREFBK0Q7QUFBQTtBQUFBLEVBRXJGLEtBQUssQ0FBQyxPQUFPO0FBQUEsSUFDWCxPQUFPLElBQUksZ0JBQ1QsT0FDQSxLQUFLLE1BQ1A7QUFBQTtBQUVKO0FBQUE7QUFDQSxNQUFNLHdCQUF3QixrQkFBa0I7QUFBQSxVQUN0QyxjQUFjO0FBQUEsRUFDdEIsT0FBTyxLQUFLLE9BQU87QUFBQSxFQUNuQixrQkFBa0IsQ0FBQyxPQUFPO0FBQUEsSUFDeEIsSUFBSSxLQUFLLE9BQU8sU0FBUyxhQUFhO0FBQUEsTUFDcEMsT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFHO0FBQUEsSUFDN0I7QUFBQSxJQUNBLE9BQU8sSUFBSSxLQUFLLEtBQUs7QUFBQTtBQUFBLEVBRXZCLGdCQUFnQixDQUFDLE9BQU87QUFBQSxJQUN0QixNQUFNLE9BQU8sTUFBTSxRQUFRO0FBQUEsSUFDM0IsSUFBSSxLQUFLLE9BQU8sU0FBUyxhQUFhO0FBQUEsTUFDcEMsT0FBTyxLQUFLLE1BQU0sT0FBTyxJQUFHO0FBQUEsSUFDOUI7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUVYO0FBQUE7QUFDQSxNQUFNLDZCQUE2Qix5QkFBeUI7QUFBQSxVQUNsRCxjQUFjO0FBQUEsRUFDdEIsV0FBVyxDQUFDLE1BQU0sTUFBTTtBQUFBLElBQ3RCLE1BQU0sTUFBTSxXQUFXLGVBQWU7QUFBQSxJQUN0QyxLQUFLLE9BQU8sT0FBTztBQUFBO0FBQUEsRUFFckIsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLE9BQU8sSUFBSSxjQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSxzQkFBc0Isa0JBQWtCO0FBQUEsVUFDcEMsY0FBYztBQUFBLEVBQ3RCLE9BQU8sS0FBSyxPQUFPO0FBQUEsRUFDbkIsa0JBQWtCLENBQUMsT0FBTztBQUFBLElBQ3hCLE9BQU8sT0FBTyxLQUFLLE1BQU07QUFBQTtBQUFBLEVBRTNCLGdCQUFnQixDQUFDLE9BQU87QUFBQSxJQUN0QixPQUFPLFFBQVEsSUFBSTtBQUFBO0FBRXZCO0FBQ0EsU0FBUyxPQUFPLENBQUMsR0FBRyxHQUFHO0FBQUEsRUFDckIsUUFBUSxNQUFNLFdBQVcsdUJBQXVCLEdBQUcsQ0FBQztBQUFBLEVBQ3BELElBQUksUUFBUSxTQUFTLGVBQWUsUUFBUSxTQUFTLGdCQUFnQjtBQUFBLElBQ25FLE9BQU8sSUFBSSx1QkFBdUIsTUFBTSxPQUFPLElBQUk7QUFBQSxFQUNyRDtBQUFBLEVBQ0EsSUFBSSxRQUFRLFNBQVMsV0FBVztBQUFBLElBQzlCLE9BQU8sSUFBSSxxQkFBcUIsTUFBTSxPQUFPLElBQUk7QUFBQSxFQUNuRDtBQUFBLEVBQ0EsT0FBTyxJQUFJLHFCQUFxQixJQUFJO0FBQUE7OztBQzFHdEMsTUFBTSw2QkFBNkIsb0JBQW9CO0FBQUEsVUFDN0MsY0FBYztBQUFBLEVBQ3RCLFdBQVcsQ0FBQyxNQUFNO0FBQUEsSUFDaEIsTUFBTSxNQUFNLFVBQVUsZUFBZTtBQUFBO0FBQUEsRUFHdkMsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLE9BQU8sSUFBSSxjQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSxzQkFBc0IsYUFBYTtBQUFBLFVBQy9CLGNBQWM7QUFBQSxFQUN0QixrQkFBa0IsQ0FBQyxPQUFPO0FBQUEsSUFDeEIsSUFBSSxPQUFPLFVBQVU7QUFBQSxNQUFVLE9BQU87QUFBQSxJQUN0QyxPQUFPLE9BQU8sS0FBSztBQUFBO0FBQUEsRUFFckIsVUFBVSxHQUFHO0FBQUEsSUFDWCxPQUFPO0FBQUE7QUFFWDtBQUFBO0FBQ0EsTUFBTSxtQ0FBbUMsb0JBQW9CO0FBQUEsVUFDbkQsY0FBYztBQUFBLEVBQ3RCLFdBQVcsQ0FBQyxNQUFNO0FBQUEsSUFDaEIsTUFBTSxNQUFNLFVBQVUscUJBQXFCO0FBQUE7QUFBQSxFQUc3QyxLQUFLLENBQUMsT0FBTztBQUFBLElBQ1gsT0FBTyxJQUFJLG9CQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSw0QkFBNEIsYUFBYTtBQUFBLFVBQ3JDLGNBQWM7QUFBQSxFQUN0QixrQkFBa0IsQ0FBQyxPQUFPO0FBQUEsSUFDeEIsSUFBSSxPQUFPLFVBQVU7QUFBQSxNQUFVLE9BQU87QUFBQSxJQUN0QyxPQUFPLE9BQU8sS0FBSztBQUFBO0FBQUEsRUFFckIsbUJBQW1CO0FBQUEsRUFDbkIsVUFBVSxHQUFHO0FBQUEsSUFDWCxPQUFPO0FBQUE7QUFFWDtBQUFBO0FBQ0EsTUFBTSxtQ0FBbUMsb0JBQW9CO0FBQUEsVUFDbkQsY0FBYztBQUFBLEVBQ3RCLFdBQVcsQ0FBQyxNQUFNO0FBQUEsSUFDaEIsTUFBTSxNQUFNLFVBQVUscUJBQXFCO0FBQUE7QUFBQSxFQUc3QyxLQUFLLENBQUMsT0FBTztBQUFBLElBQ1gsT0FBTyxJQUFJLG9CQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSw0QkFBNEIsYUFBYTtBQUFBLFVBQ3JDLGNBQWM7QUFBQSxFQUN0QixxQkFBcUI7QUFBQSxFQUNyQixtQkFBbUI7QUFBQSxFQUNuQixVQUFVLEdBQUc7QUFBQSxJQUNYLE9BQU87QUFBQTtBQUVYO0FBQ0EsU0FBUyxPQUFPLENBQUMsR0FBRyxHQUFHO0FBQUEsRUFDckIsUUFBUSxNQUFNLFdBQVcsdUJBQXVCLEdBQUcsQ0FBQztBQUFBLEVBQ3BELE1BQU0sT0FBTyxRQUFRO0FBQUEsRUFDckIsT0FBTyxTQUFTLFdBQVcsSUFBSSwyQkFBMkIsSUFBSSxJQUFJLFNBQVMsV0FBVyxJQUFJLDJCQUEyQixJQUFJLElBQUksSUFBSSxxQkFBcUIsSUFBSTtBQUFBOzs7QUN4RTVKLE1BQU0sMEJBQTBCLG9CQUFvQjtBQUFBLFVBQzFDLGNBQWM7QUFBQSxFQUN0QixXQUFXLENBQUMsTUFBTTtBQUFBLElBQ2hCLE1BQU0sTUFBTSxVQUFVLFlBQVk7QUFBQTtBQUFBLEVBR3BDLEtBQUssQ0FBQyxPQUFPO0FBQUEsSUFDWCxPQUFPLElBQUksV0FBVyxPQUFPLEtBQUssTUFBTTtBQUFBO0FBRTVDO0FBQUE7QUFDQSxNQUFNLG1CQUFtQixhQUFhO0FBQUEsVUFDNUIsY0FBYztBQUFBLEVBQ3RCLFVBQVUsR0FBRztBQUFBLElBQ1gsT0FBTztBQUFBO0FBRVg7QUFDQSxTQUFTLElBQUksQ0FBQyxNQUFNO0FBQUEsRUFDbEIsT0FBTyxJQUFJLGtCQUFrQixRQUFRLEVBQUU7QUFBQTs7O0FDaEJ6QyxNQUFNLDBCQUEwQixvQkFBb0I7QUFBQSxVQUMxQyxjQUFjO0FBQUEsRUFDdEIsV0FBVyxDQUFDLE1BQU0sUUFBUTtBQUFBLElBQ3hCLE1BQU0sTUFBTSxVQUFVLFlBQVk7QUFBQSxJQUNsQyxLQUFLLE9BQU8sYUFBYSxPQUFPO0FBQUEsSUFDaEMsS0FBSyxPQUFPLFNBQVMsT0FBTztBQUFBO0FBQUEsRUFHOUIsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLE9BQU8sSUFBSSxXQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSxtQkFBbUIsYUFBYTtBQUFBLFVBQzVCLGNBQWM7QUFBQSxFQUN0QixhQUFhLEtBQUssT0FBTztBQUFBLEVBQ3pCLFNBQVMsS0FBSyxPQUFPO0FBQUEsRUFDckIsV0FBVyxDQUFDLE9BQU8sUUFBUTtBQUFBLElBQ3pCLE1BQU0sT0FBTyxNQUFNO0FBQUE7QUFBQSxFQUVyQixVQUFVLEdBQUc7QUFBQSxJQUNYLE9BQU8sT0FBTyxLQUFLLE9BQU8sU0FBUyxJQUFJLEtBQUssT0FBTyxZQUFZO0FBQUE7QUFFbkU7QUFBQTtBQUNBLE1BQU0sOEJBQThCLG9CQUFvQjtBQUFBLFVBQzlDLGNBQWM7QUFBQSxFQUN0QixXQUFXLENBQUMsTUFBTTtBQUFBLElBQ2hCLE1BQU0sTUFBTSxRQUFRLGdCQUFnQjtBQUFBO0FBQUEsRUFHdEMsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLE9BQU8sSUFBSSxlQUNULE9BQ0EsS0FBSyxNQUNQO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSx1QkFBdUIsYUFBYTtBQUFBLFVBQ2hDLGNBQWM7QUFBQSxFQUN0QixVQUFVLEdBQUc7QUFBQSxJQUNYLE9BQU87QUFBQTtBQUFBLEVBRVQsa0JBQWtCLENBQUMsT0FBTztBQUFBLElBQ3hCLE9BQU8sS0FBSyxNQUFNLEtBQUs7QUFBQTtBQUFBLEVBRXpCLGdCQUFnQixDQUFDLE9BQU87QUFBQSxJQUN0QixPQUFPLEtBQUssVUFBVSxLQUFLO0FBQUE7QUFFL0I7QUFDQSxTQUFTLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHO0FBQUEsRUFDdkIsUUFBUSxNQUFNLFdBQVcsdUJBQXVCLEdBQUcsQ0FBQztBQUFBLEVBQ3BELElBQUksT0FBTyxTQUFTLFFBQVE7QUFBQSxJQUMxQixPQUFPLElBQUksc0JBQXNCLElBQUk7QUFBQSxFQUN2QztBQUFBLEVBQ0EsT0FBTyxJQUFJLGtCQUFrQixNQUFNLE1BQU07QUFBQTs7O0FDckQzQyxNQUFNLHNCQUFzQjtBQUFBLFVBQ2xCLGNBQWM7QUFBQSxFQUN0QjtBQUFBLEVBQ0EsV0FBVyxDQUFDLFFBQVE7QUFBQSxJQUNsQixLQUFLLFNBQVMsS0FBSyxPQUFPO0FBQUE7QUFBQSxFQUU1QixHQUFHLENBQUMsVUFBVSxNQUFNO0FBQUEsSUFDbEIsSUFBSSxTQUFTLEtBQUs7QUFBQSxNQUNoQixPQUFPO0FBQUEsV0FDRixTQUFTO0FBQUEsUUFDWixnQkFBZ0IsSUFBSSxNQUNsQixTQUFTLEVBQUUsZ0JBQ1gsSUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxJQUFJLFNBQVMsZ0JBQWdCO0FBQUEsTUFDM0IsT0FBTztBQUFBLFdBQ0YsU0FBUztBQUFBLFFBQ1osZ0JBQWdCLElBQUksTUFDbEIsU0FBUyxnQkFBZ0IsZ0JBQ3pCLElBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsSUFBSSxPQUFPLFNBQVMsVUFBVTtBQUFBLE1BQzVCLE9BQU8sU0FBUztBQUFBLElBQ2xCO0FBQUEsSUFDQSxNQUFNLFVBQVUsR0FBRyxVQUFVLFFBQVEsSUFBSSxTQUFTLEVBQUUsaUJBQWlCLEdBQUcsVUFBVSxJQUFJLElBQUksU0FBUyxnQkFBZ0IsaUJBQWlCO0FBQUEsSUFDcEksTUFBTSxRQUFRLFFBQVE7QUFBQSxJQUN0QixJQUFJLEdBQUcsT0FBTyxJQUFJLE9BQU8sR0FBRztBQUFBLE1BQzFCLElBQUksS0FBSyxPQUFPLHVCQUF1QixVQUFVLE1BQU0sa0JBQWtCO0FBQUEsUUFDdkUsT0FBTyxNQUFNO0FBQUEsTUFDZjtBQUFBLE1BQ0EsTUFBTSxXQUFXLE1BQU0sTUFBTTtBQUFBLE1BQzdCLFNBQVMsbUJBQW1CO0FBQUEsTUFDNUIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLElBQUksR0FBRyxPQUFPLEdBQUcsR0FBRztBQUFBLE1BQ2xCLElBQUksS0FBSyxPQUFPLGdCQUFnQixPQUFPO0FBQUEsUUFDckMsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUNBLE1BQU0sSUFBSSxNQUNSLDJCQUEyQiw2SkFDN0I7QUFBQSxJQUNGO0FBQUEsSUFDQSxJQUFJLEdBQUcsT0FBTyxNQUFNLEdBQUc7QUFBQSxNQUNyQixJQUFJLEtBQUssT0FBTyxPQUFPO0FBQUEsUUFDckIsT0FBTyxJQUFJLE1BQ1QsT0FDQSxJQUFJLHdCQUNGLElBQUksTUFDRixNQUFNLE9BQ04sSUFBSSx1QkFBdUIsS0FBSyxPQUFPLE9BQU8sS0FBSyxPQUFPLHVCQUF1QixLQUFLLENBQ3hGLENBQ0YsQ0FDRjtBQUFBLE1BQ0Y7QUFBQSxNQUNBLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFJLE9BQU8sVUFBVSxZQUFZLFVBQVUsTUFBTTtBQUFBLE1BQy9DLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxPQUFPLElBQUksTUFBTSxPQUFPLElBQUksc0JBQXNCLEtBQUssTUFBTSxDQUFDO0FBQUE7QUFFbEU7OztBQ3RFQSxNQUFNLGFBQWE7QUFBQSxVQUNULGNBQWM7QUFBQSxHQUNyQixPQUFPLGVBQWU7QUFBQSxFQUN2QixLQUFLLENBQUMsWUFBWTtBQUFBLElBQ2hCLE9BQU8sS0FBSyxLQUFVLFdBQUcsVUFBVTtBQUFBO0FBQUEsRUFFckMsT0FBTyxDQUFDLFdBQVc7QUFBQSxJQUNqQixPQUFPLEtBQUssS0FDVixDQUFDLFVBQVU7QUFBQSxNQUNULFlBQVk7QUFBQSxNQUNaLE9BQU87QUFBQSxPQUVULENBQUMsV0FBVztBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osTUFBTTtBQUFBLEtBRVY7QUFBQTtBQUFBLEVBRUYsSUFBSSxDQUFDLGFBQWEsWUFBWTtBQUFBLElBQzVCLE9BQU8sS0FBSyxRQUFRLEVBQUUsS0FBSyxhQUFhLFVBQVU7QUFBQTtBQUV0RDs7O0FDaEJBLFNBQVMsdUJBQXVCLEdBQUc7QUFBQSxFQUNqQyxPQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUFBOzs7QUNYRixJQUFNLG9CQUFvQixPQUFPLElBQUksaUNBQWlDO0FBQUE7QUFDdEUsTUFBTSxvQkFBb0IsTUFBTTtBQUFBLFVBQ3RCLGNBQWM7QUFBQSxTQUVmLFNBQVMsT0FBTyxPQUFPLENBQUMsR0FBRyxNQUFNLFFBQVE7QUFBQSxJQUM5QztBQUFBLEVBQ0YsQ0FBQztBQUFBLEdBRUEsTUFBTSxPQUFPO0FBQUEsR0FFYixxQkFBcUIsQ0FBQztBQUFBLEdBRXRCLE1BQU0sT0FBTyxzQkFBMkI7QUFDM0M7QUFDQSxTQUFTLGVBQWUsQ0FBQyxNQUFNLFNBQVMsYUFBYSxRQUFRLFdBQVcsTUFBTTtBQUFBLEVBQzVFLE1BQU0sV0FBVyxJQUFJLFlBQVksTUFBTSxRQUFRLFFBQVE7QUFBQSxFQUN2RCxNQUFNLGdCQUFnQixPQUFPLFlBQVksYUFBYSxRQUFRLHdCQUF3QixDQUFDLElBQUk7QUFBQSxFQUMzRixNQUFNLGVBQWUsT0FBTyxZQUMxQixPQUFPLFFBQVEsYUFBYSxFQUFFLElBQUksRUFBRSxPQUFPLG9CQUFvQjtBQUFBLElBQzdELE1BQU0sYUFBYTtBQUFBLElBQ25CLFdBQVcsUUFBUSxLQUFLO0FBQUEsSUFDeEIsTUFBTSxTQUFTLFdBQVcsTUFBTSxRQUFRO0FBQUEsSUFDeEMsU0FBUyxtQkFBbUIsS0FBSyxHQUFHLFdBQVcsaUJBQWlCLFFBQVEsUUFBUSxDQUFDO0FBQUEsSUFDakYsT0FBTyxDQUFDLE9BQU8sTUFBTTtBQUFBLEdBQ3RCLENBQ0g7QUFBQSxFQUNBLE1BQU0sUUFBUSxPQUFPLE9BQU8sVUFBVSxZQUFZO0FBQUEsRUFDbEQsTUFBTSxNQUFNLE9BQU8sV0FBVztBQUFBLEVBQzlCLE1BQU0sTUFBTSxPQUFPLHNCQUFzQjtBQUFBLEVBQ3pDLElBQUksYUFBYTtBQUFBLElBQ2YsTUFBTSxZQUFZLE9BQU8sc0JBQXNCO0FBQUEsRUFDakQ7QUFBQSxFQUNBLE9BQU87QUFBQTtBQUVULElBQU0sY0FBYyxDQUFDLE1BQU0sU0FBUyxnQkFBZ0I7QUFBQSxFQUNsRCxPQUFPLGdCQUFnQixNQUFNLFNBQVMsV0FBVztBQUFBOzs7QUNyQ25ELE1BQU0sZUFBZTtBQUFBLEVBQ25CLFdBQVcsQ0FBQyxNQUFNLFFBQVE7QUFBQSxJQUN4QixLQUFLLE9BQU87QUFBQSxJQUNaLEtBQUssU0FBUztBQUFBO0FBQUEsVUFFUixjQUFjO0FBQUEsRUFDdEIsRUFBRSxJQUFJLFNBQVM7QUFBQSxJQUNiLE9BQU8sSUFBSSxhQUFhLEtBQUssTUFBTSxTQUFTLEtBQUssTUFBTTtBQUFBO0FBRTNEO0FBQUE7QUFDQSxNQUFNLGFBQWE7QUFBQSxVQUNULGNBQWM7QUFBQSxFQUV0QjtBQUFBLEVBQ0EsV0FBVyxDQUFDLE1BQU0sU0FBUyxRQUFRO0FBQUEsSUFDakMsS0FBSyxTQUFTO0FBQUEsTUFDWjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQSxPQUFZO0FBQUEsSUFDZDtBQUFBO0FBQUEsRUFLRixLQUFLLENBQUMsV0FBVztBQUFBLElBQ2YsS0FBSyxPQUFPLFFBQVE7QUFBQSxJQUNwQixPQUFPO0FBQUE7QUFBQSxFQUdULEtBQUssQ0FBQyxPQUFPO0FBQUEsSUFDWCxPQUFPLElBQUksTUFBTSxLQUFLLFFBQVEsS0FBSztBQUFBO0FBRXZDO0FBQUE7QUFDQSxNQUFNLE1BQU07QUFBQSxVQUNGLGNBQWM7QUFBQSxFQUN0QjtBQUFBLEVBQ0EsV0FBVyxDQUFDLFFBQVEsT0FBTztBQUFBLElBQ3pCLEtBQUssU0FBUyxLQUFLLFFBQVEsTUFBTTtBQUFBO0FBRXJDO0FBQ0EsU0FBUyxLQUFLLENBQUMsTUFBTTtBQUFBLEVBQ25CLE9BQU8sSUFBSSxlQUFlLE1BQU0sS0FBSztBQUFBOzs7QUNJdkMsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFPO0FBQUEsRUFDL0IsSUFBSSxHQUFHLE9BQU8sV0FBVyxHQUFHO0FBQUEsSUFDMUIsT0FBTyxDQUFDLEdBQUcsTUFBTSxNQUFNLE9BQU8sV0FBVztBQUFBLEVBQzNDO0FBQUEsRUFDQSxJQUFJLEdBQUcsT0FBTyxRQUFRLEdBQUc7QUFBQSxJQUN2QixPQUFPLE1BQU0sRUFBRSxjQUFjLENBQUM7QUFBQSxFQUNoQztBQUFBLEVBQ0EsSUFBSSxHQUFHLE9BQU8sR0FBRyxHQUFHO0FBQUEsSUFDbEIsT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUFBLEVBQzlCO0FBQUEsRUFDQSxPQUFPLENBQUM7QUFBQTs7O0FDbERWLE1BQU0seUJBQXlCLGFBQWE7QUFBQSxFQUMxQyxXQUFXLENBQUMsT0FBTyxTQUFTLFNBQVMsVUFBVTtBQUFBLElBQzdDLE1BQU07QUFBQSxJQUNOLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssU0FBUyxFQUFFLE9BQU8sU0FBUztBQUFBO0FBQUEsVUFFMUIsY0FBYztBQUFBLEVBRXRCO0FBQUEsRUE4QkEsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLEtBQUssT0FBTyxRQUFRO0FBQUEsSUFDcEIsT0FBTztBQUFBO0FBQUEsRUFFVCxPQUFPLElBQUksU0FBUztBQUFBLElBQ2xCLElBQUksT0FBTyxRQUFRLE9BQU8sWUFBWTtBQUFBLE1BQ3BDLE1BQU0sVUFBVSxRQUFRLEdBQ3RCLElBQUksTUFDRixLQUFLLE9BQU8sTUFBTSxNQUFNLE9BQU8sVUFDL0IsSUFBSSxzQkFBc0IsRUFBRSxvQkFBb0IsU0FBUyxhQUFhLE1BQU0sQ0FBQyxDQUMvRSxDQUNGO0FBQUEsTUFDQSxNQUFNLGVBQWUsTUFBTSxRQUFRLE9BQU8sSUFBSSxVQUFVLENBQUMsT0FBTztBQUFBLE1BQ2hFLEtBQUssT0FBTyxVQUFVO0FBQUEsSUFDeEIsRUFBTztBQUFBLE1BQ0wsTUFBTSxlQUFlO0FBQUEsTUFDckIsS0FBSyxPQUFPLFVBQVU7QUFBQTtBQUFBLElBRXhCLE9BQU87QUFBQTtBQUFBLEVBRVQsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLEtBQUssT0FBTyxRQUFRO0FBQUEsSUFDcEIsT0FBTztBQUFBO0FBQUEsRUFFVCxTQUFTLENBQUMsU0FBUyxLQUFLLE1BQU0sWUFBWSxPQUFPLFVBQVU7QUFBQSxJQUN6RCxLQUFLLE9BQU8sWUFBWSxvQkFBb0IsTUFBTTtBQUFBLElBQ2xELE9BQU87QUFBQTtBQUFBLEVBR1QsTUFBTSxHQUFHO0FBQUEsSUFDUCxPQUFPLEtBQUssUUFBUSxpQkFBaUIsS0FBSyxNQUFNO0FBQUE7QUFBQSxFQUVsRCxLQUFLLEdBQUc7QUFBQSxJQUNOLFFBQVEsU0FBUyxhQUFhLFNBQVMsS0FBSyxRQUFRLFdBQVcsS0FBSyxPQUFPLENBQUM7QUFBQSxJQUM1RSxPQUFPO0FBQUE7QUFBQSxFQUdULFFBQVEsQ0FBQyxpQkFBaUIsTUFBTTtBQUFBLElBQzlCLE9BQU8sS0FBSyxRQUFRLGlCQUFpQix3QkFBd0IsZ0JBQzNELEtBQUssUUFBUSxXQUFXLEtBQUssT0FBTyxDQUFDLEdBQ3JDLEtBQUssT0FBTyxXQUNaLEtBQUssT0FBTyxZQUFZLFFBQVEsT0FDaEMsTUFDSyxXQUNMO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixRQUFRLGlCQUFpQixLQUFLLE9BQU8sS0FBSztBQUFBLElBQzVDLENBQ0Y7QUFBQTtBQUFBLEVBRUYsT0FBTyxHQUFHO0FBQUEsSUFDUixPQUFPLEtBQUssU0FBUyxLQUFLO0FBQUE7QUFBQSxFQUU1QixNQUFNLENBQUMsc0JBQXNCO0FBQUEsSUFDM0IsT0FBTyxLQUFLLFNBQVMsRUFBRSxJQUFJLGlCQUFpQjtBQUFBO0FBQUEsRUFFOUMsTUFBTSxDQUFDLHNCQUFzQjtBQUFBLElBQzNCLE9BQU8sS0FBSyxTQUFTLEVBQUUsSUFBSSxpQkFBaUI7QUFBQTtBQUFBLEVBRTlDLE1BQU0sQ0FBQyxzQkFBc0I7QUFBQSxJQUMzQixPQUFPLEtBQUssU0FBUyxFQUFFLElBQUksaUJBQWlCO0FBQUE7QUFBQSxFQUU5QyxTQUFTLENBQUMsc0JBQXNCO0FBQUEsSUFDOUIsT0FBTyxLQUFLLFNBQVMsRUFBRSxPQUFPLGlCQUFpQjtBQUFBO0FBQUEsT0FFM0MsUUFBTyxDQUFDLG1CQUFtQjtBQUFBLElBQy9CLE9BQU8sS0FBSyxTQUFTLEVBQUUsUUFBUSxpQkFBaUI7QUFBQTtBQUFBLEVBRWxELFFBQVEsR0FBRztBQUFBLElBQ1QsT0FBTztBQUFBO0FBRVg7OztBQ3BIQSxTQUFTLFdBQVcsQ0FBQyxPQUFPO0FBQUEsRUFDMUIsTUFBTSxRQUFRLE1BQU0sUUFBUSxjQUFjLEVBQUUsRUFBRSxNQUFNLHlDQUF5QyxLQUFLLENBQUM7QUFBQSxFQUNuRyxPQUFPLE1BQU0sSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZLENBQUMsRUFBRSxLQUFLLEdBQUc7QUFBQTtBQUV6RCxTQUFTLFdBQVcsQ0FBQyxPQUFPO0FBQUEsRUFDMUIsTUFBTSxRQUFRLE1BQU0sUUFBUSxjQUFjLEVBQUUsRUFBRSxNQUFNLHlDQUF5QyxLQUFLLENBQUM7QUFBQSxFQUNuRyxPQUFPLE1BQU0sT0FBTyxDQUFDLEtBQUssTUFBTSxNQUFNO0FBQUEsSUFDcEMsTUFBTSxnQkFBZ0IsTUFBTSxJQUFJLEtBQUssWUFBWSxJQUFJLEdBQUcsS0FBSyxHQUFHLFlBQVksSUFBSSxLQUFLLE1BQU0sQ0FBQztBQUFBLElBQzVGLE9BQU8sTUFBTTtBQUFBLEtBQ1osRUFBRTtBQUFBO0FBRVAsU0FBUyxRQUFRLENBQUMsT0FBTztBQUFBLEVBQ3ZCLE9BQU87QUFBQTtBQUFBO0FBRVQsTUFBTSxZQUFZO0FBQUEsVUFDUixjQUFjO0FBQUEsRUFFdEIsUUFBUSxDQUFDO0FBQUEsRUFDVCxlQUFlLENBQUM7QUFBQSxFQUNoQjtBQUFBLEVBQ0EsV0FBVyxDQUFDLFFBQVE7QUFBQSxJQUNsQixLQUFLLFVBQVUsV0FBVyxlQUFlLGNBQWMsV0FBVyxjQUFjLGNBQWM7QUFBQTtBQUFBLEVBRWhHLGVBQWUsQ0FBQyxRQUFRO0FBQUEsSUFDdEIsS0FBSyxPQUFPO0FBQUEsTUFBVyxPQUFPLE9BQU87QUFBQSxJQUNyQyxNQUFNLFNBQVMsT0FBTyxNQUFNLE1BQU0sT0FBTyxXQUFXO0FBQUEsSUFDcEQsTUFBTSxZQUFZLE9BQU8sTUFBTSxNQUFNLE9BQU87QUFBQSxJQUM1QyxNQUFNLE1BQU0sR0FBRyxVQUFVLGFBQWEsT0FBTztBQUFBLElBQzdDLEtBQUssS0FBSyxNQUFNLE1BQU07QUFBQSxNQUNwQixLQUFLLFdBQVcsT0FBTyxLQUFLO0FBQUEsSUFDOUI7QUFBQSxJQUNBLE9BQU8sS0FBSyxNQUFNO0FBQUE7QUFBQSxFQUVwQixVQUFVLENBQUMsT0FBTztBQUFBLElBQ2hCLE1BQU0sU0FBUyxNQUFNLE1BQU0sT0FBTyxXQUFXO0FBQUEsSUFDN0MsTUFBTSxZQUFZLE1BQU0sTUFBTSxPQUFPO0FBQUEsSUFDckMsTUFBTSxXQUFXLEdBQUcsVUFBVTtBQUFBLElBQzlCLEtBQUssS0FBSyxhQUFhLFdBQVc7QUFBQSxNQUNoQyxXQUFXLFVBQVUsT0FBTyxPQUFPLE1BQU0sTUFBTSxPQUFPLFFBQVEsR0FBRztBQUFBLFFBQy9ELE1BQU0sWUFBWSxHQUFHLFlBQVksT0FBTztBQUFBLFFBQ3hDLEtBQUssTUFBTSxhQUFhLEtBQUssUUFBUSxPQUFPLElBQUk7QUFBQSxNQUNsRDtBQUFBLE1BQ0EsS0FBSyxhQUFhLFlBQVk7QUFBQSxJQUNoQztBQUFBO0FBQUEsRUFFRixVQUFVLEdBQUc7QUFBQSxJQUNYLEtBQUssUUFBUSxDQUFDO0FBQUEsSUFDZCxLQUFLLGVBQWUsQ0FBQztBQUFBO0FBRXpCOzs7QUNsREEsTUFBTSxxQkFBcUIsTUFBTTtBQUFBLFVBQ3ZCLGNBQWM7QUFBQSxFQUN0QixXQUFXLEdBQUcsU0FBUyxTQUFTO0FBQUEsSUFDOUIsTUFBTSxPQUFPO0FBQUEsSUFDYixLQUFLLE9BQU87QUFBQSxJQUNaLEtBQUssUUFBUTtBQUFBO0FBRWpCO0FBQUE7QUFDQSxNQUFNLDBCQUEwQixNQUFNO0FBQUEsRUFDcEMsV0FBVyxDQUFDLE9BQU8sUUFBUSxPQUFPO0FBQUEsSUFDaEMsTUFBTSxpQkFBaUI7QUFBQSxVQUNqQixRQUFRO0FBQUEsSUFDZCxLQUFLLFFBQVE7QUFBQSxJQUNiLEtBQUssU0FBUztBQUFBLElBQ2QsS0FBSyxRQUFRO0FBQUEsSUFDYixNQUFNLGtCQUFrQixNQUFNLGlCQUFpQjtBQUFBLElBQy9DLElBQUk7QUFBQSxNQUFPLEtBQUssUUFBUTtBQUFBO0FBRTVCO0FBQUE7QUFDQSxNQUFNLGlDQUFpQyxhQUFhO0FBQUEsVUFDMUMsY0FBYztBQUFBLEVBQ3RCLFdBQVcsR0FBRztBQUFBLElBQ1osTUFBTSxFQUFFLFNBQVMsV0FBVyxDQUFDO0FBQUE7QUFFakM7OztBQ3RCQSxJQUFNLHFCQUFvQixPQUFPLElBQUksNkJBQTZCO0FBQ2xFLElBQU0sWUFBWSxPQUFPLElBQUksbUJBQW1CO0FBQUE7QUFDaEQsTUFBTSxnQkFBZ0IsTUFBTTtBQUFBLFVBQ2xCLGNBQWM7QUFBQSxTQUVmLFNBQVMsT0FBTyxPQUFPLENBQUMsR0FBRyxNQUFNLFFBQVE7QUFBQSxJQUM5QztBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFBQSxHQUVBLHNCQUFxQixDQUFDO0FBQUEsR0FFdEIsYUFBYTtBQUFBLEdBRWIsTUFBTSxPQUFPLHNCQUEyQjtBQUFBLEdBRXhDLE1BQU0sT0FBTyxzQkFBc0IsQ0FBQztBQUN2Qzs7O0FDWkEsTUFBTSxrQkFBa0I7QUFBQSxVQUNkLGNBQWM7QUFBQSxFQUV0QjtBQUFBLEVBRUE7QUFBQSxFQUNBLFdBQVcsQ0FBQyxTQUFTLE1BQU07QUFBQSxJQUN6QixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssT0FBTztBQUFBO0FBQUEsRUFHZCxLQUFLLENBQUMsT0FBTztBQUFBLElBQ1gsT0FBTyxJQUFJLFdBQVcsT0FBTyxLQUFLLFNBQVMsS0FBSyxJQUFJO0FBQUE7QUFFeEQ7QUFBQTtBQUNBLE1BQU0sV0FBVztBQUFBLEVBQ2YsV0FBVyxDQUFDLE9BQU8sU0FBUyxNQUFNO0FBQUEsSUFDaEMsS0FBSyxRQUFRO0FBQUEsSUFDYixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssT0FBTztBQUFBO0FBQUEsVUFFTixjQUFjO0FBQUEsRUFDdEI7QUFBQSxFQUNBO0FBQUEsRUFDQSxPQUFPLEdBQUc7QUFBQSxJQUNSLE9BQU8sS0FBSyxRQUFRLEdBQUcsS0FBSyxNQUFNLFFBQVEsT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLENBQUMsV0FBVyxPQUFPLElBQUksRUFBRSxLQUFLLEdBQUc7QUFBQTtBQUVoSDs7O0FDdEJBLFNBQVMsV0FBVyxDQUFDLE9BQU8sUUFBUTtBQUFBLEVBQ2xDLElBQUkscUJBQXFCLE1BQU0sTUFBTSxhQUFhLEtBQUssTUFBTSxHQUFHLE9BQU8sS0FBSyxNQUFNLEdBQUcsT0FBTyxXQUFXLE1BQU0sR0FBRyxPQUFPLE1BQU0sTUFBTSxHQUFHLE9BQU8sS0FBSyxNQUFNLEdBQUcsT0FBTyxJQUFJLEdBQUc7QUFBQSxJQUN2SyxPQUFPLElBQUksTUFBTSxPQUFPLE1BQU07QUFBQSxFQUNoQztBQUFBLEVBQ0EsT0FBTztBQUFBO0FBRVQsSUFBTSxLQUFLLENBQUMsTUFBTSxVQUFVO0FBQUEsRUFDMUIsT0FBTyxNQUFNLFVBQVUsWUFBWSxPQUFPLElBQUk7QUFBQTtBQUVoRCxJQUFNLEtBQUssQ0FBQyxNQUFNLFVBQVU7QUFBQSxFQUMxQixPQUFPLE1BQU0sV0FBVyxZQUFZLE9BQU8sSUFBSTtBQUFBO0FBRWpELFNBQVMsR0FBRyxJQUFJLHNCQUFzQjtBQUFBLEVBQ3BDLE1BQU0sYUFBYSxxQkFBcUIsT0FDdEMsQ0FBQyxNQUFNLE1BQVcsU0FDcEI7QUFBQSxFQUNBLElBQUksV0FBVyxXQUFXLEdBQUc7QUFBQSxJQUMzQjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLElBQUksV0FBVyxXQUFXLEdBQUc7QUFBQSxJQUMzQixPQUFPLElBQUksSUFBSSxVQUFVO0FBQUEsRUFDM0I7QUFBQSxFQUNBLE9BQU8sSUFBSSxJQUFJO0FBQUEsSUFDYixJQUFJLFlBQVksR0FBRztBQUFBLElBQ25CLElBQUksS0FBSyxZQUFZLElBQUksWUFBWSxPQUFPLENBQUM7QUFBQSxJQUM3QyxJQUFJLFlBQVksR0FBRztBQUFBLEVBQ3JCLENBQUM7QUFBQTtBQUVILFNBQVMsRUFBRSxJQUFJLHNCQUFzQjtBQUFBLEVBQ25DLE1BQU0sYUFBYSxxQkFBcUIsT0FDdEMsQ0FBQyxNQUFNLE1BQVcsU0FDcEI7QUFBQSxFQUNBLElBQUksV0FBVyxXQUFXLEdBQUc7QUFBQSxJQUMzQjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLElBQUksV0FBVyxXQUFXLEdBQUc7QUFBQSxJQUMzQixPQUFPLElBQUksSUFBSSxVQUFVO0FBQUEsRUFDM0I7QUFBQSxFQUNBLE9BQU8sSUFBSSxJQUFJO0FBQUEsSUFDYixJQUFJLFlBQVksR0FBRztBQUFBLElBQ25CLElBQUksS0FBSyxZQUFZLElBQUksWUFBWSxNQUFNLENBQUM7QUFBQSxJQUM1QyxJQUFJLFlBQVksR0FBRztBQUFBLEVBQ3JCLENBQUM7QUFBQTtBQUVILFNBQVMsR0FBRyxDQUFDLFdBQVc7QUFBQSxFQUN0QixPQUFPLFVBQVU7QUFBQTtBQUVuQixJQUFNLEtBQUssQ0FBQyxNQUFNLFVBQVU7QUFBQSxFQUMxQixPQUFPLE1BQU0sVUFBVSxZQUFZLE9BQU8sSUFBSTtBQUFBO0FBRWhELElBQU0sTUFBTSxDQUFDLE1BQU0sVUFBVTtBQUFBLEVBQzNCLE9BQU8sTUFBTSxXQUFXLFlBQVksT0FBTyxJQUFJO0FBQUE7QUFFakQsSUFBTSxLQUFLLENBQUMsTUFBTSxVQUFVO0FBQUEsRUFDMUIsT0FBTyxNQUFNLFVBQVUsWUFBWSxPQUFPLElBQUk7QUFBQTtBQUVoRCxJQUFNLE1BQU0sQ0FBQyxNQUFNLFVBQVU7QUFBQSxFQUMzQixPQUFPLE1BQU0sV0FBVyxZQUFZLE9BQU8sSUFBSTtBQUFBO0FBRWpELFNBQVMsT0FBTyxDQUFDLFFBQVEsUUFBUTtBQUFBLEVBQy9CLElBQUksTUFBTSxRQUFRLE1BQU0sR0FBRztBQUFBLElBQ3pCLElBQUksT0FBTyxXQUFXLEdBQUc7QUFBQSxNQUN2QixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsT0FBTyxNQUFNLGFBQWEsT0FBTyxJQUFJLENBQUMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDO0FBQUEsRUFDcEU7QUFBQSxFQUNBLE9BQU8sTUFBTSxhQUFhLFlBQVksUUFBUSxNQUFNO0FBQUE7QUFFdEQsU0FBUyxVQUFVLENBQUMsUUFBUSxRQUFRO0FBQUEsRUFDbEMsSUFBSSxNQUFNLFFBQVEsTUFBTSxHQUFHO0FBQUEsSUFDekIsSUFBSSxPQUFPLFdBQVcsR0FBRztBQUFBLE1BQ3ZCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxPQUFPLE1BQU0saUJBQWlCLE9BQU8sSUFBSSxDQUFDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQztBQUFBLEVBQ3hFO0FBQUEsRUFDQSxPQUFPLE1BQU0saUJBQWlCLFlBQVksUUFBUSxNQUFNO0FBQUE7QUFFMUQsU0FBUyxNQUFNLENBQUMsT0FBTztBQUFBLEVBQ3JCLE9BQU8sTUFBTTtBQUFBO0FBRWYsU0FBUyxTQUFTLENBQUMsT0FBTztBQUFBLEVBQ3hCLE9BQU8sTUFBTTtBQUFBO0FBRWYsU0FBUyxNQUFNLENBQUMsVUFBVTtBQUFBLEVBQ3hCLE9BQU8sYUFBYTtBQUFBO0FBRXRCLFNBQVMsU0FBUyxDQUFDLFVBQVU7QUFBQSxFQUMzQixPQUFPLGlCQUFpQjtBQUFBO0FBRTFCLFNBQVMsT0FBTyxDQUFDLFFBQVEsS0FBSyxLQUFLO0FBQUEsRUFDakMsT0FBTyxNQUFNLGtCQUFrQixZQUFZLEtBQUssTUFBTSxTQUFTLFlBQzdELEtBQ0EsTUFDRjtBQUFBO0FBRUYsU0FBUyxVQUFVLENBQUMsUUFBUSxLQUFLLEtBQUs7QUFBQSxFQUNwQyxPQUFPLE1BQU0sc0JBQXNCLFlBQ2pDLEtBQ0EsTUFDRixTQUFTLFlBQVksS0FBSyxNQUFNO0FBQUE7QUFFbEMsU0FBUyxJQUFJLENBQUMsUUFBUSxPQUFPO0FBQUEsRUFDM0IsT0FBTyxNQUFNLGVBQWU7QUFBQTtBQUU5QixTQUFTLE9BQU8sQ0FBQyxRQUFRLE9BQU87QUFBQSxFQUM5QixPQUFPLE1BQU0sbUJBQW1CO0FBQUE7QUFFbEMsU0FBUyxLQUFLLENBQUMsUUFBUSxPQUFPO0FBQUEsRUFDNUIsT0FBTyxNQUFNLGdCQUFnQjtBQUFBO0FBRS9CLFNBQVMsUUFBUSxDQUFDLFFBQVEsT0FBTztBQUFBLEVBQy9CLE9BQU8sTUFBTSxvQkFBb0I7QUFBQTs7O0FDM0huQyxTQUFTLEdBQUcsQ0FBQyxRQUFRO0FBQUEsRUFDbkIsT0FBTyxNQUFNO0FBQUE7QUFFZixTQUFTLElBQUksQ0FBQyxRQUFRO0FBQUEsRUFDcEIsT0FBTyxNQUFNO0FBQUE7OztBQ3lCZixNQUFNLFNBQVM7QUFBQSxFQUNiLFdBQVcsQ0FBQyxhQUFhLGlCQUFpQixjQUFjO0FBQUEsSUFDdEQsS0FBSyxjQUFjO0FBQUEsSUFDbkIsS0FBSyxrQkFBa0I7QUFBQSxJQUN2QixLQUFLLGVBQWU7QUFBQSxJQUNwQixLQUFLLHNCQUFzQixnQkFBZ0IsTUFBTSxPQUFPO0FBQUE7QUFBQSxVQUVsRCxjQUFjO0FBQUEsRUFDdEI7QUFBQSxFQUNBO0FBQ0Y7QUFBQTtBQUNBLE1BQU0sVUFBVTtBQUFBLEVBQ2QsV0FBVyxDQUFDLE9BQU8sUUFBUTtBQUFBLElBQ3pCLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxTQUFTO0FBQUE7QUFBQSxVQUVSLGNBQWM7QUFDeEI7QUFBQTtBQUNBLE1BQU0sWUFBWSxTQUFTO0FBQUEsRUFDekIsV0FBVyxDQUFDLGFBQWEsaUJBQWlCLFFBQVEsWUFBWTtBQUFBLElBQzVELE1BQU0sYUFBYSxpQkFBaUIsUUFBUSxZQUFZO0FBQUEsSUFDeEQsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLGFBQWE7QUFBQTtBQUFBLFVBRVosY0FBYztBQUFBLEVBQ3RCLGFBQWEsQ0FBQyxXQUFXO0FBQUEsSUFDdkIsTUFBTSxXQUFXLElBQUksSUFDbkIsS0FBSyxhQUNMLEtBQUssaUJBQ0wsS0FBSyxRQUNMLEtBQUssVUFDUDtBQUFBLElBQ0EsU0FBUyxZQUFZO0FBQUEsSUFDckIsT0FBTztBQUFBO0FBRVg7QUFBQTtBQUNBLE1BQU0sYUFBYSxTQUFTO0FBQUEsRUFDMUIsV0FBVyxDQUFDLGFBQWEsaUJBQWlCLFFBQVE7QUFBQSxJQUNoRCxNQUFNLGFBQWEsaUJBQWlCLFFBQVEsWUFBWTtBQUFBLElBQ3hELEtBQUssU0FBUztBQUFBO0FBQUEsVUFFUixjQUFjO0FBQUEsRUFDdEIsYUFBYSxDQUFDLFdBQVc7QUFBQSxJQUN2QixNQUFNLFdBQVcsSUFBSSxLQUNuQixLQUFLLGFBQ0wsS0FBSyxpQkFDTCxLQUFLLE1BQ1A7QUFBQSxJQUNBLFNBQVMsWUFBWTtBQUFBLElBQ3JCLE9BQU87QUFBQTtBQUVYO0FBQ0EsU0FBUyxZQUFZLEdBQUc7QUFBQSxFQUN0QixPQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFBQTtBQUVGLFNBQVMsbUJBQW1CLEdBQUc7QUFBQSxFQUM3QixPQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUFBO0FBRUYsU0FBUyw2QkFBNkIsQ0FBQyxRQUFRLGVBQWU7QUFBQSxFQUM1RCxJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUUsV0FBVyxLQUFLLGFBQWEsV0FBVyxHQUFHLE9BQU8sWUFBWSxLQUFLLEdBQUc7QUFBQSxJQUM1RixTQUFTLE9BQU87QUFBQSxFQUNsQjtBQUFBLEVBQ0EsTUFBTSxnQkFBZ0IsQ0FBQztBQUFBLEVBQ3ZCLE1BQU0sa0JBQWtCLENBQUM7QUFBQSxFQUN6QixNQUFNLGVBQWUsQ0FBQztBQUFBLEVBQ3RCLFlBQVksS0FBSyxVQUFVLE9BQU8sUUFBUSxNQUFNLEdBQUc7QUFBQSxJQUNqRCxJQUFJLEdBQUcsT0FBTyxLQUFLLEdBQUc7QUFBQSxNQUNwQixNQUFNLFNBQVMsbUJBQW1CLEtBQUs7QUFBQSxNQUN2QyxNQUFNLG9CQUFvQixnQkFBZ0I7QUFBQSxNQUMxQyxjQUFjLFVBQVU7QUFBQSxNQUN4QixhQUFhLE9BQU87QUFBQSxRQUNsQixRQUFRO0FBQUEsUUFDUixRQUFRLE1BQU0sTUFBTSxPQUFPO0FBQUEsUUFDM0IsUUFBUSxNQUFNLE1BQU0sT0FBTztBQUFBLFFBQzNCLFNBQVMsTUFBTSxNQUFNLE9BQU87QUFBQSxRQUM1QixXQUFXLG1CQUFtQixhQUFhLENBQUM7QUFBQSxRQUM1QyxZQUFZLG1CQUFtQixjQUFjLENBQUM7QUFBQSxNQUNoRDtBQUFBLE1BQ0EsV0FBVyxVQUFVLE9BQU8sT0FDMUIsTUFBTSxNQUFNLE9BQU8sUUFDckIsR0FBRztBQUFBLFFBQ0QsSUFBSSxPQUFPLFNBQVM7QUFBQSxVQUNsQixhQUFhLEtBQUssV0FBVyxLQUFLLE1BQU07QUFBQSxRQUMxQztBQUFBLE1BQ0Y7QUFBQSxNQUNBLE1BQU0sY0FBYyxNQUFNLE1BQU0sT0FBTyxzQkFBc0IsTUFBTSxNQUFNLE9BQU8sbUJBQW1CO0FBQUEsTUFDbkcsSUFBSSxhQUFhO0FBQUEsUUFDZixXQUFXLGVBQWUsT0FBTyxPQUFPLFdBQVcsR0FBRztBQUFBLFVBQ3BELElBQUksR0FBRyxhQUFhLGlCQUFpQixHQUFHO0FBQUEsWUFDdEMsYUFBYSxLQUFLLFdBQVcsS0FBSyxHQUFHLFlBQVksT0FBTztBQUFBLFVBQzFEO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGLEVBQU8sU0FBSSxHQUFHLE9BQU8sU0FBUyxHQUFHO0FBQUEsTUFDL0IsTUFBTSxTQUFTLG1CQUFtQixNQUFNLEtBQUs7QUFBQSxNQUM3QyxNQUFNLFlBQVksY0FBYztBQUFBLE1BQ2hDLE1BQU0sYUFBYSxNQUFNLE9BQ3ZCLGNBQWMsTUFBTSxLQUFLLENBQzNCO0FBQUEsTUFDQSxJQUFJO0FBQUEsTUFDSixZQUFZLGNBQWMsYUFBYSxPQUFPLFFBQVEsVUFBVSxHQUFHO0FBQUEsUUFDakUsSUFBSSxXQUFXO0FBQUEsVUFDYixNQUFNLGNBQWMsYUFBYTtBQUFBLFVBQ2pDLFlBQVksVUFBVSxnQkFBZ0I7QUFBQSxVQUN0QyxJQUFJLFlBQVk7QUFBQSxZQUNkLFlBQVksV0FBVyxLQUFLLEdBQUcsVUFBVTtBQUFBLFVBQzNDO0FBQUEsUUFDRixFQUFPO0FBQUEsVUFDTCxNQUFNLFVBQVUsa0JBQWtCO0FBQUEsWUFDaEMsZ0JBQWdCLFVBQVU7QUFBQSxjQUN4QixXQUFXLENBQUM7QUFBQSxjQUNaO0FBQUEsWUFDRjtBQUFBLFVBQ0Y7QUFBQSxVQUNBLGdCQUFnQixRQUFRLFVBQVUsZ0JBQWdCO0FBQUE7QUFBQSxNQUV0RDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFDQSxPQUFPLEVBQUUsUUFBUSxjQUFjLGNBQWM7QUFBQTtBQUUvQyxTQUFTLFNBQVMsQ0FBQyxPQUFPLFlBQVk7QUFBQSxFQUNwQyxPQUFPLElBQUksVUFDVCxPQUNBLENBQUMsWUFBWSxPQUFPLFlBQ2xCLE9BQU8sUUFBUSxXQUFXLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLFdBQVc7QUFBQSxJQUN4RDtBQUFBLElBQ0EsTUFBTSxjQUFjLEdBQUc7QUFBQSxFQUN6QixDQUFDLENBQ0gsQ0FDRjtBQUFBO0FBRUYsU0FBUyxTQUFTLENBQUMsYUFBYTtBQUFBLEVBQzlCLE9BQU8sU0FBUyxHQUFHLENBQUMsT0FBTyxRQUFRO0FBQUEsSUFDakMsT0FBTyxJQUFJLElBQ1QsYUFDQSxPQUNBLFFBQ0EsUUFBUSxPQUFPLE9BQU8sQ0FBQyxLQUFLLE1BQU0sT0FBTyxFQUFFLFNBQVMsSUFBSSxLQUFLLEtBQy9EO0FBQUE7QUFBQTtBQUdKLFNBQVMsVUFBVSxDQUFDLGFBQWE7QUFBQSxFQUMvQixPQUFPLFNBQVMsSUFBSSxDQUFDLGlCQUFpQixRQUFRO0FBQUEsSUFDNUMsT0FBTyxJQUFJLEtBQUssYUFBYSxpQkFBaUIsTUFBTTtBQUFBO0FBQUE7QUFHeEQsU0FBUyxpQkFBaUIsQ0FBQyxRQUFRLGVBQWUsVUFBVTtBQUFBLEVBQzFELElBQUksR0FBRyxVQUFVLEdBQUcsS0FBSyxTQUFTLFFBQVE7QUFBQSxJQUN4QyxPQUFPO0FBQUEsTUFDTCxRQUFRLFNBQVMsT0FBTztBQUFBLE1BQ3hCLFlBQVksU0FBUyxPQUFPO0FBQUEsSUFDOUI7QUFBQSxFQUNGO0FBQUEsRUFDQSxNQUFNLHdCQUF3QixjQUFjLG1CQUFtQixTQUFTLGVBQWU7QUFBQSxFQUN2RixLQUFLLHVCQUF1QjtBQUFBLElBQzFCLE1BQU0sSUFBSSxNQUNSLFVBQVUsU0FBUyxnQkFBZ0IsTUFBTSxPQUFPLDRCQUNsRDtBQUFBLEVBQ0Y7QUFBQSxFQUNBLE1BQU0sd0JBQXdCLE9BQU87QUFBQSxFQUNyQyxLQUFLLHVCQUF1QjtBQUFBLElBQzFCLE1BQU0sSUFBSSxNQUFNLFVBQVUsNENBQTRDO0FBQUEsRUFDeEU7QUFBQSxFQUNBLE1BQU0sY0FBYyxTQUFTO0FBQUEsRUFDN0IsTUFBTSxvQkFBb0IsY0FBYyxtQkFBbUIsV0FBVztBQUFBLEVBQ3RFLEtBQUssbUJBQW1CO0FBQUEsSUFDdEIsTUFBTSxJQUFJLE1BQ1IsVUFBVSxZQUFZLE1BQU0sT0FBTyw0QkFDckM7QUFBQSxFQUNGO0FBQUEsRUFDQSxNQUFNLG1CQUFtQixDQUFDO0FBQUEsRUFDMUIsV0FBVywyQkFBMkIsT0FBTyxPQUMzQyxzQkFBc0IsU0FDeEIsR0FBRztBQUFBLElBQ0QsSUFBSSxTQUFTLGdCQUFnQixhQUFhLDJCQUEyQix3QkFBd0IsaUJBQWlCLFNBQVMsaUJBQWlCLFNBQVMsZ0JBQWdCLHdCQUF3QixvQkFBb0IsU0FBUyxhQUFhO0FBQUEsTUFDak8saUJBQWlCLEtBQUssdUJBQXVCO0FBQUEsSUFDL0M7QUFBQSxFQUNGO0FBQUEsRUFDQSxJQUFJLGlCQUFpQixTQUFTLEdBQUc7QUFBQSxJQUMvQixNQUFNLFNBQVMsZUFBZSxJQUFJLE1BQ2hDLDJDQUEyQyxTQUFTLDJCQUEyQix3QkFDakYsSUFBSSxJQUFJLE1BQ04seUNBQXlDLCtCQUErQixTQUFTLFlBQVksTUFBTSxPQUFPLHNDQUM1RztBQUFBLEVBQ0Y7QUFBQSxFQUNBLElBQUksaUJBQWlCLE1BQU0sR0FBRyxpQkFBaUIsSUFBSSxHQUFHLEtBQUssaUJBQWlCLEdBQUcsUUFBUTtBQUFBLElBQ3JGLE9BQU87QUFBQSxNQUNMLFFBQVEsaUJBQWlCLEdBQUcsT0FBTztBQUFBLE1BQ25DLFlBQVksaUJBQWlCLEdBQUcsT0FBTztBQUFBLElBQ3pDO0FBQUEsRUFDRjtBQUFBLEVBQ0EsTUFBTSxJQUFJLE1BQ1Isc0RBQXNELHFCQUFxQixTQUFTLFlBQ3RGO0FBQUE7QUFFRixTQUFTLDJCQUEyQixDQUFDLGFBQWE7QUFBQSxFQUNoRCxPQUFPO0FBQUEsSUFDTCxLQUFLLFVBQVUsV0FBVztBQUFBLElBQzFCLE1BQU0sV0FBVyxXQUFXO0FBQUEsRUFDOUI7QUFBQTtBQUVGLFNBQVMsZ0JBQWdCLENBQUMsY0FBYyxhQUFhLEtBQUssMkJBQTJCLGlCQUFpQixDQUFDLFVBQVUsT0FBTztBQUFBLEVBQ3RILE1BQU0sU0FBUyxDQUFDO0FBQUEsRUFDaEI7QUFBQSxJQUNFO0FBQUEsSUFDQTtBQUFBLE9BQ0csMEJBQTBCLFFBQVEsR0FBRztBQUFBLElBQ3hDLElBQUksY0FBYyxRQUFRO0FBQUEsTUFDeEIsTUFBTSxXQUFXLFlBQVksVUFBVSxjQUFjO0FBQUEsTUFDckQsTUFBTSxhQUFhLElBQUk7QUFBQSxNQUN2QixNQUFNLFVBQVUsT0FBTyxlQUFlLFdBQVcsS0FBSyxNQUFNLFVBQVUsSUFBSTtBQUFBLE1BQzFFLE9BQU8sY0FBYyxTQUFTLEdBQUcsVUFBVSxHQUFHLElBQUksV0FBVyxpQkFDM0QsY0FDQSxhQUFhLGNBQWMscUJBQzNCLFNBQ0EsY0FBYyxXQUNkLGNBQ0YsSUFBSSxRQUFRLElBQ1YsQ0FBQyxXQUFXLGlCQUNWLGNBQ0EsYUFBYSxjQUFjLHFCQUMzQixRQUNBLGNBQWMsV0FDZCxjQUNGLENBQ0Y7QUFBQSxJQUNGLEVBQU87QUFBQSxNQUNMLE1BQU0sUUFBUSxlQUFlLElBQUksbUJBQW1CO0FBQUEsTUFDcEQsTUFBTSxRQUFRLGNBQWM7QUFBQSxNQUM1QixJQUFJO0FBQUEsTUFDSixJQUFJLEdBQUcsT0FBTyxNQUFNLEdBQUc7QUFBQSxRQUNyQixVQUFVO0FBQUEsTUFDWixFQUFPLFNBQUksR0FBRyxPQUFPLEdBQUcsR0FBRztBQUFBLFFBQ3pCLFVBQVUsTUFBTTtBQUFBLE1BQ2xCLEVBQU87QUFBQSxRQUNMLFVBQVUsTUFBTSxJQUFJO0FBQUE7QUFBQSxNQUV0QixPQUFPLGNBQWMsU0FBUyxVQUFVLE9BQU8sT0FBTyxRQUFRLG1CQUFtQixLQUFLO0FBQUE7QUFBQSxFQUUxRjtBQUFBLEVBQ0EsT0FBTztBQUFBOzs7QUN4U1QsTUFBTSx1QkFBdUIsS0FBSztBQUFBLFVBQ3hCLGNBQWM7QUFDeEI7OztBQ2lCQSxNQUFNLGNBQWM7QUFBQSxVQUNWLGNBQWM7QUFBQSxFQUV0QjtBQUFBLEVBQ0EsV0FBVyxDQUFDLFFBQVE7QUFBQSxJQUNsQixLQUFLLFNBQVMsSUFBSSxZQUFZLFFBQVEsTUFBTTtBQUFBO0FBQUEsRUFFOUMsVUFBVSxDQUFDLE1BQU07QUFBQSxJQUNmLE9BQU8sSUFBSTtBQUFBO0FBQUEsRUFFYixXQUFXLENBQUMsTUFBTTtBQUFBLElBQ2hCLE9BQU87QUFBQTtBQUFBLEVBRVQsWUFBWSxDQUFDLEtBQUs7QUFBQSxJQUNoQixPQUFPLElBQUksSUFBSSxRQUFRLE1BQU0sSUFBSTtBQUFBO0FBQUEsRUFFbkMsWUFBWSxDQUFDLFNBQVM7QUFBQSxJQUNwQixLQUFLLFNBQVM7QUFBQSxNQUFRO0FBQUEsSUFDdEIsTUFBTSxnQkFBZ0IsQ0FBQyxVQUFVO0FBQUEsSUFDakMsWUFBWSxHQUFHLE1BQU0sUUFBUSxRQUFRLEdBQUc7QUFBQSxNQUN0QyxjQUFjLEtBQUssTUFBTSxJQUFJLFdBQVcsRUFBRSxFQUFFLEtBQUssU0FBUyxFQUFFLEVBQUUsTUFBTTtBQUFBLE1BQ3BFLElBQUksSUFBSSxRQUFRLFNBQVMsR0FBRztBQUFBLFFBQzFCLGNBQWMsS0FBSyxPQUFPO0FBQUEsTUFDNUI7QUFBQSxJQUNGO0FBQUEsSUFDQSxjQUFjLEtBQUssTUFBTTtBQUFBLElBQ3pCLE9BQU8sSUFBSSxLQUFLLGFBQWE7QUFBQTtBQUFBLEVBRS9CLGdCQUFnQixHQUFHLE9BQU8sT0FBTyxXQUFXLFVBQVUsT0FBTyxXQUFXO0FBQUEsSUFDdEUsTUFBTSxVQUFVLEtBQUssYUFBYSxRQUFRO0FBQUEsSUFDMUMsTUFBTSxlQUFlLFlBQVksaUJBQWlCLEtBQUssZUFBZSxXQUFXLEVBQUUsZUFBZSxLQUFLLENBQUMsTUFBVztBQUFBLElBQ25ILE1BQU0sV0FBVyxRQUFRLGFBQWEsVUFBZTtBQUFBLElBQ3JELE1BQU0sYUFBYSxLQUFLLGFBQWEsT0FBTztBQUFBLElBQzVDLE1BQU0sV0FBVyxLQUFLLFdBQVcsS0FBSztBQUFBLElBQ3RDLE9BQU8sTUFBTSxzQkFBc0IsUUFBUSxXQUFXLGVBQWUsYUFBYTtBQUFBO0FBQUEsRUFFcEYsY0FBYyxDQUFDLE9BQU8sS0FBSztBQUFBLElBQ3pCLE1BQU0sZUFBZSxNQUFNLE1BQU0sT0FBTztBQUFBLElBQ3hDLE1BQU0sY0FBYyxPQUFPLEtBQUssWUFBWSxFQUFFLE9BQzVDLENBQUMsWUFBWSxJQUFJLGFBQWtCLGFBQUssYUFBYSxVQUFVLGVBQW9CLFNBQ3JGO0FBQUEsSUFDQSxNQUFNLFVBQVUsWUFBWTtBQUFBLElBQzVCLE9BQU8sSUFBSSxLQUFLLFlBQVksUUFBUSxDQUFDLFNBQVMsTUFBTTtBQUFBLE1BQ2xELE1BQU0sTUFBTSxhQUFhO0FBQUEsTUFDekIsTUFBTSxRQUFRLElBQUksWUFBWSxJQUFJLE1BQU0sSUFBSSxXQUFXLEdBQUcsR0FBRztBQUFBLE1BQzdELE1BQU0sTUFBTSxNQUFNLElBQUksV0FBVyxLQUFLLE9BQU8sZ0JBQWdCLEdBQUcsQ0FBQyxPQUFPO0FBQUEsTUFDeEUsSUFBSSxJQUFJLFVBQVUsR0FBRztBQUFBLFFBQ25CLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUM7QUFBQSxNQUM1QjtBQUFBLE1BQ0EsT0FBTyxDQUFDLEdBQUc7QUFBQSxLQUNaLENBQUM7QUFBQTtBQUFBLEVBRUosZ0JBQWdCLEdBQUcsT0FBTyxLQUFLLE9BQU8sV0FBVyxVQUFVLE9BQU8sTUFBTSxPQUFPLFdBQVc7QUFBQSxJQUN4RixNQUFNLFVBQVUsS0FBSyxhQUFhLFFBQVE7QUFBQSxJQUMxQyxNQUFNLFNBQVMsS0FBSyxlQUFlLE9BQU8sR0FBRztBQUFBLElBQzdDLE1BQU0sVUFBVSxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxRQUFRLEdBQUcsS0FBSyxlQUFlLElBQUksQ0FBQyxDQUFDO0FBQUEsSUFDL0UsTUFBTSxXQUFXLEtBQUssV0FBVyxLQUFLO0FBQUEsSUFDdEMsTUFBTSxlQUFlLFlBQVksaUJBQWlCLEtBQUssZUFBZSxXQUFXLEVBQUUsZUFBZSxLQUFLLENBQUMsTUFBVztBQUFBLElBQ25ILE1BQU0sV0FBVyxRQUFRLGFBQWEsVUFBZTtBQUFBLElBQ3JELE1BQU0sYUFBYSxLQUFLLGFBQWEsT0FBTztBQUFBLElBQzVDLE1BQU0sV0FBVyxLQUFLLFdBQVcsS0FBSztBQUFBLElBQ3RDLE9BQU8sTUFBTSxpQkFBaUIsYUFBYSxTQUFTLFVBQVUsV0FBVyxXQUFXLGVBQWUsYUFBYTtBQUFBO0FBQUEsRUFhbEgsY0FBYyxDQUFDLFVBQVUsZ0JBQWdCLFVBQVUsQ0FBQyxHQUFHO0FBQUEsSUFDckQsTUFBTSxhQUFhLE9BQU87QUFBQSxJQUMxQixNQUFNLFNBQVMsT0FBTyxRQUFRLEdBQUcsU0FBUyxNQUFNO0FBQUEsTUFDOUMsTUFBTSxRQUFRLENBQUM7QUFBQSxNQUNmLElBQUksR0FBRyxPQUFPLElBQUksT0FBTyxLQUFLLE1BQU0sa0JBQWtCO0FBQUEsUUFDcEQsTUFBTSxLQUFLLElBQUksV0FBVyxNQUFNLFVBQVUsQ0FBQztBQUFBLE1BQzdDLEVBQU8sU0FBSSxHQUFHLE9BQU8sSUFBSSxPQUFPLEtBQUssR0FBRyxPQUFPLEdBQUcsR0FBRztBQUFBLFFBQ25ELE1BQU0sUUFBUSxHQUFHLE9BQU8sSUFBSSxPQUFPLElBQUksTUFBTSxNQUFNO0FBQUEsUUFDbkQsSUFBSSxlQUFlO0FBQUEsVUFDakIsTUFBTSxLQUNKLElBQUksSUFDRixNQUFNLFlBQVksSUFBSSxDQUFDLE1BQU07QUFBQSxZQUMzQixJQUFJLEdBQUcsR0FBRyxNQUFNLEdBQUc7QUFBQSxjQUNqQixPQUFPLElBQUksV0FBVyxLQUFLLE9BQU8sZ0JBQWdCLENBQUMsQ0FBQztBQUFBLFlBQ3REO0FBQUEsWUFDQSxPQUFPO0FBQUEsV0FDUixDQUNILENBQ0Y7QUFBQSxRQUNGLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxLQUFLO0FBQUE7QUFBQSxRQUVsQixJQUFJLEdBQUcsT0FBTyxJQUFJLE9BQU8sR0FBRztBQUFBLFVBQzFCLE1BQU0sS0FBSyxVQUFVLElBQUksV0FBVyxNQUFNLFVBQVUsR0FBRztBQUFBLFFBQ3pEO0FBQUEsTUFDRixFQUFPLFNBQUksR0FBRyxPQUFPLE1BQU0sR0FBRztBQUFBLFFBQzVCLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxPQUFPO0FBQUEsUUFDM0MsSUFBSSxNQUFNLGVBQWUsdUJBQXVCO0FBQUEsVUFDOUMsSUFBSSxlQUFlO0FBQUEsWUFDakIsTUFBTSxLQUFLLFdBQVcsSUFBSSxXQUFXLEtBQUssT0FBTyxnQkFBZ0IsS0FBSyxDQUFDLFlBQVk7QUFBQSxVQUNyRixFQUFPO0FBQUEsWUFDTCxNQUFNLEtBQ0osV0FBVyxJQUFJLFdBQVcsU0FBUyxLQUFLLElBQUksV0FBVyxLQUFLLE9BQU8sZ0JBQWdCLEtBQUssQ0FBQyxZQUMzRjtBQUFBO0FBQUEsUUFFSixFQUFPO0FBQUEsVUFDTCxJQUFJLGVBQWU7QUFBQSxZQUNqQixNQUFNLEtBQUssSUFBSSxXQUFXLEtBQUssT0FBTyxnQkFBZ0IsS0FBSyxDQUFDLENBQUM7QUFBQSxVQUMvRCxFQUFPO0FBQUEsWUFDTCxNQUFNLEtBQUssTUFBTSxJQUFJLFdBQVcsU0FBUyxLQUFLLElBQUksV0FBVyxLQUFLLE9BQU8sZ0JBQWdCLEtBQUssQ0FBQyxHQUFHO0FBQUE7QUFBQTtBQUFBLE1BR3hHO0FBQUEsTUFDQSxJQUFJLElBQUksYUFBYSxHQUFHO0FBQUEsUUFDdEIsTUFBTSxLQUFLLE9BQU87QUFBQSxNQUNwQjtBQUFBLE1BQ0EsT0FBTztBQUFBLEtBQ1I7QUFBQSxJQUNELE9BQU8sSUFBSSxLQUFLLE1BQU07QUFBQTtBQUFBLEVBRXhCLFVBQVUsQ0FBQyxPQUFPO0FBQUEsSUFDaEIsS0FBSyxTQUFTLE1BQU0sV0FBVyxHQUFHO0FBQUEsTUFDaEM7QUFBQSxJQUNGO0FBQUEsSUFDQSxNQUFNLGFBQWEsQ0FBQztBQUFBLElBQ3BCLElBQUksT0FBTztBQUFBLE1BQ1QsWUFBWSxRQUFPLGFBQWEsTUFBTSxRQUFRLEdBQUc7QUFBQSxRQUMvQyxJQUFJLFdBQVUsR0FBRztBQUFBLFVBQ2YsV0FBVyxLQUFLLE1BQU07QUFBQSxRQUN4QjtBQUFBLFFBQ0EsTUFBTSxRQUFRLFNBQVM7QUFBQSxRQUN2QixNQUFNLFFBQVEsU0FBUyxLQUFLLFVBQVUsU0FBUyxPQUFZO0FBQUEsUUFDM0QsSUFBSSxHQUFHLE9BQU8sV0FBVyxHQUFHO0FBQUEsVUFDMUIsTUFBTSxZQUFZLE1BQU0sWUFBWSxPQUFPO0FBQUEsVUFDM0MsTUFBTSxjQUFjLE1BQU0sWUFBWSxPQUFPO0FBQUEsVUFDN0MsTUFBTSxnQkFBZ0IsTUFBTSxZQUFZLE9BQU87QUFBQSxVQUMvQyxNQUFNLFFBQVEsY0FBYyxnQkFBcUIsWUFBSSxTQUFTO0FBQUEsVUFDOUQsV0FBVyxLQUNULE1BQU0sSUFBSSxJQUFJLFNBQVMsUUFBUSxVQUFVLGNBQWMsTUFBTSxJQUFJLFdBQVcsV0FBVyxPQUFZLFlBQUksSUFBSSxXQUFXLGFBQWEsSUFBSSxTQUFTLE9BQU8sSUFBSSxXQUFXLEtBQUssTUFBTSxPQUNuTDtBQUFBLFFBQ0YsRUFBTztBQUFBLFVBQ0wsV0FBVyxLQUNULE1BQU0sSUFBSSxJQUFJLFNBQVMsUUFBUSxVQUFVLFFBQVEsT0FDbkQ7QUFBQTtBQUFBLFFBRUYsSUFBSSxTQUFRLE1BQU0sU0FBUyxHQUFHO0FBQUEsVUFDNUIsV0FBVyxLQUFLLE1BQU07QUFBQSxRQUN4QjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxPQUFPLElBQUksS0FBSyxVQUFVO0FBQUE7QUFBQSxFQUU1QixVQUFVLENBQUMsT0FBTztBQUFBLElBQ2hCLE9BQU8sT0FBTyxVQUFVLFlBQVksT0FBTyxVQUFVLFlBQVksU0FBUyxJQUFJLGFBQWEsVUFBZTtBQUFBO0FBQUEsRUFFNUcsWUFBWSxDQUFDLFNBQVM7QUFBQSxJQUNwQixNQUFNLGNBQWMsQ0FBQztBQUFBLElBQ3JCLElBQUksU0FBUztBQUFBLE1BQ1gsWUFBWSxRQUFPLGlCQUFpQixRQUFRLFFBQVEsR0FBRztBQUFBLFFBQ3JELFlBQVksS0FBSyxZQUFZO0FBQUEsUUFDN0IsSUFBSSxTQUFRLFFBQVEsU0FBUyxHQUFHO0FBQUEsVUFDOUIsWUFBWSxLQUFLLE9BQU87QUFBQSxRQUMxQjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxPQUFPLFlBQVksU0FBUyxJQUFJLGdCQUFnQixJQUFJLEtBQUssV0FBVyxNQUFXO0FBQUE7QUFBQSxFQUVqRixjQUFjLENBQUMsT0FBTztBQUFBLElBQ3BCLElBQUksR0FBRyxPQUFPLEtBQUssS0FBSyxNQUFNLE1BQU0sT0FBTyxVQUFVO0FBQUEsTUFDbkQsT0FBTyxNQUFNLE1BQU0sSUFBSSxXQUFXLE1BQU0sTUFBTSxPQUFPLFdBQVcsRUFBRSxLQUFLLEdBQUcsTUFBTSxNQUFNLE9BQU8sT0FBTyxJQUFJLElBQUksV0FBVyxNQUFNLE1BQU0sT0FBTyxhQUFhLEtBQUssSUFBSSxXQUFXLE1BQU0sTUFBTSxPQUFPLEtBQUs7QUFBQSxJQUNyTTtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFFVCxnQkFBZ0I7QUFBQSxJQUNkO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsS0FDQztBQUFBLElBQ0QsTUFBTSxhQUFhLGNBQWMsb0JBQW9CLE1BQU07QUFBQSxJQUMzRCxXQUFXLEtBQUssWUFBWTtBQUFBLE1BQzFCLElBQUksR0FBRyxFQUFFLE9BQU8sTUFBTSxLQUFLLGFBQWEsRUFBRSxNQUFNLEtBQUssT0FBTyxHQUFHLE9BQU8sUUFBUSxJQUFJLE1BQU0sRUFBRSxRQUFRLEdBQUcsT0FBTyxjQUFjLElBQUksTUFBTSxnQkFBZ0IsT0FBTyxHQUFHLE9BQU8sR0FBRyxJQUFTLFlBQUksYUFBYSxLQUFLLFFBQVEsQ0FBQyxXQUFXLE9BQU8sS0FDaE8sR0FBRyxZQUFZLFdBQVcsT0FBTyxNQUFNLE9BQU8sV0FBVyxhQUFhLE1BQU0sSUFBSSxPQUFPLE1BQU0sT0FBTyxVQUN0RyxHQUFHLEVBQUUsTUFBTSxLQUFLLEdBQUc7QUFBQSxRQUNqQixNQUFNLFlBQVksYUFBYSxFQUFFLE1BQU0sS0FBSztBQUFBLFFBQzVDLE1BQU0sSUFBSSxNQUNSLFNBQVMsRUFBRSxLQUFLLEtBQUssSUFBSSxpQ0FBaUMsZUFBZSxFQUFFLE1BQU0seUJBQXlCLGlFQUM1RztBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxNQUFNLGlCQUFpQixTQUFTLE1BQU0sV0FBVztBQUFBLElBQ2pELE1BQU0sVUFBVSxLQUFLLGFBQWEsUUFBUTtBQUFBLElBQzFDLE1BQU0sY0FBYyxXQUFXLGlCQUFzQjtBQUFBLElBQ3JELE1BQU0sWUFBWSxLQUFLLGVBQWUsWUFBWSxFQUFFLGNBQWMsQ0FBQztBQUFBLElBQ25FLE1BQU0sV0FBVyxLQUFLLGVBQWUsS0FBSztBQUFBLElBQzFDLE1BQU0sV0FBVyxLQUFLLFdBQVcsS0FBSztBQUFBLElBQ3RDLE1BQU0sV0FBVyxRQUFRLGFBQWEsVUFBZTtBQUFBLElBQ3JELE1BQU0sWUFBWSxTQUFTLGNBQWMsV0FBZ0I7QUFBQSxJQUN6RCxNQUFNLGNBQWMsQ0FBQztBQUFBLElBQ3JCLElBQUksU0FBUztBQUFBLE1BQ1gsWUFBWSxRQUFPLGlCQUFpQixRQUFRLFFBQVEsR0FBRztBQUFBLFFBQ3JELFlBQVksS0FBSyxZQUFZO0FBQUEsUUFDN0IsSUFBSSxTQUFRLFFBQVEsU0FBUyxHQUFHO0FBQUEsVUFDOUIsWUFBWSxLQUFLLE9BQU87QUFBQSxRQUMxQjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxNQUFNLGFBQWEsWUFBWSxTQUFTLElBQUksZ0JBQWdCLElBQUksS0FBSyxXQUFXLE1BQVc7QUFBQSxJQUMzRixNQUFNLGFBQWEsS0FBSyxhQUFhLE9BQU87QUFBQSxJQUM1QyxNQUFNLFdBQVcsS0FBSyxXQUFXLEtBQUs7QUFBQSxJQUN0QyxNQUFNLFlBQVksU0FBUyxjQUFjLFdBQWdCO0FBQUEsSUFDekQsTUFBTSxhQUFhLE1BQU0sZ0JBQWdCLGVBQWUsa0JBQWtCLFdBQVcsV0FBVyxXQUFXLGFBQWEsWUFBWSxhQUFhLFdBQVc7QUFBQSxJQUM1SixJQUFJLGFBQWEsU0FBUyxHQUFHO0FBQUEsTUFDM0IsT0FBTyxLQUFLLG1CQUFtQixZQUFZLFlBQVk7QUFBQSxJQUN6RDtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFFVCxrQkFBa0IsQ0FBQyxZQUFZLGNBQWM7QUFBQSxJQUMzQyxPQUFPLGdCQUFnQixRQUFRO0FBQUEsSUFDL0IsS0FBSyxhQUFhO0FBQUEsTUFDaEIsTUFBTSxJQUFJLE1BQU0sa0RBQWtEO0FBQUEsSUFDcEU7QUFBQSxJQUNBLElBQUksS0FBSyxXQUFXLEdBQUc7QUFBQSxNQUNyQixPQUFPLEtBQUssdUJBQXVCLEVBQUUsWUFBWSxZQUFZLENBQUM7QUFBQSxJQUNoRTtBQUFBLElBQ0EsT0FBTyxLQUFLLG1CQUNWLEtBQUssdUJBQXVCLEVBQUUsWUFBWSxZQUFZLENBQUMsR0FDdkQsSUFDRjtBQUFBO0FBQUEsRUFFRixzQkFBc0I7QUFBQSxJQUNwQjtBQUFBLElBQ0EsZUFBZSxNQUFNLE9BQU8sYUFBYSxPQUFPLFNBQVM7QUFBQSxLQUN4RDtBQUFBLElBQ0QsTUFBTSxZQUFZLE1BQU0sV0FBVyxPQUFPO0FBQUEsSUFDMUMsTUFBTSxhQUFhLE1BQU0sWUFBWSxPQUFPO0FBQUEsSUFDNUMsSUFBSTtBQUFBLElBQ0osSUFBSSxXQUFXLFFBQVEsU0FBUyxHQUFHO0FBQUEsTUFDakMsTUFBTSxnQkFBZ0IsQ0FBQztBQUFBLE1BQ3ZCLFdBQVcsaUJBQWlCLFNBQVM7QUFBQSxRQUNuQyxJQUFJLEdBQUcsZUFBZSxZQUFZLEdBQUc7QUFBQSxVQUNuQyxjQUFjLEtBQUssSUFBSSxXQUFXLGNBQWMsSUFBSSxDQUFDO0FBQUEsUUFDdkQsRUFBTyxTQUFJLEdBQUcsZUFBZSxHQUFHLEdBQUc7QUFBQSxVQUNqQyxTQUFTLElBQUksRUFBRyxJQUFJLGNBQWMsWUFBWSxRQUFRLEtBQUs7QUFBQSxZQUN6RCxNQUFNLFFBQVEsY0FBYyxZQUFZO0FBQUEsWUFDeEMsSUFBSSxHQUFHLE9BQU8sWUFBWSxHQUFHO0FBQUEsY0FDM0IsY0FBYyxZQUFZLEtBQUssSUFBSSxXQUFXLEtBQUssT0FBTyxnQkFBZ0IsS0FBSyxDQUFDO0FBQUEsWUFDbEY7QUFBQSxVQUNGO0FBQUEsVUFDQSxjQUFjLEtBQUssTUFBTSxlQUFlO0FBQUEsUUFDMUMsRUFBTztBQUFBLFVBQ0wsY0FBYyxLQUFLLE1BQU0sZUFBZTtBQUFBO0FBQUEsTUFFNUM7QUFBQSxNQUNBLGFBQWEsZ0JBQWdCLElBQUksS0FBSyxlQUFlLE9BQU87QUFBQSxJQUM5RDtBQUFBLElBQ0EsTUFBTSxXQUFXLE9BQU8sVUFBVSxZQUFZLE9BQU8sVUFBVSxZQUFZLFNBQVMsSUFBSSxhQUFhLFVBQWU7QUFBQSxJQUNwSCxNQUFNLGdCQUFnQixJQUFJLElBQUksR0FBRyxRQUFRLFFBQVEsU0FBUyxJQUFJO0FBQUEsSUFDOUQsTUFBTSxZQUFZLFNBQVMsY0FBYyxXQUFnQjtBQUFBLElBQ3pELE9BQU8sTUFBTSxZQUFZLGdCQUFnQixhQUFhLGFBQWEsV0FBVztBQUFBO0FBQUEsRUFFaEYsZ0JBQWdCLEdBQUcsT0FBTyxRQUFRLGdCQUFnQixZQUFZLFdBQVcsVUFBVSxVQUFVO0FBQUEsSUFDM0YsTUFBTSxnQkFBZ0IsQ0FBQztBQUFBLElBQ3ZCLE1BQU0sVUFBVSxNQUFNLE1BQU0sT0FBTztBQUFBLElBQ25DLE1BQU0sYUFBYSxPQUFPLFFBQVEsT0FBTyxFQUFFLE9BQ3pDLEVBQUUsR0FBRyxVQUFVLElBQUksb0JBQW9CLENBQ3pDO0FBQUEsSUFDQSxNQUFNLGNBQWMsV0FBVyxJQUFJLElBQUksWUFBWSxJQUFJLFdBQVcsS0FBSyxPQUFPLGdCQUFnQixNQUFNLENBQUMsQ0FBQztBQUFBLElBQ3RHLElBQUksUUFBUTtBQUFBLE1BQ1YsTUFBTSxVQUFVO0FBQUEsTUFDaEIsSUFBSSxHQUFHLFNBQVMsR0FBRyxHQUFHO0FBQUEsUUFDcEIsY0FBYyxLQUFLLE9BQU87QUFBQSxNQUM1QixFQUFPO0FBQUEsUUFDTCxjQUFjLEtBQUssUUFBUSxPQUFPLENBQUM7QUFBQTtBQUFBLElBRXZDLEVBQU87QUFBQSxNQUNMLE1BQU0sU0FBUztBQUFBLE1BQ2YsY0FBYyxLQUFLLElBQUksSUFBSSxTQUFTLENBQUM7QUFBQSxNQUNyQyxZQUFZLFlBQVksVUFBVSxPQUFPLFFBQVEsR0FBRztBQUFBLFFBQ2xELE1BQU0sWUFBWSxDQUFDO0FBQUEsUUFDbkIsWUFBWSxXQUFXLFFBQVEsWUFBWTtBQUFBLFVBQ3pDLE1BQU0sV0FBVyxNQUFNO0FBQUEsVUFDdkIsSUFBSSxhQUFrQixhQUFLLEdBQUcsVUFBVSxLQUFLLEtBQUssU0FBUyxVQUFlLFdBQUc7QUFBQSxZQUMzRSxJQUFJO0FBQUEsWUFDSixJQUFJLElBQUksWUFBWSxRQUFRLElBQUksWUFBaUIsV0FBRztBQUFBLGNBQ2xELGVBQWUsR0FBRyxJQUFJLFNBQVMsR0FBRyxJQUFJLElBQUksVUFBVSxJQUFJLE1BQU0sSUFBSSxTQUFTLEdBQUc7QUFBQSxZQUNoRixFQUFPLFNBQUksSUFBSSxjQUFtQixXQUFHO0FBQUEsY0FDbkMsTUFBTSxrQkFBa0IsSUFBSSxVQUFVO0FBQUEsY0FDdEMsZUFBZSxHQUFHLGlCQUFpQixHQUFHLElBQUksa0JBQWtCLElBQUksTUFBTSxpQkFBaUIsR0FBRztBQUFBLFlBQzVGLEVBQU8sVUFBSyxJQUFJLFdBQVcsSUFBSSxlQUFvQixXQUFHO0FBQUEsY0FDcEQsTUFBTSxtQkFBbUIsSUFBSSxXQUFXO0FBQUEsY0FDeEMsZUFBZSxHQUFHLGtCQUFrQixHQUFHLElBQUksbUJBQW1CLElBQUksTUFBTSxrQkFBa0IsR0FBRztBQUFBLFlBQy9GLEVBQU87QUFBQSxjQUNMLGVBQWU7QUFBQTtBQUFBLFlBRWpCLFVBQVUsS0FBSyxZQUFZO0FBQUEsVUFDN0IsRUFBTztBQUFBLFlBQ0wsVUFBVSxLQUFLLFFBQVE7QUFBQTtBQUFBLFFBRTNCO0FBQUEsUUFDQSxjQUFjLEtBQUssU0FBUztBQUFBLFFBQzVCLElBQUksYUFBYSxPQUFPLFNBQVMsR0FBRztBQUFBLFVBQ2xDLGNBQWMsS0FBSyxPQUFPO0FBQUEsUUFDNUI7QUFBQSxNQUNGO0FBQUE7QUFBQSxJQUVGLE1BQU0sVUFBVSxLQUFLLGFBQWEsUUFBUTtBQUFBLElBQzFDLE1BQU0sWUFBWSxJQUFJLEtBQUssYUFBYTtBQUFBLElBQ3hDLE1BQU0sZUFBZSxZQUFZLGlCQUFpQixLQUFLLGVBQWUsV0FBVyxFQUFFLGVBQWUsS0FBSyxDQUFDLE1BQVc7QUFBQSxJQUNuSCxNQUFNLGdCQUFnQixZQUFZLFNBQVMsSUFBSSxLQUFLLFVBQVUsSUFBUztBQUFBLElBQ3ZFLE9BQU8sTUFBTSxzQkFBc0IsU0FBUyxlQUFlLFlBQVksZ0JBQWdCO0FBQUE7QUFBQSxFQUV6RixVQUFVLENBQUMsTUFBTSxjQUFjO0FBQUEsSUFDN0IsT0FBTyxLQUFLLFFBQVE7QUFBQSxNQUNsQixRQUFRLEtBQUs7QUFBQSxNQUNiLFlBQVksS0FBSztBQUFBLE1BQ2pCLGFBQWEsS0FBSztBQUFBLE1BQ2xCLGNBQWMsS0FBSztBQUFBLE1BQ25CO0FBQUEsSUFDRixDQUFDO0FBQUE7QUFBQSxFQUVILG9CQUFvQjtBQUFBLElBQ2xCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsYUFBYTtBQUFBLElBQ2I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEtBQ0M7QUFBQSxJQUNELElBQUksWUFBWSxDQUFDO0FBQUEsSUFDakIsSUFBSSxPQUFPLFFBQVEsVUFBVSxDQUFDLEdBQUc7QUFBQSxJQUNqQyxNQUFNLFFBQVEsQ0FBQztBQUFBLElBQ2YsSUFBSSxXQUFXLE1BQU07QUFBQSxNQUNuQixNQUFNLG1CQUFtQixPQUFPLFFBQVEsWUFBWSxPQUFPO0FBQUEsTUFDM0QsWUFBWSxpQkFBaUIsSUFBSSxFQUFFLEtBQUssWUFBWTtBQUFBLFFBQ2xELE9BQU8sTUFBTTtBQUFBLFFBQ2IsT0FBTztBQUFBLFFBQ1AsT0FBTyxtQkFBbUIsT0FBTyxVQUFVO0FBQUEsUUFDM0Msb0JBQXlCO0FBQUEsUUFDekIsUUFBUTtBQUFBLFFBQ1IsV0FBVyxDQUFDO0FBQUEsTUFDZCxFQUFFO0FBQUEsSUFDSixFQUFPO0FBQUEsTUFDTCxNQUFNLGlCQUFpQixPQUFPLFlBQzVCLE9BQU8sUUFBUSxZQUFZLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxXQUFXLENBQUMsS0FBSyxtQkFBbUIsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUN4RztBQUFBLE1BQ0EsSUFBSSxPQUFPLE9BQU87QUFBQSxRQUNoQixNQUFNLFdBQVcsT0FBTyxPQUFPLFVBQVUsYUFBYSxPQUFPLE1BQU0sZ0JBQWdCLGFBQWEsQ0FBQyxJQUFJLE9BQU87QUFBQSxRQUM1RyxRQUFRLFlBQVksdUJBQXVCLFVBQVUsVUFBVTtBQUFBLE1BQ2pFO0FBQUEsTUFDQSxNQUFNLGtCQUFrQixDQUFDO0FBQUEsTUFDekIsSUFBSSxrQkFBa0IsQ0FBQztBQUFBLE1BQ3ZCLElBQUksT0FBTyxTQUFTO0FBQUEsUUFDbEIsSUFBSSxnQkFBZ0I7QUFBQSxRQUNwQixZQUFZLE9BQU8sVUFBVSxPQUFPLFFBQVEsT0FBTyxPQUFPLEdBQUc7QUFBQSxVQUMzRCxJQUFJLFVBQWUsV0FBRztBQUFBLFlBQ3BCO0FBQUEsVUFDRjtBQUFBLFVBQ0EsSUFBSSxTQUFTLFlBQVksU0FBUztBQUFBLFlBQ2hDLEtBQUssaUJBQWlCLFVBQVUsTUFBTTtBQUFBLGNBQ3BDLGdCQUFnQjtBQUFBLFlBQ2xCO0FBQUEsWUFDQSxnQkFBZ0IsS0FBSyxLQUFLO0FBQUEsVUFDNUI7QUFBQSxRQUNGO0FBQUEsUUFDQSxJQUFJLGdCQUFnQixTQUFTLEdBQUc7QUFBQSxVQUM5QixrQkFBa0IsZ0JBQWdCLGdCQUFnQixPQUFPLENBQUMsTUFBTSxPQUFPLFVBQVUsT0FBTyxJQUFJLElBQUksT0FBTyxLQUFLLFlBQVksT0FBTyxFQUFFLE9BQU8sQ0FBQyxTQUFTLGdCQUFnQixTQUFTLEdBQUcsQ0FBQztBQUFBLFFBQ2pMO0FBQUEsTUFDRixFQUFPO0FBQUEsUUFDTCxrQkFBa0IsT0FBTyxLQUFLLFlBQVksT0FBTztBQUFBO0FBQUEsTUFFbkQsV0FBVyxTQUFTLGlCQUFpQjtBQUFBLFFBQ25DLE1BQU0sU0FBUyxZQUFZLFFBQVE7QUFBQSxRQUNuQyxnQkFBZ0IsS0FBSyxFQUFFLE9BQU8sT0FBTyxPQUFPLE9BQU8sQ0FBQztBQUFBLE1BQ3REO0FBQUEsTUFDQSxJQUFJLG9CQUFvQixDQUFDO0FBQUEsTUFDekIsSUFBSSxPQUFPLE1BQU07QUFBQSxRQUNmLG9CQUFvQixPQUFPLFFBQVEsT0FBTyxJQUFJLEVBQUUsT0FBTyxDQUFDLFlBQVksTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sa0JBQWtCLEVBQUUsT0FBTyxhQUFhLFVBQVUsWUFBWSxVQUFVLE9BQU8sRUFBRTtBQUFBLE1BQzlLO0FBQUEsTUFDQSxJQUFJO0FBQUEsTUFDSixJQUFJLE9BQU8sUUFBUTtBQUFBLFFBQ2pCLFNBQVMsT0FBTyxPQUFPLFdBQVcsYUFBYSxPQUFPLE9BQU8sZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLElBQUksT0FBTztBQUFBLFFBQy9GLFlBQVksT0FBTyxVQUFVLE9BQU8sUUFBUSxNQUFNLEdBQUc7QUFBQSxVQUNuRCxnQkFBZ0IsS0FBSztBQUFBLFlBQ25CO0FBQUEsWUFDQSxPQUFPLDhCQUE4QixPQUFPLFVBQVU7QUFBQSxVQUN4RCxDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLGFBQWEsT0FBTyxXQUFXLGlCQUFpQjtBQUFBLFFBQzlDLFVBQVUsS0FBSztBQUFBLFVBQ2IsT0FBTyxHQUFHLE9BQU8sSUFBSSxPQUFPLElBQUksTUFBTSxhQUFhLFlBQVksUUFBUSxPQUFPO0FBQUEsVUFDOUU7QUFBQSxVQUNBLE9BQU8sR0FBRyxPQUFPLE1BQU0sSUFBSSxtQkFBbUIsT0FBTyxVQUFVLElBQUk7QUFBQSxVQUNuRSxvQkFBeUI7QUFBQSxVQUN6QixRQUFRO0FBQUEsVUFDUixXQUFXLENBQUM7QUFBQSxRQUNkLENBQUM7QUFBQSxNQUNIO0FBQUEsTUFDQSxJQUFJLGNBQWMsT0FBTyxPQUFPLFlBQVksYUFBYSxPQUFPLFFBQVEsZ0JBQWdCLG9CQUFvQixDQUFDLElBQUksT0FBTyxXQUFXLENBQUM7QUFBQSxNQUNwSSxLQUFLLE1BQU0sUUFBUSxXQUFXLEdBQUc7QUFBQSxRQUMvQixjQUFjLENBQUMsV0FBVztBQUFBLE1BQzVCO0FBQUEsTUFDQSxVQUFVLFlBQVksSUFBSSxDQUFDLGlCQUFpQjtBQUFBLFFBQzFDLElBQUksR0FBRyxjQUFjLE1BQU0sR0FBRztBQUFBLFVBQzVCLE9BQU8sbUJBQW1CLGNBQWMsVUFBVTtBQUFBLFFBQ3BEO0FBQUEsUUFDQSxPQUFPLHVCQUF1QixjQUFjLFVBQVU7QUFBQSxPQUN2RDtBQUFBLE1BQ0QsUUFBUSxPQUFPO0FBQUEsTUFDZixTQUFTLE9BQU87QUFBQSxNQUNoQjtBQUFBLFFBQ0UsT0FBTztBQUFBLFFBQ1AsYUFBYTtBQUFBLFFBQ2I7QUFBQSxXQUNHLG1CQUFtQjtBQUFBLFFBQ3RCLE1BQU0scUJBQXFCLGtCQUFrQixRQUFRLGVBQWUsUUFBUTtBQUFBLFFBQzVFLE1BQU0sb0JBQW9CLG1CQUFtQixTQUFTLGVBQWU7QUFBQSxRQUNyRSxNQUFNLHNCQUFzQixjQUFjO0FBQUEsUUFDMUMsTUFBTSxxQkFBcUIsR0FBRyxjQUFjO0FBQUEsUUFDNUMsTUFBTSxVQUFVLElBQ2QsR0FBRyxtQkFBbUIsT0FBTyxJQUMzQixDQUFDLFFBQVEsTUFBTSxHQUNiLG1CQUFtQixtQkFBbUIsV0FBVyxJQUFJLGtCQUFrQixHQUN2RSxtQkFBbUIsUUFBUSxVQUFVLENBQ3ZDLENBQ0YsQ0FDRjtBQUFBLFFBQ0EsTUFBTSxnQkFBZ0IsS0FBSyxxQkFBcUI7QUFBQSxVQUM5QztBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQSxPQUFPLFdBQVc7QUFBQSxVQUNsQixhQUFhLE9BQU87QUFBQSxVQUNwQixhQUFhLEdBQUcsVUFBVSxHQUFHLElBQUksZ0NBQWdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxLQUFLLDZCQUE2QixPQUFPLEVBQUUsSUFBSTtBQUFBLFVBQ3RJLFlBQVk7QUFBQSxVQUNaLFFBQVE7QUFBQSxVQUNSLHFCQUFxQjtBQUFBLFFBQ3ZCLENBQUM7QUFBQSxRQUNELE1BQU0sUUFBUSxPQUFPLGNBQWMsT0FBTyxHQUFHLHFCQUFxQjtBQUFBLFFBQ2xFLFVBQVUsS0FBSztBQUFBLFVBQ2IsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1A7QUFBQSxVQUNBLG9CQUFvQjtBQUFBLFVBQ3BCLFFBQVE7QUFBQSxVQUNSLFdBQVcsY0FBYztBQUFBLFFBQzNCLENBQUM7QUFBQSxNQUNIO0FBQUE7QUFBQSxJQUVGLElBQUksVUFBVSxXQUFXLEdBQUc7QUFBQSxNQUMxQixNQUFNLElBQUksYUFBYTtBQUFBLFFBQ3JCLFNBQVMsaUNBQWlDLFlBQVksYUFBYTtBQUFBLE1BQ3JFLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFDQSxJQUFJO0FBQUEsSUFDSixRQUFRLElBQUksUUFBUSxLQUFLO0FBQUEsSUFDekIsSUFBSSxxQkFBcUI7QUFBQSxNQUN2QixJQUFJLFFBQVEsaUJBQWlCLElBQUksS0FDL0IsVUFBVSxJQUNSLEdBQUcsT0FBTyxhQUFhLEdBQUcsUUFBUSxZQUFZLElBQUksSUFBSSxXQUFXLEtBQUssT0FBTyxnQkFBZ0IsTUFBTSxDQUFDLElBQUksR0FBRyxRQUFRLElBQUksT0FBTyxJQUFJLE9BQU8sTUFBTSxNQUNqSixHQUNBLE9BQ0Y7QUFBQSxNQUNBLElBQUksR0FBRyxxQkFBcUIsSUFBSSxHQUFHO0FBQUEsUUFDakMsUUFBUSxnQ0FBZ0M7QUFBQSxNQUMxQztBQUFBLE1BQ0EsTUFBTSxrQkFBa0IsQ0FBQztBQUFBLFFBQ3ZCLE9BQU87QUFBQSxRQUNQLE9BQU87QUFBQSxRQUNQLE9BQU8sTUFBTSxHQUFHLE1BQU07QUFBQSxRQUN0QixRQUFRO0FBQUEsUUFDUixvQkFBb0IsWUFBWTtBQUFBLFFBQ2hDO0FBQUEsTUFDRixDQUFDO0FBQUEsTUFDRCxNQUFNLGdCQUFnQixVQUFlLGFBQUssV0FBZ0IsYUFBSyxRQUFRLFNBQVM7QUFBQSxNQUNoRixJQUFJLGVBQWU7QUFBQSxRQUNqQixTQUFTLEtBQUssaUJBQWlCO0FBQUEsVUFDN0IsT0FBTyxhQUFhLE9BQU8sVUFBVTtBQUFBLFVBQ3JDLFFBQVEsQ0FBQztBQUFBLFVBQ1QsWUFBWTtBQUFBLFlBQ1Y7QUFBQSxjQUNFLE1BQU0sQ0FBQztBQUFBLGNBQ1AsT0FBTyxJQUFJLElBQUksR0FBRztBQUFBLFlBQ3BCO0FBQUEsVUFDRjtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBLGNBQWMsQ0FBQztBQUFBLFFBQ2pCLENBQUM7QUFBQSxRQUNELFFBQWE7QUFBQSxRQUNiLFFBQWE7QUFBQSxRQUNiLFNBQWM7QUFBQSxRQUNkLFVBQWU7QUFBQSxNQUNqQixFQUFPO0FBQUEsUUFDTCxTQUFTLGFBQWEsT0FBTyxVQUFVO0FBQUE7QUFBQSxNQUV6QyxTQUFTLEtBQUssaUJBQWlCO0FBQUEsUUFDN0IsT0FBTyxHQUFHLFFBQVEsV0FBVyxJQUFJLFNBQVMsSUFBSSxTQUFTLFFBQVEsQ0FBQyxHQUFHLFVBQVU7QUFBQSxRQUM3RSxRQUFRLENBQUM7QUFBQSxRQUNULFlBQVksZ0JBQWdCLElBQUksR0FBRyxPQUFPLGNBQWM7QUFBQSxVQUN0RCxNQUFNLENBQUM7QUFBQSxVQUNQLE9BQU8sR0FBRyxRQUFRLE1BQU0sSUFBSSxtQkFBbUIsUUFBUSxVQUFVLElBQUk7QUFBQSxRQUN2RSxFQUFFO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBLGNBQWMsQ0FBQztBQUFBLE1BQ2pCLENBQUM7QUFBQSxJQUNILEVBQU87QUFBQSxNQUNMLFNBQVMsS0FBSyxpQkFBaUI7QUFBQSxRQUM3QixPQUFPLGFBQWEsT0FBTyxVQUFVO0FBQUEsUUFDckMsUUFBUSxDQUFDO0FBQUEsUUFDVCxZQUFZLFVBQVUsSUFBSSxHQUFHLGFBQWE7QUFBQSxVQUN4QyxNQUFNLENBQUM7QUFBQSxVQUNQLE9BQU8sR0FBRyxPQUFPLE1BQU0sSUFBSSxtQkFBbUIsT0FBTyxVQUFVLElBQUk7QUFBQSxRQUNyRSxFQUFFO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBLGNBQWMsQ0FBQztBQUFBLE1BQ2pCLENBQUM7QUFBQTtBQUFBLElBRUgsT0FBTztBQUFBLE1BQ0wsWUFBWSxZQUFZO0FBQUEsTUFDeEIsS0FBSztBQUFBLE1BQ0w7QUFBQSxJQUNGO0FBQUE7QUFFSjtBQUFBO0FBQ0EsTUFBTSwwQkFBMEIsY0FBYztBQUFBLFVBQ3BDLGNBQWM7QUFBQSxFQUN0QixPQUFPLENBQUMsWUFBWSxTQUFTLFFBQVE7QUFBQSxJQUNuQyxNQUFNLGtCQUFrQixXQUFnQixZQUFJLHlCQUF5QixPQUFPLFdBQVcsV0FBVyx5QkFBeUIsT0FBTyxtQkFBbUI7QUFBQSxJQUNySixNQUFNLHVCQUF1QjtBQUFBLGdDQUNELElBQUksV0FBVyxlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTTFELFFBQVEsSUFBSSxvQkFBb0I7QUFBQSxJQUNoQyxNQUFNLGVBQWUsUUFBUSxPQUMzQix1Q0FBdUMsSUFBSSxXQUFXLGVBQWUsb0NBQ3ZFO0FBQUEsSUFDQSxNQUFNLGtCQUFrQixhQUFhLE1BQVc7QUFBQSxJQUNoRCxRQUFRLElBQUksVUFBVTtBQUFBLElBQ3RCLElBQUk7QUFBQSxNQUNGLFdBQVcsYUFBYSxZQUFZO0FBQUEsUUFDbEMsS0FBSyxtQkFBbUIsT0FBTyxnQkFBZ0IsRUFBRSxJQUFJLFVBQVUsY0FBYztBQUFBLFVBQzNFLFdBQVcsUUFBUSxVQUFVLEtBQUs7QUFBQSxZQUNoQyxRQUFRLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQztBQUFBLFVBQzNCO0FBQUEsVUFDQSxRQUFRLElBQ04sa0JBQWtCLElBQUksV0FBVyxlQUFlLG1DQUFtQyxVQUFVLFNBQVMsVUFBVSxlQUNsSDtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsTUFDQSxRQUFRLElBQUksV0FBVztBQUFBLE1BQ3ZCLE9BQU8sR0FBRztBQUFBLE1BQ1YsUUFBUSxJQUFJLGFBQWE7QUFBQSxNQUN6QixNQUFNO0FBQUE7QUFBQTtBQUdaOzs7QUM5bEJBLE1BQU0sa0JBQWtCO0FBQUEsVUFDZCxjQUFjO0FBQUEsRUFFdEIsaUJBQWlCLEdBQUc7QUFBQSxJQUNsQixPQUFPLEtBQUssRUFBRTtBQUFBO0FBRWxCOzs7QUNVQSxNQUFNLG9CQUFvQjtBQUFBLFVBQ2hCLGNBQWM7QUFBQSxFQUN0QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBLFdBQVcsQ0FBQyxRQUFRO0FBQUEsSUFDbEIsS0FBSyxTQUFTLE9BQU87QUFBQSxJQUNyQixLQUFLLFVBQVUsT0FBTztBQUFBLElBQ3RCLEtBQUssVUFBVSxPQUFPO0FBQUEsSUFDdEIsS0FBSyxXQUFXLE9BQU87QUFBQSxJQUN2QixLQUFLLFdBQVcsT0FBTztBQUFBO0FBQUEsRUFFekIsSUFBSSxDQUFDLFFBQVE7QUFBQSxJQUNYLE1BQU0sb0JBQW9CLEtBQUs7QUFBQSxJQUMvQixJQUFJO0FBQUEsSUFDSixJQUFJLEtBQUssUUFBUTtBQUFBLE1BQ2YsU0FBUyxLQUFLO0FBQUEsSUFDaEIsRUFBTyxTQUFJLEdBQUcsUUFBUSxRQUFRLEdBQUc7QUFBQSxNQUMvQixTQUFTLE9BQU8sWUFDZCxPQUFPLEtBQUssT0FBTyxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FDdEU7QUFBQSxJQUNGLEVBQU8sU0FBSSxHQUFHLFFBQVEsY0FBYyxHQUFHO0FBQUEsTUFDckMsU0FBUyxPQUFPLGdCQUFnQjtBQUFBLElBQ2xDLEVBQU8sU0FBSSxHQUFHLFFBQVEsR0FBRyxHQUFHO0FBQUEsTUFDMUIsU0FBUyxDQUFDO0FBQUEsSUFDWixFQUFPO0FBQUEsTUFDTCxTQUFTLGdCQUFnQixNQUFNO0FBQUE7QUFBQSxJQUVqQyxPQUFPLElBQUksaUJBQWlCO0FBQUEsTUFDMUIsT0FBTztBQUFBLE1BQ1A7QUFBQSxNQUNBO0FBQUEsTUFDQSxTQUFTLEtBQUs7QUFBQSxNQUNkLFNBQVMsS0FBSztBQUFBLE1BQ2QsVUFBVSxLQUFLO0FBQUEsTUFDZixVQUFVLEtBQUs7QUFBQSxJQUNqQixDQUFDO0FBQUE7QUFFTDtBQUFBO0FBQ0EsTUFBTSxxQ0FBcUMsa0JBQWtCO0FBQUEsVUFDbkQsY0FBYztBQUFBLEVBQ3RCO0FBQUEsRUFFQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxjQUFtQjtBQUFBLEVBQ25CLDZCQUE2QixJQUFJO0FBQUEsRUFDakMsV0FBVyxHQUFHLE9BQU8sUUFBUSxpQkFBaUIsU0FBUyxTQUFTLFVBQVUsWUFBWTtBQUFBLElBQ3BGLE1BQU07QUFBQSxJQUNOLEtBQUssU0FBUztBQUFBLE1BQ1o7QUFBQSxNQUNBO0FBQUEsTUFDQSxRQUFRLEtBQUssT0FBTztBQUFBLE1BQ3BCO0FBQUEsTUFDQSxjQUFjLENBQUM7QUFBQSxJQUNqQjtBQUFBLElBQ0EsS0FBSyxrQkFBa0I7QUFBQSxJQUN2QixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxJQUFJO0FBQUEsTUFDUCxnQkFBZ0I7QUFBQSxNQUNoQixRQUFRLEtBQUs7QUFBQSxJQUNmO0FBQUEsSUFDQSxLQUFLLFlBQVksaUJBQWlCLEtBQUs7QUFBQSxJQUN2QyxLQUFLLHNCQUFzQixPQUFPLEtBQUssY0FBYyxXQUFXLEdBQUcsS0FBSyxZQUFZLEtBQUssSUFBSSxDQUFDO0FBQUEsSUFDOUYsV0FBVyxRQUFRLGlCQUFpQixLQUFLO0FBQUEsTUFBRyxLQUFLLFdBQVcsSUFBSSxJQUFJO0FBQUE7QUFBQSxFQUd0RSxhQUFhLEdBQUc7QUFBQSxJQUNkLE9BQU8sQ0FBQyxHQUFHLEtBQUssVUFBVTtBQUFBO0FBQUEsRUFFNUIsVUFBVSxDQUFDLFVBQVU7QUFBQSxJQUNuQixPQUFPLENBQUMsT0FBTyxPQUFPO0FBQUEsTUFDcEIsTUFBTSxnQkFBZ0IsS0FBSztBQUFBLE1BQzNCLE1BQU0sWUFBWSxpQkFBaUIsS0FBSztBQUFBLE1BQ3hDLFdBQVcsUUFBUSxpQkFBaUIsS0FBSztBQUFBLFFBQUcsS0FBSyxXQUFXLElBQUksSUFBSTtBQUFBLE1BQ3BFLElBQUksT0FBTyxjQUFjLFlBQVksS0FBSyxPQUFPLE9BQU8sS0FBSyxDQUFDLFNBQVMsS0FBSyxVQUFVLFNBQVMsR0FBRztBQUFBLFFBQ2hHLE1BQU0sSUFBSSxNQUFNLFVBQVUsMENBQTBDO0FBQUEsTUFDdEU7QUFBQSxNQUNBLEtBQUssS0FBSyxpQkFBaUI7QUFBQSxRQUN6QixJQUFJLE9BQU8sS0FBSyxLQUFLLG1CQUFtQixFQUFFLFdBQVcsS0FBSyxPQUFPLGtCQUFrQixVQUFVO0FBQUEsVUFDM0YsS0FBSyxPQUFPLFNBQVM7QUFBQSxhQUNsQixnQkFBZ0IsS0FBSyxPQUFPO0FBQUEsVUFDL0I7QUFBQSxRQUNGO0FBQUEsUUFDQSxJQUFJLE9BQU8sY0FBYyxhQUFhLEdBQUcsT0FBTyxHQUFHLEdBQUc7QUFBQSxVQUNwRCxNQUFNLFlBQVksR0FBRyxPQUFPLFFBQVEsSUFBSSxNQUFNLEVBQUUsaUJBQWlCLEdBQUcsT0FBTyxJQUFJLElBQUksTUFBTSxnQkFBZ0IsaUJBQWlCLE1BQU0sTUFBTSxPQUFPO0FBQUEsVUFDN0ksS0FBSyxPQUFPLE9BQU8sYUFBYTtBQUFBLFFBQ2xDO0FBQUEsTUFDRjtBQUFBLE1BQ0EsSUFBSSxPQUFPLE9BQU8sWUFBWTtBQUFBLFFBQzVCLEtBQUssR0FDSCxJQUFJLE1BQ0YsS0FBSyxPQUFPLFFBQ1osSUFBSSxzQkFBc0IsRUFBRSxvQkFBb0IsT0FBTyxhQUFhLE1BQU0sQ0FBQyxDQUM3RSxDQUNGO0FBQUEsTUFDRjtBQUFBLE1BQ0EsS0FBSyxLQUFLLE9BQU8sT0FBTztBQUFBLFFBQ3RCLEtBQUssT0FBTyxRQUFRLENBQUM7QUFBQSxNQUN2QjtBQUFBLE1BQ0EsS0FBSyxPQUFPLE1BQU0sS0FBSyxFQUFFLElBQUksT0FBTyxVQUFVLE9BQU8sVUFBVSxDQUFDO0FBQUEsTUFDaEUsSUFBSSxPQUFPLGNBQWMsVUFBVTtBQUFBLFFBQ2pDLFFBQVE7QUFBQSxlQUNELFFBQVE7QUFBQSxZQUNYLEtBQUssb0JBQW9CLGFBQWE7QUFBQSxZQUN0QztBQUFBLFVBQ0Y7QUFBQSxlQUNLLFNBQVM7QUFBQSxZQUNaLEtBQUssc0JBQXNCLE9BQU8sWUFDaEMsT0FBTyxRQUFRLEtBQUssbUJBQW1CLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUN0RTtBQUFBLFlBQ0EsS0FBSyxvQkFBb0IsYUFBYTtBQUFBLFlBQ3RDO0FBQUEsVUFDRjtBQUFBLGVBQ0s7QUFBQSxlQUNBLFNBQVM7QUFBQSxZQUNaLEtBQUssb0JBQW9CLGFBQWE7QUFBQSxZQUN0QztBQUFBLFVBQ0Y7QUFBQSxlQUNLLFFBQVE7QUFBQSxZQUNYLEtBQUssc0JBQXNCLE9BQU8sWUFDaEMsT0FBTyxRQUFRLEtBQUssbUJBQW1CLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUN0RTtBQUFBLFlBQ0EsS0FBSyxvQkFBb0IsYUFBYTtBQUFBLFlBQ3RDO0FBQUEsVUFDRjtBQUFBO0FBQUEsTUFFSjtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUE7QUFBQSxFQThCWCxXQUFXLEtBQUssV0FBVyxNQUFNO0FBQUEsRUE0QmpDLFlBQVksS0FBSyxXQUFXLE9BQU87QUFBQSxFQTRCbkMsWUFBWSxLQUFLLFdBQVcsT0FBTztBQUFBLEVBNEJuQyxXQUFXLEtBQUssV0FBVyxNQUFNO0FBQUEsRUEyQmpDLFlBQVksS0FBSyxXQUFXLE9BQU87QUFBQSxFQUNuQyxpQkFBaUIsQ0FBQyxNQUFNLE9BQU87QUFBQSxJQUM3QixPQUFPLENBQUMsbUJBQW1CO0FBQUEsTUFDekIsTUFBTSxjQUFjLE9BQU8sbUJBQW1CLGFBQWEsZUFBZSxzQkFBc0IsQ0FBQyxJQUFJO0FBQUEsTUFDckcsS0FBSyxhQUFhLEtBQUssa0JBQWtCLEdBQUcsWUFBWSxrQkFBa0IsQ0FBQyxHQUFHO0FBQUEsUUFDNUUsTUFBTSxJQUFJLE1BQ1IsK0dBQ0Y7QUFBQSxNQUNGO0FBQUEsTUFDQSxLQUFLLE9BQU8sYUFBYSxLQUFLLEVBQUUsTUFBTSxPQUFPLFlBQVksQ0FBQztBQUFBLE1BQzFELE9BQU87QUFBQTtBQUFBO0FBQUEsRUE0QlgsUUFBUSxLQUFLLGtCQUFrQixTQUFTLEtBQUs7QUFBQSxFQTBCN0MsV0FBVyxLQUFLLGtCQUFrQixTQUFTLElBQUk7QUFBQSxFQTBCL0MsWUFBWSxLQUFLLGtCQUFrQixhQUFhLEtBQUs7QUFBQSxFQTBCckQsU0FBUyxLQUFLLGtCQUFrQixVQUFVLEtBQUs7QUFBQSxFQUUvQyxlQUFlLENBQUMsY0FBYztBQUFBLElBQzVCLEtBQUssT0FBTyxhQUFhLEtBQUssR0FBRyxZQUFZO0FBQUEsSUFDN0MsT0FBTztBQUFBO0FBQUEsRUErQlQsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLElBQUksT0FBTyxVQUFVLFlBQVk7QUFBQSxNQUMvQixRQUFRLE1BQ04sSUFBSSxNQUNGLEtBQUssT0FBTyxRQUNaLElBQUksc0JBQXNCLEVBQUUsb0JBQW9CLE9BQU8sYUFBYSxNQUFNLENBQUMsQ0FDN0UsQ0FDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUssT0FBTyxRQUFRO0FBQUEsSUFDcEIsT0FBTztBQUFBO0FBQUEsRUF3QlQsTUFBTSxDQUFDLFFBQVE7QUFBQSxJQUNiLElBQUksT0FBTyxXQUFXLFlBQVk7QUFBQSxNQUNoQyxTQUFTLE9BQ1AsSUFBSSxNQUNGLEtBQUssT0FBTyxRQUNaLElBQUksc0JBQXNCLEVBQUUsb0JBQW9CLE9BQU8sYUFBYSxNQUFNLENBQUMsQ0FDN0UsQ0FDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUssT0FBTyxTQUFTO0FBQUEsSUFDckIsT0FBTztBQUFBO0FBQUEsRUFFVCxPQUFPLElBQUksU0FBUztBQUFBLElBQ2xCLElBQUksT0FBTyxRQUFRLE9BQU8sWUFBWTtBQUFBLE1BQ3BDLE1BQU0sVUFBVSxRQUFRLEdBQ3RCLElBQUksTUFDRixLQUFLLE9BQU8sUUFDWixJQUFJLHNCQUFzQixFQUFFLG9CQUFvQixTQUFTLGFBQWEsTUFBTSxDQUFDLENBQy9FLENBQ0Y7QUFBQSxNQUNBLEtBQUssT0FBTyxVQUFVLE1BQU0sUUFBUSxPQUFPLElBQUksVUFBVSxDQUFDLE9BQU87QUFBQSxJQUNuRSxFQUFPO0FBQUEsTUFDTCxLQUFLLE9BQU8sVUFBVTtBQUFBO0FBQUEsSUFFeEIsT0FBTztBQUFBO0FBQUEsRUFFVCxPQUFPLElBQUksU0FBUztBQUFBLElBQ2xCLElBQUksT0FBTyxRQUFRLE9BQU8sWUFBWTtBQUFBLE1BQ3BDLE1BQU0sVUFBVSxRQUFRLEdBQ3RCLElBQUksTUFDRixLQUFLLE9BQU8sUUFDWixJQUFJLHNCQUFzQixFQUFFLG9CQUFvQixTQUFTLGFBQWEsTUFBTSxDQUFDLENBQy9FLENBQ0Y7QUFBQSxNQUNBLE1BQU0sZUFBZSxNQUFNLFFBQVEsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPO0FBQUEsTUFDaEUsSUFBSSxLQUFLLE9BQU8sYUFBYSxTQUFTLEdBQUc7QUFBQSxRQUN2QyxLQUFLLE9BQU8sYUFBYSxHQUFHLEVBQUUsRUFBRSxVQUFVO0FBQUEsTUFDNUMsRUFBTztBQUFBLFFBQ0wsS0FBSyxPQUFPLFVBQVU7QUFBQTtBQUFBLElBRTFCLEVBQU87QUFBQSxNQUNMLE1BQU0sZUFBZTtBQUFBLE1BQ3JCLElBQUksS0FBSyxPQUFPLGFBQWEsU0FBUyxHQUFHO0FBQUEsUUFDdkMsS0FBSyxPQUFPLGFBQWEsR0FBRyxFQUFFLEVBQUUsVUFBVTtBQUFBLE1BQzVDLEVBQU87QUFBQSxRQUNMLEtBQUssT0FBTyxVQUFVO0FBQUE7QUFBQTtBQUFBLElBRzFCLE9BQU87QUFBQTtBQUFBLEVBa0JULEtBQUssQ0FBQyxPQUFPO0FBQUEsSUFDWCxJQUFJLEtBQUssT0FBTyxhQUFhLFNBQVMsR0FBRztBQUFBLE1BQ3ZDLEtBQUssT0FBTyxhQUFhLEdBQUcsRUFBRSxFQUFFLFFBQVE7QUFBQSxJQUMxQyxFQUFPO0FBQUEsTUFDTCxLQUFLLE9BQU8sUUFBUTtBQUFBO0FBQUEsSUFFdEIsT0FBTztBQUFBO0FBQUEsRUFrQlQsTUFBTSxDQUFDLFFBQVE7QUFBQSxJQUNiLElBQUksS0FBSyxPQUFPLGFBQWEsU0FBUyxHQUFHO0FBQUEsTUFDdkMsS0FBSyxPQUFPLGFBQWEsR0FBRyxFQUFFLEVBQUUsU0FBUztBQUFBLElBQzNDLEVBQU87QUFBQSxNQUNMLEtBQUssT0FBTyxTQUFTO0FBQUE7QUFBQSxJQUV2QixPQUFPO0FBQUE7QUFBQSxFQUdULE1BQU0sR0FBRztBQUFBLElBQ1AsT0FBTyxLQUFLLFFBQVEsaUJBQWlCLEtBQUssTUFBTTtBQUFBO0FBQUEsRUFFbEQsS0FBSyxHQUFHO0FBQUEsSUFDTixRQUFRLFNBQVMsYUFBYSxTQUFTLEtBQUssUUFBUSxXQUFXLEtBQUssT0FBTyxDQUFDO0FBQUEsSUFDNUUsT0FBTztBQUFBO0FBQUEsRUFFVCxFQUFFLENBQUMsT0FBTztBQUFBLElBQ1IsTUFBTSxhQUFhLENBQUM7QUFBQSxJQUNwQixXQUFXLEtBQUssR0FBRyxpQkFBaUIsS0FBSyxPQUFPLEtBQUssQ0FBQztBQUFBLElBQ3RELElBQUksS0FBSyxPQUFPLE9BQU87QUFBQSxNQUNyQixXQUFXLE1BQU0sS0FBSyxPQUFPO0FBQUEsUUFBTyxXQUFXLEtBQUssR0FBRyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFBQSxJQUNuRjtBQUFBLElBQ0EsT0FBTyxJQUFJLE1BQ1QsSUFBSSxTQUFTLEtBQUssT0FBTyxHQUFHLEtBQUssT0FBTyxRQUFRLE9BQU8sT0FBTyxDQUFDLEdBQUcsSUFBSSxJQUFJLFVBQVUsQ0FBQyxDQUFDLEdBQ3RGLElBQUksc0JBQXNCLEVBQUUsT0FBTyxvQkFBb0IsU0FBUyxhQUFhLFFBQVEsQ0FBQyxDQUN4RjtBQUFBO0FBQUEsRUFHRixpQkFBaUIsR0FBRztBQUFBLElBQ2xCLE9BQU8sSUFBSSxNQUNULEtBQUssT0FBTyxRQUNaLElBQUksc0JBQXNCLEVBQUUsT0FBTyxLQUFLLFdBQVcsb0JBQW9CLFNBQVMsYUFBYSxRQUFRLENBQUMsQ0FDeEc7QUFBQTtBQUFBLEVBRUYsUUFBUSxHQUFHO0FBQUEsSUFDVCxPQUFPO0FBQUE7QUFFWDtBQUFBO0FBQ0EsTUFBTSx5QkFBeUIsNkJBQTZCO0FBQUEsVUFDbEQsY0FBYztBQUFBLEVBRXRCLFFBQVEsQ0FBQyxpQkFBaUIsTUFBTTtBQUFBLElBQzlCLEtBQUssS0FBSyxTQUFTO0FBQUEsTUFDakIsTUFBTSxJQUFJLE1BQU0sb0ZBQW9GO0FBQUEsSUFDdEc7QUFBQSxJQUNBLE1BQU0sYUFBYSxvQkFBb0IsS0FBSyxPQUFPLE1BQU07QUFBQSxJQUN6RCxNQUFNLFFBQVEsS0FBSyxRQUFRLGlCQUFpQix3QkFBd0IsZ0JBQ2xFLEtBQUssUUFBUSxXQUFXLEtBQUssT0FBTyxDQUFDLEdBQ3JDLFlBQ0EsT0FDQSxNQUNLLFdBQ0w7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLFFBQVEsQ0FBQyxHQUFHLEtBQUssVUFBVTtBQUFBLElBQzdCLEdBQ0EsS0FBSyxXQUNQO0FBQUEsSUFDQSxNQUFNLHNCQUFzQixLQUFLO0FBQUEsSUFDakMsT0FBTztBQUFBO0FBQUEsRUFFVCxVQUFVLENBQUMsUUFBUTtBQUFBLElBQ2pCLEtBQUssY0FBYyxXQUFnQixZQUFJLEVBQUUsUUFBUSxDQUFDLEdBQUcsUUFBUSxNQUFNLGdCQUFnQixLQUFLLElBQUksV0FBVyxRQUFRLEVBQUUsUUFBUSxNQUFNLElBQUksRUFBRSxRQUFRLE1BQU0sZ0JBQWdCLFNBQVMsT0FBTztBQUFBLElBQ25MLE9BQU87QUFBQTtBQUFBLEVBRVQsT0FBTyxHQUFHO0FBQUEsSUFDUixPQUFPLEtBQUssU0FBUyxLQUFLO0FBQUE7QUFBQSxFQUU1QixNQUFNLENBQUMsc0JBQXNCO0FBQUEsSUFDM0IsT0FBTyxLQUFLLFNBQVMsRUFBRSxJQUFJLGlCQUFpQjtBQUFBO0FBQUEsRUFFOUMsTUFBTSxDQUFDLHNCQUFzQjtBQUFBLElBQzNCLE9BQU8sS0FBSyxTQUFTLEVBQUUsSUFBSSxpQkFBaUI7QUFBQTtBQUFBLEVBRTlDLE1BQU0sQ0FBQyxzQkFBc0I7QUFBQSxJQUMzQixPQUFPLEtBQUssU0FBUyxFQUFFLElBQUksaUJBQWlCO0FBQUE7QUFBQSxFQUU5QyxTQUFTLENBQUMsc0JBQXNCO0FBQUEsSUFDOUIsT0FBTyxLQUFLLFNBQVMsRUFBRSxPQUFPLGlCQUFpQjtBQUFBO0FBQUEsT0FFM0MsUUFBTyxHQUFHO0FBQUEsSUFDZCxPQUFPLEtBQUssSUFBSTtBQUFBO0FBRXBCO0FBQ0EsWUFBWSxrQkFBa0IsQ0FBQyxZQUFZLENBQUM7QUFDNUMsU0FBUyxpQkFBaUIsQ0FBQyxNQUFNLE9BQU87QUFBQSxFQUN0QyxPQUFPLENBQUMsWUFBWSxnQkFBZ0IsZ0JBQWdCO0FBQUEsSUFDbEQsTUFBTSxlQUFlLENBQUMsYUFBYSxHQUFHLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWTtBQUFBLE1BQ2xFO0FBQUEsTUFDQTtBQUFBLE1BQ0EsYUFBYTtBQUFBLElBQ2YsRUFBRTtBQUFBLElBQ0YsV0FBVyxlQUFlLGNBQWM7QUFBQSxNQUN0QyxLQUFLLGFBQWEsV0FBVyxrQkFBa0IsR0FBRyxZQUFZLFlBQVksa0JBQWtCLENBQUMsR0FBRztBQUFBLFFBQzlGLE1BQU0sSUFBSSxNQUNSLCtHQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLE9BQU8sV0FBVyxnQkFBZ0IsWUFBWTtBQUFBO0FBQUE7QUFHbEQsSUFBTSx3QkFBd0IsT0FBTztBQUFBLEVBQ25DO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFDQSxJQUFNLFFBQVEsa0JBQWtCLFNBQVMsS0FBSztBQUM5QyxJQUFNLFdBQVcsa0JBQWtCLFNBQVMsSUFBSTtBQUNoRCxJQUFNLFlBQVksa0JBQWtCLGFBQWEsS0FBSztBQUN0RCxJQUFNLFNBQVMsa0JBQWtCLFVBQVUsS0FBSzs7O0FDbHFCaEQsTUFBTSxhQUFhO0FBQUEsVUFDVCxjQUFjO0FBQUEsRUFDdEI7QUFBQSxFQUNBO0FBQUEsRUFDQSxXQUFXLENBQUMsU0FBUztBQUFBLElBQ25CLEtBQUssVUFBVSxHQUFHLFNBQVMsYUFBYSxJQUFJLFVBQWU7QUFBQSxJQUMzRCxLQUFLLGdCQUFnQixHQUFHLFNBQVMsYUFBYSxJQUFTLFlBQUk7QUFBQTtBQUFBLEVBRTdELFFBQVEsQ0FBQyxPQUFPLGNBQWM7QUFBQSxJQUM1QixNQUFNLGVBQWU7QUFBQSxJQUNyQixNQUFNLEtBQUssQ0FBQyxPQUFPO0FBQUEsTUFDakIsSUFBSSxPQUFPLE9BQU8sWUFBWTtBQUFBLFFBQzVCLEtBQUssR0FBRyxZQUFZO0FBQUEsTUFDdEI7QUFBQSxNQUNBLE9BQU8sSUFBSSxNQUNULElBQUksYUFDRixHQUFHLE9BQU8sR0FDVixjQUFjLHVCQUF1QixLQUFLLEdBQUcsa0JBQWtCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFDMUUsT0FDQSxJQUNGLEdBQ0EsSUFBSSxzQkFBc0IsRUFBRSxPQUFPLG9CQUFvQixTQUFTLGFBQWEsUUFBUSxDQUFDLENBQ3hGO0FBQUE7QUFBQSxJQUVGLE9BQU8sRUFBRSxHQUFHO0FBQUE7QUFBQSxFQUVkLElBQUksSUFBSSxTQUFTO0FBQUEsSUFDZixNQUFNLFFBQU87QUFBQSxJQUNiLFNBQVMsTUFBTSxDQUFDLFFBQVE7QUFBQSxNQUN0QixPQUFPLElBQUksb0JBQW9CO0FBQUEsUUFDN0IsUUFBUSxVQUFlO0FBQUEsUUFDdkIsU0FBYztBQUFBLFFBQ2QsU0FBUyxNQUFLLFdBQVc7QUFBQSxRQUN6QixVQUFVO0FBQUEsTUFDWixDQUFDO0FBQUE7QUFBQSxJQUVILFNBQVMsY0FBYyxDQUFDLFFBQVE7QUFBQSxNQUM5QixPQUFPLElBQUksb0JBQW9CO0FBQUEsUUFDN0IsUUFBUSxVQUFlO0FBQUEsUUFDdkIsU0FBYztBQUFBLFFBQ2QsU0FBUyxNQUFLLFdBQVc7QUFBQSxRQUN6QixVQUFVO0FBQUEsUUFDVixVQUFVO0FBQUEsTUFDWixDQUFDO0FBQUE7QUFBQSxJQUVILE9BQU8sRUFBRSxRQUFRLGVBQWU7QUFBQTtBQUFBLEVBRWxDLE1BQU0sQ0FBQyxRQUFRO0FBQUEsSUFDYixPQUFPLElBQUksb0JBQW9CLEVBQUUsUUFBUSxVQUFlLFdBQUcsU0FBYyxXQUFHLFNBQVMsS0FBSyxXQUFXLEVBQUUsQ0FBQztBQUFBO0FBQUEsRUFFMUcsY0FBYyxDQUFDLFFBQVE7QUFBQSxJQUNyQixPQUFPLElBQUksb0JBQW9CO0FBQUEsTUFDN0IsUUFBUSxVQUFlO0FBQUEsTUFDdkIsU0FBYztBQUFBLE1BQ2QsU0FBUyxLQUFLLFdBQVc7QUFBQSxNQUN6QixVQUFVO0FBQUEsSUFDWixDQUFDO0FBQUE7QUFBQSxFQUdILFVBQVUsR0FBRztBQUFBLElBQ1gsS0FBSyxLQUFLLFNBQVM7QUFBQSxNQUNqQixLQUFLLFVBQVUsSUFBSSxrQkFBa0IsS0FBSyxhQUFhO0FBQUEsSUFDekQ7QUFBQSxJQUNBLE9BQU8sS0FBSztBQUFBO0FBRWhCOzs7QUM5REEsTUFBTSxvQkFBb0I7QUFBQSxFQUN4QixXQUFXLENBQUMsT0FBTyxTQUFTLFNBQVMsVUFBVTtBQUFBLElBQzdDLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssV0FBVztBQUFBO0FBQUEsVUFFVixjQUFjO0FBQUEsRUFDdEIsTUFBTSxDQUFDLFFBQVE7QUFBQSxJQUNiLFNBQVMsTUFBTSxRQUFRLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTTtBQUFBLElBQ2pELElBQUksT0FBTyxXQUFXLEdBQUc7QUFBQSxNQUN2QixNQUFNLElBQUksTUFBTSxpREFBaUQ7QUFBQSxJQUNuRTtBQUFBLElBQ0EsTUFBTSxlQUFlLE9BQU8sSUFBSSxDQUFDLFVBQVU7QUFBQSxNQUN6QyxNQUFNLFNBQVMsQ0FBQztBQUFBLE1BQ2hCLE1BQU0sT0FBTyxLQUFLLE1BQU0sTUFBTSxPQUFPO0FBQUEsTUFDckMsV0FBVyxVQUFVLE9BQU8sS0FBSyxLQUFLLEdBQUc7QUFBQSxRQUN2QyxNQUFNLFdBQVcsTUFBTTtBQUFBLFFBQ3ZCLE9BQU8sVUFBVSxHQUFHLFVBQVUsR0FBRyxJQUFJLFdBQVcsSUFBSSxNQUFNLFVBQVUsS0FBSyxPQUFPO0FBQUEsTUFDbEY7QUFBQSxNQUNBLE9BQU87QUFBQSxLQUNSO0FBQUEsSUFDRCxPQUFPLElBQUksaUJBQWlCLEtBQUssT0FBTyxjQUFjLEtBQUssU0FBUyxLQUFLLFNBQVMsS0FBSyxRQUFRO0FBQUE7QUFBQSxFQUVqRyxNQUFNLENBQUMsYUFBYTtBQUFBLElBQ2xCLE1BQU0sU0FBUyxPQUFPLGdCQUFnQixhQUFhLFlBQVksSUFBSSxZQUFjLElBQUk7QUFBQSxJQUNyRixLQUFLLEdBQUcsUUFBUSxHQUFHLE1BQU0sYUFBYSxLQUFLLE1BQU0sVUFBVSxPQUFPLEVBQUUsY0FBYyxHQUFHO0FBQUEsTUFDbkYsTUFBTSxJQUFJLE1BQ1Isb0hBQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxPQUFPLElBQUksaUJBQWlCLEtBQUssT0FBTyxRQUFRLEtBQUssU0FBUyxLQUFLLFNBQVMsS0FBSyxVQUFVLElBQUk7QUFBQTtBQUVuRztBQUFBO0FBQ0EsTUFBTSx5QkFBeUIsYUFBYTtBQUFBLEVBQzFDLFdBQVcsQ0FBQyxPQUFPLFFBQVEsU0FBUyxTQUFTLFVBQVUsUUFBUTtBQUFBLElBQzdELE1BQU07QUFBQSxJQUNOLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLFNBQVMsRUFBRSxPQUFPLFFBQVEsVUFBVSxPQUFPO0FBQUE7QUFBQSxVQUUxQyxjQUFjO0FBQUEsRUFFdEI7QUFBQSxFQUNBLFNBQVMsQ0FBQyxTQUFTLEtBQUssT0FBTyxNQUFNLFlBQVksT0FBTyxVQUFVO0FBQUEsSUFDaEUsS0FBSyxPQUFPLFlBQVksb0JBQW9CLE1BQU07QUFBQSxJQUNsRCxPQUFPO0FBQUE7QUFBQSxFQXdCVCxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsR0FBRztBQUFBLElBQy9CLEtBQUssS0FBSyxPQUFPO0FBQUEsTUFBWSxLQUFLLE9BQU8sYUFBYSxDQUFDO0FBQUEsSUFDdkQsSUFBSSxPQUFPLFdBQWdCLFdBQUc7QUFBQSxNQUM1QixLQUFLLE9BQU8sV0FBVyxLQUFLLDRCQUE0QjtBQUFBLElBQzFELEVBQU87QUFBQSxNQUNMLE1BQU0sWUFBWSxNQUFNLFFBQVEsT0FBTyxNQUFNLElBQUksTUFBTSxPQUFPLFdBQVcsTUFBTSxDQUFDLE9BQU8sTUFBTTtBQUFBLE1BQzdGLE1BQU0sV0FBVyxPQUFPLFFBQVEsYUFBYSxPQUFPLFVBQVU7QUFBQSxNQUM5RCxLQUFLLE9BQU8sV0FBVyxLQUFLLG1CQUFtQix1QkFBdUIsVUFBVTtBQUFBO0FBQUEsSUFFbEYsT0FBTztBQUFBO0FBQUEsRUErQlQsa0JBQWtCLENBQUMsUUFBUTtBQUFBLElBQ3pCLElBQUksT0FBTyxVQUFVLE9BQU8sZUFBZSxPQUFPLFdBQVc7QUFBQSxNQUMzRCxNQUFNLElBQUksTUFDUiw2SUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUssS0FBSyxPQUFPO0FBQUEsTUFBWSxLQUFLLE9BQU8sYUFBYSxDQUFDO0FBQUEsSUFDdkQsTUFBTSxXQUFXLE9BQU8sUUFBUSxhQUFhLE9BQU8sVUFBZTtBQUFBLElBQ25FLE1BQU0saUJBQWlCLE9BQU8sY0FBYyxhQUFhLE9BQU8sZ0JBQXFCO0FBQUEsSUFDckYsTUFBTSxjQUFjLE9BQU8sV0FBVyxhQUFhLE9BQU8sYUFBa0I7QUFBQSxJQUM1RSxNQUFNLFlBQVksTUFBTSxRQUFRLE9BQU8sTUFBTSxJQUFJLE1BQU0sT0FBTyxXQUFXLE1BQU0sQ0FBQyxPQUFPLE1BQU07QUFBQSxJQUM3RixNQUFNLFNBQVMsS0FBSyxRQUFRLGVBQWUsS0FBSyxPQUFPLE9BQU8sYUFBYSxLQUFLLE9BQU8sT0FBTyxPQUFPLEdBQUcsQ0FBQztBQUFBLElBQ3pHLEtBQUssT0FBTyxXQUFXLEtBQ3JCLG1CQUFtQixZQUFZLGdDQUFnQyxTQUFTLFdBQVcsYUFDckY7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLEVBR1QsTUFBTSxHQUFHO0FBQUEsSUFDUCxPQUFPLEtBQUssUUFBUSxpQkFBaUIsS0FBSyxNQUFNO0FBQUE7QUFBQSxFQUVsRCxLQUFLLEdBQUc7QUFBQSxJQUNOLFFBQVEsU0FBUyxhQUFhLFNBQVMsS0FBSyxRQUFRLFdBQVcsS0FBSyxPQUFPLENBQUM7QUFBQSxJQUM1RSxPQUFPO0FBQUE7QUFBQSxFQUdULFFBQVEsQ0FBQyxpQkFBaUIsTUFBTTtBQUFBLElBQzlCLE9BQU8sS0FBSyxRQUFRLGlCQUFpQix3QkFBd0IsZ0JBQzNELEtBQUssUUFBUSxXQUFXLEtBQUssT0FBTyxDQUFDLEdBQ3JDLEtBQUssT0FBTyxXQUNaLEtBQUssT0FBTyxZQUFZLFFBQVEsT0FDaEMsTUFDSyxXQUNMO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixRQUFRLGlCQUFpQixLQUFLLE9BQU8sS0FBSztBQUFBLElBQzVDLENBQ0Y7QUFBQTtBQUFBLEVBRUYsT0FBTyxHQUFHO0FBQUEsSUFDUixPQUFPLEtBQUssU0FBUyxLQUFLO0FBQUE7QUFBQSxFQUU1QixNQUFNLENBQUMsc0JBQXNCO0FBQUEsSUFDM0IsT0FBTyxLQUFLLFNBQVMsRUFBRSxJQUFJLGlCQUFpQjtBQUFBO0FBQUEsRUFFOUMsTUFBTSxDQUFDLHNCQUFzQjtBQUFBLElBQzNCLE9BQU8sS0FBSyxTQUFTLEVBQUUsSUFBSSxpQkFBaUI7QUFBQTtBQUFBLEVBRTlDLE1BQU0sQ0FBQyxzQkFBc0I7QUFBQSxJQUMzQixPQUFPLEtBQUssU0FBUyxFQUFFLElBQUksaUJBQWlCO0FBQUE7QUFBQSxFQUU5QyxTQUFTLENBQUMsc0JBQXNCO0FBQUEsSUFDOUIsT0FBTyxLQUFLLFNBQVMsRUFBRSxPQUFPLGlCQUFpQjtBQUFBO0FBQUEsT0FFM0MsUUFBTyxHQUFHO0FBQUEsSUFDZCxPQUFPLEtBQUssT0FBTyxZQUFZLEtBQUssSUFBSSxJQUFJLEtBQUssSUFBSTtBQUFBO0FBQUEsRUFFdkQsUUFBUSxHQUFHO0FBQUEsSUFDVCxPQUFPO0FBQUE7QUFFWDs7O0FDcEtBLE1BQU0sb0JBQW9CO0FBQUEsRUFDeEIsV0FBVyxDQUFDLE9BQU8sU0FBUyxTQUFTLFVBQVU7QUFBQSxJQUM3QyxLQUFLLFFBQVE7QUFBQSxJQUNiLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLFdBQVc7QUFBQTtBQUFBLFVBRVYsY0FBYztBQUFBLEVBQ3RCLEdBQUcsQ0FBQyxRQUFRO0FBQUEsSUFDVixPQUFPLElBQUksaUJBQ1QsS0FBSyxPQUNMLGFBQWEsS0FBSyxPQUFPLE1BQU0sR0FDL0IsS0FBSyxTQUNMLEtBQUssU0FDTCxLQUFLLFFBQ1A7QUFBQTtBQUVKO0FBQUE7QUFDQSxNQUFNLHlCQUF5QixhQUFhO0FBQUEsRUFDMUMsV0FBVyxDQUFDLE9BQU8sS0FBSyxTQUFTLFNBQVMsVUFBVTtBQUFBLElBQ2xELE1BQU07QUFBQSxJQUNOLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLFNBQVMsRUFBRSxLQUFLLE9BQU8sVUFBVSxPQUFPLENBQUMsRUFBRTtBQUFBO0FBQUEsVUFFMUMsY0FBYztBQUFBLEVBRXRCO0FBQUEsRUFDQSxJQUFJLENBQUMsUUFBUTtBQUFBLElBQ1gsS0FBSyxPQUFPLE9BQU87QUFBQSxJQUNuQixPQUFPO0FBQUE7QUFBQSxFQUVULFVBQVUsQ0FBQyxVQUFVO0FBQUEsSUFDbkIsT0FBTyxDQUFDLE9BQU8sT0FBTztBQUFBLE1BQ3BCLE1BQU0sWUFBWSxpQkFBaUIsS0FBSztBQUFBLE1BQ3hDLElBQUksT0FBTyxjQUFjLFlBQVksS0FBSyxPQUFPLE1BQU0sS0FBSyxDQUFDLFNBQVMsS0FBSyxVQUFVLFNBQVMsR0FBRztBQUFBLFFBQy9GLE1BQU0sSUFBSSxNQUFNLFVBQVUsMENBQTBDO0FBQUEsTUFDdEU7QUFBQSxNQUNBLElBQUksT0FBTyxPQUFPLFlBQVk7QUFBQSxRQUM1QixNQUFNLE9BQU8sS0FBSyxPQUFPLE9BQU8sR0FBRyxPQUFPLFdBQVcsSUFBSSxNQUFNLE1BQU0sT0FBTyxXQUFXLEdBQUcsT0FBTyxRQUFRLElBQUksTUFBTSxFQUFFLGlCQUFpQixHQUFHLE9BQU8sY0FBYyxJQUFJLE1BQU0sZ0JBQWdCLGlCQUFzQixZQUFTO0FBQUEsUUFDdk4sS0FBSyxHQUNILElBQUksTUFDRixLQUFLLE9BQU8sTUFBTSxNQUFNLE9BQU8sVUFDL0IsSUFBSSxzQkFBc0IsRUFBRSxvQkFBb0IsT0FBTyxhQUFhLE1BQU0sQ0FBQyxDQUM3RSxHQUNBLFFBQVEsSUFBSSxNQUNWLE1BQ0EsSUFBSSxzQkFBc0IsRUFBRSxvQkFBb0IsT0FBTyxhQUFhLE1BQU0sQ0FBQyxDQUM3RSxDQUNGO0FBQUEsTUFDRjtBQUFBLE1BQ0EsS0FBSyxPQUFPLE1BQU0sS0FBSyxFQUFFLElBQUksT0FBTyxVQUFVLE9BQU8sVUFBVSxDQUFDO0FBQUEsTUFDaEUsT0FBTztBQUFBO0FBQUE7QUFBQSxFQUdYLFdBQVcsS0FBSyxXQUFXLE1BQU07QUFBQSxFQUNqQyxZQUFZLEtBQUssV0FBVyxPQUFPO0FBQUEsRUFDbkMsWUFBWSxLQUFLLFdBQVcsT0FBTztBQUFBLEVBQ25DLFdBQVcsS0FBSyxXQUFXLE1BQU07QUFBQSxFQWtDakMsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLEtBQUssT0FBTyxRQUFRO0FBQUEsSUFDcEIsT0FBTztBQUFBO0FBQUEsRUFFVCxPQUFPLElBQUksU0FBUztBQUFBLElBQ2xCLElBQUksT0FBTyxRQUFRLE9BQU8sWUFBWTtBQUFBLE1BQ3BDLE1BQU0sVUFBVSxRQUFRLEdBQ3RCLElBQUksTUFDRixLQUFLLE9BQU8sTUFBTSxNQUFNLE9BQU8sVUFDL0IsSUFBSSxzQkFBc0IsRUFBRSxvQkFBb0IsU0FBUyxhQUFhLE1BQU0sQ0FBQyxDQUMvRSxDQUNGO0FBQUEsTUFDQSxNQUFNLGVBQWUsTUFBTSxRQUFRLE9BQU8sSUFBSSxVQUFVLENBQUMsT0FBTztBQUFBLE1BQ2hFLEtBQUssT0FBTyxVQUFVO0FBQUEsSUFDeEIsRUFBTztBQUFBLE1BQ0wsTUFBTSxlQUFlO0FBQUEsTUFDckIsS0FBSyxPQUFPLFVBQVU7QUFBQTtBQUFBLElBRXhCLE9BQU87QUFBQTtBQUFBLEVBRVQsS0FBSyxDQUFDLE9BQU87QUFBQSxJQUNYLEtBQUssT0FBTyxRQUFRO0FBQUEsSUFDcEIsT0FBTztBQUFBO0FBQUEsRUFFVCxTQUFTLENBQUMsU0FBUyxLQUFLLE9BQU8sTUFBTSxZQUFZLE9BQU8sVUFBVTtBQUFBLElBQ2hFLEtBQUssT0FBTyxZQUFZLG9CQUFvQixNQUFNO0FBQUEsSUFDbEQsT0FBTztBQUFBO0FBQUEsRUFHVCxNQUFNLEdBQUc7QUFBQSxJQUNQLE9BQU8sS0FBSyxRQUFRLGlCQUFpQixLQUFLLE1BQU07QUFBQTtBQUFBLEVBRWxELEtBQUssR0FBRztBQUFBLElBQ04sUUFBUSxTQUFTLGFBQWEsU0FBUyxLQUFLLFFBQVEsV0FBVyxLQUFLLE9BQU8sQ0FBQztBQUFBLElBQzVFLE9BQU87QUFBQTtBQUFBLEVBR1QsUUFBUSxDQUFDLGlCQUFpQixNQUFNO0FBQUEsSUFDOUIsT0FBTyxLQUFLLFFBQVEsaUJBQWlCLHdCQUF3QixnQkFDM0QsS0FBSyxRQUFRLFdBQVcsS0FBSyxPQUFPLENBQUMsR0FDckMsS0FBSyxPQUFPLFdBQ1osS0FBSyxPQUFPLFlBQVksUUFBUSxPQUNoQyxNQUNLLFdBQ0w7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLFFBQVEsaUJBQWlCLEtBQUssT0FBTyxLQUFLO0FBQUEsSUFDNUMsQ0FDRjtBQUFBO0FBQUEsRUFFRixPQUFPLEdBQUc7QUFBQSxJQUNSLE9BQU8sS0FBSyxTQUFTLEtBQUs7QUFBQTtBQUFBLEVBRTVCLE1BQU0sQ0FBQyxzQkFBc0I7QUFBQSxJQUMzQixPQUFPLEtBQUssU0FBUyxFQUFFLElBQUksaUJBQWlCO0FBQUE7QUFBQSxFQUU5QyxNQUFNLENBQUMsc0JBQXNCO0FBQUEsSUFDM0IsT0FBTyxLQUFLLFNBQVMsRUFBRSxJQUFJLGlCQUFpQjtBQUFBO0FBQUEsRUFFOUMsTUFBTSxDQUFDLHNCQUFzQjtBQUFBLElBQzNCLE9BQU8sS0FBSyxTQUFTLEVBQUUsSUFBSSxpQkFBaUI7QUFBQTtBQUFBLEVBRTlDLFNBQVMsQ0FBQyxzQkFBc0I7QUFBQSxJQUM5QixPQUFPLEtBQUssU0FBUyxFQUFFLE9BQU8saUJBQWlCO0FBQUE7QUFBQSxPQUUzQyxRQUFPLEdBQUc7QUFBQSxJQUNkLE9BQU8sS0FBSyxPQUFPLFlBQVksS0FBSyxJQUFJLElBQUksS0FBSyxJQUFJO0FBQUE7QUFBQSxFQUV2RCxRQUFRLEdBQUc7QUFBQSxJQUNULE9BQU87QUFBQTtBQUVYOzs7QUMvS0EsTUFBTSwyQkFBMkIsSUFBSTtBQUFBLEVBQ25DLFdBQVcsQ0FBQyxRQUFRO0FBQUEsSUFDbEIsTUFBTSxtQkFBbUIsbUJBQW1CLE9BQU8sUUFBUSxPQUFPLE9BQU8sRUFBRSxXQUFXO0FBQUEsSUFDdEYsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLFVBQVUsT0FBTztBQUFBLElBQ3RCLEtBQUssTUFBTSxtQkFBbUIsV0FDNUIsT0FBTyxRQUNQLE9BQU8sT0FDVDtBQUFBO0FBQUEsRUFFRjtBQUFBLFVBQ1EsY0FBYztBQUFBLEdBQ3JCLE9BQU8sZUFBZTtBQUFBLEVBQ3ZCO0FBQUEsU0FDTyxrQkFBa0IsQ0FBQyxRQUFRLFNBQVM7QUFBQSxJQUN6QyxPQUFPLDRCQUE0QixTQUFTLElBQUksSUFBSSxTQUFTLEVBQUUsR0FBRyxPQUFPLElBQUk7QUFBQTtBQUFBLFNBRXhFLFVBQVUsQ0FBQyxRQUFRLFNBQVM7QUFBQSxJQUNqQyxPQUFPLDJCQUEyQixTQUFTLElBQUksSUFBSSxTQUFTLEVBQUUsR0FBRyxPQUFPLElBQUk7QUFBQTtBQUFBLEVBRTlFLElBQUksQ0FBQyxhQUFhLFlBQVk7QUFBQSxJQUM1QixPQUFPLFFBQVEsUUFBUSxLQUFLLFFBQVEsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQ25ELGFBQ0EsVUFDRjtBQUFBO0FBQUEsRUFFRixLQUFLLENBQUMsWUFBWTtBQUFBLElBQ2hCLE9BQU8sS0FBSyxLQUFVLFdBQUcsVUFBVTtBQUFBO0FBQUEsRUFFckMsT0FBTyxDQUFDLFdBQVc7QUFBQSxJQUNqQixPQUFPLEtBQUssS0FDVixDQUFDLFVBQVU7QUFBQSxNQUNULFlBQVk7QUFBQSxNQUNaLE9BQU87QUFBQSxPQUVULENBQUMsV0FBVztBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osTUFBTTtBQUFBLEtBRVY7QUFBQTtBQUVKOzs7QUN0Q0EsTUFBTSx1QkFBdUI7QUFBQSxFQUMzQixXQUFXLENBQUMsTUFBTSxZQUFZLFFBQVEsZUFBZSxPQUFPLGFBQWEsU0FBUyxTQUFTO0FBQUEsSUFDekYsS0FBSyxPQUFPO0FBQUEsSUFDWixLQUFLLGFBQWE7QUFBQSxJQUNsQixLQUFLLFNBQVM7QUFBQSxJQUNkLEtBQUssZ0JBQWdCO0FBQUEsSUFDckIsS0FBSyxRQUFRO0FBQUEsSUFDYixLQUFLLGNBQWM7QUFBQSxJQUNuQixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssVUFBVTtBQUFBO0FBQUEsVUFFVCxjQUFjO0FBQUEsRUFDdEIsUUFBUSxDQUFDLFFBQVE7QUFBQSxJQUNmLE9BQU8sS0FBSyxTQUFTLFNBQVMsSUFBSSwwQkFDaEMsS0FBSyxZQUNMLEtBQUssUUFDTCxLQUFLLGVBQ0wsS0FBSyxPQUNMLEtBQUssYUFDTCxLQUFLLFNBQ0wsS0FBSyxTQUNMLFNBQVMsU0FBUyxDQUFDLEdBQ25CLE1BQ0YsSUFBSSxJQUFJLHNCQUNOLEtBQUssWUFDTCxLQUFLLFFBQ0wsS0FBSyxlQUNMLEtBQUssT0FDTCxLQUFLLGFBQ0wsS0FBSyxTQUNMLEtBQUssU0FDTCxTQUFTLFNBQVMsQ0FBQyxHQUNuQixNQUNGO0FBQUE7QUFBQSxFQUVGLFNBQVMsQ0FBQyxRQUFRO0FBQUEsSUFDaEIsT0FBTyxLQUFLLFNBQVMsU0FBUyxJQUFJLDBCQUNoQyxLQUFLLFlBQ0wsS0FBSyxRQUNMLEtBQUssZUFDTCxLQUFLLE9BQ0wsS0FBSyxhQUNMLEtBQUssU0FDTCxLQUFLLFNBQ0wsU0FBUyxLQUFLLFFBQVEsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FDOUMsT0FDRixJQUFJLElBQUksc0JBQ04sS0FBSyxZQUNMLEtBQUssUUFDTCxLQUFLLGVBQ0wsS0FBSyxPQUNMLEtBQUssYUFDTCxLQUFLLFNBQ0wsS0FBSyxTQUNMLFNBQVMsS0FBSyxRQUFRLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQzlDLE9BQ0Y7QUFBQTtBQUVKO0FBQUE7QUFDQSxNQUFNLDhCQUE4QixhQUFhO0FBQUEsRUFDL0MsV0FBVyxDQUFDLFlBQVksUUFBUSxlQUFlLE9BQU8sYUFBYSxTQUFTLFNBQVMsUUFBUSxNQUFNO0FBQUEsSUFDakcsTUFBTTtBQUFBLElBQ04sS0FBSyxhQUFhO0FBQUEsSUFDbEIsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLGdCQUFnQjtBQUFBLElBQ3JCLEtBQUssUUFBUTtBQUFBLElBQ2IsS0FBSyxjQUFjO0FBQUEsSUFDbkIsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssU0FBUztBQUFBLElBQ2QsS0FBSyxPQUFPO0FBQUE7QUFBQSxVQUVOLGNBQWM7QUFBQSxFQUV0QjtBQUFBLEVBRUEsTUFBTSxHQUFHO0FBQUEsSUFDUCxPQUFPLEtBQUssUUFBUSxxQkFBcUI7QUFBQSxNQUN2QyxZQUFZLEtBQUs7QUFBQSxNQUNqQixRQUFRLEtBQUs7QUFBQSxNQUNiLGVBQWUsS0FBSztBQUFBLE1BQ3BCLE9BQU8sS0FBSztBQUFBLE1BQ1osYUFBYSxLQUFLO0FBQUEsTUFDbEIsYUFBYSxLQUFLO0FBQUEsTUFDbEIsWUFBWSxLQUFLLFlBQVk7QUFBQSxJQUMvQixDQUFDLEVBQUU7QUFBQTtBQUFBLEVBR0wsUUFBUSxDQUFDLGlCQUFpQixPQUFPO0FBQUEsSUFDL0IsUUFBUSxPQUFPLGVBQWUsS0FBSyxPQUFPO0FBQUEsSUFDMUMsT0FBTyxLQUFLLFFBQVEsaUJBQWlCLHdCQUF3QixnQkFDM0QsWUFDSyxXQUNMLEtBQUssU0FBUyxVQUFVLFFBQVEsT0FDaEMsTUFDQSxDQUFDLFNBQVMsbUJBQW1CO0FBQUEsTUFDM0IsTUFBTSxPQUFPLFFBQVEsSUFDbkIsQ0FBQyxRQUFRLGlCQUFpQixLQUFLLFFBQVEsS0FBSyxhQUFhLEtBQUssTUFBTSxXQUFXLGNBQWMsQ0FDL0Y7QUFBQSxNQUNBLElBQUksS0FBSyxTQUFTLFNBQVM7QUFBQSxRQUN6QixPQUFPLEtBQUs7QUFBQSxNQUNkO0FBQUEsTUFDQSxPQUFPO0FBQUEsS0FFWDtBQUFBO0FBQUEsRUFFRixPQUFPLEdBQUc7QUFBQSxJQUNSLE9BQU8sS0FBSyxTQUFTLEtBQUs7QUFBQTtBQUFBLEVBRTVCLE1BQU0sR0FBRztBQUFBLElBQ1AsTUFBTSxRQUFRLEtBQUssUUFBUSxxQkFBcUI7QUFBQSxNQUM5QyxZQUFZLEtBQUs7QUFBQSxNQUNqQixRQUFRLEtBQUs7QUFBQSxNQUNiLGVBQWUsS0FBSztBQUFBLE1BQ3BCLE9BQU8sS0FBSztBQUFBLE1BQ1osYUFBYSxLQUFLO0FBQUEsTUFDbEIsYUFBYSxLQUFLO0FBQUEsTUFDbEIsWUFBWSxLQUFLLFlBQVk7QUFBQSxJQUMvQixDQUFDO0FBQUEsSUFDRCxNQUFNLGFBQWEsS0FBSyxRQUFRLFdBQVcsTUFBTSxHQUFHO0FBQUEsSUFDcEQsT0FBTyxFQUFFLE9BQU8sV0FBVztBQUFBO0FBQUEsRUFFN0IsS0FBSyxHQUFHO0FBQUEsSUFDTixPQUFPLEtBQUssT0FBTyxFQUFFO0FBQUE7QUFBQSxFQUd2QixVQUFVLEdBQUc7QUFBQSxJQUNYLElBQUksS0FBSyxTQUFTLFNBQVM7QUFBQSxNQUN6QixPQUFPLEtBQUssU0FBUyxLQUFLLEVBQUUsSUFBSTtBQUFBLElBQ2xDO0FBQUEsSUFDQSxPQUFPLEtBQUssU0FBUyxLQUFLLEVBQUUsSUFBSTtBQUFBO0FBQUEsT0FFNUIsUUFBTyxHQUFHO0FBQUEsSUFDZCxPQUFPLEtBQUssV0FBVztBQUFBO0FBRTNCO0FBQUE7QUFDQSxNQUFNLGtDQUFrQyxzQkFBc0I7QUFBQSxVQUNwRCxjQUFjO0FBQUEsRUFDdEIsSUFBSSxHQUFHO0FBQUEsSUFDTCxPQUFPLEtBQUssV0FBVztBQUFBO0FBRTNCOzs7QUNoSkEsTUFBTSxrQkFBa0IsYUFBYTtBQUFBLEVBQ25DLFdBQVcsQ0FBQyxTQUFTLFFBQVEsUUFBUSxTQUFTLGdCQUFnQjtBQUFBLElBQzVELE1BQU07QUFBQSxJQUNOLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssaUJBQWlCO0FBQUEsSUFDdEIsS0FBSyxTQUFTLEVBQUUsT0FBTztBQUFBO0FBQUEsVUFFakIsY0FBYztBQUFBLEVBRXRCO0FBQUEsRUFDQSxRQUFRLEdBQUc7QUFBQSxJQUNULE9BQU8sS0FBSyxLQUFLLFFBQVEsV0FBVyxLQUFLLE9BQU8sQ0FBQyxHQUFHLFFBQVEsS0FBSyxPQUFPLE9BQU87QUFBQTtBQUFBLEVBRWpGLFNBQVMsQ0FBQyxRQUFRLGFBQWE7QUFBQSxJQUM3QixPQUFPLGNBQWMsS0FBSyxlQUFlLE1BQU0sSUFBSTtBQUFBO0FBQUEsRUFFckQsUUFBUSxHQUFHO0FBQUEsSUFDVCxPQUFPO0FBQUE7QUFBQSxFQUdULHFCQUFxQixHQUFHO0FBQUEsSUFDdEIsT0FBTztBQUFBO0FBRVg7OztBQ2JBLE1BQU0sbUJBQW1CO0FBQUEsRUFDdkIsV0FBVyxDQUFDLFlBQVksU0FBUyxTQUFTLFFBQVE7QUFBQSxJQUNoRCxLQUFLLGFBQWE7QUFBQSxJQUNsQixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssVUFBVTtBQUFBLElBQ2YsS0FBSyxJQUFJLFNBQVM7QUFBQSxNQUNoQixRQUFRLE9BQU87QUFBQSxNQUNmLFlBQVksT0FBTztBQUFBLE1BQ25CLGVBQWUsT0FBTztBQUFBLElBQ3hCLElBQUk7QUFBQSxNQUNGLFFBQWE7QUFBQSxNQUNiLFlBQVksQ0FBQztBQUFBLE1BQ2IsZUFBZSxDQUFDO0FBQUEsSUFDbEI7QUFBQSxJQUNBLEtBQUssUUFBUSxDQUFDO0FBQUEsSUFDZCxNQUFNLFFBQVEsS0FBSztBQUFBLElBQ25CLElBQUksS0FBSyxFQUFFLFFBQVE7QUFBQSxNQUNqQixZQUFZLFdBQVcsWUFBWSxPQUFPLFFBQVEsS0FBSyxFQUFFLE1BQU0sR0FBRztBQUFBLFFBQ2hFLE1BQU0sYUFBYSxJQUFJLHVCQUNyQixZQUNBLE9BQU8sWUFDUCxLQUFLLEVBQUUsUUFDUCxLQUFLLEVBQUUsZUFDUCxPQUFPLFdBQVcsWUFDbEIsU0FDQSxTQUNBLE9BQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsS0FBSyxTQUFTLEVBQUUsWUFBWSxPQUFPLFlBQVksR0FDN0M7QUFBQTtBQUFBLFVBRUksY0FBYztBQUFBLEVBQ3RCO0FBQUEsRUFpQ0EsUUFBUSxDQUFDLE9BQU8sY0FBYztBQUFBLElBQzVCLE1BQU0sUUFBTztBQUFBLElBQ2IsTUFBTSxLQUFLLENBQUMsT0FBTztBQUFBLE1BQ2pCLElBQUksT0FBTyxPQUFPLFlBQVk7QUFBQSxRQUM1QixLQUFLLEdBQUcsSUFBSSxhQUFhLE1BQUssT0FBTyxDQUFDO0FBQUEsTUFDeEM7QUFBQSxNQUNBLE9BQU8sSUFBSSxNQUNULElBQUksYUFDRixHQUFHLE9BQU8sR0FDVixjQUFjLHVCQUF1QixLQUFLLEdBQUcsa0JBQWtCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFDMUUsT0FDQSxJQUNGLEdBQ0EsSUFBSSxzQkFBc0IsRUFBRSxPQUFPLG9CQUFvQixTQUFTLGFBQWEsUUFBUSxDQUFDLENBQ3hGO0FBQUE7QUFBQSxJQUVGLE9BQU8sRUFBRSxHQUFHO0FBQUE7QUFBQSxFQUVkLE1BQU0sQ0FBQyxRQUFRLFNBQVM7QUFBQSxJQUN0QixPQUFPLElBQUksbUJBQW1CLEVBQUUsUUFBUSxTQUFTLFNBQVMsS0FBSyxRQUFRLENBQUM7QUFBQTtBQUFBLEVBcUIxRSxJQUFJLElBQUksU0FBUztBQUFBLElBQ2YsTUFBTSxRQUFPO0FBQUEsSUFDYixTQUFTLE1BQU0sQ0FBQyxRQUFRO0FBQUEsTUFDdEIsT0FBTyxJQUFJLG9CQUFvQjtBQUFBLFFBQzdCLFFBQVEsVUFBZTtBQUFBLFFBQ3ZCLFNBQVMsTUFBSztBQUFBLFFBQ2QsU0FBUyxNQUFLO0FBQUEsUUFDZCxVQUFVO0FBQUEsTUFDWixDQUFDO0FBQUE7QUFBQSxJQUVILFNBQVMsY0FBYyxDQUFDLFFBQVE7QUFBQSxNQUM5QixPQUFPLElBQUksb0JBQW9CO0FBQUEsUUFDN0IsUUFBUSxVQUFlO0FBQUEsUUFDdkIsU0FBUyxNQUFLO0FBQUEsUUFDZCxTQUFTLE1BQUs7QUFBQSxRQUNkLFVBQVU7QUFBQSxRQUNWLFVBQVU7QUFBQSxNQUNaLENBQUM7QUFBQTtBQUFBLElBRUgsU0FBUyxNQUFNLENBQUMsT0FBTztBQUFBLE1BQ3JCLE9BQU8sSUFBSSxvQkFBb0IsT0FBTyxNQUFLLFNBQVMsTUFBSyxTQUFTLE9BQU87QUFBQTtBQUFBLElBRTNFLFNBQVMsTUFBTSxDQUFDLE1BQU07QUFBQSxNQUNwQixPQUFPLElBQUksb0JBQW9CLE1BQU0sTUFBSyxTQUFTLE1BQUssU0FBUyxPQUFPO0FBQUE7QUFBQSxJQUUxRSxTQUFTLE9BQU8sQ0FBQyxNQUFNO0FBQUEsTUFDckIsT0FBTyxJQUFJLGlCQUFpQixNQUFNLE1BQUssU0FBUyxNQUFLLFNBQVMsT0FBTztBQUFBO0FBQUEsSUFFdkUsT0FBTyxFQUFFLFFBQVEsZ0JBQWdCLFFBQVEsUUFBUSxRQUFRLFFBQVE7QUFBQTtBQUFBLEVBRW5FLE1BQU0sQ0FBQyxRQUFRO0FBQUEsSUFDYixPQUFPLElBQUksb0JBQW9CLEVBQUUsUUFBUSxVQUFlLFdBQUcsU0FBUyxLQUFLLFNBQVMsU0FBUyxLQUFLLFFBQVEsQ0FBQztBQUFBO0FBQUEsRUFFM0csY0FBYyxDQUFDLFFBQVE7QUFBQSxJQUNyQixPQUFPLElBQUksb0JBQW9CO0FBQUEsTUFDN0IsUUFBUSxVQUFlO0FBQUEsTUFDdkIsU0FBUyxLQUFLO0FBQUEsTUFDZCxTQUFTLEtBQUs7QUFBQSxNQUNkLFVBQVU7QUFBQSxJQUNaLENBQUM7QUFBQTtBQUFBLEVBNkJILE1BQU0sQ0FBQyxPQUFPO0FBQUEsSUFDWixPQUFPLElBQUksb0JBQW9CLE9BQU8sS0FBSyxTQUFTLEtBQUssT0FBTztBQUFBO0FBQUEsRUFFbEU7QUFBQSxFQXlCQSxNQUFNLENBQUMsTUFBTTtBQUFBLElBQ1gsT0FBTyxJQUFJLG9CQUFvQixNQUFNLEtBQUssU0FBUyxLQUFLLE9BQU87QUFBQTtBQUFBLEVBMEJqRSxNQUFNLENBQUMsTUFBTTtBQUFBLElBQ1gsT0FBTyxJQUFJLGlCQUFpQixNQUFNLEtBQUssU0FBUyxLQUFLLE9BQU87QUFBQTtBQUFBLEVBRTlELEdBQUcsQ0FBQyxPQUFPO0FBQUEsSUFDVCxNQUFNLFNBQVMsT0FBTyxVQUFVLFdBQVcsSUFBSSxJQUFJLEtBQUssSUFBSSxNQUFNLE9BQU87QUFBQSxJQUN6RSxJQUFJLEtBQUssZUFBZSxTQUFTO0FBQUEsTUFDL0IsT0FBTyxJQUFJLFVBQ1QsWUFBWSxLQUFLLFFBQVEsSUFBSSxNQUFNLEdBQ25DLE1BQU0sUUFDTixPQUNBLEtBQUssU0FDTCxLQUFLLFFBQVEsa0NBQWtDLEtBQUssS0FBSyxPQUFPLENBQ2xFO0FBQUEsSUFDRjtBQUFBLElBQ0EsT0FBTyxLQUFLLFFBQVEsSUFBSSxNQUFNO0FBQUE7QUFBQSxFQUVoQyxHQUFHLENBQUMsT0FBTztBQUFBLElBQ1QsTUFBTSxTQUFTLE9BQU8sVUFBVSxXQUFXLElBQUksSUFBSSxLQUFLLElBQUksTUFBTSxPQUFPO0FBQUEsSUFDekUsSUFBSSxLQUFLLGVBQWUsU0FBUztBQUFBLE1BQy9CLE9BQU8sSUFBSSxVQUNULFlBQVksS0FBSyxRQUFRLElBQUksTUFBTSxHQUNuQyxNQUFNLFFBQ04sT0FDQSxLQUFLLFNBQ0wsS0FBSyxRQUFRLGtDQUFrQyxLQUFLLEtBQUssT0FBTyxDQUNsRTtBQUFBLElBQ0Y7QUFBQSxJQUNBLE9BQU8sS0FBSyxRQUFRLElBQUksTUFBTTtBQUFBO0FBQUEsRUFFaEMsR0FBRyxDQUFDLE9BQU87QUFBQSxJQUNULE1BQU0sU0FBUyxPQUFPLFVBQVUsV0FBVyxJQUFJLElBQUksS0FBSyxJQUFJLE1BQU0sT0FBTztBQUFBLElBQ3pFLElBQUksS0FBSyxlQUFlLFNBQVM7QUFBQSxNQUMvQixPQUFPLElBQUksVUFDVCxZQUFZLEtBQUssUUFBUSxJQUFJLE1BQU0sR0FDbkMsTUFBTSxRQUNOLE9BQ0EsS0FBSyxTQUNMLEtBQUssUUFBUSxrQ0FBa0MsS0FBSyxLQUFLLE9BQU8sQ0FDbEU7QUFBQSxJQUNGO0FBQUEsSUFDQSxPQUFPLEtBQUssUUFBUSxJQUFJLE1BQU07QUFBQTtBQUFBLEVBRWhDLE1BQU0sQ0FBQyxPQUFPO0FBQUEsSUFDWixNQUFNLFNBQVMsT0FBTyxVQUFVLFdBQVcsSUFBSSxJQUFJLEtBQUssSUFBSSxNQUFNLE9BQU87QUFBQSxJQUN6RSxJQUFJLEtBQUssZUFBZSxTQUFTO0FBQUEsTUFDL0IsT0FBTyxJQUFJLFVBQ1QsWUFBWSxLQUFLLFFBQVEsT0FBTyxNQUFNLEdBQ3RDLE1BQU0sUUFDTixVQUNBLEtBQUssU0FDTCxLQUFLLFFBQVEscUNBQXFDLEtBQUssS0FBSyxPQUFPLENBQ3JFO0FBQUEsSUFDRjtBQUFBLElBQ0EsT0FBTyxLQUFLLFFBQVEsT0FBTyxNQUFNO0FBQUE7QUFBQSxFQUVuQyxXQUFXLENBQUMsYUFBYSxRQUFRO0FBQUEsSUFDL0IsT0FBTyxLQUFLLFFBQVEsWUFBWSxhQUFhLE1BQU07QUFBQTtBQUV2RDs7O0FDN1NBLE1BQU0sTUFBTTtBQUFBLFVBQ0YsY0FBYztBQUN4QjtBQUFBO0FBQ0EsTUFBTSxrQkFBa0IsTUFBTTtBQUFBLEVBQzVCLFFBQVEsR0FBRztBQUFBLElBQ1QsT0FBTztBQUFBO0FBQUEsVUFFRCxjQUFjO0FBQUEsT0FDaEIsSUFBRyxDQUFDLE1BQU07QUFBQSxJQUNkO0FBQUE7QUFBQSxPQUVJLElBQUcsQ0FBQyxjQUFjLFdBQVcsU0FBUyxTQUFTO0FBQUEsT0FFL0MsU0FBUSxDQUFDLFNBQVM7QUFFMUI7QUFDQSxlQUFlLFNBQVMsQ0FBQyxNQUFLLFFBQVE7QUFBQSxFQUNwQyxNQUFNLGFBQWEsR0FBRyxRQUFPLEtBQUssVUFBVSxNQUFNO0FBQUEsRUFDbEQsTUFBTSxVQUFVLElBQUk7QUFBQSxFQUNwQixNQUFNLE9BQU8sUUFBUSxPQUFPLFVBQVU7QUFBQSxFQUN0QyxNQUFNLGFBQWEsTUFBTSxPQUFPLE9BQU8sT0FBTyxXQUFXLElBQUk7QUFBQSxFQUM3RCxNQUFNLFlBQVksQ0FBQyxHQUFHLElBQUksV0FBVyxVQUFVLENBQUM7QUFBQSxFQUNoRCxNQUFNLFVBQVUsVUFBVSxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLFNBQVMsR0FBRyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFBQSxFQUM3RSxPQUFPO0FBQUE7OztBQ25CVCxNQUFNLDBCQUEwQixhQUFhO0FBQUEsRUFDM0MsV0FBVyxDQUFDLFVBQVU7QUFBQSxJQUNwQixNQUFNO0FBQUEsSUFDTixLQUFLLFdBQVc7QUFBQTtBQUFBLFVBRVYsY0FBYztBQUFBLE9BQ2hCLFFBQU8sR0FBRztBQUFBLElBQ2QsT0FBTyxLQUFLLFNBQVM7QUFBQTtBQUFBLEVBRXZCLElBQUksR0FBRztBQUFBLElBQ0wsT0FBTyxLQUFLLFNBQVM7QUFBQTtBQUV6QjtBQUFBO0FBQ0EsTUFBTSxvQkFBb0I7QUFBQSxFQUN4QixXQUFXLENBQUMsTUFBTSxlQUFlLE9BQU8sT0FBTyxlQUFlLGFBQWE7QUFBQSxJQUN6RSxLQUFLLE9BQU87QUFBQSxJQUNaLEtBQUssZ0JBQWdCO0FBQUEsSUFDckIsS0FBSyxRQUFRO0FBQUEsSUFDYixLQUFLLFFBQVE7QUFBQSxJQUNiLEtBQUssZ0JBQWdCO0FBQUEsSUFDckIsS0FBSyxjQUFjO0FBQUEsSUFDbkIsSUFBSSxTQUFTLE1BQU0sU0FBUyxNQUFNLFNBQVMsZ0JBQXFCLFdBQUc7QUFBQSxNQUNqRSxLQUFLLGNBQWMsRUFBRSxRQUFRLE1BQU0sZ0JBQWdCLEtBQUs7QUFBQSxJQUMxRDtBQUFBLElBQ0EsS0FBSyxLQUFLLGFBQWEsUUFBUTtBQUFBLE1BQzdCLEtBQUssY0FBbUI7QUFBQSxJQUMxQjtBQUFBO0FBQUEsVUFFTSxjQUFjO0FBQUEsRUFFdEI7QUFBQSxPQUVNLGVBQWMsQ0FBQyxhQUFhLFFBQVEsT0FBTztBQUFBLElBQy9DLElBQUksS0FBSyxVQUFlLGFBQUssR0FBRyxLQUFLLE9BQU8sU0FBUyxLQUFLLEtBQUssa0JBQXVCLFdBQUc7QUFBQSxNQUN2RixJQUFJO0FBQUEsUUFDRixPQUFPLE1BQU0sTUFBTTtBQUFBLFFBQ25CLE9BQU8sR0FBRztBQUFBLFFBQ1YsTUFBTSxJQUFJLGtCQUFrQixhQUFhLFFBQVEsQ0FBQztBQUFBO0FBQUEsSUFFdEQ7QUFBQSxJQUNBLElBQUksS0FBSyxnQkFBZ0IsS0FBSyxZQUFZLFFBQVE7QUFBQSxNQUNoRCxJQUFJO0FBQUEsUUFDRixPQUFPLE1BQU0sTUFBTTtBQUFBLFFBQ25CLE9BQU8sR0FBRztBQUFBLFFBQ1YsTUFBTSxJQUFJLGtCQUFrQixhQUFhLFFBQVEsQ0FBQztBQUFBO0FBQUEsSUFFdEQ7QUFBQSxJQUNBLEtBQUssS0FBSyxjQUFjLFNBQVMsWUFBWSxLQUFLLGNBQWMsU0FBUyxZQUFZLEtBQUssY0FBYyxTQUFTLGFBQWEsS0FBSyxjQUFjLE9BQU8sU0FBUyxHQUFHO0FBQUEsTUFDbEssSUFBSTtBQUFBLFFBQ0YsT0FBTyxPQUFPLE1BQU0sUUFBUSxJQUFJO0FBQUEsVUFDOUIsTUFBTTtBQUFBLFVBQ04sS0FBSyxNQUFNLFNBQVMsRUFBRSxRQUFRLEtBQUssY0FBYyxPQUFPLENBQUM7QUFBQSxRQUMzRCxDQUFDO0FBQUEsUUFDRCxPQUFPO0FBQUEsUUFDUCxPQUFPLEdBQUc7QUFBQSxRQUNWLE1BQU0sSUFBSSxrQkFBa0IsYUFBYSxRQUFRLENBQUM7QUFBQTtBQUFBLElBRXREO0FBQUEsSUFDQSxLQUFLLEtBQUssYUFBYTtBQUFBLE1BQ3JCLElBQUk7QUFBQSxRQUNGLE9BQU8sTUFBTSxNQUFNO0FBQUEsUUFDbkIsT0FBTyxHQUFHO0FBQUEsUUFDVixNQUFNLElBQUksa0JBQWtCLGFBQWEsUUFBUSxDQUFDO0FBQUE7QUFBQSxJQUV0RDtBQUFBLElBQ0EsSUFBSSxLQUFLLGNBQWMsU0FBUyxVQUFVO0FBQUEsTUFDeEMsTUFBTSxZQUFZLE1BQU0sS0FBSyxNQUFNLElBQ2pDLEtBQUssWUFBWSxPQUFRLE1BQU0sVUFBVSxhQUFhLE1BQU0sR0FDNUQsS0FBSyxjQUFjLFFBQ25CLEtBQUssWUFBWSxRQUFhLFdBQzlCLEtBQUssWUFBWSxjQUNuQjtBQUFBLE1BQ0EsSUFBSSxjQUFtQixXQUFHO0FBQUEsUUFDeEIsSUFBSTtBQUFBLFFBQ0osSUFBSTtBQUFBLFVBQ0YsU0FBUyxNQUFNLE1BQU07QUFBQSxVQUNyQixPQUFPLEdBQUc7QUFBQSxVQUNWLE1BQU0sSUFBSSxrQkFBa0IsYUFBYSxRQUFRLENBQUM7QUFBQTtBQUFBLFFBRXBELE1BQU0sS0FBSyxNQUFNLElBQ2YsS0FBSyxZQUFZLE9BQVEsTUFBTSxVQUFVLGFBQWEsTUFBTSxHQUM1RCxRQUVBLEtBQUssWUFBWSxpQkFBaUIsS0FBSyxjQUFjLFNBQVMsQ0FBQyxHQUMvRCxLQUFLLFlBQVksUUFBYSxXQUM5QixLQUFLLFlBQVksTUFDbkI7QUFBQSxRQUNBLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFDQSxPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsSUFBSTtBQUFBLE1BQ0YsT0FBTyxNQUFNLE1BQU07QUFBQSxNQUNuQixPQUFPLEdBQUc7QUFBQSxNQUNWLE1BQU0sSUFBSSxrQkFBa0IsYUFBYSxRQUFRLENBQUM7QUFBQTtBQUFBO0FBQUEsRUFHdEQsUUFBUSxHQUFHO0FBQUEsSUFDVCxPQUFPLEtBQUs7QUFBQTtBQUFBLEVBRWQsWUFBWSxDQUFDLFFBQVEsY0FBYztBQUFBLElBQ2pDLE9BQU87QUFBQTtBQUFBLEVBRVQsWUFBWSxDQUFDLFNBQVMsY0FBYztBQUFBLElBQ2xDLE1BQU0sSUFBSSxNQUFNLGlCQUFpQjtBQUFBO0FBQUEsRUFFbkMsWUFBWSxDQUFDLFNBQVMsY0FBYztBQUFBLElBQ2xDLE1BQU0sSUFBSSxNQUFNLGlCQUFpQjtBQUFBO0FBQUEsRUFFbkMsT0FBTyxDQUFDLG1CQUFtQjtBQUFBLElBQ3pCLElBQUksS0FBSyxTQUFTLFNBQVM7QUFBQSxNQUN6QixPQUFPLEtBQUssS0FBSyxlQUFlLGlCQUFpQjtBQUFBLElBQ25EO0FBQUEsSUFDQSxPQUFPLElBQUksa0JBQWtCLE1BQU0sS0FBSyxLQUFLLGVBQWUsaUJBQWlCLENBQUM7QUFBQTtBQUFBLEVBRWhGLFNBQVMsQ0FBQyxVQUFVLGFBQWE7QUFBQSxJQUMvQixRQUFRLEtBQUs7QUFBQSxXQUNOLE9BQU87QUFBQSxRQUNWLE9BQU8sS0FBSyxhQUFhLFVBQVUsV0FBVztBQUFBLE1BQ2hEO0FBQUEsV0FDSyxPQUFPO0FBQUEsUUFDVixPQUFPLEtBQUssYUFBYSxVQUFVLFdBQVc7QUFBQSxNQUNoRDtBQUFBLFdBQ0ssT0FBTztBQUFBLFFBQ1YsT0FBTyxLQUFLLGFBQWEsVUFBVSxXQUFXO0FBQUEsTUFDaEQ7QUFBQTtBQUFBO0FBR047QUFBQTtBQUNBLE1BQU0sY0FBYztBQUFBLEVBQ2xCLFdBQVcsQ0FBQyxTQUFTO0FBQUEsSUFDbkIsS0FBSyxVQUFVO0FBQUE7QUFBQSxVQUVULGNBQWM7QUFBQSxFQUN0QixtQkFBbUIsQ0FBQyxPQUFPLFFBQVEsZUFBZSx1QkFBdUIsb0JBQW9CLGVBQWUsYUFBYTtBQUFBLElBQ3ZILE9BQU8sS0FBSyxhQUNWLE9BQ0EsUUFDQSxlQUNBLHVCQUNBLG9CQUNBLGVBQ0EsV0FDRjtBQUFBO0FBQUEsRUFFRixHQUFHLENBQUMsT0FBTztBQUFBLElBQ1QsTUFBTSxjQUFjLEtBQUssUUFBUSxXQUFXLEtBQUs7QUFBQSxJQUNqRCxJQUFJO0FBQUEsTUFDRixPQUFPLEtBQUssb0JBQW9CLGFBQWtCLFdBQUcsT0FBTyxLQUFLLEVBQUUsSUFBSTtBQUFBLE1BQ3ZFLE9BQU8sS0FBSztBQUFBLE1BQ1osTUFBTSxJQUFJLGFBQWEsRUFBRSxPQUFPLEtBQUssU0FBUyw0QkFBNEIsWUFBWSxPQUFPLENBQUM7QUFBQTtBQUFBO0FBQUEsRUFJbEcsaUNBQWlDLENBQUMsUUFBUTtBQUFBLElBQ3hDLE9BQU87QUFBQTtBQUFBLEVBRVQsR0FBRyxDQUFDLE9BQU87QUFBQSxJQUNULE9BQU8sS0FBSyxvQkFBb0IsS0FBSyxRQUFRLFdBQVcsS0FBSyxHQUFRLFdBQUcsT0FBTyxLQUFLLEVBQUUsSUFBSTtBQUFBO0FBQUEsRUFHNUYsaUNBQWlDLENBQUMsU0FBUztBQUFBLElBQ3pDLE1BQU0sSUFBSSxNQUFNLGlCQUFpQjtBQUFBO0FBQUEsRUFFbkMsR0FBRyxDQUFDLE9BQU87QUFBQSxJQUNULE9BQU8sS0FBSyxvQkFBb0IsS0FBSyxRQUFRLFdBQVcsS0FBSyxHQUFRLFdBQUcsT0FBTyxLQUFLLEVBQUUsSUFBSTtBQUFBO0FBQUEsRUFHNUYsaUNBQWlDLENBQUMsU0FBUztBQUFBLElBQ3pDLE1BQU0sSUFBSSxNQUFNLGlCQUFpQjtBQUFBO0FBQUEsRUFFbkMsTUFBTSxDQUFDLE9BQU87QUFBQSxJQUNaLE9BQU8sS0FBSyxvQkFBb0IsS0FBSyxRQUFRLFdBQVcsS0FBSyxHQUFRLFdBQUcsT0FBTyxLQUFLLEVBQUUsT0FBTztBQUFBO0FBQUEsT0FFekYsTUFBSyxDQUFDLE1BQUs7QUFBQSxJQUNmLE1BQU0sU0FBUyxNQUFNLEtBQUssT0FBTyxJQUFHO0FBQUEsSUFDcEMsT0FBTyxPQUFPLEdBQUc7QUFBQTtBQUFBLEVBR25CLG9DQUFvQyxDQUFDLFNBQVM7QUFBQSxJQUM1QyxNQUFNLElBQUksTUFBTSxpQkFBaUI7QUFBQTtBQUVyQztBQUFBO0FBQ0EsTUFBTSwwQkFBMEIsbUJBQW1CO0FBQUEsRUFDakQsV0FBVyxDQUFDLFlBQVksU0FBUyxTQUFTLFFBQVEsY0FBYyxHQUFHO0FBQUEsSUFDakUsTUFBTSxZQUFZLFNBQVMsU0FBUyxNQUFNO0FBQUEsSUFDMUMsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLGNBQWM7QUFBQTtBQUFBLFVBRWIsY0FBYztBQUFBLEVBQ3RCLFFBQVEsR0FBRztBQUFBLElBQ1QsTUFBTSxJQUFJO0FBQUE7QUFFZDs7O0FDck1BLE1BQU0saUJBQWlCO0FBQUEsVUFDYixjQUFjO0FBQUEsRUFDdEIsS0FBSyxDQUFDLFNBQVM7QUFBQSxJQUNiLFFBQVEsSUFBSSxPQUFPO0FBQUE7QUFFdkI7QUFBQTtBQUNBLE1BQU0sY0FBYztBQUFBLFVBQ1YsY0FBYztBQUFBLEVBQ3RCO0FBQUEsRUFDQSxXQUFXLENBQUMsUUFBUTtBQUFBLElBQ2xCLEtBQUssU0FBUyxRQUFRLFVBQVUsSUFBSTtBQUFBO0FBQUEsRUFFdEMsUUFBUSxDQUFDLE9BQU8sUUFBUTtBQUFBLElBQ3RCLE1BQU0sb0JBQW9CLE9BQU8sSUFBSSxDQUFDLE1BQU07QUFBQSxNQUMxQyxJQUFJO0FBQUEsUUFDRixPQUFPLEtBQUssVUFBVSxDQUFDO0FBQUEsUUFDdkIsTUFBTTtBQUFBLFFBQ04sT0FBTyxPQUFPLENBQUM7QUFBQTtBQUFBLEtBRWxCO0FBQUEsSUFDRCxNQUFNLFlBQVksa0JBQWtCLFNBQVMsZ0JBQWdCLGtCQUFrQixLQUFLLElBQUksT0FBTztBQUFBLElBQy9GLEtBQUssT0FBTyxNQUFNLFVBQVUsUUFBUSxXQUFXO0FBQUE7QUFFbkQ7QUFBQTtBQUNBLE1BQU0sV0FBVztBQUFBLFVBQ1AsY0FBYztBQUFBLEVBQ3RCLFFBQVEsR0FBRztBQUViOzs7QUN4QkEsSUFBSSxpQkFBaUIsQ0FBQztBQUN0QixTQUFTLGdCQUFnQjtBQUFBLEVBQ3hCLFlBQVksTUFBTTtBQUFBLEVBQ2xCLHFCQUFxQixNQUFNO0FBQUEsRUFDM0IseUJBQXlCLE1BQU07QUFBQSxFQUMvQixrQ0FBa0MsTUFBTTtBQUFBLEVBQ3hDLGNBQWMsTUFBTTtBQUFBLEVBQ3BCLHVCQUF1QixNQUFNO0FBQUEsRUFDN0IsZ0JBQWdCLE1BQU07QUFBQSxFQUN0QixRQUFRLE1BQU07QUFBQSxFQUNkLE9BQU8sTUFBTTtBQUFBLEVBQ2IsZ0JBQWdCLE1BQU07QUFDdkIsQ0FBQztBQUNELElBQU0sU0FBUztBQUFBLEVBQ2QsV0FBVyxRQUFRLFlBQVksRUFBRSxRQUFRO0FBQUEsRUFDekMsV0FBVyxRQUFRLFlBQVk7QUFDaEM7QUFDQSxJQUFNLFFBQVEsWUFBWSxTQUFTO0FBQUEsRUFDbEMsSUFBSSxRQUFRLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxRQUFRO0FBQUEsRUFDNUMsV0FBVyxLQUFLLFlBQVksRUFBRSxPQUFPLEVBQUUsUUFBUTtBQUFBLEVBQy9DLGVBQWUsUUFBUSxnQkFBZ0I7QUFBQSxLQUNwQztBQUNKLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxnQkFBZ0IsRUFBRSxHQUFHLE1BQU0sU0FBUyxHQUFHLE1BQU0sb0JBQW9CLEVBQUUsR0FBRyxNQUFNLGFBQWEsQ0FBQyxDQUFDO0FBQ2hILElBQU0saUJBQWlCLFVBQVUsT0FBTyxHQUFHLEtBQUssWUFBWTtBQUFBLEVBQzNELFlBQVksS0FBSyxVQUFVO0FBQUEsRUFDM0IsTUFBTSxJQUFJLFlBQVk7QUFBQSxJQUNyQixRQUFRLENBQUMsTUFBTSxhQUFhO0FBQUEsSUFDNUIsWUFBWSxDQUFDLFdBQVcsRUFBRTtBQUFBLEVBQzNCLENBQUM7QUFDRixFQUFFO0FBQ0YsSUFBTSxhQUFhLFlBQVksY0FBYztBQUFBLEVBQzVDLElBQUksUUFBUSxJQUFJLEVBQUUsV0FBVyxFQUFFLGVBQWUsS0FBSyxDQUFDO0FBQUEsRUFDcEQsT0FBTyxRQUFRLFFBQVEsRUFBRSxRQUFRO0FBQUEsRUFDakMsUUFBUSxRQUFRLFNBQVMsRUFBRSxRQUFRO0FBQUEsRUFDbkMsTUFBTSxLQUFLLEVBQUUsUUFBUTtBQUFBLEVBQ3JCLGFBQWEsS0FBSyxjQUFjLEVBQUUsUUFBUTtBQUFBLEVBQzFDLFdBQVcsUUFBUSxZQUFZLEVBQUUsUUFBUTtBQUFBLEVBQ3pDLGNBQWMsS0FBSyxlQUFlLEVBQUUsUUFBUTtBQUFBLEtBQ3pDO0FBQ0osR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLGFBQWEsRUFBRSxHQUFHLE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsQ0FBQztBQUMxRixJQUFNLHNCQUFzQixVQUFVLFlBQVksR0FBRyxXQUFXLEVBQUUsTUFBTSxJQUFJLE9BQU87QUFBQSxFQUNsRixRQUFRLENBQUMsV0FBVyxNQUFNO0FBQUEsRUFDMUIsWUFBWSxDQUFDLE1BQU0sRUFBRTtBQUN0QixDQUFDLEVBQUUsRUFBRTtBQUNMLElBQU0saUJBQWlCLFlBQVksa0JBQWtCO0FBQUEsRUFDcEQsSUFBSSxLQUFLLEVBQUUsV0FBVztBQUFBLEVBQ3RCLFNBQVMsS0FBSyxFQUFFLFFBQVE7QUFBQSxFQUN4QixRQUFRLEtBQUssRUFBRSxRQUFRO0FBQUEsRUFDdkIsU0FBUyxLQUFLLEVBQUUsUUFBUTtBQUFBLEtBQ3JCO0FBQ0osQ0FBQztBQUNELElBQU0sZUFBZSxZQUFZLGlCQUFpQjtBQUFBLEVBQ2pELElBQUksUUFBUSxJQUFJLEVBQUUsV0FBVyxFQUFFLGVBQWUsS0FBSyxDQUFDO0FBQUEsRUFDcEQsTUFBTSxLQUFLLE1BQU0sRUFBRSxRQUFRO0FBQUEsRUFDM0IsYUFBYSxLQUFLLGFBQWE7QUFBQSxFQUMvQixrQkFBa0IsS0FBSyxvQkFBb0IsRUFBRSxRQUFRO0FBQUEsRUFDckQsV0FBVyxRQUFRLFlBQVksRUFBRSxRQUFRO0FBQUEsRUFDekMsU0FBUyxRQUFRLFVBQVU7QUFBQSxFQUMzQixRQUFRLEtBQUssVUFBVSxFQUFFLE1BQU07QUFBQSxJQUM5QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRCxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxhQUFhO0FBQUEsRUFDcEMsU0FBUyxLQUFLLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDO0FBQUEsRUFDN0MsaUJBQWlCLEtBQUssbUJBQW1CLEVBQUUsT0FBTztBQUFBLEVBQ2xELGlCQUFpQixLQUFLLG1CQUFtQjtBQUFBLEVBQ3pDLFlBQVksS0FBSyxhQUFhO0FBQUEsRUFDOUIsMkJBQTJCLEtBQUssOEJBQThCO0FBQUEsS0FDM0Q7QUFDSixHQUFHLENBQUMsVUFBVTtBQUFBLEVBQ2IsTUFBTSw4QkFBOEIsRUFBRSxHQUFHLE1BQU0sZ0JBQWdCO0FBQUEsRUFDL0QsTUFBTSxrQkFBa0IsRUFBRSxHQUFHLE1BQU0sTUFBTTtBQUFBLEVBQ3pDLE1BQU0sNkJBQTZCLEVBQUUsR0FBRyxNQUFNLGVBQWU7QUFDOUQsQ0FBQztBQUNELElBQU0sMEJBQTBCLFlBQVksNkJBQTZCO0FBQUEsRUFDeEUsSUFBSSxRQUFRLElBQUksRUFBRSxXQUFXLEVBQUUsZUFBZSxLQUFLLENBQUM7QUFBQSxFQUNwRCxTQUFTLFFBQVEsVUFBVSxFQUFFLFFBQVEsRUFBRSxXQUFXLE1BQU0sYUFBYSxJQUFJLEVBQUUsVUFBVSxVQUFVLENBQUM7QUFBQSxFQUNoRyxhQUFhLFFBQVEsY0FBYyxFQUFFLFFBQVEsRUFBRSxXQUFXLE1BQU0sV0FBVyxJQUFJLEVBQUUsVUFBVSxVQUFVLENBQUM7QUFBQSxFQUN0RyxXQUFXLEtBQUssWUFBWSxFQUFFLFFBQVE7QUFBQSxFQUN0QyxNQUFNLEtBQUssUUFBUSxFQUFFLE1BQU07QUFBQSxJQUMxQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRCxFQUFFLENBQUMsRUFBRSxRQUFRO0FBQUEsRUFDYixVQUFVLFFBQVEsV0FBVyxFQUFFLFFBQVE7QUFBQSxLQUNwQztBQUNKLEdBQUcsQ0FBQyxVQUFVO0FBQUEsRUFDYixNQUFNLDBCQUEwQixFQUFFLEdBQUcsTUFBTSxPQUFPO0FBQUEsRUFDbEQsTUFBTSw4QkFBOEIsRUFBRSxHQUFHLE1BQU0sV0FBVztBQUFBLEVBQzFELE1BQU0sNEJBQTRCLEVBQUUsR0FBRyxNQUFNLFNBQVM7QUFDdkQsQ0FBQztBQUNELElBQU0sd0JBQXdCLFVBQVUsY0FBYyxHQUFHLFlBQVksRUFBRSxjQUFjLEtBQUssdUJBQXVCLEVBQUUsRUFBRTtBQUNySCxJQUFNLG1DQUFtQyxVQUFVLHlCQUF5QixHQUFHLFdBQVc7QUFBQSxFQUN6RixPQUFPLElBQUksY0FBYztBQUFBLElBQ3hCLFFBQVEsQ0FBQyx3QkFBd0IsT0FBTztBQUFBLElBQ3hDLFlBQVksQ0FBQyxhQUFhLEVBQUU7QUFBQSxFQUM3QixDQUFDO0FBQUEsRUFDRCxXQUFXLElBQUksWUFBWTtBQUFBLElBQzFCLFFBQVEsQ0FBQyx3QkFBd0IsV0FBVztBQUFBLElBQzVDLFlBQVksQ0FBQyxXQUFXLEVBQUU7QUFBQSxFQUMzQixDQUFDO0FBQ0YsRUFBRTs7O0FDdkdGLElBQUksYUFBYSxNQUFNO0FBQUEsU0FDZixJQUFJLENBQUMsSUFBSTtBQUFBLElBQ2YsTUFBTSxTQUFTLEdBQUcsT0FBTztBQUFBLE1BQ3hCLElBQUksTUFBTTtBQUFBLE1BQ1YsV0FBVyxNQUFNO0FBQUEsTUFDakIsV0FBVyxNQUFNO0FBQUEsTUFDakIsV0FBVyxNQUFNO0FBQUEsTUFDakIsaUJBQWlCLE1BQU07QUFBQSxNQUN2QixvQkFBb0I7QUFBQSxJQUNyQixDQUFDLEVBQUUsS0FBSyxLQUFLLEVBQUUsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUMsRUFBRSxTQUFTLFlBQVksR0FBRyxNQUFNLElBQUksV0FBVyxNQUFNLENBQUMsRUFBRSxJQUFJO0FBQUEsSUFDakcsT0FBTyxLQUFLLGdCQUFnQixNQUFNO0FBQUE7QUFBQSxTQUU1QixlQUFlLENBQUMsSUFBSTtBQUFBLElBQzFCLE1BQU0sU0FBUyxHQUFHLE9BQU87QUFBQSxNQUN4QixJQUFJLE1BQU07QUFBQSxNQUNWLFdBQVcsTUFBTTtBQUFBLE1BQ2pCLFdBQVcsTUFBTTtBQUFBLE1BQ2pCLFdBQVcsTUFBTTtBQUFBLE1BQ2pCLGlCQUFpQixNQUFNO0FBQUEsTUFDdkIsb0JBQW9CO0FBQUEsSUFDckIsQ0FBQyxFQUFFLEtBQUssS0FBSyxFQUFFLE1BQU0sR0FBRyxNQUFNLFdBQVcsRUFBRSxDQUFDLEVBQUUsU0FBUyxZQUFZLEdBQUcsTUFBTSxJQUFJLFdBQVcsTUFBTSxDQUFDLEVBQUUsSUFBSTtBQUFBLElBQ3hHLE9BQU8sS0FBSyxnQkFBZ0IsTUFBTTtBQUFBO0FBQUEsU0FFNUIsT0FBTyxHQUFHO0FBQUEsSUFDaEIsTUFBTSxTQUFTLEdBQUcsT0FBTztBQUFBLE1BQ3hCLElBQUksTUFBTTtBQUFBLE1BQ1YsV0FBVyxNQUFNO0FBQUEsTUFDakIsV0FBVyxNQUFNO0FBQUEsTUFDakIsV0FBVyxNQUFNO0FBQUEsTUFDakIsaUJBQWlCLE1BQU07QUFBQSxNQUN2QixvQkFBb0I7QUFBQSxJQUNyQixDQUFDLEVBQUUsS0FBSyxLQUFLLEVBQUUsU0FBUyxZQUFZLEdBQUcsTUFBTSxJQUFJLFdBQVcsTUFBTSxDQUFDLEVBQUUsSUFBSTtBQUFBLElBQ3pFLE9BQU8sS0FBSyxnQkFBZ0IsTUFBTTtBQUFBO0FBQUEsU0FFNUIsaUJBQWlCLENBQUMsSUFBSTtBQUFBLElBQzVCLE1BQU0sU0FBUyxHQUFHLE9BQU87QUFBQSxNQUN4QixJQUFJLE1BQU07QUFBQSxNQUNWLFdBQVcsTUFBTTtBQUFBLE1BQ2pCLFdBQVcsTUFBTTtBQUFBLE1BQ2pCLFdBQVcsTUFBTTtBQUFBLE1BQ2pCLGlCQUFpQixNQUFNO0FBQUEsTUFDdkIsb0JBQW9CO0FBQUEsSUFDckIsQ0FBQyxFQUFFLEtBQUssS0FBSyxFQUFFLFNBQVMsWUFBWSxHQUFHLE1BQU0sSUFBSSxXQUFXLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FBRyxXQUFXLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSTtBQUFBLElBQ3RHLE9BQU8sS0FBSyxnQkFBZ0IsTUFBTTtBQUFBO0FBQUEsU0FFNUIsbUJBQW1CLENBQUMsTUFBTTtBQUFBLElBQ2hDLE1BQU0sU0FBUyxHQUFHLE9BQU87QUFBQSxNQUN4QixJQUFJLE1BQU07QUFBQSxNQUNWLFdBQVcsTUFBTTtBQUFBLE1BQ2pCLFdBQVcsTUFBTTtBQUFBLE1BQ2pCLFdBQVcsTUFBTTtBQUFBLE1BQ2pCLGlCQUFpQixNQUFNO0FBQUEsTUFDdkIsb0JBQW9CO0FBQUEsSUFDckIsQ0FBQyxFQUFFLEtBQUssS0FBSyxFQUFFLFNBQVMsWUFBWSxHQUFHLE1BQU0sSUFBSSxXQUFXLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FBRyxXQUFXLE1BQU0sSUFBSSxDQUFDLEVBQUUsSUFBSTtBQUFBLElBQzFHLE9BQU8sS0FBSyxnQkFBZ0IsTUFBTTtBQUFBO0FBQUEsU0FFNUIsZUFBZSxDQUFDLE9BQU87QUFBQSxJQUM3QixLQUFLO0FBQUEsTUFBTyxPQUFPLENBQUM7QUFBQSxJQUNwQixJQUFJLE1BQU0sUUFBUSxLQUFLO0FBQUEsTUFBRyxPQUFPLE1BQU0sSUFBSSxDQUFDLFNBQVM7QUFBQSxRQUNwRCxPQUFPO0FBQUEsVUFDTixJQUFJLEtBQUs7QUFBQSxVQUNULFdBQVcsS0FBSztBQUFBLFVBQ2hCLFdBQVcsSUFBSSxLQUFLLEtBQUssU0FBUztBQUFBLFVBQ2xDLFdBQVcsSUFBSSxLQUFLLEtBQUssU0FBUztBQUFBLFVBQ2xDLGNBQWMsS0FBSyxxQkFBcUIsS0FBSyxNQUFNLEtBQUssc0JBQXNCLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDO0FBQUEsVUFDcEgsaUJBQWlCLEtBQUs7QUFBQSxRQUN2QjtBQUFBLE9BQ0E7QUFBQSxJQUNJO0FBQUEsYUFBTztBQUFBLFFBQ1gsSUFBSSxNQUFNO0FBQUEsUUFDVixXQUFXLE1BQU07QUFBQSxRQUNqQixXQUFXLElBQUksS0FBSyxNQUFNLFNBQVM7QUFBQSxRQUNuQyxXQUFXLElBQUksS0FBSyxNQUFNLFNBQVM7QUFBQSxRQUNuQyxjQUFjLE1BQU0scUJBQXFCLEtBQUssTUFBTSxNQUFNLHNCQUFzQixJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sT0FBTyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQztBQUFBLFFBQ3RILGlCQUFpQixNQUFNO0FBQUEsTUFDeEI7QUFBQTtBQUFBLFNBRU0sTUFBTSxDQUFDLFdBQVc7QUFBQSxJQUN4QixLQUFLLEtBQUs7QUFBQSxNQUNUO0FBQUEsTUFDQSwyQkFBMkIsSUFBSTtBQUFBLE1BQy9CLDJCQUEyQixJQUFJO0FBQUEsSUFDaEMsQ0FBQztBQUFBLElBQ0QsT0FBTyxLQUFLLGdCQUFnQixTQUFTO0FBQUE7QUFBQSxTQUUvQixJQUFJLENBQUMsTUFBTTtBQUFBLElBQ2pCLEdBQUcsT0FBTyxLQUFLLEVBQUUsT0FBTztBQUFBLE1BQ3ZCLElBQUksS0FBSztBQUFBLE1BQ1QsV0FBVyxLQUFLO0FBQUEsTUFDaEIsZUFBZSxLQUFLO0FBQUEsTUFDcEIsV0FBVyxLQUFLLFVBQVUsUUFBUTtBQUFBLE1BQ2xDLFdBQVcsS0FBSyxVQUFVLFFBQVE7QUFBQSxJQUNuQyxDQUFDLEVBQUUsbUJBQW1CO0FBQUEsTUFDckIsUUFBUSxNQUFNO0FBQUEsTUFDZCxLQUFLO0FBQUEsUUFDSixXQUFXLEtBQUs7QUFBQSxRQUNoQixlQUFlLEtBQUs7QUFBQSxRQUNwQixXQUFXLEtBQUssVUFBVSxRQUFRO0FBQUEsTUFDbkM7QUFBQSxJQUNELENBQUMsRUFBRSxJQUFJO0FBQUEsSUFDUCxPQUFPO0FBQUE7QUFBQSxTQUVELE1BQU0sQ0FBQyxNQUFNO0FBQUEsSUFDbkIsR0FBRyxPQUFPLEtBQUssRUFBRSxNQUFNLEdBQUcsTUFBTSxJQUFJLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSTtBQUFBO0FBQUEsU0FFNUMsWUFBWSxDQUFDLE1BQU0sUUFBTztBQUFBLElBQ2hDLEtBQUssS0FBSztBQUFBLE1BQWM7QUFBQSxJQUN4QixJQUFJLFVBQVMsS0FBSyxhQUFhO0FBQUEsTUFBUTtBQUFBLElBQ3ZDLE9BQU8sZ0JBQWdCLEtBQUssS0FBSyxhQUFhLE9BQU07QUFBQTtBQUV0RDs7O0FDL0dBLElBQUksZ0JBQWdCLE1BQU0sZUFBYztBQUFBLEVBQ3ZDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSwwQkFBMEIsSUFBSTtBQUFBLEVBQzlCLFdBQVcsR0FBRztBQUFBLElBQ2IsS0FBSywwQkFBMEIsSUFBSTtBQUFBO0FBQUEsU0FFN0IsSUFBSSxDQUFDLFdBQVc7QUFBQSxJQUN0QixNQUFNLFNBQVMsR0FBRyxPQUFPLEVBQUUsS0FBSyxjQUFjLEVBQUUsTUFBTSxHQUFHLGVBQWUsSUFBSSxTQUFTLENBQUMsRUFBRSxJQUFJO0FBQUEsSUFDNUYsT0FBTyxLQUFLLGdCQUFnQixNQUFNO0FBQUE7QUFBQSxTQUU1QixNQUFNLENBQUMsV0FBVyxTQUFTLFNBQVMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHO0FBQUEsSUFDNUQsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLEtBQUs7QUFBQSxJQUNaLE9BQU8sVUFBVTtBQUFBLElBQ2pCLE9BQU8sU0FBUyxLQUFLLFVBQVUsTUFBTTtBQUFBLElBQ3JDLE9BQU8sVUFBVSxLQUFLLFVBQVUsT0FBTztBQUFBLElBQ3ZDLE9BQU87QUFBQTtBQUFBLFNBRUQsZUFBZSxDQUFDLE9BQU87QUFBQSxJQUM3QixLQUFLO0FBQUEsTUFBTyxPQUFPO0FBQUEsSUFDbkIsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUNuQixPQUFPLEtBQUssTUFBTTtBQUFBLElBQ2xCLE9BQU8sVUFBVSxNQUFNO0FBQUEsSUFDdkIsT0FBTyxTQUFTLE1BQU07QUFBQSxJQUN0QixPQUFPLFVBQVUsTUFBTTtBQUFBLElBQ3ZCLE9BQU8sVUFBVSxNQUFNO0FBQUEsSUFDdkIsT0FBTztBQUFBO0FBQUEsRUFFUixJQUFJLEdBQUc7QUFBQSxJQUNOLEdBQUcsT0FBTyxjQUFjLEVBQUUsT0FBTztBQUFBLE1BQ2hDLElBQUksS0FBSztBQUFBLE1BQ1QsU0FBUyxLQUFLO0FBQUEsTUFDZCxRQUFRLEtBQUs7QUFBQSxNQUNiLFNBQVMsS0FBSztBQUFBLE1BQ2QsV0FBVyxLQUFLLFFBQVEsUUFBUTtBQUFBLElBQ2pDLENBQUMsRUFBRSxtQkFBbUI7QUFBQSxNQUNyQixRQUFRLGVBQWU7QUFBQSxNQUN2QixLQUFLO0FBQUEsUUFDSixTQUFTLEtBQUs7QUFBQSxRQUNkLFFBQVEsS0FBSztBQUFBLFFBQ2IsU0FBUyxLQUFLO0FBQUEsTUFDZjtBQUFBLElBQ0QsQ0FBQyxFQUFFLElBQUk7QUFBQSxJQUNQLE9BQU87QUFBQTtBQUFBLEVBRVIsTUFBTSxHQUFHO0FBQUEsSUFDUixHQUFHLE9BQU8sY0FBYyxFQUFFLE1BQU0sR0FBRyxlQUFlLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJO0FBQUE7QUFBQSxTQUU5RCxNQUFNLENBQUMsV0FBVztBQUFBLElBQ3hCLEdBQUcsT0FBTyxjQUFjLEVBQUUsTUFBTSxHQUFHLGVBQWUsSUFBSSxTQUFTLENBQUMsRUFBRSxJQUFJO0FBQUE7QUFFeEU7OztBQ3JEQSxJQUFJLGlCQUFpQixDQUFDO0FBQ3RCLFNBQVMsZ0JBQWdCO0FBQUEsRUFDeEIsaUJBQWlCLE1BQU07QUFBQSxFQUN2QixlQUFlLE1BQU07QUFBQSxFQUNyQixZQUFZLE1BQU07QUFDbkIsQ0FBQzs7O0FDWEQ7OztBQ01BLE1BQU0seUJBQXlCLGNBQWM7QUFBQSxFQUMzQyxXQUFXLENBQUMsUUFBUSxTQUFTLFFBQVEsV0FBVSxDQUFDLEdBQUc7QUFBQSxJQUNqRCxNQUFNLE9BQU87QUFBQSxJQUNiLEtBQUssU0FBUztBQUFBLElBQ2QsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLFNBQVMsU0FBUSxVQUFVLElBQUk7QUFBQTtBQUFBLFVBRTlCLGNBQWM7QUFBQSxFQUN0QjtBQUFBLEVBQ0EsSUFBSSxDQUFDLE9BQU87QUFBQSxJQUNWLEtBQUssT0FBTyxLQUFLLEtBQUs7QUFBQTtBQUFBLEVBRXhCLFlBQVksQ0FBQyxPQUFPLFFBQVEsZUFBZSx1QkFBdUIsb0JBQW9CO0FBQUEsSUFDcEYsTUFBTSxPQUFPLEtBQUssT0FBTyxRQUFRLE1BQU0sR0FBRztBQUFBLElBQzFDLE9BQU8sSUFBSSxjQUNULE1BQ0EsT0FDQSxLQUFLLFFBQ0wsUUFDQSxlQUNBLHVCQUNBLGtCQUNGO0FBQUE7QUFBQSxFQUVGLFdBQVcsQ0FBQyxhQUFhLFNBQVMsQ0FBQyxHQUFHO0FBQUEsSUFDcEMsTUFBTSxLQUFLLElBQUkscUJBQXFCLFFBQVEsS0FBSyxTQUFTLE1BQU0sS0FBSyxNQUFNO0FBQUEsSUFDM0UsSUFBSTtBQUFBLElBQ0osTUFBTSxXQUFXLEtBQUssT0FBTyxZQUFZLE1BQU07QUFBQSxNQUM3QyxTQUFTLFlBQVksRUFBRTtBQUFBLEtBQ3hCO0FBQUEsSUFDRCxTQUFTLE9BQU8sWUFBWSxZQUFZO0FBQUEsSUFDeEMsT0FBTztBQUFBO0FBRVg7QUFBQTtBQUNBLE1BQU0sNkJBQTZCLGtCQUFrQjtBQUFBLFVBQzNDLGNBQWM7QUFBQSxFQUN0QixXQUFXLENBQUMsYUFBYTtBQUFBLElBQ3ZCLE1BQU0sZ0JBQWdCLEtBQUssS0FBSztBQUFBLElBQ2hDLE1BQU0sS0FBSyxJQUFJLHFCQUFxQixRQUFRLEtBQUssU0FBUyxLQUFLLFNBQVMsS0FBSyxRQUFRLEtBQUssY0FBYyxDQUFDO0FBQUEsSUFDekcsS0FBSyxRQUFRLElBQUksSUFBSSxJQUFJLGFBQWEsZUFBZSxDQUFDO0FBQUEsSUFDdEQsSUFBSTtBQUFBLE1BQ0YsTUFBTSxTQUFTLFlBQVksRUFBRTtBQUFBLE1BQzdCLEtBQUssUUFBUSxJQUFJLElBQUksSUFBSSxxQkFBcUIsZUFBZSxDQUFDO0FBQUEsTUFDOUQsT0FBTztBQUFBLE1BQ1AsT0FBTyxLQUFLO0FBQUEsTUFDWixLQUFLLFFBQVEsSUFBSSxJQUFJLElBQUkseUJBQXlCLGVBQWUsQ0FBQztBQUFBLE1BQ2xFLE1BQU07QUFBQTtBQUFBO0FBR1o7QUFBQTtBQUNBLE1BQU0sc0JBQXNCLG9CQUFrQjtBQUFBLEVBQzVDLFdBQVcsQ0FBQyxNQUFNLE9BQU8sUUFBUSxRQUFRLGVBQWUsd0JBQXdCLG9CQUFvQjtBQUFBLElBQ2xHLE1BQU0sUUFBUSxlQUFlLEtBQUs7QUFBQSxJQUNsQyxLQUFLLE9BQU87QUFBQSxJQUNaLEtBQUssU0FBUztBQUFBLElBQ2QsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLHlCQUF5QjtBQUFBLElBQzlCLEtBQUsscUJBQXFCO0FBQUE7QUFBQSxVQUVwQixjQUFjO0FBQUEsRUFDdEIsR0FBRyxDQUFDLG1CQUFtQjtBQUFBLElBQ3JCLE1BQU0sU0FBUyxpQkFBaUIsS0FBSyxNQUFNLFFBQVEscUJBQXFCLENBQUMsQ0FBQztBQUFBLElBQzFFLEtBQUssT0FBTyxTQUFTLEtBQUssTUFBTSxLQUFLLE1BQU07QUFBQSxJQUMzQyxPQUFPLEtBQUssS0FBSyxJQUFJLEdBQUcsTUFBTTtBQUFBO0FBQUEsRUFFaEMsR0FBRyxDQUFDLG1CQUFtQjtBQUFBLElBQ3JCLFFBQVEsUUFBUSxPQUFPLFFBQVEscUJBQXFCLE1BQU0sdUJBQXVCO0FBQUEsSUFDakYsS0FBSyxXQUFXLG9CQUFvQjtBQUFBLE1BQ2xDLE1BQU0sU0FBUyxpQkFBaUIsTUFBTSxRQUFRLHFCQUFxQixDQUFDLENBQUM7QUFBQSxNQUNyRSxPQUFPLFNBQVMsTUFBTSxLQUFLLE1BQU07QUFBQSxNQUNqQyxPQUFPLEtBQUssSUFBSSxHQUFHLE1BQU07QUFBQSxJQUMzQjtBQUFBLElBQ0EsTUFBTSxPQUFPLEtBQUssT0FBTyxpQkFBaUI7QUFBQSxJQUMxQyxJQUFJLG9CQUFvQjtBQUFBLE1BQ3RCLE9BQU8sbUJBQW1CLElBQUk7QUFBQSxJQUNoQztBQUFBLElBQ0EsT0FBTyxLQUFLLElBQUksQ0FBQyxRQUFRLGFBQWEsUUFBUSxLQUFLLG1CQUFtQixDQUFDO0FBQUE7QUFBQSxFQUV6RSxHQUFHLENBQUMsbUJBQW1CO0FBQUEsSUFDckIsTUFBTSxTQUFTLGlCQUFpQixLQUFLLE1BQU0sUUFBUSxxQkFBcUIsQ0FBQyxDQUFDO0FBQUEsSUFDMUUsS0FBSyxPQUFPLFNBQVMsS0FBSyxNQUFNLEtBQUssTUFBTTtBQUFBLElBQzNDLE1BQU0sTUFBTSxLQUFLLEtBQUssT0FBTyxHQUFHLE1BQU0sRUFBRTtBQUFBLElBQ3hDLEtBQUssS0FBSztBQUFBLE1BQ1I7QUFBQSxJQUNGO0FBQUEsSUFDQSxRQUFRLFFBQVEscUJBQXFCLHVCQUF1QjtBQUFBLElBQzVELEtBQUssV0FBVyxvQkFBb0I7QUFBQSxNQUNsQyxPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsSUFBSSxvQkFBb0I7QUFBQSxNQUN0QixPQUFPLG1CQUFtQixDQUFDLEdBQUcsQ0FBQztBQUFBLElBQ2pDO0FBQUEsSUFDQSxPQUFPLGFBQWEsUUFBUSxLQUFLLG1CQUFtQjtBQUFBO0FBQUEsRUFFdEQsTUFBTSxDQUFDLG1CQUFtQjtBQUFBLElBQ3hCLE1BQU0sU0FBUyxpQkFBaUIsS0FBSyxNQUFNLFFBQVEscUJBQXFCLENBQUMsQ0FBQztBQUFBLElBQzFFLEtBQUssT0FBTyxTQUFTLEtBQUssTUFBTSxLQUFLLE1BQU07QUFBQSxJQUMzQyxPQUFPLEtBQUssS0FBSyxPQUFPLEdBQUcsTUFBTTtBQUFBO0FBQUEsRUFHbkMscUJBQXFCLEdBQUc7QUFBQSxJQUN0QixPQUFPLEtBQUs7QUFBQTtBQUVoQjs7O0FEbEdBLE1BQU0sMEJBQTBCLG1CQUFtQjtBQUFBLFVBQ3pDLGNBQWM7QUFDeEI7QUFDQSxTQUFTLFNBQVMsQ0FBQyxRQUFRLFNBQVMsQ0FBQyxHQUFHO0FBQUEsRUFDdEMsTUFBTSxVQUFVLElBQUksa0JBQWtCLEVBQUUsUUFBUSxPQUFPLE9BQU8sQ0FBQztBQUFBLEVBQy9ELElBQUk7QUFBQSxFQUNKLElBQUksT0FBTyxXQUFXLE1BQU07QUFBQSxJQUMxQixTQUFTLElBQUk7QUFBQSxFQUNmLEVBQU8sU0FBSSxPQUFPLFdBQVcsT0FBTztBQUFBLElBQ2xDLFNBQVMsT0FBTztBQUFBLEVBQ2xCO0FBQUEsRUFDQSxJQUFJO0FBQUEsRUFDSixJQUFJLE9BQU8sUUFBUTtBQUFBLElBQ2pCLE1BQU0sZUFBZSw4QkFDbkIsT0FBTyxRQUNQLDJCQUNGO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUCxZQUFZLE9BQU87QUFBQSxNQUNuQixRQUFRLGFBQWE7QUFBQSxNQUNyQixlQUFlLGFBQWE7QUFBQSxJQUM5QjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLE1BQU0sVUFBVSxJQUFJLGlCQUFpQixRQUFRLFNBQVMsUUFBUSxFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQ3hFLE1BQU0sTUFBSyxJQUFJLGtCQUFrQixRQUFRLFNBQVMsU0FBUyxNQUFNO0FBQUEsRUFDakUsSUFBRyxVQUFVO0FBQUEsRUFDYixPQUFPO0FBQUE7QUFFVCxTQUFTLE9BQU8sSUFBSSxRQUFRO0FBQUEsRUFDMUIsSUFBSSxPQUFPLE9BQVksYUFBSyxPQUFPLE9BQU8sT0FBTyxVQUFVO0FBQUEsSUFDekQsTUFBTSxXQUFXLE9BQU8sT0FBWSxZQUFJLElBQUksV0FBYSxJQUFJLFNBQVMsT0FBTyxFQUFFO0FBQUEsSUFDL0UsT0FBTyxVQUFVLFVBQVUsT0FBTyxFQUFFO0FBQUEsRUFDdEM7QUFBQSxFQUNBLElBQUksU0FBUyxPQUFPLEVBQUUsR0FBRztBQUFBLElBQ3ZCLFFBQVEsWUFBWSxXQUFXLGtCQUFrQixPQUFPO0FBQUEsSUFDeEQsSUFBSTtBQUFBLE1BQVEsT0FBTyxVQUFVLFFBQVEsYUFBYTtBQUFBLElBQ2xELElBQUksT0FBTyxlQUFlLFVBQVU7QUFBQSxNQUNsQyxRQUFRLFdBQVcsU0FBUztBQUFBLE1BQzVCLE1BQU0sV0FBVSxPQUFPLE9BQU8sSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLE1BQVcsU0FBQyxFQUFFLFNBQVMsT0FBWTtBQUFBLE1BQ3JGLE1BQU0sWUFBWSxJQUFJLFNBQVMsUUFBUSxRQUFPO0FBQUEsTUFDOUMsT0FBTyxVQUFVLFdBQVcsYUFBYTtBQUFBLElBQzNDO0FBQUEsSUFDQSxNQUFNLFdBQVcsSUFBSSxTQUFTLFVBQVU7QUFBQSxJQUN4QyxPQUFPLFVBQVUsVUFBVSxhQUFhO0FBQUEsRUFDMUM7QUFBQSxFQUNBLE9BQU8sVUFBVSxPQUFPLElBQUksT0FBTyxFQUFFO0FBQUE7QUFBQSxDQUV0QyxDQUFDLGFBQWE7QUFBQSxFQUNiLFNBQVMsSUFBSSxDQUFDLFFBQVE7QUFBQSxJQUNwQixPQUFPLFVBQVUsQ0FBQyxHQUFHLE1BQU07QUFBQTtBQUFBLEVBRTdCLFNBQVMsT0FBTztBQUFBLEdBQ2YsWUFBWSxVQUFVLENBQUMsRUFBRTs7O0FFekQ1QixxQkFBUztBQUNUO0FBR0EsSUFBTSxVQUFVLFFBQVEsSUFBSSxnQkFBZ0IsS0FBSyxRQUFRLElBQUksR0FBRyxvQkFBb0I7QUFDcEYsUUFBUSxJQUFJLGtCQUFrQixPQUFPO0FBQ3JDLElBQU0sU0FBUyxJQUFJLFVBQVMsT0FBTztBQUNuQyxJQUFNLEtBQUssUUFBUSxRQUFRLEVBQUUsUUFBUTtBQUFBLEVBQ3BDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNELEVBQUUsQ0FBQzs7O0FDWkgsSUFBSSxrQkFBa0IsTUFBTSxpQkFBZ0I7QUFBQSxTQUNwQyxhQUFhLENBQUMsV0FBVztBQUFBLElBQy9CLHVCQUF1QixJQUFJLE9BQVMsVUFBVTtBQUFBO0FBQUEsU0FFeEMsU0FBUyxDQUFDLFdBQVc7QUFBQSxJQUMzQixNQUFNLFVBQVUsVUFBVSxVQUFVLFdBQVc7QUFBQSxJQUMvQyxPQUFPLE9BQU8sUUFBUSxRQUFRLFdBQVcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRO0FBQUE7QUFBQSxTQUUzRCxrQkFBa0IsQ0FBQyxXQUFXO0FBQUEsSUFDcEMsT0FBTyxLQUFLLFVBQVUsU0FBUyxFQUFFLFdBQVcsS0FBSyxLQUFLLFNBQVMsV0FBVyxZQUFZO0FBQUE7QUFBQSxTQUVoRixTQUFTLENBQUMsV0FBVztBQUFBLElBQzNCLE9BQU87QUFBQSxNQUNOLGNBQWMsVUFBVTtBQUFBLE1BQ3hCLGVBQWUsVUFBVTtBQUFBLE1BQ3pCLGFBQWEsVUFBVSxVQUFVLFFBQVEsSUFBSSxLQUFLLElBQUksS0FBSztBQUFBLElBQzVEO0FBQUE7QUFBQSxTQUVNLFFBQVEsQ0FBQyxXQUFXLE9BQU87QUFBQSxJQUNqQyxPQUFPLEtBQUssVUFBVSxTQUFTLEVBQUUsU0FBUyxLQUFLO0FBQUE7QUFBQSxTQUV6QyxZQUFZLENBQUMsV0FBVyxRQUFRO0FBQUEsSUFDdEMsTUFBTSxNQUFNLEtBQUssVUFBVSxTQUFTO0FBQUEsSUFDcEMsT0FBTyxPQUFPLE1BQU0sQ0FBQyxVQUFVLElBQUksU0FBUyxLQUFLLENBQUM7QUFBQTtBQUFBLFNBRTVDLElBQUksQ0FBQyxJQUFJO0FBQUEsSUFDZixNQUFNLFNBQVMsR0FBRyxPQUFPLEVBQUUsS0FBSyxVQUFVLEVBQUUsTUFBTSxHQUFHLFdBQVcsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJO0FBQUEsSUFDdEYsTUFBTSxJQUFJLEtBQUssaUJBQWlCLE1BQU07QUFBQSxJQUN0QyxPQUFPLElBQUksRUFBRSxLQUFVO0FBQUE7QUFBQSxTQUVqQixVQUFVLENBQUMsTUFBTTtBQUFBLElBQ3ZCLE1BQU0sU0FBUyxHQUFHLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRSxNQUFNLEdBQUcsV0FBVyxRQUFRLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSTtBQUFBLElBQ3RGLE9BQU8sS0FBSyxpQkFBaUIsTUFBTTtBQUFBO0FBQUEsU0FFN0Isa0JBQWtCLENBQUMsUUFBUSxPQUFPO0FBQUEsSUFDeEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxFQUFFLEtBQUssVUFBVSxFQUFFLE1BQU0sSUFBSSxHQUFHLFdBQVcsUUFBUSxNQUFNLEdBQUcsR0FBRyxXQUFXLE9BQU8sS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJO0FBQUEsSUFDaEksTUFBTSxJQUFJLEtBQUssaUJBQWlCLE1BQU07QUFBQSxJQUN0QyxPQUFPLElBQUksRUFBRSxLQUFVO0FBQUE7QUFBQSxTQUVqQixVQUFVLENBQUMsUUFBUSxNQUFNO0FBQUEsSUFDL0IsTUFBTSxTQUFTLEdBQUcsT0FBTyxFQUFFLEtBQUssVUFBVSxFQUFFLE1BQU0sSUFBSSxHQUFHLFdBQVcsTUFBTSxJQUFJLEdBQUcsR0FBRyxXQUFXLFFBQVEsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJO0FBQUEsSUFDOUgsTUFBTSxJQUFJLEtBQUssaUJBQWlCLE1BQU07QUFBQSxJQUN0QyxPQUFPLElBQUksRUFBRSxLQUFVO0FBQUE7QUFBQSxTQUVqQixPQUFPLEdBQUc7QUFBQSxJQUNoQixNQUFNLFNBQVMsR0FBRyxPQUFPLEVBQUUsS0FBSyxVQUFVLEVBQUUsSUFBSTtBQUFBLElBQ2hELE9BQU8sS0FBSyxpQkFBaUIsTUFBTTtBQUFBO0FBQUEsU0FFN0IsTUFBTSxDQUFDLE9BQU8sTUFBTSxNQUFNLFFBQVE7QUFBQSxJQUN4QyxPQUFPLEtBQUssS0FBSztBQUFBLE1BQ2hCO0FBQUEsTUFDQSxRQUFRLEtBQUs7QUFBQSxNQUNiLGFBQWEsT0FBTztBQUFBLE1BQ3BCLDJCQUEyQixJQUFJLEtBQUssT0FBTyxhQUFhLElBQUc7QUFBQSxNQUMzRCxjQUFjLE9BQU87QUFBQSxNQUNyQjtBQUFBLE1BQ0EsMkJBQTJCLElBQUk7QUFBQSxJQUNoQyxDQUFDO0FBQUE7QUFBQSxTQUVLLGdCQUFnQixDQUFDLE9BQU87QUFBQSxJQUM5QixLQUFLO0FBQUEsTUFBTyxPQUFPLENBQUM7QUFBQSxJQUNwQixJQUFJLE1BQU0sUUFBUSxLQUFLO0FBQUEsTUFBRyxPQUFPLE1BQU0sSUFBSSxDQUFDLGNBQWM7QUFBQSxRQUN6RCxPQUFPO0FBQUEsVUFDTixJQUFJLFVBQVU7QUFBQSxVQUNkLE9BQU8sVUFBVTtBQUFBLFVBQ2pCLFFBQVEsVUFBVTtBQUFBLFVBQ2xCLGFBQWEsVUFBVTtBQUFBLFVBQ3ZCLFdBQVcsSUFBSSxLQUFLLFVBQVUsU0FBUztBQUFBLFVBQ3ZDLGNBQWMsVUFBVTtBQUFBLFVBQ3hCLE1BQU0sVUFBVTtBQUFBLFVBQ2hCLFdBQVcsSUFBSSxLQUFLLFVBQVUsU0FBUztBQUFBLFVBQ3ZDLFdBQVcsSUFBSSxLQUFLLFVBQVUsU0FBUztBQUFBLFFBQ3hDO0FBQUEsT0FDQTtBQUFBLElBQ0k7QUFBQSxhQUFPLENBQUM7QUFBQSxRQUNaLElBQUksTUFBTTtBQUFBLFFBQ1YsT0FBTyxNQUFNO0FBQUEsUUFDYixRQUFRLE1BQU07QUFBQSxRQUNkLGFBQWEsTUFBTTtBQUFBLFFBQ25CLFdBQVcsSUFBSSxLQUFLLE1BQU0sU0FBUztBQUFBLFFBQ25DLGNBQWMsTUFBTTtBQUFBLFFBQ3BCLE1BQU0sTUFBTTtBQUFBLFFBQ1osV0FBVyxJQUFJLEtBQUssTUFBTSxTQUFTO0FBQUEsUUFDbkMsV0FBVyxJQUFJLEtBQUssTUFBTSxTQUFTO0FBQUEsTUFDcEMsQ0FBQztBQUFBO0FBQUEsU0FFSyxJQUFJLENBQUMsV0FBVztBQUFBLElBQ3RCLEdBQUcsT0FBTyxVQUFVLEVBQUUsT0FBTztBQUFBLE1BQzVCLElBQUksVUFBVTtBQUFBLE1BQ2QsT0FBTyxVQUFVO0FBQUEsTUFDakIsUUFBUSxVQUFVO0FBQUEsTUFDbEIsTUFBTSxVQUFVO0FBQUEsTUFDaEIsYUFBYSxVQUFVO0FBQUEsTUFDdkIsV0FBVyxVQUFVLFVBQVUsUUFBUTtBQUFBLE1BQ3ZDLGNBQWMsVUFBVTtBQUFBLE1BQ3hCLFdBQVcsS0FBSyxJQUFJO0FBQUEsTUFDcEIsV0FBVyxLQUFLLElBQUk7QUFBQSxJQUNyQixDQUFDLEVBQUUsbUJBQW1CO0FBQUEsTUFDckIsUUFBUSxXQUFXO0FBQUEsTUFDbkIsS0FBSztBQUFBLFFBQ0osT0FBTyxVQUFVO0FBQUEsUUFDakIsUUFBUSxVQUFVO0FBQUEsUUFDbEIsTUFBTSxVQUFVO0FBQUEsUUFDaEIsYUFBYSxVQUFVO0FBQUEsUUFDdkIsV0FBVyxVQUFVLFVBQVUsUUFBUTtBQUFBLFFBQ3ZDLGNBQWMsVUFBVTtBQUFBLFFBQ3hCLFdBQVcsS0FBSyxJQUFJO0FBQUEsTUFDckI7QUFBQSxJQUNELENBQUMsRUFBRSxJQUFJO0FBQUEsSUFDUCxPQUFPLGlCQUFnQixtQkFBbUIsVUFBVSxRQUFRLFVBQVUsS0FBSztBQUFBO0FBQUEsU0FFckUsTUFBTSxDQUFDLFdBQVc7QUFBQSxJQUN4QixHQUFHLE9BQU8sVUFBVSxFQUFFLE1BQU0sR0FBRyxXQUFXLElBQUksVUFBVSxFQUFFLENBQUMsRUFBRSxJQUFJO0FBQUE7QUFBQSxjQUVyRCxjQUFhLENBQUMsV0FBVyxRQUFRO0FBQUEsSUFDN0MsTUFBTSxTQUFTLE1BQU0sUUFBUSxFQUFFLGVBQWUsVUFBVSxhQUFhLEdBQUcsTUFBTTtBQUFBLElBQzlFLE1BQU0sVUFBVSxNQUFNLGNBQWMsT0FBTyxZQUFZO0FBQUEsSUFDdkQsS0FBSyxTQUFTO0FBQUEsTUFDYixRQUFRLE1BQU0sMENBQTBDLFVBQVUsT0FBTztBQUFBLE1BQ3pFLE9BQU87QUFBQSxJQUNSO0FBQUEsSUFDQSxVQUFVLGNBQWMsT0FBTztBQUFBLElBQy9CLFVBQVUsWUFBWSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxhQUFhLElBQUc7QUFBQSxJQUNuRSxVQUFVLGVBQWUsT0FBTztBQUFBLElBQ2hDLEtBQUssS0FBSyxTQUFTO0FBQUEsSUFDbkIsT0FBTztBQUFBO0FBRVQ7OztBQ2hJQSxJQUFNLHdCQUF3QixJQUFJO0FBQ2xDLFNBQVMsVUFBVSxHQUFHO0FBQUEsRUFDckIsTUFBTSxNQUFNLEtBQUssSUFBSTtBQUFBLEVBQ3JCLFlBQVksS0FBSyxVQUFVO0FBQUEsSUFBTyxJQUFJLE1BQU0sVUFBVTtBQUFBLE1BQUssTUFBTSxPQUFPLEdBQUc7QUFBQTtBQUU1RSxZQUFZLFlBQVksT0FBTSxLQUFLLEVBQUU7QUFDckMsSUFBTSx1QkFBdUIsT0FBTSxLQUFLO0FBQ3hDLGVBQWUsUUFBUSxDQUFDLE1BQU0sYUFBYSxTQUFTLE9BQU8sTUFBTSxVQUFVLE9BQU8sZ0JBQWdCLHlCQUF5QixDQUFDLEdBQUc7QUFBQSxFQUM5SCxJQUFJO0FBQUEsSUFDSCxNQUFNLFVBQVU7QUFBQSxNQUNmLGNBQWMsUUFBUTtBQUFBLE1BQ3RCLFFBQVU7QUFBQSxJQUNYO0FBQUEsSUFDQSxJQUFJLFdBQVc7QUFBQSxNQUNkLEtBQUssZ0JBQWdCLGNBQWMsU0FBUyxHQUFHO0FBQUEsUUFDOUMsTUFBTSxnQkFBZ0IsY0FBYyxTQUFTO0FBQUEsUUFDN0MsS0FBSyxnQkFBZ0IsY0FBYyxTQUFTO0FBQUEsVUFBRyxNQUFNLElBQUksTUFBTSwwQ0FBMEMsVUFBVSxPQUFPO0FBQUEsTUFDM0g7QUFBQSxNQUNBLFFBQVEsbUJBQW1CLFVBQVUsVUFBVTtBQUFBLElBQ2hEO0FBQUEsSUFDQSxNQUFNLE9BQU87QUFBQSxNQUNaO0FBQUEsTUFDQSxRQUFRLFVBQVU7QUFBQSxNQUNsQixNQUFNLFFBQWE7QUFBQSxJQUNwQjtBQUFBLElBQ0EsTUFBTSxNQUFNLElBQUksSUFBSSxHQUFHLGlCQUFpQixLQUFLLFdBQVcsR0FBRyxJQUFJLE9BQU8sTUFBTSxNQUFNO0FBQUEsSUFDbEYsSUFBSSxhQUFhLElBQUksY0FBYyxhQUFhO0FBQUEsSUFDaEQsS0FBSyxXQUFXLEtBQUssV0FBVyxPQUFPO0FBQUEsTUFDdEMsTUFBTSxTQUFTLE1BQU0sSUFBSSxJQUFJLElBQUk7QUFBQSxNQUNqQyxJQUFJLFVBQVUsUUFBUSxVQUFVLEtBQUssSUFBSTtBQUFBLFFBQUcsT0FBTyxPQUFPO0FBQUEsSUFDM0Q7QUFBQSxJQUNBLE1BQU0sTUFBTSxNQUFNLE1BQU0sS0FBSyxJQUFJO0FBQUEsSUFDakMsTUFBTSxPQUFPLE1BQU0sSUFBSSxLQUFLO0FBQUEsSUFDNUIsS0FBSyxJQUFJLElBQUk7QUFBQSxNQUNaLFFBQVEsTUFBTSwwQkFBMEIsVUFBVSxJQUFJLFVBQVUsSUFBSSxpQkFBaUIsS0FBSyxVQUFVLElBQUksR0FBRztBQUFBLE1BQzNHLE9BQU87QUFBQSxJQUNSO0FBQUEsSUFDQSxJQUFJLEtBQUssV0FBVztBQUFBLE1BQU8sTUFBTSxJQUFJLElBQUksTUFBTTtBQUFBLFFBQzlDLFNBQVMsS0FBSyxJQUFJLElBQUksUUFBUSxJQUFJLFNBQVMsS0FBSyxJQUFJLEtBQUssT0FBTyxJQUFJLFFBQVEsSUFBSSxTQUFTLEtBQUssRUFBRSxDQUFDLEVBQUUsUUFBUSxLQUFLLEdBQUcsS0FBSyxJQUFJLElBQUksYUFBYTtBQUFBLFFBQzdJO0FBQUEsTUFDRCxDQUFDO0FBQUEsSUFDRCxPQUFPO0FBQUEsSUFDTixPQUFPLEtBQUs7QUFBQSxJQUNiLFFBQVEsTUFBTSwwQkFBMEIsVUFBVSxLQUFLLFVBQVUsR0FBRyxLQUFLLEdBQUc7QUFBQSxJQUM1RSxPQUFPO0FBQUE7QUFBQTs7O0FDM0NULElBQUksb0JBQW9CLENBQUM7QUFDekIsU0FBUyxtQkFBbUI7QUFBQSxFQUMzQiwwQkFBMEIsTUFBTTtBQUFBLEVBQ2hDLDJCQUEyQixNQUFNO0FBQUEsRUFDakMsNEJBQTRCLE1BQU07QUFBQSxFQUNsQyx3QkFBd0IsTUFBTTtBQUFBLEVBQzlCLG9CQUFvQixNQUFNO0FBQUEsRUFDMUIsd0JBQXdCLE1BQU07QUFBQSxFQUM5QixvQkFBb0IsTUFBTTtBQUFBLEVBQzFCLGtDQUFrQyxNQUFNO0FBQUEsRUFDeEMsZ0NBQWdDLE1BQU07QUFBQSxFQUN0Qyx5QkFBeUIsTUFBTTtBQUFBLEVBQy9CLHNCQUFzQixNQUFNO0FBQUEsRUFDNUIseUJBQXlCLE1BQU07QUFBQSxFQUMvQixzQkFBc0IsTUFBTTtBQUFBLEVBQzVCLG9CQUFvQixNQUFNO0FBQUEsRUFDMUIsMkJBQTJCLE1BQU07QUFBQSxFQUNqQyxvQkFBb0IsTUFBTTtBQUFBLEVBQzFCLHVCQUF1QixNQUFNO0FBQUEsRUFDN0Isd0JBQXdCLE1BQU07QUFBQSxFQUM5QixtQkFBbUIsTUFBTTtBQUFBLEVBQ3pCLHVCQUF1QixNQUFNO0FBQUEsRUFDN0Isb0JBQW9CLE1BQU07QUFBQSxFQUMxQixvQkFBb0IsTUFBTTtBQUFBLEVBQzFCLDJCQUEyQixNQUFNO0FBQUEsRUFDakMsZ0NBQWdDLE1BQU07QUFBQSxFQUN0QyxnQkFBZ0IsTUFBTTtBQUN2QixDQUFDO0FBQ0QsU0FBUyxzQkFBc0IsQ0FBQyxJQUFJO0FBQUEsRUFDbkMsT0FBTyxTQUFTLGVBQWUsS0FBSztBQUFBO0FBRXJDLFNBQVMsd0JBQXdCLENBQUMsS0FBSztBQUFBLEVBQ3RDLE9BQU8sU0FBUyw0QkFBaUMsV0FBRztBQUFBLElBQ25ELFFBQVE7QUFBQSxJQUNSLE1BQU0sS0FBSyxVQUFVLEdBQUc7QUFBQSxFQUN6QixDQUFDLEVBQUU7QUFBQTtBQUVKLFNBQVMscUJBQXFCLENBQUMsSUFBSTtBQUFBLEVBQ2xDLE9BQU8sU0FBUyxlQUFlLGNBQWM7QUFBQTtBQUU5QyxTQUFTLDhCQUE4QixDQUFDLElBQUk7QUFBQSxFQUMzQyxPQUFPLFNBQVMsZUFBZSx3QkFBd0I7QUFBQTtBQUV4RCxTQUFTLGNBQWMsQ0FBQyxJQUFJO0FBQUEsRUFDM0IsT0FBTyx5Q0FBeUM7QUFBQTtBQUVqRCxTQUFTLGlCQUFpQixDQUFDLFdBQVc7QUFBQSxFQUNyQyxLQUFLLGdCQUFnQixTQUFTLFdBQVcsMENBQTBDO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDN0YsT0FBTyxTQUFTLGVBQWUsVUFBVSxnQkFBZ0IsU0FBUztBQUFBO0FBRW5FLFNBQVMsa0JBQWtCLENBQUMsV0FBVztBQUFBLEVBQ3RDLEtBQUssZ0JBQWdCLFNBQVMsV0FBVywrQkFBK0I7QUFBQSxJQUFHLE9BQU87QUFBQSxFQUNsRixPQUFPLFNBQVMsZUFBZSxVQUFVLGlCQUFpQixTQUFTO0FBQUE7QUFFcEUsU0FBUyxxQkFBcUIsQ0FBQyxXQUFXO0FBQUEsRUFDekMsS0FBSyxnQkFBZ0IsU0FBUyxXQUFXLGtDQUFrQztBQUFBLElBQUcsT0FBTztBQUFBLEVBQ3JGLE9BQU8sU0FBUyxlQUFlLFVBQVUsb0JBQW9CLFNBQVM7QUFBQTtBQUV2RSxTQUFTLHlCQUF5QixDQUFDLFdBQVc7QUFBQSxFQUM3QyxLQUFLLGdCQUFnQixTQUFTLFdBQVcsc0NBQXNDO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDekYsT0FBTyxTQUFTLGVBQWUsVUFBVSx3QkFBd0IsU0FBUztBQUFBO0FBRTNFLFNBQVMsZ0NBQWdDLENBQUMsV0FBVztBQUFBLEVBQ3BELEtBQUssZ0JBQWdCLFNBQVMsV0FBVyxzQ0FBc0M7QUFBQSxJQUFHLE9BQU87QUFBQSxFQUN6RixPQUFPLFNBQVMsZUFBZSxVQUFVLGdDQUFnQyxTQUFTO0FBQUE7QUFFbkYsU0FBUyxrQkFBa0IsQ0FBQyxXQUFXO0FBQUEsRUFDdEMsS0FBSyxnQkFBZ0IsU0FBUyxXQUFXLCtCQUErQjtBQUFBLElBQUcsT0FBTztBQUFBLEVBQ2xGLE9BQU8sU0FBUyxlQUFlLFVBQVUsaUJBQWlCLFNBQVM7QUFBQTtBQUVwRSxTQUFTLHVCQUF1QixDQUFDLFdBQVc7QUFBQSxFQUMzQyxLQUFLLGdCQUFnQixTQUFTLFdBQVcsZ0NBQWdDO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDbkYsT0FBTyxTQUFTLGVBQWUsVUFBVSxrQkFBa0IsU0FBUztBQUFBO0FBRXJFLFNBQVMsc0JBQXNCLENBQUMsV0FBVztBQUFBLEVBQzFDLEtBQUssZ0JBQWdCLFNBQVMsV0FBVyxtQ0FBbUM7QUFBQSxJQUFHLE9BQU87QUFBQSxFQUN0RixPQUFPLFNBQVMsZUFBZSxVQUFVLHFCQUFxQixTQUFTO0FBQUE7QUFFeEUsU0FBUyx5QkFBeUIsQ0FBQyxXQUFXO0FBQUEsRUFDN0MsS0FBSyxnQkFBZ0IsU0FBUyxXQUFXLHdDQUF3QztBQUFBLElBQUcsT0FBTztBQUFBLEVBQzNGLE9BQU8sU0FBUyxlQUFlLFVBQVUsMEJBQTBCLFNBQVM7QUFBQTtBQUU3RSxTQUFTLGtCQUFrQixDQUFDLFdBQVc7QUFBQSxFQUN0QyxLQUFLLGdCQUFnQixTQUFTLFdBQVcsMkJBQTJCO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDOUUsT0FBTyxTQUFTLGVBQWUsVUFBVSxpQkFBaUIsU0FBUztBQUFBO0FBRXBFLFNBQVMsb0JBQW9CLENBQUMsV0FBVztBQUFBLEVBQ3hDLEtBQUssZ0JBQWdCLFNBQVMsV0FBVyw2QkFBNkI7QUFBQSxJQUFHLE9BQU87QUFBQSxFQUNoRixPQUFPLFNBQVMsZUFBZSxVQUFVLG1CQUFtQixTQUFTO0FBQUE7QUFFdEUsU0FBUyxrQkFBa0IsQ0FBQyxXQUFXO0FBQUEsRUFDdEMsS0FBSyxnQkFBZ0IsU0FBUyxXQUFXLDJCQUEyQjtBQUFBLElBQUcsT0FBTztBQUFBLEVBQzlFLE9BQU8sU0FBUyxlQUFlLFVBQVUsaUJBQWlCLFNBQVM7QUFBQTtBQUVwRSxTQUFTLDBCQUEwQixDQUFDLFdBQVcsS0FBSztBQUFBLEVBQ25ELEtBQUssZ0JBQWdCLFNBQVMsV0FBVywyQkFBMkI7QUFBQSxJQUFHLE9BQU87QUFBQSxFQUM5RSxPQUFPLFNBQVMsZUFBZSxVQUFVLDJCQUEyQixXQUFXO0FBQUEsSUFDOUUsUUFBUTtBQUFBLElBQ1IsTUFBTSxLQUFLLFVBQVUsR0FBRztBQUFBLEVBQ3pCLENBQUM7QUFBQTtBQUVGLFNBQVMsc0JBQXNCLENBQUMsV0FBVyxLQUFLO0FBQUEsRUFDL0MsS0FBSyxnQkFBZ0IsU0FBUyxXQUFXLDJCQUEyQjtBQUFBLElBQUcsT0FBTztBQUFBLEVBQzlFLE9BQU8sU0FBUyxlQUFlLFVBQVUsdUJBQXVCLFdBQVc7QUFBQSxJQUMxRSxRQUFRO0FBQUEsSUFDUixNQUFNLEtBQUssVUFBVSxHQUFHO0FBQUEsRUFDekIsQ0FBQztBQUFBO0FBRUYsU0FBUyxrQkFBa0IsQ0FBQyxXQUFXO0FBQUEsRUFDdEMsS0FBSyxnQkFBZ0IsU0FBUyxXQUFXLHFDQUFxQztBQUFBLElBQUcsT0FBTztBQUFBLEVBQ3hGLE9BQU8sU0FBUyxlQUFlLFVBQVUsaUJBQWlCLFNBQVM7QUFBQTtBQUVwRSxTQUFTLDhCQUE4QixDQUFDLFdBQVcsUUFBUTtBQUFBLEVBQzFELEtBQUssZ0JBQWdCLFNBQVMsV0FBVyxxQ0FBcUM7QUFBQSxJQUFHLE9BQU87QUFBQSxFQUN4RixPQUFPLFNBQVMsZUFBZSxVQUFVLDhCQUE4QixXQUFXO0FBQUEsSUFDakYsUUFBUTtBQUFBLElBQ1IsTUFBTSxLQUFLLFVBQVUsTUFBTTtBQUFBLEVBQzVCLENBQUM7QUFBQTtBQUVGLFNBQVMseUJBQXlCLENBQUMsV0FBVyxPQUFPLEdBQUc7QUFBQSxFQUN2RCxLQUFLLGdCQUFnQixTQUFTLFdBQVcscUNBQXFDO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDeEYsT0FBTyxTQUFTLGVBQWUsVUFBVSw4QkFBOEIsUUFBUSxTQUFTO0FBQUE7QUFFekYsU0FBUyxvQkFBb0IsQ0FBQyxXQUFXO0FBQUEsRUFDeEMsS0FBSyxnQkFBZ0IsU0FBUyxXQUFXLCtCQUErQjtBQUFBLElBQUcsT0FBTztBQUFBLEVBQ2xGLE9BQU8sU0FBUyxlQUFlLFVBQVUsbUJBQW1CLFNBQVM7QUFBQTtBQUV0RSxTQUFTLGtCQUFrQixDQUFDLFdBQVc7QUFBQSxFQUN0QyxLQUFLLGdCQUFnQixTQUFTLFdBQVcsNkJBQTZCO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDaEYsT0FBTyxTQUFTLGVBQWUsVUFBVSxpQkFBaUIsU0FBUztBQUFBO0FBRXBFLFNBQVMsdUJBQXVCLENBQUMsV0FBVztBQUFBLEVBQzNDLEtBQUssZ0JBQWdCLFNBQVMsV0FBVyxnQ0FBZ0M7QUFBQSxJQUFHLE9BQU87QUFBQSxFQUNuRixPQUFPLFNBQVMsZUFBZSxVQUFVLGVBQWUsU0FBUztBQUFBOzs7QUN0SWxFLElBQUksc0JBQXNCLENBQUM7QUFDM0IsU0FBUyxxQkFBcUI7QUFBQSxFQUM3QiwrQkFBK0IsTUFBTTtBQUFBLEVBQ3JDLDhCQUE4QixNQUFNO0FBQUEsRUFDcEMsMEJBQTBCLE1BQU07QUFBQSxFQUNoQyxzQkFBc0IsTUFBTTtBQUFBLEVBQzVCLG9CQUFvQixNQUFNO0FBQUEsRUFDMUIscUJBQXFCLE1BQU07QUFDNUIsQ0FBQztBQUNELGVBQWUsa0JBQWtCLENBQUMsSUFBSTtBQUFBLEVBQ3JDLE9BQU8sTUFBTSxTQUFTLGlCQUFpQixLQUFLO0FBQUE7QUFFN0MsZUFBZSw2QkFBNkIsQ0FBQyxJQUFJO0FBQUEsRUFDaEQsT0FBTyxNQUFNLFNBQVMsaUJBQWlCLHFCQUFxQjtBQUFBO0FBRTdELGVBQWUsbUJBQW1CLENBQUMsSUFBSTtBQUFBLEVBQ3RDLE9BQU8sTUFBTSxTQUFTLGlCQUFpQixXQUFXO0FBQUE7QUFFbkQsZUFBZSxvQkFBb0IsQ0FBQyxJQUFJLFdBQVc7QUFBQSxFQUNsRCxLQUFLLGdCQUFnQixTQUFTLFdBQVcsdUNBQXVDO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDMUYsT0FBTyxNQUFNLFNBQVMsaUJBQWlCLGNBQWMsU0FBUztBQUFBO0FBRS9ELGVBQWUsNEJBQTRCLENBQUMsSUFBSSxXQUFXLEtBQUs7QUFBQSxFQUMvRCxLQUFLLGdCQUFnQixTQUFTLFdBQVcsdUNBQXVDO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDMUYsT0FBTyxNQUFNLFNBQVMsaUJBQWlCLHdCQUF3QixXQUFXO0FBQUEsSUFDekUsUUFBUTtBQUFBLElBQ1IsTUFBTSxLQUFLLFVBQVUsR0FBRztBQUFBLEVBQ3pCLENBQUM7QUFBQTtBQUVGLGVBQWUsd0JBQXdCLENBQUMsSUFBSSxXQUFXLEtBQUs7QUFBQSxFQUMzRCxLQUFLLGdCQUFnQixTQUFTLFdBQVcsdUNBQXVDO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDMUYsT0FBTyxNQUFNLFNBQVMsaUJBQWlCLG9CQUFvQixXQUFXO0FBQUEsSUFDckUsUUFBUTtBQUFBLElBQ1IsTUFBTSxLQUFLLFVBQVUsR0FBRztBQUFBLEVBQ3pCLENBQUM7QUFBQTs7O0FDcENGLElBQUksbUJBQW1CLENBQUM7QUFDeEIsU0FBUyxrQkFBa0I7QUFBQSxFQUMxQix5QkFBeUIsTUFBTTtBQUFBLEVBQy9CLGlCQUFpQixNQUFNO0FBQUEsRUFDdkIsa0JBQWtCLE1BQU07QUFDekIsQ0FBQztBQUNELGVBQWUsZUFBZSxDQUFDLElBQUk7QUFBQSxFQUNsQyxPQUFPLE1BQU0sU0FBUyxjQUFjLEtBQUs7QUFBQTtBQUUxQyxlQUFlLHVCQUF1QixDQUFDLElBQUk7QUFBQSxFQUMxQyxPQUFPLE1BQU0sU0FBUyxjQUFjLGtCQUFrQjtBQUFBO0FBRXZELGVBQWUsZ0JBQWdCLENBQUMsSUFBSTtBQUFBLEVBQ25DLE9BQU8sTUFBTSxTQUFTLGNBQWMsV0FBVztBQUFBOzs7QUNSaEQsU0FBUyxzQkFBc0IsQ0FBQyxXQUFXO0FBQUEsRUFDMUMsS0FBSyxnQkFBZ0IsU0FBUyxXQUFXLCtCQUErQjtBQUFBLElBQUcsT0FBTztBQUFBLEVBQ2xGLE9BQU8sU0FBUyxlQUFlLFVBQVUsb0JBQW9CLFNBQVM7QUFBQTtBQU12RSxTQUFTLDJCQUEyQixDQUFDLGFBQWE7QUFBQSxFQUNqRCxNQUFNLHlCQUF5QixZQUFZLG9CQUFvQixZQUFZLGtCQUFrQixZQUFZO0FBQUEsRUFDekcsTUFBTSxpQ0FBaUMsSUFBSSxLQUFLLEdBQUcsUUFBUSxJQUFJLElBQUksS0FBSyxZQUFZLFVBQVUsRUFBRSxRQUFRLE1BQU0sSUFBSSxLQUFLLFlBQVksV0FBVyxFQUFFLFFBQVEsSUFBSSxJQUFJLEtBQUssWUFBWSxVQUFVLEVBQUUsUUFBUTtBQUFBLEVBQ3JNLE9BQU8seUJBQXlCLElBQUkseUJBQXlCO0FBQUE7OztBQ2I5RCxlQUFzQixHQUFHLENBQUMsU0FBeUI7QUFBQSxFQUNqRCxNQUFNLFVBQW1CLFFBQVEsTUFBTSxJQUFJLFNBQVM7QUFBQSxFQUNwRCxNQUFNLFdBQVcsSUFBSSxTQUFTLElBQUksRUFBRSxRQUFRLElBQUksQ0FBQztBQUFBLEVBRWpELElBQUk7QUFBQSxJQUNGLE1BQU0sV0FBVSxXQUFXLFFBQVEsT0FBTztBQUFBLElBQzFDLE1BQU0sa0JBQWtCLFNBQVE7QUFBQSxJQUNoQyxLQUFLLGlCQUFpQjtBQUFBLE1BQ3BCLE1BQU0sSUFBSSxNQUFNLGdEQUFnRDtBQUFBLElBQ2xFO0FBQUEsSUFFQSxNQUFNLG9CQUFvQixTQUFRO0FBQUEsSUFDbEMsTUFBTSxRQUFRLE1BQU0sUUFBUSxTQUFTLFFBQVE7QUFBQSxJQUM3QyxNQUFNLGNBQWMscUJBQXFCLE1BQU0sWUFBWTtBQUFBLElBQzNELElBQUkscUJBQXFCLFNBQVMsaUJBQWlCLE1BQU0sYUFBYTtBQUFBLE1BQ3BFLE1BQU0sSUFBSSxNQUFNLDBCQUEwQix5QkFBeUIsYUFBYTtBQUFBLElBQ2xGO0FBQUEsSUFFQSxJQUFJLE9BQU8sV0FBVyxnQkFBZ0IsZUFBZTtBQUFBLElBQ3JELElBQUksWUFBWSxnQkFBZ0IsbUJBQW1CLEtBQUssSUFBSSxPQUFPLFdBQVcsQ0FBQztBQUFBLElBRS9FLEtBQUssTUFBTTtBQUFBLE1BQ1QsT0FBTyxXQUFXLE9BQU8sZUFBZTtBQUFBLElBQzFDO0FBQUEsSUFFQSxLQUFLLE1BQU07QUFBQSxNQUNULE1BQU0sSUFBSSxNQUFNLHFEQUFxRCxpQkFBaUI7QUFBQSxJQUN4RjtBQUFBLElBRUEsS0FBSyxXQUFXO0FBQUEsTUFDZCxRQUFRLElBQUksb0NBQW9DLEtBQUssZUFBZSxhQUFhO0FBQUEsTUFDakYsTUFBTSxPQUFPLE1BQU0sa0JBQWEsdUJBQXVCLFdBQVc7QUFBQSxNQUNsRSxLQUFLLE1BQU07QUFBQSxRQUNULE1BQU0sSUFBSSxNQUFNLG9EQUFvRCwwQ0FBMEM7QUFBQSxNQUNoSDtBQUFBLE1BQ0EsWUFBWSxnQkFBZ0IsT0FBTyxhQUFhLEtBQUssUUFBUSxnQkFBZ0IsTUFBTSxLQUFLO0FBQUEsTUFHeEYsT0FBTyxXQUFXLGdCQUFnQixlQUFlO0FBQUEsTUFDakQsWUFBWSxnQkFBZ0IsbUJBQW1CLEtBQUssSUFBSSxPQUFPLFdBQVcsQ0FBQztBQUFBLE1BQzNFLEtBQUssV0FBVztBQUFBLFFBQ2QsTUFBTSxJQUFJLE1BQU0sZ0RBQWdELGFBQWE7QUFBQSxNQUMvRTtBQUFBLE1BRUEsS0FBSyxLQUFLLGlCQUFpQjtBQUFBLFFBQ3pCLEtBQUssa0JBQWtCLFVBQVU7QUFBQSxRQUNqQyxXQUFXLEtBQUssSUFBSTtBQUFBLE1BQ3RCO0FBQUEsSUFDRixFQUFPO0FBQUEsTUFFTCxRQUFRLElBQUksZ0NBQWdDLFVBQVUsU0FBUyxVQUFVLHVCQUF1QjtBQUFBLE1BQ2hHLFVBQVUsY0FBYyxNQUFNO0FBQUEsTUFDOUIsVUFBVSxZQUFZLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxNQUFNLGFBQWEsSUFBSTtBQUFBLE1BQ25FLFVBQVUsZUFBZSxNQUFNO0FBQUEsTUFDL0IsZ0JBQWdCLEtBQUssU0FBUztBQUFBO0FBQUEsSUFHaEMsVUFBVSxVQUFVLGVBQWUsS0FBSyxLQUFLLElBQUksS0FBSyxLQUFLLEtBQUssRUFBZ0I7QUFBQSxJQUNoRixTQUFTLFFBQVEsSUFBSSxZQUFZLGVBQWU7QUFBQSxJQUNoRCxPQUFPLEtBQUs7QUFBQSxJQUNaLFFBQVEsTUFBTSwrQkFBK0IsS0FBSztBQUFBLElBQ2xELFNBQVMsUUFBUSxJQUFJLFlBQVksYUFBYTtBQUFBLElBQzlDLE9BQU87QUFBQSxZQUVQO0FBQUEsSUFDQSxhQUFhLFVBQVUsV0FBVztBQUFBLElBQ2xDLGFBQWEsVUFBVSxhQUFhO0FBQUEsSUFDcEMsYUFBYSxVQUFVLE9BQU87QUFBQTtBQUFBLEVBR2hDLE9BQU87QUFBQTsiLAogICJkZWJ1Z0lkIjogIkFCOTM4RDc2NUZGNzMwNTc2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
diff --git a/packages/eve-web/build/api/auth/discordID/[discordID]/addScopes/characterID/[characterID]/scopes/[scopes].js b/packages/eve-web/build/api/auth/discordID/[discordID]/addScopes/characterID/[characterID]/scopes/[scopes].js
deleted file mode 100644
index cd14ee1..0000000
--- a/packages/eve-web/build/api/auth/discordID/[discordID]/addScopes/characterID/[characterID]/scopes/[scopes].js
+++ /dev/null
@@ -1,17861 +0,0 @@
-// @bun
-var __create = Object.create;
-var __getProtoOf = Object.getPrototypeOf;
-var __defProp = Object.defineProperty;
-var __getOwnPropNames = Object.getOwnPropertyNames;
-var __hasOwnProp = Object.prototype.hasOwnProperty;
-var __toESM = (mod, isNodeMode, target) => {
- target = mod != null ? __create(__getProtoOf(mod)) : {};
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
- for (let key of __getOwnPropNames(mod))
- if (!__hasOwnProp.call(to, key))
- __defProp(to, key, {
- get: () => mod[key],
- enumerable: true
- });
- return to;
-};
-var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
-var __require = import.meta.require;
-
-// ../eve/node_modules/safe-buffer/index.js
-var require_safe_buffer = __commonJS((exports, module) => {
- /*! safe-buffer. MIT License. Feross Aboukhadijeh */
- var buffer = __require("buffer");
- var Buffer2 = buffer.Buffer;
- function copyProps(src, dst) {
- for (var key in src) {
- dst[key] = src[key];
- }
- }
- if (Buffer2.from && Buffer2.alloc && Buffer2.allocUnsafe && Buffer2.allocUnsafeSlow) {
- module.exports = buffer;
- } else {
- copyProps(buffer, exports);
- exports.Buffer = SafeBuffer;
- }
- function SafeBuffer(arg, encodingOrOffset, length) {
- return Buffer2(arg, encodingOrOffset, length);
- }
- SafeBuffer.prototype = Object.create(Buffer2.prototype);
- copyProps(Buffer2, SafeBuffer);
- SafeBuffer.from = function(arg, encodingOrOffset, length) {
- if (typeof arg === "number") {
- throw new TypeError("Argument must not be a number");
- }
- return Buffer2(arg, encodingOrOffset, length);
- };
- SafeBuffer.alloc = function(size, fill, encoding) {
- if (typeof size !== "number") {
- throw new TypeError("Argument must be a number");
- }
- var buf = Buffer2(size);
- if (fill !== undefined) {
- if (typeof encoding === "string") {
- buf.fill(fill, encoding);
- } else {
- buf.fill(fill);
- }
- } else {
- buf.fill(0);
- }
- return buf;
- };
- SafeBuffer.allocUnsafe = function(size) {
- if (typeof size !== "number") {
- throw new TypeError("Argument must be a number");
- }
- return Buffer2(size);
- };
- SafeBuffer.allocUnsafeSlow = function(size) {
- if (typeof size !== "number") {
- throw new TypeError("Argument must be a number");
- }
- return buffer.SlowBuffer(size);
- };
-});
-
-// ../eve/node_modules/jws/lib/data-stream.js
-var require_data_stream = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var Stream = __require("stream");
- var util = __require("util");
- function DataStream(data) {
- this.buffer = null;
- this.writable = true;
- this.readable = true;
- if (!data) {
- this.buffer = Buffer2.alloc(0);
- return this;
- }
- if (typeof data.pipe === "function") {
- this.buffer = Buffer2.alloc(0);
- data.pipe(this);
- return this;
- }
- if (data.length || typeof data === "object") {
- this.buffer = data;
- this.writable = false;
- process.nextTick(function() {
- this.emit("end", data);
- this.readable = false;
- this.emit("close");
- }.bind(this));
- return this;
- }
- throw new TypeError("Unexpected data type (" + typeof data + ")");
- }
- util.inherits(DataStream, Stream);
- DataStream.prototype.write = function write(data) {
- this.buffer = Buffer2.concat([this.buffer, Buffer2.from(data)]);
- this.emit("data", data);
- };
- DataStream.prototype.end = function end(data) {
- if (data)
- this.write(data);
- this.emit("end", data);
- this.emit("close");
- this.writable = false;
- this.readable = false;
- };
- module.exports = DataStream;
-});
-
-// ../eve/node_modules/ecdsa-sig-formatter/src/param-bytes-for-alg.js
-var require_param_bytes_for_alg = __commonJS((exports, module) => {
- function getParamSize(keySize) {
- var result = (keySize / 8 | 0) + (keySize % 8 === 0 ? 0 : 1);
- return result;
- }
- var paramBytesForAlg = {
- ES256: getParamSize(256),
- ES384: getParamSize(384),
- ES512: getParamSize(521)
- };
- function getParamBytesForAlg(alg) {
- var paramBytes = paramBytesForAlg[alg];
- if (paramBytes) {
- return paramBytes;
- }
- throw new Error('Unknown algorithm "' + alg + '"');
- }
- module.exports = getParamBytesForAlg;
-});
-
-// ../eve/node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.js
-var require_ecdsa_sig_formatter = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var getParamBytesForAlg = require_param_bytes_for_alg();
- var MAX_OCTET = 128;
- var CLASS_UNIVERSAL = 0;
- var PRIMITIVE_BIT = 32;
- var TAG_SEQ = 16;
- var TAG_INT = 2;
- var ENCODED_TAG_SEQ = TAG_SEQ | PRIMITIVE_BIT | CLASS_UNIVERSAL << 6;
- var ENCODED_TAG_INT = TAG_INT | CLASS_UNIVERSAL << 6;
- function base64Url(base64) {
- return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
- }
- function signatureAsBuffer(signature) {
- if (Buffer2.isBuffer(signature)) {
- return signature;
- } else if (typeof signature === "string") {
- return Buffer2.from(signature, "base64");
- }
- throw new TypeError("ECDSA signature must be a Base64 string or a Buffer");
- }
- function derToJose(signature, alg) {
- signature = signatureAsBuffer(signature);
- var paramBytes = getParamBytesForAlg(alg);
- var maxEncodedParamLength = paramBytes + 1;
- var inputLength = signature.length;
- var offset = 0;
- if (signature[offset++] !== ENCODED_TAG_SEQ) {
- throw new Error('Could not find expected "seq"');
- }
- var seqLength = signature[offset++];
- if (seqLength === (MAX_OCTET | 1)) {
- seqLength = signature[offset++];
- }
- if (inputLength - offset < seqLength) {
- throw new Error('"seq" specified length of "' + seqLength + '", only "' + (inputLength - offset) + '" remaining');
- }
- if (signature[offset++] !== ENCODED_TAG_INT) {
- throw new Error('Could not find expected "int" for "r"');
- }
- var rLength = signature[offset++];
- if (inputLength - offset - 2 < rLength) {
- throw new Error('"r" specified length of "' + rLength + '", only "' + (inputLength - offset - 2) + '" available');
- }
- if (maxEncodedParamLength < rLength) {
- throw new Error('"r" specified length of "' + rLength + '", max of "' + maxEncodedParamLength + '" is acceptable');
- }
- var rOffset = offset;
- offset += rLength;
- if (signature[offset++] !== ENCODED_TAG_INT) {
- throw new Error('Could not find expected "int" for "s"');
- }
- var sLength = signature[offset++];
- if (inputLength - offset !== sLength) {
- throw new Error('"s" specified length of "' + sLength + '", expected "' + (inputLength - offset) + '"');
- }
- if (maxEncodedParamLength < sLength) {
- throw new Error('"s" specified length of "' + sLength + '", max of "' + maxEncodedParamLength + '" is acceptable');
- }
- var sOffset = offset;
- offset += sLength;
- if (offset !== inputLength) {
- throw new Error('Expected to consume entire buffer, but "' + (inputLength - offset) + '" bytes remain');
- }
- var rPadding = paramBytes - rLength, sPadding = paramBytes - sLength;
- var dst = Buffer2.allocUnsafe(rPadding + rLength + sPadding + sLength);
- for (offset = 0;offset < rPadding; ++offset) {
- dst[offset] = 0;
- }
- signature.copy(dst, offset, rOffset + Math.max(-rPadding, 0), rOffset + rLength);
- offset = paramBytes;
- for (var o = offset;offset < o + sPadding; ++offset) {
- dst[offset] = 0;
- }
- signature.copy(dst, offset, sOffset + Math.max(-sPadding, 0), sOffset + sLength);
- dst = dst.toString("base64");
- dst = base64Url(dst);
- return dst;
- }
- function countPadding(buf, start, stop) {
- var padding = 0;
- while (start + padding < stop && buf[start + padding] === 0) {
- ++padding;
- }
- var needsSign = buf[start + padding] >= MAX_OCTET;
- if (needsSign) {
- --padding;
- }
- return padding;
- }
- function joseToDer(signature, alg) {
- signature = signatureAsBuffer(signature);
- var paramBytes = getParamBytesForAlg(alg);
- var signatureBytes = signature.length;
- if (signatureBytes !== paramBytes * 2) {
- throw new TypeError('"' + alg + '" signatures must be "' + paramBytes * 2 + '" bytes, saw "' + signatureBytes + '"');
- }
- var rPadding = countPadding(signature, 0, paramBytes);
- var sPadding = countPadding(signature, paramBytes, signature.length);
- var rLength = paramBytes - rPadding;
- var sLength = paramBytes - sPadding;
- var rsBytes = 1 + 1 + rLength + 1 + 1 + sLength;
- var shortLength = rsBytes < MAX_OCTET;
- var dst = Buffer2.allocUnsafe((shortLength ? 2 : 3) + rsBytes);
- var offset = 0;
- dst[offset++] = ENCODED_TAG_SEQ;
- if (shortLength) {
- dst[offset++] = rsBytes;
- } else {
- dst[offset++] = MAX_OCTET | 1;
- dst[offset++] = rsBytes & 255;
- }
- dst[offset++] = ENCODED_TAG_INT;
- dst[offset++] = rLength;
- if (rPadding < 0) {
- dst[offset++] = 0;
- offset += signature.copy(dst, offset, 0, paramBytes);
- } else {
- offset += signature.copy(dst, offset, rPadding, paramBytes);
- }
- dst[offset++] = ENCODED_TAG_INT;
- dst[offset++] = sLength;
- if (sPadding < 0) {
- dst[offset++] = 0;
- signature.copy(dst, offset, paramBytes);
- } else {
- signature.copy(dst, offset, paramBytes + sPadding);
- }
- return dst;
- }
- module.exports = {
- derToJose,
- joseToDer
- };
-});
-
-// ../eve/node_modules/buffer-equal-constant-time/index.js
-var require_buffer_equal_constant_time = __commonJS((exports, module) => {
- var Buffer2 = __require("buffer").Buffer;
- var SlowBuffer = __require("buffer").SlowBuffer;
- module.exports = bufferEq;
- function bufferEq(a, b) {
- if (!Buffer2.isBuffer(a) || !Buffer2.isBuffer(b)) {
- return false;
- }
- if (a.length !== b.length) {
- return false;
- }
- var c = 0;
- for (var i = 0;i < a.length; i++) {
- c |= a[i] ^ b[i];
- }
- return c === 0;
- }
- bufferEq.install = function() {
- Buffer2.prototype.equal = SlowBuffer.prototype.equal = function equal(that) {
- return bufferEq(this, that);
- };
- };
- var origBufEqual = Buffer2.prototype.equal;
- var origSlowBufEqual = SlowBuffer.prototype.equal;
- bufferEq.restore = function() {
- Buffer2.prototype.equal = origBufEqual;
- SlowBuffer.prototype.equal = origSlowBufEqual;
- };
-});
-
-// ../eve/node_modules/jwa/index.js
-var require_jwa = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var crypto2 = __require("crypto");
- var formatEcdsa = require_ecdsa_sig_formatter();
- var util = __require("util");
- var MSG_INVALID_ALGORITHM = `"%s" is not a valid algorithm.
- Supported algorithms are:
- "HS256", "HS384", "HS512", "RS256", "RS384", "RS512", "PS256", "PS384", "PS512", "ES256", "ES384", "ES512" and "none".`;
- var MSG_INVALID_SECRET = "secret must be a string or buffer";
- var MSG_INVALID_VERIFIER_KEY = "key must be a string or a buffer";
- var MSG_INVALID_SIGNER_KEY = "key must be a string, a buffer or an object";
- var supportsKeyObjects = typeof crypto2.createPublicKey === "function";
- if (supportsKeyObjects) {
- MSG_INVALID_VERIFIER_KEY += " or a KeyObject";
- MSG_INVALID_SECRET += "or a KeyObject";
- }
- function checkIsPublicKey(key) {
- if (Buffer2.isBuffer(key)) {
- return;
- }
- if (typeof key === "string") {
- return;
- }
- if (!supportsKeyObjects) {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key !== "object") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key.type !== "string") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key.asymmetricKeyType !== "string") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key.export !== "function") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- }
- function checkIsPrivateKey(key) {
- if (Buffer2.isBuffer(key)) {
- return;
- }
- if (typeof key === "string") {
- return;
- }
- if (typeof key === "object") {
- return;
- }
- throw typeError(MSG_INVALID_SIGNER_KEY);
- }
- function checkIsSecretKey(key) {
- if (Buffer2.isBuffer(key)) {
- return;
- }
- if (typeof key === "string") {
- return key;
- }
- if (!supportsKeyObjects) {
- throw typeError(MSG_INVALID_SECRET);
- }
- if (typeof key !== "object") {
- throw typeError(MSG_INVALID_SECRET);
- }
- if (key.type !== "secret") {
- throw typeError(MSG_INVALID_SECRET);
- }
- if (typeof key.export !== "function") {
- throw typeError(MSG_INVALID_SECRET);
- }
- }
- function fromBase64(base64) {
- return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
- }
- function toBase64(base64url) {
- base64url = base64url.toString();
- var padding = 4 - base64url.length % 4;
- if (padding !== 4) {
- for (var i = 0;i < padding; ++i) {
- base64url += "=";
- }
- }
- return base64url.replace(/\-/g, "+").replace(/_/g, "/");
- }
- function typeError(template) {
- var args = [].slice.call(arguments, 1);
- var errMsg = util.format.bind(util, template).apply(null, args);
- return new TypeError(errMsg);
- }
- function bufferOrString(obj) {
- return Buffer2.isBuffer(obj) || typeof obj === "string";
- }
- function normalizeInput(thing) {
- if (!bufferOrString(thing))
- thing = JSON.stringify(thing);
- return thing;
- }
- function createHmacSigner(bits) {
- return function sign(thing, secret) {
- checkIsSecretKey(secret);
- thing = normalizeInput(thing);
- var hmac = crypto2.createHmac("sha" + bits, secret);
- var sig = (hmac.update(thing), hmac.digest("base64"));
- return fromBase64(sig);
- };
- }
- var bufferEqual;
- var timingSafeEqual = "timingSafeEqual" in crypto2 ? function timingSafeEqual(a, b) {
- if (a.byteLength !== b.byteLength) {
- return false;
- }
- return crypto2.timingSafeEqual(a, b);
- } : function timingSafeEqual(a, b) {
- if (!bufferEqual) {
- bufferEqual = require_buffer_equal_constant_time();
- }
- return bufferEqual(a, b);
- };
- function createHmacVerifier(bits) {
- return function verify(thing, signature, secret) {
- var computedSig = createHmacSigner(bits)(thing, secret);
- return timingSafeEqual(Buffer2.from(signature), Buffer2.from(computedSig));
- };
- }
- function createKeySigner(bits) {
- return function sign(thing, privateKey) {
- checkIsPrivateKey(privateKey);
- thing = normalizeInput(thing);
- var signer = crypto2.createSign("RSA-SHA" + bits);
- var sig = (signer.update(thing), signer.sign(privateKey, "base64"));
- return fromBase64(sig);
- };
- }
- function createKeyVerifier(bits) {
- return function verify(thing, signature, publicKey) {
- checkIsPublicKey(publicKey);
- thing = normalizeInput(thing);
- signature = toBase64(signature);
- var verifier = crypto2.createVerify("RSA-SHA" + bits);
- verifier.update(thing);
- return verifier.verify(publicKey, signature, "base64");
- };
- }
- function createPSSKeySigner(bits) {
- return function sign(thing, privateKey) {
- checkIsPrivateKey(privateKey);
- thing = normalizeInput(thing);
- var signer = crypto2.createSign("RSA-SHA" + bits);
- var sig = (signer.update(thing), signer.sign({
- key: privateKey,
- padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
- saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
- }, "base64"));
- return fromBase64(sig);
- };
- }
- function createPSSKeyVerifier(bits) {
- return function verify(thing, signature, publicKey) {
- checkIsPublicKey(publicKey);
- thing = normalizeInput(thing);
- signature = toBase64(signature);
- var verifier = crypto2.createVerify("RSA-SHA" + bits);
- verifier.update(thing);
- return verifier.verify({
- key: publicKey,
- padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
- saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
- }, signature, "base64");
- };
- }
- function createECDSASigner(bits) {
- var inner = createKeySigner(bits);
- return function sign() {
- var signature = inner.apply(null, arguments);
- signature = formatEcdsa.derToJose(signature, "ES" + bits);
- return signature;
- };
- }
- function createECDSAVerifer(bits) {
- var inner = createKeyVerifier(bits);
- return function verify(thing, signature, publicKey) {
- signature = formatEcdsa.joseToDer(signature, "ES" + bits).toString("base64");
- var result = inner(thing, signature, publicKey);
- return result;
- };
- }
- function createNoneSigner() {
- return function sign() {
- return "";
- };
- }
- function createNoneVerifier() {
- return function verify(thing, signature) {
- return signature === "";
- };
- }
- module.exports = function jwa(algorithm) {
- var signerFactories = {
- hs: createHmacSigner,
- rs: createKeySigner,
- ps: createPSSKeySigner,
- es: createECDSASigner,
- none: createNoneSigner
- };
- var verifierFactories = {
- hs: createHmacVerifier,
- rs: createKeyVerifier,
- ps: createPSSKeyVerifier,
- es: createECDSAVerifer,
- none: createNoneVerifier
- };
- var match = algorithm.match(/^(RS|PS|ES|HS)(256|384|512)$|^(none)$/i);
- if (!match)
- throw typeError(MSG_INVALID_ALGORITHM, algorithm);
- var algo = (match[1] || match[3]).toLowerCase();
- var bits = match[2];
- return {
- sign: signerFactories[algo](bits),
- verify: verifierFactories[algo](bits)
- };
- };
-});
-
-// ../eve/node_modules/jws/lib/tostring.js
-var require_tostring = __commonJS((exports, module) => {
- var Buffer2 = __require("buffer").Buffer;
- module.exports = function toString(obj) {
- if (typeof obj === "string")
- return obj;
- if (typeof obj === "number" || Buffer2.isBuffer(obj))
- return obj.toString();
- return JSON.stringify(obj);
- };
-});
-
-// ../eve/node_modules/jws/lib/sign-stream.js
-var require_sign_stream = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var DataStream = require_data_stream();
- var jwa = require_jwa();
- var Stream = __require("stream");
- var toString = require_tostring();
- var util = __require("util");
- function base64url(string, encoding) {
- return Buffer2.from(string, encoding).toString("base64").replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
- }
- function jwsSecuredInput(header, payload, encoding) {
- encoding = encoding || "utf8";
- var encodedHeader = base64url(toString(header), "binary");
- var encodedPayload = base64url(toString(payload), encoding);
- return util.format("%s.%s", encodedHeader, encodedPayload);
- }
- function jwsSign(opts) {
- var header = opts.header;
- var payload = opts.payload;
- var secretOrKey = opts.secret || opts.privateKey;
- var encoding = opts.encoding;
- var algo = jwa(header.alg);
- var securedInput = jwsSecuredInput(header, payload, encoding);
- var signature = algo.sign(securedInput, secretOrKey);
- return util.format("%s.%s", securedInput, signature);
- }
- function SignStream(opts) {
- var secret = opts.secret || opts.privateKey || opts.key;
- var secretStream = new DataStream(secret);
- this.readable = true;
- this.header = opts.header;
- this.encoding = opts.encoding;
- this.secret = this.privateKey = this.key = secretStream;
- this.payload = new DataStream(opts.payload);
- this.secret.once("close", function() {
- if (!this.payload.writable && this.readable)
- this.sign();
- }.bind(this));
- this.payload.once("close", function() {
- if (!this.secret.writable && this.readable)
- this.sign();
- }.bind(this));
- }
- util.inherits(SignStream, Stream);
- SignStream.prototype.sign = function sign() {
- try {
- var signature = jwsSign({
- header: this.header,
- payload: this.payload.buffer,
- secret: this.secret.buffer,
- encoding: this.encoding
- });
- this.emit("done", signature);
- this.emit("data", signature);
- this.emit("end");
- this.readable = false;
- return signature;
- } catch (e) {
- this.readable = false;
- this.emit("error", e);
- this.emit("close");
- }
- };
- SignStream.sign = jwsSign;
- module.exports = SignStream;
-});
-
-// ../eve/node_modules/jws/lib/verify-stream.js
-var require_verify_stream = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var DataStream = require_data_stream();
- var jwa = require_jwa();
- var Stream = __require("stream");
- var toString = require_tostring();
- var util = __require("util");
- var JWS_REGEX = /^[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?\.([a-zA-Z0-9\-_]+)?$/;
- function isObject(thing) {
- return Object.prototype.toString.call(thing) === "[object Object]";
- }
- function safeJsonParse(thing) {
- if (isObject(thing))
- return thing;
- try {
- return JSON.parse(thing);
- } catch (e) {
- return;
- }
- }
- function headerFromJWS(jwsSig) {
- var encodedHeader = jwsSig.split(".", 1)[0];
- return safeJsonParse(Buffer2.from(encodedHeader, "base64").toString("binary"));
- }
- function securedInputFromJWS(jwsSig) {
- return jwsSig.split(".", 2).join(".");
- }
- function signatureFromJWS(jwsSig) {
- return jwsSig.split(".")[2];
- }
- function payloadFromJWS(jwsSig, encoding) {
- encoding = encoding || "utf8";
- var payload = jwsSig.split(".")[1];
- return Buffer2.from(payload, "base64").toString(encoding);
- }
- function isValidJws(string) {
- return JWS_REGEX.test(string) && !!headerFromJWS(string);
- }
- function jwsVerify(jwsSig, algorithm, secretOrKey) {
- if (!algorithm) {
- var err = new Error("Missing algorithm parameter for jws.verify");
- err.code = "MISSING_ALGORITHM";
- throw err;
- }
- jwsSig = toString(jwsSig);
- var signature = signatureFromJWS(jwsSig);
- var securedInput = securedInputFromJWS(jwsSig);
- var algo = jwa(algorithm);
- return algo.verify(securedInput, signature, secretOrKey);
- }
- function jwsDecode(jwsSig, opts) {
- opts = opts || {};
- jwsSig = toString(jwsSig);
- if (!isValidJws(jwsSig))
- return null;
- var header = headerFromJWS(jwsSig);
- if (!header)
- return null;
- var payload = payloadFromJWS(jwsSig);
- if (header.typ === "JWT" || opts.json)
- payload = JSON.parse(payload, opts.encoding);
- return {
- header,
- payload,
- signature: signatureFromJWS(jwsSig)
- };
- }
- function VerifyStream(opts) {
- opts = opts || {};
- var secretOrKey = opts.secret || opts.publicKey || opts.key;
- var secretStream = new DataStream(secretOrKey);
- this.readable = true;
- this.algorithm = opts.algorithm;
- this.encoding = opts.encoding;
- this.secret = this.publicKey = this.key = secretStream;
- this.signature = new DataStream(opts.signature);
- this.secret.once("close", function() {
- if (!this.signature.writable && this.readable)
- this.verify();
- }.bind(this));
- this.signature.once("close", function() {
- if (!this.secret.writable && this.readable)
- this.verify();
- }.bind(this));
- }
- util.inherits(VerifyStream, Stream);
- VerifyStream.prototype.verify = function verify() {
- try {
- var valid = jwsVerify(this.signature.buffer, this.algorithm, this.key.buffer);
- var obj = jwsDecode(this.signature.buffer, this.encoding);
- this.emit("done", valid, obj);
- this.emit("data", valid);
- this.emit("end");
- this.readable = false;
- return valid;
- } catch (e) {
- this.readable = false;
- this.emit("error", e);
- this.emit("close");
- }
- };
- VerifyStream.decode = jwsDecode;
- VerifyStream.isValid = isValidJws;
- VerifyStream.verify = jwsVerify;
- module.exports = VerifyStream;
-});
-
-// ../eve/node_modules/jws/index.js
-var require_jws = __commonJS((exports) => {
- var SignStream = require_sign_stream();
- var VerifyStream = require_verify_stream();
- var ALGORITHMS = [
- "HS256",
- "HS384",
- "HS512",
- "RS256",
- "RS384",
- "RS512",
- "PS256",
- "PS384",
- "PS512",
- "ES256",
- "ES384",
- "ES512"
- ];
- exports.ALGORITHMS = ALGORITHMS;
- exports.sign = SignStream.sign;
- exports.verify = VerifyStream.verify;
- exports.decode = VerifyStream.decode;
- exports.isValid = VerifyStream.isValid;
- exports.createSign = function createSign(opts) {
- return new SignStream(opts);
- };
- exports.createVerify = function createVerify(opts) {
- return new VerifyStream(opts);
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/decode.js
-var require_decode = __commonJS((exports, module) => {
- var jws = require_jws();
- module.exports = function(jwt, options2) {
- options2 = options2 || {};
- var decoded = jws.decode(jwt, options2);
- if (!decoded) {
- return null;
- }
- var payload = decoded.payload;
- if (typeof payload === "string") {
- try {
- var obj = JSON.parse(payload);
- if (obj !== null && typeof obj === "object") {
- payload = obj;
- }
- } catch (e) {}
- }
- if (options2.complete === true) {
- return {
- header: decoded.header,
- payload,
- signature: decoded.signature
- };
- }
- return payload;
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/JsonWebTokenError.js
-var require_JsonWebTokenError = __commonJS((exports, module) => {
- var JsonWebTokenError = function(message, error) {
- Error.call(this, message);
- if (Error.captureStackTrace) {
- Error.captureStackTrace(this, this.constructor);
- }
- this.name = "JsonWebTokenError";
- this.message = message;
- if (error)
- this.inner = error;
- };
- JsonWebTokenError.prototype = Object.create(Error.prototype);
- JsonWebTokenError.prototype.constructor = JsonWebTokenError;
- module.exports = JsonWebTokenError;
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/NotBeforeError.js
-var require_NotBeforeError = __commonJS((exports, module) => {
- var JsonWebTokenError = require_JsonWebTokenError();
- var NotBeforeError = function(message, date) {
- JsonWebTokenError.call(this, message);
- this.name = "NotBeforeError";
- this.date = date;
- };
- NotBeforeError.prototype = Object.create(JsonWebTokenError.prototype);
- NotBeforeError.prototype.constructor = NotBeforeError;
- module.exports = NotBeforeError;
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/TokenExpiredError.js
-var require_TokenExpiredError = __commonJS((exports, module) => {
- var JsonWebTokenError = require_JsonWebTokenError();
- var TokenExpiredError = function(message, expiredAt) {
- JsonWebTokenError.call(this, message);
- this.name = "TokenExpiredError";
- this.expiredAt = expiredAt;
- };
- TokenExpiredError.prototype = Object.create(JsonWebTokenError.prototype);
- TokenExpiredError.prototype.constructor = TokenExpiredError;
- module.exports = TokenExpiredError;
-});
-
-// ../eve/node_modules/ms/index.js
-var require_ms = __commonJS((exports, module) => {
- var s = 1000;
- var m = s * 60;
- var h = m * 60;
- var d = h * 24;
- var w = d * 7;
- var y = d * 365.25;
- module.exports = function(val, options2) {
- options2 = options2 || {};
- var type = typeof val;
- if (type === "string" && val.length > 0) {
- return parse(val);
- } else if (type === "number" && isFinite(val)) {
- return options2.long ? fmtLong(val) : fmtShort(val);
- }
- throw new Error("val is not a non-empty string or a valid number. val=" + JSON.stringify(val));
- };
- function parse(str) {
- str = String(str);
- if (str.length > 100) {
- return;
- }
- var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);
- if (!match) {
- return;
- }
- var n = parseFloat(match[1]);
- var type = (match[2] || "ms").toLowerCase();
- switch (type) {
- case "years":
- case "year":
- case "yrs":
- case "yr":
- case "y":
- return n * y;
- case "weeks":
- case "week":
- case "w":
- return n * w;
- case "days":
- case "day":
- case "d":
- return n * d;
- case "hours":
- case "hour":
- case "hrs":
- case "hr":
- case "h":
- return n * h;
- case "minutes":
- case "minute":
- case "mins":
- case "min":
- case "m":
- return n * m;
- case "seconds":
- case "second":
- case "secs":
- case "sec":
- case "s":
- return n * s;
- case "milliseconds":
- case "millisecond":
- case "msecs":
- case "msec":
- case "ms":
- return n;
- default:
- return;
- }
- }
- function fmtShort(ms) {
- var msAbs = Math.abs(ms);
- if (msAbs >= d) {
- return Math.round(ms / d) + "d";
- }
- if (msAbs >= h) {
- return Math.round(ms / h) + "h";
- }
- if (msAbs >= m) {
- return Math.round(ms / m) + "m";
- }
- if (msAbs >= s) {
- return Math.round(ms / s) + "s";
- }
- return ms + "ms";
- }
- function fmtLong(ms) {
- var msAbs = Math.abs(ms);
- if (msAbs >= d) {
- return plural(ms, msAbs, d, "day");
- }
- if (msAbs >= h) {
- return plural(ms, msAbs, h, "hour");
- }
- if (msAbs >= m) {
- return plural(ms, msAbs, m, "minute");
- }
- if (msAbs >= s) {
- return plural(ms, msAbs, s, "second");
- }
- return ms + " ms";
- }
- function plural(ms, msAbs, n, name) {
- var isPlural = msAbs >= n * 1.5;
- return Math.round(ms / n) + " " + name + (isPlural ? "s" : "");
- }
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/timespan.js
-var require_timespan = __commonJS((exports, module) => {
- var ms = require_ms();
- module.exports = function(time, iat) {
- var timestamp = iat || Math.floor(Date.now() / 1000);
- if (typeof time === "string") {
- var milliseconds = ms(time);
- if (typeof milliseconds === "undefined") {
- return;
- }
- return Math.floor(timestamp + milliseconds / 1000);
- } else if (typeof time === "number") {
- return timestamp + time;
- } else {
- return;
- }
- };
-});
-
-// ../eve/node_modules/semver/internal/constants.js
-var require_constants = __commonJS((exports, module) => {
- var SEMVER_SPEC_VERSION = "2.0.0";
- var MAX_LENGTH = 256;
- var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
- var MAX_SAFE_COMPONENT_LENGTH = 16;
- var MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6;
- var RELEASE_TYPES = [
- "major",
- "premajor",
- "minor",
- "preminor",
- "patch",
- "prepatch",
- "prerelease"
- ];
- module.exports = {
- MAX_LENGTH,
- MAX_SAFE_COMPONENT_LENGTH,
- MAX_SAFE_BUILD_LENGTH,
- MAX_SAFE_INTEGER,
- RELEASE_TYPES,
- SEMVER_SPEC_VERSION,
- FLAG_INCLUDE_PRERELEASE: 1,
- FLAG_LOOSE: 2
- };
-});
-
-// ../eve/node_modules/semver/internal/debug.js
-var require_debug = __commonJS((exports, module) => {
- var debug = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => {};
- module.exports = debug;
-});
-
-// ../eve/node_modules/semver/internal/re.js
-var require_re = __commonJS((exports, module) => {
- var {
- MAX_SAFE_COMPONENT_LENGTH,
- MAX_SAFE_BUILD_LENGTH,
- MAX_LENGTH
- } = require_constants();
- var debug = require_debug();
- exports = module.exports = {};
- var re = exports.re = [];
- var safeRe = exports.safeRe = [];
- var src = exports.src = [];
- var safeSrc = exports.safeSrc = [];
- var t = exports.t = {};
- var R = 0;
- var LETTERDASHNUMBER = "[a-zA-Z0-9-]";
- var safeRegexReplacements = [
- ["\\s", 1],
- ["\\d", MAX_LENGTH],
- [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH]
- ];
- var makeSafeRegex = (value) => {
- for (const [token, max] of safeRegexReplacements) {
- value = value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);
- }
- return value;
- };
- var createToken = (name, value, isGlobal) => {
- const safe = makeSafeRegex(value);
- const index2 = R++;
- debug(name, index2, value);
- t[name] = index2;
- src[index2] = value;
- safeSrc[index2] = safe;
- re[index2] = new RegExp(value, isGlobal ? "g" : undefined);
- safeRe[index2] = new RegExp(safe, isGlobal ? "g" : undefined);
- };
- createToken("NUMERICIDENTIFIER", "0|[1-9]\\d*");
- createToken("NUMERICIDENTIFIERLOOSE", "\\d+");
- createToken("NONNUMERICIDENTIFIER", `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);
- createToken("MAINVERSION", `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})`);
- createToken("MAINVERSIONLOOSE", `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})`);
- createToken("PRERELEASEIDENTIFIER", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIER]})`);
- createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIERLOOSE]})`);
- createToken("PRERELEASE", `(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);
- createToken("PRERELEASELOOSE", `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);
- createToken("BUILDIDENTIFIER", `${LETTERDASHNUMBER}+`);
- createToken("BUILD", `(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);
- createToken("FULLPLAIN", `v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);
- createToken("FULL", `^${src[t.FULLPLAIN]}$`);
- createToken("LOOSEPLAIN", `[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);
- createToken("LOOSE", `^${src[t.LOOSEPLAIN]}$`);
- createToken("GTLT", "((?:<|>)?=?)");
- createToken("XRANGEIDENTIFIERLOOSE", `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);
- createToken("XRANGEIDENTIFIER", `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);
- createToken("XRANGEPLAIN", `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?` + `)?)?`);
- createToken("XRANGEPLAINLOOSE", `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?` + `)?)?`);
- createToken("XRANGE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);
- createToken("XRANGELOOSE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);
- createToken("COERCEPLAIN", `${"(^|[^\\d])" + "(\\d{1,"}${MAX_SAFE_COMPONENT_LENGTH}})` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);
- createToken("COERCE", `${src[t.COERCEPLAIN]}(?:$|[^\\d])`);
- createToken("COERCEFULL", src[t.COERCEPLAIN] + `(?:${src[t.PRERELEASE]})?` + `(?:${src[t.BUILD]})?` + `(?:$|[^\\d])`);
- createToken("COERCERTL", src[t.COERCE], true);
- createToken("COERCERTLFULL", src[t.COERCEFULL], true);
- createToken("LONETILDE", "(?:~>?)");
- createToken("TILDETRIM", `(\\s*)${src[t.LONETILDE]}\\s+`, true);
- exports.tildeTrimReplace = "$1~";
- createToken("TILDE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);
- createToken("TILDELOOSE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);
- createToken("LONECARET", "(?:\\^)");
- createToken("CARETTRIM", `(\\s*)${src[t.LONECARET]}\\s+`, true);
- exports.caretTrimReplace = "$1^";
- createToken("CARET", `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);
- createToken("CARETLOOSE", `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);
- createToken("COMPARATORLOOSE", `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);
- createToken("COMPARATOR", `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);
- createToken("COMPARATORTRIM", `(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true);
- exports.comparatorTrimReplace = "$1$2$3";
- createToken("HYPHENRANGE", `^\\s*(${src[t.XRANGEPLAIN]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAIN]})` + `\\s*$`);
- createToken("HYPHENRANGELOOSE", `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAINLOOSE]})` + `\\s*$`);
- createToken("STAR", "(<|>)?=?\\s*\\*");
- createToken("GTE0", "^\\s*>=\\s*0\\.0\\.0\\s*$");
- createToken("GTE0PRE", "^\\s*>=\\s*0\\.0\\.0-0\\s*$");
-});
-
-// ../eve/node_modules/semver/internal/parse-options.js
-var require_parse_options = __commonJS((exports, module) => {
- var looseOption = Object.freeze({ loose: true });
- var emptyOpts = Object.freeze({});
- var parseOptions = (options2) => {
- if (!options2) {
- return emptyOpts;
- }
- if (typeof options2 !== "object") {
- return looseOption;
- }
- return options2;
- };
- module.exports = parseOptions;
-});
-
-// ../eve/node_modules/semver/internal/identifiers.js
-var require_identifiers = __commonJS((exports, module) => {
- var numeric2 = /^[0-9]+$/;
- var compareIdentifiers = (a, b) => {
- const anum = numeric2.test(a);
- const bnum = numeric2.test(b);
- if (anum && bnum) {
- a = +a;
- b = +b;
- }
- return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;
- };
- var rcompareIdentifiers = (a, b) => compareIdentifiers(b, a);
- module.exports = {
- compareIdentifiers,
- rcompareIdentifiers
- };
-});
-
-// ../eve/node_modules/semver/classes/semver.js
-var require_semver = __commonJS((exports, module) => {
- var debug = require_debug();
- var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants();
- var { safeRe: re, t } = require_re();
- var parseOptions = require_parse_options();
- var { compareIdentifiers } = require_identifiers();
-
- class SemVer {
- constructor(version2, options2) {
- options2 = parseOptions(options2);
- if (version2 instanceof SemVer) {
- if (version2.loose === !!options2.loose && version2.includePrerelease === !!options2.includePrerelease) {
- return version2;
- } else {
- version2 = version2.version;
- }
- } else if (typeof version2 !== "string") {
- throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version2}".`);
- }
- if (version2.length > MAX_LENGTH) {
- throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);
- }
- debug("SemVer", version2, options2);
- this.options = options2;
- this.loose = !!options2.loose;
- this.includePrerelease = !!options2.includePrerelease;
- const m = version2.trim().match(options2.loose ? re[t.LOOSE] : re[t.FULL]);
- if (!m) {
- throw new TypeError(`Invalid Version: ${version2}`);
- }
- this.raw = version2;
- this.major = +m[1];
- this.minor = +m[2];
- this.patch = +m[3];
- if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
- throw new TypeError("Invalid major version");
- }
- if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
- throw new TypeError("Invalid minor version");
- }
- if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
- throw new TypeError("Invalid patch version");
- }
- if (!m[4]) {
- this.prerelease = [];
- } else {
- this.prerelease = m[4].split(".").map((id) => {
- if (/^[0-9]+$/.test(id)) {
- const num = +id;
- if (num >= 0 && num < MAX_SAFE_INTEGER) {
- return num;
- }
- }
- return id;
- });
- }
- this.build = m[5] ? m[5].split(".") : [];
- this.format();
- }
- format() {
- this.version = `${this.major}.${this.minor}.${this.patch}`;
- if (this.prerelease.length) {
- this.version += `-${this.prerelease.join(".")}`;
- }
- return this.version;
- }
- toString() {
- return this.version;
- }
- compare(other) {
- debug("SemVer.compare", this.version, this.options, other);
- if (!(other instanceof SemVer)) {
- if (typeof other === "string" && other === this.version) {
- return 0;
- }
- other = new SemVer(other, this.options);
- }
- if (other.version === this.version) {
- return 0;
- }
- return this.compareMain(other) || this.comparePre(other);
- }
- compareMain(other) {
- if (!(other instanceof SemVer)) {
- other = new SemVer(other, this.options);
- }
- return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch);
- }
- comparePre(other) {
- if (!(other instanceof SemVer)) {
- other = new SemVer(other, this.options);
- }
- if (this.prerelease.length && !other.prerelease.length) {
- return -1;
- } else if (!this.prerelease.length && other.prerelease.length) {
- return 1;
- } else if (!this.prerelease.length && !other.prerelease.length) {
- return 0;
- }
- let i = 0;
- do {
- const a = this.prerelease[i];
- const b = other.prerelease[i];
- debug("prerelease compare", i, a, b);
- if (a === undefined && b === undefined) {
- return 0;
- } else if (b === undefined) {
- return 1;
- } else if (a === undefined) {
- return -1;
- } else if (a === b) {
- continue;
- } else {
- return compareIdentifiers(a, b);
- }
- } while (++i);
- }
- compareBuild(other) {
- if (!(other instanceof SemVer)) {
- other = new SemVer(other, this.options);
- }
- let i = 0;
- do {
- const a = this.build[i];
- const b = other.build[i];
- debug("build compare", i, a, b);
- if (a === undefined && b === undefined) {
- return 0;
- } else if (b === undefined) {
- return 1;
- } else if (a === undefined) {
- return -1;
- } else if (a === b) {
- continue;
- } else {
- return compareIdentifiers(a, b);
- }
- } while (++i);
- }
- inc(release, identifier, identifierBase) {
- if (release.startsWith("pre")) {
- if (!identifier && identifierBase === false) {
- throw new Error("invalid increment argument: identifier is empty");
- }
- if (identifier) {
- const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]);
- if (!match || match[1] !== identifier) {
- throw new Error(`invalid identifier: ${identifier}`);
- }
- }
- }
- switch (release) {
- case "premajor":
- this.prerelease.length = 0;
- this.patch = 0;
- this.minor = 0;
- this.major++;
- this.inc("pre", identifier, identifierBase);
- break;
- case "preminor":
- this.prerelease.length = 0;
- this.patch = 0;
- this.minor++;
- this.inc("pre", identifier, identifierBase);
- break;
- case "prepatch":
- this.prerelease.length = 0;
- this.inc("patch", identifier, identifierBase);
- this.inc("pre", identifier, identifierBase);
- break;
- case "prerelease":
- if (this.prerelease.length === 0) {
- this.inc("patch", identifier, identifierBase);
- }
- this.inc("pre", identifier, identifierBase);
- break;
- case "release":
- if (this.prerelease.length === 0) {
- throw new Error(`version ${this.raw} is not a prerelease`);
- }
- this.prerelease.length = 0;
- break;
- case "major":
- if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) {
- this.major++;
- }
- this.minor = 0;
- this.patch = 0;
- this.prerelease = [];
- break;
- case "minor":
- if (this.patch !== 0 || this.prerelease.length === 0) {
- this.minor++;
- }
- this.patch = 0;
- this.prerelease = [];
- break;
- case "patch":
- if (this.prerelease.length === 0) {
- this.patch++;
- }
- this.prerelease = [];
- break;
- case "pre": {
- const base = Number(identifierBase) ? 1 : 0;
- if (this.prerelease.length === 0) {
- this.prerelease = [base];
- } else {
- let i = this.prerelease.length;
- while (--i >= 0) {
- if (typeof this.prerelease[i] === "number") {
- this.prerelease[i]++;
- i = -2;
- }
- }
- if (i === -1) {
- if (identifier === this.prerelease.join(".") && identifierBase === false) {
- throw new Error("invalid increment argument: identifier already exists");
- }
- this.prerelease.push(base);
- }
- }
- if (identifier) {
- let prerelease = [identifier, base];
- if (identifierBase === false) {
- prerelease = [identifier];
- }
- if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
- if (isNaN(this.prerelease[1])) {
- this.prerelease = prerelease;
- }
- } else {
- this.prerelease = prerelease;
- }
- }
- break;
- }
- default:
- throw new Error(`invalid increment argument: ${release}`);
- }
- this.raw = this.format();
- if (this.build.length) {
- this.raw += `+${this.build.join(".")}`;
- }
- return this;
- }
- }
- module.exports = SemVer;
-});
-
-// ../eve/node_modules/semver/functions/parse.js
-var require_parse = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var parse = (version2, options2, throwErrors = false) => {
- if (version2 instanceof SemVer) {
- return version2;
- }
- try {
- return new SemVer(version2, options2);
- } catch (er) {
- if (!throwErrors) {
- return null;
- }
- throw er;
- }
- };
- module.exports = parse;
-});
-
-// ../eve/node_modules/semver/functions/valid.js
-var require_valid = __commonJS((exports, module) => {
- var parse = require_parse();
- var valid = (version2, options2) => {
- const v = parse(version2, options2);
- return v ? v.version : null;
- };
- module.exports = valid;
-});
-
-// ../eve/node_modules/semver/functions/clean.js
-var require_clean = __commonJS((exports, module) => {
- var parse = require_parse();
- var clean = (version2, options2) => {
- const s = parse(version2.trim().replace(/^[=v]+/, ""), options2);
- return s ? s.version : null;
- };
- module.exports = clean;
-});
-
-// ../eve/node_modules/semver/functions/inc.js
-var require_inc = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var inc = (version2, release, options2, identifier, identifierBase) => {
- if (typeof options2 === "string") {
- identifierBase = identifier;
- identifier = options2;
- options2 = undefined;
- }
- try {
- return new SemVer(version2 instanceof SemVer ? version2.version : version2, options2).inc(release, identifier, identifierBase).version;
- } catch (er) {
- return null;
- }
- };
- module.exports = inc;
-});
-
-// ../eve/node_modules/semver/functions/diff.js
-var require_diff = __commonJS((exports, module) => {
- var parse = require_parse();
- var diff = (version1, version2) => {
- const v1 = parse(version1, null, true);
- const v2 = parse(version2, null, true);
- const comparison = v1.compare(v2);
- if (comparison === 0) {
- return null;
- }
- const v1Higher = comparison > 0;
- const highVersion = v1Higher ? v1 : v2;
- const lowVersion = v1Higher ? v2 : v1;
- const highHasPre = !!highVersion.prerelease.length;
- const lowHasPre = !!lowVersion.prerelease.length;
- if (lowHasPre && !highHasPre) {
- if (!lowVersion.patch && !lowVersion.minor) {
- return "major";
- }
- if (lowVersion.compareMain(highVersion) === 0) {
- if (lowVersion.minor && !lowVersion.patch) {
- return "minor";
- }
- return "patch";
- }
- }
- const prefix = highHasPre ? "pre" : "";
- if (v1.major !== v2.major) {
- return prefix + "major";
- }
- if (v1.minor !== v2.minor) {
- return prefix + "minor";
- }
- if (v1.patch !== v2.patch) {
- return prefix + "patch";
- }
- return "prerelease";
- };
- module.exports = diff;
-});
-
-// ../eve/node_modules/semver/functions/major.js
-var require_major = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var major = (a, loose) => new SemVer(a, loose).major;
- module.exports = major;
-});
-
-// ../eve/node_modules/semver/functions/minor.js
-var require_minor = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var minor = (a, loose) => new SemVer(a, loose).minor;
- module.exports = minor;
-});
-
-// ../eve/node_modules/semver/functions/patch.js
-var require_patch = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var patch = (a, loose) => new SemVer(a, loose).patch;
- module.exports = patch;
-});
-
-// ../eve/node_modules/semver/functions/prerelease.js
-var require_prerelease = __commonJS((exports, module) => {
- var parse = require_parse();
- var prerelease = (version2, options2) => {
- const parsed = parse(version2, options2);
- return parsed && parsed.prerelease.length ? parsed.prerelease : null;
- };
- module.exports = prerelease;
-});
-
-// ../eve/node_modules/semver/functions/compare.js
-var require_compare = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose));
- module.exports = compare;
-});
-
-// ../eve/node_modules/semver/functions/rcompare.js
-var require_rcompare = __commonJS((exports, module) => {
- var compare = require_compare();
- var rcompare = (a, b, loose) => compare(b, a, loose);
- module.exports = rcompare;
-});
-
-// ../eve/node_modules/semver/functions/compare-loose.js
-var require_compare_loose = __commonJS((exports, module) => {
- var compare = require_compare();
- var compareLoose = (a, b) => compare(a, b, true);
- module.exports = compareLoose;
-});
-
-// ../eve/node_modules/semver/functions/compare-build.js
-var require_compare_build = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var compareBuild = (a, b, loose) => {
- const versionA = new SemVer(a, loose);
- const versionB = new SemVer(b, loose);
- return versionA.compare(versionB) || versionA.compareBuild(versionB);
- };
- module.exports = compareBuild;
-});
-
-// ../eve/node_modules/semver/functions/sort.js
-var require_sort = __commonJS((exports, module) => {
- var compareBuild = require_compare_build();
- var sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose));
- module.exports = sort;
-});
-
-// ../eve/node_modules/semver/functions/rsort.js
-var require_rsort = __commonJS((exports, module) => {
- var compareBuild = require_compare_build();
- var rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose));
- module.exports = rsort;
-});
-
-// ../eve/node_modules/semver/functions/gt.js
-var require_gt = __commonJS((exports, module) => {
- var compare = require_compare();
- var gt2 = (a, b, loose) => compare(a, b, loose) > 0;
- module.exports = gt2;
-});
-
-// ../eve/node_modules/semver/functions/lt.js
-var require_lt = __commonJS((exports, module) => {
- var compare = require_compare();
- var lt2 = (a, b, loose) => compare(a, b, loose) < 0;
- module.exports = lt2;
-});
-
-// ../eve/node_modules/semver/functions/eq.js
-var require_eq = __commonJS((exports, module) => {
- var compare = require_compare();
- var eq2 = (a, b, loose) => compare(a, b, loose) === 0;
- module.exports = eq2;
-});
-
-// ../eve/node_modules/semver/functions/neq.js
-var require_neq = __commonJS((exports, module) => {
- var compare = require_compare();
- var neq = (a, b, loose) => compare(a, b, loose) !== 0;
- module.exports = neq;
-});
-
-// ../eve/node_modules/semver/functions/gte.js
-var require_gte = __commonJS((exports, module) => {
- var compare = require_compare();
- var gte2 = (a, b, loose) => compare(a, b, loose) >= 0;
- module.exports = gte2;
-});
-
-// ../eve/node_modules/semver/functions/lte.js
-var require_lte = __commonJS((exports, module) => {
- var compare = require_compare();
- var lte2 = (a, b, loose) => compare(a, b, loose) <= 0;
- module.exports = lte2;
-});
-
-// ../eve/node_modules/semver/functions/cmp.js
-var require_cmp = __commonJS((exports, module) => {
- var eq2 = require_eq();
- var neq = require_neq();
- var gt2 = require_gt();
- var gte2 = require_gte();
- var lt2 = require_lt();
- var lte2 = require_lte();
- var cmp = (a, op, b, loose) => {
- switch (op) {
- case "===":
- if (typeof a === "object") {
- a = a.version;
- }
- if (typeof b === "object") {
- b = b.version;
- }
- return a === b;
- case "!==":
- if (typeof a === "object") {
- a = a.version;
- }
- if (typeof b === "object") {
- b = b.version;
- }
- return a !== b;
- case "":
- case "=":
- case "==":
- return eq2(a, b, loose);
- case "!=":
- return neq(a, b, loose);
- case ">":
- return gt2(a, b, loose);
- case ">=":
- return gte2(a, b, loose);
- case "<":
- return lt2(a, b, loose);
- case "<=":
- return lte2(a, b, loose);
- default:
- throw new TypeError(`Invalid operator: ${op}`);
- }
- };
- module.exports = cmp;
-});
-
-// ../eve/node_modules/semver/functions/coerce.js
-var require_coerce = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var parse = require_parse();
- var { safeRe: re, t } = require_re();
- var coerce = (version2, options2) => {
- if (version2 instanceof SemVer) {
- return version2;
- }
- if (typeof version2 === "number") {
- version2 = String(version2);
- }
- if (typeof version2 !== "string") {
- return null;
- }
- options2 = options2 || {};
- let match = null;
- if (!options2.rtl) {
- match = version2.match(options2.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]);
- } else {
- const coerceRtlRegex = options2.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL];
- let next;
- while ((next = coerceRtlRegex.exec(version2)) && (!match || match.index + match[0].length !== version2.length)) {
- if (!match || next.index + next[0].length !== match.index + match[0].length) {
- match = next;
- }
- coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length;
- }
- coerceRtlRegex.lastIndex = -1;
- }
- if (match === null) {
- return null;
- }
- const major = match[2];
- const minor = match[3] || "0";
- const patch = match[4] || "0";
- const prerelease = options2.includePrerelease && match[5] ? `-${match[5]}` : "";
- const build = options2.includePrerelease && match[6] ? `+${match[6]}` : "";
- return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options2);
- };
- module.exports = coerce;
-});
-
-// ../eve/node_modules/semver/internal/lrucache.js
-var require_lrucache = __commonJS((exports, module) => {
- class LRUCache {
- constructor() {
- this.max = 1000;
- this.map = new Map;
- }
- get(key) {
- const value = this.map.get(key);
- if (value === undefined) {
- return;
- } else {
- this.map.delete(key);
- this.map.set(key, value);
- return value;
- }
- }
- delete(key) {
- return this.map.delete(key);
- }
- set(key, value) {
- const deleted = this.delete(key);
- if (!deleted && value !== undefined) {
- if (this.map.size >= this.max) {
- const firstKey = this.map.keys().next().value;
- this.delete(firstKey);
- }
- this.map.set(key, value);
- }
- return this;
- }
- }
- module.exports = LRUCache;
-});
-
-// ../eve/node_modules/semver/classes/range.js
-var require_range = __commonJS((exports, module) => {
- var SPACE_CHARACTERS = /\s+/g;
-
- class Range {
- constructor(range, options2) {
- options2 = parseOptions(options2);
- if (range instanceof Range) {
- if (range.loose === !!options2.loose && range.includePrerelease === !!options2.includePrerelease) {
- return range;
- } else {
- return new Range(range.raw, options2);
- }
- }
- if (range instanceof Comparator) {
- this.raw = range.value;
- this.set = [[range]];
- this.formatted = undefined;
- return this;
- }
- this.options = options2;
- this.loose = !!options2.loose;
- this.includePrerelease = !!options2.includePrerelease;
- this.raw = range.trim().replace(SPACE_CHARACTERS, " ");
- this.set = this.raw.split("||").map((r) => this.parseRange(r.trim())).filter((c) => c.length);
- if (!this.set.length) {
- throw new TypeError(`Invalid SemVer Range: ${this.raw}`);
- }
- if (this.set.length > 1) {
- const first = this.set[0];
- this.set = this.set.filter((c) => !isNullSet(c[0]));
- if (this.set.length === 0) {
- this.set = [first];
- } else if (this.set.length > 1) {
- for (const c of this.set) {
- if (c.length === 1 && isAny(c[0])) {
- this.set = [c];
- break;
- }
- }
- }
- }
- this.formatted = undefined;
- }
- get range() {
- if (this.formatted === undefined) {
- this.formatted = "";
- for (let i = 0;i < this.set.length; i++) {
- if (i > 0) {
- this.formatted += "||";
- }
- const comps = this.set[i];
- for (let k = 0;k < comps.length; k++) {
- if (k > 0) {
- this.formatted += " ";
- }
- this.formatted += comps[k].toString().trim();
- }
- }
- }
- return this.formatted;
- }
- format() {
- return this.range;
- }
- toString() {
- return this.range;
- }
- parseRange(range) {
- const memoOpts = (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | (this.options.loose && FLAG_LOOSE);
- const memoKey = memoOpts + ":" + range;
- const cached = cache.get(memoKey);
- if (cached) {
- return cached;
- }
- const loose = this.options.loose;
- const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE];
- range = range.replace(hr, hyphenReplace(this.options.includePrerelease));
- debug("hyphen replace", range);
- range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace);
- debug("comparator trim", range);
- range = range.replace(re[t.TILDETRIM], tildeTrimReplace);
- debug("tilde trim", range);
- range = range.replace(re[t.CARETTRIM], caretTrimReplace);
- debug("caret trim", range);
- let rangeList = range.split(" ").map((comp) => parseComparator(comp, this.options)).join(" ").split(/\s+/).map((comp) => replaceGTE0(comp, this.options));
- if (loose) {
- rangeList = rangeList.filter((comp) => {
- debug("loose invalid filter", comp, this.options);
- return !!comp.match(re[t.COMPARATORLOOSE]);
- });
- }
- debug("range list", rangeList);
- const rangeMap = new Map;
- const comparators = rangeList.map((comp) => new Comparator(comp, this.options));
- for (const comp of comparators) {
- if (isNullSet(comp)) {
- return [comp];
- }
- rangeMap.set(comp.value, comp);
- }
- if (rangeMap.size > 1 && rangeMap.has("")) {
- rangeMap.delete("");
- }
- const result = [...rangeMap.values()];
- cache.set(memoKey, result);
- return result;
- }
- intersects(range, options2) {
- if (!(range instanceof Range)) {
- throw new TypeError("a Range is required");
- }
- return this.set.some((thisComparators) => {
- return isSatisfiable(thisComparators, options2) && range.set.some((rangeComparators) => {
- return isSatisfiable(rangeComparators, options2) && thisComparators.every((thisComparator) => {
- return rangeComparators.every((rangeComparator) => {
- return thisComparator.intersects(rangeComparator, options2);
- });
- });
- });
- });
- }
- test(version2) {
- if (!version2) {
- return false;
- }
- if (typeof version2 === "string") {
- try {
- version2 = new SemVer(version2, this.options);
- } catch (er) {
- return false;
- }
- }
- for (let i = 0;i < this.set.length; i++) {
- if (testSet(this.set[i], version2, this.options)) {
- return true;
- }
- }
- return false;
- }
- }
- module.exports = Range;
- var LRU = require_lrucache();
- var cache = new LRU;
- var parseOptions = require_parse_options();
- var Comparator = require_comparator();
- var debug = require_debug();
- var SemVer = require_semver();
- var {
- safeRe: re,
- t,
- comparatorTrimReplace,
- tildeTrimReplace,
- caretTrimReplace
- } = require_re();
- var { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require_constants();
- var isNullSet = (c) => c.value === "<0.0.0-0";
- var isAny = (c) => c.value === "";
- var isSatisfiable = (comparators, options2) => {
- let result = true;
- const remainingComparators = comparators.slice();
- let testComparator = remainingComparators.pop();
- while (result && remainingComparators.length) {
- result = remainingComparators.every((otherComparator) => {
- return testComparator.intersects(otherComparator, options2);
- });
- testComparator = remainingComparators.pop();
- }
- return result;
- };
- var parseComparator = (comp, options2) => {
- debug("comp", comp, options2);
- comp = replaceCarets(comp, options2);
- debug("caret", comp);
- comp = replaceTildes(comp, options2);
- debug("tildes", comp);
- comp = replaceXRanges(comp, options2);
- debug("xrange", comp);
- comp = replaceStars(comp, options2);
- debug("stars", comp);
- return comp;
- };
- var isX = (id) => !id || id.toLowerCase() === "x" || id === "*";
- var replaceTildes = (comp, options2) => {
- return comp.trim().split(/\s+/).map((c) => replaceTilde(c, options2)).join(" ");
- };
- var replaceTilde = (comp, options2) => {
- const r = options2.loose ? re[t.TILDELOOSE] : re[t.TILDE];
- return comp.replace(r, (_, M, m, p, pr) => {
- debug("tilde", comp, _, M, m, p, pr);
- let ret;
- if (isX(M)) {
- ret = "";
- } else if (isX(m)) {
- ret = `>=${M}.0.0 <${+M + 1}.0.0-0`;
- } else if (isX(p)) {
- ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;
- } else if (pr) {
- debug("replaceTilde pr", pr);
- ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
- } else {
- ret = `>=${M}.${m}.${p} <${M}.${+m + 1}.0-0`;
- }
- debug("tilde return", ret);
- return ret;
- });
- };
- var replaceCarets = (comp, options2) => {
- return comp.trim().split(/\s+/).map((c) => replaceCaret(c, options2)).join(" ");
- };
- var replaceCaret = (comp, options2) => {
- debug("caret", comp, options2);
- const r = options2.loose ? re[t.CARETLOOSE] : re[t.CARET];
- const z = options2.includePrerelease ? "-0" : "";
- return comp.replace(r, (_, M, m, p, pr) => {
- debug("caret", comp, _, M, m, p, pr);
- let ret;
- if (isX(M)) {
- ret = "";
- } else if (isX(m)) {
- ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`;
- } else if (isX(p)) {
- if (M === "0") {
- ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`;
- } else {
- ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`;
- }
- } else if (pr) {
- debug("replaceCaret pr", pr);
- if (M === "0") {
- if (m === "0") {
- ret = `>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p + 1}-0`;
- } else {
- ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
- }
- } else {
- ret = `>=${M}.${m}.${p}-${pr} <${+M + 1}.0.0-0`;
- }
- } else {
- debug("no pr");
- if (M === "0") {
- if (m === "0") {
- ret = `>=${M}.${m}.${p}${z} <${M}.${m}.${+p + 1}-0`;
- } else {
- ret = `>=${M}.${m}.${p}${z} <${M}.${+m + 1}.0-0`;
- }
- } else {
- ret = `>=${M}.${m}.${p} <${+M + 1}.0.0-0`;
- }
- }
- debug("caret return", ret);
- return ret;
- });
- };
- var replaceXRanges = (comp, options2) => {
- debug("replaceXRanges", comp, options2);
- return comp.split(/\s+/).map((c) => replaceXRange(c, options2)).join(" ");
- };
- var replaceXRange = (comp, options2) => {
- comp = comp.trim();
- const r = options2.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];
- return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
- debug("xRange", comp, ret, gtlt, M, m, p, pr);
- const xM = isX(M);
- const xm = xM || isX(m);
- const xp = xm || isX(p);
- const anyX = xp;
- if (gtlt === "=" && anyX) {
- gtlt = "";
- }
- pr = options2.includePrerelease ? "-0" : "";
- if (xM) {
- if (gtlt === ">" || gtlt === "<") {
- ret = "<0.0.0-0";
- } else {
- ret = "*";
- }
- } else if (gtlt && anyX) {
- if (xm) {
- m = 0;
- }
- p = 0;
- if (gtlt === ">") {
- gtlt = ">=";
- if (xm) {
- M = +M + 1;
- m = 0;
- p = 0;
- } else {
- m = +m + 1;
- p = 0;
- }
- } else if (gtlt === "<=") {
- gtlt = "<";
- if (xm) {
- M = +M + 1;
- } else {
- m = +m + 1;
- }
- }
- if (gtlt === "<") {
- pr = "-0";
- }
- ret = `${gtlt + M}.${m}.${p}${pr}`;
- } else if (xm) {
- ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`;
- } else if (xp) {
- ret = `>=${M}.${m}.0${pr} <${M}.${+m + 1}.0-0`;
- }
- debug("xRange return", ret);
- return ret;
- });
- };
- var replaceStars = (comp, options2) => {
- debug("replaceStars", comp, options2);
- return comp.trim().replace(re[t.STAR], "");
- };
- var replaceGTE0 = (comp, options2) => {
- debug("replaceGTE0", comp, options2);
- return comp.trim().replace(re[options2.includePrerelease ? t.GTE0PRE : t.GTE0], "");
- };
- var hyphenReplace = (incPr) => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr) => {
- if (isX(fM)) {
- from = "";
- } else if (isX(fm)) {
- from = `>=${fM}.0.0${incPr ? "-0" : ""}`;
- } else if (isX(fp)) {
- from = `>=${fM}.${fm}.0${incPr ? "-0" : ""}`;
- } else if (fpr) {
- from = `>=${from}`;
- } else {
- from = `>=${from}${incPr ? "-0" : ""}`;
- }
- if (isX(tM)) {
- to = "";
- } else if (isX(tm)) {
- to = `<${+tM + 1}.0.0-0`;
- } else if (isX(tp)) {
- to = `<${tM}.${+tm + 1}.0-0`;
- } else if (tpr) {
- to = `<=${tM}.${tm}.${tp}-${tpr}`;
- } else if (incPr) {
- to = `<${tM}.${tm}.${+tp + 1}-0`;
- } else {
- to = `<=${to}`;
- }
- return `${from} ${to}`.trim();
- };
- var testSet = (set, version2, options2) => {
- for (let i = 0;i < set.length; i++) {
- if (!set[i].test(version2)) {
- return false;
- }
- }
- if (version2.prerelease.length && !options2.includePrerelease) {
- for (let i = 0;i < set.length; i++) {
- debug(set[i].semver);
- if (set[i].semver === Comparator.ANY) {
- continue;
- }
- if (set[i].semver.prerelease.length > 0) {
- const allowed = set[i].semver;
- if (allowed.major === version2.major && allowed.minor === version2.minor && allowed.patch === version2.patch) {
- return true;
- }
- }
- }
- return false;
- }
- return true;
- };
-});
-
-// ../eve/node_modules/semver/classes/comparator.js
-var require_comparator = __commonJS((exports, module) => {
- var ANY = Symbol("SemVer ANY");
-
- class Comparator {
- static get ANY() {
- return ANY;
- }
- constructor(comp, options2) {
- options2 = parseOptions(options2);
- if (comp instanceof Comparator) {
- if (comp.loose === !!options2.loose) {
- return comp;
- } else {
- comp = comp.value;
- }
- }
- comp = comp.trim().split(/\s+/).join(" ");
- debug("comparator", comp, options2);
- this.options = options2;
- this.loose = !!options2.loose;
- this.parse(comp);
- if (this.semver === ANY) {
- this.value = "";
- } else {
- this.value = this.operator + this.semver.version;
- }
- debug("comp", this);
- }
- parse(comp) {
- const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR];
- const m = comp.match(r);
- if (!m) {
- throw new TypeError(`Invalid comparator: ${comp}`);
- }
- this.operator = m[1] !== undefined ? m[1] : "";
- if (this.operator === "=") {
- this.operator = "";
- }
- if (!m[2]) {
- this.semver = ANY;
- } else {
- this.semver = new SemVer(m[2], this.options.loose);
- }
- }
- toString() {
- return this.value;
- }
- test(version2) {
- debug("Comparator.test", version2, this.options.loose);
- if (this.semver === ANY || version2 === ANY) {
- return true;
- }
- if (typeof version2 === "string") {
- try {
- version2 = new SemVer(version2, this.options);
- } catch (er) {
- return false;
- }
- }
- return cmp(version2, this.operator, this.semver, this.options);
- }
- intersects(comp, options2) {
- if (!(comp instanceof Comparator)) {
- throw new TypeError("a Comparator is required");
- }
- if (this.operator === "") {
- if (this.value === "") {
- return true;
- }
- return new Range(comp.value, options2).test(this.value);
- } else if (comp.operator === "") {
- if (comp.value === "") {
- return true;
- }
- return new Range(this.value, options2).test(comp.semver);
- }
- options2 = parseOptions(options2);
- if (options2.includePrerelease && (this.value === "<0.0.0-0" || comp.value === "<0.0.0-0")) {
- return false;
- }
- if (!options2.includePrerelease && (this.value.startsWith("<0.0.0") || comp.value.startsWith("<0.0.0"))) {
- return false;
- }
- if (this.operator.startsWith(">") && comp.operator.startsWith(">")) {
- return true;
- }
- if (this.operator.startsWith("<") && comp.operator.startsWith("<")) {
- return true;
- }
- if (this.semver.version === comp.semver.version && this.operator.includes("=") && comp.operator.includes("=")) {
- return true;
- }
- if (cmp(this.semver, "<", comp.semver, options2) && this.operator.startsWith(">") && comp.operator.startsWith("<")) {
- return true;
- }
- if (cmp(this.semver, ">", comp.semver, options2) && this.operator.startsWith("<") && comp.operator.startsWith(">")) {
- return true;
- }
- return false;
- }
- }
- module.exports = Comparator;
- var parseOptions = require_parse_options();
- var { safeRe: re, t } = require_re();
- var cmp = require_cmp();
- var debug = require_debug();
- var SemVer = require_semver();
- var Range = require_range();
-});
-
-// ../eve/node_modules/semver/functions/satisfies.js
-var require_satisfies = __commonJS((exports, module) => {
- var Range = require_range();
- var satisfies = (version2, range, options2) => {
- try {
- range = new Range(range, options2);
- } catch (er) {
- return false;
- }
- return range.test(version2);
- };
- module.exports = satisfies;
-});
-
-// ../eve/node_modules/semver/ranges/to-comparators.js
-var require_to_comparators = __commonJS((exports, module) => {
- var Range = require_range();
- var toComparators = (range, options2) => new Range(range, options2).set.map((comp) => comp.map((c) => c.value).join(" ").trim().split(" "));
- module.exports = toComparators;
-});
-
-// ../eve/node_modules/semver/ranges/max-satisfying.js
-var require_max_satisfying = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Range = require_range();
- var maxSatisfying = (versions, range, options2) => {
- let max = null;
- let maxSV = null;
- let rangeObj = null;
- try {
- rangeObj = new Range(range, options2);
- } catch (er) {
- return null;
- }
- versions.forEach((v) => {
- if (rangeObj.test(v)) {
- if (!max || maxSV.compare(v) === -1) {
- max = v;
- maxSV = new SemVer(max, options2);
- }
- }
- });
- return max;
- };
- module.exports = maxSatisfying;
-});
-
-// ../eve/node_modules/semver/ranges/min-satisfying.js
-var require_min_satisfying = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Range = require_range();
- var minSatisfying = (versions, range, options2) => {
- let min = null;
- let minSV = null;
- let rangeObj = null;
- try {
- rangeObj = new Range(range, options2);
- } catch (er) {
- return null;
- }
- versions.forEach((v) => {
- if (rangeObj.test(v)) {
- if (!min || minSV.compare(v) === 1) {
- min = v;
- minSV = new SemVer(min, options2);
- }
- }
- });
- return min;
- };
- module.exports = minSatisfying;
-});
-
-// ../eve/node_modules/semver/ranges/min-version.js
-var require_min_version = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Range = require_range();
- var gt2 = require_gt();
- var minVersion = (range, loose) => {
- range = new Range(range, loose);
- let minver = new SemVer("0.0.0");
- if (range.test(minver)) {
- return minver;
- }
- minver = new SemVer("0.0.0-0");
- if (range.test(minver)) {
- return minver;
- }
- minver = null;
- for (let i = 0;i < range.set.length; ++i) {
- const comparators = range.set[i];
- let setMin = null;
- comparators.forEach((comparator) => {
- const compver = new SemVer(comparator.semver.version);
- switch (comparator.operator) {
- case ">":
- if (compver.prerelease.length === 0) {
- compver.patch++;
- } else {
- compver.prerelease.push(0);
- }
- compver.raw = compver.format();
- case "":
- case ">=":
- if (!setMin || gt2(compver, setMin)) {
- setMin = compver;
- }
- break;
- case "<":
- case "<=":
- break;
- default:
- throw new Error(`Unexpected operation: ${comparator.operator}`);
- }
- });
- if (setMin && (!minver || gt2(minver, setMin))) {
- minver = setMin;
- }
- }
- if (minver && range.test(minver)) {
- return minver;
- }
- return null;
- };
- module.exports = minVersion;
-});
-
-// ../eve/node_modules/semver/ranges/valid.js
-var require_valid2 = __commonJS((exports, module) => {
- var Range = require_range();
- var validRange = (range, options2) => {
- try {
- return new Range(range, options2).range || "*";
- } catch (er) {
- return null;
- }
- };
- module.exports = validRange;
-});
-
-// ../eve/node_modules/semver/ranges/outside.js
-var require_outside = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Comparator = require_comparator();
- var { ANY } = Comparator;
- var Range = require_range();
- var satisfies = require_satisfies();
- var gt2 = require_gt();
- var lt2 = require_lt();
- var lte2 = require_lte();
- var gte2 = require_gte();
- var outside = (version2, range, hilo, options2) => {
- version2 = new SemVer(version2, options2);
- range = new Range(range, options2);
- let gtfn, ltefn, ltfn, comp, ecomp;
- switch (hilo) {
- case ">":
- gtfn = gt2;
- ltefn = lte2;
- ltfn = lt2;
- comp = ">";
- ecomp = ">=";
- break;
- case "<":
- gtfn = lt2;
- ltefn = gte2;
- ltfn = gt2;
- comp = "<";
- ecomp = "<=";
- break;
- default:
- throw new TypeError('Must provide a hilo val of "<" or ">"');
- }
- if (satisfies(version2, range, options2)) {
- return false;
- }
- for (let i = 0;i < range.set.length; ++i) {
- const comparators = range.set[i];
- let high = null;
- let low = null;
- comparators.forEach((comparator) => {
- if (comparator.semver === ANY) {
- comparator = new Comparator(">=0.0.0");
- }
- high = high || comparator;
- low = low || comparator;
- if (gtfn(comparator.semver, high.semver, options2)) {
- high = comparator;
- } else if (ltfn(comparator.semver, low.semver, options2)) {
- low = comparator;
- }
- });
- if (high.operator === comp || high.operator === ecomp) {
- return false;
- }
- if ((!low.operator || low.operator === comp) && ltefn(version2, low.semver)) {
- return false;
- } else if (low.operator === ecomp && ltfn(version2, low.semver)) {
- return false;
- }
- }
- return true;
- };
- module.exports = outside;
-});
-
-// ../eve/node_modules/semver/ranges/gtr.js
-var require_gtr = __commonJS((exports, module) => {
- var outside = require_outside();
- var gtr = (version2, range, options2) => outside(version2, range, ">", options2);
- module.exports = gtr;
-});
-
-// ../eve/node_modules/semver/ranges/ltr.js
-var require_ltr = __commonJS((exports, module) => {
- var outside = require_outside();
- var ltr = (version2, range, options2) => outside(version2, range, "<", options2);
- module.exports = ltr;
-});
-
-// ../eve/node_modules/semver/ranges/intersects.js
-var require_intersects = __commonJS((exports, module) => {
- var Range = require_range();
- var intersects = (r1, r2, options2) => {
- r1 = new Range(r1, options2);
- r2 = new Range(r2, options2);
- return r1.intersects(r2, options2);
- };
- module.exports = intersects;
-});
-
-// ../eve/node_modules/semver/ranges/simplify.js
-var require_simplify = __commonJS((exports, module) => {
- var satisfies = require_satisfies();
- var compare = require_compare();
- module.exports = (versions, range, options2) => {
- const set = [];
- let first = null;
- let prev = null;
- const v = versions.sort((a, b) => compare(a, b, options2));
- for (const version2 of v) {
- const included = satisfies(version2, range, options2);
- if (included) {
- prev = version2;
- if (!first) {
- first = version2;
- }
- } else {
- if (prev) {
- set.push([first, prev]);
- }
- prev = null;
- first = null;
- }
- }
- if (first) {
- set.push([first, null]);
- }
- const ranges = [];
- for (const [min, max] of set) {
- if (min === max) {
- ranges.push(min);
- } else if (!max && min === v[0]) {
- ranges.push("*");
- } else if (!max) {
- ranges.push(`>=${min}`);
- } else if (min === v[0]) {
- ranges.push(`<=${max}`);
- } else {
- ranges.push(`${min} - ${max}`);
- }
- }
- const simplified = ranges.join(" || ");
- const original = typeof range.raw === "string" ? range.raw : String(range);
- return simplified.length < original.length ? simplified : range;
- };
-});
-
-// ../eve/node_modules/semver/ranges/subset.js
-var require_subset = __commonJS((exports, module) => {
- var Range = require_range();
- var Comparator = require_comparator();
- var { ANY } = Comparator;
- var satisfies = require_satisfies();
- var compare = require_compare();
- var subset = (sub, dom, options2 = {}) => {
- if (sub === dom) {
- return true;
- }
- sub = new Range(sub, options2);
- dom = new Range(dom, options2);
- let sawNonNull = false;
- OUTER:
- for (const simpleSub of sub.set) {
- for (const simpleDom of dom.set) {
- const isSub = simpleSubset(simpleSub, simpleDom, options2);
- sawNonNull = sawNonNull || isSub !== null;
- if (isSub) {
- continue OUTER;
- }
- }
- if (sawNonNull) {
- return false;
- }
- }
- return true;
- };
- var minimumVersionWithPreRelease = [new Comparator(">=0.0.0-0")];
- var minimumVersion = [new Comparator(">=0.0.0")];
- var simpleSubset = (sub, dom, options2) => {
- if (sub === dom) {
- return true;
- }
- if (sub.length === 1 && sub[0].semver === ANY) {
- if (dom.length === 1 && dom[0].semver === ANY) {
- return true;
- } else if (options2.includePrerelease) {
- sub = minimumVersionWithPreRelease;
- } else {
- sub = minimumVersion;
- }
- }
- if (dom.length === 1 && dom[0].semver === ANY) {
- if (options2.includePrerelease) {
- return true;
- } else {
- dom = minimumVersion;
- }
- }
- const eqSet = new Set;
- let gt2, lt2;
- for (const c of sub) {
- if (c.operator === ">" || c.operator === ">=") {
- gt2 = higherGT(gt2, c, options2);
- } else if (c.operator === "<" || c.operator === "<=") {
- lt2 = lowerLT(lt2, c, options2);
- } else {
- eqSet.add(c.semver);
- }
- }
- if (eqSet.size > 1) {
- return null;
- }
- let gtltComp;
- if (gt2 && lt2) {
- gtltComp = compare(gt2.semver, lt2.semver, options2);
- if (gtltComp > 0) {
- return null;
- } else if (gtltComp === 0 && (gt2.operator !== ">=" || lt2.operator !== "<=")) {
- return null;
- }
- }
- for (const eq2 of eqSet) {
- if (gt2 && !satisfies(eq2, String(gt2), options2)) {
- return null;
- }
- if (lt2 && !satisfies(eq2, String(lt2), options2)) {
- return null;
- }
- for (const c of dom) {
- if (!satisfies(eq2, String(c), options2)) {
- return false;
- }
- }
- return true;
- }
- let higher, lower;
- let hasDomLT, hasDomGT;
- let needDomLTPre = lt2 && !options2.includePrerelease && lt2.semver.prerelease.length ? lt2.semver : false;
- let needDomGTPre = gt2 && !options2.includePrerelease && gt2.semver.prerelease.length ? gt2.semver : false;
- if (needDomLTPre && needDomLTPre.prerelease.length === 1 && lt2.operator === "<" && needDomLTPre.prerelease[0] === 0) {
- needDomLTPre = false;
- }
- for (const c of dom) {
- hasDomGT = hasDomGT || c.operator === ">" || c.operator === ">=";
- hasDomLT = hasDomLT || c.operator === "<" || c.operator === "<=";
- if (gt2) {
- if (needDomGTPre) {
- if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomGTPre.major && c.semver.minor === needDomGTPre.minor && c.semver.patch === needDomGTPre.patch) {
- needDomGTPre = false;
- }
- }
- if (c.operator === ">" || c.operator === ">=") {
- higher = higherGT(gt2, c, options2);
- if (higher === c && higher !== gt2) {
- return false;
- }
- } else if (gt2.operator === ">=" && !satisfies(gt2.semver, String(c), options2)) {
- return false;
- }
- }
- if (lt2) {
- if (needDomLTPre) {
- if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomLTPre.major && c.semver.minor === needDomLTPre.minor && c.semver.patch === needDomLTPre.patch) {
- needDomLTPre = false;
- }
- }
- if (c.operator === "<" || c.operator === "<=") {
- lower = lowerLT(lt2, c, options2);
- if (lower === c && lower !== lt2) {
- return false;
- }
- } else if (lt2.operator === "<=" && !satisfies(lt2.semver, String(c), options2)) {
- return false;
- }
- }
- if (!c.operator && (lt2 || gt2) && gtltComp !== 0) {
- return false;
- }
- }
- if (gt2 && hasDomLT && !lt2 && gtltComp !== 0) {
- return false;
- }
- if (lt2 && hasDomGT && !gt2 && gtltComp !== 0) {
- return false;
- }
- if (needDomGTPre || needDomLTPre) {
- return false;
- }
- return true;
- };
- var higherGT = (a, b, options2) => {
- if (!a) {
- return b;
- }
- const comp = compare(a.semver, b.semver, options2);
- return comp > 0 ? a : comp < 0 ? b : b.operator === ">" && a.operator === ">=" ? b : a;
- };
- var lowerLT = (a, b, options2) => {
- if (!a) {
- return b;
- }
- const comp = compare(a.semver, b.semver, options2);
- return comp < 0 ? a : comp > 0 ? b : b.operator === "<" && a.operator === "<=" ? b : a;
- };
- module.exports = subset;
-});
-
-// ../eve/node_modules/semver/index.js
-var require_semver2 = __commonJS((exports, module) => {
- var internalRe = require_re();
- var constants = require_constants();
- var SemVer = require_semver();
- var identifiers = require_identifiers();
- var parse = require_parse();
- var valid = require_valid();
- var clean = require_clean();
- var inc = require_inc();
- var diff = require_diff();
- var major = require_major();
- var minor = require_minor();
- var patch = require_patch();
- var prerelease = require_prerelease();
- var compare = require_compare();
- var rcompare = require_rcompare();
- var compareLoose = require_compare_loose();
- var compareBuild = require_compare_build();
- var sort = require_sort();
- var rsort = require_rsort();
- var gt2 = require_gt();
- var lt2 = require_lt();
- var eq2 = require_eq();
- var neq = require_neq();
- var gte2 = require_gte();
- var lte2 = require_lte();
- var cmp = require_cmp();
- var coerce = require_coerce();
- var Comparator = require_comparator();
- var Range = require_range();
- var satisfies = require_satisfies();
- var toComparators = require_to_comparators();
- var maxSatisfying = require_max_satisfying();
- var minSatisfying = require_min_satisfying();
- var minVersion = require_min_version();
- var validRange = require_valid2();
- var outside = require_outside();
- var gtr = require_gtr();
- var ltr = require_ltr();
- var intersects = require_intersects();
- var simplifyRange = require_simplify();
- var subset = require_subset();
- module.exports = {
- parse,
- valid,
- clean,
- inc,
- diff,
- major,
- minor,
- patch,
- prerelease,
- compare,
- rcompare,
- compareLoose,
- compareBuild,
- sort,
- rsort,
- gt: gt2,
- lt: lt2,
- eq: eq2,
- neq,
- gte: gte2,
- lte: lte2,
- cmp,
- coerce,
- Comparator,
- Range,
- satisfies,
- toComparators,
- maxSatisfying,
- minSatisfying,
- minVersion,
- validRange,
- outside,
- gtr,
- ltr,
- intersects,
- simplifyRange,
- subset,
- SemVer,
- re: internalRe.re,
- src: internalRe.src,
- tokens: internalRe.t,
- SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,
- RELEASE_TYPES: constants.RELEASE_TYPES,
- compareIdentifiers: identifiers.compareIdentifiers,
- rcompareIdentifiers: identifiers.rcompareIdentifiers
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/asymmetricKeyDetailsSupported.js
-var require_asymmetricKeyDetailsSupported = __commonJS((exports, module) => {
- var semver = require_semver2();
- module.exports = semver.satisfies(process.version, ">=15.7.0");
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/rsaPssKeyDetailsSupported.js
-var require_rsaPssKeyDetailsSupported = __commonJS((exports, module) => {
- var semver = require_semver2();
- module.exports = semver.satisfies(process.version, ">=16.9.0");
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/validateAsymmetricKey.js
-var require_validateAsymmetricKey = __commonJS((exports, module) => {
- var ASYMMETRIC_KEY_DETAILS_SUPPORTED = require_asymmetricKeyDetailsSupported();
- var RSA_PSS_KEY_DETAILS_SUPPORTED = require_rsaPssKeyDetailsSupported();
- var allowedAlgorithmsForKeys = {
- ec: ["ES256", "ES384", "ES512"],
- rsa: ["RS256", "PS256", "RS384", "PS384", "RS512", "PS512"],
- "rsa-pss": ["PS256", "PS384", "PS512"]
- };
- var allowedCurves = {
- ES256: "prime256v1",
- ES384: "secp384r1",
- ES512: "secp521r1"
- };
- module.exports = function(algorithm, key) {
- if (!algorithm || !key)
- return;
- const keyType = key.asymmetricKeyType;
- if (!keyType)
- return;
- const allowedAlgorithms = allowedAlgorithmsForKeys[keyType];
- if (!allowedAlgorithms) {
- throw new Error(`Unknown key type "${keyType}".`);
- }
- if (!allowedAlgorithms.includes(algorithm)) {
- throw new Error(`"alg" parameter for "${keyType}" key type must be one of: ${allowedAlgorithms.join(", ")}.`);
- }
- if (ASYMMETRIC_KEY_DETAILS_SUPPORTED) {
- switch (keyType) {
- case "ec":
- const keyCurve = key.asymmetricKeyDetails.namedCurve;
- const allowedCurve = allowedCurves[algorithm];
- if (keyCurve !== allowedCurve) {
- throw new Error(`"alg" parameter "${algorithm}" requires curve "${allowedCurve}".`);
- }
- break;
- case "rsa-pss":
- if (RSA_PSS_KEY_DETAILS_SUPPORTED) {
- const length = parseInt(algorithm.slice(-3), 10);
- const { hashAlgorithm, mgf1HashAlgorithm, saltLength } = key.asymmetricKeyDetails;
- if (hashAlgorithm !== `sha${length}` || mgf1HashAlgorithm !== hashAlgorithm) {
- throw new Error(`Invalid key for this operation, its RSA-PSS parameters do not meet the requirements of "alg" ${algorithm}.`);
- }
- if (saltLength !== undefined && saltLength > length >> 3) {
- throw new Error(`Invalid key for this operation, its RSA-PSS parameter saltLength does not meet the requirements of "alg" ${algorithm}.`);
- }
- }
- break;
- }
- }
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/psSupported.js
-var require_psSupported = __commonJS((exports, module) => {
- var semver = require_semver2();
- module.exports = semver.satisfies(process.version, "^6.12.0 || >=8.0.0");
-});
-
-// ../eve/node_modules/jsonwebtoken/verify.js
-var require_verify = __commonJS((exports, module) => {
- var JsonWebTokenError = require_JsonWebTokenError();
- var NotBeforeError = require_NotBeforeError();
- var TokenExpiredError = require_TokenExpiredError();
- var decode = require_decode();
- var timespan = require_timespan();
- var validateAsymmetricKey = require_validateAsymmetricKey();
- var PS_SUPPORTED = require_psSupported();
- var jws = require_jws();
- var { KeyObject, createSecretKey, createPublicKey } = __require("crypto");
- var PUB_KEY_ALGS = ["RS256", "RS384", "RS512"];
- var EC_KEY_ALGS = ["ES256", "ES384", "ES512"];
- var RSA_KEY_ALGS = ["RS256", "RS384", "RS512"];
- var HS_ALGS = ["HS256", "HS384", "HS512"];
- if (PS_SUPPORTED) {
- PUB_KEY_ALGS.splice(PUB_KEY_ALGS.length, 0, "PS256", "PS384", "PS512");
- RSA_KEY_ALGS.splice(RSA_KEY_ALGS.length, 0, "PS256", "PS384", "PS512");
- }
- module.exports = function(jwtString, secretOrPublicKey, options2, callback) {
- if (typeof options2 === "function" && !callback) {
- callback = options2;
- options2 = {};
- }
- if (!options2) {
- options2 = {};
- }
- options2 = Object.assign({}, options2);
- let done;
- if (callback) {
- done = callback;
- } else {
- done = function(err, data) {
- if (err)
- throw err;
- return data;
- };
- }
- if (options2.clockTimestamp && typeof options2.clockTimestamp !== "number") {
- return done(new JsonWebTokenError("clockTimestamp must be a number"));
- }
- if (options2.nonce !== undefined && (typeof options2.nonce !== "string" || options2.nonce.trim() === "")) {
- return done(new JsonWebTokenError("nonce must be a non-empty string"));
- }
- if (options2.allowInvalidAsymmetricKeyTypes !== undefined && typeof options2.allowInvalidAsymmetricKeyTypes !== "boolean") {
- return done(new JsonWebTokenError("allowInvalidAsymmetricKeyTypes must be a boolean"));
- }
- const clockTimestamp = options2.clockTimestamp || Math.floor(Date.now() / 1000);
- if (!jwtString) {
- return done(new JsonWebTokenError("jwt must be provided"));
- }
- if (typeof jwtString !== "string") {
- return done(new JsonWebTokenError("jwt must be a string"));
- }
- const parts = jwtString.split(".");
- if (parts.length !== 3) {
- return done(new JsonWebTokenError("jwt malformed"));
- }
- let decodedToken;
- try {
- decodedToken = decode(jwtString, { complete: true });
- } catch (err) {
- return done(err);
- }
- if (!decodedToken) {
- return done(new JsonWebTokenError("invalid token"));
- }
- const header = decodedToken.header;
- let getSecret;
- if (typeof secretOrPublicKey === "function") {
- if (!callback) {
- return done(new JsonWebTokenError("verify must be called asynchronous if secret or public key is provided as a callback"));
- }
- getSecret = secretOrPublicKey;
- } else {
- getSecret = function(header2, secretCallback) {
- return secretCallback(null, secretOrPublicKey);
- };
- }
- return getSecret(header, function(err, secretOrPublicKey2) {
- if (err) {
- return done(new JsonWebTokenError("error in secret or public key callback: " + err.message));
- }
- const hasSignature = parts[2].trim() !== "";
- if (!hasSignature && secretOrPublicKey2) {
- return done(new JsonWebTokenError("jwt signature is required"));
- }
- if (hasSignature && !secretOrPublicKey2) {
- return done(new JsonWebTokenError("secret or public key must be provided"));
- }
- if (!hasSignature && !options2.algorithms) {
- return done(new JsonWebTokenError('please specify "none" in "algorithms" to verify unsigned tokens'));
- }
- if (secretOrPublicKey2 != null && !(secretOrPublicKey2 instanceof KeyObject)) {
- try {
- secretOrPublicKey2 = createPublicKey(secretOrPublicKey2);
- } catch (_) {
- try {
- secretOrPublicKey2 = createSecretKey(typeof secretOrPublicKey2 === "string" ? Buffer.from(secretOrPublicKey2) : secretOrPublicKey2);
- } catch (_2) {
- return done(new JsonWebTokenError("secretOrPublicKey is not valid key material"));
- }
- }
- }
- if (!options2.algorithms) {
- if (secretOrPublicKey2.type === "secret") {
- options2.algorithms = HS_ALGS;
- } else if (["rsa", "rsa-pss"].includes(secretOrPublicKey2.asymmetricKeyType)) {
- options2.algorithms = RSA_KEY_ALGS;
- } else if (secretOrPublicKey2.asymmetricKeyType === "ec") {
- options2.algorithms = EC_KEY_ALGS;
- } else {
- options2.algorithms = PUB_KEY_ALGS;
- }
- }
- if (options2.algorithms.indexOf(decodedToken.header.alg) === -1) {
- return done(new JsonWebTokenError("invalid algorithm"));
- }
- if (header.alg.startsWith("HS") && secretOrPublicKey2.type !== "secret") {
- return done(new JsonWebTokenError(`secretOrPublicKey must be a symmetric key when using ${header.alg}`));
- } else if (/^(?:RS|PS|ES)/.test(header.alg) && secretOrPublicKey2.type !== "public") {
- return done(new JsonWebTokenError(`secretOrPublicKey must be an asymmetric key when using ${header.alg}`));
- }
- if (!options2.allowInvalidAsymmetricKeyTypes) {
- try {
- validateAsymmetricKey(header.alg, secretOrPublicKey2);
- } catch (e) {
- return done(e);
- }
- }
- let valid;
- try {
- valid = jws.verify(jwtString, decodedToken.header.alg, secretOrPublicKey2);
- } catch (e) {
- return done(e);
- }
- if (!valid) {
- return done(new JsonWebTokenError("invalid signature"));
- }
- const payload = decodedToken.payload;
- if (typeof payload.nbf !== "undefined" && !options2.ignoreNotBefore) {
- if (typeof payload.nbf !== "number") {
- return done(new JsonWebTokenError("invalid nbf value"));
- }
- if (payload.nbf > clockTimestamp + (options2.clockTolerance || 0)) {
- return done(new NotBeforeError("jwt not active", new Date(payload.nbf * 1000)));
- }
- }
- if (typeof payload.exp !== "undefined" && !options2.ignoreExpiration) {
- if (typeof payload.exp !== "number") {
- return done(new JsonWebTokenError("invalid exp value"));
- }
- if (clockTimestamp >= payload.exp + (options2.clockTolerance || 0)) {
- return done(new TokenExpiredError("jwt expired", new Date(payload.exp * 1000)));
- }
- }
- if (options2.audience) {
- const audiences = Array.isArray(options2.audience) ? options2.audience : [options2.audience];
- const target = Array.isArray(payload.aud) ? payload.aud : [payload.aud];
- const match = target.some(function(targetAudience) {
- return audiences.some(function(audience) {
- return audience instanceof RegExp ? audience.test(targetAudience) : audience === targetAudience;
- });
- });
- if (!match) {
- return done(new JsonWebTokenError("jwt audience invalid. expected: " + audiences.join(" or ")));
- }
- }
- if (options2.issuer) {
- const invalid_issuer = typeof options2.issuer === "string" && payload.iss !== options2.issuer || Array.isArray(options2.issuer) && options2.issuer.indexOf(payload.iss) === -1;
- if (invalid_issuer) {
- return done(new JsonWebTokenError("jwt issuer invalid. expected: " + options2.issuer));
- }
- }
- if (options2.subject) {
- if (payload.sub !== options2.subject) {
- return done(new JsonWebTokenError("jwt subject invalid. expected: " + options2.subject));
- }
- }
- if (options2.jwtid) {
- if (payload.jti !== options2.jwtid) {
- return done(new JsonWebTokenError("jwt jwtid invalid. expected: " + options2.jwtid));
- }
- }
- if (options2.nonce) {
- if (payload.nonce !== options2.nonce) {
- return done(new JsonWebTokenError("jwt nonce invalid. expected: " + options2.nonce));
- }
- }
- if (options2.maxAge) {
- if (typeof payload.iat !== "number") {
- return done(new JsonWebTokenError("iat required when maxAge is specified"));
- }
- const maxAgeTimestamp = timespan(options2.maxAge, payload.iat);
- if (typeof maxAgeTimestamp === "undefined") {
- return done(new JsonWebTokenError('"maxAge" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
- }
- if (clockTimestamp >= maxAgeTimestamp + (options2.clockTolerance || 0)) {
- return done(new TokenExpiredError("maxAge exceeded", new Date(maxAgeTimestamp * 1000)));
- }
- }
- if (options2.complete === true) {
- const signature = decodedToken.signature;
- return done(null, {
- header,
- payload,
- signature
- });
- }
- return done(null, payload);
- });
- };
-});
-
-// ../eve/node_modules/lodash.includes/index.js
-var require_lodash = __commonJS((exports, module) => {
- var INFINITY = 1 / 0;
- var MAX_SAFE_INTEGER = 9007199254740991;
- var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
- var NAN = 0 / 0;
- var argsTag = "[object Arguments]";
- var funcTag = "[object Function]";
- var genTag = "[object GeneratorFunction]";
- var stringTag = "[object String]";
- var symbolTag = "[object Symbol]";
- var reTrim = /^\s+|\s+$/g;
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
- var reIsBinary = /^0b[01]+$/i;
- var reIsOctal = /^0o[0-7]+$/i;
- var reIsUint = /^(?:0|[1-9]\d*)$/;
- var freeParseInt = parseInt;
- function arrayMap(array, iteratee) {
- var index2 = -1, length = array ? array.length : 0, result = Array(length);
- while (++index2 < length) {
- result[index2] = iteratee(array[index2], index2, array);
- }
- return result;
- }
- function baseFindIndex(array, predicate, fromIndex, fromRight) {
- var length = array.length, index2 = fromIndex + (fromRight ? 1 : -1);
- while (fromRight ? index2-- : ++index2 < length) {
- if (predicate(array[index2], index2, array)) {
- return index2;
- }
- }
- return -1;
- }
- function baseIndexOf(array, value, fromIndex) {
- if (value !== value) {
- return baseFindIndex(array, baseIsNaN, fromIndex);
- }
- var index2 = fromIndex - 1, length = array.length;
- while (++index2 < length) {
- if (array[index2] === value) {
- return index2;
- }
- }
- return -1;
- }
- function baseIsNaN(value) {
- return value !== value;
- }
- function baseTimes(n, iteratee) {
- var index2 = -1, result = Array(n);
- while (++index2 < n) {
- result[index2] = iteratee(index2);
- }
- return result;
- }
- function baseValues(object, props) {
- return arrayMap(props, function(key) {
- return object[key];
- });
- }
- function overArg(func, transform) {
- return function(arg) {
- return func(transform(arg));
- };
- }
- var objectProto = Object.prototype;
- var hasOwnProperty = objectProto.hasOwnProperty;
- var objectToString = objectProto.toString;
- var propertyIsEnumerable = objectProto.propertyIsEnumerable;
- var nativeKeys = overArg(Object.keys, Object);
- var nativeMax = Math.max;
- function arrayLikeKeys(value, inherited) {
- var result = isArray(value) || isArguments(value) ? baseTimes(value.length, String) : [];
- var length = result.length, skipIndexes = !!length;
- for (var key in value) {
- if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && (key == "length" || isIndex(key, length)))) {
- result.push(key);
- }
- }
- return result;
- }
- function baseKeys(object) {
- if (!isPrototype(object)) {
- return nativeKeys(object);
- }
- var result = [];
- for (var key in Object(object)) {
- if (hasOwnProperty.call(object, key) && key != "constructor") {
- result.push(key);
- }
- }
- return result;
- }
- function isIndex(value, length) {
- length = length == null ? MAX_SAFE_INTEGER : length;
- return !!length && (typeof value == "number" || reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
- }
- function isPrototype(value) {
- var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto;
- return value === proto;
- }
- function includes(collection, value, fromIndex, guard) {
- collection = isArrayLike(collection) ? collection : values(collection);
- fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0;
- var length = collection.length;
- if (fromIndex < 0) {
- fromIndex = nativeMax(length + fromIndex, 0);
- }
- return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;
- }
- function isArguments(value) {
- return isArrayLikeObject(value) && hasOwnProperty.call(value, "callee") && (!propertyIsEnumerable.call(value, "callee") || objectToString.call(value) == argsTag);
- }
- var isArray = Array.isArray;
- function isArrayLike(value) {
- return value != null && isLength(value.length) && !isFunction(value);
- }
- function isArrayLikeObject(value) {
- return isObjectLike(value) && isArrayLike(value);
- }
- function isFunction(value) {
- var tag = isObject(value) ? objectToString.call(value) : "";
- return tag == funcTag || tag == genTag;
- }
- function isLength(value) {
- return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
- }
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == "object" || type == "function");
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isString(value) {
- return typeof value == "string" || !isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag;
- }
- function isSymbol(value) {
- return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
- }
- function toFinite(value) {
- if (!value) {
- return value === 0 ? value : 0;
- }
- value = toNumber(value);
- if (value === INFINITY || value === -INFINITY) {
- var sign = value < 0 ? -1 : 1;
- return sign * MAX_INTEGER;
- }
- return value === value ? value : 0;
- }
- function toInteger(value) {
- var result = toFinite(value), remainder = result % 1;
- return result === result ? remainder ? result - remainder : result : 0;
- }
- function toNumber(value) {
- if (typeof value == "number") {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == "function" ? value.valueOf() : value;
- value = isObject(other) ? other + "" : other;
- }
- if (typeof value != "string") {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, "");
- var isBinary = reIsBinary.test(value);
- return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
- }
- function keys(object) {
- return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
- }
- function values(object) {
- return object ? baseValues(object, keys(object)) : [];
- }
- module.exports = includes;
-});
-
-// ../eve/node_modules/lodash.isboolean/index.js
-var require_lodash2 = __commonJS((exports, module) => {
- var boolTag = "[object Boolean]";
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function isBoolean(value) {
- return value === true || value === false || isObjectLike(value) && objectToString.call(value) == boolTag;
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- module.exports = isBoolean;
-});
-
-// ../eve/node_modules/lodash.isinteger/index.js
-var require_lodash3 = __commonJS((exports, module) => {
- var INFINITY = 1 / 0;
- var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
- var NAN = 0 / 0;
- var symbolTag = "[object Symbol]";
- var reTrim = /^\s+|\s+$/g;
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
- var reIsBinary = /^0b[01]+$/i;
- var reIsOctal = /^0o[0-7]+$/i;
- var freeParseInt = parseInt;
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function isInteger(value) {
- return typeof value == "number" && value == toInteger(value);
- }
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == "object" || type == "function");
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isSymbol(value) {
- return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
- }
- function toFinite(value) {
- if (!value) {
- return value === 0 ? value : 0;
- }
- value = toNumber(value);
- if (value === INFINITY || value === -INFINITY) {
- var sign = value < 0 ? -1 : 1;
- return sign * MAX_INTEGER;
- }
- return value === value ? value : 0;
- }
- function toInteger(value) {
- var result = toFinite(value), remainder = result % 1;
- return result === result ? remainder ? result - remainder : result : 0;
- }
- function toNumber(value) {
- if (typeof value == "number") {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == "function" ? value.valueOf() : value;
- value = isObject(other) ? other + "" : other;
- }
- if (typeof value != "string") {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, "");
- var isBinary = reIsBinary.test(value);
- return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
- }
- module.exports = isInteger;
-});
-
-// ../eve/node_modules/lodash.isnumber/index.js
-var require_lodash4 = __commonJS((exports, module) => {
- var numberTag = "[object Number]";
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isNumber(value) {
- return typeof value == "number" || isObjectLike(value) && objectToString.call(value) == numberTag;
- }
- module.exports = isNumber;
-});
-
-// ../eve/node_modules/lodash.isplainobject/index.js
-var require_lodash5 = __commonJS((exports, module) => {
- var objectTag = "[object Object]";
- function isHostObject(value) {
- var result = false;
- if (value != null && typeof value.toString != "function") {
- try {
- result = !!(value + "");
- } catch (e) {}
- }
- return result;
- }
- function overArg(func, transform) {
- return function(arg) {
- return func(transform(arg));
- };
- }
- var funcProto = Function.prototype;
- var objectProto = Object.prototype;
- var funcToString = funcProto.toString;
- var hasOwnProperty = objectProto.hasOwnProperty;
- var objectCtorString = funcToString.call(Object);
- var objectToString = objectProto.toString;
- var getPrototype = overArg(Object.getPrototypeOf, Object);
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isPlainObject(value) {
- if (!isObjectLike(value) || objectToString.call(value) != objectTag || isHostObject(value)) {
- return false;
- }
- var proto = getPrototype(value);
- if (proto === null) {
- return true;
- }
- var Ctor = hasOwnProperty.call(proto, "constructor") && proto.constructor;
- return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
- }
- module.exports = isPlainObject;
-});
-
-// ../eve/node_modules/lodash.isstring/index.js
-var require_lodash6 = __commonJS((exports, module) => {
- var stringTag = "[object String]";
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- var isArray = Array.isArray;
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isString(value) {
- return typeof value == "string" || !isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag;
- }
- module.exports = isString;
-});
-
-// ../eve/node_modules/lodash.once/index.js
-var require_lodash7 = __commonJS((exports, module) => {
- var FUNC_ERROR_TEXT = "Expected a function";
- var INFINITY = 1 / 0;
- var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
- var NAN = 0 / 0;
- var symbolTag = "[object Symbol]";
- var reTrim = /^\s+|\s+$/g;
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
- var reIsBinary = /^0b[01]+$/i;
- var reIsOctal = /^0o[0-7]+$/i;
- var freeParseInt = parseInt;
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function before(n, func) {
- var result;
- if (typeof func != "function") {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- n = toInteger(n);
- return function() {
- if (--n > 0) {
- result = func.apply(this, arguments);
- }
- if (n <= 1) {
- func = undefined;
- }
- return result;
- };
- }
- function once(func) {
- return before(2, func);
- }
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == "object" || type == "function");
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isSymbol(value) {
- return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
- }
- function toFinite(value) {
- if (!value) {
- return value === 0 ? value : 0;
- }
- value = toNumber(value);
- if (value === INFINITY || value === -INFINITY) {
- var sign = value < 0 ? -1 : 1;
- return sign * MAX_INTEGER;
- }
- return value === value ? value : 0;
- }
- function toInteger(value) {
- var result = toFinite(value), remainder = result % 1;
- return result === result ? remainder ? result - remainder : result : 0;
- }
- function toNumber(value) {
- if (typeof value == "number") {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == "function" ? value.valueOf() : value;
- value = isObject(other) ? other + "" : other;
- }
- if (typeof value != "string") {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, "");
- var isBinary = reIsBinary.test(value);
- return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
- }
- module.exports = once;
-});
-
-// ../eve/node_modules/jsonwebtoken/sign.js
-var require_sign = __commonJS((exports, module) => {
- var timespan = require_timespan();
- var PS_SUPPORTED = require_psSupported();
- var validateAsymmetricKey = require_validateAsymmetricKey();
- var jws = require_jws();
- var includes = require_lodash();
- var isBoolean = require_lodash2();
- var isInteger = require_lodash3();
- var isNumber = require_lodash4();
- var isPlainObject = require_lodash5();
- var isString = require_lodash6();
- var once = require_lodash7();
- var { KeyObject, createSecretKey, createPrivateKey } = __require("crypto");
- var SUPPORTED_ALGS = ["RS256", "RS384", "RS512", "ES256", "ES384", "ES512", "HS256", "HS384", "HS512", "none"];
- if (PS_SUPPORTED) {
- SUPPORTED_ALGS.splice(3, 0, "PS256", "PS384", "PS512");
- }
- var sign_options_schema = {
- expiresIn: { isValid: function(value) {
- return isInteger(value) || isString(value) && value;
- }, message: '"expiresIn" should be a number of seconds or string representing a timespan' },
- notBefore: { isValid: function(value) {
- return isInteger(value) || isString(value) && value;
- }, message: '"notBefore" should be a number of seconds or string representing a timespan' },
- audience: { isValid: function(value) {
- return isString(value) || Array.isArray(value);
- }, message: '"audience" must be a string or array' },
- algorithm: { isValid: includes.bind(null, SUPPORTED_ALGS), message: '"algorithm" must be a valid string enum value' },
- header: { isValid: isPlainObject, message: '"header" must be an object' },
- encoding: { isValid: isString, message: '"encoding" must be a string' },
- issuer: { isValid: isString, message: '"issuer" must be a string' },
- subject: { isValid: isString, message: '"subject" must be a string' },
- jwtid: { isValid: isString, message: '"jwtid" must be a string' },
- noTimestamp: { isValid: isBoolean, message: '"noTimestamp" must be a boolean' },
- keyid: { isValid: isString, message: '"keyid" must be a string' },
- mutatePayload: { isValid: isBoolean, message: '"mutatePayload" must be a boolean' },
- allowInsecureKeySizes: { isValid: isBoolean, message: '"allowInsecureKeySizes" must be a boolean' },
- allowInvalidAsymmetricKeyTypes: { isValid: isBoolean, message: '"allowInvalidAsymmetricKeyTypes" must be a boolean' }
- };
- var registered_claims_schema = {
- iat: { isValid: isNumber, message: '"iat" should be a number of seconds' },
- exp: { isValid: isNumber, message: '"exp" should be a number of seconds' },
- nbf: { isValid: isNumber, message: '"nbf" should be a number of seconds' }
- };
- function validate(schema, allowUnknown, object, parameterName) {
- if (!isPlainObject(object)) {
- throw new Error('Expected "' + parameterName + '" to be a plain object.');
- }
- Object.keys(object).forEach(function(key) {
- const validator = schema[key];
- if (!validator) {
- if (!allowUnknown) {
- throw new Error('"' + key + '" is not allowed in "' + parameterName + '"');
- }
- return;
- }
- if (!validator.isValid(object[key])) {
- throw new Error(validator.message);
- }
- });
- }
- function validateOptions(options2) {
- return validate(sign_options_schema, false, options2, "options");
- }
- function validatePayload(payload) {
- return validate(registered_claims_schema, true, payload, "payload");
- }
- var options_to_payload = {
- audience: "aud",
- issuer: "iss",
- subject: "sub",
- jwtid: "jti"
- };
- var options_for_objects = [
- "expiresIn",
- "notBefore",
- "noTimestamp",
- "audience",
- "issuer",
- "subject",
- "jwtid"
- ];
- module.exports = function(payload, secretOrPrivateKey, options2, callback) {
- if (typeof options2 === "function") {
- callback = options2;
- options2 = {};
- } else {
- options2 = options2 || {};
- }
- const isObjectPayload = typeof payload === "object" && !Buffer.isBuffer(payload);
- const header = Object.assign({
- alg: options2.algorithm || "HS256",
- typ: isObjectPayload ? "JWT" : undefined,
- kid: options2.keyid
- }, options2.header);
- function failure(err) {
- if (callback) {
- return callback(err);
- }
- throw err;
- }
- if (!secretOrPrivateKey && options2.algorithm !== "none") {
- return failure(new Error("secretOrPrivateKey must have a value"));
- }
- if (secretOrPrivateKey != null && !(secretOrPrivateKey instanceof KeyObject)) {
- try {
- secretOrPrivateKey = createPrivateKey(secretOrPrivateKey);
- } catch (_) {
- try {
- secretOrPrivateKey = createSecretKey(typeof secretOrPrivateKey === "string" ? Buffer.from(secretOrPrivateKey) : secretOrPrivateKey);
- } catch (_2) {
- return failure(new Error("secretOrPrivateKey is not valid key material"));
- }
- }
- }
- if (header.alg.startsWith("HS") && secretOrPrivateKey.type !== "secret") {
- return failure(new Error(`secretOrPrivateKey must be a symmetric key when using ${header.alg}`));
- } else if (/^(?:RS|PS|ES)/.test(header.alg)) {
- if (secretOrPrivateKey.type !== "private") {
- return failure(new Error(`secretOrPrivateKey must be an asymmetric key when using ${header.alg}`));
- }
- if (!options2.allowInsecureKeySizes && !header.alg.startsWith("ES") && secretOrPrivateKey.asymmetricKeyDetails !== undefined && secretOrPrivateKey.asymmetricKeyDetails.modulusLength < 2048) {
- return failure(new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`));
- }
- }
- if (typeof payload === "undefined") {
- return failure(new Error("payload is required"));
- } else if (isObjectPayload) {
- try {
- validatePayload(payload);
- } catch (error) {
- return failure(error);
- }
- if (!options2.mutatePayload) {
- payload = Object.assign({}, payload);
- }
- } else {
- const invalid_options = options_for_objects.filter(function(opt) {
- return typeof options2[opt] !== "undefined";
- });
- if (invalid_options.length > 0) {
- return failure(new Error("invalid " + invalid_options.join(",") + " option for " + typeof payload + " payload"));
- }
- }
- if (typeof payload.exp !== "undefined" && typeof options2.expiresIn !== "undefined") {
- return failure(new Error('Bad "options.expiresIn" option the payload already has an "exp" property.'));
- }
- if (typeof payload.nbf !== "undefined" && typeof options2.notBefore !== "undefined") {
- return failure(new Error('Bad "options.notBefore" option the payload already has an "nbf" property.'));
- }
- try {
- validateOptions(options2);
- } catch (error) {
- return failure(error);
- }
- if (!options2.allowInvalidAsymmetricKeyTypes) {
- try {
- validateAsymmetricKey(header.alg, secretOrPrivateKey);
- } catch (error) {
- return failure(error);
- }
- }
- const timestamp = payload.iat || Math.floor(Date.now() / 1000);
- if (options2.noTimestamp) {
- delete payload.iat;
- } else if (isObjectPayload) {
- payload.iat = timestamp;
- }
- if (typeof options2.notBefore !== "undefined") {
- try {
- payload.nbf = timespan(options2.notBefore, timestamp);
- } catch (err) {
- return failure(err);
- }
- if (typeof payload.nbf === "undefined") {
- return failure(new Error('"notBefore" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
- }
- }
- if (typeof options2.expiresIn !== "undefined" && typeof payload === "object") {
- try {
- payload.exp = timespan(options2.expiresIn, timestamp);
- } catch (err) {
- return failure(err);
- }
- if (typeof payload.exp === "undefined") {
- return failure(new Error('"expiresIn" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
- }
- }
- Object.keys(options_to_payload).forEach(function(key) {
- const claim = options_to_payload[key];
- if (typeof options2[key] !== "undefined") {
- if (typeof payload[claim] !== "undefined") {
- return failure(new Error('Bad "options.' + key + '" option. The payload already has an "' + claim + '" property.'));
- }
- payload[claim] = options2[key];
- }
- });
- const encoding = options2.encoding || "utf8";
- if (typeof callback === "function") {
- callback = callback && once(callback);
- jws.createSign({
- header,
- privateKey: secretOrPrivateKey,
- payload,
- encoding
- }).once("error", callback).once("done", function(signature) {
- if (!options2.allowInsecureKeySizes && /^(?:RS|PS)/.test(header.alg) && signature.length < 256) {
- return callback(new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`));
- }
- callback(null, signature);
- });
- } else {
- let signature = jws.sign({ header, payload, secret: secretOrPrivateKey, encoding });
- if (!options2.allowInsecureKeySizes && /^(?:RS|PS)/.test(header.alg) && signature.length < 256) {
- throw new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`);
- }
- return signature;
- }
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/index.js
-var require_jsonwebtoken = __commonJS((exports, module) => {
- module.exports = {
- decode: require_decode(),
- verify: require_verify(),
- sign: require_sign(),
- JsonWebTokenError: require_JsonWebTokenError(),
- NotBeforeError: require_NotBeforeError(),
- TokenExpiredError: require_TokenExpiredError()
- };
-});
-
-// ../eve/node_modules/bn.js/lib/bn.js
-var require_bn = __commonJS((exports, module) => {
- (function(module2, exports2) {
- function assert(val, msg) {
- if (!val)
- throw new Error(msg || "Assertion failed");
- }
- function inherits(ctor, superCtor) {
- ctor.super_ = superCtor;
- var TempCtor = function() {};
- TempCtor.prototype = superCtor.prototype;
- ctor.prototype = new TempCtor;
- ctor.prototype.constructor = ctor;
- }
- function BN(number, base, endian) {
- if (BN.isBN(number)) {
- return number;
- }
- this.negative = 0;
- this.words = null;
- this.length = 0;
- this.red = null;
- if (number !== null) {
- if (base === "le" || base === "be") {
- endian = base;
- base = 10;
- }
- this._init(number || 0, base || 10, endian || "be");
- }
- }
- if (typeof module2 === "object") {
- module2.exports = BN;
- } else {
- exports2.BN = BN;
- }
- BN.BN = BN;
- BN.wordSize = 26;
- var Buffer2;
- try {
- if (typeof window !== "undefined" && typeof window.Buffer !== "undefined") {
- Buffer2 = window.Buffer;
- } else {
- Buffer2 = __require("buffer").Buffer;
- }
- } catch (e) {}
- BN.isBN = function isBN(num) {
- if (num instanceof BN) {
- return true;
- }
- return num !== null && typeof num === "object" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);
- };
- BN.max = function max(left, right) {
- if (left.cmp(right) > 0)
- return left;
- return right;
- };
- BN.min = function min(left, right) {
- if (left.cmp(right) < 0)
- return left;
- return right;
- };
- BN.prototype._init = function init(number, base, endian) {
- if (typeof number === "number") {
- return this._initNumber(number, base, endian);
- }
- if (typeof number === "object") {
- return this._initArray(number, base, endian);
- }
- if (base === "hex") {
- base = 16;
- }
- assert(base === (base | 0) && base >= 2 && base <= 36);
- number = number.toString().replace(/\s+/g, "");
- var start = 0;
- if (number[0] === "-") {
- start++;
- this.negative = 1;
- }
- if (start < number.length) {
- if (base === 16) {
- this._parseHex(number, start, endian);
- } else {
- this._parseBase(number, base, start);
- if (endian === "le") {
- this._initArray(this.toArray(), base, endian);
- }
- }
- }
- };
- BN.prototype._initNumber = function _initNumber(number, base, endian) {
- if (number < 0) {
- this.negative = 1;
- number = -number;
- }
- if (number < 67108864) {
- this.words = [number & 67108863];
- this.length = 1;
- } else if (number < 4503599627370496) {
- this.words = [
- number & 67108863,
- number / 67108864 & 67108863
- ];
- this.length = 2;
- } else {
- assert(number < 9007199254740992);
- this.words = [
- number & 67108863,
- number / 67108864 & 67108863,
- 1
- ];
- this.length = 3;
- }
- if (endian !== "le")
- return;
- this._initArray(this.toArray(), base, endian);
- };
- BN.prototype._initArray = function _initArray(number, base, endian) {
- assert(typeof number.length === "number");
- if (number.length <= 0) {
- this.words = [0];
- this.length = 1;
- return this;
- }
- this.length = Math.ceil(number.length / 3);
- this.words = new Array(this.length);
- for (var i = 0;i < this.length; i++) {
- this.words[i] = 0;
- }
- var j, w;
- var off = 0;
- if (endian === "be") {
- for (i = number.length - 1, j = 0;i >= 0; i -= 3) {
- w = number[i] | number[i - 1] << 8 | number[i - 2] << 16;
- this.words[j] |= w << off & 67108863;
- this.words[j + 1] = w >>> 26 - off & 67108863;
- off += 24;
- if (off >= 26) {
- off -= 26;
- j++;
- }
- }
- } else if (endian === "le") {
- for (i = 0, j = 0;i < number.length; i += 3) {
- w = number[i] | number[i + 1] << 8 | number[i + 2] << 16;
- this.words[j] |= w << off & 67108863;
- this.words[j + 1] = w >>> 26 - off & 67108863;
- off += 24;
- if (off >= 26) {
- off -= 26;
- j++;
- }
- }
- }
- return this.strip();
- };
- function parseHex4Bits(string, index2) {
- var c = string.charCodeAt(index2);
- if (c >= 65 && c <= 70) {
- return c - 55;
- } else if (c >= 97 && c <= 102) {
- return c - 87;
- } else {
- return c - 48 & 15;
- }
- }
- function parseHexByte(string, lowerBound, index2) {
- var r = parseHex4Bits(string, index2);
- if (index2 - 1 >= lowerBound) {
- r |= parseHex4Bits(string, index2 - 1) << 4;
- }
- return r;
- }
- BN.prototype._parseHex = function _parseHex(number, start, endian) {
- this.length = Math.ceil((number.length - start) / 6);
- this.words = new Array(this.length);
- for (var i = 0;i < this.length; i++) {
- this.words[i] = 0;
- }
- var off = 0;
- var j = 0;
- var w;
- if (endian === "be") {
- for (i = number.length - 1;i >= start; i -= 2) {
- w = parseHexByte(number, start, i) << off;
- this.words[j] |= w & 67108863;
- if (off >= 18) {
- off -= 18;
- j += 1;
- this.words[j] |= w >>> 26;
- } else {
- off += 8;
- }
- }
- } else {
- var parseLength = number.length - start;
- for (i = parseLength % 2 === 0 ? start + 1 : start;i < number.length; i += 2) {
- w = parseHexByte(number, start, i) << off;
- this.words[j] |= w & 67108863;
- if (off >= 18) {
- off -= 18;
- j += 1;
- this.words[j] |= w >>> 26;
- } else {
- off += 8;
- }
- }
- }
- this.strip();
- };
- function parseBase(str, start, end, mul) {
- var r = 0;
- var len = Math.min(str.length, end);
- for (var i = start;i < len; i++) {
- var c = str.charCodeAt(i) - 48;
- r *= mul;
- if (c >= 49) {
- r += c - 49 + 10;
- } else if (c >= 17) {
- r += c - 17 + 10;
- } else {
- r += c;
- }
- }
- return r;
- }
- BN.prototype._parseBase = function _parseBase(number, base, start) {
- this.words = [0];
- this.length = 1;
- for (var limbLen = 0, limbPow = 1;limbPow <= 67108863; limbPow *= base) {
- limbLen++;
- }
- limbLen--;
- limbPow = limbPow / base | 0;
- var total = number.length - start;
- var mod = total % limbLen;
- var end = Math.min(total, total - mod) + start;
- var word = 0;
- for (var i = start;i < end; i += limbLen) {
- word = parseBase(number, i, i + limbLen, base);
- this.imuln(limbPow);
- if (this.words[0] + word < 67108864) {
- this.words[0] += word;
- } else {
- this._iaddn(word);
- }
- }
- if (mod !== 0) {
- var pow = 1;
- word = parseBase(number, i, number.length, base);
- for (i = 0;i < mod; i++) {
- pow *= base;
- }
- this.imuln(pow);
- if (this.words[0] + word < 67108864) {
- this.words[0] += word;
- } else {
- this._iaddn(word);
- }
- }
- this.strip();
- };
- BN.prototype.copy = function copy(dest) {
- dest.words = new Array(this.length);
- for (var i = 0;i < this.length; i++) {
- dest.words[i] = this.words[i];
- }
- dest.length = this.length;
- dest.negative = this.negative;
- dest.red = this.red;
- };
- BN.prototype.clone = function clone() {
- var r = new BN(null);
- this.copy(r);
- return r;
- };
- BN.prototype._expand = function _expand(size) {
- while (this.length < size) {
- this.words[this.length++] = 0;
- }
- return this;
- };
- BN.prototype.strip = function strip() {
- while (this.length > 1 && this.words[this.length - 1] === 0) {
- this.length--;
- }
- return this._normSign();
- };
- BN.prototype._normSign = function _normSign() {
- if (this.length === 1 && this.words[0] === 0) {
- this.negative = 0;
- }
- return this;
- };
- BN.prototype.inspect = function inspect() {
- return (this.red ? "";
- };
- var zeros = [
- "",
- "0",
- "00",
- "000",
- "0000",
- "00000",
- "000000",
- "0000000",
- "00000000",
- "000000000",
- "0000000000",
- "00000000000",
- "000000000000",
- "0000000000000",
- "00000000000000",
- "000000000000000",
- "0000000000000000",
- "00000000000000000",
- "000000000000000000",
- "0000000000000000000",
- "00000000000000000000",
- "000000000000000000000",
- "0000000000000000000000",
- "00000000000000000000000",
- "000000000000000000000000",
- "0000000000000000000000000"
- ];
- var groupSizes = [
- 0,
- 0,
- 25,
- 16,
- 12,
- 11,
- 10,
- 9,
- 8,
- 8,
- 7,
- 7,
- 7,
- 7,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5
- ];
- var groupBases = [
- 0,
- 0,
- 33554432,
- 43046721,
- 16777216,
- 48828125,
- 60466176,
- 40353607,
- 16777216,
- 43046721,
- 1e7,
- 19487171,
- 35831808,
- 62748517,
- 7529536,
- 11390625,
- 16777216,
- 24137569,
- 34012224,
- 47045881,
- 64000000,
- 4084101,
- 5153632,
- 6436343,
- 7962624,
- 9765625,
- 11881376,
- 14348907,
- 17210368,
- 20511149,
- 24300000,
- 28629151,
- 33554432,
- 39135393,
- 45435424,
- 52521875,
- 60466176
- ];
- BN.prototype.toString = function toString(base, padding) {
- base = base || 10;
- padding = padding | 0 || 1;
- var out;
- if (base === 16 || base === "hex") {
- out = "";
- var off = 0;
- var carry = 0;
- for (var i = 0;i < this.length; i++) {
- var w = this.words[i];
- var word = ((w << off | carry) & 16777215).toString(16);
- carry = w >>> 24 - off & 16777215;
- off += 2;
- if (off >= 26) {
- off -= 26;
- i--;
- }
- if (carry !== 0 || i !== this.length - 1) {
- out = zeros[6 - word.length] + word + out;
- } else {
- out = word + out;
- }
- }
- if (carry !== 0) {
- out = carry.toString(16) + out;
- }
- while (out.length % padding !== 0) {
- out = "0" + out;
- }
- if (this.negative !== 0) {
- out = "-" + out;
- }
- return out;
- }
- if (base === (base | 0) && base >= 2 && base <= 36) {
- var groupSize = groupSizes[base];
- var groupBase = groupBases[base];
- out = "";
- var c = this.clone();
- c.negative = 0;
- while (!c.isZero()) {
- var r = c.modn(groupBase).toString(base);
- c = c.idivn(groupBase);
- if (!c.isZero()) {
- out = zeros[groupSize - r.length] + r + out;
- } else {
- out = r + out;
- }
- }
- if (this.isZero()) {
- out = "0" + out;
- }
- while (out.length % padding !== 0) {
- out = "0" + out;
- }
- if (this.negative !== 0) {
- out = "-" + out;
- }
- return out;
- }
- assert(false, "Base should be between 2 and 36");
- };
- BN.prototype.toNumber = function toNumber() {
- var ret = this.words[0];
- if (this.length === 2) {
- ret += this.words[1] * 67108864;
- } else if (this.length === 3 && this.words[2] === 1) {
- ret += 4503599627370496 + this.words[1] * 67108864;
- } else if (this.length > 2) {
- assert(false, "Number can only safely store up to 53 bits");
- }
- return this.negative !== 0 ? -ret : ret;
- };
- BN.prototype.toJSON = function toJSON() {
- return this.toString(16);
- };
- BN.prototype.toBuffer = function toBuffer(endian, length) {
- assert(typeof Buffer2 !== "undefined");
- return this.toArrayLike(Buffer2, endian, length);
- };
- BN.prototype.toArray = function toArray(endian, length) {
- return this.toArrayLike(Array, endian, length);
- };
- BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) {
- var byteLength = this.byteLength();
- var reqLength = length || Math.max(1, byteLength);
- assert(byteLength <= reqLength, "byte array longer than desired length");
- assert(reqLength > 0, "Requested array length <= 0");
- this.strip();
- var littleEndian = endian === "le";
- var res = new ArrayType(reqLength);
- var b, i;
- var q = this.clone();
- if (!littleEndian) {
- for (i = 0;i < reqLength - byteLength; i++) {
- res[i] = 0;
- }
- for (i = 0;!q.isZero(); i++) {
- b = q.andln(255);
- q.iushrn(8);
- res[reqLength - i - 1] = b;
- }
- } else {
- for (i = 0;!q.isZero(); i++) {
- b = q.andln(255);
- q.iushrn(8);
- res[i] = b;
- }
- for (;i < reqLength; i++) {
- res[i] = 0;
- }
- }
- return res;
- };
- if (Math.clz32) {
- BN.prototype._countBits = function _countBits(w) {
- return 32 - Math.clz32(w);
- };
- } else {
- BN.prototype._countBits = function _countBits(w) {
- var t = w;
- var r = 0;
- if (t >= 4096) {
- r += 13;
- t >>>= 13;
- }
- if (t >= 64) {
- r += 7;
- t >>>= 7;
- }
- if (t >= 8) {
- r += 4;
- t >>>= 4;
- }
- if (t >= 2) {
- r += 2;
- t >>>= 2;
- }
- return r + t;
- };
- }
- BN.prototype._zeroBits = function _zeroBits(w) {
- if (w === 0)
- return 26;
- var t = w;
- var r = 0;
- if ((t & 8191) === 0) {
- r += 13;
- t >>>= 13;
- }
- if ((t & 127) === 0) {
- r += 7;
- t >>>= 7;
- }
- if ((t & 15) === 0) {
- r += 4;
- t >>>= 4;
- }
- if ((t & 3) === 0) {
- r += 2;
- t >>>= 2;
- }
- if ((t & 1) === 0) {
- r++;
- }
- return r;
- };
- BN.prototype.bitLength = function bitLength() {
- var w = this.words[this.length - 1];
- var hi = this._countBits(w);
- return (this.length - 1) * 26 + hi;
- };
- function toBitArray(num) {
- var w = new Array(num.bitLength());
- for (var bit = 0;bit < w.length; bit++) {
- var off = bit / 26 | 0;
- var wbit = bit % 26;
- w[bit] = (num.words[off] & 1 << wbit) >>> wbit;
- }
- return w;
- }
- BN.prototype.zeroBits = function zeroBits() {
- if (this.isZero())
- return 0;
- var r = 0;
- for (var i = 0;i < this.length; i++) {
- var b = this._zeroBits(this.words[i]);
- r += b;
- if (b !== 26)
- break;
- }
- return r;
- };
- BN.prototype.byteLength = function byteLength() {
- return Math.ceil(this.bitLength() / 8);
- };
- BN.prototype.toTwos = function toTwos(width) {
- if (this.negative !== 0) {
- return this.abs().inotn(width).iaddn(1);
- }
- return this.clone();
- };
- BN.prototype.fromTwos = function fromTwos(width) {
- if (this.testn(width - 1)) {
- return this.notn(width).iaddn(1).ineg();
- }
- return this.clone();
- };
- BN.prototype.isNeg = function isNeg() {
- return this.negative !== 0;
- };
- BN.prototype.neg = function neg() {
- return this.clone().ineg();
- };
- BN.prototype.ineg = function ineg() {
- if (!this.isZero()) {
- this.negative ^= 1;
- }
- return this;
- };
- BN.prototype.iuor = function iuor(num) {
- while (this.length < num.length) {
- this.words[this.length++] = 0;
- }
- for (var i = 0;i < num.length; i++) {
- this.words[i] = this.words[i] | num.words[i];
- }
- return this.strip();
- };
- BN.prototype.ior = function ior(num) {
- assert((this.negative | num.negative) === 0);
- return this.iuor(num);
- };
- BN.prototype.or = function or(num) {
- if (this.length > num.length)
- return this.clone().ior(num);
- return num.clone().ior(this);
- };
- BN.prototype.uor = function uor(num) {
- if (this.length > num.length)
- return this.clone().iuor(num);
- return num.clone().iuor(this);
- };
- BN.prototype.iuand = function iuand(num) {
- var b;
- if (this.length > num.length) {
- b = num;
- } else {
- b = this;
- }
- for (var i = 0;i < b.length; i++) {
- this.words[i] = this.words[i] & num.words[i];
- }
- this.length = b.length;
- return this.strip();
- };
- BN.prototype.iand = function iand(num) {
- assert((this.negative | num.negative) === 0);
- return this.iuand(num);
- };
- BN.prototype.and = function and(num) {
- if (this.length > num.length)
- return this.clone().iand(num);
- return num.clone().iand(this);
- };
- BN.prototype.uand = function uand(num) {
- if (this.length > num.length)
- return this.clone().iuand(num);
- return num.clone().iuand(this);
- };
- BN.prototype.iuxor = function iuxor(num) {
- var a;
- var b;
- if (this.length > num.length) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
- for (var i = 0;i < b.length; i++) {
- this.words[i] = a.words[i] ^ b.words[i];
- }
- if (this !== a) {
- for (;i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
- this.length = a.length;
- return this.strip();
- };
- BN.prototype.ixor = function ixor(num) {
- assert((this.negative | num.negative) === 0);
- return this.iuxor(num);
- };
- BN.prototype.xor = function xor(num) {
- if (this.length > num.length)
- return this.clone().ixor(num);
- return num.clone().ixor(this);
- };
- BN.prototype.uxor = function uxor(num) {
- if (this.length > num.length)
- return this.clone().iuxor(num);
- return num.clone().iuxor(this);
- };
- BN.prototype.inotn = function inotn(width) {
- assert(typeof width === "number" && width >= 0);
- var bytesNeeded = Math.ceil(width / 26) | 0;
- var bitsLeft = width % 26;
- this._expand(bytesNeeded);
- if (bitsLeft > 0) {
- bytesNeeded--;
- }
- for (var i = 0;i < bytesNeeded; i++) {
- this.words[i] = ~this.words[i] & 67108863;
- }
- if (bitsLeft > 0) {
- this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft;
- }
- return this.strip();
- };
- BN.prototype.notn = function notn(width) {
- return this.clone().inotn(width);
- };
- BN.prototype.setn = function setn(bit, val) {
- assert(typeof bit === "number" && bit >= 0);
- var off = bit / 26 | 0;
- var wbit = bit % 26;
- this._expand(off + 1);
- if (val) {
- this.words[off] = this.words[off] | 1 << wbit;
- } else {
- this.words[off] = this.words[off] & ~(1 << wbit);
- }
- return this.strip();
- };
- BN.prototype.iadd = function iadd(num) {
- var r;
- if (this.negative !== 0 && num.negative === 0) {
- this.negative = 0;
- r = this.isub(num);
- this.negative ^= 1;
- return this._normSign();
- } else if (this.negative === 0 && num.negative !== 0) {
- num.negative = 0;
- r = this.isub(num);
- num.negative = 1;
- return r._normSign();
- }
- var a, b;
- if (this.length > num.length) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
- var carry = 0;
- for (var i = 0;i < b.length; i++) {
- r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
- this.words[i] = r & 67108863;
- carry = r >>> 26;
- }
- for (;carry !== 0 && i < a.length; i++) {
- r = (a.words[i] | 0) + carry;
- this.words[i] = r & 67108863;
- carry = r >>> 26;
- }
- this.length = a.length;
- if (carry !== 0) {
- this.words[this.length] = carry;
- this.length++;
- } else if (a !== this) {
- for (;i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
- return this;
- };
- BN.prototype.add = function add(num) {
- var res;
- if (num.negative !== 0 && this.negative === 0) {
- num.negative = 0;
- res = this.sub(num);
- num.negative ^= 1;
- return res;
- } else if (num.negative === 0 && this.negative !== 0) {
- this.negative = 0;
- res = num.sub(this);
- this.negative = 1;
- return res;
- }
- if (this.length > num.length)
- return this.clone().iadd(num);
- return num.clone().iadd(this);
- };
- BN.prototype.isub = function isub(num) {
- if (num.negative !== 0) {
- num.negative = 0;
- var r = this.iadd(num);
- num.negative = 1;
- return r._normSign();
- } else if (this.negative !== 0) {
- this.negative = 0;
- this.iadd(num);
- this.negative = 1;
- return this._normSign();
- }
- var cmp = this.cmp(num);
- if (cmp === 0) {
- this.negative = 0;
- this.length = 1;
- this.words[0] = 0;
- return this;
- }
- var a, b;
- if (cmp > 0) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
- var carry = 0;
- for (var i = 0;i < b.length; i++) {
- r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
- carry = r >> 26;
- this.words[i] = r & 67108863;
- }
- for (;carry !== 0 && i < a.length; i++) {
- r = (a.words[i] | 0) + carry;
- carry = r >> 26;
- this.words[i] = r & 67108863;
- }
- if (carry === 0 && i < a.length && a !== this) {
- for (;i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
- this.length = Math.max(this.length, i);
- if (a !== this) {
- this.negative = 1;
- }
- return this.strip();
- };
- BN.prototype.sub = function sub(num) {
- return this.clone().isub(num);
- };
- function smallMulTo(self2, num, out) {
- out.negative = num.negative ^ self2.negative;
- var len = self2.length + num.length | 0;
- out.length = len;
- len = len - 1 | 0;
- var a = self2.words[0] | 0;
- var b = num.words[0] | 0;
- var r = a * b;
- var lo = r & 67108863;
- var carry = r / 67108864 | 0;
- out.words[0] = lo;
- for (var k = 1;k < len; k++) {
- var ncarry = carry >>> 26;
- var rword = carry & 67108863;
- var maxJ = Math.min(k, num.length - 1);
- for (var j = Math.max(0, k - self2.length + 1);j <= maxJ; j++) {
- var i = k - j | 0;
- a = self2.words[i] | 0;
- b = num.words[j] | 0;
- r = a * b + rword;
- ncarry += r / 67108864 | 0;
- rword = r & 67108863;
- }
- out.words[k] = rword | 0;
- carry = ncarry | 0;
- }
- if (carry !== 0) {
- out.words[k] = carry | 0;
- } else {
- out.length--;
- }
- return out.strip();
- }
- var comb10MulTo = function comb10MulTo(self2, num, out) {
- var a = self2.words;
- var b = num.words;
- var o = out.words;
- var c = 0;
- var lo;
- var mid;
- var hi;
- var a0 = a[0] | 0;
- var al0 = a0 & 8191;
- var ah0 = a0 >>> 13;
- var a1 = a[1] | 0;
- var al1 = a1 & 8191;
- var ah1 = a1 >>> 13;
- var a2 = a[2] | 0;
- var al2 = a2 & 8191;
- var ah2 = a2 >>> 13;
- var a3 = a[3] | 0;
- var al3 = a3 & 8191;
- var ah3 = a3 >>> 13;
- var a4 = a[4] | 0;
- var al4 = a4 & 8191;
- var ah4 = a4 >>> 13;
- var a5 = a[5] | 0;
- var al5 = a5 & 8191;
- var ah5 = a5 >>> 13;
- var a6 = a[6] | 0;
- var al6 = a6 & 8191;
- var ah6 = a6 >>> 13;
- var a7 = a[7] | 0;
- var al7 = a7 & 8191;
- var ah7 = a7 >>> 13;
- var a8 = a[8] | 0;
- var al8 = a8 & 8191;
- var ah8 = a8 >>> 13;
- var a9 = a[9] | 0;
- var al9 = a9 & 8191;
- var ah9 = a9 >>> 13;
- var b0 = b[0] | 0;
- var bl0 = b0 & 8191;
- var bh0 = b0 >>> 13;
- var b1 = b[1] | 0;
- var bl1 = b1 & 8191;
- var bh1 = b1 >>> 13;
- var b2 = b[2] | 0;
- var bl2 = b2 & 8191;
- var bh2 = b2 >>> 13;
- var b3 = b[3] | 0;
- var bl3 = b3 & 8191;
- var bh3 = b3 >>> 13;
- var b4 = b[4] | 0;
- var bl4 = b4 & 8191;
- var bh4 = b4 >>> 13;
- var b5 = b[5] | 0;
- var bl5 = b5 & 8191;
- var bh5 = b5 >>> 13;
- var b6 = b[6] | 0;
- var bl6 = b6 & 8191;
- var bh6 = b6 >>> 13;
- var b7 = b[7] | 0;
- var bl7 = b7 & 8191;
- var bh7 = b7 >>> 13;
- var b8 = b[8] | 0;
- var bl8 = b8 & 8191;
- var bh8 = b8 >>> 13;
- var b9 = b[9] | 0;
- var bl9 = b9 & 8191;
- var bh9 = b9 >>> 13;
- out.negative = self2.negative ^ num.negative;
- out.length = 19;
- lo = Math.imul(al0, bl0);
- mid = Math.imul(al0, bh0);
- mid = mid + Math.imul(ah0, bl0) | 0;
- hi = Math.imul(ah0, bh0);
- var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0;
- w0 &= 67108863;
- lo = Math.imul(al1, bl0);
- mid = Math.imul(al1, bh0);
- mid = mid + Math.imul(ah1, bl0) | 0;
- hi = Math.imul(ah1, bh0);
- lo = lo + Math.imul(al0, bl1) | 0;
- mid = mid + Math.imul(al0, bh1) | 0;
- mid = mid + Math.imul(ah0, bl1) | 0;
- hi = hi + Math.imul(ah0, bh1) | 0;
- var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0;
- w1 &= 67108863;
- lo = Math.imul(al2, bl0);
- mid = Math.imul(al2, bh0);
- mid = mid + Math.imul(ah2, bl0) | 0;
- hi = Math.imul(ah2, bh0);
- lo = lo + Math.imul(al1, bl1) | 0;
- mid = mid + Math.imul(al1, bh1) | 0;
- mid = mid + Math.imul(ah1, bl1) | 0;
- hi = hi + Math.imul(ah1, bh1) | 0;
- lo = lo + Math.imul(al0, bl2) | 0;
- mid = mid + Math.imul(al0, bh2) | 0;
- mid = mid + Math.imul(ah0, bl2) | 0;
- hi = hi + Math.imul(ah0, bh2) | 0;
- var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0;
- w2 &= 67108863;
- lo = Math.imul(al3, bl0);
- mid = Math.imul(al3, bh0);
- mid = mid + Math.imul(ah3, bl0) | 0;
- hi = Math.imul(ah3, bh0);
- lo = lo + Math.imul(al2, bl1) | 0;
- mid = mid + Math.imul(al2, bh1) | 0;
- mid = mid + Math.imul(ah2, bl1) | 0;
- hi = hi + Math.imul(ah2, bh1) | 0;
- lo = lo + Math.imul(al1, bl2) | 0;
- mid = mid + Math.imul(al1, bh2) | 0;
- mid = mid + Math.imul(ah1, bl2) | 0;
- hi = hi + Math.imul(ah1, bh2) | 0;
- lo = lo + Math.imul(al0, bl3) | 0;
- mid = mid + Math.imul(al0, bh3) | 0;
- mid = mid + Math.imul(ah0, bl3) | 0;
- hi = hi + Math.imul(ah0, bh3) | 0;
- var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0;
- w3 &= 67108863;
- lo = Math.imul(al4, bl0);
- mid = Math.imul(al4, bh0);
- mid = mid + Math.imul(ah4, bl0) | 0;
- hi = Math.imul(ah4, bh0);
- lo = lo + Math.imul(al3, bl1) | 0;
- mid = mid + Math.imul(al3, bh1) | 0;
- mid = mid + Math.imul(ah3, bl1) | 0;
- hi = hi + Math.imul(ah3, bh1) | 0;
- lo = lo + Math.imul(al2, bl2) | 0;
- mid = mid + Math.imul(al2, bh2) | 0;
- mid = mid + Math.imul(ah2, bl2) | 0;
- hi = hi + Math.imul(ah2, bh2) | 0;
- lo = lo + Math.imul(al1, bl3) | 0;
- mid = mid + Math.imul(al1, bh3) | 0;
- mid = mid + Math.imul(ah1, bl3) | 0;
- hi = hi + Math.imul(ah1, bh3) | 0;
- lo = lo + Math.imul(al0, bl4) | 0;
- mid = mid + Math.imul(al0, bh4) | 0;
- mid = mid + Math.imul(ah0, bl4) | 0;
- hi = hi + Math.imul(ah0, bh4) | 0;
- var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0;
- w4 &= 67108863;
- lo = Math.imul(al5, bl0);
- mid = Math.imul(al5, bh0);
- mid = mid + Math.imul(ah5, bl0) | 0;
- hi = Math.imul(ah5, bh0);
- lo = lo + Math.imul(al4, bl1) | 0;
- mid = mid + Math.imul(al4, bh1) | 0;
- mid = mid + Math.imul(ah4, bl1) | 0;
- hi = hi + Math.imul(ah4, bh1) | 0;
- lo = lo + Math.imul(al3, bl2) | 0;
- mid = mid + Math.imul(al3, bh2) | 0;
- mid = mid + Math.imul(ah3, bl2) | 0;
- hi = hi + Math.imul(ah3, bh2) | 0;
- lo = lo + Math.imul(al2, bl3) | 0;
- mid = mid + Math.imul(al2, bh3) | 0;
- mid = mid + Math.imul(ah2, bl3) | 0;
- hi = hi + Math.imul(ah2, bh3) | 0;
- lo = lo + Math.imul(al1, bl4) | 0;
- mid = mid + Math.imul(al1, bh4) | 0;
- mid = mid + Math.imul(ah1, bl4) | 0;
- hi = hi + Math.imul(ah1, bh4) | 0;
- lo = lo + Math.imul(al0, bl5) | 0;
- mid = mid + Math.imul(al0, bh5) | 0;
- mid = mid + Math.imul(ah0, bl5) | 0;
- hi = hi + Math.imul(ah0, bh5) | 0;
- var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0;
- w5 &= 67108863;
- lo = Math.imul(al6, bl0);
- mid = Math.imul(al6, bh0);
- mid = mid + Math.imul(ah6, bl0) | 0;
- hi = Math.imul(ah6, bh0);
- lo = lo + Math.imul(al5, bl1) | 0;
- mid = mid + Math.imul(al5, bh1) | 0;
- mid = mid + Math.imul(ah5, bl1) | 0;
- hi = hi + Math.imul(ah5, bh1) | 0;
- lo = lo + Math.imul(al4, bl2) | 0;
- mid = mid + Math.imul(al4, bh2) | 0;
- mid = mid + Math.imul(ah4, bl2) | 0;
- hi = hi + Math.imul(ah4, bh2) | 0;
- lo = lo + Math.imul(al3, bl3) | 0;
- mid = mid + Math.imul(al3, bh3) | 0;
- mid = mid + Math.imul(ah3, bl3) | 0;
- hi = hi + Math.imul(ah3, bh3) | 0;
- lo = lo + Math.imul(al2, bl4) | 0;
- mid = mid + Math.imul(al2, bh4) | 0;
- mid = mid + Math.imul(ah2, bl4) | 0;
- hi = hi + Math.imul(ah2, bh4) | 0;
- lo = lo + Math.imul(al1, bl5) | 0;
- mid = mid + Math.imul(al1, bh5) | 0;
- mid = mid + Math.imul(ah1, bl5) | 0;
- hi = hi + Math.imul(ah1, bh5) | 0;
- lo = lo + Math.imul(al0, bl6) | 0;
- mid = mid + Math.imul(al0, bh6) | 0;
- mid = mid + Math.imul(ah0, bl6) | 0;
- hi = hi + Math.imul(ah0, bh6) | 0;
- var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0;
- w6 &= 67108863;
- lo = Math.imul(al7, bl0);
- mid = Math.imul(al7, bh0);
- mid = mid + Math.imul(ah7, bl0) | 0;
- hi = Math.imul(ah7, bh0);
- lo = lo + Math.imul(al6, bl1) | 0;
- mid = mid + Math.imul(al6, bh1) | 0;
- mid = mid + Math.imul(ah6, bl1) | 0;
- hi = hi + Math.imul(ah6, bh1) | 0;
- lo = lo + Math.imul(al5, bl2) | 0;
- mid = mid + Math.imul(al5, bh2) | 0;
- mid = mid + Math.imul(ah5, bl2) | 0;
- hi = hi + Math.imul(ah5, bh2) | 0;
- lo = lo + Math.imul(al4, bl3) | 0;
- mid = mid + Math.imul(al4, bh3) | 0;
- mid = mid + Math.imul(ah4, bl3) | 0;
- hi = hi + Math.imul(ah4, bh3) | 0;
- lo = lo + Math.imul(al3, bl4) | 0;
- mid = mid + Math.imul(al3, bh4) | 0;
- mid = mid + Math.imul(ah3, bl4) | 0;
- hi = hi + Math.imul(ah3, bh4) | 0;
- lo = lo + Math.imul(al2, bl5) | 0;
- mid = mid + Math.imul(al2, bh5) | 0;
- mid = mid + Math.imul(ah2, bl5) | 0;
- hi = hi + Math.imul(ah2, bh5) | 0;
- lo = lo + Math.imul(al1, bl6) | 0;
- mid = mid + Math.imul(al1, bh6) | 0;
- mid = mid + Math.imul(ah1, bl6) | 0;
- hi = hi + Math.imul(ah1, bh6) | 0;
- lo = lo + Math.imul(al0, bl7) | 0;
- mid = mid + Math.imul(al0, bh7) | 0;
- mid = mid + Math.imul(ah0, bl7) | 0;
- hi = hi + Math.imul(ah0, bh7) | 0;
- var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0;
- w7 &= 67108863;
- lo = Math.imul(al8, bl0);
- mid = Math.imul(al8, bh0);
- mid = mid + Math.imul(ah8, bl0) | 0;
- hi = Math.imul(ah8, bh0);
- lo = lo + Math.imul(al7, bl1) | 0;
- mid = mid + Math.imul(al7, bh1) | 0;
- mid = mid + Math.imul(ah7, bl1) | 0;
- hi = hi + Math.imul(ah7, bh1) | 0;
- lo = lo + Math.imul(al6, bl2) | 0;
- mid = mid + Math.imul(al6, bh2) | 0;
- mid = mid + Math.imul(ah6, bl2) | 0;
- hi = hi + Math.imul(ah6, bh2) | 0;
- lo = lo + Math.imul(al5, bl3) | 0;
- mid = mid + Math.imul(al5, bh3) | 0;
- mid = mid + Math.imul(ah5, bl3) | 0;
- hi = hi + Math.imul(ah5, bh3) | 0;
- lo = lo + Math.imul(al4, bl4) | 0;
- mid = mid + Math.imul(al4, bh4) | 0;
- mid = mid + Math.imul(ah4, bl4) | 0;
- hi = hi + Math.imul(ah4, bh4) | 0;
- lo = lo + Math.imul(al3, bl5) | 0;
- mid = mid + Math.imul(al3, bh5) | 0;
- mid = mid + Math.imul(ah3, bl5) | 0;
- hi = hi + Math.imul(ah3, bh5) | 0;
- lo = lo + Math.imul(al2, bl6) | 0;
- mid = mid + Math.imul(al2, bh6) | 0;
- mid = mid + Math.imul(ah2, bl6) | 0;
- hi = hi + Math.imul(ah2, bh6) | 0;
- lo = lo + Math.imul(al1, bl7) | 0;
- mid = mid + Math.imul(al1, bh7) | 0;
- mid = mid + Math.imul(ah1, bl7) | 0;
- hi = hi + Math.imul(ah1, bh7) | 0;
- lo = lo + Math.imul(al0, bl8) | 0;
- mid = mid + Math.imul(al0, bh8) | 0;
- mid = mid + Math.imul(ah0, bl8) | 0;
- hi = hi + Math.imul(ah0, bh8) | 0;
- var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0;
- w8 &= 67108863;
- lo = Math.imul(al9, bl0);
- mid = Math.imul(al9, bh0);
- mid = mid + Math.imul(ah9, bl0) | 0;
- hi = Math.imul(ah9, bh0);
- lo = lo + Math.imul(al8, bl1) | 0;
- mid = mid + Math.imul(al8, bh1) | 0;
- mid = mid + Math.imul(ah8, bl1) | 0;
- hi = hi + Math.imul(ah8, bh1) | 0;
- lo = lo + Math.imul(al7, bl2) | 0;
- mid = mid + Math.imul(al7, bh2) | 0;
- mid = mid + Math.imul(ah7, bl2) | 0;
- hi = hi + Math.imul(ah7, bh2) | 0;
- lo = lo + Math.imul(al6, bl3) | 0;
- mid = mid + Math.imul(al6, bh3) | 0;
- mid = mid + Math.imul(ah6, bl3) | 0;
- hi = hi + Math.imul(ah6, bh3) | 0;
- lo = lo + Math.imul(al5, bl4) | 0;
- mid = mid + Math.imul(al5, bh4) | 0;
- mid = mid + Math.imul(ah5, bl4) | 0;
- hi = hi + Math.imul(ah5, bh4) | 0;
- lo = lo + Math.imul(al4, bl5) | 0;
- mid = mid + Math.imul(al4, bh5) | 0;
- mid = mid + Math.imul(ah4, bl5) | 0;
- hi = hi + Math.imul(ah4, bh5) | 0;
- lo = lo + Math.imul(al3, bl6) | 0;
- mid = mid + Math.imul(al3, bh6) | 0;
- mid = mid + Math.imul(ah3, bl6) | 0;
- hi = hi + Math.imul(ah3, bh6) | 0;
- lo = lo + Math.imul(al2, bl7) | 0;
- mid = mid + Math.imul(al2, bh7) | 0;
- mid = mid + Math.imul(ah2, bl7) | 0;
- hi = hi + Math.imul(ah2, bh7) | 0;
- lo = lo + Math.imul(al1, bl8) | 0;
- mid = mid + Math.imul(al1, bh8) | 0;
- mid = mid + Math.imul(ah1, bl8) | 0;
- hi = hi + Math.imul(ah1, bh8) | 0;
- lo = lo + Math.imul(al0, bl9) | 0;
- mid = mid + Math.imul(al0, bh9) | 0;
- mid = mid + Math.imul(ah0, bl9) | 0;
- hi = hi + Math.imul(ah0, bh9) | 0;
- var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0;
- w9 &= 67108863;
- lo = Math.imul(al9, bl1);
- mid = Math.imul(al9, bh1);
- mid = mid + Math.imul(ah9, bl1) | 0;
- hi = Math.imul(ah9, bh1);
- lo = lo + Math.imul(al8, bl2) | 0;
- mid = mid + Math.imul(al8, bh2) | 0;
- mid = mid + Math.imul(ah8, bl2) | 0;
- hi = hi + Math.imul(ah8, bh2) | 0;
- lo = lo + Math.imul(al7, bl3) | 0;
- mid = mid + Math.imul(al7, bh3) | 0;
- mid = mid + Math.imul(ah7, bl3) | 0;
- hi = hi + Math.imul(ah7, bh3) | 0;
- lo = lo + Math.imul(al6, bl4) | 0;
- mid = mid + Math.imul(al6, bh4) | 0;
- mid = mid + Math.imul(ah6, bl4) | 0;
- hi = hi + Math.imul(ah6, bh4) | 0;
- lo = lo + Math.imul(al5, bl5) | 0;
- mid = mid + Math.imul(al5, bh5) | 0;
- mid = mid + Math.imul(ah5, bl5) | 0;
- hi = hi + Math.imul(ah5, bh5) | 0;
- lo = lo + Math.imul(al4, bl6) | 0;
- mid = mid + Math.imul(al4, bh6) | 0;
- mid = mid + Math.imul(ah4, bl6) | 0;
- hi = hi + Math.imul(ah4, bh6) | 0;
- lo = lo + Math.imul(al3, bl7) | 0;
- mid = mid + Math.imul(al3, bh7) | 0;
- mid = mid + Math.imul(ah3, bl7) | 0;
- hi = hi + Math.imul(ah3, bh7) | 0;
- lo = lo + Math.imul(al2, bl8) | 0;
- mid = mid + Math.imul(al2, bh8) | 0;
- mid = mid + Math.imul(ah2, bl8) | 0;
- hi = hi + Math.imul(ah2, bh8) | 0;
- lo = lo + Math.imul(al1, bl9) | 0;
- mid = mid + Math.imul(al1, bh9) | 0;
- mid = mid + Math.imul(ah1, bl9) | 0;
- hi = hi + Math.imul(ah1, bh9) | 0;
- var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0;
- w10 &= 67108863;
- lo = Math.imul(al9, bl2);
- mid = Math.imul(al9, bh2);
- mid = mid + Math.imul(ah9, bl2) | 0;
- hi = Math.imul(ah9, bh2);
- lo = lo + Math.imul(al8, bl3) | 0;
- mid = mid + Math.imul(al8, bh3) | 0;
- mid = mid + Math.imul(ah8, bl3) | 0;
- hi = hi + Math.imul(ah8, bh3) | 0;
- lo = lo + Math.imul(al7, bl4) | 0;
- mid = mid + Math.imul(al7, bh4) | 0;
- mid = mid + Math.imul(ah7, bl4) | 0;
- hi = hi + Math.imul(ah7, bh4) | 0;
- lo = lo + Math.imul(al6, bl5) | 0;
- mid = mid + Math.imul(al6, bh5) | 0;
- mid = mid + Math.imul(ah6, bl5) | 0;
- hi = hi + Math.imul(ah6, bh5) | 0;
- lo = lo + Math.imul(al5, bl6) | 0;
- mid = mid + Math.imul(al5, bh6) | 0;
- mid = mid + Math.imul(ah5, bl6) | 0;
- hi = hi + Math.imul(ah5, bh6) | 0;
- lo = lo + Math.imul(al4, bl7) | 0;
- mid = mid + Math.imul(al4, bh7) | 0;
- mid = mid + Math.imul(ah4, bl7) | 0;
- hi = hi + Math.imul(ah4, bh7) | 0;
- lo = lo + Math.imul(al3, bl8) | 0;
- mid = mid + Math.imul(al3, bh8) | 0;
- mid = mid + Math.imul(ah3, bl8) | 0;
- hi = hi + Math.imul(ah3, bh8) | 0;
- lo = lo + Math.imul(al2, bl9) | 0;
- mid = mid + Math.imul(al2, bh9) | 0;
- mid = mid + Math.imul(ah2, bl9) | 0;
- hi = hi + Math.imul(ah2, bh9) | 0;
- var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0;
- w11 &= 67108863;
- lo = Math.imul(al9, bl3);
- mid = Math.imul(al9, bh3);
- mid = mid + Math.imul(ah9, bl3) | 0;
- hi = Math.imul(ah9, bh3);
- lo = lo + Math.imul(al8, bl4) | 0;
- mid = mid + Math.imul(al8, bh4) | 0;
- mid = mid + Math.imul(ah8, bl4) | 0;
- hi = hi + Math.imul(ah8, bh4) | 0;
- lo = lo + Math.imul(al7, bl5) | 0;
- mid = mid + Math.imul(al7, bh5) | 0;
- mid = mid + Math.imul(ah7, bl5) | 0;
- hi = hi + Math.imul(ah7, bh5) | 0;
- lo = lo + Math.imul(al6, bl6) | 0;
- mid = mid + Math.imul(al6, bh6) | 0;
- mid = mid + Math.imul(ah6, bl6) | 0;
- hi = hi + Math.imul(ah6, bh6) | 0;
- lo = lo + Math.imul(al5, bl7) | 0;
- mid = mid + Math.imul(al5, bh7) | 0;
- mid = mid + Math.imul(ah5, bl7) | 0;
- hi = hi + Math.imul(ah5, bh7) | 0;
- lo = lo + Math.imul(al4, bl8) | 0;
- mid = mid + Math.imul(al4, bh8) | 0;
- mid = mid + Math.imul(ah4, bl8) | 0;
- hi = hi + Math.imul(ah4, bh8) | 0;
- lo = lo + Math.imul(al3, bl9) | 0;
- mid = mid + Math.imul(al3, bh9) | 0;
- mid = mid + Math.imul(ah3, bl9) | 0;
- hi = hi + Math.imul(ah3, bh9) | 0;
- var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0;
- w12 &= 67108863;
- lo = Math.imul(al9, bl4);
- mid = Math.imul(al9, bh4);
- mid = mid + Math.imul(ah9, bl4) | 0;
- hi = Math.imul(ah9, bh4);
- lo = lo + Math.imul(al8, bl5) | 0;
- mid = mid + Math.imul(al8, bh5) | 0;
- mid = mid + Math.imul(ah8, bl5) | 0;
- hi = hi + Math.imul(ah8, bh5) | 0;
- lo = lo + Math.imul(al7, bl6) | 0;
- mid = mid + Math.imul(al7, bh6) | 0;
- mid = mid + Math.imul(ah7, bl6) | 0;
- hi = hi + Math.imul(ah7, bh6) | 0;
- lo = lo + Math.imul(al6, bl7) | 0;
- mid = mid + Math.imul(al6, bh7) | 0;
- mid = mid + Math.imul(ah6, bl7) | 0;
- hi = hi + Math.imul(ah6, bh7) | 0;
- lo = lo + Math.imul(al5, bl8) | 0;
- mid = mid + Math.imul(al5, bh8) | 0;
- mid = mid + Math.imul(ah5, bl8) | 0;
- hi = hi + Math.imul(ah5, bh8) | 0;
- lo = lo + Math.imul(al4, bl9) | 0;
- mid = mid + Math.imul(al4, bh9) | 0;
- mid = mid + Math.imul(ah4, bl9) | 0;
- hi = hi + Math.imul(ah4, bh9) | 0;
- var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0;
- w13 &= 67108863;
- lo = Math.imul(al9, bl5);
- mid = Math.imul(al9, bh5);
- mid = mid + Math.imul(ah9, bl5) | 0;
- hi = Math.imul(ah9, bh5);
- lo = lo + Math.imul(al8, bl6) | 0;
- mid = mid + Math.imul(al8, bh6) | 0;
- mid = mid + Math.imul(ah8, bl6) | 0;
- hi = hi + Math.imul(ah8, bh6) | 0;
- lo = lo + Math.imul(al7, bl7) | 0;
- mid = mid + Math.imul(al7, bh7) | 0;
- mid = mid + Math.imul(ah7, bl7) | 0;
- hi = hi + Math.imul(ah7, bh7) | 0;
- lo = lo + Math.imul(al6, bl8) | 0;
- mid = mid + Math.imul(al6, bh8) | 0;
- mid = mid + Math.imul(ah6, bl8) | 0;
- hi = hi + Math.imul(ah6, bh8) | 0;
- lo = lo + Math.imul(al5, bl9) | 0;
- mid = mid + Math.imul(al5, bh9) | 0;
- mid = mid + Math.imul(ah5, bl9) | 0;
- hi = hi + Math.imul(ah5, bh9) | 0;
- var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0;
- w14 &= 67108863;
- lo = Math.imul(al9, bl6);
- mid = Math.imul(al9, bh6);
- mid = mid + Math.imul(ah9, bl6) | 0;
- hi = Math.imul(ah9, bh6);
- lo = lo + Math.imul(al8, bl7) | 0;
- mid = mid + Math.imul(al8, bh7) | 0;
- mid = mid + Math.imul(ah8, bl7) | 0;
- hi = hi + Math.imul(ah8, bh7) | 0;
- lo = lo + Math.imul(al7, bl8) | 0;
- mid = mid + Math.imul(al7, bh8) | 0;
- mid = mid + Math.imul(ah7, bl8) | 0;
- hi = hi + Math.imul(ah7, bh8) | 0;
- lo = lo + Math.imul(al6, bl9) | 0;
- mid = mid + Math.imul(al6, bh9) | 0;
- mid = mid + Math.imul(ah6, bl9) | 0;
- hi = hi + Math.imul(ah6, bh9) | 0;
- var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0;
- w15 &= 67108863;
- lo = Math.imul(al9, bl7);
- mid = Math.imul(al9, bh7);
- mid = mid + Math.imul(ah9, bl7) | 0;
- hi = Math.imul(ah9, bh7);
- lo = lo + Math.imul(al8, bl8) | 0;
- mid = mid + Math.imul(al8, bh8) | 0;
- mid = mid + Math.imul(ah8, bl8) | 0;
- hi = hi + Math.imul(ah8, bh8) | 0;
- lo = lo + Math.imul(al7, bl9) | 0;
- mid = mid + Math.imul(al7, bh9) | 0;
- mid = mid + Math.imul(ah7, bl9) | 0;
- hi = hi + Math.imul(ah7, bh9) | 0;
- var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0;
- w16 &= 67108863;
- lo = Math.imul(al9, bl8);
- mid = Math.imul(al9, bh8);
- mid = mid + Math.imul(ah9, bl8) | 0;
- hi = Math.imul(ah9, bh8);
- lo = lo + Math.imul(al8, bl9) | 0;
- mid = mid + Math.imul(al8, bh9) | 0;
- mid = mid + Math.imul(ah8, bl9) | 0;
- hi = hi + Math.imul(ah8, bh9) | 0;
- var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0;
- w17 &= 67108863;
- lo = Math.imul(al9, bl9);
- mid = Math.imul(al9, bh9);
- mid = mid + Math.imul(ah9, bl9) | 0;
- hi = Math.imul(ah9, bh9);
- var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0;
- w18 &= 67108863;
- o[0] = w0;
- o[1] = w1;
- o[2] = w2;
- o[3] = w3;
- o[4] = w4;
- o[5] = w5;
- o[6] = w6;
- o[7] = w7;
- o[8] = w8;
- o[9] = w9;
- o[10] = w10;
- o[11] = w11;
- o[12] = w12;
- o[13] = w13;
- o[14] = w14;
- o[15] = w15;
- o[16] = w16;
- o[17] = w17;
- o[18] = w18;
- if (c !== 0) {
- o[19] = c;
- out.length++;
- }
- return out;
- };
- if (!Math.imul) {
- comb10MulTo = smallMulTo;
- }
- function bigMulTo(self2, num, out) {
- out.negative = num.negative ^ self2.negative;
- out.length = self2.length + num.length;
- var carry = 0;
- var hncarry = 0;
- for (var k = 0;k < out.length - 1; k++) {
- var ncarry = hncarry;
- hncarry = 0;
- var rword = carry & 67108863;
- var maxJ = Math.min(k, num.length - 1);
- for (var j = Math.max(0, k - self2.length + 1);j <= maxJ; j++) {
- var i = k - j;
- var a = self2.words[i] | 0;
- var b = num.words[j] | 0;
- var r = a * b;
- var lo = r & 67108863;
- ncarry = ncarry + (r / 67108864 | 0) | 0;
- lo = lo + rword | 0;
- rword = lo & 67108863;
- ncarry = ncarry + (lo >>> 26) | 0;
- hncarry += ncarry >>> 26;
- ncarry &= 67108863;
- }
- out.words[k] = rword;
- carry = ncarry;
- ncarry = hncarry;
- }
- if (carry !== 0) {
- out.words[k] = carry;
- } else {
- out.length--;
- }
- return out.strip();
- }
- function jumboMulTo(self2, num, out) {
- var fftm = new FFTM;
- return fftm.mulp(self2, num, out);
- }
- BN.prototype.mulTo = function mulTo(num, out) {
- var res;
- var len = this.length + num.length;
- if (this.length === 10 && num.length === 10) {
- res = comb10MulTo(this, num, out);
- } else if (len < 63) {
- res = smallMulTo(this, num, out);
- } else if (len < 1024) {
- res = bigMulTo(this, num, out);
- } else {
- res = jumboMulTo(this, num, out);
- }
- return res;
- };
- function FFTM(x, y) {
- this.x = x;
- this.y = y;
- }
- FFTM.prototype.makeRBT = function makeRBT(N) {
- var t = new Array(N);
- var l = BN.prototype._countBits(N) - 1;
- for (var i = 0;i < N; i++) {
- t[i] = this.revBin(i, l, N);
- }
- return t;
- };
- FFTM.prototype.revBin = function revBin(x, l, N) {
- if (x === 0 || x === N - 1)
- return x;
- var rb = 0;
- for (var i = 0;i < l; i++) {
- rb |= (x & 1) << l - i - 1;
- x >>= 1;
- }
- return rb;
- };
- FFTM.prototype.permute = function permute(rbt, rws, iws, rtws, itws, N) {
- for (var i = 0;i < N; i++) {
- rtws[i] = rws[rbt[i]];
- itws[i] = iws[rbt[i]];
- }
- };
- FFTM.prototype.transform = function transform(rws, iws, rtws, itws, N, rbt) {
- this.permute(rbt, rws, iws, rtws, itws, N);
- for (var s = 1;s < N; s <<= 1) {
- var l = s << 1;
- var rtwdf = Math.cos(2 * Math.PI / l);
- var itwdf = Math.sin(2 * Math.PI / l);
- for (var p = 0;p < N; p += l) {
- var rtwdf_ = rtwdf;
- var itwdf_ = itwdf;
- for (var j = 0;j < s; j++) {
- var re = rtws[p + j];
- var ie = itws[p + j];
- var ro = rtws[p + j + s];
- var io = itws[p + j + s];
- var rx = rtwdf_ * ro - itwdf_ * io;
- io = rtwdf_ * io + itwdf_ * ro;
- ro = rx;
- rtws[p + j] = re + ro;
- itws[p + j] = ie + io;
- rtws[p + j + s] = re - ro;
- itws[p + j + s] = ie - io;
- if (j !== l) {
- rx = rtwdf * rtwdf_ - itwdf * itwdf_;
- itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;
- rtwdf_ = rx;
- }
- }
- }
- }
- };
- FFTM.prototype.guessLen13b = function guessLen13b(n, m) {
- var N = Math.max(m, n) | 1;
- var odd = N & 1;
- var i = 0;
- for (N = N / 2 | 0;N; N = N >>> 1) {
- i++;
- }
- return 1 << i + 1 + odd;
- };
- FFTM.prototype.conjugate = function conjugate(rws, iws, N) {
- if (N <= 1)
- return;
- for (var i = 0;i < N / 2; i++) {
- var t = rws[i];
- rws[i] = rws[N - i - 1];
- rws[N - i - 1] = t;
- t = iws[i];
- iws[i] = -iws[N - i - 1];
- iws[N - i - 1] = -t;
- }
- };
- FFTM.prototype.normalize13b = function normalize13b(ws, N) {
- var carry = 0;
- for (var i = 0;i < N / 2; i++) {
- var w = Math.round(ws[2 * i + 1] / N) * 8192 + Math.round(ws[2 * i] / N) + carry;
- ws[i] = w & 67108863;
- if (w < 67108864) {
- carry = 0;
- } else {
- carry = w / 67108864 | 0;
- }
- }
- return ws;
- };
- FFTM.prototype.convert13b = function convert13b(ws, len, rws, N) {
- var carry = 0;
- for (var i = 0;i < len; i++) {
- carry = carry + (ws[i] | 0);
- rws[2 * i] = carry & 8191;
- carry = carry >>> 13;
- rws[2 * i + 1] = carry & 8191;
- carry = carry >>> 13;
- }
- for (i = 2 * len;i < N; ++i) {
- rws[i] = 0;
- }
- assert(carry === 0);
- assert((carry & ~8191) === 0);
- };
- FFTM.prototype.stub = function stub(N) {
- var ph = new Array(N);
- for (var i = 0;i < N; i++) {
- ph[i] = 0;
- }
- return ph;
- };
- FFTM.prototype.mulp = function mulp(x, y, out) {
- var N = 2 * this.guessLen13b(x.length, y.length);
- var rbt = this.makeRBT(N);
- var _ = this.stub(N);
- var rws = new Array(N);
- var rwst = new Array(N);
- var iwst = new Array(N);
- var nrws = new Array(N);
- var nrwst = new Array(N);
- var niwst = new Array(N);
- var rmws = out.words;
- rmws.length = N;
- this.convert13b(x.words, x.length, rws, N);
- this.convert13b(y.words, y.length, nrws, N);
- this.transform(rws, _, rwst, iwst, N, rbt);
- this.transform(nrws, _, nrwst, niwst, N, rbt);
- for (var i = 0;i < N; i++) {
- var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];
- iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];
- rwst[i] = rx;
- }
- this.conjugate(rwst, iwst, N);
- this.transform(rwst, iwst, rmws, _, N, rbt);
- this.conjugate(rmws, _, N);
- this.normalize13b(rmws, N);
- out.negative = x.negative ^ y.negative;
- out.length = x.length + y.length;
- return out.strip();
- };
- BN.prototype.mul = function mul(num) {
- var out = new BN(null);
- out.words = new Array(this.length + num.length);
- return this.mulTo(num, out);
- };
- BN.prototype.mulf = function mulf(num) {
- var out = new BN(null);
- out.words = new Array(this.length + num.length);
- return jumboMulTo(this, num, out);
- };
- BN.prototype.imul = function imul(num) {
- return this.clone().mulTo(num, this);
- };
- BN.prototype.imuln = function imuln(num) {
- assert(typeof num === "number");
- assert(num < 67108864);
- var carry = 0;
- for (var i = 0;i < this.length; i++) {
- var w = (this.words[i] | 0) * num;
- var lo = (w & 67108863) + (carry & 67108863);
- carry >>= 26;
- carry += w / 67108864 | 0;
- carry += lo >>> 26;
- this.words[i] = lo & 67108863;
- }
- if (carry !== 0) {
- this.words[i] = carry;
- this.length++;
- }
- this.length = num === 0 ? 1 : this.length;
- return this;
- };
- BN.prototype.muln = function muln(num) {
- return this.clone().imuln(num);
- };
- BN.prototype.sqr = function sqr() {
- return this.mul(this);
- };
- BN.prototype.isqr = function isqr() {
- return this.imul(this.clone());
- };
- BN.prototype.pow = function pow(num) {
- var w = toBitArray(num);
- if (w.length === 0)
- return new BN(1);
- var res = this;
- for (var i = 0;i < w.length; i++, res = res.sqr()) {
- if (w[i] !== 0)
- break;
- }
- if (++i < w.length) {
- for (var q = res.sqr();i < w.length; i++, q = q.sqr()) {
- if (w[i] === 0)
- continue;
- res = res.mul(q);
- }
- }
- return res;
- };
- BN.prototype.iushln = function iushln(bits) {
- assert(typeof bits === "number" && bits >= 0);
- var r = bits % 26;
- var s = (bits - r) / 26;
- var carryMask = 67108863 >>> 26 - r << 26 - r;
- var i;
- if (r !== 0) {
- var carry = 0;
- for (i = 0;i < this.length; i++) {
- var newCarry = this.words[i] & carryMask;
- var c = (this.words[i] | 0) - newCarry << r;
- this.words[i] = c | carry;
- carry = newCarry >>> 26 - r;
- }
- if (carry) {
- this.words[i] = carry;
- this.length++;
- }
- }
- if (s !== 0) {
- for (i = this.length - 1;i >= 0; i--) {
- this.words[i + s] = this.words[i];
- }
- for (i = 0;i < s; i++) {
- this.words[i] = 0;
- }
- this.length += s;
- }
- return this.strip();
- };
- BN.prototype.ishln = function ishln(bits) {
- assert(this.negative === 0);
- return this.iushln(bits);
- };
- BN.prototype.iushrn = function iushrn(bits, hint, extended) {
- assert(typeof bits === "number" && bits >= 0);
- var h;
- if (hint) {
- h = (hint - hint % 26) / 26;
- } else {
- h = 0;
- }
- var r = bits % 26;
- var s = Math.min((bits - r) / 26, this.length);
- var mask = 67108863 ^ 67108863 >>> r << r;
- var maskedWords = extended;
- h -= s;
- h = Math.max(0, h);
- if (maskedWords) {
- for (var i = 0;i < s; i++) {
- maskedWords.words[i] = this.words[i];
- }
- maskedWords.length = s;
- }
- if (s === 0) {} else if (this.length > s) {
- this.length -= s;
- for (i = 0;i < this.length; i++) {
- this.words[i] = this.words[i + s];
- }
- } else {
- this.words[0] = 0;
- this.length = 1;
- }
- var carry = 0;
- for (i = this.length - 1;i >= 0 && (carry !== 0 || i >= h); i--) {
- var word = this.words[i] | 0;
- this.words[i] = carry << 26 - r | word >>> r;
- carry = word & mask;
- }
- if (maskedWords && carry !== 0) {
- maskedWords.words[maskedWords.length++] = carry;
- }
- if (this.length === 0) {
- this.words[0] = 0;
- this.length = 1;
- }
- return this.strip();
- };
- BN.prototype.ishrn = function ishrn(bits, hint, extended) {
- assert(this.negative === 0);
- return this.iushrn(bits, hint, extended);
- };
- BN.prototype.shln = function shln(bits) {
- return this.clone().ishln(bits);
- };
- BN.prototype.ushln = function ushln(bits) {
- return this.clone().iushln(bits);
- };
- BN.prototype.shrn = function shrn(bits) {
- return this.clone().ishrn(bits);
- };
- BN.prototype.ushrn = function ushrn(bits) {
- return this.clone().iushrn(bits);
- };
- BN.prototype.testn = function testn(bit) {
- assert(typeof bit === "number" && bit >= 0);
- var r = bit % 26;
- var s = (bit - r) / 26;
- var q = 1 << r;
- if (this.length <= s)
- return false;
- var w = this.words[s];
- return !!(w & q);
- };
- BN.prototype.imaskn = function imaskn(bits) {
- assert(typeof bits === "number" && bits >= 0);
- var r = bits % 26;
- var s = (bits - r) / 26;
- assert(this.negative === 0, "imaskn works only with positive numbers");
- if (this.length <= s) {
- return this;
- }
- if (r !== 0) {
- s++;
- }
- this.length = Math.min(s, this.length);
- if (r !== 0) {
- var mask = 67108863 ^ 67108863 >>> r << r;
- this.words[this.length - 1] &= mask;
- }
- return this.strip();
- };
- BN.prototype.maskn = function maskn(bits) {
- return this.clone().imaskn(bits);
- };
- BN.prototype.iaddn = function iaddn(num) {
- assert(typeof num === "number");
- assert(num < 67108864);
- if (num < 0)
- return this.isubn(-num);
- if (this.negative !== 0) {
- if (this.length === 1 && (this.words[0] | 0) < num) {
- this.words[0] = num - (this.words[0] | 0);
- this.negative = 0;
- return this;
- }
- this.negative = 0;
- this.isubn(num);
- this.negative = 1;
- return this;
- }
- return this._iaddn(num);
- };
- BN.prototype._iaddn = function _iaddn(num) {
- this.words[0] += num;
- for (var i = 0;i < this.length && this.words[i] >= 67108864; i++) {
- this.words[i] -= 67108864;
- if (i === this.length - 1) {
- this.words[i + 1] = 1;
- } else {
- this.words[i + 1]++;
- }
- }
- this.length = Math.max(this.length, i + 1);
- return this;
- };
- BN.prototype.isubn = function isubn(num) {
- assert(typeof num === "number");
- assert(num < 67108864);
- if (num < 0)
- return this.iaddn(-num);
- if (this.negative !== 0) {
- this.negative = 0;
- this.iaddn(num);
- this.negative = 1;
- return this;
- }
- this.words[0] -= num;
- if (this.length === 1 && this.words[0] < 0) {
- this.words[0] = -this.words[0];
- this.negative = 1;
- } else {
- for (var i = 0;i < this.length && this.words[i] < 0; i++) {
- this.words[i] += 67108864;
- this.words[i + 1] -= 1;
- }
- }
- return this.strip();
- };
- BN.prototype.addn = function addn(num) {
- return this.clone().iaddn(num);
- };
- BN.prototype.subn = function subn(num) {
- return this.clone().isubn(num);
- };
- BN.prototype.iabs = function iabs() {
- this.negative = 0;
- return this;
- };
- BN.prototype.abs = function abs() {
- return this.clone().iabs();
- };
- BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) {
- var len = num.length + shift;
- var i;
- this._expand(len);
- var w;
- var carry = 0;
- for (i = 0;i < num.length; i++) {
- w = (this.words[i + shift] | 0) + carry;
- var right = (num.words[i] | 0) * mul;
- w -= right & 67108863;
- carry = (w >> 26) - (right / 67108864 | 0);
- this.words[i + shift] = w & 67108863;
- }
- for (;i < this.length - shift; i++) {
- w = (this.words[i + shift] | 0) + carry;
- carry = w >> 26;
- this.words[i + shift] = w & 67108863;
- }
- if (carry === 0)
- return this.strip();
- assert(carry === -1);
- carry = 0;
- for (i = 0;i < this.length; i++) {
- w = -(this.words[i] | 0) + carry;
- carry = w >> 26;
- this.words[i] = w & 67108863;
- }
- this.negative = 1;
- return this.strip();
- };
- BN.prototype._wordDiv = function _wordDiv(num, mode) {
- var shift = this.length - num.length;
- var a = this.clone();
- var b = num;
- var bhi = b.words[b.length - 1] | 0;
- var bhiBits = this._countBits(bhi);
- shift = 26 - bhiBits;
- if (shift !== 0) {
- b = b.ushln(shift);
- a.iushln(shift);
- bhi = b.words[b.length - 1] | 0;
- }
- var m = a.length - b.length;
- var q;
- if (mode !== "mod") {
- q = new BN(null);
- q.length = m + 1;
- q.words = new Array(q.length);
- for (var i = 0;i < q.length; i++) {
- q.words[i] = 0;
- }
- }
- var diff = a.clone()._ishlnsubmul(b, 1, m);
- if (diff.negative === 0) {
- a = diff;
- if (q) {
- q.words[m] = 1;
- }
- }
- for (var j = m - 1;j >= 0; j--) {
- var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0);
- qj = Math.min(qj / bhi | 0, 67108863);
- a._ishlnsubmul(b, qj, j);
- while (a.negative !== 0) {
- qj--;
- a.negative = 0;
- a._ishlnsubmul(b, 1, j);
- if (!a.isZero()) {
- a.negative ^= 1;
- }
- }
- if (q) {
- q.words[j] = qj;
- }
- }
- if (q) {
- q.strip();
- }
- a.strip();
- if (mode !== "div" && shift !== 0) {
- a.iushrn(shift);
- }
- return {
- div: q || null,
- mod: a
- };
- };
- BN.prototype.divmod = function divmod(num, mode, positive) {
- assert(!num.isZero());
- if (this.isZero()) {
- return {
- div: new BN(0),
- mod: new BN(0)
- };
- }
- var div, mod, res;
- if (this.negative !== 0 && num.negative === 0) {
- res = this.neg().divmod(num, mode);
- if (mode !== "mod") {
- div = res.div.neg();
- }
- if (mode !== "div") {
- mod = res.mod.neg();
- if (positive && mod.negative !== 0) {
- mod.iadd(num);
- }
- }
- return {
- div,
- mod
- };
- }
- if (this.negative === 0 && num.negative !== 0) {
- res = this.divmod(num.neg(), mode);
- if (mode !== "mod") {
- div = res.div.neg();
- }
- return {
- div,
- mod: res.mod
- };
- }
- if ((this.negative & num.negative) !== 0) {
- res = this.neg().divmod(num.neg(), mode);
- if (mode !== "div") {
- mod = res.mod.neg();
- if (positive && mod.negative !== 0) {
- mod.isub(num);
- }
- }
- return {
- div: res.div,
- mod
- };
- }
- if (num.length > this.length || this.cmp(num) < 0) {
- return {
- div: new BN(0),
- mod: this
- };
- }
- if (num.length === 1) {
- if (mode === "div") {
- return {
- div: this.divn(num.words[0]),
- mod: null
- };
- }
- if (mode === "mod") {
- return {
- div: null,
- mod: new BN(this.modn(num.words[0]))
- };
- }
- return {
- div: this.divn(num.words[0]),
- mod: new BN(this.modn(num.words[0]))
- };
- }
- return this._wordDiv(num, mode);
- };
- BN.prototype.div = function div(num) {
- return this.divmod(num, "div", false).div;
- };
- BN.prototype.mod = function mod(num) {
- return this.divmod(num, "mod", false).mod;
- };
- BN.prototype.umod = function umod(num) {
- return this.divmod(num, "mod", true).mod;
- };
- BN.prototype.divRound = function divRound(num) {
- var dm = this.divmod(num);
- if (dm.mod.isZero())
- return dm.div;
- var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;
- var half = num.ushrn(1);
- var r2 = num.andln(1);
- var cmp = mod.cmp(half);
- if (cmp < 0 || r2 === 1 && cmp === 0)
- return dm.div;
- return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
- };
- BN.prototype.modn = function modn(num) {
- assert(num <= 67108863);
- var p = (1 << 26) % num;
- var acc = 0;
- for (var i = this.length - 1;i >= 0; i--) {
- acc = (p * acc + (this.words[i] | 0)) % num;
- }
- return acc;
- };
- BN.prototype.idivn = function idivn(num) {
- assert(num <= 67108863);
- var carry = 0;
- for (var i = this.length - 1;i >= 0; i--) {
- var w = (this.words[i] | 0) + carry * 67108864;
- this.words[i] = w / num | 0;
- carry = w % num;
- }
- return this.strip();
- };
- BN.prototype.divn = function divn(num) {
- return this.clone().idivn(num);
- };
- BN.prototype.egcd = function egcd(p) {
- assert(p.negative === 0);
- assert(!p.isZero());
- var x = this;
- var y = p.clone();
- if (x.negative !== 0) {
- x = x.umod(p);
- } else {
- x = x.clone();
- }
- var A = new BN(1);
- var B = new BN(0);
- var C = new BN(0);
- var D = new BN(1);
- var g = 0;
- while (x.isEven() && y.isEven()) {
- x.iushrn(1);
- y.iushrn(1);
- ++g;
- }
- var yp = y.clone();
- var xp = x.clone();
- while (!x.isZero()) {
- for (var i = 0, im = 1;(x.words[0] & im) === 0 && i < 26; ++i, im <<= 1)
- ;
- if (i > 0) {
- x.iushrn(i);
- while (i-- > 0) {
- if (A.isOdd() || B.isOdd()) {
- A.iadd(yp);
- B.isub(xp);
- }
- A.iushrn(1);
- B.iushrn(1);
- }
- }
- for (var j = 0, jm = 1;(y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1)
- ;
- if (j > 0) {
- y.iushrn(j);
- while (j-- > 0) {
- if (C.isOdd() || D.isOdd()) {
- C.iadd(yp);
- D.isub(xp);
- }
- C.iushrn(1);
- D.iushrn(1);
- }
- }
- if (x.cmp(y) >= 0) {
- x.isub(y);
- A.isub(C);
- B.isub(D);
- } else {
- y.isub(x);
- C.isub(A);
- D.isub(B);
- }
- }
- return {
- a: C,
- b: D,
- gcd: y.iushln(g)
- };
- };
- BN.prototype._invmp = function _invmp(p) {
- assert(p.negative === 0);
- assert(!p.isZero());
- var a = this;
- var b = p.clone();
- if (a.negative !== 0) {
- a = a.umod(p);
- } else {
- a = a.clone();
- }
- var x1 = new BN(1);
- var x2 = new BN(0);
- var delta = b.clone();
- while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
- for (var i = 0, im = 1;(a.words[0] & im) === 0 && i < 26; ++i, im <<= 1)
- ;
- if (i > 0) {
- a.iushrn(i);
- while (i-- > 0) {
- if (x1.isOdd()) {
- x1.iadd(delta);
- }
- x1.iushrn(1);
- }
- }
- for (var j = 0, jm = 1;(b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1)
- ;
- if (j > 0) {
- b.iushrn(j);
- while (j-- > 0) {
- if (x2.isOdd()) {
- x2.iadd(delta);
- }
- x2.iushrn(1);
- }
- }
- if (a.cmp(b) >= 0) {
- a.isub(b);
- x1.isub(x2);
- } else {
- b.isub(a);
- x2.isub(x1);
- }
- }
- var res;
- if (a.cmpn(1) === 0) {
- res = x1;
- } else {
- res = x2;
- }
- if (res.cmpn(0) < 0) {
- res.iadd(p);
- }
- return res;
- };
- BN.prototype.gcd = function gcd(num) {
- if (this.isZero())
- return num.abs();
- if (num.isZero())
- return this.abs();
- var a = this.clone();
- var b = num.clone();
- a.negative = 0;
- b.negative = 0;
- for (var shift = 0;a.isEven() && b.isEven(); shift++) {
- a.iushrn(1);
- b.iushrn(1);
- }
- do {
- while (a.isEven()) {
- a.iushrn(1);
- }
- while (b.isEven()) {
- b.iushrn(1);
- }
- var r = a.cmp(b);
- if (r < 0) {
- var t = a;
- a = b;
- b = t;
- } else if (r === 0 || b.cmpn(1) === 0) {
- break;
- }
- a.isub(b);
- } while (true);
- return b.iushln(shift);
- };
- BN.prototype.invm = function invm(num) {
- return this.egcd(num).a.umod(num);
- };
- BN.prototype.isEven = function isEven() {
- return (this.words[0] & 1) === 0;
- };
- BN.prototype.isOdd = function isOdd() {
- return (this.words[0] & 1) === 1;
- };
- BN.prototype.andln = function andln(num) {
- return this.words[0] & num;
- };
- BN.prototype.bincn = function bincn(bit) {
- assert(typeof bit === "number");
- var r = bit % 26;
- var s = (bit - r) / 26;
- var q = 1 << r;
- if (this.length <= s) {
- this._expand(s + 1);
- this.words[s] |= q;
- return this;
- }
- var carry = q;
- for (var i = s;carry !== 0 && i < this.length; i++) {
- var w = this.words[i] | 0;
- w += carry;
- carry = w >>> 26;
- w &= 67108863;
- this.words[i] = w;
- }
- if (carry !== 0) {
- this.words[i] = carry;
- this.length++;
- }
- return this;
- };
- BN.prototype.isZero = function isZero() {
- return this.length === 1 && this.words[0] === 0;
- };
- BN.prototype.cmpn = function cmpn(num) {
- var negative = num < 0;
- if (this.negative !== 0 && !negative)
- return -1;
- if (this.negative === 0 && negative)
- return 1;
- this.strip();
- var res;
- if (this.length > 1) {
- res = 1;
- } else {
- if (negative) {
- num = -num;
- }
- assert(num <= 67108863, "Number is too big");
- var w = this.words[0] | 0;
- res = w === num ? 0 : w < num ? -1 : 1;
- }
- if (this.negative !== 0)
- return -res | 0;
- return res;
- };
- BN.prototype.cmp = function cmp(num) {
- if (this.negative !== 0 && num.negative === 0)
- return -1;
- if (this.negative === 0 && num.negative !== 0)
- return 1;
- var res = this.ucmp(num);
- if (this.negative !== 0)
- return -res | 0;
- return res;
- };
- BN.prototype.ucmp = function ucmp(num) {
- if (this.length > num.length)
- return 1;
- if (this.length < num.length)
- return -1;
- var res = 0;
- for (var i = this.length - 1;i >= 0; i--) {
- var a = this.words[i] | 0;
- var b = num.words[i] | 0;
- if (a === b)
- continue;
- if (a < b) {
- res = -1;
- } else if (a > b) {
- res = 1;
- }
- break;
- }
- return res;
- };
- BN.prototype.gtn = function gtn(num) {
- return this.cmpn(num) === 1;
- };
- BN.prototype.gt = function gt(num) {
- return this.cmp(num) === 1;
- };
- BN.prototype.gten = function gten(num) {
- return this.cmpn(num) >= 0;
- };
- BN.prototype.gte = function gte(num) {
- return this.cmp(num) >= 0;
- };
- BN.prototype.ltn = function ltn(num) {
- return this.cmpn(num) === -1;
- };
- BN.prototype.lt = function lt(num) {
- return this.cmp(num) === -1;
- };
- BN.prototype.lten = function lten(num) {
- return this.cmpn(num) <= 0;
- };
- BN.prototype.lte = function lte(num) {
- return this.cmp(num) <= 0;
- };
- BN.prototype.eqn = function eqn(num) {
- return this.cmpn(num) === 0;
- };
- BN.prototype.eq = function eq(num) {
- return this.cmp(num) === 0;
- };
- BN.red = function red(num) {
- return new Red(num);
- };
- BN.prototype.toRed = function toRed(ctx) {
- assert(!this.red, "Already a number in reduction context");
- assert(this.negative === 0, "red works only with positives");
- return ctx.convertTo(this)._forceRed(ctx);
- };
- BN.prototype.fromRed = function fromRed() {
- assert(this.red, "fromRed works only with numbers in reduction context");
- return this.red.convertFrom(this);
- };
- BN.prototype._forceRed = function _forceRed(ctx) {
- this.red = ctx;
- return this;
- };
- BN.prototype.forceRed = function forceRed(ctx) {
- assert(!this.red, "Already a number in reduction context");
- return this._forceRed(ctx);
- };
- BN.prototype.redAdd = function redAdd(num) {
- assert(this.red, "redAdd works only with red numbers");
- return this.red.add(this, num);
- };
- BN.prototype.redIAdd = function redIAdd(num) {
- assert(this.red, "redIAdd works only with red numbers");
- return this.red.iadd(this, num);
- };
- BN.prototype.redSub = function redSub(num) {
- assert(this.red, "redSub works only with red numbers");
- return this.red.sub(this, num);
- };
- BN.prototype.redISub = function redISub(num) {
- assert(this.red, "redISub works only with red numbers");
- return this.red.isub(this, num);
- };
- BN.prototype.redShl = function redShl(num) {
- assert(this.red, "redShl works only with red numbers");
- return this.red.shl(this, num);
- };
- BN.prototype.redMul = function redMul(num) {
- assert(this.red, "redMul works only with red numbers");
- this.red._verify2(this, num);
- return this.red.mul(this, num);
- };
- BN.prototype.redIMul = function redIMul(num) {
- assert(this.red, "redMul works only with red numbers");
- this.red._verify2(this, num);
- return this.red.imul(this, num);
- };
- BN.prototype.redSqr = function redSqr() {
- assert(this.red, "redSqr works only with red numbers");
- this.red._verify1(this);
- return this.red.sqr(this);
- };
- BN.prototype.redISqr = function redISqr() {
- assert(this.red, "redISqr works only with red numbers");
- this.red._verify1(this);
- return this.red.isqr(this);
- };
- BN.prototype.redSqrt = function redSqrt() {
- assert(this.red, "redSqrt works only with red numbers");
- this.red._verify1(this);
- return this.red.sqrt(this);
- };
- BN.prototype.redInvm = function redInvm() {
- assert(this.red, "redInvm works only with red numbers");
- this.red._verify1(this);
- return this.red.invm(this);
- };
- BN.prototype.redNeg = function redNeg() {
- assert(this.red, "redNeg works only with red numbers");
- this.red._verify1(this);
- return this.red.neg(this);
- };
- BN.prototype.redPow = function redPow(num) {
- assert(this.red && !num.red, "redPow(normalNum)");
- this.red._verify1(this);
- return this.red.pow(this, num);
- };
- var primes = {
- k256: null,
- p224: null,
- p192: null,
- p25519: null
- };
- function MPrime(name, p) {
- this.name = name;
- this.p = new BN(p, 16);
- this.n = this.p.bitLength();
- this.k = new BN(1).iushln(this.n).isub(this.p);
- this.tmp = this._tmp();
- }
- MPrime.prototype._tmp = function _tmp() {
- var tmp = new BN(null);
- tmp.words = new Array(Math.ceil(this.n / 13));
- return tmp;
- };
- MPrime.prototype.ireduce = function ireduce(num) {
- var r = num;
- var rlen;
- do {
- this.split(r, this.tmp);
- r = this.imulK(r);
- r = r.iadd(this.tmp);
- rlen = r.bitLength();
- } while (rlen > this.n);
- var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
- if (cmp === 0) {
- r.words[0] = 0;
- r.length = 1;
- } else if (cmp > 0) {
- r.isub(this.p);
- } else {
- if (r.strip !== undefined) {
- r.strip();
- } else {
- r._strip();
- }
- }
- return r;
- };
- MPrime.prototype.split = function split(input, out) {
- input.iushrn(this.n, 0, out);
- };
- MPrime.prototype.imulK = function imulK(num) {
- return num.imul(this.k);
- };
- function K256() {
- MPrime.call(this, "k256", "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f");
- }
- inherits(K256, MPrime);
- K256.prototype.split = function split(input, output) {
- var mask = 4194303;
- var outLen = Math.min(input.length, 9);
- for (var i = 0;i < outLen; i++) {
- output.words[i] = input.words[i];
- }
- output.length = outLen;
- if (input.length <= 9) {
- input.words[0] = 0;
- input.length = 1;
- return;
- }
- var prev = input.words[9];
- output.words[output.length++] = prev & mask;
- for (i = 10;i < input.length; i++) {
- var next = input.words[i] | 0;
- input.words[i - 10] = (next & mask) << 4 | prev >>> 22;
- prev = next;
- }
- prev >>>= 22;
- input.words[i - 10] = prev;
- if (prev === 0 && input.length > 10) {
- input.length -= 10;
- } else {
- input.length -= 9;
- }
- };
- K256.prototype.imulK = function imulK(num) {
- num.words[num.length] = 0;
- num.words[num.length + 1] = 0;
- num.length += 2;
- var lo = 0;
- for (var i = 0;i < num.length; i++) {
- var w = num.words[i] | 0;
- lo += w * 977;
- num.words[i] = lo & 67108863;
- lo = w * 64 + (lo / 67108864 | 0);
- }
- if (num.words[num.length - 1] === 0) {
- num.length--;
- if (num.words[num.length - 1] === 0) {
- num.length--;
- }
- }
- return num;
- };
- function P224() {
- MPrime.call(this, "p224", "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001");
- }
- inherits(P224, MPrime);
- function P192() {
- MPrime.call(this, "p192", "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff");
- }
- inherits(P192, MPrime);
- function P25519() {
- MPrime.call(this, "25519", "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed");
- }
- inherits(P25519, MPrime);
- P25519.prototype.imulK = function imulK(num) {
- var carry = 0;
- for (var i = 0;i < num.length; i++) {
- var hi = (num.words[i] | 0) * 19 + carry;
- var lo = hi & 67108863;
- hi >>>= 26;
- num.words[i] = lo;
- carry = hi;
- }
- if (carry !== 0) {
- num.words[num.length++] = carry;
- }
- return num;
- };
- BN._prime = function prime(name) {
- if (primes[name])
- return primes[name];
- var prime;
- if (name === "k256") {
- prime = new K256;
- } else if (name === "p224") {
- prime = new P224;
- } else if (name === "p192") {
- prime = new P192;
- } else if (name === "p25519") {
- prime = new P25519;
- } else {
- throw new Error("Unknown prime " + name);
- }
- primes[name] = prime;
- return prime;
- };
- function Red(m) {
- if (typeof m === "string") {
- var prime = BN._prime(m);
- this.m = prime.p;
- this.prime = prime;
- } else {
- assert(m.gtn(1), "modulus must be greater than 1");
- this.m = m;
- this.prime = null;
- }
- }
- Red.prototype._verify1 = function _verify1(a) {
- assert(a.negative === 0, "red works only with positives");
- assert(a.red, "red works only with red numbers");
- };
- Red.prototype._verify2 = function _verify2(a, b) {
- assert((a.negative | b.negative) === 0, "red works only with positives");
- assert(a.red && a.red === b.red, "red works only with red numbers");
- };
- Red.prototype.imod = function imod(a) {
- if (this.prime)
- return this.prime.ireduce(a)._forceRed(this);
- return a.umod(this.m)._forceRed(this);
- };
- Red.prototype.neg = function neg(a) {
- if (a.isZero()) {
- return a.clone();
- }
- return this.m.sub(a)._forceRed(this);
- };
- Red.prototype.add = function add(a, b) {
- this._verify2(a, b);
- var res = a.add(b);
- if (res.cmp(this.m) >= 0) {
- res.isub(this.m);
- }
- return res._forceRed(this);
- };
- Red.prototype.iadd = function iadd(a, b) {
- this._verify2(a, b);
- var res = a.iadd(b);
- if (res.cmp(this.m) >= 0) {
- res.isub(this.m);
- }
- return res;
- };
- Red.prototype.sub = function sub(a, b) {
- this._verify2(a, b);
- var res = a.sub(b);
- if (res.cmpn(0) < 0) {
- res.iadd(this.m);
- }
- return res._forceRed(this);
- };
- Red.prototype.isub = function isub(a, b) {
- this._verify2(a, b);
- var res = a.isub(b);
- if (res.cmpn(0) < 0) {
- res.iadd(this.m);
- }
- return res;
- };
- Red.prototype.shl = function shl(a, num) {
- this._verify1(a);
- return this.imod(a.ushln(num));
- };
- Red.prototype.imul = function imul(a, b) {
- this._verify2(a, b);
- return this.imod(a.imul(b));
- };
- Red.prototype.mul = function mul(a, b) {
- this._verify2(a, b);
- return this.imod(a.mul(b));
- };
- Red.prototype.isqr = function isqr(a) {
- return this.imul(a, a.clone());
- };
- Red.prototype.sqr = function sqr(a) {
- return this.mul(a, a);
- };
- Red.prototype.sqrt = function sqrt(a) {
- if (a.isZero())
- return a.clone();
- var mod3 = this.m.andln(3);
- assert(mod3 % 2 === 1);
- if (mod3 === 3) {
- var pow = this.m.add(new BN(1)).iushrn(2);
- return this.pow(a, pow);
- }
- var q = this.m.subn(1);
- var s = 0;
- while (!q.isZero() && q.andln(1) === 0) {
- s++;
- q.iushrn(1);
- }
- assert(!q.isZero());
- var one = new BN(1).toRed(this);
- var nOne = one.redNeg();
- var lpow = this.m.subn(1).iushrn(1);
- var z = this.m.bitLength();
- z = new BN(2 * z * z).toRed(this);
- while (this.pow(z, lpow).cmp(nOne) !== 0) {
- z.redIAdd(nOne);
- }
- var c = this.pow(z, q);
- var r = this.pow(a, q.addn(1).iushrn(1));
- var t = this.pow(a, q);
- var m = s;
- while (t.cmp(one) !== 0) {
- var tmp = t;
- for (var i = 0;tmp.cmp(one) !== 0; i++) {
- tmp = tmp.redSqr();
- }
- assert(i < m);
- var b = this.pow(c, new BN(1).iushln(m - i - 1));
- r = r.redMul(b);
- c = b.redSqr();
- t = t.redMul(c);
- m = i;
- }
- return r;
- };
- Red.prototype.invm = function invm(a) {
- var inv = a._invmp(this.m);
- if (inv.negative !== 0) {
- inv.negative = 0;
- return this.imod(inv).redNeg();
- } else {
- return this.imod(inv);
- }
- };
- Red.prototype.pow = function pow(a, num) {
- if (num.isZero())
- return new BN(1).toRed(this);
- if (num.cmpn(1) === 0)
- return a.clone();
- var windowSize = 4;
- var wnd = new Array(1 << windowSize);
- wnd[0] = new BN(1).toRed(this);
- wnd[1] = a;
- for (var i = 2;i < wnd.length; i++) {
- wnd[i] = this.mul(wnd[i - 1], a);
- }
- var res = wnd[0];
- var current = 0;
- var currentLen = 0;
- var start = num.bitLength() % 26;
- if (start === 0) {
- start = 26;
- }
- for (i = num.length - 1;i >= 0; i--) {
- var word = num.words[i];
- for (var j = start - 1;j >= 0; j--) {
- var bit = word >> j & 1;
- if (res !== wnd[0]) {
- res = this.sqr(res);
- }
- if (bit === 0 && current === 0) {
- currentLen = 0;
- continue;
- }
- current <<= 1;
- current |= bit;
- currentLen++;
- if (currentLen !== windowSize && (i !== 0 || j !== 0))
- continue;
- res = this.mul(res, wnd[current]);
- currentLen = 0;
- current = 0;
- }
- start = 26;
- }
- return res;
- };
- Red.prototype.convertTo = function convertTo(num) {
- var r = num.umod(this.m);
- return r === num ? r.clone() : r;
- };
- Red.prototype.convertFrom = function convertFrom(num) {
- var res = num.clone();
- res.red = null;
- return res;
- };
- BN.mont = function mont(num) {
- return new Mont(num);
- };
- function Mont(m) {
- Red.call(this, m);
- this.shift = this.m.bitLength();
- if (this.shift % 26 !== 0) {
- this.shift += 26 - this.shift % 26;
- }
- this.r = new BN(1).iushln(this.shift);
- this.r2 = this.imod(this.r.sqr());
- this.rinv = this.r._invmp(this.m);
- this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);
- this.minv = this.minv.umod(this.r);
- this.minv = this.r.sub(this.minv);
- }
- inherits(Mont, Red);
- Mont.prototype.convertTo = function convertTo(num) {
- return this.imod(num.ushln(this.shift));
- };
- Mont.prototype.convertFrom = function convertFrom(num) {
- var r = this.imod(num.mul(this.rinv));
- r.red = null;
- return r;
- };
- Mont.prototype.imul = function imul(a, b) {
- if (a.isZero() || b.isZero()) {
- a.words[0] = 0;
- a.length = 1;
- return a;
- }
- var t = a.imul(b);
- var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
- var u = t.isub(c).iushrn(this.shift);
- var res = u;
- if (u.cmp(this.m) >= 0) {
- res = u.isub(this.m);
- } else if (u.cmpn(0) < 0) {
- res = u.iadd(this.m);
- }
- return res._forceRed(this);
- };
- Mont.prototype.mul = function mul(a, b) {
- if (a.isZero() || b.isZero())
- return new BN(0)._forceRed(this);
- var t = a.mul(b);
- var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
- var u = t.isub(c).iushrn(this.shift);
- var res = u;
- if (u.cmp(this.m) >= 0) {
- res = u.isub(this.m);
- } else if (u.cmpn(0) < 0) {
- res = u.iadd(this.m);
- }
- return res._forceRed(this);
- };
- Mont.prototype.invm = function invm(a) {
- var res = this.imod(a._invmp(this.m).mul(this.r2));
- return res._forceRed(this);
- };
- })(typeof module === "undefined" || module, exports);
-});
-
-// ../eve/node_modules/inherits/inherits_browser.js
-var require_inherits_browser = __commonJS((exports, module) => {
- if (typeof Object.create === "function") {
- module.exports = function inherits(ctor, superCtor) {
- if (superCtor) {
- ctor.super_ = superCtor;
- ctor.prototype = Object.create(superCtor.prototype, {
- constructor: {
- value: ctor,
- enumerable: false,
- writable: true,
- configurable: true
- }
- });
- }
- };
- } else {
- module.exports = function inherits(ctor, superCtor) {
- if (superCtor) {
- ctor.super_ = superCtor;
- var TempCtor = function() {};
- TempCtor.prototype = superCtor.prototype;
- ctor.prototype = new TempCtor;
- ctor.prototype.constructor = ctor;
- }
- };
- }
-});
-
-// ../eve/node_modules/inherits/inherits.js
-var require_inherits = __commonJS((exports, module) => {
- try {
- util = __require("util");
- if (typeof util.inherits !== "function")
- throw "";
- module.exports = util.inherits;
- } catch (e) {
- module.exports = require_inherits_browser();
- }
- var util;
-});
-
-// ../eve/node_modules/safer-buffer/safer.js
-var require_safer = __commonJS((exports, module) => {
- var buffer = __require("buffer");
- var Buffer2 = buffer.Buffer;
- var safer = {};
- var key;
- for (key in buffer) {
- if (!buffer.hasOwnProperty(key))
- continue;
- if (key === "SlowBuffer" || key === "Buffer")
- continue;
- safer[key] = buffer[key];
- }
- var Safer = safer.Buffer = {};
- for (key in Buffer2) {
- if (!Buffer2.hasOwnProperty(key))
- continue;
- if (key === "allocUnsafe" || key === "allocUnsafeSlow")
- continue;
- Safer[key] = Buffer2[key];
- }
- safer.Buffer.prototype = Buffer2.prototype;
- if (!Safer.from || Safer.from === Uint8Array.from) {
- Safer.from = function(value, encodingOrOffset, length) {
- if (typeof value === "number") {
- throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value);
- }
- if (value && typeof value.length === "undefined") {
- throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value);
- }
- return Buffer2(value, encodingOrOffset, length);
- };
- }
- if (!Safer.alloc) {
- Safer.alloc = function(size, fill, encoding) {
- if (typeof size !== "number") {
- throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size);
- }
- if (size < 0 || size >= 2 * (1 << 30)) {
- throw new RangeError('The value "' + size + '" is invalid for option "size"');
- }
- var buf = Buffer2(size);
- if (!fill || fill.length === 0) {
- buf.fill(0);
- } else if (typeof encoding === "string") {
- buf.fill(fill, encoding);
- } else {
- buf.fill(fill);
- }
- return buf;
- };
- }
- if (!safer.kStringMaxLength) {
- try {
- safer.kStringMaxLength = process.binding("buffer").kStringMaxLength;
- } catch (e) {}
- }
- if (!safer.constants) {
- safer.constants = {
- MAX_LENGTH: safer.kMaxLength
- };
- if (safer.kStringMaxLength) {
- safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength;
- }
- }
- module.exports = safer;
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/reporter.js
-var require_reporter = __commonJS((exports) => {
- var inherits = require_inherits();
- function Reporter(options2) {
- this._reporterState = {
- obj: null,
- path: [],
- options: options2 || {},
- errors: []
- };
- }
- exports.Reporter = Reporter;
- Reporter.prototype.isError = function isError(obj) {
- return obj instanceof ReporterError;
- };
- Reporter.prototype.save = function save() {
- const state = this._reporterState;
- return { obj: state.obj, pathLen: state.path.length };
- };
- Reporter.prototype.restore = function restore(data) {
- const state = this._reporterState;
- state.obj = data.obj;
- state.path = state.path.slice(0, data.pathLen);
- };
- Reporter.prototype.enterKey = function enterKey(key) {
- return this._reporterState.path.push(key);
- };
- Reporter.prototype.exitKey = function exitKey(index2) {
- const state = this._reporterState;
- state.path = state.path.slice(0, index2 - 1);
- };
- Reporter.prototype.leaveKey = function leaveKey(index2, key, value) {
- const state = this._reporterState;
- this.exitKey(index2);
- if (state.obj !== null)
- state.obj[key] = value;
- };
- Reporter.prototype.path = function path() {
- return this._reporterState.path.join("/");
- };
- Reporter.prototype.enterObject = function enterObject() {
- const state = this._reporterState;
- const prev = state.obj;
- state.obj = {};
- return prev;
- };
- Reporter.prototype.leaveObject = function leaveObject(prev) {
- const state = this._reporterState;
- const now = state.obj;
- state.obj = prev;
- return now;
- };
- Reporter.prototype.error = function error(msg) {
- let err;
- const state = this._reporterState;
- const inherited = msg instanceof ReporterError;
- if (inherited) {
- err = msg;
- } else {
- err = new ReporterError(state.path.map(function(elem) {
- return "[" + JSON.stringify(elem) + "]";
- }).join(""), msg.message || msg, msg.stack);
- }
- if (!state.options.partial)
- throw err;
- if (!inherited)
- state.errors.push(err);
- return err;
- };
- Reporter.prototype.wrapResult = function wrapResult(result) {
- const state = this._reporterState;
- if (!state.options.partial)
- return result;
- return {
- result: this.isError(result) ? null : result,
- errors: state.errors
- };
- };
- function ReporterError(path, msg) {
- this.path = path;
- this.rethrow(msg);
- }
- inherits(ReporterError, Error);
- ReporterError.prototype.rethrow = function rethrow(msg) {
- this.message = msg + " at: " + (this.path || "(shallow)");
- if (Error.captureStackTrace)
- Error.captureStackTrace(this, ReporterError);
- if (!this.stack) {
- try {
- throw new Error(this.message);
- } catch (e) {
- this.stack = e.stack;
- }
- }
- return this;
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/buffer.js
-var require_buffer = __commonJS((exports) => {
- var inherits = require_inherits();
- var Reporter = require_reporter().Reporter;
- var Buffer2 = require_safer().Buffer;
- function DecoderBuffer(base, options2) {
- Reporter.call(this, options2);
- if (!Buffer2.isBuffer(base)) {
- this.error("Input not Buffer");
- return;
- }
- this.base = base;
- this.offset = 0;
- this.length = base.length;
- }
- inherits(DecoderBuffer, Reporter);
- exports.DecoderBuffer = DecoderBuffer;
- DecoderBuffer.isDecoderBuffer = function isDecoderBuffer(data) {
- if (data instanceof DecoderBuffer) {
- return true;
- }
- const isCompatible = typeof data === "object" && Buffer2.isBuffer(data.base) && data.constructor.name === "DecoderBuffer" && typeof data.offset === "number" && typeof data.length === "number" && typeof data.save === "function" && typeof data.restore === "function" && typeof data.isEmpty === "function" && typeof data.readUInt8 === "function" && typeof data.skip === "function" && typeof data.raw === "function";
- return isCompatible;
- };
- DecoderBuffer.prototype.save = function save() {
- return { offset: this.offset, reporter: Reporter.prototype.save.call(this) };
- };
- DecoderBuffer.prototype.restore = function restore(save) {
- const res = new DecoderBuffer(this.base);
- res.offset = save.offset;
- res.length = this.offset;
- this.offset = save.offset;
- Reporter.prototype.restore.call(this, save.reporter);
- return res;
- };
- DecoderBuffer.prototype.isEmpty = function isEmpty() {
- return this.offset === this.length;
- };
- DecoderBuffer.prototype.readUInt8 = function readUInt8(fail) {
- if (this.offset + 1 <= this.length)
- return this.base.readUInt8(this.offset++, true);
- else
- return this.error(fail || "DecoderBuffer overrun");
- };
- DecoderBuffer.prototype.skip = function skip(bytes, fail) {
- if (!(this.offset + bytes <= this.length))
- return this.error(fail || "DecoderBuffer overrun");
- const res = new DecoderBuffer(this.base);
- res._reporterState = this._reporterState;
- res.offset = this.offset;
- res.length = this.offset + bytes;
- this.offset += bytes;
- return res;
- };
- DecoderBuffer.prototype.raw = function raw(save) {
- return this.base.slice(save ? save.offset : this.offset, this.length);
- };
- function EncoderBuffer(value, reporter) {
- if (Array.isArray(value)) {
- this.length = 0;
- this.value = value.map(function(item) {
- if (!EncoderBuffer.isEncoderBuffer(item))
- item = new EncoderBuffer(item, reporter);
- this.length += item.length;
- return item;
- }, this);
- } else if (typeof value === "number") {
- if (!(0 <= value && value <= 255))
- return reporter.error("non-byte EncoderBuffer value");
- this.value = value;
- this.length = 1;
- } else if (typeof value === "string") {
- this.value = value;
- this.length = Buffer2.byteLength(value);
- } else if (Buffer2.isBuffer(value)) {
- this.value = value;
- this.length = value.length;
- } else {
- return reporter.error("Unsupported type: " + typeof value);
- }
- }
- exports.EncoderBuffer = EncoderBuffer;
- EncoderBuffer.isEncoderBuffer = function isEncoderBuffer(data) {
- if (data instanceof EncoderBuffer) {
- return true;
- }
- const isCompatible = typeof data === "object" && data.constructor.name === "EncoderBuffer" && typeof data.length === "number" && typeof data.join === "function";
- return isCompatible;
- };
- EncoderBuffer.prototype.join = function join(out, offset) {
- if (!out)
- out = Buffer2.alloc(this.length);
- if (!offset)
- offset = 0;
- if (this.length === 0)
- return out;
- if (Array.isArray(this.value)) {
- this.value.forEach(function(item) {
- item.join(out, offset);
- offset += item.length;
- });
- } else {
- if (typeof this.value === "number")
- out[offset] = this.value;
- else if (typeof this.value === "string")
- out.write(this.value, offset);
- else if (Buffer2.isBuffer(this.value))
- this.value.copy(out, offset);
- offset += this.length;
- }
- return out;
- };
-});
-
-// ../eve/node_modules/minimalistic-assert/index.js
-var require_minimalistic_assert = __commonJS((exports, module) => {
- module.exports = assert;
- function assert(val, msg) {
- if (!val)
- throw new Error(msg || "Assertion failed");
- }
- assert.equal = function assertEqual(l, r, msg) {
- if (l != r)
- throw new Error(msg || "Assertion failed: " + l + " != " + r);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/node.js
-var require_node = __commonJS((exports, module) => {
- var Reporter = require_reporter().Reporter;
- var EncoderBuffer = require_buffer().EncoderBuffer;
- var DecoderBuffer = require_buffer().DecoderBuffer;
- var assert = require_minimalistic_assert();
- var tags = [
- "seq",
- "seqof",
- "set",
- "setof",
- "objid",
- "bool",
- "gentime",
- "utctime",
- "null_",
- "enum",
- "int",
- "objDesc",
- "bitstr",
- "bmpstr",
- "charstr",
- "genstr",
- "graphstr",
- "ia5str",
- "iso646str",
- "numstr",
- "octstr",
- "printstr",
- "t61str",
- "unistr",
- "utf8str",
- "videostr"
- ];
- var methods = [
- "key",
- "obj",
- "use",
- "optional",
- "explicit",
- "implicit",
- "def",
- "choice",
- "any",
- "contains"
- ].concat(tags);
- var overrided = [
- "_peekTag",
- "_decodeTag",
- "_use",
- "_decodeStr",
- "_decodeObjid",
- "_decodeTime",
- "_decodeNull",
- "_decodeInt",
- "_decodeBool",
- "_decodeList",
- "_encodeComposite",
- "_encodeStr",
- "_encodeObjid",
- "_encodeTime",
- "_encodeNull",
- "_encodeInt",
- "_encodeBool"
- ];
- function Node(enc, parent, name) {
- const state = {};
- this._baseState = state;
- state.name = name;
- state.enc = enc;
- state.parent = parent || null;
- state.children = null;
- state.tag = null;
- state.args = null;
- state.reverseArgs = null;
- state.choice = null;
- state.optional = false;
- state.any = false;
- state.obj = false;
- state.use = null;
- state.useDecoder = null;
- state.key = null;
- state["default"] = null;
- state.explicit = null;
- state.implicit = null;
- state.contains = null;
- if (!state.parent) {
- state.children = [];
- this._wrap();
- }
- }
- module.exports = Node;
- var stateProps = [
- "enc",
- "parent",
- "children",
- "tag",
- "args",
- "reverseArgs",
- "choice",
- "optional",
- "any",
- "obj",
- "use",
- "alteredUse",
- "key",
- "default",
- "explicit",
- "implicit",
- "contains"
- ];
- Node.prototype.clone = function clone() {
- const state = this._baseState;
- const cstate = {};
- stateProps.forEach(function(prop) {
- cstate[prop] = state[prop];
- });
- const res = new this.constructor(cstate.parent);
- res._baseState = cstate;
- return res;
- };
- Node.prototype._wrap = function wrap() {
- const state = this._baseState;
- methods.forEach(function(method) {
- this[method] = function _wrappedMethod() {
- const clone = new this.constructor(this);
- state.children.push(clone);
- return clone[method].apply(clone, arguments);
- };
- }, this);
- };
- Node.prototype._init = function init(body) {
- const state = this._baseState;
- assert(state.parent === null);
- body.call(this);
- state.children = state.children.filter(function(child) {
- return child._baseState.parent === this;
- }, this);
- assert.equal(state.children.length, 1, "Root node can have only one child");
- };
- Node.prototype._useArgs = function useArgs(args) {
- const state = this._baseState;
- const children = args.filter(function(arg) {
- return arg instanceof this.constructor;
- }, this);
- args = args.filter(function(arg) {
- return !(arg instanceof this.constructor);
- }, this);
- if (children.length !== 0) {
- assert(state.children === null);
- state.children = children;
- children.forEach(function(child) {
- child._baseState.parent = this;
- }, this);
- }
- if (args.length !== 0) {
- assert(state.args === null);
- state.args = args;
- state.reverseArgs = args.map(function(arg) {
- if (typeof arg !== "object" || arg.constructor !== Object)
- return arg;
- const res = {};
- Object.keys(arg).forEach(function(key) {
- if (key == (key | 0))
- key |= 0;
- const value = arg[key];
- res[value] = key;
- });
- return res;
- });
- }
- };
- overrided.forEach(function(method) {
- Node.prototype[method] = function _overrided() {
- const state = this._baseState;
- throw new Error(method + " not implemented for encoding: " + state.enc);
- };
- });
- tags.forEach(function(tag) {
- Node.prototype[tag] = function _tagMethod() {
- const state = this._baseState;
- const args = Array.prototype.slice.call(arguments);
- assert(state.tag === null);
- state.tag = tag;
- this._useArgs(args);
- return this;
- };
- });
- Node.prototype.use = function use(item) {
- assert(item);
- const state = this._baseState;
- assert(state.use === null);
- state.use = item;
- return this;
- };
- Node.prototype.optional = function optional() {
- const state = this._baseState;
- state.optional = true;
- return this;
- };
- Node.prototype.def = function def(val) {
- const state = this._baseState;
- assert(state["default"] === null);
- state["default"] = val;
- state.optional = true;
- return this;
- };
- Node.prototype.explicit = function explicit(num) {
- const state = this._baseState;
- assert(state.explicit === null && state.implicit === null);
- state.explicit = num;
- return this;
- };
- Node.prototype.implicit = function implicit(num) {
- const state = this._baseState;
- assert(state.explicit === null && state.implicit === null);
- state.implicit = num;
- return this;
- };
- Node.prototype.obj = function obj() {
- const state = this._baseState;
- const args = Array.prototype.slice.call(arguments);
- state.obj = true;
- if (args.length !== 0)
- this._useArgs(args);
- return this;
- };
- Node.prototype.key = function key(newKey) {
- const state = this._baseState;
- assert(state.key === null);
- state.key = newKey;
- return this;
- };
- Node.prototype.any = function any() {
- const state = this._baseState;
- state.any = true;
- return this;
- };
- Node.prototype.choice = function choice(obj) {
- const state = this._baseState;
- assert(state.choice === null);
- state.choice = obj;
- this._useArgs(Object.keys(obj).map(function(key) {
- return obj[key];
- }));
- return this;
- };
- Node.prototype.contains = function contains(item) {
- const state = this._baseState;
- assert(state.use === null);
- state.contains = item;
- return this;
- };
- Node.prototype._decode = function decode(input, options2) {
- const state = this._baseState;
- if (state.parent === null)
- return input.wrapResult(state.children[0]._decode(input, options2));
- let result = state["default"];
- let present = true;
- let prevKey = null;
- if (state.key !== null)
- prevKey = input.enterKey(state.key);
- if (state.optional) {
- let tag = null;
- if (state.explicit !== null)
- tag = state.explicit;
- else if (state.implicit !== null)
- tag = state.implicit;
- else if (state.tag !== null)
- tag = state.tag;
- if (tag === null && !state.any) {
- const save = input.save();
- try {
- if (state.choice === null)
- this._decodeGeneric(state.tag, input, options2);
- else
- this._decodeChoice(input, options2);
- present = true;
- } catch (e) {
- present = false;
- }
- input.restore(save);
- } else {
- present = this._peekTag(input, tag, state.any);
- if (input.isError(present))
- return present;
- }
- }
- let prevObj;
- if (state.obj && present)
- prevObj = input.enterObject();
- if (present) {
- if (state.explicit !== null) {
- const explicit = this._decodeTag(input, state.explicit);
- if (input.isError(explicit))
- return explicit;
- input = explicit;
- }
- const start = input.offset;
- if (state.use === null && state.choice === null) {
- let save;
- if (state.any)
- save = input.save();
- const body = this._decodeTag(input, state.implicit !== null ? state.implicit : state.tag, state.any);
- if (input.isError(body))
- return body;
- if (state.any)
- result = input.raw(save);
- else
- input = body;
- }
- if (options2 && options2.track && state.tag !== null)
- options2.track(input.path(), start, input.length, "tagged");
- if (options2 && options2.track && state.tag !== null)
- options2.track(input.path(), input.offset, input.length, "content");
- if (state.any) {} else if (state.choice === null) {
- result = this._decodeGeneric(state.tag, input, options2);
- } else {
- result = this._decodeChoice(input, options2);
- }
- if (input.isError(result))
- return result;
- if (!state.any && state.choice === null && state.children !== null) {
- state.children.forEach(function decodeChildren(child) {
- child._decode(input, options2);
- });
- }
- if (state.contains && (state.tag === "octstr" || state.tag === "bitstr")) {
- const data = new DecoderBuffer(result);
- result = this._getUse(state.contains, input._reporterState.obj)._decode(data, options2);
- }
- }
- if (state.obj && present)
- result = input.leaveObject(prevObj);
- if (state.key !== null && (result !== null || present === true))
- input.leaveKey(prevKey, state.key, result);
- else if (prevKey !== null)
- input.exitKey(prevKey);
- return result;
- };
- Node.prototype._decodeGeneric = function decodeGeneric(tag, input, options2) {
- const state = this._baseState;
- if (tag === "seq" || tag === "set")
- return null;
- if (tag === "seqof" || tag === "setof")
- return this._decodeList(input, tag, state.args[0], options2);
- else if (/str$/.test(tag))
- return this._decodeStr(input, tag, options2);
- else if (tag === "objid" && state.args)
- return this._decodeObjid(input, state.args[0], state.args[1], options2);
- else if (tag === "objid")
- return this._decodeObjid(input, null, null, options2);
- else if (tag === "gentime" || tag === "utctime")
- return this._decodeTime(input, tag, options2);
- else if (tag === "null_")
- return this._decodeNull(input, options2);
- else if (tag === "bool")
- return this._decodeBool(input, options2);
- else if (tag === "objDesc")
- return this._decodeStr(input, tag, options2);
- else if (tag === "int" || tag === "enum")
- return this._decodeInt(input, state.args && state.args[0], options2);
- if (state.use !== null) {
- return this._getUse(state.use, input._reporterState.obj)._decode(input, options2);
- } else {
- return input.error("unknown tag: " + tag);
- }
- };
- Node.prototype._getUse = function _getUse(entity, obj) {
- const state = this._baseState;
- state.useDecoder = this._use(entity, obj);
- assert(state.useDecoder._baseState.parent === null);
- state.useDecoder = state.useDecoder._baseState.children[0];
- if (state.implicit !== state.useDecoder._baseState.implicit) {
- state.useDecoder = state.useDecoder.clone();
- state.useDecoder._baseState.implicit = state.implicit;
- }
- return state.useDecoder;
- };
- Node.prototype._decodeChoice = function decodeChoice(input, options2) {
- const state = this._baseState;
- let result = null;
- let match = false;
- Object.keys(state.choice).some(function(key) {
- const save = input.save();
- const node = state.choice[key];
- try {
- const value = node._decode(input, options2);
- if (input.isError(value))
- return false;
- result = { type: key, value };
- match = true;
- } catch (e) {
- input.restore(save);
- return false;
- }
- return true;
- }, this);
- if (!match)
- return input.error("Choice not matched");
- return result;
- };
- Node.prototype._createEncoderBuffer = function createEncoderBuffer(data) {
- return new EncoderBuffer(data, this.reporter);
- };
- Node.prototype._encode = function encode(data, reporter, parent) {
- const state = this._baseState;
- if (state["default"] !== null && state["default"] === data)
- return;
- const result = this._encodeValue(data, reporter, parent);
- if (result === undefined)
- return;
- if (this._skipDefault(result, reporter, parent))
- return;
- return result;
- };
- Node.prototype._encodeValue = function encode(data, reporter, parent) {
- const state = this._baseState;
- if (state.parent === null)
- return state.children[0]._encode(data, reporter || new Reporter);
- let result = null;
- this.reporter = reporter;
- if (state.optional && data === undefined) {
- if (state["default"] !== null)
- data = state["default"];
- else
- return;
- }
- let content = null;
- let primitive = false;
- if (state.any) {
- result = this._createEncoderBuffer(data);
- } else if (state.choice) {
- result = this._encodeChoice(data, reporter);
- } else if (state.contains) {
- content = this._getUse(state.contains, parent)._encode(data, reporter);
- primitive = true;
- } else if (state.children) {
- content = state.children.map(function(child) {
- if (child._baseState.tag === "null_")
- return child._encode(null, reporter, data);
- if (child._baseState.key === null)
- return reporter.error("Child should have a key");
- const prevKey = reporter.enterKey(child._baseState.key);
- if (typeof data !== "object")
- return reporter.error("Child expected, but input is not object");
- const res = child._encode(data[child._baseState.key], reporter, data);
- reporter.leaveKey(prevKey);
- return res;
- }, this).filter(function(child) {
- return child;
- });
- content = this._createEncoderBuffer(content);
- } else {
- if (state.tag === "seqof" || state.tag === "setof") {
- if (!(state.args && state.args.length === 1))
- return reporter.error("Too many args for : " + state.tag);
- if (!Array.isArray(data))
- return reporter.error("seqof/setof, but data is not Array");
- const child = this.clone();
- child._baseState.implicit = null;
- content = this._createEncoderBuffer(data.map(function(item) {
- const state2 = this._baseState;
- return this._getUse(state2.args[0], data)._encode(item, reporter);
- }, child));
- } else if (state.use !== null) {
- result = this._getUse(state.use, parent)._encode(data, reporter);
- } else {
- content = this._encodePrimitive(state.tag, data);
- primitive = true;
- }
- }
- if (!state.any && state.choice === null) {
- const tag = state.implicit !== null ? state.implicit : state.tag;
- const cls = state.implicit === null ? "universal" : "context";
- if (tag === null) {
- if (state.use === null)
- reporter.error("Tag could be omitted only for .use()");
- } else {
- if (state.use === null)
- result = this._encodeComposite(tag, primitive, cls, content);
- }
- }
- if (state.explicit !== null)
- result = this._encodeComposite(state.explicit, false, "context", result);
- return result;
- };
- Node.prototype._encodeChoice = function encodeChoice(data, reporter) {
- const state = this._baseState;
- const node = state.choice[data.type];
- if (!node) {
- assert(false, data.type + " not found in " + JSON.stringify(Object.keys(state.choice)));
- }
- return node._encode(data.value, reporter);
- };
- Node.prototype._encodePrimitive = function encodePrimitive(tag, data) {
- const state = this._baseState;
- if (/str$/.test(tag))
- return this._encodeStr(data, tag);
- else if (tag === "objid" && state.args)
- return this._encodeObjid(data, state.reverseArgs[0], state.args[1]);
- else if (tag === "objid")
- return this._encodeObjid(data, null, null);
- else if (tag === "gentime" || tag === "utctime")
- return this._encodeTime(data, tag);
- else if (tag === "null_")
- return this._encodeNull();
- else if (tag === "int" || tag === "enum")
- return this._encodeInt(data, state.args && state.reverseArgs[0]);
- else if (tag === "bool")
- return this._encodeBool(data);
- else if (tag === "objDesc")
- return this._encodeStr(data, tag);
- else
- throw new Error("Unsupported tag: " + tag);
- };
- Node.prototype._isNumstr = function isNumstr(str) {
- return /^[0-9 ]*$/.test(str);
- };
- Node.prototype._isPrintstr = function isPrintstr(str) {
- return /^[A-Za-z0-9 '()+,-./:=?]*$/.test(str);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/constants/der.js
-var require_der = __commonJS((exports) => {
- function reverse(map) {
- const res = {};
- Object.keys(map).forEach(function(key) {
- if ((key | 0) == key)
- key = key | 0;
- const value = map[key];
- res[value] = key;
- });
- return res;
- }
- exports.tagClass = {
- 0: "universal",
- 1: "application",
- 2: "context",
- 3: "private"
- };
- exports.tagClassByName = reverse(exports.tagClass);
- exports.tag = {
- 0: "end",
- 1: "bool",
- 2: "int",
- 3: "bitstr",
- 4: "octstr",
- 5: "null_",
- 6: "objid",
- 7: "objDesc",
- 8: "external",
- 9: "real",
- 10: "enum",
- 11: "embed",
- 12: "utf8str",
- 13: "relativeOid",
- 16: "seq",
- 17: "set",
- 18: "numstr",
- 19: "printstr",
- 20: "t61str",
- 21: "videostr",
- 22: "ia5str",
- 23: "utctime",
- 24: "gentime",
- 25: "graphstr",
- 26: "iso646str",
- 27: "genstr",
- 28: "unistr",
- 29: "charstr",
- 30: "bmpstr"
- };
- exports.tagByName = reverse(exports.tag);
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/encoders/der.js
-var require_der2 = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var Buffer2 = require_safer().Buffer;
- var Node = require_node();
- var der = require_der();
- function DEREncoder(entity) {
- this.enc = "der";
- this.name = entity.name;
- this.entity = entity;
- this.tree = new DERNode;
- this.tree._init(entity.body);
- }
- module.exports = DEREncoder;
- DEREncoder.prototype.encode = function encode(data, reporter) {
- return this.tree._encode(data, reporter).join();
- };
- function DERNode(parent) {
- Node.call(this, "der", parent);
- }
- inherits(DERNode, Node);
- DERNode.prototype._encodeComposite = function encodeComposite(tag, primitive, cls, content) {
- const encodedTag = encodeTag(tag, primitive, cls, this.reporter);
- if (content.length < 128) {
- const header2 = Buffer2.alloc(2);
- header2[0] = encodedTag;
- header2[1] = content.length;
- return this._createEncoderBuffer([header2, content]);
- }
- let lenOctets = 1;
- for (let i = content.length;i >= 256; i >>= 8)
- lenOctets++;
- const header = Buffer2.alloc(1 + 1 + lenOctets);
- header[0] = encodedTag;
- header[1] = 128 | lenOctets;
- for (let i = 1 + lenOctets, j = content.length;j > 0; i--, j >>= 8)
- header[i] = j & 255;
- return this._createEncoderBuffer([header, content]);
- };
- DERNode.prototype._encodeStr = function encodeStr(str, tag) {
- if (tag === "bitstr") {
- return this._createEncoderBuffer([str.unused | 0, str.data]);
- } else if (tag === "bmpstr") {
- const buf = Buffer2.alloc(str.length * 2);
- for (let i = 0;i < str.length; i++) {
- buf.writeUInt16BE(str.charCodeAt(i), i * 2);
- }
- return this._createEncoderBuffer(buf);
- } else if (tag === "numstr") {
- if (!this._isNumstr(str)) {
- return this.reporter.error("Encoding of string type: numstr supports " + "only digits and space");
- }
- return this._createEncoderBuffer(str);
- } else if (tag === "printstr") {
- if (!this._isPrintstr(str)) {
- return this.reporter.error("Encoding of string type: printstr supports " + "only latin upper and lower case letters, " + "digits, space, apostrophe, left and rigth " + "parenthesis, plus sign, comma, hyphen, " + "dot, slash, colon, equal sign, " + "question mark");
- }
- return this._createEncoderBuffer(str);
- } else if (/str$/.test(tag)) {
- return this._createEncoderBuffer(str);
- } else if (tag === "objDesc") {
- return this._createEncoderBuffer(str);
- } else {
- return this.reporter.error("Encoding of string type: " + tag + " unsupported");
- }
- };
- DERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) {
- if (typeof id === "string") {
- if (!values)
- return this.reporter.error("string objid given, but no values map found");
- if (!values.hasOwnProperty(id))
- return this.reporter.error("objid not found in values map");
- id = values[id].split(/[\s.]+/g);
- for (let i = 0;i < id.length; i++)
- id[i] |= 0;
- } else if (Array.isArray(id)) {
- id = id.slice();
- for (let i = 0;i < id.length; i++)
- id[i] |= 0;
- }
- if (!Array.isArray(id)) {
- return this.reporter.error("objid() should be either array or string, " + "got: " + JSON.stringify(id));
- }
- if (!relative) {
- if (id[1] >= 40)
- return this.reporter.error("Second objid identifier OOB");
- id.splice(0, 2, id[0] * 40 + id[1]);
- }
- let size = 0;
- for (let i = 0;i < id.length; i++) {
- let ident = id[i];
- for (size++;ident >= 128; ident >>= 7)
- size++;
- }
- const objid = Buffer2.alloc(size);
- let offset = objid.length - 1;
- for (let i = id.length - 1;i >= 0; i--) {
- let ident = id[i];
- objid[offset--] = ident & 127;
- while ((ident >>= 7) > 0)
- objid[offset--] = 128 | ident & 127;
- }
- return this._createEncoderBuffer(objid);
- };
- function two(num) {
- if (num < 10)
- return "0" + num;
- else
- return num;
- }
- DERNode.prototype._encodeTime = function encodeTime(time, tag) {
- let str;
- const date = new Date(time);
- if (tag === "gentime") {
- str = [
- two(date.getUTCFullYear()),
- two(date.getUTCMonth() + 1),
- two(date.getUTCDate()),
- two(date.getUTCHours()),
- two(date.getUTCMinutes()),
- two(date.getUTCSeconds()),
- "Z"
- ].join("");
- } else if (tag === "utctime") {
- str = [
- two(date.getUTCFullYear() % 100),
- two(date.getUTCMonth() + 1),
- two(date.getUTCDate()),
- two(date.getUTCHours()),
- two(date.getUTCMinutes()),
- two(date.getUTCSeconds()),
- "Z"
- ].join("");
- } else {
- this.reporter.error("Encoding " + tag + " time is not supported yet");
- }
- return this._encodeStr(str, "octstr");
- };
- DERNode.prototype._encodeNull = function encodeNull() {
- return this._createEncoderBuffer("");
- };
- DERNode.prototype._encodeInt = function encodeInt(num, values) {
- if (typeof num === "string") {
- if (!values)
- return this.reporter.error("String int or enum given, but no values map");
- if (!values.hasOwnProperty(num)) {
- return this.reporter.error("Values map doesn't contain: " + JSON.stringify(num));
- }
- num = values[num];
- }
- if (typeof num !== "number" && !Buffer2.isBuffer(num)) {
- const numArray = num.toArray();
- if (!num.sign && numArray[0] & 128) {
- numArray.unshift(0);
- }
- num = Buffer2.from(numArray);
- }
- if (Buffer2.isBuffer(num)) {
- let size2 = num.length;
- if (num.length === 0)
- size2++;
- const out2 = Buffer2.alloc(size2);
- num.copy(out2);
- if (num.length === 0)
- out2[0] = 0;
- return this._createEncoderBuffer(out2);
- }
- if (num < 128)
- return this._createEncoderBuffer(num);
- if (num < 256)
- return this._createEncoderBuffer([0, num]);
- let size = 1;
- for (let i = num;i >= 256; i >>= 8)
- size++;
- const out = new Array(size);
- for (let i = out.length - 1;i >= 0; i--) {
- out[i] = num & 255;
- num >>= 8;
- }
- if (out[0] & 128) {
- out.unshift(0);
- }
- return this._createEncoderBuffer(Buffer2.from(out));
- };
- DERNode.prototype._encodeBool = function encodeBool(value) {
- return this._createEncoderBuffer(value ? 255 : 0);
- };
- DERNode.prototype._use = function use(entity, obj) {
- if (typeof entity === "function")
- entity = entity(obj);
- return entity._getEncoder("der").tree;
- };
- DERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) {
- const state = this._baseState;
- let i;
- if (state["default"] === null)
- return false;
- const data = dataBuffer.join();
- if (state.defaultBuffer === undefined)
- state.defaultBuffer = this._encodeValue(state["default"], reporter, parent).join();
- if (data.length !== state.defaultBuffer.length)
- return false;
- for (i = 0;i < data.length; i++)
- if (data[i] !== state.defaultBuffer[i])
- return false;
- return true;
- };
- function encodeTag(tag, primitive, cls, reporter) {
- let res;
- if (tag === "seqof")
- tag = "seq";
- else if (tag === "setof")
- tag = "set";
- if (der.tagByName.hasOwnProperty(tag))
- res = der.tagByName[tag];
- else if (typeof tag === "number" && (tag | 0) === tag)
- res = tag;
- else
- return reporter.error("Unknown tag: " + tag);
- if (res >= 31)
- return reporter.error("Multi-octet tag encoding unsupported");
- if (!primitive)
- res |= 32;
- res |= der.tagClassByName[cls || "universal"] << 6;
- return res;
- }
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/encoders/pem.js
-var require_pem = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var DEREncoder = require_der2();
- function PEMEncoder(entity) {
- DEREncoder.call(this, entity);
- this.enc = "pem";
- }
- inherits(PEMEncoder, DEREncoder);
- module.exports = PEMEncoder;
- PEMEncoder.prototype.encode = function encode(data, options2) {
- const buf = DEREncoder.prototype.encode.call(this, data);
- const p = buf.toString("base64");
- const out = ["-----BEGIN " + options2.label + "-----"];
- for (let i = 0;i < p.length; i += 64)
- out.push(p.slice(i, i + 64));
- out.push("-----END " + options2.label + "-----");
- return out.join(`
-`);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/encoders/index.js
-var require_encoders = __commonJS((exports) => {
- var encoders = exports;
- encoders.der = require_der2();
- encoders.pem = require_pem();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/decoders/der.js
-var require_der3 = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var bignum = require_bn();
- var DecoderBuffer = require_buffer().DecoderBuffer;
- var Node = require_node();
- var der = require_der();
- function DERDecoder(entity) {
- this.enc = "der";
- this.name = entity.name;
- this.entity = entity;
- this.tree = new DERNode;
- this.tree._init(entity.body);
- }
- module.exports = DERDecoder;
- DERDecoder.prototype.decode = function decode(data, options2) {
- if (!DecoderBuffer.isDecoderBuffer(data)) {
- data = new DecoderBuffer(data, options2);
- }
- return this.tree._decode(data, options2);
- };
- function DERNode(parent) {
- Node.call(this, "der", parent);
- }
- inherits(DERNode, Node);
- DERNode.prototype._peekTag = function peekTag(buffer, tag, any) {
- if (buffer.isEmpty())
- return false;
- const state = buffer.save();
- const decodedTag = derDecodeTag(buffer, 'Failed to peek tag: "' + tag + '"');
- if (buffer.isError(decodedTag))
- return decodedTag;
- buffer.restore(state);
- return decodedTag.tag === tag || decodedTag.tagStr === tag || decodedTag.tagStr + "of" === tag || any;
- };
- DERNode.prototype._decodeTag = function decodeTag(buffer, tag, any) {
- const decodedTag = derDecodeTag(buffer, 'Failed to decode tag of "' + tag + '"');
- if (buffer.isError(decodedTag))
- return decodedTag;
- let len = derDecodeLen(buffer, decodedTag.primitive, 'Failed to get length of "' + tag + '"');
- if (buffer.isError(len))
- return len;
- if (!any && decodedTag.tag !== tag && decodedTag.tagStr !== tag && decodedTag.tagStr + "of" !== tag) {
- return buffer.error('Failed to match tag: "' + tag + '"');
- }
- if (decodedTag.primitive || len !== null)
- return buffer.skip(len, 'Failed to match body of: "' + tag + '"');
- const state = buffer.save();
- const res = this._skipUntilEnd(buffer, 'Failed to skip indefinite length body: "' + this.tag + '"');
- if (buffer.isError(res))
- return res;
- len = buffer.offset - state.offset;
- buffer.restore(state);
- return buffer.skip(len, 'Failed to match body of: "' + tag + '"');
- };
- DERNode.prototype._skipUntilEnd = function skipUntilEnd(buffer, fail) {
- for (;; ) {
- const tag = derDecodeTag(buffer, fail);
- if (buffer.isError(tag))
- return tag;
- const len = derDecodeLen(buffer, tag.primitive, fail);
- if (buffer.isError(len))
- return len;
- let res;
- if (tag.primitive || len !== null)
- res = buffer.skip(len);
- else
- res = this._skipUntilEnd(buffer, fail);
- if (buffer.isError(res))
- return res;
- if (tag.tagStr === "end")
- break;
- }
- };
- DERNode.prototype._decodeList = function decodeList(buffer, tag, decoder, options2) {
- const result = [];
- while (!buffer.isEmpty()) {
- const possibleEnd = this._peekTag(buffer, "end");
- if (buffer.isError(possibleEnd))
- return possibleEnd;
- const res = decoder.decode(buffer, "der", options2);
- if (buffer.isError(res) && possibleEnd)
- break;
- result.push(res);
- }
- return result;
- };
- DERNode.prototype._decodeStr = function decodeStr(buffer, tag) {
- if (tag === "bitstr") {
- const unused = buffer.readUInt8();
- if (buffer.isError(unused))
- return unused;
- return { unused, data: buffer.raw() };
- } else if (tag === "bmpstr") {
- const raw = buffer.raw();
- if (raw.length % 2 === 1)
- return buffer.error("Decoding of string type: bmpstr length mismatch");
- let str = "";
- for (let i = 0;i < raw.length / 2; i++) {
- str += String.fromCharCode(raw.readUInt16BE(i * 2));
- }
- return str;
- } else if (tag === "numstr") {
- const numstr = buffer.raw().toString("ascii");
- if (!this._isNumstr(numstr)) {
- return buffer.error("Decoding of string type: " + "numstr unsupported characters");
- }
- return numstr;
- } else if (tag === "octstr") {
- return buffer.raw();
- } else if (tag === "objDesc") {
- return buffer.raw();
- } else if (tag === "printstr") {
- const printstr = buffer.raw().toString("ascii");
- if (!this._isPrintstr(printstr)) {
- return buffer.error("Decoding of string type: " + "printstr unsupported characters");
- }
- return printstr;
- } else if (/str$/.test(tag)) {
- return buffer.raw().toString();
- } else {
- return buffer.error("Decoding of string type: " + tag + " unsupported");
- }
- };
- DERNode.prototype._decodeObjid = function decodeObjid(buffer, values, relative) {
- let result;
- const identifiers = [];
- let ident = 0;
- let subident = 0;
- while (!buffer.isEmpty()) {
- subident = buffer.readUInt8();
- ident <<= 7;
- ident |= subident & 127;
- if ((subident & 128) === 0) {
- identifiers.push(ident);
- ident = 0;
- }
- }
- if (subident & 128)
- identifiers.push(ident);
- const first = identifiers[0] / 40 | 0;
- const second = identifiers[0] % 40;
- if (relative)
- result = identifiers;
- else
- result = [first, second].concat(identifiers.slice(1));
- if (values) {
- let tmp = values[result.join(" ")];
- if (tmp === undefined)
- tmp = values[result.join(".")];
- if (tmp !== undefined)
- result = tmp;
- }
- return result;
- };
- DERNode.prototype._decodeTime = function decodeTime(buffer, tag) {
- const str = buffer.raw().toString();
- let year;
- let mon;
- let day;
- let hour;
- let min;
- let sec;
- if (tag === "gentime") {
- year = str.slice(0, 4) | 0;
- mon = str.slice(4, 6) | 0;
- day = str.slice(6, 8) | 0;
- hour = str.slice(8, 10) | 0;
- min = str.slice(10, 12) | 0;
- sec = str.slice(12, 14) | 0;
- } else if (tag === "utctime") {
- year = str.slice(0, 2) | 0;
- mon = str.slice(2, 4) | 0;
- day = str.slice(4, 6) | 0;
- hour = str.slice(6, 8) | 0;
- min = str.slice(8, 10) | 0;
- sec = str.slice(10, 12) | 0;
- if (year < 70)
- year = 2000 + year;
- else
- year = 1900 + year;
- } else {
- return buffer.error("Decoding " + tag + " time is not supported yet");
- }
- return Date.UTC(year, mon - 1, day, hour, min, sec, 0);
- };
- DERNode.prototype._decodeNull = function decodeNull() {
- return null;
- };
- DERNode.prototype._decodeBool = function decodeBool(buffer) {
- const res = buffer.readUInt8();
- if (buffer.isError(res))
- return res;
- else
- return res !== 0;
- };
- DERNode.prototype._decodeInt = function decodeInt(buffer, values) {
- const raw = buffer.raw();
- let res = new bignum(raw);
- if (values)
- res = values[res.toString(10)] || res;
- return res;
- };
- DERNode.prototype._use = function use(entity, obj) {
- if (typeof entity === "function")
- entity = entity(obj);
- return entity._getDecoder("der").tree;
- };
- function derDecodeTag(buf, fail) {
- let tag = buf.readUInt8(fail);
- if (buf.isError(tag))
- return tag;
- const cls = der.tagClass[tag >> 6];
- const primitive = (tag & 32) === 0;
- if ((tag & 31) === 31) {
- let oct = tag;
- tag = 0;
- while ((oct & 128) === 128) {
- oct = buf.readUInt8(fail);
- if (buf.isError(oct))
- return oct;
- tag <<= 7;
- tag |= oct & 127;
- }
- } else {
- tag &= 31;
- }
- const tagStr = der.tag[tag];
- return {
- cls,
- primitive,
- tag,
- tagStr
- };
- }
- function derDecodeLen(buf, primitive, fail) {
- let len = buf.readUInt8(fail);
- if (buf.isError(len))
- return len;
- if (!primitive && len === 128)
- return null;
- if ((len & 128) === 0) {
- return len;
- }
- const num = len & 127;
- if (num > 4)
- return buf.error("length octect is too long");
- len = 0;
- for (let i = 0;i < num; i++) {
- len <<= 8;
- const j = buf.readUInt8(fail);
- if (buf.isError(j))
- return j;
- len |= j;
- }
- return len;
- }
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/decoders/pem.js
-var require_pem2 = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var Buffer2 = require_safer().Buffer;
- var DERDecoder = require_der3();
- function PEMDecoder(entity) {
- DERDecoder.call(this, entity);
- this.enc = "pem";
- }
- inherits(PEMDecoder, DERDecoder);
- module.exports = PEMDecoder;
- PEMDecoder.prototype.decode = function decode(data, options2) {
- const lines = data.toString().split(/[\r\n]+/g);
- const label = options2.label.toUpperCase();
- const re = /^-----(BEGIN|END) ([^-]+)-----$/;
- let start = -1;
- let end = -1;
- for (let i = 0;i < lines.length; i++) {
- const match = lines[i].match(re);
- if (match === null)
- continue;
- if (match[2] !== label)
- continue;
- if (start === -1) {
- if (match[1] !== "BEGIN")
- break;
- start = i;
- } else {
- if (match[1] !== "END")
- break;
- end = i;
- break;
- }
- }
- if (start === -1 || end === -1)
- throw new Error("PEM section not found for: " + label);
- const base64 = lines.slice(start + 1, end).join("");
- base64.replace(/[^a-z0-9+/=]+/gi, "");
- const input = Buffer2.from(base64, "base64");
- return DERDecoder.prototype.decode.call(this, input, options2);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/decoders/index.js
-var require_decoders = __commonJS((exports) => {
- var decoders = exports;
- decoders.der = require_der3();
- decoders.pem = require_pem2();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/api.js
-var require_api = __commonJS((exports) => {
- var encoders = require_encoders();
- var decoders = require_decoders();
- var inherits = require_inherits();
- var api = exports;
- api.define = function define(name, body) {
- return new Entity(name, body);
- };
- function Entity(name, body) {
- this.name = name;
- this.body = body;
- this.decoders = {};
- this.encoders = {};
- }
- Entity.prototype._createNamed = function createNamed(Base) {
- const name = this.name;
- function Generated(entity) {
- this._initNamed(entity, name);
- }
- inherits(Generated, Base);
- Generated.prototype._initNamed = function _initNamed(entity, name2) {
- Base.call(this, entity, name2);
- };
- return new Generated(this);
- };
- Entity.prototype._getDecoder = function _getDecoder(enc) {
- enc = enc || "der";
- if (!this.decoders.hasOwnProperty(enc))
- this.decoders[enc] = this._createNamed(decoders[enc]);
- return this.decoders[enc];
- };
- Entity.prototype.decode = function decode(data, enc, options2) {
- return this._getDecoder(enc).decode(data, options2);
- };
- Entity.prototype._getEncoder = function _getEncoder(enc) {
- enc = enc || "der";
- if (!this.encoders.hasOwnProperty(enc))
- this.encoders[enc] = this._createNamed(encoders[enc]);
- return this.encoders[enc];
- };
- Entity.prototype.encode = function encode(data, enc, reporter) {
- return this._getEncoder(enc).encode(data, reporter);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/index.js
-var require_base = __commonJS((exports) => {
- var base = exports;
- base.Reporter = require_reporter().Reporter;
- base.DecoderBuffer = require_buffer().DecoderBuffer;
- base.EncoderBuffer = require_buffer().EncoderBuffer;
- base.Node = require_node();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/constants/index.js
-var require_constants2 = __commonJS((exports) => {
- var constants = exports;
- constants._reverse = function reverse(map) {
- const res = {};
- Object.keys(map).forEach(function(key) {
- if ((key | 0) == key)
- key = key | 0;
- const value = map[key];
- res[value] = key;
- });
- return res;
- };
- constants.der = require_der();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1.js
-var require_asn1 = __commonJS((exports) => {
- var asn1 = exports;
- asn1.bignum = require_bn();
- asn1.define = require_api().define;
- asn1.base = require_base();
- asn1.constants = require_constants2();
- asn1.decoders = require_decoders();
- asn1.encoders = require_encoders();
-});
-
-// ../eve/node_modules/elliptic/package.json
-var require_package = __commonJS((exports, module) => {
- module.exports = {
- name: "elliptic",
- version: "6.6.1",
- description: "EC cryptography",
- main: "lib/elliptic.js",
- files: [
- "lib"
- ],
- scripts: {
- lint: "eslint lib test",
- "lint:fix": "npm run lint -- --fix",
- unit: "istanbul test _mocha --reporter=spec test/index.js",
- test: "npm run lint && npm run unit",
- version: "grunt dist && git add dist/"
- },
- repository: {
- type: "git",
- url: "git@github.com:indutny/elliptic"
- },
- keywords: [
- "EC",
- "Elliptic",
- "curve",
- "Cryptography"
- ],
- author: "Fedor Indutny ",
- license: "MIT",
- bugs: {
- url: "https://github.com/indutny/elliptic/issues"
- },
- homepage: "https://github.com/indutny/elliptic",
- devDependencies: {
- brfs: "^2.0.2",
- coveralls: "^3.1.0",
- eslint: "^7.6.0",
- grunt: "^1.2.1",
- "grunt-browserify": "^5.3.0",
- "grunt-cli": "^1.3.2",
- "grunt-contrib-connect": "^3.0.0",
- "grunt-contrib-copy": "^1.0.0",
- "grunt-contrib-uglify": "^5.0.0",
- "grunt-mocha-istanbul": "^5.0.2",
- "grunt-saucelabs": "^9.0.1",
- istanbul: "^0.4.5",
- mocha: "^8.0.1"
- },
- dependencies: {
- "bn.js": "^4.11.9",
- brorand: "^1.1.0",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.1",
- inherits: "^2.0.4",
- "minimalistic-assert": "^1.0.1",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- };
-});
-
-// ../eve/node_modules/minimalistic-crypto-utils/lib/utils.js
-var require_utils = __commonJS((exports) => {
- var utils = exports;
- function toArray(msg, enc) {
- if (Array.isArray(msg))
- return msg.slice();
- if (!msg)
- return [];
- var res = [];
- if (typeof msg !== "string") {
- for (var i = 0;i < msg.length; i++)
- res[i] = msg[i] | 0;
- return res;
- }
- if (enc === "hex") {
- msg = msg.replace(/[^a-z0-9]+/ig, "");
- if (msg.length % 2 !== 0)
- msg = "0" + msg;
- for (var i = 0;i < msg.length; i += 2)
- res.push(parseInt(msg[i] + msg[i + 1], 16));
- } else {
- for (var i = 0;i < msg.length; i++) {
- var c = msg.charCodeAt(i);
- var hi = c >> 8;
- var lo = c & 255;
- if (hi)
- res.push(hi, lo);
- else
- res.push(lo);
- }
- }
- return res;
- }
- utils.toArray = toArray;
- function zero2(word) {
- if (word.length === 1)
- return "0" + word;
- else
- return word;
- }
- utils.zero2 = zero2;
- function toHex(msg) {
- var res = "";
- for (var i = 0;i < msg.length; i++)
- res += zero2(msg[i].toString(16));
- return res;
- }
- utils.toHex = toHex;
- utils.encode = function encode(arr, enc) {
- if (enc === "hex")
- return toHex(arr);
- else
- return arr;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/utils.js
-var require_utils2 = __commonJS((exports) => {
- var utils = exports;
- var BN = require_bn();
- var minAssert = require_minimalistic_assert();
- var minUtils = require_utils();
- utils.assert = minAssert;
- utils.toArray = minUtils.toArray;
- utils.zero2 = minUtils.zero2;
- utils.toHex = minUtils.toHex;
- utils.encode = minUtils.encode;
- function getNAF(num, w, bits) {
- var naf = new Array(Math.max(num.bitLength(), bits) + 1);
- var i;
- for (i = 0;i < naf.length; i += 1) {
- naf[i] = 0;
- }
- var ws = 1 << w + 1;
- var k = num.clone();
- for (i = 0;i < naf.length; i++) {
- var z;
- var mod = k.andln(ws - 1);
- if (k.isOdd()) {
- if (mod > (ws >> 1) - 1)
- z = (ws >> 1) - mod;
- else
- z = mod;
- k.isubn(z);
- } else {
- z = 0;
- }
- naf[i] = z;
- k.iushrn(1);
- }
- return naf;
- }
- utils.getNAF = getNAF;
- function getJSF(k1, k2) {
- var jsf = [
- [],
- []
- ];
- k1 = k1.clone();
- k2 = k2.clone();
- var d1 = 0;
- var d2 = 0;
- var m8;
- while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {
- var m14 = k1.andln(3) + d1 & 3;
- var m24 = k2.andln(3) + d2 & 3;
- if (m14 === 3)
- m14 = -1;
- if (m24 === 3)
- m24 = -1;
- var u1;
- if ((m14 & 1) === 0) {
- u1 = 0;
- } else {
- m8 = k1.andln(7) + d1 & 7;
- if ((m8 === 3 || m8 === 5) && m24 === 2)
- u1 = -m14;
- else
- u1 = m14;
- }
- jsf[0].push(u1);
- var u2;
- if ((m24 & 1) === 0) {
- u2 = 0;
- } else {
- m8 = k2.andln(7) + d2 & 7;
- if ((m8 === 3 || m8 === 5) && m14 === 2)
- u2 = -m24;
- else
- u2 = m24;
- }
- jsf[1].push(u2);
- if (2 * d1 === u1 + 1)
- d1 = 1 - d1;
- if (2 * d2 === u2 + 1)
- d2 = 1 - d2;
- k1.iushrn(1);
- k2.iushrn(1);
- }
- return jsf;
- }
- utils.getJSF = getJSF;
- function cachedProperty(obj, name, computer) {
- var key = "_" + name;
- obj.prototype[name] = function cachedProperty() {
- return this[key] !== undefined ? this[key] : this[key] = computer.call(this);
- };
- }
- utils.cachedProperty = cachedProperty;
- function parseBytes(bytes) {
- return typeof bytes === "string" ? utils.toArray(bytes, "hex") : bytes;
- }
- utils.parseBytes = parseBytes;
- function intFromLE(bytes) {
- return new BN(bytes, "hex", "le");
- }
- utils.intFromLE = intFromLE;
-});
-
-// ../eve/node_modules/brorand/index.js
-var require_brorand = __commonJS((exports, module) => {
- var r;
- module.exports = function rand(len) {
- if (!r)
- r = new Rand(null);
- return r.generate(len);
- };
- function Rand(rand) {
- this.rand = rand;
- }
- module.exports.Rand = Rand;
- Rand.prototype.generate = function generate(len) {
- return this._rand(len);
- };
- Rand.prototype._rand = function _rand(n) {
- if (this.rand.getBytes)
- return this.rand.getBytes(n);
- var res = new Uint8Array(n);
- for (var i = 0;i < res.length; i++)
- res[i] = this.rand.getByte();
- return res;
- };
- if (typeof self === "object") {
- if (self.crypto && self.crypto.getRandomValues) {
- Rand.prototype._rand = function _rand(n) {
- var arr = new Uint8Array(n);
- self.crypto.getRandomValues(arr);
- return arr;
- };
- } else if (self.msCrypto && self.msCrypto.getRandomValues) {
- Rand.prototype._rand = function _rand(n) {
- var arr = new Uint8Array(n);
- self.msCrypto.getRandomValues(arr);
- return arr;
- };
- } else if (typeof window === "object") {
- Rand.prototype._rand = function() {
- throw new Error("Not implemented yet");
- };
- }
- } else {
- try {
- crypto2 = __require("crypto");
- if (typeof crypto2.randomBytes !== "function")
- throw new Error("Not supported");
- Rand.prototype._rand = function _rand(n) {
- return crypto2.randomBytes(n);
- };
- } catch (e) {}
- }
- var crypto2;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/base.js
-var require_base2 = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var getNAF = utils.getNAF;
- var getJSF = utils.getJSF;
- var assert = utils.assert;
- function BaseCurve(type, conf) {
- this.type = type;
- this.p = new BN(conf.p, 16);
- this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p);
- this.zero = new BN(0).toRed(this.red);
- this.one = new BN(1).toRed(this.red);
- this.two = new BN(2).toRed(this.red);
- this.n = conf.n && new BN(conf.n, 16);
- this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed);
- this._wnafT1 = new Array(4);
- this._wnafT2 = new Array(4);
- this._wnafT3 = new Array(4);
- this._wnafT4 = new Array(4);
- this._bitLength = this.n ? this.n.bitLength() : 0;
- var adjustCount = this.n && this.p.div(this.n);
- if (!adjustCount || adjustCount.cmpn(100) > 0) {
- this.redN = null;
- } else {
- this._maxwellTrick = true;
- this.redN = this.n.toRed(this.red);
- }
- }
- module.exports = BaseCurve;
- BaseCurve.prototype.point = function point() {
- throw new Error("Not implemented");
- };
- BaseCurve.prototype.validate = function validate() {
- throw new Error("Not implemented");
- };
- BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) {
- assert(p.precomputed);
- var doubles = p._getDoubles();
- var naf = getNAF(k, 1, this._bitLength);
- var I = (1 << doubles.step + 1) - (doubles.step % 2 === 0 ? 2 : 1);
- I /= 3;
- var repr = [];
- var j;
- var nafW;
- for (j = 0;j < naf.length; j += doubles.step) {
- nafW = 0;
- for (var l = j + doubles.step - 1;l >= j; l--)
- nafW = (nafW << 1) + naf[l];
- repr.push(nafW);
- }
- var a = this.jpoint(null, null, null);
- var b = this.jpoint(null, null, null);
- for (var i = I;i > 0; i--) {
- for (j = 0;j < repr.length; j++) {
- nafW = repr[j];
- if (nafW === i)
- b = b.mixedAdd(doubles.points[j]);
- else if (nafW === -i)
- b = b.mixedAdd(doubles.points[j].neg());
- }
- a = a.add(b);
- }
- return a.toP();
- };
- BaseCurve.prototype._wnafMul = function _wnafMul(p, k) {
- var w = 4;
- var nafPoints = p._getNAFPoints(w);
- w = nafPoints.wnd;
- var wnd = nafPoints.points;
- var naf = getNAF(k, w, this._bitLength);
- var acc = this.jpoint(null, null, null);
- for (var i = naf.length - 1;i >= 0; i--) {
- for (var l = 0;i >= 0 && naf[i] === 0; i--)
- l++;
- if (i >= 0)
- l++;
- acc = acc.dblp(l);
- if (i < 0)
- break;
- var z = naf[i];
- assert(z !== 0);
- if (p.type === "affine") {
- if (z > 0)
- acc = acc.mixedAdd(wnd[z - 1 >> 1]);
- else
- acc = acc.mixedAdd(wnd[-z - 1 >> 1].neg());
- } else {
- if (z > 0)
- acc = acc.add(wnd[z - 1 >> 1]);
- else
- acc = acc.add(wnd[-z - 1 >> 1].neg());
- }
- }
- return p.type === "affine" ? acc.toP() : acc;
- };
- BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, points, coeffs, len, jacobianResult) {
- var wndWidth = this._wnafT1;
- var wnd = this._wnafT2;
- var naf = this._wnafT3;
- var max = 0;
- var i;
- var j;
- var p;
- for (i = 0;i < len; i++) {
- p = points[i];
- var nafPoints = p._getNAFPoints(defW);
- wndWidth[i] = nafPoints.wnd;
- wnd[i] = nafPoints.points;
- }
- for (i = len - 1;i >= 1; i -= 2) {
- var a = i - 1;
- var b = i;
- if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {
- naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength);
- naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength);
- max = Math.max(naf[a].length, max);
- max = Math.max(naf[b].length, max);
- continue;
- }
- var comb = [
- points[a],
- null,
- null,
- points[b]
- ];
- if (points[a].y.cmp(points[b].y) === 0) {
- comb[1] = points[a].add(points[b]);
- comb[2] = points[a].toJ().mixedAdd(points[b].neg());
- } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) {
- comb[1] = points[a].toJ().mixedAdd(points[b]);
- comb[2] = points[a].add(points[b].neg());
- } else {
- comb[1] = points[a].toJ().mixedAdd(points[b]);
- comb[2] = points[a].toJ().mixedAdd(points[b].neg());
- }
- var index2 = [
- -3,
- -1,
- -5,
- -7,
- 0,
- 7,
- 5,
- 1,
- 3
- ];
- var jsf = getJSF(coeffs[a], coeffs[b]);
- max = Math.max(jsf[0].length, max);
- naf[a] = new Array(max);
- naf[b] = new Array(max);
- for (j = 0;j < max; j++) {
- var ja = jsf[0][j] | 0;
- var jb = jsf[1][j] | 0;
- naf[a][j] = index2[(ja + 1) * 3 + (jb + 1)];
- naf[b][j] = 0;
- wnd[a] = comb;
- }
- }
- var acc = this.jpoint(null, null, null);
- var tmp = this._wnafT4;
- for (i = max;i >= 0; i--) {
- var k = 0;
- while (i >= 0) {
- var zero = true;
- for (j = 0;j < len; j++) {
- tmp[j] = naf[j][i] | 0;
- if (tmp[j] !== 0)
- zero = false;
- }
- if (!zero)
- break;
- k++;
- i--;
- }
- if (i >= 0)
- k++;
- acc = acc.dblp(k);
- if (i < 0)
- break;
- for (j = 0;j < len; j++) {
- var z = tmp[j];
- if (z === 0)
- continue;
- else if (z > 0)
- p = wnd[j][z - 1 >> 1];
- else if (z < 0)
- p = wnd[j][-z - 1 >> 1].neg();
- if (p.type === "affine")
- acc = acc.mixedAdd(p);
- else
- acc = acc.add(p);
- }
- }
- for (i = 0;i < len; i++)
- wnd[i] = null;
- if (jacobianResult)
- return acc;
- else
- return acc.toP();
- };
- function BasePoint(curve, type) {
- this.curve = curve;
- this.type = type;
- this.precomputed = null;
- }
- BaseCurve.BasePoint = BasePoint;
- BasePoint.prototype.eq = function eq() {
- throw new Error("Not implemented");
- };
- BasePoint.prototype.validate = function validate() {
- return this.curve.validate(this);
- };
- BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
- bytes = utils.toArray(bytes, enc);
- var len = this.p.byteLength();
- if ((bytes[0] === 4 || bytes[0] === 6 || bytes[0] === 7) && bytes.length - 1 === 2 * len) {
- if (bytes[0] === 6)
- assert(bytes[bytes.length - 1] % 2 === 0);
- else if (bytes[0] === 7)
- assert(bytes[bytes.length - 1] % 2 === 1);
- var res = this.point(bytes.slice(1, 1 + len), bytes.slice(1 + len, 1 + 2 * len));
- return res;
- } else if ((bytes[0] === 2 || bytes[0] === 3) && bytes.length - 1 === len) {
- return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 3);
- }
- throw new Error("Unknown point format");
- };
- BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) {
- return this.encode(enc, true);
- };
- BasePoint.prototype._encode = function _encode(compact) {
- var len = this.curve.p.byteLength();
- var x = this.getX().toArray("be", len);
- if (compact)
- return [this.getY().isEven() ? 2 : 3].concat(x);
- return [4].concat(x, this.getY().toArray("be", len));
- };
- BasePoint.prototype.encode = function encode(enc, compact) {
- return utils.encode(this._encode(compact), enc);
- };
- BasePoint.prototype.precompute = function precompute(power) {
- if (this.precomputed)
- return this;
- var precomputed = {
- doubles: null,
- naf: null,
- beta: null
- };
- precomputed.naf = this._getNAFPoints(8);
- precomputed.doubles = this._getDoubles(4, power);
- precomputed.beta = this._getBeta();
- this.precomputed = precomputed;
- return this;
- };
- BasePoint.prototype._hasDoubles = function _hasDoubles(k) {
- if (!this.precomputed)
- return false;
- var doubles = this.precomputed.doubles;
- if (!doubles)
- return false;
- return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step);
- };
- BasePoint.prototype._getDoubles = function _getDoubles(step, power) {
- if (this.precomputed && this.precomputed.doubles)
- return this.precomputed.doubles;
- var doubles = [this];
- var acc = this;
- for (var i = 0;i < power; i += step) {
- for (var j = 0;j < step; j++)
- acc = acc.dbl();
- doubles.push(acc);
- }
- return {
- step,
- points: doubles
- };
- };
- BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) {
- if (this.precomputed && this.precomputed.naf)
- return this.precomputed.naf;
- var res = [this];
- var max = (1 << wnd) - 1;
- var dbl = max === 1 ? null : this.dbl();
- for (var i = 1;i < max; i++)
- res[i] = res[i - 1].add(dbl);
- return {
- wnd,
- points: res
- };
- };
- BasePoint.prototype._getBeta = function _getBeta() {
- return null;
- };
- BasePoint.prototype.dblp = function dblp(k) {
- var r = this;
- for (var i = 0;i < k; i++)
- r = r.dbl();
- return r;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/short.js
-var require_short = __commonJS((exports, module) => {
- var utils = require_utils2();
- var BN = require_bn();
- var inherits = require_inherits();
- var Base = require_base2();
- var assert = utils.assert;
- function ShortCurve(conf) {
- Base.call(this, "short", conf);
- this.a = new BN(conf.a, 16).toRed(this.red);
- this.b = new BN(conf.b, 16).toRed(this.red);
- this.tinv = this.two.redInvm();
- this.zeroA = this.a.fromRed().cmpn(0) === 0;
- this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0;
- this.endo = this._getEndomorphism(conf);
- this._endoWnafT1 = new Array(4);
- this._endoWnafT2 = new Array(4);
- }
- inherits(ShortCurve, Base);
- module.exports = ShortCurve;
- ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) {
- if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1)
- return;
- var beta;
- var lambda;
- if (conf.beta) {
- beta = new BN(conf.beta, 16).toRed(this.red);
- } else {
- var betas = this._getEndoRoots(this.p);
- beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1];
- beta = beta.toRed(this.red);
- }
- if (conf.lambda) {
- lambda = new BN(conf.lambda, 16);
- } else {
- var lambdas = this._getEndoRoots(this.n);
- if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) {
- lambda = lambdas[0];
- } else {
- lambda = lambdas[1];
- assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0);
- }
- }
- var basis;
- if (conf.basis) {
- basis = conf.basis.map(function(vec) {
- return {
- a: new BN(vec.a, 16),
- b: new BN(vec.b, 16)
- };
- });
- } else {
- basis = this._getEndoBasis(lambda);
- }
- return {
- beta,
- lambda,
- basis
- };
- };
- ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) {
- var red = num === this.p ? this.red : BN.mont(num);
- var tinv = new BN(2).toRed(red).redInvm();
- var ntinv = tinv.redNeg();
- var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv);
- var l1 = ntinv.redAdd(s).fromRed();
- var l2 = ntinv.redSub(s).fromRed();
- return [l1, l2];
- };
- ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) {
- var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2));
- var u = lambda;
- var v = this.n.clone();
- var x1 = new BN(1);
- var y1 = new BN(0);
- var x2 = new BN(0);
- var y2 = new BN(1);
- var a0;
- var b0;
- var a1;
- var b1;
- var a2;
- var b2;
- var prevR;
- var i = 0;
- var r;
- var x;
- while (u.cmpn(0) !== 0) {
- var q = v.div(u);
- r = v.sub(q.mul(u));
- x = x2.sub(q.mul(x1));
- var y = y2.sub(q.mul(y1));
- if (!a1 && r.cmp(aprxSqrt) < 0) {
- a0 = prevR.neg();
- b0 = x1;
- a1 = r.neg();
- b1 = x;
- } else if (a1 && ++i === 2) {
- break;
- }
- prevR = r;
- v = u;
- u = r;
- x2 = x1;
- x1 = x;
- y2 = y1;
- y1 = y;
- }
- a2 = r.neg();
- b2 = x;
- var len1 = a1.sqr().add(b1.sqr());
- var len2 = a2.sqr().add(b2.sqr());
- if (len2.cmp(len1) >= 0) {
- a2 = a0;
- b2 = b0;
- }
- if (a1.negative) {
- a1 = a1.neg();
- b1 = b1.neg();
- }
- if (a2.negative) {
- a2 = a2.neg();
- b2 = b2.neg();
- }
- return [
- { a: a1, b: b1 },
- { a: a2, b: b2 }
- ];
- };
- ShortCurve.prototype._endoSplit = function _endoSplit(k) {
- var basis = this.endo.basis;
- var v1 = basis[0];
- var v2 = basis[1];
- var c1 = v2.b.mul(k).divRound(this.n);
- var c2 = v1.b.neg().mul(k).divRound(this.n);
- var p1 = c1.mul(v1.a);
- var p2 = c2.mul(v2.a);
- var q1 = c1.mul(v1.b);
- var q2 = c2.mul(v2.b);
- var k1 = k.sub(p1).sub(p2);
- var k2 = q1.add(q2).neg();
- return { k1, k2 };
- };
- ShortCurve.prototype.pointFromX = function pointFromX(x, odd) {
- x = new BN(x, 16);
- if (!x.red)
- x = x.toRed(this.red);
- var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b);
- var y = y2.redSqrt();
- if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
- throw new Error("invalid point");
- var isOdd = y.fromRed().isOdd();
- if (odd && !isOdd || !odd && isOdd)
- y = y.redNeg();
- return this.point(x, y);
- };
- ShortCurve.prototype.validate = function validate(point) {
- if (point.inf)
- return true;
- var x = point.x;
- var y = point.y;
- var ax = this.a.redMul(x);
- var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b);
- return y.redSqr().redISub(rhs).cmpn(0) === 0;
- };
- ShortCurve.prototype._endoWnafMulAdd = function _endoWnafMulAdd(points, coeffs, jacobianResult) {
- var npoints = this._endoWnafT1;
- var ncoeffs = this._endoWnafT2;
- for (var i = 0;i < points.length; i++) {
- var split = this._endoSplit(coeffs[i]);
- var p = points[i];
- var beta = p._getBeta();
- if (split.k1.negative) {
- split.k1.ineg();
- p = p.neg(true);
- }
- if (split.k2.negative) {
- split.k2.ineg();
- beta = beta.neg(true);
- }
- npoints[i * 2] = p;
- npoints[i * 2 + 1] = beta;
- ncoeffs[i * 2] = split.k1;
- ncoeffs[i * 2 + 1] = split.k2;
- }
- var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult);
- for (var j = 0;j < i * 2; j++) {
- npoints[j] = null;
- ncoeffs[j] = null;
- }
- return res;
- };
- function Point(curve, x, y, isRed) {
- Base.BasePoint.call(this, curve, "affine");
- if (x === null && y === null) {
- this.x = null;
- this.y = null;
- this.inf = true;
- } else {
- this.x = new BN(x, 16);
- this.y = new BN(y, 16);
- if (isRed) {
- this.x.forceRed(this.curve.red);
- this.y.forceRed(this.curve.red);
- }
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.y.red)
- this.y = this.y.toRed(this.curve.red);
- this.inf = false;
- }
- }
- inherits(Point, Base.BasePoint);
- ShortCurve.prototype.point = function point(x, y, isRed) {
- return new Point(this, x, y, isRed);
- };
- ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) {
- return Point.fromJSON(this, obj, red);
- };
- Point.prototype._getBeta = function _getBeta() {
- if (!this.curve.endo)
- return;
- var pre = this.precomputed;
- if (pre && pre.beta)
- return pre.beta;
- var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);
- if (pre) {
- var curve = this.curve;
- var endoMul = function(p) {
- return curve.point(p.x.redMul(curve.endo.beta), p.y);
- };
- pre.beta = beta;
- beta.precomputed = {
- beta: null,
- naf: pre.naf && {
- wnd: pre.naf.wnd,
- points: pre.naf.points.map(endoMul)
- },
- doubles: pre.doubles && {
- step: pre.doubles.step,
- points: pre.doubles.points.map(endoMul)
- }
- };
- }
- return beta;
- };
- Point.prototype.toJSON = function toJSON() {
- if (!this.precomputed)
- return [this.x, this.y];
- return [this.x, this.y, this.precomputed && {
- doubles: this.precomputed.doubles && {
- step: this.precomputed.doubles.step,
- points: this.precomputed.doubles.points.slice(1)
- },
- naf: this.precomputed.naf && {
- wnd: this.precomputed.naf.wnd,
- points: this.precomputed.naf.points.slice(1)
- }
- }];
- };
- Point.fromJSON = function fromJSON(curve, obj, red) {
- if (typeof obj === "string")
- obj = JSON.parse(obj);
- var res = curve.point(obj[0], obj[1], red);
- if (!obj[2])
- return res;
- function obj2point(obj2) {
- return curve.point(obj2[0], obj2[1], red);
- }
- var pre = obj[2];
- res.precomputed = {
- beta: null,
- doubles: pre.doubles && {
- step: pre.doubles.step,
- points: [res].concat(pre.doubles.points.map(obj2point))
- },
- naf: pre.naf && {
- wnd: pre.naf.wnd,
- points: [res].concat(pre.naf.points.map(obj2point))
- }
- };
- return res;
- };
- Point.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- Point.prototype.isInfinity = function isInfinity() {
- return this.inf;
- };
- Point.prototype.add = function add(p) {
- if (this.inf)
- return p;
- if (p.inf)
- return this;
- if (this.eq(p))
- return this.dbl();
- if (this.neg().eq(p))
- return this.curve.point(null, null);
- if (this.x.cmp(p.x) === 0)
- return this.curve.point(null, null);
- var c = this.y.redSub(p.y);
- if (c.cmpn(0) !== 0)
- c = c.redMul(this.x.redSub(p.x).redInvm());
- var nx = c.redSqr().redISub(this.x).redISub(p.x);
- var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
- return this.curve.point(nx, ny);
- };
- Point.prototype.dbl = function dbl() {
- if (this.inf)
- return this;
- var ys1 = this.y.redAdd(this.y);
- if (ys1.cmpn(0) === 0)
- return this.curve.point(null, null);
- var a = this.curve.a;
- var x2 = this.x.redSqr();
- var dyinv = ys1.redInvm();
- var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv);
- var nx = c.redSqr().redISub(this.x.redAdd(this.x));
- var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
- return this.curve.point(nx, ny);
- };
- Point.prototype.getX = function getX() {
- return this.x.fromRed();
- };
- Point.prototype.getY = function getY() {
- return this.y.fromRed();
- };
- Point.prototype.mul = function mul(k) {
- k = new BN(k, 16);
- if (this.isInfinity())
- return this;
- else if (this._hasDoubles(k))
- return this.curve._fixedNafMul(this, k);
- else if (this.curve.endo)
- return this.curve._endoWnafMulAdd([this], [k]);
- else
- return this.curve._wnafMul(this, k);
- };
- Point.prototype.mulAdd = function mulAdd(k1, p2, k2) {
- var points = [this, p2];
- var coeffs = [k1, k2];
- if (this.curve.endo)
- return this.curve._endoWnafMulAdd(points, coeffs);
- else
- return this.curve._wnafMulAdd(1, points, coeffs, 2);
- };
- Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) {
- var points = [this, p2];
- var coeffs = [k1, k2];
- if (this.curve.endo)
- return this.curve._endoWnafMulAdd(points, coeffs, true);
- else
- return this.curve._wnafMulAdd(1, points, coeffs, 2, true);
- };
- Point.prototype.eq = function eq(p) {
- return this === p || this.inf === p.inf && (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0);
- };
- Point.prototype.neg = function neg(_precompute) {
- if (this.inf)
- return this;
- var res = this.curve.point(this.x, this.y.redNeg());
- if (_precompute && this.precomputed) {
- var pre = this.precomputed;
- var negate = function(p) {
- return p.neg();
- };
- res.precomputed = {
- naf: pre.naf && {
- wnd: pre.naf.wnd,
- points: pre.naf.points.map(negate)
- },
- doubles: pre.doubles && {
- step: pre.doubles.step,
- points: pre.doubles.points.map(negate)
- }
- };
- }
- return res;
- };
- Point.prototype.toJ = function toJ() {
- if (this.inf)
- return this.curve.jpoint(null, null, null);
- var res = this.curve.jpoint(this.x, this.y, this.curve.one);
- return res;
- };
- function JPoint(curve, x, y, z) {
- Base.BasePoint.call(this, curve, "jacobian");
- if (x === null && y === null && z === null) {
- this.x = this.curve.one;
- this.y = this.curve.one;
- this.z = new BN(0);
- } else {
- this.x = new BN(x, 16);
- this.y = new BN(y, 16);
- this.z = new BN(z, 16);
- }
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.y.red)
- this.y = this.y.toRed(this.curve.red);
- if (!this.z.red)
- this.z = this.z.toRed(this.curve.red);
- this.zOne = this.z === this.curve.one;
- }
- inherits(JPoint, Base.BasePoint);
- ShortCurve.prototype.jpoint = function jpoint(x, y, z) {
- return new JPoint(this, x, y, z);
- };
- JPoint.prototype.toP = function toP() {
- if (this.isInfinity())
- return this.curve.point(null, null);
- var zinv = this.z.redInvm();
- var zinv2 = zinv.redSqr();
- var ax = this.x.redMul(zinv2);
- var ay = this.y.redMul(zinv2).redMul(zinv);
- return this.curve.point(ax, ay);
- };
- JPoint.prototype.neg = function neg() {
- return this.curve.jpoint(this.x, this.y.redNeg(), this.z);
- };
- JPoint.prototype.add = function add(p) {
- if (this.isInfinity())
- return p;
- if (p.isInfinity())
- return this;
- var pz2 = p.z.redSqr();
- var z2 = this.z.redSqr();
- var u1 = this.x.redMul(pz2);
- var u2 = p.x.redMul(z2);
- var s1 = this.y.redMul(pz2.redMul(p.z));
- var s2 = p.y.redMul(z2.redMul(this.z));
- var h = u1.redSub(u2);
- var r = s1.redSub(s2);
- if (h.cmpn(0) === 0) {
- if (r.cmpn(0) !== 0)
- return this.curve.jpoint(null, null, null);
- else
- return this.dbl();
- }
- var h2 = h.redSqr();
- var h3 = h2.redMul(h);
- var v = u1.redMul(h2);
- var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
- var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
- var nz = this.z.redMul(p.z).redMul(h);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.mixedAdd = function mixedAdd(p) {
- if (this.isInfinity())
- return p.toJ();
- if (p.isInfinity())
- return this;
- var z2 = this.z.redSqr();
- var u1 = this.x;
- var u2 = p.x.redMul(z2);
- var s1 = this.y;
- var s2 = p.y.redMul(z2).redMul(this.z);
- var h = u1.redSub(u2);
- var r = s1.redSub(s2);
- if (h.cmpn(0) === 0) {
- if (r.cmpn(0) !== 0)
- return this.curve.jpoint(null, null, null);
- else
- return this.dbl();
- }
- var h2 = h.redSqr();
- var h3 = h2.redMul(h);
- var v = u1.redMul(h2);
- var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
- var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
- var nz = this.z.redMul(h);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.dblp = function dblp(pow) {
- if (pow === 0)
- return this;
- if (this.isInfinity())
- return this;
- if (!pow)
- return this.dbl();
- var i;
- if (this.curve.zeroA || this.curve.threeA) {
- var r = this;
- for (i = 0;i < pow; i++)
- r = r.dbl();
- return r;
- }
- var a = this.curve.a;
- var tinv = this.curve.tinv;
- var jx = this.x;
- var jy = this.y;
- var jz = this.z;
- var jz4 = jz.redSqr().redSqr();
- var jyd = jy.redAdd(jy);
- for (i = 0;i < pow; i++) {
- var jx2 = jx.redSqr();
- var jyd2 = jyd.redSqr();
- var jyd4 = jyd2.redSqr();
- var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));
- var t1 = jx.redMul(jyd2);
- var nx = c.redSqr().redISub(t1.redAdd(t1));
- var t2 = t1.redISub(nx);
- var dny = c.redMul(t2);
- dny = dny.redIAdd(dny).redISub(jyd4);
- var nz = jyd.redMul(jz);
- if (i + 1 < pow)
- jz4 = jz4.redMul(jyd4);
- jx = nx;
- jz = nz;
- jyd = dny;
- }
- return this.curve.jpoint(jx, jyd.redMul(tinv), jz);
- };
- JPoint.prototype.dbl = function dbl() {
- if (this.isInfinity())
- return this;
- if (this.curve.zeroA)
- return this._zeroDbl();
- else if (this.curve.threeA)
- return this._threeDbl();
- else
- return this._dbl();
- };
- JPoint.prototype._zeroDbl = function _zeroDbl() {
- var nx;
- var ny;
- var nz;
- if (this.zOne) {
- var xx = this.x.redSqr();
- var yy = this.y.redSqr();
- var yyyy = yy.redSqr();
- var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
- s = s.redIAdd(s);
- var m = xx.redAdd(xx).redIAdd(xx);
- var t = m.redSqr().redISub(s).redISub(s);
- var yyyy8 = yyyy.redIAdd(yyyy);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- nx = t;
- ny = m.redMul(s.redISub(t)).redISub(yyyy8);
- nz = this.y.redAdd(this.y);
- } else {
- var a = this.x.redSqr();
- var b = this.y.redSqr();
- var c = b.redSqr();
- var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c);
- d = d.redIAdd(d);
- var e = a.redAdd(a).redIAdd(a);
- var f = e.redSqr();
- var c8 = c.redIAdd(c);
- c8 = c8.redIAdd(c8);
- c8 = c8.redIAdd(c8);
- nx = f.redISub(d).redISub(d);
- ny = e.redMul(d.redISub(nx)).redISub(c8);
- nz = this.y.redMul(this.z);
- nz = nz.redIAdd(nz);
- }
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype._threeDbl = function _threeDbl() {
- var nx;
- var ny;
- var nz;
- if (this.zOne) {
- var xx = this.x.redSqr();
- var yy = this.y.redSqr();
- var yyyy = yy.redSqr();
- var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
- s = s.redIAdd(s);
- var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a);
- var t = m.redSqr().redISub(s).redISub(s);
- nx = t;
- var yyyy8 = yyyy.redIAdd(yyyy);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- ny = m.redMul(s.redISub(t)).redISub(yyyy8);
- nz = this.y.redAdd(this.y);
- } else {
- var delta = this.z.redSqr();
- var gamma = this.y.redSqr();
- var beta = this.x.redMul(gamma);
- var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta));
- alpha = alpha.redAdd(alpha).redIAdd(alpha);
- var beta4 = beta.redIAdd(beta);
- beta4 = beta4.redIAdd(beta4);
- var beta8 = beta4.redAdd(beta4);
- nx = alpha.redSqr().redISub(beta8);
- nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta);
- var ggamma8 = gamma.redSqr();
- ggamma8 = ggamma8.redIAdd(ggamma8);
- ggamma8 = ggamma8.redIAdd(ggamma8);
- ggamma8 = ggamma8.redIAdd(ggamma8);
- ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8);
- }
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype._dbl = function _dbl() {
- var a = this.curve.a;
- var jx = this.x;
- var jy = this.y;
- var jz = this.z;
- var jz4 = jz.redSqr().redSqr();
- var jx2 = jx.redSqr();
- var jy2 = jy.redSqr();
- var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));
- var jxd4 = jx.redAdd(jx);
- jxd4 = jxd4.redIAdd(jxd4);
- var t1 = jxd4.redMul(jy2);
- var nx = c.redSqr().redISub(t1.redAdd(t1));
- var t2 = t1.redISub(nx);
- var jyd8 = jy2.redSqr();
- jyd8 = jyd8.redIAdd(jyd8);
- jyd8 = jyd8.redIAdd(jyd8);
- jyd8 = jyd8.redIAdd(jyd8);
- var ny = c.redMul(t2).redISub(jyd8);
- var nz = jy.redAdd(jy).redMul(jz);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.trpl = function trpl() {
- if (!this.curve.zeroA)
- return this.dbl().add(this);
- var xx = this.x.redSqr();
- var yy = this.y.redSqr();
- var zz = this.z.redSqr();
- var yyyy = yy.redSqr();
- var m = xx.redAdd(xx).redIAdd(xx);
- var mm = m.redSqr();
- var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
- e = e.redIAdd(e);
- e = e.redAdd(e).redIAdd(e);
- e = e.redISub(mm);
- var ee = e.redSqr();
- var t = yyyy.redIAdd(yyyy);
- t = t.redIAdd(t);
- t = t.redIAdd(t);
- t = t.redIAdd(t);
- var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t);
- var yyu4 = yy.redMul(u);
- yyu4 = yyu4.redIAdd(yyu4);
- yyu4 = yyu4.redIAdd(yyu4);
- var nx = this.x.redMul(ee).redISub(yyu4);
- nx = nx.redIAdd(nx);
- nx = nx.redIAdd(nx);
- var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee)));
- ny = ny.redIAdd(ny);
- ny = ny.redIAdd(ny);
- ny = ny.redIAdd(ny);
- var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.mul = function mul(k, kbase) {
- k = new BN(k, kbase);
- return this.curve._wnafMul(this, k);
- };
- JPoint.prototype.eq = function eq(p) {
- if (p.type === "affine")
- return this.eq(p.toJ());
- if (this === p)
- return true;
- var z2 = this.z.redSqr();
- var pz2 = p.z.redSqr();
- if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0)
- return false;
- var z3 = z2.redMul(this.z);
- var pz3 = pz2.redMul(p.z);
- return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0;
- };
- JPoint.prototype.eqXToP = function eqXToP(x) {
- var zs = this.z.redSqr();
- var rx = x.toRed(this.curve.red).redMul(zs);
- if (this.x.cmp(rx) === 0)
- return true;
- var xc = x.clone();
- var t = this.curve.redN.redMul(zs);
- for (;; ) {
- xc.iadd(this.curve.n);
- if (xc.cmp(this.curve.p) >= 0)
- return false;
- rx.redIAdd(t);
- if (this.x.cmp(rx) === 0)
- return true;
- }
- };
- JPoint.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- JPoint.prototype.isInfinity = function isInfinity() {
- return this.z.cmpn(0) === 0;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/mont.js
-var require_mont = __commonJS((exports, module) => {
- var BN = require_bn();
- var inherits = require_inherits();
- var Base = require_base2();
- var utils = require_utils2();
- function MontCurve(conf) {
- Base.call(this, "mont", conf);
- this.a = new BN(conf.a, 16).toRed(this.red);
- this.b = new BN(conf.b, 16).toRed(this.red);
- this.i4 = new BN(4).toRed(this.red).redInvm();
- this.two = new BN(2).toRed(this.red);
- this.a24 = this.i4.redMul(this.a.redAdd(this.two));
- }
- inherits(MontCurve, Base);
- module.exports = MontCurve;
- MontCurve.prototype.validate = function validate(point) {
- var x = point.normalize().x;
- var x2 = x.redSqr();
- var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x);
- var y = rhs.redSqrt();
- return y.redSqr().cmp(rhs) === 0;
- };
- function Point(curve, x, z) {
- Base.BasePoint.call(this, curve, "projective");
- if (x === null && z === null) {
- this.x = this.curve.one;
- this.z = this.curve.zero;
- } else {
- this.x = new BN(x, 16);
- this.z = new BN(z, 16);
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.z.red)
- this.z = this.z.toRed(this.curve.red);
- }
- }
- inherits(Point, Base.BasePoint);
- MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
- return this.point(utils.toArray(bytes, enc), 1);
- };
- MontCurve.prototype.point = function point(x, z) {
- return new Point(this, x, z);
- };
- MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
- return Point.fromJSON(this, obj);
- };
- Point.prototype.precompute = function precompute() {};
- Point.prototype._encode = function _encode() {
- return this.getX().toArray("be", this.curve.p.byteLength());
- };
- Point.fromJSON = function fromJSON(curve, obj) {
- return new Point(curve, obj[0], obj[1] || curve.one);
- };
- Point.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- Point.prototype.isInfinity = function isInfinity() {
- return this.z.cmpn(0) === 0;
- };
- Point.prototype.dbl = function dbl() {
- var a = this.x.redAdd(this.z);
- var aa = a.redSqr();
- var b = this.x.redSub(this.z);
- var bb = b.redSqr();
- var c = aa.redSub(bb);
- var nx = aa.redMul(bb);
- var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c)));
- return this.curve.point(nx, nz);
- };
- Point.prototype.add = function add() {
- throw new Error("Not supported on Montgomery curve");
- };
- Point.prototype.diffAdd = function diffAdd(p, diff) {
- var a = this.x.redAdd(this.z);
- var b = this.x.redSub(this.z);
- var c = p.x.redAdd(p.z);
- var d = p.x.redSub(p.z);
- var da = d.redMul(a);
- var cb = c.redMul(b);
- var nx = diff.z.redMul(da.redAdd(cb).redSqr());
- var nz = diff.x.redMul(da.redISub(cb).redSqr());
- return this.curve.point(nx, nz);
- };
- Point.prototype.mul = function mul(k) {
- var t = k.clone();
- var a = this;
- var b = this.curve.point(null, null);
- var c = this;
- for (var bits = [];t.cmpn(0) !== 0; t.iushrn(1))
- bits.push(t.andln(1));
- for (var i = bits.length - 1;i >= 0; i--) {
- if (bits[i] === 0) {
- a = a.diffAdd(b, c);
- b = b.dbl();
- } else {
- b = a.diffAdd(b, c);
- a = a.dbl();
- }
- }
- return b;
- };
- Point.prototype.mulAdd = function mulAdd() {
- throw new Error("Not supported on Montgomery curve");
- };
- Point.prototype.jumlAdd = function jumlAdd() {
- throw new Error("Not supported on Montgomery curve");
- };
- Point.prototype.eq = function eq(other) {
- return this.getX().cmp(other.getX()) === 0;
- };
- Point.prototype.normalize = function normalize() {
- this.x = this.x.redMul(this.z.redInvm());
- this.z = this.curve.one;
- return this;
- };
- Point.prototype.getX = function getX() {
- this.normalize();
- return this.x.fromRed();
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/edwards.js
-var require_edwards = __commonJS((exports, module) => {
- var utils = require_utils2();
- var BN = require_bn();
- var inherits = require_inherits();
- var Base = require_base2();
- var assert = utils.assert;
- function EdwardsCurve(conf) {
- this.twisted = (conf.a | 0) !== 1;
- this.mOneA = this.twisted && (conf.a | 0) === -1;
- this.extended = this.mOneA;
- Base.call(this, "edwards", conf);
- this.a = new BN(conf.a, 16).umod(this.red.m);
- this.a = this.a.toRed(this.red);
- this.c = new BN(conf.c, 16).toRed(this.red);
- this.c2 = this.c.redSqr();
- this.d = new BN(conf.d, 16).toRed(this.red);
- this.dd = this.d.redAdd(this.d);
- assert(!this.twisted || this.c.fromRed().cmpn(1) === 0);
- this.oneC = (conf.c | 0) === 1;
- }
- inherits(EdwardsCurve, Base);
- module.exports = EdwardsCurve;
- EdwardsCurve.prototype._mulA = function _mulA(num) {
- if (this.mOneA)
- return num.redNeg();
- else
- return this.a.redMul(num);
- };
- EdwardsCurve.prototype._mulC = function _mulC(num) {
- if (this.oneC)
- return num;
- else
- return this.c.redMul(num);
- };
- EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) {
- return this.point(x, y, z, t);
- };
- EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) {
- x = new BN(x, 16);
- if (!x.red)
- x = x.toRed(this.red);
- var x2 = x.redSqr();
- var rhs = this.c2.redSub(this.a.redMul(x2));
- var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2));
- var y2 = rhs.redMul(lhs.redInvm());
- var y = y2.redSqrt();
- if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
- throw new Error("invalid point");
- var isOdd = y.fromRed().isOdd();
- if (odd && !isOdd || !odd && isOdd)
- y = y.redNeg();
- return this.point(x, y);
- };
- EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) {
- y = new BN(y, 16);
- if (!y.red)
- y = y.toRed(this.red);
- var y2 = y.redSqr();
- var lhs = y2.redSub(this.c2);
- var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a);
- var x2 = lhs.redMul(rhs.redInvm());
- if (x2.cmp(this.zero) === 0) {
- if (odd)
- throw new Error("invalid point");
- else
- return this.point(this.zero, y);
- }
- var x = x2.redSqrt();
- if (x.redSqr().redSub(x2).cmp(this.zero) !== 0)
- throw new Error("invalid point");
- if (x.fromRed().isOdd() !== odd)
- x = x.redNeg();
- return this.point(x, y);
- };
- EdwardsCurve.prototype.validate = function validate(point) {
- if (point.isInfinity())
- return true;
- point.normalize();
- var x2 = point.x.redSqr();
- var y2 = point.y.redSqr();
- var lhs = x2.redMul(this.a).redAdd(y2);
- var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2)));
- return lhs.cmp(rhs) === 0;
- };
- function Point(curve, x, y, z, t) {
- Base.BasePoint.call(this, curve, "projective");
- if (x === null && y === null && z === null) {
- this.x = this.curve.zero;
- this.y = this.curve.one;
- this.z = this.curve.one;
- this.t = this.curve.zero;
- this.zOne = true;
- } else {
- this.x = new BN(x, 16);
- this.y = new BN(y, 16);
- this.z = z ? new BN(z, 16) : this.curve.one;
- this.t = t && new BN(t, 16);
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.y.red)
- this.y = this.y.toRed(this.curve.red);
- if (!this.z.red)
- this.z = this.z.toRed(this.curve.red);
- if (this.t && !this.t.red)
- this.t = this.t.toRed(this.curve.red);
- this.zOne = this.z === this.curve.one;
- if (this.curve.extended && !this.t) {
- this.t = this.x.redMul(this.y);
- if (!this.zOne)
- this.t = this.t.redMul(this.z.redInvm());
- }
- }
- }
- inherits(Point, Base.BasePoint);
- EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
- return Point.fromJSON(this, obj);
- };
- EdwardsCurve.prototype.point = function point(x, y, z, t) {
- return new Point(this, x, y, z, t);
- };
- Point.fromJSON = function fromJSON(curve, obj) {
- return new Point(curve, obj[0], obj[1], obj[2]);
- };
- Point.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- Point.prototype.isInfinity = function isInfinity() {
- return this.x.cmpn(0) === 0 && (this.y.cmp(this.z) === 0 || this.zOne && this.y.cmp(this.curve.c) === 0);
- };
- Point.prototype._extDbl = function _extDbl() {
- var a = this.x.redSqr();
- var b = this.y.redSqr();
- var c = this.z.redSqr();
- c = c.redIAdd(c);
- var d = this.curve._mulA(a);
- var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b);
- var g = d.redAdd(b);
- var f = g.redSub(c);
- var h = d.redSub(b);
- var nx = e.redMul(f);
- var ny = g.redMul(h);
- var nt = e.redMul(h);
- var nz = f.redMul(g);
- return this.curve.point(nx, ny, nz, nt);
- };
- Point.prototype._projDbl = function _projDbl() {
- var b = this.x.redAdd(this.y).redSqr();
- var c = this.x.redSqr();
- var d = this.y.redSqr();
- var nx;
- var ny;
- var nz;
- var e;
- var h;
- var j;
- if (this.curve.twisted) {
- e = this.curve._mulA(c);
- var f = e.redAdd(d);
- if (this.zOne) {
- nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two));
- ny = f.redMul(e.redSub(d));
- nz = f.redSqr().redSub(f).redSub(f);
- } else {
- h = this.z.redSqr();
- j = f.redSub(h).redISub(h);
- nx = b.redSub(c).redISub(d).redMul(j);
- ny = f.redMul(e.redSub(d));
- nz = f.redMul(j);
- }
- } else {
- e = c.redAdd(d);
- h = this.curve._mulC(this.z).redSqr();
- j = e.redSub(h).redSub(h);
- nx = this.curve._mulC(b.redISub(e)).redMul(j);
- ny = this.curve._mulC(e).redMul(c.redISub(d));
- nz = e.redMul(j);
- }
- return this.curve.point(nx, ny, nz);
- };
- Point.prototype.dbl = function dbl() {
- if (this.isInfinity())
- return this;
- if (this.curve.extended)
- return this._extDbl();
- else
- return this._projDbl();
- };
- Point.prototype._extAdd = function _extAdd(p) {
- var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x));
- var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x));
- var c = this.t.redMul(this.curve.dd).redMul(p.t);
- var d = this.z.redMul(p.z.redAdd(p.z));
- var e = b.redSub(a);
- var f = d.redSub(c);
- var g = d.redAdd(c);
- var h = b.redAdd(a);
- var nx = e.redMul(f);
- var ny = g.redMul(h);
- var nt = e.redMul(h);
- var nz = f.redMul(g);
- return this.curve.point(nx, ny, nz, nt);
- };
- Point.prototype._projAdd = function _projAdd(p) {
- var a = this.z.redMul(p.z);
- var b = a.redSqr();
- var c = this.x.redMul(p.x);
- var d = this.y.redMul(p.y);
- var e = this.curve.d.redMul(c).redMul(d);
- var f = b.redSub(e);
- var g = b.redAdd(e);
- var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d);
- var nx = a.redMul(f).redMul(tmp);
- var ny;
- var nz;
- if (this.curve.twisted) {
- ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c)));
- nz = f.redMul(g);
- } else {
- ny = a.redMul(g).redMul(d.redSub(c));
- nz = this.curve._mulC(f).redMul(g);
- }
- return this.curve.point(nx, ny, nz);
- };
- Point.prototype.add = function add(p) {
- if (this.isInfinity())
- return p;
- if (p.isInfinity())
- return this;
- if (this.curve.extended)
- return this._extAdd(p);
- else
- return this._projAdd(p);
- };
- Point.prototype.mul = function mul(k) {
- if (this._hasDoubles(k))
- return this.curve._fixedNafMul(this, k);
- else
- return this.curve._wnafMul(this, k);
- };
- Point.prototype.mulAdd = function mulAdd(k1, p, k2) {
- return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, false);
- };
- Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) {
- return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, true);
- };
- Point.prototype.normalize = function normalize() {
- if (this.zOne)
- return this;
- var zi = this.z.redInvm();
- this.x = this.x.redMul(zi);
- this.y = this.y.redMul(zi);
- if (this.t)
- this.t = this.t.redMul(zi);
- this.z = this.curve.one;
- this.zOne = true;
- return this;
- };
- Point.prototype.neg = function neg() {
- return this.curve.point(this.x.redNeg(), this.y, this.z, this.t && this.t.redNeg());
- };
- Point.prototype.getX = function getX() {
- this.normalize();
- return this.x.fromRed();
- };
- Point.prototype.getY = function getY() {
- this.normalize();
- return this.y.fromRed();
- };
- Point.prototype.eq = function eq(other) {
- return this === other || this.getX().cmp(other.getX()) === 0 && this.getY().cmp(other.getY()) === 0;
- };
- Point.prototype.eqXToP = function eqXToP(x) {
- var rx = x.toRed(this.curve.red).redMul(this.z);
- if (this.x.cmp(rx) === 0)
- return true;
- var xc = x.clone();
- var t = this.curve.redN.redMul(this.z);
- for (;; ) {
- xc.iadd(this.curve.n);
- if (xc.cmp(this.curve.p) >= 0)
- return false;
- rx.redIAdd(t);
- if (this.x.cmp(rx) === 0)
- return true;
- }
- };
- Point.prototype.toP = Point.prototype.normalize;
- Point.prototype.mixedAdd = Point.prototype.add;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/index.js
-var require_curve = __commonJS((exports) => {
- var curve = exports;
- curve.base = require_base2();
- curve.short = require_short();
- curve.mont = require_mont();
- curve.edwards = require_edwards();
-});
-
-// ../eve/node_modules/hash.js/lib/hash/utils.js
-var require_utils3 = __commonJS((exports) => {
- var assert = require_minimalistic_assert();
- var inherits = require_inherits();
- exports.inherits = inherits;
- function isSurrogatePair(msg, i) {
- if ((msg.charCodeAt(i) & 64512) !== 55296) {
- return false;
- }
- if (i < 0 || i + 1 >= msg.length) {
- return false;
- }
- return (msg.charCodeAt(i + 1) & 64512) === 56320;
- }
- function toArray(msg, enc) {
- if (Array.isArray(msg))
- return msg.slice();
- if (!msg)
- return [];
- var res = [];
- if (typeof msg === "string") {
- if (!enc) {
- var p = 0;
- for (var i = 0;i < msg.length; i++) {
- var c = msg.charCodeAt(i);
- if (c < 128) {
- res[p++] = c;
- } else if (c < 2048) {
- res[p++] = c >> 6 | 192;
- res[p++] = c & 63 | 128;
- } else if (isSurrogatePair(msg, i)) {
- c = 65536 + ((c & 1023) << 10) + (msg.charCodeAt(++i) & 1023);
- res[p++] = c >> 18 | 240;
- res[p++] = c >> 12 & 63 | 128;
- res[p++] = c >> 6 & 63 | 128;
- res[p++] = c & 63 | 128;
- } else {
- res[p++] = c >> 12 | 224;
- res[p++] = c >> 6 & 63 | 128;
- res[p++] = c & 63 | 128;
- }
- }
- } else if (enc === "hex") {
- msg = msg.replace(/[^a-z0-9]+/ig, "");
- if (msg.length % 2 !== 0)
- msg = "0" + msg;
- for (i = 0;i < msg.length; i += 2)
- res.push(parseInt(msg[i] + msg[i + 1], 16));
- }
- } else {
- for (i = 0;i < msg.length; i++)
- res[i] = msg[i] | 0;
- }
- return res;
- }
- exports.toArray = toArray;
- function toHex(msg) {
- var res = "";
- for (var i = 0;i < msg.length; i++)
- res += zero2(msg[i].toString(16));
- return res;
- }
- exports.toHex = toHex;
- function htonl(w) {
- var res = w >>> 24 | w >>> 8 & 65280 | w << 8 & 16711680 | (w & 255) << 24;
- return res >>> 0;
- }
- exports.htonl = htonl;
- function toHex32(msg, endian) {
- var res = "";
- for (var i = 0;i < msg.length; i++) {
- var w = msg[i];
- if (endian === "little")
- w = htonl(w);
- res += zero8(w.toString(16));
- }
- return res;
- }
- exports.toHex32 = toHex32;
- function zero2(word) {
- if (word.length === 1)
- return "0" + word;
- else
- return word;
- }
- exports.zero2 = zero2;
- function zero8(word) {
- if (word.length === 7)
- return "0" + word;
- else if (word.length === 6)
- return "00" + word;
- else if (word.length === 5)
- return "000" + word;
- else if (word.length === 4)
- return "0000" + word;
- else if (word.length === 3)
- return "00000" + word;
- else if (word.length === 2)
- return "000000" + word;
- else if (word.length === 1)
- return "0000000" + word;
- else
- return word;
- }
- exports.zero8 = zero8;
- function join32(msg, start, end, endian) {
- var len = end - start;
- assert(len % 4 === 0);
- var res = new Array(len / 4);
- for (var i = 0, k = start;i < res.length; i++, k += 4) {
- var w;
- if (endian === "big")
- w = msg[k] << 24 | msg[k + 1] << 16 | msg[k + 2] << 8 | msg[k + 3];
- else
- w = msg[k + 3] << 24 | msg[k + 2] << 16 | msg[k + 1] << 8 | msg[k];
- res[i] = w >>> 0;
- }
- return res;
- }
- exports.join32 = join32;
- function split32(msg, endian) {
- var res = new Array(msg.length * 4);
- for (var i = 0, k = 0;i < msg.length; i++, k += 4) {
- var m = msg[i];
- if (endian === "big") {
- res[k] = m >>> 24;
- res[k + 1] = m >>> 16 & 255;
- res[k + 2] = m >>> 8 & 255;
- res[k + 3] = m & 255;
- } else {
- res[k + 3] = m >>> 24;
- res[k + 2] = m >>> 16 & 255;
- res[k + 1] = m >>> 8 & 255;
- res[k] = m & 255;
- }
- }
- return res;
- }
- exports.split32 = split32;
- function rotr32(w, b) {
- return w >>> b | w << 32 - b;
- }
- exports.rotr32 = rotr32;
- function rotl32(w, b) {
- return w << b | w >>> 32 - b;
- }
- exports.rotl32 = rotl32;
- function sum32(a, b) {
- return a + b >>> 0;
- }
- exports.sum32 = sum32;
- function sum32_3(a, b, c) {
- return a + b + c >>> 0;
- }
- exports.sum32_3 = sum32_3;
- function sum32_4(a, b, c, d) {
- return a + b + c + d >>> 0;
- }
- exports.sum32_4 = sum32_4;
- function sum32_5(a, b, c, d, e) {
- return a + b + c + d + e >>> 0;
- }
- exports.sum32_5 = sum32_5;
- function sum64(buf, pos, ah, al) {
- var bh = buf[pos];
- var bl = buf[pos + 1];
- var lo = al + bl >>> 0;
- var hi = (lo < al ? 1 : 0) + ah + bh;
- buf[pos] = hi >>> 0;
- buf[pos + 1] = lo;
- }
- exports.sum64 = sum64;
- function sum64_hi(ah, al, bh, bl) {
- var lo = al + bl >>> 0;
- var hi = (lo < al ? 1 : 0) + ah + bh;
- return hi >>> 0;
- }
- exports.sum64_hi = sum64_hi;
- function sum64_lo(ah, al, bh, bl) {
- var lo = al + bl;
- return lo >>> 0;
- }
- exports.sum64_lo = sum64_lo;
- function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) {
- var carry = 0;
- var lo = al;
- lo = lo + bl >>> 0;
- carry += lo < al ? 1 : 0;
- lo = lo + cl >>> 0;
- carry += lo < cl ? 1 : 0;
- lo = lo + dl >>> 0;
- carry += lo < dl ? 1 : 0;
- var hi = ah + bh + ch + dh + carry;
- return hi >>> 0;
- }
- exports.sum64_4_hi = sum64_4_hi;
- function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) {
- var lo = al + bl + cl + dl;
- return lo >>> 0;
- }
- exports.sum64_4_lo = sum64_4_lo;
- function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
- var carry = 0;
- var lo = al;
- lo = lo + bl >>> 0;
- carry += lo < al ? 1 : 0;
- lo = lo + cl >>> 0;
- carry += lo < cl ? 1 : 0;
- lo = lo + dl >>> 0;
- carry += lo < dl ? 1 : 0;
- lo = lo + el >>> 0;
- carry += lo < el ? 1 : 0;
- var hi = ah + bh + ch + dh + eh + carry;
- return hi >>> 0;
- }
- exports.sum64_5_hi = sum64_5_hi;
- function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
- var lo = al + bl + cl + dl + el;
- return lo >>> 0;
- }
- exports.sum64_5_lo = sum64_5_lo;
- function rotr64_hi(ah, al, num) {
- var r = al << 32 - num | ah >>> num;
- return r >>> 0;
- }
- exports.rotr64_hi = rotr64_hi;
- function rotr64_lo(ah, al, num) {
- var r = ah << 32 - num | al >>> num;
- return r >>> 0;
- }
- exports.rotr64_lo = rotr64_lo;
- function shr64_hi(ah, al, num) {
- return ah >>> num;
- }
- exports.shr64_hi = shr64_hi;
- function shr64_lo(ah, al, num) {
- var r = ah << 32 - num | al >>> num;
- return r >>> 0;
- }
- exports.shr64_lo = shr64_lo;
-});
-
-// ../eve/node_modules/hash.js/lib/hash/common.js
-var require_common = __commonJS((exports) => {
- var utils = require_utils3();
- var assert = require_minimalistic_assert();
- function BlockHash() {
- this.pending = null;
- this.pendingTotal = 0;
- this.blockSize = this.constructor.blockSize;
- this.outSize = this.constructor.outSize;
- this.hmacStrength = this.constructor.hmacStrength;
- this.padLength = this.constructor.padLength / 8;
- this.endian = "big";
- this._delta8 = this.blockSize / 8;
- this._delta32 = this.blockSize / 32;
- }
- exports.BlockHash = BlockHash;
- BlockHash.prototype.update = function update(msg, enc) {
- msg = utils.toArray(msg, enc);
- if (!this.pending)
- this.pending = msg;
- else
- this.pending = this.pending.concat(msg);
- this.pendingTotal += msg.length;
- if (this.pending.length >= this._delta8) {
- msg = this.pending;
- var r = msg.length % this._delta8;
- this.pending = msg.slice(msg.length - r, msg.length);
- if (this.pending.length === 0)
- this.pending = null;
- msg = utils.join32(msg, 0, msg.length - r, this.endian);
- for (var i = 0;i < msg.length; i += this._delta32)
- this._update(msg, i, i + this._delta32);
- }
- return this;
- };
- BlockHash.prototype.digest = function digest(enc) {
- this.update(this._pad());
- assert(this.pending === null);
- return this._digest(enc);
- };
- BlockHash.prototype._pad = function pad() {
- var len = this.pendingTotal;
- var bytes = this._delta8;
- var k = bytes - (len + this.padLength) % bytes;
- var res = new Array(k + this.padLength);
- res[0] = 128;
- for (var i = 1;i < k; i++)
- res[i] = 0;
- len <<= 3;
- if (this.endian === "big") {
- for (var t = 8;t < this.padLength; t++)
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = len >>> 24 & 255;
- res[i++] = len >>> 16 & 255;
- res[i++] = len >>> 8 & 255;
- res[i++] = len & 255;
- } else {
- res[i++] = len & 255;
- res[i++] = len >>> 8 & 255;
- res[i++] = len >>> 16 & 255;
- res[i++] = len >>> 24 & 255;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- for (t = 8;t < this.padLength; t++)
- res[i++] = 0;
- }
- return res;
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/common.js
-var require_common2 = __commonJS((exports) => {
- var utils = require_utils3();
- var rotr32 = utils.rotr32;
- function ft_1(s, x, y, z) {
- if (s === 0)
- return ch32(x, y, z);
- if (s === 1 || s === 3)
- return p32(x, y, z);
- if (s === 2)
- return maj32(x, y, z);
- }
- exports.ft_1 = ft_1;
- function ch32(x, y, z) {
- return x & y ^ ~x & z;
- }
- exports.ch32 = ch32;
- function maj32(x, y, z) {
- return x & y ^ x & z ^ y & z;
- }
- exports.maj32 = maj32;
- function p32(x, y, z) {
- return x ^ y ^ z;
- }
- exports.p32 = p32;
- function s0_256(x) {
- return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22);
- }
- exports.s0_256 = s0_256;
- function s1_256(x) {
- return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25);
- }
- exports.s1_256 = s1_256;
- function g0_256(x) {
- return rotr32(x, 7) ^ rotr32(x, 18) ^ x >>> 3;
- }
- exports.g0_256 = g0_256;
- function g1_256(x) {
- return rotr32(x, 17) ^ rotr32(x, 19) ^ x >>> 10;
- }
- exports.g1_256 = g1_256;
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/1.js
-var require_1 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var common = require_common();
- var shaCommon = require_common2();
- var rotl32 = utils.rotl32;
- var sum32 = utils.sum32;
- var sum32_5 = utils.sum32_5;
- var ft_1 = shaCommon.ft_1;
- var BlockHash = common.BlockHash;
- var sha1_K = [
- 1518500249,
- 1859775393,
- 2400959708,
- 3395469782
- ];
- function SHA1() {
- if (!(this instanceof SHA1))
- return new SHA1;
- BlockHash.call(this);
- this.h = [
- 1732584193,
- 4023233417,
- 2562383102,
- 271733878,
- 3285377520
- ];
- this.W = new Array(80);
- }
- utils.inherits(SHA1, BlockHash);
- module.exports = SHA1;
- SHA1.blockSize = 512;
- SHA1.outSize = 160;
- SHA1.hmacStrength = 80;
- SHA1.padLength = 64;
- SHA1.prototype._update = function _update(msg, start) {
- var W = this.W;
- for (var i = 0;i < 16; i++)
- W[i] = msg[start + i];
- for (;i < W.length; i++)
- W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
- var a = this.h[0];
- var b = this.h[1];
- var c = this.h[2];
- var d = this.h[3];
- var e = this.h[4];
- for (i = 0;i < W.length; i++) {
- var s = ~~(i / 20);
- var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]);
- e = d;
- d = c;
- c = rotl32(b, 30);
- b = a;
- a = t;
- }
- this.h[0] = sum32(this.h[0], a);
- this.h[1] = sum32(this.h[1], b);
- this.h[2] = sum32(this.h[2], c);
- this.h[3] = sum32(this.h[3], d);
- this.h[4] = sum32(this.h[4], e);
- };
- SHA1.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "big");
- else
- return utils.split32(this.h, "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/256.js
-var require_256 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var common = require_common();
- var shaCommon = require_common2();
- var assert = require_minimalistic_assert();
- var sum32 = utils.sum32;
- var sum32_4 = utils.sum32_4;
- var sum32_5 = utils.sum32_5;
- var ch32 = shaCommon.ch32;
- var maj32 = shaCommon.maj32;
- var s0_256 = shaCommon.s0_256;
- var s1_256 = shaCommon.s1_256;
- var g0_256 = shaCommon.g0_256;
- var g1_256 = shaCommon.g1_256;
- var BlockHash = common.BlockHash;
- var sha256_K = [
- 1116352408,
- 1899447441,
- 3049323471,
- 3921009573,
- 961987163,
- 1508970993,
- 2453635748,
- 2870763221,
- 3624381080,
- 310598401,
- 607225278,
- 1426881987,
- 1925078388,
- 2162078206,
- 2614888103,
- 3248222580,
- 3835390401,
- 4022224774,
- 264347078,
- 604807628,
- 770255983,
- 1249150122,
- 1555081692,
- 1996064986,
- 2554220882,
- 2821834349,
- 2952996808,
- 3210313671,
- 3336571891,
- 3584528711,
- 113926993,
- 338241895,
- 666307205,
- 773529912,
- 1294757372,
- 1396182291,
- 1695183700,
- 1986661051,
- 2177026350,
- 2456956037,
- 2730485921,
- 2820302411,
- 3259730800,
- 3345764771,
- 3516065817,
- 3600352804,
- 4094571909,
- 275423344,
- 430227734,
- 506948616,
- 659060556,
- 883997877,
- 958139571,
- 1322822218,
- 1537002063,
- 1747873779,
- 1955562222,
- 2024104815,
- 2227730452,
- 2361852424,
- 2428436474,
- 2756734187,
- 3204031479,
- 3329325298
- ];
- function SHA256() {
- if (!(this instanceof SHA256))
- return new SHA256;
- BlockHash.call(this);
- this.h = [
- 1779033703,
- 3144134277,
- 1013904242,
- 2773480762,
- 1359893119,
- 2600822924,
- 528734635,
- 1541459225
- ];
- this.k = sha256_K;
- this.W = new Array(64);
- }
- utils.inherits(SHA256, BlockHash);
- module.exports = SHA256;
- SHA256.blockSize = 512;
- SHA256.outSize = 256;
- SHA256.hmacStrength = 192;
- SHA256.padLength = 64;
- SHA256.prototype._update = function _update(msg, start) {
- var W = this.W;
- for (var i = 0;i < 16; i++)
- W[i] = msg[start + i];
- for (;i < W.length; i++)
- W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]);
- var a = this.h[0];
- var b = this.h[1];
- var c = this.h[2];
- var d = this.h[3];
- var e = this.h[4];
- var f = this.h[5];
- var g = this.h[6];
- var h = this.h[7];
- assert(this.k.length === W.length);
- for (i = 0;i < W.length; i++) {
- var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]);
- var T2 = sum32(s0_256(a), maj32(a, b, c));
- h = g;
- g = f;
- f = e;
- e = sum32(d, T1);
- d = c;
- c = b;
- b = a;
- a = sum32(T1, T2);
- }
- this.h[0] = sum32(this.h[0], a);
- this.h[1] = sum32(this.h[1], b);
- this.h[2] = sum32(this.h[2], c);
- this.h[3] = sum32(this.h[3], d);
- this.h[4] = sum32(this.h[4], e);
- this.h[5] = sum32(this.h[5], f);
- this.h[6] = sum32(this.h[6], g);
- this.h[7] = sum32(this.h[7], h);
- };
- SHA256.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "big");
- else
- return utils.split32(this.h, "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/224.js
-var require_224 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var SHA256 = require_256();
- function SHA224() {
- if (!(this instanceof SHA224))
- return new SHA224;
- SHA256.call(this);
- this.h = [
- 3238371032,
- 914150663,
- 812702999,
- 4144912697,
- 4290775857,
- 1750603025,
- 1694076839,
- 3204075428
- ];
- }
- utils.inherits(SHA224, SHA256);
- module.exports = SHA224;
- SHA224.blockSize = 512;
- SHA224.outSize = 224;
- SHA224.hmacStrength = 192;
- SHA224.padLength = 64;
- SHA224.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h.slice(0, 7), "big");
- else
- return utils.split32(this.h.slice(0, 7), "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/512.js
-var require_512 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var common = require_common();
- var assert = require_minimalistic_assert();
- var rotr64_hi = utils.rotr64_hi;
- var rotr64_lo = utils.rotr64_lo;
- var shr64_hi = utils.shr64_hi;
- var shr64_lo = utils.shr64_lo;
- var sum64 = utils.sum64;
- var sum64_hi = utils.sum64_hi;
- var sum64_lo = utils.sum64_lo;
- var sum64_4_hi = utils.sum64_4_hi;
- var sum64_4_lo = utils.sum64_4_lo;
- var sum64_5_hi = utils.sum64_5_hi;
- var sum64_5_lo = utils.sum64_5_lo;
- var BlockHash = common.BlockHash;
- var sha512_K = [
- 1116352408,
- 3609767458,
- 1899447441,
- 602891725,
- 3049323471,
- 3964484399,
- 3921009573,
- 2173295548,
- 961987163,
- 4081628472,
- 1508970993,
- 3053834265,
- 2453635748,
- 2937671579,
- 2870763221,
- 3664609560,
- 3624381080,
- 2734883394,
- 310598401,
- 1164996542,
- 607225278,
- 1323610764,
- 1426881987,
- 3590304994,
- 1925078388,
- 4068182383,
- 2162078206,
- 991336113,
- 2614888103,
- 633803317,
- 3248222580,
- 3479774868,
- 3835390401,
- 2666613458,
- 4022224774,
- 944711139,
- 264347078,
- 2341262773,
- 604807628,
- 2007800933,
- 770255983,
- 1495990901,
- 1249150122,
- 1856431235,
- 1555081692,
- 3175218132,
- 1996064986,
- 2198950837,
- 2554220882,
- 3999719339,
- 2821834349,
- 766784016,
- 2952996808,
- 2566594879,
- 3210313671,
- 3203337956,
- 3336571891,
- 1034457026,
- 3584528711,
- 2466948901,
- 113926993,
- 3758326383,
- 338241895,
- 168717936,
- 666307205,
- 1188179964,
- 773529912,
- 1546045734,
- 1294757372,
- 1522805485,
- 1396182291,
- 2643833823,
- 1695183700,
- 2343527390,
- 1986661051,
- 1014477480,
- 2177026350,
- 1206759142,
- 2456956037,
- 344077627,
- 2730485921,
- 1290863460,
- 2820302411,
- 3158454273,
- 3259730800,
- 3505952657,
- 3345764771,
- 106217008,
- 3516065817,
- 3606008344,
- 3600352804,
- 1432725776,
- 4094571909,
- 1467031594,
- 275423344,
- 851169720,
- 430227734,
- 3100823752,
- 506948616,
- 1363258195,
- 659060556,
- 3750685593,
- 883997877,
- 3785050280,
- 958139571,
- 3318307427,
- 1322822218,
- 3812723403,
- 1537002063,
- 2003034995,
- 1747873779,
- 3602036899,
- 1955562222,
- 1575990012,
- 2024104815,
- 1125592928,
- 2227730452,
- 2716904306,
- 2361852424,
- 442776044,
- 2428436474,
- 593698344,
- 2756734187,
- 3733110249,
- 3204031479,
- 2999351573,
- 3329325298,
- 3815920427,
- 3391569614,
- 3928383900,
- 3515267271,
- 566280711,
- 3940187606,
- 3454069534,
- 4118630271,
- 4000239992,
- 116418474,
- 1914138554,
- 174292421,
- 2731055270,
- 289380356,
- 3203993006,
- 460393269,
- 320620315,
- 685471733,
- 587496836,
- 852142971,
- 1086792851,
- 1017036298,
- 365543100,
- 1126000580,
- 2618297676,
- 1288033470,
- 3409855158,
- 1501505948,
- 4234509866,
- 1607167915,
- 987167468,
- 1816402316,
- 1246189591
- ];
- function SHA512() {
- if (!(this instanceof SHA512))
- return new SHA512;
- BlockHash.call(this);
- this.h = [
- 1779033703,
- 4089235720,
- 3144134277,
- 2227873595,
- 1013904242,
- 4271175723,
- 2773480762,
- 1595750129,
- 1359893119,
- 2917565137,
- 2600822924,
- 725511199,
- 528734635,
- 4215389547,
- 1541459225,
- 327033209
- ];
- this.k = sha512_K;
- this.W = new Array(160);
- }
- utils.inherits(SHA512, BlockHash);
- module.exports = SHA512;
- SHA512.blockSize = 1024;
- SHA512.outSize = 512;
- SHA512.hmacStrength = 192;
- SHA512.padLength = 128;
- SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) {
- var W = this.W;
- for (var i = 0;i < 32; i++)
- W[i] = msg[start + i];
- for (;i < W.length; i += 2) {
- var c0_hi = g1_512_hi(W[i - 4], W[i - 3]);
- var c0_lo = g1_512_lo(W[i - 4], W[i - 3]);
- var c1_hi = W[i - 14];
- var c1_lo = W[i - 13];
- var c2_hi = g0_512_hi(W[i - 30], W[i - 29]);
- var c2_lo = g0_512_lo(W[i - 30], W[i - 29]);
- var c3_hi = W[i - 32];
- var c3_lo = W[i - 31];
- W[i] = sum64_4_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo);
- W[i + 1] = sum64_4_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo);
- }
- };
- SHA512.prototype._update = function _update(msg, start) {
- this._prepareBlock(msg, start);
- var W = this.W;
- var ah = this.h[0];
- var al = this.h[1];
- var bh = this.h[2];
- var bl = this.h[3];
- var ch = this.h[4];
- var cl = this.h[5];
- var dh = this.h[6];
- var dl = this.h[7];
- var eh = this.h[8];
- var el = this.h[9];
- var fh = this.h[10];
- var fl = this.h[11];
- var gh = this.h[12];
- var gl = this.h[13];
- var hh = this.h[14];
- var hl = this.h[15];
- assert(this.k.length === W.length);
- for (var i = 0;i < W.length; i += 2) {
- var c0_hi = hh;
- var c0_lo = hl;
- var c1_hi = s1_512_hi(eh, el);
- var c1_lo = s1_512_lo(eh, el);
- var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl);
- var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl);
- var c3_hi = this.k[i];
- var c3_lo = this.k[i + 1];
- var c4_hi = W[i];
- var c4_lo = W[i + 1];
- var T1_hi = sum64_5_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo);
- var T1_lo = sum64_5_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo);
- c0_hi = s0_512_hi(ah, al);
- c0_lo = s0_512_lo(ah, al);
- c1_hi = maj64_hi(ah, al, bh, bl, ch, cl);
- c1_lo = maj64_lo(ah, al, bh, bl, ch, cl);
- var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo);
- var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo);
- hh = gh;
- hl = gl;
- gh = fh;
- gl = fl;
- fh = eh;
- fl = el;
- eh = sum64_hi(dh, dl, T1_hi, T1_lo);
- el = sum64_lo(dl, dl, T1_hi, T1_lo);
- dh = ch;
- dl = cl;
- ch = bh;
- cl = bl;
- bh = ah;
- bl = al;
- ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo);
- al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo);
- }
- sum64(this.h, 0, ah, al);
- sum64(this.h, 2, bh, bl);
- sum64(this.h, 4, ch, cl);
- sum64(this.h, 6, dh, dl);
- sum64(this.h, 8, eh, el);
- sum64(this.h, 10, fh, fl);
- sum64(this.h, 12, gh, gl);
- sum64(this.h, 14, hh, hl);
- };
- SHA512.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "big");
- else
- return utils.split32(this.h, "big");
- };
- function ch64_hi(xh, xl, yh, yl, zh) {
- var r = xh & yh ^ ~xh & zh;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function ch64_lo(xh, xl, yh, yl, zh, zl) {
- var r = xl & yl ^ ~xl & zl;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function maj64_hi(xh, xl, yh, yl, zh) {
- var r = xh & yh ^ xh & zh ^ yh & zh;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function maj64_lo(xh, xl, yh, yl, zh, zl) {
- var r = xl & yl ^ xl & zl ^ yl & zl;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s0_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 28);
- var c1_hi = rotr64_hi(xl, xh, 2);
- var c2_hi = rotr64_hi(xl, xh, 7);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s0_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 28);
- var c1_lo = rotr64_lo(xl, xh, 2);
- var c2_lo = rotr64_lo(xl, xh, 7);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s1_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 14);
- var c1_hi = rotr64_hi(xh, xl, 18);
- var c2_hi = rotr64_hi(xl, xh, 9);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s1_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 14);
- var c1_lo = rotr64_lo(xh, xl, 18);
- var c2_lo = rotr64_lo(xl, xh, 9);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g0_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 1);
- var c1_hi = rotr64_hi(xh, xl, 8);
- var c2_hi = shr64_hi(xh, xl, 7);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g0_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 1);
- var c1_lo = rotr64_lo(xh, xl, 8);
- var c2_lo = shr64_lo(xh, xl, 7);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g1_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 19);
- var c1_hi = rotr64_hi(xl, xh, 29);
- var c2_hi = shr64_hi(xh, xl, 6);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g1_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 19);
- var c1_lo = rotr64_lo(xl, xh, 29);
- var c2_lo = shr64_lo(xh, xl, 6);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/384.js
-var require_384 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var SHA512 = require_512();
- function SHA384() {
- if (!(this instanceof SHA384))
- return new SHA384;
- SHA512.call(this);
- this.h = [
- 3418070365,
- 3238371032,
- 1654270250,
- 914150663,
- 2438529370,
- 812702999,
- 355462360,
- 4144912697,
- 1731405415,
- 4290775857,
- 2394180231,
- 1750603025,
- 3675008525,
- 1694076839,
- 1203062813,
- 3204075428
- ];
- }
- utils.inherits(SHA384, SHA512);
- module.exports = SHA384;
- SHA384.blockSize = 1024;
- SHA384.outSize = 384;
- SHA384.hmacStrength = 192;
- SHA384.padLength = 128;
- SHA384.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h.slice(0, 12), "big");
- else
- return utils.split32(this.h.slice(0, 12), "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha.js
-var require_sha = __commonJS((exports) => {
- exports.sha1 = require_1();
- exports.sha224 = require_224();
- exports.sha256 = require_256();
- exports.sha384 = require_384();
- exports.sha512 = require_512();
-});
-
-// ../eve/node_modules/hash.js/lib/hash/ripemd.js
-var require_ripemd = __commonJS((exports) => {
- var utils = require_utils3();
- var common = require_common();
- var rotl32 = utils.rotl32;
- var sum32 = utils.sum32;
- var sum32_3 = utils.sum32_3;
- var sum32_4 = utils.sum32_4;
- var BlockHash = common.BlockHash;
- function RIPEMD160() {
- if (!(this instanceof RIPEMD160))
- return new RIPEMD160;
- BlockHash.call(this);
- this.h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];
- this.endian = "little";
- }
- utils.inherits(RIPEMD160, BlockHash);
- exports.ripemd160 = RIPEMD160;
- RIPEMD160.blockSize = 512;
- RIPEMD160.outSize = 160;
- RIPEMD160.hmacStrength = 192;
- RIPEMD160.padLength = 64;
- RIPEMD160.prototype._update = function update(msg, start) {
- var A = this.h[0];
- var B = this.h[1];
- var C = this.h[2];
- var D = this.h[3];
- var E = this.h[4];
- var Ah = A;
- var Bh = B;
- var Ch = C;
- var Dh = D;
- var Eh = E;
- for (var j = 0;j < 80; j++) {
- var T = sum32(rotl32(sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), s[j]), E);
- A = E;
- E = D;
- D = rotl32(C, 10);
- C = B;
- B = T;
- T = sum32(rotl32(sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), sh[j]), Eh);
- Ah = Eh;
- Eh = Dh;
- Dh = rotl32(Ch, 10);
- Ch = Bh;
- Bh = T;
- }
- T = sum32_3(this.h[1], C, Dh);
- this.h[1] = sum32_3(this.h[2], D, Eh);
- this.h[2] = sum32_3(this.h[3], E, Ah);
- this.h[3] = sum32_3(this.h[4], A, Bh);
- this.h[4] = sum32_3(this.h[0], B, Ch);
- this.h[0] = T;
- };
- RIPEMD160.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "little");
- else
- return utils.split32(this.h, "little");
- };
- function f(j, x, y, z) {
- if (j <= 15)
- return x ^ y ^ z;
- else if (j <= 31)
- return x & y | ~x & z;
- else if (j <= 47)
- return (x | ~y) ^ z;
- else if (j <= 63)
- return x & z | y & ~z;
- else
- return x ^ (y | ~z);
- }
- function K(j) {
- if (j <= 15)
- return 0;
- else if (j <= 31)
- return 1518500249;
- else if (j <= 47)
- return 1859775393;
- else if (j <= 63)
- return 2400959708;
- else
- return 2840853838;
- }
- function Kh(j) {
- if (j <= 15)
- return 1352829926;
- else if (j <= 31)
- return 1548603684;
- else if (j <= 47)
- return 1836072691;
- else if (j <= 63)
- return 2053994217;
- else
- return 0;
- }
- var r = [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 7,
- 4,
- 13,
- 1,
- 10,
- 6,
- 15,
- 3,
- 12,
- 0,
- 9,
- 5,
- 2,
- 14,
- 11,
- 8,
- 3,
- 10,
- 14,
- 4,
- 9,
- 15,
- 8,
- 1,
- 2,
- 7,
- 0,
- 6,
- 13,
- 11,
- 5,
- 12,
- 1,
- 9,
- 11,
- 10,
- 0,
- 8,
- 12,
- 4,
- 13,
- 3,
- 7,
- 15,
- 14,
- 5,
- 6,
- 2,
- 4,
- 0,
- 5,
- 9,
- 7,
- 12,
- 2,
- 10,
- 14,
- 1,
- 3,
- 8,
- 11,
- 6,
- 15,
- 13
- ];
- var rh = [
- 5,
- 14,
- 7,
- 0,
- 9,
- 2,
- 11,
- 4,
- 13,
- 6,
- 15,
- 8,
- 1,
- 10,
- 3,
- 12,
- 6,
- 11,
- 3,
- 7,
- 0,
- 13,
- 5,
- 10,
- 14,
- 15,
- 8,
- 12,
- 4,
- 9,
- 1,
- 2,
- 15,
- 5,
- 1,
- 3,
- 7,
- 14,
- 6,
- 9,
- 11,
- 8,
- 12,
- 2,
- 10,
- 0,
- 4,
- 13,
- 8,
- 6,
- 4,
- 1,
- 3,
- 11,
- 15,
- 0,
- 5,
- 12,
- 2,
- 13,
- 9,
- 7,
- 10,
- 14,
- 12,
- 15,
- 10,
- 4,
- 1,
- 5,
- 8,
- 7,
- 6,
- 2,
- 13,
- 14,
- 0,
- 3,
- 9,
- 11
- ];
- var s = [
- 11,
- 14,
- 15,
- 12,
- 5,
- 8,
- 7,
- 9,
- 11,
- 13,
- 14,
- 15,
- 6,
- 7,
- 9,
- 8,
- 7,
- 6,
- 8,
- 13,
- 11,
- 9,
- 7,
- 15,
- 7,
- 12,
- 15,
- 9,
- 11,
- 7,
- 13,
- 12,
- 11,
- 13,
- 6,
- 7,
- 14,
- 9,
- 13,
- 15,
- 14,
- 8,
- 13,
- 6,
- 5,
- 12,
- 7,
- 5,
- 11,
- 12,
- 14,
- 15,
- 14,
- 15,
- 9,
- 8,
- 9,
- 14,
- 5,
- 6,
- 8,
- 6,
- 5,
- 12,
- 9,
- 15,
- 5,
- 11,
- 6,
- 8,
- 13,
- 12,
- 5,
- 12,
- 13,
- 14,
- 11,
- 8,
- 5,
- 6
- ];
- var sh = [
- 8,
- 9,
- 9,
- 11,
- 13,
- 15,
- 15,
- 5,
- 7,
- 7,
- 8,
- 11,
- 14,
- 14,
- 12,
- 6,
- 9,
- 13,
- 15,
- 7,
- 12,
- 8,
- 9,
- 11,
- 7,
- 7,
- 12,
- 7,
- 6,
- 15,
- 13,
- 11,
- 9,
- 7,
- 15,
- 11,
- 8,
- 6,
- 6,
- 14,
- 12,
- 13,
- 5,
- 14,
- 13,
- 13,
- 7,
- 5,
- 15,
- 5,
- 8,
- 11,
- 14,
- 14,
- 6,
- 14,
- 6,
- 9,
- 12,
- 9,
- 12,
- 5,
- 15,
- 8,
- 8,
- 5,
- 12,
- 9,
- 12,
- 5,
- 14,
- 6,
- 8,
- 13,
- 6,
- 5,
- 15,
- 13,
- 11,
- 11
- ];
-});
-
-// ../eve/node_modules/hash.js/lib/hash/hmac.js
-var require_hmac = __commonJS((exports, module) => {
- var utils = require_utils3();
- var assert = require_minimalistic_assert();
- function Hmac(hash, key, enc) {
- if (!(this instanceof Hmac))
- return new Hmac(hash, key, enc);
- this.Hash = hash;
- this.blockSize = hash.blockSize / 8;
- this.outSize = hash.outSize / 8;
- this.inner = null;
- this.outer = null;
- this._init(utils.toArray(key, enc));
- }
- module.exports = Hmac;
- Hmac.prototype._init = function init(key) {
- if (key.length > this.blockSize)
- key = new this.Hash().update(key).digest();
- assert(key.length <= this.blockSize);
- for (var i = key.length;i < this.blockSize; i++)
- key.push(0);
- for (i = 0;i < key.length; i++)
- key[i] ^= 54;
- this.inner = new this.Hash().update(key);
- for (i = 0;i < key.length; i++)
- key[i] ^= 106;
- this.outer = new this.Hash().update(key);
- };
- Hmac.prototype.update = function update(msg, enc) {
- this.inner.update(msg, enc);
- return this;
- };
- Hmac.prototype.digest = function digest(enc) {
- this.outer.update(this.inner.digest());
- return this.outer.digest(enc);
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash.js
-var require_hash = __commonJS((exports) => {
- var hash = exports;
- hash.utils = require_utils3();
- hash.common = require_common();
- hash.sha = require_sha();
- hash.ripemd = require_ripemd();
- hash.hmac = require_hmac();
- hash.sha1 = hash.sha.sha1;
- hash.sha256 = hash.sha.sha256;
- hash.sha224 = hash.sha.sha224;
- hash.sha384 = hash.sha.sha384;
- hash.sha512 = hash.sha.sha512;
- hash.ripemd160 = hash.ripemd.ripemd160;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js
-var require_secp256k1 = __commonJS((exports, module) => {
- module.exports = {
- doubles: {
- step: 4,
- points: [
- [
- "e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a",
- "f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821"
- ],
- [
- "8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508",
- "11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"
- ],
- [
- "175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739",
- "d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695"
- ],
- [
- "363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640",
- "4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9"
- ],
- [
- "8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c",
- "4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36"
- ],
- [
- "723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda",
- "96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f"
- ],
- [
- "eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa",
- "5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999"
- ],
- [
- "100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0",
- "cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09"
- ],
- [
- "e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d",
- "9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d"
- ],
- [
- "feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d",
- "e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088"
- ],
- [
- "da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1",
- "9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d"
- ],
- [
- "53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0",
- "5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8"
- ],
- [
- "8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047",
- "10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a"
- ],
- [
- "385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862",
- "283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453"
- ],
- [
- "6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7",
- "7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160"
- ],
- [
- "3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd",
- "56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0"
- ],
- [
- "85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83",
- "7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6"
- ],
- [
- "948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a",
- "53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589"
- ],
- [
- "6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8",
- "bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17"
- ],
- [
- "e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d",
- "4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda"
- ],
- [
- "e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725",
- "7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd"
- ],
- [
- "213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754",
- "4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2"
- ],
- [
- "4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c",
- "17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6"
- ],
- [
- "fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6",
- "6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f"
- ],
- [
- "76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39",
- "c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01"
- ],
- [
- "c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891",
- "893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3"
- ],
- [
- "d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b",
- "febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f"
- ],
- [
- "b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03",
- "2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7"
- ],
- [
- "e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d",
- "eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78"
- ],
- [
- "a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070",
- "7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1"
- ],
- [
- "90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4",
- "e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150"
- ],
- [
- "8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da",
- "662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82"
- ],
- [
- "e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11",
- "1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc"
- ],
- [
- "8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e",
- "efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b"
- ],
- [
- "e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41",
- "2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51"
- ],
- [
- "b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef",
- "67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45"
- ],
- [
- "d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8",
- "db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120"
- ],
- [
- "324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d",
- "648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84"
- ],
- [
- "4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96",
- "35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d"
- ],
- [
- "9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd",
- "ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d"
- ],
- [
- "6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5",
- "9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8"
- ],
- [
- "a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266",
- "40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8"
- ],
- [
- "7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71",
- "34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac"
- ],
- [
- "928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac",
- "c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f"
- ],
- [
- "85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751",
- "1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962"
- ],
- [
- "ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e",
- "493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907"
- ],
- [
- "827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241",
- "c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec"
- ],
- [
- "eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3",
- "be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d"
- ],
- [
- "e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f",
- "4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414"
- ],
- [
- "1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19",
- "aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd"
- ],
- [
- "146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be",
- "b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0"
- ],
- [
- "fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9",
- "6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811"
- ],
- [
- "da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2",
- "8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1"
- ],
- [
- "a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13",
- "7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c"
- ],
- [
- "174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c",
- "ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73"
- ],
- [
- "959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba",
- "2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd"
- ],
- [
- "d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151",
- "e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405"
- ],
- [
- "64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073",
- "d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589"
- ],
- [
- "8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458",
- "38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e"
- ],
- [
- "13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b",
- "69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27"
- ],
- [
- "bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366",
- "d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1"
- ],
- [
- "8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa",
- "40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482"
- ],
- [
- "8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0",
- "620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945"
- ],
- [
- "dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787",
- "7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573"
- ],
- [
- "f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e",
- "ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82"
- ]
- ]
- },
- naf: {
- wnd: 7,
- points: [
- [
- "f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9",
- "388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672"
- ],
- [
- "2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4",
- "d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6"
- ],
- [
- "5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc",
- "6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da"
- ],
- [
- "acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe",
- "cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37"
- ],
- [
- "774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb",
- "d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b"
- ],
- [
- "f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8",
- "ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81"
- ],
- [
- "d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e",
- "581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58"
- ],
- [
- "defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34",
- "4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77"
- ],
- [
- "2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c",
- "85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a"
- ],
- [
- "352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5",
- "321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c"
- ],
- [
- "2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f",
- "2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67"
- ],
- [
- "9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714",
- "73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402"
- ],
- [
- "daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729",
- "a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55"
- ],
- [
- "c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db",
- "2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482"
- ],
- [
- "6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4",
- "e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82"
- ],
- [
- "1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5",
- "b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396"
- ],
- [
- "605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479",
- "2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49"
- ],
- [
- "62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d",
- "80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf"
- ],
- [
- "80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f",
- "1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a"
- ],
- [
- "7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb",
- "d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7"
- ],
- [
- "d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9",
- "eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933"
- ],
- [
- "49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963",
- "758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a"
- ],
- [
- "77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74",
- "958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6"
- ],
- [
- "f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530",
- "e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37"
- ],
- [
- "463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b",
- "5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e"
- ],
- [
- "f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247",
- "cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6"
- ],
- [
- "caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1",
- "cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476"
- ],
- [
- "2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120",
- "4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40"
- ],
- [
- "7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435",
- "91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61"
- ],
- [
- "754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18",
- "673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683"
- ],
- [
- "e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8",
- "59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5"
- ],
- [
- "186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb",
- "3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b"
- ],
- [
- "df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f",
- "55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417"
- ],
- [
- "5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143",
- "efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868"
- ],
- [
- "290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba",
- "e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a"
- ],
- [
- "af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45",
- "f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6"
- ],
- [
- "766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a",
- "744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996"
- ],
- [
- "59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e",
- "c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e"
- ],
- [
- "f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8",
- "e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d"
- ],
- [
- "7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c",
- "30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2"
- ],
- [
- "948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519",
- "e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e"
- ],
- [
- "7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab",
- "100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437"
- ],
- [
- "3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca",
- "ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311"
- ],
- [
- "d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf",
- "8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4"
- ],
- [
- "1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610",
- "68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575"
- ],
- [
- "733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4",
- "f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d"
- ],
- [
- "15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c",
- "d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d"
- ],
- [
- "a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940",
- "edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629"
- ],
- [
- "e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980",
- "a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06"
- ],
- [
- "311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3",
- "66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374"
- ],
- [
- "34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf",
- "9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee"
- ],
- [
- "f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63",
- "4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1"
- ],
- [
- "d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448",
- "fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b"
- ],
- [
- "32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf",
- "5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661"
- ],
- [
- "7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5",
- "8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6"
- ],
- [
- "ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6",
- "8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e"
- ],
- [
- "16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5",
- "5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d"
- ],
- [
- "eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99",
- "f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc"
- ],
- [
- "78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51",
- "f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4"
- ],
- [
- "494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5",
- "42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c"
- ],
- [
- "a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5",
- "204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b"
- ],
- [
- "c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997",
- "4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913"
- ],
- [
- "841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881",
- "73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154"
- ],
- [
- "5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5",
- "39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865"
- ],
- [
- "36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66",
- "d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc"
- ],
- [
- "336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726",
- "ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224"
- ],
- [
- "8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede",
- "6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e"
- ],
- [
- "1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94",
- "60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6"
- ],
- [
- "85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31",
- "3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511"
- ],
- [
- "29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51",
- "b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b"
- ],
- [
- "a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252",
- "ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2"
- ],
- [
- "4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5",
- "cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c"
- ],
- [
- "d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b",
- "6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3"
- ],
- [
- "ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4",
- "322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d"
- ],
- [
- "af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f",
- "6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700"
- ],
- [
- "e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889",
- "2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4"
- ],
- [
- "591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246",
- "b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196"
- ],
- [
- "11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984",
- "998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4"
- ],
- [
- "3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a",
- "b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257"
- ],
- [
- "cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030",
- "bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13"
- ],
- [
- "c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197",
- "6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096"
- ],
- [
- "c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593",
- "c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38"
- ],
- [
- "a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef",
- "21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f"
- ],
- [
- "347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38",
- "60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448"
- ],
- [
- "da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a",
- "49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a"
- ],
- [
- "c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111",
- "5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4"
- ],
- [
- "4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502",
- "7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437"
- ],
- [
- "3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea",
- "be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7"
- ],
- [
- "cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26",
- "8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d"
- ],
- [
- "b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986",
- "39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a"
- ],
- [
- "d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e",
- "62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54"
- ],
- [
- "48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4",
- "25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77"
- ],
- [
- "dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda",
- "ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517"
- ],
- [
- "6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859",
- "cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10"
- ],
- [
- "e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f",
- "f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125"
- ],
- [
- "eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c",
- "6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e"
- ],
- [
- "13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942",
- "fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1"
- ],
- [
- "ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a",
- "1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2"
- ],
- [
- "b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80",
- "5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423"
- ],
- [
- "ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d",
- "438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8"
- ],
- [
- "8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1",
- "cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758"
- ],
- [
- "52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63",
- "c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375"
- ],
- [
- "e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352",
- "6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d"
- ],
- [
- "7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193",
- "ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec"
- ],
- [
- "5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00",
- "9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0"
- ],
- [
- "32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58",
- "ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c"
- ],
- [
- "e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7",
- "d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4"
- ],
- [
- "8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8",
- "c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f"
- ],
- [
- "4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e",
- "67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649"
- ],
- [
- "3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d",
- "cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826"
- ],
- [
- "674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b",
- "299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5"
- ],
- [
- "d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f",
- "f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87"
- ],
- [
- "30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6",
- "462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b"
- ],
- [
- "be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297",
- "62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc"
- ],
- [
- "93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a",
- "7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c"
- ],
- [
- "b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c",
- "ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f"
- ],
- [
- "d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52",
- "4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a"
- ],
- [
- "d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb",
- "bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46"
- ],
- [
- "463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065",
- "bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f"
- ],
- [
- "7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917",
- "603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03"
- ],
- [
- "74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9",
- "cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08"
- ],
- [
- "30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3",
- "553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8"
- ],
- [
- "9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57",
- "712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373"
- ],
- [
- "176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66",
- "ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3"
- ],
- [
- "75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8",
- "9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8"
- ],
- [
- "809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721",
- "9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1"
- ],
- [
- "1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180",
- "4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9"
- ]
- ]
- }
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curves.js
-var require_curves = __commonJS((exports) => {
- var curves = exports;
- var hash = require_hash();
- var curve = require_curve();
- var utils = require_utils2();
- var assert = utils.assert;
- function PresetCurve(options2) {
- if (options2.type === "short")
- this.curve = new curve.short(options2);
- else if (options2.type === "edwards")
- this.curve = new curve.edwards(options2);
- else
- this.curve = new curve.mont(options2);
- this.g = this.curve.g;
- this.n = this.curve.n;
- this.hash = options2.hash;
- assert(this.g.validate(), "Invalid curve");
- assert(this.g.mul(this.n).isInfinity(), "Invalid curve, G*N != O");
- }
- curves.PresetCurve = PresetCurve;
- function defineCurve(name, options2) {
- Object.defineProperty(curves, name, {
- configurable: true,
- enumerable: true,
- get: function() {
- var curve2 = new PresetCurve(options2);
- Object.defineProperty(curves, name, {
- configurable: true,
- enumerable: true,
- value: curve2
- });
- return curve2;
- }
- });
- }
- defineCurve("p192", {
- type: "short",
- prime: "p192",
- p: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff",
- a: "ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc",
- b: "64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1",
- n: "ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831",
- hash: hash.sha256,
- gRed: false,
- g: [
- "188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012",
- "07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"
- ]
- });
- defineCurve("p224", {
- type: "short",
- prime: "p224",
- p: "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001",
- a: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe",
- b: "b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4",
- n: "ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d",
- hash: hash.sha256,
- gRed: false,
- g: [
- "b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21",
- "bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"
- ]
- });
- defineCurve("p256", {
- type: "short",
- prime: null,
- p: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff",
- a: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc",
- b: "5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b",
- n: "ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551",
- hash: hash.sha256,
- gRed: false,
- g: [
- "6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296",
- "4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"
- ]
- });
- defineCurve("p384", {
- type: "short",
- prime: null,
- p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "fffffffe ffffffff 00000000 00000000 ffffffff",
- a: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "fffffffe ffffffff 00000000 00000000 fffffffc",
- b: "b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f " + "5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef",
- n: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 " + "f4372ddf 581a0db2 48b0a77a ecec196a ccc52973",
- hash: hash.sha384,
- gRed: false,
- g: [
- "aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 " + "5502f25d bf55296c 3a545e38 72760ab7",
- "3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 " + "0a60b1ce 1d7e819d 7a431d7c 90ea0e5f"
- ]
- });
- defineCurve("p521", {
- type: "short",
- prime: null,
- p: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff",
- a: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff fffffffc",
- b: "00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b " + "99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd " + "3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00",
- n: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 " + "f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409",
- hash: hash.sha512,
- gRed: false,
- g: [
- "000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 " + "053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 " + "a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66",
- "00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 " + "579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 " + "3fad0761 353c7086 a272c240 88be9476 9fd16650"
- ]
- });
- defineCurve("curve25519", {
- type: "mont",
- prime: "p25519",
- p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",
- a: "76d06",
- b: "1",
- n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",
- hash: hash.sha256,
- gRed: false,
- g: [
- "9"
- ]
- });
- defineCurve("ed25519", {
- type: "edwards",
- prime: "p25519",
- p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",
- a: "-1",
- c: "1",
- d: "52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3",
- n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",
- hash: hash.sha256,
- gRed: false,
- g: [
- "216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a",
- "6666666666666666666666666666666666666666666666666666666666666658"
- ]
- });
- var pre;
- try {
- pre = require_secp256k1();
- } catch (e) {
- pre = undefined;
- }
- defineCurve("secp256k1", {
- type: "short",
- prime: "k256",
- p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f",
- a: "0",
- b: "7",
- n: "ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141",
- h: "1",
- hash: hash.sha256,
- beta: "7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee",
- lambda: "5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72",
- basis: [
- {
- a: "3086d221a7d46bcde86c90e49284eb15",
- b: "-e4437ed6010e88286f547fa90abfe4c3"
- },
- {
- a: "114ca50f7a8e2f3f657c1108d9d44cfd8",
- b: "3086d221a7d46bcde86c90e49284eb15"
- }
- ],
- gRed: false,
- g: [
- "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
- "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
- pre
- ]
- });
-});
-
-// ../eve/node_modules/hmac-drbg/lib/hmac-drbg.js
-var require_hmac_drbg = __commonJS((exports, module) => {
- var hash = require_hash();
- var utils = require_utils();
- var assert = require_minimalistic_assert();
- function HmacDRBG(options2) {
- if (!(this instanceof HmacDRBG))
- return new HmacDRBG(options2);
- this.hash = options2.hash;
- this.predResist = !!options2.predResist;
- this.outLen = this.hash.outSize;
- this.minEntropy = options2.minEntropy || this.hash.hmacStrength;
- this._reseed = null;
- this.reseedInterval = null;
- this.K = null;
- this.V = null;
- var entropy = utils.toArray(options2.entropy, options2.entropyEnc || "hex");
- var nonce = utils.toArray(options2.nonce, options2.nonceEnc || "hex");
- var pers = utils.toArray(options2.pers, options2.persEnc || "hex");
- assert(entropy.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits");
- this._init(entropy, nonce, pers);
- }
- module.exports = HmacDRBG;
- HmacDRBG.prototype._init = function init(entropy, nonce, pers) {
- var seed = entropy.concat(nonce).concat(pers);
- this.K = new Array(this.outLen / 8);
- this.V = new Array(this.outLen / 8);
- for (var i = 0;i < this.V.length; i++) {
- this.K[i] = 0;
- this.V[i] = 1;
- }
- this._update(seed);
- this._reseed = 1;
- this.reseedInterval = 281474976710656;
- };
- HmacDRBG.prototype._hmac = function hmac() {
- return new hash.hmac(this.hash, this.K);
- };
- HmacDRBG.prototype._update = function update(seed) {
- var kmac = this._hmac().update(this.V).update([0]);
- if (seed)
- kmac = kmac.update(seed);
- this.K = kmac.digest();
- this.V = this._hmac().update(this.V).digest();
- if (!seed)
- return;
- this.K = this._hmac().update(this.V).update([1]).update(seed).digest();
- this.V = this._hmac().update(this.V).digest();
- };
- HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) {
- if (typeof entropyEnc !== "string") {
- addEnc = add;
- add = entropyEnc;
- entropyEnc = null;
- }
- entropy = utils.toArray(entropy, entropyEnc);
- add = utils.toArray(add, addEnc);
- assert(entropy.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits");
- this._update(entropy.concat(add || []));
- this._reseed = 1;
- };
- HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) {
- if (this._reseed > this.reseedInterval)
- throw new Error("Reseed is required");
- if (typeof enc !== "string") {
- addEnc = add;
- add = enc;
- enc = null;
- }
- if (add) {
- add = utils.toArray(add, addEnc || "hex");
- this._update(add);
- }
- var temp = [];
- while (temp.length < len) {
- this.V = this._hmac().update(this.V).digest();
- temp = temp.concat(this.V);
- }
- var res = temp.slice(0, len);
- this._update(add);
- this._reseed++;
- return utils.encode(res, enc);
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/ec/key.js
-var require_key = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var assert = utils.assert;
- function KeyPair(ec, options2) {
- this.ec = ec;
- this.priv = null;
- this.pub = null;
- if (options2.priv)
- this._importPrivate(options2.priv, options2.privEnc);
- if (options2.pub)
- this._importPublic(options2.pub, options2.pubEnc);
- }
- module.exports = KeyPair;
- KeyPair.fromPublic = function fromPublic(ec, pub, enc) {
- if (pub instanceof KeyPair)
- return pub;
- return new KeyPair(ec, {
- pub,
- pubEnc: enc
- });
- };
- KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) {
- if (priv instanceof KeyPair)
- return priv;
- return new KeyPair(ec, {
- priv,
- privEnc: enc
- });
- };
- KeyPair.prototype.validate = function validate() {
- var pub = this.getPublic();
- if (pub.isInfinity())
- return { result: false, reason: "Invalid public key" };
- if (!pub.validate())
- return { result: false, reason: "Public key is not a point" };
- if (!pub.mul(this.ec.curve.n).isInfinity())
- return { result: false, reason: "Public key * N != O" };
- return { result: true, reason: null };
- };
- KeyPair.prototype.getPublic = function getPublic(compact, enc) {
- if (typeof compact === "string") {
- enc = compact;
- compact = null;
- }
- if (!this.pub)
- this.pub = this.ec.g.mul(this.priv);
- if (!enc)
- return this.pub;
- return this.pub.encode(enc, compact);
- };
- KeyPair.prototype.getPrivate = function getPrivate(enc) {
- if (enc === "hex")
- return this.priv.toString(16, 2);
- else
- return this.priv;
- };
- KeyPair.prototype._importPrivate = function _importPrivate(key, enc) {
- this.priv = new BN(key, enc || 16);
- this.priv = this.priv.umod(this.ec.curve.n);
- };
- KeyPair.prototype._importPublic = function _importPublic(key, enc) {
- if (key.x || key.y) {
- if (this.ec.curve.type === "mont") {
- assert(key.x, "Need x coordinate");
- } else if (this.ec.curve.type === "short" || this.ec.curve.type === "edwards") {
- assert(key.x && key.y, "Need both x and y coordinate");
- }
- this.pub = this.ec.curve.point(key.x, key.y);
- return;
- }
- this.pub = this.ec.curve.decodePoint(key, enc);
- };
- KeyPair.prototype.derive = function derive(pub) {
- if (!pub.validate()) {
- assert(pub.validate(), "public point not validated");
- }
- return pub.mul(this.priv).getX();
- };
- KeyPair.prototype.sign = function sign(msg, enc, options2) {
- return this.ec.sign(msg, this, enc, options2);
- };
- KeyPair.prototype.verify = function verify(msg, signature, options2) {
- return this.ec.verify(msg, signature, this, undefined, options2);
- };
- KeyPair.prototype.inspect = function inspect() {
- return "";
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/ec/signature.js
-var require_signature = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var assert = utils.assert;
- function Signature(options2, enc) {
- if (options2 instanceof Signature)
- return options2;
- if (this._importDER(options2, enc))
- return;
- assert(options2.r && options2.s, "Signature without r or s");
- this.r = new BN(options2.r, 16);
- this.s = new BN(options2.s, 16);
- if (options2.recoveryParam === undefined)
- this.recoveryParam = null;
- else
- this.recoveryParam = options2.recoveryParam;
- }
- module.exports = Signature;
- function Position() {
- this.place = 0;
- }
- function getLength(buf, p) {
- var initial = buf[p.place++];
- if (!(initial & 128)) {
- return initial;
- }
- var octetLen = initial & 15;
- if (octetLen === 0 || octetLen > 4) {
- return false;
- }
- if (buf[p.place] === 0) {
- return false;
- }
- var val = 0;
- for (var i = 0, off = p.place;i < octetLen; i++, off++) {
- val <<= 8;
- val |= buf[off];
- val >>>= 0;
- }
- if (val <= 127) {
- return false;
- }
- p.place = off;
- return val;
- }
- function rmPadding(buf) {
- var i = 0;
- var len = buf.length - 1;
- while (!buf[i] && !(buf[i + 1] & 128) && i < len) {
- i++;
- }
- if (i === 0) {
- return buf;
- }
- return buf.slice(i);
- }
- Signature.prototype._importDER = function _importDER(data, enc) {
- data = utils.toArray(data, enc);
- var p = new Position;
- if (data[p.place++] !== 48) {
- return false;
- }
- var len = getLength(data, p);
- if (len === false) {
- return false;
- }
- if (len + p.place !== data.length) {
- return false;
- }
- if (data[p.place++] !== 2) {
- return false;
- }
- var rlen = getLength(data, p);
- if (rlen === false) {
- return false;
- }
- if ((data[p.place] & 128) !== 0) {
- return false;
- }
- var r = data.slice(p.place, rlen + p.place);
- p.place += rlen;
- if (data[p.place++] !== 2) {
- return false;
- }
- var slen = getLength(data, p);
- if (slen === false) {
- return false;
- }
- if (data.length !== slen + p.place) {
- return false;
- }
- if ((data[p.place] & 128) !== 0) {
- return false;
- }
- var s = data.slice(p.place, slen + p.place);
- if (r[0] === 0) {
- if (r[1] & 128) {
- r = r.slice(1);
- } else {
- return false;
- }
- }
- if (s[0] === 0) {
- if (s[1] & 128) {
- s = s.slice(1);
- } else {
- return false;
- }
- }
- this.r = new BN(r);
- this.s = new BN(s);
- this.recoveryParam = null;
- return true;
- };
- function constructLength(arr, len) {
- if (len < 128) {
- arr.push(len);
- return;
- }
- var octets = 1 + (Math.log(len) / Math.LN2 >>> 3);
- arr.push(octets | 128);
- while (--octets) {
- arr.push(len >>> (octets << 3) & 255);
- }
- arr.push(len);
- }
- Signature.prototype.toDER = function toDER(enc) {
- var r = this.r.toArray();
- var s = this.s.toArray();
- if (r[0] & 128)
- r = [0].concat(r);
- if (s[0] & 128)
- s = [0].concat(s);
- r = rmPadding(r);
- s = rmPadding(s);
- while (!s[0] && !(s[1] & 128)) {
- s = s.slice(1);
- }
- var arr = [2];
- constructLength(arr, r.length);
- arr = arr.concat(r);
- arr.push(2);
- constructLength(arr, s.length);
- var backHalf = arr.concat(s);
- var res = [48];
- constructLength(res, backHalf.length);
- res = res.concat(backHalf);
- return utils.encode(res, enc);
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/ec/index.js
-var require_ec = __commonJS((exports, module) => {
- var BN = require_bn();
- var HmacDRBG = require_hmac_drbg();
- var utils = require_utils2();
- var curves = require_curves();
- var rand = require_brorand();
- var assert = utils.assert;
- var KeyPair = require_key();
- var Signature = require_signature();
- function EC(options2) {
- if (!(this instanceof EC))
- return new EC(options2);
- if (typeof options2 === "string") {
- assert(Object.prototype.hasOwnProperty.call(curves, options2), "Unknown curve " + options2);
- options2 = curves[options2];
- }
- if (options2 instanceof curves.PresetCurve)
- options2 = { curve: options2 };
- this.curve = options2.curve.curve;
- this.n = this.curve.n;
- this.nh = this.n.ushrn(1);
- this.g = this.curve.g;
- this.g = options2.curve.g;
- this.g.precompute(options2.curve.n.bitLength() + 1);
- this.hash = options2.hash || options2.curve.hash;
- }
- module.exports = EC;
- EC.prototype.keyPair = function keyPair(options2) {
- return new KeyPair(this, options2);
- };
- EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) {
- return KeyPair.fromPrivate(this, priv, enc);
- };
- EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) {
- return KeyPair.fromPublic(this, pub, enc);
- };
- EC.prototype.genKeyPair = function genKeyPair(options2) {
- if (!options2)
- options2 = {};
- var drbg = new HmacDRBG({
- hash: this.hash,
- pers: options2.pers,
- persEnc: options2.persEnc || "utf8",
- entropy: options2.entropy || rand(this.hash.hmacStrength),
- entropyEnc: options2.entropy && options2.entropyEnc || "utf8",
- nonce: this.n.toArray()
- });
- var bytes = this.n.byteLength();
- var ns2 = this.n.sub(new BN(2));
- for (;; ) {
- var priv = new BN(drbg.generate(bytes));
- if (priv.cmp(ns2) > 0)
- continue;
- priv.iaddn(1);
- return this.keyFromPrivate(priv);
- }
- };
- EC.prototype._truncateToN = function _truncateToN(msg, truncOnly, bitLength) {
- var byteLength;
- if (BN.isBN(msg) || typeof msg === "number") {
- msg = new BN(msg, 16);
- byteLength = msg.byteLength();
- } else if (typeof msg === "object") {
- byteLength = msg.length;
- msg = new BN(msg, 16);
- } else {
- var str = msg.toString();
- byteLength = str.length + 1 >>> 1;
- msg = new BN(str, 16);
- }
- if (typeof bitLength !== "number") {
- bitLength = byteLength * 8;
- }
- var delta = bitLength - this.n.bitLength();
- if (delta > 0)
- msg = msg.ushrn(delta);
- if (!truncOnly && msg.cmp(this.n) >= 0)
- return msg.sub(this.n);
- else
- return msg;
- };
- EC.prototype.sign = function sign(msg, key, enc, options2) {
- if (typeof enc === "object") {
- options2 = enc;
- enc = null;
- }
- if (!options2)
- options2 = {};
- if (typeof msg !== "string" && typeof msg !== "number" && !BN.isBN(msg)) {
- assert(typeof msg === "object" && msg && typeof msg.length === "number", "Expected message to be an array-like, a hex string, or a BN instance");
- assert(msg.length >>> 0 === msg.length);
- for (var i = 0;i < msg.length; i++)
- assert((msg[i] & 255) === msg[i]);
- }
- key = this.keyFromPrivate(key, enc);
- msg = this._truncateToN(msg, false, options2.msgBitLength);
- assert(!msg.isNeg(), "Can not sign a negative message");
- var bytes = this.n.byteLength();
- var bkey = key.getPrivate().toArray("be", bytes);
- var nonce = msg.toArray("be", bytes);
- assert(new BN(nonce).eq(msg), "Can not sign message");
- var drbg = new HmacDRBG({
- hash: this.hash,
- entropy: bkey,
- nonce,
- pers: options2.pers,
- persEnc: options2.persEnc || "utf8"
- });
- var ns1 = this.n.sub(new BN(1));
- for (var iter = 0;; iter++) {
- var k = options2.k ? options2.k(iter) : new BN(drbg.generate(this.n.byteLength()));
- k = this._truncateToN(k, true);
- if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0)
- continue;
- var kp = this.g.mul(k);
- if (kp.isInfinity())
- continue;
- var kpX = kp.getX();
- var r = kpX.umod(this.n);
- if (r.cmpn(0) === 0)
- continue;
- var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg));
- s = s.umod(this.n);
- if (s.cmpn(0) === 0)
- continue;
- var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | (kpX.cmp(r) !== 0 ? 2 : 0);
- if (options2.canonical && s.cmp(this.nh) > 0) {
- s = this.n.sub(s);
- recoveryParam ^= 1;
- }
- return new Signature({ r, s, recoveryParam });
- }
- };
- EC.prototype.verify = function verify(msg, signature, key, enc, options2) {
- if (!options2)
- options2 = {};
- msg = this._truncateToN(msg, false, options2.msgBitLength);
- key = this.keyFromPublic(key, enc);
- signature = new Signature(signature, "hex");
- var r = signature.r;
- var s = signature.s;
- if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0)
- return false;
- if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0)
- return false;
- var sinv = s.invm(this.n);
- var u1 = sinv.mul(msg).umod(this.n);
- var u2 = sinv.mul(r).umod(this.n);
- var p;
- if (!this.curve._maxwellTrick) {
- p = this.g.mulAdd(u1, key.getPublic(), u2);
- if (p.isInfinity())
- return false;
- return p.getX().umod(this.n).cmp(r) === 0;
- }
- p = this.g.jmulAdd(u1, key.getPublic(), u2);
- if (p.isInfinity())
- return false;
- return p.eqXToP(r);
- };
- EC.prototype.recoverPubKey = function(msg, signature, j, enc) {
- assert((3 & j) === j, "The recovery param is more than two bits");
- signature = new Signature(signature, enc);
- var n = this.n;
- var e = new BN(msg);
- var r = signature.r;
- var s = signature.s;
- var isYOdd = j & 1;
- var isSecondKey = j >> 1;
- if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey)
- throw new Error("Unable to find sencond key candinate");
- if (isSecondKey)
- r = this.curve.pointFromX(r.add(this.curve.n), isYOdd);
- else
- r = this.curve.pointFromX(r, isYOdd);
- var rInv = signature.r.invm(n);
- var s1 = n.sub(e).mul(rInv).umod(n);
- var s2 = s.mul(rInv).umod(n);
- return this.g.mulAdd(s1, r, s2);
- };
- EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) {
- signature = new Signature(signature, enc);
- if (signature.recoveryParam !== null)
- return signature.recoveryParam;
- for (var i = 0;i < 4; i++) {
- var Qprime;
- try {
- Qprime = this.recoverPubKey(e, signature, i);
- } catch (e2) {
- continue;
- }
- if (Qprime.eq(Q))
- return i;
- }
- throw new Error("Unable to find valid recovery factor");
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/eddsa/key.js
-var require_key2 = __commonJS((exports, module) => {
- var utils = require_utils2();
- var assert = utils.assert;
- var parseBytes = utils.parseBytes;
- var cachedProperty = utils.cachedProperty;
- function KeyPair(eddsa, params) {
- this.eddsa = eddsa;
- this._secret = parseBytes(params.secret);
- if (eddsa.isPoint(params.pub))
- this._pub = params.pub;
- else
- this._pubBytes = parseBytes(params.pub);
- }
- KeyPair.fromPublic = function fromPublic(eddsa, pub) {
- if (pub instanceof KeyPair)
- return pub;
- return new KeyPair(eddsa, { pub });
- };
- KeyPair.fromSecret = function fromSecret(eddsa, secret) {
- if (secret instanceof KeyPair)
- return secret;
- return new KeyPair(eddsa, { secret });
- };
- KeyPair.prototype.secret = function secret() {
- return this._secret;
- };
- cachedProperty(KeyPair, "pubBytes", function pubBytes() {
- return this.eddsa.encodePoint(this.pub());
- });
- cachedProperty(KeyPair, "pub", function pub() {
- if (this._pubBytes)
- return this.eddsa.decodePoint(this._pubBytes);
- return this.eddsa.g.mul(this.priv());
- });
- cachedProperty(KeyPair, "privBytes", function privBytes() {
- var eddsa = this.eddsa;
- var hash = this.hash();
- var lastIx = eddsa.encodingLength - 1;
- var a = hash.slice(0, eddsa.encodingLength);
- a[0] &= 248;
- a[lastIx] &= 127;
- a[lastIx] |= 64;
- return a;
- });
- cachedProperty(KeyPair, "priv", function priv() {
- return this.eddsa.decodeInt(this.privBytes());
- });
- cachedProperty(KeyPair, "hash", function hash() {
- return this.eddsa.hash().update(this.secret()).digest();
- });
- cachedProperty(KeyPair, "messagePrefix", function messagePrefix() {
- return this.hash().slice(this.eddsa.encodingLength);
- });
- KeyPair.prototype.sign = function sign(message) {
- assert(this._secret, "KeyPair can only verify");
- return this.eddsa.sign(message, this);
- };
- KeyPair.prototype.verify = function verify(message, sig) {
- return this.eddsa.verify(message, sig, this);
- };
- KeyPair.prototype.getSecret = function getSecret(enc) {
- assert(this._secret, "KeyPair is public only");
- return utils.encode(this.secret(), enc);
- };
- KeyPair.prototype.getPublic = function getPublic(enc) {
- return utils.encode(this.pubBytes(), enc);
- };
- module.exports = KeyPair;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/eddsa/signature.js
-var require_signature2 = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var assert = utils.assert;
- var cachedProperty = utils.cachedProperty;
- var parseBytes = utils.parseBytes;
- function Signature(eddsa, sig) {
- this.eddsa = eddsa;
- if (typeof sig !== "object")
- sig = parseBytes(sig);
- if (Array.isArray(sig)) {
- assert(sig.length === eddsa.encodingLength * 2, "Signature has invalid size");
- sig = {
- R: sig.slice(0, eddsa.encodingLength),
- S: sig.slice(eddsa.encodingLength)
- };
- }
- assert(sig.R && sig.S, "Signature without R or S");
- if (eddsa.isPoint(sig.R))
- this._R = sig.R;
- if (sig.S instanceof BN)
- this._S = sig.S;
- this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded;
- this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded;
- }
- cachedProperty(Signature, "S", function S() {
- return this.eddsa.decodeInt(this.Sencoded());
- });
- cachedProperty(Signature, "R", function R() {
- return this.eddsa.decodePoint(this.Rencoded());
- });
- cachedProperty(Signature, "Rencoded", function Rencoded() {
- return this.eddsa.encodePoint(this.R());
- });
- cachedProperty(Signature, "Sencoded", function Sencoded() {
- return this.eddsa.encodeInt(this.S());
- });
- Signature.prototype.toBytes = function toBytes() {
- return this.Rencoded().concat(this.Sencoded());
- };
- Signature.prototype.toHex = function toHex() {
- return utils.encode(this.toBytes(), "hex").toUpperCase();
- };
- module.exports = Signature;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/eddsa/index.js
-var require_eddsa = __commonJS((exports, module) => {
- var hash = require_hash();
- var curves = require_curves();
- var utils = require_utils2();
- var assert = utils.assert;
- var parseBytes = utils.parseBytes;
- var KeyPair = require_key2();
- var Signature = require_signature2();
- function EDDSA(curve) {
- assert(curve === "ed25519", "only tested with ed25519 so far");
- if (!(this instanceof EDDSA))
- return new EDDSA(curve);
- curve = curves[curve].curve;
- this.curve = curve;
- this.g = curve.g;
- this.g.precompute(curve.n.bitLength() + 1);
- this.pointClass = curve.point().constructor;
- this.encodingLength = Math.ceil(curve.n.bitLength() / 8);
- this.hash = hash.sha512;
- }
- module.exports = EDDSA;
- EDDSA.prototype.sign = function sign(message, secret) {
- message = parseBytes(message);
- var key = this.keyFromSecret(secret);
- var r = this.hashInt(key.messagePrefix(), message);
- var R = this.g.mul(r);
- var Rencoded = this.encodePoint(R);
- var s_ = this.hashInt(Rencoded, key.pubBytes(), message).mul(key.priv());
- var S = r.add(s_).umod(this.curve.n);
- return this.makeSignature({ R, S, Rencoded });
- };
- EDDSA.prototype.verify = function verify(message, sig, pub) {
- message = parseBytes(message);
- sig = this.makeSignature(sig);
- if (sig.S().gte(sig.eddsa.curve.n) || sig.S().isNeg()) {
- return false;
- }
- var key = this.keyFromPublic(pub);
- var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message);
- var SG = this.g.mul(sig.S());
- var RplusAh = sig.R().add(key.pub().mul(h));
- return RplusAh.eq(SG);
- };
- EDDSA.prototype.hashInt = function hashInt() {
- var hash2 = this.hash();
- for (var i = 0;i < arguments.length; i++)
- hash2.update(arguments[i]);
- return utils.intFromLE(hash2.digest()).umod(this.curve.n);
- };
- EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) {
- return KeyPair.fromPublic(this, pub);
- };
- EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) {
- return KeyPair.fromSecret(this, secret);
- };
- EDDSA.prototype.makeSignature = function makeSignature(sig) {
- if (sig instanceof Signature)
- return sig;
- return new Signature(this, sig);
- };
- EDDSA.prototype.encodePoint = function encodePoint(point) {
- var enc = point.getY().toArray("le", this.encodingLength);
- enc[this.encodingLength - 1] |= point.getX().isOdd() ? 128 : 0;
- return enc;
- };
- EDDSA.prototype.decodePoint = function decodePoint(bytes) {
- bytes = utils.parseBytes(bytes);
- var lastIx = bytes.length - 1;
- var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~128);
- var xIsOdd = (bytes[lastIx] & 128) !== 0;
- var y = utils.intFromLE(normed);
- return this.curve.pointFromY(y, xIsOdd);
- };
- EDDSA.prototype.encodeInt = function encodeInt(num) {
- return num.toArray("le", this.encodingLength);
- };
- EDDSA.prototype.decodeInt = function decodeInt(bytes) {
- return utils.intFromLE(bytes);
- };
- EDDSA.prototype.isPoint = function isPoint(val) {
- return val instanceof this.pointClass;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic.js
-var require_elliptic = __commonJS((exports) => {
- var elliptic = exports;
- elliptic.version = require_package().version;
- elliptic.utils = require_utils2();
- elliptic.rand = require_brorand();
- elliptic.curve = require_curve();
- elliptic.curves = require_curves();
- elliptic.ec = require_ec();
- elliptic.eddsa = require_eddsa();
-});
-
-// ../eve/node_modules/jwk-to-pem/src/b64-to-bn.js
-var require_b64_to_bn = __commonJS((exports, module) => {
- var BN = require_asn1().bignum;
- var Buffer2 = require_safe_buffer().Buffer;
- module.exports = function base64ToBigNum(val, zero) {
- var buf = Buffer2.from(val, "base64");
- var bn = val = new BN(buf, 10, "be").iabs();
- if (zero) {
- buf.fill(0);
- }
- return bn;
- };
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/algorithm-identifier.js
-var require_algorithm_identifier = __commonJS((exports, module) => {
- module.exports = require_asn1().define("AlgorithmIdentifer", function() {
- this.seq().obj(this.key("algorithm").objid(), this.key("parameters").optional().any());
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/public-key-info.js
-var require_public_key_info = __commonJS((exports, module) => {
- var AlgorithmIdentifier = require_algorithm_identifier();
- module.exports = require_asn1().define("PublicKeyInfo", function() {
- this.seq().obj(this.key("algorithm").use(AlgorithmIdentifier), this.key("PublicKey").bitstr());
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/version.js
-var require_version = __commonJS((exports, module) => {
- module.exports = require_asn1().define("Version", function() {
- this.int();
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/private-key-info.js
-var require_private_key_info = __commonJS((exports, module) => {
- var AlgorithmIdentifier = require_algorithm_identifier();
- var Version = require_version();
- module.exports = require_asn1().define("PrivateKeyInfo", function() {
- this.seq().obj(this.key("version").use(Version), this.key("privateKeyAlgorithm").use(AlgorithmIdentifier), this.key("privateKey").octstr(), this.key("attributes").optional().any());
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/ec.js
-var require_ec2 = __commonJS((exports, module) => {
- var asn1 = require_asn1();
- var Buffer2 = require_safe_buffer().Buffer;
- var EC = require_elliptic().ec;
- var b64ToBn = require_b64_to_bn();
- var PublicKeyInfo = require_public_key_info();
- var PrivateKeyInfo = require_private_key_info();
- var Version = require_version();
- var ECParameters = asn1.define("ECParameters", function() {
- this.choice({
- namedCurve: this.objid()
- });
- });
- var ecPrivkeyVer1 = 1;
- var ECPrivateKey = asn1.define("ECPrivateKey", function() {
- this.seq().obj(this.key("version").use(Version), this.key("privateKey").octstr(), this.key("parameters").explicit(0).optional().any(), this.key("publicKey").explicit(1).optional().bitstr());
- });
- var curves = {
- "P-256": "p256",
- "P-384": "p384",
- "P-521": "p521"
- };
- var oids = {
- "P-256": [1, 2, 840, 10045, 3, 1, 7],
- "P-384": [1, 3, 132, 0, 34],
- "P-521": [1, 3, 132, 0, 35]
- };
- var parameters = {};
- var algorithms = {};
- Object.keys(oids).forEach(function(crv) {
- parameters[crv] = ECParameters.encode({
- type: "namedCurve",
- value: oids[crv]
- }, "der");
- algorithms[crv] = {
- algorithm: [1, 2, 840, 10045, 2, 1],
- parameters: parameters[crv]
- };
- });
- oids = null;
- function ecJwkToBuffer(jwk, opts) {
- if (typeof jwk.crv !== "string") {
- throw new TypeError('Expected "jwk.crv" to be a String');
- }
- var hasD = typeof jwk.d === "string";
- var xyTypes = hasD ? ["undefined", "string"] : ["string"];
- if (xyTypes.indexOf(typeof jwk.x) === -1) {
- throw new TypeError('Expected "jwk.x" to be a String');
- }
- if (xyTypes.indexOf(typeof jwk.y) === -1) {
- throw new TypeError('Expected "jwk.y" to be a String');
- }
- if (opts.private && !hasD) {
- throw new TypeError('Expected "jwk.d" to be a String');
- }
- var curveName = curves[jwk.crv];
- if (!curveName) {
- throw new Error('Unsupported curve "' + jwk.crv + '"');
- }
- var curve = new EC(curveName);
- var key = {};
- var hasPub = jwk.x && jwk.y;
- if (hasPub) {
- key.pub = {
- x: b64ToBn(jwk.x, false),
- y: b64ToBn(jwk.y, false)
- };
- }
- if (opts.private || !hasPub) {
- key.priv = b64ToBn(jwk.d, true);
- }
- key = curve.keyPair(key);
- var keyValidation = key.validate();
- if (!keyValidation.result) {
- throw new Error('Invalid key for curve: "' + keyValidation.reason + '"');
- }
- var result = keyToPem(jwk.crv, key, opts);
- return result;
- }
- function keyToPem(crv, key, opts) {
- var compact = false;
- var publicKey = key.getPublic(compact, "hex");
- publicKey = Buffer2.from(publicKey, "hex");
- publicKey = {
- unused: 0,
- data: publicKey
- };
- var result;
- if (opts.private) {
- var privateKey = key.getPrivate("hex");
- privateKey = Buffer2.from(privateKey, "hex");
- result = PrivateKeyInfo.encode({
- version: 0,
- privateKeyAlgorithm: algorithms[crv],
- privateKey: ECPrivateKey.encode({
- version: ecPrivkeyVer1,
- privateKey,
- parameters: parameters[crv],
- publicKey
- }, "der")
- }, "pem", {
- label: "PRIVATE KEY"
- });
- privateKey.fill(0);
- } else {
- result = PublicKeyInfo.encode({
- algorithm: algorithms[crv],
- PublicKey: publicKey
- }, "pem", {
- label: "PUBLIC KEY"
- });
- }
- if (result.slice(-1) !== `
-`) {
- result += `
-`;
- }
- return result;
- }
- module.exports = ecJwkToBuffer;
-});
-
-// ../eve/node_modules/jwk-to-pem/src/rsa.js
-var require_rsa = __commonJS((exports, module) => {
- var asn1 = require_asn1();
- var b64ToBn = require_b64_to_bn();
- var PublicKeyInfo = require_public_key_info();
- var PrivateKeyInfo = require_private_key_info();
- var Version = require_version();
- var RSAPrivateKey = asn1.define("RSAPrivateKey", function() {
- this.seq().obj(this.key("version").use(Version), this.key("modulus").int(), this.key("publicExponent").int(), this.key("privateExponent").int(), this.key("prime1").int(), this.key("prime2").int(), this.key("exponent1").int(), this.key("exponent2").int(), this.key("coefficient").int());
- });
- var RSAPublicKey = asn1.define("RSAPublicKey", function() {
- this.seq().obj(this.key("modulus").int(), this.key("publicExponent").int());
- });
- var algorithm = {
- algorithm: [1, 2, 840, 113549, 1, 1, 1],
- parameters: [5, 0]
- };
- function rsaJwkToBuffer(jwk, opts) {
- if (typeof jwk.e !== "string") {
- throw new TypeError('Expected "jwk.e" to be a String');
- }
- if (typeof jwk.n !== "string") {
- throw new TypeError('Expected "jwk.n" to be a String');
- }
- if (opts.private) {
- if (typeof jwk.d !== "string") {
- throw new TypeError('Expected "jwk.d" to be a String');
- }
- if (typeof jwk.p !== "string") {
- throw new TypeError('Expected "jwk.p" to be a String');
- }
- if (typeof jwk.q !== "string") {
- throw new TypeError('Expected "jwk.q" to be a String');
- }
- if (typeof jwk.dp !== "string") {
- throw new TypeError('Expected "jwk.dp" to be a String');
- }
- if (typeof jwk.dq !== "string") {
- throw new TypeError('Expected "jwk.dq" to be a String');
- }
- if (typeof jwk.qi !== "string") {
- throw new TypeError('Expected "jwk.qi" to be a String');
- }
- }
- var pem;
- if (opts.private) {
- pem = PrivateKeyInfo.encode({
- version: 0,
- privateKeyAlgorithm: algorithm,
- privateKey: RSAPrivateKey.encode({
- version: 0,
- modulus: b64ToBn(jwk.n, false),
- publicExponent: b64ToBn(jwk.e, false),
- privateExponent: b64ToBn(jwk.d, true),
- prime1: b64ToBn(jwk.p, true),
- prime2: b64ToBn(jwk.q, true),
- exponent1: b64ToBn(jwk.dp, true),
- exponent2: b64ToBn(jwk.dq, true),
- coefficient: b64ToBn(jwk.qi, true)
- }, "der")
- }, "pem", {
- label: "PRIVATE KEY"
- });
- } else {
- pem = PublicKeyInfo.encode({
- algorithm,
- PublicKey: {
- unused: 0,
- data: RSAPublicKey.encode({
- modulus: b64ToBn(jwk.n, false),
- publicExponent: b64ToBn(jwk.e, false)
- }, "der")
- }
- }, "pem", {
- label: "PUBLIC KEY"
- });
- }
- if (pem.slice(-1) !== `
-`) {
- pem += `
-`;
- }
- return pem;
- }
- module.exports = rsaJwkToBuffer;
-});
-
-// ../eve/node_modules/jwk-to-pem/src/jwk-to-pem.js
-var require_jwk_to_pem = __commonJS((exports, module) => {
- var ec = require_ec2();
- var rsa = require_rsa();
- function jwkToBuffer(jwk, opts) {
- if (typeof jwk !== "object" || jwk === null) {
- throw new TypeError('Expected "jwk" to be an Object');
- }
- var kty = jwk.kty;
- if (typeof kty !== "string") {
- throw new TypeError('Expected "jwk.kty" to be a String');
- }
- opts = opts || {};
- opts.private = opts.private === true;
- switch (kty) {
- case "EC": {
- return ec(jwk, opts);
- }
- case "RSA": {
- return rsa(jwk, opts);
- }
- default: {
- throw new Error('Unsupported key type "' + kty + '"');
- }
- }
- }
- module.exports = jwkToBuffer;
-});
-
-// src/utils/cookies.ts
-function getCookies(headers) {
- if (!headers)
- return {};
- const cookieHeader = headers.get("Cookie");
- const cookies = {};
- if (cookieHeader === null)
- return {};
- for (const kv of cookieHeader.split(";")) {
- const [cookieKey, ...cookieVal] = kv.split("=");
- const key = cookieKey.trim();
- cookies[key] = cookieVal.join("=");
- }
- return cookies;
-}
-function setCookie(response, key, value, maxAge) {
- response.headers.append("Set-Cookie", `${key}=${value}${maxAge ? "; Path=/; Max-Age=" + maxAge : ""}`);
-}
-function removeCookie(response, key) {
- response.headers.append("Set-Cookie", `${key}=""; Path=/; Max-Age=-1;`);
-}
-// ../eve/dist/_virtual/rolldown_runtime.js
-var __defProp2 = Object.defineProperty;
-var __export = (target, all) => {
- for (var name in all)
- __defProp2(target, name, {
- get: all[name],
- enumerable: true
- });
-};
-
-// ../eve/node_modules/drizzle-orm/entity.js
-var entityKind = Symbol.for("drizzle:entityKind");
-var hasOwnEntityKind = Symbol.for("drizzle:hasOwnEntityKind");
-function is(value, type) {
- if (!value || typeof value !== "object") {
- return false;
- }
- if (value instanceof type) {
- return true;
- }
- if (!Object.prototype.hasOwnProperty.call(type, entityKind)) {
- throw new Error(`Class "${type.name ?? ""}" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`);
- }
- let cls = Object.getPrototypeOf(value).constructor;
- if (cls) {
- while (cls) {
- if (entityKind in cls && cls[entityKind] === type[entityKind]) {
- return true;
- }
- cls = Object.getPrototypeOf(cls);
- }
- }
- return false;
-}
-
-// ../eve/node_modules/drizzle-orm/column.js
-class Column {
- constructor(table, config) {
- this.table = table;
- this.config = config;
- this.name = config.name;
- this.keyAsName = config.keyAsName;
- this.notNull = config.notNull;
- this.default = config.default;
- this.defaultFn = config.defaultFn;
- this.onUpdateFn = config.onUpdateFn;
- this.hasDefault = config.hasDefault;
- this.primary = config.primaryKey;
- this.isUnique = config.isUnique;
- this.uniqueName = config.uniqueName;
- this.uniqueType = config.uniqueType;
- this.dataType = config.dataType;
- this.columnType = config.columnType;
- this.generated = config.generated;
- this.generatedIdentity = config.generatedIdentity;
- }
- static [entityKind] = "Column";
- name;
- keyAsName;
- primary;
- notNull;
- default;
- defaultFn;
- onUpdateFn;
- hasDefault;
- isUnique;
- uniqueName;
- uniqueType;
- dataType;
- columnType;
- enumValues = undefined;
- generated = undefined;
- generatedIdentity = undefined;
- config;
- mapFromDriverValue(value) {
- return value;
- }
- mapToDriverValue(value) {
- return value;
- }
- shouldDisableInsert() {
- return this.config.generated !== undefined && this.config.generated.type !== "byDefault";
- }
-}
-
-// ../eve/node_modules/drizzle-orm/column-builder.js
-class ColumnBuilder {
- static [entityKind] = "ColumnBuilder";
- config;
- constructor(name, dataType, columnType) {
- this.config = {
- name,
- keyAsName: name === "",
- notNull: false,
- default: undefined,
- hasDefault: false,
- primaryKey: false,
- isUnique: false,
- uniqueName: undefined,
- uniqueType: undefined,
- dataType,
- columnType,
- generated: undefined
- };
- }
- $type() {
- return this;
- }
- notNull() {
- this.config.notNull = true;
- return this;
- }
- default(value) {
- this.config.default = value;
- this.config.hasDefault = true;
- return this;
- }
- $defaultFn(fn) {
- this.config.defaultFn = fn;
- this.config.hasDefault = true;
- return this;
- }
- $default = this.$defaultFn;
- $onUpdateFn(fn) {
- this.config.onUpdateFn = fn;
- this.config.hasDefault = true;
- return this;
- }
- $onUpdate = this.$onUpdateFn;
- primaryKey() {
- this.config.primaryKey = true;
- this.config.notNull = true;
- return this;
- }
- setName(name) {
- if (this.config.name !== "")
- return;
- this.config.name = name;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/table.utils.js
-var TableName = Symbol.for("drizzle:Name");
-
-// ../eve/node_modules/drizzle-orm/tracing-utils.js
-function iife(fn, ...args) {
- return fn(...args);
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/unique-constraint.js
-function uniqueKeyName(table, columns) {
- return `${table[TableName]}_${columns.join("_")}_unique`;
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/columns/common.js
-class PgColumn extends Column {
- constructor(table, config) {
- if (!config.uniqueName) {
- config.uniqueName = uniqueKeyName(table, [config.name]);
- }
- super(table, config);
- this.table = table;
- }
- static [entityKind] = "PgColumn";
-}
-
-class ExtraConfigColumn extends PgColumn {
- static [entityKind] = "ExtraConfigColumn";
- getSQLType() {
- return this.getSQLType();
- }
- indexConfig = {
- order: this.config.order ?? "asc",
- nulls: this.config.nulls ?? "last",
- opClass: this.config.opClass
- };
- defaultConfig = {
- order: "asc",
- nulls: "last",
- opClass: undefined
- };
- asc() {
- this.indexConfig.order = "asc";
- return this;
- }
- desc() {
- this.indexConfig.order = "desc";
- return this;
- }
- nullsFirst() {
- this.indexConfig.nulls = "first";
- return this;
- }
- nullsLast() {
- this.indexConfig.nulls = "last";
- return this;
- }
- op(opClass) {
- this.indexConfig.opClass = opClass;
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/columns/enum.js
-class PgEnumObjectColumn extends PgColumn {
- static [entityKind] = "PgEnumObjectColumn";
- enum;
- enumValues = this.config.enum.enumValues;
- constructor(table, config) {
- super(table, config);
- this.enum = config.enum;
- }
- getSQLType() {
- return this.enum.enumName;
- }
-}
-var isPgEnumSym = Symbol.for("drizzle:isPgEnum");
-function isPgEnum(obj) {
- return !!obj && typeof obj === "function" && isPgEnumSym in obj && obj[isPgEnumSym] === true;
-}
-class PgEnumColumn extends PgColumn {
- static [entityKind] = "PgEnumColumn";
- enum = this.config.enum;
- enumValues = this.config.enum.enumValues;
- constructor(table, config) {
- super(table, config);
- this.enum = config.enum;
- }
- getSQLType() {
- return this.enum.enumName;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/subquery.js
-class Subquery {
- static [entityKind] = "Subquery";
- constructor(sql, fields, alias, isWith = false, usedTables = []) {
- this._ = {
- brand: "Subquery",
- sql,
- selectedFields: fields,
- alias,
- isWith,
- usedTables
- };
- }
-}
-
-class WithSubquery extends Subquery {
- static [entityKind] = "WithSubquery";
-}
-
-// ../eve/node_modules/drizzle-orm/version.js
-var version = "0.44.5";
-
-// ../eve/node_modules/drizzle-orm/tracing.js
-var otel;
-var rawTracer;
-var tracer = {
- startActiveSpan(name, fn) {
- if (!otel) {
- return fn();
- }
- if (!rawTracer) {
- rawTracer = otel.trace.getTracer("drizzle-orm", version);
- }
- return iife((otel2, rawTracer2) => rawTracer2.startActiveSpan(name, (span) => {
- try {
- return fn(span);
- } catch (e) {
- span.setStatus({
- code: otel2.SpanStatusCode.ERROR,
- message: e instanceof Error ? e.message : "Unknown error"
- });
- throw e;
- } finally {
- span.end();
- }
- }), otel, rawTracer);
- }
-};
-
-// ../eve/node_modules/drizzle-orm/view-common.js
-var ViewBaseConfig = Symbol.for("drizzle:ViewBaseConfig");
-
-// ../eve/node_modules/drizzle-orm/table.js
-var Schema = Symbol.for("drizzle:Schema");
-var Columns = Symbol.for("drizzle:Columns");
-var ExtraConfigColumns = Symbol.for("drizzle:ExtraConfigColumns");
-var OriginalName = Symbol.for("drizzle:OriginalName");
-var BaseName = Symbol.for("drizzle:BaseName");
-var IsAlias = Symbol.for("drizzle:IsAlias");
-var ExtraConfigBuilder = Symbol.for("drizzle:ExtraConfigBuilder");
-var IsDrizzleTable = Symbol.for("drizzle:IsDrizzleTable");
-
-class Table {
- static [entityKind] = "Table";
- static Symbol = {
- Name: TableName,
- Schema,
- OriginalName,
- Columns,
- ExtraConfigColumns,
- BaseName,
- IsAlias,
- ExtraConfigBuilder
- };
- [TableName];
- [OriginalName];
- [Schema];
- [Columns];
- [ExtraConfigColumns];
- [BaseName];
- [IsAlias] = false;
- [IsDrizzleTable] = true;
- [ExtraConfigBuilder] = undefined;
- constructor(name, schema, baseName) {
- this[TableName] = this[OriginalName] = name;
- this[Schema] = schema;
- this[BaseName] = baseName;
- }
-}
-function getTableName(table) {
- return table[TableName];
-}
-function getTableUniqueName(table) {
- return `${table[Schema] ?? "public"}.${table[TableName]}`;
-}
-
-// ../eve/node_modules/drizzle-orm/sql/sql.js
-function isSQLWrapper(value) {
- return value !== null && value !== undefined && typeof value.getSQL === "function";
-}
-function mergeQueries(queries) {
- const result = { sql: "", params: [] };
- for (const query of queries) {
- result.sql += query.sql;
- result.params.push(...query.params);
- if (query.typings?.length) {
- if (!result.typings) {
- result.typings = [];
- }
- result.typings.push(...query.typings);
- }
- }
- return result;
-}
-
-class StringChunk {
- static [entityKind] = "StringChunk";
- value;
- constructor(value) {
- this.value = Array.isArray(value) ? value : [value];
- }
- getSQL() {
- return new SQL([this]);
- }
-}
-
-class SQL {
- constructor(queryChunks) {
- this.queryChunks = queryChunks;
- for (const chunk of queryChunks) {
- if (is(chunk, Table)) {
- const schemaName = chunk[Table.Symbol.Schema];
- this.usedTables.push(schemaName === undefined ? chunk[Table.Symbol.Name] : schemaName + "." + chunk[Table.Symbol.Name]);
- }
- }
- }
- static [entityKind] = "SQL";
- decoder = noopDecoder;
- shouldInlineParams = false;
- usedTables = [];
- append(query) {
- this.queryChunks.push(...query.queryChunks);
- return this;
- }
- toQuery(config) {
- return tracer.startActiveSpan("drizzle.buildSQL", (span) => {
- const query = this.buildQueryFromSourceParams(this.queryChunks, config);
- span?.setAttributes({
- "drizzle.query.text": query.sql,
- "drizzle.query.params": JSON.stringify(query.params)
- });
- return query;
- });
- }
- buildQueryFromSourceParams(chunks, _config) {
- const config = Object.assign({}, _config, {
- inlineParams: _config.inlineParams || this.shouldInlineParams,
- paramStartIndex: _config.paramStartIndex || { value: 0 }
- });
- const {
- casing,
- escapeName,
- escapeParam,
- prepareTyping,
- inlineParams,
- paramStartIndex
- } = config;
- return mergeQueries(chunks.map((chunk) => {
- if (is(chunk, StringChunk)) {
- return { sql: chunk.value.join(""), params: [] };
- }
- if (is(chunk, Name)) {
- return { sql: escapeName(chunk.value), params: [] };
- }
- if (chunk === undefined) {
- return { sql: "", params: [] };
- }
- if (Array.isArray(chunk)) {
- const result = [new StringChunk("(")];
- for (const [i, p] of chunk.entries()) {
- result.push(p);
- if (i < chunk.length - 1) {
- result.push(new StringChunk(", "));
- }
- }
- result.push(new StringChunk(")"));
- return this.buildQueryFromSourceParams(result, config);
- }
- if (is(chunk, SQL)) {
- return this.buildQueryFromSourceParams(chunk.queryChunks, {
- ...config,
- inlineParams: inlineParams || chunk.shouldInlineParams
- });
- }
- if (is(chunk, Table)) {
- const schemaName = chunk[Table.Symbol.Schema];
- const tableName = chunk[Table.Symbol.Name];
- return {
- sql: schemaName === undefined || chunk[IsAlias] ? escapeName(tableName) : escapeName(schemaName) + "." + escapeName(tableName),
- params: []
- };
- }
- if (is(chunk, Column)) {
- const columnName = casing.getColumnCasing(chunk);
- if (_config.invokeSource === "indexes") {
- return { sql: escapeName(columnName), params: [] };
- }
- const schemaName = chunk.table[Table.Symbol.Schema];
- return {
- sql: chunk.table[IsAlias] || schemaName === undefined ? escapeName(chunk.table[Table.Symbol.Name]) + "." + escapeName(columnName) : escapeName(schemaName) + "." + escapeName(chunk.table[Table.Symbol.Name]) + "." + escapeName(columnName),
- params: []
- };
- }
- if (is(chunk, View)) {
- const schemaName = chunk[ViewBaseConfig].schema;
- const viewName = chunk[ViewBaseConfig].name;
- return {
- sql: schemaName === undefined || chunk[ViewBaseConfig].isAlias ? escapeName(viewName) : escapeName(schemaName) + "." + escapeName(viewName),
- params: []
- };
- }
- if (is(chunk, Param)) {
- if (is(chunk.value, Placeholder)) {
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
- }
- const mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);
- if (is(mappedValue, SQL)) {
- return this.buildQueryFromSourceParams([mappedValue], config);
- }
- if (inlineParams) {
- return { sql: this.mapInlineParam(mappedValue, config), params: [] };
- }
- let typings = ["none"];
- if (prepareTyping) {
- typings = [prepareTyping(chunk.encoder)];
- }
- return { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };
- }
- if (is(chunk, Placeholder)) {
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
- }
- if (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {
- return { sql: escapeName(chunk.fieldAlias), params: [] };
- }
- if (is(chunk, Subquery)) {
- if (chunk._.isWith) {
- return { sql: escapeName(chunk._.alias), params: [] };
- }
- return this.buildQueryFromSourceParams([
- new StringChunk("("),
- chunk._.sql,
- new StringChunk(") "),
- new Name(chunk._.alias)
- ], config);
- }
- if (isPgEnum(chunk)) {
- if (chunk.schema) {
- return { sql: escapeName(chunk.schema) + "." + escapeName(chunk.enumName), params: [] };
- }
- return { sql: escapeName(chunk.enumName), params: [] };
- }
- if (isSQLWrapper(chunk)) {
- if (chunk.shouldOmitSQLParens?.()) {
- return this.buildQueryFromSourceParams([chunk.getSQL()], config);
- }
- return this.buildQueryFromSourceParams([
- new StringChunk("("),
- chunk.getSQL(),
- new StringChunk(")")
- ], config);
- }
- if (inlineParams) {
- return { sql: this.mapInlineParam(chunk, config), params: [] };
- }
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
- }));
- }
- mapInlineParam(chunk, { escapeString }) {
- if (chunk === null) {
- return "null";
- }
- if (typeof chunk === "number" || typeof chunk === "boolean") {
- return chunk.toString();
- }
- if (typeof chunk === "string") {
- return escapeString(chunk);
- }
- if (typeof chunk === "object") {
- const mappedValueAsString = chunk.toString();
- if (mappedValueAsString === "[object Object]") {
- return escapeString(JSON.stringify(chunk));
- }
- return escapeString(mappedValueAsString);
- }
- throw new Error("Unexpected param value: " + chunk);
- }
- getSQL() {
- return this;
- }
- as(alias) {
- if (alias === undefined) {
- return this;
- }
- return new SQL.Aliased(this, alias);
- }
- mapWith(decoder) {
- this.decoder = typeof decoder === "function" ? { mapFromDriverValue: decoder } : decoder;
- return this;
- }
- inlineParams() {
- this.shouldInlineParams = true;
- return this;
- }
- if(condition) {
- return condition ? this : undefined;
- }
-}
-
-class Name {
- constructor(value) {
- this.value = value;
- }
- static [entityKind] = "Name";
- brand;
- getSQL() {
- return new SQL([this]);
- }
-}
-function isDriverValueEncoder(value) {
- return typeof value === "object" && value !== null && "mapToDriverValue" in value && typeof value.mapToDriverValue === "function";
-}
-var noopDecoder = {
- mapFromDriverValue: (value) => value
-};
-var noopEncoder = {
- mapToDriverValue: (value) => value
-};
-var noopMapper = {
- ...noopDecoder,
- ...noopEncoder
-};
-
-class Param {
- constructor(value, encoder = noopEncoder) {
- this.value = value;
- this.encoder = encoder;
- }
- static [entityKind] = "Param";
- brand;
- getSQL() {
- return new SQL([this]);
- }
-}
-function sql(strings, ...params) {
- const queryChunks = [];
- if (params.length > 0 || strings.length > 0 && strings[0] !== "") {
- queryChunks.push(new StringChunk(strings[0]));
- }
- for (const [paramIndex, param2] of params.entries()) {
- queryChunks.push(param2, new StringChunk(strings[paramIndex + 1]));
- }
- return new SQL(queryChunks);
-}
-((sql2) => {
- function empty() {
- return new SQL([]);
- }
- sql2.empty = empty;
- function fromList(list) {
- return new SQL(list);
- }
- sql2.fromList = fromList;
- function raw(str) {
- return new SQL([new StringChunk(str)]);
- }
- sql2.raw = raw;
- function join(chunks, separator) {
- const result = [];
- for (const [i, chunk] of chunks.entries()) {
- if (i > 0 && separator !== undefined) {
- result.push(separator);
- }
- result.push(chunk);
- }
- return new SQL(result);
- }
- sql2.join = join;
- function identifier(value) {
- return new Name(value);
- }
- sql2.identifier = identifier;
- function placeholder2(name2) {
- return new Placeholder(name2);
- }
- sql2.placeholder = placeholder2;
- function param2(value, encoder) {
- return new Param(value, encoder);
- }
- sql2.param = param2;
-})(sql || (sql = {}));
-((SQL2) => {
-
- class Aliased {
- constructor(sql2, fieldAlias) {
- this.sql = sql2;
- this.fieldAlias = fieldAlias;
- }
- static [entityKind] = "SQL.Aliased";
- isSelectionField = false;
- getSQL() {
- return this.sql;
- }
- clone() {
- return new Aliased(this.sql, this.fieldAlias);
- }
- }
- SQL2.Aliased = Aliased;
-})(SQL || (SQL = {}));
-
-class Placeholder {
- constructor(name2) {
- this.name = name2;
- }
- static [entityKind] = "Placeholder";
- getSQL() {
- return new SQL([this]);
- }
-}
-function fillPlaceholders(params, values) {
- return params.map((p) => {
- if (is(p, Placeholder)) {
- if (!(p.name in values)) {
- throw new Error(`No value for placeholder "${p.name}" was provided`);
- }
- return values[p.name];
- }
- if (is(p, Param) && is(p.value, Placeholder)) {
- if (!(p.value.name in values)) {
- throw new Error(`No value for placeholder "${p.value.name}" was provided`);
- }
- return p.encoder.mapToDriverValue(values[p.value.name]);
- }
- return p;
- });
-}
-var IsDrizzleView = Symbol.for("drizzle:IsDrizzleView");
-
-class View {
- static [entityKind] = "View";
- [ViewBaseConfig];
- [IsDrizzleView] = true;
- constructor({ name: name2, schema, selectedFields, query }) {
- this[ViewBaseConfig] = {
- name: name2,
- originalName: name2,
- schema,
- selectedFields,
- query,
- isExisting: !query,
- isAlias: false
- };
- }
- getSQL() {
- return new SQL([this]);
- }
-}
-Column.prototype.getSQL = function() {
- return new SQL([this]);
-};
-Table.prototype.getSQL = function() {
- return new SQL([this]);
-};
-Subquery.prototype.getSQL = function() {
- return new SQL([this]);
-};
-
-// ../eve/node_modules/drizzle-orm/alias.js
-class ColumnAliasProxyHandler {
- constructor(table) {
- this.table = table;
- }
- static [entityKind] = "ColumnAliasProxyHandler";
- get(columnObj, prop) {
- if (prop === "table") {
- return this.table;
- }
- return columnObj[prop];
- }
-}
-
-class TableAliasProxyHandler {
- constructor(alias, replaceOriginalName) {
- this.alias = alias;
- this.replaceOriginalName = replaceOriginalName;
- }
- static [entityKind] = "TableAliasProxyHandler";
- get(target, prop) {
- if (prop === Table.Symbol.IsAlias) {
- return true;
- }
- if (prop === Table.Symbol.Name) {
- return this.alias;
- }
- if (this.replaceOriginalName && prop === Table.Symbol.OriginalName) {
- return this.alias;
- }
- if (prop === ViewBaseConfig) {
- return {
- ...target[ViewBaseConfig],
- name: this.alias,
- isAlias: true
- };
- }
- if (prop === Table.Symbol.Columns) {
- const columns = target[Table.Symbol.Columns];
- if (!columns) {
- return columns;
- }
- const proxiedColumns = {};
- Object.keys(columns).map((key) => {
- proxiedColumns[key] = new Proxy(columns[key], new ColumnAliasProxyHandler(new Proxy(target, this)));
- });
- return proxiedColumns;
- }
- const value = target[prop];
- if (is(value, Column)) {
- return new Proxy(value, new ColumnAliasProxyHandler(new Proxy(target, this)));
- }
- return value;
- }
-}
-function aliasedTable(table, tableAlias) {
- return new Proxy(table, new TableAliasProxyHandler(tableAlias, false));
-}
-function aliasedTableColumn(column, tableAlias) {
- return new Proxy(column, new ColumnAliasProxyHandler(new Proxy(column.table, new TableAliasProxyHandler(tableAlias, false))));
-}
-function mapColumnsInAliasedSQLToAlias(query, alias) {
- return new SQL.Aliased(mapColumnsInSQLToAlias(query.sql, alias), query.fieldAlias);
-}
-function mapColumnsInSQLToAlias(query, alias) {
- return sql.join(query.queryChunks.map((c) => {
- if (is(c, Column)) {
- return aliasedTableColumn(c, alias);
- }
- if (is(c, SQL)) {
- return mapColumnsInSQLToAlias(c, alias);
- }
- if (is(c, SQL.Aliased)) {
- return mapColumnsInAliasedSQLToAlias(c, alias);
- }
- return c;
- }));
-}
-
-// ../eve/node_modules/drizzle-orm/utils.js
-function mapResultRow(columns, row, joinsNotNullableMap) {
- const nullifyMap = {};
- const result = columns.reduce((result2, { path, field }, columnIndex) => {
- let decoder;
- if (is(field, Column)) {
- decoder = field;
- } else if (is(field, SQL)) {
- decoder = field.decoder;
- } else {
- decoder = field.sql.decoder;
- }
- let node = result2;
- for (const [pathChunkIndex, pathChunk] of path.entries()) {
- if (pathChunkIndex < path.length - 1) {
- if (!(pathChunk in node)) {
- node[pathChunk] = {};
- }
- node = node[pathChunk];
- } else {
- const rawValue = row[columnIndex];
- const value = node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue);
- if (joinsNotNullableMap && is(field, Column) && path.length === 2) {
- const objectName = path[0];
- if (!(objectName in nullifyMap)) {
- nullifyMap[objectName] = value === null ? getTableName(field.table) : false;
- } else if (typeof nullifyMap[objectName] === "string" && nullifyMap[objectName] !== getTableName(field.table)) {
- nullifyMap[objectName] = false;
- }
- }
- }
- }
- return result2;
- }, {});
- if (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {
- for (const [objectName, tableName] of Object.entries(nullifyMap)) {
- if (typeof tableName === "string" && !joinsNotNullableMap[tableName]) {
- result[objectName] = null;
- }
- }
- }
- return result;
-}
-function orderSelectedFields(fields, pathPrefix) {
- return Object.entries(fields).reduce((result, [name, field]) => {
- if (typeof name !== "string") {
- return result;
- }
- const newPath = pathPrefix ? [...pathPrefix, name] : [name];
- if (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased)) {
- result.push({ path: newPath, field });
- } else if (is(field, Table)) {
- result.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath));
- } else {
- result.push(...orderSelectedFields(field, newPath));
- }
- return result;
- }, []);
-}
-function haveSameKeys(left, right) {
- const leftKeys = Object.keys(left);
- const rightKeys = Object.keys(right);
- if (leftKeys.length !== rightKeys.length) {
- return false;
- }
- for (const [index, key] of leftKeys.entries()) {
- if (key !== rightKeys[index]) {
- return false;
- }
- }
- return true;
-}
-function mapUpdateSet(table, values) {
- const entries = Object.entries(values).filter(([, value]) => value !== undefined).map(([key, value]) => {
- if (is(value, SQL) || is(value, Column)) {
- return [key, value];
- } else {
- return [key, new Param(value, table[Table.Symbol.Columns][key])];
- }
- });
- if (entries.length === 0) {
- throw new Error("No values to set");
- }
- return Object.fromEntries(entries);
-}
-function applyMixins(baseClass, extendedClasses) {
- for (const extendedClass of extendedClasses) {
- for (const name of Object.getOwnPropertyNames(extendedClass.prototype)) {
- if (name === "constructor")
- continue;
- Object.defineProperty(baseClass.prototype, name, Object.getOwnPropertyDescriptor(extendedClass.prototype, name) || /* @__PURE__ */ Object.create(null));
- }
- }
-}
-function getTableColumns(table) {
- return table[Table.Symbol.Columns];
-}
-function getTableLikeName(table) {
- return is(table, Subquery) ? table._.alias : is(table, View) ? table[ViewBaseConfig].name : is(table, SQL) ? undefined : table[Table.Symbol.IsAlias] ? table[Table.Symbol.Name] : table[Table.Symbol.BaseName];
-}
-function getColumnNameAndConfig(a, b) {
- return {
- name: typeof a === "string" && a.length > 0 ? a : "",
- config: typeof a === "object" ? a : b
- };
-}
-function isConfig(data) {
- if (typeof data !== "object" || data === null)
- return false;
- if (data.constructor.name !== "Object")
- return false;
- if ("logger" in data) {
- const type = typeof data["logger"];
- if (type !== "boolean" && (type !== "object" || typeof data["logger"]["logQuery"] !== "function") && type !== "undefined")
- return false;
- return true;
- }
- if ("schema" in data) {
- const type = typeof data["schema"];
- if (type !== "object" && type !== "undefined")
- return false;
- return true;
- }
- if ("casing" in data) {
- const type = typeof data["casing"];
- if (type !== "string" && type !== "undefined")
- return false;
- return true;
- }
- if ("mode" in data) {
- if (data["mode"] !== "default" || data["mode"] !== "planetscale" || data["mode"] !== undefined)
- return false;
- return true;
- }
- if ("connection" in data) {
- const type = typeof data["connection"];
- if (type !== "string" && type !== "object" && type !== "undefined")
- return false;
- return true;
- }
- if ("client" in data) {
- const type = typeof data["client"];
- if (type !== "object" && type !== "function" && type !== "undefined")
- return false;
- return true;
- }
- if (Object.keys(data).length === 0)
- return true;
- return false;
-}
-var textDecoder = typeof TextDecoder === "undefined" ? null : new TextDecoder;
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/foreign-keys.js
-class ForeignKeyBuilder {
- static [entityKind] = "SQLiteForeignKeyBuilder";
- reference;
- _onUpdate;
- _onDelete;
- constructor(config, actions) {
- this.reference = () => {
- const { name, columns, foreignColumns } = config();
- return { name, columns, foreignTable: foreignColumns[0].table, foreignColumns };
- };
- if (actions) {
- this._onUpdate = actions.onUpdate;
- this._onDelete = actions.onDelete;
- }
- }
- onUpdate(action) {
- this._onUpdate = action;
- return this;
- }
- onDelete(action) {
- this._onDelete = action;
- return this;
- }
- build(table) {
- return new ForeignKey(table, this);
- }
-}
-
-class ForeignKey {
- constructor(table, builder) {
- this.table = table;
- this.reference = builder.reference;
- this.onUpdate = builder._onUpdate;
- this.onDelete = builder._onDelete;
- }
- static [entityKind] = "SQLiteForeignKey";
- reference;
- onUpdate;
- onDelete;
- getName() {
- const { name, columns, foreignColumns } = this.reference();
- const columnNames = columns.map((column) => column.name);
- const foreignColumnNames = foreignColumns.map((column) => column.name);
- const chunks = [
- this.table[TableName],
- ...columnNames,
- foreignColumns[0].table[TableName],
- ...foreignColumnNames
- ];
- return name ?? `${chunks.join("_")}_fk`;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/unique-constraint.js
-function uniqueKeyName2(table, columns) {
- return `${table[TableName]}_${columns.join("_")}_unique`;
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/common.js
-class SQLiteColumnBuilder extends ColumnBuilder {
- static [entityKind] = "SQLiteColumnBuilder";
- foreignKeyConfigs = [];
- references(ref, actions = {}) {
- this.foreignKeyConfigs.push({ ref, actions });
- return this;
- }
- unique(name) {
- this.config.isUnique = true;
- this.config.uniqueName = name;
- return this;
- }
- generatedAlwaysAs(as, config) {
- this.config.generated = {
- as,
- type: "always",
- mode: config?.mode ?? "virtual"
- };
- return this;
- }
- buildForeignKeys(column, table) {
- return this.foreignKeyConfigs.map(({ ref, actions }) => {
- return ((ref2, actions2) => {
- const builder = new ForeignKeyBuilder(() => {
- const foreignColumn = ref2();
- return { columns: [column], foreignColumns: [foreignColumn] };
- });
- if (actions2.onUpdate) {
- builder.onUpdate(actions2.onUpdate);
- }
- if (actions2.onDelete) {
- builder.onDelete(actions2.onDelete);
- }
- return builder.build(table);
- })(ref, actions);
- });
- }
-}
-
-class SQLiteColumn extends Column {
- constructor(table, config) {
- if (!config.uniqueName) {
- config.uniqueName = uniqueKeyName2(table, [config.name]);
- }
- super(table, config);
- this.table = table;
- }
- static [entityKind] = "SQLiteColumn";
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/blob.js
-class SQLiteBigIntBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBigIntBuilder";
- constructor(name) {
- super(name, "bigint", "SQLiteBigInt");
- }
- build(table) {
- return new SQLiteBigInt(table, this.config);
- }
-}
-
-class SQLiteBigInt extends SQLiteColumn {
- static [entityKind] = "SQLiteBigInt";
- getSQLType() {
- return "blob";
- }
- mapFromDriverValue(value) {
- if (typeof Buffer !== "undefined" && Buffer.from) {
- const buf = Buffer.isBuffer(value) ? value : value instanceof ArrayBuffer ? Buffer.from(value) : value.buffer ? Buffer.from(value.buffer, value.byteOffset, value.byteLength) : Buffer.from(value);
- return BigInt(buf.toString("utf8"));
- }
- return BigInt(textDecoder.decode(value));
- }
- mapToDriverValue(value) {
- return Buffer.from(value.toString());
- }
-}
-
-class SQLiteBlobJsonBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBlobJsonBuilder";
- constructor(name) {
- super(name, "json", "SQLiteBlobJson");
- }
- build(table) {
- return new SQLiteBlobJson(table, this.config);
- }
-}
-
-class SQLiteBlobJson extends SQLiteColumn {
- static [entityKind] = "SQLiteBlobJson";
- getSQLType() {
- return "blob";
- }
- mapFromDriverValue(value) {
- if (typeof Buffer !== "undefined" && Buffer.from) {
- const buf = Buffer.isBuffer(value) ? value : value instanceof ArrayBuffer ? Buffer.from(value) : value.buffer ? Buffer.from(value.buffer, value.byteOffset, value.byteLength) : Buffer.from(value);
- return JSON.parse(buf.toString("utf8"));
- }
- return JSON.parse(textDecoder.decode(value));
- }
- mapToDriverValue(value) {
- return Buffer.from(JSON.stringify(value));
- }
-}
-
-class SQLiteBlobBufferBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBlobBufferBuilder";
- constructor(name) {
- super(name, "buffer", "SQLiteBlobBuffer");
- }
- build(table) {
- return new SQLiteBlobBuffer(table, this.config);
- }
-}
-
-class SQLiteBlobBuffer extends SQLiteColumn {
- static [entityKind] = "SQLiteBlobBuffer";
- mapFromDriverValue(value) {
- if (Buffer.isBuffer(value)) {
- return value;
- }
- return Buffer.from(value);
- }
- getSQLType() {
- return "blob";
- }
-}
-function blob(a, b) {
- const { name, config } = getColumnNameAndConfig(a, b);
- if (config?.mode === "json") {
- return new SQLiteBlobJsonBuilder(name);
- }
- if (config?.mode === "bigint") {
- return new SQLiteBigIntBuilder(name);
- }
- return new SQLiteBlobBufferBuilder(name);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/custom.js
-class SQLiteCustomColumnBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteCustomColumnBuilder";
- constructor(name, fieldConfig, customTypeParams) {
- super(name, "custom", "SQLiteCustomColumn");
- this.config.fieldConfig = fieldConfig;
- this.config.customTypeParams = customTypeParams;
- }
- build(table) {
- return new SQLiteCustomColumn(table, this.config);
- }
-}
-
-class SQLiteCustomColumn extends SQLiteColumn {
- static [entityKind] = "SQLiteCustomColumn";
- sqlName;
- mapTo;
- mapFrom;
- constructor(table, config) {
- super(table, config);
- this.sqlName = config.customTypeParams.dataType(config.fieldConfig);
- this.mapTo = config.customTypeParams.toDriver;
- this.mapFrom = config.customTypeParams.fromDriver;
- }
- getSQLType() {
- return this.sqlName;
- }
- mapFromDriverValue(value) {
- return typeof this.mapFrom === "function" ? this.mapFrom(value) : value;
- }
- mapToDriverValue(value) {
- return typeof this.mapTo === "function" ? this.mapTo(value) : value;
- }
-}
-function customType(customTypeParams) {
- return (a, b) => {
- const { name, config } = getColumnNameAndConfig(a, b);
- return new SQLiteCustomColumnBuilder(name, config, customTypeParams);
- };
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/integer.js
-class SQLiteBaseIntegerBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBaseIntegerBuilder";
- constructor(name, dataType, columnType) {
- super(name, dataType, columnType);
- this.config.autoIncrement = false;
- }
- primaryKey(config) {
- if (config?.autoIncrement) {
- this.config.autoIncrement = true;
- }
- this.config.hasDefault = true;
- return super.primaryKey();
- }
-}
-
-class SQLiteBaseInteger extends SQLiteColumn {
- static [entityKind] = "SQLiteBaseInteger";
- autoIncrement = this.config.autoIncrement;
- getSQLType() {
- return "integer";
- }
-}
-
-class SQLiteIntegerBuilder extends SQLiteBaseIntegerBuilder {
- static [entityKind] = "SQLiteIntegerBuilder";
- constructor(name) {
- super(name, "number", "SQLiteInteger");
- }
- build(table) {
- return new SQLiteInteger(table, this.config);
- }
-}
-
-class SQLiteInteger extends SQLiteBaseInteger {
- static [entityKind] = "SQLiteInteger";
-}
-
-class SQLiteTimestampBuilder extends SQLiteBaseIntegerBuilder {
- static [entityKind] = "SQLiteTimestampBuilder";
- constructor(name, mode) {
- super(name, "date", "SQLiteTimestamp");
- this.config.mode = mode;
- }
- defaultNow() {
- return this.default(sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`);
- }
- build(table) {
- return new SQLiteTimestamp(table, this.config);
- }
-}
-
-class SQLiteTimestamp extends SQLiteBaseInteger {
- static [entityKind] = "SQLiteTimestamp";
- mode = this.config.mode;
- mapFromDriverValue(value) {
- if (this.config.mode === "timestamp") {
- return new Date(value * 1000);
- }
- return new Date(value);
- }
- mapToDriverValue(value) {
- const unix = value.getTime();
- if (this.config.mode === "timestamp") {
- return Math.floor(unix / 1000);
- }
- return unix;
- }
-}
-
-class SQLiteBooleanBuilder extends SQLiteBaseIntegerBuilder {
- static [entityKind] = "SQLiteBooleanBuilder";
- constructor(name, mode) {
- super(name, "boolean", "SQLiteBoolean");
- this.config.mode = mode;
- }
- build(table) {
- return new SQLiteBoolean(table, this.config);
- }
-}
-
-class SQLiteBoolean extends SQLiteBaseInteger {
- static [entityKind] = "SQLiteBoolean";
- mode = this.config.mode;
- mapFromDriverValue(value) {
- return Number(value) === 1;
- }
- mapToDriverValue(value) {
- return value ? 1 : 0;
- }
-}
-function integer(a, b) {
- const { name, config } = getColumnNameAndConfig(a, b);
- if (config?.mode === "timestamp" || config?.mode === "timestamp_ms") {
- return new SQLiteTimestampBuilder(name, config.mode);
- }
- if (config?.mode === "boolean") {
- return new SQLiteBooleanBuilder(name, config.mode);
- }
- return new SQLiteIntegerBuilder(name);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/numeric.js
-class SQLiteNumericBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteNumericBuilder";
- constructor(name) {
- super(name, "string", "SQLiteNumeric");
- }
- build(table) {
- return new SQLiteNumeric(table, this.config);
- }
-}
-
-class SQLiteNumeric extends SQLiteColumn {
- static [entityKind] = "SQLiteNumeric";
- mapFromDriverValue(value) {
- if (typeof value === "string")
- return value;
- return String(value);
- }
- getSQLType() {
- return "numeric";
- }
-}
-
-class SQLiteNumericNumberBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteNumericNumberBuilder";
- constructor(name) {
- super(name, "number", "SQLiteNumericNumber");
- }
- build(table) {
- return new SQLiteNumericNumber(table, this.config);
- }
-}
-
-class SQLiteNumericNumber extends SQLiteColumn {
- static [entityKind] = "SQLiteNumericNumber";
- mapFromDriverValue(value) {
- if (typeof value === "number")
- return value;
- return Number(value);
- }
- mapToDriverValue = String;
- getSQLType() {
- return "numeric";
- }
-}
-
-class SQLiteNumericBigIntBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteNumericBigIntBuilder";
- constructor(name) {
- super(name, "bigint", "SQLiteNumericBigInt");
- }
- build(table) {
- return new SQLiteNumericBigInt(table, this.config);
- }
-}
-
-class SQLiteNumericBigInt extends SQLiteColumn {
- static [entityKind] = "SQLiteNumericBigInt";
- mapFromDriverValue = BigInt;
- mapToDriverValue = String;
- getSQLType() {
- return "numeric";
- }
-}
-function numeric(a, b) {
- const { name, config } = getColumnNameAndConfig(a, b);
- const mode = config?.mode;
- return mode === "number" ? new SQLiteNumericNumberBuilder(name) : mode === "bigint" ? new SQLiteNumericBigIntBuilder(name) : new SQLiteNumericBuilder(name);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/real.js
-class SQLiteRealBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteRealBuilder";
- constructor(name) {
- super(name, "number", "SQLiteReal");
- }
- build(table) {
- return new SQLiteReal(table, this.config);
- }
-}
-
-class SQLiteReal extends SQLiteColumn {
- static [entityKind] = "SQLiteReal";
- getSQLType() {
- return "real";
- }
-}
-function real(name) {
- return new SQLiteRealBuilder(name ?? "");
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/text.js
-class SQLiteTextBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteTextBuilder";
- constructor(name, config) {
- super(name, "string", "SQLiteText");
- this.config.enumValues = config.enum;
- this.config.length = config.length;
- }
- build(table) {
- return new SQLiteText(table, this.config);
- }
-}
-
-class SQLiteText extends SQLiteColumn {
- static [entityKind] = "SQLiteText";
- enumValues = this.config.enumValues;
- length = this.config.length;
- constructor(table, config) {
- super(table, config);
- }
- getSQLType() {
- return `text${this.config.length ? `(${this.config.length})` : ""}`;
- }
-}
-
-class SQLiteTextJsonBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteTextJsonBuilder";
- constructor(name) {
- super(name, "json", "SQLiteTextJson");
- }
- build(table) {
- return new SQLiteTextJson(table, this.config);
- }
-}
-
-class SQLiteTextJson extends SQLiteColumn {
- static [entityKind] = "SQLiteTextJson";
- getSQLType() {
- return "text";
- }
- mapFromDriverValue(value) {
- return JSON.parse(value);
- }
- mapToDriverValue(value) {
- return JSON.stringify(value);
- }
-}
-function text(a, b = {}) {
- const { name, config } = getColumnNameAndConfig(a, b);
- if (config.mode === "json") {
- return new SQLiteTextJsonBuilder(name);
- }
- return new SQLiteTextBuilder(name, config);
-}
-
-// ../eve/node_modules/drizzle-orm/selection-proxy.js
-class SelectionProxyHandler {
- static [entityKind] = "SelectionProxyHandler";
- config;
- constructor(config) {
- this.config = { ...config };
- }
- get(subquery, prop) {
- if (prop === "_") {
- return {
- ...subquery["_"],
- selectedFields: new Proxy(subquery._.selectedFields, this)
- };
- }
- if (prop === ViewBaseConfig) {
- return {
- ...subquery[ViewBaseConfig],
- selectedFields: new Proxy(subquery[ViewBaseConfig].selectedFields, this)
- };
- }
- if (typeof prop === "symbol") {
- return subquery[prop];
- }
- const columns = is(subquery, Subquery) ? subquery._.selectedFields : is(subquery, View) ? subquery[ViewBaseConfig].selectedFields : subquery;
- const value = columns[prop];
- if (is(value, SQL.Aliased)) {
- if (this.config.sqlAliasedBehavior === "sql" && !value.isSelectionField) {
- return value.sql;
- }
- const newValue = value.clone();
- newValue.isSelectionField = true;
- return newValue;
- }
- if (is(value, SQL)) {
- if (this.config.sqlBehavior === "sql") {
- return value;
- }
- throw new Error(`You tried to reference "${prop}" field from a subquery, which is a raw SQL field, but it doesn't have an alias declared. Please add an alias to the field using ".as('alias')" method.`);
- }
- if (is(value, Column)) {
- if (this.config.alias) {
- return new Proxy(value, new ColumnAliasProxyHandler(new Proxy(value.table, new TableAliasProxyHandler(this.config.alias, this.config.replaceOriginalName ?? false))));
- }
- return value;
- }
- if (typeof value !== "object" || value === null) {
- return value;
- }
- return new Proxy(value, new SelectionProxyHandler(this.config));
- }
-}
-
-// ../eve/node_modules/drizzle-orm/query-promise.js
-class QueryPromise {
- static [entityKind] = "QueryPromise";
- [Symbol.toStringTag] = "QueryPromise";
- catch(onRejected) {
- return this.then(undefined, onRejected);
- }
- finally(onFinally) {
- return this.then((value) => {
- onFinally?.();
- return value;
- }, (reason) => {
- onFinally?.();
- throw reason;
- });
- }
- then(onFulfilled, onRejected) {
- return this.execute().then(onFulfilled, onRejected);
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/all.js
-function getSQLiteColumnBuilders() {
- return {
- blob,
- customType,
- integer,
- numeric,
- real,
- text
- };
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/table.js
-var InlineForeignKeys = Symbol.for("drizzle:SQLiteInlineForeignKeys");
-
-class SQLiteTable extends Table {
- static [entityKind] = "SQLiteTable";
- static Symbol = Object.assign({}, Table.Symbol, {
- InlineForeignKeys
- });
- [Table.Symbol.Columns];
- [InlineForeignKeys] = [];
- [Table.Symbol.ExtraConfigBuilder] = undefined;
-}
-function sqliteTableBase(name, columns, extraConfig, schema, baseName = name) {
- const rawTable = new SQLiteTable(name, schema, baseName);
- const parsedColumns = typeof columns === "function" ? columns(getSQLiteColumnBuilders()) : columns;
- const builtColumns = Object.fromEntries(Object.entries(parsedColumns).map(([name2, colBuilderBase]) => {
- const colBuilder = colBuilderBase;
- colBuilder.setName(name2);
- const column = colBuilder.build(rawTable);
- rawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));
- return [name2, column];
- }));
- const table = Object.assign(rawTable, builtColumns);
- table[Table.Symbol.Columns] = builtColumns;
- table[Table.Symbol.ExtraConfigColumns] = builtColumns;
- if (extraConfig) {
- table[SQLiteTable.Symbol.ExtraConfigBuilder] = extraConfig;
- }
- return table;
-}
-var sqliteTable = (name, columns, extraConfig) => {
- return sqliteTableBase(name, columns, extraConfig);
-};
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/indexes.js
-class IndexBuilderOn {
- constructor(name, unique) {
- this.name = name;
- this.unique = unique;
- }
- static [entityKind] = "SQLiteIndexBuilderOn";
- on(...columns) {
- return new IndexBuilder(this.name, columns, this.unique);
- }
-}
-
-class IndexBuilder {
- static [entityKind] = "SQLiteIndexBuilder";
- config;
- constructor(name, columns, unique) {
- this.config = {
- name,
- columns,
- unique,
- where: undefined
- };
- }
- where(condition) {
- this.config.where = condition;
- return this;
- }
- build(table) {
- return new Index(this.config, table);
- }
-}
-
-class Index {
- static [entityKind] = "SQLiteIndex";
- config;
- constructor(config, table) {
- this.config = { ...config, table };
- }
-}
-function index(name) {
- return new IndexBuilderOn(name, false);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/utils.js
-function extractUsedTable(table) {
- if (is(table, SQLiteTable)) {
- return [`${table[Table.Symbol.BaseName]}`];
- }
- if (is(table, Subquery)) {
- return table._.usedTables ?? [];
- }
- if (is(table, SQL)) {
- return table.usedTables ?? [];
- }
- return [];
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js
-class SQLiteDeleteBase extends QueryPromise {
- constructor(table, session, dialect, withList) {
- super();
- this.table = table;
- this.session = session;
- this.dialect = dialect;
- this.config = { table, withList };
- }
- static [entityKind] = "SQLiteDelete";
- config;
- where(where) {
- this.config.where = where;
- return this;
- }
- orderBy(...columns) {
- if (typeof columns[0] === "function") {
- const orderBy = columns[0](new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
- this.config.orderBy = orderByArray;
- } else {
- const orderByArray = columns;
- this.config.orderBy = orderByArray;
- }
- return this;
- }
- limit(limit) {
- this.config.limit = limit;
- return this;
- }
- returning(fields = this.table[SQLiteTable.Symbol.Columns]) {
- this.config.returning = orderSelectedFields(fields);
- return this;
- }
- getSQL() {
- return this.dialect.buildDeleteQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- _prepare(isOneTimeQuery = true) {
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
- type: "delete",
- tables: extractUsedTable(this.config.table)
- });
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute(placeholderValues) {
- return this._prepare().execute(placeholderValues);
- }
- $dynamic() {
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/casing.js
-function toSnakeCase(input) {
- const words = input.replace(/['\u2019]/g, "").match(/[\da-z]+|[A-Z]+(?![a-z])|[A-Z][\da-z]+/g) ?? [];
- return words.map((word) => word.toLowerCase()).join("_");
-}
-function toCamelCase(input) {
- const words = input.replace(/['\u2019]/g, "").match(/[\da-z]+|[A-Z]+(?![a-z])|[A-Z][\da-z]+/g) ?? [];
- return words.reduce((acc, word, i) => {
- const formattedWord = i === 0 ? word.toLowerCase() : `${word[0].toUpperCase()}${word.slice(1)}`;
- return acc + formattedWord;
- }, "");
-}
-function noopCase(input) {
- return input;
-}
-
-class CasingCache {
- static [entityKind] = "CasingCache";
- cache = {};
- cachedTables = {};
- convert;
- constructor(casing) {
- this.convert = casing === "snake_case" ? toSnakeCase : casing === "camelCase" ? toCamelCase : noopCase;
- }
- getColumnCasing(column) {
- if (!column.keyAsName)
- return column.name;
- const schema = column.table[Table.Symbol.Schema] ?? "public";
- const tableName = column.table[Table.Symbol.OriginalName];
- const key = `${schema}.${tableName}.${column.name}`;
- if (!this.cache[key]) {
- this.cacheTable(column.table);
- }
- return this.cache[key];
- }
- cacheTable(table) {
- const schema = table[Table.Symbol.Schema] ?? "public";
- const tableName = table[Table.Symbol.OriginalName];
- const tableKey = `${schema}.${tableName}`;
- if (!this.cachedTables[tableKey]) {
- for (const column of Object.values(table[Table.Symbol.Columns])) {
- const columnKey = `${tableKey}.${column.name}`;
- this.cache[columnKey] = this.convert(column.name);
- }
- this.cachedTables[tableKey] = true;
- }
- }
- clearCache() {
- this.cache = {};
- this.cachedTables = {};
- }
-}
-
-// ../eve/node_modules/drizzle-orm/errors.js
-class DrizzleError extends Error {
- static [entityKind] = "DrizzleError";
- constructor({ message, cause }) {
- super(message);
- this.name = "DrizzleError";
- this.cause = cause;
- }
-}
-
-class DrizzleQueryError extends Error {
- constructor(query, params, cause) {
- super(`Failed query: ${query}
-params: ${params}`);
- this.query = query;
- this.params = params;
- this.cause = cause;
- Error.captureStackTrace(this, DrizzleQueryError);
- if (cause)
- this.cause = cause;
- }
-}
-
-class TransactionRollbackError extends DrizzleError {
- static [entityKind] = "TransactionRollbackError";
- constructor() {
- super({ message: "Rollback" });
- }
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/table.js
-var InlineForeignKeys2 = Symbol.for("drizzle:PgInlineForeignKeys");
-var EnableRLS = Symbol.for("drizzle:EnableRLS");
-
-class PgTable extends Table {
- static [entityKind] = "PgTable";
- static Symbol = Object.assign({}, Table.Symbol, {
- InlineForeignKeys: InlineForeignKeys2,
- EnableRLS
- });
- [InlineForeignKeys2] = [];
- [EnableRLS] = false;
- [Table.Symbol.ExtraConfigBuilder] = undefined;
- [Table.Symbol.ExtraConfigColumns] = {};
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/primary-keys.js
-class PrimaryKeyBuilder {
- static [entityKind] = "PgPrimaryKeyBuilder";
- columns;
- name;
- constructor(columns, name) {
- this.columns = columns;
- this.name = name;
- }
- build(table) {
- return new PrimaryKey(table, this.columns, this.name);
- }
-}
-
-class PrimaryKey {
- constructor(table, columns, name) {
- this.table = table;
- this.columns = columns;
- this.name = name;
- }
- static [entityKind] = "PgPrimaryKey";
- columns;
- name;
- getName() {
- return this.name ?? `${this.table[PgTable.Symbol.Name]}_${this.columns.map((column) => column.name).join("_")}_pk`;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sql/expressions/conditions.js
-function bindIfParam(value, column) {
- if (isDriverValueEncoder(column) && !isSQLWrapper(value) && !is(value, Param) && !is(value, Placeholder) && !is(value, Column) && !is(value, Table) && !is(value, View)) {
- return new Param(value, column);
- }
- return value;
-}
-var eq = (left, right) => {
- return sql`${left} = ${bindIfParam(right, left)}`;
-};
-var ne = (left, right) => {
- return sql`${left} <> ${bindIfParam(right, left)}`;
-};
-function and(...unfilteredConditions) {
- const conditions = unfilteredConditions.filter((c) => c !== undefined);
- if (conditions.length === 0) {
- return;
- }
- if (conditions.length === 1) {
- return new SQL(conditions);
- }
- return new SQL([
- new StringChunk("("),
- sql.join(conditions, new StringChunk(" and ")),
- new StringChunk(")")
- ]);
-}
-function or(...unfilteredConditions) {
- const conditions = unfilteredConditions.filter((c) => c !== undefined);
- if (conditions.length === 0) {
- return;
- }
- if (conditions.length === 1) {
- return new SQL(conditions);
- }
- return new SQL([
- new StringChunk("("),
- sql.join(conditions, new StringChunk(" or ")),
- new StringChunk(")")
- ]);
-}
-function not(condition) {
- return sql`not ${condition}`;
-}
-var gt = (left, right) => {
- return sql`${left} > ${bindIfParam(right, left)}`;
-};
-var gte = (left, right) => {
- return sql`${left} >= ${bindIfParam(right, left)}`;
-};
-var lt = (left, right) => {
- return sql`${left} < ${bindIfParam(right, left)}`;
-};
-var lte = (left, right) => {
- return sql`${left} <= ${bindIfParam(right, left)}`;
-};
-function inArray(column, values) {
- if (Array.isArray(values)) {
- if (values.length === 0) {
- return sql`false`;
- }
- return sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;
- }
- return sql`${column} in ${bindIfParam(values, column)}`;
-}
-function notInArray(column, values) {
- if (Array.isArray(values)) {
- if (values.length === 0) {
- return sql`true`;
- }
- return sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;
- }
- return sql`${column} not in ${bindIfParam(values, column)}`;
-}
-function isNull(value) {
- return sql`${value} is null`;
-}
-function isNotNull(value) {
- return sql`${value} is not null`;
-}
-function exists(subquery) {
- return sql`exists ${subquery}`;
-}
-function notExists(subquery) {
- return sql`not exists ${subquery}`;
-}
-function between(column, min, max) {
- return sql`${column} between ${bindIfParam(min, column)} and ${bindIfParam(max, column)}`;
-}
-function notBetween(column, min, max) {
- return sql`${column} not between ${bindIfParam(min, column)} and ${bindIfParam(max, column)}`;
-}
-function like(column, value) {
- return sql`${column} like ${value}`;
-}
-function notLike(column, value) {
- return sql`${column} not like ${value}`;
-}
-function ilike(column, value) {
- return sql`${column} ilike ${value}`;
-}
-function notIlike(column, value) {
- return sql`${column} not ilike ${value}`;
-}
-
-// ../eve/node_modules/drizzle-orm/sql/expressions/select.js
-function asc(column) {
- return sql`${column} asc`;
-}
-function desc(column) {
- return sql`${column} desc`;
-}
-
-// ../eve/node_modules/drizzle-orm/relations.js
-class Relation {
- constructor(sourceTable, referencedTable, relationName) {
- this.sourceTable = sourceTable;
- this.referencedTable = referencedTable;
- this.relationName = relationName;
- this.referencedTableName = referencedTable[Table.Symbol.Name];
- }
- static [entityKind] = "Relation";
- referencedTableName;
- fieldName;
-}
-
-class Relations {
- constructor(table, config) {
- this.table = table;
- this.config = config;
- }
- static [entityKind] = "Relations";
-}
-
-class One extends Relation {
- constructor(sourceTable, referencedTable, config, isNullable) {
- super(sourceTable, referencedTable, config?.relationName);
- this.config = config;
- this.isNullable = isNullable;
- }
- static [entityKind] = "One";
- withFieldName(fieldName) {
- const relation = new One(this.sourceTable, this.referencedTable, this.config, this.isNullable);
- relation.fieldName = fieldName;
- return relation;
- }
-}
-
-class Many extends Relation {
- constructor(sourceTable, referencedTable, config) {
- super(sourceTable, referencedTable, config?.relationName);
- this.config = config;
- }
- static [entityKind] = "Many";
- withFieldName(fieldName) {
- const relation = new Many(this.sourceTable, this.referencedTable, this.config);
- relation.fieldName = fieldName;
- return relation;
- }
-}
-function getOperators() {
- return {
- and,
- between,
- eq,
- exists,
- gt,
- gte,
- ilike,
- inArray,
- isNull,
- isNotNull,
- like,
- lt,
- lte,
- ne,
- not,
- notBetween,
- notExists,
- notLike,
- notIlike,
- notInArray,
- or,
- sql
- };
-}
-function getOrderByOperators() {
- return {
- sql,
- asc,
- desc
- };
-}
-function extractTablesRelationalConfig(schema, configHelpers) {
- if (Object.keys(schema).length === 1 && "default" in schema && !is(schema["default"], Table)) {
- schema = schema["default"];
- }
- const tableNamesMap = {};
- const relationsBuffer = {};
- const tablesConfig = {};
- for (const [key, value] of Object.entries(schema)) {
- if (is(value, Table)) {
- const dbName = getTableUniqueName(value);
- const bufferedRelations = relationsBuffer[dbName];
- tableNamesMap[dbName] = key;
- tablesConfig[key] = {
- tsName: key,
- dbName: value[Table.Symbol.Name],
- schema: value[Table.Symbol.Schema],
- columns: value[Table.Symbol.Columns],
- relations: bufferedRelations?.relations ?? {},
- primaryKey: bufferedRelations?.primaryKey ?? []
- };
- for (const column of Object.values(value[Table.Symbol.Columns])) {
- if (column.primary) {
- tablesConfig[key].primaryKey.push(column);
- }
- }
- const extraConfig = value[Table.Symbol.ExtraConfigBuilder]?.(value[Table.Symbol.ExtraConfigColumns]);
- if (extraConfig) {
- for (const configEntry of Object.values(extraConfig)) {
- if (is(configEntry, PrimaryKeyBuilder)) {
- tablesConfig[key].primaryKey.push(...configEntry.columns);
- }
- }
- }
- } else if (is(value, Relations)) {
- const dbName = getTableUniqueName(value.table);
- const tableName = tableNamesMap[dbName];
- const relations2 = value.config(configHelpers(value.table));
- let primaryKey;
- for (const [relationName, relation] of Object.entries(relations2)) {
- if (tableName) {
- const tableConfig = tablesConfig[tableName];
- tableConfig.relations[relationName] = relation;
- if (primaryKey) {
- tableConfig.primaryKey.push(...primaryKey);
- }
- } else {
- if (!(dbName in relationsBuffer)) {
- relationsBuffer[dbName] = {
- relations: {},
- primaryKey
- };
- }
- relationsBuffer[dbName].relations[relationName] = relation;
- }
- }
- }
- }
- return { tables: tablesConfig, tableNamesMap };
-}
-function relations(table, relations2) {
- return new Relations(table, (helpers) => Object.fromEntries(Object.entries(relations2(helpers)).map(([key, value]) => [
- key,
- value.withFieldName(key)
- ])));
-}
-function createOne(sourceTable) {
- return function one(table, config) {
- return new One(sourceTable, table, config, config?.fields.reduce((res, f) => res && f.notNull, true) ?? false);
- };
-}
-function createMany(sourceTable) {
- return function many(referencedTable, config) {
- return new Many(sourceTable, referencedTable, config);
- };
-}
-function normalizeRelation(schema, tableNamesMap, relation) {
- if (is(relation, One) && relation.config) {
- return {
- fields: relation.config.fields,
- references: relation.config.references
- };
- }
- const referencedTableTsName = tableNamesMap[getTableUniqueName(relation.referencedTable)];
- if (!referencedTableTsName) {
- throw new Error(`Table "${relation.referencedTable[Table.Symbol.Name]}" not found in schema`);
- }
- const referencedTableConfig = schema[referencedTableTsName];
- if (!referencedTableConfig) {
- throw new Error(`Table "${referencedTableTsName}" not found in schema`);
- }
- const sourceTable = relation.sourceTable;
- const sourceTableTsName = tableNamesMap[getTableUniqueName(sourceTable)];
- if (!sourceTableTsName) {
- throw new Error(`Table "${sourceTable[Table.Symbol.Name]}" not found in schema`);
- }
- const reverseRelations = [];
- for (const referencedTableRelation of Object.values(referencedTableConfig.relations)) {
- if (relation.relationName && relation !== referencedTableRelation && referencedTableRelation.relationName === relation.relationName || !relation.relationName && referencedTableRelation.referencedTable === relation.sourceTable) {
- reverseRelations.push(referencedTableRelation);
- }
- }
- if (reverseRelations.length > 1) {
- throw relation.relationName ? new Error(`There are multiple relations with name "${relation.relationName}" in table "${referencedTableTsName}"`) : new Error(`There are multiple relations between "${referencedTableTsName}" and "${relation.sourceTable[Table.Symbol.Name]}". Please specify relation name`);
- }
- if (reverseRelations[0] && is(reverseRelations[0], One) && reverseRelations[0].config) {
- return {
- fields: reverseRelations[0].config.references,
- references: reverseRelations[0].config.fields
- };
- }
- throw new Error(`There is not enough information to infer relation "${sourceTableTsName}.${relation.fieldName}"`);
-}
-function createTableRelationsHelpers(sourceTable) {
- return {
- one: createOne(sourceTable),
- many: createMany(sourceTable)
- };
-}
-function mapRelationalRow(tablesConfig, tableConfig, row, buildQueryResultSelection, mapColumnValue = (value) => value) {
- const result = {};
- for (const [
- selectionItemIndex,
- selectionItem
- ] of buildQueryResultSelection.entries()) {
- if (selectionItem.isJson) {
- const relation = tableConfig.relations[selectionItem.tsKey];
- const rawSubRows = row[selectionItemIndex];
- const subRows = typeof rawSubRows === "string" ? JSON.parse(rawSubRows) : rawSubRows;
- result[selectionItem.tsKey] = is(relation, One) ? subRows && mapRelationalRow(tablesConfig, tablesConfig[selectionItem.relationTableTsKey], subRows, selectionItem.selection, mapColumnValue) : subRows.map((subRow) => mapRelationalRow(tablesConfig, tablesConfig[selectionItem.relationTableTsKey], subRow, selectionItem.selection, mapColumnValue));
- } else {
- const value = mapColumnValue(row[selectionItemIndex]);
- const field = selectionItem.field;
- let decoder;
- if (is(field, Column)) {
- decoder = field;
- } else if (is(field, SQL)) {
- decoder = field.decoder;
- } else {
- decoder = field.sql.decoder;
- }
- result[selectionItem.tsKey] = value === null ? null : decoder.mapFromDriverValue(value);
- }
- }
- return result;
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/view-base.js
-class SQLiteViewBase extends View {
- static [entityKind] = "SQLiteViewBase";
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/dialect.js
-class SQLiteDialect {
- static [entityKind] = "SQLiteDialect";
- casing;
- constructor(config) {
- this.casing = new CasingCache(config?.casing);
- }
- escapeName(name) {
- return `"${name}"`;
- }
- escapeParam(_num) {
- return "?";
- }
- escapeString(str) {
- return `'${str.replace(/'/g, "''")}'`;
- }
- buildWithCTE(queries) {
- if (!queries?.length)
- return;
- const withSqlChunks = [sql`with `];
- for (const [i, w] of queries.entries()) {
- withSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);
- if (i < queries.length - 1) {
- withSqlChunks.push(sql`, `);
- }
- }
- withSqlChunks.push(sql` `);
- return sql.join(withSqlChunks);
- }
- buildDeleteQuery({ table, where, returning, withList, limit, orderBy }) {
- const withSql = this.buildWithCTE(withList);
- const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
- const whereSql = where ? sql` where ${where}` : undefined;
- const orderBySql = this.buildOrderBy(orderBy);
- const limitSql = this.buildLimit(limit);
- return sql`${withSql}delete from ${table}${whereSql}${returningSql}${orderBySql}${limitSql}`;
- }
- buildUpdateSet(table, set) {
- const tableColumns = table[Table.Symbol.Columns];
- const columnNames = Object.keys(tableColumns).filter((colName) => set[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined);
- const setSize = columnNames.length;
- return sql.join(columnNames.flatMap((colName, i) => {
- const col = tableColumns[colName];
- const value = set[colName] ?? sql.param(col.onUpdateFn(), col);
- const res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;
- if (i < setSize - 1) {
- return [res, sql.raw(", ")];
- }
- return [res];
- }));
- }
- buildUpdateQuery({ table, set, where, returning, withList, joins, from, limit, orderBy }) {
- const withSql = this.buildWithCTE(withList);
- const setSql = this.buildUpdateSet(table, set);
- const fromSql = from && sql.join([sql.raw(" from "), this.buildFromTable(from)]);
- const joinsSql = this.buildJoins(joins);
- const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
- const whereSql = where ? sql` where ${where}` : undefined;
- const orderBySql = this.buildOrderBy(orderBy);
- const limitSql = this.buildLimit(limit);
- return sql`${withSql}update ${table} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}${orderBySql}${limitSql}`;
- }
- buildSelection(fields, { isSingleTable = false } = {}) {
- const columnsLen = fields.length;
- const chunks = fields.flatMap(({ field }, i) => {
- const chunk = [];
- if (is(field, SQL.Aliased) && field.isSelectionField) {
- chunk.push(sql.identifier(field.fieldAlias));
- } else if (is(field, SQL.Aliased) || is(field, SQL)) {
- const query = is(field, SQL.Aliased) ? field.sql : field;
- if (isSingleTable) {
- chunk.push(new SQL(query.queryChunks.map((c) => {
- if (is(c, Column)) {
- return sql.identifier(this.casing.getColumnCasing(c));
- }
- return c;
- })));
- } else {
- chunk.push(query);
- }
- if (is(field, SQL.Aliased)) {
- chunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);
- }
- } else if (is(field, Column)) {
- const tableName = field.table[Table.Symbol.Name];
- if (field.columnType === "SQLiteNumericBigInt") {
- if (isSingleTable) {
- chunk.push(sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`);
- } else {
- chunk.push(sql`cast(${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))} as text)`);
- }
- } else {
- if (isSingleTable) {
- chunk.push(sql.identifier(this.casing.getColumnCasing(field)));
- } else {
- chunk.push(sql`${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))}`);
- }
- }
- }
- if (i < columnsLen - 1) {
- chunk.push(sql`, `);
- }
- return chunk;
- });
- return sql.join(chunks);
- }
- buildJoins(joins) {
- if (!joins || joins.length === 0) {
- return;
- }
- const joinsArray = [];
- if (joins) {
- for (const [index2, joinMeta] of joins.entries()) {
- if (index2 === 0) {
- joinsArray.push(sql` `);
- }
- const table = joinMeta.table;
- const onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;
- if (is(table, SQLiteTable)) {
- const tableName = table[SQLiteTable.Symbol.Name];
- const tableSchema = table[SQLiteTable.Symbol.Schema];
- const origTableName = table[SQLiteTable.Symbol.OriginalName];
- const alias = tableName === origTableName ? undefined : joinMeta.alias;
- joinsArray.push(sql`${sql.raw(joinMeta.joinType)} join ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${sql.identifier(origTableName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`);
- } else {
- joinsArray.push(sql`${sql.raw(joinMeta.joinType)} join ${table}${onSql}`);
- }
- if (index2 < joins.length - 1) {
- joinsArray.push(sql` `);
- }
- }
- }
- return sql.join(joinsArray);
- }
- buildLimit(limit) {
- return typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : undefined;
- }
- buildOrderBy(orderBy) {
- const orderByList = [];
- if (orderBy) {
- for (const [index2, orderByValue] of orderBy.entries()) {
- orderByList.push(orderByValue);
- if (index2 < orderBy.length - 1) {
- orderByList.push(sql`, `);
- }
- }
- }
- return orderByList.length > 0 ? sql` order by ${sql.join(orderByList)}` : undefined;
- }
- buildFromTable(table) {
- if (is(table, Table) && table[Table.Symbol.IsAlias]) {
- return sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? "")}.`.if(table[Table.Symbol.Schema])}${sql.identifier(table[Table.Symbol.OriginalName])} ${sql.identifier(table[Table.Symbol.Name])}`;
- }
- return table;
- }
- buildSelectQuery({
- withList,
- fields,
- fieldsFlat,
- where,
- having,
- table,
- joins,
- orderBy,
- groupBy,
- limit,
- offset,
- distinct,
- setOperators
- }) {
- const fieldsList = fieldsFlat ?? orderSelectedFields(fields);
- for (const f of fieldsList) {
- if (is(f.field, Column) && getTableName(f.field.table) !== (is(table, Subquery) ? table._.alias : is(table, SQLiteViewBase) ? table[ViewBaseConfig].name : is(table, SQL) ? undefined : getTableName(table)) && !((table2) => joins?.some(({ alias }) => alias === (table2[Table.Symbol.IsAlias] ? getTableName(table2) : table2[Table.Symbol.BaseName])))(f.field.table)) {
- const tableName = getTableName(f.field.table);
- throw new Error(`Your "${f.path.join("->")}" field references a column "${tableName}"."${f.field.name}", but the table "${tableName}" is not part of the query! Did you forget to join it?`);
- }
- }
- const isSingleTable = !joins || joins.length === 0;
- const withSql = this.buildWithCTE(withList);
- const distinctSql = distinct ? sql` distinct` : undefined;
- const selection = this.buildSelection(fieldsList, { isSingleTable });
- const tableSql = this.buildFromTable(table);
- const joinsSql = this.buildJoins(joins);
- const whereSql = where ? sql` where ${where}` : undefined;
- const havingSql = having ? sql` having ${having}` : undefined;
- const groupByList = [];
- if (groupBy) {
- for (const [index2, groupByValue] of groupBy.entries()) {
- groupByList.push(groupByValue);
- if (index2 < groupBy.length - 1) {
- groupByList.push(sql`, `);
- }
- }
- }
- const groupBySql = groupByList.length > 0 ? sql` group by ${sql.join(groupByList)}` : undefined;
- const orderBySql = this.buildOrderBy(orderBy);
- const limitSql = this.buildLimit(limit);
- const offsetSql = offset ? sql` offset ${offset}` : undefined;
- const finalQuery = sql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}`;
- if (setOperators.length > 0) {
- return this.buildSetOperations(finalQuery, setOperators);
- }
- return finalQuery;
- }
- buildSetOperations(leftSelect, setOperators) {
- const [setOperator, ...rest] = setOperators;
- if (!setOperator) {
- throw new Error("Cannot pass undefined values to any set operator");
- }
- if (rest.length === 0) {
- return this.buildSetOperationQuery({ leftSelect, setOperator });
- }
- return this.buildSetOperations(this.buildSetOperationQuery({ leftSelect, setOperator }), rest);
- }
- buildSetOperationQuery({
- leftSelect,
- setOperator: { type, isAll, rightSelect, limit, orderBy, offset }
- }) {
- const leftChunk = sql`${leftSelect.getSQL()} `;
- const rightChunk = sql`${rightSelect.getSQL()}`;
- let orderBySql;
- if (orderBy && orderBy.length > 0) {
- const orderByValues = [];
- for (const singleOrderBy of orderBy) {
- if (is(singleOrderBy, SQLiteColumn)) {
- orderByValues.push(sql.identifier(singleOrderBy.name));
- } else if (is(singleOrderBy, SQL)) {
- for (let i = 0;i < singleOrderBy.queryChunks.length; i++) {
- const chunk = singleOrderBy.queryChunks[i];
- if (is(chunk, SQLiteColumn)) {
- singleOrderBy.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk));
- }
- }
- orderByValues.push(sql`${singleOrderBy}`);
- } else {
- orderByValues.push(sql`${singleOrderBy}`);
- }
- }
- orderBySql = sql` order by ${sql.join(orderByValues, sql`, `)}`;
- }
- const limitSql = typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : undefined;
- const operatorChunk = sql.raw(`${type} ${isAll ? "all " : ""}`);
- const offsetSql = offset ? sql` offset ${offset}` : undefined;
- return sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;
- }
- buildInsertQuery({ table, values: valuesOrSelect, onConflict, returning, withList, select }) {
- const valuesSqlList = [];
- const columns = table[Table.Symbol.Columns];
- const colEntries = Object.entries(columns).filter(([_, col]) => !col.shouldDisableInsert());
- const insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));
- if (select) {
- const select2 = valuesOrSelect;
- if (is(select2, SQL)) {
- valuesSqlList.push(select2);
- } else {
- valuesSqlList.push(select2.getSQL());
- }
- } else {
- const values = valuesOrSelect;
- valuesSqlList.push(sql.raw("values "));
- for (const [valueIndex, value] of values.entries()) {
- const valueList = [];
- for (const [fieldName, col] of colEntries) {
- const colValue = value[fieldName];
- if (colValue === undefined || is(colValue, Param) && colValue.value === undefined) {
- let defaultValue;
- if (col.default !== null && col.default !== undefined) {
- defaultValue = is(col.default, SQL) ? col.default : sql.param(col.default, col);
- } else if (col.defaultFn !== undefined) {
- const defaultFnResult = col.defaultFn();
- defaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);
- } else if (!col.default && col.onUpdateFn !== undefined) {
- const onUpdateFnResult = col.onUpdateFn();
- defaultValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);
- } else {
- defaultValue = sql`null`;
- }
- valueList.push(defaultValue);
- } else {
- valueList.push(colValue);
- }
- }
- valuesSqlList.push(valueList);
- if (valueIndex < values.length - 1) {
- valuesSqlList.push(sql`, `);
- }
- }
- }
- const withSql = this.buildWithCTE(withList);
- const valuesSql = sql.join(valuesSqlList);
- const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
- const onConflictSql = onConflict?.length ? sql.join(onConflict) : undefined;
- return sql`${withSql}insert into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${returningSql}`;
- }
- sqlToQuery(sql2, invokeSource) {
- return sql2.toQuery({
- casing: this.casing,
- escapeName: this.escapeName,
- escapeParam: this.escapeParam,
- escapeString: this.escapeString,
- invokeSource
- });
- }
- buildRelationalQuery({
- fullSchema,
- schema,
- tableNamesMap,
- table,
- tableConfig,
- queryConfig: config,
- tableAlias,
- nestedQueryRelation,
- joinOn
- }) {
- let selection = [];
- let limit, offset, orderBy = [], where;
- const joins = [];
- if (config === true) {
- const selectionEntries = Object.entries(tableConfig.columns);
- selection = selectionEntries.map(([key, value]) => ({
- dbKey: value.name,
- tsKey: key,
- field: aliasedTableColumn(value, tableAlias),
- relationTableTsKey: undefined,
- isJson: false,
- selection: []
- }));
- } else {
- const aliasedColumns = Object.fromEntries(Object.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]));
- if (config.where) {
- const whereSql = typeof config.where === "function" ? config.where(aliasedColumns, getOperators()) : config.where;
- where = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);
- }
- const fieldsSelection = [];
- let selectedColumns = [];
- if (config.columns) {
- let isIncludeMode = false;
- for (const [field, value] of Object.entries(config.columns)) {
- if (value === undefined) {
- continue;
- }
- if (field in tableConfig.columns) {
- if (!isIncludeMode && value === true) {
- isIncludeMode = true;
- }
- selectedColumns.push(field);
- }
- }
- if (selectedColumns.length > 0) {
- selectedColumns = isIncludeMode ? selectedColumns.filter((c) => config.columns?.[c] === true) : Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));
- }
- } else {
- selectedColumns = Object.keys(tableConfig.columns);
- }
- for (const field of selectedColumns) {
- const column = tableConfig.columns[field];
- fieldsSelection.push({ tsKey: field, value: column });
- }
- let selectedRelations = [];
- if (config.with) {
- selectedRelations = Object.entries(config.with).filter((entry) => !!entry[1]).map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey] }));
- }
- let extras;
- if (config.extras) {
- extras = typeof config.extras === "function" ? config.extras(aliasedColumns, { sql }) : config.extras;
- for (const [tsKey, value] of Object.entries(extras)) {
- fieldsSelection.push({
- tsKey,
- value: mapColumnsInAliasedSQLToAlias(value, tableAlias)
- });
- }
- }
- for (const { tsKey, value } of fieldsSelection) {
- selection.push({
- dbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey].name,
- tsKey,
- field: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,
- relationTableTsKey: undefined,
- isJson: false,
- selection: []
- });
- }
- let orderByOrig = typeof config.orderBy === "function" ? config.orderBy(aliasedColumns, getOrderByOperators()) : config.orderBy ?? [];
- if (!Array.isArray(orderByOrig)) {
- orderByOrig = [orderByOrig];
- }
- orderBy = orderByOrig.map((orderByValue) => {
- if (is(orderByValue, Column)) {
- return aliasedTableColumn(orderByValue, tableAlias);
- }
- return mapColumnsInSQLToAlias(orderByValue, tableAlias);
- });
- limit = config.limit;
- offset = config.offset;
- for (const {
- tsKey: selectedRelationTsKey,
- queryConfig: selectedRelationConfigValue,
- relation
- } of selectedRelations) {
- const normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);
- const relationTableName = getTableUniqueName(relation.referencedTable);
- const relationTableTsName = tableNamesMap[relationTableName];
- const relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;
- const joinOn2 = and(...normalizedRelation.fields.map((field2, i) => eq(aliasedTableColumn(normalizedRelation.references[i], relationTableAlias), aliasedTableColumn(field2, tableAlias))));
- const builtRelation = this.buildRelationalQuery({
- fullSchema,
- schema,
- tableNamesMap,
- table: fullSchema[relationTableTsName],
- tableConfig: schema[relationTableTsName],
- queryConfig: is(relation, One) ? selectedRelationConfigValue === true ? { limit: 1 } : { ...selectedRelationConfigValue, limit: 1 } : selectedRelationConfigValue,
- tableAlias: relationTableAlias,
- joinOn: joinOn2,
- nestedQueryRelation: relation
- });
- const field = sql`(${builtRelation.sql})`.as(selectedRelationTsKey);
- selection.push({
- dbKey: selectedRelationTsKey,
- tsKey: selectedRelationTsKey,
- field,
- relationTableTsKey: relationTableTsName,
- isJson: true,
- selection: builtRelation.selection
- });
- }
- }
- if (selection.length === 0) {
- throw new DrizzleError({
- message: `No fields selected for table "${tableConfig.tsName}" ("${tableAlias}"). You need to have at least one item in "columns", "with" or "extras". If you need to select all columns, omit the "columns" key or set it to undefined.`
- });
- }
- let result;
- where = and(joinOn, where);
- if (nestedQueryRelation) {
- let field = sql`json_array(${sql.join(selection.map(({ field: field2 }) => is(field2, SQLiteColumn) ? sql.identifier(this.casing.getColumnCasing(field2)) : is(field2, SQL.Aliased) ? field2.sql : field2), sql`, `)})`;
- if (is(nestedQueryRelation, Many)) {
- field = sql`coalesce(json_group_array(${field}), json_array())`;
- }
- const nestedSelection = [{
- dbKey: "data",
- tsKey: "data",
- field: field.as("data"),
- isJson: true,
- relationTableTsKey: tableConfig.tsName,
- selection
- }];
- const needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;
- if (needsSubquery) {
- result = this.buildSelectQuery({
- table: aliasedTable(table, tableAlias),
- fields: {},
- fieldsFlat: [
- {
- path: [],
- field: sql.raw("*")
- }
- ],
- where,
- limit,
- offset,
- orderBy,
- setOperators: []
- });
- where = undefined;
- limit = undefined;
- offset = undefined;
- orderBy = undefined;
- } else {
- result = aliasedTable(table, tableAlias);
- }
- result = this.buildSelectQuery({
- table: is(result, SQLiteTable) ? result : new Subquery(result, {}, tableAlias),
- fields: {},
- fieldsFlat: nestedSelection.map(({ field: field2 }) => ({
- path: [],
- field: is(field2, Column) ? aliasedTableColumn(field2, tableAlias) : field2
- })),
- joins,
- where,
- limit,
- offset,
- orderBy,
- setOperators: []
- });
- } else {
- result = this.buildSelectQuery({
- table: aliasedTable(table, tableAlias),
- fields: {},
- fieldsFlat: selection.map(({ field }) => ({
- path: [],
- field: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field
- })),
- joins,
- where,
- limit,
- offset,
- orderBy,
- setOperators: []
- });
- }
- return {
- tableTsKey: tableConfig.tsName,
- sql: result,
- selection
- };
- }
-}
-
-class SQLiteSyncDialect extends SQLiteDialect {
- static [entityKind] = "SQLiteSyncDialect";
- migrate(migrations, session, config) {
- const migrationsTable = config === undefined ? "__drizzle_migrations" : typeof config === "string" ? "__drizzle_migrations" : config.migrationsTable ?? "__drizzle_migrations";
- const migrationTableCreate = sql`
- CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (
- id SERIAL PRIMARY KEY,
- hash text NOT NULL,
- created_at numeric
- )
- `;
- session.run(migrationTableCreate);
- const dbMigrations = session.values(sql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`);
- const lastDbMigration = dbMigrations[0] ?? undefined;
- session.run(sql`BEGIN`);
- try {
- for (const migration of migrations) {
- if (!lastDbMigration || Number(lastDbMigration[2]) < migration.folderMillis) {
- for (const stmt of migration.sql) {
- session.run(sql.raw(stmt));
- }
- session.run(sql`INSERT INTO ${sql.identifier(migrationsTable)} ("hash", "created_at") VALUES(${migration.hash}, ${migration.folderMillis})`);
- }
- }
- session.run(sql`COMMIT`);
- } catch (e) {
- session.run(sql`ROLLBACK`);
- throw e;
- }
- }
-}
-
-// ../eve/node_modules/drizzle-orm/query-builders/query-builder.js
-class TypedQueryBuilder {
- static [entityKind] = "TypedQueryBuilder";
- getSelectedFields() {
- return this._.selectedFields;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/select.js
-class SQLiteSelectBuilder {
- static [entityKind] = "SQLiteSelectBuilder";
- fields;
- session;
- dialect;
- withList;
- distinct;
- constructor(config) {
- this.fields = config.fields;
- this.session = config.session;
- this.dialect = config.dialect;
- this.withList = config.withList;
- this.distinct = config.distinct;
- }
- from(source) {
- const isPartialSelect = !!this.fields;
- let fields;
- if (this.fields) {
- fields = this.fields;
- } else if (is(source, Subquery)) {
- fields = Object.fromEntries(Object.keys(source._.selectedFields).map((key) => [key, source[key]]));
- } else if (is(source, SQLiteViewBase)) {
- fields = source[ViewBaseConfig].selectedFields;
- } else if (is(source, SQL)) {
- fields = {};
- } else {
- fields = getTableColumns(source);
- }
- return new SQLiteSelectBase({
- table: source,
- fields,
- isPartialSelect,
- session: this.session,
- dialect: this.dialect,
- withList: this.withList,
- distinct: this.distinct
- });
- }
-}
-
-class SQLiteSelectQueryBuilderBase extends TypedQueryBuilder {
- static [entityKind] = "SQLiteSelectQueryBuilder";
- _;
- config;
- joinsNotNullableMap;
- tableName;
- isPartialSelect;
- session;
- dialect;
- cacheConfig = undefined;
- usedTables = /* @__PURE__ */ new Set;
- constructor({ table, fields, isPartialSelect, session, dialect, withList, distinct }) {
- super();
- this.config = {
- withList,
- table,
- fields: { ...fields },
- distinct,
- setOperators: []
- };
- this.isPartialSelect = isPartialSelect;
- this.session = session;
- this.dialect = dialect;
- this._ = {
- selectedFields: fields,
- config: this.config
- };
- this.tableName = getTableLikeName(table);
- this.joinsNotNullableMap = typeof this.tableName === "string" ? { [this.tableName]: true } : {};
- for (const item of extractUsedTable(table))
- this.usedTables.add(item);
- }
- getUsedTables() {
- return [...this.usedTables];
- }
- createJoin(joinType) {
- return (table, on) => {
- const baseTableName = this.tableName;
- const tableName = getTableLikeName(table);
- for (const item of extractUsedTable(table))
- this.usedTables.add(item);
- if (typeof tableName === "string" && this.config.joins?.some((join) => join.alias === tableName)) {
- throw new Error(`Alias "${tableName}" is already used in this query`);
- }
- if (!this.isPartialSelect) {
- if (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === "string") {
- this.config.fields = {
- [baseTableName]: this.config.fields
- };
- }
- if (typeof tableName === "string" && !is(table, SQL)) {
- const selection = is(table, Subquery) ? table._.selectedFields : is(table, View) ? table[ViewBaseConfig].selectedFields : table[Table.Symbol.Columns];
- this.config.fields[tableName] = selection;
- }
- }
- if (typeof on === "function") {
- on = on(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- if (!this.config.joins) {
- this.config.joins = [];
- }
- this.config.joins.push({ on, table, joinType, alias: tableName });
- if (typeof tableName === "string") {
- switch (joinType) {
- case "left": {
- this.joinsNotNullableMap[tableName] = false;
- break;
- }
- case "right": {
- this.joinsNotNullableMap = Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([key]) => [key, false]));
- this.joinsNotNullableMap[tableName] = true;
- break;
- }
- case "cross":
- case "inner": {
- this.joinsNotNullableMap[tableName] = true;
- break;
- }
- case "full": {
- this.joinsNotNullableMap = Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([key]) => [key, false]));
- this.joinsNotNullableMap[tableName] = false;
- break;
- }
- }
- }
- return this;
- };
- }
- leftJoin = this.createJoin("left");
- rightJoin = this.createJoin("right");
- innerJoin = this.createJoin("inner");
- fullJoin = this.createJoin("full");
- crossJoin = this.createJoin("cross");
- createSetOperator(type, isAll) {
- return (rightSelection) => {
- const rightSelect = typeof rightSelection === "function" ? rightSelection(getSQLiteSetOperators()) : rightSelection;
- if (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) {
- throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");
- }
- this.config.setOperators.push({ type, isAll, rightSelect });
- return this;
- };
- }
- union = this.createSetOperator("union", false);
- unionAll = this.createSetOperator("union", true);
- intersect = this.createSetOperator("intersect", false);
- except = this.createSetOperator("except", false);
- addSetOperators(setOperators) {
- this.config.setOperators.push(...setOperators);
- return this;
- }
- where(where) {
- if (typeof where === "function") {
- where = where(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- this.config.where = where;
- return this;
- }
- having(having) {
- if (typeof having === "function") {
- having = having(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- this.config.having = having;
- return this;
- }
- groupBy(...columns) {
- if (typeof columns[0] === "function") {
- const groupBy = columns[0](new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- this.config.groupBy = Array.isArray(groupBy) ? groupBy : [groupBy];
- } else {
- this.config.groupBy = columns;
- }
- return this;
- }
- orderBy(...columns) {
- if (typeof columns[0] === "function") {
- const orderBy = columns[0](new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).orderBy = orderByArray;
- } else {
- this.config.orderBy = orderByArray;
- }
- } else {
- const orderByArray = columns;
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).orderBy = orderByArray;
- } else {
- this.config.orderBy = orderByArray;
- }
- }
- return this;
- }
- limit(limit) {
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).limit = limit;
- } else {
- this.config.limit = limit;
- }
- return this;
- }
- offset(offset) {
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).offset = offset;
- } else {
- this.config.offset = offset;
- }
- return this;
- }
- getSQL() {
- return this.dialect.buildSelectQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- as(alias) {
- const usedTables = [];
- usedTables.push(...extractUsedTable(this.config.table));
- if (this.config.joins) {
- for (const it of this.config.joins)
- usedTables.push(...extractUsedTable(it.table));
- }
- return new Proxy(new Subquery(this.getSQL(), this.config.fields, alias, false, [...new Set(usedTables)]), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- }
- getSelectedFields() {
- return new Proxy(this.config.fields, new SelectionProxyHandler({ alias: this.tableName, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- }
- $dynamic() {
- return this;
- }
-}
-
-class SQLiteSelectBase extends SQLiteSelectQueryBuilderBase {
- static [entityKind] = "SQLiteSelect";
- _prepare(isOneTimeQuery = true) {
- if (!this.session) {
- throw new Error("Cannot execute a query on a query builder. Please use a database instance instead.");
- }
- const fieldsList = orderSelectedFields(this.config.fields);
- const query = this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), fieldsList, "all", true, undefined, {
- type: "select",
- tables: [...this.usedTables]
- }, this.cacheConfig);
- query.joinsNotNullableMap = this.joinsNotNullableMap;
- return query;
- }
- $withCache(config) {
- this.cacheConfig = config === undefined ? { config: {}, enable: true, autoInvalidate: true } : config === false ? { enable: false } : { enable: true, autoInvalidate: true, ...config };
- return this;
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute() {
- return this.all();
- }
-}
-applyMixins(SQLiteSelectBase, [QueryPromise]);
-function createSetOperator(type, isAll) {
- return (leftSelect, rightSelect, ...restSelects) => {
- const setOperators = [rightSelect, ...restSelects].map((select) => ({
- type,
- isAll,
- rightSelect: select
- }));
- for (const setOperator of setOperators) {
- if (!haveSameKeys(leftSelect.getSelectedFields(), setOperator.rightSelect.getSelectedFields())) {
- throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");
- }
- }
- return leftSelect.addSetOperators(setOperators);
- };
-}
-var getSQLiteSetOperators = () => ({
- union,
- unionAll,
- intersect,
- except
-});
-var union = createSetOperator("union", false);
-var unionAll = createSetOperator("union", true);
-var intersect = createSetOperator("intersect", false);
-var except = createSetOperator("except", false);
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.js
-class QueryBuilder {
- static [entityKind] = "SQLiteQueryBuilder";
- dialect;
- dialectConfig;
- constructor(dialect) {
- this.dialect = is(dialect, SQLiteDialect) ? dialect : undefined;
- this.dialectConfig = is(dialect, SQLiteDialect) ? undefined : dialect;
- }
- $with = (alias, selection) => {
- const queryBuilder = this;
- const as = (qb) => {
- if (typeof qb === "function") {
- qb = qb(queryBuilder);
- }
- return new Proxy(new WithSubquery(qb.getSQL(), selection ?? ("getSelectedFields" in qb ? qb.getSelectedFields() ?? {} : {}), alias, true), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- };
- return { as };
- };
- with(...queries) {
- const self2 = this;
- function select(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: undefined,
- dialect: self2.getDialect(),
- withList: queries
- });
- }
- function selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: undefined,
- dialect: self2.getDialect(),
- withList: queries,
- distinct: true
- });
- }
- return { select, selectDistinct };
- }
- select(fields) {
- return new SQLiteSelectBuilder({ fields: fields ?? undefined, session: undefined, dialect: this.getDialect() });
- }
- selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: undefined,
- dialect: this.getDialect(),
- distinct: true
- });
- }
- getDialect() {
- if (!this.dialect) {
- this.dialect = new SQLiteSyncDialect(this.dialectConfig);
- }
- return this.dialect;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/insert.js
-class SQLiteInsertBuilder {
- constructor(table, session, dialect, withList) {
- this.table = table;
- this.session = session;
- this.dialect = dialect;
- this.withList = withList;
- }
- static [entityKind] = "SQLiteInsertBuilder";
- values(values) {
- values = Array.isArray(values) ? values : [values];
- if (values.length === 0) {
- throw new Error("values() must be called with at least one value");
- }
- const mappedValues = values.map((entry) => {
- const result = {};
- const cols = this.table[Table.Symbol.Columns];
- for (const colKey of Object.keys(entry)) {
- const colValue = entry[colKey];
- result[colKey] = is(colValue, SQL) ? colValue : new Param(colValue, cols[colKey]);
- }
- return result;
- });
- return new SQLiteInsertBase(this.table, mappedValues, this.session, this.dialect, this.withList);
- }
- select(selectQuery) {
- const select = typeof selectQuery === "function" ? selectQuery(new QueryBuilder) : selectQuery;
- if (!is(select, SQL) && !haveSameKeys(this.table[Columns], select._.selectedFields)) {
- throw new Error("Insert select error: selected fields are not the same or are in a different order compared to the table definition");
- }
- return new SQLiteInsertBase(this.table, select, this.session, this.dialect, this.withList, true);
- }
-}
-
-class SQLiteInsertBase extends QueryPromise {
- constructor(table, values, session, dialect, withList, select) {
- super();
- this.session = session;
- this.dialect = dialect;
- this.config = { table, values, withList, select };
- }
- static [entityKind] = "SQLiteInsert";
- config;
- returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) {
- this.config.returning = orderSelectedFields(fields);
- return this;
- }
- onConflictDoNothing(config = {}) {
- if (!this.config.onConflict)
- this.config.onConflict = [];
- if (config.target === undefined) {
- this.config.onConflict.push(sql` on conflict do nothing`);
- } else {
- const targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;
- const whereSql = config.where ? sql` where ${config.where}` : sql``;
- this.config.onConflict.push(sql` on conflict ${targetSql} do nothing${whereSql}`);
- }
- return this;
- }
- onConflictDoUpdate(config) {
- if (config.where && (config.targetWhere || config.setWhere)) {
- throw new Error('You cannot use both "where" and "targetWhere"/"setWhere" at the same time - "where" is deprecated, use "targetWhere" or "setWhere" instead.');
- }
- if (!this.config.onConflict)
- this.config.onConflict = [];
- const whereSql = config.where ? sql` where ${config.where}` : undefined;
- const targetWhereSql = config.targetWhere ? sql` where ${config.targetWhere}` : undefined;
- const setWhereSql = config.setWhere ? sql` where ${config.setWhere}` : undefined;
- const targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;
- const setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));
- this.config.onConflict.push(sql` on conflict ${targetSql}${targetWhereSql} do update set ${setSql}${whereSql}${setWhereSql}`);
- return this;
- }
- getSQL() {
- return this.dialect.buildInsertQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- _prepare(isOneTimeQuery = true) {
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
- type: "insert",
- tables: extractUsedTable(this.config.table)
- });
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute() {
- return this.config.returning ? this.all() : this.run();
- }
- $dynamic() {
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/update.js
-class SQLiteUpdateBuilder {
- constructor(table, session, dialect, withList) {
- this.table = table;
- this.session = session;
- this.dialect = dialect;
- this.withList = withList;
- }
- static [entityKind] = "SQLiteUpdateBuilder";
- set(values) {
- return new SQLiteUpdateBase(this.table, mapUpdateSet(this.table, values), this.session, this.dialect, this.withList);
- }
-}
-
-class SQLiteUpdateBase extends QueryPromise {
- constructor(table, set, session, dialect, withList) {
- super();
- this.session = session;
- this.dialect = dialect;
- this.config = { set, table, withList, joins: [] };
- }
- static [entityKind] = "SQLiteUpdate";
- config;
- from(source) {
- this.config.from = source;
- return this;
- }
- createJoin(joinType) {
- return (table, on) => {
- const tableName = getTableLikeName(table);
- if (typeof tableName === "string" && this.config.joins.some((join) => join.alias === tableName)) {
- throw new Error(`Alias "${tableName}" is already used in this query`);
- }
- if (typeof on === "function") {
- const from = this.config.from ? is(table, SQLiteTable) ? table[Table.Symbol.Columns] : is(table, Subquery) ? table._.selectedFields : is(table, SQLiteViewBase) ? table[ViewBaseConfig].selectedFields : undefined : undefined;
- on = on(new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })), from && new Proxy(from, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- this.config.joins.push({ on, table, joinType, alias: tableName });
- return this;
- };
- }
- leftJoin = this.createJoin("left");
- rightJoin = this.createJoin("right");
- innerJoin = this.createJoin("inner");
- fullJoin = this.createJoin("full");
- where(where) {
- this.config.where = where;
- return this;
- }
- orderBy(...columns) {
- if (typeof columns[0] === "function") {
- const orderBy = columns[0](new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
- this.config.orderBy = orderByArray;
- } else {
- const orderByArray = columns;
- this.config.orderBy = orderByArray;
- }
- return this;
- }
- limit(limit) {
- this.config.limit = limit;
- return this;
- }
- returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) {
- this.config.returning = orderSelectedFields(fields);
- return this;
- }
- getSQL() {
- return this.dialect.buildUpdateQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- _prepare(isOneTimeQuery = true) {
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
- type: "insert",
- tables: extractUsedTable(this.config.table)
- });
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute() {
- return this.config.returning ? this.all() : this.run();
- }
- $dynamic() {
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/count.js
-class SQLiteCountBuilder extends SQL {
- constructor(params) {
- super(SQLiteCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);
- this.params = params;
- this.session = params.session;
- this.sql = SQLiteCountBuilder.buildCount(params.source, params.filters);
- }
- sql;
- static [entityKind] = "SQLiteCountBuilderAsync";
- [Symbol.toStringTag] = "SQLiteCountBuilderAsync";
- session;
- static buildEmbeddedCount(source, filters) {
- return sql`(select count(*) from ${source}${sql.raw(" where ").if(filters)}${filters})`;
- }
- static buildCount(source, filters) {
- return sql`select count(*) from ${source}${sql.raw(" where ").if(filters)}${filters}`;
- }
- then(onfulfilled, onrejected) {
- return Promise.resolve(this.session.count(this.sql)).then(onfulfilled, onrejected);
- }
- catch(onRejected) {
- return this.then(undefined, onRejected);
- }
- finally(onFinally) {
- return this.then((value) => {
- onFinally?.();
- return value;
- }, (reason) => {
- onFinally?.();
- throw reason;
- });
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/query.js
-class RelationalQueryBuilder {
- constructor(mode, fullSchema, schema, tableNamesMap, table, tableConfig, dialect, session) {
- this.mode = mode;
- this.fullSchema = fullSchema;
- this.schema = schema;
- this.tableNamesMap = tableNamesMap;
- this.table = table;
- this.tableConfig = tableConfig;
- this.dialect = dialect;
- this.session = session;
- }
- static [entityKind] = "SQLiteAsyncRelationalQueryBuilder";
- findMany(config) {
- return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? config : {}, "many") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? config : {}, "many");
- }
- findFirst(config) {
- return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? { ...config, limit: 1 } : { limit: 1 }, "first") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? { ...config, limit: 1 } : { limit: 1 }, "first");
- }
-}
-
-class SQLiteRelationalQuery extends QueryPromise {
- constructor(fullSchema, schema, tableNamesMap, table, tableConfig, dialect, session, config, mode) {
- super();
- this.fullSchema = fullSchema;
- this.schema = schema;
- this.tableNamesMap = tableNamesMap;
- this.table = table;
- this.tableConfig = tableConfig;
- this.dialect = dialect;
- this.session = session;
- this.config = config;
- this.mode = mode;
- }
- static [entityKind] = "SQLiteAsyncRelationalQuery";
- mode;
- getSQL() {
- return this.dialect.buildRelationalQuery({
- fullSchema: this.fullSchema,
- schema: this.schema,
- tableNamesMap: this.tableNamesMap,
- table: this.table,
- tableConfig: this.tableConfig,
- queryConfig: this.config,
- tableAlias: this.tableConfig.tsName
- }).sql;
- }
- _prepare(isOneTimeQuery = false) {
- const { query, builtQuery } = this._toSQL();
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](builtQuery, undefined, this.mode === "first" ? "get" : "all", true, (rawRows, mapColumnValue) => {
- const rows = rawRows.map((row) => mapRelationalRow(this.schema, this.tableConfig, row, query.selection, mapColumnValue));
- if (this.mode === "first") {
- return rows[0];
- }
- return rows;
- });
- }
- prepare() {
- return this._prepare(false);
- }
- _toSQL() {
- const query = this.dialect.buildRelationalQuery({
- fullSchema: this.fullSchema,
- schema: this.schema,
- tableNamesMap: this.tableNamesMap,
- table: this.table,
- tableConfig: this.tableConfig,
- queryConfig: this.config,
- tableAlias: this.tableConfig.tsName
- });
- const builtQuery = this.dialect.sqlToQuery(query.sql);
- return { query, builtQuery };
- }
- toSQL() {
- return this._toSQL().builtQuery;
- }
- executeRaw() {
- if (this.mode === "first") {
- return this._prepare(false).get();
- }
- return this._prepare(false).all();
- }
- async execute() {
- return this.executeRaw();
- }
-}
-
-class SQLiteSyncRelationalQuery extends SQLiteRelationalQuery {
- static [entityKind] = "SQLiteSyncRelationalQuery";
- sync() {
- return this.executeRaw();
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/raw.js
-class SQLiteRaw extends QueryPromise {
- constructor(execute, getSQL, action, dialect, mapBatchResult) {
- super();
- this.execute = execute;
- this.getSQL = getSQL;
- this.dialect = dialect;
- this.mapBatchResult = mapBatchResult;
- this.config = { action };
- }
- static [entityKind] = "SQLiteRaw";
- config;
- getQuery() {
- return { ...this.dialect.sqlToQuery(this.getSQL()), method: this.config.action };
- }
- mapResult(result, isFromBatch) {
- return isFromBatch ? this.mapBatchResult(result) : result;
- }
- _prepare() {
- return this;
- }
- isResponseInArrayMode() {
- return false;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/db.js
-class BaseSQLiteDatabase {
- constructor(resultKind, dialect, session, schema) {
- this.resultKind = resultKind;
- this.dialect = dialect;
- this.session = session;
- this._ = schema ? {
- schema: schema.schema,
- fullSchema: schema.fullSchema,
- tableNamesMap: schema.tableNamesMap
- } : {
- schema: undefined,
- fullSchema: {},
- tableNamesMap: {}
- };
- this.query = {};
- const query = this.query;
- if (this._.schema) {
- for (const [tableName, columns] of Object.entries(this._.schema)) {
- query[tableName] = new RelationalQueryBuilder(resultKind, schema.fullSchema, this._.schema, this._.tableNamesMap, schema.fullSchema[tableName], columns, dialect, session);
- }
- }
- this.$cache = { invalidate: async (_params) => {} };
- }
- static [entityKind] = "BaseSQLiteDatabase";
- query;
- $with = (alias, selection) => {
- const self2 = this;
- const as = (qb) => {
- if (typeof qb === "function") {
- qb = qb(new QueryBuilder(self2.dialect));
- }
- return new Proxy(new WithSubquery(qb.getSQL(), selection ?? ("getSelectedFields" in qb ? qb.getSelectedFields() ?? {} : {}), alias, true), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- };
- return { as };
- };
- $count(source, filters) {
- return new SQLiteCountBuilder({ source, filters, session: this.session });
- }
- with(...queries) {
- const self2 = this;
- function select(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: self2.session,
- dialect: self2.dialect,
- withList: queries
- });
- }
- function selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: self2.session,
- dialect: self2.dialect,
- withList: queries,
- distinct: true
- });
- }
- function update(table) {
- return new SQLiteUpdateBuilder(table, self2.session, self2.dialect, queries);
- }
- function insert(into) {
- return new SQLiteInsertBuilder(into, self2.session, self2.dialect, queries);
- }
- function delete_(from) {
- return new SQLiteDeleteBase(from, self2.session, self2.dialect, queries);
- }
- return { select, selectDistinct, update, insert, delete: delete_ };
- }
- select(fields) {
- return new SQLiteSelectBuilder({ fields: fields ?? undefined, session: this.session, dialect: this.dialect });
- }
- selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: this.session,
- dialect: this.dialect,
- distinct: true
- });
- }
- update(table) {
- return new SQLiteUpdateBuilder(table, this.session, this.dialect);
- }
- $cache;
- insert(into) {
- return new SQLiteInsertBuilder(into, this.session, this.dialect);
- }
- delete(from) {
- return new SQLiteDeleteBase(from, this.session, this.dialect);
- }
- run(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.run(sequel), () => sequel, "run", this.dialect, this.session.extractRawRunValueFromBatchResult.bind(this.session));
- }
- return this.session.run(sequel);
- }
- all(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.all(sequel), () => sequel, "all", this.dialect, this.session.extractRawAllValueFromBatchResult.bind(this.session));
- }
- return this.session.all(sequel);
- }
- get(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.get(sequel), () => sequel, "get", this.dialect, this.session.extractRawGetValueFromBatchResult.bind(this.session));
- }
- return this.session.get(sequel);
- }
- values(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.values(sequel), () => sequel, "values", this.dialect, this.session.extractRawValuesValueFromBatchResult.bind(this.session));
- }
- return this.session.values(sequel);
- }
- transaction(transaction, config) {
- return this.session.transaction(transaction, config);
- }
-}
-
-// ../eve/node_modules/drizzle-orm/cache/core/cache.js
-class Cache {
- static [entityKind] = "Cache";
-}
-
-class NoopCache extends Cache {
- strategy() {
- return "all";
- }
- static [entityKind] = "NoopCache";
- async get(_key) {
- return;
- }
- async put(_hashedQuery, _response, _tables, _config) {}
- async onMutate(_params) {}
-}
-async function hashQuery(sql2, params) {
- const dataToHash = `${sql2}-${JSON.stringify(params)}`;
- const encoder = new TextEncoder;
- const data = encoder.encode(dataToHash);
- const hashBuffer = await crypto.subtle.digest("SHA-256", data);
- const hashArray = [...new Uint8Array(hashBuffer)];
- const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
- return hashHex;
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/session.js
-class ExecuteResultSync extends QueryPromise {
- constructor(resultCb) {
- super();
- this.resultCb = resultCb;
- }
- static [entityKind] = "ExecuteResultSync";
- async execute() {
- return this.resultCb();
- }
- sync() {
- return this.resultCb();
- }
-}
-
-class SQLitePreparedQuery {
- constructor(mode, executeMethod, query, cache, queryMetadata, cacheConfig) {
- this.mode = mode;
- this.executeMethod = executeMethod;
- this.query = query;
- this.cache = cache;
- this.queryMetadata = queryMetadata;
- this.cacheConfig = cacheConfig;
- if (cache && cache.strategy() === "all" && cacheConfig === undefined) {
- this.cacheConfig = { enable: true, autoInvalidate: true };
- }
- if (!this.cacheConfig?.enable) {
- this.cacheConfig = undefined;
- }
- }
- static [entityKind] = "PreparedQuery";
- joinsNotNullableMap;
- async queryWithCache(queryString, params, query) {
- if (this.cache === undefined || is(this.cache, NoopCache) || this.queryMetadata === undefined) {
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if (this.cacheConfig && !this.cacheConfig.enable) {
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if ((this.queryMetadata.type === "insert" || this.queryMetadata.type === "update" || this.queryMetadata.type === "delete") && this.queryMetadata.tables.length > 0) {
- try {
- const [res] = await Promise.all([
- query(),
- this.cache.onMutate({ tables: this.queryMetadata.tables })
- ]);
- return res;
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if (!this.cacheConfig) {
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if (this.queryMetadata.type === "select") {
- const fromCache = await this.cache.get(this.cacheConfig.tag ?? await hashQuery(queryString, params), this.queryMetadata.tables, this.cacheConfig.tag !== undefined, this.cacheConfig.autoInvalidate);
- if (fromCache === undefined) {
- let result;
- try {
- result = await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- await this.cache.put(this.cacheConfig.tag ?? await hashQuery(queryString, params), result, this.cacheConfig.autoInvalidate ? this.queryMetadata.tables : [], this.cacheConfig.tag !== undefined, this.cacheConfig.config);
- return result;
- }
- return fromCache;
- }
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- getQuery() {
- return this.query;
- }
- mapRunResult(result, _isFromBatch) {
- return result;
- }
- mapAllResult(_result, _isFromBatch) {
- throw new Error("Not implemented");
- }
- mapGetResult(_result, _isFromBatch) {
- throw new Error("Not implemented");
- }
- execute(placeholderValues) {
- if (this.mode === "async") {
- return this[this.executeMethod](placeholderValues);
- }
- return new ExecuteResultSync(() => this[this.executeMethod](placeholderValues));
- }
- mapResult(response, isFromBatch) {
- switch (this.executeMethod) {
- case "run": {
- return this.mapRunResult(response, isFromBatch);
- }
- case "all": {
- return this.mapAllResult(response, isFromBatch);
- }
- case "get": {
- return this.mapGetResult(response, isFromBatch);
- }
- }
- }
-}
-
-class SQLiteSession {
- constructor(dialect) {
- this.dialect = dialect;
- }
- static [entityKind] = "SQLiteSession";
- prepareOneTimeQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper, queryMetadata, cacheConfig) {
- return this.prepareQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper, queryMetadata, cacheConfig);
- }
- run(query) {
- const staticQuery = this.dialect.sqlToQuery(query);
- try {
- return this.prepareOneTimeQuery(staticQuery, undefined, "run", false).run();
- } catch (err) {
- throw new DrizzleError({ cause: err, message: `Failed to run the query '${staticQuery.sql}'` });
- }
- }
- extractRawRunValueFromBatchResult(result) {
- return result;
- }
- all(query) {
- return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).all();
- }
- extractRawAllValueFromBatchResult(_result) {
- throw new Error("Not implemented");
- }
- get(query) {
- return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).get();
- }
- extractRawGetValueFromBatchResult(_result) {
- throw new Error("Not implemented");
- }
- values(query) {
- return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).values();
- }
- async count(sql2) {
- const result = await this.values(sql2);
- return result[0][0];
- }
- extractRawValuesValueFromBatchResult(_result) {
- throw new Error("Not implemented");
- }
-}
-
-class SQLiteTransaction extends BaseSQLiteDatabase {
- constructor(resultType, dialect, session, schema, nestedIndex = 0) {
- super(resultType, dialect, session, schema);
- this.schema = schema;
- this.nestedIndex = nestedIndex;
- }
- static [entityKind] = "SQLiteTransaction";
- rollback() {
- throw new TransactionRollbackError;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/logger.js
-class ConsoleLogWriter {
- static [entityKind] = "ConsoleLogWriter";
- write(message) {
- console.log(message);
- }
-}
-
-class DefaultLogger {
- static [entityKind] = "DefaultLogger";
- writer;
- constructor(config) {
- this.writer = config?.writer ?? new ConsoleLogWriter;
- }
- logQuery(query, params) {
- const stringifiedParams = params.map((p) => {
- try {
- return JSON.stringify(p);
- } catch {
- return String(p);
- }
- });
- const paramsStr = stringifiedParams.length ? ` -- params: [${stringifiedParams.join(", ")}]` : "";
- this.writer.write(`Query: ${query}${paramsStr}`);
- }
-}
-
-class NoopLogger {
- static [entityKind] = "NoopLogger";
- logQuery() {}
-}
-
-// ../eve/dist/db/schema.js
-var schema_exports = {};
-__export(schema_exports, {
- characters: () => characters,
- charactersRelations: () => charactersRelations,
- miningFleetParticipants: () => miningFleetParticipants,
- miningFleetParticipantsRelations: () => miningFleetParticipantsRelations,
- miningFleets: () => miningFleets,
- miningFleetsRelations: () => miningFleetsRelations,
- resumeCommands: () => resumeCommands,
- shared: () => shared,
- users: () => users,
- usersRelations: () => usersRelations
-});
-var shared = {
- createdAt: integer("created_at").notNull(),
- updatedAt: integer("updated_at")
-};
-var users = sqliteTable("users", {
- id: integer().primaryKey().unique().notNull(),
- discordID: text("discord_id").unique().notNull(),
- mainCharacter: integer("main_character"),
- ...shared
-}, (table) => [index("idx_discord_id").on(table.discordID), index("idx_main_character").on(table.mainCharacter)]);
-var usersRelations = relations(users, ({ one, many }) => ({
- characters: many(characters),
- main: one(characters, {
- fields: [users.mainCharacter],
- references: [characters.id]
- })
-}));
-var characters = sqliteTable("characters", {
- id: integer("id").primaryKey({ autoIncrement: true }),
- eveID: integer("eve_id").notNull(),
- userID: integer("user_id").notNull(),
- name: text().notNull(),
- accessToken: text("access_token").notNull(),
- expiresAt: integer("expires_at").notNull(),
- refreshToken: text("refresh_token").notNull(),
- ...shared
-}, (table) => [index("idx_user_id").on(table.userID), index("idx_eve_id").on(table.eveID)]);
-var charactersRelations = relations(characters, ({ one }) => ({ user: one(users, {
- fields: [characters.userID],
- references: [users.id]
-}) }));
-var resumeCommands = sqliteTable("resumecommands", {
- id: text().primaryKey(),
- command: text().notNull(),
- params: text().notNull(),
- context: text().notNull(),
- ...shared
-});
-var miningFleets = sqliteTable("mining_fleets", {
- id: integer("id").primaryKey({ autoIncrement: true }),
- name: text("name").notNull(),
- description: text("description"),
- creatorDiscordId: text("creator_discord_id").notNull(),
- startTime: integer("start_time").notNull(),
- endTime: integer("end_time"),
- status: text("status", { enum: [
- "configuring",
- "active",
- "ended",
- "generating_report",
- "completed",
- "failed"
- ] }).notNull().default("configuring"),
- taxRate: real("tax_rate").notNull().default(0),
- publicMessageId: text("public_message_id").unique(),
- publicChannelId: text("public_channel_id"),
- reportData: text("report_data"),
- creatorEphemeralMessageId: text("creator_ephemeral_message_id"),
- ...shared
-}, (table) => [
- index("idx_fleet_creator_discord_id").on(table.creatorDiscordId),
- index("idx_fleet_status").on(table.status),
- index("idx_fleet_public_message_id").on(table.publicMessageId)
-]);
-var miningFleetParticipants = sqliteTable("mining_fleet_participants", {
- id: integer("id").primaryKey({ autoIncrement: true }),
- fleetId: integer("fleet_id").notNull().references(() => miningFleets.id, { onDelete: "cascade" }),
- characterId: integer("character_id").notNull().references(() => characters.id, { onDelete: "cascade" }),
- discordId: text("discord_id").notNull(),
- role: text("role", { enum: [
- "miner",
- "security",
- "hauler"
- ] }).notNull(),
- joinTime: integer("join_time").notNull(),
- ...shared
-}, (table) => [
- index("idx_participant_fleet_id").on(table.fleetId),
- index("idx_participant_character_id").on(table.characterId),
- index("idx_participant_discord_id").on(table.discordId)
-]);
-var miningFleetsRelations = relations(miningFleets, ({ many }) => ({ participants: many(miningFleetParticipants) }));
-var miningFleetParticipantsRelations = relations(miningFleetParticipants, ({ one }) => ({
- fleet: one(miningFleets, {
- fields: [miningFleetParticipants.fleetId],
- references: [miningFleets.id]
- }),
- character: one(characters, {
- fields: [miningFleetParticipants.characterId],
- references: [characters.id]
- })
-}));
-
-// ../eve/dist/esi/options.js
-var CLIENT_ID = process.env.EVE_CLIENT_ID || "";
-var CLIENT_SECRET = process.env.EVE_CLIENT_SECRET || "";
-var CALLBACK_URL = process.env.EVE_CALLBACK_URL || "";
-var USER_AGENT = process.env.ESI_USER_AGENT || "";
-var options = {
- client_id: CLIENT_ID,
- client_secret: CLIENT_SECRET,
- callback_url: CALLBACK_URL,
- user_agent: USER_AGENT
-};
-
-// ../eve/node_modules/jwt-decode/build/esm/index.js
-class InvalidTokenError extends Error {
-}
-InvalidTokenError.prototype.name = "InvalidTokenError";
-function b64DecodeUnicode(str) {
- return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {
- let code = p.charCodeAt(0).toString(16).toUpperCase();
- if (code.length < 2) {
- code = "0" + code;
- }
- return "%" + code;
- }));
-}
-function base64UrlDecode(str) {
- let output = str.replace(/-/g, "+").replace(/_/g, "/");
- switch (output.length % 4) {
- case 0:
- break;
- case 2:
- output += "==";
- break;
- case 3:
- output += "=";
- break;
- default:
- throw new Error("base64 string is not of the correct length");
- }
- try {
- return b64DecodeUnicode(output);
- } catch (err) {
- return atob(output);
- }
-}
-function jwtDecode(token, options2) {
- if (typeof token !== "string") {
- throw new InvalidTokenError("Invalid token specified: must be a string");
- }
- options2 || (options2 = {});
- const pos = options2.header === true ? 0 : 1;
- const part = token.split(".")[pos];
- if (typeof part !== "string") {
- throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);
- }
- let decoded;
- try {
- decoded = base64UrlDecode(part);
- } catch (e) {
- throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);
- }
- try {
- return JSON.parse(decoded);
- } catch (e) {
- throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);
- }
-}
-// ../eve/node_modules/@oslojs/encoding/dist/base32.js
-var EncodingPadding;
-(function(EncodingPadding2) {
- EncodingPadding2[EncodingPadding2["Include"] = 0] = "Include";
- EncodingPadding2[EncodingPadding2["None"] = 1] = "None";
-})(EncodingPadding || (EncodingPadding = {}));
-var DecodingPadding;
-(function(DecodingPadding2) {
- DecodingPadding2[DecodingPadding2["Required"] = 0] = "Required";
- DecodingPadding2[DecodingPadding2["Ignore"] = 1] = "Ignore";
-})(DecodingPadding || (DecodingPadding = {}));
-// ../eve/node_modules/@oslojs/encoding/dist/base64.js
-function encodeBase64urlNoPadding(bytes) {
- return encodeBase64_internal(bytes, base64urlAlphabet, EncodingPadding2.None);
-}
-function encodeBase64_internal(bytes, alphabet, padding) {
- let result = "";
- for (let i = 0;i < bytes.byteLength; i += 3) {
- let buffer = 0;
- let bufferBitSize = 0;
- for (let j = 0;j < 3 && i + j < bytes.byteLength; j++) {
- buffer = buffer << 8 | bytes[i + j];
- bufferBitSize += 8;
- }
- for (let j = 0;j < 4; j++) {
- if (bufferBitSize >= 6) {
- result += alphabet[buffer >> bufferBitSize - 6 & 63];
- bufferBitSize -= 6;
- } else if (bufferBitSize > 0) {
- result += alphabet[buffer << 6 - bufferBitSize & 63];
- bufferBitSize = 0;
- } else if (padding === EncodingPadding2.Include) {
- result += "=";
- }
- }
- }
- return result;
-}
-var base64urlAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
-var EncodingPadding2;
-(function(EncodingPadding3) {
- EncodingPadding3[EncodingPadding3["Include"] = 0] = "Include";
- EncodingPadding3[EncodingPadding3["None"] = 1] = "None";
-})(EncodingPadding2 || (EncodingPadding2 = {}));
-var DecodingPadding2;
-(function(DecodingPadding3) {
- DecodingPadding3[DecodingPadding3["Required"] = 0] = "Required";
- DecodingPadding3[DecodingPadding3["Ignore"] = 1] = "Ignore";
-})(DecodingPadding2 || (DecodingPadding2 = {}));
-// ../eve/dist/esi/auth.js
-var import_jsonwebtoken = __toESM(require_jsonwebtoken(), 1);
-var import_jwk_to_pem = __toESM(require_jwk_to_pem(), 1);
-var auth_exports = {};
-__export(auth_exports, {
- characterIdFromToken: () => characterIdFromToken,
- createAuthorizationURL: () => createAuthorizationURL,
- refresh: () => refresh,
- validateAuthorizationCode: () => validateAuthorizationCode,
- validateToken: () => validateToken
-});
-function generateState() {
- const randomValues = new Uint8Array(32);
- crypto.getRandomValues(randomValues);
- return encodeBase64urlNoPadding(randomValues);
-}
-async function createAuthorizationURL(scopes = "publicData") {
- const state = generateState();
- const url = new URL("https://login.eveonline.com/v2/oauth/authorize/");
- url.searchParams.set("response_type", "code");
- url.searchParams.set("redirect_uri", options.callback_url);
- url.searchParams.set("client_id", options.client_id);
- url.searchParams.set("state", state);
- url.searchParams.set("scope", Array.isArray(scopes) ? scopes.join(" ") : scopes);
- return {
- url,
- state
- };
-}
-async function validateAuthorizationCode(code) {
- try {
- const response = await fetch("https://login.eveonline.com/v2/oauth/token", {
- method: "POST",
- headers: {
- "Content-Type": "application/x-www-form-urlencoded",
- Authorization: `Basic ${Buffer.from(`${options.client_id}:${options.client_secret}`).toString("base64")}`
- },
- body: new URLSearchParams({
- grant_type: "authorization_code",
- code
- })
- });
- return await response.json();
- } catch (error) {
- console.error(`failed to validate EVE authorization code`, error);
- throw `${error}`;
- }
-}
-var eveAuthPublicKey;
-async function validateToken(token) {
- if (!eveAuthPublicKey)
- try {
- const eveJWKS = await (await fetch("https://login.eveonline.com/oauth/jwks")).json();
- eveAuthPublicKey = import_jwk_to_pem.default(eveJWKS.keys[0]);
- } catch (err) {
- console.error(`failed to get EVE Auth public keys`, err);
- }
- try {
- const decoded = import_jsonwebtoken.default.verify(token, eveAuthPublicKey);
- return decoded;
- } catch (err) {
- console.error(`failed to validate EVE token`, err);
- return null;
- }
-}
-async function refresh({ refresh_token }, scopes) {
- const params = {
- grant_type: "refresh_token",
- refresh_token,
- scope: ""
- };
- if (scopes)
- params["scope"] = Array.isArray(scopes) ? scopes.join(" ") : scopes;
- const response = await fetch("https://login.eveonline.com/v2/oauth/token", {
- method: "POST",
- headers: {
- "Content-Type": "application/x-www-form-urlencoded",
- Authorization: `Basic ${Buffer.from(`${options.client_id}:${options.client_secret}`).toString("base64")}`
- },
- body: new URLSearchParams(params)
- });
- return await response.json();
-}
-function characterIdFromToken(token) {
- const payload = jwtDecode(token);
- return parseInt(payload.sub.split(":")[2]);
-}
-
-// ../eve/dist/db/models/character.model.js
-var CharacterHelper = class CharacterHelper2 {
- static hasValidToken(character) {
- return /* @__PURE__ */ new Date < character.expiresAt;
- }
- static getScopes(character) {
- const decoded = jwtDecode(character.accessToken);
- return typeof decoded.scp === "string" ? [decoded.scp] : decoded.scp;
- }
- static hasOnlyPublicScope(character) {
- return this.getScopes(character).length === 1 && this.hasScope(character, "publicData");
- }
- static getTokens(character) {
- return {
- access_token: character.accessToken,
- refresh_token: character.refreshToken,
- expires_in: (character.expiresAt.getTime() - Date.now()) / 1000
- };
- }
- static hasScope(character, scope) {
- return this.getScopes(character).includes(scope);
- }
- static hasAllScopes(character, scopes) {
- const has = this.getScopes(character);
- return scopes.every((scope) => has.includes(scope));
- }
- static find(id) {
- const result = db.select().from(characters).where(eq(characters.id, id)).limit(1).get();
- const c = this.createCharacters(result);
- return c ? c[0] : undefined;
- }
- static findByUser(user) {
- const result = db.select().from(characters).where(eq(characters.userID, user.id)).all();
- return this.createCharacters(result);
- }
- static findByUserAndEveID(userID, eveID) {
- const result = db.select().from(characters).where(and(eq(characters.userID, userID), eq(characters.eveID, eveID))).limit(1).get();
- const c = this.createCharacters(result);
- return c ? c[0] : undefined;
- }
- static findByName(userID, name) {
- const result = db.select().from(characters).where(and(eq(characters.name, name), eq(characters.userID, userID))).limit(1).get();
- const c = this.createCharacters(result);
- return c ? c[0] : undefined;
- }
- static findAll() {
- const result = db.select().from(characters).all();
- return this.createCharacters(result);
- }
- static create(eveID, name, user, tokens) {
- return this.save({
- eveID,
- userID: user.id,
- accessToken: tokens.access_token,
- expiresAt: /* @__PURE__ */ new Date(tokens.expires_in * 1000),
- refreshToken: tokens.refresh_token,
- name,
- createdAt: /* @__PURE__ */ new Date
- });
- }
- static createCharacters(query) {
- if (!query)
- return [];
- if (Array.isArray(query))
- return query.map((character) => {
- return {
- id: character.id,
- eveID: character.eveID,
- userID: character.userID,
- accessToken: character.accessToken,
- expiresAt: new Date(character.expiresAt),
- refreshToken: character.refreshToken,
- name: character.name,
- createdAt: new Date(character.createdAt),
- updatedAt: new Date(character.updatedAt)
- };
- });
- else
- return [{
- id: query.id,
- eveID: query.eveID,
- userID: query.userID,
- accessToken: query.accessToken,
- expiresAt: new Date(query.expiresAt),
- refreshToken: query.refreshToken,
- name: query.name,
- createdAt: new Date(query.createdAt),
- updatedAt: new Date(query.updatedAt)
- }];
- }
- static save(character) {
- db.insert(characters).values({
- id: character.id,
- eveID: character.eveID,
- userID: character.userID,
- name: character.name,
- accessToken: character.accessToken,
- expiresAt: character.expiresAt.getTime(),
- refreshToken: character.refreshToken,
- createdAt: Date.now(),
- updatedAt: Date.now()
- }).onConflictDoUpdate({
- target: characters.id,
- set: {
- eveID: character.eveID,
- userID: character.userID,
- name: character.name,
- accessToken: character.accessToken,
- expiresAt: character.expiresAt.getTime(),
- refreshToken: character.refreshToken,
- updatedAt: Date.now()
- }
- }).run();
- return CharacterHelper2.findByUserAndEveID(character.userID, character.eveID);
- }
- static delete(character) {
- db.delete(characters).where(eq(characters.id, character.id)).run();
- }
- static async refreshTokens(character, scopes) {
- const tokens = await refresh({ refresh_token: character.refreshToken }, scopes);
- const decoded = await validateToken(tokens.access_token);
- if (!decoded) {
- console.error(`Failed to validate token for character ${character.eveID}`);
- return character;
- }
- character.accessToken = tokens.access_token;
- character.expiresAt = new Date(Date.now() + tokens.expires_in * 1000);
- character.refreshToken = tokens.refresh_token;
- this.save(character);
- return character;
- }
-};
-
-// ../eve/dist/db/models/user.model.js
-var UserHelper = class {
- static find(id) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).where(eq(users.id, id)).leftJoin(characters, eq(users.id, characters.userID)).get();
- return this.createFromQuery(result);
- }
- static findByDiscordId(id) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).where(eq(users.discordID, id)).leftJoin(characters, eq(users.id, characters.userID)).get();
- return this.createFromQuery(result);
- }
- static findAll() {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).leftJoin(characters, eq(users.id, characters.userID)).all();
- return this.createFromQuery(result);
- }
- static findByCharacterId(id) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).leftJoin(characters, eq(users.id, characters.userID)).where(eq(characters.id, id)).all();
- return this.createFromQuery(result);
- }
- static findByCharacterName(name) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).leftJoin(characters, eq(users.id, characters.userID)).where(eq(characters.name, name)).all();
- return this.createFromQuery(result);
- }
- static createFromQuery(query) {
- if (!query)
- return [];
- if (Array.isArray(query))
- return query.map((user) => {
- return {
- id: user.id,
- discordID: user.discordID,
- createdAt: new Date(user.createdAt),
- updatedAt: new Date(user.updatedAt),
- characterIDs: user.characterIDsString ? JSON.parse(user.characterIDsString ?? "[]").map((s) => Number(s)).sort() : [],
- mainCharacterID: user.mainCharacterID
- };
- });
- else
- return {
- id: query.id,
- discordID: query.discordID,
- createdAt: new Date(query.createdAt),
- updatedAt: new Date(query.updatedAt),
- characterIDs: query.characterIDsString ? JSON.parse(query.characterIDsString ?? "[]").map((s) => Number(s)).sort() : [],
- mainCharacterID: query.mainCharacterID
- };
- }
- static create(discordID) {
- this.save({
- discordID,
- createdAt: /* @__PURE__ */ new Date,
- updatedAt: /* @__PURE__ */ new Date
- });
- return this.findByDiscordId(discordID);
- }
- static save(user) {
- db.insert(users).values({
- id: user.id,
- discordID: user.discordID,
- mainCharacter: user.mainCharacterID,
- createdAt: user.createdAt.getTime(),
- updatedAt: user.updatedAt.getTime()
- }).onConflictDoUpdate({
- target: users.id,
- set: {
- discordID: user.discordID,
- mainCharacter: user.mainCharacterID,
- updatedAt: user.updatedAt.getTime()
- }
- }).run();
- return user;
- }
- static delete(user) {
- db.delete(users).where(eq(users.id, user.id)).run();
- }
- static getCharacter(user, index2) {
- if (!user.characterIDs)
- return;
- if (index2 >= user.characterIDs.length)
- return;
- return CharacterHelper.find(user.characterIDs[index2]);
- }
-};
-
-// ../eve/dist/db/models/resume-command.model.js
-var ResumeCommand = class ResumeCommand2 {
- id;
- command;
- params;
- context;
- created = /* @__PURE__ */ new Date;
- constructor() {
- this.created = /* @__PURE__ */ new Date;
- }
- static find(messageId) {
- const result = db.select().from(resumeCommands).where(eq(resumeCommands.id, messageId)).get();
- return this.createFromQuery(result);
- }
- static create(messageId, command, params = {}, context = {}) {
- const resume = new ResumeCommand2;
- resume.id = messageId;
- resume.command = command;
- resume.params = JSON.stringify(params);
- resume.context = JSON.stringify(context);
- return resume;
- }
- static createFromQuery(query) {
- if (!query)
- return null;
- const resume = new ResumeCommand2;
- resume.id = query.id;
- resume.command = query.command;
- resume.params = query.params;
- resume.context = query.context;
- resume.created = query.created;
- return resume;
- }
- save() {
- db.insert(resumeCommands).values({
- id: this.id,
- command: this.command,
- params: this.params,
- context: this.context,
- createdAt: this.created.getTime()
- }).onConflictDoUpdate({
- target: resumeCommands.id,
- set: {
- command: this.command,
- params: this.params,
- context: this.context
- }
- }).run();
- return this;
- }
- delete() {
- db.delete(resumeCommands).where(eq(resumeCommands.id, this.id)).run();
- }
- static delete(messageId) {
- db.delete(resumeCommands).where(eq(resumeCommands.id, messageId)).run();
- }
-};
-
-// ../eve/dist/db/models/index.js
-var models_exports = {};
-__export(models_exports, {
- CharacterHelper: () => CharacterHelper,
- ResumeCommand: () => ResumeCommand,
- UserHelper: () => UserHelper
-});
-
-// ../eve/node_modules/drizzle-orm/bun-sqlite/driver.js
-import { Database } from "bun:sqlite";
-
-// ../eve/node_modules/drizzle-orm/bun-sqlite/session.js
-class SQLiteBunSession extends SQLiteSession {
- constructor(client, dialect, schema, options2 = {}) {
- super(dialect);
- this.client = client;
- this.schema = schema;
- this.logger = options2.logger ?? new NoopLogger;
- }
- static [entityKind] = "SQLiteBunSession";
- logger;
- exec(query) {
- this.client.exec(query);
- }
- prepareQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper) {
- const stmt = this.client.prepare(query.sql);
- return new PreparedQuery(stmt, query, this.logger, fields, executeMethod, isResponseInArrayMode, customResultMapper);
- }
- transaction(transaction, config = {}) {
- const tx = new SQLiteBunTransaction("sync", this.dialect, this, this.schema);
- let result;
- const nativeTx = this.client.transaction(() => {
- result = transaction(tx);
- });
- nativeTx[config.behavior ?? "deferred"]();
- return result;
- }
-}
-
-class SQLiteBunTransaction extends SQLiteTransaction {
- static [entityKind] = "SQLiteBunTransaction";
- transaction(transaction) {
- const savepointName = `sp${this.nestedIndex}`;
- const tx = new SQLiteBunTransaction("sync", this.dialect, this.session, this.schema, this.nestedIndex + 1);
- this.session.run(sql.raw(`savepoint ${savepointName}`));
- try {
- const result = transaction(tx);
- this.session.run(sql.raw(`release savepoint ${savepointName}`));
- return result;
- } catch (err) {
- this.session.run(sql.raw(`rollback to savepoint ${savepointName}`));
- throw err;
- }
- }
-}
-
-class PreparedQuery extends SQLitePreparedQuery {
- constructor(stmt, query, logger, fields, executeMethod, _isResponseInArrayMode, customResultMapper) {
- super("sync", executeMethod, query);
- this.stmt = stmt;
- this.logger = logger;
- this.fields = fields;
- this._isResponseInArrayMode = _isResponseInArrayMode;
- this.customResultMapper = customResultMapper;
- }
- static [entityKind] = "SQLiteBunPreparedQuery";
- run(placeholderValues) {
- const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
- this.logger.logQuery(this.query.sql, params);
- return this.stmt.run(...params);
- }
- all(placeholderValues) {
- const { fields, query, logger, joinsNotNullableMap, stmt, customResultMapper } = this;
- if (!fields && !customResultMapper) {
- const params = fillPlaceholders(query.params, placeholderValues ?? {});
- logger.logQuery(query.sql, params);
- return stmt.all(...params);
- }
- const rows = this.values(placeholderValues);
- if (customResultMapper) {
- return customResultMapper(rows);
- }
- return rows.map((row) => mapResultRow(fields, row, joinsNotNullableMap));
- }
- get(placeholderValues) {
- const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
- this.logger.logQuery(this.query.sql, params);
- const row = this.stmt.values(...params)[0];
- if (!row) {
- return;
- }
- const { fields, joinsNotNullableMap, customResultMapper } = this;
- if (!fields && !customResultMapper) {
- return row;
- }
- if (customResultMapper) {
- return customResultMapper([row]);
- }
- return mapResultRow(fields, row, joinsNotNullableMap);
- }
- values(placeholderValues) {
- const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
- this.logger.logQuery(this.query.sql, params);
- return this.stmt.values(...params);
- }
- isResponseInArrayMode() {
- return this._isResponseInArrayMode;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/bun-sqlite/driver.js
-class BunSQLiteDatabase extends BaseSQLiteDatabase {
- static [entityKind] = "BunSQLiteDatabase";
-}
-function construct(client, config = {}) {
- const dialect = new SQLiteSyncDialect({ casing: config.casing });
- let logger;
- if (config.logger === true) {
- logger = new DefaultLogger;
- } else if (config.logger !== false) {
- logger = config.logger;
- }
- let schema;
- if (config.schema) {
- const tablesConfig = extractTablesRelationalConfig(config.schema, createTableRelationsHelpers);
- schema = {
- fullSchema: config.schema,
- schema: tablesConfig.tables,
- tableNamesMap: tablesConfig.tableNamesMap
- };
- }
- const session = new SQLiteBunSession(client, dialect, schema, { logger });
- const db2 = new BunSQLiteDatabase("sync", dialect, session, schema);
- db2.$client = client;
- return db2;
-}
-function drizzle(...params) {
- if (params[0] === undefined || typeof params[0] === "string") {
- const instance = params[0] === undefined ? new Database : new Database(params[0]);
- return construct(instance, params[1]);
- }
- if (isConfig(params[0])) {
- const { connection, client, ...drizzleConfig } = params[0];
- if (client)
- return construct(client, drizzleConfig);
- if (typeof connection === "object") {
- const { source, ...opts } = connection;
- const options2 = Object.values(opts).filter((v) => v !== undefined).length ? opts : undefined;
- const instance2 = new Database(source, options2);
- return construct(instance2, drizzleConfig);
- }
- const instance = new Database(connection);
- return construct(instance, drizzleConfig);
- }
- return construct(params[0], params[1]);
-}
-((drizzle2) => {
- function mock(config) {
- return construct({}, config);
- }
- drizzle2.mock = mock;
-})(drizzle || (drizzle = {}));
-
-// ../eve/dist/db/index.js
-import { Database as Database2 } from "bun:sqlite";
-import { join } from "path";
-var DB_PATH = process.env.AUTH_DB_PATH || join(process.cwd(), "../../db/kitten.db");
-console.log("Using DB_PATH:", DB_PATH);
-var sqlite = new Database2(DB_PATH);
-var db = drizzle(sqlite, { schema: {
- users,
- characters,
- resumeCommands,
- miningFleets,
- miningFleetParticipants
-} });
-
-// src/api/auth/discordID/[discordID]/addScopes/characterID/[characterID]/scopes/[scopes].ts
-async function GET({ store, route: { params } }) {
- const eveauth = store.get("eveauth");
- const discordID = params["discordID"];
- const characterID = params["characterID"];
- const requiredScopes = params["scopes"].split(",");
- const user = UserHelper.findByDiscordId(discordID);
- const character = CharacterHelper.findByUserAndEveID(user.id, Number(characterID));
- if (!character) {
- throw new Error(`Character ${characterID} not found`);
- }
- const currentScopes = CharacterHelper.getScopes(character);
- const set = new Set(currentScopes);
- requiredScopes.forEach((scope) => set.add(scope));
- const scopes = Array.from(set).join(" ");
- const response = await eveauth.redirect(scopes);
- setCookie(response, "discordID", discordID, 60 * 10);
- setCookie(response, "characterID", characterID, 60 * 10);
- return response;
-}
-export {
- GET
-};
-
-//# debugId=342A27653DEA78EE64756E2164756E21
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2FmZS1idWZmZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3c1xcbGliXFxkYXRhLXN0cmVhbS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlY2RzYS1zaWctZm9ybWF0dGVyXFxzcmNcXHBhcmFtLWJ5dGVzLWZvci1hbGcuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWNkc2Etc2lnLWZvcm1hdHRlclxcc3JjXFxlY2RzYS1zaWctZm9ybWF0dGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGJ1ZmZlci1lcXVhbC1jb25zdGFudC10aW1lXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd2FcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3c1xcbGliXFx0b3N0cmluZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd3NcXGxpYlxcc2lnbi1zdHJlYW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandzXFxsaWJcXHZlcmlmeS1zdHJlYW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGRlY29kZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxcSnNvbldlYlRva2VuRXJyb3IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcanNvbndlYnRva2VuXFxsaWJcXE5vdEJlZm9yZUVycm9yLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxUb2tlbkV4cGlyZWRFcnJvci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxtc1xcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcanNvbndlYnRva2VuXFxsaWJcXHRpbWVzcGFuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcaW50ZXJuYWxcXGNvbnN0YW50cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxkZWJ1Zy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxyZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxwYXJzZS1vcHRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcaW50ZXJuYWxcXGlkZW50aWZpZXJzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcY2xhc3Nlc1xcc2VtdmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxwYXJzZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcdmFsaWQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGNsZWFuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxpbmMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGRpZmYuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXG1ham9yLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxtaW5vci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xccGF0Y2guanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHByZXJlbGVhc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGNvbXBhcmUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHJjb21wYXJlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb21wYXJlLWxvb3NlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb21wYXJlLWJ1aWxkLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxzb3J0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxyc29ydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcZ3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGx0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxlcS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcbmVxLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxndGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGx0ZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcY21wLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb2VyY2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxpbnRlcm5hbFxcbHJ1Y2FjaGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxjbGFzc2VzXFxyYW5nZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGNsYXNzZXNcXGNvbXBhcmF0b3IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHNhdGlzZmllcy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcdG8tY29tcGFyYXRvcnMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXG1heC1zYXRpc2Z5aW5nLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxtaW4tc2F0aXNmeWluZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcbWluLXZlcnNpb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXHZhbGlkLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxvdXRzaWRlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxndHIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXGx0ci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcaW50ZXJzZWN0cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcc2ltcGxpZnkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXHN1YnNldC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxhc3ltbWV0cmljS2V5RGV0YWlsc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxccnNhUHNzS2V5RGV0YWlsc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxcdmFsaWRhdGVBc3ltbWV0cmljS2V5LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxwc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXHZlcmlmeS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxsb2Rhc2guaW5jbHVkZXNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc2Jvb2xlYW5cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc2ludGVnZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc251bWJlclxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbG9kYXNoLmlzcGxhaW5vYmplY3RcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc3N0cmluZ1xcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbG9kYXNoLm9uY2VcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcc2lnbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGJuLmpzXFxsaWJcXGJuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGluaGVyaXRzXFxpbmhlcml0c19icm93c2VyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGluaGVyaXRzXFxpbmhlcml0cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzYWZlci1idWZmZXJcXHNhZmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYmFzZVxccmVwb3J0ZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxiYXNlXFxidWZmZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbWluaW1hbGlzdGljLWFzc2VydFxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxiYXNlXFxub2RlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcY29uc3RhbnRzXFxkZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxlbmNvZGVyc1xcZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcZW5jb2RlcnNcXHBlbS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxhc24xLmpzXFxsaWJcXGFzbjFcXGVuY29kZXJzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxhc24xLmpzXFxsaWJcXGFzbjFcXGRlY29kZXJzXFxkZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxkZWNvZGVyc1xccGVtLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcZGVjb2RlcnNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYXBpLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYmFzZVxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxjb25zdGFudHNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzXFxsaWJcXHV0aWxzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxicm9yYW5kXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVcXGJhc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGN1cnZlXFxzaG9ydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVcXG1vbnQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGN1cnZlXFxlZHdhcmRzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljXFxjdXJ2ZVxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXGNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXHNoYVxcY29tbW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwxLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwyNTYuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxzaGFcXDIyNC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXHNoYVxcNTEyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwzODQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxzaGEuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxyaXBlbWQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxobWFjLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xccHJlY29tcHV0ZWRcXHNlY3AyNTZrMS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhtYWMtZHJiZ1xcbGliXFxobWFjLWRyYmcuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxrZXkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxzaWduYXR1cmUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXGtleS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXHNpZ25hdHVyZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYjY0LXRvLWJuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYXNuMVxcYWxnb3JpdGhtLWlkZW50aWZpZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandrLXRvLXBlbVxcc3JjXFxhc24xXFxwdWJsaWMta2V5LWluZm8uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandrLXRvLXBlbVxcc3JjXFxhc24xXFx2ZXJzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYXNuMVxccHJpdmF0ZS1rZXktaW5mby5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd2stdG8tcGVtXFxzcmNcXGVjLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xccnNhLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcandrLXRvLXBlbS5qcyIsICIuLlxcc3JjXFx1dGlsc1xcY29va2llcy50cyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcX3ZpcnR1YWxcXHJvbGxkb3duX3J1bnRpbWUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGVudGl0eS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcY29sdW1uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxjb2x1bW4tYnVpbGRlci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdGFibGUudXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHRyYWNpbmctdXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHBnLWNvcmVcXHVuaXF1ZS1jb25zdHJhaW50LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxwZy1jb3JlXFxjb2x1bW5zXFxjb21tb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHBnLWNvcmVcXGNvbHVtbnNcXGVudW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHN1YnF1ZXJ5LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx2ZXJzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx0cmFjaW5nLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx2aWV3LWNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdGFibGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbFxcc3FsLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxhbGlhcy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxmb3JlaWduLWtleXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx1bmlxdWUtY29uc3RyYWludC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXGNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXGJsb2IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxjdXN0b20uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxpbnRlZ2VyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxcY29sdW1uc1xcbnVtZXJpYy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXHJlYWwuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFx0ZXh0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzZWxlY3Rpb24tcHJveHkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHF1ZXJ5LXByb21pc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxhbGwuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx0YWJsZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGluZGV4ZXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFxkZWxldGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGNhc2luZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcZXJyb3JzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxwZy1jb3JlXFx0YWJsZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxccGctY29yZVxccHJpbWFyeS1rZXlzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxcXGV4cHJlc3Npb25zXFxjb25kaXRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxcXGV4cHJlc3Npb25zXFxzZWxlY3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHJlbGF0aW9ucy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHZpZXctYmFzZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGRpYWxlY3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHF1ZXJ5LWJ1aWxkZXJzXFxxdWVyeS1idWlsZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxccXVlcnktYnVpbGRlcnNcXHNlbGVjdC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFxxdWVyeS1idWlsZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxccXVlcnktYnVpbGRlcnNcXGluc2VydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFx1cGRhdGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xcY291bnQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xccXVlcnkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xccmF3LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxcZGIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGNhY2hlXFxjb3JlXFxjYWNoZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHNlc3Npb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGxvZ2dlci5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZGJcXHNjaGVtYS5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxvcHRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3dC1kZWNvZGVcXGJ1aWxkXFxlc21cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXEBvc2xvanNcXGVuY29kaW5nXFxkaXN0XFxiYXNlMzIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcQG9zbG9qc1xcZW5jb2RpbmdcXGRpc3RcXGJhc2U2NC5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxhdXRoLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxkYlxcbW9kZWxzXFxjaGFyYWN0ZXIubW9kZWwuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGRiXFxtb2RlbHNcXHVzZXIubW9kZWwuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGRiXFxtb2RlbHNcXHJlc3VtZS1jb21tYW5kLm1vZGVsLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxkYlxcbW9kZWxzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcYnVuLXNxbGl0ZVxcZHJpdmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxidW4tc3FsaXRlXFxzZXNzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxkYlxcaW5kZXguanMiLCAiLi5cXHNyY1xcYXBpXFxhdXRoXFxkaXNjb3JkSURcXFtkaXNjb3JkSURdXFxhZGRTY29wZXNcXGNoYXJhY3RlcklEXFxbY2hhcmFjdGVySURdXFxzY29wZXNcXFtzY29wZXNdLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qISBzYWZlLWJ1ZmZlci4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm9kZS9uby1kZXByZWNhdGVkLWFwaSAqL1xudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpXG52YXIgQnVmZmVyID0gYnVmZmVyLkJ1ZmZlclxuXG4vLyBhbHRlcm5hdGl2ZSB0byB1c2luZyBPYmplY3Qua2V5cyBmb3Igb2xkIGJyb3dzZXJzXG5mdW5jdGlvbiBjb3B5UHJvcHMgKHNyYywgZHN0KSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICBkc3Rba2V5XSA9IHNyY1trZXldXG4gIH1cbn1cbmlmIChCdWZmZXIuZnJvbSAmJiBCdWZmZXIuYWxsb2MgJiYgQnVmZmVyLmFsbG9jVW5zYWZlICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBidWZmZXJcbn0gZWxzZSB7XG4gIC8vIENvcHkgcHJvcGVydGllcyBmcm9tIHJlcXVpcmUoJ2J1ZmZlcicpXG4gIGNvcHlQcm9wcyhidWZmZXIsIGV4cG9ydHMpXG4gIGV4cG9ydHMuQnVmZmVyID0gU2FmZUJ1ZmZlclxufVxuXG5mdW5jdGlvbiBTYWZlQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQnVmZmVyLnByb3RvdHlwZSlcblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iLAogICAgIi8qZ2xvYmFsIG1vZHVsZSwgcHJvY2VzcyovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuZnVuY3Rpb24gRGF0YVN0cmVhbShkYXRhKSB7XG4gIHRoaXMuYnVmZmVyID0gbnVsbDtcbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIE5vIGlucHV0XG4gIGlmICghZGF0YSkge1xuICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gU3RyZWFtXG4gIGlmICh0eXBlb2YgZGF0YS5waXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgZGF0YS5waXBlKHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gQnVmZmVyIG9yIFN0cmluZ1xuICAvLyBvciBPYmplY3QgKGFzc3VtZWRseSBhIHBhc3N3b3JkZWQga2V5KVxuICBpZiAoZGF0YS5sZW5ndGggfHwgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgdGhpcy5idWZmZXIgPSBkYXRhO1xuICAgIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuZW1pdCgnZW5kJywgZGF0YSk7XG4gICAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLmVtaXQoJ2Nsb3NlJyk7XG4gICAgfS5iaW5kKHRoaXMpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ1VuZXhwZWN0ZWQgZGF0YSB0eXBlICgnKyB0eXBlb2YgZGF0YSArICcpJyk7XG59XG51dGlsLmluaGVyaXRzKERhdGFTdHJlYW0sIFN0cmVhbSk7XG5cbkRhdGFTdHJlYW0ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUoZGF0YSkge1xuICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuYnVmZmVyLCBCdWZmZXIuZnJvbShkYXRhKV0pO1xuICB0aGlzLmVtaXQoJ2RhdGEnLCBkYXRhKTtcbn07XG5cbkRhdGFTdHJlYW0ucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIGVuZChkYXRhKSB7XG4gIGlmIChkYXRhKVxuICAgIHRoaXMud3JpdGUoZGF0YSk7XG4gIHRoaXMuZW1pdCgnZW5kJywgZGF0YSk7XG4gIHRoaXMuZW1pdCgnY2xvc2UnKTtcbiAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFTdHJlYW07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gZ2V0UGFyYW1TaXplKGtleVNpemUpIHtcblx0dmFyIHJlc3VsdCA9ICgoa2V5U2l6ZSAvIDgpIHwgMCkgKyAoa2V5U2l6ZSAlIDggPT09IDAgPyAwIDogMSk7XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbnZhciBwYXJhbUJ5dGVzRm9yQWxnID0ge1xuXHRFUzI1NjogZ2V0UGFyYW1TaXplKDI1NiksXG5cdEVTMzg0OiBnZXRQYXJhbVNpemUoMzg0KSxcblx0RVM1MTI6IGdldFBhcmFtU2l6ZSg1MjEpXG59O1xuXG5mdW5jdGlvbiBnZXRQYXJhbUJ5dGVzRm9yQWxnKGFsZykge1xuXHR2YXIgcGFyYW1CeXRlcyA9IHBhcmFtQnl0ZXNGb3JBbGdbYWxnXTtcblx0aWYgKHBhcmFtQnl0ZXMpIHtcblx0XHRyZXR1cm4gcGFyYW1CeXRlcztcblx0fVxuXG5cdHRocm93IG5ldyBFcnJvcignVW5rbm93biBhbGdvcml0aG0gXCInICsgYWxnICsgJ1wiJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0UGFyYW1CeXRlc0ZvckFsZztcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG5cbnZhciBnZXRQYXJhbUJ5dGVzRm9yQWxnID0gcmVxdWlyZSgnLi9wYXJhbS1ieXRlcy1mb3ItYWxnJyk7XG5cbnZhciBNQVhfT0NURVQgPSAweDgwLFxuXHRDTEFTU19VTklWRVJTQUwgPSAwLFxuXHRQUklNSVRJVkVfQklUID0gMHgyMCxcblx0VEFHX1NFUSA9IDB4MTAsXG5cdFRBR19JTlQgPSAweDAyLFxuXHRFTkNPREVEX1RBR19TRVEgPSAoVEFHX1NFUSB8IFBSSU1JVElWRV9CSVQpIHwgKENMQVNTX1VOSVZFUlNBTCA8PCA2KSxcblx0RU5DT0RFRF9UQUdfSU5UID0gVEFHX0lOVCB8IChDTEFTU19VTklWRVJTQUwgPDwgNik7XG5cbmZ1bmN0aW9uIGJhc2U2NFVybChiYXNlNjQpIHtcblx0cmV0dXJuIGJhc2U2NFxuXHRcdC5yZXBsYWNlKC89L2csICcnKVxuXHRcdC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuXHRcdC5yZXBsYWNlKC9cXC8vZywgJ18nKTtcbn1cblxuZnVuY3Rpb24gc2lnbmF0dXJlQXNCdWZmZXIoc2lnbmF0dXJlKSB7XG5cdGlmIChCdWZmZXIuaXNCdWZmZXIoc2lnbmF0dXJlKSkge1xuXHRcdHJldHVybiBzaWduYXR1cmU7XG5cdH0gZWxzZSBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiBzaWduYXR1cmUpIHtcblx0XHRyZXR1cm4gQnVmZmVyLmZyb20oc2lnbmF0dXJlLCAnYmFzZTY0Jyk7XG5cdH1cblxuXHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFQ0RTQSBzaWduYXR1cmUgbXVzdCBiZSBhIEJhc2U2NCBzdHJpbmcgb3IgYSBCdWZmZXInKTtcbn1cblxuZnVuY3Rpb24gZGVyVG9Kb3NlKHNpZ25hdHVyZSwgYWxnKSB7XG5cdHNpZ25hdHVyZSA9IHNpZ25hdHVyZUFzQnVmZmVyKHNpZ25hdHVyZSk7XG5cdHZhciBwYXJhbUJ5dGVzID0gZ2V0UGFyYW1CeXRlc0ZvckFsZyhhbGcpO1xuXG5cdC8vIHRoZSBERVIgZW5jb2RlZCBwYXJhbSBzaG91bGQgYXQgbW9zdCBiZSB0aGUgcGFyYW0gc2l6ZSwgcGx1cyBhIHBhZGRpbmdcblx0Ly8gemVybywgc2luY2UgZHVlIHRvIGJlaW5nIGEgc2lnbmVkIGludGVnZXJcblx0dmFyIG1heEVuY29kZWRQYXJhbUxlbmd0aCA9IHBhcmFtQnl0ZXMgKyAxO1xuXG5cdHZhciBpbnB1dExlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7XG5cblx0dmFyIG9mZnNldCA9IDA7XG5cdGlmIChzaWduYXR1cmVbb2Zmc2V0KytdICE9PSBFTkNPREVEX1RBR19TRVEpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIFwic2VxXCInKTtcblx0fVxuXG5cdHZhciBzZXFMZW5ndGggPSBzaWduYXR1cmVbb2Zmc2V0KytdO1xuXHRpZiAoc2VxTGVuZ3RoID09PSAoTUFYX09DVEVUIHwgMSkpIHtcblx0XHRzZXFMZW5ndGggPSBzaWduYXR1cmVbb2Zmc2V0KytdO1xuXHR9XG5cblx0aWYgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0IDwgc2VxTGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdcInNlcVwiIHNwZWNpZmllZCBsZW5ndGggb2YgXCInICsgc2VxTGVuZ3RoICsgJ1wiLCBvbmx5IFwiJyArIChpbnB1dExlbmd0aCAtIG9mZnNldCkgKyAnXCIgcmVtYWluaW5nJyk7XG5cdH1cblxuXHRpZiAoc2lnbmF0dXJlW29mZnNldCsrXSAhPT0gRU5DT0RFRF9UQUdfSU5UKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBleHBlY3RlZCBcImludFwiIGZvciBcInJcIicpO1xuXHR9XG5cblx0dmFyIHJMZW5ndGggPSBzaWduYXR1cmVbb2Zmc2V0KytdO1xuXG5cdGlmIChpbnB1dExlbmd0aCAtIG9mZnNldCAtIDIgPCByTGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdcInJcIiBzcGVjaWZpZWQgbGVuZ3RoIG9mIFwiJyArIHJMZW5ndGggKyAnXCIsIG9ubHkgXCInICsgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0IC0gMikgKyAnXCIgYXZhaWxhYmxlJyk7XG5cdH1cblxuXHRpZiAobWF4RW5jb2RlZFBhcmFtTGVuZ3RoIDwgckxlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJyXCIgc3BlY2lmaWVkIGxlbmd0aCBvZiBcIicgKyByTGVuZ3RoICsgJ1wiLCBtYXggb2YgXCInICsgbWF4RW5jb2RlZFBhcmFtTGVuZ3RoICsgJ1wiIGlzIGFjY2VwdGFibGUnKTtcblx0fVxuXG5cdHZhciByT2Zmc2V0ID0gb2Zmc2V0O1xuXHRvZmZzZXQgKz0gckxlbmd0aDtcblxuXHRpZiAoc2lnbmF0dXJlW29mZnNldCsrXSAhPT0gRU5DT0RFRF9UQUdfSU5UKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBleHBlY3RlZCBcImludFwiIGZvciBcInNcIicpO1xuXHR9XG5cblx0dmFyIHNMZW5ndGggPSBzaWduYXR1cmVbb2Zmc2V0KytdO1xuXG5cdGlmIChpbnB1dExlbmd0aCAtIG9mZnNldCAhPT0gc0xlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJzXCIgc3BlY2lmaWVkIGxlbmd0aCBvZiBcIicgKyBzTGVuZ3RoICsgJ1wiLCBleHBlY3RlZCBcIicgKyAoaW5wdXRMZW5ndGggLSBvZmZzZXQpICsgJ1wiJyk7XG5cdH1cblxuXHRpZiAobWF4RW5jb2RlZFBhcmFtTGVuZ3RoIDwgc0xlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJzXCIgc3BlY2lmaWVkIGxlbmd0aCBvZiBcIicgKyBzTGVuZ3RoICsgJ1wiLCBtYXggb2YgXCInICsgbWF4RW5jb2RlZFBhcmFtTGVuZ3RoICsgJ1wiIGlzIGFjY2VwdGFibGUnKTtcblx0fVxuXG5cdHZhciBzT2Zmc2V0ID0gb2Zmc2V0O1xuXHRvZmZzZXQgKz0gc0xlbmd0aDtcblxuXHRpZiAob2Zmc2V0ICE9PSBpbnB1dExlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gY29uc3VtZSBlbnRpcmUgYnVmZmVyLCBidXQgXCInICsgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0KSArICdcIiBieXRlcyByZW1haW4nKTtcblx0fVxuXG5cdHZhciByUGFkZGluZyA9IHBhcmFtQnl0ZXMgLSByTGVuZ3RoLFxuXHRcdHNQYWRkaW5nID0gcGFyYW1CeXRlcyAtIHNMZW5ndGg7XG5cblx0dmFyIGRzdCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShyUGFkZGluZyArIHJMZW5ndGggKyBzUGFkZGluZyArIHNMZW5ndGgpO1xuXG5cdGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgclBhZGRpbmc7ICsrb2Zmc2V0KSB7XG5cdFx0ZHN0W29mZnNldF0gPSAwO1xuXHR9XG5cdHNpZ25hdHVyZS5jb3B5KGRzdCwgb2Zmc2V0LCByT2Zmc2V0ICsgTWF0aC5tYXgoLXJQYWRkaW5nLCAwKSwgck9mZnNldCArIHJMZW5ndGgpO1xuXG5cdG9mZnNldCA9IHBhcmFtQnl0ZXM7XG5cblx0Zm9yICh2YXIgbyA9IG9mZnNldDsgb2Zmc2V0IDwgbyArIHNQYWRkaW5nOyArK29mZnNldCkge1xuXHRcdGRzdFtvZmZzZXRdID0gMDtcblx0fVxuXHRzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgc09mZnNldCArIE1hdGgubWF4KC1zUGFkZGluZywgMCksIHNPZmZzZXQgKyBzTGVuZ3RoKTtcblxuXHRkc3QgPSBkc3QudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXHRkc3QgPSBiYXNlNjRVcmwoZHN0KTtcblxuXHRyZXR1cm4gZHN0O1xufVxuXG5mdW5jdGlvbiBjb3VudFBhZGRpbmcoYnVmLCBzdGFydCwgc3RvcCkge1xuXHR2YXIgcGFkZGluZyA9IDA7XG5cdHdoaWxlIChzdGFydCArIHBhZGRpbmcgPCBzdG9wICYmIGJ1ZltzdGFydCArIHBhZGRpbmddID09PSAwKSB7XG5cdFx0KytwYWRkaW5nO1xuXHR9XG5cblx0dmFyIG5lZWRzU2lnbiA9IGJ1ZltzdGFydCArIHBhZGRpbmddID49IE1BWF9PQ1RFVDtcblx0aWYgKG5lZWRzU2lnbikge1xuXHRcdC0tcGFkZGluZztcblx0fVxuXG5cdHJldHVybiBwYWRkaW5nO1xufVxuXG5mdW5jdGlvbiBqb3NlVG9EZXIoc2lnbmF0dXJlLCBhbGcpIHtcblx0c2lnbmF0dXJlID0gc2lnbmF0dXJlQXNCdWZmZXIoc2lnbmF0dXJlKTtcblx0dmFyIHBhcmFtQnl0ZXMgPSBnZXRQYXJhbUJ5dGVzRm9yQWxnKGFsZyk7XG5cblx0dmFyIHNpZ25hdHVyZUJ5dGVzID0gc2lnbmF0dXJlLmxlbmd0aDtcblx0aWYgKHNpZ25hdHVyZUJ5dGVzICE9PSBwYXJhbUJ5dGVzICogMikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiJyArIGFsZyArICdcIiBzaWduYXR1cmVzIG11c3QgYmUgXCInICsgcGFyYW1CeXRlcyAqIDIgKyAnXCIgYnl0ZXMsIHNhdyBcIicgKyBzaWduYXR1cmVCeXRlcyArICdcIicpO1xuXHR9XG5cblx0dmFyIHJQYWRkaW5nID0gY291bnRQYWRkaW5nKHNpZ25hdHVyZSwgMCwgcGFyYW1CeXRlcyk7XG5cdHZhciBzUGFkZGluZyA9IGNvdW50UGFkZGluZyhzaWduYXR1cmUsIHBhcmFtQnl0ZXMsIHNpZ25hdHVyZS5sZW5ndGgpO1xuXHR2YXIgckxlbmd0aCA9IHBhcmFtQnl0ZXMgLSByUGFkZGluZztcblx0dmFyIHNMZW5ndGggPSBwYXJhbUJ5dGVzIC0gc1BhZGRpbmc7XG5cblx0dmFyIHJzQnl0ZXMgPSAxICsgMSArIHJMZW5ndGggKyAxICsgMSArIHNMZW5ndGg7XG5cblx0dmFyIHNob3J0TGVuZ3RoID0gcnNCeXRlcyA8IE1BWF9PQ1RFVDtcblxuXHR2YXIgZHN0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKChzaG9ydExlbmd0aCA/IDIgOiAzKSArIHJzQnl0ZXMpO1xuXG5cdHZhciBvZmZzZXQgPSAwO1xuXHRkc3Rbb2Zmc2V0KytdID0gRU5DT0RFRF9UQUdfU0VRO1xuXHRpZiAoc2hvcnRMZW5ndGgpIHtcblx0XHQvLyBCaXQgOCBoYXMgdmFsdWUgXCIwXCJcblx0XHQvLyBiaXRzIDctMSBnaXZlIHRoZSBsZW5ndGguXG5cdFx0ZHN0W29mZnNldCsrXSA9IHJzQnl0ZXM7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQml0IDggb2YgZmlyc3Qgb2N0ZXQgaGFzIHZhbHVlIFwiMVwiXG5cdFx0Ly8gYml0cyA3LTEgZ2l2ZSB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgbGVuZ3RoIG9jdGV0cy5cblx0XHRkc3Rbb2Zmc2V0KytdID0gTUFYX09DVEVUXHR8IDE7XG5cdFx0Ly8gbGVuZ3RoLCBiYXNlIDI1NlxuXHRcdGRzdFtvZmZzZXQrK10gPSByc0J5dGVzICYgMHhmZjtcblx0fVxuXHRkc3Rbb2Zmc2V0KytdID0gRU5DT0RFRF9UQUdfSU5UO1xuXHRkc3Rbb2Zmc2V0KytdID0gckxlbmd0aDtcblx0aWYgKHJQYWRkaW5nIDwgMCkge1xuXHRcdGRzdFtvZmZzZXQrK10gPSAwO1xuXHRcdG9mZnNldCArPSBzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgMCwgcGFyYW1CeXRlcyk7XG5cdH0gZWxzZSB7XG5cdFx0b2Zmc2V0ICs9IHNpZ25hdHVyZS5jb3B5KGRzdCwgb2Zmc2V0LCByUGFkZGluZywgcGFyYW1CeXRlcyk7XG5cdH1cblx0ZHN0W29mZnNldCsrXSA9IEVOQ09ERURfVEFHX0lOVDtcblx0ZHN0W29mZnNldCsrXSA9IHNMZW5ndGg7XG5cdGlmIChzUGFkZGluZyA8IDApIHtcblx0XHRkc3Rbb2Zmc2V0KytdID0gMDtcblx0XHRzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgcGFyYW1CeXRlcyk7XG5cdH0gZWxzZSB7XG5cdFx0c2lnbmF0dXJlLmNvcHkoZHN0LCBvZmZzZXQsIHBhcmFtQnl0ZXMgKyBzUGFkZGluZyk7XG5cdH1cblxuXHRyZXR1cm4gZHN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0ZGVyVG9Kb3NlOiBkZXJUb0pvc2UsXG5cdGpvc2VUb0Rlcjogam9zZVRvRGVyXG59O1xuIiwKICAgICIvKmpzaGludCBub2RlOnRydWUgKi9cbid1c2Ugc3RyaWN0JztcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7IC8vIGJyb3dzZXJpZnlcbnZhciBTbG93QnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuU2xvd0J1ZmZlcjtcblxubW9kdWxlLmV4cG9ydHMgPSBidWZmZXJFcTtcblxuZnVuY3Rpb24gYnVmZmVyRXEoYSwgYikge1xuXG4gIC8vIHNob3J0Y3V0dGluZyBvbiB0eXBlIGlzIG5lY2Vzc2FyeSBmb3IgY29ycmVjdG5lc3NcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGJ1ZmZlciBzaXplcyBzaG91bGQgYmUgd2VsbC1rbm93biBpbmZvcm1hdGlvbiwgc28gZGVzcGl0ZSB0aGlzXG4gIC8vIHNob3J0Y3V0dGluZywgaXQgZG9lc24ndCBsZWFrIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgKmNvbnRlbnRzKiBvZiB0aGVcbiAgLy8gYnVmZmVycy5cbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBjID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgLypqc2hpbnQgYml0d2lzZTpmYWxzZSAqL1xuICAgIGMgfD0gYVtpXSBeIGJbaV07IC8vIFhPUlxuICB9XG4gIHJldHVybiBjID09PSAwO1xufVxuXG5idWZmZXJFcS5pbnN0YWxsID0gZnVuY3Rpb24oKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuZXF1YWwgPSBTbG93QnVmZmVyLnByb3RvdHlwZS5lcXVhbCA9IGZ1bmN0aW9uIGVxdWFsKHRoYXQpIHtcbiAgICByZXR1cm4gYnVmZmVyRXEodGhpcywgdGhhdCk7XG4gIH07XG59O1xuXG52YXIgb3JpZ0J1ZkVxdWFsID0gQnVmZmVyLnByb3RvdHlwZS5lcXVhbDtcbnZhciBvcmlnU2xvd0J1ZkVxdWFsID0gU2xvd0J1ZmZlci5wcm90b3R5cGUuZXF1YWw7XG5idWZmZXJFcS5yZXN0b3JlID0gZnVuY3Rpb24oKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuZXF1YWwgPSBvcmlnQnVmRXF1YWw7XG4gIFNsb3dCdWZmZXIucHJvdG90eXBlLmVxdWFsID0gb3JpZ1Nsb3dCdWZFcXVhbDtcbn07XG4iLAogICAgInZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbnZhciBmb3JtYXRFY2RzYSA9IHJlcXVpcmUoJ2VjZHNhLXNpZy1mb3JtYXR0ZXInKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG52YXIgTVNHX0lOVkFMSURfQUxHT1JJVEhNID0gJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCBhbGdvcml0aG0uXFxuICBTdXBwb3J0ZWQgYWxnb3JpdGhtcyBhcmU6XFxuICBcIkhTMjU2XCIsIFwiSFMzODRcIiwgXCJIUzUxMlwiLCBcIlJTMjU2XCIsIFwiUlMzODRcIiwgXCJSUzUxMlwiLCBcIlBTMjU2XCIsIFwiUFMzODRcIiwgXCJQUzUxMlwiLCBcIkVTMjU2XCIsIFwiRVMzODRcIiwgXCJFUzUxMlwiIGFuZCBcIm5vbmVcIi4nXG52YXIgTVNHX0lOVkFMSURfU0VDUkVUID0gJ3NlY3JldCBtdXN0IGJlIGEgc3RyaW5nIG9yIGJ1ZmZlcic7XG52YXIgTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZID0gJ2tleSBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgYnVmZmVyJztcbnZhciBNU0dfSU5WQUxJRF9TSUdORVJfS0VZID0gJ2tleSBtdXN0IGJlIGEgc3RyaW5nLCBhIGJ1ZmZlciBvciBhbiBvYmplY3QnO1xuXG52YXIgc3VwcG9ydHNLZXlPYmplY3RzID0gdHlwZW9mIGNyeXB0by5jcmVhdGVQdWJsaWNLZXkgPT09ICdmdW5jdGlvbic7XG5pZiAoc3VwcG9ydHNLZXlPYmplY3RzKSB7XG4gIE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSArPSAnIG9yIGEgS2V5T2JqZWN0JztcbiAgTVNHX0lOVkFMSURfU0VDUkVUICs9ICdvciBhIEtleU9iamVjdCc7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSXNQdWJsaWNLZXkoa2V5KSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghc3VwcG9ydHNLZXlPYmplY3RzKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleSAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5LnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleS5hc3ltbWV0cmljS2V5VHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5LmV4cG9ydCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9WRVJJRklFUl9LRVkpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjaGVja0lzUHJpdmF0ZUtleShrZXkpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihrZXkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1NJR05FUl9LRVkpO1xufTtcblxuZnVuY3Rpb24gY2hlY2tJc1NlY3JldEtleShrZXkpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihrZXkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIGlmICghc3VwcG9ydHNLZXlPYmplY3RzKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1NFQ1JFVCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleSAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfU0VDUkVUKTtcbiAgfVxuXG4gIGlmIChrZXkudHlwZSAhPT0gJ3NlY3JldCcpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfU0VDUkVUKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5LmV4cG9ydCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9TRUNSRVQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZyb21CYXNlNjQoYmFzZTY0KSB7XG4gIHJldHVybiBiYXNlNjRcbiAgICAucmVwbGFjZSgvPS9nLCAnJylcbiAgICAucmVwbGFjZSgvXFwrL2csICctJylcbiAgICAucmVwbGFjZSgvXFwvL2csICdfJyk7XG59XG5cbmZ1bmN0aW9uIHRvQmFzZTY0KGJhc2U2NHVybCkge1xuICBiYXNlNjR1cmwgPSBiYXNlNjR1cmwudG9TdHJpbmcoKTtcblxuICB2YXIgcGFkZGluZyA9IDQgLSBiYXNlNjR1cmwubGVuZ3RoICUgNDtcbiAgaWYgKHBhZGRpbmcgIT09IDQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZGRpbmc7ICsraSkge1xuICAgICAgYmFzZTY0dXJsICs9ICc9JztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFzZTY0dXJsXG4gICAgLnJlcGxhY2UoL1xcLS9nLCAnKycpXG4gICAgLnJlcGxhY2UoL18vZywgJy8nKTtcbn1cblxuZnVuY3Rpb24gdHlwZUVycm9yKHRlbXBsYXRlKSB7XG4gIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB2YXIgZXJyTXNnID0gdXRpbC5mb3JtYXQuYmluZCh1dGlsLCB0ZW1wbGF0ZSkuYXBwbHkobnVsbCwgYXJncyk7XG4gIHJldHVybiBuZXcgVHlwZUVycm9yKGVyck1zZyk7XG59XG5cbmZ1bmN0aW9uIGJ1ZmZlck9yU3RyaW5nKG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaikgfHwgdHlwZW9mIG9iaiA9PT0gJ3N0cmluZyc7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUlucHV0KHRoaW5nKSB7XG4gIGlmICghYnVmZmVyT3JTdHJpbmcodGhpbmcpKVxuICAgIHRoaW5nID0gSlNPTi5zdHJpbmdpZnkodGhpbmcpO1xuICByZXR1cm4gdGhpbmc7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhtYWNTaWduZXIoYml0cykge1xuICByZXR1cm4gZnVuY3Rpb24gc2lnbih0aGluZywgc2VjcmV0KSB7XG4gICAgY2hlY2tJc1NlY3JldEtleShzZWNyZXQpO1xuICAgIHRoaW5nID0gbm9ybWFsaXplSW5wdXQodGhpbmcpO1xuICAgIHZhciBobWFjID0gY3J5cHRvLmNyZWF0ZUhtYWMoJ3NoYScgKyBiaXRzLCBzZWNyZXQpO1xuICAgIHZhciBzaWcgPSAoaG1hYy51cGRhdGUodGhpbmcpLCBobWFjLmRpZ2VzdCgnYmFzZTY0JykpXG4gICAgcmV0dXJuIGZyb21CYXNlNjQoc2lnKTtcbiAgfVxufVxuXG52YXIgYnVmZmVyRXF1YWw7XG52YXIgdGltaW5nU2FmZUVxdWFsID0gJ3RpbWluZ1NhZmVFcXVhbCcgaW4gY3J5cHRvID8gZnVuY3Rpb24gdGltaW5nU2FmZUVxdWFsKGEsIGIpIHtcbiAgaWYgKGEuYnl0ZUxlbmd0aCAhPT0gYi5ieXRlTGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGNyeXB0by50aW1pbmdTYWZlRXF1YWwoYSwgYilcbn0gOiBmdW5jdGlvbiB0aW1pbmdTYWZlRXF1YWwoYSwgYikge1xuICBpZiAoIWJ1ZmZlckVxdWFsKSB7XG4gICAgYnVmZmVyRXF1YWwgPSByZXF1aXJlKCdidWZmZXItZXF1YWwtY29uc3RhbnQtdGltZScpO1xuICB9XG5cbiAgcmV0dXJuIGJ1ZmZlckVxdWFsKGEsIGIpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhtYWNWZXJpZmllcihiaXRzKSB7XG4gIHJldHVybiBmdW5jdGlvbiB2ZXJpZnkodGhpbmcsIHNpZ25hdHVyZSwgc2VjcmV0KSB7XG4gICAgdmFyIGNvbXB1dGVkU2lnID0gY3JlYXRlSG1hY1NpZ25lcihiaXRzKSh0aGluZywgc2VjcmV0KTtcbiAgICByZXR1cm4gdGltaW5nU2FmZUVxdWFsKEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSksIEJ1ZmZlci5mcm9tKGNvbXB1dGVkU2lnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5U2lnbmVyKGJpdHMpIHtcbiByZXR1cm4gZnVuY3Rpb24gc2lnbih0aGluZywgcHJpdmF0ZUtleSkge1xuICAgIGNoZWNrSXNQcml2YXRlS2V5KHByaXZhdGVLZXkpO1xuICAgIHRoaW5nID0gbm9ybWFsaXplSW5wdXQodGhpbmcpO1xuICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGFyZSBzcGVjaWZ5aW5nIFwiUlNBXCIgaGVyZSwgdGhpcyB3b3JrcyB3aXRoIEVDRFNBXG4gICAgLy8ga2V5cyBhcyB3ZWxsLlxuICAgIHZhciBzaWduZXIgPSBjcnlwdG8uY3JlYXRlU2lnbignUlNBLVNIQScgKyBiaXRzKTtcbiAgICB2YXIgc2lnID0gKHNpZ25lci51cGRhdGUodGhpbmcpLCBzaWduZXIuc2lnbihwcml2YXRlS2V5LCAnYmFzZTY0JykpO1xuICAgIHJldHVybiBmcm9tQmFzZTY0KHNpZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5VmVyaWZpZXIoYml0cykge1xuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KHRoaW5nLCBzaWduYXR1cmUsIHB1YmxpY0tleSkge1xuICAgIGNoZWNrSXNQdWJsaWNLZXkocHVibGljS2V5KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICBzaWduYXR1cmUgPSB0b0Jhc2U2NChzaWduYXR1cmUpO1xuICAgIHZhciB2ZXJpZmllciA9IGNyeXB0by5jcmVhdGVWZXJpZnkoJ1JTQS1TSEEnICsgYml0cyk7XG4gICAgdmVyaWZpZXIudXBkYXRlKHRoaW5nKTtcbiAgICByZXR1cm4gdmVyaWZpZXIudmVyaWZ5KHB1YmxpY0tleSwgc2lnbmF0dXJlLCAnYmFzZTY0Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlUFNTS2V5U2lnbmVyKGJpdHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNpZ24odGhpbmcsIHByaXZhdGVLZXkpIHtcbiAgICBjaGVja0lzUHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICB2YXIgc2lnbmVyID0gY3J5cHRvLmNyZWF0ZVNpZ24oJ1JTQS1TSEEnICsgYml0cyk7XG4gICAgdmFyIHNpZyA9IChzaWduZXIudXBkYXRlKHRoaW5nKSwgc2lnbmVyLnNpZ24oe1xuICAgICAga2V5OiBwcml2YXRlS2V5LFxuICAgICAgcGFkZGluZzogY3J5cHRvLmNvbnN0YW50cy5SU0FfUEtDUzFfUFNTX1BBRERJTkcsXG4gICAgICBzYWx0TGVuZ3RoOiBjcnlwdG8uY29uc3RhbnRzLlJTQV9QU1NfU0FMVExFTl9ESUdFU1RcbiAgICB9LCAnYmFzZTY0JykpO1xuICAgIHJldHVybiBmcm9tQmFzZTY0KHNpZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlUFNTS2V5VmVyaWZpZXIoYml0cykge1xuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KHRoaW5nLCBzaWduYXR1cmUsIHB1YmxpY0tleSkge1xuICAgIGNoZWNrSXNQdWJsaWNLZXkocHVibGljS2V5KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICBzaWduYXR1cmUgPSB0b0Jhc2U2NChzaWduYXR1cmUpO1xuICAgIHZhciB2ZXJpZmllciA9IGNyeXB0by5jcmVhdGVWZXJpZnkoJ1JTQS1TSEEnICsgYml0cyk7XG4gICAgdmVyaWZpZXIudXBkYXRlKHRoaW5nKTtcbiAgICByZXR1cm4gdmVyaWZpZXIudmVyaWZ5KHtcbiAgICAgIGtleTogcHVibGljS2V5LFxuICAgICAgcGFkZGluZzogY3J5cHRvLmNvbnN0YW50cy5SU0FfUEtDUzFfUFNTX1BBRERJTkcsXG4gICAgICBzYWx0TGVuZ3RoOiBjcnlwdG8uY29uc3RhbnRzLlJTQV9QU1NfU0FMVExFTl9ESUdFU1RcbiAgICB9LCBzaWduYXR1cmUsICdiYXNlNjQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFQ0RTQVNpZ25lcihiaXRzKSB7XG4gIHZhciBpbm5lciA9IGNyZWF0ZUtleVNpZ25lcihiaXRzKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNpZ24oKSB7XG4gICAgdmFyIHNpZ25hdHVyZSA9IGlubmVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgc2lnbmF0dXJlID0gZm9ybWF0RWNkc2EuZGVyVG9Kb3NlKHNpZ25hdHVyZSwgJ0VTJyArIGJpdHMpO1xuICAgIHJldHVybiBzaWduYXR1cmU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVDRFNBVmVyaWZlcihiaXRzKSB7XG4gIHZhciBpbm5lciA9IGNyZWF0ZUtleVZlcmlmaWVyKGJpdHMpO1xuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KHRoaW5nLCBzaWduYXR1cmUsIHB1YmxpY0tleSkge1xuICAgIHNpZ25hdHVyZSA9IGZvcm1hdEVjZHNhLmpvc2VUb0RlcihzaWduYXR1cmUsICdFUycgKyBiaXRzKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgdmFyIHJlc3VsdCA9IGlubmVyKHRoaW5nLCBzaWduYXR1cmUsIHB1YmxpY0tleSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTm9uZVNpZ25lcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNpZ24oKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5vbmVWZXJpZmllcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZlcmlmeSh0aGluZywgc2lnbmF0dXJlKSB7XG4gICAgcmV0dXJuIHNpZ25hdHVyZSA9PT0gJyc7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBqd2EoYWxnb3JpdGhtKSB7XG4gIHZhciBzaWduZXJGYWN0b3JpZXMgPSB7XG4gICAgaHM6IGNyZWF0ZUhtYWNTaWduZXIsXG4gICAgcnM6IGNyZWF0ZUtleVNpZ25lcixcbiAgICBwczogY3JlYXRlUFNTS2V5U2lnbmVyLFxuICAgIGVzOiBjcmVhdGVFQ0RTQVNpZ25lcixcbiAgICBub25lOiBjcmVhdGVOb25lU2lnbmVyLFxuICB9XG4gIHZhciB2ZXJpZmllckZhY3RvcmllcyA9IHtcbiAgICBoczogY3JlYXRlSG1hY1ZlcmlmaWVyLFxuICAgIHJzOiBjcmVhdGVLZXlWZXJpZmllcixcbiAgICBwczogY3JlYXRlUFNTS2V5VmVyaWZpZXIsXG4gICAgZXM6IGNyZWF0ZUVDRFNBVmVyaWZlcixcbiAgICBub25lOiBjcmVhdGVOb25lVmVyaWZpZXIsXG4gIH1cbiAgdmFyIG1hdGNoID0gYWxnb3JpdGhtLm1hdGNoKC9eKFJTfFBTfEVTfEhTKSgyNTZ8Mzg0fDUxMikkfF4obm9uZSkkL2kpO1xuICBpZiAoIW1hdGNoKVxuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9BTEdPUklUSE0sIGFsZ29yaXRobSk7XG4gIHZhciBhbGdvID0gKG1hdGNoWzFdIHx8IG1hdGNoWzNdKS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgYml0cyA9IG1hdGNoWzJdO1xuXG4gIHJldHVybiB7XG4gICAgc2lnbjogc2lnbmVyRmFjdG9yaWVzW2FsZ29dKGJpdHMpLFxuICAgIHZlcmlmeTogdmVyaWZpZXJGYWN0b3JpZXNbYWxnb10oYml0cyksXG4gIH1cbn07XG4iLAogICAgIi8qZ2xvYmFsIG1vZHVsZSovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9iaikge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpXG4gICAgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdudW1iZXInIHx8IEJ1ZmZlci5pc0J1ZmZlcihvYmopKVxuICAgIHJldHVybiBvYmoudG9TdHJpbmcoKTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaik7XG59O1xuIiwKICAgICIvKmdsb2JhbCBtb2R1bGUqL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIERhdGFTdHJlYW0gPSByZXF1aXJlKCcuL2RhdGEtc3RyZWFtJyk7XG52YXIgandhID0gcmVxdWlyZSgnandhJyk7XG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3Rvc3RyaW5nJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuZnVuY3Rpb24gYmFzZTY0dXJsKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIEJ1ZmZlclxuICAgIC5mcm9tKHN0cmluZywgZW5jb2RpbmcpXG4gICAgLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIC5yZXBsYWNlKC89L2csICcnKVxuICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuICAgIC5yZXBsYWNlKC9cXC8vZywgJ18nKTtcbn1cblxuZnVuY3Rpb24gandzU2VjdXJlZElucHV0KGhlYWRlciwgcGF5bG9hZCwgZW5jb2RpbmcpIHtcbiAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCAndXRmOCc7XG4gIHZhciBlbmNvZGVkSGVhZGVyID0gYmFzZTY0dXJsKHRvU3RyaW5nKGhlYWRlciksICdiaW5hcnknKTtcbiAgdmFyIGVuY29kZWRQYXlsb2FkID0gYmFzZTY0dXJsKHRvU3RyaW5nKHBheWxvYWQpLCBlbmNvZGluZyk7XG4gIHJldHVybiB1dGlsLmZvcm1hdCgnJXMuJXMnLCBlbmNvZGVkSGVhZGVyLCBlbmNvZGVkUGF5bG9hZCk7XG59XG5cbmZ1bmN0aW9uIGp3c1NpZ24ob3B0cykge1xuICB2YXIgaGVhZGVyID0gb3B0cy5oZWFkZXI7XG4gIHZhciBwYXlsb2FkID0gb3B0cy5wYXlsb2FkO1xuICB2YXIgc2VjcmV0T3JLZXkgPSBvcHRzLnNlY3JldCB8fCBvcHRzLnByaXZhdGVLZXk7XG4gIHZhciBlbmNvZGluZyA9IG9wdHMuZW5jb2Rpbmc7XG4gIHZhciBhbGdvID0gandhKGhlYWRlci5hbGcpO1xuICB2YXIgc2VjdXJlZElucHV0ID0gandzU2VjdXJlZElucHV0KGhlYWRlciwgcGF5bG9hZCwgZW5jb2RpbmcpO1xuICB2YXIgc2lnbmF0dXJlID0gYWxnby5zaWduKHNlY3VyZWRJbnB1dCwgc2VjcmV0T3JLZXkpO1xuICByZXR1cm4gdXRpbC5mb3JtYXQoJyVzLiVzJywgc2VjdXJlZElucHV0LCBzaWduYXR1cmUpO1xufVxuXG5mdW5jdGlvbiBTaWduU3RyZWFtKG9wdHMpIHtcbiAgdmFyIHNlY3JldCA9IG9wdHMuc2VjcmV0fHxvcHRzLnByaXZhdGVLZXl8fG9wdHMua2V5O1xuICB2YXIgc2VjcmV0U3RyZWFtID0gbmV3IERhdGFTdHJlYW0oc2VjcmV0KTtcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG4gIHRoaXMuaGVhZGVyID0gb3B0cy5oZWFkZXI7XG4gIHRoaXMuZW5jb2RpbmcgPSBvcHRzLmVuY29kaW5nO1xuICB0aGlzLnNlY3JldCA9IHRoaXMucHJpdmF0ZUtleSA9IHRoaXMua2V5ID0gc2VjcmV0U3RyZWFtO1xuICB0aGlzLnBheWxvYWQgPSBuZXcgRGF0YVN0cmVhbShvcHRzLnBheWxvYWQpO1xuICB0aGlzLnNlY3JldC5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMucGF5bG9hZC53cml0YWJsZSAmJiB0aGlzLnJlYWRhYmxlKVxuICAgICAgdGhpcy5zaWduKCk7XG4gIH0uYmluZCh0aGlzKSk7XG5cbiAgdGhpcy5wYXlsb2FkLm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5zZWNyZXQud3JpdGFibGUgJiYgdGhpcy5yZWFkYWJsZSlcbiAgICAgIHRoaXMuc2lnbigpO1xuICB9LmJpbmQodGhpcykpO1xufVxudXRpbC5pbmhlcml0cyhTaWduU3RyZWFtLCBTdHJlYW0pO1xuXG5TaWduU3RyZWFtLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gc2lnbigpIHtcbiAgdHJ5IHtcbiAgICB2YXIgc2lnbmF0dXJlID0gandzU2lnbih7XG4gICAgICBoZWFkZXI6IHRoaXMuaGVhZGVyLFxuICAgICAgcGF5bG9hZDogdGhpcy5wYXlsb2FkLmJ1ZmZlcixcbiAgICAgIHNlY3JldDogdGhpcy5zZWNyZXQuYnVmZmVyLFxuICAgICAgZW5jb2Rpbmc6IHRoaXMuZW5jb2RpbmdcbiAgICB9KTtcbiAgICB0aGlzLmVtaXQoJ2RvbmUnLCBzaWduYXR1cmUpO1xuICAgIHRoaXMuZW1pdCgnZGF0YScsIHNpZ25hdHVyZSk7XG4gICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgcmV0dXJuIHNpZ25hdHVyZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgdGhpcy5lbWl0KCdjbG9zZScpO1xuICB9XG59O1xuXG5TaWduU3RyZWFtLnNpZ24gPSBqd3NTaWduO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNpZ25TdHJlYW07XG4iLAogICAgIi8qZ2xvYmFsIG1vZHVsZSovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgRGF0YVN0cmVhbSA9IHJlcXVpcmUoJy4vZGF0YS1zdHJlYW0nKTtcbnZhciBqd2EgPSByZXF1aXJlKCdqd2EnKTtcbnZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4vdG9zdHJpbmcnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIEpXU19SRUdFWCA9IC9eW2EtekEtWjAtOVxcLV9dKz9cXC5bYS16QS1aMC05XFwtX10rP1xcLihbYS16QS1aMC05XFwtX10rKT8kLztcblxuZnVuY3Rpb24gaXNPYmplY3QodGhpbmcpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGluZykgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuXG5mdW5jdGlvbiBzYWZlSnNvblBhcnNlKHRoaW5nKSB7XG4gIGlmIChpc09iamVjdCh0aGluZykpXG4gICAgcmV0dXJuIHRoaW5nO1xuICB0cnkgeyByZXR1cm4gSlNPTi5wYXJzZSh0aGluZyk7IH1cbiAgY2F0Y2ggKGUpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxufVxuXG5mdW5jdGlvbiBoZWFkZXJGcm9tSldTKGp3c1NpZykge1xuICB2YXIgZW5jb2RlZEhlYWRlciA9IGp3c1NpZy5zcGxpdCgnLicsIDEpWzBdO1xuICByZXR1cm4gc2FmZUpzb25QYXJzZShCdWZmZXIuZnJvbShlbmNvZGVkSGVhZGVyLCAnYmFzZTY0JykudG9TdHJpbmcoJ2JpbmFyeScpKTtcbn1cblxuZnVuY3Rpb24gc2VjdXJlZElucHV0RnJvbUpXUyhqd3NTaWcpIHtcbiAgcmV0dXJuIGp3c1NpZy5zcGxpdCgnLicsIDIpLmpvaW4oJy4nKTtcbn1cblxuZnVuY3Rpb24gc2lnbmF0dXJlRnJvbUpXUyhqd3NTaWcpIHtcbiAgcmV0dXJuIGp3c1NpZy5zcGxpdCgnLicpWzJdO1xufVxuXG5mdW5jdGlvbiBwYXlsb2FkRnJvbUpXUyhqd3NTaWcsIGVuY29kaW5nKSB7XG4gIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0ZjgnO1xuICB2YXIgcGF5bG9hZCA9IGp3c1NpZy5zcGxpdCgnLicpWzFdO1xuICByZXR1cm4gQnVmZmVyLmZyb20ocGF5bG9hZCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKGVuY29kaW5nKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEp3cyhzdHJpbmcpIHtcbiAgcmV0dXJuIEpXU19SRUdFWC50ZXN0KHN0cmluZykgJiYgISFoZWFkZXJGcm9tSldTKHN0cmluZyk7XG59XG5cbmZ1bmN0aW9uIGp3c1ZlcmlmeShqd3NTaWcsIGFsZ29yaXRobSwgc2VjcmV0T3JLZXkpIHtcbiAgaWYgKCFhbGdvcml0aG0pIHtcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiTWlzc2luZyBhbGdvcml0aG0gcGFyYW1ldGVyIGZvciBqd3MudmVyaWZ5XCIpO1xuICAgIGVyci5jb2RlID0gXCJNSVNTSU5HX0FMR09SSVRITVwiO1xuICAgIHRocm93IGVycjtcbiAgfVxuICBqd3NTaWcgPSB0b1N0cmluZyhqd3NTaWcpO1xuICB2YXIgc2lnbmF0dXJlID0gc2lnbmF0dXJlRnJvbUpXUyhqd3NTaWcpO1xuICB2YXIgc2VjdXJlZElucHV0ID0gc2VjdXJlZElucHV0RnJvbUpXUyhqd3NTaWcpO1xuICB2YXIgYWxnbyA9IGp3YShhbGdvcml0aG0pO1xuICByZXR1cm4gYWxnby52ZXJpZnkoc2VjdXJlZElucHV0LCBzaWduYXR1cmUsIHNlY3JldE9yS2V5KTtcbn1cblxuZnVuY3Rpb24gandzRGVjb2RlKGp3c1NpZywgb3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgandzU2lnID0gdG9TdHJpbmcoandzU2lnKTtcblxuICBpZiAoIWlzVmFsaWRKd3MoandzU2lnKSlcbiAgICByZXR1cm4gbnVsbDtcblxuICB2YXIgaGVhZGVyID0gaGVhZGVyRnJvbUpXUyhqd3NTaWcpO1xuXG4gIGlmICghaGVhZGVyKVxuICAgIHJldHVybiBudWxsO1xuXG4gIHZhciBwYXlsb2FkID0gcGF5bG9hZEZyb21KV1MoandzU2lnKTtcbiAgaWYgKGhlYWRlci50eXAgPT09ICdKV1QnIHx8IG9wdHMuanNvbilcbiAgICBwYXlsb2FkID0gSlNPTi5wYXJzZShwYXlsb2FkLCBvcHRzLmVuY29kaW5nKTtcblxuICByZXR1cm4ge1xuICAgIGhlYWRlcjogaGVhZGVyLFxuICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgc2lnbmF0dXJlOiBzaWduYXR1cmVGcm9tSldTKGp3c1NpZylcbiAgfTtcbn1cblxuZnVuY3Rpb24gVmVyaWZ5U3RyZWFtKG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge307XG4gIHZhciBzZWNyZXRPcktleSA9IG9wdHMuc2VjcmV0fHxvcHRzLnB1YmxpY0tleXx8b3B0cy5rZXk7XG4gIHZhciBzZWNyZXRTdHJlYW0gPSBuZXcgRGF0YVN0cmVhbShzZWNyZXRPcktleSk7XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuICB0aGlzLmFsZ29yaXRobSA9IG9wdHMuYWxnb3JpdGhtO1xuICB0aGlzLmVuY29kaW5nID0gb3B0cy5lbmNvZGluZztcbiAgdGhpcy5zZWNyZXQgPSB0aGlzLnB1YmxpY0tleSA9IHRoaXMua2V5ID0gc2VjcmV0U3RyZWFtO1xuICB0aGlzLnNpZ25hdHVyZSA9IG5ldyBEYXRhU3RyZWFtKG9wdHMuc2lnbmF0dXJlKTtcbiAgdGhpcy5zZWNyZXQub25jZSgnY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLnNpZ25hdHVyZS53cml0YWJsZSAmJiB0aGlzLnJlYWRhYmxlKVxuICAgICAgdGhpcy52ZXJpZnkoKTtcbiAgfS5iaW5kKHRoaXMpKTtcblxuICB0aGlzLnNpZ25hdHVyZS5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuc2VjcmV0LndyaXRhYmxlICYmIHRoaXMucmVhZGFibGUpXG4gICAgICB0aGlzLnZlcmlmeSgpO1xuICB9LmJpbmQodGhpcykpO1xufVxudXRpbC5pbmhlcml0cyhWZXJpZnlTdHJlYW0sIFN0cmVhbSk7XG5WZXJpZnlTdHJlYW0ucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeSgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgdmFsaWQgPSBqd3NWZXJpZnkodGhpcy5zaWduYXR1cmUuYnVmZmVyLCB0aGlzLmFsZ29yaXRobSwgdGhpcy5rZXkuYnVmZmVyKTtcbiAgICB2YXIgb2JqID0gandzRGVjb2RlKHRoaXMuc2lnbmF0dXJlLmJ1ZmZlciwgdGhpcy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbWl0KCdkb25lJywgdmFsaWQsIG9iaik7XG4gICAgdGhpcy5lbWl0KCdkYXRhJywgdmFsaWQpO1xuICAgIHRoaXMuZW1pdCgnZW5kJyk7XG4gICAgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHJldHVybiB2YWxpZDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgdGhpcy5lbWl0KCdjbG9zZScpO1xuICB9XG59O1xuXG5WZXJpZnlTdHJlYW0uZGVjb2RlID0gandzRGVjb2RlO1xuVmVyaWZ5U3RyZWFtLmlzVmFsaWQgPSBpc1ZhbGlkSndzO1xuVmVyaWZ5U3RyZWFtLnZlcmlmeSA9IGp3c1ZlcmlmeTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZXJpZnlTdHJlYW07XG4iLAogICAgIi8qZ2xvYmFsIGV4cG9ydHMqL1xudmFyIFNpZ25TdHJlYW0gPSByZXF1aXJlKCcuL2xpYi9zaWduLXN0cmVhbScpO1xudmFyIFZlcmlmeVN0cmVhbSA9IHJlcXVpcmUoJy4vbGliL3ZlcmlmeS1zdHJlYW0nKTtcblxudmFyIEFMR09SSVRITVMgPSBbXG4gICdIUzI1NicsICdIUzM4NCcsICdIUzUxMicsXG4gICdSUzI1NicsICdSUzM4NCcsICdSUzUxMicsXG4gICdQUzI1NicsICdQUzM4NCcsICdQUzUxMicsXG4gICdFUzI1NicsICdFUzM4NCcsICdFUzUxMidcbl07XG5cbmV4cG9ydHMuQUxHT1JJVEhNUyA9IEFMR09SSVRITVM7XG5leHBvcnRzLnNpZ24gPSBTaWduU3RyZWFtLnNpZ247XG5leHBvcnRzLnZlcmlmeSA9IFZlcmlmeVN0cmVhbS52ZXJpZnk7XG5leHBvcnRzLmRlY29kZSA9IFZlcmlmeVN0cmVhbS5kZWNvZGU7XG5leHBvcnRzLmlzVmFsaWQgPSBWZXJpZnlTdHJlYW0uaXNWYWxpZDtcbmV4cG9ydHMuY3JlYXRlU2lnbiA9IGZ1bmN0aW9uIGNyZWF0ZVNpZ24ob3B0cykge1xuICByZXR1cm4gbmV3IFNpZ25TdHJlYW0ob3B0cyk7XG59O1xuZXhwb3J0cy5jcmVhdGVWZXJpZnkgPSBmdW5jdGlvbiBjcmVhdGVWZXJpZnkob3B0cykge1xuICByZXR1cm4gbmV3IFZlcmlmeVN0cmVhbShvcHRzKTtcbn07XG4iLAogICAgInZhciBqd3MgPSByZXF1aXJlKCdqd3MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoand0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgZGVjb2RlZCA9IGp3cy5kZWNvZGUoand0LCBvcHRpb25zKTtcbiAgaWYgKCFkZWNvZGVkKSB7IHJldHVybiBudWxsOyB9XG4gIHZhciBwYXlsb2FkID0gZGVjb2RlZC5wYXlsb2FkO1xuXG4gIC8vdHJ5IHBhcnNlIHRoZSBwYXlsb2FkXG4gIGlmKHR5cGVvZiBwYXlsb2FkID09PSAnc3RyaW5nJykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgb2JqID0gSlNPTi5wYXJzZShwYXlsb2FkKTtcbiAgICAgIGlmKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBwYXlsb2FkID0gb2JqO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgfVxuICB9XG5cbiAgLy9yZXR1cm4gaGVhZGVyIGlmIGBjb21wbGV0ZWAgb3B0aW9uIGlzIGVuYWJsZWQuICBoZWFkZXIgaW5jbHVkZXMgY2xhaW1zXG4gIC8vc3VjaCBhcyBga2lkYCBhbmQgYGFsZ2AgdXNlZCB0byBzZWxlY3QgdGhlIGtleSB3aXRoaW4gYSBKV0tTIG5lZWRlZCB0b1xuICAvL3ZlcmlmeSB0aGUgc2lnbmF0dXJlXG4gIGlmIChvcHRpb25zLmNvbXBsZXRlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWRlcjogZGVjb2RlZC5oZWFkZXIsXG4gICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgc2lnbmF0dXJlOiBkZWNvZGVkLnNpZ25hdHVyZVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHBheWxvYWQ7XG59O1xuIiwKICAgICJ2YXIgSnNvbldlYlRva2VuRXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSwgZXJyb3IpIHtcbiAgRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcbiAgaWYoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxuICB0aGlzLm5hbWUgPSAnSnNvbldlYlRva2VuRXJyb3InO1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICBpZiAoZXJyb3IpIHRoaXMuaW5uZXIgPSBlcnJvcjtcbn07XG5cbkpzb25XZWJUb2tlbkVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbkpzb25XZWJUb2tlbkVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEpzb25XZWJUb2tlbkVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEpzb25XZWJUb2tlbkVycm9yO1xuIiwKICAgICJ2YXIgSnNvbldlYlRva2VuRXJyb3IgPSByZXF1aXJlKCcuL0pzb25XZWJUb2tlbkVycm9yJyk7XG5cbnZhciBOb3RCZWZvcmVFcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBkYXRlKSB7XG4gIEpzb25XZWJUb2tlbkVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gIHRoaXMubmFtZSA9ICdOb3RCZWZvcmVFcnJvcic7XG4gIHRoaXMuZGF0ZSA9IGRhdGU7XG59O1xuXG5Ob3RCZWZvcmVFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEpzb25XZWJUb2tlbkVycm9yLnByb3RvdHlwZSk7XG5cbk5vdEJlZm9yZUVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE5vdEJlZm9yZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5vdEJlZm9yZUVycm9yOyIsCiAgICAidmFyIEpzb25XZWJUb2tlbkVycm9yID0gcmVxdWlyZSgnLi9Kc29uV2ViVG9rZW5FcnJvcicpO1xuXG52YXIgVG9rZW5FeHBpcmVkRXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSwgZXhwaXJlZEF0KSB7XG4gIEpzb25XZWJUb2tlbkVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gIHRoaXMubmFtZSA9ICdUb2tlbkV4cGlyZWRFcnJvcic7XG4gIHRoaXMuZXhwaXJlZEF0ID0gZXhwaXJlZEF0O1xufTtcblxuVG9rZW5FeHBpcmVkRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShKc29uV2ViVG9rZW5FcnJvci5wcm90b3R5cGUpO1xuXG5Ub2tlbkV4cGlyZWRFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb2tlbkV4cGlyZWRFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBUb2tlbkV4cGlyZWRFcnJvcjsiLAogICAgIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuICAgIHN0clxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICd3ZWVrcyc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgY2FzZSAndyc6XG4gICAgICByZXR1cm4gbiAqIHc7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgfVxuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBoLCAnaG91cicpO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gIH1cbiAgcmV0dXJuIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICB2YXIgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG4pICsgJyAnICsgbmFtZSArIChpc1BsdXJhbCA/ICdzJyA6ICcnKTtcbn1cbiIsCiAgICAidmFyIG1zID0gcmVxdWlyZSgnbXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGltZSwgaWF0KSB7XG4gIHZhciB0aW1lc3RhbXAgPSBpYXQgfHwgTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbiAgaWYgKHR5cGVvZiB0aW1lID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtaWxsaXNlY29uZHMgPSBtcyh0aW1lKTtcbiAgICBpZiAodHlwZW9mIG1pbGxpc2Vjb25kcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGguZmxvb3IodGltZXN0YW1wICsgbWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHRpbWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHRpbWVzdGFtcCArIHRpbWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbn07IiwKICAgICIndXNlIHN0cmljdCdcblxuLy8gTm90ZTogdGhpcyBpcyB0aGUgc2VtdmVyLm9yZyB2ZXJzaW9uIG9mIHRoZSBzcGVjIHRoYXQgaXQgaW1wbGVtZW50c1xuLy8gTm90IG5lY2Vzc2FyaWx5IHRoZSBwYWNrYWdlIHZlcnNpb24gb2YgdGhpcyBjb2RlLlxuY29uc3QgU0VNVkVSX1NQRUNfVkVSU0lPTiA9ICcyLjAuMCdcblxuY29uc3QgTUFYX0xFTkdUSCA9IDI1NlxuY29uc3QgTUFYX1NBRkVfSU5URUdFUiA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIHx8XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyA5MDA3MTk5MjU0NzQwOTkxXG5cbi8vIE1heCBzYWZlIHNlZ21lbnQgbGVuZ3RoIGZvciBjb2VyY2lvbi5cbmNvbnN0IE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEggPSAxNlxuXG4vLyBNYXggc2FmZSBsZW5ndGggZm9yIGEgYnVpbGQgaWRlbnRpZmllci4gVGhlIG1heCBsZW5ndGggbWludXMgNiBjaGFyYWN0ZXJzIGZvclxuLy8gdGhlIHNob3J0ZXN0IHZlcnNpb24gd2l0aCBhIGJ1aWxkIDAuMC4wK0JVSUxELlxuY29uc3QgTUFYX1NBRkVfQlVJTERfTEVOR1RIID0gTUFYX0xFTkdUSCAtIDZcblxuY29uc3QgUkVMRUFTRV9UWVBFUyA9IFtcbiAgJ21ham9yJyxcbiAgJ3ByZW1ham9yJyxcbiAgJ21pbm9yJyxcbiAgJ3ByZW1pbm9yJyxcbiAgJ3BhdGNoJyxcbiAgJ3ByZXBhdGNoJyxcbiAgJ3ByZXJlbGVhc2UnLFxuXVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTUFYX0xFTkdUSCxcbiAgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCxcbiAgTUFYX1NBRkVfQlVJTERfTEVOR1RILFxuICBNQVhfU0FGRV9JTlRFR0VSLFxuICBSRUxFQVNFX1RZUEVTLFxuICBTRU1WRVJfU1BFQ19WRVJTSU9OLFxuICBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRTogMGIwMDEsXG4gIEZMQUdfTE9PU0U6IDBiMDEwLFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgZGVidWcgPSAoXG4gIHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJlxuICBwcm9jZXNzLmVudiAmJlxuICBwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmXG4gIC9cXGJzZW12ZXJcXGIvaS50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcpXG4pID8gKC4uLmFyZ3MpID0+IGNvbnNvbGUuZXJyb3IoJ1NFTVZFUicsIC4uLmFyZ3MpXG4gIDogKCkgPT4ge31cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJ1Z1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RILFxuICBNQVhfU0FGRV9CVUlMRF9MRU5HVEgsXG4gIE1BWF9MRU5HVEgsXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuL2RlYnVnJylcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHt9XG5cbi8vIFRoZSBhY3R1YWwgcmVnZXhwcyBnbyBvbiBleHBvcnRzLnJlXG5jb25zdCByZSA9IGV4cG9ydHMucmUgPSBbXVxuY29uc3Qgc2FmZVJlID0gZXhwb3J0cy5zYWZlUmUgPSBbXVxuY29uc3Qgc3JjID0gZXhwb3J0cy5zcmMgPSBbXVxuY29uc3Qgc2FmZVNyYyA9IGV4cG9ydHMuc2FmZVNyYyA9IFtdXG5jb25zdCB0ID0gZXhwb3J0cy50ID0ge31cbmxldCBSID0gMFxuXG5jb25zdCBMRVRURVJEQVNITlVNQkVSID0gJ1thLXpBLVowLTktXSdcblxuLy8gUmVwbGFjZSBzb21lIGdyZWVkeSByZWdleCB0b2tlbnMgdG8gcHJldmVudCByZWdleCBkb3MgaXNzdWVzLiBUaGVzZSByZWdleCBhcmVcbi8vIHVzZWQgaW50ZXJuYWxseSB2aWEgdGhlIHNhZmVSZSBvYmplY3Qgc2luY2UgYWxsIGlucHV0cyBpbiB0aGlzIGxpYnJhcnkgZ2V0XG4vLyBub3JtYWxpemVkIGZpcnN0IHRvIHRyaW0gYW5kIGNvbGxhcHNlIGFsbCBleHRyYSB3aGl0ZXNwYWNlLiBUaGUgb3JpZ2luYWxcbi8vIHJlZ2V4ZXMgYXJlIGV4cG9ydGVkIGZvciB1c2VybGFuZCBjb25zdW1wdGlvbiBhbmQgbG93ZXIgbGV2ZWwgdXNhZ2UuIEFcbi8vIGZ1dHVyZSBicmVha2luZyBjaGFuZ2UgY291bGQgZXhwb3J0IHRoZSBzYWZlciByZWdleCBvbmx5IHdpdGggYSBub3RlIHRoYXRcbi8vIGFsbCBpbnB1dCBzaG91bGQgaGF2ZSBleHRyYSB3aGl0ZXNwYWNlIHJlbW92ZWQuXG5jb25zdCBzYWZlUmVnZXhSZXBsYWNlbWVudHMgPSBbXG4gIFsnXFxcXHMnLCAxXSxcbiAgWydcXFxcZCcsIE1BWF9MRU5HVEhdLFxuICBbTEVUVEVSREFTSE5VTUJFUiwgTUFYX1NBRkVfQlVJTERfTEVOR1RIXSxcbl1cblxuY29uc3QgbWFrZVNhZmVSZWdleCA9ICh2YWx1ZSkgPT4ge1xuICBmb3IgKGNvbnN0IFt0b2tlbiwgbWF4XSBvZiBzYWZlUmVnZXhSZXBsYWNlbWVudHMpIHtcbiAgICB2YWx1ZSA9IHZhbHVlXG4gICAgICAuc3BsaXQoYCR7dG9rZW59KmApLmpvaW4oYCR7dG9rZW59ezAsJHttYXh9fWApXG4gICAgICAuc3BsaXQoYCR7dG9rZW59K2ApLmpvaW4oYCR7dG9rZW59ezEsJHttYXh9fWApXG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbmNvbnN0IGNyZWF0ZVRva2VuID0gKG5hbWUsIHZhbHVlLCBpc0dsb2JhbCkgPT4ge1xuICBjb25zdCBzYWZlID0gbWFrZVNhZmVSZWdleCh2YWx1ZSlcbiAgY29uc3QgaW5kZXggPSBSKytcbiAgZGVidWcobmFtZSwgaW5kZXgsIHZhbHVlKVxuICB0W25hbWVdID0gaW5kZXhcbiAgc3JjW2luZGV4XSA9IHZhbHVlXG4gIHNhZmVTcmNbaW5kZXhdID0gc2FmZVxuICByZVtpbmRleF0gPSBuZXcgUmVnRXhwKHZhbHVlLCBpc0dsb2JhbCA/ICdnJyA6IHVuZGVmaW5lZClcbiAgc2FmZVJlW2luZGV4XSA9IG5ldyBSZWdFeHAoc2FmZSwgaXNHbG9iYWwgPyAnZycgOiB1bmRlZmluZWQpXG59XG5cbi8vIFRoZSBmb2xsb3dpbmcgUmVndWxhciBFeHByZXNzaW9ucyBjYW4gYmUgdXNlZCBmb3IgdG9rZW5pemluZyxcbi8vIHZhbGlkYXRpbmcsIGFuZCBwYXJzaW5nIFNlbVZlciB2ZXJzaW9uIHN0cmluZ3MuXG5cbi8vICMjIE51bWVyaWMgSWRlbnRpZmllclxuLy8gQSBzaW5nbGUgYDBgLCBvciBhIG5vbi16ZXJvIGRpZ2l0IGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBkaWdpdHMuXG5cbmNyZWF0ZVRva2VuKCdOVU1FUklDSURFTlRJRklFUicsICcwfFsxLTldXFxcXGQqJylcbmNyZWF0ZVRva2VuKCdOVU1FUklDSURFTlRJRklFUkxPT1NFJywgJ1xcXFxkKycpXG5cbi8vICMjIE5vbi1udW1lcmljIElkZW50aWZpZXJcbi8vIFplcm8gb3IgbW9yZSBkaWdpdHMsIGZvbGxvd2VkIGJ5IGEgbGV0dGVyIG9yIGh5cGhlbiwgYW5kIHRoZW4gemVybyBvclxuLy8gbW9yZSBsZXR0ZXJzLCBkaWdpdHMsIG9yIGh5cGhlbnMuXG5cbmNyZWF0ZVRva2VuKCdOT05OVU1FUklDSURFTlRJRklFUicsIGBcXFxcZCpbYS16QS1aLV0ke0xFVFRFUkRBU0hOVU1CRVJ9KmApXG5cbi8vICMjIE1haW4gVmVyc2lvblxuLy8gVGhyZWUgZG90LXNlcGFyYXRlZCBudW1lcmljIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignTUFJTlZFUlNJT04nLCBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pYClcblxuY3JlYXRlVG9rZW4oJ01BSU5WRVJTSU9OTE9PU0UnLCBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KWApXG5cbi8vICMjIFByZS1yZWxlYXNlIFZlcnNpb24gSWRlbnRpZmllclxuLy8gQSBudW1lcmljIGlkZW50aWZpZXIsIG9yIGEgbm9uLW51bWVyaWMgaWRlbnRpZmllci5cbi8vIE5vbi1udW1iZXJpYyBpZGVudGlmaWVycyBpbmNsdWRlIG51bWJlcmljIGlkZW50aWZpZXJzIGJ1dCBjYW4gYmUgbG9uZ2VyLlxuLy8gVGhlcmVmb3JlIG5vbi1udW1iZXJpYyBpZGVudGlmaWVycyBtdXN0IGdvIGZpcnN0LlxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRUlERU5USUZJRVInLCBgKD86JHtzcmNbdC5OT05OVU1FUklDSURFTlRJRklFUl1cbn18JHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KWApXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFJywgYCg/OiR7c3JjW3QuTk9OTlVNRVJJQ0lERU5USUZJRVJdXG59fCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KWApXG5cbi8vICMjIFByZS1yZWxlYXNlIFZlcnNpb25cbi8vIEh5cGhlbiwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZG90LXNlcGFyYXRlZCBwcmUtcmVsZWFzZSB2ZXJzaW9uXG4vLyBpZGVudGlmaWVycy5cblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0UnLCBgKD86LSgke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSXVxufSg/OlxcXFwuJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUl19KSopKWApXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFTE9PU0UnLCBgKD86LT8oJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFXVxufSg/OlxcXFwuJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFXX0pKikpYClcblxuLy8gIyMgQnVpbGQgTWV0YWRhdGEgSWRlbnRpZmllclxuLy8gQW55IGNvbWJpbmF0aW9uIG9mIGRpZ2l0cywgbGV0dGVycywgb3IgaHlwaGVucy5cblxuY3JlYXRlVG9rZW4oJ0JVSUxESURFTlRJRklFUicsIGAke0xFVFRFUkRBU0hOVU1CRVJ9K2ApXG5cbi8vICMjIEJ1aWxkIE1ldGFkYXRhXG4vLyBQbHVzIHNpZ24sIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBlcmlvZC1zZXBhcmF0ZWQgYnVpbGQgbWV0YWRhdGFcbi8vIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignQlVJTEQnLCBgKD86XFxcXCsoJHtzcmNbdC5CVUlMRElERU5USUZJRVJdXG59KD86XFxcXC4ke3NyY1t0LkJVSUxESURFTlRJRklFUl19KSopKWApXG5cbi8vICMjIEZ1bGwgVmVyc2lvbiBTdHJpbmdcbi8vIEEgbWFpbiB2ZXJzaW9uLCBmb2xsb3dlZCBvcHRpb25hbGx5IGJ5IGEgcHJlLXJlbGVhc2UgdmVyc2lvbiBhbmRcbi8vIGJ1aWxkIG1ldGFkYXRhLlxuXG4vLyBOb3RlIHRoYXQgdGhlIG9ubHkgbWFqb3IsIG1pbm9yLCBwYXRjaCwgYW5kIHByZS1yZWxlYXNlIHNlY3Rpb25zIG9mXG4vLyB0aGUgdmVyc2lvbiBzdHJpbmcgYXJlIGNhcHR1cmluZyBncm91cHMuICBUaGUgYnVpbGQgbWV0YWRhdGEgaXMgbm90IGFcbi8vIGNhcHR1cmluZyBncm91cCwgYmVjYXVzZSBpdCBzaG91bGQgbm90IGV2ZXIgYmUgdXNlZCBpbiB2ZXJzaW9uXG4vLyBjb21wYXJpc29uLlxuXG5jcmVhdGVUb2tlbignRlVMTFBMQUlOJywgYHY/JHtzcmNbdC5NQUlOVkVSU0lPTl1cbn0ke3NyY1t0LlBSRVJFTEVBU0VdfT8ke1xuICBzcmNbdC5CVUlMRF19P2ApXG5cbmNyZWF0ZVRva2VuKCdGVUxMJywgYF4ke3NyY1t0LkZVTExQTEFJTl19JGApXG5cbi8vIGxpa2UgZnVsbCwgYnV0IGFsbG93cyB2MS4yLjMgYW5kID0xLjIuMywgd2hpY2ggcGVvcGxlIGRvIHNvbWV0aW1lcy5cbi8vIGFsc28sIDEuMC4wYWxwaGExIChwcmVyZWxlYXNlIHdpdGhvdXQgdGhlIGh5cGhlbikgd2hpY2ggaXMgcHJldHR5XG4vLyBjb21tb24gaW4gdGhlIG5wbSByZWdpc3RyeS5cbmNyZWF0ZVRva2VuKCdMT09TRVBMQUlOJywgYFt2PVxcXFxzXSoke3NyY1t0Lk1BSU5WRVJTSU9OTE9PU0VdXG59JHtzcmNbdC5QUkVSRUxFQVNFTE9PU0VdfT8ke1xuICBzcmNbdC5CVUlMRF19P2ApXG5cbmNyZWF0ZVRva2VuKCdMT09TRScsIGBeJHtzcmNbdC5MT09TRVBMQUlOXX0kYClcblxuY3JlYXRlVG9rZW4oJ0dUTFQnLCAnKCg/Ojx8Pik/PT8pJylcblxuLy8gU29tZXRoaW5nIGxpa2UgXCIyLipcIiBvciBcIjEuMi54XCIuXG4vLyBOb3RlIHRoYXQgXCJ4LnhcIiBpcyBhIHZhbGlkIHhSYW5nZSBpZGVudGlmZXIsIG1lYW5pbmcgXCJhbnkgdmVyc2lvblwiXG4vLyBPbmx5IHRoZSBmaXJzdCBpdGVtIGlzIHN0cmljdGx5IHJlcXVpcmVkLlxuY3JlYXRlVG9rZW4oJ1hSQU5HRUlERU5USUZJRVJMT09TRScsIGAke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfXx4fFh8XFxcXCpgKVxuY3JlYXRlVG9rZW4oJ1hSQU5HRUlERU5USUZJRVInLCBgJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19fHh8WHxcXFxcKmApXG5cbmNyZWF0ZVRva2VuKCdYUkFOR0VQTEFJTicsIGBbdj1cXFxcc10qKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJdfSlgICtcbiAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuUFJFUkVMRUFTRV19KT8ke1xuICAgICAgICAgICAgICAgICAgICAgc3JjW3QuQlVJTERdfT9gICtcbiAgICAgICAgICAgICAgICAgICBgKT8pP2ApXG5cbmNyZWF0ZVRva2VuKCdYUkFOR0VQTEFJTkxPT1NFJywgYFt2PVxcXFxzXSooJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKD86JHtzcmNbdC5QUkVSRUxFQVNFTE9PU0VdfSk/JHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjW3QuQlVJTERdfT9gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGApPyk/YClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRScsIGBeJHtzcmNbdC5HVExUXX1cXFxccyoke3NyY1t0LlhSQU5HRVBMQUlOXX0kYClcbmNyZWF0ZVRva2VuKCdYUkFOR0VMT09TRScsIGBeJHtzcmNbdC5HVExUXX1cXFxccyoke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSRgKVxuXG4vLyBDb2VyY2lvbi5cbi8vIEV4dHJhY3QgYW55dGhpbmcgdGhhdCBjb3VsZCBjb25jZWl2YWJseSBiZSBhIHBhcnQgb2YgYSB2YWxpZCBzZW12ZXJcbmNyZWF0ZVRva2VuKCdDT0VSQ0VQTEFJTicsIGAkeycoXnxbXlxcXFxkXSknICtcbiAgICAgICAgICAgICAgJyhcXFxcZHsxLCd9JHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pYCArXG4gICAgICAgICAgICAgIGAoPzpcXFxcLihcXFxcZHsxLCR7TUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSH19KSk/YCArXG4gICAgICAgICAgICAgIGAoPzpcXFxcLihcXFxcZHsxLCR7TUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSH19KSk/YClcbmNyZWF0ZVRva2VuKCdDT0VSQ0UnLCBgJHtzcmNbdC5DT0VSQ0VQTEFJTl19KD86JHxbXlxcXFxkXSlgKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRUZVTEwnLCBzcmNbdC5DT0VSQ0VQTEFJTl0gK1xuICAgICAgICAgICAgICBgKD86JHtzcmNbdC5QUkVSRUxFQVNFXX0pP2AgK1xuICAgICAgICAgICAgICBgKD86JHtzcmNbdC5CVUlMRF19KT9gICtcbiAgICAgICAgICAgICAgYCg/OiR8W15cXFxcZF0pYClcbmNyZWF0ZVRva2VuKCdDT0VSQ0VSVEwnLCBzcmNbdC5DT0VSQ0VdLCB0cnVlKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRVJUTEZVTEwnLCBzcmNbdC5DT0VSQ0VGVUxMXSwgdHJ1ZSlcblxuLy8gVGlsZGUgcmFuZ2VzLlxuLy8gTWVhbmluZyBpcyBcInJlYXNvbmFibHkgYXQgb3IgZ3JlYXRlciB0aGFuXCJcbmNyZWF0ZVRva2VuKCdMT05FVElMREUnLCAnKD86fj4/KScpXG5cbmNyZWF0ZVRva2VuKCdUSUxERVRSSU0nLCBgKFxcXFxzKikke3NyY1t0LkxPTkVUSUxERV19XFxcXHMrYCwgdHJ1ZSlcbmV4cG9ydHMudGlsZGVUcmltUmVwbGFjZSA9ICckMX4nXG5cbmNyZWF0ZVRva2VuKCdUSUxERScsIGBeJHtzcmNbdC5MT05FVElMREVdfSR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ1RJTERFTE9PU0UnLCBgXiR7c3JjW3QuTE9ORVRJTERFXX0ke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSRgKVxuXG4vLyBDYXJldCByYW5nZXMuXG4vLyBNZWFuaW5nIGlzIFwiYXQgbGVhc3QgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGhcIlxuY3JlYXRlVG9rZW4oJ0xPTkVDQVJFVCcsICcoPzpcXFxcXiknKVxuXG5jcmVhdGVUb2tlbignQ0FSRVRUUklNJywgYChcXFxccyopJHtzcmNbdC5MT05FQ0FSRVRdfVxcXFxzK2AsIHRydWUpXG5leHBvcnRzLmNhcmV0VHJpbVJlcGxhY2UgPSAnJDFeJ1xuXG5jcmVhdGVUb2tlbignQ0FSRVQnLCBgXiR7c3JjW3QuTE9ORUNBUkVUXX0ke3NyY1t0LlhSQU5HRVBMQUlOXX0kYClcbmNyZWF0ZVRva2VuKCdDQVJFVExPT1NFJywgYF4ke3NyY1t0LkxPTkVDQVJFVF19JHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0kYClcblxuLy8gQSBzaW1wbGUgZ3QvbHQvZXEgdGhpbmcsIG9yIGp1c3QgXCJcIiB0byBpbmRpY2F0ZSBcImFueSB2ZXJzaW9uXCJcbmNyZWF0ZVRva2VuKCdDT01QQVJBVE9STE9PU0UnLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqKCR7c3JjW3QuTE9PU0VQTEFJTl19KSR8XiRgKVxuY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1InLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqKCR7c3JjW3QuRlVMTFBMQUlOXX0pJHxeJGApXG5cbi8vIEFuIGV4cHJlc3Npb24gdG8gc3RyaXAgYW55IHdoaXRlc3BhY2UgYmV0d2VlbiB0aGUgZ3RsdCBhbmQgdGhlIHRoaW5nXG4vLyBpdCBtb2RpZmllcywgc28gdGhhdCBgPiAxLjIuM2AgPT0+IGA+MS4yLjNgXG5jcmVhdGVUb2tlbignQ09NUEFSQVRPUlRSSU0nLCBgKFxcXFxzKikke3NyY1t0LkdUTFRdXG59XFxcXHMqKCR7c3JjW3QuTE9PU0VQTEFJTl19fCR7c3JjW3QuWFJBTkdFUExBSU5dfSlgLCB0cnVlKVxuZXhwb3J0cy5jb21wYXJhdG9yVHJpbVJlcGxhY2UgPSAnJDEkMiQzJ1xuXG4vLyBTb21ldGhpbmcgbGlrZSBgMS4yLjMgLSAxLjIuNGBcbi8vIE5vdGUgdGhhdCB0aGVzZSBhbGwgdXNlIHRoZSBsb29zZSBmb3JtLCBiZWNhdXNlIHRoZXknbGwgYmVcbi8vIGNoZWNrZWQgYWdhaW5zdCBlaXRoZXIgdGhlIHN0cmljdCBvciBsb29zZSBjb21wYXJhdG9yIGZvcm1cbi8vIGxhdGVyLlxuY3JlYXRlVG9rZW4oJ0hZUEhFTlJBTkdFJywgYF5cXFxccyooJHtzcmNbdC5YUkFOR0VQTEFJTl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGBcXFxccystXFxcXHMrYCArXG4gICAgICAgICAgICAgICAgICAgYCgke3NyY1t0LlhSQU5HRVBMQUlOXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYFxcXFxzKiRgKVxuXG5jcmVhdGVUb2tlbignSFlQSEVOUkFOR0VMT09TRScsIGBeXFxcXHMqKCR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYFxcXFxzKy1cXFxccytgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgXFxcXHMqJGApXG5cbi8vIFN0YXIgcmFuZ2VzIGJhc2ljYWxseSBqdXN0IGFsbG93IGFueXRoaW5nIGF0IGFsbC5cbmNyZWF0ZVRva2VuKCdTVEFSJywgJyg8fD4pPz0/XFxcXHMqXFxcXConKVxuLy8gPj0wLjAuMCBpcyBsaWtlIGEgc3RhclxuY3JlYXRlVG9rZW4oJ0dURTAnLCAnXlxcXFxzKj49XFxcXHMqMFxcXFwuMFxcXFwuMFxcXFxzKiQnKVxuY3JlYXRlVG9rZW4oJ0dURTBQUkUnLCAnXlxcXFxzKj49XFxcXHMqMFxcXFwuMFxcXFwuMC0wXFxcXHMqJCcpXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBwYXJzZSBvdXQganVzdCB0aGUgb3B0aW9ucyB3ZSBjYXJlIGFib3V0XG5jb25zdCBsb29zZU9wdGlvbiA9IE9iamVjdC5mcmVlemUoeyBsb29zZTogdHJ1ZSB9KVxuY29uc3QgZW1wdHlPcHRzID0gT2JqZWN0LmZyZWV6ZSh7IH0pXG5jb25zdCBwYXJzZU9wdGlvbnMgPSBvcHRpb25zID0+IHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgcmV0dXJuIGVtcHR5T3B0c1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBsb29zZU9wdGlvblxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnNcbn1cbm1vZHVsZS5leHBvcnRzID0gcGFyc2VPcHRpb25zXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBudW1lcmljID0gL15bMC05XSskL1xuY29uc3QgY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IHtcbiAgY29uc3QgYW51bSA9IG51bWVyaWMudGVzdChhKVxuICBjb25zdCBibnVtID0gbnVtZXJpYy50ZXN0KGIpXG5cbiAgaWYgKGFudW0gJiYgYm51bSkge1xuICAgIGEgPSArYVxuICAgIGIgPSArYlxuICB9XG5cbiAgcmV0dXJuIGEgPT09IGIgPyAwXG4gICAgOiAoYW51bSAmJiAhYm51bSkgPyAtMVxuICAgIDogKGJudW0gJiYgIWFudW0pID8gMVxuICAgIDogYSA8IGIgPyAtMVxuICAgIDogMVxufVxuXG5jb25zdCByY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IGNvbXBhcmVJZGVudGlmaWVycyhiLCBhKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29tcGFyZUlkZW50aWZpZXJzLFxuICByY29tcGFyZUlkZW50aWZpZXJzLFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9kZWJ1ZycpXG5jb25zdCB7IE1BWF9MRU5HVEgsIE1BWF9TQUZFX0lOVEVHRVIgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2NvbnN0YW50cycpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcblxuY29uc3QgcGFyc2VPcHRpb25zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcGFyc2Utb3B0aW9ucycpXG5jb25zdCB7IGNvbXBhcmVJZGVudGlmaWVycyB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvaWRlbnRpZmllcnMnKVxuY2xhc3MgU2VtVmVyIHtcbiAgY29uc3RydWN0b3IgKHZlcnNpb24sIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpXG5cbiAgICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcikge1xuICAgICAgaWYgKHZlcnNpb24ubG9vc2UgPT09ICEhb3B0aW9ucy5sb29zZSAmJlxuICAgICAgICB2ZXJzaW9uLmluY2x1ZGVQcmVyZWxlYXNlID09PSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAgICAgcmV0dXJuIHZlcnNpb25cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnZlcnNpb25cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCB2ZXJzaW9uLiBNdXN0IGJlIGEgc3RyaW5nLiBHb3QgdHlwZSBcIiR7dHlwZW9mIHZlcnNpb259XCIuYClcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbi5sZW5ndGggPiBNQVhfTEVOR1RIKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgdmVyc2lvbiBpcyBsb25nZXIgdGhhbiAke01BWF9MRU5HVEh9IGNoYXJhY3RlcnNgXG4gICAgICApXG4gICAgfVxuXG4gICAgZGVidWcoJ1NlbVZlcicsIHZlcnNpb24sIG9wdGlvbnMpXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIHRoaXMubG9vc2UgPSAhIW9wdGlvbnMubG9vc2VcbiAgICAvLyB0aGlzIGlzbid0IGFjdHVhbGx5IHJlbGV2YW50IGZvciB2ZXJzaW9ucywgYnV0IGtlZXAgaXQgc28gdGhhdCB3ZVxuICAgIC8vIGRvbid0IHJ1biBpbnRvIHRyb3VibGUgcGFzc2luZyB0aGlzLm9wdGlvbnMgYXJvdW5kLlxuICAgIHRoaXMuaW5jbHVkZVByZXJlbGVhc2UgPSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2VcblxuICAgIGNvbnN0IG0gPSB2ZXJzaW9uLnRyaW0oKS5tYXRjaChvcHRpb25zLmxvb3NlID8gcmVbdC5MT09TRV0gOiByZVt0LkZVTExdKVxuXG4gICAgaWYgKCFtKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIFZlcnNpb246ICR7dmVyc2lvbn1gKVxuICAgIH1cblxuICAgIHRoaXMucmF3ID0gdmVyc2lvblxuXG4gICAgLy8gdGhlc2UgYXJlIGFjdHVhbGx5IG51bWJlcnNcbiAgICB0aGlzLm1ham9yID0gK21bMV1cbiAgICB0aGlzLm1pbm9yID0gK21bMl1cbiAgICB0aGlzLnBhdGNoID0gK21bM11cblxuICAgIGlmICh0aGlzLm1ham9yID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLm1ham9yIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBtYWpvciB2ZXJzaW9uJylcbiAgICB9XG5cbiAgICBpZiAodGhpcy5taW5vciA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5taW5vciA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWlub3IgdmVyc2lvbicpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGF0Y2ggPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMucGF0Y2ggPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHBhdGNoIHZlcnNpb24nKVxuICAgIH1cblxuICAgIC8vIG51bWJlcmlmeSBhbnkgcHJlcmVsZWFzZSBudW1lcmljIGlkc1xuICAgIGlmICghbVs0XSkge1xuICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcmVyZWxlYXNlID0gbVs0XS5zcGxpdCgnLicpLm1hcCgoaWQpID0+IHtcbiAgICAgICAgaWYgKC9eWzAtOV0rJC8udGVzdChpZCkpIHtcbiAgICAgICAgICBjb25zdCBudW0gPSAraWRcbiAgICAgICAgICBpZiAobnVtID49IDAgJiYgbnVtIDwgTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICAgICAgcmV0dXJuIG51bVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWRcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5idWlsZCA9IG1bNV0gPyBtWzVdLnNwbGl0KCcuJykgOiBbXVxuICAgIHRoaXMuZm9ybWF0KClcbiAgfVxuXG4gIGZvcm1hdCAoKSB7XG4gICAgdGhpcy52ZXJzaW9uID0gYCR7dGhpcy5tYWpvcn0uJHt0aGlzLm1pbm9yfS4ke3RoaXMucGF0Y2h9YFxuICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICB0aGlzLnZlcnNpb24gKz0gYC0ke3RoaXMucHJlcmVsZWFzZS5qb2luKCcuJyl9YFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy52ZXJzaW9uXG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmVyc2lvblxuICB9XG5cbiAgY29tcGFyZSAob3RoZXIpIHtcbiAgICBkZWJ1ZygnU2VtVmVyLmNvbXBhcmUnLCB0aGlzLnZlcnNpb24sIHRoaXMub3B0aW9ucywgb3RoZXIpXG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBpZiAodHlwZW9mIG90aGVyID09PSAnc3RyaW5nJyAmJiBvdGhlciA9PT0gdGhpcy52ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICBpZiAob3RoZXIudmVyc2lvbiA9PT0gdGhpcy52ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbXBhcmVNYWluKG90aGVyKSB8fCB0aGlzLmNvbXBhcmVQcmUob3RoZXIpXG4gIH1cblxuICBjb21wYXJlTWFpbiAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5tYWpvciwgb3RoZXIubWFqb3IpIHx8XG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5taW5vciwgb3RoZXIubWlub3IpIHx8XG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5wYXRjaCwgb3RoZXIucGF0Y2gpXG4gICAgKVxuICB9XG5cbiAgY29tcGFyZVByZSAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIC8vIE5PVCBoYXZpbmcgYSBwcmVyZWxlYXNlIGlzID4gaGF2aW5nIG9uZVxuICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmICFvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfSBlbHNlIGlmICghdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiBvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIDFcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmICFvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG5cbiAgICBsZXQgaSA9IDBcbiAgICBkbyB7XG4gICAgICBjb25zdCBhID0gdGhpcy5wcmVyZWxlYXNlW2ldXG4gICAgICBjb25zdCBiID0gb3RoZXIucHJlcmVsZWFzZVtpXVxuICAgICAgZGVidWcoJ3ByZXJlbGVhc2UgY29tcGFyZScsIGksIGEsIGIpXG4gICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfSBlbHNlIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfSBlbHNlIGlmIChhID09PSBiKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzKGEsIGIpXG4gICAgICB9XG4gICAgfSB3aGlsZSAoKytpKVxuICB9XG5cbiAgY29tcGFyZUJ1aWxkIChvdGhlcikge1xuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgbGV0IGkgPSAwXG4gICAgZG8ge1xuICAgICAgY29uc3QgYSA9IHRoaXMuYnVpbGRbaV1cbiAgICAgIGNvbnN0IGIgPSBvdGhlci5idWlsZFtpXVxuICAgICAgZGVidWcoJ2J1aWxkIGNvbXBhcmUnLCBpLCBhLCBiKVxuICAgICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0gZWxzZSBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyhhLCBiKVxuICAgICAgfVxuICAgIH0gd2hpbGUgKCsraSlcbiAgfVxuXG4gIC8vIHByZW1pbm9yIHdpbGwgYnVtcCB0aGUgdmVyc2lvbiB1cCB0byB0aGUgbmV4dCBtaW5vciByZWxlYXNlLCBhbmQgaW1tZWRpYXRlbHlcbiAgLy8gZG93biB0byBwcmUtcmVsZWFzZS4gcHJlbWFqb3IgYW5kIHByZXBhdGNoIHdvcmsgdGhlIHNhbWUgd2F5LlxuICBpbmMgKHJlbGVhc2UsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKSB7XG4gICAgaWYgKHJlbGVhc2Uuc3RhcnRzV2l0aCgncHJlJykpIHtcbiAgICAgIGlmICghaWRlbnRpZmllciAmJiBpZGVudGlmaWVyQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogaWRlbnRpZmllciBpcyBlbXB0eScpXG4gICAgICB9XG4gICAgICAvLyBBdm9pZCBhbiBpbnZhbGlkIHNlbXZlciByZXN1bHRzXG4gICAgICBpZiAoaWRlbnRpZmllcikge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGAtJHtpZGVudGlmaWVyfWAubWF0Y2godGhpcy5vcHRpb25zLmxvb3NlID8gcmVbdC5QUkVSRUxFQVNFTE9PU0VdIDogcmVbdC5QUkVSRUxFQVNFXSlcbiAgICAgICAgaWYgKCFtYXRjaCB8fCBtYXRjaFsxXSAhPT0gaWRlbnRpZmllcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpZGVudGlmaWVyOiAke2lkZW50aWZpZXJ9YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAocmVsZWFzZSkge1xuICAgICAgY2FzZSAncHJlbWFqb3InOlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLm1pbm9yID0gMFxuICAgICAgICB0aGlzLm1ham9yKytcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncHJlbWlub3InOlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLm1pbm9yKytcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncHJlcGF0Y2gnOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGFscmVhZHkgYSBwcmVyZWxlYXNlLCBpdCB3aWxsIGJ1bXAgdG8gdGhlIG5leHQgdmVyc2lvblxuICAgICAgICAvLyBkcm9wIGFueSBwcmVyZWxlYXNlcyB0aGF0IG1pZ2h0IGFscmVhZHkgZXhpc3QsIHNpbmNlIHRoZXkgYXJlIG5vdFxuICAgICAgICAvLyByZWxldmFudCBhdCB0aGlzIHBvaW50LlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLmluYygncGF0Y2gnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIGEgbm9uLXByZXJlbGVhc2UgdmVyc2lvbiwgdGhpcyBhY3RzIHRoZSBzYW1lIGFzXG4gICAgICAvLyBwcmVwYXRjaC5cbiAgICAgIGNhc2UgJ3ByZXJlbGVhc2UnOlxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuaW5jKCdwYXRjaCcsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3JlbGVhc2UnOlxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdmVyc2lvbiAke3RoaXMucmF3fSBpcyBub3QgYSBwcmVyZWxlYXNlYClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlICdtYWpvcic6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmUtbWFqb3IgdmVyc2lvbiwgYnVtcCB1cCB0byB0aGUgc2FtZSBtYWpvciB2ZXJzaW9uLlxuICAgICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IG1ham9yLlxuICAgICAgICAvLyAxLjAuMC01IGJ1bXBzIHRvIDEuMC4wXG4gICAgICAgIC8vIDEuMS4wIGJ1bXBzIHRvIDIuMC4wXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLm1pbm9yICE9PSAwIHx8XG4gICAgICAgICAgdGhpcy5wYXRjaCAhPT0gMCB8fFxuICAgICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5tYWpvcisrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5taW5vciA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ21pbm9yJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZS1taW5vciB2ZXJzaW9uLCBidW1wIHVwIHRvIHRoZSBzYW1lIG1pbm9yIHZlcnNpb24uXG4gICAgICAgIC8vIE90aGVyd2lzZSBpbmNyZW1lbnQgbWlub3IuXG4gICAgICAgIC8vIDEuMi4wLTUgYnVtcHMgdG8gMS4yLjBcbiAgICAgICAgLy8gMS4yLjEgYnVtcHMgdG8gMS4zLjBcbiAgICAgICAgaWYgKHRoaXMucGF0Y2ggIT09IDAgfHwgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMubWlub3IrK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwYXRjaCc6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgcHJlLXJlbGVhc2UgdmVyc2lvbiwgaXQgd2lsbCBpbmNyZW1lbnQgdGhlIHBhdGNoLlxuICAgICAgICAvLyBJZiBpdCBpcyBhIHByZS1yZWxlYXNlIGl0IHdpbGwgYnVtcCB1cCB0byB0aGUgc2FtZSBwYXRjaCB2ZXJzaW9uLlxuICAgICAgICAvLyAxLjIuMC01IHBhdGNoZXMgdG8gMS4yLjBcbiAgICAgICAgLy8gMS4yLjAgcGF0Y2hlcyB0byAxLjIuMVxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMucGF0Y2grK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICAvLyBUaGlzIHByb2JhYmx5IHNob3VsZG4ndCBiZSB1c2VkIHB1YmxpY2x5LlxuICAgICAgLy8gMS4wLjAgJ3ByZScgd291bGQgYmVjb21lIDEuMC4wLTAgd2hpY2ggaXMgdGhlIHdyb25nIGRpcmVjdGlvbi5cbiAgICAgIGNhc2UgJ3ByZSc6IHtcbiAgICAgICAgY29uc3QgYmFzZSA9IE51bWJlcihpZGVudGlmaWVyQmFzZSkgPyAxIDogMFxuXG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW2Jhc2VdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGkgPSB0aGlzLnByZXJlbGVhc2UubGVuZ3RoXG4gICAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJlcmVsZWFzZVtpXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlW2ldKytcbiAgICAgICAgICAgICAgaSA9IC0yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpID09PSAtMSkge1xuICAgICAgICAgICAgLy8gZGlkbid0IGluY3JlbWVudCBhbnl0aGluZ1xuICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIgPT09IHRoaXMucHJlcmVsZWFzZS5qb2luKCcuJykgJiYgaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6IGlkZW50aWZpZXIgYWxyZWFkeSBleGlzdHMnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlLnB1c2goYmFzZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkZW50aWZpZXIpIHtcbiAgICAgICAgICAvLyAxLjIuMC1iZXRhLjEgYnVtcHMgdG8gMS4yLjAtYmV0YS4yLFxuICAgICAgICAgIC8vIDEuMi4wLWJldGEuZm9vYmx6IG9yIDEuMi4wLWJldGEgYnVtcHMgdG8gMS4yLjAtYmV0YS4wXG4gICAgICAgICAgbGV0IHByZXJlbGVhc2UgPSBbaWRlbnRpZmllciwgYmFzZV1cbiAgICAgICAgICBpZiAoaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBwcmVyZWxlYXNlID0gW2lkZW50aWZpZXJdXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb21wYXJlSWRlbnRpZmllcnModGhpcy5wcmVyZWxlYXNlWzBdLCBpZGVudGlmaWVyKSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGlzTmFOKHRoaXMucHJlcmVsZWFzZVsxXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gcHJlcmVsZWFzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBwcmVyZWxlYXNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiAke3JlbGVhc2V9YClcbiAgICB9XG4gICAgdGhpcy5yYXcgPSB0aGlzLmZvcm1hdCgpXG4gICAgaWYgKHRoaXMuYnVpbGQubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJhdyArPSBgKyR7dGhpcy5idWlsZC5qb2luKCcuJyl9YFxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2VtVmVyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBwYXJzZSA9ICh2ZXJzaW9uLCBvcHRpb25zLCB0aHJvd0Vycm9ycyA9IGZhbHNlKSA9PiB7XG4gIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgcmV0dXJuIHZlcnNpb25cbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBuZXcgU2VtVmVyKHZlcnNpb24sIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgaWYgKCF0aHJvd0Vycm9ycykge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgdGhyb3cgZXJcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgdmFsaWQgPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB2ID0gcGFyc2UodmVyc2lvbiwgb3B0aW9ucylcbiAgcmV0dXJuIHYgPyB2LnZlcnNpb24gOiBudWxsXG59XG5tb2R1bGUuZXhwb3J0cyA9IHZhbGlkXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgY2xlYW4gPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBzID0gcGFyc2UodmVyc2lvbi50cmltKCkucmVwbGFjZSgvXls9dl0rLywgJycpLCBvcHRpb25zKVxuICByZXR1cm4gcyA/IHMudmVyc2lvbiA6IG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gY2xlYW5cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcblxuY29uc3QgaW5jID0gKHZlcnNpb24sIHJlbGVhc2UsIG9wdGlvbnMsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKSA9PiB7XG4gIGlmICh0eXBlb2YgKG9wdGlvbnMpID09PSAnc3RyaW5nJykge1xuICAgIGlkZW50aWZpZXJCYXNlID0gaWRlbnRpZmllclxuICAgIGlkZW50aWZpZXIgPSBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZFxuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFNlbVZlcihcbiAgICAgIHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIgPyB2ZXJzaW9uLnZlcnNpb24gOiB2ZXJzaW9uLFxuICAgICAgb3B0aW9uc1xuICAgICkuaW5jKHJlbGVhc2UsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKS52ZXJzaW9uXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBpbmNcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZS5qcycpXG5cbmNvbnN0IGRpZmYgPSAodmVyc2lvbjEsIHZlcnNpb24yKSA9PiB7XG4gIGNvbnN0IHYxID0gcGFyc2UodmVyc2lvbjEsIG51bGwsIHRydWUpXG4gIGNvbnN0IHYyID0gcGFyc2UodmVyc2lvbjIsIG51bGwsIHRydWUpXG4gIGNvbnN0IGNvbXBhcmlzb24gPSB2MS5jb21wYXJlKHYyKVxuXG4gIGlmIChjb21wYXJpc29uID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IHYxSGlnaGVyID0gY29tcGFyaXNvbiA+IDBcbiAgY29uc3QgaGlnaFZlcnNpb24gPSB2MUhpZ2hlciA/IHYxIDogdjJcbiAgY29uc3QgbG93VmVyc2lvbiA9IHYxSGlnaGVyID8gdjIgOiB2MVxuICBjb25zdCBoaWdoSGFzUHJlID0gISFoaWdoVmVyc2lvbi5wcmVyZWxlYXNlLmxlbmd0aFxuICBjb25zdCBsb3dIYXNQcmUgPSAhIWxvd1ZlcnNpb24ucHJlcmVsZWFzZS5sZW5ndGhcblxuICBpZiAobG93SGFzUHJlICYmICFoaWdoSGFzUHJlKSB7XG4gICAgLy8gR29pbmcgZnJvbSBwcmVyZWxlYXNlIC0+IG5vIHByZXJlbGVhc2UgcmVxdWlyZXMgc29tZSBzcGVjaWFsIGNhc2luZ1xuXG4gICAgLy8gSWYgdGhlIGxvdyB2ZXJzaW9uIGhhcyBvbmx5IGEgbWFqb3IsIHRoZW4gaXQgd2lsbCBhbHdheXMgYmUgYSBtYWpvclxuICAgIC8vIFNvbWUgZXhhbXBsZXM6XG4gICAgLy8gMS4wLjAtMSAtPiAxLjAuMFxuICAgIC8vIDEuMC4wLTEgLT4gMS4xLjFcbiAgICAvLyAxLjAuMC0xIC0+IDIuMC4wXG4gICAgaWYgKCFsb3dWZXJzaW9uLnBhdGNoICYmICFsb3dWZXJzaW9uLm1pbm9yKSB7XG4gICAgICByZXR1cm4gJ21ham9yJ1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBtYWluIHBhcnQgaGFzIG5vIGRpZmZlcmVuY2VcbiAgICBpZiAobG93VmVyc2lvbi5jb21wYXJlTWFpbihoaWdoVmVyc2lvbikgPT09IDApIHtcbiAgICAgIGlmIChsb3dWZXJzaW9uLm1pbm9yICYmICFsb3dWZXJzaW9uLnBhdGNoKSB7XG4gICAgICAgIHJldHVybiAnbWlub3InXG4gICAgICB9XG4gICAgICByZXR1cm4gJ3BhdGNoJ1xuICAgIH1cbiAgfVxuXG4gIC8vIGFkZCB0aGUgYHByZWAgcHJlZml4IGlmIHdlIGFyZSBnb2luZyB0byBhIHByZXJlbGVhc2UgdmVyc2lvblxuICBjb25zdCBwcmVmaXggPSBoaWdoSGFzUHJlID8gJ3ByZScgOiAnJ1xuXG4gIGlmICh2MS5tYWpvciAhPT0gdjIubWFqb3IpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgJ21ham9yJ1xuICB9XG5cbiAgaWYgKHYxLm1pbm9yICE9PSB2Mi5taW5vcikge1xuICAgIHJldHVybiBwcmVmaXggKyAnbWlub3InXG4gIH1cblxuICBpZiAodjEucGF0Y2ggIT09IHYyLnBhdGNoKSB7XG4gICAgcmV0dXJuIHByZWZpeCArICdwYXRjaCdcbiAgfVxuXG4gIC8vIGhpZ2ggYW5kIGxvdyBhcmUgcHJlbGVhc2VzXG4gIHJldHVybiAncHJlcmVsZWFzZSdcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkaWZmXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBtYWpvciA9IChhLCBsb29zZSkgPT4gbmV3IFNlbVZlcihhLCBsb29zZSkubWFqb3Jcbm1vZHVsZS5leHBvcnRzID0gbWFqb3JcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IG1pbm9yID0gKGEsIGxvb3NlKSA9PiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5taW5vclxubW9kdWxlLmV4cG9ydHMgPSBtaW5vclxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgcGF0Y2ggPSAoYSwgbG9vc2UpID0+IG5ldyBTZW1WZXIoYSwgbG9vc2UpLnBhdGNoXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgcHJlcmVsZWFzZSA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJldHVybiAocGFyc2VkICYmIHBhcnNlZC5wcmVyZWxlYXNlLmxlbmd0aCkgPyBwYXJzZWQucHJlcmVsZWFzZSA6IG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gcHJlcmVsZWFzZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgY29tcGFyZSA9IChhLCBiLCBsb29zZSkgPT5cbiAgbmV3IFNlbVZlcihhLCBsb29zZSkuY29tcGFyZShuZXcgU2VtVmVyKGIsIGxvb3NlKSlcblxubW9kdWxlLmV4cG9ydHMgPSBjb21wYXJlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IHJjb21wYXJlID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGIsIGEsIGxvb3NlKVxubW9kdWxlLmV4cG9ydHMgPSByY29tcGFyZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBjb21wYXJlTG9vc2UgPSAoYSwgYikgPT4gY29tcGFyZShhLCBiLCB0cnVlKVxubW9kdWxlLmV4cG9ydHMgPSBjb21wYXJlTG9vc2VcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGNvbXBhcmVCdWlsZCA9IChhLCBiLCBsb29zZSkgPT4ge1xuICBjb25zdCB2ZXJzaW9uQSA9IG5ldyBTZW1WZXIoYSwgbG9vc2UpXG4gIGNvbnN0IHZlcnNpb25CID0gbmV3IFNlbVZlcihiLCBsb29zZSlcbiAgcmV0dXJuIHZlcnNpb25BLmNvbXBhcmUodmVyc2lvbkIpIHx8IHZlcnNpb25BLmNvbXBhcmVCdWlsZCh2ZXJzaW9uQilcbn1cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZUJ1aWxkXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlQnVpbGQgPSByZXF1aXJlKCcuL2NvbXBhcmUtYnVpbGQnKVxuY29uc3Qgc29ydCA9IChsaXN0LCBsb29zZSkgPT4gbGlzdC5zb3J0KChhLCBiKSA9PiBjb21wYXJlQnVpbGQoYSwgYiwgbG9vc2UpKVxubW9kdWxlLmV4cG9ydHMgPSBzb3J0XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlQnVpbGQgPSByZXF1aXJlKCcuL2NvbXBhcmUtYnVpbGQnKVxuY29uc3QgcnNvcnQgPSAobGlzdCwgbG9vc2UpID0+IGxpc3Quc29ydCgoYSwgYikgPT4gY29tcGFyZUJ1aWxkKGIsIGEsIGxvb3NlKSlcbm1vZHVsZS5leHBvcnRzID0gcnNvcnRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgZ3QgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpID4gMFxubW9kdWxlLmV4cG9ydHMgPSBndFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBsdCA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPCAwXG5tb2R1bGUuZXhwb3J0cyA9IGx0XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGVxID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA9PT0gMFxubW9kdWxlLmV4cG9ydHMgPSBlcVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBuZXEgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpICE9PSAwXG5tb2R1bGUuZXhwb3J0cyA9IG5lcVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBndGUgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpID49IDBcbm1vZHVsZS5leHBvcnRzID0gZ3RlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGx0ZSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPD0gMFxubW9kdWxlLmV4cG9ydHMgPSBsdGVcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGVxID0gcmVxdWlyZSgnLi9lcScpXG5jb25zdCBuZXEgPSByZXF1aXJlKCcuL25lcScpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4vZ3QnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi9ndGUnKVxuY29uc3QgbHQgPSByZXF1aXJlKCcuL2x0JylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4vbHRlJylcblxuY29uc3QgY21wID0gKGEsIG9wLCBiLCBsb29zZSkgPT4ge1xuICBzd2l0Y2ggKG9wKSB7XG4gICAgY2FzZSAnPT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSA9PT0gYlxuXG4gICAgY2FzZSAnIT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSAhPT0gYlxuXG4gICAgY2FzZSAnJzpcbiAgICBjYXNlICc9JzpcbiAgICBjYXNlICc9PSc6XG4gICAgICByZXR1cm4gZXEoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICchPSc6XG4gICAgICByZXR1cm4gbmVxKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPic6XG4gICAgICByZXR1cm4gZ3QoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc+PSc6XG4gICAgICByZXR1cm4gZ3RlKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPCc6XG4gICAgICByZXR1cm4gbHQoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc8PSc6XG4gICAgICByZXR1cm4gbHRlKGEsIGIsIGxvb3NlKVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgb3BlcmF0b3I6ICR7b3B9YClcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBjbXBcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcblxuY29uc3QgY29lcmNlID0gKHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICByZXR1cm4gdmVyc2lvblxuICB9XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnbnVtYmVyJykge1xuICAgIHZlcnNpb24gPSBTdHJpbmcodmVyc2lvbilcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICBsZXQgbWF0Y2ggPSBudWxsXG4gIGlmICghb3B0aW9ucy5ydGwpIHtcbiAgICBtYXRjaCA9IHZlcnNpb24ubWF0Y2gob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHJlW3QuQ09FUkNFRlVMTF0gOiByZVt0LkNPRVJDRV0pXG4gIH0gZWxzZSB7XG4gICAgLy8gRmluZCB0aGUgcmlnaHQtbW9zdCBjb2VyY2libGUgc3RyaW5nIHRoYXQgZG9lcyBub3Qgc2hhcmVcbiAgICAvLyBhIHRlcm1pbnVzIHdpdGggYSBtb3JlIGxlZnQtd2FyZCBjb2VyY2libGUgc3RyaW5nLlxuICAgIC8vIEVnLCAnMS4yLjMuNCcgd2FudHMgdG8gY29lcmNlICcyLjMuNCcsIG5vdCAnMy40JyBvciAnNCdcbiAgICAvLyBXaXRoIGluY2x1ZGVQcmVyZWxlYXNlIG9wdGlvbiBzZXQsICcxLjIuMy40LXJjJyB3YW50cyB0byBjb2VyY2UgJzIuMy40LXJjJywgbm90ICcyLjMuNCdcbiAgICAvL1xuICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgc3RyaW5nIGNoZWNraW5nIHdpdGggYSAvZyByZWdleHBcbiAgICAvLyBNYW51YWxseSBzZXQgdGhlIGluZGV4IHNvIGFzIHRvIHBpY2sgdXAgb3ZlcmxhcHBpbmcgbWF0Y2hlcy5cbiAgICAvLyBTdG9wIHdoZW4gd2UgZ2V0IGEgbWF0Y2ggdGhhdCBlbmRzIGF0IHRoZSBzdHJpbmcgZW5kLCBzaW5jZSBub1xuICAgIC8vIGNvZXJjaWJsZSBzdHJpbmcgY2FuIGJlIG1vcmUgcmlnaHQtd2FyZCB3aXRob3V0IHRoZSBzYW1lIHRlcm1pbnVzLlxuICAgIGNvbnN0IGNvZXJjZVJ0bFJlZ2V4ID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHJlW3QuQ09FUkNFUlRMRlVMTF0gOiByZVt0LkNPRVJDRVJUTF1cbiAgICBsZXQgbmV4dFxuICAgIHdoaWxlICgobmV4dCA9IGNvZXJjZVJ0bFJlZ2V4LmV4ZWModmVyc2lvbikpICYmXG4gICAgICAgICghbWF0Y2ggfHwgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggIT09IHZlcnNpb24ubGVuZ3RoKVxuICAgICkge1xuICAgICAgaWYgKCFtYXRjaCB8fFxuICAgICAgICAgICAgbmV4dC5pbmRleCArIG5leHRbMF0ubGVuZ3RoICE9PSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCkge1xuICAgICAgICBtYXRjaCA9IG5leHRcbiAgICAgIH1cbiAgICAgIGNvZXJjZVJ0bFJlZ2V4Lmxhc3RJbmRleCA9IG5leHQuaW5kZXggKyBuZXh0WzFdLmxlbmd0aCArIG5leHRbMl0ubGVuZ3RoXG4gICAgfVxuICAgIC8vIGxlYXZlIGl0IGluIGEgY2xlYW4gc3RhdGVcbiAgICBjb2VyY2VSdGxSZWdleC5sYXN0SW5kZXggPSAtMVxuICB9XG5cbiAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IG1ham9yID0gbWF0Y2hbMl1cbiAgY29uc3QgbWlub3IgPSBtYXRjaFszXSB8fCAnMCdcbiAgY29uc3QgcGF0Y2ggPSBtYXRjaFs0XSB8fCAnMCdcbiAgY29uc3QgcHJlcmVsZWFzZSA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiYgbWF0Y2hbNV0gPyBgLSR7bWF0Y2hbNV19YCA6ICcnXG4gIGNvbnN0IGJ1aWxkID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBtYXRjaFs2XSA/IGArJHttYXRjaFs2XX1gIDogJydcblxuICByZXR1cm4gcGFyc2UoYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2h9JHtwcmVyZWxlYXNlfSR7YnVpbGR9YCwgb3B0aW9ucylcbn1cbm1vZHVsZS5leHBvcnRzID0gY29lcmNlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jbGFzcyBMUlVDYWNoZSB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICB0aGlzLm1heCA9IDEwMDBcbiAgICB0aGlzLm1hcCA9IG5ldyBNYXAoKVxuICB9XG5cbiAgZ2V0IChrZXkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubWFwLmdldChrZXkpXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBrZXkgZnJvbSB0aGUgbWFwIGFuZCBhZGQgaXQgdG8gdGhlIGVuZFxuICAgICAgdGhpcy5tYXAuZGVsZXRlKGtleSlcbiAgICAgIHRoaXMubWFwLnNldChrZXksIHZhbHVlKVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuICB9XG5cbiAgZGVsZXRlIChrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZGVsZXRlKGtleSlcbiAgfVxuXG4gIHNldCAoa2V5LCB2YWx1ZSkge1xuICAgIGNvbnN0IGRlbGV0ZWQgPSB0aGlzLmRlbGV0ZShrZXkpXG5cbiAgICBpZiAoIWRlbGV0ZWQgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gSWYgY2FjaGUgaXMgZnVsbCwgZGVsZXRlIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGl0ZW1cbiAgICAgIGlmICh0aGlzLm1hcC5zaXplID49IHRoaXMubWF4KSB7XG4gICAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5tYXAua2V5cygpLm5leHQoKS52YWx1ZVxuICAgICAgICB0aGlzLmRlbGV0ZShmaXJzdEtleSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYXAuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IExSVUNhY2hlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTUEFDRV9DSEFSQUNURVJTID0gL1xccysvZ1xuXG4vLyBob2lzdGVkIGNsYXNzIGZvciBjeWNsaWMgZGVwZW5kZW5jeVxuY2xhc3MgUmFuZ2Uge1xuICBjb25zdHJ1Y3RvciAocmFuZ2UsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpXG5cbiAgICBpZiAocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkge1xuICAgICAgaWYgKFxuICAgICAgICByYW5nZS5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlICYmXG4gICAgICAgIHJhbmdlLmluY2x1ZGVQcmVyZWxlYXNlID09PSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gcmFuZ2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2UocmFuZ2UucmF3LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyYW5nZSBpbnN0YW5jZW9mIENvbXBhcmF0b3IpIHtcbiAgICAgIC8vIGp1c3QgcHV0IGl0IGluIHRoZSBzZXQgYW5kIHJldHVyblxuICAgICAgdGhpcy5yYXcgPSByYW5nZS52YWx1ZVxuICAgICAgdGhpcy5zZXQgPSBbW3JhbmdlXV1cbiAgICAgIHRoaXMuZm9ybWF0dGVkID0gdW5kZWZpbmVkXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgdGhpcy5pbmNsdWRlUHJlcmVsZWFzZSA9ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZVxuXG4gICAgLy8gRmlyc3QgcmVkdWNlIGFsbCB3aGl0ZXNwYWNlIGFzIG11Y2ggYXMgcG9zc2libGUgc28gd2UgZG8gbm90IGhhdmUgdG8gcmVseVxuICAgIC8vIG9uIHBvdGVudGlhbGx5IHNsb3cgcmVnZXhlcyBsaWtlIFxccyouIFRoaXMgaXMgdGhlbiBzdG9yZWQgYW5kIHVzZWQgZm9yXG4gICAgLy8gZnV0dXJlIGVycm9yIG1lc3NhZ2VzIGFzIHdlbGwuXG4gICAgdGhpcy5yYXcgPSByYW5nZS50cmltKCkucmVwbGFjZShTUEFDRV9DSEFSQUNURVJTLCAnICcpXG5cbiAgICAvLyBGaXJzdCwgc3BsaXQgb24gfHxcbiAgICB0aGlzLnNldCA9IHRoaXMucmF3XG4gICAgICAuc3BsaXQoJ3x8JylcbiAgICAgIC8vIG1hcCB0aGUgcmFuZ2UgdG8gYSAyZCBhcnJheSBvZiBjb21wYXJhdG9yc1xuICAgICAgLm1hcChyID0+IHRoaXMucGFyc2VSYW5nZShyLnRyaW0oKSkpXG4gICAgICAvLyB0aHJvdyBvdXQgYW55IGNvbXBhcmF0b3IgbGlzdHMgdGhhdCBhcmUgZW1wdHlcbiAgICAgIC8vIHRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgaXQgd2FzIG5vdCBhIHZhbGlkIHJhbmdlLCB3aGljaCBpcyBhbGxvd2VkXG4gICAgICAvLyBpbiBsb29zZSBtb2RlLCBidXQgd2lsbCBzdGlsbCB0aHJvdyBpZiB0aGUgV0hPTEUgcmFuZ2UgaXMgaW52YWxpZC5cbiAgICAgIC5maWx0ZXIoYyA9PiBjLmxlbmd0aClcblxuICAgIGlmICghdGhpcy5zZXQubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIFNlbVZlciBSYW5nZTogJHt0aGlzLnJhd31gKVxuICAgIH1cblxuICAgIC8vIGlmIHdlIGhhdmUgYW55IHRoYXQgYXJlIG5vdCB0aGUgbnVsbCBzZXQsIHRocm93IG91dCBudWxsIHNldHMuXG4gICAgaWYgKHRoaXMuc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIGtlZXAgdGhlIGZpcnN0IG9uZSwgaW4gY2FzZSB0aGV5J3JlIGFsbCBudWxsIHNldHNcbiAgICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5zZXRbMF1cbiAgICAgIHRoaXMuc2V0ID0gdGhpcy5zZXQuZmlsdGVyKGMgPT4gIWlzTnVsbFNldChjWzBdKSlcbiAgICAgIGlmICh0aGlzLnNldC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zZXQgPSBbZmlyc3RdXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbnkgdGhhdCBhcmUgKiwgdGhlbiB0aGUgcmFuZ2UgaXMganVzdCAqXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLnNldCkge1xuICAgICAgICAgIGlmIChjLmxlbmd0aCA9PT0gMSAmJiBpc0FueShjWzBdKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQgPSBbY11cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtYXR0ZWQgPSB1bmRlZmluZWRcbiAgfVxuXG4gIGdldCByYW5nZSAoKSB7XG4gICAgaWYgKHRoaXMuZm9ybWF0dGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZm9ybWF0dGVkID0gJydcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgdGhpcy5mb3JtYXR0ZWQgKz0gJ3x8J1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBzID0gdGhpcy5zZXRbaV1cbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb21wcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgIGlmIChrID4gMCkge1xuICAgICAgICAgICAgdGhpcy5mb3JtYXR0ZWQgKz0gJyAnXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZm9ybWF0dGVkICs9IGNvbXBzW2tdLnRvU3RyaW5nKCkudHJpbSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVkXG4gIH1cblxuICBmb3JtYXQgKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmdlXG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2VcbiAgfVxuXG4gIHBhcnNlUmFuZ2UgKHJhbmdlKSB7XG4gICAgLy8gbWVtb2l6ZSByYW5nZSBwYXJzaW5nIGZvciBwZXJmb3JtYW5jZS5cbiAgICAvLyB0aGlzIGlzIGEgdmVyeSBob3QgcGF0aCwgYW5kIGZ1bGx5IGRldGVybWluaXN0aWMuXG4gICAgY29uc3QgbWVtb09wdHMgPVxuICAgICAgKHRoaXMub3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRSkgfFxuICAgICAgKHRoaXMub3B0aW9ucy5sb29zZSAmJiBGTEFHX0xPT1NFKVxuICAgIGNvbnN0IG1lbW9LZXkgPSBtZW1vT3B0cyArICc6JyArIHJhbmdlXG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KG1lbW9LZXkpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFxuICAgIH1cblxuICAgIGNvbnN0IGxvb3NlID0gdGhpcy5vcHRpb25zLmxvb3NlXG4gICAgLy8gYDEuMi4zIC0gMS4yLjRgID0+IGA+PTEuMi4zIDw9MS4yLjRgXG4gICAgY29uc3QgaHIgPSBsb29zZSA/IHJlW3QuSFlQSEVOUkFOR0VMT09TRV0gOiByZVt0LkhZUEhFTlJBTkdFXVxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShociwgaHlwaGVuUmVwbGFjZSh0aGlzLm9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpKVxuICAgIGRlYnVnKCdoeXBoZW4gcmVwbGFjZScsIHJhbmdlKVxuXG4gICAgLy8gYD4gMS4yLjMgPCAxLjIuNWAgPT4gYD4xLjIuMyA8MS4yLjVgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuQ09NUEFSQVRPUlRSSU1dLCBjb21wYXJhdG9yVHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ2NvbXBhcmF0b3IgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gYH4gMS4yLjNgID0+IGB+MS4yLjNgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuVElMREVUUklNXSwgdGlsZGVUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygndGlsZGUgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gYF4gMS4yLjNgID0+IGBeMS4yLjNgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuQ0FSRVRUUklNXSwgY2FyZXRUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygnY2FyZXQgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIHJhbmdlIGlzIGNvbXBsZXRlbHkgdHJpbW1lZCBhbmRcbiAgICAvLyByZWFkeSB0byBiZSBzcGxpdCBpbnRvIGNvbXBhcmF0b3JzLlxuXG4gICAgbGV0IHJhbmdlTGlzdCA9IHJhbmdlXG4gICAgICAuc3BsaXQoJyAnKVxuICAgICAgLm1hcChjb21wID0+IHBhcnNlQ29tcGFyYXRvcihjb21wLCB0aGlzLm9wdGlvbnMpKVxuICAgICAgLmpvaW4oJyAnKVxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC8vID49MC4wLjAgaXMgZXF1aXZhbGVudCB0byAqXG4gICAgICAubWFwKGNvbXAgPT4gcmVwbGFjZUdURTAoY29tcCwgdGhpcy5vcHRpb25zKSlcblxuICAgIGlmIChsb29zZSkge1xuICAgICAgLy8gaW4gbG9vc2UgbW9kZSwgdGhyb3cgb3V0IGFueSB0aGF0IGFyZSBub3QgdmFsaWQgY29tcGFyYXRvcnNcbiAgICAgIHJhbmdlTGlzdCA9IHJhbmdlTGlzdC5maWx0ZXIoY29tcCA9PiB7XG4gICAgICAgIGRlYnVnKCdsb29zZSBpbnZhbGlkIGZpbHRlcicsIGNvbXAsIHRoaXMub3B0aW9ucylcbiAgICAgICAgcmV0dXJuICEhY29tcC5tYXRjaChyZVt0LkNPTVBBUkFUT1JMT09TRV0pXG4gICAgICB9KVxuICAgIH1cbiAgICBkZWJ1ZygncmFuZ2UgbGlzdCcsIHJhbmdlTGlzdClcblxuICAgIC8vIGlmIGFueSBjb21wYXJhdG9ycyBhcmUgdGhlIG51bGwgc2V0LCB0aGVuIHJlcGxhY2Ugd2l0aCBKVVNUIG51bGwgc2V0XG4gICAgLy8gaWYgbW9yZSB0aGFuIG9uZSBjb21wYXJhdG9yLCByZW1vdmUgYW55ICogY29tcGFyYXRvcnNcbiAgICAvLyBhbHNvLCBkb24ndCBpbmNsdWRlIHRoZSBzYW1lIGNvbXBhcmF0b3IgbW9yZSB0aGFuIG9uY2VcbiAgICBjb25zdCByYW5nZU1hcCA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IGNvbXBhcmF0b3JzID0gcmFuZ2VMaXN0Lm1hcChjb21wID0+IG5ldyBDb21wYXJhdG9yKGNvbXAsIHRoaXMub3B0aW9ucykpXG4gICAgZm9yIChjb25zdCBjb21wIG9mIGNvbXBhcmF0b3JzKSB7XG4gICAgICBpZiAoaXNOdWxsU2V0KGNvbXApKSB7XG4gICAgICAgIHJldHVybiBbY29tcF1cbiAgICAgIH1cbiAgICAgIHJhbmdlTWFwLnNldChjb21wLnZhbHVlLCBjb21wKVxuICAgIH1cbiAgICBpZiAocmFuZ2VNYXAuc2l6ZSA+IDEgJiYgcmFuZ2VNYXAuaGFzKCcnKSkge1xuICAgICAgcmFuZ2VNYXAuZGVsZXRlKCcnKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5yYW5nZU1hcC52YWx1ZXMoKV1cbiAgICBjYWNoZS5zZXQobWVtb0tleSwgcmVzdWx0KVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGludGVyc2VjdHMgKHJhbmdlLCBvcHRpb25zKSB7XG4gICAgaWYgKCEocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgUmFuZ2UgaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldC5zb21lKCh0aGlzQ29tcGFyYXRvcnMpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGlzU2F0aXNmaWFibGUodGhpc0NvbXBhcmF0b3JzLCBvcHRpb25zKSAmJlxuICAgICAgICByYW5nZS5zZXQuc29tZSgocmFuZ2VDb21wYXJhdG9ycykgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpc1NhdGlzZmlhYmxlKHJhbmdlQ29tcGFyYXRvcnMsIG9wdGlvbnMpICYmXG4gICAgICAgICAgICB0aGlzQ29tcGFyYXRvcnMuZXZlcnkoKHRoaXNDb21wYXJhdG9yKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiByYW5nZUNvbXBhcmF0b3JzLmV2ZXJ5KChyYW5nZUNvbXBhcmF0b3IpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc0NvbXBhcmF0b3IuaW50ZXJzZWN0cyhyYW5nZUNvbXBhcmF0b3IsIG9wdGlvbnMpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9KVxuICB9XG5cbiAgLy8gaWYgQU5ZIG9mIHRoZSBzZXRzIG1hdGNoIEFMTCBvZiBpdHMgY29tcGFyYXRvcnMsIHRoZW4gcGFzc1xuICB0ZXN0ICh2ZXJzaW9uKSB7XG4gICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCB0aGlzLm9wdGlvbnMpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGVzdFNldCh0aGlzLnNldFtpXSwgdmVyc2lvbiwgdGhpcy5vcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmdlXG5cbmNvbnN0IExSVSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2xydWNhY2hlJylcbmNvbnN0IGNhY2hlID0gbmV3IExSVSgpXG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3BhcnNlLW9wdGlvbnMnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4vY29tcGFyYXRvcicpXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vc2VtdmVyJylcbmNvbnN0IHtcbiAgc2FmZVJlOiByZSxcbiAgdCxcbiAgY29tcGFyYXRvclRyaW1SZXBsYWNlLFxuICB0aWxkZVRyaW1SZXBsYWNlLFxuICBjYXJldFRyaW1SZXBsYWNlLFxufSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcbmNvbnN0IHsgRkxBR19JTkNMVURFX1BSRVJFTEVBU0UsIEZMQUdfTE9PU0UgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2NvbnN0YW50cycpXG5cbmNvbnN0IGlzTnVsbFNldCA9IGMgPT4gYy52YWx1ZSA9PT0gJzwwLjAuMC0wJ1xuY29uc3QgaXNBbnkgPSBjID0+IGMudmFsdWUgPT09ICcnXG5cbi8vIHRha2UgYSBzZXQgb2YgY29tcGFyYXRvcnMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZXJlXG4vLyBleGlzdHMgYSB2ZXJzaW9uIHdoaWNoIGNhbiBzYXRpc2Z5IGl0XG5jb25zdCBpc1NhdGlzZmlhYmxlID0gKGNvbXBhcmF0b3JzLCBvcHRpb25zKSA9PiB7XG4gIGxldCByZXN1bHQgPSB0cnVlXG4gIGNvbnN0IHJlbWFpbmluZ0NvbXBhcmF0b3JzID0gY29tcGFyYXRvcnMuc2xpY2UoKVxuICBsZXQgdGVzdENvbXBhcmF0b3IgPSByZW1haW5pbmdDb21wYXJhdG9ycy5wb3AoKVxuXG4gIHdoaWxlIChyZXN1bHQgJiYgcmVtYWluaW5nQ29tcGFyYXRvcnMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ID0gcmVtYWluaW5nQ29tcGFyYXRvcnMuZXZlcnkoKG90aGVyQ29tcGFyYXRvcikgPT4ge1xuICAgICAgcmV0dXJuIHRlc3RDb21wYXJhdG9yLmludGVyc2VjdHMob3RoZXJDb21wYXJhdG9yLCBvcHRpb25zKVxuICAgIH0pXG5cbiAgICB0ZXN0Q29tcGFyYXRvciA9IHJlbWFpbmluZ0NvbXBhcmF0b3JzLnBvcCgpXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIGNvbXByaXNlZCBvZiB4cmFuZ2VzLCB0aWxkZXMsIHN0YXJzLCBhbmQgZ3RsdCdzIGF0IHRoaXMgcG9pbnQuXG4vLyBhbHJlYWR5IHJlcGxhY2VkIHRoZSBoeXBoZW4gcmFuZ2VzXG4vLyB0dXJuIGludG8gYSBzZXQgb2YgSlVTVCBjb21wYXJhdG9ycy5cbmNvbnN0IHBhcnNlQ29tcGFyYXRvciA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdjb21wJywgY29tcCwgb3B0aW9ucylcbiAgY29tcCA9IHJlcGxhY2VDYXJldHMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ2NhcmV0JywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VUaWxkZXMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ3RpbGRlcycsIGNvbXApXG4gIGNvbXAgPSByZXBsYWNlWFJhbmdlcyhjb21wLCBvcHRpb25zKVxuICBkZWJ1ZygneHJhbmdlJywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VTdGFycyhjb21wLCBvcHRpb25zKVxuICBkZWJ1Zygnc3RhcnMnLCBjb21wKVxuICByZXR1cm4gY29tcFxufVxuXG5jb25zdCBpc1ggPSBpZCA9PiAhaWQgfHwgaWQudG9Mb3dlckNhc2UoKSA9PT0gJ3gnIHx8IGlkID09PSAnKidcblxuLy8gfiwgfj4gLS0+ICogKGFueSwga2luZGEgc2lsbHkpXG4vLyB+MiwgfjIueCwgfjIueC54LCB+PjIsIH4+Mi54IH4+Mi54LnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIH4yLjAsIH4yLjAueCwgfj4yLjAsIH4+Mi4wLnggLS0+ID49Mi4wLjAgPDIuMS4wLTBcbi8vIH4xLjIsIH4xLjIueCwgfj4xLjIsIH4+MS4yLnggLS0+ID49MS4yLjAgPDEuMy4wLTBcbi8vIH4xLjIuMywgfj4xLjIuMyAtLT4gPj0xLjIuMyA8MS4zLjAtMFxuLy8gfjEuMi4wLCB+PjEuMi4wIC0tPiA+PTEuMi4wIDwxLjMuMC0wXG4vLyB+MC4wLjEgLS0+ID49MC4wLjEgPDAuMS4wLTBcbmNvbnN0IHJlcGxhY2VUaWxkZXMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VUaWxkZShjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VUaWxkZSA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5USUxERUxPT1NFXSA6IHJlW3QuVElMREVdXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKF8sIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ3RpbGRlJywgY29tcCwgXywgTSwgbSwgcCwgcHIpXG4gICAgbGV0IHJldFxuXG4gICAgaWYgKGlzWChNKSkge1xuICAgICAgcmV0ID0gJydcbiAgICB9IGVsc2UgaWYgKGlzWChtKSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAgPCR7K00gKyAxfS4wLjAtMGBcbiAgICB9IGVsc2UgaWYgKGlzWChwKSkge1xuICAgICAgLy8gfjEuMiA9PSA+PTEuMi4wIDwxLjMuMC0wXG4gICAgICByZXQgPSBgPj0ke019LiR7bX0uMCA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH0gZWxzZSBpZiAocHIpIHtcbiAgICAgIGRlYnVnKCdyZXBsYWNlVGlsZGUgcHInLCBwcilcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gfjEuMi4zID09ID49MS4yLjMgPDEuMy4wLTBcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9XG5cbiAgICBkZWJ1ZygndGlsZGUgcmV0dXJuJywgcmV0KVxuICAgIHJldHVybiByZXRcbiAgfSlcbn1cblxuLy8gXiAtLT4gKiAoYW55LCBraW5kYSBzaWxseSlcbi8vIF4yLCBeMi54LCBeMi54LnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIF4yLjAsIF4yLjAueCAtLT4gPj0yLjAuMCA8My4wLjAtMFxuLy8gXjEuMiwgXjEuMi54IC0tPiA+PTEuMi4wIDwyLjAuMC0wXG4vLyBeMS4yLjMgLS0+ID49MS4yLjMgPDIuMC4wLTBcbi8vIF4xLjIuMCAtLT4gPj0xLjIuMCA8Mi4wLjAtMFxuLy8gXjAuMC4xIC0tPiA+PTAuMC4xIDwwLjAuMi0wXG4vLyBeMC4xLjAgLS0+ID49MC4xLjAgPDAuMi4wLTBcbmNvbnN0IHJlcGxhY2VDYXJldHMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VDYXJldChjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VDYXJldCA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdjYXJldCcsIGNvbXAsIG9wdGlvbnMpXG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5DQVJFVExPT1NFXSA6IHJlW3QuQ0FSRVRdXG4gIGNvbnN0IHogPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gJy0wJyA6ICcnXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKF8sIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ2NhcmV0JywgY29tcCwgXywgTSwgbSwgcCwgcHIpXG4gICAgbGV0IHJldFxuXG4gICAgaWYgKGlzWChNKSkge1xuICAgICAgcmV0ID0gJydcbiAgICB9IGVsc2UgaWYgKGlzWChtKSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAke3p9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgfSBlbHNlIGlmIChpc1gocCkpIHtcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAke3p9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uMCR7en0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByKSB7XG4gICAgICBkZWJ1ZygncmVwbGFjZUNhcmV0IHByJywgcHIpXG4gICAgICBpZiAoTSA9PT0gJzAnKSB7XG4gICAgICAgIGlmIChtID09PSAnMCcpIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwfS0ke3ByXG4gICAgICAgICAgfSA8JHtNfS4ke219LiR7K3AgKyAxfS0wYFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Zygnbm8gcHInKVxuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICBpZiAobSA9PT0gJzAnKSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICAgIH0ke3p9IDwke019LiR7bX0uJHsrcCArIDF9LTBgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICAgIH0ke3p9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgICAgfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH1cblxuICAgIGRlYnVnKCdjYXJldCByZXR1cm4nLCByZXQpXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG5jb25zdCByZXBsYWNlWFJhbmdlcyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdyZXBsYWNlWFJhbmdlcycsIGNvbXAsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChjKSA9PiByZXBsYWNlWFJhbmdlKGMsIG9wdGlvbnMpKVxuICAgIC5qb2luKCcgJylcbn1cblxuY29uc3QgcmVwbGFjZVhSYW5nZSA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGNvbXAgPSBjb21wLnRyaW0oKVxuICBjb25zdCByID0gb3B0aW9ucy5sb29zZSA/IHJlW3QuWFJBTkdFTE9PU0VdIDogcmVbdC5YUkFOR0VdXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKHJldCwgZ3RsdCwgTSwgbSwgcCwgcHIpID0+IHtcbiAgICBkZWJ1ZygneFJhbmdlJywgY29tcCwgcmV0LCBndGx0LCBNLCBtLCBwLCBwcilcbiAgICBjb25zdCB4TSA9IGlzWChNKVxuICAgIGNvbnN0IHhtID0geE0gfHwgaXNYKG0pXG4gICAgY29uc3QgeHAgPSB4bSB8fCBpc1gocClcbiAgICBjb25zdCBhbnlYID0geHBcblxuICAgIGlmIChndGx0ID09PSAnPScgJiYgYW55WCkge1xuICAgICAgZ3RsdCA9ICcnXG4gICAgfVxuXG4gICAgLy8gaWYgd2UncmUgaW5jbHVkaW5nIHByZXJlbGVhc2VzIGluIHRoZSBtYXRjaCwgdGhlbiB3ZSBuZWVkXG4gICAgLy8gdG8gZml4IHRoaXMgdG8gLTAsIHRoZSBsb3dlc3QgcG9zc2libGUgcHJlcmVsZWFzZSB2YWx1ZVxuICAgIHByID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/ICctMCcgOiAnJ1xuXG4gICAgaWYgKHhNKSB7XG4gICAgICBpZiAoZ3RsdCA9PT0gJz4nIHx8IGd0bHQgPT09ICc8Jykge1xuICAgICAgICAvLyBub3RoaW5nIGlzIGFsbG93ZWRcbiAgICAgICAgcmV0ID0gJzwwLjAuMC0wJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm90aGluZyBpcyBmb3JiaWRkZW5cbiAgICAgICAgcmV0ID0gJyonXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChndGx0ICYmIGFueVgpIHtcbiAgICAgIC8vIHdlIGtub3cgcGF0Y2ggaXMgYW4geCwgYmVjYXVzZSB3ZSBoYXZlIGFueSB4IGF0IGFsbC5cbiAgICAgIC8vIHJlcGxhY2UgWCB3aXRoIDBcbiAgICAgIGlmICh4bSkge1xuICAgICAgICBtID0gMFxuICAgICAgfVxuICAgICAgcCA9IDBcblxuICAgICAgaWYgKGd0bHQgPT09ICc+Jykge1xuICAgICAgICAvLyA+MSA9PiA+PTIuMC4wXG4gICAgICAgIC8vID4xLjIgPT4gPj0xLjMuMFxuICAgICAgICBndGx0ID0gJz49J1xuICAgICAgICBpZiAoeG0pIHtcbiAgICAgICAgICBNID0gK00gKyAxXG4gICAgICAgICAgbSA9IDBcbiAgICAgICAgICBwID0gMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0gPSArbSArIDFcbiAgICAgICAgICBwID0gMFxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGd0bHQgPT09ICc8PScpIHtcbiAgICAgICAgLy8gPD0wLjcueCBpcyBhY3R1YWxseSA8MC44LjAsIHNpbmNlIGFueSAwLjcueCBzaG91bGRcbiAgICAgICAgLy8gcGFzcy4gIFNpbWlsYXJseSwgPD03LnggaXMgYWN0dWFsbHkgPDguMC4wLCBldGMuXG4gICAgICAgIGd0bHQgPSAnPCdcbiAgICAgICAgaWYgKHhtKSB7XG4gICAgICAgICAgTSA9ICtNICsgMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0gPSArbSArIDFcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZ3RsdCA9PT0gJzwnKSB7XG4gICAgICAgIHByID0gJy0wJ1xuICAgICAgfVxuXG4gICAgICByZXQgPSBgJHtndGx0ICsgTX0uJHttfS4ke3B9JHtwcn1gXG4gICAgfSBlbHNlIGlmICh4bSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAke3ByfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgIH0gZWxzZSBpZiAoeHApIHtcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wJHtwclxuICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH1cblxuICAgIGRlYnVnKCd4UmFuZ2UgcmV0dXJuJywgcmV0KVxuXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG4vLyBCZWNhdXNlICogaXMgQU5ELWVkIHdpdGggZXZlcnl0aGluZyBlbHNlIGluIHRoZSBjb21wYXJhdG9yLFxuLy8gYW5kICcnIG1lYW5zIFwiYW55IHZlcnNpb25cIiwganVzdCByZW1vdmUgdGhlICpzIGVudGlyZWx5LlxuY29uc3QgcmVwbGFjZVN0YXJzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ3JlcGxhY2VTdGFycycsIGNvbXAsIG9wdGlvbnMpXG4gIC8vIExvb3NlbmVzcyBpcyBpZ25vcmVkIGhlcmUuICBzdGFyIGlzIGFsd2F5cyBhcyBsb29zZSBhcyBpdCBnZXRzIVxuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAucmVwbGFjZShyZVt0LlNUQVJdLCAnJylcbn1cblxuY29uc3QgcmVwbGFjZUdURTAgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygncmVwbGFjZUdURTAnLCBjb21wLCBvcHRpb25zKVxuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAucmVwbGFjZShyZVtvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gdC5HVEUwUFJFIDogdC5HVEUwXSwgJycpXG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHN0cmluZy5yZXBsYWNlKHJlW3QuSFlQSEVOUkFOR0VdKVxuLy8gTSwgbSwgcGF0Y2gsIHByZXJlbGVhc2UsIGJ1aWxkXG4vLyAxLjIgLSAzLjQuNSA9PiA+PTEuMi4wIDw9My40LjVcbi8vIDEuMi4zIC0gMy40ID0+ID49MS4yLjAgPDMuNS4wLTAgQW55IDMuNC54IHdpbGwgZG9cbi8vIDEuMiAtIDMuNCA9PiA+PTEuMi4wIDwzLjUuMC0wXG4vLyBUT0RPIGJ1aWxkP1xuY29uc3QgaHlwaGVuUmVwbGFjZSA9IGluY1ByID0+ICgkMCxcbiAgZnJvbSwgZk0sIGZtLCBmcCwgZnByLCBmYixcbiAgdG8sIHRNLCB0bSwgdHAsIHRwcikgPT4ge1xuICBpZiAoaXNYKGZNKSkge1xuICAgIGZyb20gPSAnJ1xuICB9IGVsc2UgaWYgKGlzWChmbSkpIHtcbiAgICBmcm9tID0gYD49JHtmTX0uMC4wJHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH0gZWxzZSBpZiAoaXNYKGZwKSkge1xuICAgIGZyb20gPSBgPj0ke2ZNfS4ke2ZtfS4wJHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH0gZWxzZSBpZiAoZnByKSB7XG4gICAgZnJvbSA9IGA+PSR7ZnJvbX1gXG4gIH0gZWxzZSB7XG4gICAgZnJvbSA9IGA+PSR7ZnJvbX0ke2luY1ByID8gJy0wJyA6ICcnfWBcbiAgfVxuXG4gIGlmIChpc1godE0pKSB7XG4gICAgdG8gPSAnJ1xuICB9IGVsc2UgaWYgKGlzWCh0bSkpIHtcbiAgICB0byA9IGA8JHsrdE0gKyAxfS4wLjAtMGBcbiAgfSBlbHNlIGlmIChpc1godHApKSB7XG4gICAgdG8gPSBgPCR7dE19LiR7K3RtICsgMX0uMC0wYFxuICB9IGVsc2UgaWYgKHRwcikge1xuICAgIHRvID0gYDw9JHt0TX0uJHt0bX0uJHt0cH0tJHt0cHJ9YFxuICB9IGVsc2UgaWYgKGluY1ByKSB7XG4gICAgdG8gPSBgPCR7dE19LiR7dG19LiR7K3RwICsgMX0tMGBcbiAgfSBlbHNlIHtcbiAgICB0byA9IGA8PSR7dG99YFxuICB9XG5cbiAgcmV0dXJuIGAke2Zyb219ICR7dG99YC50cmltKClcbn1cblxuY29uc3QgdGVzdFNldCA9IChzZXQsIHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIXNldFtpXS50ZXN0KHZlcnNpb24pKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBpZiAodmVyc2lvbi5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgIC8vIEZpbmQgdGhlIHNldCBvZiB2ZXJzaW9ucyB0aGF0IGFyZSBhbGxvd2VkIHRvIGhhdmUgcHJlcmVsZWFzZXNcbiAgICAvLyBGb3IgZXhhbXBsZSwgXjEuMi4zLXByLjEgZGVzdWdhcnMgdG8gPj0xLjIuMy1wci4xIDwyLjAuMFxuICAgIC8vIFRoYXQgc2hvdWxkIGFsbG93IGAxLjIuMy1wci4yYCB0byBwYXNzLlxuICAgIC8vIEhvd2V2ZXIsIGAxLjIuNC1hbHBoYS5ub3RyZWFkeWAgc2hvdWxkIE5PVCBiZSBhbGxvd2VkLFxuICAgIC8vIGV2ZW4gdGhvdWdoIGl0J3Mgd2l0aGluIHRoZSByYW5nZSBzZXQgYnkgdGhlIGNvbXBhcmF0b3JzLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWJ1ZyhzZXRbaV0uc2VtdmVyKVxuICAgICAgaWYgKHNldFtpXS5zZW12ZXIgPT09IENvbXBhcmF0b3IuQU5ZKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChzZXRbaV0uc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBhbGxvd2VkID0gc2V0W2ldLnNlbXZlclxuICAgICAgICBpZiAoYWxsb3dlZC5tYWpvciA9PT0gdmVyc2lvbi5tYWpvciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5taW5vciA9PT0gdmVyc2lvbi5taW5vciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5wYXRjaCA9PT0gdmVyc2lvbi5wYXRjaCkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWZXJzaW9uIGhhcyBhIC1wcmUsIGJ1dCBpdCdzIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2UgbGlrZS5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBBTlkgPSBTeW1ib2woJ1NlbVZlciBBTlknKVxuLy8gaG9pc3RlZCBjbGFzcyBmb3IgY3ljbGljIGRlcGVuZGVuY3lcbmNsYXNzIENvbXBhcmF0b3Ige1xuICBzdGF0aWMgZ2V0IEFOWSAoKSB7XG4gICAgcmV0dXJuIEFOWVxuICB9XG5cbiAgY29uc3RydWN0b3IgKGNvbXAsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpXG5cbiAgICBpZiAoY29tcCBpbnN0YW5jZW9mIENvbXBhcmF0b3IpIHtcbiAgICAgIGlmIChjb21wLmxvb3NlID09PSAhIW9wdGlvbnMubG9vc2UpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXAgPSBjb21wLnZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcCA9IGNvbXAudHJpbSgpLnNwbGl0KC9cXHMrLykuam9pbignICcpXG4gICAgZGVidWcoJ2NvbXBhcmF0b3InLCBjb21wLCBvcHRpb25zKVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgdGhpcy5wYXJzZShjb21wKVxuXG4gICAgaWYgKHRoaXMuc2VtdmVyID09PSBBTlkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSAnJ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5vcGVyYXRvciArIHRoaXMuc2VtdmVyLnZlcnNpb25cbiAgICB9XG5cbiAgICBkZWJ1ZygnY29tcCcsIHRoaXMpXG4gIH1cblxuICBwYXJzZSAoY29tcCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLm9wdGlvbnMubG9vc2UgPyByZVt0LkNPTVBBUkFUT1JMT09TRV0gOiByZVt0LkNPTVBBUkFUT1JdXG4gICAgY29uc3QgbSA9IGNvbXAubWF0Y2gocilcblxuICAgIGlmICghbSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBjb21wYXJhdG9yOiAke2NvbXB9YClcbiAgICB9XG5cbiAgICB0aGlzLm9wZXJhdG9yID0gbVsxXSAhPT0gdW5kZWZpbmVkID8gbVsxXSA6ICcnXG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICc9Jykge1xuICAgICAgdGhpcy5vcGVyYXRvciA9ICcnXG4gICAgfVxuXG4gICAgLy8gaWYgaXQgbGl0ZXJhbGx5IGlzIGp1c3QgJz4nIG9yICcnIHRoZW4gYWxsb3cgYW55dGhpbmcuXG4gICAgaWYgKCFtWzJdKSB7XG4gICAgICB0aGlzLnNlbXZlciA9IEFOWVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbXZlciA9IG5ldyBTZW1WZXIobVsyXSwgdGhpcy5vcHRpb25zLmxvb3NlKVxuICAgIH1cbiAgfVxuXG4gIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZVxuICB9XG5cbiAgdGVzdCAodmVyc2lvbikge1xuICAgIGRlYnVnKCdDb21wYXJhdG9yLnRlc3QnLCB2ZXJzaW9uLCB0aGlzLm9wdGlvbnMubG9vc2UpXG5cbiAgICBpZiAodGhpcy5zZW12ZXIgPT09IEFOWSB8fCB2ZXJzaW9uID09PSBBTlkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgdGhpcy5vcHRpb25zKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNtcCh2ZXJzaW9uLCB0aGlzLm9wZXJhdG9yLCB0aGlzLnNlbXZlciwgdGhpcy5vcHRpb25zKVxuICB9XG5cbiAgaW50ZXJzZWN0cyAoY29tcCwgb3B0aW9ucykge1xuICAgIGlmICghKGNvbXAgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYSBDb21wYXJhdG9yIGlzIHJlcXVpcmVkJylcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJycpIHtcbiAgICAgIGlmICh0aGlzLnZhbHVlID09PSAnJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSYW5nZShjb21wLnZhbHVlLCBvcHRpb25zKS50ZXN0KHRoaXMudmFsdWUpXG4gICAgfSBlbHNlIGlmIChjb21wLm9wZXJhdG9yID09PSAnJykge1xuICAgICAgaWYgKGNvbXAudmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJhbmdlKHRoaXMudmFsdWUsIG9wdGlvbnMpLnRlc3QoY29tcC5zZW12ZXIpXG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgLy8gU3BlY2lhbCBjYXNlcyB3aGVyZSBub3RoaW5nIGNhbiBwb3NzaWJseSBiZSBsb3dlclxuICAgIGlmIChvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmXG4gICAgICAodGhpcy52YWx1ZSA9PT0gJzwwLjAuMC0wJyB8fCBjb21wLnZhbHVlID09PSAnPDAuMC4wLTAnKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgICAgKHRoaXMudmFsdWUuc3RhcnRzV2l0aCgnPDAuMC4wJykgfHwgY29tcC52YWx1ZS5zdGFydHNXaXRoKCc8MC4wLjAnKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIFNhbWUgZGlyZWN0aW9uIGluY3JlYXNpbmcgKD4gb3IgPj0pXG4gICAgaWYgKHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBTYW1lIGRpcmVjdGlvbiBkZWNyZWFzaW5nICg8IG9yIDw9KVxuICAgIGlmICh0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJzwnKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJzwnKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gc2FtZSBTZW1WZXIgYW5kIGJvdGggc2lkZXMgYXJlIGluY2x1c2l2ZSAoPD0gb3IgPj0pXG4gICAgaWYgKFxuICAgICAgKHRoaXMuc2VtdmVyLnZlcnNpb24gPT09IGNvbXAuc2VtdmVyLnZlcnNpb24pICYmXG4gICAgICB0aGlzLm9wZXJhdG9yLmluY2x1ZGVzKCc9JykgJiYgY29tcC5vcGVyYXRvci5pbmNsdWRlcygnPScpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBvcHBvc2l0ZSBkaXJlY3Rpb25zIGxlc3MgdGhhblxuICAgIGlmIChjbXAodGhpcy5zZW12ZXIsICc8JywgY29tcC5zZW12ZXIsIG9wdGlvbnMpICYmXG4gICAgICB0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJzwnKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gb3Bwb3NpdGUgZGlyZWN0aW9ucyBncmVhdGVyIHRoYW5cbiAgICBpZiAoY21wKHRoaXMuc2VtdmVyLCAnPicsIGNvbXAuc2VtdmVyLCBvcHRpb25zKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29tcGFyYXRvclxuXG5jb25zdCBwYXJzZU9wdGlvbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9wYXJzZS1vcHRpb25zJylcbmNvbnN0IHsgc2FmZVJlOiByZSwgdCB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuY29uc3QgY21wID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2NtcCcpXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi9yYW5nZScpXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3Qgc2F0aXNmaWVzID0gKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIHRyeSB7XG4gICAgcmFuZ2UgPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHJhbmdlLnRlc3QodmVyc2lvbilcbn1cbm1vZHVsZS5leHBvcnRzID0gc2F0aXNmaWVzXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuXG4vLyBNb3N0bHkganVzdCBmb3IgdGVzdGluZyBhbmQgbGVnYWN5IEFQSSByZWFzb25zXG5jb25zdCB0b0NvbXBhcmF0b3JzID0gKHJhbmdlLCBvcHRpb25zKSA9PlxuICBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpLnNldFxuICAgIC5tYXAoY29tcCA9PiBjb21wLm1hcChjID0+IGMudmFsdWUpLmpvaW4oJyAnKS50cmltKCkuc3BsaXQoJyAnKSlcblxubW9kdWxlLmV4cG9ydHMgPSB0b0NvbXBhcmF0b3JzXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuXG5jb25zdCBtYXhTYXRpc2Z5aW5nID0gKHZlcnNpb25zLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICBsZXQgbWF4ID0gbnVsbFxuICBsZXQgbWF4U1YgPSBudWxsXG4gIGxldCByYW5nZU9iaiA9IG51bGxcbiAgdHJ5IHtcbiAgICByYW5nZU9iaiA9IG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHZlcnNpb25zLmZvckVhY2goKHYpID0+IHtcbiAgICBpZiAocmFuZ2VPYmoudGVzdCh2KSkge1xuICAgICAgLy8gc2F0aXNmaWVzKHYsIHJhbmdlLCBvcHRpb25zKVxuICAgICAgaWYgKCFtYXggfHwgbWF4U1YuY29tcGFyZSh2KSA9PT0gLTEpIHtcbiAgICAgICAgLy8gY29tcGFyZShtYXgsIHYsIHRydWUpXG4gICAgICAgIG1heCA9IHZcbiAgICAgICAgbWF4U1YgPSBuZXcgU2VtVmVyKG1heCwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiBtYXhcbn1cbm1vZHVsZS5leHBvcnRzID0gbWF4U2F0aXNmeWluZ1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IG1pblNhdGlzZnlpbmcgPSAodmVyc2lvbnMsIHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIGxldCBtaW4gPSBudWxsXG4gIGxldCBtaW5TViA9IG51bGxcbiAgbGV0IHJhbmdlT2JqID0gbnVsbFxuICB0cnkge1xuICAgIHJhbmdlT2JqID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgdmVyc2lvbnMuZm9yRWFjaCgodikgPT4ge1xuICAgIGlmIChyYW5nZU9iai50ZXN0KHYpKSB7XG4gICAgICAvLyBzYXRpc2ZpZXModiwgcmFuZ2UsIG9wdGlvbnMpXG4gICAgICBpZiAoIW1pbiB8fCBtaW5TVi5jb21wYXJlKHYpID09PSAxKSB7XG4gICAgICAgIC8vIGNvbXBhcmUobWluLCB2LCB0cnVlKVxuICAgICAgICBtaW4gPSB2XG4gICAgICAgIG1pblNWID0gbmV3IFNlbVZlcihtaW4sIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gbWluXG59XG5tb2R1bGUuZXhwb3J0cyA9IG1pblNhdGlzZnlpbmdcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndCcpXG5cbmNvbnN0IG1pblZlcnNpb24gPSAocmFuZ2UsIGxvb3NlKSA9PiB7XG4gIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSlcblxuICBsZXQgbWludmVyID0gbmV3IFNlbVZlcignMC4wLjAnKVxuICBpZiAocmFuZ2UudGVzdChtaW52ZXIpKSB7XG4gICAgcmV0dXJuIG1pbnZlclxuICB9XG5cbiAgbWludmVyID0gbmV3IFNlbVZlcignMC4wLjAtMCcpXG4gIGlmIChyYW5nZS50ZXN0KG1pbnZlcikpIHtcbiAgICByZXR1cm4gbWludmVyXG4gIH1cblxuICBtaW52ZXIgPSBudWxsXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2Uuc2V0Lmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSByYW5nZS5zZXRbaV1cblxuICAgIGxldCBzZXRNaW4gPSBudWxsXG4gICAgY29tcGFyYXRvcnMuZm9yRWFjaCgoY29tcGFyYXRvcikgPT4ge1xuICAgICAgLy8gQ2xvbmUgdG8gYXZvaWQgbWFuaXB1bGF0aW5nIHRoZSBjb21wYXJhdG9yJ3Mgc2VtdmVyIG9iamVjdC5cbiAgICAgIGNvbnN0IGNvbXB2ZXIgPSBuZXcgU2VtVmVyKGNvbXBhcmF0b3Iuc2VtdmVyLnZlcnNpb24pXG4gICAgICBzd2l0Y2ggKGNvbXBhcmF0b3Iub3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgaWYgKGNvbXB2ZXIucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbXB2ZXIucGF0Y2grK1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21wdmVyLnByZXJlbGVhc2UucHVzaCgwKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb21wdmVyLnJhdyA9IGNvbXB2ZXIuZm9ybWF0KClcbiAgICAgICAgICAvKiBmYWxsdGhyb3VnaCAqL1xuICAgICAgICBjYXNlICcnOlxuICAgICAgICBjYXNlICc+PSc6XG4gICAgICAgICAgaWYgKCFzZXRNaW4gfHwgZ3QoY29tcHZlciwgc2V0TWluKSkge1xuICAgICAgICAgICAgc2V0TWluID0gY29tcHZlclxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgY2FzZSAnPD0nOlxuICAgICAgICAgIC8qIElnbm9yZSBtYXhpbXVtIHZlcnNpb25zICovXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgb3BlcmF0aW9uOiAke2NvbXBhcmF0b3Iub3BlcmF0b3J9YClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChzZXRNaW4gJiYgKCFtaW52ZXIgfHwgZ3QobWludmVyLCBzZXRNaW4pKSkge1xuICAgICAgbWludmVyID0gc2V0TWluXG4gICAgfVxuICB9XG5cbiAgaWYgKG1pbnZlciAmJiByYW5nZS50ZXN0KG1pbnZlcikpIHtcbiAgICByZXR1cm4gbWludmVyXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxubW9kdWxlLmV4cG9ydHMgPSBtaW5WZXJzaW9uXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgdmFsaWRSYW5nZSA9IChyYW5nZSwgb3B0aW9ucykgPT4ge1xuICB0cnkge1xuICAgIC8vIFJldHVybiAnKicgaW5zdGVhZCBvZiAnJyBzbyB0aGF0IHRydXRoaW5lc3Mgd29ya3MuXG4gICAgLy8gVGhpcyB3aWxsIHRocm93IGlmIGl0J3MgaW52YWxpZCBhbnl3YXlcbiAgICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKS5yYW5nZSB8fCAnKidcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHZhbGlkUmFuZ2VcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IENvbXBhcmF0b3IgPSByZXF1aXJlKCcuLi9jbGFzc2VzL2NvbXBhcmF0b3InKVxuY29uc3QgeyBBTlkgfSA9IENvbXBhcmF0b3JcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvc2F0aXNmaWVzJylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2d0JylcbmNvbnN0IGx0ID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2x0JylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9sdGUnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2d0ZScpXG5cbmNvbnN0IG91dHNpZGUgPSAodmVyc2lvbiwgcmFuZ2UsIGhpbG8sIG9wdGlvbnMpID0+IHtcbiAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgb3B0aW9ucylcbiAgcmFuZ2UgPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG5cbiAgbGV0IGd0Zm4sIGx0ZWZuLCBsdGZuLCBjb21wLCBlY29tcFxuICBzd2l0Y2ggKGhpbG8pIHtcbiAgICBjYXNlICc+JzpcbiAgICAgIGd0Zm4gPSBndFxuICAgICAgbHRlZm4gPSBsdGVcbiAgICAgIGx0Zm4gPSBsdFxuICAgICAgY29tcCA9ICc+J1xuICAgICAgZWNvbXAgPSAnPj0nXG4gICAgICBicmVha1xuICAgIGNhc2UgJzwnOlxuICAgICAgZ3RmbiA9IGx0XG4gICAgICBsdGVmbiA9IGd0ZVxuICAgICAgbHRmbiA9IGd0XG4gICAgICBjb21wID0gJzwnXG4gICAgICBlY29tcCA9ICc8PSdcbiAgICAgIGJyZWFrXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ011c3QgcHJvdmlkZSBhIGhpbG8gdmFsIG9mIFwiPFwiIG9yIFwiPlwiJylcbiAgfVxuXG4gIC8vIElmIGl0IHNhdGlzZmllcyB0aGUgcmFuZ2UgaXQgaXMgbm90IG91dHNpZGVcbiAgaWYgKHNhdGlzZmllcyh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIEZyb20gbm93IG9uLCB2YXJpYWJsZSB0ZXJtcyBhcmUgYXMgaWYgd2UncmUgaW4gXCJndHJcIiBtb2RlLlxuICAvLyBidXQgbm90ZSB0aGF0IGV2ZXJ5dGhpbmcgaXMgZmxpcHBlZCBmb3IgdGhlIFwibHRyXCIgZnVuY3Rpb24uXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZS5zZXQubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjb21wYXJhdG9ycyA9IHJhbmdlLnNldFtpXVxuXG4gICAgbGV0IGhpZ2ggPSBudWxsXG4gICAgbGV0IGxvdyA9IG51bGxcblxuICAgIGNvbXBhcmF0b3JzLmZvckVhY2goKGNvbXBhcmF0b3IpID0+IHtcbiAgICAgIGlmIChjb21wYXJhdG9yLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICAgIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcignPj0wLjAuMCcpXG4gICAgICB9XG4gICAgICBoaWdoID0gaGlnaCB8fCBjb21wYXJhdG9yXG4gICAgICBsb3cgPSBsb3cgfHwgY29tcGFyYXRvclxuICAgICAgaWYgKGd0Zm4oY29tcGFyYXRvci5zZW12ZXIsIGhpZ2guc2VtdmVyLCBvcHRpb25zKSkge1xuICAgICAgICBoaWdoID0gY29tcGFyYXRvclxuICAgICAgfSBlbHNlIGlmIChsdGZuKGNvbXBhcmF0b3Iuc2VtdmVyLCBsb3cuc2VtdmVyLCBvcHRpb25zKSkge1xuICAgICAgICBsb3cgPSBjb21wYXJhdG9yXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIElmIHRoZSBlZGdlIHZlcnNpb24gY29tcGFyYXRvciBoYXMgYSBvcGVyYXRvciB0aGVuIG91ciB2ZXJzaW9uXG4gICAgLy8gaXNuJ3Qgb3V0c2lkZSBpdFxuICAgIGlmIChoaWdoLm9wZXJhdG9yID09PSBjb21wIHx8IGhpZ2gub3BlcmF0b3IgPT09IGVjb21wKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbG93ZXN0IHZlcnNpb24gY29tcGFyYXRvciBoYXMgYW4gb3BlcmF0b3IgYW5kIG91ciB2ZXJzaW9uXG4gICAgLy8gaXMgbGVzcyB0aGFuIGl0IHRoZW4gaXQgaXNuJ3QgaGlnaGVyIHRoYW4gdGhlIHJhbmdlXG4gICAgaWYgKCghbG93Lm9wZXJhdG9yIHx8IGxvdy5vcGVyYXRvciA9PT0gY29tcCkgJiZcbiAgICAgICAgbHRlZm4odmVyc2lvbiwgbG93LnNlbXZlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSBpZiAobG93Lm9wZXJhdG9yID09PSBlY29tcCAmJiBsdGZuKHZlcnNpb24sIGxvdy5zZW12ZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdXRzaWRlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBEZXRlcm1pbmUgaWYgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gYWxsIHRoZSB2ZXJzaW9ucyBwb3NzaWJsZSBpbiB0aGUgcmFuZ2UuXG5jb25zdCBvdXRzaWRlID0gcmVxdWlyZSgnLi9vdXRzaWRlJylcbmNvbnN0IGd0ciA9ICh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykgPT4gb3V0c2lkZSh2ZXJzaW9uLCByYW5nZSwgJz4nLCBvcHRpb25zKVxubW9kdWxlLmV4cG9ydHMgPSBndHJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IG91dHNpZGUgPSByZXF1aXJlKCcuL291dHNpZGUnKVxuLy8gRGV0ZXJtaW5lIGlmIHZlcnNpb24gaXMgbGVzcyB0aGFuIGFsbCB0aGUgdmVyc2lvbnMgcG9zc2libGUgaW4gdGhlIHJhbmdlXG5jb25zdCBsdHIgPSAodmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IG91dHNpZGUodmVyc2lvbiwgcmFuZ2UsICc8Jywgb3B0aW9ucylcbm1vZHVsZS5leHBvcnRzID0gbHRyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgaW50ZXJzZWN0cyA9IChyMSwgcjIsIG9wdGlvbnMpID0+IHtcbiAgcjEgPSBuZXcgUmFuZ2UocjEsIG9wdGlvbnMpXG4gIHIyID0gbmV3IFJhbmdlKHIyLCBvcHRpb25zKVxuICByZXR1cm4gcjEuaW50ZXJzZWN0cyhyMiwgb3B0aW9ucylcbn1cbm1vZHVsZS5leHBvcnRzID0gaW50ZXJzZWN0c1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuLy8gZ2l2ZW4gYSBzZXQgb2YgdmVyc2lvbnMgYW5kIGEgcmFuZ2UsIGNyZWF0ZSBhIFwic2ltcGxpZmllZFwiIHJhbmdlXG4vLyB0aGF0IGluY2x1ZGVzIHRoZSBzYW1lIHZlcnNpb25zIHRoYXQgdGhlIG9yaWdpbmFsIHJhbmdlIGRvZXNcbi8vIElmIHRoZSBvcmlnaW5hbCByYW5nZSBpcyBzaG9ydGVyIHRoYW4gdGhlIHNpbXBsaWZpZWQgb25lLCByZXR1cm4gdGhhdC5cbmNvbnN0IHNhdGlzZmllcyA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9zYXRpc2ZpZXMuanMnKVxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9jb21wYXJlLmpzJylcbm1vZHVsZS5leHBvcnRzID0gKHZlcnNpb25zLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBzZXQgPSBbXVxuICBsZXQgZmlyc3QgPSBudWxsXG4gIGxldCBwcmV2ID0gbnVsbFxuICBjb25zdCB2ID0gdmVyc2lvbnMuc29ydCgoYSwgYikgPT4gY29tcGFyZShhLCBiLCBvcHRpb25zKSlcbiAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIHYpIHtcbiAgICBjb25zdCBpbmNsdWRlZCA9IHNhdGlzZmllcyh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucylcbiAgICBpZiAoaW5jbHVkZWQpIHtcbiAgICAgIHByZXYgPSB2ZXJzaW9uXG4gICAgICBpZiAoIWZpcnN0KSB7XG4gICAgICAgIGZpcnN0ID0gdmVyc2lvblxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJldikge1xuICAgICAgICBzZXQucHVzaChbZmlyc3QsIHByZXZdKVxuICAgICAgfVxuICAgICAgcHJldiA9IG51bGxcbiAgICAgIGZpcnN0ID0gbnVsbFxuICAgIH1cbiAgfVxuICBpZiAoZmlyc3QpIHtcbiAgICBzZXQucHVzaChbZmlyc3QsIG51bGxdKVxuICB9XG5cbiAgY29uc3QgcmFuZ2VzID0gW11cbiAgZm9yIChjb25zdCBbbWluLCBtYXhdIG9mIHNldCkge1xuICAgIGlmIChtaW4gPT09IG1heCkge1xuICAgICAgcmFuZ2VzLnB1c2gobWluKVxuICAgIH0gZWxzZSBpZiAoIW1heCAmJiBtaW4gPT09IHZbMF0pIHtcbiAgICAgIHJhbmdlcy5wdXNoKCcqJylcbiAgICB9IGVsc2UgaWYgKCFtYXgpIHtcbiAgICAgIHJhbmdlcy5wdXNoKGA+PSR7bWlufWApXG4gICAgfSBlbHNlIGlmIChtaW4gPT09IHZbMF0pIHtcbiAgICAgIHJhbmdlcy5wdXNoKGA8PSR7bWF4fWApXG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlcy5wdXNoKGAke21pbn0gLSAke21heH1gKVxuICAgIH1cbiAgfVxuICBjb25zdCBzaW1wbGlmaWVkID0gcmFuZ2VzLmpvaW4oJyB8fCAnKVxuICBjb25zdCBvcmlnaW5hbCA9IHR5cGVvZiByYW5nZS5yYXcgPT09ICdzdHJpbmcnID8gcmFuZ2UucmF3IDogU3RyaW5nKHJhbmdlKVxuICByZXR1cm4gc2ltcGxpZmllZC5sZW5ndGggPCBvcmlnaW5hbC5sZW5ndGggPyBzaW1wbGlmaWVkIDogcmFuZ2Vcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZS5qcycpXG5jb25zdCBDb21wYXJhdG9yID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9jb21wYXJhdG9yLmpzJylcbmNvbnN0IHsgQU5ZIH0gPSBDb21wYXJhdG9yXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvc2F0aXNmaWVzLmpzJylcbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvY29tcGFyZS5qcycpXG5cbi8vIENvbXBsZXggcmFuZ2UgYHIxIHx8IHIyIHx8IC4uLmAgaXMgYSBzdWJzZXQgb2YgYFIxIHx8IFIyIHx8IC4uLmAgaWZmOlxuLy8gLSBFdmVyeSBzaW1wbGUgcmFuZ2UgYHIxLCByMiwgLi4uYCBpcyBhIG51bGwgc2V0LCBPUlxuLy8gLSBFdmVyeSBzaW1wbGUgcmFuZ2UgYHIxLCByMiwgLi4uYCB3aGljaCBpcyBub3QgYSBudWxsIHNldCBpcyBhIHN1YnNldCBvZlxuLy8gICBzb21lIGBSMSwgUjIsIC4uLmBcbi8vXG4vLyBTaW1wbGUgcmFuZ2UgYGMxIGMyIC4uLmAgaXMgYSBzdWJzZXQgb2Ygc2ltcGxlIHJhbmdlIGBDMSBDMiAuLi5gIGlmZjpcbi8vIC0gSWYgYyBpcyBvbmx5IHRoZSBBTlkgY29tcGFyYXRvclxuLy8gICAtIElmIEMgaXMgb25seSB0aGUgQU5ZIGNvbXBhcmF0b3IsIHJldHVybiB0cnVlXG4vLyAgIC0gRWxzZSBpZiBpbiBwcmVyZWxlYXNlIG1vZGUsIHJldHVybiBmYWxzZVxuLy8gICAtIGVsc2UgcmVwbGFjZSBjIHdpdGggYFs+PTAuMC4wXWBcbi8vIC0gSWYgQyBpcyBvbmx5IHRoZSBBTlkgY29tcGFyYXRvclxuLy8gICAtIGlmIGluIHByZXJlbGVhc2UgbW9kZSwgcmV0dXJuIHRydWVcbi8vICAgLSBlbHNlIHJlcGxhY2UgQyB3aXRoIGBbPj0wLjAuMF1gXG4vLyAtIExldCBFUSBiZSB0aGUgc2V0IG9mID0gY29tcGFyYXRvcnMgaW4gY1xuLy8gLSBJZiBFUSBpcyBtb3JlIHRoYW4gb25lLCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAtIExldCBHVCBiZSB0aGUgaGlnaGVzdCA+IG9yID49IGNvbXBhcmF0b3IgaW4gY1xuLy8gLSBMZXQgTFQgYmUgdGhlIGxvd2VzdCA8IG9yIDw9IGNvbXBhcmF0b3IgaW4gY1xuLy8gLSBJZiBHVCBhbmQgTFQsIGFuZCBHVC5zZW12ZXIgPiBMVC5zZW12ZXIsIHJldHVybiB0cnVlIChudWxsIHNldClcbi8vIC0gSWYgYW55IEMgaXMgYSA9IHJhbmdlLCBhbmQgR1Qgb3IgTFQgYXJlIHNldCwgcmV0dXJuIGZhbHNlXG4vLyAtIElmIEVRXG4vLyAgIC0gSWYgR1QsIGFuZCBFUSBkb2VzIG5vdCBzYXRpc2Z5IEdULCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAgIC0gSWYgTFQsIGFuZCBFUSBkb2VzIG5vdCBzYXRpc2Z5IExULCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAgIC0gSWYgRVEgc2F0aXNmaWVzIGV2ZXJ5IEMsIHJldHVybiB0cnVlXG4vLyAgIC0gRWxzZSByZXR1cm4gZmFsc2Vcbi8vIC0gSWYgR1Rcbi8vICAgLSBJZiBHVC5zZW12ZXIgaXMgbG93ZXIgdGhhbiBhbnkgPiBvciA+PSBjb21wIGluIEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIEdUIGlzID49LCBhbmQgR1Quc2VtdmVyIGRvZXMgbm90IHNhdGlzZnkgZXZlcnkgQywgcmV0dXJuIGZhbHNlXG4vLyAgIC0gSWYgR1Quc2VtdmVyIGhhcyBhIHByZXJlbGVhc2UsIGFuZCBub3QgaW4gcHJlcmVsZWFzZSBtb2RlXG4vLyAgICAgLSBJZiBubyBDIGhhcyBhIHByZXJlbGVhc2UgYW5kIHRoZSBHVC5zZW12ZXIgdHVwbGUsIHJldHVybiBmYWxzZVxuLy8gLSBJZiBMVFxuLy8gICAtIElmIExULnNlbXZlciBpcyBncmVhdGVyIHRoYW4gYW55IDwgb3IgPD0gY29tcCBpbiBDLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBJZiBMVCBpcyA8PSwgYW5kIExULnNlbXZlciBkb2VzIG5vdCBzYXRpc2Z5IGV2ZXJ5IEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIEdULnNlbXZlciBoYXMgYSBwcmVyZWxlYXNlLCBhbmQgbm90IGluIHByZXJlbGVhc2UgbW9kZVxuLy8gICAgIC0gSWYgbm8gQyBoYXMgYSBwcmVyZWxlYXNlIGFuZCB0aGUgTFQuc2VtdmVyIHR1cGxlLCByZXR1cm4gZmFsc2Vcbi8vIC0gRWxzZSByZXR1cm4gdHJ1ZVxuXG5jb25zdCBzdWJzZXQgPSAoc3ViLCBkb20sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAoc3ViID09PSBkb20pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgc3ViID0gbmV3IFJhbmdlKHN1Yiwgb3B0aW9ucylcbiAgZG9tID0gbmV3IFJhbmdlKGRvbSwgb3B0aW9ucylcbiAgbGV0IHNhd05vbk51bGwgPSBmYWxzZVxuXG4gIE9VVEVSOiBmb3IgKGNvbnN0IHNpbXBsZVN1YiBvZiBzdWIuc2V0KSB7XG4gICAgZm9yIChjb25zdCBzaW1wbGVEb20gb2YgZG9tLnNldCkge1xuICAgICAgY29uc3QgaXNTdWIgPSBzaW1wbGVTdWJzZXQoc2ltcGxlU3ViLCBzaW1wbGVEb20sIG9wdGlvbnMpXG4gICAgICBzYXdOb25OdWxsID0gc2F3Tm9uTnVsbCB8fCBpc1N1YiAhPT0gbnVsbFxuICAgICAgaWYgKGlzU3ViKSB7XG4gICAgICAgIGNvbnRpbnVlIE9VVEVSXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHRoZSBudWxsIHNldCBpcyBhIHN1YnNldCBvZiBldmVyeXRoaW5nLCBidXQgbnVsbCBzaW1wbGUgcmFuZ2VzIGluXG4gICAgLy8gYSBjb21wbGV4IHJhbmdlIHNob3VsZCBiZSBpZ25vcmVkLiAgc28gaWYgd2Ugc2F3IGEgbm9uLW51bGwgcmFuZ2UsXG4gICAgLy8gdGhlbiB3ZSBrbm93IHRoaXMgaXNuJ3QgYSBzdWJzZXQsIGJ1dCBpZiBFVkVSWSBzaW1wbGUgcmFuZ2Ugd2FzIG51bGwsXG4gICAgLy8gdGhlbiBpdCBpcyBhIHN1YnNldC5cbiAgICBpZiAoc2F3Tm9uTnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbmNvbnN0IG1pbmltdW1WZXJzaW9uV2l0aFByZVJlbGVhc2UgPSBbbmV3IENvbXBhcmF0b3IoJz49MC4wLjAtMCcpXVxuY29uc3QgbWluaW11bVZlcnNpb24gPSBbbmV3IENvbXBhcmF0b3IoJz49MC4wLjAnKV1cblxuY29uc3Qgc2ltcGxlU3Vic2V0ID0gKHN1YiwgZG9tLCBvcHRpb25zKSA9PiB7XG4gIGlmIChzdWIgPT09IGRvbSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoc3ViLmxlbmd0aCA9PT0gMSAmJiBzdWJbMF0uc2VtdmVyID09PSBBTlkpIHtcbiAgICBpZiAoZG9tLmxlbmd0aCA9PT0gMSAmJiBkb21bMF0uc2VtdmVyID09PSBBTlkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICBzdWIgPSBtaW5pbXVtVmVyc2lvbldpdGhQcmVSZWxlYXNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHN1YiA9IG1pbmltdW1WZXJzaW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKGRvbS5sZW5ndGggPT09IDEgJiYgZG9tWzBdLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvbSA9IG1pbmltdW1WZXJzaW9uXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXFTZXQgPSBuZXcgU2V0KClcbiAgbGV0IGd0LCBsdFxuICBmb3IgKGNvbnN0IGMgb2Ygc3ViKSB7XG4gICAgaWYgKGMub3BlcmF0b3IgPT09ICc+JyB8fCBjLm9wZXJhdG9yID09PSAnPj0nKSB7XG4gICAgICBndCA9IGhpZ2hlckdUKGd0LCBjLCBvcHRpb25zKVxuICAgIH0gZWxzZSBpZiAoYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PScpIHtcbiAgICAgIGx0ID0gbG93ZXJMVChsdCwgYywgb3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgZXFTZXQuYWRkKGMuc2VtdmVyKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlcVNldC5zaXplID4gMSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBsZXQgZ3RsdENvbXBcbiAgaWYgKGd0ICYmIGx0KSB7XG4gICAgZ3RsdENvbXAgPSBjb21wYXJlKGd0LnNlbXZlciwgbHQuc2VtdmVyLCBvcHRpb25zKVxuICAgIGlmIChndGx0Q29tcCA+IDApIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfSBlbHNlIGlmIChndGx0Q29tcCA9PT0gMCAmJiAoZ3Qub3BlcmF0b3IgIT09ICc+PScgfHwgbHQub3BlcmF0b3IgIT09ICc8PScpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8vIHdpbGwgaXRlcmF0ZSBvbmUgb3IgemVybyB0aW1lc1xuICBmb3IgKGNvbnN0IGVxIG9mIGVxU2V0KSB7XG4gICAgaWYgKGd0ICYmICFzYXRpc2ZpZXMoZXEsIFN0cmluZyhndCksIG9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGlmIChsdCAmJiAhc2F0aXNmaWVzKGVxLCBTdHJpbmcobHQpLCBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGMgb2YgZG9tKSB7XG4gICAgICBpZiAoIXNhdGlzZmllcyhlcSwgU3RyaW5nKGMpLCBvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgbGV0IGhpZ2hlciwgbG93ZXJcbiAgbGV0IGhhc0RvbUxULCBoYXNEb21HVFxuICAvLyBpZiB0aGUgc3Vic2V0IGhhcyBhIHByZXJlbGVhc2UsIHdlIG5lZWQgYSBjb21wYXJhdG9yIGluIHRoZSBzdXBlcnNldFxuICAvLyB3aXRoIHRoZSBzYW1lIHR1cGxlIGFuZCBhIHByZXJlbGVhc2UsIG9yIGl0J3Mgbm90IGEgc3Vic2V0XG4gIGxldCBuZWVkRG9tTFRQcmUgPSBsdCAmJlxuICAgICFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmXG4gICAgbHQuc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID8gbHQuc2VtdmVyIDogZmFsc2VcbiAgbGV0IG5lZWREb21HVFByZSA9IGd0ICYmXG4gICAgIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICBndC5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggPyBndC5zZW12ZXIgOiBmYWxzZVxuICAvLyBleGNlcHRpb246IDwxLjIuMy0wIGlzIHRoZSBzYW1lIGFzIDwxLjIuM1xuICBpZiAobmVlZERvbUxUUHJlICYmIG5lZWREb21MVFByZS5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgbHQub3BlcmF0b3IgPT09ICc8JyAmJiBuZWVkRG9tTFRQcmUucHJlcmVsZWFzZVswXSA9PT0gMCkge1xuICAgIG5lZWREb21MVFByZSA9IGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IGMgb2YgZG9tKSB7XG4gICAgaGFzRG9tR1QgPSBoYXNEb21HVCB8fCBjLm9wZXJhdG9yID09PSAnPicgfHwgYy5vcGVyYXRvciA9PT0gJz49J1xuICAgIGhhc0RvbUxUID0gaGFzRG9tTFQgfHwgYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PSdcbiAgICBpZiAoZ3QpIHtcbiAgICAgIGlmIChuZWVkRG9tR1RQcmUpIHtcbiAgICAgICAgaWYgKGMuc2VtdmVyLnByZXJlbGVhc2UgJiYgYy5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1ham9yID09PSBuZWVkRG9tR1RQcmUubWFqb3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1pbm9yID09PSBuZWVkRG9tR1RQcmUubWlub3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLnBhdGNoID09PSBuZWVkRG9tR1RQcmUucGF0Y2gpIHtcbiAgICAgICAgICBuZWVkRG9tR1RQcmUgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYy5vcGVyYXRvciA9PT0gJz4nIHx8IGMub3BlcmF0b3IgPT09ICc+PScpIHtcbiAgICAgICAgaGlnaGVyID0gaGlnaGVyR1QoZ3QsIGMsIG9wdGlvbnMpXG4gICAgICAgIGlmIChoaWdoZXIgPT09IGMgJiYgaGlnaGVyICE9PSBndCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGd0Lm9wZXJhdG9yID09PSAnPj0nICYmICFzYXRpc2ZpZXMoZ3Quc2VtdmVyLCBTdHJpbmcoYyksIG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobHQpIHtcbiAgICAgIGlmIChuZWVkRG9tTFRQcmUpIHtcbiAgICAgICAgaWYgKGMuc2VtdmVyLnByZXJlbGVhc2UgJiYgYy5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1ham9yID09PSBuZWVkRG9tTFRQcmUubWFqb3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1pbm9yID09PSBuZWVkRG9tTFRQcmUubWlub3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLnBhdGNoID09PSBuZWVkRG9tTFRQcmUucGF0Y2gpIHtcbiAgICAgICAgICBuZWVkRG9tTFRQcmUgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PScpIHtcbiAgICAgICAgbG93ZXIgPSBsb3dlckxUKGx0LCBjLCBvcHRpb25zKVxuICAgICAgICBpZiAobG93ZXIgPT09IGMgJiYgbG93ZXIgIT09IGx0KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobHQub3BlcmF0b3IgPT09ICc8PScgJiYgIXNhdGlzZmllcyhsdC5zZW12ZXIsIFN0cmluZyhjKSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghYy5vcGVyYXRvciAmJiAobHQgfHwgZ3QpICYmIGd0bHRDb21wICE9PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGVyZSB3YXMgYSA8IG9yID4sIGFuZCBub3RoaW5nIGluIHRoZSBkb20sIHRoZW4gbXVzdCBiZSBmYWxzZVxuICAvLyBVTkxFU1MgaXQgd2FzIGxpbWl0ZWQgYnkgYW5vdGhlciByYW5nZSBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLlxuICAvLyBFZywgPjEuMC4wIDwxLjAuMSBpcyBzdGlsbCBhIHN1YnNldCBvZiA8Mi4wLjBcbiAgaWYgKGd0ICYmIGhhc0RvbUxUICYmICFsdCAmJiBndGx0Q29tcCAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKGx0ICYmIGhhc0RvbUdUICYmICFndCAmJiBndGx0Q29tcCAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gd2UgbmVlZGVkIGEgcHJlcmVsZWFzZSByYW5nZSBpbiBhIHNwZWNpZmljIHR1cGxlLCBidXQgZGlkbid0IGdldCBvbmVcbiAgLy8gdGhlbiB0aGlzIGlzbid0IGEgc3Vic2V0LiAgZWcgPj0xLjIuMy1wcmUgaXMgbm90IGEgc3Vic2V0IG9mID49MS4wLjAsXG4gIC8vIGJlY2F1c2UgaXQgaW5jbHVkZXMgcHJlcmVsZWFzZXMgaW4gdGhlIDEuMi4zIHR1cGxlXG4gIGlmIChuZWVkRG9tR1RQcmUgfHwgbmVlZERvbUxUUHJlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vLyA+PTEuMi4zIGlzIGxvd2VyIHRoYW4gPjEuMi4zXG5jb25zdCBoaWdoZXJHVCA9IChhLCBiLCBvcHRpb25zKSA9PiB7XG4gIGlmICghYSkge1xuICAgIHJldHVybiBiXG4gIH1cbiAgY29uc3QgY29tcCA9IGNvbXBhcmUoYS5zZW12ZXIsIGIuc2VtdmVyLCBvcHRpb25zKVxuICByZXR1cm4gY29tcCA+IDAgPyBhXG4gICAgOiBjb21wIDwgMCA/IGJcbiAgICA6IGIub3BlcmF0b3IgPT09ICc+JyAmJiBhLm9wZXJhdG9yID09PSAnPj0nID8gYlxuICAgIDogYVxufVxuXG4vLyA8PTEuMi4zIGlzIGhpZ2hlciB0aGFuIDwxLjIuM1xuY29uc3QgbG93ZXJMVCA9IChhLCBiLCBvcHRpb25zKSA9PiB7XG4gIGlmICghYSkge1xuICAgIHJldHVybiBiXG4gIH1cbiAgY29uc3QgY29tcCA9IGNvbXBhcmUoYS5zZW12ZXIsIGIuc2VtdmVyLCBvcHRpb25zKVxuICByZXR1cm4gY29tcCA8IDAgPyBhXG4gICAgOiBjb21wID4gMCA/IGJcbiAgICA6IGIub3BlcmF0b3IgPT09ICc8JyAmJiBhLm9wZXJhdG9yID09PSAnPD0nID8gYlxuICAgIDogYVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN1YnNldFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuLy8ganVzdCBwcmUtbG9hZCBhbGwgdGhlIHN0dWZmIHRoYXQgaW5kZXguanMgbGF6aWx5IGV4cG9ydHNcbmNvbnN0IGludGVybmFsUmUgPSByZXF1aXJlKCcuL2ludGVybmFsL3JlJylcbmNvbnN0IGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvY29uc3RhbnRzJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgaWRlbnRpZmllcnMgPSByZXF1aXJlKCcuL2ludGVybmFsL2lkZW50aWZpZXJzJylcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcGFyc2UnKVxuY29uc3QgdmFsaWQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy92YWxpZCcpXG5jb25zdCBjbGVhbiA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NsZWFuJylcbmNvbnN0IGluYyA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2luYycpXG5jb25zdCBkaWZmID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZGlmZicpXG5jb25zdCBtYWpvciA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL21ham9yJylcbmNvbnN0IG1pbm9yID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbWlub3InKVxuY29uc3QgcGF0Y2ggPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9wYXRjaCcpXG5jb25zdCBwcmVyZWxlYXNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcHJlcmVsZWFzZScpXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29tcGFyZScpXG5jb25zdCByY29tcGFyZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3Jjb21wYXJlJylcbmNvbnN0IGNvbXBhcmVMb29zZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvbXBhcmUtbG9vc2UnKVxuY29uc3QgY29tcGFyZUJ1aWxkID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29tcGFyZS1idWlsZCcpXG5jb25zdCBzb3J0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvc29ydCcpXG5jb25zdCByc29ydCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3Jzb3J0JylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZ3QnKVxuY29uc3QgbHQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9sdCcpXG5jb25zdCBlcSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2VxJylcbmNvbnN0IG5lcSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL25lcScpXG5jb25zdCBndGUgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9ndGUnKVxuY29uc3QgbHRlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbHRlJylcbmNvbnN0IGNtcCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NtcCcpXG5jb25zdCBjb2VyY2UgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jb2VyY2UnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9jb21wYXJhdG9yJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHNhdGlzZmllcyA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3NhdGlzZmllcycpXG5jb25zdCB0b0NvbXBhcmF0b3JzID0gcmVxdWlyZSgnLi9yYW5nZXMvdG8tY29tcGFyYXRvcnMnKVxuY29uc3QgbWF4U2F0aXNmeWluZyA9IHJlcXVpcmUoJy4vcmFuZ2VzL21heC1zYXRpc2Z5aW5nJylcbmNvbnN0IG1pblNhdGlzZnlpbmcgPSByZXF1aXJlKCcuL3Jhbmdlcy9taW4tc2F0aXNmeWluZycpXG5jb25zdCBtaW5WZXJzaW9uID0gcmVxdWlyZSgnLi9yYW5nZXMvbWluLXZlcnNpb24nKVxuY29uc3QgdmFsaWRSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2VzL3ZhbGlkJylcbmNvbnN0IG91dHNpZGUgPSByZXF1aXJlKCcuL3Jhbmdlcy9vdXRzaWRlJylcbmNvbnN0IGd0ciA9IHJlcXVpcmUoJy4vcmFuZ2VzL2d0cicpXG5jb25zdCBsdHIgPSByZXF1aXJlKCcuL3Jhbmdlcy9sdHInKVxuY29uc3QgaW50ZXJzZWN0cyA9IHJlcXVpcmUoJy4vcmFuZ2VzL2ludGVyc2VjdHMnKVxuY29uc3Qgc2ltcGxpZnlSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2VzL3NpbXBsaWZ5JylcbmNvbnN0IHN1YnNldCA9IHJlcXVpcmUoJy4vcmFuZ2VzL3N1YnNldCcpXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGFyc2UsXG4gIHZhbGlkLFxuICBjbGVhbixcbiAgaW5jLFxuICBkaWZmLFxuICBtYWpvcixcbiAgbWlub3IsXG4gIHBhdGNoLFxuICBwcmVyZWxlYXNlLFxuICBjb21wYXJlLFxuICByY29tcGFyZSxcbiAgY29tcGFyZUxvb3NlLFxuICBjb21wYXJlQnVpbGQsXG4gIHNvcnQsXG4gIHJzb3J0LFxuICBndCxcbiAgbHQsXG4gIGVxLFxuICBuZXEsXG4gIGd0ZSxcbiAgbHRlLFxuICBjbXAsXG4gIGNvZXJjZSxcbiAgQ29tcGFyYXRvcixcbiAgUmFuZ2UsXG4gIHNhdGlzZmllcyxcbiAgdG9Db21wYXJhdG9ycyxcbiAgbWF4U2F0aXNmeWluZyxcbiAgbWluU2F0aXNmeWluZyxcbiAgbWluVmVyc2lvbixcbiAgdmFsaWRSYW5nZSxcbiAgb3V0c2lkZSxcbiAgZ3RyLFxuICBsdHIsXG4gIGludGVyc2VjdHMsXG4gIHNpbXBsaWZ5UmFuZ2UsXG4gIHN1YnNldCxcbiAgU2VtVmVyLFxuICByZTogaW50ZXJuYWxSZS5yZSxcbiAgc3JjOiBpbnRlcm5hbFJlLnNyYyxcbiAgdG9rZW5zOiBpbnRlcm5hbFJlLnQsXG4gIFNFTVZFUl9TUEVDX1ZFUlNJT046IGNvbnN0YW50cy5TRU1WRVJfU1BFQ19WRVJTSU9OLFxuICBSRUxFQVNFX1RZUEVTOiBjb25zdGFudHMuUkVMRUFTRV9UWVBFUyxcbiAgY29tcGFyZUlkZW50aWZpZXJzOiBpZGVudGlmaWVycy5jb21wYXJlSWRlbnRpZmllcnMsXG4gIHJjb21wYXJlSWRlbnRpZmllcnM6IGlkZW50aWZpZXJzLnJjb21wYXJlSWRlbnRpZmllcnMsXG59XG4iLAogICAgImNvbnN0IHNlbXZlciA9IHJlcXVpcmUoJ3NlbXZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbXZlci5zYXRpc2ZpZXMocHJvY2Vzcy52ZXJzaW9uLCAnPj0xNS43LjAnKTtcbiIsCiAgICAiY29uc3Qgc2VtdmVyID0gcmVxdWlyZSgnc2VtdmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2VtdmVyLnNhdGlzZmllcyhwcm9jZXNzLnZlcnNpb24sICc+PTE2LjkuMCcpO1xuIiwKICAgICJjb25zdCBBU1lNTUVUUklDX0tFWV9ERVRBSUxTX1NVUFBPUlRFRCA9IHJlcXVpcmUoJy4vYXN5bW1ldHJpY0tleURldGFpbHNTdXBwb3J0ZWQnKTtcbmNvbnN0IFJTQV9QU1NfS0VZX0RFVEFJTFNfU1VQUE9SVEVEID0gcmVxdWlyZSgnLi9yc2FQc3NLZXlEZXRhaWxzU3VwcG9ydGVkJyk7XG5cbmNvbnN0IGFsbG93ZWRBbGdvcml0aG1zRm9yS2V5cyA9IHtcbiAgJ2VjJzogWydFUzI1NicsICdFUzM4NCcsICdFUzUxMiddLFxuICAncnNhJzogWydSUzI1NicsICdQUzI1NicsICdSUzM4NCcsICdQUzM4NCcsICdSUzUxMicsICdQUzUxMiddLFxuICAncnNhLXBzcyc6IFsnUFMyNTYnLCAnUFMzODQnLCAnUFM1MTInXVxufTtcblxuY29uc3QgYWxsb3dlZEN1cnZlcyA9IHtcbiAgRVMyNTY6ICdwcmltZTI1NnYxJyxcbiAgRVMzODQ6ICdzZWNwMzg0cjEnLFxuICBFUzUxMjogJ3NlY3A1MjFyMScsXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGFsZ29yaXRobSwga2V5KSB7XG4gIGlmICghYWxnb3JpdGhtIHx8ICFrZXkpIHJldHVybjtcblxuICBjb25zdCBrZXlUeXBlID0ga2V5LmFzeW1tZXRyaWNLZXlUeXBlO1xuICBpZiAoIWtleVR5cGUpIHJldHVybjtcblxuICBjb25zdCBhbGxvd2VkQWxnb3JpdGhtcyA9IGFsbG93ZWRBbGdvcml0aG1zRm9yS2V5c1trZXlUeXBlXTtcblxuICBpZiAoIWFsbG93ZWRBbGdvcml0aG1zKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGtleSB0eXBlIFwiJHtrZXlUeXBlfVwiLmApO1xuICB9XG5cbiAgaWYgKCFhbGxvd2VkQWxnb3JpdGhtcy5pbmNsdWRlcyhhbGdvcml0aG0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBcImFsZ1wiIHBhcmFtZXRlciBmb3IgXCIke2tleVR5cGV9XCIga2V5IHR5cGUgbXVzdCBiZSBvbmUgb2Y6ICR7YWxsb3dlZEFsZ29yaXRobXMuam9pbignLCAnKX0uYClcbiAgfVxuXG4gIC8qXG4gICAqIElnbm9yZSB0aGUgbmV4dCBibG9jayBmcm9tIHRlc3QgY292ZXJhZ2UgYmVjYXVzZSBpdCBnZXRzIGV4ZWN1dGVkXG4gICAqIGNvbmRpdGlvbmFsbHkgZGVwZW5kaW5nIG9uIHRoZSBOb2RlIHZlcnNpb24uIE5vdCBpZ25vcmluZyBpdCB3b3VsZFxuICAgKiBwcmV2ZW50IHVzIGZyb20gcmVhY2hpbmcgdGhlIHRhcmdldCAlIG9mIGNvdmVyYWdlIGZvciB2ZXJzaW9ucyBvZlxuICAgKiBOb2RlIHVuZGVyIDE1LjcuMC5cbiAgICovXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChBU1lNTUVUUklDX0tFWV9ERVRBSUxTX1NVUFBPUlRFRCkge1xuICAgIHN3aXRjaCAoa2V5VHlwZSkge1xuICAgIGNhc2UgJ2VjJzpcbiAgICAgIGNvbnN0IGtleUN1cnZlID0ga2V5LmFzeW1tZXRyaWNLZXlEZXRhaWxzLm5hbWVkQ3VydmU7XG4gICAgICBjb25zdCBhbGxvd2VkQ3VydmUgPSBhbGxvd2VkQ3VydmVzW2FsZ29yaXRobV07XG5cbiAgICAgIGlmIChrZXlDdXJ2ZSAhPT0gYWxsb3dlZEN1cnZlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJhbGdcIiBwYXJhbWV0ZXIgXCIke2FsZ29yaXRobX1cIiByZXF1aXJlcyBjdXJ2ZSBcIiR7YWxsb3dlZEN1cnZlfVwiLmApO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdyc2EtcHNzJzpcbiAgICAgIGlmIChSU0FfUFNTX0tFWV9ERVRBSUxTX1NVUFBPUlRFRCkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChhbGdvcml0aG0uc2xpY2UoLTMpLCAxMCk7XG4gICAgICAgIGNvbnN0IHsgaGFzaEFsZ29yaXRobSwgbWdmMUhhc2hBbGdvcml0aG0sIHNhbHRMZW5ndGggfSA9IGtleS5hc3ltbWV0cmljS2V5RGV0YWlscztcblxuICAgICAgICBpZiAoaGFzaEFsZ29yaXRobSAhPT0gYHNoYSR7bGVuZ3RofWAgfHwgbWdmMUhhc2hBbGdvcml0aG0gIT09IGhhc2hBbGdvcml0aG0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5IGZvciB0aGlzIG9wZXJhdGlvbiwgaXRzIFJTQS1QU1MgcGFyYW1ldGVycyBkbyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIG9mIFwiYWxnXCIgJHthbGdvcml0aG19LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNhbHRMZW5ndGggIT09IHVuZGVmaW5lZCAmJiBzYWx0TGVuZ3RoID4gbGVuZ3RoID4+IDMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5IGZvciB0aGlzIG9wZXJhdGlvbiwgaXRzIFJTQS1QU1MgcGFyYW1ldGVyIHNhbHRMZW5ndGggZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIG9mIFwiYWxnXCIgJHthbGdvcml0aG19LmApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuIiwKICAgICJ2YXIgc2VtdmVyID0gcmVxdWlyZSgnc2VtdmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2VtdmVyLnNhdGlzZmllcyhwcm9jZXNzLnZlcnNpb24sICdeNi4xMi4wIHx8ID49OC4wLjAnKTtcbiIsCiAgICAiY29uc3QgSnNvbldlYlRva2VuRXJyb3IgPSByZXF1aXJlKCcuL2xpYi9Kc29uV2ViVG9rZW5FcnJvcicpO1xuY29uc3QgTm90QmVmb3JlRXJyb3IgPSByZXF1aXJlKCcuL2xpYi9Ob3RCZWZvcmVFcnJvcicpO1xuY29uc3QgVG9rZW5FeHBpcmVkRXJyb3IgPSByZXF1aXJlKCcuL2xpYi9Ub2tlbkV4cGlyZWRFcnJvcicpO1xuY29uc3QgZGVjb2RlID0gcmVxdWlyZSgnLi9kZWNvZGUnKTtcbmNvbnN0IHRpbWVzcGFuID0gcmVxdWlyZSgnLi9saWIvdGltZXNwYW4nKTtcbmNvbnN0IHZhbGlkYXRlQXN5bW1ldHJpY0tleSA9IHJlcXVpcmUoJy4vbGliL3ZhbGlkYXRlQXN5bW1ldHJpY0tleScpO1xuY29uc3QgUFNfU1VQUE9SVEVEID0gcmVxdWlyZSgnLi9saWIvcHNTdXBwb3J0ZWQnKTtcbmNvbnN0IGp3cyA9IHJlcXVpcmUoJ2p3cycpO1xuY29uc3Qge0tleU9iamVjdCwgY3JlYXRlU2VjcmV0S2V5LCBjcmVhdGVQdWJsaWNLZXl9ID0gcmVxdWlyZShcImNyeXB0b1wiKTtcblxuY29uc3QgUFVCX0tFWV9BTEdTID0gWydSUzI1NicsICdSUzM4NCcsICdSUzUxMiddO1xuY29uc3QgRUNfS0VZX0FMR1MgPSBbJ0VTMjU2JywgJ0VTMzg0JywgJ0VTNTEyJ107XG5jb25zdCBSU0FfS0VZX0FMR1MgPSBbJ1JTMjU2JywgJ1JTMzg0JywgJ1JTNTEyJ107XG5jb25zdCBIU19BTEdTID0gWydIUzI1NicsICdIUzM4NCcsICdIUzUxMiddO1xuXG5pZiAoUFNfU1VQUE9SVEVEKSB7XG4gIFBVQl9LRVlfQUxHUy5zcGxpY2UoUFVCX0tFWV9BTEdTLmxlbmd0aCwgMCwgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJyk7XG4gIFJTQV9LRVlfQUxHUy5zcGxpY2UoUlNBX0tFWV9BTEdTLmxlbmd0aCwgMCwgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGp3dFN0cmluZywgc2VjcmV0T3JQdWJsaWNLZXksIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmICgodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpICYmICFjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICAvL2Nsb25lIHRoaXMgb2JqZWN0IHNpbmNlIHdlIGFyZSBnb2luZyB0byBtdXRhdGUgaXQuXG4gIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcblxuICBsZXQgZG9uZTtcblxuICBpZiAoY2FsbGJhY2spIHtcbiAgICBkb25lID0gY2FsbGJhY2s7XG4gIH0gZWxzZSB7XG4gICAgZG9uZSA9IGZ1bmN0aW9uKGVyciwgZGF0YSkge1xuICAgICAgaWYgKGVycikgdGhyb3cgZXJyO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmNsb2NrVGltZXN0YW1wICYmIHR5cGVvZiBvcHRpb25zLmNsb2NrVGltZXN0YW1wICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignY2xvY2tUaW1lc3RhbXAgbXVzdCBiZSBhIG51bWJlcicpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLm5vbmNlICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBvcHRpb25zLm5vbmNlICE9PSAnc3RyaW5nJyB8fCBvcHRpb25zLm5vbmNlLnRyaW0oKSA9PT0gJycpKSB7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdub25jZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlcyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdhbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXMgbXVzdCBiZSBhIGJvb2xlYW4nKSk7XG4gIH1cblxuICBjb25zdCBjbG9ja1RpbWVzdGFtcCA9IG9wdGlvbnMuY2xvY2tUaW1lc3RhbXAgfHwgTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbiAgaWYgKCFqd3RTdHJpbmcpe1xuICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IG11c3QgYmUgcHJvdmlkZWQnKSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGp3dFN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBtdXN0IGJlIGEgc3RyaW5nJykpO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBqd3RTdHJpbmcuc3BsaXQoJy4nKTtcblxuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKXtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBtYWxmb3JtZWQnKSk7XG4gIH1cblxuICBsZXQgZGVjb2RlZFRva2VuO1xuXG4gIHRyeSB7XG4gICAgZGVjb2RlZFRva2VuID0gZGVjb2RlKGp3dFN0cmluZywgeyBjb21wbGV0ZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaChlcnIpIHtcbiAgICByZXR1cm4gZG9uZShlcnIpO1xuICB9XG5cbiAgaWYgKCFkZWNvZGVkVG9rZW4pIHtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2ludmFsaWQgdG9rZW4nKSk7XG4gIH1cblxuICBjb25zdCBoZWFkZXIgPSBkZWNvZGVkVG9rZW4uaGVhZGVyO1xuICBsZXQgZ2V0U2VjcmV0O1xuXG4gIGlmKHR5cGVvZiBzZWNyZXRPclB1YmxpY0tleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmKCFjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCd2ZXJpZnkgbXVzdCBiZSBjYWxsZWQgYXN5bmNocm9ub3VzIGlmIHNlY3JldCBvciBwdWJsaWMga2V5IGlzIHByb3ZpZGVkIGFzIGEgY2FsbGJhY2snKSk7XG4gICAgfVxuXG4gICAgZ2V0U2VjcmV0ID0gc2VjcmV0T3JQdWJsaWNLZXk7XG4gIH1cbiAgZWxzZSB7XG4gICAgZ2V0U2VjcmV0ID0gZnVuY3Rpb24oaGVhZGVyLCBzZWNyZXRDYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHNlY3JldENhbGxiYWNrKG51bGwsIHNlY3JldE9yUHVibGljS2V5KTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGdldFNlY3JldChoZWFkZXIsIGZ1bmN0aW9uKGVyciwgc2VjcmV0T3JQdWJsaWNLZXkpIHtcbiAgICBpZihlcnIpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignZXJyb3IgaW4gc2VjcmV0IG9yIHB1YmxpYyBrZXkgY2FsbGJhY2s6ICcgKyBlcnIubWVzc2FnZSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc1NpZ25hdHVyZSA9IHBhcnRzWzJdLnRyaW0oKSAhPT0gJyc7XG5cbiAgICBpZiAoIWhhc1NpZ25hdHVyZSAmJiBzZWNyZXRPclB1YmxpY0tleSl7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBzaWduYXR1cmUgaXMgcmVxdWlyZWQnKSk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1NpZ25hdHVyZSAmJiAhc2VjcmV0T3JQdWJsaWNLZXkpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignc2VjcmV0IG9yIHB1YmxpYyBrZXkgbXVzdCBiZSBwcm92aWRlZCcpKTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc1NpZ25hdHVyZSAmJiAhb3B0aW9ucy5hbGdvcml0aG1zKSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ3BsZWFzZSBzcGVjaWZ5IFwibm9uZVwiIGluIFwiYWxnb3JpdGhtc1wiIHRvIHZlcmlmeSB1bnNpZ25lZCB0b2tlbnMnKSk7XG4gICAgfVxuXG4gICAgaWYgKHNlY3JldE9yUHVibGljS2V5ICE9IG51bGwgJiYgIShzZWNyZXRPclB1YmxpY0tleSBpbnN0YW5jZW9mIEtleU9iamVjdCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlY3JldE9yUHVibGljS2V5ID0gY3JlYXRlUHVibGljS2V5KHNlY3JldE9yUHVibGljS2V5KTtcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzZWNyZXRPclB1YmxpY0tleSA9IGNyZWF0ZVNlY3JldEtleSh0eXBlb2Ygc2VjcmV0T3JQdWJsaWNLZXkgPT09ICdzdHJpbmcnID8gQnVmZmVyLmZyb20oc2VjcmV0T3JQdWJsaWNLZXkpIDogc2VjcmV0T3JQdWJsaWNLZXkpO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdzZWNyZXRPclB1YmxpY0tleSBpcyBub3QgdmFsaWQga2V5IG1hdGVyaWFsJykpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuYWxnb3JpdGhtcykge1xuICAgICAgaWYgKHNlY3JldE9yUHVibGljS2V5LnR5cGUgPT09ICdzZWNyZXQnKSB7XG4gICAgICAgIG9wdGlvbnMuYWxnb3JpdGhtcyA9IEhTX0FMR1M7XG4gICAgICB9IGVsc2UgaWYgKFsncnNhJywgJ3JzYS1wc3MnXS5pbmNsdWRlcyhzZWNyZXRPclB1YmxpY0tleS5hc3ltbWV0cmljS2V5VHlwZSkpIHtcbiAgICAgICAgb3B0aW9ucy5hbGdvcml0aG1zID0gUlNBX0tFWV9BTEdTXG4gICAgICB9IGVsc2UgaWYgKHNlY3JldE9yUHVibGljS2V5LmFzeW1tZXRyaWNLZXlUeXBlID09PSAnZWMnKSB7XG4gICAgICAgIG9wdGlvbnMuYWxnb3JpdGhtcyA9IEVDX0tFWV9BTEdTXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zLmFsZ29yaXRobXMgPSBQVUJfS0VZX0FMR1NcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hbGdvcml0aG1zLmluZGV4T2YoZGVjb2RlZFRva2VuLmhlYWRlci5hbGcpID09PSAtMSkge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpbnZhbGlkIGFsZ29yaXRobScpKTtcbiAgICB9XG5cbiAgICBpZiAoaGVhZGVyLmFsZy5zdGFydHNXaXRoKCdIUycpICYmIHNlY3JldE9yUHVibGljS2V5LnR5cGUgIT09ICdzZWNyZXQnKSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoKGBzZWNyZXRPclB1YmxpY0tleSBtdXN0IGJlIGEgc3ltbWV0cmljIGtleSB3aGVuIHVzaW5nICR7aGVhZGVyLmFsZ31gKSkpXG4gICAgfSBlbHNlIGlmICgvXig/OlJTfFBTfEVTKS8udGVzdChoZWFkZXIuYWxnKSAmJiBzZWNyZXRPclB1YmxpY0tleS50eXBlICE9PSAncHVibGljJykge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKChgc2VjcmV0T3JQdWJsaWNLZXkgbXVzdCBiZSBhbiBhc3ltbWV0cmljIGtleSB3aGVuIHVzaW5nICR7aGVhZGVyLmFsZ31gKSkpXG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsaWRhdGVBc3ltbWV0cmljS2V5KGhlYWRlci5hbGcsIHNlY3JldE9yUHVibGljS2V5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHZhbGlkO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkID0gandzLnZlcmlmeShqd3RTdHJpbmcsIGRlY29kZWRUb2tlbi5oZWFkZXIuYWxnLCBzZWNyZXRPclB1YmxpY0tleSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgfVxuXG4gICAgaWYgKCF2YWxpZCkge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpbnZhbGlkIHNpZ25hdHVyZScpKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkID0gZGVjb2RlZFRva2VuLnBheWxvYWQ7XG5cbiAgICBpZiAodHlwZW9mIHBheWxvYWQubmJmICE9PSAndW5kZWZpbmVkJyAmJiAhb3B0aW9ucy5pZ25vcmVOb3RCZWZvcmUpIHtcbiAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC5uYmYgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignaW52YWxpZCBuYmYgdmFsdWUnKSk7XG4gICAgICB9XG4gICAgICBpZiAocGF5bG9hZC5uYmYgPiBjbG9ja1RpbWVzdGFtcCArIChvcHRpb25zLmNsb2NrVG9sZXJhbmNlIHx8IDApKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBOb3RCZWZvcmVFcnJvcignand0IG5vdCBhY3RpdmUnLCBuZXcgRGF0ZShwYXlsb2FkLm5iZiAqIDEwMDApKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkLmV4cCAhPT0gJ3VuZGVmaW5lZCcgJiYgIW9wdGlvbnMuaWdub3JlRXhwaXJhdGlvbikge1xuICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLmV4cCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpbnZhbGlkIGV4cCB2YWx1ZScpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9ja1RpbWVzdGFtcCA+PSBwYXlsb2FkLmV4cCArIChvcHRpb25zLmNsb2NrVG9sZXJhbmNlIHx8IDApKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBUb2tlbkV4cGlyZWRFcnJvcignand0IGV4cGlyZWQnLCBuZXcgRGF0ZShwYXlsb2FkLmV4cCAqIDEwMDApKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXVkaWVuY2UpIHtcbiAgICAgIGNvbnN0IGF1ZGllbmNlcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5hdWRpZW5jZSkgPyBvcHRpb25zLmF1ZGllbmNlIDogW29wdGlvbnMuYXVkaWVuY2VdO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gQXJyYXkuaXNBcnJheShwYXlsb2FkLmF1ZCkgPyBwYXlsb2FkLmF1ZCA6IFtwYXlsb2FkLmF1ZF07XG5cbiAgICAgIGNvbnN0IG1hdGNoID0gdGFyZ2V0LnNvbWUoZnVuY3Rpb24gKHRhcmdldEF1ZGllbmNlKSB7XG4gICAgICAgIHJldHVybiBhdWRpZW5jZXMuc29tZShmdW5jdGlvbiAoYXVkaWVuY2UpIHtcbiAgICAgICAgICByZXR1cm4gYXVkaWVuY2UgaW5zdGFuY2VvZiBSZWdFeHAgPyBhdWRpZW5jZS50ZXN0KHRhcmdldEF1ZGllbmNlKSA6IGF1ZGllbmNlID09PSB0YXJnZXRBdWRpZW5jZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBhdWRpZW5jZSBpbnZhbGlkLiBleHBlY3RlZDogJyArIGF1ZGllbmNlcy5qb2luKCcgb3IgJykpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pc3N1ZXIpIHtcbiAgICAgIGNvbnN0IGludmFsaWRfaXNzdWVyID1cbiAgICAgICAgICAgICAgKHR5cGVvZiBvcHRpb25zLmlzc3VlciA9PT0gJ3N0cmluZycgJiYgcGF5bG9hZC5pc3MgIT09IG9wdGlvbnMuaXNzdWVyKSB8fFxuICAgICAgICAgICAgICAoQXJyYXkuaXNBcnJheShvcHRpb25zLmlzc3VlcikgJiYgb3B0aW9ucy5pc3N1ZXIuaW5kZXhPZihwYXlsb2FkLmlzcykgPT09IC0xKTtcblxuICAgICAgaWYgKGludmFsaWRfaXNzdWVyKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IGlzc3VlciBpbnZhbGlkLiBleHBlY3RlZDogJyArIG9wdGlvbnMuaXNzdWVyKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc3ViamVjdCkge1xuICAgICAgaWYgKHBheWxvYWQuc3ViICE9PSBvcHRpb25zLnN1YmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3Qgc3ViamVjdCBpbnZhbGlkLiBleHBlY3RlZDogJyArIG9wdGlvbnMuc3ViamVjdCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmp3dGlkKSB7XG4gICAgICBpZiAocGF5bG9hZC5qdGkgIT09IG9wdGlvbnMuand0aWQpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3Qgand0aWQgaW52YWxpZC4gZXhwZWN0ZWQ6ICcgKyBvcHRpb25zLmp3dGlkKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubm9uY2UpIHtcbiAgICAgIGlmIChwYXlsb2FkLm5vbmNlICE9PSBvcHRpb25zLm5vbmNlKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IG5vbmNlIGludmFsaWQuIGV4cGVjdGVkOiAnICsgb3B0aW9ucy5ub25jZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1heEFnZSkge1xuICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLmlhdCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpYXQgcmVxdWlyZWQgd2hlbiBtYXhBZ2UgaXMgc3BlY2lmaWVkJykpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXhBZ2VUaW1lc3RhbXAgPSB0aW1lc3BhbihvcHRpb25zLm1heEFnZSwgcGF5bG9hZC5pYXQpO1xuICAgICAgaWYgKHR5cGVvZiBtYXhBZ2VUaW1lc3RhbXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignXCJtYXhBZ2VcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcyBvciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgdGltZXNwYW4gZWc6IFwiMWRcIiwgXCIyMGhcIiwgNjAnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY2xvY2tUaW1lc3RhbXAgPj0gbWF4QWdlVGltZXN0YW1wICsgKG9wdGlvbnMuY2xvY2tUb2xlcmFuY2UgfHwgMCkpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IFRva2VuRXhwaXJlZEVycm9yKCdtYXhBZ2UgZXhjZWVkZWQnLCBuZXcgRGF0ZShtYXhBZ2VUaW1lc3RhbXAgKiAxMDAwKSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmNvbXBsZXRlID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBkZWNvZGVkVG9rZW4uc2lnbmF0dXJlO1xuXG4gICAgICByZXR1cm4gZG9uZShudWxsLCB7XG4gICAgICAgIGhlYWRlcjogaGVhZGVyLFxuICAgICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgICBzaWduYXR1cmU6IHNpZ25hdHVyZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvbmUobnVsbCwgcGF5bG9hZCk7XG4gIH0pO1xufTtcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTEsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgaWYgKHZhbHVlICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG4gIH1cbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy52YWx1ZXNgIGFuZCBgXy52YWx1ZXNJbmAgd2hpY2ggY3JlYXRlcyBhblxuICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gKiBvZiBgcHJvcHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykge1xuICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICB9O1xufVxuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpLFxuICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgLy8gU2FmYXJpIDguMSBtYWtlcyBgYXJndW1lbnRzLmNhbGxlZWAgZW51bWVyYWJsZSBpbiBzdHJpY3QgbW9kZS5cbiAgLy8gU2FmYXJpIDkgbWFrZXMgYGFyZ3VtZW50cy5sZW5ndGhgIGVudW1lcmFibGUgaW4gc3RyaWN0IG1vZGUuXG4gIHZhciByZXN1bHQgPSAoaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKVxuICAgID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKVxuICAgIDogW107XG5cbiAgdmFyIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGgsXG4gICAgICBza2lwSW5kZXhlcyA9ICEhbGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKGtleSA9PSAnbGVuZ3RoJyB8fCBpc0luZGV4KGtleSwgbGVuZ3RoKSkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNgIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XG4gIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fCByZUlzVWludC50ZXN0KHZhbHVlKSkgJiZcbiAgICAodmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8IGxlbmd0aCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiBgY29sbGVjdGlvbmAuIElmIGBjb2xsZWN0aW9uYCBpcyBhIHN0cmluZywgaXQnc1xuICogY2hlY2tlZCBmb3IgYSBzdWJzdHJpbmcgb2YgYHZhbHVlYCwgb3RoZXJ3aXNlXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogaXMgdXNlZCBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXNcbiAqIHRoZSBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBjb2xsZWN0aW9uYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gIGNvbGxlY3Rpb24gPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24gOiB2YWx1ZXMoY29sbGVjdGlvbik7XG4gIGZyb21JbmRleCA9IChmcm9tSW5kZXggJiYgIWd1YXJkKSA/IHRvSW50ZWdlcihmcm9tSW5kZXgpIDogMDtcblxuICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgZnJvbUluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGZyb21JbmRleCwgMCk7XG4gIH1cbiAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pXG4gICAgPyAoZnJvbUluZGV4IDw9IGxlbmd0aCAmJiBjb2xsZWN0aW9uLmluZGV4T2YodmFsdWUsIGZyb21JbmRleCkgPiAtMSlcbiAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcbiAgLy8gU2FmYXJpIDguMSBtYWtlcyBgYXJndW1lbnRzLmNhbGxlZWAgZW51bWVyYWJsZSBpbiBzdHJpY3QgbW9kZS5cbiAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgJiZcbiAgICAoIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKSB8fCBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBhcmdzVGFnKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvclxuICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWBcbiAqIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOC05IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5IGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBpc09iamVjdCh2YWx1ZSkgPyBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3RyaW5nKDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9JbnRlZ2VyKDMuMik7XG4gKiAvLyA9PiAzXG4gKlxuICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiAwXG4gKlxuICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZVxuICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy5rZXlzKCdoaScpO1xuICogLy8gPT4gWycwJywgJzEnXVxuICovXG5mdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy52YWx1ZXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbMSwgMl0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiBfLnZhbHVlcygnaGknKTtcbiAqIC8vID0+IFsnaCcsICdpJ11cbiAqL1xuZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0ID8gYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSkgOiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbmNsdWRlcztcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggMy4wLjMgKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCAyMDEyLTIwMTYgVGhlIERvam8gRm91bmRhdGlvbiA8aHR0cDovL2Rvam9mb3VuZGF0aW9uLm9yZy8+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IDIwMDktMjAxNiBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICogQXZhaWxhYmxlIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqL1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYm9vbGVhbiBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQm9vbGVhbihmYWxzZSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Jvb2xlYW4obnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IGJvb2xUYWcpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNCb29sZWFuO1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMCxcbiAgICBNQVhfSU5URUdFUiA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4LFxuICAgIE5BTiA9IDAgLyAwO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAqIFtgTnVtYmVyLmlzSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc0ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0ludGVnZXIoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNJbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0ludGVnZXIoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09IHRvSW50ZWdlcih2YWx1ZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNJbnRlZ2VyO1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCAzLjAuMyAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IDIwMTItMjAxNiBUaGUgRG9qbyBGb3VuZGF0aW9uIDxodHRwOi8vZG9qb2ZvdW5kYXRpb24ub3JnLz5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgMjAwOS0yMDE2IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKiBBdmFpbGFibGUgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICovXG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTnVtYmVyYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqICoqTm90ZToqKiBUbyBleGNsdWRlIGBJbmZpbml0eWAsIGAtSW5maW5pdHlgLCBhbmQgYE5hTmAsIHdoaWNoIGFyZSBjbGFzc2lmaWVkXG4gKiBhcyBudW1iZXJzLCB1c2UgdGhlIGBfLmlzRmluaXRlYCBtZXRob2QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNOdW1iZXIoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTnVtYmVyKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gbnVtYmVyVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc051bWJlcjtcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0IGluIElFIDwgOS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSG9zdE9iamVjdCh2YWx1ZSkge1xuICAvLyBNYW55IGhvc3Qgb2JqZWN0cyBhcmUgYE9iamVjdGAgb2JqZWN0cyB0aGF0IGNhbiBjb2VyY2UgdG8gc3RyaW5nc1xuICAvLyBkZXNwaXRlIGhhdmluZyBpbXByb3Blcmx5IGRlZmluZWQgYHRvU3RyaW5nYCBtZXRob2RzLlxuICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9ICEhKHZhbHVlICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC44LjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqIH1cbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8XG4gICAgICBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSAhPSBvYmplY3RUYWcgfHwgaXNIb3N0T2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiZcbiAgICBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJiBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1BsYWluT2JqZWN0O1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCA0LjAuMSAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IDIwMTItMjAxNiBUaGUgRG9qbyBGb3VuZGF0aW9uIDxodHRwOi8vZG9qb2ZvdW5kYXRpb24ub3JnLz5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgMjAwOS0yMDE2IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKiBBdmFpbGFibGUgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICovXG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAdHlwZSBGdW5jdGlvblxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3RyaW5nKDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaW5nO1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzXG4gKiBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hpbGUgaXQncyBjYWxsZWQgbGVzcyB0aGFuIGBuYCB0aW1lcy4gU3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGF0IHdoaWNoIGBmdW5jYCBpcyBubyBsb25nZXIgaW52b2tlZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uYmVmb3JlKDUsIGFkZENvbnRhY3RUb0xpc3QpKTtcbiAqIC8vID0+IEFsbG93cyBhZGRpbmcgdXAgdG8gNCBjb250YWN0cyB0byB0aGUgbGlzdC5cbiAqL1xuZnVuY3Rpb24gYmVmb3JlKG4sIGZ1bmMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgbiA9IHRvSW50ZWdlcihuKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGlmICgtLW4gPiAwKSB7XG4gICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICAgIGlmIChuIDw9IDEpIHtcbiAgICAgIGZ1bmMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBpbnZva2luZyBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzXG4gKiB0byB0aGUgZnVuY3Rpb24gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbi4gVGhlIGBmdW5jYCBpc1xuICogaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgaW5pdGlhbGl6ZSA9IF8ub25jZShjcmVhdGVBcHBsaWNhdGlvbik7XG4gKiBpbml0aWFsaXplKCk7XG4gKiBpbml0aWFsaXplKCk7XG4gKiAvLyA9PiBgY3JlYXRlQXBwbGljYXRpb25gIGlzIGludm9rZWQgb25jZVxuICovXG5mdW5jdGlvbiBvbmNlKGZ1bmMpIHtcbiAgcmV0dXJuIGJlZm9yZSgyLCBmdW5jKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9JbnRlZ2VyKDMuMik7XG4gKiAvLyA9PiAzXG4gKlxuICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiAwXG4gKlxuICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvbmNlO1xuIiwKICAgICJjb25zdCB0aW1lc3BhbiA9IHJlcXVpcmUoJy4vbGliL3RpbWVzcGFuJyk7XG5jb25zdCBQU19TVVBQT1JURUQgPSByZXF1aXJlKCcuL2xpYi9wc1N1cHBvcnRlZCcpO1xuY29uc3QgdmFsaWRhdGVBc3ltbWV0cmljS2V5ID0gcmVxdWlyZSgnLi9saWIvdmFsaWRhdGVBc3ltbWV0cmljS2V5Jyk7XG5jb25zdCBqd3MgPSByZXF1aXJlKCdqd3MnKTtcbmNvbnN0IGluY2x1ZGVzID0gcmVxdWlyZSgnbG9kYXNoLmluY2x1ZGVzJyk7XG5jb25zdCBpc0Jvb2xlYW4gPSByZXF1aXJlKCdsb2Rhc2guaXNib29sZWFuJyk7XG5jb25zdCBpc0ludGVnZXIgPSByZXF1aXJlKCdsb2Rhc2guaXNpbnRlZ2VyJyk7XG5jb25zdCBpc051bWJlciA9IHJlcXVpcmUoJ2xvZGFzaC5pc251bWJlcicpO1xuY29uc3QgaXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJ2xvZGFzaC5pc3BsYWlub2JqZWN0Jyk7XG5jb25zdCBpc1N0cmluZyA9IHJlcXVpcmUoJ2xvZGFzaC5pc3N0cmluZycpO1xuY29uc3Qgb25jZSA9IHJlcXVpcmUoJ2xvZGFzaC5vbmNlJyk7XG5jb25zdCB7IEtleU9iamVjdCwgY3JlYXRlU2VjcmV0S2V5LCBjcmVhdGVQcml2YXRlS2V5IH0gPSByZXF1aXJlKCdjcnlwdG8nKVxuXG5jb25zdCBTVVBQT1JURURfQUxHUyA9IFsnUlMyNTYnLCAnUlMzODQnLCAnUlM1MTInLCAnRVMyNTYnLCAnRVMzODQnLCAnRVM1MTInLCAnSFMyNTYnLCAnSFMzODQnLCAnSFM1MTInLCAnbm9uZSddO1xuaWYgKFBTX1NVUFBPUlRFRCkge1xuICBTVVBQT1JURURfQUxHUy5zcGxpY2UoMywgMCwgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJyk7XG59XG5cbmNvbnN0IHNpZ25fb3B0aW9uc19zY2hlbWEgPSB7XG4gIGV4cGlyZXNJbjogeyBpc1ZhbGlkOiBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSB8fCAoaXNTdHJpbmcodmFsdWUpICYmIHZhbHVlKTsgfSwgbWVzc2FnZTogJ1wiZXhwaXJlc0luXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMgb3Igc3RyaW5nIHJlcHJlc2VudGluZyBhIHRpbWVzcGFuJyB9LFxuICBub3RCZWZvcmU6IHsgaXNWYWxpZDogZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIGlzSW50ZWdlcih2YWx1ZSkgfHwgKGlzU3RyaW5nKHZhbHVlKSAmJiB2YWx1ZSk7IH0sIG1lc3NhZ2U6ICdcIm5vdEJlZm9yZVwiIHNob3VsZCBiZSBhIG51bWJlciBvZiBzZWNvbmRzIG9yIHN0cmluZyByZXByZXNlbnRpbmcgYSB0aW1lc3BhbicgfSxcbiAgYXVkaWVuY2U6IHsgaXNWYWxpZDogZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIGlzU3RyaW5nKHZhbHVlKSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKTsgfSwgbWVzc2FnZTogJ1wiYXVkaWVuY2VcIiBtdXN0IGJlIGEgc3RyaW5nIG9yIGFycmF5JyB9LFxuICBhbGdvcml0aG06IHsgaXNWYWxpZDogaW5jbHVkZXMuYmluZChudWxsLCBTVVBQT1JURURfQUxHUyksIG1lc3NhZ2U6ICdcImFsZ29yaXRobVwiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW51bSB2YWx1ZScgfSxcbiAgaGVhZGVyOiB7IGlzVmFsaWQ6IGlzUGxhaW5PYmplY3QsIG1lc3NhZ2U6ICdcImhlYWRlclwiIG11c3QgYmUgYW4gb2JqZWN0JyB9LFxuICBlbmNvZGluZzogeyBpc1ZhbGlkOiBpc1N0cmluZywgbWVzc2FnZTogJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBpc3N1ZXI6IHsgaXNWYWxpZDogaXNTdHJpbmcsIG1lc3NhZ2U6ICdcImlzc3VlclwiIG11c3QgYmUgYSBzdHJpbmcnIH0sXG4gIHN1YmplY3Q6IHsgaXNWYWxpZDogaXNTdHJpbmcsIG1lc3NhZ2U6ICdcInN1YmplY3RcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBqd3RpZDogeyBpc1ZhbGlkOiBpc1N0cmluZywgbWVzc2FnZTogJ1wiand0aWRcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBub1RpbWVzdGFtcDogeyBpc1ZhbGlkOiBpc0Jvb2xlYW4sIG1lc3NhZ2U6ICdcIm5vVGltZXN0YW1wXCIgbXVzdCBiZSBhIGJvb2xlYW4nIH0sXG4gIGtleWlkOiB7IGlzVmFsaWQ6IGlzU3RyaW5nLCBtZXNzYWdlOiAnXCJrZXlpZFwiIG11c3QgYmUgYSBzdHJpbmcnIH0sXG4gIG11dGF0ZVBheWxvYWQ6IHsgaXNWYWxpZDogaXNCb29sZWFuLCBtZXNzYWdlOiAnXCJtdXRhdGVQYXlsb2FkXCIgbXVzdCBiZSBhIGJvb2xlYW4nIH0sXG4gIGFsbG93SW5zZWN1cmVLZXlTaXplczogeyBpc1ZhbGlkOiBpc0Jvb2xlYW4sIG1lc3NhZ2U6ICdcImFsbG93SW5zZWN1cmVLZXlTaXplc1wiIG11c3QgYmUgYSBib29sZWFuJ30sXG4gIGFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlczogeyBpc1ZhbGlkOiBpc0Jvb2xlYW4sIG1lc3NhZ2U6ICdcImFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlc1wiIG11c3QgYmUgYSBib29sZWFuJ31cbn07XG5cbmNvbnN0IHJlZ2lzdGVyZWRfY2xhaW1zX3NjaGVtYSA9IHtcbiAgaWF0OiB7IGlzVmFsaWQ6IGlzTnVtYmVyLCBtZXNzYWdlOiAnXCJpYXRcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcycgfSxcbiAgZXhwOiB7IGlzVmFsaWQ6IGlzTnVtYmVyLCBtZXNzYWdlOiAnXCJleHBcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcycgfSxcbiAgbmJmOiB7IGlzVmFsaWQ6IGlzTnVtYmVyLCBtZXNzYWdlOiAnXCJuYmZcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcycgfVxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGUoc2NoZW1hLCBhbGxvd1Vua25vd24sIG9iamVjdCwgcGFyYW1ldGVyTmFtZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3Qob2JqZWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgXCInICsgcGFyYW1ldGVyTmFtZSArICdcIiB0byBiZSBhIHBsYWluIG9iamVjdC4nKTtcbiAgfVxuICBPYmplY3Qua2V5cyhvYmplY3QpXG4gICAgLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSBzY2hlbWFba2V5XTtcbiAgICAgIGlmICghdmFsaWRhdG9yKSB7XG4gICAgICAgIGlmICghYWxsb3dVbmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBrZXkgKyAnXCIgaXMgbm90IGFsbG93ZWQgaW4gXCInICsgcGFyYW1ldGVyTmFtZSArICdcIicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghdmFsaWRhdG9yLmlzVmFsaWQob2JqZWN0W2tleV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih2YWxpZGF0b3IubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKSB7XG4gIHJldHVybiB2YWxpZGF0ZShzaWduX29wdGlvbnNfc2NoZW1hLCBmYWxzZSwgb3B0aW9ucywgJ29wdGlvbnMnKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQYXlsb2FkKHBheWxvYWQpIHtcbiAgcmV0dXJuIHZhbGlkYXRlKHJlZ2lzdGVyZWRfY2xhaW1zX3NjaGVtYSwgdHJ1ZSwgcGF5bG9hZCwgJ3BheWxvYWQnKTtcbn1cblxuY29uc3Qgb3B0aW9uc190b19wYXlsb2FkID0ge1xuICAnYXVkaWVuY2UnOiAnYXVkJyxcbiAgJ2lzc3Vlcic6ICdpc3MnLFxuICAnc3ViamVjdCc6ICdzdWInLFxuICAnand0aWQnOiAnanRpJ1xufTtcblxuY29uc3Qgb3B0aW9uc19mb3Jfb2JqZWN0cyA9IFtcbiAgJ2V4cGlyZXNJbicsXG4gICdub3RCZWZvcmUnLFxuICAnbm9UaW1lc3RhbXAnLFxuICAnYXVkaWVuY2UnLFxuICAnaXNzdWVyJyxcbiAgJ3N1YmplY3QnLFxuICAnand0aWQnLFxuXTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocGF5bG9hZCwgc2VjcmV0T3JQcml2YXRlS2V5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB9XG5cbiAgY29uc3QgaXNPYmplY3RQYXlsb2FkID0gdHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhQnVmZmVyLmlzQnVmZmVyKHBheWxvYWQpO1xuXG4gIGNvbnN0IGhlYWRlciA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGFsZzogb3B0aW9ucy5hbGdvcml0aG0gfHwgJ0hTMjU2JyxcbiAgICB0eXA6IGlzT2JqZWN0UGF5bG9hZCA/ICdKV1QnIDogdW5kZWZpbmVkLFxuICAgIGtpZDogb3B0aW9ucy5rZXlpZFxuICB9LCBvcHRpb25zLmhlYWRlcik7XG5cbiAgZnVuY3Rpb24gZmFpbHVyZShlcnIpIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBpZiAoIXNlY3JldE9yUHJpdmF0ZUtleSAmJiBvcHRpb25zLmFsZ29yaXRobSAhPT0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdzZWNyZXRPclByaXZhdGVLZXkgbXVzdCBoYXZlIGEgdmFsdWUnKSk7XG4gIH1cblxuICBpZiAoc2VjcmV0T3JQcml2YXRlS2V5ICE9IG51bGwgJiYgIShzZWNyZXRPclByaXZhdGVLZXkgaW5zdGFuY2VvZiBLZXlPYmplY3QpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHNlY3JldE9yUHJpdmF0ZUtleSA9IGNyZWF0ZVByaXZhdGVLZXkoc2VjcmV0T3JQcml2YXRlS2V5KVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlY3JldE9yUHJpdmF0ZUtleSA9IGNyZWF0ZVNlY3JldEtleSh0eXBlb2Ygc2VjcmV0T3JQcml2YXRlS2V5ID09PSAnc3RyaW5nJyA/IEJ1ZmZlci5mcm9tKHNlY3JldE9yUHJpdmF0ZUtleSkgOiBzZWNyZXRPclByaXZhdGVLZXkpXG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignc2VjcmV0T3JQcml2YXRlS2V5IGlzIG5vdCB2YWxpZCBrZXkgbWF0ZXJpYWwnKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGhlYWRlci5hbGcuc3RhcnRzV2l0aCgnSFMnKSAmJiBzZWNyZXRPclByaXZhdGVLZXkudHlwZSAhPT0gJ3NlY3JldCcpIHtcbiAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoKGBzZWNyZXRPclByaXZhdGVLZXkgbXVzdCBiZSBhIHN5bW1ldHJpYyBrZXkgd2hlbiB1c2luZyAke2hlYWRlci5hbGd9YCkpKVxuICB9IGVsc2UgaWYgKC9eKD86UlN8UFN8RVMpLy50ZXN0KGhlYWRlci5hbGcpKSB7XG4gICAgaWYgKHNlY3JldE9yUHJpdmF0ZUtleS50eXBlICE9PSAncHJpdmF0ZScpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcigoYHNlY3JldE9yUHJpdmF0ZUtleSBtdXN0IGJlIGFuIGFzeW1tZXRyaWMga2V5IHdoZW4gdXNpbmcgJHtoZWFkZXIuYWxnfWApKSlcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmFsbG93SW5zZWN1cmVLZXlTaXplcyAmJlxuICAgICAgIWhlYWRlci5hbGcuc3RhcnRzV2l0aCgnRVMnKSAmJlxuICAgICAgc2VjcmV0T3JQcml2YXRlS2V5LmFzeW1tZXRyaWNLZXlEZXRhaWxzICE9PSB1bmRlZmluZWQgJiYgLy9LZXlPYmplY3QuYXN5bW1ldHJpY0tleURldGFpbHMgaXMgc3VwcG9ydGVkIGluIE5vZGUgMTUrXG4gICAgICBzZWNyZXRPclByaXZhdGVLZXkuYXN5bW1ldHJpY0tleURldGFpbHMubW9kdWx1c0xlbmd0aCA8IDIwNDgpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcihgc2VjcmV0T3JQcml2YXRlS2V5IGhhcyBhIG1pbmltdW0ga2V5IHNpemUgb2YgMjA0OCBiaXRzIGZvciAke2hlYWRlci5hbGd9YCkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ3BheWxvYWQgaXMgcmVxdWlyZWQnKSk7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3RQYXlsb2FkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlUGF5bG9hZChwYXlsb2FkKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShlcnJvcik7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5tdXRhdGVQYXlsb2FkKSB7XG4gICAgICBwYXlsb2FkID0gT2JqZWN0LmFzc2lnbih7fSxwYXlsb2FkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaW52YWxpZF9vcHRpb25zID0gb3B0aW9uc19mb3Jfb2JqZWN0cy5maWx0ZXIoZnVuY3Rpb24gKG9wdCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvcHRpb25zW29wdF0gIT09ICd1bmRlZmluZWQnO1xuICAgIH0pO1xuXG4gICAgaWYgKGludmFsaWRfb3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ2ludmFsaWQgJyArIGludmFsaWRfb3B0aW9ucy5qb2luKCcsJykgKyAnIG9wdGlvbiBmb3IgJyArICh0eXBlb2YgcGF5bG9hZCApICsgJyBwYXlsb2FkJykpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF5bG9hZC5leHAgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmV4cGlyZXNJbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ0JhZCBcIm9wdGlvbnMuZXhwaXJlc0luXCIgb3B0aW9uIHRoZSBwYXlsb2FkIGFscmVhZHkgaGFzIGFuIFwiZXhwXCIgcHJvcGVydHkuJykpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwYXlsb2FkLm5iZiAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMubm90QmVmb3JlICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignQmFkIFwib3B0aW9ucy5ub3RCZWZvcmVcIiBvcHRpb24gdGhlIHBheWxvYWQgYWxyZWFkeSBoYXMgYW4gXCJuYmZcIiBwcm9wZXJ0eS4nKSk7XG4gIH1cblxuICB0cnkge1xuICAgIHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFpbHVyZShlcnJvcik7XG4gIH1cblxuICBpZiAoIW9wdGlvbnMuYWxsb3dJbnZhbGlkQXN5bW1ldHJpY0tleVR5cGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlQXN5bW1ldHJpY0tleShoZWFkZXIuYWxnLCBzZWNyZXRPclByaXZhdGVLZXkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdGltZXN0YW1wID0gcGF5bG9hZC5pYXQgfHwgTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbiAgaWYgKG9wdGlvbnMubm9UaW1lc3RhbXApIHtcbiAgICBkZWxldGUgcGF5bG9hZC5pYXQ7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3RQYXlsb2FkKSB7XG4gICAgcGF5bG9hZC5pYXQgPSB0aW1lc3RhbXA7XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMubm90QmVmb3JlICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRyeSB7XG4gICAgICBwYXlsb2FkLm5iZiA9IHRpbWVzcGFuKG9wdGlvbnMubm90QmVmb3JlLCB0aW1lc3RhbXApO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShlcnIpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBheWxvYWQubmJmID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdcIm5vdEJlZm9yZVwiIHNob3VsZCBiZSBhIG51bWJlciBvZiBzZWNvbmRzIG9yIHN0cmluZyByZXByZXNlbnRpbmcgYSB0aW1lc3BhbiBlZzogXCIxZFwiLCBcIjIwaFwiLCA2MCcpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMuZXhwaXJlc0luICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcpIHtcbiAgICB0cnkge1xuICAgICAgcGF5bG9hZC5leHAgPSB0aW1lc3BhbihvcHRpb25zLmV4cGlyZXNJbiwgdGltZXN0YW1wKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIGZhaWx1cmUoZXJyKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkLmV4cCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignXCJleHBpcmVzSW5cIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcyBvciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgdGltZXNwYW4gZWc6IFwiMWRcIiwgXCIyMGhcIiwgNjAnKSk7XG4gICAgfVxuICB9XG5cbiAgT2JqZWN0LmtleXMob3B0aW9uc190b19wYXlsb2FkKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBjb25zdCBjbGFpbSA9IG9wdGlvbnNfdG9fcGF5bG9hZFtrZXldO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uc1trZXldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkW2NsYWltXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdCYWQgXCJvcHRpb25zLicgKyBrZXkgKyAnXCIgb3B0aW9uLiBUaGUgcGF5bG9hZCBhbHJlYWR5IGhhcyBhbiBcIicgKyBjbGFpbSArICdcIiBwcm9wZXJ0eS4nKSk7XG4gICAgICB9XG4gICAgICBwYXlsb2FkW2NsYWltXSA9IG9wdGlvbnNba2V5XTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgJiYgb25jZShjYWxsYmFjayk7XG5cbiAgICBqd3MuY3JlYXRlU2lnbih7XG4gICAgICBoZWFkZXI6IGhlYWRlcixcbiAgICAgIHByaXZhdGVLZXk6IHNlY3JldE9yUHJpdmF0ZUtleSxcbiAgICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgICBlbmNvZGluZzogZW5jb2RpbmdcbiAgICB9KS5vbmNlKCdlcnJvcicsIGNhbGxiYWNrKVxuICAgICAgLm9uY2UoJ2RvbmUnLCBmdW5jdGlvbiAoc2lnbmF0dXJlKSB7XG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBpbiBmYXZvciBvZiB0aGUgbW9kdWx1cyBsZW5ndGggY2hlY2sgYmVmb3JlIHNpZ25pbmcgb25jZSBub2RlIDE1KyBpcyB0aGUgbWluaW11bSBzdXBwb3J0ZWQgdmVyc2lvblxuICAgICAgICBpZighb3B0aW9ucy5hbGxvd0luc2VjdXJlS2V5U2l6ZXMgJiYgL14oPzpSU3xQUykvLnRlc3QoaGVhZGVyLmFsZykgJiYgc2lnbmF0dXJlLmxlbmd0aCA8IDI1Nikge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYHNlY3JldE9yUHJpdmF0ZUtleSBoYXMgYSBtaW5pbXVtIGtleSBzaXplIG9mIDIwNDggYml0cyBmb3IgJHtoZWFkZXIuYWxnfWApKVxuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHNpZ25hdHVyZSk7XG4gICAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgc2lnbmF0dXJlID0gandzLnNpZ24oe2hlYWRlcjogaGVhZGVyLCBwYXlsb2FkOiBwYXlsb2FkLCBzZWNyZXQ6IHNlY3JldE9yUHJpdmF0ZUtleSwgZW5jb2Rpbmc6IGVuY29kaW5nfSk7XG4gICAgLy8gVE9ETzogUmVtb3ZlIGluIGZhdm9yIG9mIHRoZSBtb2R1bHVzIGxlbmd0aCBjaGVjayBiZWZvcmUgc2lnbmluZyBvbmNlIG5vZGUgMTUrIGlzIHRoZSBtaW5pbXVtIHN1cHBvcnRlZCB2ZXJzaW9uXG4gICAgaWYoIW9wdGlvbnMuYWxsb3dJbnNlY3VyZUtleVNpemVzICYmIC9eKD86UlN8UFMpLy50ZXN0KGhlYWRlci5hbGcpICYmIHNpZ25hdHVyZS5sZW5ndGggPCAyNTYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgc2VjcmV0T3JQcml2YXRlS2V5IGhhcyBhIG1pbmltdW0ga2V5IHNpemUgb2YgMjA0OCBiaXRzIGZvciAke2hlYWRlci5hbGd9YClcbiAgICB9XG4gICAgcmV0dXJuIHNpZ25hdHVyZVxuICB9XG59O1xuIiwKICAgICJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgZGVjb2RlOiByZXF1aXJlKCcuL2RlY29kZScpLFxuICB2ZXJpZnk6IHJlcXVpcmUoJy4vdmVyaWZ5JyksXG4gIHNpZ246IHJlcXVpcmUoJy4vc2lnbicpLFxuICBKc29uV2ViVG9rZW5FcnJvcjogcmVxdWlyZSgnLi9saWIvSnNvbldlYlRva2VuRXJyb3InKSxcbiAgTm90QmVmb3JlRXJyb3I6IHJlcXVpcmUoJy4vbGliL05vdEJlZm9yZUVycm9yJyksXG4gIFRva2VuRXhwaXJlZEVycm9yOiByZXF1aXJlKCcuL2xpYi9Ub2tlbkV4cGlyZWRFcnJvcicpLFxufTtcbiIsCiAgICAiKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIFV0aWxzXG4gIGZ1bmN0aW9uIGFzc2VydCAodmFsLCBtc2cpIHtcbiAgICBpZiAoIXZhbCkgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCAnQXNzZXJ0aW9uIGZhaWxlZCcpO1xuICB9XG5cbiAgLy8gQ291bGQgdXNlIGBpbmhlcml0c2AgbW9kdWxlLCBidXQgZG9uJ3Qgd2FudCB0byBtb3ZlIGZyb20gc2luZ2xlIGZpbGVcbiAgLy8gYXJjaGl0ZWN0dXJlIHlldC5cbiAgZnVuY3Rpb24gaW5oZXJpdHMgKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yO1xuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGU7XG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKTtcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7XG4gIH1cblxuICAvLyBCTlxuXG4gIGZ1bmN0aW9uIEJOIChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIGlmIChCTi5pc0JOKG51bWJlcikpIHtcbiAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuXG4gICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgdGhpcy53b3JkcyA9IG51bGw7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuXG4gICAgLy8gUmVkdWN0aW9uIGNvbnRleHRcbiAgICB0aGlzLnJlZCA9IG51bGw7XG5cbiAgICBpZiAobnVtYmVyICE9PSBudWxsKSB7XG4gICAgICBpZiAoYmFzZSA9PT0gJ2xlJyB8fCBiYXNlID09PSAnYmUnKSB7XG4gICAgICAgIGVuZGlhbiA9IGJhc2U7XG4gICAgICAgIGJhc2UgPSAxMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faW5pdChudW1iZXIgfHwgMCwgYmFzZSB8fCAxMCwgZW5kaWFuIHx8ICdiZScpO1xuICAgIH1cbiAgfVxuICBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEJOO1xuICB9IGVsc2Uge1xuICAgIGV4cG9ydHMuQk4gPSBCTjtcbiAgfVxuXG4gIEJOLkJOID0gQk47XG4gIEJOLndvcmRTaXplID0gMjY7XG5cbiAgdmFyIEJ1ZmZlcjtcbiAgdHJ5IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5CdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBCdWZmZXIgPSB3aW5kb3cuQnVmZmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gIH1cblxuICBCTi5pc0JOID0gZnVuY3Rpb24gaXNCTiAobnVtKSB7XG4gICAgaWYgKG51bSBpbnN0YW5jZW9mIEJOKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVtICE9PSBudWxsICYmIHR5cGVvZiBudW0gPT09ICdvYmplY3QnICYmXG4gICAgICBudW0uY29uc3RydWN0b3Iud29yZFNpemUgPT09IEJOLndvcmRTaXplICYmIEFycmF5LmlzQXJyYXkobnVtLndvcmRzKTtcbiAgfTtcblxuICBCTi5tYXggPSBmdW5jdGlvbiBtYXggKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKGxlZnQuY21wKHJpZ2h0KSA+IDApIHJldHVybiBsZWZ0O1xuICAgIHJldHVybiByaWdodDtcbiAgfTtcblxuICBCTi5taW4gPSBmdW5jdGlvbiBtaW4gKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKGxlZnQuY21wKHJpZ2h0KSA8IDApIHJldHVybiBsZWZ0O1xuICAgIHJldHVybiByaWdodDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0IChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIGlmICh0eXBlb2YgbnVtYmVyID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHRoaXMuX2luaXROdW1iZXIobnVtYmVyLCBiYXNlLCBlbmRpYW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbnVtYmVyID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuX2luaXRBcnJheShudW1iZXIsIGJhc2UsIGVuZGlhbik7XG4gICAgfVxuXG4gICAgaWYgKGJhc2UgPT09ICdoZXgnKSB7XG4gICAgICBiYXNlID0gMTY7XG4gICAgfVxuICAgIGFzc2VydChiYXNlID09PSAoYmFzZSB8IDApICYmIGJhc2UgPj0gMiAmJiBiYXNlIDw9IDM2KTtcblxuICAgIG51bWJlciA9IG51bWJlci50b1N0cmluZygpLnJlcGxhY2UoL1xccysvZywgJycpO1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgaWYgKG51bWJlclswXSA9PT0gJy0nKSB7XG4gICAgICBzdGFydCsrO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0IDwgbnVtYmVyLmxlbmd0aCkge1xuICAgICAgaWYgKGJhc2UgPT09IDE2KSB7XG4gICAgICAgIHRoaXMuX3BhcnNlSGV4KG51bWJlciwgc3RhcnQsIGVuZGlhbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9wYXJzZUJhc2UobnVtYmVyLCBiYXNlLCBzdGFydCk7XG4gICAgICAgIGlmIChlbmRpYW4gPT09ICdsZScpIHtcbiAgICAgICAgICB0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksIGJhc2UsIGVuZGlhbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0TnVtYmVyID0gZnVuY3Rpb24gX2luaXROdW1iZXIgKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgbnVtYmVyID0gLW51bWJlcjtcbiAgICB9XG4gICAgaWYgKG51bWJlciA8IDB4NDAwMDAwMCkge1xuICAgICAgdGhpcy53b3JkcyA9IFsgbnVtYmVyICYgMHgzZmZmZmZmIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgfSBlbHNlIGlmIChudW1iZXIgPCAweDEwMDAwMDAwMDAwMDAwKSB7XG4gICAgICB0aGlzLndvcmRzID0gW1xuICAgICAgICBudW1iZXIgJiAweDNmZmZmZmYsXG4gICAgICAgIChudW1iZXIgLyAweDQwMDAwMDApICYgMHgzZmZmZmZmXG4gICAgICBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQobnVtYmVyIDwgMHgyMDAwMDAwMDAwMDAwMCk7IC8vIDIgXiA1MyAodW5zYWZlKVxuICAgICAgdGhpcy53b3JkcyA9IFtcbiAgICAgICAgbnVtYmVyICYgMHgzZmZmZmZmLFxuICAgICAgICAobnVtYmVyIC8gMHg0MDAwMDAwKSAmIDB4M2ZmZmZmZixcbiAgICAgICAgMVxuICAgICAgXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMztcbiAgICB9XG5cbiAgICBpZiAoZW5kaWFuICE9PSAnbGUnKSByZXR1cm47XG5cbiAgICAvLyBSZXZlcnNlIHRoZSBieXRlc1xuICAgIHRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSwgYmFzZSwgZW5kaWFuKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2luaXRBcnJheSA9IGZ1bmN0aW9uIF9pbml0QXJyYXkgKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgLy8gUGVyaGFwcyBhIFVpbnQ4QXJyYXlcbiAgICBhc3NlcnQodHlwZW9mIG51bWJlci5sZW5ndGggPT09ICdudW1iZXInKTtcbiAgICBpZiAobnVtYmVyLmxlbmd0aCA8PSAwKSB7XG4gICAgICB0aGlzLndvcmRzID0gWyAwIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbChudW1iZXIubGVuZ3RoIC8gMyk7XG4gICAgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gMDtcbiAgICB9XG5cbiAgICB2YXIgaiwgdztcbiAgICB2YXIgb2ZmID0gMDtcbiAgICBpZiAoZW5kaWFuID09PSAnYmUnKSB7XG4gICAgICBmb3IgKGkgPSBudW1iZXIubGVuZ3RoIC0gMSwgaiA9IDA7IGkgPj0gMDsgaSAtPSAzKSB7XG4gICAgICAgIHcgPSBudW1iZXJbaV0gfCAobnVtYmVyW2kgLSAxXSA8PCA4KSB8IChudW1iZXJbaSAtIDJdIDw8IDE2KTtcbiAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSAodyA8PCBvZmYpICYgMHgzZmZmZmZmO1xuICAgICAgICB0aGlzLndvcmRzW2ogKyAxXSA9ICh3ID4+PiAoMjYgLSBvZmYpKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgb2ZmICs9IDI0O1xuICAgICAgICBpZiAob2ZmID49IDI2KSB7XG4gICAgICAgICAgb2ZmIC09IDI2O1xuICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5kaWFuID09PSAnbGUnKSB7XG4gICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IG51bWJlci5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICB3ID0gbnVtYmVyW2ldIHwgKG51bWJlcltpICsgMV0gPDwgOCkgfCAobnVtYmVyW2kgKyAyXSA8PCAxNik7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gKHcgPDwgb2ZmKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgdGhpcy53b3Jkc1tqICsgMV0gPSAodyA+Pj4gKDI2IC0gb2ZmKSkgJiAweDNmZmZmZmY7XG4gICAgICAgIG9mZiArPSAyNDtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBmdW5jdGlvbiBwYXJzZUhleDRCaXRzIChzdHJpbmcsIGluZGV4KSB7XG4gICAgdmFyIGMgPSBzdHJpbmcuY2hhckNvZGVBdChpbmRleCk7XG4gICAgLy8gJ0EnIC0gJ0YnXG4gICAgaWYgKGMgPj0gNjUgJiYgYyA8PSA3MCkge1xuICAgICAgcmV0dXJuIGMgLSA1NTtcbiAgICAvLyAnYScgLSAnZidcbiAgICB9IGVsc2UgaWYgKGMgPj0gOTcgJiYgYyA8PSAxMDIpIHtcbiAgICAgIHJldHVybiBjIC0gODc7XG4gICAgLy8gJzAnIC0gJzknXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoYyAtIDQ4KSAmIDB4ZjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUhleEJ5dGUgKHN0cmluZywgbG93ZXJCb3VuZCwgaW5kZXgpIHtcbiAgICB2YXIgciA9IHBhcnNlSGV4NEJpdHMoc3RyaW5nLCBpbmRleCk7XG4gICAgaWYgKGluZGV4IC0gMSA+PSBsb3dlckJvdW5kKSB7XG4gICAgICByIHw9IHBhcnNlSGV4NEJpdHMoc3RyaW5nLCBpbmRleCAtIDEpIDw8IDQ7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl9wYXJzZUhleCA9IGZ1bmN0aW9uIF9wYXJzZUhleCAobnVtYmVyLCBzdGFydCwgZW5kaWFuKSB7XG4gICAgLy8gQ3JlYXRlIHBvc3NpYmx5IGJpZ2dlciBhcnJheSB0byBlbnN1cmUgdGhhdCBpdCBmaXRzIHRoZSBudW1iZXJcbiAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbCgobnVtYmVyLmxlbmd0aCAtIHN0YXJ0KSAvIDYpO1xuICAgIHRoaXMud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IDA7XG4gICAgfVxuXG4gICAgLy8gMjQtYml0cyBjaHVua3NcbiAgICB2YXIgb2ZmID0gMDtcbiAgICB2YXIgaiA9IDA7XG5cbiAgICB2YXIgdztcbiAgICBpZiAoZW5kaWFuID09PSAnYmUnKSB7XG4gICAgICBmb3IgKGkgPSBudW1iZXIubGVuZ3RoIC0gMTsgaSA+PSBzdGFydDsgaSAtPSAyKSB7XG4gICAgICAgIHcgPSBwYXJzZUhleEJ5dGUobnVtYmVyLCBzdGFydCwgaSkgPDwgb2ZmO1xuICAgICAgICB0aGlzLndvcmRzW2pdIHw9IHcgJiAweDNmZmZmZmY7XG4gICAgICAgIGlmIChvZmYgPj0gMTgpIHtcbiAgICAgICAgICBvZmYgLT0gMTg7XG4gICAgICAgICAgaiArPSAxO1xuICAgICAgICAgIHRoaXMud29yZHNbal0gfD0gdyA+Pj4gMjY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2ZmICs9IDg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHBhcnNlTGVuZ3RoID0gbnVtYmVyLmxlbmd0aCAtIHN0YXJ0O1xuICAgICAgZm9yIChpID0gcGFyc2VMZW5ndGggJSAyID09PSAwID8gc3RhcnQgKyAxIDogc3RhcnQ7IGkgPCBudW1iZXIubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgdyA9IHBhcnNlSGV4Qnl0ZShudW1iZXIsIHN0YXJ0LCBpKSA8PCBvZmY7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gdyAmIDB4M2ZmZmZmZjtcbiAgICAgICAgaWYgKG9mZiA+PSAxOCkge1xuICAgICAgICAgIG9mZiAtPSAxODtcbiAgICAgICAgICBqICs9IDE7XG4gICAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSB3ID4+PiAyNjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmYgKz0gODtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBmdW5jdGlvbiBwYXJzZUJhc2UgKHN0ciwgc3RhcnQsIGVuZCwgbXVsKSB7XG4gICAgdmFyIHIgPSAwO1xuICAgIHZhciBsZW4gPSBNYXRoLm1pbihzdHIubGVuZ3RoLCBlbmQpO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgYyA9IHN0ci5jaGFyQ29kZUF0KGkpIC0gNDg7XG5cbiAgICAgIHIgKj0gbXVsO1xuXG4gICAgICAvLyAnYSdcbiAgICAgIGlmIChjID49IDQ5KSB7XG4gICAgICAgIHIgKz0gYyAtIDQ5ICsgMHhhO1xuXG4gICAgICAvLyAnQSdcbiAgICAgIH0gZWxzZSBpZiAoYyA+PSAxNykge1xuICAgICAgICByICs9IGMgLSAxNyArIDB4YTtcblxuICAgICAgLy8gJzAnIC0gJzknXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByICs9IGM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl9wYXJzZUJhc2UgPSBmdW5jdGlvbiBfcGFyc2VCYXNlIChudW1iZXIsIGJhc2UsIHN0YXJ0KSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBhcyB6ZXJvXG4gICAgdGhpcy53b3JkcyA9IFsgMCBdO1xuICAgIHRoaXMubGVuZ3RoID0gMTtcblxuICAgIC8vIEZpbmQgbGVuZ3RoIG9mIGxpbWIgaW4gYmFzZVxuICAgIGZvciAodmFyIGxpbWJMZW4gPSAwLCBsaW1iUG93ID0gMTsgbGltYlBvdyA8PSAweDNmZmZmZmY7IGxpbWJQb3cgKj0gYmFzZSkge1xuICAgICAgbGltYkxlbisrO1xuICAgIH1cbiAgICBsaW1iTGVuLS07XG4gICAgbGltYlBvdyA9IChsaW1iUG93IC8gYmFzZSkgfCAwO1xuXG4gICAgdmFyIHRvdGFsID0gbnVtYmVyLmxlbmd0aCAtIHN0YXJ0O1xuICAgIHZhciBtb2QgPSB0b3RhbCAlIGxpbWJMZW47XG4gICAgdmFyIGVuZCA9IE1hdGgubWluKHRvdGFsLCB0b3RhbCAtIG1vZCkgKyBzdGFydDtcblxuICAgIHZhciB3b3JkID0gMDtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gbGltYkxlbikge1xuICAgICAgd29yZCA9IHBhcnNlQmFzZShudW1iZXIsIGksIGkgKyBsaW1iTGVuLCBiYXNlKTtcblxuICAgICAgdGhpcy5pbXVsbihsaW1iUG93KTtcbiAgICAgIGlmICh0aGlzLndvcmRzWzBdICsgd29yZCA8IDB4NDAwMDAwMCkge1xuICAgICAgICB0aGlzLndvcmRzWzBdICs9IHdvcmQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pYWRkbih3b3JkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9kICE9PSAwKSB7XG4gICAgICB2YXIgcG93ID0gMTtcbiAgICAgIHdvcmQgPSBwYXJzZUJhc2UobnVtYmVyLCBpLCBudW1iZXIubGVuZ3RoLCBiYXNlKTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IG1vZDsgaSsrKSB7XG4gICAgICAgIHBvdyAqPSBiYXNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmltdWxuKHBvdyk7XG4gICAgICBpZiAodGhpcy53b3Jkc1swXSArIHdvcmQgPCAweDQwMDAwMDApIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSArPSB3b3JkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faWFkZG4od29yZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAoZGVzdCkge1xuICAgIGRlc3Qud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgZGVzdC53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV07XG4gICAgfVxuICAgIGRlc3QubGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgZGVzdC5uZWdhdGl2ZSA9IHRoaXMubmVnYXRpdmU7XG4gICAgZGVzdC5yZWQgPSB0aGlzLnJlZDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiBjbG9uZSAoKSB7XG4gICAgdmFyIHIgPSBuZXcgQk4obnVsbCk7XG4gICAgdGhpcy5jb3B5KHIpO1xuICAgIHJldHVybiByO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fZXhwYW5kID0gZnVuY3Rpb24gX2V4cGFuZCAoc2l6ZSkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA8IHNpemUpIHtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGgrK10gPSAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBSZW1vdmUgbGVhZGluZyBgMGAgZnJvbSBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnN0cmlwID0gZnVuY3Rpb24gc3RyaXAgKCkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA+IDEgJiYgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdID09PSAwKSB7XG4gICAgICB0aGlzLmxlbmd0aC0tO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX25vcm1TaWduID0gZnVuY3Rpb24gX25vcm1TaWduICgpIHtcbiAgICAvLyAtMCA9IDBcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA9PT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLnJlZCA/ICc8Qk4tUjogJyA6ICc8Qk46ICcpICsgdGhpcy50b1N0cmluZygxNikgKyAnPic7XG4gIH07XG5cbiAgLypcblxuICB2YXIgemVyb3MgPSBbXTtcbiAgdmFyIGdyb3VwU2l6ZXMgPSBbXTtcbiAgdmFyIGdyb3VwQmFzZXMgPSBbXTtcblxuICB2YXIgcyA9ICcnO1xuICB2YXIgaSA9IC0xO1xuICB3aGlsZSAoKytpIDwgQk4ud29yZFNpemUpIHtcbiAgICB6ZXJvc1tpXSA9IHM7XG4gICAgcyArPSAnMCc7XG4gIH1cbiAgZ3JvdXBTaXplc1swXSA9IDA7XG4gIGdyb3VwU2l6ZXNbMV0gPSAwO1xuICBncm91cEJhc2VzWzBdID0gMDtcbiAgZ3JvdXBCYXNlc1sxXSA9IDA7XG4gIHZhciBiYXNlID0gMiAtIDE7XG4gIHdoaWxlICgrK2Jhc2UgPCAzNiArIDEpIHtcbiAgICB2YXIgZ3JvdXBTaXplID0gMDtcbiAgICB2YXIgZ3JvdXBCYXNlID0gMTtcbiAgICB3aGlsZSAoZ3JvdXBCYXNlIDwgKDEgPDwgQk4ud29yZFNpemUpIC8gYmFzZSkge1xuICAgICAgZ3JvdXBCYXNlICo9IGJhc2U7XG4gICAgICBncm91cFNpemUgKz0gMTtcbiAgICB9XG4gICAgZ3JvdXBTaXplc1tiYXNlXSA9IGdyb3VwU2l6ZTtcbiAgICBncm91cEJhc2VzW2Jhc2VdID0gZ3JvdXBCYXNlO1xuICB9XG5cbiAgKi9cblxuICB2YXIgemVyb3MgPSBbXG4gICAgJycsXG4gICAgJzAnLFxuICAgICcwMCcsXG4gICAgJzAwMCcsXG4gICAgJzAwMDAnLFxuICAgICcwMDAwMCcsXG4gICAgJzAwMDAwMCcsXG4gICAgJzAwMDAwMDAnLFxuICAgICcwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnXG4gIF07XG5cbiAgdmFyIGdyb3VwU2l6ZXMgPSBbXG4gICAgMCwgMCxcbiAgICAyNSwgMTYsIDEyLCAxMSwgMTAsIDksIDgsXG4gICAgOCwgNywgNywgNywgNywgNiwgNixcbiAgICA2LCA2LCA2LCA2LCA2LCA1LCA1LFxuICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNVxuICBdO1xuXG4gIHZhciBncm91cEJhc2VzID0gW1xuICAgIDAsIDAsXG4gICAgMzM1NTQ0MzIsIDQzMDQ2NzIxLCAxNjc3NzIxNiwgNDg4MjgxMjUsIDYwNDY2MTc2LCA0MDM1MzYwNywgMTY3NzcyMTYsXG4gICAgNDMwNDY3MjEsIDEwMDAwMDAwLCAxOTQ4NzE3MSwgMzU4MzE4MDgsIDYyNzQ4NTE3LCA3NTI5NTM2LCAxMTM5MDYyNSxcbiAgICAxNjc3NzIxNiwgMjQxMzc1NjksIDM0MDEyMjI0LCA0NzA0NTg4MSwgNjQwMDAwMDAsIDQwODQxMDEsIDUxNTM2MzIsXG4gICAgNjQzNjM0MywgNzk2MjYyNCwgOTc2NTYyNSwgMTE4ODEzNzYsIDE0MzQ4OTA3LCAxNzIxMDM2OCwgMjA1MTExNDksXG4gICAgMjQzMDAwMDAsIDI4NjI5MTUxLCAzMzU1NDQzMiwgMzkxMzUzOTMsIDQ1NDM1NDI0LCA1MjUyMTg3NSwgNjA0NjYxNzZcbiAgXTtcblxuICBCTi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoYmFzZSwgcGFkZGluZykge1xuICAgIGJhc2UgPSBiYXNlIHx8IDEwO1xuICAgIHBhZGRpbmcgPSBwYWRkaW5nIHwgMCB8fCAxO1xuXG4gICAgdmFyIG91dDtcbiAgICBpZiAoYmFzZSA9PT0gMTYgfHwgYmFzZSA9PT0gJ2hleCcpIHtcbiAgICAgIG91dCA9ICcnO1xuICAgICAgdmFyIG9mZiA9IDA7XG4gICAgICB2YXIgY2FycnkgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgICAgdmFyIHdvcmQgPSAoKCh3IDw8IG9mZikgfCBjYXJyeSkgJiAweGZmZmZmZikudG9TdHJpbmcoMTYpO1xuICAgICAgICBjYXJyeSA9ICh3ID4+PiAoMjQgLSBvZmYpKSAmIDB4ZmZmZmZmO1xuICAgICAgICBvZmYgKz0gMjtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBpLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhcnJ5ICE9PSAwIHx8IGkgIT09IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIG91dCA9IHplcm9zWzYgLSB3b3JkLmxlbmd0aF0gKyB3b3JkICsgb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCA9IHdvcmQgKyBvdXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgICBvdXQgPSBjYXJyeS50b1N0cmluZygxNikgKyBvdXQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAob3V0Lmxlbmd0aCAlIHBhZGRpbmcgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJzAnICsgb3V0O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJy0nICsgb3V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBpZiAoYmFzZSA9PT0gKGJhc2UgfCAwKSAmJiBiYXNlID49IDIgJiYgYmFzZSA8PSAzNikge1xuICAgICAgLy8gdmFyIGdyb3VwU2l6ZSA9IE1hdGguZmxvb3IoQk4ud29yZFNpemUgKiBNYXRoLkxOMiAvIE1hdGgubG9nKGJhc2UpKTtcbiAgICAgIHZhciBncm91cFNpemUgPSBncm91cFNpemVzW2Jhc2VdO1xuICAgICAgLy8gdmFyIGdyb3VwQmFzZSA9IE1hdGgucG93KGJhc2UsIGdyb3VwU2l6ZSk7XG4gICAgICB2YXIgZ3JvdXBCYXNlID0gZ3JvdXBCYXNlc1tiYXNlXTtcbiAgICAgIG91dCA9ICcnO1xuICAgICAgdmFyIGMgPSB0aGlzLmNsb25lKCk7XG4gICAgICBjLm5lZ2F0aXZlID0gMDtcbiAgICAgIHdoaWxlICghYy5pc1plcm8oKSkge1xuICAgICAgICB2YXIgciA9IGMubW9kbihncm91cEJhc2UpLnRvU3RyaW5nKGJhc2UpO1xuICAgICAgICBjID0gYy5pZGl2bihncm91cEJhc2UpO1xuXG4gICAgICAgIGlmICghYy5pc1plcm8oKSkge1xuICAgICAgICAgIG91dCA9IHplcm9zW2dyb3VwU2l6ZSAtIHIubGVuZ3RoXSArIHIgKyBvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ID0gciArIG91dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNaZXJvKCkpIHtcbiAgICAgICAgb3V0ID0gJzAnICsgb3V0O1xuICAgICAgfVxuICAgICAgd2hpbGUgKG91dC5sZW5ndGggJSBwYWRkaW5nICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICcwJyArIG91dDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICctJyArIG91dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgYXNzZXJ0KGZhbHNlLCAnQmFzZSBzaG91bGQgYmUgYmV0d2VlbiAyIGFuZCAzNicpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyICgpIHtcbiAgICB2YXIgcmV0ID0gdGhpcy53b3Jkc1swXTtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHJldCArPSB0aGlzLndvcmRzWzFdICogMHg0MDAwMDAwO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sZW5ndGggPT09IDMgJiYgdGhpcy53b3Jkc1syXSA9PT0gMHgwMSkge1xuICAgICAgLy8gTk9URTogYXQgdGhpcyBzdGFnZSBpdCBpcyBrbm93biB0aGF0IHRoZSB0b3AgYml0IGlzIHNldFxuICAgICAgcmV0ICs9IDB4MTAwMDAwMDAwMDAwMDAgKyAodGhpcy53b3Jkc1sxXSAqIDB4NDAwMDAwMCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxlbmd0aCA+IDIpIHtcbiAgICAgIGFzc2VydChmYWxzZSwgJ051bWJlciBjYW4gb25seSBzYWZlbHkgc3RvcmUgdXAgdG8gNTMgYml0cycpO1xuICAgIH1cbiAgICByZXR1cm4gKHRoaXMubmVnYXRpdmUgIT09IDApID8gLXJldCA6IHJldDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgICByZXR1cm4gdGhpcy50b1N0cmluZygxNik7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvQnVmZmVyID0gZnVuY3Rpb24gdG9CdWZmZXIgKGVuZGlhbiwgbGVuZ3RoKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKTtcbiAgICByZXR1cm4gdGhpcy50b0FycmF5TGlrZShCdWZmZXIsIGVuZGlhbiwgbGVuZ3RoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uIHRvQXJyYXkgKGVuZGlhbiwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9BcnJheUxpa2UoQXJyYXksIGVuZGlhbiwgbGVuZ3RoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9BcnJheUxpa2UgPSBmdW5jdGlvbiB0b0FycmF5TGlrZSAoQXJyYXlUeXBlLCBlbmRpYW4sIGxlbmd0aCkge1xuICAgIHZhciBieXRlTGVuZ3RoID0gdGhpcy5ieXRlTGVuZ3RoKCk7XG4gICAgdmFyIHJlcUxlbmd0aCA9IGxlbmd0aCB8fCBNYXRoLm1heCgxLCBieXRlTGVuZ3RoKTtcbiAgICBhc3NlcnQoYnl0ZUxlbmd0aCA8PSByZXFMZW5ndGgsICdieXRlIGFycmF5IGxvbmdlciB0aGFuIGRlc2lyZWQgbGVuZ3RoJyk7XG4gICAgYXNzZXJ0KHJlcUxlbmd0aCA+IDAsICdSZXF1ZXN0ZWQgYXJyYXkgbGVuZ3RoIDw9IDAnKTtcblxuICAgIHRoaXMuc3RyaXAoKTtcbiAgICB2YXIgbGl0dGxlRW5kaWFuID0gZW5kaWFuID09PSAnbGUnO1xuICAgIHZhciByZXMgPSBuZXcgQXJyYXlUeXBlKHJlcUxlbmd0aCk7XG5cbiAgICB2YXIgYiwgaTtcbiAgICB2YXIgcSA9IHRoaXMuY2xvbmUoKTtcbiAgICBpZiAoIWxpdHRsZUVuZGlhbikge1xuICAgICAgLy8gQXNzdW1lIGJpZy1lbmRpYW5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCByZXFMZW5ndGggLSBieXRlTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzW2ldID0gMDtcbiAgICAgIH1cblxuICAgICAgZm9yIChpID0gMDsgIXEuaXNaZXJvKCk7IGkrKykge1xuICAgICAgICBiID0gcS5hbmRsbigweGZmKTtcbiAgICAgICAgcS5pdXNocm4oOCk7XG5cbiAgICAgICAgcmVzW3JlcUxlbmd0aCAtIGkgLSAxXSA9IGI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSA9IDA7ICFxLmlzWmVybygpOyBpKyspIHtcbiAgICAgICAgYiA9IHEuYW5kbG4oMHhmZik7XG4gICAgICAgIHEuaXVzaHJuKDgpO1xuXG4gICAgICAgIHJlc1tpXSA9IGI7XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBpIDwgcmVxTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzW2ldID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIGlmIChNYXRoLmNsejMyKSB7XG4gICAgQk4ucHJvdG90eXBlLl9jb3VudEJpdHMgPSBmdW5jdGlvbiBfY291bnRCaXRzICh3KSB7XG4gICAgICByZXR1cm4gMzIgLSBNYXRoLmNsejMyKHcpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgQk4ucHJvdG90eXBlLl9jb3VudEJpdHMgPSBmdW5jdGlvbiBfY291bnRCaXRzICh3KSB7XG4gICAgICB2YXIgdCA9IHc7XG4gICAgICB2YXIgciA9IDA7XG4gICAgICBpZiAodCA+PSAweDEwMDApIHtcbiAgICAgICAgciArPSAxMztcbiAgICAgICAgdCA+Pj49IDEzO1xuICAgICAgfVxuICAgICAgaWYgKHQgPj0gMHg0MCkge1xuICAgICAgICByICs9IDc7XG4gICAgICAgIHQgPj4+PSA3O1xuICAgICAgfVxuICAgICAgaWYgKHQgPj0gMHg4KSB7XG4gICAgICAgIHIgKz0gNDtcbiAgICAgICAgdCA+Pj49IDQ7XG4gICAgICB9XG4gICAgICBpZiAodCA+PSAweDAyKSB7XG4gICAgICAgIHIgKz0gMjtcbiAgICAgICAgdCA+Pj49IDI7XG4gICAgICB9XG4gICAgICByZXR1cm4gciArIHQ7XG4gICAgfTtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5femVyb0JpdHMgPSBmdW5jdGlvbiBfemVyb0JpdHMgKHcpIHtcbiAgICAvLyBTaG9ydC1jdXRcbiAgICBpZiAodyA9PT0gMCkgcmV0dXJuIDI2O1xuXG4gICAgdmFyIHQgPSB3O1xuICAgIHZhciByID0gMDtcbiAgICBpZiAoKHQgJiAweDFmZmYpID09PSAwKSB7XG4gICAgICByICs9IDEzO1xuICAgICAgdCA+Pj49IDEzO1xuICAgIH1cbiAgICBpZiAoKHQgJiAweDdmKSA9PT0gMCkge1xuICAgICAgciArPSA3O1xuICAgICAgdCA+Pj49IDc7XG4gICAgfVxuICAgIGlmICgodCAmIDB4ZikgPT09IDApIHtcbiAgICAgIHIgKz0gNDtcbiAgICAgIHQgPj4+PSA0O1xuICAgIH1cbiAgICBpZiAoKHQgJiAweDMpID09PSAwKSB7XG4gICAgICByICs9IDI7XG4gICAgICB0ID4+Pj0gMjtcbiAgICB9XG4gICAgaWYgKCh0ICYgMHgxKSA9PT0gMCkge1xuICAgICAgcisrO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICAvLyBSZXR1cm4gbnVtYmVyIG9mIHVzZWQgYml0cyBpbiBhIEJOXG4gIEJOLnByb3RvdHlwZS5iaXRMZW5ndGggPSBmdW5jdGlvbiBiaXRMZW5ndGggKCkge1xuICAgIHZhciB3ID0gdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdO1xuICAgIHZhciBoaSA9IHRoaXMuX2NvdW50Qml0cyh3KTtcbiAgICByZXR1cm4gKHRoaXMubGVuZ3RoIC0gMSkgKiAyNiArIGhpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHRvQml0QXJyYXkgKG51bSkge1xuICAgIHZhciB3ID0gbmV3IEFycmF5KG51bS5iaXRMZW5ndGgoKSk7XG5cbiAgICBmb3IgKHZhciBiaXQgPSAwOyBiaXQgPCB3Lmxlbmd0aDsgYml0KyspIHtcbiAgICAgIHZhciBvZmYgPSAoYml0IC8gMjYpIHwgMDtcbiAgICAgIHZhciB3Yml0ID0gYml0ICUgMjY7XG5cbiAgICAgIHdbYml0XSA9IChudW0ud29yZHNbb2ZmXSAmICgxIDw8IHdiaXQpKSA+Pj4gd2JpdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdztcbiAgfVxuXG4gIC8vIE51bWJlciBvZiB0cmFpbGluZyB6ZXJvIGJpdHNcbiAgQk4ucHJvdG90eXBlLnplcm9CaXRzID0gZnVuY3Rpb24gemVyb0JpdHMgKCkge1xuICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gMDtcblxuICAgIHZhciByID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBiID0gdGhpcy5femVyb0JpdHModGhpcy53b3Jkc1tpXSk7XG4gICAgICByICs9IGI7XG4gICAgICBpZiAoYiAhPT0gMjYpIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuYnl0ZUxlbmd0aCA9IGZ1bmN0aW9uIGJ5dGVMZW5ndGggKCkge1xuICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy5iaXRMZW5ndGgoKSAvIDgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b1R3b3MgPSBmdW5jdGlvbiB0b1R3b3MgKHdpZHRoKSB7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmFicygpLmlub3RuKHdpZHRoKS5pYWRkbigxKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZnJvbVR3b3MgPSBmdW5jdGlvbiBmcm9tVHdvcyAod2lkdGgpIHtcbiAgICBpZiAodGhpcy50ZXN0bih3aWR0aCAtIDEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub3RuKHdpZHRoKS5pYWRkbigxKS5pbmVnKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb25lKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzTmVnID0gZnVuY3Rpb24gaXNOZWcgKCkge1xuICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwO1xuICB9O1xuXG4gIC8vIFJldHVybiBuZWdhdGl2ZSBjbG9uZSBvZiBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbmVnKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmluZWcgPSBmdW5jdGlvbiBpbmVnICgpIHtcbiAgICBpZiAoIXRoaXMuaXNaZXJvKCkpIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgXj0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBPciBgbnVtYCB3aXRoIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXVvciA9IGZ1bmN0aW9uIGl1b3IgKG51bSkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA8IG51bS5sZW5ndGgpIHtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGgrK10gPSAwO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXSB8IG51bS53b3Jkc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pb3IgPSBmdW5jdGlvbiBpb3IgKG51bSkge1xuICAgIGFzc2VydCgodGhpcy5uZWdhdGl2ZSB8IG51bS5uZWdhdGl2ZSkgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1b3IobnVtKTtcbiAgfTtcblxuICAvLyBPciBgbnVtYCB3aXRoIGB0aGlzYFxuICBCTi5wcm90b3R5cGUub3IgPSBmdW5jdGlvbiBvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pb3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaW9yKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51b3IgPSBmdW5jdGlvbiB1b3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXVvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pdW9yKHRoaXMpO1xuICB9O1xuXG4gIC8vIEFuZCBgbnVtYCB3aXRoIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXVhbmQgPSBmdW5jdGlvbiBpdWFuZCAobnVtKSB7XG4gICAgLy8gYiA9IG1pbi1sZW5ndGgobnVtLCB0aGlzKVxuICAgIHZhciBiO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHtcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV0gJiBudW0ud29yZHNbaV07XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBiLmxlbmd0aDtcblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlhbmQgPSBmdW5jdGlvbiBpYW5kIChudW0pIHtcbiAgICBhc3NlcnQoKHRoaXMubmVnYXRpdmUgfCBudW0ubmVnYXRpdmUpID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdWFuZChudW0pO1xuICB9O1xuXG4gIC8vIEFuZCBgbnVtYCB3aXRoIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuYW5kID0gZnVuY3Rpb24gYW5kIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLmlhbmQobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaWFuZCh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudWFuZCA9IGZ1bmN0aW9uIHVhbmQgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXVhbmQobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXVhbmQodGhpcyk7XG4gIH07XG5cbiAgLy8gWG9yIGBudW1gIHdpdGggYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdXhvciA9IGZ1bmN0aW9uIGl1eG9yIChudW0pIHtcbiAgICAvLyBhLmxlbmd0aCA+IGIubGVuZ3RoXG4gICAgdmFyIGE7XG4gICAgdmFyIGI7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkge1xuICAgICAgYSA9IHRoaXM7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gbnVtO1xuICAgICAgYiA9IHRoaXM7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXSBeIGIud29yZHNbaV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMgIT09IGEpIHtcbiAgICAgIGZvciAoOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IGEubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXhvciA9IGZ1bmN0aW9uIGl4b3IgKG51bSkge1xuICAgIGFzc2VydCgodGhpcy5uZWdhdGl2ZSB8IG51bS5uZWdhdGl2ZSkgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1eG9yKG51bSk7XG4gIH07XG5cbiAgLy8gWG9yIGBudW1gIHdpdGggYHRoaXNgXG4gIEJOLnByb3RvdHlwZS54b3IgPSBmdW5jdGlvbiB4b3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXhvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5peG9yKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51eG9yID0gZnVuY3Rpb24gdXhvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXhvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pdXhvcih0aGlzKTtcbiAgfTtcblxuICAvLyBOb3QgYGB0aGlzYGAgd2l0aCBgYHdpZHRoYGAgYml0d2lkdGhcbiAgQk4ucHJvdG90eXBlLmlub3RuID0gZnVuY3Rpb24gaW5vdG4gKHdpZHRoKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiB3aWR0aCA9PT0gJ251bWJlcicgJiYgd2lkdGggPj0gMCk7XG5cbiAgICB2YXIgYnl0ZXNOZWVkZWQgPSBNYXRoLmNlaWwod2lkdGggLyAyNikgfCAwO1xuICAgIHZhciBiaXRzTGVmdCA9IHdpZHRoICUgMjY7XG5cbiAgICAvLyBFeHRlbmQgdGhlIGJ1ZmZlciB3aXRoIGxlYWRpbmcgemVyb2VzXG4gICAgdGhpcy5fZXhwYW5kKGJ5dGVzTmVlZGVkKTtcblxuICAgIGlmIChiaXRzTGVmdCA+IDApIHtcbiAgICAgIGJ5dGVzTmVlZGVkLS07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGNvbXBsZXRlIHdvcmRzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlc05lZWRlZDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gfnRoaXMud29yZHNbaV0gJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHRoZSByZXNpZHVlXG4gICAgaWYgKGJpdHNMZWZ0ID4gMCkge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IH50aGlzLndvcmRzW2ldICYgKDB4M2ZmZmZmZiA+PiAoMjYgLSBiaXRzTGVmdCkpO1xuICAgIH1cblxuICAgIC8vIEFuZCByZW1vdmUgbGVhZGluZyB6ZXJvZXNcbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ub3RuID0gZnVuY3Rpb24gbm90biAod2lkdGgpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlub3RuKHdpZHRoKTtcbiAgfTtcblxuICAvLyBTZXQgYGJpdGAgb2YgYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zZXRuID0gZnVuY3Rpb24gc2V0biAoYml0LCB2YWwpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdCA9PT0gJ251bWJlcicgJiYgYml0ID49IDApO1xuXG4gICAgdmFyIG9mZiA9IChiaXQgLyAyNikgfCAwO1xuICAgIHZhciB3Yml0ID0gYml0ICUgMjY7XG5cbiAgICB0aGlzLl9leHBhbmQob2ZmICsgMSk7XG5cbiAgICBpZiAodmFsKSB7XG4gICAgICB0aGlzLndvcmRzW29mZl0gPSB0aGlzLndvcmRzW29mZl0gfCAoMSA8PCB3Yml0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53b3Jkc1tvZmZdID0gdGhpcy53b3Jkc1tvZmZdICYgfigxIDw8IHdiaXQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gQWRkIGBudW1gIHRvIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaWFkZCA9IGZ1bmN0aW9uIGlhZGQgKG51bSkge1xuICAgIHZhciByO1xuXG4gICAgLy8gbmVnYXRpdmUgKyBwb3NpdGl2ZVxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIG51bS5uZWdhdGl2ZSA9PT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICByID0gdGhpcy5pc3ViKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlIF49IDE7XG4gICAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcblxuICAgIC8vIHBvc2l0aXZlICsgbmVnYXRpdmVcbiAgICB9IGVsc2UgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbnVtLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBudW0ubmVnYXRpdmUgPSAwO1xuICAgICAgciA9IHRoaXMuaXN1YihudW0pO1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiByLl9ub3JtU2lnbigpO1xuICAgIH1cblxuICAgIC8vIGEubGVuZ3RoID4gYi5sZW5ndGhcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSB7XG4gICAgICBhID0gdGhpcztcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBudW07XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgKyAoYi53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICAgIGNhcnJ5ID0gciA+Pj4gMjY7XG4gICAgfVxuICAgIGZvciAoOyBjYXJyeSAhPT0gMCAmJiBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgICAgY2FycnkgPSByID4+PiAyNjtcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IGEubGVuZ3RoO1xuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aF0gPSBjYXJyeTtcbiAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgLy8gQ29weSB0aGUgcmVzdCBvZiB0aGUgd29yZHNcbiAgICB9IGVsc2UgaWYgKGEgIT09IHRoaXMpIHtcbiAgICAgIGZvciAoOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBBZGQgYG51bWAgdG8gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKG51bSkge1xuICAgIHZhciByZXM7XG4gICAgaWYgKG51bS5uZWdhdGl2ZSAhPT0gMCAmJiB0aGlzLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICBudW0ubmVnYXRpdmUgPSAwO1xuICAgICAgcmVzID0gdGhpcy5zdWIobnVtKTtcbiAgICAgIG51bS5uZWdhdGl2ZSBePSAxO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGVsc2UgaWYgKG51bS5uZWdhdGl2ZSA9PT0gMCAmJiB0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHJlcyA9IG51bS5zdWIodGhpcyk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkKG51bSk7XG5cbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaWFkZCh0aGlzKTtcbiAgfTtcblxuICAvLyBTdWJ0cmFjdCBgbnVtYCBmcm9tIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXN1YiA9IGZ1bmN0aW9uIGlzdWIgKG51bSkge1xuICAgIC8vIHRoaXMgLSAoLW51bSkgPSB0aGlzICsgbnVtXG4gICAgaWYgKG51bS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMDtcbiAgICAgIHZhciByID0gdGhpcy5pYWRkKG51bSk7XG4gICAgICBudW0ubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHIuX25vcm1TaWduKCk7XG5cbiAgICAvLyAtdGhpcyAtIG51bSA9IC0odGhpcyArIG51bSlcbiAgICB9IGVsc2UgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5pYWRkKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiB0aGlzLl9ub3JtU2lnbigpO1xuICAgIH1cblxuICAgIC8vIEF0IHRoaXMgcG9pbnQgYm90aCBudW1iZXJzIGFyZSBwb3NpdGl2ZVxuICAgIHZhciBjbXAgPSB0aGlzLmNtcChudW0pO1xuXG4gICAgLy8gT3B0aW1pemF0aW9uIC0gemVyb2lmeVxuICAgIGlmIChjbXAgPT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgICAgdGhpcy53b3Jkc1swXSA9IDA7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBhID4gYlxuICAgIHZhciBhLCBiO1xuICAgIGlmIChjbXAgPiAwKSB7XG4gICAgICBhID0gdGhpcztcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBudW07XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgLSAoYi53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHIgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICB9XG4gICAgZm9yICg7IGNhcnJ5ICE9PSAwICYmIGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgY2FycnkgPSByID4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgLy8gQ29weSByZXN0IG9mIHRoZSB3b3Jkc1xuICAgIGlmIChjYXJyeSA9PT0gMCAmJiBpIDwgYS5sZW5ndGggJiYgYSAhPT0gdGhpcykge1xuICAgICAgZm9yICg7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5sZW5ndGgsIGkpO1xuXG4gICAgaWYgKGEgIT09IHRoaXMpIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gU3VidHJhY3QgYG51bWAgZnJvbSBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uIHN1YiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc3ViKG51bSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gc21hbGxNdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICBvdXQubmVnYXRpdmUgPSBudW0ubmVnYXRpdmUgXiBzZWxmLm5lZ2F0aXZlO1xuICAgIHZhciBsZW4gPSAoc2VsZi5sZW5ndGggKyBudW0ubGVuZ3RoKSB8IDA7XG4gICAgb3V0Lmxlbmd0aCA9IGxlbjtcbiAgICBsZW4gPSAobGVuIC0gMSkgfCAwO1xuXG4gICAgLy8gUGVlbCBvbmUgaXRlcmF0aW9uIChjb21waWxlciBjYW4ndCBkbyBpdCwgYmVjYXVzZSBvZiBjb2RlIGNvbXBsZXhpdHkpXG4gICAgdmFyIGEgPSBzZWxmLndvcmRzWzBdIHwgMDtcbiAgICB2YXIgYiA9IG51bS53b3Jkc1swXSB8IDA7XG4gICAgdmFyIHIgPSBhICogYjtcblxuICAgIHZhciBsbyA9IHIgJiAweDNmZmZmZmY7XG4gICAgdmFyIGNhcnJ5ID0gKHIgLyAweDQwMDAwMDApIHwgMDtcbiAgICBvdXQud29yZHNbMF0gPSBsbztcblxuICAgIGZvciAodmFyIGsgPSAxOyBrIDwgbGVuOyBrKyspIHtcbiAgICAgIC8vIFN1bSBhbGwgd29yZHMgd2l0aCB0aGUgc2FtZSBgaSArIGogPSBrYCBhbmQgYWNjdW11bGF0ZSBgbmNhcnJ5YCxcbiAgICAgIC8vIG5vdGUgdGhhdCBuY2FycnkgY291bGQgYmUgPj0gMHgzZmZmZmZmXG4gICAgICB2YXIgbmNhcnJ5ID0gY2FycnkgPj4+IDI2O1xuICAgICAgdmFyIHJ3b3JkID0gY2FycnkgJiAweDNmZmZmZmY7XG4gICAgICB2YXIgbWF4SiA9IE1hdGgubWluKGssIG51bS5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGogPSBNYXRoLm1heCgwLCBrIC0gc2VsZi5sZW5ndGggKyAxKTsgaiA8PSBtYXhKOyBqKyspIHtcbiAgICAgICAgdmFyIGkgPSAoayAtIGopIHwgMDtcbiAgICAgICAgYSA9IHNlbGYud29yZHNbaV0gfCAwO1xuICAgICAgICBiID0gbnVtLndvcmRzW2pdIHwgMDtcbiAgICAgICAgciA9IGEgKiBiICsgcndvcmQ7XG4gICAgICAgIG5jYXJyeSArPSAociAvIDB4NDAwMDAwMCkgfCAwO1xuICAgICAgICByd29yZCA9IHIgJiAweDNmZmZmZmY7XG4gICAgICB9XG4gICAgICBvdXQud29yZHNba10gPSByd29yZCB8IDA7XG4gICAgICBjYXJyeSA9IG5jYXJyeSB8IDA7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgb3V0LndvcmRzW2tdID0gY2FycnkgfCAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQubGVuZ3RoLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dC5zdHJpcCgpO1xuICB9XG5cbiAgLy8gVE9ETyhpbmR1dG55KTogaXQgbWF5IGJlIHJlYXNvbmFibGUgdG8gb21pdCBpdCBmb3IgdXNlcnMgd2hvIGRvbid0IG5lZWRcbiAgLy8gdG8gd29yayB3aXRoIDI1Ni1iaXQgbnVtYmVycywgb3RoZXJ3aXNlIGl0IGdpdmVzIDIwJSBpbXByb3ZlbWVudCBmb3IgMjU2LWJpdFxuICAvLyBtdWx0aXBsaWNhdGlvbiAobGlrZSBlbGxpcHRpYyBzZWNwMjU2azEpLlxuICB2YXIgY29tYjEwTXVsVG8gPSBmdW5jdGlvbiBjb21iMTBNdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICB2YXIgYSA9IHNlbGYud29yZHM7XG4gICAgdmFyIGIgPSBudW0ud29yZHM7XG4gICAgdmFyIG8gPSBvdXQud29yZHM7XG4gICAgdmFyIGMgPSAwO1xuICAgIHZhciBsbztcbiAgICB2YXIgbWlkO1xuICAgIHZhciBoaTtcbiAgICB2YXIgYTAgPSBhWzBdIHwgMDtcbiAgICB2YXIgYWwwID0gYTAgJiAweDFmZmY7XG4gICAgdmFyIGFoMCA9IGEwID4+PiAxMztcbiAgICB2YXIgYTEgPSBhWzFdIHwgMDtcbiAgICB2YXIgYWwxID0gYTEgJiAweDFmZmY7XG4gICAgdmFyIGFoMSA9IGExID4+PiAxMztcbiAgICB2YXIgYTIgPSBhWzJdIHwgMDtcbiAgICB2YXIgYWwyID0gYTIgJiAweDFmZmY7XG4gICAgdmFyIGFoMiA9IGEyID4+PiAxMztcbiAgICB2YXIgYTMgPSBhWzNdIHwgMDtcbiAgICB2YXIgYWwzID0gYTMgJiAweDFmZmY7XG4gICAgdmFyIGFoMyA9IGEzID4+PiAxMztcbiAgICB2YXIgYTQgPSBhWzRdIHwgMDtcbiAgICB2YXIgYWw0ID0gYTQgJiAweDFmZmY7XG4gICAgdmFyIGFoNCA9IGE0ID4+PiAxMztcbiAgICB2YXIgYTUgPSBhWzVdIHwgMDtcbiAgICB2YXIgYWw1ID0gYTUgJiAweDFmZmY7XG4gICAgdmFyIGFoNSA9IGE1ID4+PiAxMztcbiAgICB2YXIgYTYgPSBhWzZdIHwgMDtcbiAgICB2YXIgYWw2ID0gYTYgJiAweDFmZmY7XG4gICAgdmFyIGFoNiA9IGE2ID4+PiAxMztcbiAgICB2YXIgYTcgPSBhWzddIHwgMDtcbiAgICB2YXIgYWw3ID0gYTcgJiAweDFmZmY7XG4gICAgdmFyIGFoNyA9IGE3ID4+PiAxMztcbiAgICB2YXIgYTggPSBhWzhdIHwgMDtcbiAgICB2YXIgYWw4ID0gYTggJiAweDFmZmY7XG4gICAgdmFyIGFoOCA9IGE4ID4+PiAxMztcbiAgICB2YXIgYTkgPSBhWzldIHwgMDtcbiAgICB2YXIgYWw5ID0gYTkgJiAweDFmZmY7XG4gICAgdmFyIGFoOSA9IGE5ID4+PiAxMztcbiAgICB2YXIgYjAgPSBiWzBdIHwgMDtcbiAgICB2YXIgYmwwID0gYjAgJiAweDFmZmY7XG4gICAgdmFyIGJoMCA9IGIwID4+PiAxMztcbiAgICB2YXIgYjEgPSBiWzFdIHwgMDtcbiAgICB2YXIgYmwxID0gYjEgJiAweDFmZmY7XG4gICAgdmFyIGJoMSA9IGIxID4+PiAxMztcbiAgICB2YXIgYjIgPSBiWzJdIHwgMDtcbiAgICB2YXIgYmwyID0gYjIgJiAweDFmZmY7XG4gICAgdmFyIGJoMiA9IGIyID4+PiAxMztcbiAgICB2YXIgYjMgPSBiWzNdIHwgMDtcbiAgICB2YXIgYmwzID0gYjMgJiAweDFmZmY7XG4gICAgdmFyIGJoMyA9IGIzID4+PiAxMztcbiAgICB2YXIgYjQgPSBiWzRdIHwgMDtcbiAgICB2YXIgYmw0ID0gYjQgJiAweDFmZmY7XG4gICAgdmFyIGJoNCA9IGI0ID4+PiAxMztcbiAgICB2YXIgYjUgPSBiWzVdIHwgMDtcbiAgICB2YXIgYmw1ID0gYjUgJiAweDFmZmY7XG4gICAgdmFyIGJoNSA9IGI1ID4+PiAxMztcbiAgICB2YXIgYjYgPSBiWzZdIHwgMDtcbiAgICB2YXIgYmw2ID0gYjYgJiAweDFmZmY7XG4gICAgdmFyIGJoNiA9IGI2ID4+PiAxMztcbiAgICB2YXIgYjcgPSBiWzddIHwgMDtcbiAgICB2YXIgYmw3ID0gYjcgJiAweDFmZmY7XG4gICAgdmFyIGJoNyA9IGI3ID4+PiAxMztcbiAgICB2YXIgYjggPSBiWzhdIHwgMDtcbiAgICB2YXIgYmw4ID0gYjggJiAweDFmZmY7XG4gICAgdmFyIGJoOCA9IGI4ID4+PiAxMztcbiAgICB2YXIgYjkgPSBiWzldIHwgMDtcbiAgICB2YXIgYmw5ID0gYjkgJiAweDFmZmY7XG4gICAgdmFyIGJoOSA9IGI5ID4+PiAxMztcblxuICAgIG91dC5uZWdhdGl2ZSA9IHNlbGYubmVnYXRpdmUgXiBudW0ubmVnYXRpdmU7XG4gICAgb3V0Lmxlbmd0aCA9IDE5O1xuICAgIC8qIGsgPSAwICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwwLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDAsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDAsIGJoMCk7XG4gICAgdmFyIHcwID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MCA+Pj4gMjYpKSB8IDA7XG4gICAgdzAgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwxLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDEsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDEsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmgxKSkgfCAwO1xuICAgIHZhciB3MSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzEgPj4+IDI2KSkgfCAwO1xuICAgIHcxICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMiwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwyLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgyLCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDIpKSB8IDA7XG4gICAgdmFyIHcyID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MiA+Pj4gMjYpKSB8IDA7XG4gICAgdzIgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAzICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwzLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDMsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDMsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDMpKSB8IDA7XG4gICAgdmFyIHczID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MyA+Pj4gMjYpKSB8IDA7XG4gICAgdzMgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA0ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw0LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDQsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDQsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg0KSkgfCAwO1xuICAgIHZhciB3NCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzQgPj4+IDI2KSkgfCAwO1xuICAgIHc0ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNSwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw1LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg1LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDUpKSB8IDA7XG4gICAgdmFyIHc1ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3NSA+Pj4gMjYpKSB8IDA7XG4gICAgdzUgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA2ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw2LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDYsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDYsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDYpKSB8IDA7XG4gICAgdmFyIHc2ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3NiA+Pj4gMjYpKSB8IDA7XG4gICAgdzYgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA3ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw3LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDcsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDcsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg3KSkgfCAwO1xuICAgIHZhciB3NyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzcgPj4+IDI2KSkgfCAwO1xuICAgIHc3ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gOCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOCwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw4LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg4LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDgpKSB8IDA7XG4gICAgdmFyIHc4ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3OCA+Pj4gMjYpKSB8IDA7XG4gICAgdzggJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA5ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDkpKSB8IDA7XG4gICAgdmFyIHc5ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3OSA+Pj4gMjYpKSB8IDA7XG4gICAgdzkgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwxKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDEpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDEpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDEpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxMCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzEwID4+PiAyNikpIHwgMDtcbiAgICB3MTAgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwyKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDIpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDIpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDIpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzExID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTEgPj4+IDI2KSkgfCAwO1xuICAgIHcxMSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDEyICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDMpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMyk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsMykpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoMyk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxMiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzEyID4+PiAyNikpIHwgMDtcbiAgICB3MTIgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw0KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDQpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDQpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDQpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxMyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzEzID4+PiAyNikpIHwgMDtcbiAgICB3MTMgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw1KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDUpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDUpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDUpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzE0ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTQgPj4+IDI2KSkgfCAwO1xuICAgIHcxNCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE1ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDYpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoNik7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsNikpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoNik7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE1ID4+PiAyNikpIHwgMDtcbiAgICB3MTUgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw3KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDcpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDcpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDcpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE2ID4+PiAyNikpIHwgMDtcbiAgICB3MTYgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw4KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDgpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDgpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDgpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzE3ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTcgPj4+IDI2KSkgfCAwO1xuICAgIHcxNyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE4ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDkpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoOSk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsOSkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoOSk7XG4gICAgdmFyIHcxOCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE4ID4+PiAyNikpIHwgMDtcbiAgICB3MTggJj0gMHgzZmZmZmZmO1xuICAgIG9bMF0gPSB3MDtcbiAgICBvWzFdID0gdzE7XG4gICAgb1syXSA9IHcyO1xuICAgIG9bM10gPSB3MztcbiAgICBvWzRdID0gdzQ7XG4gICAgb1s1XSA9IHc1O1xuICAgIG9bNl0gPSB3NjtcbiAgICBvWzddID0gdzc7XG4gICAgb1s4XSA9IHc4O1xuICAgIG9bOV0gPSB3OTtcbiAgICBvWzEwXSA9IHcxMDtcbiAgICBvWzExXSA9IHcxMTtcbiAgICBvWzEyXSA9IHcxMjtcbiAgICBvWzEzXSA9IHcxMztcbiAgICBvWzE0XSA9IHcxNDtcbiAgICBvWzE1XSA9IHcxNTtcbiAgICBvWzE2XSA9IHcxNjtcbiAgICBvWzE3XSA9IHcxNztcbiAgICBvWzE4XSA9IHcxODtcbiAgICBpZiAoYyAhPT0gMCkge1xuICAgICAgb1sxOV0gPSBjO1xuICAgICAgb3V0Lmxlbmd0aCsrO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9O1xuXG4gIC8vIFBvbHlmaWxsIGNvbWJcbiAgaWYgKCFNYXRoLmltdWwpIHtcbiAgICBjb21iMTBNdWxUbyA9IHNtYWxsTXVsVG87XG4gIH1cblxuICBmdW5jdGlvbiBiaWdNdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICBvdXQubmVnYXRpdmUgPSBudW0ubmVnYXRpdmUgXiBzZWxmLm5lZ2F0aXZlO1xuICAgIG91dC5sZW5ndGggPSBzZWxmLmxlbmd0aCArIG51bS5sZW5ndGg7XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIHZhciBobmNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IG91dC5sZW5ndGggLSAxOyBrKyspIHtcbiAgICAgIC8vIFN1bSBhbGwgd29yZHMgd2l0aCB0aGUgc2FtZSBgaSArIGogPSBrYCBhbmQgYWNjdW11bGF0ZSBgbmNhcnJ5YCxcbiAgICAgIC8vIG5vdGUgdGhhdCBuY2FycnkgY291bGQgYmUgPj0gMHgzZmZmZmZmXG4gICAgICB2YXIgbmNhcnJ5ID0gaG5jYXJyeTtcbiAgICAgIGhuY2FycnkgPSAwO1xuICAgICAgdmFyIHJ3b3JkID0gY2FycnkgJiAweDNmZmZmZmY7XG4gICAgICB2YXIgbWF4SiA9IE1hdGgubWluKGssIG51bS5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGogPSBNYXRoLm1heCgwLCBrIC0gc2VsZi5sZW5ndGggKyAxKTsgaiA8PSBtYXhKOyBqKyspIHtcbiAgICAgICAgdmFyIGkgPSBrIC0gajtcbiAgICAgICAgdmFyIGEgPSBzZWxmLndvcmRzW2ldIHwgMDtcbiAgICAgICAgdmFyIGIgPSBudW0ud29yZHNbal0gfCAwO1xuICAgICAgICB2YXIgciA9IGEgKiBiO1xuXG4gICAgICAgIHZhciBsbyA9IHIgJiAweDNmZmZmZmY7XG4gICAgICAgIG5jYXJyeSA9IChuY2FycnkgKyAoKHIgLyAweDQwMDAwMDApIHwgMCkpIHwgMDtcbiAgICAgICAgbG8gPSAobG8gKyByd29yZCkgfCAwO1xuICAgICAgICByd29yZCA9IGxvICYgMHgzZmZmZmZmO1xuICAgICAgICBuY2FycnkgPSAobmNhcnJ5ICsgKGxvID4+PiAyNikpIHwgMDtcblxuICAgICAgICBobmNhcnJ5ICs9IG5jYXJyeSA+Pj4gMjY7XG4gICAgICAgIG5jYXJyeSAmPSAweDNmZmZmZmY7XG4gICAgICB9XG4gICAgICBvdXQud29yZHNba10gPSByd29yZDtcbiAgICAgIGNhcnJ5ID0gbmNhcnJ5O1xuICAgICAgbmNhcnJ5ID0gaG5jYXJyeTtcbiAgICB9XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICBvdXQud29yZHNba10gPSBjYXJyeTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0Lmxlbmd0aC0tO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQuc3RyaXAoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGp1bWJvTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgdmFyIGZmdG0gPSBuZXcgRkZUTSgpO1xuICAgIHJldHVybiBmZnRtLm11bHAoc2VsZiwgbnVtLCBvdXQpO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLm11bFRvID0gZnVuY3Rpb24gbXVsVG8gKG51bSwgb3V0KSB7XG4gICAgdmFyIHJlcztcbiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGggKyBudW0ubGVuZ3RoO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMTAgJiYgbnVtLmxlbmd0aCA9PT0gMTApIHtcbiAgICAgIHJlcyA9IGNvbWIxME11bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9IGVsc2UgaWYgKGxlbiA8IDYzKSB7XG4gICAgICByZXMgPSBzbWFsbE11bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9IGVsc2UgaWYgKGxlbiA8IDEwMjQpIHtcbiAgICAgIHJlcyA9IGJpZ011bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0ganVtYm9NdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBDb29sZXktVHVrZXkgYWxnb3JpdGhtIGZvciBGRlRcbiAgLy8gc2xpZ2h0bHkgcmV2aXNpdGVkIHRvIHJlbHkgb24gbG9vcGluZyBpbnN0ZWFkIG9mIHJlY3Vyc2lvblxuXG4gIGZ1bmN0aW9uIEZGVE0gKHgsIHkpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gIH1cblxuICBGRlRNLnByb3RvdHlwZS5tYWtlUkJUID0gZnVuY3Rpb24gbWFrZVJCVCAoTikge1xuICAgIHZhciB0ID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBsID0gQk4ucHJvdG90eXBlLl9jb3VudEJpdHMoTikgLSAxO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICB0W2ldID0gdGhpcy5yZXZCaW4oaSwgbCwgTik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHQ7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBiaW5hcnktcmV2ZXJzZWQgcmVwcmVzZW50YXRpb24gb2YgYHhgXG4gIEZGVE0ucHJvdG90eXBlLnJldkJpbiA9IGZ1bmN0aW9uIHJldkJpbiAoeCwgbCwgTikge1xuICAgIGlmICh4ID09PSAwIHx8IHggPT09IE4gLSAxKSByZXR1cm4geDtcblxuICAgIHZhciByYiA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgIHJiIHw9ICh4ICYgMSkgPDwgKGwgLSBpIC0gMSk7XG4gICAgICB4ID4+PSAxO1xuICAgIH1cblxuICAgIHJldHVybiByYjtcbiAgfTtcblxuICAvLyBQZXJmb3JtcyBcInR3ZWVkbGluZ1wiIHBoYXNlLCB0aGVyZWZvcmUgJ2VtdWxhdGluZydcbiAgLy8gYmVoYXZpb3VyIG9mIHRoZSByZWN1cnNpdmUgYWxnb3JpdGhtXG4gIEZGVE0ucHJvdG90eXBlLnBlcm11dGUgPSBmdW5jdGlvbiBwZXJtdXRlIChyYnQsIHJ3cywgaXdzLCBydHdzLCBpdHdzLCBOKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHJ0d3NbaV0gPSByd3NbcmJ0W2ldXTtcbiAgICAgIGl0d3NbaV0gPSBpd3NbcmJ0W2ldXTtcbiAgICB9XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gdHJhbnNmb3JtIChyd3MsIGl3cywgcnR3cywgaXR3cywgTiwgcmJ0KSB7XG4gICAgdGhpcy5wZXJtdXRlKHJidCwgcndzLCBpd3MsIHJ0d3MsIGl0d3MsIE4pO1xuXG4gICAgZm9yICh2YXIgcyA9IDE7IHMgPCBOOyBzIDw8PSAxKSB7XG4gICAgICB2YXIgbCA9IHMgPDwgMTtcblxuICAgICAgdmFyIHJ0d2RmID0gTWF0aC5jb3MoMiAqIE1hdGguUEkgLyBsKTtcbiAgICAgIHZhciBpdHdkZiA9IE1hdGguc2luKDIgKiBNYXRoLlBJIC8gbCk7XG5cbiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgTjsgcCArPSBsKSB7XG4gICAgICAgIHZhciBydHdkZl8gPSBydHdkZjtcbiAgICAgICAgdmFyIGl0d2RmXyA9IGl0d2RmO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgczsgaisrKSB7XG4gICAgICAgICAgdmFyIHJlID0gcnR3c1twICsgal07XG4gICAgICAgICAgdmFyIGllID0gaXR3c1twICsgal07XG5cbiAgICAgICAgICB2YXIgcm8gPSBydHdzW3AgKyBqICsgc107XG4gICAgICAgICAgdmFyIGlvID0gaXR3c1twICsgaiArIHNdO1xuXG4gICAgICAgICAgdmFyIHJ4ID0gcnR3ZGZfICogcm8gLSBpdHdkZl8gKiBpbztcblxuICAgICAgICAgIGlvID0gcnR3ZGZfICogaW8gKyBpdHdkZl8gKiBybztcbiAgICAgICAgICBybyA9IHJ4O1xuXG4gICAgICAgICAgcnR3c1twICsgal0gPSByZSArIHJvO1xuICAgICAgICAgIGl0d3NbcCArIGpdID0gaWUgKyBpbztcblxuICAgICAgICAgIHJ0d3NbcCArIGogKyBzXSA9IHJlIC0gcm87XG4gICAgICAgICAgaXR3c1twICsgaiArIHNdID0gaWUgLSBpbztcblxuICAgICAgICAgIC8qIGpzaGludCBtYXhkZXB0aCA6IGZhbHNlICovXG4gICAgICAgICAgaWYgKGogIT09IGwpIHtcbiAgICAgICAgICAgIHJ4ID0gcnR3ZGYgKiBydHdkZl8gLSBpdHdkZiAqIGl0d2RmXztcblxuICAgICAgICAgICAgaXR3ZGZfID0gcnR3ZGYgKiBpdHdkZl8gKyBpdHdkZiAqIHJ0d2RmXztcbiAgICAgICAgICAgIHJ0d2RmXyA9IHJ4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5ndWVzc0xlbjEzYiA9IGZ1bmN0aW9uIGd1ZXNzTGVuMTNiIChuLCBtKSB7XG4gICAgdmFyIE4gPSBNYXRoLm1heChtLCBuKSB8IDE7XG4gICAgdmFyIG9kZCA9IE4gJiAxO1xuICAgIHZhciBpID0gMDtcbiAgICBmb3IgKE4gPSBOIC8gMiB8IDA7IE47IE4gPSBOID4+PiAxKSB7XG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIDEgPDwgaSArIDEgKyBvZGQ7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuY29uanVnYXRlID0gZnVuY3Rpb24gY29uanVnYXRlIChyd3MsIGl3cywgTikge1xuICAgIGlmIChOIDw9IDEpIHJldHVybjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTiAvIDI7IGkrKykge1xuICAgICAgdmFyIHQgPSByd3NbaV07XG5cbiAgICAgIHJ3c1tpXSA9IHJ3c1tOIC0gaSAtIDFdO1xuICAgICAgcndzW04gLSBpIC0gMV0gPSB0O1xuXG4gICAgICB0ID0gaXdzW2ldO1xuXG4gICAgICBpd3NbaV0gPSAtaXdzW04gLSBpIC0gMV07XG4gICAgICBpd3NbTiAtIGkgLSAxXSA9IC10O1xuICAgIH1cbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5ub3JtYWxpemUxM2IgPSBmdW5jdGlvbiBub3JtYWxpemUxM2IgKHdzLCBOKSB7XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE4gLyAyOyBpKyspIHtcbiAgICAgIHZhciB3ID0gTWF0aC5yb3VuZCh3c1syICogaSArIDFdIC8gTikgKiAweDIwMDAgK1xuICAgICAgICBNYXRoLnJvdW5kKHdzWzIgKiBpXSAvIE4pICtcbiAgICAgICAgY2Fycnk7XG5cbiAgICAgIHdzW2ldID0gdyAmIDB4M2ZmZmZmZjtcblxuICAgICAgaWYgKHcgPCAweDQwMDAwMDApIHtcbiAgICAgICAgY2FycnkgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FycnkgPSB3IC8gMHg0MDAwMDAwIHwgMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gd3M7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuY29udmVydDEzYiA9IGZ1bmN0aW9uIGNvbnZlcnQxM2IgKHdzLCBsZW4sIHJ3cywgTikge1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY2FycnkgPSBjYXJyeSArICh3c1tpXSB8IDApO1xuXG4gICAgICByd3NbMiAqIGldID0gY2FycnkgJiAweDFmZmY7IGNhcnJ5ID0gY2FycnkgPj4+IDEzO1xuICAgICAgcndzWzIgKiBpICsgMV0gPSBjYXJyeSAmIDB4MWZmZjsgY2FycnkgPSBjYXJyeSA+Pj4gMTM7XG4gICAgfVxuXG4gICAgLy8gUGFkIHdpdGggemVyb2VzXG4gICAgZm9yIChpID0gMiAqIGxlbjsgaSA8IE47ICsraSkge1xuICAgICAgcndzW2ldID0gMDtcbiAgICB9XG5cbiAgICBhc3NlcnQoY2FycnkgPT09IDApO1xuICAgIGFzc2VydCgoY2FycnkgJiB+MHgxZmZmKSA9PT0gMCk7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuc3R1YiA9IGZ1bmN0aW9uIHN0dWIgKE4pIHtcbiAgICB2YXIgcGggPSBuZXcgQXJyYXkoTik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHBoW2ldID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gcGg7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUubXVscCA9IGZ1bmN0aW9uIG11bHAgKHgsIHksIG91dCkge1xuICAgIHZhciBOID0gMiAqIHRoaXMuZ3Vlc3NMZW4xM2IoeC5sZW5ndGgsIHkubGVuZ3RoKTtcblxuICAgIHZhciByYnQgPSB0aGlzLm1ha2VSQlQoTik7XG5cbiAgICB2YXIgXyA9IHRoaXMuc3R1YihOKTtcblxuICAgIHZhciByd3MgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIHJ3c3QgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIGl3c3QgPSBuZXcgQXJyYXkoTik7XG5cbiAgICB2YXIgbnJ3cyA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgbnJ3c3QgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIG5pd3N0ID0gbmV3IEFycmF5KE4pO1xuXG4gICAgdmFyIHJtd3MgPSBvdXQud29yZHM7XG4gICAgcm13cy5sZW5ndGggPSBOO1xuXG4gICAgdGhpcy5jb252ZXJ0MTNiKHgud29yZHMsIHgubGVuZ3RoLCByd3MsIE4pO1xuICAgIHRoaXMuY29udmVydDEzYih5LndvcmRzLCB5Lmxlbmd0aCwgbnJ3cywgTik7XG5cbiAgICB0aGlzLnRyYW5zZm9ybShyd3MsIF8sIHJ3c3QsIGl3c3QsIE4sIHJidCk7XG4gICAgdGhpcy50cmFuc2Zvcm0obnJ3cywgXywgbnJ3c3QsIG5pd3N0LCBOLCByYnQpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHZhciByeCA9IHJ3c3RbaV0gKiBucndzdFtpXSAtIGl3c3RbaV0gKiBuaXdzdFtpXTtcbiAgICAgIGl3c3RbaV0gPSByd3N0W2ldICogbml3c3RbaV0gKyBpd3N0W2ldICogbnJ3c3RbaV07XG4gICAgICByd3N0W2ldID0gcng7XG4gICAgfVxuXG4gICAgdGhpcy5jb25qdWdhdGUocndzdCwgaXdzdCwgTik7XG4gICAgdGhpcy50cmFuc2Zvcm0ocndzdCwgaXdzdCwgcm13cywgXywgTiwgcmJ0KTtcbiAgICB0aGlzLmNvbmp1Z2F0ZShybXdzLCBfLCBOKTtcbiAgICB0aGlzLm5vcm1hbGl6ZTEzYihybXdzLCBOKTtcblxuICAgIG91dC5uZWdhdGl2ZSA9IHgubmVnYXRpdmUgXiB5Lm5lZ2F0aXZlO1xuICAgIG91dC5sZW5ndGggPSB4Lmxlbmd0aCArIHkubGVuZ3RoO1xuICAgIHJldHVybiBvdXQuc3RyaXAoKTtcbiAgfTtcblxuICAvLyBNdWx0aXBseSBgdGhpc2AgYnkgYG51bWBcbiAgQk4ucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bCAobnVtKSB7XG4gICAgdmFyIG91dCA9IG5ldyBCTihudWxsKTtcbiAgICBvdXQud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGggKyBudW0ubGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpcy5tdWxUbyhudW0sIG91dCk7XG4gIH07XG5cbiAgLy8gTXVsdGlwbHkgZW1wbG95aW5nIEZGVFxuICBCTi5wcm90b3R5cGUubXVsZiA9IGZ1bmN0aW9uIG11bGYgKG51bSkge1xuICAgIHZhciBvdXQgPSBuZXcgQk4obnVsbCk7XG4gICAgb3V0LndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoICsgbnVtLmxlbmd0aCk7XG4gICAgcmV0dXJuIGp1bWJvTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICB9O1xuXG4gIC8vIEluLXBsYWNlIE11bHRpcGxpY2F0aW9uXG4gIEJOLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24gaW11bCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5tdWxUbyhudW0sIHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pbXVsbiA9IGZ1bmN0aW9uIGltdWxuIChudW0pIHtcbiAgICBhc3NlcnQodHlwZW9mIG51bSA9PT0gJ251bWJlcicpO1xuICAgIGFzc2VydChudW0gPCAweDQwMDAwMDApO1xuXG4gICAgLy8gQ2FycnlcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHcgPSAodGhpcy53b3Jkc1tpXSB8IDApICogbnVtO1xuICAgICAgdmFyIGxvID0gKHcgJiAweDNmZmZmZmYpICsgKGNhcnJ5ICYgMHgzZmZmZmZmKTtcbiAgICAgIGNhcnJ5ID4+PSAyNjtcbiAgICAgIGNhcnJ5ICs9ICh3IC8gMHg0MDAwMDAwKSB8IDA7XG4gICAgICAvLyBOT1RFOiBsbyBpcyAyN2JpdCBtYXhpbXVtXG4gICAgICBjYXJyeSArPSBsbyA+Pj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gbG8gJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gY2Fycnk7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IG51bSA9PT0gMCA/IDEgOiB0aGlzLmxlbmd0aDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5tdWxuID0gZnVuY3Rpb24gbXVsbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbihudW0pO1xuICB9O1xuXG4gIC8vIGB0aGlzYCAqIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuc3FyID0gZnVuY3Rpb24gc3FyICgpIHtcbiAgICByZXR1cm4gdGhpcy5tdWwodGhpcyk7XG4gIH07XG5cbiAgLy8gYHRoaXNgICogYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pc3FyID0gZnVuY3Rpb24gaXNxciAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW11bCh0aGlzLmNsb25lKCkpO1xuICB9O1xuXG4gIC8vIE1hdGgucG93KGB0aGlzYCwgYG51bWApXG4gIEJOLnByb3RvdHlwZS5wb3cgPSBmdW5jdGlvbiBwb3cgKG51bSkge1xuICAgIHZhciB3ID0gdG9CaXRBcnJheShudW0pO1xuICAgIGlmICh3Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ldyBCTigxKTtcblxuICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXNcbiAgICB2YXIgcmVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHcubGVuZ3RoOyBpKyssIHJlcyA9IHJlcy5zcXIoKSkge1xuICAgICAgaWYgKHdbaV0gIT09IDApIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICgrK2kgPCB3Lmxlbmd0aCkge1xuICAgICAgZm9yICh2YXIgcSA9IHJlcy5zcXIoKTsgaSA8IHcubGVuZ3RoOyBpKyssIHEgPSBxLnNxcigpKSB7XG4gICAgICAgIGlmICh3W2ldID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICByZXMgPSByZXMubXVsKHEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gU2hpZnQtbGVmdCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXVzaGxuID0gZnVuY3Rpb24gaXVzaGxuIChiaXRzKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXRzID09PSAnbnVtYmVyJyAmJiBiaXRzID49IDApO1xuICAgIHZhciByID0gYml0cyAlIDI2O1xuICAgIHZhciBzID0gKGJpdHMgLSByKSAvIDI2O1xuICAgIHZhciBjYXJyeU1hc2sgPSAoMHgzZmZmZmZmID4+PiAoMjYgLSByKSkgPDwgKDI2IC0gcik7XG4gICAgdmFyIGk7XG5cbiAgICBpZiAociAhPT0gMCkge1xuICAgICAgdmFyIGNhcnJ5ID0gMDtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5ld0NhcnJ5ID0gdGhpcy53b3Jkc1tpXSAmIGNhcnJ5TWFzaztcbiAgICAgICAgdmFyIGMgPSAoKHRoaXMud29yZHNbaV0gfCAwKSAtIG5ld0NhcnJ5KSA8PCByO1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYyB8IGNhcnJ5O1xuICAgICAgICBjYXJyeSA9IG5ld0NhcnJ5ID4+PiAoMjYgLSByKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhcnJ5KSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBjYXJyeTtcbiAgICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocyAhPT0gMCkge1xuICAgICAgZm9yIChpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB0aGlzLndvcmRzW2kgKyBzXSA9IHRoaXMud29yZHNbaV07XG4gICAgICB9XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGVuZ3RoICs9IHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNobG4gPSBmdW5jdGlvbiBpc2hsbiAoYml0cykge1xuICAgIC8vIFRPRE8oaW5kdXRueSk6IGltcGxlbWVudCBtZVxuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdXNobG4oYml0cyk7XG4gIH07XG5cbiAgLy8gU2hpZnQtcmlnaHQgaW4tcGxhY2VcbiAgLy8gTk9URTogYGhpbnRgIGlzIGEgbG93ZXN0IGJpdCBiZWZvcmUgdHJhaWxpbmcgemVyb2VzXG4gIC8vIE5PVEU6IGlmIGBleHRlbmRlZGAgaXMgcHJlc2VudCAtIGl0IHdpbGwgYmUgZmlsbGVkIHdpdGggZGVzdHJveWVkIGJpdHNcbiAgQk4ucHJvdG90eXBlLml1c2hybiA9IGZ1bmN0aW9uIGl1c2hybiAoYml0cywgaGludCwgZXh0ZW5kZWQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdHMgPT09ICdudW1iZXInICYmIGJpdHMgPj0gMCk7XG4gICAgdmFyIGg7XG4gICAgaWYgKGhpbnQpIHtcbiAgICAgIGggPSAoaGludCAtIChoaW50ICUgMjYpKSAvIDI2O1xuICAgIH0gZWxzZSB7XG4gICAgICBoID0gMDtcbiAgICB9XG5cbiAgICB2YXIgciA9IGJpdHMgJSAyNjtcbiAgICB2YXIgcyA9IE1hdGgubWluKChiaXRzIC0gcikgLyAyNiwgdGhpcy5sZW5ndGgpO1xuICAgIHZhciBtYXNrID0gMHgzZmZmZmZmIF4gKCgweDNmZmZmZmYgPj4+IHIpIDw8IHIpO1xuICAgIHZhciBtYXNrZWRXb3JkcyA9IGV4dGVuZGVkO1xuXG4gICAgaCAtPSBzO1xuICAgIGggPSBNYXRoLm1heCgwLCBoKTtcblxuICAgIC8vIEV4dGVuZGVkIG1vZGUsIGNvcHkgbWFza2VkIHBhcnRcbiAgICBpZiAobWFza2VkV29yZHMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgICAgIG1hc2tlZFdvcmRzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICAgIG1hc2tlZFdvcmRzLmxlbmd0aCA9IHM7XG4gICAgfVxuXG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgIC8vIE5vLW9wLCB3ZSBzaG91bGQgbm90IG1vdmUgYW55dGhpbmcgYXQgYWxsXG4gICAgfSBlbHNlIGlmICh0aGlzLmxlbmd0aCA+IHMpIHtcbiAgICAgIHRoaXMubGVuZ3RoIC09IHM7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpICsgc107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAwO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgIH1cblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yIChpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDAgJiYgKGNhcnJ5ICE9PSAwIHx8IGkgPj0gaCk7IGktLSkge1xuICAgICAgdmFyIHdvcmQgPSB0aGlzLndvcmRzW2ldIHwgMDtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAoY2FycnkgPDwgKDI2IC0gcikpIHwgKHdvcmQgPj4+IHIpO1xuICAgICAgY2FycnkgPSB3b3JkICYgbWFzaztcbiAgICB9XG5cbiAgICAvLyBQdXNoIGNhcnJpZWQgYml0cyBhcyBhIG1hc2tcbiAgICBpZiAobWFza2VkV29yZHMgJiYgY2FycnkgIT09IDApIHtcbiAgICAgIG1hc2tlZFdvcmRzLndvcmRzW21hc2tlZFdvcmRzLmxlbmd0aCsrXSA9IGNhcnJ5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1swXSA9IDA7XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNocm4gPSBmdW5jdGlvbiBpc2hybiAoYml0cywgaGludCwgZXh0ZW5kZWQpIHtcbiAgICAvLyBUT0RPKGluZHV0bnkpOiBpbXBsZW1lbnQgbWVcbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXVzaHJuKGJpdHMsIGhpbnQsIGV4dGVuZGVkKTtcbiAgfTtcblxuICAvLyBTaGlmdC1sZWZ0XG4gIEJOLnByb3RvdHlwZS5zaGxuID0gZnVuY3Rpb24gc2hsbiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXNobG4oYml0cyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVzaGxuID0gZnVuY3Rpb24gdXNobG4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hsbihiaXRzKTtcbiAgfTtcblxuICAvLyBTaGlmdC1yaWdodFxuICBCTi5wcm90b3R5cGUuc2hybiA9IGZ1bmN0aW9uIHNocm4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaHJuKGJpdHMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51c2hybiA9IGZ1bmN0aW9uIHVzaHJuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNocm4oYml0cyk7XG4gIH07XG5cbiAgLy8gVGVzdCBpZiBuIGJpdCBpcyBzZXRcbiAgQk4ucHJvdG90eXBlLnRlc3RuID0gZnVuY3Rpb24gdGVzdG4gKGJpdCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0ID09PSAnbnVtYmVyJyAmJiBiaXQgPj0gMCk7XG4gICAgdmFyIHIgPSBiaXQgJSAyNjtcbiAgICB2YXIgcyA9IChiaXQgLSByKSAvIDI2O1xuICAgIHZhciBxID0gMSA8PCByO1xuXG4gICAgLy8gRmFzdCBjYXNlOiBiaXQgaXMgbXVjaCBoaWdoZXIgdGhhbiBhbGwgZXhpc3Rpbmcgd29yZHNcbiAgICBpZiAodGhpcy5sZW5ndGggPD0gcykgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gQ2hlY2sgYml0IGFuZCByZXR1cm5cbiAgICB2YXIgdyA9IHRoaXMud29yZHNbc107XG5cbiAgICByZXR1cm4gISEodyAmIHEpO1xuICB9O1xuXG4gIC8vIFJldHVybiBvbmx5IGxvd2VycyBiaXRzIG9mIG51bWJlciAoaW4tcGxhY2UpXG4gIEJOLnByb3RvdHlwZS5pbWFza24gPSBmdW5jdGlvbiBpbWFza24gKGJpdHMpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdHMgPT09ICdudW1iZXInICYmIGJpdHMgPj0gMCk7XG4gICAgdmFyIHIgPSBiaXRzICUgMjY7XG4gICAgdmFyIHMgPSAoYml0cyAtIHIpIC8gMjY7XG5cbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCwgJ2ltYXNrbiB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmUgbnVtYmVycycpO1xuXG4gICAgaWYgKHRoaXMubGVuZ3RoIDw9IHMpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmIChyICE9PSAwKSB7XG4gICAgICBzKys7XG4gICAgfVxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5taW4ocywgdGhpcy5sZW5ndGgpO1xuXG4gICAgaWYgKHIgIT09IDApIHtcbiAgICAgIHZhciBtYXNrID0gMHgzZmZmZmZmIF4gKCgweDNmZmZmZmYgPj4+IHIpIDw8IHIpO1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdICY9IG1hc2s7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gb25seSBsb3dlcnMgYml0cyBvZiBudW1iZXJcbiAgQk4ucHJvdG90eXBlLm1hc2tuID0gZnVuY3Rpb24gbWFza24gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmltYXNrbihiaXRzKTtcbiAgfTtcblxuICAvLyBBZGQgcGxhaW4gbnVtYmVyIGBudW1gIHRvIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuaWFkZG4gPSBmdW5jdGlvbiBpYWRkbiAobnVtKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBudW0gPT09ICdudW1iZXInKTtcbiAgICBhc3NlcnQobnVtIDwgMHg0MDAwMDAwKTtcbiAgICBpZiAobnVtIDwgMCkgcmV0dXJuIHRoaXMuaXN1Ym4oLW51bSk7XG5cbiAgICAvLyBQb3NzaWJsZSBzaWduIGNoYW5nZVxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBpZiAodGhpcy5sZW5ndGggPT09IDEgJiYgKHRoaXMud29yZHNbMF0gfCAwKSA8IG51bSkge1xuICAgICAgICB0aGlzLndvcmRzWzBdID0gbnVtIC0gKHRoaXMud29yZHNbMF0gfCAwKTtcbiAgICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHRoaXMuaXN1Ym4obnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIHdpdGhvdXQgY2hlY2tzXG4gICAgcmV0dXJuIHRoaXMuX2lhZGRuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pYWRkbiA9IGZ1bmN0aW9uIF9pYWRkbiAobnVtKSB7XG4gICAgdGhpcy53b3Jkc1swXSArPSBudW07XG5cbiAgICAvLyBDYXJyeVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGggJiYgdGhpcy53b3Jkc1tpXSA+PSAweDQwMDAwMDA7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSAtPSAweDQwMDAwMDA7XG4gICAgICBpZiAoaSA9PT0gdGhpcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHRoaXMud29yZHNbaSArIDFdID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMud29yZHNbaSArIDFdKys7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5sZW5ndGgsIGkgKyAxKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIFN1YnRyYWN0IHBsYWluIG51bWJlciBgbnVtYCBmcm9tIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuaXN1Ym4gPSBmdW5jdGlvbiBpc3VibiAobnVtKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBudW0gPT09ICdudW1iZXInKTtcbiAgICBhc3NlcnQobnVtIDwgMHg0MDAwMDAwKTtcbiAgICBpZiAobnVtIDwgMCkgcmV0dXJuIHRoaXMuaWFkZG4oLW51bSk7XG5cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmlhZGRuKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMud29yZHNbMF0gLT0gbnVtO1xuXG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPCAwKSB7XG4gICAgICB0aGlzLndvcmRzWzBdID0gLXRoaXMud29yZHNbMF07XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FycnlcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGggJiYgdGhpcy53b3Jkc1tpXSA8IDA7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldICs9IDB4NDAwMDAwMDtcbiAgICAgICAgdGhpcy53b3Jkc1tpICsgMV0gLT0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5hZGRuID0gZnVuY3Rpb24gYWRkbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkbihudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5zdWJuID0gZnVuY3Rpb24gc3VibiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc3VibihudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pYWJzID0gZnVuY3Rpb24gaWFicyAoKSB7XG4gICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuYWJzID0gZnVuY3Rpb24gYWJzICgpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlhYnMoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2lzaGxuc3VibXVsID0gZnVuY3Rpb24gX2lzaGxuc3VibXVsIChudW0sIG11bCwgc2hpZnQpIHtcbiAgICB2YXIgbGVuID0gbnVtLmxlbmd0aCArIHNoaWZ0O1xuICAgIHZhciBpO1xuXG4gICAgdGhpcy5fZXhwYW5kKGxlbik7XG5cbiAgICB2YXIgdztcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHcgPSAodGhpcy53b3Jkc1tpICsgc2hpZnRdIHwgMCkgKyBjYXJyeTtcbiAgICAgIHZhciByaWdodCA9IChudW0ud29yZHNbaV0gfCAwKSAqIG11bDtcbiAgICAgIHcgLT0gcmlnaHQgJiAweDNmZmZmZmY7XG4gICAgICBjYXJyeSA9ICh3ID4+IDI2KSAtICgocmlnaHQgLyAweDQwMDAwMDApIHwgMCk7XG4gICAgICB0aGlzLndvcmRzW2kgKyBzaGlmdF0gPSB3ICYgMHgzZmZmZmZmO1xuICAgIH1cbiAgICBmb3IgKDsgaSA8IHRoaXMubGVuZ3RoIC0gc2hpZnQ7IGkrKykge1xuICAgICAgdyA9ICh0aGlzLndvcmRzW2kgKyBzaGlmdF0gfCAwKSArIGNhcnJ5O1xuICAgICAgY2FycnkgPSB3ID4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpICsgc2hpZnRdID0gdyAmIDB4M2ZmZmZmZjtcbiAgICB9XG5cbiAgICBpZiAoY2FycnkgPT09IDApIHJldHVybiB0aGlzLnN0cmlwKCk7XG5cbiAgICAvLyBTdWJ0cmFjdGlvbiBvdmVyZmxvd1xuICAgIGFzc2VydChjYXJyeSA9PT0gLTEpO1xuICAgIGNhcnJ5ID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdyA9IC0odGhpcy53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHcgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdyAmIDB4M2ZmZmZmZjtcbiAgICB9XG4gICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fd29yZERpdiA9IGZ1bmN0aW9uIF93b3JkRGl2IChudW0sIG1vZGUpIHtcbiAgICB2YXIgc2hpZnQgPSB0aGlzLmxlbmd0aCAtIG51bS5sZW5ndGg7XG5cbiAgICB2YXIgYSA9IHRoaXMuY2xvbmUoKTtcbiAgICB2YXIgYiA9IG51bTtcblxuICAgIC8vIE5vcm1hbGl6ZVxuICAgIHZhciBiaGkgPSBiLndvcmRzW2IubGVuZ3RoIC0gMV0gfCAwO1xuICAgIHZhciBiaGlCaXRzID0gdGhpcy5fY291bnRCaXRzKGJoaSk7XG4gICAgc2hpZnQgPSAyNiAtIGJoaUJpdHM7XG4gICAgaWYgKHNoaWZ0ICE9PSAwKSB7XG4gICAgICBiID0gYi51c2hsbihzaGlmdCk7XG4gICAgICBhLml1c2hsbihzaGlmdCk7XG4gICAgICBiaGkgPSBiLndvcmRzW2IubGVuZ3RoIC0gMV0gfCAwO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgcXVvdGllbnRcbiAgICB2YXIgbSA9IGEubGVuZ3RoIC0gYi5sZW5ndGg7XG4gICAgdmFyIHE7XG5cbiAgICBpZiAobW9kZSAhPT0gJ21vZCcpIHtcbiAgICAgIHEgPSBuZXcgQk4obnVsbCk7XG4gICAgICBxLmxlbmd0aCA9IG0gKyAxO1xuICAgICAgcS53b3JkcyA9IG5ldyBBcnJheShxLmxlbmd0aCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcS53b3Jkc1tpXSA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRpZmYgPSBhLmNsb25lKCkuX2lzaGxuc3VibXVsKGIsIDEsIG0pO1xuICAgIGlmIChkaWZmLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICBhID0gZGlmZjtcbiAgICAgIGlmIChxKSB7XG4gICAgICAgIHEud29yZHNbbV0gPSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGogPSBtIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgIHZhciBxaiA9IChhLndvcmRzW2IubGVuZ3RoICsgal0gfCAwKSAqIDB4NDAwMDAwMCArXG4gICAgICAgIChhLndvcmRzW2IubGVuZ3RoICsgaiAtIDFdIHwgMCk7XG5cbiAgICAgIC8vIE5PVEU6IChxaiAvIGJoaSkgaXMgKDB4M2ZmZmZmZiAqIDB4NDAwMDAwMCArIDB4M2ZmZmZmZikgLyAweDIwMDAwMDAgbWF4XG4gICAgICAvLyAoMHg3ZmZmZmZmKVxuICAgICAgcWogPSBNYXRoLm1pbigocWogLyBiaGkpIHwgMCwgMHgzZmZmZmZmKTtcblxuICAgICAgYS5faXNobG5zdWJtdWwoYiwgcWosIGopO1xuICAgICAgd2hpbGUgKGEubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgcWotLTtcbiAgICAgICAgYS5uZWdhdGl2ZSA9IDA7XG4gICAgICAgIGEuX2lzaGxuc3VibXVsKGIsIDEsIGopO1xuICAgICAgICBpZiAoIWEuaXNaZXJvKCkpIHtcbiAgICAgICAgICBhLm5lZ2F0aXZlIF49IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChxKSB7XG4gICAgICAgIHEud29yZHNbal0gPSBxajtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHEpIHtcbiAgICAgIHEuc3RyaXAoKTtcbiAgICB9XG4gICAgYS5zdHJpcCgpO1xuXG4gICAgLy8gRGVub3JtYWxpemVcbiAgICBpZiAobW9kZSAhPT0gJ2RpdicgJiYgc2hpZnQgIT09IDApIHtcbiAgICAgIGEuaXVzaHJuKHNoaWZ0KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGl2OiBxIHx8IG51bGwsXG4gICAgICBtb2Q6IGFcbiAgICB9O1xuICB9O1xuXG4gIC8vIE5PVEU6IDEpIGBtb2RlYCBjYW4gYmUgc2V0IHRvIGBtb2RgIHRvIHJlcXVlc3QgbW9kIG9ubHksXG4gIC8vICAgICAgIHRvIGBkaXZgIHRvIHJlcXVlc3QgZGl2IG9ubHksIG9yIGJlIGFic2VudCB0b1xuICAvLyAgICAgICByZXF1ZXN0IGJvdGggZGl2ICYgbW9kXG4gIC8vICAgICAgIDIpIGBwb3NpdGl2ZWAgaXMgdHJ1ZSBpZiB1bnNpZ25lZCBtb2QgaXMgcmVxdWVzdGVkXG4gIEJOLnByb3RvdHlwZS5kaXZtb2QgPSBmdW5jdGlvbiBkaXZtb2QgKG51bSwgbW9kZSwgcG9zaXRpdmUpIHtcbiAgICBhc3NlcnQoIW51bS5pc1plcm8oKSk7XG5cbiAgICBpZiAodGhpcy5pc1plcm8oKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiBuZXcgQk4oMCksXG4gICAgICAgIG1vZDogbmV3IEJOKDApXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBkaXYsIG1vZCwgcmVzO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIG51bS5uZWdhdGl2ZSA9PT0gMCkge1xuICAgICAgcmVzID0gdGhpcy5uZWcoKS5kaXZtb2QobnVtLCBtb2RlKTtcblxuICAgICAgaWYgKG1vZGUgIT09ICdtb2QnKSB7XG4gICAgICAgIGRpdiA9IHJlcy5kaXYubmVnKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2RlICE9PSAnZGl2Jykge1xuICAgICAgICBtb2QgPSByZXMubW9kLm5lZygpO1xuICAgICAgICBpZiAocG9zaXRpdmUgJiYgbW9kLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgICAgbW9kLmlhZGQobnVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IGRpdixcbiAgICAgICAgbW9kOiBtb2RcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbnVtLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICByZXMgPSB0aGlzLmRpdm1vZChudW0ubmVnKCksIG1vZGUpO1xuXG4gICAgICBpZiAobW9kZSAhPT0gJ21vZCcpIHtcbiAgICAgICAgZGl2ID0gcmVzLmRpdi5uZWcoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiBkaXYsXG4gICAgICAgIG1vZDogcmVzLm1vZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoKHRoaXMubmVnYXRpdmUgJiBudW0ubmVnYXRpdmUpICE9PSAwKSB7XG4gICAgICByZXMgPSB0aGlzLm5lZygpLmRpdm1vZChudW0ubmVnKCksIG1vZGUpO1xuXG4gICAgICBpZiAobW9kZSAhPT0gJ2RpdicpIHtcbiAgICAgICAgbW9kID0gcmVzLm1vZC5uZWcoKTtcbiAgICAgICAgaWYgKHBvc2l0aXZlICYmIG1vZC5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICAgIG1vZC5pc3ViKG51bSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiByZXMuZGl2LFxuICAgICAgICBtb2Q6IG1vZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBCb3RoIG51bWJlcnMgYXJlIHBvc2l0aXZlIGF0IHRoaXMgcG9pbnRcblxuICAgIC8vIFN0cmlwIGJvdGggbnVtYmVycyB0byBhcHByb3hpbWF0ZSBzaGlmdCB2YWx1ZVxuICAgIGlmIChudW0ubGVuZ3RoID4gdGhpcy5sZW5ndGggfHwgdGhpcy5jbXAobnVtKSA8IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogbmV3IEJOKDApLFxuICAgICAgICBtb2Q6IHRoaXNcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVmVyeSBzaG9ydCByZWR1Y3Rpb25cbiAgICBpZiAobnVtLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKG1vZGUgPT09ICdkaXYnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGl2OiB0aGlzLmRpdm4obnVtLndvcmRzWzBdKSxcbiAgICAgICAgICBtb2Q6IG51bGxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGUgPT09ICdtb2QnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGl2OiBudWxsLFxuICAgICAgICAgIG1vZDogbmV3IEJOKHRoaXMubW9kbihudW0ud29yZHNbMF0pKVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IHRoaXMuZGl2bihudW0ud29yZHNbMF0pLFxuICAgICAgICBtb2Q6IG5ldyBCTih0aGlzLm1vZG4obnVtLndvcmRzWzBdKSlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3dvcmREaXYobnVtLCBtb2RlKTtcbiAgfTtcblxuICAvLyBGaW5kIGB0aGlzYCAvIGBudW1gXG4gIEJOLnByb3RvdHlwZS5kaXYgPSBmdW5jdGlvbiBkaXYgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmRpdm1vZChudW0sICdkaXYnLCBmYWxzZSkuZGl2O1xuICB9O1xuXG4gIC8vIEZpbmQgYHRoaXNgICUgYG51bWBcbiAgQk4ucHJvdG90eXBlLm1vZCA9IGZ1bmN0aW9uIG1vZCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2bW9kKG51bSwgJ21vZCcsIGZhbHNlKS5tb2Q7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVtb2QgPSBmdW5jdGlvbiB1bW9kIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5kaXZtb2QobnVtLCAnbW9kJywgdHJ1ZSkubW9kO1xuICB9O1xuXG4gIC8vIEZpbmQgUm91bmQoYHRoaXNgIC8gYG51bWApXG4gIEJOLnByb3RvdHlwZS5kaXZSb3VuZCA9IGZ1bmN0aW9uIGRpdlJvdW5kIChudW0pIHtcbiAgICB2YXIgZG0gPSB0aGlzLmRpdm1vZChudW0pO1xuXG4gICAgLy8gRmFzdCBjYXNlIC0gZXhhY3QgZGl2aXNpb25cbiAgICBpZiAoZG0ubW9kLmlzWmVybygpKSByZXR1cm4gZG0uZGl2O1xuXG4gICAgdmFyIG1vZCA9IGRtLmRpdi5uZWdhdGl2ZSAhPT0gMCA/IGRtLm1vZC5pc3ViKG51bSkgOiBkbS5tb2Q7XG5cbiAgICB2YXIgaGFsZiA9IG51bS51c2hybigxKTtcbiAgICB2YXIgcjIgPSBudW0uYW5kbG4oMSk7XG4gICAgdmFyIGNtcCA9IG1vZC5jbXAoaGFsZik7XG5cbiAgICAvLyBSb3VuZCBkb3duXG4gICAgaWYgKGNtcCA8IDAgfHwgcjIgPT09IDEgJiYgY21wID09PSAwKSByZXR1cm4gZG0uZGl2O1xuXG4gICAgLy8gUm91bmQgdXBcbiAgICByZXR1cm4gZG0uZGl2Lm5lZ2F0aXZlICE9PSAwID8gZG0uZGl2LmlzdWJuKDEpIDogZG0uZGl2LmlhZGRuKDEpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5tb2RuID0gZnVuY3Rpb24gbW9kbiAobnVtKSB7XG4gICAgYXNzZXJ0KG51bSA8PSAweDNmZmZmZmYpO1xuICAgIHZhciBwID0gKDEgPDwgMjYpICUgbnVtO1xuXG4gICAgdmFyIGFjYyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGFjYyA9IChwICogYWNjICsgKHRoaXMud29yZHNbaV0gfCAwKSkgJSBudW07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcbiAgfTtcblxuICAvLyBJbi1wbGFjZSBkaXZpc2lvbiBieSBudW1iZXJcbiAgQk4ucHJvdG90eXBlLmlkaXZuID0gZnVuY3Rpb24gaWRpdm4gKG51bSkge1xuICAgIGFzc2VydChudW0gPD0gMHgzZmZmZmZmKTtcblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciB3ID0gKHRoaXMud29yZHNbaV0gfCAwKSArIGNhcnJ5ICogMHg0MDAwMDAwO1xuICAgICAgdGhpcy53b3Jkc1tpXSA9ICh3IC8gbnVtKSB8IDA7XG4gICAgICBjYXJyeSA9IHcgJSBudW07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZGl2biA9IGZ1bmN0aW9uIGRpdm4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWRpdm4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZWdjZCA9IGZ1bmN0aW9uIGVnY2QgKHApIHtcbiAgICBhc3NlcnQocC5uZWdhdGl2ZSA9PT0gMCk7XG4gICAgYXNzZXJ0KCFwLmlzWmVybygpKTtcblxuICAgIHZhciB4ID0gdGhpcztcbiAgICB2YXIgeSA9IHAuY2xvbmUoKTtcblxuICAgIGlmICh4Lm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICB4ID0geC51bW9kKHApO1xuICAgIH0gZWxzZSB7XG4gICAgICB4ID0geC5jbG9uZSgpO1xuICAgIH1cblxuICAgIC8vIEEgKiB4ICsgQiAqIHkgPSB4XG4gICAgdmFyIEEgPSBuZXcgQk4oMSk7XG4gICAgdmFyIEIgPSBuZXcgQk4oMCk7XG5cbiAgICAvLyBDICogeCArIEQgKiB5ID0geVxuICAgIHZhciBDID0gbmV3IEJOKDApO1xuICAgIHZhciBEID0gbmV3IEJOKDEpO1xuXG4gICAgdmFyIGcgPSAwO1xuXG4gICAgd2hpbGUgKHguaXNFdmVuKCkgJiYgeS5pc0V2ZW4oKSkge1xuICAgICAgeC5pdXNocm4oMSk7XG4gICAgICB5Lml1c2hybigxKTtcbiAgICAgICsrZztcbiAgICB9XG5cbiAgICB2YXIgeXAgPSB5LmNsb25lKCk7XG4gICAgdmFyIHhwID0geC5jbG9uZSgpO1xuXG4gICAgd2hpbGUgKCF4LmlzWmVybygpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaW0gPSAxOyAoeC53b3Jkc1swXSAmIGltKSA9PT0gMCAmJiBpIDwgMjY7ICsraSwgaW0gPDw9IDEpO1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIHguaXVzaHJuKGkpO1xuICAgICAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgICAgIGlmIChBLmlzT2RkKCkgfHwgQi5pc09kZCgpKSB7XG4gICAgICAgICAgICBBLmlhZGQoeXApO1xuICAgICAgICAgICAgQi5pc3ViKHhwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBBLml1c2hybigxKTtcbiAgICAgICAgICBCLml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBqID0gMCwgam0gPSAxOyAoeS53b3Jkc1swXSAmIGptKSA9PT0gMCAmJiBqIDwgMjY7ICsraiwgam0gPDw9IDEpO1xuICAgICAgaWYgKGogPiAwKSB7XG4gICAgICAgIHkuaXVzaHJuKGopO1xuICAgICAgICB3aGlsZSAoai0tID4gMCkge1xuICAgICAgICAgIGlmIChDLmlzT2RkKCkgfHwgRC5pc09kZCgpKSB7XG4gICAgICAgICAgICBDLmlhZGQoeXApO1xuICAgICAgICAgICAgRC5pc3ViKHhwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBDLml1c2hybigxKTtcbiAgICAgICAgICBELml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoeC5jbXAoeSkgPj0gMCkge1xuICAgICAgICB4LmlzdWIoeSk7XG4gICAgICAgIEEuaXN1YihDKTtcbiAgICAgICAgQi5pc3ViKEQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeS5pc3ViKHgpO1xuICAgICAgICBDLmlzdWIoQSk7XG4gICAgICAgIEQuaXN1YihCKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYTogQyxcbiAgICAgIGI6IEQsXG4gICAgICBnY2Q6IHkuaXVzaGxuKGcpXG4gICAgfTtcbiAgfTtcblxuICAvLyBUaGlzIGlzIHJlZHVjZWQgaW5jYXJuYXRpb24gb2YgdGhlIGJpbmFyeSBFRUFcbiAgLy8gYWJvdmUsIGRlc2lnbmF0ZWQgdG8gaW52ZXJ0IG1lbWJlcnMgb2YgdGhlXG4gIC8vIF9wcmltZV8gZmllbGRzIEYocCkgYXQgYSBtYXhpbWFsIHNwZWVkXG4gIEJOLnByb3RvdHlwZS5faW52bXAgPSBmdW5jdGlvbiBfaW52bXAgKHApIHtcbiAgICBhc3NlcnQocC5uZWdhdGl2ZSA9PT0gMCk7XG4gICAgYXNzZXJ0KCFwLmlzWmVybygpKTtcblxuICAgIHZhciBhID0gdGhpcztcbiAgICB2YXIgYiA9IHAuY2xvbmUoKTtcblxuICAgIGlmIChhLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBhID0gYS51bW9kKHApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gYS5jbG9uZSgpO1xuICAgIH1cblxuICAgIHZhciB4MSA9IG5ldyBCTigxKTtcbiAgICB2YXIgeDIgPSBuZXcgQk4oMCk7XG5cbiAgICB2YXIgZGVsdGEgPSBiLmNsb25lKCk7XG5cbiAgICB3aGlsZSAoYS5jbXBuKDEpID4gMCAmJiBiLmNtcG4oMSkgPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaW0gPSAxOyAoYS53b3Jkc1swXSAmIGltKSA9PT0gMCAmJiBpIDwgMjY7ICsraSwgaW0gPDw9IDEpO1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGEuaXVzaHJuKGkpO1xuICAgICAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgICAgIGlmICh4MS5pc09kZCgpKSB7XG4gICAgICAgICAgICB4MS5pYWRkKGRlbHRhKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB4MS5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaiA9IDAsIGptID0gMTsgKGIud29yZHNbMF0gJiBqbSkgPT09IDAgJiYgaiA8IDI2OyArK2osIGptIDw8PSAxKTtcbiAgICAgIGlmIChqID4gMCkge1xuICAgICAgICBiLml1c2hybihqKTtcbiAgICAgICAgd2hpbGUgKGotLSA+IDApIHtcbiAgICAgICAgICBpZiAoeDIuaXNPZGQoKSkge1xuICAgICAgICAgICAgeDIuaWFkZChkZWx0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgeDIuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhLmNtcChiKSA+PSAwKSB7XG4gICAgICAgIGEuaXN1YihiKTtcbiAgICAgICAgeDEuaXN1Yih4Mik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiLmlzdWIoYSk7XG4gICAgICAgIHgyLmlzdWIoeDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZXM7XG4gICAgaWYgKGEuY21wbigxKSA9PT0gMCkge1xuICAgICAgcmVzID0geDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IHgyO1xuICAgIH1cblxuICAgIGlmIChyZXMuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcy5pYWRkKHApO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmdjZCA9IGZ1bmN0aW9uIGdjZCAobnVtKSB7XG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpIHJldHVybiBudW0uYWJzKCk7XG4gICAgaWYgKG51bS5pc1plcm8oKSkgcmV0dXJuIHRoaXMuYWJzKCk7XG5cbiAgICB2YXIgYSA9IHRoaXMuY2xvbmUoKTtcbiAgICB2YXIgYiA9IG51bS5jbG9uZSgpO1xuICAgIGEubmVnYXRpdmUgPSAwO1xuICAgIGIubmVnYXRpdmUgPSAwO1xuXG4gICAgLy8gUmVtb3ZlIGNvbW1vbiBmYWN0b3Igb2YgdHdvXG4gICAgZm9yICh2YXIgc2hpZnQgPSAwOyBhLmlzRXZlbigpICYmIGIuaXNFdmVuKCk7IHNoaWZ0KyspIHtcbiAgICAgIGEuaXVzaHJuKDEpO1xuICAgICAgYi5pdXNocm4oMSk7XG4gICAgfVxuXG4gICAgZG8ge1xuICAgICAgd2hpbGUgKGEuaXNFdmVuKCkpIHtcbiAgICAgICAgYS5pdXNocm4oMSk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoYi5pc0V2ZW4oKSkge1xuICAgICAgICBiLml1c2hybigxKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHIgPSBhLmNtcChiKTtcbiAgICAgIGlmIChyIDwgMCkge1xuICAgICAgICAvLyBTd2FwIGBhYCBhbmQgYGJgIHRvIG1ha2UgYGFgIGFsd2F5cyBiaWdnZXIgdGhhbiBgYmBcbiAgICAgICAgdmFyIHQgPSBhO1xuICAgICAgICBhID0gYjtcbiAgICAgICAgYiA9IHQ7XG4gICAgICB9IGVsc2UgaWYgKHIgPT09IDAgfHwgYi5jbXBuKDEpID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBhLmlzdWIoYik7XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgICByZXR1cm4gYi5pdXNobG4oc2hpZnQpO1xuICB9O1xuXG4gIC8vIEludmVydCBudW1iZXIgaW4gdGhlIGZpZWxkIEYobnVtKVxuICBCTi5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uIGludm0gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmVnY2QobnVtKS5hLnVtb2QobnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNFdmVuID0gZnVuY3Rpb24gaXNFdmVuICgpIHtcbiAgICByZXR1cm4gKHRoaXMud29yZHNbMF0gJiAxKSA9PT0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNPZGQgPSBmdW5jdGlvbiBpc09kZCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLndvcmRzWzBdICYgMSkgPT09IDE7XG4gIH07XG5cbiAgLy8gQW5kIGZpcnN0IHdvcmQgYW5kIG51bVxuICBCTi5wcm90b3R5cGUuYW5kbG4gPSBmdW5jdGlvbiBhbmRsbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMud29yZHNbMF0gJiBudW07XG4gIH07XG5cbiAgLy8gSW5jcmVtZW50IGF0IHRoZSBiaXQgcG9zaXRpb24gaW4tbGluZVxuICBCTi5wcm90b3R5cGUuYmluY24gPSBmdW5jdGlvbiBiaW5jbiAoYml0KSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXQgPT09ICdudW1iZXInKTtcbiAgICB2YXIgciA9IGJpdCAlIDI2O1xuICAgIHZhciBzID0gKGJpdCAtIHIpIC8gMjY7XG4gICAgdmFyIHEgPSAxIDw8IHI7XG5cbiAgICAvLyBGYXN0IGNhc2U6IGJpdCBpcyBtdWNoIGhpZ2hlciB0aGFuIGFsbCBleGlzdGluZyB3b3Jkc1xuICAgIGlmICh0aGlzLmxlbmd0aCA8PSBzKSB7XG4gICAgICB0aGlzLl9leHBhbmQocyArIDEpO1xuICAgICAgdGhpcy53b3Jkc1tzXSB8PSBxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIGJpdCBhbmQgcHJvcGFnYXRlLCBpZiBuZWVkZWRcbiAgICB2YXIgY2FycnkgPSBxO1xuICAgIGZvciAodmFyIGkgPSBzOyBjYXJyeSAhPT0gMCAmJiBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHcgPSB0aGlzLndvcmRzW2ldIHwgMDtcbiAgICAgIHcgKz0gY2Fycnk7XG4gICAgICBjYXJyeSA9IHcgPj4+IDI2O1xuICAgICAgdyAmPSAweDNmZmZmZmY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdztcbiAgICB9XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gY2Fycnk7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNaZXJvID0gZnVuY3Rpb24gaXNaZXJvICgpIHtcbiAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA9PT0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuY21wbiA9IGZ1bmN0aW9uIGNtcG4gKG51bSkge1xuICAgIHZhciBuZWdhdGl2ZSA9IG51bSA8IDA7XG5cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiAhbmVnYXRpdmUpIHJldHVybiAtMTtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBuZWdhdGl2ZSkgcmV0dXJuIDE7XG5cbiAgICB0aGlzLnN0cmlwKCk7XG5cbiAgICB2YXIgcmVzO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJlcyA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZWdhdGl2ZSkge1xuICAgICAgICBudW0gPSAtbnVtO1xuICAgICAgfVxuXG4gICAgICBhc3NlcnQobnVtIDw9IDB4M2ZmZmZmZiwgJ051bWJlciBpcyB0b28gYmlnJyk7XG5cbiAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1swXSB8IDA7XG4gICAgICByZXMgPSB3ID09PSBudW0gPyAwIDogdyA8IG51bSA/IC0xIDogMTtcbiAgICB9XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHJldHVybiAtcmVzIHwgMDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIENvbXBhcmUgdHdvIG51bWJlcnMgYW5kIHJldHVybjpcbiAgLy8gMSAtIGlmIGB0aGlzYCA+IGBudW1gXG4gIC8vIDAgLSBpZiBgdGhpc2AgPT0gYG51bWBcbiAgLy8gLTEgLSBpZiBgdGhpc2AgPCBgbnVtYFxuICBCTi5wcm90b3R5cGUuY21wID0gZnVuY3Rpb24gY21wIChudW0pIHtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBudW0ubmVnYXRpdmUgPT09IDApIHJldHVybiAtMTtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBudW0ubmVnYXRpdmUgIT09IDApIHJldHVybiAxO1xuXG4gICAgdmFyIHJlcyA9IHRoaXMudWNtcChudW0pO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSByZXR1cm4gLXJlcyB8IDA7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBVbnNpZ25lZCBjb21wYXJpc29uXG4gIEJOLnByb3RvdHlwZS51Y21wID0gZnVuY3Rpb24gdWNtcCAobnVtKSB7XG4gICAgLy8gQXQgdGhpcyBwb2ludCBib3RoIG51bWJlcnMgaGF2ZSB0aGUgc2FtZSBzaWduXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIDE7XG4gICAgaWYgKHRoaXMubGVuZ3RoIDwgbnVtLmxlbmd0aCkgcmV0dXJuIC0xO1xuXG4gICAgdmFyIHJlcyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBhID0gdGhpcy53b3Jkc1tpXSB8IDA7XG4gICAgICB2YXIgYiA9IG51bS53b3Jkc1tpXSB8IDA7XG5cbiAgICAgIGlmIChhID09PSBiKSBjb250aW51ZTtcbiAgICAgIGlmIChhIDwgYikge1xuICAgICAgICByZXMgPSAtMTtcbiAgICAgIH0gZWxzZSBpZiAoYSA+IGIpIHtcbiAgICAgICAgcmVzID0gMTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndG4gPSBmdW5jdGlvbiBndG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA9PT0gMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3QgPSBmdW5jdGlvbiBndCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPT09IDE7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0ZW4gPSBmdW5jdGlvbiBndGVuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPj0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3RlID0gZnVuY3Rpb24gZ3RlIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA+PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdG4gPSBmdW5jdGlvbiBsdG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA9PT0gLTE7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0ID0gZnVuY3Rpb24gbHQgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID09PSAtMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHRlbiA9IGZ1bmN0aW9uIGx0ZW4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA8PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdGUgPSBmdW5jdGlvbiBsdGUgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pIDw9IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmVxbiA9IGZ1bmN0aW9uIGVxbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID09PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA9PT0gMDtcbiAgfTtcblxuICAvL1xuICAvLyBBIHJlZHVjZSBjb250ZXh0LCBjb3VsZCBiZSB1c2luZyBtb250Z29tZXJ5IG9yIHNvbWV0aGluZyBiZXR0ZXIsIGRlcGVuZGluZ1xuICAvLyBvbiB0aGUgYG1gIGl0c2VsZi5cbiAgLy9cbiAgQk4ucmVkID0gZnVuY3Rpb24gcmVkIChudW0pIHtcbiAgICByZXR1cm4gbmV3IFJlZChudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b1JlZCA9IGZ1bmN0aW9uIHRvUmVkIChjdHgpIHtcbiAgICBhc3NlcnQoIXRoaXMucmVkLCAnQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCcpO1xuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwLCAncmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMnKTtcbiAgICByZXR1cm4gY3R4LmNvbnZlcnRUbyh0aGlzKS5fZm9yY2VSZWQoY3R4KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZnJvbVJlZCA9IGZ1bmN0aW9uIGZyb21SZWQgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ2Zyb21SZWQgd29ya3Mgb25seSB3aXRoIG51bWJlcnMgaW4gcmVkdWN0aW9uIGNvbnRleHQnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuY29udmVydEZyb20odGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9mb3JjZVJlZCA9IGZ1bmN0aW9uIF9mb3JjZVJlZCAoY3R4KSB7XG4gICAgdGhpcy5yZWQgPSBjdHg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmZvcmNlUmVkID0gZnVuY3Rpb24gZm9yY2VSZWQgKGN0eCkge1xuICAgIGFzc2VydCghdGhpcy5yZWQsICdBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0Jyk7XG4gICAgcmV0dXJuIHRoaXMuX2ZvcmNlUmVkKGN0eCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZEFkZCA9IGZ1bmN0aW9uIHJlZEFkZCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5hZGQodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSUFkZCA9IGZ1bmN0aW9uIHJlZElBZGQgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZElBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmlhZGQodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkU3ViID0gZnVuY3Rpb24gcmVkU3ViIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnN1Yih0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJU3ViID0gZnVuY3Rpb24gcmVkSVN1YiAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSVN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaXN1Yih0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRTaGwgPSBmdW5jdGlvbiByZWRTaGwgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFNobCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc2hsKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZE11bCA9IGZ1bmN0aW9uIHJlZE11bCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsIG51bSk7XG4gICAgcmV0dXJuIHRoaXMucmVkLm11bCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJTXVsID0gZnVuY3Rpb24gcmVkSU11bCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsIG51bSk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmltdWwodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkU3FyID0gZnVuY3Rpb24gcmVkU3FyICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnNxcih0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSVNxciA9IGZ1bmN0aW9uIHJlZElTcXIgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZElTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmlzcXIodGhpcyk7XG4gIH07XG5cbiAgLy8gU3F1YXJlIHJvb3Qgb3ZlciBwXG4gIEJOLnByb3RvdHlwZS5yZWRTcXJ0ID0gZnVuY3Rpb24gcmVkU3FydCAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU3FydCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc3FydCh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSW52bSA9IGZ1bmN0aW9uIHJlZEludm0gKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZEludm0gd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmludm0odGhpcyk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG5lZ2F0aXZlIGNsb25lIG9mIGB0aGlzYCAlIGByZWQgbW9kdWxvYFxuICBCTi5wcm90b3R5cGUucmVkTmVnID0gZnVuY3Rpb24gcmVkTmVnICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWROZWcgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLm5lZyh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkUG93ID0gZnVuY3Rpb24gcmVkUG93IChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQgJiYgIW51bS5yZWQsICdyZWRQb3cobm9ybWFsTnVtKScpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5wb3codGhpcywgbnVtKTtcbiAgfTtcblxuICAvLyBQcmltZSBudW1iZXJzIHdpdGggZWZmaWNpZW50IHJlZHVjdGlvblxuICB2YXIgcHJpbWVzID0ge1xuICAgIGsyNTY6IG51bGwsXG4gICAgcDIyNDogbnVsbCxcbiAgICBwMTkyOiBudWxsLFxuICAgIHAyNTUxOTogbnVsbFxuICB9O1xuXG4gIC8vIFBzZXVkby1NZXJzZW5uZSBwcmltZVxuICBmdW5jdGlvbiBNUHJpbWUgKG5hbWUsIHApIHtcbiAgICAvLyBQID0gMiBeIE4gLSBLXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnAgPSBuZXcgQk4ocCwgMTYpO1xuICAgIHRoaXMubiA9IHRoaXMucC5iaXRMZW5ndGgoKTtcbiAgICB0aGlzLmsgPSBuZXcgQk4oMSkuaXVzaGxuKHRoaXMubikuaXN1Yih0aGlzLnApO1xuXG4gICAgdGhpcy50bXAgPSB0aGlzLl90bXAoKTtcbiAgfVxuXG4gIE1QcmltZS5wcm90b3R5cGUuX3RtcCA9IGZ1bmN0aW9uIF90bXAgKCkge1xuICAgIHZhciB0bXAgPSBuZXcgQk4obnVsbCk7XG4gICAgdG1wLndvcmRzID0gbmV3IEFycmF5KE1hdGguY2VpbCh0aGlzLm4gLyAxMykpO1xuICAgIHJldHVybiB0bXA7XG4gIH07XG5cbiAgTVByaW1lLnByb3RvdHlwZS5pcmVkdWNlID0gZnVuY3Rpb24gaXJlZHVjZSAobnVtKSB7XG4gICAgLy8gQXNzdW1lcyB0aGF0IGBudW1gIGlzIGxlc3MgdGhhbiBgUF4yYFxuICAgIC8vIG51bSA9IEhJICogKDIgXiBOIC0gSykgKyBISSAqIEsgKyBMTyA9IEhJICogSyArIExPIChtb2QgUClcbiAgICB2YXIgciA9IG51bTtcbiAgICB2YXIgcmxlbjtcblxuICAgIGRvIHtcbiAgICAgIHRoaXMuc3BsaXQociwgdGhpcy50bXApO1xuICAgICAgciA9IHRoaXMuaW11bEsocik7XG4gICAgICByID0gci5pYWRkKHRoaXMudG1wKTtcbiAgICAgIHJsZW4gPSByLmJpdExlbmd0aCgpO1xuICAgIH0gd2hpbGUgKHJsZW4gPiB0aGlzLm4pO1xuXG4gICAgdmFyIGNtcCA9IHJsZW4gPCB0aGlzLm4gPyAtMSA6IHIudWNtcCh0aGlzLnApO1xuICAgIGlmIChjbXAgPT09IDApIHtcbiAgICAgIHIud29yZHNbMF0gPSAwO1xuICAgICAgci5sZW5ndGggPSAxO1xuICAgIH0gZWxzZSBpZiAoY21wID4gMCkge1xuICAgICAgci5pc3ViKHRoaXMucCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyLnN0cmlwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gciBpcyBCTiB2NCBpbnN0YW5jZVxuICAgICAgICByLnN0cmlwKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByIGlzIEJOIHY1IGluc3RhbmNlXG4gICAgICAgIHIuX3N0cmlwKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgTVByaW1lLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uIHNwbGl0IChpbnB1dCwgb3V0KSB7XG4gICAgaW5wdXQuaXVzaHJuKHRoaXMubiwgMCwgb3V0KTtcbiAgfTtcblxuICBNUHJpbWUucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24gaW11bEsgKG51bSkge1xuICAgIHJldHVybiBudW0uaW11bCh0aGlzLmspO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEsyNTYgKCkge1xuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICdrMjU2JyxcbiAgICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZicpO1xuICB9XG4gIGluaGVyaXRzKEsyNTYsIE1QcmltZSk7XG5cbiAgSzI1Ni5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbiBzcGxpdCAoaW5wdXQsIG91dHB1dCkge1xuICAgIC8vIDI1NiA9IDkgKiAyNiArIDIyXG4gICAgdmFyIG1hc2sgPSAweDNmZmZmZjtcblxuICAgIHZhciBvdXRMZW4gPSBNYXRoLm1pbihpbnB1dC5sZW5ndGgsIDkpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3V0TGVuOyBpKyspIHtcbiAgICAgIG91dHB1dC53b3Jkc1tpXSA9IGlucHV0LndvcmRzW2ldO1xuICAgIH1cbiAgICBvdXRwdXQubGVuZ3RoID0gb3V0TGVuO1xuXG4gICAgaWYgKGlucHV0Lmxlbmd0aCA8PSA5KSB7XG4gICAgICBpbnB1dC53b3Jkc1swXSA9IDA7XG4gICAgICBpbnB1dC5sZW5ndGggPSAxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNoaWZ0IGJ5IDkgbGltYnNcbiAgICB2YXIgcHJldiA9IGlucHV0LndvcmRzWzldO1xuICAgIG91dHB1dC53b3Jkc1tvdXRwdXQubGVuZ3RoKytdID0gcHJldiAmIG1hc2s7XG5cbiAgICBmb3IgKGkgPSAxMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmV4dCA9IGlucHV0LndvcmRzW2ldIHwgMDtcbiAgICAgIGlucHV0LndvcmRzW2kgLSAxMF0gPSAoKG5leHQgJiBtYXNrKSA8PCA0KSB8IChwcmV2ID4+PiAyMik7XG4gICAgICBwcmV2ID0gbmV4dDtcbiAgICB9XG4gICAgcHJldiA+Pj49IDIyO1xuICAgIGlucHV0LndvcmRzW2kgLSAxMF0gPSBwcmV2O1xuICAgIGlmIChwcmV2ID09PSAwICYmIGlucHV0Lmxlbmd0aCA+IDEwKSB7XG4gICAgICBpbnB1dC5sZW5ndGggLT0gMTA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucHV0Lmxlbmd0aCAtPSA5O1xuICAgIH1cbiAgfTtcblxuICBLMjU2LnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uIGltdWxLIChudW0pIHtcbiAgICAvLyBLID0gMHgxMDAwMDAzZDEgPSBbIDB4NDAsIDB4M2QxIF1cbiAgICBudW0ud29yZHNbbnVtLmxlbmd0aF0gPSAwO1xuICAgIG51bS53b3Jkc1tudW0ubGVuZ3RoICsgMV0gPSAwO1xuICAgIG51bS5sZW5ndGggKz0gMjtcblxuICAgIC8vIGJvdW5kZWQgYXQ6IDB4NDAgKiAweDNmZmZmZmYgKyAweDNkMCA9IDB4MTAwMDAwMzkwXG4gICAgdmFyIGxvID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHcgPSBudW0ud29yZHNbaV0gfCAwO1xuICAgICAgbG8gKz0gdyAqIDB4M2QxO1xuICAgICAgbnVtLndvcmRzW2ldID0gbG8gJiAweDNmZmZmZmY7XG4gICAgICBsbyA9IHcgKiAweDQwICsgKChsbyAvIDB4NDAwMDAwMCkgfCAwKTtcbiAgICB9XG5cbiAgICAvLyBGYXN0IGxlbmd0aCByZWR1Y3Rpb25cbiAgICBpZiAobnVtLndvcmRzW251bS5sZW5ndGggLSAxXSA9PT0gMCkge1xuICAgICAgbnVtLmxlbmd0aC0tO1xuICAgICAgaWYgKG51bS53b3Jkc1tudW0ubGVuZ3RoIC0gMV0gPT09IDApIHtcbiAgICAgICAgbnVtLmxlbmd0aC0tO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVtO1xuICB9O1xuXG4gIGZ1bmN0aW9uIFAyMjQgKCkge1xuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICdwMjI0JyxcbiAgICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMScpO1xuICB9XG4gIGluaGVyaXRzKFAyMjQsIE1QcmltZSk7XG5cbiAgZnVuY3Rpb24gUDE5MiAoKSB7XG4gICAgTVByaW1lLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgJ3AxOTInLFxuICAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmJyk7XG4gIH1cbiAgaW5oZXJpdHMoUDE5MiwgTVByaW1lKTtcblxuICBmdW5jdGlvbiBQMjU1MTkgKCkge1xuICAgIC8vIDIgXiAyNTUgLSAxOVxuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICcyNTUxOScsXG4gICAgICAnN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCcpO1xuICB9XG4gIGluaGVyaXRzKFAyNTUxOSwgTVByaW1lKTtcblxuICBQMjU1MTkucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24gaW11bEsgKG51bSkge1xuICAgIC8vIEsgPSAweDEzXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhpID0gKG51bS53b3Jkc1tpXSB8IDApICogMHgxMyArIGNhcnJ5O1xuICAgICAgdmFyIGxvID0gaGkgJiAweDNmZmZmZmY7XG4gICAgICBoaSA+Pj49IDI2O1xuXG4gICAgICBudW0ud29yZHNbaV0gPSBsbztcbiAgICAgIGNhcnJ5ID0gaGk7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgbnVtLndvcmRzW251bS5sZW5ndGgrK10gPSBjYXJyeTtcbiAgICB9XG4gICAgcmV0dXJuIG51bTtcbiAgfTtcblxuICAvLyBFeHBvcnRlZCBtb3N0bHkgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHVzZSBwbGFpbiBuYW1lIGluc3RlYWRcbiAgQk4uX3ByaW1lID0gZnVuY3Rpb24gcHJpbWUgKG5hbWUpIHtcbiAgICAvLyBDYWNoZWQgdmVyc2lvbiBvZiBwcmltZVxuICAgIGlmIChwcmltZXNbbmFtZV0pIHJldHVybiBwcmltZXNbbmFtZV07XG5cbiAgICB2YXIgcHJpbWU7XG4gICAgaWYgKG5hbWUgPT09ICdrMjU2Jykge1xuICAgICAgcHJpbWUgPSBuZXcgSzI1NigpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3AyMjQnKSB7XG4gICAgICBwcmltZSA9IG5ldyBQMjI0KCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAncDE5MicpIHtcbiAgICAgIHByaW1lID0gbmV3IFAxOTIoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdwMjU1MTknKSB7XG4gICAgICBwcmltZSA9IG5ldyBQMjU1MTkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHByaW1lICcgKyBuYW1lKTtcbiAgICB9XG4gICAgcHJpbWVzW25hbWVdID0gcHJpbWU7XG5cbiAgICByZXR1cm4gcHJpbWU7XG4gIH07XG5cbiAgLy9cbiAgLy8gQmFzZSByZWR1Y3Rpb24gZW5naW5lXG4gIC8vXG4gIGZ1bmN0aW9uIFJlZCAobSkge1xuICAgIGlmICh0eXBlb2YgbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBwcmltZSA9IEJOLl9wcmltZShtKTtcbiAgICAgIHRoaXMubSA9IHByaW1lLnA7XG4gICAgICB0aGlzLnByaW1lID0gcHJpbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChtLmd0bigxKSwgJ21vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMScpO1xuICAgICAgdGhpcy5tID0gbTtcbiAgICAgIHRoaXMucHJpbWUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIFJlZC5wcm90b3R5cGUuX3ZlcmlmeTEgPSBmdW5jdGlvbiBfdmVyaWZ5MSAoYSkge1xuICAgIGFzc2VydChhLm5lZ2F0aXZlID09PSAwLCAncmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMnKTtcbiAgICBhc3NlcnQoYS5yZWQsICdyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5fdmVyaWZ5MiA9IGZ1bmN0aW9uIF92ZXJpZnkyIChhLCBiKSB7XG4gICAgYXNzZXJ0KChhLm5lZ2F0aXZlIHwgYi5uZWdhdGl2ZSkgPT09IDAsICdyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcycpO1xuICAgIGFzc2VydChhLnJlZCAmJiBhLnJlZCA9PT0gYi5yZWQsXG4gICAgICAncmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW1vZCA9IGZ1bmN0aW9uIGltb2QgKGEpIHtcbiAgICBpZiAodGhpcy5wcmltZSkgcmV0dXJuIHRoaXMucHJpbWUuaXJlZHVjZShhKS5fZm9yY2VSZWQodGhpcyk7XG4gICAgcmV0dXJuIGEudW1vZCh0aGlzLm0pLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZyAoYSkge1xuICAgIGlmIChhLmlzWmVybygpKSB7XG4gICAgICByZXR1cm4gYS5jbG9uZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm0uc3ViKGEpLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5hZGQoYik7XG4gICAgaWYgKHJlcy5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMuaXN1Yih0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlhZGQgPSBmdW5jdGlvbiBpYWRkIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLmlhZGQoYik7XG4gICAgaWYgKHJlcy5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMuaXN1Yih0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24gc3ViIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLnN1YihiKTtcbiAgICBpZiAocmVzLmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMuaWFkZCh0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlzdWIgPSBmdW5jdGlvbiBpc3ViIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLmlzdWIoYik7XG4gICAgaWYgKHJlcy5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzLmlhZGQodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNobCA9IGZ1bmN0aW9uIHNobCAoYSwgbnVtKSB7XG4gICAgdGhpcy5fdmVyaWZ5MShhKTtcbiAgICByZXR1cm4gdGhpcy5pbW9kKGEudXNobG4obnVtKSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24gaW11bCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLmltdWwoYikpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcbiAgICByZXR1cm4gdGhpcy5pbW9kKGEubXVsKGIpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbiBpc3FyIChhKSB7XG4gICAgcmV0dXJuIHRoaXMuaW11bChhLCBhLmNsb25lKCkpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3FyID0gZnVuY3Rpb24gc3FyIChhKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsKGEsIGEpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3FydCA9IGZ1bmN0aW9uIHNxcnQgKGEpIHtcbiAgICBpZiAoYS5pc1plcm8oKSkgcmV0dXJuIGEuY2xvbmUoKTtcblxuICAgIHZhciBtb2QzID0gdGhpcy5tLmFuZGxuKDMpO1xuICAgIGFzc2VydChtb2QzICUgMiA9PT0gMSk7XG5cbiAgICAvLyBGYXN0IGNhc2VcbiAgICBpZiAobW9kMyA9PT0gMykge1xuICAgICAgdmFyIHBvdyA9IHRoaXMubS5hZGQobmV3IEJOKDEpKS5pdXNocm4oMik7XG4gICAgICByZXR1cm4gdGhpcy5wb3coYSwgcG93KTtcbiAgICB9XG5cbiAgICAvLyBUb25lbGxpLVNoYW5rcyBhbGdvcml0aG0gKFRvdGFsbHkgdW5vcHRpbWl6ZWQgYW5kIHNsb3cpXG4gICAgLy9cbiAgICAvLyBGaW5kIFEgYW5kIFMsIHRoYXQgUSAqIDIgXiBTID0gKFAgLSAxKVxuICAgIHZhciBxID0gdGhpcy5tLnN1Ym4oMSk7XG4gICAgdmFyIHMgPSAwO1xuICAgIHdoaWxlICghcS5pc1plcm8oKSAmJiBxLmFuZGxuKDEpID09PSAwKSB7XG4gICAgICBzKys7XG4gICAgICBxLml1c2hybigxKTtcbiAgICB9XG4gICAgYXNzZXJ0KCFxLmlzWmVybygpKTtcblxuICAgIHZhciBvbmUgPSBuZXcgQk4oMSkudG9SZWQodGhpcyk7XG4gICAgdmFyIG5PbmUgPSBvbmUucmVkTmVnKCk7XG5cbiAgICAvLyBGaW5kIHF1YWRyYXRpYyBub24tcmVzaWR1ZVxuICAgIC8vIE5PVEU6IE1heCBpcyBzdWNoIGJlY2F1c2Ugb2YgZ2VuZXJhbGl6ZWQgUmllbWFubiBoeXBvdGhlc2lzLlxuICAgIHZhciBscG93ID0gdGhpcy5tLnN1Ym4oMSkuaXVzaHJuKDEpO1xuICAgIHZhciB6ID0gdGhpcy5tLmJpdExlbmd0aCgpO1xuICAgIHogPSBuZXcgQk4oMiAqIHogKiB6KS50b1JlZCh0aGlzKTtcblxuICAgIHdoaWxlICh0aGlzLnBvdyh6LCBscG93KS5jbXAobk9uZSkgIT09IDApIHtcbiAgICAgIHoucmVkSUFkZChuT25lKTtcbiAgICB9XG5cbiAgICB2YXIgYyA9IHRoaXMucG93KHosIHEpO1xuICAgIHZhciByID0gdGhpcy5wb3coYSwgcS5hZGRuKDEpLml1c2hybigxKSk7XG4gICAgdmFyIHQgPSB0aGlzLnBvdyhhLCBxKTtcbiAgICB2YXIgbSA9IHM7XG4gICAgd2hpbGUgKHQuY21wKG9uZSkgIT09IDApIHtcbiAgICAgIHZhciB0bXAgPSB0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IHRtcC5jbXAob25lKSAhPT0gMDsgaSsrKSB7XG4gICAgICAgIHRtcCA9IHRtcC5yZWRTcXIoKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChpIDwgbSk7XG4gICAgICB2YXIgYiA9IHRoaXMucG93KGMsIG5ldyBCTigxKS5pdXNobG4obSAtIGkgLSAxKSk7XG5cbiAgICAgIHIgPSByLnJlZE11bChiKTtcbiAgICAgIGMgPSBiLnJlZFNxcigpO1xuICAgICAgdCA9IHQucmVkTXVsKGMpO1xuICAgICAgbSA9IGk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24gaW52bSAoYSkge1xuICAgIHZhciBpbnYgPSBhLl9pbnZtcCh0aGlzLm0pO1xuICAgIGlmIChpbnYubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIGludi5uZWdhdGl2ZSA9IDA7XG4gICAgICByZXR1cm4gdGhpcy5pbW9kKGludikucmVkTmVnKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmltb2QoaW52KTtcbiAgICB9XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5wb3cgPSBmdW5jdGlvbiBwb3cgKGEsIG51bSkge1xuICAgIGlmIChudW0uaXNaZXJvKCkpIHJldHVybiBuZXcgQk4oMSkudG9SZWQodGhpcyk7XG4gICAgaWYgKG51bS5jbXBuKDEpID09PSAwKSByZXR1cm4gYS5jbG9uZSgpO1xuXG4gICAgdmFyIHdpbmRvd1NpemUgPSA0O1xuICAgIHZhciB3bmQgPSBuZXcgQXJyYXkoMSA8PCB3aW5kb3dTaXplKTtcbiAgICB3bmRbMF0gPSBuZXcgQk4oMSkudG9SZWQodGhpcyk7XG4gICAgd25kWzFdID0gYTtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IHduZC5sZW5ndGg7IGkrKykge1xuICAgICAgd25kW2ldID0gdGhpcy5tdWwod25kW2kgLSAxXSwgYSk7XG4gICAgfVxuXG4gICAgdmFyIHJlcyA9IHduZFswXTtcbiAgICB2YXIgY3VycmVudCA9IDA7XG4gICAgdmFyIGN1cnJlbnRMZW4gPSAwO1xuICAgIHZhciBzdGFydCA9IG51bS5iaXRMZW5ndGgoKSAlIDI2O1xuICAgIGlmIChzdGFydCA9PT0gMCkge1xuICAgICAgc3RhcnQgPSAyNjtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBudW0ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciB3b3JkID0gbnVtLndvcmRzW2ldO1xuICAgICAgZm9yICh2YXIgaiA9IHN0YXJ0IC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgdmFyIGJpdCA9ICh3b3JkID4+IGopICYgMTtcbiAgICAgICAgaWYgKHJlcyAhPT0gd25kWzBdKSB7XG4gICAgICAgICAgcmVzID0gdGhpcy5zcXIocmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiaXQgPT09IDAgJiYgY3VycmVudCA9PT0gMCkge1xuICAgICAgICAgIGN1cnJlbnRMZW4gPSAwO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudCA8PD0gMTtcbiAgICAgICAgY3VycmVudCB8PSBiaXQ7XG4gICAgICAgIGN1cnJlbnRMZW4rKztcbiAgICAgICAgaWYgKGN1cnJlbnRMZW4gIT09IHdpbmRvd1NpemUgJiYgKGkgIT09IDAgfHwgaiAhPT0gMCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIHJlcyA9IHRoaXMubXVsKHJlcywgd25kW2N1cnJlbnRdKTtcbiAgICAgICAgY3VycmVudExlbiA9IDA7XG4gICAgICAgIGN1cnJlbnQgPSAwO1xuICAgICAgfVxuICAgICAgc3RhcnQgPSAyNjtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24gY29udmVydFRvIChudW0pIHtcbiAgICB2YXIgciA9IG51bS51bW9kKHRoaXMubSk7XG5cbiAgICByZXR1cm4gciA9PT0gbnVtID8gci5jbG9uZSgpIDogcjtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmNvbnZlcnRGcm9tID0gZnVuY3Rpb24gY29udmVydEZyb20gKG51bSkge1xuICAgIHZhciByZXMgPSBudW0uY2xvbmUoKTtcbiAgICByZXMucmVkID0gbnVsbDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vXG4gIC8vIE1vbnRnb21lcnkgbWV0aG9kIGVuZ2luZVxuICAvL1xuXG4gIEJOLm1vbnQgPSBmdW5jdGlvbiBtb250IChudW0pIHtcbiAgICByZXR1cm4gbmV3IE1vbnQobnVtKTtcbiAgfTtcblxuICBmdW5jdGlvbiBNb250IChtKSB7XG4gICAgUmVkLmNhbGwodGhpcywgbSk7XG5cbiAgICB0aGlzLnNoaWZ0ID0gdGhpcy5tLmJpdExlbmd0aCgpO1xuICAgIGlmICh0aGlzLnNoaWZ0ICUgMjYgIT09IDApIHtcbiAgICAgIHRoaXMuc2hpZnQgKz0gMjYgLSAodGhpcy5zaGlmdCAlIDI2KTtcbiAgICB9XG5cbiAgICB0aGlzLnIgPSBuZXcgQk4oMSkuaXVzaGxuKHRoaXMuc2hpZnQpO1xuICAgIHRoaXMucjIgPSB0aGlzLmltb2QodGhpcy5yLnNxcigpKTtcbiAgICB0aGlzLnJpbnYgPSB0aGlzLnIuX2ludm1wKHRoaXMubSk7XG5cbiAgICB0aGlzLm1pbnYgPSB0aGlzLnJpbnYubXVsKHRoaXMucikuaXN1Ym4oMSkuZGl2KHRoaXMubSk7XG4gICAgdGhpcy5taW52ID0gdGhpcy5taW52LnVtb2QodGhpcy5yKTtcbiAgICB0aGlzLm1pbnYgPSB0aGlzLnIuc3ViKHRoaXMubWludik7XG4gIH1cbiAgaW5oZXJpdHMoTW9udCwgUmVkKTtcblxuICBNb250LnByb3RvdHlwZS5jb252ZXJ0VG8gPSBmdW5jdGlvbiBjb252ZXJ0VG8gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmltb2QobnVtLnVzaGxuKHRoaXMuc2hpZnQpKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uIGNvbnZlcnRGcm9tIChudW0pIHtcbiAgICB2YXIgciA9IHRoaXMuaW1vZChudW0ubXVsKHRoaXMucmludikpO1xuICAgIHIucmVkID0gbnVsbDtcbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24gaW11bCAoYSwgYikge1xuICAgIGlmIChhLmlzWmVybygpIHx8IGIuaXNaZXJvKCkpIHtcbiAgICAgIGEud29yZHNbMF0gPSAwO1xuICAgICAgYS5sZW5ndGggPSAxO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgdmFyIHQgPSBhLmltdWwoYik7XG4gICAgdmFyIGMgPSB0Lm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKTtcbiAgICB2YXIgdSA9IHQuaXN1YihjKS5pdXNocm4odGhpcy5zaGlmdCk7XG4gICAgdmFyIHJlcyA9IHU7XG5cbiAgICBpZiAodS5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMgPSB1LmlzdWIodGhpcy5tKTtcbiAgICB9IGVsc2UgaWYgKHUuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcyA9IHUuaWFkZCh0aGlzLm0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIE1vbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bCAoYSwgYikge1xuICAgIGlmIChhLmlzWmVybygpIHx8IGIuaXNaZXJvKCkpIHJldHVybiBuZXcgQk4oMCkuX2ZvcmNlUmVkKHRoaXMpO1xuXG4gICAgdmFyIHQgPSBhLm11bChiKTtcbiAgICB2YXIgYyA9IHQubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pO1xuICAgIHZhciB1ID0gdC5pc3ViKGMpLml1c2hybih0aGlzLnNoaWZ0KTtcbiAgICB2YXIgcmVzID0gdTtcbiAgICBpZiAodS5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMgPSB1LmlzdWIodGhpcy5tKTtcbiAgICB9IGVsc2UgaWYgKHUuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcyA9IHUuaWFkZCh0aGlzLm0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIE1vbnQucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbiBpbnZtIChhKSB7XG4gICAgLy8gKEFSKV4tMSAqIFJeMiA9IChBXi0xICogUl4tMSkgKiBSXjIgPSBBXi0xICogUlxuICAgIHZhciByZXMgPSB0aGlzLmltb2QoYS5faW52bXAodGhpcy5tKS5tdWwodGhpcy5yMikpO1xuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xufSkodHlwZW9mIG1vZHVsZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbW9kdWxlLCB0aGlzKTtcbiIsCiAgICAiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICAgIH1cbiAgfVxufVxuIiwKICAgICJ0cnkge1xuICB2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKHR5cGVvZiB1dGlsLmluaGVyaXRzICE9PSAnZnVuY3Rpb24nKSB0aHJvdyAnJztcbiAgbW9kdWxlLmV4cG9ydHMgPSB1dGlsLmluaGVyaXRzO1xufSBjYXRjaCAoZSkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaW5oZXJpdHNfYnJvd3Nlci5qcycpO1xufVxuIiwKICAgICIvKiBlc2xpbnQtZGlzYWJsZSBub2RlL25vLWRlcHJlY2F0ZWQtYXBpICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJylcbnZhciBCdWZmZXIgPSBidWZmZXIuQnVmZmVyXG5cbnZhciBzYWZlciA9IHt9XG5cbnZhciBrZXlcblxuZm9yIChrZXkgaW4gYnVmZmVyKSB7XG4gIGlmICghYnVmZmVyLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlXG4gIGlmIChrZXkgPT09ICdTbG93QnVmZmVyJyB8fCBrZXkgPT09ICdCdWZmZXInKSBjb250aW51ZVxuICBzYWZlcltrZXldID0gYnVmZmVyW2tleV1cbn1cblxudmFyIFNhZmVyID0gc2FmZXIuQnVmZmVyID0ge31cbmZvciAoa2V5IGluIEJ1ZmZlcikge1xuICBpZiAoIUJ1ZmZlci5oYXNPd25Qcm9wZXJ0eShrZXkpKSBjb250aW51ZVxuICBpZiAoa2V5ID09PSAnYWxsb2NVbnNhZmUnIHx8IGtleSA9PT0gJ2FsbG9jVW5zYWZlU2xvdycpIGNvbnRpbnVlXG4gIFNhZmVyW2tleV0gPSBCdWZmZXJba2V5XVxufVxuXG5zYWZlci5CdWZmZXIucHJvdG90eXBlID0gQnVmZmVyLnByb3RvdHlwZVxuXG5pZiAoIVNhZmVyLmZyb20gfHwgU2FmZXIuZnJvbSA9PT0gVWludDhBcnJheS5mcm9tKSB7XG4gIFNhZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgdmFsdWUpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiB2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG59XG5cbmlmICghU2FmZXIuYWxsb2MpIHtcbiAgU2FmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHNpemUpXG4gICAgfVxuICAgIGlmIChzaXplIDwgMCB8fCBzaXplID49IDIgKiAoMSA8PCAzMCkpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgc2l6ZSArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICAgIH1cbiAgICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gICAgaWYgKCFmaWxsIHx8IGZpbGwubGVuZ3RoID09PSAwKSB7XG4gICAgICBidWYuZmlsbCgwKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICAgIHJldHVybiBidWZcbiAgfVxufVxuXG5pZiAoIXNhZmVyLmtTdHJpbmdNYXhMZW5ndGgpIHtcbiAgdHJ5IHtcbiAgICBzYWZlci5rU3RyaW5nTWF4TGVuZ3RoID0gcHJvY2Vzcy5iaW5kaW5nKCdidWZmZXInKS5rU3RyaW5nTWF4TGVuZ3RoXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyB3ZSBjYW4ndCBkZXRlcm1pbmUga1N0cmluZ01heExlbmd0aCBpbiBlbnZpcm9ubWVudHMgd2hlcmUgcHJvY2Vzcy5iaW5kaW5nXG4gICAgLy8gaXMgdW5zdXBwb3J0ZWQsIHNvIGxldCdzIG5vdCBzZXQgaXRcbiAgfVxufVxuXG5pZiAoIXNhZmVyLmNvbnN0YW50cykge1xuICBzYWZlci5jb25zdGFudHMgPSB7XG4gICAgTUFYX0xFTkdUSDogc2FmZXIua01heExlbmd0aFxuICB9XG4gIGlmIChzYWZlci5rU3RyaW5nTWF4TGVuZ3RoKSB7XG4gICAgc2FmZXIuY29uc3RhbnRzLk1BWF9TVFJJTkdfTEVOR1RIID0gc2FmZXIua1N0cmluZ01heExlbmd0aFxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2FmZXJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmZ1bmN0aW9uIFJlcG9ydGVyKG9wdGlvbnMpIHtcbiAgdGhpcy5fcmVwb3J0ZXJTdGF0ZSA9IHtcbiAgICBvYmo6IG51bGwsXG4gICAgcGF0aDogW10sXG4gICAgb3B0aW9uczogb3B0aW9ucyB8fCB7fSxcbiAgICBlcnJvcnM6IFtdXG4gIH07XG59XG5leHBvcnRzLlJlcG9ydGVyID0gUmVwb3J0ZXI7XG5cblJlcG9ydGVyLnByb3RvdHlwZS5pc0Vycm9yID0gZnVuY3Rpb24gaXNFcnJvcihvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJlcG9ydGVyRXJyb3I7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uIHNhdmUoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICByZXR1cm4geyBvYmo6IHN0YXRlLm9iaiwgcGF0aExlbjogc3RhdGUucGF0aC5sZW5ndGggfTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5yZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZShkYXRhKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBzdGF0ZS5vYmogPSBkYXRhLm9iajtcbiAgc3RhdGUucGF0aCA9IHN0YXRlLnBhdGguc2xpY2UoMCwgZGF0YS5wYXRoTGVuKTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5lbnRlcktleSA9IGZ1bmN0aW9uIGVudGVyS2V5KGtleSkge1xuICByZXR1cm4gdGhpcy5fcmVwb3J0ZXJTdGF0ZS5wYXRoLnB1c2goa2V5KTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5leGl0S2V5ID0gZnVuY3Rpb24gZXhpdEtleShpbmRleCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgc3RhdGUucGF0aCA9IHN0YXRlLnBhdGguc2xpY2UoMCwgaW5kZXggLSAxKTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5sZWF2ZUtleSA9IGZ1bmN0aW9uIGxlYXZlS2V5KGluZGV4LCBrZXksIHZhbHVlKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICB0aGlzLmV4aXRLZXkoaW5kZXgpO1xuICBpZiAoc3RhdGUub2JqICE9PSBudWxsKVxuICAgIHN0YXRlLm9ialtrZXldID0gdmFsdWU7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUucGF0aCA9IGZ1bmN0aW9uIHBhdGgoKSB7XG4gIHJldHVybiB0aGlzLl9yZXBvcnRlclN0YXRlLnBhdGguam9pbignLycpO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmVudGVyT2JqZWN0ID0gZnVuY3Rpb24gZW50ZXJPYmplY3QoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBjb25zdCBwcmV2ID0gc3RhdGUub2JqO1xuICBzdGF0ZS5vYmogPSB7fTtcbiAgcmV0dXJuIHByZXY7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUubGVhdmVPYmplY3QgPSBmdW5jdGlvbiBsZWF2ZU9iamVjdChwcmV2KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBjb25zdCBub3cgPSBzdGF0ZS5vYmo7XG4gIHN0YXRlLm9iaiA9IHByZXY7XG4gIHJldHVybiBub3c7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiBlcnJvcihtc2cpIHtcbiAgbGV0IGVycjtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIGNvbnN0IGluaGVyaXRlZCA9IG1zZyBpbnN0YW5jZW9mIFJlcG9ydGVyRXJyb3I7XG4gIGlmIChpbmhlcml0ZWQpIHtcbiAgICBlcnIgPSBtc2c7XG4gIH0gZWxzZSB7XG4gICAgZXJyID0gbmV3IFJlcG9ydGVyRXJyb3Ioc3RhdGUucGF0aC5tYXAoZnVuY3Rpb24oZWxlbSkge1xuICAgICAgcmV0dXJuICdbJyArIEpTT04uc3RyaW5naWZ5KGVsZW0pICsgJ10nO1xuICAgIH0pLmpvaW4oJycpLCBtc2cubWVzc2FnZSB8fCBtc2csIG1zZy5zdGFjayk7XG4gIH1cblxuICBpZiAoIXN0YXRlLm9wdGlvbnMucGFydGlhbClcbiAgICB0aHJvdyBlcnI7XG5cbiAgaWYgKCFpbmhlcml0ZWQpXG4gICAgc3RhdGUuZXJyb3JzLnB1c2goZXJyKTtcblxuICByZXR1cm4gZXJyO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLndyYXBSZXN1bHQgPSBmdW5jdGlvbiB3cmFwUmVzdWx0KHJlc3VsdCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG4gIGlmICghc3RhdGUub3B0aW9ucy5wYXJ0aWFsKVxuICAgIHJldHVybiByZXN1bHQ7XG5cbiAgcmV0dXJuIHtcbiAgICByZXN1bHQ6IHRoaXMuaXNFcnJvcihyZXN1bHQpID8gbnVsbCA6IHJlc3VsdCxcbiAgICBlcnJvcnM6IHN0YXRlLmVycm9yc1xuICB9O1xufTtcblxuZnVuY3Rpb24gUmVwb3J0ZXJFcnJvcihwYXRoLCBtc2cpIHtcbiAgdGhpcy5wYXRoID0gcGF0aDtcbiAgdGhpcy5yZXRocm93KG1zZyk7XG59XG5pbmhlcml0cyhSZXBvcnRlckVycm9yLCBFcnJvcik7XG5cblJlcG9ydGVyRXJyb3IucHJvdG90eXBlLnJldGhyb3cgPSBmdW5jdGlvbiByZXRocm93KG1zZykge1xuICB0aGlzLm1lc3NhZ2UgPSBtc2cgKyAnIGF0OiAnICsgKHRoaXMucGF0aCB8fCAnKHNoYWxsb3cpJyk7XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXBvcnRlckVycm9yKTtcblxuICBpZiAoIXRoaXMuc3RhY2spIHtcbiAgICB0cnkge1xuICAgICAgLy8gSUUgb25seSBhZGRzIHN0YWNrIHdoZW4gdGhyb3duXG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5tZXNzYWdlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLnN0YWNrID0gZS5zdGFjaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbmNvbnN0IFJlcG9ydGVyID0gcmVxdWlyZSgnLi4vYmFzZS9yZXBvcnRlcicpLlJlcG9ydGVyO1xuY29uc3QgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xuXG5mdW5jdGlvbiBEZWNvZGVyQnVmZmVyKGJhc2UsIG9wdGlvbnMpIHtcbiAgUmVwb3J0ZXIuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYmFzZSkpIHtcbiAgICB0aGlzLmVycm9yKCdJbnB1dCBub3QgQnVmZmVyJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5iYXNlID0gYmFzZTtcbiAgdGhpcy5vZmZzZXQgPSAwO1xuICB0aGlzLmxlbmd0aCA9IGJhc2UubGVuZ3RoO1xufVxuaW5oZXJpdHMoRGVjb2RlckJ1ZmZlciwgUmVwb3J0ZXIpO1xuZXhwb3J0cy5EZWNvZGVyQnVmZmVyID0gRGVjb2RlckJ1ZmZlcjtcblxuRGVjb2RlckJ1ZmZlci5pc0RlY29kZXJCdWZmZXIgPSBmdW5jdGlvbiBpc0RlY29kZXJCdWZmZXIoZGF0YSkge1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIERlY29kZXJCdWZmZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIE9yIGFjY2VwdCBjb21wYXRpYmxlIEFQSVxuICBjb25zdCBpc0NvbXBhdGlibGUgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICBCdWZmZXIuaXNCdWZmZXIoZGF0YS5iYXNlKSAmJlxuICAgIGRhdGEuY29uc3RydWN0b3IubmFtZSA9PT0gJ0RlY29kZXJCdWZmZXInICYmXG4gICAgdHlwZW9mIGRhdGEub2Zmc2V0ID09PSAnbnVtYmVyJyAmJlxuICAgIHR5cGVvZiBkYXRhLmxlbmd0aCA9PT0gJ251bWJlcicgJiZcbiAgICB0eXBlb2YgZGF0YS5zYXZlID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIGRhdGEucmVzdG9yZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBkYXRhLmlzRW1wdHkgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZGF0YS5yZWFkVUludDggPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZGF0YS5za2lwID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIGRhdGEucmF3ID09PSAnZnVuY3Rpb24nO1xuXG4gIHJldHVybiBpc0NvbXBhdGlibGU7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24gc2F2ZSgpIHtcbiAgcmV0dXJuIHsgb2Zmc2V0OiB0aGlzLm9mZnNldCwgcmVwb3J0ZXI6IFJlcG9ydGVyLnByb3RvdHlwZS5zYXZlLmNhbGwodGhpcykgfTtcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnJlc3RvcmUgPSBmdW5jdGlvbiByZXN0b3JlKHNhdmUpIHtcbiAgLy8gUmV0dXJuIHNraXBwZWQgZGF0YVxuICBjb25zdCByZXMgPSBuZXcgRGVjb2RlckJ1ZmZlcih0aGlzLmJhc2UpO1xuICByZXMub2Zmc2V0ID0gc2F2ZS5vZmZzZXQ7XG4gIHJlcy5sZW5ndGggPSB0aGlzLm9mZnNldDtcblxuICB0aGlzLm9mZnNldCA9IHNhdmUub2Zmc2V0O1xuICBSZXBvcnRlci5wcm90b3R5cGUucmVzdG9yZS5jYWxsKHRoaXMsIHNhdmUucmVwb3J0ZXIpO1xuXG4gIHJldHVybiByZXM7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgcmV0dXJuIHRoaXMub2Zmc2V0ID09PSB0aGlzLmxlbmd0aDtcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OChmYWlsKSB7XG4gIGlmICh0aGlzLm9mZnNldCArIDEgPD0gdGhpcy5sZW5ndGgpXG4gICAgcmV0dXJuIHRoaXMuYmFzZS5yZWFkVUludDgodGhpcy5vZmZzZXQrKywgdHJ1ZSk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5lcnJvcihmYWlsIHx8ICdEZWNvZGVyQnVmZmVyIG92ZXJydW4nKTtcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbiBza2lwKGJ5dGVzLCBmYWlsKSB7XG4gIGlmICghKHRoaXMub2Zmc2V0ICsgYnl0ZXMgPD0gdGhpcy5sZW5ndGgpKVxuICAgIHJldHVybiB0aGlzLmVycm9yKGZhaWwgfHwgJ0RlY29kZXJCdWZmZXIgb3ZlcnJ1bicpO1xuXG4gIGNvbnN0IHJlcyA9IG5ldyBEZWNvZGVyQnVmZmVyKHRoaXMuYmFzZSk7XG5cbiAgLy8gU2hhcmUgcmVwb3J0ZXIgc3RhdGVcbiAgcmVzLl9yZXBvcnRlclN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICByZXMub2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gIHJlcy5sZW5ndGggPSB0aGlzLm9mZnNldCArIGJ5dGVzO1xuICB0aGlzLm9mZnNldCArPSBieXRlcztcbiAgcmV0dXJuIHJlcztcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnJhdyA9IGZ1bmN0aW9uIHJhdyhzYXZlKSB7XG4gIHJldHVybiB0aGlzLmJhc2Uuc2xpY2Uoc2F2ZSA/IHNhdmUub2Zmc2V0IDogdGhpcy5vZmZzZXQsIHRoaXMubGVuZ3RoKTtcbn07XG5cbmZ1bmN0aW9uIEVuY29kZXJCdWZmZXIodmFsdWUsIHJlcG9ydGVyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWUubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgIGlmICghRW5jb2RlckJ1ZmZlci5pc0VuY29kZXJCdWZmZXIoaXRlbSkpXG4gICAgICAgIGl0ZW0gPSBuZXcgRW5jb2RlckJ1ZmZlcihpdGVtLCByZXBvcnRlcik7XG4gICAgICB0aGlzLmxlbmd0aCArPSBpdGVtLmxlbmd0aDtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0sIHRoaXMpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoISgwIDw9IHZhbHVlICYmIHZhbHVlIDw9IDB4ZmYpKVxuICAgICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdub24tYnl0ZSBFbmNvZGVyQnVmZmVyIHZhbHVlJyk7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgodmFsdWUpO1xuICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5sZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdVbnN1cHBvcnRlZCB0eXBlOiAnICsgdHlwZW9mIHZhbHVlKTtcbiAgfVxufVxuZXhwb3J0cy5FbmNvZGVyQnVmZmVyID0gRW5jb2RlckJ1ZmZlcjtcblxuRW5jb2RlckJ1ZmZlci5pc0VuY29kZXJCdWZmZXIgPSBmdW5jdGlvbiBpc0VuY29kZXJCdWZmZXIoZGF0YSkge1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIEVuY29kZXJCdWZmZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIE9yIGFjY2VwdCBjb21wYXRpYmxlIEFQSVxuICBjb25zdCBpc0NvbXBhdGlibGUgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICBkYXRhLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdFbmNvZGVyQnVmZmVyJyAmJlxuICAgIHR5cGVvZiBkYXRhLmxlbmd0aCA9PT0gJ251bWJlcicgJiZcbiAgICB0eXBlb2YgZGF0YS5qb2luID09PSAnZnVuY3Rpb24nO1xuXG4gIHJldHVybiBpc0NvbXBhdGlibGU7XG59O1xuXG5FbmNvZGVyQnVmZmVyLnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gam9pbihvdXQsIG9mZnNldCkge1xuICBpZiAoIW91dClcbiAgICBvdXQgPSBCdWZmZXIuYWxsb2ModGhpcy5sZW5ndGgpO1xuICBpZiAoIW9mZnNldClcbiAgICBvZmZzZXQgPSAwO1xuXG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gb3V0O1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgdGhpcy52YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgIGl0ZW0uam9pbihvdXQsIG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gaXRlbS5sZW5ndGg7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnZhbHVlID09PSAnbnVtYmVyJylcbiAgICAgIG91dFtvZmZzZXRdID0gdGhpcy52YWx1ZTtcbiAgICBlbHNlIGlmICh0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ3N0cmluZycpXG4gICAgICBvdXQud3JpdGUodGhpcy52YWx1ZSwgb2Zmc2V0KTtcbiAgICBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIodGhpcy52YWx1ZSkpXG4gICAgICB0aGlzLnZhbHVlLmNvcHkob3V0LCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSB0aGlzLmxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59O1xuIiwKICAgICJtb2R1bGUuZXhwb3J0cyA9IGFzc2VydDtcblxuZnVuY3Rpb24gYXNzZXJ0KHZhbCwgbXNnKSB7XG4gIGlmICghdmFsKVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cgfHwgJ0Fzc2VydGlvbiBmYWlsZWQnKTtcbn1cblxuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gYXNzZXJ0RXF1YWwobCwgciwgbXNnKSB7XG4gIGlmIChsICE9IHIpXG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCAoJ0Fzc2VydGlvbiBmYWlsZWQ6ICcgKyBsICsgJyAhPSAnICsgcikpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBSZXBvcnRlciA9IHJlcXVpcmUoJy4uL2Jhc2UvcmVwb3J0ZXInKS5SZXBvcnRlcjtcbmNvbnN0IEVuY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuLi9iYXNlL2J1ZmZlcicpLkVuY29kZXJCdWZmZXI7XG5jb25zdCBEZWNvZGVyQnVmZmVyID0gcmVxdWlyZSgnLi4vYmFzZS9idWZmZXInKS5EZWNvZGVyQnVmZmVyO1xuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG4vLyBTdXBwb3J0ZWQgdGFnc1xuY29uc3QgdGFncyA9IFtcbiAgJ3NlcScsICdzZXFvZicsICdzZXQnLCAnc2V0b2YnLCAnb2JqaWQnLCAnYm9vbCcsXG4gICdnZW50aW1lJywgJ3V0Y3RpbWUnLCAnbnVsbF8nLCAnZW51bScsICdpbnQnLCAnb2JqRGVzYycsXG4gICdiaXRzdHInLCAnYm1wc3RyJywgJ2NoYXJzdHInLCAnZ2Vuc3RyJywgJ2dyYXBoc3RyJywgJ2lhNXN0cicsICdpc282NDZzdHInLFxuICAnbnVtc3RyJywgJ29jdHN0cicsICdwcmludHN0cicsICd0NjFzdHInLCAndW5pc3RyJywgJ3V0ZjhzdHInLCAndmlkZW9zdHInXG5dO1xuXG4vLyBQdWJsaWMgbWV0aG9kcyBsaXN0XG5jb25zdCBtZXRob2RzID0gW1xuICAna2V5JywgJ29iaicsICd1c2UnLCAnb3B0aW9uYWwnLCAnZXhwbGljaXQnLCAnaW1wbGljaXQnLCAnZGVmJywgJ2Nob2ljZScsXG4gICdhbnknLCAnY29udGFpbnMnXG5dLmNvbmNhdCh0YWdzKTtcblxuLy8gT3ZlcnJpZGVkIG1ldGhvZHMgbGlzdFxuY29uc3Qgb3ZlcnJpZGVkID0gW1xuICAnX3BlZWtUYWcnLCAnX2RlY29kZVRhZycsICdfdXNlJyxcbiAgJ19kZWNvZGVTdHInLCAnX2RlY29kZU9iamlkJywgJ19kZWNvZGVUaW1lJyxcbiAgJ19kZWNvZGVOdWxsJywgJ19kZWNvZGVJbnQnLCAnX2RlY29kZUJvb2wnLCAnX2RlY29kZUxpc3QnLFxuXG4gICdfZW5jb2RlQ29tcG9zaXRlJywgJ19lbmNvZGVTdHInLCAnX2VuY29kZU9iamlkJywgJ19lbmNvZGVUaW1lJyxcbiAgJ19lbmNvZGVOdWxsJywgJ19lbmNvZGVJbnQnLCAnX2VuY29kZUJvb2wnXG5dO1xuXG5mdW5jdGlvbiBOb2RlKGVuYywgcGFyZW50LCBuYW1lKSB7XG4gIGNvbnN0IHN0YXRlID0ge307XG4gIHRoaXMuX2Jhc2VTdGF0ZSA9IHN0YXRlO1xuXG4gIHN0YXRlLm5hbWUgPSBuYW1lO1xuICBzdGF0ZS5lbmMgPSBlbmM7XG5cbiAgc3RhdGUucGFyZW50ID0gcGFyZW50IHx8IG51bGw7XG4gIHN0YXRlLmNoaWxkcmVuID0gbnVsbDtcblxuICAvLyBTdGF0ZVxuICBzdGF0ZS50YWcgPSBudWxsO1xuICBzdGF0ZS5hcmdzID0gbnVsbDtcbiAgc3RhdGUucmV2ZXJzZUFyZ3MgPSBudWxsO1xuICBzdGF0ZS5jaG9pY2UgPSBudWxsO1xuICBzdGF0ZS5vcHRpb25hbCA9IGZhbHNlO1xuICBzdGF0ZS5hbnkgPSBmYWxzZTtcbiAgc3RhdGUub2JqID0gZmFsc2U7XG4gIHN0YXRlLnVzZSA9IG51bGw7XG4gIHN0YXRlLnVzZURlY29kZXIgPSBudWxsO1xuICBzdGF0ZS5rZXkgPSBudWxsO1xuICBzdGF0ZVsnZGVmYXVsdCddID0gbnVsbDtcbiAgc3RhdGUuZXhwbGljaXQgPSBudWxsO1xuICBzdGF0ZS5pbXBsaWNpdCA9IG51bGw7XG4gIHN0YXRlLmNvbnRhaW5zID0gbnVsbDtcblxuICAvLyBTaG91bGQgY3JlYXRlIG5ldyBpbnN0YW5jZSBvbiBlYWNoIG1ldGhvZFxuICBpZiAoIXN0YXRlLnBhcmVudCkge1xuICAgIHN0YXRlLmNoaWxkcmVuID0gW107XG4gICAgdGhpcy5fd3JhcCgpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IE5vZGU7XG5cbmNvbnN0IHN0YXRlUHJvcHMgPSBbXG4gICdlbmMnLCAncGFyZW50JywgJ2NoaWxkcmVuJywgJ3RhZycsICdhcmdzJywgJ3JldmVyc2VBcmdzJywgJ2Nob2ljZScsXG4gICdvcHRpb25hbCcsICdhbnknLCAnb2JqJywgJ3VzZScsICdhbHRlcmVkVXNlJywgJ2tleScsICdkZWZhdWx0JywgJ2V4cGxpY2l0JyxcbiAgJ2ltcGxpY2l0JywgJ2NvbnRhaW5zJ1xuXTtcblxuTm9kZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIGNvbnN0IGNzdGF0ZSA9IHt9O1xuICBzdGF0ZVByb3BzLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgIGNzdGF0ZVtwcm9wXSA9IHN0YXRlW3Byb3BdO1xuICB9KTtcbiAgY29uc3QgcmVzID0gbmV3IHRoaXMuY29uc3RydWN0b3IoY3N0YXRlLnBhcmVudCk7XG4gIHJlcy5fYmFzZVN0YXRlID0gY3N0YXRlO1xuICByZXR1cm4gcmVzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX3dyYXAgPSBmdW5jdGlvbiB3cmFwKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgbWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgIHRoaXNbbWV0aG9kXSA9IGZ1bmN0aW9uIF93cmFwcGVkTWV0aG9kKCkge1xuICAgICAgY29uc3QgY2xvbmUgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKTtcbiAgICAgIHN0YXRlLmNoaWxkcmVuLnB1c2goY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lW21ldGhvZF0uYXBwbHkoY2xvbmUsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfSwgdGhpcyk7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIGluaXQoYm9keSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUucGFyZW50ID09PSBudWxsKTtcbiAgYm9keS5jYWxsKHRoaXMpO1xuXG4gIC8vIEZpbHRlciBjaGlsZHJlblxuICBzdGF0ZS5jaGlsZHJlbiA9IHN0YXRlLmNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbihjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZC5fYmFzZVN0YXRlLnBhcmVudCA9PT0gdGhpcztcbiAgfSwgdGhpcyk7XG4gIGFzc2VydC5lcXVhbChzdGF0ZS5jaGlsZHJlbi5sZW5ndGgsIDEsICdSb290IG5vZGUgY2FuIGhhdmUgb25seSBvbmUgY2hpbGQnKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl91c2VBcmdzID0gZnVuY3Rpb24gdXNlQXJncyhhcmdzKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIC8vIEZpbHRlciBjaGlsZHJlbiBhbmQgYXJnc1xuICBjb25zdCBjaGlsZHJlbiA9IGFyZ3MuZmlsdGVyKGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBhcmcgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yO1xuICB9LCB0aGlzKTtcbiAgYXJncyA9IGFyZ3MuZmlsdGVyKGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiAhKGFyZyBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IpO1xuICB9LCB0aGlzKTtcblxuICBpZiAoY2hpbGRyZW4ubGVuZ3RoICE9PSAwKSB7XG4gICAgYXNzZXJ0KHN0YXRlLmNoaWxkcmVuID09PSBudWxsKTtcbiAgICBzdGF0ZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgLy8gUmVwbGFjZSBwYXJlbnQgdG8gbWFpbnRhaW4gYmFja3dhcmQgbGlua1xuICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLl9iYXNlU3RhdGUucGFyZW50ID0gdGhpcztcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBpZiAoYXJncy5sZW5ndGggIT09IDApIHtcbiAgICBhc3NlcnQoc3RhdGUuYXJncyA9PT0gbnVsbCk7XG4gICAgc3RhdGUuYXJncyA9IGFyZ3M7XG4gICAgc3RhdGUucmV2ZXJzZUFyZ3MgPSBhcmdzLm1hcChmdW5jdGlvbihhcmcpIHtcbiAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAnb2JqZWN0JyB8fCBhcmcuY29uc3RydWN0b3IgIT09IE9iamVjdClcbiAgICAgICAgcmV0dXJuIGFyZztcblxuICAgICAgY29uc3QgcmVzID0ge307XG4gICAgICBPYmplY3Qua2V5cyhhcmcpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT0gKGtleSB8IDApKVxuICAgICAgICAgIGtleSB8PSAwO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZ1trZXldO1xuICAgICAgICByZXNbdmFsdWVdID0ga2V5O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICB9XG59O1xuXG4vL1xuLy8gT3ZlcnJpZGVkIG1ldGhvZHNcbi8vXG5cbm92ZXJyaWRlZC5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICBOb2RlLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gX292ZXJyaWRlZCgpIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWV0aG9kICsgJyBub3QgaW1wbGVtZW50ZWQgZm9yIGVuY29kaW5nOiAnICsgc3RhdGUuZW5jKTtcbiAgfTtcbn0pO1xuXG4vL1xuLy8gUHVibGljIG1ldGhvZHNcbi8vXG5cbnRhZ3MuZm9yRWFjaChmdW5jdGlvbih0YWcpIHtcbiAgTm9kZS5wcm90b3R5cGVbdGFnXSA9IGZ1bmN0aW9uIF90YWdNZXRob2QoKSB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgICBhc3NlcnQoc3RhdGUudGFnID09PSBudWxsKTtcbiAgICBzdGF0ZS50YWcgPSB0YWc7XG5cbiAgICB0aGlzLl91c2VBcmdzKGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59KTtcblxuTm9kZS5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gdXNlKGl0ZW0pIHtcbiAgYXNzZXJ0KGl0ZW0pO1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUudXNlID09PSBudWxsKTtcbiAgc3RhdGUudXNlID0gaXRlbTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLm9wdGlvbmFsID0gZnVuY3Rpb24gb3B0aW9uYWwoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIHN0YXRlLm9wdGlvbmFsID0gdHJ1ZTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmRlZiA9IGZ1bmN0aW9uIGRlZih2YWwpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlWydkZWZhdWx0J10gPT09IG51bGwpO1xuICBzdGF0ZVsnZGVmYXVsdCddID0gdmFsO1xuICBzdGF0ZS5vcHRpb25hbCA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5leHBsaWNpdCA9IGZ1bmN0aW9uIGV4cGxpY2l0KG51bSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUuZXhwbGljaXQgPT09IG51bGwgJiYgc3RhdGUuaW1wbGljaXQgPT09IG51bGwpO1xuICBzdGF0ZS5leHBsaWNpdCA9IG51bTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmltcGxpY2l0ID0gZnVuY3Rpb24gaW1wbGljaXQobnVtKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS5leHBsaWNpdCA9PT0gbnVsbCAmJiBzdGF0ZS5pbXBsaWNpdCA9PT0gbnVsbCk7XG4gIHN0YXRlLmltcGxpY2l0ID0gbnVtO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUub2JqID0gZnVuY3Rpb24gb2JqKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgc3RhdGUub2JqID0gdHJ1ZTtcblxuICBpZiAoYXJncy5sZW5ndGggIT09IDApXG4gICAgdGhpcy5fdXNlQXJncyhhcmdzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmtleSA9IGZ1bmN0aW9uIGtleShuZXdLZXkpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLmtleSA9PT0gbnVsbCk7XG4gIHN0YXRlLmtleSA9IG5ld0tleTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmFueSA9IGZ1bmN0aW9uIGFueSgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgc3RhdGUuYW55ID0gdHJ1ZTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmNob2ljZSA9IGZ1bmN0aW9uIGNob2ljZShvYmopIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLmNob2ljZSA9PT0gbnVsbCk7XG4gIHN0YXRlLmNob2ljZSA9IG9iajtcbiAgdGhpcy5fdXNlQXJncyhPYmplY3Qua2V5cyhvYmopLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH0pKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gY29udGFpbnMoaXRlbSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUudXNlID09PSBudWxsKTtcbiAgc3RhdGUuY29udGFpbnMgPSBpdGVtO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy9cbi8vIERlY29kaW5nXG4vL1xuXG5Ob2RlLnByb3RvdHlwZS5fZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIC8vIERlY29kZSByb290IG5vZGVcbiAgaWYgKHN0YXRlLnBhcmVudCA9PT0gbnVsbClcbiAgICByZXR1cm4gaW5wdXQud3JhcFJlc3VsdChzdGF0ZS5jaGlsZHJlblswXS5fZGVjb2RlKGlucHV0LCBvcHRpb25zKSk7XG5cbiAgbGV0IHJlc3VsdCA9IHN0YXRlWydkZWZhdWx0J107XG4gIGxldCBwcmVzZW50ID0gdHJ1ZTtcblxuICBsZXQgcHJldktleSA9IG51bGw7XG4gIGlmIChzdGF0ZS5rZXkgIT09IG51bGwpXG4gICAgcHJldktleSA9IGlucHV0LmVudGVyS2V5KHN0YXRlLmtleSk7XG5cbiAgLy8gQ2hlY2sgaWYgdGFnIGlzIHRoZXJlXG4gIGlmIChzdGF0ZS5vcHRpb25hbCkge1xuICAgIGxldCB0YWcgPSBudWxsO1xuICAgIGlmIChzdGF0ZS5leHBsaWNpdCAhPT0gbnVsbClcbiAgICAgIHRhZyA9IHN0YXRlLmV4cGxpY2l0O1xuICAgIGVsc2UgaWYgKHN0YXRlLmltcGxpY2l0ICE9PSBudWxsKVxuICAgICAgdGFnID0gc3RhdGUuaW1wbGljaXQ7XG4gICAgZWxzZSBpZiAoc3RhdGUudGFnICE9PSBudWxsKVxuICAgICAgdGFnID0gc3RhdGUudGFnO1xuXG4gICAgaWYgKHRhZyA9PT0gbnVsbCAmJiAhc3RhdGUuYW55KSB7XG4gICAgICAvLyBUcmlhbCBhbmQgRXJyb3JcbiAgICAgIGNvbnN0IHNhdmUgPSBpbnB1dC5zYXZlKCk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoc3RhdGUuY2hvaWNlID09PSBudWxsKVxuICAgICAgICAgIHRoaXMuX2RlY29kZUdlbmVyaWMoc3RhdGUudGFnLCBpbnB1dCwgb3B0aW9ucyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aGlzLl9kZWNvZGVDaG9pY2UoaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgICBwcmVzZW50ID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcHJlc2VudCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaW5wdXQucmVzdG9yZShzYXZlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlc2VudCA9IHRoaXMuX3BlZWtUYWcoaW5wdXQsIHRhZywgc3RhdGUuYW55KTtcblxuICAgICAgaWYgKGlucHV0LmlzRXJyb3IocHJlc2VudCkpXG4gICAgICAgIHJldHVybiBwcmVzZW50O1xuICAgIH1cbiAgfVxuXG4gIC8vIFB1c2ggb2JqZWN0IG9uIHN0YWNrXG4gIGxldCBwcmV2T2JqO1xuICBpZiAoc3RhdGUub2JqICYmIHByZXNlbnQpXG4gICAgcHJldk9iaiA9IGlucHV0LmVudGVyT2JqZWN0KCk7XG5cbiAgaWYgKHByZXNlbnQpIHtcbiAgICAvLyBVbndyYXAgZXhwbGljaXQgdmFsdWVzXG4gICAgaWYgKHN0YXRlLmV4cGxpY2l0ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBleHBsaWNpdCA9IHRoaXMuX2RlY29kZVRhZyhpbnB1dCwgc3RhdGUuZXhwbGljaXQpO1xuICAgICAgaWYgKGlucHV0LmlzRXJyb3IoZXhwbGljaXQpKVxuICAgICAgICByZXR1cm4gZXhwbGljaXQ7XG4gICAgICBpbnB1dCA9IGV4cGxpY2l0O1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gaW5wdXQub2Zmc2V0O1xuXG4gICAgLy8gVW53cmFwIGltcGxpY2l0IGFuZCBub3JtYWwgdmFsdWVzXG4gICAgaWYgKHN0YXRlLnVzZSA9PT0gbnVsbCAmJiBzdGF0ZS5jaG9pY2UgPT09IG51bGwpIHtcbiAgICAgIGxldCBzYXZlO1xuICAgICAgaWYgKHN0YXRlLmFueSlcbiAgICAgICAgc2F2ZSA9IGlucHV0LnNhdmUoKTtcbiAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLl9kZWNvZGVUYWcoXG4gICAgICAgIGlucHV0LFxuICAgICAgICBzdGF0ZS5pbXBsaWNpdCAhPT0gbnVsbCA/IHN0YXRlLmltcGxpY2l0IDogc3RhdGUudGFnLFxuICAgICAgICBzdGF0ZS5hbnlcbiAgICAgICk7XG4gICAgICBpZiAoaW5wdXQuaXNFcnJvcihib2R5KSlcbiAgICAgICAgcmV0dXJuIGJvZHk7XG5cbiAgICAgIGlmIChzdGF0ZS5hbnkpXG4gICAgICAgIHJlc3VsdCA9IGlucHV0LnJhdyhzYXZlKTtcbiAgICAgIGVsc2VcbiAgICAgICAgaW5wdXQgPSBib2R5O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudHJhY2sgJiYgc3RhdGUudGFnICE9PSBudWxsKVxuICAgICAgb3B0aW9ucy50cmFjayhpbnB1dC5wYXRoKCksIHN0YXJ0LCBpbnB1dC5sZW5ndGgsICd0YWdnZWQnKTtcblxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudHJhY2sgJiYgc3RhdGUudGFnICE9PSBudWxsKVxuICAgICAgb3B0aW9ucy50cmFjayhpbnB1dC5wYXRoKCksIGlucHV0Lm9mZnNldCwgaW5wdXQubGVuZ3RoLCAnY29udGVudCcpO1xuXG4gICAgLy8gU2VsZWN0IHByb3BlciBtZXRob2QgZm9yIHRhZ1xuICAgIGlmIChzdGF0ZS5hbnkpIHtcbiAgICAgIC8vIG5vLW9wXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5jaG9pY2UgPT09IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2RlY29kZUdlbmVyaWMoc3RhdGUudGFnLCBpbnB1dCwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2RlY29kZUNob2ljZShpbnB1dCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0LmlzRXJyb3IocmVzdWx0KSlcbiAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAvLyBEZWNvZGUgY2hpbGRyZW5cbiAgICBpZiAoIXN0YXRlLmFueSAmJiBzdGF0ZS5jaG9pY2UgPT09IG51bGwgJiYgc3RhdGUuY2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgIHN0YXRlLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gZGVjb2RlQ2hpbGRyZW4oY2hpbGQpIHtcbiAgICAgICAgLy8gTk9URTogV2UgYXJlIGlnbm9yaW5nIGVycm9ycyBoZXJlLCB0byBsZXQgcGFyc2VyIGNvbnRpbnVlIHdpdGggb3RoZXJcbiAgICAgICAgLy8gcGFydHMgb2YgZW5jb2RlZCBkYXRhXG4gICAgICAgIGNoaWxkLl9kZWNvZGUoaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRGVjb2RlIGNvbnRhaW5lZC9lbmNvZGVkIGJ5IHNjaGVtYSwgb25seSBpbiBiaXQgb3Igb2N0ZXQgc3RyaW5nc1xuICAgIGlmIChzdGF0ZS5jb250YWlucyAmJiAoc3RhdGUudGFnID09PSAnb2N0c3RyJyB8fCBzdGF0ZS50YWcgPT09ICdiaXRzdHInKSkge1xuICAgICAgY29uc3QgZGF0YSA9IG5ldyBEZWNvZGVyQnVmZmVyKHJlc3VsdCk7XG4gICAgICByZXN1bHQgPSB0aGlzLl9nZXRVc2Uoc3RhdGUuY29udGFpbnMsIGlucHV0Ll9yZXBvcnRlclN0YXRlLm9iailcbiAgICAgICAgLl9kZWNvZGUoZGF0YSwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLy8gUG9wIG9iamVjdFxuICBpZiAoc3RhdGUub2JqICYmIHByZXNlbnQpXG4gICAgcmVzdWx0ID0gaW5wdXQubGVhdmVPYmplY3QocHJldk9iaik7XG5cbiAgLy8gU2V0IGtleVxuICBpZiAoc3RhdGUua2V5ICE9PSBudWxsICYmIChyZXN1bHQgIT09IG51bGwgfHwgcHJlc2VudCA9PT0gdHJ1ZSkpXG4gICAgaW5wdXQubGVhdmVLZXkocHJldktleSwgc3RhdGUua2V5LCByZXN1bHQpO1xuICBlbHNlIGlmIChwcmV2S2V5ICE9PSBudWxsKVxuICAgIGlucHV0LmV4aXRLZXkocHJldktleSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9kZWNvZGVHZW5lcmljID0gZnVuY3Rpb24gZGVjb2RlR2VuZXJpYyh0YWcsIGlucHV0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGlmICh0YWcgPT09ICdzZXEnIHx8IHRhZyA9PT0gJ3NldCcpXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmICh0YWcgPT09ICdzZXFvZicgfHwgdGFnID09PSAnc2V0b2YnKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVMaXN0KGlucHV0LCB0YWcsIHN0YXRlLmFyZ3NbMF0sIG9wdGlvbnMpO1xuICBlbHNlIGlmICgvc3RyJC8udGVzdCh0YWcpKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVTdHIoaW5wdXQsIHRhZywgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJyAmJiBzdGF0ZS5hcmdzKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVPYmppZChpbnB1dCwgc3RhdGUuYXJnc1swXSwgc3RhdGUuYXJnc1sxXSwgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlT2JqaWQoaW5wdXQsIG51bGwsIG51bGwsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdnZW50aW1lJyB8fCB0YWcgPT09ICd1dGN0aW1lJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlVGltZShpbnB1dCwgdGFnLCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnbnVsbF8nKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVOdWxsKGlucHV0LCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnYm9vbCcpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZUJvb2woaW5wdXQsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmpEZXNjJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlU3RyKGlucHV0LCB0YWcsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdpbnQnIHx8IHRhZyA9PT0gJ2VudW0nKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVJbnQoaW5wdXQsIHN0YXRlLmFyZ3MgJiYgc3RhdGUuYXJnc1swXSwgb3B0aW9ucyk7XG5cbiAgaWYgKHN0YXRlLnVzZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRVc2Uoc3RhdGUudXNlLCBpbnB1dC5fcmVwb3J0ZXJTdGF0ZS5vYmopXG4gICAgICAuX2RlY29kZShpbnB1dCwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGlucHV0LmVycm9yKCd1bmtub3duIHRhZzogJyArIHRhZyk7XG4gIH1cbn07XG5cbk5vZGUucHJvdG90eXBlLl9nZXRVc2UgPSBmdW5jdGlvbiBfZ2V0VXNlKGVudGl0eSwgb2JqKSB7XG5cbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIC8vIENyZWF0ZSBhbHRlcmVkIHVzZSBkZWNvZGVyIGlmIGltcGxpY2l0IGlzIHNldFxuICBzdGF0ZS51c2VEZWNvZGVyID0gdGhpcy5fdXNlKGVudGl0eSwgb2JqKTtcbiAgYXNzZXJ0KHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5wYXJlbnQgPT09IG51bGwpO1xuICBzdGF0ZS51c2VEZWNvZGVyID0gc3RhdGUudXNlRGVjb2Rlci5fYmFzZVN0YXRlLmNoaWxkcmVuWzBdO1xuICBpZiAoc3RhdGUuaW1wbGljaXQgIT09IHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5pbXBsaWNpdCkge1xuICAgIHN0YXRlLnVzZURlY29kZXIgPSBzdGF0ZS51c2VEZWNvZGVyLmNsb25lKCk7XG4gICAgc3RhdGUudXNlRGVjb2Rlci5fYmFzZVN0YXRlLmltcGxpY2l0ID0gc3RhdGUuaW1wbGljaXQ7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLnVzZURlY29kZXI7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZGVjb2RlQ2hvaWNlID0gZnVuY3Rpb24gZGVjb2RlQ2hvaWNlKGlucHV0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgbGV0IG1hdGNoID0gZmFsc2U7XG5cbiAgT2JqZWN0LmtleXMoc3RhdGUuY2hvaWNlKS5zb21lKGZ1bmN0aW9uKGtleSkge1xuICAgIGNvbnN0IHNhdmUgPSBpbnB1dC5zYXZlKCk7XG4gICAgY29uc3Qgbm9kZSA9IHN0YXRlLmNob2ljZVtrZXldO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG5vZGUuX2RlY29kZShpbnB1dCwgb3B0aW9ucyk7XG4gICAgICBpZiAoaW5wdXQuaXNFcnJvcih2YWx1ZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgcmVzdWx0ID0geyB0eXBlOiBrZXksIHZhbHVlOiB2YWx1ZSB9O1xuICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlucHV0LnJlc3RvcmUoc2F2ZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LCB0aGlzKTtcblxuICBpZiAoIW1hdGNoKVxuICAgIHJldHVybiBpbnB1dC5lcnJvcignQ2hvaWNlIG5vdCBtYXRjaGVkJyk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vXG4vLyBFbmNvZGluZ1xuLy9cblxuTm9kZS5wcm90b3R5cGUuX2NyZWF0ZUVuY29kZXJCdWZmZXIgPSBmdW5jdGlvbiBjcmVhdGVFbmNvZGVyQnVmZmVyKGRhdGEpIHtcbiAgcmV0dXJuIG5ldyBFbmNvZGVyQnVmZmVyKGRhdGEsIHRoaXMucmVwb3J0ZXIpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2VuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCByZXBvcnRlciwgcGFyZW50KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBpZiAoc3RhdGVbJ2RlZmF1bHQnXSAhPT0gbnVsbCAmJiBzdGF0ZVsnZGVmYXVsdCddID09PSBkYXRhKVxuICAgIHJldHVybjtcblxuICBjb25zdCByZXN1bHQgPSB0aGlzLl9lbmNvZGVWYWx1ZShkYXRhLCByZXBvcnRlciwgcGFyZW50KTtcbiAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybjtcblxuICBpZiAodGhpcy5fc2tpcERlZmF1bHQocmVzdWx0LCByZXBvcnRlciwgcGFyZW50KSlcbiAgICByZXR1cm47XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9lbmNvZGVWYWx1ZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCByZXBvcnRlciwgcGFyZW50KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIC8vIERlY29kZSByb290IG5vZGVcbiAgaWYgKHN0YXRlLnBhcmVudCA9PT0gbnVsbClcbiAgICByZXR1cm4gc3RhdGUuY2hpbGRyZW5bMF0uX2VuY29kZShkYXRhLCByZXBvcnRlciB8fCBuZXcgUmVwb3J0ZXIoKSk7XG5cbiAgbGV0IHJlc3VsdCA9IG51bGw7XG5cbiAgLy8gU2V0IHJlcG9ydGVyIHRvIHNoYXJlIGl0IHdpdGggYSBjaGlsZCBjbGFzc1xuICB0aGlzLnJlcG9ydGVyID0gcmVwb3J0ZXI7XG5cbiAgLy8gQ2hlY2sgaWYgZGF0YSBpcyB0aGVyZVxuICBpZiAoc3RhdGUub3B0aW9uYWwgJiYgZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHN0YXRlWydkZWZhdWx0J10gIT09IG51bGwpXG4gICAgICBkYXRhID0gc3RhdGVbJ2RlZmF1bHQnXTtcbiAgICBlbHNlXG4gICAgICByZXR1cm47XG4gIH1cblxuICAvLyBFbmNvZGUgY2hpbGRyZW4gZmlyc3RcbiAgbGV0IGNvbnRlbnQgPSBudWxsO1xuICBsZXQgcHJpbWl0aXZlID0gZmFsc2U7XG4gIGlmIChzdGF0ZS5hbnkpIHtcbiAgICAvLyBBbnl0aGluZyB0aGF0IHdhcyBnaXZlbiBpcyB0cmFuc2xhdGVkIHRvIGJ1ZmZlclxuICAgIHJlc3VsdCA9IHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoZGF0YSk7XG4gIH0gZWxzZSBpZiAoc3RhdGUuY2hvaWNlKSB7XG4gICAgcmVzdWx0ID0gdGhpcy5fZW5jb2RlQ2hvaWNlKGRhdGEsIHJlcG9ydGVyKTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5jb250YWlucykge1xuICAgIGNvbnRlbnQgPSB0aGlzLl9nZXRVc2Uoc3RhdGUuY29udGFpbnMsIHBhcmVudCkuX2VuY29kZShkYXRhLCByZXBvcnRlcik7XG4gICAgcHJpbWl0aXZlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5jaGlsZHJlbikge1xuICAgIGNvbnRlbnQgPSBzdGF0ZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZC5fYmFzZVN0YXRlLnRhZyA9PT0gJ251bGxfJylcbiAgICAgICAgcmV0dXJuIGNoaWxkLl9lbmNvZGUobnVsbCwgcmVwb3J0ZXIsIGRhdGEpO1xuXG4gICAgICBpZiAoY2hpbGQuX2Jhc2VTdGF0ZS5rZXkgPT09IG51bGwpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignQ2hpbGQgc2hvdWxkIGhhdmUgYSBrZXknKTtcbiAgICAgIGNvbnN0IHByZXZLZXkgPSByZXBvcnRlci5lbnRlcktleShjaGlsZC5fYmFzZVN0YXRlLmtleSk7XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignQ2hpbGQgZXhwZWN0ZWQsIGJ1dCBpbnB1dCBpcyBub3Qgb2JqZWN0Jyk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGNoaWxkLl9lbmNvZGUoZGF0YVtjaGlsZC5fYmFzZVN0YXRlLmtleV0sIHJlcG9ydGVyLCBkYXRhKTtcbiAgICAgIHJlcG9ydGVyLmxlYXZlS2V5KHByZXZLZXkpO1xuXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0sIHRoaXMpLmZpbHRlcihmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH0pO1xuICAgIGNvbnRlbnQgPSB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGNvbnRlbnQpO1xuICB9IGVsc2Uge1xuICAgIGlmIChzdGF0ZS50YWcgPT09ICdzZXFvZicgfHwgc3RhdGUudGFnID09PSAnc2V0b2YnKSB7XG4gICAgICAvLyBUT0RPKGluZHV0bnkpOiB0aGlzIHNob3VsZCBiZSB0aHJvd24gb24gRFNMIGxldmVsXG4gICAgICBpZiAoIShzdGF0ZS5hcmdzICYmIHN0YXRlLmFyZ3MubGVuZ3RoID09PSAxKSlcbiAgICAgICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdUb28gbWFueSBhcmdzIGZvciA6ICcgKyBzdGF0ZS50YWcpO1xuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignc2Vxb2Yvc2V0b2YsIGJ1dCBkYXRhIGlzIG5vdCBBcnJheScpO1xuXG4gICAgICBjb25zdCBjaGlsZCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgIGNoaWxkLl9iYXNlU3RhdGUuaW1wbGljaXQgPSBudWxsO1xuICAgICAgY29udGVudCA9IHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoZGF0YS5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0VXNlKHN0YXRlLmFyZ3NbMF0sIGRhdGEpLl9lbmNvZGUoaXRlbSwgcmVwb3J0ZXIpO1xuICAgICAgfSwgY2hpbGQpKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLnVzZSAhPT0gbnVsbCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5fZ2V0VXNlKHN0YXRlLnVzZSwgcGFyZW50KS5fZW5jb2RlKGRhdGEsIHJlcG9ydGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudCA9IHRoaXMuX2VuY29kZVByaW1pdGl2ZShzdGF0ZS50YWcsIGRhdGEpO1xuICAgICAgcHJpbWl0aXZlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBFbmNvZGUgZGF0YSBpdHNlbGZcbiAgaWYgKCFzdGF0ZS5hbnkgJiYgc3RhdGUuY2hvaWNlID09PSBudWxsKSB7XG4gICAgY29uc3QgdGFnID0gc3RhdGUuaW1wbGljaXQgIT09IG51bGwgPyBzdGF0ZS5pbXBsaWNpdCA6IHN0YXRlLnRhZztcbiAgICBjb25zdCBjbHMgPSBzdGF0ZS5pbXBsaWNpdCA9PT0gbnVsbCA/ICd1bml2ZXJzYWwnIDogJ2NvbnRleHQnO1xuXG4gICAgaWYgKHRhZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKHN0YXRlLnVzZSA9PT0gbnVsbClcbiAgICAgICAgcmVwb3J0ZXIuZXJyb3IoJ1RhZyBjb3VsZCBiZSBvbWl0dGVkIG9ubHkgZm9yIC51c2UoKScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdGUudXNlID09PSBudWxsKVxuICAgICAgICByZXN1bHQgPSB0aGlzLl9lbmNvZGVDb21wb3NpdGUodGFnLCBwcmltaXRpdmUsIGNscywgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgLy8gV3JhcCBpbiBleHBsaWNpdFxuICBpZiAoc3RhdGUuZXhwbGljaXQgIT09IG51bGwpXG4gICAgcmVzdWx0ID0gdGhpcy5fZW5jb2RlQ29tcG9zaXRlKHN0YXRlLmV4cGxpY2l0LCBmYWxzZSwgJ2NvbnRleHQnLCByZXN1bHQpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZW5jb2RlQ2hvaWNlID0gZnVuY3Rpb24gZW5jb2RlQ2hvaWNlKGRhdGEsIHJlcG9ydGVyKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGNvbnN0IG5vZGUgPSBzdGF0ZS5jaG9pY2VbZGF0YS50eXBlXTtcbiAgaWYgKCFub2RlKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgZmFsc2UsXG4gICAgICBkYXRhLnR5cGUgKyAnIG5vdCBmb3VuZCBpbiAnICtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHN0YXRlLmNob2ljZSkpKTtcbiAgfVxuICByZXR1cm4gbm9kZS5fZW5jb2RlKGRhdGEudmFsdWUsIHJlcG9ydGVyKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9lbmNvZGVQcmltaXRpdmUgPSBmdW5jdGlvbiBlbmNvZGVQcmltaXRpdmUodGFnLCBkYXRhKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGlmICgvc3RyJC8udGVzdCh0YWcpKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVTdHIoZGF0YSwgdGFnKTtcbiAgZWxzZSBpZiAodGFnID09PSAnb2JqaWQnICYmIHN0YXRlLmFyZ3MpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZU9iamlkKGRhdGEsIHN0YXRlLnJldmVyc2VBcmdzWzBdLCBzdGF0ZS5hcmdzWzFdKTtcbiAgZWxzZSBpZiAodGFnID09PSAnb2JqaWQnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVPYmppZChkYXRhLCBudWxsLCBudWxsKTtcbiAgZWxzZSBpZiAodGFnID09PSAnZ2VudGltZScgfHwgdGFnID09PSAndXRjdGltZScpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZVRpbWUoZGF0YSwgdGFnKTtcbiAgZWxzZSBpZiAodGFnID09PSAnbnVsbF8nKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVOdWxsKCk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2ludCcgfHwgdGFnID09PSAnZW51bScpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZUludChkYXRhLCBzdGF0ZS5hcmdzICYmIHN0YXRlLnJldmVyc2VBcmdzWzBdKTtcbiAgZWxzZSBpZiAodGFnID09PSAnYm9vbCcpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZUJvb2woZGF0YSk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iakRlc2MnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVTdHIoZGF0YSwgdGFnKTtcbiAgZWxzZVxuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdGFnOiAnICsgdGFnKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9pc051bXN0ciA9IGZ1bmN0aW9uIGlzTnVtc3RyKHN0cikge1xuICByZXR1cm4gL15bMC05IF0qJC8udGVzdChzdHIpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2lzUHJpbnRzdHIgPSBmdW5jdGlvbiBpc1ByaW50c3RyKHN0cikge1xuICByZXR1cm4gL15bQS1aYS16MC05ICcoKSssLS4vOj0/XSokLy50ZXN0KHN0cik7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbi8vIEhlbHBlclxuZnVuY3Rpb24gcmV2ZXJzZShtYXApIHtcbiAgY29uc3QgcmVzID0ge307XG5cbiAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIC8vIENvbnZlcnQga2V5IHRvIGludGVnZXIgaWYgaXQgaXMgc3RyaW5naWZpZWRcbiAgICBpZiAoKGtleSB8IDApID09IGtleSlcbiAgICAgIGtleSA9IGtleSB8IDA7XG5cbiAgICBjb25zdCB2YWx1ZSA9IG1hcFtrZXldO1xuICAgIHJlc1t2YWx1ZV0gPSBrZXk7XG4gIH0pO1xuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydHMudGFnQ2xhc3MgPSB7XG4gIDA6ICd1bml2ZXJzYWwnLFxuICAxOiAnYXBwbGljYXRpb24nLFxuICAyOiAnY29udGV4dCcsXG4gIDM6ICdwcml2YXRlJ1xufTtcbmV4cG9ydHMudGFnQ2xhc3NCeU5hbWUgPSByZXZlcnNlKGV4cG9ydHMudGFnQ2xhc3MpO1xuXG5leHBvcnRzLnRhZyA9IHtcbiAgMHgwMDogJ2VuZCcsXG4gIDB4MDE6ICdib29sJyxcbiAgMHgwMjogJ2ludCcsXG4gIDB4MDM6ICdiaXRzdHInLFxuICAweDA0OiAnb2N0c3RyJyxcbiAgMHgwNTogJ251bGxfJyxcbiAgMHgwNjogJ29iamlkJyxcbiAgMHgwNzogJ29iakRlc2MnLFxuICAweDA4OiAnZXh0ZXJuYWwnLFxuICAweDA5OiAncmVhbCcsXG4gIDB4MGE6ICdlbnVtJyxcbiAgMHgwYjogJ2VtYmVkJyxcbiAgMHgwYzogJ3V0ZjhzdHInLFxuICAweDBkOiAncmVsYXRpdmVPaWQnLFxuICAweDEwOiAnc2VxJyxcbiAgMHgxMTogJ3NldCcsXG4gIDB4MTI6ICdudW1zdHInLFxuICAweDEzOiAncHJpbnRzdHInLFxuICAweDE0OiAndDYxc3RyJyxcbiAgMHgxNTogJ3ZpZGVvc3RyJyxcbiAgMHgxNjogJ2lhNXN0cicsXG4gIDB4MTc6ICd1dGN0aW1lJyxcbiAgMHgxODogJ2dlbnRpbWUnLFxuICAweDE5OiAnZ3JhcGhzdHInLFxuICAweDFhOiAnaXNvNjQ2c3RyJyxcbiAgMHgxYjogJ2dlbnN0cicsXG4gIDB4MWM6ICd1bmlzdHInLFxuICAweDFkOiAnY2hhcnN0cicsXG4gIDB4MWU6ICdibXBzdHInXG59O1xuZXhwb3J0cy50YWdCeU5hbWUgPSByZXZlcnNlKGV4cG9ydHMudGFnKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5jb25zdCBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG5jb25zdCBOb2RlID0gcmVxdWlyZSgnLi4vYmFzZS9ub2RlJyk7XG5cbi8vIEltcG9ydCBERVIgY29uc3RhbnRzXG5jb25zdCBkZXIgPSByZXF1aXJlKCcuLi9jb25zdGFudHMvZGVyJyk7XG5cbmZ1bmN0aW9uIERFUkVuY29kZXIoZW50aXR5KSB7XG4gIHRoaXMuZW5jID0gJ2Rlcic7XG4gIHRoaXMubmFtZSA9IGVudGl0eS5uYW1lO1xuICB0aGlzLmVudGl0eSA9IGVudGl0eTtcblxuICAvLyBDb25zdHJ1Y3QgYmFzZSB0cmVlXG4gIHRoaXMudHJlZSA9IG5ldyBERVJOb2RlKCk7XG4gIHRoaXMudHJlZS5faW5pdChlbnRpdHkuYm9keSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IERFUkVuY29kZXI7XG5cbkRFUkVuY29kZXIucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCByZXBvcnRlcikge1xuICByZXR1cm4gdGhpcy50cmVlLl9lbmNvZGUoZGF0YSwgcmVwb3J0ZXIpLmpvaW4oKTtcbn07XG5cbi8vIFRyZWUgbWV0aG9kc1xuXG5mdW5jdGlvbiBERVJOb2RlKHBhcmVudCkge1xuICBOb2RlLmNhbGwodGhpcywgJ2RlcicsIHBhcmVudCk7XG59XG5pbmhlcml0cyhERVJOb2RlLCBOb2RlKTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZUNvbXBvc2l0ZSA9IGZ1bmN0aW9uIGVuY29kZUNvbXBvc2l0ZSh0YWcsXG4gIHByaW1pdGl2ZSxcbiAgY2xzLFxuICBjb250ZW50KSB7XG4gIGNvbnN0IGVuY29kZWRUYWcgPSBlbmNvZGVUYWcodGFnLCBwcmltaXRpdmUsIGNscywgdGhpcy5yZXBvcnRlcik7XG5cbiAgLy8gU2hvcnQgZm9ybVxuICBpZiAoY29udGVudC5sZW5ndGggPCAweDgwKSB7XG4gICAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIpO1xuICAgIGhlYWRlclswXSA9IGVuY29kZWRUYWc7XG4gICAgaGVhZGVyWzFdID0gY29udGVudC5sZW5ndGg7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoWyBoZWFkZXIsIGNvbnRlbnQgXSk7XG4gIH1cblxuICAvLyBMb25nIGZvcm1cbiAgLy8gQ291bnQgb2N0ZXRzIHJlcXVpcmVkIHRvIHN0b3JlIGxlbmd0aFxuICBsZXQgbGVuT2N0ZXRzID0gMTtcbiAgZm9yIChsZXQgaSA9IGNvbnRlbnQubGVuZ3RoOyBpID49IDB4MTAwOyBpID4+PSA4KVxuICAgIGxlbk9jdGV0cysrO1xuXG4gIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYygxICsgMSArIGxlbk9jdGV0cyk7XG4gIGhlYWRlclswXSA9IGVuY29kZWRUYWc7XG4gIGhlYWRlclsxXSA9IDB4ODAgfCBsZW5PY3RldHM7XG5cbiAgZm9yIChsZXQgaSA9IDEgKyBsZW5PY3RldHMsIGogPSBjb250ZW50Lmxlbmd0aDsgaiA+IDA7IGktLSwgaiA+Pj0gOClcbiAgICBoZWFkZXJbaV0gPSBqICYgMHhmZjtcblxuICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbIGhlYWRlciwgY29udGVudCBdKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVTdHIgPSBmdW5jdGlvbiBlbmNvZGVTdHIoc3RyLCB0YWcpIHtcbiAgaWYgKHRhZyA9PT0gJ2JpdHN0cicpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbIHN0ci51bnVzZWQgfCAwLCBzdHIuZGF0YSBdKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdibXBzdHInKSB7XG4gICAgY29uc3QgYnVmID0gQnVmZmVyLmFsbG9jKHN0ci5sZW5ndGggKiAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgYnVmLndyaXRlVUludDE2QkUoc3RyLmNoYXJDb2RlQXQoaSksIGkgKiAyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoYnVmKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdudW1zdHInKSB7XG4gICAgaWYgKCF0aGlzLl9pc051bXN0cihzdHIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignRW5jb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IG51bXN0ciBzdXBwb3J0cyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbmx5IGRpZ2l0cyBhbmQgc3BhY2UnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoc3RyKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdwcmludHN0cicpIHtcbiAgICBpZiAoIXRoaXMuX2lzUHJpbnRzdHIoc3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ0VuY29kaW5nIG9mIHN0cmluZyB0eXBlOiBwcmludHN0ciBzdXBwb3J0cyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbmx5IGxhdGluIHVwcGVyIGFuZCBsb3dlciBjYXNlIGxldHRlcnMsICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpZ2l0cywgc3BhY2UsIGFwb3N0cm9waGUsIGxlZnQgYW5kIHJpZ3RoICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhcmVudGhlc2lzLCBwbHVzIHNpZ24sIGNvbW1hLCBoeXBoZW4sICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RvdCwgc2xhc2gsIGNvbG9uLCBlcXVhbCBzaWduLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxdWVzdGlvbiBtYXJrJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik7XG4gIH0gZWxzZSBpZiAoL3N0ciQvLnRlc3QodGFnKSkge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnb2JqRGVzYycpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzdHIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArIHRhZyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyB1bnN1cHBvcnRlZCcpO1xuICB9XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlT2JqaWQgPSBmdW5jdGlvbiBlbmNvZGVPYmppZChpZCwgdmFsdWVzLCByZWxhdGl2ZSkge1xuICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgIGlmICghdmFsdWVzKVxuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ3N0cmluZyBvYmppZCBnaXZlbiwgYnV0IG5vIHZhbHVlcyBtYXAgZm91bmQnKTtcbiAgICBpZiAoIXZhbHVlcy5oYXNPd25Qcm9wZXJ0eShpZCkpXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignb2JqaWQgbm90IGZvdW5kIGluIHZhbHVlcyBtYXAnKTtcbiAgICBpZCA9IHZhbHVlc1tpZF0uc3BsaXQoL1tcXHMuXSsvZyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZC5sZW5ndGg7IGkrKylcbiAgICAgIGlkW2ldIHw9IDA7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICBpZCA9IGlkLnNsaWNlKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZC5sZW5ndGg7IGkrKylcbiAgICAgIGlkW2ldIHw9IDA7XG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkoaWQpKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ29iamlkKCkgc2hvdWxkIGJlIGVpdGhlciBhcnJheSBvciBzdHJpbmcsICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnb3Q6ICcgKyBKU09OLnN0cmluZ2lmeShpZCkpO1xuICB9XG5cbiAgaWYgKCFyZWxhdGl2ZSkge1xuICAgIGlmIChpZFsxXSA+PSA0MClcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdTZWNvbmQgb2JqaWQgaWRlbnRpZmllciBPT0InKTtcbiAgICBpZC5zcGxpY2UoMCwgMiwgaWRbMF0gKiA0MCArIGlkWzFdKTtcbiAgfVxuXG4gIC8vIENvdW50IG51bWJlciBvZiBvY3RldHNcbiAgbGV0IHNpemUgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGlkLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGlkZW50ID0gaWRbaV07XG4gICAgZm9yIChzaXplKys7IGlkZW50ID49IDB4ODA7IGlkZW50ID4+PSA3KVxuICAgICAgc2l6ZSsrO1xuICB9XG5cbiAgY29uc3Qgb2JqaWQgPSBCdWZmZXIuYWxsb2Moc2l6ZSk7XG4gIGxldCBvZmZzZXQgPSBvYmppZC5sZW5ndGggLSAxO1xuICBmb3IgKGxldCBpID0gaWQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBsZXQgaWRlbnQgPSBpZFtpXTtcbiAgICBvYmppZFtvZmZzZXQtLV0gPSBpZGVudCAmIDB4N2Y7XG4gICAgd2hpbGUgKChpZGVudCA+Pj0gNykgPiAwKVxuICAgICAgb2JqaWRbb2Zmc2V0LS1dID0gMHg4MCB8IChpZGVudCAmIDB4N2YpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIob2JqaWQpO1xufTtcblxuZnVuY3Rpb24gdHdvKG51bSkge1xuICBpZiAobnVtIDwgMTApXG4gICAgcmV0dXJuICcwJyArIG51bTtcbiAgZWxzZVxuICAgIHJldHVybiBudW07XG59XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVUaW1lID0gZnVuY3Rpb24gZW5jb2RlVGltZSh0aW1lLCB0YWcpIHtcbiAgbGV0IHN0cjtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRpbWUpO1xuXG4gIGlmICh0YWcgPT09ICdnZW50aW1lJykge1xuICAgIHN0ciA9IFtcbiAgICAgIHR3byhkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDRGF0ZSgpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ0hvdXJzKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTWludXRlcygpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ1NlY29uZHMoKSksXG4gICAgICAnWidcbiAgICBdLmpvaW4oJycpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3V0Y3RpbWUnKSB7XG4gICAgc3RyID0gW1xuICAgICAgdHdvKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSAlIDEwMCksXG4gICAgICB0d28oZGF0ZS5nZXRVVENNb250aCgpICsgMSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENEYXRlKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDSG91cnMoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENNaW51dGVzKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDU2Vjb25kcygpKSxcbiAgICAgICdaJ1xuICAgIF0uam9pbignJyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5yZXBvcnRlci5lcnJvcignRW5jb2RpbmcgJyArIHRhZyArICcgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldCcpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2VuY29kZVN0cihzdHIsICdvY3RzdHInKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVOdWxsID0gZnVuY3Rpb24gZW5jb2RlTnVsbCgpIHtcbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoJycpO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZUludCA9IGZ1bmN0aW9uIGVuY29kZUludChudW0sIHZhbHVlcykge1xuICBpZiAodHlwZW9mIG51bSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIXZhbHVlcylcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdTdHJpbmcgaW50IG9yIGVudW0gZ2l2ZW4sIGJ1dCBubyB2YWx1ZXMgbWFwJyk7XG4gICAgaWYgKCF2YWx1ZXMuaGFzT3duUHJvcGVydHkobnVtKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ1ZhbHVlcyBtYXAgZG9lc25cXCd0IGNvbnRhaW46ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobnVtKSk7XG4gICAgfVxuICAgIG51bSA9IHZhbHVlc1tudW1dO1xuICB9XG5cbiAgLy8gQmlnbnVtLCBhc3N1bWUgYmlnIGVuZGlhblxuICBpZiAodHlwZW9mIG51bSAhPT0gJ251bWJlcicgJiYgIUJ1ZmZlci5pc0J1ZmZlcihudW0pKSB7XG4gICAgY29uc3QgbnVtQXJyYXkgPSBudW0udG9BcnJheSgpO1xuICAgIGlmICghbnVtLnNpZ24gJiYgbnVtQXJyYXlbMF0gJiAweDgwKSB7XG4gICAgICBudW1BcnJheS51bnNoaWZ0KDApO1xuICAgIH1cbiAgICBudW0gPSBCdWZmZXIuZnJvbShudW1BcnJheSk7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG51bSkpIHtcbiAgICBsZXQgc2l6ZSA9IG51bS5sZW5ndGg7XG4gICAgaWYgKG51bS5sZW5ndGggPT09IDApXG4gICAgICBzaXplKys7XG5cbiAgICBjb25zdCBvdXQgPSBCdWZmZXIuYWxsb2Moc2l6ZSk7XG4gICAgbnVtLmNvcHkob3V0KTtcbiAgICBpZiAobnVtLmxlbmd0aCA9PT0gMClcbiAgICAgIG91dFswXSA9IDA7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIob3V0KTtcbiAgfVxuXG4gIGlmIChudW0gPCAweDgwKVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG51bSk7XG5cbiAgaWYgKG51bSA8IDB4MTAwKVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFswLCBudW1dKTtcblxuICBsZXQgc2l6ZSA9IDE7XG4gIGZvciAobGV0IGkgPSBudW07IGkgPj0gMHgxMDA7IGkgPj49IDgpXG4gICAgc2l6ZSsrO1xuXG4gIGNvbnN0IG91dCA9IG5ldyBBcnJheShzaXplKTtcbiAgZm9yIChsZXQgaSA9IG91dC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIG91dFtpXSA9IG51bSAmIDB4ZmY7XG4gICAgbnVtID4+PSA4O1xuICB9XG4gIGlmKG91dFswXSAmIDB4ODApIHtcbiAgICBvdXQudW5zaGlmdCgwKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKEJ1ZmZlci5mcm9tKG91dCkpO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZUJvb2wgPSBmdW5jdGlvbiBlbmNvZGVCb29sKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHZhbHVlID8gMHhmZiA6IDApO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX3VzZSA9IGZ1bmN0aW9uIHVzZShlbnRpdHksIG9iaikge1xuICBpZiAodHlwZW9mIGVudGl0eSA9PT0gJ2Z1bmN0aW9uJylcbiAgICBlbnRpdHkgPSBlbnRpdHkob2JqKTtcbiAgcmV0dXJuIGVudGl0eS5fZ2V0RW5jb2RlcignZGVyJykudHJlZTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9za2lwRGVmYXVsdCA9IGZ1bmN0aW9uIHNraXBEZWZhdWx0KGRhdGFCdWZmZXIsIHJlcG9ydGVyLCBwYXJlbnQpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIGxldCBpO1xuICBpZiAoc3RhdGVbJ2RlZmF1bHQnXSA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZGF0YSA9IGRhdGFCdWZmZXIuam9pbigpO1xuICBpZiAoc3RhdGUuZGVmYXVsdEJ1ZmZlciA9PT0gdW5kZWZpbmVkKVxuICAgIHN0YXRlLmRlZmF1bHRCdWZmZXIgPSB0aGlzLl9lbmNvZGVWYWx1ZShzdGF0ZVsnZGVmYXVsdCddLCByZXBvcnRlciwgcGFyZW50KS5qb2luKCk7XG5cbiAgaWYgKGRhdGEubGVuZ3RoICE9PSBzdGF0ZS5kZWZhdWx0QnVmZmVyLmxlbmd0aClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgZm9yIChpPTA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKVxuICAgIGlmIChkYXRhW2ldICE9PSBzdGF0ZS5kZWZhdWx0QnVmZmVyW2ldKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLy8gVXRpbGl0eSBtZXRob2RzXG5cbmZ1bmN0aW9uIGVuY29kZVRhZyh0YWcsIHByaW1pdGl2ZSwgY2xzLCByZXBvcnRlcikge1xuICBsZXQgcmVzO1xuXG4gIGlmICh0YWcgPT09ICdzZXFvZicpXG4gICAgdGFnID0gJ3NlcSc7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ3NldG9mJylcbiAgICB0YWcgPSAnc2V0JztcblxuICBpZiAoZGVyLnRhZ0J5TmFtZS5oYXNPd25Qcm9wZXJ0eSh0YWcpKVxuICAgIHJlcyA9IGRlci50YWdCeU5hbWVbdGFnXTtcbiAgZWxzZSBpZiAodHlwZW9mIHRhZyA9PT0gJ251bWJlcicgJiYgKHRhZyB8IDApID09PSB0YWcpXG4gICAgcmVzID0gdGFnO1xuICBlbHNlXG4gICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdVbmtub3duIHRhZzogJyArIHRhZyk7XG5cbiAgaWYgKHJlcyA+PSAweDFmKVxuICAgIHJldHVybiByZXBvcnRlci5lcnJvcignTXVsdGktb2N0ZXQgdGFnIGVuY29kaW5nIHVuc3VwcG9ydGVkJyk7XG5cbiAgaWYgKCFwcmltaXRpdmUpXG4gICAgcmVzIHw9IDB4MjA7XG5cbiAgcmVzIHw9IChkZXIudGFnQ2xhc3NCeU5hbWVbY2xzIHx8ICd1bml2ZXJzYWwnXSA8PCA2KTtcblxuICByZXR1cm4gcmVzO1xufVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuY29uc3QgREVSRW5jb2RlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG5cbmZ1bmN0aW9uIFBFTUVuY29kZXIoZW50aXR5KSB7XG4gIERFUkVuY29kZXIuY2FsbCh0aGlzLCBlbnRpdHkpO1xuICB0aGlzLmVuYyA9ICdwZW0nO1xufVxuaW5oZXJpdHMoUEVNRW5jb2RlciwgREVSRW5jb2Rlcik7XG5tb2R1bGUuZXhwb3J0cyA9IFBFTUVuY29kZXI7XG5cblBFTUVuY29kZXIucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCBvcHRpb25zKSB7XG4gIGNvbnN0IGJ1ZiA9IERFUkVuY29kZXIucHJvdG90eXBlLmVuY29kZS5jYWxsKHRoaXMsIGRhdGEpO1xuXG4gIGNvbnN0IHAgPSBidWYudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICBjb25zdCBvdXQgPSBbICctLS0tLUJFR0lOICcgKyBvcHRpb25zLmxhYmVsICsgJy0tLS0tJyBdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHAubGVuZ3RoOyBpICs9IDY0KVxuICAgIG91dC5wdXNoKHAuc2xpY2UoaSwgaSArIDY0KSk7XG4gIG91dC5wdXNoKCctLS0tLUVORCAnICsgb3B0aW9ucy5sYWJlbCArICctLS0tLScpO1xuICByZXR1cm4gb3V0LmpvaW4oJ1xcbicpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBlbmNvZGVycyA9IGV4cG9ydHM7XG5cbmVuY29kZXJzLmRlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG5lbmNvZGVycy5wZW0gPSByZXF1aXJlKCcuL3BlbScpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuY29uc3QgYmlnbnVtID0gcmVxdWlyZSgnYm4uanMnKTtcbmNvbnN0IERlY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuLi9iYXNlL2J1ZmZlcicpLkRlY29kZXJCdWZmZXI7XG5jb25zdCBOb2RlID0gcmVxdWlyZSgnLi4vYmFzZS9ub2RlJyk7XG5cbi8vIEltcG9ydCBERVIgY29uc3RhbnRzXG5jb25zdCBkZXIgPSByZXF1aXJlKCcuLi9jb25zdGFudHMvZGVyJyk7XG5cbmZ1bmN0aW9uIERFUkRlY29kZXIoZW50aXR5KSB7XG4gIHRoaXMuZW5jID0gJ2Rlcic7XG4gIHRoaXMubmFtZSA9IGVudGl0eS5uYW1lO1xuICB0aGlzLmVudGl0eSA9IGVudGl0eTtcblxuICAvLyBDb25zdHJ1Y3QgYmFzZSB0cmVlXG4gIHRoaXMudHJlZSA9IG5ldyBERVJOb2RlKCk7XG4gIHRoaXMudHJlZS5faW5pdChlbnRpdHkuYm9keSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IERFUkRlY29kZXI7XG5cbkRFUkRlY29kZXIucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShkYXRhLCBvcHRpb25zKSB7XG4gIGlmICghRGVjb2RlckJ1ZmZlci5pc0RlY29kZXJCdWZmZXIoZGF0YSkpIHtcbiAgICBkYXRhID0gbmV3IERlY29kZXJCdWZmZXIoZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICByZXR1cm4gdGhpcy50cmVlLl9kZWNvZGUoZGF0YSwgb3B0aW9ucyk7XG59O1xuXG4vLyBUcmVlIG1ldGhvZHNcblxuZnVuY3Rpb24gREVSTm9kZShwYXJlbnQpIHtcbiAgTm9kZS5jYWxsKHRoaXMsICdkZXInLCBwYXJlbnQpO1xufVxuaW5oZXJpdHMoREVSTm9kZSwgTm9kZSk7XG5cbkRFUk5vZGUucHJvdG90eXBlLl9wZWVrVGFnID0gZnVuY3Rpb24gcGVla1RhZyhidWZmZXIsIHRhZywgYW55KSB7XG4gIGlmIChidWZmZXIuaXNFbXB0eSgpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBzdGF0ZSA9IGJ1ZmZlci5zYXZlKCk7XG4gIGNvbnN0IGRlY29kZWRUYWcgPSBkZXJEZWNvZGVUYWcoYnVmZmVyLCAnRmFpbGVkIHRvIHBlZWsgdGFnOiBcIicgKyB0YWcgKyAnXCInKTtcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKGRlY29kZWRUYWcpKVxuICAgIHJldHVybiBkZWNvZGVkVGFnO1xuXG4gIGJ1ZmZlci5yZXN0b3JlKHN0YXRlKTtcblxuICByZXR1cm4gZGVjb2RlZFRhZy50YWcgPT09IHRhZyB8fCBkZWNvZGVkVGFnLnRhZ1N0ciA9PT0gdGFnIHx8XG4gICAgKGRlY29kZWRUYWcudGFnU3RyICsgJ29mJykgPT09IHRhZyB8fCBhbnk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlVGFnID0gZnVuY3Rpb24gZGVjb2RlVGFnKGJ1ZmZlciwgdGFnLCBhbnkpIHtcbiAgY29uc3QgZGVjb2RlZFRhZyA9IGRlckRlY29kZVRhZyhidWZmZXIsXG4gICAgJ0ZhaWxlZCB0byBkZWNvZGUgdGFnIG9mIFwiJyArIHRhZyArICdcIicpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IoZGVjb2RlZFRhZykpXG4gICAgcmV0dXJuIGRlY29kZWRUYWc7XG5cbiAgbGV0IGxlbiA9IGRlckRlY29kZUxlbihidWZmZXIsXG4gICAgZGVjb2RlZFRhZy5wcmltaXRpdmUsXG4gICAgJ0ZhaWxlZCB0byBnZXQgbGVuZ3RoIG9mIFwiJyArIHRhZyArICdcIicpO1xuXG4gIC8vIEZhaWx1cmVcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKGxlbikpXG4gICAgcmV0dXJuIGxlbjtcblxuICBpZiAoIWFueSAmJlxuICAgICAgZGVjb2RlZFRhZy50YWcgIT09IHRhZyAmJlxuICAgICAgZGVjb2RlZFRhZy50YWdTdHIgIT09IHRhZyAmJlxuICAgICAgZGVjb2RlZFRhZy50YWdTdHIgKyAnb2YnICE9PSB0YWcpIHtcbiAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdGYWlsZWQgdG8gbWF0Y2ggdGFnOiBcIicgKyB0YWcgKyAnXCInKTtcbiAgfVxuXG4gIGlmIChkZWNvZGVkVGFnLnByaW1pdGl2ZSB8fCBsZW4gIT09IG51bGwpXG4gICAgcmV0dXJuIGJ1ZmZlci5za2lwKGxlbiwgJ0ZhaWxlZCB0byBtYXRjaCBib2R5IG9mOiBcIicgKyB0YWcgKyAnXCInKTtcblxuICAvLyBJbmRlZmluaXRlIGxlbmd0aC4uLiBmaW5kIEVORCB0YWdcbiAgY29uc3Qgc3RhdGUgPSBidWZmZXIuc2F2ZSgpO1xuICBjb25zdCByZXMgPSB0aGlzLl9za2lwVW50aWxFbmQoXG4gICAgYnVmZmVyLFxuICAgICdGYWlsZWQgdG8gc2tpcCBpbmRlZmluaXRlIGxlbmd0aCBib2R5OiBcIicgKyB0aGlzLnRhZyArICdcIicpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IocmVzKSlcbiAgICByZXR1cm4gcmVzO1xuXG4gIGxlbiA9IGJ1ZmZlci5vZmZzZXQgLSBzdGF0ZS5vZmZzZXQ7XG4gIGJ1ZmZlci5yZXN0b3JlKHN0YXRlKTtcbiAgcmV0dXJuIGJ1ZmZlci5za2lwKGxlbiwgJ0ZhaWxlZCB0byBtYXRjaCBib2R5IG9mOiBcIicgKyB0YWcgKyAnXCInKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9za2lwVW50aWxFbmQgPSBmdW5jdGlvbiBza2lwVW50aWxFbmQoYnVmZmVyLCBmYWlsKSB7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB0YWcgPSBkZXJEZWNvZGVUYWcoYnVmZmVyLCBmYWlsKTtcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IodGFnKSlcbiAgICAgIHJldHVybiB0YWc7XG4gICAgY29uc3QgbGVuID0gZGVyRGVjb2RlTGVuKGJ1ZmZlciwgdGFnLnByaW1pdGl2ZSwgZmFpbCk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKGxlbikpXG4gICAgICByZXR1cm4gbGVuO1xuXG4gICAgbGV0IHJlcztcbiAgICBpZiAodGFnLnByaW1pdGl2ZSB8fCBsZW4gIT09IG51bGwpXG4gICAgICByZXMgPSBidWZmZXIuc2tpcChsZW4pO1xuICAgIGVsc2VcbiAgICAgIHJlcyA9IHRoaXMuX3NraXBVbnRpbEVuZChidWZmZXIsIGZhaWwpO1xuXG4gICAgLy8gRmFpbHVyZVxuICAgIGlmIChidWZmZXIuaXNFcnJvcihyZXMpKVxuICAgICAgcmV0dXJuIHJlcztcblxuICAgIGlmICh0YWcudGFnU3RyID09PSAnZW5kJylcbiAgICAgIGJyZWFrO1xuICB9XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlTGlzdCA9IGZ1bmN0aW9uIGRlY29kZUxpc3QoYnVmZmVyLCB0YWcsIGRlY29kZXIsXG4gIG9wdGlvbnMpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIHdoaWxlICghYnVmZmVyLmlzRW1wdHkoKSkge1xuICAgIGNvbnN0IHBvc3NpYmxlRW5kID0gdGhpcy5fcGVla1RhZyhidWZmZXIsICdlbmQnKTtcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IocG9zc2libGVFbmQpKVxuICAgICAgcmV0dXJuIHBvc3NpYmxlRW5kO1xuXG4gICAgY29uc3QgcmVzID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLCAnZGVyJywgb3B0aW9ucyk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKHJlcykgJiYgcG9zc2libGVFbmQpXG4gICAgICBicmVhaztcbiAgICByZXN1bHQucHVzaChyZXMpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlU3RyID0gZnVuY3Rpb24gZGVjb2RlU3RyKGJ1ZmZlciwgdGFnKSB7XG4gIGlmICh0YWcgPT09ICdiaXRzdHInKSB7XG4gICAgY29uc3QgdW51c2VkID0gYnVmZmVyLnJlYWRVSW50OCgpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcih1bnVzZWQpKVxuICAgICAgcmV0dXJuIHVudXNlZDtcbiAgICByZXR1cm4geyB1bnVzZWQ6IHVudXNlZCwgZGF0YTogYnVmZmVyLnJhdygpIH07XG4gIH0gZWxzZSBpZiAodGFnID09PSAnYm1wc3RyJykge1xuICAgIGNvbnN0IHJhdyA9IGJ1ZmZlci5yYXcoKTtcbiAgICBpZiAocmF3Lmxlbmd0aCAlIDIgPT09IDEpXG4gICAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogYm1wc3RyIGxlbmd0aCBtaXNtYXRjaCcpO1xuXG4gICAgbGV0IHN0ciA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3Lmxlbmd0aCAvIDI7IGkrKykge1xuICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocmF3LnJlYWRVSW50MTZCRShpICogMikpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ251bXN0cicpIHtcbiAgICBjb25zdCBudW1zdHIgPSBidWZmZXIucmF3KCkudG9TdHJpbmcoJ2FzY2lpJyk7XG4gICAgaWYgKCF0aGlzLl9pc051bXN0cihudW1zdHIpKSB7XG4gICAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdudW1zdHIgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgICByZXR1cm4gbnVtc3RyO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ29jdHN0cicpIHtcbiAgICByZXR1cm4gYnVmZmVyLnJhdygpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ29iakRlc2MnKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5yYXcoKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdwcmludHN0cicpIHtcbiAgICBjb25zdCBwcmludHN0ciA9IGJ1ZmZlci5yYXcoKS50b1N0cmluZygnYXNjaWknKTtcbiAgICBpZiAoIXRoaXMuX2lzUHJpbnRzdHIocHJpbnRzdHIpKSB7XG4gICAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdwcmludHN0ciB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICAgIHJldHVybiBwcmludHN0cjtcbiAgfSBlbHNlIGlmICgvc3RyJC8udGVzdCh0YWcpKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5yYXcoKS50b1N0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBidWZmZXIuZXJyb3IoJ0RlY29kaW5nIG9mIHN0cmluZyB0eXBlOiAnICsgdGFnICsgJyB1bnN1cHBvcnRlZCcpO1xuICB9XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlT2JqaWQgPSBmdW5jdGlvbiBkZWNvZGVPYmppZChidWZmZXIsIHZhbHVlcywgcmVsYXRpdmUpIHtcbiAgbGV0IHJlc3VsdDtcbiAgY29uc3QgaWRlbnRpZmllcnMgPSBbXTtcbiAgbGV0IGlkZW50ID0gMDtcbiAgbGV0IHN1YmlkZW50ID0gMDtcbiAgd2hpbGUgKCFidWZmZXIuaXNFbXB0eSgpKSB7XG4gICAgc3ViaWRlbnQgPSBidWZmZXIucmVhZFVJbnQ4KCk7XG4gICAgaWRlbnQgPDw9IDc7XG4gICAgaWRlbnQgfD0gc3ViaWRlbnQgJiAweDdmO1xuICAgIGlmICgoc3ViaWRlbnQgJiAweDgwKSA9PT0gMCkge1xuICAgICAgaWRlbnRpZmllcnMucHVzaChpZGVudCk7XG4gICAgICBpZGVudCA9IDA7XG4gICAgfVxuICB9XG4gIGlmIChzdWJpZGVudCAmIDB4ODApXG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudCk7XG5cbiAgY29uc3QgZmlyc3QgPSAoaWRlbnRpZmllcnNbMF0gLyA0MCkgfCAwO1xuICBjb25zdCBzZWNvbmQgPSBpZGVudGlmaWVyc1swXSAlIDQwO1xuXG4gIGlmIChyZWxhdGl2ZSlcbiAgICByZXN1bHQgPSBpZGVudGlmaWVycztcbiAgZWxzZVxuICAgIHJlc3VsdCA9IFtmaXJzdCwgc2Vjb25kXS5jb25jYXQoaWRlbnRpZmllcnMuc2xpY2UoMSkpO1xuXG4gIGlmICh2YWx1ZXMpIHtcbiAgICBsZXQgdG1wID0gdmFsdWVzW3Jlc3VsdC5qb2luKCcgJyldO1xuICAgIGlmICh0bXAgPT09IHVuZGVmaW5lZClcbiAgICAgIHRtcCA9IHZhbHVlc1tyZXN1bHQuam9pbignLicpXTtcbiAgICBpZiAodG1wICE9PSB1bmRlZmluZWQpXG4gICAgICByZXN1bHQgPSB0bXA7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZVRpbWUgPSBmdW5jdGlvbiBkZWNvZGVUaW1lKGJ1ZmZlciwgdGFnKSB7XG4gIGNvbnN0IHN0ciA9IGJ1ZmZlci5yYXcoKS50b1N0cmluZygpO1xuXG4gIGxldCB5ZWFyO1xuICBsZXQgbW9uO1xuICBsZXQgZGF5O1xuICBsZXQgaG91cjtcbiAgbGV0IG1pbjtcbiAgbGV0IHNlYztcbiAgaWYgKHRhZyA9PT0gJ2dlbnRpbWUnKSB7XG4gICAgeWVhciA9IHN0ci5zbGljZSgwLCA0KSB8IDA7XG4gICAgbW9uID0gc3RyLnNsaWNlKDQsIDYpIHwgMDtcbiAgICBkYXkgPSBzdHIuc2xpY2UoNiwgOCkgfCAwO1xuICAgIGhvdXIgPSBzdHIuc2xpY2UoOCwgMTApIHwgMDtcbiAgICBtaW4gPSBzdHIuc2xpY2UoMTAsIDEyKSB8IDA7XG4gICAgc2VjID0gc3RyLnNsaWNlKDEyLCAxNCkgfCAwO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3V0Y3RpbWUnKSB7XG4gICAgeWVhciA9IHN0ci5zbGljZSgwLCAyKSB8IDA7XG4gICAgbW9uID0gc3RyLnNsaWNlKDIsIDQpIHwgMDtcbiAgICBkYXkgPSBzdHIuc2xpY2UoNCwgNikgfCAwO1xuICAgIGhvdXIgPSBzdHIuc2xpY2UoNiwgOCkgfCAwO1xuICAgIG1pbiA9IHN0ci5zbGljZSg4LCAxMCkgfCAwO1xuICAgIHNlYyA9IHN0ci5zbGljZSgxMCwgMTIpIHwgMDtcbiAgICBpZiAoeWVhciA8IDcwKVxuICAgICAgeWVhciA9IDIwMDAgKyB5ZWFyO1xuICAgIGVsc2VcbiAgICAgIHllYXIgPSAxOTAwICsgeWVhcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyAnICsgdGFnICsgJyB0aW1lIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Jyk7XG4gIH1cblxuICByZXR1cm4gRGF0ZS5VVEMoeWVhciwgbW9uIC0gMSwgZGF5LCBob3VyLCBtaW4sIHNlYywgMCk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlTnVsbCA9IGZ1bmN0aW9uIGRlY29kZU51bGwoKSB7XG4gIHJldHVybiBudWxsO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZUJvb2wgPSBmdW5jdGlvbiBkZWNvZGVCb29sKGJ1ZmZlcikge1xuICBjb25zdCByZXMgPSBidWZmZXIucmVhZFVJbnQ4KCk7XG4gIGlmIChidWZmZXIuaXNFcnJvcihyZXMpKVxuICAgIHJldHVybiByZXM7XG4gIGVsc2VcbiAgICByZXR1cm4gcmVzICE9PSAwO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZUludCA9IGZ1bmN0aW9uIGRlY29kZUludChidWZmZXIsIHZhbHVlcykge1xuICAvLyBCaWdpbnQsIHJldHVybiBhcyBpdCBpcyAoYXNzdW1lIGJpZyBlbmRpYW4pXG4gIGNvbnN0IHJhdyA9IGJ1ZmZlci5yYXcoKTtcbiAgbGV0IHJlcyA9IG5ldyBiaWdudW0ocmF3KTtcblxuICBpZiAodmFsdWVzKVxuICAgIHJlcyA9IHZhbHVlc1tyZXMudG9TdHJpbmcoMTApXSB8fCByZXM7XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl91c2UgPSBmdW5jdGlvbiB1c2UoZW50aXR5LCBvYmopIHtcbiAgaWYgKHR5cGVvZiBlbnRpdHkgPT09ICdmdW5jdGlvbicpXG4gICAgZW50aXR5ID0gZW50aXR5KG9iaik7XG4gIHJldHVybiBlbnRpdHkuX2dldERlY29kZXIoJ2RlcicpLnRyZWU7XG59O1xuXG4vLyBVdGlsaXR5IG1ldGhvZHNcblxuZnVuY3Rpb24gZGVyRGVjb2RlVGFnKGJ1ZiwgZmFpbCkge1xuICBsZXQgdGFnID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgaWYgKGJ1Zi5pc0Vycm9yKHRhZykpXG4gICAgcmV0dXJuIHRhZztcblxuICBjb25zdCBjbHMgPSBkZXIudGFnQ2xhc3NbdGFnID4+IDZdO1xuICBjb25zdCBwcmltaXRpdmUgPSAodGFnICYgMHgyMCkgPT09IDA7XG5cbiAgLy8gTXVsdGktb2N0ZXQgdGFnIC0gbG9hZFxuICBpZiAoKHRhZyAmIDB4MWYpID09PSAweDFmKSB7XG4gICAgbGV0IG9jdCA9IHRhZztcbiAgICB0YWcgPSAwO1xuICAgIHdoaWxlICgob2N0ICYgMHg4MCkgPT09IDB4ODApIHtcbiAgICAgIG9jdCA9IGJ1Zi5yZWFkVUludDgoZmFpbCk7XG4gICAgICBpZiAoYnVmLmlzRXJyb3Iob2N0KSlcbiAgICAgICAgcmV0dXJuIG9jdDtcblxuICAgICAgdGFnIDw8PSA3O1xuICAgICAgdGFnIHw9IG9jdCAmIDB4N2Y7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRhZyAmPSAweDFmO1xuICB9XG4gIGNvbnN0IHRhZ1N0ciA9IGRlci50YWdbdGFnXTtcblxuICByZXR1cm4ge1xuICAgIGNsczogY2xzLFxuICAgIHByaW1pdGl2ZTogcHJpbWl0aXZlLFxuICAgIHRhZzogdGFnLFxuICAgIHRhZ1N0cjogdGFnU3RyXG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlckRlY29kZUxlbihidWYsIHByaW1pdGl2ZSwgZmFpbCkge1xuICBsZXQgbGVuID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgaWYgKGJ1Zi5pc0Vycm9yKGxlbikpXG4gICAgcmV0dXJuIGxlbjtcblxuICAvLyBJbmRlZmluaXRlIGZvcm1cbiAgaWYgKCFwcmltaXRpdmUgJiYgbGVuID09PSAweDgwKVxuICAgIHJldHVybiBudWxsO1xuXG4gIC8vIERlZmluaXRlIGZvcm1cbiAgaWYgKChsZW4gJiAweDgwKSA9PT0gMCkge1xuICAgIC8vIFNob3J0IGZvcm1cbiAgICByZXR1cm4gbGVuO1xuICB9XG5cbiAgLy8gTG9uZyBmb3JtXG4gIGNvbnN0IG51bSA9IGxlbiAmIDB4N2Y7XG4gIGlmIChudW0gPiA0KVxuICAgIHJldHVybiBidWYuZXJyb3IoJ2xlbmd0aCBvY3RlY3QgaXMgdG9vIGxvbmcnKTtcblxuICBsZW4gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bTsgaSsrKSB7XG4gICAgbGVuIDw8PSA4O1xuICAgIGNvbnN0IGogPSBidWYucmVhZFVJbnQ4KGZhaWwpO1xuICAgIGlmIChidWYuaXNFcnJvcihqKSlcbiAgICAgIHJldHVybiBqO1xuICAgIGxlbiB8PSBqO1xuICB9XG5cbiAgcmV0dXJuIGxlbjtcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5jb25zdCBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG5cbmNvbnN0IERFUkRlY29kZXIgPSByZXF1aXJlKCcuL2RlcicpO1xuXG5mdW5jdGlvbiBQRU1EZWNvZGVyKGVudGl0eSkge1xuICBERVJEZWNvZGVyLmNhbGwodGhpcywgZW50aXR5KTtcbiAgdGhpcy5lbmMgPSAncGVtJztcbn1cbmluaGVyaXRzKFBFTURlY29kZXIsIERFUkRlY29kZXIpO1xubW9kdWxlLmV4cG9ydHMgPSBQRU1EZWNvZGVyO1xuXG5QRU1EZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoZGF0YSwgb3B0aW9ucykge1xuICBjb25zdCBsaW5lcyA9IGRhdGEudG9TdHJpbmcoKS5zcGxpdCgvW1xcclxcbl0rL2cpO1xuXG4gIGNvbnN0IGxhYmVsID0gb3B0aW9ucy5sYWJlbC50b1VwcGVyQ2FzZSgpO1xuXG4gIGNvbnN0IHJlID0gL14tLS0tLShCRUdJTnxFTkQpIChbXi1dKyktLS0tLSQvO1xuICBsZXQgc3RhcnQgPSAtMTtcbiAgbGV0IGVuZCA9IC0xO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBsaW5lc1tpXS5tYXRjaChyZSk7XG4gICAgaWYgKG1hdGNoID09PSBudWxsKVxuICAgICAgY29udGludWU7XG5cbiAgICBpZiAobWF0Y2hbMl0gIT09IGxhYmVsKVxuICAgICAgY29udGludWU7XG5cbiAgICBpZiAoc3RhcnQgPT09IC0xKSB7XG4gICAgICBpZiAobWF0Y2hbMV0gIT09ICdCRUdJTicpXG4gICAgICAgIGJyZWFrO1xuICAgICAgc3RhcnQgPSBpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobWF0Y2hbMV0gIT09ICdFTkQnKVxuICAgICAgICBicmVhaztcbiAgICAgIGVuZCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKHN0YXJ0ID09PSAtMSB8fCBlbmQgPT09IC0xKVxuICAgIHRocm93IG5ldyBFcnJvcignUEVNIHNlY3Rpb24gbm90IGZvdW5kIGZvcjogJyArIGxhYmVsKTtcblxuICBjb25zdCBiYXNlNjQgPSBsaW5lcy5zbGljZShzdGFydCArIDEsIGVuZCkuam9pbignJyk7XG4gIC8vIFJlbW92ZSBleGNlc3NpdmUgc3ltYm9sc1xuICBiYXNlNjQucmVwbGFjZSgvW15hLXowLTkrLz1dKy9naSwgJycpO1xuXG4gIGNvbnN0IGlucHV0ID0gQnVmZmVyLmZyb20oYmFzZTY0LCAnYmFzZTY0Jyk7XG4gIHJldHVybiBERVJEZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUuY2FsbCh0aGlzLCBpbnB1dCwgb3B0aW9ucyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGRlY29kZXJzID0gZXhwb3J0cztcblxuZGVjb2RlcnMuZGVyID0gcmVxdWlyZSgnLi9kZXInKTtcbmRlY29kZXJzLnBlbSA9IHJlcXVpcmUoJy4vcGVtJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZW5jb2RlcnMgPSByZXF1aXJlKCcuL2VuY29kZXJzJyk7XG5jb25zdCBkZWNvZGVycyA9IHJlcXVpcmUoJy4vZGVjb2RlcnMnKTtcbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuY29uc3QgYXBpID0gZXhwb3J0cztcblxuYXBpLmRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShuYW1lLCBib2R5KSB7XG4gIHJldHVybiBuZXcgRW50aXR5KG5hbWUsIGJvZHkpO1xufTtcblxuZnVuY3Rpb24gRW50aXR5KG5hbWUsIGJvZHkpIHtcbiAgdGhpcy5uYW1lID0gbmFtZTtcbiAgdGhpcy5ib2R5ID0gYm9keTtcblxuICB0aGlzLmRlY29kZXJzID0ge307XG4gIHRoaXMuZW5jb2RlcnMgPSB7fTtcbn1cblxuRW50aXR5LnByb3RvdHlwZS5fY3JlYXRlTmFtZWQgPSBmdW5jdGlvbiBjcmVhdGVOYW1lZChCYXNlKSB7XG4gIGNvbnN0IG5hbWUgPSB0aGlzLm5hbWU7XG5cbiAgZnVuY3Rpb24gR2VuZXJhdGVkKGVudGl0eSkge1xuICAgIHRoaXMuX2luaXROYW1lZChlbnRpdHksIG5hbWUpO1xuICB9XG4gIGluaGVyaXRzKEdlbmVyYXRlZCwgQmFzZSk7XG4gIEdlbmVyYXRlZC5wcm90b3R5cGUuX2luaXROYW1lZCA9IGZ1bmN0aW9uIF9pbml0TmFtZWQoZW50aXR5LCBuYW1lKSB7XG4gICAgQmFzZS5jYWxsKHRoaXMsIGVudGl0eSwgbmFtZSk7XG4gIH07XG5cbiAgcmV0dXJuIG5ldyBHZW5lcmF0ZWQodGhpcyk7XG59O1xuXG5FbnRpdHkucHJvdG90eXBlLl9nZXREZWNvZGVyID0gZnVuY3Rpb24gX2dldERlY29kZXIoZW5jKSB7XG4gIGVuYyA9IGVuYyB8fCAnZGVyJztcbiAgLy8gTGF6aWx5IGNyZWF0ZSBkZWNvZGVyXG4gIGlmICghdGhpcy5kZWNvZGVycy5oYXNPd25Qcm9wZXJ0eShlbmMpKVxuICAgIHRoaXMuZGVjb2RlcnNbZW5jXSA9IHRoaXMuX2NyZWF0ZU5hbWVkKGRlY29kZXJzW2VuY10pO1xuICByZXR1cm4gdGhpcy5kZWNvZGVyc1tlbmNdO1xufTtcblxuRW50aXR5LnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoZGF0YSwgZW5jLCBvcHRpb25zKSB7XG4gIHJldHVybiB0aGlzLl9nZXREZWNvZGVyKGVuYykuZGVjb2RlKGRhdGEsIG9wdGlvbnMpO1xufTtcblxuRW50aXR5LnByb3RvdHlwZS5fZ2V0RW5jb2RlciA9IGZ1bmN0aW9uIF9nZXRFbmNvZGVyKGVuYykge1xuICBlbmMgPSBlbmMgfHwgJ2Rlcic7XG4gIC8vIExhemlseSBjcmVhdGUgZW5jb2RlclxuICBpZiAoIXRoaXMuZW5jb2RlcnMuaGFzT3duUHJvcGVydHkoZW5jKSlcbiAgICB0aGlzLmVuY29kZXJzW2VuY10gPSB0aGlzLl9jcmVhdGVOYW1lZChlbmNvZGVyc1tlbmNdKTtcbiAgcmV0dXJuIHRoaXMuZW5jb2RlcnNbZW5jXTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGRhdGEsIGVuYywgLyogaW50ZXJuYWwgKi8gcmVwb3J0ZXIpIHtcbiAgcmV0dXJuIHRoaXMuX2dldEVuY29kZXIoZW5jKS5lbmNvZGUoZGF0YSwgcmVwb3J0ZXIpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBiYXNlID0gZXhwb3J0cztcblxuYmFzZS5SZXBvcnRlciA9IHJlcXVpcmUoJy4vcmVwb3J0ZXInKS5SZXBvcnRlcjtcbmJhc2UuRGVjb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJykuRGVjb2RlckJ1ZmZlcjtcbmJhc2UuRW5jb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJykuRW5jb2RlckJ1ZmZlcjtcbmJhc2UuTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGNvbnN0YW50cyA9IGV4cG9ydHM7XG5cbi8vIEhlbHBlclxuY29uc3RhbnRzLl9yZXZlcnNlID0gZnVuY3Rpb24gcmV2ZXJzZShtYXApIHtcbiAgY29uc3QgcmVzID0ge307XG5cbiAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIC8vIENvbnZlcnQga2V5IHRvIGludGVnZXIgaWYgaXQgaXMgc3RyaW5naWZpZWRcbiAgICBpZiAoKGtleSB8IDApID09IGtleSlcbiAgICAgIGtleSA9IGtleSB8IDA7XG5cbiAgICBjb25zdCB2YWx1ZSA9IG1hcFtrZXldO1xuICAgIHJlc1t2YWx1ZV0gPSBrZXk7XG4gIH0pO1xuXG4gIHJldHVybiByZXM7XG59O1xuXG5jb25zdGFudHMuZGVyID0gcmVxdWlyZSgnLi9kZXInKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBhc24xID0gZXhwb3J0cztcblxuYXNuMS5iaWdudW0gPSByZXF1aXJlKCdibi5qcycpO1xuXG5hc24xLmRlZmluZSA9IHJlcXVpcmUoJy4vYXNuMS9hcGknKS5kZWZpbmU7XG5hc24xLmJhc2UgPSByZXF1aXJlKCcuL2FzbjEvYmFzZScpO1xuYXNuMS5jb25zdGFudHMgPSByZXF1aXJlKCcuL2FzbjEvY29uc3RhbnRzJyk7XG5hc24xLmRlY29kZXJzID0gcmVxdWlyZSgnLi9hc24xL2RlY29kZXJzJyk7XG5hc24xLmVuY29kZXJzID0gcmVxdWlyZSgnLi9hc24xL2VuY29kZXJzJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gZXhwb3J0cztcblxuZnVuY3Rpb24gdG9BcnJheShtc2csIGVuYykge1xuICBpZiAoQXJyYXkuaXNBcnJheShtc2cpKVxuICAgIHJldHVybiBtc2cuc2xpY2UoKTtcbiAgaWYgKCFtc2cpXG4gICAgcmV0dXJuIFtdO1xuICB2YXIgcmVzID0gW107XG4gIGlmICh0eXBlb2YgbXNnICE9PSAnc3RyaW5nJykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgICAgcmVzW2ldID0gbXNnW2ldIHwgMDtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIGlmIChlbmMgPT09ICdoZXgnKSB7XG4gICAgbXNnID0gbXNnLnJlcGxhY2UoL1teYS16MC05XSsvaWcsICcnKTtcbiAgICBpZiAobXNnLmxlbmd0aCAlIDIgIT09IDApXG4gICAgICBtc2cgPSAnMCcgKyBtc2c7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpICs9IDIpXG4gICAgICByZXMucHVzaChwYXJzZUludChtc2dbaV0gKyBtc2dbaSArIDFdLCAxNikpO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYyA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgdmFyIGhpID0gYyA+PiA4O1xuICAgICAgdmFyIGxvID0gYyAmIDB4ZmY7XG4gICAgICBpZiAoaGkpXG4gICAgICAgIHJlcy5wdXNoKGhpLCBsbyk7XG4gICAgICBlbHNlXG4gICAgICAgIHJlcy5wdXNoKGxvKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbnV0aWxzLnRvQXJyYXkgPSB0b0FycmF5O1xuXG5mdW5jdGlvbiB6ZXJvMih3b3JkKSB7XG4gIGlmICh3b3JkLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gJzAnICsgd29yZDtcbiAgZWxzZVxuICAgIHJldHVybiB3b3JkO1xufVxudXRpbHMuemVybzIgPSB6ZXJvMjtcblxuZnVuY3Rpb24gdG9IZXgobXNnKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgcmVzICs9IHplcm8yKG1zZ1tpXS50b1N0cmluZygxNikpO1xuICByZXR1cm4gcmVzO1xufVxudXRpbHMudG9IZXggPSB0b0hleDtcblxudXRpbHMuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGFyciwgZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB0b0hleChhcnIpO1xuICBlbHNlXG4gICAgcmV0dXJuIGFycjtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gZXhwb3J0cztcbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgbWluQXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xudmFyIG1pblV0aWxzID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWNyeXB0by11dGlscycpO1xuXG51dGlscy5hc3NlcnQgPSBtaW5Bc3NlcnQ7XG51dGlscy50b0FycmF5ID0gbWluVXRpbHMudG9BcnJheTtcbnV0aWxzLnplcm8yID0gbWluVXRpbHMuemVybzI7XG51dGlscy50b0hleCA9IG1pblV0aWxzLnRvSGV4O1xudXRpbHMuZW5jb2RlID0gbWluVXRpbHMuZW5jb2RlO1xuXG4vLyBSZXByZXNlbnQgbnVtIGluIGEgdy1OQUYgZm9ybVxuZnVuY3Rpb24gZ2V0TkFGKG51bSwgdywgYml0cykge1xuICB2YXIgbmFmID0gbmV3IEFycmF5KE1hdGgubWF4KG51bS5iaXRMZW5ndGgoKSwgYml0cykgKyAxKTtcbiAgdmFyIGk7XG4gIGZvciAoaSA9IDA7IGkgPCBuYWYubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBuYWZbaV0gPSAwO1xuICB9XG5cbiAgdmFyIHdzID0gMSA8PCAodyArIDEpO1xuICB2YXIgayA9IG51bS5jbG9uZSgpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBuYWYubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgejtcbiAgICB2YXIgbW9kID0gay5hbmRsbih3cyAtIDEpO1xuICAgIGlmIChrLmlzT2RkKCkpIHtcbiAgICAgIGlmIChtb2QgPiAod3MgPj4gMSkgLSAxKVxuICAgICAgICB6ID0gKHdzID4+IDEpIC0gbW9kO1xuICAgICAgZWxzZVxuICAgICAgICB6ID0gbW9kO1xuICAgICAgay5pc3Vibih6KTtcbiAgICB9IGVsc2Uge1xuICAgICAgeiA9IDA7XG4gICAgfVxuXG4gICAgbmFmW2ldID0gejtcbiAgICBrLml1c2hybigxKTtcbiAgfVxuXG4gIHJldHVybiBuYWY7XG59XG51dGlscy5nZXROQUYgPSBnZXROQUY7XG5cbi8vIFJlcHJlc2VudCBrMSwgazIgaW4gYSBKb2ludCBTcGFyc2UgRm9ybVxuZnVuY3Rpb24gZ2V0SlNGKGsxLCBrMikge1xuICB2YXIganNmID0gW1xuICAgIFtdLFxuICAgIFtdLFxuICBdO1xuXG4gIGsxID0gazEuY2xvbmUoKTtcbiAgazIgPSBrMi5jbG9uZSgpO1xuICB2YXIgZDEgPSAwO1xuICB2YXIgZDIgPSAwO1xuICB2YXIgbTg7XG4gIHdoaWxlIChrMS5jbXBuKC1kMSkgPiAwIHx8IGsyLmNtcG4oLWQyKSA+IDApIHtcbiAgICAvLyBGaXJzdCBwaGFzZVxuICAgIHZhciBtMTQgPSAoazEuYW5kbG4oMykgKyBkMSkgJiAzO1xuICAgIHZhciBtMjQgPSAoazIuYW5kbG4oMykgKyBkMikgJiAzO1xuICAgIGlmIChtMTQgPT09IDMpXG4gICAgICBtMTQgPSAtMTtcbiAgICBpZiAobTI0ID09PSAzKVxuICAgICAgbTI0ID0gLTE7XG4gICAgdmFyIHUxO1xuICAgIGlmICgobTE0ICYgMSkgPT09IDApIHtcbiAgICAgIHUxID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgbTggPSAoazEuYW5kbG4oNykgKyBkMSkgJiA3O1xuICAgICAgaWYgKChtOCA9PT0gMyB8fCBtOCA9PT0gNSkgJiYgbTI0ID09PSAyKVxuICAgICAgICB1MSA9IC1tMTQ7XG4gICAgICBlbHNlXG4gICAgICAgIHUxID0gbTE0O1xuICAgIH1cbiAgICBqc2ZbMF0ucHVzaCh1MSk7XG5cbiAgICB2YXIgdTI7XG4gICAgaWYgKChtMjQgJiAxKSA9PT0gMCkge1xuICAgICAgdTIgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBtOCA9IChrMi5hbmRsbig3KSArIGQyKSAmIDc7XG4gICAgICBpZiAoKG04ID09PSAzIHx8IG04ID09PSA1KSAmJiBtMTQgPT09IDIpXG4gICAgICAgIHUyID0gLW0yNDtcbiAgICAgIGVsc2VcbiAgICAgICAgdTIgPSBtMjQ7XG4gICAgfVxuICAgIGpzZlsxXS5wdXNoKHUyKTtcblxuICAgIC8vIFNlY29uZCBwaGFzZVxuICAgIGlmICgyICogZDEgPT09IHUxICsgMSlcbiAgICAgIGQxID0gMSAtIGQxO1xuICAgIGlmICgyICogZDIgPT09IHUyICsgMSlcbiAgICAgIGQyID0gMSAtIGQyO1xuICAgIGsxLml1c2hybigxKTtcbiAgICBrMi5pdXNocm4oMSk7XG4gIH1cblxuICByZXR1cm4ganNmO1xufVxudXRpbHMuZ2V0SlNGID0gZ2V0SlNGO1xuXG5mdW5jdGlvbiBjYWNoZWRQcm9wZXJ0eShvYmosIG5hbWUsIGNvbXB1dGVyKSB7XG4gIHZhciBrZXkgPSAnXycgKyBuYW1lO1xuICBvYmoucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24gY2FjaGVkUHJvcGVydHkoKSB7XG4gICAgcmV0dXJuIHRoaXNba2V5XSAhPT0gdW5kZWZpbmVkID8gdGhpc1trZXldIDpcbiAgICAgIHRoaXNba2V5XSA9IGNvbXB1dGVyLmNhbGwodGhpcyk7XG4gIH07XG59XG51dGlscy5jYWNoZWRQcm9wZXJ0eSA9IGNhY2hlZFByb3BlcnR5O1xuXG5mdW5jdGlvbiBwYXJzZUJ5dGVzKGJ5dGVzKSB7XG4gIHJldHVybiB0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnID8gdXRpbHMudG9BcnJheShieXRlcywgJ2hleCcpIDpcbiAgICBieXRlcztcbn1cbnV0aWxzLnBhcnNlQnl0ZXMgPSBwYXJzZUJ5dGVzO1xuXG5mdW5jdGlvbiBpbnRGcm9tTEUoYnl0ZXMpIHtcbiAgcmV0dXJuIG5ldyBCTihieXRlcywgJ2hleCcsICdsZScpO1xufVxudXRpbHMuaW50RnJvbUxFID0gaW50RnJvbUxFO1xuXG4iLAogICAgInZhciByO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJhbmQobGVuKSB7XG4gIGlmICghcilcbiAgICByID0gbmV3IFJhbmQobnVsbCk7XG5cbiAgcmV0dXJuIHIuZ2VuZXJhdGUobGVuKTtcbn07XG5cbmZ1bmN0aW9uIFJhbmQocmFuZCkge1xuICB0aGlzLnJhbmQgPSByYW5kO1xufVxubW9kdWxlLmV4cG9ydHMuUmFuZCA9IFJhbmQ7XG5cblJhbmQucHJvdG90eXBlLmdlbmVyYXRlID0gZnVuY3Rpb24gZ2VuZXJhdGUobGVuKSB7XG4gIHJldHVybiB0aGlzLl9yYW5kKGxlbik7XG59O1xuXG4vLyBFbXVsYXRlIGNyeXB0byBBUEkgdXNpbmcgcmFuZHlcblJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICBpZiAodGhpcy5yYW5kLmdldEJ5dGVzKVxuICAgIHJldHVybiB0aGlzLnJhbmQuZ2V0Qnl0ZXMobik7XG5cbiAgdmFyIHJlcyA9IG5ldyBVaW50OEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcy5sZW5ndGg7IGkrKylcbiAgICByZXNbaV0gPSB0aGlzLnJhbmQuZ2V0Qnl0ZSgpO1xuICByZXR1cm4gcmVzO1xufTtcblxuaWYgKHR5cGVvZiBzZWxmID09PSAnb2JqZWN0Jykge1xuICBpZiAoc2VsZi5jcnlwdG8gJiYgc2VsZi5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gTW9kZXJuIGJyb3dzZXJzXG4gICAgUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbiBfcmFuZChuKSB7XG4gICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gICAgICBzZWxmLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyKTtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChzZWxmLm1zQ3J5cHRvICYmIHNlbGYubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gSUVcbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheShuKTtcbiAgICAgIHNlbGYubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycik7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH07XG5cbiAgLy8gU2FmYXJpJ3MgV2ViV29ya2VycyBkbyBub3QgaGF2ZSBgY3J5cHRvYFxuICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gT2xkIGp1bmtcbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgfTtcbiAgfVxufSBlbHNlIHtcbiAgLy8gTm9kZS5qcyBvciBXZWIgd29ya2VyIHdpdGggbm8gY3J5cHRvIHN1cHBvcnRcbiAgdHJ5IHtcbiAgICB2YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG4gICAgaWYgKHR5cGVvZiBjcnlwdG8ucmFuZG9tQnl0ZXMgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQnKTtcblxuICAgIFJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21CeXRlcyhuKTtcbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBnZXROQUYgPSB1dGlscy5nZXROQUY7XG52YXIgZ2V0SlNGID0gdXRpbHMuZ2V0SlNGO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gQmFzZUN1cnZlKHR5cGUsIGNvbmYpIHtcbiAgdGhpcy50eXBlID0gdHlwZTtcbiAgdGhpcy5wID0gbmV3IEJOKGNvbmYucCwgMTYpO1xuXG4gIC8vIFVzZSBNb250Z29tZXJ5LCB3aGVuIHRoZXJlIGlzIG5vIGZhc3QgcmVkdWN0aW9uIGZvciB0aGUgcHJpbWVcbiAgdGhpcy5yZWQgPSBjb25mLnByaW1lID8gQk4ucmVkKGNvbmYucHJpbWUpIDogQk4ubW9udCh0aGlzLnApO1xuXG4gIC8vIFVzZWZ1bCBmb3IgbWFueSBjdXJ2ZXNcbiAgdGhpcy56ZXJvID0gbmV3IEJOKDApLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5vbmUgPSBuZXcgQk4oMSkudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLnR3byA9IG5ldyBCTigyKS50b1JlZCh0aGlzLnJlZCk7XG5cbiAgLy8gQ3VydmUgY29uZmlndXJhdGlvbiwgb3B0aW9uYWxcbiAgdGhpcy5uID0gY29uZi5uICYmIG5ldyBCTihjb25mLm4sIDE2KTtcbiAgdGhpcy5nID0gY29uZi5nICYmIHRoaXMucG9pbnRGcm9tSlNPTihjb25mLmcsIGNvbmYuZ1JlZCk7XG5cbiAgLy8gVGVtcG9yYXJ5IGFycmF5c1xuICB0aGlzLl93bmFmVDEgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX3duYWZUMiA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fd25hZlQzID0gbmV3IEFycmF5KDQpO1xuICB0aGlzLl93bmFmVDQgPSBuZXcgQXJyYXkoNCk7XG5cbiAgdGhpcy5fYml0TGVuZ3RoID0gdGhpcy5uID8gdGhpcy5uLmJpdExlbmd0aCgpIDogMDtcblxuICAvLyBHZW5lcmFsaXplZCBHcmVnIE1heHdlbGwncyB0cmlja1xuICB2YXIgYWRqdXN0Q291bnQgPSB0aGlzLm4gJiYgdGhpcy5wLmRpdih0aGlzLm4pO1xuICBpZiAoIWFkanVzdENvdW50IHx8IGFkanVzdENvdW50LmNtcG4oMTAwKSA+IDApIHtcbiAgICB0aGlzLnJlZE4gPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX21heHdlbGxUcmljayA9IHRydWU7XG4gICAgdGhpcy5yZWROID0gdGhpcy5uLnRvUmVkKHRoaXMucmVkKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBCYXNlQ3VydmU7XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbiBwb2ludCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUuX2ZpeGVkTmFmTXVsID0gZnVuY3Rpb24gX2ZpeGVkTmFmTXVsKHAsIGspIHtcbiAgYXNzZXJ0KHAucHJlY29tcHV0ZWQpO1xuICB2YXIgZG91YmxlcyA9IHAuX2dldERvdWJsZXMoKTtcblxuICB2YXIgbmFmID0gZ2V0TkFGKGssIDEsIHRoaXMuX2JpdExlbmd0aCk7XG4gIHZhciBJID0gKDEgPDwgKGRvdWJsZXMuc3RlcCArIDEpKSAtIChkb3VibGVzLnN0ZXAgJSAyID09PSAwID8gMiA6IDEpO1xuICBJIC89IDM7XG5cbiAgLy8gVHJhbnNsYXRlIGludG8gbW9yZSB3aW5kb3dlZCBmb3JtXG4gIHZhciByZXByID0gW107XG4gIHZhciBqO1xuICB2YXIgbmFmVztcbiAgZm9yIChqID0gMDsgaiA8IG5hZi5sZW5ndGg7IGogKz0gZG91Ymxlcy5zdGVwKSB7XG4gICAgbmFmVyA9IDA7XG4gICAgZm9yICh2YXIgbCA9IGogKyBkb3VibGVzLnN0ZXAgLSAxOyBsID49IGo7IGwtLSlcbiAgICAgIG5hZlcgPSAobmFmVyA8PCAxKSArIG5hZltsXTtcbiAgICByZXByLnB1c2gobmFmVyk7XG4gIH1cblxuICB2YXIgYSA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICB2YXIgYiA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICBmb3IgKHZhciBpID0gSTsgaSA+IDA7IGktLSkge1xuICAgIGZvciAoaiA9IDA7IGogPCByZXByLmxlbmd0aDsgaisrKSB7XG4gICAgICBuYWZXID0gcmVwcltqXTtcbiAgICAgIGlmIChuYWZXID09PSBpKVxuICAgICAgICBiID0gYi5taXhlZEFkZChkb3VibGVzLnBvaW50c1tqXSk7XG4gICAgICBlbHNlIGlmIChuYWZXID09PSAtaSlcbiAgICAgICAgYiA9IGIubWl4ZWRBZGQoZG91Ymxlcy5wb2ludHNbal0ubmVnKCkpO1xuICAgIH1cbiAgICBhID0gYS5hZGQoYik7XG4gIH1cbiAgcmV0dXJuIGEudG9QKCk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLl93bmFmTXVsID0gZnVuY3Rpb24gX3duYWZNdWwocCwgaykge1xuICB2YXIgdyA9IDQ7XG5cbiAgLy8gUHJlY29tcHV0ZSB3aW5kb3dcbiAgdmFyIG5hZlBvaW50cyA9IHAuX2dldE5BRlBvaW50cyh3KTtcbiAgdyA9IG5hZlBvaW50cy53bmQ7XG4gIHZhciB3bmQgPSBuYWZQb2ludHMucG9pbnRzO1xuXG4gIC8vIEdldCBOQUYgZm9ybVxuICB2YXIgbmFmID0gZ2V0TkFGKGssIHcsIHRoaXMuX2JpdExlbmd0aCk7XG5cbiAgLy8gQWRkIGB0aGlzYCooTisxKSBmb3IgZXZlcnkgdy1OQUYgaW5kZXhcbiAgdmFyIGFjYyA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICBmb3IgKHZhciBpID0gbmFmLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgLy8gQ291bnQgemVyb2VzXG4gICAgZm9yICh2YXIgbCA9IDA7IGkgPj0gMCAmJiBuYWZbaV0gPT09IDA7IGktLSlcbiAgICAgIGwrKztcbiAgICBpZiAoaSA+PSAwKVxuICAgICAgbCsrO1xuICAgIGFjYyA9IGFjYy5kYmxwKGwpO1xuXG4gICAgaWYgKGkgPCAwKVxuICAgICAgYnJlYWs7XG4gICAgdmFyIHogPSBuYWZbaV07XG4gICAgYXNzZXJ0KHogIT09IDApO1xuICAgIGlmIChwLnR5cGUgPT09ICdhZmZpbmUnKSB7XG4gICAgICAvLyBKICstIFBcbiAgICAgIGlmICh6ID4gMClcbiAgICAgICAgYWNjID0gYWNjLm1peGVkQWRkKHduZFsoeiAtIDEpID4+IDFdKTtcbiAgICAgIGVsc2VcbiAgICAgICAgYWNjID0gYWNjLm1peGVkQWRkKHduZFsoLXogLSAxKSA+PiAxXS5uZWcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEogKy0gSlxuICAgICAgaWYgKHogPiAwKVxuICAgICAgICBhY2MgPSBhY2MuYWRkKHduZFsoeiAtIDEpID4+IDFdKTtcbiAgICAgIGVsc2VcbiAgICAgICAgYWNjID0gYWNjLmFkZCh3bmRbKC16IC0gMSkgPj4gMV0ubmVnKCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcC50eXBlID09PSAnYWZmaW5lJyA/IGFjYy50b1AoKSA6IGFjYztcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUuX3duYWZNdWxBZGQgPSBmdW5jdGlvbiBfd25hZk11bEFkZChkZWZXLFxuICBwb2ludHMsXG4gIGNvZWZmcyxcbiAgbGVuLFxuICBqYWNvYmlhblJlc3VsdCkge1xuICB2YXIgd25kV2lkdGggPSB0aGlzLl93bmFmVDE7XG4gIHZhciB3bmQgPSB0aGlzLl93bmFmVDI7XG4gIHZhciBuYWYgPSB0aGlzLl93bmFmVDM7XG5cbiAgLy8gRmlsbCBhbGwgYXJyYXlzXG4gIHZhciBtYXggPSAwO1xuICB2YXIgaTtcbiAgdmFyIGo7XG4gIHZhciBwO1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBwID0gcG9pbnRzW2ldO1xuICAgIHZhciBuYWZQb2ludHMgPSBwLl9nZXROQUZQb2ludHMoZGVmVyk7XG4gICAgd25kV2lkdGhbaV0gPSBuYWZQb2ludHMud25kO1xuICAgIHduZFtpXSA9IG5hZlBvaW50cy5wb2ludHM7XG4gIH1cblxuICAvLyBDb21iIHNtYWxsIHdpbmRvdyBOQUZzXG4gIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMTsgaSAtPSAyKSB7XG4gICAgdmFyIGEgPSBpIC0gMTtcbiAgICB2YXIgYiA9IGk7XG4gICAgaWYgKHduZFdpZHRoW2FdICE9PSAxIHx8IHduZFdpZHRoW2JdICE9PSAxKSB7XG4gICAgICBuYWZbYV0gPSBnZXROQUYoY29lZmZzW2FdLCB3bmRXaWR0aFthXSwgdGhpcy5fYml0TGVuZ3RoKTtcbiAgICAgIG5hZltiXSA9IGdldE5BRihjb2VmZnNbYl0sIHduZFdpZHRoW2JdLCB0aGlzLl9iaXRMZW5ndGgpO1xuICAgICAgbWF4ID0gTWF0aC5tYXgobmFmW2FdLmxlbmd0aCwgbWF4KTtcbiAgICAgIG1heCA9IE1hdGgubWF4KG5hZltiXS5sZW5ndGgsIG1heCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgY29tYiA9IFtcbiAgICAgIHBvaW50c1thXSwgLyogMSAqL1xuICAgICAgbnVsbCwgLyogMyAqL1xuICAgICAgbnVsbCwgLyogNSAqL1xuICAgICAgcG9pbnRzW2JdLCAvKiA3ICovXG4gICAgXTtcblxuICAgIC8vIFRyeSB0byBhdm9pZCBQcm9qZWN0aXZlIHBvaW50cywgaWYgcG9zc2libGVcbiAgICBpZiAocG9pbnRzW2FdLnkuY21wKHBvaW50c1tiXS55KSA9PT0gMCkge1xuICAgICAgY29tYlsxXSA9IHBvaW50c1thXS5hZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdLm5lZygpKTtcbiAgICB9IGVsc2UgaWYgKHBvaW50c1thXS55LmNtcChwb2ludHNbYl0ueS5yZWROZWcoKSkgPT09IDApIHtcbiAgICAgIGNvbWJbMV0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0uYWRkKHBvaW50c1tiXS5uZWcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbWJbMV0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdLm5lZygpKTtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSBbXG4gICAgICAtMywgLyogLTEgLTEgKi9cbiAgICAgIC0xLCAvKiAtMSAwICovXG4gICAgICAtNSwgLyogLTEgMSAqL1xuICAgICAgLTcsIC8qIDAgLTEgKi9cbiAgICAgIDAsIC8qIDAgMCAqL1xuICAgICAgNywgLyogMCAxICovXG4gICAgICA1LCAvKiAxIC0xICovXG4gICAgICAxLCAvKiAxIDAgKi9cbiAgICAgIDMsICAvKiAxIDEgKi9cbiAgICBdO1xuXG4gICAgdmFyIGpzZiA9IGdldEpTRihjb2VmZnNbYV0sIGNvZWZmc1tiXSk7XG4gICAgbWF4ID0gTWF0aC5tYXgoanNmWzBdLmxlbmd0aCwgbWF4KTtcbiAgICBuYWZbYV0gPSBuZXcgQXJyYXkobWF4KTtcbiAgICBuYWZbYl0gPSBuZXcgQXJyYXkobWF4KTtcbiAgICBmb3IgKGogPSAwOyBqIDwgbWF4OyBqKyspIHtcbiAgICAgIHZhciBqYSA9IGpzZlswXVtqXSB8IDA7XG4gICAgICB2YXIgamIgPSBqc2ZbMV1bal0gfCAwO1xuXG4gICAgICBuYWZbYV1bal0gPSBpbmRleFsoamEgKyAxKSAqIDMgKyAoamIgKyAxKV07XG4gICAgICBuYWZbYl1bal0gPSAwO1xuICAgICAgd25kW2FdID0gY29tYjtcbiAgICB9XG4gIH1cblxuICB2YXIgYWNjID0gdGhpcy5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gIHZhciB0bXAgPSB0aGlzLl93bmFmVDQ7XG4gIGZvciAoaSA9IG1heDsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgayA9IDA7XG5cbiAgICB3aGlsZSAoaSA+PSAwKSB7XG4gICAgICB2YXIgemVybyA9IHRydWU7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgdG1wW2pdID0gbmFmW2pdW2ldIHwgMDtcbiAgICAgICAgaWYgKHRtcFtqXSAhPT0gMClcbiAgICAgICAgICB6ZXJvID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXplcm8pXG4gICAgICAgIGJyZWFrO1xuICAgICAgaysrO1xuICAgICAgaS0tO1xuICAgIH1cbiAgICBpZiAoaSA+PSAwKVxuICAgICAgaysrO1xuICAgIGFjYyA9IGFjYy5kYmxwKGspO1xuICAgIGlmIChpIDwgMClcbiAgICAgIGJyZWFrO1xuXG4gICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICB2YXIgeiA9IHRtcFtqXTtcbiAgICAgIHA7XG4gICAgICBpZiAoeiA9PT0gMClcbiAgICAgICAgY29udGludWU7XG4gICAgICBlbHNlIGlmICh6ID4gMClcbiAgICAgICAgcCA9IHduZFtqXVsoeiAtIDEpID4+IDFdO1xuICAgICAgZWxzZSBpZiAoeiA8IDApXG4gICAgICAgIHAgPSB3bmRbal1bKC16IC0gMSkgPj4gMV0ubmVnKCk7XG5cbiAgICAgIGlmIChwLnR5cGUgPT09ICdhZmZpbmUnKVxuICAgICAgICBhY2MgPSBhY2MubWl4ZWRBZGQocCk7XG4gICAgICBlbHNlXG4gICAgICAgIGFjYyA9IGFjYy5hZGQocCk7XG4gICAgfVxuICB9XG4gIC8vIFplcm9pZnkgcmVmZXJlbmNlc1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgd25kW2ldID0gbnVsbDtcblxuICBpZiAoamFjb2JpYW5SZXN1bHQpXG4gICAgcmV0dXJuIGFjYztcbiAgZWxzZVxuICAgIHJldHVybiBhY2MudG9QKCk7XG59O1xuXG5mdW5jdGlvbiBCYXNlUG9pbnQoY3VydmUsIHR5cGUpIHtcbiAgdGhpcy5jdXJ2ZSA9IGN1cnZlO1xuICB0aGlzLnR5cGUgPSB0eXBlO1xuICB0aGlzLnByZWNvbXB1dGVkID0gbnVsbDtcbn1cbkJhc2VDdXJ2ZS5CYXNlUG9pbnQgPSBCYXNlUG9pbnQ7XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcSgvKm90aGVyKi8pIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUudmFsaWRhdGUodGhpcyk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLmRlY29kZVBvaW50ID0gZnVuY3Rpb24gZGVjb2RlUG9pbnQoYnl0ZXMsIGVuYykge1xuICBieXRlcyA9IHV0aWxzLnRvQXJyYXkoYnl0ZXMsIGVuYyk7XG5cbiAgdmFyIGxlbiA9IHRoaXMucC5ieXRlTGVuZ3RoKCk7XG5cbiAgLy8gdW5jb21wcmVzc2VkLCBoeWJyaWQtb2RkLCBoeWJyaWQtZXZlblxuICBpZiAoKGJ5dGVzWzBdID09PSAweDA0IHx8IGJ5dGVzWzBdID09PSAweDA2IHx8IGJ5dGVzWzBdID09PSAweDA3KSAmJlxuICAgICAgYnl0ZXMubGVuZ3RoIC0gMSA9PT0gMiAqIGxlbikge1xuICAgIGlmIChieXRlc1swXSA9PT0gMHgwNilcbiAgICAgIGFzc2VydChieXRlc1tieXRlcy5sZW5ndGggLSAxXSAlIDIgPT09IDApO1xuICAgIGVsc2UgaWYgKGJ5dGVzWzBdID09PSAweDA3KVxuICAgICAgYXNzZXJ0KGJ5dGVzW2J5dGVzLmxlbmd0aCAtIDFdICUgMiA9PT0gMSk7XG5cbiAgICB2YXIgcmVzID0gIHRoaXMucG9pbnQoYnl0ZXMuc2xpY2UoMSwgMSArIGxlbiksXG4gICAgICBieXRlcy5zbGljZSgxICsgbGVuLCAxICsgMiAqIGxlbikpO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfSBlbHNlIGlmICgoYnl0ZXNbMF0gPT09IDB4MDIgfHwgYnl0ZXNbMF0gPT09IDB4MDMpICYmXG4gICAgICAgICAgICAgIGJ5dGVzLmxlbmd0aCAtIDEgPT09IGxlbikge1xuICAgIHJldHVybiB0aGlzLnBvaW50RnJvbVgoYnl0ZXMuc2xpY2UoMSwgMSArIGxlbiksIGJ5dGVzWzBdID09PSAweDAzKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gcG9pbnQgZm9ybWF0Jyk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmVuY29kZUNvbXByZXNzZWQgPSBmdW5jdGlvbiBlbmNvZGVDb21wcmVzc2VkKGVuYykge1xuICByZXR1cm4gdGhpcy5lbmNvZGUoZW5jLCB0cnVlKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2VuY29kZSA9IGZ1bmN0aW9uIF9lbmNvZGUoY29tcGFjdCkge1xuICB2YXIgbGVuID0gdGhpcy5jdXJ2ZS5wLmJ5dGVMZW5ndGgoKTtcbiAgdmFyIHggPSB0aGlzLmdldFgoKS50b0FycmF5KCdiZScsIGxlbik7XG5cbiAgaWYgKGNvbXBhY3QpXG4gICAgcmV0dXJuIFsgdGhpcy5nZXRZKCkuaXNFdmVuKCkgPyAweDAyIDogMHgwMyBdLmNvbmNhdCh4KTtcblxuICByZXR1cm4gWyAweDA0IF0uY29uY2F0KHgsIHRoaXMuZ2V0WSgpLnRvQXJyYXkoJ2JlJywgbGVuKSk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShlbmMsIGNvbXBhY3QpIHtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZSh0aGlzLl9lbmNvZGUoY29tcGFjdCksIGVuYyk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLnByZWNvbXB1dGUgPSBmdW5jdGlvbiBwcmVjb21wdXRlKHBvd2VyKSB7XG4gIGlmICh0aGlzLnByZWNvbXB1dGVkKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIHZhciBwcmVjb21wdXRlZCA9IHtcbiAgICBkb3VibGVzOiBudWxsLFxuICAgIG5hZjogbnVsbCxcbiAgICBiZXRhOiBudWxsLFxuICB9O1xuICBwcmVjb21wdXRlZC5uYWYgPSB0aGlzLl9nZXROQUZQb2ludHMoOCk7XG4gIHByZWNvbXB1dGVkLmRvdWJsZXMgPSB0aGlzLl9nZXREb3VibGVzKDQsIHBvd2VyKTtcbiAgcHJlY29tcHV0ZWQuYmV0YSA9IHRoaXMuX2dldEJldGEoKTtcbiAgdGhpcy5wcmVjb21wdXRlZCA9IHByZWNvbXB1dGVkO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5faGFzRG91YmxlcyA9IGZ1bmN0aW9uIF9oYXNEb3VibGVzKGspIHtcbiAgaWYgKCF0aGlzLnByZWNvbXB1dGVkKVxuICAgIHJldHVybiBmYWxzZTtcblxuICB2YXIgZG91YmxlcyA9IHRoaXMucHJlY29tcHV0ZWQuZG91YmxlcztcbiAgaWYgKCFkb3VibGVzKVxuICAgIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gZG91Ymxlcy5wb2ludHMubGVuZ3RoID49IE1hdGguY2VpbCgoay5iaXRMZW5ndGgoKSArIDEpIC8gZG91Ymxlcy5zdGVwKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2dldERvdWJsZXMgPSBmdW5jdGlvbiBfZ2V0RG91YmxlcyhzdGVwLCBwb3dlcikge1xuICBpZiAodGhpcy5wcmVjb21wdXRlZCAmJiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMpXG4gICAgcmV0dXJuIHRoaXMucHJlY29tcHV0ZWQuZG91YmxlcztcblxuICB2YXIgZG91YmxlcyA9IFsgdGhpcyBdO1xuICB2YXIgYWNjID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3dlcjsgaSArPSBzdGVwKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzdGVwOyBqKyspXG4gICAgICBhY2MgPSBhY2MuZGJsKCk7XG4gICAgZG91Ymxlcy5wdXNoKGFjYyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzdGVwOiBzdGVwLFxuICAgIHBvaW50czogZG91YmxlcyxcbiAgfTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2dldE5BRlBvaW50cyA9IGZ1bmN0aW9uIF9nZXROQUZQb2ludHMod25kKSB7XG4gIGlmICh0aGlzLnByZWNvbXB1dGVkICYmIHRoaXMucHJlY29tcHV0ZWQubmFmKVxuICAgIHJldHVybiB0aGlzLnByZWNvbXB1dGVkLm5hZjtcblxuICB2YXIgcmVzID0gWyB0aGlzIF07XG4gIHZhciBtYXggPSAoMSA8PCB3bmQpIC0gMTtcbiAgdmFyIGRibCA9IG1heCA9PT0gMSA/IG51bGwgOiB0aGlzLmRibCgpO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IG1heDsgaSsrKVxuICAgIHJlc1tpXSA9IHJlc1tpIC0gMV0uYWRkKGRibCk7XG4gIHJldHVybiB7XG4gICAgd25kOiB3bmQsXG4gICAgcG9pbnRzOiByZXMsXG4gIH07XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9nZXRCZXRhID0gZnVuY3Rpb24gX2dldEJldGEoKSB7XG4gIHJldHVybiBudWxsO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5kYmxwID0gZnVuY3Rpb24gZGJscChrKSB7XG4gIHZhciByID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrOyBpKyspXG4gICAgciA9IHIuZGJsKCk7XG4gIHJldHVybiByO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xuXG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBTaG9ydEN1cnZlKGNvbmYpIHtcbiAgQmFzZS5jYWxsKHRoaXMsICdzaG9ydCcsIGNvbmYpO1xuXG4gIHRoaXMuYSA9IG5ldyBCTihjb25mLmEsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYiA9IG5ldyBCTihjb25mLmIsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMudGludiA9IHRoaXMudHdvLnJlZEludm0oKTtcblxuICB0aGlzLnplcm9BID0gdGhpcy5hLmZyb21SZWQoKS5jbXBuKDApID09PSAwO1xuICB0aGlzLnRocmVlQSA9IHRoaXMuYS5mcm9tUmVkKCkuc3ViKHRoaXMucCkuY21wbigtMykgPT09IDA7XG5cbiAgLy8gSWYgdGhlIGN1cnZlIGlzIGVuZG9tb3JwaGljLCBwcmVjYWxjdWxhdGUgYmV0YSBhbmQgbGFtYmRhXG4gIHRoaXMuZW5kbyA9IHRoaXMuX2dldEVuZG9tb3JwaGlzbShjb25mKTtcbiAgdGhpcy5fZW5kb1duYWZUMSA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fZW5kb1duYWZUMiA9IG5ldyBBcnJheSg0KTtcbn1cbmluaGVyaXRzKFNob3J0Q3VydmUsIEJhc2UpO1xubW9kdWxlLmV4cG9ydHMgPSBTaG9ydEN1cnZlO1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZ2V0RW5kb21vcnBoaXNtID0gZnVuY3Rpb24gX2dldEVuZG9tb3JwaGlzbShjb25mKSB7XG4gIC8vIE5vIGVmZmljaWVudCBlbmRvbW9ycGhpc21cbiAgaWYgKCF0aGlzLnplcm9BIHx8ICF0aGlzLmcgfHwgIXRoaXMubiB8fCB0aGlzLnAubW9kbigzKSAhPT0gMSlcbiAgICByZXR1cm47XG5cbiAgLy8gQ29tcHV0ZSBiZXRhIGFuZCBsYW1iZGEsIHRoYXQgbGFtYmRhICogUCA9IChiZXRhICogUHg7IFB5KVxuICB2YXIgYmV0YTtcbiAgdmFyIGxhbWJkYTtcbiAgaWYgKGNvbmYuYmV0YSkge1xuICAgIGJldGEgPSBuZXcgQk4oY29uZi5iZXRhLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB9IGVsc2Uge1xuICAgIHZhciBiZXRhcyA9IHRoaXMuX2dldEVuZG9Sb290cyh0aGlzLnApO1xuICAgIC8vIENob29zZSB0aGUgc21hbGxlc3QgYmV0YVxuICAgIGJldGEgPSBiZXRhc1swXS5jbXAoYmV0YXNbMV0pIDwgMCA/IGJldGFzWzBdIDogYmV0YXNbMV07XG4gICAgYmV0YSA9IGJldGEudG9SZWQodGhpcy5yZWQpO1xuICB9XG4gIGlmIChjb25mLmxhbWJkYSkge1xuICAgIGxhbWJkYSA9IG5ldyBCTihjb25mLmxhbWJkYSwgMTYpO1xuICB9IGVsc2Uge1xuICAgIC8vIENob29zZSB0aGUgbGFtYmRhIHRoYXQgaXMgbWF0Y2hpbmcgc2VsZWN0ZWQgYmV0YVxuICAgIHZhciBsYW1iZGFzID0gdGhpcy5fZ2V0RW5kb1Jvb3RzKHRoaXMubik7XG4gICAgaWYgKHRoaXMuZy5tdWwobGFtYmRhc1swXSkueC5jbXAodGhpcy5nLngucmVkTXVsKGJldGEpKSA9PT0gMCkge1xuICAgICAgbGFtYmRhID0gbGFtYmRhc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFtYmRhID0gbGFtYmRhc1sxXTtcbiAgICAgIGFzc2VydCh0aGlzLmcubXVsKGxhbWJkYSkueC5jbXAodGhpcy5nLngucmVkTXVsKGJldGEpKSA9PT0gMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gR2V0IGJhc2lzIHZlY3RvcnMsIHVzZWQgZm9yIGJhbGFuY2VkIGxlbmd0aC10d28gcmVwcmVzZW50YXRpb25cbiAgdmFyIGJhc2lzO1xuICBpZiAoY29uZi5iYXNpcykge1xuICAgIGJhc2lzID0gY29uZi5iYXNpcy5tYXAoZnVuY3Rpb24odmVjKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhOiBuZXcgQk4odmVjLmEsIDE2KSxcbiAgICAgICAgYjogbmV3IEJOKHZlYy5iLCAxNiksXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGJhc2lzID0gdGhpcy5fZ2V0RW5kb0Jhc2lzKGxhbWJkYSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJldGE6IGJldGEsXG4gICAgbGFtYmRhOiBsYW1iZGEsXG4gICAgYmFzaXM6IGJhc2lzLFxuICB9O1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2dldEVuZG9Sb290cyA9IGZ1bmN0aW9uIF9nZXRFbmRvUm9vdHMobnVtKSB7XG4gIC8vIEZpbmQgcm9vdHMgb2YgZm9yIHheMiArIHggKyAxIGluIEZcbiAgLy8gUm9vdCA9ICgtMSArLSBTcXJ0KC0zKSkgLyAyXG4gIC8vXG4gIHZhciByZWQgPSBudW0gPT09IHRoaXMucCA/IHRoaXMucmVkIDogQk4ubW9udChudW0pO1xuICB2YXIgdGludiA9IG5ldyBCTigyKS50b1JlZChyZWQpLnJlZEludm0oKTtcbiAgdmFyIG50aW52ID0gdGludi5yZWROZWcoKTtcblxuICB2YXIgcyA9IG5ldyBCTigzKS50b1JlZChyZWQpLnJlZE5lZygpLnJlZFNxcnQoKS5yZWRNdWwodGludik7XG5cbiAgdmFyIGwxID0gbnRpbnYucmVkQWRkKHMpLmZyb21SZWQoKTtcbiAgdmFyIGwyID0gbnRpbnYucmVkU3ViKHMpLmZyb21SZWQoKTtcbiAgcmV0dXJuIFsgbDEsIGwyIF07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZ2V0RW5kb0Jhc2lzID0gZnVuY3Rpb24gX2dldEVuZG9CYXNpcyhsYW1iZGEpIHtcbiAgLy8gYXByeFNxcnQgPj0gc3FydCh0aGlzLm4pXG4gIHZhciBhcHJ4U3FydCA9IHRoaXMubi51c2hybihNYXRoLmZsb29yKHRoaXMubi5iaXRMZW5ndGgoKSAvIDIpKTtcblxuICAvLyAzLjc0XG4gIC8vIFJ1biBFR0NELCB1bnRpbCByKEwgKyAxKSA8IGFwcnhTcXJ0XG4gIHZhciB1ID0gbGFtYmRhO1xuICB2YXIgdiA9IHRoaXMubi5jbG9uZSgpO1xuICB2YXIgeDEgPSBuZXcgQk4oMSk7XG4gIHZhciB5MSA9IG5ldyBCTigwKTtcbiAgdmFyIHgyID0gbmV3IEJOKDApO1xuICB2YXIgeTIgPSBuZXcgQk4oMSk7XG5cbiAgLy8gTk9URTogYWxsIHZlY3RvcnMgYXJlIHJvb3RzIG9mOiBhICsgYiAqIGxhbWJkYSA9IDAgKG1vZCBuKVxuICB2YXIgYTA7XG4gIHZhciBiMDtcbiAgLy8gRmlyc3QgdmVjdG9yXG4gIHZhciBhMTtcbiAgdmFyIGIxO1xuICAvLyBTZWNvbmQgdmVjdG9yXG4gIHZhciBhMjtcbiAgdmFyIGIyO1xuXG4gIHZhciBwcmV2UjtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcjtcbiAgdmFyIHg7XG4gIHdoaWxlICh1LmNtcG4oMCkgIT09IDApIHtcbiAgICB2YXIgcSA9IHYuZGl2KHUpO1xuICAgIHIgPSB2LnN1YihxLm11bCh1KSk7XG4gICAgeCA9IHgyLnN1YihxLm11bCh4MSkpO1xuICAgIHZhciB5ID0geTIuc3ViKHEubXVsKHkxKSk7XG5cbiAgICBpZiAoIWExICYmIHIuY21wKGFwcnhTcXJ0KSA8IDApIHtcbiAgICAgIGEwID0gcHJldlIubmVnKCk7XG4gICAgICBiMCA9IHgxO1xuICAgICAgYTEgPSByLm5lZygpO1xuICAgICAgYjEgPSB4O1xuICAgIH0gZWxzZSBpZiAoYTEgJiYgKytpID09PSAyKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcHJldlIgPSByO1xuXG4gICAgdiA9IHU7XG4gICAgdSA9IHI7XG4gICAgeDIgPSB4MTtcbiAgICB4MSA9IHg7XG4gICAgeTIgPSB5MTtcbiAgICB5MSA9IHk7XG4gIH1cbiAgYTIgPSByLm5lZygpO1xuICBiMiA9IHg7XG5cbiAgdmFyIGxlbjEgPSBhMS5zcXIoKS5hZGQoYjEuc3FyKCkpO1xuICB2YXIgbGVuMiA9IGEyLnNxcigpLmFkZChiMi5zcXIoKSk7XG4gIGlmIChsZW4yLmNtcChsZW4xKSA+PSAwKSB7XG4gICAgYTIgPSBhMDtcbiAgICBiMiA9IGIwO1xuICB9XG5cbiAgLy8gTm9ybWFsaXplIHNpZ25zXG4gIGlmIChhMS5uZWdhdGl2ZSkge1xuICAgIGExID0gYTEubmVnKCk7XG4gICAgYjEgPSBiMS5uZWcoKTtcbiAgfVxuICBpZiAoYTIubmVnYXRpdmUpIHtcbiAgICBhMiA9IGEyLm5lZygpO1xuICAgIGIyID0gYjIubmVnKCk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIHsgYTogYTEsIGI6IGIxIH0sXG4gICAgeyBhOiBhMiwgYjogYjIgfSxcbiAgXTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9lbmRvU3BsaXQgPSBmdW5jdGlvbiBfZW5kb1NwbGl0KGspIHtcbiAgdmFyIGJhc2lzID0gdGhpcy5lbmRvLmJhc2lzO1xuICB2YXIgdjEgPSBiYXNpc1swXTtcbiAgdmFyIHYyID0gYmFzaXNbMV07XG5cbiAgdmFyIGMxID0gdjIuYi5tdWwoaykuZGl2Um91bmQodGhpcy5uKTtcbiAgdmFyIGMyID0gdjEuYi5uZWcoKS5tdWwoaykuZGl2Um91bmQodGhpcy5uKTtcblxuICB2YXIgcDEgPSBjMS5tdWwodjEuYSk7XG4gIHZhciBwMiA9IGMyLm11bCh2Mi5hKTtcbiAgdmFyIHExID0gYzEubXVsKHYxLmIpO1xuICB2YXIgcTIgPSBjMi5tdWwodjIuYik7XG5cbiAgLy8gQ2FsY3VsYXRlIGFuc3dlclxuICB2YXIgazEgPSBrLnN1YihwMSkuc3ViKHAyKTtcbiAgdmFyIGsyID0gcTEuYWRkKHEyKS5uZWcoKTtcbiAgcmV0dXJuIHsgazE6IGsxLCBrMjogazIgfTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnBvaW50RnJvbVggPSBmdW5jdGlvbiBwb2ludEZyb21YKHgsIG9kZCkge1xuICB4ID0gbmV3IEJOKHgsIDE2KTtcbiAgaWYgKCF4LnJlZClcbiAgICB4ID0geC50b1JlZCh0aGlzLnJlZCk7XG5cbiAgdmFyIHkyID0geC5yZWRTcXIoKS5yZWRNdWwoeCkucmVkSUFkZCh4LnJlZE11bCh0aGlzLmEpKS5yZWRJQWRkKHRoaXMuYik7XG4gIHZhciB5ID0geTIucmVkU3FydCgpO1xuICBpZiAoeS5yZWRTcXIoKS5yZWRTdWIoeTIpLmNtcCh0aGlzLnplcm8pICE9PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuXG4gIC8vIFhYWCBJcyB0aGVyZSBhbnkgd2F5IHRvIHRlbGwgaWYgdGhlIG51bWJlciBpcyBvZGQgd2l0aG91dCBjb252ZXJ0aW5nIGl0XG4gIC8vIHRvIG5vbi1yZWQgZm9ybT9cbiAgdmFyIGlzT2RkID0geS5mcm9tUmVkKCkuaXNPZGQoKTtcbiAgaWYgKG9kZCAmJiAhaXNPZGQgfHwgIW9kZCAmJiBpc09kZClcbiAgICB5ID0geS5yZWROZWcoKTtcblxuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5KTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpIHtcbiAgaWYgKHBvaW50LmluZilcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB2YXIgeCA9IHBvaW50Lng7XG4gIHZhciB5ID0gcG9pbnQueTtcblxuICB2YXIgYXggPSB0aGlzLmEucmVkTXVsKHgpO1xuICB2YXIgcmhzID0geC5yZWRTcXIoKS5yZWRNdWwoeCkucmVkSUFkZChheCkucmVkSUFkZCh0aGlzLmIpO1xuICByZXR1cm4geS5yZWRTcXIoKS5yZWRJU3ViKHJocykuY21wbigwKSA9PT0gMDtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9lbmRvV25hZk11bEFkZCA9XG4gICAgZnVuY3Rpb24gX2VuZG9XbmFmTXVsQWRkKHBvaW50cywgY29lZmZzLCBqYWNvYmlhblJlc3VsdCkge1xuICAgICAgdmFyIG5wb2ludHMgPSB0aGlzLl9lbmRvV25hZlQxO1xuICAgICAgdmFyIG5jb2VmZnMgPSB0aGlzLl9lbmRvV25hZlQyO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNwbGl0ID0gdGhpcy5fZW5kb1NwbGl0KGNvZWZmc1tpXSk7XG4gICAgICAgIHZhciBwID0gcG9pbnRzW2ldO1xuICAgICAgICB2YXIgYmV0YSA9IHAuX2dldEJldGEoKTtcblxuICAgICAgICBpZiAoc3BsaXQuazEubmVnYXRpdmUpIHtcbiAgICAgICAgICBzcGxpdC5rMS5pbmVnKCk7XG4gICAgICAgICAgcCA9IHAubmVnKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGxpdC5rMi5uZWdhdGl2ZSkge1xuICAgICAgICAgIHNwbGl0LmsyLmluZWcoKTtcbiAgICAgICAgICBiZXRhID0gYmV0YS5uZWcodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBucG9pbnRzW2kgKiAyXSA9IHA7XG4gICAgICAgIG5wb2ludHNbaSAqIDIgKyAxXSA9IGJldGE7XG4gICAgICAgIG5jb2VmZnNbaSAqIDJdID0gc3BsaXQuazE7XG4gICAgICAgIG5jb2VmZnNbaSAqIDIgKyAxXSA9IHNwbGl0LmsyO1xuICAgICAgfVxuICAgICAgdmFyIHJlcyA9IHRoaXMuX3duYWZNdWxBZGQoMSwgbnBvaW50cywgbmNvZWZmcywgaSAqIDIsIGphY29iaWFuUmVzdWx0KTtcblxuICAgICAgLy8gQ2xlYW4tdXAgcmVmZXJlbmNlcyB0byBwb2ludHMgYW5kIGNvZWZmaWNpZW50c1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpICogMjsgaisrKSB7XG4gICAgICAgIG5wb2ludHNbal0gPSBudWxsO1xuICAgICAgICBuY29lZmZzW2pdID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcblxuZnVuY3Rpb24gUG9pbnQoY3VydmUsIHgsIHksIGlzUmVkKSB7XG4gIEJhc2UuQmFzZVBvaW50LmNhbGwodGhpcywgY3VydmUsICdhZmZpbmUnKTtcbiAgaWYgKHggPT09IG51bGwgJiYgeSA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IG51bGw7XG4gICAgdGhpcy55ID0gbnVsbDtcbiAgICB0aGlzLmluZiA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0gbmV3IEJOKHgsIDE2KTtcbiAgICB0aGlzLnkgPSBuZXcgQk4oeSwgMTYpO1xuICAgIC8vIEZvcmNlIHJlZGdvbWVyeSByZXByZXNlbnRhdGlvbiB3aGVuIGxvYWRpbmcgZnJvbSBKU09OXG4gICAgaWYgKGlzUmVkKSB7XG4gICAgICB0aGlzLnguZm9yY2VSZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgICAgdGhpcy55LmZvcmNlUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLngucmVkKVxuICAgICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMueS5yZWQpXG4gICAgICB0aGlzLnkgPSB0aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIHRoaXMuaW5mID0gZmFsc2U7XG4gIH1cbn1cbmluaGVyaXRzKFBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24gcG9pbnQoeCwgeSwgaXNSZWQpIHtcbiAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLCB4LCB5LCBpc1JlZCk7XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5wb2ludEZyb21KU09OID0gZnVuY3Rpb24gcG9pbnRGcm9tSlNPTihvYmosIHJlZCkge1xuICByZXR1cm4gUG9pbnQuZnJvbUpTT04odGhpcywgb2JqLCByZWQpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9nZXRCZXRhID0gZnVuY3Rpb24gX2dldEJldGEoKSB7XG4gIGlmICghdGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybjtcblxuICB2YXIgcHJlID0gdGhpcy5wcmVjb21wdXRlZDtcbiAgaWYgKHByZSAmJiBwcmUuYmV0YSlcbiAgICByZXR1cm4gcHJlLmJldGE7XG5cbiAgdmFyIGJldGEgPSB0aGlzLmN1cnZlLnBvaW50KHRoaXMueC5yZWRNdWwodGhpcy5jdXJ2ZS5lbmRvLmJldGEpLCB0aGlzLnkpO1xuICBpZiAocHJlKSB7XG4gICAgdmFyIGN1cnZlID0gdGhpcy5jdXJ2ZTtcbiAgICB2YXIgZW5kb011bCA9IGZ1bmN0aW9uKHApIHtcbiAgICAgIHJldHVybiBjdXJ2ZS5wb2ludChwLngucmVkTXVsKGN1cnZlLmVuZG8uYmV0YSksIHAueSk7XG4gICAgfTtcbiAgICBwcmUuYmV0YSA9IGJldGE7XG4gICAgYmV0YS5wcmVjb21wdXRlZCA9IHtcbiAgICAgIGJldGE6IG51bGwsXG4gICAgICBuYWY6IHByZS5uYWYgJiYge1xuICAgICAgICB3bmQ6IHByZS5uYWYud25kLFxuICAgICAgICBwb2ludHM6IHByZS5uYWYucG9pbnRzLm1hcChlbmRvTXVsKSxcbiAgICAgIH0sXG4gICAgICBkb3VibGVzOiBwcmUuZG91YmxlcyAmJiB7XG4gICAgICAgIHN0ZXA6IHByZS5kb3VibGVzLnN0ZXAsXG4gICAgICAgIHBvaW50czogcHJlLmRvdWJsZXMucG9pbnRzLm1hcChlbmRvTXVsKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4gYmV0YTtcbn07XG5cblBvaW50LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7XG4gIGlmICghdGhpcy5wcmVjb21wdXRlZClcbiAgICByZXR1cm4gWyB0aGlzLngsIHRoaXMueSBdO1xuXG4gIHJldHVybiBbIHRoaXMueCwgdGhpcy55LCB0aGlzLnByZWNvbXB1dGVkICYmIHtcbiAgICBkb3VibGVzOiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMgJiYge1xuICAgICAgc3RlcDogdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzLnN0ZXAsXG4gICAgICBwb2ludHM6IHRoaXMucHJlY29tcHV0ZWQuZG91Ymxlcy5wb2ludHMuc2xpY2UoMSksXG4gICAgfSxcbiAgICBuYWY6IHRoaXMucHJlY29tcHV0ZWQubmFmICYmIHtcbiAgICAgIHduZDogdGhpcy5wcmVjb21wdXRlZC5uYWYud25kLFxuICAgICAgcG9pbnRzOiB0aGlzLnByZWNvbXB1dGVkLm5hZi5wb2ludHMuc2xpY2UoMSksXG4gICAgfSxcbiAgfSBdO1xufTtcblxuUG9pbnQuZnJvbUpTT04gPSBmdW5jdGlvbiBmcm9tSlNPTihjdXJ2ZSwgb2JqLCByZWQpIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKVxuICAgIG9iaiA9IEpTT04ucGFyc2Uob2JqKTtcbiAgdmFyIHJlcyA9IGN1cnZlLnBvaW50KG9ialswXSwgb2JqWzFdLCByZWQpO1xuICBpZiAoIW9ialsyXSlcbiAgICByZXR1cm4gcmVzO1xuXG4gIGZ1bmN0aW9uIG9iajJwb2ludChvYmopIHtcbiAgICByZXR1cm4gY3VydmUucG9pbnQob2JqWzBdLCBvYmpbMV0sIHJlZCk7XG4gIH1cblxuICB2YXIgcHJlID0gb2JqWzJdO1xuICByZXMucHJlY29tcHV0ZWQgPSB7XG4gICAgYmV0YTogbnVsbCxcbiAgICBkb3VibGVzOiBwcmUuZG91YmxlcyAmJiB7XG4gICAgICBzdGVwOiBwcmUuZG91Ymxlcy5zdGVwLFxuICAgICAgcG9pbnRzOiBbIHJlcyBdLmNvbmNhdChwcmUuZG91Ymxlcy5wb2ludHMubWFwKG9iajJwb2ludCkpLFxuICAgIH0sXG4gICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgIHduZDogcHJlLm5hZi53bmQsXG4gICAgICBwb2ludHM6IFsgcmVzIF0uY29uY2F0KHByZS5uYWYucG9pbnRzLm1hcChvYmoycG9pbnQpKSxcbiAgICB9LFxuICB9O1xuICByZXR1cm4gcmVzO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgUG9pbnQgSW5maW5pdHk+JztcbiAgcmV0dXJuICc8RUMgUG9pbnQgeDogJyArIHRoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgeTogJyArIHRoaXMueS5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICByZXR1cm4gdGhpcy5pbmY7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKHApIHtcbiAgLy8gTyArIFAgPSBQXG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gcDtcblxuICAvLyBQICsgTyA9IFBcbiAgaWYgKHAuaW5mKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIFAgKyBQID0gMlBcbiAgaWYgKHRoaXMuZXEocCkpXG4gICAgcmV0dXJuIHRoaXMuZGJsKCk7XG5cbiAgLy8gUCArICgtUCkgPSBPXG4gIGlmICh0aGlzLm5lZygpLmVxKHApKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIC8vIFAgKyBRID0gT1xuICBpZiAodGhpcy54LmNtcChwLngpID09PSAwKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIHZhciBjID0gdGhpcy55LnJlZFN1YihwLnkpO1xuICBpZiAoYy5jbXBuKDApICE9PSAwKVxuICAgIGMgPSBjLnJlZE11bCh0aGlzLngucmVkU3ViKHAueCkucmVkSW52bSgpKTtcbiAgdmFyIG54ID0gYy5yZWRTcXIoKS5yZWRJU3ViKHRoaXMueCkucmVkSVN1YihwLngpO1xuICB2YXIgbnkgPSBjLnJlZE11bCh0aGlzLngucmVkU3ViKG54KSkucmVkSVN1Yih0aGlzLnkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgaWYgKHRoaXMuaW5mKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIDJQID0gT1xuICB2YXIgeXMxID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICBpZiAoeXMxLmNtcG4oMCkgPT09IDApXG4gICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7XG5cbiAgdmFyIGEgPSB0aGlzLmN1cnZlLmE7XG5cbiAgdmFyIHgyID0gdGhpcy54LnJlZFNxcigpO1xuICB2YXIgZHlpbnYgPSB5czEucmVkSW52bSgpO1xuICB2YXIgYyA9IHgyLnJlZEFkZCh4MikucmVkSUFkZCh4MikucmVkSUFkZChhKS5yZWRNdWwoZHlpbnYpO1xuXG4gIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0aGlzLngucmVkQWRkKHRoaXMueCkpO1xuICB2YXIgbnkgPSBjLnJlZE11bCh0aGlzLngucmVkU3ViKG54KSkucmVkSVN1Yih0aGlzLnkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbiBnZXRYKCkge1xuICByZXR1cm4gdGhpcy54LmZyb21SZWQoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRZID0gZnVuY3Rpb24gZ2V0WSgpIHtcbiAgcmV0dXJuIHRoaXMueS5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsKGspIHtcbiAgayA9IG5ldyBCTihrLCAxNik7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcbiAgZWxzZSBpZiAodGhpcy5faGFzRG91YmxlcyhrKSlcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZml4ZWROYWZNdWwodGhpcywgayk7XG4gIGVsc2UgaWYgKHRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQoWyB0aGlzIF0sIFsgayBdKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uIG11bEFkZChrMSwgcDIsIGsyKSB7XG4gIHZhciBwb2ludHMgPSBbIHRoaXMsIHAyIF07XG4gIHZhciBjb2VmZnMgPSBbIGsxLCBrMiBdO1xuICBpZiAodGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChwb2ludHMsIGNvZWZmcyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLCBwb2ludHMsIGNvZWZmcywgMik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuam11bEFkZCA9IGZ1bmN0aW9uIGptdWxBZGQoazEsIHAyLCBrMikge1xuICB2YXIgcG9pbnRzID0gWyB0aGlzLCBwMiBdO1xuICB2YXIgY29lZmZzID0gWyBrMSwgazIgXTtcbiAgaWYgKHRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQocG9pbnRzLCBjb2VmZnMsIHRydWUpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgcG9pbnRzLCBjb2VmZnMsIDIsIHRydWUpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEocCkge1xuICByZXR1cm4gdGhpcyA9PT0gcCB8fFxuICAgICAgICAgdGhpcy5pbmYgPT09IHAuaW5mICYmXG4gICAgICAgICAgICAgKHRoaXMuaW5mIHx8IHRoaXMueC5jbXAocC54KSA9PT0gMCAmJiB0aGlzLnkuY21wKHAueSkgPT09IDApO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZyhfcHJlY29tcHV0ZSkge1xuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgdmFyIHJlcyA9IHRoaXMuY3VydmUucG9pbnQodGhpcy54LCB0aGlzLnkucmVkTmVnKCkpO1xuICBpZiAoX3ByZWNvbXB1dGUgJiYgdGhpcy5wcmVjb21wdXRlZCkge1xuICAgIHZhciBwcmUgPSB0aGlzLnByZWNvbXB1dGVkO1xuICAgIHZhciBuZWdhdGUgPSBmdW5jdGlvbihwKSB7XG4gICAgICByZXR1cm4gcC5uZWcoKTtcbiAgICB9O1xuICAgIHJlcy5wcmVjb21wdXRlZCA9IHtcbiAgICAgIG5hZjogcHJlLm5hZiAmJiB7XG4gICAgICAgIHduZDogcHJlLm5hZi53bmQsXG4gICAgICAgIHBvaW50czogcHJlLm5hZi5wb2ludHMubWFwKG5lZ2F0ZSksXG4gICAgICB9LFxuICAgICAgZG91YmxlczogcHJlLmRvdWJsZXMgJiYge1xuICAgICAgICBzdGVwOiBwcmUuZG91Ymxlcy5zdGVwLFxuICAgICAgICBwb2ludHM6IHByZS5kb3VibGVzLnBvaW50cy5tYXAobmVnYXRlKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnRvSiA9IGZ1bmN0aW9uIHRvSigpIHtcbiAgaWYgKHRoaXMuaW5mKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcblxuICB2YXIgcmVzID0gdGhpcy5jdXJ2ZS5qcG9pbnQodGhpcy54LCB0aGlzLnksIHRoaXMuY3VydmUub25lKTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIEpQb2ludChjdXJ2ZSwgeCwgeSwgeikge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAnamFjb2JpYW4nKTtcbiAgaWYgKHggPT09IG51bGwgJiYgeSA9PT0gbnVsbCAmJiB6ID09PSBudWxsKSB7XG4gICAgdGhpcy54ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy55ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy56ID0gbmV3IEJOKDApO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IG5ldyBCTih4LCAxNik7XG4gICAgdGhpcy55ID0gbmV3IEJOKHksIDE2KTtcbiAgICB0aGlzLnogPSBuZXcgQk4oeiwgMTYpO1xuICB9XG4gIGlmICghdGhpcy54LnJlZClcbiAgICB0aGlzLnggPSB0aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICBpZiAoIXRoaXMueS5yZWQpXG4gICAgdGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgaWYgKCF0aGlzLnoucmVkKVxuICAgIHRoaXMueiA9IHRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG5cbiAgdGhpcy56T25lID0gdGhpcy56ID09PSB0aGlzLmN1cnZlLm9uZTtcbn1cbmluaGVyaXRzKEpQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5qcG9pbnQgPSBmdW5jdGlvbiBqcG9pbnQoeCwgeSwgeikge1xuICByZXR1cm4gbmV3IEpQb2ludCh0aGlzLCB4LCB5LCB6KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUudG9QID0gZnVuY3Rpb24gdG9QKCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7XG5cbiAgdmFyIHppbnYgPSB0aGlzLnoucmVkSW52bSgpO1xuICB2YXIgemludjIgPSB6aW52LnJlZFNxcigpO1xuICB2YXIgYXggPSB0aGlzLngucmVkTXVsKHppbnYyKTtcbiAgdmFyIGF5ID0gdGhpcy55LnJlZE11bCh6aW52MikucmVkTXVsKHppbnYpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KGF4LCBheSk7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZygpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KHRoaXMueCwgdGhpcy55LnJlZE5lZygpLCB0aGlzLnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQocCkge1xuICAvLyBPICsgUCA9IFBcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBwO1xuXG4gIC8vIFAgKyBPID0gUFxuICBpZiAocC5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gMTJNICsgNFMgKyA3QVxuICB2YXIgcHoyID0gcC56LnJlZFNxcigpO1xuICB2YXIgejIgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciB1MSA9IHRoaXMueC5yZWRNdWwocHoyKTtcbiAgdmFyIHUyID0gcC54LnJlZE11bCh6Mik7XG4gIHZhciBzMSA9IHRoaXMueS5yZWRNdWwocHoyLnJlZE11bChwLnopKTtcbiAgdmFyIHMyID0gcC55LnJlZE11bCh6Mi5yZWRNdWwodGhpcy56KSk7XG5cbiAgdmFyIGggPSB1MS5yZWRTdWIodTIpO1xuICB2YXIgciA9IHMxLnJlZFN1YihzMik7XG4gIGlmIChoLmNtcG4oMCkgPT09IDApIHtcbiAgICBpZiAoci5jbXBuKDApICE9PSAwKVxuICAgICAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiB0aGlzLmRibCgpO1xuICB9XG5cbiAgdmFyIGgyID0gaC5yZWRTcXIoKTtcbiAgdmFyIGgzID0gaDIucmVkTXVsKGgpO1xuICB2YXIgdiA9IHUxLnJlZE11bChoMik7XG5cbiAgdmFyIG54ID0gci5yZWRTcXIoKS5yZWRJQWRkKGgzKS5yZWRJU3ViKHYpLnJlZElTdWIodik7XG4gIHZhciBueSA9IHIucmVkTXVsKHYucmVkSVN1YihueCkpLnJlZElTdWIoczEucmVkTXVsKGgzKSk7XG4gIHZhciBueiA9IHRoaXMuei5yZWRNdWwocC56KS5yZWRNdWwoaCk7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5taXhlZEFkZCA9IGZ1bmN0aW9uIG1peGVkQWRkKHApIHtcbiAgLy8gTyArIFAgPSBQXG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gcC50b0ooKTtcblxuICAvLyBQICsgTyA9IFBcbiAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIDhNICsgM1MgKyA3QVxuICB2YXIgejIgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciB1MSA9IHRoaXMueDtcbiAgdmFyIHUyID0gcC54LnJlZE11bCh6Mik7XG4gIHZhciBzMSA9IHRoaXMueTtcbiAgdmFyIHMyID0gcC55LnJlZE11bCh6MikucmVkTXVsKHRoaXMueik7XG5cbiAgdmFyIGggPSB1MS5yZWRTdWIodTIpO1xuICB2YXIgciA9IHMxLnJlZFN1YihzMik7XG4gIGlmIChoLmNtcG4oMCkgPT09IDApIHtcbiAgICBpZiAoci5jbXBuKDApICE9PSAwKVxuICAgICAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiB0aGlzLmRibCgpO1xuICB9XG5cbiAgdmFyIGgyID0gaC5yZWRTcXIoKTtcbiAgdmFyIGgzID0gaDIucmVkTXVsKGgpO1xuICB2YXIgdiA9IHUxLnJlZE11bChoMik7XG5cbiAgdmFyIG54ID0gci5yZWRTcXIoKS5yZWRJQWRkKGgzKS5yZWRJU3ViKHYpLnJlZElTdWIodik7XG4gIHZhciBueSA9IHIucmVkTXVsKHYucmVkSVN1YihueCkpLnJlZElTdWIoczEucmVkTXVsKGgzKSk7XG4gIHZhciBueiA9IHRoaXMuei5yZWRNdWwoaCk7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5kYmxwID0gZnVuY3Rpb24gZGJscChwb3cpIHtcbiAgaWYgKHBvdyA9PT0gMClcbiAgICByZXR1cm4gdGhpcztcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuICBpZiAoIXBvdylcbiAgICByZXR1cm4gdGhpcy5kYmwoKTtcblxuICB2YXIgaTtcbiAgaWYgKHRoaXMuY3VydmUuemVyb0EgfHwgdGhpcy5jdXJ2ZS50aHJlZUEpIHtcbiAgICB2YXIgciA9IHRoaXM7XG4gICAgZm9yIChpID0gMDsgaSA8IHBvdzsgaSsrKVxuICAgICAgciA9IHIuZGJsKCk7XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvLyAxTSArIDJTICsgMUEgKyBOICogKDRTICsgNU0gKyA4QSlcbiAgLy8gTiA9IDEgPT4gNk0gKyA2UyArIDlBXG4gIHZhciBhID0gdGhpcy5jdXJ2ZS5hO1xuICB2YXIgdGludiA9IHRoaXMuY3VydmUudGludjtcblxuICB2YXIganggPSB0aGlzLng7XG4gIHZhciBqeSA9IHRoaXMueTtcbiAgdmFyIGp6ID0gdGhpcy56O1xuICB2YXIgano0ID0ganoucmVkU3FyKCkucmVkU3FyKCk7XG5cbiAgLy8gUmV1c2UgcmVzdWx0c1xuICB2YXIganlkID0gankucmVkQWRkKGp5KTtcbiAgZm9yIChpID0gMDsgaSA8IHBvdzsgaSsrKSB7XG4gICAgdmFyIGp4MiA9IGp4LnJlZFNxcigpO1xuICAgIHZhciBqeWQyID0ganlkLnJlZFNxcigpO1xuICAgIHZhciBqeWQ0ID0ganlkMi5yZWRTcXIoKTtcbiAgICB2YXIgYyA9IGp4Mi5yZWRBZGQoangyKS5yZWRJQWRkKGp4MikucmVkSUFkZChhLnJlZE11bChqejQpKTtcblxuICAgIHZhciB0MSA9IGp4LnJlZE11bChqeWQyKTtcbiAgICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodDEucmVkQWRkKHQxKSk7XG4gICAgdmFyIHQyID0gdDEucmVkSVN1YihueCk7XG4gICAgdmFyIGRueSA9IGMucmVkTXVsKHQyKTtcbiAgICBkbnkgPSBkbnkucmVkSUFkZChkbnkpLnJlZElTdWIoanlkNCk7XG4gICAgdmFyIG56ID0ganlkLnJlZE11bChqeik7XG4gICAgaWYgKGkgKyAxIDwgcG93KVxuICAgICAgano0ID0gano0LnJlZE11bChqeWQ0KTtcblxuICAgIGp4ID0gbng7XG4gICAganogPSBuejtcbiAgICBqeWQgPSBkbnk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQoangsIGp5ZC5yZWRNdWwodGludiksIGp6KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24gZGJsKCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgaWYgKHRoaXMuY3VydmUuemVyb0EpXG4gICAgcmV0dXJuIHRoaXMuX3plcm9EYmwoKTtcbiAgZWxzZSBpZiAodGhpcy5jdXJ2ZS50aHJlZUEpXG4gICAgcmV0dXJuIHRoaXMuX3RocmVlRGJsKCk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5fZGJsKCk7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl96ZXJvRGJsID0gZnVuY3Rpb24gX3plcm9EYmwoKSB7XG4gIHZhciBueDtcbiAgdmFyIG55O1xuICB2YXIgbno7XG4gIC8vIFogPSAxXG4gIGlmICh0aGlzLnpPbmUpIHtcbiAgICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbFxuICAgIC8vICAgICAjZG91YmxpbmctbWRibC0yMDA3LWJsXG4gICAgLy8gMU0gKyA1UyArIDE0QVxuXG4gICAgLy8gWFggPSBYMV4yXG4gICAgdmFyIHh4ID0gdGhpcy54LnJlZFNxcigpO1xuICAgIC8vIFlZID0gWTFeMlxuICAgIHZhciB5eSA9IHRoaXMueS5yZWRTcXIoKTtcbiAgICAvLyBZWVlZID0gWVleMlxuICAgIHZhciB5eXl5ID0geXkucmVkU3FyKCk7XG4gICAgLy8gUyA9IDIgKiAoKFgxICsgWVkpXjIgLSBYWCAtIFlZWVkpXG4gICAgdmFyIHMgPSB0aGlzLngucmVkQWRkKHl5KS5yZWRTcXIoKS5yZWRJU3ViKHh4KS5yZWRJU3ViKHl5eXkpO1xuICAgIHMgPSBzLnJlZElBZGQocyk7XG4gICAgLy8gTSA9IDMgKiBYWCArIGE7IGEgPSAwXG4gICAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpO1xuICAgIC8vIFQgPSBNIF4gMiAtIDIqU1xuICAgIHZhciB0ID0gbS5yZWRTcXIoKS5yZWRJU3ViKHMpLnJlZElTdWIocyk7XG5cbiAgICAvLyA4ICogWVlZWVxuICAgIHZhciB5eXl5OCA9IHl5eXkucmVkSUFkZCh5eXl5KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuICAgIHl5eXk4ID0geXl5eTgucmVkSUFkZCh5eXl5OCk7XG5cbiAgICAvLyBYMyA9IFRcbiAgICBueCA9IHQ7XG4gICAgLy8gWTMgPSBNICogKFMgLSBUKSAtIDggKiBZWVlZXG4gICAgbnkgPSBtLnJlZE11bChzLnJlZElTdWIodCkpLnJlZElTdWIoeXl5eTgpO1xuICAgIC8vIFozID0gMipZMVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICB9IGVsc2Uge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMC5odG1sXG4gICAgLy8gICAgICNkb3VibGluZy1kYmwtMjAwOS1sXG4gICAgLy8gMk0gKyA1UyArIDEzQVxuXG4gICAgLy8gQSA9IFgxXjJcbiAgICB2YXIgYSA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBCID0gWTFeMlxuICAgIHZhciBiID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIEMgPSBCXjJcbiAgICB2YXIgYyA9IGIucmVkU3FyKCk7XG4gICAgLy8gRCA9IDIgKiAoKFgxICsgQileMiAtIEEgLSBDKVxuICAgIHZhciBkID0gdGhpcy54LnJlZEFkZChiKS5yZWRTcXIoKS5yZWRJU3ViKGEpLnJlZElTdWIoYyk7XG4gICAgZCA9IGQucmVkSUFkZChkKTtcbiAgICAvLyBFID0gMyAqIEFcbiAgICB2YXIgZSA9IGEucmVkQWRkKGEpLnJlZElBZGQoYSk7XG4gICAgLy8gRiA9IEVeMlxuICAgIHZhciBmID0gZS5yZWRTcXIoKTtcblxuICAgIC8vIDggKiBDXG4gICAgdmFyIGM4ID0gYy5yZWRJQWRkKGMpO1xuICAgIGM4ID0gYzgucmVkSUFkZChjOCk7XG4gICAgYzggPSBjOC5yZWRJQWRkKGM4KTtcblxuICAgIC8vIFgzID0gRiAtIDIgKiBEXG4gICAgbnggPSBmLnJlZElTdWIoZCkucmVkSVN1YihkKTtcbiAgICAvLyBZMyA9IEUgKiAoRCAtIFgzKSAtIDggKiBDXG4gICAgbnkgPSBlLnJlZE11bChkLnJlZElTdWIobngpKS5yZWRJU3ViKGM4KTtcbiAgICAvLyBaMyA9IDIgKiBZMSAqIFoxXG4gICAgbnogPSB0aGlzLnkucmVkTXVsKHRoaXMueik7XG4gICAgbnogPSBuei5yZWRJQWRkKG56KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuX3RocmVlRGJsID0gZnVuY3Rpb24gX3RocmVlRGJsKCkge1xuICB2YXIgbng7XG4gIHZhciBueTtcbiAgdmFyIG56O1xuICAvLyBaID0gMVxuICBpZiAodGhpcy56T25lKSB7XG4gICAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0zLmh0bWxcbiAgICAvLyAgICAgI2RvdWJsaW5nLW1kYmwtMjAwNy1ibFxuICAgIC8vIDFNICsgNVMgKyAxNUFcblxuICAgIC8vIFhYID0gWDFeMlxuICAgIHZhciB4eCA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBZWSA9IFkxXjJcbiAgICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gICAgLy8gWVlZWSA9IFlZXjJcbiAgICB2YXIgeXl5eSA9IHl5LnJlZFNxcigpO1xuICAgIC8vIFMgPSAyICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKVxuICAgIHZhciBzID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgICBzID0gcy5yZWRJQWRkKHMpO1xuICAgIC8vIE0gPSAzICogWFggKyBhXG4gICAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpLnJlZElBZGQodGhpcy5jdXJ2ZS5hKTtcbiAgICAvLyBUID0gTV4yIC0gMiAqIFNcbiAgICB2YXIgdCA9IG0ucmVkU3FyKCkucmVkSVN1YihzKS5yZWRJU3ViKHMpO1xuICAgIC8vIFgzID0gVFxuICAgIG54ID0gdDtcbiAgICAvLyBZMyA9IE0gKiAoUyAtIFQpIC0gOCAqIFlZWVlcbiAgICB2YXIgeXl5eTggPSB5eXl5LnJlZElBZGQoeXl5eSk7XG4gICAgeXl5eTggPSB5eXl5OC5yZWRJQWRkKHl5eXk4KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuICAgIG55ID0gbS5yZWRNdWwocy5yZWRJU3ViKHQpKS5yZWRJU3ViKHl5eXk4KTtcbiAgICAvLyBaMyA9IDIgKiBZMVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICB9IGVsc2Uge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMy5odG1sI2RvdWJsaW5nLWRibC0yMDAxLWJcbiAgICAvLyAzTSArIDVTXG5cbiAgICAvLyBkZWx0YSA9IFoxXjJcbiAgICB2YXIgZGVsdGEgPSB0aGlzLnoucmVkU3FyKCk7XG4gICAgLy8gZ2FtbWEgPSBZMV4yXG4gICAgdmFyIGdhbW1hID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIGJldGEgPSBYMSAqIGdhbW1hXG4gICAgdmFyIGJldGEgPSB0aGlzLngucmVkTXVsKGdhbW1hKTtcbiAgICAvLyBhbHBoYSA9IDMgKiAoWDEgLSBkZWx0YSkgKiAoWDEgKyBkZWx0YSlcbiAgICB2YXIgYWxwaGEgPSB0aGlzLngucmVkU3ViKGRlbHRhKS5yZWRNdWwodGhpcy54LnJlZEFkZChkZWx0YSkpO1xuICAgIGFscGhhID0gYWxwaGEucmVkQWRkKGFscGhhKS5yZWRJQWRkKGFscGhhKTtcbiAgICAvLyBYMyA9IGFscGhhXjIgLSA4ICogYmV0YVxuICAgIHZhciBiZXRhNCA9IGJldGEucmVkSUFkZChiZXRhKTtcbiAgICBiZXRhNCA9IGJldGE0LnJlZElBZGQoYmV0YTQpO1xuICAgIHZhciBiZXRhOCA9IGJldGE0LnJlZEFkZChiZXRhNCk7XG4gICAgbnggPSBhbHBoYS5yZWRTcXIoKS5yZWRJU3ViKGJldGE4KTtcbiAgICAvLyBaMyA9IChZMSArIFoxKV4yIC0gZ2FtbWEgLSBkZWx0YVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnopLnJlZFNxcigpLnJlZElTdWIoZ2FtbWEpLnJlZElTdWIoZGVsdGEpO1xuICAgIC8vIFkzID0gYWxwaGEgKiAoNCAqIGJldGEgLSBYMykgLSA4ICogZ2FtbWFeMlxuICAgIHZhciBnZ2FtbWE4ID0gZ2FtbWEucmVkU3FyKCk7XG4gICAgZ2dhbW1hOCA9IGdnYW1tYTgucmVkSUFkZChnZ2FtbWE4KTtcbiAgICBnZ2FtbWE4ID0gZ2dhbW1hOC5yZWRJQWRkKGdnYW1tYTgpO1xuICAgIGdnYW1tYTggPSBnZ2FtbWE4LnJlZElBZGQoZ2dhbW1hOCk7XG4gICAgbnkgPSBhbHBoYS5yZWRNdWwoYmV0YTQucmVkSVN1YihueCkpLnJlZElTdWIoZ2dhbW1hOCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl9kYmwgPSBmdW5jdGlvbiBfZGJsKCkge1xuICB2YXIgYSA9IHRoaXMuY3VydmUuYTtcblxuICAvLyA0TSArIDZTICsgMTBBXG4gIHZhciBqeCA9IHRoaXMueDtcbiAgdmFyIGp5ID0gdGhpcy55O1xuICB2YXIganogPSB0aGlzLno7XG4gIHZhciBqejQgPSBqei5yZWRTcXIoKS5yZWRTcXIoKTtcblxuICB2YXIgangyID0gangucmVkU3FyKCk7XG4gIHZhciBqeTIgPSBqeS5yZWRTcXIoKTtcblxuICB2YXIgYyA9IGp4Mi5yZWRBZGQoangyKS5yZWRJQWRkKGp4MikucmVkSUFkZChhLnJlZE11bChqejQpKTtcblxuICB2YXIganhkNCA9IGp4LnJlZEFkZChqeCk7XG4gIGp4ZDQgPSBqeGQ0LnJlZElBZGQoanhkNCk7XG4gIHZhciB0MSA9IGp4ZDQucmVkTXVsKGp5Mik7XG4gIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0MS5yZWRBZGQodDEpKTtcbiAgdmFyIHQyID0gdDEucmVkSVN1YihueCk7XG5cbiAgdmFyIGp5ZDggPSBqeTIucmVkU3FyKCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIHZhciBueSA9IGMucmVkTXVsKHQyKS5yZWRJU3ViKGp5ZDgpO1xuICB2YXIgbnogPSBqeS5yZWRBZGQoankpLnJlZE11bChqeik7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS50cnBsID0gZnVuY3Rpb24gdHJwbCgpIHtcbiAgaWYgKCF0aGlzLmN1cnZlLnplcm9BKVxuICAgIHJldHVybiB0aGlzLmRibCgpLmFkZCh0aGlzKTtcblxuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbCN0cmlwbGluZy10cGwtMjAwNy1ibFxuICAvLyA1TSArIDEwUyArIC4uLlxuXG4gIC8vIFhYID0gWDFeMlxuICB2YXIgeHggPSB0aGlzLngucmVkU3FyKCk7XG4gIC8vIFlZID0gWTFeMlxuICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gIC8vIFpaID0gWjFeMlxuICB2YXIgenogPSB0aGlzLnoucmVkU3FyKCk7XG4gIC8vIFlZWVkgPSBZWV4yXG4gIHZhciB5eXl5ID0geXkucmVkU3FyKCk7XG4gIC8vIE0gPSAzICogWFggKyBhICogWloyOyBhID0gMFxuICB2YXIgbSA9IHh4LnJlZEFkZCh4eCkucmVkSUFkZCh4eCk7XG4gIC8vIE1NID0gTV4yXG4gIHZhciBtbSA9IG0ucmVkU3FyKCk7XG4gIC8vIEUgPSA2ICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKSAtIE1NXG4gIHZhciBlID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgZSA9IGUucmVkSUFkZChlKTtcbiAgZSA9IGUucmVkQWRkKGUpLnJlZElBZGQoZSk7XG4gIGUgPSBlLnJlZElTdWIobW0pO1xuICAvLyBFRSA9IEVeMlxuICB2YXIgZWUgPSBlLnJlZFNxcigpO1xuICAvLyBUID0gMTYqWVlZWVxuICB2YXIgdCA9IHl5eXkucmVkSUFkZCh5eXl5KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgLy8gVSA9IChNICsgRSleMiAtIE1NIC0gRUUgLSBUXG4gIHZhciB1ID0gbS5yZWRJQWRkKGUpLnJlZFNxcigpLnJlZElTdWIobW0pLnJlZElTdWIoZWUpLnJlZElTdWIodCk7XG4gIC8vIFgzID0gNCAqIChYMSAqIEVFIC0gNCAqIFlZICogVSlcbiAgdmFyIHl5dTQgPSB5eS5yZWRNdWwodSk7XG4gIHl5dTQgPSB5eXU0LnJlZElBZGQoeXl1NCk7XG4gIHl5dTQgPSB5eXU0LnJlZElBZGQoeXl1NCk7XG4gIHZhciBueCA9IHRoaXMueC5yZWRNdWwoZWUpLnJlZElTdWIoeXl1NCk7XG4gIG54ID0gbngucmVkSUFkZChueCk7XG4gIG54ID0gbngucmVkSUFkZChueCk7XG4gIC8vIFkzID0gOCAqIFkxICogKFUgKiAoVCAtIFUpIC0gRSAqIEVFKVxuICB2YXIgbnkgPSB0aGlzLnkucmVkTXVsKHUucmVkTXVsKHQucmVkSVN1Yih1KSkucmVkSVN1YihlLnJlZE11bChlZSkpKTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgLy8gWjMgPSAoWjEgKyBFKV4yIC0gWlogLSBFRVxuICB2YXIgbnogPSB0aGlzLnoucmVkQWRkKGUpLnJlZFNxcigpLnJlZElTdWIoenopLnJlZElTdWIoZWUpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsKGssIGtiYXNlKSB7XG4gIGsgPSBuZXcgQk4oaywga2Jhc2UpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKHApIHtcbiAgaWYgKHAudHlwZSA9PT0gJ2FmZmluZScpXG4gICAgcmV0dXJuIHRoaXMuZXEocC50b0ooKSk7XG5cbiAgaWYgKHRoaXMgPT09IHApXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgLy8geDEgKiB6Ml4yID09IHgyICogejFeMlxuICB2YXIgejIgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciBwejIgPSBwLnoucmVkU3FyKCk7XG4gIGlmICh0aGlzLngucmVkTXVsKHB6MikucmVkSVN1YihwLngucmVkTXVsKHoyKSkuY21wbigwKSAhPT0gMClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8geTEgKiB6Ml4zID09IHkyICogejFeM1xuICB2YXIgejMgPSB6Mi5yZWRNdWwodGhpcy56KTtcbiAgdmFyIHB6MyA9IHB6Mi5yZWRNdWwocC56KTtcbiAgcmV0dXJuIHRoaXMueS5yZWRNdWwocHozKS5yZWRJU3ViKHAueS5yZWRNdWwoejMpKS5jbXBuKDApID09PSAwO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5lcVhUb1AgPSBmdW5jdGlvbiBlcVhUb1AoeCkge1xuICB2YXIgenMgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciByeCA9IHgudG9SZWQodGhpcy5jdXJ2ZS5yZWQpLnJlZE11bCh6cyk7XG4gIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB2YXIgeGMgPSB4LmNsb25lKCk7XG4gIHZhciB0ID0gdGhpcy5jdXJ2ZS5yZWROLnJlZE11bCh6cyk7XG4gIGZvciAoOzspIHtcbiAgICB4Yy5pYWRkKHRoaXMuY3VydmUubik7XG4gICAgaWYgKHhjLmNtcCh0aGlzLmN1cnZlLnApID49IDApXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICByeC5yZWRJQWRkKHQpO1xuICAgIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgSlBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIEpQb2ludCB4OiAnICsgdGhpcy54LnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgejogJyArIHRoaXMuei50b1N0cmluZygxNiwgMikgKyAnPic7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICAvLyBYWFggVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB6ZXJvIGlzIGFsd2F5cyB6ZXJvIGluIHJlZFxuICByZXR1cm4gdGhpcy56LmNtcG4oMCkgPT09IDA7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIEJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gTW9udEN1cnZlKGNvbmYpIHtcbiAgQmFzZS5jYWxsKHRoaXMsICdtb250JywgY29uZik7XG5cbiAgdGhpcy5hID0gbmV3IEJOKGNvbmYuYSwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5iID0gbmV3IEJOKGNvbmYuYiwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5pNCA9IG5ldyBCTig0KS50b1JlZCh0aGlzLnJlZCkucmVkSW52bSgpO1xuICB0aGlzLnR3byA9IG5ldyBCTigyKS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYTI0ID0gdGhpcy5pNC5yZWRNdWwodGhpcy5hLnJlZEFkZCh0aGlzLnR3bykpO1xufVxuaW5oZXJpdHMoTW9udEN1cnZlLCBCYXNlKTtcbm1vZHVsZS5leHBvcnRzID0gTW9udEN1cnZlO1xuXG5Nb250Q3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpIHtcbiAgdmFyIHggPSBwb2ludC5ub3JtYWxpemUoKS54O1xuICB2YXIgeDIgPSB4LnJlZFNxcigpO1xuICB2YXIgcmhzID0geDIucmVkTXVsKHgpLnJlZEFkZCh4Mi5yZWRNdWwodGhpcy5hKSkucmVkQWRkKHgpO1xuICB2YXIgeSA9IHJocy5yZWRTcXJ0KCk7XG5cbiAgcmV0dXJuIHkucmVkU3FyKCkuY21wKHJocykgPT09IDA7XG59O1xuXG5mdW5jdGlvbiBQb2ludChjdXJ2ZSwgeCwgeikge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAncHJvamVjdGl2ZScpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB6ID09PSBudWxsKSB7XG4gICAgdGhpcy54ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy56ID0gdGhpcy5jdXJ2ZS56ZXJvO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IG5ldyBCTih4LCAxNik7XG4gICAgdGhpcy56ID0gbmV3IEJOKHosIDE2KTtcbiAgICBpZiAoIXRoaXMueC5yZWQpXG4gICAgICB0aGlzLnggPSB0aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICghdGhpcy56LnJlZClcbiAgICAgIHRoaXMueiA9IHRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gIH1cbn1cbmluaGVyaXRzKFBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cbk1vbnRDdXJ2ZS5wcm90b3R5cGUuZGVjb2RlUG9pbnQgPSBmdW5jdGlvbiBkZWNvZGVQb2ludChieXRlcywgZW5jKSB7XG4gIHJldHVybiB0aGlzLnBvaW50KHV0aWxzLnRvQXJyYXkoYnl0ZXMsIGVuYyksIDEpO1xufTtcblxuTW9udEN1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KHgsIHopIHtcbiAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLCB4LCB6KTtcbn07XG5cbk1vbnRDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uIHBvaW50RnJvbUpTT04ob2JqKSB7XG4gIHJldHVybiBQb2ludC5mcm9tSlNPTih0aGlzLCBvYmopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnByZWNvbXB1dGUgPSBmdW5jdGlvbiBwcmVjb21wdXRlKCkge1xuICAvLyBOby1vcFxufTtcblxuUG9pbnQucHJvdG90eXBlLl9lbmNvZGUgPSBmdW5jdGlvbiBfZW5jb2RlKCkge1xuICByZXR1cm4gdGhpcy5nZXRYKCkudG9BcnJheSgnYmUnLCB0aGlzLmN1cnZlLnAuYnl0ZUxlbmd0aCgpKTtcbn07XG5cblBvaW50LmZyb21KU09OID0gZnVuY3Rpb24gZnJvbUpTT04oY3VydmUsIG9iaikge1xuICByZXR1cm4gbmV3IFBvaW50KGN1cnZlLCBvYmpbMF0sIG9ialsxXSB8fCBjdXJ2ZS5vbmUpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgUG9pbnQgSW5maW5pdHk+JztcbiAgcmV0dXJuICc8RUMgUG9pbnQgeDogJyArIHRoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgejogJyArIHRoaXMuei5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICAvLyBYWFggVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB6ZXJvIGlzIGFsd2F5cyB6ZXJvIGluIHJlZFxuICByZXR1cm4gdGhpcy56LmNtcG4oMCkgPT09IDA7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24gZGJsKCkge1xuICAvLyBodHRwOi8vaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLW1vbnRnb20teHouaHRtbCNkb3VibGluZy1kYmwtMTk4Ny1tLTNcbiAgLy8gMk0gKyAyUyArIDRBXG5cbiAgLy8gQSA9IFgxICsgWjFcbiAgdmFyIGEgPSB0aGlzLngucmVkQWRkKHRoaXMueik7XG4gIC8vIEFBID0gQV4yXG4gIHZhciBhYSA9IGEucmVkU3FyKCk7XG4gIC8vIEIgPSBYMSAtIFoxXG4gIHZhciBiID0gdGhpcy54LnJlZFN1Yih0aGlzLnopO1xuICAvLyBCQiA9IEJeMlxuICB2YXIgYmIgPSBiLnJlZFNxcigpO1xuICAvLyBDID0gQUEgLSBCQlxuICB2YXIgYyA9IGFhLnJlZFN1YihiYik7XG4gIC8vIFgzID0gQUEgKiBCQlxuICB2YXIgbnggPSBhYS5yZWRNdWwoYmIpO1xuICAvLyBaMyA9IEMgKiAoQkIgKyBBMjQgKiBDKVxuICB2YXIgbnogPSBjLnJlZE11bChiYi5yZWRBZGQodGhpcy5jdXJ2ZS5hMjQucmVkTXVsKGMpKSk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQgb24gTW9udGdvbWVyeSBjdXJ2ZScpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRpZmZBZGQgPSBmdW5jdGlvbiBkaWZmQWRkKHAsIGRpZmYpIHtcbiAgLy8gaHR0cDovL2h5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1tb250Z29tLXh6Lmh0bWwjZGlmZmFkZC1kYWRkLTE5ODctbS0zXG4gIC8vIDRNICsgMlMgKyA2QVxuXG4gIC8vIEEgPSBYMiArIFoyXG4gIHZhciBhID0gdGhpcy54LnJlZEFkZCh0aGlzLnopO1xuICAvLyBCID0gWDIgLSBaMlxuICB2YXIgYiA9IHRoaXMueC5yZWRTdWIodGhpcy56KTtcbiAgLy8gQyA9IFgzICsgWjNcbiAgdmFyIGMgPSBwLngucmVkQWRkKHAueik7XG4gIC8vIEQgPSBYMyAtIFozXG4gIHZhciBkID0gcC54LnJlZFN1YihwLnopO1xuICAvLyBEQSA9IEQgKiBBXG4gIHZhciBkYSA9IGQucmVkTXVsKGEpO1xuICAvLyBDQiA9IEMgKiBCXG4gIHZhciBjYiA9IGMucmVkTXVsKGIpO1xuICAvLyBYNSA9IFoxICogKERBICsgQ0IpXjJcbiAgdmFyIG54ID0gZGlmZi56LnJlZE11bChkYS5yZWRBZGQoY2IpLnJlZFNxcigpKTtcbiAgLy8gWjUgPSBYMSAqIChEQSAtIENCKV4yXG4gIHZhciBueiA9IGRpZmYueC5yZWRNdWwoZGEucmVkSVN1YihjYikucmVkU3FyKCkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrKSB7XG4gIHZhciB0ID0gay5jbG9uZSgpO1xuICB2YXIgYSA9IHRoaXM7IC8vIChOIC8gMikgKiBRICsgUVxuICB2YXIgYiA9IHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7IC8vIChOIC8gMikgKiBRXG4gIHZhciBjID0gdGhpczsgLy8gUVxuXG4gIGZvciAodmFyIGJpdHMgPSBbXTsgdC5jbXBuKDApICE9PSAwOyB0Lml1c2hybigxKSlcbiAgICBiaXRzLnB1c2godC5hbmRsbigxKSk7XG5cbiAgZm9yICh2YXIgaSA9IGJpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoYml0c1tpXSA9PT0gMCkge1xuICAgICAgLy8gTiAqIFEgKyBRID0gKChOIC8gMikgKiBRICsgUSkpICsgKE4gLyAyKSAqIFFcbiAgICAgIGEgPSBhLmRpZmZBZGQoYiwgYyk7XG4gICAgICAvLyBOICogUSA9IDIgKiAoKE4gLyAyKSAqIFEgKyBRKSlcbiAgICAgIGIgPSBiLmRibCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOICogUSA9ICgoTiAvIDIpICogUSArIFEpICsgKChOIC8gMikgKiBRKVxuICAgICAgYiA9IGEuZGlmZkFkZChiLCBjKTtcbiAgICAgIC8vIE4gKiBRICsgUSA9IDIgKiAoKE4gLyAyKSAqIFEgKyBRKVxuICAgICAgYSA9IGEuZGJsKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBiO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uIG11bEFkZCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUnKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5qdW1sQWRkID0gZnVuY3Rpb24ganVtbEFkZCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUnKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLmdldFgoKS5jbXAob3RoZXIuZ2V0WCgpKSA9PT0gMDtcbn07XG5cblBvaW50LnByb3RvdHlwZS5ub3JtYWxpemUgPSBmdW5jdGlvbiBub3JtYWxpemUoKSB7XG4gIHRoaXMueCA9IHRoaXMueC5yZWRNdWwodGhpcy56LnJlZEludm0oKSk7XG4gIHRoaXMueiA9IHRoaXMuY3VydmUub25lO1xuICByZXR1cm4gdGhpcztcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gZ2V0WCgpIHtcbiAgLy8gTm9ybWFsaXplIGNvb3JkaW5hdGVzXG4gIHRoaXMubm9ybWFsaXplKCk7XG5cbiAgcmV0dXJuIHRoaXMueC5mcm9tUmVkKCk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbnZhciBCYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG5cbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIEVkd2FyZHNDdXJ2ZShjb25mKSB7XG4gIC8vIE5PVEU6IEltcG9ydGFudCBhcyB3ZSBhcmUgY3JlYXRpbmcgcG9pbnQgaW4gQmFzZS5jYWxsKClcbiAgdGhpcy50d2lzdGVkID0gKGNvbmYuYSB8IDApICE9PSAxO1xuICB0aGlzLm1PbmVBID0gdGhpcy50d2lzdGVkICYmIChjb25mLmEgfCAwKSA9PT0gLTE7XG4gIHRoaXMuZXh0ZW5kZWQgPSB0aGlzLm1PbmVBO1xuXG4gIEJhc2UuY2FsbCh0aGlzLCAnZWR3YXJkcycsIGNvbmYpO1xuXG4gIHRoaXMuYSA9IG5ldyBCTihjb25mLmEsIDE2KS51bW9kKHRoaXMucmVkLm0pO1xuICB0aGlzLmEgPSB0aGlzLmEudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmMgPSBuZXcgQk4oY29uZi5jLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmMyID0gdGhpcy5jLnJlZFNxcigpO1xuICB0aGlzLmQgPSBuZXcgQk4oY29uZi5kLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmRkID0gdGhpcy5kLnJlZEFkZCh0aGlzLmQpO1xuXG4gIGFzc2VydCghdGhpcy50d2lzdGVkIHx8IHRoaXMuYy5mcm9tUmVkKCkuY21wbigxKSA9PT0gMCk7XG4gIHRoaXMub25lQyA9IChjb25mLmMgfCAwKSA9PT0gMTtcbn1cbmluaGVyaXRzKEVkd2FyZHNDdXJ2ZSwgQmFzZSk7XG5tb2R1bGUuZXhwb3J0cyA9IEVkd2FyZHNDdXJ2ZTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5fbXVsQSA9IGZ1bmN0aW9uIF9tdWxBKG51bSkge1xuICBpZiAodGhpcy5tT25lQSlcbiAgICByZXR1cm4gbnVtLnJlZE5lZygpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuYS5yZWRNdWwobnVtKTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuX211bEMgPSBmdW5jdGlvbiBfbXVsQyhudW0pIHtcbiAgaWYgKHRoaXMub25lQylcbiAgICByZXR1cm4gbnVtO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuYy5yZWRNdWwobnVtKTtcbn07XG5cbi8vIEp1c3QgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTaG9ydCBjdXJ2ZVxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5qcG9pbnQgPSBmdW5jdGlvbiBqcG9pbnQoeCwgeSwgeiwgdCkge1xuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5LCB6LCB0KTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tWCA9IGZ1bmN0aW9uIHBvaW50RnJvbVgoeCwgb2RkKSB7XG4gIHggPSBuZXcgQk4oeCwgMTYpO1xuICBpZiAoIXgucmVkKVxuICAgIHggPSB4LnRvUmVkKHRoaXMucmVkKTtcblxuICB2YXIgeDIgPSB4LnJlZFNxcigpO1xuICB2YXIgcmhzID0gdGhpcy5jMi5yZWRTdWIodGhpcy5hLnJlZE11bCh4MikpO1xuICB2YXIgbGhzID0gdGhpcy5vbmUucmVkU3ViKHRoaXMuYzIucmVkTXVsKHRoaXMuZCkucmVkTXVsKHgyKSk7XG5cbiAgdmFyIHkyID0gcmhzLnJlZE11bChsaHMucmVkSW52bSgpKTtcbiAgdmFyIHkgPSB5Mi5yZWRTcXJ0KCk7XG4gIGlmICh5LnJlZFNxcigpLnJlZFN1Yih5MikuY21wKHRoaXMuemVybykgIT09IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBvaW50Jyk7XG5cbiAgdmFyIGlzT2RkID0geS5mcm9tUmVkKCkuaXNPZGQoKTtcbiAgaWYgKG9kZCAmJiAhaXNPZGQgfHwgIW9kZCAmJiBpc09kZClcbiAgICB5ID0geS5yZWROZWcoKTtcblxuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5KTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tWSA9IGZ1bmN0aW9uIHBvaW50RnJvbVkoeSwgb2RkKSB7XG4gIHkgPSBuZXcgQk4oeSwgMTYpO1xuICBpZiAoIXkucmVkKVxuICAgIHkgPSB5LnRvUmVkKHRoaXMucmVkKTtcblxuICAvLyB4XjIgPSAoeV4yIC0gY14yKSAvIChjXjIgZCB5XjIgLSBhKVxuICB2YXIgeTIgPSB5LnJlZFNxcigpO1xuICB2YXIgbGhzID0geTIucmVkU3ViKHRoaXMuYzIpO1xuICB2YXIgcmhzID0geTIucmVkTXVsKHRoaXMuZCkucmVkTXVsKHRoaXMuYzIpLnJlZFN1Yih0aGlzLmEpO1xuICB2YXIgeDIgPSBsaHMucmVkTXVsKHJocy5yZWRJbnZtKCkpO1xuXG4gIGlmICh4Mi5jbXAodGhpcy56ZXJvKSA9PT0gMCkge1xuICAgIGlmIChvZGQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcG9pbnQnKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5wb2ludCh0aGlzLnplcm8sIHkpO1xuICB9XG5cbiAgdmFyIHggPSB4Mi5yZWRTcXJ0KCk7XG4gIGlmICh4LnJlZFNxcigpLnJlZFN1Yih4MikuY21wKHRoaXMuemVybykgIT09IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBvaW50Jyk7XG5cbiAgaWYgKHguZnJvbVJlZCgpLmlzT2RkKCkgIT09IG9kZClcbiAgICB4ID0geC5yZWROZWcoKTtcblxuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5KTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZShwb2ludCkge1xuICBpZiAocG9pbnQuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0cnVlO1xuXG4gIC8vIEN1cnZlOiBBICogWF4yICsgWV4yID0gQ14yICogKDEgKyBEICogWF4yICogWV4yKVxuICBwb2ludC5ub3JtYWxpemUoKTtcblxuICB2YXIgeDIgPSBwb2ludC54LnJlZFNxcigpO1xuICB2YXIgeTIgPSBwb2ludC55LnJlZFNxcigpO1xuICB2YXIgbGhzID0geDIucmVkTXVsKHRoaXMuYSkucmVkQWRkKHkyKTtcbiAgdmFyIHJocyA9IHRoaXMuYzIucmVkTXVsKHRoaXMub25lLnJlZEFkZCh0aGlzLmQucmVkTXVsKHgyKS5yZWRNdWwoeTIpKSk7XG5cbiAgcmV0dXJuIGxocy5jbXAocmhzKSA9PT0gMDtcbn07XG5cbmZ1bmN0aW9uIFBvaW50KGN1cnZlLCB4LCB5LCB6LCB0KSB7XG4gIEJhc2UuQmFzZVBvaW50LmNhbGwodGhpcywgY3VydmUsICdwcm9qZWN0aXZlJyk7XG4gIGlmICh4ID09PSBudWxsICYmIHkgPT09IG51bGwgJiYgeiA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHRoaXMuY3VydmUuemVybztcbiAgICB0aGlzLnkgPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnogPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnQgPSB0aGlzLmN1cnZlLnplcm87XG4gICAgdGhpcy56T25lID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSBuZXcgQk4oeCwgMTYpO1xuICAgIHRoaXMueSA9IG5ldyBCTih5LCAxNik7XG4gICAgdGhpcy56ID0geiA/IG5ldyBCTih6LCAxNikgOiB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnQgPSB0ICYmIG5ldyBCTih0LCAxNik7XG4gICAgaWYgKCF0aGlzLngucmVkKVxuICAgICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMueS5yZWQpXG4gICAgICB0aGlzLnkgPSB0aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICghdGhpcy56LnJlZClcbiAgICAgIHRoaXMueiA9IHRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKHRoaXMudCAmJiAhdGhpcy50LnJlZClcbiAgICAgIHRoaXMudCA9IHRoaXMudC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgdGhpcy56T25lID0gdGhpcy56ID09PSB0aGlzLmN1cnZlLm9uZTtcblxuICAgIC8vIFVzZSBleHRlbmRlZCBjb29yZGluYXRlc1xuICAgIGlmICh0aGlzLmN1cnZlLmV4dGVuZGVkICYmICF0aGlzLnQpIHtcbiAgICAgIHRoaXMudCA9IHRoaXMueC5yZWRNdWwodGhpcy55KTtcbiAgICAgIGlmICghdGhpcy56T25lKVxuICAgICAgICB0aGlzLnQgPSB0aGlzLnQucmVkTXVsKHRoaXMuei5yZWRJbnZtKCkpO1xuICAgIH1cbiAgfVxufVxuaW5oZXJpdHMoUG9pbnQsIEJhc2UuQmFzZVBvaW50KTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5wb2ludEZyb21KU09OID0gZnVuY3Rpb24gcG9pbnRGcm9tSlNPTihvYmopIHtcbiAgcmV0dXJuIFBvaW50LmZyb21KU09OKHRoaXMsIG9iaik7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24gcG9pbnQoeCwgeSwgeiwgdCkge1xuICByZXR1cm4gbmV3IFBvaW50KHRoaXMsIHgsIHksIHosIHQpO1xufTtcblxuUG9pbnQuZnJvbUpTT04gPSBmdW5jdGlvbiBmcm9tSlNPTihjdXJ2ZSwgb2JqKSB7XG4gIHJldHVybiBuZXcgUG9pbnQoY3VydmUsIG9ialswXSwgb2JqWzFdLCBvYmpbMl0pO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgUG9pbnQgSW5maW5pdHk+JztcbiAgcmV0dXJuICc8RUMgUG9pbnQgeDogJyArIHRoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgeTogJyArIHRoaXMueS5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgejogJyArIHRoaXMuei5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICAvLyBYWFggVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB6ZXJvIGlzIGFsd2F5cyB6ZXJvIGluIHJlZFxuICByZXR1cm4gdGhpcy54LmNtcG4oMCkgPT09IDAgJiZcbiAgICAodGhpcy55LmNtcCh0aGlzLnopID09PSAwIHx8XG4gICAgKHRoaXMuek9uZSAmJiB0aGlzLnkuY21wKHRoaXMuY3VydmUuYykgPT09IDApKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZXh0RGJsID0gZnVuY3Rpb24gX2V4dERibCgpIHtcbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQtMS5odG1sXG4gIC8vICAgICAjZG91YmxpbmctZGJsLTIwMDgtaHdjZFxuICAvLyA0TSArIDRTXG5cbiAgLy8gQSA9IFgxXjJcbiAgdmFyIGEgPSB0aGlzLngucmVkU3FyKCk7XG4gIC8vIEIgPSBZMV4yXG4gIHZhciBiID0gdGhpcy55LnJlZFNxcigpO1xuICAvLyBDID0gMiAqIFoxXjJcbiAgdmFyIGMgPSB0aGlzLnoucmVkU3FyKCk7XG4gIGMgPSBjLnJlZElBZGQoYyk7XG4gIC8vIEQgPSBhICogQVxuICB2YXIgZCA9IHRoaXMuY3VydmUuX211bEEoYSk7XG4gIC8vIEUgPSAoWDEgKyBZMSleMiAtIEEgLSBCXG4gIHZhciBlID0gdGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZFNxcigpLnJlZElTdWIoYSkucmVkSVN1YihiKTtcbiAgLy8gRyA9IEQgKyBCXG4gIHZhciBnID0gZC5yZWRBZGQoYik7XG4gIC8vIEYgPSBHIC0gQ1xuICB2YXIgZiA9IGcucmVkU3ViKGMpO1xuICAvLyBIID0gRCAtIEJcbiAgdmFyIGggPSBkLnJlZFN1YihiKTtcbiAgLy8gWDMgPSBFICogRlxuICB2YXIgbnggPSBlLnJlZE11bChmKTtcbiAgLy8gWTMgPSBHICogSFxuICB2YXIgbnkgPSBnLnJlZE11bChoKTtcbiAgLy8gVDMgPSBFICogSFxuICB2YXIgbnQgPSBlLnJlZE11bChoKTtcbiAgLy8gWjMgPSBGICogR1xuICB2YXIgbnogPSBmLnJlZE11bChnKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55LCBueiwgbnQpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9wcm9qRGJsID0gZnVuY3Rpb24gX3Byb2pEYmwoKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLXByb2plY3RpdmUuaHRtbFxuICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA4LWJiamxwXG4gIC8vICAgICAjZG91YmxpbmctZGJsLTIwMDctYmxcbiAgLy8gYW5kIG90aGVyc1xuICAvLyBHZW5lcmFsbHkgM00gKyA0UyBvciAyTSArIDRTXG5cbiAgLy8gQiA9IChYMSArIFkxKV4yXG4gIHZhciBiID0gdGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZFNxcigpO1xuICAvLyBDID0gWDFeMlxuICB2YXIgYyA9IHRoaXMueC5yZWRTcXIoKTtcbiAgLy8gRCA9IFkxXjJcbiAgdmFyIGQgPSB0aGlzLnkucmVkU3FyKCk7XG5cbiAgdmFyIG54O1xuICB2YXIgbnk7XG4gIHZhciBuejtcbiAgdmFyIGU7XG4gIHZhciBoO1xuICB2YXIgajtcbiAgaWYgKHRoaXMuY3VydmUudHdpc3RlZCkge1xuICAgIC8vIEUgPSBhICogQ1xuICAgIGUgPSB0aGlzLmN1cnZlLl9tdWxBKGMpO1xuICAgIC8vIEYgPSBFICsgRFxuICAgIHZhciBmID0gZS5yZWRBZGQoZCk7XG4gICAgaWYgKHRoaXMuek9uZSkge1xuICAgICAgLy8gWDMgPSAoQiAtIEMgLSBEKSAqIChGIC0gMilcbiAgICAgIG54ID0gYi5yZWRTdWIoYykucmVkU3ViKGQpLnJlZE11bChmLnJlZFN1Yih0aGlzLmN1cnZlLnR3bykpO1xuICAgICAgLy8gWTMgPSBGICogKEUgLSBEKVxuICAgICAgbnkgPSBmLnJlZE11bChlLnJlZFN1YihkKSk7XG4gICAgICAvLyBaMyA9IEZeMiAtIDIgKiBGXG4gICAgICBueiA9IGYucmVkU3FyKCkucmVkU3ViKGYpLnJlZFN1YihmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSCA9IFoxXjJcbiAgICAgIGggPSB0aGlzLnoucmVkU3FyKCk7XG4gICAgICAvLyBKID0gRiAtIDIgKiBIXG4gICAgICBqID0gZi5yZWRTdWIoaCkucmVkSVN1YihoKTtcbiAgICAgIC8vIFgzID0gKEItQy1EKSpKXG4gICAgICBueCA9IGIucmVkU3ViKGMpLnJlZElTdWIoZCkucmVkTXVsKGopO1xuICAgICAgLy8gWTMgPSBGICogKEUgLSBEKVxuICAgICAgbnkgPSBmLnJlZE11bChlLnJlZFN1YihkKSk7XG4gICAgICAvLyBaMyA9IEYgKiBKXG4gICAgICBueiA9IGYucmVkTXVsKGopO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBFID0gQyArIERcbiAgICBlID0gYy5yZWRBZGQoZCk7XG4gICAgLy8gSCA9IChjICogWjEpXjJcbiAgICBoID0gdGhpcy5jdXJ2ZS5fbXVsQyh0aGlzLnopLnJlZFNxcigpO1xuICAgIC8vIEogPSBFIC0gMiAqIEhcbiAgICBqID0gZS5yZWRTdWIoaCkucmVkU3ViKGgpO1xuICAgIC8vIFgzID0gYyAqIChCIC0gRSkgKiBKXG4gICAgbnggPSB0aGlzLmN1cnZlLl9tdWxDKGIucmVkSVN1YihlKSkucmVkTXVsKGopO1xuICAgIC8vIFkzID0gYyAqIEUgKiAoQyAtIEQpXG4gICAgbnkgPSB0aGlzLmN1cnZlLl9tdWxDKGUpLnJlZE11bChjLnJlZElTdWIoZCkpO1xuICAgIC8vIFozID0gRSAqIEpcbiAgICBueiA9IGUucmVkTXVsKGopO1xuICB9XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIERvdWJsZSBpbiBleHRlbmRlZCBjb29yZGluYXRlc1xuICBpZiAodGhpcy5jdXJ2ZS5leHRlbmRlZClcbiAgICByZXR1cm4gdGhpcy5fZXh0RGJsKCk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5fcHJvakRibCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9leHRBZGQgPSBmdW5jdGlvbiBfZXh0QWRkKHApIHtcbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQtMS5odG1sXG4gIC8vICAgICAjYWRkaXRpb24tYWRkLTIwMDgtaHdjZC0zXG4gIC8vIDhNXG5cbiAgLy8gQSA9IChZMSAtIFgxKSAqIChZMiAtIFgyKVxuICB2YXIgYSA9IHRoaXMueS5yZWRTdWIodGhpcy54KS5yZWRNdWwocC55LnJlZFN1YihwLngpKTtcbiAgLy8gQiA9IChZMSArIFgxKSAqIChZMiArIFgyKVxuICB2YXIgYiA9IHRoaXMueS5yZWRBZGQodGhpcy54KS5yZWRNdWwocC55LnJlZEFkZChwLngpKTtcbiAgLy8gQyA9IFQxICogayAqIFQyXG4gIHZhciBjID0gdGhpcy50LnJlZE11bCh0aGlzLmN1cnZlLmRkKS5yZWRNdWwocC50KTtcbiAgLy8gRCA9IFoxICogMiAqIFoyXG4gIHZhciBkID0gdGhpcy56LnJlZE11bChwLnoucmVkQWRkKHAueikpO1xuICAvLyBFID0gQiAtIEFcbiAgdmFyIGUgPSBiLnJlZFN1YihhKTtcbiAgLy8gRiA9IEQgLSBDXG4gIHZhciBmID0gZC5yZWRTdWIoYyk7XG4gIC8vIEcgPSBEICsgQ1xuICB2YXIgZyA9IGQucmVkQWRkKGMpO1xuICAvLyBIID0gQiArIEFcbiAgdmFyIGggPSBiLnJlZEFkZChhKTtcbiAgLy8gWDMgPSBFICogRlxuICB2YXIgbnggPSBlLnJlZE11bChmKTtcbiAgLy8gWTMgPSBHICogSFxuICB2YXIgbnkgPSBnLnJlZE11bChoKTtcbiAgLy8gVDMgPSBFICogSFxuICB2YXIgbnQgPSBlLnJlZE11bChoKTtcbiAgLy8gWjMgPSBGICogR1xuICB2YXIgbnogPSBmLnJlZE11bChnKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55LCBueiwgbnQpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9wcm9qQWRkID0gZnVuY3Rpb24gX3Byb2pBZGQocCkge1xuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tdHdpc3RlZC1wcm9qZWN0aXZlLmh0bWxcbiAgLy8gICAgICNhZGRpdGlvbi1hZGQtMjAwOC1iYmpscFxuICAvLyAgICAgI2FkZGl0aW9uLWFkZC0yMDA3LWJsXG4gIC8vIDEwTSArIDFTXG5cbiAgLy8gQSA9IFoxICogWjJcbiAgdmFyIGEgPSB0aGlzLnoucmVkTXVsKHAueik7XG4gIC8vIEIgPSBBXjJcbiAgdmFyIGIgPSBhLnJlZFNxcigpO1xuICAvLyBDID0gWDEgKiBYMlxuICB2YXIgYyA9IHRoaXMueC5yZWRNdWwocC54KTtcbiAgLy8gRCA9IFkxICogWTJcbiAgdmFyIGQgPSB0aGlzLnkucmVkTXVsKHAueSk7XG4gIC8vIEUgPSBkICogQyAqIERcbiAgdmFyIGUgPSB0aGlzLmN1cnZlLmQucmVkTXVsKGMpLnJlZE11bChkKTtcbiAgLy8gRiA9IEIgLSBFXG4gIHZhciBmID0gYi5yZWRTdWIoZSk7XG4gIC8vIEcgPSBCICsgRVxuICB2YXIgZyA9IGIucmVkQWRkKGUpO1xuICAvLyBYMyA9IEEgKiBGICogKChYMSArIFkxKSAqIChYMiArIFkyKSAtIEMgLSBEKVxuICB2YXIgdG1wID0gdGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZE11bChwLngucmVkQWRkKHAueSkpLnJlZElTdWIoYykucmVkSVN1YihkKTtcbiAgdmFyIG54ID0gYS5yZWRNdWwoZikucmVkTXVsKHRtcCk7XG4gIHZhciBueTtcbiAgdmFyIG56O1xuICBpZiAodGhpcy5jdXJ2ZS50d2lzdGVkKSB7XG4gICAgLy8gWTMgPSBBICogRyAqIChEIC0gYSAqIEMpXG4gICAgbnkgPSBhLnJlZE11bChnKS5yZWRNdWwoZC5yZWRTdWIodGhpcy5jdXJ2ZS5fbXVsQShjKSkpO1xuICAgIC8vIFozID0gRiAqIEdcbiAgICBueiA9IGYucmVkTXVsKGcpO1xuICB9IGVsc2Uge1xuICAgIC8vIFkzID0gQSAqIEcgKiAoRCAtIEMpXG4gICAgbnkgPSBhLnJlZE11bChnKS5yZWRNdWwoZC5yZWRTdWIoYykpO1xuICAgIC8vIFozID0gYyAqIEYgKiBHXG4gICAgbnogPSB0aGlzLmN1cnZlLl9tdWxDKGYpLnJlZE11bChnKTtcbiAgfVxuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnksIG56KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQocCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHA7XG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICBpZiAodGhpcy5jdXJ2ZS5leHRlbmRlZClcbiAgICByZXR1cm4gdGhpcy5fZXh0QWRkKHApO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuX3Byb2pBZGQocCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsKGspIHtcbiAgaWYgKHRoaXMuX2hhc0RvdWJsZXMoaykpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2ZpeGVkTmFmTXVsKHRoaXMsIGspO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWwodGhpcywgayk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsQWRkID0gZnVuY3Rpb24gbXVsQWRkKGsxLCBwLCBrMikge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLCBbIHRoaXMsIHAgXSwgWyBrMSwgazIgXSwgMiwgZmFsc2UpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmptdWxBZGQgPSBmdW5jdGlvbiBqbXVsQWRkKGsxLCBwLCBrMikge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLCBbIHRoaXMsIHAgXSwgWyBrMSwgazIgXSwgMiwgdHJ1ZSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKCkge1xuICBpZiAodGhpcy56T25lKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIE5vcm1hbGl6ZSBjb29yZGluYXRlc1xuICB2YXIgemkgPSB0aGlzLnoucmVkSW52bSgpO1xuICB0aGlzLnggPSB0aGlzLngucmVkTXVsKHppKTtcbiAgdGhpcy55ID0gdGhpcy55LnJlZE11bCh6aSk7XG4gIGlmICh0aGlzLnQpXG4gICAgdGhpcy50ID0gdGhpcy50LnJlZE11bCh6aSk7XG4gIHRoaXMueiA9IHRoaXMuY3VydmUub25lO1xuICB0aGlzLnpPbmUgPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn07XG5cblBvaW50LnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcoKSB7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KHRoaXMueC5yZWROZWcoKSxcbiAgICB0aGlzLnksXG4gICAgdGhpcy56LFxuICAgIHRoaXMudCAmJiB0aGlzLnQucmVkTmVnKCkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbiBnZXRYKCkge1xuICB0aGlzLm5vcm1hbGl6ZSgpO1xuICByZXR1cm4gdGhpcy54LmZyb21SZWQoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRZID0gZnVuY3Rpb24gZ2V0WSgpIHtcbiAgdGhpcy5ub3JtYWxpemUoKTtcbiAgcmV0dXJuIHRoaXMueS5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShvdGhlcikge1xuICByZXR1cm4gdGhpcyA9PT0gb3RoZXIgfHxcbiAgICAgICAgIHRoaXMuZ2V0WCgpLmNtcChvdGhlci5nZXRYKCkpID09PSAwICYmXG4gICAgICAgICB0aGlzLmdldFkoKS5jbXAob3RoZXIuZ2V0WSgpKSA9PT0gMDtcbn07XG5cblBvaW50LnByb3RvdHlwZS5lcVhUb1AgPSBmdW5jdGlvbiBlcVhUb1AoeCkge1xuICB2YXIgcnggPSB4LnRvUmVkKHRoaXMuY3VydmUucmVkKS5yZWRNdWwodGhpcy56KTtcbiAgaWYgKHRoaXMueC5jbXAocngpID09PSAwKVxuICAgIHJldHVybiB0cnVlO1xuXG4gIHZhciB4YyA9IHguY2xvbmUoKTtcbiAgdmFyIHQgPSB0aGlzLmN1cnZlLnJlZE4ucmVkTXVsKHRoaXMueik7XG4gIGZvciAoOzspIHtcbiAgICB4Yy5pYWRkKHRoaXMuY3VydmUubik7XG4gICAgaWYgKHhjLmNtcCh0aGlzLmN1cnZlLnApID49IDApXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICByeC5yZWRJQWRkKHQpO1xuICAgIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG4vLyBDb21wYXRpYmlsaXR5IHdpdGggQmFzZUN1cnZlXG5Qb2ludC5wcm90b3R5cGUudG9QID0gUG9pbnQucHJvdG90eXBlLm5vcm1hbGl6ZTtcblBvaW50LnByb3RvdHlwZS5taXhlZEFkZCA9IFBvaW50LnByb3RvdHlwZS5hZGQ7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGN1cnZlID0gZXhwb3J0cztcblxuY3VydmUuYmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xuY3VydmUuc2hvcnQgPSByZXF1aXJlKCcuL3Nob3J0Jyk7XG5jdXJ2ZS5tb250ID0gcmVxdWlyZSgnLi9tb250Jyk7XG5jdXJ2ZS5lZHdhcmRzID0gcmVxdWlyZSgnLi9lZHdhcmRzJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuaW5oZXJpdHMgPSBpbmhlcml0cztcblxuZnVuY3Rpb24gaXNTdXJyb2dhdGVQYWlyKG1zZywgaSkge1xuICBpZiAoKG1zZy5jaGFyQ29kZUF0KGkpICYgMHhGQzAwKSAhPT0gMHhEODAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChpIDwgMCB8fCBpICsgMSA+PSBtc2cubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAobXNnLmNoYXJDb2RlQXQoaSArIDEpICYgMHhGQzAwKSA9PT0gMHhEQzAwO1xufVxuXG5mdW5jdGlvbiB0b0FycmF5KG1zZywgZW5jKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG1zZykpXG4gICAgcmV0dXJuIG1zZy5zbGljZSgpO1xuICBpZiAoIW1zZylcbiAgICByZXR1cm4gW107XG4gIHZhciByZXMgPSBbXTtcbiAgaWYgKHR5cGVvZiBtc2cgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFlbmMpIHtcbiAgICAgIC8vIEluc3BpcmVkIGJ5IHN0cmluZ1RvVXRmOEJ5dGVBcnJheSgpIGluIGNsb3N1cmUtbGlicmFyeSBieSBHb29nbGVcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1saWJyYXJ5L2Jsb2IvODU5OGQ4NzI0MmFmNTlhYWMyMzMyNzA3NDJjODk4NGUyYjJiZGJlMC9jbG9zdXJlL2dvb2cvY3J5cHQvY3J5cHQuanMjTDExNy1MMTQzXG4gICAgICAvLyBBcGFjaGUgTGljZW5zZSAyLjBcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1saWJyYXJ5L2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAgICAgIHZhciBwID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjID0gbXNnLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjIDwgMTI4KSB7XG4gICAgICAgICAgcmVzW3ArK10gPSBjO1xuICAgICAgICB9IGVsc2UgaWYgKGMgPCAyMDQ4KSB7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyA+PiA2KSB8IDE5MjtcbiAgICAgICAgICByZXNbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xuICAgICAgICB9IGVsc2UgaWYgKGlzU3Vycm9nYXRlUGFpcihtc2csIGkpKSB7XG4gICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgJiAweDAzRkYpIDw8IDEwKSArIChtc2cuY2hhckNvZGVBdCgrK2kpICYgMHgwM0ZGKTtcbiAgICAgICAgICByZXNbcCsrXSA9IChjID4+IDE4KSB8IDI0MDtcbiAgICAgICAgICByZXNbcCsrXSA9ICgoYyA+PiAxMikgJiA2MykgfCAxMjg7XG4gICAgICAgICAgcmVzW3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyAmIDYzKSB8IDEyODtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNbcCsrXSA9IChjID4+IDEyKSB8IDIyNDtcbiAgICAgICAgICByZXNbcCsrXSA9ICgoYyA+PiA2KSAmIDYzKSB8IDEyODtcbiAgICAgICAgICByZXNbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbmMgPT09ICdoZXgnKSB7XG4gICAgICBtc2cgPSBtc2cucmVwbGFjZSgvW15hLXowLTldKy9pZywgJycpO1xuICAgICAgaWYgKG1zZy5sZW5ndGggJSAyICE9PSAwKVxuICAgICAgICBtc2cgPSAnMCcgKyBtc2c7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICByZXMucHVzaChwYXJzZUludChtc2dbaV0gKyBtc2dbaSArIDFdLCAxNikpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgICAgcmVzW2ldID0gbXNnW2ldIHwgMDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy50b0FycmF5ID0gdG9BcnJheTtcblxuZnVuY3Rpb24gdG9IZXgobXNnKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgcmVzICs9IHplcm8yKG1zZ1tpXS50b1N0cmluZygxNikpO1xuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy50b0hleCA9IHRvSGV4O1xuXG5mdW5jdGlvbiBodG9ubCh3KSB7XG4gIHZhciByZXMgPSAodyA+Pj4gMjQpIHxcbiAgICAgICAgICAgICgodyA+Pj4gOCkgJiAweGZmMDApIHxcbiAgICAgICAgICAgICgodyA8PCA4KSAmIDB4ZmYwMDAwKSB8XG4gICAgICAgICAgICAoKHcgJiAweGZmKSA8PCAyNCk7XG4gIHJldHVybiByZXMgPj4+IDA7XG59XG5leHBvcnRzLmh0b25sID0gaHRvbmw7XG5cbmZ1bmN0aW9uIHRvSGV4MzIobXNnLCBlbmRpYW4pIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB3ID0gbXNnW2ldO1xuICAgIGlmIChlbmRpYW4gPT09ICdsaXR0bGUnKVxuICAgICAgdyA9IGh0b25sKHcpO1xuICAgIHJlcyArPSB6ZXJvOCh3LnRvU3RyaW5nKDE2KSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudG9IZXgzMiA9IHRvSGV4MzI7XG5cbmZ1bmN0aW9uIHplcm8yKHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG5leHBvcnRzLnplcm8yID0gemVybzI7XG5cbmZ1bmN0aW9uIHplcm84KHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSA3KVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNilcbiAgICByZXR1cm4gJzAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA1KVxuICAgIHJldHVybiAnMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA0KVxuICAgIHJldHVybiAnMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMylcbiAgICByZXR1cm4gJzAwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAyKVxuICAgIHJldHVybiAnMDAwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMDAwMDAwMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG5leHBvcnRzLnplcm84ID0gemVybzg7XG5cbmZ1bmN0aW9uIGpvaW4zMihtc2csIHN0YXJ0LCBlbmQsIGVuZGlhbikge1xuICB2YXIgbGVuID0gZW5kIC0gc3RhcnQ7XG4gIGFzc2VydChsZW4gJSA0ID09PSAwKTtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheShsZW4gLyA0KTtcbiAgZm9yICh2YXIgaSA9IDAsIGsgPSBzdGFydDsgaSA8IHJlcy5sZW5ndGg7IGkrKywgayArPSA0KSB7XG4gICAgdmFyIHc7XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2JpZycpXG4gICAgICB3ID0gKG1zZ1trXSA8PCAyNCkgfCAobXNnW2sgKyAxXSA8PCAxNikgfCAobXNnW2sgKyAyXSA8PCA4KSB8IG1zZ1trICsgM107XG4gICAgZWxzZVxuICAgICAgdyA9IChtc2dbayArIDNdIDw8IDI0KSB8IChtc2dbayArIDJdIDw8IDE2KSB8IChtc2dbayArIDFdIDw8IDgpIHwgbXNnW2tdO1xuICAgIHJlc1tpXSA9IHcgPj4+IDA7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMuam9pbjMyID0gam9pbjMyO1xuXG5mdW5jdGlvbiBzcGxpdDMyKG1zZywgZW5kaWFuKSB7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkobXNnLmxlbmd0aCAqIDQpO1xuICBmb3IgKHZhciBpID0gMCwgayA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyssIGsgKz0gNCkge1xuICAgIHZhciBtID0gbXNnW2ldO1xuICAgIGlmIChlbmRpYW4gPT09ICdiaWcnKSB7XG4gICAgICByZXNba10gPSBtID4+PiAyNDtcbiAgICAgIHJlc1trICsgMV0gPSAobSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgIHJlc1trICsgMl0gPSAobSA+Pj4gOCkgJiAweGZmO1xuICAgICAgcmVzW2sgKyAzXSA9IG0gJiAweGZmO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNbayArIDNdID0gbSA+Pj4gMjQ7XG4gICAgICByZXNbayArIDJdID0gKG0gPj4+IDE2KSAmIDB4ZmY7XG4gICAgICByZXNbayArIDFdID0gKG0gPj4+IDgpICYgMHhmZjtcbiAgICAgIHJlc1trXSA9IG0gJiAweGZmO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy5zcGxpdDMyID0gc3BsaXQzMjtcblxuZnVuY3Rpb24gcm90cjMyKHcsIGIpIHtcbiAgcmV0dXJuICh3ID4+PiBiKSB8ICh3IDw8ICgzMiAtIGIpKTtcbn1cbmV4cG9ydHMucm90cjMyID0gcm90cjMyO1xuXG5mdW5jdGlvbiByb3RsMzIodywgYikge1xuICByZXR1cm4gKHcgPDwgYikgfCAodyA+Pj4gKDMyIC0gYikpO1xufVxuZXhwb3J0cy5yb3RsMzIgPSByb3RsMzI7XG5cbmZ1bmN0aW9uIHN1bTMyKGEsIGIpIHtcbiAgcmV0dXJuIChhICsgYikgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyID0gc3VtMzI7XG5cbmZ1bmN0aW9uIHN1bTMyXzMoYSwgYiwgYykge1xuICByZXR1cm4gKGEgKyBiICsgYykgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyXzMgPSBzdW0zMl8zO1xuXG5mdW5jdGlvbiBzdW0zMl80KGEsIGIsIGMsIGQpIHtcbiAgcmV0dXJuIChhICsgYiArIGMgKyBkKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzJfNCA9IHN1bTMyXzQ7XG5cbmZ1bmN0aW9uIHN1bTMyXzUoYSwgYiwgYywgZCwgZSkge1xuICByZXR1cm4gKGEgKyBiICsgYyArIGQgKyBlKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzJfNSA9IHN1bTMyXzU7XG5cbmZ1bmN0aW9uIHN1bTY0KGJ1ZiwgcG9zLCBhaCwgYWwpIHtcbiAgdmFyIGJoID0gYnVmW3Bvc107XG4gIHZhciBibCA9IGJ1Zltwb3MgKyAxXTtcblxuICB2YXIgbG8gPSAoYWwgKyBibCkgPj4+IDA7XG4gIHZhciBoaSA9IChsbyA8IGFsID8gMSA6IDApICsgYWggKyBiaDtcbiAgYnVmW3Bvc10gPSBoaSA+Pj4gMDtcbiAgYnVmW3BvcyArIDFdID0gbG87XG59XG5leHBvcnRzLnN1bTY0ID0gc3VtNjQ7XG5cbmZ1bmN0aW9uIHN1bTY0X2hpKGFoLCBhbCwgYmgsIGJsKSB7XG4gIHZhciBsbyA9IChhbCArIGJsKSA+Pj4gMDtcbiAgdmFyIGhpID0gKGxvIDwgYWwgPyAxIDogMCkgKyBhaCArIGJoO1xuICByZXR1cm4gaGkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0X2hpID0gc3VtNjRfaGk7XG5cbmZ1bmN0aW9uIHN1bTY0X2xvKGFoLCBhbCwgYmgsIGJsKSB7XG4gIHZhciBsbyA9IGFsICsgYmw7XG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfbG8gPSBzdW02NF9sbztcblxuZnVuY3Rpb24gc3VtNjRfNF9oaShhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgdmFyIGxvID0gYWw7XG4gIGxvID0gKGxvICsgYmwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGFsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgY2wpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGNsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZGwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGRsID8gMSA6IDA7XG5cbiAgdmFyIGhpID0gYWggKyBiaCArIGNoICsgZGggKyBjYXJyeTtcbiAgcmV0dXJuIGhpID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF80X2hpID0gc3VtNjRfNF9oaTtcblxuZnVuY3Rpb24gc3VtNjRfNF9sbyhhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwpIHtcbiAgdmFyIGxvID0gYWwgKyBibCArIGNsICsgZGw7XG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfNF9sbyA9IHN1bTY0XzRfbG87XG5cbmZ1bmN0aW9uIHN1bTY0XzVfaGkoYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsLCBlaCwgZWwpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgdmFyIGxvID0gYWw7XG4gIGxvID0gKGxvICsgYmwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGFsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgY2wpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGNsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZGwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGRsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZWwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGVsID8gMSA6IDA7XG5cbiAgdmFyIGhpID0gYWggKyBiaCArIGNoICsgZGggKyBlaCArIGNhcnJ5O1xuICByZXR1cm4gaGkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0XzVfaGkgPSBzdW02NF81X2hpO1xuXG5mdW5jdGlvbiBzdW02NF81X2xvKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCwgZWgsIGVsKSB7XG4gIHZhciBsbyA9IGFsICsgYmwgKyBjbCArIGRsICsgZWw7XG5cbiAgcmV0dXJuIGxvID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF81X2xvID0gc3VtNjRfNV9sbztcblxuZnVuY3Rpb24gcm90cjY0X2hpKGFoLCBhbCwgbnVtKSB7XG4gIHZhciByID0gKGFsIDw8ICgzMiAtIG51bSkpIHwgKGFoID4+PiBudW0pO1xuICByZXR1cm4gciA+Pj4gMDtcbn1cbmV4cG9ydHMucm90cjY0X2hpID0gcm90cjY0X2hpO1xuXG5mdW5jdGlvbiByb3RyNjRfbG8oYWgsIGFsLCBudW0pIHtcbiAgdmFyIHIgPSAoYWggPDwgKDMyIC0gbnVtKSkgfCAoYWwgPj4+IG51bSk7XG4gIHJldHVybiByID4+PiAwO1xufVxuZXhwb3J0cy5yb3RyNjRfbG8gPSByb3RyNjRfbG87XG5cbmZ1bmN0aW9uIHNocjY0X2hpKGFoLCBhbCwgbnVtKSB7XG4gIHJldHVybiBhaCA+Pj4gbnVtO1xufVxuZXhwb3J0cy5zaHI2NF9oaSA9IHNocjY0X2hpO1xuXG5mdW5jdGlvbiBzaHI2NF9sbyhhaCwgYWwsIG51bSkge1xuICB2YXIgciA9IChhaCA8PCAoMzIgLSBudW0pKSB8IChhbCA+Pj4gbnVtKTtcbiAgcmV0dXJuIHIgPj4+IDA7XG59XG5leHBvcnRzLnNocjY0X2xvID0gc2hyNjRfbG87XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuZnVuY3Rpb24gQmxvY2tIYXNoKCkge1xuICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuICB0aGlzLnBlbmRpbmdUb3RhbCA9IDA7XG4gIHRoaXMuYmxvY2tTaXplID0gdGhpcy5jb25zdHJ1Y3Rvci5ibG9ja1NpemU7XG4gIHRoaXMub3V0U2l6ZSA9IHRoaXMuY29uc3RydWN0b3Iub3V0U2l6ZTtcbiAgdGhpcy5obWFjU3RyZW5ndGggPSB0aGlzLmNvbnN0cnVjdG9yLmhtYWNTdHJlbmd0aDtcbiAgdGhpcy5wYWRMZW5ndGggPSB0aGlzLmNvbnN0cnVjdG9yLnBhZExlbmd0aCAvIDg7XG4gIHRoaXMuZW5kaWFuID0gJ2JpZyc7XG5cbiAgdGhpcy5fZGVsdGE4ID0gdGhpcy5ibG9ja1NpemUgLyA4O1xuICB0aGlzLl9kZWx0YTMyID0gdGhpcy5ibG9ja1NpemUgLyAzMjtcbn1cbmV4cG9ydHMuQmxvY2tIYXNoID0gQmxvY2tIYXNoO1xuXG5CbG9ja0hhc2gucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIGVuYykge1xuICAvLyBDb252ZXJ0IG1lc3NhZ2UgdG8gYXJyYXksIHBhZCBpdCwgYW5kIGpvaW4gaW50byAzMmJpdCBibG9ja3NcbiAgbXNnID0gdXRpbHMudG9BcnJheShtc2csIGVuYyk7XG4gIGlmICghdGhpcy5wZW5kaW5nKVxuICAgIHRoaXMucGVuZGluZyA9IG1zZztcbiAgZWxzZVxuICAgIHRoaXMucGVuZGluZyA9IHRoaXMucGVuZGluZy5jb25jYXQobXNnKTtcbiAgdGhpcy5wZW5kaW5nVG90YWwgKz0gbXNnLmxlbmd0aDtcblxuICAvLyBFbm91Z2ggZGF0YSwgdHJ5IHVwZGF0aW5nXG4gIGlmICh0aGlzLnBlbmRpbmcubGVuZ3RoID49IHRoaXMuX2RlbHRhOCkge1xuICAgIG1zZyA9IHRoaXMucGVuZGluZztcblxuICAgIC8vIFByb2Nlc3MgcGVuZGluZyBkYXRhIGluIGJsb2Nrc1xuICAgIHZhciByID0gbXNnLmxlbmd0aCAlIHRoaXMuX2RlbHRhODtcbiAgICB0aGlzLnBlbmRpbmcgPSBtc2cuc2xpY2UobXNnLmxlbmd0aCAtIHIsIG1zZy5sZW5ndGgpO1xuICAgIGlmICh0aGlzLnBlbmRpbmcubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcblxuICAgIG1zZyA9IHV0aWxzLmpvaW4zMihtc2csIDAsIG1zZy5sZW5ndGggLSByLCB0aGlzLmVuZGlhbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpICs9IHRoaXMuX2RlbHRhMzIpXG4gICAgICB0aGlzLl91cGRhdGUobXNnLCBpLCBpICsgdGhpcy5fZGVsdGEzMik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkJsb2NrSGFzaC5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICB0aGlzLnVwZGF0ZSh0aGlzLl9wYWQoKSk7XG4gIGFzc2VydCh0aGlzLnBlbmRpbmcgPT09IG51bGwpO1xuXG4gIHJldHVybiB0aGlzLl9kaWdlc3QoZW5jKTtcbn07XG5cbkJsb2NrSGFzaC5wcm90b3R5cGUuX3BhZCA9IGZ1bmN0aW9uIHBhZCgpIHtcbiAgdmFyIGxlbiA9IHRoaXMucGVuZGluZ1RvdGFsO1xuICB2YXIgYnl0ZXMgPSB0aGlzLl9kZWx0YTg7XG4gIHZhciBrID0gYnl0ZXMgLSAoKGxlbiArIHRoaXMucGFkTGVuZ3RoKSAlIGJ5dGVzKTtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheShrICsgdGhpcy5wYWRMZW5ndGgpO1xuICByZXNbMF0gPSAweDgwO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGs7IGkrKylcbiAgICByZXNbaV0gPSAwO1xuXG4gIC8vIEFwcGVuZCBsZW5ndGhcbiAgbGVuIDw8PSAzO1xuICBpZiAodGhpcy5lbmRpYW4gPT09ICdiaWcnKSB7XG4gICAgZm9yICh2YXIgdCA9IDg7IHQgPCB0aGlzLnBhZExlbmd0aDsgdCsrKVxuICAgICAgcmVzW2krK10gPSAwO1xuXG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMjQpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDE2KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiA4KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSBsZW4gJiAweGZmO1xuICB9IGVsc2Uge1xuICAgIHJlc1tpKytdID0gbGVuICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDgpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDE2KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAyNCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcblxuICAgIGZvciAodCA9IDg7IHQgPCB0aGlzLnBhZExlbmd0aDsgdCsrKVxuICAgICAgcmVzW2krK10gPSAwO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciByb3RyMzIgPSB1dGlscy5yb3RyMzI7XG5cbmZ1bmN0aW9uIGZ0XzEocywgeCwgeSwgeikge1xuICBpZiAocyA9PT0gMClcbiAgICByZXR1cm4gY2gzMih4LCB5LCB6KTtcbiAgaWYgKHMgPT09IDEgfHwgcyA9PT0gMylcbiAgICByZXR1cm4gcDMyKHgsIHksIHopO1xuICBpZiAocyA9PT0gMilcbiAgICByZXR1cm4gbWFqMzIoeCwgeSwgeik7XG59XG5leHBvcnRzLmZ0XzEgPSBmdF8xO1xuXG5mdW5jdGlvbiBjaDMyKHgsIHksIHopIHtcbiAgcmV0dXJuICh4ICYgeSkgXiAoKH54KSAmIHopO1xufVxuZXhwb3J0cy5jaDMyID0gY2gzMjtcblxuZnVuY3Rpb24gbWFqMzIoeCwgeSwgeikge1xuICByZXR1cm4gKHggJiB5KSBeICh4ICYgeikgXiAoeSAmIHopO1xufVxuZXhwb3J0cy5tYWozMiA9IG1hajMyO1xuXG5mdW5jdGlvbiBwMzIoeCwgeSwgeikge1xuICByZXR1cm4geCBeIHkgXiB6O1xufVxuZXhwb3J0cy5wMzIgPSBwMzI7XG5cbmZ1bmN0aW9uIHMwXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgMikgXiByb3RyMzIoeCwgMTMpIF4gcm90cjMyKHgsIDIyKTtcbn1cbmV4cG9ydHMuczBfMjU2ID0gczBfMjU2O1xuXG5mdW5jdGlvbiBzMV8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDYpIF4gcm90cjMyKHgsIDExKSBeIHJvdHIzMih4LCAyNSk7XG59XG5leHBvcnRzLnMxXzI1NiA9IHMxXzI1NjtcblxuZnVuY3Rpb24gZzBfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCA3KSBeIHJvdHIzMih4LCAxOCkgXiAoeCA+Pj4gMyk7XG59XG5leHBvcnRzLmcwXzI1NiA9IGcwXzI1NjtcblxuZnVuY3Rpb24gZzFfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCAxNykgXiByb3RyMzIoeCwgMTkpIF4gKHggPj4+IDEwKTtcbn1cbmV4cG9ydHMuZzFfMjU2ID0gZzFfMjU2O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgc2hhQ29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxudmFyIHJvdGwzMiA9IHV0aWxzLnJvdGwzMjtcbnZhciBzdW0zMiA9IHV0aWxzLnN1bTMyO1xudmFyIHN1bTMyXzUgPSB1dGlscy5zdW0zMl81O1xudmFyIGZ0XzEgPSBzaGFDb21tb24uZnRfMTtcbnZhciBCbG9ja0hhc2ggPSBjb21tb24uQmxvY2tIYXNoO1xuXG52YXIgc2hhMV9LID0gW1xuICAweDVBODI3OTk5LCAweDZFRDlFQkExLFxuICAweDhGMUJCQ0RDLCAweENBNjJDMUQ2XG5dO1xuXG5mdW5jdGlvbiBTSEExKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBMSkpXG4gICAgcmV0dXJuIG5ldyBTSEExKCk7XG5cbiAgQmxvY2tIYXNoLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweDY3NDUyMzAxLCAweGVmY2RhYjg5LCAweDk4YmFkY2ZlLFxuICAgIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjAgXTtcbiAgdGhpcy5XID0gbmV3IEFycmF5KDgwKTtcbn1cblxudXRpbHMuaW5oZXJpdHMoU0hBMSwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMTtcblxuU0hBMS5ibG9ja1NpemUgPSA1MTI7XG5TSEExLm91dFNpemUgPSAxNjA7XG5TSEExLmhtYWNTdHJlbmd0aCA9IDgwO1xuU0hBMS5wYWRMZW5ndGggPSA2NDtcblxuU0hBMS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIF91cGRhdGUobXNnLCBzdGFydCkge1xuICB2YXIgVyA9IHRoaXMuVztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspXG4gICAgV1tpXSA9IG1zZ1tzdGFydCArIGldO1xuXG4gIGZvcig7IGkgPCBXLmxlbmd0aDsgaSsrKVxuICAgIFdbaV0gPSByb3RsMzIoV1tpIC0gM10gXiBXW2kgLSA4XSBeIFdbaSAtIDE0XSBeIFdbaSAtIDE2XSwgMSk7XG5cbiAgdmFyIGEgPSB0aGlzLmhbMF07XG4gIHZhciBiID0gdGhpcy5oWzFdO1xuICB2YXIgYyA9IHRoaXMuaFsyXTtcbiAgdmFyIGQgPSB0aGlzLmhbM107XG4gIHZhciBlID0gdGhpcy5oWzRdO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBXLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHMgPSB+fihpIC8gMjApO1xuICAgIHZhciB0ID0gc3VtMzJfNShyb3RsMzIoYSwgNSksIGZ0XzEocywgYiwgYywgZCksIGUsIFdbaV0sIHNoYTFfS1tzXSk7XG4gICAgZSA9IGQ7XG4gICAgZCA9IGM7XG4gICAgYyA9IHJvdGwzMihiLCAzMCk7XG4gICAgYiA9IGE7XG4gICAgYSA9IHQ7XG4gIH1cblxuICB0aGlzLmhbMF0gPSBzdW0zMih0aGlzLmhbMF0sIGEpO1xuICB0aGlzLmhbMV0gPSBzdW0zMih0aGlzLmhbMV0sIGIpO1xuICB0aGlzLmhbMl0gPSBzdW0zMih0aGlzLmhbMl0sIGMpO1xuICB0aGlzLmhbM10gPSBzdW0zMih0aGlzLmhbM10sIGQpO1xuICB0aGlzLmhbNF0gPSBzdW0zMih0aGlzLmhbNF0sIGUpO1xufTtcblxuU0hBMS5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdiaWcnKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBzaGFDb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxudmFyIHN1bTMyID0gdXRpbHMuc3VtMzI7XG52YXIgc3VtMzJfNCA9IHV0aWxzLnN1bTMyXzQ7XG52YXIgc3VtMzJfNSA9IHV0aWxzLnN1bTMyXzU7XG52YXIgY2gzMiA9IHNoYUNvbW1vbi5jaDMyO1xudmFyIG1hajMyID0gc2hhQ29tbW9uLm1hajMyO1xudmFyIHMwXzI1NiA9IHNoYUNvbW1vbi5zMF8yNTY7XG52YXIgczFfMjU2ID0gc2hhQ29tbW9uLnMxXzI1NjtcbnZhciBnMF8yNTYgPSBzaGFDb21tb24uZzBfMjU2O1xudmFyIGcxXzI1NiA9IHNoYUNvbW1vbi5nMV8yNTY7XG5cbnZhciBCbG9ja0hhc2ggPSBjb21tb24uQmxvY2tIYXNoO1xuXG52YXIgc2hhMjU2X0sgPSBbXG4gIDB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsXG4gIDB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsIDB4OTIzZjgyYTQsIDB4YWIxYzVlZDUsXG4gIDB4ZDgwN2FhOTgsIDB4MTI4MzViMDEsIDB4MjQzMTg1YmUsIDB4NTUwYzdkYzMsXG4gIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsXG4gIDB4ZTQ5YjY5YzEsIDB4ZWZiZTQ3ODYsIDB4MGZjMTlkYzYsIDB4MjQwY2ExY2MsXG4gIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsXG4gIDB4OTgzZTUxNTIsIDB4YTgzMWM2NmQsIDB4YjAwMzI3YzgsIDB4YmY1OTdmYzcsXG4gIDB4YzZlMDBiZjMsIDB4ZDVhNzkxNDcsIDB4MDZjYTYzNTEsIDB4MTQyOTI5NjcsXG4gIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsXG4gIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsXG4gIDB4YTJiZmU4YTEsIDB4YTgxYTY2NGIsIDB4YzI0YjhiNzAsIDB4Yzc2YzUxYTMsXG4gIDB4ZDE5MmU4MTksIDB4ZDY5OTA2MjQsIDB4ZjQwZTM1ODUsIDB4MTA2YWEwNzAsXG4gIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsXG4gIDB4MzkxYzBjYjMsIDB4NGVkOGFhNGEsIDB4NWI5Y2NhNGYsIDB4NjgyZTZmZjMsXG4gIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsXG4gIDB4OTBiZWZmZmEsIDB4YTQ1MDZjZWIsIDB4YmVmOWEzZjcsIDB4YzY3MTc4ZjJcbl07XG5cbmZ1bmN0aW9uIFNIQTI1NigpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTI1NikpXG4gICAgcmV0dXJuIG5ldyBTSEEyNTYoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4NmEwOWU2NjcsIDB4YmI2N2FlODUsIDB4M2M2ZWYzNzIsIDB4YTU0ZmY1M2EsXG4gICAgMHg1MTBlNTI3ZiwgMHg5YjA1Njg4YywgMHgxZjgzZDlhYiwgMHg1YmUwY2QxOVxuICBdO1xuICB0aGlzLmsgPSBzaGEyNTZfSztcbiAgdGhpcy5XID0gbmV3IEFycmF5KDY0KTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTI1NiwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMjU2O1xuXG5TSEEyNTYuYmxvY2tTaXplID0gNTEyO1xuU0hBMjU2Lm91dFNpemUgPSAyNTY7XG5TSEEyNTYuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBMjU2LnBhZExlbmd0aCA9IDY0O1xuXG5TSEEyNTYucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcbiAgZm9yICg7IGkgPCBXLmxlbmd0aDsgaSsrKVxuICAgIFdbaV0gPSBzdW0zMl80KGcxXzI1NihXW2kgLSAyXSksIFdbaSAtIDddLCBnMF8yNTYoV1tpIC0gMTVdKSwgV1tpIC0gMTZdKTtcblxuICB2YXIgYSA9IHRoaXMuaFswXTtcbiAgdmFyIGIgPSB0aGlzLmhbMV07XG4gIHZhciBjID0gdGhpcy5oWzJdO1xuICB2YXIgZCA9IHRoaXMuaFszXTtcbiAgdmFyIGUgPSB0aGlzLmhbNF07XG4gIHZhciBmID0gdGhpcy5oWzVdO1xuICB2YXIgZyA9IHRoaXMuaFs2XTtcbiAgdmFyIGggPSB0aGlzLmhbN107XG5cbiAgYXNzZXJ0KHRoaXMuay5sZW5ndGggPT09IFcubGVuZ3RoKTtcbiAgZm9yIChpID0gMDsgaSA8IFcubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgVDEgPSBzdW0zMl81KGgsIHMxXzI1NihlKSwgY2gzMihlLCBmLCBnKSwgdGhpcy5rW2ldLCBXW2ldKTtcbiAgICB2YXIgVDIgPSBzdW0zMihzMF8yNTYoYSksIG1hajMyKGEsIGIsIGMpKTtcbiAgICBoID0gZztcbiAgICBnID0gZjtcbiAgICBmID0gZTtcbiAgICBlID0gc3VtMzIoZCwgVDEpO1xuICAgIGQgPSBjO1xuICAgIGMgPSBiO1xuICAgIGIgPSBhO1xuICAgIGEgPSBzdW0zMihUMSwgVDIpO1xuICB9XG5cbiAgdGhpcy5oWzBdID0gc3VtMzIodGhpcy5oWzBdLCBhKTtcbiAgdGhpcy5oWzFdID0gc3VtMzIodGhpcy5oWzFdLCBiKTtcbiAgdGhpcy5oWzJdID0gc3VtMzIodGhpcy5oWzJdLCBjKTtcbiAgdGhpcy5oWzNdID0gc3VtMzIodGhpcy5oWzNdLCBkKTtcbiAgdGhpcy5oWzRdID0gc3VtMzIodGhpcy5oWzRdLCBlKTtcbiAgdGhpcy5oWzVdID0gc3VtMzIodGhpcy5oWzVdLCBmKTtcbiAgdGhpcy5oWzZdID0gc3VtMzIodGhpcy5oWzZdLCBnKTtcbiAgdGhpcy5oWzddID0gc3VtMzIodGhpcy5oWzddLCBoKTtcbn07XG5cblNIQTI1Ni5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdiaWcnKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBTSEEyNTYgPSByZXF1aXJlKCcuLzI1NicpO1xuXG5mdW5jdGlvbiBTSEEyMjQoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEyMjQpKVxuICAgIHJldHVybiBuZXcgU0hBMjI0KCk7XG5cbiAgU0hBMjU2LmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweGMxMDU5ZWQ4LCAweDM2N2NkNTA3LCAweDMwNzBkZDE3LCAweGY3MGU1OTM5LFxuICAgIDB4ZmZjMDBiMzEsIDB4Njg1ODE1MTEsIDB4NjRmOThmYTcsIDB4YmVmYTRmYTQgXTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTIyNCwgU0hBMjU2KTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMjI0O1xuXG5TSEEyMjQuYmxvY2tTaXplID0gNTEyO1xuU0hBMjI0Lm91dFNpemUgPSAyMjQ7XG5TSEEyMjQuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBMjI0LnBhZExlbmd0aCA9IDY0O1xuXG5TSEEyMjQucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIC8vIEp1c3QgdHJ1bmNhdGUgb3V0cHV0XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaC5zbGljZSgwLCA3KSwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsIDcpLCAnYmlnJyk7XG59O1xuXG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbnZhciByb3RyNjRfaGkgPSB1dGlscy5yb3RyNjRfaGk7XG52YXIgcm90cjY0X2xvID0gdXRpbHMucm90cjY0X2xvO1xudmFyIHNocjY0X2hpID0gdXRpbHMuc2hyNjRfaGk7XG52YXIgc2hyNjRfbG8gPSB1dGlscy5zaHI2NF9sbztcbnZhciBzdW02NCA9IHV0aWxzLnN1bTY0O1xudmFyIHN1bTY0X2hpID0gdXRpbHMuc3VtNjRfaGk7XG52YXIgc3VtNjRfbG8gPSB1dGlscy5zdW02NF9sbztcbnZhciBzdW02NF80X2hpID0gdXRpbHMuc3VtNjRfNF9oaTtcbnZhciBzdW02NF80X2xvID0gdXRpbHMuc3VtNjRfNF9sbztcbnZhciBzdW02NF81X2hpID0gdXRpbHMuc3VtNjRfNV9oaTtcbnZhciBzdW02NF81X2xvID0gdXRpbHMuc3VtNjRfNV9sbztcblxudmFyIEJsb2NrSGFzaCA9IGNvbW1vbi5CbG9ja0hhc2g7XG5cbnZhciBzaGE1MTJfSyA9IFtcbiAgMHg0MjhhMmY5OCwgMHhkNzI4YWUyMiwgMHg3MTM3NDQ5MSwgMHgyM2VmNjVjZCxcbiAgMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiwgMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyxcbiAgMHgzOTU2YzI1YiwgMHhmMzQ4YjUzOCwgMHg1OWYxMTFmMSwgMHhiNjA1ZDAxOSxcbiAgMHg5MjNmODJhNCwgMHhhZjE5NGY5YiwgMHhhYjFjNWVkNSwgMHhkYTZkODExOCxcbiAgMHhkODA3YWE5OCwgMHhhMzAzMDI0MiwgMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSxcbiAgMHgyNDMxODViZSwgMHg0ZWU0YjI4YywgMHg1NTBjN2RjMywgMHhkNWZmYjRlMixcbiAgMHg3MmJlNWQ3NCwgMHhmMjdiODk2ZiwgMHg4MGRlYjFmZSwgMHgzYjE2OTZiMSxcbiAgMHg5YmRjMDZhNywgMHgyNWM3MTIzNSwgMHhjMTliZjE3NCwgMHhjZjY5MjY5NCxcbiAgMHhlNDliNjljMSwgMHg5ZWYxNGFkMiwgMHhlZmJlNDc4NiwgMHgzODRmMjVlMyxcbiAgMHgwZmMxOWRjNiwgMHg4YjhjZDViNSwgMHgyNDBjYTFjYywgMHg3N2FjOWM2NSxcbiAgMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSwgMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyxcbiAgMHg1Y2IwYTlkYywgMHhiZDQxZmJkNCwgMHg3NmY5ODhkYSwgMHg4MzExNTNiNSxcbiAgMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiwgMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCxcbiAgMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiwgMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCxcbiAgMHhjNmUwMGJmMywgMHgzZGE4OGZjMiwgMHhkNWE3OTE0NywgMHg5MzBhYTcyNSxcbiAgMHgwNmNhNjM1MSwgMHhlMDAzODI2ZiwgMHgxNDI5Mjk2NywgMHgwYTBlNmU3MCxcbiAgMHgyN2I3MGE4NSwgMHg0NmQyMmZmYywgMHgyZTFiMjEzOCwgMHg1YzI2YzkyNixcbiAgMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCwgMHg1MzM4MGQxMywgMHg5ZDk1YjNkZixcbiAgMHg2NTBhNzM1NCwgMHg4YmFmNjNkZSwgMHg3NjZhMGFiYiwgMHgzYzc3YjJhOCxcbiAgMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiwgMHg5MjcyMmM4NSwgMHgxNDgyMzUzYixcbiAgMHhhMmJmZThhMSwgMHg0Y2YxMDM2NCwgMHhhODFhNjY0YiwgMHhiYzQyMzAwMSxcbiAgMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSwgMHhjNzZjNTFhMywgMHgwNjU0YmUzMCxcbiAgMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCwgMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCxcbiAgMHhmNDBlMzU4NSwgMHg1NzcxMjAyYSwgMHgxMDZhYTA3MCwgMHgzMmJiZDFiOCxcbiAgMHgxOWE0YzExNiwgMHhiOGQyZDBjOCwgMHgxZTM3NmMwOCwgMHg1MTQxYWI1MyxcbiAgMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSwgMHgzNGIwYmNiNSwgMHhlMTliNDhhOCxcbiAgMHgzOTFjMGNiMywgMHhjNWM5NWE2MywgMHg0ZWQ4YWE0YSwgMHhlMzQxOGFjYixcbiAgMHg1YjljY2E0ZiwgMHg3NzYzZTM3MywgMHg2ODJlNmZmMywgMHhkNmIyYjhhMyxcbiAgMHg3NDhmODJlZSwgMHg1ZGVmYjJmYywgMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCxcbiAgMHg4NGM4NzgxNCwgMHhhMWYwYWI3MiwgMHg4Y2M3MDIwOCwgMHgxYTY0MzllYyxcbiAgMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCwgMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSxcbiAgMHhiZWY5YTNmNywgMHhiMmM2NzkxNSwgMHhjNjcxNzhmMiwgMHhlMzcyNTMyYixcbiAgMHhjYTI3M2VjZSwgMHhlYTI2NjE5YywgMHhkMTg2YjhjNywgMHgyMWMwYzIwNyxcbiAgMHhlYWRhN2RkNiwgMHhjZGUwZWIxZSwgMHhmNTdkNGY3ZiwgMHhlZTZlZDE3OCxcbiAgMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSwgMHgwYTYzN2RjNSwgMHhhMmM4OThhNixcbiAgMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSwgMHgxYjcxMGIzNSwgMHgxMzFjNDcxYixcbiAgMHgyOGRiNzdmNSwgMHgyMzA0N2Q4NCwgMHgzMmNhYWI3YiwgMHg0MGM3MjQ5MyxcbiAgMHgzYzllYmUwYSwgMHgxNWM5YmViYywgMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyxcbiAgMHg0Y2M1ZDRiZSwgMHhjYjNlNDJiNiwgMHg1OTdmMjk5YywgMHhmYzY1N2UyYSxcbiAgMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYywgMHg2YzQ0MTk4YywgMHg0YTQ3NTgxN1xuXTtcblxuZnVuY3Rpb24gU0hBNTEyKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBNTEyKSlcbiAgICByZXR1cm4gbmV3IFNIQTUxMigpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHg2YTA5ZTY2NywgMHhmM2JjYzkwOCxcbiAgICAweGJiNjdhZTg1LCAweDg0Y2FhNzNiLFxuICAgIDB4M2M2ZWYzNzIsIDB4ZmU5NGY4MmIsXG4gICAgMHhhNTRmZjUzYSwgMHg1ZjFkMzZmMSxcbiAgICAweDUxMGU1MjdmLCAweGFkZTY4MmQxLFxuICAgIDB4OWIwNTY4OGMsIDB4MmIzZTZjMWYsXG4gICAgMHgxZjgzZDlhYiwgMHhmYjQxYmQ2YixcbiAgICAweDViZTBjZDE5LCAweDEzN2UyMTc5IF07XG4gIHRoaXMuayA9IHNoYTUxMl9LO1xuICB0aGlzLlcgPSBuZXcgQXJyYXkoMTYwKTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTUxMiwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBNTEyO1xuXG5TSEE1MTIuYmxvY2tTaXplID0gMTAyNDtcblNIQTUxMi5vdXRTaXplID0gNTEyO1xuU0hBNTEyLmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTUxMi5wYWRMZW5ndGggPSAxMjg7XG5cblNIQTUxMi5wcm90b3R5cGUuX3ByZXBhcmVCbG9jayA9IGZ1bmN0aW9uIF9wcmVwYXJlQmxvY2sobXNnLCBzdGFydCkge1xuICB2YXIgVyA9IHRoaXMuVztcblxuICAvLyAzMiB4IDMyYml0IHdvcmRzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzI7IGkrKylcbiAgICBXW2ldID0gbXNnW3N0YXJ0ICsgaV07XG4gIGZvciAoOyBpIDwgVy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBjMF9oaSA9IGcxXzUxMl9oaShXW2kgLSA0XSwgV1tpIC0gM10pOyAgLy8gaSAtIDJcbiAgICB2YXIgYzBfbG8gPSBnMV81MTJfbG8oV1tpIC0gNF0sIFdbaSAtIDNdKTtcbiAgICB2YXIgYzFfaGkgPSBXW2kgLSAxNF07ICAvLyBpIC0gN1xuICAgIHZhciBjMV9sbyA9IFdbaSAtIDEzXTtcbiAgICB2YXIgYzJfaGkgPSBnMF81MTJfaGkoV1tpIC0gMzBdLCBXW2kgLSAyOV0pOyAgLy8gaSAtIDE1XG4gICAgdmFyIGMyX2xvID0gZzBfNTEyX2xvKFdbaSAtIDMwXSwgV1tpIC0gMjldKTtcbiAgICB2YXIgYzNfaGkgPSBXW2kgLSAzMl07ICAvLyBpIC0gMTZcbiAgICB2YXIgYzNfbG8gPSBXW2kgLSAzMV07XG5cbiAgICBXW2ldID0gc3VtNjRfNF9oaShcbiAgICAgIGMwX2hpLCBjMF9sbyxcbiAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgIGMzX2hpLCBjM19sbyk7XG4gICAgV1tpICsgMV0gPSBzdW02NF80X2xvKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvKTtcbiAgfVxufTtcblxuU0hBNTEyLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gX3VwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHRoaXMuX3ByZXBhcmVCbG9jayhtc2csIHN0YXJ0KTtcblxuICB2YXIgVyA9IHRoaXMuVztcblxuICB2YXIgYWggPSB0aGlzLmhbMF07XG4gIHZhciBhbCA9IHRoaXMuaFsxXTtcbiAgdmFyIGJoID0gdGhpcy5oWzJdO1xuICB2YXIgYmwgPSB0aGlzLmhbM107XG4gIHZhciBjaCA9IHRoaXMuaFs0XTtcbiAgdmFyIGNsID0gdGhpcy5oWzVdO1xuICB2YXIgZGggPSB0aGlzLmhbNl07XG4gIHZhciBkbCA9IHRoaXMuaFs3XTtcbiAgdmFyIGVoID0gdGhpcy5oWzhdO1xuICB2YXIgZWwgPSB0aGlzLmhbOV07XG4gIHZhciBmaCA9IHRoaXMuaFsxMF07XG4gIHZhciBmbCA9IHRoaXMuaFsxMV07XG4gIHZhciBnaCA9IHRoaXMuaFsxMl07XG4gIHZhciBnbCA9IHRoaXMuaFsxM107XG4gIHZhciBoaCA9IHRoaXMuaFsxNF07XG4gIHZhciBobCA9IHRoaXMuaFsxNV07XG5cbiAgYXNzZXJ0KHRoaXMuay5sZW5ndGggPT09IFcubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBXLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGMwX2hpID0gaGg7XG4gICAgdmFyIGMwX2xvID0gaGw7XG4gICAgdmFyIGMxX2hpID0gczFfNTEyX2hpKGVoLCBlbCk7XG4gICAgdmFyIGMxX2xvID0gczFfNTEyX2xvKGVoLCBlbCk7XG4gICAgdmFyIGMyX2hpID0gY2g2NF9oaShlaCwgZWwsIGZoLCBmbCwgZ2gsIGdsKTtcbiAgICB2YXIgYzJfbG8gPSBjaDY0X2xvKGVoLCBlbCwgZmgsIGZsLCBnaCwgZ2wpO1xuICAgIHZhciBjM19oaSA9IHRoaXMua1tpXTtcbiAgICB2YXIgYzNfbG8gPSB0aGlzLmtbaSArIDFdO1xuICAgIHZhciBjNF9oaSA9IFdbaV07XG4gICAgdmFyIGM0X2xvID0gV1tpICsgMV07XG5cbiAgICB2YXIgVDFfaGkgPSBzdW02NF81X2hpKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvLFxuICAgICAgYzRfaGksIGM0X2xvKTtcbiAgICB2YXIgVDFfbG8gPSBzdW02NF81X2xvKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvLFxuICAgICAgYzRfaGksIGM0X2xvKTtcblxuICAgIGMwX2hpID0gczBfNTEyX2hpKGFoLCBhbCk7XG4gICAgYzBfbG8gPSBzMF81MTJfbG8oYWgsIGFsKTtcbiAgICBjMV9oaSA9IG1hajY0X2hpKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wpO1xuICAgIGMxX2xvID0gbWFqNjRfbG8oYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCk7XG5cbiAgICB2YXIgVDJfaGkgPSBzdW02NF9oaShjMF9oaSwgYzBfbG8sIGMxX2hpLCBjMV9sbyk7XG4gICAgdmFyIFQyX2xvID0gc3VtNjRfbG8oYzBfaGksIGMwX2xvLCBjMV9oaSwgYzFfbG8pO1xuXG4gICAgaGggPSBnaDtcbiAgICBobCA9IGdsO1xuXG4gICAgZ2ggPSBmaDtcbiAgICBnbCA9IGZsO1xuXG4gICAgZmggPSBlaDtcbiAgICBmbCA9IGVsO1xuXG4gICAgZWggPSBzdW02NF9oaShkaCwgZGwsIFQxX2hpLCBUMV9sbyk7XG4gICAgZWwgPSBzdW02NF9sbyhkbCwgZGwsIFQxX2hpLCBUMV9sbyk7XG5cbiAgICBkaCA9IGNoO1xuICAgIGRsID0gY2w7XG5cbiAgICBjaCA9IGJoO1xuICAgIGNsID0gYmw7XG5cbiAgICBiaCA9IGFoO1xuICAgIGJsID0gYWw7XG5cbiAgICBhaCA9IHN1bTY0X2hpKFQxX2hpLCBUMV9sbywgVDJfaGksIFQyX2xvKTtcbiAgICBhbCA9IHN1bTY0X2xvKFQxX2hpLCBUMV9sbywgVDJfaGksIFQyX2xvKTtcbiAgfVxuXG4gIHN1bTY0KHRoaXMuaCwgMCwgYWgsIGFsKTtcbiAgc3VtNjQodGhpcy5oLCAyLCBiaCwgYmwpO1xuICBzdW02NCh0aGlzLmgsIDQsIGNoLCBjbCk7XG4gIHN1bTY0KHRoaXMuaCwgNiwgZGgsIGRsKTtcbiAgc3VtNjQodGhpcy5oLCA4LCBlaCwgZWwpO1xuICBzdW02NCh0aGlzLmgsIDEwLCBmaCwgZmwpO1xuICBzdW02NCh0aGlzLmgsIDEyLCBnaCwgZ2wpO1xuICBzdW02NCh0aGlzLmgsIDE0LCBoaCwgaGwpO1xufTtcblxuU0hBNTEyLnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmgsICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaCwgJ2JpZycpO1xufTtcblxuZnVuY3Rpb24gY2g2NF9oaSh4aCwgeGwsIHloLCB5bCwgemgpIHtcbiAgdmFyIHIgPSAoeGggJiB5aCkgXiAoKH54aCkgJiB6aCk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gY2g2NF9sbyh4aCwgeGwsIHloLCB5bCwgemgsIHpsKSB7XG4gIHZhciByID0gKHhsICYgeWwpIF4gKCh+eGwpICYgemwpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIG1hajY0X2hpKHhoLCB4bCwgeWgsIHlsLCB6aCkge1xuICB2YXIgciA9ICh4aCAmIHloKSBeICh4aCAmIHpoKSBeICh5aCAmIHpoKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBtYWo2NF9sbyh4aCwgeGwsIHloLCB5bCwgemgsIHpsKSB7XG4gIHZhciByID0gKHhsICYgeWwpIF4gKHhsICYgemwpIF4gKHlsICYgemwpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMwXzUxMl9oaSh4aCwgeGwpIHtcbiAgdmFyIGMwX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMjgpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGwsIHhoLCAyKTsgIC8vIDM0XG4gIHZhciBjMl9oaSA9IHJvdHI2NF9oaSh4bCwgeGgsIDcpOyAgLy8gMzlcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBzMF81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDI4KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgMik7ICAvLyAzNFxuICB2YXIgYzJfbG8gPSByb3RyNjRfbG8oeGwsIHhoLCA3KTsgIC8vIDM5XG5cbiAgdmFyIHIgPSBjMF9sbyBeIGMxX2xvIF4gYzJfbG87XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gczFfNTEyX2hpKHhoLCB4bCkge1xuICB2YXIgYzBfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAxNCk7XG4gIHZhciBjMV9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE4KTtcbiAgdmFyIGMyX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgOSk7ICAvLyA0MVxuXG4gIHZhciByID0gYzBfaGkgXiBjMV9oaSBeIGMyX2hpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMxXzUxMl9sbyh4aCwgeGwpIHtcbiAgdmFyIGMwX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMTQpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAxOCk7XG4gIHZhciBjMl9sbyA9IHJvdHI2NF9sbyh4bCwgeGgsIDkpOyAgLy8gNDFcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMF81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDEpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCA4KTtcbiAgdmFyIGMyX2hpID0gc2hyNjRfaGkoeGgsIHhsLCA3KTtcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMF81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDEpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCA4KTtcbiAgdmFyIGMyX2xvID0gc2hyNjRfbG8oeGgsIHhsLCA3KTtcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMV81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE5KTtcbiAgdmFyIGMxX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgMjkpOyAgLy8gNjFcbiAgdmFyIGMyX2hpID0gc2hyNjRfaGkoeGgsIHhsLCA2KTtcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMV81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDE5KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgMjkpOyAgLy8gNjFcbiAgdmFyIGMyX2xvID0gc2hyNjRfbG8oeGgsIHhsLCA2KTtcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbnZhciBTSEE1MTIgPSByZXF1aXJlKCcuLzUxMicpO1xuXG5mdW5jdGlvbiBTSEEzODQoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEzODQpKVxuICAgIHJldHVybiBuZXcgU0hBMzg0KCk7XG5cbiAgU0hBNTEyLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweGNiYmI5ZDVkLCAweGMxMDU5ZWQ4LFxuICAgIDB4NjI5YTI5MmEsIDB4MzY3Y2Q1MDcsXG4gICAgMHg5MTU5MDE1YSwgMHgzMDcwZGQxNyxcbiAgICAweDE1MmZlY2Q4LCAweGY3MGU1OTM5LFxuICAgIDB4NjczMzI2NjcsIDB4ZmZjMDBiMzEsXG4gICAgMHg4ZWI0NGE4NywgMHg2ODU4MTUxMSxcbiAgICAweGRiMGMyZTBkLCAweDY0Zjk4ZmE3LFxuICAgIDB4NDdiNTQ4MWQsIDB4YmVmYTRmYTQgXTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTM4NCwgU0hBNTEyKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMzg0O1xuXG5TSEEzODQuYmxvY2tTaXplID0gMTAyNDtcblNIQTM4NC5vdXRTaXplID0gMzg0O1xuU0hBMzg0LmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTM4NC5wYWRMZW5ndGggPSAxMjg7XG5cblNIQTM4NC5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLnNsaWNlKDAsIDEyKSwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsIDEyKSwgJ2JpZycpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnNoYTEgPSByZXF1aXJlKCcuL3NoYS8xJyk7XG5leHBvcnRzLnNoYTIyNCA9IHJlcXVpcmUoJy4vc2hhLzIyNCcpO1xuZXhwb3J0cy5zaGEyNTYgPSByZXF1aXJlKCcuL3NoYS8yNTYnKTtcbmV4cG9ydHMuc2hhMzg0ID0gcmVxdWlyZSgnLi9zaGEvMzg0Jyk7XG5leHBvcnRzLnNoYTUxMiA9IHJlcXVpcmUoJy4vc2hhLzUxMicpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG52YXIgcm90bDMyID0gdXRpbHMucm90bDMyO1xudmFyIHN1bTMyID0gdXRpbHMuc3VtMzI7XG52YXIgc3VtMzJfMyA9IHV0aWxzLnN1bTMyXzM7XG52YXIgc3VtMzJfNCA9IHV0aWxzLnN1bTMyXzQ7XG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxuZnVuY3Rpb24gUklQRU1EMTYwKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUklQRU1EMTYwKSlcbiAgICByZXR1cm4gbmV3IFJJUEVNRDE2MCgpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuXG4gIHRoaXMuaCA9IFsgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMCBdO1xuICB0aGlzLmVuZGlhbiA9ICdsaXR0bGUnO1xufVxudXRpbHMuaW5oZXJpdHMoUklQRU1EMTYwLCBCbG9ja0hhc2gpO1xuZXhwb3J0cy5yaXBlbWQxNjAgPSBSSVBFTUQxNjA7XG5cblJJUEVNRDE2MC5ibG9ja1NpemUgPSA1MTI7XG5SSVBFTUQxNjAub3V0U2l6ZSA9IDE2MDtcblJJUEVNRDE2MC5obWFjU3RyZW5ndGggPSAxOTI7XG5SSVBFTUQxNjAucGFkTGVuZ3RoID0gNjQ7XG5cblJJUEVNRDE2MC5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHZhciBBID0gdGhpcy5oWzBdO1xuICB2YXIgQiA9IHRoaXMuaFsxXTtcbiAgdmFyIEMgPSB0aGlzLmhbMl07XG4gIHZhciBEID0gdGhpcy5oWzNdO1xuICB2YXIgRSA9IHRoaXMuaFs0XTtcbiAgdmFyIEFoID0gQTtcbiAgdmFyIEJoID0gQjtcbiAgdmFyIENoID0gQztcbiAgdmFyIERoID0gRDtcbiAgdmFyIEVoID0gRTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4MDsgaisrKSB7XG4gICAgdmFyIFQgPSBzdW0zMihcbiAgICAgIHJvdGwzMihcbiAgICAgICAgc3VtMzJfNChBLCBmKGosIEIsIEMsIEQpLCBtc2dbcltqXSArIHN0YXJ0XSwgSyhqKSksXG4gICAgICAgIHNbal0pLFxuICAgICAgRSk7XG4gICAgQSA9IEU7XG4gICAgRSA9IEQ7XG4gICAgRCA9IHJvdGwzMihDLCAxMCk7XG4gICAgQyA9IEI7XG4gICAgQiA9IFQ7XG4gICAgVCA9IHN1bTMyKFxuICAgICAgcm90bDMyKFxuICAgICAgICBzdW0zMl80KEFoLCBmKDc5IC0gaiwgQmgsIENoLCBEaCksIG1zZ1tyaFtqXSArIHN0YXJ0XSwgS2goaikpLFxuICAgICAgICBzaFtqXSksXG4gICAgICBFaCk7XG4gICAgQWggPSBFaDtcbiAgICBFaCA9IERoO1xuICAgIERoID0gcm90bDMyKENoLCAxMCk7XG4gICAgQ2ggPSBCaDtcbiAgICBCaCA9IFQ7XG4gIH1cbiAgVCA9IHN1bTMyXzModGhpcy5oWzFdLCBDLCBEaCk7XG4gIHRoaXMuaFsxXSA9IHN1bTMyXzModGhpcy5oWzJdLCBELCBFaCk7XG4gIHRoaXMuaFsyXSA9IHN1bTMyXzModGhpcy5oWzNdLCBFLCBBaCk7XG4gIHRoaXMuaFszXSA9IHN1bTMyXzModGhpcy5oWzRdLCBBLCBCaCk7XG4gIHRoaXMuaFs0XSA9IHN1bTMyXzModGhpcy5oWzBdLCBCLCBDaCk7XG4gIHRoaXMuaFswXSA9IFQ7XG59O1xuXG5SSVBFTUQxNjAucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2xpdHRsZScpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnbGl0dGxlJyk7XG59O1xuXG5mdW5jdGlvbiBmKGosIHgsIHksIHopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIHggXiB5IF4gejtcbiAgZWxzZSBpZiAoaiA8PSAzMSlcbiAgICByZXR1cm4gKHggJiB5KSB8ICgofngpICYgeik7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuICh4IHwgKH55KSkgXiB6O1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAoeCAmIHopIHwgKHkgJiAofnopKTtcbiAgZWxzZVxuICAgIHJldHVybiB4IF4gKHkgfCAofnopKTtcbn1cblxuZnVuY3Rpb24gSyhqKSB7XG4gIGlmIChqIDw9IDE1KVxuICAgIHJldHVybiAweDAwMDAwMDAwO1xuICBlbHNlIGlmIChqIDw9IDMxKVxuICAgIHJldHVybiAweDVhODI3OTk5O1xuICBlbHNlIGlmIChqIDw9IDQ3KVxuICAgIHJldHVybiAweDZlZDllYmExO1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAweDhmMWJiY2RjO1xuICBlbHNlXG4gICAgcmV0dXJuIDB4YTk1M2ZkNGU7XG59XG5cbmZ1bmN0aW9uIEtoKGopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIDB4NTBhMjhiZTY7XG4gIGVsc2UgaWYgKGogPD0gMzEpXG4gICAgcmV0dXJuIDB4NWM0ZGQxMjQ7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuIDB4NmQ3MDNlZjM7XG4gIGVsc2UgaWYgKGogPD0gNjMpXG4gICAgcmV0dXJuIDB4N2E2ZDc2ZTk7XG4gIGVsc2VcbiAgICByZXR1cm4gMHgwMDAwMDAwMDtcbn1cblxudmFyIHIgPSBbXG4gIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsXG4gIDcsIDQsIDEzLCAxLCAxMCwgNiwgMTUsIDMsIDEyLCAwLCA5LCA1LCAyLCAxNCwgMTEsIDgsXG4gIDMsIDEwLCAxNCwgNCwgOSwgMTUsIDgsIDEsIDIsIDcsIDAsIDYsIDEzLCAxMSwgNSwgMTIsXG4gIDEsIDksIDExLCAxMCwgMCwgOCwgMTIsIDQsIDEzLCAzLCA3LCAxNSwgMTQsIDUsIDYsIDIsXG4gIDQsIDAsIDUsIDksIDcsIDEyLCAyLCAxMCwgMTQsIDEsIDMsIDgsIDExLCA2LCAxNSwgMTNcbl07XG5cbnZhciByaCA9IFtcbiAgNSwgMTQsIDcsIDAsIDksIDIsIDExLCA0LCAxMywgNiwgMTUsIDgsIDEsIDEwLCAzLCAxMixcbiAgNiwgMTEsIDMsIDcsIDAsIDEzLCA1LCAxMCwgMTQsIDE1LCA4LCAxMiwgNCwgOSwgMSwgMixcbiAgMTUsIDUsIDEsIDMsIDcsIDE0LCA2LCA5LCAxMSwgOCwgMTIsIDIsIDEwLCAwLCA0LCAxMyxcbiAgOCwgNiwgNCwgMSwgMywgMTEsIDE1LCAwLCA1LCAxMiwgMiwgMTMsIDksIDcsIDEwLCAxNCxcbiAgMTIsIDE1LCAxMCwgNCwgMSwgNSwgOCwgNywgNiwgMiwgMTMsIDE0LCAwLCAzLCA5LCAxMVxuXTtcblxudmFyIHMgPSBbXG4gIDExLCAxNCwgMTUsIDEyLCA1LCA4LCA3LCA5LCAxMSwgMTMsIDE0LCAxNSwgNiwgNywgOSwgOCxcbiAgNywgNiwgOCwgMTMsIDExLCA5LCA3LCAxNSwgNywgMTIsIDE1LCA5LCAxMSwgNywgMTMsIDEyLFxuICAxMSwgMTMsIDYsIDcsIDE0LCA5LCAxMywgMTUsIDE0LCA4LCAxMywgNiwgNSwgMTIsIDcsIDUsXG4gIDExLCAxMiwgMTQsIDE1LCAxNCwgMTUsIDksIDgsIDksIDE0LCA1LCA2LCA4LCA2LCA1LCAxMixcbiAgOSwgMTUsIDUsIDExLCA2LCA4LCAxMywgMTIsIDUsIDEyLCAxMywgMTQsIDExLCA4LCA1LCA2XG5dO1xuXG52YXIgc2ggPSBbXG4gIDgsIDksIDksIDExLCAxMywgMTUsIDE1LCA1LCA3LCA3LCA4LCAxMSwgMTQsIDE0LCAxMiwgNixcbiAgOSwgMTMsIDE1LCA3LCAxMiwgOCwgOSwgMTEsIDcsIDcsIDEyLCA3LCA2LCAxNSwgMTMsIDExLFxuICA5LCA3LCAxNSwgMTEsIDgsIDYsIDYsIDE0LCAxMiwgMTMsIDUsIDE0LCAxMywgMTMsIDcsIDUsXG4gIDE1LCA1LCA4LCAxMSwgMTQsIDE0LCA2LCAxNCwgNiwgOSwgMTIsIDksIDEyLCA1LCAxNSwgOCxcbiAgOCwgNSwgMTIsIDksIDEyLCA1LCAxNCwgNiwgOCwgMTMsIDYsIDUsIDE1LCAxMywgMTEsIDExXG5dO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbmZ1bmN0aW9uIEhtYWMoaGFzaCwga2V5LCBlbmMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEhtYWMpKVxuICAgIHJldHVybiBuZXcgSG1hYyhoYXNoLCBrZXksIGVuYyk7XG4gIHRoaXMuSGFzaCA9IGhhc2g7XG4gIHRoaXMuYmxvY2tTaXplID0gaGFzaC5ibG9ja1NpemUgLyA4O1xuICB0aGlzLm91dFNpemUgPSBoYXNoLm91dFNpemUgLyA4O1xuICB0aGlzLmlubmVyID0gbnVsbDtcbiAgdGhpcy5vdXRlciA9IG51bGw7XG5cbiAgdGhpcy5faW5pdCh1dGlscy50b0FycmF5KGtleSwgZW5jKSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEhtYWM7XG5cbkhtYWMucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gaW5pdChrZXkpIHtcbiAgLy8gU2hvcnRlbiBrZXksIGlmIG5lZWRlZFxuICBpZiAoa2V5Lmxlbmd0aCA+IHRoaXMuYmxvY2tTaXplKVxuICAgIGtleSA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoa2V5KS5kaWdlc3QoKTtcbiAgYXNzZXJ0KGtleS5sZW5ndGggPD0gdGhpcy5ibG9ja1NpemUpO1xuXG4gIC8vIEFkZCBwYWRkaW5nIHRvIGtleVxuICBmb3IgKHZhciBpID0ga2V5Lmxlbmd0aDsgaSA8IHRoaXMuYmxvY2tTaXplOyBpKyspXG4gICAga2V5LnB1c2goMCk7XG5cbiAgZm9yIChpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcbiAgICBrZXlbaV0gXj0gMHgzNjtcbiAgdGhpcy5pbm5lciA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoa2V5KTtcblxuICAvLyAweDM2IF4gMHg1YyA9IDB4NmFcbiAgZm9yIChpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcbiAgICBrZXlbaV0gXj0gMHg2YTtcbiAgdGhpcy5vdXRlciA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoa2V5KTtcbn07XG5cbkhtYWMucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIGVuYykge1xuICB0aGlzLmlubmVyLnVwZGF0ZShtc2csIGVuYyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuSG1hYy5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICB0aGlzLm91dGVyLnVwZGF0ZSh0aGlzLmlubmVyLmRpZ2VzdCgpKTtcbiAgcmV0dXJuIHRoaXMub3V0ZXIuZGlnZXN0KGVuYyk7XG59O1xuIiwKICAgICJ2YXIgaGFzaCA9IGV4cG9ydHM7XG5cbmhhc2gudXRpbHMgPSByZXF1aXJlKCcuL2hhc2gvdXRpbHMnKTtcbmhhc2guY29tbW9uID0gcmVxdWlyZSgnLi9oYXNoL2NvbW1vbicpO1xuaGFzaC5zaGEgPSByZXF1aXJlKCcuL2hhc2gvc2hhJyk7XG5oYXNoLnJpcGVtZCA9IHJlcXVpcmUoJy4vaGFzaC9yaXBlbWQnKTtcbmhhc2guaG1hYyA9IHJlcXVpcmUoJy4vaGFzaC9obWFjJyk7XG5cbi8vIFByb3h5IGhhc2ggZnVuY3Rpb25zIHRvIHRoZSBtYWluIG9iamVjdFxuaGFzaC5zaGExID0gaGFzaC5zaGEuc2hhMTtcbmhhc2guc2hhMjU2ID0gaGFzaC5zaGEuc2hhMjU2O1xuaGFzaC5zaGEyMjQgPSBoYXNoLnNoYS5zaGEyMjQ7XG5oYXNoLnNoYTM4NCA9IGhhc2guc2hhLnNoYTM4NDtcbmhhc2guc2hhNTEyID0gaGFzaC5zaGEuc2hhNTEyO1xuaGFzaC5yaXBlbWQxNjAgPSBoYXNoLnJpcGVtZC5yaXBlbWQxNjA7XG4iLAogICAgIm1vZHVsZS5leHBvcnRzID0ge1xuICBkb3VibGVzOiB7XG4gICAgc3RlcDogNCxcbiAgICBwb2ludHM6IFtcbiAgICAgIFtcbiAgICAgICAgJ2U2MGZjZTkzYjU5ZTllYzUzMDExYWFiYzIxYzIzZTk3YjJhMzEzNjliODdhNWFlOWM0NGVlODllMmE2ZGVjMGEnLFxuICAgICAgICAnZjdlMzUwNzM5OWU1OTU5MjlkYjk5ZjM0ZjU3OTM3MTAxMjk2ODkxZTQ0ZDIzZjBiZTFmMzJjY2U2OTYxNjgyMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODI4MjI2MzIxMmM2MDlkOWVhMmE2ZTNlMTcyZGUyMzhkOGMzOWNhYmQ1YWMxY2ExMDY0NmUyM2ZkNWY1MTUwOCcsXG4gICAgICAgICcxMWY4YTgwOTg1NTdkZmU0NWU4MjU2ZTgzMGI2MGFjZTYyZDYxM2FjMmY3YjE3YmVkMzFiNmVhZmY2ZTI2Y2FmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNzVlMTU5ZjcyOGI4NjVhNzJmOTljYzZjNmZjODQ2ZGUwYjkzODMzZmQyMjIyZWQ3M2ZjZTViNTUxZTViNzM5JyxcbiAgICAgICAgJ2QzNTA2ZTBkOWUzYzc5ZWJhNGVmOTdhNTFmZjcxZjVlYWNiNTk1NWFkZDI0MzQ1YzZlZmE2ZmZlZTlmZWQ2OTUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM2M2Q5MGQ0NDdiMDBjOWM5OWNlYWMwNWI2MjYyZWUwNTM0NDFjN2U1NTU1MmZmZTUyNmJhZDhmODNmZjQ2NDAnLFxuICAgICAgICAnNGUyNzNhZGZjNzMyMjIxOTUzYjQ0NTM5N2YzMzYzMTQ1YjlhODkwMDgxOTllY2I2MjAwM2M3ZjNiZWU5ZGU5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4YjRiNWYxNjVkZjNjMmJlOGM2MjQ0YjViNzQ1NjM4ODQzZTRhNzgxYTE1YmNkMWI2OWY3OWE1NWRmZmRmODBjJyxcbiAgICAgICAgJzRhYWQwYTZmNjhkMzA4YjRiM2ZiZDc4MTNhYjBkYTA0ZjllMzM2NTQ2MTYyZWU1NmIzZWZmMGM2NWZkNGZkMzYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzcyM2NiYWE2ZTVkYjk5NmQ2YmY3NzFjMDBiZDU0OGM3YjcwMGRiZmZhNmMwZTc3YmNiNjExNTkyNTIzMmZjZGEnLFxuICAgICAgICAnOTZlODY3YjU1OTVjYzQ5OGE5MjExMzc0ODg4MjRkNmUyNjYwYTA2NTM3Nzk0OTQ4MDFkYzA2OWQ5ZWIzOWY1ZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWViZmE0ZDQ5M2JlYmY5OGJhNWZlZWM4MTJjMmQzYjUwOTQ3OTYxMjM3YTkxOTgzOWE1MzNlY2EwZTdkZDdmYScsXG4gICAgICAgICc1ZDlhOGNhMzk3MGVmMGYyNjllZTdlZGFmMTc4MDg5ZDlhZTRjZGMzYTcxMWY3MTJkZGZkNGZkYWUxZGU4OTk5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxMDBmNDRkYTY5NmU3MTY3Mjc5MWQwYTA5YjdiZGU0NTlmMTIxNWEyOWIzYzAzYmZlZmQ3ODM1YjM5YTQ4ZGIwJyxcbiAgICAgICAgJ2NkZDllMTMxOTJhMDBiNzcyZWM4ZjMzMDBjMDkwNjY2YjdmZjRhMThmZjUxOTVhYzBmYmQ1Y2Q2MmJjNjVhMDknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UxMDMxYmUyNjJjN2VkMWIxZGM5MjI3YTRhMDRjMDE3YTc3ZjhkNDQ2NGYzYjM4NTJjOGFjZGU2ZTUzNGZkMmQnLFxuICAgICAgICAnOWQ3MDYxOTI4OTQwNDA1ZTZiYjZhNDE3NjU5NzUzNWFmMjkyZGQ0MTllMWNlZDc5YTQ0ZjE4ZjI5NDU2YTAwZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmVlYTZjYWU0NmQ1NWI1MzBhYzI4MzlmMTQzYmQ3ZWM1Y2Y4YjI2NmE0MWQ2YWY1MmQ1ZTY4OGQ5MDk0Njk2ZCcsXG4gICAgICAgICdlNTdjNmI2Yzk3ZGNlMWJhYjA2ZTRlMTJiZjNlY2Q1Yzk4MWM4OTU3Y2M0MTQ0MmQzMTU1ZGViZjE4MDkwMDg4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkYTY3YTkxZDkxMDQ5Y2RjYjM2N2JlNGJlNmZmY2EzY2ZlZWQ2NTdkODA4NTgzZGUzM2ZhOTc4YmMxZWM2Y2IxJyxcbiAgICAgICAgJzliYWNhYTM1NDgxNjQyYmM0MWY0NjNmN2VjOTc4MGU1ZGVjN2FkYzUwOGY3NDBhMTdlOWVhOGUyN2E2OGJlMWQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzUzOTA0ZmFhMGIzMzRjZGRhNmUwMDA5MzVlZjIyMTUxZWMwOGQwZjdiYjExMDY5ZjU3NTQ1Y2NjMWEzN2I3YzAnLFxuICAgICAgICAnNWJjMDg3ZDBiYzgwMTA2ZDg4YzllY2NhYzIwZDNjMWMxMzk5OTk4MWUxNDQzNDY5OWRjYjA5NmIwMjI3NzFjOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGU3YmNkMGJkMzU5ODNhNzcxOWNjYTc3NjRjYTkwNjc3OWI1M2EwNDNhOWI4YmNhZWZmOTU5ZjQzYWQ4NjA0NycsXG4gICAgICAgICcxMGI3NzcwYjJhM2RhNGIzOTQwMzEwNDIwY2E5NTE0NTc5ZTg4ZTJlNDdmZDY4YjNlYTEwMDQ3ZTg0NjAzNzJhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczODVlZWQzNGMxY2RmZjIxZTZkMDgxODY4OWI4MWJkZTcxYTdmNGYxODM5N2U2NjkwYTg0MWUxNTk5YzQzODYyJyxcbiAgICAgICAgJzI4M2JlYmMzZThlYTIzZjU2NzAxZGUxOWU5ZWJmNDU3NmIzMDRlZWMyMDg2ZGM4Y2MwNDU4ZmU1NTQyZTU0NTMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzZmOWQ5YjgwM2VjZjE5MTYzN2M3M2E0NDEzZGZhMTgwZmRkZjg0YTU5NDdmYmM5YzYwNmVkODZjM2ZhYzNhNycsXG4gICAgICAgICc3YzgwYzY4ZTYwMzA1OWJhNjliOGUyYTMwZTQ1YzRkNDdlYTRkZDJmNWMyODEwMDJkODY4OTA2MDNhODQyMTYwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMzIyZDQwMTI0M2M0ZTI1ODJhMjE0N2MxMDRkNmVjYmY3NzRkMTYzZGIwZjVlNTMxM2I3ZTBlNzQyZDBlNmJkJyxcbiAgICAgICAgJzU2ZTcwNzk3ZTk2NjRlZjViZmIwMTliYzRkZGFmOWI3MjgwNWY2M2VhMjg3M2FmNjI0ZjNhMmU5NmMyOGIyYTAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg1NjcyYzdkMmRlMGI3ZGEyYmQxNzcwZDg5NjY1ODY4NzQxYjNmOWFmNzY0MzM5NzcyMWQ3NGQyODEzNGFiODMnLFxuICAgICAgICAnN2M0ODFiOWI1YjQzYjJlYjYzNzQwNDliZmE2MmMyZTVlNzdmMTdmY2M1Mjk4ZjQ0YzhlMzA5NGY3OTAzMTNhNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTQ4YmY4MDliMTk4OGE0NmIwNmM5ZjE5MTk0MTNiMTBmOTIyNmM2MGY2Njg4MzJmZmQ5NTlhZjYwYzgyYTBhJyxcbiAgICAgICAgJzUzYTU2Mjg1NmRjYjY2NDZkYzZiNzRjNWQxYzM0MThjNmQ0ZGZmMDhjOTdjZDJiZWQ0Y2I3Zjg4ZDhjOGU1ODknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzYyNjBjZTdmNDYxODAxYzM0ZjA2N2NlMGYwMjg3M2E4ZjFiMGU0NGRmYzY5NzUyYWNjZWNkODE5ZjM4ZmQ4ZTgnLFxuICAgICAgICAnYmMyZGE4MmI2ZmE1YjU3MWE3ZjA5MDQ5Nzc2YTFlZjdlY2QyOTIyMzgwNTFjMTk4YzFhODRlOTViMmI0YWUxNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTUwMzdkZTBhZmMxZDhkNDNkODM0ODQxNGJiZjQxMDMwNDNlYzhmNTc1YmZkYzQzMjk1M2NjOGQyMDM3ZmEyZCcsXG4gICAgICAgICc0NTcxNTM0YmFhOTRkM2I1ZjlmOThkMDlmYjk5MGJkZGJkNWY1YjAzZWM0ODFmMTBlMGU1ZGM4NDFkNzU1YmRhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlMDYzNzJiMGY0YTIwN2FkZjVlYTkwNWU4ZjE3NzFiNGU3ZThkYmQxYzZhNmM1YjcyNTg2NmEwYWU0ZmNlNzI1JyxcbiAgICAgICAgJzdhOTA4OTc0YmNlMThjZmUxMmEyN2JiMmFkNWE0ODhjZDc0ODRhNzc4NzEwNDg3MGIyNzAzNGY5NGVlZTMxZGQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzIxM2M3YTcxNWNkNWQ0NTM1OGQwYmJmOWRjMGNlMDIyMDRiMTBiZGRlMmEzZjU4NTQwYWQ2OTA4ZDA1NTk3NTQnLFxuICAgICAgICAnNGI2ZGFkMGI1YWU0NjI1MDcwMTNhZDA2MjQ1YmExOTBiYjQ4NTBmNWYzNmE3ZWVkZGZmMmMyNzUzNGI0NThmMicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNGU3YzI3MmE3YWY0YjM0ZThkYmI5MzUyYTU0MTlhODdlMjgzOGM3MGFkYzYyY2RkZjBjYzNhM2IwOGZiZDUzYycsXG4gICAgICAgICcxNzc0OWM3NjZjOWQwYjE4ZTE2ZmQwOWY2ZGVmNjgxYjUzMGI5NjE0YmZmN2RkMzNlMGIzOTQxODE3ZGNhYWU2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmZWE3NGUzZGJlNzc4YjFiMTBmMjM4YWQ2MTY4NmFhNWM3NmUzZGIyYmU0MzA1NzYzMjQyN2UyODQwZmIyN2I2JyxcbiAgICAgICAgJzZlMDU2OGRiOWIwYjEzMjk3Y2Y2NzRkZWNjYjZhZjkzMTI2YjU5NmI5NzNmN2I3NzcwMWQzZGI3ZjIzY2I5NmYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc2ZTY0MTEzZjY3N2NmMGUxMGEyNTcwZDU5OTk2OGQzMTU0NGUxNzliNzYwNDMyOTUyYzAyYTQ0MTdiZGRlMzknLFxuICAgICAgICAnYzkwZGRmOGRlZTRlOTVjZjU3NzA2NmQ3MDY4MWYwZDM1ZTJhMzNkMmI1NmQyMDMyYjRiMTc1MmQxOTAxYWMwMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzczOGM1NmIwM2IyYWJlMWU4MjgxYmFhNzQzZjhmOWE4ZjdjYzY0M2RmMjZjYmVlM2FiMTUwMjQyYmNiYjg5MScsXG4gICAgICAgICc4OTNmYjU3ODk1MWFkMjUzN2Y3MThmMmVhY2JmYmJiYjgyMzE0ZWVmNzg4MGNmZTkxN2U3MzVkOTY5OWE4NGMzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkODk1NjI2NTQ4YjY1YjgxZTI2NGM3NjM3Yzk3Mjg3N2QxZDcyZTVmM2E5MjUwMTQzNzJlOWY2NTg4ZjZjMTRiJyxcbiAgICAgICAgJ2ZlYmZhYTM4ZjJiYzdlYWU3MjhlYzYwODE4YzM0MGViMDM0MjhkNjMyYmIwNjdlMTc5MzYzZWQ3NWQ3ZDk5MWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2I4ZGE5NDAzMmE5NTc1MThlYjBmNjQzMzU3MWU4NzYxY2VmZmM3MzY5M2U4NGVkZDQ5MTUwYTU2NGY2NzZlMDMnLFxuICAgICAgICAnMjgwNGRmYTQ0ODA1YTFlNGQ3Yzk5Y2M5NzYyODA4YjA5MmNjNTg0ZDk1ZmYzYjUxMTQ4OGU0ZTc0ZWZkZjZlNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTgwZmVhMTQ0NDFmYjMzYTdkOGFkYWI5NDc1ZDdmYWIyMDE5ZWZmYjUxNTZhNzkyZjFhMTE3NzhlM2MwZGY1ZCcsXG4gICAgICAgICdlZWQxZGU3ZjYzOGUwMDc3MWU4OTc2OGNhM2NhOTQ0NzJkMTU1ZTgwYWYzMjJlYTlmY2I0MjkxYjZhYzllYzc4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhMzAxNjk3YmRmY2Q3MDQzMTNiYTQ4ZTUxZDU2NzU0M2YyYTE4MjAzMWVmZDY5MTVkZGMwN2JiY2M0ZTE2MDcwJyxcbiAgICAgICAgJzczNzBmOTFjZmI2N2U0ZjUwODE4MDlmYTI1ZDQwZjliMTczNWRiZjdjMGExMWExMzBjMGQxYTA0MWUxNzdlYTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkwYWQ4NWIzODlkNmI5MzY0NjNmOWQwNTEyNjc4ZGUyMDhjYzMzMGIxMTMwN2ZmZmFiN2FjNjNlM2ZiMDRlZDQnLFxuICAgICAgICAnZTUwN2EzNjIwYTM4MjYxYWZmZGNiZDk0MjcyMjJiODM5YWVmYWJlMTU4Mjg5NGQ5OTFkNGQ0OGNiNmVmMTUwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4ZjY4YjlkMmY2M2I1ZjMzOTIzOWMxYWQ5ODFmMTYyZWU4OGM1Njc4NzIzZWEzMzUxYjdiNDQ0YzllYzRjMGRhJyxcbiAgICAgICAgJzY2MmE5ZjJkYmEwNjM5ODZkZTFkOTBjMmI2YmUyMTVkYmJlYTJjZmU5NTUxMGJmZGYyM2NiZjc5NTAxZmZmODInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U0ZjNmYjAxNzZhZjg1ZDY1ZmY5OWZmOTE5OGMzNjA5MWY0OGU4NjUwMzY4MWUzZTY2ODZmZDUwNTMyMzFlMTEnLFxuICAgICAgICAnMWU2MzYzM2FkMGVmNGYxYzE2NjFhNmQwZWEwMmI3Mjg2Y2M3ZTc0ZWM5NTFkMWM5ODIyYzM4NTc2ZmViNzNiYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGMwMGZhOWIxOGViZjMzMWViOTYxNTM3YTQ1YTQyNjZjNzAzNGYyZjBkNGUxZDA3MTZmYjZlYWUyMGVhZTI5ZScsXG4gICAgICAgICdlZmE0NzI2N2ZlYTUyMWExYTlkYzM0M2EzNzM2Yzk3NGMyZmFkYWZhODFlMzZjNTRlN2QyYTRjNjY3MDI0MTRiJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlN2EyNmNlNjlkZDQ4MjlmM2UxMGNlYzBhOWU5OGVkMzE0M2QwODRmMzA4YjkyYzA5OTdmZGRmYzYwY2IzZTQxJyxcbiAgICAgICAgJzJhNzU4ZTMwMGZhNzk4NGI0NzFiMDA2YTFhYWZiYjE4ZDBhNmIyYzA0MjBlODNlMjBlOGE5NDIxY2YyY2ZkNTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2I2NDU5ZTBlZTM2NjJlYzhkMjM1NDBjMjIzYmNiZGM1NzFjYmNiOTY3ZDc5NDI0ZjNjZjI5ZWIzZGU2YjgwZWYnLFxuICAgICAgICAnNjdjODc2ZDA2ZjNlMDZkZTFkYWRmMTZlNTY2MWRiM2M0YjNhZTZkNDhlMzViMmZmMzBiZjBiNjFhNzFiYTQ1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNjhhODBjODI4MGJiODQwNzkzMjM0YWExMThmMDYyMzFkNmYxZmM2N2U3M2M1YTVkZWRhMGY1YjQ5Njk0M2U4JyxcbiAgICAgICAgJ2RiOGJhOWZmZjRiNTg2ZDAwYzRiMWY5MTc3YjBlMjhiNWIwZTdiOGY3ODQ1Mjk1YTI5NGM4NDI2NmIxMzMxMjAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMyNGFlZDdkZjY1YzgwNDI1MmRjMDI3MDkwN2EzMGIwOTYxMmFlYjk3MzQ0OWNlYTQwOTU5ODBmYzI4ZDNkNWQnLFxuICAgICAgICAnNjQ4YTM2NTc3NGI2MWYyZmYxMzBjMGMzNWFlYzFmNGYxOTIxM2IwYzdlMzMyODQzOTY3MjI0YWY5NmFiN2M4NCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNGRmOWMxNDkxOWNkZTYxZjZkNTFkZmRiZTVmZWU1ZGNlZWM0MTQzYmE4ZDFjYTg4OGU4YmQzNzNmZDA1NGM5NicsXG4gICAgICAgICczNWVjNTEwOTJkODcyODA1MDk3NGMyM2ExZDg1ZDRiNWQ1MDZjZGMyODg0OTAxOTJlYmFjMDZjYWQxMGQ1ZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOWMzOTE5YTg0YTQ3NDg3MGZhZWQ4YTljMWNjNjYwMjE1MjM0ODkwNTRkN2YwMzA4Y2JmYzk5YzhhYzFmOThjZCcsXG4gICAgICAgICdkZGI4NGYwZjRhNGRkZDU3NTg0ZjA0NGJmMjYwZTY0MTkwNTMyNmY3NmM2NGM4ZTZiZTdlNWUwM2Q0ZmM1OTlkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2MDU3MTcwYjFkZDEyZmRmOGRlMDVmMjgxZDhlMDZiYjkxZTE0OTNhOGI5MWQ0Y2M1YTIxMzgyMTIwYTk1OWU1JyxcbiAgICAgICAgJzlhMWFmMGIyNmE2YTQ4MDdhZGQ5YTJkYWY3MWRmMjYyNDY1MTUyYmMzZWUyNGM2NWU4OTliZTkzMjM4NWEyYTgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E1NzZkZjhlMjNhMDg0MTE0MjE0MzlhNDUxOGRhMzE4ODBjZWYwZmJhN2Q0ZGYxMmIxYTY5NzNlZWNiOTQyNjYnLFxuICAgICAgICAnNDBhNmJmMjBlNzY2NDBiMmM5MmI5N2FmZTU4Y2Q4MmM0MzJlMTBhN2Y1MTRkOWYzZWU4YmUxMWFlMWIyOGVjOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzc3OGE3OGMyOGRlYzNlMzBhMDVmZTk2MjlkZThjMzhiYjMwZDFmNWNmOWEzYTIwOGY3NjM4ODliZTU4YWQ3MScsXG4gICAgICAgICczNDYyNmQ5YWI1YTViMjJmZjcwOThlMTJmMmZmNTgwMDg3YjM4NDExZmYyNGFjNTYzYjUxM2ZjMWZkOWY0M2FjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5Mjg5NTVlZTYzN2E4NDQ2MzcyOWZkMzBlN2FmZDJlZDVmOTYyNzRlNWFkN2U1Y2IwOWVkYTljMDZkOTAzYWMnLFxuICAgICAgICAnYzI1NjIxMDAzZDNmNDJhODI3Yjc4YTEzMDkzYTk1ZWVhYzNkMjZlZmE4YThkODNmYzUxODBlOTM1YmNkMDkxZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODVkMGZlZjNlYzZkYjEwOTM5OTA2NGYzYTBlM2IyODU1NjQ1YjRhOTA3YWQzNTQ1MjdhYWU3NTE2M2Q4Mjc1MScsXG4gICAgICAgICcxZjAzNjQ4NDEzYTM4YzBiZTI5ZDQ5NmU1ODJjZjU2NjNlODc1MWU5Njg3NzMzMTU4MmMyMzdhMjRlYjFmOTYyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmZjJiMGRjZTk3ZWVjZTk3YzFjOWI2MDQxNzk4Yjg1ZGZkZmI2ZDg4ODJkYTIwMzA4ZjU0MDQ4MjQ1MjYwODdlJyxcbiAgICAgICAgJzQ5M2QxM2ZlZjUyNGJhMTg4YWY0YzRkYzU0ZDA3OTM2YzdiN2VkNmZiOTBlMmNlYjJjOTUxZTAxZjBjMjk5MDcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzgyN2ZiYmU0YjFlODgwZWE5ZWQyYjJlNjMwMWIyMTJiNTdmMWVlMTQ4Y2Q2ZGQyODc4MGU1ZTJjZjg1NmUyNDEnLFxuICAgICAgICAnYzYwZjljOTIzYzcyN2IwYjcxYmVmMmM2N2QxZDEyNjg3ZmY3YTYzMTg2OTAzMTY2ZDYwNWI2OGJhZWMyOTNlYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWFhNjQ5ZjIxZjUxYmRiYWU3YmU0YWUzNGNlNmU1MjE3YTU4ZmRjZTdmNDdmOWFhN2YzYjU4ZmEyMTIwZTJiMycsXG4gICAgICAgICdiZTMyNzllZDViYmJiMDNhYzY5YTgwZjg5ODc5YWE1YTAxYTZiOTY1ZjEzZjdlNTlkNDdhNTMwNWJhNWFkOTNkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNGE0MmQ0M2M1Y2YxNjlkOTM5MWRmNmRlY2Y0MmVlNTQxYjZkOGYwYzlhMTM3NDAxZTIzNjMyZGRhMzRkMjRmJyxcbiAgICAgICAgJzRkOWY5MmU3MTZkMWM3MzUyNmZjOTljY2ZiOGFkMzRjZTg4NmVlZGZhOGQ4ZTRmMTNhN2Y3MTMxZGViYTk0MTQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzFlYzgwZmVmMzYwY2JkZDk1NDE2MGZhZGFiMzUyYjZiOTJiNTM1NzZhODhmZWE0OTQ3MTczYjlkNDMwMGJmMTknLFxuICAgICAgICAnYWVlZmU5Mzc1NmI1MzQwZDJmM2E0OTU4YTdhYmJmNWUwMTQ2ZTc3ZjYyOTVhMDdiNjcxY2RjMWNjMTA3Y2VmZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTQ2YTc3OGMwNDY3MGMyZjkxYjAwYWY0NjgwZGZhOGJjZTM0OTA3MTdkNThiYTg4OWRkYjU5MjgzNjY2NDJiZScsXG4gICAgICAgICdiMzE4ZTBlYzMzNTQwMjhhZGQ2Njk4MjdmOWQ0YjI4NzBhYWE5NzFkMmY3ZTVlZDFkMGIyOTc0ODNkODNlZmQwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmYTUwYzBmNjFkMjJlNWYwN2UzYWNlYmIxYWEwN2IxMjhkMDAxMjIwOWEyOGI5Nzc2ZDc2YTg3OTMxODBlZWY5JyxcbiAgICAgICAgJzZiODRjNjkyMjM5N2ViYTliNzJjZDI4NzIyODFhNjhhNWU2ODMyOTNhNTdhMjEzYjM4Y2Q4ZDdkM2Y0ZjI4MTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RhMWQ2MWQwY2E3MjFhMTFiMWE1YmY2YjdkODhlODQyMWEyODhhYjVkNWJiYTUyMjBlNTNkMzJiNWYwNjdlYzInLFxuICAgICAgICAnODE1N2Y1NWE3Yzk5MzA2Yzc5YzA3NjYxNjFjOTFlMjk2NmE3Mzg5OWQyNzliNDhhNjU1ZmJhMGYxYWQ4MzZmMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYThlMjgyZmYwYzk3MDY5MDcyMTVmZjk4ZThmZDQxNjYxNTMxMWRlMDQ0NmYxZTA2MmE3M2IwNjEwZDA2NGUxMycsXG4gICAgICAgICc3Zjk3MzU1YjhkYjgxYzA5YWJmYjdmM2M1YjI1MTU4ODhiNjc5YTNlNTBkZDZiZDZjZWY3YzczMTExZjRjYzBjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNzRhNTNiOWM5YTI4NTg3MmQzOWU1NmU2OTEzY2FiMTVkNTliMWZhNTEyNTA4YzAyMmYzODJkZTgzMTk0OTdjJyxcbiAgICAgICAgJ2NjYzlkYzM3YWJmYzljMTY1N2I0MTU1ZjJjNDdmOWU2NjQ2YjNhMWQ4Y2I5ODU0MzgzZGExM2FjMDc5YWZhNzMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzk1OTM5Njk4MTk0Mzc4NWMzZDNlNTdlZGY1MDE4Y2RiZTAzOWU3MzBlNDkxOGIzZDg4NGZkZmYwOTQ3NWI3YmEnLFxuICAgICAgICAnMmU3ZTU1Mjg4OGMzMzFkZDhiYTAzODZhNGI5Y2Q2ODQ5YzY1M2Y2NGM4NzA5Mzg1ZTliOGFiZjg3NTI0ZjJmZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDJhNjNhNTBhZTQwMWU1NmQ2NDVhMTE1M2IxMDlhOGZjY2EwYTQzZDU2MWZiYTJkYmI1MTM0MGM5ZDgyYjE1MScsXG4gICAgICAgICdlODJkODZmYjY0NDNmY2I3NTY1YWVlNThiMjk0ODIyMGE3MGY3NTBhZjQ4NGNhNTJkNDE0MjE3NGRjZjg5NDA1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2NDU4N2UyMzM1NDcxZWI4OTBlZTc4OTZkN2NmZGM4NjZiYWNiZGJkMzgzOTMxN2IzNDM2ZjliNDU2MTdlMDczJyxcbiAgICAgICAgJ2Q5OWZjZGQ1YmY2OTAyZTJhZTk2ZGQ2NDQ3YzI5OWExODViOTBhMzkxMzNhZWFiMzU4Mjk5ZTVlOWZhZjY1ODknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg0ODFiZGUwZTRlNGQ4ODViM2E1NDZkM2U1NDlkZTA0MmYwYWE2Y2VhMjUwZTdmZDM1OGQ2Yzg2ZGQ0NWU0NTgnLFxuICAgICAgICAnMzhlZTdiOGNiYTU0MDRkZDg0YTI1YmYzOWNlY2IyY2E5MDBhNzljNDJiMjYyZTU1NmQ2NGIxYjU5Nzc5MDU3ZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTM0NjRhNTdhNzgxMDJhYTYyYjY5NzlhZTgxN2Y0NjM3ZmZjZmVkM2M0YjFjZTMwYmNkNjMwM2Y2Y2FmNjY2YicsXG4gICAgICAgICc2OWJlMTU5MDA0NjE0NTgwZWY3ZTQzMzQ1M2NjYjBjYTQ4ZjMwMGE4MWQwOTQyZTEzZjQ5NWE5MDdmNmVjYzI3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiYzRhOWRmNWI3MTNmZTJlOWFlZjQzMGJjYzFkYzk3YTBjZDljY2VkZTJmMjg1ODhjYWRhM2EwZDJkODNmMzY2JyxcbiAgICAgICAgJ2QzYTgxY2E2ZTc4NWMwNjM4MzkzN2FkZjRiNzk4Y2FhNmU4YTlmYmZhNTQ3YjE2ZDc1OGQ2NjY1ODFmMzNjMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGMyOGE5N2JmODI5OGJjMGQyM2Q4Yzc0OTQ1MmEzMmU2OTRiNjVlMzBhOTQ3MmEzOTU0YWIzMGZlNTMyNGNhYScsXG4gICAgICAgICc0MGEzMDQ2M2EzMzA1MTkzMzc4ZmVkZjMxZjdjYzBlYjdhZTc4NGYwNDUxY2I5NDU5ZTcxZGM3M2NiZWY5NDgyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4ZWE5NjY2MTM5NTI3YThjMWRkOTRjZTRmMDcxZmQyM2M4YjM1MGM1YTRiYjMzNzQ4YzRiYTExMWZhY2NhZTAnLFxuICAgICAgICAnNjIwZWZhYmJjOGVlMjc4MmUyNGU3YzBjZmI5NWM1ZDczNWI3ODNiZTljZjBmOGU5NTVhZjM0YTMwZTYyYjk0NScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGQzNjI1ZmFlZjViYTA2MDc0NjY5NzE2YmJkMzc4OGQ4OWJkZGU4MTU5NTk5NjgwOTJmNzZjYzRlYjlhOTc4NycsXG4gICAgICAgICc3YTE4OGZhMzUyMGUzMGQ0NjFkYTI1MDEwNDU3MzFjYTk0MTQ2MTk4Mjg4MzM5NTkzN2Y2OGQwMGM2NDRhNTczJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmNzEwZDc5ZDllYjk2MjI5N2U0ZjYyMzJiNDBlOGY3ZmViMmJjNjM4MTQ2MTRkNjkyYzEyZGU3NTI0MDgyMjFlJyxcbiAgICAgICAgJ2VhOThlNjcyMzJkM2IzMjk1ZDNiNTM1NTMyMTE1Y2NhYzg2MTJjNzIxODUxNjE3NTI2YWU0N2E5Yzc3YmZjODInLFxuICAgICAgXSxcbiAgICBdLFxuICB9LFxuICBuYWY6IHtcbiAgICB3bmQ6IDcsXG4gICAgcG9pbnRzOiBbXG4gICAgICBbXG4gICAgICAgICdmOTMwOGEwMTkyNThjMzEwNDkzNDRmODVmODlkNTIyOWI1MzFjODQ1ODM2Zjk5YjA4NjAxZjExM2JjZTAzNmY5JyxcbiAgICAgICAgJzM4OGY3YjBmNjMyZGU4MTQwZmUzMzdlNjJhMzdmMzU2NjUwMGE5OTkzNGMyMjMxYjZjYjlmZDc1ODRiOGU2NzInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzJmOGJkZTRkMWEwNzIwOTM1NWI0YTcyNTBhNWM1MTI4ZTg4Yjg0YmRkYzYxOWFiN2NiYThkNTY5YjI0MGVmZTQnLFxuICAgICAgICAnZDhhYzIyMjYzNmU1ZTNkNmQ0ZGJhOWRkYTZjOWM0MjZmNzg4MjcxYmFiMGQ2ODQwZGNhODdkM2FhNmFjNjJkNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNWNiZGYwNjQ2ZTVkYjRlYWEzOThmMzY1ZjJlYTdhMGUzZDQxOWI3ZTAzMzBlMzljZTkyYmRkZWRjYWM0ZjliYycsXG4gICAgICAgICc2YWViY2E0MGJhMjU1OTYwYTMxNzhkNmQ4NjFhNTRkYmE4MTNkMGI4MTNmZGU3YjVhNTA4MjYyODA4NzI2NGRhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhY2Q0ODRlMmYwYzdmNjUzMDlhZDE3OGE5ZjU1OWFiZGUwOTc5Njk3NGM1N2U3MTRjMzVmMTEwZGZjMjdjY2JlJyxcbiAgICAgICAgJ2NjMzM4OTIxYjBhN2Q5ZmQ2NDM4MDk3MTc2M2I2MWU5YWRkODg4YTQzNzVmOGUwZjA1Y2MyNjJhYzY0ZjljMzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3NGFlN2Y4NThhOTQxMWU1ZWY0MjQ2YjcwYzY1YWFjNTY0OTk4MGJlNWMxNzg5MWJiZWMxNzg5NWRhMDA4Y2InLFxuICAgICAgICAnZDk4NGEwMzJlYjZiNWUxOTAyNDNkZDU2ZDdiN2IzNjUzNzJkYjFlMmRmZjlkNmE4MzAxZDc0YzljOTUzYzYxYicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjI4NzczYzJkOTc1Mjg4YmM3ZDFkMjA1YzM3NDg2NTFiMDc1ZmJjNjYxMGU1OGNkZGVlZGRmOGYxOTQwNWFhOCcsXG4gICAgICAgICdhYjA5MDJlOGQ4ODBhODk3NTgyMTJlYjY1Y2RhZjQ3M2ExYTA2ZGE1MjFmYTkxZjI5YjVjYjUyZGIwM2VkODEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q3OTI0ZDRmN2Q0M2VhOTY1YTQ2NWFlMzA5NWZmNDExMzFlNTk0NmYzYzg1Zjc5ZTQ0YWRiY2Y4ZTI3ZTA4MGUnLFxuICAgICAgICAnNTgxZTI4NzJhODZjNzJhNjgzODQyZWMyMjhjYzZkZWZlYTQwYWYyYmQ4OTZkM2E1YzUwNGRjOWZmNmEyNmI1OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGVmZGVhNGNkYjY3Nzc1MGE0MjBmZWU4MDdlYWNmMjFlYjk4OThhZTc5Yjk3Njg3NjZlNGZhYTA0YTJkNGEzNCcsXG4gICAgICAgICc0MjExYWIwNjk0NjM1MTY4ZTk5N2IwZWFkMmE5M2RhZWNlZDFmNGEwNGE5NWMwZjZjZmIxOTlmNjllNTZlYjc3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyYjRlYTBhNzk3YTQ0M2QyOTNlZjVjZmY0NDRmNDk3OWYwNmFjZmViZDdlODZkMjc3NDc1NjU2MTM4Mzg1YjZjJyxcbiAgICAgICAgJzg1ZTg5YmMwMzc5NDVkOTNiMzQzMDgzYjVhMWM4NjEzMWEwMWY2MGM1MDI2OTc2M2I1NzBjODU0ZTVjMDliN2EnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM1MmJiZjRhNGNkZDEyNTY0ZjkzZmEzMzJjZTMzMzMwMWQ5YWQ0MDI3MWY4MTA3MTgxMzQwYWVmMjViZTU5ZDUnLFxuICAgICAgICAnMzIxZWI0MDc1MzQ4ZjUzNGQ1OWMxODI1OWRkYTNlMWY0YTFiM2IyZTcxYjEwMzljNjdiZDNkOGJjZjgxOTk4YycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMmZhMjEwNGQ2YjM4ZDExYjAyMzAwMTA1NTk4NzkxMjRlNDJhYjhkZmVmZjVmZjI5ZGM5Y2RhZGQ0ZWNhY2MzZicsXG4gICAgICAgICcyZGUxMDY4Mjk1ZGQ4NjViNjQ1NjkzMzViZDVkZDgwMTgxZDcwZWNmYzg4MjY0ODQyM2JhNzZiNTMyYjdkNjcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkyNDgyNzliMDliNGQ2OGRhYjIxYTliMDY2ZWRkYTgzMjYzYzNkODRlMDk1NzJlMjY5Y2EwY2Q3ZjU0NTM3MTQnLFxuICAgICAgICAnNzMwMTZmN2JmMjM0YWFkZTVkMWFhNzFiZGVhMmIxZmYzZmMwZGUyYTg4NzkxMmZmZTU0YTMyY2U5N2NiMzQwMicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGFlZDRmMmJlM2E4YmYyNzhlNzAxMzJmYjBiZWI3NTIyZjU3MGUxNDRiZjYxNWMwN2U5OTZkNDQzZGVlODcyOScsXG4gICAgICAgICdhNjlkY2U0YTdkNmM5OGU4ZDRhMWFjYTg3ZWY4ZDcwMDNmODNjMjMwZjNhZmE3MjZhYjQwZTUyMjkwYmUxYzU1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjNDRkMTJjNzA2NWQ4MTJlOGFjZjI4ZDdjYmIxOWY5MDExZWNkOWU5ZmRmMjgxYjBlNmEzYjVlODdkMjJlN2RiJyxcbiAgICAgICAgJzIxMTlhNDYwY2UzMjZjZGM3NmM0NTkyNmM5ODJmZGFjMGUxMDZlODYxZWRmNjFjNWEwMzkwNjNmMGUwZTY0ODInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzZhMjQ1YmY2ZGM2OTg1MDRjODlhMjBjZmRlZDYwODUzMTUyYjY5NTMzNmMyODA2M2I2MWM2NWNiZDI2OWU2YjQnLFxuICAgICAgICAnZTAyMmNmNDJjMmJkNGE3MDhiM2Y1MTI2ZjE2YTI0YWQ4YjMzYmE0OGQwNDIzYjZlZmQ1ZTYzNDgxMDBkOGE4MicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTY5N2ZmYTZmZDlkZTYyN2MwNzdlM2QyZmU1NDEwODRjZTEzMzAwYjBiZWMxMTQ2Zjk1YWU1N2YwZDBiZDZhNScsXG4gICAgICAgICdiOWMzOThmMTg2ODA2ZjVkMjc1NjE1MDZlNDU1NzQzM2EyY2YxNTAwOWU0OThhZTdhZGVlOWQ2M2QwMWIyMzk2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2MDViZGIwMTk5ODE3MThiOTg2ZDBmMDdlODM0Y2IwZDlkZWI4MzYwZmZiN2Y2MWRmOTgyMzQ1ZWYyN2E3NDc5JyxcbiAgICAgICAgJzI5NzJkMmRlNGY4ZDIwNjgxYTc4ZDkzZWM5NmZlMjNjMjZiZmFlODRmYjE0ZGI0M2IwMWUxZTkwNTZiOGM0OScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjJkMTRkYWI0MTUwYmY0OTc0MDJmZGM0NWEyMTVlMTBkY2IwMWMzNTQ5NTliMTBjZmUzMWM3ZTlkODdmZjMzZCcsXG4gICAgICAgICc4MGZjMDZiZDhjYzViMDEwOTgwODhhMTk1MGVlZDBkYjAxYWExMzI5NjdhYjQ3MjIzNWY1NjQyNDgzYjI1ZWFmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4MGM2MGFkMDA0MGYyN2RhZGU1YjRiMDZjNDA4ZTU2YjJjNTBlOWY1NmI5YjhiNDI1ZTU1NWMyZjg2MzA4YjZmJyxcbiAgICAgICAgJzFjMzgzMDNmMWNjNWMzMGYyNmU2NmJhZDdmZTcyZjcwYTY1ZWVkNGNiZTcwMjRlYjFhYTAxZjU2NDMwYmQ1N2EnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzdhOTM3NWFkNjE2N2FkNTRhYTc0YzYzNDhjYzU0ZDM0NGNjNWRjOTQ4N2Q4NDcwNDlkNWVhYmIwZmEwM2M4ZmInLFxuICAgICAgICAnZDBlM2ZhOWVjYTg3MjY5MDk1NTllMGQ3OTI2OTA0NmJkYzU5ZWExMGM3MGNlMmIwMmQ0OTllYzIyNGRjN2Y3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNTI4ZWNkOWI2OTZiNTRjOTA3YTllZDA0NTQ0N2E3OWJiNDA4ZWMzOWI2OGRmNTA0YmI1MWY0NTliYzNmZmM5JyxcbiAgICAgICAgJ2VlY2Y0MTI1MzEzNmU1Zjk5OTY2ZjIxODgxZmQ2NTZlYmM0MzQ1NDA1YzUyMGRiYzA2MzQ2NWI1MjE0MDk5MzMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQ5MzcwYTRiNWY0MzQxMmVhMjVmNTE0ZThlY2RhZDA1MjY2MTE1ZTRhN2VjYjEzODcyMzE4MDhmOGI0NTk2MycsXG4gICAgICAgICc3NThmM2Y0MWFmZDZlZDQyOGIzMDgxYjA1MTJmZDYyYTU0YzNmM2FmYmI1YjY3NjRiNjUzMDUyYTEyOTQ5YzlhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3N2YyMzA5MzZlZTg4Y2JiZDczZGY5MzBkNjQ3MDJlZjg4MWQ4MTFlMGUxNDk4ZTJmMWMxM2ViMWZjMzQ1ZDc0JyxcbiAgICAgICAgJzk1OGVmNDJhNzg4NmI2NDAwYTA4MjY2ZTliYTFiMzc4OTZjOTUzMzBkOTcwNzdjYmJlOGViM2M3NjcxYzYwZDYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YyZGFjOTkxY2M0Y2U0YjllYTQ0ODg3ZTVjN2MwYmNlNThjODAwNzRhYjlkNGRiYWViMjg1MzFiNzczOWY1MzAnLFxuICAgICAgICAnZTBkZWRjOWIzYjJmOGRhZDRkYTFmMzJkZWMyNTMxZGY5ZWI1ZmJlYjA1OThlNGZkMWExMTdkYmE3MDNhM2MzNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDYzYjNkOWY2NjI2MjFmYjFiNGJlOGZiYmUyNTIwMTI1YTIxNmNkZmM5ZGFlM2RlYmNiYTQ4NTBjNjkwZDQ1YicsXG4gICAgICAgICc1ZWQ0MzBkNzhjMjk2YzM1NDMxMTQzMDZkZDg2MjJkN2M2MjJlMjdjOTcwYTFkZTMxY2IzNzdiMDFhZjczMDdlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMTZmODA0MjQ0ZTQ2ZTJhMDkyMzJkNGFmZjNiNTk5NzZiOThmYWMxNDMyOGEyZDFhMzI0OTZiNDk5OThmMjQ3JyxcbiAgICAgICAgJ2NlZGFiZDliODIyMDNmN2UxM2QyMDZmY2RmNGUzM2Q5MmE2YzUzYzI2ZTVjY2UyNmQ2NTc5OTYyYzRlMzFkZjYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2NhZjc1NDI3MmRjODQ1NjNiMDM1MmI3YTE0MzExYWY1NWQyNDUzMTVhY2UyN2M2NTM2OWUxNWY3MTUxZDQxZDEnLFxuICAgICAgICAnY2I0NzQ2NjBlZjM1ZjVmMmE0MWI2NDNmYTVlNDYwNTc1ZjRmYTliNzk2MjIzMmE1YzMyZjkwODMxOGEwNDQ3NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMjYwMGNhNGIyODJjYjk4NmY4NWQwZjE3MDk5NzlkOGI0NGEwOWMwN2NiODZkN2MxMjQ0OTdiYzg2ZjA4MjEyMCcsXG4gICAgICAgICc0MTE5Yjg4NzUzYzE1YmQ2YTY5M2IwM2ZjZGRiYjQ1ZDVhYzZiZTc0YWI1ZjBlZjQ0YjBiZTk0NzVhN2U0YjQwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NjM1Y2E3MmQ3ZTg0MzJjMzM4ZWM1M2NkMTIyMjBiYzAxYzQ4Njg1ZTI0ZjdkYzhjNjAyYTc3NDY5OThlNDM1JyxcbiAgICAgICAgJzkxYjY0OTYwOTQ4OWQ2MTNkMWQ1ZTU5MGY3OGU2ZDc0ZWNmYzA2MWQ1NzA0OGJhZDllNzZmMzAyYzViOWM2MScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzU0ZTMyMzlmMzI1NTcwY2RiYmY0YTg3ZGVlZThhNjZiN2YyYjMzNDc5ZDQ2OGZiYzFhNTA3NDNiZjU2Y2MxOCcsXG4gICAgICAgICc2NzNmYjg2ZTViZGEzMGZiM2NkMGVkMzA0ZWE0OWEwMjNlZTMzZDAxOTdhNjk1ZDBjNWQ5ODA5M2M1MzY2ODMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UzZTZiZDEwNzFhMWU5NmFmZjU3ODU5YzgyZDU3MGYwMzMwODAwNjYxZDFjOTUyZjlmZTI2OTQ2OTFkOWI5ZTgnLFxuICAgICAgICAnNTljOWUwYmJhMzk0ZTc2ZjQwYzBhYTU4Mzc5YTNjYjZhNWEyMjgzOTkzZTkwYzQxNjcwMDJhZjQ5MjBlMzdmNScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTg2YjQ4M2QwNTZhMDMzODI2YWU3M2Q4OGY3MzI5ODVjNGNjYjFmMzJiYTM1ZjRiNGNjNDdmZGNmMDRhYTZlYicsXG4gICAgICAgICczYjk1MmQzMmM2N2NmNzdlMmUxNzQ0NmUyMDQxODBhYjIxZmI4MDkwODk1MTM4YjRhNGE3OTdmODZlODA4ODhiJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkZjlkNzBhNmI5ODc2Y2U1NDRjOTg1NjFmNGJlNGY3MjU0NDJlNmQyYjczN2Q5YzkxYTgzMjE3MjRjZTA5NjNmJyxcbiAgICAgICAgJzU1ZWIyZGFmZDg0ZDZjY2Q1Zjg2MmI3ODVkYzM5ZDRhYjE1NzIyMjcyMGVmOWRhMjE3YjhjNDVjZjJiYTI0MTcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzVlZGQ1Y2MyM2M1MWU4N2E0OTdjYTgxNWQ1ZGNlMGY4YWI1MjU1NGY4NDllZDg5OTVkZTY0YzVmMzRjZTcxNDMnLFxuICAgICAgICAnZWZhZTljOGRiYzE0MTMwNjYxZThjZWMwMzBjODlhZDBjMTNjNjZjMGQxN2EyOTA1Y2RjNzA2YWI3Mzk5YTg2OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMjkwNzk4YzJiNjQ3NjgzMGRhMTJmZTAyMjg3ZTllNzc3YWEzZmJhMWMzNTViMTdhNzIyZDM2MmY4NDYxNGZiYScsXG4gICAgICAgICdlMzhkYTc2ZGNkNDQwNjIxOTg4ZDAwYmNmNzlhZjI1ZDViMjljMDk0ZGIyYTIzMTQ2ZDAwM2FmZDQxOTQzZTdhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhZjNjNDIzYTk1ZDlmNWIzMDU0NzU0ZWZhMTUwYWMzOWNkMjk1NTJmZTM2MDI1NzM2MmRmZGVjZWY0MDUzYjQ1JyxcbiAgICAgICAgJ2Y5OGEzZmQ4MzFlYjJiNzQ5YTkzYjBlNmYzNWNmYjQwYzhjZDVhYTY2N2ExNTU4MWJjMmZlZGVkNDk4ZmQ5YzYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc2NmRiYjI0ZDEzNGU3NDVjY2NhYTI4Yzk5YmYyNzQ5MDZiYjY2YjI2ZGNmOThkZjhkMmZlZDUwZDg4NDI0OWEnLFxuICAgICAgICAnNzQ0YjExNTJlYWNiZTVlMzhkY2M4ODc5ODBkYTM4Yjg5NzU4NGE2NWZhMDZjZWRkMmM5MjRmOTdjYmFjNTk5NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNTlkYmY0NmY4Yzk0NzU5YmEyMTI3N2MzMzc4NGY0MTY0NWY3YjQ0ZjZjNTk2YTU4Y2U5MmU2NjYxOTFhYmUzZScsXG4gICAgICAgICdjNTM0YWQ0NDE3NWZiYzMwMGY0ZWE2Y2U2NDgzMDlhMDQyY2U3MzlhNzkxOTc5OGNkODVlMjE2YzRhMzA3ZjZlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMTNhZGE5NTEwM2M0NTM3MzA1ZTY5MWU3NGU5YTRhOGRkNjQ3ZTcxMWE5NWU3M2NiNjJkYzYwMThjZmQ4N2I4JyxcbiAgICAgICAgJ2UxMzgxN2I0NGVlMTRkZTY2M2JmNGJjODA4MzQxZjMyNjk0OWUyMWE2YTc1YzI1NzA3Nzg0MTliZGFmNTczM2QnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3NTRiNGZhMGU4YWNlZDA2ZDQxNjdhMmM1OWNjYTRjZGExODY5YzA2ZWJhZGZiNjQ4ODU1MDAxNWE4ODUyMmMnLFxuICAgICAgICAnMzBlOTNlODY0ZTY2OWQ4MjIyNGI5NjdjMzAyMGI4ZmE4ZDFlNGUzNTBiNmNiY2M1MzdhNDhiNTc4NDExNjNhMicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTQ4ZGNhZGY1OTkwZTA0OGFhMzg3NGQ0NmFiZWY5ZDcwMTg1OGY5NWRlODA0MWQyYTY4MjhjOTllMjI2MjUxOScsXG4gICAgICAgICdlNDkxYTQyNTM3ZjZlNTk3ZDVkMjhhMzIyNGIxYmMyNWRmOTE1NGVmYmQyZWYxZDJjYmJhMmNhZTUzNDdkNTdlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3OTYyNDE0NDUwYzc2YzE2ODljN2I0OGY4MjAyZWMzN2ZiMjI0Y2Y1YWMwYmZhMTU3MDMyOGE4YTNkN2M3N2FiJyxcbiAgICAgICAgJzEwMGI2MTBlYzRmZmI0NzYwZDVjMWZjMTMzZWY2ZjZiMTI1MDdhMDUxZjA0YWM1NzYwYWZhNWIyOWRiODM0MzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM1MTQwODc4MzQ5NjRiNTRiMTViMTYwNjQ0ZDkxNTQ4NWExNjk3NzIyNWI4ODQ3YmIwZGQwODUxMzdlYzQ3Y2EnLFxuICAgICAgICAnZWYwYWZiYjIwNTYyMDU0NDhlMTY1MmM0OGU4MTI3ZmM2MDM5ZTc3YzE1YzIzNzhiN2U3ZDE1YTBkZTI5MzMxMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDNjYzMwYWQ2YjQ4M2U0YmM3OWNlMmM5ZGQ4YmM1NDk5M2U5NDdlYjhkZjc4N2I0NDI5NDNkM2Y3YjUyN2VhZicsXG4gICAgICAgICc4YjM3OGEyMmQ4MjcyNzhkODljNWU5YmU4Zjk1MDhhZTNjMmFkNDYyOTAzNTg2MzBhZmIzNGRiMDRlZWRlMGE0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNjI0ZDg0NzgwNzMyODYwY2UxYzc4ZmNiZmVmZTA4YjJiMjk4MjNkYjkxM2Y2NDkzOTc1YmEwZmY0ODQ3NjEwJyxcbiAgICAgICAgJzY4NjUxY2Y5YjZkYTkwM2UwOTE0NDQ4YzZjZDlkNGNhODk2ODc4ZjUyODJiZTRjOGNjMDZlMmE0MDQwNzg1NzUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzczM2NlODBkYTk1NWE4YTI2OTAyYzk1NjMzZTYyYTk4NTE5MjQ3NGI1YWYyMDdkYTZkZjdiNGZkNWZjNjFjZDQnLFxuICAgICAgICAnZjU0MzVhMmJkMmJhZGY3ZDQ4NWE0ZDhiOGRiOWZjY2UzZTFlZjhlMDIwMWU0NTc4YzU0NjczYmMxZGM1ZWExZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTVkOTQ0MTI1NDk0NTA2NGNmMWExYzMzYmJkM2I0OWY4OTY2YzUwOTIxNzFlNjk5ZWYyNThkZmFiODFjMDQ1YycsXG4gICAgICAgICdkNTZlYjMwYjY5NDYzZTcyMzRmNTEzN2I3M2I4NDE3NzQzNDgwMGJhY2ViZmM2ODVmYzM3YmJlOWVmZTQwNzBkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhMWQwZmNmMmVjOWRlNjc1YjYxMjEzNmU1Y2U3MGQyNzFjMjE0MTdjOWQyYjhhYWFhYzEzODU5OWQwNzE3OTQwJyxcbiAgICAgICAgJ2VkZDc3ZjUwYmNiNWEzY2FiMmU5MDczNzMwOTY2N2YyNjQxNDYyYTU0MDcwZjNkNTE5MjEyZDM5YzE5N2E2MjknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UyMmZiZTE1YzBhZjhjY2M1NzgwYzA3MzVmODRkYmU5YTc5MGJhZGVlODI0NWMwNmM3Y2EzNzMzMWNiMzY5ODAnLFxuICAgICAgICAnYTg1NWJhYmFkNWNkNjBjODhiNDMwYTY5ZjUzYTFhN2EzODI4OTE1NDk2NDc5OWJlNDNkMDZkNzdkMzFkYTA2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMTEwOTFkZDk4NjBlOGUyMGVlMTM0NzNjMTE1NWY1ZjY5NjM1ZTM5NDcwNGVhYTc0MDA5NDUyMjQ2Y2ZhOWIzJyxcbiAgICAgICAgJzY2ZGI2NTZmODdkMWYwNGZmZmQxZjA0Nzg4YzA2ODMwODcxZWM1YTY0ZmVlZTY4NWJkODBmMGIxMjg2ZDgzNzQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM0YzFmZDA0ZDMwMWJlODliMzFjMDQ0MmQzZTZhYzI0ODgzOTI4YjQ1YTkzNDA3ODE4NjdkNDIzMmVjMmRiZGYnLFxuICAgICAgICAnOTQxNDY4NWU5N2IxYjU5NTRiZDQ2ZjczMDE3NDEzNmQ1N2YxY2VlYjQ4NzQ0M2RjNTMyMTg1N2JhNzNhYmVlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMjE5ZWE1ZDZiNTQ3MDFjMWMxNGRlNWI1NTdlYjQyYThkMTNmM2FiYmNkMDhhZmZjYzJhNWU2YjA0OWI4ZDYzJyxcbiAgICAgICAgJzRjYjk1OTU3ZTgzZDQwYjBmNzNhZjQ1NDRjY2NmNmIxZjRiMDhkM2MwN2IyN2ZiOGQ4YzI5NjJhNDAwNzY2ZDEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q3Yjg3NDBmNzRhOGZiYWFiMWY2ODNkYjhmNDVkZTI2NTQzYTU0OTBiY2E2MjcwODcyMzY5MTI0NjlhMGI0NDgnLFxuICAgICAgICAnZmE3Nzk2ODEyOGQ5YzkyZWUxMDEwZjMzN2FkNDcxN2VmZjE1ZGI1ZWQzYzA0OWIzNDExZTAzMTVlYWE0NTkzYicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzJkMzFjMjIyZjhmNmYwZWY4NmY3Yzk4ZDNhMzMzNWVhZDViY2QzMmFiZGQ5NDI4OWZlNGQzMDkxYWE4MjRiZicsXG4gICAgICAgICc1ZjMwMzJmNTg5MjE1NmUzOWNjZDNkNzkxNWI5ZTFkYTJlNmRhYzllNmYyNmU5NjExMThkMTRiODQ2MmUxNjYxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NDYxZjM3MTkxNGFiMzI2NzEwNDVhMTU1ZDk4MzFlYTg3OTNkNzdjZDU5NTkyYzQzNDBmODZjYmMxODM0N2I1JyxcbiAgICAgICAgJzhlYzBiYTIzOGI5NmJlYzBjYmRkZGNhZTBhYTQ0MjU0MmVlZTFmZjUwYzk4NmVhNmIzOTg0N2IzY2MwOTJmZjYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VlMDc5YWRiMWRmMTg2MDA3NDM1NmEyNWFhMzgyMDZhNmQ3MTZiMmMzZTY3NDUzZDI4NzY5OGJhZDdiMmIyZDYnLFxuICAgICAgICAnOGRjMjQxMmFhZmUzYmU1YzRjNWYzN2UwZWNjNWY5ZjZhNDQ2OTg5YWYwNGM0ZTI1ZWJhYWM0NzllYzFjOGMxZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTZlYzkzZTQ0N2VjODNmMDQ2N2IxODMwMmVlNjIwZjdlNjVkZTMzMTg3NGM5ZGM3MmJmZDg2MTZiYTlkYTZiNScsXG4gICAgICAgICc1ZTQ2MzExNTBlNjJmYjQwZDBlOGMyYTdjYTU4MDRhMzlkNTgxODZhNTBlNDk3MTM5NjI2Nzc4ZTI1YjA2NzRkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlYWE1Zjk4MGMyNDVmNmYwMzg5NzgyOTBhZmE3MGI2YmQ4ODU1ODk3Zjk4YjZhYTQ4NWI5NjA2NWQ1MzdiZDk5JyxcbiAgICAgICAgJ2Y2NWY1ZDNlMjkyYzJlMDgxOWE1MjgzOTFjOTk0NjI0ZDc4NDg2OWQ3ZTZlYTY3ZmIxODA0MTAyNGVkYzA3ZGMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc4Yzk0MDc1NDRhYzEzMjY5MmVlMTkxMGEwMjQzOTk1OGFlMDQ4NzcxNTEzNDJlYTk2YzRiNmIzNWE0OWY1MScsXG4gICAgICAgICdmM2UwMzE5MTY5ZWI5Yjg1ZDU0MDQ3OTU1MzlhNWU2OGZhMWZiZDU4M2MwNjRkMjQ2MmI2NzVmMTk0YTNkZGI0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0OTRmNGJlMjE5YTFhNzcwMTZkY2Q4Mzg0MzFhZWEwMDAxY2RjOGFlN2E2ZmM2ODg3MjY1NzhkOTcwMjg1N2E1JyxcbiAgICAgICAgJzQyMjQyYTk2OTI4M2E1ZjMzOWJhN2YwNzVlMzZiYTJhZjkyNWNlMzBkNzY3ZWQ2ZTU1ZjRiMDMxODgwZDU2MmMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E1OThhODAzMGRhNmQ4NmM2YmM3ZjJmNTE0NGVhNTQ5ZDI4MjExZWE1OGZhYTcwZWJmNGMxZTY2NWMxZmU5YjUnLFxuICAgICAgICAnMjA0YjVkNmY4NDgyMmMzMDdlNGI0YTcxNDA3MzdhZWMyM2ZjNjNiNjViMzVmODZhMTAwMjZkYmQyZDg2NGU2YicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzQxOTE2MzY1YWJiMmI1ZDA5MTkyZjVmMmRiZWFmZWMyMDhmMDIwZjEyNTcwYTE4NGRiYWRjM2U1ODU5NTk5NycsXG4gICAgICAgICc0ZjE0MzUxZDAwODdlZmE0OWQyNDViMzI4OTg0OTg5ZDVjYWY5NDUwZjM0YmZjMGVkMTZlOTZiNThmYTk5MTMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg0MWQ2MDYzYTU4NmZhNDc1YTcyNDYwNGRhMDNiYzViOTJhMmUwZDJlMGEzNmFjZmU0YzczYTU1MTQ3NDI4ODEnLFxuICAgICAgICAnNzM4NjdmNTljMDY1OWU4MTkwNGY5YTFjNzU0MzY5OGU2MjU2MmQ2NzQ0YzE2OWNlN2EzNmRlMDFhOGQ2MTU0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1ZTk1YmIzOTlhNjk3MWQzNzYwMjY5NDdmODliZGUyZjI4MmIzMzgxMDkyOGJlNGRlZDExMmFjNGQ3MGUyMGQ1JyxcbiAgICAgICAgJzM5ZjIzZjM2NjgwOTA4NWJlZWJmYzcxMTgxMzEzNzc1YTk5YzlhZWQ3ZDhiYTM4YjE2MTM4NGM3NDYwMTI4NjUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM2ZTQ2NDFhNTM5NDhmZDQ3NmMzOWY4YTk5ZmQ5NzRlNWVjMDc1NjRiNTMxNWQ4YmY5OTQ3MWJjYTBlZjJmNjYnLFxuICAgICAgICAnZDI0MjRiMWIxYWJlNGViODE2NDIyN2IwODVjOWFhOTQ1NmVhMTM0OTNmZDU2M2UwNmZkNTFjZjU2OTRjNzhmYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzM2NTgxZWE3YmZiYmIyOTBjMTkxYTJmNTA3YTQxY2Y1NjQzODQyMTcwZTkxNGZhZWFiMjdjMmM1NzlmNzI2JyxcbiAgICAgICAgJ2VhZDEyMTY4NTk1ZmUxYmU5OTI1MjEyOWI2ZTU2YjMzOTFmN2FiMTQxMGNkMWUwZWYzZGNkY2FiZDJmZGEyMjQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhhYjg5ODE2ZGFkZmQ2YjZhMWYyNjM0ZmNmMDBlYzg0MDM3ODEwMjVlZDY4OTBjNDg0OTc0MjcwNmJkNDNlZGUnLFxuICAgICAgICAnNmZkY2VmMDlmMmY2ZDBhMDQ0ZTY1NGFlZjYyNDEzNmY1MDNkNDU5YzNlODk4NDU4NThhNDdhOTEyOWNkZDI0ZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMWUzM2YxYTc0NmM5YzU3NzgxMzMzNDRkOTI5OWZjYWEyMGIwOTM4ZThhY2ZmMjU0NGJiNDAyODRiOGM1ZmI5NCcsXG4gICAgICAgICc2MDY2MDI1N2RkMTFiM2FhOWM4ZWQ2MThkMjRlZGZmMjMwNmQzMjBmMWQwMzAxMGUzM2E3ZDIwNTdmM2IzYjYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg1YjdjMWRjYjNjZWMxYjdlZTdmMzBkZWQ3OWRkMjBhMGVkMWY0Y2MxOGNiY2ZjZmE0MTAzNjFmZDhmMDhmMzEnLFxuICAgICAgICAnM2Q5OGE5Y2RkMDI2ZGQ0M2YzOTA0OGYyNWE4ODQ3ZjRmY2FmYWQxODk1ZDdhNjMzYzZmZWQzYzM1ZTk5OTUxMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMjlkZjlmYmQ4ZDllNDY1MDkyNzVmNGIxMjVkNmQ0NWQ3ZmJlOWEzYjg3OGE3YWY4NzJhMjgwMDY2MWFjNWY1MScsXG4gICAgICAgICdiNGM0ZmU5OWM3NzVhNjA2ZTJkODg2MjE3OTEzOWZmZGE2MWRjODYxYzAxOWU1NWNkMjg3NmViMmEyN2Q4NGInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2EwYjFjYWUwNmIwYTg0N2EzZmVhNmU2NzFhYWY4YWRmZGZlNThjYTJmNzY4MTA1YzgwODJiMmU0NDlmY2UyNTInLFxuICAgICAgICAnYWU0MzQxMDJlZGRlMDk1OGVjNGIxOWQ5MTdhNmEyOGU2YjcyZGExODM0YWZmMGU2NTBmMDQ5NTAzYTI5NmNmMicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNGU4Y2VhZmI5YjNlOWExMzZkYzdmZjY3ZTg0MDI5NWI0OTlkZmIzYjIxMzNlNGJhMTEzZjJlNGMwZTEyMWU1JyxcbiAgICAgICAgJ2NmMjE3NDExOGM4YjZkN2E0YjQ4ZjZkNTM0Y2U1Yzc5NDIyYzA4NmE2MzQ2MDUwMmI4MjdjZTYyYTMyNjY4M2MnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QyNGE0NGUwNDdlMTliNmY1YWZiODFjN2NhMmY2OTA4MGE1MDc2Njg5YTAxMDkxOWY0MjcyNWMyYjc4OWEzM2InLFxuICAgICAgICAnNmZiOGQ1NTkxYjQ2NmY4ZmM2M2RiNTBmMWMwZjFjNjkwMTNmOTk2ODg3YjgyNDRkMmNkZWM0MTdhZmVhOGZhMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWEwMTYwNmE3YTZjOWNkZDI0OWZkZmNmYWNiOTk1ODQwMDFlZGQyOGFiYmFiNzdiNTEwNGU5OGU4ZTNiMzVkNCcsXG4gICAgICAgICczMjJhZjQ5MDhjNzMxMmIwY2ZiZmUzNjlmN2E3YjNjZGI3ZDQ0OTRiYzI4MjM3MDBjZmQ2NTIxODhhM2VhOThkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhZjhhZGRiZjJiNjYxYzhhNmM2MzI4NjU1ZWI5NjY1MTI1MjAwN2Q4YzVlYTMxYmU0YWQxOTZkZThjZTIxMzFmJyxcbiAgICAgICAgJzY3NDllNjdjMDI5Yjg1ZjUyYTAzNGVhZmQwOTY4MzZiMjUyMDgxODY4MGUyNmFjOGYzZGZiY2RiNzE3NDk3MDAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UzYWUxOTc0NTY2Y2EwNmNjNTE2ZDQ3ZTBmYjE2NWE2NzRhM2RhYmNmY2ExNWU3MjJmMGUzNDUwZjQ1ODg5JyxcbiAgICAgICAgJzJhZWFiZTdlNDUzMTUxMDExNjIxN2YwN2JmNGQwNzMwMGRlOTdlNDg3NGY4MWY1MzM0MjBhNzJlZWIwYmQ2YTQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzU5MWVlMzU1MzEzZDk5NzIxY2Y2OTkzZmZlZDFlM2UzMDE5OTNmZjNlZDI1ODgwMjA3NWVhOGNlZDM5N2UyNDYnLFxuICAgICAgICAnYjBlYTU1OGExMTNjMzBiZWE2MGZjNDc3NTQ2MGM3OTAxZmYwYjA1M2QyNWNhMmJkZWVlOThmMWE0YmU1ZDE5NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTEzOTZkNTVmZGE1NGM0OWYxOWFhOTczMThkOGRhNjFmYTg1ODRlNDdiMDg0OTQ1MDc3Y2YwMzI1NWI1Mjk4NCcsXG4gICAgICAgICc5OThjNzRhOGNkNDVhYzAxMjg5ZDU4MzNhN2JlYjQ3NDRmZjUzNmIwMWIyNTdiZTRjNTc2N2JlYTkzZWE1N2E0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczYzVkMmExYmEzOWM1YTE3OTAwMDA3MzhjOWUwYzQwYjhkY2RmZDU0Njg3NTRiNjQwNTU0MDE1N2UwMTdhYTdhJyxcbiAgICAgICAgJ2IyMjg0Mjc5OTk1YTM0ZTJmOWQ0ZGU3Mzk2ZmMxOGI4MGY5YjhiOWZkZDI3MGY2NjYxZjc5Y2E0YzgxYmQyNTcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2NjODcwNGI4YTYwYTBkZWZhM2E5OWE3Mjk5ZjJlOWMzZmJjMzk1YWZiMDRhYzA3ODQyNWVmOGExNzkzY2MwMzAnLFxuICAgICAgICAnYmRkNDYwMzlmZWVkMTc4ODFkMWUwODYyZGIzNDdmOGNmMzk1Yjc0ZmM0YmNkYzRlOTQwYjc0ZTNhYzFmMWIxMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzUzM2U0ZjdlYTg1NTVhYWNkOTc3N2FjNWNhZDI5Yjk3ZGQ0ZGVmY2NjNTNlZTdlYTIwNDExOWIyODg5YjE5NycsXG4gICAgICAgICc2ZjBhMjU2YmM1ZWZkZjQyOWEyZmI2MjQyZjFhNDNhMmQ5YjkyNWJiNGE0YjNhMjZiYjhlMGY0NWViNTk2MDk2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjMTRmOGYyY2NiMjdkNmYxMDlmNmQwOGQwM2NjOTZhNjliYThjMzRlZWMwN2JiY2Y1NjZkNDhlMzNkYTY1OTMnLFxuICAgICAgICAnYzM1OWQ2OTIzYmIzOThmN2ZkNDQ3M2UxNmZlMWMyODQ3NWI3NDBkZDA5ODA3NWU2YzBlODY0OTExM2RjM2EzOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTZjYmMzMDQ2YmM2YTQ1MGJhYzI0Nzg5ZmExNzExNWE0Yzk3MzllZDc1ZjhmMjFjZTQ0MWY3MmUwYjkwZTZlZicsXG4gICAgICAgICcyMWFlN2Y0NjgwZTg4OWJiMTMwNjE5ZTJjMGY5NWEzNjBjZWI1NzNjNzA2MDMxMzk4NjJhZmQ2MTdmYTliOWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM0N2Q2ZDlhMDJjNDg5MjdlYmZiODZjMTM1OWIxY2FmMTMwYTNjMDI2N2QxMWNlNjM0NGIzOWY5OWQ0M2NjMzgnLFxuICAgICAgICAnNjBlYTdmNjFhMzUzNTI0ZDFjOTg3ZjZlY2VjOTJmMDg2ZDU2NWFiNjg3ODcwY2IxMjY4OWZmMWUzMWM3NDQ0OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGE2NTQ1ZDIxODFkYjhkOTgzZjdkY2IzNzVlZjU4NjZkNDdjNjdiMWJmMzFjOGNmODU1ZWY3NDM3YjcyNjU2YScsXG4gICAgICAgICc0OWI5NjcxNWFiNjg3OGE3OWU3OGYwN2NlNTY4MGM1ZDY2NzMwNTFiNDkzNWJkODk3ZmVhODI0Yjc3ZGMyMDhhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjNDA3NDdjYzlkMDEyY2IxYTEzYjgxNDgzMDljNmRlN2VjMjVkNjk0NWQ2NTcxNDZiOWQ1OTk0YjhmZWIxMTExJyxcbiAgICAgICAgJzVjYTU2MDc1M2JlMmExMmZjNmRlNmNhZjJjYjQ4OTU2NWRiOTM2MTU2Yjk1MTRlMWJiNWU4MzAzN2UwZmEyZDQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRlNDJjOGVjODJjOTk3OThjY2YzYTYxMGJlODcwZTc4MzM4YzdmNzEzMzQ4YmQzNGM4MjAzZWY0MDM3ZjM1MDInLFxuICAgICAgICAnNzU3MWQ3NGVlNWUwZmI5MmE3YThiMzNhMDc3ODMzNDFhNTQ5MjE0NGNjNTRiY2M0MGE5NDQ3MzY5MzYwNjQzNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzc3NWFiNzA4OWJjNmFmODIzYWJhMmUxYWY3MGIyMzZkMjUxY2FkYjBjODY3NDMyODc1MjJhMWIzYjBkZWRlYScsXG4gICAgICAgICdiZTUyZDEwN2JjZmEwOWQ4YmNiOTczNmE4MjhjZmE3ZmFjOGRiMTdiZjdhNzZhMmM0MmFkOTYxNDA5MDE4Y2Y3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjZWUzMWNiZjdlMzRlYzM3OWQ5NGZiODE0ZDNkNzc1YWQ5NTQ1OTVkMTMxNGJhODg0Njk1OWUzZTgyZjc0ZTI2JyxcbiAgICAgICAgJzhmZDY0YTE0YzA2YjU4OWMyNmI5NDdhZTJiY2Y2YmZhMDE0OWVmMGJlMTRlZDRkODBmNDQ4YTAxYzQzYjFjNmQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2I0ZjllYWVhMDliNjkxNzYxOWY2ZWE2YTRlYjU0NjRlZmRkYjU4ZmQ0NWIxZWJlZmNkYzFhMDFkMDhiNDc5ODYnLFxuICAgICAgICAnMzllNWM5OTI1YjVhNTRiMDc0MzNhNGYxOGM2MTcyNmY4YmIxMzFjMDEyY2E1NDJlYjI0YThhYzA3MjAwNjgyYScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDQyNjNkZmMzZDJkZjkyM2EwMTc5YTQ4OTY2ZDMwY2U4NGUyNTE1YWZjM2RjY2MxYjc3OTA3NzkyZWJjYzYwZScsXG4gICAgICAgICc2MmRmYWYwN2EwZjc4ZmViMzBlMzBkNjI5NTg1M2NlMTg5ZTEyNzc2MGFkNmNmN2ZhZTE2NGUxMjJhMjA4ZDU0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0ODQ1NzUyNDgyMGZhNjVhNGY4ZDM1ZWI2OTMwODU3YzAwMzJhY2MwYTRhMmRlNDIyMjMzZWVkYTg5NzYxMmM0JyxcbiAgICAgICAgJzI1YTc0OGFiMzY3OTc5ZDk4NzMzYzM4YTFmYTFjMmU3ZGM2Y2MwN2RiMmQ2MGE5YWU3YTc2YWFhNDliZDBmNzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RmZWVlZjE4ODExMDFmMmNiMTE2NDRmM2EyYWZkZmMyMDQ1ZTE5OTE5MTUyOTIzZjM2N2ExNzY3YzExY2NlZGEnLFxuICAgICAgICAnZWNmYjcwNTZjZjFkZTA0MmY5NDIwYmFiMzk2NzkzYzBjMzkwYmRlNzRiNGJiZGZmMTZhODNhZTA5YTlhNzUxNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNmQ3ZWY2YjE3NTQzZjgzNzNjNTczZjQ0ZTFmMzg5ODM1ZDg5YmNiYzYwNjJjZWQzNmM4MmRmODNiOGZhZTg1OScsXG4gICAgICAgICdjZDQ1MGVjMzM1NDM4OTg2ZGZlZmExMGM1N2ZlYTliY2M1MjFhMDk1OWIyZDgwYmJmNzRiMTkwZGNhNzEyZDEwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNzU2MDVkNTkxMDJhNWEyNjg0NTAwZDNiOTkxZjJlM2YzYzg4YjkzMjI1NTQ3MDM1YWYyNWFmNjZlMDQ1NDFmJyxcbiAgICAgICAgJ2Y1YzU0NzU0YThmNzFlZTU0MGI5YjQ4NzI4NDczZTMxNGY3MjlhYzUzMDhiMDY5MzgzNjA5OTBlMmJmYWQxMjUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ViOTg2NjBmNGM0ZGZhYTA2YTJiZTQ1M2Q1MDIwYmM5OWEwYzJlNjBhYmUzODg0NTdkZDQzZmVmYjFlZDYyMGMnLFxuICAgICAgICAnNmNiOWE4ODc2ZDljYjg1MjA2MDlhZjNhZGQyNmNkMjBhMGE3Y2Q4YTk0MTExMzFjZTg1ZjQ0MTAwMDk5MjIzZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTNlODdiMDI3ZDg1MTRkMzU5MzlmMmU2ODkyYjE5OTIyMTU0NTk2OTQxODg4MzM2ZGMzNTYzZTNiOGRiYTk0MicsXG4gICAgICAgICdmZWY1YTNjNjgwNTlhNmRlYzVkNjI0MTE0YmYxZTkxYWFjMmI5ZGE1NjhkNmFiZWIyNTcwZDU1NjQ2YjhhZGYxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlZTE2MzAyNmU5ZmQ2ZmUwMTdjMzhmMDZhNWJlNmZjMTI1NDI0YjM3MWNlMjcwOGU3YmY0NDkxNjkxZTU3NjRhJyxcbiAgICAgICAgJzFhY2IyNTBmMjU1ZGQ2MWM0M2Q5NGNjYzY3MGQwZjU4ZjQ5YWUzZmExNWI5NjYyM2U1NDMwZGEwYWQ2YzYyYjInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2IyNjhmNWVmOWFkNTFlNGQ3OGRlM2E3NTBjMmRjODliMWU2MjZkNDM1MDU4Njc5OTk5MzJlNWRiMzNhZjNkODAnLFxuICAgICAgICAnNWYzMTBkNGIzYzk5YjllYmIxOWY3N2Q0MWMxZGVlMDE4Y2YwZDM0ZmQ0MTkxNjE0MDAzZTk0NWExMjE2ZTQyMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmYwN2YzMTE4YTlkZjAzNWU5ZmFkODVlYjZjN2JmZTQyYjAyZjAxY2E5OWNlZWEzYmY3ZmZkYmE5M2M0NzUwZCcsXG4gICAgICAgICc0MzgxMzZkNjAzZTg1OGEzYTVjNDQwYzM4ZWNjYmFkZGMxZDI5NDIxMTRlMmVkZGQ0NzQwZDA5OGNlZDFmMGQ4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4ZDhiOTg1NWM3YzA1MmEzNDE0NmZkMjBmZmI2NThiZWE0YjlmNjllMGQ4MjVlYmVjMTZlOGMzY2UyYjUyNmExJyxcbiAgICAgICAgJ2NkYjU1OWVlZGMyZDc5ZjkyNmJhZjQ0ZmI4NGVhNGQ0NGJjZjUwZmVlNTFkN2NlYjMwZTJlN2Y0NjMwMzY3NTgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzUyZGIwYjUzODRkZmJmMDViZmE5ZDQ3MmQ3YWUyNmRmZTRiODUxY2VjYTkxYjFlYmE1NDI2MzE4MGRhMzJiNjMnLFxuICAgICAgICAnYzNiOTk3ZDA1MGVlNWQ0MjNlYmFmNjZhNmRiOWY1N2IzMTgwYzkwMjg3NTY3OWRlOTI0YjY5ZDg0YTdiMzc1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNjJmOTQ5MGQzZDUxZGE2Mzk1ZWZkMjRlODA5MTljYzdkMGYyOWMzZjNmYTQ4YzZmZmY1NDNiZWNiZDQzMzUyJyxcbiAgICAgICAgJzZkODlhZDdiYTQ4NzZiMGIyMmMyY2EyODBjNjgyODYyZjM0MmM4NTkxZjFkYWY1MTcwZTA3YmZkOWNjYWZhN2QnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzdmMzBlYTI0NzZiMzk5YjQ5NTc1MDljODhmNzdkMDE5MWFmYTJmZjVjYjdiMTRmZDZkOGU3ZDY1YWFhYjExOTMnLFxuICAgICAgICAnY2E1ZWY3ZDRiMjMxYzk0YzNiMTUzODlhNWY2MzExZTlkYWZmN2JiNjdiMTAzZTk4ODBlZjRiZmY2MzdhY2FlYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNTA5OGZmMWUxZDlmMTRmYjQ2YTIxMGZhZGE2YzkwM2ZlZjBmYjdiNGExZGQxZDlhYzYwYTAzNjE4MDBiN2EwMCcsXG4gICAgICAgICc5NzMxMTQxZDgxZmM4ZjgwODRkMzdjNmU3NTQyMDA2YjNlZTFiNDBkNjBkZmU1MzYyYTViMTMyZmQxN2RkYzAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMyYjc4YzdkZTllZTUxMmE3Mjg5NWJlNmI5Y2JlZmE2ZTJmM2M0Y2NjZTQ0NWM5NmI5ZjJjODFlMjc3OGFkNTgnLFxuICAgICAgICAnZWUxODQ5ZjUxM2RmNzFlMzJlZmMzODk2ZWUyODI2MGM3M2JiODA1NDdhZTIyNzViYTQ5NzIzNzc5NGM4NzUzYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTJjYjc0ZmRkYzhlOWZiY2QwNzZlZWYyYTdjNzJiMGNlMzdkNTBmMDgyNjlkZmMwNzRiNTgxNTUwNTQ3YTRmNycsXG4gICAgICAgICdkM2FhMmVkNzFjOWRkMjI0N2E2MmRmMDYyNzM2ZWIwYmFkZGVhOWUzNjEyMmQyYmU4NjQxYWJjYjAwNWNjNGE0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NDM4NDQ3NTY2ZDRkN2JlZGFkYzI5OTQ5NmFiMzU3NDI2MDA5YTM1ZjIzNWNiMTQxYmUwZDk5Y2QxMGFlM2E4JyxcbiAgICAgICAgJ2M0ZTEwMjA5MTY5ODBhNGRhNWQwMWFjNWU2YWQzMzA3MzRlZjBkNzkwNjYzMWM0ZjIzOTA0MjZiMmVkZDc5MWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQxNjJkNDg4Yjg5NDAyMDM5YjU4NGM2ZmM2YzMwODg3MDU4N2Q5YzQ2ZjY2MGI4NzhhYjY1YzgyYzcxMWQ2N2UnLFxuICAgICAgICAnNjcxNjNlOTAzMjM2Mjg5Zjc3NmYyMmMyNWZiOGEzYWZjMTczMmYyYjg0YjRlOTVkYmRhNDdhZTVhMDg1MjY0OScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnM2ZhZDNmYTg0Y2FmMGYzNGYwZjg5YmZkMmRjZjU0ZmMxNzVkNzY3YWVjM2U1MDY4NGYzYmE0YTRiZjVmNjgzZCcsXG4gICAgICAgICdjZDFiYzdjYjZjYzQwN2JiMmYwY2E2NDdjNzE4YTczMGNmNzE4NzJlN2QwZDJhNTNmYTIwZWZjZGZlNjE4MjYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzY3NGYyNjAwYTMwMDdhMDA1NjhjMWE3Y2UwNWQwODE2YzFmYjg0YmYxMzcwNzk4ZjFjNjk1MzJmYWViMWE4NmInLFxuICAgICAgICAnMjk5ZDIxZjk0MTNmMzNiM2VkZjQzYjI1NzAwNDU4MGI3MGRiNTdkYTBiMTgyMjU5ZTA5ZWVjYzY5ZTBkMzhhNScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDMyZjRkYTU0YWRlNzRhYmI4MWI4MTVhZDFmYjNiMjYzZDgyZDZjNjkyNzE0YmNmZjg3ZDI5YmQ1ZWU5ZjA4ZicsXG4gICAgICAgICdmOTQyOWU3MzhiOGU1M2I5NjhlOTkwMTZjMDU5NzA3NzgyZTE0ZjQ1MzUzNTlkNTgyZmM0MTY5MTBiM2VlYTg3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMGU0ZTY3MDQzNTM4NTU1NmU1OTM2NTcxMzU4NDVkMzZmYmI2OTMxZjcyYjA4Y2IxZWQ5NTRmMWUzY2UzZmY2JyxcbiAgICAgICAgJzQ2MmY5YmNlNjE5ODk4NjM4NDk5MzUwMTEzYmJjOWIxMGE4NzhkMzVkYTcwNzQwZGM2OTVhNTU5ZWI4OGRiN2InLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2JlMjA2MjAwM2M1MWNjMzAwNDY4MjkwNDMzMGU0ZGVlN2YzZGNkMTBiMDFlNTgwYmYxOTcxYjA0ZDRjYWQyOTcnLFxuICAgICAgICAnNjIxODhiYzQ5ZDYxZTU0Mjg1NzNkNDhhNzRlMWM2NTViMWM2MTA5MDkwNTY4MmEwZDU1NThlZDcyZGNjYjliYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTMxNDQ0MjNhY2UzNDUxZWQyOWUwZmI5YWMyYWYyMTFjYjZlODRhNjAxZGY1OTkzYzQxOTg1OWZmZjVkZjA0YScsXG4gICAgICAgICc3YzEwZGZiMTY0YzM0MjVmNWM3MWEzZjlkNzk5MjAzOGYxMDY1MjI0ZjcyYmI5ZDFkOTAyYTZkMTMwMzdiNDdjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiMDE1ZjgwNDRmNWZjYmRjZjIxY2EyNmQ2YzM0ZmI4MTk3ODI5MjA1YzdiN2QyYTdjYjY2NDE4YzE1N2IxMTJjJyxcbiAgICAgICAgJ2FiOGMxZTA4NmQwNGU4MTM3NDRhNjU1YjJkZjhkNWY4M2IzY2RjNmZhYTMwODhjMWQzYWVhMTQ1NGUzYTFkNWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q1ZTllMWRhNjQ5ZDk3ZDg5ZTQ4NjgxMTdhNDY1YTNhNGY4YTE4ZGU1N2ExNDBkMzZiM2YyYWYzNDFhMjFiNTInLFxuICAgICAgICAnNGNiMDQ0MzdmMzkxZWQ3MzExMWExM2NjMWQ0ZGQwZGIxNjkzNDY1YzIyNDA0ODBkODk1NWU4NTkyZjI3NDQ3YScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDNhZTQxMDQ3ZGQ3Y2EwNjVkYmY4ZWQ3N2I5OTI0Mzk5ODMwMDVjZDcyZTE2ZDZmOTk2YTUzMTZkMzY5NjZiYicsXG4gICAgICAgICdiZDFhZWIyMWFkMjJlYmIyMmExMGYwMzAzNDE3YzZkOTY0ZjhjZGQ3ZGYwYWNhNjE0YjEwZGMxNGQxMjVhYzQ2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0NjNlMjc2M2Q4ODVmOTU4ZmM2NmNkZDIyODAwZjBhNDg3MTk3ZDBhODJlMzc3YjQ5ZjgwYWY4N2M4OTdiMDY1JyxcbiAgICAgICAgJ2JmZWZhY2RiMGU1ZDBmZDdkZjNhMzExYTk0ZGUwNjJiMjZiODBjNjFmYmM5NzUwOGI3OTk5MjY3MWVmN2NhN2YnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc5ODVmZGZkMTI3YzA1NjdjNmY1M2VjMWJiNjNlYzMxNThlNTk3YzQwYmZlNzQ3YzgzY2RkZmM5MTA2NDE5MTcnLFxuICAgICAgICAnNjAzYzEyZGFmM2Q5ODYyZWYyYjI1ZmUxZGUyODlhZWQyNGVkMjkxZTBlYzY3MDg3MDNhNWJkNTY3ZjMyZWQwMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzRhMWFkNmI1Zjc2ZTM5ZGIyZGQyNDk0MTBlYWM3Zjk5ZTc0YzU5Y2I4M2QyZDBlZDVmZjE1NDNkYTc3MDNlOScsXG4gICAgICAgICdjYzYxNTdlZjE4YzljNjNjZDYxOTNkODM2MzFiYmVhMDA5M2UwOTY4OTQyZThjMzNkNTczN2ZkNzkwZTBkYjA4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMDY4MmE1MDcwMzM3NWY2MDJkNDE2NjY0YmExOWI3ZmM5YmFiNDJjNzI3NDc0NjNhNzFkMDg5NmIyMmY2ZGEzJyxcbiAgICAgICAgJzU1M2UwNGY2YjAxOGI0ZmE2YzhmMzllN2YzMTFkMzE3NjI5MGQwZTBmMTljYTczZjE3NzE0ZDk5NzdhMjJmZjgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzllMjE1OGYwZDdjMGQ1ZjI2YzM3OTFlZmVmYTc5NTk3NjU0ZTdhMmIyNDY0ZjUyYjFlZTZjMTM0Nzc2OWVmNTcnLFxuICAgICAgICAnNzEyZmNkZDFiOTA1M2YwOTAwM2EzNDgxZmE3NzYyZTlmZmQ3YzhlZjM1YTM4NTA5ZTJmYmYyNjI5MDA4MzczJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNzZlMjY5ODlhNDNjOWNmZWJhNDAyOWMyMDI1MzhjMjgxNzJlNTY2ZTNjNGZjZTczMjI4NTdmM2JlMzI3ZDY2JyxcbiAgICAgICAgJ2VkOGNjOWQwNGIyOWViODc3ZDI3MGI0ODc4ZGM0M2MxOWFlZmQzMWY0ZWVlMDllZTdiNDc4MzRjMWZhNGIxYzMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc1ZDQ2ZWZlYTM3NzFlNmU2OGFiYjg5YTEzYWQ3NDdlY2YxODkyMzkzZGZjNGYxYjcwMDQ3ODhjNTAzNzRkYTgnLFxuICAgICAgICAnOTg1MjM5MGE5OTUwNzY3OWZkMGI4NmZkMmIzOWE4NjhkN2VmYzIyMTUxMzQ2ZTFhM2NhNDcyNjU4NmE2YmVkOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODA5YTIwYzY3ZDY0OTAwZmZiNjk4YzRjODI1ZjZkNWYyMzEwZmIwNDUxYzg2OTM0NWI3MzE5ZjY0NTYwNTcyMScsXG4gICAgICAgICc5ZTk5NDk4MGQ5OTE3ZTIyYjc2YjA2MTkyN2ZhMDQxNDNkMDk2Y2NjNTQ5NjNlNmE1ZWJmYTVmM2Y4ZTI4NmMxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxYjM4OTAzYTQzZjdmMTE0ZWQ0NTAwYjRlYWM3MDgzZmRlZmVjZTFjZjI5YzYzNTI4ZDU2MzQ0NmY5NzJjMTgwJyxcbiAgICAgICAgJzQwMzZlZGM5MzFhNjBhZTg4OTM1M2Y3N2ZkNTNkZTRhMjcwOGIyNmI2ZjVkYTcyYWQzMzk0MTE5ZGFmNDA4ZjknLFxuICAgICAgXSxcbiAgICBdLFxuICB9LFxufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VydmVzID0gZXhwb3J0cztcblxudmFyIGhhc2ggPSByZXF1aXJlKCdoYXNoLmpzJyk7XG52YXIgY3VydmUgPSByZXF1aXJlKCcuL2N1cnZlJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIFByZXNldEN1cnZlKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMudHlwZSA9PT0gJ3Nob3J0JylcbiAgICB0aGlzLmN1cnZlID0gbmV3IGN1cnZlLnNob3J0KG9wdGlvbnMpO1xuICBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdlZHdhcmRzJylcbiAgICB0aGlzLmN1cnZlID0gbmV3IGN1cnZlLmVkd2FyZHMob3B0aW9ucyk7XG4gIGVsc2VcbiAgICB0aGlzLmN1cnZlID0gbmV3IGN1cnZlLm1vbnQob3B0aW9ucyk7XG4gIHRoaXMuZyA9IHRoaXMuY3VydmUuZztcbiAgdGhpcy5uID0gdGhpcy5jdXJ2ZS5uO1xuICB0aGlzLmhhc2ggPSBvcHRpb25zLmhhc2g7XG5cbiAgYXNzZXJ0KHRoaXMuZy52YWxpZGF0ZSgpLCAnSW52YWxpZCBjdXJ2ZScpO1xuICBhc3NlcnQodGhpcy5nLm11bCh0aGlzLm4pLmlzSW5maW5pdHkoKSwgJ0ludmFsaWQgY3VydmUsIEcqTiAhPSBPJyk7XG59XG5jdXJ2ZXMuUHJlc2V0Q3VydmUgPSBQcmVzZXRDdXJ2ZTtcblxuZnVuY3Rpb24gZGVmaW5lQ3VydmUobmFtZSwgb3B0aW9ucykge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VydmVzLCBuYW1lLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjdXJ2ZSA9IG5ldyBQcmVzZXRDdXJ2ZShvcHRpb25zKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdXJ2ZXMsIG5hbWUsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogY3VydmUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjdXJ2ZTtcbiAgICB9LFxuICB9KTtcbn1cblxuZGVmaW5lQ3VydmUoJ3AxOTInLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiAncDE5MicsXG4gIHA6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZicsXG4gIGE6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmYycsXG4gIGI6ICc2NDIxMDUxOSBlNTljODBlNyAwZmE3ZTlhYiA3MjI0MzA0OSBmZWI4ZGVlYyBjMTQ2YjliMScsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiA5OWRlZjgzNiAxNDZiYzliMSBiNGQyMjgzMScsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICcxODhkYTgwZSBiMDMwOTBmNiA3Y2JmMjBlYiA0M2ExODgwMCBmNGZmMGFmZCA4MmZmMTAxMicsXG4gICAgJzA3MTkyYjk1IGZmYzhkYTc4IDYzMTAxMWVkIDZiMjRjZGQ1IDczZjk3N2ExIDFlNzk0ODExJyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDIyNCcsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6ICdwMjI0JyxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxJyxcbiAgYTogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlJyxcbiAgYjogJ2I0MDUwYTg1IDBjMDRiM2FiIGY1NDEzMjU2IDUwNDRiMGI3IGQ3YmZkOGJhIDI3MGIzOTQzIDIzNTVmZmI0JyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmYxNmEyIGUwYjhmMDNlIDEzZGQyOTQ1IDVjNWMyYTNkJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJ2I3MGUwY2JkIDZiYjRiZjdmIDMyMTM5MGI5IDRhMDNjMWQzIDU2YzIxMTIyIDM0MzI4MGQ2IDExNWMxZDIxJyxcbiAgICAnYmQzNzYzODggYjVmNzIzZmIgNGMyMmRmZTYgY2Q0Mzc1YTAgNWEwNzQ3NjQgNDRkNTgxOTkgODUwMDdlMzQnLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdwMjU2Jywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogbnVsbCxcbiAgcDogJ2ZmZmZmZmZmIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmJyxcbiAgYTogJ2ZmZmZmZmZmIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZjJyxcbiAgYjogJzVhYzYzNWQ4IGFhM2E5M2U3IGIzZWJiZDU1IDc2OTg4NmJjIDY1MWQwNmIwIGNjNTNiMGY2IDNiY2UzYzNlIDI3ZDI2MDRiJyxcbiAgbjogJ2ZmZmZmZmZmIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGJjZTZmYWFkIGE3MTc5ZTg0IGYzYjljYWMyIGZjNjMyNTUxJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzZiMTdkMWYyIGUxMmM0MjQ3IGY4YmNlNmU1IDYzYTQ0MGYyIDc3MDM3ZDgxIDJkZWIzM2EwIGY0YTEzOTQ1IGQ4OThjMjk2JyxcbiAgICAnNGZlMzQyZTIgZmUxYTdmOWIgOGVlN2ViNGEgN2MwZjllMTYgMmJjZTMzNTcgNmIzMTVlY2UgY2JiNjQwNjggMzdiZjUxZjUnLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdwMzg0Jywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogbnVsbCxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmUgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmYnLFxuICBhOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZSBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmYycsXG4gIGI6ICdiMzMxMmZhNyBlMjNlZTdlNCA5ODhlMDU2YiBlM2Y4MmQxOSAxODFkOWM2ZSBmZTgxNDExMiAwMzE0MDg4ZiAnICtcbiAgICAgJzUwMTM4NzVhIGM2NTYzOThkIDhhMmVkMTlkIDJhODVjOGVkIGQzZWMyYWVmJyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGM3NjM0ZDgxICcgK1xuICAgICAnZjQzNzJkZGYgNTgxYTBkYjIgNDhiMGE3N2EgZWNlYzE5NmEgY2NjNTI5NzMnLFxuICBoYXNoOiBoYXNoLnNoYTM4NCxcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnYWE4N2NhMjIgYmU4YjA1MzcgOGViMWM3MWUgZjMyMGFkNzQgNmUxZDNiNjIgOGJhNzliOTggNTlmNzQxZTAgODI1NDJhMzggJyArXG4gICAgJzU1MDJmMjVkIGJmNTUyOTZjIDNhNTQ1ZTM4IDcyNzYwYWI3JyxcbiAgICAnMzYxN2RlNGEgOTYyNjJjNmYgNWQ5ZTk4YmYgOTI5MmRjMjkgZjhmNDFkYmQgMjg5YTE0N2MgZTlkYTMxMTMgYjVmMGI4YzAgJyArXG4gICAgJzBhNjBiMWNlIDFkN2U4MTlkIDdhNDMxZDdjIDkwZWEwZTVmJyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDUyMScsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6IG51bGwsXG4gIHA6ICcwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYnLFxuICBhOiAnMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZjJyxcbiAgYjogJzAwMDAwMDUxIDk1M2ViOTYxIDhlMWM5YTFmIDkyOWEyMWEwIGI2ODU0MGVlIGEyZGE3MjViICcgK1xuICAgICAnOTliMzE1ZjMgYjhiNDg5OTEgOGVmMTA5ZTEgNTYxOTM5NTEgZWM3ZTkzN2IgMTY1MmMwYmQgJyArXG4gICAgICczYmIxYmYwNyAzNTczZGY4OCAzZDJjMzRmMSBlZjQ1MWZkNCA2YjUwM2YwMCcsXG4gIG46ICcwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZhIDUxODY4NzgzIGJmMmY5NjZiIDdmY2MwMTQ4ICcgK1xuICAgICAnZjcwOWE1ZDAgM2JiNWM5YjggODk5YzQ3YWUgYmI2ZmI3MWUgOTEzODY0MDknLFxuICBoYXNoOiBoYXNoLnNoYTUxMixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnMDAwMDAwYzYgODU4ZTA2YjcgMDQwNGU5Y2QgOWUzZWNiNjYgMjM5NWI0NDIgOWM2NDgxMzkgJyArXG4gICAgJzA1M2ZiNTIxIGY4MjhhZjYwIDZiNGQzZGJhIGExNGI1ZTc3IGVmZTc1OTI4IGZlMWRjMTI3ICcgK1xuICAgICdhMmZmYThkZSAzMzQ4YjNjMSA4NTZhNDI5YiBmOTdlN2UzMSBjMmU1YmQ2NicsXG4gICAgJzAwMDAwMTE4IDM5Mjk2YTc4IDlhM2JjMDA0IDVjOGE1ZmI0IDJjN2QxYmQ5IDk4ZjU0NDQ5ICcgK1xuICAgICc1NzliNDQ2OCAxN2FmYmQxNyAyNzNlNjYyYyA5N2VlNzI5OSA1ZWY0MjY0MCBjNTUwYjkwMSAnICtcbiAgICAnM2ZhZDA3NjEgMzUzYzcwODYgYTI3MmMyNDAgODhiZTk0NzYgOWZkMTY2NTAnLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdjdXJ2ZTI1NTE5Jywge1xuICB0eXBlOiAnbW9udCcsXG4gIHByaW1lOiAncDI1NTE5JyxcbiAgcDogJzdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQnLFxuICBhOiAnNzZkMDYnLFxuICBiOiAnMScsXG4gIG46ICcxMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgMTRkZWY5ZGVhMmY3OWNkNiA1ODEyNjMxYTVjZjVkM2VkJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzknLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdlZDI1NTE5Jywge1xuICB0eXBlOiAnZWR3YXJkcycsXG4gIHByaW1lOiAncDI1NTE5JyxcbiAgcDogJzdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQnLFxuICBhOiAnLTEnLFxuICBjOiAnMScsXG4gIC8vIC0xMjE2NjUgKiAoMTIxNjY2XigtMSkpIChtb2QgUClcbiAgZDogJzUyMDM2Y2VlMmI2ZmZlNzMgOGNjNzQwNzk3Nzc5ZTg5OCAwMDcwMGE0ZDQxNDFkOGFiIDc1ZWI0ZGNhMTM1OTc4YTMnLFxuICBuOiAnMTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIDE0ZGVmOWRlYTJmNzljZDYgNTgxMjYzMWE1Y2Y1ZDNlZCcsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICcyMTY5MzZkM2NkNmU1M2ZlYzBhNGUyMzFmZGQ2ZGM1YzY5MmNjNzYwOTUyNWE3YjJjOTU2MmQ2MDhmMjVkNTFhJyxcblxuICAgIC8vIDQvNVxuICAgICc2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjU4JyxcbiAgXSxcbn0pO1xuXG52YXIgcHJlO1xudHJ5IHtcbiAgcHJlID0gcmVxdWlyZSgnLi9wcmVjb21wdXRlZC9zZWNwMjU2azEnKTtcbn0gY2F0Y2ggKGUpIHtcbiAgcHJlID0gdW5kZWZpbmVkO1xufVxuXG5kZWZpbmVDdXJ2ZSgnc2VjcDI1NmsxJywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogJ2syNTYnLFxuICBwOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZjMmYnLFxuICBhOiAnMCcsXG4gIGI6ICc3JyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGJhYWVkY2U2IGFmNDhhMDNiIGJmZDI1ZThjIGQwMzY0MTQxJyxcbiAgaDogJzEnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcblxuICAvLyBQcmVjb21wdXRlZCBlbmRvbW9ycGhpc21cbiAgYmV0YTogJzdhZTk2YTJiNjU3YzA3MTA2ZTY0NDc5ZWFjMzQzNGU5OWNmMDQ5NzUxMmY1ODk5NWMxMzk2YzI4NzE5NTAxZWUnLFxuICBsYW1iZGE6ICc1MzYzYWQ0Y2MwNWMzMGUwYTUyNjFjMDI4ODEyNjQ1YTEyMmUyMmVhMjA4MTY2NzhkZjAyOTY3YzFiMjNiZDcyJyxcbiAgYmFzaXM6IFtcbiAgICB7XG4gICAgICBhOiAnMzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTUnLFxuICAgICAgYjogJy1lNDQzN2VkNjAxMGU4ODI4NmY1NDdmYTkwYWJmZTRjMycsXG4gICAgfSxcbiAgICB7XG4gICAgICBhOiAnMTE0Y2E1MGY3YThlMmYzZjY1N2MxMTA4ZDlkNDRjZmQ4JyxcbiAgICAgIGI6ICczMDg2ZDIyMWE3ZDQ2YmNkZTg2YzkwZTQ5Mjg0ZWIxNScsXG4gICAgfSxcbiAgXSxcblxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICc3OWJlNjY3ZWY5ZGNiYmFjNTVhMDYyOTVjZTg3MGIwNzAyOWJmY2RiMmRjZTI4ZDk1OWYyODE1YjE2ZjgxNzk4JyxcbiAgICAnNDgzYWRhNzcyNmEzYzQ2NTVkYTRmYmZjMGUxMTA4YThmZDE3YjQ0OGE2ODU1NDE5OWM0N2QwOGZmYjEwZDRiOCcsXG4gICAgcHJlLFxuICBdLFxufSk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc2ggPSByZXF1aXJlKCdoYXNoLmpzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG5mdW5jdGlvbiBIbWFjRFJCRyhvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBIbWFjRFJCRykpXG4gICAgcmV0dXJuIG5ldyBIbWFjRFJCRyhvcHRpb25zKTtcbiAgdGhpcy5oYXNoID0gb3B0aW9ucy5oYXNoO1xuICB0aGlzLnByZWRSZXNpc3QgPSAhIW9wdGlvbnMucHJlZFJlc2lzdDtcblxuICB0aGlzLm91dExlbiA9IHRoaXMuaGFzaC5vdXRTaXplO1xuICB0aGlzLm1pbkVudHJvcHkgPSBvcHRpb25zLm1pbkVudHJvcHkgfHwgdGhpcy5oYXNoLmhtYWNTdHJlbmd0aDtcblxuICB0aGlzLl9yZXNlZWQgPSBudWxsO1xuICB0aGlzLnJlc2VlZEludGVydmFsID0gbnVsbDtcbiAgdGhpcy5LID0gbnVsbDtcbiAgdGhpcy5WID0gbnVsbDtcblxuICB2YXIgZW50cm9weSA9IHV0aWxzLnRvQXJyYXkob3B0aW9ucy5lbnRyb3B5LCBvcHRpb25zLmVudHJvcHlFbmMgfHwgJ2hleCcpO1xuICB2YXIgbm9uY2UgPSB1dGlscy50b0FycmF5KG9wdGlvbnMubm9uY2UsIG9wdGlvbnMubm9uY2VFbmMgfHwgJ2hleCcpO1xuICB2YXIgcGVycyA9IHV0aWxzLnRvQXJyYXkob3B0aW9ucy5wZXJzLCBvcHRpb25zLnBlcnNFbmMgfHwgJ2hleCcpO1xuICBhc3NlcnQoZW50cm9weS5sZW5ndGggPj0gKHRoaXMubWluRW50cm9weSAvIDgpLFxuICAgICAgICAgJ05vdCBlbm91Z2ggZW50cm9weS4gTWluaW11bSBpczogJyArIHRoaXMubWluRW50cm9weSArICcgYml0cycpO1xuICB0aGlzLl9pbml0KGVudHJvcHksIG5vbmNlLCBwZXJzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gSG1hY0RSQkc7XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIGluaXQoZW50cm9weSwgbm9uY2UsIHBlcnMpIHtcbiAgdmFyIHNlZWQgPSBlbnRyb3B5LmNvbmNhdChub25jZSkuY29uY2F0KHBlcnMpO1xuXG4gIHRoaXMuSyA9IG5ldyBBcnJheSh0aGlzLm91dExlbiAvIDgpO1xuICB0aGlzLlYgPSBuZXcgQXJyYXkodGhpcy5vdXRMZW4gLyA4KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLlYubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLktbaV0gPSAweDAwO1xuICAgIHRoaXMuVltpXSA9IDB4MDE7XG4gIH1cblxuICB0aGlzLl91cGRhdGUoc2VlZCk7XG4gIHRoaXMuX3Jlc2VlZCA9IDE7XG4gIHRoaXMucmVzZWVkSW50ZXJ2YWwgPSAweDEwMDAwMDAwMDAwMDA7ICAvLyAyXjQ4XG59O1xuXG5IbWFjRFJCRy5wcm90b3R5cGUuX2htYWMgPSBmdW5jdGlvbiBobWFjKCkge1xuICByZXR1cm4gbmV3IGhhc2guaG1hYyh0aGlzLmhhc2gsIHRoaXMuSyk7XG59O1xuXG5IbWFjRFJCRy5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShzZWVkKSB7XG4gIHZhciBrbWFjID0gdGhpcy5faG1hYygpXG4gICAgICAgICAgICAgICAgIC51cGRhdGUodGhpcy5WKVxuICAgICAgICAgICAgICAgICAudXBkYXRlKFsgMHgwMCBdKTtcbiAgaWYgKHNlZWQpXG4gICAga21hYyA9IGttYWMudXBkYXRlKHNlZWQpO1xuICB0aGlzLksgPSBrbWFjLmRpZ2VzdCgpO1xuICB0aGlzLlYgPSB0aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCk7XG4gIGlmICghc2VlZClcbiAgICByZXR1cm47XG5cbiAgdGhpcy5LID0gdGhpcy5faG1hYygpXG4gICAgICAgICAgICAgICAudXBkYXRlKHRoaXMuVilcbiAgICAgICAgICAgICAgIC51cGRhdGUoWyAweDAxIF0pXG4gICAgICAgICAgICAgICAudXBkYXRlKHNlZWQpXG4gICAgICAgICAgICAgICAuZGlnZXN0KCk7XG4gIHRoaXMuViA9IHRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKTtcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5yZXNlZWQgPSBmdW5jdGlvbiByZXNlZWQoZW50cm9weSwgZW50cm9weUVuYywgYWRkLCBhZGRFbmMpIHtcbiAgLy8gT3B0aW9uYWwgZW50cm9weSBlbmNcbiAgaWYgKHR5cGVvZiBlbnRyb3B5RW5jICE9PSAnc3RyaW5nJykge1xuICAgIGFkZEVuYyA9IGFkZDtcbiAgICBhZGQgPSBlbnRyb3B5RW5jO1xuICAgIGVudHJvcHlFbmMgPSBudWxsO1xuICB9XG5cbiAgZW50cm9weSA9IHV0aWxzLnRvQXJyYXkoZW50cm9weSwgZW50cm9weUVuYyk7XG4gIGFkZCA9IHV0aWxzLnRvQXJyYXkoYWRkLCBhZGRFbmMpO1xuXG4gIGFzc2VydChlbnRyb3B5Lmxlbmd0aCA+PSAodGhpcy5taW5FbnRyb3B5IC8gOCksXG4gICAgICAgICAnTm90IGVub3VnaCBlbnRyb3B5LiBNaW5pbXVtIGlzOiAnICsgdGhpcy5taW5FbnRyb3B5ICsgJyBiaXRzJyk7XG5cbiAgdGhpcy5fdXBkYXRlKGVudHJvcHkuY29uY2F0KGFkZCB8fCBbXSkpO1xuICB0aGlzLl9yZXNlZWQgPSAxO1xufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLmdlbmVyYXRlID0gZnVuY3Rpb24gZ2VuZXJhdGUobGVuLCBlbmMsIGFkZCwgYWRkRW5jKSB7XG4gIGlmICh0aGlzLl9yZXNlZWQgPiB0aGlzLnJlc2VlZEludGVydmFsKVxuICAgIHRocm93IG5ldyBFcnJvcignUmVzZWVkIGlzIHJlcXVpcmVkJyk7XG5cbiAgLy8gT3B0aW9uYWwgZW5jb2RpbmdcbiAgaWYgKHR5cGVvZiBlbmMgIT09ICdzdHJpbmcnKSB7XG4gICAgYWRkRW5jID0gYWRkO1xuICAgIGFkZCA9IGVuYztcbiAgICBlbmMgPSBudWxsO1xuICB9XG5cbiAgLy8gT3B0aW9uYWwgYWRkaXRpb25hbCBkYXRhXG4gIGlmIChhZGQpIHtcbiAgICBhZGQgPSB1dGlscy50b0FycmF5KGFkZCwgYWRkRW5jIHx8ICdoZXgnKTtcbiAgICB0aGlzLl91cGRhdGUoYWRkKTtcbiAgfVxuXG4gIHZhciB0ZW1wID0gW107XG4gIHdoaWxlICh0ZW1wLmxlbmd0aCA8IGxlbikge1xuICAgIHRoaXMuViA9IHRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKTtcbiAgICB0ZW1wID0gdGVtcC5jb25jYXQodGhpcy5WKTtcbiAgfVxuXG4gIHZhciByZXMgPSB0ZW1wLnNsaWNlKDAsIGxlbik7XG4gIHRoaXMuX3VwZGF0ZShhZGQpO1xuICB0aGlzLl9yZXNlZWQrKztcbiAgcmV0dXJuIHV0aWxzLmVuY29kZShyZXMsIGVuYyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gS2V5UGFpcihlYywgb3B0aW9ucykge1xuICB0aGlzLmVjID0gZWM7XG4gIHRoaXMucHJpdiA9IG51bGw7XG4gIHRoaXMucHViID0gbnVsbDtcblxuICAvLyBLZXlQYWlyKGVjLCB7IHByaXY6IC4uLiwgcHViOiAuLi4gfSlcbiAgaWYgKG9wdGlvbnMucHJpdilcbiAgICB0aGlzLl9pbXBvcnRQcml2YXRlKG9wdGlvbnMucHJpdiwgb3B0aW9ucy5wcml2RW5jKTtcbiAgaWYgKG9wdGlvbnMucHViKVxuICAgIHRoaXMuX2ltcG9ydFB1YmxpYyhvcHRpb25zLnB1Yiwgb3B0aW9ucy5wdWJFbmMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBLZXlQYWlyO1xuXG5LZXlQYWlyLmZyb21QdWJsaWMgPSBmdW5jdGlvbiBmcm9tUHVibGljKGVjLCBwdWIsIGVuYykge1xuICBpZiAocHViIGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gcHViO1xuXG4gIHJldHVybiBuZXcgS2V5UGFpcihlYywge1xuICAgIHB1YjogcHViLFxuICAgIHB1YkVuYzogZW5jLFxuICB9KTtcbn07XG5cbktleVBhaXIuZnJvbVByaXZhdGUgPSBmdW5jdGlvbiBmcm9tUHJpdmF0ZShlYywgcHJpdiwgZW5jKSB7XG4gIGlmIChwcml2IGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gcHJpdjtcblxuICByZXR1cm4gbmV3IEtleVBhaXIoZWMsIHtcbiAgICBwcml2OiBwcml2LFxuICAgIHByaXZFbmM6IGVuYyxcbiAgfSk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICB2YXIgcHViID0gdGhpcy5nZXRQdWJsaWMoKTtcblxuICBpZiAocHViLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCByZWFzb246ICdJbnZhbGlkIHB1YmxpYyBrZXknIH07XG4gIGlmICghcHViLnZhbGlkYXRlKCkpXG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgcmVhc29uOiAnUHVibGljIGtleSBpcyBub3QgYSBwb2ludCcgfTtcbiAgaWYgKCFwdWIubXVsKHRoaXMuZWMuY3VydmUubikuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIHJlYXNvbjogJ1B1YmxpYyBrZXkgKiBOICE9IE8nIH07XG5cbiAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlLCByZWFzb246IG51bGwgfTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFB1YmxpYyA9IGZ1bmN0aW9uIGdldFB1YmxpYyhjb21wYWN0LCBlbmMpIHtcbiAgLy8gY29tcGFjdCBpcyBvcHRpb25hbCBhcmd1bWVudFxuICBpZiAodHlwZW9mIGNvbXBhY3QgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jID0gY29tcGFjdDtcbiAgICBjb21wYWN0ID0gbnVsbDtcbiAgfVxuXG4gIGlmICghdGhpcy5wdWIpXG4gICAgdGhpcy5wdWIgPSB0aGlzLmVjLmcubXVsKHRoaXMucHJpdik7XG5cbiAgaWYgKCFlbmMpXG4gICAgcmV0dXJuIHRoaXMucHViO1xuXG4gIHJldHVybiB0aGlzLnB1Yi5lbmNvZGUoZW5jLCBjb21wYWN0KTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFByaXZhdGUgPSBmdW5jdGlvbiBnZXRQcml2YXRlKGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdGhpcy5wcml2LnRvU3RyaW5nKDE2LCAyKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLnByaXY7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5faW1wb3J0UHJpdmF0ZSA9IGZ1bmN0aW9uIF9pbXBvcnRQcml2YXRlKGtleSwgZW5jKSB7XG4gIHRoaXMucHJpdiA9IG5ldyBCTihrZXksIGVuYyB8fCAxNik7XG5cbiAgLy8gRW5zdXJlIHRoYXQgdGhlIHByaXYgd29uJ3QgYmUgYmlnZ2VyIHRoYW4gbiwgb3RoZXJ3aXNlIHdlIG1heSBmYWlsXG4gIC8vIGluIGZpeGVkIG11bHRpcGxpY2F0aW9uIG1ldGhvZFxuICB0aGlzLnByaXYgPSB0aGlzLnByaXYudW1vZCh0aGlzLmVjLmN1cnZlLm4pO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuX2ltcG9ydFB1YmxpYyA9IGZ1bmN0aW9uIF9pbXBvcnRQdWJsaWMoa2V5LCBlbmMpIHtcbiAgaWYgKGtleS54IHx8IGtleS55KSB7XG4gICAgLy8gTW9udGdvbWVyeSBwb2ludHMgb25seSBoYXZlIGFuIGB4YCBjb29yZGluYXRlLlxuICAgIC8vIFdlaWVyc3RyYXNzL0Vkd2FyZHMgcG9pbnRzIG9uIHRoZSBvdGhlciBoYW5kIGhhdmUgYm90aCBgeGAgYW5kXG4gICAgLy8gYHlgIGNvb3JkaW5hdGVzLlxuICAgIGlmICh0aGlzLmVjLmN1cnZlLnR5cGUgPT09ICdtb250Jykge1xuICAgICAgYXNzZXJ0KGtleS54LCAnTmVlZCB4IGNvb3JkaW5hdGUnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZWMuY3VydmUudHlwZSA9PT0gJ3Nob3J0JyB8fFxuICAgICAgICAgICAgICAgdGhpcy5lYy5jdXJ2ZS50eXBlID09PSAnZWR3YXJkcycpIHtcbiAgICAgIGFzc2VydChrZXkueCAmJiBrZXkueSwgJ05lZWQgYm90aCB4IGFuZCB5IGNvb3JkaW5hdGUnKTtcbiAgICB9XG4gICAgdGhpcy5wdWIgPSB0aGlzLmVjLmN1cnZlLnBvaW50KGtleS54LCBrZXkueSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMucHViID0gdGhpcy5lYy5jdXJ2ZS5kZWNvZGVQb2ludChrZXksIGVuYyk7XG59O1xuXG4vLyBFQ0RIXG5LZXlQYWlyLnByb3RvdHlwZS5kZXJpdmUgPSBmdW5jdGlvbiBkZXJpdmUocHViKSB7XG4gIGlmKCFwdWIudmFsaWRhdGUoKSkge1xuICAgIGFzc2VydChwdWIudmFsaWRhdGUoKSwgJ3B1YmxpYyBwb2ludCBub3QgdmFsaWRhdGVkJyk7XG4gIH1cbiAgcmV0dXJuIHB1Yi5tdWwodGhpcy5wcml2KS5nZXRYKCk7XG59O1xuXG4vLyBFQ0RTQVxuS2V5UGFpci5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obXNnLCBlbmMsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRoaXMuZWMuc2lnbihtc2csIHRoaXMsIGVuYywgb3B0aW9ucyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkobXNnLCBzaWduYXR1cmUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRoaXMuZWMudmVyaWZ5KG1zZywgc2lnbmF0dXJlLCB0aGlzLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gIHJldHVybiAnPEtleSBwcml2OiAnICsgKHRoaXMucHJpdiAmJiB0aGlzLnByaXYudG9TdHJpbmcoMTYsIDIpKSArXG4gICAgICAgICAnIHB1YjogJyArICh0aGlzLnB1YiAmJiB0aGlzLnB1Yi5pbnNwZWN0KCkpICsgJyA+Jztcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIFNpZ25hdHVyZShvcHRpb25zLCBlbmMpIHtcbiAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBTaWduYXR1cmUpXG4gICAgcmV0dXJuIG9wdGlvbnM7XG5cbiAgaWYgKHRoaXMuX2ltcG9ydERFUihvcHRpb25zLCBlbmMpKVxuICAgIHJldHVybjtcblxuICBhc3NlcnQob3B0aW9ucy5yICYmIG9wdGlvbnMucywgJ1NpZ25hdHVyZSB3aXRob3V0IHIgb3IgcycpO1xuICB0aGlzLnIgPSBuZXcgQk4ob3B0aW9ucy5yLCAxNik7XG4gIHRoaXMucyA9IG5ldyBCTihvcHRpb25zLnMsIDE2KTtcbiAgaWYgKG9wdGlvbnMucmVjb3ZlcnlQYXJhbSA9PT0gdW5kZWZpbmVkKVxuICAgIHRoaXMucmVjb3ZlcnlQYXJhbSA9IG51bGw7XG4gIGVsc2VcbiAgICB0aGlzLnJlY292ZXJ5UGFyYW0gPSBvcHRpb25zLnJlY292ZXJ5UGFyYW07XG59XG5tb2R1bGUuZXhwb3J0cyA9IFNpZ25hdHVyZTtcblxuZnVuY3Rpb24gUG9zaXRpb24oKSB7XG4gIHRoaXMucGxhY2UgPSAwO1xufVxuXG5mdW5jdGlvbiBnZXRMZW5ndGgoYnVmLCBwKSB7XG4gIHZhciBpbml0aWFsID0gYnVmW3AucGxhY2UrK107XG4gIGlmICghKGluaXRpYWwgJiAweDgwKSkge1xuICAgIHJldHVybiBpbml0aWFsO1xuICB9XG4gIHZhciBvY3RldExlbiA9IGluaXRpYWwgJiAweGY7XG5cbiAgLy8gSW5kZWZpbml0ZSBsZW5ndGggb3Igb3ZlcmZsb3dcbiAgaWYgKG9jdGV0TGVuID09PSAwIHx8IG9jdGV0TGVuID4gNCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmKGJ1ZltwLnBsYWNlXSA9PT0gMHgwMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB2YWwgPSAwO1xuICBmb3IgKHZhciBpID0gMCwgb2ZmID0gcC5wbGFjZTsgaSA8IG9jdGV0TGVuOyBpKyssIG9mZisrKSB7XG4gICAgdmFsIDw8PSA4O1xuICAgIHZhbCB8PSBidWZbb2ZmXTtcbiAgICB2YWwgPj4+PSAwO1xuICB9XG5cbiAgLy8gTGVhZGluZyB6ZXJvZXNcbiAgaWYgKHZhbCA8PSAweDdmKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcC5wbGFjZSA9IG9mZjtcbiAgcmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gcm1QYWRkaW5nKGJ1Zikge1xuICB2YXIgaSA9IDA7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoIC0gMTtcbiAgd2hpbGUgKCFidWZbaV0gJiYgIShidWZbaSArIDFdICYgMHg4MCkgJiYgaSA8IGxlbikge1xuICAgIGkrKztcbiAgfVxuICBpZiAoaSA9PT0gMCkge1xuICAgIHJldHVybiBidWY7XG4gIH1cbiAgcmV0dXJuIGJ1Zi5zbGljZShpKTtcbn1cblxuU2lnbmF0dXJlLnByb3RvdHlwZS5faW1wb3J0REVSID0gZnVuY3Rpb24gX2ltcG9ydERFUihkYXRhLCBlbmMpIHtcbiAgZGF0YSA9IHV0aWxzLnRvQXJyYXkoZGF0YSwgZW5jKTtcbiAgdmFyIHAgPSBuZXcgUG9zaXRpb24oKTtcbiAgaWYgKGRhdGFbcC5wbGFjZSsrXSAhPT0gMHgzMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGVuID0gZ2V0TGVuZ3RoKGRhdGEsIHApO1xuICBpZiAobGVuID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoKGxlbiArIHAucGxhY2UpICE9PSBkYXRhLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZGF0YVtwLnBsYWNlKytdICE9PSAweDAyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBybGVuID0gZ2V0TGVuZ3RoKGRhdGEsIHApO1xuICBpZiAocmxlbiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKChkYXRhW3AucGxhY2VdICYgMTI4KSAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgciA9IGRhdGEuc2xpY2UocC5wbGFjZSwgcmxlbiArIHAucGxhY2UpO1xuICBwLnBsYWNlICs9IHJsZW47XG4gIGlmIChkYXRhW3AucGxhY2UrK10gIT09IDB4MDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHNsZW4gPSBnZXRMZW5ndGgoZGF0YSwgcCk7XG4gIGlmIChzbGVuID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZGF0YS5sZW5ndGggIT09IHNsZW4gKyBwLnBsYWNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICgoZGF0YVtwLnBsYWNlXSAmIDEyOCkgIT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHMgPSBkYXRhLnNsaWNlKHAucGxhY2UsIHNsZW4gKyBwLnBsYWNlKTtcbiAgaWYgKHJbMF0gPT09IDApIHtcbiAgICBpZiAoclsxXSAmIDB4ODApIHtcbiAgICAgIHIgPSByLnNsaWNlKDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMZWFkaW5nIHplcm9lc1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoc1swXSA9PT0gMCkge1xuICAgIGlmIChzWzFdICYgMHg4MCkge1xuICAgICAgcyA9IHMuc2xpY2UoMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExlYWRpbmcgemVyb2VzXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5yID0gbmV3IEJOKHIpO1xuICB0aGlzLnMgPSBuZXcgQk4ocyk7XG4gIHRoaXMucmVjb3ZlcnlQYXJhbSA9IG51bGw7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBjb25zdHJ1Y3RMZW5ndGgoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA8IDB4ODApIHtcbiAgICBhcnIucHVzaChsZW4pO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgb2N0ZXRzID0gMSArIChNYXRoLmxvZyhsZW4pIC8gTWF0aC5MTjIgPj4+IDMpO1xuICBhcnIucHVzaChvY3RldHMgfCAweDgwKTtcbiAgd2hpbGUgKC0tb2N0ZXRzKSB7XG4gICAgYXJyLnB1c2goKGxlbiA+Pj4gKG9jdGV0cyA8PCAzKSkgJiAweGZmKTtcbiAgfVxuICBhcnIucHVzaChsZW4pO1xufVxuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvREVSID0gZnVuY3Rpb24gdG9ERVIoZW5jKSB7XG4gIHZhciByID0gdGhpcy5yLnRvQXJyYXkoKTtcbiAgdmFyIHMgPSB0aGlzLnMudG9BcnJheSgpO1xuXG4gIC8vIFBhZCB2YWx1ZXNcbiAgaWYgKHJbMF0gJiAweDgwKVxuICAgIHIgPSBbIDAgXS5jb25jYXQocik7XG4gIC8vIFBhZCB2YWx1ZXNcbiAgaWYgKHNbMF0gJiAweDgwKVxuICAgIHMgPSBbIDAgXS5jb25jYXQocyk7XG5cbiAgciA9IHJtUGFkZGluZyhyKTtcbiAgcyA9IHJtUGFkZGluZyhzKTtcblxuICB3aGlsZSAoIXNbMF0gJiYgIShzWzFdICYgMHg4MCkpIHtcbiAgICBzID0gcy5zbGljZSgxKTtcbiAgfVxuICB2YXIgYXJyID0gWyAweDAyIF07XG4gIGNvbnN0cnVjdExlbmd0aChhcnIsIHIubGVuZ3RoKTtcbiAgYXJyID0gYXJyLmNvbmNhdChyKTtcbiAgYXJyLnB1c2goMHgwMik7XG4gIGNvbnN0cnVjdExlbmd0aChhcnIsIHMubGVuZ3RoKTtcbiAgdmFyIGJhY2tIYWxmID0gYXJyLmNvbmNhdChzKTtcbiAgdmFyIHJlcyA9IFsgMHgzMCBdO1xuICBjb25zdHJ1Y3RMZW5ndGgocmVzLCBiYWNrSGFsZi5sZW5ndGgpO1xuICByZXMgPSByZXMuY29uY2F0KGJhY2tIYWxmKTtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZShyZXMsIGVuYyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgSG1hY0RSQkcgPSByZXF1aXJlKCdobWFjLWRyYmcnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgY3VydmVzID0gcmVxdWlyZSgnLi4vY3VydmVzJyk7XG52YXIgcmFuZCA9IHJlcXVpcmUoJ2Jyb3JhbmQnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbnZhciBLZXlQYWlyID0gcmVxdWlyZSgnLi9rZXknKTtcbnZhciBTaWduYXR1cmUgPSByZXF1aXJlKCcuL3NpZ25hdHVyZScpO1xuXG5mdW5jdGlvbiBFQyhvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBFQykpXG4gICAgcmV0dXJuIG5ldyBFQyhvcHRpb25zKTtcblxuICAvLyBTaG9ydGN1dCBgZWxsaXB0aWMuZWMoY3VydmUtbmFtZSlgXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICBhc3NlcnQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnZlcywgb3B0aW9ucyksXG4gICAgICAnVW5rbm93biBjdXJ2ZSAnICsgb3B0aW9ucyk7XG5cbiAgICBvcHRpb25zID0gY3VydmVzW29wdGlvbnNdO1xuICB9XG5cbiAgLy8gU2hvcnRjdXQgZm9yIGBlbGxpcHRpYy5lYyhlbGxpcHRpYy5jdXJ2ZXMuY3VydmVOYW1lKWBcbiAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBjdXJ2ZXMuUHJlc2V0Q3VydmUpXG4gICAgb3B0aW9ucyA9IHsgY3VydmU6IG9wdGlvbnMgfTtcblxuICB0aGlzLmN1cnZlID0gb3B0aW9ucy5jdXJ2ZS5jdXJ2ZTtcbiAgdGhpcy5uID0gdGhpcy5jdXJ2ZS5uO1xuICB0aGlzLm5oID0gdGhpcy5uLnVzaHJuKDEpO1xuICB0aGlzLmcgPSB0aGlzLmN1cnZlLmc7XG5cbiAgLy8gUG9pbnQgb24gY3VydmVcbiAgdGhpcy5nID0gb3B0aW9ucy5jdXJ2ZS5nO1xuICB0aGlzLmcucHJlY29tcHV0ZShvcHRpb25zLmN1cnZlLm4uYml0TGVuZ3RoKCkgKyAxKTtcblxuICAvLyBIYXNoIGZvciBmdW5jdGlvbiBmb3IgRFJCR1xuICB0aGlzLmhhc2ggPSBvcHRpb25zLmhhc2ggfHwgb3B0aW9ucy5jdXJ2ZS5oYXNoO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFQztcblxuRUMucHJvdG90eXBlLmtleVBhaXIgPSBmdW5jdGlvbiBrZXlQYWlyKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBLZXlQYWlyKHRoaXMsIG9wdGlvbnMpO1xufTtcblxuRUMucHJvdG90eXBlLmtleUZyb21Qcml2YXRlID0gZnVuY3Rpb24ga2V5RnJvbVByaXZhdGUocHJpdiwgZW5jKSB7XG4gIHJldHVybiBLZXlQYWlyLmZyb21Qcml2YXRlKHRoaXMsIHByaXYsIGVuYyk7XG59O1xuXG5FQy5wcm90b3R5cGUua2V5RnJvbVB1YmxpYyA9IGZ1bmN0aW9uIGtleUZyb21QdWJsaWMocHViLCBlbmMpIHtcbiAgcmV0dXJuIEtleVBhaXIuZnJvbVB1YmxpYyh0aGlzLCBwdWIsIGVuYyk7XG59O1xuXG5FQy5wcm90b3R5cGUuZ2VuS2V5UGFpciA9IGZ1bmN0aW9uIGdlbktleVBhaXIob3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpXG4gICAgb3B0aW9ucyA9IHt9O1xuXG4gIC8vIEluc3RhbnRpYXRlIEhtYWNfRFJCR1xuICB2YXIgZHJiZyA9IG5ldyBIbWFjRFJCRyh7XG4gICAgaGFzaDogdGhpcy5oYXNoLFxuICAgIHBlcnM6IG9wdGlvbnMucGVycyxcbiAgICBwZXJzRW5jOiBvcHRpb25zLnBlcnNFbmMgfHwgJ3V0ZjgnLFxuICAgIGVudHJvcHk6IG9wdGlvbnMuZW50cm9weSB8fCByYW5kKHRoaXMuaGFzaC5obWFjU3RyZW5ndGgpLFxuICAgIGVudHJvcHlFbmM6IG9wdGlvbnMuZW50cm9weSAmJiBvcHRpb25zLmVudHJvcHlFbmMgfHwgJ3V0ZjgnLFxuICAgIG5vbmNlOiB0aGlzLm4udG9BcnJheSgpLFxuICB9KTtcblxuICB2YXIgYnl0ZXMgPSB0aGlzLm4uYnl0ZUxlbmd0aCgpO1xuICB2YXIgbnMyID0gdGhpcy5uLnN1YihuZXcgQk4oMikpO1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIHByaXYgPSBuZXcgQk4oZHJiZy5nZW5lcmF0ZShieXRlcykpO1xuICAgIGlmIChwcml2LmNtcChuczIpID4gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgcHJpdi5pYWRkbigxKTtcbiAgICByZXR1cm4gdGhpcy5rZXlGcm9tUHJpdmF0ZShwcml2KTtcbiAgfVxufTtcblxuRUMucHJvdG90eXBlLl90cnVuY2F0ZVRvTiA9IGZ1bmN0aW9uIF90cnVuY2F0ZVRvTihtc2csIHRydW5jT25seSwgYml0TGVuZ3RoKSB7XG4gIHZhciBieXRlTGVuZ3RoO1xuICBpZiAoQk4uaXNCTihtc2cpIHx8IHR5cGVvZiBtc2cgPT09ICdudW1iZXInKSB7XG4gICAgbXNnID0gbmV3IEJOKG1zZywgMTYpO1xuICAgIGJ5dGVMZW5ndGggPSBtc2cuYnl0ZUxlbmd0aCgpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtc2cgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gQk4gYXNzdW1lcyBhbiBhcnJheS1saWtlIGlucHV0IGFuZCBhc3NlcnRzIGxlbmd0aFxuICAgIGJ5dGVMZW5ndGggPSBtc2cubGVuZ3RoO1xuICAgIG1zZyA9IG5ldyBCTihtc2csIDE2KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBCTiBjb252ZXJ0cyB0aGUgdmFsdWUgdG8gc3RyaW5nXG4gICAgdmFyIHN0ciA9IG1zZy50b1N0cmluZygpO1xuICAgIC8vIEhFWCBlbmNvZGluZ1xuICAgIGJ5dGVMZW5ndGggPSAoc3RyLmxlbmd0aCArIDEpID4+PiAxO1xuICAgIG1zZyA9IG5ldyBCTihzdHIsIDE2KTtcbiAgfVxuICAvLyBBbGxvdyBvdmVycmlkaW5nXG4gIGlmICh0eXBlb2YgYml0TGVuZ3RoICE9PSAnbnVtYmVyJykge1xuICAgIGJpdExlbmd0aCA9IGJ5dGVMZW5ndGggKiA4O1xuICB9XG4gIHZhciBkZWx0YSA9IGJpdExlbmd0aCAtIHRoaXMubi5iaXRMZW5ndGgoKTtcbiAgaWYgKGRlbHRhID4gMClcbiAgICBtc2cgPSBtc2cudXNocm4oZGVsdGEpO1xuICBpZiAoIXRydW5jT25seSAmJiBtc2cuY21wKHRoaXMubikgPj0gMClcbiAgICByZXR1cm4gbXNnLnN1Yih0aGlzLm4pO1xuICBlbHNlXG4gICAgcmV0dXJuIG1zZztcbn07XG5cbkVDLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gc2lnbihtc2csIGtleSwgZW5jLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZW5jID09PSAnb2JqZWN0Jykge1xuICAgIG9wdGlvbnMgPSBlbmM7XG4gICAgZW5jID0gbnVsbDtcbiAgfVxuICBpZiAoIW9wdGlvbnMpXG4gICAgb3B0aW9ucyA9IHt9O1xuXG4gIGlmICh0eXBlb2YgbXNnICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgbXNnICE9PSAnbnVtYmVyJyAmJiAhQk4uaXNCTihtc2cpKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBtc2cgPT09ICdvYmplY3QnICYmIG1zZyAmJiB0eXBlb2YgbXNnLmxlbmd0aCA9PT0gJ251bWJlcicsXG4gICAgICAnRXhwZWN0ZWQgbWVzc2FnZSB0byBiZSBhbiBhcnJheS1saWtlLCBhIGhleCBzdHJpbmcsIG9yIGEgQk4gaW5zdGFuY2UnKTtcbiAgICBhc3NlcnQoKG1zZy5sZW5ndGggPj4+IDApID09PSBtc2cubGVuZ3RoKTsgLy8gbm9uLW5lZ2F0aXZlIDMyLWJpdCBpbnRlZ2VyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIGFzc2VydCgobXNnW2ldICYgMjU1KSA9PT0gbXNnW2ldKTtcbiAgfVxuXG4gIGtleSA9IHRoaXMua2V5RnJvbVByaXZhdGUoa2V5LCBlbmMpO1xuICBtc2cgPSB0aGlzLl90cnVuY2F0ZVRvTihtc2csIGZhbHNlLCBvcHRpb25zLm1zZ0JpdExlbmd0aCk7XG5cbiAgLy8gV291bGQgZmFpbCBmdXJ0aGVyIGNoZWNrcywgYnV0IGxldCdzIG1ha2UgdGhlIGVycm9yIG1lc3NhZ2UgY2xlYXJcbiAgYXNzZXJ0KCFtc2cuaXNOZWcoKSwgJ0NhbiBub3Qgc2lnbiBhIG5lZ2F0aXZlIG1lc3NhZ2UnKTtcblxuICAvLyBaZXJvLWV4dGVuZCBrZXkgdG8gcHJvdmlkZSBlbm91Z2ggZW50cm9weVxuICB2YXIgYnl0ZXMgPSB0aGlzLm4uYnl0ZUxlbmd0aCgpO1xuICB2YXIgYmtleSA9IGtleS5nZXRQcml2YXRlKCkudG9BcnJheSgnYmUnLCBieXRlcyk7XG5cbiAgLy8gWmVyby1leHRlbmQgbm9uY2UgdG8gaGF2ZSB0aGUgc2FtZSBieXRlIHNpemUgYXMgTlxuICB2YXIgbm9uY2UgPSBtc2cudG9BcnJheSgnYmUnLCBieXRlcyk7XG5cbiAgLy8gUmVjaGVjayBub25jZSB0byBiZSBiaWplY3RpdmUgdG8gbXNnXG4gIGFzc2VydCgobmV3IEJOKG5vbmNlKSkuZXEobXNnKSwgJ0NhbiBub3Qgc2lnbiBtZXNzYWdlJyk7XG5cbiAgLy8gSW5zdGFudGlhdGUgSG1hY19EUkJHXG4gIHZhciBkcmJnID0gbmV3IEhtYWNEUkJHKHtcbiAgICBoYXNoOiB0aGlzLmhhc2gsXG4gICAgZW50cm9weTogYmtleSxcbiAgICBub25jZTogbm9uY2UsXG4gICAgcGVyczogb3B0aW9ucy5wZXJzLFxuICAgIHBlcnNFbmM6IG9wdGlvbnMucGVyc0VuYyB8fCAndXRmOCcsXG4gIH0pO1xuXG4gIC8vIE51bWJlciBvZiBieXRlcyB0byBnZW5lcmF0ZVxuICB2YXIgbnMxID0gdGhpcy5uLnN1YihuZXcgQk4oMSkpO1xuXG4gIGZvciAodmFyIGl0ZXIgPSAwOyA7IGl0ZXIrKykge1xuICAgIHZhciBrID0gb3B0aW9ucy5rID9cbiAgICAgIG9wdGlvbnMuayhpdGVyKSA6XG4gICAgICBuZXcgQk4oZHJiZy5nZW5lcmF0ZSh0aGlzLm4uYnl0ZUxlbmd0aCgpKSk7XG4gICAgayA9IHRoaXMuX3RydW5jYXRlVG9OKGssIHRydWUpO1xuICAgIGlmIChrLmNtcG4oMSkgPD0gMCB8fCBrLmNtcChuczEpID49IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBrcCA9IHRoaXMuZy5tdWwoayk7XG4gICAgaWYgKGtwLmlzSW5maW5pdHkoKSlcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgdmFyIGtwWCA9IGtwLmdldFgoKTtcbiAgICB2YXIgciA9IGtwWC51bW9kKHRoaXMubik7XG4gICAgaWYgKHIuY21wbigwKSA9PT0gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgdmFyIHMgPSBrLmludm0odGhpcy5uKS5tdWwoci5tdWwoa2V5LmdldFByaXZhdGUoKSkuaWFkZChtc2cpKTtcbiAgICBzID0gcy51bW9kKHRoaXMubik7XG4gICAgaWYgKHMuY21wbigwKSA9PT0gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgdmFyIHJlY292ZXJ5UGFyYW0gPSAoa3AuZ2V0WSgpLmlzT2RkKCkgPyAxIDogMCkgfFxuICAgICAgICAgICAgICAgICAgICAgICAgKGtwWC5jbXAocikgIT09IDAgPyAyIDogMCk7XG5cbiAgICAvLyBVc2UgY29tcGxlbWVudCBvZiBgc2AsIGlmIGl0IGlzID4gYG4gLyAyYFxuICAgIGlmIChvcHRpb25zLmNhbm9uaWNhbCAmJiBzLmNtcCh0aGlzLm5oKSA+IDApIHtcbiAgICAgIHMgPSB0aGlzLm4uc3ViKHMpO1xuICAgICAgcmVjb3ZlcnlQYXJhbSBePSAxO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKHsgcjogciwgczogcywgcmVjb3ZlcnlQYXJhbTogcmVjb3ZlcnlQYXJhbSB9KTtcbiAgfVxufTtcblxuRUMucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtc2csIHNpZ25hdHVyZSwga2V5LCBlbmMsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKVxuICAgIG9wdGlvbnMgPSB7fTtcblxuICBtc2cgPSB0aGlzLl90cnVuY2F0ZVRvTihtc2csIGZhbHNlLCBvcHRpb25zLm1zZ0JpdExlbmd0aCk7XG4gIGtleSA9IHRoaXMua2V5RnJvbVB1YmxpYyhrZXksIGVuYyk7XG4gIHNpZ25hdHVyZSA9IG5ldyBTaWduYXR1cmUoc2lnbmF0dXJlLCAnaGV4Jyk7XG5cbiAgLy8gUGVyZm9ybSBwcmltaXRpdmUgdmFsdWVzIHZhbGlkYXRpb25cbiAgdmFyIHIgPSBzaWduYXR1cmUucjtcbiAgdmFyIHMgPSBzaWduYXR1cmUucztcbiAgaWYgKHIuY21wbigxKSA8IDAgfHwgci5jbXAodGhpcy5uKSA+PSAwKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKHMuY21wbigxKSA8IDAgfHwgcy5jbXAodGhpcy5uKSA+PSAwKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBWYWxpZGF0ZSBzaWduYXR1cmVcbiAgdmFyIHNpbnYgPSBzLmludm0odGhpcy5uKTtcbiAgdmFyIHUxID0gc2ludi5tdWwobXNnKS51bW9kKHRoaXMubik7XG4gIHZhciB1MiA9IHNpbnYubXVsKHIpLnVtb2QodGhpcy5uKTtcbiAgdmFyIHA7XG5cbiAgaWYgKCF0aGlzLmN1cnZlLl9tYXh3ZWxsVHJpY2spIHtcbiAgICBwID0gdGhpcy5nLm11bEFkZCh1MSwga2V5LmdldFB1YmxpYygpLCB1Mik7XG4gICAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIHAuZ2V0WCgpLnVtb2QodGhpcy5uKS5jbXAocikgPT09IDA7XG4gIH1cblxuICAvLyBOT1RFOiBHcmVnIE1heHdlbGwncyB0cmljaywgaW5zcGlyZWQgYnk6XG4gIC8vIGh0dHBzOi8vZ2l0LmlvL3ZhZDNLXG5cbiAgcCA9IHRoaXMuZy5qbXVsQWRkKHUxLCBrZXkuZ2V0UHVibGljKCksIHUyKTtcbiAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBDb21wYXJlIGBwLnhgIG9mIEphY29iaWFuIHBvaW50IHdpdGggYHJgLFxuICAvLyB0aGlzIHdpbGwgZG8gYHAueCA9PSByICogcC56XjJgIGluc3RlYWQgb2YgbXVsdGlwbHlpbmcgYHAueGAgYnkgdGhlXG4gIC8vIGludmVyc2Ugb2YgYHAuel4yYFxuICByZXR1cm4gcC5lcVhUb1Aocik7XG59O1xuXG5FQy5wcm90b3R5cGUucmVjb3ZlclB1YktleSA9IGZ1bmN0aW9uKG1zZywgc2lnbmF0dXJlLCBqLCBlbmMpIHtcbiAgYXNzZXJ0KCgzICYgaikgPT09IGosICdUaGUgcmVjb3ZlcnkgcGFyYW0gaXMgbW9yZSB0aGFuIHR3byBiaXRzJyk7XG4gIHNpZ25hdHVyZSA9IG5ldyBTaWduYXR1cmUoc2lnbmF0dXJlLCBlbmMpO1xuXG4gIHZhciBuID0gdGhpcy5uO1xuICB2YXIgZSA9IG5ldyBCTihtc2cpO1xuICB2YXIgciA9IHNpZ25hdHVyZS5yO1xuICB2YXIgcyA9IHNpZ25hdHVyZS5zO1xuXG4gIC8vIEEgc2V0IExTQiBzaWduaWZpZXMgdGhhdCB0aGUgeS1jb29yZGluYXRlIGlzIG9kZFxuICB2YXIgaXNZT2RkID0gaiAmIDE7XG4gIHZhciBpc1NlY29uZEtleSA9IGogPj4gMTtcbiAgaWYgKHIuY21wKHRoaXMuY3VydmUucC51bW9kKHRoaXMuY3VydmUubikpID49IDAgJiYgaXNTZWNvbmRLZXkpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBzZW5jb25kIGtleSBjYW5kaW5hdGUnKTtcblxuICAvLyAxLjEuIExldCB4ID0gciArIGpuLlxuICBpZiAoaXNTZWNvbmRLZXkpXG4gICAgciA9IHRoaXMuY3VydmUucG9pbnRGcm9tWChyLmFkZCh0aGlzLmN1cnZlLm4pLCBpc1lPZGQpO1xuICBlbHNlXG4gICAgciA9IHRoaXMuY3VydmUucG9pbnRGcm9tWChyLCBpc1lPZGQpO1xuXG4gIHZhciBySW52ID0gc2lnbmF0dXJlLnIuaW52bShuKTtcbiAgdmFyIHMxID0gbi5zdWIoZSkubXVsKHJJbnYpLnVtb2Qobik7XG4gIHZhciBzMiA9IHMubXVsKHJJbnYpLnVtb2Qobik7XG5cbiAgLy8gMS42LjEgQ29tcHV0ZSBRID0gcl4tMSAoc1IgLSAgZUcpXG4gIC8vICAgICAgICAgICAgICAgUSA9IHJeLTEgKHNSICsgLWVHKVxuICByZXR1cm4gdGhpcy5nLm11bEFkZChzMSwgciwgczIpO1xufTtcblxuRUMucHJvdG90eXBlLmdldEtleVJlY292ZXJ5UGFyYW0gPSBmdW5jdGlvbihlLCBzaWduYXR1cmUsIFEsIGVuYykge1xuICBzaWduYXR1cmUgPSBuZXcgU2lnbmF0dXJlKHNpZ25hdHVyZSwgZW5jKTtcbiAgaWYgKHNpZ25hdHVyZS5yZWNvdmVyeVBhcmFtICE9PSBudWxsKVxuICAgIHJldHVybiBzaWduYXR1cmUucmVjb3ZlcnlQYXJhbTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgIHZhciBRcHJpbWU7XG4gICAgdHJ5IHtcbiAgICAgIFFwcmltZSA9IHRoaXMucmVjb3ZlclB1YktleShlLCBzaWduYXR1cmUsIGkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChRcHJpbWUuZXEoUSkpXG4gICAgICByZXR1cm4gaTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIHZhbGlkIHJlY292ZXJ5IGZhY3RvcicpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcbnZhciBwYXJzZUJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcztcbnZhciBjYWNoZWRQcm9wZXJ0eSA9IHV0aWxzLmNhY2hlZFByb3BlcnR5O1xuXG4vKipcbiogQHBhcmFtIHtFRERTQX0gZWRkc2EgLSBpbnN0YW5jZVxuKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcHVibGljL3ByaXZhdGUga2V5IHBhcmFtZXRlcnNcbipcbiogQHBhcmFtIHtBcnJheTxCeXRlPn0gW3BhcmFtcy5zZWNyZXRdIC0gc2VjcmV0IHNlZWQgYnl0ZXNcbiogQHBhcmFtIHtQb2ludH0gW3BhcmFtcy5wdWJdIC0gcHVibGljIGtleSBwb2ludCAoYWthIGBBYCBpbiBlZGRzYSB0ZXJtcylcbiogQHBhcmFtIHtBcnJheTxCeXRlPn0gW3BhcmFtcy5wdWJdIC0gcHVibGljIGtleSBwb2ludCBlbmNvZGVkIGFzIGJ5dGVzXG4qXG4qL1xuZnVuY3Rpb24gS2V5UGFpcihlZGRzYSwgcGFyYW1zKSB7XG4gIHRoaXMuZWRkc2EgPSBlZGRzYTtcbiAgdGhpcy5fc2VjcmV0ID0gcGFyc2VCeXRlcyhwYXJhbXMuc2VjcmV0KTtcbiAgaWYgKGVkZHNhLmlzUG9pbnQocGFyYW1zLnB1YikpXG4gICAgdGhpcy5fcHViID0gcGFyYW1zLnB1YjtcbiAgZWxzZVxuICAgIHRoaXMuX3B1YkJ5dGVzID0gcGFyc2VCeXRlcyhwYXJhbXMucHViKTtcbn1cblxuS2V5UGFpci5mcm9tUHVibGljID0gZnVuY3Rpb24gZnJvbVB1YmxpYyhlZGRzYSwgcHViKSB7XG4gIGlmIChwdWIgaW5zdGFuY2VvZiBLZXlQYWlyKVxuICAgIHJldHVybiBwdWI7XG4gIHJldHVybiBuZXcgS2V5UGFpcihlZGRzYSwgeyBwdWI6IHB1YiB9KTtcbn07XG5cbktleVBhaXIuZnJvbVNlY3JldCA9IGZ1bmN0aW9uIGZyb21TZWNyZXQoZWRkc2EsIHNlY3JldCkge1xuICBpZiAoc2VjcmV0IGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gc2VjcmV0O1xuICByZXR1cm4gbmV3IEtleVBhaXIoZWRkc2EsIHsgc2VjcmV0OiBzZWNyZXQgfSk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5zZWNyZXQgPSBmdW5jdGlvbiBzZWNyZXQoKSB7XG4gIHJldHVybiB0aGlzLl9zZWNyZXQ7XG59O1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAncHViQnl0ZXMnLCBmdW5jdGlvbiBwdWJCeXRlcygpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZW5jb2RlUG9pbnQodGhpcy5wdWIoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ3B1YicsIGZ1bmN0aW9uIHB1YigpIHtcbiAgaWYgKHRoaXMuX3B1YkJ5dGVzKVxuICAgIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZVBvaW50KHRoaXMuX3B1YkJ5dGVzKTtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZy5tdWwodGhpcy5wcml2KCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsICdwcml2Qnl0ZXMnLCBmdW5jdGlvbiBwcml2Qnl0ZXMoKSB7XG4gIHZhciBlZGRzYSA9IHRoaXMuZWRkc2E7XG4gIHZhciBoYXNoID0gdGhpcy5oYXNoKCk7XG4gIHZhciBsYXN0SXggPSBlZGRzYS5lbmNvZGluZ0xlbmd0aCAtIDE7XG5cbiAgdmFyIGEgPSBoYXNoLnNsaWNlKDAsIGVkZHNhLmVuY29kaW5nTGVuZ3RoKTtcbiAgYVswXSAmPSAyNDg7XG4gIGFbbGFzdEl4XSAmPSAxMjc7XG4gIGFbbGFzdEl4XSB8PSA2NDtcblxuICByZXR1cm4gYTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAncHJpdicsIGZ1bmN0aW9uIHByaXYoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZUludCh0aGlzLnByaXZCeXRlcygpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAnaGFzaCcsIGZ1bmN0aW9uIGhhc2goKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmhhc2goKS51cGRhdGUodGhpcy5zZWNyZXQoKSkuZGlnZXN0KCk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ21lc3NhZ2VQcmVmaXgnLCBmdW5jdGlvbiBtZXNzYWdlUHJlZml4KCkge1xuICByZXR1cm4gdGhpcy5oYXNoKCkuc2xpY2UodGhpcy5lZGRzYS5lbmNvZGluZ0xlbmd0aCk7XG59KTtcblxuS2V5UGFpci5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obWVzc2FnZSkge1xuICBhc3NlcnQodGhpcy5fc2VjcmV0LCAnS2V5UGFpciBjYW4gb25seSB2ZXJpZnknKTtcbiAgcmV0dXJuIHRoaXMuZWRkc2Euc2lnbihtZXNzYWdlLCB0aGlzKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtZXNzYWdlLCBzaWcpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EudmVyaWZ5KG1lc3NhZ2UsIHNpZywgdGhpcyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRTZWNyZXQgPSBmdW5jdGlvbiBnZXRTZWNyZXQoZW5jKSB7XG4gIGFzc2VydCh0aGlzLl9zZWNyZXQsICdLZXlQYWlyIGlzIHB1YmxpYyBvbmx5Jyk7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy5zZWNyZXQoKSwgZW5jKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFB1YmxpYyA9IGZ1bmN0aW9uIGdldFB1YmxpYyhlbmMpIHtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZSh0aGlzLnB1YkJ5dGVzKCksIGVuYyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEtleVBhaXI7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xudmFyIGNhY2hlZFByb3BlcnR5ID0gdXRpbHMuY2FjaGVkUHJvcGVydHk7XG52YXIgcGFyc2VCeXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXM7XG5cbi8qKlxuKiBAcGFyYW0ge0VERFNBfSBlZGRzYSAtIGVkZHNhIGluc3RhbmNlXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fE9iamVjdH0gc2lnIC1cbiogQHBhcmFtIHtBcnJheTxCeXRlcz58UG9pbnR9IFtzaWcuUl0gLSBSIHBvaW50IGFzIFBvaW50IG9yIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fGJufSBbc2lnLlNdIC0gUyBzY2FsYXIgYXMgYm4gb3IgYnl0ZXNcbiogQHBhcmFtIHtBcnJheTxCeXRlcz59IFtzaWcuUmVuY29kZWRdIC0gUiBwb2ludCBlbmNvZGVkXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fSBbc2lnLlNlbmNvZGVkXSAtIFMgc2NhbGFyIGVuY29kZWRcbiovXG5mdW5jdGlvbiBTaWduYXR1cmUoZWRkc2EsIHNpZykge1xuICB0aGlzLmVkZHNhID0gZWRkc2E7XG5cbiAgaWYgKHR5cGVvZiBzaWcgIT09ICdvYmplY3QnKVxuICAgIHNpZyA9IHBhcnNlQnl0ZXMoc2lnKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShzaWcpKSB7XG4gICAgYXNzZXJ0KHNpZy5sZW5ndGggPT09IGVkZHNhLmVuY29kaW5nTGVuZ3RoICogMiwgJ1NpZ25hdHVyZSBoYXMgaW52YWxpZCBzaXplJyk7XG4gICAgc2lnID0ge1xuICAgICAgUjogc2lnLnNsaWNlKDAsIGVkZHNhLmVuY29kaW5nTGVuZ3RoKSxcbiAgICAgIFM6IHNpZy5zbGljZShlZGRzYS5lbmNvZGluZ0xlbmd0aCksXG4gICAgfTtcbiAgfVxuXG4gIGFzc2VydChzaWcuUiAmJiBzaWcuUywgJ1NpZ25hdHVyZSB3aXRob3V0IFIgb3IgUycpO1xuXG4gIGlmIChlZGRzYS5pc1BvaW50KHNpZy5SKSlcbiAgICB0aGlzLl9SID0gc2lnLlI7XG4gIGlmIChzaWcuUyBpbnN0YW5jZW9mIEJOKVxuICAgIHRoaXMuX1MgPSBzaWcuUztcblxuICB0aGlzLl9SZW5jb2RlZCA9IEFycmF5LmlzQXJyYXkoc2lnLlIpID8gc2lnLlIgOiBzaWcuUmVuY29kZWQ7XG4gIHRoaXMuX1NlbmNvZGVkID0gQXJyYXkuaXNBcnJheShzaWcuUykgPyBzaWcuUyA6IHNpZy5TZW5jb2RlZDtcbn1cblxuY2FjaGVkUHJvcGVydHkoU2lnbmF0dXJlLCAnUycsIGZ1bmN0aW9uIFMoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZUludCh0aGlzLlNlbmNvZGVkKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwgJ1InLCBmdW5jdGlvbiBSKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVQb2ludCh0aGlzLlJlbmNvZGVkKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwgJ1JlbmNvZGVkJywgZnVuY3Rpb24gUmVuY29kZWQoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmVuY29kZVBvaW50KHRoaXMuUigpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShTaWduYXR1cmUsICdTZW5jb2RlZCcsIGZ1bmN0aW9uIFNlbmNvZGVkKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVJbnQodGhpcy5TKCkpO1xufSk7XG5cblNpZ25hdHVyZS5wcm90b3R5cGUudG9CeXRlcyA9IGZ1bmN0aW9uIHRvQnl0ZXMoKSB7XG4gIHJldHVybiB0aGlzLlJlbmNvZGVkKCkuY29uY2F0KHRoaXMuU2VuY29kZWQoKSk7XG59O1xuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvSGV4ID0gZnVuY3Rpb24gdG9IZXgoKSB7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy50b0J5dGVzKCksICdoZXgnKS50b1VwcGVyQ2FzZSgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBTaWduYXR1cmU7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc2ggPSByZXF1aXJlKCdoYXNoLmpzJyk7XG52YXIgY3VydmVzID0gcmVxdWlyZSgnLi4vY3VydmVzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcbnZhciBwYXJzZUJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcztcbnZhciBLZXlQYWlyID0gcmVxdWlyZSgnLi9rZXknKTtcbnZhciBTaWduYXR1cmUgPSByZXF1aXJlKCcuL3NpZ25hdHVyZScpO1xuXG5mdW5jdGlvbiBFRERTQShjdXJ2ZSkge1xuICBhc3NlcnQoY3VydmUgPT09ICdlZDI1NTE5JywgJ29ubHkgdGVzdGVkIHdpdGggZWQyNTUxOSBzbyBmYXInKTtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRUREU0EpKVxuICAgIHJldHVybiBuZXcgRUREU0EoY3VydmUpO1xuXG4gIGN1cnZlID0gY3VydmVzW2N1cnZlXS5jdXJ2ZTtcbiAgdGhpcy5jdXJ2ZSA9IGN1cnZlO1xuICB0aGlzLmcgPSBjdXJ2ZS5nO1xuICB0aGlzLmcucHJlY29tcHV0ZShjdXJ2ZS5uLmJpdExlbmd0aCgpICsgMSk7XG5cbiAgdGhpcy5wb2ludENsYXNzID0gY3VydmUucG9pbnQoKS5jb25zdHJ1Y3RvcjtcbiAgdGhpcy5lbmNvZGluZ0xlbmd0aCA9IE1hdGguY2VpbChjdXJ2ZS5uLmJpdExlbmd0aCgpIC8gOCk7XG4gIHRoaXMuaGFzaCA9IGhhc2guc2hhNTEyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEVERFNBO1xuXG4vKipcbiogQHBhcmFtIHtBcnJheXxTdHJpbmd9IG1lc3NhZ2UgLSBtZXNzYWdlIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfEtleVBhaXJ9IHNlY3JldCAtIHNlY3JldCBieXRlcyBvciBhIGtleXBhaXJcbiogQHJldHVybnMge1NpZ25hdHVyZX0gLSBzaWduYXR1cmVcbiovXG5FRERTQS5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obWVzc2FnZSwgc2VjcmV0KSB7XG4gIG1lc3NhZ2UgPSBwYXJzZUJ5dGVzKG1lc3NhZ2UpO1xuICB2YXIga2V5ID0gdGhpcy5rZXlGcm9tU2VjcmV0KHNlY3JldCk7XG4gIHZhciByID0gdGhpcy5oYXNoSW50KGtleS5tZXNzYWdlUHJlZml4KCksIG1lc3NhZ2UpO1xuICB2YXIgUiA9IHRoaXMuZy5tdWwocik7XG4gIHZhciBSZW5jb2RlZCA9IHRoaXMuZW5jb2RlUG9pbnQoUik7XG4gIHZhciBzXyA9IHRoaXMuaGFzaEludChSZW5jb2RlZCwga2V5LnB1YkJ5dGVzKCksIG1lc3NhZ2UpXG4gICAgLm11bChrZXkucHJpdigpKTtcbiAgdmFyIFMgPSByLmFkZChzXykudW1vZCh0aGlzLmN1cnZlLm4pO1xuICByZXR1cm4gdGhpcy5tYWtlU2lnbmF0dXJlKHsgUjogUiwgUzogUywgUmVuY29kZWQ6IFJlbmNvZGVkIH0pO1xufTtcblxuLyoqXG4qIEBwYXJhbSB7QXJyYXl9IG1lc3NhZ2UgLSBtZXNzYWdlIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfFNpZ25hdHVyZX0gc2lnIC0gc2lnIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfFBvaW50fEtleVBhaXJ9IHB1YiAtIHB1YmxpYyBrZXlcbiogQHJldHVybnMge0Jvb2xlYW59IC0gdHJ1ZSBpZiBwdWJsaWMga2V5IG1hdGNoZXMgc2lnIG9mIG1lc3NhZ2VcbiovXG5FRERTQS5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KG1lc3NhZ2UsIHNpZywgcHViKSB7XG4gIG1lc3NhZ2UgPSBwYXJzZUJ5dGVzKG1lc3NhZ2UpO1xuICBzaWcgPSB0aGlzLm1ha2VTaWduYXR1cmUoc2lnKTtcbiAgaWYgKHNpZy5TKCkuZ3RlKHNpZy5lZGRzYS5jdXJ2ZS5uKSB8fCBzaWcuUygpLmlzTmVnKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGtleSA9IHRoaXMua2V5RnJvbVB1YmxpYyhwdWIpO1xuICB2YXIgaCA9IHRoaXMuaGFzaEludChzaWcuUmVuY29kZWQoKSwga2V5LnB1YkJ5dGVzKCksIG1lc3NhZ2UpO1xuICB2YXIgU0cgPSB0aGlzLmcubXVsKHNpZy5TKCkpO1xuICB2YXIgUnBsdXNBaCA9IHNpZy5SKCkuYWRkKGtleS5wdWIoKS5tdWwoaCkpO1xuICByZXR1cm4gUnBsdXNBaC5lcShTRyk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuaGFzaEludCA9IGZ1bmN0aW9uIGhhc2hJbnQoKSB7XG4gIHZhciBoYXNoID0gdGhpcy5oYXNoKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgIGhhc2gudXBkYXRlKGFyZ3VtZW50c1tpXSk7XG4gIHJldHVybiB1dGlscy5pbnRGcm9tTEUoaGFzaC5kaWdlc3QoKSkudW1vZCh0aGlzLmN1cnZlLm4pO1xufTtcblxuRUREU0EucHJvdG90eXBlLmtleUZyb21QdWJsaWMgPSBmdW5jdGlvbiBrZXlGcm9tUHVibGljKHB1Yikge1xuICByZXR1cm4gS2V5UGFpci5mcm9tUHVibGljKHRoaXMsIHB1Yik7XG59O1xuXG5FRERTQS5wcm90b3R5cGUua2V5RnJvbVNlY3JldCA9IGZ1bmN0aW9uIGtleUZyb21TZWNyZXQoc2VjcmV0KSB7XG4gIHJldHVybiBLZXlQYWlyLmZyb21TZWNyZXQodGhpcywgc2VjcmV0KTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5tYWtlU2lnbmF0dXJlID0gZnVuY3Rpb24gbWFrZVNpZ25hdHVyZShzaWcpIHtcbiAgaWYgKHNpZyBpbnN0YW5jZW9mIFNpZ25hdHVyZSlcbiAgICByZXR1cm4gc2lnO1xuICByZXR1cm4gbmV3IFNpZ25hdHVyZSh0aGlzLCBzaWcpO1xufTtcblxuLyoqXG4qICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWpvc2Vmc3Nvbi1lZGRzYS1lZDI1NTE5LTAzI3NlY3Rpb24tNS4yXG4qXG4qIEVERFNBIGRlZmluZXMgbWV0aG9kcyBmb3IgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHBvaW50cyBhbmQgaW50ZWdlcnMuIFRoZXNlIGFyZVxuKiBoZWxwZXIgY29udmVuaWVuY2UgbWV0aG9kcywgdGhhdCBwYXNzIGFsb25nIHRvIHV0aWxpdHkgZnVuY3Rpb25zIGltcGxpZWRcbiogcGFyYW1ldGVycy5cbipcbiovXG5FRERTQS5wcm90b3R5cGUuZW5jb2RlUG9pbnQgPSBmdW5jdGlvbiBlbmNvZGVQb2ludChwb2ludCkge1xuICB2YXIgZW5jID0gcG9pbnQuZ2V0WSgpLnRvQXJyYXkoJ2xlJywgdGhpcy5lbmNvZGluZ0xlbmd0aCk7XG4gIGVuY1t0aGlzLmVuY29kaW5nTGVuZ3RoIC0gMV0gfD0gcG9pbnQuZ2V0WCgpLmlzT2RkKCkgPyAweDgwIDogMDtcbiAgcmV0dXJuIGVuYztcbn07XG5cbkVERFNBLnByb3RvdHlwZS5kZWNvZGVQb2ludCA9IGZ1bmN0aW9uIGRlY29kZVBvaW50KGJ5dGVzKSB7XG4gIGJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcyhieXRlcyk7XG5cbiAgdmFyIGxhc3RJeCA9IGJ5dGVzLmxlbmd0aCAtIDE7XG4gIHZhciBub3JtZWQgPSBieXRlcy5zbGljZSgwLCBsYXN0SXgpLmNvbmNhdChieXRlc1tsYXN0SXhdICYgfjB4ODApO1xuICB2YXIgeElzT2RkID0gKGJ5dGVzW2xhc3RJeF0gJiAweDgwKSAhPT0gMDtcblxuICB2YXIgeSA9IHV0aWxzLmludEZyb21MRShub3JtZWQpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludEZyb21ZKHksIHhJc09kZCk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuZW5jb2RlSW50ID0gZnVuY3Rpb24gZW5jb2RlSW50KG51bSkge1xuICByZXR1cm4gbnVtLnRvQXJyYXkoJ2xlJywgdGhpcy5lbmNvZGluZ0xlbmd0aCk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuZGVjb2RlSW50ID0gZnVuY3Rpb24gZGVjb2RlSW50KGJ5dGVzKSB7XG4gIHJldHVybiB1dGlscy5pbnRGcm9tTEUoYnl0ZXMpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmlzUG9pbnQgPSBmdW5jdGlvbiBpc1BvaW50KHZhbCkge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgdGhpcy5wb2ludENsYXNzO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZWxsaXB0aWMgPSBleHBvcnRzO1xuXG5lbGxpcHRpYy52ZXJzaW9uID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcbmVsbGlwdGljLnV0aWxzID0gcmVxdWlyZSgnLi9lbGxpcHRpYy91dGlscycpO1xuZWxsaXB0aWMucmFuZCA9IHJlcXVpcmUoJ2Jyb3JhbmQnKTtcbmVsbGlwdGljLmN1cnZlID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9jdXJ2ZScpO1xuZWxsaXB0aWMuY3VydmVzID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9jdXJ2ZXMnKTtcblxuLy8gUHJvdG9jb2xzXG5lbGxpcHRpYy5lYyA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvZWMnKTtcbmVsbGlwdGljLmVkZHNhID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9lZGRzYScpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2FzbjEuanMnKS5iaWdudW0sXG5cdEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJhc2U2NFRvQmlnTnVtKHZhbCwgemVybykge1xuXHR2YXIgYnVmID0gQnVmZmVyLmZyb20odmFsLCAnYmFzZTY0Jyk7XG5cdHZhciBibiA9IHZhbCA9IG5ldyBCTihidWYsIDEwLCAnYmUnKS5pYWJzKCk7XG5cdGlmICh6ZXJvKSB7XG5cdFx0YnVmLmZpbGwoMCk7XG5cdH1cblx0cmV0dXJuIGJuO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2FzbjEuanMnKS5kZWZpbmUoJ0FsZ29yaXRobUlkZW50aWZlcicsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLnNlcSgpLm9iaihcblx0XHR0aGlzLmtleSgnYWxnb3JpdGhtJykub2JqaWQoKSxcblx0XHR0aGlzLmtleSgncGFyYW1ldGVycycpLm9wdGlvbmFsKCkuYW55KClcblx0KTtcbn0pO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBBbGdvcml0aG1JZGVudGlmaWVyID0gcmVxdWlyZSgnLi9hbGdvcml0aG0taWRlbnRpZmllcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2FzbjEuanMnKS5kZWZpbmUoJ1B1YmxpY0tleUluZm8nLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5zZXEoKS5vYmooXG5cdFx0dGhpcy5rZXkoJ2FsZ29yaXRobScpLnVzZShBbGdvcml0aG1JZGVudGlmaWVyKSxcblx0XHR0aGlzLmtleSgnUHVibGljS2V5JykuYml0c3RyKClcblx0KTtcbn0pO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnYXNuMS5qcycpLmRlZmluZSgnVmVyc2lvbicsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLmludCgpO1xufSk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEFsZ29yaXRobUlkZW50aWZpZXIgPSByZXF1aXJlKCcuL2FsZ29yaXRobS1pZGVudGlmaWVyJyk7XG52YXIgVmVyc2lvbiA9IHJlcXVpcmUoJy4vdmVyc2lvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2FzbjEuanMnKS5kZWZpbmUoJ1ByaXZhdGVLZXlJbmZvJywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCd2ZXJzaW9uJykudXNlKFZlcnNpb24pLFxuXHRcdHRoaXMua2V5KCdwcml2YXRlS2V5QWxnb3JpdGhtJykudXNlKEFsZ29yaXRobUlkZW50aWZpZXIpLFxuXHRcdHRoaXMua2V5KCdwcml2YXRlS2V5Jykub2N0c3RyKCksXG5cdFx0dGhpcy5rZXkoJ2F0dHJpYnV0ZXMnKS5vcHRpb25hbCgpLmFueSgpXG5cdCk7XG59KTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNuMSA9IHJlcXVpcmUoJ2FzbjEuanMnKSxcblx0QnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXIsXG5cdEVDID0gcmVxdWlyZSgnZWxsaXB0aWMnKS5lYztcblxudmFyIGI2NFRvQm4gPSByZXF1aXJlKCcuL2I2NC10by1ibicpO1xuXG52YXIgUHVibGljS2V5SW5mbyA9IHJlcXVpcmUoJy4vYXNuMS9wdWJsaWMta2V5LWluZm8nKSxcblx0UHJpdmF0ZUtleUluZm8gPSByZXF1aXJlKCcuL2FzbjEvcHJpdmF0ZS1rZXktaW5mbycpLFxuXHRWZXJzaW9uID0gcmVxdWlyZSgnLi9hc24xL3ZlcnNpb24nKTtcblxudmFyIEVDUGFyYW1ldGVycyA9IGFzbjEuZGVmaW5lKCdFQ1BhcmFtZXRlcnMnLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5jaG9pY2Uoe1xuXHRcdG5hbWVkQ3VydmU6IHRoaXMub2JqaWQoKVxuXHR9KTtcbn0pO1xuXG52YXIgZWNQcml2a2V5VmVyMSA9IDE7XG5cbnZhciBFQ1ByaXZhdGVLZXkgPSBhc24xLmRlZmluZSgnRUNQcml2YXRlS2V5JywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCd2ZXJzaW9uJykudXNlKFZlcnNpb24pLFxuXHRcdHRoaXMua2V5KCdwcml2YXRlS2V5Jykub2N0c3RyKCksXG5cdFx0dGhpcy5rZXkoJ3BhcmFtZXRlcnMnKS5leHBsaWNpdCgwKS5vcHRpb25hbCgpLmFueSgpLFxuXHRcdHRoaXMua2V5KCdwdWJsaWNLZXknKS5leHBsaWNpdCgxKS5vcHRpb25hbCgpLmJpdHN0cigpXG5cdCk7XG59KTtcblxudmFyIGN1cnZlcyA9IHtcblx0J1AtMjU2JzogJ3AyNTYnLFxuXHQnUC0zODQnOiAncDM4NCcsXG5cdCdQLTUyMSc6ICdwNTIxJ1xufTtcblxudmFyIG9pZHMgPSB7XG5cdCdQLTI1Nic6IFsxLCAyLCA4NDAsIDEwMDQ1LCAzLCAxLCA3XSxcblx0J1AtMzg0JzogWzEsIDMsIDEzMiwgMCwgMzRdLFxuXHQnUC01MjEnOiBbMSwgMywgMTMyLCAwLCAzNV1cbn07XG52YXIgcGFyYW1ldGVycyA9IHt9O1xudmFyIGFsZ29yaXRobXMgPSB7fTtcbk9iamVjdC5rZXlzKG9pZHMpLmZvckVhY2goZnVuY3Rpb24oY3J2KSB7XG5cdHBhcmFtZXRlcnNbY3J2XSA9IEVDUGFyYW1ldGVycy5lbmNvZGUoe1xuXHRcdHR5cGU6ICduYW1lZEN1cnZlJyxcblx0XHR2YWx1ZTogb2lkc1tjcnZdXG5cdH0sICdkZXInKTtcblx0YWxnb3JpdGhtc1tjcnZdID0ge1xuXHRcdGFsZ29yaXRobTogIFsxLCAyLCA4NDAsIDEwMDQ1LCAyLCAxXSxcblx0XHRwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzW2Nydl1cblx0fTtcbn0pO1xub2lkcyA9IG51bGw7XG5cbmZ1bmN0aW9uIGVjSndrVG9CdWZmZXIoandrLCBvcHRzKSB7XG5cdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5jcnYpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5jcnZcIiB0byBiZSBhIFN0cmluZycpO1xuXHR9XG5cblx0dmFyIGhhc0QgPSAnc3RyaW5nJyA9PT0gdHlwZW9mIGp3ay5kO1xuXHR2YXIgeHlUeXBlcyA9IGhhc0Rcblx0XHQ/IFsndW5kZWZpbmVkJywgJ3N0cmluZyddXG5cdFx0OiBbJ3N0cmluZyddO1xuXG5cdGlmICgtMSA9PT0geHlUeXBlcy5pbmRleE9mKHR5cGVvZiBqd2sueCkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay54XCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdGlmICgtMSA9PT0geHlUeXBlcy5pbmRleE9mKHR5cGVvZiBqd2sueSkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay55XCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdGlmIChvcHRzLnByaXZhdGUgJiYgIWhhc0QpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5kXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdHZhciBjdXJ2ZU5hbWUgPSBjdXJ2ZXNbandrLmNydl07XG5cdGlmICghY3VydmVOYW1lKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBjdXJ2ZSBcIicgKyBqd2suY3J2ICsgJ1wiJyk7XG5cdH1cblxuXHR2YXIgY3VydmUgPSBuZXcgRUMoY3VydmVOYW1lKTtcblxuXHR2YXIga2V5ID0ge307XG5cblx0dmFyIGhhc1B1YiA9IGp3ay54ICYmIGp3ay55O1xuXHRpZiAoaGFzUHViKSB7XG5cdFx0a2V5LnB1YiA9IHtcblx0XHRcdHg6IGI2NFRvQm4oandrLngsIGZhbHNlKSxcblx0XHRcdHk6IGI2NFRvQm4oandrLnksIGZhbHNlKVxuXHRcdH07XG5cdH1cblxuXHRpZiAob3B0cy5wcml2YXRlIHx8ICFoYXNQdWIpIHtcblx0XHRrZXkucHJpdiA9IGI2NFRvQm4oandrLmQsIHRydWUpO1xuXHR9XG5cblx0a2V5ID0gY3VydmUua2V5UGFpcihrZXkpO1xuXG5cdHZhciBrZXlWYWxpZGF0aW9uID0ga2V5LnZhbGlkYXRlKCk7XG5cdGlmICgha2V5VmFsaWRhdGlvbi5yZXN1bHQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQga2V5IGZvciBjdXJ2ZTogXCInICsga2V5VmFsaWRhdGlvbi5yZWFzb24gKyAnXCInKTtcblx0fVxuXG5cdHZhciByZXN1bHQgPSBrZXlUb1BlbShqd2suY3J2LCBrZXksIG9wdHMpO1xuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGtleVRvUGVtKGNydiwga2V5LCBvcHRzKSB7XG5cdHZhciBjb21wYWN0ID0gZmFsc2U7XG5cdHZhciBwdWJsaWNLZXkgPSBrZXkuZ2V0UHVibGljKGNvbXBhY3QsICdoZXgnKTtcblx0cHVibGljS2V5ID0gQnVmZmVyLmZyb20ocHVibGljS2V5LCAnaGV4Jyk7XG5cdHB1YmxpY0tleSA9IHtcblx0XHR1bnVzZWQ6IDAsXG5cdFx0ZGF0YTogcHVibGljS2V5XG5cdH07XG5cblx0dmFyIHJlc3VsdDtcblx0aWYgKG9wdHMucHJpdmF0ZSkge1xuXHRcdHZhciBwcml2YXRlS2V5ID0ga2V5LmdldFByaXZhdGUoJ2hleCcpO1xuXHRcdHByaXZhdGVLZXkgPSBCdWZmZXIuZnJvbShwcml2YXRlS2V5LCAnaGV4Jyk7XG5cblx0XHRyZXN1bHQgPSBQcml2YXRlS2V5SW5mby5lbmNvZGUoe1xuXHRcdFx0dmVyc2lvbjogMCxcblx0XHRcdHByaXZhdGVLZXlBbGdvcml0aG06IGFsZ29yaXRobXNbY3J2XSxcblx0XHRcdHByaXZhdGVLZXk6IEVDUHJpdmF0ZUtleS5lbmNvZGUoe1xuXHRcdFx0XHR2ZXJzaW9uOiBlY1ByaXZrZXlWZXIxLFxuXHRcdFx0XHRwcml2YXRlS2V5OiBwcml2YXRlS2V5LFxuXHRcdFx0XHRwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzW2Nydl0sXG5cdFx0XHRcdHB1YmxpY0tleTogcHVibGljS2V5XG5cdFx0XHR9LCAnZGVyJylcblx0XHR9LCAncGVtJywge1xuXHRcdFx0bGFiZWw6ICdQUklWQVRFIEtFWSdcblx0XHR9KTtcblxuXHRcdHByaXZhdGVLZXkuZmlsbCgwKTtcblx0fSBlbHNlIHtcblx0XHRyZXN1bHQgPSBQdWJsaWNLZXlJbmZvLmVuY29kZSh7XG5cdFx0XHRhbGdvcml0aG06IGFsZ29yaXRobXNbY3J2XSxcblx0XHRcdFB1YmxpY0tleTogcHVibGljS2V5XG5cdFx0fSwgJ3BlbScsIHtcblx0XHRcdGxhYmVsOiAnUFVCTElDIEtFWSdcblx0XHR9KTtcblx0fVxuXG5cdC8vIFRoaXMgaXMgaW4gYW4gaWYgaW5jYXNlIGFzbjEuanMgYWRkcyBhIHRyYWlsaW5nIFxcblxuXHQvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuXHRpZiAoJ1xcbicgIT09IHJlc3VsdC5zbGljZSgtMSkpIHtcblx0XHRyZXN1bHQgKz0gJ1xcbic7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVjSndrVG9CdWZmZXI7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGFzbjEgPSByZXF1aXJlKCdhc24xLmpzJyk7XG5cbnZhciBiNjRUb0JuID0gcmVxdWlyZSgnLi9iNjQtdG8tYm4nKTtcblxudmFyIFB1YmxpY0tleUluZm8gPSByZXF1aXJlKCcuL2FzbjEvcHVibGljLWtleS1pbmZvJyksXG5cdFByaXZhdGVLZXlJbmZvID0gcmVxdWlyZSgnLi9hc24xL3ByaXZhdGUta2V5LWluZm8nKSxcblx0VmVyc2lvbiA9IHJlcXVpcmUoJy4vYXNuMS92ZXJzaW9uJyk7XG5cbnZhciBSU0FQcml2YXRlS2V5ID0gYXNuMS5kZWZpbmUoJ1JTQVByaXZhdGVLZXknLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5zZXEoKS5vYmooXG5cdFx0dGhpcy5rZXkoJ3ZlcnNpb24nKS51c2UoVmVyc2lvbiksXG5cdFx0dGhpcy5rZXkoJ21vZHVsdXMnKS5pbnQoKSxcblx0XHR0aGlzLmtleSgncHVibGljRXhwb25lbnQnKS5pbnQoKSxcblx0XHR0aGlzLmtleSgncHJpdmF0ZUV4cG9uZW50JykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ3ByaW1lMScpLmludCgpLFxuXHRcdHRoaXMua2V5KCdwcmltZTInKS5pbnQoKSxcblx0XHR0aGlzLmtleSgnZXhwb25lbnQxJykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ2V4cG9uZW50MicpLmludCgpLFxuXHRcdHRoaXMua2V5KCdjb2VmZmljaWVudCcpLmludCgpXG5cdCk7XG59KTtcblxudmFyIFJTQVB1YmxpY0tleSA9IGFzbjEuZGVmaW5lKCdSU0FQdWJsaWNLZXknLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5zZXEoKS5vYmooXG5cdFx0dGhpcy5rZXkoJ21vZHVsdXMnKS5pbnQoKSxcblx0XHR0aGlzLmtleSgncHVibGljRXhwb25lbnQnKS5pbnQoKVxuXHQpO1xufSk7XG5cbnZhciBhbGdvcml0aG0gPSB7XG5cdGFsZ29yaXRobTogWzEsIDIsIDg0MCwgMTEzNTQ5LCAxLCAxLCAxXSxcblx0cGFyYW1ldGVyczogWzUsIDBdXG59O1xuXG5mdW5jdGlvbiByc2FKd2tUb0J1ZmZlcihqd2ssIG9wdHMpIHtcblx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLmUpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5lXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5uKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sublwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHRpZiAob3B0cy5wcml2YXRlKSB7XG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLmQpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLmRcIiB0byBiZSBhIFN0cmluZycpO1xuXHRcdH1cblxuXHRcdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5wKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5wXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cblx0XHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2sucSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sucVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLmRwKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5kcFwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLmRxKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5kcVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLnFpKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5xaVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXHR9XG5cblx0dmFyIHBlbTtcblx0aWYgKG9wdHMucHJpdmF0ZSkge1xuXHRcdHBlbSA9IFByaXZhdGVLZXlJbmZvLmVuY29kZSh7XG5cdFx0XHR2ZXJzaW9uOiAwLFxuXHRcdFx0cHJpdmF0ZUtleUFsZ29yaXRobTogYWxnb3JpdGhtLFxuXHRcdFx0cHJpdmF0ZUtleTogUlNBUHJpdmF0ZUtleS5lbmNvZGUoe1xuXHRcdFx0XHR2ZXJzaW9uOiAwLFxuXHRcdFx0XHRtb2R1bHVzOiBiNjRUb0JuKGp3ay5uLCBmYWxzZSksXG5cdFx0XHRcdHB1YmxpY0V4cG9uZW50OiBiNjRUb0JuKGp3ay5lLCBmYWxzZSksXG5cdFx0XHRcdHByaXZhdGVFeHBvbmVudDogYjY0VG9Cbihqd2suZCwgdHJ1ZSksXG5cdFx0XHRcdHByaW1lMTogYjY0VG9Cbihqd2sucCwgdHJ1ZSksXG5cdFx0XHRcdHByaW1lMjogYjY0VG9Cbihqd2sucSwgdHJ1ZSksXG5cdFx0XHRcdGV4cG9uZW50MTogYjY0VG9Cbihqd2suZHAsIHRydWUpLFxuXHRcdFx0XHRleHBvbmVudDI6IGI2NFRvQm4oandrLmRxLCB0cnVlKSxcblx0XHRcdFx0Y29lZmZpY2llbnQ6IGI2NFRvQm4oandrLnFpLCB0cnVlKVxuXHRcdFx0fSwgJ2RlcicpXG5cdFx0fSwgJ3BlbScsIHtcblx0XHRcdGxhYmVsOiAnUFJJVkFURSBLRVknXG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0cGVtID0gUHVibGljS2V5SW5mby5lbmNvZGUoe1xuXHRcdFx0YWxnb3JpdGhtOiBhbGdvcml0aG0sXG5cdFx0XHRQdWJsaWNLZXk6IHtcblx0XHRcdFx0dW51c2VkOiAwLFxuXHRcdFx0XHRkYXRhOiBSU0FQdWJsaWNLZXkuZW5jb2RlKHtcblx0XHRcdFx0XHRtb2R1bHVzOiBiNjRUb0JuKGp3ay5uLCBmYWxzZSksXG5cdFx0XHRcdFx0cHVibGljRXhwb25lbnQ6IGI2NFRvQm4oandrLmUsIGZhbHNlKVxuXHRcdFx0XHR9LCAnZGVyJylcblx0XHRcdH1cblx0XHR9LCAncGVtJywge1xuXHRcdFx0bGFiZWw6ICdQVUJMSUMgS0VZJ1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gVGhpcyBpcyBpbiBhbiBpZiBpbmNhc2UgYXNuMS5qcyBhZGRzIGEgdHJhaWxpbmcgXFxuXG5cdC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlXG5cdGlmICgnXFxuJyAhPT0gcGVtLnNsaWNlKC0xKSkge1xuXHRcdHBlbSArPSAnXFxuJztcblx0fVxuXG5cdHJldHVybiBwZW07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcnNhSndrVG9CdWZmZXI7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGVjID0gcmVxdWlyZSgnLi9lYycpLFxuXHRyc2EgPSByZXF1aXJlKCcuL3JzYScpO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3trdHk6J0VDJywgY3J2OnN0cmluZywgZDpzdHJpbmcsIHg/OnN0cmluZywgeT86c3RyaW5nfSB8IHtrdHk6J0VDJywgY3J2OnN0cmluZywgeDpzdHJpbmcsIHk6c3RyaW5nfSB8IHtrdHk6J1JTQScsIGU6c3RyaW5nLCBuOnN0cmluZywgZD86c3RyaW5nLCBwPzpzdHJpbmcsIHE/OnN0cmluZywgZHA/OnN0cmluZywgZHE/OnN0cmluZywgcWk/OnN0cmluZ319IGp3a1xuICogQHBhcmFtIHt7cHJpdmF0ZTpib29sZWFufT19IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGp3a1RvQnVmZmVyKGp3aywgb3B0cykge1xuXHRpZiAoJ29iamVjdCcgIT09IHR5cGVvZiBqd2sgfHwgbnVsbCA9PT0gandrKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2tcIiB0byBiZSBhbiBPYmplY3QnKTtcblx0fVxuXG5cdHZhciBrdHkgPSBqd2sua3R5O1xuXHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBrdHkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5rdHlcIiB0byBiZSBhIFN0cmluZycpO1xuXHR9XG5cblx0b3B0cyA9IG9wdHMgfHwge307XG5cdG9wdHMucHJpdmF0ZSA9IG9wdHMucHJpdmF0ZSA9PT0gdHJ1ZTtcblxuXHRzd2l0Y2ggKGt0eSkge1xuXHRcdGNhc2UgJ0VDJzoge1xuXHRcdFx0cmV0dXJuIGVjKGp3aywgb3B0cyk7XG5cdFx0fVxuXHRcdGNhc2UgJ1JTQSc6IHtcblx0XHRcdHJldHVybiByc2EoandrLCBvcHRzKTtcblx0XHR9XG5cdFx0ZGVmYXVsdDoge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBrZXkgdHlwZSBcIicgKyBrdHkgKyAnXCInKTtcblx0XHR9XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBqd2tUb0J1ZmZlcjtcbiIsCiAgICAiXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29va2llcyhoZWFkZXJzOiBIZWFkZXJzKSB7XG4gIGlmICghaGVhZGVycykgcmV0dXJuIHt9O1xuICBjb25zdCBjb29raWVIZWFkZXIgPSBoZWFkZXJzLmdldChcIkNvb2tpZVwiKTtcbiAgY29uc3QgY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGlmIChjb29raWVIZWFkZXIgPT09IG51bGwpIHJldHVybiB7fTtcblxuICBmb3IgKGNvbnN0IGt2IG9mIGNvb2tpZUhlYWRlci5zcGxpdChcIjtcIikpIHtcbiAgICBjb25zdCBbY29va2llS2V5LCAuLi5jb29raWVWYWxdID0ga3Yuc3BsaXQoXCI9XCIpO1xuICAgIGNvbnN0IGtleSA9IGNvb2tpZUtleS50cmltKCk7XG4gICAgY29va2llc1trZXldID0gY29va2llVmFsLmpvaW4oXCI9XCIpO1xuICB9XG5cbiAgcmV0dXJuIGNvb2tpZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb29raWUocmVzcG9uc2U6IFJlc3BvbnNlLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgbWF4QWdlPzogbnVtYmVyKSB7XG4gIHJlc3BvbnNlLmhlYWRlcnMuYXBwZW5kKCdTZXQtQ29va2llJywgYCR7a2V5fT0ke3ZhbHVlfSR7bWF4QWdlID8gJzsgUGF0aD0vOyBNYXgtQWdlPScgKyBtYXhBZ2UgOiAnJ31gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUNvb2tpZShyZXNwb25zZTogUmVzcG9uc2UsIGtleTogc3RyaW5nKSB7XG4gIHJlc3BvbnNlLmhlYWRlcnMuYXBwZW5kKCdTZXQtQ29va2llJywgYCR7a2V5fT1cIlwiOyBQYXRoPS87IE1heC1BZ2U9LTE7YCk7XG59IiwKICAgICIvLyNyZWdpb24gcm9sbGRvd246cnVudGltZVxudmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2V4cG9ydCA9ICh0YXJnZXQsIGFsbCkgPT4ge1xuXHRmb3IgKHZhciBuYW1lIGluIGFsbCkgX19kZWZQcm9wKHRhcmdldCwgbmFtZSwge1xuXHRcdGdldDogYWxsW25hbWVdLFxuXHRcdGVudW1lcmFibGU6IHRydWVcblx0fSk7XG59O1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IF9fZXhwb3J0IH07IiwKICAgICJjb25zdCBlbnRpdHlLaW5kID0gU3ltYm9sLmZvcihcImRyaXp6bGU6ZW50aXR5S2luZFwiKTtcbmNvbnN0IGhhc093bkVudGl0eUtpbmQgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpoYXNPd25FbnRpdHlLaW5kXCIpO1xuZnVuY3Rpb24gaXModmFsdWUsIHR5cGUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgdHlwZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHR5cGUsIGVudGl0eUtpbmQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENsYXNzIFwiJHt0eXBlLm5hbWUgPz8gXCI8dW5rbm93bj5cIn1cIiBkb2Vzbid0IGxvb2sgbGlrZSBhIERyaXp6bGUgZW50aXR5LiBJZiB0aGlzIGlzIGluY29ycmVjdCBhbmQgdGhlIGNsYXNzIGlzIHByb3ZpZGVkIGJ5IERyaXp6bGUsIHBsZWFzZSByZXBvcnQgdGhpcyBhcyBhIGJ1Zy5gXG4gICAgKTtcbiAgfVxuICBsZXQgY2xzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKS5jb25zdHJ1Y3RvcjtcbiAgaWYgKGNscykge1xuICAgIHdoaWxlIChjbHMpIHtcbiAgICAgIGlmIChlbnRpdHlLaW5kIGluIGNscyAmJiBjbHNbZW50aXR5S2luZF0gPT09IHR5cGVbZW50aXR5S2luZF0pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjbHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2xzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IHtcbiAgZW50aXR5S2luZCxcbiAgaGFzT3duRW50aXR5S2luZCxcbiAgaXNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbnRpdHkuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5jbGFzcyBDb2x1bW4ge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMubmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgIHRoaXMua2V5QXNOYW1lID0gY29uZmlnLmtleUFzTmFtZTtcbiAgICB0aGlzLm5vdE51bGwgPSBjb25maWcubm90TnVsbDtcbiAgICB0aGlzLmRlZmF1bHQgPSBjb25maWcuZGVmYXVsdDtcbiAgICB0aGlzLmRlZmF1bHRGbiA9IGNvbmZpZy5kZWZhdWx0Rm47XG4gICAgdGhpcy5vblVwZGF0ZUZuID0gY29uZmlnLm9uVXBkYXRlRm47XG4gICAgdGhpcy5oYXNEZWZhdWx0ID0gY29uZmlnLmhhc0RlZmF1bHQ7XG4gICAgdGhpcy5wcmltYXJ5ID0gY29uZmlnLnByaW1hcnlLZXk7XG4gICAgdGhpcy5pc1VuaXF1ZSA9IGNvbmZpZy5pc1VuaXF1ZTtcbiAgICB0aGlzLnVuaXF1ZU5hbWUgPSBjb25maWcudW5pcXVlTmFtZTtcbiAgICB0aGlzLnVuaXF1ZVR5cGUgPSBjb25maWcudW5pcXVlVHlwZTtcbiAgICB0aGlzLmRhdGFUeXBlID0gY29uZmlnLmRhdGFUeXBlO1xuICAgIHRoaXMuY29sdW1uVHlwZSA9IGNvbmZpZy5jb2x1bW5UeXBlO1xuICAgIHRoaXMuZ2VuZXJhdGVkID0gY29uZmlnLmdlbmVyYXRlZDtcbiAgICB0aGlzLmdlbmVyYXRlZElkZW50aXR5ID0gY29uZmlnLmdlbmVyYXRlZElkZW50aXR5O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkNvbHVtblwiO1xuICBuYW1lO1xuICBrZXlBc05hbWU7XG4gIHByaW1hcnk7XG4gIG5vdE51bGw7XG4gIGRlZmF1bHQ7XG4gIGRlZmF1bHRGbjtcbiAgb25VcGRhdGVGbjtcbiAgaGFzRGVmYXVsdDtcbiAgaXNVbmlxdWU7XG4gIHVuaXF1ZU5hbWU7XG4gIHVuaXF1ZVR5cGU7XG4gIGRhdGFUeXBlO1xuICBjb2x1bW5UeXBlO1xuICBlbnVtVmFsdWVzID0gdm9pZCAwO1xuICBnZW5lcmF0ZWQgPSB2b2lkIDA7XG4gIGdlbmVyYXRlZElkZW50aXR5ID0gdm9pZCAwO1xuICBjb25maWc7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIC8vICoqIEBpbnRlcm5hbCAqL1xuICBzaG91bGREaXNhYmxlSW5zZXJ0KCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQgIT09IHZvaWQgMCAmJiB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQudHlwZSAhPT0gXCJieURlZmF1bHRcIjtcbiAgfVxufVxuZXhwb3J0IHtcbiAgQ29sdW1uXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29sdW1uLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuY2xhc3MgQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkNvbHVtbkJ1aWxkZXJcIjtcbiAgY29uZmlnO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBkYXRhVHlwZSwgY29sdW1uVHlwZSkge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGtleUFzTmFtZTogbmFtZSA9PT0gXCJcIixcbiAgICAgIG5vdE51bGw6IGZhbHNlLFxuICAgICAgZGVmYXVsdDogdm9pZCAwLFxuICAgICAgaGFzRGVmYXVsdDogZmFsc2UsXG4gICAgICBwcmltYXJ5S2V5OiBmYWxzZSxcbiAgICAgIGlzVW5pcXVlOiBmYWxzZSxcbiAgICAgIHVuaXF1ZU5hbWU6IHZvaWQgMCxcbiAgICAgIHVuaXF1ZVR5cGU6IHZvaWQgMCxcbiAgICAgIGRhdGFUeXBlLFxuICAgICAgY29sdW1uVHlwZSxcbiAgICAgIGdlbmVyYXRlZDogdm9pZCAwXG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogQ2hhbmdlcyB0aGUgZGF0YSB0eXBlIG9mIHRoZSBjb2x1bW4uIENvbW1vbmx5IHVzZWQgd2l0aCBganNvbmAgY29sdW1ucy4gQWxzbywgdXNlZnVsIGZvciBicmFuZGVkIHR5cGVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBjb25zdCB1c2VycyA9IHBnVGFibGUoJ3VzZXJzJywge1xuICAgKiBcdGlkOiBpbnRlZ2VyKCdpZCcpLiR0eXBlPFVzZXJJZD4oKS5wcmltYXJ5S2V5KCksXG4gICAqIFx0ZGV0YWlsczoganNvbignZGV0YWlscycpLiR0eXBlPFVzZXJEZXRhaWxzPigpLm5vdE51bGwoKSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgJHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBgbm90IG51bGxgIGNsYXVzZSB0byB0aGUgY29sdW1uIGRlZmluaXRpb24uXG4gICAqXG4gICAqIEFmZmVjdHMgdGhlIGBzZWxlY3RgIG1vZGVsIG9mIHRoZSB0YWJsZSAtIGNvbHVtbnMgKndpdGhvdXQqIGBub3QgbnVsbGAgd2lsbCBiZSBudWxsYWJsZSBvbiBzZWxlY3QuXG4gICAqL1xuICBub3ROdWxsKCkge1xuICAgIHRoaXMuY29uZmlnLm5vdE51bGwgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgYGRlZmF1bHQgPHZhbHVlPmAgY2xhdXNlIHRvIHRoZSBjb2x1bW4gZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQWZmZWN0cyB0aGUgYGluc2VydGAgbW9kZWwgb2YgdGhlIHRhYmxlIC0gY29sdW1ucyAqd2l0aCogYGRlZmF1bHRgIGFyZSBvcHRpb25hbCBvbiBpbnNlcnQuXG4gICAqXG4gICAqIElmIHlvdSBuZWVkIHRvIHNldCBhIGR5bmFtaWMgZGVmYXVsdCB2YWx1ZSwgdXNlIHtAbGluayAkZGVmYXVsdEZufSBpbnN0ZWFkLlxuICAgKi9cbiAgZGVmYXVsdCh2YWx1ZSkge1xuICAgIHRoaXMuY29uZmlnLmRlZmF1bHQgPSB2YWx1ZTtcbiAgICB0aGlzLmNvbmZpZy5oYXNEZWZhdWx0ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGR5bmFtaWMgZGVmYXVsdCB2YWx1ZSB0byB0aGUgY29sdW1uLlxuICAgKiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgcm93IGlzIGluc2VydGVkLCBhbmQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgY29sdW1uIHZhbHVlLlxuICAgKlxuICAgKiAqKk5vdGU6KiogVGhpcyB2YWx1ZSBkb2VzIG5vdCBhZmZlY3QgdGhlIGBkcml6emxlLWtpdGAgYmVoYXZpb3IsIGl0IGlzIG9ubHkgdXNlZCBhdCBydW50aW1lIGluIGBkcml6emxlLW9ybWAuXG4gICAqL1xuICAkZGVmYXVsdEZuKGZuKSB7XG4gICAgdGhpcy5jb25maWcuZGVmYXVsdEZuID0gZm47XG4gICAgdGhpcy5jb25maWcuaGFzRGVmYXVsdCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFsaWFzIGZvciB7QGxpbmsgJGRlZmF1bHRGbn0uXG4gICAqL1xuICAkZGVmYXVsdCA9IHRoaXMuJGRlZmF1bHRGbjtcbiAgLyoqXG4gICAqIEFkZHMgYSBkeW5hbWljIHVwZGF0ZSB2YWx1ZSB0byB0aGUgY29sdW1uLlxuICAgKiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgcm93IGlzIHVwZGF0ZWQsIGFuZCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIHRoZSBjb2x1bW4gdmFsdWUgaWYgbm9uZSBpcyBwcm92aWRlZC5cbiAgICogSWYgbm8gYGRlZmF1bHRgIChvciBgJGRlZmF1bHRGbmApIHZhbHVlIGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgcm93IGlzIGluc2VydGVkIGFzIHdlbGwsIGFuZCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIHRoZSBjb2x1bW4gdmFsdWUuXG4gICAqXG4gICAqICoqTm90ZToqKiBUaGlzIHZhbHVlIGRvZXMgbm90IGFmZmVjdCB0aGUgYGRyaXp6bGUta2l0YCBiZWhhdmlvciwgaXQgaXMgb25seSB1c2VkIGF0IHJ1bnRpbWUgaW4gYGRyaXp6bGUtb3JtYC5cbiAgICovXG4gICRvblVwZGF0ZUZuKGZuKSB7XG4gICAgdGhpcy5jb25maWcub25VcGRhdGVGbiA9IGZuO1xuICAgIHRoaXMuY29uZmlnLmhhc0RlZmF1bHQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBbGlhcyBmb3Ige0BsaW5rICRvblVwZGF0ZUZufS5cbiAgICovXG4gICRvblVwZGF0ZSA9IHRoaXMuJG9uVXBkYXRlRm47XG4gIC8qKlxuICAgKiBBZGRzIGEgYHByaW1hcnkga2V5YCBjbGF1c2UgdG8gdGhlIGNvbHVtbiBkZWZpbml0aW9uLiBUaGlzIGltcGxpY2l0bHkgbWFrZXMgdGhlIGNvbHVtbiBgbm90IG51bGxgLlxuICAgKlxuICAgKiBJbiBTUUxpdGUsIGBpbnRlZ2VyIHByaW1hcnkga2V5YCBpbXBsaWNpdGx5IG1ha2VzIHRoZSBjb2x1bW4gYXV0by1pbmNyZW1lbnRpbmcuXG4gICAqL1xuICBwcmltYXJ5S2V5KCkge1xuICAgIHRoaXMuY29uZmlnLnByaW1hcnlLZXkgPSB0cnVlO1xuICAgIHRoaXMuY29uZmlnLm5vdE51bGwgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgU2V0cyB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHRoZSBrZXkgd2l0aGluIHRoZSB0YWJsZSBkZWZpbml0aW9uIGlmIGEgbmFtZSB3YXMgbm90IGdpdmVuLiAqL1xuICBzZXROYW1lKG5hbWUpIHtcbiAgICBpZiAodGhpcy5jb25maWcubmFtZSAhPT0gXCJcIikgcmV0dXJuO1xuICAgIHRoaXMuY29uZmlnLm5hbWUgPSBuYW1lO1xuICB9XG59XG5leHBvcnQge1xuICBDb2x1bW5CdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29sdW1uLWJ1aWxkZXIuanMubWFwIiwKICAgICJjb25zdCBUYWJsZU5hbWUgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpOYW1lXCIpO1xuZXhwb3J0IHtcbiAgVGFibGVOYW1lXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFibGUudXRpbHMuanMubWFwIiwKICAgICJmdW5jdGlvbiBpaWZlKGZuLCAuLi5hcmdzKSB7XG4gIHJldHVybiBmbiguLi5hcmdzKTtcbn1cbmV4cG9ydCB7XG4gIGlpZmVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjaW5nLXV0aWxzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlTmFtZSB9IGZyb20gXCIuLi90YWJsZS51dGlscy5qc1wiO1xuZnVuY3Rpb24gdW5pcXVlKG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyKG5hbWUpO1xufVxuZnVuY3Rpb24gdW5pcXVlS2V5TmFtZSh0YWJsZSwgY29sdW1ucykge1xuICByZXR1cm4gYCR7dGFibGVbVGFibGVOYW1lXX1fJHtjb2x1bW5zLmpvaW4oXCJfXCIpfV91bmlxdWVgO1xufVxuY2xhc3MgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIge1xuICBjb25zdHJ1Y3Rvcihjb2x1bW5zLCBuYW1lKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnVW5pcXVlQ29uc3RyYWludEJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb2x1bW5zO1xuICAvKiogQGludGVybmFsICovXG4gIG51bGxzTm90RGlzdGluY3RDb25maWcgPSBmYWxzZTtcbiAgbnVsbHNOb3REaXN0aW5jdCgpIHtcbiAgICB0aGlzLm51bGxzTm90RGlzdGluY3RDb25maWcgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnQodGFibGUsIHRoaXMuY29sdW1ucywgdGhpcy5udWxsc05vdERpc3RpbmN0Q29uZmlnLCB0aGlzLm5hbWUpO1xuICB9XG59XG5jbGFzcyBVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbmFtZTtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cbiAgb24oLi4uY29sdW1ucykge1xuICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIoY29sdW1ucywgdGhpcy5uYW1lKTtcbiAgfVxufVxuY2xhc3MgVW5pcXVlQ29uc3RyYWludCB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb2x1bW5zLCBudWxsc05vdERpc3RpbmN0LCBuYW1lKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gICAgdGhpcy5uYW1lID0gbmFtZSA/PyB1bmlxdWVLZXlOYW1lKHRoaXMudGFibGUsIHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpKTtcbiAgICB0aGlzLm51bGxzTm90RGlzdGluY3QgPSBudWxsc05vdERpc3RpbmN0O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnVW5pcXVlQ29uc3RyYWludFwiO1xuICBjb2x1bW5zO1xuICBuYW1lO1xuICBudWxsc05vdERpc3RpbmN0ID0gZmFsc2U7XG4gIGdldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgVW5pcXVlQ29uc3RyYWludCxcbiAgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIsXG4gIFVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXIsXG4gIHVuaXF1ZSxcbiAgdW5pcXVlS2V5TmFtZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuaXF1ZS1jb25zdHJhaW50LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuLi8uLi9jb2x1bW4tYnVpbGRlci5qc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uLy4uL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBGb3JlaWduS2V5QnVpbGRlciB9IGZyb20gXCIuLi9mb3JlaWduLWtleXMuanNcIjtcbmltcG9ydCB7IGlpZmUgfSBmcm9tIFwiLi4vLi4vdHJhY2luZy11dGlscy5qc1wiO1xuaW1wb3J0IHsgdW5pcXVlS2V5TmFtZSB9IGZyb20gXCIuLi91bmlxdWUtY29uc3RyYWludC5qc1wiO1xuaW1wb3J0IHsgbWFrZVBnQXJyYXksIHBhcnNlUGdBcnJheSB9IGZyb20gXCIuLi91dGlscy9hcnJheS5qc1wiO1xuY2xhc3MgUGdDb2x1bW5CdWlsZGVyIGV4dGVuZHMgQ29sdW1uQnVpbGRlciB7XG4gIGZvcmVpZ25LZXlDb25maWdzID0gW107XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnQ29sdW1uQnVpbGRlclwiO1xuICBhcnJheShzaXplKSB7XG4gICAgcmV0dXJuIG5ldyBQZ0FycmF5QnVpbGRlcih0aGlzLmNvbmZpZy5uYW1lLCB0aGlzLCBzaXplKTtcbiAgfVxuICByZWZlcmVuY2VzKHJlZiwgYWN0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5mb3JlaWduS2V5Q29uZmlncy5wdXNoKHsgcmVmLCBhY3Rpb25zIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHVuaXF1ZShuYW1lLCBjb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZy5pc1VuaXF1ZSA9IHRydWU7XG4gICAgdGhpcy5jb25maWcudW5pcXVlTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5jb25maWcudW5pcXVlVHlwZSA9IGNvbmZpZz8ubnVsbHM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2VuZXJhdGVkQWx3YXlzQXMoYXMpIHtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQgPSB7XG4gICAgICBhcyxcbiAgICAgIHR5cGU6IFwiYWx3YXlzXCIsXG4gICAgICBtb2RlOiBcInN0b3JlZFwiXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkRm9yZWlnbktleXMoY29sdW1uLCB0YWJsZSkge1xuICAgIHJldHVybiB0aGlzLmZvcmVpZ25LZXlDb25maWdzLm1hcCgoeyByZWYsIGFjdGlvbnMgfSkgPT4ge1xuICAgICAgcmV0dXJuIGlpZmUoXG4gICAgICAgIChyZWYyLCBhY3Rpb25zMikgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgRm9yZWlnbktleUJ1aWxkZXIoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9yZWlnbkNvbHVtbiA9IHJlZjIoKTtcbiAgICAgICAgICAgIHJldHVybiB7IGNvbHVtbnM6IFtjb2x1bW5dLCBmb3JlaWduQ29sdW1uczogW2ZvcmVpZ25Db2x1bW5dIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGFjdGlvbnMyLm9uVXBkYXRlKSB7XG4gICAgICAgICAgICBidWlsZGVyLm9uVXBkYXRlKGFjdGlvbnMyLm9uVXBkYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGFjdGlvbnMyLm9uRGVsZXRlKSB7XG4gICAgICAgICAgICBidWlsZGVyLm9uRGVsZXRlKGFjdGlvbnMyLm9uRGVsZXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQodGFibGUpO1xuICAgICAgICB9LFxuICAgICAgICByZWYsXG4gICAgICAgIGFjdGlvbnNcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZEV4dHJhQ29uZmlnQ29sdW1uKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBFeHRyYUNvbmZpZ0NvbHVtbih0YWJsZSwgdGhpcy5jb25maWcpO1xuICB9XG59XG5jbGFzcyBQZ0NvbHVtbiBleHRlbmRzIENvbHVtbiB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICBpZiAoIWNvbmZpZy51bmlxdWVOYW1lKSB7XG4gICAgICBjb25maWcudW5pcXVlTmFtZSA9IHVuaXF1ZUtleU5hbWUodGFibGUsIFtjb25maWcubmFtZV0pO1xuICAgIH1cbiAgICBzdXBlcih0YWJsZSwgY29uZmlnKTtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdDb2x1bW5cIjtcbn1cbmNsYXNzIEV4dHJhQ29uZmlnQ29sdW1uIGV4dGVuZHMgUGdDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJFeHRyYUNvbmZpZ0NvbHVtblwiO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFNRTFR5cGUoKTtcbiAgfVxuICBpbmRleENvbmZpZyA9IHtcbiAgICBvcmRlcjogdGhpcy5jb25maWcub3JkZXIgPz8gXCJhc2NcIixcbiAgICBudWxsczogdGhpcy5jb25maWcubnVsbHMgPz8gXCJsYXN0XCIsXG4gICAgb3BDbGFzczogdGhpcy5jb25maWcub3BDbGFzc1xuICB9O1xuICBkZWZhdWx0Q29uZmlnID0ge1xuICAgIG9yZGVyOiBcImFzY1wiLFxuICAgIG51bGxzOiBcImxhc3RcIixcbiAgICBvcENsYXNzOiB2b2lkIDBcbiAgfTtcbiAgYXNjKCkge1xuICAgIHRoaXMuaW5kZXhDb25maWcub3JkZXIgPSBcImFzY1wiO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGRlc2MoKSB7XG4gICAgdGhpcy5pbmRleENvbmZpZy5vcmRlciA9IFwiZGVzY1wiO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG51bGxzRmlyc3QoKSB7XG4gICAgdGhpcy5pbmRleENvbmZpZy5udWxscyA9IFwiZmlyc3RcIjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBudWxsc0xhc3QoKSB7XG4gICAgdGhpcy5pbmRleENvbmZpZy5udWxscyA9IFwibGFzdFwiO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiAjIyMgUG9zdGdyZVNRTCBkb2N1bWVudGF0aW9uIHF1b3RlXG4gICAqXG4gICAqID4gQW4gb3BlcmF0b3IgY2xhc3Mgd2l0aCBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGVhY2ggY29sdW1uIG9mIGFuIGluZGV4LlxuICAgKiBUaGUgb3BlcmF0b3IgY2xhc3MgaWRlbnRpZmllcyB0aGUgb3BlcmF0b3JzIHRvIGJlIHVzZWQgYnkgdGhlIGluZGV4IGZvciB0aGF0IGNvbHVtbi5cbiAgICogRm9yIGV4YW1wbGUsIGEgQi10cmVlIGluZGV4IG9uIGZvdXItYnl0ZSBpbnRlZ2VycyB3b3VsZCB1c2UgdGhlIGludDRfb3BzIGNsYXNzO1xuICAgKiB0aGlzIG9wZXJhdG9yIGNsYXNzIGluY2x1ZGVzIGNvbXBhcmlzb24gZnVuY3Rpb25zIGZvciBmb3VyLWJ5dGUgaW50ZWdlcnMuXG4gICAqIEluIHByYWN0aWNlIHRoZSBkZWZhdWx0IG9wZXJhdG9yIGNsYXNzIGZvciB0aGUgY29sdW1uJ3MgZGF0YSB0eXBlIGlzIHVzdWFsbHkgc3VmZmljaWVudC5cbiAgICogVGhlIG1haW4gcG9pbnQgb2YgaGF2aW5nIG9wZXJhdG9yIGNsYXNzZXMgaXMgdGhhdCBmb3Igc29tZSBkYXRhIHR5cGVzLCB0aGVyZSBjb3VsZCBiZSBtb3JlIHRoYW4gb25lIG1lYW5pbmdmdWwgb3JkZXJpbmcuXG4gICAqIEZvciBleGFtcGxlLCB3ZSBtaWdodCB3YW50IHRvIHNvcnQgYSBjb21wbGV4LW51bWJlciBkYXRhIHR5cGUgZWl0aGVyIGJ5IGFic29sdXRlIHZhbHVlIG9yIGJ5IHJlYWwgcGFydC5cbiAgICogV2UgY291bGQgZG8gdGhpcyBieSBkZWZpbmluZyB0d28gb3BlcmF0b3IgY2xhc3NlcyBmb3IgdGhlIGRhdGEgdHlwZSBhbmQgdGhlbiBzZWxlY3RpbmcgdGhlIHByb3BlciBjbGFzcyB3aGVuIGNyZWF0aW5nIGFuIGluZGV4LlxuICAgKiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IG9wZXJhdG9yIGNsYXNzZXMgY2hlY2s6XG4gICAqXG4gICAqICMjIyBVc2VmdWwgbGlua3NcbiAgICogaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvZG9jcy9jdXJyZW50L3NxbC1jcmVhdGVpbmRleC5odG1sXG4gICAqXG4gICAqIGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC9pbmRleGVzLW9wY2xhc3MuaHRtbFxuICAgKlxuICAgKiBodHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzL2N1cnJlbnQveGluZGV4Lmh0bWxcbiAgICpcbiAgICogIyMjIEFkZGl0aW9uYWwgdHlwZXNcbiAgICogSWYgeW91IGhhdmUgdGhlIGBwZ192ZWN0b3JgIGV4dGVuc2lvbiBpbnN0YWxsZWQgaW4geW91ciBkYXRhYmFzZSwgeW91IGNhbiB1c2UgdGhlXG4gICAqIGB2ZWN0b3JfbDJfb3BzYCwgYHZlY3Rvcl9pcF9vcHNgLCBgdmVjdG9yX2Nvc2luZV9vcHNgLCBgdmVjdG9yX2wxX29wc2AsIGBiaXRfaGFtbWluZ19vcHNgLCBgYml0X2phY2NhcmRfb3BzYCwgYGhhbGZ2ZWNfbDJfb3BzYCwgYHNwYXJzZXZlY19sMl9vcHNgIG9wdGlvbnMsIHdoaWNoIGFyZSBwcmVkZWZpbmVkIHR5cGVzLlxuICAgKlxuICAgKiAqKllvdSBjYW4gYWx3YXlzIHNwZWNpZnkgYW55IHN0cmluZyB5b3Ugd2FudCBpbiB0aGUgb3BlcmF0b3IgY2xhc3MsIGluIGNhc2UgRHJpenpsZSBkb2Vzbid0IGhhdmUgaXQgbmF0aXZlbHkgaW4gaXRzIHR5cGVzKipcbiAgICpcbiAgICogQHBhcmFtIG9wQ2xhc3NcbiAgICogQHJldHVybnNcbiAgICovXG4gIG9wKG9wQ2xhc3MpIHtcbiAgICB0aGlzLmluZGV4Q29uZmlnLm9wQ2xhc3MgPSBvcENsYXNzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5jbGFzcyBJbmRleGVkQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiSW5kZXhlZENvbHVtblwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBrZXlBc05hbWUsIHR5cGUsIGluZGV4Q29uZmlnKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmtleUFzTmFtZSA9IGtleUFzTmFtZTtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuaW5kZXhDb25maWcgPSBpbmRleENvbmZpZztcbiAgfVxuICBuYW1lO1xuICBrZXlBc05hbWU7XG4gIHR5cGU7XG4gIGluZGV4Q29uZmlnO1xufVxuY2xhc3MgUGdBcnJheUJ1aWxkZXIgZXh0ZW5kcyBQZ0NvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0FycmF5QnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBiYXNlQnVpbGRlciwgc2l6ZSkge1xuICAgIHN1cGVyKG5hbWUsIFwiYXJyYXlcIiwgXCJQZ0FycmF5XCIpO1xuICAgIHRoaXMuY29uZmlnLmJhc2VCdWlsZGVyID0gYmFzZUJ1aWxkZXI7XG4gICAgdGhpcy5jb25maWcuc2l6ZSA9IHNpemU7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIGNvbnN0IGJhc2VDb2x1bW4gPSB0aGlzLmNvbmZpZy5iYXNlQnVpbGRlci5idWlsZCh0YWJsZSk7XG4gICAgcmV0dXJuIG5ldyBQZ0FycmF5KFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZyxcbiAgICAgIGJhc2VDb2x1bW5cbiAgICApO1xuICB9XG59XG5jbGFzcyBQZ0FycmF5IGV4dGVuZHMgUGdDb2x1bW4ge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnLCBiYXNlQ29sdW1uLCByYW5nZSkge1xuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICAgIHRoaXMuYmFzZUNvbHVtbiA9IGJhc2VDb2x1bW47XG4gICAgdGhpcy5yYW5nZSA9IHJhbmdlO1xuICAgIHRoaXMuc2l6ZSA9IGNvbmZpZy5zaXplO1xuICB9XG4gIHNpemU7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnQXJyYXlcIjtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5iYXNlQ29sdW1uLmdldFNRTFR5cGUoKX1bJHt0eXBlb2YgdGhpcy5zaXplID09PSBcIm51bWJlclwiID8gdGhpcy5zaXplIDogXCJcIn1dYDtcbiAgfVxuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2YWx1ZSA9IHBhcnNlUGdBcnJheSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS5tYXAoKHYpID0+IHRoaXMuYmFzZUNvbHVtbi5tYXBGcm9tRHJpdmVyVmFsdWUodikpO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUsIGlzTmVzdGVkQXJyYXkgPSBmYWxzZSkge1xuICAgIGNvbnN0IGEgPSB2YWx1ZS5tYXAoXG4gICAgICAodikgPT4gdiA9PT0gbnVsbCA/IG51bGwgOiBpcyh0aGlzLmJhc2VDb2x1bW4sIFBnQXJyYXkpID8gdGhpcy5iYXNlQ29sdW1uLm1hcFRvRHJpdmVyVmFsdWUodiwgdHJ1ZSkgOiB0aGlzLmJhc2VDb2x1bW4ubWFwVG9Ecml2ZXJWYWx1ZSh2KVxuICAgICk7XG4gICAgaWYgKGlzTmVzdGVkQXJyYXkpIHJldHVybiBhO1xuICAgIHJldHVybiBtYWtlUGdBcnJheShhKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgRXh0cmFDb25maWdDb2x1bW4sXG4gIEluZGV4ZWRDb2x1bW4sXG4gIFBnQXJyYXksXG4gIFBnQXJyYXlCdWlsZGVyLFxuICBQZ0NvbHVtbixcbiAgUGdDb2x1bW5CdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbW9uLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFBnQ29sdW1uLCBQZ0NvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFBnRW51bU9iamVjdENvbHVtbkJ1aWxkZXIgZXh0ZW5kcyBQZ0NvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0VudW1PYmplY3RDb2x1bW5CdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGVudW1JbnN0YW5jZSkge1xuICAgIHN1cGVyKG5hbWUsIFwic3RyaW5nXCIsIFwiUGdFbnVtT2JqZWN0Q29sdW1uXCIpO1xuICAgIHRoaXMuY29uZmlnLmVudW0gPSBlbnVtSW5zdGFuY2U7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgUGdFbnVtT2JqZWN0Q29sdW1uKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFBnRW51bU9iamVjdENvbHVtbiBleHRlbmRzIFBnQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdFbnVtT2JqZWN0Q29sdW1uXCI7XG4gIGVudW07XG4gIGVudW1WYWx1ZXMgPSB0aGlzLmNvbmZpZy5lbnVtLmVudW1WYWx1ZXM7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICBzdXBlcih0YWJsZSwgY29uZmlnKTtcbiAgICB0aGlzLmVudW0gPSBjb25maWcuZW51bTtcbiAgfVxuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmVudW0uZW51bU5hbWU7XG4gIH1cbn1cbmNvbnN0IGlzUGdFbnVtU3ltID0gU3ltYm9sLmZvcihcImRyaXp6bGU6aXNQZ0VudW1cIik7XG5mdW5jdGlvbiBpc1BnRW51bShvYmopIHtcbiAgcmV0dXJuICEhb2JqICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiAmJiBpc1BnRW51bVN5bSBpbiBvYmogJiYgb2JqW2lzUGdFbnVtU3ltXSA9PT0gdHJ1ZTtcbn1cbmNsYXNzIFBnRW51bUNvbHVtbkJ1aWxkZXIgZXh0ZW5kcyBQZ0NvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0VudW1Db2x1bW5CdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGVudW1JbnN0YW5jZSkge1xuICAgIHN1cGVyKG5hbWUsIFwic3RyaW5nXCIsIFwiUGdFbnVtQ29sdW1uXCIpO1xuICAgIHRoaXMuY29uZmlnLmVudW0gPSBlbnVtSW5zdGFuY2U7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgUGdFbnVtQ29sdW1uKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFBnRW51bUNvbHVtbiBleHRlbmRzIFBnQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdFbnVtQ29sdW1uXCI7XG4gIGVudW0gPSB0aGlzLmNvbmZpZy5lbnVtO1xuICBlbnVtVmFsdWVzID0gdGhpcy5jb25maWcuZW51bS5lbnVtVmFsdWVzO1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gICAgdGhpcy5lbnVtID0gY29uZmlnLmVudW07XG4gIH1cbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbnVtLmVudW1OYW1lO1xuICB9XG59XG5mdW5jdGlvbiBwZ0VudW0oZW51bU5hbWUsIGlucHV0KSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSA/IHBnRW51bVdpdGhTY2hlbWEoZW51bU5hbWUsIFsuLi5pbnB1dF0sIHZvaWQgMCkgOiBwZ0VudW1PYmplY3RXaXRoU2NoZW1hKGVudW1OYW1lLCBpbnB1dCwgdm9pZCAwKTtcbn1cbmZ1bmN0aW9uIHBnRW51bVdpdGhTY2hlbWEoZW51bU5hbWUsIHZhbHVlcywgc2NoZW1hKSB7XG4gIGNvbnN0IGVudW1JbnN0YW5jZSA9IE9iamVjdC5hc3NpZ24oXG4gICAgKG5hbWUpID0+IG5ldyBQZ0VudW1Db2x1bW5CdWlsZGVyKG5hbWUgPz8gXCJcIiwgZW51bUluc3RhbmNlKSxcbiAgICB7XG4gICAgICBlbnVtTmFtZSxcbiAgICAgIGVudW1WYWx1ZXM6IHZhbHVlcyxcbiAgICAgIHNjaGVtYSxcbiAgICAgIFtpc1BnRW51bVN5bV06IHRydWVcbiAgICB9XG4gICk7XG4gIHJldHVybiBlbnVtSW5zdGFuY2U7XG59XG5mdW5jdGlvbiBwZ0VudW1PYmplY3RXaXRoU2NoZW1hKGVudW1OYW1lLCB2YWx1ZXMsIHNjaGVtYSkge1xuICBjb25zdCBlbnVtSW5zdGFuY2UgPSBPYmplY3QuYXNzaWduKFxuICAgIChuYW1lKSA9PiBuZXcgUGdFbnVtT2JqZWN0Q29sdW1uQnVpbGRlcihuYW1lID8/IFwiXCIsIGVudW1JbnN0YW5jZSksXG4gICAge1xuICAgICAgZW51bU5hbWUsXG4gICAgICBlbnVtVmFsdWVzOiBPYmplY3QudmFsdWVzKHZhbHVlcyksXG4gICAgICBzY2hlbWEsXG4gICAgICBbaXNQZ0VudW1TeW1dOiB0cnVlXG4gICAgfVxuICApO1xuICByZXR1cm4gZW51bUluc3RhbmNlO1xufVxuZXhwb3J0IHtcbiAgUGdFbnVtQ29sdW1uLFxuICBQZ0VudW1Db2x1bW5CdWlsZGVyLFxuICBQZ0VudW1PYmplY3RDb2x1bW4sXG4gIFBnRW51bU9iamVjdENvbHVtbkJ1aWxkZXIsXG4gIGlzUGdFbnVtLFxuICBwZ0VudW0sXG4gIHBnRW51bU9iamVjdFdpdGhTY2hlbWEsXG4gIHBnRW51bVdpdGhTY2hlbWFcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbnVtLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuY2xhc3MgU3VicXVlcnkge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTdWJxdWVyeVwiO1xuICBjb25zdHJ1Y3RvcihzcWwsIGZpZWxkcywgYWxpYXMsIGlzV2l0aCA9IGZhbHNlLCB1c2VkVGFibGVzID0gW10pIHtcbiAgICB0aGlzLl8gPSB7XG4gICAgICBicmFuZDogXCJTdWJxdWVyeVwiLFxuICAgICAgc3FsLFxuICAgICAgc2VsZWN0ZWRGaWVsZHM6IGZpZWxkcyxcbiAgICAgIGFsaWFzLFxuICAgICAgaXNXaXRoLFxuICAgICAgdXNlZFRhYmxlc1xuICAgIH07XG4gIH1cbiAgLy8gZ2V0U1FMKCk6IFNRTDx1bmtub3duPiB7XG4gIC8vIFx0cmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbiAgLy8gfVxufVxuY2xhc3MgV2l0aFN1YnF1ZXJ5IGV4dGVuZHMgU3VicXVlcnkge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJXaXRoU3VicXVlcnlcIjtcbn1cbmV4cG9ydCB7XG4gIFN1YnF1ZXJ5LFxuICBXaXRoU3VicXVlcnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdWJxdWVyeS5qcy5tYXAiLAogICAgIi8vIHBhY2thZ2UuanNvblxudmFyIHZlcnNpb24gPSBcIjAuNDQuNVwiO1xuXG4vLyBzcmMvdmVyc2lvbi50c1xudmFyIGNvbXBhdGliaWxpdHlWZXJzaW9uID0gMTA7XG5leHBvcnQge1xuICBjb21wYXRpYmlsaXR5VmVyc2lvbixcbiAgdmVyc2lvbiBhcyBucG1WZXJzaW9uXG59O1xuIiwKICAgICJpbXBvcnQgeyBpaWZlIH0gZnJvbSBcIi4vdHJhY2luZy11dGlscy5qc1wiO1xuaW1wb3J0IHsgbnBtVmVyc2lvbiB9IGZyb20gXCIuL3ZlcnNpb24uanNcIjtcbmxldCBvdGVsO1xubGV0IHJhd1RyYWNlcjtcbmNvbnN0IHRyYWNlciA9IHtcbiAgc3RhcnRBY3RpdmVTcGFuKG5hbWUsIGZuKSB7XG4gICAgaWYgKCFvdGVsKSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9XG4gICAgaWYgKCFyYXdUcmFjZXIpIHtcbiAgICAgIHJhd1RyYWNlciA9IG90ZWwudHJhY2UuZ2V0VHJhY2VyKFwiZHJpenpsZS1vcm1cIiwgbnBtVmVyc2lvbik7XG4gICAgfVxuICAgIHJldHVybiBpaWZlKFxuICAgICAgKG90ZWwyLCByYXdUcmFjZXIyKSA9PiByYXdUcmFjZXIyLnN0YXJ0QWN0aXZlU3BhbihcbiAgICAgICAgbmFtZSxcbiAgICAgICAgKHNwYW4pID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGZuKHNwYW4pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgY29kZTogb3RlbDIuU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFwiVW5rbm93biBlcnJvclwiXG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8taW5zdGFuY2VvZi9uby1pbnN0YW5jZW9mXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApLFxuICAgICAgb3RlbCxcbiAgICAgIHJhd1RyYWNlclxuICAgICk7XG4gIH1cbn07XG5leHBvcnQge1xuICB0cmFjZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjaW5nLmpzLm1hcCIsCiAgICAiY29uc3QgVmlld0Jhc2VDb25maWcgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpWaWV3QmFzZUNvbmZpZ1wiKTtcbmV4cG9ydCB7XG4gIFZpZXdCYXNlQ29uZmlnXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmlldy1jb21tb24uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZU5hbWUgfSBmcm9tIFwiLi90YWJsZS51dGlscy5qc1wiO1xuY29uc3QgU2NoZW1hID0gU3ltYm9sLmZvcihcImRyaXp6bGU6U2NoZW1hXCIpO1xuY29uc3QgQ29sdW1ucyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOkNvbHVtbnNcIik7XG5jb25zdCBFeHRyYUNvbmZpZ0NvbHVtbnMgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpFeHRyYUNvbmZpZ0NvbHVtbnNcIik7XG5jb25zdCBPcmlnaW5hbE5hbWUgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpPcmlnaW5hbE5hbWVcIik7XG5jb25zdCBCYXNlTmFtZSA9IFN5bWJvbC5mb3IoXCJkcml6emxlOkJhc2VOYW1lXCIpO1xuY29uc3QgSXNBbGlhcyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOklzQWxpYXNcIik7XG5jb25zdCBFeHRyYUNvbmZpZ0J1aWxkZXIgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpFeHRyYUNvbmZpZ0J1aWxkZXJcIik7XG5jb25zdCBJc0RyaXp6bGVUYWJsZSA9IFN5bWJvbC5mb3IoXCJkcml6emxlOklzRHJpenpsZVRhYmxlXCIpO1xuY2xhc3MgVGFibGUge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJUYWJsZVwiO1xuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBTeW1ib2wgPSB7XG4gICAgTmFtZTogVGFibGVOYW1lLFxuICAgIFNjaGVtYSxcbiAgICBPcmlnaW5hbE5hbWUsXG4gICAgQ29sdW1ucyxcbiAgICBFeHRyYUNvbmZpZ0NvbHVtbnMsXG4gICAgQmFzZU5hbWUsXG4gICAgSXNBbGlhcyxcbiAgICBFeHRyYUNvbmZpZ0J1aWxkZXJcbiAgfTtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBDYW4gYmUgY2hhbmdlZCBpZiB0aGUgdGFibGUgaXMgYWxpYXNlZC5cbiAgICovXG4gIFtUYWJsZU5hbWVdO1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIFVzZWQgdG8gc3RvcmUgdGhlIG9yaWdpbmFsIG5hbWUgb2YgdGhlIHRhYmxlLCBiZWZvcmUgYW55IGFsaWFzaW5nLlxuICAgKi9cbiAgW09yaWdpbmFsTmFtZV07XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW1NjaGVtYV07XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0NvbHVtbnNdO1xuICAvKiogQGludGVybmFsICovXG4gIFtFeHRyYUNvbmZpZ0NvbHVtbnNdO1xuICAvKipcbiAgICogIEBpbnRlcm5hbFxuICAgKiBVc2VkIHRvIHN0b3JlIHRoZSB0YWJsZSBuYW1lIGJlZm9yZSB0aGUgdHJhbnNmb3JtYXRpb24gdmlhIHRoZSBgdGFibGVDcmVhdG9yYCBmdW5jdGlvbnMuXG4gICAqL1xuICBbQmFzZU5hbWVdO1xuICAvKiogQGludGVybmFsICovXG4gIFtJc0FsaWFzXSA9IGZhbHNlO1xuICAvKiogQGludGVybmFsICovXG4gIFtJc0RyaXp6bGVUYWJsZV0gPSB0cnVlO1xuICAvKiogQGludGVybmFsICovXG4gIFtFeHRyYUNvbmZpZ0J1aWxkZXJdID0gdm9pZCAwO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBzY2hlbWEsIGJhc2VOYW1lKSB7XG4gICAgdGhpc1tUYWJsZU5hbWVdID0gdGhpc1tPcmlnaW5hbE5hbWVdID0gbmFtZTtcbiAgICB0aGlzW1NjaGVtYV0gPSBzY2hlbWE7XG4gICAgdGhpc1tCYXNlTmFtZV0gPSBiYXNlTmFtZTtcbiAgfVxufVxuZnVuY3Rpb24gaXNUYWJsZSh0YWJsZSkge1xuICByZXR1cm4gdHlwZW9mIHRhYmxlID09PSBcIm9iamVjdFwiICYmIHRhYmxlICE9PSBudWxsICYmIElzRHJpenpsZVRhYmxlIGluIHRhYmxlO1xufVxuZnVuY3Rpb24gZ2V0VGFibGVOYW1lKHRhYmxlKSB7XG4gIHJldHVybiB0YWJsZVtUYWJsZU5hbWVdO1xufVxuZnVuY3Rpb24gZ2V0VGFibGVVbmlxdWVOYW1lKHRhYmxlKSB7XG4gIHJldHVybiBgJHt0YWJsZVtTY2hlbWFdID8/IFwicHVibGljXCJ9LiR7dGFibGVbVGFibGVOYW1lXX1gO1xufVxuZXhwb3J0IHtcbiAgQmFzZU5hbWUsXG4gIENvbHVtbnMsXG4gIEV4dHJhQ29uZmlnQnVpbGRlcixcbiAgRXh0cmFDb25maWdDb2x1bW5zLFxuICBJc0FsaWFzLFxuICBPcmlnaW5hbE5hbWUsXG4gIFNjaGVtYSxcbiAgVGFibGUsXG4gIGdldFRhYmxlTmFtZSxcbiAgZ2V0VGFibGVVbmlxdWVOYW1lLFxuICBpc1RhYmxlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFibGUuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IGlzUGdFbnVtIH0gZnJvbSBcIi4uL3BnLWNvcmUvY29sdW1ucy9lbnVtLmpzXCI7XG5pbXBvcnQgeyBTdWJxdWVyeSB9IGZyb20gXCIuLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgdHJhY2VyIH0gZnJvbSBcIi4uL3RyYWNpbmcuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4uL3ZpZXctY29tbW9uLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBJc0FsaWFzLCBUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuY2xhc3MgRmFrZVByaW1pdGl2ZVBhcmFtIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiRmFrZVByaW1pdGl2ZVBhcmFtXCI7XG59XG5mdW5jdGlvbiBpc1NRTFdyYXBwZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDAgJiYgdHlwZW9mIHZhbHVlLmdldFNRTCA9PT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24gbWVyZ2VRdWVyaWVzKHF1ZXJpZXMpIHtcbiAgY29uc3QgcmVzdWx0ID0geyBzcWw6IFwiXCIsIHBhcmFtczogW10gfTtcbiAgZm9yIChjb25zdCBxdWVyeSBvZiBxdWVyaWVzKSB7XG4gICAgcmVzdWx0LnNxbCArPSBxdWVyeS5zcWw7XG4gICAgcmVzdWx0LnBhcmFtcy5wdXNoKC4uLnF1ZXJ5LnBhcmFtcyk7XG4gICAgaWYgKHF1ZXJ5LnR5cGluZ3M/Lmxlbmd0aCkge1xuICAgICAgaWYgKCFyZXN1bHQudHlwaW5ncykge1xuICAgICAgICByZXN1bHQudHlwaW5ncyA9IFtdO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnR5cGluZ3MucHVzaCguLi5xdWVyeS50eXBpbmdzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmNsYXNzIFN0cmluZ0NodW5rIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU3RyaW5nQ2h1bmtcIjtcbiAgdmFsdWU7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICB9XG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xuICB9XG59XG5jbGFzcyBTUUwge1xuICBjb25zdHJ1Y3RvcihxdWVyeUNodW5rcykge1xuICAgIHRoaXMucXVlcnlDaHVua3MgPSBxdWVyeUNodW5rcztcbiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIHF1ZXJ5Q2h1bmtzKSB7XG4gICAgICBpZiAoaXMoY2h1bmssIFRhYmxlKSkge1xuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gY2h1bmtbVGFibGUuU3ltYm9sLlNjaGVtYV07XG4gICAgICAgIHRoaXMudXNlZFRhYmxlcy5wdXNoKFxuICAgICAgICAgIHNjaGVtYU5hbWUgPT09IHZvaWQgMCA/IGNodW5rW1RhYmxlLlN5bWJvbC5OYW1lXSA6IHNjaGVtYU5hbWUgKyBcIi5cIiArIGNodW5rW1RhYmxlLlN5bWJvbC5OYW1lXVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBkZWNvZGVyID0gbm9vcERlY29kZXI7XG4gIHNob3VsZElubGluZVBhcmFtcyA9IGZhbHNlO1xuICAvKiogQGludGVybmFsICovXG4gIHVzZWRUYWJsZXMgPSBbXTtcbiAgYXBwZW5kKHF1ZXJ5KSB7XG4gICAgdGhpcy5xdWVyeUNodW5rcy5wdXNoKC4uLnF1ZXJ5LnF1ZXJ5Q2h1bmtzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB0b1F1ZXJ5KGNvbmZpZykge1xuICAgIHJldHVybiB0cmFjZXIuc3RhcnRBY3RpdmVTcGFuKFwiZHJpenpsZS5idWlsZFNRTFwiLCAoc3BhbikgPT4ge1xuICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKHRoaXMucXVlcnlDaHVua3MsIGNvbmZpZyk7XG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgXCJkcml6emxlLnF1ZXJ5LnRleHRcIjogcXVlcnkuc3FsLFxuICAgICAgICBcImRyaXp6bGUucXVlcnkucGFyYW1zXCI6IEpTT04uc3RyaW5naWZ5KHF1ZXJ5LnBhcmFtcylcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgIH0pO1xuICB9XG4gIGJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKGNodW5rcywgX2NvbmZpZykge1xuICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIF9jb25maWcsIHtcbiAgICAgIGlubGluZVBhcmFtczogX2NvbmZpZy5pbmxpbmVQYXJhbXMgfHwgdGhpcy5zaG91bGRJbmxpbmVQYXJhbXMsXG4gICAgICBwYXJhbVN0YXJ0SW5kZXg6IF9jb25maWcucGFyYW1TdGFydEluZGV4IHx8IHsgdmFsdWU6IDAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHtcbiAgICAgIGNhc2luZyxcbiAgICAgIGVzY2FwZU5hbWUsXG4gICAgICBlc2NhcGVQYXJhbSxcbiAgICAgIHByZXBhcmVUeXBpbmcsXG4gICAgICBpbmxpbmVQYXJhbXMsXG4gICAgICBwYXJhbVN0YXJ0SW5kZXhcbiAgICB9ID0gY29uZmlnO1xuICAgIHJldHVybiBtZXJnZVF1ZXJpZXMoY2h1bmtzLm1hcCgoY2h1bmspID0+IHtcbiAgICAgIGlmIChpcyhjaHVuaywgU3RyaW5nQ2h1bmspKSB7XG4gICAgICAgIHJldHVybiB7IHNxbDogY2h1bmsudmFsdWUuam9pbihcIlwiKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBOYW1lKSkge1xuICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZU5hbWUoY2h1bmsudmFsdWUpLCBwYXJhbXM6IFtdIH07XG4gICAgICB9XG4gICAgICBpZiAoY2h1bmsgPT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4geyBzcWw6IFwiXCIsIHBhcmFtczogW10gfTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNodW5rKSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbbmV3IFN0cmluZ0NodW5rKFwiKFwiKV07XG4gICAgICAgIGZvciAoY29uc3QgW2ksIHBdIG9mIGNodW5rLmVudHJpZXMoKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHApO1xuICAgICAgICAgIGlmIChpIDwgY2h1bmsubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IFN0cmluZ0NodW5rKFwiLCBcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaChuZXcgU3RyaW5nQ2h1bmsoXCIpXCIpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMocmVzdWx0LCBjb25maWcpO1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBTUUwpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKGNodW5rLnF1ZXJ5Q2h1bmtzLCB7XG4gICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgIGlubGluZVBhcmFtczogaW5saW5lUGFyYW1zIHx8IGNodW5rLnNob3VsZElubGluZVBhcmFtc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgVGFibGUpKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBjaHVua1tUYWJsZS5TeW1ib2wuU2NoZW1hXTtcbiAgICAgICAgY29uc3QgdGFibGVOYW1lID0gY2h1bmtbVGFibGUuU3ltYm9sLk5hbWVdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNxbDogc2NoZW1hTmFtZSA9PT0gdm9pZCAwIHx8IGNodW5rW0lzQWxpYXNdID8gZXNjYXBlTmFtZSh0YWJsZU5hbWUpIDogZXNjYXBlTmFtZShzY2hlbWFOYW1lKSArIFwiLlwiICsgZXNjYXBlTmFtZSh0YWJsZU5hbWUpLFxuICAgICAgICAgIHBhcmFtczogW11cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgQ29sdW1uKSkge1xuICAgICAgICBjb25zdCBjb2x1bW5OYW1lID0gY2FzaW5nLmdldENvbHVtbkNhc2luZyhjaHVuayk7XG4gICAgICAgIGlmIChfY29uZmlnLmludm9rZVNvdXJjZSA9PT0gXCJpbmRleGVzXCIpIHtcbiAgICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZU5hbWUoY29sdW1uTmFtZSksIHBhcmFtczogW10gfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gY2h1bmsudGFibGVbVGFibGUuU3ltYm9sLlNjaGVtYV07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3FsOiBjaHVuay50YWJsZVtJc0FsaWFzXSB8fCBzY2hlbWFOYW1lID09PSB2b2lkIDAgPyBlc2NhcGVOYW1lKGNodW5rLnRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXSkgKyBcIi5cIiArIGVzY2FwZU5hbWUoY29sdW1uTmFtZSkgOiBlc2NhcGVOYW1lKHNjaGVtYU5hbWUpICsgXCIuXCIgKyBlc2NhcGVOYW1lKGNodW5rLnRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXSkgKyBcIi5cIiArIGVzY2FwZU5hbWUoY29sdW1uTmFtZSksXG4gICAgICAgICAgcGFyYW1zOiBbXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBWaWV3KSkge1xuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gY2h1bmtbVmlld0Jhc2VDb25maWddLnNjaGVtYTtcbiAgICAgICAgY29uc3Qgdmlld05hbWUgPSBjaHVua1tWaWV3QmFzZUNvbmZpZ10ubmFtZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzcWw6IHNjaGVtYU5hbWUgPT09IHZvaWQgMCB8fCBjaHVua1tWaWV3QmFzZUNvbmZpZ10uaXNBbGlhcyA/IGVzY2FwZU5hbWUodmlld05hbWUpIDogZXNjYXBlTmFtZShzY2hlbWFOYW1lKSArIFwiLlwiICsgZXNjYXBlTmFtZSh2aWV3TmFtZSksXG4gICAgICAgICAgcGFyYW1zOiBbXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBQYXJhbSkpIHtcbiAgICAgICAgaWYgKGlzKGNodW5rLnZhbHVlLCBQbGFjZWhvbGRlcikpIHtcbiAgICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZVBhcmFtKHBhcmFtU3RhcnRJbmRleC52YWx1ZSsrLCBjaHVuayksIHBhcmFtczogW2NodW5rXSwgdHlwaW5nczogW1wibm9uZVwiXSB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1hcHBlZFZhbHVlID0gY2h1bmsudmFsdWUgPT09IG51bGwgPyBudWxsIDogY2h1bmsuZW5jb2Rlci5tYXBUb0RyaXZlclZhbHVlKGNodW5rLnZhbHVlKTtcbiAgICAgICAgaWYgKGlzKG1hcHBlZFZhbHVlLCBTUUwpKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMoW21hcHBlZFZhbHVlXSwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5saW5lUGFyYW1zKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3FsOiB0aGlzLm1hcElubGluZVBhcmFtKG1hcHBlZFZhbHVlLCBjb25maWcpLCBwYXJhbXM6IFtdIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHR5cGluZ3MgPSBbXCJub25lXCJdO1xuICAgICAgICBpZiAocHJlcGFyZVR5cGluZykge1xuICAgICAgICAgIHR5cGluZ3MgPSBbcHJlcGFyZVR5cGluZyhjaHVuay5lbmNvZGVyKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVQYXJhbShwYXJhbVN0YXJ0SW5kZXgudmFsdWUrKywgbWFwcGVkVmFsdWUpLCBwYXJhbXM6IFttYXBwZWRWYWx1ZV0sIHR5cGluZ3MgfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgUGxhY2Vob2xkZXIpKSB7XG4gICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlUGFyYW0ocGFyYW1TdGFydEluZGV4LnZhbHVlKyssIGNodW5rKSwgcGFyYW1zOiBbY2h1bmtdLCB0eXBpbmdzOiBbXCJub25lXCJdIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFNRTC5BbGlhc2VkKSAmJiBjaHVuay5maWVsZEFsaWFzICE9PSB2b2lkIDApIHtcbiAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVOYW1lKGNodW5rLmZpZWxkQWxpYXMpLCBwYXJhbXM6IFtdIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFN1YnF1ZXJ5KSkge1xuICAgICAgICBpZiAoY2h1bmsuXy5pc1dpdGgpIHtcbiAgICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZU5hbWUoY2h1bmsuXy5hbGlhcyksIHBhcmFtczogW10gfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhbXG4gICAgICAgICAgbmV3IFN0cmluZ0NodW5rKFwiKFwiKSxcbiAgICAgICAgICBjaHVuay5fLnNxbCxcbiAgICAgICAgICBuZXcgU3RyaW5nQ2h1bmsoXCIpIFwiKSxcbiAgICAgICAgICBuZXcgTmFtZShjaHVuay5fLmFsaWFzKVxuICAgICAgICBdLCBjb25maWcpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUGdFbnVtKGNodW5rKSkge1xuICAgICAgICBpZiAoY2h1bmsuc2NoZW1hKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVOYW1lKGNodW5rLnNjaGVtYSkgKyBcIi5cIiArIGVzY2FwZU5hbWUoY2h1bmsuZW51bU5hbWUpLCBwYXJhbXM6IFtdIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVOYW1lKGNodW5rLmVudW1OYW1lKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzU1FMV3JhcHBlcihjaHVuaykpIHtcbiAgICAgICAgaWYgKGNodW5rLnNob3VsZE9taXRTUUxQYXJlbnM/LigpKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMoW2NodW5rLmdldFNRTCgpXSwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhbXG4gICAgICAgICAgbmV3IFN0cmluZ0NodW5rKFwiKFwiKSxcbiAgICAgICAgICBjaHVuay5nZXRTUUwoKSxcbiAgICAgICAgICBuZXcgU3RyaW5nQ2h1bmsoXCIpXCIpXG4gICAgICAgIF0sIGNvbmZpZyk7XG4gICAgICB9XG4gICAgICBpZiAoaW5saW5lUGFyYW1zKSB7XG4gICAgICAgIHJldHVybiB7IHNxbDogdGhpcy5tYXBJbmxpbmVQYXJhbShjaHVuaywgY29uZmlnKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVQYXJhbShwYXJhbVN0YXJ0SW5kZXgudmFsdWUrKywgY2h1bmspLCBwYXJhbXM6IFtjaHVua10sIHR5cGluZ3M6IFtcIm5vbmVcIl0gfTtcbiAgICB9KSk7XG4gIH1cbiAgbWFwSW5saW5lUGFyYW0oY2h1bmssIHsgZXNjYXBlU3RyaW5nIH0pIHtcbiAgICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgY2h1bmsgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gY2h1bmsudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIGVzY2FwZVN0cmluZyhjaHVuayk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IG1hcHBlZFZhbHVlQXNTdHJpbmcgPSBjaHVuay50b1N0cmluZygpO1xuICAgICAgaWYgKG1hcHBlZFZhbHVlQXNTdHJpbmcgPT09IFwiW29iamVjdCBPYmplY3RdXCIpIHtcbiAgICAgICAgcmV0dXJuIGVzY2FwZVN0cmluZyhKU09OLnN0cmluZ2lmeShjaHVuaykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVzY2FwZVN0cmluZyhtYXBwZWRWYWx1ZUFzU3RyaW5nKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBwYXJhbSB2YWx1ZTogXCIgKyBjaHVuayk7XG4gIH1cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGFzKGFsaWFzKSB7XG4gICAgaWYgKGFsaWFzID09PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNRTC5BbGlhc2VkKHRoaXMsIGFsaWFzKTtcbiAgfVxuICBtYXBXaXRoKGRlY29kZXIpIHtcbiAgICB0aGlzLmRlY29kZXIgPSB0eXBlb2YgZGVjb2RlciA9PT0gXCJmdW5jdGlvblwiID8geyBtYXBGcm9tRHJpdmVyVmFsdWU6IGRlY29kZXIgfSA6IGRlY29kZXI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgaW5saW5lUGFyYW1zKCkge1xuICAgIHRoaXMuc2hvdWxkSW5saW5lUGFyYW1zID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBjb25kaXRpb25hbGx5IGluY2x1ZGUgYSBwYXJ0IG9mIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQHBhcmFtIGNvbmRpdGlvbiAtIENvbmRpdGlvbiB0byBjaGVja1xuICAgKiBAcmV0dXJucyBpdHNlbGYgaWYgdGhlIGNvbmRpdGlvbiBpcyBgdHJ1ZWAsIG90aGVyd2lzZSBgdW5kZWZpbmVkYFxuICAgKi9cbiAgaWYoY29uZGl0aW9uKSB7XG4gICAgcmV0dXJuIGNvbmRpdGlvbiA/IHRoaXMgOiB2b2lkIDA7XG4gIH1cbn1cbmNsYXNzIE5hbWUge1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJOYW1lXCI7XG4gIGJyYW5kO1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbiAgfVxufVxuZnVuY3Rpb24gbmFtZSh2YWx1ZSkge1xuICByZXR1cm4gbmV3IE5hbWUodmFsdWUpO1xufVxuZnVuY3Rpb24gaXNEcml2ZXJWYWx1ZUVuY29kZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBcIm1hcFRvRHJpdmVyVmFsdWVcIiBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUubWFwVG9Ecml2ZXJWYWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xufVxuY29uc3Qgbm9vcERlY29kZXIgPSB7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZTogKHZhbHVlKSA9PiB2YWx1ZVxufTtcbmNvbnN0IG5vb3BFbmNvZGVyID0ge1xuICBtYXBUb0RyaXZlclZhbHVlOiAodmFsdWUpID0+IHZhbHVlXG59O1xuY29uc3Qgbm9vcE1hcHBlciA9IHtcbiAgLi4ubm9vcERlY29kZXIsXG4gIC4uLm5vb3BFbmNvZGVyXG59O1xuY2xhc3MgUGFyYW0ge1xuICAvKipcbiAgICogQHBhcmFtIHZhbHVlIC0gUGFyYW1ldGVyIHZhbHVlXG4gICAqIEBwYXJhbSBlbmNvZGVyIC0gRW5jb2RlciB0byBjb252ZXJ0IHRoZSB2YWx1ZSB0byBhIGRyaXZlciBwYXJhbWV0ZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKHZhbHVlLCBlbmNvZGVyID0gbm9vcEVuY29kZXIpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5lbmNvZGVyID0gZW5jb2RlcjtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQYXJhbVwiO1xuICBicmFuZDtcbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBhcmFtKHZhbHVlLCBlbmNvZGVyKSB7XG4gIHJldHVybiBuZXcgUGFyYW0odmFsdWUsIGVuY29kZXIpO1xufVxuZnVuY3Rpb24gc3FsKHN0cmluZ3MsIC4uLnBhcmFtcykge1xuICBjb25zdCBxdWVyeUNodW5rcyA9IFtdO1xuICBpZiAocGFyYW1zLmxlbmd0aCA+IDAgfHwgc3RyaW5ncy5sZW5ndGggPiAwICYmIHN0cmluZ3NbMF0gIT09IFwiXCIpIHtcbiAgICBxdWVyeUNodW5rcy5wdXNoKG5ldyBTdHJpbmdDaHVuayhzdHJpbmdzWzBdKSk7XG4gIH1cbiAgZm9yIChjb25zdCBbcGFyYW1JbmRleCwgcGFyYW0yXSBvZiBwYXJhbXMuZW50cmllcygpKSB7XG4gICAgcXVlcnlDaHVua3MucHVzaChwYXJhbTIsIG5ldyBTdHJpbmdDaHVuayhzdHJpbmdzW3BhcmFtSW5kZXggKyAxXSkpO1xuICB9XG4gIHJldHVybiBuZXcgU1FMKHF1ZXJ5Q2h1bmtzKTtcbn1cbigoc3FsMikgPT4ge1xuICBmdW5jdGlvbiBlbXB0eSgpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbXSk7XG4gIH1cbiAgc3FsMi5lbXB0eSA9IGVtcHR5O1xuICBmdW5jdGlvbiBmcm9tTGlzdChsaXN0KSB7XG4gICAgcmV0dXJuIG5ldyBTUUwobGlzdCk7XG4gIH1cbiAgc3FsMi5mcm9tTGlzdCA9IGZyb21MaXN0O1xuICBmdW5jdGlvbiByYXcoc3RyKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW25ldyBTdHJpbmdDaHVuayhzdHIpXSk7XG4gIH1cbiAgc3FsMi5yYXcgPSByYXc7XG4gIGZ1bmN0aW9uIGpvaW4oY2h1bmtzLCBzZXBhcmF0b3IpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtpLCBjaHVua10gb2YgY2h1bmtzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGkgPiAwICYmIHNlcGFyYXRvciAhPT0gdm9pZCAwKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHNlcGFyYXRvcik7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaChjaHVuayk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU1FMKHJlc3VsdCk7XG4gIH1cbiAgc3FsMi5qb2luID0gam9pbjtcbiAgZnVuY3Rpb24gaWRlbnRpZmllcih2YWx1ZSkge1xuICAgIHJldHVybiBuZXcgTmFtZSh2YWx1ZSk7XG4gIH1cbiAgc3FsMi5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcbiAgZnVuY3Rpb24gcGxhY2Vob2xkZXIyKG5hbWUyKSB7XG4gICAgcmV0dXJuIG5ldyBQbGFjZWhvbGRlcihuYW1lMik7XG4gIH1cbiAgc3FsMi5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyMjtcbiAgZnVuY3Rpb24gcGFyYW0yKHZhbHVlLCBlbmNvZGVyKSB7XG4gICAgcmV0dXJuIG5ldyBQYXJhbSh2YWx1ZSwgZW5jb2Rlcik7XG4gIH1cbiAgc3FsMi5wYXJhbSA9IHBhcmFtMjtcbn0pKHNxbCB8fCAoc3FsID0ge30pKTtcbigoU1FMMikgPT4ge1xuICBjbGFzcyBBbGlhc2VkIHtcbiAgICBjb25zdHJ1Y3RvcihzcWwyLCBmaWVsZEFsaWFzKSB7XG4gICAgICB0aGlzLnNxbCA9IHNxbDI7XG4gICAgICB0aGlzLmZpZWxkQWxpYXMgPSBmaWVsZEFsaWFzO1xuICAgIH1cbiAgICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUwuQWxpYXNlZFwiO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBpc1NlbGVjdGlvbkZpZWxkID0gZmFsc2U7XG4gICAgZ2V0U1FMKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3FsO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgY2xvbmUoKSB7XG4gICAgICByZXR1cm4gbmV3IEFsaWFzZWQodGhpcy5zcWwsIHRoaXMuZmllbGRBbGlhcyk7XG4gICAgfVxuICB9XG4gIFNRTDIuQWxpYXNlZCA9IEFsaWFzZWQ7XG59KShTUUwgfHwgKFNRTCA9IHt9KSk7XG5jbGFzcyBQbGFjZWhvbGRlciB7XG4gIGNvbnN0cnVjdG9yKG5hbWUyKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTI7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGxhY2Vob2xkZXJcIjtcbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBsYWNlaG9sZGVyKG5hbWUyKSB7XG4gIHJldHVybiBuZXcgUGxhY2Vob2xkZXIobmFtZTIpO1xufVxuZnVuY3Rpb24gZmlsbFBsYWNlaG9sZGVycyhwYXJhbXMsIHZhbHVlcykge1xuICByZXR1cm4gcGFyYW1zLm1hcCgocCkgPT4ge1xuICAgIGlmIChpcyhwLCBQbGFjZWhvbGRlcikpIHtcbiAgICAgIGlmICghKHAubmFtZSBpbiB2YWx1ZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdmFsdWUgZm9yIHBsYWNlaG9sZGVyIFwiJHtwLm5hbWV9XCIgd2FzIHByb3ZpZGVkYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVzW3AubmFtZV07XG4gICAgfVxuICAgIGlmIChpcyhwLCBQYXJhbSkgJiYgaXMocC52YWx1ZSwgUGxhY2Vob2xkZXIpKSB7XG4gICAgICBpZiAoIShwLnZhbHVlLm5hbWUgaW4gdmFsdWVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHZhbHVlIGZvciBwbGFjZWhvbGRlciBcIiR7cC52YWx1ZS5uYW1lfVwiIHdhcyBwcm92aWRlZGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHAuZW5jb2Rlci5tYXBUb0RyaXZlclZhbHVlKHZhbHVlc1twLnZhbHVlLm5hbWVdKTtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH0pO1xufVxuY29uc3QgSXNEcml6emxlVmlldyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOklzRHJpenpsZVZpZXdcIik7XG5jbGFzcyBWaWV3IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiVmlld1wiO1xuICAvKiogQGludGVybmFsICovXG4gIFtWaWV3QmFzZUNvbmZpZ107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0lzRHJpenpsZVZpZXddID0gdHJ1ZTtcbiAgY29uc3RydWN0b3IoeyBuYW1lOiBuYW1lMiwgc2NoZW1hLCBzZWxlY3RlZEZpZWxkcywgcXVlcnkgfSkge1xuICAgIHRoaXNbVmlld0Jhc2VDb25maWddID0ge1xuICAgICAgbmFtZTogbmFtZTIsXG4gICAgICBvcmlnaW5hbE5hbWU6IG5hbWUyLFxuICAgICAgc2NoZW1hLFxuICAgICAgc2VsZWN0ZWRGaWVsZHMsXG4gICAgICBxdWVyeSxcbiAgICAgIGlzRXhpc3Rpbmc6ICFxdWVyeSxcbiAgICAgIGlzQWxpYXM6IGZhbHNlXG4gICAgfTtcbiAgfVxuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbiAgfVxufVxuZnVuY3Rpb24gaXNWaWV3KHZpZXcpIHtcbiAgcmV0dXJuIHR5cGVvZiB2aWV3ID09PSBcIm9iamVjdFwiICYmIHZpZXcgIT09IG51bGwgJiYgSXNEcml6emxlVmlldyBpbiB2aWV3O1xufVxuZnVuY3Rpb24gZ2V0Vmlld05hbWUodmlldykge1xuICByZXR1cm4gdmlld1tWaWV3QmFzZUNvbmZpZ10ubmFtZTtcbn1cbkNvbHVtbi5wcm90b3R5cGUuZ2V0U1FMID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG59O1xuVGFibGUucHJvdG90eXBlLmdldFNRTCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xufTtcblN1YnF1ZXJ5LnByb3RvdHlwZS5nZXRTUUwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbn07XG5leHBvcnQge1xuICBGYWtlUHJpbWl0aXZlUGFyYW0sXG4gIE5hbWUsXG4gIFBhcmFtLFxuICBQbGFjZWhvbGRlcixcbiAgU1FMLFxuICBTdHJpbmdDaHVuayxcbiAgVmlldyxcbiAgZmlsbFBsYWNlaG9sZGVycyxcbiAgZ2V0Vmlld05hbWUsXG4gIGlzRHJpdmVyVmFsdWVFbmNvZGVyLFxuICBpc1NRTFdyYXBwZXIsXG4gIGlzVmlldyxcbiAgbmFtZSxcbiAgbm9vcERlY29kZXIsXG4gIG5vb3BFbmNvZGVyLFxuICBub29wTWFwcGVyLFxuICBwYXJhbSxcbiAgcGxhY2Vob2xkZXIsXG4gIHNxbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNxbC5qcy5tYXAiLAogICAgImltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNRTCwgc3FsIH0gZnJvbSBcIi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi92aWV3LWNvbW1vbi5qc1wiO1xuY2xhc3MgQ29sdW1uQWxpYXNQcm94eUhhbmRsZXIge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJDb2x1bW5BbGlhc1Byb3h5SGFuZGxlclwiO1xuICBnZXQoY29sdW1uT2JqLCBwcm9wKSB7XG4gICAgaWYgKHByb3AgPT09IFwidGFibGVcIikge1xuICAgICAgcmV0dXJuIHRoaXMudGFibGU7XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW5PYmpbcHJvcF07XG4gIH1cbn1cbmNsYXNzIFRhYmxlQWxpYXNQcm94eUhhbmRsZXIge1xuICBjb25zdHJ1Y3RvcihhbGlhcywgcmVwbGFjZU9yaWdpbmFsTmFtZSkge1xuICAgIHRoaXMuYWxpYXMgPSBhbGlhcztcbiAgICB0aGlzLnJlcGxhY2VPcmlnaW5hbE5hbWUgPSByZXBsYWNlT3JpZ2luYWxOYW1lO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlRhYmxlQWxpYXNQcm94eUhhbmRsZXJcIjtcbiAgZ2V0KHRhcmdldCwgcHJvcCkge1xuICAgIGlmIChwcm9wID09PSBUYWJsZS5TeW1ib2wuSXNBbGlhcykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChwcm9wID09PSBUYWJsZS5TeW1ib2wuTmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuYWxpYXM7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlcGxhY2VPcmlnaW5hbE5hbWUgJiYgcHJvcCA9PT0gVGFibGUuU3ltYm9sLk9yaWdpbmFsTmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuYWxpYXM7XG4gICAgfVxuICAgIGlmIChwcm9wID09PSBWaWV3QmFzZUNvbmZpZykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udGFyZ2V0W1ZpZXdCYXNlQ29uZmlnXSxcbiAgICAgICAgbmFtZTogdGhpcy5hbGlhcyxcbiAgICAgICAgaXNBbGlhczogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHByb3AgPT09IFRhYmxlLlN5bWJvbC5Db2x1bW5zKSB7XG4gICAgICBjb25zdCBjb2x1bW5zID0gdGFyZ2V0W1RhYmxlLlN5bWJvbC5Db2x1bW5zXTtcbiAgICAgIGlmICghY29sdW1ucykge1xuICAgICAgICByZXR1cm4gY29sdW1ucztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb3hpZWRDb2x1bW5zID0ge307XG4gICAgICBPYmplY3Qua2V5cyhjb2x1bW5zKS5tYXAoKGtleSkgPT4ge1xuICAgICAgICBwcm94aWVkQ29sdW1uc1trZXldID0gbmV3IFByb3h5KFxuICAgICAgICAgIGNvbHVtbnNba2V5XSxcbiAgICAgICAgICBuZXcgQ29sdW1uQWxpYXNQcm94eUhhbmRsZXIobmV3IFByb3h5KHRhcmdldCwgdGhpcykpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwcm94aWVkQ29sdW1ucztcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSB0YXJnZXRbcHJvcF07XG4gICAgaWYgKGlzKHZhbHVlLCBDb2x1bW4pKSB7XG4gICAgICByZXR1cm4gbmV3IFByb3h5KHZhbHVlLCBuZXcgQ29sdW1uQWxpYXNQcm94eUhhbmRsZXIobmV3IFByb3h5KHRhcmdldCwgdGhpcykpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5jbGFzcyBSZWxhdGlvblRhYmxlQWxpYXNQcm94eUhhbmRsZXIge1xuICBjb25zdHJ1Y3RvcihhbGlhcykge1xuICAgIHRoaXMuYWxpYXMgPSBhbGlhcztcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJSZWxhdGlvblRhYmxlQWxpYXNQcm94eUhhbmRsZXJcIjtcbiAgZ2V0KHRhcmdldCwgcHJvcCkge1xuICAgIGlmIChwcm9wID09PSBcInNvdXJjZVRhYmxlXCIpIHtcbiAgICAgIHJldHVybiBhbGlhc2VkVGFibGUodGFyZ2V0LnNvdXJjZVRhYmxlLCB0aGlzLmFsaWFzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgfVxufVxuZnVuY3Rpb24gYWxpYXNlZFRhYmxlKHRhYmxlLCB0YWJsZUFsaWFzKSB7XG4gIHJldHVybiBuZXcgUHJveHkodGFibGUsIG5ldyBUYWJsZUFsaWFzUHJveHlIYW5kbGVyKHRhYmxlQWxpYXMsIGZhbHNlKSk7XG59XG5mdW5jdGlvbiBhbGlhc2VkUmVsYXRpb24ocmVsYXRpb24sIHRhYmxlQWxpYXMpIHtcbiAgcmV0dXJuIG5ldyBQcm94eShyZWxhdGlvbiwgbmV3IFJlbGF0aW9uVGFibGVBbGlhc1Byb3h5SGFuZGxlcih0YWJsZUFsaWFzKSk7XG59XG5mdW5jdGlvbiBhbGlhc2VkVGFibGVDb2x1bW4oY29sdW1uLCB0YWJsZUFsaWFzKSB7XG4gIHJldHVybiBuZXcgUHJveHkoXG4gICAgY29sdW1uLFxuICAgIG5ldyBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlcihuZXcgUHJveHkoY29sdW1uLnRhYmxlLCBuZXcgVGFibGVBbGlhc1Byb3h5SGFuZGxlcih0YWJsZUFsaWFzLCBmYWxzZSkpKVxuICApO1xufVxuZnVuY3Rpb24gbWFwQ29sdW1uc0luQWxpYXNlZFNRTFRvQWxpYXMocXVlcnksIGFsaWFzKSB7XG4gIHJldHVybiBuZXcgU1FMLkFsaWFzZWQobWFwQ29sdW1uc0luU1FMVG9BbGlhcyhxdWVyeS5zcWwsIGFsaWFzKSwgcXVlcnkuZmllbGRBbGlhcyk7XG59XG5mdW5jdGlvbiBtYXBDb2x1bW5zSW5TUUxUb0FsaWFzKHF1ZXJ5LCBhbGlhcykge1xuICByZXR1cm4gc3FsLmpvaW4ocXVlcnkucXVlcnlDaHVua3MubWFwKChjKSA9PiB7XG4gICAgaWYgKGlzKGMsIENvbHVtbikpIHtcbiAgICAgIHJldHVybiBhbGlhc2VkVGFibGVDb2x1bW4oYywgYWxpYXMpO1xuICAgIH1cbiAgICBpZiAoaXMoYywgU1FMKSkge1xuICAgICAgcmV0dXJuIG1hcENvbHVtbnNJblNRTFRvQWxpYXMoYywgYWxpYXMpO1xuICAgIH1cbiAgICBpZiAoaXMoYywgU1FMLkFsaWFzZWQpKSB7XG4gICAgICByZXR1cm4gbWFwQ29sdW1uc0luQWxpYXNlZFNRTFRvQWxpYXMoYywgYWxpYXMpO1xuICAgIH1cbiAgICByZXR1cm4gYztcbiAgfSkpO1xufVxuZXhwb3J0IHtcbiAgQ29sdW1uQWxpYXNQcm94eUhhbmRsZXIsXG4gIFJlbGF0aW9uVGFibGVBbGlhc1Byb3h5SGFuZGxlcixcbiAgVGFibGVBbGlhc1Byb3h5SGFuZGxlcixcbiAgYWxpYXNlZFJlbGF0aW9uLFxuICBhbGlhc2VkVGFibGUsXG4gIGFsaWFzZWRUYWJsZUNvbHVtbixcbiAgbWFwQ29sdW1uc0luQWxpYXNlZFNRTFRvQWxpYXMsXG4gIG1hcENvbHVtbnNJblNRTFRvQWxpYXNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbGlhcy5qcy5tYXAiLAogICAgImltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgaXMgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFBhcmFtLCBTUUwsIFZpZXcgfSBmcm9tIFwiLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTdWJxdWVyeSB9IGZyb20gXCIuL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBnZXRUYWJsZU5hbWUsIFRhYmxlIH0gZnJvbSBcIi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4vdmlldy1jb21tb24uanNcIjtcbmZ1bmN0aW9uIG1hcFJlc3VsdFJvdyhjb2x1bW5zLCByb3csIGpvaW5zTm90TnVsbGFibGVNYXApIHtcbiAgY29uc3QgbnVsbGlmeU1hcCA9IHt9O1xuICBjb25zdCByZXN1bHQgPSBjb2x1bW5zLnJlZHVjZShcbiAgICAocmVzdWx0MiwgeyBwYXRoLCBmaWVsZCB9LCBjb2x1bW5JbmRleCkgPT4ge1xuICAgICAgbGV0IGRlY29kZXI7XG4gICAgICBpZiAoaXMoZmllbGQsIENvbHVtbikpIHtcbiAgICAgICAgZGVjb2RlciA9IGZpZWxkO1xuICAgICAgfSBlbHNlIGlmIChpcyhmaWVsZCwgU1FMKSkge1xuICAgICAgICBkZWNvZGVyID0gZmllbGQuZGVjb2RlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlY29kZXIgPSBmaWVsZC5zcWwuZGVjb2RlcjtcbiAgICAgIH1cbiAgICAgIGxldCBub2RlID0gcmVzdWx0MjtcbiAgICAgIGZvciAoY29uc3QgW3BhdGhDaHVua0luZGV4LCBwYXRoQ2h1bmtdIG9mIHBhdGguZW50cmllcygpKSB7XG4gICAgICAgIGlmIChwYXRoQ2h1bmtJbmRleCA8IHBhdGgubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGlmICghKHBhdGhDaHVuayBpbiBub2RlKSkge1xuICAgICAgICAgICAgbm9kZVtwYXRoQ2h1bmtdID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUgPSBub2RlW3BhdGhDaHVua107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSByb3dbY29sdW1uSW5kZXhdO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gbm9kZVtwYXRoQ2h1bmtdID0gcmF3VmFsdWUgPT09IG51bGwgPyBudWxsIDogZGVjb2Rlci5tYXBGcm9tRHJpdmVyVmFsdWUocmF3VmFsdWUpO1xuICAgICAgICAgIGlmIChqb2luc05vdE51bGxhYmxlTWFwICYmIGlzKGZpZWxkLCBDb2x1bW4pICYmIHBhdGgubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBjb25zdCBvYmplY3ROYW1lID0gcGF0aFswXTtcbiAgICAgICAgICAgIGlmICghKG9iamVjdE5hbWUgaW4gbnVsbGlmeU1hcCkpIHtcbiAgICAgICAgICAgICAgbnVsbGlmeU1hcFtvYmplY3ROYW1lXSA9IHZhbHVlID09PSBudWxsID8gZ2V0VGFibGVOYW1lKGZpZWxkLnRhYmxlKSA6IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbnVsbGlmeU1hcFtvYmplY3ROYW1lXSA9PT0gXCJzdHJpbmdcIiAmJiBudWxsaWZ5TWFwW29iamVjdE5hbWVdICE9PSBnZXRUYWJsZU5hbWUoZmllbGQudGFibGUpKSB7XG4gICAgICAgICAgICAgIG51bGxpZnlNYXBbb2JqZWN0TmFtZV0gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQyO1xuICAgIH0sXG4gICAge31cbiAgKTtcbiAgaWYgKGpvaW5zTm90TnVsbGFibGVNYXAgJiYgT2JqZWN0LmtleXMobnVsbGlmeU1hcCkubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgW29iamVjdE5hbWUsIHRhYmxlTmFtZV0gb2YgT2JqZWN0LmVudHJpZXMobnVsbGlmeU1hcCkpIHtcbiAgICAgIGlmICh0eXBlb2YgdGFibGVOYW1lID09PSBcInN0cmluZ1wiICYmICFqb2luc05vdE51bGxhYmxlTWFwW3RhYmxlTmFtZV0pIHtcbiAgICAgICAgcmVzdWx0W29iamVjdE5hbWVdID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG9yZGVyU2VsZWN0ZWRGaWVsZHMoZmllbGRzLCBwYXRoUHJlZml4KSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhmaWVsZHMpLnJlZHVjZSgocmVzdWx0LCBbbmFtZSwgZmllbGRdKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjb25zdCBuZXdQYXRoID0gcGF0aFByZWZpeCA/IFsuLi5wYXRoUHJlZml4LCBuYW1lXSA6IFtuYW1lXTtcbiAgICBpZiAoaXMoZmllbGQsIENvbHVtbikgfHwgaXMoZmllbGQsIFNRTCkgfHwgaXMoZmllbGQsIFNRTC5BbGlhc2VkKSkge1xuICAgICAgcmVzdWx0LnB1c2goeyBwYXRoOiBuZXdQYXRoLCBmaWVsZCB9KTtcbiAgICB9IGVsc2UgaWYgKGlzKGZpZWxkLCBUYWJsZSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLm9yZGVyU2VsZWN0ZWRGaWVsZHMoZmllbGRbVGFibGUuU3ltYm9sLkNvbHVtbnNdLCBuZXdQYXRoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLm9yZGVyU2VsZWN0ZWRGaWVsZHMoZmllbGQsIG5ld1BhdGgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgW10pO1xufVxuZnVuY3Rpb24gaGF2ZVNhbWVLZXlzKGxlZnQsIHJpZ2h0KSB7XG4gIGNvbnN0IGxlZnRLZXlzID0gT2JqZWN0LmtleXMobGVmdCk7XG4gIGNvbnN0IHJpZ2h0S2V5cyA9IE9iamVjdC5rZXlzKHJpZ2h0KTtcbiAgaWYgKGxlZnRLZXlzLmxlbmd0aCAhPT0gcmlnaHRLZXlzLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtpbmRleCwga2V5XSBvZiBsZWZ0S2V5cy5lbnRyaWVzKCkpIHtcbiAgICBpZiAoa2V5ICE9PSByaWdodEtleXNbaW5kZXhdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gbWFwVXBkYXRlU2V0KHRhYmxlLCB2YWx1ZXMpIHtcbiAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHZhbHVlcykuZmlsdGVyKChbLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB2b2lkIDApLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgaWYgKGlzKHZhbHVlLCBTUUwpIHx8IGlzKHZhbHVlLCBDb2x1bW4pKSB7XG4gICAgICByZXR1cm4gW2tleSwgdmFsdWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW2tleSwgbmV3IFBhcmFtKHZhbHVlLCB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc11ba2V5XSldO1xuICAgIH1cbiAgfSk7XG4gIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHZhbHVlcyB0byBzZXRcIik7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKTtcbn1cbmZ1bmN0aW9uIGFwcGx5TWl4aW5zKGJhc2VDbGFzcywgZXh0ZW5kZWRDbGFzc2VzKSB7XG4gIGZvciAoY29uc3QgZXh0ZW5kZWRDbGFzcyBvZiBleHRlbmRlZENsYXNzZXMpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZXh0ZW5kZWRDbGFzcy5wcm90b3R5cGUpKSB7XG4gICAgICBpZiAobmFtZSA9PT0gXCJjb25zdHJ1Y3RvclwiKSBjb250aW51ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgYmFzZUNsYXNzLnByb3RvdHlwZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihleHRlbmRlZENsYXNzLnByb3RvdHlwZSwgbmFtZSkgfHwgLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbClcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBnZXRUYWJsZUNvbHVtbnModGFibGUpIHtcbiAgcmV0dXJuIHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXTtcbn1cbmZ1bmN0aW9uIGdldFZpZXdTZWxlY3RlZEZpZWxkcyh2aWV3KSB7XG4gIHJldHVybiB2aWV3W1ZpZXdCYXNlQ29uZmlnXS5zZWxlY3RlZEZpZWxkcztcbn1cbmZ1bmN0aW9uIGdldFRhYmxlTGlrZU5hbWUodGFibGUpIHtcbiAgcmV0dXJuIGlzKHRhYmxlLCBTdWJxdWVyeSkgPyB0YWJsZS5fLmFsaWFzIDogaXModGFibGUsIFZpZXcpID8gdGFibGVbVmlld0Jhc2VDb25maWddLm5hbWUgOiBpcyh0YWJsZSwgU1FMKSA/IHZvaWQgMCA6IHRhYmxlW1RhYmxlLlN5bWJvbC5Jc0FsaWFzXSA/IHRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXSA6IHRhYmxlW1RhYmxlLlN5bWJvbC5CYXNlTmFtZV07XG59XG5mdW5jdGlvbiBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnKGEsIGIpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiB0eXBlb2YgYSA9PT0gXCJzdHJpbmdcIiAmJiBhLmxlbmd0aCA+IDAgPyBhIDogXCJcIixcbiAgICBjb25maWc6IHR5cGVvZiBhID09PSBcIm9iamVjdFwiID8gYSA6IGJcbiAgfTtcbn1cbmNvbnN0IF8gPSB7fTtcbmNvbnN0IF9fID0ge307XG5mdW5jdGlvbiBpc0NvbmZpZyhkYXRhKSB7XG4gIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGlmIChkYXRhLmNvbnN0cnVjdG9yLm5hbWUgIT09IFwiT2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgaWYgKFwibG9nZ2VyXCIgaW4gZGF0YSkge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgZGF0YVtcImxvZ2dlclwiXTtcbiAgICBpZiAodHlwZSAhPT0gXCJib29sZWFuXCIgJiYgKHR5cGUgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGRhdGFbXCJsb2dnZXJcIl1bXCJsb2dRdWVyeVwiXSAhPT0gXCJmdW5jdGlvblwiKSAmJiB0eXBlICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKFwic2NoZW1hXCIgaW4gZGF0YSkge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgZGF0YVtcInNjaGVtYVwiXTtcbiAgICBpZiAodHlwZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKFwiY2FzaW5nXCIgaW4gZGF0YSkge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgZGF0YVtcImNhc2luZ1wiXTtcbiAgICBpZiAodHlwZSAhPT0gXCJzdHJpbmdcIiAmJiB0eXBlICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKFwibW9kZVwiIGluIGRhdGEpIHtcbiAgICBpZiAoZGF0YVtcIm1vZGVcIl0gIT09IFwiZGVmYXVsdFwiIHx8IGRhdGFbXCJtb2RlXCJdICE9PSBcInBsYW5ldHNjYWxlXCIgfHwgZGF0YVtcIm1vZGVcIl0gIT09IHZvaWQgMCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChcImNvbm5lY3Rpb25cIiBpbiBkYXRhKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBkYXRhW1wiY29ubmVjdGlvblwiXTtcbiAgICBpZiAodHlwZSAhPT0gXCJzdHJpbmdcIiAmJiB0eXBlICE9PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoXCJjbGllbnRcIiBpbiBkYXRhKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBkYXRhW1wiY2xpZW50XCJdO1xuICAgIGlmICh0eXBlICE9PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cbmNvbnN0IHRleHREZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyID09PSBcInVuZGVmaW5lZFwiID8gbnVsbCA6IG5ldyBUZXh0RGVjb2RlcigpO1xuZXhwb3J0IHtcbiAgYXBwbHlNaXhpbnMsXG4gIGdldENvbHVtbk5hbWVBbmRDb25maWcsXG4gIGdldFRhYmxlQ29sdW1ucyxcbiAgZ2V0VGFibGVMaWtlTmFtZSxcbiAgZ2V0Vmlld1NlbGVjdGVkRmllbGRzLFxuICBoYXZlU2FtZUtleXMsXG4gIGlzQ29uZmlnLFxuICBtYXBSZXN1bHRSb3csXG4gIG1hcFVwZGF0ZVNldCxcbiAgb3JkZXJTZWxlY3RlZEZpZWxkcyxcbiAgdGV4dERlY29kZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZU5hbWUgfSBmcm9tIFwiLi4vdGFibGUudXRpbHMuanNcIjtcbmNsYXNzIEZvcmVpZ25LZXlCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlRm9yZWlnbktleUJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICByZWZlcmVuY2U7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX29uVXBkYXRlO1xuICAvKiogQGludGVybmFsICovXG4gIF9vbkRlbGV0ZTtcbiAgY29uc3RydWN0b3IoY29uZmlnLCBhY3Rpb25zKSB7XG4gICAgdGhpcy5yZWZlcmVuY2UgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IG5hbWUsIGNvbHVtbnMsIGZvcmVpZ25Db2x1bW5zIH0gPSBjb25maWcoKTtcbiAgICAgIHJldHVybiB7IG5hbWUsIGNvbHVtbnMsIGZvcmVpZ25UYWJsZTogZm9yZWlnbkNvbHVtbnNbMF0udGFibGUsIGZvcmVpZ25Db2x1bW5zIH07XG4gICAgfTtcbiAgICBpZiAoYWN0aW9ucykge1xuICAgICAgdGhpcy5fb25VcGRhdGUgPSBhY3Rpb25zLm9uVXBkYXRlO1xuICAgICAgdGhpcy5fb25EZWxldGUgPSBhY3Rpb25zLm9uRGVsZXRlO1xuICAgIH1cbiAgfVxuICBvblVwZGF0ZShhY3Rpb24pIHtcbiAgICB0aGlzLl9vblVwZGF0ZSA9IGFjdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvbkRlbGV0ZShhY3Rpb24pIHtcbiAgICB0aGlzLl9vbkRlbGV0ZSA9IGFjdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBGb3JlaWduS2V5KHRhYmxlLCB0aGlzKTtcbiAgfVxufVxuY2xhc3MgRm9yZWlnbktleSB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBidWlsZGVyKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMucmVmZXJlbmNlID0gYnVpbGRlci5yZWZlcmVuY2U7XG4gICAgdGhpcy5vblVwZGF0ZSA9IGJ1aWxkZXIuX29uVXBkYXRlO1xuICAgIHRoaXMub25EZWxldGUgPSBidWlsZGVyLl9vbkRlbGV0ZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVGb3JlaWduS2V5XCI7XG4gIHJlZmVyZW5jZTtcbiAgb25VcGRhdGU7XG4gIG9uRGVsZXRlO1xuICBnZXROYW1lKCkge1xuICAgIGNvbnN0IHsgbmFtZSwgY29sdW1ucywgZm9yZWlnbkNvbHVtbnMgfSA9IHRoaXMucmVmZXJlbmNlKCk7XG4gICAgY29uc3QgY29sdW1uTmFtZXMgPSBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSk7XG4gICAgY29uc3QgZm9yZWlnbkNvbHVtbk5hbWVzID0gZm9yZWlnbkNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKTtcbiAgICBjb25zdCBjaHVua3MgPSBbXG4gICAgICB0aGlzLnRhYmxlW1RhYmxlTmFtZV0sXG4gICAgICAuLi5jb2x1bW5OYW1lcyxcbiAgICAgIGZvcmVpZ25Db2x1bW5zWzBdLnRhYmxlW1RhYmxlTmFtZV0sXG4gICAgICAuLi5mb3JlaWduQ29sdW1uTmFtZXNcbiAgICBdO1xuICAgIHJldHVybiBuYW1lID8/IGAke2NodW5rcy5qb2luKFwiX1wiKX1fZmtgO1xuICB9XG59XG5mdW5jdGlvbiBmb3JlaWduS2V5KGNvbmZpZykge1xuICBmdW5jdGlvbiBtYXBwZWRDb25maWcoKSB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3QgeyBuYW1lLCBjb2x1bW5zLCBmb3JlaWduQ29sdW1ucyB9ID0gY29uZmlnKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBjb2x1bW5zLFxuICAgICAgICBmb3JlaWduQ29sdW1uc1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICByZXR1cm4gbmV3IEZvcmVpZ25LZXlCdWlsZGVyKG1hcHBlZENvbmZpZyk7XG59XG5leHBvcnQge1xuICBGb3JlaWduS2V5LFxuICBGb3JlaWduS2V5QnVpbGRlcixcbiAgZm9yZWlnbktleVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvcmVpZ24ta2V5cy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZU5hbWUgfSBmcm9tIFwiLi4vdGFibGUudXRpbHMuanNcIjtcbmZ1bmN0aW9uIHVuaXF1ZUtleU5hbWUodGFibGUsIGNvbHVtbnMpIHtcbiAgcmV0dXJuIGAke3RhYmxlW1RhYmxlTmFtZV19XyR7Y29sdW1ucy5qb2luKFwiX1wiKX1fdW5pcXVlYDtcbn1cbmZ1bmN0aW9uIHVuaXF1ZShuYW1lKSB7XG4gIHJldHVybiBuZXcgVW5pcXVlT25Db25zdHJhaW50QnVpbGRlcihuYW1lKTtcbn1cbmNsYXNzIFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoY29sdW1ucywgbmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVVbmlxdWVDb25zdHJhaW50QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbHVtbnM7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnQodGFibGUsIHRoaXMuY29sdW1ucywgdGhpcy5uYW1lKTtcbiAgfVxufVxuY2xhc3MgVW5pcXVlT25Db25zdHJhaW50QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBuYW1lO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuICBvbiguLi5jb2x1bW5zKSB7XG4gICAgcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50QnVpbGRlcihjb2x1bW5zLCB0aGlzLm5hbWUpO1xuICB9XG59XG5jbGFzcyBVbmlxdWVDb25zdHJhaW50IHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbHVtbnMsIG5hbWUpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgICB0aGlzLm5hbWUgPSBuYW1lID8/IHVuaXF1ZUtleU5hbWUodGhpcy50YWJsZSwgdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSkpO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVVuaXF1ZUNvbnN0cmFpbnRcIjtcbiAgY29sdW1ucztcbiAgbmFtZTtcbiAgZ2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG59XG5leHBvcnQge1xuICBVbmlxdWVDb25zdHJhaW50LFxuICBVbmlxdWVDb25zdHJhaW50QnVpbGRlcixcbiAgVW5pcXVlT25Db25zdHJhaW50QnVpbGRlcixcbiAgdW5pcXVlLFxuICB1bmlxdWVLZXlOYW1lXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5pcXVlLWNvbnN0cmFpbnQuanMubWFwIiwKICAgICJpbXBvcnQgeyBDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4uLy4uL2NvbHVtbi1idWlsZGVyLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi4vLi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgRm9yZWlnbktleUJ1aWxkZXIgfSBmcm9tIFwiLi4vZm9yZWlnbi1rZXlzLmpzXCI7XG5pbXBvcnQgeyB1bmlxdWVLZXlOYW1lIH0gZnJvbSBcIi4uL3VuaXF1ZS1jb25zdHJhaW50LmpzXCI7XG5jbGFzcyBTUUxpdGVDb2x1bW5CdWlsZGVyIGV4dGVuZHMgQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUNvbHVtbkJ1aWxkZXJcIjtcbiAgZm9yZWlnbktleUNvbmZpZ3MgPSBbXTtcbiAgcmVmZXJlbmNlcyhyZWYsIGFjdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuZm9yZWlnbktleUNvbmZpZ3MucHVzaCh7IHJlZiwgYWN0aW9ucyB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB1bmlxdWUobmFtZSkge1xuICAgIHRoaXMuY29uZmlnLmlzVW5pcXVlID0gdHJ1ZTtcbiAgICB0aGlzLmNvbmZpZy51bmlxdWVOYW1lID0gbmFtZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZW5lcmF0ZWRBbHdheXNBcyhhcywgY29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkID0ge1xuICAgICAgYXMsXG4gICAgICB0eXBlOiBcImFsd2F5c1wiLFxuICAgICAgbW9kZTogY29uZmlnPy5tb2RlID8/IFwidmlydHVhbFwiXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkRm9yZWlnbktleXMoY29sdW1uLCB0YWJsZSkge1xuICAgIHJldHVybiB0aGlzLmZvcmVpZ25LZXlDb25maWdzLm1hcCgoeyByZWYsIGFjdGlvbnMgfSkgPT4ge1xuICAgICAgcmV0dXJuICgocmVmMiwgYWN0aW9uczIpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBGb3JlaWduS2V5QnVpbGRlcigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZm9yZWlnbkNvbHVtbiA9IHJlZjIoKTtcbiAgICAgICAgICByZXR1cm4geyBjb2x1bW5zOiBbY29sdW1uXSwgZm9yZWlnbkNvbHVtbnM6IFtmb3JlaWduQ29sdW1uXSB9O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGFjdGlvbnMyLm9uVXBkYXRlKSB7XG4gICAgICAgICAgYnVpbGRlci5vblVwZGF0ZShhY3Rpb25zMi5vblVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvbnMyLm9uRGVsZXRlKSB7XG4gICAgICAgICAgYnVpbGRlci5vbkRlbGV0ZShhY3Rpb25zMi5vbkRlbGV0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQodGFibGUpO1xuICAgICAgfSkocmVmLCBhY3Rpb25zKTtcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQ29sdW1uIGV4dGVuZHMgQ29sdW1uIHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIGlmICghY29uZmlnLnVuaXF1ZU5hbWUpIHtcbiAgICAgIGNvbmZpZy51bmlxdWVOYW1lID0gdW5pcXVlS2V5TmFtZSh0YWJsZSwgW2NvbmZpZy5uYW1lXSk7XG4gICAgfVxuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVDb2x1bW5cIjtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZUNvbHVtbixcbiAgU1FMaXRlQ29sdW1uQnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbW1vbi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnLCB0ZXh0RGVjb2RlciB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uLCBTUUxpdGVDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBTUUxpdGVCaWdJbnRCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJpZ0ludEJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwiYmlnaW50XCIsIFwiU1FMaXRlQmlnSW50XCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJpZ0ludCh0YWJsZSwgdGhpcy5jb25maWcpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVCaWdJbnQgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCaWdJbnRcIjtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJibG9iXCI7XG4gIH1cbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgQnVmZmVyLmZyb20pIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBCdWZmZXIuZnJvbSh2YWx1ZSkgOiB2YWx1ZS5idWZmZXIgPyBCdWZmZXIuZnJvbSh2YWx1ZS5idWZmZXIsIHZhbHVlLmJ5dGVPZmZzZXQsIHZhbHVlLmJ5dGVMZW5ndGgpIDogQnVmZmVyLmZyb20odmFsdWUpO1xuICAgICAgcmV0dXJuIEJpZ0ludChidWYudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIEJpZ0ludCh0ZXh0RGVjb2Rlci5kZWNvZGUodmFsdWUpKTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlLnRvU3RyaW5nKCkpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVCbG9iSnNvbkJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmxvYkpzb25CdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcImpzb25cIiwgXCJTUUxpdGVCbG9iSnNvblwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCbG9iSnNvbihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVCbG9iSnNvbiBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJsb2JKc29uXCI7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwiYmxvYlwiO1xuICB9XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiICYmIEJ1ZmZlci5mcm9tKSB7XG4gICAgICBjb25zdCBidWYgPSBCdWZmZXIuaXNCdWZmZXIodmFsdWUpID8gdmFsdWUgOiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyID8gQnVmZmVyLmZyb20odmFsdWUpIDogdmFsdWUuYnVmZmVyID8gQnVmZmVyLmZyb20odmFsdWUuYnVmZmVyLCB2YWx1ZS5ieXRlT2Zmc2V0LCB2YWx1ZS5ieXRlTGVuZ3RoKSA6IEJ1ZmZlci5mcm9tKHZhbHVlKTtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGJ1Zi50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0RGVjb2Rlci5kZWNvZGUodmFsdWUpKTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJsb2JCdWZmZXJCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJsb2JCdWZmZXJCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcImJ1ZmZlclwiLCBcIlNRTGl0ZUJsb2JCdWZmZXJcIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQmxvYkJ1ZmZlcih0YWJsZSwgdGhpcy5jb25maWcpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVCbG9iQnVmZmVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmxvYkJ1ZmZlclwiO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUpO1xuICB9XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwiYmxvYlwiO1xuICB9XG59XG5mdW5jdGlvbiBibG9iKGEsIGIpIHtcbiAgY29uc3QgeyBuYW1lLCBjb25maWcgfSA9IGdldENvbHVtbk5hbWVBbmRDb25maWcoYSwgYik7XG4gIGlmIChjb25maWc/Lm1vZGUgPT09IFwianNvblwiKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCbG9iSnNvbkJ1aWxkZXIobmFtZSk7XG4gIH1cbiAgaWYgKGNvbmZpZz8ubW9kZSA9PT0gXCJiaWdpbnRcIikge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQmlnSW50QnVpbGRlcihuYW1lKTtcbiAgfVxuICByZXR1cm4gbmV3IFNRTGl0ZUJsb2JCdWZmZXJCdWlsZGVyKG5hbWUpO1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlQmlnSW50LFxuICBTUUxpdGVCaWdJbnRCdWlsZGVyLFxuICBTUUxpdGVCbG9iQnVmZmVyLFxuICBTUUxpdGVCbG9iQnVmZmVyQnVpbGRlcixcbiAgU1FMaXRlQmxvYkpzb24sXG4gIFNRTGl0ZUJsb2JKc29uQnVpbGRlcixcbiAgYmxvYlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJsb2IuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uLCBTUUxpdGVDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBTUUxpdGVDdXN0b21Db2x1bW5CdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUN1c3RvbUNvbHVtbkJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgZmllbGRDb25maWcsIGN1c3RvbVR5cGVQYXJhbXMpIHtcbiAgICBzdXBlcihuYW1lLCBcImN1c3RvbVwiLCBcIlNRTGl0ZUN1c3RvbUNvbHVtblwiKTtcbiAgICB0aGlzLmNvbmZpZy5maWVsZENvbmZpZyA9IGZpZWxkQ29uZmlnO1xuICAgIHRoaXMuY29uZmlnLmN1c3RvbVR5cGVQYXJhbXMgPSBjdXN0b21UeXBlUGFyYW1zO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUN1c3RvbUNvbHVtbihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVDdXN0b21Db2x1bW4gZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVDdXN0b21Db2x1bW5cIjtcbiAgc3FsTmFtZTtcbiAgbWFwVG87XG4gIG1hcEZyb207XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICBzdXBlcih0YWJsZSwgY29uZmlnKTtcbiAgICB0aGlzLnNxbE5hbWUgPSBjb25maWcuY3VzdG9tVHlwZVBhcmFtcy5kYXRhVHlwZShjb25maWcuZmllbGRDb25maWcpO1xuICAgIHRoaXMubWFwVG8gPSBjb25maWcuY3VzdG9tVHlwZVBhcmFtcy50b0RyaXZlcjtcbiAgICB0aGlzLm1hcEZyb20gPSBjb25maWcuY3VzdG9tVHlwZVBhcmFtcy5mcm9tRHJpdmVyO1xuICB9XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3FsTmFtZTtcbiAgfVxuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMubWFwRnJvbSA9PT0gXCJmdW5jdGlvblwiID8gdGhpcy5tYXBGcm9tKHZhbHVlKSA6IHZhbHVlO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMubWFwVG8gPT09IFwiZnVuY3Rpb25cIiA/IHRoaXMubWFwVG8odmFsdWUpIDogdmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGN1c3RvbVR5cGUoY3VzdG9tVHlwZVBhcmFtcykge1xuICByZXR1cm4gKGEsIGIpID0+IHtcbiAgICBjb25zdCB7IG5hbWUsIGNvbmZpZyB9ID0gZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyhhLCBiKTtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUN1c3RvbUNvbHVtbkJ1aWxkZXIoXG4gICAgICBuYW1lLFxuICAgICAgY29uZmlnLFxuICAgICAgY3VzdG9tVHlwZVBhcmFtc1xuICAgICk7XG4gIH07XG59XG5leHBvcnQge1xuICBTUUxpdGVDdXN0b21Db2x1bW4sXG4gIFNRTGl0ZUN1c3RvbUNvbHVtbkJ1aWxkZXIsXG4gIGN1c3RvbVR5cGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jdXN0b20uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgc3FsIH0gZnJvbSBcIi4uLy4uL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWVBbmRDb25maWcgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiwgU1FMaXRlQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgU1FMaXRlQmFzZUludGVnZXJCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJhc2VJbnRlZ2VyQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBkYXRhVHlwZSwgY29sdW1uVHlwZSkge1xuICAgIHN1cGVyKG5hbWUsIGRhdGFUeXBlLCBjb2x1bW5UeXBlKTtcbiAgICB0aGlzLmNvbmZpZy5hdXRvSW5jcmVtZW50ID0gZmFsc2U7XG4gIH1cbiAgcHJpbWFyeUtleShjb25maWcpIHtcbiAgICBpZiAoY29uZmlnPy5hdXRvSW5jcmVtZW50KSB7XG4gICAgICB0aGlzLmNvbmZpZy5hdXRvSW5jcmVtZW50ID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5jb25maWcuaGFzRGVmYXVsdCA9IHRydWU7XG4gICAgcmV0dXJuIHN1cGVyLnByaW1hcnlLZXkoKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQmFzZUludGVnZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCYXNlSW50ZWdlclwiO1xuICBhdXRvSW5jcmVtZW50ID0gdGhpcy5jb25maWcuYXV0b0luY3JlbWVudDtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJpbnRlZ2VyXCI7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUludGVnZXJCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQmFzZUludGVnZXJCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW50ZWdlckJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwibnVtYmVyXCIsIFwiU1FMaXRlSW50ZWdlclwiKTtcbiAgfVxuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlSW50ZWdlcihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVJbnRlZ2VyIGV4dGVuZHMgU1FMaXRlQmFzZUludGVnZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVJbnRlZ2VyXCI7XG59XG5jbGFzcyBTUUxpdGVUaW1lc3RhbXBCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQmFzZUludGVnZXJCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGltZXN0YW1wQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBtb2RlKSB7XG4gICAgc3VwZXIobmFtZSwgXCJkYXRlXCIsIFwiU1FMaXRlVGltZXN0YW1wXCIpO1xuICAgIHRoaXMuY29uZmlnLm1vZGUgPSBtb2RlO1xuICB9XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGRlZmF1bHQoKWAgd2l0aCB5b3VyIG93biBleHByZXNzaW9uIGluc3RlYWQuXG4gICAqXG4gICAqIEFkZHMgYERFRkFVTFQgKGNhc3QoKGp1bGlhbmRheSgnbm93JykgLSAyNDQwNTg3LjUpKjg2NDAwMDAwIGFzIGludGVnZXIpKWAgdG8gdGhlIGNvbHVtbiwgd2hpY2ggaXMgdGhlIGN1cnJlbnQgZXBvY2ggdGltZXN0YW1wIGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIGRlZmF1bHROb3coKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdChzcWxgKGNhc3QoKGp1bGlhbmRheSgnbm93JykgLSAyNDQwNTg3LjUpKjg2NDAwMDAwIGFzIGludGVnZXIpKWApO1xuICB9XG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVUaW1lc3RhbXAoXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlVGltZXN0YW1wIGV4dGVuZHMgU1FMaXRlQmFzZUludGVnZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUaW1lc3RhbXBcIjtcbiAgbW9kZSA9IHRoaXMuY29uZmlnLm1vZGU7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5tb2RlID09PSBcInRpbWVzdGFtcFwiKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUgKiAxZTMpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBjb25zdCB1bml4ID0gdmFsdWUuZ2V0VGltZSgpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5tb2RlID09PSBcInRpbWVzdGFtcFwiKSB7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcih1bml4IC8gMWUzKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuaXg7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJvb2xlYW5CdWlsZGVyIGV4dGVuZHMgU1FMaXRlQmFzZUludGVnZXJCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQm9vbGVhbkJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgbW9kZSkge1xuICAgIHN1cGVyKG5hbWUsIFwiYm9vbGVhblwiLCBcIlNRTGl0ZUJvb2xlYW5cIik7XG4gICAgdGhpcy5jb25maWcubW9kZSA9IG1vZGU7XG4gIH1cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJvb2xlYW4oXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQm9vbGVhbiBleHRlbmRzIFNRTGl0ZUJhc2VJbnRlZ2VyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQm9vbGVhblwiO1xuICBtb2RlID0gdGhpcy5jb25maWcubW9kZTtcbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSkgPT09IDE7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA/IDEgOiAwO1xuICB9XG59XG5mdW5jdGlvbiBpbnRlZ2VyKGEsIGIpIHtcbiAgY29uc3QgeyBuYW1lLCBjb25maWcgfSA9IGdldENvbHVtbk5hbWVBbmRDb25maWcoYSwgYik7XG4gIGlmIChjb25maWc/Lm1vZGUgPT09IFwidGltZXN0YW1wXCIgfHwgY29uZmlnPy5tb2RlID09PSBcInRpbWVzdGFtcF9tc1wiKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVUaW1lc3RhbXBCdWlsZGVyKG5hbWUsIGNvbmZpZy5tb2RlKTtcbiAgfVxuICBpZiAoY29uZmlnPy5tb2RlID09PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQm9vbGVhbkJ1aWxkZXIobmFtZSwgY29uZmlnLm1vZGUpO1xuICB9XG4gIHJldHVybiBuZXcgU1FMaXRlSW50ZWdlckJ1aWxkZXIobmFtZSk7XG59XG5jb25zdCBpbnQgPSBpbnRlZ2VyO1xuZXhwb3J0IHtcbiAgU1FMaXRlQmFzZUludGVnZXIsXG4gIFNRTGl0ZUJhc2VJbnRlZ2VyQnVpbGRlcixcbiAgU1FMaXRlQm9vbGVhbixcbiAgU1FMaXRlQm9vbGVhbkJ1aWxkZXIsXG4gIFNRTGl0ZUludGVnZXIsXG4gIFNRTGl0ZUludGVnZXJCdWlsZGVyLFxuICBTUUxpdGVUaW1lc3RhbXAsXG4gIFNRTGl0ZVRpbWVzdGFtcEJ1aWxkZXIsXG4gIGludCxcbiAgaW50ZWdlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWludGVnZXIuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uLCBTUUxpdGVDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBTUUxpdGVOdW1lcmljQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVOdW1lcmljQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJzdHJpbmdcIiwgXCJTUUxpdGVOdW1lcmljXCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZU51bWVyaWMoXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlTnVtZXJpYyBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZU51bWVyaWNcIjtcbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbHVlO1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwibnVtZXJpY1wiO1xuICB9XG59XG5jbGFzcyBTUUxpdGVOdW1lcmljTnVtYmVyQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVOdW1lcmljTnVtYmVyQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJudW1iZXJcIiwgXCJTUUxpdGVOdW1lcmljTnVtYmVyXCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZU51bWVyaWNOdW1iZXIoXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlTnVtZXJpY051bWJlciBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZU51bWVyaWNOdW1iZXJcIjtcbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHZhbHVlO1xuICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUgPSBTdHJpbmc7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwibnVtZXJpY1wiO1xuICB9XG59XG5jbGFzcyBTUUxpdGVOdW1lcmljQmlnSW50QnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVOdW1lcmljQmlnSW50QnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJiaWdpbnRcIiwgXCJTUUxpdGVOdW1lcmljQmlnSW50XCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZU51bWVyaWNCaWdJbnQoXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlTnVtZXJpY0JpZ0ludCBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZU51bWVyaWNCaWdJbnRcIjtcbiAgbWFwRnJvbURyaXZlclZhbHVlID0gQmlnSW50O1xuICBtYXBUb0RyaXZlclZhbHVlID0gU3RyaW5nO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcIm51bWVyaWNcIjtcbiAgfVxufVxuZnVuY3Rpb24gbnVtZXJpYyhhLCBiKSB7XG4gIGNvbnN0IHsgbmFtZSwgY29uZmlnIH0gPSBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnKGEsIGIpO1xuICBjb25zdCBtb2RlID0gY29uZmlnPy5tb2RlO1xuICByZXR1cm4gbW9kZSA9PT0gXCJudW1iZXJcIiA/IG5ldyBTUUxpdGVOdW1lcmljTnVtYmVyQnVpbGRlcihuYW1lKSA6IG1vZGUgPT09IFwiYmlnaW50XCIgPyBuZXcgU1FMaXRlTnVtZXJpY0JpZ0ludEJ1aWxkZXIobmFtZSkgOiBuZXcgU1FMaXRlTnVtZXJpY0J1aWxkZXIobmFtZSk7XG59XG5leHBvcnQge1xuICBTUUxpdGVOdW1lcmljLFxuICBTUUxpdGVOdW1lcmljQmlnSW50LFxuICBTUUxpdGVOdW1lcmljQmlnSW50QnVpbGRlcixcbiAgU1FMaXRlTnVtZXJpY0J1aWxkZXIsXG4gIFNRTGl0ZU51bWVyaWNOdW1iZXIsXG4gIFNRTGl0ZU51bWVyaWNOdW1iZXJCdWlsZGVyLFxuICBudW1lcmljXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bnVtZXJpYy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4sIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFNRTGl0ZVJlYWxCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVJlYWxCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcIm51bWJlclwiLCBcIlNRTGl0ZVJlYWxcIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlUmVhbCh0YWJsZSwgdGhpcy5jb25maWcpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVSZWFsIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlUmVhbFwiO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcInJlYWxcIjtcbiAgfVxufVxuZnVuY3Rpb24gcmVhbChuYW1lKSB7XG4gIHJldHVybiBuZXcgU1FMaXRlUmVhbEJ1aWxkZXIobmFtZSA/PyBcIlwiKTtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZVJlYWwsXG4gIFNRTGl0ZVJlYWxCdWlsZGVyLFxuICByZWFsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVhbC5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4sIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFNRTGl0ZVRleHRCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRleHRCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGNvbmZpZykge1xuICAgIHN1cGVyKG5hbWUsIFwic3RyaW5nXCIsIFwiU1FMaXRlVGV4dFwiKTtcbiAgICB0aGlzLmNvbmZpZy5lbnVtVmFsdWVzID0gY29uZmlnLmVudW07XG4gICAgdGhpcy5jb25maWcubGVuZ3RoID0gY29uZmlnLmxlbmd0aDtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVUZXh0KFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVRleHQgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUZXh0XCI7XG4gIGVudW1WYWx1ZXMgPSB0aGlzLmNvbmZpZy5lbnVtVmFsdWVzO1xuICBsZW5ndGggPSB0aGlzLmNvbmZpZy5sZW5ndGg7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICBzdXBlcih0YWJsZSwgY29uZmlnKTtcbiAgfVxuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBgdGV4dCR7dGhpcy5jb25maWcubGVuZ3RoID8gYCgke3RoaXMuY29uZmlnLmxlbmd0aH0pYCA6IFwiXCJ9YDtcbiAgfVxufVxuY2xhc3MgU1FMaXRlVGV4dEpzb25CdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRleHRKc29uQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJqc29uXCIsIFwiU1FMaXRlVGV4dEpzb25cIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVGV4dEpzb24oXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlVGV4dEpzb24gZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUZXh0SnNvblwiO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcInRleHRcIjtcbiAgfVxuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHRleHQoYSwgYiA9IHt9KSB7XG4gIGNvbnN0IHsgbmFtZSwgY29uZmlnIH0gPSBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnKGEsIGIpO1xuICBpZiAoY29uZmlnLm1vZGUgPT09IFwianNvblwiKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVUZXh0SnNvbkJ1aWxkZXIobmFtZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTUUxpdGVUZXh0QnVpbGRlcihuYW1lLCBjb25maWcpO1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlVGV4dCxcbiAgU1FMaXRlVGV4dEJ1aWxkZXIsXG4gIFNRTGl0ZVRleHRKc29uLFxuICBTUUxpdGVUZXh0SnNvbkJ1aWxkZXIsXG4gIHRleHRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZXh0LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgQ29sdW1uQWxpYXNQcm94eUhhbmRsZXIsIFRhYmxlQWxpYXNQcm94eUhhbmRsZXIgfSBmcm9tIFwiLi9hbGlhcy5qc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU1FMLCBWaWV3IH0gZnJvbSBcIi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi92aWV3LWNvbW1vbi5qc1wiO1xuY2xhc3MgU2VsZWN0aW9uUHJveHlIYW5kbGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU2VsZWN0aW9uUHJveHlIYW5kbGVyXCI7XG4gIGNvbmZpZztcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSB7IC4uLmNvbmZpZyB9O1xuICB9XG4gIGdldChzdWJxdWVyeSwgcHJvcCkge1xuICAgIGlmIChwcm9wID09PSBcIl9cIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3VicXVlcnlbXCJfXCJdLFxuICAgICAgICBzZWxlY3RlZEZpZWxkczogbmV3IFByb3h5KFxuICAgICAgICAgIHN1YnF1ZXJ5Ll8uc2VsZWN0ZWRGaWVsZHMsXG4gICAgICAgICAgdGhpc1xuICAgICAgICApXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAocHJvcCA9PT0gVmlld0Jhc2VDb25maWcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN1YnF1ZXJ5W1ZpZXdCYXNlQ29uZmlnXSxcbiAgICAgICAgc2VsZWN0ZWRGaWVsZHM6IG5ldyBQcm94eShcbiAgICAgICAgICBzdWJxdWVyeVtWaWV3QmFzZUNvbmZpZ10uc2VsZWN0ZWRGaWVsZHMsXG4gICAgICAgICAgdGhpc1xuICAgICAgICApXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHByb3AgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgIHJldHVybiBzdWJxdWVyeVtwcm9wXTtcbiAgICB9XG4gICAgY29uc3QgY29sdW1ucyA9IGlzKHN1YnF1ZXJ5LCBTdWJxdWVyeSkgPyBzdWJxdWVyeS5fLnNlbGVjdGVkRmllbGRzIDogaXMoc3VicXVlcnksIFZpZXcpID8gc3VicXVlcnlbVmlld0Jhc2VDb25maWddLnNlbGVjdGVkRmllbGRzIDogc3VicXVlcnk7XG4gICAgY29uc3QgdmFsdWUgPSBjb2x1bW5zW3Byb3BdO1xuICAgIGlmIChpcyh2YWx1ZSwgU1FMLkFsaWFzZWQpKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcuc3FsQWxpYXNlZEJlaGF2aW9yID09PSBcInNxbFwiICYmICF2YWx1ZS5pc1NlbGVjdGlvbkZpZWxkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zcWw7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHZhbHVlLmNsb25lKCk7XG4gICAgICBuZXdWYWx1ZS5pc1NlbGVjdGlvbkZpZWxkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzKHZhbHVlLCBTUUwpKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcuc3FsQmVoYXZpb3IgPT09IFwic3FsXCIpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgWW91IHRyaWVkIHRvIHJlZmVyZW5jZSBcIiR7cHJvcH1cIiBmaWVsZCBmcm9tIGEgc3VicXVlcnksIHdoaWNoIGlzIGEgcmF3IFNRTCBmaWVsZCwgYnV0IGl0IGRvZXNuJ3QgaGF2ZSBhbiBhbGlhcyBkZWNsYXJlZC4gUGxlYXNlIGFkZCBhbiBhbGlhcyB0byB0aGUgZmllbGQgdXNpbmcgXCIuYXMoJ2FsaWFzJylcIiBtZXRob2QuYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGlzKHZhbHVlLCBDb2x1bW4pKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcuYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eShcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBuZXcgQ29sdW1uQWxpYXNQcm94eUhhbmRsZXIoXG4gICAgICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgICAgIHZhbHVlLnRhYmxlLFxuICAgICAgICAgICAgICBuZXcgVGFibGVBbGlhc1Byb3h5SGFuZGxlcih0aGlzLmNvbmZpZy5hbGlhcywgdGhpcy5jb25maWcucmVwbGFjZU9yaWdpbmFsTmFtZSA/PyBmYWxzZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm94eSh2YWx1ZSwgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih0aGlzLmNvbmZpZykpO1xuICB9XG59XG5leHBvcnQge1xuICBTZWxlY3Rpb25Qcm94eUhhbmRsZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWxlY3Rpb24tcHJveHkuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5jbGFzcyBRdWVyeVByb21pc2Uge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJRdWVyeVByb21pc2VcIjtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ10gPSBcIlF1ZXJ5UHJvbWlzZVwiO1xuICBjYXRjaChvblJlamVjdGVkKSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbih2b2lkIDAsIG9uUmVqZWN0ZWQpO1xuICB9XG4gIGZpbmFsbHkob25GaW5hbGx5KSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICBvbkZpbmFsbHk/LigpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9LFxuICAgICAgKHJlYXNvbikgPT4ge1xuICAgICAgICBvbkZpbmFsbHk/LigpO1xuICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSgpLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpO1xuICB9XG59XG5leHBvcnQge1xuICBRdWVyeVByb21pc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1xdWVyeS1wcm9taXNlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgYmxvYiB9IGZyb20gXCIuL2Jsb2IuanNcIjtcbmltcG9ydCB7IGN1c3RvbVR5cGUgfSBmcm9tIFwiLi9jdXN0b20uanNcIjtcbmltcG9ydCB7IGludGVnZXIgfSBmcm9tIFwiLi9pbnRlZ2VyLmpzXCI7XG5pbXBvcnQgeyBudW1lcmljIH0gZnJvbSBcIi4vbnVtZXJpYy5qc1wiO1xuaW1wb3J0IHsgcmVhbCB9IGZyb20gXCIuL3JlYWwuanNcIjtcbmltcG9ydCB7IHRleHQgfSBmcm9tIFwiLi90ZXh0LmpzXCI7XG5mdW5jdGlvbiBnZXRTUUxpdGVDb2x1bW5CdWlsZGVycygpIHtcbiAgcmV0dXJuIHtcbiAgICBibG9iLFxuICAgIGN1c3RvbVR5cGUsXG4gICAgaW50ZWdlcixcbiAgICBudW1lcmljLFxuICAgIHJlYWwsXG4gICAgdGV4dFxuICB9O1xufVxuZXhwb3J0IHtcbiAgZ2V0U1FMaXRlQ29sdW1uQnVpbGRlcnNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbGwuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IGdldFNRTGl0ZUNvbHVtbkJ1aWxkZXJzIH0gZnJvbSBcIi4vY29sdW1ucy9hbGwuanNcIjtcbmNvbnN0IElubGluZUZvcmVpZ25LZXlzID0gU3ltYm9sLmZvcihcImRyaXp6bGU6U1FMaXRlSW5saW5lRm9yZWlnbktleXNcIik7XG5jbGFzcyBTUUxpdGVUYWJsZSBleHRlbmRzIFRhYmxlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGFibGVcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgU3ltYm9sID0gT2JqZWN0LmFzc2lnbih7fSwgVGFibGUuU3ltYm9sLCB7XG4gICAgSW5saW5lRm9yZWlnbktleXNcbiAgfSk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW1RhYmxlLlN5bWJvbC5Db2x1bW5zXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbSW5saW5lRm9yZWlnbktleXNdID0gW107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0J1aWxkZXJdID0gdm9pZCAwO1xufVxuZnVuY3Rpb24gc3FsaXRlVGFibGVCYXNlKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnLCBzY2hlbWEsIGJhc2VOYW1lID0gbmFtZSkge1xuICBjb25zdCByYXdUYWJsZSA9IG5ldyBTUUxpdGVUYWJsZShuYW1lLCBzY2hlbWEsIGJhc2VOYW1lKTtcbiAgY29uc3QgcGFyc2VkQ29sdW1ucyA9IHR5cGVvZiBjb2x1bW5zID09PSBcImZ1bmN0aW9uXCIgPyBjb2x1bW5zKGdldFNRTGl0ZUNvbHVtbkJ1aWxkZXJzKCkpIDogY29sdW1ucztcbiAgY29uc3QgYnVpbHRDb2x1bW5zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHBhcnNlZENvbHVtbnMpLm1hcCgoW25hbWUyLCBjb2xCdWlsZGVyQmFzZV0pID0+IHtcbiAgICAgIGNvbnN0IGNvbEJ1aWxkZXIgPSBjb2xCdWlsZGVyQmFzZTtcbiAgICAgIGNvbEJ1aWxkZXIuc2V0TmFtZShuYW1lMik7XG4gICAgICBjb25zdCBjb2x1bW4gPSBjb2xCdWlsZGVyLmJ1aWxkKHJhd1RhYmxlKTtcbiAgICAgIHJhd1RhYmxlW0lubGluZUZvcmVpZ25LZXlzXS5wdXNoKC4uLmNvbEJ1aWxkZXIuYnVpbGRGb3JlaWduS2V5cyhjb2x1bW4sIHJhd1RhYmxlKSk7XG4gICAgICByZXR1cm4gW25hbWUyLCBjb2x1bW5dO1xuICAgIH0pXG4gICk7XG4gIGNvbnN0IHRhYmxlID0gT2JqZWN0LmFzc2lnbihyYXdUYWJsZSwgYnVpbHRDb2x1bW5zKTtcbiAgdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdID0gYnVpbHRDb2x1bW5zO1xuICB0YWJsZVtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdDb2x1bW5zXSA9IGJ1aWx0Q29sdW1ucztcbiAgaWYgKGV4dHJhQ29uZmlnKSB7XG4gICAgdGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQnVpbGRlcl0gPSBleHRyYUNvbmZpZztcbiAgfVxuICByZXR1cm4gdGFibGU7XG59XG5jb25zdCBzcWxpdGVUYWJsZSA9IChuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZykgPT4ge1xuICByZXR1cm4gc3FsaXRlVGFibGVCYXNlKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnKTtcbn07XG5mdW5jdGlvbiBzcWxpdGVUYWJsZUNyZWF0b3IoY3VzdG9taXplVGFibGVOYW1lKSB7XG4gIHJldHVybiAobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcpID0+IHtcbiAgICByZXR1cm4gc3FsaXRlVGFibGVCYXNlKGN1c3RvbWl6ZVRhYmxlTmFtZShuYW1lKSwgY29sdW1ucywgZXh0cmFDb25maWcsIHZvaWQgMCwgbmFtZSk7XG4gIH07XG59XG5leHBvcnQge1xuICBJbmxpbmVGb3JlaWduS2V5cyxcbiAgU1FMaXRlVGFibGUsXG4gIHNxbGl0ZVRhYmxlLFxuICBzcWxpdGVUYWJsZUNyZWF0b3Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YWJsZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5jbGFzcyBJbmRleEJ1aWxkZXJPbiB7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIHVuaXF1ZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy51bmlxdWUgPSB1bmlxdWU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW5kZXhCdWlsZGVyT25cIjtcbiAgb24oLi4uY29sdW1ucykge1xuICAgIHJldHVybiBuZXcgSW5kZXhCdWlsZGVyKHRoaXMubmFtZSwgY29sdW1ucywgdGhpcy51bmlxdWUpO1xuICB9XG59XG5jbGFzcyBJbmRleEJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVJbmRleEJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25maWc7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGNvbHVtbnMsIHVuaXF1ZSkge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGNvbHVtbnMsXG4gICAgICB1bmlxdWUsXG4gICAgICB3aGVyZTogdm9pZCAwXG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogQ29uZGl0aW9uIGZvciBwYXJ0aWFsIGluZGV4LlxuICAgKi9cbiAgd2hlcmUoY29uZGl0aW9uKSB7XG4gICAgdGhpcy5jb25maWcud2hlcmUgPSBjb25kaXRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgSW5kZXgodGhpcy5jb25maWcsIHRhYmxlKTtcbiAgfVxufVxuY2xhc3MgSW5kZXgge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVJbmRleFwiO1xuICBjb25maWc7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZywgdGFibGUpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uY29uZmlnLCB0YWJsZSB9O1xuICB9XG59XG5mdW5jdGlvbiBpbmRleChuYW1lKSB7XG4gIHJldHVybiBuZXcgSW5kZXhCdWlsZGVyT24obmFtZSwgZmFsc2UpO1xufVxuZnVuY3Rpb24gdW5pcXVlSW5kZXgobmFtZSkge1xuICByZXR1cm4gbmV3IEluZGV4QnVpbGRlck9uKG5hbWUsIHRydWUpO1xufVxuZXhwb3J0IHtcbiAgSW5kZXgsXG4gIEluZGV4QnVpbGRlcixcbiAgSW5kZXhCdWlsZGVyT24sXG4gIGluZGV4LFxuICB1bmlxdWVJbmRleFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4ZXMuanMubWFwIiwKICAgICJpbXBvcnQgeyBpcyB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNRTCB9IGZyb20gXCIuLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTdWJxdWVyeSB9IGZyb20gXCIuLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4uL3ZpZXctY29tbW9uLmpzXCI7XG5pbXBvcnQgeyBDaGVja0J1aWxkZXIgfSBmcm9tIFwiLi9jaGVja3MuanNcIjtcbmltcG9ydCB7IEZvcmVpZ25LZXlCdWlsZGVyIH0gZnJvbSBcIi4vZm9yZWlnbi1rZXlzLmpzXCI7XG5pbXBvcnQgeyBJbmRleEJ1aWxkZXIgfSBmcm9tIFwiLi9pbmRleGVzLmpzXCI7XG5pbXBvcnQgeyBQcmltYXJ5S2V5QnVpbGRlciB9IGZyb20gXCIuL3ByaW1hcnkta2V5cy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIgfSBmcm9tIFwiLi91bmlxdWUtY29uc3RyYWludC5qc1wiO1xuZnVuY3Rpb24gZ2V0VGFibGVDb25maWcodGFibGUpIHtcbiAgY29uc3QgY29sdW1ucyA9IE9iamVjdC52YWx1ZXModGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkNvbHVtbnNdKTtcbiAgY29uc3QgaW5kZXhlcyA9IFtdO1xuICBjb25zdCBjaGVja3MgPSBbXTtcbiAgY29uc3QgcHJpbWFyeUtleXMgPSBbXTtcbiAgY29uc3QgdW5pcXVlQ29uc3RyYWludHMgPSBbXTtcbiAgY29uc3QgZm9yZWlnbktleXMgPSBPYmplY3QudmFsdWVzKHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5JbmxpbmVGb3JlaWduS2V5c10pO1xuICBjb25zdCBuYW1lID0gdGFibGVbVGFibGUuU3ltYm9sLk5hbWVdO1xuICBjb25zdCBleHRyYUNvbmZpZ0J1aWxkZXIgPSB0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdCdWlsZGVyXTtcbiAgaWYgKGV4dHJhQ29uZmlnQnVpbGRlciAhPT0gdm9pZCAwKSB7XG4gICAgY29uc3QgZXh0cmFDb25maWcgPSBleHRyYUNvbmZpZ0J1aWxkZXIodGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkNvbHVtbnNdKTtcbiAgICBjb25zdCBleHRyYVZhbHVlcyA9IEFycmF5LmlzQXJyYXkoZXh0cmFDb25maWcpID8gZXh0cmFDb25maWcuZmxhdCgxKSA6IE9iamVjdC52YWx1ZXMoZXh0cmFDb25maWcpO1xuICAgIGZvciAoY29uc3QgYnVpbGRlciBvZiBPYmplY3QudmFsdWVzKGV4dHJhVmFsdWVzKSkge1xuICAgICAgaWYgKGlzKGJ1aWxkZXIsIEluZGV4QnVpbGRlcikpIHtcbiAgICAgICAgaW5kZXhlcy5wdXNoKGJ1aWxkZXIuYnVpbGQodGFibGUpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXMoYnVpbGRlciwgQ2hlY2tCdWlsZGVyKSkge1xuICAgICAgICBjaGVja3MucHVzaChidWlsZGVyLmJ1aWxkKHRhYmxlKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzKGJ1aWxkZXIsIFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyKSkge1xuICAgICAgICB1bmlxdWVDb25zdHJhaW50cy5wdXNoKGJ1aWxkZXIuYnVpbGQodGFibGUpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXMoYnVpbGRlciwgUHJpbWFyeUtleUJ1aWxkZXIpKSB7XG4gICAgICAgIHByaW1hcnlLZXlzLnB1c2goYnVpbGRlci5idWlsZCh0YWJsZSkpO1xuICAgICAgfSBlbHNlIGlmIChpcyhidWlsZGVyLCBGb3JlaWduS2V5QnVpbGRlcikpIHtcbiAgICAgICAgZm9yZWlnbktleXMucHVzaChidWlsZGVyLmJ1aWxkKHRhYmxlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgY29sdW1ucyxcbiAgICBpbmRleGVzLFxuICAgIGZvcmVpZ25LZXlzLFxuICAgIGNoZWNrcyxcbiAgICBwcmltYXJ5S2V5cyxcbiAgICB1bmlxdWVDb25zdHJhaW50cyxcbiAgICBuYW1lXG4gIH07XG59XG5mdW5jdGlvbiBleHRyYWN0VXNlZFRhYmxlKHRhYmxlKSB7XG4gIGlmIChpcyh0YWJsZSwgU1FMaXRlVGFibGUpKSB7XG4gICAgcmV0dXJuIFtgJHt0YWJsZVtUYWJsZS5TeW1ib2wuQmFzZU5hbWVdfWBdO1xuICB9XG4gIGlmIChpcyh0YWJsZSwgU3VicXVlcnkpKSB7XG4gICAgcmV0dXJuIHRhYmxlLl8udXNlZFRhYmxlcyA/PyBbXTtcbiAgfVxuICBpZiAoaXModGFibGUsIFNRTCkpIHtcbiAgICByZXR1cm4gdGFibGUudXNlZFRhYmxlcyA/PyBbXTtcbiAgfVxuICByZXR1cm4gW107XG59XG5mdW5jdGlvbiBnZXRWaWV3Q29uZmlnKHZpZXcpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi52aWV3W1ZpZXdCYXNlQ29uZmlnXVxuICAgIC8vIC4uLnZpZXdbU1FMaXRlVmlld0NvbmZpZ10sXG4gIH07XG59XG5leHBvcnQge1xuICBleHRyYWN0VXNlZFRhYmxlLFxuICBnZXRUYWJsZUNvbmZpZyxcbiAgZ2V0Vmlld0NvbmZpZ1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi8uLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5pbXBvcnQgeyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vc2VsZWN0aW9uLXByb3h5LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IG9yZGVyU2VsZWN0ZWRGaWVsZHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IGV4dHJhY3RVc2VkVGFibGUgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmNsYXNzIFNRTGl0ZURlbGV0ZUJhc2UgZXh0ZW5kcyBRdWVyeVByb21pc2Uge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgc2Vzc2lvbiwgZGlhbGVjdCwgd2l0aExpc3QpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5jb25maWcgPSB7IHRhYmxlLCB3aXRoTGlzdCB9O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZURlbGV0ZVwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbmZpZztcbiAgLyoqXG4gICAqIEFkZHMgYSBgd2hlcmVgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBkZWxldGUgb25seSB0aG9zZSByb3dzIHRoYXQgZnVsZmlsbCBhIHNwZWNpZmllZCBjb25kaXRpb24uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvZGVsZXRlfVxuICAgKlxuICAgKiBAcGFyYW0gd2hlcmUgdGhlIGB3aGVyZWAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBZb3UgY2FuIHVzZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgYW5kIGBzcWwgZnVuY3Rpb25gIHRvIGZpbHRlciB0aGUgcm93cyB0byBiZSBkZWxldGVkLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBEZWxldGUgYWxsIGNhcnMgd2l0aCBncmVlbiBjb2xvclxuICAgKiBkYi5kZWxldGUoY2Fycykud2hlcmUoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJykpO1xuICAgKiAvLyBvclxuICAgKiBkYi5kZWxldGUoY2Fycykud2hlcmUoc3FsYCR7Y2Fycy5jb2xvcn0gPSAnZ3JlZW4nYClcbiAgICogYGBgXG4gICAqXG4gICAqIFlvdSBjYW4gbG9naWNhbGx5IGNvbWJpbmUgY29uZGl0aW9uYWwgb3BlcmF0b3JzIHdpdGggYGFuZCgpYCBhbmQgYG9yKClgIG9wZXJhdG9yczpcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gRGVsZXRlIGFsbCBCTVcgY2FycyB3aXRoIGEgZ3JlZW4gY29sb3JcbiAgICogZGIuZGVsZXRlKGNhcnMpLndoZXJlKGFuZChlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSwgZXEoY2Fycy5icmFuZCwgJ0JNVycpKSk7XG4gICAqXG4gICAqIC8vIERlbGV0ZSBhbGwgY2FycyB3aXRoIHRoZSBncmVlbiBvciBibHVlIGNvbG9yXG4gICAqIGRiLmRlbGV0ZShjYXJzKS53aGVyZShvcihlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSwgZXEoY2Fycy5jb2xvciwgJ2JsdWUnKSkpO1xuICAgKiBgYGBcbiAgICovXG4gIHdoZXJlKHdoZXJlKSB7XG4gICAgdGhpcy5jb25maWcud2hlcmUgPSB3aGVyZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcmRlckJ5KC4uLmNvbHVtbnMpIHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbnNbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3Qgb3JkZXJCeSA9IGNvbHVtbnNbMF0oXG4gICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICB0aGlzLmNvbmZpZy50YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10sXG4gICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgY29uc3Qgb3JkZXJCeUFycmF5ID0gQXJyYXkuaXNBcnJheShvcmRlckJ5KSA/IG9yZGVyQnkgOiBbb3JkZXJCeV07XG4gICAgICB0aGlzLmNvbmZpZy5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcmRlckJ5QXJyYXkgPSBjb2x1bW5zO1xuICAgICAgdGhpcy5jb25maWcub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgbGltaXQobGltaXQpIHtcbiAgICB0aGlzLmNvbmZpZy5saW1pdCA9IGxpbWl0O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHJldHVybmluZyhmaWVsZHMgPSB0aGlzLnRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5Db2x1bW5zXSkge1xuICAgIHRoaXMuY29uZmlnLnJldHVybmluZyA9IG9yZGVyU2VsZWN0ZWRGaWVsZHMoZmllbGRzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsZWN0LmJ1aWxkRGVsZXRlUXVlcnkodGhpcy5jb25maWcpO1xuICB9XG4gIHRvU1FMKCkge1xuICAgIGNvbnN0IHsgdHlwaW5nczogX3R5cGluZ3MsIC4uLnJlc3QgfSA9IHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpO1xuICAgIHJldHVybiByZXN0O1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ByZXBhcmUoaXNPbmVUaW1lUXVlcnkgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbltpc09uZVRpbWVRdWVyeSA/IFwicHJlcGFyZU9uZVRpbWVRdWVyeVwiIDogXCJwcmVwYXJlUXVlcnlcIl0oXG4gICAgICB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKSxcbiAgICAgIHRoaXMuY29uZmlnLnJldHVybmluZyxcbiAgICAgIHRoaXMuY29uZmlnLnJldHVybmluZyA/IFwiYWxsXCIgOiBcInJ1blwiLFxuICAgICAgdHJ1ZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJkZWxldGVcIixcbiAgICAgICAgdGFibGVzOiBleHRyYWN0VXNlZFRhYmxlKHRoaXMuY29uZmlnLnRhYmxlKVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJlcGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSk7XG4gIH1cbiAgcnVuID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5ydW4ocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhbGwgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmFsbChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGdldCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuZ2V0KHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgdmFsdWVzID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS52YWx1ZXMocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhc3luYyBleGVjdXRlKHBsYWNlaG9sZGVyVmFsdWVzKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5leGVjdXRlKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfVxuICAkZHluYW1pYygpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuZXhwb3J0IHtcbiAgU1FMaXRlRGVsZXRlQmFzZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlbGV0ZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4vdGFibGUuanNcIjtcbmZ1bmN0aW9uIHRvU25ha2VDYXNlKGlucHV0KSB7XG4gIGNvbnN0IHdvcmRzID0gaW5wdXQucmVwbGFjZSgvWydcXHUyMDE5XS9nLCBcIlwiKS5tYXRjaCgvW1xcZGEtel0rfFtBLVpdKyg/IVthLXpdKXxbQS1aXVtcXGRhLXpdKy9nKSA/PyBbXTtcbiAgcmV0dXJuIHdvcmRzLm1hcCgod29yZCkgPT4gd29yZC50b0xvd2VyQ2FzZSgpKS5qb2luKFwiX1wiKTtcbn1cbmZ1bmN0aW9uIHRvQ2FtZWxDYXNlKGlucHV0KSB7XG4gIGNvbnN0IHdvcmRzID0gaW5wdXQucmVwbGFjZSgvWydcXHUyMDE5XS9nLCBcIlwiKS5tYXRjaCgvW1xcZGEtel0rfFtBLVpdKyg/IVthLXpdKXxbQS1aXVtcXGRhLXpdKy9nKSA/PyBbXTtcbiAgcmV0dXJuIHdvcmRzLnJlZHVjZSgoYWNjLCB3b3JkLCBpKSA9PiB7XG4gICAgY29uc3QgZm9ybWF0dGVkV29yZCA9IGkgPT09IDAgPyB3b3JkLnRvTG93ZXJDYXNlKCkgOiBgJHt3b3JkWzBdLnRvVXBwZXJDYXNlKCl9JHt3b3JkLnNsaWNlKDEpfWA7XG4gICAgcmV0dXJuIGFjYyArIGZvcm1hdHRlZFdvcmQ7XG4gIH0sIFwiXCIpO1xufVxuZnVuY3Rpb24gbm9vcENhc2UoaW5wdXQpIHtcbiAgcmV0dXJuIGlucHV0O1xufVxuY2xhc3MgQ2FzaW5nQ2FjaGUge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJDYXNpbmdDYWNoZVwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNhY2hlID0ge307XG4gIGNhY2hlZFRhYmxlcyA9IHt9O1xuICBjb252ZXJ0O1xuICBjb25zdHJ1Y3RvcihjYXNpbmcpIHtcbiAgICB0aGlzLmNvbnZlcnQgPSBjYXNpbmcgPT09IFwic25ha2VfY2FzZVwiID8gdG9TbmFrZUNhc2UgOiBjYXNpbmcgPT09IFwiY2FtZWxDYXNlXCIgPyB0b0NhbWVsQ2FzZSA6IG5vb3BDYXNlO1xuICB9XG4gIGdldENvbHVtbkNhc2luZyhjb2x1bW4pIHtcbiAgICBpZiAoIWNvbHVtbi5rZXlBc05hbWUpIHJldHVybiBjb2x1bW4ubmFtZTtcbiAgICBjb25zdCBzY2hlbWEgPSBjb2x1bW4udGFibGVbVGFibGUuU3ltYm9sLlNjaGVtYV0gPz8gXCJwdWJsaWNcIjtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBjb2x1bW4udGFibGVbVGFibGUuU3ltYm9sLk9yaWdpbmFsTmFtZV07XG4gICAgY29uc3Qga2V5ID0gYCR7c2NoZW1hfS4ke3RhYmxlTmFtZX0uJHtjb2x1bW4ubmFtZX1gO1xuICAgIGlmICghdGhpcy5jYWNoZVtrZXldKSB7XG4gICAgICB0aGlzLmNhY2hlVGFibGUoY29sdW1uLnRhYmxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVba2V5XTtcbiAgfVxuICBjYWNoZVRhYmxlKHRhYmxlKSB7XG4gICAgY29uc3Qgc2NoZW1hID0gdGFibGVbVGFibGUuU3ltYm9sLlNjaGVtYV0gPz8gXCJwdWJsaWNcIjtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSB0YWJsZVtUYWJsZS5TeW1ib2wuT3JpZ2luYWxOYW1lXTtcbiAgICBjb25zdCB0YWJsZUtleSA9IGAke3NjaGVtYX0uJHt0YWJsZU5hbWV9YDtcbiAgICBpZiAoIXRoaXMuY2FjaGVkVGFibGVzW3RhYmxlS2V5XSkge1xuICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgT2JqZWN0LnZhbHVlcyh0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10pKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbktleSA9IGAke3RhYmxlS2V5fS4ke2NvbHVtbi5uYW1lfWA7XG4gICAgICAgIHRoaXMuY2FjaGVbY29sdW1uS2V5XSA9IHRoaXMuY29udmVydChjb2x1bW4ubmFtZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNhY2hlZFRhYmxlc1t0YWJsZUtleV0gPSB0cnVlO1xuICAgIH1cbiAgfVxuICBjbGVhckNhY2hlKCkge1xuICAgIHRoaXMuY2FjaGUgPSB7fTtcbiAgICB0aGlzLmNhY2hlZFRhYmxlcyA9IHt9O1xuICB9XG59XG5leHBvcnQge1xuICBDYXNpbmdDYWNoZSxcbiAgdG9DYW1lbENhc2UsXG4gIHRvU25ha2VDYXNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2FzaW5nLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuY2xhc3MgRHJpenpsZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJEcml6emxlRXJyb3JcIjtcbiAgY29uc3RydWN0b3IoeyBtZXNzYWdlLCBjYXVzZSB9KSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gXCJEcml6emxlRXJyb3JcIjtcbiAgICB0aGlzLmNhdXNlID0gY2F1c2U7XG4gIH1cbn1cbmNsYXNzIERyaXp6bGVRdWVyeUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihxdWVyeSwgcGFyYW1zLCBjYXVzZSkge1xuICAgIHN1cGVyKGBGYWlsZWQgcXVlcnk6ICR7cXVlcnl9XG5wYXJhbXM6ICR7cGFyYW1zfWApO1xuICAgIHRoaXMucXVlcnkgPSBxdWVyeTtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLmNhdXNlID0gY2F1c2U7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgRHJpenpsZVF1ZXJ5RXJyb3IpO1xuICAgIGlmIChjYXVzZSkgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICB9XG59XG5jbGFzcyBUcmFuc2FjdGlvblJvbGxiYWNrRXJyb3IgZXh0ZW5kcyBEcml6emxlRXJyb3Ige1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJUcmFuc2FjdGlvblJvbGxiYWNrRXJyb3JcIjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoeyBtZXNzYWdlOiBcIlJvbGxiYWNrXCIgfSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIERyaXp6bGVFcnJvcixcbiAgRHJpenpsZVF1ZXJ5RXJyb3IsXG4gIFRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVycm9ycy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgZ2V0UGdDb2x1bW5CdWlsZGVycyB9IGZyb20gXCIuL2NvbHVtbnMvYWxsLmpzXCI7XG5jb25zdCBJbmxpbmVGb3JlaWduS2V5cyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOlBnSW5saW5lRm9yZWlnbktleXNcIik7XG5jb25zdCBFbmFibGVSTFMgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpFbmFibGVSTFNcIik7XG5jbGFzcyBQZ1RhYmxlIGV4dGVuZHMgVGFibGUge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ1RhYmxlXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIFN5bWJvbCA9IE9iamVjdC5hc3NpZ24oe30sIFRhYmxlLlN5bWJvbCwge1xuICAgIElubGluZUZvcmVpZ25LZXlzLFxuICAgIEVuYWJsZVJMU1xuICB9KTtcbiAgLyoqQGludGVybmFsICovXG4gIFtJbmxpbmVGb3JlaWduS2V5c10gPSBbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbRW5hYmxlUkxTXSA9IGZhbHNlO1xuICAvKiogQGludGVybmFsICovXG4gIFtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdCdWlsZGVyXSA9IHZvaWQgMDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQ29sdW1uc10gPSB7fTtcbn1cbmZ1bmN0aW9uIHBnVGFibGVXaXRoU2NoZW1hKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnLCBzY2hlbWEsIGJhc2VOYW1lID0gbmFtZSkge1xuICBjb25zdCByYXdUYWJsZSA9IG5ldyBQZ1RhYmxlKG5hbWUsIHNjaGVtYSwgYmFzZU5hbWUpO1xuICBjb25zdCBwYXJzZWRDb2x1bW5zID0gdHlwZW9mIGNvbHVtbnMgPT09IFwiZnVuY3Rpb25cIiA/IGNvbHVtbnMoZ2V0UGdDb2x1bW5CdWlsZGVycygpKSA6IGNvbHVtbnM7XG4gIGNvbnN0IGJ1aWx0Q29sdW1ucyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhwYXJzZWRDb2x1bW5zKS5tYXAoKFtuYW1lMiwgY29sQnVpbGRlckJhc2VdKSA9PiB7XG4gICAgICBjb25zdCBjb2xCdWlsZGVyID0gY29sQnVpbGRlckJhc2U7XG4gICAgICBjb2xCdWlsZGVyLnNldE5hbWUobmFtZTIpO1xuICAgICAgY29uc3QgY29sdW1uID0gY29sQnVpbGRlci5idWlsZChyYXdUYWJsZSk7XG4gICAgICByYXdUYWJsZVtJbmxpbmVGb3JlaWduS2V5c10ucHVzaCguLi5jb2xCdWlsZGVyLmJ1aWxkRm9yZWlnbktleXMoY29sdW1uLCByYXdUYWJsZSkpO1xuICAgICAgcmV0dXJuIFtuYW1lMiwgY29sdW1uXTtcbiAgICB9KVxuICApO1xuICBjb25zdCBidWlsdENvbHVtbnNGb3JFeHRyYUNvbmZpZyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhwYXJzZWRDb2x1bW5zKS5tYXAoKFtuYW1lMiwgY29sQnVpbGRlckJhc2VdKSA9PiB7XG4gICAgICBjb25zdCBjb2xCdWlsZGVyID0gY29sQnVpbGRlckJhc2U7XG4gICAgICBjb2xCdWlsZGVyLnNldE5hbWUobmFtZTIpO1xuICAgICAgY29uc3QgY29sdW1uID0gY29sQnVpbGRlci5idWlsZEV4dHJhQ29uZmlnQ29sdW1uKHJhd1RhYmxlKTtcbiAgICAgIHJldHVybiBbbmFtZTIsIGNvbHVtbl07XG4gICAgfSlcbiAgKTtcbiAgY29uc3QgdGFibGUgPSBPYmplY3QuYXNzaWduKHJhd1RhYmxlLCBidWlsdENvbHVtbnMpO1xuICB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10gPSBidWlsdENvbHVtbnM7XG4gIHRhYmxlW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0NvbHVtbnNdID0gYnVpbHRDb2x1bW5zRm9yRXh0cmFDb25maWc7XG4gIGlmIChleHRyYUNvbmZpZykge1xuICAgIHRhYmxlW1BnVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQnVpbGRlcl0gPSBleHRyYUNvbmZpZztcbiAgfVxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih0YWJsZSwge1xuICAgIGVuYWJsZVJMUzogKCkgPT4ge1xuICAgICAgdGFibGVbUGdUYWJsZS5TeW1ib2wuRW5hYmxlUkxTXSA9IHRydWU7XG4gICAgICByZXR1cm4gdGFibGU7XG4gICAgfVxuICB9KTtcbn1cbmNvbnN0IHBnVGFibGUgPSAobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcpID0+IHtcbiAgcmV0dXJuIHBnVGFibGVXaXRoU2NoZW1hKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnLCB2b2lkIDApO1xufTtcbmZ1bmN0aW9uIHBnVGFibGVDcmVhdG9yKGN1c3RvbWl6ZVRhYmxlTmFtZSkge1xuICByZXR1cm4gKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnKSA9PiB7XG4gICAgcmV0dXJuIHBnVGFibGVXaXRoU2NoZW1hKGN1c3RvbWl6ZVRhYmxlTmFtZShuYW1lKSwgY29sdW1ucywgZXh0cmFDb25maWcsIHZvaWQgMCwgbmFtZSk7XG4gIH07XG59XG5leHBvcnQge1xuICBFbmFibGVSTFMsXG4gIElubGluZUZvcmVpZ25LZXlzLFxuICBQZ1RhYmxlLFxuICBwZ1RhYmxlLFxuICBwZ1RhYmxlQ3JlYXRvcixcbiAgcGdUYWJsZVdpdGhTY2hlbWFcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YWJsZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBQZ1RhYmxlIH0gZnJvbSBcIi4vdGFibGUuanNcIjtcbmZ1bmN0aW9uIHByaW1hcnlLZXkoLi4uY29uZmlnKSB7XG4gIGlmIChjb25maWdbMF0uY29sdW1ucykge1xuICAgIHJldHVybiBuZXcgUHJpbWFyeUtleUJ1aWxkZXIoY29uZmlnWzBdLmNvbHVtbnMsIGNvbmZpZ1swXS5uYW1lKTtcbiAgfVxuICByZXR1cm4gbmV3IFByaW1hcnlLZXlCdWlsZGVyKGNvbmZpZyk7XG59XG5jbGFzcyBQcmltYXJ5S2V5QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnUHJpbWFyeUtleUJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb2x1bW5zO1xuICAvKiogQGludGVybmFsICovXG4gIG5hbWU7XG4gIGNvbnN0cnVjdG9yKGNvbHVtbnMsIG5hbWUpIHtcbiAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgUHJpbWFyeUtleSh0YWJsZSwgdGhpcy5jb2x1bW5zLCB0aGlzLm5hbWUpO1xuICB9XG59XG5jbGFzcyBQcmltYXJ5S2V5IHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbHVtbnMsIG5hbWUpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnUHJpbWFyeUtleVwiO1xuICBjb2x1bW5zO1xuICBuYW1lO1xuICBnZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWUgPz8gYCR7dGhpcy50YWJsZVtQZ1RhYmxlLlN5bWJvbC5OYW1lXX1fJHt0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKS5qb2luKFwiX1wiKX1fcGtgO1xuICB9XG59XG5leHBvcnQge1xuICBQcmltYXJ5S2V5LFxuICBQcmltYXJ5S2V5QnVpbGRlcixcbiAgcHJpbWFyeUtleVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByaW1hcnkta2V5cy5qcy5tYXAiLAogICAgImltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuLi8uLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGlzIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUuanNcIjtcbmltcG9ydCB7XG4gIGlzRHJpdmVyVmFsdWVFbmNvZGVyLFxuICBpc1NRTFdyYXBwZXIsXG4gIFBhcmFtLFxuICBQbGFjZWhvbGRlcixcbiAgU1FMLFxuICBzcWwsXG4gIFN0cmluZ0NodW5rLFxuICBWaWV3XG59IGZyb20gXCIuLi9zcWwuanNcIjtcbmZ1bmN0aW9uIGJpbmRJZlBhcmFtKHZhbHVlLCBjb2x1bW4pIHtcbiAgaWYgKGlzRHJpdmVyVmFsdWVFbmNvZGVyKGNvbHVtbikgJiYgIWlzU1FMV3JhcHBlcih2YWx1ZSkgJiYgIWlzKHZhbHVlLCBQYXJhbSkgJiYgIWlzKHZhbHVlLCBQbGFjZWhvbGRlcikgJiYgIWlzKHZhbHVlLCBDb2x1bW4pICYmICFpcyh2YWx1ZSwgVGFibGUpICYmICFpcyh2YWx1ZSwgVmlldykpIHtcbiAgICByZXR1cm4gbmV3IFBhcmFtKHZhbHVlLCBjb2x1bW4pO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbmNvbnN0IGVxID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIHJldHVybiBzcWxgJHtsZWZ0fSA9ICR7YmluZElmUGFyYW0ocmlnaHQsIGxlZnQpfWA7XG59O1xuY29uc3QgbmUgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIHNxbGAke2xlZnR9IDw+ICR7YmluZElmUGFyYW0ocmlnaHQsIGxlZnQpfWA7XG59O1xuZnVuY3Rpb24gYW5kKC4uLnVuZmlsdGVyZWRDb25kaXRpb25zKSB7XG4gIGNvbnN0IGNvbmRpdGlvbnMgPSB1bmZpbHRlcmVkQ29uZGl0aW9ucy5maWx0ZXIoXG4gICAgKGMpID0+IGMgIT09IHZvaWQgMFxuICApO1xuICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBuZXcgU1FMKGNvbmRpdGlvbnMpO1xuICB9XG4gIHJldHVybiBuZXcgU1FMKFtcbiAgICBuZXcgU3RyaW5nQ2h1bmsoXCIoXCIpLFxuICAgIHNxbC5qb2luKGNvbmRpdGlvbnMsIG5ldyBTdHJpbmdDaHVuayhcIiBhbmQgXCIpKSxcbiAgICBuZXcgU3RyaW5nQ2h1bmsoXCIpXCIpXG4gIF0pO1xufVxuZnVuY3Rpb24gb3IoLi4udW5maWx0ZXJlZENvbmRpdGlvbnMpIHtcbiAgY29uc3QgY29uZGl0aW9ucyA9IHVuZmlsdGVyZWRDb25kaXRpb25zLmZpbHRlcihcbiAgICAoYykgPT4gYyAhPT0gdm9pZCAwXG4gICk7XG4gIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoY29uZGl0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTUUwoW1xuICAgIG5ldyBTdHJpbmdDaHVuayhcIihcIiksXG4gICAgc3FsLmpvaW4oY29uZGl0aW9ucywgbmV3IFN0cmluZ0NodW5rKFwiIG9yIFwiKSksXG4gICAgbmV3IFN0cmluZ0NodW5rKFwiKVwiKVxuICBdKTtcbn1cbmZ1bmN0aW9uIG5vdChjb25kaXRpb24pIHtcbiAgcmV0dXJuIHNxbGBub3QgJHtjb25kaXRpb259YDtcbn1cbmNvbnN0IGd0ID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIHJldHVybiBzcWxgJHtsZWZ0fSA+ICR7YmluZElmUGFyYW0ocmlnaHQsIGxlZnQpfWA7XG59O1xuY29uc3QgZ3RlID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIHJldHVybiBzcWxgJHtsZWZ0fSA+PSAke2JpbmRJZlBhcmFtKHJpZ2h0LCBsZWZ0KX1gO1xufTtcbmNvbnN0IGx0ID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIHJldHVybiBzcWxgJHtsZWZ0fSA8ICR7YmluZElmUGFyYW0ocmlnaHQsIGxlZnQpfWA7XG59O1xuY29uc3QgbHRlID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIHJldHVybiBzcWxgJHtsZWZ0fSA8PSAke2JpbmRJZlBhcmFtKHJpZ2h0LCBsZWZ0KX1gO1xufTtcbmZ1bmN0aW9uIGluQXJyYXkoY29sdW1uLCB2YWx1ZXMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gc3FsYGZhbHNlYDtcbiAgICB9XG4gICAgcmV0dXJuIHNxbGAke2NvbHVtbn0gaW4gJHt2YWx1ZXMubWFwKCh2KSA9PiBiaW5kSWZQYXJhbSh2LCBjb2x1bW4pKX1gO1xuICB9XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IGluICR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG59XG5mdW5jdGlvbiBub3RJbkFycmF5KGNvbHVtbiwgdmFsdWVzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHNxbGB0cnVlYDtcbiAgICB9XG4gICAgcmV0dXJuIHNxbGAke2NvbHVtbn0gbm90IGluICR7dmFsdWVzLm1hcCgodikgPT4gYmluZElmUGFyYW0odiwgY29sdW1uKSl9YDtcbiAgfVxuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBub3QgaW4gJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbn1cbmZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSkge1xuICByZXR1cm4gc3FsYCR7dmFsdWV9IGlzIG51bGxgO1xufVxuZnVuY3Rpb24gaXNOb3ROdWxsKHZhbHVlKSB7XG4gIHJldHVybiBzcWxgJHt2YWx1ZX0gaXMgbm90IG51bGxgO1xufVxuZnVuY3Rpb24gZXhpc3RzKHN1YnF1ZXJ5KSB7XG4gIHJldHVybiBzcWxgZXhpc3RzICR7c3VicXVlcnl9YDtcbn1cbmZ1bmN0aW9uIG5vdEV4aXN0cyhzdWJxdWVyeSkge1xuICByZXR1cm4gc3FsYG5vdCBleGlzdHMgJHtzdWJxdWVyeX1gO1xufVxuZnVuY3Rpb24gYmV0d2Vlbihjb2x1bW4sIG1pbiwgbWF4KSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IGJldHdlZW4gJHtiaW5kSWZQYXJhbShtaW4sIGNvbHVtbil9IGFuZCAke2JpbmRJZlBhcmFtKFxuICAgIG1heCxcbiAgICBjb2x1bW5cbiAgKX1gO1xufVxuZnVuY3Rpb24gbm90QmV0d2Vlbihjb2x1bW4sIG1pbiwgbWF4KSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IG5vdCBiZXR3ZWVuICR7YmluZElmUGFyYW0oXG4gICAgbWluLFxuICAgIGNvbHVtblxuICApfSBhbmQgJHtiaW5kSWZQYXJhbShtYXgsIGNvbHVtbil9YDtcbn1cbmZ1bmN0aW9uIGxpa2UoY29sdW1uLCB2YWx1ZSkge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBsaWtlICR7dmFsdWV9YDtcbn1cbmZ1bmN0aW9uIG5vdExpa2UoY29sdW1uLCB2YWx1ZSkge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBub3QgbGlrZSAke3ZhbHVlfWA7XG59XG5mdW5jdGlvbiBpbGlrZShjb2x1bW4sIHZhbHVlKSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IGlsaWtlICR7dmFsdWV9YDtcbn1cbmZ1bmN0aW9uIG5vdElsaWtlKGNvbHVtbiwgdmFsdWUpIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gbm90IGlsaWtlICR7dmFsdWV9YDtcbn1cbmZ1bmN0aW9uIGFycmF5Q29udGFpbnMoY29sdW1uLCB2YWx1ZXMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhcnJheUNvbnRhaW5zIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSB2YWx1ZVwiKTtcbiAgICB9XG4gICAgY29uc3QgYXJyYXkgPSBzcWxgJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbiAgICByZXR1cm4gc3FsYCR7Y29sdW1ufSBAPiAke2FycmF5fWA7XG4gIH1cbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gQD4gJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbn1cbmZ1bmN0aW9uIGFycmF5Q29udGFpbmVkKGNvbHVtbiwgdmFsdWVzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXJyYXlDb250YWluZWQgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHZhbHVlXCIpO1xuICAgIH1cbiAgICBjb25zdCBhcnJheSA9IHNxbGAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xuICAgIHJldHVybiBzcWxgJHtjb2x1bW59IDxAICR7YXJyYXl9YDtcbiAgfVxuICByZXR1cm4gc3FsYCR7Y29sdW1ufSA8QCAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xufVxuZnVuY3Rpb24gYXJyYXlPdmVybGFwcyhjb2x1bW4sIHZhbHVlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFycmF5T3ZlcmxhcHMgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHZhbHVlXCIpO1xuICAgIH1cbiAgICBjb25zdCBhcnJheSA9IHNxbGAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xuICAgIHJldHVybiBzcWxgJHtjb2x1bW59ICYmICR7YXJyYXl9YDtcbiAgfVxuICByZXR1cm4gc3FsYCR7Y29sdW1ufSAmJiAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xufVxuZXhwb3J0IHtcbiAgYW5kLFxuICBhcnJheUNvbnRhaW5lZCxcbiAgYXJyYXlDb250YWlucyxcbiAgYXJyYXlPdmVybGFwcyxcbiAgYmV0d2VlbixcbiAgYmluZElmUGFyYW0sXG4gIGVxLFxuICBleGlzdHMsXG4gIGd0LFxuICBndGUsXG4gIGlsaWtlLFxuICBpbkFycmF5LFxuICBpc05vdE51bGwsXG4gIGlzTnVsbCxcbiAgbGlrZSxcbiAgbHQsXG4gIGx0ZSxcbiAgbmUsXG4gIG5vdCxcbiAgbm90QmV0d2VlbixcbiAgbm90RXhpc3RzLFxuICBub3RJbGlrZSxcbiAgbm90SW5BcnJheSxcbiAgbm90TGlrZSxcbiAgb3Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25kaXRpb25zLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgc3FsIH0gZnJvbSBcIi4uL3NxbC5qc1wiO1xuZnVuY3Rpb24gYXNjKGNvbHVtbikge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBhc2NgO1xufVxuZnVuY3Rpb24gZGVzYyhjb2x1bW4pIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gZGVzY2A7XG59XG5leHBvcnQge1xuICBhc2MsXG4gIGRlc2Ncbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWxlY3QuanMubWFwIiwKICAgICJpbXBvcnQgeyBnZXRUYWJsZVVuaXF1ZU5hbWUsIFRhYmxlIH0gZnJvbSBcIi4vdGFibGUuanNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFByaW1hcnlLZXlCdWlsZGVyIH0gZnJvbSBcIi4vcGctY29yZS9wcmltYXJ5LWtleXMuanNcIjtcbmltcG9ydCB7XG4gIGFuZCxcbiAgYXNjLFxuICBiZXR3ZWVuLFxuICBkZXNjLFxuICBlcSxcbiAgZXhpc3RzLFxuICBndCxcbiAgZ3RlLFxuICBpbGlrZSxcbiAgaW5BcnJheSxcbiAgaXNOb3ROdWxsLFxuICBpc051bGwsXG4gIGxpa2UsXG4gIGx0LFxuICBsdGUsXG4gIG5lLFxuICBub3QsXG4gIG5vdEJldHdlZW4sXG4gIG5vdEV4aXN0cyxcbiAgbm90SWxpa2UsXG4gIG5vdEluQXJyYXksXG4gIG5vdExpa2UsXG4gIG9yXG59IGZyb20gXCIuL3NxbC9leHByZXNzaW9ucy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU1FMLCBzcWwgfSBmcm9tIFwiLi9zcWwvc3FsLmpzXCI7XG5jbGFzcyBSZWxhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZVRhYmxlLCByZWZlcmVuY2VkVGFibGUsIHJlbGF0aW9uTmFtZSkge1xuICAgIHRoaXMuc291cmNlVGFibGUgPSBzb3VyY2VUYWJsZTtcbiAgICB0aGlzLnJlZmVyZW5jZWRUYWJsZSA9IHJlZmVyZW5jZWRUYWJsZTtcbiAgICB0aGlzLnJlbGF0aW9uTmFtZSA9IHJlbGF0aW9uTmFtZTtcbiAgICB0aGlzLnJlZmVyZW5jZWRUYWJsZU5hbWUgPSByZWZlcmVuY2VkVGFibGVbVGFibGUuU3ltYm9sLk5hbWVdO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlJlbGF0aW9uXCI7XG4gIHJlZmVyZW5jZWRUYWJsZU5hbWU7XG4gIGZpZWxkTmFtZTtcbn1cbmNsYXNzIFJlbGF0aW9ucyB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUmVsYXRpb25zXCI7XG59XG5jbGFzcyBPbmUgZXh0ZW5kcyBSZWxhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZVRhYmxlLCByZWZlcmVuY2VkVGFibGUsIGNvbmZpZywgaXNOdWxsYWJsZSkge1xuICAgIHN1cGVyKHNvdXJjZVRhYmxlLCByZWZlcmVuY2VkVGFibGUsIGNvbmZpZz8ucmVsYXRpb25OYW1lKTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmlzTnVsbGFibGUgPSBpc051bGxhYmxlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIk9uZVwiO1xuICB3aXRoRmllbGROYW1lKGZpZWxkTmFtZSkge1xuICAgIGNvbnN0IHJlbGF0aW9uID0gbmV3IE9uZShcbiAgICAgIHRoaXMuc291cmNlVGFibGUsXG4gICAgICB0aGlzLnJlZmVyZW5jZWRUYWJsZSxcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgdGhpcy5pc051bGxhYmxlXG4gICAgKTtcbiAgICByZWxhdGlvbi5maWVsZE5hbWUgPSBmaWVsZE5hbWU7XG4gICAgcmV0dXJuIHJlbGF0aW9uO1xuICB9XG59XG5jbGFzcyBNYW55IGV4dGVuZHMgUmVsYXRpb24ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2VUYWJsZSwgcmVmZXJlbmNlZFRhYmxlLCBjb25maWcpIHtcbiAgICBzdXBlcihzb3VyY2VUYWJsZSwgcmVmZXJlbmNlZFRhYmxlLCBjb25maWc/LnJlbGF0aW9uTmFtZSk7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiTWFueVwiO1xuICB3aXRoRmllbGROYW1lKGZpZWxkTmFtZSkge1xuICAgIGNvbnN0IHJlbGF0aW9uID0gbmV3IE1hbnkoXG4gICAgICB0aGlzLnNvdXJjZVRhYmxlLFxuICAgICAgdGhpcy5yZWZlcmVuY2VkVGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gICAgcmVsYXRpb24uZmllbGROYW1lID0gZmllbGROYW1lO1xuICAgIHJldHVybiByZWxhdGlvbjtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0T3BlcmF0b3JzKCkge1xuICByZXR1cm4ge1xuICAgIGFuZCxcbiAgICBiZXR3ZWVuLFxuICAgIGVxLFxuICAgIGV4aXN0cyxcbiAgICBndCxcbiAgICBndGUsXG4gICAgaWxpa2UsXG4gICAgaW5BcnJheSxcbiAgICBpc051bGwsXG4gICAgaXNOb3ROdWxsLFxuICAgIGxpa2UsXG4gICAgbHQsXG4gICAgbHRlLFxuICAgIG5lLFxuICAgIG5vdCxcbiAgICBub3RCZXR3ZWVuLFxuICAgIG5vdEV4aXN0cyxcbiAgICBub3RMaWtlLFxuICAgIG5vdElsaWtlLFxuICAgIG5vdEluQXJyYXksXG4gICAgb3IsXG4gICAgc3FsXG4gIH07XG59XG5mdW5jdGlvbiBnZXRPcmRlckJ5T3BlcmF0b3JzKCkge1xuICByZXR1cm4ge1xuICAgIHNxbCxcbiAgICBhc2MsXG4gICAgZGVzY1xuICB9O1xufVxuZnVuY3Rpb24gZXh0cmFjdFRhYmxlc1JlbGF0aW9uYWxDb25maWcoc2NoZW1hLCBjb25maWdIZWxwZXJzKSB7XG4gIGlmIChPYmplY3Qua2V5cyhzY2hlbWEpLmxlbmd0aCA9PT0gMSAmJiBcImRlZmF1bHRcIiBpbiBzY2hlbWEgJiYgIWlzKHNjaGVtYVtcImRlZmF1bHRcIl0sIFRhYmxlKSkge1xuICAgIHNjaGVtYSA9IHNjaGVtYVtcImRlZmF1bHRcIl07XG4gIH1cbiAgY29uc3QgdGFibGVOYW1lc01hcCA9IHt9O1xuICBjb25zdCByZWxhdGlvbnNCdWZmZXIgPSB7fTtcbiAgY29uc3QgdGFibGVzQ29uZmlnID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYSkpIHtcbiAgICBpZiAoaXModmFsdWUsIFRhYmxlKSkge1xuICAgICAgY29uc3QgZGJOYW1lID0gZ2V0VGFibGVVbmlxdWVOYW1lKHZhbHVlKTtcbiAgICAgIGNvbnN0IGJ1ZmZlcmVkUmVsYXRpb25zID0gcmVsYXRpb25zQnVmZmVyW2RiTmFtZV07XG4gICAgICB0YWJsZU5hbWVzTWFwW2RiTmFtZV0gPSBrZXk7XG4gICAgICB0YWJsZXNDb25maWdba2V5XSA9IHtcbiAgICAgICAgdHNOYW1lOiBrZXksXG4gICAgICAgIGRiTmFtZTogdmFsdWVbVGFibGUuU3ltYm9sLk5hbWVdLFxuICAgICAgICBzY2hlbWE6IHZhbHVlW1RhYmxlLlN5bWJvbC5TY2hlbWFdLFxuICAgICAgICBjb2x1bW5zOiB2YWx1ZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10sXG4gICAgICAgIHJlbGF0aW9uczogYnVmZmVyZWRSZWxhdGlvbnM/LnJlbGF0aW9ucyA/PyB7fSxcbiAgICAgICAgcHJpbWFyeUtleTogYnVmZmVyZWRSZWxhdGlvbnM/LnByaW1hcnlLZXkgPz8gW11cbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBPYmplY3QudmFsdWVzKFxuICAgICAgICB2YWx1ZVtUYWJsZS5TeW1ib2wuQ29sdW1uc11cbiAgICAgICkpIHtcbiAgICAgICAgaWYgKGNvbHVtbi5wcmltYXJ5KSB7XG4gICAgICAgICAgdGFibGVzQ29uZmlnW2tleV0ucHJpbWFyeUtleS5wdXNoKGNvbHVtbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4dHJhQ29uZmlnID0gdmFsdWVbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQnVpbGRlcl0/Lih2YWx1ZVtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdDb2x1bW5zXSk7XG4gICAgICBpZiAoZXh0cmFDb25maWcpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb25maWdFbnRyeSBvZiBPYmplY3QudmFsdWVzKGV4dHJhQ29uZmlnKSkge1xuICAgICAgICAgIGlmIChpcyhjb25maWdFbnRyeSwgUHJpbWFyeUtleUJ1aWxkZXIpKSB7XG4gICAgICAgICAgICB0YWJsZXNDb25maWdba2V5XS5wcmltYXJ5S2V5LnB1c2goLi4uY29uZmlnRW50cnkuY29sdW1ucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpcyh2YWx1ZSwgUmVsYXRpb25zKSkge1xuICAgICAgY29uc3QgZGJOYW1lID0gZ2V0VGFibGVVbmlxdWVOYW1lKHZhbHVlLnRhYmxlKTtcbiAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRhYmxlTmFtZXNNYXBbZGJOYW1lXTtcbiAgICAgIGNvbnN0IHJlbGF0aW9uczIgPSB2YWx1ZS5jb25maWcoXG4gICAgICAgIGNvbmZpZ0hlbHBlcnModmFsdWUudGFibGUpXG4gICAgICApO1xuICAgICAgbGV0IHByaW1hcnlLZXk7XG4gICAgICBmb3IgKGNvbnN0IFtyZWxhdGlvbk5hbWUsIHJlbGF0aW9uXSBvZiBPYmplY3QuZW50cmllcyhyZWxhdGlvbnMyKSkge1xuICAgICAgICBpZiAodGFibGVOYW1lKSB7XG4gICAgICAgICAgY29uc3QgdGFibGVDb25maWcgPSB0YWJsZXNDb25maWdbdGFibGVOYW1lXTtcbiAgICAgICAgICB0YWJsZUNvbmZpZy5yZWxhdGlvbnNbcmVsYXRpb25OYW1lXSA9IHJlbGF0aW9uO1xuICAgICAgICAgIGlmIChwcmltYXJ5S2V5KSB7XG4gICAgICAgICAgICB0YWJsZUNvbmZpZy5wcmltYXJ5S2V5LnB1c2goLi4ucHJpbWFyeUtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghKGRiTmFtZSBpbiByZWxhdGlvbnNCdWZmZXIpKSB7XG4gICAgICAgICAgICByZWxhdGlvbnNCdWZmZXJbZGJOYW1lXSA9IHtcbiAgICAgICAgICAgICAgcmVsYXRpb25zOiB7fSxcbiAgICAgICAgICAgICAgcHJpbWFyeUtleVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVsYXRpb25zQnVmZmVyW2RiTmFtZV0ucmVsYXRpb25zW3JlbGF0aW9uTmFtZV0gPSByZWxhdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyB0YWJsZXM6IHRhYmxlc0NvbmZpZywgdGFibGVOYW1lc01hcCB9O1xufVxuZnVuY3Rpb24gcmVsYXRpb25zKHRhYmxlLCByZWxhdGlvbnMyKSB7XG4gIHJldHVybiBuZXcgUmVsYXRpb25zKFxuICAgIHRhYmxlLFxuICAgIChoZWxwZXJzKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhyZWxhdGlvbnMyKGhlbHBlcnMpKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW1xuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlLndpdGhGaWVsZE5hbWUoa2V5KVxuICAgICAgXSlcbiAgICApXG4gICk7XG59XG5mdW5jdGlvbiBjcmVhdGVPbmUoc291cmNlVGFibGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG9uZSh0YWJsZSwgY29uZmlnKSB7XG4gICAgcmV0dXJuIG5ldyBPbmUoXG4gICAgICBzb3VyY2VUYWJsZSxcbiAgICAgIHRhYmxlLFxuICAgICAgY29uZmlnLFxuICAgICAgY29uZmlnPy5maWVsZHMucmVkdWNlKChyZXMsIGYpID0+IHJlcyAmJiBmLm5vdE51bGwsIHRydWUpID8/IGZhbHNlXG4gICAgKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZU1hbnkoc291cmNlVGFibGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG1hbnkocmVmZXJlbmNlZFRhYmxlLCBjb25maWcpIHtcbiAgICByZXR1cm4gbmV3IE1hbnkoc291cmNlVGFibGUsIHJlZmVyZW5jZWRUYWJsZSwgY29uZmlnKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlbGF0aW9uKHNjaGVtYSwgdGFibGVOYW1lc01hcCwgcmVsYXRpb24pIHtcbiAgaWYgKGlzKHJlbGF0aW9uLCBPbmUpICYmIHJlbGF0aW9uLmNvbmZpZykge1xuICAgIHJldHVybiB7XG4gICAgICBmaWVsZHM6IHJlbGF0aW9uLmNvbmZpZy5maWVsZHMsXG4gICAgICByZWZlcmVuY2VzOiByZWxhdGlvbi5jb25maWcucmVmZXJlbmNlc1xuICAgIH07XG4gIH1cbiAgY29uc3QgcmVmZXJlbmNlZFRhYmxlVHNOYW1lID0gdGFibGVOYW1lc01hcFtnZXRUYWJsZVVuaXF1ZU5hbWUocmVsYXRpb24ucmVmZXJlbmNlZFRhYmxlKV07XG4gIGlmICghcmVmZXJlbmNlZFRhYmxlVHNOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRhYmxlIFwiJHtyZWxhdGlvbi5yZWZlcmVuY2VkVGFibGVbVGFibGUuU3ltYm9sLk5hbWVdfVwiIG5vdCBmb3VuZCBpbiBzY2hlbWFgXG4gICAgKTtcbiAgfVxuICBjb25zdCByZWZlcmVuY2VkVGFibGVDb25maWcgPSBzY2hlbWFbcmVmZXJlbmNlZFRhYmxlVHNOYW1lXTtcbiAgaWYgKCFyZWZlcmVuY2VkVGFibGVDb25maWcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHtyZWZlcmVuY2VkVGFibGVUc05hbWV9XCIgbm90IGZvdW5kIGluIHNjaGVtYWApO1xuICB9XG4gIGNvbnN0IHNvdXJjZVRhYmxlID0gcmVsYXRpb24uc291cmNlVGFibGU7XG4gIGNvbnN0IHNvdXJjZVRhYmxlVHNOYW1lID0gdGFibGVOYW1lc01hcFtnZXRUYWJsZVVuaXF1ZU5hbWUoc291cmNlVGFibGUpXTtcbiAgaWYgKCFzb3VyY2VUYWJsZVRzTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUYWJsZSBcIiR7c291cmNlVGFibGVbVGFibGUuU3ltYm9sLk5hbWVdfVwiIG5vdCBmb3VuZCBpbiBzY2hlbWFgXG4gICAgKTtcbiAgfVxuICBjb25zdCByZXZlcnNlUmVsYXRpb25zID0gW107XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlZFRhYmxlUmVsYXRpb24gb2YgT2JqZWN0LnZhbHVlcyhcbiAgICByZWZlcmVuY2VkVGFibGVDb25maWcucmVsYXRpb25zXG4gICkpIHtcbiAgICBpZiAocmVsYXRpb24ucmVsYXRpb25OYW1lICYmIHJlbGF0aW9uICE9PSByZWZlcmVuY2VkVGFibGVSZWxhdGlvbiAmJiByZWZlcmVuY2VkVGFibGVSZWxhdGlvbi5yZWxhdGlvbk5hbWUgPT09IHJlbGF0aW9uLnJlbGF0aW9uTmFtZSB8fCAhcmVsYXRpb24ucmVsYXRpb25OYW1lICYmIHJlZmVyZW5jZWRUYWJsZVJlbGF0aW9uLnJlZmVyZW5jZWRUYWJsZSA9PT0gcmVsYXRpb24uc291cmNlVGFibGUpIHtcbiAgICAgIHJldmVyc2VSZWxhdGlvbnMucHVzaChyZWZlcmVuY2VkVGFibGVSZWxhdGlvbik7XG4gICAgfVxuICB9XG4gIGlmIChyZXZlcnNlUmVsYXRpb25zLmxlbmd0aCA+IDEpIHtcbiAgICB0aHJvdyByZWxhdGlvbi5yZWxhdGlvbk5hbWUgPyBuZXcgRXJyb3IoXG4gICAgICBgVGhlcmUgYXJlIG11bHRpcGxlIHJlbGF0aW9ucyB3aXRoIG5hbWUgXCIke3JlbGF0aW9uLnJlbGF0aW9uTmFtZX1cIiBpbiB0YWJsZSBcIiR7cmVmZXJlbmNlZFRhYmxlVHNOYW1lfVwiYFxuICAgICkgOiBuZXcgRXJyb3IoXG4gICAgICBgVGhlcmUgYXJlIG11bHRpcGxlIHJlbGF0aW9ucyBiZXR3ZWVuIFwiJHtyZWZlcmVuY2VkVGFibGVUc05hbWV9XCIgYW5kIFwiJHtyZWxhdGlvbi5zb3VyY2VUYWJsZVtUYWJsZS5TeW1ib2wuTmFtZV19XCIuIFBsZWFzZSBzcGVjaWZ5IHJlbGF0aW9uIG5hbWVgXG4gICAgKTtcbiAgfVxuICBpZiAocmV2ZXJzZVJlbGF0aW9uc1swXSAmJiBpcyhyZXZlcnNlUmVsYXRpb25zWzBdLCBPbmUpICYmIHJldmVyc2VSZWxhdGlvbnNbMF0uY29uZmlnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpZWxkczogcmV2ZXJzZVJlbGF0aW9uc1swXS5jb25maWcucmVmZXJlbmNlcyxcbiAgICAgIHJlZmVyZW5jZXM6IHJldmVyc2VSZWxhdGlvbnNbMF0uY29uZmlnLmZpZWxkc1xuICAgIH07XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBUaGVyZSBpcyBub3QgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGluZmVyIHJlbGF0aW9uIFwiJHtzb3VyY2VUYWJsZVRzTmFtZX0uJHtyZWxhdGlvbi5maWVsZE5hbWV9XCJgXG4gICk7XG59XG5mdW5jdGlvbiBjcmVhdGVUYWJsZVJlbGF0aW9uc0hlbHBlcnMoc291cmNlVGFibGUpIHtcbiAgcmV0dXJuIHtcbiAgICBvbmU6IGNyZWF0ZU9uZShzb3VyY2VUYWJsZSksXG4gICAgbWFueTogY3JlYXRlTWFueShzb3VyY2VUYWJsZSlcbiAgfTtcbn1cbmZ1bmN0aW9uIG1hcFJlbGF0aW9uYWxSb3codGFibGVzQ29uZmlnLCB0YWJsZUNvbmZpZywgcm93LCBidWlsZFF1ZXJ5UmVzdWx0U2VsZWN0aW9uLCBtYXBDb2x1bW5WYWx1ZSA9ICh2YWx1ZSkgPT4gdmFsdWUpIHtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGZvciAoY29uc3QgW1xuICAgIHNlbGVjdGlvbkl0ZW1JbmRleCxcbiAgICBzZWxlY3Rpb25JdGVtXG4gIF0gb2YgYnVpbGRRdWVyeVJlc3VsdFNlbGVjdGlvbi5lbnRyaWVzKCkpIHtcbiAgICBpZiAoc2VsZWN0aW9uSXRlbS5pc0pzb24pIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uID0gdGFibGVDb25maWcucmVsYXRpb25zW3NlbGVjdGlvbkl0ZW0udHNLZXldO1xuICAgICAgY29uc3QgcmF3U3ViUm93cyA9IHJvd1tzZWxlY3Rpb25JdGVtSW5kZXhdO1xuICAgICAgY29uc3Qgc3ViUm93cyA9IHR5cGVvZiByYXdTdWJSb3dzID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShyYXdTdWJSb3dzKSA6IHJhd1N1YlJvd3M7XG4gICAgICByZXN1bHRbc2VsZWN0aW9uSXRlbS50c0tleV0gPSBpcyhyZWxhdGlvbiwgT25lKSA/IHN1YlJvd3MgJiYgbWFwUmVsYXRpb25hbFJvdyhcbiAgICAgICAgdGFibGVzQ29uZmlnLFxuICAgICAgICB0YWJsZXNDb25maWdbc2VsZWN0aW9uSXRlbS5yZWxhdGlvblRhYmxlVHNLZXldLFxuICAgICAgICBzdWJSb3dzLFxuICAgICAgICBzZWxlY3Rpb25JdGVtLnNlbGVjdGlvbixcbiAgICAgICAgbWFwQ29sdW1uVmFsdWVcbiAgICAgICkgOiBzdWJSb3dzLm1hcChcbiAgICAgICAgKHN1YlJvdykgPT4gbWFwUmVsYXRpb25hbFJvdyhcbiAgICAgICAgICB0YWJsZXNDb25maWcsXG4gICAgICAgICAgdGFibGVzQ29uZmlnW3NlbGVjdGlvbkl0ZW0ucmVsYXRpb25UYWJsZVRzS2V5XSxcbiAgICAgICAgICBzdWJSb3csXG4gICAgICAgICAgc2VsZWN0aW9uSXRlbS5zZWxlY3Rpb24sXG4gICAgICAgICAgbWFwQ29sdW1uVmFsdWVcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdmFsdWUgPSBtYXBDb2x1bW5WYWx1ZShyb3dbc2VsZWN0aW9uSXRlbUluZGV4XSk7XG4gICAgICBjb25zdCBmaWVsZCA9IHNlbGVjdGlvbkl0ZW0uZmllbGQ7XG4gICAgICBsZXQgZGVjb2RlcjtcbiAgICAgIGlmIChpcyhmaWVsZCwgQ29sdW1uKSkge1xuICAgICAgICBkZWNvZGVyID0gZmllbGQ7XG4gICAgICB9IGVsc2UgaWYgKGlzKGZpZWxkLCBTUUwpKSB7XG4gICAgICAgIGRlY29kZXIgPSBmaWVsZC5kZWNvZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb2RlciA9IGZpZWxkLnNxbC5kZWNvZGVyO1xuICAgICAgfVxuICAgICAgcmVzdWx0W3NlbGVjdGlvbkl0ZW0udHNLZXldID0gdmFsdWUgPT09IG51bGwgPyBudWxsIDogZGVjb2Rlci5tYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IHtcbiAgTWFueSxcbiAgT25lLFxuICBSZWxhdGlvbixcbiAgUmVsYXRpb25zLFxuICBjcmVhdGVNYW55LFxuICBjcmVhdGVPbmUsXG4gIGNyZWF0ZVRhYmxlUmVsYXRpb25zSGVscGVycyxcbiAgZXh0cmFjdFRhYmxlc1JlbGF0aW9uYWxDb25maWcsXG4gIGdldE9wZXJhdG9ycyxcbiAgZ2V0T3JkZXJCeU9wZXJhdG9ycyxcbiAgbWFwUmVsYXRpb25hbFJvdyxcbiAgbm9ybWFsaXplUmVsYXRpb24sXG4gIHJlbGF0aW9uc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlbGF0aW9ucy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBWaWV3IH0gZnJvbSBcIi4uL3NxbC9zcWwuanNcIjtcbmNsYXNzIFNRTGl0ZVZpZXdCYXNlIGV4dGVuZHMgVmlldyB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVZpZXdCYXNlXCI7XG59XG5leHBvcnQge1xuICBTUUxpdGVWaWV3QmFzZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZpZXctYmFzZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGFsaWFzZWRUYWJsZSwgYWxpYXNlZFRhYmxlQ29sdW1uLCBtYXBDb2x1bW5zSW5BbGlhc2VkU1FMVG9BbGlhcywgbWFwQ29sdW1uc0luU1FMVG9BbGlhcyB9IGZyb20gXCIuLi9hbGlhcy5qc1wiO1xuaW1wb3J0IHsgQ2FzaW5nQ2FjaGUgfSBmcm9tIFwiLi4vY2FzaW5nLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IERyaXp6bGVFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMuanNcIjtcbmltcG9ydCB7XG4gIGdldE9wZXJhdG9ycyxcbiAgZ2V0T3JkZXJCeU9wZXJhdG9ycyxcbiAgTWFueSxcbiAgbm9ybWFsaXplUmVsYXRpb24sXG4gIE9uZVxufSBmcm9tIFwiLi4vcmVsYXRpb25zLmpzXCI7XG5pbXBvcnQgeyBhbmQsIGVxIH0gZnJvbSBcIi4uL3NxbC9pbmRleC5qc1wiO1xuaW1wb3J0IHsgUGFyYW0sIFNRTCwgc3FsIH0gZnJvbSBcIi4uL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiB9IGZyb20gXCIuL2NvbHVtbnMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNRTGl0ZVRhYmxlIH0gZnJvbSBcIi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBnZXRUYWJsZU5hbWUsIGdldFRhYmxlVW5pcXVlTmFtZSwgVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IG9yZGVyU2VsZWN0ZWRGaWVsZHMgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4uL3ZpZXctY29tbW9uLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVWaWV3QmFzZSB9IGZyb20gXCIuL3ZpZXctYmFzZS5qc1wiO1xuY2xhc3MgU1FMaXRlRGlhbGVjdCB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZURpYWxlY3RcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjYXNpbmc7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHRoaXMuY2FzaW5nID0gbmV3IENhc2luZ0NhY2hlKGNvbmZpZz8uY2FzaW5nKTtcbiAgfVxuICBlc2NhcGVOYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gYFwiJHtuYW1lfVwiYDtcbiAgfVxuICBlc2NhcGVQYXJhbShfbnVtKSB7XG4gICAgcmV0dXJuIFwiP1wiO1xuICB9XG4gIGVzY2FwZVN0cmluZyhzdHIpIHtcbiAgICByZXR1cm4gYCcke3N0ci5yZXBsYWNlKC8nL2csIFwiJydcIil9J2A7XG4gIH1cbiAgYnVpbGRXaXRoQ1RFKHF1ZXJpZXMpIHtcbiAgICBpZiAoIXF1ZXJpZXM/Lmxlbmd0aCkgcmV0dXJuIHZvaWQgMDtcbiAgICBjb25zdCB3aXRoU3FsQ2h1bmtzID0gW3NxbGB3aXRoIGBdO1xuICAgIGZvciAoY29uc3QgW2ksIHddIG9mIHF1ZXJpZXMuZW50cmllcygpKSB7XG4gICAgICB3aXRoU3FsQ2h1bmtzLnB1c2goc3FsYCR7c3FsLmlkZW50aWZpZXIody5fLmFsaWFzKX0gYXMgKCR7dy5fLnNxbH0pYCk7XG4gICAgICBpZiAoaSA8IHF1ZXJpZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICB3aXRoU3FsQ2h1bmtzLnB1c2goc3FsYCwgYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHdpdGhTcWxDaHVua3MucHVzaChzcWxgIGApO1xuICAgIHJldHVybiBzcWwuam9pbih3aXRoU3FsQ2h1bmtzKTtcbiAgfVxuICBidWlsZERlbGV0ZVF1ZXJ5KHsgdGFibGUsIHdoZXJlLCByZXR1cm5pbmcsIHdpdGhMaXN0LCBsaW1pdCwgb3JkZXJCeSB9KSB7XG4gICAgY29uc3Qgd2l0aFNxbCA9IHRoaXMuYnVpbGRXaXRoQ1RFKHdpdGhMaXN0KTtcbiAgICBjb25zdCByZXR1cm5pbmdTcWwgPSByZXR1cm5pbmcgPyBzcWxgIHJldHVybmluZyAke3RoaXMuYnVpbGRTZWxlY3Rpb24ocmV0dXJuaW5nLCB7IGlzU2luZ2xlVGFibGU6IHRydWUgfSl9YCA6IHZvaWQgMDtcbiAgICBjb25zdCB3aGVyZVNxbCA9IHdoZXJlID8gc3FsYCB3aGVyZSAke3doZXJlfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgb3JkZXJCeVNxbCA9IHRoaXMuYnVpbGRPcmRlckJ5KG9yZGVyQnkpO1xuICAgIGNvbnN0IGxpbWl0U3FsID0gdGhpcy5idWlsZExpbWl0KGxpbWl0KTtcbiAgICByZXR1cm4gc3FsYCR7d2l0aFNxbH1kZWxldGUgZnJvbSAke3RhYmxlfSR7d2hlcmVTcWx9JHtyZXR1cm5pbmdTcWx9JHtvcmRlckJ5U3FsfSR7bGltaXRTcWx9YDtcbiAgfVxuICBidWlsZFVwZGF0ZVNldCh0YWJsZSwgc2V0KSB7XG4gICAgY29uc3QgdGFibGVDb2x1bW5zID0gdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xuICAgIGNvbnN0IGNvbHVtbk5hbWVzID0gT2JqZWN0LmtleXModGFibGVDb2x1bW5zKS5maWx0ZXIoXG4gICAgICAoY29sTmFtZSkgPT4gc2V0W2NvbE5hbWVdICE9PSB2b2lkIDAgfHwgdGFibGVDb2x1bW5zW2NvbE5hbWVdPy5vblVwZGF0ZUZuICE9PSB2b2lkIDBcbiAgICApO1xuICAgIGNvbnN0IHNldFNpemUgPSBjb2x1bW5OYW1lcy5sZW5ndGg7XG4gICAgcmV0dXJuIHNxbC5qb2luKGNvbHVtbk5hbWVzLmZsYXRNYXAoKGNvbE5hbWUsIGkpID0+IHtcbiAgICAgIGNvbnN0IGNvbCA9IHRhYmxlQ29sdW1uc1tjb2xOYW1lXTtcbiAgICAgIGNvbnN0IHZhbHVlID0gc2V0W2NvbE5hbWVdID8/IHNxbC5wYXJhbShjb2wub25VcGRhdGVGbigpLCBjb2wpO1xuICAgICAgY29uc3QgcmVzID0gc3FsYCR7c3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGNvbCkpfSA9ICR7dmFsdWV9YDtcbiAgICAgIGlmIChpIDwgc2V0U2l6ZSAtIDEpIHtcbiAgICAgICAgcmV0dXJuIFtyZXMsIHNxbC5yYXcoXCIsIFwiKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gW3Jlc107XG4gICAgfSkpO1xuICB9XG4gIGJ1aWxkVXBkYXRlUXVlcnkoeyB0YWJsZSwgc2V0LCB3aGVyZSwgcmV0dXJuaW5nLCB3aXRoTGlzdCwgam9pbnMsIGZyb20sIGxpbWl0LCBvcmRlckJ5IH0pIHtcbiAgICBjb25zdCB3aXRoU3FsID0gdGhpcy5idWlsZFdpdGhDVEUod2l0aExpc3QpO1xuICAgIGNvbnN0IHNldFNxbCA9IHRoaXMuYnVpbGRVcGRhdGVTZXQodGFibGUsIHNldCk7XG4gICAgY29uc3QgZnJvbVNxbCA9IGZyb20gJiYgc3FsLmpvaW4oW3NxbC5yYXcoXCIgZnJvbSBcIiksIHRoaXMuYnVpbGRGcm9tVGFibGUoZnJvbSldKTtcbiAgICBjb25zdCBqb2luc1NxbCA9IHRoaXMuYnVpbGRKb2lucyhqb2lucyk7XG4gICAgY29uc3QgcmV0dXJuaW5nU3FsID0gcmV0dXJuaW5nID8gc3FsYCByZXR1cm5pbmcgJHt0aGlzLmJ1aWxkU2VsZWN0aW9uKHJldHVybmluZywgeyBpc1NpbmdsZVRhYmxlOiB0cnVlIH0pfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgd2hlcmVTcWwgPSB3aGVyZSA/IHNxbGAgd2hlcmUgJHt3aGVyZX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IG9yZGVyQnlTcWwgPSB0aGlzLmJ1aWxkT3JkZXJCeShvcmRlckJ5KTtcbiAgICBjb25zdCBsaW1pdFNxbCA9IHRoaXMuYnVpbGRMaW1pdChsaW1pdCk7XG4gICAgcmV0dXJuIHNxbGAke3dpdGhTcWx9dXBkYXRlICR7dGFibGV9IHNldCAke3NldFNxbH0ke2Zyb21TcWx9JHtqb2luc1NxbH0ke3doZXJlU3FsfSR7cmV0dXJuaW5nU3FsfSR7b3JkZXJCeVNxbH0ke2xpbWl0U3FsfWA7XG4gIH1cbiAgLyoqXG4gICAqIEJ1aWxkcyBzZWxlY3Rpb24gU1FMIHdpdGggcHJvdmlkZWQgZmllbGRzL2V4cHJlc3Npb25zXG4gICAqXG4gICAqIEV4YW1wbGVzOlxuICAgKlxuICAgKiBgc2VsZWN0IDxzZWxlY3Rpb24+IGZyb21gXG4gICAqXG4gICAqIGBpbnNlcnQgLi4uIHJldHVybmluZyA8c2VsZWN0aW9uPmBcbiAgICpcbiAgICogSWYgYGlzU2luZ2xlVGFibGVgIGlzIHRydWUsIHRoZW4gY29sdW1ucyB3b24ndCBiZSBwcmVmaXhlZCB3aXRoIHRhYmxlIG5hbWVcbiAgICovXG4gIGJ1aWxkU2VsZWN0aW9uKGZpZWxkcywgeyBpc1NpbmdsZVRhYmxlID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgY29uc3QgY29sdW1uc0xlbiA9IGZpZWxkcy5sZW5ndGg7XG4gICAgY29uc3QgY2h1bmtzID0gZmllbGRzLmZsYXRNYXAoKHsgZmllbGQgfSwgaSkgPT4ge1xuICAgICAgY29uc3QgY2h1bmsgPSBbXTtcbiAgICAgIGlmIChpcyhmaWVsZCwgU1FMLkFsaWFzZWQpICYmIGZpZWxkLmlzU2VsZWN0aW9uRmllbGQpIHtcbiAgICAgICAgY2h1bmsucHVzaChzcWwuaWRlbnRpZmllcihmaWVsZC5maWVsZEFsaWFzKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzKGZpZWxkLCBTUUwuQWxpYXNlZCkgfHwgaXMoZmllbGQsIFNRTCkpIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpcyhmaWVsZCwgU1FMLkFsaWFzZWQpID8gZmllbGQuc3FsIDogZmllbGQ7XG4gICAgICAgIGlmIChpc1NpbmdsZVRhYmxlKSB7XG4gICAgICAgICAgY2h1bmsucHVzaChcbiAgICAgICAgICAgIG5ldyBTUUwoXG4gICAgICAgICAgICAgIHF1ZXJ5LnF1ZXJ5Q2h1bmtzLm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpcyhjLCBDb2x1bW4pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gc3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaHVuay5wdXNoKHF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXMoZmllbGQsIFNRTC5BbGlhc2VkKSkge1xuICAgICAgICAgIGNodW5rLnB1c2goc3FsYCBhcyAke3NxbC5pZGVudGlmaWVyKGZpZWxkLmZpZWxkQWxpYXMpfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzKGZpZWxkLCBDb2x1bW4pKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGZpZWxkLnRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXTtcbiAgICAgICAgaWYgKGZpZWxkLmNvbHVtblR5cGUgPT09IFwiU1FMaXRlTnVtZXJpY0JpZ0ludFwiKSB7XG4gICAgICAgICAgaWYgKGlzU2luZ2xlVGFibGUpIHtcbiAgICAgICAgICAgIGNodW5rLnB1c2goc3FsYGNhc3QoJHtzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoZmllbGQpKX0gYXMgdGV4dClgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2h1bmsucHVzaChcbiAgICAgICAgICAgICAgc3FsYGNhc3QoJHtzcWwuaWRlbnRpZmllcih0YWJsZU5hbWUpfS4ke3NxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhmaWVsZCkpfSBhcyB0ZXh0KWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpc1NpbmdsZVRhYmxlKSB7XG4gICAgICAgICAgICBjaHVuay5wdXNoKHNxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhmaWVsZCkpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2h1bmsucHVzaChzcWxgJHtzcWwuaWRlbnRpZmllcih0YWJsZU5hbWUpfS4ke3NxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhmaWVsZCkpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPCBjb2x1bW5zTGVuIC0gMSkge1xuICAgICAgICBjaHVuay5wdXNoKHNxbGAsIGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNodW5rO1xuICAgIH0pO1xuICAgIHJldHVybiBzcWwuam9pbihjaHVua3MpO1xuICB9XG4gIGJ1aWxkSm9pbnMoam9pbnMpIHtcbiAgICBpZiAoIWpvaW5zIHx8IGpvaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG4gICAgY29uc3Qgam9pbnNBcnJheSA9IFtdO1xuICAgIGlmIChqb2lucykge1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGpvaW5NZXRhXSBvZiBqb2lucy5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgam9pbnNBcnJheS5wdXNoKHNxbGAgYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFibGUgPSBqb2luTWV0YS50YWJsZTtcbiAgICAgICAgY29uc3Qgb25TcWwgPSBqb2luTWV0YS5vbiA/IHNxbGAgb24gJHtqb2luTWV0YS5vbn1gIDogdm9pZCAwO1xuICAgICAgICBpZiAoaXModGFibGUsIFNRTGl0ZVRhYmxlKSkge1xuICAgICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5OYW1lXTtcbiAgICAgICAgICBjb25zdCB0YWJsZVNjaGVtYSA9IHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5TY2hlbWFdO1xuICAgICAgICAgIGNvbnN0IG9yaWdUYWJsZU5hbWUgPSB0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuT3JpZ2luYWxOYW1lXTtcbiAgICAgICAgICBjb25zdCBhbGlhcyA9IHRhYmxlTmFtZSA9PT0gb3JpZ1RhYmxlTmFtZSA/IHZvaWQgMCA6IGpvaW5NZXRhLmFsaWFzO1xuICAgICAgICAgIGpvaW5zQXJyYXkucHVzaChcbiAgICAgICAgICAgIHNxbGAke3NxbC5yYXcoam9pbk1ldGEuam9pblR5cGUpfSBqb2luICR7dGFibGVTY2hlbWEgPyBzcWxgJHtzcWwuaWRlbnRpZmllcih0YWJsZVNjaGVtYSl9LmAgOiB2b2lkIDB9JHtzcWwuaWRlbnRpZmllcihvcmlnVGFibGVOYW1lKX0ke2FsaWFzICYmIHNxbGAgJHtzcWwuaWRlbnRpZmllcihhbGlhcyl9YH0ke29uU3FsfWBcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpvaW5zQXJyYXkucHVzaChcbiAgICAgICAgICAgIHNxbGAke3NxbC5yYXcoam9pbk1ldGEuam9pblR5cGUpfSBqb2luICR7dGFibGV9JHtvblNxbH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggPCBqb2lucy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgam9pbnNBcnJheS5wdXNoKHNxbGAgYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNxbC5qb2luKGpvaW5zQXJyYXkpO1xuICB9XG4gIGJ1aWxkTGltaXQobGltaXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIGxpbWl0ID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBsaW1pdCA9PT0gXCJudW1iZXJcIiAmJiBsaW1pdCA+PSAwID8gc3FsYCBsaW1pdCAke2xpbWl0fWAgOiB2b2lkIDA7XG4gIH1cbiAgYnVpbGRPcmRlckJ5KG9yZGVyQnkpIHtcbiAgICBjb25zdCBvcmRlckJ5TGlzdCA9IFtdO1xuICAgIGlmIChvcmRlckJ5KSB7XG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgb3JkZXJCeVZhbHVlXSBvZiBvcmRlckJ5LmVudHJpZXMoKSkge1xuICAgICAgICBvcmRlckJ5TGlzdC5wdXNoKG9yZGVyQnlWYWx1ZSk7XG4gICAgICAgIGlmIChpbmRleCA8IG9yZGVyQnkubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIG9yZGVyQnlMaXN0LnB1c2goc3FsYCwgYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9yZGVyQnlMaXN0Lmxlbmd0aCA+IDAgPyBzcWxgIG9yZGVyIGJ5ICR7c3FsLmpvaW4ob3JkZXJCeUxpc3QpfWAgOiB2b2lkIDA7XG4gIH1cbiAgYnVpbGRGcm9tVGFibGUodGFibGUpIHtcbiAgICBpZiAoaXModGFibGUsIFRhYmxlKSAmJiB0YWJsZVtUYWJsZS5TeW1ib2wuSXNBbGlhc10pIHtcbiAgICAgIHJldHVybiBzcWxgJHtzcWxgJHtzcWwuaWRlbnRpZmllcih0YWJsZVtUYWJsZS5TeW1ib2wuU2NoZW1hXSA/PyBcIlwiKX0uYC5pZih0YWJsZVtUYWJsZS5TeW1ib2wuU2NoZW1hXSl9JHtzcWwuaWRlbnRpZmllcih0YWJsZVtUYWJsZS5TeW1ib2wuT3JpZ2luYWxOYW1lXSl9ICR7c3FsLmlkZW50aWZpZXIodGFibGVbVGFibGUuU3ltYm9sLk5hbWVdKX1gO1xuICAgIH1cbiAgICByZXR1cm4gdGFibGU7XG4gIH1cbiAgYnVpbGRTZWxlY3RRdWVyeSh7XG4gICAgd2l0aExpc3QsXG4gICAgZmllbGRzLFxuICAgIGZpZWxkc0ZsYXQsXG4gICAgd2hlcmUsXG4gICAgaGF2aW5nLFxuICAgIHRhYmxlLFxuICAgIGpvaW5zLFxuICAgIG9yZGVyQnksXG4gICAgZ3JvdXBCeSxcbiAgICBsaW1pdCxcbiAgICBvZmZzZXQsXG4gICAgZGlzdGluY3QsXG4gICAgc2V0T3BlcmF0b3JzXG4gIH0pIHtcbiAgICBjb25zdCBmaWVsZHNMaXN0ID0gZmllbGRzRmxhdCA/PyBvcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkcyk7XG4gICAgZm9yIChjb25zdCBmIG9mIGZpZWxkc0xpc3QpIHtcbiAgICAgIGlmIChpcyhmLmZpZWxkLCBDb2x1bW4pICYmIGdldFRhYmxlTmFtZShmLmZpZWxkLnRhYmxlKSAhPT0gKGlzKHRhYmxlLCBTdWJxdWVyeSkgPyB0YWJsZS5fLmFsaWFzIDogaXModGFibGUsIFNRTGl0ZVZpZXdCYXNlKSA/IHRhYmxlW1ZpZXdCYXNlQ29uZmlnXS5uYW1lIDogaXModGFibGUsIFNRTCkgPyB2b2lkIDAgOiBnZXRUYWJsZU5hbWUodGFibGUpKSAmJiAhKCh0YWJsZTIpID0+IGpvaW5zPy5zb21lKFxuICAgICAgICAoeyBhbGlhcyB9KSA9PiBhbGlhcyA9PT0gKHRhYmxlMltUYWJsZS5TeW1ib2wuSXNBbGlhc10gPyBnZXRUYWJsZU5hbWUodGFibGUyKSA6IHRhYmxlMltUYWJsZS5TeW1ib2wuQmFzZU5hbWVdKVxuICAgICAgKSkoZi5maWVsZC50YWJsZSkpIHtcbiAgICAgICAgY29uc3QgdGFibGVOYW1lID0gZ2V0VGFibGVOYW1lKGYuZmllbGQudGFibGUpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFlvdXIgXCIke2YucGF0aC5qb2luKFwiLT5cIil9XCIgZmllbGQgcmVmZXJlbmNlcyBhIGNvbHVtbiBcIiR7dGFibGVOYW1lfVwiLlwiJHtmLmZpZWxkLm5hbWV9XCIsIGJ1dCB0aGUgdGFibGUgXCIke3RhYmxlTmFtZX1cIiBpcyBub3QgcGFydCBvZiB0aGUgcXVlcnkhIERpZCB5b3UgZm9yZ2V0IHRvIGpvaW4gaXQ/YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpc1NpbmdsZVRhYmxlID0gIWpvaW5zIHx8IGpvaW5zLmxlbmd0aCA9PT0gMDtcbiAgICBjb25zdCB3aXRoU3FsID0gdGhpcy5idWlsZFdpdGhDVEUod2l0aExpc3QpO1xuICAgIGNvbnN0IGRpc3RpbmN0U3FsID0gZGlzdGluY3QgPyBzcWxgIGRpc3RpbmN0YCA6IHZvaWQgMDtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmJ1aWxkU2VsZWN0aW9uKGZpZWxkc0xpc3QsIHsgaXNTaW5nbGVUYWJsZSB9KTtcbiAgICBjb25zdCB0YWJsZVNxbCA9IHRoaXMuYnVpbGRGcm9tVGFibGUodGFibGUpO1xuICAgIGNvbnN0IGpvaW5zU3FsID0gdGhpcy5idWlsZEpvaW5zKGpvaW5zKTtcbiAgICBjb25zdCB3aGVyZVNxbCA9IHdoZXJlID8gc3FsYCB3aGVyZSAke3doZXJlfWAgOiB2b2lkIDA7XG4gICAgY29uc3QgaGF2aW5nU3FsID0gaGF2aW5nID8gc3FsYCBoYXZpbmcgJHtoYXZpbmd9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBncm91cEJ5TGlzdCA9IFtdO1xuICAgIGlmIChncm91cEJ5KSB7XG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgZ3JvdXBCeVZhbHVlXSBvZiBncm91cEJ5LmVudHJpZXMoKSkge1xuICAgICAgICBncm91cEJ5TGlzdC5wdXNoKGdyb3VwQnlWYWx1ZSk7XG4gICAgICAgIGlmIChpbmRleCA8IGdyb3VwQnkubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGdyb3VwQnlMaXN0LnB1c2goc3FsYCwgYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZ3JvdXBCeVNxbCA9IGdyb3VwQnlMaXN0Lmxlbmd0aCA+IDAgPyBzcWxgIGdyb3VwIGJ5ICR7c3FsLmpvaW4oZ3JvdXBCeUxpc3QpfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgb3JkZXJCeVNxbCA9IHRoaXMuYnVpbGRPcmRlckJ5KG9yZGVyQnkpO1xuICAgIGNvbnN0IGxpbWl0U3FsID0gdGhpcy5idWlsZExpbWl0KGxpbWl0KTtcbiAgICBjb25zdCBvZmZzZXRTcWwgPSBvZmZzZXQgPyBzcWxgIG9mZnNldCAke29mZnNldH1gIDogdm9pZCAwO1xuICAgIGNvbnN0IGZpbmFsUXVlcnkgPSBzcWxgJHt3aXRoU3FsfXNlbGVjdCR7ZGlzdGluY3RTcWx9ICR7c2VsZWN0aW9ufSBmcm9tICR7dGFibGVTcWx9JHtqb2luc1NxbH0ke3doZXJlU3FsfSR7Z3JvdXBCeVNxbH0ke2hhdmluZ1NxbH0ke29yZGVyQnlTcWx9JHtsaW1pdFNxbH0ke29mZnNldFNxbH1gO1xuICAgIGlmIChzZXRPcGVyYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRTZXRPcGVyYXRpb25zKGZpbmFsUXVlcnksIHNldE9wZXJhdG9ycyk7XG4gICAgfVxuICAgIHJldHVybiBmaW5hbFF1ZXJ5O1xuICB9XG4gIGJ1aWxkU2V0T3BlcmF0aW9ucyhsZWZ0U2VsZWN0LCBzZXRPcGVyYXRvcnMpIHtcbiAgICBjb25zdCBbc2V0T3BlcmF0b3IsIC4uLnJlc3RdID0gc2V0T3BlcmF0b3JzO1xuICAgIGlmICghc2V0T3BlcmF0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBwYXNzIHVuZGVmaW5lZCB2YWx1ZXMgdG8gYW55IHNldCBvcGVyYXRvclwiKTtcbiAgICB9XG4gICAgaWYgKHJlc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZFNldE9wZXJhdGlvblF1ZXJ5KHsgbGVmdFNlbGVjdCwgc2V0T3BlcmF0b3IgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJ1aWxkU2V0T3BlcmF0aW9ucyhcbiAgICAgIHRoaXMuYnVpbGRTZXRPcGVyYXRpb25RdWVyeSh7IGxlZnRTZWxlY3QsIHNldE9wZXJhdG9yIH0pLFxuICAgICAgcmVzdFxuICAgICk7XG4gIH1cbiAgYnVpbGRTZXRPcGVyYXRpb25RdWVyeSh7XG4gICAgbGVmdFNlbGVjdCxcbiAgICBzZXRPcGVyYXRvcjogeyB0eXBlLCBpc0FsbCwgcmlnaHRTZWxlY3QsIGxpbWl0LCBvcmRlckJ5LCBvZmZzZXQgfVxuICB9KSB7XG4gICAgY29uc3QgbGVmdENodW5rID0gc3FsYCR7bGVmdFNlbGVjdC5nZXRTUUwoKX0gYDtcbiAgICBjb25zdCByaWdodENodW5rID0gc3FsYCR7cmlnaHRTZWxlY3QuZ2V0U1FMKCl9YDtcbiAgICBsZXQgb3JkZXJCeVNxbDtcbiAgICBpZiAob3JkZXJCeSAmJiBvcmRlckJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG9yZGVyQnlWYWx1ZXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3Qgc2luZ2xlT3JkZXJCeSBvZiBvcmRlckJ5KSB7XG4gICAgICAgIGlmIChpcyhzaW5nbGVPcmRlckJ5LCBTUUxpdGVDb2x1bW4pKSB7XG4gICAgICAgICAgb3JkZXJCeVZhbHVlcy5wdXNoKHNxbC5pZGVudGlmaWVyKHNpbmdsZU9yZGVyQnkubmFtZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzKHNpbmdsZU9yZGVyQnksIFNRTCkpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpbmdsZU9yZGVyQnkucXVlcnlDaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNodW5rID0gc2luZ2xlT3JkZXJCeS5xdWVyeUNodW5rc1tpXTtcbiAgICAgICAgICAgIGlmIChpcyhjaHVuaywgU1FMaXRlQ29sdW1uKSkge1xuICAgICAgICAgICAgICBzaW5nbGVPcmRlckJ5LnF1ZXJ5Q2h1bmtzW2ldID0gc3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGNodW5rKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG9yZGVyQnlWYWx1ZXMucHVzaChzcWxgJHtzaW5nbGVPcmRlckJ5fWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9yZGVyQnlWYWx1ZXMucHVzaChzcWxgJHtzaW5nbGVPcmRlckJ5fWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvcmRlckJ5U3FsID0gc3FsYCBvcmRlciBieSAke3NxbC5qb2luKG9yZGVyQnlWYWx1ZXMsIHNxbGAsIGApfWA7XG4gICAgfVxuICAgIGNvbnN0IGxpbWl0U3FsID0gdHlwZW9mIGxpbWl0ID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBsaW1pdCA9PT0gXCJudW1iZXJcIiAmJiBsaW1pdCA+PSAwID8gc3FsYCBsaW1pdCAke2xpbWl0fWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgb3BlcmF0b3JDaHVuayA9IHNxbC5yYXcoYCR7dHlwZX0gJHtpc0FsbCA/IFwiYWxsIFwiIDogXCJcIn1gKTtcbiAgICBjb25zdCBvZmZzZXRTcWwgPSBvZmZzZXQgPyBzcWxgIG9mZnNldCAke29mZnNldH1gIDogdm9pZCAwO1xuICAgIHJldHVybiBzcWxgJHtsZWZ0Q2h1bmt9JHtvcGVyYXRvckNodW5rfSR7cmlnaHRDaHVua30ke29yZGVyQnlTcWx9JHtsaW1pdFNxbH0ke29mZnNldFNxbH1gO1xuICB9XG4gIGJ1aWxkSW5zZXJ0UXVlcnkoeyB0YWJsZSwgdmFsdWVzOiB2YWx1ZXNPclNlbGVjdCwgb25Db25mbGljdCwgcmV0dXJuaW5nLCB3aXRoTGlzdCwgc2VsZWN0IH0pIHtcbiAgICBjb25zdCB2YWx1ZXNTcWxMaXN0ID0gW107XG4gICAgY29uc3QgY29sdW1ucyA9IHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXTtcbiAgICBjb25zdCBjb2xFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoY29sdW1ucykuZmlsdGVyKFxuICAgICAgKFtfLCBjb2xdKSA9PiAhY29sLnNob3VsZERpc2FibGVJbnNlcnQoKVxuICAgICk7XG4gICAgY29uc3QgaW5zZXJ0T3JkZXIgPSBjb2xFbnRyaWVzLm1hcCgoWywgY29sdW1uXSkgPT4gc3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGNvbHVtbikpKTtcbiAgICBpZiAoc2VsZWN0KSB7XG4gICAgICBjb25zdCBzZWxlY3QyID0gdmFsdWVzT3JTZWxlY3Q7XG4gICAgICBpZiAoaXMoc2VsZWN0MiwgU1FMKSkge1xuICAgICAgICB2YWx1ZXNTcWxMaXN0LnB1c2goc2VsZWN0Mik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXNTcWxMaXN0LnB1c2goc2VsZWN0Mi5nZXRTUUwoKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHZhbHVlc09yU2VsZWN0O1xuICAgICAgdmFsdWVzU3FsTGlzdC5wdXNoKHNxbC5yYXcoXCJ2YWx1ZXMgXCIpKTtcbiAgICAgIGZvciAoY29uc3QgW3ZhbHVlSW5kZXgsIHZhbHVlXSBvZiB2YWx1ZXMuZW50cmllcygpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlTGlzdCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIGNvbF0gb2YgY29sRW50cmllcykge1xuICAgICAgICAgIGNvbnN0IGNvbFZhbHVlID0gdmFsdWVbZmllbGROYW1lXTtcbiAgICAgICAgICBpZiAoY29sVmFsdWUgPT09IHZvaWQgMCB8fCBpcyhjb2xWYWx1ZSwgUGFyYW0pICYmIGNvbFZhbHVlLnZhbHVlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGxldCBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICBpZiAoY29sLmRlZmF1bHQgIT09IG51bGwgJiYgY29sLmRlZmF1bHQgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBpcyhjb2wuZGVmYXVsdCwgU1FMKSA/IGNvbC5kZWZhdWx0IDogc3FsLnBhcmFtKGNvbC5kZWZhdWx0LCBjb2wpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2wuZGVmYXVsdEZuICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdEZuUmVzdWx0ID0gY29sLmRlZmF1bHRGbigpO1xuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBpcyhkZWZhdWx0Rm5SZXN1bHQsIFNRTCkgPyBkZWZhdWx0Rm5SZXN1bHQgOiBzcWwucGFyYW0oZGVmYXVsdEZuUmVzdWx0LCBjb2wpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghY29sLmRlZmF1bHQgJiYgY29sLm9uVXBkYXRlRm4gIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICBjb25zdCBvblVwZGF0ZUZuUmVzdWx0ID0gY29sLm9uVXBkYXRlRm4oKTtcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gaXMob25VcGRhdGVGblJlc3VsdCwgU1FMKSA/IG9uVXBkYXRlRm5SZXN1bHQgOiBzcWwucGFyYW0ob25VcGRhdGVGblJlc3VsdCwgY29sKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IHNxbGBudWxsYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlTGlzdC5wdXNoKGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlTGlzdC5wdXNoKGNvbFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWVzU3FsTGlzdC5wdXNoKHZhbHVlTGlzdCk7XG4gICAgICAgIGlmICh2YWx1ZUluZGV4IDwgdmFsdWVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICB2YWx1ZXNTcWxMaXN0LnB1c2goc3FsYCwgYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgd2l0aFNxbCA9IHRoaXMuYnVpbGRXaXRoQ1RFKHdpdGhMaXN0KTtcbiAgICBjb25zdCB2YWx1ZXNTcWwgPSBzcWwuam9pbih2YWx1ZXNTcWxMaXN0KTtcbiAgICBjb25zdCByZXR1cm5pbmdTcWwgPSByZXR1cm5pbmcgPyBzcWxgIHJldHVybmluZyAke3RoaXMuYnVpbGRTZWxlY3Rpb24ocmV0dXJuaW5nLCB7IGlzU2luZ2xlVGFibGU6IHRydWUgfSl9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBvbkNvbmZsaWN0U3FsID0gb25Db25mbGljdD8ubGVuZ3RoID8gc3FsLmpvaW4ob25Db25mbGljdCkgOiB2b2lkIDA7XG4gICAgcmV0dXJuIHNxbGAke3dpdGhTcWx9aW5zZXJ0IGludG8gJHt0YWJsZX0gJHtpbnNlcnRPcmRlcn0gJHt2YWx1ZXNTcWx9JHtvbkNvbmZsaWN0U3FsfSR7cmV0dXJuaW5nU3FsfWA7XG4gIH1cbiAgc3FsVG9RdWVyeShzcWwyLCBpbnZva2VTb3VyY2UpIHtcbiAgICByZXR1cm4gc3FsMi50b1F1ZXJ5KHtcbiAgICAgIGNhc2luZzogdGhpcy5jYXNpbmcsXG4gICAgICBlc2NhcGVOYW1lOiB0aGlzLmVzY2FwZU5hbWUsXG4gICAgICBlc2NhcGVQYXJhbTogdGhpcy5lc2NhcGVQYXJhbSxcbiAgICAgIGVzY2FwZVN0cmluZzogdGhpcy5lc2NhcGVTdHJpbmcsXG4gICAgICBpbnZva2VTb3VyY2VcbiAgICB9KTtcbiAgfVxuICBidWlsZFJlbGF0aW9uYWxRdWVyeSh7XG4gICAgZnVsbFNjaGVtYSxcbiAgICBzY2hlbWEsXG4gICAgdGFibGVOYW1lc01hcCxcbiAgICB0YWJsZSxcbiAgICB0YWJsZUNvbmZpZyxcbiAgICBxdWVyeUNvbmZpZzogY29uZmlnLFxuICAgIHRhYmxlQWxpYXMsXG4gICAgbmVzdGVkUXVlcnlSZWxhdGlvbixcbiAgICBqb2luT25cbiAgfSkge1xuICAgIGxldCBzZWxlY3Rpb24gPSBbXTtcbiAgICBsZXQgbGltaXQsIG9mZnNldCwgb3JkZXJCeSA9IFtdLCB3aGVyZTtcbiAgICBjb25zdCBqb2lucyA9IFtdO1xuICAgIGlmIChjb25maWcgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGlvbkVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0YWJsZUNvbmZpZy5jb2x1bW5zKTtcbiAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbkVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgIGRiS2V5OiB2YWx1ZS5uYW1lLFxuICAgICAgICB0c0tleToga2V5LFxuICAgICAgICBmaWVsZDogYWxpYXNlZFRhYmxlQ29sdW1uKHZhbHVlLCB0YWJsZUFsaWFzKSxcbiAgICAgICAgcmVsYXRpb25UYWJsZVRzS2V5OiB2b2lkIDAsXG4gICAgICAgIGlzSnNvbjogZmFsc2UsXG4gICAgICAgIHNlbGVjdGlvbjogW11cbiAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYWxpYXNlZENvbHVtbnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHRhYmxlQ29uZmlnLmNvbHVtbnMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBhbGlhc2VkVGFibGVDb2x1bW4odmFsdWUsIHRhYmxlQWxpYXMpXSlcbiAgICAgICk7XG4gICAgICBpZiAoY29uZmlnLndoZXJlKSB7XG4gICAgICAgIGNvbnN0IHdoZXJlU3FsID0gdHlwZW9mIGNvbmZpZy53aGVyZSA9PT0gXCJmdW5jdGlvblwiID8gY29uZmlnLndoZXJlKGFsaWFzZWRDb2x1bW5zLCBnZXRPcGVyYXRvcnMoKSkgOiBjb25maWcud2hlcmU7XG4gICAgICAgIHdoZXJlID0gd2hlcmVTcWwgJiYgbWFwQ29sdW1uc0luU1FMVG9BbGlhcyh3aGVyZVNxbCwgdGFibGVBbGlhcyk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWVsZHNTZWxlY3Rpb24gPSBbXTtcbiAgICAgIGxldCBzZWxlY3RlZENvbHVtbnMgPSBbXTtcbiAgICAgIGlmIChjb25maWcuY29sdW1ucykge1xuICAgICAgICBsZXQgaXNJbmNsdWRlTW9kZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IFtmaWVsZCwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5jb2x1bW5zKSkge1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZpZWxkIGluIHRhYmxlQ29uZmlnLmNvbHVtbnMpIHtcbiAgICAgICAgICAgIGlmICghaXNJbmNsdWRlTW9kZSAmJiB2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBpc0luY2x1ZGVNb2RlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGVjdGVkQ29sdW1ucy5wdXNoKGZpZWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2VsZWN0ZWRDb2x1bW5zID0gaXNJbmNsdWRlTW9kZSA/IHNlbGVjdGVkQ29sdW1ucy5maWx0ZXIoKGMpID0+IGNvbmZpZy5jb2x1bW5zPy5bY10gPT09IHRydWUpIDogT2JqZWN0LmtleXModGFibGVDb25maWcuY29sdW1ucykuZmlsdGVyKChrZXkpID0+ICFzZWxlY3RlZENvbHVtbnMuaW5jbHVkZXMoa2V5KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdGVkQ29sdW1ucyA9IE9iamVjdC5rZXlzKHRhYmxlQ29uZmlnLmNvbHVtbnMpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBzZWxlY3RlZENvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGFibGVDb25maWcuY29sdW1uc1tmaWVsZF07XG4gICAgICAgIGZpZWxkc1NlbGVjdGlvbi5wdXNoKHsgdHNLZXk6IGZpZWxkLCB2YWx1ZTogY29sdW1uIH0pO1xuICAgICAgfVxuICAgICAgbGV0IHNlbGVjdGVkUmVsYXRpb25zID0gW107XG4gICAgICBpZiAoY29uZmlnLndpdGgpIHtcbiAgICAgICAgc2VsZWN0ZWRSZWxhdGlvbnMgPSBPYmplY3QuZW50cmllcyhjb25maWcud2l0aCkuZmlsdGVyKChlbnRyeSkgPT4gISFlbnRyeVsxXSkubWFwKChbdHNLZXksIHF1ZXJ5Q29uZmlnXSkgPT4gKHsgdHNLZXksIHF1ZXJ5Q29uZmlnLCByZWxhdGlvbjogdGFibGVDb25maWcucmVsYXRpb25zW3RzS2V5XSB9KSk7XG4gICAgICB9XG4gICAgICBsZXQgZXh0cmFzO1xuICAgICAgaWYgKGNvbmZpZy5leHRyYXMpIHtcbiAgICAgICAgZXh0cmFzID0gdHlwZW9mIGNvbmZpZy5leHRyYXMgPT09IFwiZnVuY3Rpb25cIiA/IGNvbmZpZy5leHRyYXMoYWxpYXNlZENvbHVtbnMsIHsgc3FsIH0pIDogY29uZmlnLmV4dHJhcztcbiAgICAgICAgZm9yIChjb25zdCBbdHNLZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhleHRyYXMpKSB7XG4gICAgICAgICAgZmllbGRzU2VsZWN0aW9uLnB1c2goe1xuICAgICAgICAgICAgdHNLZXksXG4gICAgICAgICAgICB2YWx1ZTogbWFwQ29sdW1uc0luQWxpYXNlZFNRTFRvQWxpYXModmFsdWUsIHRhYmxlQWxpYXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgeyB0c0tleSwgdmFsdWUgfSBvZiBmaWVsZHNTZWxlY3Rpb24pIHtcbiAgICAgICAgc2VsZWN0aW9uLnB1c2goe1xuICAgICAgICAgIGRiS2V5OiBpcyh2YWx1ZSwgU1FMLkFsaWFzZWQpID8gdmFsdWUuZmllbGRBbGlhcyA6IHRhYmxlQ29uZmlnLmNvbHVtbnNbdHNLZXldLm5hbWUsXG4gICAgICAgICAgdHNLZXksXG4gICAgICAgICAgZmllbGQ6IGlzKHZhbHVlLCBDb2x1bW4pID8gYWxpYXNlZFRhYmxlQ29sdW1uKHZhbHVlLCB0YWJsZUFsaWFzKSA6IHZhbHVlLFxuICAgICAgICAgIHJlbGF0aW9uVGFibGVUc0tleTogdm9pZCAwLFxuICAgICAgICAgIGlzSnNvbjogZmFsc2UsXG4gICAgICAgICAgc2VsZWN0aW9uOiBbXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGxldCBvcmRlckJ5T3JpZyA9IHR5cGVvZiBjb25maWcub3JkZXJCeSA9PT0gXCJmdW5jdGlvblwiID8gY29uZmlnLm9yZGVyQnkoYWxpYXNlZENvbHVtbnMsIGdldE9yZGVyQnlPcGVyYXRvcnMoKSkgOiBjb25maWcub3JkZXJCeSA/PyBbXTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShvcmRlckJ5T3JpZykpIHtcbiAgICAgICAgb3JkZXJCeU9yaWcgPSBbb3JkZXJCeU9yaWddO1xuICAgICAgfVxuICAgICAgb3JkZXJCeSA9IG9yZGVyQnlPcmlnLm1hcCgob3JkZXJCeVZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChpcyhvcmRlckJ5VmFsdWUsIENvbHVtbikpIHtcbiAgICAgICAgICByZXR1cm4gYWxpYXNlZFRhYmxlQ29sdW1uKG9yZGVyQnlWYWx1ZSwgdGFibGVBbGlhcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcENvbHVtbnNJblNRTFRvQWxpYXMob3JkZXJCeVZhbHVlLCB0YWJsZUFsaWFzKTtcbiAgICAgIH0pO1xuICAgICAgbGltaXQgPSBjb25maWcubGltaXQ7XG4gICAgICBvZmZzZXQgPSBjb25maWcub2Zmc2V0O1xuICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgIHRzS2V5OiBzZWxlY3RlZFJlbGF0aW9uVHNLZXksXG4gICAgICAgIHF1ZXJ5Q29uZmlnOiBzZWxlY3RlZFJlbGF0aW9uQ29uZmlnVmFsdWUsXG4gICAgICAgIHJlbGF0aW9uXG4gICAgICB9IG9mIHNlbGVjdGVkUmVsYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZWxhdGlvbiA9IG5vcm1hbGl6ZVJlbGF0aW9uKHNjaGVtYSwgdGFibGVOYW1lc01hcCwgcmVsYXRpb24pO1xuICAgICAgICBjb25zdCByZWxhdGlvblRhYmxlTmFtZSA9IGdldFRhYmxlVW5pcXVlTmFtZShyZWxhdGlvbi5yZWZlcmVuY2VkVGFibGUpO1xuICAgICAgICBjb25zdCByZWxhdGlvblRhYmxlVHNOYW1lID0gdGFibGVOYW1lc01hcFtyZWxhdGlvblRhYmxlTmFtZV07XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uVGFibGVBbGlhcyA9IGAke3RhYmxlQWxpYXN9XyR7c2VsZWN0ZWRSZWxhdGlvblRzS2V5fWA7XG4gICAgICAgIGNvbnN0IGpvaW5PbjIgPSBhbmQoXG4gICAgICAgICAgLi4ubm9ybWFsaXplZFJlbGF0aW9uLmZpZWxkcy5tYXAoXG4gICAgICAgICAgICAoZmllbGQyLCBpKSA9PiBlcShcbiAgICAgICAgICAgICAgYWxpYXNlZFRhYmxlQ29sdW1uKG5vcm1hbGl6ZWRSZWxhdGlvbi5yZWZlcmVuY2VzW2ldLCByZWxhdGlvblRhYmxlQWxpYXMpLFxuICAgICAgICAgICAgICBhbGlhc2VkVGFibGVDb2x1bW4oZmllbGQyLCB0YWJsZUFsaWFzKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYnVpbHRSZWxhdGlvbiA9IHRoaXMuYnVpbGRSZWxhdGlvbmFsUXVlcnkoe1xuICAgICAgICAgIGZ1bGxTY2hlbWEsXG4gICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgIHRhYmxlTmFtZXNNYXAsXG4gICAgICAgICAgdGFibGU6IGZ1bGxTY2hlbWFbcmVsYXRpb25UYWJsZVRzTmFtZV0sXG4gICAgICAgICAgdGFibGVDb25maWc6IHNjaGVtYVtyZWxhdGlvblRhYmxlVHNOYW1lXSxcbiAgICAgICAgICBxdWVyeUNvbmZpZzogaXMocmVsYXRpb24sIE9uZSkgPyBzZWxlY3RlZFJlbGF0aW9uQ29uZmlnVmFsdWUgPT09IHRydWUgPyB7IGxpbWl0OiAxIH0gOiB7IC4uLnNlbGVjdGVkUmVsYXRpb25Db25maWdWYWx1ZSwgbGltaXQ6IDEgfSA6IHNlbGVjdGVkUmVsYXRpb25Db25maWdWYWx1ZSxcbiAgICAgICAgICB0YWJsZUFsaWFzOiByZWxhdGlvblRhYmxlQWxpYXMsXG4gICAgICAgICAgam9pbk9uOiBqb2luT24yLFxuICAgICAgICAgIG5lc3RlZFF1ZXJ5UmVsYXRpb246IHJlbGF0aW9uXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBmaWVsZCA9IHNxbGAoJHtidWlsdFJlbGF0aW9uLnNxbH0pYC5hcyhzZWxlY3RlZFJlbGF0aW9uVHNLZXkpO1xuICAgICAgICBzZWxlY3Rpb24ucHVzaCh7XG4gICAgICAgICAgZGJLZXk6IHNlbGVjdGVkUmVsYXRpb25Uc0tleSxcbiAgICAgICAgICB0c0tleTogc2VsZWN0ZWRSZWxhdGlvblRzS2V5LFxuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIHJlbGF0aW9uVGFibGVUc0tleTogcmVsYXRpb25UYWJsZVRzTmFtZSxcbiAgICAgICAgICBpc0pzb246IHRydWUsXG4gICAgICAgICAgc2VsZWN0aW9uOiBidWlsdFJlbGF0aW9uLnNlbGVjdGlvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBEcml6emxlRXJyb3Ioe1xuICAgICAgICBtZXNzYWdlOiBgTm8gZmllbGRzIHNlbGVjdGVkIGZvciB0YWJsZSBcIiR7dGFibGVDb25maWcudHNOYW1lfVwiIChcIiR7dGFibGVBbGlhc31cIikuIFlvdSBuZWVkIHRvIGhhdmUgYXQgbGVhc3Qgb25lIGl0ZW0gaW4gXCJjb2x1bW5zXCIsIFwid2l0aFwiIG9yIFwiZXh0cmFzXCIuIElmIHlvdSBuZWVkIHRvIHNlbGVjdCBhbGwgY29sdW1ucywgb21pdCB0aGUgXCJjb2x1bW5zXCIga2V5IG9yIHNldCBpdCB0byB1bmRlZmluZWQuYFxuICAgICAgfSk7XG4gICAgfVxuICAgIGxldCByZXN1bHQ7XG4gICAgd2hlcmUgPSBhbmQoam9pbk9uLCB3aGVyZSk7XG4gICAgaWYgKG5lc3RlZFF1ZXJ5UmVsYXRpb24pIHtcbiAgICAgIGxldCBmaWVsZCA9IHNxbGBqc29uX2FycmF5KCR7c3FsLmpvaW4oXG4gICAgICAgIHNlbGVjdGlvbi5tYXAoXG4gICAgICAgICAgKHsgZmllbGQ6IGZpZWxkMiB9KSA9PiBpcyhmaWVsZDIsIFNRTGl0ZUNvbHVtbikgPyBzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoZmllbGQyKSkgOiBpcyhmaWVsZDIsIFNRTC5BbGlhc2VkKSA/IGZpZWxkMi5zcWwgOiBmaWVsZDJcbiAgICAgICAgKSxcbiAgICAgICAgc3FsYCwgYFxuICAgICAgKX0pYDtcbiAgICAgIGlmIChpcyhuZXN0ZWRRdWVyeVJlbGF0aW9uLCBNYW55KSkge1xuICAgICAgICBmaWVsZCA9IHNxbGBjb2FsZXNjZShqc29uX2dyb3VwX2FycmF5KCR7ZmllbGR9KSwganNvbl9hcnJheSgpKWA7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXN0ZWRTZWxlY3Rpb24gPSBbe1xuICAgICAgICBkYktleTogXCJkYXRhXCIsXG4gICAgICAgIHRzS2V5OiBcImRhdGFcIixcbiAgICAgICAgZmllbGQ6IGZpZWxkLmFzKFwiZGF0YVwiKSxcbiAgICAgICAgaXNKc29uOiB0cnVlLFxuICAgICAgICByZWxhdGlvblRhYmxlVHNLZXk6IHRhYmxlQ29uZmlnLnRzTmFtZSxcbiAgICAgICAgc2VsZWN0aW9uXG4gICAgICB9XTtcbiAgICAgIGNvbnN0IG5lZWRzU3VicXVlcnkgPSBsaW1pdCAhPT0gdm9pZCAwIHx8IG9mZnNldCAhPT0gdm9pZCAwIHx8IG9yZGVyQnkubGVuZ3RoID4gMDtcbiAgICAgIGlmIChuZWVkc1N1YnF1ZXJ5KSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuYnVpbGRTZWxlY3RRdWVyeSh7XG4gICAgICAgICAgdGFibGU6IGFsaWFzZWRUYWJsZSh0YWJsZSwgdGFibGVBbGlhcyksXG4gICAgICAgICAgZmllbGRzOiB7fSxcbiAgICAgICAgICBmaWVsZHNGbGF0OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHBhdGg6IFtdLFxuICAgICAgICAgICAgICBmaWVsZDogc3FsLnJhdyhcIipcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIHdoZXJlLFxuICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICBvcmRlckJ5LFxuICAgICAgICAgIHNldE9wZXJhdG9yczogW11cbiAgICAgICAgfSk7XG4gICAgICAgIHdoZXJlID0gdm9pZCAwO1xuICAgICAgICBsaW1pdCA9IHZvaWQgMDtcbiAgICAgICAgb2Zmc2V0ID0gdm9pZCAwO1xuICAgICAgICBvcmRlckJ5ID0gdm9pZCAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gYWxpYXNlZFRhYmxlKHRhYmxlLCB0YWJsZUFsaWFzKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IHRoaXMuYnVpbGRTZWxlY3RRdWVyeSh7XG4gICAgICAgIHRhYmxlOiBpcyhyZXN1bHQsIFNRTGl0ZVRhYmxlKSA/IHJlc3VsdCA6IG5ldyBTdWJxdWVyeShyZXN1bHQsIHt9LCB0YWJsZUFsaWFzKSxcbiAgICAgICAgZmllbGRzOiB7fSxcbiAgICAgICAgZmllbGRzRmxhdDogbmVzdGVkU2VsZWN0aW9uLm1hcCgoeyBmaWVsZDogZmllbGQyIH0pID0+ICh7XG4gICAgICAgICAgcGF0aDogW10sXG4gICAgICAgICAgZmllbGQ6IGlzKGZpZWxkMiwgQ29sdW1uKSA/IGFsaWFzZWRUYWJsZUNvbHVtbihmaWVsZDIsIHRhYmxlQWxpYXMpIDogZmllbGQyXG4gICAgICAgIH0pKSxcbiAgICAgICAgam9pbnMsXG4gICAgICAgIHdoZXJlLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICBvcmRlckJ5LFxuICAgICAgICBzZXRPcGVyYXRvcnM6IFtdXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gdGhpcy5idWlsZFNlbGVjdFF1ZXJ5KHtcbiAgICAgICAgdGFibGU6IGFsaWFzZWRUYWJsZSh0YWJsZSwgdGFibGVBbGlhcyksXG4gICAgICAgIGZpZWxkczoge30sXG4gICAgICAgIGZpZWxkc0ZsYXQ6IHNlbGVjdGlvbi5tYXAoKHsgZmllbGQgfSkgPT4gKHtcbiAgICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgICBmaWVsZDogaXMoZmllbGQsIENvbHVtbikgPyBhbGlhc2VkVGFibGVDb2x1bW4oZmllbGQsIHRhYmxlQWxpYXMpIDogZmllbGRcbiAgICAgICAgfSkpLFxuICAgICAgICBqb2lucyxcbiAgICAgICAgd2hlcmUsXG4gICAgICAgIGxpbWl0LFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIG9yZGVyQnksXG4gICAgICAgIHNldE9wZXJhdG9yczogW11cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdGFibGVUc0tleTogdGFibGVDb25maWcudHNOYW1lLFxuICAgICAgc3FsOiByZXN1bHQsXG4gICAgICBzZWxlY3Rpb25cbiAgICB9O1xuICB9XG59XG5jbGFzcyBTUUxpdGVTeW5jRGlhbGVjdCBleHRlbmRzIFNRTGl0ZURpYWxlY3Qge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVTeW5jRGlhbGVjdFwiO1xuICBtaWdyYXRlKG1pZ3JhdGlvbnMsIHNlc3Npb24sIGNvbmZpZykge1xuICAgIGNvbnN0IG1pZ3JhdGlvbnNUYWJsZSA9IGNvbmZpZyA9PT0gdm9pZCAwID8gXCJfX2RyaXp6bGVfbWlncmF0aW9uc1wiIDogdHlwZW9mIGNvbmZpZyA9PT0gXCJzdHJpbmdcIiA/IFwiX19kcml6emxlX21pZ3JhdGlvbnNcIiA6IGNvbmZpZy5taWdyYXRpb25zVGFibGUgPz8gXCJfX2RyaXp6bGVfbWlncmF0aW9uc1wiO1xuICAgIGNvbnN0IG1pZ3JhdGlvblRhYmxlQ3JlYXRlID0gc3FsYFxuXHRcdFx0Q1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJHtzcWwuaWRlbnRpZmllcihtaWdyYXRpb25zVGFibGUpfSAoXG5cdFx0XHRcdGlkIFNFUklBTCBQUklNQVJZIEtFWSxcblx0XHRcdFx0aGFzaCB0ZXh0IE5PVCBOVUxMLFxuXHRcdFx0XHRjcmVhdGVkX2F0IG51bWVyaWNcblx0XHRcdClcblx0XHRgO1xuICAgIHNlc3Npb24ucnVuKG1pZ3JhdGlvblRhYmxlQ3JlYXRlKTtcbiAgICBjb25zdCBkYk1pZ3JhdGlvbnMgPSBzZXNzaW9uLnZhbHVlcyhcbiAgICAgIHNxbGBTRUxFQ1QgaWQsIGhhc2gsIGNyZWF0ZWRfYXQgRlJPTSAke3NxbC5pZGVudGlmaWVyKG1pZ3JhdGlvbnNUYWJsZSl9IE9SREVSIEJZIGNyZWF0ZWRfYXQgREVTQyBMSU1JVCAxYFxuICAgICk7XG4gICAgY29uc3QgbGFzdERiTWlncmF0aW9uID0gZGJNaWdyYXRpb25zWzBdID8/IHZvaWQgMDtcbiAgICBzZXNzaW9uLnJ1bihzcWxgQkVHSU5gKTtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBtaWdyYXRpb24gb2YgbWlncmF0aW9ucykge1xuICAgICAgICBpZiAoIWxhc3REYk1pZ3JhdGlvbiB8fCBOdW1iZXIobGFzdERiTWlncmF0aW9uWzJdKSA8IG1pZ3JhdGlvbi5mb2xkZXJNaWxsaXMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN0bXQgb2YgbWlncmF0aW9uLnNxbCkge1xuICAgICAgICAgICAgc2Vzc2lvbi5ydW4oc3FsLnJhdyhzdG10KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlc3Npb24ucnVuKFxuICAgICAgICAgICAgc3FsYElOU0VSVCBJTlRPICR7c3FsLmlkZW50aWZpZXIobWlncmF0aW9uc1RhYmxlKX0gKFwiaGFzaFwiLCBcImNyZWF0ZWRfYXRcIikgVkFMVUVTKCR7bWlncmF0aW9uLmhhc2h9LCAke21pZ3JhdGlvbi5mb2xkZXJNaWxsaXN9KWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXNzaW9uLnJ1bihzcWxgQ09NTUlUYCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2Vzc2lvbi5ydW4oc3FsYFJPTExCQUNLYCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgU1FMaXRlQXN5bmNEaWFsZWN0IGV4dGVuZHMgU1FMaXRlRGlhbGVjdCB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUFzeW5jRGlhbGVjdFwiO1xuICBhc3luYyBtaWdyYXRlKG1pZ3JhdGlvbnMsIHNlc3Npb24sIGNvbmZpZykge1xuICAgIGNvbnN0IG1pZ3JhdGlvbnNUYWJsZSA9IGNvbmZpZyA9PT0gdm9pZCAwID8gXCJfX2RyaXp6bGVfbWlncmF0aW9uc1wiIDogdHlwZW9mIGNvbmZpZyA9PT0gXCJzdHJpbmdcIiA/IFwiX19kcml6emxlX21pZ3JhdGlvbnNcIiA6IGNvbmZpZy5taWdyYXRpb25zVGFibGUgPz8gXCJfX2RyaXp6bGVfbWlncmF0aW9uc1wiO1xuICAgIGNvbnN0IG1pZ3JhdGlvblRhYmxlQ3JlYXRlID0gc3FsYFxuXHRcdFx0Q1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJHtzcWwuaWRlbnRpZmllcihtaWdyYXRpb25zVGFibGUpfSAoXG5cdFx0XHRcdGlkIFNFUklBTCBQUklNQVJZIEtFWSxcblx0XHRcdFx0aGFzaCB0ZXh0IE5PVCBOVUxMLFxuXHRcdFx0XHRjcmVhdGVkX2F0IG51bWVyaWNcblx0XHRcdClcblx0XHRgO1xuICAgIGF3YWl0IHNlc3Npb24ucnVuKG1pZ3JhdGlvblRhYmxlQ3JlYXRlKTtcbiAgICBjb25zdCBkYk1pZ3JhdGlvbnMgPSBhd2FpdCBzZXNzaW9uLnZhbHVlcyhcbiAgICAgIHNxbGBTRUxFQ1QgaWQsIGhhc2gsIGNyZWF0ZWRfYXQgRlJPTSAke3NxbC5pZGVudGlmaWVyKG1pZ3JhdGlvbnNUYWJsZSl9IE9SREVSIEJZIGNyZWF0ZWRfYXQgREVTQyBMSU1JVCAxYFxuICAgICk7XG4gICAgY29uc3QgbGFzdERiTWlncmF0aW9uID0gZGJNaWdyYXRpb25zWzBdID8/IHZvaWQgMDtcbiAgICBhd2FpdCBzZXNzaW9uLnRyYW5zYWN0aW9uKGFzeW5jICh0eCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBtaWdyYXRpb24gb2YgbWlncmF0aW9ucykge1xuICAgICAgICBpZiAoIWxhc3REYk1pZ3JhdGlvbiB8fCBOdW1iZXIobGFzdERiTWlncmF0aW9uWzJdKSA8IG1pZ3JhdGlvbi5mb2xkZXJNaWxsaXMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN0bXQgb2YgbWlncmF0aW9uLnNxbCkge1xuICAgICAgICAgICAgYXdhaXQgdHgucnVuKHNxbC5yYXcoc3RtdCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCB0eC5ydW4oXG4gICAgICAgICAgICBzcWxgSU5TRVJUIElOVE8gJHtzcWwuaWRlbnRpZmllcihtaWdyYXRpb25zVGFibGUpfSAoXCJoYXNoXCIsIFwiY3JlYXRlZF9hdFwiKSBWQUxVRVMoJHttaWdyYXRpb24uaGFzaH0sICR7bWlncmF0aW9uLmZvbGRlck1pbGxpc30pYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgU1FMaXRlQXN5bmNEaWFsZWN0LFxuICBTUUxpdGVEaWFsZWN0LFxuICBTUUxpdGVTeW5jRGlhbGVjdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpYWxlY3QuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuY2xhc3MgVHlwZWRRdWVyeUJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJUeXBlZFF1ZXJ5QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIGdldFNlbGVjdGVkRmllbGRzKCkge1xuICAgIHJldHVybiB0aGlzLl8uc2VsZWN0ZWRGaWVsZHM7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFR5cGVkUXVlcnlCdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnktYnVpbGRlci5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVHlwZWRRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi4vLi4vcXVlcnktYnVpbGRlcnMvcXVlcnktYnVpbGRlci5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmltcG9ydCB7IFNlbGVjdGlvblByb3h5SGFuZGxlciB9IGZyb20gXCIuLi8uLi9zZWxlY3Rpb24tcHJveHkuanNcIjtcbmltcG9ydCB7IFNRTCwgVmlldyB9IGZyb20gXCIuLi8uLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTdWJxdWVyeSB9IGZyb20gXCIuLi8uLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUuanNcIjtcbmltcG9ydCB7XG4gIGFwcGx5TWl4aW5zLFxuICBnZXRUYWJsZUNvbHVtbnMsXG4gIGdldFRhYmxlTGlrZU5hbWUsXG4gIGhhdmVTYW1lS2V5cyxcbiAgb3JkZXJTZWxlY3RlZEZpZWxkc1xufSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3ZpZXctY29tbW9uLmpzXCI7XG5pbXBvcnQgeyBleHRyYWN0VXNlZFRhYmxlIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVWaWV3QmFzZSB9IGZyb20gXCIuLi92aWV3LWJhc2UuanNcIjtcbmNsYXNzIFNRTGl0ZVNlbGVjdEJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVTZWxlY3RCdWlsZGVyXCI7XG4gIGZpZWxkcztcbiAgc2Vzc2lvbjtcbiAgZGlhbGVjdDtcbiAgd2l0aExpc3Q7XG4gIGRpc3RpbmN0O1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLmZpZWxkcyA9IGNvbmZpZy5maWVsZHM7XG4gICAgdGhpcy5zZXNzaW9uID0gY29uZmlnLnNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gY29uZmlnLmRpYWxlY3Q7XG4gICAgdGhpcy53aXRoTGlzdCA9IGNvbmZpZy53aXRoTGlzdDtcbiAgICB0aGlzLmRpc3RpbmN0ID0gY29uZmlnLmRpc3RpbmN0O1xuICB9XG4gIGZyb20oc291cmNlKSB7XG4gICAgY29uc3QgaXNQYXJ0aWFsU2VsZWN0ID0gISF0aGlzLmZpZWxkcztcbiAgICBsZXQgZmllbGRzO1xuICAgIGlmICh0aGlzLmZpZWxkcykge1xuICAgICAgZmllbGRzID0gdGhpcy5maWVsZHM7XG4gICAgfSBlbHNlIGlmIChpcyhzb3VyY2UsIFN1YnF1ZXJ5KSkge1xuICAgICAgZmllbGRzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3Qua2V5cyhzb3VyY2UuXy5zZWxlY3RlZEZpZWxkcykubWFwKChrZXkpID0+IFtrZXksIHNvdXJjZVtrZXldXSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChpcyhzb3VyY2UsIFNRTGl0ZVZpZXdCYXNlKSkge1xuICAgICAgZmllbGRzID0gc291cmNlW1ZpZXdCYXNlQ29uZmlnXS5zZWxlY3RlZEZpZWxkcztcbiAgICB9IGVsc2UgaWYgKGlzKHNvdXJjZSwgU1FMKSkge1xuICAgICAgZmllbGRzID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpZWxkcyA9IGdldFRhYmxlQ29sdW1ucyhzb3VyY2UpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJhc2Uoe1xuICAgICAgdGFibGU6IHNvdXJjZSxcbiAgICAgIGZpZWxkcyxcbiAgICAgIGlzUGFydGlhbFNlbGVjdCxcbiAgICAgIHNlc3Npb246IHRoaXMuc2Vzc2lvbixcbiAgICAgIGRpYWxlY3Q6IHRoaXMuZGlhbGVjdCxcbiAgICAgIHdpdGhMaXN0OiB0aGlzLndpdGhMaXN0LFxuICAgICAgZGlzdGluY3Q6IHRoaXMuZGlzdGluY3RcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlU2VsZWN0UXVlcnlCdWlsZGVyQmFzZSBleHRlbmRzIFR5cGVkUXVlcnlCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlU2VsZWN0UXVlcnlCdWlsZGVyXCI7XG4gIF87XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uZmlnO1xuICBqb2luc05vdE51bGxhYmxlTWFwO1xuICB0YWJsZU5hbWU7XG4gIGlzUGFydGlhbFNlbGVjdDtcbiAgc2Vzc2lvbjtcbiAgZGlhbGVjdDtcbiAgY2FjaGVDb25maWcgPSB2b2lkIDA7XG4gIHVzZWRUYWJsZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBjb25zdHJ1Y3Rvcih7IHRhYmxlLCBmaWVsZHMsIGlzUGFydGlhbFNlbGVjdCwgc2Vzc2lvbiwgZGlhbGVjdCwgd2l0aExpc3QsIGRpc3RpbmN0IH0pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgd2l0aExpc3QsXG4gICAgICB0YWJsZSxcbiAgICAgIGZpZWxkczogeyAuLi5maWVsZHMgfSxcbiAgICAgIGRpc3RpbmN0LFxuICAgICAgc2V0T3BlcmF0b3JzOiBbXVxuICAgIH07XG4gICAgdGhpcy5pc1BhcnRpYWxTZWxlY3QgPSBpc1BhcnRpYWxTZWxlY3Q7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuXyA9IHtcbiAgICAgIHNlbGVjdGVkRmllbGRzOiBmaWVsZHMsXG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnXG4gICAgfTtcbiAgICB0aGlzLnRhYmxlTmFtZSA9IGdldFRhYmxlTGlrZU5hbWUodGFibGUpO1xuICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcCA9IHR5cGVvZiB0aGlzLnRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIiA/IHsgW3RoaXMudGFibGVOYW1lXTogdHJ1ZSB9IDoge307XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGV4dHJhY3RVc2VkVGFibGUodGFibGUpKSB0aGlzLnVzZWRUYWJsZXMuYWRkKGl0ZW0pO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0VXNlZFRhYmxlcygpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMudXNlZFRhYmxlc107XG4gIH1cbiAgY3JlYXRlSm9pbihqb2luVHlwZSkge1xuICAgIHJldHVybiAodGFibGUsIG9uKSA9PiB7XG4gICAgICBjb25zdCBiYXNlVGFibGVOYW1lID0gdGhpcy50YWJsZU5hbWU7XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSBnZXRUYWJsZUxpa2VOYW1lKHRhYmxlKTtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBleHRyYWN0VXNlZFRhYmxlKHRhYmxlKSkgdGhpcy51c2VkVGFibGVzLmFkZChpdGVtKTtcbiAgICAgIGlmICh0eXBlb2YgdGFibGVOYW1lID09PSBcInN0cmluZ1wiICYmIHRoaXMuY29uZmlnLmpvaW5zPy5zb21lKChqb2luKSA9PiBqb2luLmFsaWFzID09PSB0YWJsZU5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQWxpYXMgXCIke3RhYmxlTmFtZX1cIiBpcyBhbHJlYWR5IHVzZWQgaW4gdGhpcyBxdWVyeWApO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzUGFydGlhbFNlbGVjdCkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5qb2luc05vdE51bGxhYmxlTWFwKS5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGJhc2VUYWJsZU5hbWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMgPSB7XG4gICAgICAgICAgICBbYmFzZVRhYmxlTmFtZV06IHRoaXMuY29uZmlnLmZpZWxkc1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YWJsZU5hbWUgPT09IFwic3RyaW5nXCIgJiYgIWlzKHRhYmxlLCBTUUwpKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gaXModGFibGUsIFN1YnF1ZXJ5KSA/IHRhYmxlLl8uc2VsZWN0ZWRGaWVsZHMgOiBpcyh0YWJsZSwgVmlldykgPyB0YWJsZVtWaWV3QmFzZUNvbmZpZ10uc2VsZWN0ZWRGaWVsZHMgOiB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG4gICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzW3RhYmxlTmFtZV0gPSBzZWxlY3Rpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBvbiA9IG9uKFxuICAgICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyxcbiAgICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwic3FsXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmNvbmZpZy5qb2lucykge1xuICAgICAgICB0aGlzLmNvbmZpZy5qb2lucyA9IFtdO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25maWcuam9pbnMucHVzaCh7IG9uLCB0YWJsZSwgam9pblR5cGUsIGFsaWFzOiB0YWJsZU5hbWUgfSk7XG4gICAgICBpZiAodHlwZW9mIHRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBzd2l0Y2ggKGpvaW5UeXBlKSB7XG4gICAgICAgICAgY2FzZSBcImxlZnRcIjoge1xuICAgICAgICAgICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwW3RhYmxlTmFtZV0gPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwicmlnaHRcIjoge1xuICAgICAgICAgICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLmpvaW5zTm90TnVsbGFibGVNYXApLm1hcCgoW2tleV0pID0+IFtrZXksIGZhbHNlXSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXBbdGFibGVOYW1lXSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImNyb3NzXCI6XG4gICAgICAgICAgY2FzZSBcImlubmVyXCI6IHtcbiAgICAgICAgICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcFt0YWJsZU5hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiZnVsbFwiOiB7XG4gICAgICAgICAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXAgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcCkubWFwKChba2V5XSkgPT4gW2tleSwgZmFsc2VdKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcFt0YWJsZU5hbWVdID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgYGxlZnQgam9pbmAgb3BlcmF0aW9uIGJ5IGFkZGluZyBhbm90aGVyIHRhYmxlIHRvIHRoZSBjdXJyZW50IHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGFzc29jaWF0ZXMgZWFjaCByb3cgb2YgdGhlIHRhYmxlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcm93IGZyb20gdGhlIGpvaW5lZCB0YWJsZSwgaWYgYSBtYXRjaCBpcyBmb3VuZC4gSWYgbm8gbWF0Y2hpbmcgcm93IGV4aXN0cywgaXQgc2V0cyBhbGwgY29sdW1ucyBvZiB0aGUgam9pbmVkIHRhYmxlIHRvIG51bGwuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvam9pbnMjbGVmdC1qb2lufVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRvIGpvaW4uXG4gICAqIEBwYXJhbSBvbiB0aGUgYG9uYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdXNlcnMgYW5kIHRoZWlyIHBldHNcbiAgICogY29uc3QgdXNlcnNXaXRoUGV0czogeyB1c2VyOiBVc2VyOyBwZXRzOiBQZXQgfCBudWxsOyB9W10gPSBhd2FpdCBkYi5zZWxlY3QoKVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5sZWZ0Sm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICpcbiAgICogLy8gU2VsZWN0IHVzZXJJZCBhbmQgcGV0SWRcbiAgICogY29uc3QgdXNlcnNJZHNBbmRQZXRJZHM6IHsgdXNlcklkOiBudW1iZXI7IHBldElkOiBudW1iZXIgfCBudWxsOyB9W10gPSBhd2FpdCBkYi5zZWxlY3Qoe1xuICAgKiAgIHVzZXJJZDogdXNlcnMuaWQsXG4gICAqICAgcGV0SWQ6IHBldHMuaWQsXG4gICAqIH0pXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmxlZnRKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKiBgYGBcbiAgICovXG4gIGxlZnRKb2luID0gdGhpcy5jcmVhdGVKb2luKFwibGVmdFwiKTtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgYHJpZ2h0IGpvaW5gIG9wZXJhdGlvbiBieSBhZGRpbmcgYW5vdGhlciB0YWJsZSB0byB0aGUgY3VycmVudCBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBhc3NvY2lhdGVzIGVhY2ggcm93IG9mIHRoZSBqb2luZWQgdGFibGUgd2l0aCB0aGUgY29ycmVzcG9uZGluZyByb3cgZnJvbSB0aGUgbWFpbiB0YWJsZSwgaWYgYSBtYXRjaCBpcyBmb3VuZC4gSWYgbm8gbWF0Y2hpbmcgcm93IGV4aXN0cywgaXQgc2V0cyBhbGwgY29sdW1ucyBvZiB0aGUgbWFpbiB0YWJsZSB0byBudWxsLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2pvaW5zI3JpZ2h0LWpvaW59XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdG8gam9pbi5cbiAgICogQHBhcmFtIG9uIHRoZSBgb25gIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB1c2VycyBhbmQgdGhlaXIgcGV0c1xuICAgKiBjb25zdCB1c2Vyc1dpdGhQZXRzOiB7IHVzZXI6IFVzZXIgfCBudWxsOyBwZXRzOiBQZXQ7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCgpXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLnJpZ2h0Sm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICpcbiAgICogLy8gU2VsZWN0IHVzZXJJZCBhbmQgcGV0SWRcbiAgICogY29uc3QgdXNlcnNJZHNBbmRQZXRJZHM6IHsgdXNlcklkOiBudW1iZXIgfCBudWxsOyBwZXRJZDogbnVtYmVyOyB9W10gPSBhd2FpdCBkYi5zZWxlY3Qoe1xuICAgKiAgIHVzZXJJZDogdXNlcnMuaWQsXG4gICAqICAgcGV0SWQ6IHBldHMuaWQsXG4gICAqIH0pXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLnJpZ2h0Sm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICogYGBgXG4gICAqL1xuICByaWdodEpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJyaWdodFwiKTtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGFuIGBpbm5lciBqb2luYCBvcGVyYXRpb24sIGNyZWF0aW5nIGEgbmV3IHRhYmxlIGJ5IGNvbWJpbmluZyByb3dzIGZyb20gdHdvIHRhYmxlcyB0aGF0IGhhdmUgbWF0Y2hpbmcgdmFsdWVzLlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHJldHJpZXZlcyByb3dzIHRoYXQgaGF2ZSBjb3JyZXNwb25kaW5nIGVudHJpZXMgaW4gYm90aCBqb2luZWQgdGFibGVzLiBSb3dzIHdpdGhvdXQgbWF0Y2hpbmcgZW50cmllcyBpbiBlaXRoZXIgdGFibGUgYXJlIGV4Y2x1ZGVkLCByZXN1bHRpbmcgaW4gYSB0YWJsZSB0aGF0IGluY2x1ZGVzIG9ubHkgbWF0Y2hpbmcgcGFpcnMuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvam9pbnMjaW5uZXItam9pbn1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBqb2luLlxuICAgKiBAcGFyYW0gb24gdGhlIGBvbmAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHVzZXJzIGFuZCB0aGVpciBwZXRzXG4gICAqIGNvbnN0IHVzZXJzV2l0aFBldHM6IHsgdXNlcjogVXNlcjsgcGV0czogUGV0OyB9W10gPSBhd2FpdCBkYi5zZWxlY3QoKVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5pbm5lckpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqXG4gICAqIC8vIFNlbGVjdCB1c2VySWQgYW5kIHBldElkXG4gICAqIGNvbnN0IHVzZXJzSWRzQW5kUGV0SWRzOiB7IHVzZXJJZDogbnVtYmVyOyBwZXRJZDogbnVtYmVyOyB9W10gPSBhd2FpdCBkYi5zZWxlY3Qoe1xuICAgKiAgIHVzZXJJZDogdXNlcnMuaWQsXG4gICAqICAgcGV0SWQ6IHBldHMuaWQsXG4gICAqIH0pXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmlubmVySm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICogYGBgXG4gICAqL1xuICBpbm5lckpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJpbm5lclwiKTtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgYGZ1bGwgam9pbmAgb3BlcmF0aW9uIGJ5IGNvbWJpbmluZyByb3dzIGZyb20gdHdvIHRhYmxlcyBpbnRvIGEgbmV3IHRhYmxlLlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHJldHJpZXZlcyBhbGwgcm93cyBmcm9tIGJvdGggbWFpbiBhbmQgam9pbmVkIHRhYmxlcywgbWVyZ2luZyByb3dzIHdpdGggbWF0Y2hpbmcgdmFsdWVzIGFuZCBmaWxsaW5nIGluIGBudWxsYCBmb3Igbm9uLW1hdGNoaW5nIGNvbHVtbnMuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvam9pbnMjZnVsbC1qb2lufVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRvIGpvaW4uXG4gICAqIEBwYXJhbSBvbiB0aGUgYG9uYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdXNlcnMgYW5kIHRoZWlyIHBldHNcbiAgICogY29uc3QgdXNlcnNXaXRoUGV0czogeyB1c2VyOiBVc2VyIHwgbnVsbDsgcGV0czogUGV0IHwgbnVsbDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KClcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAuZnVsbEpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqXG4gICAqIC8vIFNlbGVjdCB1c2VySWQgYW5kIHBldElkXG4gICAqIGNvbnN0IHVzZXJzSWRzQW5kUGV0SWRzOiB7IHVzZXJJZDogbnVtYmVyIHwgbnVsbDsgcGV0SWQ6IG51bWJlciB8IG51bGw7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCh7XG4gICAqICAgdXNlcklkOiB1c2Vycy5pZCxcbiAgICogICBwZXRJZDogcGV0cy5pZCxcbiAgICogfSlcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAuZnVsbEpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqIGBgYFxuICAgKi9cbiAgZnVsbEpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJmdWxsXCIpO1xuICAvKipcbiAgICogRXhlY3V0ZXMgYSBgY3Jvc3Mgam9pbmAgb3BlcmF0aW9uIGJ5IGNvbWJpbmluZyByb3dzIGZyb20gdHdvIHRhYmxlcyBpbnRvIGEgbmV3IHRhYmxlLlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHJldHJpZXZlcyBhbGwgcm93cyBmcm9tIGJvdGggbWFpbiBhbmQgam9pbmVkIHRhYmxlcywgbWVyZ2luZyBhbGwgcm93cyBmcm9tIGVhY2ggdGFibGUuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvam9pbnMjY3Jvc3Mtam9pbn1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBqb2luLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHVzZXJzLCBlYWNoIHVzZXIgd2l0aCBldmVyeSBwZXRcbiAgICogY29uc3QgdXNlcnNXaXRoUGV0czogeyB1c2VyOiBVc2VyOyBwZXRzOiBQZXQ7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCgpXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmNyb3NzSm9pbihwZXRzKVxuICAgKlxuICAgKiAvLyBTZWxlY3QgdXNlcklkIGFuZCBwZXRJZFxuICAgKiBjb25zdCB1c2Vyc0lkc0FuZFBldElkczogeyB1c2VySWQ6IG51bWJlcjsgcGV0SWQ6IG51bWJlcjsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KHtcbiAgICogICB1c2VySWQ6IHVzZXJzLmlkLFxuICAgKiAgIHBldElkOiBwZXRzLmlkLFxuICAgKiB9KVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5jcm9zc0pvaW4ocGV0cylcbiAgICogYGBgXG4gICAqL1xuICBjcm9zc0pvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJjcm9zc1wiKTtcbiAgY3JlYXRlU2V0T3BlcmF0b3IodHlwZSwgaXNBbGwpIHtcbiAgICByZXR1cm4gKHJpZ2h0U2VsZWN0aW9uKSA9PiB7XG4gICAgICBjb25zdCByaWdodFNlbGVjdCA9IHR5cGVvZiByaWdodFNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiID8gcmlnaHRTZWxlY3Rpb24oZ2V0U1FMaXRlU2V0T3BlcmF0b3JzKCkpIDogcmlnaHRTZWxlY3Rpb247XG4gICAgICBpZiAoIWhhdmVTYW1lS2V5cyh0aGlzLmdldFNlbGVjdGVkRmllbGRzKCksIHJpZ2h0U2VsZWN0LmdldFNlbGVjdGVkRmllbGRzKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIlNldCBvcGVyYXRvciBlcnJvciAodW5pb24gLyBpbnRlcnNlY3QgLyBleGNlcHQpOiBzZWxlY3RlZCBmaWVsZHMgYXJlIG5vdCB0aGUgc2FtZSBvciBhcmUgaW4gYSBkaWZmZXJlbnQgb3JkZXJcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLnB1c2goeyB0eXBlLCBpc0FsbCwgcmlnaHRTZWxlY3QgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGB1bmlvbmAgc2V0IG9wZXJhdG9yIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGNvbWJpbmUgdGhlIHJlc3VsdCBzZXRzIG9mIHRoZSBgc2VsZWN0YCBzdGF0ZW1lbnRzIGFuZCByZW1vdmUgYW55IGR1cGxpY2F0ZSByb3dzIHRoYXQgYXBwZWFyIGFjcm9zcyB0aGVtLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NldC1vcGVyYXRpb25zI3VuaW9ufVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHVuaXF1ZSBuYW1lcyBmcm9tIGN1c3RvbWVycyBhbmQgdXNlcnMgdGFibGVzXG4gICAqIGF3YWl0IGRiLnNlbGVjdCh7IG5hbWU6IHVzZXJzLm5hbWUgfSlcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAudW5pb24oXG4gICAqICAgICBkYi5zZWxlY3QoeyBuYW1lOiBjdXN0b21lcnMubmFtZSB9KS5mcm9tKGN1c3RvbWVycylcbiAgICogICApO1xuICAgKiAvLyBvclxuICAgKiBpbXBvcnQgeyB1bmlvbiB9IGZyb20gJ2RyaXp6bGUtb3JtL3NxbGl0ZS1jb3JlJ1xuICAgKlxuICAgKiBhd2FpdCB1bmlvbihcbiAgICogICBkYi5zZWxlY3QoeyBuYW1lOiB1c2Vycy5uYW1lIH0pLmZyb20odXNlcnMpLFxuICAgKiAgIGRiLnNlbGVjdCh7IG5hbWU6IGN1c3RvbWVycy5uYW1lIH0pLmZyb20oY3VzdG9tZXJzKVxuICAgKiApO1xuICAgKiBgYGBcbiAgICovXG4gIHVuaW9uID0gdGhpcy5jcmVhdGVTZXRPcGVyYXRvcihcInVuaW9uXCIsIGZhbHNlKTtcbiAgLyoqXG4gICAqIEFkZHMgYHVuaW9uIGFsbGAgc2V0IG9wZXJhdG9yIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGNvbWJpbmUgdGhlIHJlc3VsdC1zZXQgb2YgdGhlIGBzZWxlY3RgIHN0YXRlbWVudHMgYW5kIGtlZXAgYWxsIGR1cGxpY2F0ZSByb3dzIHRoYXQgYXBwZWFyIGFjcm9zcyB0aGVtLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NldC1vcGVyYXRpb25zI3VuaW9uLWFsbH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB0cmFuc2FjdGlvbiBpZHMgZnJvbSBib3RoIG9ubGluZSBhbmQgaW4tc3RvcmUgc2FsZXNcbiAgICogYXdhaXQgZGIuc2VsZWN0KHsgdHJhbnNhY3Rpb246IG9ubGluZVNhbGVzLnRyYW5zYWN0aW9uSWQgfSlcbiAgICogICAuZnJvbShvbmxpbmVTYWxlcylcbiAgICogICAudW5pb25BbGwoXG4gICAqICAgICBkYi5zZWxlY3QoeyB0cmFuc2FjdGlvbjogaW5TdG9yZVNhbGVzLnRyYW5zYWN0aW9uSWQgfSkuZnJvbShpblN0b3JlU2FsZXMpXG4gICAqICAgKTtcbiAgICogLy8gb3JcbiAgICogaW1wb3J0IHsgdW5pb25BbGwgfSBmcm9tICdkcml6emxlLW9ybS9zcWxpdGUtY29yZSdcbiAgICpcbiAgICogYXdhaXQgdW5pb25BbGwoXG4gICAqICAgZGIuc2VsZWN0KHsgdHJhbnNhY3Rpb246IG9ubGluZVNhbGVzLnRyYW5zYWN0aW9uSWQgfSkuZnJvbShvbmxpbmVTYWxlcyksXG4gICAqICAgZGIuc2VsZWN0KHsgdHJhbnNhY3Rpb246IGluU3RvcmVTYWxlcy50cmFuc2FjdGlvbklkIH0pLmZyb20oaW5TdG9yZVNhbGVzKVxuICAgKiApO1xuICAgKiBgYGBcbiAgICovXG4gIHVuaW9uQWxsID0gdGhpcy5jcmVhdGVTZXRPcGVyYXRvcihcInVuaW9uXCIsIHRydWUpO1xuICAvKipcbiAgICogQWRkcyBgaW50ZXJzZWN0YCBzZXQgb3BlcmF0b3IgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgcmV0YWluIG9ubHkgdGhlIHJvd3MgdGhhdCBhcmUgcHJlc2VudCBpbiBib3RoIHJlc3VsdCBzZXRzIGFuZCBlbGltaW5hdGUgZHVwbGljYXRlcy5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZXQtb3BlcmF0aW9ucyNpbnRlcnNlY3R9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBjb3Vyc2UgbmFtZXMgdGhhdCBhcmUgb2ZmZXJlZCBpbiBib3RoIGRlcGFydG1lbnRzIEEgYW5kIEJcbiAgICogYXdhaXQgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQS5jb3Vyc2VOYW1lIH0pXG4gICAqICAgLmZyb20oZGVwQSlcbiAgICogICAuaW50ZXJzZWN0KFxuICAgKiAgICAgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQi5jb3Vyc2VOYW1lIH0pLmZyb20oZGVwQilcbiAgICogICApO1xuICAgKiAvLyBvclxuICAgKiBpbXBvcnQgeyBpbnRlcnNlY3QgfSBmcm9tICdkcml6emxlLW9ybS9zcWxpdGUtY29yZSdcbiAgICpcbiAgICogYXdhaXQgaW50ZXJzZWN0KFxuICAgKiAgIGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEEuY291cnNlTmFtZSB9KS5mcm9tKGRlcEEpLFxuICAgKiAgIGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEIuY291cnNlTmFtZSB9KS5mcm9tKGRlcEIpXG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgaW50ZXJzZWN0ID0gdGhpcy5jcmVhdGVTZXRPcGVyYXRvcihcImludGVyc2VjdFwiLCBmYWxzZSk7XG4gIC8qKlxuICAgKiBBZGRzIGBleGNlcHRgIHNldCBvcGVyYXRvciB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCByZXRyaWV2ZSBhbGwgdW5pcXVlIHJvd3MgZnJvbSB0aGUgbGVmdCBxdWVyeSwgZXhjZXB0IGZvciB0aGUgcm93cyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSByZXN1bHQgc2V0IG9mIHRoZSByaWdodCBxdWVyeS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZXQtb3BlcmF0aW9ucyNleGNlcHR9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgY291cnNlcyBvZmZlcmVkIGluIGRlcGFydG1lbnQgQSBidXQgbm90IGluIGRlcGFydG1lbnQgQlxuICAgKiBhd2FpdCBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBBLmNvdXJzZU5hbWUgfSlcbiAgICogICAuZnJvbShkZXBBKVxuICAgKiAgIC5leGNlcHQoXG4gICAqICAgICBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBCLmNvdXJzZU5hbWUgfSkuZnJvbShkZXBCKVxuICAgKiAgICk7XG4gICAqIC8vIG9yXG4gICAqIGltcG9ydCB7IGV4Y2VwdCB9IGZyb20gJ2RyaXp6bGUtb3JtL3NxbGl0ZS1jb3JlJ1xuICAgKlxuICAgKiBhd2FpdCBleGNlcHQoXG4gICAqICAgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQS5jb3Vyc2VOYW1lIH0pLmZyb20oZGVwQSksXG4gICAqICAgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQi5jb3Vyc2VOYW1lIH0pLmZyb20oZGVwQilcbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBleGNlcHQgPSB0aGlzLmNyZWF0ZVNldE9wZXJhdG9yKFwiZXhjZXB0XCIsIGZhbHNlKTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBhZGRTZXRPcGVyYXRvcnMoc2V0T3BlcmF0b3JzKSB7XG4gICAgdGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLnB1c2goLi4uc2V0T3BlcmF0b3JzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGB3aGVyZWAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHNlbGVjdCBvbmx5IHRob3NlIHJvd3MgdGhhdCBmdWxmaWxsIGEgc3BlY2lmaWVkIGNvbmRpdGlvbi5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZWxlY3QjZmlsdGVyaW5nfVxuICAgKlxuICAgKiBAcGFyYW0gd2hlcmUgdGhlIGB3aGVyZWAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBZb3UgY2FuIHVzZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgYW5kIGBzcWwgZnVuY3Rpb25gIHRvIGZpbHRlciB0aGUgcm93cyB0byBiZSBzZWxlY3RlZC5cbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCBjYXJzIHdpdGggZ3JlZW4gY29sb3JcbiAgICogYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShjYXJzKS53aGVyZShlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSk7XG4gICAqIC8vIG9yXG4gICAqIGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oY2Fycykud2hlcmUoc3FsYCR7Y2Fycy5jb2xvcn0gPSAnZ3JlZW4nYClcbiAgICogYGBgXG4gICAqXG4gICAqIFlvdSBjYW4gbG9naWNhbGx5IGNvbWJpbmUgY29uZGl0aW9uYWwgb3BlcmF0b3JzIHdpdGggYGFuZCgpYCBhbmQgYG9yKClgIG9wZXJhdG9yczpcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCBCTVcgY2FycyB3aXRoIGEgZ3JlZW4gY29sb3JcbiAgICogYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShjYXJzKS53aGVyZShhbmQoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJyksIGVxKGNhcnMuYnJhbmQsICdCTVcnKSkpO1xuICAgKlxuICAgKiAvLyBTZWxlY3QgYWxsIGNhcnMgd2l0aCB0aGUgZ3JlZW4gb3IgYmx1ZSBjb2xvclxuICAgKiBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKGNhcnMpLndoZXJlKG9yKGVxKGNhcnMuY29sb3IsICdncmVlbicpLCBlcShjYXJzLmNvbG9yLCAnYmx1ZScpKSk7XG4gICAqIGBgYFxuICAgKi9cbiAgd2hlcmUod2hlcmUpIHtcbiAgICBpZiAodHlwZW9mIHdoZXJlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHdoZXJlID0gd2hlcmUoXG4gICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMsXG4gICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJzcWxcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5jb25maWcud2hlcmUgPSB3aGVyZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGBoYXZpbmdgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBzZWxlY3Qgb25seSB0aG9zZSByb3dzIHRoYXQgZnVsZmlsbCBhIHNwZWNpZmllZCBjb25kaXRpb24uIEl0IGlzIHR5cGljYWxseSB1c2VkIHdpdGggYWdncmVnYXRlIGZ1bmN0aW9ucyB0byBmaWx0ZXIgdGhlIGFnZ3JlZ2F0ZWQgZGF0YSBiYXNlZCBvbiBhIHNwZWNpZmllZCBjb25kaXRpb24uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2VsZWN0I2FnZ3JlZ2F0aW9uc31cbiAgICpcbiAgICogQHBhcmFtIGhhdmluZyB0aGUgYGhhdmluZ2AgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIGJyYW5kcyB3aXRoIG1vcmUgdGhhbiBvbmUgY2FyXG4gICAqIGF3YWl0IGRiLnNlbGVjdCh7XG4gICAqIFx0YnJhbmQ6IGNhcnMuYnJhbmQsXG4gICAqIFx0Y291bnQ6IHNxbDxudW1iZXI+YGNhc3QoY291bnQoJHtjYXJzLmlkfSkgYXMgaW50KWAsXG4gICAqIH0pXG4gICAqICAgLmZyb20oY2FycylcbiAgICogICAuZ3JvdXBCeShjYXJzLmJyYW5kKVxuICAgKiAgIC5oYXZpbmcoKHsgY291bnQgfSkgPT4gZ3QoY291bnQsIDEpKTtcbiAgICogYGBgXG4gICAqL1xuICBoYXZpbmcoaGF2aW5nKSB7XG4gICAgaWYgKHR5cGVvZiBoYXZpbmcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgaGF2aW5nID0gaGF2aW5nKFxuICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzLFxuICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwic3FsXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLmhhdmluZyA9IGhhdmluZztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBncm91cEJ5KC4uLmNvbHVtbnMpIHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbnNbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3QgZ3JvdXBCeSA9IGNvbHVtbnNbMF0oXG4gICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMsXG4gICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcuZ3JvdXBCeSA9IEFycmF5LmlzQXJyYXkoZ3JvdXBCeSkgPyBncm91cEJ5IDogW2dyb3VwQnldO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbmZpZy5ncm91cEJ5ID0gY29sdW1ucztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb3JkZXJCeSguLi5jb2x1bW5zKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW5zWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yZGVyQnkgPSBjb2x1bW5zWzBdKFxuICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzLFxuICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG9yZGVyQnlBcnJheSA9IEFycmF5LmlzQXJyYXkob3JkZXJCeSkgPyBvcmRlckJ5IDogW29yZGVyQnldO1xuICAgICAgaWYgKHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5hdCgtMSkub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9yZGVyQnlBcnJheSA9IGNvbHVtbnM7XG4gICAgICBpZiAodGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmF0KC0xKS5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25maWcub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBgbGltaXRgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoaXMgcXVlcnkuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2VsZWN0I2xpbWl0LS1vZmZzZXR9XG4gICAqXG4gICAqIEBwYXJhbSBsaW1pdCB0aGUgYGxpbWl0YCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIEdldCB0aGUgZmlyc3QgMTAgcGVvcGxlIGZyb20gdGhpcyBxdWVyeS5cbiAgICogYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShwZW9wbGUpLmxpbWl0KDEwKTtcbiAgICogYGBgXG4gICAqL1xuICBsaW1pdChsaW1pdCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmF0KC0xKS5saW1pdCA9IGxpbWl0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbmZpZy5saW1pdCA9IGxpbWl0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhbiBgb2Zmc2V0YCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgc2tpcCBhIG51bWJlciBvZiByb3dzIHdoZW4gcmV0dXJuaW5nIHJlc3VsdHMgZnJvbSB0aGlzIHF1ZXJ5LlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NlbGVjdCNsaW1pdC0tb2Zmc2V0fVxuICAgKlxuICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBgb2Zmc2V0YCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIEdldCB0aGUgMTB0aC0yMHRoIHBlb3BsZSBmcm9tIHRoaXMgcXVlcnkuXG4gICAqIGF3YWl0IGRiLnNlbGVjdCgpLmZyb20ocGVvcGxlKS5vZmZzZXQoMTApLmxpbWl0KDEwKTtcbiAgICogYGBgXG4gICAqL1xuICBvZmZzZXQob2Zmc2V0KSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMuYXQoLTEpLm9mZnNldCA9IG9mZnNldDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWcub2Zmc2V0ID0gb2Zmc2V0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsZWN0LmJ1aWxkU2VsZWN0UXVlcnkodGhpcy5jb25maWcpO1xuICB9XG4gIHRvU1FMKCkge1xuICAgIGNvbnN0IHsgdHlwaW5nczogX3R5cGluZ3MsIC4uLnJlc3QgfSA9IHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpO1xuICAgIHJldHVybiByZXN0O1xuICB9XG4gIGFzKGFsaWFzKSB7XG4gICAgY29uc3QgdXNlZFRhYmxlcyA9IFtdO1xuICAgIHVzZWRUYWJsZXMucHVzaCguLi5leHRyYWN0VXNlZFRhYmxlKHRoaXMuY29uZmlnLnRhYmxlKSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLmpvaW5zKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0IG9mIHRoaXMuY29uZmlnLmpvaW5zKSB1c2VkVGFibGVzLnB1c2goLi4uZXh0cmFjdFVzZWRUYWJsZShpdC50YWJsZSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb3h5KFxuICAgICAgbmV3IFN1YnF1ZXJ5KHRoaXMuZ2V0U1FMKCksIHRoaXMuY29uZmlnLmZpZWxkcywgYWxpYXMsIGZhbHNlLCBbLi4ubmV3IFNldCh1c2VkVGFibGVzKV0pLFxuICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IGFsaWFzLCBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwiZXJyb3JcIiB9KVxuICAgICk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTZWxlY3RlZEZpZWxkcygpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KFxuICAgICAgdGhpcy5jb25maWcuZmllbGRzLFxuICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IGFsaWFzOiB0aGlzLnRhYmxlTmFtZSwgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcImVycm9yXCIgfSlcbiAgICApO1xuICB9XG4gICRkeW5hbWljKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5jbGFzcyBTUUxpdGVTZWxlY3RCYXNlIGV4dGVuZHMgU1FMaXRlU2VsZWN0UXVlcnlCdWlsZGVyQmFzZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVNlbGVjdFwiO1xuICAvKiogQGludGVybmFsICovXG4gIF9wcmVwYXJlKGlzT25lVGltZVF1ZXJ5ID0gdHJ1ZSkge1xuICAgIGlmICghdGhpcy5zZXNzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZXhlY3V0ZSBhIHF1ZXJ5IG9uIGEgcXVlcnkgYnVpbGRlci4gUGxlYXNlIHVzZSBhIGRhdGFiYXNlIGluc3RhbmNlIGluc3RlYWQuXCIpO1xuICAgIH1cbiAgICBjb25zdCBmaWVsZHNMaXN0ID0gb3JkZXJTZWxlY3RlZEZpZWxkcyh0aGlzLmNvbmZpZy5maWVsZHMpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zZXNzaW9uW2lzT25lVGltZVF1ZXJ5ID8gXCJwcmVwYXJlT25lVGltZVF1ZXJ5XCIgOiBcInByZXBhcmVRdWVyeVwiXShcbiAgICAgIHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpLFxuICAgICAgZmllbGRzTGlzdCxcbiAgICAgIFwiYWxsXCIsXG4gICAgICB0cnVlLFxuICAgICAgdm9pZCAwLFxuICAgICAge1xuICAgICAgICB0eXBlOiBcInNlbGVjdFwiLFxuICAgICAgICB0YWJsZXM6IFsuLi50aGlzLnVzZWRUYWJsZXNdXG4gICAgICB9LFxuICAgICAgdGhpcy5jYWNoZUNvbmZpZ1xuICAgICk7XG4gICAgcXVlcnkuam9pbnNOb3ROdWxsYWJsZU1hcCA9IHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcDtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cbiAgJHdpdGhDYWNoZShjb25maWcpIHtcbiAgICB0aGlzLmNhY2hlQ29uZmlnID0gY29uZmlnID09PSB2b2lkIDAgPyB7IGNvbmZpZzoge30sIGVuYWJsZTogdHJ1ZSwgYXV0b0ludmFsaWRhdGU6IHRydWUgfSA6IGNvbmZpZyA9PT0gZmFsc2UgPyB7IGVuYWJsZTogZmFsc2UgfSA6IHsgZW5hYmxlOiB0cnVlLCBhdXRvSW52YWxpZGF0ZTogdHJ1ZSwgLi4uY29uZmlnIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgcHJlcGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSk7XG4gIH1cbiAgcnVuID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5ydW4ocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhbGwgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmFsbChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGdldCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuZ2V0KHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgdmFsdWVzID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS52YWx1ZXMocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIHJldHVybiB0aGlzLmFsbCgpO1xuICB9XG59XG5hcHBseU1peGlucyhTUUxpdGVTZWxlY3RCYXNlLCBbUXVlcnlQcm9taXNlXSk7XG5mdW5jdGlvbiBjcmVhdGVTZXRPcGVyYXRvcih0eXBlLCBpc0FsbCkge1xuICByZXR1cm4gKGxlZnRTZWxlY3QsIHJpZ2h0U2VsZWN0LCAuLi5yZXN0U2VsZWN0cykgPT4ge1xuICAgIGNvbnN0IHNldE9wZXJhdG9ycyA9IFtyaWdodFNlbGVjdCwgLi4ucmVzdFNlbGVjdHNdLm1hcCgoc2VsZWN0KSA9PiAoe1xuICAgICAgdHlwZSxcbiAgICAgIGlzQWxsLFxuICAgICAgcmlnaHRTZWxlY3Q6IHNlbGVjdFxuICAgIH0pKTtcbiAgICBmb3IgKGNvbnN0IHNldE9wZXJhdG9yIG9mIHNldE9wZXJhdG9ycykge1xuICAgICAgaWYgKCFoYXZlU2FtZUtleXMobGVmdFNlbGVjdC5nZXRTZWxlY3RlZEZpZWxkcygpLCBzZXRPcGVyYXRvci5yaWdodFNlbGVjdC5nZXRTZWxlY3RlZEZpZWxkcygpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJTZXQgb3BlcmF0b3IgZXJyb3IgKHVuaW9uIC8gaW50ZXJzZWN0IC8gZXhjZXB0KTogc2VsZWN0ZWQgZmllbGRzIGFyZSBub3QgdGhlIHNhbWUgb3IgYXJlIGluIGEgZGlmZmVyZW50IG9yZGVyXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxlZnRTZWxlY3QuYWRkU2V0T3BlcmF0b3JzKHNldE9wZXJhdG9ycyk7XG4gIH07XG59XG5jb25zdCBnZXRTUUxpdGVTZXRPcGVyYXRvcnMgPSAoKSA9PiAoe1xuICB1bmlvbixcbiAgdW5pb25BbGwsXG4gIGludGVyc2VjdCxcbiAgZXhjZXB0XG59KTtcbmNvbnN0IHVuaW9uID0gY3JlYXRlU2V0T3BlcmF0b3IoXCJ1bmlvblwiLCBmYWxzZSk7XG5jb25zdCB1bmlvbkFsbCA9IGNyZWF0ZVNldE9wZXJhdG9yKFwidW5pb25cIiwgdHJ1ZSk7XG5jb25zdCBpbnRlcnNlY3QgPSBjcmVhdGVTZXRPcGVyYXRvcihcImludGVyc2VjdFwiLCBmYWxzZSk7XG5jb25zdCBleGNlcHQgPSBjcmVhdGVTZXRPcGVyYXRvcihcImV4Y2VwdFwiLCBmYWxzZSk7XG5leHBvcnQge1xuICBTUUxpdGVTZWxlY3RCYXNlLFxuICBTUUxpdGVTZWxlY3RCdWlsZGVyLFxuICBTUUxpdGVTZWxlY3RRdWVyeUJ1aWxkZXJCYXNlLFxuICBleGNlcHQsXG4gIGludGVyc2VjdCxcbiAgdW5pb24sXG4gIHVuaW9uQWxsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VsZWN0LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vc2VsZWN0aW9uLXByb3h5LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVEaWFsZWN0LCBTUUxpdGVTeW5jRGlhbGVjdCB9IGZyb20gXCIuLi9kaWFsZWN0LmpzXCI7XG5pbXBvcnQgeyBXaXRoU3VicXVlcnkgfSBmcm9tIFwiLi4vLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVNlbGVjdEJ1aWxkZXIgfSBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmNsYXNzIFF1ZXJ5QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVF1ZXJ5QnVpbGRlclwiO1xuICBkaWFsZWN0O1xuICBkaWFsZWN0Q29uZmlnO1xuICBjb25zdHJ1Y3RvcihkaWFsZWN0KSB7XG4gICAgdGhpcy5kaWFsZWN0ID0gaXMoZGlhbGVjdCwgU1FMaXRlRGlhbGVjdCkgPyBkaWFsZWN0IDogdm9pZCAwO1xuICAgIHRoaXMuZGlhbGVjdENvbmZpZyA9IGlzKGRpYWxlY3QsIFNRTGl0ZURpYWxlY3QpID8gdm9pZCAwIDogZGlhbGVjdDtcbiAgfVxuICAkd2l0aCA9IChhbGlhcywgc2VsZWN0aW9uKSA9PiB7XG4gICAgY29uc3QgcXVlcnlCdWlsZGVyID0gdGhpcztcbiAgICBjb25zdCBhcyA9IChxYikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBxYiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHFiID0gcWIocXVlcnlCdWlsZGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICAgIG5ldyBXaXRoU3VicXVlcnkoXG4gICAgICAgICAgcWIuZ2V0U1FMKCksXG4gICAgICAgICAgc2VsZWN0aW9uID8/IChcImdldFNlbGVjdGVkRmllbGRzXCIgaW4gcWIgPyBxYi5nZXRTZWxlY3RlZEZpZWxkcygpID8/IHt9IDoge30pLFxuICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKSxcbiAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IGFsaWFzLCBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwiZXJyb3JcIiB9KVxuICAgICAgKTtcbiAgICB9O1xuICAgIHJldHVybiB7IGFzIH07XG4gIH07XG4gIHdpdGgoLi4ucXVlcmllcykge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGZ1bmN0aW9uIHNlbGVjdChmaWVsZHMpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7XG4gICAgICAgIGZpZWxkczogZmllbGRzID8/IHZvaWQgMCxcbiAgICAgICAgc2Vzc2lvbjogdm9pZCAwLFxuICAgICAgICBkaWFsZWN0OiBzZWxmLmdldERpYWxlY3QoKSxcbiAgICAgICAgd2l0aExpc3Q6IHF1ZXJpZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZWxlY3REaXN0aW5jdChmaWVsZHMpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7XG4gICAgICAgIGZpZWxkczogZmllbGRzID8/IHZvaWQgMCxcbiAgICAgICAgc2Vzc2lvbjogdm9pZCAwLFxuICAgICAgICBkaWFsZWN0OiBzZWxmLmdldERpYWxlY3QoKSxcbiAgICAgICAgd2l0aExpc3Q6IHF1ZXJpZXMsXG4gICAgICAgIGRpc3RpbmN0OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc2VsZWN0LCBzZWxlY3REaXN0aW5jdCB9O1xuICB9XG4gIHNlbGVjdChmaWVsZHMpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoeyBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsIHNlc3Npb246IHZvaWQgMCwgZGlhbGVjdDogdGhpcy5nZXREaWFsZWN0KCkgfSk7XG4gIH1cbiAgc2VsZWN0RGlzdGluY3QoZmllbGRzKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHtcbiAgICAgIGZpZWxkczogZmllbGRzID8/IHZvaWQgMCxcbiAgICAgIHNlc3Npb246IHZvaWQgMCxcbiAgICAgIGRpYWxlY3Q6IHRoaXMuZ2V0RGlhbGVjdCgpLFxuICAgICAgZGlzdGluY3Q6IHRydWVcbiAgICB9KTtcbiAgfVxuICAvLyBMYXp5IGxvYWQgZGlhbGVjdCB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5XG4gIGdldERpYWxlY3QoKSB7XG4gICAgaWYgKCF0aGlzLmRpYWxlY3QpIHtcbiAgICAgIHRoaXMuZGlhbGVjdCA9IG5ldyBTUUxpdGVTeW5jRGlhbGVjdCh0aGlzLmRpYWxlY3RDb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaWFsZWN0O1xuICB9XG59XG5leHBvcnQge1xuICBRdWVyeUJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1xdWVyeS1idWlsZGVyLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuaW1wb3J0IHsgUGFyYW0sIFNRTCwgc3FsIH0gZnJvbSBcIi4uLy4uL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW5zLCBUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgaGF2ZVNhbWVLZXlzLCBtYXBVcGRhdGVTZXQsIG9yZGVyU2VsZWN0ZWRGaWVsZHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IGV4dHJhY3RVc2VkVGFibGUgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXIuanNcIjtcbmNsYXNzIFNRTGl0ZUluc2VydEJ1aWxkZXIge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgc2Vzc2lvbiwgZGlhbGVjdCwgd2l0aExpc3QpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMud2l0aExpc3QgPSB3aXRoTGlzdDtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVJbnNlcnRCdWlsZGVyXCI7XG4gIHZhbHVlcyh2YWx1ZXMpIHtcbiAgICB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlcykgPyB2YWx1ZXMgOiBbdmFsdWVzXTtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidmFsdWVzKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBhdCBsZWFzdCBvbmUgdmFsdWVcIik7XG4gICAgfVxuICAgIGNvbnN0IG1hcHBlZFZhbHVlcyA9IHZhbHVlcy5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLnRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXTtcbiAgICAgIGZvciAoY29uc3QgY29sS2V5IG9mIE9iamVjdC5rZXlzKGVudHJ5KSkge1xuICAgICAgICBjb25zdCBjb2xWYWx1ZSA9IGVudHJ5W2NvbEtleV07XG4gICAgICAgIHJlc3VsdFtjb2xLZXldID0gaXMoY29sVmFsdWUsIFNRTCkgPyBjb2xWYWx1ZSA6IG5ldyBQYXJhbShjb2xWYWx1ZSwgY29sc1tjb2xLZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVJbnNlcnRCYXNlKHRoaXMudGFibGUsIG1hcHBlZFZhbHVlcywgdGhpcy5zZXNzaW9uLCB0aGlzLmRpYWxlY3QsIHRoaXMud2l0aExpc3QpO1xuICB9XG4gIHNlbGVjdChzZWxlY3RRdWVyeSkge1xuICAgIGNvbnN0IHNlbGVjdCA9IHR5cGVvZiBzZWxlY3RRdWVyeSA9PT0gXCJmdW5jdGlvblwiID8gc2VsZWN0UXVlcnkobmV3IFF1ZXJ5QnVpbGRlcigpKSA6IHNlbGVjdFF1ZXJ5O1xuICAgIGlmICghaXMoc2VsZWN0LCBTUUwpICYmICFoYXZlU2FtZUtleXModGhpcy50YWJsZVtDb2x1bW5zXSwgc2VsZWN0Ll8uc2VsZWN0ZWRGaWVsZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiSW5zZXJ0IHNlbGVjdCBlcnJvcjogc2VsZWN0ZWQgZmllbGRzIGFyZSBub3QgdGhlIHNhbWUgb3IgYXJlIGluIGEgZGlmZmVyZW50IG9yZGVyIGNvbXBhcmVkIHRvIHRoZSB0YWJsZSBkZWZpbml0aW9uXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU1FMaXRlSW5zZXJ0QmFzZSh0aGlzLnRhYmxlLCBzZWxlY3QsIHRoaXMuc2Vzc2lvbiwgdGhpcy5kaWFsZWN0LCB0aGlzLndpdGhMaXN0LCB0cnVlKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlSW5zZXJ0QmFzZSBleHRlbmRzIFF1ZXJ5UHJvbWlzZSB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCB2YWx1ZXMsIHNlc3Npb24sIGRpYWxlY3QsIHdpdGhMaXN0LCBzZWxlY3QpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLmNvbmZpZyA9IHsgdGFibGUsIHZhbHVlcywgd2l0aExpc3QsIHNlbGVjdCB9O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUluc2VydFwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbmZpZztcbiAgcmV0dXJuaW5nKGZpZWxkcyA9IHRoaXMuY29uZmlnLnRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5Db2x1bW5zXSkge1xuICAgIHRoaXMuY29uZmlnLnJldHVybmluZyA9IG9yZGVyU2VsZWN0ZWRGaWVsZHMoZmllbGRzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhbiBgb24gY29uZmxpY3QgZG8gbm90aGluZ2AgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBzaW1wbHkgYXZvaWRzIGluc2VydGluZyBhIHJvdyBhcyBpdHMgYWx0ZXJuYXRpdmUgYWN0aW9uLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2luc2VydCNvbi1jb25mbGljdC1kby1ub3RoaW5nfVxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIFRoZSBgdGFyZ2V0YCBhbmQgYHdoZXJlYCBjbGF1c2VzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiAvLyBJbnNlcnQgb25lIHJvdyBhbmQgY2FuY2VsIHRoZSBpbnNlcnQgaWYgdGhlcmUncyBhIGNvbmZsaWN0XG4gICAqIGF3YWl0IGRiLmluc2VydChjYXJzKVxuICAgKiAgIC52YWx1ZXMoeyBpZDogMSwgYnJhbmQ6ICdCTVcnIH0pXG4gICAqICAgLm9uQ29uZmxpY3REb05vdGhpbmcoKTtcbiAgICpcbiAgICogLy8gRXhwbGljaXRseSBzcGVjaWZ5IGNvbmZsaWN0IHRhcmdldFxuICAgKiBhd2FpdCBkYi5pbnNlcnQoY2FycylcbiAgICogICAudmFsdWVzKHsgaWQ6IDEsIGJyYW5kOiAnQk1XJyB9KVxuICAgKiAgIC5vbkNvbmZsaWN0RG9Ob3RoaW5nKHsgdGFyZ2V0OiBjYXJzLmlkIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIG9uQ29uZmxpY3REb05vdGhpbmcoY29uZmlnID0ge30pIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLm9uQ29uZmxpY3QpIHRoaXMuY29uZmlnLm9uQ29uZmxpY3QgPSBbXTtcbiAgICBpZiAoY29uZmlnLnRhcmdldCA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLmNvbmZpZy5vbkNvbmZsaWN0LnB1c2goc3FsYCBvbiBjb25mbGljdCBkbyBub3RoaW5nYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhcmdldFNxbCA9IEFycmF5LmlzQXJyYXkoY29uZmlnLnRhcmdldCkgPyBzcWxgJHtjb25maWcudGFyZ2V0fWAgOiBzcWxgJHtbY29uZmlnLnRhcmdldF19YDtcbiAgICAgIGNvbnN0IHdoZXJlU3FsID0gY29uZmlnLndoZXJlID8gc3FsYCB3aGVyZSAke2NvbmZpZy53aGVyZX1gIDogc3FsYGA7XG4gICAgICB0aGlzLmNvbmZpZy5vbkNvbmZsaWN0LnB1c2goc3FsYCBvbiBjb25mbGljdCAke3RhcmdldFNxbH0gZG8gbm90aGluZyR7d2hlcmVTcWx9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGFuIGBvbiBjb25mbGljdCBkbyB1cGRhdGVgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIGV4aXN0aW5nIHJvdyB0aGF0IGNvbmZsaWN0cyB3aXRoIHRoZSByb3cgcHJvcG9zZWQgZm9yIGluc2VydGlvbiBhcyBpdHMgYWx0ZXJuYXRpdmUgYWN0aW9uLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2luc2VydCN1cHNlcnRzLWFuZC1jb25mbGljdHN9XG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgVGhlIGB0YXJnZXRgLCBgc2V0YCBhbmQgYHdoZXJlYCBjbGF1c2VzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiAvLyBVcGRhdGUgdGhlIHJvdyBpZiB0aGVyZSdzIGEgY29uZmxpY3RcbiAgICogYXdhaXQgZGIuaW5zZXJ0KGNhcnMpXG4gICAqICAgLnZhbHVlcyh7IGlkOiAxLCBicmFuZDogJ0JNVycgfSlcbiAgICogICAub25Db25mbGljdERvVXBkYXRlKHtcbiAgICogICAgIHRhcmdldDogY2Fycy5pZCxcbiAgICogICAgIHNldDogeyBicmFuZDogJ1BvcnNjaGUnIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogLy8gVXBzZXJ0IHdpdGggJ3doZXJlJyBjbGF1c2VcbiAgICogYXdhaXQgZGIuaW5zZXJ0KGNhcnMpXG4gICAqICAgLnZhbHVlcyh7IGlkOiAxLCBicmFuZDogJ0JNVycgfSlcbiAgICogICAub25Db25mbGljdERvVXBkYXRlKHtcbiAgICogICAgIHRhcmdldDogY2Fycy5pZCxcbiAgICogICAgIHNldDogeyBicmFuZDogJ25ld0JNVycgfSxcbiAgICogICAgIHdoZXJlOiBzcWxgJHtjYXJzLmNyZWF0ZWRBdH0gPiAnMjAyMy0wMS0wMSc6OmRhdGVgLFxuICAgKiAgIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIG9uQ29uZmxpY3REb1VwZGF0ZShjb25maWcpIHtcbiAgICBpZiAoY29uZmlnLndoZXJlICYmIChjb25maWcudGFyZ2V0V2hlcmUgfHwgY29uZmlnLnNldFdoZXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnWW91IGNhbm5vdCB1c2UgYm90aCBcIndoZXJlXCIgYW5kIFwidGFyZ2V0V2hlcmVcIi9cInNldFdoZXJlXCIgYXQgdGhlIHNhbWUgdGltZSAtIFwid2hlcmVcIiBpcyBkZXByZWNhdGVkLCB1c2UgXCJ0YXJnZXRXaGVyZVwiIG9yIFwic2V0V2hlcmVcIiBpbnN0ZWFkLidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghdGhpcy5jb25maWcub25Db25mbGljdCkgdGhpcy5jb25maWcub25Db25mbGljdCA9IFtdO1xuICAgIGNvbnN0IHdoZXJlU3FsID0gY29uZmlnLndoZXJlID8gc3FsYCB3aGVyZSAke2NvbmZpZy53aGVyZX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IHRhcmdldFdoZXJlU3FsID0gY29uZmlnLnRhcmdldFdoZXJlID8gc3FsYCB3aGVyZSAke2NvbmZpZy50YXJnZXRXaGVyZX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IHNldFdoZXJlU3FsID0gY29uZmlnLnNldFdoZXJlID8gc3FsYCB3aGVyZSAke2NvbmZpZy5zZXRXaGVyZX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IHRhcmdldFNxbCA9IEFycmF5LmlzQXJyYXkoY29uZmlnLnRhcmdldCkgPyBzcWxgJHtjb25maWcudGFyZ2V0fWAgOiBzcWxgJHtbY29uZmlnLnRhcmdldF19YDtcbiAgICBjb25zdCBzZXRTcWwgPSB0aGlzLmRpYWxlY3QuYnVpbGRVcGRhdGVTZXQodGhpcy5jb25maWcudGFibGUsIG1hcFVwZGF0ZVNldCh0aGlzLmNvbmZpZy50YWJsZSwgY29uZmlnLnNldCkpO1xuICAgIHRoaXMuY29uZmlnLm9uQ29uZmxpY3QucHVzaChcbiAgICAgIHNxbGAgb24gY29uZmxpY3QgJHt0YXJnZXRTcWx9JHt0YXJnZXRXaGVyZVNxbH0gZG8gdXBkYXRlIHNldCAke3NldFNxbH0ke3doZXJlU3FsfSR7c2V0V2hlcmVTcWx9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbGVjdC5idWlsZEluc2VydFF1ZXJ5KHRoaXMuY29uZmlnKTtcbiAgfVxuICB0b1NRTCgpIHtcbiAgICBjb25zdCB7IHR5cGluZ3M6IF90eXBpbmdzLCAuLi5yZXN0IH0gPSB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKTtcbiAgICByZXR1cm4gcmVzdDtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9wcmVwYXJlKGlzT25lVGltZVF1ZXJ5ID0gdHJ1ZSkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25baXNPbmVUaW1lUXVlcnkgPyBcInByZXBhcmVPbmVUaW1lUXVlcnlcIiA6IFwicHJlcGFyZVF1ZXJ5XCJdKFxuICAgICAgdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSksXG4gICAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcsXG4gICAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPyBcImFsbFwiIDogXCJydW5cIixcbiAgICAgIHRydWUsXG4gICAgICB2b2lkIDAsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiaW5zZXJ0XCIsXG4gICAgICAgIHRhYmxlczogZXh0cmFjdFVzZWRUYWJsZSh0aGlzLmNvbmZpZy50YWJsZSlcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByZXBhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpO1xuICB9XG4gIHJ1biA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkucnVuKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYWxsID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5hbGwocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBnZXQgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmdldChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIHZhbHVlcyA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkudmFsdWVzKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucmV0dXJuaW5nID8gdGhpcy5hbGwoKSA6IHRoaXMucnVuKCk7XG4gIH1cbiAgJGR5bmFtaWMoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZUluc2VydEJhc2UsXG4gIFNRTGl0ZUluc2VydEJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnNlcnQuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi8uLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5pbXBvcnQgeyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vc2VsZWN0aW9uLXByb3h5LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi4vLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlLmpzXCI7XG5pbXBvcnQge1xuICBnZXRUYWJsZUxpa2VOYW1lLFxuICBtYXBVcGRhdGVTZXQsXG4gIG9yZGVyU2VsZWN0ZWRGaWVsZHNcbn0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuLi8uLi92aWV3LWNvbW1vbi5qc1wiO1xuaW1wb3J0IHsgZXh0cmFjdFVzZWRUYWJsZSB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVmlld0Jhc2UgfSBmcm9tIFwiLi4vdmlldy1iYXNlLmpzXCI7XG5jbGFzcyBTUUxpdGVVcGRhdGVCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IodGFibGUsIHNlc3Npb24sIGRpYWxlY3QsIHdpdGhMaXN0KSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLndpdGhMaXN0ID0gd2l0aExpc3Q7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVXBkYXRlQnVpbGRlclwiO1xuICBzZXQodmFsdWVzKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVVcGRhdGVCYXNlKFxuICAgICAgdGhpcy50YWJsZSxcbiAgICAgIG1hcFVwZGF0ZVNldCh0aGlzLnRhYmxlLCB2YWx1ZXMpLFxuICAgICAgdGhpcy5zZXNzaW9uLFxuICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgdGhpcy53aXRoTGlzdFxuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVVwZGF0ZUJhc2UgZXh0ZW5kcyBRdWVyeVByb21pc2Uge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgc2V0LCBzZXNzaW9uLCBkaWFsZWN0LCB3aXRoTGlzdCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuY29uZmlnID0geyBzZXQsIHRhYmxlLCB3aXRoTGlzdCwgam9pbnM6IFtdIH07XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVXBkYXRlXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uZmlnO1xuICBmcm9tKHNvdXJjZSkge1xuICAgIHRoaXMuY29uZmlnLmZyb20gPSBzb3VyY2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgY3JlYXRlSm9pbihqb2luVHlwZSkge1xuICAgIHJldHVybiAodGFibGUsIG9uKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSBnZXRUYWJsZUxpa2VOYW1lKHRhYmxlKTtcbiAgICAgIGlmICh0eXBlb2YgdGFibGVOYW1lID09PSBcInN0cmluZ1wiICYmIHRoaXMuY29uZmlnLmpvaW5zLnNvbWUoKGpvaW4pID0+IGpvaW4uYWxpYXMgPT09IHRhYmxlTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbGlhcyBcIiR7dGFibGVOYW1lfVwiIGlzIGFscmVhZHkgdXNlZCBpbiB0aGlzIHF1ZXJ5YCk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgZnJvbSA9IHRoaXMuY29uZmlnLmZyb20gPyBpcyh0YWJsZSwgU1FMaXRlVGFibGUpID8gdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdIDogaXModGFibGUsIFN1YnF1ZXJ5KSA/IHRhYmxlLl8uc2VsZWN0ZWRGaWVsZHMgOiBpcyh0YWJsZSwgU1FMaXRlVmlld0Jhc2UpID8gdGFibGVbVmlld0Jhc2VDb25maWddLnNlbGVjdGVkRmllbGRzIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgICBvbiA9IG9uKFxuICAgICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSxcbiAgICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwic3FsXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgICAgKSxcbiAgICAgICAgICBmcm9tICYmIG5ldyBQcm94eShcbiAgICAgICAgICAgIGZyb20sXG4gICAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcInNxbFwiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uZmlnLmpvaW5zLnB1c2goeyBvbiwgdGFibGUsIGpvaW5UeXBlLCBhbGlhczogdGFibGVOYW1lIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfVxuICBsZWZ0Sm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImxlZnRcIik7XG4gIHJpZ2h0Sm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcInJpZ2h0XCIpO1xuICBpbm5lckpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJpbm5lclwiKTtcbiAgZnVsbEpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJmdWxsXCIpO1xuICAvKipcbiAgICogQWRkcyBhICd3aGVyZScgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSBvbmx5IHRob3NlIHJvd3MgdGhhdCBmdWxmaWxsIGEgc3BlY2lmaWVkIGNvbmRpdGlvbi5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy91cGRhdGV9XG4gICAqXG4gICAqIEBwYXJhbSB3aGVyZSB0aGUgJ3doZXJlJyBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFlvdSBjYW4gdXNlIGNvbmRpdGlvbmFsIG9wZXJhdG9ycyBhbmQgYHNxbCBmdW5jdGlvbmAgdG8gZmlsdGVyIHRoZSByb3dzIHRvIGJlIHVwZGF0ZWQuXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFVwZGF0ZSBhbGwgY2FycyB3aXRoIGdyZWVuIGNvbG9yXG4gICAqIGRiLnVwZGF0ZShjYXJzKS5zZXQoeyBjb2xvcjogJ3JlZCcgfSlcbiAgICogICAud2hlcmUoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJykpO1xuICAgKiAvLyBvclxuICAgKiBkYi51cGRhdGUoY2Fycykuc2V0KHsgY29sb3I6ICdyZWQnIH0pXG4gICAqICAgLndoZXJlKHNxbGAke2NhcnMuY29sb3J9ID0gJ2dyZWVuJ2ApXG4gICAqIGBgYFxuICAgKlxuICAgKiBZb3UgY2FuIGxvZ2ljYWxseSBjb21iaW5lIGNvbmRpdGlvbmFsIG9wZXJhdG9ycyB3aXRoIGBhbmQoKWAgYW5kIGBvcigpYCBvcGVyYXRvcnM6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFVwZGF0ZSBhbGwgQk1XIGNhcnMgd2l0aCBhIGdyZWVuIGNvbG9yXG4gICAqIGRiLnVwZGF0ZShjYXJzKS5zZXQoeyBjb2xvcjogJ3JlZCcgfSlcbiAgICogICAud2hlcmUoYW5kKGVxKGNhcnMuY29sb3IsICdncmVlbicpLCBlcShjYXJzLmJyYW5kLCAnQk1XJykpKTtcbiAgICpcbiAgICogLy8gVXBkYXRlIGFsbCBjYXJzIHdpdGggdGhlIGdyZWVuIG9yIGJsdWUgY29sb3JcbiAgICogZGIudXBkYXRlKGNhcnMpLnNldCh7IGNvbG9yOiAncmVkJyB9KVxuICAgKiAgIC53aGVyZShvcihlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSwgZXEoY2Fycy5jb2xvciwgJ2JsdWUnKSkpO1xuICAgKiBgYGBcbiAgICovXG4gIHdoZXJlKHdoZXJlKSB7XG4gICAgdGhpcy5jb25maWcud2hlcmUgPSB3aGVyZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcmRlckJ5KC4uLmNvbHVtbnMpIHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbnNbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3Qgb3JkZXJCeSA9IGNvbHVtbnNbMF0oXG4gICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICB0aGlzLmNvbmZpZy50YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10sXG4gICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgY29uc3Qgb3JkZXJCeUFycmF5ID0gQXJyYXkuaXNBcnJheShvcmRlckJ5KSA/IG9yZGVyQnkgOiBbb3JkZXJCeV07XG4gICAgICB0aGlzLmNvbmZpZy5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcmRlckJ5QXJyYXkgPSBjb2x1bW5zO1xuICAgICAgdGhpcy5jb25maWcub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgbGltaXQobGltaXQpIHtcbiAgICB0aGlzLmNvbmZpZy5saW1pdCA9IGxpbWl0O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHJldHVybmluZyhmaWVsZHMgPSB0aGlzLmNvbmZpZy50YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuQ29sdW1uc10pIHtcbiAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPSBvcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbGVjdC5idWlsZFVwZGF0ZVF1ZXJ5KHRoaXMuY29uZmlnKTtcbiAgfVxuICB0b1NRTCgpIHtcbiAgICBjb25zdCB7IHR5cGluZ3M6IF90eXBpbmdzLCAuLi5yZXN0IH0gPSB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKTtcbiAgICByZXR1cm4gcmVzdDtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9wcmVwYXJlKGlzT25lVGltZVF1ZXJ5ID0gdHJ1ZSkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25baXNPbmVUaW1lUXVlcnkgPyBcInByZXBhcmVPbmVUaW1lUXVlcnlcIiA6IFwicHJlcGFyZVF1ZXJ5XCJdKFxuICAgICAgdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSksXG4gICAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcsXG4gICAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPyBcImFsbFwiIDogXCJydW5cIixcbiAgICAgIHRydWUsXG4gICAgICB2b2lkIDAsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiaW5zZXJ0XCIsXG4gICAgICAgIHRhYmxlczogZXh0cmFjdFVzZWRUYWJsZSh0aGlzLmNvbmZpZy50YWJsZSlcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByZXBhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpO1xuICB9XG4gIHJ1biA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkucnVuKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYWxsID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5hbGwocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBnZXQgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmdldChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIHZhbHVlcyA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkudmFsdWVzKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucmV0dXJuaW5nID8gdGhpcy5hbGwoKSA6IHRoaXMucnVuKCk7XG4gIH1cbiAgJGR5bmFtaWMoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZVVwZGF0ZUJhc2UsXG4gIFNRTGl0ZVVwZGF0ZUJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11cGRhdGUuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU1FMLCBzcWwgfSBmcm9tIFwiLi4vLi4vc3FsL3NxbC5qc1wiO1xuY2xhc3MgU1FMaXRlQ291bnRCdWlsZGVyIGV4dGVuZHMgU1FMIHtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoU1FMaXRlQ291bnRCdWlsZGVyLmJ1aWxkRW1iZWRkZWRDb3VudChwYXJhbXMuc291cmNlLCBwYXJhbXMuZmlsdGVycykucXVlcnlDaHVua3MpO1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMuc2Vzc2lvbiA9IHBhcmFtcy5zZXNzaW9uO1xuICAgIHRoaXMuc3FsID0gU1FMaXRlQ291bnRCdWlsZGVyLmJ1aWxkQ291bnQoXG4gICAgICBwYXJhbXMuc291cmNlLFxuICAgICAgcGFyYW1zLmZpbHRlcnNcbiAgICApO1xuICB9XG4gIHNxbDtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQ291bnRCdWlsZGVyQXN5bmNcIjtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ10gPSBcIlNRTGl0ZUNvdW50QnVpbGRlckFzeW5jXCI7XG4gIHNlc3Npb247XG4gIHN0YXRpYyBidWlsZEVtYmVkZGVkQ291bnQoc291cmNlLCBmaWx0ZXJzKSB7XG4gICAgcmV0dXJuIHNxbGAoc2VsZWN0IGNvdW50KCopIGZyb20gJHtzb3VyY2V9JHtzcWwucmF3KFwiIHdoZXJlIFwiKS5pZihmaWx0ZXJzKX0ke2ZpbHRlcnN9KWA7XG4gIH1cbiAgc3RhdGljIGJ1aWxkQ291bnQoc291cmNlLCBmaWx0ZXJzKSB7XG4gICAgcmV0dXJuIHNxbGBzZWxlY3QgY291bnQoKikgZnJvbSAke3NvdXJjZX0ke3NxbC5yYXcoXCIgd2hlcmUgXCIpLmlmKGZpbHRlcnMpfSR7ZmlsdGVyc31gO1xuICB9XG4gIHRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuc2Vzc2lvbi5jb3VudCh0aGlzLnNxbCkpLnRoZW4oXG4gICAgICBvbmZ1bGZpbGxlZCxcbiAgICAgIG9ucmVqZWN0ZWRcbiAgICApO1xuICB9XG4gIGNhdGNoKG9uUmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKHZvaWQgMCwgb25SZWplY3RlZCk7XG4gIH1cbiAgZmluYWxseShvbkZpbmFsbHkpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKFxuICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgIG9uRmluYWxseT8uKCk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICAocmVhc29uKSA9PiB7XG4gICAgICAgIG9uRmluYWxseT8uKCk7XG4gICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5leHBvcnQge1xuICBTUUxpdGVDb3VudEJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb3VudC5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuaW1wb3J0IHtcbiAgbWFwUmVsYXRpb25hbFJvd1xufSBmcm9tIFwiLi4vLi4vcmVsYXRpb25zLmpzXCI7XG5jbGFzcyBSZWxhdGlvbmFsUXVlcnlCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IobW9kZSwgZnVsbFNjaGVtYSwgc2NoZW1hLCB0YWJsZU5hbWVzTWFwLCB0YWJsZSwgdGFibGVDb25maWcsIGRpYWxlY3QsIHNlc3Npb24pIHtcbiAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgIHRoaXMuZnVsbFNjaGVtYSA9IGZ1bGxTY2hlbWE7XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy50YWJsZU5hbWVzTWFwID0gdGFibGVOYW1lc01hcDtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy50YWJsZUNvbmZpZyA9IHRhYmxlQ29uZmlnO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVBc3luY1JlbGF0aW9uYWxRdWVyeUJ1aWxkZXJcIjtcbiAgZmluZE1hbnkoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gXCJzeW5jXCIgPyBuZXcgU1FMaXRlU3luY1JlbGF0aW9uYWxRdWVyeShcbiAgICAgIHRoaXMuZnVsbFNjaGVtYSxcbiAgICAgIHRoaXMuc2NoZW1hLFxuICAgICAgdGhpcy50YWJsZU5hbWVzTWFwLFxuICAgICAgdGhpcy50YWJsZSxcbiAgICAgIHRoaXMudGFibGVDb25maWcsXG4gICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICB0aGlzLnNlc3Npb24sXG4gICAgICBjb25maWcgPyBjb25maWcgOiB7fSxcbiAgICAgIFwibWFueVwiXG4gICAgKSA6IG5ldyBTUUxpdGVSZWxhdGlvbmFsUXVlcnkoXG4gICAgICB0aGlzLmZ1bGxTY2hlbWEsXG4gICAgICB0aGlzLnNjaGVtYSxcbiAgICAgIHRoaXMudGFibGVOYW1lc01hcCxcbiAgICAgIHRoaXMudGFibGUsXG4gICAgICB0aGlzLnRhYmxlQ29uZmlnLFxuICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgdGhpcy5zZXNzaW9uLFxuICAgICAgY29uZmlnID8gY29uZmlnIDoge30sXG4gICAgICBcIm1hbnlcIlxuICAgICk7XG4gIH1cbiAgZmluZEZpcnN0KGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09IFwic3luY1wiID8gbmV3IFNRTGl0ZVN5bmNSZWxhdGlvbmFsUXVlcnkoXG4gICAgICB0aGlzLmZ1bGxTY2hlbWEsXG4gICAgICB0aGlzLnNjaGVtYSxcbiAgICAgIHRoaXMudGFibGVOYW1lc01hcCxcbiAgICAgIHRoaXMudGFibGUsXG4gICAgICB0aGlzLnRhYmxlQ29uZmlnLFxuICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgdGhpcy5zZXNzaW9uLFxuICAgICAgY29uZmlnID8geyAuLi5jb25maWcsIGxpbWl0OiAxIH0gOiB7IGxpbWl0OiAxIH0sXG4gICAgICBcImZpcnN0XCJcbiAgICApIDogbmV3IFNRTGl0ZVJlbGF0aW9uYWxRdWVyeShcbiAgICAgIHRoaXMuZnVsbFNjaGVtYSxcbiAgICAgIHRoaXMuc2NoZW1hLFxuICAgICAgdGhpcy50YWJsZU5hbWVzTWFwLFxuICAgICAgdGhpcy50YWJsZSxcbiAgICAgIHRoaXMudGFibGVDb25maWcsXG4gICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICB0aGlzLnNlc3Npb24sXG4gICAgICBjb25maWcgPyB7IC4uLmNvbmZpZywgbGltaXQ6IDEgfSA6IHsgbGltaXQ6IDEgfSxcbiAgICAgIFwiZmlyc3RcIlxuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVJlbGF0aW9uYWxRdWVyeSBleHRlbmRzIFF1ZXJ5UHJvbWlzZSB7XG4gIGNvbnN0cnVjdG9yKGZ1bGxTY2hlbWEsIHNjaGVtYSwgdGFibGVOYW1lc01hcCwgdGFibGUsIHRhYmxlQ29uZmlnLCBkaWFsZWN0LCBzZXNzaW9uLCBjb25maWcsIG1vZGUpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZnVsbFNjaGVtYSA9IGZ1bGxTY2hlbWE7XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy50YWJsZU5hbWVzTWFwID0gdGFibGVOYW1lc01hcDtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy50YWJsZUNvbmZpZyA9IHRhYmxlQ29uZmlnO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUFzeW5jUmVsYXRpb25hbFF1ZXJ5XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbW9kZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbGVjdC5idWlsZFJlbGF0aW9uYWxRdWVyeSh7XG4gICAgICBmdWxsU2NoZW1hOiB0aGlzLmZ1bGxTY2hlbWEsXG4gICAgICBzY2hlbWE6IHRoaXMuc2NoZW1hLFxuICAgICAgdGFibGVOYW1lc01hcDogdGhpcy50YWJsZU5hbWVzTWFwLFxuICAgICAgdGFibGU6IHRoaXMudGFibGUsXG4gICAgICB0YWJsZUNvbmZpZzogdGhpcy50YWJsZUNvbmZpZyxcbiAgICAgIHF1ZXJ5Q29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIHRhYmxlQWxpYXM6IHRoaXMudGFibGVDb25maWcudHNOYW1lXG4gICAgfSkuc3FsO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ByZXBhcmUoaXNPbmVUaW1lUXVlcnkgPSBmYWxzZSkge1xuICAgIGNvbnN0IHsgcXVlcnksIGJ1aWx0UXVlcnkgfSA9IHRoaXMuX3RvU1FMKCk7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbltpc09uZVRpbWVRdWVyeSA/IFwicHJlcGFyZU9uZVRpbWVRdWVyeVwiIDogXCJwcmVwYXJlUXVlcnlcIl0oXG4gICAgICBidWlsdFF1ZXJ5LFxuICAgICAgdm9pZCAwLFxuICAgICAgdGhpcy5tb2RlID09PSBcImZpcnN0XCIgPyBcImdldFwiIDogXCJhbGxcIixcbiAgICAgIHRydWUsXG4gICAgICAocmF3Um93cywgbWFwQ29sdW1uVmFsdWUpID0+IHtcbiAgICAgICAgY29uc3Qgcm93cyA9IHJhd1Jvd3MubWFwKFxuICAgICAgICAgIChyb3cpID0+IG1hcFJlbGF0aW9uYWxSb3codGhpcy5zY2hlbWEsIHRoaXMudGFibGVDb25maWcsIHJvdywgcXVlcnkuc2VsZWN0aW9uLCBtYXBDb2x1bW5WYWx1ZSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gXCJmaXJzdFwiKSB7XG4gICAgICAgICAgcmV0dXJuIHJvd3NbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3M7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwcmVwYXJlKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKTtcbiAgfVxuICBfdG9TUUwoKSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLmRpYWxlY3QuYnVpbGRSZWxhdGlvbmFsUXVlcnkoe1xuICAgICAgZnVsbFNjaGVtYTogdGhpcy5mdWxsU2NoZW1hLFxuICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgIHRhYmxlTmFtZXNNYXA6IHRoaXMudGFibGVOYW1lc01hcCxcbiAgICAgIHRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgdGFibGVDb25maWc6IHRoaXMudGFibGVDb25maWcsXG4gICAgICBxdWVyeUNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICB0YWJsZUFsaWFzOiB0aGlzLnRhYmxlQ29uZmlnLnRzTmFtZVxuICAgIH0pO1xuICAgIGNvbnN0IGJ1aWx0UXVlcnkgPSB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeShxdWVyeS5zcWwpO1xuICAgIHJldHVybiB7IHF1ZXJ5LCBidWlsdFF1ZXJ5IH07XG4gIH1cbiAgdG9TUUwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RvU1FMKCkuYnVpbHRRdWVyeTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGV4ZWN1dGVSYXcoKSB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gXCJmaXJzdFwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSkuZ2V0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKS5hbGwoKTtcbiAgfVxuICBhc3luYyBleGVjdXRlKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVSYXcoKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlU3luY1JlbGF0aW9uYWxRdWVyeSBleHRlbmRzIFNRTGl0ZVJlbGF0aW9uYWxRdWVyeSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVN5bmNSZWxhdGlvbmFsUXVlcnlcIjtcbiAgc3luYygpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmF3KCk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFJlbGF0aW9uYWxRdWVyeUJ1aWxkZXIsXG4gIFNRTGl0ZVJlbGF0aW9uYWxRdWVyeSxcbiAgU1FMaXRlU3luY1JlbGF0aW9uYWxRdWVyeVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1ZXJ5LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi8uLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5jbGFzcyBTUUxpdGVSYXcgZXh0ZW5kcyBRdWVyeVByb21pc2Uge1xuICBjb25zdHJ1Y3RvcihleGVjdXRlLCBnZXRTUUwsIGFjdGlvbiwgZGlhbGVjdCwgbWFwQmF0Y2hSZXN1bHQpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZXhlY3V0ZSA9IGV4ZWN1dGU7XG4gICAgdGhpcy5nZXRTUUwgPSBnZXRTUUw7XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLm1hcEJhdGNoUmVzdWx0ID0gbWFwQmF0Y2hSZXN1bHQ7XG4gICAgdGhpcy5jb25maWcgPSB7IGFjdGlvbiB9O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVJhd1wiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbmZpZztcbiAgZ2V0UXVlcnkoKSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSksIG1ldGhvZDogdGhpcy5jb25maWcuYWN0aW9uIH07XG4gIH1cbiAgbWFwUmVzdWx0KHJlc3VsdCwgaXNGcm9tQmF0Y2gpIHtcbiAgICByZXR1cm4gaXNGcm9tQmF0Y2ggPyB0aGlzLm1hcEJhdGNoUmVzdWx0KHJlc3VsdCkgOiByZXN1bHQ7XG4gIH1cbiAgX3ByZXBhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBpc1Jlc3BvbnNlSW5BcnJheU1vZGUoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5leHBvcnQge1xuICBTUUxpdGVSYXdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYXcuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU2VsZWN0aW9uUHJveHlIYW5kbGVyIH0gZnJvbSBcIi4uL3NlbGVjdGlvbi1wcm94eS5qc1wiO1xuaW1wb3J0IHsgc3FsIH0gZnJvbSBcIi4uL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7XG4gIFF1ZXJ5QnVpbGRlcixcbiAgU1FMaXRlRGVsZXRlQmFzZSxcbiAgU1FMaXRlSW5zZXJ0QnVpbGRlcixcbiAgU1FMaXRlU2VsZWN0QnVpbGRlcixcbiAgU1FMaXRlVXBkYXRlQnVpbGRlclxufSBmcm9tIFwiLi9xdWVyeS1idWlsZGVycy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgV2l0aFN1YnF1ZXJ5IH0gZnJvbSBcIi4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb3VudEJ1aWxkZXIgfSBmcm9tIFwiLi9xdWVyeS1idWlsZGVycy9jb3VudC5qc1wiO1xuaW1wb3J0IHsgUmVsYXRpb25hbFF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXJzL3F1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVSYXcgfSBmcm9tIFwiLi9xdWVyeS1idWlsZGVycy9yYXcuanNcIjtcbmNsYXNzIEJhc2VTUUxpdGVEYXRhYmFzZSB7XG4gIGNvbnN0cnVjdG9yKHJlc3VsdEtpbmQsIGRpYWxlY3QsIHNlc3Npb24sIHNjaGVtYSkge1xuICAgIHRoaXMucmVzdWx0S2luZCA9IHJlc3VsdEtpbmQ7XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuXyA9IHNjaGVtYSA/IHtcbiAgICAgIHNjaGVtYTogc2NoZW1hLnNjaGVtYSxcbiAgICAgIGZ1bGxTY2hlbWE6IHNjaGVtYS5mdWxsU2NoZW1hLFxuICAgICAgdGFibGVOYW1lc01hcDogc2NoZW1hLnRhYmxlTmFtZXNNYXBcbiAgICB9IDoge1xuICAgICAgc2NoZW1hOiB2b2lkIDAsXG4gICAgICBmdWxsU2NoZW1hOiB7fSxcbiAgICAgIHRhYmxlTmFtZXNNYXA6IHt9XG4gICAgfTtcbiAgICB0aGlzLnF1ZXJ5ID0ge307XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnF1ZXJ5O1xuICAgIGlmICh0aGlzLl8uc2NoZW1hKSB7XG4gICAgICBmb3IgKGNvbnN0IFt0YWJsZU5hbWUsIGNvbHVtbnNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuXy5zY2hlbWEpKSB7XG4gICAgICAgIHF1ZXJ5W3RhYmxlTmFtZV0gPSBuZXcgUmVsYXRpb25hbFF1ZXJ5QnVpbGRlcihcbiAgICAgICAgICByZXN1bHRLaW5kLFxuICAgICAgICAgIHNjaGVtYS5mdWxsU2NoZW1hLFxuICAgICAgICAgIHRoaXMuXy5zY2hlbWEsXG4gICAgICAgICAgdGhpcy5fLnRhYmxlTmFtZXNNYXAsXG4gICAgICAgICAgc2NoZW1hLmZ1bGxTY2hlbWFbdGFibGVOYW1lXSxcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGRpYWxlY3QsXG4gICAgICAgICAgc2Vzc2lvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiRjYWNoZSA9IHsgaW52YWxpZGF0ZTogYXN5bmMgKF9wYXJhbXMpID0+IHtcbiAgICB9IH07XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQmFzZVNRTGl0ZURhdGFiYXNlXCI7XG4gIHF1ZXJ5O1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHN1YnF1ZXJ5IHRoYXQgZGVmaW5lcyBhIHRlbXBvcmFyeSBuYW1lZCByZXN1bHQgc2V0IGFzIGEgQ1RFLlxuICAgKlxuICAgKiBJdCBpcyB1c2VmdWwgZm9yIGJyZWFraW5nIGRvd24gY29tcGxleCBxdWVyaWVzIGludG8gc2ltcGxlciBwYXJ0cyBhbmQgZm9yIHJldXNpbmcgdGhlIHJlc3VsdCBzZXQgaW4gc3Vic2VxdWVudCBwYXJ0cyBvZiB0aGUgcXVlcnkuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2VsZWN0I3dpdGgtY2xhdXNlfVxuICAgKlxuICAgKiBAcGFyYW0gYWxpYXMgVGhlIGFsaWFzIGZvciB0aGUgc3VicXVlcnkuXG4gICAqXG4gICAqIEZhaWx1cmUgdG8gcHJvdmlkZSBhbiBhbGlhcyB3aWxsIHJlc3VsdCBpbiBhIERyaXp6bGVUeXBlRXJyb3IsIHByZXZlbnRpbmcgdGhlIHN1YnF1ZXJ5IGZyb20gYmVpbmcgcmVmZXJlbmNlZCBpbiBvdGhlciBxdWVyaWVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBDcmVhdGUgYSBzdWJxdWVyeSB3aXRoIGFsaWFzICdzcScgYW5kIHVzZSBpdCBpbiB0aGUgc2VsZWN0IHF1ZXJ5XG4gICAqIGNvbnN0IHNxID0gZGIuJHdpdGgoJ3NxJykuYXMoZGIuc2VsZWN0KCkuZnJvbSh1c2Vycykud2hlcmUoZXEodXNlcnMuaWQsIDQyKSkpO1xuICAgKlxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi53aXRoKHNxKS5zZWxlY3QoKS5mcm9tKHNxKTtcbiAgICogYGBgXG4gICAqXG4gICAqIFRvIHNlbGVjdCBhcmJpdHJhcnkgU1FMIHZhbHVlcyBhcyBmaWVsZHMgaW4gYSBDVEUgYW5kIHJlZmVyZW5jZSB0aGVtIGluIG90aGVyIENURXMgb3IgaW4gdGhlIG1haW4gcXVlcnksIHlvdSBuZWVkIHRvIGFkZCBhbGlhc2VzIHRvIHRoZW06XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbiBhcmJpdHJhcnkgU1FMIHZhbHVlIGFzIGEgZmllbGQgaW4gYSBDVEUgYW5kIHJlZmVyZW5jZSBpdCBpbiB0aGUgbWFpbiBxdWVyeVxuICAgKiBjb25zdCBzcSA9IGRiLiR3aXRoKCdzcScpLmFzKGRiLnNlbGVjdCh7XG4gICAqICAgbmFtZTogc3FsPHN0cmluZz5gdXBwZXIoJHt1c2Vycy5uYW1lfSlgLmFzKCduYW1lJyksXG4gICAqIH0pXG4gICAqIC5mcm9tKHVzZXJzKSk7XG4gICAqXG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLndpdGgoc3EpLnNlbGVjdCh7IG5hbWU6IHNxLm5hbWUgfSkuZnJvbShzcSk7XG4gICAqIGBgYFxuICAgKi9cbiAgJHdpdGggPSAoYWxpYXMsIHNlbGVjdGlvbikgPT4ge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGFzID0gKHFiKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHFiID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcWIgPSBxYihuZXcgUXVlcnlCdWlsZGVyKHNlbGYuZGlhbGVjdCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQcm94eShcbiAgICAgICAgbmV3IFdpdGhTdWJxdWVyeShcbiAgICAgICAgICBxYi5nZXRTUUwoKSxcbiAgICAgICAgICBzZWxlY3Rpb24gPz8gKFwiZ2V0U2VsZWN0ZWRGaWVsZHNcIiBpbiBxYiA/IHFiLmdldFNlbGVjdGVkRmllbGRzKCkgPz8ge30gOiB7fSksXG4gICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApLFxuICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgYWxpYXMsIHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJlcnJvclwiIH0pXG4gICAgICApO1xuICAgIH07XG4gICAgcmV0dXJuIHsgYXMgfTtcbiAgfTtcbiAgJGNvdW50KHNvdXJjZSwgZmlsdGVycykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQ291bnRCdWlsZGVyKHsgc291cmNlLCBmaWx0ZXJzLCBzZXNzaW9uOiB0aGlzLnNlc3Npb24gfSk7XG4gIH1cbiAgLyoqXG4gICAqIEluY29ycG9yYXRlcyBhIHByZXZpb3VzbHkgZGVmaW5lZCBDVEUgKHVzaW5nIGAkd2l0aGApIGludG8gdGhlIG1haW4gcXVlcnkuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyB0aGUgbWFpbiBxdWVyeSB0byByZWZlcmVuY2UgYSB0ZW1wb3JhcnkgbmFtZWQgcmVzdWx0IHNldC5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZWxlY3Qjd2l0aC1jbGF1c2V9XG4gICAqXG4gICAqIEBwYXJhbSBxdWVyaWVzIFRoZSBDVEVzIHRvIGluY29ycG9yYXRlIGludG8gdGhlIG1haW4gcXVlcnkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIERlZmluZSBhIHN1YnF1ZXJ5ICdzcScgYXMgYSBDVEUgdXNpbmcgJHdpdGhcbiAgICogY29uc3Qgc3EgPSBkYi4kd2l0aCgnc3EnKS5hcyhkYi5zZWxlY3QoKS5mcm9tKHVzZXJzKS53aGVyZShlcSh1c2Vycy5pZCwgNDIpKSk7XG4gICAqXG4gICAqIC8vIEluY29ycG9yYXRlIHRoZSBDVEUgJ3NxJyBpbnRvIHRoZSBtYWluIHF1ZXJ5IGFuZCBzZWxlY3QgZnJvbSBpdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi53aXRoKHNxKS5zZWxlY3QoKS5mcm9tKHNxKTtcbiAgICogYGBgXG4gICAqL1xuICB3aXRoKC4uLnF1ZXJpZXMpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBmdW5jdGlvbiBzZWxlY3QoZmllbGRzKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoe1xuICAgICAgICBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsXG4gICAgICAgIHNlc3Npb246IHNlbGYuc2Vzc2lvbixcbiAgICAgICAgZGlhbGVjdDogc2VsZi5kaWFsZWN0LFxuICAgICAgICB3aXRoTGlzdDogcXVlcmllc1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNlbGVjdERpc3RpbmN0KGZpZWxkcykge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHtcbiAgICAgICAgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLFxuICAgICAgICBzZXNzaW9uOiBzZWxmLnNlc3Npb24sXG4gICAgICAgIGRpYWxlY3Q6IHNlbGYuZGlhbGVjdCxcbiAgICAgICAgd2l0aExpc3Q6IHF1ZXJpZXMsXG4gICAgICAgIGRpc3RpbmN0OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlKHRhYmxlKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVVwZGF0ZUJ1aWxkZXIodGFibGUsIHNlbGYuc2Vzc2lvbiwgc2VsZi5kaWFsZWN0LCBxdWVyaWVzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW5zZXJ0KGludG8pIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlSW5zZXJ0QnVpbGRlcihpbnRvLCBzZWxmLnNlc3Npb24sIHNlbGYuZGlhbGVjdCwgcXVlcmllcyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlbGV0ZV8oZnJvbSkge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVEZWxldGVCYXNlKGZyb20sIHNlbGYuc2Vzc2lvbiwgc2VsZi5kaWFsZWN0LCBxdWVyaWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc2VsZWN0LCBzZWxlY3REaXN0aW5jdCwgdXBkYXRlLCBpbnNlcnQsIGRlbGV0ZTogZGVsZXRlXyB9O1xuICB9XG4gIHNlbGVjdChmaWVsZHMpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoeyBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsIHNlc3Npb246IHRoaXMuc2Vzc2lvbiwgZGlhbGVjdDogdGhpcy5kaWFsZWN0IH0pO1xuICB9XG4gIHNlbGVjdERpc3RpbmN0KGZpZWxkcykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7XG4gICAgICBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsXG4gICAgICBzZXNzaW9uOiB0aGlzLnNlc3Npb24sXG4gICAgICBkaWFsZWN0OiB0aGlzLmRpYWxlY3QsXG4gICAgICBkaXN0aW5jdDogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIHVwZGF0ZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRob3V0IGAud2hlcmUoKWAgY2xhdXNlIHdpbGwgdXBkYXRlIGFsbCByb3dzIGluIGEgdGFibGUuIFRoZSBgLndoZXJlKClgIGNsYXVzZSBzcGVjaWZpZXMgd2hpY2ggcm93cyBzaG91bGQgYmUgdXBkYXRlZC5cbiAgICpcbiAgICogVXNlIGAuc2V0KClgIG1ldGhvZCB0byBzcGVjaWZ5IHdoaWNoIHZhbHVlcyB0byB1cGRhdGUuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvdXBkYXRlfVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHRvIHVwZGF0ZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gVXBkYXRlIGFsbCByb3dzIGluIHRoZSAnY2FycycgdGFibGVcbiAgICogYXdhaXQgZGIudXBkYXRlKGNhcnMpLnNldCh7IGNvbG9yOiAncmVkJyB9KTtcbiAgICpcbiAgICogLy8gVXBkYXRlIHJvd3Mgd2l0aCBmaWx0ZXJzIGFuZCBjb25kaXRpb25zXG4gICAqIGF3YWl0IGRiLnVwZGF0ZShjYXJzKS5zZXQoeyBjb2xvcjogJ3JlZCcgfSkud2hlcmUoZXEoY2Fycy5icmFuZCwgJ0JNVycpKTtcbiAgICpcbiAgICogLy8gVXBkYXRlIHdpdGggcmV0dXJuaW5nIGNsYXVzZVxuICAgKiBjb25zdCB1cGRhdGVkQ2FyOiBDYXJbXSA9IGF3YWl0IGRiLnVwZGF0ZShjYXJzKVxuICAgKiAgIC5zZXQoeyBjb2xvcjogJ3JlZCcgfSlcbiAgICogICAud2hlcmUoZXEoY2Fycy5pZCwgMSkpXG4gICAqICAgLnJldHVybmluZygpO1xuICAgKiBgYGBcbiAgICovXG4gIHVwZGF0ZSh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVXBkYXRlQnVpbGRlcih0YWJsZSwgdGhpcy5zZXNzaW9uLCB0aGlzLmRpYWxlY3QpO1xuICB9XG4gICRjYWNoZTtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zZXJ0IHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgY3JlYXRlIG5ldyByb3dzIGluIGEgdGFibGUuIFVzZSBgLnZhbHVlcygpYCBtZXRob2QgdG8gc3BlY2lmeSB3aGljaCB2YWx1ZXMgdG8gaW5zZXJ0LlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2luc2VydH1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB0byBpbnNlcnQgaW50by5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gSW5zZXJ0IG9uZSByb3dcbiAgICogYXdhaXQgZGIuaW5zZXJ0KGNhcnMpLnZhbHVlcyh7IGJyYW5kOiAnQk1XJyB9KTtcbiAgICpcbiAgICogLy8gSW5zZXJ0IG11bHRpcGxlIHJvd3NcbiAgICogYXdhaXQgZGIuaW5zZXJ0KGNhcnMpLnZhbHVlcyhbeyBicmFuZDogJ0JNVycgfSwgeyBicmFuZDogJ1BvcnNjaGUnIH1dKTtcbiAgICpcbiAgICogLy8gSW5zZXJ0IHdpdGggcmV0dXJuaW5nIGNsYXVzZVxuICAgKiBjb25zdCBpbnNlcnRlZENhcjogQ2FyW10gPSBhd2FpdCBkYi5pbnNlcnQoY2FycylcbiAgICogICAudmFsdWVzKHsgYnJhbmQ6ICdCTVcnIH0pXG4gICAqICAgLnJldHVybmluZygpO1xuICAgKiBgYGBcbiAgICovXG4gIGluc2VydChpbnRvKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVJbnNlcnRCdWlsZGVyKGludG8sIHRoaXMuc2Vzc2lvbiwgdGhpcy5kaWFsZWN0KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhIGRlbGV0ZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRob3V0IGAud2hlcmUoKWAgY2xhdXNlIHdpbGwgZGVsZXRlIGFsbCByb3dzIGluIGEgdGFibGUuIFRoZSBgLndoZXJlKClgIGNsYXVzZSBzcGVjaWZpZXMgd2hpY2ggcm93cyBzaG91bGQgYmUgZGVsZXRlZC5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9kZWxldGV9XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgdG8gZGVsZXRlIGZyb20uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIERlbGV0ZSBhbGwgcm93cyBpbiB0aGUgJ2NhcnMnIHRhYmxlXG4gICAqIGF3YWl0IGRiLmRlbGV0ZShjYXJzKTtcbiAgICpcbiAgICogLy8gRGVsZXRlIHJvd3Mgd2l0aCBmaWx0ZXJzIGFuZCBjb25kaXRpb25zXG4gICAqIGF3YWl0IGRiLmRlbGV0ZShjYXJzKS53aGVyZShlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSk7XG4gICAqXG4gICAqIC8vIERlbGV0ZSB3aXRoIHJldHVybmluZyBjbGF1c2VcbiAgICogY29uc3QgZGVsZXRlZENhcjogQ2FyW10gPSBhd2FpdCBkYi5kZWxldGUoY2FycylcbiAgICogICAud2hlcmUoZXEoY2Fycy5pZCwgMSkpXG4gICAqICAgLnJldHVybmluZygpO1xuICAgKiBgYGBcbiAgICovXG4gIGRlbGV0ZShmcm9tKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVEZWxldGVCYXNlKGZyb20sIHRoaXMuc2Vzc2lvbiwgdGhpcy5kaWFsZWN0KTtcbiAgfVxuICBydW4ocXVlcnkpIHtcbiAgICBjb25zdCBzZXF1ZWwgPSB0eXBlb2YgcXVlcnkgPT09IFwic3RyaW5nXCIgPyBzcWwucmF3KHF1ZXJ5KSA6IHF1ZXJ5LmdldFNRTCgpO1xuICAgIGlmICh0aGlzLnJlc3VsdEtpbmQgPT09IFwiYXN5bmNcIikge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVSYXcoXG4gICAgICAgIGFzeW5jICgpID0+IHRoaXMuc2Vzc2lvbi5ydW4oc2VxdWVsKSxcbiAgICAgICAgKCkgPT4gc2VxdWVsLFxuICAgICAgICBcInJ1blwiLFxuICAgICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICAgIHRoaXMuc2Vzc2lvbi5leHRyYWN0UmF3UnVuVmFsdWVGcm9tQmF0Y2hSZXN1bHQuYmluZCh0aGlzLnNlc3Npb24pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnJ1bihzZXF1ZWwpO1xuICB9XG4gIGFsbChxdWVyeSkge1xuICAgIGNvbnN0IHNlcXVlbCA9IHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiA/IHNxbC5yYXcocXVlcnkpIDogcXVlcnkuZ2V0U1FMKCk7XG4gICAgaWYgKHRoaXMucmVzdWx0S2luZCA9PT0gXCJhc3luY1wiKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVJhdyhcbiAgICAgICAgYXN5bmMgKCkgPT4gdGhpcy5zZXNzaW9uLmFsbChzZXF1ZWwpLFxuICAgICAgICAoKSA9PiBzZXF1ZWwsXG4gICAgICAgIFwiYWxsXCIsXG4gICAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgICAgdGhpcy5zZXNzaW9uLmV4dHJhY3RSYXdBbGxWYWx1ZUZyb21CYXRjaFJlc3VsdC5iaW5kKHRoaXMuc2Vzc2lvbilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlc3Npb24uYWxsKHNlcXVlbCk7XG4gIH1cbiAgZ2V0KHF1ZXJ5KSB7XG4gICAgY29uc3Qgc2VxdWVsID0gdHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiID8gc3FsLnJhdyhxdWVyeSkgOiBxdWVyeS5nZXRTUUwoKTtcbiAgICBpZiAodGhpcy5yZXN1bHRLaW5kID09PSBcImFzeW5jXCIpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlUmF3KFxuICAgICAgICBhc3luYyAoKSA9PiB0aGlzLnNlc3Npb24uZ2V0KHNlcXVlbCksXG4gICAgICAgICgpID0+IHNlcXVlbCxcbiAgICAgICAgXCJnZXRcIixcbiAgICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgICB0aGlzLnNlc3Npb24uZXh0cmFjdFJhd0dldFZhbHVlRnJvbUJhdGNoUmVzdWx0LmJpbmQodGhpcy5zZXNzaW9uKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXQoc2VxdWVsKTtcbiAgfVxuICB2YWx1ZXMocXVlcnkpIHtcbiAgICBjb25zdCBzZXF1ZWwgPSB0eXBlb2YgcXVlcnkgPT09IFwic3RyaW5nXCIgPyBzcWwucmF3KHF1ZXJ5KSA6IHF1ZXJ5LmdldFNRTCgpO1xuICAgIGlmICh0aGlzLnJlc3VsdEtpbmQgPT09IFwiYXN5bmNcIikge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVSYXcoXG4gICAgICAgIGFzeW5jICgpID0+IHRoaXMuc2Vzc2lvbi52YWx1ZXMoc2VxdWVsKSxcbiAgICAgICAgKCkgPT4gc2VxdWVsLFxuICAgICAgICBcInZhbHVlc1wiLFxuICAgICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICAgIHRoaXMuc2Vzc2lvbi5leHRyYWN0UmF3VmFsdWVzVmFsdWVGcm9tQmF0Y2hSZXN1bHQuYmluZCh0aGlzLnNlc3Npb24pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnZhbHVlcyhzZXF1ZWwpO1xuICB9XG4gIHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uLCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uLCBjb25maWcpO1xuICB9XG59XG5jb25zdCB3aXRoUmVwbGljYXMgPSAocHJpbWFyeSwgcmVwbGljYXMsIGdldFJlcGxpY2EgPSAoKSA9PiByZXBsaWNhc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiByZXBsaWNhcy5sZW5ndGgpXSkgPT4ge1xuICBjb25zdCBzZWxlY3QgPSAoLi4uYXJncykgPT4gZ2V0UmVwbGljYShyZXBsaWNhcykuc2VsZWN0KC4uLmFyZ3MpO1xuICBjb25zdCBzZWxlY3REaXN0aW5jdCA9ICguLi5hcmdzKSA9PiBnZXRSZXBsaWNhKHJlcGxpY2FzKS5zZWxlY3REaXN0aW5jdCguLi5hcmdzKTtcbiAgY29uc3QgJGNvdW50ID0gKC4uLmFyZ3MpID0+IGdldFJlcGxpY2EocmVwbGljYXMpLiRjb3VudCguLi5hcmdzKTtcbiAgY29uc3QgJHdpdGggPSAoLi4uYXJncykgPT4gZ2V0UmVwbGljYShyZXBsaWNhcykud2l0aCguLi5hcmdzKTtcbiAgY29uc3QgdXBkYXRlID0gKC4uLmFyZ3MpID0+IHByaW1hcnkudXBkYXRlKC4uLmFyZ3MpO1xuICBjb25zdCBpbnNlcnQgPSAoLi4uYXJncykgPT4gcHJpbWFyeS5pbnNlcnQoLi4uYXJncyk7XG4gIGNvbnN0ICRkZWxldGUgPSAoLi4uYXJncykgPT4gcHJpbWFyeS5kZWxldGUoLi4uYXJncyk7XG4gIGNvbnN0IHJ1biA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LnJ1biguLi5hcmdzKTtcbiAgY29uc3QgYWxsID0gKC4uLmFyZ3MpID0+IHByaW1hcnkuYWxsKC4uLmFyZ3MpO1xuICBjb25zdCBnZXQgPSAoLi4uYXJncykgPT4gcHJpbWFyeS5nZXQoLi4uYXJncyk7XG4gIGNvbnN0IHZhbHVlcyA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LnZhbHVlcyguLi5hcmdzKTtcbiAgY29uc3QgdHJhbnNhY3Rpb24gPSAoLi4uYXJncykgPT4gcHJpbWFyeS50cmFuc2FjdGlvbiguLi5hcmdzKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5wcmltYXJ5LFxuICAgIHVwZGF0ZSxcbiAgICBpbnNlcnQsXG4gICAgZGVsZXRlOiAkZGVsZXRlLFxuICAgIHJ1bixcbiAgICBhbGwsXG4gICAgZ2V0LFxuICAgIHZhbHVlcyxcbiAgICB0cmFuc2FjdGlvbixcbiAgICAkcHJpbWFyeTogcHJpbWFyeSxcbiAgICBzZWxlY3QsXG4gICAgc2VsZWN0RGlzdGluY3QsXG4gICAgJGNvdW50LFxuICAgIHdpdGg6ICR3aXRoLFxuICAgIGdldCBxdWVyeSgpIHtcbiAgICAgIHJldHVybiBnZXRSZXBsaWNhKHJlcGxpY2FzKS5xdWVyeTtcbiAgICB9XG4gIH07XG59O1xuZXhwb3J0IHtcbiAgQmFzZVNRTGl0ZURhdGFiYXNlLFxuICB3aXRoUmVwbGljYXNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5jbGFzcyBDYWNoZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkNhY2hlXCI7XG59XG5jbGFzcyBOb29wQ2FjaGUgZXh0ZW5kcyBDYWNoZSB7XG4gIHN0cmF0ZWd5KCkge1xuICAgIHJldHVybiBcImFsbFwiO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIk5vb3BDYWNoZVwiO1xuICBhc3luYyBnZXQoX2tleSkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgYXN5bmMgcHV0KF9oYXNoZWRRdWVyeSwgX3Jlc3BvbnNlLCBfdGFibGVzLCBfY29uZmlnKSB7XG4gIH1cbiAgYXN5bmMgb25NdXRhdGUoX3BhcmFtcykge1xuICB9XG59XG5hc3luYyBmdW5jdGlvbiBoYXNoUXVlcnkoc3FsLCBwYXJhbXMpIHtcbiAgY29uc3QgZGF0YVRvSGFzaCA9IGAke3NxbH0tJHtKU09OLnN0cmluZ2lmeShwYXJhbXMpfWA7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgY29uc3QgZGF0YSA9IGVuY29kZXIuZW5jb2RlKGRhdGFUb0hhc2gpO1xuICBjb25zdCBoYXNoQnVmZmVyID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoXCJTSEEtMjU2XCIsIGRhdGEpO1xuICBjb25zdCBoYXNoQXJyYXkgPSBbLi4ubmV3IFVpbnQ4QXJyYXkoaGFzaEJ1ZmZlcildO1xuICBjb25zdCBoYXNoSGV4ID0gaGFzaEFycmF5Lm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKS5qb2luKFwiXCIpO1xuICByZXR1cm4gaGFzaEhleDtcbn1cbmV4cG9ydCB7XG4gIENhY2hlLFxuICBOb29wQ2FjaGUsXG4gIGhhc2hRdWVyeVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNhY2hlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgaGFzaFF1ZXJ5LCBOb29wQ2FjaGUgfSBmcm9tIFwiLi4vY2FjaGUvY29yZS9jYWNoZS5qc1wiO1xuaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBEcml6emxlRXJyb3IsIERyaXp6bGVRdWVyeUVycm9yLCBUcmFuc2FjdGlvblJvbGxiYWNrRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuaW1wb3J0IHsgQmFzZVNRTGl0ZURhdGFiYXNlIH0gZnJvbSBcIi4vZGIuanNcIjtcbmNsYXNzIEV4ZWN1dGVSZXN1bHRTeW5jIGV4dGVuZHMgUXVlcnlQcm9taXNlIHtcbiAgY29uc3RydWN0b3IocmVzdWx0Q2IpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVzdWx0Q2IgPSByZXN1bHRDYjtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJFeGVjdXRlUmVzdWx0U3luY1wiO1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIHJldHVybiB0aGlzLnJlc3VsdENiKCk7XG4gIH1cbiAgc3luYygpIHtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHRDYigpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVQcmVwYXJlZFF1ZXJ5IHtcbiAgY29uc3RydWN0b3IobW9kZSwgZXhlY3V0ZU1ldGhvZCwgcXVlcnksIGNhY2hlLCBxdWVyeU1ldGFkYXRhLCBjYWNoZUNvbmZpZykge1xuICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgdGhpcy5leGVjdXRlTWV0aG9kID0gZXhlY3V0ZU1ldGhvZDtcbiAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7XG4gICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xuICAgIHRoaXMucXVlcnlNZXRhZGF0YSA9IHF1ZXJ5TWV0YWRhdGE7XG4gICAgdGhpcy5jYWNoZUNvbmZpZyA9IGNhY2hlQ29uZmlnO1xuICAgIGlmIChjYWNoZSAmJiBjYWNoZS5zdHJhdGVneSgpID09PSBcImFsbFwiICYmIGNhY2hlQ29uZmlnID09PSB2b2lkIDApIHtcbiAgICAgIHRoaXMuY2FjaGVDb25maWcgPSB7IGVuYWJsZTogdHJ1ZSwgYXV0b0ludmFsaWRhdGU6IHRydWUgfTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNhY2hlQ29uZmlnPy5lbmFibGUpIHtcbiAgICAgIHRoaXMuY2FjaGVDb25maWcgPSB2b2lkIDA7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlByZXBhcmVkUXVlcnlcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBqb2luc05vdE51bGxhYmxlTWFwO1xuICAvKiogQGludGVybmFsICovXG4gIGFzeW5jIHF1ZXJ5V2l0aENhY2hlKHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIHF1ZXJ5KSB7XG4gICAgaWYgKHRoaXMuY2FjaGUgPT09IHZvaWQgMCB8fCBpcyh0aGlzLmNhY2hlLCBOb29wQ2FjaGUpIHx8IHRoaXMucXVlcnlNZXRhZGF0YSA9PT0gdm9pZCAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcXVlcnkoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IERyaXp6bGVRdWVyeUVycm9yKHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jYWNoZUNvbmZpZyAmJiAhdGhpcy5jYWNoZUNvbmZpZy5lbmFibGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBxdWVyeSgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRHJpenpsZVF1ZXJ5RXJyb3IocXVlcnlTdHJpbmcsIHBhcmFtcywgZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgodGhpcy5xdWVyeU1ldGFkYXRhLnR5cGUgPT09IFwiaW5zZXJ0XCIgfHwgdGhpcy5xdWVyeU1ldGFkYXRhLnR5cGUgPT09IFwidXBkYXRlXCIgfHwgdGhpcy5xdWVyeU1ldGFkYXRhLnR5cGUgPT09IFwiZGVsZXRlXCIpICYmIHRoaXMucXVlcnlNZXRhZGF0YS50YWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgW3Jlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgcXVlcnkoKSxcbiAgICAgICAgICB0aGlzLmNhY2hlLm9uTXV0YXRlKHsgdGFibGVzOiB0aGlzLnF1ZXJ5TWV0YWRhdGEudGFibGVzIH0pXG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRHJpenpsZVF1ZXJ5RXJyb3IocXVlcnlTdHJpbmcsIHBhcmFtcywgZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5jYWNoZUNvbmZpZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBEcml6emxlUXVlcnlFcnJvcihxdWVyeVN0cmluZywgcGFyYW1zLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMucXVlcnlNZXRhZGF0YS50eXBlID09PSBcInNlbGVjdFwiKSB7XG4gICAgICBjb25zdCBmcm9tQ2FjaGUgPSBhd2FpdCB0aGlzLmNhY2hlLmdldChcbiAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy50YWcgPz8gKGF3YWl0IGhhc2hRdWVyeShxdWVyeVN0cmluZywgcGFyYW1zKSksXG4gICAgICAgIHRoaXMucXVlcnlNZXRhZGF0YS50YWJsZXMsXG4gICAgICAgIHRoaXMuY2FjaGVDb25maWcudGFnICE9PSB2b2lkIDAsXG4gICAgICAgIHRoaXMuY2FjaGVDb25maWcuYXV0b0ludmFsaWRhdGVcbiAgICAgICk7XG4gICAgICBpZiAoZnJvbUNhY2hlID09PSB2b2lkIDApIHtcbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCBxdWVyeSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IERyaXp6bGVRdWVyeUVycm9yKHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIGUpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuY2FjaGUucHV0KFxuICAgICAgICAgIHRoaXMuY2FjaGVDb25maWcudGFnID8/IChhd2FpdCBoYXNoUXVlcnkocXVlcnlTdHJpbmcsIHBhcmFtcykpLFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAvLyBtYWtlIHN1cmUgd2Ugc2VuZCB0YWJsZXMgdGhhdCB3ZXJlIHVzZWQgaW4gYSBxdWVyeSBvbmx5IGlmIHVzZXIgd2FudHMgdG8gaW52YWxpZGF0ZSBpdCBvbiBlYWNoIHdyaXRlXG4gICAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy5hdXRvSW52YWxpZGF0ZSA/IHRoaXMucXVlcnlNZXRhZGF0YS50YWJsZXMgOiBbXSxcbiAgICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLnRhZyAhPT0gdm9pZCAwLFxuICAgICAgICAgIHRoaXMuY2FjaGVDb25maWcuY29uZmlnXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUNhY2hlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5KCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IERyaXp6bGVRdWVyeUVycm9yKHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIGUpO1xuICAgIH1cbiAgfVxuICBnZXRRdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeTtcbiAgfVxuICBtYXBSdW5SZXN1bHQocmVzdWx0LCBfaXNGcm9tQmF0Y2gpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIG1hcEFsbFJlc3VsdChfcmVzdWx0LCBfaXNGcm9tQmF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgbWFwR2V0UmVzdWx0KF9yZXN1bHQsIF9pc0Zyb21CYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICBleGVjdXRlKHBsYWNlaG9sZGVyVmFsdWVzKSB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gXCJhc3luY1wiKSB7XG4gICAgICByZXR1cm4gdGhpc1t0aGlzLmV4ZWN1dGVNZXRob2RdKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBFeGVjdXRlUmVzdWx0U3luYygoKSA9PiB0aGlzW3RoaXMuZXhlY3V0ZU1ldGhvZF0ocGxhY2Vob2xkZXJWYWx1ZXMpKTtcbiAgfVxuICBtYXBSZXN1bHQocmVzcG9uc2UsIGlzRnJvbUJhdGNoKSB7XG4gICAgc3dpdGNoICh0aGlzLmV4ZWN1dGVNZXRob2QpIHtcbiAgICAgIGNhc2UgXCJydW5cIjoge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXBSdW5SZXN1bHQocmVzcG9uc2UsIGlzRnJvbUJhdGNoKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJhbGxcIjoge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXBBbGxSZXN1bHQocmVzcG9uc2UsIGlzRnJvbUJhdGNoKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJnZXRcIjoge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXBHZXRSZXN1bHQocmVzcG9uc2UsIGlzRnJvbUJhdGNoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVNlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihkaWFsZWN0KSB7XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVTZXNzaW9uXCI7XG4gIHByZXBhcmVPbmVUaW1lUXVlcnkocXVlcnksIGZpZWxkcywgZXhlY3V0ZU1ldGhvZCwgaXNSZXNwb25zZUluQXJyYXlNb2RlLCBjdXN0b21SZXN1bHRNYXBwZXIsIHF1ZXJ5TWV0YWRhdGEsIGNhY2hlQ29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZVF1ZXJ5KFxuICAgICAgcXVlcnksXG4gICAgICBmaWVsZHMsXG4gICAgICBleGVjdXRlTWV0aG9kLFxuICAgICAgaXNSZXNwb25zZUluQXJyYXlNb2RlLFxuICAgICAgY3VzdG9tUmVzdWx0TWFwcGVyLFxuICAgICAgcXVlcnlNZXRhZGF0YSxcbiAgICAgIGNhY2hlQ29uZmlnXG4gICAgKTtcbiAgfVxuICBydW4ocXVlcnkpIHtcbiAgICBjb25zdCBzdGF0aWNRdWVyeSA9IHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHF1ZXJ5KTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZU9uZVRpbWVRdWVyeShzdGF0aWNRdWVyeSwgdm9pZCAwLCBcInJ1blwiLCBmYWxzZSkucnVuKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRHJpenpsZUVycm9yKHsgY2F1c2U6IGVyciwgbWVzc2FnZTogYEZhaWxlZCB0byBydW4gdGhlIHF1ZXJ5ICcke3N0YXRpY1F1ZXJ5LnNxbH0nYCB9KTtcbiAgICB9XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBleHRyYWN0UmF3UnVuVmFsdWVGcm9tQmF0Y2hSZXN1bHQocmVzdWx0KSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBhbGwocXVlcnkpIHtcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlT25lVGltZVF1ZXJ5KHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHF1ZXJ5KSwgdm9pZCAwLCBcInJ1blwiLCBmYWxzZSkuYWxsKCk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBleHRyYWN0UmF3QWxsVmFsdWVGcm9tQmF0Y2hSZXN1bHQoX3Jlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICBnZXQocXVlcnkpIHtcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlT25lVGltZVF1ZXJ5KHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHF1ZXJ5KSwgdm9pZCAwLCBcInJ1blwiLCBmYWxzZSkuZ2V0KCk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBleHRyYWN0UmF3R2V0VmFsdWVGcm9tQmF0Y2hSZXN1bHQoX3Jlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICB2YWx1ZXMocXVlcnkpIHtcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlT25lVGltZVF1ZXJ5KHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHF1ZXJ5KSwgdm9pZCAwLCBcInJ1blwiLCBmYWxzZSkudmFsdWVzKCk7XG4gIH1cbiAgYXN5bmMgY291bnQoc3FsKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy52YWx1ZXMoc3FsKTtcbiAgICByZXR1cm4gcmVzdWx0WzBdWzBdO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZXh0cmFjdFJhd1ZhbHVlc1ZhbHVlRnJvbUJhdGNoUmVzdWx0KF9yZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVNRTGl0ZURhdGFiYXNlIHtcbiAgY29uc3RydWN0b3IocmVzdWx0VHlwZSwgZGlhbGVjdCwgc2Vzc2lvbiwgc2NoZW1hLCBuZXN0ZWRJbmRleCA9IDApIHtcbiAgICBzdXBlcihyZXN1bHRUeXBlLCBkaWFsZWN0LCBzZXNzaW9uLCBzY2hlbWEpO1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMubmVzdGVkSW5kZXggPSBuZXN0ZWRJbmRleDtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUcmFuc2FjdGlvblwiO1xuICByb2xsYmFjaygpIHtcbiAgICB0aHJvdyBuZXcgVHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yKCk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIEV4ZWN1dGVSZXN1bHRTeW5jLFxuICBTUUxpdGVQcmVwYXJlZFF1ZXJ5LFxuICBTUUxpdGVTZXNzaW9uLFxuICBTUUxpdGVUcmFuc2FjdGlvblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlc3Npb24uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5jbGFzcyBDb25zb2xlTG9nV3JpdGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQ29uc29sZUxvZ1dyaXRlclwiO1xuICB3cml0ZShtZXNzYWdlKSB7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG4gIH1cbn1cbmNsYXNzIERlZmF1bHRMb2dnZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJEZWZhdWx0TG9nZ2VyXCI7XG4gIHdyaXRlcjtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy53cml0ZXIgPSBjb25maWc/LndyaXRlciA/PyBuZXcgQ29uc29sZUxvZ1dyaXRlcigpO1xuICB9XG4gIGxvZ1F1ZXJ5KHF1ZXJ5LCBwYXJhbXMpIHtcbiAgICBjb25zdCBzdHJpbmdpZmllZFBhcmFtcyA9IHBhcmFtcy5tYXAoKHApID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHBhcmFtc1N0ciA9IHN0cmluZ2lmaWVkUGFyYW1zLmxlbmd0aCA/IGAgLS0gcGFyYW1zOiBbJHtzdHJpbmdpZmllZFBhcmFtcy5qb2luKFwiLCBcIil9XWAgOiBcIlwiO1xuICAgIHRoaXMud3JpdGVyLndyaXRlKGBRdWVyeTogJHtxdWVyeX0ke3BhcmFtc1N0cn1gKTtcbiAgfVxufVxuY2xhc3MgTm9vcExvZ2dlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIk5vb3BMb2dnZXJcIjtcbiAgbG9nUXVlcnkoKSB7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIENvbnNvbGVMb2dXcml0ZXIsXG4gIERlZmF1bHRMb2dnZXIsXG4gIE5vb3BMb2dnZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dnZXIuanMubWFwIiwKICAgICJpbXBvcnQgeyBfX2V4cG9ydCB9IGZyb20gXCIuLi9fdmlydHVhbC9yb2xsZG93bl9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBpbmRleCwgaW50ZWdlciwgcmVhbCwgc3FsaXRlVGFibGUsIHRleHQgfSBmcm9tIFwiZHJpenpsZS1vcm0vc3FsaXRlLWNvcmVcIjtcbmltcG9ydCB7IHJlbGF0aW9ucyB9IGZyb20gXCJkcml6emxlLW9ybVwiO1xuXG4vLyNyZWdpb24gc3JjL2RiL3NjaGVtYS50c1xudmFyIHNjaGVtYV9leHBvcnRzID0ge307XG5fX2V4cG9ydChzY2hlbWFfZXhwb3J0cywge1xuXHRjaGFyYWN0ZXJzOiAoKSA9PiBjaGFyYWN0ZXJzLFxuXHRjaGFyYWN0ZXJzUmVsYXRpb25zOiAoKSA9PiBjaGFyYWN0ZXJzUmVsYXRpb25zLFxuXHRtaW5pbmdGbGVldFBhcnRpY2lwYW50czogKCkgPT4gbWluaW5nRmxlZXRQYXJ0aWNpcGFudHMsXG5cdG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzUmVsYXRpb25zOiAoKSA9PiBtaW5pbmdGbGVldFBhcnRpY2lwYW50c1JlbGF0aW9ucyxcblx0bWluaW5nRmxlZXRzOiAoKSA9PiBtaW5pbmdGbGVldHMsXG5cdG1pbmluZ0ZsZWV0c1JlbGF0aW9uczogKCkgPT4gbWluaW5nRmxlZXRzUmVsYXRpb25zLFxuXHRyZXN1bWVDb21tYW5kczogKCkgPT4gcmVzdW1lQ29tbWFuZHMsXG5cdHNoYXJlZDogKCkgPT4gc2hhcmVkLFxuXHR1c2VyczogKCkgPT4gdXNlcnMsXG5cdHVzZXJzUmVsYXRpb25zOiAoKSA9PiB1c2Vyc1JlbGF0aW9uc1xufSk7XG5jb25zdCBzaGFyZWQgPSB7XG5cdGNyZWF0ZWRBdDogaW50ZWdlcihcImNyZWF0ZWRfYXRcIikubm90TnVsbCgpLFxuXHR1cGRhdGVkQXQ6IGludGVnZXIoXCJ1cGRhdGVkX2F0XCIpXG59O1xuY29uc3QgdXNlcnMgPSBzcWxpdGVUYWJsZShcInVzZXJzXCIsIHtcblx0aWQ6IGludGVnZXIoKS5wcmltYXJ5S2V5KCkudW5pcXVlKCkubm90TnVsbCgpLFxuXHRkaXNjb3JkSUQ6IHRleHQoXCJkaXNjb3JkX2lkXCIpLnVuaXF1ZSgpLm5vdE51bGwoKSxcblx0bWFpbkNoYXJhY3RlcjogaW50ZWdlcihcIm1haW5fY2hhcmFjdGVyXCIpLFxuXHQuLi5zaGFyZWRcbn0sICh0YWJsZSkgPT4gW2luZGV4KFwiaWR4X2Rpc2NvcmRfaWRcIikub24odGFibGUuZGlzY29yZElEKSwgaW5kZXgoXCJpZHhfbWFpbl9jaGFyYWN0ZXJcIikub24odGFibGUubWFpbkNoYXJhY3RlcildKTtcbmNvbnN0IHVzZXJzUmVsYXRpb25zID0gcmVsYXRpb25zKHVzZXJzLCAoeyBvbmUsIG1hbnkgfSkgPT4gKHtcblx0Y2hhcmFjdGVyczogbWFueShjaGFyYWN0ZXJzKSxcblx0bWFpbjogb25lKGNoYXJhY3RlcnMsIHtcblx0XHRmaWVsZHM6IFt1c2Vycy5tYWluQ2hhcmFjdGVyXSxcblx0XHRyZWZlcmVuY2VzOiBbY2hhcmFjdGVycy5pZF1cblx0fSlcbn0pKTtcbmNvbnN0IGNoYXJhY3RlcnMgPSBzcWxpdGVUYWJsZShcImNoYXJhY3RlcnNcIiwge1xuXHRpZDogaW50ZWdlcihcImlkXCIpLnByaW1hcnlLZXkoeyBhdXRvSW5jcmVtZW50OiB0cnVlIH0pLFxuXHRldmVJRDogaW50ZWdlcihcImV2ZV9pZFwiKS5ub3ROdWxsKCksXG5cdHVzZXJJRDogaW50ZWdlcihcInVzZXJfaWRcIikubm90TnVsbCgpLFxuXHRuYW1lOiB0ZXh0KCkubm90TnVsbCgpLFxuXHRhY2Nlc3NUb2tlbjogdGV4dChcImFjY2Vzc190b2tlblwiKS5ub3ROdWxsKCksXG5cdGV4cGlyZXNBdDogaW50ZWdlcihcImV4cGlyZXNfYXRcIikubm90TnVsbCgpLFxuXHRyZWZyZXNoVG9rZW46IHRleHQoXCJyZWZyZXNoX3Rva2VuXCIpLm5vdE51bGwoKSxcblx0Li4uc2hhcmVkXG59LCAodGFibGUpID0+IFtpbmRleChcImlkeF91c2VyX2lkXCIpLm9uKHRhYmxlLnVzZXJJRCksIGluZGV4KFwiaWR4X2V2ZV9pZFwiKS5vbih0YWJsZS5ldmVJRCldKTtcbmNvbnN0IGNoYXJhY3RlcnNSZWxhdGlvbnMgPSByZWxhdGlvbnMoY2hhcmFjdGVycywgKHsgb25lIH0pID0+ICh7IHVzZXI6IG9uZSh1c2Vycywge1xuXHRmaWVsZHM6IFtjaGFyYWN0ZXJzLnVzZXJJRF0sXG5cdHJlZmVyZW5jZXM6IFt1c2Vycy5pZF1cbn0pIH0pKTtcbmNvbnN0IHJlc3VtZUNvbW1hbmRzID0gc3FsaXRlVGFibGUoXCJyZXN1bWVjb21tYW5kc1wiLCB7XG5cdGlkOiB0ZXh0KCkucHJpbWFyeUtleSgpLFxuXHRjb21tYW5kOiB0ZXh0KCkubm90TnVsbCgpLFxuXHRwYXJhbXM6IHRleHQoKS5ub3ROdWxsKCksXG5cdGNvbnRleHQ6IHRleHQoKS5ub3ROdWxsKCksXG5cdC4uLnNoYXJlZFxufSk7XG5jb25zdCBtaW5pbmdGbGVldHMgPSBzcWxpdGVUYWJsZShcIm1pbmluZ19mbGVldHNcIiwge1xuXHRpZDogaW50ZWdlcihcImlkXCIpLnByaW1hcnlLZXkoeyBhdXRvSW5jcmVtZW50OiB0cnVlIH0pLFxuXHRuYW1lOiB0ZXh0KFwibmFtZVwiKS5ub3ROdWxsKCksXG5cdGRlc2NyaXB0aW9uOiB0ZXh0KFwiZGVzY3JpcHRpb25cIiksXG5cdGNyZWF0b3JEaXNjb3JkSWQ6IHRleHQoXCJjcmVhdG9yX2Rpc2NvcmRfaWRcIikubm90TnVsbCgpLFxuXHRzdGFydFRpbWU6IGludGVnZXIoXCJzdGFydF90aW1lXCIpLm5vdE51bGwoKSxcblx0ZW5kVGltZTogaW50ZWdlcihcImVuZF90aW1lXCIpLFxuXHRzdGF0dXM6IHRleHQoXCJzdGF0dXNcIiwgeyBlbnVtOiBbXG5cdFx0XCJjb25maWd1cmluZ1wiLFxuXHRcdFwiYWN0aXZlXCIsXG5cdFx0XCJlbmRlZFwiLFxuXHRcdFwiZ2VuZXJhdGluZ19yZXBvcnRcIixcblx0XHRcImNvbXBsZXRlZFwiLFxuXHRcdFwiZmFpbGVkXCJcblx0XSB9KS5ub3ROdWxsKCkuZGVmYXVsdChcImNvbmZpZ3VyaW5nXCIpLFxuXHR0YXhSYXRlOiByZWFsKFwidGF4X3JhdGVcIikubm90TnVsbCgpLmRlZmF1bHQoMCksXG5cdHB1YmxpY01lc3NhZ2VJZDogdGV4dChcInB1YmxpY19tZXNzYWdlX2lkXCIpLnVuaXF1ZSgpLFxuXHRwdWJsaWNDaGFubmVsSWQ6IHRleHQoXCJwdWJsaWNfY2hhbm5lbF9pZFwiKSxcblx0cmVwb3J0RGF0YTogdGV4dChcInJlcG9ydF9kYXRhXCIpLFxuXHRjcmVhdG9yRXBoZW1lcmFsTWVzc2FnZUlkOiB0ZXh0KFwiY3JlYXRvcl9lcGhlbWVyYWxfbWVzc2FnZV9pZFwiKSxcblx0Li4uc2hhcmVkXG59LCAodGFibGUpID0+IFtcblx0aW5kZXgoXCJpZHhfZmxlZXRfY3JlYXRvcl9kaXNjb3JkX2lkXCIpLm9uKHRhYmxlLmNyZWF0b3JEaXNjb3JkSWQpLFxuXHRpbmRleChcImlkeF9mbGVldF9zdGF0dXNcIikub24odGFibGUuc3RhdHVzKSxcblx0aW5kZXgoXCJpZHhfZmxlZXRfcHVibGljX21lc3NhZ2VfaWRcIikub24odGFibGUucHVibGljTWVzc2FnZUlkKVxuXSk7XG5jb25zdCBtaW5pbmdGbGVldFBhcnRpY2lwYW50cyA9IHNxbGl0ZVRhYmxlKFwibWluaW5nX2ZsZWV0X3BhcnRpY2lwYW50c1wiLCB7XG5cdGlkOiBpbnRlZ2VyKFwiaWRcIikucHJpbWFyeUtleSh7IGF1dG9JbmNyZW1lbnQ6IHRydWUgfSksXG5cdGZsZWV0SWQ6IGludGVnZXIoXCJmbGVldF9pZFwiKS5ub3ROdWxsKCkucmVmZXJlbmNlcygoKSA9PiBtaW5pbmdGbGVldHMuaWQsIHsgb25EZWxldGU6IFwiY2FzY2FkZVwiIH0pLFxuXHRjaGFyYWN0ZXJJZDogaW50ZWdlcihcImNoYXJhY3Rlcl9pZFwiKS5ub3ROdWxsKCkucmVmZXJlbmNlcygoKSA9PiBjaGFyYWN0ZXJzLmlkLCB7IG9uRGVsZXRlOiBcImNhc2NhZGVcIiB9KSxcblx0ZGlzY29yZElkOiB0ZXh0KFwiZGlzY29yZF9pZFwiKS5ub3ROdWxsKCksXG5cdHJvbGU6IHRleHQoXCJyb2xlXCIsIHsgZW51bTogW1xuXHRcdFwibWluZXJcIixcblx0XHRcInNlY3VyaXR5XCIsXG5cdFx0XCJoYXVsZXJcIlxuXHRdIH0pLm5vdE51bGwoKSxcblx0am9pblRpbWU6IGludGVnZXIoXCJqb2luX3RpbWVcIikubm90TnVsbCgpLFxuXHQuLi5zaGFyZWRcbn0sICh0YWJsZSkgPT4gW1xuXHRpbmRleChcImlkeF9wYXJ0aWNpcGFudF9mbGVldF9pZFwiKS5vbih0YWJsZS5mbGVldElkKSxcblx0aW5kZXgoXCJpZHhfcGFydGljaXBhbnRfY2hhcmFjdGVyX2lkXCIpLm9uKHRhYmxlLmNoYXJhY3RlcklkKSxcblx0aW5kZXgoXCJpZHhfcGFydGljaXBhbnRfZGlzY29yZF9pZFwiKS5vbih0YWJsZS5kaXNjb3JkSWQpXG5dKTtcbmNvbnN0IG1pbmluZ0ZsZWV0c1JlbGF0aW9ucyA9IHJlbGF0aW9ucyhtaW5pbmdGbGVldHMsICh7IG1hbnkgfSkgPT4gKHsgcGFydGljaXBhbnRzOiBtYW55KG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzKSB9KSk7XG5jb25zdCBtaW5pbmdGbGVldFBhcnRpY2lwYW50c1JlbGF0aW9ucyA9IHJlbGF0aW9ucyhtaW5pbmdGbGVldFBhcnRpY2lwYW50cywgKHsgb25lIH0pID0+ICh7XG5cdGZsZWV0OiBvbmUobWluaW5nRmxlZXRzLCB7XG5cdFx0ZmllbGRzOiBbbWluaW5nRmxlZXRQYXJ0aWNpcGFudHMuZmxlZXRJZF0sXG5cdFx0cmVmZXJlbmNlczogW21pbmluZ0ZsZWV0cy5pZF1cblx0fSksXG5cdGNoYXJhY3Rlcjogb25lKGNoYXJhY3RlcnMsIHtcblx0XHRmaWVsZHM6IFttaW5pbmdGbGVldFBhcnRpY2lwYW50cy5jaGFyYWN0ZXJJZF0sXG5cdFx0cmVmZXJlbmNlczogW2NoYXJhY3RlcnMuaWRdXG5cdH0pXG59KSk7XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgY2hhcmFjdGVycywgbWluaW5nRmxlZXRQYXJ0aWNpcGFudHMsIG1pbmluZ0ZsZWV0cywgcmVzdW1lQ29tbWFuZHMsIHNjaGVtYV9leHBvcnRzLCB1c2VycyB9OyIsCiAgICAiLy8jcmVnaW9uIHNyYy9lc2kvb3B0aW9ucy50c1xuY29uc3QgQ0xJRU5UX0lEID0gcHJvY2Vzcy5lbnYuRVZFX0NMSUVOVF9JRCB8fCBcIlwiO1xuY29uc3QgQ0xJRU5UX1NFQ1JFVCA9IHByb2Nlc3MuZW52LkVWRV9DTElFTlRfU0VDUkVUIHx8IFwiXCI7XG5jb25zdCBDQUxMQkFDS19VUkwgPSBwcm9jZXNzLmVudi5FVkVfQ0FMTEJBQ0tfVVJMIHx8IFwiXCI7XG5jb25zdCBVU0VSX0FHRU5UID0gcHJvY2Vzcy5lbnYuRVNJX1VTRVJfQUdFTlQgfHwgXCJcIjtcbmNvbnN0IG9wdGlvbnMgPSB7XG5cdGNsaWVudF9pZDogQ0xJRU5UX0lELFxuXHRjbGllbnRfc2VjcmV0OiBDTElFTlRfU0VDUkVULFxuXHRjYWxsYmFja191cmw6IENBTExCQUNLX1VSTCxcblx0dXNlcl9hZ2VudDogVVNFUl9BR0VOVFxufTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBvcHRpb25zIH07IiwKICAgICJleHBvcnQgY2xhc3MgSW52YWxpZFRva2VuRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG5JbnZhbGlkVG9rZW5FcnJvci5wcm90b3R5cGUubmFtZSA9IFwiSW52YWxpZFRva2VuRXJyb3JcIjtcbmZ1bmN0aW9uIGI2NERlY29kZVVuaWNvZGUoc3RyKSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChhdG9iKHN0cikucmVwbGFjZSgvKC4pL2csIChtLCBwKSA9PiB7XG4gICAgICAgIGxldCBjb2RlID0gcC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBpZiAoY29kZS5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICBjb2RlID0gXCIwXCIgKyBjb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIiVcIiArIGNvZGU7XG4gICAgfSkpO1xufVxuZnVuY3Rpb24gYmFzZTY0VXJsRGVjb2RlKHN0cikge1xuICAgIGxldCBvdXRwdXQgPSBzdHIucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIik7XG4gICAgc3dpdGNoIChvdXRwdXQubGVuZ3RoICUgNCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgb3V0cHV0ICs9IFwiPT1cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBvdXRwdXQgKz0gXCI9XCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImJhc2U2NCBzdHJpbmcgaXMgbm90IG9mIHRoZSBjb3JyZWN0IGxlbmd0aFwiKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGI2NERlY29kZVVuaWNvZGUob3V0cHV0KTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gYXRvYihvdXRwdXQpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBqd3REZWNvZGUodG9rZW4sIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHRva2VuICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FcnJvcihcIkludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBtdXN0IGJlIGEgc3RyaW5nXCIpO1xuICAgIH1cbiAgICBvcHRpb25zIHx8IChvcHRpb25zID0ge30pO1xuICAgIGNvbnN0IHBvcyA9IG9wdGlvbnMuaGVhZGVyID09PSB0cnVlID8gMCA6IDE7XG4gICAgY29uc3QgcGFydCA9IHRva2VuLnNwbGl0KFwiLlwiKVtwb3NdO1xuICAgIGlmICh0eXBlb2YgcGFydCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBtaXNzaW5nIHBhcnQgIyR7cG9zICsgMX1gKTtcbiAgICB9XG4gICAgbGV0IGRlY29kZWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgZGVjb2RlZCA9IGJhc2U2NFVybERlY29kZShwYXJ0KTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbkVycm9yKGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogaW52YWxpZCBiYXNlNjQgZm9yIHBhcnQgIyR7cG9zICsgMX0gKCR7ZS5tZXNzYWdlfSlgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FcnJvcihgSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IGludmFsaWQganNvbiBmb3IgcGFydCAjJHtwb3MgKyAxfSAoJHtlLm1lc3NhZ2V9KWApO1xuICAgIH1cbn1cbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMlVwcGVyQ2FzZShieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJfaW50ZXJuYWwoYnl0ZXMsIGJhc2UzMlVwcGVyQ2FzZUFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTMyVXBwZXJDYXNlTm9QYWRkaW5nKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2UzMl9pbnRlcm5hbChieXRlcywgYmFzZTMyVXBwZXJDYXNlQWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5Ob25lKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlMzJMb3dlckNhc2UoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTMyX2ludGVybmFsKGJ5dGVzLCBiYXNlMzJMb3dlckNhc2VBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLkluY2x1ZGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMkxvd2VyQ2FzZU5vUGFkZGluZyhieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJfaW50ZXJuYWwoYnl0ZXMsIGJhc2UzMkxvd2VyQ2FzZUFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuTm9uZSk7XG59XG4vKiogUmVwbGFjZWQ6IFVzZSBlbmNvZGVCYXNlMzJVcHBlckNhc2UoKSBpbnN0ZWFkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMihieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJVcHBlckNhc2UoYnl0ZXMpO1xufVxuLyoqIFJlcGxhY2VkOiBVc2UgZW5jb2RlQmFzZTMyVXBwZXJDYXNlTm9QYWRkaW5nKCkgaW5zdGVhZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlMzJOb1BhZGRpbmcoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTMyVXBwZXJDYXNlTm9QYWRkaW5nKGJ5dGVzKTtcbn1cbmZ1bmN0aW9uIGVuY29kZUJhc2UzMl9pbnRlcm5hbChieXRlcywgYWxwaGFiZXQsIHBhZGRpbmcpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmJ5dGVMZW5ndGg7IGkgKz0gNSkge1xuICAgICAgICBsZXQgYnVmZmVyID0gMG47XG4gICAgICAgIGxldCBidWZmZXJCaXRTaXplID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA1ICYmIGkgKyBqIDwgYnl0ZXMuYnl0ZUxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBidWZmZXIgPSAoYnVmZmVyIDw8IDhuKSB8IEJpZ0ludChieXRlc1tpICsgal0pO1xuICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChidWZmZXJCaXRTaXplICUgNSAhPT0gMCkge1xuICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyIDw8IEJpZ0ludCg1IC0gKGJ1ZmZlckJpdFNpemUgJSA1KSk7XG4gICAgICAgICAgICBidWZmZXJCaXRTaXplICs9IDUgLSAoYnVmZmVyQml0U2l6ZSAlIDUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgODsgaisrKSB7XG4gICAgICAgICAgICBpZiAoYnVmZmVyQml0U2l6ZSA+PSA1KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFscGhhYmV0W051bWJlcigoYnVmZmVyID4+IEJpZ0ludChidWZmZXJCaXRTaXplIC0gNSkpICYgMHgxZm4pXTtcbiAgICAgICAgICAgICAgICBidWZmZXJCaXRTaXplIC09IDU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChidWZmZXJCaXRTaXplID4gMCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhbHBoYWJldFtOdW1iZXIoKGJ1ZmZlciA8PCBCaWdJbnQoNiAtIGJ1ZmZlckJpdFNpemUpKSAmIDB4M2ZuKV07XG4gICAgICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYWRkaW5nID09PSBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIj1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2UzMihlbmNvZGVkKSB7XG4gICAgcmV0dXJuIGRlY29kZUJhc2UzMl9pbnRlcm5hbChlbmNvZGVkLCBiYXNlMzJEZWNvZGVNYXAsIERlY29kaW5nUGFkZGluZy5SZXF1aXJlZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTMySWdub3JlUGFkZGluZyhlbmNvZGVkKSB7XG4gICAgcmV0dXJuIGRlY29kZUJhc2UzMl9pbnRlcm5hbChlbmNvZGVkLCBiYXNlMzJEZWNvZGVNYXAsIERlY29kaW5nUGFkZGluZy5JZ25vcmUpO1xufVxuZnVuY3Rpb24gZGVjb2RlQmFzZTMyX2ludGVybmFsKGVuY29kZWQsIGRlY29kZU1hcCwgcGFkZGluZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KE1hdGguY2VpbChlbmNvZGVkLmxlbmd0aCAvIDgpICogNSk7XG4gICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RlZC5sZW5ndGg7IGkgKz0gOCkge1xuICAgICAgICBsZXQgY2h1bmsgPSAwbjtcbiAgICAgICAgbGV0IGJpdHNSZWFkID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA4OyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYWRkaW5nID09PSBEZWNvZGluZ1BhZGRpbmcuUmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW5jb2RlZFtpICsgal0gPT09IFwiPVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSArIGogPj0gZW5jb2RlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWRkaW5nID09PSBEZWNvZGluZ1BhZGRpbmcuSWdub3JlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgKyBqID49IGVuY29kZWQubGVuZ3RoIHx8IGVuY29kZWRbaSArIGpdID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaiA+IDAgJiYgZW5jb2RlZFtpICsgaiAtIDFdID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKGVuY29kZWRbaSArIGpdIGluIGRlY29kZU1hcCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNoYXJhY3RlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNodW5rIHw9IEJpZ0ludChkZWNvZGVNYXBbZW5jb2RlZFtpICsgal1dKSA8PCBCaWdJbnQoKDcgLSBqKSAqIDUpO1xuICAgICAgICAgICAgYml0c1JlYWQgKz0gNTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYml0c1JlYWQgPCA0MCkge1xuICAgICAgICAgICAgbGV0IHVudXNlZDtcbiAgICAgICAgICAgIGlmIChiaXRzUmVhZCA9PT0gMTApIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmZmZmZmZmZuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYml0c1JlYWQgPT09IDIwKSB7XG4gICAgICAgICAgICAgICAgdW51c2VkID0gY2h1bmsgJiAweGZmZmZmZm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaXRzUmVhZCA9PT0gMjUpIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmZmZm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaXRzUmVhZCA9PT0gMzUpIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmZuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVudXNlZCAhPT0gMG4pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnl0ZUxlbmd0aCA9IE1hdGguZmxvb3IoYml0c1JlYWQgLyA4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdFt0b3RhbEJ5dGVzXSA9IE51bWJlcigoY2h1bmsgPj4gQmlnSW50KDMyIC0gaSAqIDgpKSAmIDB4ZmZuKTtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LnNsaWNlKDAsIHRvdGFsQnl0ZXMpO1xufVxuY29uc3QgYmFzZTMyVXBwZXJDYXNlQWxwaGFiZXQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMjM0NTY3XCI7XG5jb25zdCBiYXNlMzJMb3dlckNhc2VBbHBoYWJldCA9IFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoyMzQ1NjdcIjtcbmNvbnN0IGJhc2UzMkRlY29kZU1hcCA9IHtcbiAgICBBOiAwLFxuICAgIEI6IDEsXG4gICAgQzogMixcbiAgICBEOiAzLFxuICAgIEU6IDQsXG4gICAgRjogNSxcbiAgICBHOiA2LFxuICAgIEg6IDcsXG4gICAgSTogOCxcbiAgICBKOiA5LFxuICAgIEs6IDEwLFxuICAgIEw6IDExLFxuICAgIE06IDEyLFxuICAgIE46IDEzLFxuICAgIE86IDE0LFxuICAgIFA6IDE1LFxuICAgIFE6IDE2LFxuICAgIFI6IDE3LFxuICAgIFM6IDE4LFxuICAgIFQ6IDE5LFxuICAgIFU6IDIwLFxuICAgIFY6IDIxLFxuICAgIFc6IDIyLFxuICAgIFg6IDIzLFxuICAgIFk6IDI0LFxuICAgIFo6IDI1LFxuICAgIGE6IDAsXG4gICAgYjogMSxcbiAgICBjOiAyLFxuICAgIGQ6IDMsXG4gICAgZTogNCxcbiAgICBmOiA1LFxuICAgIGc6IDYsXG4gICAgaDogNyxcbiAgICBpOiA4LFxuICAgIGo6IDksXG4gICAgazogMTAsXG4gICAgbDogMTEsXG4gICAgbTogMTIsXG4gICAgbjogMTMsXG4gICAgbzogMTQsXG4gICAgcDogMTUsXG4gICAgcTogMTYsXG4gICAgcjogMTcsXG4gICAgczogMTgsXG4gICAgdDogMTksXG4gICAgdTogMjAsXG4gICAgdjogMjEsXG4gICAgdzogMjIsXG4gICAgeDogMjMsXG4gICAgeTogMjQsXG4gICAgejogMjUsXG4gICAgXCIyXCI6IDI2LFxuICAgIFwiM1wiOiAyNyxcbiAgICBcIjRcIjogMjgsXG4gICAgXCI1XCI6IDI5LFxuICAgIFwiNlwiOiAzMCxcbiAgICBcIjdcIjogMzFcbn07XG52YXIgRW5jb2RpbmdQYWRkaW5nO1xuKGZ1bmN0aW9uIChFbmNvZGluZ1BhZGRpbmcpIHtcbiAgICBFbmNvZGluZ1BhZGRpbmdbRW5jb2RpbmdQYWRkaW5nW1wiSW5jbHVkZVwiXSA9IDBdID0gXCJJbmNsdWRlXCI7XG4gICAgRW5jb2RpbmdQYWRkaW5nW0VuY29kaW5nUGFkZGluZ1tcIk5vbmVcIl0gPSAxXSA9IFwiTm9uZVwiO1xufSkoRW5jb2RpbmdQYWRkaW5nIHx8IChFbmNvZGluZ1BhZGRpbmcgPSB7fSkpO1xudmFyIERlY29kaW5nUGFkZGluZztcbihmdW5jdGlvbiAoRGVjb2RpbmdQYWRkaW5nKSB7XG4gICAgRGVjb2RpbmdQYWRkaW5nW0RlY29kaW5nUGFkZGluZ1tcIlJlcXVpcmVkXCJdID0gMF0gPSBcIlJlcXVpcmVkXCI7XG4gICAgRGVjb2RpbmdQYWRkaW5nW0RlY29kaW5nUGFkZGluZ1tcIklnbm9yZVwiXSA9IDFdID0gXCJJZ25vcmVcIjtcbn0pKERlY29kaW5nUGFkZGluZyB8fCAoRGVjb2RpbmdQYWRkaW5nID0ge30pKTtcbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2U2NChieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlNjRfaW50ZXJuYWwoYnl0ZXMsIGJhc2U2NEFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTY0Tm9QYWRkaW5nKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2U2NF9pbnRlcm5hbChieXRlcywgYmFzZTY0QWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5Ob25lKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlNjR1cmwoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTY0X2ludGVybmFsKGJ5dGVzLCBiYXNlNjR1cmxBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLkluY2x1ZGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2U2NHVybE5vUGFkZGluZyhieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlNjRfaW50ZXJuYWwoYnl0ZXMsIGJhc2U2NHVybEFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuTm9uZSk7XG59XG5mdW5jdGlvbiBlbmNvZGVCYXNlNjRfaW50ZXJuYWwoYnl0ZXMsIGFscGhhYmV0LCBwYWRkaW5nKSB7XG4gICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5ieXRlTGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgbGV0IGJ1ZmZlciA9IDA7XG4gICAgICAgIGxldCBidWZmZXJCaXRTaXplID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAzICYmIGkgKyBqIDwgYnl0ZXMuYnl0ZUxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBidWZmZXIgPSAoYnVmZmVyIDw8IDgpIHwgYnl0ZXNbaSArIGpdO1xuICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoYnVmZmVyQml0U2l6ZSA+PSA2KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFscGhhYmV0WyhidWZmZXIgPj4gKGJ1ZmZlckJpdFNpemUgLSA2KSkgJiAweDNmXTtcbiAgICAgICAgICAgICAgICBidWZmZXJCaXRTaXplIC09IDY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChidWZmZXJCaXRTaXplID4gMCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhbHBoYWJldFsoYnVmZmVyIDw8ICg2IC0gYnVmZmVyQml0U2l6ZSkpICYgMHgzZl07XG4gICAgICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYWRkaW5nID09PSBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIj1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgYmFzZTY0QWxwaGFiZXQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9cIjtcbmNvbnN0IGJhc2U2NHVybEFscGhhYmV0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fXCI7XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTY0KGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGJhc2U2NERlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLlJlcXVpcmVkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlNjRJZ25vcmVQYWRkaW5nKGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGJhc2U2NERlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLklnbm9yZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTY0dXJsKGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGJhc2U2NHVybERlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLlJlcXVpcmVkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlNjR1cmxJZ25vcmVQYWRkaW5nKGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGJhc2U2NHVybERlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLklnbm9yZSk7XG59XG5mdW5jdGlvbiBkZWNvZGVCYXNlNjRfaW50ZXJuYWwoZW5jb2RlZCwgZGVjb2RlTWFwLCBwYWRkaW5nKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKGVuY29kZWQubGVuZ3RoIC8gNCkgKiAzKTtcbiAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbmNvZGVkLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGxldCBjaHVuayA9IDA7XG4gICAgICAgIGxldCBiaXRzUmVhZCA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgICBpZiAocGFkZGluZyA9PT0gRGVjb2RpbmdQYWRkaW5nLlJlcXVpcmVkICYmIGVuY29kZWRbaSArIGpdID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhZGRpbmcgPT09IERlY29kaW5nUGFkZGluZy5JZ25vcmUgJiZcbiAgICAgICAgICAgICAgICAoaSArIGogPj0gZW5jb2RlZC5sZW5ndGggfHwgZW5jb2RlZFtpICsgal0gPT09IFwiPVwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGogPiAwICYmIGVuY29kZWRbaSArIGogLSAxXSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShlbmNvZGVkW2kgKyBqXSBpbiBkZWNvZGVNYXApKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjaGFyYWN0ZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVuayB8PSBkZWNvZGVNYXBbZW5jb2RlZFtpICsgal1dIDw8ICgoMyAtIGopICogNik7XG4gICAgICAgICAgICBiaXRzUmVhZCArPSA2O1xuICAgICAgICB9XG4gICAgICAgIGlmIChiaXRzUmVhZCA8IDI0KSB7XG4gICAgICAgICAgICBsZXQgdW51c2VkO1xuICAgICAgICAgICAgaWYgKGJpdHNSZWFkID09PSAxMikge1xuICAgICAgICAgICAgICAgIHVudXNlZCA9IGNodW5rICYgMHhmZmZmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYml0c1JlYWQgPT09IDE4KSB7XG4gICAgICAgICAgICAgICAgdW51c2VkID0gY2h1bmsgJiAweGZmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVudXNlZCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBieXRlTGVuZ3RoID0gTWF0aC5mbG9vcihiaXRzUmVhZCAvIDgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0W3RvdGFsQnl0ZXNdID0gKGNodW5rID4+ICgxNiAtIGkgKiA4KSkgJiAweGZmO1xuICAgICAgICAgICAgdG90YWxCeXRlcysrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuc2xpY2UoMCwgdG90YWxCeXRlcyk7XG59XG52YXIgRW5jb2RpbmdQYWRkaW5nO1xuKGZ1bmN0aW9uIChFbmNvZGluZ1BhZGRpbmcpIHtcbiAgICBFbmNvZGluZ1BhZGRpbmdbRW5jb2RpbmdQYWRkaW5nW1wiSW5jbHVkZVwiXSA9IDBdID0gXCJJbmNsdWRlXCI7XG4gICAgRW5jb2RpbmdQYWRkaW5nW0VuY29kaW5nUGFkZGluZ1tcIk5vbmVcIl0gPSAxXSA9IFwiTm9uZVwiO1xufSkoRW5jb2RpbmdQYWRkaW5nIHx8IChFbmNvZGluZ1BhZGRpbmcgPSB7fSkpO1xudmFyIERlY29kaW5nUGFkZGluZztcbihmdW5jdGlvbiAoRGVjb2RpbmdQYWRkaW5nKSB7XG4gICAgRGVjb2RpbmdQYWRkaW5nW0RlY29kaW5nUGFkZGluZ1tcIlJlcXVpcmVkXCJdID0gMF0gPSBcIlJlcXVpcmVkXCI7XG4gICAgRGVjb2RpbmdQYWRkaW5nW0RlY29kaW5nUGFkZGluZ1tcIklnbm9yZVwiXSA9IDFdID0gXCJJZ25vcmVcIjtcbn0pKERlY29kaW5nUGFkZGluZyB8fCAoRGVjb2RpbmdQYWRkaW5nID0ge30pKTtcbmNvbnN0IGJhc2U2NERlY29kZU1hcCA9IHtcbiAgICBcIjBcIjogNTIsXG4gICAgXCIxXCI6IDUzLFxuICAgIFwiMlwiOiA1NCxcbiAgICBcIjNcIjogNTUsXG4gICAgXCI0XCI6IDU2LFxuICAgIFwiNVwiOiA1NyxcbiAgICBcIjZcIjogNTgsXG4gICAgXCI3XCI6IDU5LFxuICAgIFwiOFwiOiA2MCxcbiAgICBcIjlcIjogNjEsXG4gICAgQTogMCxcbiAgICBCOiAxLFxuICAgIEM6IDIsXG4gICAgRDogMyxcbiAgICBFOiA0LFxuICAgIEY6IDUsXG4gICAgRzogNixcbiAgICBIOiA3LFxuICAgIEk6IDgsXG4gICAgSjogOSxcbiAgICBLOiAxMCxcbiAgICBMOiAxMSxcbiAgICBNOiAxMixcbiAgICBOOiAxMyxcbiAgICBPOiAxNCxcbiAgICBQOiAxNSxcbiAgICBROiAxNixcbiAgICBSOiAxNyxcbiAgICBTOiAxOCxcbiAgICBUOiAxOSxcbiAgICBVOiAyMCxcbiAgICBWOiAyMSxcbiAgICBXOiAyMixcbiAgICBYOiAyMyxcbiAgICBZOiAyNCxcbiAgICBaOiAyNSxcbiAgICBhOiAyNixcbiAgICBiOiAyNyxcbiAgICBjOiAyOCxcbiAgICBkOiAyOSxcbiAgICBlOiAzMCxcbiAgICBmOiAzMSxcbiAgICBnOiAzMixcbiAgICBoOiAzMyxcbiAgICBpOiAzNCxcbiAgICBqOiAzNSxcbiAgICBrOiAzNixcbiAgICBsOiAzNyxcbiAgICBtOiAzOCxcbiAgICBuOiAzOSxcbiAgICBvOiA0MCxcbiAgICBwOiA0MSxcbiAgICBxOiA0MixcbiAgICByOiA0MyxcbiAgICBzOiA0NCxcbiAgICB0OiA0NSxcbiAgICB1OiA0NixcbiAgICB2OiA0NyxcbiAgICB3OiA0OCxcbiAgICB4OiA0OSxcbiAgICB5OiA1MCxcbiAgICB6OiA1MSxcbiAgICBcIitcIjogNjIsXG4gICAgXCIvXCI6IDYzXG59O1xuY29uc3QgYmFzZTY0dXJsRGVjb2RlTWFwID0ge1xuICAgIFwiMFwiOiA1MixcbiAgICBcIjFcIjogNTMsXG4gICAgXCIyXCI6IDU0LFxuICAgIFwiM1wiOiA1NSxcbiAgICBcIjRcIjogNTYsXG4gICAgXCI1XCI6IDU3LFxuICAgIFwiNlwiOiA1OCxcbiAgICBcIjdcIjogNTksXG4gICAgXCI4XCI6IDYwLFxuICAgIFwiOVwiOiA2MSxcbiAgICBBOiAwLFxuICAgIEI6IDEsXG4gICAgQzogMixcbiAgICBEOiAzLFxuICAgIEU6IDQsXG4gICAgRjogNSxcbiAgICBHOiA2LFxuICAgIEg6IDcsXG4gICAgSTogOCxcbiAgICBKOiA5LFxuICAgIEs6IDEwLFxuICAgIEw6IDExLFxuICAgIE06IDEyLFxuICAgIE46IDEzLFxuICAgIE86IDE0LFxuICAgIFA6IDE1LFxuICAgIFE6IDE2LFxuICAgIFI6IDE3LFxuICAgIFM6IDE4LFxuICAgIFQ6IDE5LFxuICAgIFU6IDIwLFxuICAgIFY6IDIxLFxuICAgIFc6IDIyLFxuICAgIFg6IDIzLFxuICAgIFk6IDI0LFxuICAgIFo6IDI1LFxuICAgIGE6IDI2LFxuICAgIGI6IDI3LFxuICAgIGM6IDI4LFxuICAgIGQ6IDI5LFxuICAgIGU6IDMwLFxuICAgIGY6IDMxLFxuICAgIGc6IDMyLFxuICAgIGg6IDMzLFxuICAgIGk6IDM0LFxuICAgIGo6IDM1LFxuICAgIGs6IDM2LFxuICAgIGw6IDM3LFxuICAgIG06IDM4LFxuICAgIG46IDM5LFxuICAgIG86IDQwLFxuICAgIHA6IDQxLFxuICAgIHE6IDQyLFxuICAgIHI6IDQzLFxuICAgIHM6IDQ0LFxuICAgIHQ6IDQ1LFxuICAgIHU6IDQ2LFxuICAgIHY6IDQ3LFxuICAgIHc6IDQ4LFxuICAgIHg6IDQ5LFxuICAgIHk6IDUwLFxuICAgIHo6IDUxLFxuICAgIFwiLVwiOiA2MixcbiAgICBfOiA2M1xufTtcbiIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gXCIuL29wdGlvbnMuanNcIjtcbmltcG9ydCB7IGp3dERlY29kZSB9IGZyb20gXCJqd3QtZGVjb2RlXCI7XG5pbXBvcnQgeyBlbmNvZGVCYXNlNjR1cmxOb1BhZGRpbmcgfSBmcm9tIFwiQG9zbG9qcy9lbmNvZGluZ1wiO1xuaW1wb3J0IGp3dCBmcm9tIFwianNvbndlYnRva2VuXCI7XG5pbXBvcnQgandrVG9QZW0gZnJvbSBcImp3ay10by1wZW1cIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvYXV0aC50c1xudmFyIGF1dGhfZXhwb3J0cyA9IHt9O1xuX19leHBvcnQoYXV0aF9leHBvcnRzLCB7XG5cdGNoYXJhY3RlcklkRnJvbVRva2VuOiAoKSA9PiBjaGFyYWN0ZXJJZEZyb21Ub2tlbixcblx0Y3JlYXRlQXV0aG9yaXphdGlvblVSTDogKCkgPT4gY3JlYXRlQXV0aG9yaXphdGlvblVSTCxcblx0cmVmcmVzaDogKCkgPT4gcmVmcmVzaCxcblx0dmFsaWRhdGVBdXRob3JpemF0aW9uQ29kZTogKCkgPT4gdmFsaWRhdGVBdXRob3JpemF0aW9uQ29kZSxcblx0dmFsaWRhdGVUb2tlbjogKCkgPT4gdmFsaWRhdGVUb2tlblxufSk7XG5mdW5jdGlvbiBnZW5lcmF0ZVN0YXRlKCkge1xuXHRjb25zdCByYW5kb21WYWx1ZXMgPSBuZXcgVWludDhBcnJheSgzMik7XG5cdGNyeXB0by5nZXRSYW5kb21WYWx1ZXMocmFuZG9tVmFsdWVzKTtcblx0cmV0dXJuIGVuY29kZUJhc2U2NHVybE5vUGFkZGluZyhyYW5kb21WYWx1ZXMpO1xufVxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXV0aG9yaXphdGlvblVSTChzY29wZXMgPSBcInB1YmxpY0RhdGFcIikge1xuXHRjb25zdCBzdGF0ZSA9IGdlbmVyYXRlU3RhdGUoKTtcblx0Y29uc3QgdXJsID0gbmV3IFVSTChcImh0dHBzOi8vbG9naW4uZXZlb25saW5lLmNvbS92Mi9vYXV0aC9hdXRob3JpemUvXCIpO1xuXHR1cmwuc2VhcmNoUGFyYW1zLnNldChcInJlc3BvbnNlX3R5cGVcIiwgXCJjb2RlXCIpO1xuXHR1cmwuc2VhcmNoUGFyYW1zLnNldChcInJlZGlyZWN0X3VyaVwiLCBvcHRpb25zLmNhbGxiYWNrX3VybCk7XG5cdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiY2xpZW50X2lkXCIsIG9wdGlvbnMuY2xpZW50X2lkKTtcblx0dXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJzdGF0ZVwiLCBzdGF0ZSk7XG5cdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwic2NvcGVcIiwgQXJyYXkuaXNBcnJheShzY29wZXMpID8gc2NvcGVzLmpvaW4oXCIgXCIpIDogc2NvcGVzKTtcblx0cmV0dXJuIHtcblx0XHR1cmwsXG5cdFx0c3RhdGVcblx0fTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQXV0aG9yaXphdGlvbkNvZGUoY29kZSkge1xuXHR0cnkge1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCJodHRwczovL2xvZ2luLmV2ZW9ubGluZS5jb20vdjIvb2F1dGgvdG9rZW5cIiwge1xuXHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0XCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIixcblx0XHRcdFx0QXV0aG9yaXphdGlvbjogYEJhc2ljICR7QnVmZmVyLmZyb20oYCR7b3B0aW9ucy5jbGllbnRfaWR9OiR7b3B0aW9ucy5jbGllbnRfc2VjcmV0fWApLnRvU3RyaW5nKFwiYmFzZTY0XCIpfWBcblx0XHRcdH0sXG5cdFx0XHRib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcblx0XHRcdFx0Z3JhbnRfdHlwZTogXCJhdXRob3JpemF0aW9uX2NvZGVcIixcblx0XHRcdFx0Y29kZVxuXHRcdFx0fSlcblx0XHR9KTtcblx0XHRyZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdGNvbnNvbGUuZXJyb3IoYGZhaWxlZCB0byB2YWxpZGF0ZSBFVkUgYXV0aG9yaXphdGlvbiBjb2RlYCwgZXJyb3IpO1xuXHRcdHRocm93IGAke2Vycm9yfWA7XG5cdH1cbn1cbmxldCBldmVBdXRoUHVibGljS2V5O1xuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVUb2tlbih0b2tlbikge1xuXHRpZiAoIWV2ZUF1dGhQdWJsaWNLZXkpIHRyeSB7XG5cdFx0Y29uc3QgZXZlSldLUyA9IGF3YWl0IChhd2FpdCBmZXRjaChcImh0dHBzOi8vbG9naW4uZXZlb25saW5lLmNvbS9vYXV0aC9qd2tzXCIpKS5qc29uKCk7XG5cdFx0ZXZlQXV0aFB1YmxpY0tleSA9IGp3a1RvUGVtKGV2ZUpXS1Mua2V5c1swXSk7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGNvbnNvbGUuZXJyb3IoYGZhaWxlZCB0byBnZXQgRVZFIEF1dGggcHVibGljIGtleXNgLCBlcnIpO1xuXHR9XG5cdHRyeSB7XG5cdFx0Y29uc3QgZGVjb2RlZCA9IGp3dC52ZXJpZnkodG9rZW4sIGV2ZUF1dGhQdWJsaWNLZXkpO1xuXHRcdHJldHVybiBkZWNvZGVkO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRjb25zb2xlLmVycm9yKGBmYWlsZWQgdG8gdmFsaWRhdGUgRVZFIHRva2VuYCwgZXJyKTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxufVxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaCh7IHJlZnJlc2hfdG9rZW4gfSwgc2NvcGVzKSB7XG5cdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRncmFudF90eXBlOiBcInJlZnJlc2hfdG9rZW5cIixcblx0XHRyZWZyZXNoX3Rva2VuLFxuXHRcdHNjb3BlOiBcIlwiXG5cdH07XG5cdGlmIChzY29wZXMpIHBhcmFtc1tcInNjb3BlXCJdID0gQXJyYXkuaXNBcnJheShzY29wZXMpID8gc2NvcGVzLmpvaW4oXCIgXCIpIDogc2NvcGVzO1xuXHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9sb2dpbi5ldmVvbmxpbmUuY29tL3YyL29hdXRoL3Rva2VuXCIsIHtcblx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdGhlYWRlcnM6IHtcblx0XHRcdFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIsXG5cdFx0XHRBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtvcHRpb25zLmNsaWVudF9pZH06JHtvcHRpb25zLmNsaWVudF9zZWNyZXR9YCkudG9TdHJpbmcoXCJiYXNlNjRcIil9YFxuXHRcdH0sXG5cdFx0Ym9keTogbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpXG5cdH0pO1xuXHRyZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xufVxuZnVuY3Rpb24gY2hhcmFjdGVySWRGcm9tVG9rZW4odG9rZW4pIHtcblx0Y29uc3QgcGF5bG9hZCA9IGp3dERlY29kZSh0b2tlbik7XG5cdHJldHVybiBwYXJzZUludChwYXlsb2FkLnN1Yi5zcGxpdChcIjpcIilbMl0pO1xufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGF1dGhfZXhwb3J0cywgY2hhcmFjdGVySWRGcm9tVG9rZW4sIGNyZWF0ZUF1dGhvcml6YXRpb25VUkwsIHJlZnJlc2gsIHZhbGlkYXRlQXV0aG9yaXphdGlvbkNvZGUsIHZhbGlkYXRlVG9rZW4gfTsiLAogICAgImltcG9ydCB7IGNoYXJhY3RlcnMgfSBmcm9tIFwiLi4vc2NoZW1hLmpzXCI7XG5pbXBvcnQgeyByZWZyZXNoLCB2YWxpZGF0ZVRva2VuIH0gZnJvbSBcIi4uLy4uL2VzaS9hdXRoLmpzXCI7XG5pbXBvcnQgeyBkYiB9IGZyb20gXCIuLi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgYW5kLCBlcSB9IGZyb20gXCJkcml6emxlLW9ybVwiO1xuaW1wb3J0IHsgand0RGVjb2RlIH0gZnJvbSBcImp3dC1kZWNvZGVcIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLnRzXG52YXIgQ2hhcmFjdGVySGVscGVyID0gY2xhc3MgQ2hhcmFjdGVySGVscGVyIHtcblx0c3RhdGljIGhhc1ZhbGlkVG9rZW4oY2hhcmFjdGVyKSB7XG5cdFx0cmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpIDwgY2hhcmFjdGVyLmV4cGlyZXNBdDtcblx0fVxuXHRzdGF0aWMgZ2V0U2NvcGVzKGNoYXJhY3Rlcikge1xuXHRcdGNvbnN0IGRlY29kZWQgPSBqd3REZWNvZGUoY2hhcmFjdGVyLmFjY2Vzc1Rva2VuKTtcblx0XHRyZXR1cm4gdHlwZW9mIGRlY29kZWQuc2NwID09PSBcInN0cmluZ1wiID8gW2RlY29kZWQuc2NwXSA6IGRlY29kZWQuc2NwO1xuXHR9XG5cdHN0YXRpYyBoYXNPbmx5UHVibGljU2NvcGUoY2hhcmFjdGVyKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2NvcGVzKGNoYXJhY3RlcikubGVuZ3RoID09PSAxICYmIHRoaXMuaGFzU2NvcGUoY2hhcmFjdGVyLCBcInB1YmxpY0RhdGFcIik7XG5cdH1cblx0c3RhdGljIGdldFRva2VucyhjaGFyYWN0ZXIpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0YWNjZXNzX3Rva2VuOiBjaGFyYWN0ZXIuYWNjZXNzVG9rZW4sXG5cdFx0XHRyZWZyZXNoX3Rva2VuOiBjaGFyYWN0ZXIucmVmcmVzaFRva2VuLFxuXHRcdFx0ZXhwaXJlc19pbjogKGNoYXJhY3Rlci5leHBpcmVzQXQuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAxZTNcblx0XHR9O1xuXHR9XG5cdHN0YXRpYyBoYXNTY29wZShjaGFyYWN0ZXIsIHNjb3BlKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2NvcGVzKGNoYXJhY3RlcikuaW5jbHVkZXMoc2NvcGUpO1xuXHR9XG5cdHN0YXRpYyBoYXNBbGxTY29wZXMoY2hhcmFjdGVyLCBzY29wZXMpIHtcblx0XHRjb25zdCBoYXMgPSB0aGlzLmdldFNjb3BlcyhjaGFyYWN0ZXIpO1xuXHRcdHJldHVybiBzY29wZXMuZXZlcnkoKHNjb3BlKSA9PiBoYXMuaW5jbHVkZXMoc2NvcGUpKTtcblx0fVxuXHRzdGF0aWMgZmluZChpZCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20oY2hhcmFjdGVycykud2hlcmUoZXEoY2hhcmFjdGVycy5pZCwgaWQpKS5saW1pdCgxKS5nZXQoKTtcblx0XHRjb25zdCBjID0gdGhpcy5jcmVhdGVDaGFyYWN0ZXJzKHJlc3VsdCk7XG5cdFx0cmV0dXJuIGMgPyBjWzBdIDogdm9pZCAwO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlVc2VyKHVzZXIpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3QoKS5mcm9tKGNoYXJhY3RlcnMpLndoZXJlKGVxKGNoYXJhY3RlcnMudXNlcklELCB1c2VyLmlkKSkuYWxsKCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ2hhcmFjdGVycyhyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlVc2VyQW5kRXZlSUQodXNlcklELCBldmVJRCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20oY2hhcmFjdGVycykud2hlcmUoYW5kKGVxKGNoYXJhY3RlcnMudXNlcklELCB1c2VySUQpLCBlcShjaGFyYWN0ZXJzLmV2ZUlELCBldmVJRCkpKS5saW1pdCgxKS5nZXQoKTtcblx0XHRjb25zdCBjID0gdGhpcy5jcmVhdGVDaGFyYWN0ZXJzKHJlc3VsdCk7XG5cdFx0cmV0dXJuIGMgPyBjWzBdIDogdm9pZCAwO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlOYW1lKHVzZXJJRCwgbmFtZSkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20oY2hhcmFjdGVycykud2hlcmUoYW5kKGVxKGNoYXJhY3RlcnMubmFtZSwgbmFtZSksIGVxKGNoYXJhY3RlcnMudXNlcklELCB1c2VySUQpKSkubGltaXQoMSkuZ2V0KCk7XG5cdFx0Y29uc3QgYyA9IHRoaXMuY3JlYXRlQ2hhcmFjdGVycyhyZXN1bHQpO1xuXHRcdHJldHVybiBjID8gY1swXSA6IHZvaWQgMDtcblx0fVxuXHRzdGF0aWMgZmluZEFsbCgpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3QoKS5mcm9tKGNoYXJhY3RlcnMpLmFsbCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUNoYXJhY3RlcnMocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlKGV2ZUlELCBuYW1lLCB1c2VyLCB0b2tlbnMpIHtcblx0XHRyZXR1cm4gdGhpcy5zYXZlKHtcblx0XHRcdGV2ZUlELFxuXHRcdFx0dXNlcklEOiB1c2VyLmlkLFxuXHRcdFx0YWNjZXNzVG9rZW46IHRva2Vucy5hY2Nlc3NfdG9rZW4sXG5cdFx0XHRleHBpcmVzQXQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSh0b2tlbnMuZXhwaXJlc19pbiAqIDFlMyksXG5cdFx0XHRyZWZyZXNoVG9rZW46IHRva2Vucy5yZWZyZXNoX3Rva2VuLFxuXHRcdFx0bmFtZSxcblx0XHRcdGNyZWF0ZWRBdDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKClcblx0XHR9KTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlQ2hhcmFjdGVycyhxdWVyeSkge1xuXHRcdGlmICghcXVlcnkpIHJldHVybiBbXTtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShxdWVyeSkpIHJldHVybiBxdWVyeS5tYXAoKGNoYXJhY3RlcikgPT4ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aWQ6IGNoYXJhY3Rlci5pZCxcblx0XHRcdFx0ZXZlSUQ6IGNoYXJhY3Rlci5ldmVJRCxcblx0XHRcdFx0dXNlcklEOiBjaGFyYWN0ZXIudXNlcklELFxuXHRcdFx0XHRhY2Nlc3NUb2tlbjogY2hhcmFjdGVyLmFjY2Vzc1Rva2VuLFxuXHRcdFx0XHRleHBpcmVzQXQ6IG5ldyBEYXRlKGNoYXJhY3Rlci5leHBpcmVzQXQpLFxuXHRcdFx0XHRyZWZyZXNoVG9rZW46IGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4sXG5cdFx0XHRcdG5hbWU6IGNoYXJhY3Rlci5uYW1lLFxuXHRcdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKGNoYXJhY3Rlci5jcmVhdGVkQXQpLFxuXHRcdFx0XHR1cGRhdGVkQXQ6IG5ldyBEYXRlKGNoYXJhY3Rlci51cGRhdGVkQXQpXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHRcdGVsc2UgcmV0dXJuIFt7XG5cdFx0XHRpZDogcXVlcnkuaWQsXG5cdFx0XHRldmVJRDogcXVlcnkuZXZlSUQsXG5cdFx0XHR1c2VySUQ6IHF1ZXJ5LnVzZXJJRCxcblx0XHRcdGFjY2Vzc1Rva2VuOiBxdWVyeS5hY2Nlc3NUb2tlbixcblx0XHRcdGV4cGlyZXNBdDogbmV3IERhdGUocXVlcnkuZXhwaXJlc0F0KSxcblx0XHRcdHJlZnJlc2hUb2tlbjogcXVlcnkucmVmcmVzaFRva2VuLFxuXHRcdFx0bmFtZTogcXVlcnkubmFtZSxcblx0XHRcdGNyZWF0ZWRBdDogbmV3IERhdGUocXVlcnkuY3JlYXRlZEF0KSxcblx0XHRcdHVwZGF0ZWRBdDogbmV3IERhdGUocXVlcnkudXBkYXRlZEF0KVxuXHRcdH1dO1xuXHR9XG5cdHN0YXRpYyBzYXZlKGNoYXJhY3Rlcikge1xuXHRcdGRiLmluc2VydChjaGFyYWN0ZXJzKS52YWx1ZXMoe1xuXHRcdFx0aWQ6IGNoYXJhY3Rlci5pZCxcblx0XHRcdGV2ZUlEOiBjaGFyYWN0ZXIuZXZlSUQsXG5cdFx0XHR1c2VySUQ6IGNoYXJhY3Rlci51c2VySUQsXG5cdFx0XHRuYW1lOiBjaGFyYWN0ZXIubmFtZSxcblx0XHRcdGFjY2Vzc1Rva2VuOiBjaGFyYWN0ZXIuYWNjZXNzVG9rZW4sXG5cdFx0XHRleHBpcmVzQXQ6IGNoYXJhY3Rlci5leHBpcmVzQXQuZ2V0VGltZSgpLFxuXHRcdFx0cmVmcmVzaFRva2VuOiBjaGFyYWN0ZXIucmVmcmVzaFRva2VuLFxuXHRcdFx0Y3JlYXRlZEF0OiBEYXRlLm5vdygpLFxuXHRcdFx0dXBkYXRlZEF0OiBEYXRlLm5vdygpXG5cdFx0fSkub25Db25mbGljdERvVXBkYXRlKHtcblx0XHRcdHRhcmdldDogY2hhcmFjdGVycy5pZCxcblx0XHRcdHNldDoge1xuXHRcdFx0XHRldmVJRDogY2hhcmFjdGVyLmV2ZUlELFxuXHRcdFx0XHR1c2VySUQ6IGNoYXJhY3Rlci51c2VySUQsXG5cdFx0XHRcdG5hbWU6IGNoYXJhY3Rlci5uYW1lLFxuXHRcdFx0XHRhY2Nlc3NUb2tlbjogY2hhcmFjdGVyLmFjY2Vzc1Rva2VuLFxuXHRcdFx0XHRleHBpcmVzQXQ6IGNoYXJhY3Rlci5leHBpcmVzQXQuZ2V0VGltZSgpLFxuXHRcdFx0XHRyZWZyZXNoVG9rZW46IGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4sXG5cdFx0XHRcdHVwZGF0ZWRBdDogRGF0ZS5ub3coKVxuXHRcdFx0fVxuXHRcdH0pLnJ1bigpO1xuXHRcdHJldHVybiBDaGFyYWN0ZXJIZWxwZXIuZmluZEJ5VXNlckFuZEV2ZUlEKGNoYXJhY3Rlci51c2VySUQsIGNoYXJhY3Rlci5ldmVJRCk7XG5cdH1cblx0c3RhdGljIGRlbGV0ZShjaGFyYWN0ZXIpIHtcblx0XHRkYi5kZWxldGUoY2hhcmFjdGVycykud2hlcmUoZXEoY2hhcmFjdGVycy5pZCwgY2hhcmFjdGVyLmlkKSkucnVuKCk7XG5cdH1cblx0c3RhdGljIGFzeW5jIHJlZnJlc2hUb2tlbnMoY2hhcmFjdGVyLCBzY29wZXMpIHtcblx0XHRjb25zdCB0b2tlbnMgPSBhd2FpdCByZWZyZXNoKHsgcmVmcmVzaF90b2tlbjogY2hhcmFjdGVyLnJlZnJlc2hUb2tlbiB9LCBzY29wZXMpO1xuXHRcdGNvbnN0IGRlY29kZWQgPSBhd2FpdCB2YWxpZGF0ZVRva2VuKHRva2Vucy5hY2Nlc3NfdG9rZW4pO1xuXHRcdGlmICghZGVjb2RlZCkge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHZhbGlkYXRlIHRva2VuIGZvciBjaGFyYWN0ZXIgJHtjaGFyYWN0ZXIuZXZlSUR9YCk7XG5cdFx0XHRyZXR1cm4gY2hhcmFjdGVyO1xuXHRcdH1cblx0XHRjaGFyYWN0ZXIuYWNjZXNzVG9rZW4gPSB0b2tlbnMuYWNjZXNzX3Rva2VuO1xuXHRcdGNoYXJhY3Rlci5leHBpcmVzQXQgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgdG9rZW5zLmV4cGlyZXNfaW4gKiAxZTMpO1xuXHRcdGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4gPSB0b2tlbnMucmVmcmVzaF90b2tlbjtcblx0XHR0aGlzLnNhdmUoY2hhcmFjdGVyKTtcblx0XHRyZXR1cm4gY2hhcmFjdGVyO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IENoYXJhY3RlckhlbHBlciB9OyIsCiAgICAiaW1wb3J0IHsgY2hhcmFjdGVycywgdXNlcnMgfSBmcm9tIFwiLi4vc2NoZW1hLmpzXCI7XG5pbXBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIgfSBmcm9tIFwiLi9jaGFyYWN0ZXIubW9kZWwuanNcIjtcbmltcG9ydCB7IGRiIH0gZnJvbSBcIi4uL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBlcSwgc3FsIH0gZnJvbSBcImRyaXp6bGUtb3JtXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZGIvbW9kZWxzL3VzZXIubW9kZWwudHNcbnZhciBVc2VySGVscGVyID0gY2xhc3Mge1xuXHRzdGF0aWMgZmluZChpZCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCh7XG5cdFx0XHRpZDogdXNlcnMuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHVzZXJzLmRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogdXNlcnMuY3JlYXRlZEF0LFxuXHRcdFx0dXBkYXRlZEF0OiB1c2Vycy51cGRhdGVkQXQsXG5cdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHVzZXJzLm1haW5DaGFyYWN0ZXIsXG5cdFx0XHRjaGFyYWN0ZXJJRHNTdHJpbmc6IHNxbGBqc29uX2dyb3VwX2FycmF5KGNoYXJhY3RlcnMuaWQpYFxuXHRcdH0pLmZyb20odXNlcnMpLndoZXJlKGVxKHVzZXJzLmlkLCBpZCkpLmxlZnRKb2luKGNoYXJhY3RlcnMsIGVxKHVzZXJzLmlkLCBjaGFyYWN0ZXJzLnVzZXJJRCkpLmdldCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUZyb21RdWVyeShyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlEaXNjb3JkSWQoaWQpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3Qoe1xuXHRcdFx0aWQ6IHVzZXJzLmlkLFxuXHRcdFx0ZGlzY29yZElEOiB1c2Vycy5kaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IHVzZXJzLmNyZWF0ZWRBdCxcblx0XHRcdHVwZGF0ZWRBdDogdXNlcnMudXBkYXRlZEF0LFxuXHRcdFx0bWFpbkNoYXJhY3RlcklEOiB1c2Vycy5tYWluQ2hhcmFjdGVyLFxuXHRcdFx0Y2hhcmFjdGVySURzU3RyaW5nOiBzcWxganNvbl9ncm91cF9hcnJheShjaGFyYWN0ZXJzLmlkKWBcblx0XHR9KS5mcm9tKHVzZXJzKS53aGVyZShlcSh1c2Vycy5kaXNjb3JkSUQsIGlkKSkubGVmdEpvaW4oY2hhcmFjdGVycywgZXEodXNlcnMuaWQsIGNoYXJhY3RlcnMudXNlcklEKSkuZ2V0KCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRnJvbVF1ZXJ5KHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGZpbmRBbGwoKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KHtcblx0XHRcdGlkOiB1c2Vycy5pZCxcblx0XHRcdGRpc2NvcmRJRDogdXNlcnMuZGlzY29yZElELFxuXHRcdFx0Y3JlYXRlZEF0OiB1c2Vycy5jcmVhdGVkQXQsXG5cdFx0XHR1cGRhdGVkQXQ6IHVzZXJzLnVwZGF0ZWRBdCxcblx0XHRcdG1haW5DaGFyYWN0ZXJJRDogdXNlcnMubWFpbkNoYXJhY3Rlcixcblx0XHRcdGNoYXJhY3RlcklEc1N0cmluZzogc3FsYGpzb25fZ3JvdXBfYXJyYXkoY2hhcmFjdGVycy5pZClgXG5cdFx0fSkuZnJvbSh1c2VycykubGVmdEpvaW4oY2hhcmFjdGVycywgZXEodXNlcnMuaWQsIGNoYXJhY3RlcnMudXNlcklEKSkuYWxsKCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRnJvbVF1ZXJ5KHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGZpbmRCeUNoYXJhY3RlcklkKGlkKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KHtcblx0XHRcdGlkOiB1c2Vycy5pZCxcblx0XHRcdGRpc2NvcmRJRDogdXNlcnMuZGlzY29yZElELFxuXHRcdFx0Y3JlYXRlZEF0OiB1c2Vycy5jcmVhdGVkQXQsXG5cdFx0XHR1cGRhdGVkQXQ6IHVzZXJzLnVwZGF0ZWRBdCxcblx0XHRcdG1haW5DaGFyYWN0ZXJJRDogdXNlcnMubWFpbkNoYXJhY3Rlcixcblx0XHRcdGNoYXJhY3RlcklEc1N0cmluZzogc3FsYGpzb25fZ3JvdXBfYXJyYXkoY2hhcmFjdGVycy5pZClgXG5cdFx0fSkuZnJvbSh1c2VycykubGVmdEpvaW4oY2hhcmFjdGVycywgZXEodXNlcnMuaWQsIGNoYXJhY3RlcnMudXNlcklEKSkud2hlcmUoZXEoY2hhcmFjdGVycy5pZCwgaWQpKS5hbGwoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGcm9tUXVlcnkocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgZmluZEJ5Q2hhcmFjdGVyTmFtZShuYW1lKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KHtcblx0XHRcdGlkOiB1c2Vycy5pZCxcblx0XHRcdGRpc2NvcmRJRDogdXNlcnMuZGlzY29yZElELFxuXHRcdFx0Y3JlYXRlZEF0OiB1c2Vycy5jcmVhdGVkQXQsXG5cdFx0XHR1cGRhdGVkQXQ6IHVzZXJzLnVwZGF0ZWRBdCxcblx0XHRcdG1haW5DaGFyYWN0ZXJJRDogdXNlcnMubWFpbkNoYXJhY3Rlcixcblx0XHRcdGNoYXJhY3RlcklEc1N0cmluZzogc3FsYGpzb25fZ3JvdXBfYXJyYXkoY2hhcmFjdGVycy5pZClgXG5cdFx0fSkuZnJvbSh1c2VycykubGVmdEpvaW4oY2hhcmFjdGVycywgZXEodXNlcnMuaWQsIGNoYXJhY3RlcnMudXNlcklEKSkud2hlcmUoZXEoY2hhcmFjdGVycy5uYW1lLCBuYW1lKSkuYWxsKCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRnJvbVF1ZXJ5KHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGNyZWF0ZUZyb21RdWVyeShxdWVyeSkge1xuXHRcdGlmICghcXVlcnkpIHJldHVybiBbXTtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShxdWVyeSkpIHJldHVybiBxdWVyeS5tYXAoKHVzZXIpID0+IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGlkOiB1c2VyLmlkLFxuXHRcdFx0XHRkaXNjb3JkSUQ6IHVzZXIuZGlzY29yZElELFxuXHRcdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKHVzZXIuY3JlYXRlZEF0KSxcblx0XHRcdFx0dXBkYXRlZEF0OiBuZXcgRGF0ZSh1c2VyLnVwZGF0ZWRBdCksXG5cdFx0XHRcdGNoYXJhY3RlcklEczogdXNlci5jaGFyYWN0ZXJJRHNTdHJpbmcgPyBKU09OLnBhcnNlKHVzZXIuY2hhcmFjdGVySURzU3RyaW5nID8/IFwiW11cIikubWFwKChzKSA9PiBOdW1iZXIocykpLnNvcnQoKSA6IFtdLFxuXHRcdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHVzZXIubWFpbkNoYXJhY3RlcklEXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHRcdGVsc2UgcmV0dXJuIHtcblx0XHRcdGlkOiBxdWVyeS5pZCxcblx0XHRcdGRpc2NvcmRJRDogcXVlcnkuZGlzY29yZElELFxuXHRcdFx0Y3JlYXRlZEF0OiBuZXcgRGF0ZShxdWVyeS5jcmVhdGVkQXQpLFxuXHRcdFx0dXBkYXRlZEF0OiBuZXcgRGF0ZShxdWVyeS51cGRhdGVkQXQpLFxuXHRcdFx0Y2hhcmFjdGVySURzOiBxdWVyeS5jaGFyYWN0ZXJJRHNTdHJpbmcgPyBKU09OLnBhcnNlKHF1ZXJ5LmNoYXJhY3RlcklEc1N0cmluZyA/PyBcIltdXCIpLm1hcCgocykgPT4gTnVtYmVyKHMpKS5zb3J0KCkgOiBbXSxcblx0XHRcdG1haW5DaGFyYWN0ZXJJRDogcXVlcnkubWFpbkNoYXJhY3RlcklEXG5cdFx0fTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlKGRpc2NvcmRJRCkge1xuXHRcdHRoaXMuc2F2ZSh7XG5cdFx0XHRkaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLFxuXHRcdFx0dXBkYXRlZEF0OiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKVxuXHRcdH0pO1xuXHRcdHJldHVybiB0aGlzLmZpbmRCeURpc2NvcmRJZChkaXNjb3JkSUQpO1xuXHR9XG5cdHN0YXRpYyBzYXZlKHVzZXIpIHtcblx0XHRkYi5pbnNlcnQodXNlcnMpLnZhbHVlcyh7XG5cdFx0XHRpZDogdXNlci5pZCxcblx0XHRcdGRpc2NvcmRJRDogdXNlci5kaXNjb3JkSUQsXG5cdFx0XHRtYWluQ2hhcmFjdGVyOiB1c2VyLm1haW5DaGFyYWN0ZXJJRCxcblx0XHRcdGNyZWF0ZWRBdDogdXNlci5jcmVhdGVkQXQuZ2V0VGltZSgpLFxuXHRcdFx0dXBkYXRlZEF0OiB1c2VyLnVwZGF0ZWRBdC5nZXRUaW1lKClcblx0XHR9KS5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuXHRcdFx0dGFyZ2V0OiB1c2Vycy5pZCxcblx0XHRcdHNldDoge1xuXHRcdFx0XHRkaXNjb3JkSUQ6IHVzZXIuZGlzY29yZElELFxuXHRcdFx0XHRtYWluQ2hhcmFjdGVyOiB1c2VyLm1haW5DaGFyYWN0ZXJJRCxcblx0XHRcdFx0dXBkYXRlZEF0OiB1c2VyLnVwZGF0ZWRBdC5nZXRUaW1lKClcblx0XHRcdH1cblx0XHR9KS5ydW4oKTtcblx0XHRyZXR1cm4gdXNlcjtcblx0fVxuXHRzdGF0aWMgZGVsZXRlKHVzZXIpIHtcblx0XHRkYi5kZWxldGUodXNlcnMpLndoZXJlKGVxKHVzZXJzLmlkLCB1c2VyLmlkKSkucnVuKCk7XG5cdH1cblx0c3RhdGljIGdldENoYXJhY3Rlcih1c2VyLCBpbmRleCkge1xuXHRcdGlmICghdXNlci5jaGFyYWN0ZXJJRHMpIHJldHVybiB2b2lkIDA7XG5cdFx0aWYgKGluZGV4ID49IHVzZXIuY2hhcmFjdGVySURzLmxlbmd0aCkgcmV0dXJuIHZvaWQgMDtcblx0XHRyZXR1cm4gQ2hhcmFjdGVySGVscGVyLmZpbmQodXNlci5jaGFyYWN0ZXJJRHNbaW5kZXhdKTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBVc2VySGVscGVyIH07IiwKICAgICJpbXBvcnQgeyByZXN1bWVDb21tYW5kcyB9IGZyb20gXCIuLi9zY2hlbWEuanNcIjtcbmltcG9ydCB7IGRiIH0gZnJvbSBcIi4uL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBlcSB9IGZyb20gXCJkcml6emxlLW9ybVwiO1xuXG4vLyNyZWdpb24gc3JjL2RiL21vZGVscy9yZXN1bWUtY29tbWFuZC5tb2RlbC50c1xudmFyIFJlc3VtZUNvbW1hbmQgPSBjbGFzcyBSZXN1bWVDb21tYW5kIHtcblx0aWQ7XG5cdGNvbW1hbmQ7XG5cdHBhcmFtcztcblx0Y29udGV4dDtcblx0Y3JlYXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpO1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLmNyZWF0ZWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTtcblx0fVxuXHRzdGF0aWMgZmluZChtZXNzYWdlSWQpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3QoKS5mcm9tKHJlc3VtZUNvbW1hbmRzKS53aGVyZShlcShyZXN1bWVDb21tYW5kcy5pZCwgbWVzc2FnZUlkKSkuZ2V0KCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRnJvbVF1ZXJ5KHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGNyZWF0ZShtZXNzYWdlSWQsIGNvbW1hbmQsIHBhcmFtcyA9IHt9LCBjb250ZXh0ID0ge30pIHtcblx0XHRjb25zdCByZXN1bWUgPSBuZXcgUmVzdW1lQ29tbWFuZCgpO1xuXHRcdHJlc3VtZS5pZCA9IG1lc3NhZ2VJZDtcblx0XHRyZXN1bWUuY29tbWFuZCA9IGNvbW1hbmQ7XG5cdFx0cmVzdW1lLnBhcmFtcyA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcyk7XG5cdFx0cmVzdW1lLmNvbnRleHQgPSBKU09OLnN0cmluZ2lmeShjb250ZXh0KTtcblx0XHRyZXR1cm4gcmVzdW1lO1xuXHR9XG5cdHN0YXRpYyBjcmVhdGVGcm9tUXVlcnkocXVlcnkpIHtcblx0XHRpZiAoIXF1ZXJ5KSByZXR1cm4gbnVsbDtcblx0XHRjb25zdCByZXN1bWUgPSBuZXcgUmVzdW1lQ29tbWFuZCgpO1xuXHRcdHJlc3VtZS5pZCA9IHF1ZXJ5LmlkO1xuXHRcdHJlc3VtZS5jb21tYW5kID0gcXVlcnkuY29tbWFuZDtcblx0XHRyZXN1bWUucGFyYW1zID0gcXVlcnkucGFyYW1zO1xuXHRcdHJlc3VtZS5jb250ZXh0ID0gcXVlcnkuY29udGV4dDtcblx0XHRyZXN1bWUuY3JlYXRlZCA9IHF1ZXJ5LmNyZWF0ZWQ7XG5cdFx0cmV0dXJuIHJlc3VtZTtcblx0fVxuXHRzYXZlKCkge1xuXHRcdGRiLmluc2VydChyZXN1bWVDb21tYW5kcykudmFsdWVzKHtcblx0XHRcdGlkOiB0aGlzLmlkLFxuXHRcdFx0Y29tbWFuZDogdGhpcy5jb21tYW5kLFxuXHRcdFx0cGFyYW1zOiB0aGlzLnBhcmFtcyxcblx0XHRcdGNvbnRleHQ6IHRoaXMuY29udGV4dCxcblx0XHRcdGNyZWF0ZWRBdDogdGhpcy5jcmVhdGVkLmdldFRpbWUoKVxuXHRcdH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG5cdFx0XHR0YXJnZXQ6IHJlc3VtZUNvbW1hbmRzLmlkLFxuXHRcdFx0c2V0OiB7XG5cdFx0XHRcdGNvbW1hbmQ6IHRoaXMuY29tbWFuZCxcblx0XHRcdFx0cGFyYW1zOiB0aGlzLnBhcmFtcyxcblx0XHRcdFx0Y29udGV4dDogdGhpcy5jb250ZXh0XG5cdFx0XHR9XG5cdFx0fSkucnVuKCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0ZGVsZXRlKCkge1xuXHRcdGRiLmRlbGV0ZShyZXN1bWVDb21tYW5kcykud2hlcmUoZXEocmVzdW1lQ29tbWFuZHMuaWQsIHRoaXMuaWQpKS5ydW4oKTtcblx0fVxuXHRzdGF0aWMgZGVsZXRlKG1lc3NhZ2VJZCkge1xuXHRcdGRiLmRlbGV0ZShyZXN1bWVDb21tYW5kcykud2hlcmUoZXEocmVzdW1lQ29tbWFuZHMuaWQsIG1lc3NhZ2VJZCkpLnJ1bigpO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IFJlc3VtZUNvbW1hbmQgfTsiLAogICAgImltcG9ydCB7IF9fZXhwb3J0IH0gZnJvbSBcIi4uLy4uL192aXJ0dWFsL3JvbGxkb3duX3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuL2NoYXJhY3Rlci5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgVXNlckhlbHBlciB9IGZyb20gXCIuL3VzZXIubW9kZWwuanNcIjtcbmltcG9ydCB7IFJlc3VtZUNvbW1hbmQgfSBmcm9tIFwiLi9yZXN1bWUtY29tbWFuZC5tb2RlbC5qc1wiO1xuXG4vLyNyZWdpb24gc3JjL2RiL21vZGVscy9pbmRleC50c1xudmFyIG1vZGVsc19leHBvcnRzID0ge307XG5fX2V4cG9ydChtb2RlbHNfZXhwb3J0cywge1xuXHRDaGFyYWN0ZXJIZWxwZXI6ICgpID0+IENoYXJhY3RlckhlbHBlcixcblx0UmVzdW1lQ29tbWFuZDogKCkgPT4gUmVzdW1lQ29tbWFuZCxcblx0VXNlckhlbHBlcjogKCkgPT4gVXNlckhlbHBlclxufSk7XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgbW9kZWxzX2V4cG9ydHMgfTsiLAogICAgImltcG9ydCB7IERhdGFiYXNlIH0gZnJvbSBcImJ1bjpzcWxpdGVcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBEZWZhdWx0TG9nZ2VyIH0gZnJvbSBcIi4uL2xvZ2dlci5qc1wiO1xuaW1wb3J0IHtcbiAgY3JlYXRlVGFibGVSZWxhdGlvbnNIZWxwZXJzLFxuICBleHRyYWN0VGFibGVzUmVsYXRpb25hbENvbmZpZ1xufSBmcm9tIFwiLi4vcmVsYXRpb25zLmpzXCI7XG5pbXBvcnQgeyBCYXNlU1FMaXRlRGF0YWJhc2UgfSBmcm9tIFwiLi4vc3FsaXRlLWNvcmUvZGIuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVN5bmNEaWFsZWN0IH0gZnJvbSBcIi4uL3NxbGl0ZS1jb3JlL2RpYWxlY3QuanNcIjtcbmltcG9ydCB7IGlzQ29uZmlnIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVCdW5TZXNzaW9uIH0gZnJvbSBcIi4vc2Vzc2lvbi5qc1wiO1xuY2xhc3MgQnVuU1FMaXRlRGF0YWJhc2UgZXh0ZW5kcyBCYXNlU1FMaXRlRGF0YWJhc2Uge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJCdW5TUUxpdGVEYXRhYmFzZVwiO1xufVxuZnVuY3Rpb24gY29uc3RydWN0KGNsaWVudCwgY29uZmlnID0ge30pIHtcbiAgY29uc3QgZGlhbGVjdCA9IG5ldyBTUUxpdGVTeW5jRGlhbGVjdCh7IGNhc2luZzogY29uZmlnLmNhc2luZyB9KTtcbiAgbGV0IGxvZ2dlcjtcbiAgaWYgKGNvbmZpZy5sb2dnZXIgPT09IHRydWUpIHtcbiAgICBsb2dnZXIgPSBuZXcgRGVmYXVsdExvZ2dlcigpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5sb2dnZXIgIT09IGZhbHNlKSB7XG4gICAgbG9nZ2VyID0gY29uZmlnLmxvZ2dlcjtcbiAgfVxuICBsZXQgc2NoZW1hO1xuICBpZiAoY29uZmlnLnNjaGVtYSkge1xuICAgIGNvbnN0IHRhYmxlc0NvbmZpZyA9IGV4dHJhY3RUYWJsZXNSZWxhdGlvbmFsQ29uZmlnKFxuICAgICAgY29uZmlnLnNjaGVtYSxcbiAgICAgIGNyZWF0ZVRhYmxlUmVsYXRpb25zSGVscGVyc1xuICAgICk7XG4gICAgc2NoZW1hID0ge1xuICAgICAgZnVsbFNjaGVtYTogY29uZmlnLnNjaGVtYSxcbiAgICAgIHNjaGVtYTogdGFibGVzQ29uZmlnLnRhYmxlcyxcbiAgICAgIHRhYmxlTmFtZXNNYXA6IHRhYmxlc0NvbmZpZy50YWJsZU5hbWVzTWFwXG4gICAgfTtcbiAgfVxuICBjb25zdCBzZXNzaW9uID0gbmV3IFNRTGl0ZUJ1blNlc3Npb24oY2xpZW50LCBkaWFsZWN0LCBzY2hlbWEsIHsgbG9nZ2VyIH0pO1xuICBjb25zdCBkYiA9IG5ldyBCdW5TUUxpdGVEYXRhYmFzZShcInN5bmNcIiwgZGlhbGVjdCwgc2Vzc2lvbiwgc2NoZW1hKTtcbiAgZGIuJGNsaWVudCA9IGNsaWVudDtcbiAgcmV0dXJuIGRiO1xufVxuZnVuY3Rpb24gZHJpenpsZSguLi5wYXJhbXMpIHtcbiAgaWYgKHBhcmFtc1swXSA9PT0gdm9pZCAwIHx8IHR5cGVvZiBwYXJhbXNbMF0gPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IHBhcmFtc1swXSA9PT0gdm9pZCAwID8gbmV3IERhdGFiYXNlKCkgOiBuZXcgRGF0YWJhc2UocGFyYW1zWzBdKTtcbiAgICByZXR1cm4gY29uc3RydWN0KGluc3RhbmNlLCBwYXJhbXNbMV0pO1xuICB9XG4gIGlmIChpc0NvbmZpZyhwYXJhbXNbMF0pKSB7XG4gICAgY29uc3QgeyBjb25uZWN0aW9uLCBjbGllbnQsIC4uLmRyaXp6bGVDb25maWcgfSA9IHBhcmFtc1swXTtcbiAgICBpZiAoY2xpZW50KSByZXR1cm4gY29uc3RydWN0KGNsaWVudCwgZHJpenpsZUNvbmZpZyk7XG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCB7IHNvdXJjZSwgLi4ub3B0cyB9ID0gY29ubmVjdGlvbjtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBPYmplY3QudmFsdWVzKG9wdHMpLmZpbHRlcigodikgPT4gdiAhPT0gdm9pZCAwKS5sZW5ndGggPyBvcHRzIDogdm9pZCAwO1xuICAgICAgY29uc3QgaW5zdGFuY2UyID0gbmV3IERhdGFiYXNlKHNvdXJjZSwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gY29uc3RydWN0KGluc3RhbmNlMiwgZHJpenpsZUNvbmZpZyk7XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERhdGFiYXNlKGNvbm5lY3Rpb24pO1xuICAgIHJldHVybiBjb25zdHJ1Y3QoaW5zdGFuY2UsIGRyaXp6bGVDb25maWcpO1xuICB9XG4gIHJldHVybiBjb25zdHJ1Y3QocGFyYW1zWzBdLCBwYXJhbXNbMV0pO1xufVxuKChkcml6emxlMikgPT4ge1xuICBmdW5jdGlvbiBtb2NrKGNvbmZpZykge1xuICAgIHJldHVybiBjb25zdHJ1Y3Qoe30sIGNvbmZpZyk7XG4gIH1cbiAgZHJpenpsZTIubW9jayA9IG1vY2s7XG59KShkcml6emxlIHx8IChkcml6emxlID0ge30pKTtcbmV4cG9ydCB7XG4gIEJ1blNRTGl0ZURhdGFiYXNlLFxuICBkcml6emxlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZHJpdmVyLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IE5vb3BMb2dnZXIgfSBmcm9tIFwiLi4vbG9nZ2VyLmpzXCI7XG5pbXBvcnQgeyBmaWxsUGxhY2Vob2xkZXJzLCBzcWwgfSBmcm9tIFwiLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVHJhbnNhY3Rpb24gfSBmcm9tIFwiLi4vc3FsaXRlLWNvcmUvaW5kZXguanNcIjtcbmltcG9ydCB7IFNRTGl0ZVByZXBhcmVkUXVlcnkgYXMgUHJlcGFyZWRRdWVyeUJhc2UsIFNRTGl0ZVNlc3Npb24gfSBmcm9tIFwiLi4vc3FsaXRlLWNvcmUvc2Vzc2lvbi5qc1wiO1xuaW1wb3J0IHsgbWFwUmVzdWx0Um93IH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5jbGFzcyBTUUxpdGVCdW5TZXNzaW9uIGV4dGVuZHMgU1FMaXRlU2Vzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKGNsaWVudCwgZGlhbGVjdCwgc2NoZW1hLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihkaWFsZWN0KTtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyID8/IG5ldyBOb29wTG9nZ2VyKCk7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQnVuU2Vzc2lvblwiO1xuICBsb2dnZXI7XG4gIGV4ZWMocXVlcnkpIHtcbiAgICB0aGlzLmNsaWVudC5leGVjKHF1ZXJ5KTtcbiAgfVxuICBwcmVwYXJlUXVlcnkocXVlcnksIGZpZWxkcywgZXhlY3V0ZU1ldGhvZCwgaXNSZXNwb25zZUluQXJyYXlNb2RlLCBjdXN0b21SZXN1bHRNYXBwZXIpIHtcbiAgICBjb25zdCBzdG10ID0gdGhpcy5jbGllbnQucHJlcGFyZShxdWVyeS5zcWwpO1xuICAgIHJldHVybiBuZXcgUHJlcGFyZWRRdWVyeShcbiAgICAgIHN0bXQsXG4gICAgICBxdWVyeSxcbiAgICAgIHRoaXMubG9nZ2VyLFxuICAgICAgZmllbGRzLFxuICAgICAgZXhlY3V0ZU1ldGhvZCxcbiAgICAgIGlzUmVzcG9uc2VJbkFycmF5TW9kZSxcbiAgICAgIGN1c3RvbVJlc3VsdE1hcHBlclxuICAgICk7XG4gIH1cbiAgdHJhbnNhY3Rpb24odHJhbnNhY3Rpb24sIGNvbmZpZyA9IHt9KSB7XG4gICAgY29uc3QgdHggPSBuZXcgU1FMaXRlQnVuVHJhbnNhY3Rpb24oXCJzeW5jXCIsIHRoaXMuZGlhbGVjdCwgdGhpcywgdGhpcy5zY2hlbWEpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgY29uc3QgbmF0aXZlVHggPSB0aGlzLmNsaWVudC50cmFuc2FjdGlvbigoKSA9PiB7XG4gICAgICByZXN1bHQgPSB0cmFuc2FjdGlvbih0eCk7XG4gICAgfSk7XG4gICAgbmF0aXZlVHhbY29uZmlnLmJlaGF2aW9yID8/IFwiZGVmZXJyZWRcIl0oKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5jbGFzcyBTUUxpdGVCdW5UcmFuc2FjdGlvbiBleHRlbmRzIFNRTGl0ZVRyYW5zYWN0aW9uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQnVuVHJhbnNhY3Rpb25cIjtcbiAgdHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgICBjb25zdCBzYXZlcG9pbnROYW1lID0gYHNwJHt0aGlzLm5lc3RlZEluZGV4fWA7XG4gICAgY29uc3QgdHggPSBuZXcgU1FMaXRlQnVuVHJhbnNhY3Rpb24oXCJzeW5jXCIsIHRoaXMuZGlhbGVjdCwgdGhpcy5zZXNzaW9uLCB0aGlzLnNjaGVtYSwgdGhpcy5uZXN0ZWRJbmRleCArIDEpO1xuICAgIHRoaXMuc2Vzc2lvbi5ydW4oc3FsLnJhdyhgc2F2ZXBvaW50ICR7c2F2ZXBvaW50TmFtZX1gKSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRyYW5zYWN0aW9uKHR4KTtcbiAgICAgIHRoaXMuc2Vzc2lvbi5ydW4oc3FsLnJhdyhgcmVsZWFzZSBzYXZlcG9pbnQgJHtzYXZlcG9pbnROYW1lfWApKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLnNlc3Npb24ucnVuKHNxbC5yYXcoYHJvbGxiYWNrIHRvIHNhdmVwb2ludCAke3NhdmVwb2ludE5hbWV9YCkpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgUHJlcGFyZWRRdWVyeSBleHRlbmRzIFByZXBhcmVkUXVlcnlCYXNlIHtcbiAgY29uc3RydWN0b3Ioc3RtdCwgcXVlcnksIGxvZ2dlciwgZmllbGRzLCBleGVjdXRlTWV0aG9kLCBfaXNSZXNwb25zZUluQXJyYXlNb2RlLCBjdXN0b21SZXN1bHRNYXBwZXIpIHtcbiAgICBzdXBlcihcInN5bmNcIiwgZXhlY3V0ZU1ldGhvZCwgcXVlcnkpO1xuICAgIHRoaXMuc3RtdCA9IHN0bXQ7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XG4gICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7XG4gICAgdGhpcy5faXNSZXNwb25zZUluQXJyYXlNb2RlID0gX2lzUmVzcG9uc2VJbkFycmF5TW9kZTtcbiAgICB0aGlzLmN1c3RvbVJlc3VsdE1hcHBlciA9IGN1c3RvbVJlc3VsdE1hcHBlcjtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCdW5QcmVwYXJlZFF1ZXJ5XCI7XG4gIHJ1bihwbGFjZWhvbGRlclZhbHVlcykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGZpbGxQbGFjZWhvbGRlcnModGhpcy5xdWVyeS5wYXJhbXMsIHBsYWNlaG9sZGVyVmFsdWVzID8/IHt9KTtcbiAgICB0aGlzLmxvZ2dlci5sb2dRdWVyeSh0aGlzLnF1ZXJ5LnNxbCwgcGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcy5zdG10LnJ1biguLi5wYXJhbXMpO1xuICB9XG4gIGFsbChwbGFjZWhvbGRlclZhbHVlcykge1xuICAgIGNvbnN0IHsgZmllbGRzLCBxdWVyeSwgbG9nZ2VyLCBqb2luc05vdE51bGxhYmxlTWFwLCBzdG10LCBjdXN0b21SZXN1bHRNYXBwZXIgfSA9IHRoaXM7XG4gICAgaWYgKCFmaWVsZHMgJiYgIWN1c3RvbVJlc3VsdE1hcHBlcikge1xuICAgICAgY29uc3QgcGFyYW1zID0gZmlsbFBsYWNlaG9sZGVycyhxdWVyeS5wYXJhbXMsIHBsYWNlaG9sZGVyVmFsdWVzID8/IHt9KTtcbiAgICAgIGxvZ2dlci5sb2dRdWVyeShxdWVyeS5zcWwsIHBhcmFtcyk7XG4gICAgICByZXR1cm4gc3RtdC5hbGwoLi4ucGFyYW1zKTtcbiAgICB9XG4gICAgY29uc3Qgcm93cyA9IHRoaXMudmFsdWVzKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgICBpZiAoY3VzdG9tUmVzdWx0TWFwcGVyKSB7XG4gICAgICByZXR1cm4gY3VzdG9tUmVzdWx0TWFwcGVyKHJvd3MpO1xuICAgIH1cbiAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gbWFwUmVzdWx0Um93KGZpZWxkcywgcm93LCBqb2luc05vdE51bGxhYmxlTWFwKSk7XG4gIH1cbiAgZ2V0KHBsYWNlaG9sZGVyVmFsdWVzKSB7XG4gICAgY29uc3QgcGFyYW1zID0gZmlsbFBsYWNlaG9sZGVycyh0aGlzLnF1ZXJ5LnBhcmFtcywgcGxhY2Vob2xkZXJWYWx1ZXMgPz8ge30pO1xuICAgIHRoaXMubG9nZ2VyLmxvZ1F1ZXJ5KHRoaXMucXVlcnkuc3FsLCBwYXJhbXMpO1xuICAgIGNvbnN0IHJvdyA9IHRoaXMuc3RtdC52YWx1ZXMoLi4ucGFyYW1zKVswXTtcbiAgICBpZiAoIXJvdykge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG4gICAgY29uc3QgeyBmaWVsZHMsIGpvaW5zTm90TnVsbGFibGVNYXAsIGN1c3RvbVJlc3VsdE1hcHBlciB9ID0gdGhpcztcbiAgICBpZiAoIWZpZWxkcyAmJiAhY3VzdG9tUmVzdWx0TWFwcGVyKSB7XG4gICAgICByZXR1cm4gcm93O1xuICAgIH1cbiAgICBpZiAoY3VzdG9tUmVzdWx0TWFwcGVyKSB7XG4gICAgICByZXR1cm4gY3VzdG9tUmVzdWx0TWFwcGVyKFtyb3ddKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcFJlc3VsdFJvdyhmaWVsZHMsIHJvdywgam9pbnNOb3ROdWxsYWJsZU1hcCk7XG4gIH1cbiAgdmFsdWVzKHBsYWNlaG9sZGVyVmFsdWVzKSB7XG4gICAgY29uc3QgcGFyYW1zID0gZmlsbFBsYWNlaG9sZGVycyh0aGlzLnF1ZXJ5LnBhcmFtcywgcGxhY2Vob2xkZXJWYWx1ZXMgPz8ge30pO1xuICAgIHRoaXMubG9nZ2VyLmxvZ1F1ZXJ5KHRoaXMucXVlcnkuc3FsLCBwYXJhbXMpO1xuICAgIHJldHVybiB0aGlzLnN0bXQudmFsdWVzKC4uLnBhcmFtcyk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBpc1Jlc3BvbnNlSW5BcnJheU1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmVzcG9uc2VJbkFycmF5TW9kZTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgUHJlcGFyZWRRdWVyeSxcbiAgU1FMaXRlQnVuU2Vzc2lvbixcbiAgU1FMaXRlQnVuVHJhbnNhY3Rpb25cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXNzaW9uLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgY2hhcmFjdGVycywgbWluaW5nRmxlZXRQYXJ0aWNpcGFudHMsIG1pbmluZ0ZsZWV0cywgcmVzdW1lQ29tbWFuZHMsIHNjaGVtYV9leHBvcnRzLCB1c2VycyB9IGZyb20gXCIuL3NjaGVtYS5qc1wiO1xuaW1wb3J0IHsgQ2hhcmFjdGVySGVscGVyIH0gZnJvbSBcIi4vbW9kZWxzL2NoYXJhY3Rlci5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgVXNlckhlbHBlciB9IGZyb20gXCIuL21vZGVscy91c2VyLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBSZXN1bWVDb21tYW5kIH0gZnJvbSBcIi4vbW9kZWxzL3Jlc3VtZS1jb21tYW5kLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBtb2RlbHNfZXhwb3J0cyB9IGZyb20gXCIuL21vZGVscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZHJpenpsZSB9IGZyb20gXCJkcml6emxlLW9ybS9idW4tc3FsaXRlXCI7XG5pbXBvcnQgeyBEYXRhYmFzZSB9IGZyb20gXCJidW46c3FsaXRlXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG4vLyNyZWdpb24gc3JjL2RiL2luZGV4LnRzXG5jb25zdCBEQl9QQVRIID0gcHJvY2Vzcy5lbnYuQVVUSF9EQl9QQVRIIHx8IGpvaW4ocHJvY2Vzcy5jd2QoKSwgXCIuLi8uLi9kYi9raXR0ZW4uZGJcIik7XG5jb25zb2xlLmxvZyhcIlVzaW5nIERCX1BBVEg6XCIsIERCX1BBVEgpO1xuY29uc3Qgc3FsaXRlID0gbmV3IERhdGFiYXNlKERCX1BBVEgpO1xuY29uc3QgZGIgPSBkcml6emxlKHNxbGl0ZSwgeyBzY2hlbWE6IHtcblx0dXNlcnMsXG5cdGNoYXJhY3RlcnMsXG5cdHJlc3VtZUNvbW1hbmRzLFxuXHRtaW5pbmdGbGVldHMsXG5cdG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzXG59IH0pO1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IENoYXJhY3RlckhlbHBlciwgREJfUEFUSCwgUmVzdW1lQ29tbWFuZCwgVXNlckhlbHBlciwgZGIsIG1vZGVsc19leHBvcnRzIGFzIG1vZGVscywgc2NoZW1hX2V4cG9ydHMgYXMgc2NoZW1hIH07IiwKICAgICJpbXBvcnQgdHlwZSB7IEVWRUF1dGggfSBmcm9tICdAL21pZGRsZXdhcmUnO1xuaW1wb3J0IHsgc2V0Q29va2llIH0gZnJvbSAnQC91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSAnYnJpc2EnO1xuaW1wb3J0IHsgQ2hhcmFjdGVySGVscGVyLCBVc2VySGVscGVyIH0gZnJvbSAnQHN0YXIta2l0dGVuL2V2ZS9kYic7XG5cbi8vIEdFVCAvYXBpL2F1dGgvZGlzY29yZElELzpkaXNjb3JkSUQvYWRkU2NvcGVzL2NoYXJhY3RlcklELzpjaGFyYWN0ZXJJRC9zY29wZXMvOnNjb3Blc1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIEdFVCh7IHN0b3JlLCByb3V0ZTogeyBwYXJhbXMgfSB9OiBSZXF1ZXN0Q29udGV4dCkge1xuICBjb25zdCBldmVhdXRoOiBFVkVBdXRoID0gc3RvcmUuZ2V0KCdldmVhdXRoJyk7XG5cbiAgY29uc3QgZGlzY29yZElEID0gcGFyYW1zIVsnZGlzY29yZElEJ10gYXMgc3RyaW5nO1xuICBjb25zdCBjaGFyYWN0ZXJJRCA9IHBhcmFtcyFbJ2NoYXJhY3RlcklEJ10gYXMgc3RyaW5nO1xuICBjb25zdCByZXF1aXJlZFNjb3BlcyA9IChwYXJhbXMhWydzY29wZXMnXSBhcyBzdHJpbmcpLnNwbGl0KCcsJyk7XG5cbiAgY29uc3QgdXNlciA9IFVzZXJIZWxwZXIuZmluZEJ5RGlzY29yZElkKGRpc2NvcmRJRCk7XG4gIGNvbnN0IGNoYXJhY3RlciA9IENoYXJhY3RlckhlbHBlci5maW5kQnlVc2VyQW5kRXZlSUQodXNlci5pZCwgTnVtYmVyKGNoYXJhY3RlcklEKSk7XG4gIGlmICghY2hhcmFjdGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDaGFyYWN0ZXIgJHtjaGFyYWN0ZXJJRH0gbm90IGZvdW5kYCk7XG4gIH1cblxuICBjb25zdCBjdXJyZW50U2NvcGVzID0gQ2hhcmFjdGVySGVscGVyLmdldFNjb3BlcyhjaGFyYWN0ZXIpO1xuICBjb25zdCBzZXQgPSBuZXcgU2V0KGN1cnJlbnRTY29wZXMpO1xuICByZXF1aXJlZFNjb3Blcy5mb3JFYWNoKChzY29wZSkgPT4gc2V0LmFkZChzY29wZSkpO1xuICBjb25zdCBzY29wZXMgPSBBcnJheS5mcm9tKHNldCkuam9pbignICcpO1xuXG4gIC8vIEFzIHRoaXMgaXMgYWRkaW5nIHNjb3Blcywgd2UgbmVlZCB0byByZWRpcmVjdCB0aGUgdXNlciB0byB0aGUgYXV0aCBwYWdlXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZXZlYXV0aC5yZWRpcmVjdChzY29wZXMpO1xuICBzZXRDb29raWUocmVzcG9uc2UsICdkaXNjb3JkSUQnLCBkaXNjb3JkSUQsIDYwICogMTAgLyogMTAgbWluICovKTtcbiAgc2V0Q29va2llKHJlc3BvbnNlLCAnY2hhcmFjdGVySUQnLCBjaGFyYWN0ZXJJRCwgNjAgKiAxMCAvKiAxMCBtaW4gKi8pO1xuICByZXR1cm4gcmVzcG9uc2U7XG59IgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFFQSxJQUFJO0FBQUEsRUFDSixJQUFJLFVBQVMsT0FBTztBQUFBLEVBR3BCLFNBQVMsU0FBVSxDQUFDLEtBQUssS0FBSztBQUFBLElBQzVCLFNBQVMsT0FBTyxLQUFLO0FBQUEsTUFDbkIsSUFBSSxPQUFPLElBQUk7QUFBQSxJQUNqQjtBQUFBO0FBQUEsRUFFRixJQUFJLFFBQU8sUUFBUSxRQUFPLFNBQVMsUUFBTyxlQUFlLFFBQU8saUJBQWlCO0FBQUEsSUFDL0UsT0FBTyxVQUFVO0FBQUEsRUFDbkIsRUFBTztBQUFBLElBRUwsVUFBVSxRQUFRLE9BQU87QUFBQSxJQUN6QixRQUFRLFNBQVM7QUFBQTtBQUFB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O0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxJQUVBLElBQUksYUFBYTtBQUFBLE1BQ2Y7QUFBQSxNQUFHO0FBQUEsTUFDSDtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBRztBQUFBLE1BQ3ZCO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFDbEI7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUNsQjtBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQ2xCO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsSUFDcEI7QUFBQSxJQUVBLElBQUksYUFBYTtBQUFBLE1BQ2Y7QUFBQSxNQUFHO0FBQUEsTUFDSDtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQzVEO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFTO0FBQUEsTUFDM0Q7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVM7QUFBQSxNQUMzRDtBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBUztB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QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxPQUFTLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDdEQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLFFBQVEsTUFBTztBQUFBLE1BQ2pELE9BQU87QUFBQSxNQUVQLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxPQUFTLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDdEQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLFFBQVEsTUFBTztBQUFBLE1BQ2pELE9BQU87QUFBQSxNQUVQLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsSUFBSSxPQUFTLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDdEQs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LEVBQU8sU0FBSSxJQUFJLEdBQUc7QUFBQSxVQUNoQixNQUFNO0FBQUEsUUFDUjtBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQUEsTUFDQSxPQUFPO0FBQUE7QUFBQSxJQUdULEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxPQUFPLEtBQUssS0FBSyxHQUFHLE1BQU07QUFBQTtBQUFBLElBRzVCLEdBQUcsVUFBVSxLQUFLLFNBQVMsRUFBRyxDQUFDLEtBQUs7QUFBQSxNQUNsQyxPQUFPLEtBQUssSUFBSSxHQUFHLE1BQU07QUFBQTtBQUFBLElBRzNCLEdBQUcsVUFBVSxPQUFPLFNBQVMsSUFBSyxDQUFDLEtBQUs7QUFBQSxNQUN0QyxPQUFPLEtBQUssS0FBSyxHQUFHLEtBQUs7QUFBQTtBQUFBLElBRzNCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxPQUFPLEtBQUssSUFBSSxHQUFHLEtBQUs7QUFBQTtBQUFBLElBRzFCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxPQUFPLEtBQUssS0FBSyxHQUFHLE1BQU07QUFBQTtBQUFBLElBRzVCLEdBQUcsVUFBVSxLQUFLLFNBQVMsRUFBRyxDQUFDLEtBQUs7QUFBQSxNQUNsQyxPQUFPLEtBQUssSUFBSSxHQUFHLE1BQU07QUFBQTtBQUFBLElBRzNCLEdBQUcsVUFBVSxPQUFPLFNBQVMsSUFBSyxDQUFDLEtBQUs7QUFBQSxNQUN0QyxPQUFPLEtBQUssS0FBSyxHQUFHLEtBQUs7QUFBQTtBQUFBLElBRzNCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxPQUFPLEtBQUssSUFBSSxHQUFHLEtBQUs7QUFBQTtBQUFBLElBRzFCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxPQUFPLEtBQUssS0FBSyxHQUFHLE1BQU07QUFBQTtBQUFBLElBRzVCLEdBQUcsVUFBVSxLQUFLLFNBQVMs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RXZCLElBQUksS0FBSyxLQUFLLEVBQUUsT0FBTztBQUFBLE1BRXZCLElBQUksT0FBTyxHQUFHLE9BQU87QUFBQSxNQUVyQixJQUFJLElBQUksS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLElBQUk7QUFBQSxNQUMzRCxJQUFJLEVBQUUsUUFBUSxDQUFDO0FBQUEsTUFFZixJQUFJLElBQUksR0FBRyxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLEtBQUssTUFBTSxDQUFDO0FBQUEsTUFFdEQsSUFBSSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQztBQUFBLE1BRXZDLEtBQUs7QUFBQSxNQUVMLElBQUksUUFBUSxLQUFLLFFBQVEsSUFBSTtBQUFBLE1BQzdCLFFBQVEsTUFBTSxRQUFRLEtBQUs7QUFBQSxNQUMzQixRQUFRLE1BQU0sUUFBUSxLQUFLO0FBQUEsTUFDM0IsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsS0FBSztBQUFBLE1BRXpDLEtBQUssS0FBSyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQUEsSUFDM0IsRUFBTztBQUFBLE1BS0wsSUFBSSxRQUFRLEtBQUssRUFBRSxPQUFPO0FBQUEsTUFFMUIsSUFBSSxRQUFRLEtBQUssRUFBRSxPQUFPO0FBQUEsTUFFMUIsSUFBSSxPQUFPLEtBQUssRUFBRSxPQUFPLEtBQUs7QUFBQSxNQUU5QixJQUFJLFFBQVEsS0FBSyxFQUFFLE9BQU8sS0FBSyxFQUFFLE9BQU8sS0FBSyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQUEsTUFDNUQsUUFBUSxNQUFNLE9BQU8sS0FBSyxFQUFFLFFBQVEsS0FBSztBQUFBLE1BRXpDLElBQUksUUFBUSxLQUFLLFFBQVEsSUFBSTtBQUFBLE1BQzdCLFFBQVEsTUFBTSxRQUFRLEtBQUs7QUFBQSxNQUMzQixJQUFJLFFBQVEsTUFBTSxPQUFPLEtBQUs7QUFBQSxNQUM5QixLQUFLLE1BQU0sT0FB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O0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsRUFDdEM7QUFBQSxFQUVBLFNBQVMsTUFBTSxHQUFHO0FBQUEsSUFDaEIsTUFBTSxnQkFBZ0I7QUFBQSxNQUNwQixPQUFPLElBQUk7QUFBQSxJQUViLFVBQVUsS0FBSyxJQUFJO0FBQUEsSUFDbkIsS0FBSyxJQUFJO0FBQUEsTUFDUDtBQUFBLE1BQVk7QUFBQSxNQUFZO0FBQUEsTUFBWTtBQUFBLE1BQ3BDO0FBQUEsTUFBWTtBQUFBLE1BQVk7QUFBQSxNQUFZO0FBQUEsSUFDdEM7QUFBQSxJQUNBLEtBQUssSUFBSTtBQUFBLElBQ1QsS0FBSyxJQUFJLElBQUksTUFBTSxFQUFFO0FBQUE7QUFBQSxFQUV2QixNQUFNLFNBQVMsUUFBUSxTQUFTO0FBQUEsRUFDaEMsT0FBTyxVQUFVO0FBQUEsRUFFakIsT0FBTyxZQUFZO0FBQUEsRUFDbkIsT0FBTyxVQUFVO0FBQUEsRUFDakIsT0FBTyxlQUFlO0FBQUEsRUFDdEIsT0FBTyxZQUFZO0FBQUEsRUFFbkIsT0FB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QUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFB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QUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFFaEIsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU07QUFBQSxJQUNqQyxTQUFTLElBQUksRUFBRyxJQUFJLEVBQUUsUUFBUSxLQUFLLEdBQUc7QUFBQSxNQUNwQyxJQUFJLFFBQVE7QUFBQSxNQUNaLElBQUksUUFBUTtBQUFBLE1BQ1osSUFBSSxRQUFRLFVBQVUsSUFBSSxFQUFFO0FBQUEsTUFDNUIsSUFBSSxRQUFRLFVBQVUsSUFBSSxFQUFFO0FBQUEsTUFDNUIsSUFBSSxRQUFRLFFBQVEsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7QUFBQSxNQUMxQyxJQUFJLFFBQVEsUUFBUSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtBQUFBLE1BQzFDLElBQUksUUFBUSxLQUFLLEVBQUU7QUFBQSxNQUNuQixJQUFJLFFBQVEsS0FBSyxFQUFFLElBQUk7QUFBQSxNQUN2QixJQUFJLFFBQVEsRUFBRTtBQUFBLE1BQ2QsSUFBSSxRQUFRLEVB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QUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFDbkQ7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUNsRDtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQ25EO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsRUFDcEQ7QUFBQSxFQUVBLElBQUksS0FBSztBQUFBLElBQ1A7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUNsRDtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQ25EO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDbEQ7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUNsRDtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLEVBQ3BEO0FBQUEsRUFFQSxJQUFJLElBQUk7QUFBQSxJQUNOO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDckQ7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUNwRDtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQ3JEO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDcEQ7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxFQUN2RDtBQUFBLEVBRUEsSUFBSSxLQUFLO0FBQUEsSUFDUDtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQ3JEO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFDcEQ7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJ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QTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxLQUFLO0FBQUEsTUFDSCxLQUFLO0FBQUEsTUFDTCxRQUFRO0FBQUEsUUFDTjtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFB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
diff --git a/packages/eve-web/build/api/auth/discordID/[discordID]/characterID/[characterID]/modules/[modules].js b/packages/eve-web/build/api/auth/discordID/[discordID]/characterID/[characterID]/modules/[modules].js
deleted file mode 100644
index faa4159..0000000
--- a/packages/eve-web/build/api/auth/discordID/[discordID]/characterID/[characterID]/modules/[modules].js
+++ /dev/null
@@ -1,18217 +0,0 @@
-// @bun
-var __create = Object.create;
-var __getProtoOf = Object.getPrototypeOf;
-var __defProp = Object.defineProperty;
-var __getOwnPropNames = Object.getOwnPropertyNames;
-var __hasOwnProp = Object.prototype.hasOwnProperty;
-var __toESM = (mod, isNodeMode, target) => {
- target = mod != null ? __create(__getProtoOf(mod)) : {};
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
- for (let key of __getOwnPropNames(mod))
- if (!__hasOwnProp.call(to, key))
- __defProp(to, key, {
- get: () => mod[key],
- enumerable: true
- });
- return to;
-};
-var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
-var __require = import.meta.require;
-
-// ../eve/node_modules/safe-buffer/index.js
-var require_safe_buffer = __commonJS((exports, module) => {
- /*! safe-buffer. MIT License. Feross Aboukhadijeh */
- var buffer = __require("buffer");
- var Buffer2 = buffer.Buffer;
- function copyProps(src, dst) {
- for (var key in src) {
- dst[key] = src[key];
- }
- }
- if (Buffer2.from && Buffer2.alloc && Buffer2.allocUnsafe && Buffer2.allocUnsafeSlow) {
- module.exports = buffer;
- } else {
- copyProps(buffer, exports);
- exports.Buffer = SafeBuffer;
- }
- function SafeBuffer(arg, encodingOrOffset, length) {
- return Buffer2(arg, encodingOrOffset, length);
- }
- SafeBuffer.prototype = Object.create(Buffer2.prototype);
- copyProps(Buffer2, SafeBuffer);
- SafeBuffer.from = function(arg, encodingOrOffset, length) {
- if (typeof arg === "number") {
- throw new TypeError("Argument must not be a number");
- }
- return Buffer2(arg, encodingOrOffset, length);
- };
- SafeBuffer.alloc = function(size, fill, encoding) {
- if (typeof size !== "number") {
- throw new TypeError("Argument must be a number");
- }
- var buf = Buffer2(size);
- if (fill !== undefined) {
- if (typeof encoding === "string") {
- buf.fill(fill, encoding);
- } else {
- buf.fill(fill);
- }
- } else {
- buf.fill(0);
- }
- return buf;
- };
- SafeBuffer.allocUnsafe = function(size) {
- if (typeof size !== "number") {
- throw new TypeError("Argument must be a number");
- }
- return Buffer2(size);
- };
- SafeBuffer.allocUnsafeSlow = function(size) {
- if (typeof size !== "number") {
- throw new TypeError("Argument must be a number");
- }
- return buffer.SlowBuffer(size);
- };
-});
-
-// ../eve/node_modules/jws/lib/data-stream.js
-var require_data_stream = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var Stream = __require("stream");
- var util = __require("util");
- function DataStream(data) {
- this.buffer = null;
- this.writable = true;
- this.readable = true;
- if (!data) {
- this.buffer = Buffer2.alloc(0);
- return this;
- }
- if (typeof data.pipe === "function") {
- this.buffer = Buffer2.alloc(0);
- data.pipe(this);
- return this;
- }
- if (data.length || typeof data === "object") {
- this.buffer = data;
- this.writable = false;
- process.nextTick(function() {
- this.emit("end", data);
- this.readable = false;
- this.emit("close");
- }.bind(this));
- return this;
- }
- throw new TypeError("Unexpected data type (" + typeof data + ")");
- }
- util.inherits(DataStream, Stream);
- DataStream.prototype.write = function write(data) {
- this.buffer = Buffer2.concat([this.buffer, Buffer2.from(data)]);
- this.emit("data", data);
- };
- DataStream.prototype.end = function end(data) {
- if (data)
- this.write(data);
- this.emit("end", data);
- this.emit("close");
- this.writable = false;
- this.readable = false;
- };
- module.exports = DataStream;
-});
-
-// ../eve/node_modules/ecdsa-sig-formatter/src/param-bytes-for-alg.js
-var require_param_bytes_for_alg = __commonJS((exports, module) => {
- function getParamSize(keySize) {
- var result = (keySize / 8 | 0) + (keySize % 8 === 0 ? 0 : 1);
- return result;
- }
- var paramBytesForAlg = {
- ES256: getParamSize(256),
- ES384: getParamSize(384),
- ES512: getParamSize(521)
- };
- function getParamBytesForAlg(alg) {
- var paramBytes = paramBytesForAlg[alg];
- if (paramBytes) {
- return paramBytes;
- }
- throw new Error('Unknown algorithm "' + alg + '"');
- }
- module.exports = getParamBytesForAlg;
-});
-
-// ../eve/node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.js
-var require_ecdsa_sig_formatter = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var getParamBytesForAlg = require_param_bytes_for_alg();
- var MAX_OCTET = 128;
- var CLASS_UNIVERSAL = 0;
- var PRIMITIVE_BIT = 32;
- var TAG_SEQ = 16;
- var TAG_INT = 2;
- var ENCODED_TAG_SEQ = TAG_SEQ | PRIMITIVE_BIT | CLASS_UNIVERSAL << 6;
- var ENCODED_TAG_INT = TAG_INT | CLASS_UNIVERSAL << 6;
- function base64Url(base64) {
- return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
- }
- function signatureAsBuffer(signature) {
- if (Buffer2.isBuffer(signature)) {
- return signature;
- } else if (typeof signature === "string") {
- return Buffer2.from(signature, "base64");
- }
- throw new TypeError("ECDSA signature must be a Base64 string or a Buffer");
- }
- function derToJose(signature, alg) {
- signature = signatureAsBuffer(signature);
- var paramBytes = getParamBytesForAlg(alg);
- var maxEncodedParamLength = paramBytes + 1;
- var inputLength = signature.length;
- var offset = 0;
- if (signature[offset++] !== ENCODED_TAG_SEQ) {
- throw new Error('Could not find expected "seq"');
- }
- var seqLength = signature[offset++];
- if (seqLength === (MAX_OCTET | 1)) {
- seqLength = signature[offset++];
- }
- if (inputLength - offset < seqLength) {
- throw new Error('"seq" specified length of "' + seqLength + '", only "' + (inputLength - offset) + '" remaining');
- }
- if (signature[offset++] !== ENCODED_TAG_INT) {
- throw new Error('Could not find expected "int" for "r"');
- }
- var rLength = signature[offset++];
- if (inputLength - offset - 2 < rLength) {
- throw new Error('"r" specified length of "' + rLength + '", only "' + (inputLength - offset - 2) + '" available');
- }
- if (maxEncodedParamLength < rLength) {
- throw new Error('"r" specified length of "' + rLength + '", max of "' + maxEncodedParamLength + '" is acceptable');
- }
- var rOffset = offset;
- offset += rLength;
- if (signature[offset++] !== ENCODED_TAG_INT) {
- throw new Error('Could not find expected "int" for "s"');
- }
- var sLength = signature[offset++];
- if (inputLength - offset !== sLength) {
- throw new Error('"s" specified length of "' + sLength + '", expected "' + (inputLength - offset) + '"');
- }
- if (maxEncodedParamLength < sLength) {
- throw new Error('"s" specified length of "' + sLength + '", max of "' + maxEncodedParamLength + '" is acceptable');
- }
- var sOffset = offset;
- offset += sLength;
- if (offset !== inputLength) {
- throw new Error('Expected to consume entire buffer, but "' + (inputLength - offset) + '" bytes remain');
- }
- var rPadding = paramBytes - rLength, sPadding = paramBytes - sLength;
- var dst = Buffer2.allocUnsafe(rPadding + rLength + sPadding + sLength);
- for (offset = 0;offset < rPadding; ++offset) {
- dst[offset] = 0;
- }
- signature.copy(dst, offset, rOffset + Math.max(-rPadding, 0), rOffset + rLength);
- offset = paramBytes;
- for (var o = offset;offset < o + sPadding; ++offset) {
- dst[offset] = 0;
- }
- signature.copy(dst, offset, sOffset + Math.max(-sPadding, 0), sOffset + sLength);
- dst = dst.toString("base64");
- dst = base64Url(dst);
- return dst;
- }
- function countPadding(buf, start, stop) {
- var padding = 0;
- while (start + padding < stop && buf[start + padding] === 0) {
- ++padding;
- }
- var needsSign = buf[start + padding] >= MAX_OCTET;
- if (needsSign) {
- --padding;
- }
- return padding;
- }
- function joseToDer(signature, alg) {
- signature = signatureAsBuffer(signature);
- var paramBytes = getParamBytesForAlg(alg);
- var signatureBytes = signature.length;
- if (signatureBytes !== paramBytes * 2) {
- throw new TypeError('"' + alg + '" signatures must be "' + paramBytes * 2 + '" bytes, saw "' + signatureBytes + '"');
- }
- var rPadding = countPadding(signature, 0, paramBytes);
- var sPadding = countPadding(signature, paramBytes, signature.length);
- var rLength = paramBytes - rPadding;
- var sLength = paramBytes - sPadding;
- var rsBytes = 1 + 1 + rLength + 1 + 1 + sLength;
- var shortLength = rsBytes < MAX_OCTET;
- var dst = Buffer2.allocUnsafe((shortLength ? 2 : 3) + rsBytes);
- var offset = 0;
- dst[offset++] = ENCODED_TAG_SEQ;
- if (shortLength) {
- dst[offset++] = rsBytes;
- } else {
- dst[offset++] = MAX_OCTET | 1;
- dst[offset++] = rsBytes & 255;
- }
- dst[offset++] = ENCODED_TAG_INT;
- dst[offset++] = rLength;
- if (rPadding < 0) {
- dst[offset++] = 0;
- offset += signature.copy(dst, offset, 0, paramBytes);
- } else {
- offset += signature.copy(dst, offset, rPadding, paramBytes);
- }
- dst[offset++] = ENCODED_TAG_INT;
- dst[offset++] = sLength;
- if (sPadding < 0) {
- dst[offset++] = 0;
- signature.copy(dst, offset, paramBytes);
- } else {
- signature.copy(dst, offset, paramBytes + sPadding);
- }
- return dst;
- }
- module.exports = {
- derToJose,
- joseToDer
- };
-});
-
-// ../eve/node_modules/buffer-equal-constant-time/index.js
-var require_buffer_equal_constant_time = __commonJS((exports, module) => {
- var Buffer2 = __require("buffer").Buffer;
- var SlowBuffer = __require("buffer").SlowBuffer;
- module.exports = bufferEq;
- function bufferEq(a, b) {
- if (!Buffer2.isBuffer(a) || !Buffer2.isBuffer(b)) {
- return false;
- }
- if (a.length !== b.length) {
- return false;
- }
- var c = 0;
- for (var i = 0;i < a.length; i++) {
- c |= a[i] ^ b[i];
- }
- return c === 0;
- }
- bufferEq.install = function() {
- Buffer2.prototype.equal = SlowBuffer.prototype.equal = function equal(that) {
- return bufferEq(this, that);
- };
- };
- var origBufEqual = Buffer2.prototype.equal;
- var origSlowBufEqual = SlowBuffer.prototype.equal;
- bufferEq.restore = function() {
- Buffer2.prototype.equal = origBufEqual;
- SlowBuffer.prototype.equal = origSlowBufEqual;
- };
-});
-
-// ../eve/node_modules/jwa/index.js
-var require_jwa = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var crypto2 = __require("crypto");
- var formatEcdsa = require_ecdsa_sig_formatter();
- var util = __require("util");
- var MSG_INVALID_ALGORITHM = `"%s" is not a valid algorithm.
- Supported algorithms are:
- "HS256", "HS384", "HS512", "RS256", "RS384", "RS512", "PS256", "PS384", "PS512", "ES256", "ES384", "ES512" and "none".`;
- var MSG_INVALID_SECRET = "secret must be a string or buffer";
- var MSG_INVALID_VERIFIER_KEY = "key must be a string or a buffer";
- var MSG_INVALID_SIGNER_KEY = "key must be a string, a buffer or an object";
- var supportsKeyObjects = typeof crypto2.createPublicKey === "function";
- if (supportsKeyObjects) {
- MSG_INVALID_VERIFIER_KEY += " or a KeyObject";
- MSG_INVALID_SECRET += "or a KeyObject";
- }
- function checkIsPublicKey(key) {
- if (Buffer2.isBuffer(key)) {
- return;
- }
- if (typeof key === "string") {
- return;
- }
- if (!supportsKeyObjects) {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key !== "object") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key.type !== "string") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key.asymmetricKeyType !== "string") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key.export !== "function") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- }
- function checkIsPrivateKey(key) {
- if (Buffer2.isBuffer(key)) {
- return;
- }
- if (typeof key === "string") {
- return;
- }
- if (typeof key === "object") {
- return;
- }
- throw typeError(MSG_INVALID_SIGNER_KEY);
- }
- function checkIsSecretKey(key) {
- if (Buffer2.isBuffer(key)) {
- return;
- }
- if (typeof key === "string") {
- return key;
- }
- if (!supportsKeyObjects) {
- throw typeError(MSG_INVALID_SECRET);
- }
- if (typeof key !== "object") {
- throw typeError(MSG_INVALID_SECRET);
- }
- if (key.type !== "secret") {
- throw typeError(MSG_INVALID_SECRET);
- }
- if (typeof key.export !== "function") {
- throw typeError(MSG_INVALID_SECRET);
- }
- }
- function fromBase64(base64) {
- return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
- }
- function toBase64(base64url) {
- base64url = base64url.toString();
- var padding = 4 - base64url.length % 4;
- if (padding !== 4) {
- for (var i = 0;i < padding; ++i) {
- base64url += "=";
- }
- }
- return base64url.replace(/\-/g, "+").replace(/_/g, "/");
- }
- function typeError(template) {
- var args = [].slice.call(arguments, 1);
- var errMsg = util.format.bind(util, template).apply(null, args);
- return new TypeError(errMsg);
- }
- function bufferOrString(obj) {
- return Buffer2.isBuffer(obj) || typeof obj === "string";
- }
- function normalizeInput(thing) {
- if (!bufferOrString(thing))
- thing = JSON.stringify(thing);
- return thing;
- }
- function createHmacSigner(bits) {
- return function sign(thing, secret) {
- checkIsSecretKey(secret);
- thing = normalizeInput(thing);
- var hmac = crypto2.createHmac("sha" + bits, secret);
- var sig = (hmac.update(thing), hmac.digest("base64"));
- return fromBase64(sig);
- };
- }
- var bufferEqual;
- var timingSafeEqual = "timingSafeEqual" in crypto2 ? function timingSafeEqual(a, b) {
- if (a.byteLength !== b.byteLength) {
- return false;
- }
- return crypto2.timingSafeEqual(a, b);
- } : function timingSafeEqual(a, b) {
- if (!bufferEqual) {
- bufferEqual = require_buffer_equal_constant_time();
- }
- return bufferEqual(a, b);
- };
- function createHmacVerifier(bits) {
- return function verify(thing, signature, secret) {
- var computedSig = createHmacSigner(bits)(thing, secret);
- return timingSafeEqual(Buffer2.from(signature), Buffer2.from(computedSig));
- };
- }
- function createKeySigner(bits) {
- return function sign(thing, privateKey) {
- checkIsPrivateKey(privateKey);
- thing = normalizeInput(thing);
- var signer = crypto2.createSign("RSA-SHA" + bits);
- var sig = (signer.update(thing), signer.sign(privateKey, "base64"));
- return fromBase64(sig);
- };
- }
- function createKeyVerifier(bits) {
- return function verify(thing, signature, publicKey) {
- checkIsPublicKey(publicKey);
- thing = normalizeInput(thing);
- signature = toBase64(signature);
- var verifier = crypto2.createVerify("RSA-SHA" + bits);
- verifier.update(thing);
- return verifier.verify(publicKey, signature, "base64");
- };
- }
- function createPSSKeySigner(bits) {
- return function sign(thing, privateKey) {
- checkIsPrivateKey(privateKey);
- thing = normalizeInput(thing);
- var signer = crypto2.createSign("RSA-SHA" + bits);
- var sig = (signer.update(thing), signer.sign({
- key: privateKey,
- padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
- saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
- }, "base64"));
- return fromBase64(sig);
- };
- }
- function createPSSKeyVerifier(bits) {
- return function verify(thing, signature, publicKey) {
- checkIsPublicKey(publicKey);
- thing = normalizeInput(thing);
- signature = toBase64(signature);
- var verifier = crypto2.createVerify("RSA-SHA" + bits);
- verifier.update(thing);
- return verifier.verify({
- key: publicKey,
- padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
- saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
- }, signature, "base64");
- };
- }
- function createECDSASigner(bits) {
- var inner = createKeySigner(bits);
- return function sign() {
- var signature = inner.apply(null, arguments);
- signature = formatEcdsa.derToJose(signature, "ES" + bits);
- return signature;
- };
- }
- function createECDSAVerifer(bits) {
- var inner = createKeyVerifier(bits);
- return function verify(thing, signature, publicKey) {
- signature = formatEcdsa.joseToDer(signature, "ES" + bits).toString("base64");
- var result = inner(thing, signature, publicKey);
- return result;
- };
- }
- function createNoneSigner() {
- return function sign() {
- return "";
- };
- }
- function createNoneVerifier() {
- return function verify(thing, signature) {
- return signature === "";
- };
- }
- module.exports = function jwa(algorithm) {
- var signerFactories = {
- hs: createHmacSigner,
- rs: createKeySigner,
- ps: createPSSKeySigner,
- es: createECDSASigner,
- none: createNoneSigner
- };
- var verifierFactories = {
- hs: createHmacVerifier,
- rs: createKeyVerifier,
- ps: createPSSKeyVerifier,
- es: createECDSAVerifer,
- none: createNoneVerifier
- };
- var match = algorithm.match(/^(RS|PS|ES|HS)(256|384|512)$|^(none)$/i);
- if (!match)
- throw typeError(MSG_INVALID_ALGORITHM, algorithm);
- var algo = (match[1] || match[3]).toLowerCase();
- var bits = match[2];
- return {
- sign: signerFactories[algo](bits),
- verify: verifierFactories[algo](bits)
- };
- };
-});
-
-// ../eve/node_modules/jws/lib/tostring.js
-var require_tostring = __commonJS((exports, module) => {
- var Buffer2 = __require("buffer").Buffer;
- module.exports = function toString(obj) {
- if (typeof obj === "string")
- return obj;
- if (typeof obj === "number" || Buffer2.isBuffer(obj))
- return obj.toString();
- return JSON.stringify(obj);
- };
-});
-
-// ../eve/node_modules/jws/lib/sign-stream.js
-var require_sign_stream = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var DataStream = require_data_stream();
- var jwa = require_jwa();
- var Stream = __require("stream");
- var toString = require_tostring();
- var util = __require("util");
- function base64url(string, encoding) {
- return Buffer2.from(string, encoding).toString("base64").replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
- }
- function jwsSecuredInput(header, payload, encoding) {
- encoding = encoding || "utf8";
- var encodedHeader = base64url(toString(header), "binary");
- var encodedPayload = base64url(toString(payload), encoding);
- return util.format("%s.%s", encodedHeader, encodedPayload);
- }
- function jwsSign(opts) {
- var header = opts.header;
- var payload = opts.payload;
- var secretOrKey = opts.secret || opts.privateKey;
- var encoding = opts.encoding;
- var algo = jwa(header.alg);
- var securedInput = jwsSecuredInput(header, payload, encoding);
- var signature = algo.sign(securedInput, secretOrKey);
- return util.format("%s.%s", securedInput, signature);
- }
- function SignStream(opts) {
- var secret = opts.secret || opts.privateKey || opts.key;
- var secretStream = new DataStream(secret);
- this.readable = true;
- this.header = opts.header;
- this.encoding = opts.encoding;
- this.secret = this.privateKey = this.key = secretStream;
- this.payload = new DataStream(opts.payload);
- this.secret.once("close", function() {
- if (!this.payload.writable && this.readable)
- this.sign();
- }.bind(this));
- this.payload.once("close", function() {
- if (!this.secret.writable && this.readable)
- this.sign();
- }.bind(this));
- }
- util.inherits(SignStream, Stream);
- SignStream.prototype.sign = function sign() {
- try {
- var signature = jwsSign({
- header: this.header,
- payload: this.payload.buffer,
- secret: this.secret.buffer,
- encoding: this.encoding
- });
- this.emit("done", signature);
- this.emit("data", signature);
- this.emit("end");
- this.readable = false;
- return signature;
- } catch (e) {
- this.readable = false;
- this.emit("error", e);
- this.emit("close");
- }
- };
- SignStream.sign = jwsSign;
- module.exports = SignStream;
-});
-
-// ../eve/node_modules/jws/lib/verify-stream.js
-var require_verify_stream = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var DataStream = require_data_stream();
- var jwa = require_jwa();
- var Stream = __require("stream");
- var toString = require_tostring();
- var util = __require("util");
- var JWS_REGEX = /^[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?\.([a-zA-Z0-9\-_]+)?$/;
- function isObject(thing) {
- return Object.prototype.toString.call(thing) === "[object Object]";
- }
- function safeJsonParse(thing) {
- if (isObject(thing))
- return thing;
- try {
- return JSON.parse(thing);
- } catch (e) {
- return;
- }
- }
- function headerFromJWS(jwsSig) {
- var encodedHeader = jwsSig.split(".", 1)[0];
- return safeJsonParse(Buffer2.from(encodedHeader, "base64").toString("binary"));
- }
- function securedInputFromJWS(jwsSig) {
- return jwsSig.split(".", 2).join(".");
- }
- function signatureFromJWS(jwsSig) {
- return jwsSig.split(".")[2];
- }
- function payloadFromJWS(jwsSig, encoding) {
- encoding = encoding || "utf8";
- var payload = jwsSig.split(".")[1];
- return Buffer2.from(payload, "base64").toString(encoding);
- }
- function isValidJws(string) {
- return JWS_REGEX.test(string) && !!headerFromJWS(string);
- }
- function jwsVerify(jwsSig, algorithm, secretOrKey) {
- if (!algorithm) {
- var err = new Error("Missing algorithm parameter for jws.verify");
- err.code = "MISSING_ALGORITHM";
- throw err;
- }
- jwsSig = toString(jwsSig);
- var signature = signatureFromJWS(jwsSig);
- var securedInput = securedInputFromJWS(jwsSig);
- var algo = jwa(algorithm);
- return algo.verify(securedInput, signature, secretOrKey);
- }
- function jwsDecode(jwsSig, opts) {
- opts = opts || {};
- jwsSig = toString(jwsSig);
- if (!isValidJws(jwsSig))
- return null;
- var header = headerFromJWS(jwsSig);
- if (!header)
- return null;
- var payload = payloadFromJWS(jwsSig);
- if (header.typ === "JWT" || opts.json)
- payload = JSON.parse(payload, opts.encoding);
- return {
- header,
- payload,
- signature: signatureFromJWS(jwsSig)
- };
- }
- function VerifyStream(opts) {
- opts = opts || {};
- var secretOrKey = opts.secret || opts.publicKey || opts.key;
- var secretStream = new DataStream(secretOrKey);
- this.readable = true;
- this.algorithm = opts.algorithm;
- this.encoding = opts.encoding;
- this.secret = this.publicKey = this.key = secretStream;
- this.signature = new DataStream(opts.signature);
- this.secret.once("close", function() {
- if (!this.signature.writable && this.readable)
- this.verify();
- }.bind(this));
- this.signature.once("close", function() {
- if (!this.secret.writable && this.readable)
- this.verify();
- }.bind(this));
- }
- util.inherits(VerifyStream, Stream);
- VerifyStream.prototype.verify = function verify() {
- try {
- var valid = jwsVerify(this.signature.buffer, this.algorithm, this.key.buffer);
- var obj = jwsDecode(this.signature.buffer, this.encoding);
- this.emit("done", valid, obj);
- this.emit("data", valid);
- this.emit("end");
- this.readable = false;
- return valid;
- } catch (e) {
- this.readable = false;
- this.emit("error", e);
- this.emit("close");
- }
- };
- VerifyStream.decode = jwsDecode;
- VerifyStream.isValid = isValidJws;
- VerifyStream.verify = jwsVerify;
- module.exports = VerifyStream;
-});
-
-// ../eve/node_modules/jws/index.js
-var require_jws = __commonJS((exports) => {
- var SignStream = require_sign_stream();
- var VerifyStream = require_verify_stream();
- var ALGORITHMS = [
- "HS256",
- "HS384",
- "HS512",
- "RS256",
- "RS384",
- "RS512",
- "PS256",
- "PS384",
- "PS512",
- "ES256",
- "ES384",
- "ES512"
- ];
- exports.ALGORITHMS = ALGORITHMS;
- exports.sign = SignStream.sign;
- exports.verify = VerifyStream.verify;
- exports.decode = VerifyStream.decode;
- exports.isValid = VerifyStream.isValid;
- exports.createSign = function createSign(opts) {
- return new SignStream(opts);
- };
- exports.createVerify = function createVerify(opts) {
- return new VerifyStream(opts);
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/decode.js
-var require_decode = __commonJS((exports, module) => {
- var jws = require_jws();
- module.exports = function(jwt, options2) {
- options2 = options2 || {};
- var decoded = jws.decode(jwt, options2);
- if (!decoded) {
- return null;
- }
- var payload = decoded.payload;
- if (typeof payload === "string") {
- try {
- var obj = JSON.parse(payload);
- if (obj !== null && typeof obj === "object") {
- payload = obj;
- }
- } catch (e) {}
- }
- if (options2.complete === true) {
- return {
- header: decoded.header,
- payload,
- signature: decoded.signature
- };
- }
- return payload;
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/JsonWebTokenError.js
-var require_JsonWebTokenError = __commonJS((exports, module) => {
- var JsonWebTokenError = function(message, error) {
- Error.call(this, message);
- if (Error.captureStackTrace) {
- Error.captureStackTrace(this, this.constructor);
- }
- this.name = "JsonWebTokenError";
- this.message = message;
- if (error)
- this.inner = error;
- };
- JsonWebTokenError.prototype = Object.create(Error.prototype);
- JsonWebTokenError.prototype.constructor = JsonWebTokenError;
- module.exports = JsonWebTokenError;
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/NotBeforeError.js
-var require_NotBeforeError = __commonJS((exports, module) => {
- var JsonWebTokenError = require_JsonWebTokenError();
- var NotBeforeError = function(message, date) {
- JsonWebTokenError.call(this, message);
- this.name = "NotBeforeError";
- this.date = date;
- };
- NotBeforeError.prototype = Object.create(JsonWebTokenError.prototype);
- NotBeforeError.prototype.constructor = NotBeforeError;
- module.exports = NotBeforeError;
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/TokenExpiredError.js
-var require_TokenExpiredError = __commonJS((exports, module) => {
- var JsonWebTokenError = require_JsonWebTokenError();
- var TokenExpiredError = function(message, expiredAt) {
- JsonWebTokenError.call(this, message);
- this.name = "TokenExpiredError";
- this.expiredAt = expiredAt;
- };
- TokenExpiredError.prototype = Object.create(JsonWebTokenError.prototype);
- TokenExpiredError.prototype.constructor = TokenExpiredError;
- module.exports = TokenExpiredError;
-});
-
-// ../eve/node_modules/ms/index.js
-var require_ms = __commonJS((exports, module) => {
- var s = 1000;
- var m = s * 60;
- var h = m * 60;
- var d = h * 24;
- var w = d * 7;
- var y = d * 365.25;
- module.exports = function(val, options2) {
- options2 = options2 || {};
- var type = typeof val;
- if (type === "string" && val.length > 0) {
- return parse(val);
- } else if (type === "number" && isFinite(val)) {
- return options2.long ? fmtLong(val) : fmtShort(val);
- }
- throw new Error("val is not a non-empty string or a valid number. val=" + JSON.stringify(val));
- };
- function parse(str) {
- str = String(str);
- if (str.length > 100) {
- return;
- }
- var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);
- if (!match) {
- return;
- }
- var n = parseFloat(match[1]);
- var type = (match[2] || "ms").toLowerCase();
- switch (type) {
- case "years":
- case "year":
- case "yrs":
- case "yr":
- case "y":
- return n * y;
- case "weeks":
- case "week":
- case "w":
- return n * w;
- case "days":
- case "day":
- case "d":
- return n * d;
- case "hours":
- case "hour":
- case "hrs":
- case "hr":
- case "h":
- return n * h;
- case "minutes":
- case "minute":
- case "mins":
- case "min":
- case "m":
- return n * m;
- case "seconds":
- case "second":
- case "secs":
- case "sec":
- case "s":
- return n * s;
- case "milliseconds":
- case "millisecond":
- case "msecs":
- case "msec":
- case "ms":
- return n;
- default:
- return;
- }
- }
- function fmtShort(ms) {
- var msAbs = Math.abs(ms);
- if (msAbs >= d) {
- return Math.round(ms / d) + "d";
- }
- if (msAbs >= h) {
- return Math.round(ms / h) + "h";
- }
- if (msAbs >= m) {
- return Math.round(ms / m) + "m";
- }
- if (msAbs >= s) {
- return Math.round(ms / s) + "s";
- }
- return ms + "ms";
- }
- function fmtLong(ms) {
- var msAbs = Math.abs(ms);
- if (msAbs >= d) {
- return plural(ms, msAbs, d, "day");
- }
- if (msAbs >= h) {
- return plural(ms, msAbs, h, "hour");
- }
- if (msAbs >= m) {
- return plural(ms, msAbs, m, "minute");
- }
- if (msAbs >= s) {
- return plural(ms, msAbs, s, "second");
- }
- return ms + " ms";
- }
- function plural(ms, msAbs, n, name) {
- var isPlural = msAbs >= n * 1.5;
- return Math.round(ms / n) + " " + name + (isPlural ? "s" : "");
- }
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/timespan.js
-var require_timespan = __commonJS((exports, module) => {
- var ms = require_ms();
- module.exports = function(time, iat) {
- var timestamp = iat || Math.floor(Date.now() / 1000);
- if (typeof time === "string") {
- var milliseconds = ms(time);
- if (typeof milliseconds === "undefined") {
- return;
- }
- return Math.floor(timestamp + milliseconds / 1000);
- } else if (typeof time === "number") {
- return timestamp + time;
- } else {
- return;
- }
- };
-});
-
-// ../eve/node_modules/semver/internal/constants.js
-var require_constants = __commonJS((exports, module) => {
- var SEMVER_SPEC_VERSION = "2.0.0";
- var MAX_LENGTH = 256;
- var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
- var MAX_SAFE_COMPONENT_LENGTH = 16;
- var MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6;
- var RELEASE_TYPES = [
- "major",
- "premajor",
- "minor",
- "preminor",
- "patch",
- "prepatch",
- "prerelease"
- ];
- module.exports = {
- MAX_LENGTH,
- MAX_SAFE_COMPONENT_LENGTH,
- MAX_SAFE_BUILD_LENGTH,
- MAX_SAFE_INTEGER,
- RELEASE_TYPES,
- SEMVER_SPEC_VERSION,
- FLAG_INCLUDE_PRERELEASE: 1,
- FLAG_LOOSE: 2
- };
-});
-
-// ../eve/node_modules/semver/internal/debug.js
-var require_debug = __commonJS((exports, module) => {
- var debug = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => {};
- module.exports = debug;
-});
-
-// ../eve/node_modules/semver/internal/re.js
-var require_re = __commonJS((exports, module) => {
- var {
- MAX_SAFE_COMPONENT_LENGTH,
- MAX_SAFE_BUILD_LENGTH,
- MAX_LENGTH
- } = require_constants();
- var debug = require_debug();
- exports = module.exports = {};
- var re = exports.re = [];
- var safeRe = exports.safeRe = [];
- var src = exports.src = [];
- var safeSrc = exports.safeSrc = [];
- var t = exports.t = {};
- var R = 0;
- var LETTERDASHNUMBER = "[a-zA-Z0-9-]";
- var safeRegexReplacements = [
- ["\\s", 1],
- ["\\d", MAX_LENGTH],
- [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH]
- ];
- var makeSafeRegex = (value) => {
- for (const [token, max] of safeRegexReplacements) {
- value = value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);
- }
- return value;
- };
- var createToken = (name, value, isGlobal) => {
- const safe = makeSafeRegex(value);
- const index = R++;
- debug(name, index, value);
- t[name] = index;
- src[index] = value;
- safeSrc[index] = safe;
- re[index] = new RegExp(value, isGlobal ? "g" : undefined);
- safeRe[index] = new RegExp(safe, isGlobal ? "g" : undefined);
- };
- createToken("NUMERICIDENTIFIER", "0|[1-9]\\d*");
- createToken("NUMERICIDENTIFIERLOOSE", "\\d+");
- createToken("NONNUMERICIDENTIFIER", `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);
- createToken("MAINVERSION", `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})`);
- createToken("MAINVERSIONLOOSE", `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})`);
- createToken("PRERELEASEIDENTIFIER", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIER]})`);
- createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIERLOOSE]})`);
- createToken("PRERELEASE", `(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);
- createToken("PRERELEASELOOSE", `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);
- createToken("BUILDIDENTIFIER", `${LETTERDASHNUMBER}+`);
- createToken("BUILD", `(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);
- createToken("FULLPLAIN", `v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);
- createToken("FULL", `^${src[t.FULLPLAIN]}$`);
- createToken("LOOSEPLAIN", `[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);
- createToken("LOOSE", `^${src[t.LOOSEPLAIN]}$`);
- createToken("GTLT", "((?:<|>)?=?)");
- createToken("XRANGEIDENTIFIERLOOSE", `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);
- createToken("XRANGEIDENTIFIER", `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);
- createToken("XRANGEPLAIN", `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?` + `)?)?`);
- createToken("XRANGEPLAINLOOSE", `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?` + `)?)?`);
- createToken("XRANGE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);
- createToken("XRANGELOOSE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);
- createToken("COERCEPLAIN", `${"(^|[^\\d])" + "(\\d{1,"}${MAX_SAFE_COMPONENT_LENGTH}})` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);
- createToken("COERCE", `${src[t.COERCEPLAIN]}(?:$|[^\\d])`);
- createToken("COERCEFULL", src[t.COERCEPLAIN] + `(?:${src[t.PRERELEASE]})?` + `(?:${src[t.BUILD]})?` + `(?:$|[^\\d])`);
- createToken("COERCERTL", src[t.COERCE], true);
- createToken("COERCERTLFULL", src[t.COERCEFULL], true);
- createToken("LONETILDE", "(?:~>?)");
- createToken("TILDETRIM", `(\\s*)${src[t.LONETILDE]}\\s+`, true);
- exports.tildeTrimReplace = "$1~";
- createToken("TILDE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);
- createToken("TILDELOOSE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);
- createToken("LONECARET", "(?:\\^)");
- createToken("CARETTRIM", `(\\s*)${src[t.LONECARET]}\\s+`, true);
- exports.caretTrimReplace = "$1^";
- createToken("CARET", `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);
- createToken("CARETLOOSE", `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);
- createToken("COMPARATORLOOSE", `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);
- createToken("COMPARATOR", `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);
- createToken("COMPARATORTRIM", `(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true);
- exports.comparatorTrimReplace = "$1$2$3";
- createToken("HYPHENRANGE", `^\\s*(${src[t.XRANGEPLAIN]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAIN]})` + `\\s*$`);
- createToken("HYPHENRANGELOOSE", `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAINLOOSE]})` + `\\s*$`);
- createToken("STAR", "(<|>)?=?\\s*\\*");
- createToken("GTE0", "^\\s*>=\\s*0\\.0\\.0\\s*$");
- createToken("GTE0PRE", "^\\s*>=\\s*0\\.0\\.0-0\\s*$");
-});
-
-// ../eve/node_modules/semver/internal/parse-options.js
-var require_parse_options = __commonJS((exports, module) => {
- var looseOption = Object.freeze({ loose: true });
- var emptyOpts = Object.freeze({});
- var parseOptions = (options2) => {
- if (!options2) {
- return emptyOpts;
- }
- if (typeof options2 !== "object") {
- return looseOption;
- }
- return options2;
- };
- module.exports = parseOptions;
-});
-
-// ../eve/node_modules/semver/internal/identifiers.js
-var require_identifiers = __commonJS((exports, module) => {
- var numeric = /^[0-9]+$/;
- var compareIdentifiers = (a, b) => {
- const anum = numeric.test(a);
- const bnum = numeric.test(b);
- if (anum && bnum) {
- a = +a;
- b = +b;
- }
- return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;
- };
- var rcompareIdentifiers = (a, b) => compareIdentifiers(b, a);
- module.exports = {
- compareIdentifiers,
- rcompareIdentifiers
- };
-});
-
-// ../eve/node_modules/semver/classes/semver.js
-var require_semver = __commonJS((exports, module) => {
- var debug = require_debug();
- var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants();
- var { safeRe: re, t } = require_re();
- var parseOptions = require_parse_options();
- var { compareIdentifiers } = require_identifiers();
-
- class SemVer {
- constructor(version, options2) {
- options2 = parseOptions(options2);
- if (version instanceof SemVer) {
- if (version.loose === !!options2.loose && version.includePrerelease === !!options2.includePrerelease) {
- return version;
- } else {
- version = version.version;
- }
- } else if (typeof version !== "string") {
- throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`);
- }
- if (version.length > MAX_LENGTH) {
- throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);
- }
- debug("SemVer", version, options2);
- this.options = options2;
- this.loose = !!options2.loose;
- this.includePrerelease = !!options2.includePrerelease;
- const m = version.trim().match(options2.loose ? re[t.LOOSE] : re[t.FULL]);
- if (!m) {
- throw new TypeError(`Invalid Version: ${version}`);
- }
- this.raw = version;
- this.major = +m[1];
- this.minor = +m[2];
- this.patch = +m[3];
- if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
- throw new TypeError("Invalid major version");
- }
- if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
- throw new TypeError("Invalid minor version");
- }
- if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
- throw new TypeError("Invalid patch version");
- }
- if (!m[4]) {
- this.prerelease = [];
- } else {
- this.prerelease = m[4].split(".").map((id) => {
- if (/^[0-9]+$/.test(id)) {
- const num = +id;
- if (num >= 0 && num < MAX_SAFE_INTEGER) {
- return num;
- }
- }
- return id;
- });
- }
- this.build = m[5] ? m[5].split(".") : [];
- this.format();
- }
- format() {
- this.version = `${this.major}.${this.minor}.${this.patch}`;
- if (this.prerelease.length) {
- this.version += `-${this.prerelease.join(".")}`;
- }
- return this.version;
- }
- toString() {
- return this.version;
- }
- compare(other) {
- debug("SemVer.compare", this.version, this.options, other);
- if (!(other instanceof SemVer)) {
- if (typeof other === "string" && other === this.version) {
- return 0;
- }
- other = new SemVer(other, this.options);
- }
- if (other.version === this.version) {
- return 0;
- }
- return this.compareMain(other) || this.comparePre(other);
- }
- compareMain(other) {
- if (!(other instanceof SemVer)) {
- other = new SemVer(other, this.options);
- }
- return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch);
- }
- comparePre(other) {
- if (!(other instanceof SemVer)) {
- other = new SemVer(other, this.options);
- }
- if (this.prerelease.length && !other.prerelease.length) {
- return -1;
- } else if (!this.prerelease.length && other.prerelease.length) {
- return 1;
- } else if (!this.prerelease.length && !other.prerelease.length) {
- return 0;
- }
- let i = 0;
- do {
- const a = this.prerelease[i];
- const b = other.prerelease[i];
- debug("prerelease compare", i, a, b);
- if (a === undefined && b === undefined) {
- return 0;
- } else if (b === undefined) {
- return 1;
- } else if (a === undefined) {
- return -1;
- } else if (a === b) {
- continue;
- } else {
- return compareIdentifiers(a, b);
- }
- } while (++i);
- }
- compareBuild(other) {
- if (!(other instanceof SemVer)) {
- other = new SemVer(other, this.options);
- }
- let i = 0;
- do {
- const a = this.build[i];
- const b = other.build[i];
- debug("build compare", i, a, b);
- if (a === undefined && b === undefined) {
- return 0;
- } else if (b === undefined) {
- return 1;
- } else if (a === undefined) {
- return -1;
- } else if (a === b) {
- continue;
- } else {
- return compareIdentifiers(a, b);
- }
- } while (++i);
- }
- inc(release, identifier, identifierBase) {
- if (release.startsWith("pre")) {
- if (!identifier && identifierBase === false) {
- throw new Error("invalid increment argument: identifier is empty");
- }
- if (identifier) {
- const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]);
- if (!match || match[1] !== identifier) {
- throw new Error(`invalid identifier: ${identifier}`);
- }
- }
- }
- switch (release) {
- case "premajor":
- this.prerelease.length = 0;
- this.patch = 0;
- this.minor = 0;
- this.major++;
- this.inc("pre", identifier, identifierBase);
- break;
- case "preminor":
- this.prerelease.length = 0;
- this.patch = 0;
- this.minor++;
- this.inc("pre", identifier, identifierBase);
- break;
- case "prepatch":
- this.prerelease.length = 0;
- this.inc("patch", identifier, identifierBase);
- this.inc("pre", identifier, identifierBase);
- break;
- case "prerelease":
- if (this.prerelease.length === 0) {
- this.inc("patch", identifier, identifierBase);
- }
- this.inc("pre", identifier, identifierBase);
- break;
- case "release":
- if (this.prerelease.length === 0) {
- throw new Error(`version ${this.raw} is not a prerelease`);
- }
- this.prerelease.length = 0;
- break;
- case "major":
- if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) {
- this.major++;
- }
- this.minor = 0;
- this.patch = 0;
- this.prerelease = [];
- break;
- case "minor":
- if (this.patch !== 0 || this.prerelease.length === 0) {
- this.minor++;
- }
- this.patch = 0;
- this.prerelease = [];
- break;
- case "patch":
- if (this.prerelease.length === 0) {
- this.patch++;
- }
- this.prerelease = [];
- break;
- case "pre": {
- const base = Number(identifierBase) ? 1 : 0;
- if (this.prerelease.length === 0) {
- this.prerelease = [base];
- } else {
- let i = this.prerelease.length;
- while (--i >= 0) {
- if (typeof this.prerelease[i] === "number") {
- this.prerelease[i]++;
- i = -2;
- }
- }
- if (i === -1) {
- if (identifier === this.prerelease.join(".") && identifierBase === false) {
- throw new Error("invalid increment argument: identifier already exists");
- }
- this.prerelease.push(base);
- }
- }
- if (identifier) {
- let prerelease = [identifier, base];
- if (identifierBase === false) {
- prerelease = [identifier];
- }
- if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
- if (isNaN(this.prerelease[1])) {
- this.prerelease = prerelease;
- }
- } else {
- this.prerelease = prerelease;
- }
- }
- break;
- }
- default:
- throw new Error(`invalid increment argument: ${release}`);
- }
- this.raw = this.format();
- if (this.build.length) {
- this.raw += `+${this.build.join(".")}`;
- }
- return this;
- }
- }
- module.exports = SemVer;
-});
-
-// ../eve/node_modules/semver/functions/parse.js
-var require_parse = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var parse = (version, options2, throwErrors = false) => {
- if (version instanceof SemVer) {
- return version;
- }
- try {
- return new SemVer(version, options2);
- } catch (er) {
- if (!throwErrors) {
- return null;
- }
- throw er;
- }
- };
- module.exports = parse;
-});
-
-// ../eve/node_modules/semver/functions/valid.js
-var require_valid = __commonJS((exports, module) => {
- var parse = require_parse();
- var valid = (version, options2) => {
- const v = parse(version, options2);
- return v ? v.version : null;
- };
- module.exports = valid;
-});
-
-// ../eve/node_modules/semver/functions/clean.js
-var require_clean = __commonJS((exports, module) => {
- var parse = require_parse();
- var clean = (version, options2) => {
- const s = parse(version.trim().replace(/^[=v]+/, ""), options2);
- return s ? s.version : null;
- };
- module.exports = clean;
-});
-
-// ../eve/node_modules/semver/functions/inc.js
-var require_inc = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var inc = (version, release, options2, identifier, identifierBase) => {
- if (typeof options2 === "string") {
- identifierBase = identifier;
- identifier = options2;
- options2 = undefined;
- }
- try {
- return new SemVer(version instanceof SemVer ? version.version : version, options2).inc(release, identifier, identifierBase).version;
- } catch (er) {
- return null;
- }
- };
- module.exports = inc;
-});
-
-// ../eve/node_modules/semver/functions/diff.js
-var require_diff = __commonJS((exports, module) => {
- var parse = require_parse();
- var diff = (version1, version2) => {
- const v1 = parse(version1, null, true);
- const v2 = parse(version2, null, true);
- const comparison = v1.compare(v2);
- if (comparison === 0) {
- return null;
- }
- const v1Higher = comparison > 0;
- const highVersion = v1Higher ? v1 : v2;
- const lowVersion = v1Higher ? v2 : v1;
- const highHasPre = !!highVersion.prerelease.length;
- const lowHasPre = !!lowVersion.prerelease.length;
- if (lowHasPre && !highHasPre) {
- if (!lowVersion.patch && !lowVersion.minor) {
- return "major";
- }
- if (lowVersion.compareMain(highVersion) === 0) {
- if (lowVersion.minor && !lowVersion.patch) {
- return "minor";
- }
- return "patch";
- }
- }
- const prefix = highHasPre ? "pre" : "";
- if (v1.major !== v2.major) {
- return prefix + "major";
- }
- if (v1.minor !== v2.minor) {
- return prefix + "minor";
- }
- if (v1.patch !== v2.patch) {
- return prefix + "patch";
- }
- return "prerelease";
- };
- module.exports = diff;
-});
-
-// ../eve/node_modules/semver/functions/major.js
-var require_major = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var major = (a, loose) => new SemVer(a, loose).major;
- module.exports = major;
-});
-
-// ../eve/node_modules/semver/functions/minor.js
-var require_minor = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var minor = (a, loose) => new SemVer(a, loose).minor;
- module.exports = minor;
-});
-
-// ../eve/node_modules/semver/functions/patch.js
-var require_patch = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var patch = (a, loose) => new SemVer(a, loose).patch;
- module.exports = patch;
-});
-
-// ../eve/node_modules/semver/functions/prerelease.js
-var require_prerelease = __commonJS((exports, module) => {
- var parse = require_parse();
- var prerelease = (version, options2) => {
- const parsed = parse(version, options2);
- return parsed && parsed.prerelease.length ? parsed.prerelease : null;
- };
- module.exports = prerelease;
-});
-
-// ../eve/node_modules/semver/functions/compare.js
-var require_compare = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose));
- module.exports = compare;
-});
-
-// ../eve/node_modules/semver/functions/rcompare.js
-var require_rcompare = __commonJS((exports, module) => {
- var compare = require_compare();
- var rcompare = (a, b, loose) => compare(b, a, loose);
- module.exports = rcompare;
-});
-
-// ../eve/node_modules/semver/functions/compare-loose.js
-var require_compare_loose = __commonJS((exports, module) => {
- var compare = require_compare();
- var compareLoose = (a, b) => compare(a, b, true);
- module.exports = compareLoose;
-});
-
-// ../eve/node_modules/semver/functions/compare-build.js
-var require_compare_build = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var compareBuild = (a, b, loose) => {
- const versionA = new SemVer(a, loose);
- const versionB = new SemVer(b, loose);
- return versionA.compare(versionB) || versionA.compareBuild(versionB);
- };
- module.exports = compareBuild;
-});
-
-// ../eve/node_modules/semver/functions/sort.js
-var require_sort = __commonJS((exports, module) => {
- var compareBuild = require_compare_build();
- var sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose));
- module.exports = sort;
-});
-
-// ../eve/node_modules/semver/functions/rsort.js
-var require_rsort = __commonJS((exports, module) => {
- var compareBuild = require_compare_build();
- var rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose));
- module.exports = rsort;
-});
-
-// ../eve/node_modules/semver/functions/gt.js
-var require_gt = __commonJS((exports, module) => {
- var compare = require_compare();
- var gt = (a, b, loose) => compare(a, b, loose) > 0;
- module.exports = gt;
-});
-
-// ../eve/node_modules/semver/functions/lt.js
-var require_lt = __commonJS((exports, module) => {
- var compare = require_compare();
- var lt = (a, b, loose) => compare(a, b, loose) < 0;
- module.exports = lt;
-});
-
-// ../eve/node_modules/semver/functions/eq.js
-var require_eq = __commonJS((exports, module) => {
- var compare = require_compare();
- var eq = (a, b, loose) => compare(a, b, loose) === 0;
- module.exports = eq;
-});
-
-// ../eve/node_modules/semver/functions/neq.js
-var require_neq = __commonJS((exports, module) => {
- var compare = require_compare();
- var neq = (a, b, loose) => compare(a, b, loose) !== 0;
- module.exports = neq;
-});
-
-// ../eve/node_modules/semver/functions/gte.js
-var require_gte = __commonJS((exports, module) => {
- var compare = require_compare();
- var gte = (a, b, loose) => compare(a, b, loose) >= 0;
- module.exports = gte;
-});
-
-// ../eve/node_modules/semver/functions/lte.js
-var require_lte = __commonJS((exports, module) => {
- var compare = require_compare();
- var lte = (a, b, loose) => compare(a, b, loose) <= 0;
- module.exports = lte;
-});
-
-// ../eve/node_modules/semver/functions/cmp.js
-var require_cmp = __commonJS((exports, module) => {
- var eq = require_eq();
- var neq = require_neq();
- var gt = require_gt();
- var gte = require_gte();
- var lt = require_lt();
- var lte = require_lte();
- var cmp = (a, op, b, loose) => {
- switch (op) {
- case "===":
- if (typeof a === "object") {
- a = a.version;
- }
- if (typeof b === "object") {
- b = b.version;
- }
- return a === b;
- case "!==":
- if (typeof a === "object") {
- a = a.version;
- }
- if (typeof b === "object") {
- b = b.version;
- }
- return a !== b;
- case "":
- case "=":
- case "==":
- return eq(a, b, loose);
- case "!=":
- return neq(a, b, loose);
- case ">":
- return gt(a, b, loose);
- case ">=":
- return gte(a, b, loose);
- case "<":
- return lt(a, b, loose);
- case "<=":
- return lte(a, b, loose);
- default:
- throw new TypeError(`Invalid operator: ${op}`);
- }
- };
- module.exports = cmp;
-});
-
-// ../eve/node_modules/semver/functions/coerce.js
-var require_coerce = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var parse = require_parse();
- var { safeRe: re, t } = require_re();
- var coerce = (version, options2) => {
- if (version instanceof SemVer) {
- return version;
- }
- if (typeof version === "number") {
- version = String(version);
- }
- if (typeof version !== "string") {
- return null;
- }
- options2 = options2 || {};
- let match = null;
- if (!options2.rtl) {
- match = version.match(options2.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]);
- } else {
- const coerceRtlRegex = options2.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL];
- let next;
- while ((next = coerceRtlRegex.exec(version)) && (!match || match.index + match[0].length !== version.length)) {
- if (!match || next.index + next[0].length !== match.index + match[0].length) {
- match = next;
- }
- coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length;
- }
- coerceRtlRegex.lastIndex = -1;
- }
- if (match === null) {
- return null;
- }
- const major = match[2];
- const minor = match[3] || "0";
- const patch = match[4] || "0";
- const prerelease = options2.includePrerelease && match[5] ? `-${match[5]}` : "";
- const build = options2.includePrerelease && match[6] ? `+${match[6]}` : "";
- return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options2);
- };
- module.exports = coerce;
-});
-
-// ../eve/node_modules/semver/internal/lrucache.js
-var require_lrucache = __commonJS((exports, module) => {
- class LRUCache {
- constructor() {
- this.max = 1000;
- this.map = new Map;
- }
- get(key) {
- const value = this.map.get(key);
- if (value === undefined) {
- return;
- } else {
- this.map.delete(key);
- this.map.set(key, value);
- return value;
- }
- }
- delete(key) {
- return this.map.delete(key);
- }
- set(key, value) {
- const deleted = this.delete(key);
- if (!deleted && value !== undefined) {
- if (this.map.size >= this.max) {
- const firstKey = this.map.keys().next().value;
- this.delete(firstKey);
- }
- this.map.set(key, value);
- }
- return this;
- }
- }
- module.exports = LRUCache;
-});
-
-// ../eve/node_modules/semver/classes/range.js
-var require_range = __commonJS((exports, module) => {
- var SPACE_CHARACTERS = /\s+/g;
-
- class Range {
- constructor(range, options2) {
- options2 = parseOptions(options2);
- if (range instanceof Range) {
- if (range.loose === !!options2.loose && range.includePrerelease === !!options2.includePrerelease) {
- return range;
- } else {
- return new Range(range.raw, options2);
- }
- }
- if (range instanceof Comparator) {
- this.raw = range.value;
- this.set = [[range]];
- this.formatted = undefined;
- return this;
- }
- this.options = options2;
- this.loose = !!options2.loose;
- this.includePrerelease = !!options2.includePrerelease;
- this.raw = range.trim().replace(SPACE_CHARACTERS, " ");
- this.set = this.raw.split("||").map((r) => this.parseRange(r.trim())).filter((c) => c.length);
- if (!this.set.length) {
- throw new TypeError(`Invalid SemVer Range: ${this.raw}`);
- }
- if (this.set.length > 1) {
- const first = this.set[0];
- this.set = this.set.filter((c) => !isNullSet(c[0]));
- if (this.set.length === 0) {
- this.set = [first];
- } else if (this.set.length > 1) {
- for (const c of this.set) {
- if (c.length === 1 && isAny(c[0])) {
- this.set = [c];
- break;
- }
- }
- }
- }
- this.formatted = undefined;
- }
- get range() {
- if (this.formatted === undefined) {
- this.formatted = "";
- for (let i = 0;i < this.set.length; i++) {
- if (i > 0) {
- this.formatted += "||";
- }
- const comps = this.set[i];
- for (let k = 0;k < comps.length; k++) {
- if (k > 0) {
- this.formatted += " ";
- }
- this.formatted += comps[k].toString().trim();
- }
- }
- }
- return this.formatted;
- }
- format() {
- return this.range;
- }
- toString() {
- return this.range;
- }
- parseRange(range) {
- const memoOpts = (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | (this.options.loose && FLAG_LOOSE);
- const memoKey = memoOpts + ":" + range;
- const cached = cache.get(memoKey);
- if (cached) {
- return cached;
- }
- const loose = this.options.loose;
- const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE];
- range = range.replace(hr, hyphenReplace(this.options.includePrerelease));
- debug("hyphen replace", range);
- range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace);
- debug("comparator trim", range);
- range = range.replace(re[t.TILDETRIM], tildeTrimReplace);
- debug("tilde trim", range);
- range = range.replace(re[t.CARETTRIM], caretTrimReplace);
- debug("caret trim", range);
- let rangeList = range.split(" ").map((comp) => parseComparator(comp, this.options)).join(" ").split(/\s+/).map((comp) => replaceGTE0(comp, this.options));
- if (loose) {
- rangeList = rangeList.filter((comp) => {
- debug("loose invalid filter", comp, this.options);
- return !!comp.match(re[t.COMPARATORLOOSE]);
- });
- }
- debug("range list", rangeList);
- const rangeMap = new Map;
- const comparators = rangeList.map((comp) => new Comparator(comp, this.options));
- for (const comp of comparators) {
- if (isNullSet(comp)) {
- return [comp];
- }
- rangeMap.set(comp.value, comp);
- }
- if (rangeMap.size > 1 && rangeMap.has("")) {
- rangeMap.delete("");
- }
- const result = [...rangeMap.values()];
- cache.set(memoKey, result);
- return result;
- }
- intersects(range, options2) {
- if (!(range instanceof Range)) {
- throw new TypeError("a Range is required");
- }
- return this.set.some((thisComparators) => {
- return isSatisfiable(thisComparators, options2) && range.set.some((rangeComparators) => {
- return isSatisfiable(rangeComparators, options2) && thisComparators.every((thisComparator) => {
- return rangeComparators.every((rangeComparator) => {
- return thisComparator.intersects(rangeComparator, options2);
- });
- });
- });
- });
- }
- test(version) {
- if (!version) {
- return false;
- }
- if (typeof version === "string") {
- try {
- version = new SemVer(version, this.options);
- } catch (er) {
- return false;
- }
- }
- for (let i = 0;i < this.set.length; i++) {
- if (testSet(this.set[i], version, this.options)) {
- return true;
- }
- }
- return false;
- }
- }
- module.exports = Range;
- var LRU = require_lrucache();
- var cache = new LRU;
- var parseOptions = require_parse_options();
- var Comparator = require_comparator();
- var debug = require_debug();
- var SemVer = require_semver();
- var {
- safeRe: re,
- t,
- comparatorTrimReplace,
- tildeTrimReplace,
- caretTrimReplace
- } = require_re();
- var { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require_constants();
- var isNullSet = (c) => c.value === "<0.0.0-0";
- var isAny = (c) => c.value === "";
- var isSatisfiable = (comparators, options2) => {
- let result = true;
- const remainingComparators = comparators.slice();
- let testComparator = remainingComparators.pop();
- while (result && remainingComparators.length) {
- result = remainingComparators.every((otherComparator) => {
- return testComparator.intersects(otherComparator, options2);
- });
- testComparator = remainingComparators.pop();
- }
- return result;
- };
- var parseComparator = (comp, options2) => {
- debug("comp", comp, options2);
- comp = replaceCarets(comp, options2);
- debug("caret", comp);
- comp = replaceTildes(comp, options2);
- debug("tildes", comp);
- comp = replaceXRanges(comp, options2);
- debug("xrange", comp);
- comp = replaceStars(comp, options2);
- debug("stars", comp);
- return comp;
- };
- var isX = (id) => !id || id.toLowerCase() === "x" || id === "*";
- var replaceTildes = (comp, options2) => {
- return comp.trim().split(/\s+/).map((c) => replaceTilde(c, options2)).join(" ");
- };
- var replaceTilde = (comp, options2) => {
- const r = options2.loose ? re[t.TILDELOOSE] : re[t.TILDE];
- return comp.replace(r, (_, M, m, p, pr) => {
- debug("tilde", comp, _, M, m, p, pr);
- let ret;
- if (isX(M)) {
- ret = "";
- } else if (isX(m)) {
- ret = `>=${M}.0.0 <${+M + 1}.0.0-0`;
- } else if (isX(p)) {
- ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;
- } else if (pr) {
- debug("replaceTilde pr", pr);
- ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
- } else {
- ret = `>=${M}.${m}.${p} <${M}.${+m + 1}.0-0`;
- }
- debug("tilde return", ret);
- return ret;
- });
- };
- var replaceCarets = (comp, options2) => {
- return comp.trim().split(/\s+/).map((c) => replaceCaret(c, options2)).join(" ");
- };
- var replaceCaret = (comp, options2) => {
- debug("caret", comp, options2);
- const r = options2.loose ? re[t.CARETLOOSE] : re[t.CARET];
- const z = options2.includePrerelease ? "-0" : "";
- return comp.replace(r, (_, M, m, p, pr) => {
- debug("caret", comp, _, M, m, p, pr);
- let ret;
- if (isX(M)) {
- ret = "";
- } else if (isX(m)) {
- ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`;
- } else if (isX(p)) {
- if (M === "0") {
- ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`;
- } else {
- ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`;
- }
- } else if (pr) {
- debug("replaceCaret pr", pr);
- if (M === "0") {
- if (m === "0") {
- ret = `>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p + 1}-0`;
- } else {
- ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
- }
- } else {
- ret = `>=${M}.${m}.${p}-${pr} <${+M + 1}.0.0-0`;
- }
- } else {
- debug("no pr");
- if (M === "0") {
- if (m === "0") {
- ret = `>=${M}.${m}.${p}${z} <${M}.${m}.${+p + 1}-0`;
- } else {
- ret = `>=${M}.${m}.${p}${z} <${M}.${+m + 1}.0-0`;
- }
- } else {
- ret = `>=${M}.${m}.${p} <${+M + 1}.0.0-0`;
- }
- }
- debug("caret return", ret);
- return ret;
- });
- };
- var replaceXRanges = (comp, options2) => {
- debug("replaceXRanges", comp, options2);
- return comp.split(/\s+/).map((c) => replaceXRange(c, options2)).join(" ");
- };
- var replaceXRange = (comp, options2) => {
- comp = comp.trim();
- const r = options2.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];
- return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
- debug("xRange", comp, ret, gtlt, M, m, p, pr);
- const xM = isX(M);
- const xm = xM || isX(m);
- const xp = xm || isX(p);
- const anyX = xp;
- if (gtlt === "=" && anyX) {
- gtlt = "";
- }
- pr = options2.includePrerelease ? "-0" : "";
- if (xM) {
- if (gtlt === ">" || gtlt === "<") {
- ret = "<0.0.0-0";
- } else {
- ret = "*";
- }
- } else if (gtlt && anyX) {
- if (xm) {
- m = 0;
- }
- p = 0;
- if (gtlt === ">") {
- gtlt = ">=";
- if (xm) {
- M = +M + 1;
- m = 0;
- p = 0;
- } else {
- m = +m + 1;
- p = 0;
- }
- } else if (gtlt === "<=") {
- gtlt = "<";
- if (xm) {
- M = +M + 1;
- } else {
- m = +m + 1;
- }
- }
- if (gtlt === "<") {
- pr = "-0";
- }
- ret = `${gtlt + M}.${m}.${p}${pr}`;
- } else if (xm) {
- ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`;
- } else if (xp) {
- ret = `>=${M}.${m}.0${pr} <${M}.${+m + 1}.0-0`;
- }
- debug("xRange return", ret);
- return ret;
- });
- };
- var replaceStars = (comp, options2) => {
- debug("replaceStars", comp, options2);
- return comp.trim().replace(re[t.STAR], "");
- };
- var replaceGTE0 = (comp, options2) => {
- debug("replaceGTE0", comp, options2);
- return comp.trim().replace(re[options2.includePrerelease ? t.GTE0PRE : t.GTE0], "");
- };
- var hyphenReplace = (incPr) => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr) => {
- if (isX(fM)) {
- from = "";
- } else if (isX(fm)) {
- from = `>=${fM}.0.0${incPr ? "-0" : ""}`;
- } else if (isX(fp)) {
- from = `>=${fM}.${fm}.0${incPr ? "-0" : ""}`;
- } else if (fpr) {
- from = `>=${from}`;
- } else {
- from = `>=${from}${incPr ? "-0" : ""}`;
- }
- if (isX(tM)) {
- to = "";
- } else if (isX(tm)) {
- to = `<${+tM + 1}.0.0-0`;
- } else if (isX(tp)) {
- to = `<${tM}.${+tm + 1}.0-0`;
- } else if (tpr) {
- to = `<=${tM}.${tm}.${tp}-${tpr}`;
- } else if (incPr) {
- to = `<${tM}.${tm}.${+tp + 1}-0`;
- } else {
- to = `<=${to}`;
- }
- return `${from} ${to}`.trim();
- };
- var testSet = (set, version, options2) => {
- for (let i = 0;i < set.length; i++) {
- if (!set[i].test(version)) {
- return false;
- }
- }
- if (version.prerelease.length && !options2.includePrerelease) {
- for (let i = 0;i < set.length; i++) {
- debug(set[i].semver);
- if (set[i].semver === Comparator.ANY) {
- continue;
- }
- if (set[i].semver.prerelease.length > 0) {
- const allowed = set[i].semver;
- if (allowed.major === version.major && allowed.minor === version.minor && allowed.patch === version.patch) {
- return true;
- }
- }
- }
- return false;
- }
- return true;
- };
-});
-
-// ../eve/node_modules/semver/classes/comparator.js
-var require_comparator = __commonJS((exports, module) => {
- var ANY = Symbol("SemVer ANY");
-
- class Comparator {
- static get ANY() {
- return ANY;
- }
- constructor(comp, options2) {
- options2 = parseOptions(options2);
- if (comp instanceof Comparator) {
- if (comp.loose === !!options2.loose) {
- return comp;
- } else {
- comp = comp.value;
- }
- }
- comp = comp.trim().split(/\s+/).join(" ");
- debug("comparator", comp, options2);
- this.options = options2;
- this.loose = !!options2.loose;
- this.parse(comp);
- if (this.semver === ANY) {
- this.value = "";
- } else {
- this.value = this.operator + this.semver.version;
- }
- debug("comp", this);
- }
- parse(comp) {
- const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR];
- const m = comp.match(r);
- if (!m) {
- throw new TypeError(`Invalid comparator: ${comp}`);
- }
- this.operator = m[1] !== undefined ? m[1] : "";
- if (this.operator === "=") {
- this.operator = "";
- }
- if (!m[2]) {
- this.semver = ANY;
- } else {
- this.semver = new SemVer(m[2], this.options.loose);
- }
- }
- toString() {
- return this.value;
- }
- test(version) {
- debug("Comparator.test", version, this.options.loose);
- if (this.semver === ANY || version === ANY) {
- return true;
- }
- if (typeof version === "string") {
- try {
- version = new SemVer(version, this.options);
- } catch (er) {
- return false;
- }
- }
- return cmp(version, this.operator, this.semver, this.options);
- }
- intersects(comp, options2) {
- if (!(comp instanceof Comparator)) {
- throw new TypeError("a Comparator is required");
- }
- if (this.operator === "") {
- if (this.value === "") {
- return true;
- }
- return new Range(comp.value, options2).test(this.value);
- } else if (comp.operator === "") {
- if (comp.value === "") {
- return true;
- }
- return new Range(this.value, options2).test(comp.semver);
- }
- options2 = parseOptions(options2);
- if (options2.includePrerelease && (this.value === "<0.0.0-0" || comp.value === "<0.0.0-0")) {
- return false;
- }
- if (!options2.includePrerelease && (this.value.startsWith("<0.0.0") || comp.value.startsWith("<0.0.0"))) {
- return false;
- }
- if (this.operator.startsWith(">") && comp.operator.startsWith(">")) {
- return true;
- }
- if (this.operator.startsWith("<") && comp.operator.startsWith("<")) {
- return true;
- }
- if (this.semver.version === comp.semver.version && this.operator.includes("=") && comp.operator.includes("=")) {
- return true;
- }
- if (cmp(this.semver, "<", comp.semver, options2) && this.operator.startsWith(">") && comp.operator.startsWith("<")) {
- return true;
- }
- if (cmp(this.semver, ">", comp.semver, options2) && this.operator.startsWith("<") && comp.operator.startsWith(">")) {
- return true;
- }
- return false;
- }
- }
- module.exports = Comparator;
- var parseOptions = require_parse_options();
- var { safeRe: re, t } = require_re();
- var cmp = require_cmp();
- var debug = require_debug();
- var SemVer = require_semver();
- var Range = require_range();
-});
-
-// ../eve/node_modules/semver/functions/satisfies.js
-var require_satisfies = __commonJS((exports, module) => {
- var Range = require_range();
- var satisfies = (version, range, options2) => {
- try {
- range = new Range(range, options2);
- } catch (er) {
- return false;
- }
- return range.test(version);
- };
- module.exports = satisfies;
-});
-
-// ../eve/node_modules/semver/ranges/to-comparators.js
-var require_to_comparators = __commonJS((exports, module) => {
- var Range = require_range();
- var toComparators = (range, options2) => new Range(range, options2).set.map((comp) => comp.map((c) => c.value).join(" ").trim().split(" "));
- module.exports = toComparators;
-});
-
-// ../eve/node_modules/semver/ranges/max-satisfying.js
-var require_max_satisfying = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Range = require_range();
- var maxSatisfying = (versions, range, options2) => {
- let max = null;
- let maxSV = null;
- let rangeObj = null;
- try {
- rangeObj = new Range(range, options2);
- } catch (er) {
- return null;
- }
- versions.forEach((v) => {
- if (rangeObj.test(v)) {
- if (!max || maxSV.compare(v) === -1) {
- max = v;
- maxSV = new SemVer(max, options2);
- }
- }
- });
- return max;
- };
- module.exports = maxSatisfying;
-});
-
-// ../eve/node_modules/semver/ranges/min-satisfying.js
-var require_min_satisfying = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Range = require_range();
- var minSatisfying = (versions, range, options2) => {
- let min = null;
- let minSV = null;
- let rangeObj = null;
- try {
- rangeObj = new Range(range, options2);
- } catch (er) {
- return null;
- }
- versions.forEach((v) => {
- if (rangeObj.test(v)) {
- if (!min || minSV.compare(v) === 1) {
- min = v;
- minSV = new SemVer(min, options2);
- }
- }
- });
- return min;
- };
- module.exports = minSatisfying;
-});
-
-// ../eve/node_modules/semver/ranges/min-version.js
-var require_min_version = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Range = require_range();
- var gt = require_gt();
- var minVersion = (range, loose) => {
- range = new Range(range, loose);
- let minver = new SemVer("0.0.0");
- if (range.test(minver)) {
- return minver;
- }
- minver = new SemVer("0.0.0-0");
- if (range.test(minver)) {
- return minver;
- }
- minver = null;
- for (let i = 0;i < range.set.length; ++i) {
- const comparators = range.set[i];
- let setMin = null;
- comparators.forEach((comparator) => {
- const compver = new SemVer(comparator.semver.version);
- switch (comparator.operator) {
- case ">":
- if (compver.prerelease.length === 0) {
- compver.patch++;
- } else {
- compver.prerelease.push(0);
- }
- compver.raw = compver.format();
- case "":
- case ">=":
- if (!setMin || gt(compver, setMin)) {
- setMin = compver;
- }
- break;
- case "<":
- case "<=":
- break;
- default:
- throw new Error(`Unexpected operation: ${comparator.operator}`);
- }
- });
- if (setMin && (!minver || gt(minver, setMin))) {
- minver = setMin;
- }
- }
- if (minver && range.test(minver)) {
- return minver;
- }
- return null;
- };
- module.exports = minVersion;
-});
-
-// ../eve/node_modules/semver/ranges/valid.js
-var require_valid2 = __commonJS((exports, module) => {
- var Range = require_range();
- var validRange = (range, options2) => {
- try {
- return new Range(range, options2).range || "*";
- } catch (er) {
- return null;
- }
- };
- module.exports = validRange;
-});
-
-// ../eve/node_modules/semver/ranges/outside.js
-var require_outside = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Comparator = require_comparator();
- var { ANY } = Comparator;
- var Range = require_range();
- var satisfies = require_satisfies();
- var gt = require_gt();
- var lt = require_lt();
- var lte = require_lte();
- var gte = require_gte();
- var outside = (version, range, hilo, options2) => {
- version = new SemVer(version, options2);
- range = new Range(range, options2);
- let gtfn, ltefn, ltfn, comp, ecomp;
- switch (hilo) {
- case ">":
- gtfn = gt;
- ltefn = lte;
- ltfn = lt;
- comp = ">";
- ecomp = ">=";
- break;
- case "<":
- gtfn = lt;
- ltefn = gte;
- ltfn = gt;
- comp = "<";
- ecomp = "<=";
- break;
- default:
- throw new TypeError('Must provide a hilo val of "<" or ">"');
- }
- if (satisfies(version, range, options2)) {
- return false;
- }
- for (let i = 0;i < range.set.length; ++i) {
- const comparators = range.set[i];
- let high = null;
- let low = null;
- comparators.forEach((comparator) => {
- if (comparator.semver === ANY) {
- comparator = new Comparator(">=0.0.0");
- }
- high = high || comparator;
- low = low || comparator;
- if (gtfn(comparator.semver, high.semver, options2)) {
- high = comparator;
- } else if (ltfn(comparator.semver, low.semver, options2)) {
- low = comparator;
- }
- });
- if (high.operator === comp || high.operator === ecomp) {
- return false;
- }
- if ((!low.operator || low.operator === comp) && ltefn(version, low.semver)) {
- return false;
- } else if (low.operator === ecomp && ltfn(version, low.semver)) {
- return false;
- }
- }
- return true;
- };
- module.exports = outside;
-});
-
-// ../eve/node_modules/semver/ranges/gtr.js
-var require_gtr = __commonJS((exports, module) => {
- var outside = require_outside();
- var gtr = (version, range, options2) => outside(version, range, ">", options2);
- module.exports = gtr;
-});
-
-// ../eve/node_modules/semver/ranges/ltr.js
-var require_ltr = __commonJS((exports, module) => {
- var outside = require_outside();
- var ltr = (version, range, options2) => outside(version, range, "<", options2);
- module.exports = ltr;
-});
-
-// ../eve/node_modules/semver/ranges/intersects.js
-var require_intersects = __commonJS((exports, module) => {
- var Range = require_range();
- var intersects = (r1, r2, options2) => {
- r1 = new Range(r1, options2);
- r2 = new Range(r2, options2);
- return r1.intersects(r2, options2);
- };
- module.exports = intersects;
-});
-
-// ../eve/node_modules/semver/ranges/simplify.js
-var require_simplify = __commonJS((exports, module) => {
- var satisfies = require_satisfies();
- var compare = require_compare();
- module.exports = (versions, range, options2) => {
- const set = [];
- let first = null;
- let prev = null;
- const v = versions.sort((a, b) => compare(a, b, options2));
- for (const version of v) {
- const included = satisfies(version, range, options2);
- if (included) {
- prev = version;
- if (!first) {
- first = version;
- }
- } else {
- if (prev) {
- set.push([first, prev]);
- }
- prev = null;
- first = null;
- }
- }
- if (first) {
- set.push([first, null]);
- }
- const ranges = [];
- for (const [min, max] of set) {
- if (min === max) {
- ranges.push(min);
- } else if (!max && min === v[0]) {
- ranges.push("*");
- } else if (!max) {
- ranges.push(`>=${min}`);
- } else if (min === v[0]) {
- ranges.push(`<=${max}`);
- } else {
- ranges.push(`${min} - ${max}`);
- }
- }
- const simplified = ranges.join(" || ");
- const original = typeof range.raw === "string" ? range.raw : String(range);
- return simplified.length < original.length ? simplified : range;
- };
-});
-
-// ../eve/node_modules/semver/ranges/subset.js
-var require_subset = __commonJS((exports, module) => {
- var Range = require_range();
- var Comparator = require_comparator();
- var { ANY } = Comparator;
- var satisfies = require_satisfies();
- var compare = require_compare();
- var subset = (sub, dom, options2 = {}) => {
- if (sub === dom) {
- return true;
- }
- sub = new Range(sub, options2);
- dom = new Range(dom, options2);
- let sawNonNull = false;
- OUTER:
- for (const simpleSub of sub.set) {
- for (const simpleDom of dom.set) {
- const isSub = simpleSubset(simpleSub, simpleDom, options2);
- sawNonNull = sawNonNull || isSub !== null;
- if (isSub) {
- continue OUTER;
- }
- }
- if (sawNonNull) {
- return false;
- }
- }
- return true;
- };
- var minimumVersionWithPreRelease = [new Comparator(">=0.0.0-0")];
- var minimumVersion = [new Comparator(">=0.0.0")];
- var simpleSubset = (sub, dom, options2) => {
- if (sub === dom) {
- return true;
- }
- if (sub.length === 1 && sub[0].semver === ANY) {
- if (dom.length === 1 && dom[0].semver === ANY) {
- return true;
- } else if (options2.includePrerelease) {
- sub = minimumVersionWithPreRelease;
- } else {
- sub = minimumVersion;
- }
- }
- if (dom.length === 1 && dom[0].semver === ANY) {
- if (options2.includePrerelease) {
- return true;
- } else {
- dom = minimumVersion;
- }
- }
- const eqSet = new Set;
- let gt, lt;
- for (const c of sub) {
- if (c.operator === ">" || c.operator === ">=") {
- gt = higherGT(gt, c, options2);
- } else if (c.operator === "<" || c.operator === "<=") {
- lt = lowerLT(lt, c, options2);
- } else {
- eqSet.add(c.semver);
- }
- }
- if (eqSet.size > 1) {
- return null;
- }
- let gtltComp;
- if (gt && lt) {
- gtltComp = compare(gt.semver, lt.semver, options2);
- if (gtltComp > 0) {
- return null;
- } else if (gtltComp === 0 && (gt.operator !== ">=" || lt.operator !== "<=")) {
- return null;
- }
- }
- for (const eq of eqSet) {
- if (gt && !satisfies(eq, String(gt), options2)) {
- return null;
- }
- if (lt && !satisfies(eq, String(lt), options2)) {
- return null;
- }
- for (const c of dom) {
- if (!satisfies(eq, String(c), options2)) {
- return false;
- }
- }
- return true;
- }
- let higher, lower;
- let hasDomLT, hasDomGT;
- let needDomLTPre = lt && !options2.includePrerelease && lt.semver.prerelease.length ? lt.semver : false;
- let needDomGTPre = gt && !options2.includePrerelease && gt.semver.prerelease.length ? gt.semver : false;
- if (needDomLTPre && needDomLTPre.prerelease.length === 1 && lt.operator === "<" && needDomLTPre.prerelease[0] === 0) {
- needDomLTPre = false;
- }
- for (const c of dom) {
- hasDomGT = hasDomGT || c.operator === ">" || c.operator === ">=";
- hasDomLT = hasDomLT || c.operator === "<" || c.operator === "<=";
- if (gt) {
- if (needDomGTPre) {
- if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomGTPre.major && c.semver.minor === needDomGTPre.minor && c.semver.patch === needDomGTPre.patch) {
- needDomGTPre = false;
- }
- }
- if (c.operator === ">" || c.operator === ">=") {
- higher = higherGT(gt, c, options2);
- if (higher === c && higher !== gt) {
- return false;
- }
- } else if (gt.operator === ">=" && !satisfies(gt.semver, String(c), options2)) {
- return false;
- }
- }
- if (lt) {
- if (needDomLTPre) {
- if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomLTPre.major && c.semver.minor === needDomLTPre.minor && c.semver.patch === needDomLTPre.patch) {
- needDomLTPre = false;
- }
- }
- if (c.operator === "<" || c.operator === "<=") {
- lower = lowerLT(lt, c, options2);
- if (lower === c && lower !== lt) {
- return false;
- }
- } else if (lt.operator === "<=" && !satisfies(lt.semver, String(c), options2)) {
- return false;
- }
- }
- if (!c.operator && (lt || gt) && gtltComp !== 0) {
- return false;
- }
- }
- if (gt && hasDomLT && !lt && gtltComp !== 0) {
- return false;
- }
- if (lt && hasDomGT && !gt && gtltComp !== 0) {
- return false;
- }
- if (needDomGTPre || needDomLTPre) {
- return false;
- }
- return true;
- };
- var higherGT = (a, b, options2) => {
- if (!a) {
- return b;
- }
- const comp = compare(a.semver, b.semver, options2);
- return comp > 0 ? a : comp < 0 ? b : b.operator === ">" && a.operator === ">=" ? b : a;
- };
- var lowerLT = (a, b, options2) => {
- if (!a) {
- return b;
- }
- const comp = compare(a.semver, b.semver, options2);
- return comp < 0 ? a : comp > 0 ? b : b.operator === "<" && a.operator === "<=" ? b : a;
- };
- module.exports = subset;
-});
-
-// ../eve/node_modules/semver/index.js
-var require_semver2 = __commonJS((exports, module) => {
- var internalRe = require_re();
- var constants = require_constants();
- var SemVer = require_semver();
- var identifiers = require_identifiers();
- var parse = require_parse();
- var valid = require_valid();
- var clean = require_clean();
- var inc = require_inc();
- var diff = require_diff();
- var major = require_major();
- var minor = require_minor();
- var patch = require_patch();
- var prerelease = require_prerelease();
- var compare = require_compare();
- var rcompare = require_rcompare();
- var compareLoose = require_compare_loose();
- var compareBuild = require_compare_build();
- var sort = require_sort();
- var rsort = require_rsort();
- var gt = require_gt();
- var lt = require_lt();
- var eq = require_eq();
- var neq = require_neq();
- var gte = require_gte();
- var lte = require_lte();
- var cmp = require_cmp();
- var coerce = require_coerce();
- var Comparator = require_comparator();
- var Range = require_range();
- var satisfies = require_satisfies();
- var toComparators = require_to_comparators();
- var maxSatisfying = require_max_satisfying();
- var minSatisfying = require_min_satisfying();
- var minVersion = require_min_version();
- var validRange = require_valid2();
- var outside = require_outside();
- var gtr = require_gtr();
- var ltr = require_ltr();
- var intersects = require_intersects();
- var simplifyRange = require_simplify();
- var subset = require_subset();
- module.exports = {
- parse,
- valid,
- clean,
- inc,
- diff,
- major,
- minor,
- patch,
- prerelease,
- compare,
- rcompare,
- compareLoose,
- compareBuild,
- sort,
- rsort,
- gt,
- lt,
- eq,
- neq,
- gte,
- lte,
- cmp,
- coerce,
- Comparator,
- Range,
- satisfies,
- toComparators,
- maxSatisfying,
- minSatisfying,
- minVersion,
- validRange,
- outside,
- gtr,
- ltr,
- intersects,
- simplifyRange,
- subset,
- SemVer,
- re: internalRe.re,
- src: internalRe.src,
- tokens: internalRe.t,
- SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,
- RELEASE_TYPES: constants.RELEASE_TYPES,
- compareIdentifiers: identifiers.compareIdentifiers,
- rcompareIdentifiers: identifiers.rcompareIdentifiers
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/asymmetricKeyDetailsSupported.js
-var require_asymmetricKeyDetailsSupported = __commonJS((exports, module) => {
- var semver = require_semver2();
- module.exports = semver.satisfies(process.version, ">=15.7.0");
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/rsaPssKeyDetailsSupported.js
-var require_rsaPssKeyDetailsSupported = __commonJS((exports, module) => {
- var semver = require_semver2();
- module.exports = semver.satisfies(process.version, ">=16.9.0");
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/validateAsymmetricKey.js
-var require_validateAsymmetricKey = __commonJS((exports, module) => {
- var ASYMMETRIC_KEY_DETAILS_SUPPORTED = require_asymmetricKeyDetailsSupported();
- var RSA_PSS_KEY_DETAILS_SUPPORTED = require_rsaPssKeyDetailsSupported();
- var allowedAlgorithmsForKeys = {
- ec: ["ES256", "ES384", "ES512"],
- rsa: ["RS256", "PS256", "RS384", "PS384", "RS512", "PS512"],
- "rsa-pss": ["PS256", "PS384", "PS512"]
- };
- var allowedCurves = {
- ES256: "prime256v1",
- ES384: "secp384r1",
- ES512: "secp521r1"
- };
- module.exports = function(algorithm, key) {
- if (!algorithm || !key)
- return;
- const keyType = key.asymmetricKeyType;
- if (!keyType)
- return;
- const allowedAlgorithms = allowedAlgorithmsForKeys[keyType];
- if (!allowedAlgorithms) {
- throw new Error(`Unknown key type "${keyType}".`);
- }
- if (!allowedAlgorithms.includes(algorithm)) {
- throw new Error(`"alg" parameter for "${keyType}" key type must be one of: ${allowedAlgorithms.join(", ")}.`);
- }
- if (ASYMMETRIC_KEY_DETAILS_SUPPORTED) {
- switch (keyType) {
- case "ec":
- const keyCurve = key.asymmetricKeyDetails.namedCurve;
- const allowedCurve = allowedCurves[algorithm];
- if (keyCurve !== allowedCurve) {
- throw new Error(`"alg" parameter "${algorithm}" requires curve "${allowedCurve}".`);
- }
- break;
- case "rsa-pss":
- if (RSA_PSS_KEY_DETAILS_SUPPORTED) {
- const length = parseInt(algorithm.slice(-3), 10);
- const { hashAlgorithm, mgf1HashAlgorithm, saltLength } = key.asymmetricKeyDetails;
- if (hashAlgorithm !== `sha${length}` || mgf1HashAlgorithm !== hashAlgorithm) {
- throw new Error(`Invalid key for this operation, its RSA-PSS parameters do not meet the requirements of "alg" ${algorithm}.`);
- }
- if (saltLength !== undefined && saltLength > length >> 3) {
- throw new Error(`Invalid key for this operation, its RSA-PSS parameter saltLength does not meet the requirements of "alg" ${algorithm}.`);
- }
- }
- break;
- }
- }
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/psSupported.js
-var require_psSupported = __commonJS((exports, module) => {
- var semver = require_semver2();
- module.exports = semver.satisfies(process.version, "^6.12.0 || >=8.0.0");
-});
-
-// ../eve/node_modules/jsonwebtoken/verify.js
-var require_verify = __commonJS((exports, module) => {
- var JsonWebTokenError = require_JsonWebTokenError();
- var NotBeforeError = require_NotBeforeError();
- var TokenExpiredError = require_TokenExpiredError();
- var decode = require_decode();
- var timespan = require_timespan();
- var validateAsymmetricKey = require_validateAsymmetricKey();
- var PS_SUPPORTED = require_psSupported();
- var jws = require_jws();
- var { KeyObject, createSecretKey, createPublicKey } = __require("crypto");
- var PUB_KEY_ALGS = ["RS256", "RS384", "RS512"];
- var EC_KEY_ALGS = ["ES256", "ES384", "ES512"];
- var RSA_KEY_ALGS = ["RS256", "RS384", "RS512"];
- var HS_ALGS = ["HS256", "HS384", "HS512"];
- if (PS_SUPPORTED) {
- PUB_KEY_ALGS.splice(PUB_KEY_ALGS.length, 0, "PS256", "PS384", "PS512");
- RSA_KEY_ALGS.splice(RSA_KEY_ALGS.length, 0, "PS256", "PS384", "PS512");
- }
- module.exports = function(jwtString, secretOrPublicKey, options2, callback) {
- if (typeof options2 === "function" && !callback) {
- callback = options2;
- options2 = {};
- }
- if (!options2) {
- options2 = {};
- }
- options2 = Object.assign({}, options2);
- let done;
- if (callback) {
- done = callback;
- } else {
- done = function(err, data) {
- if (err)
- throw err;
- return data;
- };
- }
- if (options2.clockTimestamp && typeof options2.clockTimestamp !== "number") {
- return done(new JsonWebTokenError("clockTimestamp must be a number"));
- }
- if (options2.nonce !== undefined && (typeof options2.nonce !== "string" || options2.nonce.trim() === "")) {
- return done(new JsonWebTokenError("nonce must be a non-empty string"));
- }
- if (options2.allowInvalidAsymmetricKeyTypes !== undefined && typeof options2.allowInvalidAsymmetricKeyTypes !== "boolean") {
- return done(new JsonWebTokenError("allowInvalidAsymmetricKeyTypes must be a boolean"));
- }
- const clockTimestamp = options2.clockTimestamp || Math.floor(Date.now() / 1000);
- if (!jwtString) {
- return done(new JsonWebTokenError("jwt must be provided"));
- }
- if (typeof jwtString !== "string") {
- return done(new JsonWebTokenError("jwt must be a string"));
- }
- const parts = jwtString.split(".");
- if (parts.length !== 3) {
- return done(new JsonWebTokenError("jwt malformed"));
- }
- let decodedToken;
- try {
- decodedToken = decode(jwtString, { complete: true });
- } catch (err) {
- return done(err);
- }
- if (!decodedToken) {
- return done(new JsonWebTokenError("invalid token"));
- }
- const header = decodedToken.header;
- let getSecret;
- if (typeof secretOrPublicKey === "function") {
- if (!callback) {
- return done(new JsonWebTokenError("verify must be called asynchronous if secret or public key is provided as a callback"));
- }
- getSecret = secretOrPublicKey;
- } else {
- getSecret = function(header2, secretCallback) {
- return secretCallback(null, secretOrPublicKey);
- };
- }
- return getSecret(header, function(err, secretOrPublicKey2) {
- if (err) {
- return done(new JsonWebTokenError("error in secret or public key callback: " + err.message));
- }
- const hasSignature = parts[2].trim() !== "";
- if (!hasSignature && secretOrPublicKey2) {
- return done(new JsonWebTokenError("jwt signature is required"));
- }
- if (hasSignature && !secretOrPublicKey2) {
- return done(new JsonWebTokenError("secret or public key must be provided"));
- }
- if (!hasSignature && !options2.algorithms) {
- return done(new JsonWebTokenError('please specify "none" in "algorithms" to verify unsigned tokens'));
- }
- if (secretOrPublicKey2 != null && !(secretOrPublicKey2 instanceof KeyObject)) {
- try {
- secretOrPublicKey2 = createPublicKey(secretOrPublicKey2);
- } catch (_) {
- try {
- secretOrPublicKey2 = createSecretKey(typeof secretOrPublicKey2 === "string" ? Buffer.from(secretOrPublicKey2) : secretOrPublicKey2);
- } catch (_2) {
- return done(new JsonWebTokenError("secretOrPublicKey is not valid key material"));
- }
- }
- }
- if (!options2.algorithms) {
- if (secretOrPublicKey2.type === "secret") {
- options2.algorithms = HS_ALGS;
- } else if (["rsa", "rsa-pss"].includes(secretOrPublicKey2.asymmetricKeyType)) {
- options2.algorithms = RSA_KEY_ALGS;
- } else if (secretOrPublicKey2.asymmetricKeyType === "ec") {
- options2.algorithms = EC_KEY_ALGS;
- } else {
- options2.algorithms = PUB_KEY_ALGS;
- }
- }
- if (options2.algorithms.indexOf(decodedToken.header.alg) === -1) {
- return done(new JsonWebTokenError("invalid algorithm"));
- }
- if (header.alg.startsWith("HS") && secretOrPublicKey2.type !== "secret") {
- return done(new JsonWebTokenError(`secretOrPublicKey must be a symmetric key when using ${header.alg}`));
- } else if (/^(?:RS|PS|ES)/.test(header.alg) && secretOrPublicKey2.type !== "public") {
- return done(new JsonWebTokenError(`secretOrPublicKey must be an asymmetric key when using ${header.alg}`));
- }
- if (!options2.allowInvalidAsymmetricKeyTypes) {
- try {
- validateAsymmetricKey(header.alg, secretOrPublicKey2);
- } catch (e) {
- return done(e);
- }
- }
- let valid;
- try {
- valid = jws.verify(jwtString, decodedToken.header.alg, secretOrPublicKey2);
- } catch (e) {
- return done(e);
- }
- if (!valid) {
- return done(new JsonWebTokenError("invalid signature"));
- }
- const payload = decodedToken.payload;
- if (typeof payload.nbf !== "undefined" && !options2.ignoreNotBefore) {
- if (typeof payload.nbf !== "number") {
- return done(new JsonWebTokenError("invalid nbf value"));
- }
- if (payload.nbf > clockTimestamp + (options2.clockTolerance || 0)) {
- return done(new NotBeforeError("jwt not active", new Date(payload.nbf * 1000)));
- }
- }
- if (typeof payload.exp !== "undefined" && !options2.ignoreExpiration) {
- if (typeof payload.exp !== "number") {
- return done(new JsonWebTokenError("invalid exp value"));
- }
- if (clockTimestamp >= payload.exp + (options2.clockTolerance || 0)) {
- return done(new TokenExpiredError("jwt expired", new Date(payload.exp * 1000)));
- }
- }
- if (options2.audience) {
- const audiences = Array.isArray(options2.audience) ? options2.audience : [options2.audience];
- const target = Array.isArray(payload.aud) ? payload.aud : [payload.aud];
- const match = target.some(function(targetAudience) {
- return audiences.some(function(audience) {
- return audience instanceof RegExp ? audience.test(targetAudience) : audience === targetAudience;
- });
- });
- if (!match) {
- return done(new JsonWebTokenError("jwt audience invalid. expected: " + audiences.join(" or ")));
- }
- }
- if (options2.issuer) {
- const invalid_issuer = typeof options2.issuer === "string" && payload.iss !== options2.issuer || Array.isArray(options2.issuer) && options2.issuer.indexOf(payload.iss) === -1;
- if (invalid_issuer) {
- return done(new JsonWebTokenError("jwt issuer invalid. expected: " + options2.issuer));
- }
- }
- if (options2.subject) {
- if (payload.sub !== options2.subject) {
- return done(new JsonWebTokenError("jwt subject invalid. expected: " + options2.subject));
- }
- }
- if (options2.jwtid) {
- if (payload.jti !== options2.jwtid) {
- return done(new JsonWebTokenError("jwt jwtid invalid. expected: " + options2.jwtid));
- }
- }
- if (options2.nonce) {
- if (payload.nonce !== options2.nonce) {
- return done(new JsonWebTokenError("jwt nonce invalid. expected: " + options2.nonce));
- }
- }
- if (options2.maxAge) {
- if (typeof payload.iat !== "number") {
- return done(new JsonWebTokenError("iat required when maxAge is specified"));
- }
- const maxAgeTimestamp = timespan(options2.maxAge, payload.iat);
- if (typeof maxAgeTimestamp === "undefined") {
- return done(new JsonWebTokenError('"maxAge" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
- }
- if (clockTimestamp >= maxAgeTimestamp + (options2.clockTolerance || 0)) {
- return done(new TokenExpiredError("maxAge exceeded", new Date(maxAgeTimestamp * 1000)));
- }
- }
- if (options2.complete === true) {
- const signature = decodedToken.signature;
- return done(null, {
- header,
- payload,
- signature
- });
- }
- return done(null, payload);
- });
- };
-});
-
-// ../eve/node_modules/lodash.includes/index.js
-var require_lodash = __commonJS((exports, module) => {
- var INFINITY = 1 / 0;
- var MAX_SAFE_INTEGER = 9007199254740991;
- var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
- var NAN = 0 / 0;
- var argsTag = "[object Arguments]";
- var funcTag = "[object Function]";
- var genTag = "[object GeneratorFunction]";
- var stringTag = "[object String]";
- var symbolTag = "[object Symbol]";
- var reTrim = /^\s+|\s+$/g;
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
- var reIsBinary = /^0b[01]+$/i;
- var reIsOctal = /^0o[0-7]+$/i;
- var reIsUint = /^(?:0|[1-9]\d*)$/;
- var freeParseInt = parseInt;
- function arrayMap(array, iteratee) {
- var index = -1, length = array ? array.length : 0, result = Array(length);
- while (++index < length) {
- result[index] = iteratee(array[index], index, array);
- }
- return result;
- }
- function baseFindIndex(array, predicate, fromIndex, fromRight) {
- var length = array.length, index = fromIndex + (fromRight ? 1 : -1);
- while (fromRight ? index-- : ++index < length) {
- if (predicate(array[index], index, array)) {
- return index;
- }
- }
- return -1;
- }
- function baseIndexOf(array, value, fromIndex) {
- if (value !== value) {
- return baseFindIndex(array, baseIsNaN, fromIndex);
- }
- var index = fromIndex - 1, length = array.length;
- while (++index < length) {
- if (array[index] === value) {
- return index;
- }
- }
- return -1;
- }
- function baseIsNaN(value) {
- return value !== value;
- }
- function baseTimes(n, iteratee) {
- var index = -1, result = Array(n);
- while (++index < n) {
- result[index] = iteratee(index);
- }
- return result;
- }
- function baseValues(object, props) {
- return arrayMap(props, function(key) {
- return object[key];
- });
- }
- function overArg(func, transform) {
- return function(arg) {
- return func(transform(arg));
- };
- }
- var objectProto = Object.prototype;
- var hasOwnProperty = objectProto.hasOwnProperty;
- var objectToString = objectProto.toString;
- var propertyIsEnumerable = objectProto.propertyIsEnumerable;
- var nativeKeys = overArg(Object.keys, Object);
- var nativeMax = Math.max;
- function arrayLikeKeys(value, inherited) {
- var result = isArray(value) || isArguments(value) ? baseTimes(value.length, String) : [];
- var length = result.length, skipIndexes = !!length;
- for (var key in value) {
- if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && (key == "length" || isIndex(key, length)))) {
- result.push(key);
- }
- }
- return result;
- }
- function baseKeys(object) {
- if (!isPrototype(object)) {
- return nativeKeys(object);
- }
- var result = [];
- for (var key in Object(object)) {
- if (hasOwnProperty.call(object, key) && key != "constructor") {
- result.push(key);
- }
- }
- return result;
- }
- function isIndex(value, length) {
- length = length == null ? MAX_SAFE_INTEGER : length;
- return !!length && (typeof value == "number" || reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
- }
- function isPrototype(value) {
- var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto;
- return value === proto;
- }
- function includes(collection, value, fromIndex, guard) {
- collection = isArrayLike(collection) ? collection : values(collection);
- fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0;
- var length = collection.length;
- if (fromIndex < 0) {
- fromIndex = nativeMax(length + fromIndex, 0);
- }
- return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;
- }
- function isArguments(value) {
- return isArrayLikeObject(value) && hasOwnProperty.call(value, "callee") && (!propertyIsEnumerable.call(value, "callee") || objectToString.call(value) == argsTag);
- }
- var isArray = Array.isArray;
- function isArrayLike(value) {
- return value != null && isLength(value.length) && !isFunction(value);
- }
- function isArrayLikeObject(value) {
- return isObjectLike(value) && isArrayLike(value);
- }
- function isFunction(value) {
- var tag = isObject(value) ? objectToString.call(value) : "";
- return tag == funcTag || tag == genTag;
- }
- function isLength(value) {
- return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
- }
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == "object" || type == "function");
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isString(value) {
- return typeof value == "string" || !isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag;
- }
- function isSymbol(value) {
- return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
- }
- function toFinite(value) {
- if (!value) {
- return value === 0 ? value : 0;
- }
- value = toNumber(value);
- if (value === INFINITY || value === -INFINITY) {
- var sign = value < 0 ? -1 : 1;
- return sign * MAX_INTEGER;
- }
- return value === value ? value : 0;
- }
- function toInteger(value) {
- var result = toFinite(value), remainder = result % 1;
- return result === result ? remainder ? result - remainder : result : 0;
- }
- function toNumber(value) {
- if (typeof value == "number") {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == "function" ? value.valueOf() : value;
- value = isObject(other) ? other + "" : other;
- }
- if (typeof value != "string") {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, "");
- var isBinary = reIsBinary.test(value);
- return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
- }
- function keys(object) {
- return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
- }
- function values(object) {
- return object ? baseValues(object, keys(object)) : [];
- }
- module.exports = includes;
-});
-
-// ../eve/node_modules/lodash.isboolean/index.js
-var require_lodash2 = __commonJS((exports, module) => {
- var boolTag = "[object Boolean]";
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function isBoolean(value) {
- return value === true || value === false || isObjectLike(value) && objectToString.call(value) == boolTag;
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- module.exports = isBoolean;
-});
-
-// ../eve/node_modules/lodash.isinteger/index.js
-var require_lodash3 = __commonJS((exports, module) => {
- var INFINITY = 1 / 0;
- var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
- var NAN = 0 / 0;
- var symbolTag = "[object Symbol]";
- var reTrim = /^\s+|\s+$/g;
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
- var reIsBinary = /^0b[01]+$/i;
- var reIsOctal = /^0o[0-7]+$/i;
- var freeParseInt = parseInt;
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function isInteger(value) {
- return typeof value == "number" && value == toInteger(value);
- }
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == "object" || type == "function");
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isSymbol(value) {
- return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
- }
- function toFinite(value) {
- if (!value) {
- return value === 0 ? value : 0;
- }
- value = toNumber(value);
- if (value === INFINITY || value === -INFINITY) {
- var sign = value < 0 ? -1 : 1;
- return sign * MAX_INTEGER;
- }
- return value === value ? value : 0;
- }
- function toInteger(value) {
- var result = toFinite(value), remainder = result % 1;
- return result === result ? remainder ? result - remainder : result : 0;
- }
- function toNumber(value) {
- if (typeof value == "number") {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == "function" ? value.valueOf() : value;
- value = isObject(other) ? other + "" : other;
- }
- if (typeof value != "string") {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, "");
- var isBinary = reIsBinary.test(value);
- return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
- }
- module.exports = isInteger;
-});
-
-// ../eve/node_modules/lodash.isnumber/index.js
-var require_lodash4 = __commonJS((exports, module) => {
- var numberTag = "[object Number]";
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isNumber(value) {
- return typeof value == "number" || isObjectLike(value) && objectToString.call(value) == numberTag;
- }
- module.exports = isNumber;
-});
-
-// ../eve/node_modules/lodash.isplainobject/index.js
-var require_lodash5 = __commonJS((exports, module) => {
- var objectTag = "[object Object]";
- function isHostObject(value) {
- var result = false;
- if (value != null && typeof value.toString != "function") {
- try {
- result = !!(value + "");
- } catch (e) {}
- }
- return result;
- }
- function overArg(func, transform) {
- return function(arg) {
- return func(transform(arg));
- };
- }
- var funcProto = Function.prototype;
- var objectProto = Object.prototype;
- var funcToString = funcProto.toString;
- var hasOwnProperty = objectProto.hasOwnProperty;
- var objectCtorString = funcToString.call(Object);
- var objectToString = objectProto.toString;
- var getPrototype = overArg(Object.getPrototypeOf, Object);
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isPlainObject(value) {
- if (!isObjectLike(value) || objectToString.call(value) != objectTag || isHostObject(value)) {
- return false;
- }
- var proto = getPrototype(value);
- if (proto === null) {
- return true;
- }
- var Ctor = hasOwnProperty.call(proto, "constructor") && proto.constructor;
- return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
- }
- module.exports = isPlainObject;
-});
-
-// ../eve/node_modules/lodash.isstring/index.js
-var require_lodash6 = __commonJS((exports, module) => {
- var stringTag = "[object String]";
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- var isArray = Array.isArray;
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isString(value) {
- return typeof value == "string" || !isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag;
- }
- module.exports = isString;
-});
-
-// ../eve/node_modules/lodash.once/index.js
-var require_lodash7 = __commonJS((exports, module) => {
- var FUNC_ERROR_TEXT = "Expected a function";
- var INFINITY = 1 / 0;
- var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
- var NAN = 0 / 0;
- var symbolTag = "[object Symbol]";
- var reTrim = /^\s+|\s+$/g;
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
- var reIsBinary = /^0b[01]+$/i;
- var reIsOctal = /^0o[0-7]+$/i;
- var freeParseInt = parseInt;
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function before(n, func) {
- var result;
- if (typeof func != "function") {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- n = toInteger(n);
- return function() {
- if (--n > 0) {
- result = func.apply(this, arguments);
- }
- if (n <= 1) {
- func = undefined;
- }
- return result;
- };
- }
- function once(func) {
- return before(2, func);
- }
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == "object" || type == "function");
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isSymbol(value) {
- return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
- }
- function toFinite(value) {
- if (!value) {
- return value === 0 ? value : 0;
- }
- value = toNumber(value);
- if (value === INFINITY || value === -INFINITY) {
- var sign = value < 0 ? -1 : 1;
- return sign * MAX_INTEGER;
- }
- return value === value ? value : 0;
- }
- function toInteger(value) {
- var result = toFinite(value), remainder = result % 1;
- return result === result ? remainder ? result - remainder : result : 0;
- }
- function toNumber(value) {
- if (typeof value == "number") {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == "function" ? value.valueOf() : value;
- value = isObject(other) ? other + "" : other;
- }
- if (typeof value != "string") {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, "");
- var isBinary = reIsBinary.test(value);
- return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
- }
- module.exports = once;
-});
-
-// ../eve/node_modules/jsonwebtoken/sign.js
-var require_sign = __commonJS((exports, module) => {
- var timespan = require_timespan();
- var PS_SUPPORTED = require_psSupported();
- var validateAsymmetricKey = require_validateAsymmetricKey();
- var jws = require_jws();
- var includes = require_lodash();
- var isBoolean = require_lodash2();
- var isInteger = require_lodash3();
- var isNumber = require_lodash4();
- var isPlainObject = require_lodash5();
- var isString = require_lodash6();
- var once = require_lodash7();
- var { KeyObject, createSecretKey, createPrivateKey } = __require("crypto");
- var SUPPORTED_ALGS = ["RS256", "RS384", "RS512", "ES256", "ES384", "ES512", "HS256", "HS384", "HS512", "none"];
- if (PS_SUPPORTED) {
- SUPPORTED_ALGS.splice(3, 0, "PS256", "PS384", "PS512");
- }
- var sign_options_schema = {
- expiresIn: { isValid: function(value) {
- return isInteger(value) || isString(value) && value;
- }, message: '"expiresIn" should be a number of seconds or string representing a timespan' },
- notBefore: { isValid: function(value) {
- return isInteger(value) || isString(value) && value;
- }, message: '"notBefore" should be a number of seconds or string representing a timespan' },
- audience: { isValid: function(value) {
- return isString(value) || Array.isArray(value);
- }, message: '"audience" must be a string or array' },
- algorithm: { isValid: includes.bind(null, SUPPORTED_ALGS), message: '"algorithm" must be a valid string enum value' },
- header: { isValid: isPlainObject, message: '"header" must be an object' },
- encoding: { isValid: isString, message: '"encoding" must be a string' },
- issuer: { isValid: isString, message: '"issuer" must be a string' },
- subject: { isValid: isString, message: '"subject" must be a string' },
- jwtid: { isValid: isString, message: '"jwtid" must be a string' },
- noTimestamp: { isValid: isBoolean, message: '"noTimestamp" must be a boolean' },
- keyid: { isValid: isString, message: '"keyid" must be a string' },
- mutatePayload: { isValid: isBoolean, message: '"mutatePayload" must be a boolean' },
- allowInsecureKeySizes: { isValid: isBoolean, message: '"allowInsecureKeySizes" must be a boolean' },
- allowInvalidAsymmetricKeyTypes: { isValid: isBoolean, message: '"allowInvalidAsymmetricKeyTypes" must be a boolean' }
- };
- var registered_claims_schema = {
- iat: { isValid: isNumber, message: '"iat" should be a number of seconds' },
- exp: { isValid: isNumber, message: '"exp" should be a number of seconds' },
- nbf: { isValid: isNumber, message: '"nbf" should be a number of seconds' }
- };
- function validate(schema, allowUnknown, object, parameterName) {
- if (!isPlainObject(object)) {
- throw new Error('Expected "' + parameterName + '" to be a plain object.');
- }
- Object.keys(object).forEach(function(key) {
- const validator = schema[key];
- if (!validator) {
- if (!allowUnknown) {
- throw new Error('"' + key + '" is not allowed in "' + parameterName + '"');
- }
- return;
- }
- if (!validator.isValid(object[key])) {
- throw new Error(validator.message);
- }
- });
- }
- function validateOptions(options2) {
- return validate(sign_options_schema, false, options2, "options");
- }
- function validatePayload(payload) {
- return validate(registered_claims_schema, true, payload, "payload");
- }
- var options_to_payload = {
- audience: "aud",
- issuer: "iss",
- subject: "sub",
- jwtid: "jti"
- };
- var options_for_objects = [
- "expiresIn",
- "notBefore",
- "noTimestamp",
- "audience",
- "issuer",
- "subject",
- "jwtid"
- ];
- module.exports = function(payload, secretOrPrivateKey, options2, callback) {
- if (typeof options2 === "function") {
- callback = options2;
- options2 = {};
- } else {
- options2 = options2 || {};
- }
- const isObjectPayload = typeof payload === "object" && !Buffer.isBuffer(payload);
- const header = Object.assign({
- alg: options2.algorithm || "HS256",
- typ: isObjectPayload ? "JWT" : undefined,
- kid: options2.keyid
- }, options2.header);
- function failure(err) {
- if (callback) {
- return callback(err);
- }
- throw err;
- }
- if (!secretOrPrivateKey && options2.algorithm !== "none") {
- return failure(new Error("secretOrPrivateKey must have a value"));
- }
- if (secretOrPrivateKey != null && !(secretOrPrivateKey instanceof KeyObject)) {
- try {
- secretOrPrivateKey = createPrivateKey(secretOrPrivateKey);
- } catch (_) {
- try {
- secretOrPrivateKey = createSecretKey(typeof secretOrPrivateKey === "string" ? Buffer.from(secretOrPrivateKey) : secretOrPrivateKey);
- } catch (_2) {
- return failure(new Error("secretOrPrivateKey is not valid key material"));
- }
- }
- }
- if (header.alg.startsWith("HS") && secretOrPrivateKey.type !== "secret") {
- return failure(new Error(`secretOrPrivateKey must be a symmetric key when using ${header.alg}`));
- } else if (/^(?:RS|PS|ES)/.test(header.alg)) {
- if (secretOrPrivateKey.type !== "private") {
- return failure(new Error(`secretOrPrivateKey must be an asymmetric key when using ${header.alg}`));
- }
- if (!options2.allowInsecureKeySizes && !header.alg.startsWith("ES") && secretOrPrivateKey.asymmetricKeyDetails !== undefined && secretOrPrivateKey.asymmetricKeyDetails.modulusLength < 2048) {
- return failure(new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`));
- }
- }
- if (typeof payload === "undefined") {
- return failure(new Error("payload is required"));
- } else if (isObjectPayload) {
- try {
- validatePayload(payload);
- } catch (error) {
- return failure(error);
- }
- if (!options2.mutatePayload) {
- payload = Object.assign({}, payload);
- }
- } else {
- const invalid_options = options_for_objects.filter(function(opt) {
- return typeof options2[opt] !== "undefined";
- });
- if (invalid_options.length > 0) {
- return failure(new Error("invalid " + invalid_options.join(",") + " option for " + typeof payload + " payload"));
- }
- }
- if (typeof payload.exp !== "undefined" && typeof options2.expiresIn !== "undefined") {
- return failure(new Error('Bad "options.expiresIn" option the payload already has an "exp" property.'));
- }
- if (typeof payload.nbf !== "undefined" && typeof options2.notBefore !== "undefined") {
- return failure(new Error('Bad "options.notBefore" option the payload already has an "nbf" property.'));
- }
- try {
- validateOptions(options2);
- } catch (error) {
- return failure(error);
- }
- if (!options2.allowInvalidAsymmetricKeyTypes) {
- try {
- validateAsymmetricKey(header.alg, secretOrPrivateKey);
- } catch (error) {
- return failure(error);
- }
- }
- const timestamp = payload.iat || Math.floor(Date.now() / 1000);
- if (options2.noTimestamp) {
- delete payload.iat;
- } else if (isObjectPayload) {
- payload.iat = timestamp;
- }
- if (typeof options2.notBefore !== "undefined") {
- try {
- payload.nbf = timespan(options2.notBefore, timestamp);
- } catch (err) {
- return failure(err);
- }
- if (typeof payload.nbf === "undefined") {
- return failure(new Error('"notBefore" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
- }
- }
- if (typeof options2.expiresIn !== "undefined" && typeof payload === "object") {
- try {
- payload.exp = timespan(options2.expiresIn, timestamp);
- } catch (err) {
- return failure(err);
- }
- if (typeof payload.exp === "undefined") {
- return failure(new Error('"expiresIn" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
- }
- }
- Object.keys(options_to_payload).forEach(function(key) {
- const claim = options_to_payload[key];
- if (typeof options2[key] !== "undefined") {
- if (typeof payload[claim] !== "undefined") {
- return failure(new Error('Bad "options.' + key + '" option. The payload already has an "' + claim + '" property.'));
- }
- payload[claim] = options2[key];
- }
- });
- const encoding = options2.encoding || "utf8";
- if (typeof callback === "function") {
- callback = callback && once(callback);
- jws.createSign({
- header,
- privateKey: secretOrPrivateKey,
- payload,
- encoding
- }).once("error", callback).once("done", function(signature) {
- if (!options2.allowInsecureKeySizes && /^(?:RS|PS)/.test(header.alg) && signature.length < 256) {
- return callback(new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`));
- }
- callback(null, signature);
- });
- } else {
- let signature = jws.sign({ header, payload, secret: secretOrPrivateKey, encoding });
- if (!options2.allowInsecureKeySizes && /^(?:RS|PS)/.test(header.alg) && signature.length < 256) {
- throw new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`);
- }
- return signature;
- }
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/index.js
-var require_jsonwebtoken = __commonJS((exports, module) => {
- module.exports = {
- decode: require_decode(),
- verify: require_verify(),
- sign: require_sign(),
- JsonWebTokenError: require_JsonWebTokenError(),
- NotBeforeError: require_NotBeforeError(),
- TokenExpiredError: require_TokenExpiredError()
- };
-});
-
-// ../eve/node_modules/bn.js/lib/bn.js
-var require_bn = __commonJS((exports, module) => {
- (function(module2, exports2) {
- function assert(val, msg) {
- if (!val)
- throw new Error(msg || "Assertion failed");
- }
- function inherits(ctor, superCtor) {
- ctor.super_ = superCtor;
- var TempCtor = function() {};
- TempCtor.prototype = superCtor.prototype;
- ctor.prototype = new TempCtor;
- ctor.prototype.constructor = ctor;
- }
- function BN(number, base, endian) {
- if (BN.isBN(number)) {
- return number;
- }
- this.negative = 0;
- this.words = null;
- this.length = 0;
- this.red = null;
- if (number !== null) {
- if (base === "le" || base === "be") {
- endian = base;
- base = 10;
- }
- this._init(number || 0, base || 10, endian || "be");
- }
- }
- if (typeof module2 === "object") {
- module2.exports = BN;
- } else {
- exports2.BN = BN;
- }
- BN.BN = BN;
- BN.wordSize = 26;
- var Buffer2;
- try {
- if (typeof window !== "undefined" && typeof window.Buffer !== "undefined") {
- Buffer2 = window.Buffer;
- } else {
- Buffer2 = __require("buffer").Buffer;
- }
- } catch (e) {}
- BN.isBN = function isBN(num) {
- if (num instanceof BN) {
- return true;
- }
- return num !== null && typeof num === "object" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);
- };
- BN.max = function max(left, right) {
- if (left.cmp(right) > 0)
- return left;
- return right;
- };
- BN.min = function min(left, right) {
- if (left.cmp(right) < 0)
- return left;
- return right;
- };
- BN.prototype._init = function init(number, base, endian) {
- if (typeof number === "number") {
- return this._initNumber(number, base, endian);
- }
- if (typeof number === "object") {
- return this._initArray(number, base, endian);
- }
- if (base === "hex") {
- base = 16;
- }
- assert(base === (base | 0) && base >= 2 && base <= 36);
- number = number.toString().replace(/\s+/g, "");
- var start = 0;
- if (number[0] === "-") {
- start++;
- this.negative = 1;
- }
- if (start < number.length) {
- if (base === 16) {
- this._parseHex(number, start, endian);
- } else {
- this._parseBase(number, base, start);
- if (endian === "le") {
- this._initArray(this.toArray(), base, endian);
- }
- }
- }
- };
- BN.prototype._initNumber = function _initNumber(number, base, endian) {
- if (number < 0) {
- this.negative = 1;
- number = -number;
- }
- if (number < 67108864) {
- this.words = [number & 67108863];
- this.length = 1;
- } else if (number < 4503599627370496) {
- this.words = [
- number & 67108863,
- number / 67108864 & 67108863
- ];
- this.length = 2;
- } else {
- assert(number < 9007199254740992);
- this.words = [
- number & 67108863,
- number / 67108864 & 67108863,
- 1
- ];
- this.length = 3;
- }
- if (endian !== "le")
- return;
- this._initArray(this.toArray(), base, endian);
- };
- BN.prototype._initArray = function _initArray(number, base, endian) {
- assert(typeof number.length === "number");
- if (number.length <= 0) {
- this.words = [0];
- this.length = 1;
- return this;
- }
- this.length = Math.ceil(number.length / 3);
- this.words = new Array(this.length);
- for (var i = 0;i < this.length; i++) {
- this.words[i] = 0;
- }
- var j, w;
- var off = 0;
- if (endian === "be") {
- for (i = number.length - 1, j = 0;i >= 0; i -= 3) {
- w = number[i] | number[i - 1] << 8 | number[i - 2] << 16;
- this.words[j] |= w << off & 67108863;
- this.words[j + 1] = w >>> 26 - off & 67108863;
- off += 24;
- if (off >= 26) {
- off -= 26;
- j++;
- }
- }
- } else if (endian === "le") {
- for (i = 0, j = 0;i < number.length; i += 3) {
- w = number[i] | number[i + 1] << 8 | number[i + 2] << 16;
- this.words[j] |= w << off & 67108863;
- this.words[j + 1] = w >>> 26 - off & 67108863;
- off += 24;
- if (off >= 26) {
- off -= 26;
- j++;
- }
- }
- }
- return this.strip();
- };
- function parseHex4Bits(string, index) {
- var c = string.charCodeAt(index);
- if (c >= 65 && c <= 70) {
- return c - 55;
- } else if (c >= 97 && c <= 102) {
- return c - 87;
- } else {
- return c - 48 & 15;
- }
- }
- function parseHexByte(string, lowerBound, index) {
- var r = parseHex4Bits(string, index);
- if (index - 1 >= lowerBound) {
- r |= parseHex4Bits(string, index - 1) << 4;
- }
- return r;
- }
- BN.prototype._parseHex = function _parseHex(number, start, endian) {
- this.length = Math.ceil((number.length - start) / 6);
- this.words = new Array(this.length);
- for (var i = 0;i < this.length; i++) {
- this.words[i] = 0;
- }
- var off = 0;
- var j = 0;
- var w;
- if (endian === "be") {
- for (i = number.length - 1;i >= start; i -= 2) {
- w = parseHexByte(number, start, i) << off;
- this.words[j] |= w & 67108863;
- if (off >= 18) {
- off -= 18;
- j += 1;
- this.words[j] |= w >>> 26;
- } else {
- off += 8;
- }
- }
- } else {
- var parseLength = number.length - start;
- for (i = parseLength % 2 === 0 ? start + 1 : start;i < number.length; i += 2) {
- w = parseHexByte(number, start, i) << off;
- this.words[j] |= w & 67108863;
- if (off >= 18) {
- off -= 18;
- j += 1;
- this.words[j] |= w >>> 26;
- } else {
- off += 8;
- }
- }
- }
- this.strip();
- };
- function parseBase(str, start, end, mul) {
- var r = 0;
- var len = Math.min(str.length, end);
- for (var i = start;i < len; i++) {
- var c = str.charCodeAt(i) - 48;
- r *= mul;
- if (c >= 49) {
- r += c - 49 + 10;
- } else if (c >= 17) {
- r += c - 17 + 10;
- } else {
- r += c;
- }
- }
- return r;
- }
- BN.prototype._parseBase = function _parseBase(number, base, start) {
- this.words = [0];
- this.length = 1;
- for (var limbLen = 0, limbPow = 1;limbPow <= 67108863; limbPow *= base) {
- limbLen++;
- }
- limbLen--;
- limbPow = limbPow / base | 0;
- var total = number.length - start;
- var mod = total % limbLen;
- var end = Math.min(total, total - mod) + start;
- var word = 0;
- for (var i = start;i < end; i += limbLen) {
- word = parseBase(number, i, i + limbLen, base);
- this.imuln(limbPow);
- if (this.words[0] + word < 67108864) {
- this.words[0] += word;
- } else {
- this._iaddn(word);
- }
- }
- if (mod !== 0) {
- var pow = 1;
- word = parseBase(number, i, number.length, base);
- for (i = 0;i < mod; i++) {
- pow *= base;
- }
- this.imuln(pow);
- if (this.words[0] + word < 67108864) {
- this.words[0] += word;
- } else {
- this._iaddn(word);
- }
- }
- this.strip();
- };
- BN.prototype.copy = function copy(dest) {
- dest.words = new Array(this.length);
- for (var i = 0;i < this.length; i++) {
- dest.words[i] = this.words[i];
- }
- dest.length = this.length;
- dest.negative = this.negative;
- dest.red = this.red;
- };
- BN.prototype.clone = function clone() {
- var r = new BN(null);
- this.copy(r);
- return r;
- };
- BN.prototype._expand = function _expand(size) {
- while (this.length < size) {
- this.words[this.length++] = 0;
- }
- return this;
- };
- BN.prototype.strip = function strip() {
- while (this.length > 1 && this.words[this.length - 1] === 0) {
- this.length--;
- }
- return this._normSign();
- };
- BN.prototype._normSign = function _normSign() {
- if (this.length === 1 && this.words[0] === 0) {
- this.negative = 0;
- }
- return this;
- };
- BN.prototype.inspect = function inspect() {
- return (this.red ? "";
- };
- var zeros = [
- "",
- "0",
- "00",
- "000",
- "0000",
- "00000",
- "000000",
- "0000000",
- "00000000",
- "000000000",
- "0000000000",
- "00000000000",
- "000000000000",
- "0000000000000",
- "00000000000000",
- "000000000000000",
- "0000000000000000",
- "00000000000000000",
- "000000000000000000",
- "0000000000000000000",
- "00000000000000000000",
- "000000000000000000000",
- "0000000000000000000000",
- "00000000000000000000000",
- "000000000000000000000000",
- "0000000000000000000000000"
- ];
- var groupSizes = [
- 0,
- 0,
- 25,
- 16,
- 12,
- 11,
- 10,
- 9,
- 8,
- 8,
- 7,
- 7,
- 7,
- 7,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5
- ];
- var groupBases = [
- 0,
- 0,
- 33554432,
- 43046721,
- 16777216,
- 48828125,
- 60466176,
- 40353607,
- 16777216,
- 43046721,
- 1e7,
- 19487171,
- 35831808,
- 62748517,
- 7529536,
- 11390625,
- 16777216,
- 24137569,
- 34012224,
- 47045881,
- 64000000,
- 4084101,
- 5153632,
- 6436343,
- 7962624,
- 9765625,
- 11881376,
- 14348907,
- 17210368,
- 20511149,
- 24300000,
- 28629151,
- 33554432,
- 39135393,
- 45435424,
- 52521875,
- 60466176
- ];
- BN.prototype.toString = function toString(base, padding) {
- base = base || 10;
- padding = padding | 0 || 1;
- var out;
- if (base === 16 || base === "hex") {
- out = "";
- var off = 0;
- var carry = 0;
- for (var i = 0;i < this.length; i++) {
- var w = this.words[i];
- var word = ((w << off | carry) & 16777215).toString(16);
- carry = w >>> 24 - off & 16777215;
- off += 2;
- if (off >= 26) {
- off -= 26;
- i--;
- }
- if (carry !== 0 || i !== this.length - 1) {
- out = zeros[6 - word.length] + word + out;
- } else {
- out = word + out;
- }
- }
- if (carry !== 0) {
- out = carry.toString(16) + out;
- }
- while (out.length % padding !== 0) {
- out = "0" + out;
- }
- if (this.negative !== 0) {
- out = "-" + out;
- }
- return out;
- }
- if (base === (base | 0) && base >= 2 && base <= 36) {
- var groupSize = groupSizes[base];
- var groupBase = groupBases[base];
- out = "";
- var c = this.clone();
- c.negative = 0;
- while (!c.isZero()) {
- var r = c.modn(groupBase).toString(base);
- c = c.idivn(groupBase);
- if (!c.isZero()) {
- out = zeros[groupSize - r.length] + r + out;
- } else {
- out = r + out;
- }
- }
- if (this.isZero()) {
- out = "0" + out;
- }
- while (out.length % padding !== 0) {
- out = "0" + out;
- }
- if (this.negative !== 0) {
- out = "-" + out;
- }
- return out;
- }
- assert(false, "Base should be between 2 and 36");
- };
- BN.prototype.toNumber = function toNumber() {
- var ret = this.words[0];
- if (this.length === 2) {
- ret += this.words[1] * 67108864;
- } else if (this.length === 3 && this.words[2] === 1) {
- ret += 4503599627370496 + this.words[1] * 67108864;
- } else if (this.length > 2) {
- assert(false, "Number can only safely store up to 53 bits");
- }
- return this.negative !== 0 ? -ret : ret;
- };
- BN.prototype.toJSON = function toJSON() {
- return this.toString(16);
- };
- BN.prototype.toBuffer = function toBuffer(endian, length) {
- assert(typeof Buffer2 !== "undefined");
- return this.toArrayLike(Buffer2, endian, length);
- };
- BN.prototype.toArray = function toArray(endian, length) {
- return this.toArrayLike(Array, endian, length);
- };
- BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) {
- var byteLength = this.byteLength();
- var reqLength = length || Math.max(1, byteLength);
- assert(byteLength <= reqLength, "byte array longer than desired length");
- assert(reqLength > 0, "Requested array length <= 0");
- this.strip();
- var littleEndian = endian === "le";
- var res = new ArrayType(reqLength);
- var b, i;
- var q = this.clone();
- if (!littleEndian) {
- for (i = 0;i < reqLength - byteLength; i++) {
- res[i] = 0;
- }
- for (i = 0;!q.isZero(); i++) {
- b = q.andln(255);
- q.iushrn(8);
- res[reqLength - i - 1] = b;
- }
- } else {
- for (i = 0;!q.isZero(); i++) {
- b = q.andln(255);
- q.iushrn(8);
- res[i] = b;
- }
- for (;i < reqLength; i++) {
- res[i] = 0;
- }
- }
- return res;
- };
- if (Math.clz32) {
- BN.prototype._countBits = function _countBits(w) {
- return 32 - Math.clz32(w);
- };
- } else {
- BN.prototype._countBits = function _countBits(w) {
- var t = w;
- var r = 0;
- if (t >= 4096) {
- r += 13;
- t >>>= 13;
- }
- if (t >= 64) {
- r += 7;
- t >>>= 7;
- }
- if (t >= 8) {
- r += 4;
- t >>>= 4;
- }
- if (t >= 2) {
- r += 2;
- t >>>= 2;
- }
- return r + t;
- };
- }
- BN.prototype._zeroBits = function _zeroBits(w) {
- if (w === 0)
- return 26;
- var t = w;
- var r = 0;
- if ((t & 8191) === 0) {
- r += 13;
- t >>>= 13;
- }
- if ((t & 127) === 0) {
- r += 7;
- t >>>= 7;
- }
- if ((t & 15) === 0) {
- r += 4;
- t >>>= 4;
- }
- if ((t & 3) === 0) {
- r += 2;
- t >>>= 2;
- }
- if ((t & 1) === 0) {
- r++;
- }
- return r;
- };
- BN.prototype.bitLength = function bitLength() {
- var w = this.words[this.length - 1];
- var hi = this._countBits(w);
- return (this.length - 1) * 26 + hi;
- };
- function toBitArray(num) {
- var w = new Array(num.bitLength());
- for (var bit = 0;bit < w.length; bit++) {
- var off = bit / 26 | 0;
- var wbit = bit % 26;
- w[bit] = (num.words[off] & 1 << wbit) >>> wbit;
- }
- return w;
- }
- BN.prototype.zeroBits = function zeroBits() {
- if (this.isZero())
- return 0;
- var r = 0;
- for (var i = 0;i < this.length; i++) {
- var b = this._zeroBits(this.words[i]);
- r += b;
- if (b !== 26)
- break;
- }
- return r;
- };
- BN.prototype.byteLength = function byteLength() {
- return Math.ceil(this.bitLength() / 8);
- };
- BN.prototype.toTwos = function toTwos(width) {
- if (this.negative !== 0) {
- return this.abs().inotn(width).iaddn(1);
- }
- return this.clone();
- };
- BN.prototype.fromTwos = function fromTwos(width) {
- if (this.testn(width - 1)) {
- return this.notn(width).iaddn(1).ineg();
- }
- return this.clone();
- };
- BN.prototype.isNeg = function isNeg() {
- return this.negative !== 0;
- };
- BN.prototype.neg = function neg() {
- return this.clone().ineg();
- };
- BN.prototype.ineg = function ineg() {
- if (!this.isZero()) {
- this.negative ^= 1;
- }
- return this;
- };
- BN.prototype.iuor = function iuor(num) {
- while (this.length < num.length) {
- this.words[this.length++] = 0;
- }
- for (var i = 0;i < num.length; i++) {
- this.words[i] = this.words[i] | num.words[i];
- }
- return this.strip();
- };
- BN.prototype.ior = function ior(num) {
- assert((this.negative | num.negative) === 0);
- return this.iuor(num);
- };
- BN.prototype.or = function or(num) {
- if (this.length > num.length)
- return this.clone().ior(num);
- return num.clone().ior(this);
- };
- BN.prototype.uor = function uor(num) {
- if (this.length > num.length)
- return this.clone().iuor(num);
- return num.clone().iuor(this);
- };
- BN.prototype.iuand = function iuand(num) {
- var b;
- if (this.length > num.length) {
- b = num;
- } else {
- b = this;
- }
- for (var i = 0;i < b.length; i++) {
- this.words[i] = this.words[i] & num.words[i];
- }
- this.length = b.length;
- return this.strip();
- };
- BN.prototype.iand = function iand(num) {
- assert((this.negative | num.negative) === 0);
- return this.iuand(num);
- };
- BN.prototype.and = function and(num) {
- if (this.length > num.length)
- return this.clone().iand(num);
- return num.clone().iand(this);
- };
- BN.prototype.uand = function uand(num) {
- if (this.length > num.length)
- return this.clone().iuand(num);
- return num.clone().iuand(this);
- };
- BN.prototype.iuxor = function iuxor(num) {
- var a;
- var b;
- if (this.length > num.length) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
- for (var i = 0;i < b.length; i++) {
- this.words[i] = a.words[i] ^ b.words[i];
- }
- if (this !== a) {
- for (;i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
- this.length = a.length;
- return this.strip();
- };
- BN.prototype.ixor = function ixor(num) {
- assert((this.negative | num.negative) === 0);
- return this.iuxor(num);
- };
- BN.prototype.xor = function xor(num) {
- if (this.length > num.length)
- return this.clone().ixor(num);
- return num.clone().ixor(this);
- };
- BN.prototype.uxor = function uxor(num) {
- if (this.length > num.length)
- return this.clone().iuxor(num);
- return num.clone().iuxor(this);
- };
- BN.prototype.inotn = function inotn(width) {
- assert(typeof width === "number" && width >= 0);
- var bytesNeeded = Math.ceil(width / 26) | 0;
- var bitsLeft = width % 26;
- this._expand(bytesNeeded);
- if (bitsLeft > 0) {
- bytesNeeded--;
- }
- for (var i = 0;i < bytesNeeded; i++) {
- this.words[i] = ~this.words[i] & 67108863;
- }
- if (bitsLeft > 0) {
- this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft;
- }
- return this.strip();
- };
- BN.prototype.notn = function notn(width) {
- return this.clone().inotn(width);
- };
- BN.prototype.setn = function setn(bit, val) {
- assert(typeof bit === "number" && bit >= 0);
- var off = bit / 26 | 0;
- var wbit = bit % 26;
- this._expand(off + 1);
- if (val) {
- this.words[off] = this.words[off] | 1 << wbit;
- } else {
- this.words[off] = this.words[off] & ~(1 << wbit);
- }
- return this.strip();
- };
- BN.prototype.iadd = function iadd(num) {
- var r;
- if (this.negative !== 0 && num.negative === 0) {
- this.negative = 0;
- r = this.isub(num);
- this.negative ^= 1;
- return this._normSign();
- } else if (this.negative === 0 && num.negative !== 0) {
- num.negative = 0;
- r = this.isub(num);
- num.negative = 1;
- return r._normSign();
- }
- var a, b;
- if (this.length > num.length) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
- var carry = 0;
- for (var i = 0;i < b.length; i++) {
- r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
- this.words[i] = r & 67108863;
- carry = r >>> 26;
- }
- for (;carry !== 0 && i < a.length; i++) {
- r = (a.words[i] | 0) + carry;
- this.words[i] = r & 67108863;
- carry = r >>> 26;
- }
- this.length = a.length;
- if (carry !== 0) {
- this.words[this.length] = carry;
- this.length++;
- } else if (a !== this) {
- for (;i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
- return this;
- };
- BN.prototype.add = function add(num) {
- var res;
- if (num.negative !== 0 && this.negative === 0) {
- num.negative = 0;
- res = this.sub(num);
- num.negative ^= 1;
- return res;
- } else if (num.negative === 0 && this.negative !== 0) {
- this.negative = 0;
- res = num.sub(this);
- this.negative = 1;
- return res;
- }
- if (this.length > num.length)
- return this.clone().iadd(num);
- return num.clone().iadd(this);
- };
- BN.prototype.isub = function isub(num) {
- if (num.negative !== 0) {
- num.negative = 0;
- var r = this.iadd(num);
- num.negative = 1;
- return r._normSign();
- } else if (this.negative !== 0) {
- this.negative = 0;
- this.iadd(num);
- this.negative = 1;
- return this._normSign();
- }
- var cmp = this.cmp(num);
- if (cmp === 0) {
- this.negative = 0;
- this.length = 1;
- this.words[0] = 0;
- return this;
- }
- var a, b;
- if (cmp > 0) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
- var carry = 0;
- for (var i = 0;i < b.length; i++) {
- r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
- carry = r >> 26;
- this.words[i] = r & 67108863;
- }
- for (;carry !== 0 && i < a.length; i++) {
- r = (a.words[i] | 0) + carry;
- carry = r >> 26;
- this.words[i] = r & 67108863;
- }
- if (carry === 0 && i < a.length && a !== this) {
- for (;i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
- this.length = Math.max(this.length, i);
- if (a !== this) {
- this.negative = 1;
- }
- return this.strip();
- };
- BN.prototype.sub = function sub(num) {
- return this.clone().isub(num);
- };
- function smallMulTo(self2, num, out) {
- out.negative = num.negative ^ self2.negative;
- var len = self2.length + num.length | 0;
- out.length = len;
- len = len - 1 | 0;
- var a = self2.words[0] | 0;
- var b = num.words[0] | 0;
- var r = a * b;
- var lo = r & 67108863;
- var carry = r / 67108864 | 0;
- out.words[0] = lo;
- for (var k = 1;k < len; k++) {
- var ncarry = carry >>> 26;
- var rword = carry & 67108863;
- var maxJ = Math.min(k, num.length - 1);
- for (var j = Math.max(0, k - self2.length + 1);j <= maxJ; j++) {
- var i = k - j | 0;
- a = self2.words[i] | 0;
- b = num.words[j] | 0;
- r = a * b + rword;
- ncarry += r / 67108864 | 0;
- rword = r & 67108863;
- }
- out.words[k] = rword | 0;
- carry = ncarry | 0;
- }
- if (carry !== 0) {
- out.words[k] = carry | 0;
- } else {
- out.length--;
- }
- return out.strip();
- }
- var comb10MulTo = function comb10MulTo(self2, num, out) {
- var a = self2.words;
- var b = num.words;
- var o = out.words;
- var c = 0;
- var lo;
- var mid;
- var hi;
- var a0 = a[0] | 0;
- var al0 = a0 & 8191;
- var ah0 = a0 >>> 13;
- var a1 = a[1] | 0;
- var al1 = a1 & 8191;
- var ah1 = a1 >>> 13;
- var a2 = a[2] | 0;
- var al2 = a2 & 8191;
- var ah2 = a2 >>> 13;
- var a3 = a[3] | 0;
- var al3 = a3 & 8191;
- var ah3 = a3 >>> 13;
- var a4 = a[4] | 0;
- var al4 = a4 & 8191;
- var ah4 = a4 >>> 13;
- var a5 = a[5] | 0;
- var al5 = a5 & 8191;
- var ah5 = a5 >>> 13;
- var a6 = a[6] | 0;
- var al6 = a6 & 8191;
- var ah6 = a6 >>> 13;
- var a7 = a[7] | 0;
- var al7 = a7 & 8191;
- var ah7 = a7 >>> 13;
- var a8 = a[8] | 0;
- var al8 = a8 & 8191;
- var ah8 = a8 >>> 13;
- var a9 = a[9] | 0;
- var al9 = a9 & 8191;
- var ah9 = a9 >>> 13;
- var b0 = b[0] | 0;
- var bl0 = b0 & 8191;
- var bh0 = b0 >>> 13;
- var b1 = b[1] | 0;
- var bl1 = b1 & 8191;
- var bh1 = b1 >>> 13;
- var b2 = b[2] | 0;
- var bl2 = b2 & 8191;
- var bh2 = b2 >>> 13;
- var b3 = b[3] | 0;
- var bl3 = b3 & 8191;
- var bh3 = b3 >>> 13;
- var b4 = b[4] | 0;
- var bl4 = b4 & 8191;
- var bh4 = b4 >>> 13;
- var b5 = b[5] | 0;
- var bl5 = b5 & 8191;
- var bh5 = b5 >>> 13;
- var b6 = b[6] | 0;
- var bl6 = b6 & 8191;
- var bh6 = b6 >>> 13;
- var b7 = b[7] | 0;
- var bl7 = b7 & 8191;
- var bh7 = b7 >>> 13;
- var b8 = b[8] | 0;
- var bl8 = b8 & 8191;
- var bh8 = b8 >>> 13;
- var b9 = b[9] | 0;
- var bl9 = b9 & 8191;
- var bh9 = b9 >>> 13;
- out.negative = self2.negative ^ num.negative;
- out.length = 19;
- lo = Math.imul(al0, bl0);
- mid = Math.imul(al0, bh0);
- mid = mid + Math.imul(ah0, bl0) | 0;
- hi = Math.imul(ah0, bh0);
- var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0;
- w0 &= 67108863;
- lo = Math.imul(al1, bl0);
- mid = Math.imul(al1, bh0);
- mid = mid + Math.imul(ah1, bl0) | 0;
- hi = Math.imul(ah1, bh0);
- lo = lo + Math.imul(al0, bl1) | 0;
- mid = mid + Math.imul(al0, bh1) | 0;
- mid = mid + Math.imul(ah0, bl1) | 0;
- hi = hi + Math.imul(ah0, bh1) | 0;
- var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0;
- w1 &= 67108863;
- lo = Math.imul(al2, bl0);
- mid = Math.imul(al2, bh0);
- mid = mid + Math.imul(ah2, bl0) | 0;
- hi = Math.imul(ah2, bh0);
- lo = lo + Math.imul(al1, bl1) | 0;
- mid = mid + Math.imul(al1, bh1) | 0;
- mid = mid + Math.imul(ah1, bl1) | 0;
- hi = hi + Math.imul(ah1, bh1) | 0;
- lo = lo + Math.imul(al0, bl2) | 0;
- mid = mid + Math.imul(al0, bh2) | 0;
- mid = mid + Math.imul(ah0, bl2) | 0;
- hi = hi + Math.imul(ah0, bh2) | 0;
- var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0;
- w2 &= 67108863;
- lo = Math.imul(al3, bl0);
- mid = Math.imul(al3, bh0);
- mid = mid + Math.imul(ah3, bl0) | 0;
- hi = Math.imul(ah3, bh0);
- lo = lo + Math.imul(al2, bl1) | 0;
- mid = mid + Math.imul(al2, bh1) | 0;
- mid = mid + Math.imul(ah2, bl1) | 0;
- hi = hi + Math.imul(ah2, bh1) | 0;
- lo = lo + Math.imul(al1, bl2) | 0;
- mid = mid + Math.imul(al1, bh2) | 0;
- mid = mid + Math.imul(ah1, bl2) | 0;
- hi = hi + Math.imul(ah1, bh2) | 0;
- lo = lo + Math.imul(al0, bl3) | 0;
- mid = mid + Math.imul(al0, bh3) | 0;
- mid = mid + Math.imul(ah0, bl3) | 0;
- hi = hi + Math.imul(ah0, bh3) | 0;
- var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0;
- w3 &= 67108863;
- lo = Math.imul(al4, bl0);
- mid = Math.imul(al4, bh0);
- mid = mid + Math.imul(ah4, bl0) | 0;
- hi = Math.imul(ah4, bh0);
- lo = lo + Math.imul(al3, bl1) | 0;
- mid = mid + Math.imul(al3, bh1) | 0;
- mid = mid + Math.imul(ah3, bl1) | 0;
- hi = hi + Math.imul(ah3, bh1) | 0;
- lo = lo + Math.imul(al2, bl2) | 0;
- mid = mid + Math.imul(al2, bh2) | 0;
- mid = mid + Math.imul(ah2, bl2) | 0;
- hi = hi + Math.imul(ah2, bh2) | 0;
- lo = lo + Math.imul(al1, bl3) | 0;
- mid = mid + Math.imul(al1, bh3) | 0;
- mid = mid + Math.imul(ah1, bl3) | 0;
- hi = hi + Math.imul(ah1, bh3) | 0;
- lo = lo + Math.imul(al0, bl4) | 0;
- mid = mid + Math.imul(al0, bh4) | 0;
- mid = mid + Math.imul(ah0, bl4) | 0;
- hi = hi + Math.imul(ah0, bh4) | 0;
- var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0;
- w4 &= 67108863;
- lo = Math.imul(al5, bl0);
- mid = Math.imul(al5, bh0);
- mid = mid + Math.imul(ah5, bl0) | 0;
- hi = Math.imul(ah5, bh0);
- lo = lo + Math.imul(al4, bl1) | 0;
- mid = mid + Math.imul(al4, bh1) | 0;
- mid = mid + Math.imul(ah4, bl1) | 0;
- hi = hi + Math.imul(ah4, bh1) | 0;
- lo = lo + Math.imul(al3, bl2) | 0;
- mid = mid + Math.imul(al3, bh2) | 0;
- mid = mid + Math.imul(ah3, bl2) | 0;
- hi = hi + Math.imul(ah3, bh2) | 0;
- lo = lo + Math.imul(al2, bl3) | 0;
- mid = mid + Math.imul(al2, bh3) | 0;
- mid = mid + Math.imul(ah2, bl3) | 0;
- hi = hi + Math.imul(ah2, bh3) | 0;
- lo = lo + Math.imul(al1, bl4) | 0;
- mid = mid + Math.imul(al1, bh4) | 0;
- mid = mid + Math.imul(ah1, bl4) | 0;
- hi = hi + Math.imul(ah1, bh4) | 0;
- lo = lo + Math.imul(al0, bl5) | 0;
- mid = mid + Math.imul(al0, bh5) | 0;
- mid = mid + Math.imul(ah0, bl5) | 0;
- hi = hi + Math.imul(ah0, bh5) | 0;
- var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0;
- w5 &= 67108863;
- lo = Math.imul(al6, bl0);
- mid = Math.imul(al6, bh0);
- mid = mid + Math.imul(ah6, bl0) | 0;
- hi = Math.imul(ah6, bh0);
- lo = lo + Math.imul(al5, bl1) | 0;
- mid = mid + Math.imul(al5, bh1) | 0;
- mid = mid + Math.imul(ah5, bl1) | 0;
- hi = hi + Math.imul(ah5, bh1) | 0;
- lo = lo + Math.imul(al4, bl2) | 0;
- mid = mid + Math.imul(al4, bh2) | 0;
- mid = mid + Math.imul(ah4, bl2) | 0;
- hi = hi + Math.imul(ah4, bh2) | 0;
- lo = lo + Math.imul(al3, bl3) | 0;
- mid = mid + Math.imul(al3, bh3) | 0;
- mid = mid + Math.imul(ah3, bl3) | 0;
- hi = hi + Math.imul(ah3, bh3) | 0;
- lo = lo + Math.imul(al2, bl4) | 0;
- mid = mid + Math.imul(al2, bh4) | 0;
- mid = mid + Math.imul(ah2, bl4) | 0;
- hi = hi + Math.imul(ah2, bh4) | 0;
- lo = lo + Math.imul(al1, bl5) | 0;
- mid = mid + Math.imul(al1, bh5) | 0;
- mid = mid + Math.imul(ah1, bl5) | 0;
- hi = hi + Math.imul(ah1, bh5) | 0;
- lo = lo + Math.imul(al0, bl6) | 0;
- mid = mid + Math.imul(al0, bh6) | 0;
- mid = mid + Math.imul(ah0, bl6) | 0;
- hi = hi + Math.imul(ah0, bh6) | 0;
- var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0;
- w6 &= 67108863;
- lo = Math.imul(al7, bl0);
- mid = Math.imul(al7, bh0);
- mid = mid + Math.imul(ah7, bl0) | 0;
- hi = Math.imul(ah7, bh0);
- lo = lo + Math.imul(al6, bl1) | 0;
- mid = mid + Math.imul(al6, bh1) | 0;
- mid = mid + Math.imul(ah6, bl1) | 0;
- hi = hi + Math.imul(ah6, bh1) | 0;
- lo = lo + Math.imul(al5, bl2) | 0;
- mid = mid + Math.imul(al5, bh2) | 0;
- mid = mid + Math.imul(ah5, bl2) | 0;
- hi = hi + Math.imul(ah5, bh2) | 0;
- lo = lo + Math.imul(al4, bl3) | 0;
- mid = mid + Math.imul(al4, bh3) | 0;
- mid = mid + Math.imul(ah4, bl3) | 0;
- hi = hi + Math.imul(ah4, bh3) | 0;
- lo = lo + Math.imul(al3, bl4) | 0;
- mid = mid + Math.imul(al3, bh4) | 0;
- mid = mid + Math.imul(ah3, bl4) | 0;
- hi = hi + Math.imul(ah3, bh4) | 0;
- lo = lo + Math.imul(al2, bl5) | 0;
- mid = mid + Math.imul(al2, bh5) | 0;
- mid = mid + Math.imul(ah2, bl5) | 0;
- hi = hi + Math.imul(ah2, bh5) | 0;
- lo = lo + Math.imul(al1, bl6) | 0;
- mid = mid + Math.imul(al1, bh6) | 0;
- mid = mid + Math.imul(ah1, bl6) | 0;
- hi = hi + Math.imul(ah1, bh6) | 0;
- lo = lo + Math.imul(al0, bl7) | 0;
- mid = mid + Math.imul(al0, bh7) | 0;
- mid = mid + Math.imul(ah0, bl7) | 0;
- hi = hi + Math.imul(ah0, bh7) | 0;
- var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0;
- w7 &= 67108863;
- lo = Math.imul(al8, bl0);
- mid = Math.imul(al8, bh0);
- mid = mid + Math.imul(ah8, bl0) | 0;
- hi = Math.imul(ah8, bh0);
- lo = lo + Math.imul(al7, bl1) | 0;
- mid = mid + Math.imul(al7, bh1) | 0;
- mid = mid + Math.imul(ah7, bl1) | 0;
- hi = hi + Math.imul(ah7, bh1) | 0;
- lo = lo + Math.imul(al6, bl2) | 0;
- mid = mid + Math.imul(al6, bh2) | 0;
- mid = mid + Math.imul(ah6, bl2) | 0;
- hi = hi + Math.imul(ah6, bh2) | 0;
- lo = lo + Math.imul(al5, bl3) | 0;
- mid = mid + Math.imul(al5, bh3) | 0;
- mid = mid + Math.imul(ah5, bl3) | 0;
- hi = hi + Math.imul(ah5, bh3) | 0;
- lo = lo + Math.imul(al4, bl4) | 0;
- mid = mid + Math.imul(al4, bh4) | 0;
- mid = mid + Math.imul(ah4, bl4) | 0;
- hi = hi + Math.imul(ah4, bh4) | 0;
- lo = lo + Math.imul(al3, bl5) | 0;
- mid = mid + Math.imul(al3, bh5) | 0;
- mid = mid + Math.imul(ah3, bl5) | 0;
- hi = hi + Math.imul(ah3, bh5) | 0;
- lo = lo + Math.imul(al2, bl6) | 0;
- mid = mid + Math.imul(al2, bh6) | 0;
- mid = mid + Math.imul(ah2, bl6) | 0;
- hi = hi + Math.imul(ah2, bh6) | 0;
- lo = lo + Math.imul(al1, bl7) | 0;
- mid = mid + Math.imul(al1, bh7) | 0;
- mid = mid + Math.imul(ah1, bl7) | 0;
- hi = hi + Math.imul(ah1, bh7) | 0;
- lo = lo + Math.imul(al0, bl8) | 0;
- mid = mid + Math.imul(al0, bh8) | 0;
- mid = mid + Math.imul(ah0, bl8) | 0;
- hi = hi + Math.imul(ah0, bh8) | 0;
- var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0;
- w8 &= 67108863;
- lo = Math.imul(al9, bl0);
- mid = Math.imul(al9, bh0);
- mid = mid + Math.imul(ah9, bl0) | 0;
- hi = Math.imul(ah9, bh0);
- lo = lo + Math.imul(al8, bl1) | 0;
- mid = mid + Math.imul(al8, bh1) | 0;
- mid = mid + Math.imul(ah8, bl1) | 0;
- hi = hi + Math.imul(ah8, bh1) | 0;
- lo = lo + Math.imul(al7, bl2) | 0;
- mid = mid + Math.imul(al7, bh2) | 0;
- mid = mid + Math.imul(ah7, bl2) | 0;
- hi = hi + Math.imul(ah7, bh2) | 0;
- lo = lo + Math.imul(al6, bl3) | 0;
- mid = mid + Math.imul(al6, bh3) | 0;
- mid = mid + Math.imul(ah6, bl3) | 0;
- hi = hi + Math.imul(ah6, bh3) | 0;
- lo = lo + Math.imul(al5, bl4) | 0;
- mid = mid + Math.imul(al5, bh4) | 0;
- mid = mid + Math.imul(ah5, bl4) | 0;
- hi = hi + Math.imul(ah5, bh4) | 0;
- lo = lo + Math.imul(al4, bl5) | 0;
- mid = mid + Math.imul(al4, bh5) | 0;
- mid = mid + Math.imul(ah4, bl5) | 0;
- hi = hi + Math.imul(ah4, bh5) | 0;
- lo = lo + Math.imul(al3, bl6) | 0;
- mid = mid + Math.imul(al3, bh6) | 0;
- mid = mid + Math.imul(ah3, bl6) | 0;
- hi = hi + Math.imul(ah3, bh6) | 0;
- lo = lo + Math.imul(al2, bl7) | 0;
- mid = mid + Math.imul(al2, bh7) | 0;
- mid = mid + Math.imul(ah2, bl7) | 0;
- hi = hi + Math.imul(ah2, bh7) | 0;
- lo = lo + Math.imul(al1, bl8) | 0;
- mid = mid + Math.imul(al1, bh8) | 0;
- mid = mid + Math.imul(ah1, bl8) | 0;
- hi = hi + Math.imul(ah1, bh8) | 0;
- lo = lo + Math.imul(al0, bl9) | 0;
- mid = mid + Math.imul(al0, bh9) | 0;
- mid = mid + Math.imul(ah0, bl9) | 0;
- hi = hi + Math.imul(ah0, bh9) | 0;
- var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0;
- w9 &= 67108863;
- lo = Math.imul(al9, bl1);
- mid = Math.imul(al9, bh1);
- mid = mid + Math.imul(ah9, bl1) | 0;
- hi = Math.imul(ah9, bh1);
- lo = lo + Math.imul(al8, bl2) | 0;
- mid = mid + Math.imul(al8, bh2) | 0;
- mid = mid + Math.imul(ah8, bl2) | 0;
- hi = hi + Math.imul(ah8, bh2) | 0;
- lo = lo + Math.imul(al7, bl3) | 0;
- mid = mid + Math.imul(al7, bh3) | 0;
- mid = mid + Math.imul(ah7, bl3) | 0;
- hi = hi + Math.imul(ah7, bh3) | 0;
- lo = lo + Math.imul(al6, bl4) | 0;
- mid = mid + Math.imul(al6, bh4) | 0;
- mid = mid + Math.imul(ah6, bl4) | 0;
- hi = hi + Math.imul(ah6, bh4) | 0;
- lo = lo + Math.imul(al5, bl5) | 0;
- mid = mid + Math.imul(al5, bh5) | 0;
- mid = mid + Math.imul(ah5, bl5) | 0;
- hi = hi + Math.imul(ah5, bh5) | 0;
- lo = lo + Math.imul(al4, bl6) | 0;
- mid = mid + Math.imul(al4, bh6) | 0;
- mid = mid + Math.imul(ah4, bl6) | 0;
- hi = hi + Math.imul(ah4, bh6) | 0;
- lo = lo + Math.imul(al3, bl7) | 0;
- mid = mid + Math.imul(al3, bh7) | 0;
- mid = mid + Math.imul(ah3, bl7) | 0;
- hi = hi + Math.imul(ah3, bh7) | 0;
- lo = lo + Math.imul(al2, bl8) | 0;
- mid = mid + Math.imul(al2, bh8) | 0;
- mid = mid + Math.imul(ah2, bl8) | 0;
- hi = hi + Math.imul(ah2, bh8) | 0;
- lo = lo + Math.imul(al1, bl9) | 0;
- mid = mid + Math.imul(al1, bh9) | 0;
- mid = mid + Math.imul(ah1, bl9) | 0;
- hi = hi + Math.imul(ah1, bh9) | 0;
- var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0;
- w10 &= 67108863;
- lo = Math.imul(al9, bl2);
- mid = Math.imul(al9, bh2);
- mid = mid + Math.imul(ah9, bl2) | 0;
- hi = Math.imul(ah9, bh2);
- lo = lo + Math.imul(al8, bl3) | 0;
- mid = mid + Math.imul(al8, bh3) | 0;
- mid = mid + Math.imul(ah8, bl3) | 0;
- hi = hi + Math.imul(ah8, bh3) | 0;
- lo = lo + Math.imul(al7, bl4) | 0;
- mid = mid + Math.imul(al7, bh4) | 0;
- mid = mid + Math.imul(ah7, bl4) | 0;
- hi = hi + Math.imul(ah7, bh4) | 0;
- lo = lo + Math.imul(al6, bl5) | 0;
- mid = mid + Math.imul(al6, bh5) | 0;
- mid = mid + Math.imul(ah6, bl5) | 0;
- hi = hi + Math.imul(ah6, bh5) | 0;
- lo = lo + Math.imul(al5, bl6) | 0;
- mid = mid + Math.imul(al5, bh6) | 0;
- mid = mid + Math.imul(ah5, bl6) | 0;
- hi = hi + Math.imul(ah5, bh6) | 0;
- lo = lo + Math.imul(al4, bl7) | 0;
- mid = mid + Math.imul(al4, bh7) | 0;
- mid = mid + Math.imul(ah4, bl7) | 0;
- hi = hi + Math.imul(ah4, bh7) | 0;
- lo = lo + Math.imul(al3, bl8) | 0;
- mid = mid + Math.imul(al3, bh8) | 0;
- mid = mid + Math.imul(ah3, bl8) | 0;
- hi = hi + Math.imul(ah3, bh8) | 0;
- lo = lo + Math.imul(al2, bl9) | 0;
- mid = mid + Math.imul(al2, bh9) | 0;
- mid = mid + Math.imul(ah2, bl9) | 0;
- hi = hi + Math.imul(ah2, bh9) | 0;
- var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0;
- w11 &= 67108863;
- lo = Math.imul(al9, bl3);
- mid = Math.imul(al9, bh3);
- mid = mid + Math.imul(ah9, bl3) | 0;
- hi = Math.imul(ah9, bh3);
- lo = lo + Math.imul(al8, bl4) | 0;
- mid = mid + Math.imul(al8, bh4) | 0;
- mid = mid + Math.imul(ah8, bl4) | 0;
- hi = hi + Math.imul(ah8, bh4) | 0;
- lo = lo + Math.imul(al7, bl5) | 0;
- mid = mid + Math.imul(al7, bh5) | 0;
- mid = mid + Math.imul(ah7, bl5) | 0;
- hi = hi + Math.imul(ah7, bh5) | 0;
- lo = lo + Math.imul(al6, bl6) | 0;
- mid = mid + Math.imul(al6, bh6) | 0;
- mid = mid + Math.imul(ah6, bl6) | 0;
- hi = hi + Math.imul(ah6, bh6) | 0;
- lo = lo + Math.imul(al5, bl7) | 0;
- mid = mid + Math.imul(al5, bh7) | 0;
- mid = mid + Math.imul(ah5, bl7) | 0;
- hi = hi + Math.imul(ah5, bh7) | 0;
- lo = lo + Math.imul(al4, bl8) | 0;
- mid = mid + Math.imul(al4, bh8) | 0;
- mid = mid + Math.imul(ah4, bl8) | 0;
- hi = hi + Math.imul(ah4, bh8) | 0;
- lo = lo + Math.imul(al3, bl9) | 0;
- mid = mid + Math.imul(al3, bh9) | 0;
- mid = mid + Math.imul(ah3, bl9) | 0;
- hi = hi + Math.imul(ah3, bh9) | 0;
- var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0;
- w12 &= 67108863;
- lo = Math.imul(al9, bl4);
- mid = Math.imul(al9, bh4);
- mid = mid + Math.imul(ah9, bl4) | 0;
- hi = Math.imul(ah9, bh4);
- lo = lo + Math.imul(al8, bl5) | 0;
- mid = mid + Math.imul(al8, bh5) | 0;
- mid = mid + Math.imul(ah8, bl5) | 0;
- hi = hi + Math.imul(ah8, bh5) | 0;
- lo = lo + Math.imul(al7, bl6) | 0;
- mid = mid + Math.imul(al7, bh6) | 0;
- mid = mid + Math.imul(ah7, bl6) | 0;
- hi = hi + Math.imul(ah7, bh6) | 0;
- lo = lo + Math.imul(al6, bl7) | 0;
- mid = mid + Math.imul(al6, bh7) | 0;
- mid = mid + Math.imul(ah6, bl7) | 0;
- hi = hi + Math.imul(ah6, bh7) | 0;
- lo = lo + Math.imul(al5, bl8) | 0;
- mid = mid + Math.imul(al5, bh8) | 0;
- mid = mid + Math.imul(ah5, bl8) | 0;
- hi = hi + Math.imul(ah5, bh8) | 0;
- lo = lo + Math.imul(al4, bl9) | 0;
- mid = mid + Math.imul(al4, bh9) | 0;
- mid = mid + Math.imul(ah4, bl9) | 0;
- hi = hi + Math.imul(ah4, bh9) | 0;
- var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0;
- w13 &= 67108863;
- lo = Math.imul(al9, bl5);
- mid = Math.imul(al9, bh5);
- mid = mid + Math.imul(ah9, bl5) | 0;
- hi = Math.imul(ah9, bh5);
- lo = lo + Math.imul(al8, bl6) | 0;
- mid = mid + Math.imul(al8, bh6) | 0;
- mid = mid + Math.imul(ah8, bl6) | 0;
- hi = hi + Math.imul(ah8, bh6) | 0;
- lo = lo + Math.imul(al7, bl7) | 0;
- mid = mid + Math.imul(al7, bh7) | 0;
- mid = mid + Math.imul(ah7, bl7) | 0;
- hi = hi + Math.imul(ah7, bh7) | 0;
- lo = lo + Math.imul(al6, bl8) | 0;
- mid = mid + Math.imul(al6, bh8) | 0;
- mid = mid + Math.imul(ah6, bl8) | 0;
- hi = hi + Math.imul(ah6, bh8) | 0;
- lo = lo + Math.imul(al5, bl9) | 0;
- mid = mid + Math.imul(al5, bh9) | 0;
- mid = mid + Math.imul(ah5, bl9) | 0;
- hi = hi + Math.imul(ah5, bh9) | 0;
- var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0;
- w14 &= 67108863;
- lo = Math.imul(al9, bl6);
- mid = Math.imul(al9, bh6);
- mid = mid + Math.imul(ah9, bl6) | 0;
- hi = Math.imul(ah9, bh6);
- lo = lo + Math.imul(al8, bl7) | 0;
- mid = mid + Math.imul(al8, bh7) | 0;
- mid = mid + Math.imul(ah8, bl7) | 0;
- hi = hi + Math.imul(ah8, bh7) | 0;
- lo = lo + Math.imul(al7, bl8) | 0;
- mid = mid + Math.imul(al7, bh8) | 0;
- mid = mid + Math.imul(ah7, bl8) | 0;
- hi = hi + Math.imul(ah7, bh8) | 0;
- lo = lo + Math.imul(al6, bl9) | 0;
- mid = mid + Math.imul(al6, bh9) | 0;
- mid = mid + Math.imul(ah6, bl9) | 0;
- hi = hi + Math.imul(ah6, bh9) | 0;
- var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0;
- w15 &= 67108863;
- lo = Math.imul(al9, bl7);
- mid = Math.imul(al9, bh7);
- mid = mid + Math.imul(ah9, bl7) | 0;
- hi = Math.imul(ah9, bh7);
- lo = lo + Math.imul(al8, bl8) | 0;
- mid = mid + Math.imul(al8, bh8) | 0;
- mid = mid + Math.imul(ah8, bl8) | 0;
- hi = hi + Math.imul(ah8, bh8) | 0;
- lo = lo + Math.imul(al7, bl9) | 0;
- mid = mid + Math.imul(al7, bh9) | 0;
- mid = mid + Math.imul(ah7, bl9) | 0;
- hi = hi + Math.imul(ah7, bh9) | 0;
- var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0;
- w16 &= 67108863;
- lo = Math.imul(al9, bl8);
- mid = Math.imul(al9, bh8);
- mid = mid + Math.imul(ah9, bl8) | 0;
- hi = Math.imul(ah9, bh8);
- lo = lo + Math.imul(al8, bl9) | 0;
- mid = mid + Math.imul(al8, bh9) | 0;
- mid = mid + Math.imul(ah8, bl9) | 0;
- hi = hi + Math.imul(ah8, bh9) | 0;
- var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0;
- w17 &= 67108863;
- lo = Math.imul(al9, bl9);
- mid = Math.imul(al9, bh9);
- mid = mid + Math.imul(ah9, bl9) | 0;
- hi = Math.imul(ah9, bh9);
- var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0;
- w18 &= 67108863;
- o[0] = w0;
- o[1] = w1;
- o[2] = w2;
- o[3] = w3;
- o[4] = w4;
- o[5] = w5;
- o[6] = w6;
- o[7] = w7;
- o[8] = w8;
- o[9] = w9;
- o[10] = w10;
- o[11] = w11;
- o[12] = w12;
- o[13] = w13;
- o[14] = w14;
- o[15] = w15;
- o[16] = w16;
- o[17] = w17;
- o[18] = w18;
- if (c !== 0) {
- o[19] = c;
- out.length++;
- }
- return out;
- };
- if (!Math.imul) {
- comb10MulTo = smallMulTo;
- }
- function bigMulTo(self2, num, out) {
- out.negative = num.negative ^ self2.negative;
- out.length = self2.length + num.length;
- var carry = 0;
- var hncarry = 0;
- for (var k = 0;k < out.length - 1; k++) {
- var ncarry = hncarry;
- hncarry = 0;
- var rword = carry & 67108863;
- var maxJ = Math.min(k, num.length - 1);
- for (var j = Math.max(0, k - self2.length + 1);j <= maxJ; j++) {
- var i = k - j;
- var a = self2.words[i] | 0;
- var b = num.words[j] | 0;
- var r = a * b;
- var lo = r & 67108863;
- ncarry = ncarry + (r / 67108864 | 0) | 0;
- lo = lo + rword | 0;
- rword = lo & 67108863;
- ncarry = ncarry + (lo >>> 26) | 0;
- hncarry += ncarry >>> 26;
- ncarry &= 67108863;
- }
- out.words[k] = rword;
- carry = ncarry;
- ncarry = hncarry;
- }
- if (carry !== 0) {
- out.words[k] = carry;
- } else {
- out.length--;
- }
- return out.strip();
- }
- function jumboMulTo(self2, num, out) {
- var fftm = new FFTM;
- return fftm.mulp(self2, num, out);
- }
- BN.prototype.mulTo = function mulTo(num, out) {
- var res;
- var len = this.length + num.length;
- if (this.length === 10 && num.length === 10) {
- res = comb10MulTo(this, num, out);
- } else if (len < 63) {
- res = smallMulTo(this, num, out);
- } else if (len < 1024) {
- res = bigMulTo(this, num, out);
- } else {
- res = jumboMulTo(this, num, out);
- }
- return res;
- };
- function FFTM(x, y) {
- this.x = x;
- this.y = y;
- }
- FFTM.prototype.makeRBT = function makeRBT(N) {
- var t = new Array(N);
- var l = BN.prototype._countBits(N) - 1;
- for (var i = 0;i < N; i++) {
- t[i] = this.revBin(i, l, N);
- }
- return t;
- };
- FFTM.prototype.revBin = function revBin(x, l, N) {
- if (x === 0 || x === N - 1)
- return x;
- var rb = 0;
- for (var i = 0;i < l; i++) {
- rb |= (x & 1) << l - i - 1;
- x >>= 1;
- }
- return rb;
- };
- FFTM.prototype.permute = function permute(rbt, rws, iws, rtws, itws, N) {
- for (var i = 0;i < N; i++) {
- rtws[i] = rws[rbt[i]];
- itws[i] = iws[rbt[i]];
- }
- };
- FFTM.prototype.transform = function transform(rws, iws, rtws, itws, N, rbt) {
- this.permute(rbt, rws, iws, rtws, itws, N);
- for (var s = 1;s < N; s <<= 1) {
- var l = s << 1;
- var rtwdf = Math.cos(2 * Math.PI / l);
- var itwdf = Math.sin(2 * Math.PI / l);
- for (var p = 0;p < N; p += l) {
- var rtwdf_ = rtwdf;
- var itwdf_ = itwdf;
- for (var j = 0;j < s; j++) {
- var re = rtws[p + j];
- var ie = itws[p + j];
- var ro = rtws[p + j + s];
- var io = itws[p + j + s];
- var rx = rtwdf_ * ro - itwdf_ * io;
- io = rtwdf_ * io + itwdf_ * ro;
- ro = rx;
- rtws[p + j] = re + ro;
- itws[p + j] = ie + io;
- rtws[p + j + s] = re - ro;
- itws[p + j + s] = ie - io;
- if (j !== l) {
- rx = rtwdf * rtwdf_ - itwdf * itwdf_;
- itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;
- rtwdf_ = rx;
- }
- }
- }
- }
- };
- FFTM.prototype.guessLen13b = function guessLen13b(n, m) {
- var N = Math.max(m, n) | 1;
- var odd = N & 1;
- var i = 0;
- for (N = N / 2 | 0;N; N = N >>> 1) {
- i++;
- }
- return 1 << i + 1 + odd;
- };
- FFTM.prototype.conjugate = function conjugate(rws, iws, N) {
- if (N <= 1)
- return;
- for (var i = 0;i < N / 2; i++) {
- var t = rws[i];
- rws[i] = rws[N - i - 1];
- rws[N - i - 1] = t;
- t = iws[i];
- iws[i] = -iws[N - i - 1];
- iws[N - i - 1] = -t;
- }
- };
- FFTM.prototype.normalize13b = function normalize13b(ws, N) {
- var carry = 0;
- for (var i = 0;i < N / 2; i++) {
- var w = Math.round(ws[2 * i + 1] / N) * 8192 + Math.round(ws[2 * i] / N) + carry;
- ws[i] = w & 67108863;
- if (w < 67108864) {
- carry = 0;
- } else {
- carry = w / 67108864 | 0;
- }
- }
- return ws;
- };
- FFTM.prototype.convert13b = function convert13b(ws, len, rws, N) {
- var carry = 0;
- for (var i = 0;i < len; i++) {
- carry = carry + (ws[i] | 0);
- rws[2 * i] = carry & 8191;
- carry = carry >>> 13;
- rws[2 * i + 1] = carry & 8191;
- carry = carry >>> 13;
- }
- for (i = 2 * len;i < N; ++i) {
- rws[i] = 0;
- }
- assert(carry === 0);
- assert((carry & ~8191) === 0);
- };
- FFTM.prototype.stub = function stub(N) {
- var ph = new Array(N);
- for (var i = 0;i < N; i++) {
- ph[i] = 0;
- }
- return ph;
- };
- FFTM.prototype.mulp = function mulp(x, y, out) {
- var N = 2 * this.guessLen13b(x.length, y.length);
- var rbt = this.makeRBT(N);
- var _ = this.stub(N);
- var rws = new Array(N);
- var rwst = new Array(N);
- var iwst = new Array(N);
- var nrws = new Array(N);
- var nrwst = new Array(N);
- var niwst = new Array(N);
- var rmws = out.words;
- rmws.length = N;
- this.convert13b(x.words, x.length, rws, N);
- this.convert13b(y.words, y.length, nrws, N);
- this.transform(rws, _, rwst, iwst, N, rbt);
- this.transform(nrws, _, nrwst, niwst, N, rbt);
- for (var i = 0;i < N; i++) {
- var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];
- iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];
- rwst[i] = rx;
- }
- this.conjugate(rwst, iwst, N);
- this.transform(rwst, iwst, rmws, _, N, rbt);
- this.conjugate(rmws, _, N);
- this.normalize13b(rmws, N);
- out.negative = x.negative ^ y.negative;
- out.length = x.length + y.length;
- return out.strip();
- };
- BN.prototype.mul = function mul(num) {
- var out = new BN(null);
- out.words = new Array(this.length + num.length);
- return this.mulTo(num, out);
- };
- BN.prototype.mulf = function mulf(num) {
- var out = new BN(null);
- out.words = new Array(this.length + num.length);
- return jumboMulTo(this, num, out);
- };
- BN.prototype.imul = function imul(num) {
- return this.clone().mulTo(num, this);
- };
- BN.prototype.imuln = function imuln(num) {
- assert(typeof num === "number");
- assert(num < 67108864);
- var carry = 0;
- for (var i = 0;i < this.length; i++) {
- var w = (this.words[i] | 0) * num;
- var lo = (w & 67108863) + (carry & 67108863);
- carry >>= 26;
- carry += w / 67108864 | 0;
- carry += lo >>> 26;
- this.words[i] = lo & 67108863;
- }
- if (carry !== 0) {
- this.words[i] = carry;
- this.length++;
- }
- this.length = num === 0 ? 1 : this.length;
- return this;
- };
- BN.prototype.muln = function muln(num) {
- return this.clone().imuln(num);
- };
- BN.prototype.sqr = function sqr() {
- return this.mul(this);
- };
- BN.prototype.isqr = function isqr() {
- return this.imul(this.clone());
- };
- BN.prototype.pow = function pow(num) {
- var w = toBitArray(num);
- if (w.length === 0)
- return new BN(1);
- var res = this;
- for (var i = 0;i < w.length; i++, res = res.sqr()) {
- if (w[i] !== 0)
- break;
- }
- if (++i < w.length) {
- for (var q = res.sqr();i < w.length; i++, q = q.sqr()) {
- if (w[i] === 0)
- continue;
- res = res.mul(q);
- }
- }
- return res;
- };
- BN.prototype.iushln = function iushln(bits) {
- assert(typeof bits === "number" && bits >= 0);
- var r = bits % 26;
- var s = (bits - r) / 26;
- var carryMask = 67108863 >>> 26 - r << 26 - r;
- var i;
- if (r !== 0) {
- var carry = 0;
- for (i = 0;i < this.length; i++) {
- var newCarry = this.words[i] & carryMask;
- var c = (this.words[i] | 0) - newCarry << r;
- this.words[i] = c | carry;
- carry = newCarry >>> 26 - r;
- }
- if (carry) {
- this.words[i] = carry;
- this.length++;
- }
- }
- if (s !== 0) {
- for (i = this.length - 1;i >= 0; i--) {
- this.words[i + s] = this.words[i];
- }
- for (i = 0;i < s; i++) {
- this.words[i] = 0;
- }
- this.length += s;
- }
- return this.strip();
- };
- BN.prototype.ishln = function ishln(bits) {
- assert(this.negative === 0);
- return this.iushln(bits);
- };
- BN.prototype.iushrn = function iushrn(bits, hint, extended) {
- assert(typeof bits === "number" && bits >= 0);
- var h;
- if (hint) {
- h = (hint - hint % 26) / 26;
- } else {
- h = 0;
- }
- var r = bits % 26;
- var s = Math.min((bits - r) / 26, this.length);
- var mask = 67108863 ^ 67108863 >>> r << r;
- var maskedWords = extended;
- h -= s;
- h = Math.max(0, h);
- if (maskedWords) {
- for (var i = 0;i < s; i++) {
- maskedWords.words[i] = this.words[i];
- }
- maskedWords.length = s;
- }
- if (s === 0) {} else if (this.length > s) {
- this.length -= s;
- for (i = 0;i < this.length; i++) {
- this.words[i] = this.words[i + s];
- }
- } else {
- this.words[0] = 0;
- this.length = 1;
- }
- var carry = 0;
- for (i = this.length - 1;i >= 0 && (carry !== 0 || i >= h); i--) {
- var word = this.words[i] | 0;
- this.words[i] = carry << 26 - r | word >>> r;
- carry = word & mask;
- }
- if (maskedWords && carry !== 0) {
- maskedWords.words[maskedWords.length++] = carry;
- }
- if (this.length === 0) {
- this.words[0] = 0;
- this.length = 1;
- }
- return this.strip();
- };
- BN.prototype.ishrn = function ishrn(bits, hint, extended) {
- assert(this.negative === 0);
- return this.iushrn(bits, hint, extended);
- };
- BN.prototype.shln = function shln(bits) {
- return this.clone().ishln(bits);
- };
- BN.prototype.ushln = function ushln(bits) {
- return this.clone().iushln(bits);
- };
- BN.prototype.shrn = function shrn(bits) {
- return this.clone().ishrn(bits);
- };
- BN.prototype.ushrn = function ushrn(bits) {
- return this.clone().iushrn(bits);
- };
- BN.prototype.testn = function testn(bit) {
- assert(typeof bit === "number" && bit >= 0);
- var r = bit % 26;
- var s = (bit - r) / 26;
- var q = 1 << r;
- if (this.length <= s)
- return false;
- var w = this.words[s];
- return !!(w & q);
- };
- BN.prototype.imaskn = function imaskn(bits) {
- assert(typeof bits === "number" && bits >= 0);
- var r = bits % 26;
- var s = (bits - r) / 26;
- assert(this.negative === 0, "imaskn works only with positive numbers");
- if (this.length <= s) {
- return this;
- }
- if (r !== 0) {
- s++;
- }
- this.length = Math.min(s, this.length);
- if (r !== 0) {
- var mask = 67108863 ^ 67108863 >>> r << r;
- this.words[this.length - 1] &= mask;
- }
- return this.strip();
- };
- BN.prototype.maskn = function maskn(bits) {
- return this.clone().imaskn(bits);
- };
- BN.prototype.iaddn = function iaddn(num) {
- assert(typeof num === "number");
- assert(num < 67108864);
- if (num < 0)
- return this.isubn(-num);
- if (this.negative !== 0) {
- if (this.length === 1 && (this.words[0] | 0) < num) {
- this.words[0] = num - (this.words[0] | 0);
- this.negative = 0;
- return this;
- }
- this.negative = 0;
- this.isubn(num);
- this.negative = 1;
- return this;
- }
- return this._iaddn(num);
- };
- BN.prototype._iaddn = function _iaddn(num) {
- this.words[0] += num;
- for (var i = 0;i < this.length && this.words[i] >= 67108864; i++) {
- this.words[i] -= 67108864;
- if (i === this.length - 1) {
- this.words[i + 1] = 1;
- } else {
- this.words[i + 1]++;
- }
- }
- this.length = Math.max(this.length, i + 1);
- return this;
- };
- BN.prototype.isubn = function isubn(num) {
- assert(typeof num === "number");
- assert(num < 67108864);
- if (num < 0)
- return this.iaddn(-num);
- if (this.negative !== 0) {
- this.negative = 0;
- this.iaddn(num);
- this.negative = 1;
- return this;
- }
- this.words[0] -= num;
- if (this.length === 1 && this.words[0] < 0) {
- this.words[0] = -this.words[0];
- this.negative = 1;
- } else {
- for (var i = 0;i < this.length && this.words[i] < 0; i++) {
- this.words[i] += 67108864;
- this.words[i + 1] -= 1;
- }
- }
- return this.strip();
- };
- BN.prototype.addn = function addn(num) {
- return this.clone().iaddn(num);
- };
- BN.prototype.subn = function subn(num) {
- return this.clone().isubn(num);
- };
- BN.prototype.iabs = function iabs() {
- this.negative = 0;
- return this;
- };
- BN.prototype.abs = function abs() {
- return this.clone().iabs();
- };
- BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) {
- var len = num.length + shift;
- var i;
- this._expand(len);
- var w;
- var carry = 0;
- for (i = 0;i < num.length; i++) {
- w = (this.words[i + shift] | 0) + carry;
- var right = (num.words[i] | 0) * mul;
- w -= right & 67108863;
- carry = (w >> 26) - (right / 67108864 | 0);
- this.words[i + shift] = w & 67108863;
- }
- for (;i < this.length - shift; i++) {
- w = (this.words[i + shift] | 0) + carry;
- carry = w >> 26;
- this.words[i + shift] = w & 67108863;
- }
- if (carry === 0)
- return this.strip();
- assert(carry === -1);
- carry = 0;
- for (i = 0;i < this.length; i++) {
- w = -(this.words[i] | 0) + carry;
- carry = w >> 26;
- this.words[i] = w & 67108863;
- }
- this.negative = 1;
- return this.strip();
- };
- BN.prototype._wordDiv = function _wordDiv(num, mode) {
- var shift = this.length - num.length;
- var a = this.clone();
- var b = num;
- var bhi = b.words[b.length - 1] | 0;
- var bhiBits = this._countBits(bhi);
- shift = 26 - bhiBits;
- if (shift !== 0) {
- b = b.ushln(shift);
- a.iushln(shift);
- bhi = b.words[b.length - 1] | 0;
- }
- var m = a.length - b.length;
- var q;
- if (mode !== "mod") {
- q = new BN(null);
- q.length = m + 1;
- q.words = new Array(q.length);
- for (var i = 0;i < q.length; i++) {
- q.words[i] = 0;
- }
- }
- var diff = a.clone()._ishlnsubmul(b, 1, m);
- if (diff.negative === 0) {
- a = diff;
- if (q) {
- q.words[m] = 1;
- }
- }
- for (var j = m - 1;j >= 0; j--) {
- var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0);
- qj = Math.min(qj / bhi | 0, 67108863);
- a._ishlnsubmul(b, qj, j);
- while (a.negative !== 0) {
- qj--;
- a.negative = 0;
- a._ishlnsubmul(b, 1, j);
- if (!a.isZero()) {
- a.negative ^= 1;
- }
- }
- if (q) {
- q.words[j] = qj;
- }
- }
- if (q) {
- q.strip();
- }
- a.strip();
- if (mode !== "div" && shift !== 0) {
- a.iushrn(shift);
- }
- return {
- div: q || null,
- mod: a
- };
- };
- BN.prototype.divmod = function divmod(num, mode, positive) {
- assert(!num.isZero());
- if (this.isZero()) {
- return {
- div: new BN(0),
- mod: new BN(0)
- };
- }
- var div, mod, res;
- if (this.negative !== 0 && num.negative === 0) {
- res = this.neg().divmod(num, mode);
- if (mode !== "mod") {
- div = res.div.neg();
- }
- if (mode !== "div") {
- mod = res.mod.neg();
- if (positive && mod.negative !== 0) {
- mod.iadd(num);
- }
- }
- return {
- div,
- mod
- };
- }
- if (this.negative === 0 && num.negative !== 0) {
- res = this.divmod(num.neg(), mode);
- if (mode !== "mod") {
- div = res.div.neg();
- }
- return {
- div,
- mod: res.mod
- };
- }
- if ((this.negative & num.negative) !== 0) {
- res = this.neg().divmod(num.neg(), mode);
- if (mode !== "div") {
- mod = res.mod.neg();
- if (positive && mod.negative !== 0) {
- mod.isub(num);
- }
- }
- return {
- div: res.div,
- mod
- };
- }
- if (num.length > this.length || this.cmp(num) < 0) {
- return {
- div: new BN(0),
- mod: this
- };
- }
- if (num.length === 1) {
- if (mode === "div") {
- return {
- div: this.divn(num.words[0]),
- mod: null
- };
- }
- if (mode === "mod") {
- return {
- div: null,
- mod: new BN(this.modn(num.words[0]))
- };
- }
- return {
- div: this.divn(num.words[0]),
- mod: new BN(this.modn(num.words[0]))
- };
- }
- return this._wordDiv(num, mode);
- };
- BN.prototype.div = function div(num) {
- return this.divmod(num, "div", false).div;
- };
- BN.prototype.mod = function mod(num) {
- return this.divmod(num, "mod", false).mod;
- };
- BN.prototype.umod = function umod(num) {
- return this.divmod(num, "mod", true).mod;
- };
- BN.prototype.divRound = function divRound(num) {
- var dm = this.divmod(num);
- if (dm.mod.isZero())
- return dm.div;
- var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;
- var half = num.ushrn(1);
- var r2 = num.andln(1);
- var cmp = mod.cmp(half);
- if (cmp < 0 || r2 === 1 && cmp === 0)
- return dm.div;
- return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
- };
- BN.prototype.modn = function modn(num) {
- assert(num <= 67108863);
- var p = (1 << 26) % num;
- var acc = 0;
- for (var i = this.length - 1;i >= 0; i--) {
- acc = (p * acc + (this.words[i] | 0)) % num;
- }
- return acc;
- };
- BN.prototype.idivn = function idivn(num) {
- assert(num <= 67108863);
- var carry = 0;
- for (var i = this.length - 1;i >= 0; i--) {
- var w = (this.words[i] | 0) + carry * 67108864;
- this.words[i] = w / num | 0;
- carry = w % num;
- }
- return this.strip();
- };
- BN.prototype.divn = function divn(num) {
- return this.clone().idivn(num);
- };
- BN.prototype.egcd = function egcd(p) {
- assert(p.negative === 0);
- assert(!p.isZero());
- var x = this;
- var y = p.clone();
- if (x.negative !== 0) {
- x = x.umod(p);
- } else {
- x = x.clone();
- }
- var A = new BN(1);
- var B = new BN(0);
- var C = new BN(0);
- var D = new BN(1);
- var g = 0;
- while (x.isEven() && y.isEven()) {
- x.iushrn(1);
- y.iushrn(1);
- ++g;
- }
- var yp = y.clone();
- var xp = x.clone();
- while (!x.isZero()) {
- for (var i = 0, im = 1;(x.words[0] & im) === 0 && i < 26; ++i, im <<= 1)
- ;
- if (i > 0) {
- x.iushrn(i);
- while (i-- > 0) {
- if (A.isOdd() || B.isOdd()) {
- A.iadd(yp);
- B.isub(xp);
- }
- A.iushrn(1);
- B.iushrn(1);
- }
- }
- for (var j = 0, jm = 1;(y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1)
- ;
- if (j > 0) {
- y.iushrn(j);
- while (j-- > 0) {
- if (C.isOdd() || D.isOdd()) {
- C.iadd(yp);
- D.isub(xp);
- }
- C.iushrn(1);
- D.iushrn(1);
- }
- }
- if (x.cmp(y) >= 0) {
- x.isub(y);
- A.isub(C);
- B.isub(D);
- } else {
- y.isub(x);
- C.isub(A);
- D.isub(B);
- }
- }
- return {
- a: C,
- b: D,
- gcd: y.iushln(g)
- };
- };
- BN.prototype._invmp = function _invmp(p) {
- assert(p.negative === 0);
- assert(!p.isZero());
- var a = this;
- var b = p.clone();
- if (a.negative !== 0) {
- a = a.umod(p);
- } else {
- a = a.clone();
- }
- var x1 = new BN(1);
- var x2 = new BN(0);
- var delta = b.clone();
- while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
- for (var i = 0, im = 1;(a.words[0] & im) === 0 && i < 26; ++i, im <<= 1)
- ;
- if (i > 0) {
- a.iushrn(i);
- while (i-- > 0) {
- if (x1.isOdd()) {
- x1.iadd(delta);
- }
- x1.iushrn(1);
- }
- }
- for (var j = 0, jm = 1;(b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1)
- ;
- if (j > 0) {
- b.iushrn(j);
- while (j-- > 0) {
- if (x2.isOdd()) {
- x2.iadd(delta);
- }
- x2.iushrn(1);
- }
- }
- if (a.cmp(b) >= 0) {
- a.isub(b);
- x1.isub(x2);
- } else {
- b.isub(a);
- x2.isub(x1);
- }
- }
- var res;
- if (a.cmpn(1) === 0) {
- res = x1;
- } else {
- res = x2;
- }
- if (res.cmpn(0) < 0) {
- res.iadd(p);
- }
- return res;
- };
- BN.prototype.gcd = function gcd(num) {
- if (this.isZero())
- return num.abs();
- if (num.isZero())
- return this.abs();
- var a = this.clone();
- var b = num.clone();
- a.negative = 0;
- b.negative = 0;
- for (var shift = 0;a.isEven() && b.isEven(); shift++) {
- a.iushrn(1);
- b.iushrn(1);
- }
- do {
- while (a.isEven()) {
- a.iushrn(1);
- }
- while (b.isEven()) {
- b.iushrn(1);
- }
- var r = a.cmp(b);
- if (r < 0) {
- var t = a;
- a = b;
- b = t;
- } else if (r === 0 || b.cmpn(1) === 0) {
- break;
- }
- a.isub(b);
- } while (true);
- return b.iushln(shift);
- };
- BN.prototype.invm = function invm(num) {
- return this.egcd(num).a.umod(num);
- };
- BN.prototype.isEven = function isEven() {
- return (this.words[0] & 1) === 0;
- };
- BN.prototype.isOdd = function isOdd() {
- return (this.words[0] & 1) === 1;
- };
- BN.prototype.andln = function andln(num) {
- return this.words[0] & num;
- };
- BN.prototype.bincn = function bincn(bit) {
- assert(typeof bit === "number");
- var r = bit % 26;
- var s = (bit - r) / 26;
- var q = 1 << r;
- if (this.length <= s) {
- this._expand(s + 1);
- this.words[s] |= q;
- return this;
- }
- var carry = q;
- for (var i = s;carry !== 0 && i < this.length; i++) {
- var w = this.words[i] | 0;
- w += carry;
- carry = w >>> 26;
- w &= 67108863;
- this.words[i] = w;
- }
- if (carry !== 0) {
- this.words[i] = carry;
- this.length++;
- }
- return this;
- };
- BN.prototype.isZero = function isZero() {
- return this.length === 1 && this.words[0] === 0;
- };
- BN.prototype.cmpn = function cmpn(num) {
- var negative = num < 0;
- if (this.negative !== 0 && !negative)
- return -1;
- if (this.negative === 0 && negative)
- return 1;
- this.strip();
- var res;
- if (this.length > 1) {
- res = 1;
- } else {
- if (negative) {
- num = -num;
- }
- assert(num <= 67108863, "Number is too big");
- var w = this.words[0] | 0;
- res = w === num ? 0 : w < num ? -1 : 1;
- }
- if (this.negative !== 0)
- return -res | 0;
- return res;
- };
- BN.prototype.cmp = function cmp(num) {
- if (this.negative !== 0 && num.negative === 0)
- return -1;
- if (this.negative === 0 && num.negative !== 0)
- return 1;
- var res = this.ucmp(num);
- if (this.negative !== 0)
- return -res | 0;
- return res;
- };
- BN.prototype.ucmp = function ucmp(num) {
- if (this.length > num.length)
- return 1;
- if (this.length < num.length)
- return -1;
- var res = 0;
- for (var i = this.length - 1;i >= 0; i--) {
- var a = this.words[i] | 0;
- var b = num.words[i] | 0;
- if (a === b)
- continue;
- if (a < b) {
- res = -1;
- } else if (a > b) {
- res = 1;
- }
- break;
- }
- return res;
- };
- BN.prototype.gtn = function gtn(num) {
- return this.cmpn(num) === 1;
- };
- BN.prototype.gt = function gt(num) {
- return this.cmp(num) === 1;
- };
- BN.prototype.gten = function gten(num) {
- return this.cmpn(num) >= 0;
- };
- BN.prototype.gte = function gte(num) {
- return this.cmp(num) >= 0;
- };
- BN.prototype.ltn = function ltn(num) {
- return this.cmpn(num) === -1;
- };
- BN.prototype.lt = function lt(num) {
- return this.cmp(num) === -1;
- };
- BN.prototype.lten = function lten(num) {
- return this.cmpn(num) <= 0;
- };
- BN.prototype.lte = function lte(num) {
- return this.cmp(num) <= 0;
- };
- BN.prototype.eqn = function eqn(num) {
- return this.cmpn(num) === 0;
- };
- BN.prototype.eq = function eq(num) {
- return this.cmp(num) === 0;
- };
- BN.red = function red(num) {
- return new Red(num);
- };
- BN.prototype.toRed = function toRed(ctx) {
- assert(!this.red, "Already a number in reduction context");
- assert(this.negative === 0, "red works only with positives");
- return ctx.convertTo(this)._forceRed(ctx);
- };
- BN.prototype.fromRed = function fromRed() {
- assert(this.red, "fromRed works only with numbers in reduction context");
- return this.red.convertFrom(this);
- };
- BN.prototype._forceRed = function _forceRed(ctx) {
- this.red = ctx;
- return this;
- };
- BN.prototype.forceRed = function forceRed(ctx) {
- assert(!this.red, "Already a number in reduction context");
- return this._forceRed(ctx);
- };
- BN.prototype.redAdd = function redAdd(num) {
- assert(this.red, "redAdd works only with red numbers");
- return this.red.add(this, num);
- };
- BN.prototype.redIAdd = function redIAdd(num) {
- assert(this.red, "redIAdd works only with red numbers");
- return this.red.iadd(this, num);
- };
- BN.prototype.redSub = function redSub(num) {
- assert(this.red, "redSub works only with red numbers");
- return this.red.sub(this, num);
- };
- BN.prototype.redISub = function redISub(num) {
- assert(this.red, "redISub works only with red numbers");
- return this.red.isub(this, num);
- };
- BN.prototype.redShl = function redShl(num) {
- assert(this.red, "redShl works only with red numbers");
- return this.red.shl(this, num);
- };
- BN.prototype.redMul = function redMul(num) {
- assert(this.red, "redMul works only with red numbers");
- this.red._verify2(this, num);
- return this.red.mul(this, num);
- };
- BN.prototype.redIMul = function redIMul(num) {
- assert(this.red, "redMul works only with red numbers");
- this.red._verify2(this, num);
- return this.red.imul(this, num);
- };
- BN.prototype.redSqr = function redSqr() {
- assert(this.red, "redSqr works only with red numbers");
- this.red._verify1(this);
- return this.red.sqr(this);
- };
- BN.prototype.redISqr = function redISqr() {
- assert(this.red, "redISqr works only with red numbers");
- this.red._verify1(this);
- return this.red.isqr(this);
- };
- BN.prototype.redSqrt = function redSqrt() {
- assert(this.red, "redSqrt works only with red numbers");
- this.red._verify1(this);
- return this.red.sqrt(this);
- };
- BN.prototype.redInvm = function redInvm() {
- assert(this.red, "redInvm works only with red numbers");
- this.red._verify1(this);
- return this.red.invm(this);
- };
- BN.prototype.redNeg = function redNeg() {
- assert(this.red, "redNeg works only with red numbers");
- this.red._verify1(this);
- return this.red.neg(this);
- };
- BN.prototype.redPow = function redPow(num) {
- assert(this.red && !num.red, "redPow(normalNum)");
- this.red._verify1(this);
- return this.red.pow(this, num);
- };
- var primes = {
- k256: null,
- p224: null,
- p192: null,
- p25519: null
- };
- function MPrime(name, p) {
- this.name = name;
- this.p = new BN(p, 16);
- this.n = this.p.bitLength();
- this.k = new BN(1).iushln(this.n).isub(this.p);
- this.tmp = this._tmp();
- }
- MPrime.prototype._tmp = function _tmp() {
- var tmp = new BN(null);
- tmp.words = new Array(Math.ceil(this.n / 13));
- return tmp;
- };
- MPrime.prototype.ireduce = function ireduce(num) {
- var r = num;
- var rlen;
- do {
- this.split(r, this.tmp);
- r = this.imulK(r);
- r = r.iadd(this.tmp);
- rlen = r.bitLength();
- } while (rlen > this.n);
- var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
- if (cmp === 0) {
- r.words[0] = 0;
- r.length = 1;
- } else if (cmp > 0) {
- r.isub(this.p);
- } else {
- if (r.strip !== undefined) {
- r.strip();
- } else {
- r._strip();
- }
- }
- return r;
- };
- MPrime.prototype.split = function split(input, out) {
- input.iushrn(this.n, 0, out);
- };
- MPrime.prototype.imulK = function imulK(num) {
- return num.imul(this.k);
- };
- function K256() {
- MPrime.call(this, "k256", "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f");
- }
- inherits(K256, MPrime);
- K256.prototype.split = function split(input, output) {
- var mask = 4194303;
- var outLen = Math.min(input.length, 9);
- for (var i = 0;i < outLen; i++) {
- output.words[i] = input.words[i];
- }
- output.length = outLen;
- if (input.length <= 9) {
- input.words[0] = 0;
- input.length = 1;
- return;
- }
- var prev = input.words[9];
- output.words[output.length++] = prev & mask;
- for (i = 10;i < input.length; i++) {
- var next = input.words[i] | 0;
- input.words[i - 10] = (next & mask) << 4 | prev >>> 22;
- prev = next;
- }
- prev >>>= 22;
- input.words[i - 10] = prev;
- if (prev === 0 && input.length > 10) {
- input.length -= 10;
- } else {
- input.length -= 9;
- }
- };
- K256.prototype.imulK = function imulK(num) {
- num.words[num.length] = 0;
- num.words[num.length + 1] = 0;
- num.length += 2;
- var lo = 0;
- for (var i = 0;i < num.length; i++) {
- var w = num.words[i] | 0;
- lo += w * 977;
- num.words[i] = lo & 67108863;
- lo = w * 64 + (lo / 67108864 | 0);
- }
- if (num.words[num.length - 1] === 0) {
- num.length--;
- if (num.words[num.length - 1] === 0) {
- num.length--;
- }
- }
- return num;
- };
- function P224() {
- MPrime.call(this, "p224", "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001");
- }
- inherits(P224, MPrime);
- function P192() {
- MPrime.call(this, "p192", "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff");
- }
- inherits(P192, MPrime);
- function P25519() {
- MPrime.call(this, "25519", "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed");
- }
- inherits(P25519, MPrime);
- P25519.prototype.imulK = function imulK(num) {
- var carry = 0;
- for (var i = 0;i < num.length; i++) {
- var hi = (num.words[i] | 0) * 19 + carry;
- var lo = hi & 67108863;
- hi >>>= 26;
- num.words[i] = lo;
- carry = hi;
- }
- if (carry !== 0) {
- num.words[num.length++] = carry;
- }
- return num;
- };
- BN._prime = function prime(name) {
- if (primes[name])
- return primes[name];
- var prime;
- if (name === "k256") {
- prime = new K256;
- } else if (name === "p224") {
- prime = new P224;
- } else if (name === "p192") {
- prime = new P192;
- } else if (name === "p25519") {
- prime = new P25519;
- } else {
- throw new Error("Unknown prime " + name);
- }
- primes[name] = prime;
- return prime;
- };
- function Red(m) {
- if (typeof m === "string") {
- var prime = BN._prime(m);
- this.m = prime.p;
- this.prime = prime;
- } else {
- assert(m.gtn(1), "modulus must be greater than 1");
- this.m = m;
- this.prime = null;
- }
- }
- Red.prototype._verify1 = function _verify1(a) {
- assert(a.negative === 0, "red works only with positives");
- assert(a.red, "red works only with red numbers");
- };
- Red.prototype._verify2 = function _verify2(a, b) {
- assert((a.negative | b.negative) === 0, "red works only with positives");
- assert(a.red && a.red === b.red, "red works only with red numbers");
- };
- Red.prototype.imod = function imod(a) {
- if (this.prime)
- return this.prime.ireduce(a)._forceRed(this);
- return a.umod(this.m)._forceRed(this);
- };
- Red.prototype.neg = function neg(a) {
- if (a.isZero()) {
- return a.clone();
- }
- return this.m.sub(a)._forceRed(this);
- };
- Red.prototype.add = function add(a, b) {
- this._verify2(a, b);
- var res = a.add(b);
- if (res.cmp(this.m) >= 0) {
- res.isub(this.m);
- }
- return res._forceRed(this);
- };
- Red.prototype.iadd = function iadd(a, b) {
- this._verify2(a, b);
- var res = a.iadd(b);
- if (res.cmp(this.m) >= 0) {
- res.isub(this.m);
- }
- return res;
- };
- Red.prototype.sub = function sub(a, b) {
- this._verify2(a, b);
- var res = a.sub(b);
- if (res.cmpn(0) < 0) {
- res.iadd(this.m);
- }
- return res._forceRed(this);
- };
- Red.prototype.isub = function isub(a, b) {
- this._verify2(a, b);
- var res = a.isub(b);
- if (res.cmpn(0) < 0) {
- res.iadd(this.m);
- }
- return res;
- };
- Red.prototype.shl = function shl(a, num) {
- this._verify1(a);
- return this.imod(a.ushln(num));
- };
- Red.prototype.imul = function imul(a, b) {
- this._verify2(a, b);
- return this.imod(a.imul(b));
- };
- Red.prototype.mul = function mul(a, b) {
- this._verify2(a, b);
- return this.imod(a.mul(b));
- };
- Red.prototype.isqr = function isqr(a) {
- return this.imul(a, a.clone());
- };
- Red.prototype.sqr = function sqr(a) {
- return this.mul(a, a);
- };
- Red.prototype.sqrt = function sqrt(a) {
- if (a.isZero())
- return a.clone();
- var mod3 = this.m.andln(3);
- assert(mod3 % 2 === 1);
- if (mod3 === 3) {
- var pow = this.m.add(new BN(1)).iushrn(2);
- return this.pow(a, pow);
- }
- var q = this.m.subn(1);
- var s = 0;
- while (!q.isZero() && q.andln(1) === 0) {
- s++;
- q.iushrn(1);
- }
- assert(!q.isZero());
- var one = new BN(1).toRed(this);
- var nOne = one.redNeg();
- var lpow = this.m.subn(1).iushrn(1);
- var z = this.m.bitLength();
- z = new BN(2 * z * z).toRed(this);
- while (this.pow(z, lpow).cmp(nOne) !== 0) {
- z.redIAdd(nOne);
- }
- var c = this.pow(z, q);
- var r = this.pow(a, q.addn(1).iushrn(1));
- var t = this.pow(a, q);
- var m = s;
- while (t.cmp(one) !== 0) {
- var tmp = t;
- for (var i = 0;tmp.cmp(one) !== 0; i++) {
- tmp = tmp.redSqr();
- }
- assert(i < m);
- var b = this.pow(c, new BN(1).iushln(m - i - 1));
- r = r.redMul(b);
- c = b.redSqr();
- t = t.redMul(c);
- m = i;
- }
- return r;
- };
- Red.prototype.invm = function invm(a) {
- var inv = a._invmp(this.m);
- if (inv.negative !== 0) {
- inv.negative = 0;
- return this.imod(inv).redNeg();
- } else {
- return this.imod(inv);
- }
- };
- Red.prototype.pow = function pow(a, num) {
- if (num.isZero())
- return new BN(1).toRed(this);
- if (num.cmpn(1) === 0)
- return a.clone();
- var windowSize = 4;
- var wnd = new Array(1 << windowSize);
- wnd[0] = new BN(1).toRed(this);
- wnd[1] = a;
- for (var i = 2;i < wnd.length; i++) {
- wnd[i] = this.mul(wnd[i - 1], a);
- }
- var res = wnd[0];
- var current = 0;
- var currentLen = 0;
- var start = num.bitLength() % 26;
- if (start === 0) {
- start = 26;
- }
- for (i = num.length - 1;i >= 0; i--) {
- var word = num.words[i];
- for (var j = start - 1;j >= 0; j--) {
- var bit = word >> j & 1;
- if (res !== wnd[0]) {
- res = this.sqr(res);
- }
- if (bit === 0 && current === 0) {
- currentLen = 0;
- continue;
- }
- current <<= 1;
- current |= bit;
- currentLen++;
- if (currentLen !== windowSize && (i !== 0 || j !== 0))
- continue;
- res = this.mul(res, wnd[current]);
- currentLen = 0;
- current = 0;
- }
- start = 26;
- }
- return res;
- };
- Red.prototype.convertTo = function convertTo(num) {
- var r = num.umod(this.m);
- return r === num ? r.clone() : r;
- };
- Red.prototype.convertFrom = function convertFrom(num) {
- var res = num.clone();
- res.red = null;
- return res;
- };
- BN.mont = function mont(num) {
- return new Mont(num);
- };
- function Mont(m) {
- Red.call(this, m);
- this.shift = this.m.bitLength();
- if (this.shift % 26 !== 0) {
- this.shift += 26 - this.shift % 26;
- }
- this.r = new BN(1).iushln(this.shift);
- this.r2 = this.imod(this.r.sqr());
- this.rinv = this.r._invmp(this.m);
- this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);
- this.minv = this.minv.umod(this.r);
- this.minv = this.r.sub(this.minv);
- }
- inherits(Mont, Red);
- Mont.prototype.convertTo = function convertTo(num) {
- return this.imod(num.ushln(this.shift));
- };
- Mont.prototype.convertFrom = function convertFrom(num) {
- var r = this.imod(num.mul(this.rinv));
- r.red = null;
- return r;
- };
- Mont.prototype.imul = function imul(a, b) {
- if (a.isZero() || b.isZero()) {
- a.words[0] = 0;
- a.length = 1;
- return a;
- }
- var t = a.imul(b);
- var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
- var u = t.isub(c).iushrn(this.shift);
- var res = u;
- if (u.cmp(this.m) >= 0) {
- res = u.isub(this.m);
- } else if (u.cmpn(0) < 0) {
- res = u.iadd(this.m);
- }
- return res._forceRed(this);
- };
- Mont.prototype.mul = function mul(a, b) {
- if (a.isZero() || b.isZero())
- return new BN(0)._forceRed(this);
- var t = a.mul(b);
- var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
- var u = t.isub(c).iushrn(this.shift);
- var res = u;
- if (u.cmp(this.m) >= 0) {
- res = u.isub(this.m);
- } else if (u.cmpn(0) < 0) {
- res = u.iadd(this.m);
- }
- return res._forceRed(this);
- };
- Mont.prototype.invm = function invm(a) {
- var res = this.imod(a._invmp(this.m).mul(this.r2));
- return res._forceRed(this);
- };
- })(typeof module === "undefined" || module, exports);
-});
-
-// ../eve/node_modules/inherits/inherits_browser.js
-var require_inherits_browser = __commonJS((exports, module) => {
- if (typeof Object.create === "function") {
- module.exports = function inherits(ctor, superCtor) {
- if (superCtor) {
- ctor.super_ = superCtor;
- ctor.prototype = Object.create(superCtor.prototype, {
- constructor: {
- value: ctor,
- enumerable: false,
- writable: true,
- configurable: true
- }
- });
- }
- };
- } else {
- module.exports = function inherits(ctor, superCtor) {
- if (superCtor) {
- ctor.super_ = superCtor;
- var TempCtor = function() {};
- TempCtor.prototype = superCtor.prototype;
- ctor.prototype = new TempCtor;
- ctor.prototype.constructor = ctor;
- }
- };
- }
-});
-
-// ../eve/node_modules/inherits/inherits.js
-var require_inherits = __commonJS((exports, module) => {
- try {
- util = __require("util");
- if (typeof util.inherits !== "function")
- throw "";
- module.exports = util.inherits;
- } catch (e) {
- module.exports = require_inherits_browser();
- }
- var util;
-});
-
-// ../eve/node_modules/safer-buffer/safer.js
-var require_safer = __commonJS((exports, module) => {
- var buffer = __require("buffer");
- var Buffer2 = buffer.Buffer;
- var safer = {};
- var key;
- for (key in buffer) {
- if (!buffer.hasOwnProperty(key))
- continue;
- if (key === "SlowBuffer" || key === "Buffer")
- continue;
- safer[key] = buffer[key];
- }
- var Safer = safer.Buffer = {};
- for (key in Buffer2) {
- if (!Buffer2.hasOwnProperty(key))
- continue;
- if (key === "allocUnsafe" || key === "allocUnsafeSlow")
- continue;
- Safer[key] = Buffer2[key];
- }
- safer.Buffer.prototype = Buffer2.prototype;
- if (!Safer.from || Safer.from === Uint8Array.from) {
- Safer.from = function(value, encodingOrOffset, length) {
- if (typeof value === "number") {
- throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value);
- }
- if (value && typeof value.length === "undefined") {
- throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value);
- }
- return Buffer2(value, encodingOrOffset, length);
- };
- }
- if (!Safer.alloc) {
- Safer.alloc = function(size, fill, encoding) {
- if (typeof size !== "number") {
- throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size);
- }
- if (size < 0 || size >= 2 * (1 << 30)) {
- throw new RangeError('The value "' + size + '" is invalid for option "size"');
- }
- var buf = Buffer2(size);
- if (!fill || fill.length === 0) {
- buf.fill(0);
- } else if (typeof encoding === "string") {
- buf.fill(fill, encoding);
- } else {
- buf.fill(fill);
- }
- return buf;
- };
- }
- if (!safer.kStringMaxLength) {
- try {
- safer.kStringMaxLength = process.binding("buffer").kStringMaxLength;
- } catch (e) {}
- }
- if (!safer.constants) {
- safer.constants = {
- MAX_LENGTH: safer.kMaxLength
- };
- if (safer.kStringMaxLength) {
- safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength;
- }
- }
- module.exports = safer;
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/reporter.js
-var require_reporter = __commonJS((exports) => {
- var inherits = require_inherits();
- function Reporter(options2) {
- this._reporterState = {
- obj: null,
- path: [],
- options: options2 || {},
- errors: []
- };
- }
- exports.Reporter = Reporter;
- Reporter.prototype.isError = function isError(obj) {
- return obj instanceof ReporterError;
- };
- Reporter.prototype.save = function save() {
- const state = this._reporterState;
- return { obj: state.obj, pathLen: state.path.length };
- };
- Reporter.prototype.restore = function restore(data) {
- const state = this._reporterState;
- state.obj = data.obj;
- state.path = state.path.slice(0, data.pathLen);
- };
- Reporter.prototype.enterKey = function enterKey(key) {
- return this._reporterState.path.push(key);
- };
- Reporter.prototype.exitKey = function exitKey(index) {
- const state = this._reporterState;
- state.path = state.path.slice(0, index - 1);
- };
- Reporter.prototype.leaveKey = function leaveKey(index, key, value) {
- const state = this._reporterState;
- this.exitKey(index);
- if (state.obj !== null)
- state.obj[key] = value;
- };
- Reporter.prototype.path = function path() {
- return this._reporterState.path.join("/");
- };
- Reporter.prototype.enterObject = function enterObject() {
- const state = this._reporterState;
- const prev = state.obj;
- state.obj = {};
- return prev;
- };
- Reporter.prototype.leaveObject = function leaveObject(prev) {
- const state = this._reporterState;
- const now = state.obj;
- state.obj = prev;
- return now;
- };
- Reporter.prototype.error = function error(msg) {
- let err;
- const state = this._reporterState;
- const inherited = msg instanceof ReporterError;
- if (inherited) {
- err = msg;
- } else {
- err = new ReporterError(state.path.map(function(elem) {
- return "[" + JSON.stringify(elem) + "]";
- }).join(""), msg.message || msg, msg.stack);
- }
- if (!state.options.partial)
- throw err;
- if (!inherited)
- state.errors.push(err);
- return err;
- };
- Reporter.prototype.wrapResult = function wrapResult(result) {
- const state = this._reporterState;
- if (!state.options.partial)
- return result;
- return {
- result: this.isError(result) ? null : result,
- errors: state.errors
- };
- };
- function ReporterError(path, msg) {
- this.path = path;
- this.rethrow(msg);
- }
- inherits(ReporterError, Error);
- ReporterError.prototype.rethrow = function rethrow(msg) {
- this.message = msg + " at: " + (this.path || "(shallow)");
- if (Error.captureStackTrace)
- Error.captureStackTrace(this, ReporterError);
- if (!this.stack) {
- try {
- throw new Error(this.message);
- } catch (e) {
- this.stack = e.stack;
- }
- }
- return this;
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/buffer.js
-var require_buffer = __commonJS((exports) => {
- var inherits = require_inherits();
- var Reporter = require_reporter().Reporter;
- var Buffer2 = require_safer().Buffer;
- function DecoderBuffer(base, options2) {
- Reporter.call(this, options2);
- if (!Buffer2.isBuffer(base)) {
- this.error("Input not Buffer");
- return;
- }
- this.base = base;
- this.offset = 0;
- this.length = base.length;
- }
- inherits(DecoderBuffer, Reporter);
- exports.DecoderBuffer = DecoderBuffer;
- DecoderBuffer.isDecoderBuffer = function isDecoderBuffer(data) {
- if (data instanceof DecoderBuffer) {
- return true;
- }
- const isCompatible = typeof data === "object" && Buffer2.isBuffer(data.base) && data.constructor.name === "DecoderBuffer" && typeof data.offset === "number" && typeof data.length === "number" && typeof data.save === "function" && typeof data.restore === "function" && typeof data.isEmpty === "function" && typeof data.readUInt8 === "function" && typeof data.skip === "function" && typeof data.raw === "function";
- return isCompatible;
- };
- DecoderBuffer.prototype.save = function save() {
- return { offset: this.offset, reporter: Reporter.prototype.save.call(this) };
- };
- DecoderBuffer.prototype.restore = function restore(save) {
- const res = new DecoderBuffer(this.base);
- res.offset = save.offset;
- res.length = this.offset;
- this.offset = save.offset;
- Reporter.prototype.restore.call(this, save.reporter);
- return res;
- };
- DecoderBuffer.prototype.isEmpty = function isEmpty() {
- return this.offset === this.length;
- };
- DecoderBuffer.prototype.readUInt8 = function readUInt8(fail) {
- if (this.offset + 1 <= this.length)
- return this.base.readUInt8(this.offset++, true);
- else
- return this.error(fail || "DecoderBuffer overrun");
- };
- DecoderBuffer.prototype.skip = function skip(bytes, fail) {
- if (!(this.offset + bytes <= this.length))
- return this.error(fail || "DecoderBuffer overrun");
- const res = new DecoderBuffer(this.base);
- res._reporterState = this._reporterState;
- res.offset = this.offset;
- res.length = this.offset + bytes;
- this.offset += bytes;
- return res;
- };
- DecoderBuffer.prototype.raw = function raw(save) {
- return this.base.slice(save ? save.offset : this.offset, this.length);
- };
- function EncoderBuffer(value, reporter) {
- if (Array.isArray(value)) {
- this.length = 0;
- this.value = value.map(function(item) {
- if (!EncoderBuffer.isEncoderBuffer(item))
- item = new EncoderBuffer(item, reporter);
- this.length += item.length;
- return item;
- }, this);
- } else if (typeof value === "number") {
- if (!(0 <= value && value <= 255))
- return reporter.error("non-byte EncoderBuffer value");
- this.value = value;
- this.length = 1;
- } else if (typeof value === "string") {
- this.value = value;
- this.length = Buffer2.byteLength(value);
- } else if (Buffer2.isBuffer(value)) {
- this.value = value;
- this.length = value.length;
- } else {
- return reporter.error("Unsupported type: " + typeof value);
- }
- }
- exports.EncoderBuffer = EncoderBuffer;
- EncoderBuffer.isEncoderBuffer = function isEncoderBuffer(data) {
- if (data instanceof EncoderBuffer) {
- return true;
- }
- const isCompatible = typeof data === "object" && data.constructor.name === "EncoderBuffer" && typeof data.length === "number" && typeof data.join === "function";
- return isCompatible;
- };
- EncoderBuffer.prototype.join = function join(out, offset) {
- if (!out)
- out = Buffer2.alloc(this.length);
- if (!offset)
- offset = 0;
- if (this.length === 0)
- return out;
- if (Array.isArray(this.value)) {
- this.value.forEach(function(item) {
- item.join(out, offset);
- offset += item.length;
- });
- } else {
- if (typeof this.value === "number")
- out[offset] = this.value;
- else if (typeof this.value === "string")
- out.write(this.value, offset);
- else if (Buffer2.isBuffer(this.value))
- this.value.copy(out, offset);
- offset += this.length;
- }
- return out;
- };
-});
-
-// ../eve/node_modules/minimalistic-assert/index.js
-var require_minimalistic_assert = __commonJS((exports, module) => {
- module.exports = assert;
- function assert(val, msg) {
- if (!val)
- throw new Error(msg || "Assertion failed");
- }
- assert.equal = function assertEqual(l, r, msg) {
- if (l != r)
- throw new Error(msg || "Assertion failed: " + l + " != " + r);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/node.js
-var require_node = __commonJS((exports, module) => {
- var Reporter = require_reporter().Reporter;
- var EncoderBuffer = require_buffer().EncoderBuffer;
- var DecoderBuffer = require_buffer().DecoderBuffer;
- var assert = require_minimalistic_assert();
- var tags = [
- "seq",
- "seqof",
- "set",
- "setof",
- "objid",
- "bool",
- "gentime",
- "utctime",
- "null_",
- "enum",
- "int",
- "objDesc",
- "bitstr",
- "bmpstr",
- "charstr",
- "genstr",
- "graphstr",
- "ia5str",
- "iso646str",
- "numstr",
- "octstr",
- "printstr",
- "t61str",
- "unistr",
- "utf8str",
- "videostr"
- ];
- var methods = [
- "key",
- "obj",
- "use",
- "optional",
- "explicit",
- "implicit",
- "def",
- "choice",
- "any",
- "contains"
- ].concat(tags);
- var overrided = [
- "_peekTag",
- "_decodeTag",
- "_use",
- "_decodeStr",
- "_decodeObjid",
- "_decodeTime",
- "_decodeNull",
- "_decodeInt",
- "_decodeBool",
- "_decodeList",
- "_encodeComposite",
- "_encodeStr",
- "_encodeObjid",
- "_encodeTime",
- "_encodeNull",
- "_encodeInt",
- "_encodeBool"
- ];
- function Node(enc, parent, name) {
- const state = {};
- this._baseState = state;
- state.name = name;
- state.enc = enc;
- state.parent = parent || null;
- state.children = null;
- state.tag = null;
- state.args = null;
- state.reverseArgs = null;
- state.choice = null;
- state.optional = false;
- state.any = false;
- state.obj = false;
- state.use = null;
- state.useDecoder = null;
- state.key = null;
- state["default"] = null;
- state.explicit = null;
- state.implicit = null;
- state.contains = null;
- if (!state.parent) {
- state.children = [];
- this._wrap();
- }
- }
- module.exports = Node;
- var stateProps = [
- "enc",
- "parent",
- "children",
- "tag",
- "args",
- "reverseArgs",
- "choice",
- "optional",
- "any",
- "obj",
- "use",
- "alteredUse",
- "key",
- "default",
- "explicit",
- "implicit",
- "contains"
- ];
- Node.prototype.clone = function clone() {
- const state = this._baseState;
- const cstate = {};
- stateProps.forEach(function(prop) {
- cstate[prop] = state[prop];
- });
- const res = new this.constructor(cstate.parent);
- res._baseState = cstate;
- return res;
- };
- Node.prototype._wrap = function wrap() {
- const state = this._baseState;
- methods.forEach(function(method) {
- this[method] = function _wrappedMethod() {
- const clone = new this.constructor(this);
- state.children.push(clone);
- return clone[method].apply(clone, arguments);
- };
- }, this);
- };
- Node.prototype._init = function init(body) {
- const state = this._baseState;
- assert(state.parent === null);
- body.call(this);
- state.children = state.children.filter(function(child) {
- return child._baseState.parent === this;
- }, this);
- assert.equal(state.children.length, 1, "Root node can have only one child");
- };
- Node.prototype._useArgs = function useArgs(args) {
- const state = this._baseState;
- const children = args.filter(function(arg) {
- return arg instanceof this.constructor;
- }, this);
- args = args.filter(function(arg) {
- return !(arg instanceof this.constructor);
- }, this);
- if (children.length !== 0) {
- assert(state.children === null);
- state.children = children;
- children.forEach(function(child) {
- child._baseState.parent = this;
- }, this);
- }
- if (args.length !== 0) {
- assert(state.args === null);
- state.args = args;
- state.reverseArgs = args.map(function(arg) {
- if (typeof arg !== "object" || arg.constructor !== Object)
- return arg;
- const res = {};
- Object.keys(arg).forEach(function(key) {
- if (key == (key | 0))
- key |= 0;
- const value = arg[key];
- res[value] = key;
- });
- return res;
- });
- }
- };
- overrided.forEach(function(method) {
- Node.prototype[method] = function _overrided() {
- const state = this._baseState;
- throw new Error(method + " not implemented for encoding: " + state.enc);
- };
- });
- tags.forEach(function(tag) {
- Node.prototype[tag] = function _tagMethod() {
- const state = this._baseState;
- const args = Array.prototype.slice.call(arguments);
- assert(state.tag === null);
- state.tag = tag;
- this._useArgs(args);
- return this;
- };
- });
- Node.prototype.use = function use(item) {
- assert(item);
- const state = this._baseState;
- assert(state.use === null);
- state.use = item;
- return this;
- };
- Node.prototype.optional = function optional() {
- const state = this._baseState;
- state.optional = true;
- return this;
- };
- Node.prototype.def = function def(val) {
- const state = this._baseState;
- assert(state["default"] === null);
- state["default"] = val;
- state.optional = true;
- return this;
- };
- Node.prototype.explicit = function explicit(num) {
- const state = this._baseState;
- assert(state.explicit === null && state.implicit === null);
- state.explicit = num;
- return this;
- };
- Node.prototype.implicit = function implicit(num) {
- const state = this._baseState;
- assert(state.explicit === null && state.implicit === null);
- state.implicit = num;
- return this;
- };
- Node.prototype.obj = function obj() {
- const state = this._baseState;
- const args = Array.prototype.slice.call(arguments);
- state.obj = true;
- if (args.length !== 0)
- this._useArgs(args);
- return this;
- };
- Node.prototype.key = function key(newKey) {
- const state = this._baseState;
- assert(state.key === null);
- state.key = newKey;
- return this;
- };
- Node.prototype.any = function any() {
- const state = this._baseState;
- state.any = true;
- return this;
- };
- Node.prototype.choice = function choice(obj) {
- const state = this._baseState;
- assert(state.choice === null);
- state.choice = obj;
- this._useArgs(Object.keys(obj).map(function(key) {
- return obj[key];
- }));
- return this;
- };
- Node.prototype.contains = function contains(item) {
- const state = this._baseState;
- assert(state.use === null);
- state.contains = item;
- return this;
- };
- Node.prototype._decode = function decode(input, options2) {
- const state = this._baseState;
- if (state.parent === null)
- return input.wrapResult(state.children[0]._decode(input, options2));
- let result = state["default"];
- let present = true;
- let prevKey = null;
- if (state.key !== null)
- prevKey = input.enterKey(state.key);
- if (state.optional) {
- let tag = null;
- if (state.explicit !== null)
- tag = state.explicit;
- else if (state.implicit !== null)
- tag = state.implicit;
- else if (state.tag !== null)
- tag = state.tag;
- if (tag === null && !state.any) {
- const save = input.save();
- try {
- if (state.choice === null)
- this._decodeGeneric(state.tag, input, options2);
- else
- this._decodeChoice(input, options2);
- present = true;
- } catch (e) {
- present = false;
- }
- input.restore(save);
- } else {
- present = this._peekTag(input, tag, state.any);
- if (input.isError(present))
- return present;
- }
- }
- let prevObj;
- if (state.obj && present)
- prevObj = input.enterObject();
- if (present) {
- if (state.explicit !== null) {
- const explicit = this._decodeTag(input, state.explicit);
- if (input.isError(explicit))
- return explicit;
- input = explicit;
- }
- const start = input.offset;
- if (state.use === null && state.choice === null) {
- let save;
- if (state.any)
- save = input.save();
- const body = this._decodeTag(input, state.implicit !== null ? state.implicit : state.tag, state.any);
- if (input.isError(body))
- return body;
- if (state.any)
- result = input.raw(save);
- else
- input = body;
- }
- if (options2 && options2.track && state.tag !== null)
- options2.track(input.path(), start, input.length, "tagged");
- if (options2 && options2.track && state.tag !== null)
- options2.track(input.path(), input.offset, input.length, "content");
- if (state.any) {} else if (state.choice === null) {
- result = this._decodeGeneric(state.tag, input, options2);
- } else {
- result = this._decodeChoice(input, options2);
- }
- if (input.isError(result))
- return result;
- if (!state.any && state.choice === null && state.children !== null) {
- state.children.forEach(function decodeChildren(child) {
- child._decode(input, options2);
- });
- }
- if (state.contains && (state.tag === "octstr" || state.tag === "bitstr")) {
- const data = new DecoderBuffer(result);
- result = this._getUse(state.contains, input._reporterState.obj)._decode(data, options2);
- }
- }
- if (state.obj && present)
- result = input.leaveObject(prevObj);
- if (state.key !== null && (result !== null || present === true))
- input.leaveKey(prevKey, state.key, result);
- else if (prevKey !== null)
- input.exitKey(prevKey);
- return result;
- };
- Node.prototype._decodeGeneric = function decodeGeneric(tag, input, options2) {
- const state = this._baseState;
- if (tag === "seq" || tag === "set")
- return null;
- if (tag === "seqof" || tag === "setof")
- return this._decodeList(input, tag, state.args[0], options2);
- else if (/str$/.test(tag))
- return this._decodeStr(input, tag, options2);
- else if (tag === "objid" && state.args)
- return this._decodeObjid(input, state.args[0], state.args[1], options2);
- else if (tag === "objid")
- return this._decodeObjid(input, null, null, options2);
- else if (tag === "gentime" || tag === "utctime")
- return this._decodeTime(input, tag, options2);
- else if (tag === "null_")
- return this._decodeNull(input, options2);
- else if (tag === "bool")
- return this._decodeBool(input, options2);
- else if (tag === "objDesc")
- return this._decodeStr(input, tag, options2);
- else if (tag === "int" || tag === "enum")
- return this._decodeInt(input, state.args && state.args[0], options2);
- if (state.use !== null) {
- return this._getUse(state.use, input._reporterState.obj)._decode(input, options2);
- } else {
- return input.error("unknown tag: " + tag);
- }
- };
- Node.prototype._getUse = function _getUse(entity, obj) {
- const state = this._baseState;
- state.useDecoder = this._use(entity, obj);
- assert(state.useDecoder._baseState.parent === null);
- state.useDecoder = state.useDecoder._baseState.children[0];
- if (state.implicit !== state.useDecoder._baseState.implicit) {
- state.useDecoder = state.useDecoder.clone();
- state.useDecoder._baseState.implicit = state.implicit;
- }
- return state.useDecoder;
- };
- Node.prototype._decodeChoice = function decodeChoice(input, options2) {
- const state = this._baseState;
- let result = null;
- let match = false;
- Object.keys(state.choice).some(function(key) {
- const save = input.save();
- const node = state.choice[key];
- try {
- const value = node._decode(input, options2);
- if (input.isError(value))
- return false;
- result = { type: key, value };
- match = true;
- } catch (e) {
- input.restore(save);
- return false;
- }
- return true;
- }, this);
- if (!match)
- return input.error("Choice not matched");
- return result;
- };
- Node.prototype._createEncoderBuffer = function createEncoderBuffer(data) {
- return new EncoderBuffer(data, this.reporter);
- };
- Node.prototype._encode = function encode(data, reporter, parent) {
- const state = this._baseState;
- if (state["default"] !== null && state["default"] === data)
- return;
- const result = this._encodeValue(data, reporter, parent);
- if (result === undefined)
- return;
- if (this._skipDefault(result, reporter, parent))
- return;
- return result;
- };
- Node.prototype._encodeValue = function encode(data, reporter, parent) {
- const state = this._baseState;
- if (state.parent === null)
- return state.children[0]._encode(data, reporter || new Reporter);
- let result = null;
- this.reporter = reporter;
- if (state.optional && data === undefined) {
- if (state["default"] !== null)
- data = state["default"];
- else
- return;
- }
- let content = null;
- let primitive = false;
- if (state.any) {
- result = this._createEncoderBuffer(data);
- } else if (state.choice) {
- result = this._encodeChoice(data, reporter);
- } else if (state.contains) {
- content = this._getUse(state.contains, parent)._encode(data, reporter);
- primitive = true;
- } else if (state.children) {
- content = state.children.map(function(child) {
- if (child._baseState.tag === "null_")
- return child._encode(null, reporter, data);
- if (child._baseState.key === null)
- return reporter.error("Child should have a key");
- const prevKey = reporter.enterKey(child._baseState.key);
- if (typeof data !== "object")
- return reporter.error("Child expected, but input is not object");
- const res = child._encode(data[child._baseState.key], reporter, data);
- reporter.leaveKey(prevKey);
- return res;
- }, this).filter(function(child) {
- return child;
- });
- content = this._createEncoderBuffer(content);
- } else {
- if (state.tag === "seqof" || state.tag === "setof") {
- if (!(state.args && state.args.length === 1))
- return reporter.error("Too many args for : " + state.tag);
- if (!Array.isArray(data))
- return reporter.error("seqof/setof, but data is not Array");
- const child = this.clone();
- child._baseState.implicit = null;
- content = this._createEncoderBuffer(data.map(function(item) {
- const state2 = this._baseState;
- return this._getUse(state2.args[0], data)._encode(item, reporter);
- }, child));
- } else if (state.use !== null) {
- result = this._getUse(state.use, parent)._encode(data, reporter);
- } else {
- content = this._encodePrimitive(state.tag, data);
- primitive = true;
- }
- }
- if (!state.any && state.choice === null) {
- const tag = state.implicit !== null ? state.implicit : state.tag;
- const cls = state.implicit === null ? "universal" : "context";
- if (tag === null) {
- if (state.use === null)
- reporter.error("Tag could be omitted only for .use()");
- } else {
- if (state.use === null)
- result = this._encodeComposite(tag, primitive, cls, content);
- }
- }
- if (state.explicit !== null)
- result = this._encodeComposite(state.explicit, false, "context", result);
- return result;
- };
- Node.prototype._encodeChoice = function encodeChoice(data, reporter) {
- const state = this._baseState;
- const node = state.choice[data.type];
- if (!node) {
- assert(false, data.type + " not found in " + JSON.stringify(Object.keys(state.choice)));
- }
- return node._encode(data.value, reporter);
- };
- Node.prototype._encodePrimitive = function encodePrimitive(tag, data) {
- const state = this._baseState;
- if (/str$/.test(tag))
- return this._encodeStr(data, tag);
- else if (tag === "objid" && state.args)
- return this._encodeObjid(data, state.reverseArgs[0], state.args[1]);
- else if (tag === "objid")
- return this._encodeObjid(data, null, null);
- else if (tag === "gentime" || tag === "utctime")
- return this._encodeTime(data, tag);
- else if (tag === "null_")
- return this._encodeNull();
- else if (tag === "int" || tag === "enum")
- return this._encodeInt(data, state.args && state.reverseArgs[0]);
- else if (tag === "bool")
- return this._encodeBool(data);
- else if (tag === "objDesc")
- return this._encodeStr(data, tag);
- else
- throw new Error("Unsupported tag: " + tag);
- };
- Node.prototype._isNumstr = function isNumstr(str) {
- return /^[0-9 ]*$/.test(str);
- };
- Node.prototype._isPrintstr = function isPrintstr(str) {
- return /^[A-Za-z0-9 '()+,-./:=?]*$/.test(str);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/constants/der.js
-var require_der = __commonJS((exports) => {
- function reverse(map) {
- const res = {};
- Object.keys(map).forEach(function(key) {
- if ((key | 0) == key)
- key = key | 0;
- const value = map[key];
- res[value] = key;
- });
- return res;
- }
- exports.tagClass = {
- 0: "universal",
- 1: "application",
- 2: "context",
- 3: "private"
- };
- exports.tagClassByName = reverse(exports.tagClass);
- exports.tag = {
- 0: "end",
- 1: "bool",
- 2: "int",
- 3: "bitstr",
- 4: "octstr",
- 5: "null_",
- 6: "objid",
- 7: "objDesc",
- 8: "external",
- 9: "real",
- 10: "enum",
- 11: "embed",
- 12: "utf8str",
- 13: "relativeOid",
- 16: "seq",
- 17: "set",
- 18: "numstr",
- 19: "printstr",
- 20: "t61str",
- 21: "videostr",
- 22: "ia5str",
- 23: "utctime",
- 24: "gentime",
- 25: "graphstr",
- 26: "iso646str",
- 27: "genstr",
- 28: "unistr",
- 29: "charstr",
- 30: "bmpstr"
- };
- exports.tagByName = reverse(exports.tag);
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/encoders/der.js
-var require_der2 = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var Buffer2 = require_safer().Buffer;
- var Node = require_node();
- var der = require_der();
- function DEREncoder(entity) {
- this.enc = "der";
- this.name = entity.name;
- this.entity = entity;
- this.tree = new DERNode;
- this.tree._init(entity.body);
- }
- module.exports = DEREncoder;
- DEREncoder.prototype.encode = function encode(data, reporter) {
- return this.tree._encode(data, reporter).join();
- };
- function DERNode(parent) {
- Node.call(this, "der", parent);
- }
- inherits(DERNode, Node);
- DERNode.prototype._encodeComposite = function encodeComposite(tag, primitive, cls, content) {
- const encodedTag = encodeTag(tag, primitive, cls, this.reporter);
- if (content.length < 128) {
- const header2 = Buffer2.alloc(2);
- header2[0] = encodedTag;
- header2[1] = content.length;
- return this._createEncoderBuffer([header2, content]);
- }
- let lenOctets = 1;
- for (let i = content.length;i >= 256; i >>= 8)
- lenOctets++;
- const header = Buffer2.alloc(1 + 1 + lenOctets);
- header[0] = encodedTag;
- header[1] = 128 | lenOctets;
- for (let i = 1 + lenOctets, j = content.length;j > 0; i--, j >>= 8)
- header[i] = j & 255;
- return this._createEncoderBuffer([header, content]);
- };
- DERNode.prototype._encodeStr = function encodeStr(str, tag) {
- if (tag === "bitstr") {
- return this._createEncoderBuffer([str.unused | 0, str.data]);
- } else if (tag === "bmpstr") {
- const buf = Buffer2.alloc(str.length * 2);
- for (let i = 0;i < str.length; i++) {
- buf.writeUInt16BE(str.charCodeAt(i), i * 2);
- }
- return this._createEncoderBuffer(buf);
- } else if (tag === "numstr") {
- if (!this._isNumstr(str)) {
- return this.reporter.error("Encoding of string type: numstr supports " + "only digits and space");
- }
- return this._createEncoderBuffer(str);
- } else if (tag === "printstr") {
- if (!this._isPrintstr(str)) {
- return this.reporter.error("Encoding of string type: printstr supports " + "only latin upper and lower case letters, " + "digits, space, apostrophe, left and rigth " + "parenthesis, plus sign, comma, hyphen, " + "dot, slash, colon, equal sign, " + "question mark");
- }
- return this._createEncoderBuffer(str);
- } else if (/str$/.test(tag)) {
- return this._createEncoderBuffer(str);
- } else if (tag === "objDesc") {
- return this._createEncoderBuffer(str);
- } else {
- return this.reporter.error("Encoding of string type: " + tag + " unsupported");
- }
- };
- DERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) {
- if (typeof id === "string") {
- if (!values)
- return this.reporter.error("string objid given, but no values map found");
- if (!values.hasOwnProperty(id))
- return this.reporter.error("objid not found in values map");
- id = values[id].split(/[\s.]+/g);
- for (let i = 0;i < id.length; i++)
- id[i] |= 0;
- } else if (Array.isArray(id)) {
- id = id.slice();
- for (let i = 0;i < id.length; i++)
- id[i] |= 0;
- }
- if (!Array.isArray(id)) {
- return this.reporter.error("objid() should be either array or string, " + "got: " + JSON.stringify(id));
- }
- if (!relative) {
- if (id[1] >= 40)
- return this.reporter.error("Second objid identifier OOB");
- id.splice(0, 2, id[0] * 40 + id[1]);
- }
- let size = 0;
- for (let i = 0;i < id.length; i++) {
- let ident = id[i];
- for (size++;ident >= 128; ident >>= 7)
- size++;
- }
- const objid = Buffer2.alloc(size);
- let offset = objid.length - 1;
- for (let i = id.length - 1;i >= 0; i--) {
- let ident = id[i];
- objid[offset--] = ident & 127;
- while ((ident >>= 7) > 0)
- objid[offset--] = 128 | ident & 127;
- }
- return this._createEncoderBuffer(objid);
- };
- function two(num) {
- if (num < 10)
- return "0" + num;
- else
- return num;
- }
- DERNode.prototype._encodeTime = function encodeTime(time, tag) {
- let str;
- const date = new Date(time);
- if (tag === "gentime") {
- str = [
- two(date.getUTCFullYear()),
- two(date.getUTCMonth() + 1),
- two(date.getUTCDate()),
- two(date.getUTCHours()),
- two(date.getUTCMinutes()),
- two(date.getUTCSeconds()),
- "Z"
- ].join("");
- } else if (tag === "utctime") {
- str = [
- two(date.getUTCFullYear() % 100),
- two(date.getUTCMonth() + 1),
- two(date.getUTCDate()),
- two(date.getUTCHours()),
- two(date.getUTCMinutes()),
- two(date.getUTCSeconds()),
- "Z"
- ].join("");
- } else {
- this.reporter.error("Encoding " + tag + " time is not supported yet");
- }
- return this._encodeStr(str, "octstr");
- };
- DERNode.prototype._encodeNull = function encodeNull() {
- return this._createEncoderBuffer("");
- };
- DERNode.prototype._encodeInt = function encodeInt(num, values) {
- if (typeof num === "string") {
- if (!values)
- return this.reporter.error("String int or enum given, but no values map");
- if (!values.hasOwnProperty(num)) {
- return this.reporter.error("Values map doesn't contain: " + JSON.stringify(num));
- }
- num = values[num];
- }
- if (typeof num !== "number" && !Buffer2.isBuffer(num)) {
- const numArray = num.toArray();
- if (!num.sign && numArray[0] & 128) {
- numArray.unshift(0);
- }
- num = Buffer2.from(numArray);
- }
- if (Buffer2.isBuffer(num)) {
- let size2 = num.length;
- if (num.length === 0)
- size2++;
- const out2 = Buffer2.alloc(size2);
- num.copy(out2);
- if (num.length === 0)
- out2[0] = 0;
- return this._createEncoderBuffer(out2);
- }
- if (num < 128)
- return this._createEncoderBuffer(num);
- if (num < 256)
- return this._createEncoderBuffer([0, num]);
- let size = 1;
- for (let i = num;i >= 256; i >>= 8)
- size++;
- const out = new Array(size);
- for (let i = out.length - 1;i >= 0; i--) {
- out[i] = num & 255;
- num >>= 8;
- }
- if (out[0] & 128) {
- out.unshift(0);
- }
- return this._createEncoderBuffer(Buffer2.from(out));
- };
- DERNode.prototype._encodeBool = function encodeBool(value) {
- return this._createEncoderBuffer(value ? 255 : 0);
- };
- DERNode.prototype._use = function use(entity, obj) {
- if (typeof entity === "function")
- entity = entity(obj);
- return entity._getEncoder("der").tree;
- };
- DERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) {
- const state = this._baseState;
- let i;
- if (state["default"] === null)
- return false;
- const data = dataBuffer.join();
- if (state.defaultBuffer === undefined)
- state.defaultBuffer = this._encodeValue(state["default"], reporter, parent).join();
- if (data.length !== state.defaultBuffer.length)
- return false;
- for (i = 0;i < data.length; i++)
- if (data[i] !== state.defaultBuffer[i])
- return false;
- return true;
- };
- function encodeTag(tag, primitive, cls, reporter) {
- let res;
- if (tag === "seqof")
- tag = "seq";
- else if (tag === "setof")
- tag = "set";
- if (der.tagByName.hasOwnProperty(tag))
- res = der.tagByName[tag];
- else if (typeof tag === "number" && (tag | 0) === tag)
- res = tag;
- else
- return reporter.error("Unknown tag: " + tag);
- if (res >= 31)
- return reporter.error("Multi-octet tag encoding unsupported");
- if (!primitive)
- res |= 32;
- res |= der.tagClassByName[cls || "universal"] << 6;
- return res;
- }
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/encoders/pem.js
-var require_pem = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var DEREncoder = require_der2();
- function PEMEncoder(entity) {
- DEREncoder.call(this, entity);
- this.enc = "pem";
- }
- inherits(PEMEncoder, DEREncoder);
- module.exports = PEMEncoder;
- PEMEncoder.prototype.encode = function encode(data, options2) {
- const buf = DEREncoder.prototype.encode.call(this, data);
- const p = buf.toString("base64");
- const out = ["-----BEGIN " + options2.label + "-----"];
- for (let i = 0;i < p.length; i += 64)
- out.push(p.slice(i, i + 64));
- out.push("-----END " + options2.label + "-----");
- return out.join(`
-`);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/encoders/index.js
-var require_encoders = __commonJS((exports) => {
- var encoders = exports;
- encoders.der = require_der2();
- encoders.pem = require_pem();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/decoders/der.js
-var require_der3 = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var bignum = require_bn();
- var DecoderBuffer = require_buffer().DecoderBuffer;
- var Node = require_node();
- var der = require_der();
- function DERDecoder(entity) {
- this.enc = "der";
- this.name = entity.name;
- this.entity = entity;
- this.tree = new DERNode;
- this.tree._init(entity.body);
- }
- module.exports = DERDecoder;
- DERDecoder.prototype.decode = function decode(data, options2) {
- if (!DecoderBuffer.isDecoderBuffer(data)) {
- data = new DecoderBuffer(data, options2);
- }
- return this.tree._decode(data, options2);
- };
- function DERNode(parent) {
- Node.call(this, "der", parent);
- }
- inherits(DERNode, Node);
- DERNode.prototype._peekTag = function peekTag(buffer, tag, any) {
- if (buffer.isEmpty())
- return false;
- const state = buffer.save();
- const decodedTag = derDecodeTag(buffer, 'Failed to peek tag: "' + tag + '"');
- if (buffer.isError(decodedTag))
- return decodedTag;
- buffer.restore(state);
- return decodedTag.tag === tag || decodedTag.tagStr === tag || decodedTag.tagStr + "of" === tag || any;
- };
- DERNode.prototype._decodeTag = function decodeTag(buffer, tag, any) {
- const decodedTag = derDecodeTag(buffer, 'Failed to decode tag of "' + tag + '"');
- if (buffer.isError(decodedTag))
- return decodedTag;
- let len = derDecodeLen(buffer, decodedTag.primitive, 'Failed to get length of "' + tag + '"');
- if (buffer.isError(len))
- return len;
- if (!any && decodedTag.tag !== tag && decodedTag.tagStr !== tag && decodedTag.tagStr + "of" !== tag) {
- return buffer.error('Failed to match tag: "' + tag + '"');
- }
- if (decodedTag.primitive || len !== null)
- return buffer.skip(len, 'Failed to match body of: "' + tag + '"');
- const state = buffer.save();
- const res = this._skipUntilEnd(buffer, 'Failed to skip indefinite length body: "' + this.tag + '"');
- if (buffer.isError(res))
- return res;
- len = buffer.offset - state.offset;
- buffer.restore(state);
- return buffer.skip(len, 'Failed to match body of: "' + tag + '"');
- };
- DERNode.prototype._skipUntilEnd = function skipUntilEnd(buffer, fail) {
- for (;; ) {
- const tag = derDecodeTag(buffer, fail);
- if (buffer.isError(tag))
- return tag;
- const len = derDecodeLen(buffer, tag.primitive, fail);
- if (buffer.isError(len))
- return len;
- let res;
- if (tag.primitive || len !== null)
- res = buffer.skip(len);
- else
- res = this._skipUntilEnd(buffer, fail);
- if (buffer.isError(res))
- return res;
- if (tag.tagStr === "end")
- break;
- }
- };
- DERNode.prototype._decodeList = function decodeList(buffer, tag, decoder, options2) {
- const result = [];
- while (!buffer.isEmpty()) {
- const possibleEnd = this._peekTag(buffer, "end");
- if (buffer.isError(possibleEnd))
- return possibleEnd;
- const res = decoder.decode(buffer, "der", options2);
- if (buffer.isError(res) && possibleEnd)
- break;
- result.push(res);
- }
- return result;
- };
- DERNode.prototype._decodeStr = function decodeStr(buffer, tag) {
- if (tag === "bitstr") {
- const unused = buffer.readUInt8();
- if (buffer.isError(unused))
- return unused;
- return { unused, data: buffer.raw() };
- } else if (tag === "bmpstr") {
- const raw = buffer.raw();
- if (raw.length % 2 === 1)
- return buffer.error("Decoding of string type: bmpstr length mismatch");
- let str = "";
- for (let i = 0;i < raw.length / 2; i++) {
- str += String.fromCharCode(raw.readUInt16BE(i * 2));
- }
- return str;
- } else if (tag === "numstr") {
- const numstr = buffer.raw().toString("ascii");
- if (!this._isNumstr(numstr)) {
- return buffer.error("Decoding of string type: " + "numstr unsupported characters");
- }
- return numstr;
- } else if (tag === "octstr") {
- return buffer.raw();
- } else if (tag === "objDesc") {
- return buffer.raw();
- } else if (tag === "printstr") {
- const printstr = buffer.raw().toString("ascii");
- if (!this._isPrintstr(printstr)) {
- return buffer.error("Decoding of string type: " + "printstr unsupported characters");
- }
- return printstr;
- } else if (/str$/.test(tag)) {
- return buffer.raw().toString();
- } else {
- return buffer.error("Decoding of string type: " + tag + " unsupported");
- }
- };
- DERNode.prototype._decodeObjid = function decodeObjid(buffer, values, relative) {
- let result;
- const identifiers = [];
- let ident = 0;
- let subident = 0;
- while (!buffer.isEmpty()) {
- subident = buffer.readUInt8();
- ident <<= 7;
- ident |= subident & 127;
- if ((subident & 128) === 0) {
- identifiers.push(ident);
- ident = 0;
- }
- }
- if (subident & 128)
- identifiers.push(ident);
- const first = identifiers[0] / 40 | 0;
- const second = identifiers[0] % 40;
- if (relative)
- result = identifiers;
- else
- result = [first, second].concat(identifiers.slice(1));
- if (values) {
- let tmp = values[result.join(" ")];
- if (tmp === undefined)
- tmp = values[result.join(".")];
- if (tmp !== undefined)
- result = tmp;
- }
- return result;
- };
- DERNode.prototype._decodeTime = function decodeTime(buffer, tag) {
- const str = buffer.raw().toString();
- let year;
- let mon;
- let day;
- let hour;
- let min;
- let sec;
- if (tag === "gentime") {
- year = str.slice(0, 4) | 0;
- mon = str.slice(4, 6) | 0;
- day = str.slice(6, 8) | 0;
- hour = str.slice(8, 10) | 0;
- min = str.slice(10, 12) | 0;
- sec = str.slice(12, 14) | 0;
- } else if (tag === "utctime") {
- year = str.slice(0, 2) | 0;
- mon = str.slice(2, 4) | 0;
- day = str.slice(4, 6) | 0;
- hour = str.slice(6, 8) | 0;
- min = str.slice(8, 10) | 0;
- sec = str.slice(10, 12) | 0;
- if (year < 70)
- year = 2000 + year;
- else
- year = 1900 + year;
- } else {
- return buffer.error("Decoding " + tag + " time is not supported yet");
- }
- return Date.UTC(year, mon - 1, day, hour, min, sec, 0);
- };
- DERNode.prototype._decodeNull = function decodeNull() {
- return null;
- };
- DERNode.prototype._decodeBool = function decodeBool(buffer) {
- const res = buffer.readUInt8();
- if (buffer.isError(res))
- return res;
- else
- return res !== 0;
- };
- DERNode.prototype._decodeInt = function decodeInt(buffer, values) {
- const raw = buffer.raw();
- let res = new bignum(raw);
- if (values)
- res = values[res.toString(10)] || res;
- return res;
- };
- DERNode.prototype._use = function use(entity, obj) {
- if (typeof entity === "function")
- entity = entity(obj);
- return entity._getDecoder("der").tree;
- };
- function derDecodeTag(buf, fail) {
- let tag = buf.readUInt8(fail);
- if (buf.isError(tag))
- return tag;
- const cls = der.tagClass[tag >> 6];
- const primitive = (tag & 32) === 0;
- if ((tag & 31) === 31) {
- let oct = tag;
- tag = 0;
- while ((oct & 128) === 128) {
- oct = buf.readUInt8(fail);
- if (buf.isError(oct))
- return oct;
- tag <<= 7;
- tag |= oct & 127;
- }
- } else {
- tag &= 31;
- }
- const tagStr = der.tag[tag];
- return {
- cls,
- primitive,
- tag,
- tagStr
- };
- }
- function derDecodeLen(buf, primitive, fail) {
- let len = buf.readUInt8(fail);
- if (buf.isError(len))
- return len;
- if (!primitive && len === 128)
- return null;
- if ((len & 128) === 0) {
- return len;
- }
- const num = len & 127;
- if (num > 4)
- return buf.error("length octect is too long");
- len = 0;
- for (let i = 0;i < num; i++) {
- len <<= 8;
- const j = buf.readUInt8(fail);
- if (buf.isError(j))
- return j;
- len |= j;
- }
- return len;
- }
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/decoders/pem.js
-var require_pem2 = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var Buffer2 = require_safer().Buffer;
- var DERDecoder = require_der3();
- function PEMDecoder(entity) {
- DERDecoder.call(this, entity);
- this.enc = "pem";
- }
- inherits(PEMDecoder, DERDecoder);
- module.exports = PEMDecoder;
- PEMDecoder.prototype.decode = function decode(data, options2) {
- const lines = data.toString().split(/[\r\n]+/g);
- const label = options2.label.toUpperCase();
- const re = /^-----(BEGIN|END) ([^-]+)-----$/;
- let start = -1;
- let end = -1;
- for (let i = 0;i < lines.length; i++) {
- const match = lines[i].match(re);
- if (match === null)
- continue;
- if (match[2] !== label)
- continue;
- if (start === -1) {
- if (match[1] !== "BEGIN")
- break;
- start = i;
- } else {
- if (match[1] !== "END")
- break;
- end = i;
- break;
- }
- }
- if (start === -1 || end === -1)
- throw new Error("PEM section not found for: " + label);
- const base64 = lines.slice(start + 1, end).join("");
- base64.replace(/[^a-z0-9+/=]+/gi, "");
- const input = Buffer2.from(base64, "base64");
- return DERDecoder.prototype.decode.call(this, input, options2);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/decoders/index.js
-var require_decoders = __commonJS((exports) => {
- var decoders = exports;
- decoders.der = require_der3();
- decoders.pem = require_pem2();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/api.js
-var require_api = __commonJS((exports) => {
- var encoders = require_encoders();
- var decoders = require_decoders();
- var inherits = require_inherits();
- var api = exports;
- api.define = function define(name, body) {
- return new Entity(name, body);
- };
- function Entity(name, body) {
- this.name = name;
- this.body = body;
- this.decoders = {};
- this.encoders = {};
- }
- Entity.prototype._createNamed = function createNamed(Base) {
- const name = this.name;
- function Generated(entity) {
- this._initNamed(entity, name);
- }
- inherits(Generated, Base);
- Generated.prototype._initNamed = function _initNamed(entity, name2) {
- Base.call(this, entity, name2);
- };
- return new Generated(this);
- };
- Entity.prototype._getDecoder = function _getDecoder(enc) {
- enc = enc || "der";
- if (!this.decoders.hasOwnProperty(enc))
- this.decoders[enc] = this._createNamed(decoders[enc]);
- return this.decoders[enc];
- };
- Entity.prototype.decode = function decode(data, enc, options2) {
- return this._getDecoder(enc).decode(data, options2);
- };
- Entity.prototype._getEncoder = function _getEncoder(enc) {
- enc = enc || "der";
- if (!this.encoders.hasOwnProperty(enc))
- this.encoders[enc] = this._createNamed(encoders[enc]);
- return this.encoders[enc];
- };
- Entity.prototype.encode = function encode(data, enc, reporter) {
- return this._getEncoder(enc).encode(data, reporter);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/index.js
-var require_base = __commonJS((exports) => {
- var base = exports;
- base.Reporter = require_reporter().Reporter;
- base.DecoderBuffer = require_buffer().DecoderBuffer;
- base.EncoderBuffer = require_buffer().EncoderBuffer;
- base.Node = require_node();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/constants/index.js
-var require_constants2 = __commonJS((exports) => {
- var constants = exports;
- constants._reverse = function reverse(map) {
- const res = {};
- Object.keys(map).forEach(function(key) {
- if ((key | 0) == key)
- key = key | 0;
- const value = map[key];
- res[value] = key;
- });
- return res;
- };
- constants.der = require_der();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1.js
-var require_asn1 = __commonJS((exports) => {
- var asn1 = exports;
- asn1.bignum = require_bn();
- asn1.define = require_api().define;
- asn1.base = require_base();
- asn1.constants = require_constants2();
- asn1.decoders = require_decoders();
- asn1.encoders = require_encoders();
-});
-
-// ../eve/node_modules/elliptic/package.json
-var require_package = __commonJS((exports, module) => {
- module.exports = {
- name: "elliptic",
- version: "6.6.1",
- description: "EC cryptography",
- main: "lib/elliptic.js",
- files: [
- "lib"
- ],
- scripts: {
- lint: "eslint lib test",
- "lint:fix": "npm run lint -- --fix",
- unit: "istanbul test _mocha --reporter=spec test/index.js",
- test: "npm run lint && npm run unit",
- version: "grunt dist && git add dist/"
- },
- repository: {
- type: "git",
- url: "git@github.com:indutny/elliptic"
- },
- keywords: [
- "EC",
- "Elliptic",
- "curve",
- "Cryptography"
- ],
- author: "Fedor Indutny ",
- license: "MIT",
- bugs: {
- url: "https://github.com/indutny/elliptic/issues"
- },
- homepage: "https://github.com/indutny/elliptic",
- devDependencies: {
- brfs: "^2.0.2",
- coveralls: "^3.1.0",
- eslint: "^7.6.0",
- grunt: "^1.2.1",
- "grunt-browserify": "^5.3.0",
- "grunt-cli": "^1.3.2",
- "grunt-contrib-connect": "^3.0.0",
- "grunt-contrib-copy": "^1.0.0",
- "grunt-contrib-uglify": "^5.0.0",
- "grunt-mocha-istanbul": "^5.0.2",
- "grunt-saucelabs": "^9.0.1",
- istanbul: "^0.4.5",
- mocha: "^8.0.1"
- },
- dependencies: {
- "bn.js": "^4.11.9",
- brorand: "^1.1.0",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.1",
- inherits: "^2.0.4",
- "minimalistic-assert": "^1.0.1",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- };
-});
-
-// ../eve/node_modules/minimalistic-crypto-utils/lib/utils.js
-var require_utils = __commonJS((exports) => {
- var utils = exports;
- function toArray(msg, enc) {
- if (Array.isArray(msg))
- return msg.slice();
- if (!msg)
- return [];
- var res = [];
- if (typeof msg !== "string") {
- for (var i = 0;i < msg.length; i++)
- res[i] = msg[i] | 0;
- return res;
- }
- if (enc === "hex") {
- msg = msg.replace(/[^a-z0-9]+/ig, "");
- if (msg.length % 2 !== 0)
- msg = "0" + msg;
- for (var i = 0;i < msg.length; i += 2)
- res.push(parseInt(msg[i] + msg[i + 1], 16));
- } else {
- for (var i = 0;i < msg.length; i++) {
- var c = msg.charCodeAt(i);
- var hi = c >> 8;
- var lo = c & 255;
- if (hi)
- res.push(hi, lo);
- else
- res.push(lo);
- }
- }
- return res;
- }
- utils.toArray = toArray;
- function zero2(word) {
- if (word.length === 1)
- return "0" + word;
- else
- return word;
- }
- utils.zero2 = zero2;
- function toHex(msg) {
- var res = "";
- for (var i = 0;i < msg.length; i++)
- res += zero2(msg[i].toString(16));
- return res;
- }
- utils.toHex = toHex;
- utils.encode = function encode(arr, enc) {
- if (enc === "hex")
- return toHex(arr);
- else
- return arr;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/utils.js
-var require_utils2 = __commonJS((exports) => {
- var utils = exports;
- var BN = require_bn();
- var minAssert = require_minimalistic_assert();
- var minUtils = require_utils();
- utils.assert = minAssert;
- utils.toArray = minUtils.toArray;
- utils.zero2 = minUtils.zero2;
- utils.toHex = minUtils.toHex;
- utils.encode = minUtils.encode;
- function getNAF(num, w, bits) {
- var naf = new Array(Math.max(num.bitLength(), bits) + 1);
- var i;
- for (i = 0;i < naf.length; i += 1) {
- naf[i] = 0;
- }
- var ws = 1 << w + 1;
- var k = num.clone();
- for (i = 0;i < naf.length; i++) {
- var z;
- var mod = k.andln(ws - 1);
- if (k.isOdd()) {
- if (mod > (ws >> 1) - 1)
- z = (ws >> 1) - mod;
- else
- z = mod;
- k.isubn(z);
- } else {
- z = 0;
- }
- naf[i] = z;
- k.iushrn(1);
- }
- return naf;
- }
- utils.getNAF = getNAF;
- function getJSF(k1, k2) {
- var jsf = [
- [],
- []
- ];
- k1 = k1.clone();
- k2 = k2.clone();
- var d1 = 0;
- var d2 = 0;
- var m8;
- while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {
- var m14 = k1.andln(3) + d1 & 3;
- var m24 = k2.andln(3) + d2 & 3;
- if (m14 === 3)
- m14 = -1;
- if (m24 === 3)
- m24 = -1;
- var u1;
- if ((m14 & 1) === 0) {
- u1 = 0;
- } else {
- m8 = k1.andln(7) + d1 & 7;
- if ((m8 === 3 || m8 === 5) && m24 === 2)
- u1 = -m14;
- else
- u1 = m14;
- }
- jsf[0].push(u1);
- var u2;
- if ((m24 & 1) === 0) {
- u2 = 0;
- } else {
- m8 = k2.andln(7) + d2 & 7;
- if ((m8 === 3 || m8 === 5) && m14 === 2)
- u2 = -m24;
- else
- u2 = m24;
- }
- jsf[1].push(u2);
- if (2 * d1 === u1 + 1)
- d1 = 1 - d1;
- if (2 * d2 === u2 + 1)
- d2 = 1 - d2;
- k1.iushrn(1);
- k2.iushrn(1);
- }
- return jsf;
- }
- utils.getJSF = getJSF;
- function cachedProperty(obj, name, computer) {
- var key = "_" + name;
- obj.prototype[name] = function cachedProperty() {
- return this[key] !== undefined ? this[key] : this[key] = computer.call(this);
- };
- }
- utils.cachedProperty = cachedProperty;
- function parseBytes(bytes) {
- return typeof bytes === "string" ? utils.toArray(bytes, "hex") : bytes;
- }
- utils.parseBytes = parseBytes;
- function intFromLE(bytes) {
- return new BN(bytes, "hex", "le");
- }
- utils.intFromLE = intFromLE;
-});
-
-// ../eve/node_modules/brorand/index.js
-var require_brorand = __commonJS((exports, module) => {
- var r;
- module.exports = function rand(len) {
- if (!r)
- r = new Rand(null);
- return r.generate(len);
- };
- function Rand(rand) {
- this.rand = rand;
- }
- module.exports.Rand = Rand;
- Rand.prototype.generate = function generate(len) {
- return this._rand(len);
- };
- Rand.prototype._rand = function _rand(n) {
- if (this.rand.getBytes)
- return this.rand.getBytes(n);
- var res = new Uint8Array(n);
- for (var i = 0;i < res.length; i++)
- res[i] = this.rand.getByte();
- return res;
- };
- if (typeof self === "object") {
- if (self.crypto && self.crypto.getRandomValues) {
- Rand.prototype._rand = function _rand(n) {
- var arr = new Uint8Array(n);
- self.crypto.getRandomValues(arr);
- return arr;
- };
- } else if (self.msCrypto && self.msCrypto.getRandomValues) {
- Rand.prototype._rand = function _rand(n) {
- var arr = new Uint8Array(n);
- self.msCrypto.getRandomValues(arr);
- return arr;
- };
- } else if (typeof window === "object") {
- Rand.prototype._rand = function() {
- throw new Error("Not implemented yet");
- };
- }
- } else {
- try {
- crypto2 = __require("crypto");
- if (typeof crypto2.randomBytes !== "function")
- throw new Error("Not supported");
- Rand.prototype._rand = function _rand(n) {
- return crypto2.randomBytes(n);
- };
- } catch (e) {}
- }
- var crypto2;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/base.js
-var require_base2 = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var getNAF = utils.getNAF;
- var getJSF = utils.getJSF;
- var assert = utils.assert;
- function BaseCurve(type, conf) {
- this.type = type;
- this.p = new BN(conf.p, 16);
- this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p);
- this.zero = new BN(0).toRed(this.red);
- this.one = new BN(1).toRed(this.red);
- this.two = new BN(2).toRed(this.red);
- this.n = conf.n && new BN(conf.n, 16);
- this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed);
- this._wnafT1 = new Array(4);
- this._wnafT2 = new Array(4);
- this._wnafT3 = new Array(4);
- this._wnafT4 = new Array(4);
- this._bitLength = this.n ? this.n.bitLength() : 0;
- var adjustCount = this.n && this.p.div(this.n);
- if (!adjustCount || adjustCount.cmpn(100) > 0) {
- this.redN = null;
- } else {
- this._maxwellTrick = true;
- this.redN = this.n.toRed(this.red);
- }
- }
- module.exports = BaseCurve;
- BaseCurve.prototype.point = function point() {
- throw new Error("Not implemented");
- };
- BaseCurve.prototype.validate = function validate() {
- throw new Error("Not implemented");
- };
- BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) {
- assert(p.precomputed);
- var doubles = p._getDoubles();
- var naf = getNAF(k, 1, this._bitLength);
- var I = (1 << doubles.step + 1) - (doubles.step % 2 === 0 ? 2 : 1);
- I /= 3;
- var repr = [];
- var j;
- var nafW;
- for (j = 0;j < naf.length; j += doubles.step) {
- nafW = 0;
- for (var l = j + doubles.step - 1;l >= j; l--)
- nafW = (nafW << 1) + naf[l];
- repr.push(nafW);
- }
- var a = this.jpoint(null, null, null);
- var b = this.jpoint(null, null, null);
- for (var i = I;i > 0; i--) {
- for (j = 0;j < repr.length; j++) {
- nafW = repr[j];
- if (nafW === i)
- b = b.mixedAdd(doubles.points[j]);
- else if (nafW === -i)
- b = b.mixedAdd(doubles.points[j].neg());
- }
- a = a.add(b);
- }
- return a.toP();
- };
- BaseCurve.prototype._wnafMul = function _wnafMul(p, k) {
- var w = 4;
- var nafPoints = p._getNAFPoints(w);
- w = nafPoints.wnd;
- var wnd = nafPoints.points;
- var naf = getNAF(k, w, this._bitLength);
- var acc = this.jpoint(null, null, null);
- for (var i = naf.length - 1;i >= 0; i--) {
- for (var l = 0;i >= 0 && naf[i] === 0; i--)
- l++;
- if (i >= 0)
- l++;
- acc = acc.dblp(l);
- if (i < 0)
- break;
- var z = naf[i];
- assert(z !== 0);
- if (p.type === "affine") {
- if (z > 0)
- acc = acc.mixedAdd(wnd[z - 1 >> 1]);
- else
- acc = acc.mixedAdd(wnd[-z - 1 >> 1].neg());
- } else {
- if (z > 0)
- acc = acc.add(wnd[z - 1 >> 1]);
- else
- acc = acc.add(wnd[-z - 1 >> 1].neg());
- }
- }
- return p.type === "affine" ? acc.toP() : acc;
- };
- BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, points, coeffs, len, jacobianResult) {
- var wndWidth = this._wnafT1;
- var wnd = this._wnafT2;
- var naf = this._wnafT3;
- var max = 0;
- var i;
- var j;
- var p;
- for (i = 0;i < len; i++) {
- p = points[i];
- var nafPoints = p._getNAFPoints(defW);
- wndWidth[i] = nafPoints.wnd;
- wnd[i] = nafPoints.points;
- }
- for (i = len - 1;i >= 1; i -= 2) {
- var a = i - 1;
- var b = i;
- if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {
- naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength);
- naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength);
- max = Math.max(naf[a].length, max);
- max = Math.max(naf[b].length, max);
- continue;
- }
- var comb = [
- points[a],
- null,
- null,
- points[b]
- ];
- if (points[a].y.cmp(points[b].y) === 0) {
- comb[1] = points[a].add(points[b]);
- comb[2] = points[a].toJ().mixedAdd(points[b].neg());
- } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) {
- comb[1] = points[a].toJ().mixedAdd(points[b]);
- comb[2] = points[a].add(points[b].neg());
- } else {
- comb[1] = points[a].toJ().mixedAdd(points[b]);
- comb[2] = points[a].toJ().mixedAdd(points[b].neg());
- }
- var index = [
- -3,
- -1,
- -5,
- -7,
- 0,
- 7,
- 5,
- 1,
- 3
- ];
- var jsf = getJSF(coeffs[a], coeffs[b]);
- max = Math.max(jsf[0].length, max);
- naf[a] = new Array(max);
- naf[b] = new Array(max);
- for (j = 0;j < max; j++) {
- var ja = jsf[0][j] | 0;
- var jb = jsf[1][j] | 0;
- naf[a][j] = index[(ja + 1) * 3 + (jb + 1)];
- naf[b][j] = 0;
- wnd[a] = comb;
- }
- }
- var acc = this.jpoint(null, null, null);
- var tmp = this._wnafT4;
- for (i = max;i >= 0; i--) {
- var k = 0;
- while (i >= 0) {
- var zero = true;
- for (j = 0;j < len; j++) {
- tmp[j] = naf[j][i] | 0;
- if (tmp[j] !== 0)
- zero = false;
- }
- if (!zero)
- break;
- k++;
- i--;
- }
- if (i >= 0)
- k++;
- acc = acc.dblp(k);
- if (i < 0)
- break;
- for (j = 0;j < len; j++) {
- var z = tmp[j];
- if (z === 0)
- continue;
- else if (z > 0)
- p = wnd[j][z - 1 >> 1];
- else if (z < 0)
- p = wnd[j][-z - 1 >> 1].neg();
- if (p.type === "affine")
- acc = acc.mixedAdd(p);
- else
- acc = acc.add(p);
- }
- }
- for (i = 0;i < len; i++)
- wnd[i] = null;
- if (jacobianResult)
- return acc;
- else
- return acc.toP();
- };
- function BasePoint(curve, type) {
- this.curve = curve;
- this.type = type;
- this.precomputed = null;
- }
- BaseCurve.BasePoint = BasePoint;
- BasePoint.prototype.eq = function eq() {
- throw new Error("Not implemented");
- };
- BasePoint.prototype.validate = function validate() {
- return this.curve.validate(this);
- };
- BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
- bytes = utils.toArray(bytes, enc);
- var len = this.p.byteLength();
- if ((bytes[0] === 4 || bytes[0] === 6 || bytes[0] === 7) && bytes.length - 1 === 2 * len) {
- if (bytes[0] === 6)
- assert(bytes[bytes.length - 1] % 2 === 0);
- else if (bytes[0] === 7)
- assert(bytes[bytes.length - 1] % 2 === 1);
- var res = this.point(bytes.slice(1, 1 + len), bytes.slice(1 + len, 1 + 2 * len));
- return res;
- } else if ((bytes[0] === 2 || bytes[0] === 3) && bytes.length - 1 === len) {
- return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 3);
- }
- throw new Error("Unknown point format");
- };
- BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) {
- return this.encode(enc, true);
- };
- BasePoint.prototype._encode = function _encode(compact) {
- var len = this.curve.p.byteLength();
- var x = this.getX().toArray("be", len);
- if (compact)
- return [this.getY().isEven() ? 2 : 3].concat(x);
- return [4].concat(x, this.getY().toArray("be", len));
- };
- BasePoint.prototype.encode = function encode(enc, compact) {
- return utils.encode(this._encode(compact), enc);
- };
- BasePoint.prototype.precompute = function precompute(power) {
- if (this.precomputed)
- return this;
- var precomputed = {
- doubles: null,
- naf: null,
- beta: null
- };
- precomputed.naf = this._getNAFPoints(8);
- precomputed.doubles = this._getDoubles(4, power);
- precomputed.beta = this._getBeta();
- this.precomputed = precomputed;
- return this;
- };
- BasePoint.prototype._hasDoubles = function _hasDoubles(k) {
- if (!this.precomputed)
- return false;
- var doubles = this.precomputed.doubles;
- if (!doubles)
- return false;
- return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step);
- };
- BasePoint.prototype._getDoubles = function _getDoubles(step, power) {
- if (this.precomputed && this.precomputed.doubles)
- return this.precomputed.doubles;
- var doubles = [this];
- var acc = this;
- for (var i = 0;i < power; i += step) {
- for (var j = 0;j < step; j++)
- acc = acc.dbl();
- doubles.push(acc);
- }
- return {
- step,
- points: doubles
- };
- };
- BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) {
- if (this.precomputed && this.precomputed.naf)
- return this.precomputed.naf;
- var res = [this];
- var max = (1 << wnd) - 1;
- var dbl = max === 1 ? null : this.dbl();
- for (var i = 1;i < max; i++)
- res[i] = res[i - 1].add(dbl);
- return {
- wnd,
- points: res
- };
- };
- BasePoint.prototype._getBeta = function _getBeta() {
- return null;
- };
- BasePoint.prototype.dblp = function dblp(k) {
- var r = this;
- for (var i = 0;i < k; i++)
- r = r.dbl();
- return r;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/short.js
-var require_short = __commonJS((exports, module) => {
- var utils = require_utils2();
- var BN = require_bn();
- var inherits = require_inherits();
- var Base = require_base2();
- var assert = utils.assert;
- function ShortCurve(conf) {
- Base.call(this, "short", conf);
- this.a = new BN(conf.a, 16).toRed(this.red);
- this.b = new BN(conf.b, 16).toRed(this.red);
- this.tinv = this.two.redInvm();
- this.zeroA = this.a.fromRed().cmpn(0) === 0;
- this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0;
- this.endo = this._getEndomorphism(conf);
- this._endoWnafT1 = new Array(4);
- this._endoWnafT2 = new Array(4);
- }
- inherits(ShortCurve, Base);
- module.exports = ShortCurve;
- ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) {
- if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1)
- return;
- var beta;
- var lambda;
- if (conf.beta) {
- beta = new BN(conf.beta, 16).toRed(this.red);
- } else {
- var betas = this._getEndoRoots(this.p);
- beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1];
- beta = beta.toRed(this.red);
- }
- if (conf.lambda) {
- lambda = new BN(conf.lambda, 16);
- } else {
- var lambdas = this._getEndoRoots(this.n);
- if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) {
- lambda = lambdas[0];
- } else {
- lambda = lambdas[1];
- assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0);
- }
- }
- var basis;
- if (conf.basis) {
- basis = conf.basis.map(function(vec) {
- return {
- a: new BN(vec.a, 16),
- b: new BN(vec.b, 16)
- };
- });
- } else {
- basis = this._getEndoBasis(lambda);
- }
- return {
- beta,
- lambda,
- basis
- };
- };
- ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) {
- var red = num === this.p ? this.red : BN.mont(num);
- var tinv = new BN(2).toRed(red).redInvm();
- var ntinv = tinv.redNeg();
- var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv);
- var l1 = ntinv.redAdd(s).fromRed();
- var l2 = ntinv.redSub(s).fromRed();
- return [l1, l2];
- };
- ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) {
- var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2));
- var u = lambda;
- var v = this.n.clone();
- var x1 = new BN(1);
- var y1 = new BN(0);
- var x2 = new BN(0);
- var y2 = new BN(1);
- var a0;
- var b0;
- var a1;
- var b1;
- var a2;
- var b2;
- var prevR;
- var i = 0;
- var r;
- var x;
- while (u.cmpn(0) !== 0) {
- var q = v.div(u);
- r = v.sub(q.mul(u));
- x = x2.sub(q.mul(x1));
- var y = y2.sub(q.mul(y1));
- if (!a1 && r.cmp(aprxSqrt) < 0) {
- a0 = prevR.neg();
- b0 = x1;
- a1 = r.neg();
- b1 = x;
- } else if (a1 && ++i === 2) {
- break;
- }
- prevR = r;
- v = u;
- u = r;
- x2 = x1;
- x1 = x;
- y2 = y1;
- y1 = y;
- }
- a2 = r.neg();
- b2 = x;
- var len1 = a1.sqr().add(b1.sqr());
- var len2 = a2.sqr().add(b2.sqr());
- if (len2.cmp(len1) >= 0) {
- a2 = a0;
- b2 = b0;
- }
- if (a1.negative) {
- a1 = a1.neg();
- b1 = b1.neg();
- }
- if (a2.negative) {
- a2 = a2.neg();
- b2 = b2.neg();
- }
- return [
- { a: a1, b: b1 },
- { a: a2, b: b2 }
- ];
- };
- ShortCurve.prototype._endoSplit = function _endoSplit(k) {
- var basis = this.endo.basis;
- var v1 = basis[0];
- var v2 = basis[1];
- var c1 = v2.b.mul(k).divRound(this.n);
- var c2 = v1.b.neg().mul(k).divRound(this.n);
- var p1 = c1.mul(v1.a);
- var p2 = c2.mul(v2.a);
- var q1 = c1.mul(v1.b);
- var q2 = c2.mul(v2.b);
- var k1 = k.sub(p1).sub(p2);
- var k2 = q1.add(q2).neg();
- return { k1, k2 };
- };
- ShortCurve.prototype.pointFromX = function pointFromX(x, odd) {
- x = new BN(x, 16);
- if (!x.red)
- x = x.toRed(this.red);
- var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b);
- var y = y2.redSqrt();
- if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
- throw new Error("invalid point");
- var isOdd = y.fromRed().isOdd();
- if (odd && !isOdd || !odd && isOdd)
- y = y.redNeg();
- return this.point(x, y);
- };
- ShortCurve.prototype.validate = function validate(point) {
- if (point.inf)
- return true;
- var x = point.x;
- var y = point.y;
- var ax = this.a.redMul(x);
- var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b);
- return y.redSqr().redISub(rhs).cmpn(0) === 0;
- };
- ShortCurve.prototype._endoWnafMulAdd = function _endoWnafMulAdd(points, coeffs, jacobianResult) {
- var npoints = this._endoWnafT1;
- var ncoeffs = this._endoWnafT2;
- for (var i = 0;i < points.length; i++) {
- var split = this._endoSplit(coeffs[i]);
- var p = points[i];
- var beta = p._getBeta();
- if (split.k1.negative) {
- split.k1.ineg();
- p = p.neg(true);
- }
- if (split.k2.negative) {
- split.k2.ineg();
- beta = beta.neg(true);
- }
- npoints[i * 2] = p;
- npoints[i * 2 + 1] = beta;
- ncoeffs[i * 2] = split.k1;
- ncoeffs[i * 2 + 1] = split.k2;
- }
- var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult);
- for (var j = 0;j < i * 2; j++) {
- npoints[j] = null;
- ncoeffs[j] = null;
- }
- return res;
- };
- function Point(curve, x, y, isRed) {
- Base.BasePoint.call(this, curve, "affine");
- if (x === null && y === null) {
- this.x = null;
- this.y = null;
- this.inf = true;
- } else {
- this.x = new BN(x, 16);
- this.y = new BN(y, 16);
- if (isRed) {
- this.x.forceRed(this.curve.red);
- this.y.forceRed(this.curve.red);
- }
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.y.red)
- this.y = this.y.toRed(this.curve.red);
- this.inf = false;
- }
- }
- inherits(Point, Base.BasePoint);
- ShortCurve.prototype.point = function point(x, y, isRed) {
- return new Point(this, x, y, isRed);
- };
- ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) {
- return Point.fromJSON(this, obj, red);
- };
- Point.prototype._getBeta = function _getBeta() {
- if (!this.curve.endo)
- return;
- var pre = this.precomputed;
- if (pre && pre.beta)
- return pre.beta;
- var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);
- if (pre) {
- var curve = this.curve;
- var endoMul = function(p) {
- return curve.point(p.x.redMul(curve.endo.beta), p.y);
- };
- pre.beta = beta;
- beta.precomputed = {
- beta: null,
- naf: pre.naf && {
- wnd: pre.naf.wnd,
- points: pre.naf.points.map(endoMul)
- },
- doubles: pre.doubles && {
- step: pre.doubles.step,
- points: pre.doubles.points.map(endoMul)
- }
- };
- }
- return beta;
- };
- Point.prototype.toJSON = function toJSON() {
- if (!this.precomputed)
- return [this.x, this.y];
- return [this.x, this.y, this.precomputed && {
- doubles: this.precomputed.doubles && {
- step: this.precomputed.doubles.step,
- points: this.precomputed.doubles.points.slice(1)
- },
- naf: this.precomputed.naf && {
- wnd: this.precomputed.naf.wnd,
- points: this.precomputed.naf.points.slice(1)
- }
- }];
- };
- Point.fromJSON = function fromJSON(curve, obj, red) {
- if (typeof obj === "string")
- obj = JSON.parse(obj);
- var res = curve.point(obj[0], obj[1], red);
- if (!obj[2])
- return res;
- function obj2point(obj2) {
- return curve.point(obj2[0], obj2[1], red);
- }
- var pre = obj[2];
- res.precomputed = {
- beta: null,
- doubles: pre.doubles && {
- step: pre.doubles.step,
- points: [res].concat(pre.doubles.points.map(obj2point))
- },
- naf: pre.naf && {
- wnd: pre.naf.wnd,
- points: [res].concat(pre.naf.points.map(obj2point))
- }
- };
- return res;
- };
- Point.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- Point.prototype.isInfinity = function isInfinity() {
- return this.inf;
- };
- Point.prototype.add = function add(p) {
- if (this.inf)
- return p;
- if (p.inf)
- return this;
- if (this.eq(p))
- return this.dbl();
- if (this.neg().eq(p))
- return this.curve.point(null, null);
- if (this.x.cmp(p.x) === 0)
- return this.curve.point(null, null);
- var c = this.y.redSub(p.y);
- if (c.cmpn(0) !== 0)
- c = c.redMul(this.x.redSub(p.x).redInvm());
- var nx = c.redSqr().redISub(this.x).redISub(p.x);
- var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
- return this.curve.point(nx, ny);
- };
- Point.prototype.dbl = function dbl() {
- if (this.inf)
- return this;
- var ys1 = this.y.redAdd(this.y);
- if (ys1.cmpn(0) === 0)
- return this.curve.point(null, null);
- var a = this.curve.a;
- var x2 = this.x.redSqr();
- var dyinv = ys1.redInvm();
- var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv);
- var nx = c.redSqr().redISub(this.x.redAdd(this.x));
- var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
- return this.curve.point(nx, ny);
- };
- Point.prototype.getX = function getX() {
- return this.x.fromRed();
- };
- Point.prototype.getY = function getY() {
- return this.y.fromRed();
- };
- Point.prototype.mul = function mul(k) {
- k = new BN(k, 16);
- if (this.isInfinity())
- return this;
- else if (this._hasDoubles(k))
- return this.curve._fixedNafMul(this, k);
- else if (this.curve.endo)
- return this.curve._endoWnafMulAdd([this], [k]);
- else
- return this.curve._wnafMul(this, k);
- };
- Point.prototype.mulAdd = function mulAdd(k1, p2, k2) {
- var points = [this, p2];
- var coeffs = [k1, k2];
- if (this.curve.endo)
- return this.curve._endoWnafMulAdd(points, coeffs);
- else
- return this.curve._wnafMulAdd(1, points, coeffs, 2);
- };
- Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) {
- var points = [this, p2];
- var coeffs = [k1, k2];
- if (this.curve.endo)
- return this.curve._endoWnafMulAdd(points, coeffs, true);
- else
- return this.curve._wnafMulAdd(1, points, coeffs, 2, true);
- };
- Point.prototype.eq = function eq(p) {
- return this === p || this.inf === p.inf && (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0);
- };
- Point.prototype.neg = function neg(_precompute) {
- if (this.inf)
- return this;
- var res = this.curve.point(this.x, this.y.redNeg());
- if (_precompute && this.precomputed) {
- var pre = this.precomputed;
- var negate = function(p) {
- return p.neg();
- };
- res.precomputed = {
- naf: pre.naf && {
- wnd: pre.naf.wnd,
- points: pre.naf.points.map(negate)
- },
- doubles: pre.doubles && {
- step: pre.doubles.step,
- points: pre.doubles.points.map(negate)
- }
- };
- }
- return res;
- };
- Point.prototype.toJ = function toJ() {
- if (this.inf)
- return this.curve.jpoint(null, null, null);
- var res = this.curve.jpoint(this.x, this.y, this.curve.one);
- return res;
- };
- function JPoint(curve, x, y, z) {
- Base.BasePoint.call(this, curve, "jacobian");
- if (x === null && y === null && z === null) {
- this.x = this.curve.one;
- this.y = this.curve.one;
- this.z = new BN(0);
- } else {
- this.x = new BN(x, 16);
- this.y = new BN(y, 16);
- this.z = new BN(z, 16);
- }
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.y.red)
- this.y = this.y.toRed(this.curve.red);
- if (!this.z.red)
- this.z = this.z.toRed(this.curve.red);
- this.zOne = this.z === this.curve.one;
- }
- inherits(JPoint, Base.BasePoint);
- ShortCurve.prototype.jpoint = function jpoint(x, y, z) {
- return new JPoint(this, x, y, z);
- };
- JPoint.prototype.toP = function toP() {
- if (this.isInfinity())
- return this.curve.point(null, null);
- var zinv = this.z.redInvm();
- var zinv2 = zinv.redSqr();
- var ax = this.x.redMul(zinv2);
- var ay = this.y.redMul(zinv2).redMul(zinv);
- return this.curve.point(ax, ay);
- };
- JPoint.prototype.neg = function neg() {
- return this.curve.jpoint(this.x, this.y.redNeg(), this.z);
- };
- JPoint.prototype.add = function add(p) {
- if (this.isInfinity())
- return p;
- if (p.isInfinity())
- return this;
- var pz2 = p.z.redSqr();
- var z2 = this.z.redSqr();
- var u1 = this.x.redMul(pz2);
- var u2 = p.x.redMul(z2);
- var s1 = this.y.redMul(pz2.redMul(p.z));
- var s2 = p.y.redMul(z2.redMul(this.z));
- var h = u1.redSub(u2);
- var r = s1.redSub(s2);
- if (h.cmpn(0) === 0) {
- if (r.cmpn(0) !== 0)
- return this.curve.jpoint(null, null, null);
- else
- return this.dbl();
- }
- var h2 = h.redSqr();
- var h3 = h2.redMul(h);
- var v = u1.redMul(h2);
- var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
- var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
- var nz = this.z.redMul(p.z).redMul(h);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.mixedAdd = function mixedAdd(p) {
- if (this.isInfinity())
- return p.toJ();
- if (p.isInfinity())
- return this;
- var z2 = this.z.redSqr();
- var u1 = this.x;
- var u2 = p.x.redMul(z2);
- var s1 = this.y;
- var s2 = p.y.redMul(z2).redMul(this.z);
- var h = u1.redSub(u2);
- var r = s1.redSub(s2);
- if (h.cmpn(0) === 0) {
- if (r.cmpn(0) !== 0)
- return this.curve.jpoint(null, null, null);
- else
- return this.dbl();
- }
- var h2 = h.redSqr();
- var h3 = h2.redMul(h);
- var v = u1.redMul(h2);
- var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
- var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
- var nz = this.z.redMul(h);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.dblp = function dblp(pow) {
- if (pow === 0)
- return this;
- if (this.isInfinity())
- return this;
- if (!pow)
- return this.dbl();
- var i;
- if (this.curve.zeroA || this.curve.threeA) {
- var r = this;
- for (i = 0;i < pow; i++)
- r = r.dbl();
- return r;
- }
- var a = this.curve.a;
- var tinv = this.curve.tinv;
- var jx = this.x;
- var jy = this.y;
- var jz = this.z;
- var jz4 = jz.redSqr().redSqr();
- var jyd = jy.redAdd(jy);
- for (i = 0;i < pow; i++) {
- var jx2 = jx.redSqr();
- var jyd2 = jyd.redSqr();
- var jyd4 = jyd2.redSqr();
- var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));
- var t1 = jx.redMul(jyd2);
- var nx = c.redSqr().redISub(t1.redAdd(t1));
- var t2 = t1.redISub(nx);
- var dny = c.redMul(t2);
- dny = dny.redIAdd(dny).redISub(jyd4);
- var nz = jyd.redMul(jz);
- if (i + 1 < pow)
- jz4 = jz4.redMul(jyd4);
- jx = nx;
- jz = nz;
- jyd = dny;
- }
- return this.curve.jpoint(jx, jyd.redMul(tinv), jz);
- };
- JPoint.prototype.dbl = function dbl() {
- if (this.isInfinity())
- return this;
- if (this.curve.zeroA)
- return this._zeroDbl();
- else if (this.curve.threeA)
- return this._threeDbl();
- else
- return this._dbl();
- };
- JPoint.prototype._zeroDbl = function _zeroDbl() {
- var nx;
- var ny;
- var nz;
- if (this.zOne) {
- var xx = this.x.redSqr();
- var yy = this.y.redSqr();
- var yyyy = yy.redSqr();
- var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
- s = s.redIAdd(s);
- var m = xx.redAdd(xx).redIAdd(xx);
- var t = m.redSqr().redISub(s).redISub(s);
- var yyyy8 = yyyy.redIAdd(yyyy);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- nx = t;
- ny = m.redMul(s.redISub(t)).redISub(yyyy8);
- nz = this.y.redAdd(this.y);
- } else {
- var a = this.x.redSqr();
- var b = this.y.redSqr();
- var c = b.redSqr();
- var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c);
- d = d.redIAdd(d);
- var e = a.redAdd(a).redIAdd(a);
- var f = e.redSqr();
- var c8 = c.redIAdd(c);
- c8 = c8.redIAdd(c8);
- c8 = c8.redIAdd(c8);
- nx = f.redISub(d).redISub(d);
- ny = e.redMul(d.redISub(nx)).redISub(c8);
- nz = this.y.redMul(this.z);
- nz = nz.redIAdd(nz);
- }
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype._threeDbl = function _threeDbl() {
- var nx;
- var ny;
- var nz;
- if (this.zOne) {
- var xx = this.x.redSqr();
- var yy = this.y.redSqr();
- var yyyy = yy.redSqr();
- var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
- s = s.redIAdd(s);
- var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a);
- var t = m.redSqr().redISub(s).redISub(s);
- nx = t;
- var yyyy8 = yyyy.redIAdd(yyyy);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- ny = m.redMul(s.redISub(t)).redISub(yyyy8);
- nz = this.y.redAdd(this.y);
- } else {
- var delta = this.z.redSqr();
- var gamma = this.y.redSqr();
- var beta = this.x.redMul(gamma);
- var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta));
- alpha = alpha.redAdd(alpha).redIAdd(alpha);
- var beta4 = beta.redIAdd(beta);
- beta4 = beta4.redIAdd(beta4);
- var beta8 = beta4.redAdd(beta4);
- nx = alpha.redSqr().redISub(beta8);
- nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta);
- var ggamma8 = gamma.redSqr();
- ggamma8 = ggamma8.redIAdd(ggamma8);
- ggamma8 = ggamma8.redIAdd(ggamma8);
- ggamma8 = ggamma8.redIAdd(ggamma8);
- ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8);
- }
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype._dbl = function _dbl() {
- var a = this.curve.a;
- var jx = this.x;
- var jy = this.y;
- var jz = this.z;
- var jz4 = jz.redSqr().redSqr();
- var jx2 = jx.redSqr();
- var jy2 = jy.redSqr();
- var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));
- var jxd4 = jx.redAdd(jx);
- jxd4 = jxd4.redIAdd(jxd4);
- var t1 = jxd4.redMul(jy2);
- var nx = c.redSqr().redISub(t1.redAdd(t1));
- var t2 = t1.redISub(nx);
- var jyd8 = jy2.redSqr();
- jyd8 = jyd8.redIAdd(jyd8);
- jyd8 = jyd8.redIAdd(jyd8);
- jyd8 = jyd8.redIAdd(jyd8);
- var ny = c.redMul(t2).redISub(jyd8);
- var nz = jy.redAdd(jy).redMul(jz);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.trpl = function trpl() {
- if (!this.curve.zeroA)
- return this.dbl().add(this);
- var xx = this.x.redSqr();
- var yy = this.y.redSqr();
- var zz = this.z.redSqr();
- var yyyy = yy.redSqr();
- var m = xx.redAdd(xx).redIAdd(xx);
- var mm = m.redSqr();
- var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
- e = e.redIAdd(e);
- e = e.redAdd(e).redIAdd(e);
- e = e.redISub(mm);
- var ee = e.redSqr();
- var t = yyyy.redIAdd(yyyy);
- t = t.redIAdd(t);
- t = t.redIAdd(t);
- t = t.redIAdd(t);
- var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t);
- var yyu4 = yy.redMul(u);
- yyu4 = yyu4.redIAdd(yyu4);
- yyu4 = yyu4.redIAdd(yyu4);
- var nx = this.x.redMul(ee).redISub(yyu4);
- nx = nx.redIAdd(nx);
- nx = nx.redIAdd(nx);
- var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee)));
- ny = ny.redIAdd(ny);
- ny = ny.redIAdd(ny);
- ny = ny.redIAdd(ny);
- var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.mul = function mul(k, kbase) {
- k = new BN(k, kbase);
- return this.curve._wnafMul(this, k);
- };
- JPoint.prototype.eq = function eq(p) {
- if (p.type === "affine")
- return this.eq(p.toJ());
- if (this === p)
- return true;
- var z2 = this.z.redSqr();
- var pz2 = p.z.redSqr();
- if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0)
- return false;
- var z3 = z2.redMul(this.z);
- var pz3 = pz2.redMul(p.z);
- return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0;
- };
- JPoint.prototype.eqXToP = function eqXToP(x) {
- var zs = this.z.redSqr();
- var rx = x.toRed(this.curve.red).redMul(zs);
- if (this.x.cmp(rx) === 0)
- return true;
- var xc = x.clone();
- var t = this.curve.redN.redMul(zs);
- for (;; ) {
- xc.iadd(this.curve.n);
- if (xc.cmp(this.curve.p) >= 0)
- return false;
- rx.redIAdd(t);
- if (this.x.cmp(rx) === 0)
- return true;
- }
- };
- JPoint.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- JPoint.prototype.isInfinity = function isInfinity() {
- return this.z.cmpn(0) === 0;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/mont.js
-var require_mont = __commonJS((exports, module) => {
- var BN = require_bn();
- var inherits = require_inherits();
- var Base = require_base2();
- var utils = require_utils2();
- function MontCurve(conf) {
- Base.call(this, "mont", conf);
- this.a = new BN(conf.a, 16).toRed(this.red);
- this.b = new BN(conf.b, 16).toRed(this.red);
- this.i4 = new BN(4).toRed(this.red).redInvm();
- this.two = new BN(2).toRed(this.red);
- this.a24 = this.i4.redMul(this.a.redAdd(this.two));
- }
- inherits(MontCurve, Base);
- module.exports = MontCurve;
- MontCurve.prototype.validate = function validate(point) {
- var x = point.normalize().x;
- var x2 = x.redSqr();
- var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x);
- var y = rhs.redSqrt();
- return y.redSqr().cmp(rhs) === 0;
- };
- function Point(curve, x, z) {
- Base.BasePoint.call(this, curve, "projective");
- if (x === null && z === null) {
- this.x = this.curve.one;
- this.z = this.curve.zero;
- } else {
- this.x = new BN(x, 16);
- this.z = new BN(z, 16);
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.z.red)
- this.z = this.z.toRed(this.curve.red);
- }
- }
- inherits(Point, Base.BasePoint);
- MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
- return this.point(utils.toArray(bytes, enc), 1);
- };
- MontCurve.prototype.point = function point(x, z) {
- return new Point(this, x, z);
- };
- MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
- return Point.fromJSON(this, obj);
- };
- Point.prototype.precompute = function precompute() {};
- Point.prototype._encode = function _encode() {
- return this.getX().toArray("be", this.curve.p.byteLength());
- };
- Point.fromJSON = function fromJSON(curve, obj) {
- return new Point(curve, obj[0], obj[1] || curve.one);
- };
- Point.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- Point.prototype.isInfinity = function isInfinity() {
- return this.z.cmpn(0) === 0;
- };
- Point.prototype.dbl = function dbl() {
- var a = this.x.redAdd(this.z);
- var aa = a.redSqr();
- var b = this.x.redSub(this.z);
- var bb = b.redSqr();
- var c = aa.redSub(bb);
- var nx = aa.redMul(bb);
- var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c)));
- return this.curve.point(nx, nz);
- };
- Point.prototype.add = function add() {
- throw new Error("Not supported on Montgomery curve");
- };
- Point.prototype.diffAdd = function diffAdd(p, diff) {
- var a = this.x.redAdd(this.z);
- var b = this.x.redSub(this.z);
- var c = p.x.redAdd(p.z);
- var d = p.x.redSub(p.z);
- var da = d.redMul(a);
- var cb = c.redMul(b);
- var nx = diff.z.redMul(da.redAdd(cb).redSqr());
- var nz = diff.x.redMul(da.redISub(cb).redSqr());
- return this.curve.point(nx, nz);
- };
- Point.prototype.mul = function mul(k) {
- var t = k.clone();
- var a = this;
- var b = this.curve.point(null, null);
- var c = this;
- for (var bits = [];t.cmpn(0) !== 0; t.iushrn(1))
- bits.push(t.andln(1));
- for (var i = bits.length - 1;i >= 0; i--) {
- if (bits[i] === 0) {
- a = a.diffAdd(b, c);
- b = b.dbl();
- } else {
- b = a.diffAdd(b, c);
- a = a.dbl();
- }
- }
- return b;
- };
- Point.prototype.mulAdd = function mulAdd() {
- throw new Error("Not supported on Montgomery curve");
- };
- Point.prototype.jumlAdd = function jumlAdd() {
- throw new Error("Not supported on Montgomery curve");
- };
- Point.prototype.eq = function eq(other) {
- return this.getX().cmp(other.getX()) === 0;
- };
- Point.prototype.normalize = function normalize() {
- this.x = this.x.redMul(this.z.redInvm());
- this.z = this.curve.one;
- return this;
- };
- Point.prototype.getX = function getX() {
- this.normalize();
- return this.x.fromRed();
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/edwards.js
-var require_edwards = __commonJS((exports, module) => {
- var utils = require_utils2();
- var BN = require_bn();
- var inherits = require_inherits();
- var Base = require_base2();
- var assert = utils.assert;
- function EdwardsCurve(conf) {
- this.twisted = (conf.a | 0) !== 1;
- this.mOneA = this.twisted && (conf.a | 0) === -1;
- this.extended = this.mOneA;
- Base.call(this, "edwards", conf);
- this.a = new BN(conf.a, 16).umod(this.red.m);
- this.a = this.a.toRed(this.red);
- this.c = new BN(conf.c, 16).toRed(this.red);
- this.c2 = this.c.redSqr();
- this.d = new BN(conf.d, 16).toRed(this.red);
- this.dd = this.d.redAdd(this.d);
- assert(!this.twisted || this.c.fromRed().cmpn(1) === 0);
- this.oneC = (conf.c | 0) === 1;
- }
- inherits(EdwardsCurve, Base);
- module.exports = EdwardsCurve;
- EdwardsCurve.prototype._mulA = function _mulA(num) {
- if (this.mOneA)
- return num.redNeg();
- else
- return this.a.redMul(num);
- };
- EdwardsCurve.prototype._mulC = function _mulC(num) {
- if (this.oneC)
- return num;
- else
- return this.c.redMul(num);
- };
- EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) {
- return this.point(x, y, z, t);
- };
- EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) {
- x = new BN(x, 16);
- if (!x.red)
- x = x.toRed(this.red);
- var x2 = x.redSqr();
- var rhs = this.c2.redSub(this.a.redMul(x2));
- var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2));
- var y2 = rhs.redMul(lhs.redInvm());
- var y = y2.redSqrt();
- if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
- throw new Error("invalid point");
- var isOdd = y.fromRed().isOdd();
- if (odd && !isOdd || !odd && isOdd)
- y = y.redNeg();
- return this.point(x, y);
- };
- EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) {
- y = new BN(y, 16);
- if (!y.red)
- y = y.toRed(this.red);
- var y2 = y.redSqr();
- var lhs = y2.redSub(this.c2);
- var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a);
- var x2 = lhs.redMul(rhs.redInvm());
- if (x2.cmp(this.zero) === 0) {
- if (odd)
- throw new Error("invalid point");
- else
- return this.point(this.zero, y);
- }
- var x = x2.redSqrt();
- if (x.redSqr().redSub(x2).cmp(this.zero) !== 0)
- throw new Error("invalid point");
- if (x.fromRed().isOdd() !== odd)
- x = x.redNeg();
- return this.point(x, y);
- };
- EdwardsCurve.prototype.validate = function validate(point) {
- if (point.isInfinity())
- return true;
- point.normalize();
- var x2 = point.x.redSqr();
- var y2 = point.y.redSqr();
- var lhs = x2.redMul(this.a).redAdd(y2);
- var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2)));
- return lhs.cmp(rhs) === 0;
- };
- function Point(curve, x, y, z, t) {
- Base.BasePoint.call(this, curve, "projective");
- if (x === null && y === null && z === null) {
- this.x = this.curve.zero;
- this.y = this.curve.one;
- this.z = this.curve.one;
- this.t = this.curve.zero;
- this.zOne = true;
- } else {
- this.x = new BN(x, 16);
- this.y = new BN(y, 16);
- this.z = z ? new BN(z, 16) : this.curve.one;
- this.t = t && new BN(t, 16);
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.y.red)
- this.y = this.y.toRed(this.curve.red);
- if (!this.z.red)
- this.z = this.z.toRed(this.curve.red);
- if (this.t && !this.t.red)
- this.t = this.t.toRed(this.curve.red);
- this.zOne = this.z === this.curve.one;
- if (this.curve.extended && !this.t) {
- this.t = this.x.redMul(this.y);
- if (!this.zOne)
- this.t = this.t.redMul(this.z.redInvm());
- }
- }
- }
- inherits(Point, Base.BasePoint);
- EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
- return Point.fromJSON(this, obj);
- };
- EdwardsCurve.prototype.point = function point(x, y, z, t) {
- return new Point(this, x, y, z, t);
- };
- Point.fromJSON = function fromJSON(curve, obj) {
- return new Point(curve, obj[0], obj[1], obj[2]);
- };
- Point.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- Point.prototype.isInfinity = function isInfinity() {
- return this.x.cmpn(0) === 0 && (this.y.cmp(this.z) === 0 || this.zOne && this.y.cmp(this.curve.c) === 0);
- };
- Point.prototype._extDbl = function _extDbl() {
- var a = this.x.redSqr();
- var b = this.y.redSqr();
- var c = this.z.redSqr();
- c = c.redIAdd(c);
- var d = this.curve._mulA(a);
- var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b);
- var g = d.redAdd(b);
- var f = g.redSub(c);
- var h = d.redSub(b);
- var nx = e.redMul(f);
- var ny = g.redMul(h);
- var nt = e.redMul(h);
- var nz = f.redMul(g);
- return this.curve.point(nx, ny, nz, nt);
- };
- Point.prototype._projDbl = function _projDbl() {
- var b = this.x.redAdd(this.y).redSqr();
- var c = this.x.redSqr();
- var d = this.y.redSqr();
- var nx;
- var ny;
- var nz;
- var e;
- var h;
- var j;
- if (this.curve.twisted) {
- e = this.curve._mulA(c);
- var f = e.redAdd(d);
- if (this.zOne) {
- nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two));
- ny = f.redMul(e.redSub(d));
- nz = f.redSqr().redSub(f).redSub(f);
- } else {
- h = this.z.redSqr();
- j = f.redSub(h).redISub(h);
- nx = b.redSub(c).redISub(d).redMul(j);
- ny = f.redMul(e.redSub(d));
- nz = f.redMul(j);
- }
- } else {
- e = c.redAdd(d);
- h = this.curve._mulC(this.z).redSqr();
- j = e.redSub(h).redSub(h);
- nx = this.curve._mulC(b.redISub(e)).redMul(j);
- ny = this.curve._mulC(e).redMul(c.redISub(d));
- nz = e.redMul(j);
- }
- return this.curve.point(nx, ny, nz);
- };
- Point.prototype.dbl = function dbl() {
- if (this.isInfinity())
- return this;
- if (this.curve.extended)
- return this._extDbl();
- else
- return this._projDbl();
- };
- Point.prototype._extAdd = function _extAdd(p) {
- var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x));
- var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x));
- var c = this.t.redMul(this.curve.dd).redMul(p.t);
- var d = this.z.redMul(p.z.redAdd(p.z));
- var e = b.redSub(a);
- var f = d.redSub(c);
- var g = d.redAdd(c);
- var h = b.redAdd(a);
- var nx = e.redMul(f);
- var ny = g.redMul(h);
- var nt = e.redMul(h);
- var nz = f.redMul(g);
- return this.curve.point(nx, ny, nz, nt);
- };
- Point.prototype._projAdd = function _projAdd(p) {
- var a = this.z.redMul(p.z);
- var b = a.redSqr();
- var c = this.x.redMul(p.x);
- var d = this.y.redMul(p.y);
- var e = this.curve.d.redMul(c).redMul(d);
- var f = b.redSub(e);
- var g = b.redAdd(e);
- var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d);
- var nx = a.redMul(f).redMul(tmp);
- var ny;
- var nz;
- if (this.curve.twisted) {
- ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c)));
- nz = f.redMul(g);
- } else {
- ny = a.redMul(g).redMul(d.redSub(c));
- nz = this.curve._mulC(f).redMul(g);
- }
- return this.curve.point(nx, ny, nz);
- };
- Point.prototype.add = function add(p) {
- if (this.isInfinity())
- return p;
- if (p.isInfinity())
- return this;
- if (this.curve.extended)
- return this._extAdd(p);
- else
- return this._projAdd(p);
- };
- Point.prototype.mul = function mul(k) {
- if (this._hasDoubles(k))
- return this.curve._fixedNafMul(this, k);
- else
- return this.curve._wnafMul(this, k);
- };
- Point.prototype.mulAdd = function mulAdd(k1, p, k2) {
- return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, false);
- };
- Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) {
- return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, true);
- };
- Point.prototype.normalize = function normalize() {
- if (this.zOne)
- return this;
- var zi = this.z.redInvm();
- this.x = this.x.redMul(zi);
- this.y = this.y.redMul(zi);
- if (this.t)
- this.t = this.t.redMul(zi);
- this.z = this.curve.one;
- this.zOne = true;
- return this;
- };
- Point.prototype.neg = function neg() {
- return this.curve.point(this.x.redNeg(), this.y, this.z, this.t && this.t.redNeg());
- };
- Point.prototype.getX = function getX() {
- this.normalize();
- return this.x.fromRed();
- };
- Point.prototype.getY = function getY() {
- this.normalize();
- return this.y.fromRed();
- };
- Point.prototype.eq = function eq(other) {
- return this === other || this.getX().cmp(other.getX()) === 0 && this.getY().cmp(other.getY()) === 0;
- };
- Point.prototype.eqXToP = function eqXToP(x) {
- var rx = x.toRed(this.curve.red).redMul(this.z);
- if (this.x.cmp(rx) === 0)
- return true;
- var xc = x.clone();
- var t = this.curve.redN.redMul(this.z);
- for (;; ) {
- xc.iadd(this.curve.n);
- if (xc.cmp(this.curve.p) >= 0)
- return false;
- rx.redIAdd(t);
- if (this.x.cmp(rx) === 0)
- return true;
- }
- };
- Point.prototype.toP = Point.prototype.normalize;
- Point.prototype.mixedAdd = Point.prototype.add;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/index.js
-var require_curve = __commonJS((exports) => {
- var curve = exports;
- curve.base = require_base2();
- curve.short = require_short();
- curve.mont = require_mont();
- curve.edwards = require_edwards();
-});
-
-// ../eve/node_modules/hash.js/lib/hash/utils.js
-var require_utils3 = __commonJS((exports) => {
- var assert = require_minimalistic_assert();
- var inherits = require_inherits();
- exports.inherits = inherits;
- function isSurrogatePair(msg, i) {
- if ((msg.charCodeAt(i) & 64512) !== 55296) {
- return false;
- }
- if (i < 0 || i + 1 >= msg.length) {
- return false;
- }
- return (msg.charCodeAt(i + 1) & 64512) === 56320;
- }
- function toArray(msg, enc) {
- if (Array.isArray(msg))
- return msg.slice();
- if (!msg)
- return [];
- var res = [];
- if (typeof msg === "string") {
- if (!enc) {
- var p = 0;
- for (var i = 0;i < msg.length; i++) {
- var c = msg.charCodeAt(i);
- if (c < 128) {
- res[p++] = c;
- } else if (c < 2048) {
- res[p++] = c >> 6 | 192;
- res[p++] = c & 63 | 128;
- } else if (isSurrogatePair(msg, i)) {
- c = 65536 + ((c & 1023) << 10) + (msg.charCodeAt(++i) & 1023);
- res[p++] = c >> 18 | 240;
- res[p++] = c >> 12 & 63 | 128;
- res[p++] = c >> 6 & 63 | 128;
- res[p++] = c & 63 | 128;
- } else {
- res[p++] = c >> 12 | 224;
- res[p++] = c >> 6 & 63 | 128;
- res[p++] = c & 63 | 128;
- }
- }
- } else if (enc === "hex") {
- msg = msg.replace(/[^a-z0-9]+/ig, "");
- if (msg.length % 2 !== 0)
- msg = "0" + msg;
- for (i = 0;i < msg.length; i += 2)
- res.push(parseInt(msg[i] + msg[i + 1], 16));
- }
- } else {
- for (i = 0;i < msg.length; i++)
- res[i] = msg[i] | 0;
- }
- return res;
- }
- exports.toArray = toArray;
- function toHex(msg) {
- var res = "";
- for (var i = 0;i < msg.length; i++)
- res += zero2(msg[i].toString(16));
- return res;
- }
- exports.toHex = toHex;
- function htonl(w) {
- var res = w >>> 24 | w >>> 8 & 65280 | w << 8 & 16711680 | (w & 255) << 24;
- return res >>> 0;
- }
- exports.htonl = htonl;
- function toHex32(msg, endian) {
- var res = "";
- for (var i = 0;i < msg.length; i++) {
- var w = msg[i];
- if (endian === "little")
- w = htonl(w);
- res += zero8(w.toString(16));
- }
- return res;
- }
- exports.toHex32 = toHex32;
- function zero2(word) {
- if (word.length === 1)
- return "0" + word;
- else
- return word;
- }
- exports.zero2 = zero2;
- function zero8(word) {
- if (word.length === 7)
- return "0" + word;
- else if (word.length === 6)
- return "00" + word;
- else if (word.length === 5)
- return "000" + word;
- else if (word.length === 4)
- return "0000" + word;
- else if (word.length === 3)
- return "00000" + word;
- else if (word.length === 2)
- return "000000" + word;
- else if (word.length === 1)
- return "0000000" + word;
- else
- return word;
- }
- exports.zero8 = zero8;
- function join32(msg, start, end, endian) {
- var len = end - start;
- assert(len % 4 === 0);
- var res = new Array(len / 4);
- for (var i = 0, k = start;i < res.length; i++, k += 4) {
- var w;
- if (endian === "big")
- w = msg[k] << 24 | msg[k + 1] << 16 | msg[k + 2] << 8 | msg[k + 3];
- else
- w = msg[k + 3] << 24 | msg[k + 2] << 16 | msg[k + 1] << 8 | msg[k];
- res[i] = w >>> 0;
- }
- return res;
- }
- exports.join32 = join32;
- function split32(msg, endian) {
- var res = new Array(msg.length * 4);
- for (var i = 0, k = 0;i < msg.length; i++, k += 4) {
- var m = msg[i];
- if (endian === "big") {
- res[k] = m >>> 24;
- res[k + 1] = m >>> 16 & 255;
- res[k + 2] = m >>> 8 & 255;
- res[k + 3] = m & 255;
- } else {
- res[k + 3] = m >>> 24;
- res[k + 2] = m >>> 16 & 255;
- res[k + 1] = m >>> 8 & 255;
- res[k] = m & 255;
- }
- }
- return res;
- }
- exports.split32 = split32;
- function rotr32(w, b) {
- return w >>> b | w << 32 - b;
- }
- exports.rotr32 = rotr32;
- function rotl32(w, b) {
- return w << b | w >>> 32 - b;
- }
- exports.rotl32 = rotl32;
- function sum32(a, b) {
- return a + b >>> 0;
- }
- exports.sum32 = sum32;
- function sum32_3(a, b, c) {
- return a + b + c >>> 0;
- }
- exports.sum32_3 = sum32_3;
- function sum32_4(a, b, c, d) {
- return a + b + c + d >>> 0;
- }
- exports.sum32_4 = sum32_4;
- function sum32_5(a, b, c, d, e) {
- return a + b + c + d + e >>> 0;
- }
- exports.sum32_5 = sum32_5;
- function sum64(buf, pos, ah, al) {
- var bh = buf[pos];
- var bl = buf[pos + 1];
- var lo = al + bl >>> 0;
- var hi = (lo < al ? 1 : 0) + ah + bh;
- buf[pos] = hi >>> 0;
- buf[pos + 1] = lo;
- }
- exports.sum64 = sum64;
- function sum64_hi(ah, al, bh, bl) {
- var lo = al + bl >>> 0;
- var hi = (lo < al ? 1 : 0) + ah + bh;
- return hi >>> 0;
- }
- exports.sum64_hi = sum64_hi;
- function sum64_lo(ah, al, bh, bl) {
- var lo = al + bl;
- return lo >>> 0;
- }
- exports.sum64_lo = sum64_lo;
- function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) {
- var carry = 0;
- var lo = al;
- lo = lo + bl >>> 0;
- carry += lo < al ? 1 : 0;
- lo = lo + cl >>> 0;
- carry += lo < cl ? 1 : 0;
- lo = lo + dl >>> 0;
- carry += lo < dl ? 1 : 0;
- var hi = ah + bh + ch + dh + carry;
- return hi >>> 0;
- }
- exports.sum64_4_hi = sum64_4_hi;
- function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) {
- var lo = al + bl + cl + dl;
- return lo >>> 0;
- }
- exports.sum64_4_lo = sum64_4_lo;
- function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
- var carry = 0;
- var lo = al;
- lo = lo + bl >>> 0;
- carry += lo < al ? 1 : 0;
- lo = lo + cl >>> 0;
- carry += lo < cl ? 1 : 0;
- lo = lo + dl >>> 0;
- carry += lo < dl ? 1 : 0;
- lo = lo + el >>> 0;
- carry += lo < el ? 1 : 0;
- var hi = ah + bh + ch + dh + eh + carry;
- return hi >>> 0;
- }
- exports.sum64_5_hi = sum64_5_hi;
- function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
- var lo = al + bl + cl + dl + el;
- return lo >>> 0;
- }
- exports.sum64_5_lo = sum64_5_lo;
- function rotr64_hi(ah, al, num) {
- var r = al << 32 - num | ah >>> num;
- return r >>> 0;
- }
- exports.rotr64_hi = rotr64_hi;
- function rotr64_lo(ah, al, num) {
- var r = ah << 32 - num | al >>> num;
- return r >>> 0;
- }
- exports.rotr64_lo = rotr64_lo;
- function shr64_hi(ah, al, num) {
- return ah >>> num;
- }
- exports.shr64_hi = shr64_hi;
- function shr64_lo(ah, al, num) {
- var r = ah << 32 - num | al >>> num;
- return r >>> 0;
- }
- exports.shr64_lo = shr64_lo;
-});
-
-// ../eve/node_modules/hash.js/lib/hash/common.js
-var require_common = __commonJS((exports) => {
- var utils = require_utils3();
- var assert = require_minimalistic_assert();
- function BlockHash() {
- this.pending = null;
- this.pendingTotal = 0;
- this.blockSize = this.constructor.blockSize;
- this.outSize = this.constructor.outSize;
- this.hmacStrength = this.constructor.hmacStrength;
- this.padLength = this.constructor.padLength / 8;
- this.endian = "big";
- this._delta8 = this.blockSize / 8;
- this._delta32 = this.blockSize / 32;
- }
- exports.BlockHash = BlockHash;
- BlockHash.prototype.update = function update(msg, enc) {
- msg = utils.toArray(msg, enc);
- if (!this.pending)
- this.pending = msg;
- else
- this.pending = this.pending.concat(msg);
- this.pendingTotal += msg.length;
- if (this.pending.length >= this._delta8) {
- msg = this.pending;
- var r = msg.length % this._delta8;
- this.pending = msg.slice(msg.length - r, msg.length);
- if (this.pending.length === 0)
- this.pending = null;
- msg = utils.join32(msg, 0, msg.length - r, this.endian);
- for (var i = 0;i < msg.length; i += this._delta32)
- this._update(msg, i, i + this._delta32);
- }
- return this;
- };
- BlockHash.prototype.digest = function digest(enc) {
- this.update(this._pad());
- assert(this.pending === null);
- return this._digest(enc);
- };
- BlockHash.prototype._pad = function pad() {
- var len = this.pendingTotal;
- var bytes = this._delta8;
- var k = bytes - (len + this.padLength) % bytes;
- var res = new Array(k + this.padLength);
- res[0] = 128;
- for (var i = 1;i < k; i++)
- res[i] = 0;
- len <<= 3;
- if (this.endian === "big") {
- for (var t = 8;t < this.padLength; t++)
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = len >>> 24 & 255;
- res[i++] = len >>> 16 & 255;
- res[i++] = len >>> 8 & 255;
- res[i++] = len & 255;
- } else {
- res[i++] = len & 255;
- res[i++] = len >>> 8 & 255;
- res[i++] = len >>> 16 & 255;
- res[i++] = len >>> 24 & 255;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- for (t = 8;t < this.padLength; t++)
- res[i++] = 0;
- }
- return res;
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/common.js
-var require_common2 = __commonJS((exports) => {
- var utils = require_utils3();
- var rotr32 = utils.rotr32;
- function ft_1(s, x, y, z) {
- if (s === 0)
- return ch32(x, y, z);
- if (s === 1 || s === 3)
- return p32(x, y, z);
- if (s === 2)
- return maj32(x, y, z);
- }
- exports.ft_1 = ft_1;
- function ch32(x, y, z) {
- return x & y ^ ~x & z;
- }
- exports.ch32 = ch32;
- function maj32(x, y, z) {
- return x & y ^ x & z ^ y & z;
- }
- exports.maj32 = maj32;
- function p32(x, y, z) {
- return x ^ y ^ z;
- }
- exports.p32 = p32;
- function s0_256(x) {
- return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22);
- }
- exports.s0_256 = s0_256;
- function s1_256(x) {
- return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25);
- }
- exports.s1_256 = s1_256;
- function g0_256(x) {
- return rotr32(x, 7) ^ rotr32(x, 18) ^ x >>> 3;
- }
- exports.g0_256 = g0_256;
- function g1_256(x) {
- return rotr32(x, 17) ^ rotr32(x, 19) ^ x >>> 10;
- }
- exports.g1_256 = g1_256;
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/1.js
-var require_1 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var common = require_common();
- var shaCommon = require_common2();
- var rotl32 = utils.rotl32;
- var sum32 = utils.sum32;
- var sum32_5 = utils.sum32_5;
- var ft_1 = shaCommon.ft_1;
- var BlockHash = common.BlockHash;
- var sha1_K = [
- 1518500249,
- 1859775393,
- 2400959708,
- 3395469782
- ];
- function SHA1() {
- if (!(this instanceof SHA1))
- return new SHA1;
- BlockHash.call(this);
- this.h = [
- 1732584193,
- 4023233417,
- 2562383102,
- 271733878,
- 3285377520
- ];
- this.W = new Array(80);
- }
- utils.inherits(SHA1, BlockHash);
- module.exports = SHA1;
- SHA1.blockSize = 512;
- SHA1.outSize = 160;
- SHA1.hmacStrength = 80;
- SHA1.padLength = 64;
- SHA1.prototype._update = function _update(msg, start) {
- var W = this.W;
- for (var i = 0;i < 16; i++)
- W[i] = msg[start + i];
- for (;i < W.length; i++)
- W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
- var a = this.h[0];
- var b = this.h[1];
- var c = this.h[2];
- var d = this.h[3];
- var e = this.h[4];
- for (i = 0;i < W.length; i++) {
- var s = ~~(i / 20);
- var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]);
- e = d;
- d = c;
- c = rotl32(b, 30);
- b = a;
- a = t;
- }
- this.h[0] = sum32(this.h[0], a);
- this.h[1] = sum32(this.h[1], b);
- this.h[2] = sum32(this.h[2], c);
- this.h[3] = sum32(this.h[3], d);
- this.h[4] = sum32(this.h[4], e);
- };
- SHA1.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "big");
- else
- return utils.split32(this.h, "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/256.js
-var require_256 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var common = require_common();
- var shaCommon = require_common2();
- var assert = require_minimalistic_assert();
- var sum32 = utils.sum32;
- var sum32_4 = utils.sum32_4;
- var sum32_5 = utils.sum32_5;
- var ch32 = shaCommon.ch32;
- var maj32 = shaCommon.maj32;
- var s0_256 = shaCommon.s0_256;
- var s1_256 = shaCommon.s1_256;
- var g0_256 = shaCommon.g0_256;
- var g1_256 = shaCommon.g1_256;
- var BlockHash = common.BlockHash;
- var sha256_K = [
- 1116352408,
- 1899447441,
- 3049323471,
- 3921009573,
- 961987163,
- 1508970993,
- 2453635748,
- 2870763221,
- 3624381080,
- 310598401,
- 607225278,
- 1426881987,
- 1925078388,
- 2162078206,
- 2614888103,
- 3248222580,
- 3835390401,
- 4022224774,
- 264347078,
- 604807628,
- 770255983,
- 1249150122,
- 1555081692,
- 1996064986,
- 2554220882,
- 2821834349,
- 2952996808,
- 3210313671,
- 3336571891,
- 3584528711,
- 113926993,
- 338241895,
- 666307205,
- 773529912,
- 1294757372,
- 1396182291,
- 1695183700,
- 1986661051,
- 2177026350,
- 2456956037,
- 2730485921,
- 2820302411,
- 3259730800,
- 3345764771,
- 3516065817,
- 3600352804,
- 4094571909,
- 275423344,
- 430227734,
- 506948616,
- 659060556,
- 883997877,
- 958139571,
- 1322822218,
- 1537002063,
- 1747873779,
- 1955562222,
- 2024104815,
- 2227730452,
- 2361852424,
- 2428436474,
- 2756734187,
- 3204031479,
- 3329325298
- ];
- function SHA256() {
- if (!(this instanceof SHA256))
- return new SHA256;
- BlockHash.call(this);
- this.h = [
- 1779033703,
- 3144134277,
- 1013904242,
- 2773480762,
- 1359893119,
- 2600822924,
- 528734635,
- 1541459225
- ];
- this.k = sha256_K;
- this.W = new Array(64);
- }
- utils.inherits(SHA256, BlockHash);
- module.exports = SHA256;
- SHA256.blockSize = 512;
- SHA256.outSize = 256;
- SHA256.hmacStrength = 192;
- SHA256.padLength = 64;
- SHA256.prototype._update = function _update(msg, start) {
- var W = this.W;
- for (var i = 0;i < 16; i++)
- W[i] = msg[start + i];
- for (;i < W.length; i++)
- W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]);
- var a = this.h[0];
- var b = this.h[1];
- var c = this.h[2];
- var d = this.h[3];
- var e = this.h[4];
- var f = this.h[5];
- var g = this.h[6];
- var h = this.h[7];
- assert(this.k.length === W.length);
- for (i = 0;i < W.length; i++) {
- var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]);
- var T2 = sum32(s0_256(a), maj32(a, b, c));
- h = g;
- g = f;
- f = e;
- e = sum32(d, T1);
- d = c;
- c = b;
- b = a;
- a = sum32(T1, T2);
- }
- this.h[0] = sum32(this.h[0], a);
- this.h[1] = sum32(this.h[1], b);
- this.h[2] = sum32(this.h[2], c);
- this.h[3] = sum32(this.h[3], d);
- this.h[4] = sum32(this.h[4], e);
- this.h[5] = sum32(this.h[5], f);
- this.h[6] = sum32(this.h[6], g);
- this.h[7] = sum32(this.h[7], h);
- };
- SHA256.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "big");
- else
- return utils.split32(this.h, "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/224.js
-var require_224 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var SHA256 = require_256();
- function SHA224() {
- if (!(this instanceof SHA224))
- return new SHA224;
- SHA256.call(this);
- this.h = [
- 3238371032,
- 914150663,
- 812702999,
- 4144912697,
- 4290775857,
- 1750603025,
- 1694076839,
- 3204075428
- ];
- }
- utils.inherits(SHA224, SHA256);
- module.exports = SHA224;
- SHA224.blockSize = 512;
- SHA224.outSize = 224;
- SHA224.hmacStrength = 192;
- SHA224.padLength = 64;
- SHA224.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h.slice(0, 7), "big");
- else
- return utils.split32(this.h.slice(0, 7), "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/512.js
-var require_512 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var common = require_common();
- var assert = require_minimalistic_assert();
- var rotr64_hi = utils.rotr64_hi;
- var rotr64_lo = utils.rotr64_lo;
- var shr64_hi = utils.shr64_hi;
- var shr64_lo = utils.shr64_lo;
- var sum64 = utils.sum64;
- var sum64_hi = utils.sum64_hi;
- var sum64_lo = utils.sum64_lo;
- var sum64_4_hi = utils.sum64_4_hi;
- var sum64_4_lo = utils.sum64_4_lo;
- var sum64_5_hi = utils.sum64_5_hi;
- var sum64_5_lo = utils.sum64_5_lo;
- var BlockHash = common.BlockHash;
- var sha512_K = [
- 1116352408,
- 3609767458,
- 1899447441,
- 602891725,
- 3049323471,
- 3964484399,
- 3921009573,
- 2173295548,
- 961987163,
- 4081628472,
- 1508970993,
- 3053834265,
- 2453635748,
- 2937671579,
- 2870763221,
- 3664609560,
- 3624381080,
- 2734883394,
- 310598401,
- 1164996542,
- 607225278,
- 1323610764,
- 1426881987,
- 3590304994,
- 1925078388,
- 4068182383,
- 2162078206,
- 991336113,
- 2614888103,
- 633803317,
- 3248222580,
- 3479774868,
- 3835390401,
- 2666613458,
- 4022224774,
- 944711139,
- 264347078,
- 2341262773,
- 604807628,
- 2007800933,
- 770255983,
- 1495990901,
- 1249150122,
- 1856431235,
- 1555081692,
- 3175218132,
- 1996064986,
- 2198950837,
- 2554220882,
- 3999719339,
- 2821834349,
- 766784016,
- 2952996808,
- 2566594879,
- 3210313671,
- 3203337956,
- 3336571891,
- 1034457026,
- 3584528711,
- 2466948901,
- 113926993,
- 3758326383,
- 338241895,
- 168717936,
- 666307205,
- 1188179964,
- 773529912,
- 1546045734,
- 1294757372,
- 1522805485,
- 1396182291,
- 2643833823,
- 1695183700,
- 2343527390,
- 1986661051,
- 1014477480,
- 2177026350,
- 1206759142,
- 2456956037,
- 344077627,
- 2730485921,
- 1290863460,
- 2820302411,
- 3158454273,
- 3259730800,
- 3505952657,
- 3345764771,
- 106217008,
- 3516065817,
- 3606008344,
- 3600352804,
- 1432725776,
- 4094571909,
- 1467031594,
- 275423344,
- 851169720,
- 430227734,
- 3100823752,
- 506948616,
- 1363258195,
- 659060556,
- 3750685593,
- 883997877,
- 3785050280,
- 958139571,
- 3318307427,
- 1322822218,
- 3812723403,
- 1537002063,
- 2003034995,
- 1747873779,
- 3602036899,
- 1955562222,
- 1575990012,
- 2024104815,
- 1125592928,
- 2227730452,
- 2716904306,
- 2361852424,
- 442776044,
- 2428436474,
- 593698344,
- 2756734187,
- 3733110249,
- 3204031479,
- 2999351573,
- 3329325298,
- 3815920427,
- 3391569614,
- 3928383900,
- 3515267271,
- 566280711,
- 3940187606,
- 3454069534,
- 4118630271,
- 4000239992,
- 116418474,
- 1914138554,
- 174292421,
- 2731055270,
- 289380356,
- 3203993006,
- 460393269,
- 320620315,
- 685471733,
- 587496836,
- 852142971,
- 1086792851,
- 1017036298,
- 365543100,
- 1126000580,
- 2618297676,
- 1288033470,
- 3409855158,
- 1501505948,
- 4234509866,
- 1607167915,
- 987167468,
- 1816402316,
- 1246189591
- ];
- function SHA512() {
- if (!(this instanceof SHA512))
- return new SHA512;
- BlockHash.call(this);
- this.h = [
- 1779033703,
- 4089235720,
- 3144134277,
- 2227873595,
- 1013904242,
- 4271175723,
- 2773480762,
- 1595750129,
- 1359893119,
- 2917565137,
- 2600822924,
- 725511199,
- 528734635,
- 4215389547,
- 1541459225,
- 327033209
- ];
- this.k = sha512_K;
- this.W = new Array(160);
- }
- utils.inherits(SHA512, BlockHash);
- module.exports = SHA512;
- SHA512.blockSize = 1024;
- SHA512.outSize = 512;
- SHA512.hmacStrength = 192;
- SHA512.padLength = 128;
- SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) {
- var W = this.W;
- for (var i = 0;i < 32; i++)
- W[i] = msg[start + i];
- for (;i < W.length; i += 2) {
- var c0_hi = g1_512_hi(W[i - 4], W[i - 3]);
- var c0_lo = g1_512_lo(W[i - 4], W[i - 3]);
- var c1_hi = W[i - 14];
- var c1_lo = W[i - 13];
- var c2_hi = g0_512_hi(W[i - 30], W[i - 29]);
- var c2_lo = g0_512_lo(W[i - 30], W[i - 29]);
- var c3_hi = W[i - 32];
- var c3_lo = W[i - 31];
- W[i] = sum64_4_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo);
- W[i + 1] = sum64_4_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo);
- }
- };
- SHA512.prototype._update = function _update(msg, start) {
- this._prepareBlock(msg, start);
- var W = this.W;
- var ah = this.h[0];
- var al = this.h[1];
- var bh = this.h[2];
- var bl = this.h[3];
- var ch = this.h[4];
- var cl = this.h[5];
- var dh = this.h[6];
- var dl = this.h[7];
- var eh = this.h[8];
- var el = this.h[9];
- var fh = this.h[10];
- var fl = this.h[11];
- var gh = this.h[12];
- var gl = this.h[13];
- var hh = this.h[14];
- var hl = this.h[15];
- assert(this.k.length === W.length);
- for (var i = 0;i < W.length; i += 2) {
- var c0_hi = hh;
- var c0_lo = hl;
- var c1_hi = s1_512_hi(eh, el);
- var c1_lo = s1_512_lo(eh, el);
- var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl);
- var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl);
- var c3_hi = this.k[i];
- var c3_lo = this.k[i + 1];
- var c4_hi = W[i];
- var c4_lo = W[i + 1];
- var T1_hi = sum64_5_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo);
- var T1_lo = sum64_5_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo);
- c0_hi = s0_512_hi(ah, al);
- c0_lo = s0_512_lo(ah, al);
- c1_hi = maj64_hi(ah, al, bh, bl, ch, cl);
- c1_lo = maj64_lo(ah, al, bh, bl, ch, cl);
- var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo);
- var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo);
- hh = gh;
- hl = gl;
- gh = fh;
- gl = fl;
- fh = eh;
- fl = el;
- eh = sum64_hi(dh, dl, T1_hi, T1_lo);
- el = sum64_lo(dl, dl, T1_hi, T1_lo);
- dh = ch;
- dl = cl;
- ch = bh;
- cl = bl;
- bh = ah;
- bl = al;
- ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo);
- al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo);
- }
- sum64(this.h, 0, ah, al);
- sum64(this.h, 2, bh, bl);
- sum64(this.h, 4, ch, cl);
- sum64(this.h, 6, dh, dl);
- sum64(this.h, 8, eh, el);
- sum64(this.h, 10, fh, fl);
- sum64(this.h, 12, gh, gl);
- sum64(this.h, 14, hh, hl);
- };
- SHA512.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "big");
- else
- return utils.split32(this.h, "big");
- };
- function ch64_hi(xh, xl, yh, yl, zh) {
- var r = xh & yh ^ ~xh & zh;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function ch64_lo(xh, xl, yh, yl, zh, zl) {
- var r = xl & yl ^ ~xl & zl;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function maj64_hi(xh, xl, yh, yl, zh) {
- var r = xh & yh ^ xh & zh ^ yh & zh;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function maj64_lo(xh, xl, yh, yl, zh, zl) {
- var r = xl & yl ^ xl & zl ^ yl & zl;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s0_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 28);
- var c1_hi = rotr64_hi(xl, xh, 2);
- var c2_hi = rotr64_hi(xl, xh, 7);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s0_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 28);
- var c1_lo = rotr64_lo(xl, xh, 2);
- var c2_lo = rotr64_lo(xl, xh, 7);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s1_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 14);
- var c1_hi = rotr64_hi(xh, xl, 18);
- var c2_hi = rotr64_hi(xl, xh, 9);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s1_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 14);
- var c1_lo = rotr64_lo(xh, xl, 18);
- var c2_lo = rotr64_lo(xl, xh, 9);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g0_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 1);
- var c1_hi = rotr64_hi(xh, xl, 8);
- var c2_hi = shr64_hi(xh, xl, 7);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g0_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 1);
- var c1_lo = rotr64_lo(xh, xl, 8);
- var c2_lo = shr64_lo(xh, xl, 7);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g1_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 19);
- var c1_hi = rotr64_hi(xl, xh, 29);
- var c2_hi = shr64_hi(xh, xl, 6);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g1_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 19);
- var c1_lo = rotr64_lo(xl, xh, 29);
- var c2_lo = shr64_lo(xh, xl, 6);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/384.js
-var require_384 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var SHA512 = require_512();
- function SHA384() {
- if (!(this instanceof SHA384))
- return new SHA384;
- SHA512.call(this);
- this.h = [
- 3418070365,
- 3238371032,
- 1654270250,
- 914150663,
- 2438529370,
- 812702999,
- 355462360,
- 4144912697,
- 1731405415,
- 4290775857,
- 2394180231,
- 1750603025,
- 3675008525,
- 1694076839,
- 1203062813,
- 3204075428
- ];
- }
- utils.inherits(SHA384, SHA512);
- module.exports = SHA384;
- SHA384.blockSize = 1024;
- SHA384.outSize = 384;
- SHA384.hmacStrength = 192;
- SHA384.padLength = 128;
- SHA384.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h.slice(0, 12), "big");
- else
- return utils.split32(this.h.slice(0, 12), "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha.js
-var require_sha = __commonJS((exports) => {
- exports.sha1 = require_1();
- exports.sha224 = require_224();
- exports.sha256 = require_256();
- exports.sha384 = require_384();
- exports.sha512 = require_512();
-});
-
-// ../eve/node_modules/hash.js/lib/hash/ripemd.js
-var require_ripemd = __commonJS((exports) => {
- var utils = require_utils3();
- var common = require_common();
- var rotl32 = utils.rotl32;
- var sum32 = utils.sum32;
- var sum32_3 = utils.sum32_3;
- var sum32_4 = utils.sum32_4;
- var BlockHash = common.BlockHash;
- function RIPEMD160() {
- if (!(this instanceof RIPEMD160))
- return new RIPEMD160;
- BlockHash.call(this);
- this.h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];
- this.endian = "little";
- }
- utils.inherits(RIPEMD160, BlockHash);
- exports.ripemd160 = RIPEMD160;
- RIPEMD160.blockSize = 512;
- RIPEMD160.outSize = 160;
- RIPEMD160.hmacStrength = 192;
- RIPEMD160.padLength = 64;
- RIPEMD160.prototype._update = function update(msg, start) {
- var A = this.h[0];
- var B = this.h[1];
- var C = this.h[2];
- var D = this.h[3];
- var E = this.h[4];
- var Ah = A;
- var Bh = B;
- var Ch = C;
- var Dh = D;
- var Eh = E;
- for (var j = 0;j < 80; j++) {
- var T = sum32(rotl32(sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), s[j]), E);
- A = E;
- E = D;
- D = rotl32(C, 10);
- C = B;
- B = T;
- T = sum32(rotl32(sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), sh[j]), Eh);
- Ah = Eh;
- Eh = Dh;
- Dh = rotl32(Ch, 10);
- Ch = Bh;
- Bh = T;
- }
- T = sum32_3(this.h[1], C, Dh);
- this.h[1] = sum32_3(this.h[2], D, Eh);
- this.h[2] = sum32_3(this.h[3], E, Ah);
- this.h[3] = sum32_3(this.h[4], A, Bh);
- this.h[4] = sum32_3(this.h[0], B, Ch);
- this.h[0] = T;
- };
- RIPEMD160.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "little");
- else
- return utils.split32(this.h, "little");
- };
- function f(j, x, y, z) {
- if (j <= 15)
- return x ^ y ^ z;
- else if (j <= 31)
- return x & y | ~x & z;
- else if (j <= 47)
- return (x | ~y) ^ z;
- else if (j <= 63)
- return x & z | y & ~z;
- else
- return x ^ (y | ~z);
- }
- function K(j) {
- if (j <= 15)
- return 0;
- else if (j <= 31)
- return 1518500249;
- else if (j <= 47)
- return 1859775393;
- else if (j <= 63)
- return 2400959708;
- else
- return 2840853838;
- }
- function Kh(j) {
- if (j <= 15)
- return 1352829926;
- else if (j <= 31)
- return 1548603684;
- else if (j <= 47)
- return 1836072691;
- else if (j <= 63)
- return 2053994217;
- else
- return 0;
- }
- var r = [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 7,
- 4,
- 13,
- 1,
- 10,
- 6,
- 15,
- 3,
- 12,
- 0,
- 9,
- 5,
- 2,
- 14,
- 11,
- 8,
- 3,
- 10,
- 14,
- 4,
- 9,
- 15,
- 8,
- 1,
- 2,
- 7,
- 0,
- 6,
- 13,
- 11,
- 5,
- 12,
- 1,
- 9,
- 11,
- 10,
- 0,
- 8,
- 12,
- 4,
- 13,
- 3,
- 7,
- 15,
- 14,
- 5,
- 6,
- 2,
- 4,
- 0,
- 5,
- 9,
- 7,
- 12,
- 2,
- 10,
- 14,
- 1,
- 3,
- 8,
- 11,
- 6,
- 15,
- 13
- ];
- var rh = [
- 5,
- 14,
- 7,
- 0,
- 9,
- 2,
- 11,
- 4,
- 13,
- 6,
- 15,
- 8,
- 1,
- 10,
- 3,
- 12,
- 6,
- 11,
- 3,
- 7,
- 0,
- 13,
- 5,
- 10,
- 14,
- 15,
- 8,
- 12,
- 4,
- 9,
- 1,
- 2,
- 15,
- 5,
- 1,
- 3,
- 7,
- 14,
- 6,
- 9,
- 11,
- 8,
- 12,
- 2,
- 10,
- 0,
- 4,
- 13,
- 8,
- 6,
- 4,
- 1,
- 3,
- 11,
- 15,
- 0,
- 5,
- 12,
- 2,
- 13,
- 9,
- 7,
- 10,
- 14,
- 12,
- 15,
- 10,
- 4,
- 1,
- 5,
- 8,
- 7,
- 6,
- 2,
- 13,
- 14,
- 0,
- 3,
- 9,
- 11
- ];
- var s = [
- 11,
- 14,
- 15,
- 12,
- 5,
- 8,
- 7,
- 9,
- 11,
- 13,
- 14,
- 15,
- 6,
- 7,
- 9,
- 8,
- 7,
- 6,
- 8,
- 13,
- 11,
- 9,
- 7,
- 15,
- 7,
- 12,
- 15,
- 9,
- 11,
- 7,
- 13,
- 12,
- 11,
- 13,
- 6,
- 7,
- 14,
- 9,
- 13,
- 15,
- 14,
- 8,
- 13,
- 6,
- 5,
- 12,
- 7,
- 5,
- 11,
- 12,
- 14,
- 15,
- 14,
- 15,
- 9,
- 8,
- 9,
- 14,
- 5,
- 6,
- 8,
- 6,
- 5,
- 12,
- 9,
- 15,
- 5,
- 11,
- 6,
- 8,
- 13,
- 12,
- 5,
- 12,
- 13,
- 14,
- 11,
- 8,
- 5,
- 6
- ];
- var sh = [
- 8,
- 9,
- 9,
- 11,
- 13,
- 15,
- 15,
- 5,
- 7,
- 7,
- 8,
- 11,
- 14,
- 14,
- 12,
- 6,
- 9,
- 13,
- 15,
- 7,
- 12,
- 8,
- 9,
- 11,
- 7,
- 7,
- 12,
- 7,
- 6,
- 15,
- 13,
- 11,
- 9,
- 7,
- 15,
- 11,
- 8,
- 6,
- 6,
- 14,
- 12,
- 13,
- 5,
- 14,
- 13,
- 13,
- 7,
- 5,
- 15,
- 5,
- 8,
- 11,
- 14,
- 14,
- 6,
- 14,
- 6,
- 9,
- 12,
- 9,
- 12,
- 5,
- 15,
- 8,
- 8,
- 5,
- 12,
- 9,
- 12,
- 5,
- 14,
- 6,
- 8,
- 13,
- 6,
- 5,
- 15,
- 13,
- 11,
- 11
- ];
-});
-
-// ../eve/node_modules/hash.js/lib/hash/hmac.js
-var require_hmac = __commonJS((exports, module) => {
- var utils = require_utils3();
- var assert = require_minimalistic_assert();
- function Hmac(hash, key, enc) {
- if (!(this instanceof Hmac))
- return new Hmac(hash, key, enc);
- this.Hash = hash;
- this.blockSize = hash.blockSize / 8;
- this.outSize = hash.outSize / 8;
- this.inner = null;
- this.outer = null;
- this._init(utils.toArray(key, enc));
- }
- module.exports = Hmac;
- Hmac.prototype._init = function init(key) {
- if (key.length > this.blockSize)
- key = new this.Hash().update(key).digest();
- assert(key.length <= this.blockSize);
- for (var i = key.length;i < this.blockSize; i++)
- key.push(0);
- for (i = 0;i < key.length; i++)
- key[i] ^= 54;
- this.inner = new this.Hash().update(key);
- for (i = 0;i < key.length; i++)
- key[i] ^= 106;
- this.outer = new this.Hash().update(key);
- };
- Hmac.prototype.update = function update(msg, enc) {
- this.inner.update(msg, enc);
- return this;
- };
- Hmac.prototype.digest = function digest(enc) {
- this.outer.update(this.inner.digest());
- return this.outer.digest(enc);
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash.js
-var require_hash = __commonJS((exports) => {
- var hash = exports;
- hash.utils = require_utils3();
- hash.common = require_common();
- hash.sha = require_sha();
- hash.ripemd = require_ripemd();
- hash.hmac = require_hmac();
- hash.sha1 = hash.sha.sha1;
- hash.sha256 = hash.sha.sha256;
- hash.sha224 = hash.sha.sha224;
- hash.sha384 = hash.sha.sha384;
- hash.sha512 = hash.sha.sha512;
- hash.ripemd160 = hash.ripemd.ripemd160;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js
-var require_secp256k1 = __commonJS((exports, module) => {
- module.exports = {
- doubles: {
- step: 4,
- points: [
- [
- "e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a",
- "f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821"
- ],
- [
- "8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508",
- "11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"
- ],
- [
- "175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739",
- "d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695"
- ],
- [
- "363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640",
- "4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9"
- ],
- [
- "8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c",
- "4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36"
- ],
- [
- "723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda",
- "96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f"
- ],
- [
- "eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa",
- "5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999"
- ],
- [
- "100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0",
- "cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09"
- ],
- [
- "e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d",
- "9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d"
- ],
- [
- "feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d",
- "e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088"
- ],
- [
- "da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1",
- "9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d"
- ],
- [
- "53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0",
- "5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8"
- ],
- [
- "8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047",
- "10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a"
- ],
- [
- "385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862",
- "283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453"
- ],
- [
- "6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7",
- "7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160"
- ],
- [
- "3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd",
- "56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0"
- ],
- [
- "85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83",
- "7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6"
- ],
- [
- "948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a",
- "53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589"
- ],
- [
- "6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8",
- "bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17"
- ],
- [
- "e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d",
- "4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda"
- ],
- [
- "e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725",
- "7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd"
- ],
- [
- "213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754",
- "4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2"
- ],
- [
- "4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c",
- "17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6"
- ],
- [
- "fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6",
- "6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f"
- ],
- [
- "76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39",
- "c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01"
- ],
- [
- "c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891",
- "893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3"
- ],
- [
- "d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b",
- "febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f"
- ],
- [
- "b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03",
- "2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7"
- ],
- [
- "e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d",
- "eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78"
- ],
- [
- "a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070",
- "7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1"
- ],
- [
- "90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4",
- "e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150"
- ],
- [
- "8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da",
- "662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82"
- ],
- [
- "e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11",
- "1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc"
- ],
- [
- "8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e",
- "efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b"
- ],
- [
- "e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41",
- "2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51"
- ],
- [
- "b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef",
- "67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45"
- ],
- [
- "d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8",
- "db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120"
- ],
- [
- "324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d",
- "648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84"
- ],
- [
- "4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96",
- "35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d"
- ],
- [
- "9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd",
- "ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d"
- ],
- [
- "6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5",
- "9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8"
- ],
- [
- "a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266",
- "40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8"
- ],
- [
- "7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71",
- "34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac"
- ],
- [
- "928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac",
- "c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f"
- ],
- [
- "85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751",
- "1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962"
- ],
- [
- "ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e",
- "493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907"
- ],
- [
- "827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241",
- "c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec"
- ],
- [
- "eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3",
- "be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d"
- ],
- [
- "e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f",
- "4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414"
- ],
- [
- "1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19",
- "aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd"
- ],
- [
- "146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be",
- "b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0"
- ],
- [
- "fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9",
- "6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811"
- ],
- [
- "da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2",
- "8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1"
- ],
- [
- "a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13",
- "7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c"
- ],
- [
- "174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c",
- "ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73"
- ],
- [
- "959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba",
- "2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd"
- ],
- [
- "d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151",
- "e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405"
- ],
- [
- "64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073",
- "d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589"
- ],
- [
- "8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458",
- "38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e"
- ],
- [
- "13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b",
- "69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27"
- ],
- [
- "bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366",
- "d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1"
- ],
- [
- "8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa",
- "40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482"
- ],
- [
- "8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0",
- "620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945"
- ],
- [
- "dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787",
- "7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573"
- ],
- [
- "f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e",
- "ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82"
- ]
- ]
- },
- naf: {
- wnd: 7,
- points: [
- [
- "f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9",
- "388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672"
- ],
- [
- "2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4",
- "d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6"
- ],
- [
- "5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc",
- "6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da"
- ],
- [
- "acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe",
- "cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37"
- ],
- [
- "774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb",
- "d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b"
- ],
- [
- "f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8",
- "ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81"
- ],
- [
- "d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e",
- "581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58"
- ],
- [
- "defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34",
- "4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77"
- ],
- [
- "2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c",
- "85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a"
- ],
- [
- "352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5",
- "321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c"
- ],
- [
- "2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f",
- "2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67"
- ],
- [
- "9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714",
- "73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402"
- ],
- [
- "daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729",
- "a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55"
- ],
- [
- "c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db",
- "2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482"
- ],
- [
- "6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4",
- "e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82"
- ],
- [
- "1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5",
- "b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396"
- ],
- [
- "605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479",
- "2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49"
- ],
- [
- "62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d",
- "80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf"
- ],
- [
- "80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f",
- "1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a"
- ],
- [
- "7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb",
- "d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7"
- ],
- [
- "d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9",
- "eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933"
- ],
- [
- "49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963",
- "758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a"
- ],
- [
- "77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74",
- "958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6"
- ],
- [
- "f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530",
- "e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37"
- ],
- [
- "463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b",
- "5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e"
- ],
- [
- "f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247",
- "cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6"
- ],
- [
- "caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1",
- "cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476"
- ],
- [
- "2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120",
- "4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40"
- ],
- [
- "7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435",
- "91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61"
- ],
- [
- "754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18",
- "673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683"
- ],
- [
- "e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8",
- "59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5"
- ],
- [
- "186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb",
- "3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b"
- ],
- [
- "df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f",
- "55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417"
- ],
- [
- "5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143",
- "efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868"
- ],
- [
- "290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba",
- "e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a"
- ],
- [
- "af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45",
- "f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6"
- ],
- [
- "766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a",
- "744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996"
- ],
- [
- "59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e",
- "c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e"
- ],
- [
- "f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8",
- "e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d"
- ],
- [
- "7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c",
- "30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2"
- ],
- [
- "948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519",
- "e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e"
- ],
- [
- "7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab",
- "100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437"
- ],
- [
- "3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca",
- "ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311"
- ],
- [
- "d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf",
- "8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4"
- ],
- [
- "1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610",
- "68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575"
- ],
- [
- "733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4",
- "f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d"
- ],
- [
- "15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c",
- "d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d"
- ],
- [
- "a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940",
- "edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629"
- ],
- [
- "e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980",
- "a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06"
- ],
- [
- "311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3",
- "66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374"
- ],
- [
- "34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf",
- "9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee"
- ],
- [
- "f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63",
- "4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1"
- ],
- [
- "d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448",
- "fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b"
- ],
- [
- "32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf",
- "5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661"
- ],
- [
- "7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5",
- "8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6"
- ],
- [
- "ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6",
- "8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e"
- ],
- [
- "16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5",
- "5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d"
- ],
- [
- "eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99",
- "f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc"
- ],
- [
- "78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51",
- "f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4"
- ],
- [
- "494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5",
- "42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c"
- ],
- [
- "a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5",
- "204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b"
- ],
- [
- "c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997",
- "4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913"
- ],
- [
- "841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881",
- "73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154"
- ],
- [
- "5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5",
- "39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865"
- ],
- [
- "36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66",
- "d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc"
- ],
- [
- "336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726",
- "ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224"
- ],
- [
- "8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede",
- "6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e"
- ],
- [
- "1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94",
- "60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6"
- ],
- [
- "85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31",
- "3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511"
- ],
- [
- "29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51",
- "b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b"
- ],
- [
- "a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252",
- "ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2"
- ],
- [
- "4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5",
- "cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c"
- ],
- [
- "d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b",
- "6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3"
- ],
- [
- "ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4",
- "322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d"
- ],
- [
- "af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f",
- "6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700"
- ],
- [
- "e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889",
- "2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4"
- ],
- [
- "591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246",
- "b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196"
- ],
- [
- "11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984",
- "998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4"
- ],
- [
- "3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a",
- "b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257"
- ],
- [
- "cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030",
- "bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13"
- ],
- [
- "c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197",
- "6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096"
- ],
- [
- "c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593",
- "c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38"
- ],
- [
- "a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef",
- "21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f"
- ],
- [
- "347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38",
- "60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448"
- ],
- [
- "da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a",
- "49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a"
- ],
- [
- "c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111",
- "5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4"
- ],
- [
- "4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502",
- "7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437"
- ],
- [
- "3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea",
- "be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7"
- ],
- [
- "cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26",
- "8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d"
- ],
- [
- "b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986",
- "39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a"
- ],
- [
- "d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e",
- "62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54"
- ],
- [
- "48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4",
- "25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77"
- ],
- [
- "dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda",
- "ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517"
- ],
- [
- "6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859",
- "cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10"
- ],
- [
- "e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f",
- "f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125"
- ],
- [
- "eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c",
- "6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e"
- ],
- [
- "13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942",
- "fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1"
- ],
- [
- "ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a",
- "1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2"
- ],
- [
- "b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80",
- "5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423"
- ],
- [
- "ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d",
- "438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8"
- ],
- [
- "8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1",
- "cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758"
- ],
- [
- "52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63",
- "c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375"
- ],
- [
- "e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352",
- "6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d"
- ],
- [
- "7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193",
- "ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec"
- ],
- [
- "5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00",
- "9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0"
- ],
- [
- "32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58",
- "ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c"
- ],
- [
- "e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7",
- "d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4"
- ],
- [
- "8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8",
- "c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f"
- ],
- [
- "4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e",
- "67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649"
- ],
- [
- "3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d",
- "cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826"
- ],
- [
- "674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b",
- "299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5"
- ],
- [
- "d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f",
- "f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87"
- ],
- [
- "30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6",
- "462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b"
- ],
- [
- "be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297",
- "62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc"
- ],
- [
- "93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a",
- "7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c"
- ],
- [
- "b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c",
- "ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f"
- ],
- [
- "d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52",
- "4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a"
- ],
- [
- "d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb",
- "bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46"
- ],
- [
- "463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065",
- "bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f"
- ],
- [
- "7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917",
- "603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03"
- ],
- [
- "74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9",
- "cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08"
- ],
- [
- "30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3",
- "553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8"
- ],
- [
- "9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57",
- "712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373"
- ],
- [
- "176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66",
- "ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3"
- ],
- [
- "75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8",
- "9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8"
- ],
- [
- "809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721",
- "9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1"
- ],
- [
- "1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180",
- "4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9"
- ]
- ]
- }
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curves.js
-var require_curves = __commonJS((exports) => {
- var curves = exports;
- var hash = require_hash();
- var curve = require_curve();
- var utils = require_utils2();
- var assert = utils.assert;
- function PresetCurve(options2) {
- if (options2.type === "short")
- this.curve = new curve.short(options2);
- else if (options2.type === "edwards")
- this.curve = new curve.edwards(options2);
- else
- this.curve = new curve.mont(options2);
- this.g = this.curve.g;
- this.n = this.curve.n;
- this.hash = options2.hash;
- assert(this.g.validate(), "Invalid curve");
- assert(this.g.mul(this.n).isInfinity(), "Invalid curve, G*N != O");
- }
- curves.PresetCurve = PresetCurve;
- function defineCurve(name, options2) {
- Object.defineProperty(curves, name, {
- configurable: true,
- enumerable: true,
- get: function() {
- var curve2 = new PresetCurve(options2);
- Object.defineProperty(curves, name, {
- configurable: true,
- enumerable: true,
- value: curve2
- });
- return curve2;
- }
- });
- }
- defineCurve("p192", {
- type: "short",
- prime: "p192",
- p: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff",
- a: "ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc",
- b: "64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1",
- n: "ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831",
- hash: hash.sha256,
- gRed: false,
- g: [
- "188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012",
- "07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"
- ]
- });
- defineCurve("p224", {
- type: "short",
- prime: "p224",
- p: "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001",
- a: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe",
- b: "b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4",
- n: "ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d",
- hash: hash.sha256,
- gRed: false,
- g: [
- "b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21",
- "bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"
- ]
- });
- defineCurve("p256", {
- type: "short",
- prime: null,
- p: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff",
- a: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc",
- b: "5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b",
- n: "ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551",
- hash: hash.sha256,
- gRed: false,
- g: [
- "6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296",
- "4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"
- ]
- });
- defineCurve("p384", {
- type: "short",
- prime: null,
- p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "fffffffe ffffffff 00000000 00000000 ffffffff",
- a: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "fffffffe ffffffff 00000000 00000000 fffffffc",
- b: "b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f " + "5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef",
- n: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 " + "f4372ddf 581a0db2 48b0a77a ecec196a ccc52973",
- hash: hash.sha384,
- gRed: false,
- g: [
- "aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 " + "5502f25d bf55296c 3a545e38 72760ab7",
- "3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 " + "0a60b1ce 1d7e819d 7a431d7c 90ea0e5f"
- ]
- });
- defineCurve("p521", {
- type: "short",
- prime: null,
- p: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff",
- a: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff fffffffc",
- b: "00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b " + "99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd " + "3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00",
- n: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 " + "f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409",
- hash: hash.sha512,
- gRed: false,
- g: [
- "000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 " + "053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 " + "a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66",
- "00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 " + "579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 " + "3fad0761 353c7086 a272c240 88be9476 9fd16650"
- ]
- });
- defineCurve("curve25519", {
- type: "mont",
- prime: "p25519",
- p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",
- a: "76d06",
- b: "1",
- n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",
- hash: hash.sha256,
- gRed: false,
- g: [
- "9"
- ]
- });
- defineCurve("ed25519", {
- type: "edwards",
- prime: "p25519",
- p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",
- a: "-1",
- c: "1",
- d: "52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3",
- n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",
- hash: hash.sha256,
- gRed: false,
- g: [
- "216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a",
- "6666666666666666666666666666666666666666666666666666666666666658"
- ]
- });
- var pre;
- try {
- pre = require_secp256k1();
- } catch (e) {
- pre = undefined;
- }
- defineCurve("secp256k1", {
- type: "short",
- prime: "k256",
- p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f",
- a: "0",
- b: "7",
- n: "ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141",
- h: "1",
- hash: hash.sha256,
- beta: "7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee",
- lambda: "5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72",
- basis: [
- {
- a: "3086d221a7d46bcde86c90e49284eb15",
- b: "-e4437ed6010e88286f547fa90abfe4c3"
- },
- {
- a: "114ca50f7a8e2f3f657c1108d9d44cfd8",
- b: "3086d221a7d46bcde86c90e49284eb15"
- }
- ],
- gRed: false,
- g: [
- "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
- "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
- pre
- ]
- });
-});
-
-// ../eve/node_modules/hmac-drbg/lib/hmac-drbg.js
-var require_hmac_drbg = __commonJS((exports, module) => {
- var hash = require_hash();
- var utils = require_utils();
- var assert = require_minimalistic_assert();
- function HmacDRBG(options2) {
- if (!(this instanceof HmacDRBG))
- return new HmacDRBG(options2);
- this.hash = options2.hash;
- this.predResist = !!options2.predResist;
- this.outLen = this.hash.outSize;
- this.minEntropy = options2.minEntropy || this.hash.hmacStrength;
- this._reseed = null;
- this.reseedInterval = null;
- this.K = null;
- this.V = null;
- var entropy = utils.toArray(options2.entropy, options2.entropyEnc || "hex");
- var nonce = utils.toArray(options2.nonce, options2.nonceEnc || "hex");
- var pers = utils.toArray(options2.pers, options2.persEnc || "hex");
- assert(entropy.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits");
- this._init(entropy, nonce, pers);
- }
- module.exports = HmacDRBG;
- HmacDRBG.prototype._init = function init(entropy, nonce, pers) {
- var seed = entropy.concat(nonce).concat(pers);
- this.K = new Array(this.outLen / 8);
- this.V = new Array(this.outLen / 8);
- for (var i = 0;i < this.V.length; i++) {
- this.K[i] = 0;
- this.V[i] = 1;
- }
- this._update(seed);
- this._reseed = 1;
- this.reseedInterval = 281474976710656;
- };
- HmacDRBG.prototype._hmac = function hmac() {
- return new hash.hmac(this.hash, this.K);
- };
- HmacDRBG.prototype._update = function update(seed) {
- var kmac = this._hmac().update(this.V).update([0]);
- if (seed)
- kmac = kmac.update(seed);
- this.K = kmac.digest();
- this.V = this._hmac().update(this.V).digest();
- if (!seed)
- return;
- this.K = this._hmac().update(this.V).update([1]).update(seed).digest();
- this.V = this._hmac().update(this.V).digest();
- };
- HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) {
- if (typeof entropyEnc !== "string") {
- addEnc = add;
- add = entropyEnc;
- entropyEnc = null;
- }
- entropy = utils.toArray(entropy, entropyEnc);
- add = utils.toArray(add, addEnc);
- assert(entropy.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits");
- this._update(entropy.concat(add || []));
- this._reseed = 1;
- };
- HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) {
- if (this._reseed > this.reseedInterval)
- throw new Error("Reseed is required");
- if (typeof enc !== "string") {
- addEnc = add;
- add = enc;
- enc = null;
- }
- if (add) {
- add = utils.toArray(add, addEnc || "hex");
- this._update(add);
- }
- var temp = [];
- while (temp.length < len) {
- this.V = this._hmac().update(this.V).digest();
- temp = temp.concat(this.V);
- }
- var res = temp.slice(0, len);
- this._update(add);
- this._reseed++;
- return utils.encode(res, enc);
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/ec/key.js
-var require_key = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var assert = utils.assert;
- function KeyPair(ec, options2) {
- this.ec = ec;
- this.priv = null;
- this.pub = null;
- if (options2.priv)
- this._importPrivate(options2.priv, options2.privEnc);
- if (options2.pub)
- this._importPublic(options2.pub, options2.pubEnc);
- }
- module.exports = KeyPair;
- KeyPair.fromPublic = function fromPublic(ec, pub, enc) {
- if (pub instanceof KeyPair)
- return pub;
- return new KeyPair(ec, {
- pub,
- pubEnc: enc
- });
- };
- KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) {
- if (priv instanceof KeyPair)
- return priv;
- return new KeyPair(ec, {
- priv,
- privEnc: enc
- });
- };
- KeyPair.prototype.validate = function validate() {
- var pub = this.getPublic();
- if (pub.isInfinity())
- return { result: false, reason: "Invalid public key" };
- if (!pub.validate())
- return { result: false, reason: "Public key is not a point" };
- if (!pub.mul(this.ec.curve.n).isInfinity())
- return { result: false, reason: "Public key * N != O" };
- return { result: true, reason: null };
- };
- KeyPair.prototype.getPublic = function getPublic(compact, enc) {
- if (typeof compact === "string") {
- enc = compact;
- compact = null;
- }
- if (!this.pub)
- this.pub = this.ec.g.mul(this.priv);
- if (!enc)
- return this.pub;
- return this.pub.encode(enc, compact);
- };
- KeyPair.prototype.getPrivate = function getPrivate(enc) {
- if (enc === "hex")
- return this.priv.toString(16, 2);
- else
- return this.priv;
- };
- KeyPair.prototype._importPrivate = function _importPrivate(key, enc) {
- this.priv = new BN(key, enc || 16);
- this.priv = this.priv.umod(this.ec.curve.n);
- };
- KeyPair.prototype._importPublic = function _importPublic(key, enc) {
- if (key.x || key.y) {
- if (this.ec.curve.type === "mont") {
- assert(key.x, "Need x coordinate");
- } else if (this.ec.curve.type === "short" || this.ec.curve.type === "edwards") {
- assert(key.x && key.y, "Need both x and y coordinate");
- }
- this.pub = this.ec.curve.point(key.x, key.y);
- return;
- }
- this.pub = this.ec.curve.decodePoint(key, enc);
- };
- KeyPair.prototype.derive = function derive(pub) {
- if (!pub.validate()) {
- assert(pub.validate(), "public point not validated");
- }
- return pub.mul(this.priv).getX();
- };
- KeyPair.prototype.sign = function sign(msg, enc, options2) {
- return this.ec.sign(msg, this, enc, options2);
- };
- KeyPair.prototype.verify = function verify(msg, signature, options2) {
- return this.ec.verify(msg, signature, this, undefined, options2);
- };
- KeyPair.prototype.inspect = function inspect() {
- return "";
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/ec/signature.js
-var require_signature = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var assert = utils.assert;
- function Signature(options2, enc) {
- if (options2 instanceof Signature)
- return options2;
- if (this._importDER(options2, enc))
- return;
- assert(options2.r && options2.s, "Signature without r or s");
- this.r = new BN(options2.r, 16);
- this.s = new BN(options2.s, 16);
- if (options2.recoveryParam === undefined)
- this.recoveryParam = null;
- else
- this.recoveryParam = options2.recoveryParam;
- }
- module.exports = Signature;
- function Position() {
- this.place = 0;
- }
- function getLength(buf, p) {
- var initial = buf[p.place++];
- if (!(initial & 128)) {
- return initial;
- }
- var octetLen = initial & 15;
- if (octetLen === 0 || octetLen > 4) {
- return false;
- }
- if (buf[p.place] === 0) {
- return false;
- }
- var val = 0;
- for (var i = 0, off = p.place;i < octetLen; i++, off++) {
- val <<= 8;
- val |= buf[off];
- val >>>= 0;
- }
- if (val <= 127) {
- return false;
- }
- p.place = off;
- return val;
- }
- function rmPadding(buf) {
- var i = 0;
- var len = buf.length - 1;
- while (!buf[i] && !(buf[i + 1] & 128) && i < len) {
- i++;
- }
- if (i === 0) {
- return buf;
- }
- return buf.slice(i);
- }
- Signature.prototype._importDER = function _importDER(data, enc) {
- data = utils.toArray(data, enc);
- var p = new Position;
- if (data[p.place++] !== 48) {
- return false;
- }
- var len = getLength(data, p);
- if (len === false) {
- return false;
- }
- if (len + p.place !== data.length) {
- return false;
- }
- if (data[p.place++] !== 2) {
- return false;
- }
- var rlen = getLength(data, p);
- if (rlen === false) {
- return false;
- }
- if ((data[p.place] & 128) !== 0) {
- return false;
- }
- var r = data.slice(p.place, rlen + p.place);
- p.place += rlen;
- if (data[p.place++] !== 2) {
- return false;
- }
- var slen = getLength(data, p);
- if (slen === false) {
- return false;
- }
- if (data.length !== slen + p.place) {
- return false;
- }
- if ((data[p.place] & 128) !== 0) {
- return false;
- }
- var s = data.slice(p.place, slen + p.place);
- if (r[0] === 0) {
- if (r[1] & 128) {
- r = r.slice(1);
- } else {
- return false;
- }
- }
- if (s[0] === 0) {
- if (s[1] & 128) {
- s = s.slice(1);
- } else {
- return false;
- }
- }
- this.r = new BN(r);
- this.s = new BN(s);
- this.recoveryParam = null;
- return true;
- };
- function constructLength(arr, len) {
- if (len < 128) {
- arr.push(len);
- return;
- }
- var octets = 1 + (Math.log(len) / Math.LN2 >>> 3);
- arr.push(octets | 128);
- while (--octets) {
- arr.push(len >>> (octets << 3) & 255);
- }
- arr.push(len);
- }
- Signature.prototype.toDER = function toDER(enc) {
- var r = this.r.toArray();
- var s = this.s.toArray();
- if (r[0] & 128)
- r = [0].concat(r);
- if (s[0] & 128)
- s = [0].concat(s);
- r = rmPadding(r);
- s = rmPadding(s);
- while (!s[0] && !(s[1] & 128)) {
- s = s.slice(1);
- }
- var arr = [2];
- constructLength(arr, r.length);
- arr = arr.concat(r);
- arr.push(2);
- constructLength(arr, s.length);
- var backHalf = arr.concat(s);
- var res = [48];
- constructLength(res, backHalf.length);
- res = res.concat(backHalf);
- return utils.encode(res, enc);
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/ec/index.js
-var require_ec = __commonJS((exports, module) => {
- var BN = require_bn();
- var HmacDRBG = require_hmac_drbg();
- var utils = require_utils2();
- var curves = require_curves();
- var rand = require_brorand();
- var assert = utils.assert;
- var KeyPair = require_key();
- var Signature = require_signature();
- function EC(options2) {
- if (!(this instanceof EC))
- return new EC(options2);
- if (typeof options2 === "string") {
- assert(Object.prototype.hasOwnProperty.call(curves, options2), "Unknown curve " + options2);
- options2 = curves[options2];
- }
- if (options2 instanceof curves.PresetCurve)
- options2 = { curve: options2 };
- this.curve = options2.curve.curve;
- this.n = this.curve.n;
- this.nh = this.n.ushrn(1);
- this.g = this.curve.g;
- this.g = options2.curve.g;
- this.g.precompute(options2.curve.n.bitLength() + 1);
- this.hash = options2.hash || options2.curve.hash;
- }
- module.exports = EC;
- EC.prototype.keyPair = function keyPair(options2) {
- return new KeyPair(this, options2);
- };
- EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) {
- return KeyPair.fromPrivate(this, priv, enc);
- };
- EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) {
- return KeyPair.fromPublic(this, pub, enc);
- };
- EC.prototype.genKeyPair = function genKeyPair(options2) {
- if (!options2)
- options2 = {};
- var drbg = new HmacDRBG({
- hash: this.hash,
- pers: options2.pers,
- persEnc: options2.persEnc || "utf8",
- entropy: options2.entropy || rand(this.hash.hmacStrength),
- entropyEnc: options2.entropy && options2.entropyEnc || "utf8",
- nonce: this.n.toArray()
- });
- var bytes = this.n.byteLength();
- var ns2 = this.n.sub(new BN(2));
- for (;; ) {
- var priv = new BN(drbg.generate(bytes));
- if (priv.cmp(ns2) > 0)
- continue;
- priv.iaddn(1);
- return this.keyFromPrivate(priv);
- }
- };
- EC.prototype._truncateToN = function _truncateToN(msg, truncOnly, bitLength) {
- var byteLength;
- if (BN.isBN(msg) || typeof msg === "number") {
- msg = new BN(msg, 16);
- byteLength = msg.byteLength();
- } else if (typeof msg === "object") {
- byteLength = msg.length;
- msg = new BN(msg, 16);
- } else {
- var str = msg.toString();
- byteLength = str.length + 1 >>> 1;
- msg = new BN(str, 16);
- }
- if (typeof bitLength !== "number") {
- bitLength = byteLength * 8;
- }
- var delta = bitLength - this.n.bitLength();
- if (delta > 0)
- msg = msg.ushrn(delta);
- if (!truncOnly && msg.cmp(this.n) >= 0)
- return msg.sub(this.n);
- else
- return msg;
- };
- EC.prototype.sign = function sign(msg, key, enc, options2) {
- if (typeof enc === "object") {
- options2 = enc;
- enc = null;
- }
- if (!options2)
- options2 = {};
- if (typeof msg !== "string" && typeof msg !== "number" && !BN.isBN(msg)) {
- assert(typeof msg === "object" && msg && typeof msg.length === "number", "Expected message to be an array-like, a hex string, or a BN instance");
- assert(msg.length >>> 0 === msg.length);
- for (var i = 0;i < msg.length; i++)
- assert((msg[i] & 255) === msg[i]);
- }
- key = this.keyFromPrivate(key, enc);
- msg = this._truncateToN(msg, false, options2.msgBitLength);
- assert(!msg.isNeg(), "Can not sign a negative message");
- var bytes = this.n.byteLength();
- var bkey = key.getPrivate().toArray("be", bytes);
- var nonce = msg.toArray("be", bytes);
- assert(new BN(nonce).eq(msg), "Can not sign message");
- var drbg = new HmacDRBG({
- hash: this.hash,
- entropy: bkey,
- nonce,
- pers: options2.pers,
- persEnc: options2.persEnc || "utf8"
- });
- var ns1 = this.n.sub(new BN(1));
- for (var iter = 0;; iter++) {
- var k = options2.k ? options2.k(iter) : new BN(drbg.generate(this.n.byteLength()));
- k = this._truncateToN(k, true);
- if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0)
- continue;
- var kp = this.g.mul(k);
- if (kp.isInfinity())
- continue;
- var kpX = kp.getX();
- var r = kpX.umod(this.n);
- if (r.cmpn(0) === 0)
- continue;
- var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg));
- s = s.umod(this.n);
- if (s.cmpn(0) === 0)
- continue;
- var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | (kpX.cmp(r) !== 0 ? 2 : 0);
- if (options2.canonical && s.cmp(this.nh) > 0) {
- s = this.n.sub(s);
- recoveryParam ^= 1;
- }
- return new Signature({ r, s, recoveryParam });
- }
- };
- EC.prototype.verify = function verify(msg, signature, key, enc, options2) {
- if (!options2)
- options2 = {};
- msg = this._truncateToN(msg, false, options2.msgBitLength);
- key = this.keyFromPublic(key, enc);
- signature = new Signature(signature, "hex");
- var r = signature.r;
- var s = signature.s;
- if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0)
- return false;
- if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0)
- return false;
- var sinv = s.invm(this.n);
- var u1 = sinv.mul(msg).umod(this.n);
- var u2 = sinv.mul(r).umod(this.n);
- var p;
- if (!this.curve._maxwellTrick) {
- p = this.g.mulAdd(u1, key.getPublic(), u2);
- if (p.isInfinity())
- return false;
- return p.getX().umod(this.n).cmp(r) === 0;
- }
- p = this.g.jmulAdd(u1, key.getPublic(), u2);
- if (p.isInfinity())
- return false;
- return p.eqXToP(r);
- };
- EC.prototype.recoverPubKey = function(msg, signature, j, enc) {
- assert((3 & j) === j, "The recovery param is more than two bits");
- signature = new Signature(signature, enc);
- var n = this.n;
- var e = new BN(msg);
- var r = signature.r;
- var s = signature.s;
- var isYOdd = j & 1;
- var isSecondKey = j >> 1;
- if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey)
- throw new Error("Unable to find sencond key candinate");
- if (isSecondKey)
- r = this.curve.pointFromX(r.add(this.curve.n), isYOdd);
- else
- r = this.curve.pointFromX(r, isYOdd);
- var rInv = signature.r.invm(n);
- var s1 = n.sub(e).mul(rInv).umod(n);
- var s2 = s.mul(rInv).umod(n);
- return this.g.mulAdd(s1, r, s2);
- };
- EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) {
- signature = new Signature(signature, enc);
- if (signature.recoveryParam !== null)
- return signature.recoveryParam;
- for (var i = 0;i < 4; i++) {
- var Qprime;
- try {
- Qprime = this.recoverPubKey(e, signature, i);
- } catch (e2) {
- continue;
- }
- if (Qprime.eq(Q))
- return i;
- }
- throw new Error("Unable to find valid recovery factor");
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/eddsa/key.js
-var require_key2 = __commonJS((exports, module) => {
- var utils = require_utils2();
- var assert = utils.assert;
- var parseBytes = utils.parseBytes;
- var cachedProperty = utils.cachedProperty;
- function KeyPair(eddsa, params) {
- this.eddsa = eddsa;
- this._secret = parseBytes(params.secret);
- if (eddsa.isPoint(params.pub))
- this._pub = params.pub;
- else
- this._pubBytes = parseBytes(params.pub);
- }
- KeyPair.fromPublic = function fromPublic(eddsa, pub) {
- if (pub instanceof KeyPair)
- return pub;
- return new KeyPair(eddsa, { pub });
- };
- KeyPair.fromSecret = function fromSecret(eddsa, secret) {
- if (secret instanceof KeyPair)
- return secret;
- return new KeyPair(eddsa, { secret });
- };
- KeyPair.prototype.secret = function secret() {
- return this._secret;
- };
- cachedProperty(KeyPair, "pubBytes", function pubBytes() {
- return this.eddsa.encodePoint(this.pub());
- });
- cachedProperty(KeyPair, "pub", function pub() {
- if (this._pubBytes)
- return this.eddsa.decodePoint(this._pubBytes);
- return this.eddsa.g.mul(this.priv());
- });
- cachedProperty(KeyPair, "privBytes", function privBytes() {
- var eddsa = this.eddsa;
- var hash = this.hash();
- var lastIx = eddsa.encodingLength - 1;
- var a = hash.slice(0, eddsa.encodingLength);
- a[0] &= 248;
- a[lastIx] &= 127;
- a[lastIx] |= 64;
- return a;
- });
- cachedProperty(KeyPair, "priv", function priv() {
- return this.eddsa.decodeInt(this.privBytes());
- });
- cachedProperty(KeyPair, "hash", function hash() {
- return this.eddsa.hash().update(this.secret()).digest();
- });
- cachedProperty(KeyPair, "messagePrefix", function messagePrefix() {
- return this.hash().slice(this.eddsa.encodingLength);
- });
- KeyPair.prototype.sign = function sign(message) {
- assert(this._secret, "KeyPair can only verify");
- return this.eddsa.sign(message, this);
- };
- KeyPair.prototype.verify = function verify(message, sig) {
- return this.eddsa.verify(message, sig, this);
- };
- KeyPair.prototype.getSecret = function getSecret(enc) {
- assert(this._secret, "KeyPair is public only");
- return utils.encode(this.secret(), enc);
- };
- KeyPair.prototype.getPublic = function getPublic(enc) {
- return utils.encode(this.pubBytes(), enc);
- };
- module.exports = KeyPair;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/eddsa/signature.js
-var require_signature2 = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var assert = utils.assert;
- var cachedProperty = utils.cachedProperty;
- var parseBytes = utils.parseBytes;
- function Signature(eddsa, sig) {
- this.eddsa = eddsa;
- if (typeof sig !== "object")
- sig = parseBytes(sig);
- if (Array.isArray(sig)) {
- assert(sig.length === eddsa.encodingLength * 2, "Signature has invalid size");
- sig = {
- R: sig.slice(0, eddsa.encodingLength),
- S: sig.slice(eddsa.encodingLength)
- };
- }
- assert(sig.R && sig.S, "Signature without R or S");
- if (eddsa.isPoint(sig.R))
- this._R = sig.R;
- if (sig.S instanceof BN)
- this._S = sig.S;
- this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded;
- this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded;
- }
- cachedProperty(Signature, "S", function S() {
- return this.eddsa.decodeInt(this.Sencoded());
- });
- cachedProperty(Signature, "R", function R() {
- return this.eddsa.decodePoint(this.Rencoded());
- });
- cachedProperty(Signature, "Rencoded", function Rencoded() {
- return this.eddsa.encodePoint(this.R());
- });
- cachedProperty(Signature, "Sencoded", function Sencoded() {
- return this.eddsa.encodeInt(this.S());
- });
- Signature.prototype.toBytes = function toBytes() {
- return this.Rencoded().concat(this.Sencoded());
- };
- Signature.prototype.toHex = function toHex() {
- return utils.encode(this.toBytes(), "hex").toUpperCase();
- };
- module.exports = Signature;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/eddsa/index.js
-var require_eddsa = __commonJS((exports, module) => {
- var hash = require_hash();
- var curves = require_curves();
- var utils = require_utils2();
- var assert = utils.assert;
- var parseBytes = utils.parseBytes;
- var KeyPair = require_key2();
- var Signature = require_signature2();
- function EDDSA(curve) {
- assert(curve === "ed25519", "only tested with ed25519 so far");
- if (!(this instanceof EDDSA))
- return new EDDSA(curve);
- curve = curves[curve].curve;
- this.curve = curve;
- this.g = curve.g;
- this.g.precompute(curve.n.bitLength() + 1);
- this.pointClass = curve.point().constructor;
- this.encodingLength = Math.ceil(curve.n.bitLength() / 8);
- this.hash = hash.sha512;
- }
- module.exports = EDDSA;
- EDDSA.prototype.sign = function sign(message, secret) {
- message = parseBytes(message);
- var key = this.keyFromSecret(secret);
- var r = this.hashInt(key.messagePrefix(), message);
- var R = this.g.mul(r);
- var Rencoded = this.encodePoint(R);
- var s_ = this.hashInt(Rencoded, key.pubBytes(), message).mul(key.priv());
- var S = r.add(s_).umod(this.curve.n);
- return this.makeSignature({ R, S, Rencoded });
- };
- EDDSA.prototype.verify = function verify(message, sig, pub) {
- message = parseBytes(message);
- sig = this.makeSignature(sig);
- if (sig.S().gte(sig.eddsa.curve.n) || sig.S().isNeg()) {
- return false;
- }
- var key = this.keyFromPublic(pub);
- var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message);
- var SG = this.g.mul(sig.S());
- var RplusAh = sig.R().add(key.pub().mul(h));
- return RplusAh.eq(SG);
- };
- EDDSA.prototype.hashInt = function hashInt() {
- var hash2 = this.hash();
- for (var i = 0;i < arguments.length; i++)
- hash2.update(arguments[i]);
- return utils.intFromLE(hash2.digest()).umod(this.curve.n);
- };
- EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) {
- return KeyPair.fromPublic(this, pub);
- };
- EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) {
- return KeyPair.fromSecret(this, secret);
- };
- EDDSA.prototype.makeSignature = function makeSignature(sig) {
- if (sig instanceof Signature)
- return sig;
- return new Signature(this, sig);
- };
- EDDSA.prototype.encodePoint = function encodePoint(point) {
- var enc = point.getY().toArray("le", this.encodingLength);
- enc[this.encodingLength - 1] |= point.getX().isOdd() ? 128 : 0;
- return enc;
- };
- EDDSA.prototype.decodePoint = function decodePoint(bytes) {
- bytes = utils.parseBytes(bytes);
- var lastIx = bytes.length - 1;
- var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~128);
- var xIsOdd = (bytes[lastIx] & 128) !== 0;
- var y = utils.intFromLE(normed);
- return this.curve.pointFromY(y, xIsOdd);
- };
- EDDSA.prototype.encodeInt = function encodeInt(num) {
- return num.toArray("le", this.encodingLength);
- };
- EDDSA.prototype.decodeInt = function decodeInt(bytes) {
- return utils.intFromLE(bytes);
- };
- EDDSA.prototype.isPoint = function isPoint(val) {
- return val instanceof this.pointClass;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic.js
-var require_elliptic = __commonJS((exports) => {
- var elliptic = exports;
- elliptic.version = require_package().version;
- elliptic.utils = require_utils2();
- elliptic.rand = require_brorand();
- elliptic.curve = require_curve();
- elliptic.curves = require_curves();
- elliptic.ec = require_ec();
- elliptic.eddsa = require_eddsa();
-});
-
-// ../eve/node_modules/jwk-to-pem/src/b64-to-bn.js
-var require_b64_to_bn = __commonJS((exports, module) => {
- var BN = require_asn1().bignum;
- var Buffer2 = require_safe_buffer().Buffer;
- module.exports = function base64ToBigNum(val, zero) {
- var buf = Buffer2.from(val, "base64");
- var bn = val = new BN(buf, 10, "be").iabs();
- if (zero) {
- buf.fill(0);
- }
- return bn;
- };
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/algorithm-identifier.js
-var require_algorithm_identifier = __commonJS((exports, module) => {
- module.exports = require_asn1().define("AlgorithmIdentifer", function() {
- this.seq().obj(this.key("algorithm").objid(), this.key("parameters").optional().any());
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/public-key-info.js
-var require_public_key_info = __commonJS((exports, module) => {
- var AlgorithmIdentifier = require_algorithm_identifier();
- module.exports = require_asn1().define("PublicKeyInfo", function() {
- this.seq().obj(this.key("algorithm").use(AlgorithmIdentifier), this.key("PublicKey").bitstr());
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/version.js
-var require_version = __commonJS((exports, module) => {
- module.exports = require_asn1().define("Version", function() {
- this.int();
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/private-key-info.js
-var require_private_key_info = __commonJS((exports, module) => {
- var AlgorithmIdentifier = require_algorithm_identifier();
- var Version = require_version();
- module.exports = require_asn1().define("PrivateKeyInfo", function() {
- this.seq().obj(this.key("version").use(Version), this.key("privateKeyAlgorithm").use(AlgorithmIdentifier), this.key("privateKey").octstr(), this.key("attributes").optional().any());
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/ec.js
-var require_ec2 = __commonJS((exports, module) => {
- var asn1 = require_asn1();
- var Buffer2 = require_safe_buffer().Buffer;
- var EC = require_elliptic().ec;
- var b64ToBn = require_b64_to_bn();
- var PublicKeyInfo = require_public_key_info();
- var PrivateKeyInfo = require_private_key_info();
- var Version = require_version();
- var ECParameters = asn1.define("ECParameters", function() {
- this.choice({
- namedCurve: this.objid()
- });
- });
- var ecPrivkeyVer1 = 1;
- var ECPrivateKey = asn1.define("ECPrivateKey", function() {
- this.seq().obj(this.key("version").use(Version), this.key("privateKey").octstr(), this.key("parameters").explicit(0).optional().any(), this.key("publicKey").explicit(1).optional().bitstr());
- });
- var curves = {
- "P-256": "p256",
- "P-384": "p384",
- "P-521": "p521"
- };
- var oids = {
- "P-256": [1, 2, 840, 10045, 3, 1, 7],
- "P-384": [1, 3, 132, 0, 34],
- "P-521": [1, 3, 132, 0, 35]
- };
- var parameters = {};
- var algorithms = {};
- Object.keys(oids).forEach(function(crv) {
- parameters[crv] = ECParameters.encode({
- type: "namedCurve",
- value: oids[crv]
- }, "der");
- algorithms[crv] = {
- algorithm: [1, 2, 840, 10045, 2, 1],
- parameters: parameters[crv]
- };
- });
- oids = null;
- function ecJwkToBuffer(jwk, opts) {
- if (typeof jwk.crv !== "string") {
- throw new TypeError('Expected "jwk.crv" to be a String');
- }
- var hasD = typeof jwk.d === "string";
- var xyTypes = hasD ? ["undefined", "string"] : ["string"];
- if (xyTypes.indexOf(typeof jwk.x) === -1) {
- throw new TypeError('Expected "jwk.x" to be a String');
- }
- if (xyTypes.indexOf(typeof jwk.y) === -1) {
- throw new TypeError('Expected "jwk.y" to be a String');
- }
- if (opts.private && !hasD) {
- throw new TypeError('Expected "jwk.d" to be a String');
- }
- var curveName = curves[jwk.crv];
- if (!curveName) {
- throw new Error('Unsupported curve "' + jwk.crv + '"');
- }
- var curve = new EC(curveName);
- var key = {};
- var hasPub = jwk.x && jwk.y;
- if (hasPub) {
- key.pub = {
- x: b64ToBn(jwk.x, false),
- y: b64ToBn(jwk.y, false)
- };
- }
- if (opts.private || !hasPub) {
- key.priv = b64ToBn(jwk.d, true);
- }
- key = curve.keyPair(key);
- var keyValidation = key.validate();
- if (!keyValidation.result) {
- throw new Error('Invalid key for curve: "' + keyValidation.reason + '"');
- }
- var result = keyToPem(jwk.crv, key, opts);
- return result;
- }
- function keyToPem(crv, key, opts) {
- var compact = false;
- var publicKey = key.getPublic(compact, "hex");
- publicKey = Buffer2.from(publicKey, "hex");
- publicKey = {
- unused: 0,
- data: publicKey
- };
- var result;
- if (opts.private) {
- var privateKey = key.getPrivate("hex");
- privateKey = Buffer2.from(privateKey, "hex");
- result = PrivateKeyInfo.encode({
- version: 0,
- privateKeyAlgorithm: algorithms[crv],
- privateKey: ECPrivateKey.encode({
- version: ecPrivkeyVer1,
- privateKey,
- parameters: parameters[crv],
- publicKey
- }, "der")
- }, "pem", {
- label: "PRIVATE KEY"
- });
- privateKey.fill(0);
- } else {
- result = PublicKeyInfo.encode({
- algorithm: algorithms[crv],
- PublicKey: publicKey
- }, "pem", {
- label: "PUBLIC KEY"
- });
- }
- if (result.slice(-1) !== `
-`) {
- result += `
-`;
- }
- return result;
- }
- module.exports = ecJwkToBuffer;
-});
-
-// ../eve/node_modules/jwk-to-pem/src/rsa.js
-var require_rsa = __commonJS((exports, module) => {
- var asn1 = require_asn1();
- var b64ToBn = require_b64_to_bn();
- var PublicKeyInfo = require_public_key_info();
- var PrivateKeyInfo = require_private_key_info();
- var Version = require_version();
- var RSAPrivateKey = asn1.define("RSAPrivateKey", function() {
- this.seq().obj(this.key("version").use(Version), this.key("modulus").int(), this.key("publicExponent").int(), this.key("privateExponent").int(), this.key("prime1").int(), this.key("prime2").int(), this.key("exponent1").int(), this.key("exponent2").int(), this.key("coefficient").int());
- });
- var RSAPublicKey = asn1.define("RSAPublicKey", function() {
- this.seq().obj(this.key("modulus").int(), this.key("publicExponent").int());
- });
- var algorithm = {
- algorithm: [1, 2, 840, 113549, 1, 1, 1],
- parameters: [5, 0]
- };
- function rsaJwkToBuffer(jwk, opts) {
- if (typeof jwk.e !== "string") {
- throw new TypeError('Expected "jwk.e" to be a String');
- }
- if (typeof jwk.n !== "string") {
- throw new TypeError('Expected "jwk.n" to be a String');
- }
- if (opts.private) {
- if (typeof jwk.d !== "string") {
- throw new TypeError('Expected "jwk.d" to be a String');
- }
- if (typeof jwk.p !== "string") {
- throw new TypeError('Expected "jwk.p" to be a String');
- }
- if (typeof jwk.q !== "string") {
- throw new TypeError('Expected "jwk.q" to be a String');
- }
- if (typeof jwk.dp !== "string") {
- throw new TypeError('Expected "jwk.dp" to be a String');
- }
- if (typeof jwk.dq !== "string") {
- throw new TypeError('Expected "jwk.dq" to be a String');
- }
- if (typeof jwk.qi !== "string") {
- throw new TypeError('Expected "jwk.qi" to be a String');
- }
- }
- var pem;
- if (opts.private) {
- pem = PrivateKeyInfo.encode({
- version: 0,
- privateKeyAlgorithm: algorithm,
- privateKey: RSAPrivateKey.encode({
- version: 0,
- modulus: b64ToBn(jwk.n, false),
- publicExponent: b64ToBn(jwk.e, false),
- privateExponent: b64ToBn(jwk.d, true),
- prime1: b64ToBn(jwk.p, true),
- prime2: b64ToBn(jwk.q, true),
- exponent1: b64ToBn(jwk.dp, true),
- exponent2: b64ToBn(jwk.dq, true),
- coefficient: b64ToBn(jwk.qi, true)
- }, "der")
- }, "pem", {
- label: "PRIVATE KEY"
- });
- } else {
- pem = PublicKeyInfo.encode({
- algorithm,
- PublicKey: {
- unused: 0,
- data: RSAPublicKey.encode({
- modulus: b64ToBn(jwk.n, false),
- publicExponent: b64ToBn(jwk.e, false)
- }, "der")
- }
- }, "pem", {
- label: "PUBLIC KEY"
- });
- }
- if (pem.slice(-1) !== `
-`) {
- pem += `
-`;
- }
- return pem;
- }
- module.exports = rsaJwkToBuffer;
-});
-
-// ../eve/node_modules/jwk-to-pem/src/jwk-to-pem.js
-var require_jwk_to_pem = __commonJS((exports, module) => {
- var ec = require_ec2();
- var rsa = require_rsa();
- function jwkToBuffer(jwk, opts) {
- if (typeof jwk !== "object" || jwk === null) {
- throw new TypeError('Expected "jwk" to be an Object');
- }
- var kty = jwk.kty;
- if (typeof kty !== "string") {
- throw new TypeError('Expected "jwk.kty" to be a String');
- }
- opts = opts || {};
- opts.private = opts.private === true;
- switch (kty) {
- case "EC": {
- return ec(jwk, opts);
- }
- case "RSA": {
- return rsa(jwk, opts);
- }
- default: {
- throw new Error('Unsupported key type "' + kty + '"');
- }
- }
- }
- module.exports = jwkToBuffer;
-});
-
-// src/utils/cookies.ts
-function getCookies(headers) {
- if (!headers)
- return {};
- const cookieHeader = headers.get("Cookie");
- const cookies = {};
- if (cookieHeader === null)
- return {};
- for (const kv of cookieHeader.split(";")) {
- const [cookieKey, ...cookieVal] = kv.split("=");
- const key = cookieKey.trim();
- cookies[key] = cookieVal.join("=");
- }
- return cookies;
-}
-function setCookie(response, key, value, maxAge) {
- response.headers.append("Set-Cookie", `${key}=${value}${maxAge ? "; Path=/; Max-Age=" + maxAge : ""}`);
-}
-function removeCookie(response, key) {
- response.headers.append("Set-Cookie", `${key}=""; Path=/; Max-Age=-1;`);
-}
-// ../eve/dist/esi/options.js
-var CLIENT_ID = process.env.EVE_CLIENT_ID || "";
-var CLIENT_SECRET = process.env.EVE_CLIENT_SECRET || "";
-var CALLBACK_URL = process.env.EVE_CALLBACK_URL || "";
-var USER_AGENT = process.env.ESI_USER_AGENT || "";
-var options = {
- client_id: CLIENT_ID,
- client_secret: CLIENT_SECRET,
- callback_url: CALLBACK_URL,
- user_agent: USER_AGENT
-};
-
-// ../eve/dist/_virtual/rolldown_runtime.js
-var __defProp2 = Object.defineProperty;
-var __export = (target, all) => {
- for (var name in all)
- __defProp2(target, name, {
- get: all[name],
- enumerable: true
- });
-};
-
-// ../eve/node_modules/jwt-decode/build/esm/index.js
-class InvalidTokenError extends Error {
-}
-InvalidTokenError.prototype.name = "InvalidTokenError";
-function b64DecodeUnicode(str) {
- return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {
- let code = p.charCodeAt(0).toString(16).toUpperCase();
- if (code.length < 2) {
- code = "0" + code;
- }
- return "%" + code;
- }));
-}
-function base64UrlDecode(str) {
- let output = str.replace(/-/g, "+").replace(/_/g, "/");
- switch (output.length % 4) {
- case 0:
- break;
- case 2:
- output += "==";
- break;
- case 3:
- output += "=";
- break;
- default:
- throw new Error("base64 string is not of the correct length");
- }
- try {
- return b64DecodeUnicode(output);
- } catch (err) {
- return atob(output);
- }
-}
-function jwtDecode(token, options2) {
- if (typeof token !== "string") {
- throw new InvalidTokenError("Invalid token specified: must be a string");
- }
- options2 || (options2 = {});
- const pos = options2.header === true ? 0 : 1;
- const part = token.split(".")[pos];
- if (typeof part !== "string") {
- throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);
- }
- let decoded;
- try {
- decoded = base64UrlDecode(part);
- } catch (e) {
- throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);
- }
- try {
- return JSON.parse(decoded);
- } catch (e) {
- throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);
- }
-}
-// ../eve/node_modules/@oslojs/encoding/dist/base32.js
-var EncodingPadding;
-(function(EncodingPadding2) {
- EncodingPadding2[EncodingPadding2["Include"] = 0] = "Include";
- EncodingPadding2[EncodingPadding2["None"] = 1] = "None";
-})(EncodingPadding || (EncodingPadding = {}));
-var DecodingPadding;
-(function(DecodingPadding2) {
- DecodingPadding2[DecodingPadding2["Required"] = 0] = "Required";
- DecodingPadding2[DecodingPadding2["Ignore"] = 1] = "Ignore";
-})(DecodingPadding || (DecodingPadding = {}));
-// ../eve/node_modules/@oslojs/encoding/dist/base64.js
-function encodeBase64urlNoPadding(bytes) {
- return encodeBase64_internal(bytes, base64urlAlphabet, EncodingPadding2.None);
-}
-function encodeBase64_internal(bytes, alphabet, padding) {
- let result = "";
- for (let i = 0;i < bytes.byteLength; i += 3) {
- let buffer = 0;
- let bufferBitSize = 0;
- for (let j = 0;j < 3 && i + j < bytes.byteLength; j++) {
- buffer = buffer << 8 | bytes[i + j];
- bufferBitSize += 8;
- }
- for (let j = 0;j < 4; j++) {
- if (bufferBitSize >= 6) {
- result += alphabet[buffer >> bufferBitSize - 6 & 63];
- bufferBitSize -= 6;
- } else if (bufferBitSize > 0) {
- result += alphabet[buffer << 6 - bufferBitSize & 63];
- bufferBitSize = 0;
- } else if (padding === EncodingPadding2.Include) {
- result += "=";
- }
- }
- }
- return result;
-}
-var base64urlAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
-var EncodingPadding2;
-(function(EncodingPadding3) {
- EncodingPadding3[EncodingPadding3["Include"] = 0] = "Include";
- EncodingPadding3[EncodingPadding3["None"] = 1] = "None";
-})(EncodingPadding2 || (EncodingPadding2 = {}));
-var DecodingPadding2;
-(function(DecodingPadding3) {
- DecodingPadding3[DecodingPadding3["Required"] = 0] = "Required";
- DecodingPadding3[DecodingPadding3["Ignore"] = 1] = "Ignore";
-})(DecodingPadding2 || (DecodingPadding2 = {}));
-// ../eve/dist/esi/auth.js
-var import_jsonwebtoken = __toESM(require_jsonwebtoken(), 1);
-var import_jwk_to_pem = __toESM(require_jwk_to_pem(), 1);
-var auth_exports = {};
-__export(auth_exports, {
- characterIdFromToken: () => characterIdFromToken,
- createAuthorizationURL: () => createAuthorizationURL,
- refresh: () => refresh,
- validateAuthorizationCode: () => validateAuthorizationCode,
- validateToken: () => validateToken
-});
-function generateState() {
- const randomValues = new Uint8Array(32);
- crypto.getRandomValues(randomValues);
- return encodeBase64urlNoPadding(randomValues);
-}
-async function createAuthorizationURL(scopes = "publicData") {
- const state = generateState();
- const url = new URL("https://login.eveonline.com/v2/oauth/authorize/");
- url.searchParams.set("response_type", "code");
- url.searchParams.set("redirect_uri", options.callback_url);
- url.searchParams.set("client_id", options.client_id);
- url.searchParams.set("state", state);
- url.searchParams.set("scope", Array.isArray(scopes) ? scopes.join(" ") : scopes);
- return {
- url,
- state
- };
-}
-async function validateAuthorizationCode(code) {
- try {
- const response = await fetch("https://login.eveonline.com/v2/oauth/token", {
- method: "POST",
- headers: {
- "Content-Type": "application/x-www-form-urlencoded",
- Authorization: `Basic ${Buffer.from(`${options.client_id}:${options.client_secret}`).toString("base64")}`
- },
- body: new URLSearchParams({
- grant_type: "authorization_code",
- code
- })
- });
- return await response.json();
- } catch (error) {
- console.error(`failed to validate EVE authorization code`, error);
- throw `${error}`;
- }
-}
-var eveAuthPublicKey;
-async function validateToken(token) {
- if (!eveAuthPublicKey)
- try {
- const eveJWKS = await (await fetch("https://login.eveonline.com/oauth/jwks")).json();
- eveAuthPublicKey = import_jwk_to_pem.default(eveJWKS.keys[0]);
- } catch (err) {
- console.error(`failed to get EVE Auth public keys`, err);
- }
- try {
- const decoded = import_jsonwebtoken.default.verify(token, eveAuthPublicKey);
- return decoded;
- } catch (err) {
- console.error(`failed to validate EVE token`, err);
- return null;
- }
-}
-async function refresh({ refresh_token }, scopes) {
- const params = {
- grant_type: "refresh_token",
- refresh_token,
- scope: ""
- };
- if (scopes)
- params["scope"] = Array.isArray(scopes) ? scopes.join(" ") : scopes;
- const response = await fetch("https://login.eveonline.com/v2/oauth/token", {
- method: "POST",
- headers: {
- "Content-Type": "application/x-www-form-urlencoded",
- Authorization: `Basic ${Buffer.from(`${options.client_id}:${options.client_secret}`).toString("base64")}`
- },
- body: new URLSearchParams(params)
- });
- return await response.json();
-}
-function characterIdFromToken(token) {
- const payload = jwtDecode(token);
- return parseInt(payload.sub.split(":")[2]);
-}
-
-// ../eve/dist/esi/scopes.js
-var ESI_LATEST_URL = "https://esi.evetech.net/latest";
-function joinScopes(...scopes) {
- return scopes.join(" ");
-}
-var SCOPES = /* @__PURE__ */ function(SCOPES$1) {
- SCOPES$1["PUBLIC_DATA"] = "publicData";
- SCOPES$1["CALENDAR_RESPOND_CALENDAR_EVENTS"] = "esi-calendar.respond_calendar_events.v1";
- SCOPES$1["CALENDAR_READ_CALENDAR_EVENTS"] = "esi-calendar.read_calendar_events.v1";
- SCOPES$1["LOCATION_READ_LOCATION"] = "esi-location.read_location.v1";
- SCOPES$1["LOCATION_READ_SHIP_TYPE"] = "esi-location.read_ship_type.v1";
- SCOPES$1["MAIL_ORGANIZE_MAIL"] = "esi-mail.organize_mail.v1";
- SCOPES$1["MAIL_READ_MAIL"] = "esi-mail.read_mail.v1";
- SCOPES$1["MAIL_SEND_MAIL"] = "esi-mail.send_mail.v1";
- SCOPES$1["SKILLS_READ_SKILLS"] = "esi-skills.read_skills.v1";
- SCOPES$1["SKILLS_READ_SKILLQUEUE"] = "esi-skills.read_skillqueue.v1";
- SCOPES$1["WALLET_READ_CHARACTER_WALLET"] = "esi-wallet.read_character_wallet.v1";
- SCOPES$1["WALLET_READ_CORPORATION_WALLET"] = "esi-wallet.read_corporation_wallet.v1";
- SCOPES$1["SEARCH_SEARCH_STRUCTURES"] = "esi-search.search_structures.v1";
- SCOPES$1["CLONES_READ_CLONES"] = "esi-clones.read_clones.v1";
- SCOPES$1["CHARACTERS_READ_CONTACTS"] = "esi-characters.read_contacts.v1";
- SCOPES$1["UNIVERSE_READ_STRUCTURES"] = "esi-universe.read_structures.v1";
- SCOPES$1["KILLMAILS_READ_KILLMAILS"] = "esi-killmails.read_killmails.v1";
- SCOPES$1["CORPORATIONS_READ_CORPORATION_MEMBERSHIP"] = "esi-corporations.read_corporation_membership.v1";
- SCOPES$1["ASSETS_READ_ASSETS"] = "esi-assets.read_assets.v1";
- SCOPES$1["PLANETS_MANAGE_PLANETS"] = "esi-planets.manage_planets.v1";
- SCOPES$1["FLEETS_READ_FLEET"] = "esi-fleets.read_fleet.v1";
- SCOPES$1["FLEETS_WRITE_FLEET"] = "esi-fleets.write_fleet.v1";
- SCOPES$1["UI_OPEN_WINDOW"] = "esi-ui.open_window.v1";
- SCOPES$1["UI_WRITE_WAYPOINT"] = "esi-ui.write_waypoint.v1";
- SCOPES$1["CHARACTERS_WRITE_CONTACTS"] = "esi-characters.write_contacts.v1";
- SCOPES$1["FITTINGS_READ_FITTINGS"] = "esi-fittings.read_fittings.v1";
- SCOPES$1["FITTINGS_WRITE_FITTINGS"] = "esi-fittings.write_fittings.v1";
- SCOPES$1["MARKETS_STRUCTURE_MARKETS"] = "esi-markets.structure_markets.v1";
- SCOPES$1["CORPORATIONS_READ_STRUCTURES"] = "esi-corporations.read_structures.v1";
- SCOPES$1["CHARACTERS_READ_LOYALTY"] = "esi-characters.read_loyalty.v1";
- SCOPES$1["CHARACTERS_READ_OPPORTUNITIES"] = "esi-characters.read_opportunities.v1";
- SCOPES$1["CHARACTERS_READ_CHAT_CHANNELS"] = "esi-characters.read_chat_channels.v1";
- SCOPES$1["CHARACTERS_READ_MEDALS"] = "esi-characters.read_medals.v1";
- SCOPES$1["CHARACTERS_READ_STANDINGS"] = "esi-characters.read_standings.v1";
- SCOPES$1["CHARACTERS_READ_AGENTS_RESEARCH"] = "esi-characters.read_agents_research.v1";
- SCOPES$1["INDUSTRY_READ_CHARACTER_JOBS"] = "esi-industry.read_character_jobs.v1";
- SCOPES$1["MARKETS_READ_CHARACTER_ORDERS"] = "esi-markets.read_character_orders.v1";
- SCOPES$1["CHARACTERS_READ_BLUEPRINTS"] = "esi-characters.read_blueprints.v1";
- SCOPES$1["CHARACTERS_READ_CORPORATION_ROLES"] = "esi-characters.read_corporation_roles.v1";
- SCOPES$1["LOCATION_READ_ONLINE"] = "esi-location.read_online.v1";
- SCOPES$1["CONTRACTS_READ_CHARACTER_CONTRACTS"] = "esi-contracts.read_character_contracts.v1";
- SCOPES$1["CLONES_READ_IMPLANTS"] = "esi-clones.read_implants.v1";
- SCOPES$1["CHARACTERS_READ_FATIGUE"] = "esi-characters.read_fatigue.v1";
- SCOPES$1["KILLMAILS_READ_CORPORATION_KILLMAILS"] = "esi-killmails.read_corporation_killmails.v1";
- SCOPES$1["CORPORATIONS_TRACK_MEMBERS"] = "esi-corporations.track_members.v1";
- SCOPES$1["WALLET_READ_CORPORATION_WALLETS"] = "esi-wallet.read_corporation_wallets.v1";
- SCOPES$1["CHARACTERS_READ_NOTIFICATIONS"] = "esi-characters.read_notifications.v1";
- SCOPES$1["CORPORATIONS_READ_DIVISIONS"] = "esi-corporations.read_divisions.v1";
- SCOPES$1["CORPORATIONS_READ_CONTACTS"] = "esi-corporations.read_contacts.v1";
- SCOPES$1["ASSETS_READ_CORPORATION_ASSETS"] = "esi-assets.read_corporation_assets.v1";
- SCOPES$1["CORPORATIONS_READ_TITLES"] = "esi-corporations.read_titles.v1";
- SCOPES$1["CORPORATIONS_READ_BLUEPRINTS"] = "esi-corporations.read_blueprints.v1";
- SCOPES$1["CONTRACTS_READ_CORPORATION_CONTRACTS"] = "esi-contracts.read_corporation_contracts.v1";
- SCOPES$1["CORPORATIONS_READ_STANDINGS"] = "esi-corporations.read_standings.v1";
- SCOPES$1["CORPORATIONS_READ_STARBASES"] = "esi-corporations.read_starbases.v1";
- SCOPES$1["INDUSTRY_READ_CORPORATION_JOBS"] = "esi-industry.read_corporation_jobs.v1";
- SCOPES$1["MARKETS_READ_CORPORATION_ORDERS"] = "esi-markets.read_corporation_orders.v1";
- SCOPES$1["CORPORATIONS_READ_CONTAINER_LOGS"] = "esi-corporations.read_container_logs.v1";
- SCOPES$1["INDUSTRY_READ_CHARACTER_MINING"] = "esi-industry.read_character_mining.v1";
- SCOPES$1["INDUSTRY_READ_CORPORATION_MINING"] = "esi-industry.read_corporation_mining.v1";
- SCOPES$1["PLANETS_READ_CUSTOMS_OFFICES"] = "esi-planets.read_customs_offices.v1";
- SCOPES$1["CORPORATIONS_READ_FACILITIES"] = "esi-corporations.read_facilities.v1";
- SCOPES$1["CORPORATIONS_READ_MEDALS"] = "esi-corporations.read_medals.v1";
- SCOPES$1["CHARACTERS_READ_TITLES"] = "esi-characters.read_titles.v1";
- SCOPES$1["ALLIANCES_READ_CONTACTS"] = "esi-alliances.read_contacts.v1";
- SCOPES$1["CHARACTERS_READ_FW_STATS"] = "esi-characters.read_fw_stats.v1";
- SCOPES$1["CORPORATIONS_READ_FW_STATS"] = "esi-corporations.read_fw_stats.v1";
- return SCOPES$1;
-}({});
-
-// ../eve/node_modules/drizzle-orm/entity.js
-var entityKind = Symbol.for("drizzle:entityKind");
-var hasOwnEntityKind = Symbol.for("drizzle:hasOwnEntityKind");
-function is(value, type) {
- if (!value || typeof value !== "object") {
- return false;
- }
- if (value instanceof type) {
- return true;
- }
- if (!Object.prototype.hasOwnProperty.call(type, entityKind)) {
- throw new Error(`Class "${type.name ?? ""}" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`);
- }
- let cls = Object.getPrototypeOf(value).constructor;
- if (cls) {
- while (cls) {
- if (entityKind in cls && cls[entityKind] === type[entityKind]) {
- return true;
- }
- cls = Object.getPrototypeOf(cls);
- }
- }
- return false;
-}
-
-// ../eve/node_modules/drizzle-orm/column.js
-class Column {
- constructor(table, config) {
- this.table = table;
- this.config = config;
- this.name = config.name;
- this.keyAsName = config.keyAsName;
- this.notNull = config.notNull;
- this.default = config.default;
- this.defaultFn = config.defaultFn;
- this.onUpdateFn = config.onUpdateFn;
- this.hasDefault = config.hasDefault;
- this.primary = config.primaryKey;
- this.isUnique = config.isUnique;
- this.uniqueName = config.uniqueName;
- this.uniqueType = config.uniqueType;
- this.dataType = config.dataType;
- this.columnType = config.columnType;
- this.generated = config.generated;
- this.generatedIdentity = config.generatedIdentity;
- }
- static [entityKind] = "Column";
- name;
- keyAsName;
- primary;
- notNull;
- default;
- defaultFn;
- onUpdateFn;
- hasDefault;
- isUnique;
- uniqueName;
- uniqueType;
- dataType;
- columnType;
- enumValues = undefined;
- generated = undefined;
- generatedIdentity = undefined;
- config;
- mapFromDriverValue(value) {
- return value;
- }
- mapToDriverValue(value) {
- return value;
- }
- shouldDisableInsert() {
- return this.config.generated !== undefined && this.config.generated.type !== "byDefault";
- }
-}
-
-// ../eve/node_modules/drizzle-orm/column-builder.js
-class ColumnBuilder {
- static [entityKind] = "ColumnBuilder";
- config;
- constructor(name, dataType, columnType) {
- this.config = {
- name,
- keyAsName: name === "",
- notNull: false,
- default: undefined,
- hasDefault: false,
- primaryKey: false,
- isUnique: false,
- uniqueName: undefined,
- uniqueType: undefined,
- dataType,
- columnType,
- generated: undefined
- };
- }
- $type() {
- return this;
- }
- notNull() {
- this.config.notNull = true;
- return this;
- }
- default(value) {
- this.config.default = value;
- this.config.hasDefault = true;
- return this;
- }
- $defaultFn(fn) {
- this.config.defaultFn = fn;
- this.config.hasDefault = true;
- return this;
- }
- $default = this.$defaultFn;
- $onUpdateFn(fn) {
- this.config.onUpdateFn = fn;
- this.config.hasDefault = true;
- return this;
- }
- $onUpdate = this.$onUpdateFn;
- primaryKey() {
- this.config.primaryKey = true;
- this.config.notNull = true;
- return this;
- }
- setName(name) {
- if (this.config.name !== "")
- return;
- this.config.name = name;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/table.utils.js
-var TableName = Symbol.for("drizzle:Name");
-
-// ../eve/node_modules/drizzle-orm/tracing-utils.js
-function iife(fn, ...args) {
- return fn(...args);
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/unique-constraint.js
-function uniqueKeyName(table, columns) {
- return `${table[TableName]}_${columns.join("_")}_unique`;
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/columns/common.js
-class PgColumn extends Column {
- constructor(table, config) {
- if (!config.uniqueName) {
- config.uniqueName = uniqueKeyName(table, [config.name]);
- }
- super(table, config);
- this.table = table;
- }
- static [entityKind] = "PgColumn";
-}
-
-class ExtraConfigColumn extends PgColumn {
- static [entityKind] = "ExtraConfigColumn";
- getSQLType() {
- return this.getSQLType();
- }
- indexConfig = {
- order: this.config.order ?? "asc",
- nulls: this.config.nulls ?? "last",
- opClass: this.config.opClass
- };
- defaultConfig = {
- order: "asc",
- nulls: "last",
- opClass: undefined
- };
- asc() {
- this.indexConfig.order = "asc";
- return this;
- }
- desc() {
- this.indexConfig.order = "desc";
- return this;
- }
- nullsFirst() {
- this.indexConfig.nulls = "first";
- return this;
- }
- nullsLast() {
- this.indexConfig.nulls = "last";
- return this;
- }
- op(opClass) {
- this.indexConfig.opClass = opClass;
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/columns/enum.js
-class PgEnumObjectColumn extends PgColumn {
- static [entityKind] = "PgEnumObjectColumn";
- enum;
- enumValues = this.config.enum.enumValues;
- constructor(table, config) {
- super(table, config);
- this.enum = config.enum;
- }
- getSQLType() {
- return this.enum.enumName;
- }
-}
-var isPgEnumSym = Symbol.for("drizzle:isPgEnum");
-function isPgEnum(obj) {
- return !!obj && typeof obj === "function" && isPgEnumSym in obj && obj[isPgEnumSym] === true;
-}
-class PgEnumColumn extends PgColumn {
- static [entityKind] = "PgEnumColumn";
- enum = this.config.enum;
- enumValues = this.config.enum.enumValues;
- constructor(table, config) {
- super(table, config);
- this.enum = config.enum;
- }
- getSQLType() {
- return this.enum.enumName;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/subquery.js
-class Subquery {
- static [entityKind] = "Subquery";
- constructor(sql, fields, alias, isWith = false, usedTables = []) {
- this._ = {
- brand: "Subquery",
- sql,
- selectedFields: fields,
- alias,
- isWith,
- usedTables
- };
- }
-}
-
-class WithSubquery extends Subquery {
- static [entityKind] = "WithSubquery";
-}
-
-// ../eve/node_modules/drizzle-orm/version.js
-var version = "0.44.5";
-
-// ../eve/node_modules/drizzle-orm/tracing.js
-var otel;
-var rawTracer;
-var tracer = {
- startActiveSpan(name, fn) {
- if (!otel) {
- return fn();
- }
- if (!rawTracer) {
- rawTracer = otel.trace.getTracer("drizzle-orm", version);
- }
- return iife((otel2, rawTracer2) => rawTracer2.startActiveSpan(name, (span) => {
- try {
- return fn(span);
- } catch (e) {
- span.setStatus({
- code: otel2.SpanStatusCode.ERROR,
- message: e instanceof Error ? e.message : "Unknown error"
- });
- throw e;
- } finally {
- span.end();
- }
- }), otel, rawTracer);
- }
-};
-
-// ../eve/node_modules/drizzle-orm/view-common.js
-var ViewBaseConfig = Symbol.for("drizzle:ViewBaseConfig");
-
-// ../eve/node_modules/drizzle-orm/table.js
-var Schema = Symbol.for("drizzle:Schema");
-var Columns = Symbol.for("drizzle:Columns");
-var ExtraConfigColumns = Symbol.for("drizzle:ExtraConfigColumns");
-var OriginalName = Symbol.for("drizzle:OriginalName");
-var BaseName = Symbol.for("drizzle:BaseName");
-var IsAlias = Symbol.for("drizzle:IsAlias");
-var ExtraConfigBuilder = Symbol.for("drizzle:ExtraConfigBuilder");
-var IsDrizzleTable = Symbol.for("drizzle:IsDrizzleTable");
-
-class Table {
- static [entityKind] = "Table";
- static Symbol = {
- Name: TableName,
- Schema,
- OriginalName,
- Columns,
- ExtraConfigColumns,
- BaseName,
- IsAlias,
- ExtraConfigBuilder
- };
- [TableName];
- [OriginalName];
- [Schema];
- [Columns];
- [ExtraConfigColumns];
- [BaseName];
- [IsAlias] = false;
- [IsDrizzleTable] = true;
- [ExtraConfigBuilder] = undefined;
- constructor(name, schema, baseName) {
- this[TableName] = this[OriginalName] = name;
- this[Schema] = schema;
- this[BaseName] = baseName;
- }
-}
-function getTableName(table) {
- return table[TableName];
-}
-function getTableUniqueName(table) {
- return `${table[Schema] ?? "public"}.${table[TableName]}`;
-}
-
-// ../eve/node_modules/drizzle-orm/sql/sql.js
-function isSQLWrapper(value) {
- return value !== null && value !== undefined && typeof value.getSQL === "function";
-}
-function mergeQueries(queries) {
- const result = { sql: "", params: [] };
- for (const query of queries) {
- result.sql += query.sql;
- result.params.push(...query.params);
- if (query.typings?.length) {
- if (!result.typings) {
- result.typings = [];
- }
- result.typings.push(...query.typings);
- }
- }
- return result;
-}
-
-class StringChunk {
- static [entityKind] = "StringChunk";
- value;
- constructor(value) {
- this.value = Array.isArray(value) ? value : [value];
- }
- getSQL() {
- return new SQL([this]);
- }
-}
-
-class SQL {
- constructor(queryChunks) {
- this.queryChunks = queryChunks;
- for (const chunk of queryChunks) {
- if (is(chunk, Table)) {
- const schemaName = chunk[Table.Symbol.Schema];
- this.usedTables.push(schemaName === undefined ? chunk[Table.Symbol.Name] : schemaName + "." + chunk[Table.Symbol.Name]);
- }
- }
- }
- static [entityKind] = "SQL";
- decoder = noopDecoder;
- shouldInlineParams = false;
- usedTables = [];
- append(query) {
- this.queryChunks.push(...query.queryChunks);
- return this;
- }
- toQuery(config) {
- return tracer.startActiveSpan("drizzle.buildSQL", (span) => {
- const query = this.buildQueryFromSourceParams(this.queryChunks, config);
- span?.setAttributes({
- "drizzle.query.text": query.sql,
- "drizzle.query.params": JSON.stringify(query.params)
- });
- return query;
- });
- }
- buildQueryFromSourceParams(chunks, _config) {
- const config = Object.assign({}, _config, {
- inlineParams: _config.inlineParams || this.shouldInlineParams,
- paramStartIndex: _config.paramStartIndex || { value: 0 }
- });
- const {
- casing,
- escapeName,
- escapeParam,
- prepareTyping,
- inlineParams,
- paramStartIndex
- } = config;
- return mergeQueries(chunks.map((chunk) => {
- if (is(chunk, StringChunk)) {
- return { sql: chunk.value.join(""), params: [] };
- }
- if (is(chunk, Name)) {
- return { sql: escapeName(chunk.value), params: [] };
- }
- if (chunk === undefined) {
- return { sql: "", params: [] };
- }
- if (Array.isArray(chunk)) {
- const result = [new StringChunk("(")];
- for (const [i, p] of chunk.entries()) {
- result.push(p);
- if (i < chunk.length - 1) {
- result.push(new StringChunk(", "));
- }
- }
- result.push(new StringChunk(")"));
- return this.buildQueryFromSourceParams(result, config);
- }
- if (is(chunk, SQL)) {
- return this.buildQueryFromSourceParams(chunk.queryChunks, {
- ...config,
- inlineParams: inlineParams || chunk.shouldInlineParams
- });
- }
- if (is(chunk, Table)) {
- const schemaName = chunk[Table.Symbol.Schema];
- const tableName = chunk[Table.Symbol.Name];
- return {
- sql: schemaName === undefined || chunk[IsAlias] ? escapeName(tableName) : escapeName(schemaName) + "." + escapeName(tableName),
- params: []
- };
- }
- if (is(chunk, Column)) {
- const columnName = casing.getColumnCasing(chunk);
- if (_config.invokeSource === "indexes") {
- return { sql: escapeName(columnName), params: [] };
- }
- const schemaName = chunk.table[Table.Symbol.Schema];
- return {
- sql: chunk.table[IsAlias] || schemaName === undefined ? escapeName(chunk.table[Table.Symbol.Name]) + "." + escapeName(columnName) : escapeName(schemaName) + "." + escapeName(chunk.table[Table.Symbol.Name]) + "." + escapeName(columnName),
- params: []
- };
- }
- if (is(chunk, View)) {
- const schemaName = chunk[ViewBaseConfig].schema;
- const viewName = chunk[ViewBaseConfig].name;
- return {
- sql: schemaName === undefined || chunk[ViewBaseConfig].isAlias ? escapeName(viewName) : escapeName(schemaName) + "." + escapeName(viewName),
- params: []
- };
- }
- if (is(chunk, Param)) {
- if (is(chunk.value, Placeholder)) {
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
- }
- const mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);
- if (is(mappedValue, SQL)) {
- return this.buildQueryFromSourceParams([mappedValue], config);
- }
- if (inlineParams) {
- return { sql: this.mapInlineParam(mappedValue, config), params: [] };
- }
- let typings = ["none"];
- if (prepareTyping) {
- typings = [prepareTyping(chunk.encoder)];
- }
- return { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };
- }
- if (is(chunk, Placeholder)) {
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
- }
- if (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {
- return { sql: escapeName(chunk.fieldAlias), params: [] };
- }
- if (is(chunk, Subquery)) {
- if (chunk._.isWith) {
- return { sql: escapeName(chunk._.alias), params: [] };
- }
- return this.buildQueryFromSourceParams([
- new StringChunk("("),
- chunk._.sql,
- new StringChunk(") "),
- new Name(chunk._.alias)
- ], config);
- }
- if (isPgEnum(chunk)) {
- if (chunk.schema) {
- return { sql: escapeName(chunk.schema) + "." + escapeName(chunk.enumName), params: [] };
- }
- return { sql: escapeName(chunk.enumName), params: [] };
- }
- if (isSQLWrapper(chunk)) {
- if (chunk.shouldOmitSQLParens?.()) {
- return this.buildQueryFromSourceParams([chunk.getSQL()], config);
- }
- return this.buildQueryFromSourceParams([
- new StringChunk("("),
- chunk.getSQL(),
- new StringChunk(")")
- ], config);
- }
- if (inlineParams) {
- return { sql: this.mapInlineParam(chunk, config), params: [] };
- }
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
- }));
- }
- mapInlineParam(chunk, { escapeString }) {
- if (chunk === null) {
- return "null";
- }
- if (typeof chunk === "number" || typeof chunk === "boolean") {
- return chunk.toString();
- }
- if (typeof chunk === "string") {
- return escapeString(chunk);
- }
- if (typeof chunk === "object") {
- const mappedValueAsString = chunk.toString();
- if (mappedValueAsString === "[object Object]") {
- return escapeString(JSON.stringify(chunk));
- }
- return escapeString(mappedValueAsString);
- }
- throw new Error("Unexpected param value: " + chunk);
- }
- getSQL() {
- return this;
- }
- as(alias) {
- if (alias === undefined) {
- return this;
- }
- return new SQL.Aliased(this, alias);
- }
- mapWith(decoder) {
- this.decoder = typeof decoder === "function" ? { mapFromDriverValue: decoder } : decoder;
- return this;
- }
- inlineParams() {
- this.shouldInlineParams = true;
- return this;
- }
- if(condition) {
- return condition ? this : undefined;
- }
-}
-
-class Name {
- constructor(value) {
- this.value = value;
- }
- static [entityKind] = "Name";
- brand;
- getSQL() {
- return new SQL([this]);
- }
-}
-function isDriverValueEncoder(value) {
- return typeof value === "object" && value !== null && "mapToDriverValue" in value && typeof value.mapToDriverValue === "function";
-}
-var noopDecoder = {
- mapFromDriverValue: (value) => value
-};
-var noopEncoder = {
- mapToDriverValue: (value) => value
-};
-var noopMapper = {
- ...noopDecoder,
- ...noopEncoder
-};
-
-class Param {
- constructor(value, encoder = noopEncoder) {
- this.value = value;
- this.encoder = encoder;
- }
- static [entityKind] = "Param";
- brand;
- getSQL() {
- return new SQL([this]);
- }
-}
-function sql(strings, ...params) {
- const queryChunks = [];
- if (params.length > 0 || strings.length > 0 && strings[0] !== "") {
- queryChunks.push(new StringChunk(strings[0]));
- }
- for (const [paramIndex, param2] of params.entries()) {
- queryChunks.push(param2, new StringChunk(strings[paramIndex + 1]));
- }
- return new SQL(queryChunks);
-}
-((sql2) => {
- function empty() {
- return new SQL([]);
- }
- sql2.empty = empty;
- function fromList(list) {
- return new SQL(list);
- }
- sql2.fromList = fromList;
- function raw(str) {
- return new SQL([new StringChunk(str)]);
- }
- sql2.raw = raw;
- function join(chunks, separator) {
- const result = [];
- for (const [i, chunk] of chunks.entries()) {
- if (i > 0 && separator !== undefined) {
- result.push(separator);
- }
- result.push(chunk);
- }
- return new SQL(result);
- }
- sql2.join = join;
- function identifier(value) {
- return new Name(value);
- }
- sql2.identifier = identifier;
- function placeholder2(name2) {
- return new Placeholder(name2);
- }
- sql2.placeholder = placeholder2;
- function param2(value, encoder) {
- return new Param(value, encoder);
- }
- sql2.param = param2;
-})(sql || (sql = {}));
-((SQL2) => {
-
- class Aliased {
- constructor(sql2, fieldAlias) {
- this.sql = sql2;
- this.fieldAlias = fieldAlias;
- }
- static [entityKind] = "SQL.Aliased";
- isSelectionField = false;
- getSQL() {
- return this.sql;
- }
- clone() {
- return new Aliased(this.sql, this.fieldAlias);
- }
- }
- SQL2.Aliased = Aliased;
-})(SQL || (SQL = {}));
-
-class Placeholder {
- constructor(name2) {
- this.name = name2;
- }
- static [entityKind] = "Placeholder";
- getSQL() {
- return new SQL([this]);
- }
-}
-function fillPlaceholders(params, values) {
- return params.map((p) => {
- if (is(p, Placeholder)) {
- if (!(p.name in values)) {
- throw new Error(`No value for placeholder "${p.name}" was provided`);
- }
- return values[p.name];
- }
- if (is(p, Param) && is(p.value, Placeholder)) {
- if (!(p.value.name in values)) {
- throw new Error(`No value for placeholder "${p.value.name}" was provided`);
- }
- return p.encoder.mapToDriverValue(values[p.value.name]);
- }
- return p;
- });
-}
-var IsDrizzleView = Symbol.for("drizzle:IsDrizzleView");
-
-class View {
- static [entityKind] = "View";
- [ViewBaseConfig];
- [IsDrizzleView] = true;
- constructor({ name: name2, schema, selectedFields, query }) {
- this[ViewBaseConfig] = {
- name: name2,
- originalName: name2,
- schema,
- selectedFields,
- query,
- isExisting: !query,
- isAlias: false
- };
- }
- getSQL() {
- return new SQL([this]);
- }
-}
-Column.prototype.getSQL = function() {
- return new SQL([this]);
-};
-Table.prototype.getSQL = function() {
- return new SQL([this]);
-};
-Subquery.prototype.getSQL = function() {
- return new SQL([this]);
-};
-
-// ../eve/node_modules/drizzle-orm/alias.js
-class ColumnAliasProxyHandler {
- constructor(table) {
- this.table = table;
- }
- static [entityKind] = "ColumnAliasProxyHandler";
- get(columnObj, prop) {
- if (prop === "table") {
- return this.table;
- }
- return columnObj[prop];
- }
-}
-
-class TableAliasProxyHandler {
- constructor(alias, replaceOriginalName) {
- this.alias = alias;
- this.replaceOriginalName = replaceOriginalName;
- }
- static [entityKind] = "TableAliasProxyHandler";
- get(target, prop) {
- if (prop === Table.Symbol.IsAlias) {
- return true;
- }
- if (prop === Table.Symbol.Name) {
- return this.alias;
- }
- if (this.replaceOriginalName && prop === Table.Symbol.OriginalName) {
- return this.alias;
- }
- if (prop === ViewBaseConfig) {
- return {
- ...target[ViewBaseConfig],
- name: this.alias,
- isAlias: true
- };
- }
- if (prop === Table.Symbol.Columns) {
- const columns = target[Table.Symbol.Columns];
- if (!columns) {
- return columns;
- }
- const proxiedColumns = {};
- Object.keys(columns).map((key) => {
- proxiedColumns[key] = new Proxy(columns[key], new ColumnAliasProxyHandler(new Proxy(target, this)));
- });
- return proxiedColumns;
- }
- const value = target[prop];
- if (is(value, Column)) {
- return new Proxy(value, new ColumnAliasProxyHandler(new Proxy(target, this)));
- }
- return value;
- }
-}
-function aliasedTable(table, tableAlias) {
- return new Proxy(table, new TableAliasProxyHandler(tableAlias, false));
-}
-function aliasedTableColumn(column, tableAlias) {
- return new Proxy(column, new ColumnAliasProxyHandler(new Proxy(column.table, new TableAliasProxyHandler(tableAlias, false))));
-}
-function mapColumnsInAliasedSQLToAlias(query, alias) {
- return new SQL.Aliased(mapColumnsInSQLToAlias(query.sql, alias), query.fieldAlias);
-}
-function mapColumnsInSQLToAlias(query, alias) {
- return sql.join(query.queryChunks.map((c) => {
- if (is(c, Column)) {
- return aliasedTableColumn(c, alias);
- }
- if (is(c, SQL)) {
- return mapColumnsInSQLToAlias(c, alias);
- }
- if (is(c, SQL.Aliased)) {
- return mapColumnsInAliasedSQLToAlias(c, alias);
- }
- return c;
- }));
-}
-
-// ../eve/node_modules/drizzle-orm/utils.js
-function mapResultRow(columns, row, joinsNotNullableMap) {
- const nullifyMap = {};
- const result = columns.reduce((result2, { path, field }, columnIndex) => {
- let decoder;
- if (is(field, Column)) {
- decoder = field;
- } else if (is(field, SQL)) {
- decoder = field.decoder;
- } else {
- decoder = field.sql.decoder;
- }
- let node = result2;
- for (const [pathChunkIndex, pathChunk] of path.entries()) {
- if (pathChunkIndex < path.length - 1) {
- if (!(pathChunk in node)) {
- node[pathChunk] = {};
- }
- node = node[pathChunk];
- } else {
- const rawValue = row[columnIndex];
- const value = node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue);
- if (joinsNotNullableMap && is(field, Column) && path.length === 2) {
- const objectName = path[0];
- if (!(objectName in nullifyMap)) {
- nullifyMap[objectName] = value === null ? getTableName(field.table) : false;
- } else if (typeof nullifyMap[objectName] === "string" && nullifyMap[objectName] !== getTableName(field.table)) {
- nullifyMap[objectName] = false;
- }
- }
- }
- }
- return result2;
- }, {});
- if (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {
- for (const [objectName, tableName] of Object.entries(nullifyMap)) {
- if (typeof tableName === "string" && !joinsNotNullableMap[tableName]) {
- result[objectName] = null;
- }
- }
- }
- return result;
-}
-function orderSelectedFields(fields, pathPrefix) {
- return Object.entries(fields).reduce((result, [name, field]) => {
- if (typeof name !== "string") {
- return result;
- }
- const newPath = pathPrefix ? [...pathPrefix, name] : [name];
- if (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased)) {
- result.push({ path: newPath, field });
- } else if (is(field, Table)) {
- result.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath));
- } else {
- result.push(...orderSelectedFields(field, newPath));
- }
- return result;
- }, []);
-}
-function haveSameKeys(left, right) {
- const leftKeys = Object.keys(left);
- const rightKeys = Object.keys(right);
- if (leftKeys.length !== rightKeys.length) {
- return false;
- }
- for (const [index, key] of leftKeys.entries()) {
- if (key !== rightKeys[index]) {
- return false;
- }
- }
- return true;
-}
-function mapUpdateSet(table, values) {
- const entries = Object.entries(values).filter(([, value]) => value !== undefined).map(([key, value]) => {
- if (is(value, SQL) || is(value, Column)) {
- return [key, value];
- } else {
- return [key, new Param(value, table[Table.Symbol.Columns][key])];
- }
- });
- if (entries.length === 0) {
- throw new Error("No values to set");
- }
- return Object.fromEntries(entries);
-}
-function applyMixins(baseClass, extendedClasses) {
- for (const extendedClass of extendedClasses) {
- for (const name of Object.getOwnPropertyNames(extendedClass.prototype)) {
- if (name === "constructor")
- continue;
- Object.defineProperty(baseClass.prototype, name, Object.getOwnPropertyDescriptor(extendedClass.prototype, name) || /* @__PURE__ */ Object.create(null));
- }
- }
-}
-function getTableColumns(table) {
- return table[Table.Symbol.Columns];
-}
-function getTableLikeName(table) {
- return is(table, Subquery) ? table._.alias : is(table, View) ? table[ViewBaseConfig].name : is(table, SQL) ? undefined : table[Table.Symbol.IsAlias] ? table[Table.Symbol.Name] : table[Table.Symbol.BaseName];
-}
-function getColumnNameAndConfig(a, b) {
- return {
- name: typeof a === "string" && a.length > 0 ? a : "",
- config: typeof a === "object" ? a : b
- };
-}
-function isConfig(data) {
- if (typeof data !== "object" || data === null)
- return false;
- if (data.constructor.name !== "Object")
- return false;
- if ("logger" in data) {
- const type = typeof data["logger"];
- if (type !== "boolean" && (type !== "object" || typeof data["logger"]["logQuery"] !== "function") && type !== "undefined")
- return false;
- return true;
- }
- if ("schema" in data) {
- const type = typeof data["schema"];
- if (type !== "object" && type !== "undefined")
- return false;
- return true;
- }
- if ("casing" in data) {
- const type = typeof data["casing"];
- if (type !== "string" && type !== "undefined")
- return false;
- return true;
- }
- if ("mode" in data) {
- if (data["mode"] !== "default" || data["mode"] !== "planetscale" || data["mode"] !== undefined)
- return false;
- return true;
- }
- if ("connection" in data) {
- const type = typeof data["connection"];
- if (type !== "string" && type !== "object" && type !== "undefined")
- return false;
- return true;
- }
- if ("client" in data) {
- const type = typeof data["client"];
- if (type !== "object" && type !== "function" && type !== "undefined")
- return false;
- return true;
- }
- if (Object.keys(data).length === 0)
- return true;
- return false;
-}
-var textDecoder = typeof TextDecoder === "undefined" ? null : new TextDecoder;
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/foreign-keys.js
-class ForeignKeyBuilder {
- static [entityKind] = "SQLiteForeignKeyBuilder";
- reference;
- _onUpdate;
- _onDelete;
- constructor(config, actions) {
- this.reference = () => {
- const { name, columns, foreignColumns } = config();
- return { name, columns, foreignTable: foreignColumns[0].table, foreignColumns };
- };
- if (actions) {
- this._onUpdate = actions.onUpdate;
- this._onDelete = actions.onDelete;
- }
- }
- onUpdate(action) {
- this._onUpdate = action;
- return this;
- }
- onDelete(action) {
- this._onDelete = action;
- return this;
- }
- build(table) {
- return new ForeignKey(table, this);
- }
-}
-
-class ForeignKey {
- constructor(table, builder) {
- this.table = table;
- this.reference = builder.reference;
- this.onUpdate = builder._onUpdate;
- this.onDelete = builder._onDelete;
- }
- static [entityKind] = "SQLiteForeignKey";
- reference;
- onUpdate;
- onDelete;
- getName() {
- const { name, columns, foreignColumns } = this.reference();
- const columnNames = columns.map((column) => column.name);
- const foreignColumnNames = foreignColumns.map((column) => column.name);
- const chunks = [
- this.table[TableName],
- ...columnNames,
- foreignColumns[0].table[TableName],
- ...foreignColumnNames
- ];
- return name ?? `${chunks.join("_")}_fk`;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/unique-constraint.js
-function uniqueKeyName2(table, columns) {
- return `${table[TableName]}_${columns.join("_")}_unique`;
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/common.js
-class SQLiteColumnBuilder extends ColumnBuilder {
- static [entityKind] = "SQLiteColumnBuilder";
- foreignKeyConfigs = [];
- references(ref, actions = {}) {
- this.foreignKeyConfigs.push({ ref, actions });
- return this;
- }
- unique(name) {
- this.config.isUnique = true;
- this.config.uniqueName = name;
- return this;
- }
- generatedAlwaysAs(as, config) {
- this.config.generated = {
- as,
- type: "always",
- mode: config?.mode ?? "virtual"
- };
- return this;
- }
- buildForeignKeys(column, table) {
- return this.foreignKeyConfigs.map(({ ref, actions }) => {
- return ((ref2, actions2) => {
- const builder = new ForeignKeyBuilder(() => {
- const foreignColumn = ref2();
- return { columns: [column], foreignColumns: [foreignColumn] };
- });
- if (actions2.onUpdate) {
- builder.onUpdate(actions2.onUpdate);
- }
- if (actions2.onDelete) {
- builder.onDelete(actions2.onDelete);
- }
- return builder.build(table);
- })(ref, actions);
- });
- }
-}
-
-class SQLiteColumn extends Column {
- constructor(table, config) {
- if (!config.uniqueName) {
- config.uniqueName = uniqueKeyName2(table, [config.name]);
- }
- super(table, config);
- this.table = table;
- }
- static [entityKind] = "SQLiteColumn";
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/blob.js
-class SQLiteBigIntBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBigIntBuilder";
- constructor(name) {
- super(name, "bigint", "SQLiteBigInt");
- }
- build(table) {
- return new SQLiteBigInt(table, this.config);
- }
-}
-
-class SQLiteBigInt extends SQLiteColumn {
- static [entityKind] = "SQLiteBigInt";
- getSQLType() {
- return "blob";
- }
- mapFromDriverValue(value) {
- if (typeof Buffer !== "undefined" && Buffer.from) {
- const buf = Buffer.isBuffer(value) ? value : value instanceof ArrayBuffer ? Buffer.from(value) : value.buffer ? Buffer.from(value.buffer, value.byteOffset, value.byteLength) : Buffer.from(value);
- return BigInt(buf.toString("utf8"));
- }
- return BigInt(textDecoder.decode(value));
- }
- mapToDriverValue(value) {
- return Buffer.from(value.toString());
- }
-}
-
-class SQLiteBlobJsonBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBlobJsonBuilder";
- constructor(name) {
- super(name, "json", "SQLiteBlobJson");
- }
- build(table) {
- return new SQLiteBlobJson(table, this.config);
- }
-}
-
-class SQLiteBlobJson extends SQLiteColumn {
- static [entityKind] = "SQLiteBlobJson";
- getSQLType() {
- return "blob";
- }
- mapFromDriverValue(value) {
- if (typeof Buffer !== "undefined" && Buffer.from) {
- const buf = Buffer.isBuffer(value) ? value : value instanceof ArrayBuffer ? Buffer.from(value) : value.buffer ? Buffer.from(value.buffer, value.byteOffset, value.byteLength) : Buffer.from(value);
- return JSON.parse(buf.toString("utf8"));
- }
- return JSON.parse(textDecoder.decode(value));
- }
- mapToDriverValue(value) {
- return Buffer.from(JSON.stringify(value));
- }
-}
-
-class SQLiteBlobBufferBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBlobBufferBuilder";
- constructor(name) {
- super(name, "buffer", "SQLiteBlobBuffer");
- }
- build(table) {
- return new SQLiteBlobBuffer(table, this.config);
- }
-}
-
-class SQLiteBlobBuffer extends SQLiteColumn {
- static [entityKind] = "SQLiteBlobBuffer";
- mapFromDriverValue(value) {
- if (Buffer.isBuffer(value)) {
- return value;
- }
- return Buffer.from(value);
- }
- getSQLType() {
- return "blob";
- }
-}
-function blob(a, b) {
- const { name, config } = getColumnNameAndConfig(a, b);
- if (config?.mode === "json") {
- return new SQLiteBlobJsonBuilder(name);
- }
- if (config?.mode === "bigint") {
- return new SQLiteBigIntBuilder(name);
- }
- return new SQLiteBlobBufferBuilder(name);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/custom.js
-class SQLiteCustomColumnBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteCustomColumnBuilder";
- constructor(name, fieldConfig, customTypeParams) {
- super(name, "custom", "SQLiteCustomColumn");
- this.config.fieldConfig = fieldConfig;
- this.config.customTypeParams = customTypeParams;
- }
- build(table) {
- return new SQLiteCustomColumn(table, this.config);
- }
-}
-
-class SQLiteCustomColumn extends SQLiteColumn {
- static [entityKind] = "SQLiteCustomColumn";
- sqlName;
- mapTo;
- mapFrom;
- constructor(table, config) {
- super(table, config);
- this.sqlName = config.customTypeParams.dataType(config.fieldConfig);
- this.mapTo = config.customTypeParams.toDriver;
- this.mapFrom = config.customTypeParams.fromDriver;
- }
- getSQLType() {
- return this.sqlName;
- }
- mapFromDriverValue(value) {
- return typeof this.mapFrom === "function" ? this.mapFrom(value) : value;
- }
- mapToDriverValue(value) {
- return typeof this.mapTo === "function" ? this.mapTo(value) : value;
- }
-}
-function customType(customTypeParams) {
- return (a, b) => {
- const { name, config } = getColumnNameAndConfig(a, b);
- return new SQLiteCustomColumnBuilder(name, config, customTypeParams);
- };
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/integer.js
-class SQLiteBaseIntegerBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBaseIntegerBuilder";
- constructor(name, dataType, columnType) {
- super(name, dataType, columnType);
- this.config.autoIncrement = false;
- }
- primaryKey(config) {
- if (config?.autoIncrement) {
- this.config.autoIncrement = true;
- }
- this.config.hasDefault = true;
- return super.primaryKey();
- }
-}
-
-class SQLiteBaseInteger extends SQLiteColumn {
- static [entityKind] = "SQLiteBaseInteger";
- autoIncrement = this.config.autoIncrement;
- getSQLType() {
- return "integer";
- }
-}
-
-class SQLiteIntegerBuilder extends SQLiteBaseIntegerBuilder {
- static [entityKind] = "SQLiteIntegerBuilder";
- constructor(name) {
- super(name, "number", "SQLiteInteger");
- }
- build(table) {
- return new SQLiteInteger(table, this.config);
- }
-}
-
-class SQLiteInteger extends SQLiteBaseInteger {
- static [entityKind] = "SQLiteInteger";
-}
-
-class SQLiteTimestampBuilder extends SQLiteBaseIntegerBuilder {
- static [entityKind] = "SQLiteTimestampBuilder";
- constructor(name, mode) {
- super(name, "date", "SQLiteTimestamp");
- this.config.mode = mode;
- }
- defaultNow() {
- return this.default(sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`);
- }
- build(table) {
- return new SQLiteTimestamp(table, this.config);
- }
-}
-
-class SQLiteTimestamp extends SQLiteBaseInteger {
- static [entityKind] = "SQLiteTimestamp";
- mode = this.config.mode;
- mapFromDriverValue(value) {
- if (this.config.mode === "timestamp") {
- return new Date(value * 1000);
- }
- return new Date(value);
- }
- mapToDriverValue(value) {
- const unix = value.getTime();
- if (this.config.mode === "timestamp") {
- return Math.floor(unix / 1000);
- }
- return unix;
- }
-}
-
-class SQLiteBooleanBuilder extends SQLiteBaseIntegerBuilder {
- static [entityKind] = "SQLiteBooleanBuilder";
- constructor(name, mode) {
- super(name, "boolean", "SQLiteBoolean");
- this.config.mode = mode;
- }
- build(table) {
- return new SQLiteBoolean(table, this.config);
- }
-}
-
-class SQLiteBoolean extends SQLiteBaseInteger {
- static [entityKind] = "SQLiteBoolean";
- mode = this.config.mode;
- mapFromDriverValue(value) {
- return Number(value) === 1;
- }
- mapToDriverValue(value) {
- return value ? 1 : 0;
- }
-}
-function integer(a, b) {
- const { name, config } = getColumnNameAndConfig(a, b);
- if (config?.mode === "timestamp" || config?.mode === "timestamp_ms") {
- return new SQLiteTimestampBuilder(name, config.mode);
- }
- if (config?.mode === "boolean") {
- return new SQLiteBooleanBuilder(name, config.mode);
- }
- return new SQLiteIntegerBuilder(name);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/numeric.js
-class SQLiteNumericBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteNumericBuilder";
- constructor(name) {
- super(name, "string", "SQLiteNumeric");
- }
- build(table) {
- return new SQLiteNumeric(table, this.config);
- }
-}
-
-class SQLiteNumeric extends SQLiteColumn {
- static [entityKind] = "SQLiteNumeric";
- mapFromDriverValue(value) {
- if (typeof value === "string")
- return value;
- return String(value);
- }
- getSQLType() {
- return "numeric";
- }
-}
-
-class SQLiteNumericNumberBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteNumericNumberBuilder";
- constructor(name) {
- super(name, "number", "SQLiteNumericNumber");
- }
- build(table) {
- return new SQLiteNumericNumber(table, this.config);
- }
-}
-
-class SQLiteNumericNumber extends SQLiteColumn {
- static [entityKind] = "SQLiteNumericNumber";
- mapFromDriverValue(value) {
- if (typeof value === "number")
- return value;
- return Number(value);
- }
- mapToDriverValue = String;
- getSQLType() {
- return "numeric";
- }
-}
-
-class SQLiteNumericBigIntBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteNumericBigIntBuilder";
- constructor(name) {
- super(name, "bigint", "SQLiteNumericBigInt");
- }
- build(table) {
- return new SQLiteNumericBigInt(table, this.config);
- }
-}
-
-class SQLiteNumericBigInt extends SQLiteColumn {
- static [entityKind] = "SQLiteNumericBigInt";
- mapFromDriverValue = BigInt;
- mapToDriverValue = String;
- getSQLType() {
- return "numeric";
- }
-}
-function numeric(a, b) {
- const { name, config } = getColumnNameAndConfig(a, b);
- const mode = config?.mode;
- return mode === "number" ? new SQLiteNumericNumberBuilder(name) : mode === "bigint" ? new SQLiteNumericBigIntBuilder(name) : new SQLiteNumericBuilder(name);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/real.js
-class SQLiteRealBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteRealBuilder";
- constructor(name) {
- super(name, "number", "SQLiteReal");
- }
- build(table) {
- return new SQLiteReal(table, this.config);
- }
-}
-
-class SQLiteReal extends SQLiteColumn {
- static [entityKind] = "SQLiteReal";
- getSQLType() {
- return "real";
- }
-}
-function real(name) {
- return new SQLiteRealBuilder(name ?? "");
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/text.js
-class SQLiteTextBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteTextBuilder";
- constructor(name, config) {
- super(name, "string", "SQLiteText");
- this.config.enumValues = config.enum;
- this.config.length = config.length;
- }
- build(table) {
- return new SQLiteText(table, this.config);
- }
-}
-
-class SQLiteText extends SQLiteColumn {
- static [entityKind] = "SQLiteText";
- enumValues = this.config.enumValues;
- length = this.config.length;
- constructor(table, config) {
- super(table, config);
- }
- getSQLType() {
- return `text${this.config.length ? `(${this.config.length})` : ""}`;
- }
-}
-
-class SQLiteTextJsonBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteTextJsonBuilder";
- constructor(name) {
- super(name, "json", "SQLiteTextJson");
- }
- build(table) {
- return new SQLiteTextJson(table, this.config);
- }
-}
-
-class SQLiteTextJson extends SQLiteColumn {
- static [entityKind] = "SQLiteTextJson";
- getSQLType() {
- return "text";
- }
- mapFromDriverValue(value) {
- return JSON.parse(value);
- }
- mapToDriverValue(value) {
- return JSON.stringify(value);
- }
-}
-function text(a, b = {}) {
- const { name, config } = getColumnNameAndConfig(a, b);
- if (config.mode === "json") {
- return new SQLiteTextJsonBuilder(name);
- }
- return new SQLiteTextBuilder(name, config);
-}
-
-// ../eve/node_modules/drizzle-orm/selection-proxy.js
-class SelectionProxyHandler {
- static [entityKind] = "SelectionProxyHandler";
- config;
- constructor(config) {
- this.config = { ...config };
- }
- get(subquery, prop) {
- if (prop === "_") {
- return {
- ...subquery["_"],
- selectedFields: new Proxy(subquery._.selectedFields, this)
- };
- }
- if (prop === ViewBaseConfig) {
- return {
- ...subquery[ViewBaseConfig],
- selectedFields: new Proxy(subquery[ViewBaseConfig].selectedFields, this)
- };
- }
- if (typeof prop === "symbol") {
- return subquery[prop];
- }
- const columns = is(subquery, Subquery) ? subquery._.selectedFields : is(subquery, View) ? subquery[ViewBaseConfig].selectedFields : subquery;
- const value = columns[prop];
- if (is(value, SQL.Aliased)) {
- if (this.config.sqlAliasedBehavior === "sql" && !value.isSelectionField) {
- return value.sql;
- }
- const newValue = value.clone();
- newValue.isSelectionField = true;
- return newValue;
- }
- if (is(value, SQL)) {
- if (this.config.sqlBehavior === "sql") {
- return value;
- }
- throw new Error(`You tried to reference "${prop}" field from a subquery, which is a raw SQL field, but it doesn't have an alias declared. Please add an alias to the field using ".as('alias')" method.`);
- }
- if (is(value, Column)) {
- if (this.config.alias) {
- return new Proxy(value, new ColumnAliasProxyHandler(new Proxy(value.table, new TableAliasProxyHandler(this.config.alias, this.config.replaceOriginalName ?? false))));
- }
- return value;
- }
- if (typeof value !== "object" || value === null) {
- return value;
- }
- return new Proxy(value, new SelectionProxyHandler(this.config));
- }
-}
-
-// ../eve/node_modules/drizzle-orm/query-promise.js
-class QueryPromise {
- static [entityKind] = "QueryPromise";
- [Symbol.toStringTag] = "QueryPromise";
- catch(onRejected) {
- return this.then(undefined, onRejected);
- }
- finally(onFinally) {
- return this.then((value) => {
- onFinally?.();
- return value;
- }, (reason) => {
- onFinally?.();
- throw reason;
- });
- }
- then(onFulfilled, onRejected) {
- return this.execute().then(onFulfilled, onRejected);
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/all.js
-function getSQLiteColumnBuilders() {
- return {
- blob,
- customType,
- integer,
- numeric,
- real,
- text
- };
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/table.js
-var InlineForeignKeys = Symbol.for("drizzle:SQLiteInlineForeignKeys");
-
-class SQLiteTable extends Table {
- static [entityKind] = "SQLiteTable";
- static Symbol = Object.assign({}, Table.Symbol, {
- InlineForeignKeys
- });
- [Table.Symbol.Columns];
- [InlineForeignKeys] = [];
- [Table.Symbol.ExtraConfigBuilder] = undefined;
-}
-function sqliteTableBase(name, columns, extraConfig, schema, baseName = name) {
- const rawTable = new SQLiteTable(name, schema, baseName);
- const parsedColumns = typeof columns === "function" ? columns(getSQLiteColumnBuilders()) : columns;
- const builtColumns = Object.fromEntries(Object.entries(parsedColumns).map(([name2, colBuilderBase]) => {
- const colBuilder = colBuilderBase;
- colBuilder.setName(name2);
- const column = colBuilder.build(rawTable);
- rawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));
- return [name2, column];
- }));
- const table = Object.assign(rawTable, builtColumns);
- table[Table.Symbol.Columns] = builtColumns;
- table[Table.Symbol.ExtraConfigColumns] = builtColumns;
- if (extraConfig) {
- table[SQLiteTable.Symbol.ExtraConfigBuilder] = extraConfig;
- }
- return table;
-}
-var sqliteTable = (name, columns, extraConfig) => {
- return sqliteTableBase(name, columns, extraConfig);
-};
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/indexes.js
-class IndexBuilderOn {
- constructor(name, unique) {
- this.name = name;
- this.unique = unique;
- }
- static [entityKind] = "SQLiteIndexBuilderOn";
- on(...columns) {
- return new IndexBuilder(this.name, columns, this.unique);
- }
-}
-
-class IndexBuilder {
- static [entityKind] = "SQLiteIndexBuilder";
- config;
- constructor(name, columns, unique) {
- this.config = {
- name,
- columns,
- unique,
- where: undefined
- };
- }
- where(condition) {
- this.config.where = condition;
- return this;
- }
- build(table) {
- return new Index(this.config, table);
- }
-}
-
-class Index {
- static [entityKind] = "SQLiteIndex";
- config;
- constructor(config, table) {
- this.config = { ...config, table };
- }
-}
-function index(name) {
- return new IndexBuilderOn(name, false);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/utils.js
-function extractUsedTable(table) {
- if (is(table, SQLiteTable)) {
- return [`${table[Table.Symbol.BaseName]}`];
- }
- if (is(table, Subquery)) {
- return table._.usedTables ?? [];
- }
- if (is(table, SQL)) {
- return table.usedTables ?? [];
- }
- return [];
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js
-class SQLiteDeleteBase extends QueryPromise {
- constructor(table, session, dialect, withList) {
- super();
- this.table = table;
- this.session = session;
- this.dialect = dialect;
- this.config = { table, withList };
- }
- static [entityKind] = "SQLiteDelete";
- config;
- where(where) {
- this.config.where = where;
- return this;
- }
- orderBy(...columns) {
- if (typeof columns[0] === "function") {
- const orderBy = columns[0](new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
- this.config.orderBy = orderByArray;
- } else {
- const orderByArray = columns;
- this.config.orderBy = orderByArray;
- }
- return this;
- }
- limit(limit) {
- this.config.limit = limit;
- return this;
- }
- returning(fields = this.table[SQLiteTable.Symbol.Columns]) {
- this.config.returning = orderSelectedFields(fields);
- return this;
- }
- getSQL() {
- return this.dialect.buildDeleteQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- _prepare(isOneTimeQuery = true) {
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
- type: "delete",
- tables: extractUsedTable(this.config.table)
- });
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute(placeholderValues) {
- return this._prepare().execute(placeholderValues);
- }
- $dynamic() {
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/casing.js
-function toSnakeCase(input) {
- const words = input.replace(/['\u2019]/g, "").match(/[\da-z]+|[A-Z]+(?![a-z])|[A-Z][\da-z]+/g) ?? [];
- return words.map((word) => word.toLowerCase()).join("_");
-}
-function toCamelCase(input) {
- const words = input.replace(/['\u2019]/g, "").match(/[\da-z]+|[A-Z]+(?![a-z])|[A-Z][\da-z]+/g) ?? [];
- return words.reduce((acc, word, i) => {
- const formattedWord = i === 0 ? word.toLowerCase() : `${word[0].toUpperCase()}${word.slice(1)}`;
- return acc + formattedWord;
- }, "");
-}
-function noopCase(input) {
- return input;
-}
-
-class CasingCache {
- static [entityKind] = "CasingCache";
- cache = {};
- cachedTables = {};
- convert;
- constructor(casing) {
- this.convert = casing === "snake_case" ? toSnakeCase : casing === "camelCase" ? toCamelCase : noopCase;
- }
- getColumnCasing(column) {
- if (!column.keyAsName)
- return column.name;
- const schema = column.table[Table.Symbol.Schema] ?? "public";
- const tableName = column.table[Table.Symbol.OriginalName];
- const key = `${schema}.${tableName}.${column.name}`;
- if (!this.cache[key]) {
- this.cacheTable(column.table);
- }
- return this.cache[key];
- }
- cacheTable(table) {
- const schema = table[Table.Symbol.Schema] ?? "public";
- const tableName = table[Table.Symbol.OriginalName];
- const tableKey = `${schema}.${tableName}`;
- if (!this.cachedTables[tableKey]) {
- for (const column of Object.values(table[Table.Symbol.Columns])) {
- const columnKey = `${tableKey}.${column.name}`;
- this.cache[columnKey] = this.convert(column.name);
- }
- this.cachedTables[tableKey] = true;
- }
- }
- clearCache() {
- this.cache = {};
- this.cachedTables = {};
- }
-}
-
-// ../eve/node_modules/drizzle-orm/errors.js
-class DrizzleError extends Error {
- static [entityKind] = "DrizzleError";
- constructor({ message, cause }) {
- super(message);
- this.name = "DrizzleError";
- this.cause = cause;
- }
-}
-
-class DrizzleQueryError extends Error {
- constructor(query, params, cause) {
- super(`Failed query: ${query}
-params: ${params}`);
- this.query = query;
- this.params = params;
- this.cause = cause;
- Error.captureStackTrace(this, DrizzleQueryError);
- if (cause)
- this.cause = cause;
- }
-}
-
-class TransactionRollbackError extends DrizzleError {
- static [entityKind] = "TransactionRollbackError";
- constructor() {
- super({ message: "Rollback" });
- }
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/table.js
-var InlineForeignKeys2 = Symbol.for("drizzle:PgInlineForeignKeys");
-var EnableRLS = Symbol.for("drizzle:EnableRLS");
-
-class PgTable extends Table {
- static [entityKind] = "PgTable";
- static Symbol = Object.assign({}, Table.Symbol, {
- InlineForeignKeys: InlineForeignKeys2,
- EnableRLS
- });
- [InlineForeignKeys2] = [];
- [EnableRLS] = false;
- [Table.Symbol.ExtraConfigBuilder] = undefined;
- [Table.Symbol.ExtraConfigColumns] = {};
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/primary-keys.js
-class PrimaryKeyBuilder {
- static [entityKind] = "PgPrimaryKeyBuilder";
- columns;
- name;
- constructor(columns, name) {
- this.columns = columns;
- this.name = name;
- }
- build(table) {
- return new PrimaryKey(table, this.columns, this.name);
- }
-}
-
-class PrimaryKey {
- constructor(table, columns, name) {
- this.table = table;
- this.columns = columns;
- this.name = name;
- }
- static [entityKind] = "PgPrimaryKey";
- columns;
- name;
- getName() {
- return this.name ?? `${this.table[PgTable.Symbol.Name]}_${this.columns.map((column) => column.name).join("_")}_pk`;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sql/expressions/conditions.js
-function bindIfParam(value, column) {
- if (isDriverValueEncoder(column) && !isSQLWrapper(value) && !is(value, Param) && !is(value, Placeholder) && !is(value, Column) && !is(value, Table) && !is(value, View)) {
- return new Param(value, column);
- }
- return value;
-}
-var eq = (left, right) => {
- return sql`${left} = ${bindIfParam(right, left)}`;
-};
-var ne = (left, right) => {
- return sql`${left} <> ${bindIfParam(right, left)}`;
-};
-function and(...unfilteredConditions) {
- const conditions = unfilteredConditions.filter((c) => c !== undefined);
- if (conditions.length === 0) {
- return;
- }
- if (conditions.length === 1) {
- return new SQL(conditions);
- }
- return new SQL([
- new StringChunk("("),
- sql.join(conditions, new StringChunk(" and ")),
- new StringChunk(")")
- ]);
-}
-function or(...unfilteredConditions) {
- const conditions = unfilteredConditions.filter((c) => c !== undefined);
- if (conditions.length === 0) {
- return;
- }
- if (conditions.length === 1) {
- return new SQL(conditions);
- }
- return new SQL([
- new StringChunk("("),
- sql.join(conditions, new StringChunk(" or ")),
- new StringChunk(")")
- ]);
-}
-function not(condition) {
- return sql`not ${condition}`;
-}
-var gt = (left, right) => {
- return sql`${left} > ${bindIfParam(right, left)}`;
-};
-var gte = (left, right) => {
- return sql`${left} >= ${bindIfParam(right, left)}`;
-};
-var lt = (left, right) => {
- return sql`${left} < ${bindIfParam(right, left)}`;
-};
-var lte = (left, right) => {
- return sql`${left} <= ${bindIfParam(right, left)}`;
-};
-function inArray(column, values) {
- if (Array.isArray(values)) {
- if (values.length === 0) {
- return sql`false`;
- }
- return sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;
- }
- return sql`${column} in ${bindIfParam(values, column)}`;
-}
-function notInArray(column, values) {
- if (Array.isArray(values)) {
- if (values.length === 0) {
- return sql`true`;
- }
- return sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;
- }
- return sql`${column} not in ${bindIfParam(values, column)}`;
-}
-function isNull(value) {
- return sql`${value} is null`;
-}
-function isNotNull(value) {
- return sql`${value} is not null`;
-}
-function exists(subquery) {
- return sql`exists ${subquery}`;
-}
-function notExists(subquery) {
- return sql`not exists ${subquery}`;
-}
-function between(column, min, max) {
- return sql`${column} between ${bindIfParam(min, column)} and ${bindIfParam(max, column)}`;
-}
-function notBetween(column, min, max) {
- return sql`${column} not between ${bindIfParam(min, column)} and ${bindIfParam(max, column)}`;
-}
-function like(column, value) {
- return sql`${column} like ${value}`;
-}
-function notLike(column, value) {
- return sql`${column} not like ${value}`;
-}
-function ilike(column, value) {
- return sql`${column} ilike ${value}`;
-}
-function notIlike(column, value) {
- return sql`${column} not ilike ${value}`;
-}
-
-// ../eve/node_modules/drizzle-orm/sql/expressions/select.js
-function asc(column) {
- return sql`${column} asc`;
-}
-function desc(column) {
- return sql`${column} desc`;
-}
-
-// ../eve/node_modules/drizzle-orm/relations.js
-class Relation {
- constructor(sourceTable, referencedTable, relationName) {
- this.sourceTable = sourceTable;
- this.referencedTable = referencedTable;
- this.relationName = relationName;
- this.referencedTableName = referencedTable[Table.Symbol.Name];
- }
- static [entityKind] = "Relation";
- referencedTableName;
- fieldName;
-}
-
-class Relations {
- constructor(table, config) {
- this.table = table;
- this.config = config;
- }
- static [entityKind] = "Relations";
-}
-
-class One extends Relation {
- constructor(sourceTable, referencedTable, config, isNullable) {
- super(sourceTable, referencedTable, config?.relationName);
- this.config = config;
- this.isNullable = isNullable;
- }
- static [entityKind] = "One";
- withFieldName(fieldName) {
- const relation = new One(this.sourceTable, this.referencedTable, this.config, this.isNullable);
- relation.fieldName = fieldName;
- return relation;
- }
-}
-
-class Many extends Relation {
- constructor(sourceTable, referencedTable, config) {
- super(sourceTable, referencedTable, config?.relationName);
- this.config = config;
- }
- static [entityKind] = "Many";
- withFieldName(fieldName) {
- const relation = new Many(this.sourceTable, this.referencedTable, this.config);
- relation.fieldName = fieldName;
- return relation;
- }
-}
-function getOperators() {
- return {
- and,
- between,
- eq,
- exists,
- gt,
- gte,
- ilike,
- inArray,
- isNull,
- isNotNull,
- like,
- lt,
- lte,
- ne,
- not,
- notBetween,
- notExists,
- notLike,
- notIlike,
- notInArray,
- or,
- sql
- };
-}
-function getOrderByOperators() {
- return {
- sql,
- asc,
- desc
- };
-}
-function extractTablesRelationalConfig(schema, configHelpers) {
- if (Object.keys(schema).length === 1 && "default" in schema && !is(schema["default"], Table)) {
- schema = schema["default"];
- }
- const tableNamesMap = {};
- const relationsBuffer = {};
- const tablesConfig = {};
- for (const [key, value] of Object.entries(schema)) {
- if (is(value, Table)) {
- const dbName = getTableUniqueName(value);
- const bufferedRelations = relationsBuffer[dbName];
- tableNamesMap[dbName] = key;
- tablesConfig[key] = {
- tsName: key,
- dbName: value[Table.Symbol.Name],
- schema: value[Table.Symbol.Schema],
- columns: value[Table.Symbol.Columns],
- relations: bufferedRelations?.relations ?? {},
- primaryKey: bufferedRelations?.primaryKey ?? []
- };
- for (const column of Object.values(value[Table.Symbol.Columns])) {
- if (column.primary) {
- tablesConfig[key].primaryKey.push(column);
- }
- }
- const extraConfig = value[Table.Symbol.ExtraConfigBuilder]?.(value[Table.Symbol.ExtraConfigColumns]);
- if (extraConfig) {
- for (const configEntry of Object.values(extraConfig)) {
- if (is(configEntry, PrimaryKeyBuilder)) {
- tablesConfig[key].primaryKey.push(...configEntry.columns);
- }
- }
- }
- } else if (is(value, Relations)) {
- const dbName = getTableUniqueName(value.table);
- const tableName = tableNamesMap[dbName];
- const relations2 = value.config(configHelpers(value.table));
- let primaryKey;
- for (const [relationName, relation] of Object.entries(relations2)) {
- if (tableName) {
- const tableConfig = tablesConfig[tableName];
- tableConfig.relations[relationName] = relation;
- if (primaryKey) {
- tableConfig.primaryKey.push(...primaryKey);
- }
- } else {
- if (!(dbName in relationsBuffer)) {
- relationsBuffer[dbName] = {
- relations: {},
- primaryKey
- };
- }
- relationsBuffer[dbName].relations[relationName] = relation;
- }
- }
- }
- }
- return { tables: tablesConfig, tableNamesMap };
-}
-function relations(table, relations2) {
- return new Relations(table, (helpers) => Object.fromEntries(Object.entries(relations2(helpers)).map(([key, value]) => [
- key,
- value.withFieldName(key)
- ])));
-}
-function createOne(sourceTable) {
- return function one(table, config) {
- return new One(sourceTable, table, config, config?.fields.reduce((res, f) => res && f.notNull, true) ?? false);
- };
-}
-function createMany(sourceTable) {
- return function many(referencedTable, config) {
- return new Many(sourceTable, referencedTable, config);
- };
-}
-function normalizeRelation(schema, tableNamesMap, relation) {
- if (is(relation, One) && relation.config) {
- return {
- fields: relation.config.fields,
- references: relation.config.references
- };
- }
- const referencedTableTsName = tableNamesMap[getTableUniqueName(relation.referencedTable)];
- if (!referencedTableTsName) {
- throw new Error(`Table "${relation.referencedTable[Table.Symbol.Name]}" not found in schema`);
- }
- const referencedTableConfig = schema[referencedTableTsName];
- if (!referencedTableConfig) {
- throw new Error(`Table "${referencedTableTsName}" not found in schema`);
- }
- const sourceTable = relation.sourceTable;
- const sourceTableTsName = tableNamesMap[getTableUniqueName(sourceTable)];
- if (!sourceTableTsName) {
- throw new Error(`Table "${sourceTable[Table.Symbol.Name]}" not found in schema`);
- }
- const reverseRelations = [];
- for (const referencedTableRelation of Object.values(referencedTableConfig.relations)) {
- if (relation.relationName && relation !== referencedTableRelation && referencedTableRelation.relationName === relation.relationName || !relation.relationName && referencedTableRelation.referencedTable === relation.sourceTable) {
- reverseRelations.push(referencedTableRelation);
- }
- }
- if (reverseRelations.length > 1) {
- throw relation.relationName ? new Error(`There are multiple relations with name "${relation.relationName}" in table "${referencedTableTsName}"`) : new Error(`There are multiple relations between "${referencedTableTsName}" and "${relation.sourceTable[Table.Symbol.Name]}". Please specify relation name`);
- }
- if (reverseRelations[0] && is(reverseRelations[0], One) && reverseRelations[0].config) {
- return {
- fields: reverseRelations[0].config.references,
- references: reverseRelations[0].config.fields
- };
- }
- throw new Error(`There is not enough information to infer relation "${sourceTableTsName}.${relation.fieldName}"`);
-}
-function createTableRelationsHelpers(sourceTable) {
- return {
- one: createOne(sourceTable),
- many: createMany(sourceTable)
- };
-}
-function mapRelationalRow(tablesConfig, tableConfig, row, buildQueryResultSelection, mapColumnValue = (value) => value) {
- const result = {};
- for (const [
- selectionItemIndex,
- selectionItem
- ] of buildQueryResultSelection.entries()) {
- if (selectionItem.isJson) {
- const relation = tableConfig.relations[selectionItem.tsKey];
- const rawSubRows = row[selectionItemIndex];
- const subRows = typeof rawSubRows === "string" ? JSON.parse(rawSubRows) : rawSubRows;
- result[selectionItem.tsKey] = is(relation, One) ? subRows && mapRelationalRow(tablesConfig, tablesConfig[selectionItem.relationTableTsKey], subRows, selectionItem.selection, mapColumnValue) : subRows.map((subRow) => mapRelationalRow(tablesConfig, tablesConfig[selectionItem.relationTableTsKey], subRow, selectionItem.selection, mapColumnValue));
- } else {
- const value = mapColumnValue(row[selectionItemIndex]);
- const field = selectionItem.field;
- let decoder;
- if (is(field, Column)) {
- decoder = field;
- } else if (is(field, SQL)) {
- decoder = field.decoder;
- } else {
- decoder = field.sql.decoder;
- }
- result[selectionItem.tsKey] = value === null ? null : decoder.mapFromDriverValue(value);
- }
- }
- return result;
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/view-base.js
-class SQLiteViewBase extends View {
- static [entityKind] = "SQLiteViewBase";
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/dialect.js
-class SQLiteDialect {
- static [entityKind] = "SQLiteDialect";
- casing;
- constructor(config) {
- this.casing = new CasingCache(config?.casing);
- }
- escapeName(name) {
- return `"${name}"`;
- }
- escapeParam(_num) {
- return "?";
- }
- escapeString(str) {
- return `'${str.replace(/'/g, "''")}'`;
- }
- buildWithCTE(queries) {
- if (!queries?.length)
- return;
- const withSqlChunks = [sql`with `];
- for (const [i, w] of queries.entries()) {
- withSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);
- if (i < queries.length - 1) {
- withSqlChunks.push(sql`, `);
- }
- }
- withSqlChunks.push(sql` `);
- return sql.join(withSqlChunks);
- }
- buildDeleteQuery({ table, where, returning, withList, limit, orderBy }) {
- const withSql = this.buildWithCTE(withList);
- const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
- const whereSql = where ? sql` where ${where}` : undefined;
- const orderBySql = this.buildOrderBy(orderBy);
- const limitSql = this.buildLimit(limit);
- return sql`${withSql}delete from ${table}${whereSql}${returningSql}${orderBySql}${limitSql}`;
- }
- buildUpdateSet(table, set) {
- const tableColumns = table[Table.Symbol.Columns];
- const columnNames = Object.keys(tableColumns).filter((colName) => set[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined);
- const setSize = columnNames.length;
- return sql.join(columnNames.flatMap((colName, i) => {
- const col = tableColumns[colName];
- const value = set[colName] ?? sql.param(col.onUpdateFn(), col);
- const res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;
- if (i < setSize - 1) {
- return [res, sql.raw(", ")];
- }
- return [res];
- }));
- }
- buildUpdateQuery({ table, set, where, returning, withList, joins, from, limit, orderBy }) {
- const withSql = this.buildWithCTE(withList);
- const setSql = this.buildUpdateSet(table, set);
- const fromSql = from && sql.join([sql.raw(" from "), this.buildFromTable(from)]);
- const joinsSql = this.buildJoins(joins);
- const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
- const whereSql = where ? sql` where ${where}` : undefined;
- const orderBySql = this.buildOrderBy(orderBy);
- const limitSql = this.buildLimit(limit);
- return sql`${withSql}update ${table} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}${orderBySql}${limitSql}`;
- }
- buildSelection(fields, { isSingleTable = false } = {}) {
- const columnsLen = fields.length;
- const chunks = fields.flatMap(({ field }, i) => {
- const chunk = [];
- if (is(field, SQL.Aliased) && field.isSelectionField) {
- chunk.push(sql.identifier(field.fieldAlias));
- } else if (is(field, SQL.Aliased) || is(field, SQL)) {
- const query = is(field, SQL.Aliased) ? field.sql : field;
- if (isSingleTable) {
- chunk.push(new SQL(query.queryChunks.map((c) => {
- if (is(c, Column)) {
- return sql.identifier(this.casing.getColumnCasing(c));
- }
- return c;
- })));
- } else {
- chunk.push(query);
- }
- if (is(field, SQL.Aliased)) {
- chunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);
- }
- } else if (is(field, Column)) {
- const tableName = field.table[Table.Symbol.Name];
- if (field.columnType === "SQLiteNumericBigInt") {
- if (isSingleTable) {
- chunk.push(sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`);
- } else {
- chunk.push(sql`cast(${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))} as text)`);
- }
- } else {
- if (isSingleTable) {
- chunk.push(sql.identifier(this.casing.getColumnCasing(field)));
- } else {
- chunk.push(sql`${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))}`);
- }
- }
- }
- if (i < columnsLen - 1) {
- chunk.push(sql`, `);
- }
- return chunk;
- });
- return sql.join(chunks);
- }
- buildJoins(joins) {
- if (!joins || joins.length === 0) {
- return;
- }
- const joinsArray = [];
- if (joins) {
- for (const [index2, joinMeta] of joins.entries()) {
- if (index2 === 0) {
- joinsArray.push(sql` `);
- }
- const table = joinMeta.table;
- const onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;
- if (is(table, SQLiteTable)) {
- const tableName = table[SQLiteTable.Symbol.Name];
- const tableSchema = table[SQLiteTable.Symbol.Schema];
- const origTableName = table[SQLiteTable.Symbol.OriginalName];
- const alias = tableName === origTableName ? undefined : joinMeta.alias;
- joinsArray.push(sql`${sql.raw(joinMeta.joinType)} join ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${sql.identifier(origTableName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`);
- } else {
- joinsArray.push(sql`${sql.raw(joinMeta.joinType)} join ${table}${onSql}`);
- }
- if (index2 < joins.length - 1) {
- joinsArray.push(sql` `);
- }
- }
- }
- return sql.join(joinsArray);
- }
- buildLimit(limit) {
- return typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : undefined;
- }
- buildOrderBy(orderBy) {
- const orderByList = [];
- if (orderBy) {
- for (const [index2, orderByValue] of orderBy.entries()) {
- orderByList.push(orderByValue);
- if (index2 < orderBy.length - 1) {
- orderByList.push(sql`, `);
- }
- }
- }
- return orderByList.length > 0 ? sql` order by ${sql.join(orderByList)}` : undefined;
- }
- buildFromTable(table) {
- if (is(table, Table) && table[Table.Symbol.IsAlias]) {
- return sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? "")}.`.if(table[Table.Symbol.Schema])}${sql.identifier(table[Table.Symbol.OriginalName])} ${sql.identifier(table[Table.Symbol.Name])}`;
- }
- return table;
- }
- buildSelectQuery({
- withList,
- fields,
- fieldsFlat,
- where,
- having,
- table,
- joins,
- orderBy,
- groupBy,
- limit,
- offset,
- distinct,
- setOperators
- }) {
- const fieldsList = fieldsFlat ?? orderSelectedFields(fields);
- for (const f of fieldsList) {
- if (is(f.field, Column) && getTableName(f.field.table) !== (is(table, Subquery) ? table._.alias : is(table, SQLiteViewBase) ? table[ViewBaseConfig].name : is(table, SQL) ? undefined : getTableName(table)) && !((table2) => joins?.some(({ alias }) => alias === (table2[Table.Symbol.IsAlias] ? getTableName(table2) : table2[Table.Symbol.BaseName])))(f.field.table)) {
- const tableName = getTableName(f.field.table);
- throw new Error(`Your "${f.path.join("->")}" field references a column "${tableName}"."${f.field.name}", but the table "${tableName}" is not part of the query! Did you forget to join it?`);
- }
- }
- const isSingleTable = !joins || joins.length === 0;
- const withSql = this.buildWithCTE(withList);
- const distinctSql = distinct ? sql` distinct` : undefined;
- const selection = this.buildSelection(fieldsList, { isSingleTable });
- const tableSql = this.buildFromTable(table);
- const joinsSql = this.buildJoins(joins);
- const whereSql = where ? sql` where ${where}` : undefined;
- const havingSql = having ? sql` having ${having}` : undefined;
- const groupByList = [];
- if (groupBy) {
- for (const [index2, groupByValue] of groupBy.entries()) {
- groupByList.push(groupByValue);
- if (index2 < groupBy.length - 1) {
- groupByList.push(sql`, `);
- }
- }
- }
- const groupBySql = groupByList.length > 0 ? sql` group by ${sql.join(groupByList)}` : undefined;
- const orderBySql = this.buildOrderBy(orderBy);
- const limitSql = this.buildLimit(limit);
- const offsetSql = offset ? sql` offset ${offset}` : undefined;
- const finalQuery = sql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}`;
- if (setOperators.length > 0) {
- return this.buildSetOperations(finalQuery, setOperators);
- }
- return finalQuery;
- }
- buildSetOperations(leftSelect, setOperators) {
- const [setOperator, ...rest] = setOperators;
- if (!setOperator) {
- throw new Error("Cannot pass undefined values to any set operator");
- }
- if (rest.length === 0) {
- return this.buildSetOperationQuery({ leftSelect, setOperator });
- }
- return this.buildSetOperations(this.buildSetOperationQuery({ leftSelect, setOperator }), rest);
- }
- buildSetOperationQuery({
- leftSelect,
- setOperator: { type, isAll, rightSelect, limit, orderBy, offset }
- }) {
- const leftChunk = sql`${leftSelect.getSQL()} `;
- const rightChunk = sql`${rightSelect.getSQL()}`;
- let orderBySql;
- if (orderBy && orderBy.length > 0) {
- const orderByValues = [];
- for (const singleOrderBy of orderBy) {
- if (is(singleOrderBy, SQLiteColumn)) {
- orderByValues.push(sql.identifier(singleOrderBy.name));
- } else if (is(singleOrderBy, SQL)) {
- for (let i = 0;i < singleOrderBy.queryChunks.length; i++) {
- const chunk = singleOrderBy.queryChunks[i];
- if (is(chunk, SQLiteColumn)) {
- singleOrderBy.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk));
- }
- }
- orderByValues.push(sql`${singleOrderBy}`);
- } else {
- orderByValues.push(sql`${singleOrderBy}`);
- }
- }
- orderBySql = sql` order by ${sql.join(orderByValues, sql`, `)}`;
- }
- const limitSql = typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : undefined;
- const operatorChunk = sql.raw(`${type} ${isAll ? "all " : ""}`);
- const offsetSql = offset ? sql` offset ${offset}` : undefined;
- return sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;
- }
- buildInsertQuery({ table, values: valuesOrSelect, onConflict, returning, withList, select }) {
- const valuesSqlList = [];
- const columns = table[Table.Symbol.Columns];
- const colEntries = Object.entries(columns).filter(([_, col]) => !col.shouldDisableInsert());
- const insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));
- if (select) {
- const select2 = valuesOrSelect;
- if (is(select2, SQL)) {
- valuesSqlList.push(select2);
- } else {
- valuesSqlList.push(select2.getSQL());
- }
- } else {
- const values = valuesOrSelect;
- valuesSqlList.push(sql.raw("values "));
- for (const [valueIndex, value] of values.entries()) {
- const valueList = [];
- for (const [fieldName, col] of colEntries) {
- const colValue = value[fieldName];
- if (colValue === undefined || is(colValue, Param) && colValue.value === undefined) {
- let defaultValue;
- if (col.default !== null && col.default !== undefined) {
- defaultValue = is(col.default, SQL) ? col.default : sql.param(col.default, col);
- } else if (col.defaultFn !== undefined) {
- const defaultFnResult = col.defaultFn();
- defaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);
- } else if (!col.default && col.onUpdateFn !== undefined) {
- const onUpdateFnResult = col.onUpdateFn();
- defaultValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);
- } else {
- defaultValue = sql`null`;
- }
- valueList.push(defaultValue);
- } else {
- valueList.push(colValue);
- }
- }
- valuesSqlList.push(valueList);
- if (valueIndex < values.length - 1) {
- valuesSqlList.push(sql`, `);
- }
- }
- }
- const withSql = this.buildWithCTE(withList);
- const valuesSql = sql.join(valuesSqlList);
- const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
- const onConflictSql = onConflict?.length ? sql.join(onConflict) : undefined;
- return sql`${withSql}insert into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${returningSql}`;
- }
- sqlToQuery(sql2, invokeSource) {
- return sql2.toQuery({
- casing: this.casing,
- escapeName: this.escapeName,
- escapeParam: this.escapeParam,
- escapeString: this.escapeString,
- invokeSource
- });
- }
- buildRelationalQuery({
- fullSchema,
- schema,
- tableNamesMap,
- table,
- tableConfig,
- queryConfig: config,
- tableAlias,
- nestedQueryRelation,
- joinOn
- }) {
- let selection = [];
- let limit, offset, orderBy = [], where;
- const joins = [];
- if (config === true) {
- const selectionEntries = Object.entries(tableConfig.columns);
- selection = selectionEntries.map(([key, value]) => ({
- dbKey: value.name,
- tsKey: key,
- field: aliasedTableColumn(value, tableAlias),
- relationTableTsKey: undefined,
- isJson: false,
- selection: []
- }));
- } else {
- const aliasedColumns = Object.fromEntries(Object.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]));
- if (config.where) {
- const whereSql = typeof config.where === "function" ? config.where(aliasedColumns, getOperators()) : config.where;
- where = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);
- }
- const fieldsSelection = [];
- let selectedColumns = [];
- if (config.columns) {
- let isIncludeMode = false;
- for (const [field, value] of Object.entries(config.columns)) {
- if (value === undefined) {
- continue;
- }
- if (field in tableConfig.columns) {
- if (!isIncludeMode && value === true) {
- isIncludeMode = true;
- }
- selectedColumns.push(field);
- }
- }
- if (selectedColumns.length > 0) {
- selectedColumns = isIncludeMode ? selectedColumns.filter((c) => config.columns?.[c] === true) : Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));
- }
- } else {
- selectedColumns = Object.keys(tableConfig.columns);
- }
- for (const field of selectedColumns) {
- const column = tableConfig.columns[field];
- fieldsSelection.push({ tsKey: field, value: column });
- }
- let selectedRelations = [];
- if (config.with) {
- selectedRelations = Object.entries(config.with).filter((entry) => !!entry[1]).map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey] }));
- }
- let extras;
- if (config.extras) {
- extras = typeof config.extras === "function" ? config.extras(aliasedColumns, { sql }) : config.extras;
- for (const [tsKey, value] of Object.entries(extras)) {
- fieldsSelection.push({
- tsKey,
- value: mapColumnsInAliasedSQLToAlias(value, tableAlias)
- });
- }
- }
- for (const { tsKey, value } of fieldsSelection) {
- selection.push({
- dbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey].name,
- tsKey,
- field: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,
- relationTableTsKey: undefined,
- isJson: false,
- selection: []
- });
- }
- let orderByOrig = typeof config.orderBy === "function" ? config.orderBy(aliasedColumns, getOrderByOperators()) : config.orderBy ?? [];
- if (!Array.isArray(orderByOrig)) {
- orderByOrig = [orderByOrig];
- }
- orderBy = orderByOrig.map((orderByValue) => {
- if (is(orderByValue, Column)) {
- return aliasedTableColumn(orderByValue, tableAlias);
- }
- return mapColumnsInSQLToAlias(orderByValue, tableAlias);
- });
- limit = config.limit;
- offset = config.offset;
- for (const {
- tsKey: selectedRelationTsKey,
- queryConfig: selectedRelationConfigValue,
- relation
- } of selectedRelations) {
- const normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);
- const relationTableName = getTableUniqueName(relation.referencedTable);
- const relationTableTsName = tableNamesMap[relationTableName];
- const relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;
- const joinOn2 = and(...normalizedRelation.fields.map((field2, i) => eq(aliasedTableColumn(normalizedRelation.references[i], relationTableAlias), aliasedTableColumn(field2, tableAlias))));
- const builtRelation = this.buildRelationalQuery({
- fullSchema,
- schema,
- tableNamesMap,
- table: fullSchema[relationTableTsName],
- tableConfig: schema[relationTableTsName],
- queryConfig: is(relation, One) ? selectedRelationConfigValue === true ? { limit: 1 } : { ...selectedRelationConfigValue, limit: 1 } : selectedRelationConfigValue,
- tableAlias: relationTableAlias,
- joinOn: joinOn2,
- nestedQueryRelation: relation
- });
- const field = sql`(${builtRelation.sql})`.as(selectedRelationTsKey);
- selection.push({
- dbKey: selectedRelationTsKey,
- tsKey: selectedRelationTsKey,
- field,
- relationTableTsKey: relationTableTsName,
- isJson: true,
- selection: builtRelation.selection
- });
- }
- }
- if (selection.length === 0) {
- throw new DrizzleError({
- message: `No fields selected for table "${tableConfig.tsName}" ("${tableAlias}"). You need to have at least one item in "columns", "with" or "extras". If you need to select all columns, omit the "columns" key or set it to undefined.`
- });
- }
- let result;
- where = and(joinOn, where);
- if (nestedQueryRelation) {
- let field = sql`json_array(${sql.join(selection.map(({ field: field2 }) => is(field2, SQLiteColumn) ? sql.identifier(this.casing.getColumnCasing(field2)) : is(field2, SQL.Aliased) ? field2.sql : field2), sql`, `)})`;
- if (is(nestedQueryRelation, Many)) {
- field = sql`coalesce(json_group_array(${field}), json_array())`;
- }
- const nestedSelection = [{
- dbKey: "data",
- tsKey: "data",
- field: field.as("data"),
- isJson: true,
- relationTableTsKey: tableConfig.tsName,
- selection
- }];
- const needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;
- if (needsSubquery) {
- result = this.buildSelectQuery({
- table: aliasedTable(table, tableAlias),
- fields: {},
- fieldsFlat: [
- {
- path: [],
- field: sql.raw("*")
- }
- ],
- where,
- limit,
- offset,
- orderBy,
- setOperators: []
- });
- where = undefined;
- limit = undefined;
- offset = undefined;
- orderBy = undefined;
- } else {
- result = aliasedTable(table, tableAlias);
- }
- result = this.buildSelectQuery({
- table: is(result, SQLiteTable) ? result : new Subquery(result, {}, tableAlias),
- fields: {},
- fieldsFlat: nestedSelection.map(({ field: field2 }) => ({
- path: [],
- field: is(field2, Column) ? aliasedTableColumn(field2, tableAlias) : field2
- })),
- joins,
- where,
- limit,
- offset,
- orderBy,
- setOperators: []
- });
- } else {
- result = this.buildSelectQuery({
- table: aliasedTable(table, tableAlias),
- fields: {},
- fieldsFlat: selection.map(({ field }) => ({
- path: [],
- field: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field
- })),
- joins,
- where,
- limit,
- offset,
- orderBy,
- setOperators: []
- });
- }
- return {
- tableTsKey: tableConfig.tsName,
- sql: result,
- selection
- };
- }
-}
-
-class SQLiteSyncDialect extends SQLiteDialect {
- static [entityKind] = "SQLiteSyncDialect";
- migrate(migrations, session, config) {
- const migrationsTable = config === undefined ? "__drizzle_migrations" : typeof config === "string" ? "__drizzle_migrations" : config.migrationsTable ?? "__drizzle_migrations";
- const migrationTableCreate = sql`
- CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (
- id SERIAL PRIMARY KEY,
- hash text NOT NULL,
- created_at numeric
- )
- `;
- session.run(migrationTableCreate);
- const dbMigrations = session.values(sql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`);
- const lastDbMigration = dbMigrations[0] ?? undefined;
- session.run(sql`BEGIN`);
- try {
- for (const migration of migrations) {
- if (!lastDbMigration || Number(lastDbMigration[2]) < migration.folderMillis) {
- for (const stmt of migration.sql) {
- session.run(sql.raw(stmt));
- }
- session.run(sql`INSERT INTO ${sql.identifier(migrationsTable)} ("hash", "created_at") VALUES(${migration.hash}, ${migration.folderMillis})`);
- }
- }
- session.run(sql`COMMIT`);
- } catch (e) {
- session.run(sql`ROLLBACK`);
- throw e;
- }
- }
-}
-
-// ../eve/node_modules/drizzle-orm/query-builders/query-builder.js
-class TypedQueryBuilder {
- static [entityKind] = "TypedQueryBuilder";
- getSelectedFields() {
- return this._.selectedFields;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/select.js
-class SQLiteSelectBuilder {
- static [entityKind] = "SQLiteSelectBuilder";
- fields;
- session;
- dialect;
- withList;
- distinct;
- constructor(config) {
- this.fields = config.fields;
- this.session = config.session;
- this.dialect = config.dialect;
- this.withList = config.withList;
- this.distinct = config.distinct;
- }
- from(source) {
- const isPartialSelect = !!this.fields;
- let fields;
- if (this.fields) {
- fields = this.fields;
- } else if (is(source, Subquery)) {
- fields = Object.fromEntries(Object.keys(source._.selectedFields).map((key) => [key, source[key]]));
- } else if (is(source, SQLiteViewBase)) {
- fields = source[ViewBaseConfig].selectedFields;
- } else if (is(source, SQL)) {
- fields = {};
- } else {
- fields = getTableColumns(source);
- }
- return new SQLiteSelectBase({
- table: source,
- fields,
- isPartialSelect,
- session: this.session,
- dialect: this.dialect,
- withList: this.withList,
- distinct: this.distinct
- });
- }
-}
-
-class SQLiteSelectQueryBuilderBase extends TypedQueryBuilder {
- static [entityKind] = "SQLiteSelectQueryBuilder";
- _;
- config;
- joinsNotNullableMap;
- tableName;
- isPartialSelect;
- session;
- dialect;
- cacheConfig = undefined;
- usedTables = /* @__PURE__ */ new Set;
- constructor({ table, fields, isPartialSelect, session, dialect, withList, distinct }) {
- super();
- this.config = {
- withList,
- table,
- fields: { ...fields },
- distinct,
- setOperators: []
- };
- this.isPartialSelect = isPartialSelect;
- this.session = session;
- this.dialect = dialect;
- this._ = {
- selectedFields: fields,
- config: this.config
- };
- this.tableName = getTableLikeName(table);
- this.joinsNotNullableMap = typeof this.tableName === "string" ? { [this.tableName]: true } : {};
- for (const item of extractUsedTable(table))
- this.usedTables.add(item);
- }
- getUsedTables() {
- return [...this.usedTables];
- }
- createJoin(joinType) {
- return (table, on) => {
- const baseTableName = this.tableName;
- const tableName = getTableLikeName(table);
- for (const item of extractUsedTable(table))
- this.usedTables.add(item);
- if (typeof tableName === "string" && this.config.joins?.some((join) => join.alias === tableName)) {
- throw new Error(`Alias "${tableName}" is already used in this query`);
- }
- if (!this.isPartialSelect) {
- if (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === "string") {
- this.config.fields = {
- [baseTableName]: this.config.fields
- };
- }
- if (typeof tableName === "string" && !is(table, SQL)) {
- const selection = is(table, Subquery) ? table._.selectedFields : is(table, View) ? table[ViewBaseConfig].selectedFields : table[Table.Symbol.Columns];
- this.config.fields[tableName] = selection;
- }
- }
- if (typeof on === "function") {
- on = on(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- if (!this.config.joins) {
- this.config.joins = [];
- }
- this.config.joins.push({ on, table, joinType, alias: tableName });
- if (typeof tableName === "string") {
- switch (joinType) {
- case "left": {
- this.joinsNotNullableMap[tableName] = false;
- break;
- }
- case "right": {
- this.joinsNotNullableMap = Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([key]) => [key, false]));
- this.joinsNotNullableMap[tableName] = true;
- break;
- }
- case "cross":
- case "inner": {
- this.joinsNotNullableMap[tableName] = true;
- break;
- }
- case "full": {
- this.joinsNotNullableMap = Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([key]) => [key, false]));
- this.joinsNotNullableMap[tableName] = false;
- break;
- }
- }
- }
- return this;
- };
- }
- leftJoin = this.createJoin("left");
- rightJoin = this.createJoin("right");
- innerJoin = this.createJoin("inner");
- fullJoin = this.createJoin("full");
- crossJoin = this.createJoin("cross");
- createSetOperator(type, isAll) {
- return (rightSelection) => {
- const rightSelect = typeof rightSelection === "function" ? rightSelection(getSQLiteSetOperators()) : rightSelection;
- if (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) {
- throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");
- }
- this.config.setOperators.push({ type, isAll, rightSelect });
- return this;
- };
- }
- union = this.createSetOperator("union", false);
- unionAll = this.createSetOperator("union", true);
- intersect = this.createSetOperator("intersect", false);
- except = this.createSetOperator("except", false);
- addSetOperators(setOperators) {
- this.config.setOperators.push(...setOperators);
- return this;
- }
- where(where) {
- if (typeof where === "function") {
- where = where(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- this.config.where = where;
- return this;
- }
- having(having) {
- if (typeof having === "function") {
- having = having(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- this.config.having = having;
- return this;
- }
- groupBy(...columns) {
- if (typeof columns[0] === "function") {
- const groupBy = columns[0](new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- this.config.groupBy = Array.isArray(groupBy) ? groupBy : [groupBy];
- } else {
- this.config.groupBy = columns;
- }
- return this;
- }
- orderBy(...columns) {
- if (typeof columns[0] === "function") {
- const orderBy = columns[0](new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).orderBy = orderByArray;
- } else {
- this.config.orderBy = orderByArray;
- }
- } else {
- const orderByArray = columns;
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).orderBy = orderByArray;
- } else {
- this.config.orderBy = orderByArray;
- }
- }
- return this;
- }
- limit(limit) {
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).limit = limit;
- } else {
- this.config.limit = limit;
- }
- return this;
- }
- offset(offset) {
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).offset = offset;
- } else {
- this.config.offset = offset;
- }
- return this;
- }
- getSQL() {
- return this.dialect.buildSelectQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- as(alias) {
- const usedTables = [];
- usedTables.push(...extractUsedTable(this.config.table));
- if (this.config.joins) {
- for (const it of this.config.joins)
- usedTables.push(...extractUsedTable(it.table));
- }
- return new Proxy(new Subquery(this.getSQL(), this.config.fields, alias, false, [...new Set(usedTables)]), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- }
- getSelectedFields() {
- return new Proxy(this.config.fields, new SelectionProxyHandler({ alias: this.tableName, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- }
- $dynamic() {
- return this;
- }
-}
-
-class SQLiteSelectBase extends SQLiteSelectQueryBuilderBase {
- static [entityKind] = "SQLiteSelect";
- _prepare(isOneTimeQuery = true) {
- if (!this.session) {
- throw new Error("Cannot execute a query on a query builder. Please use a database instance instead.");
- }
- const fieldsList = orderSelectedFields(this.config.fields);
- const query = this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), fieldsList, "all", true, undefined, {
- type: "select",
- tables: [...this.usedTables]
- }, this.cacheConfig);
- query.joinsNotNullableMap = this.joinsNotNullableMap;
- return query;
- }
- $withCache(config) {
- this.cacheConfig = config === undefined ? { config: {}, enable: true, autoInvalidate: true } : config === false ? { enable: false } : { enable: true, autoInvalidate: true, ...config };
- return this;
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute() {
- return this.all();
- }
-}
-applyMixins(SQLiteSelectBase, [QueryPromise]);
-function createSetOperator(type, isAll) {
- return (leftSelect, rightSelect, ...restSelects) => {
- const setOperators = [rightSelect, ...restSelects].map((select) => ({
- type,
- isAll,
- rightSelect: select
- }));
- for (const setOperator of setOperators) {
- if (!haveSameKeys(leftSelect.getSelectedFields(), setOperator.rightSelect.getSelectedFields())) {
- throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");
- }
- }
- return leftSelect.addSetOperators(setOperators);
- };
-}
-var getSQLiteSetOperators = () => ({
- union,
- unionAll,
- intersect,
- except
-});
-var union = createSetOperator("union", false);
-var unionAll = createSetOperator("union", true);
-var intersect = createSetOperator("intersect", false);
-var except = createSetOperator("except", false);
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.js
-class QueryBuilder {
- static [entityKind] = "SQLiteQueryBuilder";
- dialect;
- dialectConfig;
- constructor(dialect) {
- this.dialect = is(dialect, SQLiteDialect) ? dialect : undefined;
- this.dialectConfig = is(dialect, SQLiteDialect) ? undefined : dialect;
- }
- $with = (alias, selection) => {
- const queryBuilder = this;
- const as = (qb) => {
- if (typeof qb === "function") {
- qb = qb(queryBuilder);
- }
- return new Proxy(new WithSubquery(qb.getSQL(), selection ?? ("getSelectedFields" in qb ? qb.getSelectedFields() ?? {} : {}), alias, true), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- };
- return { as };
- };
- with(...queries) {
- const self2 = this;
- function select(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: undefined,
- dialect: self2.getDialect(),
- withList: queries
- });
- }
- function selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: undefined,
- dialect: self2.getDialect(),
- withList: queries,
- distinct: true
- });
- }
- return { select, selectDistinct };
- }
- select(fields) {
- return new SQLiteSelectBuilder({ fields: fields ?? undefined, session: undefined, dialect: this.getDialect() });
- }
- selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: undefined,
- dialect: this.getDialect(),
- distinct: true
- });
- }
- getDialect() {
- if (!this.dialect) {
- this.dialect = new SQLiteSyncDialect(this.dialectConfig);
- }
- return this.dialect;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/insert.js
-class SQLiteInsertBuilder {
- constructor(table, session, dialect, withList) {
- this.table = table;
- this.session = session;
- this.dialect = dialect;
- this.withList = withList;
- }
- static [entityKind] = "SQLiteInsertBuilder";
- values(values) {
- values = Array.isArray(values) ? values : [values];
- if (values.length === 0) {
- throw new Error("values() must be called with at least one value");
- }
- const mappedValues = values.map((entry) => {
- const result = {};
- const cols = this.table[Table.Symbol.Columns];
- for (const colKey of Object.keys(entry)) {
- const colValue = entry[colKey];
- result[colKey] = is(colValue, SQL) ? colValue : new Param(colValue, cols[colKey]);
- }
- return result;
- });
- return new SQLiteInsertBase(this.table, mappedValues, this.session, this.dialect, this.withList);
- }
- select(selectQuery) {
- const select = typeof selectQuery === "function" ? selectQuery(new QueryBuilder) : selectQuery;
- if (!is(select, SQL) && !haveSameKeys(this.table[Columns], select._.selectedFields)) {
- throw new Error("Insert select error: selected fields are not the same or are in a different order compared to the table definition");
- }
- return new SQLiteInsertBase(this.table, select, this.session, this.dialect, this.withList, true);
- }
-}
-
-class SQLiteInsertBase extends QueryPromise {
- constructor(table, values, session, dialect, withList, select) {
- super();
- this.session = session;
- this.dialect = dialect;
- this.config = { table, values, withList, select };
- }
- static [entityKind] = "SQLiteInsert";
- config;
- returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) {
- this.config.returning = orderSelectedFields(fields);
- return this;
- }
- onConflictDoNothing(config = {}) {
- if (!this.config.onConflict)
- this.config.onConflict = [];
- if (config.target === undefined) {
- this.config.onConflict.push(sql` on conflict do nothing`);
- } else {
- const targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;
- const whereSql = config.where ? sql` where ${config.where}` : sql``;
- this.config.onConflict.push(sql` on conflict ${targetSql} do nothing${whereSql}`);
- }
- return this;
- }
- onConflictDoUpdate(config) {
- if (config.where && (config.targetWhere || config.setWhere)) {
- throw new Error('You cannot use both "where" and "targetWhere"/"setWhere" at the same time - "where" is deprecated, use "targetWhere" or "setWhere" instead.');
- }
- if (!this.config.onConflict)
- this.config.onConflict = [];
- const whereSql = config.where ? sql` where ${config.where}` : undefined;
- const targetWhereSql = config.targetWhere ? sql` where ${config.targetWhere}` : undefined;
- const setWhereSql = config.setWhere ? sql` where ${config.setWhere}` : undefined;
- const targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;
- const setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));
- this.config.onConflict.push(sql` on conflict ${targetSql}${targetWhereSql} do update set ${setSql}${whereSql}${setWhereSql}`);
- return this;
- }
- getSQL() {
- return this.dialect.buildInsertQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- _prepare(isOneTimeQuery = true) {
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
- type: "insert",
- tables: extractUsedTable(this.config.table)
- });
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute() {
- return this.config.returning ? this.all() : this.run();
- }
- $dynamic() {
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/update.js
-class SQLiteUpdateBuilder {
- constructor(table, session, dialect, withList) {
- this.table = table;
- this.session = session;
- this.dialect = dialect;
- this.withList = withList;
- }
- static [entityKind] = "SQLiteUpdateBuilder";
- set(values) {
- return new SQLiteUpdateBase(this.table, mapUpdateSet(this.table, values), this.session, this.dialect, this.withList);
- }
-}
-
-class SQLiteUpdateBase extends QueryPromise {
- constructor(table, set, session, dialect, withList) {
- super();
- this.session = session;
- this.dialect = dialect;
- this.config = { set, table, withList, joins: [] };
- }
- static [entityKind] = "SQLiteUpdate";
- config;
- from(source) {
- this.config.from = source;
- return this;
- }
- createJoin(joinType) {
- return (table, on) => {
- const tableName = getTableLikeName(table);
- if (typeof tableName === "string" && this.config.joins.some((join) => join.alias === tableName)) {
- throw new Error(`Alias "${tableName}" is already used in this query`);
- }
- if (typeof on === "function") {
- const from = this.config.from ? is(table, SQLiteTable) ? table[Table.Symbol.Columns] : is(table, Subquery) ? table._.selectedFields : is(table, SQLiteViewBase) ? table[ViewBaseConfig].selectedFields : undefined : undefined;
- on = on(new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })), from && new Proxy(from, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- this.config.joins.push({ on, table, joinType, alias: tableName });
- return this;
- };
- }
- leftJoin = this.createJoin("left");
- rightJoin = this.createJoin("right");
- innerJoin = this.createJoin("inner");
- fullJoin = this.createJoin("full");
- where(where) {
- this.config.where = where;
- return this;
- }
- orderBy(...columns) {
- if (typeof columns[0] === "function") {
- const orderBy = columns[0](new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
- this.config.orderBy = orderByArray;
- } else {
- const orderByArray = columns;
- this.config.orderBy = orderByArray;
- }
- return this;
- }
- limit(limit) {
- this.config.limit = limit;
- return this;
- }
- returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) {
- this.config.returning = orderSelectedFields(fields);
- return this;
- }
- getSQL() {
- return this.dialect.buildUpdateQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- _prepare(isOneTimeQuery = true) {
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
- type: "insert",
- tables: extractUsedTable(this.config.table)
- });
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute() {
- return this.config.returning ? this.all() : this.run();
- }
- $dynamic() {
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/count.js
-class SQLiteCountBuilder extends SQL {
- constructor(params) {
- super(SQLiteCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);
- this.params = params;
- this.session = params.session;
- this.sql = SQLiteCountBuilder.buildCount(params.source, params.filters);
- }
- sql;
- static [entityKind] = "SQLiteCountBuilderAsync";
- [Symbol.toStringTag] = "SQLiteCountBuilderAsync";
- session;
- static buildEmbeddedCount(source, filters) {
- return sql`(select count(*) from ${source}${sql.raw(" where ").if(filters)}${filters})`;
- }
- static buildCount(source, filters) {
- return sql`select count(*) from ${source}${sql.raw(" where ").if(filters)}${filters}`;
- }
- then(onfulfilled, onrejected) {
- return Promise.resolve(this.session.count(this.sql)).then(onfulfilled, onrejected);
- }
- catch(onRejected) {
- return this.then(undefined, onRejected);
- }
- finally(onFinally) {
- return this.then((value) => {
- onFinally?.();
- return value;
- }, (reason) => {
- onFinally?.();
- throw reason;
- });
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/query.js
-class RelationalQueryBuilder {
- constructor(mode, fullSchema, schema, tableNamesMap, table, tableConfig, dialect, session) {
- this.mode = mode;
- this.fullSchema = fullSchema;
- this.schema = schema;
- this.tableNamesMap = tableNamesMap;
- this.table = table;
- this.tableConfig = tableConfig;
- this.dialect = dialect;
- this.session = session;
- }
- static [entityKind] = "SQLiteAsyncRelationalQueryBuilder";
- findMany(config) {
- return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? config : {}, "many") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? config : {}, "many");
- }
- findFirst(config) {
- return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? { ...config, limit: 1 } : { limit: 1 }, "first") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? { ...config, limit: 1 } : { limit: 1 }, "first");
- }
-}
-
-class SQLiteRelationalQuery extends QueryPromise {
- constructor(fullSchema, schema, tableNamesMap, table, tableConfig, dialect, session, config, mode) {
- super();
- this.fullSchema = fullSchema;
- this.schema = schema;
- this.tableNamesMap = tableNamesMap;
- this.table = table;
- this.tableConfig = tableConfig;
- this.dialect = dialect;
- this.session = session;
- this.config = config;
- this.mode = mode;
- }
- static [entityKind] = "SQLiteAsyncRelationalQuery";
- mode;
- getSQL() {
- return this.dialect.buildRelationalQuery({
- fullSchema: this.fullSchema,
- schema: this.schema,
- tableNamesMap: this.tableNamesMap,
- table: this.table,
- tableConfig: this.tableConfig,
- queryConfig: this.config,
- tableAlias: this.tableConfig.tsName
- }).sql;
- }
- _prepare(isOneTimeQuery = false) {
- const { query, builtQuery } = this._toSQL();
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](builtQuery, undefined, this.mode === "first" ? "get" : "all", true, (rawRows, mapColumnValue) => {
- const rows = rawRows.map((row) => mapRelationalRow(this.schema, this.tableConfig, row, query.selection, mapColumnValue));
- if (this.mode === "first") {
- return rows[0];
- }
- return rows;
- });
- }
- prepare() {
- return this._prepare(false);
- }
- _toSQL() {
- const query = this.dialect.buildRelationalQuery({
- fullSchema: this.fullSchema,
- schema: this.schema,
- tableNamesMap: this.tableNamesMap,
- table: this.table,
- tableConfig: this.tableConfig,
- queryConfig: this.config,
- tableAlias: this.tableConfig.tsName
- });
- const builtQuery = this.dialect.sqlToQuery(query.sql);
- return { query, builtQuery };
- }
- toSQL() {
- return this._toSQL().builtQuery;
- }
- executeRaw() {
- if (this.mode === "first") {
- return this._prepare(false).get();
- }
- return this._prepare(false).all();
- }
- async execute() {
- return this.executeRaw();
- }
-}
-
-class SQLiteSyncRelationalQuery extends SQLiteRelationalQuery {
- static [entityKind] = "SQLiteSyncRelationalQuery";
- sync() {
- return this.executeRaw();
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/raw.js
-class SQLiteRaw extends QueryPromise {
- constructor(execute, getSQL, action, dialect, mapBatchResult) {
- super();
- this.execute = execute;
- this.getSQL = getSQL;
- this.dialect = dialect;
- this.mapBatchResult = mapBatchResult;
- this.config = { action };
- }
- static [entityKind] = "SQLiteRaw";
- config;
- getQuery() {
- return { ...this.dialect.sqlToQuery(this.getSQL()), method: this.config.action };
- }
- mapResult(result, isFromBatch) {
- return isFromBatch ? this.mapBatchResult(result) : result;
- }
- _prepare() {
- return this;
- }
- isResponseInArrayMode() {
- return false;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/db.js
-class BaseSQLiteDatabase {
- constructor(resultKind, dialect, session, schema) {
- this.resultKind = resultKind;
- this.dialect = dialect;
- this.session = session;
- this._ = schema ? {
- schema: schema.schema,
- fullSchema: schema.fullSchema,
- tableNamesMap: schema.tableNamesMap
- } : {
- schema: undefined,
- fullSchema: {},
- tableNamesMap: {}
- };
- this.query = {};
- const query = this.query;
- if (this._.schema) {
- for (const [tableName, columns] of Object.entries(this._.schema)) {
- query[tableName] = new RelationalQueryBuilder(resultKind, schema.fullSchema, this._.schema, this._.tableNamesMap, schema.fullSchema[tableName], columns, dialect, session);
- }
- }
- this.$cache = { invalidate: async (_params) => {} };
- }
- static [entityKind] = "BaseSQLiteDatabase";
- query;
- $with = (alias, selection) => {
- const self2 = this;
- const as = (qb) => {
- if (typeof qb === "function") {
- qb = qb(new QueryBuilder(self2.dialect));
- }
- return new Proxy(new WithSubquery(qb.getSQL(), selection ?? ("getSelectedFields" in qb ? qb.getSelectedFields() ?? {} : {}), alias, true), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- };
- return { as };
- };
- $count(source, filters) {
- return new SQLiteCountBuilder({ source, filters, session: this.session });
- }
- with(...queries) {
- const self2 = this;
- function select(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: self2.session,
- dialect: self2.dialect,
- withList: queries
- });
- }
- function selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: self2.session,
- dialect: self2.dialect,
- withList: queries,
- distinct: true
- });
- }
- function update(table) {
- return new SQLiteUpdateBuilder(table, self2.session, self2.dialect, queries);
- }
- function insert(into) {
- return new SQLiteInsertBuilder(into, self2.session, self2.dialect, queries);
- }
- function delete_(from) {
- return new SQLiteDeleteBase(from, self2.session, self2.dialect, queries);
- }
- return { select, selectDistinct, update, insert, delete: delete_ };
- }
- select(fields) {
- return new SQLiteSelectBuilder({ fields: fields ?? undefined, session: this.session, dialect: this.dialect });
- }
- selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: this.session,
- dialect: this.dialect,
- distinct: true
- });
- }
- update(table) {
- return new SQLiteUpdateBuilder(table, this.session, this.dialect);
- }
- $cache;
- insert(into) {
- return new SQLiteInsertBuilder(into, this.session, this.dialect);
- }
- delete(from) {
- return new SQLiteDeleteBase(from, this.session, this.dialect);
- }
- run(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.run(sequel), () => sequel, "run", this.dialect, this.session.extractRawRunValueFromBatchResult.bind(this.session));
- }
- return this.session.run(sequel);
- }
- all(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.all(sequel), () => sequel, "all", this.dialect, this.session.extractRawAllValueFromBatchResult.bind(this.session));
- }
- return this.session.all(sequel);
- }
- get(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.get(sequel), () => sequel, "get", this.dialect, this.session.extractRawGetValueFromBatchResult.bind(this.session));
- }
- return this.session.get(sequel);
- }
- values(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.values(sequel), () => sequel, "values", this.dialect, this.session.extractRawValuesValueFromBatchResult.bind(this.session));
- }
- return this.session.values(sequel);
- }
- transaction(transaction, config) {
- return this.session.transaction(transaction, config);
- }
-}
-
-// ../eve/node_modules/drizzle-orm/cache/core/cache.js
-class Cache {
- static [entityKind] = "Cache";
-}
-
-class NoopCache extends Cache {
- strategy() {
- return "all";
- }
- static [entityKind] = "NoopCache";
- async get(_key) {
- return;
- }
- async put(_hashedQuery, _response, _tables, _config) {}
- async onMutate(_params) {}
-}
-async function hashQuery(sql2, params) {
- const dataToHash = `${sql2}-${JSON.stringify(params)}`;
- const encoder = new TextEncoder;
- const data = encoder.encode(dataToHash);
- const hashBuffer = await crypto.subtle.digest("SHA-256", data);
- const hashArray = [...new Uint8Array(hashBuffer)];
- const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
- return hashHex;
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/session.js
-class ExecuteResultSync extends QueryPromise {
- constructor(resultCb) {
- super();
- this.resultCb = resultCb;
- }
- static [entityKind] = "ExecuteResultSync";
- async execute() {
- return this.resultCb();
- }
- sync() {
- return this.resultCb();
- }
-}
-
-class SQLitePreparedQuery {
- constructor(mode, executeMethod, query, cache, queryMetadata, cacheConfig) {
- this.mode = mode;
- this.executeMethod = executeMethod;
- this.query = query;
- this.cache = cache;
- this.queryMetadata = queryMetadata;
- this.cacheConfig = cacheConfig;
- if (cache && cache.strategy() === "all" && cacheConfig === undefined) {
- this.cacheConfig = { enable: true, autoInvalidate: true };
- }
- if (!this.cacheConfig?.enable) {
- this.cacheConfig = undefined;
- }
- }
- static [entityKind] = "PreparedQuery";
- joinsNotNullableMap;
- async queryWithCache(queryString, params, query) {
- if (this.cache === undefined || is(this.cache, NoopCache) || this.queryMetadata === undefined) {
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if (this.cacheConfig && !this.cacheConfig.enable) {
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if ((this.queryMetadata.type === "insert" || this.queryMetadata.type === "update" || this.queryMetadata.type === "delete") && this.queryMetadata.tables.length > 0) {
- try {
- const [res] = await Promise.all([
- query(),
- this.cache.onMutate({ tables: this.queryMetadata.tables })
- ]);
- return res;
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if (!this.cacheConfig) {
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if (this.queryMetadata.type === "select") {
- const fromCache = await this.cache.get(this.cacheConfig.tag ?? await hashQuery(queryString, params), this.queryMetadata.tables, this.cacheConfig.tag !== undefined, this.cacheConfig.autoInvalidate);
- if (fromCache === undefined) {
- let result;
- try {
- result = await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- await this.cache.put(this.cacheConfig.tag ?? await hashQuery(queryString, params), result, this.cacheConfig.autoInvalidate ? this.queryMetadata.tables : [], this.cacheConfig.tag !== undefined, this.cacheConfig.config);
- return result;
- }
- return fromCache;
- }
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- getQuery() {
- return this.query;
- }
- mapRunResult(result, _isFromBatch) {
- return result;
- }
- mapAllResult(_result, _isFromBatch) {
- throw new Error("Not implemented");
- }
- mapGetResult(_result, _isFromBatch) {
- throw new Error("Not implemented");
- }
- execute(placeholderValues) {
- if (this.mode === "async") {
- return this[this.executeMethod](placeholderValues);
- }
- return new ExecuteResultSync(() => this[this.executeMethod](placeholderValues));
- }
- mapResult(response, isFromBatch) {
- switch (this.executeMethod) {
- case "run": {
- return this.mapRunResult(response, isFromBatch);
- }
- case "all": {
- return this.mapAllResult(response, isFromBatch);
- }
- case "get": {
- return this.mapGetResult(response, isFromBatch);
- }
- }
- }
-}
-
-class SQLiteSession {
- constructor(dialect) {
- this.dialect = dialect;
- }
- static [entityKind] = "SQLiteSession";
- prepareOneTimeQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper, queryMetadata, cacheConfig) {
- return this.prepareQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper, queryMetadata, cacheConfig);
- }
- run(query) {
- const staticQuery = this.dialect.sqlToQuery(query);
- try {
- return this.prepareOneTimeQuery(staticQuery, undefined, "run", false).run();
- } catch (err) {
- throw new DrizzleError({ cause: err, message: `Failed to run the query '${staticQuery.sql}'` });
- }
- }
- extractRawRunValueFromBatchResult(result) {
- return result;
- }
- all(query) {
- return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).all();
- }
- extractRawAllValueFromBatchResult(_result) {
- throw new Error("Not implemented");
- }
- get(query) {
- return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).get();
- }
- extractRawGetValueFromBatchResult(_result) {
- throw new Error("Not implemented");
- }
- values(query) {
- return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).values();
- }
- async count(sql2) {
- const result = await this.values(sql2);
- return result[0][0];
- }
- extractRawValuesValueFromBatchResult(_result) {
- throw new Error("Not implemented");
- }
-}
-
-class SQLiteTransaction extends BaseSQLiteDatabase {
- constructor(resultType, dialect, session, schema, nestedIndex = 0) {
- super(resultType, dialect, session, schema);
- this.schema = schema;
- this.nestedIndex = nestedIndex;
- }
- static [entityKind] = "SQLiteTransaction";
- rollback() {
- throw new TransactionRollbackError;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/logger.js
-class ConsoleLogWriter {
- static [entityKind] = "ConsoleLogWriter";
- write(message) {
- console.log(message);
- }
-}
-
-class DefaultLogger {
- static [entityKind] = "DefaultLogger";
- writer;
- constructor(config) {
- this.writer = config?.writer ?? new ConsoleLogWriter;
- }
- logQuery(query, params) {
- const stringifiedParams = params.map((p) => {
- try {
- return JSON.stringify(p);
- } catch {
- return String(p);
- }
- });
- const paramsStr = stringifiedParams.length ? ` -- params: [${stringifiedParams.join(", ")}]` : "";
- this.writer.write(`Query: ${query}${paramsStr}`);
- }
-}
-
-class NoopLogger {
- static [entityKind] = "NoopLogger";
- logQuery() {}
-}
-
-// ../eve/dist/db/schema.js
-var schema_exports = {};
-__export(schema_exports, {
- characters: () => characters,
- charactersRelations: () => charactersRelations,
- miningFleetParticipants: () => miningFleetParticipants,
- miningFleetParticipantsRelations: () => miningFleetParticipantsRelations,
- miningFleets: () => miningFleets,
- miningFleetsRelations: () => miningFleetsRelations,
- resumeCommands: () => resumeCommands,
- shared: () => shared,
- users: () => users,
- usersRelations: () => usersRelations
-});
-var shared = {
- createdAt: integer("created_at").notNull(),
- updatedAt: integer("updated_at")
-};
-var users = sqliteTable("users", {
- id: integer().primaryKey().unique().notNull(),
- discordID: text("discord_id").unique().notNull(),
- mainCharacter: integer("main_character"),
- ...shared
-}, (table) => [index("idx_discord_id").on(table.discordID), index("idx_main_character").on(table.mainCharacter)]);
-var usersRelations = relations(users, ({ one, many }) => ({
- characters: many(characters),
- main: one(characters, {
- fields: [users.mainCharacter],
- references: [characters.id]
- })
-}));
-var characters = sqliteTable("characters", {
- id: integer("id").primaryKey({ autoIncrement: true }),
- eveID: integer("eve_id").notNull(),
- userID: integer("user_id").notNull(),
- name: text().notNull(),
- accessToken: text("access_token").notNull(),
- expiresAt: integer("expires_at").notNull(),
- refreshToken: text("refresh_token").notNull(),
- ...shared
-}, (table) => [index("idx_user_id").on(table.userID), index("idx_eve_id").on(table.eveID)]);
-var charactersRelations = relations(characters, ({ one }) => ({ user: one(users, {
- fields: [characters.userID],
- references: [users.id]
-}) }));
-var resumeCommands = sqliteTable("resumecommands", {
- id: text().primaryKey(),
- command: text().notNull(),
- params: text().notNull(),
- context: text().notNull(),
- ...shared
-});
-var miningFleets = sqliteTable("mining_fleets", {
- id: integer("id").primaryKey({ autoIncrement: true }),
- name: text("name").notNull(),
- description: text("description"),
- creatorDiscordId: text("creator_discord_id").notNull(),
- startTime: integer("start_time").notNull(),
- endTime: integer("end_time"),
- status: text("status", { enum: [
- "configuring",
- "active",
- "ended",
- "generating_report",
- "completed",
- "failed"
- ] }).notNull().default("configuring"),
- taxRate: real("tax_rate").notNull().default(0),
- publicMessageId: text("public_message_id").unique(),
- publicChannelId: text("public_channel_id"),
- reportData: text("report_data"),
- creatorEphemeralMessageId: text("creator_ephemeral_message_id"),
- ...shared
-}, (table) => [
- index("idx_fleet_creator_discord_id").on(table.creatorDiscordId),
- index("idx_fleet_status").on(table.status),
- index("idx_fleet_public_message_id").on(table.publicMessageId)
-]);
-var miningFleetParticipants = sqliteTable("mining_fleet_participants", {
- id: integer("id").primaryKey({ autoIncrement: true }),
- fleetId: integer("fleet_id").notNull().references(() => miningFleets.id, { onDelete: "cascade" }),
- characterId: integer("character_id").notNull().references(() => characters.id, { onDelete: "cascade" }),
- discordId: text("discord_id").notNull(),
- role: text("role", { enum: [
- "miner",
- "security",
- "hauler"
- ] }).notNull(),
- joinTime: integer("join_time").notNull(),
- ...shared
-}, (table) => [
- index("idx_participant_fleet_id").on(table.fleetId),
- index("idx_participant_character_id").on(table.characterId),
- index("idx_participant_discord_id").on(table.discordId)
-]);
-var miningFleetsRelations = relations(miningFleets, ({ many }) => ({ participants: many(miningFleetParticipants) }));
-var miningFleetParticipantsRelations = relations(miningFleetParticipants, ({ one }) => ({
- fleet: one(miningFleets, {
- fields: [miningFleetParticipants.fleetId],
- references: [miningFleets.id]
- }),
- character: one(characters, {
- fields: [miningFleetParticipants.characterId],
- references: [characters.id]
- })
-}));
-
-// ../eve/dist/db/models/user.model.js
-var UserHelper = class {
- static find(id) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).where(eq(users.id, id)).leftJoin(characters, eq(users.id, characters.userID)).get();
- return this.createFromQuery(result);
- }
- static findByDiscordId(id) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).where(eq(users.discordID, id)).leftJoin(characters, eq(users.id, characters.userID)).get();
- return this.createFromQuery(result);
- }
- static findAll() {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).leftJoin(characters, eq(users.id, characters.userID)).all();
- return this.createFromQuery(result);
- }
- static findByCharacterId(id) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).leftJoin(characters, eq(users.id, characters.userID)).where(eq(characters.id, id)).all();
- return this.createFromQuery(result);
- }
- static findByCharacterName(name) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).leftJoin(characters, eq(users.id, characters.userID)).where(eq(characters.name, name)).all();
- return this.createFromQuery(result);
- }
- static createFromQuery(query) {
- if (!query)
- return [];
- if (Array.isArray(query))
- return query.map((user) => {
- return {
- id: user.id,
- discordID: user.discordID,
- createdAt: new Date(user.createdAt),
- updatedAt: new Date(user.updatedAt),
- characterIDs: user.characterIDsString ? JSON.parse(user.characterIDsString ?? "[]").map((s) => Number(s)).sort() : [],
- mainCharacterID: user.mainCharacterID
- };
- });
- else
- return {
- id: query.id,
- discordID: query.discordID,
- createdAt: new Date(query.createdAt),
- updatedAt: new Date(query.updatedAt),
- characterIDs: query.characterIDsString ? JSON.parse(query.characterIDsString ?? "[]").map((s) => Number(s)).sort() : [],
- mainCharacterID: query.mainCharacterID
- };
- }
- static create(discordID) {
- this.save({
- discordID,
- createdAt: /* @__PURE__ */ new Date,
- updatedAt: /* @__PURE__ */ new Date
- });
- return this.findByDiscordId(discordID);
- }
- static save(user) {
- db.insert(users).values({
- id: user.id,
- discordID: user.discordID,
- mainCharacter: user.mainCharacterID,
- createdAt: user.createdAt.getTime(),
- updatedAt: user.updatedAt.getTime()
- }).onConflictDoUpdate({
- target: users.id,
- set: {
- discordID: user.discordID,
- mainCharacter: user.mainCharacterID,
- updatedAt: user.updatedAt.getTime()
- }
- }).run();
- return user;
- }
- static delete(user) {
- db.delete(users).where(eq(users.id, user.id)).run();
- }
- static getCharacter(user, index2) {
- if (!user.characterIDs)
- return;
- if (index2 >= user.characterIDs.length)
- return;
- return CharacterHelper.find(user.characterIDs[index2]);
- }
-};
-
-// ../eve/dist/db/models/resume-command.model.js
-var ResumeCommand = class ResumeCommand2 {
- id;
- command;
- params;
- context;
- created = /* @__PURE__ */ new Date;
- constructor() {
- this.created = /* @__PURE__ */ new Date;
- }
- static find(messageId) {
- const result = db.select().from(resumeCommands).where(eq(resumeCommands.id, messageId)).get();
- return this.createFromQuery(result);
- }
- static create(messageId, command, params = {}, context = {}) {
- const resume = new ResumeCommand2;
- resume.id = messageId;
- resume.command = command;
- resume.params = JSON.stringify(params);
- resume.context = JSON.stringify(context);
- return resume;
- }
- static createFromQuery(query) {
- if (!query)
- return null;
- const resume = new ResumeCommand2;
- resume.id = query.id;
- resume.command = query.command;
- resume.params = query.params;
- resume.context = query.context;
- resume.created = query.created;
- return resume;
- }
- save() {
- db.insert(resumeCommands).values({
- id: this.id,
- command: this.command,
- params: this.params,
- context: this.context,
- createdAt: this.created.getTime()
- }).onConflictDoUpdate({
- target: resumeCommands.id,
- set: {
- command: this.command,
- params: this.params,
- context: this.context
- }
- }).run();
- return this;
- }
- delete() {
- db.delete(resumeCommands).where(eq(resumeCommands.id, this.id)).run();
- }
- static delete(messageId) {
- db.delete(resumeCommands).where(eq(resumeCommands.id, messageId)).run();
- }
-};
-
-// ../eve/dist/db/models/index.js
-var models_exports = {};
-__export(models_exports, {
- CharacterHelper: () => CharacterHelper,
- ResumeCommand: () => ResumeCommand,
- UserHelper: () => UserHelper
-});
-
-// ../eve/node_modules/drizzle-orm/bun-sqlite/driver.js
-import { Database } from "bun:sqlite";
-
-// ../eve/node_modules/drizzle-orm/bun-sqlite/session.js
-class SQLiteBunSession extends SQLiteSession {
- constructor(client, dialect, schema, options2 = {}) {
- super(dialect);
- this.client = client;
- this.schema = schema;
- this.logger = options2.logger ?? new NoopLogger;
- }
- static [entityKind] = "SQLiteBunSession";
- logger;
- exec(query) {
- this.client.exec(query);
- }
- prepareQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper) {
- const stmt = this.client.prepare(query.sql);
- return new PreparedQuery(stmt, query, this.logger, fields, executeMethod, isResponseInArrayMode, customResultMapper);
- }
- transaction(transaction, config = {}) {
- const tx = new SQLiteBunTransaction("sync", this.dialect, this, this.schema);
- let result;
- const nativeTx = this.client.transaction(() => {
- result = transaction(tx);
- });
- nativeTx[config.behavior ?? "deferred"]();
- return result;
- }
-}
-
-class SQLiteBunTransaction extends SQLiteTransaction {
- static [entityKind] = "SQLiteBunTransaction";
- transaction(transaction) {
- const savepointName = `sp${this.nestedIndex}`;
- const tx = new SQLiteBunTransaction("sync", this.dialect, this.session, this.schema, this.nestedIndex + 1);
- this.session.run(sql.raw(`savepoint ${savepointName}`));
- try {
- const result = transaction(tx);
- this.session.run(sql.raw(`release savepoint ${savepointName}`));
- return result;
- } catch (err) {
- this.session.run(sql.raw(`rollback to savepoint ${savepointName}`));
- throw err;
- }
- }
-}
-
-class PreparedQuery extends SQLitePreparedQuery {
- constructor(stmt, query, logger, fields, executeMethod, _isResponseInArrayMode, customResultMapper) {
- super("sync", executeMethod, query);
- this.stmt = stmt;
- this.logger = logger;
- this.fields = fields;
- this._isResponseInArrayMode = _isResponseInArrayMode;
- this.customResultMapper = customResultMapper;
- }
- static [entityKind] = "SQLiteBunPreparedQuery";
- run(placeholderValues) {
- const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
- this.logger.logQuery(this.query.sql, params);
- return this.stmt.run(...params);
- }
- all(placeholderValues) {
- const { fields, query, logger, joinsNotNullableMap, stmt, customResultMapper } = this;
- if (!fields && !customResultMapper) {
- const params = fillPlaceholders(query.params, placeholderValues ?? {});
- logger.logQuery(query.sql, params);
- return stmt.all(...params);
- }
- const rows = this.values(placeholderValues);
- if (customResultMapper) {
- return customResultMapper(rows);
- }
- return rows.map((row) => mapResultRow(fields, row, joinsNotNullableMap));
- }
- get(placeholderValues) {
- const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
- this.logger.logQuery(this.query.sql, params);
- const row = this.stmt.values(...params)[0];
- if (!row) {
- return;
- }
- const { fields, joinsNotNullableMap, customResultMapper } = this;
- if (!fields && !customResultMapper) {
- return row;
- }
- if (customResultMapper) {
- return customResultMapper([row]);
- }
- return mapResultRow(fields, row, joinsNotNullableMap);
- }
- values(placeholderValues) {
- const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
- this.logger.logQuery(this.query.sql, params);
- return this.stmt.values(...params);
- }
- isResponseInArrayMode() {
- return this._isResponseInArrayMode;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/bun-sqlite/driver.js
-class BunSQLiteDatabase extends BaseSQLiteDatabase {
- static [entityKind] = "BunSQLiteDatabase";
-}
-function construct(client, config = {}) {
- const dialect = new SQLiteSyncDialect({ casing: config.casing });
- let logger;
- if (config.logger === true) {
- logger = new DefaultLogger;
- } else if (config.logger !== false) {
- logger = config.logger;
- }
- let schema;
- if (config.schema) {
- const tablesConfig = extractTablesRelationalConfig(config.schema, createTableRelationsHelpers);
- schema = {
- fullSchema: config.schema,
- schema: tablesConfig.tables,
- tableNamesMap: tablesConfig.tableNamesMap
- };
- }
- const session = new SQLiteBunSession(client, dialect, schema, { logger });
- const db2 = new BunSQLiteDatabase("sync", dialect, session, schema);
- db2.$client = client;
- return db2;
-}
-function drizzle(...params) {
- if (params[0] === undefined || typeof params[0] === "string") {
- const instance = params[0] === undefined ? new Database : new Database(params[0]);
- return construct(instance, params[1]);
- }
- if (isConfig(params[0])) {
- const { connection, client, ...drizzleConfig } = params[0];
- if (client)
- return construct(client, drizzleConfig);
- if (typeof connection === "object") {
- const { source, ...opts } = connection;
- const options2 = Object.values(opts).filter((v) => v !== undefined).length ? opts : undefined;
- const instance2 = new Database(source, options2);
- return construct(instance2, drizzleConfig);
- }
- const instance = new Database(connection);
- return construct(instance, drizzleConfig);
- }
- return construct(params[0], params[1]);
-}
-((drizzle2) => {
- function mock(config) {
- return construct({}, config);
- }
- drizzle2.mock = mock;
-})(drizzle || (drizzle = {}));
-
-// ../eve/dist/db/index.js
-import { Database as Database2 } from "bun:sqlite";
-import { join } from "path";
-var DB_PATH = process.env.AUTH_DB_PATH || join(process.cwd(), "../../db/kitten.db");
-console.log("Using DB_PATH:", DB_PATH);
-var sqlite = new Database2(DB_PATH);
-var db = drizzle(sqlite, { schema: {
- users,
- characters,
- resumeCommands,
- miningFleets,
- miningFleetParticipants
-} });
-
-// ../eve/dist/db/models/character.model.js
-var CharacterHelper = class CharacterHelper2 {
- static hasValidToken(character) {
- return /* @__PURE__ */ new Date < character.expiresAt;
- }
- static getScopes(character) {
- const decoded = jwtDecode(character.accessToken);
- return typeof decoded.scp === "string" ? [decoded.scp] : decoded.scp;
- }
- static hasOnlyPublicScope(character) {
- return this.getScopes(character).length === 1 && this.hasScope(character, "publicData");
- }
- static getTokens(character) {
- return {
- access_token: character.accessToken,
- refresh_token: character.refreshToken,
- expires_in: (character.expiresAt.getTime() - Date.now()) / 1000
- };
- }
- static hasScope(character, scope) {
- return this.getScopes(character).includes(scope);
- }
- static hasAllScopes(character, scopes) {
- const has = this.getScopes(character);
- return scopes.every((scope) => has.includes(scope));
- }
- static find(id) {
- const result = db.select().from(characters).where(eq(characters.id, id)).limit(1).get();
- const c = this.createCharacters(result);
- return c ? c[0] : undefined;
- }
- static findByUser(user) {
- const result = db.select().from(characters).where(eq(characters.userID, user.id)).all();
- return this.createCharacters(result);
- }
- static findByUserAndEveID(userID, eveID) {
- const result = db.select().from(characters).where(and(eq(characters.userID, userID), eq(characters.eveID, eveID))).limit(1).get();
- const c = this.createCharacters(result);
- return c ? c[0] : undefined;
- }
- static findByName(userID, name) {
- const result = db.select().from(characters).where(and(eq(characters.name, name), eq(characters.userID, userID))).limit(1).get();
- const c = this.createCharacters(result);
- return c ? c[0] : undefined;
- }
- static findAll() {
- const result = db.select().from(characters).all();
- return this.createCharacters(result);
- }
- static create(eveID, name, user, tokens) {
- return this.save({
- eveID,
- userID: user.id,
- accessToken: tokens.access_token,
- expiresAt: /* @__PURE__ */ new Date(tokens.expires_in * 1000),
- refreshToken: tokens.refresh_token,
- name,
- createdAt: /* @__PURE__ */ new Date
- });
- }
- static createCharacters(query) {
- if (!query)
- return [];
- if (Array.isArray(query))
- return query.map((character) => {
- return {
- id: character.id,
- eveID: character.eveID,
- userID: character.userID,
- accessToken: character.accessToken,
- expiresAt: new Date(character.expiresAt),
- refreshToken: character.refreshToken,
- name: character.name,
- createdAt: new Date(character.createdAt),
- updatedAt: new Date(character.updatedAt)
- };
- });
- else
- return [{
- id: query.id,
- eveID: query.eveID,
- userID: query.userID,
- accessToken: query.accessToken,
- expiresAt: new Date(query.expiresAt),
- refreshToken: query.refreshToken,
- name: query.name,
- createdAt: new Date(query.createdAt),
- updatedAt: new Date(query.updatedAt)
- }];
- }
- static save(character) {
- db.insert(characters).values({
- id: character.id,
- eveID: character.eveID,
- userID: character.userID,
- name: character.name,
- accessToken: character.accessToken,
- expiresAt: character.expiresAt.getTime(),
- refreshToken: character.refreshToken,
- createdAt: Date.now(),
- updatedAt: Date.now()
- }).onConflictDoUpdate({
- target: characters.id,
- set: {
- eveID: character.eveID,
- userID: character.userID,
- name: character.name,
- accessToken: character.accessToken,
- expiresAt: character.expiresAt.getTime(),
- refreshToken: character.refreshToken,
- updatedAt: Date.now()
- }
- }).run();
- return CharacterHelper2.findByUserAndEveID(character.userID, character.eveID);
- }
- static delete(character) {
- db.delete(characters).where(eq(characters.id, character.id)).run();
- }
- static async refreshTokens(character, scopes) {
- const tokens = await refresh({ refresh_token: character.refreshToken }, scopes);
- const decoded = await validateToken(tokens.access_token);
- if (!decoded) {
- console.error(`Failed to validate token for character ${character.eveID}`);
- return character;
- }
- character.accessToken = tokens.access_token;
- character.expiresAt = new Date(Date.now() + tokens.expires_in * 1000);
- character.refreshToken = tokens.refresh_token;
- this.save(character);
- return character;
- }
-};
-
-// ../eve/dist/esi/fetch.js
-var cache = /* @__PURE__ */ new Map;
-function cleanCache() {
- const now = Date.now();
- for (const [key, value] of cache)
- if (value.expires < now)
- cache.delete(key);
-}
-setInterval(cleanCache, 1000 * 60 * 15);
-var defaultCacheDuration = 1000 * 60 * 30;
-async function esiFetch(path, character, { method = "GET", body, noCache = false, cacheDuration = defaultCacheDuration } = {}) {
- try {
- const headers = {
- "User-Agent": options.user_agent,
- Accept: "application/json"
- };
- if (character) {
- if (!CharacterHelper.hasValidToken(character)) {
- await CharacterHelper.refreshTokens(character);
- if (!CharacterHelper.hasValidToken(character))
- throw new Error(`Failed to refresh token for character: ${character.eveID}`);
- }
- headers["Authorization"] = `Bearer ${character.accessToken}`;
- }
- const init = {
- headers,
- method: method || "GET",
- body: body || undefined
- };
- const url = new URL(`${ESI_LATEST_URL}${path.startsWith("/") ? path : "/" + path}`);
- url.searchParams.set("datasource", "tranquility");
- if (!noCache && init.method === "GET") {
- const cached = cache.get(url.href);
- if (cached && cached?.expires > Date.now())
- return cached.data;
- }
- const res = await fetch(url, init);
- const data = await res.json();
- if (!res.ok) {
- console.error(`ESI request failure at ${path} | ${res.status}:${res.statusText} => ${JSON.stringify(data)}`);
- return null;
- }
- if (init.method === "GET")
- cache.set(url.href, {
- expires: Math.max(res.headers.get("expires") && new Date(Number(res.headers.get("expires") || "")).getTime() || 0, Date.now() + cacheDuration),
- data
- });
- return data;
- } catch (err) {
- console.error(`ESI request failure at ${path} | ${JSON.stringify(err)}`, err);
- return null;
- }
-}
-
-// ../eve/dist/esi/character.js
-var character_exports = {};
-__export(character_exports, {
- getCharacterAffiliations: () => getCharacterAffiliations,
- getCharacterAgentResearch: () => getCharacterAgentResearch,
- getCharacterAssetLocations: () => getCharacterAssetLocations,
- getCharacterAssetNames: () => getCharacterAssetNames,
- getCharacterAssets: () => getCharacterAssets,
- getCharacterBlueprints: () => getCharacterBlueprints,
- getCharacterClones: () => getCharacterClones,
- getCharacterContactNotifications: () => getCharacterContactNotifications,
- getCharacterCorporationHistory: () => getCharacterCorporationHistory,
- getCharacterCurrentShip: () => getCharacterCurrentShip,
- getCharacterImplants: () => getCharacterImplants,
- getCharacterJumpFatigue: () => getCharacterJumpFatigue,
- getCharacterLocation: () => getCharacterLocation,
- getCharacterMedals: () => getCharacterMedals,
- getCharacterNotifications: () => getCharacterNotifications,
- getCharacterOnline: () => getCharacterOnline,
- getCharacterPortraits: () => getCharacterPortraits,
- getCharacterPublicData: () => getCharacterPublicData,
- getCharacterRoles: () => getCharacterRoles,
- getCharacterStandings: () => getCharacterStandings,
- getCharacterTitles: () => getCharacterTitles,
- getCharacterWallet: () => getCharacterWallet,
- getCharacterWalletJournal: () => getCharacterWalletJournal,
- getCharacterWalletTransactions: () => getCharacterWalletTransactions,
- getPortraitURL: () => getPortraitURL
-});
-function getCharacterPublicData(id) {
- return esiFetch(`/characters/${id}/`);
-}
-function getCharacterAffiliations(ids) {
- return esiFetch(`/characters/affiliation/`, undefined, {
- method: "POST",
- body: JSON.stringify(ids)
- })[0];
-}
-function getCharacterPortraits(id) {
- return esiFetch(`/characters/${id}/portrait/`);
-}
-function getCharacterCorporationHistory(id) {
- return esiFetch(`/characters/${id}/corporationhistory/`);
-}
-function getPortraitURL(id) {
- return `https://images.evetech.net/characters/${id}/portrait`;
-}
-function getCharacterRoles(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_corporation_roles.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/roles/`, character);
-}
-function getCharacterTitles(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_titles.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/titles/`, character);
-}
-function getCharacterStandings(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_standings.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/standings/`, character);
-}
-function getCharacterNotifications(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_notifications.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/notifications/`, character);
-}
-function getCharacterContactNotifications(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_notifications.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/notifications/contacts`, character);
-}
-function getCharacterMedals(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_medals.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/medals/`, character);
-}
-function getCharacterJumpFatigue(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_fatigue.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/fatigue/`, character);
-}
-function getCharacterBlueprints(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_blueprints.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/blueprints/`, character);
-}
-function getCharacterAgentResearch(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_agents_research.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/agents_research/`, character);
-}
-function getCharacterClones(character) {
- if (!CharacterHelper.hasScope(character, "esi-clones.read_clones.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/clones/`, character);
-}
-function getCharacterImplants(character) {
- if (!CharacterHelper.hasScope(character, "esi-clones.read_implants.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/implants/`, character);
-}
-function getCharacterAssets(character) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_assets.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/assets/`, character);
-}
-function getCharacterAssetLocations(character, ids) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_assets.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/assets/locations/`, character, {
- method: "POST",
- body: JSON.stringify(ids)
- });
-}
-function getCharacterAssetNames(character, ids) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_assets.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/assets/names/`, character, {
- method: "POST",
- body: JSON.stringify(ids)
- });
-}
-function getCharacterWallet(character) {
- if (!CharacterHelper.hasScope(character, "esi-wallet.read_character_wallet.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/wallet/`, character);
-}
-function getCharacterWalletTransactions(character, fromId) {
- if (!CharacterHelper.hasScope(character, "esi-wallet.read_character_wallet.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/wallet/transactions/`, character, {
- method: "POST",
- body: JSON.stringify(fromId)
- });
-}
-function getCharacterWalletJournal(character, page = 1) {
- if (!CharacterHelper.hasScope(character, "esi-wallet.read_character_wallet.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/wallet/journal/?page=${page}`, character);
-}
-function getCharacterLocation(character) {
- if (!CharacterHelper.hasScope(character, "esi-location.read_location.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/location/`, character);
-}
-function getCharacterOnline(character) {
- if (!CharacterHelper.hasScope(character, "esi-location.read_online.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/online/`, character);
-}
-function getCharacterCurrentShip(character) {
- if (!CharacterHelper.hasScope(character, "esi-location.read_ship_type.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/ship/`, character);
-}
-
-// ../eve/dist/esi/corporation.js
-var corporation_exports = {};
-__export(corporation_exports, {
- getCorporationAllianceHistory: () => getCorporationAllianceHistory,
- getCorporationAssetLocations: () => getCorporationAssetLocations,
- getCorporationAssetNames: () => getCorporationAssetNames,
- getCorporationAssets: () => getCorporationAssets,
- getCorporationData: () => getCorporationData,
- getCorporationIcons: () => getCorporationIcons
-});
-async function getCorporationData(id) {
- return await esiFetch(`/corporations/${id}/`);
-}
-async function getCorporationAllianceHistory(id) {
- return await esiFetch(`/corporations/${id}/alliancehistory/`);
-}
-async function getCorporationIcons(id) {
- return await esiFetch(`/corporations/${id}/icons/`);
-}
-async function getCorporationAssets(id, character) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_corporation_assets.v1"))
- return null;
- return await esiFetch(`/corporations/${id}/assets/`, character);
-}
-async function getCorporationAssetLocations(id, character, ids) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_corporation_assets.v1"))
- return null;
- return await esiFetch(`/corporations/${id}/assets/locations/`, character, {
- method: "POST",
- body: JSON.stringify(ids)
- });
-}
-async function getCorporationAssetNames(id, character, ids) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_corporation_assets.v1"))
- return null;
- return await esiFetch(`/corporations/${id}/assets/names/`, character, {
- method: "POST",
- body: JSON.stringify(ids)
- });
-}
-
-// ../eve/dist/esi/alliance.js
-var alliance_exports = {};
-__export(alliance_exports, {
- getAllianceCorporations: () => getAllianceCorporations,
- getAllianceData: () => getAllianceData,
- getAllianceIcons: () => getAllianceIcons
-});
-async function getAllianceData(id) {
- return await esiFetch(`/alliances/${id}/`);
-}
-async function getAllianceCorporations(id) {
- return await esiFetch(`/alliances/${id}/corporations/`);
-}
-async function getAllianceIcons(id) {
- return await esiFetch(`/alliances/${id}/icons/`);
-}
-
-// ../eve/dist/esi/skills.js
-function getCharacterSkillQueue(character) {
- if (!CharacterHelper.hasScope(character, "esi-skills.read_skillqueue.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/skillqueue`, character);
-}
-function calculateTrainingPercentage(queuedSkill) {
- const trainingStartPosition = (queuedSkill.training_start_sp - queuedSkill.level_start_sp) / queuedSkill.level_end_sp;
- const timePosition = ((/* @__PURE__ */ new Date()).getTime() - new Date(queuedSkill.start_date).getTime()) / (new Date(queuedSkill.finish_date).getTime() - new Date(queuedSkill.start_date).getTime());
- return trainingStartPosition + (1 - trainingStartPosition) * timePosition;
-}
-
-// src/api/auth/discordID/[discordID]/characterID/[characterID]/modules/[modules].ts
-var allScopes = Object.values(SCOPES).filter((value) => typeof value === "string");
-var allScopesString = allScopes.join(" ");
-var module_Scopes = {
- "Full ESI": allScopesString,
- Public: joinScopes(SCOPES.PUBLIC_DATA),
- Characters: joinScopes(SCOPES.PUBLIC_DATA),
- Mail: joinScopes(SCOPES.MAIL_READ_MAIL, SCOPES.MAIL_SEND_MAIL, SCOPES.MAIL_ORGANIZE_MAIL),
- Skills: joinScopes(SCOPES.SKILLS_READ_SKILLQUEUE, SCOPES.SKILLS_READ_SKILLS)
-};
-async function GET({ store, route: { params } }) {
- let modules = params["modules"].split(" ");
- let scopes = joinScopes(...modules.map((module) => module_Scopes[module]));
- const eveauth = store.get("eveauth");
- const response = await eveauth.redirect(scopes);
- setCookie(response, "discordID", params["discordID"], 60 * 10);
- setCookie(response, "characterID", params["characterID"], 60 * 10);
- return response;
-}
-export {
- GET
-};
-
-//# debugId=704A05081D1951F864756E2164756E21
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2FmZS1idWZmZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3c1xcbGliXFxkYXRhLXN0cmVhbS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlY2RzYS1zaWctZm9ybWF0dGVyXFxzcmNcXHBhcmFtLWJ5dGVzLWZvci1hbGcuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWNkc2Etc2lnLWZvcm1hdHRlclxcc3JjXFxlY2RzYS1zaWctZm9ybWF0dGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGJ1ZmZlci1lcXVhbC1jb25zdGFudC10aW1lXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd2FcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3c1xcbGliXFx0b3N0cmluZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd3NcXGxpYlxcc2lnbi1zdHJlYW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandzXFxsaWJcXHZlcmlmeS1zdHJlYW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGRlY29kZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxcSnNvbldlYlRva2VuRXJyb3IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcanNvbndlYnRva2VuXFxsaWJcXE5vdEJlZm9yZUVycm9yLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxUb2tlbkV4cGlyZWRFcnJvci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxtc1xcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcanNvbndlYnRva2VuXFxsaWJcXHRpbWVzcGFuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcaW50ZXJuYWxcXGNvbnN0YW50cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxkZWJ1Zy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxyZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxwYXJzZS1vcHRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcaW50ZXJuYWxcXGlkZW50aWZpZXJzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcY2xhc3Nlc1xcc2VtdmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxwYXJzZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcdmFsaWQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGNsZWFuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxpbmMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGRpZmYuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXG1ham9yLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxtaW5vci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xccGF0Y2guanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHByZXJlbGVhc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGNvbXBhcmUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHJjb21wYXJlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb21wYXJlLWxvb3NlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb21wYXJlLWJ1aWxkLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxzb3J0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxyc29ydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcZ3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGx0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxlcS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcbmVxLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxndGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGx0ZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcY21wLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb2VyY2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxpbnRlcm5hbFxcbHJ1Y2FjaGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxjbGFzc2VzXFxyYW5nZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGNsYXNzZXNcXGNvbXBhcmF0b3IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHNhdGlzZmllcy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcdG8tY29tcGFyYXRvcnMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXG1heC1zYXRpc2Z5aW5nLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxtaW4tc2F0aXNmeWluZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcbWluLXZlcnNpb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXHZhbGlkLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxvdXRzaWRlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxndHIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXGx0ci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcaW50ZXJzZWN0cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcc2ltcGxpZnkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXHN1YnNldC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxhc3ltbWV0cmljS2V5RGV0YWlsc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxccnNhUHNzS2V5RGV0YWlsc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxcdmFsaWRhdGVBc3ltbWV0cmljS2V5LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxwc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXHZlcmlmeS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxsb2Rhc2guaW5jbHVkZXNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc2Jvb2xlYW5cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc2ludGVnZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc251bWJlclxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbG9kYXNoLmlzcGxhaW5vYmplY3RcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc3N0cmluZ1xcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbG9kYXNoLm9uY2VcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcc2lnbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGJuLmpzXFxsaWJcXGJuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGluaGVyaXRzXFxpbmhlcml0c19icm93c2VyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGluaGVyaXRzXFxpbmhlcml0cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzYWZlci1idWZmZXJcXHNhZmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYmFzZVxccmVwb3J0ZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxiYXNlXFxidWZmZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbWluaW1hbGlzdGljLWFzc2VydFxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxiYXNlXFxub2RlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcY29uc3RhbnRzXFxkZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxlbmNvZGVyc1xcZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcZW5jb2RlcnNcXHBlbS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxhc24xLmpzXFxsaWJcXGFzbjFcXGVuY29kZXJzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxhc24xLmpzXFxsaWJcXGFzbjFcXGRlY29kZXJzXFxkZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxkZWNvZGVyc1xccGVtLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcZGVjb2RlcnNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYXBpLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYmFzZVxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxjb25zdGFudHNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzXFxsaWJcXHV0aWxzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxicm9yYW5kXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVcXGJhc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGN1cnZlXFxzaG9ydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVcXG1vbnQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGN1cnZlXFxlZHdhcmRzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljXFxjdXJ2ZVxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXGNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXHNoYVxcY29tbW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwxLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwyNTYuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxzaGFcXDIyNC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXHNoYVxcNTEyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwzODQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxzaGEuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxyaXBlbWQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxobWFjLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xccHJlY29tcHV0ZWRcXHNlY3AyNTZrMS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhtYWMtZHJiZ1xcbGliXFxobWFjLWRyYmcuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxrZXkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxzaWduYXR1cmUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXGtleS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXHNpZ25hdHVyZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYjY0LXRvLWJuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYXNuMVxcYWxnb3JpdGhtLWlkZW50aWZpZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandrLXRvLXBlbVxcc3JjXFxhc24xXFxwdWJsaWMta2V5LWluZm8uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandrLXRvLXBlbVxcc3JjXFxhc24xXFx2ZXJzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYXNuMVxccHJpdmF0ZS1rZXktaW5mby5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd2stdG8tcGVtXFxzcmNcXGVjLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xccnNhLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcandrLXRvLXBlbS5qcyIsICIuLlxcc3JjXFx1dGlsc1xcY29va2llcy50cyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxvcHRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxfdmlydHVhbFxccm9sbGRvd25fcnVudGltZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd3QtZGVjb2RlXFxidWlsZFxcZXNtXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxAb3Nsb2pzXFxlbmNvZGluZ1xcZGlzdFxcYmFzZTMyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXEBvc2xvanNcXGVuY29kaW5nXFxkaXN0XFxiYXNlNjQuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGVzaVxcYXV0aC5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxzY29wZXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGVudGl0eS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcY29sdW1uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxjb2x1bW4tYnVpbGRlci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdGFibGUudXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHRyYWNpbmctdXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHBnLWNvcmVcXHVuaXF1ZS1jb25zdHJhaW50LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxwZy1jb3JlXFxjb2x1bW5zXFxjb21tb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHBnLWNvcmVcXGNvbHVtbnNcXGVudW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHN1YnF1ZXJ5LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx2ZXJzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx0cmFjaW5nLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx2aWV3LWNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdGFibGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbFxcc3FsLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxhbGlhcy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxmb3JlaWduLWtleXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx1bmlxdWUtY29uc3RyYWludC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXGNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXGJsb2IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxjdXN0b20uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxpbnRlZ2VyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxcY29sdW1uc1xcbnVtZXJpYy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXHJlYWwuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFx0ZXh0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzZWxlY3Rpb24tcHJveHkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHF1ZXJ5LXByb21pc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxhbGwuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx0YWJsZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGluZGV4ZXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFxkZWxldGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGNhc2luZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcZXJyb3JzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxwZy1jb3JlXFx0YWJsZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxccGctY29yZVxccHJpbWFyeS1rZXlzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxcXGV4cHJlc3Npb25zXFxjb25kaXRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxcXGV4cHJlc3Npb25zXFxzZWxlY3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHJlbGF0aW9ucy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHZpZXctYmFzZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGRpYWxlY3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHF1ZXJ5LWJ1aWxkZXJzXFxxdWVyeS1idWlsZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxccXVlcnktYnVpbGRlcnNcXHNlbGVjdC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFxxdWVyeS1idWlsZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxccXVlcnktYnVpbGRlcnNcXGluc2VydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFx1cGRhdGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xcY291bnQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xccXVlcnkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xccmF3LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxcZGIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGNhY2hlXFxjb3JlXFxjYWNoZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHNlc3Npb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGxvZ2dlci5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZGJcXHNjaGVtYS5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZGJcXG1vZGVsc1xcdXNlci5tb2RlbC5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZGJcXG1vZGVsc1xccmVzdW1lLWNvbW1hbmQubW9kZWwuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGRiXFxtb2RlbHNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxidW4tc3FsaXRlXFxkcml2ZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGJ1bi1zcWxpdGVcXHNlc3Npb24uanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGRiXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZGJcXG1vZGVsc1xcY2hhcmFjdGVyLm1vZGVsLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxlc2lcXGZldGNoLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxlc2lcXGNoYXJhY3Rlci5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxjb3Jwb3JhdGlvbi5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxhbGxpYW5jZS5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxza2lsbHMuanMiLCAiLi5cXHNyY1xcYXBpXFxhdXRoXFxkaXNjb3JkSURcXFtkaXNjb3JkSURdXFxjaGFyYWN0ZXJJRFxcW2NoYXJhY3RlcklEXVxcbW9kdWxlc1xcW21vZHVsZXNdLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qISBzYWZlLWJ1ZmZlci4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm9kZS9uby1kZXByZWNhdGVkLWFwaSAqL1xudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpXG52YXIgQnVmZmVyID0gYnVmZmVyLkJ1ZmZlclxuXG4vLyBhbHRlcm5hdGl2ZSB0byB1c2luZyBPYmplY3Qua2V5cyBmb3Igb2xkIGJyb3dzZXJzXG5mdW5jdGlvbiBjb3B5UHJvcHMgKHNyYywgZHN0KSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICBkc3Rba2V5XSA9IHNyY1trZXldXG4gIH1cbn1cbmlmIChCdWZmZXIuZnJvbSAmJiBCdWZmZXIuYWxsb2MgJiYgQnVmZmVyLmFsbG9jVW5zYWZlICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBidWZmZXJcbn0gZWxzZSB7XG4gIC8vIENvcHkgcHJvcGVydGllcyBmcm9tIHJlcXVpcmUoJ2J1ZmZlcicpXG4gIGNvcHlQcm9wcyhidWZmZXIsIGV4cG9ydHMpXG4gIGV4cG9ydHMuQnVmZmVyID0gU2FmZUJ1ZmZlclxufVxuXG5mdW5jdGlvbiBTYWZlQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQnVmZmVyLnByb3RvdHlwZSlcblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iLAogICAgIi8qZ2xvYmFsIG1vZHVsZSwgcHJvY2VzcyovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuZnVuY3Rpb24gRGF0YVN0cmVhbShkYXRhKSB7XG4gIHRoaXMuYnVmZmVyID0gbnVsbDtcbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIE5vIGlucHV0XG4gIGlmICghZGF0YSkge1xuICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gU3RyZWFtXG4gIGlmICh0eXBlb2YgZGF0YS5waXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgZGF0YS5waXBlKHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gQnVmZmVyIG9yIFN0cmluZ1xuICAvLyBvciBPYmplY3QgKGFzc3VtZWRseSBhIHBhc3N3b3JkZWQga2V5KVxuICBpZiAoZGF0YS5sZW5ndGggfHwgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgdGhpcy5idWZmZXIgPSBkYXRhO1xuICAgIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuZW1pdCgnZW5kJywgZGF0YSk7XG4gICAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLmVtaXQoJ2Nsb3NlJyk7XG4gICAgfS5iaW5kKHRoaXMpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ1VuZXhwZWN0ZWQgZGF0YSB0eXBlICgnKyB0eXBlb2YgZGF0YSArICcpJyk7XG59XG51dGlsLmluaGVyaXRzKERhdGFTdHJlYW0sIFN0cmVhbSk7XG5cbkRhdGFTdHJlYW0ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUoZGF0YSkge1xuICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuYnVmZmVyLCBCdWZmZXIuZnJvbShkYXRhKV0pO1xuICB0aGlzLmVtaXQoJ2RhdGEnLCBkYXRhKTtcbn07XG5cbkRhdGFTdHJlYW0ucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIGVuZChkYXRhKSB7XG4gIGlmIChkYXRhKVxuICAgIHRoaXMud3JpdGUoZGF0YSk7XG4gIHRoaXMuZW1pdCgnZW5kJywgZGF0YSk7XG4gIHRoaXMuZW1pdCgnY2xvc2UnKTtcbiAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFTdHJlYW07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gZ2V0UGFyYW1TaXplKGtleVNpemUpIHtcblx0dmFyIHJlc3VsdCA9ICgoa2V5U2l6ZSAvIDgpIHwgMCkgKyAoa2V5U2l6ZSAlIDggPT09IDAgPyAwIDogMSk7XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbnZhciBwYXJhbUJ5dGVzRm9yQWxnID0ge1xuXHRFUzI1NjogZ2V0UGFyYW1TaXplKDI1NiksXG5cdEVTMzg0OiBnZXRQYXJhbVNpemUoMzg0KSxcblx0RVM1MTI6IGdldFBhcmFtU2l6ZSg1MjEpXG59O1xuXG5mdW5jdGlvbiBnZXRQYXJhbUJ5dGVzRm9yQWxnKGFsZykge1xuXHR2YXIgcGFyYW1CeXRlcyA9IHBhcmFtQnl0ZXNGb3JBbGdbYWxnXTtcblx0aWYgKHBhcmFtQnl0ZXMpIHtcblx0XHRyZXR1cm4gcGFyYW1CeXRlcztcblx0fVxuXG5cdHRocm93IG5ldyBFcnJvcignVW5rbm93biBhbGdvcml0aG0gXCInICsgYWxnICsgJ1wiJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0UGFyYW1CeXRlc0ZvckFsZztcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG5cbnZhciBnZXRQYXJhbUJ5dGVzRm9yQWxnID0gcmVxdWlyZSgnLi9wYXJhbS1ieXRlcy1mb3ItYWxnJyk7XG5cbnZhciBNQVhfT0NURVQgPSAweDgwLFxuXHRDTEFTU19VTklWRVJTQUwgPSAwLFxuXHRQUklNSVRJVkVfQklUID0gMHgyMCxcblx0VEFHX1NFUSA9IDB4MTAsXG5cdFRBR19JTlQgPSAweDAyLFxuXHRFTkNPREVEX1RBR19TRVEgPSAoVEFHX1NFUSB8IFBSSU1JVElWRV9CSVQpIHwgKENMQVNTX1VOSVZFUlNBTCA8PCA2KSxcblx0RU5DT0RFRF9UQUdfSU5UID0gVEFHX0lOVCB8IChDTEFTU19VTklWRVJTQUwgPDwgNik7XG5cbmZ1bmN0aW9uIGJhc2U2NFVybChiYXNlNjQpIHtcblx0cmV0dXJuIGJhc2U2NFxuXHRcdC5yZXBsYWNlKC89L2csICcnKVxuXHRcdC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuXHRcdC5yZXBsYWNlKC9cXC8vZywgJ18nKTtcbn1cblxuZnVuY3Rpb24gc2lnbmF0dXJlQXNCdWZmZXIoc2lnbmF0dXJlKSB7XG5cdGlmIChCdWZmZXIuaXNCdWZmZXIoc2lnbmF0dXJlKSkge1xuXHRcdHJldHVybiBzaWduYXR1cmU7XG5cdH0gZWxzZSBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiBzaWduYXR1cmUpIHtcblx0XHRyZXR1cm4gQnVmZmVyLmZyb20oc2lnbmF0dXJlLCAnYmFzZTY0Jyk7XG5cdH1cblxuXHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFQ0RTQSBzaWduYXR1cmUgbXVzdCBiZSBhIEJhc2U2NCBzdHJpbmcgb3IgYSBCdWZmZXInKTtcbn1cblxuZnVuY3Rpb24gZGVyVG9Kb3NlKHNpZ25hdHVyZSwgYWxnKSB7XG5cdHNpZ25hdHVyZSA9IHNpZ25hdHVyZUFzQnVmZmVyKHNpZ25hdHVyZSk7XG5cdHZhciBwYXJhbUJ5dGVzID0gZ2V0UGFyYW1CeXRlc0ZvckFsZyhhbGcpO1xuXG5cdC8vIHRoZSBERVIgZW5jb2RlZCBwYXJhbSBzaG91bGQgYXQgbW9zdCBiZSB0aGUgcGFyYW0gc2l6ZSwgcGx1cyBhIHBhZGRpbmdcblx0Ly8gemVybywgc2luY2UgZHVlIHRvIGJlaW5nIGEgc2lnbmVkIGludGVnZXJcblx0dmFyIG1heEVuY29kZWRQYXJhbUxlbmd0aCA9IHBhcmFtQnl0ZXMgKyAxO1xuXG5cdHZhciBpbnB1dExlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7XG5cblx0dmFyIG9mZnNldCA9IDA7XG5cdGlmIChzaWduYXR1cmVbb2Zmc2V0KytdICE9PSBFTkNPREVEX1RBR19TRVEpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIFwic2VxXCInKTtcblx0fVxuXG5cdHZhciBzZXFMZW5ndGggPSBzaWduYXR1cmVbb2Zmc2V0KytdO1xuXHRpZiAoc2VxTGVuZ3RoID09PSAoTUFYX09DVEVUIHwgMSkpIHtcblx0XHRzZXFMZW5ndGggPSBzaWduYXR1cmVbb2Zmc2V0KytdO1xuXHR9XG5cblx0aWYgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0IDwgc2VxTGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdcInNlcVwiIHNwZWNpZmllZCBsZW5ndGggb2YgXCInICsgc2VxTGVuZ3RoICsgJ1wiLCBvbmx5IFwiJyArIChpbnB1dExlbmd0aCAtIG9mZnNldCkgKyAnXCIgcmVtYWluaW5nJyk7XG5cdH1cblxuXHRpZiAoc2lnbmF0dXJlW29mZnNldCsrXSAhPT0gRU5DT0RFRF9UQUdfSU5UKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBleHBlY3RlZCBcImludFwiIGZvciBcInJcIicpO1xuXHR9XG5cblx0dmFyIHJMZW5ndGggPSBzaWduYXR1cmVbb2Zmc2V0KytdO1xuXG5cdGlmIChpbnB1dExlbmd0aCAtIG9mZnNldCAtIDIgPCByTGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdcInJcIiBzcGVjaWZpZWQgbGVuZ3RoIG9mIFwiJyArIHJMZW5ndGggKyAnXCIsIG9ubHkgXCInICsgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0IC0gMikgKyAnXCIgYXZhaWxhYmxlJyk7XG5cdH1cblxuXHRpZiAobWF4RW5jb2RlZFBhcmFtTGVuZ3RoIDwgckxlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJyXCIgc3BlY2lmaWVkIGxlbmd0aCBvZiBcIicgKyByTGVuZ3RoICsgJ1wiLCBtYXggb2YgXCInICsgbWF4RW5jb2RlZFBhcmFtTGVuZ3RoICsgJ1wiIGlzIGFjY2VwdGFibGUnKTtcblx0fVxuXG5cdHZhciByT2Zmc2V0ID0gb2Zmc2V0O1xuXHRvZmZzZXQgKz0gckxlbmd0aDtcblxuXHRpZiAoc2lnbmF0dXJlW29mZnNldCsrXSAhPT0gRU5DT0RFRF9UQUdfSU5UKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBleHBlY3RlZCBcImludFwiIGZvciBcInNcIicpO1xuXHR9XG5cblx0dmFyIHNMZW5ndGggPSBzaWduYXR1cmVbb2Zmc2V0KytdO1xuXG5cdGlmIChpbnB1dExlbmd0aCAtIG9mZnNldCAhPT0gc0xlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJzXCIgc3BlY2lmaWVkIGxlbmd0aCBvZiBcIicgKyBzTGVuZ3RoICsgJ1wiLCBleHBlY3RlZCBcIicgKyAoaW5wdXRMZW5ndGggLSBvZmZzZXQpICsgJ1wiJyk7XG5cdH1cblxuXHRpZiAobWF4RW5jb2RlZFBhcmFtTGVuZ3RoIDwgc0xlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJzXCIgc3BlY2lmaWVkIGxlbmd0aCBvZiBcIicgKyBzTGVuZ3RoICsgJ1wiLCBtYXggb2YgXCInICsgbWF4RW5jb2RlZFBhcmFtTGVuZ3RoICsgJ1wiIGlzIGFjY2VwdGFibGUnKTtcblx0fVxuXG5cdHZhciBzT2Zmc2V0ID0gb2Zmc2V0O1xuXHRvZmZzZXQgKz0gc0xlbmd0aDtcblxuXHRpZiAob2Zmc2V0ICE9PSBpbnB1dExlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gY29uc3VtZSBlbnRpcmUgYnVmZmVyLCBidXQgXCInICsgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0KSArICdcIiBieXRlcyByZW1haW4nKTtcblx0fVxuXG5cdHZhciByUGFkZGluZyA9IHBhcmFtQnl0ZXMgLSByTGVuZ3RoLFxuXHRcdHNQYWRkaW5nID0gcGFyYW1CeXRlcyAtIHNMZW5ndGg7XG5cblx0dmFyIGRzdCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShyUGFkZGluZyArIHJMZW5ndGggKyBzUGFkZGluZyArIHNMZW5ndGgpO1xuXG5cdGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgclBhZGRpbmc7ICsrb2Zmc2V0KSB7XG5cdFx0ZHN0W29mZnNldF0gPSAwO1xuXHR9XG5cdHNpZ25hdHVyZS5jb3B5KGRzdCwgb2Zmc2V0LCByT2Zmc2V0ICsgTWF0aC5tYXgoLXJQYWRkaW5nLCAwKSwgck9mZnNldCArIHJMZW5ndGgpO1xuXG5cdG9mZnNldCA9IHBhcmFtQnl0ZXM7XG5cblx0Zm9yICh2YXIgbyA9IG9mZnNldDsgb2Zmc2V0IDwgbyArIHNQYWRkaW5nOyArK29mZnNldCkge1xuXHRcdGRzdFtvZmZzZXRdID0gMDtcblx0fVxuXHRzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgc09mZnNldCArIE1hdGgubWF4KC1zUGFkZGluZywgMCksIHNPZmZzZXQgKyBzTGVuZ3RoKTtcblxuXHRkc3QgPSBkc3QudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXHRkc3QgPSBiYXNlNjRVcmwoZHN0KTtcblxuXHRyZXR1cm4gZHN0O1xufVxuXG5mdW5jdGlvbiBjb3VudFBhZGRpbmcoYnVmLCBzdGFydCwgc3RvcCkge1xuXHR2YXIgcGFkZGluZyA9IDA7XG5cdHdoaWxlIChzdGFydCArIHBhZGRpbmcgPCBzdG9wICYmIGJ1ZltzdGFydCArIHBhZGRpbmddID09PSAwKSB7XG5cdFx0KytwYWRkaW5nO1xuXHR9XG5cblx0dmFyIG5lZWRzU2lnbiA9IGJ1ZltzdGFydCArIHBhZGRpbmddID49IE1BWF9PQ1RFVDtcblx0aWYgKG5lZWRzU2lnbikge1xuXHRcdC0tcGFkZGluZztcblx0fVxuXG5cdHJldHVybiBwYWRkaW5nO1xufVxuXG5mdW5jdGlvbiBqb3NlVG9EZXIoc2lnbmF0dXJlLCBhbGcpIHtcblx0c2lnbmF0dXJlID0gc2lnbmF0dXJlQXNCdWZmZXIoc2lnbmF0dXJlKTtcblx0dmFyIHBhcmFtQnl0ZXMgPSBnZXRQYXJhbUJ5dGVzRm9yQWxnKGFsZyk7XG5cblx0dmFyIHNpZ25hdHVyZUJ5dGVzID0gc2lnbmF0dXJlLmxlbmd0aDtcblx0aWYgKHNpZ25hdHVyZUJ5dGVzICE9PSBwYXJhbUJ5dGVzICogMikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiJyArIGFsZyArICdcIiBzaWduYXR1cmVzIG11c3QgYmUgXCInICsgcGFyYW1CeXRlcyAqIDIgKyAnXCIgYnl0ZXMsIHNhdyBcIicgKyBzaWduYXR1cmVCeXRlcyArICdcIicpO1xuXHR9XG5cblx0dmFyIHJQYWRkaW5nID0gY291bnRQYWRkaW5nKHNpZ25hdHVyZSwgMCwgcGFyYW1CeXRlcyk7XG5cdHZhciBzUGFkZGluZyA9IGNvdW50UGFkZGluZyhzaWduYXR1cmUsIHBhcmFtQnl0ZXMsIHNpZ25hdHVyZS5sZW5ndGgpO1xuXHR2YXIgckxlbmd0aCA9IHBhcmFtQnl0ZXMgLSByUGFkZGluZztcblx0dmFyIHNMZW5ndGggPSBwYXJhbUJ5dGVzIC0gc1BhZGRpbmc7XG5cblx0dmFyIHJzQnl0ZXMgPSAxICsgMSArIHJMZW5ndGggKyAxICsgMSArIHNMZW5ndGg7XG5cblx0dmFyIHNob3J0TGVuZ3RoID0gcnNCeXRlcyA8IE1BWF9PQ1RFVDtcblxuXHR2YXIgZHN0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKChzaG9ydExlbmd0aCA/IDIgOiAzKSArIHJzQnl0ZXMpO1xuXG5cdHZhciBvZmZzZXQgPSAwO1xuXHRkc3Rbb2Zmc2V0KytdID0gRU5DT0RFRF9UQUdfU0VRO1xuXHRpZiAoc2hvcnRMZW5ndGgpIHtcblx0XHQvLyBCaXQgOCBoYXMgdmFsdWUgXCIwXCJcblx0XHQvLyBiaXRzIDctMSBnaXZlIHRoZSBsZW5ndGguXG5cdFx0ZHN0W29mZnNldCsrXSA9IHJzQnl0ZXM7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQml0IDggb2YgZmlyc3Qgb2N0ZXQgaGFzIHZhbHVlIFwiMVwiXG5cdFx0Ly8gYml0cyA3LTEgZ2l2ZSB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgbGVuZ3RoIG9jdGV0cy5cblx0XHRkc3Rbb2Zmc2V0KytdID0gTUFYX09DVEVUXHR8IDE7XG5cdFx0Ly8gbGVuZ3RoLCBiYXNlIDI1NlxuXHRcdGRzdFtvZmZzZXQrK10gPSByc0J5dGVzICYgMHhmZjtcblx0fVxuXHRkc3Rbb2Zmc2V0KytdID0gRU5DT0RFRF9UQUdfSU5UO1xuXHRkc3Rbb2Zmc2V0KytdID0gckxlbmd0aDtcblx0aWYgKHJQYWRkaW5nIDwgMCkge1xuXHRcdGRzdFtvZmZzZXQrK10gPSAwO1xuXHRcdG9mZnNldCArPSBzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgMCwgcGFyYW1CeXRlcyk7XG5cdH0gZWxzZSB7XG5cdFx0b2Zmc2V0ICs9IHNpZ25hdHVyZS5jb3B5KGRzdCwgb2Zmc2V0LCByUGFkZGluZywgcGFyYW1CeXRlcyk7XG5cdH1cblx0ZHN0W29mZnNldCsrXSA9IEVOQ09ERURfVEFHX0lOVDtcblx0ZHN0W29mZnNldCsrXSA9IHNMZW5ndGg7XG5cdGlmIChzUGFkZGluZyA8IDApIHtcblx0XHRkc3Rbb2Zmc2V0KytdID0gMDtcblx0XHRzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgcGFyYW1CeXRlcyk7XG5cdH0gZWxzZSB7XG5cdFx0c2lnbmF0dXJlLmNvcHkoZHN0LCBvZmZzZXQsIHBhcmFtQnl0ZXMgKyBzUGFkZGluZyk7XG5cdH1cblxuXHRyZXR1cm4gZHN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0ZGVyVG9Kb3NlOiBkZXJUb0pvc2UsXG5cdGpvc2VUb0Rlcjogam9zZVRvRGVyXG59O1xuIiwKICAgICIvKmpzaGludCBub2RlOnRydWUgKi9cbid1c2Ugc3RyaWN0JztcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7IC8vIGJyb3dzZXJpZnlcbnZhciBTbG93QnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuU2xvd0J1ZmZlcjtcblxubW9kdWxlLmV4cG9ydHMgPSBidWZmZXJFcTtcblxuZnVuY3Rpb24gYnVmZmVyRXEoYSwgYikge1xuXG4gIC8vIHNob3J0Y3V0dGluZyBvbiB0eXBlIGlzIG5lY2Vzc2FyeSBmb3IgY29ycmVjdG5lc3NcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGJ1ZmZlciBzaXplcyBzaG91bGQgYmUgd2VsbC1rbm93biBpbmZvcm1hdGlvbiwgc28gZGVzcGl0ZSB0aGlzXG4gIC8vIHNob3J0Y3V0dGluZywgaXQgZG9lc24ndCBsZWFrIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgKmNvbnRlbnRzKiBvZiB0aGVcbiAgLy8gYnVmZmVycy5cbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBjID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgLypqc2hpbnQgYml0d2lzZTpmYWxzZSAqL1xuICAgIGMgfD0gYVtpXSBeIGJbaV07IC8vIFhPUlxuICB9XG4gIHJldHVybiBjID09PSAwO1xufVxuXG5idWZmZXJFcS5pbnN0YWxsID0gZnVuY3Rpb24oKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuZXF1YWwgPSBTbG93QnVmZmVyLnByb3RvdHlwZS5lcXVhbCA9IGZ1bmN0aW9uIGVxdWFsKHRoYXQpIHtcbiAgICByZXR1cm4gYnVmZmVyRXEodGhpcywgdGhhdCk7XG4gIH07XG59O1xuXG52YXIgb3JpZ0J1ZkVxdWFsID0gQnVmZmVyLnByb3RvdHlwZS5lcXVhbDtcbnZhciBvcmlnU2xvd0J1ZkVxdWFsID0gU2xvd0J1ZmZlci5wcm90b3R5cGUuZXF1YWw7XG5idWZmZXJFcS5yZXN0b3JlID0gZnVuY3Rpb24oKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuZXF1YWwgPSBvcmlnQnVmRXF1YWw7XG4gIFNsb3dCdWZmZXIucHJvdG90eXBlLmVxdWFsID0gb3JpZ1Nsb3dCdWZFcXVhbDtcbn07XG4iLAogICAgInZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbnZhciBmb3JtYXRFY2RzYSA9IHJlcXVpcmUoJ2VjZHNhLXNpZy1mb3JtYXR0ZXInKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG52YXIgTVNHX0lOVkFMSURfQUxHT1JJVEhNID0gJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCBhbGdvcml0aG0uXFxuICBTdXBwb3J0ZWQgYWxnb3JpdGhtcyBhcmU6XFxuICBcIkhTMjU2XCIsIFwiSFMzODRcIiwgXCJIUzUxMlwiLCBcIlJTMjU2XCIsIFwiUlMzODRcIiwgXCJSUzUxMlwiLCBcIlBTMjU2XCIsIFwiUFMzODRcIiwgXCJQUzUxMlwiLCBcIkVTMjU2XCIsIFwiRVMzODRcIiwgXCJFUzUxMlwiIGFuZCBcIm5vbmVcIi4nXG52YXIgTVNHX0lOVkFMSURfU0VDUkVUID0gJ3NlY3JldCBtdXN0IGJlIGEgc3RyaW5nIG9yIGJ1ZmZlcic7XG52YXIgTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZID0gJ2tleSBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgYnVmZmVyJztcbnZhciBNU0dfSU5WQUxJRF9TSUdORVJfS0VZID0gJ2tleSBtdXN0IGJlIGEgc3RyaW5nLCBhIGJ1ZmZlciBvciBhbiBvYmplY3QnO1xuXG52YXIgc3VwcG9ydHNLZXlPYmplY3RzID0gdHlwZW9mIGNyeXB0by5jcmVhdGVQdWJsaWNLZXkgPT09ICdmdW5jdGlvbic7XG5pZiAoc3VwcG9ydHNLZXlPYmplY3RzKSB7XG4gIE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSArPSAnIG9yIGEgS2V5T2JqZWN0JztcbiAgTVNHX0lOVkFMSURfU0VDUkVUICs9ICdvciBhIEtleU9iamVjdCc7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSXNQdWJsaWNLZXkoa2V5KSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghc3VwcG9ydHNLZXlPYmplY3RzKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleSAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5LnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleS5hc3ltbWV0cmljS2V5VHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5LmV4cG9ydCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9WRVJJRklFUl9LRVkpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjaGVja0lzUHJpdmF0ZUtleShrZXkpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihrZXkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1NJR05FUl9LRVkpO1xufTtcblxuZnVuY3Rpb24gY2hlY2tJc1NlY3JldEtleShrZXkpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihrZXkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIGlmICghc3VwcG9ydHNLZXlPYmplY3RzKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1NFQ1JFVCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleSAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfU0VDUkVUKTtcbiAgfVxuXG4gIGlmIChrZXkudHlwZSAhPT0gJ3NlY3JldCcpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfU0VDUkVUKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5LmV4cG9ydCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9TRUNSRVQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZyb21CYXNlNjQoYmFzZTY0KSB7XG4gIHJldHVybiBiYXNlNjRcbiAgICAucmVwbGFjZSgvPS9nLCAnJylcbiAgICAucmVwbGFjZSgvXFwrL2csICctJylcbiAgICAucmVwbGFjZSgvXFwvL2csICdfJyk7XG59XG5cbmZ1bmN0aW9uIHRvQmFzZTY0KGJhc2U2NHVybCkge1xuICBiYXNlNjR1cmwgPSBiYXNlNjR1cmwudG9TdHJpbmcoKTtcblxuICB2YXIgcGFkZGluZyA9IDQgLSBiYXNlNjR1cmwubGVuZ3RoICUgNDtcbiAgaWYgKHBhZGRpbmcgIT09IDQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZGRpbmc7ICsraSkge1xuICAgICAgYmFzZTY0dXJsICs9ICc9JztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFzZTY0dXJsXG4gICAgLnJlcGxhY2UoL1xcLS9nLCAnKycpXG4gICAgLnJlcGxhY2UoL18vZywgJy8nKTtcbn1cblxuZnVuY3Rpb24gdHlwZUVycm9yKHRlbXBsYXRlKSB7XG4gIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB2YXIgZXJyTXNnID0gdXRpbC5mb3JtYXQuYmluZCh1dGlsLCB0ZW1wbGF0ZSkuYXBwbHkobnVsbCwgYXJncyk7XG4gIHJldHVybiBuZXcgVHlwZUVycm9yKGVyck1zZyk7XG59XG5cbmZ1bmN0aW9uIGJ1ZmZlck9yU3RyaW5nKG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaikgfHwgdHlwZW9mIG9iaiA9PT0gJ3N0cmluZyc7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUlucHV0KHRoaW5nKSB7XG4gIGlmICghYnVmZmVyT3JTdHJpbmcodGhpbmcpKVxuICAgIHRoaW5nID0gSlNPTi5zdHJpbmdpZnkodGhpbmcpO1xuICByZXR1cm4gdGhpbmc7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhtYWNTaWduZXIoYml0cykge1xuICByZXR1cm4gZnVuY3Rpb24gc2lnbih0aGluZywgc2VjcmV0KSB7XG4gICAgY2hlY2tJc1NlY3JldEtleShzZWNyZXQpO1xuICAgIHRoaW5nID0gbm9ybWFsaXplSW5wdXQodGhpbmcpO1xuICAgIHZhciBobWFjID0gY3J5cHRvLmNyZWF0ZUhtYWMoJ3NoYScgKyBiaXRzLCBzZWNyZXQpO1xuICAgIHZhciBzaWcgPSAoaG1hYy51cGRhdGUodGhpbmcpLCBobWFjLmRpZ2VzdCgnYmFzZTY0JykpXG4gICAgcmV0dXJuIGZyb21CYXNlNjQoc2lnKTtcbiAgfVxufVxuXG52YXIgYnVmZmVyRXF1YWw7XG52YXIgdGltaW5nU2FmZUVxdWFsID0gJ3RpbWluZ1NhZmVFcXVhbCcgaW4gY3J5cHRvID8gZnVuY3Rpb24gdGltaW5nU2FmZUVxdWFsKGEsIGIpIHtcbiAgaWYgKGEuYnl0ZUxlbmd0aCAhPT0gYi5ieXRlTGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGNyeXB0by50aW1pbmdTYWZlRXF1YWwoYSwgYilcbn0gOiBmdW5jdGlvbiB0aW1pbmdTYWZlRXF1YWwoYSwgYikge1xuICBpZiAoIWJ1ZmZlckVxdWFsKSB7XG4gICAgYnVmZmVyRXF1YWwgPSByZXF1aXJlKCdidWZmZXItZXF1YWwtY29uc3RhbnQtdGltZScpO1xuICB9XG5cbiAgcmV0dXJuIGJ1ZmZlckVxdWFsKGEsIGIpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhtYWNWZXJpZmllcihiaXRzKSB7XG4gIHJldHVybiBmdW5jdGlvbiB2ZXJpZnkodGhpbmcsIHNpZ25hdHVyZSwgc2VjcmV0KSB7XG4gICAgdmFyIGNvbXB1dGVkU2lnID0gY3JlYXRlSG1hY1NpZ25lcihiaXRzKSh0aGluZywgc2VjcmV0KTtcbiAgICByZXR1cm4gdGltaW5nU2FmZUVxdWFsKEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSksIEJ1ZmZlci5mcm9tKGNvbXB1dGVkU2lnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5U2lnbmVyKGJpdHMpIHtcbiByZXR1cm4gZnVuY3Rpb24gc2lnbih0aGluZywgcHJpdmF0ZUtleSkge1xuICAgIGNoZWNrSXNQcml2YXRlS2V5KHByaXZhdGVLZXkpO1xuICAgIHRoaW5nID0gbm9ybWFsaXplSW5wdXQodGhpbmcpO1xuICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGFyZSBzcGVjaWZ5aW5nIFwiUlNBXCIgaGVyZSwgdGhpcyB3b3JrcyB3aXRoIEVDRFNBXG4gICAgLy8ga2V5cyBhcyB3ZWxsLlxuICAgIHZhciBzaWduZXIgPSBjcnlwdG8uY3JlYXRlU2lnbignUlNBLVNIQScgKyBiaXRzKTtcbiAgICB2YXIgc2lnID0gKHNpZ25lci51cGRhdGUodGhpbmcpLCBzaWduZXIuc2lnbihwcml2YXRlS2V5LCAnYmFzZTY0JykpO1xuICAgIHJldHVybiBmcm9tQmFzZTY0KHNpZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5VmVyaWZpZXIoYml0cykge1xuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KHRoaW5nLCBzaWduYXR1cmUsIHB1YmxpY0tleSkge1xuICAgIGNoZWNrSXNQdWJsaWNLZXkocHVibGljS2V5KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICBzaWduYXR1cmUgPSB0b0Jhc2U2NChzaWduYXR1cmUpO1xuICAgIHZhciB2ZXJpZmllciA9IGNyeXB0by5jcmVhdGVWZXJpZnkoJ1JTQS1TSEEnICsgYml0cyk7XG4gICAgdmVyaWZpZXIudXBkYXRlKHRoaW5nKTtcbiAgICByZXR1cm4gdmVyaWZpZXIudmVyaWZ5KHB1YmxpY0tleSwgc2lnbmF0dXJlLCAnYmFzZTY0Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlUFNTS2V5U2lnbmVyKGJpdHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNpZ24odGhpbmcsIHByaXZhdGVLZXkpIHtcbiAgICBjaGVja0lzUHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICB2YXIgc2lnbmVyID0gY3J5cHRvLmNyZWF0ZVNpZ24oJ1JTQS1TSEEnICsgYml0cyk7XG4gICAgdmFyIHNpZyA9IChzaWduZXIudXBkYXRlKHRoaW5nKSwgc2lnbmVyLnNpZ24oe1xuICAgICAga2V5OiBwcml2YXRlS2V5LFxuICAgICAgcGFkZGluZzogY3J5cHRvLmNvbnN0YW50cy5SU0FfUEtDUzFfUFNTX1BBRERJTkcsXG4gICAgICBzYWx0TGVuZ3RoOiBjcnlwdG8uY29uc3RhbnRzLlJTQV9QU1NfU0FMVExFTl9ESUdFU1RcbiAgICB9LCAnYmFzZTY0JykpO1xuICAgIHJldHVybiBmcm9tQmFzZTY0KHNpZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlUFNTS2V5VmVyaWZpZXIoYml0cykge1xuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KHRoaW5nLCBzaWduYXR1cmUsIHB1YmxpY0tleSkge1xuICAgIGNoZWNrSXNQdWJsaWNLZXkocHVibGljS2V5KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICBzaWduYXR1cmUgPSB0b0Jhc2U2NChzaWduYXR1cmUpO1xuICAgIHZhciB2ZXJpZmllciA9IGNyeXB0by5jcmVhdGVWZXJpZnkoJ1JTQS1TSEEnICsgYml0cyk7XG4gICAgdmVyaWZpZXIudXBkYXRlKHRoaW5nKTtcbiAgICByZXR1cm4gdmVyaWZpZXIudmVyaWZ5KHtcbiAgICAgIGtleTogcHVibGljS2V5LFxuICAgICAgcGFkZGluZzogY3J5cHRvLmNvbnN0YW50cy5SU0FfUEtDUzFfUFNTX1BBRERJTkcsXG4gICAgICBzYWx0TGVuZ3RoOiBjcnlwdG8uY29uc3RhbnRzLlJTQV9QU1NfU0FMVExFTl9ESUdFU1RcbiAgICB9LCBzaWduYXR1cmUsICdiYXNlNjQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFQ0RTQVNpZ25lcihiaXRzKSB7XG4gIHZhciBpbm5lciA9IGNyZWF0ZUtleVNpZ25lcihiaXRzKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNpZ24oKSB7XG4gICAgdmFyIHNpZ25hdHVyZSA9IGlubmVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgc2lnbmF0dXJlID0gZm9ybWF0RWNkc2EuZGVyVG9Kb3NlKHNpZ25hdHVyZSwgJ0VTJyArIGJpdHMpO1xuICAgIHJldHVybiBzaWduYXR1cmU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVDRFNBVmVyaWZlcihiaXRzKSB7XG4gIHZhciBpbm5lciA9IGNyZWF0ZUtleVZlcmlmaWVyKGJpdHMpO1xuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KHRoaW5nLCBzaWduYXR1cmUsIHB1YmxpY0tleSkge1xuICAgIHNpZ25hdHVyZSA9IGZvcm1hdEVjZHNhLmpvc2VUb0RlcihzaWduYXR1cmUsICdFUycgKyBiaXRzKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgdmFyIHJlc3VsdCA9IGlubmVyKHRoaW5nLCBzaWduYXR1cmUsIHB1YmxpY0tleSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTm9uZVNpZ25lcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNpZ24oKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5vbmVWZXJpZmllcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZlcmlmeSh0aGluZywgc2lnbmF0dXJlKSB7XG4gICAgcmV0dXJuIHNpZ25hdHVyZSA9PT0gJyc7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBqd2EoYWxnb3JpdGhtKSB7XG4gIHZhciBzaWduZXJGYWN0b3JpZXMgPSB7XG4gICAgaHM6IGNyZWF0ZUhtYWNTaWduZXIsXG4gICAgcnM6IGNyZWF0ZUtleVNpZ25lcixcbiAgICBwczogY3JlYXRlUFNTS2V5U2lnbmVyLFxuICAgIGVzOiBjcmVhdGVFQ0RTQVNpZ25lcixcbiAgICBub25lOiBjcmVhdGVOb25lU2lnbmVyLFxuICB9XG4gIHZhciB2ZXJpZmllckZhY3RvcmllcyA9IHtcbiAgICBoczogY3JlYXRlSG1hY1ZlcmlmaWVyLFxuICAgIHJzOiBjcmVhdGVLZXlWZXJpZmllcixcbiAgICBwczogY3JlYXRlUFNTS2V5VmVyaWZpZXIsXG4gICAgZXM6IGNyZWF0ZUVDRFNBVmVyaWZlcixcbiAgICBub25lOiBjcmVhdGVOb25lVmVyaWZpZXIsXG4gIH1cbiAgdmFyIG1hdGNoID0gYWxnb3JpdGhtLm1hdGNoKC9eKFJTfFBTfEVTfEhTKSgyNTZ8Mzg0fDUxMikkfF4obm9uZSkkL2kpO1xuICBpZiAoIW1hdGNoKVxuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9BTEdPUklUSE0sIGFsZ29yaXRobSk7XG4gIHZhciBhbGdvID0gKG1hdGNoWzFdIHx8IG1hdGNoWzNdKS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgYml0cyA9IG1hdGNoWzJdO1xuXG4gIHJldHVybiB7XG4gICAgc2lnbjogc2lnbmVyRmFjdG9yaWVzW2FsZ29dKGJpdHMpLFxuICAgIHZlcmlmeTogdmVyaWZpZXJGYWN0b3JpZXNbYWxnb10oYml0cyksXG4gIH1cbn07XG4iLAogICAgIi8qZ2xvYmFsIG1vZHVsZSovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9iaikge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpXG4gICAgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdudW1iZXInIHx8IEJ1ZmZlci5pc0J1ZmZlcihvYmopKVxuICAgIHJldHVybiBvYmoudG9TdHJpbmcoKTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaik7XG59O1xuIiwKICAgICIvKmdsb2JhbCBtb2R1bGUqL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIERhdGFTdHJlYW0gPSByZXF1aXJlKCcuL2RhdGEtc3RyZWFtJyk7XG52YXIgandhID0gcmVxdWlyZSgnandhJyk7XG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3Rvc3RyaW5nJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuZnVuY3Rpb24gYmFzZTY0dXJsKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIEJ1ZmZlclxuICAgIC5mcm9tKHN0cmluZywgZW5jb2RpbmcpXG4gICAgLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIC5yZXBsYWNlKC89L2csICcnKVxuICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuICAgIC5yZXBsYWNlKC9cXC8vZywgJ18nKTtcbn1cblxuZnVuY3Rpb24gandzU2VjdXJlZElucHV0KGhlYWRlciwgcGF5bG9hZCwgZW5jb2RpbmcpIHtcbiAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCAndXRmOCc7XG4gIHZhciBlbmNvZGVkSGVhZGVyID0gYmFzZTY0dXJsKHRvU3RyaW5nKGhlYWRlciksICdiaW5hcnknKTtcbiAgdmFyIGVuY29kZWRQYXlsb2FkID0gYmFzZTY0dXJsKHRvU3RyaW5nKHBheWxvYWQpLCBlbmNvZGluZyk7XG4gIHJldHVybiB1dGlsLmZvcm1hdCgnJXMuJXMnLCBlbmNvZGVkSGVhZGVyLCBlbmNvZGVkUGF5bG9hZCk7XG59XG5cbmZ1bmN0aW9uIGp3c1NpZ24ob3B0cykge1xuICB2YXIgaGVhZGVyID0gb3B0cy5oZWFkZXI7XG4gIHZhciBwYXlsb2FkID0gb3B0cy5wYXlsb2FkO1xuICB2YXIgc2VjcmV0T3JLZXkgPSBvcHRzLnNlY3JldCB8fCBvcHRzLnByaXZhdGVLZXk7XG4gIHZhciBlbmNvZGluZyA9IG9wdHMuZW5jb2Rpbmc7XG4gIHZhciBhbGdvID0gandhKGhlYWRlci5hbGcpO1xuICB2YXIgc2VjdXJlZElucHV0ID0gandzU2VjdXJlZElucHV0KGhlYWRlciwgcGF5bG9hZCwgZW5jb2RpbmcpO1xuICB2YXIgc2lnbmF0dXJlID0gYWxnby5zaWduKHNlY3VyZWRJbnB1dCwgc2VjcmV0T3JLZXkpO1xuICByZXR1cm4gdXRpbC5mb3JtYXQoJyVzLiVzJywgc2VjdXJlZElucHV0LCBzaWduYXR1cmUpO1xufVxuXG5mdW5jdGlvbiBTaWduU3RyZWFtKG9wdHMpIHtcbiAgdmFyIHNlY3JldCA9IG9wdHMuc2VjcmV0fHxvcHRzLnByaXZhdGVLZXl8fG9wdHMua2V5O1xuICB2YXIgc2VjcmV0U3RyZWFtID0gbmV3IERhdGFTdHJlYW0oc2VjcmV0KTtcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG4gIHRoaXMuaGVhZGVyID0gb3B0cy5oZWFkZXI7XG4gIHRoaXMuZW5jb2RpbmcgPSBvcHRzLmVuY29kaW5nO1xuICB0aGlzLnNlY3JldCA9IHRoaXMucHJpdmF0ZUtleSA9IHRoaXMua2V5ID0gc2VjcmV0U3RyZWFtO1xuICB0aGlzLnBheWxvYWQgPSBuZXcgRGF0YVN0cmVhbShvcHRzLnBheWxvYWQpO1xuICB0aGlzLnNlY3JldC5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMucGF5bG9hZC53cml0YWJsZSAmJiB0aGlzLnJlYWRhYmxlKVxuICAgICAgdGhpcy5zaWduKCk7XG4gIH0uYmluZCh0aGlzKSk7XG5cbiAgdGhpcy5wYXlsb2FkLm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5zZWNyZXQud3JpdGFibGUgJiYgdGhpcy5yZWFkYWJsZSlcbiAgICAgIHRoaXMuc2lnbigpO1xuICB9LmJpbmQodGhpcykpO1xufVxudXRpbC5pbmhlcml0cyhTaWduU3RyZWFtLCBTdHJlYW0pO1xuXG5TaWduU3RyZWFtLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gc2lnbigpIHtcbiAgdHJ5IHtcbiAgICB2YXIgc2lnbmF0dXJlID0gandzU2lnbih7XG4gICAgICBoZWFkZXI6IHRoaXMuaGVhZGVyLFxuICAgICAgcGF5bG9hZDogdGhpcy5wYXlsb2FkLmJ1ZmZlcixcbiAgICAgIHNlY3JldDogdGhpcy5zZWNyZXQuYnVmZmVyLFxuICAgICAgZW5jb2Rpbmc6IHRoaXMuZW5jb2RpbmdcbiAgICB9KTtcbiAgICB0aGlzLmVtaXQoJ2RvbmUnLCBzaWduYXR1cmUpO1xuICAgIHRoaXMuZW1pdCgnZGF0YScsIHNpZ25hdHVyZSk7XG4gICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgcmV0dXJuIHNpZ25hdHVyZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgdGhpcy5lbWl0KCdjbG9zZScpO1xuICB9XG59O1xuXG5TaWduU3RyZWFtLnNpZ24gPSBqd3NTaWduO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNpZ25TdHJlYW07XG4iLAogICAgIi8qZ2xvYmFsIG1vZHVsZSovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgRGF0YVN0cmVhbSA9IHJlcXVpcmUoJy4vZGF0YS1zdHJlYW0nKTtcbnZhciBqd2EgPSByZXF1aXJlKCdqd2EnKTtcbnZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4vdG9zdHJpbmcnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIEpXU19SRUdFWCA9IC9eW2EtekEtWjAtOVxcLV9dKz9cXC5bYS16QS1aMC05XFwtX10rP1xcLihbYS16QS1aMC05XFwtX10rKT8kLztcblxuZnVuY3Rpb24gaXNPYmplY3QodGhpbmcpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGluZykgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuXG5mdW5jdGlvbiBzYWZlSnNvblBhcnNlKHRoaW5nKSB7XG4gIGlmIChpc09iamVjdCh0aGluZykpXG4gICAgcmV0dXJuIHRoaW5nO1xuICB0cnkgeyByZXR1cm4gSlNPTi5wYXJzZSh0aGluZyk7IH1cbiAgY2F0Y2ggKGUpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxufVxuXG5mdW5jdGlvbiBoZWFkZXJGcm9tSldTKGp3c1NpZykge1xuICB2YXIgZW5jb2RlZEhlYWRlciA9IGp3c1NpZy5zcGxpdCgnLicsIDEpWzBdO1xuICByZXR1cm4gc2FmZUpzb25QYXJzZShCdWZmZXIuZnJvbShlbmNvZGVkSGVhZGVyLCAnYmFzZTY0JykudG9TdHJpbmcoJ2JpbmFyeScpKTtcbn1cblxuZnVuY3Rpb24gc2VjdXJlZElucHV0RnJvbUpXUyhqd3NTaWcpIHtcbiAgcmV0dXJuIGp3c1NpZy5zcGxpdCgnLicsIDIpLmpvaW4oJy4nKTtcbn1cblxuZnVuY3Rpb24gc2lnbmF0dXJlRnJvbUpXUyhqd3NTaWcpIHtcbiAgcmV0dXJuIGp3c1NpZy5zcGxpdCgnLicpWzJdO1xufVxuXG5mdW5jdGlvbiBwYXlsb2FkRnJvbUpXUyhqd3NTaWcsIGVuY29kaW5nKSB7XG4gIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0ZjgnO1xuICB2YXIgcGF5bG9hZCA9IGp3c1NpZy5zcGxpdCgnLicpWzFdO1xuICByZXR1cm4gQnVmZmVyLmZyb20ocGF5bG9hZCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKGVuY29kaW5nKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEp3cyhzdHJpbmcpIHtcbiAgcmV0dXJuIEpXU19SRUdFWC50ZXN0KHN0cmluZykgJiYgISFoZWFkZXJGcm9tSldTKHN0cmluZyk7XG59XG5cbmZ1bmN0aW9uIGp3c1ZlcmlmeShqd3NTaWcsIGFsZ29yaXRobSwgc2VjcmV0T3JLZXkpIHtcbiAgaWYgKCFhbGdvcml0aG0pIHtcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiTWlzc2luZyBhbGdvcml0aG0gcGFyYW1ldGVyIGZvciBqd3MudmVyaWZ5XCIpO1xuICAgIGVyci5jb2RlID0gXCJNSVNTSU5HX0FMR09SSVRITVwiO1xuICAgIHRocm93IGVycjtcbiAgfVxuICBqd3NTaWcgPSB0b1N0cmluZyhqd3NTaWcpO1xuICB2YXIgc2lnbmF0dXJlID0gc2lnbmF0dXJlRnJvbUpXUyhqd3NTaWcpO1xuICB2YXIgc2VjdXJlZElucHV0ID0gc2VjdXJlZElucHV0RnJvbUpXUyhqd3NTaWcpO1xuICB2YXIgYWxnbyA9IGp3YShhbGdvcml0aG0pO1xuICByZXR1cm4gYWxnby52ZXJpZnkoc2VjdXJlZElucHV0LCBzaWduYXR1cmUsIHNlY3JldE9yS2V5KTtcbn1cblxuZnVuY3Rpb24gandzRGVjb2RlKGp3c1NpZywgb3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgandzU2lnID0gdG9TdHJpbmcoandzU2lnKTtcblxuICBpZiAoIWlzVmFsaWRKd3MoandzU2lnKSlcbiAgICByZXR1cm4gbnVsbDtcblxuICB2YXIgaGVhZGVyID0gaGVhZGVyRnJvbUpXUyhqd3NTaWcpO1xuXG4gIGlmICghaGVhZGVyKVxuICAgIHJldHVybiBudWxsO1xuXG4gIHZhciBwYXlsb2FkID0gcGF5bG9hZEZyb21KV1MoandzU2lnKTtcbiAgaWYgKGhlYWRlci50eXAgPT09ICdKV1QnIHx8IG9wdHMuanNvbilcbiAgICBwYXlsb2FkID0gSlNPTi5wYXJzZShwYXlsb2FkLCBvcHRzLmVuY29kaW5nKTtcblxuICByZXR1cm4ge1xuICAgIGhlYWRlcjogaGVhZGVyLFxuICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgc2lnbmF0dXJlOiBzaWduYXR1cmVGcm9tSldTKGp3c1NpZylcbiAgfTtcbn1cblxuZnVuY3Rpb24gVmVyaWZ5U3RyZWFtKG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge307XG4gIHZhciBzZWNyZXRPcktleSA9IG9wdHMuc2VjcmV0fHxvcHRzLnB1YmxpY0tleXx8b3B0cy5rZXk7XG4gIHZhciBzZWNyZXRTdHJlYW0gPSBuZXcgRGF0YVN0cmVhbShzZWNyZXRPcktleSk7XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuICB0aGlzLmFsZ29yaXRobSA9IG9wdHMuYWxnb3JpdGhtO1xuICB0aGlzLmVuY29kaW5nID0gb3B0cy5lbmNvZGluZztcbiAgdGhpcy5zZWNyZXQgPSB0aGlzLnB1YmxpY0tleSA9IHRoaXMua2V5ID0gc2VjcmV0U3RyZWFtO1xuICB0aGlzLnNpZ25hdHVyZSA9IG5ldyBEYXRhU3RyZWFtKG9wdHMuc2lnbmF0dXJlKTtcbiAgdGhpcy5zZWNyZXQub25jZSgnY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLnNpZ25hdHVyZS53cml0YWJsZSAmJiB0aGlzLnJlYWRhYmxlKVxuICAgICAgdGhpcy52ZXJpZnkoKTtcbiAgfS5iaW5kKHRoaXMpKTtcblxuICB0aGlzLnNpZ25hdHVyZS5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuc2VjcmV0LndyaXRhYmxlICYmIHRoaXMucmVhZGFibGUpXG4gICAgICB0aGlzLnZlcmlmeSgpO1xuICB9LmJpbmQodGhpcykpO1xufVxudXRpbC5pbmhlcml0cyhWZXJpZnlTdHJlYW0sIFN0cmVhbSk7XG5WZXJpZnlTdHJlYW0ucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeSgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgdmFsaWQgPSBqd3NWZXJpZnkodGhpcy5zaWduYXR1cmUuYnVmZmVyLCB0aGlzLmFsZ29yaXRobSwgdGhpcy5rZXkuYnVmZmVyKTtcbiAgICB2YXIgb2JqID0gandzRGVjb2RlKHRoaXMuc2lnbmF0dXJlLmJ1ZmZlciwgdGhpcy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbWl0KCdkb25lJywgdmFsaWQsIG9iaik7XG4gICAgdGhpcy5lbWl0KCdkYXRhJywgdmFsaWQpO1xuICAgIHRoaXMuZW1pdCgnZW5kJyk7XG4gICAgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHJldHVybiB2YWxpZDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgdGhpcy5lbWl0KCdjbG9zZScpO1xuICB9XG59O1xuXG5WZXJpZnlTdHJlYW0uZGVjb2RlID0gandzRGVjb2RlO1xuVmVyaWZ5U3RyZWFtLmlzVmFsaWQgPSBpc1ZhbGlkSndzO1xuVmVyaWZ5U3RyZWFtLnZlcmlmeSA9IGp3c1ZlcmlmeTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZXJpZnlTdHJlYW07XG4iLAogICAgIi8qZ2xvYmFsIGV4cG9ydHMqL1xudmFyIFNpZ25TdHJlYW0gPSByZXF1aXJlKCcuL2xpYi9zaWduLXN0cmVhbScpO1xudmFyIFZlcmlmeVN0cmVhbSA9IHJlcXVpcmUoJy4vbGliL3ZlcmlmeS1zdHJlYW0nKTtcblxudmFyIEFMR09SSVRITVMgPSBbXG4gICdIUzI1NicsICdIUzM4NCcsICdIUzUxMicsXG4gICdSUzI1NicsICdSUzM4NCcsICdSUzUxMicsXG4gICdQUzI1NicsICdQUzM4NCcsICdQUzUxMicsXG4gICdFUzI1NicsICdFUzM4NCcsICdFUzUxMidcbl07XG5cbmV4cG9ydHMuQUxHT1JJVEhNUyA9IEFMR09SSVRITVM7XG5leHBvcnRzLnNpZ24gPSBTaWduU3RyZWFtLnNpZ247XG5leHBvcnRzLnZlcmlmeSA9IFZlcmlmeVN0cmVhbS52ZXJpZnk7XG5leHBvcnRzLmRlY29kZSA9IFZlcmlmeVN0cmVhbS5kZWNvZGU7XG5leHBvcnRzLmlzVmFsaWQgPSBWZXJpZnlTdHJlYW0uaXNWYWxpZDtcbmV4cG9ydHMuY3JlYXRlU2lnbiA9IGZ1bmN0aW9uIGNyZWF0ZVNpZ24ob3B0cykge1xuICByZXR1cm4gbmV3IFNpZ25TdHJlYW0ob3B0cyk7XG59O1xuZXhwb3J0cy5jcmVhdGVWZXJpZnkgPSBmdW5jdGlvbiBjcmVhdGVWZXJpZnkob3B0cykge1xuICByZXR1cm4gbmV3IFZlcmlmeVN0cmVhbShvcHRzKTtcbn07XG4iLAogICAgInZhciBqd3MgPSByZXF1aXJlKCdqd3MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoand0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgZGVjb2RlZCA9IGp3cy5kZWNvZGUoand0LCBvcHRpb25zKTtcbiAgaWYgKCFkZWNvZGVkKSB7IHJldHVybiBudWxsOyB9XG4gIHZhciBwYXlsb2FkID0gZGVjb2RlZC5wYXlsb2FkO1xuXG4gIC8vdHJ5IHBhcnNlIHRoZSBwYXlsb2FkXG4gIGlmKHR5cGVvZiBwYXlsb2FkID09PSAnc3RyaW5nJykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgb2JqID0gSlNPTi5wYXJzZShwYXlsb2FkKTtcbiAgICAgIGlmKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBwYXlsb2FkID0gb2JqO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgfVxuICB9XG5cbiAgLy9yZXR1cm4gaGVhZGVyIGlmIGBjb21wbGV0ZWAgb3B0aW9uIGlzIGVuYWJsZWQuICBoZWFkZXIgaW5jbHVkZXMgY2xhaW1zXG4gIC8vc3VjaCBhcyBga2lkYCBhbmQgYGFsZ2AgdXNlZCB0byBzZWxlY3QgdGhlIGtleSB3aXRoaW4gYSBKV0tTIG5lZWRlZCB0b1xuICAvL3ZlcmlmeSB0aGUgc2lnbmF0dXJlXG4gIGlmIChvcHRpb25zLmNvbXBsZXRlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWRlcjogZGVjb2RlZC5oZWFkZXIsXG4gICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgc2lnbmF0dXJlOiBkZWNvZGVkLnNpZ25hdHVyZVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHBheWxvYWQ7XG59O1xuIiwKICAgICJ2YXIgSnNvbldlYlRva2VuRXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSwgZXJyb3IpIHtcbiAgRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcbiAgaWYoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxuICB0aGlzLm5hbWUgPSAnSnNvbldlYlRva2VuRXJyb3InO1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICBpZiAoZXJyb3IpIHRoaXMuaW5uZXIgPSBlcnJvcjtcbn07XG5cbkpzb25XZWJUb2tlbkVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbkpzb25XZWJUb2tlbkVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEpzb25XZWJUb2tlbkVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEpzb25XZWJUb2tlbkVycm9yO1xuIiwKICAgICJ2YXIgSnNvbldlYlRva2VuRXJyb3IgPSByZXF1aXJlKCcuL0pzb25XZWJUb2tlbkVycm9yJyk7XG5cbnZhciBOb3RCZWZvcmVFcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBkYXRlKSB7XG4gIEpzb25XZWJUb2tlbkVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gIHRoaXMubmFtZSA9ICdOb3RCZWZvcmVFcnJvcic7XG4gIHRoaXMuZGF0ZSA9IGRhdGU7XG59O1xuXG5Ob3RCZWZvcmVFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEpzb25XZWJUb2tlbkVycm9yLnByb3RvdHlwZSk7XG5cbk5vdEJlZm9yZUVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE5vdEJlZm9yZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5vdEJlZm9yZUVycm9yOyIsCiAgICAidmFyIEpzb25XZWJUb2tlbkVycm9yID0gcmVxdWlyZSgnLi9Kc29uV2ViVG9rZW5FcnJvcicpO1xuXG52YXIgVG9rZW5FeHBpcmVkRXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSwgZXhwaXJlZEF0KSB7XG4gIEpzb25XZWJUb2tlbkVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gIHRoaXMubmFtZSA9ICdUb2tlbkV4cGlyZWRFcnJvcic7XG4gIHRoaXMuZXhwaXJlZEF0ID0gZXhwaXJlZEF0O1xufTtcblxuVG9rZW5FeHBpcmVkRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShKc29uV2ViVG9rZW5FcnJvci5wcm90b3R5cGUpO1xuXG5Ub2tlbkV4cGlyZWRFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb2tlbkV4cGlyZWRFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBUb2tlbkV4cGlyZWRFcnJvcjsiLAogICAgIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuICAgIHN0clxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICd3ZWVrcyc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgY2FzZSAndyc6XG4gICAgICByZXR1cm4gbiAqIHc7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgfVxuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBoLCAnaG91cicpO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gIH1cbiAgcmV0dXJuIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICB2YXIgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG4pICsgJyAnICsgbmFtZSArIChpc1BsdXJhbCA/ICdzJyA6ICcnKTtcbn1cbiIsCiAgICAidmFyIG1zID0gcmVxdWlyZSgnbXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGltZSwgaWF0KSB7XG4gIHZhciB0aW1lc3RhbXAgPSBpYXQgfHwgTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbiAgaWYgKHR5cGVvZiB0aW1lID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtaWxsaXNlY29uZHMgPSBtcyh0aW1lKTtcbiAgICBpZiAodHlwZW9mIG1pbGxpc2Vjb25kcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGguZmxvb3IodGltZXN0YW1wICsgbWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHRpbWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHRpbWVzdGFtcCArIHRpbWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbn07IiwKICAgICIndXNlIHN0cmljdCdcblxuLy8gTm90ZTogdGhpcyBpcyB0aGUgc2VtdmVyLm9yZyB2ZXJzaW9uIG9mIHRoZSBzcGVjIHRoYXQgaXQgaW1wbGVtZW50c1xuLy8gTm90IG5lY2Vzc2FyaWx5IHRoZSBwYWNrYWdlIHZlcnNpb24gb2YgdGhpcyBjb2RlLlxuY29uc3QgU0VNVkVSX1NQRUNfVkVSU0lPTiA9ICcyLjAuMCdcblxuY29uc3QgTUFYX0xFTkdUSCA9IDI1NlxuY29uc3QgTUFYX1NBRkVfSU5URUdFUiA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIHx8XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyA5MDA3MTk5MjU0NzQwOTkxXG5cbi8vIE1heCBzYWZlIHNlZ21lbnQgbGVuZ3RoIGZvciBjb2VyY2lvbi5cbmNvbnN0IE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEggPSAxNlxuXG4vLyBNYXggc2FmZSBsZW5ndGggZm9yIGEgYnVpbGQgaWRlbnRpZmllci4gVGhlIG1heCBsZW5ndGggbWludXMgNiBjaGFyYWN0ZXJzIGZvclxuLy8gdGhlIHNob3J0ZXN0IHZlcnNpb24gd2l0aCBhIGJ1aWxkIDAuMC4wK0JVSUxELlxuY29uc3QgTUFYX1NBRkVfQlVJTERfTEVOR1RIID0gTUFYX0xFTkdUSCAtIDZcblxuY29uc3QgUkVMRUFTRV9UWVBFUyA9IFtcbiAgJ21ham9yJyxcbiAgJ3ByZW1ham9yJyxcbiAgJ21pbm9yJyxcbiAgJ3ByZW1pbm9yJyxcbiAgJ3BhdGNoJyxcbiAgJ3ByZXBhdGNoJyxcbiAgJ3ByZXJlbGVhc2UnLFxuXVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTUFYX0xFTkdUSCxcbiAgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCxcbiAgTUFYX1NBRkVfQlVJTERfTEVOR1RILFxuICBNQVhfU0FGRV9JTlRFR0VSLFxuICBSRUxFQVNFX1RZUEVTLFxuICBTRU1WRVJfU1BFQ19WRVJTSU9OLFxuICBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRTogMGIwMDEsXG4gIEZMQUdfTE9PU0U6IDBiMDEwLFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgZGVidWcgPSAoXG4gIHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJlxuICBwcm9jZXNzLmVudiAmJlxuICBwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmXG4gIC9cXGJzZW12ZXJcXGIvaS50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcpXG4pID8gKC4uLmFyZ3MpID0+IGNvbnNvbGUuZXJyb3IoJ1NFTVZFUicsIC4uLmFyZ3MpXG4gIDogKCkgPT4ge31cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJ1Z1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RILFxuICBNQVhfU0FGRV9CVUlMRF9MRU5HVEgsXG4gIE1BWF9MRU5HVEgsXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuL2RlYnVnJylcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHt9XG5cbi8vIFRoZSBhY3R1YWwgcmVnZXhwcyBnbyBvbiBleHBvcnRzLnJlXG5jb25zdCByZSA9IGV4cG9ydHMucmUgPSBbXVxuY29uc3Qgc2FmZVJlID0gZXhwb3J0cy5zYWZlUmUgPSBbXVxuY29uc3Qgc3JjID0gZXhwb3J0cy5zcmMgPSBbXVxuY29uc3Qgc2FmZVNyYyA9IGV4cG9ydHMuc2FmZVNyYyA9IFtdXG5jb25zdCB0ID0gZXhwb3J0cy50ID0ge31cbmxldCBSID0gMFxuXG5jb25zdCBMRVRURVJEQVNITlVNQkVSID0gJ1thLXpBLVowLTktXSdcblxuLy8gUmVwbGFjZSBzb21lIGdyZWVkeSByZWdleCB0b2tlbnMgdG8gcHJldmVudCByZWdleCBkb3MgaXNzdWVzLiBUaGVzZSByZWdleCBhcmVcbi8vIHVzZWQgaW50ZXJuYWxseSB2aWEgdGhlIHNhZmVSZSBvYmplY3Qgc2luY2UgYWxsIGlucHV0cyBpbiB0aGlzIGxpYnJhcnkgZ2V0XG4vLyBub3JtYWxpemVkIGZpcnN0IHRvIHRyaW0gYW5kIGNvbGxhcHNlIGFsbCBleHRyYSB3aGl0ZXNwYWNlLiBUaGUgb3JpZ2luYWxcbi8vIHJlZ2V4ZXMgYXJlIGV4cG9ydGVkIGZvciB1c2VybGFuZCBjb25zdW1wdGlvbiBhbmQgbG93ZXIgbGV2ZWwgdXNhZ2UuIEFcbi8vIGZ1dHVyZSBicmVha2luZyBjaGFuZ2UgY291bGQgZXhwb3J0IHRoZSBzYWZlciByZWdleCBvbmx5IHdpdGggYSBub3RlIHRoYXRcbi8vIGFsbCBpbnB1dCBzaG91bGQgaGF2ZSBleHRyYSB3aGl0ZXNwYWNlIHJlbW92ZWQuXG5jb25zdCBzYWZlUmVnZXhSZXBsYWNlbWVudHMgPSBbXG4gIFsnXFxcXHMnLCAxXSxcbiAgWydcXFxcZCcsIE1BWF9MRU5HVEhdLFxuICBbTEVUVEVSREFTSE5VTUJFUiwgTUFYX1NBRkVfQlVJTERfTEVOR1RIXSxcbl1cblxuY29uc3QgbWFrZVNhZmVSZWdleCA9ICh2YWx1ZSkgPT4ge1xuICBmb3IgKGNvbnN0IFt0b2tlbiwgbWF4XSBvZiBzYWZlUmVnZXhSZXBsYWNlbWVudHMpIHtcbiAgICB2YWx1ZSA9IHZhbHVlXG4gICAgICAuc3BsaXQoYCR7dG9rZW59KmApLmpvaW4oYCR7dG9rZW59ezAsJHttYXh9fWApXG4gICAgICAuc3BsaXQoYCR7dG9rZW59K2ApLmpvaW4oYCR7dG9rZW59ezEsJHttYXh9fWApXG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbmNvbnN0IGNyZWF0ZVRva2VuID0gKG5hbWUsIHZhbHVlLCBpc0dsb2JhbCkgPT4ge1xuICBjb25zdCBzYWZlID0gbWFrZVNhZmVSZWdleCh2YWx1ZSlcbiAgY29uc3QgaW5kZXggPSBSKytcbiAgZGVidWcobmFtZSwgaW5kZXgsIHZhbHVlKVxuICB0W25hbWVdID0gaW5kZXhcbiAgc3JjW2luZGV4XSA9IHZhbHVlXG4gIHNhZmVTcmNbaW5kZXhdID0gc2FmZVxuICByZVtpbmRleF0gPSBuZXcgUmVnRXhwKHZhbHVlLCBpc0dsb2JhbCA/ICdnJyA6IHVuZGVmaW5lZClcbiAgc2FmZVJlW2luZGV4XSA9IG5ldyBSZWdFeHAoc2FmZSwgaXNHbG9iYWwgPyAnZycgOiB1bmRlZmluZWQpXG59XG5cbi8vIFRoZSBmb2xsb3dpbmcgUmVndWxhciBFeHByZXNzaW9ucyBjYW4gYmUgdXNlZCBmb3IgdG9rZW5pemluZyxcbi8vIHZhbGlkYXRpbmcsIGFuZCBwYXJzaW5nIFNlbVZlciB2ZXJzaW9uIHN0cmluZ3MuXG5cbi8vICMjIE51bWVyaWMgSWRlbnRpZmllclxuLy8gQSBzaW5nbGUgYDBgLCBvciBhIG5vbi16ZXJvIGRpZ2l0IGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBkaWdpdHMuXG5cbmNyZWF0ZVRva2VuKCdOVU1FUklDSURFTlRJRklFUicsICcwfFsxLTldXFxcXGQqJylcbmNyZWF0ZVRva2VuKCdOVU1FUklDSURFTlRJRklFUkxPT1NFJywgJ1xcXFxkKycpXG5cbi8vICMjIE5vbi1udW1lcmljIElkZW50aWZpZXJcbi8vIFplcm8gb3IgbW9yZSBkaWdpdHMsIGZvbGxvd2VkIGJ5IGEgbGV0dGVyIG9yIGh5cGhlbiwgYW5kIHRoZW4gemVybyBvclxuLy8gbW9yZSBsZXR0ZXJzLCBkaWdpdHMsIG9yIGh5cGhlbnMuXG5cbmNyZWF0ZVRva2VuKCdOT05OVU1FUklDSURFTlRJRklFUicsIGBcXFxcZCpbYS16QS1aLV0ke0xFVFRFUkRBU0hOVU1CRVJ9KmApXG5cbi8vICMjIE1haW4gVmVyc2lvblxuLy8gVGhyZWUgZG90LXNlcGFyYXRlZCBudW1lcmljIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignTUFJTlZFUlNJT04nLCBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pYClcblxuY3JlYXRlVG9rZW4oJ01BSU5WRVJTSU9OTE9PU0UnLCBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KWApXG5cbi8vICMjIFByZS1yZWxlYXNlIFZlcnNpb24gSWRlbnRpZmllclxuLy8gQSBudW1lcmljIGlkZW50aWZpZXIsIG9yIGEgbm9uLW51bWVyaWMgaWRlbnRpZmllci5cbi8vIE5vbi1udW1iZXJpYyBpZGVudGlmaWVycyBpbmNsdWRlIG51bWJlcmljIGlkZW50aWZpZXJzIGJ1dCBjYW4gYmUgbG9uZ2VyLlxuLy8gVGhlcmVmb3JlIG5vbi1udW1iZXJpYyBpZGVudGlmaWVycyBtdXN0IGdvIGZpcnN0LlxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRUlERU5USUZJRVInLCBgKD86JHtzcmNbdC5OT05OVU1FUklDSURFTlRJRklFUl1cbn18JHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KWApXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFJywgYCg/OiR7c3JjW3QuTk9OTlVNRVJJQ0lERU5USUZJRVJdXG59fCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KWApXG5cbi8vICMjIFByZS1yZWxlYXNlIFZlcnNpb25cbi8vIEh5cGhlbiwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZG90LXNlcGFyYXRlZCBwcmUtcmVsZWFzZSB2ZXJzaW9uXG4vLyBpZGVudGlmaWVycy5cblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0UnLCBgKD86LSgke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSXVxufSg/OlxcXFwuJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUl19KSopKWApXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFTE9PU0UnLCBgKD86LT8oJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFXVxufSg/OlxcXFwuJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFXX0pKikpYClcblxuLy8gIyMgQnVpbGQgTWV0YWRhdGEgSWRlbnRpZmllclxuLy8gQW55IGNvbWJpbmF0aW9uIG9mIGRpZ2l0cywgbGV0dGVycywgb3IgaHlwaGVucy5cblxuY3JlYXRlVG9rZW4oJ0JVSUxESURFTlRJRklFUicsIGAke0xFVFRFUkRBU0hOVU1CRVJ9K2ApXG5cbi8vICMjIEJ1aWxkIE1ldGFkYXRhXG4vLyBQbHVzIHNpZ24sIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBlcmlvZC1zZXBhcmF0ZWQgYnVpbGQgbWV0YWRhdGFcbi8vIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignQlVJTEQnLCBgKD86XFxcXCsoJHtzcmNbdC5CVUlMRElERU5USUZJRVJdXG59KD86XFxcXC4ke3NyY1t0LkJVSUxESURFTlRJRklFUl19KSopKWApXG5cbi8vICMjIEZ1bGwgVmVyc2lvbiBTdHJpbmdcbi8vIEEgbWFpbiB2ZXJzaW9uLCBmb2xsb3dlZCBvcHRpb25hbGx5IGJ5IGEgcHJlLXJlbGVhc2UgdmVyc2lvbiBhbmRcbi8vIGJ1aWxkIG1ldGFkYXRhLlxuXG4vLyBOb3RlIHRoYXQgdGhlIG9ubHkgbWFqb3IsIG1pbm9yLCBwYXRjaCwgYW5kIHByZS1yZWxlYXNlIHNlY3Rpb25zIG9mXG4vLyB0aGUgdmVyc2lvbiBzdHJpbmcgYXJlIGNhcHR1cmluZyBncm91cHMuICBUaGUgYnVpbGQgbWV0YWRhdGEgaXMgbm90IGFcbi8vIGNhcHR1cmluZyBncm91cCwgYmVjYXVzZSBpdCBzaG91bGQgbm90IGV2ZXIgYmUgdXNlZCBpbiB2ZXJzaW9uXG4vLyBjb21wYXJpc29uLlxuXG5jcmVhdGVUb2tlbignRlVMTFBMQUlOJywgYHY/JHtzcmNbdC5NQUlOVkVSU0lPTl1cbn0ke3NyY1t0LlBSRVJFTEVBU0VdfT8ke1xuICBzcmNbdC5CVUlMRF19P2ApXG5cbmNyZWF0ZVRva2VuKCdGVUxMJywgYF4ke3NyY1t0LkZVTExQTEFJTl19JGApXG5cbi8vIGxpa2UgZnVsbCwgYnV0IGFsbG93cyB2MS4yLjMgYW5kID0xLjIuMywgd2hpY2ggcGVvcGxlIGRvIHNvbWV0aW1lcy5cbi8vIGFsc28sIDEuMC4wYWxwaGExIChwcmVyZWxlYXNlIHdpdGhvdXQgdGhlIGh5cGhlbikgd2hpY2ggaXMgcHJldHR5XG4vLyBjb21tb24gaW4gdGhlIG5wbSByZWdpc3RyeS5cbmNyZWF0ZVRva2VuKCdMT09TRVBMQUlOJywgYFt2PVxcXFxzXSoke3NyY1t0Lk1BSU5WRVJTSU9OTE9PU0VdXG59JHtzcmNbdC5QUkVSRUxFQVNFTE9PU0VdfT8ke1xuICBzcmNbdC5CVUlMRF19P2ApXG5cbmNyZWF0ZVRva2VuKCdMT09TRScsIGBeJHtzcmNbdC5MT09TRVBMQUlOXX0kYClcblxuY3JlYXRlVG9rZW4oJ0dUTFQnLCAnKCg/Ojx8Pik/PT8pJylcblxuLy8gU29tZXRoaW5nIGxpa2UgXCIyLipcIiBvciBcIjEuMi54XCIuXG4vLyBOb3RlIHRoYXQgXCJ4LnhcIiBpcyBhIHZhbGlkIHhSYW5nZSBpZGVudGlmZXIsIG1lYW5pbmcgXCJhbnkgdmVyc2lvblwiXG4vLyBPbmx5IHRoZSBmaXJzdCBpdGVtIGlzIHN0cmljdGx5IHJlcXVpcmVkLlxuY3JlYXRlVG9rZW4oJ1hSQU5HRUlERU5USUZJRVJMT09TRScsIGAke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfXx4fFh8XFxcXCpgKVxuY3JlYXRlVG9rZW4oJ1hSQU5HRUlERU5USUZJRVInLCBgJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19fHh8WHxcXFxcKmApXG5cbmNyZWF0ZVRva2VuKCdYUkFOR0VQTEFJTicsIGBbdj1cXFxcc10qKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJdfSlgICtcbiAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuUFJFUkVMRUFTRV19KT8ke1xuICAgICAgICAgICAgICAgICAgICAgc3JjW3QuQlVJTERdfT9gICtcbiAgICAgICAgICAgICAgICAgICBgKT8pP2ApXG5cbmNyZWF0ZVRva2VuKCdYUkFOR0VQTEFJTkxPT1NFJywgYFt2PVxcXFxzXSooJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKD86JHtzcmNbdC5QUkVSRUxFQVNFTE9PU0VdfSk/JHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjW3QuQlVJTERdfT9gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGApPyk/YClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRScsIGBeJHtzcmNbdC5HVExUXX1cXFxccyoke3NyY1t0LlhSQU5HRVBMQUlOXX0kYClcbmNyZWF0ZVRva2VuKCdYUkFOR0VMT09TRScsIGBeJHtzcmNbdC5HVExUXX1cXFxccyoke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSRgKVxuXG4vLyBDb2VyY2lvbi5cbi8vIEV4dHJhY3QgYW55dGhpbmcgdGhhdCBjb3VsZCBjb25jZWl2YWJseSBiZSBhIHBhcnQgb2YgYSB2YWxpZCBzZW12ZXJcbmNyZWF0ZVRva2VuKCdDT0VSQ0VQTEFJTicsIGAkeycoXnxbXlxcXFxkXSknICtcbiAgICAgICAgICAgICAgJyhcXFxcZHsxLCd9JHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pYCArXG4gICAgICAgICAgICAgIGAoPzpcXFxcLihcXFxcZHsxLCR7TUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSH19KSk/YCArXG4gICAgICAgICAgICAgIGAoPzpcXFxcLihcXFxcZHsxLCR7TUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSH19KSk/YClcbmNyZWF0ZVRva2VuKCdDT0VSQ0UnLCBgJHtzcmNbdC5DT0VSQ0VQTEFJTl19KD86JHxbXlxcXFxkXSlgKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRUZVTEwnLCBzcmNbdC5DT0VSQ0VQTEFJTl0gK1xuICAgICAgICAgICAgICBgKD86JHtzcmNbdC5QUkVSRUxFQVNFXX0pP2AgK1xuICAgICAgICAgICAgICBgKD86JHtzcmNbdC5CVUlMRF19KT9gICtcbiAgICAgICAgICAgICAgYCg/OiR8W15cXFxcZF0pYClcbmNyZWF0ZVRva2VuKCdDT0VSQ0VSVEwnLCBzcmNbdC5DT0VSQ0VdLCB0cnVlKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRVJUTEZVTEwnLCBzcmNbdC5DT0VSQ0VGVUxMXSwgdHJ1ZSlcblxuLy8gVGlsZGUgcmFuZ2VzLlxuLy8gTWVhbmluZyBpcyBcInJlYXNvbmFibHkgYXQgb3IgZ3JlYXRlciB0aGFuXCJcbmNyZWF0ZVRva2VuKCdMT05FVElMREUnLCAnKD86fj4/KScpXG5cbmNyZWF0ZVRva2VuKCdUSUxERVRSSU0nLCBgKFxcXFxzKikke3NyY1t0LkxPTkVUSUxERV19XFxcXHMrYCwgdHJ1ZSlcbmV4cG9ydHMudGlsZGVUcmltUmVwbGFjZSA9ICckMX4nXG5cbmNyZWF0ZVRva2VuKCdUSUxERScsIGBeJHtzcmNbdC5MT05FVElMREVdfSR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ1RJTERFTE9PU0UnLCBgXiR7c3JjW3QuTE9ORVRJTERFXX0ke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSRgKVxuXG4vLyBDYXJldCByYW5nZXMuXG4vLyBNZWFuaW5nIGlzIFwiYXQgbGVhc3QgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGhcIlxuY3JlYXRlVG9rZW4oJ0xPTkVDQVJFVCcsICcoPzpcXFxcXiknKVxuXG5jcmVhdGVUb2tlbignQ0FSRVRUUklNJywgYChcXFxccyopJHtzcmNbdC5MT05FQ0FSRVRdfVxcXFxzK2AsIHRydWUpXG5leHBvcnRzLmNhcmV0VHJpbVJlcGxhY2UgPSAnJDFeJ1xuXG5jcmVhdGVUb2tlbignQ0FSRVQnLCBgXiR7c3JjW3QuTE9ORUNBUkVUXX0ke3NyY1t0LlhSQU5HRVBMQUlOXX0kYClcbmNyZWF0ZVRva2VuKCdDQVJFVExPT1NFJywgYF4ke3NyY1t0LkxPTkVDQVJFVF19JHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0kYClcblxuLy8gQSBzaW1wbGUgZ3QvbHQvZXEgdGhpbmcsIG9yIGp1c3QgXCJcIiB0byBpbmRpY2F0ZSBcImFueSB2ZXJzaW9uXCJcbmNyZWF0ZVRva2VuKCdDT01QQVJBVE9STE9PU0UnLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqKCR7c3JjW3QuTE9PU0VQTEFJTl19KSR8XiRgKVxuY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1InLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqKCR7c3JjW3QuRlVMTFBMQUlOXX0pJHxeJGApXG5cbi8vIEFuIGV4cHJlc3Npb24gdG8gc3RyaXAgYW55IHdoaXRlc3BhY2UgYmV0d2VlbiB0aGUgZ3RsdCBhbmQgdGhlIHRoaW5nXG4vLyBpdCBtb2RpZmllcywgc28gdGhhdCBgPiAxLjIuM2AgPT0+IGA+MS4yLjNgXG5jcmVhdGVUb2tlbignQ09NUEFSQVRPUlRSSU0nLCBgKFxcXFxzKikke3NyY1t0LkdUTFRdXG59XFxcXHMqKCR7c3JjW3QuTE9PU0VQTEFJTl19fCR7c3JjW3QuWFJBTkdFUExBSU5dfSlgLCB0cnVlKVxuZXhwb3J0cy5jb21wYXJhdG9yVHJpbVJlcGxhY2UgPSAnJDEkMiQzJ1xuXG4vLyBTb21ldGhpbmcgbGlrZSBgMS4yLjMgLSAxLjIuNGBcbi8vIE5vdGUgdGhhdCB0aGVzZSBhbGwgdXNlIHRoZSBsb29zZSBmb3JtLCBiZWNhdXNlIHRoZXknbGwgYmVcbi8vIGNoZWNrZWQgYWdhaW5zdCBlaXRoZXIgdGhlIHN0cmljdCBvciBsb29zZSBjb21wYXJhdG9yIGZvcm1cbi8vIGxhdGVyLlxuY3JlYXRlVG9rZW4oJ0hZUEhFTlJBTkdFJywgYF5cXFxccyooJHtzcmNbdC5YUkFOR0VQTEFJTl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGBcXFxccystXFxcXHMrYCArXG4gICAgICAgICAgICAgICAgICAgYCgke3NyY1t0LlhSQU5HRVBMQUlOXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYFxcXFxzKiRgKVxuXG5jcmVhdGVUb2tlbignSFlQSEVOUkFOR0VMT09TRScsIGBeXFxcXHMqKCR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYFxcXFxzKy1cXFxccytgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgXFxcXHMqJGApXG5cbi8vIFN0YXIgcmFuZ2VzIGJhc2ljYWxseSBqdXN0IGFsbG93IGFueXRoaW5nIGF0IGFsbC5cbmNyZWF0ZVRva2VuKCdTVEFSJywgJyg8fD4pPz0/XFxcXHMqXFxcXConKVxuLy8gPj0wLjAuMCBpcyBsaWtlIGEgc3RhclxuY3JlYXRlVG9rZW4oJ0dURTAnLCAnXlxcXFxzKj49XFxcXHMqMFxcXFwuMFxcXFwuMFxcXFxzKiQnKVxuY3JlYXRlVG9rZW4oJ0dURTBQUkUnLCAnXlxcXFxzKj49XFxcXHMqMFxcXFwuMFxcXFwuMC0wXFxcXHMqJCcpXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBwYXJzZSBvdXQganVzdCB0aGUgb3B0aW9ucyB3ZSBjYXJlIGFib3V0XG5jb25zdCBsb29zZU9wdGlvbiA9IE9iamVjdC5mcmVlemUoeyBsb29zZTogdHJ1ZSB9KVxuY29uc3QgZW1wdHlPcHRzID0gT2JqZWN0LmZyZWV6ZSh7IH0pXG5jb25zdCBwYXJzZU9wdGlvbnMgPSBvcHRpb25zID0+IHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgcmV0dXJuIGVtcHR5T3B0c1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBsb29zZU9wdGlvblxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnNcbn1cbm1vZHVsZS5leHBvcnRzID0gcGFyc2VPcHRpb25zXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBudW1lcmljID0gL15bMC05XSskL1xuY29uc3QgY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IHtcbiAgY29uc3QgYW51bSA9IG51bWVyaWMudGVzdChhKVxuICBjb25zdCBibnVtID0gbnVtZXJpYy50ZXN0KGIpXG5cbiAgaWYgKGFudW0gJiYgYm51bSkge1xuICAgIGEgPSArYVxuICAgIGIgPSArYlxuICB9XG5cbiAgcmV0dXJuIGEgPT09IGIgPyAwXG4gICAgOiAoYW51bSAmJiAhYm51bSkgPyAtMVxuICAgIDogKGJudW0gJiYgIWFudW0pID8gMVxuICAgIDogYSA8IGIgPyAtMVxuICAgIDogMVxufVxuXG5jb25zdCByY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IGNvbXBhcmVJZGVudGlmaWVycyhiLCBhKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29tcGFyZUlkZW50aWZpZXJzLFxuICByY29tcGFyZUlkZW50aWZpZXJzLFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9kZWJ1ZycpXG5jb25zdCB7IE1BWF9MRU5HVEgsIE1BWF9TQUZFX0lOVEVHRVIgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2NvbnN0YW50cycpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcblxuY29uc3QgcGFyc2VPcHRpb25zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcGFyc2Utb3B0aW9ucycpXG5jb25zdCB7IGNvbXBhcmVJZGVudGlmaWVycyB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvaWRlbnRpZmllcnMnKVxuY2xhc3MgU2VtVmVyIHtcbiAgY29uc3RydWN0b3IgKHZlcnNpb24sIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpXG5cbiAgICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcikge1xuICAgICAgaWYgKHZlcnNpb24ubG9vc2UgPT09ICEhb3B0aW9ucy5sb29zZSAmJlxuICAgICAgICB2ZXJzaW9uLmluY2x1ZGVQcmVyZWxlYXNlID09PSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAgICAgcmV0dXJuIHZlcnNpb25cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnZlcnNpb25cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCB2ZXJzaW9uLiBNdXN0IGJlIGEgc3RyaW5nLiBHb3QgdHlwZSBcIiR7dHlwZW9mIHZlcnNpb259XCIuYClcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbi5sZW5ndGggPiBNQVhfTEVOR1RIKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgdmVyc2lvbiBpcyBsb25nZXIgdGhhbiAke01BWF9MRU5HVEh9IGNoYXJhY3RlcnNgXG4gICAgICApXG4gICAgfVxuXG4gICAgZGVidWcoJ1NlbVZlcicsIHZlcnNpb24sIG9wdGlvbnMpXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIHRoaXMubG9vc2UgPSAhIW9wdGlvbnMubG9vc2VcbiAgICAvLyB0aGlzIGlzbid0IGFjdHVhbGx5IHJlbGV2YW50IGZvciB2ZXJzaW9ucywgYnV0IGtlZXAgaXQgc28gdGhhdCB3ZVxuICAgIC8vIGRvbid0IHJ1biBpbnRvIHRyb3VibGUgcGFzc2luZyB0aGlzLm9wdGlvbnMgYXJvdW5kLlxuICAgIHRoaXMuaW5jbHVkZVByZXJlbGVhc2UgPSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2VcblxuICAgIGNvbnN0IG0gPSB2ZXJzaW9uLnRyaW0oKS5tYXRjaChvcHRpb25zLmxvb3NlID8gcmVbdC5MT09TRV0gOiByZVt0LkZVTExdKVxuXG4gICAgaWYgKCFtKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIFZlcnNpb246ICR7dmVyc2lvbn1gKVxuICAgIH1cblxuICAgIHRoaXMucmF3ID0gdmVyc2lvblxuXG4gICAgLy8gdGhlc2UgYXJlIGFjdHVhbGx5IG51bWJlcnNcbiAgICB0aGlzLm1ham9yID0gK21bMV1cbiAgICB0aGlzLm1pbm9yID0gK21bMl1cbiAgICB0aGlzLnBhdGNoID0gK21bM11cblxuICAgIGlmICh0aGlzLm1ham9yID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLm1ham9yIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBtYWpvciB2ZXJzaW9uJylcbiAgICB9XG5cbiAgICBpZiAodGhpcy5taW5vciA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5taW5vciA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWlub3IgdmVyc2lvbicpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGF0Y2ggPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMucGF0Y2ggPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHBhdGNoIHZlcnNpb24nKVxuICAgIH1cblxuICAgIC8vIG51bWJlcmlmeSBhbnkgcHJlcmVsZWFzZSBudW1lcmljIGlkc1xuICAgIGlmICghbVs0XSkge1xuICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcmVyZWxlYXNlID0gbVs0XS5zcGxpdCgnLicpLm1hcCgoaWQpID0+IHtcbiAgICAgICAgaWYgKC9eWzAtOV0rJC8udGVzdChpZCkpIHtcbiAgICAgICAgICBjb25zdCBudW0gPSAraWRcbiAgICAgICAgICBpZiAobnVtID49IDAgJiYgbnVtIDwgTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICAgICAgcmV0dXJuIG51bVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWRcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5idWlsZCA9IG1bNV0gPyBtWzVdLnNwbGl0KCcuJykgOiBbXVxuICAgIHRoaXMuZm9ybWF0KClcbiAgfVxuXG4gIGZvcm1hdCAoKSB7XG4gICAgdGhpcy52ZXJzaW9uID0gYCR7dGhpcy5tYWpvcn0uJHt0aGlzLm1pbm9yfS4ke3RoaXMucGF0Y2h9YFxuICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICB0aGlzLnZlcnNpb24gKz0gYC0ke3RoaXMucHJlcmVsZWFzZS5qb2luKCcuJyl9YFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy52ZXJzaW9uXG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmVyc2lvblxuICB9XG5cbiAgY29tcGFyZSAob3RoZXIpIHtcbiAgICBkZWJ1ZygnU2VtVmVyLmNvbXBhcmUnLCB0aGlzLnZlcnNpb24sIHRoaXMub3B0aW9ucywgb3RoZXIpXG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBpZiAodHlwZW9mIG90aGVyID09PSAnc3RyaW5nJyAmJiBvdGhlciA9PT0gdGhpcy52ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICBpZiAob3RoZXIudmVyc2lvbiA9PT0gdGhpcy52ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbXBhcmVNYWluKG90aGVyKSB8fCB0aGlzLmNvbXBhcmVQcmUob3RoZXIpXG4gIH1cblxuICBjb21wYXJlTWFpbiAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5tYWpvciwgb3RoZXIubWFqb3IpIHx8XG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5taW5vciwgb3RoZXIubWlub3IpIHx8XG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5wYXRjaCwgb3RoZXIucGF0Y2gpXG4gICAgKVxuICB9XG5cbiAgY29tcGFyZVByZSAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIC8vIE5PVCBoYXZpbmcgYSBwcmVyZWxlYXNlIGlzID4gaGF2aW5nIG9uZVxuICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmICFvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfSBlbHNlIGlmICghdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiBvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIDFcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmICFvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG5cbiAgICBsZXQgaSA9IDBcbiAgICBkbyB7XG4gICAgICBjb25zdCBhID0gdGhpcy5wcmVyZWxlYXNlW2ldXG4gICAgICBjb25zdCBiID0gb3RoZXIucHJlcmVsZWFzZVtpXVxuICAgICAgZGVidWcoJ3ByZXJlbGVhc2UgY29tcGFyZScsIGksIGEsIGIpXG4gICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfSBlbHNlIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfSBlbHNlIGlmIChhID09PSBiKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzKGEsIGIpXG4gICAgICB9XG4gICAgfSB3aGlsZSAoKytpKVxuICB9XG5cbiAgY29tcGFyZUJ1aWxkIChvdGhlcikge1xuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgbGV0IGkgPSAwXG4gICAgZG8ge1xuICAgICAgY29uc3QgYSA9IHRoaXMuYnVpbGRbaV1cbiAgICAgIGNvbnN0IGIgPSBvdGhlci5idWlsZFtpXVxuICAgICAgZGVidWcoJ2J1aWxkIGNvbXBhcmUnLCBpLCBhLCBiKVxuICAgICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0gZWxzZSBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyhhLCBiKVxuICAgICAgfVxuICAgIH0gd2hpbGUgKCsraSlcbiAgfVxuXG4gIC8vIHByZW1pbm9yIHdpbGwgYnVtcCB0aGUgdmVyc2lvbiB1cCB0byB0aGUgbmV4dCBtaW5vciByZWxlYXNlLCBhbmQgaW1tZWRpYXRlbHlcbiAgLy8gZG93biB0byBwcmUtcmVsZWFzZS4gcHJlbWFqb3IgYW5kIHByZXBhdGNoIHdvcmsgdGhlIHNhbWUgd2F5LlxuICBpbmMgKHJlbGVhc2UsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKSB7XG4gICAgaWYgKHJlbGVhc2Uuc3RhcnRzV2l0aCgncHJlJykpIHtcbiAgICAgIGlmICghaWRlbnRpZmllciAmJiBpZGVudGlmaWVyQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogaWRlbnRpZmllciBpcyBlbXB0eScpXG4gICAgICB9XG4gICAgICAvLyBBdm9pZCBhbiBpbnZhbGlkIHNlbXZlciByZXN1bHRzXG4gICAgICBpZiAoaWRlbnRpZmllcikge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGAtJHtpZGVudGlmaWVyfWAubWF0Y2godGhpcy5vcHRpb25zLmxvb3NlID8gcmVbdC5QUkVSRUxFQVNFTE9PU0VdIDogcmVbdC5QUkVSRUxFQVNFXSlcbiAgICAgICAgaWYgKCFtYXRjaCB8fCBtYXRjaFsxXSAhPT0gaWRlbnRpZmllcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpZGVudGlmaWVyOiAke2lkZW50aWZpZXJ9YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAocmVsZWFzZSkge1xuICAgICAgY2FzZSAncHJlbWFqb3InOlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLm1pbm9yID0gMFxuICAgICAgICB0aGlzLm1ham9yKytcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncHJlbWlub3InOlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLm1pbm9yKytcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncHJlcGF0Y2gnOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGFscmVhZHkgYSBwcmVyZWxlYXNlLCBpdCB3aWxsIGJ1bXAgdG8gdGhlIG5leHQgdmVyc2lvblxuICAgICAgICAvLyBkcm9wIGFueSBwcmVyZWxlYXNlcyB0aGF0IG1pZ2h0IGFscmVhZHkgZXhpc3QsIHNpbmNlIHRoZXkgYXJlIG5vdFxuICAgICAgICAvLyByZWxldmFudCBhdCB0aGlzIHBvaW50LlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLmluYygncGF0Y2gnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIGEgbm9uLXByZXJlbGVhc2UgdmVyc2lvbiwgdGhpcyBhY3RzIHRoZSBzYW1lIGFzXG4gICAgICAvLyBwcmVwYXRjaC5cbiAgICAgIGNhc2UgJ3ByZXJlbGVhc2UnOlxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuaW5jKCdwYXRjaCcsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3JlbGVhc2UnOlxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdmVyc2lvbiAke3RoaXMucmF3fSBpcyBub3QgYSBwcmVyZWxlYXNlYClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlICdtYWpvcic6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmUtbWFqb3IgdmVyc2lvbiwgYnVtcCB1cCB0byB0aGUgc2FtZSBtYWpvciB2ZXJzaW9uLlxuICAgICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IG1ham9yLlxuICAgICAgICAvLyAxLjAuMC01IGJ1bXBzIHRvIDEuMC4wXG4gICAgICAgIC8vIDEuMS4wIGJ1bXBzIHRvIDIuMC4wXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLm1pbm9yICE9PSAwIHx8XG4gICAgICAgICAgdGhpcy5wYXRjaCAhPT0gMCB8fFxuICAgICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5tYWpvcisrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5taW5vciA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ21pbm9yJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZS1taW5vciB2ZXJzaW9uLCBidW1wIHVwIHRvIHRoZSBzYW1lIG1pbm9yIHZlcnNpb24uXG4gICAgICAgIC8vIE90aGVyd2lzZSBpbmNyZW1lbnQgbWlub3IuXG4gICAgICAgIC8vIDEuMi4wLTUgYnVtcHMgdG8gMS4yLjBcbiAgICAgICAgLy8gMS4yLjEgYnVtcHMgdG8gMS4zLjBcbiAgICAgICAgaWYgKHRoaXMucGF0Y2ggIT09IDAgfHwgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMubWlub3IrK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwYXRjaCc6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgcHJlLXJlbGVhc2UgdmVyc2lvbiwgaXQgd2lsbCBpbmNyZW1lbnQgdGhlIHBhdGNoLlxuICAgICAgICAvLyBJZiBpdCBpcyBhIHByZS1yZWxlYXNlIGl0IHdpbGwgYnVtcCB1cCB0byB0aGUgc2FtZSBwYXRjaCB2ZXJzaW9uLlxuICAgICAgICAvLyAxLjIuMC01IHBhdGNoZXMgdG8gMS4yLjBcbiAgICAgICAgLy8gMS4yLjAgcGF0Y2hlcyB0byAxLjIuMVxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMucGF0Y2grK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICAvLyBUaGlzIHByb2JhYmx5IHNob3VsZG4ndCBiZSB1c2VkIHB1YmxpY2x5LlxuICAgICAgLy8gMS4wLjAgJ3ByZScgd291bGQgYmVjb21lIDEuMC4wLTAgd2hpY2ggaXMgdGhlIHdyb25nIGRpcmVjdGlvbi5cbiAgICAgIGNhc2UgJ3ByZSc6IHtcbiAgICAgICAgY29uc3QgYmFzZSA9IE51bWJlcihpZGVudGlmaWVyQmFzZSkgPyAxIDogMFxuXG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW2Jhc2VdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGkgPSB0aGlzLnByZXJlbGVhc2UubGVuZ3RoXG4gICAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJlcmVsZWFzZVtpXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlW2ldKytcbiAgICAgICAgICAgICAgaSA9IC0yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpID09PSAtMSkge1xuICAgICAgICAgICAgLy8gZGlkbid0IGluY3JlbWVudCBhbnl0aGluZ1xuICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIgPT09IHRoaXMucHJlcmVsZWFzZS5qb2luKCcuJykgJiYgaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6IGlkZW50aWZpZXIgYWxyZWFkeSBleGlzdHMnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlLnB1c2goYmFzZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkZW50aWZpZXIpIHtcbiAgICAgICAgICAvLyAxLjIuMC1iZXRhLjEgYnVtcHMgdG8gMS4yLjAtYmV0YS4yLFxuICAgICAgICAgIC8vIDEuMi4wLWJldGEuZm9vYmx6IG9yIDEuMi4wLWJldGEgYnVtcHMgdG8gMS4yLjAtYmV0YS4wXG4gICAgICAgICAgbGV0IHByZXJlbGVhc2UgPSBbaWRlbnRpZmllciwgYmFzZV1cbiAgICAgICAgICBpZiAoaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBwcmVyZWxlYXNlID0gW2lkZW50aWZpZXJdXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb21wYXJlSWRlbnRpZmllcnModGhpcy5wcmVyZWxlYXNlWzBdLCBpZGVudGlmaWVyKSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGlzTmFOKHRoaXMucHJlcmVsZWFzZVsxXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gcHJlcmVsZWFzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBwcmVyZWxlYXNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiAke3JlbGVhc2V9YClcbiAgICB9XG4gICAgdGhpcy5yYXcgPSB0aGlzLmZvcm1hdCgpXG4gICAgaWYgKHRoaXMuYnVpbGQubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJhdyArPSBgKyR7dGhpcy5idWlsZC5qb2luKCcuJyl9YFxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2VtVmVyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBwYXJzZSA9ICh2ZXJzaW9uLCBvcHRpb25zLCB0aHJvd0Vycm9ycyA9IGZhbHNlKSA9PiB7XG4gIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgcmV0dXJuIHZlcnNpb25cbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBuZXcgU2VtVmVyKHZlcnNpb24sIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgaWYgKCF0aHJvd0Vycm9ycykge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgdGhyb3cgZXJcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgdmFsaWQgPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB2ID0gcGFyc2UodmVyc2lvbiwgb3B0aW9ucylcbiAgcmV0dXJuIHYgPyB2LnZlcnNpb24gOiBudWxsXG59XG5tb2R1bGUuZXhwb3J0cyA9IHZhbGlkXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgY2xlYW4gPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBzID0gcGFyc2UodmVyc2lvbi50cmltKCkucmVwbGFjZSgvXls9dl0rLywgJycpLCBvcHRpb25zKVxuICByZXR1cm4gcyA/IHMudmVyc2lvbiA6IG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gY2xlYW5cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcblxuY29uc3QgaW5jID0gKHZlcnNpb24sIHJlbGVhc2UsIG9wdGlvbnMsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKSA9PiB7XG4gIGlmICh0eXBlb2YgKG9wdGlvbnMpID09PSAnc3RyaW5nJykge1xuICAgIGlkZW50aWZpZXJCYXNlID0gaWRlbnRpZmllclxuICAgIGlkZW50aWZpZXIgPSBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZFxuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFNlbVZlcihcbiAgICAgIHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIgPyB2ZXJzaW9uLnZlcnNpb24gOiB2ZXJzaW9uLFxuICAgICAgb3B0aW9uc1xuICAgICkuaW5jKHJlbGVhc2UsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKS52ZXJzaW9uXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBpbmNcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZS5qcycpXG5cbmNvbnN0IGRpZmYgPSAodmVyc2lvbjEsIHZlcnNpb24yKSA9PiB7XG4gIGNvbnN0IHYxID0gcGFyc2UodmVyc2lvbjEsIG51bGwsIHRydWUpXG4gIGNvbnN0IHYyID0gcGFyc2UodmVyc2lvbjIsIG51bGwsIHRydWUpXG4gIGNvbnN0IGNvbXBhcmlzb24gPSB2MS5jb21wYXJlKHYyKVxuXG4gIGlmIChjb21wYXJpc29uID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IHYxSGlnaGVyID0gY29tcGFyaXNvbiA+IDBcbiAgY29uc3QgaGlnaFZlcnNpb24gPSB2MUhpZ2hlciA/IHYxIDogdjJcbiAgY29uc3QgbG93VmVyc2lvbiA9IHYxSGlnaGVyID8gdjIgOiB2MVxuICBjb25zdCBoaWdoSGFzUHJlID0gISFoaWdoVmVyc2lvbi5wcmVyZWxlYXNlLmxlbmd0aFxuICBjb25zdCBsb3dIYXNQcmUgPSAhIWxvd1ZlcnNpb24ucHJlcmVsZWFzZS5sZW5ndGhcblxuICBpZiAobG93SGFzUHJlICYmICFoaWdoSGFzUHJlKSB7XG4gICAgLy8gR29pbmcgZnJvbSBwcmVyZWxlYXNlIC0+IG5vIHByZXJlbGVhc2UgcmVxdWlyZXMgc29tZSBzcGVjaWFsIGNhc2luZ1xuXG4gICAgLy8gSWYgdGhlIGxvdyB2ZXJzaW9uIGhhcyBvbmx5IGEgbWFqb3IsIHRoZW4gaXQgd2lsbCBhbHdheXMgYmUgYSBtYWpvclxuICAgIC8vIFNvbWUgZXhhbXBsZXM6XG4gICAgLy8gMS4wLjAtMSAtPiAxLjAuMFxuICAgIC8vIDEuMC4wLTEgLT4gMS4xLjFcbiAgICAvLyAxLjAuMC0xIC0+IDIuMC4wXG4gICAgaWYgKCFsb3dWZXJzaW9uLnBhdGNoICYmICFsb3dWZXJzaW9uLm1pbm9yKSB7XG4gICAgICByZXR1cm4gJ21ham9yJ1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBtYWluIHBhcnQgaGFzIG5vIGRpZmZlcmVuY2VcbiAgICBpZiAobG93VmVyc2lvbi5jb21wYXJlTWFpbihoaWdoVmVyc2lvbikgPT09IDApIHtcbiAgICAgIGlmIChsb3dWZXJzaW9uLm1pbm9yICYmICFsb3dWZXJzaW9uLnBhdGNoKSB7XG4gICAgICAgIHJldHVybiAnbWlub3InXG4gICAgICB9XG4gICAgICByZXR1cm4gJ3BhdGNoJ1xuICAgIH1cbiAgfVxuXG4gIC8vIGFkZCB0aGUgYHByZWAgcHJlZml4IGlmIHdlIGFyZSBnb2luZyB0byBhIHByZXJlbGVhc2UgdmVyc2lvblxuICBjb25zdCBwcmVmaXggPSBoaWdoSGFzUHJlID8gJ3ByZScgOiAnJ1xuXG4gIGlmICh2MS5tYWpvciAhPT0gdjIubWFqb3IpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgJ21ham9yJ1xuICB9XG5cbiAgaWYgKHYxLm1pbm9yICE9PSB2Mi5taW5vcikge1xuICAgIHJldHVybiBwcmVmaXggKyAnbWlub3InXG4gIH1cblxuICBpZiAodjEucGF0Y2ggIT09IHYyLnBhdGNoKSB7XG4gICAgcmV0dXJuIHByZWZpeCArICdwYXRjaCdcbiAgfVxuXG4gIC8vIGhpZ2ggYW5kIGxvdyBhcmUgcHJlbGVhc2VzXG4gIHJldHVybiAncHJlcmVsZWFzZSdcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkaWZmXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBtYWpvciA9IChhLCBsb29zZSkgPT4gbmV3IFNlbVZlcihhLCBsb29zZSkubWFqb3Jcbm1vZHVsZS5leHBvcnRzID0gbWFqb3JcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IG1pbm9yID0gKGEsIGxvb3NlKSA9PiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5taW5vclxubW9kdWxlLmV4cG9ydHMgPSBtaW5vclxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgcGF0Y2ggPSAoYSwgbG9vc2UpID0+IG5ldyBTZW1WZXIoYSwgbG9vc2UpLnBhdGNoXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgcHJlcmVsZWFzZSA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJldHVybiAocGFyc2VkICYmIHBhcnNlZC5wcmVyZWxlYXNlLmxlbmd0aCkgPyBwYXJzZWQucHJlcmVsZWFzZSA6IG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gcHJlcmVsZWFzZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgY29tcGFyZSA9IChhLCBiLCBsb29zZSkgPT5cbiAgbmV3IFNlbVZlcihhLCBsb29zZSkuY29tcGFyZShuZXcgU2VtVmVyKGIsIGxvb3NlKSlcblxubW9kdWxlLmV4cG9ydHMgPSBjb21wYXJlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IHJjb21wYXJlID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGIsIGEsIGxvb3NlKVxubW9kdWxlLmV4cG9ydHMgPSByY29tcGFyZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBjb21wYXJlTG9vc2UgPSAoYSwgYikgPT4gY29tcGFyZShhLCBiLCB0cnVlKVxubW9kdWxlLmV4cG9ydHMgPSBjb21wYXJlTG9vc2VcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGNvbXBhcmVCdWlsZCA9IChhLCBiLCBsb29zZSkgPT4ge1xuICBjb25zdCB2ZXJzaW9uQSA9IG5ldyBTZW1WZXIoYSwgbG9vc2UpXG4gIGNvbnN0IHZlcnNpb25CID0gbmV3IFNlbVZlcihiLCBsb29zZSlcbiAgcmV0dXJuIHZlcnNpb25BLmNvbXBhcmUodmVyc2lvbkIpIHx8IHZlcnNpb25BLmNvbXBhcmVCdWlsZCh2ZXJzaW9uQilcbn1cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZUJ1aWxkXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlQnVpbGQgPSByZXF1aXJlKCcuL2NvbXBhcmUtYnVpbGQnKVxuY29uc3Qgc29ydCA9IChsaXN0LCBsb29zZSkgPT4gbGlzdC5zb3J0KChhLCBiKSA9PiBjb21wYXJlQnVpbGQoYSwgYiwgbG9vc2UpKVxubW9kdWxlLmV4cG9ydHMgPSBzb3J0XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlQnVpbGQgPSByZXF1aXJlKCcuL2NvbXBhcmUtYnVpbGQnKVxuY29uc3QgcnNvcnQgPSAobGlzdCwgbG9vc2UpID0+IGxpc3Quc29ydCgoYSwgYikgPT4gY29tcGFyZUJ1aWxkKGIsIGEsIGxvb3NlKSlcbm1vZHVsZS5leHBvcnRzID0gcnNvcnRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgZ3QgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpID4gMFxubW9kdWxlLmV4cG9ydHMgPSBndFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBsdCA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPCAwXG5tb2R1bGUuZXhwb3J0cyA9IGx0XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGVxID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA9PT0gMFxubW9kdWxlLmV4cG9ydHMgPSBlcVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBuZXEgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpICE9PSAwXG5tb2R1bGUuZXhwb3J0cyA9IG5lcVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBndGUgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpID49IDBcbm1vZHVsZS5leHBvcnRzID0gZ3RlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGx0ZSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPD0gMFxubW9kdWxlLmV4cG9ydHMgPSBsdGVcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGVxID0gcmVxdWlyZSgnLi9lcScpXG5jb25zdCBuZXEgPSByZXF1aXJlKCcuL25lcScpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4vZ3QnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi9ndGUnKVxuY29uc3QgbHQgPSByZXF1aXJlKCcuL2x0JylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4vbHRlJylcblxuY29uc3QgY21wID0gKGEsIG9wLCBiLCBsb29zZSkgPT4ge1xuICBzd2l0Y2ggKG9wKSB7XG4gICAgY2FzZSAnPT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSA9PT0gYlxuXG4gICAgY2FzZSAnIT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSAhPT0gYlxuXG4gICAgY2FzZSAnJzpcbiAgICBjYXNlICc9JzpcbiAgICBjYXNlICc9PSc6XG4gICAgICByZXR1cm4gZXEoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICchPSc6XG4gICAgICByZXR1cm4gbmVxKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPic6XG4gICAgICByZXR1cm4gZ3QoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc+PSc6XG4gICAgICByZXR1cm4gZ3RlKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPCc6XG4gICAgICByZXR1cm4gbHQoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc8PSc6XG4gICAgICByZXR1cm4gbHRlKGEsIGIsIGxvb3NlKVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgb3BlcmF0b3I6ICR7b3B9YClcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBjbXBcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcblxuY29uc3QgY29lcmNlID0gKHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICByZXR1cm4gdmVyc2lvblxuICB9XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnbnVtYmVyJykge1xuICAgIHZlcnNpb24gPSBTdHJpbmcodmVyc2lvbilcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICBsZXQgbWF0Y2ggPSBudWxsXG4gIGlmICghb3B0aW9ucy5ydGwpIHtcbiAgICBtYXRjaCA9IHZlcnNpb24ubWF0Y2gob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHJlW3QuQ09FUkNFRlVMTF0gOiByZVt0LkNPRVJDRV0pXG4gIH0gZWxzZSB7XG4gICAgLy8gRmluZCB0aGUgcmlnaHQtbW9zdCBjb2VyY2libGUgc3RyaW5nIHRoYXQgZG9lcyBub3Qgc2hhcmVcbiAgICAvLyBhIHRlcm1pbnVzIHdpdGggYSBtb3JlIGxlZnQtd2FyZCBjb2VyY2libGUgc3RyaW5nLlxuICAgIC8vIEVnLCAnMS4yLjMuNCcgd2FudHMgdG8gY29lcmNlICcyLjMuNCcsIG5vdCAnMy40JyBvciAnNCdcbiAgICAvLyBXaXRoIGluY2x1ZGVQcmVyZWxlYXNlIG9wdGlvbiBzZXQsICcxLjIuMy40LXJjJyB3YW50cyB0byBjb2VyY2UgJzIuMy40LXJjJywgbm90ICcyLjMuNCdcbiAgICAvL1xuICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgc3RyaW5nIGNoZWNraW5nIHdpdGggYSAvZyByZWdleHBcbiAgICAvLyBNYW51YWxseSBzZXQgdGhlIGluZGV4IHNvIGFzIHRvIHBpY2sgdXAgb3ZlcmxhcHBpbmcgbWF0Y2hlcy5cbiAgICAvLyBTdG9wIHdoZW4gd2UgZ2V0IGEgbWF0Y2ggdGhhdCBlbmRzIGF0IHRoZSBzdHJpbmcgZW5kLCBzaW5jZSBub1xuICAgIC8vIGNvZXJjaWJsZSBzdHJpbmcgY2FuIGJlIG1vcmUgcmlnaHQtd2FyZCB3aXRob3V0IHRoZSBzYW1lIHRlcm1pbnVzLlxuICAgIGNvbnN0IGNvZXJjZVJ0bFJlZ2V4ID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHJlW3QuQ09FUkNFUlRMRlVMTF0gOiByZVt0LkNPRVJDRVJUTF1cbiAgICBsZXQgbmV4dFxuICAgIHdoaWxlICgobmV4dCA9IGNvZXJjZVJ0bFJlZ2V4LmV4ZWModmVyc2lvbikpICYmXG4gICAgICAgICghbWF0Y2ggfHwgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggIT09IHZlcnNpb24ubGVuZ3RoKVxuICAgICkge1xuICAgICAgaWYgKCFtYXRjaCB8fFxuICAgICAgICAgICAgbmV4dC5pbmRleCArIG5leHRbMF0ubGVuZ3RoICE9PSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCkge1xuICAgICAgICBtYXRjaCA9IG5leHRcbiAgICAgIH1cbiAgICAgIGNvZXJjZVJ0bFJlZ2V4Lmxhc3RJbmRleCA9IG5leHQuaW5kZXggKyBuZXh0WzFdLmxlbmd0aCArIG5leHRbMl0ubGVuZ3RoXG4gICAgfVxuICAgIC8vIGxlYXZlIGl0IGluIGEgY2xlYW4gc3RhdGVcbiAgICBjb2VyY2VSdGxSZWdleC5sYXN0SW5kZXggPSAtMVxuICB9XG5cbiAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IG1ham9yID0gbWF0Y2hbMl1cbiAgY29uc3QgbWlub3IgPSBtYXRjaFszXSB8fCAnMCdcbiAgY29uc3QgcGF0Y2ggPSBtYXRjaFs0XSB8fCAnMCdcbiAgY29uc3QgcHJlcmVsZWFzZSA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiYgbWF0Y2hbNV0gPyBgLSR7bWF0Y2hbNV19YCA6ICcnXG4gIGNvbnN0IGJ1aWxkID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBtYXRjaFs2XSA/IGArJHttYXRjaFs2XX1gIDogJydcblxuICByZXR1cm4gcGFyc2UoYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2h9JHtwcmVyZWxlYXNlfSR7YnVpbGR9YCwgb3B0aW9ucylcbn1cbm1vZHVsZS5leHBvcnRzID0gY29lcmNlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jbGFzcyBMUlVDYWNoZSB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICB0aGlzLm1heCA9IDEwMDBcbiAgICB0aGlzLm1hcCA9IG5ldyBNYXAoKVxuICB9XG5cbiAgZ2V0IChrZXkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubWFwLmdldChrZXkpXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBrZXkgZnJvbSB0aGUgbWFwIGFuZCBhZGQgaXQgdG8gdGhlIGVuZFxuICAgICAgdGhpcy5tYXAuZGVsZXRlKGtleSlcbiAgICAgIHRoaXMubWFwLnNldChrZXksIHZhbHVlKVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuICB9XG5cbiAgZGVsZXRlIChrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZGVsZXRlKGtleSlcbiAgfVxuXG4gIHNldCAoa2V5LCB2YWx1ZSkge1xuICAgIGNvbnN0IGRlbGV0ZWQgPSB0aGlzLmRlbGV0ZShrZXkpXG5cbiAgICBpZiAoIWRlbGV0ZWQgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gSWYgY2FjaGUgaXMgZnVsbCwgZGVsZXRlIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGl0ZW1cbiAgICAgIGlmICh0aGlzLm1hcC5zaXplID49IHRoaXMubWF4KSB7XG4gICAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5tYXAua2V5cygpLm5leHQoKS52YWx1ZVxuICAgICAgICB0aGlzLmRlbGV0ZShmaXJzdEtleSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYXAuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IExSVUNhY2hlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTUEFDRV9DSEFSQUNURVJTID0gL1xccysvZ1xuXG4vLyBob2lzdGVkIGNsYXNzIGZvciBjeWNsaWMgZGVwZW5kZW5jeVxuY2xhc3MgUmFuZ2Uge1xuICBjb25zdHJ1Y3RvciAocmFuZ2UsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpXG5cbiAgICBpZiAocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkge1xuICAgICAgaWYgKFxuICAgICAgICByYW5nZS5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlICYmXG4gICAgICAgIHJhbmdlLmluY2x1ZGVQcmVyZWxlYXNlID09PSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gcmFuZ2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2UocmFuZ2UucmF3LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyYW5nZSBpbnN0YW5jZW9mIENvbXBhcmF0b3IpIHtcbiAgICAgIC8vIGp1c3QgcHV0IGl0IGluIHRoZSBzZXQgYW5kIHJldHVyblxuICAgICAgdGhpcy5yYXcgPSByYW5nZS52YWx1ZVxuICAgICAgdGhpcy5zZXQgPSBbW3JhbmdlXV1cbiAgICAgIHRoaXMuZm9ybWF0dGVkID0gdW5kZWZpbmVkXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgdGhpcy5pbmNsdWRlUHJlcmVsZWFzZSA9ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZVxuXG4gICAgLy8gRmlyc3QgcmVkdWNlIGFsbCB3aGl0ZXNwYWNlIGFzIG11Y2ggYXMgcG9zc2libGUgc28gd2UgZG8gbm90IGhhdmUgdG8gcmVseVxuICAgIC8vIG9uIHBvdGVudGlhbGx5IHNsb3cgcmVnZXhlcyBsaWtlIFxccyouIFRoaXMgaXMgdGhlbiBzdG9yZWQgYW5kIHVzZWQgZm9yXG4gICAgLy8gZnV0dXJlIGVycm9yIG1lc3NhZ2VzIGFzIHdlbGwuXG4gICAgdGhpcy5yYXcgPSByYW5nZS50cmltKCkucmVwbGFjZShTUEFDRV9DSEFSQUNURVJTLCAnICcpXG5cbiAgICAvLyBGaXJzdCwgc3BsaXQgb24gfHxcbiAgICB0aGlzLnNldCA9IHRoaXMucmF3XG4gICAgICAuc3BsaXQoJ3x8JylcbiAgICAgIC8vIG1hcCB0aGUgcmFuZ2UgdG8gYSAyZCBhcnJheSBvZiBjb21wYXJhdG9yc1xuICAgICAgLm1hcChyID0+IHRoaXMucGFyc2VSYW5nZShyLnRyaW0oKSkpXG4gICAgICAvLyB0aHJvdyBvdXQgYW55IGNvbXBhcmF0b3IgbGlzdHMgdGhhdCBhcmUgZW1wdHlcbiAgICAgIC8vIHRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgaXQgd2FzIG5vdCBhIHZhbGlkIHJhbmdlLCB3aGljaCBpcyBhbGxvd2VkXG4gICAgICAvLyBpbiBsb29zZSBtb2RlLCBidXQgd2lsbCBzdGlsbCB0aHJvdyBpZiB0aGUgV0hPTEUgcmFuZ2UgaXMgaW52YWxpZC5cbiAgICAgIC5maWx0ZXIoYyA9PiBjLmxlbmd0aClcblxuICAgIGlmICghdGhpcy5zZXQubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIFNlbVZlciBSYW5nZTogJHt0aGlzLnJhd31gKVxuICAgIH1cblxuICAgIC8vIGlmIHdlIGhhdmUgYW55IHRoYXQgYXJlIG5vdCB0aGUgbnVsbCBzZXQsIHRocm93IG91dCBudWxsIHNldHMuXG4gICAgaWYgKHRoaXMuc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIGtlZXAgdGhlIGZpcnN0IG9uZSwgaW4gY2FzZSB0aGV5J3JlIGFsbCBudWxsIHNldHNcbiAgICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5zZXRbMF1cbiAgICAgIHRoaXMuc2V0ID0gdGhpcy5zZXQuZmlsdGVyKGMgPT4gIWlzTnVsbFNldChjWzBdKSlcbiAgICAgIGlmICh0aGlzLnNldC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zZXQgPSBbZmlyc3RdXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbnkgdGhhdCBhcmUgKiwgdGhlbiB0aGUgcmFuZ2UgaXMganVzdCAqXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLnNldCkge1xuICAgICAgICAgIGlmIChjLmxlbmd0aCA9PT0gMSAmJiBpc0FueShjWzBdKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQgPSBbY11cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtYXR0ZWQgPSB1bmRlZmluZWRcbiAgfVxuXG4gIGdldCByYW5nZSAoKSB7XG4gICAgaWYgKHRoaXMuZm9ybWF0dGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZm9ybWF0dGVkID0gJydcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgdGhpcy5mb3JtYXR0ZWQgKz0gJ3x8J1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBzID0gdGhpcy5zZXRbaV1cbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb21wcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgIGlmIChrID4gMCkge1xuICAgICAgICAgICAgdGhpcy5mb3JtYXR0ZWQgKz0gJyAnXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZm9ybWF0dGVkICs9IGNvbXBzW2tdLnRvU3RyaW5nKCkudHJpbSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVkXG4gIH1cblxuICBmb3JtYXQgKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmdlXG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2VcbiAgfVxuXG4gIHBhcnNlUmFuZ2UgKHJhbmdlKSB7XG4gICAgLy8gbWVtb2l6ZSByYW5nZSBwYXJzaW5nIGZvciBwZXJmb3JtYW5jZS5cbiAgICAvLyB0aGlzIGlzIGEgdmVyeSBob3QgcGF0aCwgYW5kIGZ1bGx5IGRldGVybWluaXN0aWMuXG4gICAgY29uc3QgbWVtb09wdHMgPVxuICAgICAgKHRoaXMub3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRSkgfFxuICAgICAgKHRoaXMub3B0aW9ucy5sb29zZSAmJiBGTEFHX0xPT1NFKVxuICAgIGNvbnN0IG1lbW9LZXkgPSBtZW1vT3B0cyArICc6JyArIHJhbmdlXG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KG1lbW9LZXkpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFxuICAgIH1cblxuICAgIGNvbnN0IGxvb3NlID0gdGhpcy5vcHRpb25zLmxvb3NlXG4gICAgLy8gYDEuMi4zIC0gMS4yLjRgID0+IGA+PTEuMi4zIDw9MS4yLjRgXG4gICAgY29uc3QgaHIgPSBsb29zZSA/IHJlW3QuSFlQSEVOUkFOR0VMT09TRV0gOiByZVt0LkhZUEhFTlJBTkdFXVxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShociwgaHlwaGVuUmVwbGFjZSh0aGlzLm9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpKVxuICAgIGRlYnVnKCdoeXBoZW4gcmVwbGFjZScsIHJhbmdlKVxuXG4gICAgLy8gYD4gMS4yLjMgPCAxLjIuNWAgPT4gYD4xLjIuMyA8MS4yLjVgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuQ09NUEFSQVRPUlRSSU1dLCBjb21wYXJhdG9yVHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ2NvbXBhcmF0b3IgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gYH4gMS4yLjNgID0+IGB+MS4yLjNgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuVElMREVUUklNXSwgdGlsZGVUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygndGlsZGUgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gYF4gMS4yLjNgID0+IGBeMS4yLjNgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuQ0FSRVRUUklNXSwgY2FyZXRUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygnY2FyZXQgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIHJhbmdlIGlzIGNvbXBsZXRlbHkgdHJpbW1lZCBhbmRcbiAgICAvLyByZWFkeSB0byBiZSBzcGxpdCBpbnRvIGNvbXBhcmF0b3JzLlxuXG4gICAgbGV0IHJhbmdlTGlzdCA9IHJhbmdlXG4gICAgICAuc3BsaXQoJyAnKVxuICAgICAgLm1hcChjb21wID0+IHBhcnNlQ29tcGFyYXRvcihjb21wLCB0aGlzLm9wdGlvbnMpKVxuICAgICAgLmpvaW4oJyAnKVxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC8vID49MC4wLjAgaXMgZXF1aXZhbGVudCB0byAqXG4gICAgICAubWFwKGNvbXAgPT4gcmVwbGFjZUdURTAoY29tcCwgdGhpcy5vcHRpb25zKSlcblxuICAgIGlmIChsb29zZSkge1xuICAgICAgLy8gaW4gbG9vc2UgbW9kZSwgdGhyb3cgb3V0IGFueSB0aGF0IGFyZSBub3QgdmFsaWQgY29tcGFyYXRvcnNcbiAgICAgIHJhbmdlTGlzdCA9IHJhbmdlTGlzdC5maWx0ZXIoY29tcCA9PiB7XG4gICAgICAgIGRlYnVnKCdsb29zZSBpbnZhbGlkIGZpbHRlcicsIGNvbXAsIHRoaXMub3B0aW9ucylcbiAgICAgICAgcmV0dXJuICEhY29tcC5tYXRjaChyZVt0LkNPTVBBUkFUT1JMT09TRV0pXG4gICAgICB9KVxuICAgIH1cbiAgICBkZWJ1ZygncmFuZ2UgbGlzdCcsIHJhbmdlTGlzdClcblxuICAgIC8vIGlmIGFueSBjb21wYXJhdG9ycyBhcmUgdGhlIG51bGwgc2V0LCB0aGVuIHJlcGxhY2Ugd2l0aCBKVVNUIG51bGwgc2V0XG4gICAgLy8gaWYgbW9yZSB0aGFuIG9uZSBjb21wYXJhdG9yLCByZW1vdmUgYW55ICogY29tcGFyYXRvcnNcbiAgICAvLyBhbHNvLCBkb24ndCBpbmNsdWRlIHRoZSBzYW1lIGNvbXBhcmF0b3IgbW9yZSB0aGFuIG9uY2VcbiAgICBjb25zdCByYW5nZU1hcCA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IGNvbXBhcmF0b3JzID0gcmFuZ2VMaXN0Lm1hcChjb21wID0+IG5ldyBDb21wYXJhdG9yKGNvbXAsIHRoaXMub3B0aW9ucykpXG4gICAgZm9yIChjb25zdCBjb21wIG9mIGNvbXBhcmF0b3JzKSB7XG4gICAgICBpZiAoaXNOdWxsU2V0KGNvbXApKSB7XG4gICAgICAgIHJldHVybiBbY29tcF1cbiAgICAgIH1cbiAgICAgIHJhbmdlTWFwLnNldChjb21wLnZhbHVlLCBjb21wKVxuICAgIH1cbiAgICBpZiAocmFuZ2VNYXAuc2l6ZSA+IDEgJiYgcmFuZ2VNYXAuaGFzKCcnKSkge1xuICAgICAgcmFuZ2VNYXAuZGVsZXRlKCcnKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5yYW5nZU1hcC52YWx1ZXMoKV1cbiAgICBjYWNoZS5zZXQobWVtb0tleSwgcmVzdWx0KVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGludGVyc2VjdHMgKHJhbmdlLCBvcHRpb25zKSB7XG4gICAgaWYgKCEocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgUmFuZ2UgaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldC5zb21lKCh0aGlzQ29tcGFyYXRvcnMpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGlzU2F0aXNmaWFibGUodGhpc0NvbXBhcmF0b3JzLCBvcHRpb25zKSAmJlxuICAgICAgICByYW5nZS5zZXQuc29tZSgocmFuZ2VDb21wYXJhdG9ycykgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpc1NhdGlzZmlhYmxlKHJhbmdlQ29tcGFyYXRvcnMsIG9wdGlvbnMpICYmXG4gICAgICAgICAgICB0aGlzQ29tcGFyYXRvcnMuZXZlcnkoKHRoaXNDb21wYXJhdG9yKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiByYW5nZUNvbXBhcmF0b3JzLmV2ZXJ5KChyYW5nZUNvbXBhcmF0b3IpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc0NvbXBhcmF0b3IuaW50ZXJzZWN0cyhyYW5nZUNvbXBhcmF0b3IsIG9wdGlvbnMpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9KVxuICB9XG5cbiAgLy8gaWYgQU5ZIG9mIHRoZSBzZXRzIG1hdGNoIEFMTCBvZiBpdHMgY29tcGFyYXRvcnMsIHRoZW4gcGFzc1xuICB0ZXN0ICh2ZXJzaW9uKSB7XG4gICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCB0aGlzLm9wdGlvbnMpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGVzdFNldCh0aGlzLnNldFtpXSwgdmVyc2lvbiwgdGhpcy5vcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmdlXG5cbmNvbnN0IExSVSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2xydWNhY2hlJylcbmNvbnN0IGNhY2hlID0gbmV3IExSVSgpXG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3BhcnNlLW9wdGlvbnMnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4vY29tcGFyYXRvcicpXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vc2VtdmVyJylcbmNvbnN0IHtcbiAgc2FmZVJlOiByZSxcbiAgdCxcbiAgY29tcGFyYXRvclRyaW1SZXBsYWNlLFxuICB0aWxkZVRyaW1SZXBsYWNlLFxuICBjYXJldFRyaW1SZXBsYWNlLFxufSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcbmNvbnN0IHsgRkxBR19JTkNMVURFX1BSRVJFTEVBU0UsIEZMQUdfTE9PU0UgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2NvbnN0YW50cycpXG5cbmNvbnN0IGlzTnVsbFNldCA9IGMgPT4gYy52YWx1ZSA9PT0gJzwwLjAuMC0wJ1xuY29uc3QgaXNBbnkgPSBjID0+IGMudmFsdWUgPT09ICcnXG5cbi8vIHRha2UgYSBzZXQgb2YgY29tcGFyYXRvcnMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZXJlXG4vLyBleGlzdHMgYSB2ZXJzaW9uIHdoaWNoIGNhbiBzYXRpc2Z5IGl0XG5jb25zdCBpc1NhdGlzZmlhYmxlID0gKGNvbXBhcmF0b3JzLCBvcHRpb25zKSA9PiB7XG4gIGxldCByZXN1bHQgPSB0cnVlXG4gIGNvbnN0IHJlbWFpbmluZ0NvbXBhcmF0b3JzID0gY29tcGFyYXRvcnMuc2xpY2UoKVxuICBsZXQgdGVzdENvbXBhcmF0b3IgPSByZW1haW5pbmdDb21wYXJhdG9ycy5wb3AoKVxuXG4gIHdoaWxlIChyZXN1bHQgJiYgcmVtYWluaW5nQ29tcGFyYXRvcnMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ID0gcmVtYWluaW5nQ29tcGFyYXRvcnMuZXZlcnkoKG90aGVyQ29tcGFyYXRvcikgPT4ge1xuICAgICAgcmV0dXJuIHRlc3RDb21wYXJhdG9yLmludGVyc2VjdHMob3RoZXJDb21wYXJhdG9yLCBvcHRpb25zKVxuICAgIH0pXG5cbiAgICB0ZXN0Q29tcGFyYXRvciA9IHJlbWFpbmluZ0NvbXBhcmF0b3JzLnBvcCgpXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIGNvbXByaXNlZCBvZiB4cmFuZ2VzLCB0aWxkZXMsIHN0YXJzLCBhbmQgZ3RsdCdzIGF0IHRoaXMgcG9pbnQuXG4vLyBhbHJlYWR5IHJlcGxhY2VkIHRoZSBoeXBoZW4gcmFuZ2VzXG4vLyB0dXJuIGludG8gYSBzZXQgb2YgSlVTVCBjb21wYXJhdG9ycy5cbmNvbnN0IHBhcnNlQ29tcGFyYXRvciA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdjb21wJywgY29tcCwgb3B0aW9ucylcbiAgY29tcCA9IHJlcGxhY2VDYXJldHMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ2NhcmV0JywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VUaWxkZXMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ3RpbGRlcycsIGNvbXApXG4gIGNvbXAgPSByZXBsYWNlWFJhbmdlcyhjb21wLCBvcHRpb25zKVxuICBkZWJ1ZygneHJhbmdlJywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VTdGFycyhjb21wLCBvcHRpb25zKVxuICBkZWJ1Zygnc3RhcnMnLCBjb21wKVxuICByZXR1cm4gY29tcFxufVxuXG5jb25zdCBpc1ggPSBpZCA9PiAhaWQgfHwgaWQudG9Mb3dlckNhc2UoKSA9PT0gJ3gnIHx8IGlkID09PSAnKidcblxuLy8gfiwgfj4gLS0+ICogKGFueSwga2luZGEgc2lsbHkpXG4vLyB+MiwgfjIueCwgfjIueC54LCB+PjIsIH4+Mi54IH4+Mi54LnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIH4yLjAsIH4yLjAueCwgfj4yLjAsIH4+Mi4wLnggLS0+ID49Mi4wLjAgPDIuMS4wLTBcbi8vIH4xLjIsIH4xLjIueCwgfj4xLjIsIH4+MS4yLnggLS0+ID49MS4yLjAgPDEuMy4wLTBcbi8vIH4xLjIuMywgfj4xLjIuMyAtLT4gPj0xLjIuMyA8MS4zLjAtMFxuLy8gfjEuMi4wLCB+PjEuMi4wIC0tPiA+PTEuMi4wIDwxLjMuMC0wXG4vLyB+MC4wLjEgLS0+ID49MC4wLjEgPDAuMS4wLTBcbmNvbnN0IHJlcGxhY2VUaWxkZXMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VUaWxkZShjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VUaWxkZSA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5USUxERUxPT1NFXSA6IHJlW3QuVElMREVdXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKF8sIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ3RpbGRlJywgY29tcCwgXywgTSwgbSwgcCwgcHIpXG4gICAgbGV0IHJldFxuXG4gICAgaWYgKGlzWChNKSkge1xuICAgICAgcmV0ID0gJydcbiAgICB9IGVsc2UgaWYgKGlzWChtKSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAgPCR7K00gKyAxfS4wLjAtMGBcbiAgICB9IGVsc2UgaWYgKGlzWChwKSkge1xuICAgICAgLy8gfjEuMiA9PSA+PTEuMi4wIDwxLjMuMC0wXG4gICAgICByZXQgPSBgPj0ke019LiR7bX0uMCA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH0gZWxzZSBpZiAocHIpIHtcbiAgICAgIGRlYnVnKCdyZXBsYWNlVGlsZGUgcHInLCBwcilcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gfjEuMi4zID09ID49MS4yLjMgPDEuMy4wLTBcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9XG5cbiAgICBkZWJ1ZygndGlsZGUgcmV0dXJuJywgcmV0KVxuICAgIHJldHVybiByZXRcbiAgfSlcbn1cblxuLy8gXiAtLT4gKiAoYW55LCBraW5kYSBzaWxseSlcbi8vIF4yLCBeMi54LCBeMi54LnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIF4yLjAsIF4yLjAueCAtLT4gPj0yLjAuMCA8My4wLjAtMFxuLy8gXjEuMiwgXjEuMi54IC0tPiA+PTEuMi4wIDwyLjAuMC0wXG4vLyBeMS4yLjMgLS0+ID49MS4yLjMgPDIuMC4wLTBcbi8vIF4xLjIuMCAtLT4gPj0xLjIuMCA8Mi4wLjAtMFxuLy8gXjAuMC4xIC0tPiA+PTAuMC4xIDwwLjAuMi0wXG4vLyBeMC4xLjAgLS0+ID49MC4xLjAgPDAuMi4wLTBcbmNvbnN0IHJlcGxhY2VDYXJldHMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VDYXJldChjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VDYXJldCA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdjYXJldCcsIGNvbXAsIG9wdGlvbnMpXG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5DQVJFVExPT1NFXSA6IHJlW3QuQ0FSRVRdXG4gIGNvbnN0IHogPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gJy0wJyA6ICcnXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKF8sIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ2NhcmV0JywgY29tcCwgXywgTSwgbSwgcCwgcHIpXG4gICAgbGV0IHJldFxuXG4gICAgaWYgKGlzWChNKSkge1xuICAgICAgcmV0ID0gJydcbiAgICB9IGVsc2UgaWYgKGlzWChtKSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAke3p9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgfSBlbHNlIGlmIChpc1gocCkpIHtcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAke3p9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uMCR7en0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByKSB7XG4gICAgICBkZWJ1ZygncmVwbGFjZUNhcmV0IHByJywgcHIpXG4gICAgICBpZiAoTSA9PT0gJzAnKSB7XG4gICAgICAgIGlmIChtID09PSAnMCcpIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwfS0ke3ByXG4gICAgICAgICAgfSA8JHtNfS4ke219LiR7K3AgKyAxfS0wYFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Zygnbm8gcHInKVxuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICBpZiAobSA9PT0gJzAnKSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICAgIH0ke3p9IDwke019LiR7bX0uJHsrcCArIDF9LTBgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICAgIH0ke3p9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgICAgfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH1cblxuICAgIGRlYnVnKCdjYXJldCByZXR1cm4nLCByZXQpXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG5jb25zdCByZXBsYWNlWFJhbmdlcyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdyZXBsYWNlWFJhbmdlcycsIGNvbXAsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChjKSA9PiByZXBsYWNlWFJhbmdlKGMsIG9wdGlvbnMpKVxuICAgIC5qb2luKCcgJylcbn1cblxuY29uc3QgcmVwbGFjZVhSYW5nZSA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGNvbXAgPSBjb21wLnRyaW0oKVxuICBjb25zdCByID0gb3B0aW9ucy5sb29zZSA/IHJlW3QuWFJBTkdFTE9PU0VdIDogcmVbdC5YUkFOR0VdXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKHJldCwgZ3RsdCwgTSwgbSwgcCwgcHIpID0+IHtcbiAgICBkZWJ1ZygneFJhbmdlJywgY29tcCwgcmV0LCBndGx0LCBNLCBtLCBwLCBwcilcbiAgICBjb25zdCB4TSA9IGlzWChNKVxuICAgIGNvbnN0IHhtID0geE0gfHwgaXNYKG0pXG4gICAgY29uc3QgeHAgPSB4bSB8fCBpc1gocClcbiAgICBjb25zdCBhbnlYID0geHBcblxuICAgIGlmIChndGx0ID09PSAnPScgJiYgYW55WCkge1xuICAgICAgZ3RsdCA9ICcnXG4gICAgfVxuXG4gICAgLy8gaWYgd2UncmUgaW5jbHVkaW5nIHByZXJlbGVhc2VzIGluIHRoZSBtYXRjaCwgdGhlbiB3ZSBuZWVkXG4gICAgLy8gdG8gZml4IHRoaXMgdG8gLTAsIHRoZSBsb3dlc3QgcG9zc2libGUgcHJlcmVsZWFzZSB2YWx1ZVxuICAgIHByID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/ICctMCcgOiAnJ1xuXG4gICAgaWYgKHhNKSB7XG4gICAgICBpZiAoZ3RsdCA9PT0gJz4nIHx8IGd0bHQgPT09ICc8Jykge1xuICAgICAgICAvLyBub3RoaW5nIGlzIGFsbG93ZWRcbiAgICAgICAgcmV0ID0gJzwwLjAuMC0wJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm90aGluZyBpcyBmb3JiaWRkZW5cbiAgICAgICAgcmV0ID0gJyonXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChndGx0ICYmIGFueVgpIHtcbiAgICAgIC8vIHdlIGtub3cgcGF0Y2ggaXMgYW4geCwgYmVjYXVzZSB3ZSBoYXZlIGFueSB4IGF0IGFsbC5cbiAgICAgIC8vIHJlcGxhY2UgWCB3aXRoIDBcbiAgICAgIGlmICh4bSkge1xuICAgICAgICBtID0gMFxuICAgICAgfVxuICAgICAgcCA9IDBcblxuICAgICAgaWYgKGd0bHQgPT09ICc+Jykge1xuICAgICAgICAvLyA+MSA9PiA+PTIuMC4wXG4gICAgICAgIC8vID4xLjIgPT4gPj0xLjMuMFxuICAgICAgICBndGx0ID0gJz49J1xuICAgICAgICBpZiAoeG0pIHtcbiAgICAgICAgICBNID0gK00gKyAxXG4gICAgICAgICAgbSA9IDBcbiAgICAgICAgICBwID0gMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0gPSArbSArIDFcbiAgICAgICAgICBwID0gMFxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGd0bHQgPT09ICc8PScpIHtcbiAgICAgICAgLy8gPD0wLjcueCBpcyBhY3R1YWxseSA8MC44LjAsIHNpbmNlIGFueSAwLjcueCBzaG91bGRcbiAgICAgICAgLy8gcGFzcy4gIFNpbWlsYXJseSwgPD03LnggaXMgYWN0dWFsbHkgPDguMC4wLCBldGMuXG4gICAgICAgIGd0bHQgPSAnPCdcbiAgICAgICAgaWYgKHhtKSB7XG4gICAgICAgICAgTSA9ICtNICsgMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0gPSArbSArIDFcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZ3RsdCA9PT0gJzwnKSB7XG4gICAgICAgIHByID0gJy0wJ1xuICAgICAgfVxuXG4gICAgICByZXQgPSBgJHtndGx0ICsgTX0uJHttfS4ke3B9JHtwcn1gXG4gICAgfSBlbHNlIGlmICh4bSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAke3ByfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgIH0gZWxzZSBpZiAoeHApIHtcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wJHtwclxuICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH1cblxuICAgIGRlYnVnKCd4UmFuZ2UgcmV0dXJuJywgcmV0KVxuXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG4vLyBCZWNhdXNlICogaXMgQU5ELWVkIHdpdGggZXZlcnl0aGluZyBlbHNlIGluIHRoZSBjb21wYXJhdG9yLFxuLy8gYW5kICcnIG1lYW5zIFwiYW55IHZlcnNpb25cIiwganVzdCByZW1vdmUgdGhlICpzIGVudGlyZWx5LlxuY29uc3QgcmVwbGFjZVN0YXJzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ3JlcGxhY2VTdGFycycsIGNvbXAsIG9wdGlvbnMpXG4gIC8vIExvb3NlbmVzcyBpcyBpZ25vcmVkIGhlcmUuICBzdGFyIGlzIGFsd2F5cyBhcyBsb29zZSBhcyBpdCBnZXRzIVxuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAucmVwbGFjZShyZVt0LlNUQVJdLCAnJylcbn1cblxuY29uc3QgcmVwbGFjZUdURTAgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygncmVwbGFjZUdURTAnLCBjb21wLCBvcHRpb25zKVxuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAucmVwbGFjZShyZVtvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gdC5HVEUwUFJFIDogdC5HVEUwXSwgJycpXG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHN0cmluZy5yZXBsYWNlKHJlW3QuSFlQSEVOUkFOR0VdKVxuLy8gTSwgbSwgcGF0Y2gsIHByZXJlbGVhc2UsIGJ1aWxkXG4vLyAxLjIgLSAzLjQuNSA9PiA+PTEuMi4wIDw9My40LjVcbi8vIDEuMi4zIC0gMy40ID0+ID49MS4yLjAgPDMuNS4wLTAgQW55IDMuNC54IHdpbGwgZG9cbi8vIDEuMiAtIDMuNCA9PiA+PTEuMi4wIDwzLjUuMC0wXG4vLyBUT0RPIGJ1aWxkP1xuY29uc3QgaHlwaGVuUmVwbGFjZSA9IGluY1ByID0+ICgkMCxcbiAgZnJvbSwgZk0sIGZtLCBmcCwgZnByLCBmYixcbiAgdG8sIHRNLCB0bSwgdHAsIHRwcikgPT4ge1xuICBpZiAoaXNYKGZNKSkge1xuICAgIGZyb20gPSAnJ1xuICB9IGVsc2UgaWYgKGlzWChmbSkpIHtcbiAgICBmcm9tID0gYD49JHtmTX0uMC4wJHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH0gZWxzZSBpZiAoaXNYKGZwKSkge1xuICAgIGZyb20gPSBgPj0ke2ZNfS4ke2ZtfS4wJHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH0gZWxzZSBpZiAoZnByKSB7XG4gICAgZnJvbSA9IGA+PSR7ZnJvbX1gXG4gIH0gZWxzZSB7XG4gICAgZnJvbSA9IGA+PSR7ZnJvbX0ke2luY1ByID8gJy0wJyA6ICcnfWBcbiAgfVxuXG4gIGlmIChpc1godE0pKSB7XG4gICAgdG8gPSAnJ1xuICB9IGVsc2UgaWYgKGlzWCh0bSkpIHtcbiAgICB0byA9IGA8JHsrdE0gKyAxfS4wLjAtMGBcbiAgfSBlbHNlIGlmIChpc1godHApKSB7XG4gICAgdG8gPSBgPCR7dE19LiR7K3RtICsgMX0uMC0wYFxuICB9IGVsc2UgaWYgKHRwcikge1xuICAgIHRvID0gYDw9JHt0TX0uJHt0bX0uJHt0cH0tJHt0cHJ9YFxuICB9IGVsc2UgaWYgKGluY1ByKSB7XG4gICAgdG8gPSBgPCR7dE19LiR7dG19LiR7K3RwICsgMX0tMGBcbiAgfSBlbHNlIHtcbiAgICB0byA9IGA8PSR7dG99YFxuICB9XG5cbiAgcmV0dXJuIGAke2Zyb219ICR7dG99YC50cmltKClcbn1cblxuY29uc3QgdGVzdFNldCA9IChzZXQsIHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIXNldFtpXS50ZXN0KHZlcnNpb24pKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBpZiAodmVyc2lvbi5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgIC8vIEZpbmQgdGhlIHNldCBvZiB2ZXJzaW9ucyB0aGF0IGFyZSBhbGxvd2VkIHRvIGhhdmUgcHJlcmVsZWFzZXNcbiAgICAvLyBGb3IgZXhhbXBsZSwgXjEuMi4zLXByLjEgZGVzdWdhcnMgdG8gPj0xLjIuMy1wci4xIDwyLjAuMFxuICAgIC8vIFRoYXQgc2hvdWxkIGFsbG93IGAxLjIuMy1wci4yYCB0byBwYXNzLlxuICAgIC8vIEhvd2V2ZXIsIGAxLjIuNC1hbHBoYS5ub3RyZWFkeWAgc2hvdWxkIE5PVCBiZSBhbGxvd2VkLFxuICAgIC8vIGV2ZW4gdGhvdWdoIGl0J3Mgd2l0aGluIHRoZSByYW5nZSBzZXQgYnkgdGhlIGNvbXBhcmF0b3JzLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWJ1ZyhzZXRbaV0uc2VtdmVyKVxuICAgICAgaWYgKHNldFtpXS5zZW12ZXIgPT09IENvbXBhcmF0b3IuQU5ZKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChzZXRbaV0uc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBhbGxvd2VkID0gc2V0W2ldLnNlbXZlclxuICAgICAgICBpZiAoYWxsb3dlZC5tYWpvciA9PT0gdmVyc2lvbi5tYWpvciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5taW5vciA9PT0gdmVyc2lvbi5taW5vciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5wYXRjaCA9PT0gdmVyc2lvbi5wYXRjaCkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWZXJzaW9uIGhhcyBhIC1wcmUsIGJ1dCBpdCdzIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2UgbGlrZS5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBBTlkgPSBTeW1ib2woJ1NlbVZlciBBTlknKVxuLy8gaG9pc3RlZCBjbGFzcyBmb3IgY3ljbGljIGRlcGVuZGVuY3lcbmNsYXNzIENvbXBhcmF0b3Ige1xuICBzdGF0aWMgZ2V0IEFOWSAoKSB7XG4gICAgcmV0dXJuIEFOWVxuICB9XG5cbiAgY29uc3RydWN0b3IgKGNvbXAsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpXG5cbiAgICBpZiAoY29tcCBpbnN0YW5jZW9mIENvbXBhcmF0b3IpIHtcbiAgICAgIGlmIChjb21wLmxvb3NlID09PSAhIW9wdGlvbnMubG9vc2UpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXAgPSBjb21wLnZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcCA9IGNvbXAudHJpbSgpLnNwbGl0KC9cXHMrLykuam9pbignICcpXG4gICAgZGVidWcoJ2NvbXBhcmF0b3InLCBjb21wLCBvcHRpb25zKVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgdGhpcy5wYXJzZShjb21wKVxuXG4gICAgaWYgKHRoaXMuc2VtdmVyID09PSBBTlkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSAnJ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5vcGVyYXRvciArIHRoaXMuc2VtdmVyLnZlcnNpb25cbiAgICB9XG5cbiAgICBkZWJ1ZygnY29tcCcsIHRoaXMpXG4gIH1cblxuICBwYXJzZSAoY29tcCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLm9wdGlvbnMubG9vc2UgPyByZVt0LkNPTVBBUkFUT1JMT09TRV0gOiByZVt0LkNPTVBBUkFUT1JdXG4gICAgY29uc3QgbSA9IGNvbXAubWF0Y2gocilcblxuICAgIGlmICghbSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBjb21wYXJhdG9yOiAke2NvbXB9YClcbiAgICB9XG5cbiAgICB0aGlzLm9wZXJhdG9yID0gbVsxXSAhPT0gdW5kZWZpbmVkID8gbVsxXSA6ICcnXG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICc9Jykge1xuICAgICAgdGhpcy5vcGVyYXRvciA9ICcnXG4gICAgfVxuXG4gICAgLy8gaWYgaXQgbGl0ZXJhbGx5IGlzIGp1c3QgJz4nIG9yICcnIHRoZW4gYWxsb3cgYW55dGhpbmcuXG4gICAgaWYgKCFtWzJdKSB7XG4gICAgICB0aGlzLnNlbXZlciA9IEFOWVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbXZlciA9IG5ldyBTZW1WZXIobVsyXSwgdGhpcy5vcHRpb25zLmxvb3NlKVxuICAgIH1cbiAgfVxuXG4gIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZVxuICB9XG5cbiAgdGVzdCAodmVyc2lvbikge1xuICAgIGRlYnVnKCdDb21wYXJhdG9yLnRlc3QnLCB2ZXJzaW9uLCB0aGlzLm9wdGlvbnMubG9vc2UpXG5cbiAgICBpZiAodGhpcy5zZW12ZXIgPT09IEFOWSB8fCB2ZXJzaW9uID09PSBBTlkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgdGhpcy5vcHRpb25zKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNtcCh2ZXJzaW9uLCB0aGlzLm9wZXJhdG9yLCB0aGlzLnNlbXZlciwgdGhpcy5vcHRpb25zKVxuICB9XG5cbiAgaW50ZXJzZWN0cyAoY29tcCwgb3B0aW9ucykge1xuICAgIGlmICghKGNvbXAgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYSBDb21wYXJhdG9yIGlzIHJlcXVpcmVkJylcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJycpIHtcbiAgICAgIGlmICh0aGlzLnZhbHVlID09PSAnJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSYW5nZShjb21wLnZhbHVlLCBvcHRpb25zKS50ZXN0KHRoaXMudmFsdWUpXG4gICAgfSBlbHNlIGlmIChjb21wLm9wZXJhdG9yID09PSAnJykge1xuICAgICAgaWYgKGNvbXAudmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJhbmdlKHRoaXMudmFsdWUsIG9wdGlvbnMpLnRlc3QoY29tcC5zZW12ZXIpXG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgLy8gU3BlY2lhbCBjYXNlcyB3aGVyZSBub3RoaW5nIGNhbiBwb3NzaWJseSBiZSBsb3dlclxuICAgIGlmIChvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmXG4gICAgICAodGhpcy52YWx1ZSA9PT0gJzwwLjAuMC0wJyB8fCBjb21wLnZhbHVlID09PSAnPDAuMC4wLTAnKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgICAgKHRoaXMudmFsdWUuc3RhcnRzV2l0aCgnPDAuMC4wJykgfHwgY29tcC52YWx1ZS5zdGFydHNXaXRoKCc8MC4wLjAnKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIFNhbWUgZGlyZWN0aW9uIGluY3JlYXNpbmcgKD4gb3IgPj0pXG4gICAgaWYgKHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBTYW1lIGRpcmVjdGlvbiBkZWNyZWFzaW5nICg8IG9yIDw9KVxuICAgIGlmICh0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJzwnKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJzwnKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gc2FtZSBTZW1WZXIgYW5kIGJvdGggc2lkZXMgYXJlIGluY2x1c2l2ZSAoPD0gb3IgPj0pXG4gICAgaWYgKFxuICAgICAgKHRoaXMuc2VtdmVyLnZlcnNpb24gPT09IGNvbXAuc2VtdmVyLnZlcnNpb24pICYmXG4gICAgICB0aGlzLm9wZXJhdG9yLmluY2x1ZGVzKCc9JykgJiYgY29tcC5vcGVyYXRvci5pbmNsdWRlcygnPScpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBvcHBvc2l0ZSBkaXJlY3Rpb25zIGxlc3MgdGhhblxuICAgIGlmIChjbXAodGhpcy5zZW12ZXIsICc8JywgY29tcC5zZW12ZXIsIG9wdGlvbnMpICYmXG4gICAgICB0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJzwnKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gb3Bwb3NpdGUgZGlyZWN0aW9ucyBncmVhdGVyIHRoYW5cbiAgICBpZiAoY21wKHRoaXMuc2VtdmVyLCAnPicsIGNvbXAuc2VtdmVyLCBvcHRpb25zKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29tcGFyYXRvclxuXG5jb25zdCBwYXJzZU9wdGlvbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9wYXJzZS1vcHRpb25zJylcbmNvbnN0IHsgc2FmZVJlOiByZSwgdCB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuY29uc3QgY21wID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2NtcCcpXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi9yYW5nZScpXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3Qgc2F0aXNmaWVzID0gKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIHRyeSB7XG4gICAgcmFuZ2UgPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHJhbmdlLnRlc3QodmVyc2lvbilcbn1cbm1vZHVsZS5leHBvcnRzID0gc2F0aXNmaWVzXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuXG4vLyBNb3N0bHkganVzdCBmb3IgdGVzdGluZyBhbmQgbGVnYWN5IEFQSSByZWFzb25zXG5jb25zdCB0b0NvbXBhcmF0b3JzID0gKHJhbmdlLCBvcHRpb25zKSA9PlxuICBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpLnNldFxuICAgIC5tYXAoY29tcCA9PiBjb21wLm1hcChjID0+IGMudmFsdWUpLmpvaW4oJyAnKS50cmltKCkuc3BsaXQoJyAnKSlcblxubW9kdWxlLmV4cG9ydHMgPSB0b0NvbXBhcmF0b3JzXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuXG5jb25zdCBtYXhTYXRpc2Z5aW5nID0gKHZlcnNpb25zLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICBsZXQgbWF4ID0gbnVsbFxuICBsZXQgbWF4U1YgPSBudWxsXG4gIGxldCByYW5nZU9iaiA9IG51bGxcbiAgdHJ5IHtcbiAgICByYW5nZU9iaiA9IG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHZlcnNpb25zLmZvckVhY2goKHYpID0+IHtcbiAgICBpZiAocmFuZ2VPYmoudGVzdCh2KSkge1xuICAgICAgLy8gc2F0aXNmaWVzKHYsIHJhbmdlLCBvcHRpb25zKVxuICAgICAgaWYgKCFtYXggfHwgbWF4U1YuY29tcGFyZSh2KSA9PT0gLTEpIHtcbiAgICAgICAgLy8gY29tcGFyZShtYXgsIHYsIHRydWUpXG4gICAgICAgIG1heCA9IHZcbiAgICAgICAgbWF4U1YgPSBuZXcgU2VtVmVyKG1heCwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiBtYXhcbn1cbm1vZHVsZS5leHBvcnRzID0gbWF4U2F0aXNmeWluZ1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IG1pblNhdGlzZnlpbmcgPSAodmVyc2lvbnMsIHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIGxldCBtaW4gPSBudWxsXG4gIGxldCBtaW5TViA9IG51bGxcbiAgbGV0IHJhbmdlT2JqID0gbnVsbFxuICB0cnkge1xuICAgIHJhbmdlT2JqID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgdmVyc2lvbnMuZm9yRWFjaCgodikgPT4ge1xuICAgIGlmIChyYW5nZU9iai50ZXN0KHYpKSB7XG4gICAgICAvLyBzYXRpc2ZpZXModiwgcmFuZ2UsIG9wdGlvbnMpXG4gICAgICBpZiAoIW1pbiB8fCBtaW5TVi5jb21wYXJlKHYpID09PSAxKSB7XG4gICAgICAgIC8vIGNvbXBhcmUobWluLCB2LCB0cnVlKVxuICAgICAgICBtaW4gPSB2XG4gICAgICAgIG1pblNWID0gbmV3IFNlbVZlcihtaW4sIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gbWluXG59XG5tb2R1bGUuZXhwb3J0cyA9IG1pblNhdGlzZnlpbmdcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndCcpXG5cbmNvbnN0IG1pblZlcnNpb24gPSAocmFuZ2UsIGxvb3NlKSA9PiB7XG4gIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSlcblxuICBsZXQgbWludmVyID0gbmV3IFNlbVZlcignMC4wLjAnKVxuICBpZiAocmFuZ2UudGVzdChtaW52ZXIpKSB7XG4gICAgcmV0dXJuIG1pbnZlclxuICB9XG5cbiAgbWludmVyID0gbmV3IFNlbVZlcignMC4wLjAtMCcpXG4gIGlmIChyYW5nZS50ZXN0KG1pbnZlcikpIHtcbiAgICByZXR1cm4gbWludmVyXG4gIH1cblxuICBtaW52ZXIgPSBudWxsXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2Uuc2V0Lmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSByYW5nZS5zZXRbaV1cblxuICAgIGxldCBzZXRNaW4gPSBudWxsXG4gICAgY29tcGFyYXRvcnMuZm9yRWFjaCgoY29tcGFyYXRvcikgPT4ge1xuICAgICAgLy8gQ2xvbmUgdG8gYXZvaWQgbWFuaXB1bGF0aW5nIHRoZSBjb21wYXJhdG9yJ3Mgc2VtdmVyIG9iamVjdC5cbiAgICAgIGNvbnN0IGNvbXB2ZXIgPSBuZXcgU2VtVmVyKGNvbXBhcmF0b3Iuc2VtdmVyLnZlcnNpb24pXG4gICAgICBzd2l0Y2ggKGNvbXBhcmF0b3Iub3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgaWYgKGNvbXB2ZXIucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbXB2ZXIucGF0Y2grK1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21wdmVyLnByZXJlbGVhc2UucHVzaCgwKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb21wdmVyLnJhdyA9IGNvbXB2ZXIuZm9ybWF0KClcbiAgICAgICAgICAvKiBmYWxsdGhyb3VnaCAqL1xuICAgICAgICBjYXNlICcnOlxuICAgICAgICBjYXNlICc+PSc6XG4gICAgICAgICAgaWYgKCFzZXRNaW4gfHwgZ3QoY29tcHZlciwgc2V0TWluKSkge1xuICAgICAgICAgICAgc2V0TWluID0gY29tcHZlclxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgY2FzZSAnPD0nOlxuICAgICAgICAgIC8qIElnbm9yZSBtYXhpbXVtIHZlcnNpb25zICovXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgb3BlcmF0aW9uOiAke2NvbXBhcmF0b3Iub3BlcmF0b3J9YClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChzZXRNaW4gJiYgKCFtaW52ZXIgfHwgZ3QobWludmVyLCBzZXRNaW4pKSkge1xuICAgICAgbWludmVyID0gc2V0TWluXG4gICAgfVxuICB9XG5cbiAgaWYgKG1pbnZlciAmJiByYW5nZS50ZXN0KG1pbnZlcikpIHtcbiAgICByZXR1cm4gbWludmVyXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxubW9kdWxlLmV4cG9ydHMgPSBtaW5WZXJzaW9uXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgdmFsaWRSYW5nZSA9IChyYW5nZSwgb3B0aW9ucykgPT4ge1xuICB0cnkge1xuICAgIC8vIFJldHVybiAnKicgaW5zdGVhZCBvZiAnJyBzbyB0aGF0IHRydXRoaW5lc3Mgd29ya3MuXG4gICAgLy8gVGhpcyB3aWxsIHRocm93IGlmIGl0J3MgaW52YWxpZCBhbnl3YXlcbiAgICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKS5yYW5nZSB8fCAnKidcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHZhbGlkUmFuZ2VcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IENvbXBhcmF0b3IgPSByZXF1aXJlKCcuLi9jbGFzc2VzL2NvbXBhcmF0b3InKVxuY29uc3QgeyBBTlkgfSA9IENvbXBhcmF0b3JcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvc2F0aXNmaWVzJylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2d0JylcbmNvbnN0IGx0ID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2x0JylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9sdGUnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2d0ZScpXG5cbmNvbnN0IG91dHNpZGUgPSAodmVyc2lvbiwgcmFuZ2UsIGhpbG8sIG9wdGlvbnMpID0+IHtcbiAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgb3B0aW9ucylcbiAgcmFuZ2UgPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG5cbiAgbGV0IGd0Zm4sIGx0ZWZuLCBsdGZuLCBjb21wLCBlY29tcFxuICBzd2l0Y2ggKGhpbG8pIHtcbiAgICBjYXNlICc+JzpcbiAgICAgIGd0Zm4gPSBndFxuICAgICAgbHRlZm4gPSBsdGVcbiAgICAgIGx0Zm4gPSBsdFxuICAgICAgY29tcCA9ICc+J1xuICAgICAgZWNvbXAgPSAnPj0nXG4gICAgICBicmVha1xuICAgIGNhc2UgJzwnOlxuICAgICAgZ3RmbiA9IGx0XG4gICAgICBsdGVmbiA9IGd0ZVxuICAgICAgbHRmbiA9IGd0XG4gICAgICBjb21wID0gJzwnXG4gICAgICBlY29tcCA9ICc8PSdcbiAgICAgIGJyZWFrXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ011c3QgcHJvdmlkZSBhIGhpbG8gdmFsIG9mIFwiPFwiIG9yIFwiPlwiJylcbiAgfVxuXG4gIC8vIElmIGl0IHNhdGlzZmllcyB0aGUgcmFuZ2UgaXQgaXMgbm90IG91dHNpZGVcbiAgaWYgKHNhdGlzZmllcyh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIEZyb20gbm93IG9uLCB2YXJpYWJsZSB0ZXJtcyBhcmUgYXMgaWYgd2UncmUgaW4gXCJndHJcIiBtb2RlLlxuICAvLyBidXQgbm90ZSB0aGF0IGV2ZXJ5dGhpbmcgaXMgZmxpcHBlZCBmb3IgdGhlIFwibHRyXCIgZnVuY3Rpb24uXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZS5zZXQubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjb21wYXJhdG9ycyA9IHJhbmdlLnNldFtpXVxuXG4gICAgbGV0IGhpZ2ggPSBudWxsXG4gICAgbGV0IGxvdyA9IG51bGxcblxuICAgIGNvbXBhcmF0b3JzLmZvckVhY2goKGNvbXBhcmF0b3IpID0+IHtcbiAgICAgIGlmIChjb21wYXJhdG9yLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICAgIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcignPj0wLjAuMCcpXG4gICAgICB9XG4gICAgICBoaWdoID0gaGlnaCB8fCBjb21wYXJhdG9yXG4gICAgICBsb3cgPSBsb3cgfHwgY29tcGFyYXRvclxuICAgICAgaWYgKGd0Zm4oY29tcGFyYXRvci5zZW12ZXIsIGhpZ2guc2VtdmVyLCBvcHRpb25zKSkge1xuICAgICAgICBoaWdoID0gY29tcGFyYXRvclxuICAgICAgfSBlbHNlIGlmIChsdGZuKGNvbXBhcmF0b3Iuc2VtdmVyLCBsb3cuc2VtdmVyLCBvcHRpb25zKSkge1xuICAgICAgICBsb3cgPSBjb21wYXJhdG9yXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIElmIHRoZSBlZGdlIHZlcnNpb24gY29tcGFyYXRvciBoYXMgYSBvcGVyYXRvciB0aGVuIG91ciB2ZXJzaW9uXG4gICAgLy8gaXNuJ3Qgb3V0c2lkZSBpdFxuICAgIGlmIChoaWdoLm9wZXJhdG9yID09PSBjb21wIHx8IGhpZ2gub3BlcmF0b3IgPT09IGVjb21wKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbG93ZXN0IHZlcnNpb24gY29tcGFyYXRvciBoYXMgYW4gb3BlcmF0b3IgYW5kIG91ciB2ZXJzaW9uXG4gICAgLy8gaXMgbGVzcyB0aGFuIGl0IHRoZW4gaXQgaXNuJ3QgaGlnaGVyIHRoYW4gdGhlIHJhbmdlXG4gICAgaWYgKCghbG93Lm9wZXJhdG9yIHx8IGxvdy5vcGVyYXRvciA9PT0gY29tcCkgJiZcbiAgICAgICAgbHRlZm4odmVyc2lvbiwgbG93LnNlbXZlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSBpZiAobG93Lm9wZXJhdG9yID09PSBlY29tcCAmJiBsdGZuKHZlcnNpb24sIGxvdy5zZW12ZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdXRzaWRlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBEZXRlcm1pbmUgaWYgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gYWxsIHRoZSB2ZXJzaW9ucyBwb3NzaWJsZSBpbiB0aGUgcmFuZ2UuXG5jb25zdCBvdXRzaWRlID0gcmVxdWlyZSgnLi9vdXRzaWRlJylcbmNvbnN0IGd0ciA9ICh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykgPT4gb3V0c2lkZSh2ZXJzaW9uLCByYW5nZSwgJz4nLCBvcHRpb25zKVxubW9kdWxlLmV4cG9ydHMgPSBndHJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IG91dHNpZGUgPSByZXF1aXJlKCcuL291dHNpZGUnKVxuLy8gRGV0ZXJtaW5lIGlmIHZlcnNpb24gaXMgbGVzcyB0aGFuIGFsbCB0aGUgdmVyc2lvbnMgcG9zc2libGUgaW4gdGhlIHJhbmdlXG5jb25zdCBsdHIgPSAodmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IG91dHNpZGUodmVyc2lvbiwgcmFuZ2UsICc8Jywgb3B0aW9ucylcbm1vZHVsZS5leHBvcnRzID0gbHRyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgaW50ZXJzZWN0cyA9IChyMSwgcjIsIG9wdGlvbnMpID0+IHtcbiAgcjEgPSBuZXcgUmFuZ2UocjEsIG9wdGlvbnMpXG4gIHIyID0gbmV3IFJhbmdlKHIyLCBvcHRpb25zKVxuICByZXR1cm4gcjEuaW50ZXJzZWN0cyhyMiwgb3B0aW9ucylcbn1cbm1vZHVsZS5leHBvcnRzID0gaW50ZXJzZWN0c1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuLy8gZ2l2ZW4gYSBzZXQgb2YgdmVyc2lvbnMgYW5kIGEgcmFuZ2UsIGNyZWF0ZSBhIFwic2ltcGxpZmllZFwiIHJhbmdlXG4vLyB0aGF0IGluY2x1ZGVzIHRoZSBzYW1lIHZlcnNpb25zIHRoYXQgdGhlIG9yaWdpbmFsIHJhbmdlIGRvZXNcbi8vIElmIHRoZSBvcmlnaW5hbCByYW5nZSBpcyBzaG9ydGVyIHRoYW4gdGhlIHNpbXBsaWZpZWQgb25lLCByZXR1cm4gdGhhdC5cbmNvbnN0IHNhdGlzZmllcyA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9zYXRpc2ZpZXMuanMnKVxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9jb21wYXJlLmpzJylcbm1vZHVsZS5leHBvcnRzID0gKHZlcnNpb25zLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBzZXQgPSBbXVxuICBsZXQgZmlyc3QgPSBudWxsXG4gIGxldCBwcmV2ID0gbnVsbFxuICBjb25zdCB2ID0gdmVyc2lvbnMuc29ydCgoYSwgYikgPT4gY29tcGFyZShhLCBiLCBvcHRpb25zKSlcbiAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIHYpIHtcbiAgICBjb25zdCBpbmNsdWRlZCA9IHNhdGlzZmllcyh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucylcbiAgICBpZiAoaW5jbHVkZWQpIHtcbiAgICAgIHByZXYgPSB2ZXJzaW9uXG4gICAgICBpZiAoIWZpcnN0KSB7XG4gICAgICAgIGZpcnN0ID0gdmVyc2lvblxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJldikge1xuICAgICAgICBzZXQucHVzaChbZmlyc3QsIHByZXZdKVxuICAgICAgfVxuICAgICAgcHJldiA9IG51bGxcbiAgICAgIGZpcnN0ID0gbnVsbFxuICAgIH1cbiAgfVxuICBpZiAoZmlyc3QpIHtcbiAgICBzZXQucHVzaChbZmlyc3QsIG51bGxdKVxuICB9XG5cbiAgY29uc3QgcmFuZ2VzID0gW11cbiAgZm9yIChjb25zdCBbbWluLCBtYXhdIG9mIHNldCkge1xuICAgIGlmIChtaW4gPT09IG1heCkge1xuICAgICAgcmFuZ2VzLnB1c2gobWluKVxuICAgIH0gZWxzZSBpZiAoIW1heCAmJiBtaW4gPT09IHZbMF0pIHtcbiAgICAgIHJhbmdlcy5wdXNoKCcqJylcbiAgICB9IGVsc2UgaWYgKCFtYXgpIHtcbiAgICAgIHJhbmdlcy5wdXNoKGA+PSR7bWlufWApXG4gICAgfSBlbHNlIGlmIChtaW4gPT09IHZbMF0pIHtcbiAgICAgIHJhbmdlcy5wdXNoKGA8PSR7bWF4fWApXG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlcy5wdXNoKGAke21pbn0gLSAke21heH1gKVxuICAgIH1cbiAgfVxuICBjb25zdCBzaW1wbGlmaWVkID0gcmFuZ2VzLmpvaW4oJyB8fCAnKVxuICBjb25zdCBvcmlnaW5hbCA9IHR5cGVvZiByYW5nZS5yYXcgPT09ICdzdHJpbmcnID8gcmFuZ2UucmF3IDogU3RyaW5nKHJhbmdlKVxuICByZXR1cm4gc2ltcGxpZmllZC5sZW5ndGggPCBvcmlnaW5hbC5sZW5ndGggPyBzaW1wbGlmaWVkIDogcmFuZ2Vcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZS5qcycpXG5jb25zdCBDb21wYXJhdG9yID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9jb21wYXJhdG9yLmpzJylcbmNvbnN0IHsgQU5ZIH0gPSBDb21wYXJhdG9yXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvc2F0aXNmaWVzLmpzJylcbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvY29tcGFyZS5qcycpXG5cbi8vIENvbXBsZXggcmFuZ2UgYHIxIHx8IHIyIHx8IC4uLmAgaXMgYSBzdWJzZXQgb2YgYFIxIHx8IFIyIHx8IC4uLmAgaWZmOlxuLy8gLSBFdmVyeSBzaW1wbGUgcmFuZ2UgYHIxLCByMiwgLi4uYCBpcyBhIG51bGwgc2V0LCBPUlxuLy8gLSBFdmVyeSBzaW1wbGUgcmFuZ2UgYHIxLCByMiwgLi4uYCB3aGljaCBpcyBub3QgYSBudWxsIHNldCBpcyBhIHN1YnNldCBvZlxuLy8gICBzb21lIGBSMSwgUjIsIC4uLmBcbi8vXG4vLyBTaW1wbGUgcmFuZ2UgYGMxIGMyIC4uLmAgaXMgYSBzdWJzZXQgb2Ygc2ltcGxlIHJhbmdlIGBDMSBDMiAuLi5gIGlmZjpcbi8vIC0gSWYgYyBpcyBvbmx5IHRoZSBBTlkgY29tcGFyYXRvclxuLy8gICAtIElmIEMgaXMgb25seSB0aGUgQU5ZIGNvbXBhcmF0b3IsIHJldHVybiB0cnVlXG4vLyAgIC0gRWxzZSBpZiBpbiBwcmVyZWxlYXNlIG1vZGUsIHJldHVybiBmYWxzZVxuLy8gICAtIGVsc2UgcmVwbGFjZSBjIHdpdGggYFs+PTAuMC4wXWBcbi8vIC0gSWYgQyBpcyBvbmx5IHRoZSBBTlkgY29tcGFyYXRvclxuLy8gICAtIGlmIGluIHByZXJlbGVhc2UgbW9kZSwgcmV0dXJuIHRydWVcbi8vICAgLSBlbHNlIHJlcGxhY2UgQyB3aXRoIGBbPj0wLjAuMF1gXG4vLyAtIExldCBFUSBiZSB0aGUgc2V0IG9mID0gY29tcGFyYXRvcnMgaW4gY1xuLy8gLSBJZiBFUSBpcyBtb3JlIHRoYW4gb25lLCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAtIExldCBHVCBiZSB0aGUgaGlnaGVzdCA+IG9yID49IGNvbXBhcmF0b3IgaW4gY1xuLy8gLSBMZXQgTFQgYmUgdGhlIGxvd2VzdCA8IG9yIDw9IGNvbXBhcmF0b3IgaW4gY1xuLy8gLSBJZiBHVCBhbmQgTFQsIGFuZCBHVC5zZW12ZXIgPiBMVC5zZW12ZXIsIHJldHVybiB0cnVlIChudWxsIHNldClcbi8vIC0gSWYgYW55IEMgaXMgYSA9IHJhbmdlLCBhbmQgR1Qgb3IgTFQgYXJlIHNldCwgcmV0dXJuIGZhbHNlXG4vLyAtIElmIEVRXG4vLyAgIC0gSWYgR1QsIGFuZCBFUSBkb2VzIG5vdCBzYXRpc2Z5IEdULCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAgIC0gSWYgTFQsIGFuZCBFUSBkb2VzIG5vdCBzYXRpc2Z5IExULCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAgIC0gSWYgRVEgc2F0aXNmaWVzIGV2ZXJ5IEMsIHJldHVybiB0cnVlXG4vLyAgIC0gRWxzZSByZXR1cm4gZmFsc2Vcbi8vIC0gSWYgR1Rcbi8vICAgLSBJZiBHVC5zZW12ZXIgaXMgbG93ZXIgdGhhbiBhbnkgPiBvciA+PSBjb21wIGluIEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIEdUIGlzID49LCBhbmQgR1Quc2VtdmVyIGRvZXMgbm90IHNhdGlzZnkgZXZlcnkgQywgcmV0dXJuIGZhbHNlXG4vLyAgIC0gSWYgR1Quc2VtdmVyIGhhcyBhIHByZXJlbGVhc2UsIGFuZCBub3QgaW4gcHJlcmVsZWFzZSBtb2RlXG4vLyAgICAgLSBJZiBubyBDIGhhcyBhIHByZXJlbGVhc2UgYW5kIHRoZSBHVC5zZW12ZXIgdHVwbGUsIHJldHVybiBmYWxzZVxuLy8gLSBJZiBMVFxuLy8gICAtIElmIExULnNlbXZlciBpcyBncmVhdGVyIHRoYW4gYW55IDwgb3IgPD0gY29tcCBpbiBDLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBJZiBMVCBpcyA8PSwgYW5kIExULnNlbXZlciBkb2VzIG5vdCBzYXRpc2Z5IGV2ZXJ5IEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIEdULnNlbXZlciBoYXMgYSBwcmVyZWxlYXNlLCBhbmQgbm90IGluIHByZXJlbGVhc2UgbW9kZVxuLy8gICAgIC0gSWYgbm8gQyBoYXMgYSBwcmVyZWxlYXNlIGFuZCB0aGUgTFQuc2VtdmVyIHR1cGxlLCByZXR1cm4gZmFsc2Vcbi8vIC0gRWxzZSByZXR1cm4gdHJ1ZVxuXG5jb25zdCBzdWJzZXQgPSAoc3ViLCBkb20sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAoc3ViID09PSBkb20pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgc3ViID0gbmV3IFJhbmdlKHN1Yiwgb3B0aW9ucylcbiAgZG9tID0gbmV3IFJhbmdlKGRvbSwgb3B0aW9ucylcbiAgbGV0IHNhd05vbk51bGwgPSBmYWxzZVxuXG4gIE9VVEVSOiBmb3IgKGNvbnN0IHNpbXBsZVN1YiBvZiBzdWIuc2V0KSB7XG4gICAgZm9yIChjb25zdCBzaW1wbGVEb20gb2YgZG9tLnNldCkge1xuICAgICAgY29uc3QgaXNTdWIgPSBzaW1wbGVTdWJzZXQoc2ltcGxlU3ViLCBzaW1wbGVEb20sIG9wdGlvbnMpXG4gICAgICBzYXdOb25OdWxsID0gc2F3Tm9uTnVsbCB8fCBpc1N1YiAhPT0gbnVsbFxuICAgICAgaWYgKGlzU3ViKSB7XG4gICAgICAgIGNvbnRpbnVlIE9VVEVSXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHRoZSBudWxsIHNldCBpcyBhIHN1YnNldCBvZiBldmVyeXRoaW5nLCBidXQgbnVsbCBzaW1wbGUgcmFuZ2VzIGluXG4gICAgLy8gYSBjb21wbGV4IHJhbmdlIHNob3VsZCBiZSBpZ25vcmVkLiAgc28gaWYgd2Ugc2F3IGEgbm9uLW51bGwgcmFuZ2UsXG4gICAgLy8gdGhlbiB3ZSBrbm93IHRoaXMgaXNuJ3QgYSBzdWJzZXQsIGJ1dCBpZiBFVkVSWSBzaW1wbGUgcmFuZ2Ugd2FzIG51bGwsXG4gICAgLy8gdGhlbiBpdCBpcyBhIHN1YnNldC5cbiAgICBpZiAoc2F3Tm9uTnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbmNvbnN0IG1pbmltdW1WZXJzaW9uV2l0aFByZVJlbGVhc2UgPSBbbmV3IENvbXBhcmF0b3IoJz49MC4wLjAtMCcpXVxuY29uc3QgbWluaW11bVZlcnNpb24gPSBbbmV3IENvbXBhcmF0b3IoJz49MC4wLjAnKV1cblxuY29uc3Qgc2ltcGxlU3Vic2V0ID0gKHN1YiwgZG9tLCBvcHRpb25zKSA9PiB7XG4gIGlmIChzdWIgPT09IGRvbSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoc3ViLmxlbmd0aCA9PT0gMSAmJiBzdWJbMF0uc2VtdmVyID09PSBBTlkpIHtcbiAgICBpZiAoZG9tLmxlbmd0aCA9PT0gMSAmJiBkb21bMF0uc2VtdmVyID09PSBBTlkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICBzdWIgPSBtaW5pbXVtVmVyc2lvbldpdGhQcmVSZWxlYXNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHN1YiA9IG1pbmltdW1WZXJzaW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKGRvbS5sZW5ndGggPT09IDEgJiYgZG9tWzBdLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvbSA9IG1pbmltdW1WZXJzaW9uXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXFTZXQgPSBuZXcgU2V0KClcbiAgbGV0IGd0LCBsdFxuICBmb3IgKGNvbnN0IGMgb2Ygc3ViKSB7XG4gICAgaWYgKGMub3BlcmF0b3IgPT09ICc+JyB8fCBjLm9wZXJhdG9yID09PSAnPj0nKSB7XG4gICAgICBndCA9IGhpZ2hlckdUKGd0LCBjLCBvcHRpb25zKVxuICAgIH0gZWxzZSBpZiAoYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PScpIHtcbiAgICAgIGx0ID0gbG93ZXJMVChsdCwgYywgb3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgZXFTZXQuYWRkKGMuc2VtdmVyKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlcVNldC5zaXplID4gMSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBsZXQgZ3RsdENvbXBcbiAgaWYgKGd0ICYmIGx0KSB7XG4gICAgZ3RsdENvbXAgPSBjb21wYXJlKGd0LnNlbXZlciwgbHQuc2VtdmVyLCBvcHRpb25zKVxuICAgIGlmIChndGx0Q29tcCA+IDApIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfSBlbHNlIGlmIChndGx0Q29tcCA9PT0gMCAmJiAoZ3Qub3BlcmF0b3IgIT09ICc+PScgfHwgbHQub3BlcmF0b3IgIT09ICc8PScpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8vIHdpbGwgaXRlcmF0ZSBvbmUgb3IgemVybyB0aW1lc1xuICBmb3IgKGNvbnN0IGVxIG9mIGVxU2V0KSB7XG4gICAgaWYgKGd0ICYmICFzYXRpc2ZpZXMoZXEsIFN0cmluZyhndCksIG9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGlmIChsdCAmJiAhc2F0aXNmaWVzKGVxLCBTdHJpbmcobHQpLCBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGMgb2YgZG9tKSB7XG4gICAgICBpZiAoIXNhdGlzZmllcyhlcSwgU3RyaW5nKGMpLCBvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgbGV0IGhpZ2hlciwgbG93ZXJcbiAgbGV0IGhhc0RvbUxULCBoYXNEb21HVFxuICAvLyBpZiB0aGUgc3Vic2V0IGhhcyBhIHByZXJlbGVhc2UsIHdlIG5lZWQgYSBjb21wYXJhdG9yIGluIHRoZSBzdXBlcnNldFxuICAvLyB3aXRoIHRoZSBzYW1lIHR1cGxlIGFuZCBhIHByZXJlbGVhc2UsIG9yIGl0J3Mgbm90IGEgc3Vic2V0XG4gIGxldCBuZWVkRG9tTFRQcmUgPSBsdCAmJlxuICAgICFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmXG4gICAgbHQuc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID8gbHQuc2VtdmVyIDogZmFsc2VcbiAgbGV0IG5lZWREb21HVFByZSA9IGd0ICYmXG4gICAgIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICBndC5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggPyBndC5zZW12ZXIgOiBmYWxzZVxuICAvLyBleGNlcHRpb246IDwxLjIuMy0wIGlzIHRoZSBzYW1lIGFzIDwxLjIuM1xuICBpZiAobmVlZERvbUxUUHJlICYmIG5lZWREb21MVFByZS5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgbHQub3BlcmF0b3IgPT09ICc8JyAmJiBuZWVkRG9tTFRQcmUucHJlcmVsZWFzZVswXSA9PT0gMCkge1xuICAgIG5lZWREb21MVFByZSA9IGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IGMgb2YgZG9tKSB7XG4gICAgaGFzRG9tR1QgPSBoYXNEb21HVCB8fCBjLm9wZXJhdG9yID09PSAnPicgfHwgYy5vcGVyYXRvciA9PT0gJz49J1xuICAgIGhhc0RvbUxUID0gaGFzRG9tTFQgfHwgYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PSdcbiAgICBpZiAoZ3QpIHtcbiAgICAgIGlmIChuZWVkRG9tR1RQcmUpIHtcbiAgICAgICAgaWYgKGMuc2VtdmVyLnByZXJlbGVhc2UgJiYgYy5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1ham9yID09PSBuZWVkRG9tR1RQcmUubWFqb3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1pbm9yID09PSBuZWVkRG9tR1RQcmUubWlub3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLnBhdGNoID09PSBuZWVkRG9tR1RQcmUucGF0Y2gpIHtcbiAgICAgICAgICBuZWVkRG9tR1RQcmUgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYy5vcGVyYXRvciA9PT0gJz4nIHx8IGMub3BlcmF0b3IgPT09ICc+PScpIHtcbiAgICAgICAgaGlnaGVyID0gaGlnaGVyR1QoZ3QsIGMsIG9wdGlvbnMpXG4gICAgICAgIGlmIChoaWdoZXIgPT09IGMgJiYgaGlnaGVyICE9PSBndCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGd0Lm9wZXJhdG9yID09PSAnPj0nICYmICFzYXRpc2ZpZXMoZ3Quc2VtdmVyLCBTdHJpbmcoYyksIG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobHQpIHtcbiAgICAgIGlmIChuZWVkRG9tTFRQcmUpIHtcbiAgICAgICAgaWYgKGMuc2VtdmVyLnByZXJlbGVhc2UgJiYgYy5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1ham9yID09PSBuZWVkRG9tTFRQcmUubWFqb3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1pbm9yID09PSBuZWVkRG9tTFRQcmUubWlub3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLnBhdGNoID09PSBuZWVkRG9tTFRQcmUucGF0Y2gpIHtcbiAgICAgICAgICBuZWVkRG9tTFRQcmUgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PScpIHtcbiAgICAgICAgbG93ZXIgPSBsb3dlckxUKGx0LCBjLCBvcHRpb25zKVxuICAgICAgICBpZiAobG93ZXIgPT09IGMgJiYgbG93ZXIgIT09IGx0KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobHQub3BlcmF0b3IgPT09ICc8PScgJiYgIXNhdGlzZmllcyhsdC5zZW12ZXIsIFN0cmluZyhjKSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghYy5vcGVyYXRvciAmJiAobHQgfHwgZ3QpICYmIGd0bHRDb21wICE9PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGVyZSB3YXMgYSA8IG9yID4sIGFuZCBub3RoaW5nIGluIHRoZSBkb20sIHRoZW4gbXVzdCBiZSBmYWxzZVxuICAvLyBVTkxFU1MgaXQgd2FzIGxpbWl0ZWQgYnkgYW5vdGhlciByYW5nZSBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLlxuICAvLyBFZywgPjEuMC4wIDwxLjAuMSBpcyBzdGlsbCBhIHN1YnNldCBvZiA8Mi4wLjBcbiAgaWYgKGd0ICYmIGhhc0RvbUxUICYmICFsdCAmJiBndGx0Q29tcCAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKGx0ICYmIGhhc0RvbUdUICYmICFndCAmJiBndGx0Q29tcCAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gd2UgbmVlZGVkIGEgcHJlcmVsZWFzZSByYW5nZSBpbiBhIHNwZWNpZmljIHR1cGxlLCBidXQgZGlkbid0IGdldCBvbmVcbiAgLy8gdGhlbiB0aGlzIGlzbid0IGEgc3Vic2V0LiAgZWcgPj0xLjIuMy1wcmUgaXMgbm90IGEgc3Vic2V0IG9mID49MS4wLjAsXG4gIC8vIGJlY2F1c2UgaXQgaW5jbHVkZXMgcHJlcmVsZWFzZXMgaW4gdGhlIDEuMi4zIHR1cGxlXG4gIGlmIChuZWVkRG9tR1RQcmUgfHwgbmVlZERvbUxUUHJlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vLyA+PTEuMi4zIGlzIGxvd2VyIHRoYW4gPjEuMi4zXG5jb25zdCBoaWdoZXJHVCA9IChhLCBiLCBvcHRpb25zKSA9PiB7XG4gIGlmICghYSkge1xuICAgIHJldHVybiBiXG4gIH1cbiAgY29uc3QgY29tcCA9IGNvbXBhcmUoYS5zZW12ZXIsIGIuc2VtdmVyLCBvcHRpb25zKVxuICByZXR1cm4gY29tcCA+IDAgPyBhXG4gICAgOiBjb21wIDwgMCA/IGJcbiAgICA6IGIub3BlcmF0b3IgPT09ICc+JyAmJiBhLm9wZXJhdG9yID09PSAnPj0nID8gYlxuICAgIDogYVxufVxuXG4vLyA8PTEuMi4zIGlzIGhpZ2hlciB0aGFuIDwxLjIuM1xuY29uc3QgbG93ZXJMVCA9IChhLCBiLCBvcHRpb25zKSA9PiB7XG4gIGlmICghYSkge1xuICAgIHJldHVybiBiXG4gIH1cbiAgY29uc3QgY29tcCA9IGNvbXBhcmUoYS5zZW12ZXIsIGIuc2VtdmVyLCBvcHRpb25zKVxuICByZXR1cm4gY29tcCA8IDAgPyBhXG4gICAgOiBjb21wID4gMCA/IGJcbiAgICA6IGIub3BlcmF0b3IgPT09ICc8JyAmJiBhLm9wZXJhdG9yID09PSAnPD0nID8gYlxuICAgIDogYVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN1YnNldFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuLy8ganVzdCBwcmUtbG9hZCBhbGwgdGhlIHN0dWZmIHRoYXQgaW5kZXguanMgbGF6aWx5IGV4cG9ydHNcbmNvbnN0IGludGVybmFsUmUgPSByZXF1aXJlKCcuL2ludGVybmFsL3JlJylcbmNvbnN0IGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvY29uc3RhbnRzJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgaWRlbnRpZmllcnMgPSByZXF1aXJlKCcuL2ludGVybmFsL2lkZW50aWZpZXJzJylcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcGFyc2UnKVxuY29uc3QgdmFsaWQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy92YWxpZCcpXG5jb25zdCBjbGVhbiA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NsZWFuJylcbmNvbnN0IGluYyA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2luYycpXG5jb25zdCBkaWZmID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZGlmZicpXG5jb25zdCBtYWpvciA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL21ham9yJylcbmNvbnN0IG1pbm9yID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbWlub3InKVxuY29uc3QgcGF0Y2ggPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9wYXRjaCcpXG5jb25zdCBwcmVyZWxlYXNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcHJlcmVsZWFzZScpXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29tcGFyZScpXG5jb25zdCByY29tcGFyZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3Jjb21wYXJlJylcbmNvbnN0IGNvbXBhcmVMb29zZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvbXBhcmUtbG9vc2UnKVxuY29uc3QgY29tcGFyZUJ1aWxkID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29tcGFyZS1idWlsZCcpXG5jb25zdCBzb3J0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvc29ydCcpXG5jb25zdCByc29ydCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3Jzb3J0JylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZ3QnKVxuY29uc3QgbHQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9sdCcpXG5jb25zdCBlcSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2VxJylcbmNvbnN0IG5lcSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL25lcScpXG5jb25zdCBndGUgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9ndGUnKVxuY29uc3QgbHRlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbHRlJylcbmNvbnN0IGNtcCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NtcCcpXG5jb25zdCBjb2VyY2UgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jb2VyY2UnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9jb21wYXJhdG9yJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHNhdGlzZmllcyA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3NhdGlzZmllcycpXG5jb25zdCB0b0NvbXBhcmF0b3JzID0gcmVxdWlyZSgnLi9yYW5nZXMvdG8tY29tcGFyYXRvcnMnKVxuY29uc3QgbWF4U2F0aXNmeWluZyA9IHJlcXVpcmUoJy4vcmFuZ2VzL21heC1zYXRpc2Z5aW5nJylcbmNvbnN0IG1pblNhdGlzZnlpbmcgPSByZXF1aXJlKCcuL3Jhbmdlcy9taW4tc2F0aXNmeWluZycpXG5jb25zdCBtaW5WZXJzaW9uID0gcmVxdWlyZSgnLi9yYW5nZXMvbWluLXZlcnNpb24nKVxuY29uc3QgdmFsaWRSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2VzL3ZhbGlkJylcbmNvbnN0IG91dHNpZGUgPSByZXF1aXJlKCcuL3Jhbmdlcy9vdXRzaWRlJylcbmNvbnN0IGd0ciA9IHJlcXVpcmUoJy4vcmFuZ2VzL2d0cicpXG5jb25zdCBsdHIgPSByZXF1aXJlKCcuL3Jhbmdlcy9sdHInKVxuY29uc3QgaW50ZXJzZWN0cyA9IHJlcXVpcmUoJy4vcmFuZ2VzL2ludGVyc2VjdHMnKVxuY29uc3Qgc2ltcGxpZnlSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2VzL3NpbXBsaWZ5JylcbmNvbnN0IHN1YnNldCA9IHJlcXVpcmUoJy4vcmFuZ2VzL3N1YnNldCcpXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGFyc2UsXG4gIHZhbGlkLFxuICBjbGVhbixcbiAgaW5jLFxuICBkaWZmLFxuICBtYWpvcixcbiAgbWlub3IsXG4gIHBhdGNoLFxuICBwcmVyZWxlYXNlLFxuICBjb21wYXJlLFxuICByY29tcGFyZSxcbiAgY29tcGFyZUxvb3NlLFxuICBjb21wYXJlQnVpbGQsXG4gIHNvcnQsXG4gIHJzb3J0LFxuICBndCxcbiAgbHQsXG4gIGVxLFxuICBuZXEsXG4gIGd0ZSxcbiAgbHRlLFxuICBjbXAsXG4gIGNvZXJjZSxcbiAgQ29tcGFyYXRvcixcbiAgUmFuZ2UsXG4gIHNhdGlzZmllcyxcbiAgdG9Db21wYXJhdG9ycyxcbiAgbWF4U2F0aXNmeWluZyxcbiAgbWluU2F0aXNmeWluZyxcbiAgbWluVmVyc2lvbixcbiAgdmFsaWRSYW5nZSxcbiAgb3V0c2lkZSxcbiAgZ3RyLFxuICBsdHIsXG4gIGludGVyc2VjdHMsXG4gIHNpbXBsaWZ5UmFuZ2UsXG4gIHN1YnNldCxcbiAgU2VtVmVyLFxuICByZTogaW50ZXJuYWxSZS5yZSxcbiAgc3JjOiBpbnRlcm5hbFJlLnNyYyxcbiAgdG9rZW5zOiBpbnRlcm5hbFJlLnQsXG4gIFNFTVZFUl9TUEVDX1ZFUlNJT046IGNvbnN0YW50cy5TRU1WRVJfU1BFQ19WRVJTSU9OLFxuICBSRUxFQVNFX1RZUEVTOiBjb25zdGFudHMuUkVMRUFTRV9UWVBFUyxcbiAgY29tcGFyZUlkZW50aWZpZXJzOiBpZGVudGlmaWVycy5jb21wYXJlSWRlbnRpZmllcnMsXG4gIHJjb21wYXJlSWRlbnRpZmllcnM6IGlkZW50aWZpZXJzLnJjb21wYXJlSWRlbnRpZmllcnMsXG59XG4iLAogICAgImNvbnN0IHNlbXZlciA9IHJlcXVpcmUoJ3NlbXZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbXZlci5zYXRpc2ZpZXMocHJvY2Vzcy52ZXJzaW9uLCAnPj0xNS43LjAnKTtcbiIsCiAgICAiY29uc3Qgc2VtdmVyID0gcmVxdWlyZSgnc2VtdmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2VtdmVyLnNhdGlzZmllcyhwcm9jZXNzLnZlcnNpb24sICc+PTE2LjkuMCcpO1xuIiwKICAgICJjb25zdCBBU1lNTUVUUklDX0tFWV9ERVRBSUxTX1NVUFBPUlRFRCA9IHJlcXVpcmUoJy4vYXN5bW1ldHJpY0tleURldGFpbHNTdXBwb3J0ZWQnKTtcbmNvbnN0IFJTQV9QU1NfS0VZX0RFVEFJTFNfU1VQUE9SVEVEID0gcmVxdWlyZSgnLi9yc2FQc3NLZXlEZXRhaWxzU3VwcG9ydGVkJyk7XG5cbmNvbnN0IGFsbG93ZWRBbGdvcml0aG1zRm9yS2V5cyA9IHtcbiAgJ2VjJzogWydFUzI1NicsICdFUzM4NCcsICdFUzUxMiddLFxuICAncnNhJzogWydSUzI1NicsICdQUzI1NicsICdSUzM4NCcsICdQUzM4NCcsICdSUzUxMicsICdQUzUxMiddLFxuICAncnNhLXBzcyc6IFsnUFMyNTYnLCAnUFMzODQnLCAnUFM1MTInXVxufTtcblxuY29uc3QgYWxsb3dlZEN1cnZlcyA9IHtcbiAgRVMyNTY6ICdwcmltZTI1NnYxJyxcbiAgRVMzODQ6ICdzZWNwMzg0cjEnLFxuICBFUzUxMjogJ3NlY3A1MjFyMScsXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGFsZ29yaXRobSwga2V5KSB7XG4gIGlmICghYWxnb3JpdGhtIHx8ICFrZXkpIHJldHVybjtcblxuICBjb25zdCBrZXlUeXBlID0ga2V5LmFzeW1tZXRyaWNLZXlUeXBlO1xuICBpZiAoIWtleVR5cGUpIHJldHVybjtcblxuICBjb25zdCBhbGxvd2VkQWxnb3JpdGhtcyA9IGFsbG93ZWRBbGdvcml0aG1zRm9yS2V5c1trZXlUeXBlXTtcblxuICBpZiAoIWFsbG93ZWRBbGdvcml0aG1zKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGtleSB0eXBlIFwiJHtrZXlUeXBlfVwiLmApO1xuICB9XG5cbiAgaWYgKCFhbGxvd2VkQWxnb3JpdGhtcy5pbmNsdWRlcyhhbGdvcml0aG0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBcImFsZ1wiIHBhcmFtZXRlciBmb3IgXCIke2tleVR5cGV9XCIga2V5IHR5cGUgbXVzdCBiZSBvbmUgb2Y6ICR7YWxsb3dlZEFsZ29yaXRobXMuam9pbignLCAnKX0uYClcbiAgfVxuXG4gIC8qXG4gICAqIElnbm9yZSB0aGUgbmV4dCBibG9jayBmcm9tIHRlc3QgY292ZXJhZ2UgYmVjYXVzZSBpdCBnZXRzIGV4ZWN1dGVkXG4gICAqIGNvbmRpdGlvbmFsbHkgZGVwZW5kaW5nIG9uIHRoZSBOb2RlIHZlcnNpb24uIE5vdCBpZ25vcmluZyBpdCB3b3VsZFxuICAgKiBwcmV2ZW50IHVzIGZyb20gcmVhY2hpbmcgdGhlIHRhcmdldCAlIG9mIGNvdmVyYWdlIGZvciB2ZXJzaW9ucyBvZlxuICAgKiBOb2RlIHVuZGVyIDE1LjcuMC5cbiAgICovXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChBU1lNTUVUUklDX0tFWV9ERVRBSUxTX1NVUFBPUlRFRCkge1xuICAgIHN3aXRjaCAoa2V5VHlwZSkge1xuICAgIGNhc2UgJ2VjJzpcbiAgICAgIGNvbnN0IGtleUN1cnZlID0ga2V5LmFzeW1tZXRyaWNLZXlEZXRhaWxzLm5hbWVkQ3VydmU7XG4gICAgICBjb25zdCBhbGxvd2VkQ3VydmUgPSBhbGxvd2VkQ3VydmVzW2FsZ29yaXRobV07XG5cbiAgICAgIGlmIChrZXlDdXJ2ZSAhPT0gYWxsb3dlZEN1cnZlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJhbGdcIiBwYXJhbWV0ZXIgXCIke2FsZ29yaXRobX1cIiByZXF1aXJlcyBjdXJ2ZSBcIiR7YWxsb3dlZEN1cnZlfVwiLmApO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdyc2EtcHNzJzpcbiAgICAgIGlmIChSU0FfUFNTX0tFWV9ERVRBSUxTX1NVUFBPUlRFRCkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChhbGdvcml0aG0uc2xpY2UoLTMpLCAxMCk7XG4gICAgICAgIGNvbnN0IHsgaGFzaEFsZ29yaXRobSwgbWdmMUhhc2hBbGdvcml0aG0sIHNhbHRMZW5ndGggfSA9IGtleS5hc3ltbWV0cmljS2V5RGV0YWlscztcblxuICAgICAgICBpZiAoaGFzaEFsZ29yaXRobSAhPT0gYHNoYSR7bGVuZ3RofWAgfHwgbWdmMUhhc2hBbGdvcml0aG0gIT09IGhhc2hBbGdvcml0aG0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5IGZvciB0aGlzIG9wZXJhdGlvbiwgaXRzIFJTQS1QU1MgcGFyYW1ldGVycyBkbyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIG9mIFwiYWxnXCIgJHthbGdvcml0aG19LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNhbHRMZW5ndGggIT09IHVuZGVmaW5lZCAmJiBzYWx0TGVuZ3RoID4gbGVuZ3RoID4+IDMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5IGZvciB0aGlzIG9wZXJhdGlvbiwgaXRzIFJTQS1QU1MgcGFyYW1ldGVyIHNhbHRMZW5ndGggZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIG9mIFwiYWxnXCIgJHthbGdvcml0aG19LmApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuIiwKICAgICJ2YXIgc2VtdmVyID0gcmVxdWlyZSgnc2VtdmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2VtdmVyLnNhdGlzZmllcyhwcm9jZXNzLnZlcnNpb24sICdeNi4xMi4wIHx8ID49OC4wLjAnKTtcbiIsCiAgICAiY29uc3QgSnNvbldlYlRva2VuRXJyb3IgPSByZXF1aXJlKCcuL2xpYi9Kc29uV2ViVG9rZW5FcnJvcicpO1xuY29uc3QgTm90QmVmb3JlRXJyb3IgPSByZXF1aXJlKCcuL2xpYi9Ob3RCZWZvcmVFcnJvcicpO1xuY29uc3QgVG9rZW5FeHBpcmVkRXJyb3IgPSByZXF1aXJlKCcuL2xpYi9Ub2tlbkV4cGlyZWRFcnJvcicpO1xuY29uc3QgZGVjb2RlID0gcmVxdWlyZSgnLi9kZWNvZGUnKTtcbmNvbnN0IHRpbWVzcGFuID0gcmVxdWlyZSgnLi9saWIvdGltZXNwYW4nKTtcbmNvbnN0IHZhbGlkYXRlQXN5bW1ldHJpY0tleSA9IHJlcXVpcmUoJy4vbGliL3ZhbGlkYXRlQXN5bW1ldHJpY0tleScpO1xuY29uc3QgUFNfU1VQUE9SVEVEID0gcmVxdWlyZSgnLi9saWIvcHNTdXBwb3J0ZWQnKTtcbmNvbnN0IGp3cyA9IHJlcXVpcmUoJ2p3cycpO1xuY29uc3Qge0tleU9iamVjdCwgY3JlYXRlU2VjcmV0S2V5LCBjcmVhdGVQdWJsaWNLZXl9ID0gcmVxdWlyZShcImNyeXB0b1wiKTtcblxuY29uc3QgUFVCX0tFWV9BTEdTID0gWydSUzI1NicsICdSUzM4NCcsICdSUzUxMiddO1xuY29uc3QgRUNfS0VZX0FMR1MgPSBbJ0VTMjU2JywgJ0VTMzg0JywgJ0VTNTEyJ107XG5jb25zdCBSU0FfS0VZX0FMR1MgPSBbJ1JTMjU2JywgJ1JTMzg0JywgJ1JTNTEyJ107XG5jb25zdCBIU19BTEdTID0gWydIUzI1NicsICdIUzM4NCcsICdIUzUxMiddO1xuXG5pZiAoUFNfU1VQUE9SVEVEKSB7XG4gIFBVQl9LRVlfQUxHUy5zcGxpY2UoUFVCX0tFWV9BTEdTLmxlbmd0aCwgMCwgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJyk7XG4gIFJTQV9LRVlfQUxHUy5zcGxpY2UoUlNBX0tFWV9BTEdTLmxlbmd0aCwgMCwgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGp3dFN0cmluZywgc2VjcmV0T3JQdWJsaWNLZXksIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmICgodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpICYmICFjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICAvL2Nsb25lIHRoaXMgb2JqZWN0IHNpbmNlIHdlIGFyZSBnb2luZyB0byBtdXRhdGUgaXQuXG4gIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcblxuICBsZXQgZG9uZTtcblxuICBpZiAoY2FsbGJhY2spIHtcbiAgICBkb25lID0gY2FsbGJhY2s7XG4gIH0gZWxzZSB7XG4gICAgZG9uZSA9IGZ1bmN0aW9uKGVyciwgZGF0YSkge1xuICAgICAgaWYgKGVycikgdGhyb3cgZXJyO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmNsb2NrVGltZXN0YW1wICYmIHR5cGVvZiBvcHRpb25zLmNsb2NrVGltZXN0YW1wICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignY2xvY2tUaW1lc3RhbXAgbXVzdCBiZSBhIG51bWJlcicpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLm5vbmNlICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBvcHRpb25zLm5vbmNlICE9PSAnc3RyaW5nJyB8fCBvcHRpb25zLm5vbmNlLnRyaW0oKSA9PT0gJycpKSB7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdub25jZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlcyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdhbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXMgbXVzdCBiZSBhIGJvb2xlYW4nKSk7XG4gIH1cblxuICBjb25zdCBjbG9ja1RpbWVzdGFtcCA9IG9wdGlvbnMuY2xvY2tUaW1lc3RhbXAgfHwgTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbiAgaWYgKCFqd3RTdHJpbmcpe1xuICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IG11c3QgYmUgcHJvdmlkZWQnKSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGp3dFN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBtdXN0IGJlIGEgc3RyaW5nJykpO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBqd3RTdHJpbmcuc3BsaXQoJy4nKTtcblxuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKXtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBtYWxmb3JtZWQnKSk7XG4gIH1cblxuICBsZXQgZGVjb2RlZFRva2VuO1xuXG4gIHRyeSB7XG4gICAgZGVjb2RlZFRva2VuID0gZGVjb2RlKGp3dFN0cmluZywgeyBjb21wbGV0ZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaChlcnIpIHtcbiAgICByZXR1cm4gZG9uZShlcnIpO1xuICB9XG5cbiAgaWYgKCFkZWNvZGVkVG9rZW4pIHtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2ludmFsaWQgdG9rZW4nKSk7XG4gIH1cblxuICBjb25zdCBoZWFkZXIgPSBkZWNvZGVkVG9rZW4uaGVhZGVyO1xuICBsZXQgZ2V0U2VjcmV0O1xuXG4gIGlmKHR5cGVvZiBzZWNyZXRPclB1YmxpY0tleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmKCFjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCd2ZXJpZnkgbXVzdCBiZSBjYWxsZWQgYXN5bmNocm9ub3VzIGlmIHNlY3JldCBvciBwdWJsaWMga2V5IGlzIHByb3ZpZGVkIGFzIGEgY2FsbGJhY2snKSk7XG4gICAgfVxuXG4gICAgZ2V0U2VjcmV0ID0gc2VjcmV0T3JQdWJsaWNLZXk7XG4gIH1cbiAgZWxzZSB7XG4gICAgZ2V0U2VjcmV0ID0gZnVuY3Rpb24oaGVhZGVyLCBzZWNyZXRDYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHNlY3JldENhbGxiYWNrKG51bGwsIHNlY3JldE9yUHVibGljS2V5KTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGdldFNlY3JldChoZWFkZXIsIGZ1bmN0aW9uKGVyciwgc2VjcmV0T3JQdWJsaWNLZXkpIHtcbiAgICBpZihlcnIpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignZXJyb3IgaW4gc2VjcmV0IG9yIHB1YmxpYyBrZXkgY2FsbGJhY2s6ICcgKyBlcnIubWVzc2FnZSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc1NpZ25hdHVyZSA9IHBhcnRzWzJdLnRyaW0oKSAhPT0gJyc7XG5cbiAgICBpZiAoIWhhc1NpZ25hdHVyZSAmJiBzZWNyZXRPclB1YmxpY0tleSl7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBzaWduYXR1cmUgaXMgcmVxdWlyZWQnKSk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1NpZ25hdHVyZSAmJiAhc2VjcmV0T3JQdWJsaWNLZXkpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignc2VjcmV0IG9yIHB1YmxpYyBrZXkgbXVzdCBiZSBwcm92aWRlZCcpKTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc1NpZ25hdHVyZSAmJiAhb3B0aW9ucy5hbGdvcml0aG1zKSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ3BsZWFzZSBzcGVjaWZ5IFwibm9uZVwiIGluIFwiYWxnb3JpdGhtc1wiIHRvIHZlcmlmeSB1bnNpZ25lZCB0b2tlbnMnKSk7XG4gICAgfVxuXG4gICAgaWYgKHNlY3JldE9yUHVibGljS2V5ICE9IG51bGwgJiYgIShzZWNyZXRPclB1YmxpY0tleSBpbnN0YW5jZW9mIEtleU9iamVjdCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlY3JldE9yUHVibGljS2V5ID0gY3JlYXRlUHVibGljS2V5KHNlY3JldE9yUHVibGljS2V5KTtcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzZWNyZXRPclB1YmxpY0tleSA9IGNyZWF0ZVNlY3JldEtleSh0eXBlb2Ygc2VjcmV0T3JQdWJsaWNLZXkgPT09ICdzdHJpbmcnID8gQnVmZmVyLmZyb20oc2VjcmV0T3JQdWJsaWNLZXkpIDogc2VjcmV0T3JQdWJsaWNLZXkpO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdzZWNyZXRPclB1YmxpY0tleSBpcyBub3QgdmFsaWQga2V5IG1hdGVyaWFsJykpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuYWxnb3JpdGhtcykge1xuICAgICAgaWYgKHNlY3JldE9yUHVibGljS2V5LnR5cGUgPT09ICdzZWNyZXQnKSB7XG4gICAgICAgIG9wdGlvbnMuYWxnb3JpdGhtcyA9IEhTX0FMR1M7XG4gICAgICB9IGVsc2UgaWYgKFsncnNhJywgJ3JzYS1wc3MnXS5pbmNsdWRlcyhzZWNyZXRPclB1YmxpY0tleS5hc3ltbWV0cmljS2V5VHlwZSkpIHtcbiAgICAgICAgb3B0aW9ucy5hbGdvcml0aG1zID0gUlNBX0tFWV9BTEdTXG4gICAgICB9IGVsc2UgaWYgKHNlY3JldE9yUHVibGljS2V5LmFzeW1tZXRyaWNLZXlUeXBlID09PSAnZWMnKSB7XG4gICAgICAgIG9wdGlvbnMuYWxnb3JpdGhtcyA9IEVDX0tFWV9BTEdTXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zLmFsZ29yaXRobXMgPSBQVUJfS0VZX0FMR1NcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hbGdvcml0aG1zLmluZGV4T2YoZGVjb2RlZFRva2VuLmhlYWRlci5hbGcpID09PSAtMSkge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpbnZhbGlkIGFsZ29yaXRobScpKTtcbiAgICB9XG5cbiAgICBpZiAoaGVhZGVyLmFsZy5zdGFydHNXaXRoKCdIUycpICYmIHNlY3JldE9yUHVibGljS2V5LnR5cGUgIT09ICdzZWNyZXQnKSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoKGBzZWNyZXRPclB1YmxpY0tleSBtdXN0IGJlIGEgc3ltbWV0cmljIGtleSB3aGVuIHVzaW5nICR7aGVhZGVyLmFsZ31gKSkpXG4gICAgfSBlbHNlIGlmICgvXig/OlJTfFBTfEVTKS8udGVzdChoZWFkZXIuYWxnKSAmJiBzZWNyZXRPclB1YmxpY0tleS50eXBlICE9PSAncHVibGljJykge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKChgc2VjcmV0T3JQdWJsaWNLZXkgbXVzdCBiZSBhbiBhc3ltbWV0cmljIGtleSB3aGVuIHVzaW5nICR7aGVhZGVyLmFsZ31gKSkpXG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsaWRhdGVBc3ltbWV0cmljS2V5KGhlYWRlci5hbGcsIHNlY3JldE9yUHVibGljS2V5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHZhbGlkO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkID0gandzLnZlcmlmeShqd3RTdHJpbmcsIGRlY29kZWRUb2tlbi5oZWFkZXIuYWxnLCBzZWNyZXRPclB1YmxpY0tleSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgfVxuXG4gICAgaWYgKCF2YWxpZCkge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpbnZhbGlkIHNpZ25hdHVyZScpKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkID0gZGVjb2RlZFRva2VuLnBheWxvYWQ7XG5cbiAgICBpZiAodHlwZW9mIHBheWxvYWQubmJmICE9PSAndW5kZWZpbmVkJyAmJiAhb3B0aW9ucy5pZ25vcmVOb3RCZWZvcmUpIHtcbiAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC5uYmYgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignaW52YWxpZCBuYmYgdmFsdWUnKSk7XG4gICAgICB9XG4gICAgICBpZiAocGF5bG9hZC5uYmYgPiBjbG9ja1RpbWVzdGFtcCArIChvcHRpb25zLmNsb2NrVG9sZXJhbmNlIHx8IDApKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBOb3RCZWZvcmVFcnJvcignand0IG5vdCBhY3RpdmUnLCBuZXcgRGF0ZShwYXlsb2FkLm5iZiAqIDEwMDApKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkLmV4cCAhPT0gJ3VuZGVmaW5lZCcgJiYgIW9wdGlvbnMuaWdub3JlRXhwaXJhdGlvbikge1xuICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLmV4cCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpbnZhbGlkIGV4cCB2YWx1ZScpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9ja1RpbWVzdGFtcCA+PSBwYXlsb2FkLmV4cCArIChvcHRpb25zLmNsb2NrVG9sZXJhbmNlIHx8IDApKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBUb2tlbkV4cGlyZWRFcnJvcignand0IGV4cGlyZWQnLCBuZXcgRGF0ZShwYXlsb2FkLmV4cCAqIDEwMDApKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXVkaWVuY2UpIHtcbiAgICAgIGNvbnN0IGF1ZGllbmNlcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5hdWRpZW5jZSkgPyBvcHRpb25zLmF1ZGllbmNlIDogW29wdGlvbnMuYXVkaWVuY2VdO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gQXJyYXkuaXNBcnJheShwYXlsb2FkLmF1ZCkgPyBwYXlsb2FkLmF1ZCA6IFtwYXlsb2FkLmF1ZF07XG5cbiAgICAgIGNvbnN0IG1hdGNoID0gdGFyZ2V0LnNvbWUoZnVuY3Rpb24gKHRhcmdldEF1ZGllbmNlKSB7XG4gICAgICAgIHJldHVybiBhdWRpZW5jZXMuc29tZShmdW5jdGlvbiAoYXVkaWVuY2UpIHtcbiAgICAgICAgICByZXR1cm4gYXVkaWVuY2UgaW5zdGFuY2VvZiBSZWdFeHAgPyBhdWRpZW5jZS50ZXN0KHRhcmdldEF1ZGllbmNlKSA6IGF1ZGllbmNlID09PSB0YXJnZXRBdWRpZW5jZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBhdWRpZW5jZSBpbnZhbGlkLiBleHBlY3RlZDogJyArIGF1ZGllbmNlcy5qb2luKCcgb3IgJykpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pc3N1ZXIpIHtcbiAgICAgIGNvbnN0IGludmFsaWRfaXNzdWVyID1cbiAgICAgICAgICAgICAgKHR5cGVvZiBvcHRpb25zLmlzc3VlciA9PT0gJ3N0cmluZycgJiYgcGF5bG9hZC5pc3MgIT09IG9wdGlvbnMuaXNzdWVyKSB8fFxuICAgICAgICAgICAgICAoQXJyYXkuaXNBcnJheShvcHRpb25zLmlzc3VlcikgJiYgb3B0aW9ucy5pc3N1ZXIuaW5kZXhPZihwYXlsb2FkLmlzcykgPT09IC0xKTtcblxuICAgICAgaWYgKGludmFsaWRfaXNzdWVyKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IGlzc3VlciBpbnZhbGlkLiBleHBlY3RlZDogJyArIG9wdGlvbnMuaXNzdWVyKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc3ViamVjdCkge1xuICAgICAgaWYgKHBheWxvYWQuc3ViICE9PSBvcHRpb25zLnN1YmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3Qgc3ViamVjdCBpbnZhbGlkLiBleHBlY3RlZDogJyArIG9wdGlvbnMuc3ViamVjdCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmp3dGlkKSB7XG4gICAgICBpZiAocGF5bG9hZC5qdGkgIT09IG9wdGlvbnMuand0aWQpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3Qgand0aWQgaW52YWxpZC4gZXhwZWN0ZWQ6ICcgKyBvcHRpb25zLmp3dGlkKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubm9uY2UpIHtcbiAgICAgIGlmIChwYXlsb2FkLm5vbmNlICE9PSBvcHRpb25zLm5vbmNlKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IG5vbmNlIGludmFsaWQuIGV4cGVjdGVkOiAnICsgb3B0aW9ucy5ub25jZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1heEFnZSkge1xuICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLmlhdCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpYXQgcmVxdWlyZWQgd2hlbiBtYXhBZ2UgaXMgc3BlY2lmaWVkJykpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXhBZ2VUaW1lc3RhbXAgPSB0aW1lc3BhbihvcHRpb25zLm1heEFnZSwgcGF5bG9hZC5pYXQpO1xuICAgICAgaWYgKHR5cGVvZiBtYXhBZ2VUaW1lc3RhbXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignXCJtYXhBZ2VcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcyBvciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgdGltZXNwYW4gZWc6IFwiMWRcIiwgXCIyMGhcIiwgNjAnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY2xvY2tUaW1lc3RhbXAgPj0gbWF4QWdlVGltZXN0YW1wICsgKG9wdGlvbnMuY2xvY2tUb2xlcmFuY2UgfHwgMCkpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IFRva2VuRXhwaXJlZEVycm9yKCdtYXhBZ2UgZXhjZWVkZWQnLCBuZXcgRGF0ZShtYXhBZ2VUaW1lc3RhbXAgKiAxMDAwKSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmNvbXBsZXRlID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBkZWNvZGVkVG9rZW4uc2lnbmF0dXJlO1xuXG4gICAgICByZXR1cm4gZG9uZShudWxsLCB7XG4gICAgICAgIGhlYWRlcjogaGVhZGVyLFxuICAgICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgICBzaWduYXR1cmU6IHNpZ25hdHVyZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvbmUobnVsbCwgcGF5bG9hZCk7XG4gIH0pO1xufTtcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTEsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgaWYgKHZhbHVlICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG4gIH1cbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy52YWx1ZXNgIGFuZCBgXy52YWx1ZXNJbmAgd2hpY2ggY3JlYXRlcyBhblxuICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gKiBvZiBgcHJvcHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykge1xuICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICB9O1xufVxuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpLFxuICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgLy8gU2FmYXJpIDguMSBtYWtlcyBgYXJndW1lbnRzLmNhbGxlZWAgZW51bWVyYWJsZSBpbiBzdHJpY3QgbW9kZS5cbiAgLy8gU2FmYXJpIDkgbWFrZXMgYGFyZ3VtZW50cy5sZW5ndGhgIGVudW1lcmFibGUgaW4gc3RyaWN0IG1vZGUuXG4gIHZhciByZXN1bHQgPSAoaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKVxuICAgID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKVxuICAgIDogW107XG5cbiAgdmFyIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGgsXG4gICAgICBza2lwSW5kZXhlcyA9ICEhbGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKGtleSA9PSAnbGVuZ3RoJyB8fCBpc0luZGV4KGtleSwgbGVuZ3RoKSkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNgIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XG4gIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fCByZUlzVWludC50ZXN0KHZhbHVlKSkgJiZcbiAgICAodmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8IGxlbmd0aCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiBgY29sbGVjdGlvbmAuIElmIGBjb2xsZWN0aW9uYCBpcyBhIHN0cmluZywgaXQnc1xuICogY2hlY2tlZCBmb3IgYSBzdWJzdHJpbmcgb2YgYHZhbHVlYCwgb3RoZXJ3aXNlXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogaXMgdXNlZCBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXNcbiAqIHRoZSBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBjb2xsZWN0aW9uYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gIGNvbGxlY3Rpb24gPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24gOiB2YWx1ZXMoY29sbGVjdGlvbik7XG4gIGZyb21JbmRleCA9IChmcm9tSW5kZXggJiYgIWd1YXJkKSA/IHRvSW50ZWdlcihmcm9tSW5kZXgpIDogMDtcblxuICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgZnJvbUluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGZyb21JbmRleCwgMCk7XG4gIH1cbiAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pXG4gICAgPyAoZnJvbUluZGV4IDw9IGxlbmd0aCAmJiBjb2xsZWN0aW9uLmluZGV4T2YodmFsdWUsIGZyb21JbmRleCkgPiAtMSlcbiAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcbiAgLy8gU2FmYXJpIDguMSBtYWtlcyBgYXJndW1lbnRzLmNhbGxlZWAgZW51bWVyYWJsZSBpbiBzdHJpY3QgbW9kZS5cbiAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgJiZcbiAgICAoIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKSB8fCBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBhcmdzVGFnKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvclxuICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWBcbiAqIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOC05IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5IGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBpc09iamVjdCh2YWx1ZSkgPyBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3RyaW5nKDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9JbnRlZ2VyKDMuMik7XG4gKiAvLyA9PiAzXG4gKlxuICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiAwXG4gKlxuICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZVxuICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy5rZXlzKCdoaScpO1xuICogLy8gPT4gWycwJywgJzEnXVxuICovXG5mdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy52YWx1ZXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbMSwgMl0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiBfLnZhbHVlcygnaGknKTtcbiAqIC8vID0+IFsnaCcsICdpJ11cbiAqL1xuZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0ID8gYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSkgOiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbmNsdWRlcztcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggMy4wLjMgKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCAyMDEyLTIwMTYgVGhlIERvam8gRm91bmRhdGlvbiA8aHR0cDovL2Rvam9mb3VuZGF0aW9uLm9yZy8+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IDIwMDktMjAxNiBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICogQXZhaWxhYmxlIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqL1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYm9vbGVhbiBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQm9vbGVhbihmYWxzZSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Jvb2xlYW4obnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IGJvb2xUYWcpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNCb29sZWFuO1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMCxcbiAgICBNQVhfSU5URUdFUiA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4LFxuICAgIE5BTiA9IDAgLyAwO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAqIFtgTnVtYmVyLmlzSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc0ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0ludGVnZXIoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNJbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0ludGVnZXIoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09IHRvSW50ZWdlcih2YWx1ZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNJbnRlZ2VyO1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCAzLjAuMyAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IDIwMTItMjAxNiBUaGUgRG9qbyBGb3VuZGF0aW9uIDxodHRwOi8vZG9qb2ZvdW5kYXRpb24ub3JnLz5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgMjAwOS0yMDE2IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKiBBdmFpbGFibGUgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICovXG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTnVtYmVyYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqICoqTm90ZToqKiBUbyBleGNsdWRlIGBJbmZpbml0eWAsIGAtSW5maW5pdHlgLCBhbmQgYE5hTmAsIHdoaWNoIGFyZSBjbGFzc2lmaWVkXG4gKiBhcyBudW1iZXJzLCB1c2UgdGhlIGBfLmlzRmluaXRlYCBtZXRob2QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNOdW1iZXIoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTnVtYmVyKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gbnVtYmVyVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc051bWJlcjtcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0IGluIElFIDwgOS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSG9zdE9iamVjdCh2YWx1ZSkge1xuICAvLyBNYW55IGhvc3Qgb2JqZWN0cyBhcmUgYE9iamVjdGAgb2JqZWN0cyB0aGF0IGNhbiBjb2VyY2UgdG8gc3RyaW5nc1xuICAvLyBkZXNwaXRlIGhhdmluZyBpbXByb3Blcmx5IGRlZmluZWQgYHRvU3RyaW5nYCBtZXRob2RzLlxuICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9ICEhKHZhbHVlICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC44LjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqIH1cbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8XG4gICAgICBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSAhPSBvYmplY3RUYWcgfHwgaXNIb3N0T2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiZcbiAgICBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJiBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1BsYWluT2JqZWN0O1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCA0LjAuMSAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IDIwMTItMjAxNiBUaGUgRG9qbyBGb3VuZGF0aW9uIDxodHRwOi8vZG9qb2ZvdW5kYXRpb24ub3JnLz5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgMjAwOS0yMDE2IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKiBBdmFpbGFibGUgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICovXG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAdHlwZSBGdW5jdGlvblxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3RyaW5nKDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaW5nO1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzXG4gKiBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hpbGUgaXQncyBjYWxsZWQgbGVzcyB0aGFuIGBuYCB0aW1lcy4gU3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGF0IHdoaWNoIGBmdW5jYCBpcyBubyBsb25nZXIgaW52b2tlZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uYmVmb3JlKDUsIGFkZENvbnRhY3RUb0xpc3QpKTtcbiAqIC8vID0+IEFsbG93cyBhZGRpbmcgdXAgdG8gNCBjb250YWN0cyB0byB0aGUgbGlzdC5cbiAqL1xuZnVuY3Rpb24gYmVmb3JlKG4sIGZ1bmMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgbiA9IHRvSW50ZWdlcihuKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGlmICgtLW4gPiAwKSB7XG4gICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICAgIGlmIChuIDw9IDEpIHtcbiAgICAgIGZ1bmMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBpbnZva2luZyBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzXG4gKiB0byB0aGUgZnVuY3Rpb24gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbi4gVGhlIGBmdW5jYCBpc1xuICogaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgaW5pdGlhbGl6ZSA9IF8ub25jZShjcmVhdGVBcHBsaWNhdGlvbik7XG4gKiBpbml0aWFsaXplKCk7XG4gKiBpbml0aWFsaXplKCk7XG4gKiAvLyA9PiBgY3JlYXRlQXBwbGljYXRpb25gIGlzIGludm9rZWQgb25jZVxuICovXG5mdW5jdGlvbiBvbmNlKGZ1bmMpIHtcbiAgcmV0dXJuIGJlZm9yZSgyLCBmdW5jKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9JbnRlZ2VyKDMuMik7XG4gKiAvLyA9PiAzXG4gKlxuICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiAwXG4gKlxuICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvbmNlO1xuIiwKICAgICJjb25zdCB0aW1lc3BhbiA9IHJlcXVpcmUoJy4vbGliL3RpbWVzcGFuJyk7XG5jb25zdCBQU19TVVBQT1JURUQgPSByZXF1aXJlKCcuL2xpYi9wc1N1cHBvcnRlZCcpO1xuY29uc3QgdmFsaWRhdGVBc3ltbWV0cmljS2V5ID0gcmVxdWlyZSgnLi9saWIvdmFsaWRhdGVBc3ltbWV0cmljS2V5Jyk7XG5jb25zdCBqd3MgPSByZXF1aXJlKCdqd3MnKTtcbmNvbnN0IGluY2x1ZGVzID0gcmVxdWlyZSgnbG9kYXNoLmluY2x1ZGVzJyk7XG5jb25zdCBpc0Jvb2xlYW4gPSByZXF1aXJlKCdsb2Rhc2guaXNib29sZWFuJyk7XG5jb25zdCBpc0ludGVnZXIgPSByZXF1aXJlKCdsb2Rhc2guaXNpbnRlZ2VyJyk7XG5jb25zdCBpc051bWJlciA9IHJlcXVpcmUoJ2xvZGFzaC5pc251bWJlcicpO1xuY29uc3QgaXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJ2xvZGFzaC5pc3BsYWlub2JqZWN0Jyk7XG5jb25zdCBpc1N0cmluZyA9IHJlcXVpcmUoJ2xvZGFzaC5pc3N0cmluZycpO1xuY29uc3Qgb25jZSA9IHJlcXVpcmUoJ2xvZGFzaC5vbmNlJyk7XG5jb25zdCB7IEtleU9iamVjdCwgY3JlYXRlU2VjcmV0S2V5LCBjcmVhdGVQcml2YXRlS2V5IH0gPSByZXF1aXJlKCdjcnlwdG8nKVxuXG5jb25zdCBTVVBQT1JURURfQUxHUyA9IFsnUlMyNTYnLCAnUlMzODQnLCAnUlM1MTInLCAnRVMyNTYnLCAnRVMzODQnLCAnRVM1MTInLCAnSFMyNTYnLCAnSFMzODQnLCAnSFM1MTInLCAnbm9uZSddO1xuaWYgKFBTX1NVUFBPUlRFRCkge1xuICBTVVBQT1JURURfQUxHUy5zcGxpY2UoMywgMCwgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJyk7XG59XG5cbmNvbnN0IHNpZ25fb3B0aW9uc19zY2hlbWEgPSB7XG4gIGV4cGlyZXNJbjogeyBpc1ZhbGlkOiBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSB8fCAoaXNTdHJpbmcodmFsdWUpICYmIHZhbHVlKTsgfSwgbWVzc2FnZTogJ1wiZXhwaXJlc0luXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMgb3Igc3RyaW5nIHJlcHJlc2VudGluZyBhIHRpbWVzcGFuJyB9LFxuICBub3RCZWZvcmU6IHsgaXNWYWxpZDogZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIGlzSW50ZWdlcih2YWx1ZSkgfHwgKGlzU3RyaW5nKHZhbHVlKSAmJiB2YWx1ZSk7IH0sIG1lc3NhZ2U6ICdcIm5vdEJlZm9yZVwiIHNob3VsZCBiZSBhIG51bWJlciBvZiBzZWNvbmRzIG9yIHN0cmluZyByZXByZXNlbnRpbmcgYSB0aW1lc3BhbicgfSxcbiAgYXVkaWVuY2U6IHsgaXNWYWxpZDogZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIGlzU3RyaW5nKHZhbHVlKSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKTsgfSwgbWVzc2FnZTogJ1wiYXVkaWVuY2VcIiBtdXN0IGJlIGEgc3RyaW5nIG9yIGFycmF5JyB9LFxuICBhbGdvcml0aG06IHsgaXNWYWxpZDogaW5jbHVkZXMuYmluZChudWxsLCBTVVBQT1JURURfQUxHUyksIG1lc3NhZ2U6ICdcImFsZ29yaXRobVwiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW51bSB2YWx1ZScgfSxcbiAgaGVhZGVyOiB7IGlzVmFsaWQ6IGlzUGxhaW5PYmplY3QsIG1lc3NhZ2U6ICdcImhlYWRlclwiIG11c3QgYmUgYW4gb2JqZWN0JyB9LFxuICBlbmNvZGluZzogeyBpc1ZhbGlkOiBpc1N0cmluZywgbWVzc2FnZTogJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBpc3N1ZXI6IHsgaXNWYWxpZDogaXNTdHJpbmcsIG1lc3NhZ2U6ICdcImlzc3VlclwiIG11c3QgYmUgYSBzdHJpbmcnIH0sXG4gIHN1YmplY3Q6IHsgaXNWYWxpZDogaXNTdHJpbmcsIG1lc3NhZ2U6ICdcInN1YmplY3RcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBqd3RpZDogeyBpc1ZhbGlkOiBpc1N0cmluZywgbWVzc2FnZTogJ1wiand0aWRcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBub1RpbWVzdGFtcDogeyBpc1ZhbGlkOiBpc0Jvb2xlYW4sIG1lc3NhZ2U6ICdcIm5vVGltZXN0YW1wXCIgbXVzdCBiZSBhIGJvb2xlYW4nIH0sXG4gIGtleWlkOiB7IGlzVmFsaWQ6IGlzU3RyaW5nLCBtZXNzYWdlOiAnXCJrZXlpZFwiIG11c3QgYmUgYSBzdHJpbmcnIH0sXG4gIG11dGF0ZVBheWxvYWQ6IHsgaXNWYWxpZDogaXNCb29sZWFuLCBtZXNzYWdlOiAnXCJtdXRhdGVQYXlsb2FkXCIgbXVzdCBiZSBhIGJvb2xlYW4nIH0sXG4gIGFsbG93SW5zZWN1cmVLZXlTaXplczogeyBpc1ZhbGlkOiBpc0Jvb2xlYW4sIG1lc3NhZ2U6ICdcImFsbG93SW5zZWN1cmVLZXlTaXplc1wiIG11c3QgYmUgYSBib29sZWFuJ30sXG4gIGFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlczogeyBpc1ZhbGlkOiBpc0Jvb2xlYW4sIG1lc3NhZ2U6ICdcImFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlc1wiIG11c3QgYmUgYSBib29sZWFuJ31cbn07XG5cbmNvbnN0IHJlZ2lzdGVyZWRfY2xhaW1zX3NjaGVtYSA9IHtcbiAgaWF0OiB7IGlzVmFsaWQ6IGlzTnVtYmVyLCBtZXNzYWdlOiAnXCJpYXRcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcycgfSxcbiAgZXhwOiB7IGlzVmFsaWQ6IGlzTnVtYmVyLCBtZXNzYWdlOiAnXCJleHBcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcycgfSxcbiAgbmJmOiB7IGlzVmFsaWQ6IGlzTnVtYmVyLCBtZXNzYWdlOiAnXCJuYmZcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcycgfVxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGUoc2NoZW1hLCBhbGxvd1Vua25vd24sIG9iamVjdCwgcGFyYW1ldGVyTmFtZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3Qob2JqZWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgXCInICsgcGFyYW1ldGVyTmFtZSArICdcIiB0byBiZSBhIHBsYWluIG9iamVjdC4nKTtcbiAgfVxuICBPYmplY3Qua2V5cyhvYmplY3QpXG4gICAgLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSBzY2hlbWFba2V5XTtcbiAgICAgIGlmICghdmFsaWRhdG9yKSB7XG4gICAgICAgIGlmICghYWxsb3dVbmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBrZXkgKyAnXCIgaXMgbm90IGFsbG93ZWQgaW4gXCInICsgcGFyYW1ldGVyTmFtZSArICdcIicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghdmFsaWRhdG9yLmlzVmFsaWQob2JqZWN0W2tleV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih2YWxpZGF0b3IubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKSB7XG4gIHJldHVybiB2YWxpZGF0ZShzaWduX29wdGlvbnNfc2NoZW1hLCBmYWxzZSwgb3B0aW9ucywgJ29wdGlvbnMnKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQYXlsb2FkKHBheWxvYWQpIHtcbiAgcmV0dXJuIHZhbGlkYXRlKHJlZ2lzdGVyZWRfY2xhaW1zX3NjaGVtYSwgdHJ1ZSwgcGF5bG9hZCwgJ3BheWxvYWQnKTtcbn1cblxuY29uc3Qgb3B0aW9uc190b19wYXlsb2FkID0ge1xuICAnYXVkaWVuY2UnOiAnYXVkJyxcbiAgJ2lzc3Vlcic6ICdpc3MnLFxuICAnc3ViamVjdCc6ICdzdWInLFxuICAnand0aWQnOiAnanRpJ1xufTtcblxuY29uc3Qgb3B0aW9uc19mb3Jfb2JqZWN0cyA9IFtcbiAgJ2V4cGlyZXNJbicsXG4gICdub3RCZWZvcmUnLFxuICAnbm9UaW1lc3RhbXAnLFxuICAnYXVkaWVuY2UnLFxuICAnaXNzdWVyJyxcbiAgJ3N1YmplY3QnLFxuICAnand0aWQnLFxuXTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocGF5bG9hZCwgc2VjcmV0T3JQcml2YXRlS2V5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB9XG5cbiAgY29uc3QgaXNPYmplY3RQYXlsb2FkID0gdHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhQnVmZmVyLmlzQnVmZmVyKHBheWxvYWQpO1xuXG4gIGNvbnN0IGhlYWRlciA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGFsZzogb3B0aW9ucy5hbGdvcml0aG0gfHwgJ0hTMjU2JyxcbiAgICB0eXA6IGlzT2JqZWN0UGF5bG9hZCA/ICdKV1QnIDogdW5kZWZpbmVkLFxuICAgIGtpZDogb3B0aW9ucy5rZXlpZFxuICB9LCBvcHRpb25zLmhlYWRlcik7XG5cbiAgZnVuY3Rpb24gZmFpbHVyZShlcnIpIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBpZiAoIXNlY3JldE9yUHJpdmF0ZUtleSAmJiBvcHRpb25zLmFsZ29yaXRobSAhPT0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdzZWNyZXRPclByaXZhdGVLZXkgbXVzdCBoYXZlIGEgdmFsdWUnKSk7XG4gIH1cblxuICBpZiAoc2VjcmV0T3JQcml2YXRlS2V5ICE9IG51bGwgJiYgIShzZWNyZXRPclByaXZhdGVLZXkgaW5zdGFuY2VvZiBLZXlPYmplY3QpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHNlY3JldE9yUHJpdmF0ZUtleSA9IGNyZWF0ZVByaXZhdGVLZXkoc2VjcmV0T3JQcml2YXRlS2V5KVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlY3JldE9yUHJpdmF0ZUtleSA9IGNyZWF0ZVNlY3JldEtleSh0eXBlb2Ygc2VjcmV0T3JQcml2YXRlS2V5ID09PSAnc3RyaW5nJyA/IEJ1ZmZlci5mcm9tKHNlY3JldE9yUHJpdmF0ZUtleSkgOiBzZWNyZXRPclByaXZhdGVLZXkpXG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignc2VjcmV0T3JQcml2YXRlS2V5IGlzIG5vdCB2YWxpZCBrZXkgbWF0ZXJpYWwnKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGhlYWRlci5hbGcuc3RhcnRzV2l0aCgnSFMnKSAmJiBzZWNyZXRPclByaXZhdGVLZXkudHlwZSAhPT0gJ3NlY3JldCcpIHtcbiAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoKGBzZWNyZXRPclByaXZhdGVLZXkgbXVzdCBiZSBhIHN5bW1ldHJpYyBrZXkgd2hlbiB1c2luZyAke2hlYWRlci5hbGd9YCkpKVxuICB9IGVsc2UgaWYgKC9eKD86UlN8UFN8RVMpLy50ZXN0KGhlYWRlci5hbGcpKSB7XG4gICAgaWYgKHNlY3JldE9yUHJpdmF0ZUtleS50eXBlICE9PSAncHJpdmF0ZScpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcigoYHNlY3JldE9yUHJpdmF0ZUtleSBtdXN0IGJlIGFuIGFzeW1tZXRyaWMga2V5IHdoZW4gdXNpbmcgJHtoZWFkZXIuYWxnfWApKSlcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmFsbG93SW5zZWN1cmVLZXlTaXplcyAmJlxuICAgICAgIWhlYWRlci5hbGcuc3RhcnRzV2l0aCgnRVMnKSAmJlxuICAgICAgc2VjcmV0T3JQcml2YXRlS2V5LmFzeW1tZXRyaWNLZXlEZXRhaWxzICE9PSB1bmRlZmluZWQgJiYgLy9LZXlPYmplY3QuYXN5bW1ldHJpY0tleURldGFpbHMgaXMgc3VwcG9ydGVkIGluIE5vZGUgMTUrXG4gICAgICBzZWNyZXRPclByaXZhdGVLZXkuYXN5bW1ldHJpY0tleURldGFpbHMubW9kdWx1c0xlbmd0aCA8IDIwNDgpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcihgc2VjcmV0T3JQcml2YXRlS2V5IGhhcyBhIG1pbmltdW0ga2V5IHNpemUgb2YgMjA0OCBiaXRzIGZvciAke2hlYWRlci5hbGd9YCkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ3BheWxvYWQgaXMgcmVxdWlyZWQnKSk7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3RQYXlsb2FkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlUGF5bG9hZChwYXlsb2FkKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShlcnJvcik7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5tdXRhdGVQYXlsb2FkKSB7XG4gICAgICBwYXlsb2FkID0gT2JqZWN0LmFzc2lnbih7fSxwYXlsb2FkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaW52YWxpZF9vcHRpb25zID0gb3B0aW9uc19mb3Jfb2JqZWN0cy5maWx0ZXIoZnVuY3Rpb24gKG9wdCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvcHRpb25zW29wdF0gIT09ICd1bmRlZmluZWQnO1xuICAgIH0pO1xuXG4gICAgaWYgKGludmFsaWRfb3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ2ludmFsaWQgJyArIGludmFsaWRfb3B0aW9ucy5qb2luKCcsJykgKyAnIG9wdGlvbiBmb3IgJyArICh0eXBlb2YgcGF5bG9hZCApICsgJyBwYXlsb2FkJykpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF5bG9hZC5leHAgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmV4cGlyZXNJbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ0JhZCBcIm9wdGlvbnMuZXhwaXJlc0luXCIgb3B0aW9uIHRoZSBwYXlsb2FkIGFscmVhZHkgaGFzIGFuIFwiZXhwXCIgcHJvcGVydHkuJykpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwYXlsb2FkLm5iZiAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMubm90QmVmb3JlICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignQmFkIFwib3B0aW9ucy5ub3RCZWZvcmVcIiBvcHRpb24gdGhlIHBheWxvYWQgYWxyZWFkeSBoYXMgYW4gXCJuYmZcIiBwcm9wZXJ0eS4nKSk7XG4gIH1cblxuICB0cnkge1xuICAgIHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFpbHVyZShlcnJvcik7XG4gIH1cblxuICBpZiAoIW9wdGlvbnMuYWxsb3dJbnZhbGlkQXN5bW1ldHJpY0tleVR5cGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlQXN5bW1ldHJpY0tleShoZWFkZXIuYWxnLCBzZWNyZXRPclByaXZhdGVLZXkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdGltZXN0YW1wID0gcGF5bG9hZC5pYXQgfHwgTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbiAgaWYgKG9wdGlvbnMubm9UaW1lc3RhbXApIHtcbiAgICBkZWxldGUgcGF5bG9hZC5pYXQ7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3RQYXlsb2FkKSB7XG4gICAgcGF5bG9hZC5pYXQgPSB0aW1lc3RhbXA7XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMubm90QmVmb3JlICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRyeSB7XG4gICAgICBwYXlsb2FkLm5iZiA9IHRpbWVzcGFuKG9wdGlvbnMubm90QmVmb3JlLCB0aW1lc3RhbXApO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShlcnIpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBheWxvYWQubmJmID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdcIm5vdEJlZm9yZVwiIHNob3VsZCBiZSBhIG51bWJlciBvZiBzZWNvbmRzIG9yIHN0cmluZyByZXByZXNlbnRpbmcgYSB0aW1lc3BhbiBlZzogXCIxZFwiLCBcIjIwaFwiLCA2MCcpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMuZXhwaXJlc0luICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcpIHtcbiAgICB0cnkge1xuICAgICAgcGF5bG9hZC5leHAgPSB0aW1lc3BhbihvcHRpb25zLmV4cGlyZXNJbiwgdGltZXN0YW1wKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIGZhaWx1cmUoZXJyKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkLmV4cCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignXCJleHBpcmVzSW5cIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcyBvciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgdGltZXNwYW4gZWc6IFwiMWRcIiwgXCIyMGhcIiwgNjAnKSk7XG4gICAgfVxuICB9XG5cbiAgT2JqZWN0LmtleXMob3B0aW9uc190b19wYXlsb2FkKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBjb25zdCBjbGFpbSA9IG9wdGlvbnNfdG9fcGF5bG9hZFtrZXldO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uc1trZXldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkW2NsYWltXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdCYWQgXCJvcHRpb25zLicgKyBrZXkgKyAnXCIgb3B0aW9uLiBUaGUgcGF5bG9hZCBhbHJlYWR5IGhhcyBhbiBcIicgKyBjbGFpbSArICdcIiBwcm9wZXJ0eS4nKSk7XG4gICAgICB9XG4gICAgICBwYXlsb2FkW2NsYWltXSA9IG9wdGlvbnNba2V5XTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgJiYgb25jZShjYWxsYmFjayk7XG5cbiAgICBqd3MuY3JlYXRlU2lnbih7XG4gICAgICBoZWFkZXI6IGhlYWRlcixcbiAgICAgIHByaXZhdGVLZXk6IHNlY3JldE9yUHJpdmF0ZUtleSxcbiAgICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgICBlbmNvZGluZzogZW5jb2RpbmdcbiAgICB9KS5vbmNlKCdlcnJvcicsIGNhbGxiYWNrKVxuICAgICAgLm9uY2UoJ2RvbmUnLCBmdW5jdGlvbiAoc2lnbmF0dXJlKSB7XG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBpbiBmYXZvciBvZiB0aGUgbW9kdWx1cyBsZW5ndGggY2hlY2sgYmVmb3JlIHNpZ25pbmcgb25jZSBub2RlIDE1KyBpcyB0aGUgbWluaW11bSBzdXBwb3J0ZWQgdmVyc2lvblxuICAgICAgICBpZighb3B0aW9ucy5hbGxvd0luc2VjdXJlS2V5U2l6ZXMgJiYgL14oPzpSU3xQUykvLnRlc3QoaGVhZGVyLmFsZykgJiYgc2lnbmF0dXJlLmxlbmd0aCA8IDI1Nikge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYHNlY3JldE9yUHJpdmF0ZUtleSBoYXMgYSBtaW5pbXVtIGtleSBzaXplIG9mIDIwNDggYml0cyBmb3IgJHtoZWFkZXIuYWxnfWApKVxuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHNpZ25hdHVyZSk7XG4gICAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgc2lnbmF0dXJlID0gandzLnNpZ24oe2hlYWRlcjogaGVhZGVyLCBwYXlsb2FkOiBwYXlsb2FkLCBzZWNyZXQ6IHNlY3JldE9yUHJpdmF0ZUtleSwgZW5jb2Rpbmc6IGVuY29kaW5nfSk7XG4gICAgLy8gVE9ETzogUmVtb3ZlIGluIGZhdm9yIG9mIHRoZSBtb2R1bHVzIGxlbmd0aCBjaGVjayBiZWZvcmUgc2lnbmluZyBvbmNlIG5vZGUgMTUrIGlzIHRoZSBtaW5pbXVtIHN1cHBvcnRlZCB2ZXJzaW9uXG4gICAgaWYoIW9wdGlvbnMuYWxsb3dJbnNlY3VyZUtleVNpemVzICYmIC9eKD86UlN8UFMpLy50ZXN0KGhlYWRlci5hbGcpICYmIHNpZ25hdHVyZS5sZW5ndGggPCAyNTYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgc2VjcmV0T3JQcml2YXRlS2V5IGhhcyBhIG1pbmltdW0ga2V5IHNpemUgb2YgMjA0OCBiaXRzIGZvciAke2hlYWRlci5hbGd9YClcbiAgICB9XG4gICAgcmV0dXJuIHNpZ25hdHVyZVxuICB9XG59O1xuIiwKICAgICJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgZGVjb2RlOiByZXF1aXJlKCcuL2RlY29kZScpLFxuICB2ZXJpZnk6IHJlcXVpcmUoJy4vdmVyaWZ5JyksXG4gIHNpZ246IHJlcXVpcmUoJy4vc2lnbicpLFxuICBKc29uV2ViVG9rZW5FcnJvcjogcmVxdWlyZSgnLi9saWIvSnNvbldlYlRva2VuRXJyb3InKSxcbiAgTm90QmVmb3JlRXJyb3I6IHJlcXVpcmUoJy4vbGliL05vdEJlZm9yZUVycm9yJyksXG4gIFRva2VuRXhwaXJlZEVycm9yOiByZXF1aXJlKCcuL2xpYi9Ub2tlbkV4cGlyZWRFcnJvcicpLFxufTtcbiIsCiAgICAiKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIFV0aWxzXG4gIGZ1bmN0aW9uIGFzc2VydCAodmFsLCBtc2cpIHtcbiAgICBpZiAoIXZhbCkgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCAnQXNzZXJ0aW9uIGZhaWxlZCcpO1xuICB9XG5cbiAgLy8gQ291bGQgdXNlIGBpbmhlcml0c2AgbW9kdWxlLCBidXQgZG9uJ3Qgd2FudCB0byBtb3ZlIGZyb20gc2luZ2xlIGZpbGVcbiAgLy8gYXJjaGl0ZWN0dXJlIHlldC5cbiAgZnVuY3Rpb24gaW5oZXJpdHMgKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yO1xuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGU7XG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKTtcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7XG4gIH1cblxuICAvLyBCTlxuXG4gIGZ1bmN0aW9uIEJOIChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIGlmIChCTi5pc0JOKG51bWJlcikpIHtcbiAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuXG4gICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgdGhpcy53b3JkcyA9IG51bGw7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuXG4gICAgLy8gUmVkdWN0aW9uIGNvbnRleHRcbiAgICB0aGlzLnJlZCA9IG51bGw7XG5cbiAgICBpZiAobnVtYmVyICE9PSBudWxsKSB7XG4gICAgICBpZiAoYmFzZSA9PT0gJ2xlJyB8fCBiYXNlID09PSAnYmUnKSB7XG4gICAgICAgIGVuZGlhbiA9IGJhc2U7XG4gICAgICAgIGJhc2UgPSAxMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faW5pdChudW1iZXIgfHwgMCwgYmFzZSB8fCAxMCwgZW5kaWFuIHx8ICdiZScpO1xuICAgIH1cbiAgfVxuICBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEJOO1xuICB9IGVsc2Uge1xuICAgIGV4cG9ydHMuQk4gPSBCTjtcbiAgfVxuXG4gIEJOLkJOID0gQk47XG4gIEJOLndvcmRTaXplID0gMjY7XG5cbiAgdmFyIEJ1ZmZlcjtcbiAgdHJ5IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5CdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBCdWZmZXIgPSB3aW5kb3cuQnVmZmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gIH1cblxuICBCTi5pc0JOID0gZnVuY3Rpb24gaXNCTiAobnVtKSB7XG4gICAgaWYgKG51bSBpbnN0YW5jZW9mIEJOKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVtICE9PSBudWxsICYmIHR5cGVvZiBudW0gPT09ICdvYmplY3QnICYmXG4gICAgICBudW0uY29uc3RydWN0b3Iud29yZFNpemUgPT09IEJOLndvcmRTaXplICYmIEFycmF5LmlzQXJyYXkobnVtLndvcmRzKTtcbiAgfTtcblxuICBCTi5tYXggPSBmdW5jdGlvbiBtYXggKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKGxlZnQuY21wKHJpZ2h0KSA+IDApIHJldHVybiBsZWZ0O1xuICAgIHJldHVybiByaWdodDtcbiAgfTtcblxuICBCTi5taW4gPSBmdW5jdGlvbiBtaW4gKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKGxlZnQuY21wKHJpZ2h0KSA8IDApIHJldHVybiBsZWZ0O1xuICAgIHJldHVybiByaWdodDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0IChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIGlmICh0eXBlb2YgbnVtYmVyID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHRoaXMuX2luaXROdW1iZXIobnVtYmVyLCBiYXNlLCBlbmRpYW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbnVtYmVyID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuX2luaXRBcnJheShudW1iZXIsIGJhc2UsIGVuZGlhbik7XG4gICAgfVxuXG4gICAgaWYgKGJhc2UgPT09ICdoZXgnKSB7XG4gICAgICBiYXNlID0gMTY7XG4gICAgfVxuICAgIGFzc2VydChiYXNlID09PSAoYmFzZSB8IDApICYmIGJhc2UgPj0gMiAmJiBiYXNlIDw9IDM2KTtcblxuICAgIG51bWJlciA9IG51bWJlci50b1N0cmluZygpLnJlcGxhY2UoL1xccysvZywgJycpO1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgaWYgKG51bWJlclswXSA9PT0gJy0nKSB7XG4gICAgICBzdGFydCsrO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0IDwgbnVtYmVyLmxlbmd0aCkge1xuICAgICAgaWYgKGJhc2UgPT09IDE2KSB7XG4gICAgICAgIHRoaXMuX3BhcnNlSGV4KG51bWJlciwgc3RhcnQsIGVuZGlhbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9wYXJzZUJhc2UobnVtYmVyLCBiYXNlLCBzdGFydCk7XG4gICAgICAgIGlmIChlbmRpYW4gPT09ICdsZScpIHtcbiAgICAgICAgICB0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksIGJhc2UsIGVuZGlhbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0TnVtYmVyID0gZnVuY3Rpb24gX2luaXROdW1iZXIgKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgbnVtYmVyID0gLW51bWJlcjtcbiAgICB9XG4gICAgaWYgKG51bWJlciA8IDB4NDAwMDAwMCkge1xuICAgICAgdGhpcy53b3JkcyA9IFsgbnVtYmVyICYgMHgzZmZmZmZmIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgfSBlbHNlIGlmIChudW1iZXIgPCAweDEwMDAwMDAwMDAwMDAwKSB7XG4gICAgICB0aGlzLndvcmRzID0gW1xuICAgICAgICBudW1iZXIgJiAweDNmZmZmZmYsXG4gICAgICAgIChudW1iZXIgLyAweDQwMDAwMDApICYgMHgzZmZmZmZmXG4gICAgICBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQobnVtYmVyIDwgMHgyMDAwMDAwMDAwMDAwMCk7IC8vIDIgXiA1MyAodW5zYWZlKVxuICAgICAgdGhpcy53b3JkcyA9IFtcbiAgICAgICAgbnVtYmVyICYgMHgzZmZmZmZmLFxuICAgICAgICAobnVtYmVyIC8gMHg0MDAwMDAwKSAmIDB4M2ZmZmZmZixcbiAgICAgICAgMVxuICAgICAgXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMztcbiAgICB9XG5cbiAgICBpZiAoZW5kaWFuICE9PSAnbGUnKSByZXR1cm47XG5cbiAgICAvLyBSZXZlcnNlIHRoZSBieXRlc1xuICAgIHRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSwgYmFzZSwgZW5kaWFuKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2luaXRBcnJheSA9IGZ1bmN0aW9uIF9pbml0QXJyYXkgKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgLy8gUGVyaGFwcyBhIFVpbnQ4QXJyYXlcbiAgICBhc3NlcnQodHlwZW9mIG51bWJlci5sZW5ndGggPT09ICdudW1iZXInKTtcbiAgICBpZiAobnVtYmVyLmxlbmd0aCA8PSAwKSB7XG4gICAgICB0aGlzLndvcmRzID0gWyAwIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbChudW1iZXIubGVuZ3RoIC8gMyk7XG4gICAgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gMDtcbiAgICB9XG5cbiAgICB2YXIgaiwgdztcbiAgICB2YXIgb2ZmID0gMDtcbiAgICBpZiAoZW5kaWFuID09PSAnYmUnKSB7XG4gICAgICBmb3IgKGkgPSBudW1iZXIubGVuZ3RoIC0gMSwgaiA9IDA7IGkgPj0gMDsgaSAtPSAzKSB7XG4gICAgICAgIHcgPSBudW1iZXJbaV0gfCAobnVtYmVyW2kgLSAxXSA8PCA4KSB8IChudW1iZXJbaSAtIDJdIDw8IDE2KTtcbiAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSAodyA8PCBvZmYpICYgMHgzZmZmZmZmO1xuICAgICAgICB0aGlzLndvcmRzW2ogKyAxXSA9ICh3ID4+PiAoMjYgLSBvZmYpKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgb2ZmICs9IDI0O1xuICAgICAgICBpZiAob2ZmID49IDI2KSB7XG4gICAgICAgICAgb2ZmIC09IDI2O1xuICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5kaWFuID09PSAnbGUnKSB7XG4gICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IG51bWJlci5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICB3ID0gbnVtYmVyW2ldIHwgKG51bWJlcltpICsgMV0gPDwgOCkgfCAobnVtYmVyW2kgKyAyXSA8PCAxNik7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gKHcgPDwgb2ZmKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgdGhpcy53b3Jkc1tqICsgMV0gPSAodyA+Pj4gKDI2IC0gb2ZmKSkgJiAweDNmZmZmZmY7XG4gICAgICAgIG9mZiArPSAyNDtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBmdW5jdGlvbiBwYXJzZUhleDRCaXRzIChzdHJpbmcsIGluZGV4KSB7XG4gICAgdmFyIGMgPSBzdHJpbmcuY2hhckNvZGVBdChpbmRleCk7XG4gICAgLy8gJ0EnIC0gJ0YnXG4gICAgaWYgKGMgPj0gNjUgJiYgYyA8PSA3MCkge1xuICAgICAgcmV0dXJuIGMgLSA1NTtcbiAgICAvLyAnYScgLSAnZidcbiAgICB9IGVsc2UgaWYgKGMgPj0gOTcgJiYgYyA8PSAxMDIpIHtcbiAgICAgIHJldHVybiBjIC0gODc7XG4gICAgLy8gJzAnIC0gJzknXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoYyAtIDQ4KSAmIDB4ZjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUhleEJ5dGUgKHN0cmluZywgbG93ZXJCb3VuZCwgaW5kZXgpIHtcbiAgICB2YXIgciA9IHBhcnNlSGV4NEJpdHMoc3RyaW5nLCBpbmRleCk7XG4gICAgaWYgKGluZGV4IC0gMSA+PSBsb3dlckJvdW5kKSB7XG4gICAgICByIHw9IHBhcnNlSGV4NEJpdHMoc3RyaW5nLCBpbmRleCAtIDEpIDw8IDQ7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl9wYXJzZUhleCA9IGZ1bmN0aW9uIF9wYXJzZUhleCAobnVtYmVyLCBzdGFydCwgZW5kaWFuKSB7XG4gICAgLy8gQ3JlYXRlIHBvc3NpYmx5IGJpZ2dlciBhcnJheSB0byBlbnN1cmUgdGhhdCBpdCBmaXRzIHRoZSBudW1iZXJcbiAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbCgobnVtYmVyLmxlbmd0aCAtIHN0YXJ0KSAvIDYpO1xuICAgIHRoaXMud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IDA7XG4gICAgfVxuXG4gICAgLy8gMjQtYml0cyBjaHVua3NcbiAgICB2YXIgb2ZmID0gMDtcbiAgICB2YXIgaiA9IDA7XG5cbiAgICB2YXIgdztcbiAgICBpZiAoZW5kaWFuID09PSAnYmUnKSB7XG4gICAgICBmb3IgKGkgPSBudW1iZXIubGVuZ3RoIC0gMTsgaSA+PSBzdGFydDsgaSAtPSAyKSB7XG4gICAgICAgIHcgPSBwYXJzZUhleEJ5dGUobnVtYmVyLCBzdGFydCwgaSkgPDwgb2ZmO1xuICAgICAgICB0aGlzLndvcmRzW2pdIHw9IHcgJiAweDNmZmZmZmY7XG4gICAgICAgIGlmIChvZmYgPj0gMTgpIHtcbiAgICAgICAgICBvZmYgLT0gMTg7XG4gICAgICAgICAgaiArPSAxO1xuICAgICAgICAgIHRoaXMud29yZHNbal0gfD0gdyA+Pj4gMjY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2ZmICs9IDg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHBhcnNlTGVuZ3RoID0gbnVtYmVyLmxlbmd0aCAtIHN0YXJ0O1xuICAgICAgZm9yIChpID0gcGFyc2VMZW5ndGggJSAyID09PSAwID8gc3RhcnQgKyAxIDogc3RhcnQ7IGkgPCBudW1iZXIubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgdyA9IHBhcnNlSGV4Qnl0ZShudW1iZXIsIHN0YXJ0LCBpKSA8PCBvZmY7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gdyAmIDB4M2ZmZmZmZjtcbiAgICAgICAgaWYgKG9mZiA+PSAxOCkge1xuICAgICAgICAgIG9mZiAtPSAxODtcbiAgICAgICAgICBqICs9IDE7XG4gICAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSB3ID4+PiAyNjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmYgKz0gODtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBmdW5jdGlvbiBwYXJzZUJhc2UgKHN0ciwgc3RhcnQsIGVuZCwgbXVsKSB7XG4gICAgdmFyIHIgPSAwO1xuICAgIHZhciBsZW4gPSBNYXRoLm1pbihzdHIubGVuZ3RoLCBlbmQpO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgYyA9IHN0ci5jaGFyQ29kZUF0KGkpIC0gNDg7XG5cbiAgICAgIHIgKj0gbXVsO1xuXG4gICAgICAvLyAnYSdcbiAgICAgIGlmIChjID49IDQ5KSB7XG4gICAgICAgIHIgKz0gYyAtIDQ5ICsgMHhhO1xuXG4gICAgICAvLyAnQSdcbiAgICAgIH0gZWxzZSBpZiAoYyA+PSAxNykge1xuICAgICAgICByICs9IGMgLSAxNyArIDB4YTtcblxuICAgICAgLy8gJzAnIC0gJzknXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByICs9IGM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl9wYXJzZUJhc2UgPSBmdW5jdGlvbiBfcGFyc2VCYXNlIChudW1iZXIsIGJhc2UsIHN0YXJ0KSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBhcyB6ZXJvXG4gICAgdGhpcy53b3JkcyA9IFsgMCBdO1xuICAgIHRoaXMubGVuZ3RoID0gMTtcblxuICAgIC8vIEZpbmQgbGVuZ3RoIG9mIGxpbWIgaW4gYmFzZVxuICAgIGZvciAodmFyIGxpbWJMZW4gPSAwLCBsaW1iUG93ID0gMTsgbGltYlBvdyA8PSAweDNmZmZmZmY7IGxpbWJQb3cgKj0gYmFzZSkge1xuICAgICAgbGltYkxlbisrO1xuICAgIH1cbiAgICBsaW1iTGVuLS07XG4gICAgbGltYlBvdyA9IChsaW1iUG93IC8gYmFzZSkgfCAwO1xuXG4gICAgdmFyIHRvdGFsID0gbnVtYmVyLmxlbmd0aCAtIHN0YXJ0O1xuICAgIHZhciBtb2QgPSB0b3RhbCAlIGxpbWJMZW47XG4gICAgdmFyIGVuZCA9IE1hdGgubWluKHRvdGFsLCB0b3RhbCAtIG1vZCkgKyBzdGFydDtcblxuICAgIHZhciB3b3JkID0gMDtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gbGltYkxlbikge1xuICAgICAgd29yZCA9IHBhcnNlQmFzZShudW1iZXIsIGksIGkgKyBsaW1iTGVuLCBiYXNlKTtcblxuICAgICAgdGhpcy5pbXVsbihsaW1iUG93KTtcbiAgICAgIGlmICh0aGlzLndvcmRzWzBdICsgd29yZCA8IDB4NDAwMDAwMCkge1xuICAgICAgICB0aGlzLndvcmRzWzBdICs9IHdvcmQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pYWRkbih3b3JkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9kICE9PSAwKSB7XG4gICAgICB2YXIgcG93ID0gMTtcbiAgICAgIHdvcmQgPSBwYXJzZUJhc2UobnVtYmVyLCBpLCBudW1iZXIubGVuZ3RoLCBiYXNlKTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IG1vZDsgaSsrKSB7XG4gICAgICAgIHBvdyAqPSBiYXNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmltdWxuKHBvdyk7XG4gICAgICBpZiAodGhpcy53b3Jkc1swXSArIHdvcmQgPCAweDQwMDAwMDApIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSArPSB3b3JkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faWFkZG4od29yZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAoZGVzdCkge1xuICAgIGRlc3Qud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgZGVzdC53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV07XG4gICAgfVxuICAgIGRlc3QubGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgZGVzdC5uZWdhdGl2ZSA9IHRoaXMubmVnYXRpdmU7XG4gICAgZGVzdC5yZWQgPSB0aGlzLnJlZDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiBjbG9uZSAoKSB7XG4gICAgdmFyIHIgPSBuZXcgQk4obnVsbCk7XG4gICAgdGhpcy5jb3B5KHIpO1xuICAgIHJldHVybiByO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fZXhwYW5kID0gZnVuY3Rpb24gX2V4cGFuZCAoc2l6ZSkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA8IHNpemUpIHtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGgrK10gPSAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBSZW1vdmUgbGVhZGluZyBgMGAgZnJvbSBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnN0cmlwID0gZnVuY3Rpb24gc3RyaXAgKCkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA+IDEgJiYgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdID09PSAwKSB7XG4gICAgICB0aGlzLmxlbmd0aC0tO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX25vcm1TaWduID0gZnVuY3Rpb24gX25vcm1TaWduICgpIHtcbiAgICAvLyAtMCA9IDBcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA9PT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLnJlZCA/ICc8Qk4tUjogJyA6ICc8Qk46ICcpICsgdGhpcy50b1N0cmluZygxNikgKyAnPic7XG4gIH07XG5cbiAgLypcblxuICB2YXIgemVyb3MgPSBbXTtcbiAgdmFyIGdyb3VwU2l6ZXMgPSBbXTtcbiAgdmFyIGdyb3VwQmFzZXMgPSBbXTtcblxuICB2YXIgcyA9ICcnO1xuICB2YXIgaSA9IC0xO1xuICB3aGlsZSAoKytpIDwgQk4ud29yZFNpemUpIHtcbiAgICB6ZXJvc1tpXSA9IHM7XG4gICAgcyArPSAnMCc7XG4gIH1cbiAgZ3JvdXBTaXplc1swXSA9IDA7XG4gIGdyb3VwU2l6ZXNbMV0gPSAwO1xuICBncm91cEJhc2VzWzBdID0gMDtcbiAgZ3JvdXBCYXNlc1sxXSA9IDA7XG4gIHZhciBiYXNlID0gMiAtIDE7XG4gIHdoaWxlICgrK2Jhc2UgPCAzNiArIDEpIHtcbiAgICB2YXIgZ3JvdXBTaXplID0gMDtcbiAgICB2YXIgZ3JvdXBCYXNlID0gMTtcbiAgICB3aGlsZSAoZ3JvdXBCYXNlIDwgKDEgPDwgQk4ud29yZFNpemUpIC8gYmFzZSkge1xuICAgICAgZ3JvdXBCYXNlICo9IGJhc2U7XG4gICAgICBncm91cFNpemUgKz0gMTtcbiAgICB9XG4gICAgZ3JvdXBTaXplc1tiYXNlXSA9IGdyb3VwU2l6ZTtcbiAgICBncm91cEJhc2VzW2Jhc2VdID0gZ3JvdXBCYXNlO1xuICB9XG5cbiAgKi9cblxuICB2YXIgemVyb3MgPSBbXG4gICAgJycsXG4gICAgJzAnLFxuICAgICcwMCcsXG4gICAgJzAwMCcsXG4gICAgJzAwMDAnLFxuICAgICcwMDAwMCcsXG4gICAgJzAwMDAwMCcsXG4gICAgJzAwMDAwMDAnLFxuICAgICcwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnXG4gIF07XG5cbiAgdmFyIGdyb3VwU2l6ZXMgPSBbXG4gICAgMCwgMCxcbiAgICAyNSwgMTYsIDEyLCAxMSwgMTAsIDksIDgsXG4gICAgOCwgNywgNywgNywgNywgNiwgNixcbiAgICA2LCA2LCA2LCA2LCA2LCA1LCA1LFxuICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNVxuICBdO1xuXG4gIHZhciBncm91cEJhc2VzID0gW1xuICAgIDAsIDAsXG4gICAgMzM1NTQ0MzIsIDQzMDQ2NzIxLCAxNjc3NzIxNiwgNDg4MjgxMjUsIDYwNDY2MTc2LCA0MDM1MzYwNywgMTY3NzcyMTYsXG4gICAgNDMwNDY3MjEsIDEwMDAwMDAwLCAxOTQ4NzE3MSwgMzU4MzE4MDgsIDYyNzQ4NTE3LCA3NTI5NTM2LCAxMTM5MDYyNSxcbiAgICAxNjc3NzIxNiwgMjQxMzc1NjksIDM0MDEyMjI0LCA0NzA0NTg4MSwgNjQwMDAwMDAsIDQwODQxMDEsIDUxNTM2MzIsXG4gICAgNjQzNjM0MywgNzk2MjYyNCwgOTc2NTYyNSwgMTE4ODEzNzYsIDE0MzQ4OTA3LCAxNzIxMDM2OCwgMjA1MTExNDksXG4gICAgMjQzMDAwMDAsIDI4NjI5MTUxLCAzMzU1NDQzMiwgMzkxMzUzOTMsIDQ1NDM1NDI0LCA1MjUyMTg3NSwgNjA0NjYxNzZcbiAgXTtcblxuICBCTi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoYmFzZSwgcGFkZGluZykge1xuICAgIGJhc2UgPSBiYXNlIHx8IDEwO1xuICAgIHBhZGRpbmcgPSBwYWRkaW5nIHwgMCB8fCAxO1xuXG4gICAgdmFyIG91dDtcbiAgICBpZiAoYmFzZSA9PT0gMTYgfHwgYmFzZSA9PT0gJ2hleCcpIHtcbiAgICAgIG91dCA9ICcnO1xuICAgICAgdmFyIG9mZiA9IDA7XG4gICAgICB2YXIgY2FycnkgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgICAgdmFyIHdvcmQgPSAoKCh3IDw8IG9mZikgfCBjYXJyeSkgJiAweGZmZmZmZikudG9TdHJpbmcoMTYpO1xuICAgICAgICBjYXJyeSA9ICh3ID4+PiAoMjQgLSBvZmYpKSAmIDB4ZmZmZmZmO1xuICAgICAgICBvZmYgKz0gMjtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBpLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhcnJ5ICE9PSAwIHx8IGkgIT09IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIG91dCA9IHplcm9zWzYgLSB3b3JkLmxlbmd0aF0gKyB3b3JkICsgb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCA9IHdvcmQgKyBvdXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgICBvdXQgPSBjYXJyeS50b1N0cmluZygxNikgKyBvdXQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAob3V0Lmxlbmd0aCAlIHBhZGRpbmcgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJzAnICsgb3V0O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJy0nICsgb3V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBpZiAoYmFzZSA9PT0gKGJhc2UgfCAwKSAmJiBiYXNlID49IDIgJiYgYmFzZSA8PSAzNikge1xuICAgICAgLy8gdmFyIGdyb3VwU2l6ZSA9IE1hdGguZmxvb3IoQk4ud29yZFNpemUgKiBNYXRoLkxOMiAvIE1hdGgubG9nKGJhc2UpKTtcbiAgICAgIHZhciBncm91cFNpemUgPSBncm91cFNpemVzW2Jhc2VdO1xuICAgICAgLy8gdmFyIGdyb3VwQmFzZSA9IE1hdGgucG93KGJhc2UsIGdyb3VwU2l6ZSk7XG4gICAgICB2YXIgZ3JvdXBCYXNlID0gZ3JvdXBCYXNlc1tiYXNlXTtcbiAgICAgIG91dCA9ICcnO1xuICAgICAgdmFyIGMgPSB0aGlzLmNsb25lKCk7XG4gICAgICBjLm5lZ2F0aXZlID0gMDtcbiAgICAgIHdoaWxlICghYy5pc1plcm8oKSkge1xuICAgICAgICB2YXIgciA9IGMubW9kbihncm91cEJhc2UpLnRvU3RyaW5nKGJhc2UpO1xuICAgICAgICBjID0gYy5pZGl2bihncm91cEJhc2UpO1xuXG4gICAgICAgIGlmICghYy5pc1plcm8oKSkge1xuICAgICAgICAgIG91dCA9IHplcm9zW2dyb3VwU2l6ZSAtIHIubGVuZ3RoXSArIHIgKyBvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ID0gciArIG91dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNaZXJvKCkpIHtcbiAgICAgICAgb3V0ID0gJzAnICsgb3V0O1xuICAgICAgfVxuICAgICAgd2hpbGUgKG91dC5sZW5ndGggJSBwYWRkaW5nICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICcwJyArIG91dDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICctJyArIG91dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgYXNzZXJ0KGZhbHNlLCAnQmFzZSBzaG91bGQgYmUgYmV0d2VlbiAyIGFuZCAzNicpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyICgpIHtcbiAgICB2YXIgcmV0ID0gdGhpcy53b3Jkc1swXTtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHJldCArPSB0aGlzLndvcmRzWzFdICogMHg0MDAwMDAwO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sZW5ndGggPT09IDMgJiYgdGhpcy53b3Jkc1syXSA9PT0gMHgwMSkge1xuICAgICAgLy8gTk9URTogYXQgdGhpcyBzdGFnZSBpdCBpcyBrbm93biB0aGF0IHRoZSB0b3AgYml0IGlzIHNldFxuICAgICAgcmV0ICs9IDB4MTAwMDAwMDAwMDAwMDAgKyAodGhpcy53b3Jkc1sxXSAqIDB4NDAwMDAwMCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxlbmd0aCA+IDIpIHtcbiAgICAgIGFzc2VydChmYWxzZSwgJ051bWJlciBjYW4gb25seSBzYWZlbHkgc3RvcmUgdXAgdG8gNTMgYml0cycpO1xuICAgIH1cbiAgICByZXR1cm4gKHRoaXMubmVnYXRpdmUgIT09IDApID8gLXJldCA6IHJldDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgICByZXR1cm4gdGhpcy50b1N0cmluZygxNik7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvQnVmZmVyID0gZnVuY3Rpb24gdG9CdWZmZXIgKGVuZGlhbiwgbGVuZ3RoKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKTtcbiAgICByZXR1cm4gdGhpcy50b0FycmF5TGlrZShCdWZmZXIsIGVuZGlhbiwgbGVuZ3RoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uIHRvQXJyYXkgKGVuZGlhbiwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9BcnJheUxpa2UoQXJyYXksIGVuZGlhbiwgbGVuZ3RoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9BcnJheUxpa2UgPSBmdW5jdGlvbiB0b0FycmF5TGlrZSAoQXJyYXlUeXBlLCBlbmRpYW4sIGxlbmd0aCkge1xuICAgIHZhciBieXRlTGVuZ3RoID0gdGhpcy5ieXRlTGVuZ3RoKCk7XG4gICAgdmFyIHJlcUxlbmd0aCA9IGxlbmd0aCB8fCBNYXRoLm1heCgxLCBieXRlTGVuZ3RoKTtcbiAgICBhc3NlcnQoYnl0ZUxlbmd0aCA8PSByZXFMZW5ndGgsICdieXRlIGFycmF5IGxvbmdlciB0aGFuIGRlc2lyZWQgbGVuZ3RoJyk7XG4gICAgYXNzZXJ0KHJlcUxlbmd0aCA+IDAsICdSZXF1ZXN0ZWQgYXJyYXkgbGVuZ3RoIDw9IDAnKTtcblxuICAgIHRoaXMuc3RyaXAoKTtcbiAgICB2YXIgbGl0dGxlRW5kaWFuID0gZW5kaWFuID09PSAnbGUnO1xuICAgIHZhciByZXMgPSBuZXcgQXJyYXlUeXBlKHJlcUxlbmd0aCk7XG5cbiAgICB2YXIgYiwgaTtcbiAgICB2YXIgcSA9IHRoaXMuY2xvbmUoKTtcbiAgICBpZiAoIWxpdHRsZUVuZGlhbikge1xuICAgICAgLy8gQXNzdW1lIGJpZy1lbmRpYW5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCByZXFMZW5ndGggLSBieXRlTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzW2ldID0gMDtcbiAgICAgIH1cblxuICAgICAgZm9yIChpID0gMDsgIXEuaXNaZXJvKCk7IGkrKykge1xuICAgICAgICBiID0gcS5hbmRsbigweGZmKTtcbiAgICAgICAgcS5pdXNocm4oOCk7XG5cbiAgICAgICAgcmVzW3JlcUxlbmd0aCAtIGkgLSAxXSA9IGI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSA9IDA7ICFxLmlzWmVybygpOyBpKyspIHtcbiAgICAgICAgYiA9IHEuYW5kbG4oMHhmZik7XG4gICAgICAgIHEuaXVzaHJuKDgpO1xuXG4gICAgICAgIHJlc1tpXSA9IGI7XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBpIDwgcmVxTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzW2ldID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIGlmIChNYXRoLmNsejMyKSB7XG4gICAgQk4ucHJvdG90eXBlLl9jb3VudEJpdHMgPSBmdW5jdGlvbiBfY291bnRCaXRzICh3KSB7XG4gICAgICByZXR1cm4gMzIgLSBNYXRoLmNsejMyKHcpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgQk4ucHJvdG90eXBlLl9jb3VudEJpdHMgPSBmdW5jdGlvbiBfY291bnRCaXRzICh3KSB7XG4gICAgICB2YXIgdCA9IHc7XG4gICAgICB2YXIgciA9IDA7XG4gICAgICBpZiAodCA+PSAweDEwMDApIHtcbiAgICAgICAgciArPSAxMztcbiAgICAgICAgdCA+Pj49IDEzO1xuICAgICAgfVxuICAgICAgaWYgKHQgPj0gMHg0MCkge1xuICAgICAgICByICs9IDc7XG4gICAgICAgIHQgPj4+PSA3O1xuICAgICAgfVxuICAgICAgaWYgKHQgPj0gMHg4KSB7XG4gICAgICAgIHIgKz0gNDtcbiAgICAgICAgdCA+Pj49IDQ7XG4gICAgICB9XG4gICAgICBpZiAodCA+PSAweDAyKSB7XG4gICAgICAgIHIgKz0gMjtcbiAgICAgICAgdCA+Pj49IDI7XG4gICAgICB9XG4gICAgICByZXR1cm4gciArIHQ7XG4gICAgfTtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5femVyb0JpdHMgPSBmdW5jdGlvbiBfemVyb0JpdHMgKHcpIHtcbiAgICAvLyBTaG9ydC1jdXRcbiAgICBpZiAodyA9PT0gMCkgcmV0dXJuIDI2O1xuXG4gICAgdmFyIHQgPSB3O1xuICAgIHZhciByID0gMDtcbiAgICBpZiAoKHQgJiAweDFmZmYpID09PSAwKSB7XG4gICAgICByICs9IDEzO1xuICAgICAgdCA+Pj49IDEzO1xuICAgIH1cbiAgICBpZiAoKHQgJiAweDdmKSA9PT0gMCkge1xuICAgICAgciArPSA3O1xuICAgICAgdCA+Pj49IDc7XG4gICAgfVxuICAgIGlmICgodCAmIDB4ZikgPT09IDApIHtcbiAgICAgIHIgKz0gNDtcbiAgICAgIHQgPj4+PSA0O1xuICAgIH1cbiAgICBpZiAoKHQgJiAweDMpID09PSAwKSB7XG4gICAgICByICs9IDI7XG4gICAgICB0ID4+Pj0gMjtcbiAgICB9XG4gICAgaWYgKCh0ICYgMHgxKSA9PT0gMCkge1xuICAgICAgcisrO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICAvLyBSZXR1cm4gbnVtYmVyIG9mIHVzZWQgYml0cyBpbiBhIEJOXG4gIEJOLnByb3RvdHlwZS5iaXRMZW5ndGggPSBmdW5jdGlvbiBiaXRMZW5ndGggKCkge1xuICAgIHZhciB3ID0gdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdO1xuICAgIHZhciBoaSA9IHRoaXMuX2NvdW50Qml0cyh3KTtcbiAgICByZXR1cm4gKHRoaXMubGVuZ3RoIC0gMSkgKiAyNiArIGhpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHRvQml0QXJyYXkgKG51bSkge1xuICAgIHZhciB3ID0gbmV3IEFycmF5KG51bS5iaXRMZW5ndGgoKSk7XG5cbiAgICBmb3IgKHZhciBiaXQgPSAwOyBiaXQgPCB3Lmxlbmd0aDsgYml0KyspIHtcbiAgICAgIHZhciBvZmYgPSAoYml0IC8gMjYpIHwgMDtcbiAgICAgIHZhciB3Yml0ID0gYml0ICUgMjY7XG5cbiAgICAgIHdbYml0XSA9IChudW0ud29yZHNbb2ZmXSAmICgxIDw8IHdiaXQpKSA+Pj4gd2JpdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdztcbiAgfVxuXG4gIC8vIE51bWJlciBvZiB0cmFpbGluZyB6ZXJvIGJpdHNcbiAgQk4ucHJvdG90eXBlLnplcm9CaXRzID0gZnVuY3Rpb24gemVyb0JpdHMgKCkge1xuICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gMDtcblxuICAgIHZhciByID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBiID0gdGhpcy5femVyb0JpdHModGhpcy53b3Jkc1tpXSk7XG4gICAgICByICs9IGI7XG4gICAgICBpZiAoYiAhPT0gMjYpIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuYnl0ZUxlbmd0aCA9IGZ1bmN0aW9uIGJ5dGVMZW5ndGggKCkge1xuICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy5iaXRMZW5ndGgoKSAvIDgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b1R3b3MgPSBmdW5jdGlvbiB0b1R3b3MgKHdpZHRoKSB7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmFicygpLmlub3RuKHdpZHRoKS5pYWRkbigxKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZnJvbVR3b3MgPSBmdW5jdGlvbiBmcm9tVHdvcyAod2lkdGgpIHtcbiAgICBpZiAodGhpcy50ZXN0bih3aWR0aCAtIDEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub3RuKHdpZHRoKS5pYWRkbigxKS5pbmVnKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb25lKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzTmVnID0gZnVuY3Rpb24gaXNOZWcgKCkge1xuICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwO1xuICB9O1xuXG4gIC8vIFJldHVybiBuZWdhdGl2ZSBjbG9uZSBvZiBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbmVnKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmluZWcgPSBmdW5jdGlvbiBpbmVnICgpIHtcbiAgICBpZiAoIXRoaXMuaXNaZXJvKCkpIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgXj0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBPciBgbnVtYCB3aXRoIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXVvciA9IGZ1bmN0aW9uIGl1b3IgKG51bSkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA8IG51bS5sZW5ndGgpIHtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGgrK10gPSAwO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXSB8IG51bS53b3Jkc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pb3IgPSBmdW5jdGlvbiBpb3IgKG51bSkge1xuICAgIGFzc2VydCgodGhpcy5uZWdhdGl2ZSB8IG51bS5uZWdhdGl2ZSkgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1b3IobnVtKTtcbiAgfTtcblxuICAvLyBPciBgbnVtYCB3aXRoIGB0aGlzYFxuICBCTi5wcm90b3R5cGUub3IgPSBmdW5jdGlvbiBvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pb3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaW9yKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51b3IgPSBmdW5jdGlvbiB1b3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXVvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pdW9yKHRoaXMpO1xuICB9O1xuXG4gIC8vIEFuZCBgbnVtYCB3aXRoIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXVhbmQgPSBmdW5jdGlvbiBpdWFuZCAobnVtKSB7XG4gICAgLy8gYiA9IG1pbi1sZW5ndGgobnVtLCB0aGlzKVxuICAgIHZhciBiO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHtcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV0gJiBudW0ud29yZHNbaV07XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBiLmxlbmd0aDtcblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlhbmQgPSBmdW5jdGlvbiBpYW5kIChudW0pIHtcbiAgICBhc3NlcnQoKHRoaXMubmVnYXRpdmUgfCBudW0ubmVnYXRpdmUpID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdWFuZChudW0pO1xuICB9O1xuXG4gIC8vIEFuZCBgbnVtYCB3aXRoIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuYW5kID0gZnVuY3Rpb24gYW5kIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLmlhbmQobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaWFuZCh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudWFuZCA9IGZ1bmN0aW9uIHVhbmQgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXVhbmQobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXVhbmQodGhpcyk7XG4gIH07XG5cbiAgLy8gWG9yIGBudW1gIHdpdGggYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdXhvciA9IGZ1bmN0aW9uIGl1eG9yIChudW0pIHtcbiAgICAvLyBhLmxlbmd0aCA+IGIubGVuZ3RoXG4gICAgdmFyIGE7XG4gICAgdmFyIGI7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkge1xuICAgICAgYSA9IHRoaXM7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gbnVtO1xuICAgICAgYiA9IHRoaXM7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXSBeIGIud29yZHNbaV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMgIT09IGEpIHtcbiAgICAgIGZvciAoOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IGEubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXhvciA9IGZ1bmN0aW9uIGl4b3IgKG51bSkge1xuICAgIGFzc2VydCgodGhpcy5uZWdhdGl2ZSB8IG51bS5uZWdhdGl2ZSkgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1eG9yKG51bSk7XG4gIH07XG5cbiAgLy8gWG9yIGBudW1gIHdpdGggYHRoaXNgXG4gIEJOLnByb3RvdHlwZS54b3IgPSBmdW5jdGlvbiB4b3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXhvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5peG9yKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51eG9yID0gZnVuY3Rpb24gdXhvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXhvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pdXhvcih0aGlzKTtcbiAgfTtcblxuICAvLyBOb3QgYGB0aGlzYGAgd2l0aCBgYHdpZHRoYGAgYml0d2lkdGhcbiAgQk4ucHJvdG90eXBlLmlub3RuID0gZnVuY3Rpb24gaW5vdG4gKHdpZHRoKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiB3aWR0aCA9PT0gJ251bWJlcicgJiYgd2lkdGggPj0gMCk7XG5cbiAgICB2YXIgYnl0ZXNOZWVkZWQgPSBNYXRoLmNlaWwod2lkdGggLyAyNikgfCAwO1xuICAgIHZhciBiaXRzTGVmdCA9IHdpZHRoICUgMjY7XG5cbiAgICAvLyBFeHRlbmQgdGhlIGJ1ZmZlciB3aXRoIGxlYWRpbmcgemVyb2VzXG4gICAgdGhpcy5fZXhwYW5kKGJ5dGVzTmVlZGVkKTtcblxuICAgIGlmIChiaXRzTGVmdCA+IDApIHtcbiAgICAgIGJ5dGVzTmVlZGVkLS07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGNvbXBsZXRlIHdvcmRzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlc05lZWRlZDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gfnRoaXMud29yZHNbaV0gJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHRoZSByZXNpZHVlXG4gICAgaWYgKGJpdHNMZWZ0ID4gMCkge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IH50aGlzLndvcmRzW2ldICYgKDB4M2ZmZmZmZiA+PiAoMjYgLSBiaXRzTGVmdCkpO1xuICAgIH1cblxuICAgIC8vIEFuZCByZW1vdmUgbGVhZGluZyB6ZXJvZXNcbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ub3RuID0gZnVuY3Rpb24gbm90biAod2lkdGgpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlub3RuKHdpZHRoKTtcbiAgfTtcblxuICAvLyBTZXQgYGJpdGAgb2YgYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zZXRuID0gZnVuY3Rpb24gc2V0biAoYml0LCB2YWwpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdCA9PT0gJ251bWJlcicgJiYgYml0ID49IDApO1xuXG4gICAgdmFyIG9mZiA9IChiaXQgLyAyNikgfCAwO1xuICAgIHZhciB3Yml0ID0gYml0ICUgMjY7XG5cbiAgICB0aGlzLl9leHBhbmQob2ZmICsgMSk7XG5cbiAgICBpZiAodmFsKSB7XG4gICAgICB0aGlzLndvcmRzW29mZl0gPSB0aGlzLndvcmRzW29mZl0gfCAoMSA8PCB3Yml0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53b3Jkc1tvZmZdID0gdGhpcy53b3Jkc1tvZmZdICYgfigxIDw8IHdiaXQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gQWRkIGBudW1gIHRvIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaWFkZCA9IGZ1bmN0aW9uIGlhZGQgKG51bSkge1xuICAgIHZhciByO1xuXG4gICAgLy8gbmVnYXRpdmUgKyBwb3NpdGl2ZVxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIG51bS5uZWdhdGl2ZSA9PT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICByID0gdGhpcy5pc3ViKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlIF49IDE7XG4gICAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcblxuICAgIC8vIHBvc2l0aXZlICsgbmVnYXRpdmVcbiAgICB9IGVsc2UgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbnVtLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBudW0ubmVnYXRpdmUgPSAwO1xuICAgICAgciA9IHRoaXMuaXN1YihudW0pO1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiByLl9ub3JtU2lnbigpO1xuICAgIH1cblxuICAgIC8vIGEubGVuZ3RoID4gYi5sZW5ndGhcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSB7XG4gICAgICBhID0gdGhpcztcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBudW07XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgKyAoYi53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICAgIGNhcnJ5ID0gciA+Pj4gMjY7XG4gICAgfVxuICAgIGZvciAoOyBjYXJyeSAhPT0gMCAmJiBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgICAgY2FycnkgPSByID4+PiAyNjtcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IGEubGVuZ3RoO1xuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aF0gPSBjYXJyeTtcbiAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgLy8gQ29weSB0aGUgcmVzdCBvZiB0aGUgd29yZHNcbiAgICB9IGVsc2UgaWYgKGEgIT09IHRoaXMpIHtcbiAgICAgIGZvciAoOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBBZGQgYG51bWAgdG8gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKG51bSkge1xuICAgIHZhciByZXM7XG4gICAgaWYgKG51bS5uZWdhdGl2ZSAhPT0gMCAmJiB0aGlzLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICBudW0ubmVnYXRpdmUgPSAwO1xuICAgICAgcmVzID0gdGhpcy5zdWIobnVtKTtcbiAgICAgIG51bS5uZWdhdGl2ZSBePSAxO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGVsc2UgaWYgKG51bS5uZWdhdGl2ZSA9PT0gMCAmJiB0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHJlcyA9IG51bS5zdWIodGhpcyk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkKG51bSk7XG5cbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaWFkZCh0aGlzKTtcbiAgfTtcblxuICAvLyBTdWJ0cmFjdCBgbnVtYCBmcm9tIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXN1YiA9IGZ1bmN0aW9uIGlzdWIgKG51bSkge1xuICAgIC8vIHRoaXMgLSAoLW51bSkgPSB0aGlzICsgbnVtXG4gICAgaWYgKG51bS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMDtcbiAgICAgIHZhciByID0gdGhpcy5pYWRkKG51bSk7XG4gICAgICBudW0ubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHIuX25vcm1TaWduKCk7XG5cbiAgICAvLyAtdGhpcyAtIG51bSA9IC0odGhpcyArIG51bSlcbiAgICB9IGVsc2UgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5pYWRkKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiB0aGlzLl9ub3JtU2lnbigpO1xuICAgIH1cblxuICAgIC8vIEF0IHRoaXMgcG9pbnQgYm90aCBudW1iZXJzIGFyZSBwb3NpdGl2ZVxuICAgIHZhciBjbXAgPSB0aGlzLmNtcChudW0pO1xuXG4gICAgLy8gT3B0aW1pemF0aW9uIC0gemVyb2lmeVxuICAgIGlmIChjbXAgPT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgICAgdGhpcy53b3Jkc1swXSA9IDA7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBhID4gYlxuICAgIHZhciBhLCBiO1xuICAgIGlmIChjbXAgPiAwKSB7XG4gICAgICBhID0gdGhpcztcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBudW07XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgLSAoYi53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHIgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICB9XG4gICAgZm9yICg7IGNhcnJ5ICE9PSAwICYmIGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgY2FycnkgPSByID4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgLy8gQ29weSByZXN0IG9mIHRoZSB3b3Jkc1xuICAgIGlmIChjYXJyeSA9PT0gMCAmJiBpIDwgYS5sZW5ndGggJiYgYSAhPT0gdGhpcykge1xuICAgICAgZm9yICg7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5sZW5ndGgsIGkpO1xuXG4gICAgaWYgKGEgIT09IHRoaXMpIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gU3VidHJhY3QgYG51bWAgZnJvbSBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uIHN1YiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc3ViKG51bSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gc21hbGxNdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICBvdXQubmVnYXRpdmUgPSBudW0ubmVnYXRpdmUgXiBzZWxmLm5lZ2F0aXZlO1xuICAgIHZhciBsZW4gPSAoc2VsZi5sZW5ndGggKyBudW0ubGVuZ3RoKSB8IDA7XG4gICAgb3V0Lmxlbmd0aCA9IGxlbjtcbiAgICBsZW4gPSAobGVuIC0gMSkgfCAwO1xuXG4gICAgLy8gUGVlbCBvbmUgaXRlcmF0aW9uIChjb21waWxlciBjYW4ndCBkbyBpdCwgYmVjYXVzZSBvZiBjb2RlIGNvbXBsZXhpdHkpXG4gICAgdmFyIGEgPSBzZWxmLndvcmRzWzBdIHwgMDtcbiAgICB2YXIgYiA9IG51bS53b3Jkc1swXSB8IDA7XG4gICAgdmFyIHIgPSBhICogYjtcblxuICAgIHZhciBsbyA9IHIgJiAweDNmZmZmZmY7XG4gICAgdmFyIGNhcnJ5ID0gKHIgLyAweDQwMDAwMDApIHwgMDtcbiAgICBvdXQud29yZHNbMF0gPSBsbztcblxuICAgIGZvciAodmFyIGsgPSAxOyBrIDwgbGVuOyBrKyspIHtcbiAgICAgIC8vIFN1bSBhbGwgd29yZHMgd2l0aCB0aGUgc2FtZSBgaSArIGogPSBrYCBhbmQgYWNjdW11bGF0ZSBgbmNhcnJ5YCxcbiAgICAgIC8vIG5vdGUgdGhhdCBuY2FycnkgY291bGQgYmUgPj0gMHgzZmZmZmZmXG4gICAgICB2YXIgbmNhcnJ5ID0gY2FycnkgPj4+IDI2O1xuICAgICAgdmFyIHJ3b3JkID0gY2FycnkgJiAweDNmZmZmZmY7XG4gICAgICB2YXIgbWF4SiA9IE1hdGgubWluKGssIG51bS5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGogPSBNYXRoLm1heCgwLCBrIC0gc2VsZi5sZW5ndGggKyAxKTsgaiA8PSBtYXhKOyBqKyspIHtcbiAgICAgICAgdmFyIGkgPSAoayAtIGopIHwgMDtcbiAgICAgICAgYSA9IHNlbGYud29yZHNbaV0gfCAwO1xuICAgICAgICBiID0gbnVtLndvcmRzW2pdIHwgMDtcbiAgICAgICAgciA9IGEgKiBiICsgcndvcmQ7XG4gICAgICAgIG5jYXJyeSArPSAociAvIDB4NDAwMDAwMCkgfCAwO1xuICAgICAgICByd29yZCA9IHIgJiAweDNmZmZmZmY7XG4gICAgICB9XG4gICAgICBvdXQud29yZHNba10gPSByd29yZCB8IDA7XG4gICAgICBjYXJyeSA9IG5jYXJyeSB8IDA7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgb3V0LndvcmRzW2tdID0gY2FycnkgfCAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQubGVuZ3RoLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dC5zdHJpcCgpO1xuICB9XG5cbiAgLy8gVE9ETyhpbmR1dG55KTogaXQgbWF5IGJlIHJlYXNvbmFibGUgdG8gb21pdCBpdCBmb3IgdXNlcnMgd2hvIGRvbid0IG5lZWRcbiAgLy8gdG8gd29yayB3aXRoIDI1Ni1iaXQgbnVtYmVycywgb3RoZXJ3aXNlIGl0IGdpdmVzIDIwJSBpbXByb3ZlbWVudCBmb3IgMjU2LWJpdFxuICAvLyBtdWx0aXBsaWNhdGlvbiAobGlrZSBlbGxpcHRpYyBzZWNwMjU2azEpLlxuICB2YXIgY29tYjEwTXVsVG8gPSBmdW5jdGlvbiBjb21iMTBNdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICB2YXIgYSA9IHNlbGYud29yZHM7XG4gICAgdmFyIGIgPSBudW0ud29yZHM7XG4gICAgdmFyIG8gPSBvdXQud29yZHM7XG4gICAgdmFyIGMgPSAwO1xuICAgIHZhciBsbztcbiAgICB2YXIgbWlkO1xuICAgIHZhciBoaTtcbiAgICB2YXIgYTAgPSBhWzBdIHwgMDtcbiAgICB2YXIgYWwwID0gYTAgJiAweDFmZmY7XG4gICAgdmFyIGFoMCA9IGEwID4+PiAxMztcbiAgICB2YXIgYTEgPSBhWzFdIHwgMDtcbiAgICB2YXIgYWwxID0gYTEgJiAweDFmZmY7XG4gICAgdmFyIGFoMSA9IGExID4+PiAxMztcbiAgICB2YXIgYTIgPSBhWzJdIHwgMDtcbiAgICB2YXIgYWwyID0gYTIgJiAweDFmZmY7XG4gICAgdmFyIGFoMiA9IGEyID4+PiAxMztcbiAgICB2YXIgYTMgPSBhWzNdIHwgMDtcbiAgICB2YXIgYWwzID0gYTMgJiAweDFmZmY7XG4gICAgdmFyIGFoMyA9IGEzID4+PiAxMztcbiAgICB2YXIgYTQgPSBhWzRdIHwgMDtcbiAgICB2YXIgYWw0ID0gYTQgJiAweDFmZmY7XG4gICAgdmFyIGFoNCA9IGE0ID4+PiAxMztcbiAgICB2YXIgYTUgPSBhWzVdIHwgMDtcbiAgICB2YXIgYWw1ID0gYTUgJiAweDFmZmY7XG4gICAgdmFyIGFoNSA9IGE1ID4+PiAxMztcbiAgICB2YXIgYTYgPSBhWzZdIHwgMDtcbiAgICB2YXIgYWw2ID0gYTYgJiAweDFmZmY7XG4gICAgdmFyIGFoNiA9IGE2ID4+PiAxMztcbiAgICB2YXIgYTcgPSBhWzddIHwgMDtcbiAgICB2YXIgYWw3ID0gYTcgJiAweDFmZmY7XG4gICAgdmFyIGFoNyA9IGE3ID4+PiAxMztcbiAgICB2YXIgYTggPSBhWzhdIHwgMDtcbiAgICB2YXIgYWw4ID0gYTggJiAweDFmZmY7XG4gICAgdmFyIGFoOCA9IGE4ID4+PiAxMztcbiAgICB2YXIgYTkgPSBhWzldIHwgMDtcbiAgICB2YXIgYWw5ID0gYTkgJiAweDFmZmY7XG4gICAgdmFyIGFoOSA9IGE5ID4+PiAxMztcbiAgICB2YXIgYjAgPSBiWzBdIHwgMDtcbiAgICB2YXIgYmwwID0gYjAgJiAweDFmZmY7XG4gICAgdmFyIGJoMCA9IGIwID4+PiAxMztcbiAgICB2YXIgYjEgPSBiWzFdIHwgMDtcbiAgICB2YXIgYmwxID0gYjEgJiAweDFmZmY7XG4gICAgdmFyIGJoMSA9IGIxID4+PiAxMztcbiAgICB2YXIgYjIgPSBiWzJdIHwgMDtcbiAgICB2YXIgYmwyID0gYjIgJiAweDFmZmY7XG4gICAgdmFyIGJoMiA9IGIyID4+PiAxMztcbiAgICB2YXIgYjMgPSBiWzNdIHwgMDtcbiAgICB2YXIgYmwzID0gYjMgJiAweDFmZmY7XG4gICAgdmFyIGJoMyA9IGIzID4+PiAxMztcbiAgICB2YXIgYjQgPSBiWzRdIHwgMDtcbiAgICB2YXIgYmw0ID0gYjQgJiAweDFmZmY7XG4gICAgdmFyIGJoNCA9IGI0ID4+PiAxMztcbiAgICB2YXIgYjUgPSBiWzVdIHwgMDtcbiAgICB2YXIgYmw1ID0gYjUgJiAweDFmZmY7XG4gICAgdmFyIGJoNSA9IGI1ID4+PiAxMztcbiAgICB2YXIgYjYgPSBiWzZdIHwgMDtcbiAgICB2YXIgYmw2ID0gYjYgJiAweDFmZmY7XG4gICAgdmFyIGJoNiA9IGI2ID4+PiAxMztcbiAgICB2YXIgYjcgPSBiWzddIHwgMDtcbiAgICB2YXIgYmw3ID0gYjcgJiAweDFmZmY7XG4gICAgdmFyIGJoNyA9IGI3ID4+PiAxMztcbiAgICB2YXIgYjggPSBiWzhdIHwgMDtcbiAgICB2YXIgYmw4ID0gYjggJiAweDFmZmY7XG4gICAgdmFyIGJoOCA9IGI4ID4+PiAxMztcbiAgICB2YXIgYjkgPSBiWzldIHwgMDtcbiAgICB2YXIgYmw5ID0gYjkgJiAweDFmZmY7XG4gICAgdmFyIGJoOSA9IGI5ID4+PiAxMztcblxuICAgIG91dC5uZWdhdGl2ZSA9IHNlbGYubmVnYXRpdmUgXiBudW0ubmVnYXRpdmU7XG4gICAgb3V0Lmxlbmd0aCA9IDE5O1xuICAgIC8qIGsgPSAwICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwwLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDAsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDAsIGJoMCk7XG4gICAgdmFyIHcwID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MCA+Pj4gMjYpKSB8IDA7XG4gICAgdzAgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwxLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDEsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDEsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmgxKSkgfCAwO1xuICAgIHZhciB3MSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzEgPj4+IDI2KSkgfCAwO1xuICAgIHcxICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMiwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwyLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgyLCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDIpKSB8IDA7XG4gICAgdmFyIHcyID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MiA+Pj4gMjYpKSB8IDA7XG4gICAgdzIgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAzICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwzLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDMsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDMsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDMpKSB8IDA7XG4gICAgdmFyIHczID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MyA+Pj4gMjYpKSB8IDA7XG4gICAgdzMgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA0ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw0LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDQsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDQsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg0KSkgfCAwO1xuICAgIHZhciB3NCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzQgPj4+IDI2KSkgfCAwO1xuICAgIHc0ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNSwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw1LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg1LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDUpKSB8IDA7XG4gICAgdmFyIHc1ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3NSA+Pj4gMjYpKSB8IDA7XG4gICAgdzUgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA2ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw2LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDYsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDYsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDYpKSB8IDA7XG4gICAgdmFyIHc2ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3NiA+Pj4gMjYpKSB8IDA7XG4gICAgdzYgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA3ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw3LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDcsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDcsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg3KSkgfCAwO1xuICAgIHZhciB3NyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzcgPj4+IDI2KSkgfCAwO1xuICAgIHc3ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gOCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOCwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw4LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg4LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDgpKSB8IDA7XG4gICAgdmFyIHc4ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3OCA+Pj4gMjYpKSB8IDA7XG4gICAgdzggJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA5ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDkpKSB8IDA7XG4gICAgdmFyIHc5ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3OSA+Pj4gMjYpKSB8IDA7XG4gICAgdzkgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwxKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDEpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDEpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDEpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxMCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzEwID4+PiAyNikpIHwgMDtcbiAgICB3MTAgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwyKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDIpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDIpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDIpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzExID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTEgPj4+IDI2KSkgfCAwO1xuICAgIHcxMSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDEyICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDMpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMyk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsMykpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoMyk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxMiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzEyID4+PiAyNikpIHwgMDtcbiAgICB3MTIgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw0KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDQpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDQpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDQpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxMyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzEzID4+PiAyNikpIHwgMDtcbiAgICB3MTMgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw1KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDUpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDUpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDUpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzE0ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTQgPj4+IDI2KSkgfCAwO1xuICAgIHcxNCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE1ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDYpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoNik7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsNikpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoNik7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE1ID4+PiAyNikpIHwgMDtcbiAgICB3MTUgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw3KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDcpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDcpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDcpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE2ID4+PiAyNikpIHwgMDtcbiAgICB3MTYgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw4KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDgpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDgpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDgpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzE3ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTcgPj4+IDI2KSkgfCAwO1xuICAgIHcxNyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE4ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDkpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoOSk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsOSkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoOSk7XG4gICAgdmFyIHcxOCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE4ID4+PiAyNikpIHwgMDtcbiAgICB3MTggJj0gMHgzZmZmZmZmO1xuICAgIG9bMF0gPSB3MDtcbiAgICBvWzFdID0gdzE7XG4gICAgb1syXSA9IHcyO1xuICAgIG9bM10gPSB3MztcbiAgICBvWzRdID0gdzQ7XG4gICAgb1s1XSA9IHc1O1xuICAgIG9bNl0gPSB3NjtcbiAgICBvWzddID0gdzc7XG4gICAgb1s4XSA9IHc4O1xuICAgIG9bOV0gPSB3OTtcbiAgICBvWzEwXSA9IHcxMDtcbiAgICBvWzExXSA9IHcxMTtcbiAgICBvWzEyXSA9IHcxMjtcbiAgICBvWzEzXSA9IHcxMztcbiAgICBvWzE0XSA9IHcxNDtcbiAgICBvWzE1XSA9IHcxNTtcbiAgICBvWzE2XSA9IHcxNjtcbiAgICBvWzE3XSA9IHcxNztcbiAgICBvWzE4XSA9IHcxODtcbiAgICBpZiAoYyAhPT0gMCkge1xuICAgICAgb1sxOV0gPSBjO1xuICAgICAgb3V0Lmxlbmd0aCsrO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9O1xuXG4gIC8vIFBvbHlmaWxsIGNvbWJcbiAgaWYgKCFNYXRoLmltdWwpIHtcbiAgICBjb21iMTBNdWxUbyA9IHNtYWxsTXVsVG87XG4gIH1cblxuICBmdW5jdGlvbiBiaWdNdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICBvdXQubmVnYXRpdmUgPSBudW0ubmVnYXRpdmUgXiBzZWxmLm5lZ2F0aXZlO1xuICAgIG91dC5sZW5ndGggPSBzZWxmLmxlbmd0aCArIG51bS5sZW5ndGg7XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIHZhciBobmNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IG91dC5sZW5ndGggLSAxOyBrKyspIHtcbiAgICAgIC8vIFN1bSBhbGwgd29yZHMgd2l0aCB0aGUgc2FtZSBgaSArIGogPSBrYCBhbmQgYWNjdW11bGF0ZSBgbmNhcnJ5YCxcbiAgICAgIC8vIG5vdGUgdGhhdCBuY2FycnkgY291bGQgYmUgPj0gMHgzZmZmZmZmXG4gICAgICB2YXIgbmNhcnJ5ID0gaG5jYXJyeTtcbiAgICAgIGhuY2FycnkgPSAwO1xuICAgICAgdmFyIHJ3b3JkID0gY2FycnkgJiAweDNmZmZmZmY7XG4gICAgICB2YXIgbWF4SiA9IE1hdGgubWluKGssIG51bS5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGogPSBNYXRoLm1heCgwLCBrIC0gc2VsZi5sZW5ndGggKyAxKTsgaiA8PSBtYXhKOyBqKyspIHtcbiAgICAgICAgdmFyIGkgPSBrIC0gajtcbiAgICAgICAgdmFyIGEgPSBzZWxmLndvcmRzW2ldIHwgMDtcbiAgICAgICAgdmFyIGIgPSBudW0ud29yZHNbal0gfCAwO1xuICAgICAgICB2YXIgciA9IGEgKiBiO1xuXG4gICAgICAgIHZhciBsbyA9IHIgJiAweDNmZmZmZmY7XG4gICAgICAgIG5jYXJyeSA9IChuY2FycnkgKyAoKHIgLyAweDQwMDAwMDApIHwgMCkpIHwgMDtcbiAgICAgICAgbG8gPSAobG8gKyByd29yZCkgfCAwO1xuICAgICAgICByd29yZCA9IGxvICYgMHgzZmZmZmZmO1xuICAgICAgICBuY2FycnkgPSAobmNhcnJ5ICsgKGxvID4+PiAyNikpIHwgMDtcblxuICAgICAgICBobmNhcnJ5ICs9IG5jYXJyeSA+Pj4gMjY7XG4gICAgICAgIG5jYXJyeSAmPSAweDNmZmZmZmY7XG4gICAgICB9XG4gICAgICBvdXQud29yZHNba10gPSByd29yZDtcbiAgICAgIGNhcnJ5ID0gbmNhcnJ5O1xuICAgICAgbmNhcnJ5ID0gaG5jYXJyeTtcbiAgICB9XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICBvdXQud29yZHNba10gPSBjYXJyeTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0Lmxlbmd0aC0tO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQuc3RyaXAoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGp1bWJvTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgdmFyIGZmdG0gPSBuZXcgRkZUTSgpO1xuICAgIHJldHVybiBmZnRtLm11bHAoc2VsZiwgbnVtLCBvdXQpO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLm11bFRvID0gZnVuY3Rpb24gbXVsVG8gKG51bSwgb3V0KSB7XG4gICAgdmFyIHJlcztcbiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGggKyBudW0ubGVuZ3RoO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMTAgJiYgbnVtLmxlbmd0aCA9PT0gMTApIHtcbiAgICAgIHJlcyA9IGNvbWIxME11bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9IGVsc2UgaWYgKGxlbiA8IDYzKSB7XG4gICAgICByZXMgPSBzbWFsbE11bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9IGVsc2UgaWYgKGxlbiA8IDEwMjQpIHtcbiAgICAgIHJlcyA9IGJpZ011bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0ganVtYm9NdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBDb29sZXktVHVrZXkgYWxnb3JpdGhtIGZvciBGRlRcbiAgLy8gc2xpZ2h0bHkgcmV2aXNpdGVkIHRvIHJlbHkgb24gbG9vcGluZyBpbnN0ZWFkIG9mIHJlY3Vyc2lvblxuXG4gIGZ1bmN0aW9uIEZGVE0gKHgsIHkpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gIH1cblxuICBGRlRNLnByb3RvdHlwZS5tYWtlUkJUID0gZnVuY3Rpb24gbWFrZVJCVCAoTikge1xuICAgIHZhciB0ID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBsID0gQk4ucHJvdG90eXBlLl9jb3VudEJpdHMoTikgLSAxO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICB0W2ldID0gdGhpcy5yZXZCaW4oaSwgbCwgTik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHQ7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBiaW5hcnktcmV2ZXJzZWQgcmVwcmVzZW50YXRpb24gb2YgYHhgXG4gIEZGVE0ucHJvdG90eXBlLnJldkJpbiA9IGZ1bmN0aW9uIHJldkJpbiAoeCwgbCwgTikge1xuICAgIGlmICh4ID09PSAwIHx8IHggPT09IE4gLSAxKSByZXR1cm4geDtcblxuICAgIHZhciByYiA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgIHJiIHw9ICh4ICYgMSkgPDwgKGwgLSBpIC0gMSk7XG4gICAgICB4ID4+PSAxO1xuICAgIH1cblxuICAgIHJldHVybiByYjtcbiAgfTtcblxuICAvLyBQZXJmb3JtcyBcInR3ZWVkbGluZ1wiIHBoYXNlLCB0aGVyZWZvcmUgJ2VtdWxhdGluZydcbiAgLy8gYmVoYXZpb3VyIG9mIHRoZSByZWN1cnNpdmUgYWxnb3JpdGhtXG4gIEZGVE0ucHJvdG90eXBlLnBlcm11dGUgPSBmdW5jdGlvbiBwZXJtdXRlIChyYnQsIHJ3cywgaXdzLCBydHdzLCBpdHdzLCBOKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHJ0d3NbaV0gPSByd3NbcmJ0W2ldXTtcbiAgICAgIGl0d3NbaV0gPSBpd3NbcmJ0W2ldXTtcbiAgICB9XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gdHJhbnNmb3JtIChyd3MsIGl3cywgcnR3cywgaXR3cywgTiwgcmJ0KSB7XG4gICAgdGhpcy5wZXJtdXRlKHJidCwgcndzLCBpd3MsIHJ0d3MsIGl0d3MsIE4pO1xuXG4gICAgZm9yICh2YXIgcyA9IDE7IHMgPCBOOyBzIDw8PSAxKSB7XG4gICAgICB2YXIgbCA9IHMgPDwgMTtcblxuICAgICAgdmFyIHJ0d2RmID0gTWF0aC5jb3MoMiAqIE1hdGguUEkgLyBsKTtcbiAgICAgIHZhciBpdHdkZiA9IE1hdGguc2luKDIgKiBNYXRoLlBJIC8gbCk7XG5cbiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgTjsgcCArPSBsKSB7XG4gICAgICAgIHZhciBydHdkZl8gPSBydHdkZjtcbiAgICAgICAgdmFyIGl0d2RmXyA9IGl0d2RmO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgczsgaisrKSB7XG4gICAgICAgICAgdmFyIHJlID0gcnR3c1twICsgal07XG4gICAgICAgICAgdmFyIGllID0gaXR3c1twICsgal07XG5cbiAgICAgICAgICB2YXIgcm8gPSBydHdzW3AgKyBqICsgc107XG4gICAgICAgICAgdmFyIGlvID0gaXR3c1twICsgaiArIHNdO1xuXG4gICAgICAgICAgdmFyIHJ4ID0gcnR3ZGZfICogcm8gLSBpdHdkZl8gKiBpbztcblxuICAgICAgICAgIGlvID0gcnR3ZGZfICogaW8gKyBpdHdkZl8gKiBybztcbiAgICAgICAgICBybyA9IHJ4O1xuXG4gICAgICAgICAgcnR3c1twICsgal0gPSByZSArIHJvO1xuICAgICAgICAgIGl0d3NbcCArIGpdID0gaWUgKyBpbztcblxuICAgICAgICAgIHJ0d3NbcCArIGogKyBzXSA9IHJlIC0gcm87XG4gICAgICAgICAgaXR3c1twICsgaiArIHNdID0gaWUgLSBpbztcblxuICAgICAgICAgIC8qIGpzaGludCBtYXhkZXB0aCA6IGZhbHNlICovXG4gICAgICAgICAgaWYgKGogIT09IGwpIHtcbiAgICAgICAgICAgIHJ4ID0gcnR3ZGYgKiBydHdkZl8gLSBpdHdkZiAqIGl0d2RmXztcblxuICAgICAgICAgICAgaXR3ZGZfID0gcnR3ZGYgKiBpdHdkZl8gKyBpdHdkZiAqIHJ0d2RmXztcbiAgICAgICAgICAgIHJ0d2RmXyA9IHJ4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5ndWVzc0xlbjEzYiA9IGZ1bmN0aW9uIGd1ZXNzTGVuMTNiIChuLCBtKSB7XG4gICAgdmFyIE4gPSBNYXRoLm1heChtLCBuKSB8IDE7XG4gICAgdmFyIG9kZCA9IE4gJiAxO1xuICAgIHZhciBpID0gMDtcbiAgICBmb3IgKE4gPSBOIC8gMiB8IDA7IE47IE4gPSBOID4+PiAxKSB7XG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIDEgPDwgaSArIDEgKyBvZGQ7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuY29uanVnYXRlID0gZnVuY3Rpb24gY29uanVnYXRlIChyd3MsIGl3cywgTikge1xuICAgIGlmIChOIDw9IDEpIHJldHVybjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTiAvIDI7IGkrKykge1xuICAgICAgdmFyIHQgPSByd3NbaV07XG5cbiAgICAgIHJ3c1tpXSA9IHJ3c1tOIC0gaSAtIDFdO1xuICAgICAgcndzW04gLSBpIC0gMV0gPSB0O1xuXG4gICAgICB0ID0gaXdzW2ldO1xuXG4gICAgICBpd3NbaV0gPSAtaXdzW04gLSBpIC0gMV07XG4gICAgICBpd3NbTiAtIGkgLSAxXSA9IC10O1xuICAgIH1cbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5ub3JtYWxpemUxM2IgPSBmdW5jdGlvbiBub3JtYWxpemUxM2IgKHdzLCBOKSB7XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE4gLyAyOyBpKyspIHtcbiAgICAgIHZhciB3ID0gTWF0aC5yb3VuZCh3c1syICogaSArIDFdIC8gTikgKiAweDIwMDAgK1xuICAgICAgICBNYXRoLnJvdW5kKHdzWzIgKiBpXSAvIE4pICtcbiAgICAgICAgY2Fycnk7XG5cbiAgICAgIHdzW2ldID0gdyAmIDB4M2ZmZmZmZjtcblxuICAgICAgaWYgKHcgPCAweDQwMDAwMDApIHtcbiAgICAgICAgY2FycnkgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FycnkgPSB3IC8gMHg0MDAwMDAwIHwgMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gd3M7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuY29udmVydDEzYiA9IGZ1bmN0aW9uIGNvbnZlcnQxM2IgKHdzLCBsZW4sIHJ3cywgTikge1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY2FycnkgPSBjYXJyeSArICh3c1tpXSB8IDApO1xuXG4gICAgICByd3NbMiAqIGldID0gY2FycnkgJiAweDFmZmY7IGNhcnJ5ID0gY2FycnkgPj4+IDEzO1xuICAgICAgcndzWzIgKiBpICsgMV0gPSBjYXJyeSAmIDB4MWZmZjsgY2FycnkgPSBjYXJyeSA+Pj4gMTM7XG4gICAgfVxuXG4gICAgLy8gUGFkIHdpdGggemVyb2VzXG4gICAgZm9yIChpID0gMiAqIGxlbjsgaSA8IE47ICsraSkge1xuICAgICAgcndzW2ldID0gMDtcbiAgICB9XG5cbiAgICBhc3NlcnQoY2FycnkgPT09IDApO1xuICAgIGFzc2VydCgoY2FycnkgJiB+MHgxZmZmKSA9PT0gMCk7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuc3R1YiA9IGZ1bmN0aW9uIHN0dWIgKE4pIHtcbiAgICB2YXIgcGggPSBuZXcgQXJyYXkoTik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHBoW2ldID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gcGg7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUubXVscCA9IGZ1bmN0aW9uIG11bHAgKHgsIHksIG91dCkge1xuICAgIHZhciBOID0gMiAqIHRoaXMuZ3Vlc3NMZW4xM2IoeC5sZW5ndGgsIHkubGVuZ3RoKTtcblxuICAgIHZhciByYnQgPSB0aGlzLm1ha2VSQlQoTik7XG5cbiAgICB2YXIgXyA9IHRoaXMuc3R1YihOKTtcblxuICAgIHZhciByd3MgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIHJ3c3QgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIGl3c3QgPSBuZXcgQXJyYXkoTik7XG5cbiAgICB2YXIgbnJ3cyA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgbnJ3c3QgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIG5pd3N0ID0gbmV3IEFycmF5KE4pO1xuXG4gICAgdmFyIHJtd3MgPSBvdXQud29yZHM7XG4gICAgcm13cy5sZW5ndGggPSBOO1xuXG4gICAgdGhpcy5jb252ZXJ0MTNiKHgud29yZHMsIHgubGVuZ3RoLCByd3MsIE4pO1xuICAgIHRoaXMuY29udmVydDEzYih5LndvcmRzLCB5Lmxlbmd0aCwgbnJ3cywgTik7XG5cbiAgICB0aGlzLnRyYW5zZm9ybShyd3MsIF8sIHJ3c3QsIGl3c3QsIE4sIHJidCk7XG4gICAgdGhpcy50cmFuc2Zvcm0obnJ3cywgXywgbnJ3c3QsIG5pd3N0LCBOLCByYnQpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHZhciByeCA9IHJ3c3RbaV0gKiBucndzdFtpXSAtIGl3c3RbaV0gKiBuaXdzdFtpXTtcbiAgICAgIGl3c3RbaV0gPSByd3N0W2ldICogbml3c3RbaV0gKyBpd3N0W2ldICogbnJ3c3RbaV07XG4gICAgICByd3N0W2ldID0gcng7XG4gICAgfVxuXG4gICAgdGhpcy5jb25qdWdhdGUocndzdCwgaXdzdCwgTik7XG4gICAgdGhpcy50cmFuc2Zvcm0ocndzdCwgaXdzdCwgcm13cywgXywgTiwgcmJ0KTtcbiAgICB0aGlzLmNvbmp1Z2F0ZShybXdzLCBfLCBOKTtcbiAgICB0aGlzLm5vcm1hbGl6ZTEzYihybXdzLCBOKTtcblxuICAgIG91dC5uZWdhdGl2ZSA9IHgubmVnYXRpdmUgXiB5Lm5lZ2F0aXZlO1xuICAgIG91dC5sZW5ndGggPSB4Lmxlbmd0aCArIHkubGVuZ3RoO1xuICAgIHJldHVybiBvdXQuc3RyaXAoKTtcbiAgfTtcblxuICAvLyBNdWx0aXBseSBgdGhpc2AgYnkgYG51bWBcbiAgQk4ucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bCAobnVtKSB7XG4gICAgdmFyIG91dCA9IG5ldyBCTihudWxsKTtcbiAgICBvdXQud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGggKyBudW0ubGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpcy5tdWxUbyhudW0sIG91dCk7XG4gIH07XG5cbiAgLy8gTXVsdGlwbHkgZW1wbG95aW5nIEZGVFxuICBCTi5wcm90b3R5cGUubXVsZiA9IGZ1bmN0aW9uIG11bGYgKG51bSkge1xuICAgIHZhciBvdXQgPSBuZXcgQk4obnVsbCk7XG4gICAgb3V0LndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoICsgbnVtLmxlbmd0aCk7XG4gICAgcmV0dXJuIGp1bWJvTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICB9O1xuXG4gIC8vIEluLXBsYWNlIE11bHRpcGxpY2F0aW9uXG4gIEJOLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24gaW11bCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5tdWxUbyhudW0sIHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pbXVsbiA9IGZ1bmN0aW9uIGltdWxuIChudW0pIHtcbiAgICBhc3NlcnQodHlwZW9mIG51bSA9PT0gJ251bWJlcicpO1xuICAgIGFzc2VydChudW0gPCAweDQwMDAwMDApO1xuXG4gICAgLy8gQ2FycnlcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHcgPSAodGhpcy53b3Jkc1tpXSB8IDApICogbnVtO1xuICAgICAgdmFyIGxvID0gKHcgJiAweDNmZmZmZmYpICsgKGNhcnJ5ICYgMHgzZmZmZmZmKTtcbiAgICAgIGNhcnJ5ID4+PSAyNjtcbiAgICAgIGNhcnJ5ICs9ICh3IC8gMHg0MDAwMDAwKSB8IDA7XG4gICAgICAvLyBOT1RFOiBsbyBpcyAyN2JpdCBtYXhpbXVtXG4gICAgICBjYXJyeSArPSBsbyA+Pj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gbG8gJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gY2Fycnk7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IG51bSA9PT0gMCA/IDEgOiB0aGlzLmxlbmd0aDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5tdWxuID0gZnVuY3Rpb24gbXVsbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbihudW0pO1xuICB9O1xuXG4gIC8vIGB0aGlzYCAqIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuc3FyID0gZnVuY3Rpb24gc3FyICgpIHtcbiAgICByZXR1cm4gdGhpcy5tdWwodGhpcyk7XG4gIH07XG5cbiAgLy8gYHRoaXNgICogYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pc3FyID0gZnVuY3Rpb24gaXNxciAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW11bCh0aGlzLmNsb25lKCkpO1xuICB9O1xuXG4gIC8vIE1hdGgucG93KGB0aGlzYCwgYG51bWApXG4gIEJOLnByb3RvdHlwZS5wb3cgPSBmdW5jdGlvbiBwb3cgKG51bSkge1xuICAgIHZhciB3ID0gdG9CaXRBcnJheShudW0pO1xuICAgIGlmICh3Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ldyBCTigxKTtcblxuICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXNcbiAgICB2YXIgcmVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHcubGVuZ3RoOyBpKyssIHJlcyA9IHJlcy5zcXIoKSkge1xuICAgICAgaWYgKHdbaV0gIT09IDApIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICgrK2kgPCB3Lmxlbmd0aCkge1xuICAgICAgZm9yICh2YXIgcSA9IHJlcy5zcXIoKTsgaSA8IHcubGVuZ3RoOyBpKyssIHEgPSBxLnNxcigpKSB7XG4gICAgICAgIGlmICh3W2ldID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICByZXMgPSByZXMubXVsKHEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gU2hpZnQtbGVmdCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXVzaGxuID0gZnVuY3Rpb24gaXVzaGxuIChiaXRzKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXRzID09PSAnbnVtYmVyJyAmJiBiaXRzID49IDApO1xuICAgIHZhciByID0gYml0cyAlIDI2O1xuICAgIHZhciBzID0gKGJpdHMgLSByKSAvIDI2O1xuICAgIHZhciBjYXJyeU1hc2sgPSAoMHgzZmZmZmZmID4+PiAoMjYgLSByKSkgPDwgKDI2IC0gcik7XG4gICAgdmFyIGk7XG5cbiAgICBpZiAociAhPT0gMCkge1xuICAgICAgdmFyIGNhcnJ5ID0gMDtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5ld0NhcnJ5ID0gdGhpcy53b3Jkc1tpXSAmIGNhcnJ5TWFzaztcbiAgICAgICAgdmFyIGMgPSAoKHRoaXMud29yZHNbaV0gfCAwKSAtIG5ld0NhcnJ5KSA8PCByO1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYyB8IGNhcnJ5O1xuICAgICAgICBjYXJyeSA9IG5ld0NhcnJ5ID4+PiAoMjYgLSByKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhcnJ5KSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBjYXJyeTtcbiAgICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocyAhPT0gMCkge1xuICAgICAgZm9yIChpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB0aGlzLndvcmRzW2kgKyBzXSA9IHRoaXMud29yZHNbaV07XG4gICAgICB9XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGVuZ3RoICs9IHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNobG4gPSBmdW5jdGlvbiBpc2hsbiAoYml0cykge1xuICAgIC8vIFRPRE8oaW5kdXRueSk6IGltcGxlbWVudCBtZVxuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdXNobG4oYml0cyk7XG4gIH07XG5cbiAgLy8gU2hpZnQtcmlnaHQgaW4tcGxhY2VcbiAgLy8gTk9URTogYGhpbnRgIGlzIGEgbG93ZXN0IGJpdCBiZWZvcmUgdHJhaWxpbmcgemVyb2VzXG4gIC8vIE5PVEU6IGlmIGBleHRlbmRlZGAgaXMgcHJlc2VudCAtIGl0IHdpbGwgYmUgZmlsbGVkIHdpdGggZGVzdHJveWVkIGJpdHNcbiAgQk4ucHJvdG90eXBlLml1c2hybiA9IGZ1bmN0aW9uIGl1c2hybiAoYml0cywgaGludCwgZXh0ZW5kZWQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdHMgPT09ICdudW1iZXInICYmIGJpdHMgPj0gMCk7XG4gICAgdmFyIGg7XG4gICAgaWYgKGhpbnQpIHtcbiAgICAgIGggPSAoaGludCAtIChoaW50ICUgMjYpKSAvIDI2O1xuICAgIH0gZWxzZSB7XG4gICAgICBoID0gMDtcbiAgICB9XG5cbiAgICB2YXIgciA9IGJpdHMgJSAyNjtcbiAgICB2YXIgcyA9IE1hdGgubWluKChiaXRzIC0gcikgLyAyNiwgdGhpcy5sZW5ndGgpO1xuICAgIHZhciBtYXNrID0gMHgzZmZmZmZmIF4gKCgweDNmZmZmZmYgPj4+IHIpIDw8IHIpO1xuICAgIHZhciBtYXNrZWRXb3JkcyA9IGV4dGVuZGVkO1xuXG4gICAgaCAtPSBzO1xuICAgIGggPSBNYXRoLm1heCgwLCBoKTtcblxuICAgIC8vIEV4dGVuZGVkIG1vZGUsIGNvcHkgbWFza2VkIHBhcnRcbiAgICBpZiAobWFza2VkV29yZHMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgICAgIG1hc2tlZFdvcmRzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICAgIG1hc2tlZFdvcmRzLmxlbmd0aCA9IHM7XG4gICAgfVxuXG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgIC8vIE5vLW9wLCB3ZSBzaG91bGQgbm90IG1vdmUgYW55dGhpbmcgYXQgYWxsXG4gICAgfSBlbHNlIGlmICh0aGlzLmxlbmd0aCA+IHMpIHtcbiAgICAgIHRoaXMubGVuZ3RoIC09IHM7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpICsgc107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAwO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgIH1cblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yIChpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDAgJiYgKGNhcnJ5ICE9PSAwIHx8IGkgPj0gaCk7IGktLSkge1xuICAgICAgdmFyIHdvcmQgPSB0aGlzLndvcmRzW2ldIHwgMDtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAoY2FycnkgPDwgKDI2IC0gcikpIHwgKHdvcmQgPj4+IHIpO1xuICAgICAgY2FycnkgPSB3b3JkICYgbWFzaztcbiAgICB9XG5cbiAgICAvLyBQdXNoIGNhcnJpZWQgYml0cyBhcyBhIG1hc2tcbiAgICBpZiAobWFza2VkV29yZHMgJiYgY2FycnkgIT09IDApIHtcbiAgICAgIG1hc2tlZFdvcmRzLndvcmRzW21hc2tlZFdvcmRzLmxlbmd0aCsrXSA9IGNhcnJ5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1swXSA9IDA7XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNocm4gPSBmdW5jdGlvbiBpc2hybiAoYml0cywgaGludCwgZXh0ZW5kZWQpIHtcbiAgICAvLyBUT0RPKGluZHV0bnkpOiBpbXBsZW1lbnQgbWVcbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXVzaHJuKGJpdHMsIGhpbnQsIGV4dGVuZGVkKTtcbiAgfTtcblxuICAvLyBTaGlmdC1sZWZ0XG4gIEJOLnByb3RvdHlwZS5zaGxuID0gZnVuY3Rpb24gc2hsbiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXNobG4oYml0cyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVzaGxuID0gZnVuY3Rpb24gdXNobG4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hsbihiaXRzKTtcbiAgfTtcblxuICAvLyBTaGlmdC1yaWdodFxuICBCTi5wcm90b3R5cGUuc2hybiA9IGZ1bmN0aW9uIHNocm4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaHJuKGJpdHMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51c2hybiA9IGZ1bmN0aW9uIHVzaHJuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNocm4oYml0cyk7XG4gIH07XG5cbiAgLy8gVGVzdCBpZiBuIGJpdCBpcyBzZXRcbiAgQk4ucHJvdG90eXBlLnRlc3RuID0gZnVuY3Rpb24gdGVzdG4gKGJpdCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0ID09PSAnbnVtYmVyJyAmJiBiaXQgPj0gMCk7XG4gICAgdmFyIHIgPSBiaXQgJSAyNjtcbiAgICB2YXIgcyA9IChiaXQgLSByKSAvIDI2O1xuICAgIHZhciBxID0gMSA8PCByO1xuXG4gICAgLy8gRmFzdCBjYXNlOiBiaXQgaXMgbXVjaCBoaWdoZXIgdGhhbiBhbGwgZXhpc3Rpbmcgd29yZHNcbiAgICBpZiAodGhpcy5sZW5ndGggPD0gcykgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gQ2hlY2sgYml0IGFuZCByZXR1cm5cbiAgICB2YXIgdyA9IHRoaXMud29yZHNbc107XG5cbiAgICByZXR1cm4gISEodyAmIHEpO1xuICB9O1xuXG4gIC8vIFJldHVybiBvbmx5IGxvd2VycyBiaXRzIG9mIG51bWJlciAoaW4tcGxhY2UpXG4gIEJOLnByb3RvdHlwZS5pbWFza24gPSBmdW5jdGlvbiBpbWFza24gKGJpdHMpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdHMgPT09ICdudW1iZXInICYmIGJpdHMgPj0gMCk7XG4gICAgdmFyIHIgPSBiaXRzICUgMjY7XG4gICAgdmFyIHMgPSAoYml0cyAtIHIpIC8gMjY7XG5cbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCwgJ2ltYXNrbiB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmUgbnVtYmVycycpO1xuXG4gICAgaWYgKHRoaXMubGVuZ3RoIDw9IHMpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmIChyICE9PSAwKSB7XG4gICAgICBzKys7XG4gICAgfVxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5taW4ocywgdGhpcy5sZW5ndGgpO1xuXG4gICAgaWYgKHIgIT09IDApIHtcbiAgICAgIHZhciBtYXNrID0gMHgzZmZmZmZmIF4gKCgweDNmZmZmZmYgPj4+IHIpIDw8IHIpO1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdICY9IG1hc2s7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gb25seSBsb3dlcnMgYml0cyBvZiBudW1iZXJcbiAgQk4ucHJvdG90eXBlLm1hc2tuID0gZnVuY3Rpb24gbWFza24gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmltYXNrbihiaXRzKTtcbiAgfTtcblxuICAvLyBBZGQgcGxhaW4gbnVtYmVyIGBudW1gIHRvIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuaWFkZG4gPSBmdW5jdGlvbiBpYWRkbiAobnVtKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBudW0gPT09ICdudW1iZXInKTtcbiAgICBhc3NlcnQobnVtIDwgMHg0MDAwMDAwKTtcbiAgICBpZiAobnVtIDwgMCkgcmV0dXJuIHRoaXMuaXN1Ym4oLW51bSk7XG5cbiAgICAvLyBQb3NzaWJsZSBzaWduIGNoYW5nZVxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBpZiAodGhpcy5sZW5ndGggPT09IDEgJiYgKHRoaXMud29yZHNbMF0gfCAwKSA8IG51bSkge1xuICAgICAgICB0aGlzLndvcmRzWzBdID0gbnVtIC0gKHRoaXMud29yZHNbMF0gfCAwKTtcbiAgICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHRoaXMuaXN1Ym4obnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIHdpdGhvdXQgY2hlY2tzXG4gICAgcmV0dXJuIHRoaXMuX2lhZGRuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pYWRkbiA9IGZ1bmN0aW9uIF9pYWRkbiAobnVtKSB7XG4gICAgdGhpcy53b3Jkc1swXSArPSBudW07XG5cbiAgICAvLyBDYXJyeVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGggJiYgdGhpcy53b3Jkc1tpXSA+PSAweDQwMDAwMDA7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSAtPSAweDQwMDAwMDA7XG4gICAgICBpZiAoaSA9PT0gdGhpcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHRoaXMud29yZHNbaSArIDFdID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMud29yZHNbaSArIDFdKys7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5sZW5ndGgsIGkgKyAxKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIFN1YnRyYWN0IHBsYWluIG51bWJlciBgbnVtYCBmcm9tIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuaXN1Ym4gPSBmdW5jdGlvbiBpc3VibiAobnVtKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBudW0gPT09ICdudW1iZXInKTtcbiAgICBhc3NlcnQobnVtIDwgMHg0MDAwMDAwKTtcbiAgICBpZiAobnVtIDwgMCkgcmV0dXJuIHRoaXMuaWFkZG4oLW51bSk7XG5cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmlhZGRuKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMud29yZHNbMF0gLT0gbnVtO1xuXG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPCAwKSB7XG4gICAgICB0aGlzLndvcmRzWzBdID0gLXRoaXMud29yZHNbMF07XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FycnlcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGggJiYgdGhpcy53b3Jkc1tpXSA8IDA7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldICs9IDB4NDAwMDAwMDtcbiAgICAgICAgdGhpcy53b3Jkc1tpICsgMV0gLT0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5hZGRuID0gZnVuY3Rpb24gYWRkbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkbihudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5zdWJuID0gZnVuY3Rpb24gc3VibiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc3VibihudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pYWJzID0gZnVuY3Rpb24gaWFicyAoKSB7XG4gICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuYWJzID0gZnVuY3Rpb24gYWJzICgpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlhYnMoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2lzaGxuc3VibXVsID0gZnVuY3Rpb24gX2lzaGxuc3VibXVsIChudW0sIG11bCwgc2hpZnQpIHtcbiAgICB2YXIgbGVuID0gbnVtLmxlbmd0aCArIHNoaWZ0O1xuICAgIHZhciBpO1xuXG4gICAgdGhpcy5fZXhwYW5kKGxlbik7XG5cbiAgICB2YXIgdztcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHcgPSAodGhpcy53b3Jkc1tpICsgc2hpZnRdIHwgMCkgKyBjYXJyeTtcbiAgICAgIHZhciByaWdodCA9IChudW0ud29yZHNbaV0gfCAwKSAqIG11bDtcbiAgICAgIHcgLT0gcmlnaHQgJiAweDNmZmZmZmY7XG4gICAgICBjYXJyeSA9ICh3ID4+IDI2KSAtICgocmlnaHQgLyAweDQwMDAwMDApIHwgMCk7XG4gICAgICB0aGlzLndvcmRzW2kgKyBzaGlmdF0gPSB3ICYgMHgzZmZmZmZmO1xuICAgIH1cbiAgICBmb3IgKDsgaSA8IHRoaXMubGVuZ3RoIC0gc2hpZnQ7IGkrKykge1xuICAgICAgdyA9ICh0aGlzLndvcmRzW2kgKyBzaGlmdF0gfCAwKSArIGNhcnJ5O1xuICAgICAgY2FycnkgPSB3ID4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpICsgc2hpZnRdID0gdyAmIDB4M2ZmZmZmZjtcbiAgICB9XG5cbiAgICBpZiAoY2FycnkgPT09IDApIHJldHVybiB0aGlzLnN0cmlwKCk7XG5cbiAgICAvLyBTdWJ0cmFjdGlvbiBvdmVyZmxvd1xuICAgIGFzc2VydChjYXJyeSA9PT0gLTEpO1xuICAgIGNhcnJ5ID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdyA9IC0odGhpcy53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHcgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdyAmIDB4M2ZmZmZmZjtcbiAgICB9XG4gICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fd29yZERpdiA9IGZ1bmN0aW9uIF93b3JkRGl2IChudW0sIG1vZGUpIHtcbiAgICB2YXIgc2hpZnQgPSB0aGlzLmxlbmd0aCAtIG51bS5sZW5ndGg7XG5cbiAgICB2YXIgYSA9IHRoaXMuY2xvbmUoKTtcbiAgICB2YXIgYiA9IG51bTtcblxuICAgIC8vIE5vcm1hbGl6ZVxuICAgIHZhciBiaGkgPSBiLndvcmRzW2IubGVuZ3RoIC0gMV0gfCAwO1xuICAgIHZhciBiaGlCaXRzID0gdGhpcy5fY291bnRCaXRzKGJoaSk7XG4gICAgc2hpZnQgPSAyNiAtIGJoaUJpdHM7XG4gICAgaWYgKHNoaWZ0ICE9PSAwKSB7XG4gICAgICBiID0gYi51c2hsbihzaGlmdCk7XG4gICAgICBhLml1c2hsbihzaGlmdCk7XG4gICAgICBiaGkgPSBiLndvcmRzW2IubGVuZ3RoIC0gMV0gfCAwO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgcXVvdGllbnRcbiAgICB2YXIgbSA9IGEubGVuZ3RoIC0gYi5sZW5ndGg7XG4gICAgdmFyIHE7XG5cbiAgICBpZiAobW9kZSAhPT0gJ21vZCcpIHtcbiAgICAgIHEgPSBuZXcgQk4obnVsbCk7XG4gICAgICBxLmxlbmd0aCA9IG0gKyAxO1xuICAgICAgcS53b3JkcyA9IG5ldyBBcnJheShxLmxlbmd0aCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcS53b3Jkc1tpXSA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRpZmYgPSBhLmNsb25lKCkuX2lzaGxuc3VibXVsKGIsIDEsIG0pO1xuICAgIGlmIChkaWZmLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICBhID0gZGlmZjtcbiAgICAgIGlmIChxKSB7XG4gICAgICAgIHEud29yZHNbbV0gPSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGogPSBtIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgIHZhciBxaiA9IChhLndvcmRzW2IubGVuZ3RoICsgal0gfCAwKSAqIDB4NDAwMDAwMCArXG4gICAgICAgIChhLndvcmRzW2IubGVuZ3RoICsgaiAtIDFdIHwgMCk7XG5cbiAgICAgIC8vIE5PVEU6IChxaiAvIGJoaSkgaXMgKDB4M2ZmZmZmZiAqIDB4NDAwMDAwMCArIDB4M2ZmZmZmZikgLyAweDIwMDAwMDAgbWF4XG4gICAgICAvLyAoMHg3ZmZmZmZmKVxuICAgICAgcWogPSBNYXRoLm1pbigocWogLyBiaGkpIHwgMCwgMHgzZmZmZmZmKTtcblxuICAgICAgYS5faXNobG5zdWJtdWwoYiwgcWosIGopO1xuICAgICAgd2hpbGUgKGEubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgcWotLTtcbiAgICAgICAgYS5uZWdhdGl2ZSA9IDA7XG4gICAgICAgIGEuX2lzaGxuc3VibXVsKGIsIDEsIGopO1xuICAgICAgICBpZiAoIWEuaXNaZXJvKCkpIHtcbiAgICAgICAgICBhLm5lZ2F0aXZlIF49IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChxKSB7XG4gICAgICAgIHEud29yZHNbal0gPSBxajtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHEpIHtcbiAgICAgIHEuc3RyaXAoKTtcbiAgICB9XG4gICAgYS5zdHJpcCgpO1xuXG4gICAgLy8gRGVub3JtYWxpemVcbiAgICBpZiAobW9kZSAhPT0gJ2RpdicgJiYgc2hpZnQgIT09IDApIHtcbiAgICAgIGEuaXVzaHJuKHNoaWZ0KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGl2OiBxIHx8IG51bGwsXG4gICAgICBtb2Q6IGFcbiAgICB9O1xuICB9O1xuXG4gIC8vIE5PVEU6IDEpIGBtb2RlYCBjYW4gYmUgc2V0IHRvIGBtb2RgIHRvIHJlcXVlc3QgbW9kIG9ubHksXG4gIC8vICAgICAgIHRvIGBkaXZgIHRvIHJlcXVlc3QgZGl2IG9ubHksIG9yIGJlIGFic2VudCB0b1xuICAvLyAgICAgICByZXF1ZXN0IGJvdGggZGl2ICYgbW9kXG4gIC8vICAgICAgIDIpIGBwb3NpdGl2ZWAgaXMgdHJ1ZSBpZiB1bnNpZ25lZCBtb2QgaXMgcmVxdWVzdGVkXG4gIEJOLnByb3RvdHlwZS5kaXZtb2QgPSBmdW5jdGlvbiBkaXZtb2QgKG51bSwgbW9kZSwgcG9zaXRpdmUpIHtcbiAgICBhc3NlcnQoIW51bS5pc1plcm8oKSk7XG5cbiAgICBpZiAodGhpcy5pc1plcm8oKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiBuZXcgQk4oMCksXG4gICAgICAgIG1vZDogbmV3IEJOKDApXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBkaXYsIG1vZCwgcmVzO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIG51bS5uZWdhdGl2ZSA9PT0gMCkge1xuICAgICAgcmVzID0gdGhpcy5uZWcoKS5kaXZtb2QobnVtLCBtb2RlKTtcblxuICAgICAgaWYgKG1vZGUgIT09ICdtb2QnKSB7XG4gICAgICAgIGRpdiA9IHJlcy5kaXYubmVnKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2RlICE9PSAnZGl2Jykge1xuICAgICAgICBtb2QgPSByZXMubW9kLm5lZygpO1xuICAgICAgICBpZiAocG9zaXRpdmUgJiYgbW9kLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgICAgbW9kLmlhZGQobnVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IGRpdixcbiAgICAgICAgbW9kOiBtb2RcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbnVtLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICByZXMgPSB0aGlzLmRpdm1vZChudW0ubmVnKCksIG1vZGUpO1xuXG4gICAgICBpZiAobW9kZSAhPT0gJ21vZCcpIHtcbiAgICAgICAgZGl2ID0gcmVzLmRpdi5uZWcoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiBkaXYsXG4gICAgICAgIG1vZDogcmVzLm1vZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoKHRoaXMubmVnYXRpdmUgJiBudW0ubmVnYXRpdmUpICE9PSAwKSB7XG4gICAgICByZXMgPSB0aGlzLm5lZygpLmRpdm1vZChudW0ubmVnKCksIG1vZGUpO1xuXG4gICAgICBpZiAobW9kZSAhPT0gJ2RpdicpIHtcbiAgICAgICAgbW9kID0gcmVzLm1vZC5uZWcoKTtcbiAgICAgICAgaWYgKHBvc2l0aXZlICYmIG1vZC5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICAgIG1vZC5pc3ViKG51bSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiByZXMuZGl2LFxuICAgICAgICBtb2Q6IG1vZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBCb3RoIG51bWJlcnMgYXJlIHBvc2l0aXZlIGF0IHRoaXMgcG9pbnRcblxuICAgIC8vIFN0cmlwIGJvdGggbnVtYmVycyB0byBhcHByb3hpbWF0ZSBzaGlmdCB2YWx1ZVxuICAgIGlmIChudW0ubGVuZ3RoID4gdGhpcy5sZW5ndGggfHwgdGhpcy5jbXAobnVtKSA8IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogbmV3IEJOKDApLFxuICAgICAgICBtb2Q6IHRoaXNcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVmVyeSBzaG9ydCByZWR1Y3Rpb25cbiAgICBpZiAobnVtLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKG1vZGUgPT09ICdkaXYnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGl2OiB0aGlzLmRpdm4obnVtLndvcmRzWzBdKSxcbiAgICAgICAgICBtb2Q6IG51bGxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGUgPT09ICdtb2QnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGl2OiBudWxsLFxuICAgICAgICAgIG1vZDogbmV3IEJOKHRoaXMubW9kbihudW0ud29yZHNbMF0pKVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IHRoaXMuZGl2bihudW0ud29yZHNbMF0pLFxuICAgICAgICBtb2Q6IG5ldyBCTih0aGlzLm1vZG4obnVtLndvcmRzWzBdKSlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3dvcmREaXYobnVtLCBtb2RlKTtcbiAgfTtcblxuICAvLyBGaW5kIGB0aGlzYCAvIGBudW1gXG4gIEJOLnByb3RvdHlwZS5kaXYgPSBmdW5jdGlvbiBkaXYgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmRpdm1vZChudW0sICdkaXYnLCBmYWxzZSkuZGl2O1xuICB9O1xuXG4gIC8vIEZpbmQgYHRoaXNgICUgYG51bWBcbiAgQk4ucHJvdG90eXBlLm1vZCA9IGZ1bmN0aW9uIG1vZCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2bW9kKG51bSwgJ21vZCcsIGZhbHNlKS5tb2Q7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVtb2QgPSBmdW5jdGlvbiB1bW9kIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5kaXZtb2QobnVtLCAnbW9kJywgdHJ1ZSkubW9kO1xuICB9O1xuXG4gIC8vIEZpbmQgUm91bmQoYHRoaXNgIC8gYG51bWApXG4gIEJOLnByb3RvdHlwZS5kaXZSb3VuZCA9IGZ1bmN0aW9uIGRpdlJvdW5kIChudW0pIHtcbiAgICB2YXIgZG0gPSB0aGlzLmRpdm1vZChudW0pO1xuXG4gICAgLy8gRmFzdCBjYXNlIC0gZXhhY3QgZGl2aXNpb25cbiAgICBpZiAoZG0ubW9kLmlzWmVybygpKSByZXR1cm4gZG0uZGl2O1xuXG4gICAgdmFyIG1vZCA9IGRtLmRpdi5uZWdhdGl2ZSAhPT0gMCA/IGRtLm1vZC5pc3ViKG51bSkgOiBkbS5tb2Q7XG5cbiAgICB2YXIgaGFsZiA9IG51bS51c2hybigxKTtcbiAgICB2YXIgcjIgPSBudW0uYW5kbG4oMSk7XG4gICAgdmFyIGNtcCA9IG1vZC5jbXAoaGFsZik7XG5cbiAgICAvLyBSb3VuZCBkb3duXG4gICAgaWYgKGNtcCA8IDAgfHwgcjIgPT09IDEgJiYgY21wID09PSAwKSByZXR1cm4gZG0uZGl2O1xuXG4gICAgLy8gUm91bmQgdXBcbiAgICByZXR1cm4gZG0uZGl2Lm5lZ2F0aXZlICE9PSAwID8gZG0uZGl2LmlzdWJuKDEpIDogZG0uZGl2LmlhZGRuKDEpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5tb2RuID0gZnVuY3Rpb24gbW9kbiAobnVtKSB7XG4gICAgYXNzZXJ0KG51bSA8PSAweDNmZmZmZmYpO1xuICAgIHZhciBwID0gKDEgPDwgMjYpICUgbnVtO1xuXG4gICAgdmFyIGFjYyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGFjYyA9IChwICogYWNjICsgKHRoaXMud29yZHNbaV0gfCAwKSkgJSBudW07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcbiAgfTtcblxuICAvLyBJbi1wbGFjZSBkaXZpc2lvbiBieSBudW1iZXJcbiAgQk4ucHJvdG90eXBlLmlkaXZuID0gZnVuY3Rpb24gaWRpdm4gKG51bSkge1xuICAgIGFzc2VydChudW0gPD0gMHgzZmZmZmZmKTtcblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciB3ID0gKHRoaXMud29yZHNbaV0gfCAwKSArIGNhcnJ5ICogMHg0MDAwMDAwO1xuICAgICAgdGhpcy53b3Jkc1tpXSA9ICh3IC8gbnVtKSB8IDA7XG4gICAgICBjYXJyeSA9IHcgJSBudW07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZGl2biA9IGZ1bmN0aW9uIGRpdm4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWRpdm4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZWdjZCA9IGZ1bmN0aW9uIGVnY2QgKHApIHtcbiAgICBhc3NlcnQocC5uZWdhdGl2ZSA9PT0gMCk7XG4gICAgYXNzZXJ0KCFwLmlzWmVybygpKTtcblxuICAgIHZhciB4ID0gdGhpcztcbiAgICB2YXIgeSA9IHAuY2xvbmUoKTtcblxuICAgIGlmICh4Lm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICB4ID0geC51bW9kKHApO1xuICAgIH0gZWxzZSB7XG4gICAgICB4ID0geC5jbG9uZSgpO1xuICAgIH1cblxuICAgIC8vIEEgKiB4ICsgQiAqIHkgPSB4XG4gICAgdmFyIEEgPSBuZXcgQk4oMSk7XG4gICAgdmFyIEIgPSBuZXcgQk4oMCk7XG5cbiAgICAvLyBDICogeCArIEQgKiB5ID0geVxuICAgIHZhciBDID0gbmV3IEJOKDApO1xuICAgIHZhciBEID0gbmV3IEJOKDEpO1xuXG4gICAgdmFyIGcgPSAwO1xuXG4gICAgd2hpbGUgKHguaXNFdmVuKCkgJiYgeS5pc0V2ZW4oKSkge1xuICAgICAgeC5pdXNocm4oMSk7XG4gICAgICB5Lml1c2hybigxKTtcbiAgICAgICsrZztcbiAgICB9XG5cbiAgICB2YXIgeXAgPSB5LmNsb25lKCk7XG4gICAgdmFyIHhwID0geC5jbG9uZSgpO1xuXG4gICAgd2hpbGUgKCF4LmlzWmVybygpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaW0gPSAxOyAoeC53b3Jkc1swXSAmIGltKSA9PT0gMCAmJiBpIDwgMjY7ICsraSwgaW0gPDw9IDEpO1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIHguaXVzaHJuKGkpO1xuICAgICAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgICAgIGlmIChBLmlzT2RkKCkgfHwgQi5pc09kZCgpKSB7XG4gICAgICAgICAgICBBLmlhZGQoeXApO1xuICAgICAgICAgICAgQi5pc3ViKHhwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBBLml1c2hybigxKTtcbiAgICAgICAgICBCLml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBqID0gMCwgam0gPSAxOyAoeS53b3Jkc1swXSAmIGptKSA9PT0gMCAmJiBqIDwgMjY7ICsraiwgam0gPDw9IDEpO1xuICAgICAgaWYgKGogPiAwKSB7XG4gICAgICAgIHkuaXVzaHJuKGopO1xuICAgICAgICB3aGlsZSAoai0tID4gMCkge1xuICAgICAgICAgIGlmIChDLmlzT2RkKCkgfHwgRC5pc09kZCgpKSB7XG4gICAgICAgICAgICBDLmlhZGQoeXApO1xuICAgICAgICAgICAgRC5pc3ViKHhwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBDLml1c2hybigxKTtcbiAgICAgICAgICBELml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoeC5jbXAoeSkgPj0gMCkge1xuICAgICAgICB4LmlzdWIoeSk7XG4gICAgICAgIEEuaXN1YihDKTtcbiAgICAgICAgQi5pc3ViKEQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeS5pc3ViKHgpO1xuICAgICAgICBDLmlzdWIoQSk7XG4gICAgICAgIEQuaXN1YihCKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYTogQyxcbiAgICAgIGI6IEQsXG4gICAgICBnY2Q6IHkuaXVzaGxuKGcpXG4gICAgfTtcbiAgfTtcblxuICAvLyBUaGlzIGlzIHJlZHVjZWQgaW5jYXJuYXRpb24gb2YgdGhlIGJpbmFyeSBFRUFcbiAgLy8gYWJvdmUsIGRlc2lnbmF0ZWQgdG8gaW52ZXJ0IG1lbWJlcnMgb2YgdGhlXG4gIC8vIF9wcmltZV8gZmllbGRzIEYocCkgYXQgYSBtYXhpbWFsIHNwZWVkXG4gIEJOLnByb3RvdHlwZS5faW52bXAgPSBmdW5jdGlvbiBfaW52bXAgKHApIHtcbiAgICBhc3NlcnQocC5uZWdhdGl2ZSA9PT0gMCk7XG4gICAgYXNzZXJ0KCFwLmlzWmVybygpKTtcblxuICAgIHZhciBhID0gdGhpcztcbiAgICB2YXIgYiA9IHAuY2xvbmUoKTtcblxuICAgIGlmIChhLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBhID0gYS51bW9kKHApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gYS5jbG9uZSgpO1xuICAgIH1cblxuICAgIHZhciB4MSA9IG5ldyBCTigxKTtcbiAgICB2YXIgeDIgPSBuZXcgQk4oMCk7XG5cbiAgICB2YXIgZGVsdGEgPSBiLmNsb25lKCk7XG5cbiAgICB3aGlsZSAoYS5jbXBuKDEpID4gMCAmJiBiLmNtcG4oMSkgPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaW0gPSAxOyAoYS53b3Jkc1swXSAmIGltKSA9PT0gMCAmJiBpIDwgMjY7ICsraSwgaW0gPDw9IDEpO1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGEuaXVzaHJuKGkpO1xuICAgICAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgICAgIGlmICh4MS5pc09kZCgpKSB7XG4gICAgICAgICAgICB4MS5pYWRkKGRlbHRhKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB4MS5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaiA9IDAsIGptID0gMTsgKGIud29yZHNbMF0gJiBqbSkgPT09IDAgJiYgaiA8IDI2OyArK2osIGptIDw8PSAxKTtcbiAgICAgIGlmIChqID4gMCkge1xuICAgICAgICBiLml1c2hybihqKTtcbiAgICAgICAgd2hpbGUgKGotLSA+IDApIHtcbiAgICAgICAgICBpZiAoeDIuaXNPZGQoKSkge1xuICAgICAgICAgICAgeDIuaWFkZChkZWx0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgeDIuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhLmNtcChiKSA+PSAwKSB7XG4gICAgICAgIGEuaXN1YihiKTtcbiAgICAgICAgeDEuaXN1Yih4Mik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiLmlzdWIoYSk7XG4gICAgICAgIHgyLmlzdWIoeDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZXM7XG4gICAgaWYgKGEuY21wbigxKSA9PT0gMCkge1xuICAgICAgcmVzID0geDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IHgyO1xuICAgIH1cblxuICAgIGlmIChyZXMuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcy5pYWRkKHApO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmdjZCA9IGZ1bmN0aW9uIGdjZCAobnVtKSB7XG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpIHJldHVybiBudW0uYWJzKCk7XG4gICAgaWYgKG51bS5pc1plcm8oKSkgcmV0dXJuIHRoaXMuYWJzKCk7XG5cbiAgICB2YXIgYSA9IHRoaXMuY2xvbmUoKTtcbiAgICB2YXIgYiA9IG51bS5jbG9uZSgpO1xuICAgIGEubmVnYXRpdmUgPSAwO1xuICAgIGIubmVnYXRpdmUgPSAwO1xuXG4gICAgLy8gUmVtb3ZlIGNvbW1vbiBmYWN0b3Igb2YgdHdvXG4gICAgZm9yICh2YXIgc2hpZnQgPSAwOyBhLmlzRXZlbigpICYmIGIuaXNFdmVuKCk7IHNoaWZ0KyspIHtcbiAgICAgIGEuaXVzaHJuKDEpO1xuICAgICAgYi5pdXNocm4oMSk7XG4gICAgfVxuXG4gICAgZG8ge1xuICAgICAgd2hpbGUgKGEuaXNFdmVuKCkpIHtcbiAgICAgICAgYS5pdXNocm4oMSk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoYi5pc0V2ZW4oKSkge1xuICAgICAgICBiLml1c2hybigxKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHIgPSBhLmNtcChiKTtcbiAgICAgIGlmIChyIDwgMCkge1xuICAgICAgICAvLyBTd2FwIGBhYCBhbmQgYGJgIHRvIG1ha2UgYGFgIGFsd2F5cyBiaWdnZXIgdGhhbiBgYmBcbiAgICAgICAgdmFyIHQgPSBhO1xuICAgICAgICBhID0gYjtcbiAgICAgICAgYiA9IHQ7XG4gICAgICB9IGVsc2UgaWYgKHIgPT09IDAgfHwgYi5jbXBuKDEpID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBhLmlzdWIoYik7XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgICByZXR1cm4gYi5pdXNobG4oc2hpZnQpO1xuICB9O1xuXG4gIC8vIEludmVydCBudW1iZXIgaW4gdGhlIGZpZWxkIEYobnVtKVxuICBCTi5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uIGludm0gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmVnY2QobnVtKS5hLnVtb2QobnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNFdmVuID0gZnVuY3Rpb24gaXNFdmVuICgpIHtcbiAgICByZXR1cm4gKHRoaXMud29yZHNbMF0gJiAxKSA9PT0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNPZGQgPSBmdW5jdGlvbiBpc09kZCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLndvcmRzWzBdICYgMSkgPT09IDE7XG4gIH07XG5cbiAgLy8gQW5kIGZpcnN0IHdvcmQgYW5kIG51bVxuICBCTi5wcm90b3R5cGUuYW5kbG4gPSBmdW5jdGlvbiBhbmRsbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMud29yZHNbMF0gJiBudW07XG4gIH07XG5cbiAgLy8gSW5jcmVtZW50IGF0IHRoZSBiaXQgcG9zaXRpb24gaW4tbGluZVxuICBCTi5wcm90b3R5cGUuYmluY24gPSBmdW5jdGlvbiBiaW5jbiAoYml0KSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXQgPT09ICdudW1iZXInKTtcbiAgICB2YXIgciA9IGJpdCAlIDI2O1xuICAgIHZhciBzID0gKGJpdCAtIHIpIC8gMjY7XG4gICAgdmFyIHEgPSAxIDw8IHI7XG5cbiAgICAvLyBGYXN0IGNhc2U6IGJpdCBpcyBtdWNoIGhpZ2hlciB0aGFuIGFsbCBleGlzdGluZyB3b3Jkc1xuICAgIGlmICh0aGlzLmxlbmd0aCA8PSBzKSB7XG4gICAgICB0aGlzLl9leHBhbmQocyArIDEpO1xuICAgICAgdGhpcy53b3Jkc1tzXSB8PSBxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIGJpdCBhbmQgcHJvcGFnYXRlLCBpZiBuZWVkZWRcbiAgICB2YXIgY2FycnkgPSBxO1xuICAgIGZvciAodmFyIGkgPSBzOyBjYXJyeSAhPT0gMCAmJiBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHcgPSB0aGlzLndvcmRzW2ldIHwgMDtcbiAgICAgIHcgKz0gY2Fycnk7XG4gICAgICBjYXJyeSA9IHcgPj4+IDI2O1xuICAgICAgdyAmPSAweDNmZmZmZmY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdztcbiAgICB9XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gY2Fycnk7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNaZXJvID0gZnVuY3Rpb24gaXNaZXJvICgpIHtcbiAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA9PT0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuY21wbiA9IGZ1bmN0aW9uIGNtcG4gKG51bSkge1xuICAgIHZhciBuZWdhdGl2ZSA9IG51bSA8IDA7XG5cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiAhbmVnYXRpdmUpIHJldHVybiAtMTtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBuZWdhdGl2ZSkgcmV0dXJuIDE7XG5cbiAgICB0aGlzLnN0cmlwKCk7XG5cbiAgICB2YXIgcmVzO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJlcyA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZWdhdGl2ZSkge1xuICAgICAgICBudW0gPSAtbnVtO1xuICAgICAgfVxuXG4gICAgICBhc3NlcnQobnVtIDw9IDB4M2ZmZmZmZiwgJ051bWJlciBpcyB0b28gYmlnJyk7XG5cbiAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1swXSB8IDA7XG4gICAgICByZXMgPSB3ID09PSBudW0gPyAwIDogdyA8IG51bSA/IC0xIDogMTtcbiAgICB9XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHJldHVybiAtcmVzIHwgMDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIENvbXBhcmUgdHdvIG51bWJlcnMgYW5kIHJldHVybjpcbiAgLy8gMSAtIGlmIGB0aGlzYCA+IGBudW1gXG4gIC8vIDAgLSBpZiBgdGhpc2AgPT0gYG51bWBcbiAgLy8gLTEgLSBpZiBgdGhpc2AgPCBgbnVtYFxuICBCTi5wcm90b3R5cGUuY21wID0gZnVuY3Rpb24gY21wIChudW0pIHtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBudW0ubmVnYXRpdmUgPT09IDApIHJldHVybiAtMTtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBudW0ubmVnYXRpdmUgIT09IDApIHJldHVybiAxO1xuXG4gICAgdmFyIHJlcyA9IHRoaXMudWNtcChudW0pO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSByZXR1cm4gLXJlcyB8IDA7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBVbnNpZ25lZCBjb21wYXJpc29uXG4gIEJOLnByb3RvdHlwZS51Y21wID0gZnVuY3Rpb24gdWNtcCAobnVtKSB7XG4gICAgLy8gQXQgdGhpcyBwb2ludCBib3RoIG51bWJlcnMgaGF2ZSB0aGUgc2FtZSBzaWduXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIDE7XG4gICAgaWYgKHRoaXMubGVuZ3RoIDwgbnVtLmxlbmd0aCkgcmV0dXJuIC0xO1xuXG4gICAgdmFyIHJlcyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBhID0gdGhpcy53b3Jkc1tpXSB8IDA7XG4gICAgICB2YXIgYiA9IG51bS53b3Jkc1tpXSB8IDA7XG5cbiAgICAgIGlmIChhID09PSBiKSBjb250aW51ZTtcbiAgICAgIGlmIChhIDwgYikge1xuICAgICAgICByZXMgPSAtMTtcbiAgICAgIH0gZWxzZSBpZiAoYSA+IGIpIHtcbiAgICAgICAgcmVzID0gMTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndG4gPSBmdW5jdGlvbiBndG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA9PT0gMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3QgPSBmdW5jdGlvbiBndCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPT09IDE7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0ZW4gPSBmdW5jdGlvbiBndGVuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPj0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3RlID0gZnVuY3Rpb24gZ3RlIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA+PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdG4gPSBmdW5jdGlvbiBsdG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA9PT0gLTE7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0ID0gZnVuY3Rpb24gbHQgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID09PSAtMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHRlbiA9IGZ1bmN0aW9uIGx0ZW4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA8PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdGUgPSBmdW5jdGlvbiBsdGUgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pIDw9IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmVxbiA9IGZ1bmN0aW9uIGVxbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID09PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA9PT0gMDtcbiAgfTtcblxuICAvL1xuICAvLyBBIHJlZHVjZSBjb250ZXh0LCBjb3VsZCBiZSB1c2luZyBtb250Z29tZXJ5IG9yIHNvbWV0aGluZyBiZXR0ZXIsIGRlcGVuZGluZ1xuICAvLyBvbiB0aGUgYG1gIGl0c2VsZi5cbiAgLy9cbiAgQk4ucmVkID0gZnVuY3Rpb24gcmVkIChudW0pIHtcbiAgICByZXR1cm4gbmV3IFJlZChudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b1JlZCA9IGZ1bmN0aW9uIHRvUmVkIChjdHgpIHtcbiAgICBhc3NlcnQoIXRoaXMucmVkLCAnQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCcpO1xuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwLCAncmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMnKTtcbiAgICByZXR1cm4gY3R4LmNvbnZlcnRUbyh0aGlzKS5fZm9yY2VSZWQoY3R4KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZnJvbVJlZCA9IGZ1bmN0aW9uIGZyb21SZWQgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ2Zyb21SZWQgd29ya3Mgb25seSB3aXRoIG51bWJlcnMgaW4gcmVkdWN0aW9uIGNvbnRleHQnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuY29udmVydEZyb20odGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9mb3JjZVJlZCA9IGZ1bmN0aW9uIF9mb3JjZVJlZCAoY3R4KSB7XG4gICAgdGhpcy5yZWQgPSBjdHg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmZvcmNlUmVkID0gZnVuY3Rpb24gZm9yY2VSZWQgKGN0eCkge1xuICAgIGFzc2VydCghdGhpcy5yZWQsICdBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0Jyk7XG4gICAgcmV0dXJuIHRoaXMuX2ZvcmNlUmVkKGN0eCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZEFkZCA9IGZ1bmN0aW9uIHJlZEFkZCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5hZGQodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSUFkZCA9IGZ1bmN0aW9uIHJlZElBZGQgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZElBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmlhZGQodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkU3ViID0gZnVuY3Rpb24gcmVkU3ViIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnN1Yih0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJU3ViID0gZnVuY3Rpb24gcmVkSVN1YiAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSVN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaXN1Yih0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRTaGwgPSBmdW5jdGlvbiByZWRTaGwgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFNobCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc2hsKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZE11bCA9IGZ1bmN0aW9uIHJlZE11bCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsIG51bSk7XG4gICAgcmV0dXJuIHRoaXMucmVkLm11bCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJTXVsID0gZnVuY3Rpb24gcmVkSU11bCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsIG51bSk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmltdWwodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkU3FyID0gZnVuY3Rpb24gcmVkU3FyICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnNxcih0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSVNxciA9IGZ1bmN0aW9uIHJlZElTcXIgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZElTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmlzcXIodGhpcyk7XG4gIH07XG5cbiAgLy8gU3F1YXJlIHJvb3Qgb3ZlciBwXG4gIEJOLnByb3RvdHlwZS5yZWRTcXJ0ID0gZnVuY3Rpb24gcmVkU3FydCAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU3FydCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc3FydCh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSW52bSA9IGZ1bmN0aW9uIHJlZEludm0gKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZEludm0gd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmludm0odGhpcyk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG5lZ2F0aXZlIGNsb25lIG9mIGB0aGlzYCAlIGByZWQgbW9kdWxvYFxuICBCTi5wcm90b3R5cGUucmVkTmVnID0gZnVuY3Rpb24gcmVkTmVnICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWROZWcgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLm5lZyh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkUG93ID0gZnVuY3Rpb24gcmVkUG93IChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQgJiYgIW51bS5yZWQsICdyZWRQb3cobm9ybWFsTnVtKScpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5wb3codGhpcywgbnVtKTtcbiAgfTtcblxuICAvLyBQcmltZSBudW1iZXJzIHdpdGggZWZmaWNpZW50IHJlZHVjdGlvblxuICB2YXIgcHJpbWVzID0ge1xuICAgIGsyNTY6IG51bGwsXG4gICAgcDIyNDogbnVsbCxcbiAgICBwMTkyOiBudWxsLFxuICAgIHAyNTUxOTogbnVsbFxuICB9O1xuXG4gIC8vIFBzZXVkby1NZXJzZW5uZSBwcmltZVxuICBmdW5jdGlvbiBNUHJpbWUgKG5hbWUsIHApIHtcbiAgICAvLyBQID0gMiBeIE4gLSBLXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnAgPSBuZXcgQk4ocCwgMTYpO1xuICAgIHRoaXMubiA9IHRoaXMucC5iaXRMZW5ndGgoKTtcbiAgICB0aGlzLmsgPSBuZXcgQk4oMSkuaXVzaGxuKHRoaXMubikuaXN1Yih0aGlzLnApO1xuXG4gICAgdGhpcy50bXAgPSB0aGlzLl90bXAoKTtcbiAgfVxuXG4gIE1QcmltZS5wcm90b3R5cGUuX3RtcCA9IGZ1bmN0aW9uIF90bXAgKCkge1xuICAgIHZhciB0bXAgPSBuZXcgQk4obnVsbCk7XG4gICAgdG1wLndvcmRzID0gbmV3IEFycmF5KE1hdGguY2VpbCh0aGlzLm4gLyAxMykpO1xuICAgIHJldHVybiB0bXA7XG4gIH07XG5cbiAgTVByaW1lLnByb3RvdHlwZS5pcmVkdWNlID0gZnVuY3Rpb24gaXJlZHVjZSAobnVtKSB7XG4gICAgLy8gQXNzdW1lcyB0aGF0IGBudW1gIGlzIGxlc3MgdGhhbiBgUF4yYFxuICAgIC8vIG51bSA9IEhJICogKDIgXiBOIC0gSykgKyBISSAqIEsgKyBMTyA9IEhJICogSyArIExPIChtb2QgUClcbiAgICB2YXIgciA9IG51bTtcbiAgICB2YXIgcmxlbjtcblxuICAgIGRvIHtcbiAgICAgIHRoaXMuc3BsaXQociwgdGhpcy50bXApO1xuICAgICAgciA9IHRoaXMuaW11bEsocik7XG4gICAgICByID0gci5pYWRkKHRoaXMudG1wKTtcbiAgICAgIHJsZW4gPSByLmJpdExlbmd0aCgpO1xuICAgIH0gd2hpbGUgKHJsZW4gPiB0aGlzLm4pO1xuXG4gICAgdmFyIGNtcCA9IHJsZW4gPCB0aGlzLm4gPyAtMSA6IHIudWNtcCh0aGlzLnApO1xuICAgIGlmIChjbXAgPT09IDApIHtcbiAgICAgIHIud29yZHNbMF0gPSAwO1xuICAgICAgci5sZW5ndGggPSAxO1xuICAgIH0gZWxzZSBpZiAoY21wID4gMCkge1xuICAgICAgci5pc3ViKHRoaXMucCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyLnN0cmlwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gciBpcyBCTiB2NCBpbnN0YW5jZVxuICAgICAgICByLnN0cmlwKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByIGlzIEJOIHY1IGluc3RhbmNlXG4gICAgICAgIHIuX3N0cmlwKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgTVByaW1lLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uIHNwbGl0IChpbnB1dCwgb3V0KSB7XG4gICAgaW5wdXQuaXVzaHJuKHRoaXMubiwgMCwgb3V0KTtcbiAgfTtcblxuICBNUHJpbWUucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24gaW11bEsgKG51bSkge1xuICAgIHJldHVybiBudW0uaW11bCh0aGlzLmspO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEsyNTYgKCkge1xuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICdrMjU2JyxcbiAgICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZicpO1xuICB9XG4gIGluaGVyaXRzKEsyNTYsIE1QcmltZSk7XG5cbiAgSzI1Ni5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbiBzcGxpdCAoaW5wdXQsIG91dHB1dCkge1xuICAgIC8vIDI1NiA9IDkgKiAyNiArIDIyXG4gICAgdmFyIG1hc2sgPSAweDNmZmZmZjtcblxuICAgIHZhciBvdXRMZW4gPSBNYXRoLm1pbihpbnB1dC5sZW5ndGgsIDkpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3V0TGVuOyBpKyspIHtcbiAgICAgIG91dHB1dC53b3Jkc1tpXSA9IGlucHV0LndvcmRzW2ldO1xuICAgIH1cbiAgICBvdXRwdXQubGVuZ3RoID0gb3V0TGVuO1xuXG4gICAgaWYgKGlucHV0Lmxlbmd0aCA8PSA5KSB7XG4gICAgICBpbnB1dC53b3Jkc1swXSA9IDA7XG4gICAgICBpbnB1dC5sZW5ndGggPSAxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNoaWZ0IGJ5IDkgbGltYnNcbiAgICB2YXIgcHJldiA9IGlucHV0LndvcmRzWzldO1xuICAgIG91dHB1dC53b3Jkc1tvdXRwdXQubGVuZ3RoKytdID0gcHJldiAmIG1hc2s7XG5cbiAgICBmb3IgKGkgPSAxMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmV4dCA9IGlucHV0LndvcmRzW2ldIHwgMDtcbiAgICAgIGlucHV0LndvcmRzW2kgLSAxMF0gPSAoKG5leHQgJiBtYXNrKSA8PCA0KSB8IChwcmV2ID4+PiAyMik7XG4gICAgICBwcmV2ID0gbmV4dDtcbiAgICB9XG4gICAgcHJldiA+Pj49IDIyO1xuICAgIGlucHV0LndvcmRzW2kgLSAxMF0gPSBwcmV2O1xuICAgIGlmIChwcmV2ID09PSAwICYmIGlucHV0Lmxlbmd0aCA+IDEwKSB7XG4gICAgICBpbnB1dC5sZW5ndGggLT0gMTA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucHV0Lmxlbmd0aCAtPSA5O1xuICAgIH1cbiAgfTtcblxuICBLMjU2LnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uIGltdWxLIChudW0pIHtcbiAgICAvLyBLID0gMHgxMDAwMDAzZDEgPSBbIDB4NDAsIDB4M2QxIF1cbiAgICBudW0ud29yZHNbbnVtLmxlbmd0aF0gPSAwO1xuICAgIG51bS53b3Jkc1tudW0ubGVuZ3RoICsgMV0gPSAwO1xuICAgIG51bS5sZW5ndGggKz0gMjtcblxuICAgIC8vIGJvdW5kZWQgYXQ6IDB4NDAgKiAweDNmZmZmZmYgKyAweDNkMCA9IDB4MTAwMDAwMzkwXG4gICAgdmFyIGxvID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHcgPSBudW0ud29yZHNbaV0gfCAwO1xuICAgICAgbG8gKz0gdyAqIDB4M2QxO1xuICAgICAgbnVtLndvcmRzW2ldID0gbG8gJiAweDNmZmZmZmY7XG4gICAgICBsbyA9IHcgKiAweDQwICsgKChsbyAvIDB4NDAwMDAwMCkgfCAwKTtcbiAgICB9XG5cbiAgICAvLyBGYXN0IGxlbmd0aCByZWR1Y3Rpb25cbiAgICBpZiAobnVtLndvcmRzW251bS5sZW5ndGggLSAxXSA9PT0gMCkge1xuICAgICAgbnVtLmxlbmd0aC0tO1xuICAgICAgaWYgKG51bS53b3Jkc1tudW0ubGVuZ3RoIC0gMV0gPT09IDApIHtcbiAgICAgICAgbnVtLmxlbmd0aC0tO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVtO1xuICB9O1xuXG4gIGZ1bmN0aW9uIFAyMjQgKCkge1xuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICdwMjI0JyxcbiAgICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMScpO1xuICB9XG4gIGluaGVyaXRzKFAyMjQsIE1QcmltZSk7XG5cbiAgZnVuY3Rpb24gUDE5MiAoKSB7XG4gICAgTVByaW1lLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgJ3AxOTInLFxuICAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmJyk7XG4gIH1cbiAgaW5oZXJpdHMoUDE5MiwgTVByaW1lKTtcblxuICBmdW5jdGlvbiBQMjU1MTkgKCkge1xuICAgIC8vIDIgXiAyNTUgLSAxOVxuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICcyNTUxOScsXG4gICAgICAnN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCcpO1xuICB9XG4gIGluaGVyaXRzKFAyNTUxOSwgTVByaW1lKTtcblxuICBQMjU1MTkucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24gaW11bEsgKG51bSkge1xuICAgIC8vIEsgPSAweDEzXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhpID0gKG51bS53b3Jkc1tpXSB8IDApICogMHgxMyArIGNhcnJ5O1xuICAgICAgdmFyIGxvID0gaGkgJiAweDNmZmZmZmY7XG4gICAgICBoaSA+Pj49IDI2O1xuXG4gICAgICBudW0ud29yZHNbaV0gPSBsbztcbiAgICAgIGNhcnJ5ID0gaGk7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgbnVtLndvcmRzW251bS5sZW5ndGgrK10gPSBjYXJyeTtcbiAgICB9XG4gICAgcmV0dXJuIG51bTtcbiAgfTtcblxuICAvLyBFeHBvcnRlZCBtb3N0bHkgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHVzZSBwbGFpbiBuYW1lIGluc3RlYWRcbiAgQk4uX3ByaW1lID0gZnVuY3Rpb24gcHJpbWUgKG5hbWUpIHtcbiAgICAvLyBDYWNoZWQgdmVyc2lvbiBvZiBwcmltZVxuICAgIGlmIChwcmltZXNbbmFtZV0pIHJldHVybiBwcmltZXNbbmFtZV07XG5cbiAgICB2YXIgcHJpbWU7XG4gICAgaWYgKG5hbWUgPT09ICdrMjU2Jykge1xuICAgICAgcHJpbWUgPSBuZXcgSzI1NigpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3AyMjQnKSB7XG4gICAgICBwcmltZSA9IG5ldyBQMjI0KCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAncDE5MicpIHtcbiAgICAgIHByaW1lID0gbmV3IFAxOTIoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdwMjU1MTknKSB7XG4gICAgICBwcmltZSA9IG5ldyBQMjU1MTkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHByaW1lICcgKyBuYW1lKTtcbiAgICB9XG4gICAgcHJpbWVzW25hbWVdID0gcHJpbWU7XG5cbiAgICByZXR1cm4gcHJpbWU7XG4gIH07XG5cbiAgLy9cbiAgLy8gQmFzZSByZWR1Y3Rpb24gZW5naW5lXG4gIC8vXG4gIGZ1bmN0aW9uIFJlZCAobSkge1xuICAgIGlmICh0eXBlb2YgbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBwcmltZSA9IEJOLl9wcmltZShtKTtcbiAgICAgIHRoaXMubSA9IHByaW1lLnA7XG4gICAgICB0aGlzLnByaW1lID0gcHJpbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChtLmd0bigxKSwgJ21vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMScpO1xuICAgICAgdGhpcy5tID0gbTtcbiAgICAgIHRoaXMucHJpbWUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIFJlZC5wcm90b3R5cGUuX3ZlcmlmeTEgPSBmdW5jdGlvbiBfdmVyaWZ5MSAoYSkge1xuICAgIGFzc2VydChhLm5lZ2F0aXZlID09PSAwLCAncmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMnKTtcbiAgICBhc3NlcnQoYS5yZWQsICdyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5fdmVyaWZ5MiA9IGZ1bmN0aW9uIF92ZXJpZnkyIChhLCBiKSB7XG4gICAgYXNzZXJ0KChhLm5lZ2F0aXZlIHwgYi5uZWdhdGl2ZSkgPT09IDAsICdyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcycpO1xuICAgIGFzc2VydChhLnJlZCAmJiBhLnJlZCA9PT0gYi5yZWQsXG4gICAgICAncmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW1vZCA9IGZ1bmN0aW9uIGltb2QgKGEpIHtcbiAgICBpZiAodGhpcy5wcmltZSkgcmV0dXJuIHRoaXMucHJpbWUuaXJlZHVjZShhKS5fZm9yY2VSZWQodGhpcyk7XG4gICAgcmV0dXJuIGEudW1vZCh0aGlzLm0pLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZyAoYSkge1xuICAgIGlmIChhLmlzWmVybygpKSB7XG4gICAgICByZXR1cm4gYS5jbG9uZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm0uc3ViKGEpLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5hZGQoYik7XG4gICAgaWYgKHJlcy5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMuaXN1Yih0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlhZGQgPSBmdW5jdGlvbiBpYWRkIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLmlhZGQoYik7XG4gICAgaWYgKHJlcy5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMuaXN1Yih0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24gc3ViIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLnN1YihiKTtcbiAgICBpZiAocmVzLmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMuaWFkZCh0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlzdWIgPSBmdW5jdGlvbiBpc3ViIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLmlzdWIoYik7XG4gICAgaWYgKHJlcy5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzLmlhZGQodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNobCA9IGZ1bmN0aW9uIHNobCAoYSwgbnVtKSB7XG4gICAgdGhpcy5fdmVyaWZ5MShhKTtcbiAgICByZXR1cm4gdGhpcy5pbW9kKGEudXNobG4obnVtKSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24gaW11bCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLmltdWwoYikpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcbiAgICByZXR1cm4gdGhpcy5pbW9kKGEubXVsKGIpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbiBpc3FyIChhKSB7XG4gICAgcmV0dXJuIHRoaXMuaW11bChhLCBhLmNsb25lKCkpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3FyID0gZnVuY3Rpb24gc3FyIChhKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsKGEsIGEpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3FydCA9IGZ1bmN0aW9uIHNxcnQgKGEpIHtcbiAgICBpZiAoYS5pc1plcm8oKSkgcmV0dXJuIGEuY2xvbmUoKTtcblxuICAgIHZhciBtb2QzID0gdGhpcy5tLmFuZGxuKDMpO1xuICAgIGFzc2VydChtb2QzICUgMiA9PT0gMSk7XG5cbiAgICAvLyBGYXN0IGNhc2VcbiAgICBpZiAobW9kMyA9PT0gMykge1xuICAgICAgdmFyIHBvdyA9IHRoaXMubS5hZGQobmV3IEJOKDEpKS5pdXNocm4oMik7XG4gICAgICByZXR1cm4gdGhpcy5wb3coYSwgcG93KTtcbiAgICB9XG5cbiAgICAvLyBUb25lbGxpLVNoYW5rcyBhbGdvcml0aG0gKFRvdGFsbHkgdW5vcHRpbWl6ZWQgYW5kIHNsb3cpXG4gICAgLy9cbiAgICAvLyBGaW5kIFEgYW5kIFMsIHRoYXQgUSAqIDIgXiBTID0gKFAgLSAxKVxuICAgIHZhciBxID0gdGhpcy5tLnN1Ym4oMSk7XG4gICAgdmFyIHMgPSAwO1xuICAgIHdoaWxlICghcS5pc1plcm8oKSAmJiBxLmFuZGxuKDEpID09PSAwKSB7XG4gICAgICBzKys7XG4gICAgICBxLml1c2hybigxKTtcbiAgICB9XG4gICAgYXNzZXJ0KCFxLmlzWmVybygpKTtcblxuICAgIHZhciBvbmUgPSBuZXcgQk4oMSkudG9SZWQodGhpcyk7XG4gICAgdmFyIG5PbmUgPSBvbmUucmVkTmVnKCk7XG5cbiAgICAvLyBGaW5kIHF1YWRyYXRpYyBub24tcmVzaWR1ZVxuICAgIC8vIE5PVEU6IE1heCBpcyBzdWNoIGJlY2F1c2Ugb2YgZ2VuZXJhbGl6ZWQgUmllbWFubiBoeXBvdGhlc2lzLlxuICAgIHZhciBscG93ID0gdGhpcy5tLnN1Ym4oMSkuaXVzaHJuKDEpO1xuICAgIHZhciB6ID0gdGhpcy5tLmJpdExlbmd0aCgpO1xuICAgIHogPSBuZXcgQk4oMiAqIHogKiB6KS50b1JlZCh0aGlzKTtcblxuICAgIHdoaWxlICh0aGlzLnBvdyh6LCBscG93KS5jbXAobk9uZSkgIT09IDApIHtcbiAgICAgIHoucmVkSUFkZChuT25lKTtcbiAgICB9XG5cbiAgICB2YXIgYyA9IHRoaXMucG93KHosIHEpO1xuICAgIHZhciByID0gdGhpcy5wb3coYSwgcS5hZGRuKDEpLml1c2hybigxKSk7XG4gICAgdmFyIHQgPSB0aGlzLnBvdyhhLCBxKTtcbiAgICB2YXIgbSA9IHM7XG4gICAgd2hpbGUgKHQuY21wKG9uZSkgIT09IDApIHtcbiAgICAgIHZhciB0bXAgPSB0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IHRtcC5jbXAob25lKSAhPT0gMDsgaSsrKSB7XG4gICAgICAgIHRtcCA9IHRtcC5yZWRTcXIoKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChpIDwgbSk7XG4gICAgICB2YXIgYiA9IHRoaXMucG93KGMsIG5ldyBCTigxKS5pdXNobG4obSAtIGkgLSAxKSk7XG5cbiAgICAgIHIgPSByLnJlZE11bChiKTtcbiAgICAgIGMgPSBiLnJlZFNxcigpO1xuICAgICAgdCA9IHQucmVkTXVsKGMpO1xuICAgICAgbSA9IGk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24gaW52bSAoYSkge1xuICAgIHZhciBpbnYgPSBhLl9pbnZtcCh0aGlzLm0pO1xuICAgIGlmIChpbnYubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIGludi5uZWdhdGl2ZSA9IDA7XG4gICAgICByZXR1cm4gdGhpcy5pbW9kKGludikucmVkTmVnKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmltb2QoaW52KTtcbiAgICB9XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5wb3cgPSBmdW5jdGlvbiBwb3cgKGEsIG51bSkge1xuICAgIGlmIChudW0uaXNaZXJvKCkpIHJldHVybiBuZXcgQk4oMSkudG9SZWQodGhpcyk7XG4gICAgaWYgKG51bS5jbXBuKDEpID09PSAwKSByZXR1cm4gYS5jbG9uZSgpO1xuXG4gICAgdmFyIHdpbmRvd1NpemUgPSA0O1xuICAgIHZhciB3bmQgPSBuZXcgQXJyYXkoMSA8PCB3aW5kb3dTaXplKTtcbiAgICB3bmRbMF0gPSBuZXcgQk4oMSkudG9SZWQodGhpcyk7XG4gICAgd25kWzFdID0gYTtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IHduZC5sZW5ndGg7IGkrKykge1xuICAgICAgd25kW2ldID0gdGhpcy5tdWwod25kW2kgLSAxXSwgYSk7XG4gICAgfVxuXG4gICAgdmFyIHJlcyA9IHduZFswXTtcbiAgICB2YXIgY3VycmVudCA9IDA7XG4gICAgdmFyIGN1cnJlbnRMZW4gPSAwO1xuICAgIHZhciBzdGFydCA9IG51bS5iaXRMZW5ndGgoKSAlIDI2O1xuICAgIGlmIChzdGFydCA9PT0gMCkge1xuICAgICAgc3RhcnQgPSAyNjtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBudW0ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciB3b3JkID0gbnVtLndvcmRzW2ldO1xuICAgICAgZm9yICh2YXIgaiA9IHN0YXJ0IC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgdmFyIGJpdCA9ICh3b3JkID4+IGopICYgMTtcbiAgICAgICAgaWYgKHJlcyAhPT0gd25kWzBdKSB7XG4gICAgICAgICAgcmVzID0gdGhpcy5zcXIocmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiaXQgPT09IDAgJiYgY3VycmVudCA9PT0gMCkge1xuICAgICAgICAgIGN1cnJlbnRMZW4gPSAwO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudCA8PD0gMTtcbiAgICAgICAgY3VycmVudCB8PSBiaXQ7XG4gICAgICAgIGN1cnJlbnRMZW4rKztcbiAgICAgICAgaWYgKGN1cnJlbnRMZW4gIT09IHdpbmRvd1NpemUgJiYgKGkgIT09IDAgfHwgaiAhPT0gMCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIHJlcyA9IHRoaXMubXVsKHJlcywgd25kW2N1cnJlbnRdKTtcbiAgICAgICAgY3VycmVudExlbiA9IDA7XG4gICAgICAgIGN1cnJlbnQgPSAwO1xuICAgICAgfVxuICAgICAgc3RhcnQgPSAyNjtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24gY29udmVydFRvIChudW0pIHtcbiAgICB2YXIgciA9IG51bS51bW9kKHRoaXMubSk7XG5cbiAgICByZXR1cm4gciA9PT0gbnVtID8gci5jbG9uZSgpIDogcjtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmNvbnZlcnRGcm9tID0gZnVuY3Rpb24gY29udmVydEZyb20gKG51bSkge1xuICAgIHZhciByZXMgPSBudW0uY2xvbmUoKTtcbiAgICByZXMucmVkID0gbnVsbDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vXG4gIC8vIE1vbnRnb21lcnkgbWV0aG9kIGVuZ2luZVxuICAvL1xuXG4gIEJOLm1vbnQgPSBmdW5jdGlvbiBtb250IChudW0pIHtcbiAgICByZXR1cm4gbmV3IE1vbnQobnVtKTtcbiAgfTtcblxuICBmdW5jdGlvbiBNb250IChtKSB7XG4gICAgUmVkLmNhbGwodGhpcywgbSk7XG5cbiAgICB0aGlzLnNoaWZ0ID0gdGhpcy5tLmJpdExlbmd0aCgpO1xuICAgIGlmICh0aGlzLnNoaWZ0ICUgMjYgIT09IDApIHtcbiAgICAgIHRoaXMuc2hpZnQgKz0gMjYgLSAodGhpcy5zaGlmdCAlIDI2KTtcbiAgICB9XG5cbiAgICB0aGlzLnIgPSBuZXcgQk4oMSkuaXVzaGxuKHRoaXMuc2hpZnQpO1xuICAgIHRoaXMucjIgPSB0aGlzLmltb2QodGhpcy5yLnNxcigpKTtcbiAgICB0aGlzLnJpbnYgPSB0aGlzLnIuX2ludm1wKHRoaXMubSk7XG5cbiAgICB0aGlzLm1pbnYgPSB0aGlzLnJpbnYubXVsKHRoaXMucikuaXN1Ym4oMSkuZGl2KHRoaXMubSk7XG4gICAgdGhpcy5taW52ID0gdGhpcy5taW52LnVtb2QodGhpcy5yKTtcbiAgICB0aGlzLm1pbnYgPSB0aGlzLnIuc3ViKHRoaXMubWludik7XG4gIH1cbiAgaW5oZXJpdHMoTW9udCwgUmVkKTtcblxuICBNb250LnByb3RvdHlwZS5jb252ZXJ0VG8gPSBmdW5jdGlvbiBjb252ZXJ0VG8gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmltb2QobnVtLnVzaGxuKHRoaXMuc2hpZnQpKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uIGNvbnZlcnRGcm9tIChudW0pIHtcbiAgICB2YXIgciA9IHRoaXMuaW1vZChudW0ubXVsKHRoaXMucmludikpO1xuICAgIHIucmVkID0gbnVsbDtcbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24gaW11bCAoYSwgYikge1xuICAgIGlmIChhLmlzWmVybygpIHx8IGIuaXNaZXJvKCkpIHtcbiAgICAgIGEud29yZHNbMF0gPSAwO1xuICAgICAgYS5sZW5ndGggPSAxO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgdmFyIHQgPSBhLmltdWwoYik7XG4gICAgdmFyIGMgPSB0Lm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKTtcbiAgICB2YXIgdSA9IHQuaXN1YihjKS5pdXNocm4odGhpcy5zaGlmdCk7XG4gICAgdmFyIHJlcyA9IHU7XG5cbiAgICBpZiAodS5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMgPSB1LmlzdWIodGhpcy5tKTtcbiAgICB9IGVsc2UgaWYgKHUuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcyA9IHUuaWFkZCh0aGlzLm0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIE1vbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bCAoYSwgYikge1xuICAgIGlmIChhLmlzWmVybygpIHx8IGIuaXNaZXJvKCkpIHJldHVybiBuZXcgQk4oMCkuX2ZvcmNlUmVkKHRoaXMpO1xuXG4gICAgdmFyIHQgPSBhLm11bChiKTtcbiAgICB2YXIgYyA9IHQubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pO1xuICAgIHZhciB1ID0gdC5pc3ViKGMpLml1c2hybih0aGlzLnNoaWZ0KTtcbiAgICB2YXIgcmVzID0gdTtcbiAgICBpZiAodS5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMgPSB1LmlzdWIodGhpcy5tKTtcbiAgICB9IGVsc2UgaWYgKHUuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcyA9IHUuaWFkZCh0aGlzLm0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIE1vbnQucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbiBpbnZtIChhKSB7XG4gICAgLy8gKEFSKV4tMSAqIFJeMiA9IChBXi0xICogUl4tMSkgKiBSXjIgPSBBXi0xICogUlxuICAgIHZhciByZXMgPSB0aGlzLmltb2QoYS5faW52bXAodGhpcy5tKS5tdWwodGhpcy5yMikpO1xuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xufSkodHlwZW9mIG1vZHVsZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbW9kdWxlLCB0aGlzKTtcbiIsCiAgICAiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICAgIH1cbiAgfVxufVxuIiwKICAgICJ0cnkge1xuICB2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKHR5cGVvZiB1dGlsLmluaGVyaXRzICE9PSAnZnVuY3Rpb24nKSB0aHJvdyAnJztcbiAgbW9kdWxlLmV4cG9ydHMgPSB1dGlsLmluaGVyaXRzO1xufSBjYXRjaCAoZSkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaW5oZXJpdHNfYnJvd3Nlci5qcycpO1xufVxuIiwKICAgICIvKiBlc2xpbnQtZGlzYWJsZSBub2RlL25vLWRlcHJlY2F0ZWQtYXBpICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJylcbnZhciBCdWZmZXIgPSBidWZmZXIuQnVmZmVyXG5cbnZhciBzYWZlciA9IHt9XG5cbnZhciBrZXlcblxuZm9yIChrZXkgaW4gYnVmZmVyKSB7XG4gIGlmICghYnVmZmVyLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlXG4gIGlmIChrZXkgPT09ICdTbG93QnVmZmVyJyB8fCBrZXkgPT09ICdCdWZmZXInKSBjb250aW51ZVxuICBzYWZlcltrZXldID0gYnVmZmVyW2tleV1cbn1cblxudmFyIFNhZmVyID0gc2FmZXIuQnVmZmVyID0ge31cbmZvciAoa2V5IGluIEJ1ZmZlcikge1xuICBpZiAoIUJ1ZmZlci5oYXNPd25Qcm9wZXJ0eShrZXkpKSBjb250aW51ZVxuICBpZiAoa2V5ID09PSAnYWxsb2NVbnNhZmUnIHx8IGtleSA9PT0gJ2FsbG9jVW5zYWZlU2xvdycpIGNvbnRpbnVlXG4gIFNhZmVyW2tleV0gPSBCdWZmZXJba2V5XVxufVxuXG5zYWZlci5CdWZmZXIucHJvdG90eXBlID0gQnVmZmVyLnByb3RvdHlwZVxuXG5pZiAoIVNhZmVyLmZyb20gfHwgU2FmZXIuZnJvbSA9PT0gVWludDhBcnJheS5mcm9tKSB7XG4gIFNhZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgdmFsdWUpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiB2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG59XG5cbmlmICghU2FmZXIuYWxsb2MpIHtcbiAgU2FmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHNpemUpXG4gICAgfVxuICAgIGlmIChzaXplIDwgMCB8fCBzaXplID49IDIgKiAoMSA8PCAzMCkpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgc2l6ZSArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICAgIH1cbiAgICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gICAgaWYgKCFmaWxsIHx8IGZpbGwubGVuZ3RoID09PSAwKSB7XG4gICAgICBidWYuZmlsbCgwKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICAgIHJldHVybiBidWZcbiAgfVxufVxuXG5pZiAoIXNhZmVyLmtTdHJpbmdNYXhMZW5ndGgpIHtcbiAgdHJ5IHtcbiAgICBzYWZlci5rU3RyaW5nTWF4TGVuZ3RoID0gcHJvY2Vzcy5iaW5kaW5nKCdidWZmZXInKS5rU3RyaW5nTWF4TGVuZ3RoXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyB3ZSBjYW4ndCBkZXRlcm1pbmUga1N0cmluZ01heExlbmd0aCBpbiBlbnZpcm9ubWVudHMgd2hlcmUgcHJvY2Vzcy5iaW5kaW5nXG4gICAgLy8gaXMgdW5zdXBwb3J0ZWQsIHNvIGxldCdzIG5vdCBzZXQgaXRcbiAgfVxufVxuXG5pZiAoIXNhZmVyLmNvbnN0YW50cykge1xuICBzYWZlci5jb25zdGFudHMgPSB7XG4gICAgTUFYX0xFTkdUSDogc2FmZXIua01heExlbmd0aFxuICB9XG4gIGlmIChzYWZlci5rU3RyaW5nTWF4TGVuZ3RoKSB7XG4gICAgc2FmZXIuY29uc3RhbnRzLk1BWF9TVFJJTkdfTEVOR1RIID0gc2FmZXIua1N0cmluZ01heExlbmd0aFxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2FmZXJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmZ1bmN0aW9uIFJlcG9ydGVyKG9wdGlvbnMpIHtcbiAgdGhpcy5fcmVwb3J0ZXJTdGF0ZSA9IHtcbiAgICBvYmo6IG51bGwsXG4gICAgcGF0aDogW10sXG4gICAgb3B0aW9uczogb3B0aW9ucyB8fCB7fSxcbiAgICBlcnJvcnM6IFtdXG4gIH07XG59XG5leHBvcnRzLlJlcG9ydGVyID0gUmVwb3J0ZXI7XG5cblJlcG9ydGVyLnByb3RvdHlwZS5pc0Vycm9yID0gZnVuY3Rpb24gaXNFcnJvcihvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJlcG9ydGVyRXJyb3I7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uIHNhdmUoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICByZXR1cm4geyBvYmo6IHN0YXRlLm9iaiwgcGF0aExlbjogc3RhdGUucGF0aC5sZW5ndGggfTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5yZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZShkYXRhKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBzdGF0ZS5vYmogPSBkYXRhLm9iajtcbiAgc3RhdGUucGF0aCA9IHN0YXRlLnBhdGguc2xpY2UoMCwgZGF0YS5wYXRoTGVuKTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5lbnRlcktleSA9IGZ1bmN0aW9uIGVudGVyS2V5KGtleSkge1xuICByZXR1cm4gdGhpcy5fcmVwb3J0ZXJTdGF0ZS5wYXRoLnB1c2goa2V5KTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5leGl0S2V5ID0gZnVuY3Rpb24gZXhpdEtleShpbmRleCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgc3RhdGUucGF0aCA9IHN0YXRlLnBhdGguc2xpY2UoMCwgaW5kZXggLSAxKTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5sZWF2ZUtleSA9IGZ1bmN0aW9uIGxlYXZlS2V5KGluZGV4LCBrZXksIHZhbHVlKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICB0aGlzLmV4aXRLZXkoaW5kZXgpO1xuICBpZiAoc3RhdGUub2JqICE9PSBudWxsKVxuICAgIHN0YXRlLm9ialtrZXldID0gdmFsdWU7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUucGF0aCA9IGZ1bmN0aW9uIHBhdGgoKSB7XG4gIHJldHVybiB0aGlzLl9yZXBvcnRlclN0YXRlLnBhdGguam9pbignLycpO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmVudGVyT2JqZWN0ID0gZnVuY3Rpb24gZW50ZXJPYmplY3QoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBjb25zdCBwcmV2ID0gc3RhdGUub2JqO1xuICBzdGF0ZS5vYmogPSB7fTtcbiAgcmV0dXJuIHByZXY7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUubGVhdmVPYmplY3QgPSBmdW5jdGlvbiBsZWF2ZU9iamVjdChwcmV2KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBjb25zdCBub3cgPSBzdGF0ZS5vYmo7XG4gIHN0YXRlLm9iaiA9IHByZXY7XG4gIHJldHVybiBub3c7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiBlcnJvcihtc2cpIHtcbiAgbGV0IGVycjtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIGNvbnN0IGluaGVyaXRlZCA9IG1zZyBpbnN0YW5jZW9mIFJlcG9ydGVyRXJyb3I7XG4gIGlmIChpbmhlcml0ZWQpIHtcbiAgICBlcnIgPSBtc2c7XG4gIH0gZWxzZSB7XG4gICAgZXJyID0gbmV3IFJlcG9ydGVyRXJyb3Ioc3RhdGUucGF0aC5tYXAoZnVuY3Rpb24oZWxlbSkge1xuICAgICAgcmV0dXJuICdbJyArIEpTT04uc3RyaW5naWZ5KGVsZW0pICsgJ10nO1xuICAgIH0pLmpvaW4oJycpLCBtc2cubWVzc2FnZSB8fCBtc2csIG1zZy5zdGFjayk7XG4gIH1cblxuICBpZiAoIXN0YXRlLm9wdGlvbnMucGFydGlhbClcbiAgICB0aHJvdyBlcnI7XG5cbiAgaWYgKCFpbmhlcml0ZWQpXG4gICAgc3RhdGUuZXJyb3JzLnB1c2goZXJyKTtcblxuICByZXR1cm4gZXJyO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLndyYXBSZXN1bHQgPSBmdW5jdGlvbiB3cmFwUmVzdWx0KHJlc3VsdCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG4gIGlmICghc3RhdGUub3B0aW9ucy5wYXJ0aWFsKVxuICAgIHJldHVybiByZXN1bHQ7XG5cbiAgcmV0dXJuIHtcbiAgICByZXN1bHQ6IHRoaXMuaXNFcnJvcihyZXN1bHQpID8gbnVsbCA6IHJlc3VsdCxcbiAgICBlcnJvcnM6IHN0YXRlLmVycm9yc1xuICB9O1xufTtcblxuZnVuY3Rpb24gUmVwb3J0ZXJFcnJvcihwYXRoLCBtc2cpIHtcbiAgdGhpcy5wYXRoID0gcGF0aDtcbiAgdGhpcy5yZXRocm93KG1zZyk7XG59XG5pbmhlcml0cyhSZXBvcnRlckVycm9yLCBFcnJvcik7XG5cblJlcG9ydGVyRXJyb3IucHJvdG90eXBlLnJldGhyb3cgPSBmdW5jdGlvbiByZXRocm93KG1zZykge1xuICB0aGlzLm1lc3NhZ2UgPSBtc2cgKyAnIGF0OiAnICsgKHRoaXMucGF0aCB8fCAnKHNoYWxsb3cpJyk7XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXBvcnRlckVycm9yKTtcblxuICBpZiAoIXRoaXMuc3RhY2spIHtcbiAgICB0cnkge1xuICAgICAgLy8gSUUgb25seSBhZGRzIHN0YWNrIHdoZW4gdGhyb3duXG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5tZXNzYWdlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLnN0YWNrID0gZS5zdGFjaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbmNvbnN0IFJlcG9ydGVyID0gcmVxdWlyZSgnLi4vYmFzZS9yZXBvcnRlcicpLlJlcG9ydGVyO1xuY29uc3QgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xuXG5mdW5jdGlvbiBEZWNvZGVyQnVmZmVyKGJhc2UsIG9wdGlvbnMpIHtcbiAgUmVwb3J0ZXIuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYmFzZSkpIHtcbiAgICB0aGlzLmVycm9yKCdJbnB1dCBub3QgQnVmZmVyJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5iYXNlID0gYmFzZTtcbiAgdGhpcy5vZmZzZXQgPSAwO1xuICB0aGlzLmxlbmd0aCA9IGJhc2UubGVuZ3RoO1xufVxuaW5oZXJpdHMoRGVjb2RlckJ1ZmZlciwgUmVwb3J0ZXIpO1xuZXhwb3J0cy5EZWNvZGVyQnVmZmVyID0gRGVjb2RlckJ1ZmZlcjtcblxuRGVjb2RlckJ1ZmZlci5pc0RlY29kZXJCdWZmZXIgPSBmdW5jdGlvbiBpc0RlY29kZXJCdWZmZXIoZGF0YSkge1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIERlY29kZXJCdWZmZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIE9yIGFjY2VwdCBjb21wYXRpYmxlIEFQSVxuICBjb25zdCBpc0NvbXBhdGlibGUgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICBCdWZmZXIuaXNCdWZmZXIoZGF0YS5iYXNlKSAmJlxuICAgIGRhdGEuY29uc3RydWN0b3IubmFtZSA9PT0gJ0RlY29kZXJCdWZmZXInICYmXG4gICAgdHlwZW9mIGRhdGEub2Zmc2V0ID09PSAnbnVtYmVyJyAmJlxuICAgIHR5cGVvZiBkYXRhLmxlbmd0aCA9PT0gJ251bWJlcicgJiZcbiAgICB0eXBlb2YgZGF0YS5zYXZlID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIGRhdGEucmVzdG9yZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBkYXRhLmlzRW1wdHkgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZGF0YS5yZWFkVUludDggPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZGF0YS5za2lwID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIGRhdGEucmF3ID09PSAnZnVuY3Rpb24nO1xuXG4gIHJldHVybiBpc0NvbXBhdGlibGU7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24gc2F2ZSgpIHtcbiAgcmV0dXJuIHsgb2Zmc2V0OiB0aGlzLm9mZnNldCwgcmVwb3J0ZXI6IFJlcG9ydGVyLnByb3RvdHlwZS5zYXZlLmNhbGwodGhpcykgfTtcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnJlc3RvcmUgPSBmdW5jdGlvbiByZXN0b3JlKHNhdmUpIHtcbiAgLy8gUmV0dXJuIHNraXBwZWQgZGF0YVxuICBjb25zdCByZXMgPSBuZXcgRGVjb2RlckJ1ZmZlcih0aGlzLmJhc2UpO1xuICByZXMub2Zmc2V0ID0gc2F2ZS5vZmZzZXQ7XG4gIHJlcy5sZW5ndGggPSB0aGlzLm9mZnNldDtcblxuICB0aGlzLm9mZnNldCA9IHNhdmUub2Zmc2V0O1xuICBSZXBvcnRlci5wcm90b3R5cGUucmVzdG9yZS5jYWxsKHRoaXMsIHNhdmUucmVwb3J0ZXIpO1xuXG4gIHJldHVybiByZXM7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgcmV0dXJuIHRoaXMub2Zmc2V0ID09PSB0aGlzLmxlbmd0aDtcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OChmYWlsKSB7XG4gIGlmICh0aGlzLm9mZnNldCArIDEgPD0gdGhpcy5sZW5ndGgpXG4gICAgcmV0dXJuIHRoaXMuYmFzZS5yZWFkVUludDgodGhpcy5vZmZzZXQrKywgdHJ1ZSk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5lcnJvcihmYWlsIHx8ICdEZWNvZGVyQnVmZmVyIG92ZXJydW4nKTtcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbiBza2lwKGJ5dGVzLCBmYWlsKSB7XG4gIGlmICghKHRoaXMub2Zmc2V0ICsgYnl0ZXMgPD0gdGhpcy5sZW5ndGgpKVxuICAgIHJldHVybiB0aGlzLmVycm9yKGZhaWwgfHwgJ0RlY29kZXJCdWZmZXIgb3ZlcnJ1bicpO1xuXG4gIGNvbnN0IHJlcyA9IG5ldyBEZWNvZGVyQnVmZmVyKHRoaXMuYmFzZSk7XG5cbiAgLy8gU2hhcmUgcmVwb3J0ZXIgc3RhdGVcbiAgcmVzLl9yZXBvcnRlclN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICByZXMub2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gIHJlcy5sZW5ndGggPSB0aGlzLm9mZnNldCArIGJ5dGVzO1xuICB0aGlzLm9mZnNldCArPSBieXRlcztcbiAgcmV0dXJuIHJlcztcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnJhdyA9IGZ1bmN0aW9uIHJhdyhzYXZlKSB7XG4gIHJldHVybiB0aGlzLmJhc2Uuc2xpY2Uoc2F2ZSA/IHNhdmUub2Zmc2V0IDogdGhpcy5vZmZzZXQsIHRoaXMubGVuZ3RoKTtcbn07XG5cbmZ1bmN0aW9uIEVuY29kZXJCdWZmZXIodmFsdWUsIHJlcG9ydGVyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWUubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgIGlmICghRW5jb2RlckJ1ZmZlci5pc0VuY29kZXJCdWZmZXIoaXRlbSkpXG4gICAgICAgIGl0ZW0gPSBuZXcgRW5jb2RlckJ1ZmZlcihpdGVtLCByZXBvcnRlcik7XG4gICAgICB0aGlzLmxlbmd0aCArPSBpdGVtLmxlbmd0aDtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0sIHRoaXMpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoISgwIDw9IHZhbHVlICYmIHZhbHVlIDw9IDB4ZmYpKVxuICAgICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdub24tYnl0ZSBFbmNvZGVyQnVmZmVyIHZhbHVlJyk7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgodmFsdWUpO1xuICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5sZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdVbnN1cHBvcnRlZCB0eXBlOiAnICsgdHlwZW9mIHZhbHVlKTtcbiAgfVxufVxuZXhwb3J0cy5FbmNvZGVyQnVmZmVyID0gRW5jb2RlckJ1ZmZlcjtcblxuRW5jb2RlckJ1ZmZlci5pc0VuY29kZXJCdWZmZXIgPSBmdW5jdGlvbiBpc0VuY29kZXJCdWZmZXIoZGF0YSkge1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIEVuY29kZXJCdWZmZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIE9yIGFjY2VwdCBjb21wYXRpYmxlIEFQSVxuICBjb25zdCBpc0NvbXBhdGlibGUgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICBkYXRhLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdFbmNvZGVyQnVmZmVyJyAmJlxuICAgIHR5cGVvZiBkYXRhLmxlbmd0aCA9PT0gJ251bWJlcicgJiZcbiAgICB0eXBlb2YgZGF0YS5qb2luID09PSAnZnVuY3Rpb24nO1xuXG4gIHJldHVybiBpc0NvbXBhdGlibGU7XG59O1xuXG5FbmNvZGVyQnVmZmVyLnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gam9pbihvdXQsIG9mZnNldCkge1xuICBpZiAoIW91dClcbiAgICBvdXQgPSBCdWZmZXIuYWxsb2ModGhpcy5sZW5ndGgpO1xuICBpZiAoIW9mZnNldClcbiAgICBvZmZzZXQgPSAwO1xuXG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gb3V0O1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgdGhpcy52YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgIGl0ZW0uam9pbihvdXQsIG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gaXRlbS5sZW5ndGg7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnZhbHVlID09PSAnbnVtYmVyJylcbiAgICAgIG91dFtvZmZzZXRdID0gdGhpcy52YWx1ZTtcbiAgICBlbHNlIGlmICh0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ3N0cmluZycpXG4gICAgICBvdXQud3JpdGUodGhpcy52YWx1ZSwgb2Zmc2V0KTtcbiAgICBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIodGhpcy52YWx1ZSkpXG4gICAgICB0aGlzLnZhbHVlLmNvcHkob3V0LCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSB0aGlzLmxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59O1xuIiwKICAgICJtb2R1bGUuZXhwb3J0cyA9IGFzc2VydDtcblxuZnVuY3Rpb24gYXNzZXJ0KHZhbCwgbXNnKSB7XG4gIGlmICghdmFsKVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cgfHwgJ0Fzc2VydGlvbiBmYWlsZWQnKTtcbn1cblxuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gYXNzZXJ0RXF1YWwobCwgciwgbXNnKSB7XG4gIGlmIChsICE9IHIpXG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCAoJ0Fzc2VydGlvbiBmYWlsZWQ6ICcgKyBsICsgJyAhPSAnICsgcikpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBSZXBvcnRlciA9IHJlcXVpcmUoJy4uL2Jhc2UvcmVwb3J0ZXInKS5SZXBvcnRlcjtcbmNvbnN0IEVuY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuLi9iYXNlL2J1ZmZlcicpLkVuY29kZXJCdWZmZXI7XG5jb25zdCBEZWNvZGVyQnVmZmVyID0gcmVxdWlyZSgnLi4vYmFzZS9idWZmZXInKS5EZWNvZGVyQnVmZmVyO1xuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG4vLyBTdXBwb3J0ZWQgdGFnc1xuY29uc3QgdGFncyA9IFtcbiAgJ3NlcScsICdzZXFvZicsICdzZXQnLCAnc2V0b2YnLCAnb2JqaWQnLCAnYm9vbCcsXG4gICdnZW50aW1lJywgJ3V0Y3RpbWUnLCAnbnVsbF8nLCAnZW51bScsICdpbnQnLCAnb2JqRGVzYycsXG4gICdiaXRzdHInLCAnYm1wc3RyJywgJ2NoYXJzdHInLCAnZ2Vuc3RyJywgJ2dyYXBoc3RyJywgJ2lhNXN0cicsICdpc282NDZzdHInLFxuICAnbnVtc3RyJywgJ29jdHN0cicsICdwcmludHN0cicsICd0NjFzdHInLCAndW5pc3RyJywgJ3V0ZjhzdHInLCAndmlkZW9zdHInXG5dO1xuXG4vLyBQdWJsaWMgbWV0aG9kcyBsaXN0XG5jb25zdCBtZXRob2RzID0gW1xuICAna2V5JywgJ29iaicsICd1c2UnLCAnb3B0aW9uYWwnLCAnZXhwbGljaXQnLCAnaW1wbGljaXQnLCAnZGVmJywgJ2Nob2ljZScsXG4gICdhbnknLCAnY29udGFpbnMnXG5dLmNvbmNhdCh0YWdzKTtcblxuLy8gT3ZlcnJpZGVkIG1ldGhvZHMgbGlzdFxuY29uc3Qgb3ZlcnJpZGVkID0gW1xuICAnX3BlZWtUYWcnLCAnX2RlY29kZVRhZycsICdfdXNlJyxcbiAgJ19kZWNvZGVTdHInLCAnX2RlY29kZU9iamlkJywgJ19kZWNvZGVUaW1lJyxcbiAgJ19kZWNvZGVOdWxsJywgJ19kZWNvZGVJbnQnLCAnX2RlY29kZUJvb2wnLCAnX2RlY29kZUxpc3QnLFxuXG4gICdfZW5jb2RlQ29tcG9zaXRlJywgJ19lbmNvZGVTdHInLCAnX2VuY29kZU9iamlkJywgJ19lbmNvZGVUaW1lJyxcbiAgJ19lbmNvZGVOdWxsJywgJ19lbmNvZGVJbnQnLCAnX2VuY29kZUJvb2wnXG5dO1xuXG5mdW5jdGlvbiBOb2RlKGVuYywgcGFyZW50LCBuYW1lKSB7XG4gIGNvbnN0IHN0YXRlID0ge307XG4gIHRoaXMuX2Jhc2VTdGF0ZSA9IHN0YXRlO1xuXG4gIHN0YXRlLm5hbWUgPSBuYW1lO1xuICBzdGF0ZS5lbmMgPSBlbmM7XG5cbiAgc3RhdGUucGFyZW50ID0gcGFyZW50IHx8IG51bGw7XG4gIHN0YXRlLmNoaWxkcmVuID0gbnVsbDtcblxuICAvLyBTdGF0ZVxuICBzdGF0ZS50YWcgPSBudWxsO1xuICBzdGF0ZS5hcmdzID0gbnVsbDtcbiAgc3RhdGUucmV2ZXJzZUFyZ3MgPSBudWxsO1xuICBzdGF0ZS5jaG9pY2UgPSBudWxsO1xuICBzdGF0ZS5vcHRpb25hbCA9IGZhbHNlO1xuICBzdGF0ZS5hbnkgPSBmYWxzZTtcbiAgc3RhdGUub2JqID0gZmFsc2U7XG4gIHN0YXRlLnVzZSA9IG51bGw7XG4gIHN0YXRlLnVzZURlY29kZXIgPSBudWxsO1xuICBzdGF0ZS5rZXkgPSBudWxsO1xuICBzdGF0ZVsnZGVmYXVsdCddID0gbnVsbDtcbiAgc3RhdGUuZXhwbGljaXQgPSBudWxsO1xuICBzdGF0ZS5pbXBsaWNpdCA9IG51bGw7XG4gIHN0YXRlLmNvbnRhaW5zID0gbnVsbDtcblxuICAvLyBTaG91bGQgY3JlYXRlIG5ldyBpbnN0YW5jZSBvbiBlYWNoIG1ldGhvZFxuICBpZiAoIXN0YXRlLnBhcmVudCkge1xuICAgIHN0YXRlLmNoaWxkcmVuID0gW107XG4gICAgdGhpcy5fd3JhcCgpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IE5vZGU7XG5cbmNvbnN0IHN0YXRlUHJvcHMgPSBbXG4gICdlbmMnLCAncGFyZW50JywgJ2NoaWxkcmVuJywgJ3RhZycsICdhcmdzJywgJ3JldmVyc2VBcmdzJywgJ2Nob2ljZScsXG4gICdvcHRpb25hbCcsICdhbnknLCAnb2JqJywgJ3VzZScsICdhbHRlcmVkVXNlJywgJ2tleScsICdkZWZhdWx0JywgJ2V4cGxpY2l0JyxcbiAgJ2ltcGxpY2l0JywgJ2NvbnRhaW5zJ1xuXTtcblxuTm9kZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIGNvbnN0IGNzdGF0ZSA9IHt9O1xuICBzdGF0ZVByb3BzLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgIGNzdGF0ZVtwcm9wXSA9IHN0YXRlW3Byb3BdO1xuICB9KTtcbiAgY29uc3QgcmVzID0gbmV3IHRoaXMuY29uc3RydWN0b3IoY3N0YXRlLnBhcmVudCk7XG4gIHJlcy5fYmFzZVN0YXRlID0gY3N0YXRlO1xuICByZXR1cm4gcmVzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX3dyYXAgPSBmdW5jdGlvbiB3cmFwKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgbWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgIHRoaXNbbWV0aG9kXSA9IGZ1bmN0aW9uIF93cmFwcGVkTWV0aG9kKCkge1xuICAgICAgY29uc3QgY2xvbmUgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKTtcbiAgICAgIHN0YXRlLmNoaWxkcmVuLnB1c2goY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lW21ldGhvZF0uYXBwbHkoY2xvbmUsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfSwgdGhpcyk7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIGluaXQoYm9keSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUucGFyZW50ID09PSBudWxsKTtcbiAgYm9keS5jYWxsKHRoaXMpO1xuXG4gIC8vIEZpbHRlciBjaGlsZHJlblxuICBzdGF0ZS5jaGlsZHJlbiA9IHN0YXRlLmNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbihjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZC5fYmFzZVN0YXRlLnBhcmVudCA9PT0gdGhpcztcbiAgfSwgdGhpcyk7XG4gIGFzc2VydC5lcXVhbChzdGF0ZS5jaGlsZHJlbi5sZW5ndGgsIDEsICdSb290IG5vZGUgY2FuIGhhdmUgb25seSBvbmUgY2hpbGQnKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl91c2VBcmdzID0gZnVuY3Rpb24gdXNlQXJncyhhcmdzKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIC8vIEZpbHRlciBjaGlsZHJlbiBhbmQgYXJnc1xuICBjb25zdCBjaGlsZHJlbiA9IGFyZ3MuZmlsdGVyKGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBhcmcgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yO1xuICB9LCB0aGlzKTtcbiAgYXJncyA9IGFyZ3MuZmlsdGVyKGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiAhKGFyZyBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IpO1xuICB9LCB0aGlzKTtcblxuICBpZiAoY2hpbGRyZW4ubGVuZ3RoICE9PSAwKSB7XG4gICAgYXNzZXJ0KHN0YXRlLmNoaWxkcmVuID09PSBudWxsKTtcbiAgICBzdGF0ZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgLy8gUmVwbGFjZSBwYXJlbnQgdG8gbWFpbnRhaW4gYmFja3dhcmQgbGlua1xuICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLl9iYXNlU3RhdGUucGFyZW50ID0gdGhpcztcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBpZiAoYXJncy5sZW5ndGggIT09IDApIHtcbiAgICBhc3NlcnQoc3RhdGUuYXJncyA9PT0gbnVsbCk7XG4gICAgc3RhdGUuYXJncyA9IGFyZ3M7XG4gICAgc3RhdGUucmV2ZXJzZUFyZ3MgPSBhcmdzLm1hcChmdW5jdGlvbihhcmcpIHtcbiAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAnb2JqZWN0JyB8fCBhcmcuY29uc3RydWN0b3IgIT09IE9iamVjdClcbiAgICAgICAgcmV0dXJuIGFyZztcblxuICAgICAgY29uc3QgcmVzID0ge307XG4gICAgICBPYmplY3Qua2V5cyhhcmcpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT0gKGtleSB8IDApKVxuICAgICAgICAgIGtleSB8PSAwO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZ1trZXldO1xuICAgICAgICByZXNbdmFsdWVdID0ga2V5O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICB9XG59O1xuXG4vL1xuLy8gT3ZlcnJpZGVkIG1ldGhvZHNcbi8vXG5cbm92ZXJyaWRlZC5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICBOb2RlLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gX292ZXJyaWRlZCgpIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWV0aG9kICsgJyBub3QgaW1wbGVtZW50ZWQgZm9yIGVuY29kaW5nOiAnICsgc3RhdGUuZW5jKTtcbiAgfTtcbn0pO1xuXG4vL1xuLy8gUHVibGljIG1ldGhvZHNcbi8vXG5cbnRhZ3MuZm9yRWFjaChmdW5jdGlvbih0YWcpIHtcbiAgTm9kZS5wcm90b3R5cGVbdGFnXSA9IGZ1bmN0aW9uIF90YWdNZXRob2QoKSB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgICBhc3NlcnQoc3RhdGUudGFnID09PSBudWxsKTtcbiAgICBzdGF0ZS50YWcgPSB0YWc7XG5cbiAgICB0aGlzLl91c2VBcmdzKGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59KTtcblxuTm9kZS5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gdXNlKGl0ZW0pIHtcbiAgYXNzZXJ0KGl0ZW0pO1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUudXNlID09PSBudWxsKTtcbiAgc3RhdGUudXNlID0gaXRlbTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLm9wdGlvbmFsID0gZnVuY3Rpb24gb3B0aW9uYWwoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIHN0YXRlLm9wdGlvbmFsID0gdHJ1ZTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmRlZiA9IGZ1bmN0aW9uIGRlZih2YWwpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlWydkZWZhdWx0J10gPT09IG51bGwpO1xuICBzdGF0ZVsnZGVmYXVsdCddID0gdmFsO1xuICBzdGF0ZS5vcHRpb25hbCA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5leHBsaWNpdCA9IGZ1bmN0aW9uIGV4cGxpY2l0KG51bSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUuZXhwbGljaXQgPT09IG51bGwgJiYgc3RhdGUuaW1wbGljaXQgPT09IG51bGwpO1xuICBzdGF0ZS5leHBsaWNpdCA9IG51bTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmltcGxpY2l0ID0gZnVuY3Rpb24gaW1wbGljaXQobnVtKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS5leHBsaWNpdCA9PT0gbnVsbCAmJiBzdGF0ZS5pbXBsaWNpdCA9PT0gbnVsbCk7XG4gIHN0YXRlLmltcGxpY2l0ID0gbnVtO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUub2JqID0gZnVuY3Rpb24gb2JqKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgc3RhdGUub2JqID0gdHJ1ZTtcblxuICBpZiAoYXJncy5sZW5ndGggIT09IDApXG4gICAgdGhpcy5fdXNlQXJncyhhcmdzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmtleSA9IGZ1bmN0aW9uIGtleShuZXdLZXkpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLmtleSA9PT0gbnVsbCk7XG4gIHN0YXRlLmtleSA9IG5ld0tleTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmFueSA9IGZ1bmN0aW9uIGFueSgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgc3RhdGUuYW55ID0gdHJ1ZTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmNob2ljZSA9IGZ1bmN0aW9uIGNob2ljZShvYmopIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLmNob2ljZSA9PT0gbnVsbCk7XG4gIHN0YXRlLmNob2ljZSA9IG9iajtcbiAgdGhpcy5fdXNlQXJncyhPYmplY3Qua2V5cyhvYmopLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH0pKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gY29udGFpbnMoaXRlbSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUudXNlID09PSBudWxsKTtcbiAgc3RhdGUuY29udGFpbnMgPSBpdGVtO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy9cbi8vIERlY29kaW5nXG4vL1xuXG5Ob2RlLnByb3RvdHlwZS5fZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIC8vIERlY29kZSByb290IG5vZGVcbiAgaWYgKHN0YXRlLnBhcmVudCA9PT0gbnVsbClcbiAgICByZXR1cm4gaW5wdXQud3JhcFJlc3VsdChzdGF0ZS5jaGlsZHJlblswXS5fZGVjb2RlKGlucHV0LCBvcHRpb25zKSk7XG5cbiAgbGV0IHJlc3VsdCA9IHN0YXRlWydkZWZhdWx0J107XG4gIGxldCBwcmVzZW50ID0gdHJ1ZTtcblxuICBsZXQgcHJldktleSA9IG51bGw7XG4gIGlmIChzdGF0ZS5rZXkgIT09IG51bGwpXG4gICAgcHJldktleSA9IGlucHV0LmVudGVyS2V5KHN0YXRlLmtleSk7XG5cbiAgLy8gQ2hlY2sgaWYgdGFnIGlzIHRoZXJlXG4gIGlmIChzdGF0ZS5vcHRpb25hbCkge1xuICAgIGxldCB0YWcgPSBudWxsO1xuICAgIGlmIChzdGF0ZS5leHBsaWNpdCAhPT0gbnVsbClcbiAgICAgIHRhZyA9IHN0YXRlLmV4cGxpY2l0O1xuICAgIGVsc2UgaWYgKHN0YXRlLmltcGxpY2l0ICE9PSBudWxsKVxuICAgICAgdGFnID0gc3RhdGUuaW1wbGljaXQ7XG4gICAgZWxzZSBpZiAoc3RhdGUudGFnICE9PSBudWxsKVxuICAgICAgdGFnID0gc3RhdGUudGFnO1xuXG4gICAgaWYgKHRhZyA9PT0gbnVsbCAmJiAhc3RhdGUuYW55KSB7XG4gICAgICAvLyBUcmlhbCBhbmQgRXJyb3JcbiAgICAgIGNvbnN0IHNhdmUgPSBpbnB1dC5zYXZlKCk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoc3RhdGUuY2hvaWNlID09PSBudWxsKVxuICAgICAgICAgIHRoaXMuX2RlY29kZUdlbmVyaWMoc3RhdGUudGFnLCBpbnB1dCwgb3B0aW9ucyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aGlzLl9kZWNvZGVDaG9pY2UoaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgICBwcmVzZW50ID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcHJlc2VudCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaW5wdXQucmVzdG9yZShzYXZlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlc2VudCA9IHRoaXMuX3BlZWtUYWcoaW5wdXQsIHRhZywgc3RhdGUuYW55KTtcblxuICAgICAgaWYgKGlucHV0LmlzRXJyb3IocHJlc2VudCkpXG4gICAgICAgIHJldHVybiBwcmVzZW50O1xuICAgIH1cbiAgfVxuXG4gIC8vIFB1c2ggb2JqZWN0IG9uIHN0YWNrXG4gIGxldCBwcmV2T2JqO1xuICBpZiAoc3RhdGUub2JqICYmIHByZXNlbnQpXG4gICAgcHJldk9iaiA9IGlucHV0LmVudGVyT2JqZWN0KCk7XG5cbiAgaWYgKHByZXNlbnQpIHtcbiAgICAvLyBVbndyYXAgZXhwbGljaXQgdmFsdWVzXG4gICAgaWYgKHN0YXRlLmV4cGxpY2l0ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBleHBsaWNpdCA9IHRoaXMuX2RlY29kZVRhZyhpbnB1dCwgc3RhdGUuZXhwbGljaXQpO1xuICAgICAgaWYgKGlucHV0LmlzRXJyb3IoZXhwbGljaXQpKVxuICAgICAgICByZXR1cm4gZXhwbGljaXQ7XG4gICAgICBpbnB1dCA9IGV4cGxpY2l0O1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gaW5wdXQub2Zmc2V0O1xuXG4gICAgLy8gVW53cmFwIGltcGxpY2l0IGFuZCBub3JtYWwgdmFsdWVzXG4gICAgaWYgKHN0YXRlLnVzZSA9PT0gbnVsbCAmJiBzdGF0ZS5jaG9pY2UgPT09IG51bGwpIHtcbiAgICAgIGxldCBzYXZlO1xuICAgICAgaWYgKHN0YXRlLmFueSlcbiAgICAgICAgc2F2ZSA9IGlucHV0LnNhdmUoKTtcbiAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLl9kZWNvZGVUYWcoXG4gICAgICAgIGlucHV0LFxuICAgICAgICBzdGF0ZS5pbXBsaWNpdCAhPT0gbnVsbCA/IHN0YXRlLmltcGxpY2l0IDogc3RhdGUudGFnLFxuICAgICAgICBzdGF0ZS5hbnlcbiAgICAgICk7XG4gICAgICBpZiAoaW5wdXQuaXNFcnJvcihib2R5KSlcbiAgICAgICAgcmV0dXJuIGJvZHk7XG5cbiAgICAgIGlmIChzdGF0ZS5hbnkpXG4gICAgICAgIHJlc3VsdCA9IGlucHV0LnJhdyhzYXZlKTtcbiAgICAgIGVsc2VcbiAgICAgICAgaW5wdXQgPSBib2R5O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudHJhY2sgJiYgc3RhdGUudGFnICE9PSBudWxsKVxuICAgICAgb3B0aW9ucy50cmFjayhpbnB1dC5wYXRoKCksIHN0YXJ0LCBpbnB1dC5sZW5ndGgsICd0YWdnZWQnKTtcblxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudHJhY2sgJiYgc3RhdGUudGFnICE9PSBudWxsKVxuICAgICAgb3B0aW9ucy50cmFjayhpbnB1dC5wYXRoKCksIGlucHV0Lm9mZnNldCwgaW5wdXQubGVuZ3RoLCAnY29udGVudCcpO1xuXG4gICAgLy8gU2VsZWN0IHByb3BlciBtZXRob2QgZm9yIHRhZ1xuICAgIGlmIChzdGF0ZS5hbnkpIHtcbiAgICAgIC8vIG5vLW9wXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5jaG9pY2UgPT09IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2RlY29kZUdlbmVyaWMoc3RhdGUudGFnLCBpbnB1dCwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2RlY29kZUNob2ljZShpbnB1dCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0LmlzRXJyb3IocmVzdWx0KSlcbiAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAvLyBEZWNvZGUgY2hpbGRyZW5cbiAgICBpZiAoIXN0YXRlLmFueSAmJiBzdGF0ZS5jaG9pY2UgPT09IG51bGwgJiYgc3RhdGUuY2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgIHN0YXRlLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gZGVjb2RlQ2hpbGRyZW4oY2hpbGQpIHtcbiAgICAgICAgLy8gTk9URTogV2UgYXJlIGlnbm9yaW5nIGVycm9ycyBoZXJlLCB0byBsZXQgcGFyc2VyIGNvbnRpbnVlIHdpdGggb3RoZXJcbiAgICAgICAgLy8gcGFydHMgb2YgZW5jb2RlZCBkYXRhXG4gICAgICAgIGNoaWxkLl9kZWNvZGUoaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRGVjb2RlIGNvbnRhaW5lZC9lbmNvZGVkIGJ5IHNjaGVtYSwgb25seSBpbiBiaXQgb3Igb2N0ZXQgc3RyaW5nc1xuICAgIGlmIChzdGF0ZS5jb250YWlucyAmJiAoc3RhdGUudGFnID09PSAnb2N0c3RyJyB8fCBzdGF0ZS50YWcgPT09ICdiaXRzdHInKSkge1xuICAgICAgY29uc3QgZGF0YSA9IG5ldyBEZWNvZGVyQnVmZmVyKHJlc3VsdCk7XG4gICAgICByZXN1bHQgPSB0aGlzLl9nZXRVc2Uoc3RhdGUuY29udGFpbnMsIGlucHV0Ll9yZXBvcnRlclN0YXRlLm9iailcbiAgICAgICAgLl9kZWNvZGUoZGF0YSwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLy8gUG9wIG9iamVjdFxuICBpZiAoc3RhdGUub2JqICYmIHByZXNlbnQpXG4gICAgcmVzdWx0ID0gaW5wdXQubGVhdmVPYmplY3QocHJldk9iaik7XG5cbiAgLy8gU2V0IGtleVxuICBpZiAoc3RhdGUua2V5ICE9PSBudWxsICYmIChyZXN1bHQgIT09IG51bGwgfHwgcHJlc2VudCA9PT0gdHJ1ZSkpXG4gICAgaW5wdXQubGVhdmVLZXkocHJldktleSwgc3RhdGUua2V5LCByZXN1bHQpO1xuICBlbHNlIGlmIChwcmV2S2V5ICE9PSBudWxsKVxuICAgIGlucHV0LmV4aXRLZXkocHJldktleSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9kZWNvZGVHZW5lcmljID0gZnVuY3Rpb24gZGVjb2RlR2VuZXJpYyh0YWcsIGlucHV0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGlmICh0YWcgPT09ICdzZXEnIHx8IHRhZyA9PT0gJ3NldCcpXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmICh0YWcgPT09ICdzZXFvZicgfHwgdGFnID09PSAnc2V0b2YnKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVMaXN0KGlucHV0LCB0YWcsIHN0YXRlLmFyZ3NbMF0sIG9wdGlvbnMpO1xuICBlbHNlIGlmICgvc3RyJC8udGVzdCh0YWcpKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVTdHIoaW5wdXQsIHRhZywgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJyAmJiBzdGF0ZS5hcmdzKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVPYmppZChpbnB1dCwgc3RhdGUuYXJnc1swXSwgc3RhdGUuYXJnc1sxXSwgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlT2JqaWQoaW5wdXQsIG51bGwsIG51bGwsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdnZW50aW1lJyB8fCB0YWcgPT09ICd1dGN0aW1lJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlVGltZShpbnB1dCwgdGFnLCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnbnVsbF8nKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVOdWxsKGlucHV0LCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnYm9vbCcpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZUJvb2woaW5wdXQsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmpEZXNjJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlU3RyKGlucHV0LCB0YWcsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdpbnQnIHx8IHRhZyA9PT0gJ2VudW0nKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVJbnQoaW5wdXQsIHN0YXRlLmFyZ3MgJiYgc3RhdGUuYXJnc1swXSwgb3B0aW9ucyk7XG5cbiAgaWYgKHN0YXRlLnVzZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRVc2Uoc3RhdGUudXNlLCBpbnB1dC5fcmVwb3J0ZXJTdGF0ZS5vYmopXG4gICAgICAuX2RlY29kZShpbnB1dCwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGlucHV0LmVycm9yKCd1bmtub3duIHRhZzogJyArIHRhZyk7XG4gIH1cbn07XG5cbk5vZGUucHJvdG90eXBlLl9nZXRVc2UgPSBmdW5jdGlvbiBfZ2V0VXNlKGVudGl0eSwgb2JqKSB7XG5cbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIC8vIENyZWF0ZSBhbHRlcmVkIHVzZSBkZWNvZGVyIGlmIGltcGxpY2l0IGlzIHNldFxuICBzdGF0ZS51c2VEZWNvZGVyID0gdGhpcy5fdXNlKGVudGl0eSwgb2JqKTtcbiAgYXNzZXJ0KHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5wYXJlbnQgPT09IG51bGwpO1xuICBzdGF0ZS51c2VEZWNvZGVyID0gc3RhdGUudXNlRGVjb2Rlci5fYmFzZVN0YXRlLmNoaWxkcmVuWzBdO1xuICBpZiAoc3RhdGUuaW1wbGljaXQgIT09IHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5pbXBsaWNpdCkge1xuICAgIHN0YXRlLnVzZURlY29kZXIgPSBzdGF0ZS51c2VEZWNvZGVyLmNsb25lKCk7XG4gICAgc3RhdGUudXNlRGVjb2Rlci5fYmFzZVN0YXRlLmltcGxpY2l0ID0gc3RhdGUuaW1wbGljaXQ7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLnVzZURlY29kZXI7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZGVjb2RlQ2hvaWNlID0gZnVuY3Rpb24gZGVjb2RlQ2hvaWNlKGlucHV0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgbGV0IG1hdGNoID0gZmFsc2U7XG5cbiAgT2JqZWN0LmtleXMoc3RhdGUuY2hvaWNlKS5zb21lKGZ1bmN0aW9uKGtleSkge1xuICAgIGNvbnN0IHNhdmUgPSBpbnB1dC5zYXZlKCk7XG4gICAgY29uc3Qgbm9kZSA9IHN0YXRlLmNob2ljZVtrZXldO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG5vZGUuX2RlY29kZShpbnB1dCwgb3B0aW9ucyk7XG4gICAgICBpZiAoaW5wdXQuaXNFcnJvcih2YWx1ZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgcmVzdWx0ID0geyB0eXBlOiBrZXksIHZhbHVlOiB2YWx1ZSB9O1xuICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlucHV0LnJlc3RvcmUoc2F2ZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LCB0aGlzKTtcblxuICBpZiAoIW1hdGNoKVxuICAgIHJldHVybiBpbnB1dC5lcnJvcignQ2hvaWNlIG5vdCBtYXRjaGVkJyk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vXG4vLyBFbmNvZGluZ1xuLy9cblxuTm9kZS5wcm90b3R5cGUuX2NyZWF0ZUVuY29kZXJCdWZmZXIgPSBmdW5jdGlvbiBjcmVhdGVFbmNvZGVyQnVmZmVyKGRhdGEpIHtcbiAgcmV0dXJuIG5ldyBFbmNvZGVyQnVmZmVyKGRhdGEsIHRoaXMucmVwb3J0ZXIpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2VuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCByZXBvcnRlciwgcGFyZW50KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBpZiAoc3RhdGVbJ2RlZmF1bHQnXSAhPT0gbnVsbCAmJiBzdGF0ZVsnZGVmYXVsdCddID09PSBkYXRhKVxuICAgIHJldHVybjtcblxuICBjb25zdCByZXN1bHQgPSB0aGlzLl9lbmNvZGVWYWx1ZShkYXRhLCByZXBvcnRlciwgcGFyZW50KTtcbiAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybjtcblxuICBpZiAodGhpcy5fc2tpcERlZmF1bHQocmVzdWx0LCByZXBvcnRlciwgcGFyZW50KSlcbiAgICByZXR1cm47XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9lbmNvZGVWYWx1ZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCByZXBvcnRlciwgcGFyZW50KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIC8vIERlY29kZSByb290IG5vZGVcbiAgaWYgKHN0YXRlLnBhcmVudCA9PT0gbnVsbClcbiAgICByZXR1cm4gc3RhdGUuY2hpbGRyZW5bMF0uX2VuY29kZShkYXRhLCByZXBvcnRlciB8fCBuZXcgUmVwb3J0ZXIoKSk7XG5cbiAgbGV0IHJlc3VsdCA9IG51bGw7XG5cbiAgLy8gU2V0IHJlcG9ydGVyIHRvIHNoYXJlIGl0IHdpdGggYSBjaGlsZCBjbGFzc1xuICB0aGlzLnJlcG9ydGVyID0gcmVwb3J0ZXI7XG5cbiAgLy8gQ2hlY2sgaWYgZGF0YSBpcyB0aGVyZVxuICBpZiAoc3RhdGUub3B0aW9uYWwgJiYgZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHN0YXRlWydkZWZhdWx0J10gIT09IG51bGwpXG4gICAgICBkYXRhID0gc3RhdGVbJ2RlZmF1bHQnXTtcbiAgICBlbHNlXG4gICAgICByZXR1cm47XG4gIH1cblxuICAvLyBFbmNvZGUgY2hpbGRyZW4gZmlyc3RcbiAgbGV0IGNvbnRlbnQgPSBudWxsO1xuICBsZXQgcHJpbWl0aXZlID0gZmFsc2U7XG4gIGlmIChzdGF0ZS5hbnkpIHtcbiAgICAvLyBBbnl0aGluZyB0aGF0IHdhcyBnaXZlbiBpcyB0cmFuc2xhdGVkIHRvIGJ1ZmZlclxuICAgIHJlc3VsdCA9IHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoZGF0YSk7XG4gIH0gZWxzZSBpZiAoc3RhdGUuY2hvaWNlKSB7XG4gICAgcmVzdWx0ID0gdGhpcy5fZW5jb2RlQ2hvaWNlKGRhdGEsIHJlcG9ydGVyKTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5jb250YWlucykge1xuICAgIGNvbnRlbnQgPSB0aGlzLl9nZXRVc2Uoc3RhdGUuY29udGFpbnMsIHBhcmVudCkuX2VuY29kZShkYXRhLCByZXBvcnRlcik7XG4gICAgcHJpbWl0aXZlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5jaGlsZHJlbikge1xuICAgIGNvbnRlbnQgPSBzdGF0ZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZC5fYmFzZVN0YXRlLnRhZyA9PT0gJ251bGxfJylcbiAgICAgICAgcmV0dXJuIGNoaWxkLl9lbmNvZGUobnVsbCwgcmVwb3J0ZXIsIGRhdGEpO1xuXG4gICAgICBpZiAoY2hpbGQuX2Jhc2VTdGF0ZS5rZXkgPT09IG51bGwpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignQ2hpbGQgc2hvdWxkIGhhdmUgYSBrZXknKTtcbiAgICAgIGNvbnN0IHByZXZLZXkgPSByZXBvcnRlci5lbnRlcktleShjaGlsZC5fYmFzZVN0YXRlLmtleSk7XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignQ2hpbGQgZXhwZWN0ZWQsIGJ1dCBpbnB1dCBpcyBub3Qgb2JqZWN0Jyk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGNoaWxkLl9lbmNvZGUoZGF0YVtjaGlsZC5fYmFzZVN0YXRlLmtleV0sIHJlcG9ydGVyLCBkYXRhKTtcbiAgICAgIHJlcG9ydGVyLmxlYXZlS2V5KHByZXZLZXkpO1xuXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0sIHRoaXMpLmZpbHRlcihmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH0pO1xuICAgIGNvbnRlbnQgPSB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGNvbnRlbnQpO1xuICB9IGVsc2Uge1xuICAgIGlmIChzdGF0ZS50YWcgPT09ICdzZXFvZicgfHwgc3RhdGUudGFnID09PSAnc2V0b2YnKSB7XG4gICAgICAvLyBUT0RPKGluZHV0bnkpOiB0aGlzIHNob3VsZCBiZSB0aHJvd24gb24gRFNMIGxldmVsXG4gICAgICBpZiAoIShzdGF0ZS5hcmdzICYmIHN0YXRlLmFyZ3MubGVuZ3RoID09PSAxKSlcbiAgICAgICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdUb28gbWFueSBhcmdzIGZvciA6ICcgKyBzdGF0ZS50YWcpO1xuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignc2Vxb2Yvc2V0b2YsIGJ1dCBkYXRhIGlzIG5vdCBBcnJheScpO1xuXG4gICAgICBjb25zdCBjaGlsZCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgIGNoaWxkLl9iYXNlU3RhdGUuaW1wbGljaXQgPSBudWxsO1xuICAgICAgY29udGVudCA9IHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoZGF0YS5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0VXNlKHN0YXRlLmFyZ3NbMF0sIGRhdGEpLl9lbmNvZGUoaXRlbSwgcmVwb3J0ZXIpO1xuICAgICAgfSwgY2hpbGQpKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLnVzZSAhPT0gbnVsbCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5fZ2V0VXNlKHN0YXRlLnVzZSwgcGFyZW50KS5fZW5jb2RlKGRhdGEsIHJlcG9ydGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudCA9IHRoaXMuX2VuY29kZVByaW1pdGl2ZShzdGF0ZS50YWcsIGRhdGEpO1xuICAgICAgcHJpbWl0aXZlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBFbmNvZGUgZGF0YSBpdHNlbGZcbiAgaWYgKCFzdGF0ZS5hbnkgJiYgc3RhdGUuY2hvaWNlID09PSBudWxsKSB7XG4gICAgY29uc3QgdGFnID0gc3RhdGUuaW1wbGljaXQgIT09IG51bGwgPyBzdGF0ZS5pbXBsaWNpdCA6IHN0YXRlLnRhZztcbiAgICBjb25zdCBjbHMgPSBzdGF0ZS5pbXBsaWNpdCA9PT0gbnVsbCA/ICd1bml2ZXJzYWwnIDogJ2NvbnRleHQnO1xuXG4gICAgaWYgKHRhZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKHN0YXRlLnVzZSA9PT0gbnVsbClcbiAgICAgICAgcmVwb3J0ZXIuZXJyb3IoJ1RhZyBjb3VsZCBiZSBvbWl0dGVkIG9ubHkgZm9yIC51c2UoKScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdGUudXNlID09PSBudWxsKVxuICAgICAgICByZXN1bHQgPSB0aGlzLl9lbmNvZGVDb21wb3NpdGUodGFnLCBwcmltaXRpdmUsIGNscywgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgLy8gV3JhcCBpbiBleHBsaWNpdFxuICBpZiAoc3RhdGUuZXhwbGljaXQgIT09IG51bGwpXG4gICAgcmVzdWx0ID0gdGhpcy5fZW5jb2RlQ29tcG9zaXRlKHN0YXRlLmV4cGxpY2l0LCBmYWxzZSwgJ2NvbnRleHQnLCByZXN1bHQpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZW5jb2RlQ2hvaWNlID0gZnVuY3Rpb24gZW5jb2RlQ2hvaWNlKGRhdGEsIHJlcG9ydGVyKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGNvbnN0IG5vZGUgPSBzdGF0ZS5jaG9pY2VbZGF0YS50eXBlXTtcbiAgaWYgKCFub2RlKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgZmFsc2UsXG4gICAgICBkYXRhLnR5cGUgKyAnIG5vdCBmb3VuZCBpbiAnICtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHN0YXRlLmNob2ljZSkpKTtcbiAgfVxuICByZXR1cm4gbm9kZS5fZW5jb2RlKGRhdGEudmFsdWUsIHJlcG9ydGVyKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9lbmNvZGVQcmltaXRpdmUgPSBmdW5jdGlvbiBlbmNvZGVQcmltaXRpdmUodGFnLCBkYXRhKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGlmICgvc3RyJC8udGVzdCh0YWcpKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVTdHIoZGF0YSwgdGFnKTtcbiAgZWxzZSBpZiAodGFnID09PSAnb2JqaWQnICYmIHN0YXRlLmFyZ3MpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZU9iamlkKGRhdGEsIHN0YXRlLnJldmVyc2VBcmdzWzBdLCBzdGF0ZS5hcmdzWzFdKTtcbiAgZWxzZSBpZiAodGFnID09PSAnb2JqaWQnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVPYmppZChkYXRhLCBudWxsLCBudWxsKTtcbiAgZWxzZSBpZiAodGFnID09PSAnZ2VudGltZScgfHwgdGFnID09PSAndXRjdGltZScpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZVRpbWUoZGF0YSwgdGFnKTtcbiAgZWxzZSBpZiAodGFnID09PSAnbnVsbF8nKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVOdWxsKCk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2ludCcgfHwgdGFnID09PSAnZW51bScpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZUludChkYXRhLCBzdGF0ZS5hcmdzICYmIHN0YXRlLnJldmVyc2VBcmdzWzBdKTtcbiAgZWxzZSBpZiAodGFnID09PSAnYm9vbCcpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZUJvb2woZGF0YSk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iakRlc2MnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVTdHIoZGF0YSwgdGFnKTtcbiAgZWxzZVxuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdGFnOiAnICsgdGFnKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9pc051bXN0ciA9IGZ1bmN0aW9uIGlzTnVtc3RyKHN0cikge1xuICByZXR1cm4gL15bMC05IF0qJC8udGVzdChzdHIpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2lzUHJpbnRzdHIgPSBmdW5jdGlvbiBpc1ByaW50c3RyKHN0cikge1xuICByZXR1cm4gL15bQS1aYS16MC05ICcoKSssLS4vOj0/XSokLy50ZXN0KHN0cik7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbi8vIEhlbHBlclxuZnVuY3Rpb24gcmV2ZXJzZShtYXApIHtcbiAgY29uc3QgcmVzID0ge307XG5cbiAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIC8vIENvbnZlcnQga2V5IHRvIGludGVnZXIgaWYgaXQgaXMgc3RyaW5naWZpZWRcbiAgICBpZiAoKGtleSB8IDApID09IGtleSlcbiAgICAgIGtleSA9IGtleSB8IDA7XG5cbiAgICBjb25zdCB2YWx1ZSA9IG1hcFtrZXldO1xuICAgIHJlc1t2YWx1ZV0gPSBrZXk7XG4gIH0pO1xuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydHMudGFnQ2xhc3MgPSB7XG4gIDA6ICd1bml2ZXJzYWwnLFxuICAxOiAnYXBwbGljYXRpb24nLFxuICAyOiAnY29udGV4dCcsXG4gIDM6ICdwcml2YXRlJ1xufTtcbmV4cG9ydHMudGFnQ2xhc3NCeU5hbWUgPSByZXZlcnNlKGV4cG9ydHMudGFnQ2xhc3MpO1xuXG5leHBvcnRzLnRhZyA9IHtcbiAgMHgwMDogJ2VuZCcsXG4gIDB4MDE6ICdib29sJyxcbiAgMHgwMjogJ2ludCcsXG4gIDB4MDM6ICdiaXRzdHInLFxuICAweDA0OiAnb2N0c3RyJyxcbiAgMHgwNTogJ251bGxfJyxcbiAgMHgwNjogJ29iamlkJyxcbiAgMHgwNzogJ29iakRlc2MnLFxuICAweDA4OiAnZXh0ZXJuYWwnLFxuICAweDA5OiAncmVhbCcsXG4gIDB4MGE6ICdlbnVtJyxcbiAgMHgwYjogJ2VtYmVkJyxcbiAgMHgwYzogJ3V0ZjhzdHInLFxuICAweDBkOiAncmVsYXRpdmVPaWQnLFxuICAweDEwOiAnc2VxJyxcbiAgMHgxMTogJ3NldCcsXG4gIDB4MTI6ICdudW1zdHInLFxuICAweDEzOiAncHJpbnRzdHInLFxuICAweDE0OiAndDYxc3RyJyxcbiAgMHgxNTogJ3ZpZGVvc3RyJyxcbiAgMHgxNjogJ2lhNXN0cicsXG4gIDB4MTc6ICd1dGN0aW1lJyxcbiAgMHgxODogJ2dlbnRpbWUnLFxuICAweDE5OiAnZ3JhcGhzdHInLFxuICAweDFhOiAnaXNvNjQ2c3RyJyxcbiAgMHgxYjogJ2dlbnN0cicsXG4gIDB4MWM6ICd1bmlzdHInLFxuICAweDFkOiAnY2hhcnN0cicsXG4gIDB4MWU6ICdibXBzdHInXG59O1xuZXhwb3J0cy50YWdCeU5hbWUgPSByZXZlcnNlKGV4cG9ydHMudGFnKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5jb25zdCBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG5jb25zdCBOb2RlID0gcmVxdWlyZSgnLi4vYmFzZS9ub2RlJyk7XG5cbi8vIEltcG9ydCBERVIgY29uc3RhbnRzXG5jb25zdCBkZXIgPSByZXF1aXJlKCcuLi9jb25zdGFudHMvZGVyJyk7XG5cbmZ1bmN0aW9uIERFUkVuY29kZXIoZW50aXR5KSB7XG4gIHRoaXMuZW5jID0gJ2Rlcic7XG4gIHRoaXMubmFtZSA9IGVudGl0eS5uYW1lO1xuICB0aGlzLmVudGl0eSA9IGVudGl0eTtcblxuICAvLyBDb25zdHJ1Y3QgYmFzZSB0cmVlXG4gIHRoaXMudHJlZSA9IG5ldyBERVJOb2RlKCk7XG4gIHRoaXMudHJlZS5faW5pdChlbnRpdHkuYm9keSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IERFUkVuY29kZXI7XG5cbkRFUkVuY29kZXIucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCByZXBvcnRlcikge1xuICByZXR1cm4gdGhpcy50cmVlLl9lbmNvZGUoZGF0YSwgcmVwb3J0ZXIpLmpvaW4oKTtcbn07XG5cbi8vIFRyZWUgbWV0aG9kc1xuXG5mdW5jdGlvbiBERVJOb2RlKHBhcmVudCkge1xuICBOb2RlLmNhbGwodGhpcywgJ2RlcicsIHBhcmVudCk7XG59XG5pbmhlcml0cyhERVJOb2RlLCBOb2RlKTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZUNvbXBvc2l0ZSA9IGZ1bmN0aW9uIGVuY29kZUNvbXBvc2l0ZSh0YWcsXG4gIHByaW1pdGl2ZSxcbiAgY2xzLFxuICBjb250ZW50KSB7XG4gIGNvbnN0IGVuY29kZWRUYWcgPSBlbmNvZGVUYWcodGFnLCBwcmltaXRpdmUsIGNscywgdGhpcy5yZXBvcnRlcik7XG5cbiAgLy8gU2hvcnQgZm9ybVxuICBpZiAoY29udGVudC5sZW5ndGggPCAweDgwKSB7XG4gICAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIpO1xuICAgIGhlYWRlclswXSA9IGVuY29kZWRUYWc7XG4gICAgaGVhZGVyWzFdID0gY29udGVudC5sZW5ndGg7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoWyBoZWFkZXIsIGNvbnRlbnQgXSk7XG4gIH1cblxuICAvLyBMb25nIGZvcm1cbiAgLy8gQ291bnQgb2N0ZXRzIHJlcXVpcmVkIHRvIHN0b3JlIGxlbmd0aFxuICBsZXQgbGVuT2N0ZXRzID0gMTtcbiAgZm9yIChsZXQgaSA9IGNvbnRlbnQubGVuZ3RoOyBpID49IDB4MTAwOyBpID4+PSA4KVxuICAgIGxlbk9jdGV0cysrO1xuXG4gIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYygxICsgMSArIGxlbk9jdGV0cyk7XG4gIGhlYWRlclswXSA9IGVuY29kZWRUYWc7XG4gIGhlYWRlclsxXSA9IDB4ODAgfCBsZW5PY3RldHM7XG5cbiAgZm9yIChsZXQgaSA9IDEgKyBsZW5PY3RldHMsIGogPSBjb250ZW50Lmxlbmd0aDsgaiA+IDA7IGktLSwgaiA+Pj0gOClcbiAgICBoZWFkZXJbaV0gPSBqICYgMHhmZjtcblxuICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbIGhlYWRlciwgY29udGVudCBdKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVTdHIgPSBmdW5jdGlvbiBlbmNvZGVTdHIoc3RyLCB0YWcpIHtcbiAgaWYgKHRhZyA9PT0gJ2JpdHN0cicpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbIHN0ci51bnVzZWQgfCAwLCBzdHIuZGF0YSBdKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdibXBzdHInKSB7XG4gICAgY29uc3QgYnVmID0gQnVmZmVyLmFsbG9jKHN0ci5sZW5ndGggKiAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgYnVmLndyaXRlVUludDE2QkUoc3RyLmNoYXJDb2RlQXQoaSksIGkgKiAyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoYnVmKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdudW1zdHInKSB7XG4gICAgaWYgKCF0aGlzLl9pc051bXN0cihzdHIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignRW5jb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IG51bXN0ciBzdXBwb3J0cyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbmx5IGRpZ2l0cyBhbmQgc3BhY2UnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoc3RyKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdwcmludHN0cicpIHtcbiAgICBpZiAoIXRoaXMuX2lzUHJpbnRzdHIoc3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ0VuY29kaW5nIG9mIHN0cmluZyB0eXBlOiBwcmludHN0ciBzdXBwb3J0cyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbmx5IGxhdGluIHVwcGVyIGFuZCBsb3dlciBjYXNlIGxldHRlcnMsICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpZ2l0cywgc3BhY2UsIGFwb3N0cm9waGUsIGxlZnQgYW5kIHJpZ3RoICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhcmVudGhlc2lzLCBwbHVzIHNpZ24sIGNvbW1hLCBoeXBoZW4sICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RvdCwgc2xhc2gsIGNvbG9uLCBlcXVhbCBzaWduLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxdWVzdGlvbiBtYXJrJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik7XG4gIH0gZWxzZSBpZiAoL3N0ciQvLnRlc3QodGFnKSkge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnb2JqRGVzYycpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzdHIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArIHRhZyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyB1bnN1cHBvcnRlZCcpO1xuICB9XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlT2JqaWQgPSBmdW5jdGlvbiBlbmNvZGVPYmppZChpZCwgdmFsdWVzLCByZWxhdGl2ZSkge1xuICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgIGlmICghdmFsdWVzKVxuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ3N0cmluZyBvYmppZCBnaXZlbiwgYnV0IG5vIHZhbHVlcyBtYXAgZm91bmQnKTtcbiAgICBpZiAoIXZhbHVlcy5oYXNPd25Qcm9wZXJ0eShpZCkpXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignb2JqaWQgbm90IGZvdW5kIGluIHZhbHVlcyBtYXAnKTtcbiAgICBpZCA9IHZhbHVlc1tpZF0uc3BsaXQoL1tcXHMuXSsvZyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZC5sZW5ndGg7IGkrKylcbiAgICAgIGlkW2ldIHw9IDA7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICBpZCA9IGlkLnNsaWNlKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZC5sZW5ndGg7IGkrKylcbiAgICAgIGlkW2ldIHw9IDA7XG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkoaWQpKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ29iamlkKCkgc2hvdWxkIGJlIGVpdGhlciBhcnJheSBvciBzdHJpbmcsICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnb3Q6ICcgKyBKU09OLnN0cmluZ2lmeShpZCkpO1xuICB9XG5cbiAgaWYgKCFyZWxhdGl2ZSkge1xuICAgIGlmIChpZFsxXSA+PSA0MClcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdTZWNvbmQgb2JqaWQgaWRlbnRpZmllciBPT0InKTtcbiAgICBpZC5zcGxpY2UoMCwgMiwgaWRbMF0gKiA0MCArIGlkWzFdKTtcbiAgfVxuXG4gIC8vIENvdW50IG51bWJlciBvZiBvY3RldHNcbiAgbGV0IHNpemUgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGlkLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGlkZW50ID0gaWRbaV07XG4gICAgZm9yIChzaXplKys7IGlkZW50ID49IDB4ODA7IGlkZW50ID4+PSA3KVxuICAgICAgc2l6ZSsrO1xuICB9XG5cbiAgY29uc3Qgb2JqaWQgPSBCdWZmZXIuYWxsb2Moc2l6ZSk7XG4gIGxldCBvZmZzZXQgPSBvYmppZC5sZW5ndGggLSAxO1xuICBmb3IgKGxldCBpID0gaWQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBsZXQgaWRlbnQgPSBpZFtpXTtcbiAgICBvYmppZFtvZmZzZXQtLV0gPSBpZGVudCAmIDB4N2Y7XG4gICAgd2hpbGUgKChpZGVudCA+Pj0gNykgPiAwKVxuICAgICAgb2JqaWRbb2Zmc2V0LS1dID0gMHg4MCB8IChpZGVudCAmIDB4N2YpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIob2JqaWQpO1xufTtcblxuZnVuY3Rpb24gdHdvKG51bSkge1xuICBpZiAobnVtIDwgMTApXG4gICAgcmV0dXJuICcwJyArIG51bTtcbiAgZWxzZVxuICAgIHJldHVybiBudW07XG59XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVUaW1lID0gZnVuY3Rpb24gZW5jb2RlVGltZSh0aW1lLCB0YWcpIHtcbiAgbGV0IHN0cjtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRpbWUpO1xuXG4gIGlmICh0YWcgPT09ICdnZW50aW1lJykge1xuICAgIHN0ciA9IFtcbiAgICAgIHR3byhkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDRGF0ZSgpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ0hvdXJzKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTWludXRlcygpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ1NlY29uZHMoKSksXG4gICAgICAnWidcbiAgICBdLmpvaW4oJycpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3V0Y3RpbWUnKSB7XG4gICAgc3RyID0gW1xuICAgICAgdHdvKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSAlIDEwMCksXG4gICAgICB0d28oZGF0ZS5nZXRVVENNb250aCgpICsgMSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENEYXRlKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDSG91cnMoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENNaW51dGVzKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDU2Vjb25kcygpKSxcbiAgICAgICdaJ1xuICAgIF0uam9pbignJyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5yZXBvcnRlci5lcnJvcignRW5jb2RpbmcgJyArIHRhZyArICcgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldCcpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2VuY29kZVN0cihzdHIsICdvY3RzdHInKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVOdWxsID0gZnVuY3Rpb24gZW5jb2RlTnVsbCgpIHtcbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoJycpO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZUludCA9IGZ1bmN0aW9uIGVuY29kZUludChudW0sIHZhbHVlcykge1xuICBpZiAodHlwZW9mIG51bSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIXZhbHVlcylcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdTdHJpbmcgaW50IG9yIGVudW0gZ2l2ZW4sIGJ1dCBubyB2YWx1ZXMgbWFwJyk7XG4gICAgaWYgKCF2YWx1ZXMuaGFzT3duUHJvcGVydHkobnVtKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ1ZhbHVlcyBtYXAgZG9lc25cXCd0IGNvbnRhaW46ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobnVtKSk7XG4gICAgfVxuICAgIG51bSA9IHZhbHVlc1tudW1dO1xuICB9XG5cbiAgLy8gQmlnbnVtLCBhc3N1bWUgYmlnIGVuZGlhblxuICBpZiAodHlwZW9mIG51bSAhPT0gJ251bWJlcicgJiYgIUJ1ZmZlci5pc0J1ZmZlcihudW0pKSB7XG4gICAgY29uc3QgbnVtQXJyYXkgPSBudW0udG9BcnJheSgpO1xuICAgIGlmICghbnVtLnNpZ24gJiYgbnVtQXJyYXlbMF0gJiAweDgwKSB7XG4gICAgICBudW1BcnJheS51bnNoaWZ0KDApO1xuICAgIH1cbiAgICBudW0gPSBCdWZmZXIuZnJvbShudW1BcnJheSk7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG51bSkpIHtcbiAgICBsZXQgc2l6ZSA9IG51bS5sZW5ndGg7XG4gICAgaWYgKG51bS5sZW5ndGggPT09IDApXG4gICAgICBzaXplKys7XG5cbiAgICBjb25zdCBvdXQgPSBCdWZmZXIuYWxsb2Moc2l6ZSk7XG4gICAgbnVtLmNvcHkob3V0KTtcbiAgICBpZiAobnVtLmxlbmd0aCA9PT0gMClcbiAgICAgIG91dFswXSA9IDA7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIob3V0KTtcbiAgfVxuXG4gIGlmIChudW0gPCAweDgwKVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG51bSk7XG5cbiAgaWYgKG51bSA8IDB4MTAwKVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFswLCBudW1dKTtcblxuICBsZXQgc2l6ZSA9IDE7XG4gIGZvciAobGV0IGkgPSBudW07IGkgPj0gMHgxMDA7IGkgPj49IDgpXG4gICAgc2l6ZSsrO1xuXG4gIGNvbnN0IG91dCA9IG5ldyBBcnJheShzaXplKTtcbiAgZm9yIChsZXQgaSA9IG91dC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIG91dFtpXSA9IG51bSAmIDB4ZmY7XG4gICAgbnVtID4+PSA4O1xuICB9XG4gIGlmKG91dFswXSAmIDB4ODApIHtcbiAgICBvdXQudW5zaGlmdCgwKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKEJ1ZmZlci5mcm9tKG91dCkpO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZUJvb2wgPSBmdW5jdGlvbiBlbmNvZGVCb29sKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHZhbHVlID8gMHhmZiA6IDApO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX3VzZSA9IGZ1bmN0aW9uIHVzZShlbnRpdHksIG9iaikge1xuICBpZiAodHlwZW9mIGVudGl0eSA9PT0gJ2Z1bmN0aW9uJylcbiAgICBlbnRpdHkgPSBlbnRpdHkob2JqKTtcbiAgcmV0dXJuIGVudGl0eS5fZ2V0RW5jb2RlcignZGVyJykudHJlZTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9za2lwRGVmYXVsdCA9IGZ1bmN0aW9uIHNraXBEZWZhdWx0KGRhdGFCdWZmZXIsIHJlcG9ydGVyLCBwYXJlbnQpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIGxldCBpO1xuICBpZiAoc3RhdGVbJ2RlZmF1bHQnXSA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZGF0YSA9IGRhdGFCdWZmZXIuam9pbigpO1xuICBpZiAoc3RhdGUuZGVmYXVsdEJ1ZmZlciA9PT0gdW5kZWZpbmVkKVxuICAgIHN0YXRlLmRlZmF1bHRCdWZmZXIgPSB0aGlzLl9lbmNvZGVWYWx1ZShzdGF0ZVsnZGVmYXVsdCddLCByZXBvcnRlciwgcGFyZW50KS5qb2luKCk7XG5cbiAgaWYgKGRhdGEubGVuZ3RoICE9PSBzdGF0ZS5kZWZhdWx0QnVmZmVyLmxlbmd0aClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgZm9yIChpPTA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKVxuICAgIGlmIChkYXRhW2ldICE9PSBzdGF0ZS5kZWZhdWx0QnVmZmVyW2ldKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLy8gVXRpbGl0eSBtZXRob2RzXG5cbmZ1bmN0aW9uIGVuY29kZVRhZyh0YWcsIHByaW1pdGl2ZSwgY2xzLCByZXBvcnRlcikge1xuICBsZXQgcmVzO1xuXG4gIGlmICh0YWcgPT09ICdzZXFvZicpXG4gICAgdGFnID0gJ3NlcSc7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ3NldG9mJylcbiAgICB0YWcgPSAnc2V0JztcblxuICBpZiAoZGVyLnRhZ0J5TmFtZS5oYXNPd25Qcm9wZXJ0eSh0YWcpKVxuICAgIHJlcyA9IGRlci50YWdCeU5hbWVbdGFnXTtcbiAgZWxzZSBpZiAodHlwZW9mIHRhZyA9PT0gJ251bWJlcicgJiYgKHRhZyB8IDApID09PSB0YWcpXG4gICAgcmVzID0gdGFnO1xuICBlbHNlXG4gICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdVbmtub3duIHRhZzogJyArIHRhZyk7XG5cbiAgaWYgKHJlcyA+PSAweDFmKVxuICAgIHJldHVybiByZXBvcnRlci5lcnJvcignTXVsdGktb2N0ZXQgdGFnIGVuY29kaW5nIHVuc3VwcG9ydGVkJyk7XG5cbiAgaWYgKCFwcmltaXRpdmUpXG4gICAgcmVzIHw9IDB4MjA7XG5cbiAgcmVzIHw9IChkZXIudGFnQ2xhc3NCeU5hbWVbY2xzIHx8ICd1bml2ZXJzYWwnXSA8PCA2KTtcblxuICByZXR1cm4gcmVzO1xufVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuY29uc3QgREVSRW5jb2RlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG5cbmZ1bmN0aW9uIFBFTUVuY29kZXIoZW50aXR5KSB7XG4gIERFUkVuY29kZXIuY2FsbCh0aGlzLCBlbnRpdHkpO1xuICB0aGlzLmVuYyA9ICdwZW0nO1xufVxuaW5oZXJpdHMoUEVNRW5jb2RlciwgREVSRW5jb2Rlcik7XG5tb2R1bGUuZXhwb3J0cyA9IFBFTUVuY29kZXI7XG5cblBFTUVuY29kZXIucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCBvcHRpb25zKSB7XG4gIGNvbnN0IGJ1ZiA9IERFUkVuY29kZXIucHJvdG90eXBlLmVuY29kZS5jYWxsKHRoaXMsIGRhdGEpO1xuXG4gIGNvbnN0IHAgPSBidWYudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICBjb25zdCBvdXQgPSBbICctLS0tLUJFR0lOICcgKyBvcHRpb25zLmxhYmVsICsgJy0tLS0tJyBdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHAubGVuZ3RoOyBpICs9IDY0KVxuICAgIG91dC5wdXNoKHAuc2xpY2UoaSwgaSArIDY0KSk7XG4gIG91dC5wdXNoKCctLS0tLUVORCAnICsgb3B0aW9ucy5sYWJlbCArICctLS0tLScpO1xuICByZXR1cm4gb3V0LmpvaW4oJ1xcbicpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBlbmNvZGVycyA9IGV4cG9ydHM7XG5cbmVuY29kZXJzLmRlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG5lbmNvZGVycy5wZW0gPSByZXF1aXJlKCcuL3BlbScpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuY29uc3QgYmlnbnVtID0gcmVxdWlyZSgnYm4uanMnKTtcbmNvbnN0IERlY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuLi9iYXNlL2J1ZmZlcicpLkRlY29kZXJCdWZmZXI7XG5jb25zdCBOb2RlID0gcmVxdWlyZSgnLi4vYmFzZS9ub2RlJyk7XG5cbi8vIEltcG9ydCBERVIgY29uc3RhbnRzXG5jb25zdCBkZXIgPSByZXF1aXJlKCcuLi9jb25zdGFudHMvZGVyJyk7XG5cbmZ1bmN0aW9uIERFUkRlY29kZXIoZW50aXR5KSB7XG4gIHRoaXMuZW5jID0gJ2Rlcic7XG4gIHRoaXMubmFtZSA9IGVudGl0eS5uYW1lO1xuICB0aGlzLmVudGl0eSA9IGVudGl0eTtcblxuICAvLyBDb25zdHJ1Y3QgYmFzZSB0cmVlXG4gIHRoaXMudHJlZSA9IG5ldyBERVJOb2RlKCk7XG4gIHRoaXMudHJlZS5faW5pdChlbnRpdHkuYm9keSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IERFUkRlY29kZXI7XG5cbkRFUkRlY29kZXIucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShkYXRhLCBvcHRpb25zKSB7XG4gIGlmICghRGVjb2RlckJ1ZmZlci5pc0RlY29kZXJCdWZmZXIoZGF0YSkpIHtcbiAgICBkYXRhID0gbmV3IERlY29kZXJCdWZmZXIoZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICByZXR1cm4gdGhpcy50cmVlLl9kZWNvZGUoZGF0YSwgb3B0aW9ucyk7XG59O1xuXG4vLyBUcmVlIG1ldGhvZHNcblxuZnVuY3Rpb24gREVSTm9kZShwYXJlbnQpIHtcbiAgTm9kZS5jYWxsKHRoaXMsICdkZXInLCBwYXJlbnQpO1xufVxuaW5oZXJpdHMoREVSTm9kZSwgTm9kZSk7XG5cbkRFUk5vZGUucHJvdG90eXBlLl9wZWVrVGFnID0gZnVuY3Rpb24gcGVla1RhZyhidWZmZXIsIHRhZywgYW55KSB7XG4gIGlmIChidWZmZXIuaXNFbXB0eSgpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBzdGF0ZSA9IGJ1ZmZlci5zYXZlKCk7XG4gIGNvbnN0IGRlY29kZWRUYWcgPSBkZXJEZWNvZGVUYWcoYnVmZmVyLCAnRmFpbGVkIHRvIHBlZWsgdGFnOiBcIicgKyB0YWcgKyAnXCInKTtcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKGRlY29kZWRUYWcpKVxuICAgIHJldHVybiBkZWNvZGVkVGFnO1xuXG4gIGJ1ZmZlci5yZXN0b3JlKHN0YXRlKTtcblxuICByZXR1cm4gZGVjb2RlZFRhZy50YWcgPT09IHRhZyB8fCBkZWNvZGVkVGFnLnRhZ1N0ciA9PT0gdGFnIHx8XG4gICAgKGRlY29kZWRUYWcudGFnU3RyICsgJ29mJykgPT09IHRhZyB8fCBhbnk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlVGFnID0gZnVuY3Rpb24gZGVjb2RlVGFnKGJ1ZmZlciwgdGFnLCBhbnkpIHtcbiAgY29uc3QgZGVjb2RlZFRhZyA9IGRlckRlY29kZVRhZyhidWZmZXIsXG4gICAgJ0ZhaWxlZCB0byBkZWNvZGUgdGFnIG9mIFwiJyArIHRhZyArICdcIicpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IoZGVjb2RlZFRhZykpXG4gICAgcmV0dXJuIGRlY29kZWRUYWc7XG5cbiAgbGV0IGxlbiA9IGRlckRlY29kZUxlbihidWZmZXIsXG4gICAgZGVjb2RlZFRhZy5wcmltaXRpdmUsXG4gICAgJ0ZhaWxlZCB0byBnZXQgbGVuZ3RoIG9mIFwiJyArIHRhZyArICdcIicpO1xuXG4gIC8vIEZhaWx1cmVcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKGxlbikpXG4gICAgcmV0dXJuIGxlbjtcblxuICBpZiAoIWFueSAmJlxuICAgICAgZGVjb2RlZFRhZy50YWcgIT09IHRhZyAmJlxuICAgICAgZGVjb2RlZFRhZy50YWdTdHIgIT09IHRhZyAmJlxuICAgICAgZGVjb2RlZFRhZy50YWdTdHIgKyAnb2YnICE9PSB0YWcpIHtcbiAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdGYWlsZWQgdG8gbWF0Y2ggdGFnOiBcIicgKyB0YWcgKyAnXCInKTtcbiAgfVxuXG4gIGlmIChkZWNvZGVkVGFnLnByaW1pdGl2ZSB8fCBsZW4gIT09IG51bGwpXG4gICAgcmV0dXJuIGJ1ZmZlci5za2lwKGxlbiwgJ0ZhaWxlZCB0byBtYXRjaCBib2R5IG9mOiBcIicgKyB0YWcgKyAnXCInKTtcblxuICAvLyBJbmRlZmluaXRlIGxlbmd0aC4uLiBmaW5kIEVORCB0YWdcbiAgY29uc3Qgc3RhdGUgPSBidWZmZXIuc2F2ZSgpO1xuICBjb25zdCByZXMgPSB0aGlzLl9za2lwVW50aWxFbmQoXG4gICAgYnVmZmVyLFxuICAgICdGYWlsZWQgdG8gc2tpcCBpbmRlZmluaXRlIGxlbmd0aCBib2R5OiBcIicgKyB0aGlzLnRhZyArICdcIicpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IocmVzKSlcbiAgICByZXR1cm4gcmVzO1xuXG4gIGxlbiA9IGJ1ZmZlci5vZmZzZXQgLSBzdGF0ZS5vZmZzZXQ7XG4gIGJ1ZmZlci5yZXN0b3JlKHN0YXRlKTtcbiAgcmV0dXJuIGJ1ZmZlci5za2lwKGxlbiwgJ0ZhaWxlZCB0byBtYXRjaCBib2R5IG9mOiBcIicgKyB0YWcgKyAnXCInKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9za2lwVW50aWxFbmQgPSBmdW5jdGlvbiBza2lwVW50aWxFbmQoYnVmZmVyLCBmYWlsKSB7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB0YWcgPSBkZXJEZWNvZGVUYWcoYnVmZmVyLCBmYWlsKTtcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IodGFnKSlcbiAgICAgIHJldHVybiB0YWc7XG4gICAgY29uc3QgbGVuID0gZGVyRGVjb2RlTGVuKGJ1ZmZlciwgdGFnLnByaW1pdGl2ZSwgZmFpbCk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKGxlbikpXG4gICAgICByZXR1cm4gbGVuO1xuXG4gICAgbGV0IHJlcztcbiAgICBpZiAodGFnLnByaW1pdGl2ZSB8fCBsZW4gIT09IG51bGwpXG4gICAgICByZXMgPSBidWZmZXIuc2tpcChsZW4pO1xuICAgIGVsc2VcbiAgICAgIHJlcyA9IHRoaXMuX3NraXBVbnRpbEVuZChidWZmZXIsIGZhaWwpO1xuXG4gICAgLy8gRmFpbHVyZVxuICAgIGlmIChidWZmZXIuaXNFcnJvcihyZXMpKVxuICAgICAgcmV0dXJuIHJlcztcblxuICAgIGlmICh0YWcudGFnU3RyID09PSAnZW5kJylcbiAgICAgIGJyZWFrO1xuICB9XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlTGlzdCA9IGZ1bmN0aW9uIGRlY29kZUxpc3QoYnVmZmVyLCB0YWcsIGRlY29kZXIsXG4gIG9wdGlvbnMpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIHdoaWxlICghYnVmZmVyLmlzRW1wdHkoKSkge1xuICAgIGNvbnN0IHBvc3NpYmxlRW5kID0gdGhpcy5fcGVla1RhZyhidWZmZXIsICdlbmQnKTtcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IocG9zc2libGVFbmQpKVxuICAgICAgcmV0dXJuIHBvc3NpYmxlRW5kO1xuXG4gICAgY29uc3QgcmVzID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLCAnZGVyJywgb3B0aW9ucyk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKHJlcykgJiYgcG9zc2libGVFbmQpXG4gICAgICBicmVhaztcbiAgICByZXN1bHQucHVzaChyZXMpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlU3RyID0gZnVuY3Rpb24gZGVjb2RlU3RyKGJ1ZmZlciwgdGFnKSB7XG4gIGlmICh0YWcgPT09ICdiaXRzdHInKSB7XG4gICAgY29uc3QgdW51c2VkID0gYnVmZmVyLnJlYWRVSW50OCgpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcih1bnVzZWQpKVxuICAgICAgcmV0dXJuIHVudXNlZDtcbiAgICByZXR1cm4geyB1bnVzZWQ6IHVudXNlZCwgZGF0YTogYnVmZmVyLnJhdygpIH07XG4gIH0gZWxzZSBpZiAodGFnID09PSAnYm1wc3RyJykge1xuICAgIGNvbnN0IHJhdyA9IGJ1ZmZlci5yYXcoKTtcbiAgICBpZiAocmF3Lmxlbmd0aCAlIDIgPT09IDEpXG4gICAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogYm1wc3RyIGxlbmd0aCBtaXNtYXRjaCcpO1xuXG4gICAgbGV0IHN0ciA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3Lmxlbmd0aCAvIDI7IGkrKykge1xuICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocmF3LnJlYWRVSW50MTZCRShpICogMikpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ251bXN0cicpIHtcbiAgICBjb25zdCBudW1zdHIgPSBidWZmZXIucmF3KCkudG9TdHJpbmcoJ2FzY2lpJyk7XG4gICAgaWYgKCF0aGlzLl9pc051bXN0cihudW1zdHIpKSB7XG4gICAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdudW1zdHIgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgICByZXR1cm4gbnVtc3RyO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ29jdHN0cicpIHtcbiAgICByZXR1cm4gYnVmZmVyLnJhdygpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ29iakRlc2MnKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5yYXcoKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdwcmludHN0cicpIHtcbiAgICBjb25zdCBwcmludHN0ciA9IGJ1ZmZlci5yYXcoKS50b1N0cmluZygnYXNjaWknKTtcbiAgICBpZiAoIXRoaXMuX2lzUHJpbnRzdHIocHJpbnRzdHIpKSB7XG4gICAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdwcmludHN0ciB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICAgIHJldHVybiBwcmludHN0cjtcbiAgfSBlbHNlIGlmICgvc3RyJC8udGVzdCh0YWcpKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5yYXcoKS50b1N0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBidWZmZXIuZXJyb3IoJ0RlY29kaW5nIG9mIHN0cmluZyB0eXBlOiAnICsgdGFnICsgJyB1bnN1cHBvcnRlZCcpO1xuICB9XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlT2JqaWQgPSBmdW5jdGlvbiBkZWNvZGVPYmppZChidWZmZXIsIHZhbHVlcywgcmVsYXRpdmUpIHtcbiAgbGV0IHJlc3VsdDtcbiAgY29uc3QgaWRlbnRpZmllcnMgPSBbXTtcbiAgbGV0IGlkZW50ID0gMDtcbiAgbGV0IHN1YmlkZW50ID0gMDtcbiAgd2hpbGUgKCFidWZmZXIuaXNFbXB0eSgpKSB7XG4gICAgc3ViaWRlbnQgPSBidWZmZXIucmVhZFVJbnQ4KCk7XG4gICAgaWRlbnQgPDw9IDc7XG4gICAgaWRlbnQgfD0gc3ViaWRlbnQgJiAweDdmO1xuICAgIGlmICgoc3ViaWRlbnQgJiAweDgwKSA9PT0gMCkge1xuICAgICAgaWRlbnRpZmllcnMucHVzaChpZGVudCk7XG4gICAgICBpZGVudCA9IDA7XG4gICAgfVxuICB9XG4gIGlmIChzdWJpZGVudCAmIDB4ODApXG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudCk7XG5cbiAgY29uc3QgZmlyc3QgPSAoaWRlbnRpZmllcnNbMF0gLyA0MCkgfCAwO1xuICBjb25zdCBzZWNvbmQgPSBpZGVudGlmaWVyc1swXSAlIDQwO1xuXG4gIGlmIChyZWxhdGl2ZSlcbiAgICByZXN1bHQgPSBpZGVudGlmaWVycztcbiAgZWxzZVxuICAgIHJlc3VsdCA9IFtmaXJzdCwgc2Vjb25kXS5jb25jYXQoaWRlbnRpZmllcnMuc2xpY2UoMSkpO1xuXG4gIGlmICh2YWx1ZXMpIHtcbiAgICBsZXQgdG1wID0gdmFsdWVzW3Jlc3VsdC5qb2luKCcgJyldO1xuICAgIGlmICh0bXAgPT09IHVuZGVmaW5lZClcbiAgICAgIHRtcCA9IHZhbHVlc1tyZXN1bHQuam9pbignLicpXTtcbiAgICBpZiAodG1wICE9PSB1bmRlZmluZWQpXG4gICAgICByZXN1bHQgPSB0bXA7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZVRpbWUgPSBmdW5jdGlvbiBkZWNvZGVUaW1lKGJ1ZmZlciwgdGFnKSB7XG4gIGNvbnN0IHN0ciA9IGJ1ZmZlci5yYXcoKS50b1N0cmluZygpO1xuXG4gIGxldCB5ZWFyO1xuICBsZXQgbW9uO1xuICBsZXQgZGF5O1xuICBsZXQgaG91cjtcbiAgbGV0IG1pbjtcbiAgbGV0IHNlYztcbiAgaWYgKHRhZyA9PT0gJ2dlbnRpbWUnKSB7XG4gICAgeWVhciA9IHN0ci5zbGljZSgwLCA0KSB8IDA7XG4gICAgbW9uID0gc3RyLnNsaWNlKDQsIDYpIHwgMDtcbiAgICBkYXkgPSBzdHIuc2xpY2UoNiwgOCkgfCAwO1xuICAgIGhvdXIgPSBzdHIuc2xpY2UoOCwgMTApIHwgMDtcbiAgICBtaW4gPSBzdHIuc2xpY2UoMTAsIDEyKSB8IDA7XG4gICAgc2VjID0gc3RyLnNsaWNlKDEyLCAxNCkgfCAwO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3V0Y3RpbWUnKSB7XG4gICAgeWVhciA9IHN0ci5zbGljZSgwLCAyKSB8IDA7XG4gICAgbW9uID0gc3RyLnNsaWNlKDIsIDQpIHwgMDtcbiAgICBkYXkgPSBzdHIuc2xpY2UoNCwgNikgfCAwO1xuICAgIGhvdXIgPSBzdHIuc2xpY2UoNiwgOCkgfCAwO1xuICAgIG1pbiA9IHN0ci5zbGljZSg4LCAxMCkgfCAwO1xuICAgIHNlYyA9IHN0ci5zbGljZSgxMCwgMTIpIHwgMDtcbiAgICBpZiAoeWVhciA8IDcwKVxuICAgICAgeWVhciA9IDIwMDAgKyB5ZWFyO1xuICAgIGVsc2VcbiAgICAgIHllYXIgPSAxOTAwICsgeWVhcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyAnICsgdGFnICsgJyB0aW1lIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Jyk7XG4gIH1cblxuICByZXR1cm4gRGF0ZS5VVEMoeWVhciwgbW9uIC0gMSwgZGF5LCBob3VyLCBtaW4sIHNlYywgMCk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlTnVsbCA9IGZ1bmN0aW9uIGRlY29kZU51bGwoKSB7XG4gIHJldHVybiBudWxsO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZUJvb2wgPSBmdW5jdGlvbiBkZWNvZGVCb29sKGJ1ZmZlcikge1xuICBjb25zdCByZXMgPSBidWZmZXIucmVhZFVJbnQ4KCk7XG4gIGlmIChidWZmZXIuaXNFcnJvcihyZXMpKVxuICAgIHJldHVybiByZXM7XG4gIGVsc2VcbiAgICByZXR1cm4gcmVzICE9PSAwO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZUludCA9IGZ1bmN0aW9uIGRlY29kZUludChidWZmZXIsIHZhbHVlcykge1xuICAvLyBCaWdpbnQsIHJldHVybiBhcyBpdCBpcyAoYXNzdW1lIGJpZyBlbmRpYW4pXG4gIGNvbnN0IHJhdyA9IGJ1ZmZlci5yYXcoKTtcbiAgbGV0IHJlcyA9IG5ldyBiaWdudW0ocmF3KTtcblxuICBpZiAodmFsdWVzKVxuICAgIHJlcyA9IHZhbHVlc1tyZXMudG9TdHJpbmcoMTApXSB8fCByZXM7XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl91c2UgPSBmdW5jdGlvbiB1c2UoZW50aXR5LCBvYmopIHtcbiAgaWYgKHR5cGVvZiBlbnRpdHkgPT09ICdmdW5jdGlvbicpXG4gICAgZW50aXR5ID0gZW50aXR5KG9iaik7XG4gIHJldHVybiBlbnRpdHkuX2dldERlY29kZXIoJ2RlcicpLnRyZWU7XG59O1xuXG4vLyBVdGlsaXR5IG1ldGhvZHNcblxuZnVuY3Rpb24gZGVyRGVjb2RlVGFnKGJ1ZiwgZmFpbCkge1xuICBsZXQgdGFnID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgaWYgKGJ1Zi5pc0Vycm9yKHRhZykpXG4gICAgcmV0dXJuIHRhZztcblxuICBjb25zdCBjbHMgPSBkZXIudGFnQ2xhc3NbdGFnID4+IDZdO1xuICBjb25zdCBwcmltaXRpdmUgPSAodGFnICYgMHgyMCkgPT09IDA7XG5cbiAgLy8gTXVsdGktb2N0ZXQgdGFnIC0gbG9hZFxuICBpZiAoKHRhZyAmIDB4MWYpID09PSAweDFmKSB7XG4gICAgbGV0IG9jdCA9IHRhZztcbiAgICB0YWcgPSAwO1xuICAgIHdoaWxlICgob2N0ICYgMHg4MCkgPT09IDB4ODApIHtcbiAgICAgIG9jdCA9IGJ1Zi5yZWFkVUludDgoZmFpbCk7XG4gICAgICBpZiAoYnVmLmlzRXJyb3Iob2N0KSlcbiAgICAgICAgcmV0dXJuIG9jdDtcblxuICAgICAgdGFnIDw8PSA3O1xuICAgICAgdGFnIHw9IG9jdCAmIDB4N2Y7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRhZyAmPSAweDFmO1xuICB9XG4gIGNvbnN0IHRhZ1N0ciA9IGRlci50YWdbdGFnXTtcblxuICByZXR1cm4ge1xuICAgIGNsczogY2xzLFxuICAgIHByaW1pdGl2ZTogcHJpbWl0aXZlLFxuICAgIHRhZzogdGFnLFxuICAgIHRhZ1N0cjogdGFnU3RyXG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlckRlY29kZUxlbihidWYsIHByaW1pdGl2ZSwgZmFpbCkge1xuICBsZXQgbGVuID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgaWYgKGJ1Zi5pc0Vycm9yKGxlbikpXG4gICAgcmV0dXJuIGxlbjtcblxuICAvLyBJbmRlZmluaXRlIGZvcm1cbiAgaWYgKCFwcmltaXRpdmUgJiYgbGVuID09PSAweDgwKVxuICAgIHJldHVybiBudWxsO1xuXG4gIC8vIERlZmluaXRlIGZvcm1cbiAgaWYgKChsZW4gJiAweDgwKSA9PT0gMCkge1xuICAgIC8vIFNob3J0IGZvcm1cbiAgICByZXR1cm4gbGVuO1xuICB9XG5cbiAgLy8gTG9uZyBmb3JtXG4gIGNvbnN0IG51bSA9IGxlbiAmIDB4N2Y7XG4gIGlmIChudW0gPiA0KVxuICAgIHJldHVybiBidWYuZXJyb3IoJ2xlbmd0aCBvY3RlY3QgaXMgdG9vIGxvbmcnKTtcblxuICBsZW4gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bTsgaSsrKSB7XG4gICAgbGVuIDw8PSA4O1xuICAgIGNvbnN0IGogPSBidWYucmVhZFVJbnQ4KGZhaWwpO1xuICAgIGlmIChidWYuaXNFcnJvcihqKSlcbiAgICAgIHJldHVybiBqO1xuICAgIGxlbiB8PSBqO1xuICB9XG5cbiAgcmV0dXJuIGxlbjtcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5jb25zdCBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG5cbmNvbnN0IERFUkRlY29kZXIgPSByZXF1aXJlKCcuL2RlcicpO1xuXG5mdW5jdGlvbiBQRU1EZWNvZGVyKGVudGl0eSkge1xuICBERVJEZWNvZGVyLmNhbGwodGhpcywgZW50aXR5KTtcbiAgdGhpcy5lbmMgPSAncGVtJztcbn1cbmluaGVyaXRzKFBFTURlY29kZXIsIERFUkRlY29kZXIpO1xubW9kdWxlLmV4cG9ydHMgPSBQRU1EZWNvZGVyO1xuXG5QRU1EZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoZGF0YSwgb3B0aW9ucykge1xuICBjb25zdCBsaW5lcyA9IGRhdGEudG9TdHJpbmcoKS5zcGxpdCgvW1xcclxcbl0rL2cpO1xuXG4gIGNvbnN0IGxhYmVsID0gb3B0aW9ucy5sYWJlbC50b1VwcGVyQ2FzZSgpO1xuXG4gIGNvbnN0IHJlID0gL14tLS0tLShCRUdJTnxFTkQpIChbXi1dKyktLS0tLSQvO1xuICBsZXQgc3RhcnQgPSAtMTtcbiAgbGV0IGVuZCA9IC0xO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBsaW5lc1tpXS5tYXRjaChyZSk7XG4gICAgaWYgKG1hdGNoID09PSBudWxsKVxuICAgICAgY29udGludWU7XG5cbiAgICBpZiAobWF0Y2hbMl0gIT09IGxhYmVsKVxuICAgICAgY29udGludWU7XG5cbiAgICBpZiAoc3RhcnQgPT09IC0xKSB7XG4gICAgICBpZiAobWF0Y2hbMV0gIT09ICdCRUdJTicpXG4gICAgICAgIGJyZWFrO1xuICAgICAgc3RhcnQgPSBpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobWF0Y2hbMV0gIT09ICdFTkQnKVxuICAgICAgICBicmVhaztcbiAgICAgIGVuZCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKHN0YXJ0ID09PSAtMSB8fCBlbmQgPT09IC0xKVxuICAgIHRocm93IG5ldyBFcnJvcignUEVNIHNlY3Rpb24gbm90IGZvdW5kIGZvcjogJyArIGxhYmVsKTtcblxuICBjb25zdCBiYXNlNjQgPSBsaW5lcy5zbGljZShzdGFydCArIDEsIGVuZCkuam9pbignJyk7XG4gIC8vIFJlbW92ZSBleGNlc3NpdmUgc3ltYm9sc1xuICBiYXNlNjQucmVwbGFjZSgvW15hLXowLTkrLz1dKy9naSwgJycpO1xuXG4gIGNvbnN0IGlucHV0ID0gQnVmZmVyLmZyb20oYmFzZTY0LCAnYmFzZTY0Jyk7XG4gIHJldHVybiBERVJEZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUuY2FsbCh0aGlzLCBpbnB1dCwgb3B0aW9ucyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGRlY29kZXJzID0gZXhwb3J0cztcblxuZGVjb2RlcnMuZGVyID0gcmVxdWlyZSgnLi9kZXInKTtcbmRlY29kZXJzLnBlbSA9IHJlcXVpcmUoJy4vcGVtJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZW5jb2RlcnMgPSByZXF1aXJlKCcuL2VuY29kZXJzJyk7XG5jb25zdCBkZWNvZGVycyA9IHJlcXVpcmUoJy4vZGVjb2RlcnMnKTtcbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuY29uc3QgYXBpID0gZXhwb3J0cztcblxuYXBpLmRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShuYW1lLCBib2R5KSB7XG4gIHJldHVybiBuZXcgRW50aXR5KG5hbWUsIGJvZHkpO1xufTtcblxuZnVuY3Rpb24gRW50aXR5KG5hbWUsIGJvZHkpIHtcbiAgdGhpcy5uYW1lID0gbmFtZTtcbiAgdGhpcy5ib2R5ID0gYm9keTtcblxuICB0aGlzLmRlY29kZXJzID0ge307XG4gIHRoaXMuZW5jb2RlcnMgPSB7fTtcbn1cblxuRW50aXR5LnByb3RvdHlwZS5fY3JlYXRlTmFtZWQgPSBmdW5jdGlvbiBjcmVhdGVOYW1lZChCYXNlKSB7XG4gIGNvbnN0IG5hbWUgPSB0aGlzLm5hbWU7XG5cbiAgZnVuY3Rpb24gR2VuZXJhdGVkKGVudGl0eSkge1xuICAgIHRoaXMuX2luaXROYW1lZChlbnRpdHksIG5hbWUpO1xuICB9XG4gIGluaGVyaXRzKEdlbmVyYXRlZCwgQmFzZSk7XG4gIEdlbmVyYXRlZC5wcm90b3R5cGUuX2luaXROYW1lZCA9IGZ1bmN0aW9uIF9pbml0TmFtZWQoZW50aXR5LCBuYW1lKSB7XG4gICAgQmFzZS5jYWxsKHRoaXMsIGVudGl0eSwgbmFtZSk7XG4gIH07XG5cbiAgcmV0dXJuIG5ldyBHZW5lcmF0ZWQodGhpcyk7XG59O1xuXG5FbnRpdHkucHJvdG90eXBlLl9nZXREZWNvZGVyID0gZnVuY3Rpb24gX2dldERlY29kZXIoZW5jKSB7XG4gIGVuYyA9IGVuYyB8fCAnZGVyJztcbiAgLy8gTGF6aWx5IGNyZWF0ZSBkZWNvZGVyXG4gIGlmICghdGhpcy5kZWNvZGVycy5oYXNPd25Qcm9wZXJ0eShlbmMpKVxuICAgIHRoaXMuZGVjb2RlcnNbZW5jXSA9IHRoaXMuX2NyZWF0ZU5hbWVkKGRlY29kZXJzW2VuY10pO1xuICByZXR1cm4gdGhpcy5kZWNvZGVyc1tlbmNdO1xufTtcblxuRW50aXR5LnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoZGF0YSwgZW5jLCBvcHRpb25zKSB7XG4gIHJldHVybiB0aGlzLl9nZXREZWNvZGVyKGVuYykuZGVjb2RlKGRhdGEsIG9wdGlvbnMpO1xufTtcblxuRW50aXR5LnByb3RvdHlwZS5fZ2V0RW5jb2RlciA9IGZ1bmN0aW9uIF9nZXRFbmNvZGVyKGVuYykge1xuICBlbmMgPSBlbmMgfHwgJ2Rlcic7XG4gIC8vIExhemlseSBjcmVhdGUgZW5jb2RlclxuICBpZiAoIXRoaXMuZW5jb2RlcnMuaGFzT3duUHJvcGVydHkoZW5jKSlcbiAgICB0aGlzLmVuY29kZXJzW2VuY10gPSB0aGlzLl9jcmVhdGVOYW1lZChlbmNvZGVyc1tlbmNdKTtcbiAgcmV0dXJuIHRoaXMuZW5jb2RlcnNbZW5jXTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGRhdGEsIGVuYywgLyogaW50ZXJuYWwgKi8gcmVwb3J0ZXIpIHtcbiAgcmV0dXJuIHRoaXMuX2dldEVuY29kZXIoZW5jKS5lbmNvZGUoZGF0YSwgcmVwb3J0ZXIpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBiYXNlID0gZXhwb3J0cztcblxuYmFzZS5SZXBvcnRlciA9IHJlcXVpcmUoJy4vcmVwb3J0ZXInKS5SZXBvcnRlcjtcbmJhc2UuRGVjb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJykuRGVjb2RlckJ1ZmZlcjtcbmJhc2UuRW5jb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJykuRW5jb2RlckJ1ZmZlcjtcbmJhc2UuTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGNvbnN0YW50cyA9IGV4cG9ydHM7XG5cbi8vIEhlbHBlclxuY29uc3RhbnRzLl9yZXZlcnNlID0gZnVuY3Rpb24gcmV2ZXJzZShtYXApIHtcbiAgY29uc3QgcmVzID0ge307XG5cbiAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIC8vIENvbnZlcnQga2V5IHRvIGludGVnZXIgaWYgaXQgaXMgc3RyaW5naWZpZWRcbiAgICBpZiAoKGtleSB8IDApID09IGtleSlcbiAgICAgIGtleSA9IGtleSB8IDA7XG5cbiAgICBjb25zdCB2YWx1ZSA9IG1hcFtrZXldO1xuICAgIHJlc1t2YWx1ZV0gPSBrZXk7XG4gIH0pO1xuXG4gIHJldHVybiByZXM7XG59O1xuXG5jb25zdGFudHMuZGVyID0gcmVxdWlyZSgnLi9kZXInKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBhc24xID0gZXhwb3J0cztcblxuYXNuMS5iaWdudW0gPSByZXF1aXJlKCdibi5qcycpO1xuXG5hc24xLmRlZmluZSA9IHJlcXVpcmUoJy4vYXNuMS9hcGknKS5kZWZpbmU7XG5hc24xLmJhc2UgPSByZXF1aXJlKCcuL2FzbjEvYmFzZScpO1xuYXNuMS5jb25zdGFudHMgPSByZXF1aXJlKCcuL2FzbjEvY29uc3RhbnRzJyk7XG5hc24xLmRlY29kZXJzID0gcmVxdWlyZSgnLi9hc24xL2RlY29kZXJzJyk7XG5hc24xLmVuY29kZXJzID0gcmVxdWlyZSgnLi9hc24xL2VuY29kZXJzJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gZXhwb3J0cztcblxuZnVuY3Rpb24gdG9BcnJheShtc2csIGVuYykge1xuICBpZiAoQXJyYXkuaXNBcnJheShtc2cpKVxuICAgIHJldHVybiBtc2cuc2xpY2UoKTtcbiAgaWYgKCFtc2cpXG4gICAgcmV0dXJuIFtdO1xuICB2YXIgcmVzID0gW107XG4gIGlmICh0eXBlb2YgbXNnICE9PSAnc3RyaW5nJykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgICAgcmVzW2ldID0gbXNnW2ldIHwgMDtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIGlmIChlbmMgPT09ICdoZXgnKSB7XG4gICAgbXNnID0gbXNnLnJlcGxhY2UoL1teYS16MC05XSsvaWcsICcnKTtcbiAgICBpZiAobXNnLmxlbmd0aCAlIDIgIT09IDApXG4gICAgICBtc2cgPSAnMCcgKyBtc2c7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpICs9IDIpXG4gICAgICByZXMucHVzaChwYXJzZUludChtc2dbaV0gKyBtc2dbaSArIDFdLCAxNikpO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYyA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgdmFyIGhpID0gYyA+PiA4O1xuICAgICAgdmFyIGxvID0gYyAmIDB4ZmY7XG4gICAgICBpZiAoaGkpXG4gICAgICAgIHJlcy5wdXNoKGhpLCBsbyk7XG4gICAgICBlbHNlXG4gICAgICAgIHJlcy5wdXNoKGxvKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbnV0aWxzLnRvQXJyYXkgPSB0b0FycmF5O1xuXG5mdW5jdGlvbiB6ZXJvMih3b3JkKSB7XG4gIGlmICh3b3JkLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gJzAnICsgd29yZDtcbiAgZWxzZVxuICAgIHJldHVybiB3b3JkO1xufVxudXRpbHMuemVybzIgPSB6ZXJvMjtcblxuZnVuY3Rpb24gdG9IZXgobXNnKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgcmVzICs9IHplcm8yKG1zZ1tpXS50b1N0cmluZygxNikpO1xuICByZXR1cm4gcmVzO1xufVxudXRpbHMudG9IZXggPSB0b0hleDtcblxudXRpbHMuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGFyciwgZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB0b0hleChhcnIpO1xuICBlbHNlXG4gICAgcmV0dXJuIGFycjtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gZXhwb3J0cztcbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgbWluQXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xudmFyIG1pblV0aWxzID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWNyeXB0by11dGlscycpO1xuXG51dGlscy5hc3NlcnQgPSBtaW5Bc3NlcnQ7XG51dGlscy50b0FycmF5ID0gbWluVXRpbHMudG9BcnJheTtcbnV0aWxzLnplcm8yID0gbWluVXRpbHMuemVybzI7XG51dGlscy50b0hleCA9IG1pblV0aWxzLnRvSGV4O1xudXRpbHMuZW5jb2RlID0gbWluVXRpbHMuZW5jb2RlO1xuXG4vLyBSZXByZXNlbnQgbnVtIGluIGEgdy1OQUYgZm9ybVxuZnVuY3Rpb24gZ2V0TkFGKG51bSwgdywgYml0cykge1xuICB2YXIgbmFmID0gbmV3IEFycmF5KE1hdGgubWF4KG51bS5iaXRMZW5ndGgoKSwgYml0cykgKyAxKTtcbiAgdmFyIGk7XG4gIGZvciAoaSA9IDA7IGkgPCBuYWYubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBuYWZbaV0gPSAwO1xuICB9XG5cbiAgdmFyIHdzID0gMSA8PCAodyArIDEpO1xuICB2YXIgayA9IG51bS5jbG9uZSgpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBuYWYubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgejtcbiAgICB2YXIgbW9kID0gay5hbmRsbih3cyAtIDEpO1xuICAgIGlmIChrLmlzT2RkKCkpIHtcbiAgICAgIGlmIChtb2QgPiAod3MgPj4gMSkgLSAxKVxuICAgICAgICB6ID0gKHdzID4+IDEpIC0gbW9kO1xuICAgICAgZWxzZVxuICAgICAgICB6ID0gbW9kO1xuICAgICAgay5pc3Vibih6KTtcbiAgICB9IGVsc2Uge1xuICAgICAgeiA9IDA7XG4gICAgfVxuXG4gICAgbmFmW2ldID0gejtcbiAgICBrLml1c2hybigxKTtcbiAgfVxuXG4gIHJldHVybiBuYWY7XG59XG51dGlscy5nZXROQUYgPSBnZXROQUY7XG5cbi8vIFJlcHJlc2VudCBrMSwgazIgaW4gYSBKb2ludCBTcGFyc2UgRm9ybVxuZnVuY3Rpb24gZ2V0SlNGKGsxLCBrMikge1xuICB2YXIganNmID0gW1xuICAgIFtdLFxuICAgIFtdLFxuICBdO1xuXG4gIGsxID0gazEuY2xvbmUoKTtcbiAgazIgPSBrMi5jbG9uZSgpO1xuICB2YXIgZDEgPSAwO1xuICB2YXIgZDIgPSAwO1xuICB2YXIgbTg7XG4gIHdoaWxlIChrMS5jbXBuKC1kMSkgPiAwIHx8IGsyLmNtcG4oLWQyKSA+IDApIHtcbiAgICAvLyBGaXJzdCBwaGFzZVxuICAgIHZhciBtMTQgPSAoazEuYW5kbG4oMykgKyBkMSkgJiAzO1xuICAgIHZhciBtMjQgPSAoazIuYW5kbG4oMykgKyBkMikgJiAzO1xuICAgIGlmIChtMTQgPT09IDMpXG4gICAgICBtMTQgPSAtMTtcbiAgICBpZiAobTI0ID09PSAzKVxuICAgICAgbTI0ID0gLTE7XG4gICAgdmFyIHUxO1xuICAgIGlmICgobTE0ICYgMSkgPT09IDApIHtcbiAgICAgIHUxID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgbTggPSAoazEuYW5kbG4oNykgKyBkMSkgJiA3O1xuICAgICAgaWYgKChtOCA9PT0gMyB8fCBtOCA9PT0gNSkgJiYgbTI0ID09PSAyKVxuICAgICAgICB1MSA9IC1tMTQ7XG4gICAgICBlbHNlXG4gICAgICAgIHUxID0gbTE0O1xuICAgIH1cbiAgICBqc2ZbMF0ucHVzaCh1MSk7XG5cbiAgICB2YXIgdTI7XG4gICAgaWYgKChtMjQgJiAxKSA9PT0gMCkge1xuICAgICAgdTIgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBtOCA9IChrMi5hbmRsbig3KSArIGQyKSAmIDc7XG4gICAgICBpZiAoKG04ID09PSAzIHx8IG04ID09PSA1KSAmJiBtMTQgPT09IDIpXG4gICAgICAgIHUyID0gLW0yNDtcbiAgICAgIGVsc2VcbiAgICAgICAgdTIgPSBtMjQ7XG4gICAgfVxuICAgIGpzZlsxXS5wdXNoKHUyKTtcblxuICAgIC8vIFNlY29uZCBwaGFzZVxuICAgIGlmICgyICogZDEgPT09IHUxICsgMSlcbiAgICAgIGQxID0gMSAtIGQxO1xuICAgIGlmICgyICogZDIgPT09IHUyICsgMSlcbiAgICAgIGQyID0gMSAtIGQyO1xuICAgIGsxLml1c2hybigxKTtcbiAgICBrMi5pdXNocm4oMSk7XG4gIH1cblxuICByZXR1cm4ganNmO1xufVxudXRpbHMuZ2V0SlNGID0gZ2V0SlNGO1xuXG5mdW5jdGlvbiBjYWNoZWRQcm9wZXJ0eShvYmosIG5hbWUsIGNvbXB1dGVyKSB7XG4gIHZhciBrZXkgPSAnXycgKyBuYW1lO1xuICBvYmoucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24gY2FjaGVkUHJvcGVydHkoKSB7XG4gICAgcmV0dXJuIHRoaXNba2V5XSAhPT0gdW5kZWZpbmVkID8gdGhpc1trZXldIDpcbiAgICAgIHRoaXNba2V5XSA9IGNvbXB1dGVyLmNhbGwodGhpcyk7XG4gIH07XG59XG51dGlscy5jYWNoZWRQcm9wZXJ0eSA9IGNhY2hlZFByb3BlcnR5O1xuXG5mdW5jdGlvbiBwYXJzZUJ5dGVzKGJ5dGVzKSB7XG4gIHJldHVybiB0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnID8gdXRpbHMudG9BcnJheShieXRlcywgJ2hleCcpIDpcbiAgICBieXRlcztcbn1cbnV0aWxzLnBhcnNlQnl0ZXMgPSBwYXJzZUJ5dGVzO1xuXG5mdW5jdGlvbiBpbnRGcm9tTEUoYnl0ZXMpIHtcbiAgcmV0dXJuIG5ldyBCTihieXRlcywgJ2hleCcsICdsZScpO1xufVxudXRpbHMuaW50RnJvbUxFID0gaW50RnJvbUxFO1xuXG4iLAogICAgInZhciByO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJhbmQobGVuKSB7XG4gIGlmICghcilcbiAgICByID0gbmV3IFJhbmQobnVsbCk7XG5cbiAgcmV0dXJuIHIuZ2VuZXJhdGUobGVuKTtcbn07XG5cbmZ1bmN0aW9uIFJhbmQocmFuZCkge1xuICB0aGlzLnJhbmQgPSByYW5kO1xufVxubW9kdWxlLmV4cG9ydHMuUmFuZCA9IFJhbmQ7XG5cblJhbmQucHJvdG90eXBlLmdlbmVyYXRlID0gZnVuY3Rpb24gZ2VuZXJhdGUobGVuKSB7XG4gIHJldHVybiB0aGlzLl9yYW5kKGxlbik7XG59O1xuXG4vLyBFbXVsYXRlIGNyeXB0byBBUEkgdXNpbmcgcmFuZHlcblJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICBpZiAodGhpcy5yYW5kLmdldEJ5dGVzKVxuICAgIHJldHVybiB0aGlzLnJhbmQuZ2V0Qnl0ZXMobik7XG5cbiAgdmFyIHJlcyA9IG5ldyBVaW50OEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcy5sZW5ndGg7IGkrKylcbiAgICByZXNbaV0gPSB0aGlzLnJhbmQuZ2V0Qnl0ZSgpO1xuICByZXR1cm4gcmVzO1xufTtcblxuaWYgKHR5cGVvZiBzZWxmID09PSAnb2JqZWN0Jykge1xuICBpZiAoc2VsZi5jcnlwdG8gJiYgc2VsZi5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gTW9kZXJuIGJyb3dzZXJzXG4gICAgUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbiBfcmFuZChuKSB7XG4gICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gICAgICBzZWxmLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyKTtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChzZWxmLm1zQ3J5cHRvICYmIHNlbGYubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gSUVcbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheShuKTtcbiAgICAgIHNlbGYubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycik7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH07XG5cbiAgLy8gU2FmYXJpJ3MgV2ViV29ya2VycyBkbyBub3QgaGF2ZSBgY3J5cHRvYFxuICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gT2xkIGp1bmtcbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgfTtcbiAgfVxufSBlbHNlIHtcbiAgLy8gTm9kZS5qcyBvciBXZWIgd29ya2VyIHdpdGggbm8gY3J5cHRvIHN1cHBvcnRcbiAgdHJ5IHtcbiAgICB2YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG4gICAgaWYgKHR5cGVvZiBjcnlwdG8ucmFuZG9tQnl0ZXMgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQnKTtcblxuICAgIFJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21CeXRlcyhuKTtcbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBnZXROQUYgPSB1dGlscy5nZXROQUY7XG52YXIgZ2V0SlNGID0gdXRpbHMuZ2V0SlNGO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gQmFzZUN1cnZlKHR5cGUsIGNvbmYpIHtcbiAgdGhpcy50eXBlID0gdHlwZTtcbiAgdGhpcy5wID0gbmV3IEJOKGNvbmYucCwgMTYpO1xuXG4gIC8vIFVzZSBNb250Z29tZXJ5LCB3aGVuIHRoZXJlIGlzIG5vIGZhc3QgcmVkdWN0aW9uIGZvciB0aGUgcHJpbWVcbiAgdGhpcy5yZWQgPSBjb25mLnByaW1lID8gQk4ucmVkKGNvbmYucHJpbWUpIDogQk4ubW9udCh0aGlzLnApO1xuXG4gIC8vIFVzZWZ1bCBmb3IgbWFueSBjdXJ2ZXNcbiAgdGhpcy56ZXJvID0gbmV3IEJOKDApLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5vbmUgPSBuZXcgQk4oMSkudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLnR3byA9IG5ldyBCTigyKS50b1JlZCh0aGlzLnJlZCk7XG5cbiAgLy8gQ3VydmUgY29uZmlndXJhdGlvbiwgb3B0aW9uYWxcbiAgdGhpcy5uID0gY29uZi5uICYmIG5ldyBCTihjb25mLm4sIDE2KTtcbiAgdGhpcy5nID0gY29uZi5nICYmIHRoaXMucG9pbnRGcm9tSlNPTihjb25mLmcsIGNvbmYuZ1JlZCk7XG5cbiAgLy8gVGVtcG9yYXJ5IGFycmF5c1xuICB0aGlzLl93bmFmVDEgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX3duYWZUMiA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fd25hZlQzID0gbmV3IEFycmF5KDQpO1xuICB0aGlzLl93bmFmVDQgPSBuZXcgQXJyYXkoNCk7XG5cbiAgdGhpcy5fYml0TGVuZ3RoID0gdGhpcy5uID8gdGhpcy5uLmJpdExlbmd0aCgpIDogMDtcblxuICAvLyBHZW5lcmFsaXplZCBHcmVnIE1heHdlbGwncyB0cmlja1xuICB2YXIgYWRqdXN0Q291bnQgPSB0aGlzLm4gJiYgdGhpcy5wLmRpdih0aGlzLm4pO1xuICBpZiAoIWFkanVzdENvdW50IHx8IGFkanVzdENvdW50LmNtcG4oMTAwKSA+IDApIHtcbiAgICB0aGlzLnJlZE4gPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX21heHdlbGxUcmljayA9IHRydWU7XG4gICAgdGhpcy5yZWROID0gdGhpcy5uLnRvUmVkKHRoaXMucmVkKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBCYXNlQ3VydmU7XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbiBwb2ludCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUuX2ZpeGVkTmFmTXVsID0gZnVuY3Rpb24gX2ZpeGVkTmFmTXVsKHAsIGspIHtcbiAgYXNzZXJ0KHAucHJlY29tcHV0ZWQpO1xuICB2YXIgZG91YmxlcyA9IHAuX2dldERvdWJsZXMoKTtcblxuICB2YXIgbmFmID0gZ2V0TkFGKGssIDEsIHRoaXMuX2JpdExlbmd0aCk7XG4gIHZhciBJID0gKDEgPDwgKGRvdWJsZXMuc3RlcCArIDEpKSAtIChkb3VibGVzLnN0ZXAgJSAyID09PSAwID8gMiA6IDEpO1xuICBJIC89IDM7XG5cbiAgLy8gVHJhbnNsYXRlIGludG8gbW9yZSB3aW5kb3dlZCBmb3JtXG4gIHZhciByZXByID0gW107XG4gIHZhciBqO1xuICB2YXIgbmFmVztcbiAgZm9yIChqID0gMDsgaiA8IG5hZi5sZW5ndGg7IGogKz0gZG91Ymxlcy5zdGVwKSB7XG4gICAgbmFmVyA9IDA7XG4gICAgZm9yICh2YXIgbCA9IGogKyBkb3VibGVzLnN0ZXAgLSAxOyBsID49IGo7IGwtLSlcbiAgICAgIG5hZlcgPSAobmFmVyA8PCAxKSArIG5hZltsXTtcbiAgICByZXByLnB1c2gobmFmVyk7XG4gIH1cblxuICB2YXIgYSA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICB2YXIgYiA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICBmb3IgKHZhciBpID0gSTsgaSA+IDA7IGktLSkge1xuICAgIGZvciAoaiA9IDA7IGogPCByZXByLmxlbmd0aDsgaisrKSB7XG4gICAgICBuYWZXID0gcmVwcltqXTtcbiAgICAgIGlmIChuYWZXID09PSBpKVxuICAgICAgICBiID0gYi5taXhlZEFkZChkb3VibGVzLnBvaW50c1tqXSk7XG4gICAgICBlbHNlIGlmIChuYWZXID09PSAtaSlcbiAgICAgICAgYiA9IGIubWl4ZWRBZGQoZG91Ymxlcy5wb2ludHNbal0ubmVnKCkpO1xuICAgIH1cbiAgICBhID0gYS5hZGQoYik7XG4gIH1cbiAgcmV0dXJuIGEudG9QKCk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLl93bmFmTXVsID0gZnVuY3Rpb24gX3duYWZNdWwocCwgaykge1xuICB2YXIgdyA9IDQ7XG5cbiAgLy8gUHJlY29tcHV0ZSB3aW5kb3dcbiAgdmFyIG5hZlBvaW50cyA9IHAuX2dldE5BRlBvaW50cyh3KTtcbiAgdyA9IG5hZlBvaW50cy53bmQ7XG4gIHZhciB3bmQgPSBuYWZQb2ludHMucG9pbnRzO1xuXG4gIC8vIEdldCBOQUYgZm9ybVxuICB2YXIgbmFmID0gZ2V0TkFGKGssIHcsIHRoaXMuX2JpdExlbmd0aCk7XG5cbiAgLy8gQWRkIGB0aGlzYCooTisxKSBmb3IgZXZlcnkgdy1OQUYgaW5kZXhcbiAgdmFyIGFjYyA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICBmb3IgKHZhciBpID0gbmFmLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgLy8gQ291bnQgemVyb2VzXG4gICAgZm9yICh2YXIgbCA9IDA7IGkgPj0gMCAmJiBuYWZbaV0gPT09IDA7IGktLSlcbiAgICAgIGwrKztcbiAgICBpZiAoaSA+PSAwKVxuICAgICAgbCsrO1xuICAgIGFjYyA9IGFjYy5kYmxwKGwpO1xuXG4gICAgaWYgKGkgPCAwKVxuICAgICAgYnJlYWs7XG4gICAgdmFyIHogPSBuYWZbaV07XG4gICAgYXNzZXJ0KHogIT09IDApO1xuICAgIGlmIChwLnR5cGUgPT09ICdhZmZpbmUnKSB7XG4gICAgICAvLyBKICstIFBcbiAgICAgIGlmICh6ID4gMClcbiAgICAgICAgYWNjID0gYWNjLm1peGVkQWRkKHduZFsoeiAtIDEpID4+IDFdKTtcbiAgICAgIGVsc2VcbiAgICAgICAgYWNjID0gYWNjLm1peGVkQWRkKHduZFsoLXogLSAxKSA+PiAxXS5uZWcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEogKy0gSlxuICAgICAgaWYgKHogPiAwKVxuICAgICAgICBhY2MgPSBhY2MuYWRkKHduZFsoeiAtIDEpID4+IDFdKTtcbiAgICAgIGVsc2VcbiAgICAgICAgYWNjID0gYWNjLmFkZCh3bmRbKC16IC0gMSkgPj4gMV0ubmVnKCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcC50eXBlID09PSAnYWZmaW5lJyA/IGFjYy50b1AoKSA6IGFjYztcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUuX3duYWZNdWxBZGQgPSBmdW5jdGlvbiBfd25hZk11bEFkZChkZWZXLFxuICBwb2ludHMsXG4gIGNvZWZmcyxcbiAgbGVuLFxuICBqYWNvYmlhblJlc3VsdCkge1xuICB2YXIgd25kV2lkdGggPSB0aGlzLl93bmFmVDE7XG4gIHZhciB3bmQgPSB0aGlzLl93bmFmVDI7XG4gIHZhciBuYWYgPSB0aGlzLl93bmFmVDM7XG5cbiAgLy8gRmlsbCBhbGwgYXJyYXlzXG4gIHZhciBtYXggPSAwO1xuICB2YXIgaTtcbiAgdmFyIGo7XG4gIHZhciBwO1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBwID0gcG9pbnRzW2ldO1xuICAgIHZhciBuYWZQb2ludHMgPSBwLl9nZXROQUZQb2ludHMoZGVmVyk7XG4gICAgd25kV2lkdGhbaV0gPSBuYWZQb2ludHMud25kO1xuICAgIHduZFtpXSA9IG5hZlBvaW50cy5wb2ludHM7XG4gIH1cblxuICAvLyBDb21iIHNtYWxsIHdpbmRvdyBOQUZzXG4gIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMTsgaSAtPSAyKSB7XG4gICAgdmFyIGEgPSBpIC0gMTtcbiAgICB2YXIgYiA9IGk7XG4gICAgaWYgKHduZFdpZHRoW2FdICE9PSAxIHx8IHduZFdpZHRoW2JdICE9PSAxKSB7XG4gICAgICBuYWZbYV0gPSBnZXROQUYoY29lZmZzW2FdLCB3bmRXaWR0aFthXSwgdGhpcy5fYml0TGVuZ3RoKTtcbiAgICAgIG5hZltiXSA9IGdldE5BRihjb2VmZnNbYl0sIHduZFdpZHRoW2JdLCB0aGlzLl9iaXRMZW5ndGgpO1xuICAgICAgbWF4ID0gTWF0aC5tYXgobmFmW2FdLmxlbmd0aCwgbWF4KTtcbiAgICAgIG1heCA9IE1hdGgubWF4KG5hZltiXS5sZW5ndGgsIG1heCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgY29tYiA9IFtcbiAgICAgIHBvaW50c1thXSwgLyogMSAqL1xuICAgICAgbnVsbCwgLyogMyAqL1xuICAgICAgbnVsbCwgLyogNSAqL1xuICAgICAgcG9pbnRzW2JdLCAvKiA3ICovXG4gICAgXTtcblxuICAgIC8vIFRyeSB0byBhdm9pZCBQcm9qZWN0aXZlIHBvaW50cywgaWYgcG9zc2libGVcbiAgICBpZiAocG9pbnRzW2FdLnkuY21wKHBvaW50c1tiXS55KSA9PT0gMCkge1xuICAgICAgY29tYlsxXSA9IHBvaW50c1thXS5hZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdLm5lZygpKTtcbiAgICB9IGVsc2UgaWYgKHBvaW50c1thXS55LmNtcChwb2ludHNbYl0ueS5yZWROZWcoKSkgPT09IDApIHtcbiAgICAgIGNvbWJbMV0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0uYWRkKHBvaW50c1tiXS5uZWcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbWJbMV0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdLm5lZygpKTtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSBbXG4gICAgICAtMywgLyogLTEgLTEgKi9cbiAgICAgIC0xLCAvKiAtMSAwICovXG4gICAgICAtNSwgLyogLTEgMSAqL1xuICAgICAgLTcsIC8qIDAgLTEgKi9cbiAgICAgIDAsIC8qIDAgMCAqL1xuICAgICAgNywgLyogMCAxICovXG4gICAgICA1LCAvKiAxIC0xICovXG4gICAgICAxLCAvKiAxIDAgKi9cbiAgICAgIDMsICAvKiAxIDEgKi9cbiAgICBdO1xuXG4gICAgdmFyIGpzZiA9IGdldEpTRihjb2VmZnNbYV0sIGNvZWZmc1tiXSk7XG4gICAgbWF4ID0gTWF0aC5tYXgoanNmWzBdLmxlbmd0aCwgbWF4KTtcbiAgICBuYWZbYV0gPSBuZXcgQXJyYXkobWF4KTtcbiAgICBuYWZbYl0gPSBuZXcgQXJyYXkobWF4KTtcbiAgICBmb3IgKGogPSAwOyBqIDwgbWF4OyBqKyspIHtcbiAgICAgIHZhciBqYSA9IGpzZlswXVtqXSB8IDA7XG4gICAgICB2YXIgamIgPSBqc2ZbMV1bal0gfCAwO1xuXG4gICAgICBuYWZbYV1bal0gPSBpbmRleFsoamEgKyAxKSAqIDMgKyAoamIgKyAxKV07XG4gICAgICBuYWZbYl1bal0gPSAwO1xuICAgICAgd25kW2FdID0gY29tYjtcbiAgICB9XG4gIH1cblxuICB2YXIgYWNjID0gdGhpcy5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gIHZhciB0bXAgPSB0aGlzLl93bmFmVDQ7XG4gIGZvciAoaSA9IG1heDsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgayA9IDA7XG5cbiAgICB3aGlsZSAoaSA+PSAwKSB7XG4gICAgICB2YXIgemVybyA9IHRydWU7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgdG1wW2pdID0gbmFmW2pdW2ldIHwgMDtcbiAgICAgICAgaWYgKHRtcFtqXSAhPT0gMClcbiAgICAgICAgICB6ZXJvID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXplcm8pXG4gICAgICAgIGJyZWFrO1xuICAgICAgaysrO1xuICAgICAgaS0tO1xuICAgIH1cbiAgICBpZiAoaSA+PSAwKVxuICAgICAgaysrO1xuICAgIGFjYyA9IGFjYy5kYmxwKGspO1xuICAgIGlmIChpIDwgMClcbiAgICAgIGJyZWFrO1xuXG4gICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICB2YXIgeiA9IHRtcFtqXTtcbiAgICAgIHA7XG4gICAgICBpZiAoeiA9PT0gMClcbiAgICAgICAgY29udGludWU7XG4gICAgICBlbHNlIGlmICh6ID4gMClcbiAgICAgICAgcCA9IHduZFtqXVsoeiAtIDEpID4+IDFdO1xuICAgICAgZWxzZSBpZiAoeiA8IDApXG4gICAgICAgIHAgPSB3bmRbal1bKC16IC0gMSkgPj4gMV0ubmVnKCk7XG5cbiAgICAgIGlmIChwLnR5cGUgPT09ICdhZmZpbmUnKVxuICAgICAgICBhY2MgPSBhY2MubWl4ZWRBZGQocCk7XG4gICAgICBlbHNlXG4gICAgICAgIGFjYyA9IGFjYy5hZGQocCk7XG4gICAgfVxuICB9XG4gIC8vIFplcm9pZnkgcmVmZXJlbmNlc1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgd25kW2ldID0gbnVsbDtcblxuICBpZiAoamFjb2JpYW5SZXN1bHQpXG4gICAgcmV0dXJuIGFjYztcbiAgZWxzZVxuICAgIHJldHVybiBhY2MudG9QKCk7XG59O1xuXG5mdW5jdGlvbiBCYXNlUG9pbnQoY3VydmUsIHR5cGUpIHtcbiAgdGhpcy5jdXJ2ZSA9IGN1cnZlO1xuICB0aGlzLnR5cGUgPSB0eXBlO1xuICB0aGlzLnByZWNvbXB1dGVkID0gbnVsbDtcbn1cbkJhc2VDdXJ2ZS5CYXNlUG9pbnQgPSBCYXNlUG9pbnQ7XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcSgvKm90aGVyKi8pIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUudmFsaWRhdGUodGhpcyk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLmRlY29kZVBvaW50ID0gZnVuY3Rpb24gZGVjb2RlUG9pbnQoYnl0ZXMsIGVuYykge1xuICBieXRlcyA9IHV0aWxzLnRvQXJyYXkoYnl0ZXMsIGVuYyk7XG5cbiAgdmFyIGxlbiA9IHRoaXMucC5ieXRlTGVuZ3RoKCk7XG5cbiAgLy8gdW5jb21wcmVzc2VkLCBoeWJyaWQtb2RkLCBoeWJyaWQtZXZlblxuICBpZiAoKGJ5dGVzWzBdID09PSAweDA0IHx8IGJ5dGVzWzBdID09PSAweDA2IHx8IGJ5dGVzWzBdID09PSAweDA3KSAmJlxuICAgICAgYnl0ZXMubGVuZ3RoIC0gMSA9PT0gMiAqIGxlbikge1xuICAgIGlmIChieXRlc1swXSA9PT0gMHgwNilcbiAgICAgIGFzc2VydChieXRlc1tieXRlcy5sZW5ndGggLSAxXSAlIDIgPT09IDApO1xuICAgIGVsc2UgaWYgKGJ5dGVzWzBdID09PSAweDA3KVxuICAgICAgYXNzZXJ0KGJ5dGVzW2J5dGVzLmxlbmd0aCAtIDFdICUgMiA9PT0gMSk7XG5cbiAgICB2YXIgcmVzID0gIHRoaXMucG9pbnQoYnl0ZXMuc2xpY2UoMSwgMSArIGxlbiksXG4gICAgICBieXRlcy5zbGljZSgxICsgbGVuLCAxICsgMiAqIGxlbikpO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfSBlbHNlIGlmICgoYnl0ZXNbMF0gPT09IDB4MDIgfHwgYnl0ZXNbMF0gPT09IDB4MDMpICYmXG4gICAgICAgICAgICAgIGJ5dGVzLmxlbmd0aCAtIDEgPT09IGxlbikge1xuICAgIHJldHVybiB0aGlzLnBvaW50RnJvbVgoYnl0ZXMuc2xpY2UoMSwgMSArIGxlbiksIGJ5dGVzWzBdID09PSAweDAzKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gcG9pbnQgZm9ybWF0Jyk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmVuY29kZUNvbXByZXNzZWQgPSBmdW5jdGlvbiBlbmNvZGVDb21wcmVzc2VkKGVuYykge1xuICByZXR1cm4gdGhpcy5lbmNvZGUoZW5jLCB0cnVlKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2VuY29kZSA9IGZ1bmN0aW9uIF9lbmNvZGUoY29tcGFjdCkge1xuICB2YXIgbGVuID0gdGhpcy5jdXJ2ZS5wLmJ5dGVMZW5ndGgoKTtcbiAgdmFyIHggPSB0aGlzLmdldFgoKS50b0FycmF5KCdiZScsIGxlbik7XG5cbiAgaWYgKGNvbXBhY3QpXG4gICAgcmV0dXJuIFsgdGhpcy5nZXRZKCkuaXNFdmVuKCkgPyAweDAyIDogMHgwMyBdLmNvbmNhdCh4KTtcblxuICByZXR1cm4gWyAweDA0IF0uY29uY2F0KHgsIHRoaXMuZ2V0WSgpLnRvQXJyYXkoJ2JlJywgbGVuKSk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShlbmMsIGNvbXBhY3QpIHtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZSh0aGlzLl9lbmNvZGUoY29tcGFjdCksIGVuYyk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLnByZWNvbXB1dGUgPSBmdW5jdGlvbiBwcmVjb21wdXRlKHBvd2VyKSB7XG4gIGlmICh0aGlzLnByZWNvbXB1dGVkKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIHZhciBwcmVjb21wdXRlZCA9IHtcbiAgICBkb3VibGVzOiBudWxsLFxuICAgIG5hZjogbnVsbCxcbiAgICBiZXRhOiBudWxsLFxuICB9O1xuICBwcmVjb21wdXRlZC5uYWYgPSB0aGlzLl9nZXROQUZQb2ludHMoOCk7XG4gIHByZWNvbXB1dGVkLmRvdWJsZXMgPSB0aGlzLl9nZXREb3VibGVzKDQsIHBvd2VyKTtcbiAgcHJlY29tcHV0ZWQuYmV0YSA9IHRoaXMuX2dldEJldGEoKTtcbiAgdGhpcy5wcmVjb21wdXRlZCA9IHByZWNvbXB1dGVkO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5faGFzRG91YmxlcyA9IGZ1bmN0aW9uIF9oYXNEb3VibGVzKGspIHtcbiAgaWYgKCF0aGlzLnByZWNvbXB1dGVkKVxuICAgIHJldHVybiBmYWxzZTtcblxuICB2YXIgZG91YmxlcyA9IHRoaXMucHJlY29tcHV0ZWQuZG91YmxlcztcbiAgaWYgKCFkb3VibGVzKVxuICAgIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gZG91Ymxlcy5wb2ludHMubGVuZ3RoID49IE1hdGguY2VpbCgoay5iaXRMZW5ndGgoKSArIDEpIC8gZG91Ymxlcy5zdGVwKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2dldERvdWJsZXMgPSBmdW5jdGlvbiBfZ2V0RG91YmxlcyhzdGVwLCBwb3dlcikge1xuICBpZiAodGhpcy5wcmVjb21wdXRlZCAmJiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMpXG4gICAgcmV0dXJuIHRoaXMucHJlY29tcHV0ZWQuZG91YmxlcztcblxuICB2YXIgZG91YmxlcyA9IFsgdGhpcyBdO1xuICB2YXIgYWNjID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3dlcjsgaSArPSBzdGVwKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzdGVwOyBqKyspXG4gICAgICBhY2MgPSBhY2MuZGJsKCk7XG4gICAgZG91Ymxlcy5wdXNoKGFjYyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzdGVwOiBzdGVwLFxuICAgIHBvaW50czogZG91YmxlcyxcbiAgfTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2dldE5BRlBvaW50cyA9IGZ1bmN0aW9uIF9nZXROQUZQb2ludHMod25kKSB7XG4gIGlmICh0aGlzLnByZWNvbXB1dGVkICYmIHRoaXMucHJlY29tcHV0ZWQubmFmKVxuICAgIHJldHVybiB0aGlzLnByZWNvbXB1dGVkLm5hZjtcblxuICB2YXIgcmVzID0gWyB0aGlzIF07XG4gIHZhciBtYXggPSAoMSA8PCB3bmQpIC0gMTtcbiAgdmFyIGRibCA9IG1heCA9PT0gMSA/IG51bGwgOiB0aGlzLmRibCgpO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IG1heDsgaSsrKVxuICAgIHJlc1tpXSA9IHJlc1tpIC0gMV0uYWRkKGRibCk7XG4gIHJldHVybiB7XG4gICAgd25kOiB3bmQsXG4gICAgcG9pbnRzOiByZXMsXG4gIH07XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9nZXRCZXRhID0gZnVuY3Rpb24gX2dldEJldGEoKSB7XG4gIHJldHVybiBudWxsO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5kYmxwID0gZnVuY3Rpb24gZGJscChrKSB7XG4gIHZhciByID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrOyBpKyspXG4gICAgciA9IHIuZGJsKCk7XG4gIHJldHVybiByO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xuXG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBTaG9ydEN1cnZlKGNvbmYpIHtcbiAgQmFzZS5jYWxsKHRoaXMsICdzaG9ydCcsIGNvbmYpO1xuXG4gIHRoaXMuYSA9IG5ldyBCTihjb25mLmEsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYiA9IG5ldyBCTihjb25mLmIsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMudGludiA9IHRoaXMudHdvLnJlZEludm0oKTtcblxuICB0aGlzLnplcm9BID0gdGhpcy5hLmZyb21SZWQoKS5jbXBuKDApID09PSAwO1xuICB0aGlzLnRocmVlQSA9IHRoaXMuYS5mcm9tUmVkKCkuc3ViKHRoaXMucCkuY21wbigtMykgPT09IDA7XG5cbiAgLy8gSWYgdGhlIGN1cnZlIGlzIGVuZG9tb3JwaGljLCBwcmVjYWxjdWxhdGUgYmV0YSBhbmQgbGFtYmRhXG4gIHRoaXMuZW5kbyA9IHRoaXMuX2dldEVuZG9tb3JwaGlzbShjb25mKTtcbiAgdGhpcy5fZW5kb1duYWZUMSA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fZW5kb1duYWZUMiA9IG5ldyBBcnJheSg0KTtcbn1cbmluaGVyaXRzKFNob3J0Q3VydmUsIEJhc2UpO1xubW9kdWxlLmV4cG9ydHMgPSBTaG9ydEN1cnZlO1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZ2V0RW5kb21vcnBoaXNtID0gZnVuY3Rpb24gX2dldEVuZG9tb3JwaGlzbShjb25mKSB7XG4gIC8vIE5vIGVmZmljaWVudCBlbmRvbW9ycGhpc21cbiAgaWYgKCF0aGlzLnplcm9BIHx8ICF0aGlzLmcgfHwgIXRoaXMubiB8fCB0aGlzLnAubW9kbigzKSAhPT0gMSlcbiAgICByZXR1cm47XG5cbiAgLy8gQ29tcHV0ZSBiZXRhIGFuZCBsYW1iZGEsIHRoYXQgbGFtYmRhICogUCA9IChiZXRhICogUHg7IFB5KVxuICB2YXIgYmV0YTtcbiAgdmFyIGxhbWJkYTtcbiAgaWYgKGNvbmYuYmV0YSkge1xuICAgIGJldGEgPSBuZXcgQk4oY29uZi5iZXRhLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB9IGVsc2Uge1xuICAgIHZhciBiZXRhcyA9IHRoaXMuX2dldEVuZG9Sb290cyh0aGlzLnApO1xuICAgIC8vIENob29zZSB0aGUgc21hbGxlc3QgYmV0YVxuICAgIGJldGEgPSBiZXRhc1swXS5jbXAoYmV0YXNbMV0pIDwgMCA/IGJldGFzWzBdIDogYmV0YXNbMV07XG4gICAgYmV0YSA9IGJldGEudG9SZWQodGhpcy5yZWQpO1xuICB9XG4gIGlmIChjb25mLmxhbWJkYSkge1xuICAgIGxhbWJkYSA9IG5ldyBCTihjb25mLmxhbWJkYSwgMTYpO1xuICB9IGVsc2Uge1xuICAgIC8vIENob29zZSB0aGUgbGFtYmRhIHRoYXQgaXMgbWF0Y2hpbmcgc2VsZWN0ZWQgYmV0YVxuICAgIHZhciBsYW1iZGFzID0gdGhpcy5fZ2V0RW5kb1Jvb3RzKHRoaXMubik7XG4gICAgaWYgKHRoaXMuZy5tdWwobGFtYmRhc1swXSkueC5jbXAodGhpcy5nLngucmVkTXVsKGJldGEpKSA9PT0gMCkge1xuICAgICAgbGFtYmRhID0gbGFtYmRhc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFtYmRhID0gbGFtYmRhc1sxXTtcbiAgICAgIGFzc2VydCh0aGlzLmcubXVsKGxhbWJkYSkueC5jbXAodGhpcy5nLngucmVkTXVsKGJldGEpKSA9PT0gMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gR2V0IGJhc2lzIHZlY3RvcnMsIHVzZWQgZm9yIGJhbGFuY2VkIGxlbmd0aC10d28gcmVwcmVzZW50YXRpb25cbiAgdmFyIGJhc2lzO1xuICBpZiAoY29uZi5iYXNpcykge1xuICAgIGJhc2lzID0gY29uZi5iYXNpcy5tYXAoZnVuY3Rpb24odmVjKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhOiBuZXcgQk4odmVjLmEsIDE2KSxcbiAgICAgICAgYjogbmV3IEJOKHZlYy5iLCAxNiksXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGJhc2lzID0gdGhpcy5fZ2V0RW5kb0Jhc2lzKGxhbWJkYSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJldGE6IGJldGEsXG4gICAgbGFtYmRhOiBsYW1iZGEsXG4gICAgYmFzaXM6IGJhc2lzLFxuICB9O1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2dldEVuZG9Sb290cyA9IGZ1bmN0aW9uIF9nZXRFbmRvUm9vdHMobnVtKSB7XG4gIC8vIEZpbmQgcm9vdHMgb2YgZm9yIHheMiArIHggKyAxIGluIEZcbiAgLy8gUm9vdCA9ICgtMSArLSBTcXJ0KC0zKSkgLyAyXG4gIC8vXG4gIHZhciByZWQgPSBudW0gPT09IHRoaXMucCA/IHRoaXMucmVkIDogQk4ubW9udChudW0pO1xuICB2YXIgdGludiA9IG5ldyBCTigyKS50b1JlZChyZWQpLnJlZEludm0oKTtcbiAgdmFyIG50aW52ID0gdGludi5yZWROZWcoKTtcblxuICB2YXIgcyA9IG5ldyBCTigzKS50b1JlZChyZWQpLnJlZE5lZygpLnJlZFNxcnQoKS5yZWRNdWwodGludik7XG5cbiAgdmFyIGwxID0gbnRpbnYucmVkQWRkKHMpLmZyb21SZWQoKTtcbiAgdmFyIGwyID0gbnRpbnYucmVkU3ViKHMpLmZyb21SZWQoKTtcbiAgcmV0dXJuIFsgbDEsIGwyIF07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZ2V0RW5kb0Jhc2lzID0gZnVuY3Rpb24gX2dldEVuZG9CYXNpcyhsYW1iZGEpIHtcbiAgLy8gYXByeFNxcnQgPj0gc3FydCh0aGlzLm4pXG4gIHZhciBhcHJ4U3FydCA9IHRoaXMubi51c2hybihNYXRoLmZsb29yKHRoaXMubi5iaXRMZW5ndGgoKSAvIDIpKTtcblxuICAvLyAzLjc0XG4gIC8vIFJ1biBFR0NELCB1bnRpbCByKEwgKyAxKSA8IGFwcnhTcXJ0XG4gIHZhciB1ID0gbGFtYmRhO1xuICB2YXIgdiA9IHRoaXMubi5jbG9uZSgpO1xuICB2YXIgeDEgPSBuZXcgQk4oMSk7XG4gIHZhciB5MSA9IG5ldyBCTigwKTtcbiAgdmFyIHgyID0gbmV3IEJOKDApO1xuICB2YXIgeTIgPSBuZXcgQk4oMSk7XG5cbiAgLy8gTk9URTogYWxsIHZlY3RvcnMgYXJlIHJvb3RzIG9mOiBhICsgYiAqIGxhbWJkYSA9IDAgKG1vZCBuKVxuICB2YXIgYTA7XG4gIHZhciBiMDtcbiAgLy8gRmlyc3QgdmVjdG9yXG4gIHZhciBhMTtcbiAgdmFyIGIxO1xuICAvLyBTZWNvbmQgdmVjdG9yXG4gIHZhciBhMjtcbiAgdmFyIGIyO1xuXG4gIHZhciBwcmV2UjtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcjtcbiAgdmFyIHg7XG4gIHdoaWxlICh1LmNtcG4oMCkgIT09IDApIHtcbiAgICB2YXIgcSA9IHYuZGl2KHUpO1xuICAgIHIgPSB2LnN1YihxLm11bCh1KSk7XG4gICAgeCA9IHgyLnN1YihxLm11bCh4MSkpO1xuICAgIHZhciB5ID0geTIuc3ViKHEubXVsKHkxKSk7XG5cbiAgICBpZiAoIWExICYmIHIuY21wKGFwcnhTcXJ0KSA8IDApIHtcbiAgICAgIGEwID0gcHJldlIubmVnKCk7XG4gICAgICBiMCA9IHgxO1xuICAgICAgYTEgPSByLm5lZygpO1xuICAgICAgYjEgPSB4O1xuICAgIH0gZWxzZSBpZiAoYTEgJiYgKytpID09PSAyKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcHJldlIgPSByO1xuXG4gICAgdiA9IHU7XG4gICAgdSA9IHI7XG4gICAgeDIgPSB4MTtcbiAgICB4MSA9IHg7XG4gICAgeTIgPSB5MTtcbiAgICB5MSA9IHk7XG4gIH1cbiAgYTIgPSByLm5lZygpO1xuICBiMiA9IHg7XG5cbiAgdmFyIGxlbjEgPSBhMS5zcXIoKS5hZGQoYjEuc3FyKCkpO1xuICB2YXIgbGVuMiA9IGEyLnNxcigpLmFkZChiMi5zcXIoKSk7XG4gIGlmIChsZW4yLmNtcChsZW4xKSA+PSAwKSB7XG4gICAgYTIgPSBhMDtcbiAgICBiMiA9IGIwO1xuICB9XG5cbiAgLy8gTm9ybWFsaXplIHNpZ25zXG4gIGlmIChhMS5uZWdhdGl2ZSkge1xuICAgIGExID0gYTEubmVnKCk7XG4gICAgYjEgPSBiMS5uZWcoKTtcbiAgfVxuICBpZiAoYTIubmVnYXRpdmUpIHtcbiAgICBhMiA9IGEyLm5lZygpO1xuICAgIGIyID0gYjIubmVnKCk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIHsgYTogYTEsIGI6IGIxIH0sXG4gICAgeyBhOiBhMiwgYjogYjIgfSxcbiAgXTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9lbmRvU3BsaXQgPSBmdW5jdGlvbiBfZW5kb1NwbGl0KGspIHtcbiAgdmFyIGJhc2lzID0gdGhpcy5lbmRvLmJhc2lzO1xuICB2YXIgdjEgPSBiYXNpc1swXTtcbiAgdmFyIHYyID0gYmFzaXNbMV07XG5cbiAgdmFyIGMxID0gdjIuYi5tdWwoaykuZGl2Um91bmQodGhpcy5uKTtcbiAgdmFyIGMyID0gdjEuYi5uZWcoKS5tdWwoaykuZGl2Um91bmQodGhpcy5uKTtcblxuICB2YXIgcDEgPSBjMS5tdWwodjEuYSk7XG4gIHZhciBwMiA9IGMyLm11bCh2Mi5hKTtcbiAgdmFyIHExID0gYzEubXVsKHYxLmIpO1xuICB2YXIgcTIgPSBjMi5tdWwodjIuYik7XG5cbiAgLy8gQ2FsY3VsYXRlIGFuc3dlclxuICB2YXIgazEgPSBrLnN1YihwMSkuc3ViKHAyKTtcbiAgdmFyIGsyID0gcTEuYWRkKHEyKS5uZWcoKTtcbiAgcmV0dXJuIHsgazE6IGsxLCBrMjogazIgfTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnBvaW50RnJvbVggPSBmdW5jdGlvbiBwb2ludEZyb21YKHgsIG9kZCkge1xuICB4ID0gbmV3IEJOKHgsIDE2KTtcbiAgaWYgKCF4LnJlZClcbiAgICB4ID0geC50b1JlZCh0aGlzLnJlZCk7XG5cbiAgdmFyIHkyID0geC5yZWRTcXIoKS5yZWRNdWwoeCkucmVkSUFkZCh4LnJlZE11bCh0aGlzLmEpKS5yZWRJQWRkKHRoaXMuYik7XG4gIHZhciB5ID0geTIucmVkU3FydCgpO1xuICBpZiAoeS5yZWRTcXIoKS5yZWRTdWIoeTIpLmNtcCh0aGlzLnplcm8pICE9PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuXG4gIC8vIFhYWCBJcyB0aGVyZSBhbnkgd2F5IHRvIHRlbGwgaWYgdGhlIG51bWJlciBpcyBvZGQgd2l0aG91dCBjb252ZXJ0aW5nIGl0XG4gIC8vIHRvIG5vbi1yZWQgZm9ybT9cbiAgdmFyIGlzT2RkID0geS5mcm9tUmVkKCkuaXNPZGQoKTtcbiAgaWYgKG9kZCAmJiAhaXNPZGQgfHwgIW9kZCAmJiBpc09kZClcbiAgICB5ID0geS5yZWROZWcoKTtcblxuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5KTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpIHtcbiAgaWYgKHBvaW50LmluZilcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB2YXIgeCA9IHBvaW50Lng7XG4gIHZhciB5ID0gcG9pbnQueTtcblxuICB2YXIgYXggPSB0aGlzLmEucmVkTXVsKHgpO1xuICB2YXIgcmhzID0geC5yZWRTcXIoKS5yZWRNdWwoeCkucmVkSUFkZChheCkucmVkSUFkZCh0aGlzLmIpO1xuICByZXR1cm4geS5yZWRTcXIoKS5yZWRJU3ViKHJocykuY21wbigwKSA9PT0gMDtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9lbmRvV25hZk11bEFkZCA9XG4gICAgZnVuY3Rpb24gX2VuZG9XbmFmTXVsQWRkKHBvaW50cywgY29lZmZzLCBqYWNvYmlhblJlc3VsdCkge1xuICAgICAgdmFyIG5wb2ludHMgPSB0aGlzLl9lbmRvV25hZlQxO1xuICAgICAgdmFyIG5jb2VmZnMgPSB0aGlzLl9lbmRvV25hZlQyO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNwbGl0ID0gdGhpcy5fZW5kb1NwbGl0KGNvZWZmc1tpXSk7XG4gICAgICAgIHZhciBwID0gcG9pbnRzW2ldO1xuICAgICAgICB2YXIgYmV0YSA9IHAuX2dldEJldGEoKTtcblxuICAgICAgICBpZiAoc3BsaXQuazEubmVnYXRpdmUpIHtcbiAgICAgICAgICBzcGxpdC5rMS5pbmVnKCk7XG4gICAgICAgICAgcCA9IHAubmVnKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGxpdC5rMi5uZWdhdGl2ZSkge1xuICAgICAgICAgIHNwbGl0LmsyLmluZWcoKTtcbiAgICAgICAgICBiZXRhID0gYmV0YS5uZWcodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBucG9pbnRzW2kgKiAyXSA9IHA7XG4gICAgICAgIG5wb2ludHNbaSAqIDIgKyAxXSA9IGJldGE7XG4gICAgICAgIG5jb2VmZnNbaSAqIDJdID0gc3BsaXQuazE7XG4gICAgICAgIG5jb2VmZnNbaSAqIDIgKyAxXSA9IHNwbGl0LmsyO1xuICAgICAgfVxuICAgICAgdmFyIHJlcyA9IHRoaXMuX3duYWZNdWxBZGQoMSwgbnBvaW50cywgbmNvZWZmcywgaSAqIDIsIGphY29iaWFuUmVzdWx0KTtcblxuICAgICAgLy8gQ2xlYW4tdXAgcmVmZXJlbmNlcyB0byBwb2ludHMgYW5kIGNvZWZmaWNpZW50c1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpICogMjsgaisrKSB7XG4gICAgICAgIG5wb2ludHNbal0gPSBudWxsO1xuICAgICAgICBuY29lZmZzW2pdID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcblxuZnVuY3Rpb24gUG9pbnQoY3VydmUsIHgsIHksIGlzUmVkKSB7XG4gIEJhc2UuQmFzZVBvaW50LmNhbGwodGhpcywgY3VydmUsICdhZmZpbmUnKTtcbiAgaWYgKHggPT09IG51bGwgJiYgeSA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IG51bGw7XG4gICAgdGhpcy55ID0gbnVsbDtcbiAgICB0aGlzLmluZiA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0gbmV3IEJOKHgsIDE2KTtcbiAgICB0aGlzLnkgPSBuZXcgQk4oeSwgMTYpO1xuICAgIC8vIEZvcmNlIHJlZGdvbWVyeSByZXByZXNlbnRhdGlvbiB3aGVuIGxvYWRpbmcgZnJvbSBKU09OXG4gICAgaWYgKGlzUmVkKSB7XG4gICAgICB0aGlzLnguZm9yY2VSZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgICAgdGhpcy55LmZvcmNlUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLngucmVkKVxuICAgICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMueS5yZWQpXG4gICAgICB0aGlzLnkgPSB0aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIHRoaXMuaW5mID0gZmFsc2U7XG4gIH1cbn1cbmluaGVyaXRzKFBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24gcG9pbnQoeCwgeSwgaXNSZWQpIHtcbiAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLCB4LCB5LCBpc1JlZCk7XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5wb2ludEZyb21KU09OID0gZnVuY3Rpb24gcG9pbnRGcm9tSlNPTihvYmosIHJlZCkge1xuICByZXR1cm4gUG9pbnQuZnJvbUpTT04odGhpcywgb2JqLCByZWQpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9nZXRCZXRhID0gZnVuY3Rpb24gX2dldEJldGEoKSB7XG4gIGlmICghdGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybjtcblxuICB2YXIgcHJlID0gdGhpcy5wcmVjb21wdXRlZDtcbiAgaWYgKHByZSAmJiBwcmUuYmV0YSlcbiAgICByZXR1cm4gcHJlLmJldGE7XG5cbiAgdmFyIGJldGEgPSB0aGlzLmN1cnZlLnBvaW50KHRoaXMueC5yZWRNdWwodGhpcy5jdXJ2ZS5lbmRvLmJldGEpLCB0aGlzLnkpO1xuICBpZiAocHJlKSB7XG4gICAgdmFyIGN1cnZlID0gdGhpcy5jdXJ2ZTtcbiAgICB2YXIgZW5kb011bCA9IGZ1bmN0aW9uKHApIHtcbiAgICAgIHJldHVybiBjdXJ2ZS5wb2ludChwLngucmVkTXVsKGN1cnZlLmVuZG8uYmV0YSksIHAueSk7XG4gICAgfTtcbiAgICBwcmUuYmV0YSA9IGJldGE7XG4gICAgYmV0YS5wcmVjb21wdXRlZCA9IHtcbiAgICAgIGJldGE6IG51bGwsXG4gICAgICBuYWY6IHByZS5uYWYgJiYge1xuICAgICAgICB3bmQ6IHByZS5uYWYud25kLFxuICAgICAgICBwb2ludHM6IHByZS5uYWYucG9pbnRzLm1hcChlbmRvTXVsKSxcbiAgICAgIH0sXG4gICAgICBkb3VibGVzOiBwcmUuZG91YmxlcyAmJiB7XG4gICAgICAgIHN0ZXA6IHByZS5kb3VibGVzLnN0ZXAsXG4gICAgICAgIHBvaW50czogcHJlLmRvdWJsZXMucG9pbnRzLm1hcChlbmRvTXVsKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4gYmV0YTtcbn07XG5cblBvaW50LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7XG4gIGlmICghdGhpcy5wcmVjb21wdXRlZClcbiAgICByZXR1cm4gWyB0aGlzLngsIHRoaXMueSBdO1xuXG4gIHJldHVybiBbIHRoaXMueCwgdGhpcy55LCB0aGlzLnByZWNvbXB1dGVkICYmIHtcbiAgICBkb3VibGVzOiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMgJiYge1xuICAgICAgc3RlcDogdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzLnN0ZXAsXG4gICAgICBwb2ludHM6IHRoaXMucHJlY29tcHV0ZWQuZG91Ymxlcy5wb2ludHMuc2xpY2UoMSksXG4gICAgfSxcbiAgICBuYWY6IHRoaXMucHJlY29tcHV0ZWQubmFmICYmIHtcbiAgICAgIHduZDogdGhpcy5wcmVjb21wdXRlZC5uYWYud25kLFxuICAgICAgcG9pbnRzOiB0aGlzLnByZWNvbXB1dGVkLm5hZi5wb2ludHMuc2xpY2UoMSksXG4gICAgfSxcbiAgfSBdO1xufTtcblxuUG9pbnQuZnJvbUpTT04gPSBmdW5jdGlvbiBmcm9tSlNPTihjdXJ2ZSwgb2JqLCByZWQpIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKVxuICAgIG9iaiA9IEpTT04ucGFyc2Uob2JqKTtcbiAgdmFyIHJlcyA9IGN1cnZlLnBvaW50KG9ialswXSwgb2JqWzFdLCByZWQpO1xuICBpZiAoIW9ialsyXSlcbiAgICByZXR1cm4gcmVzO1xuXG4gIGZ1bmN0aW9uIG9iajJwb2ludChvYmopIHtcbiAgICByZXR1cm4gY3VydmUucG9pbnQob2JqWzBdLCBvYmpbMV0sIHJlZCk7XG4gIH1cblxuICB2YXIgcHJlID0gb2JqWzJdO1xuICByZXMucHJlY29tcHV0ZWQgPSB7XG4gICAgYmV0YTogbnVsbCxcbiAgICBkb3VibGVzOiBwcmUuZG91YmxlcyAmJiB7XG4gICAgICBzdGVwOiBwcmUuZG91Ymxlcy5zdGVwLFxuICAgICAgcG9pbnRzOiBbIHJlcyBdLmNvbmNhdChwcmUuZG91Ymxlcy5wb2ludHMubWFwKG9iajJwb2ludCkpLFxuICAgIH0sXG4gICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgIHduZDogcHJlLm5hZi53bmQsXG4gICAgICBwb2ludHM6IFsgcmVzIF0uY29uY2F0KHByZS5uYWYucG9pbnRzLm1hcChvYmoycG9pbnQpKSxcbiAgICB9LFxuICB9O1xuICByZXR1cm4gcmVzO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgUG9pbnQgSW5maW5pdHk+JztcbiAgcmV0dXJuICc8RUMgUG9pbnQgeDogJyArIHRoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgeTogJyArIHRoaXMueS5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICByZXR1cm4gdGhpcy5pbmY7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKHApIHtcbiAgLy8gTyArIFAgPSBQXG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gcDtcblxuICAvLyBQICsgTyA9IFBcbiAgaWYgKHAuaW5mKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIFAgKyBQID0gMlBcbiAgaWYgKHRoaXMuZXEocCkpXG4gICAgcmV0dXJuIHRoaXMuZGJsKCk7XG5cbiAgLy8gUCArICgtUCkgPSBPXG4gIGlmICh0aGlzLm5lZygpLmVxKHApKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIC8vIFAgKyBRID0gT1xuICBpZiAodGhpcy54LmNtcChwLngpID09PSAwKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIHZhciBjID0gdGhpcy55LnJlZFN1YihwLnkpO1xuICBpZiAoYy5jbXBuKDApICE9PSAwKVxuICAgIGMgPSBjLnJlZE11bCh0aGlzLngucmVkU3ViKHAueCkucmVkSW52bSgpKTtcbiAgdmFyIG54ID0gYy5yZWRTcXIoKS5yZWRJU3ViKHRoaXMueCkucmVkSVN1YihwLngpO1xuICB2YXIgbnkgPSBjLnJlZE11bCh0aGlzLngucmVkU3ViKG54KSkucmVkSVN1Yih0aGlzLnkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgaWYgKHRoaXMuaW5mKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIDJQID0gT1xuICB2YXIgeXMxID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICBpZiAoeXMxLmNtcG4oMCkgPT09IDApXG4gICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7XG5cbiAgdmFyIGEgPSB0aGlzLmN1cnZlLmE7XG5cbiAgdmFyIHgyID0gdGhpcy54LnJlZFNxcigpO1xuICB2YXIgZHlpbnYgPSB5czEucmVkSW52bSgpO1xuICB2YXIgYyA9IHgyLnJlZEFkZCh4MikucmVkSUFkZCh4MikucmVkSUFkZChhKS5yZWRNdWwoZHlpbnYpO1xuXG4gIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0aGlzLngucmVkQWRkKHRoaXMueCkpO1xuICB2YXIgbnkgPSBjLnJlZE11bCh0aGlzLngucmVkU3ViKG54KSkucmVkSVN1Yih0aGlzLnkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbiBnZXRYKCkge1xuICByZXR1cm4gdGhpcy54LmZyb21SZWQoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRZID0gZnVuY3Rpb24gZ2V0WSgpIHtcbiAgcmV0dXJuIHRoaXMueS5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsKGspIHtcbiAgayA9IG5ldyBCTihrLCAxNik7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcbiAgZWxzZSBpZiAodGhpcy5faGFzRG91YmxlcyhrKSlcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZml4ZWROYWZNdWwodGhpcywgayk7XG4gIGVsc2UgaWYgKHRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQoWyB0aGlzIF0sIFsgayBdKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uIG11bEFkZChrMSwgcDIsIGsyKSB7XG4gIHZhciBwb2ludHMgPSBbIHRoaXMsIHAyIF07XG4gIHZhciBjb2VmZnMgPSBbIGsxLCBrMiBdO1xuICBpZiAodGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChwb2ludHMsIGNvZWZmcyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLCBwb2ludHMsIGNvZWZmcywgMik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuam11bEFkZCA9IGZ1bmN0aW9uIGptdWxBZGQoazEsIHAyLCBrMikge1xuICB2YXIgcG9pbnRzID0gWyB0aGlzLCBwMiBdO1xuICB2YXIgY29lZmZzID0gWyBrMSwgazIgXTtcbiAgaWYgKHRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQocG9pbnRzLCBjb2VmZnMsIHRydWUpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgcG9pbnRzLCBjb2VmZnMsIDIsIHRydWUpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEocCkge1xuICByZXR1cm4gdGhpcyA9PT0gcCB8fFxuICAgICAgICAgdGhpcy5pbmYgPT09IHAuaW5mICYmXG4gICAgICAgICAgICAgKHRoaXMuaW5mIHx8IHRoaXMueC5jbXAocC54KSA9PT0gMCAmJiB0aGlzLnkuY21wKHAueSkgPT09IDApO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZyhfcHJlY29tcHV0ZSkge1xuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgdmFyIHJlcyA9IHRoaXMuY3VydmUucG9pbnQodGhpcy54LCB0aGlzLnkucmVkTmVnKCkpO1xuICBpZiAoX3ByZWNvbXB1dGUgJiYgdGhpcy5wcmVjb21wdXRlZCkge1xuICAgIHZhciBwcmUgPSB0aGlzLnByZWNvbXB1dGVkO1xuICAgIHZhciBuZWdhdGUgPSBmdW5jdGlvbihwKSB7XG4gICAgICByZXR1cm4gcC5uZWcoKTtcbiAgICB9O1xuICAgIHJlcy5wcmVjb21wdXRlZCA9IHtcbiAgICAgIG5hZjogcHJlLm5hZiAmJiB7XG4gICAgICAgIHduZDogcHJlLm5hZi53bmQsXG4gICAgICAgIHBvaW50czogcHJlLm5hZi5wb2ludHMubWFwKG5lZ2F0ZSksXG4gICAgICB9LFxuICAgICAgZG91YmxlczogcHJlLmRvdWJsZXMgJiYge1xuICAgICAgICBzdGVwOiBwcmUuZG91Ymxlcy5zdGVwLFxuICAgICAgICBwb2ludHM6IHByZS5kb3VibGVzLnBvaW50cy5tYXAobmVnYXRlKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnRvSiA9IGZ1bmN0aW9uIHRvSigpIHtcbiAgaWYgKHRoaXMuaW5mKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcblxuICB2YXIgcmVzID0gdGhpcy5jdXJ2ZS5qcG9pbnQodGhpcy54LCB0aGlzLnksIHRoaXMuY3VydmUub25lKTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIEpQb2ludChjdXJ2ZSwgeCwgeSwgeikge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAnamFjb2JpYW4nKTtcbiAgaWYgKHggPT09IG51bGwgJiYgeSA9PT0gbnVsbCAmJiB6ID09PSBudWxsKSB7XG4gICAgdGhpcy54ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy55ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy56ID0gbmV3IEJOKDApO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IG5ldyBCTih4LCAxNik7XG4gICAgdGhpcy55ID0gbmV3IEJOKHksIDE2KTtcbiAgICB0aGlzLnogPSBuZXcgQk4oeiwgMTYpO1xuICB9XG4gIGlmICghdGhpcy54LnJlZClcbiAgICB0aGlzLnggPSB0aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICBpZiAoIXRoaXMueS5yZWQpXG4gICAgdGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgaWYgKCF0aGlzLnoucmVkKVxuICAgIHRoaXMueiA9IHRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG5cbiAgdGhpcy56T25lID0gdGhpcy56ID09PSB0aGlzLmN1cnZlLm9uZTtcbn1cbmluaGVyaXRzKEpQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5qcG9pbnQgPSBmdW5jdGlvbiBqcG9pbnQoeCwgeSwgeikge1xuICByZXR1cm4gbmV3IEpQb2ludCh0aGlzLCB4LCB5LCB6KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUudG9QID0gZnVuY3Rpb24gdG9QKCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7XG5cbiAgdmFyIHppbnYgPSB0aGlzLnoucmVkSW52bSgpO1xuICB2YXIgemludjIgPSB6aW52LnJlZFNxcigpO1xuICB2YXIgYXggPSB0aGlzLngucmVkTXVsKHppbnYyKTtcbiAgdmFyIGF5ID0gdGhpcy55LnJlZE11bCh6aW52MikucmVkTXVsKHppbnYpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KGF4LCBheSk7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZygpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KHRoaXMueCwgdGhpcy55LnJlZE5lZygpLCB0aGlzLnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQocCkge1xuICAvLyBPICsgUCA9IFBcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBwO1xuXG4gIC8vIFAgKyBPID0gUFxuICBpZiAocC5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gMTJNICsgNFMgKyA3QVxuICB2YXIgcHoyID0gcC56LnJlZFNxcigpO1xuICB2YXIgejIgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciB1MSA9IHRoaXMueC5yZWRNdWwocHoyKTtcbiAgdmFyIHUyID0gcC54LnJlZE11bCh6Mik7XG4gIHZhciBzMSA9IHRoaXMueS5yZWRNdWwocHoyLnJlZE11bChwLnopKTtcbiAgdmFyIHMyID0gcC55LnJlZE11bCh6Mi5yZWRNdWwodGhpcy56KSk7XG5cbiAgdmFyIGggPSB1MS5yZWRTdWIodTIpO1xuICB2YXIgciA9IHMxLnJlZFN1YihzMik7XG4gIGlmIChoLmNtcG4oMCkgPT09IDApIHtcbiAgICBpZiAoci5jbXBuKDApICE9PSAwKVxuICAgICAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiB0aGlzLmRibCgpO1xuICB9XG5cbiAgdmFyIGgyID0gaC5yZWRTcXIoKTtcbiAgdmFyIGgzID0gaDIucmVkTXVsKGgpO1xuICB2YXIgdiA9IHUxLnJlZE11bChoMik7XG5cbiAgdmFyIG54ID0gci5yZWRTcXIoKS5yZWRJQWRkKGgzKS5yZWRJU3ViKHYpLnJlZElTdWIodik7XG4gIHZhciBueSA9IHIucmVkTXVsKHYucmVkSVN1YihueCkpLnJlZElTdWIoczEucmVkTXVsKGgzKSk7XG4gIHZhciBueiA9IHRoaXMuei5yZWRNdWwocC56KS5yZWRNdWwoaCk7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5taXhlZEFkZCA9IGZ1bmN0aW9uIG1peGVkQWRkKHApIHtcbiAgLy8gTyArIFAgPSBQXG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gcC50b0ooKTtcblxuICAvLyBQICsgTyA9IFBcbiAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIDhNICsgM1MgKyA3QVxuICB2YXIgejIgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciB1MSA9IHRoaXMueDtcbiAgdmFyIHUyID0gcC54LnJlZE11bCh6Mik7XG4gIHZhciBzMSA9IHRoaXMueTtcbiAgdmFyIHMyID0gcC55LnJlZE11bCh6MikucmVkTXVsKHRoaXMueik7XG5cbiAgdmFyIGggPSB1MS5yZWRTdWIodTIpO1xuICB2YXIgciA9IHMxLnJlZFN1YihzMik7XG4gIGlmIChoLmNtcG4oMCkgPT09IDApIHtcbiAgICBpZiAoci5jbXBuKDApICE9PSAwKVxuICAgICAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiB0aGlzLmRibCgpO1xuICB9XG5cbiAgdmFyIGgyID0gaC5yZWRTcXIoKTtcbiAgdmFyIGgzID0gaDIucmVkTXVsKGgpO1xuICB2YXIgdiA9IHUxLnJlZE11bChoMik7XG5cbiAgdmFyIG54ID0gci5yZWRTcXIoKS5yZWRJQWRkKGgzKS5yZWRJU3ViKHYpLnJlZElTdWIodik7XG4gIHZhciBueSA9IHIucmVkTXVsKHYucmVkSVN1YihueCkpLnJlZElTdWIoczEucmVkTXVsKGgzKSk7XG4gIHZhciBueiA9IHRoaXMuei5yZWRNdWwoaCk7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5kYmxwID0gZnVuY3Rpb24gZGJscChwb3cpIHtcbiAgaWYgKHBvdyA9PT0gMClcbiAgICByZXR1cm4gdGhpcztcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuICBpZiAoIXBvdylcbiAgICByZXR1cm4gdGhpcy5kYmwoKTtcblxuICB2YXIgaTtcbiAgaWYgKHRoaXMuY3VydmUuemVyb0EgfHwgdGhpcy5jdXJ2ZS50aHJlZUEpIHtcbiAgICB2YXIgciA9IHRoaXM7XG4gICAgZm9yIChpID0gMDsgaSA8IHBvdzsgaSsrKVxuICAgICAgciA9IHIuZGJsKCk7XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvLyAxTSArIDJTICsgMUEgKyBOICogKDRTICsgNU0gKyA4QSlcbiAgLy8gTiA9IDEgPT4gNk0gKyA2UyArIDlBXG4gIHZhciBhID0gdGhpcy5jdXJ2ZS5hO1xuICB2YXIgdGludiA9IHRoaXMuY3VydmUudGludjtcblxuICB2YXIganggPSB0aGlzLng7XG4gIHZhciBqeSA9IHRoaXMueTtcbiAgdmFyIGp6ID0gdGhpcy56O1xuICB2YXIgano0ID0ganoucmVkU3FyKCkucmVkU3FyKCk7XG5cbiAgLy8gUmV1c2UgcmVzdWx0c1xuICB2YXIganlkID0gankucmVkQWRkKGp5KTtcbiAgZm9yIChpID0gMDsgaSA8IHBvdzsgaSsrKSB7XG4gICAgdmFyIGp4MiA9IGp4LnJlZFNxcigpO1xuICAgIHZhciBqeWQyID0ganlkLnJlZFNxcigpO1xuICAgIHZhciBqeWQ0ID0ganlkMi5yZWRTcXIoKTtcbiAgICB2YXIgYyA9IGp4Mi5yZWRBZGQoangyKS5yZWRJQWRkKGp4MikucmVkSUFkZChhLnJlZE11bChqejQpKTtcblxuICAgIHZhciB0MSA9IGp4LnJlZE11bChqeWQyKTtcbiAgICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodDEucmVkQWRkKHQxKSk7XG4gICAgdmFyIHQyID0gdDEucmVkSVN1YihueCk7XG4gICAgdmFyIGRueSA9IGMucmVkTXVsKHQyKTtcbiAgICBkbnkgPSBkbnkucmVkSUFkZChkbnkpLnJlZElTdWIoanlkNCk7XG4gICAgdmFyIG56ID0ganlkLnJlZE11bChqeik7XG4gICAgaWYgKGkgKyAxIDwgcG93KVxuICAgICAgano0ID0gano0LnJlZE11bChqeWQ0KTtcblxuICAgIGp4ID0gbng7XG4gICAganogPSBuejtcbiAgICBqeWQgPSBkbnk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQoangsIGp5ZC5yZWRNdWwodGludiksIGp6KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24gZGJsKCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgaWYgKHRoaXMuY3VydmUuemVyb0EpXG4gICAgcmV0dXJuIHRoaXMuX3plcm9EYmwoKTtcbiAgZWxzZSBpZiAodGhpcy5jdXJ2ZS50aHJlZUEpXG4gICAgcmV0dXJuIHRoaXMuX3RocmVlRGJsKCk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5fZGJsKCk7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl96ZXJvRGJsID0gZnVuY3Rpb24gX3plcm9EYmwoKSB7XG4gIHZhciBueDtcbiAgdmFyIG55O1xuICB2YXIgbno7XG4gIC8vIFogPSAxXG4gIGlmICh0aGlzLnpPbmUpIHtcbiAgICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbFxuICAgIC8vICAgICAjZG91YmxpbmctbWRibC0yMDA3LWJsXG4gICAgLy8gMU0gKyA1UyArIDE0QVxuXG4gICAgLy8gWFggPSBYMV4yXG4gICAgdmFyIHh4ID0gdGhpcy54LnJlZFNxcigpO1xuICAgIC8vIFlZID0gWTFeMlxuICAgIHZhciB5eSA9IHRoaXMueS5yZWRTcXIoKTtcbiAgICAvLyBZWVlZID0gWVleMlxuICAgIHZhciB5eXl5ID0geXkucmVkU3FyKCk7XG4gICAgLy8gUyA9IDIgKiAoKFgxICsgWVkpXjIgLSBYWCAtIFlZWVkpXG4gICAgdmFyIHMgPSB0aGlzLngucmVkQWRkKHl5KS5yZWRTcXIoKS5yZWRJU3ViKHh4KS5yZWRJU3ViKHl5eXkpO1xuICAgIHMgPSBzLnJlZElBZGQocyk7XG4gICAgLy8gTSA9IDMgKiBYWCArIGE7IGEgPSAwXG4gICAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpO1xuICAgIC8vIFQgPSBNIF4gMiAtIDIqU1xuICAgIHZhciB0ID0gbS5yZWRTcXIoKS5yZWRJU3ViKHMpLnJlZElTdWIocyk7XG5cbiAgICAvLyA4ICogWVlZWVxuICAgIHZhciB5eXl5OCA9IHl5eXkucmVkSUFkZCh5eXl5KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuICAgIHl5eXk4ID0geXl5eTgucmVkSUFkZCh5eXl5OCk7XG5cbiAgICAvLyBYMyA9IFRcbiAgICBueCA9IHQ7XG4gICAgLy8gWTMgPSBNICogKFMgLSBUKSAtIDggKiBZWVlZXG4gICAgbnkgPSBtLnJlZE11bChzLnJlZElTdWIodCkpLnJlZElTdWIoeXl5eTgpO1xuICAgIC8vIFozID0gMipZMVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICB9IGVsc2Uge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMC5odG1sXG4gICAgLy8gICAgICNkb3VibGluZy1kYmwtMjAwOS1sXG4gICAgLy8gMk0gKyA1UyArIDEzQVxuXG4gICAgLy8gQSA9IFgxXjJcbiAgICB2YXIgYSA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBCID0gWTFeMlxuICAgIHZhciBiID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIEMgPSBCXjJcbiAgICB2YXIgYyA9IGIucmVkU3FyKCk7XG4gICAgLy8gRCA9IDIgKiAoKFgxICsgQileMiAtIEEgLSBDKVxuICAgIHZhciBkID0gdGhpcy54LnJlZEFkZChiKS5yZWRTcXIoKS5yZWRJU3ViKGEpLnJlZElTdWIoYyk7XG4gICAgZCA9IGQucmVkSUFkZChkKTtcbiAgICAvLyBFID0gMyAqIEFcbiAgICB2YXIgZSA9IGEucmVkQWRkKGEpLnJlZElBZGQoYSk7XG4gICAgLy8gRiA9IEVeMlxuICAgIHZhciBmID0gZS5yZWRTcXIoKTtcblxuICAgIC8vIDggKiBDXG4gICAgdmFyIGM4ID0gYy5yZWRJQWRkKGMpO1xuICAgIGM4ID0gYzgucmVkSUFkZChjOCk7XG4gICAgYzggPSBjOC5yZWRJQWRkKGM4KTtcblxuICAgIC8vIFgzID0gRiAtIDIgKiBEXG4gICAgbnggPSBmLnJlZElTdWIoZCkucmVkSVN1YihkKTtcbiAgICAvLyBZMyA9IEUgKiAoRCAtIFgzKSAtIDggKiBDXG4gICAgbnkgPSBlLnJlZE11bChkLnJlZElTdWIobngpKS5yZWRJU3ViKGM4KTtcbiAgICAvLyBaMyA9IDIgKiBZMSAqIFoxXG4gICAgbnogPSB0aGlzLnkucmVkTXVsKHRoaXMueik7XG4gICAgbnogPSBuei5yZWRJQWRkKG56KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuX3RocmVlRGJsID0gZnVuY3Rpb24gX3RocmVlRGJsKCkge1xuICB2YXIgbng7XG4gIHZhciBueTtcbiAgdmFyIG56O1xuICAvLyBaID0gMVxuICBpZiAodGhpcy56T25lKSB7XG4gICAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0zLmh0bWxcbiAgICAvLyAgICAgI2RvdWJsaW5nLW1kYmwtMjAwNy1ibFxuICAgIC8vIDFNICsgNVMgKyAxNUFcblxuICAgIC8vIFhYID0gWDFeMlxuICAgIHZhciB4eCA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBZWSA9IFkxXjJcbiAgICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gICAgLy8gWVlZWSA9IFlZXjJcbiAgICB2YXIgeXl5eSA9IHl5LnJlZFNxcigpO1xuICAgIC8vIFMgPSAyICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKVxuICAgIHZhciBzID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgICBzID0gcy5yZWRJQWRkKHMpO1xuICAgIC8vIE0gPSAzICogWFggKyBhXG4gICAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpLnJlZElBZGQodGhpcy5jdXJ2ZS5hKTtcbiAgICAvLyBUID0gTV4yIC0gMiAqIFNcbiAgICB2YXIgdCA9IG0ucmVkU3FyKCkucmVkSVN1YihzKS5yZWRJU3ViKHMpO1xuICAgIC8vIFgzID0gVFxuICAgIG54ID0gdDtcbiAgICAvLyBZMyA9IE0gKiAoUyAtIFQpIC0gOCAqIFlZWVlcbiAgICB2YXIgeXl5eTggPSB5eXl5LnJlZElBZGQoeXl5eSk7XG4gICAgeXl5eTggPSB5eXl5OC5yZWRJQWRkKHl5eXk4KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuICAgIG55ID0gbS5yZWRNdWwocy5yZWRJU3ViKHQpKS5yZWRJU3ViKHl5eXk4KTtcbiAgICAvLyBaMyA9IDIgKiBZMVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICB9IGVsc2Uge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMy5odG1sI2RvdWJsaW5nLWRibC0yMDAxLWJcbiAgICAvLyAzTSArIDVTXG5cbiAgICAvLyBkZWx0YSA9IFoxXjJcbiAgICB2YXIgZGVsdGEgPSB0aGlzLnoucmVkU3FyKCk7XG4gICAgLy8gZ2FtbWEgPSBZMV4yXG4gICAgdmFyIGdhbW1hID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIGJldGEgPSBYMSAqIGdhbW1hXG4gICAgdmFyIGJldGEgPSB0aGlzLngucmVkTXVsKGdhbW1hKTtcbiAgICAvLyBhbHBoYSA9IDMgKiAoWDEgLSBkZWx0YSkgKiAoWDEgKyBkZWx0YSlcbiAgICB2YXIgYWxwaGEgPSB0aGlzLngucmVkU3ViKGRlbHRhKS5yZWRNdWwodGhpcy54LnJlZEFkZChkZWx0YSkpO1xuICAgIGFscGhhID0gYWxwaGEucmVkQWRkKGFscGhhKS5yZWRJQWRkKGFscGhhKTtcbiAgICAvLyBYMyA9IGFscGhhXjIgLSA4ICogYmV0YVxuICAgIHZhciBiZXRhNCA9IGJldGEucmVkSUFkZChiZXRhKTtcbiAgICBiZXRhNCA9IGJldGE0LnJlZElBZGQoYmV0YTQpO1xuICAgIHZhciBiZXRhOCA9IGJldGE0LnJlZEFkZChiZXRhNCk7XG4gICAgbnggPSBhbHBoYS5yZWRTcXIoKS5yZWRJU3ViKGJldGE4KTtcbiAgICAvLyBaMyA9IChZMSArIFoxKV4yIC0gZ2FtbWEgLSBkZWx0YVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnopLnJlZFNxcigpLnJlZElTdWIoZ2FtbWEpLnJlZElTdWIoZGVsdGEpO1xuICAgIC8vIFkzID0gYWxwaGEgKiAoNCAqIGJldGEgLSBYMykgLSA4ICogZ2FtbWFeMlxuICAgIHZhciBnZ2FtbWE4ID0gZ2FtbWEucmVkU3FyKCk7XG4gICAgZ2dhbW1hOCA9IGdnYW1tYTgucmVkSUFkZChnZ2FtbWE4KTtcbiAgICBnZ2FtbWE4ID0gZ2dhbW1hOC5yZWRJQWRkKGdnYW1tYTgpO1xuICAgIGdnYW1tYTggPSBnZ2FtbWE4LnJlZElBZGQoZ2dhbW1hOCk7XG4gICAgbnkgPSBhbHBoYS5yZWRNdWwoYmV0YTQucmVkSVN1YihueCkpLnJlZElTdWIoZ2dhbW1hOCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl9kYmwgPSBmdW5jdGlvbiBfZGJsKCkge1xuICB2YXIgYSA9IHRoaXMuY3VydmUuYTtcblxuICAvLyA0TSArIDZTICsgMTBBXG4gIHZhciBqeCA9IHRoaXMueDtcbiAgdmFyIGp5ID0gdGhpcy55O1xuICB2YXIganogPSB0aGlzLno7XG4gIHZhciBqejQgPSBqei5yZWRTcXIoKS5yZWRTcXIoKTtcblxuICB2YXIgangyID0gangucmVkU3FyKCk7XG4gIHZhciBqeTIgPSBqeS5yZWRTcXIoKTtcblxuICB2YXIgYyA9IGp4Mi5yZWRBZGQoangyKS5yZWRJQWRkKGp4MikucmVkSUFkZChhLnJlZE11bChqejQpKTtcblxuICB2YXIganhkNCA9IGp4LnJlZEFkZChqeCk7XG4gIGp4ZDQgPSBqeGQ0LnJlZElBZGQoanhkNCk7XG4gIHZhciB0MSA9IGp4ZDQucmVkTXVsKGp5Mik7XG4gIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0MS5yZWRBZGQodDEpKTtcbiAgdmFyIHQyID0gdDEucmVkSVN1YihueCk7XG5cbiAgdmFyIGp5ZDggPSBqeTIucmVkU3FyKCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIHZhciBueSA9IGMucmVkTXVsKHQyKS5yZWRJU3ViKGp5ZDgpO1xuICB2YXIgbnogPSBqeS5yZWRBZGQoankpLnJlZE11bChqeik7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS50cnBsID0gZnVuY3Rpb24gdHJwbCgpIHtcbiAgaWYgKCF0aGlzLmN1cnZlLnplcm9BKVxuICAgIHJldHVybiB0aGlzLmRibCgpLmFkZCh0aGlzKTtcblxuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbCN0cmlwbGluZy10cGwtMjAwNy1ibFxuICAvLyA1TSArIDEwUyArIC4uLlxuXG4gIC8vIFhYID0gWDFeMlxuICB2YXIgeHggPSB0aGlzLngucmVkU3FyKCk7XG4gIC8vIFlZID0gWTFeMlxuICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gIC8vIFpaID0gWjFeMlxuICB2YXIgenogPSB0aGlzLnoucmVkU3FyKCk7XG4gIC8vIFlZWVkgPSBZWV4yXG4gIHZhciB5eXl5ID0geXkucmVkU3FyKCk7XG4gIC8vIE0gPSAzICogWFggKyBhICogWloyOyBhID0gMFxuICB2YXIgbSA9IHh4LnJlZEFkZCh4eCkucmVkSUFkZCh4eCk7XG4gIC8vIE1NID0gTV4yXG4gIHZhciBtbSA9IG0ucmVkU3FyKCk7XG4gIC8vIEUgPSA2ICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKSAtIE1NXG4gIHZhciBlID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgZSA9IGUucmVkSUFkZChlKTtcbiAgZSA9IGUucmVkQWRkKGUpLnJlZElBZGQoZSk7XG4gIGUgPSBlLnJlZElTdWIobW0pO1xuICAvLyBFRSA9IEVeMlxuICB2YXIgZWUgPSBlLnJlZFNxcigpO1xuICAvLyBUID0gMTYqWVlZWVxuICB2YXIgdCA9IHl5eXkucmVkSUFkZCh5eXl5KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgLy8gVSA9IChNICsgRSleMiAtIE1NIC0gRUUgLSBUXG4gIHZhciB1ID0gbS5yZWRJQWRkKGUpLnJlZFNxcigpLnJlZElTdWIobW0pLnJlZElTdWIoZWUpLnJlZElTdWIodCk7XG4gIC8vIFgzID0gNCAqIChYMSAqIEVFIC0gNCAqIFlZICogVSlcbiAgdmFyIHl5dTQgPSB5eS5yZWRNdWwodSk7XG4gIHl5dTQgPSB5eXU0LnJlZElBZGQoeXl1NCk7XG4gIHl5dTQgPSB5eXU0LnJlZElBZGQoeXl1NCk7XG4gIHZhciBueCA9IHRoaXMueC5yZWRNdWwoZWUpLnJlZElTdWIoeXl1NCk7XG4gIG54ID0gbngucmVkSUFkZChueCk7XG4gIG54ID0gbngucmVkSUFkZChueCk7XG4gIC8vIFkzID0gOCAqIFkxICogKFUgKiAoVCAtIFUpIC0gRSAqIEVFKVxuICB2YXIgbnkgPSB0aGlzLnkucmVkTXVsKHUucmVkTXVsKHQucmVkSVN1Yih1KSkucmVkSVN1YihlLnJlZE11bChlZSkpKTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgLy8gWjMgPSAoWjEgKyBFKV4yIC0gWlogLSBFRVxuICB2YXIgbnogPSB0aGlzLnoucmVkQWRkKGUpLnJlZFNxcigpLnJlZElTdWIoenopLnJlZElTdWIoZWUpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsKGssIGtiYXNlKSB7XG4gIGsgPSBuZXcgQk4oaywga2Jhc2UpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKHApIHtcbiAgaWYgKHAudHlwZSA9PT0gJ2FmZmluZScpXG4gICAgcmV0dXJuIHRoaXMuZXEocC50b0ooKSk7XG5cbiAgaWYgKHRoaXMgPT09IHApXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgLy8geDEgKiB6Ml4yID09IHgyICogejFeMlxuICB2YXIgejIgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciBwejIgPSBwLnoucmVkU3FyKCk7XG4gIGlmICh0aGlzLngucmVkTXVsKHB6MikucmVkSVN1YihwLngucmVkTXVsKHoyKSkuY21wbigwKSAhPT0gMClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8geTEgKiB6Ml4zID09IHkyICogejFeM1xuICB2YXIgejMgPSB6Mi5yZWRNdWwodGhpcy56KTtcbiAgdmFyIHB6MyA9IHB6Mi5yZWRNdWwocC56KTtcbiAgcmV0dXJuIHRoaXMueS5yZWRNdWwocHozKS5yZWRJU3ViKHAueS5yZWRNdWwoejMpKS5jbXBuKDApID09PSAwO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5lcVhUb1AgPSBmdW5jdGlvbiBlcVhUb1AoeCkge1xuICB2YXIgenMgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciByeCA9IHgudG9SZWQodGhpcy5jdXJ2ZS5yZWQpLnJlZE11bCh6cyk7XG4gIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB2YXIgeGMgPSB4LmNsb25lKCk7XG4gIHZhciB0ID0gdGhpcy5jdXJ2ZS5yZWROLnJlZE11bCh6cyk7XG4gIGZvciAoOzspIHtcbiAgICB4Yy5pYWRkKHRoaXMuY3VydmUubik7XG4gICAgaWYgKHhjLmNtcCh0aGlzLmN1cnZlLnApID49IDApXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICByeC5yZWRJQWRkKHQpO1xuICAgIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgSlBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIEpQb2ludCB4OiAnICsgdGhpcy54LnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgejogJyArIHRoaXMuei50b1N0cmluZygxNiwgMikgKyAnPic7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICAvLyBYWFggVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB6ZXJvIGlzIGFsd2F5cyB6ZXJvIGluIHJlZFxuICByZXR1cm4gdGhpcy56LmNtcG4oMCkgPT09IDA7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIEJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gTW9udEN1cnZlKGNvbmYpIHtcbiAgQmFzZS5jYWxsKHRoaXMsICdtb250JywgY29uZik7XG5cbiAgdGhpcy5hID0gbmV3IEJOKGNvbmYuYSwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5iID0gbmV3IEJOKGNvbmYuYiwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5pNCA9IG5ldyBCTig0KS50b1JlZCh0aGlzLnJlZCkucmVkSW52bSgpO1xuICB0aGlzLnR3byA9IG5ldyBCTigyKS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYTI0ID0gdGhpcy5pNC5yZWRNdWwodGhpcy5hLnJlZEFkZCh0aGlzLnR3bykpO1xufVxuaW5oZXJpdHMoTW9udEN1cnZlLCBCYXNlKTtcbm1vZHVsZS5leHBvcnRzID0gTW9udEN1cnZlO1xuXG5Nb250Q3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpIHtcbiAgdmFyIHggPSBwb2ludC5ub3JtYWxpemUoKS54O1xuICB2YXIgeDIgPSB4LnJlZFNxcigpO1xuICB2YXIgcmhzID0geDIucmVkTXVsKHgpLnJlZEFkZCh4Mi5yZWRNdWwodGhpcy5hKSkucmVkQWRkKHgpO1xuICB2YXIgeSA9IHJocy5yZWRTcXJ0KCk7XG5cbiAgcmV0dXJuIHkucmVkU3FyKCkuY21wKHJocykgPT09IDA7XG59O1xuXG5mdW5jdGlvbiBQb2ludChjdXJ2ZSwgeCwgeikge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAncHJvamVjdGl2ZScpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB6ID09PSBudWxsKSB7XG4gICAgdGhpcy54ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy56ID0gdGhpcy5jdXJ2ZS56ZXJvO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IG5ldyBCTih4LCAxNik7XG4gICAgdGhpcy56ID0gbmV3IEJOKHosIDE2KTtcbiAgICBpZiAoIXRoaXMueC5yZWQpXG4gICAgICB0aGlzLnggPSB0aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICghdGhpcy56LnJlZClcbiAgICAgIHRoaXMueiA9IHRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gIH1cbn1cbmluaGVyaXRzKFBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cbk1vbnRDdXJ2ZS5wcm90b3R5cGUuZGVjb2RlUG9pbnQgPSBmdW5jdGlvbiBkZWNvZGVQb2ludChieXRlcywgZW5jKSB7XG4gIHJldHVybiB0aGlzLnBvaW50KHV0aWxzLnRvQXJyYXkoYnl0ZXMsIGVuYyksIDEpO1xufTtcblxuTW9udEN1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KHgsIHopIHtcbiAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLCB4LCB6KTtcbn07XG5cbk1vbnRDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uIHBvaW50RnJvbUpTT04ob2JqKSB7XG4gIHJldHVybiBQb2ludC5mcm9tSlNPTih0aGlzLCBvYmopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnByZWNvbXB1dGUgPSBmdW5jdGlvbiBwcmVjb21wdXRlKCkge1xuICAvLyBOby1vcFxufTtcblxuUG9pbnQucHJvdG90eXBlLl9lbmNvZGUgPSBmdW5jdGlvbiBfZW5jb2RlKCkge1xuICByZXR1cm4gdGhpcy5nZXRYKCkudG9BcnJheSgnYmUnLCB0aGlzLmN1cnZlLnAuYnl0ZUxlbmd0aCgpKTtcbn07XG5cblBvaW50LmZyb21KU09OID0gZnVuY3Rpb24gZnJvbUpTT04oY3VydmUsIG9iaikge1xuICByZXR1cm4gbmV3IFBvaW50KGN1cnZlLCBvYmpbMF0sIG9ialsxXSB8fCBjdXJ2ZS5vbmUpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgUG9pbnQgSW5maW5pdHk+JztcbiAgcmV0dXJuICc8RUMgUG9pbnQgeDogJyArIHRoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgejogJyArIHRoaXMuei5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICAvLyBYWFggVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB6ZXJvIGlzIGFsd2F5cyB6ZXJvIGluIHJlZFxuICByZXR1cm4gdGhpcy56LmNtcG4oMCkgPT09IDA7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24gZGJsKCkge1xuICAvLyBodHRwOi8vaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLW1vbnRnb20teHouaHRtbCNkb3VibGluZy1kYmwtMTk4Ny1tLTNcbiAgLy8gMk0gKyAyUyArIDRBXG5cbiAgLy8gQSA9IFgxICsgWjFcbiAgdmFyIGEgPSB0aGlzLngucmVkQWRkKHRoaXMueik7XG4gIC8vIEFBID0gQV4yXG4gIHZhciBhYSA9IGEucmVkU3FyKCk7XG4gIC8vIEIgPSBYMSAtIFoxXG4gIHZhciBiID0gdGhpcy54LnJlZFN1Yih0aGlzLnopO1xuICAvLyBCQiA9IEJeMlxuICB2YXIgYmIgPSBiLnJlZFNxcigpO1xuICAvLyBDID0gQUEgLSBCQlxuICB2YXIgYyA9IGFhLnJlZFN1YihiYik7XG4gIC8vIFgzID0gQUEgKiBCQlxuICB2YXIgbnggPSBhYS5yZWRNdWwoYmIpO1xuICAvLyBaMyA9IEMgKiAoQkIgKyBBMjQgKiBDKVxuICB2YXIgbnogPSBjLnJlZE11bChiYi5yZWRBZGQodGhpcy5jdXJ2ZS5hMjQucmVkTXVsKGMpKSk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQgb24gTW9udGdvbWVyeSBjdXJ2ZScpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRpZmZBZGQgPSBmdW5jdGlvbiBkaWZmQWRkKHAsIGRpZmYpIHtcbiAgLy8gaHR0cDovL2h5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1tb250Z29tLXh6Lmh0bWwjZGlmZmFkZC1kYWRkLTE5ODctbS0zXG4gIC8vIDRNICsgMlMgKyA2QVxuXG4gIC8vIEEgPSBYMiArIFoyXG4gIHZhciBhID0gdGhpcy54LnJlZEFkZCh0aGlzLnopO1xuICAvLyBCID0gWDIgLSBaMlxuICB2YXIgYiA9IHRoaXMueC5yZWRTdWIodGhpcy56KTtcbiAgLy8gQyA9IFgzICsgWjNcbiAgdmFyIGMgPSBwLngucmVkQWRkKHAueik7XG4gIC8vIEQgPSBYMyAtIFozXG4gIHZhciBkID0gcC54LnJlZFN1YihwLnopO1xuICAvLyBEQSA9IEQgKiBBXG4gIHZhciBkYSA9IGQucmVkTXVsKGEpO1xuICAvLyBDQiA9IEMgKiBCXG4gIHZhciBjYiA9IGMucmVkTXVsKGIpO1xuICAvLyBYNSA9IFoxICogKERBICsgQ0IpXjJcbiAgdmFyIG54ID0gZGlmZi56LnJlZE11bChkYS5yZWRBZGQoY2IpLnJlZFNxcigpKTtcbiAgLy8gWjUgPSBYMSAqIChEQSAtIENCKV4yXG4gIHZhciBueiA9IGRpZmYueC5yZWRNdWwoZGEucmVkSVN1YihjYikucmVkU3FyKCkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrKSB7XG4gIHZhciB0ID0gay5jbG9uZSgpO1xuICB2YXIgYSA9IHRoaXM7IC8vIChOIC8gMikgKiBRICsgUVxuICB2YXIgYiA9IHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7IC8vIChOIC8gMikgKiBRXG4gIHZhciBjID0gdGhpczsgLy8gUVxuXG4gIGZvciAodmFyIGJpdHMgPSBbXTsgdC5jbXBuKDApICE9PSAwOyB0Lml1c2hybigxKSlcbiAgICBiaXRzLnB1c2godC5hbmRsbigxKSk7XG5cbiAgZm9yICh2YXIgaSA9IGJpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoYml0c1tpXSA9PT0gMCkge1xuICAgICAgLy8gTiAqIFEgKyBRID0gKChOIC8gMikgKiBRICsgUSkpICsgKE4gLyAyKSAqIFFcbiAgICAgIGEgPSBhLmRpZmZBZGQoYiwgYyk7XG4gICAgICAvLyBOICogUSA9IDIgKiAoKE4gLyAyKSAqIFEgKyBRKSlcbiAgICAgIGIgPSBiLmRibCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOICogUSA9ICgoTiAvIDIpICogUSArIFEpICsgKChOIC8gMikgKiBRKVxuICAgICAgYiA9IGEuZGlmZkFkZChiLCBjKTtcbiAgICAgIC8vIE4gKiBRICsgUSA9IDIgKiAoKE4gLyAyKSAqIFEgKyBRKVxuICAgICAgYSA9IGEuZGJsKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBiO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uIG11bEFkZCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUnKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5qdW1sQWRkID0gZnVuY3Rpb24ganVtbEFkZCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUnKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLmdldFgoKS5jbXAob3RoZXIuZ2V0WCgpKSA9PT0gMDtcbn07XG5cblBvaW50LnByb3RvdHlwZS5ub3JtYWxpemUgPSBmdW5jdGlvbiBub3JtYWxpemUoKSB7XG4gIHRoaXMueCA9IHRoaXMueC5yZWRNdWwodGhpcy56LnJlZEludm0oKSk7XG4gIHRoaXMueiA9IHRoaXMuY3VydmUub25lO1xuICByZXR1cm4gdGhpcztcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gZ2V0WCgpIHtcbiAgLy8gTm9ybWFsaXplIGNvb3JkaW5hdGVzXG4gIHRoaXMubm9ybWFsaXplKCk7XG5cbiAgcmV0dXJuIHRoaXMueC5mcm9tUmVkKCk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbnZhciBCYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG5cbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIEVkd2FyZHNDdXJ2ZShjb25mKSB7XG4gIC8vIE5PVEU6IEltcG9ydGFudCBhcyB3ZSBhcmUgY3JlYXRpbmcgcG9pbnQgaW4gQmFzZS5jYWxsKClcbiAgdGhpcy50d2lzdGVkID0gKGNvbmYuYSB8IDApICE9PSAxO1xuICB0aGlzLm1PbmVBID0gdGhpcy50d2lzdGVkICYmIChjb25mLmEgfCAwKSA9PT0gLTE7XG4gIHRoaXMuZXh0ZW5kZWQgPSB0aGlzLm1PbmVBO1xuXG4gIEJhc2UuY2FsbCh0aGlzLCAnZWR3YXJkcycsIGNvbmYpO1xuXG4gIHRoaXMuYSA9IG5ldyBCTihjb25mLmEsIDE2KS51bW9kKHRoaXMucmVkLm0pO1xuICB0aGlzLmEgPSB0aGlzLmEudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmMgPSBuZXcgQk4oY29uZi5jLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmMyID0gdGhpcy5jLnJlZFNxcigpO1xuICB0aGlzLmQgPSBuZXcgQk4oY29uZi5kLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmRkID0gdGhpcy5kLnJlZEFkZCh0aGlzLmQpO1xuXG4gIGFzc2VydCghdGhpcy50d2lzdGVkIHx8IHRoaXMuYy5mcm9tUmVkKCkuY21wbigxKSA9PT0gMCk7XG4gIHRoaXMub25lQyA9IChjb25mLmMgfCAwKSA9PT0gMTtcbn1cbmluaGVyaXRzKEVkd2FyZHNDdXJ2ZSwgQmFzZSk7XG5tb2R1bGUuZXhwb3J0cyA9IEVkd2FyZHNDdXJ2ZTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5fbXVsQSA9IGZ1bmN0aW9uIF9tdWxBKG51bSkge1xuICBpZiAodGhpcy5tT25lQSlcbiAgICByZXR1cm4gbnVtLnJlZE5lZygpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuYS5yZWRNdWwobnVtKTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuX211bEMgPSBmdW5jdGlvbiBfbXVsQyhudW0pIHtcbiAgaWYgKHRoaXMub25lQylcbiAgICByZXR1cm4gbnVtO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuYy5yZWRNdWwobnVtKTtcbn07XG5cbi8vIEp1c3QgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTaG9ydCBjdXJ2ZVxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5qcG9pbnQgPSBmdW5jdGlvbiBqcG9pbnQoeCwgeSwgeiwgdCkge1xuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5LCB6LCB0KTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tWCA9IGZ1bmN0aW9uIHBvaW50RnJvbVgoeCwgb2RkKSB7XG4gIHggPSBuZXcgQk4oeCwgMTYpO1xuICBpZiAoIXgucmVkKVxuICAgIHggPSB4LnRvUmVkKHRoaXMucmVkKTtcblxuICB2YXIgeDIgPSB4LnJlZFNxcigpO1xuICB2YXIgcmhzID0gdGhpcy5jMi5yZWRTdWIodGhpcy5hLnJlZE11bCh4MikpO1xuICB2YXIgbGhzID0gdGhpcy5vbmUucmVkU3ViKHRoaXMuYzIucmVkTXVsKHRoaXMuZCkucmVkTXVsKHgyKSk7XG5cbiAgdmFyIHkyID0gcmhzLnJlZE11bChsaHMucmVkSW52bSgpKTtcbiAgdmFyIHkgPSB5Mi5yZWRTcXJ0KCk7XG4gIGlmICh5LnJlZFNxcigpLnJlZFN1Yih5MikuY21wKHRoaXMuemVybykgIT09IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBvaW50Jyk7XG5cbiAgdmFyIGlzT2RkID0geS5mcm9tUmVkKCkuaXNPZGQoKTtcbiAgaWYgKG9kZCAmJiAhaXNPZGQgfHwgIW9kZCAmJiBpc09kZClcbiAgICB5ID0geS5yZWROZWcoKTtcblxuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5KTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tWSA9IGZ1bmN0aW9uIHBvaW50RnJvbVkoeSwgb2RkKSB7XG4gIHkgPSBuZXcgQk4oeSwgMTYpO1xuICBpZiAoIXkucmVkKVxuICAgIHkgPSB5LnRvUmVkKHRoaXMucmVkKTtcblxuICAvLyB4XjIgPSAoeV4yIC0gY14yKSAvIChjXjIgZCB5XjIgLSBhKVxuICB2YXIgeTIgPSB5LnJlZFNxcigpO1xuICB2YXIgbGhzID0geTIucmVkU3ViKHRoaXMuYzIpO1xuICB2YXIgcmhzID0geTIucmVkTXVsKHRoaXMuZCkucmVkTXVsKHRoaXMuYzIpLnJlZFN1Yih0aGlzLmEpO1xuICB2YXIgeDIgPSBsaHMucmVkTXVsKHJocy5yZWRJbnZtKCkpO1xuXG4gIGlmICh4Mi5jbXAodGhpcy56ZXJvKSA9PT0gMCkge1xuICAgIGlmIChvZGQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcG9pbnQnKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5wb2ludCh0aGlzLnplcm8sIHkpO1xuICB9XG5cbiAgdmFyIHggPSB4Mi5yZWRTcXJ0KCk7XG4gIGlmICh4LnJlZFNxcigpLnJlZFN1Yih4MikuY21wKHRoaXMuemVybykgIT09IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBvaW50Jyk7XG5cbiAgaWYgKHguZnJvbVJlZCgpLmlzT2RkKCkgIT09IG9kZClcbiAgICB4ID0geC5yZWROZWcoKTtcblxuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5KTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZShwb2ludCkge1xuICBpZiAocG9pbnQuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0cnVlO1xuXG4gIC8vIEN1cnZlOiBBICogWF4yICsgWV4yID0gQ14yICogKDEgKyBEICogWF4yICogWV4yKVxuICBwb2ludC5ub3JtYWxpemUoKTtcblxuICB2YXIgeDIgPSBwb2ludC54LnJlZFNxcigpO1xuICB2YXIgeTIgPSBwb2ludC55LnJlZFNxcigpO1xuICB2YXIgbGhzID0geDIucmVkTXVsKHRoaXMuYSkucmVkQWRkKHkyKTtcbiAgdmFyIHJocyA9IHRoaXMuYzIucmVkTXVsKHRoaXMub25lLnJlZEFkZCh0aGlzLmQucmVkTXVsKHgyKS5yZWRNdWwoeTIpKSk7XG5cbiAgcmV0dXJuIGxocy5jbXAocmhzKSA9PT0gMDtcbn07XG5cbmZ1bmN0aW9uIFBvaW50KGN1cnZlLCB4LCB5LCB6LCB0KSB7XG4gIEJhc2UuQmFzZVBvaW50LmNhbGwodGhpcywgY3VydmUsICdwcm9qZWN0aXZlJyk7XG4gIGlmICh4ID09PSBudWxsICYmIHkgPT09IG51bGwgJiYgeiA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHRoaXMuY3VydmUuemVybztcbiAgICB0aGlzLnkgPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnogPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnQgPSB0aGlzLmN1cnZlLnplcm87XG4gICAgdGhpcy56T25lID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSBuZXcgQk4oeCwgMTYpO1xuICAgIHRoaXMueSA9IG5ldyBCTih5LCAxNik7XG4gICAgdGhpcy56ID0geiA/IG5ldyBCTih6LCAxNikgOiB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnQgPSB0ICYmIG5ldyBCTih0LCAxNik7XG4gICAgaWYgKCF0aGlzLngucmVkKVxuICAgICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMueS5yZWQpXG4gICAgICB0aGlzLnkgPSB0aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICghdGhpcy56LnJlZClcbiAgICAgIHRoaXMueiA9IHRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKHRoaXMudCAmJiAhdGhpcy50LnJlZClcbiAgICAgIHRoaXMudCA9IHRoaXMudC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgdGhpcy56T25lID0gdGhpcy56ID09PSB0aGlzLmN1cnZlLm9uZTtcblxuICAgIC8vIFVzZSBleHRlbmRlZCBjb29yZGluYXRlc1xuICAgIGlmICh0aGlzLmN1cnZlLmV4dGVuZGVkICYmICF0aGlzLnQpIHtcbiAgICAgIHRoaXMudCA9IHRoaXMueC5yZWRNdWwodGhpcy55KTtcbiAgICAgIGlmICghdGhpcy56T25lKVxuICAgICAgICB0aGlzLnQgPSB0aGlzLnQucmVkTXVsKHRoaXMuei5yZWRJbnZtKCkpO1xuICAgIH1cbiAgfVxufVxuaW5oZXJpdHMoUG9pbnQsIEJhc2UuQmFzZVBvaW50KTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5wb2ludEZyb21KU09OID0gZnVuY3Rpb24gcG9pbnRGcm9tSlNPTihvYmopIHtcbiAgcmV0dXJuIFBvaW50LmZyb21KU09OKHRoaXMsIG9iaik7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24gcG9pbnQoeCwgeSwgeiwgdCkge1xuICByZXR1cm4gbmV3IFBvaW50KHRoaXMsIHgsIHksIHosIHQpO1xufTtcblxuUG9pbnQuZnJvbUpTT04gPSBmdW5jdGlvbiBmcm9tSlNPTihjdXJ2ZSwgb2JqKSB7XG4gIHJldHVybiBuZXcgUG9pbnQoY3VydmUsIG9ialswXSwgb2JqWzFdLCBvYmpbMl0pO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgUG9pbnQgSW5maW5pdHk+JztcbiAgcmV0dXJuICc8RUMgUG9pbnQgeDogJyArIHRoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgeTogJyArIHRoaXMueS5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgejogJyArIHRoaXMuei5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICAvLyBYWFggVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB6ZXJvIGlzIGFsd2F5cyB6ZXJvIGluIHJlZFxuICByZXR1cm4gdGhpcy54LmNtcG4oMCkgPT09IDAgJiZcbiAgICAodGhpcy55LmNtcCh0aGlzLnopID09PSAwIHx8XG4gICAgKHRoaXMuek9uZSAmJiB0aGlzLnkuY21wKHRoaXMuY3VydmUuYykgPT09IDApKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZXh0RGJsID0gZnVuY3Rpb24gX2V4dERibCgpIHtcbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQtMS5odG1sXG4gIC8vICAgICAjZG91YmxpbmctZGJsLTIwMDgtaHdjZFxuICAvLyA0TSArIDRTXG5cbiAgLy8gQSA9IFgxXjJcbiAgdmFyIGEgPSB0aGlzLngucmVkU3FyKCk7XG4gIC8vIEIgPSBZMV4yXG4gIHZhciBiID0gdGhpcy55LnJlZFNxcigpO1xuICAvLyBDID0gMiAqIFoxXjJcbiAgdmFyIGMgPSB0aGlzLnoucmVkU3FyKCk7XG4gIGMgPSBjLnJlZElBZGQoYyk7XG4gIC8vIEQgPSBhICogQVxuICB2YXIgZCA9IHRoaXMuY3VydmUuX211bEEoYSk7XG4gIC8vIEUgPSAoWDEgKyBZMSleMiAtIEEgLSBCXG4gIHZhciBlID0gdGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZFNxcigpLnJlZElTdWIoYSkucmVkSVN1YihiKTtcbiAgLy8gRyA9IEQgKyBCXG4gIHZhciBnID0gZC5yZWRBZGQoYik7XG4gIC8vIEYgPSBHIC0gQ1xuICB2YXIgZiA9IGcucmVkU3ViKGMpO1xuICAvLyBIID0gRCAtIEJcbiAgdmFyIGggPSBkLnJlZFN1YihiKTtcbiAgLy8gWDMgPSBFICogRlxuICB2YXIgbnggPSBlLnJlZE11bChmKTtcbiAgLy8gWTMgPSBHICogSFxuICB2YXIgbnkgPSBnLnJlZE11bChoKTtcbiAgLy8gVDMgPSBFICogSFxuICB2YXIgbnQgPSBlLnJlZE11bChoKTtcbiAgLy8gWjMgPSBGICogR1xuICB2YXIgbnogPSBmLnJlZE11bChnKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55LCBueiwgbnQpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9wcm9qRGJsID0gZnVuY3Rpb24gX3Byb2pEYmwoKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLXByb2plY3RpdmUuaHRtbFxuICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA4LWJiamxwXG4gIC8vICAgICAjZG91YmxpbmctZGJsLTIwMDctYmxcbiAgLy8gYW5kIG90aGVyc1xuICAvLyBHZW5lcmFsbHkgM00gKyA0UyBvciAyTSArIDRTXG5cbiAgLy8gQiA9IChYMSArIFkxKV4yXG4gIHZhciBiID0gdGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZFNxcigpO1xuICAvLyBDID0gWDFeMlxuICB2YXIgYyA9IHRoaXMueC5yZWRTcXIoKTtcbiAgLy8gRCA9IFkxXjJcbiAgdmFyIGQgPSB0aGlzLnkucmVkU3FyKCk7XG5cbiAgdmFyIG54O1xuICB2YXIgbnk7XG4gIHZhciBuejtcbiAgdmFyIGU7XG4gIHZhciBoO1xuICB2YXIgajtcbiAgaWYgKHRoaXMuY3VydmUudHdpc3RlZCkge1xuICAgIC8vIEUgPSBhICogQ1xuICAgIGUgPSB0aGlzLmN1cnZlLl9tdWxBKGMpO1xuICAgIC8vIEYgPSBFICsgRFxuICAgIHZhciBmID0gZS5yZWRBZGQoZCk7XG4gICAgaWYgKHRoaXMuek9uZSkge1xuICAgICAgLy8gWDMgPSAoQiAtIEMgLSBEKSAqIChGIC0gMilcbiAgICAgIG54ID0gYi5yZWRTdWIoYykucmVkU3ViKGQpLnJlZE11bChmLnJlZFN1Yih0aGlzLmN1cnZlLnR3bykpO1xuICAgICAgLy8gWTMgPSBGICogKEUgLSBEKVxuICAgICAgbnkgPSBmLnJlZE11bChlLnJlZFN1YihkKSk7XG4gICAgICAvLyBaMyA9IEZeMiAtIDIgKiBGXG4gICAgICBueiA9IGYucmVkU3FyKCkucmVkU3ViKGYpLnJlZFN1YihmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSCA9IFoxXjJcbiAgICAgIGggPSB0aGlzLnoucmVkU3FyKCk7XG4gICAgICAvLyBKID0gRiAtIDIgKiBIXG4gICAgICBqID0gZi5yZWRTdWIoaCkucmVkSVN1YihoKTtcbiAgICAgIC8vIFgzID0gKEItQy1EKSpKXG4gICAgICBueCA9IGIucmVkU3ViKGMpLnJlZElTdWIoZCkucmVkTXVsKGopO1xuICAgICAgLy8gWTMgPSBGICogKEUgLSBEKVxuICAgICAgbnkgPSBmLnJlZE11bChlLnJlZFN1YihkKSk7XG4gICAgICAvLyBaMyA9IEYgKiBKXG4gICAgICBueiA9IGYucmVkTXVsKGopO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBFID0gQyArIERcbiAgICBlID0gYy5yZWRBZGQoZCk7XG4gICAgLy8gSCA9IChjICogWjEpXjJcbiAgICBoID0gdGhpcy5jdXJ2ZS5fbXVsQyh0aGlzLnopLnJlZFNxcigpO1xuICAgIC8vIEogPSBFIC0gMiAqIEhcbiAgICBqID0gZS5yZWRTdWIoaCkucmVkU3ViKGgpO1xuICAgIC8vIFgzID0gYyAqIChCIC0gRSkgKiBKXG4gICAgbnggPSB0aGlzLmN1cnZlLl9tdWxDKGIucmVkSVN1YihlKSkucmVkTXVsKGopO1xuICAgIC8vIFkzID0gYyAqIEUgKiAoQyAtIEQpXG4gICAgbnkgPSB0aGlzLmN1cnZlLl9tdWxDKGUpLnJlZE11bChjLnJlZElTdWIoZCkpO1xuICAgIC8vIFozID0gRSAqIEpcbiAgICBueiA9IGUucmVkTXVsKGopO1xuICB9XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIERvdWJsZSBpbiBleHRlbmRlZCBjb29yZGluYXRlc1xuICBpZiAodGhpcy5jdXJ2ZS5leHRlbmRlZClcbiAgICByZXR1cm4gdGhpcy5fZXh0RGJsKCk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5fcHJvakRibCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9leHRBZGQgPSBmdW5jdGlvbiBfZXh0QWRkKHApIHtcbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQtMS5odG1sXG4gIC8vICAgICAjYWRkaXRpb24tYWRkLTIwMDgtaHdjZC0zXG4gIC8vIDhNXG5cbiAgLy8gQSA9IChZMSAtIFgxKSAqIChZMiAtIFgyKVxuICB2YXIgYSA9IHRoaXMueS5yZWRTdWIodGhpcy54KS5yZWRNdWwocC55LnJlZFN1YihwLngpKTtcbiAgLy8gQiA9IChZMSArIFgxKSAqIChZMiArIFgyKVxuICB2YXIgYiA9IHRoaXMueS5yZWRBZGQodGhpcy54KS5yZWRNdWwocC55LnJlZEFkZChwLngpKTtcbiAgLy8gQyA9IFQxICogayAqIFQyXG4gIHZhciBjID0gdGhpcy50LnJlZE11bCh0aGlzLmN1cnZlLmRkKS5yZWRNdWwocC50KTtcbiAgLy8gRCA9IFoxICogMiAqIFoyXG4gIHZhciBkID0gdGhpcy56LnJlZE11bChwLnoucmVkQWRkKHAueikpO1xuICAvLyBFID0gQiAtIEFcbiAgdmFyIGUgPSBiLnJlZFN1YihhKTtcbiAgLy8gRiA9IEQgLSBDXG4gIHZhciBmID0gZC5yZWRTdWIoYyk7XG4gIC8vIEcgPSBEICsgQ1xuICB2YXIgZyA9IGQucmVkQWRkKGMpO1xuICAvLyBIID0gQiArIEFcbiAgdmFyIGggPSBiLnJlZEFkZChhKTtcbiAgLy8gWDMgPSBFICogRlxuICB2YXIgbnggPSBlLnJlZE11bChmKTtcbiAgLy8gWTMgPSBHICogSFxuICB2YXIgbnkgPSBnLnJlZE11bChoKTtcbiAgLy8gVDMgPSBFICogSFxuICB2YXIgbnQgPSBlLnJlZE11bChoKTtcbiAgLy8gWjMgPSBGICogR1xuICB2YXIgbnogPSBmLnJlZE11bChnKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55LCBueiwgbnQpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9wcm9qQWRkID0gZnVuY3Rpb24gX3Byb2pBZGQocCkge1xuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tdHdpc3RlZC1wcm9qZWN0aXZlLmh0bWxcbiAgLy8gICAgICNhZGRpdGlvbi1hZGQtMjAwOC1iYmpscFxuICAvLyAgICAgI2FkZGl0aW9uLWFkZC0yMDA3LWJsXG4gIC8vIDEwTSArIDFTXG5cbiAgLy8gQSA9IFoxICogWjJcbiAgdmFyIGEgPSB0aGlzLnoucmVkTXVsKHAueik7XG4gIC8vIEIgPSBBXjJcbiAgdmFyIGIgPSBhLnJlZFNxcigpO1xuICAvLyBDID0gWDEgKiBYMlxuICB2YXIgYyA9IHRoaXMueC5yZWRNdWwocC54KTtcbiAgLy8gRCA9IFkxICogWTJcbiAgdmFyIGQgPSB0aGlzLnkucmVkTXVsKHAueSk7XG4gIC8vIEUgPSBkICogQyAqIERcbiAgdmFyIGUgPSB0aGlzLmN1cnZlLmQucmVkTXVsKGMpLnJlZE11bChkKTtcbiAgLy8gRiA9IEIgLSBFXG4gIHZhciBmID0gYi5yZWRTdWIoZSk7XG4gIC8vIEcgPSBCICsgRVxuICB2YXIgZyA9IGIucmVkQWRkKGUpO1xuICAvLyBYMyA9IEEgKiBGICogKChYMSArIFkxKSAqIChYMiArIFkyKSAtIEMgLSBEKVxuICB2YXIgdG1wID0gdGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZE11bChwLngucmVkQWRkKHAueSkpLnJlZElTdWIoYykucmVkSVN1YihkKTtcbiAgdmFyIG54ID0gYS5yZWRNdWwoZikucmVkTXVsKHRtcCk7XG4gIHZhciBueTtcbiAgdmFyIG56O1xuICBpZiAodGhpcy5jdXJ2ZS50d2lzdGVkKSB7XG4gICAgLy8gWTMgPSBBICogRyAqIChEIC0gYSAqIEMpXG4gICAgbnkgPSBhLnJlZE11bChnKS5yZWRNdWwoZC5yZWRTdWIodGhpcy5jdXJ2ZS5fbXVsQShjKSkpO1xuICAgIC8vIFozID0gRiAqIEdcbiAgICBueiA9IGYucmVkTXVsKGcpO1xuICB9IGVsc2Uge1xuICAgIC8vIFkzID0gQSAqIEcgKiAoRCAtIEMpXG4gICAgbnkgPSBhLnJlZE11bChnKS5yZWRNdWwoZC5yZWRTdWIoYykpO1xuICAgIC8vIFozID0gYyAqIEYgKiBHXG4gICAgbnogPSB0aGlzLmN1cnZlLl9tdWxDKGYpLnJlZE11bChnKTtcbiAgfVxuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnksIG56KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQocCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHA7XG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICBpZiAodGhpcy5jdXJ2ZS5leHRlbmRlZClcbiAgICByZXR1cm4gdGhpcy5fZXh0QWRkKHApO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuX3Byb2pBZGQocCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsKGspIHtcbiAgaWYgKHRoaXMuX2hhc0RvdWJsZXMoaykpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2ZpeGVkTmFmTXVsKHRoaXMsIGspO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWwodGhpcywgayk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsQWRkID0gZnVuY3Rpb24gbXVsQWRkKGsxLCBwLCBrMikge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLCBbIHRoaXMsIHAgXSwgWyBrMSwgazIgXSwgMiwgZmFsc2UpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmptdWxBZGQgPSBmdW5jdGlvbiBqbXVsQWRkKGsxLCBwLCBrMikge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLCBbIHRoaXMsIHAgXSwgWyBrMSwgazIgXSwgMiwgdHJ1ZSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKCkge1xuICBpZiAodGhpcy56T25lKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIE5vcm1hbGl6ZSBjb29yZGluYXRlc1xuICB2YXIgemkgPSB0aGlzLnoucmVkSW52bSgpO1xuICB0aGlzLnggPSB0aGlzLngucmVkTXVsKHppKTtcbiAgdGhpcy55ID0gdGhpcy55LnJlZE11bCh6aSk7XG4gIGlmICh0aGlzLnQpXG4gICAgdGhpcy50ID0gdGhpcy50LnJlZE11bCh6aSk7XG4gIHRoaXMueiA9IHRoaXMuY3VydmUub25lO1xuICB0aGlzLnpPbmUgPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn07XG5cblBvaW50LnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcoKSB7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KHRoaXMueC5yZWROZWcoKSxcbiAgICB0aGlzLnksXG4gICAgdGhpcy56LFxuICAgIHRoaXMudCAmJiB0aGlzLnQucmVkTmVnKCkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbiBnZXRYKCkge1xuICB0aGlzLm5vcm1hbGl6ZSgpO1xuICByZXR1cm4gdGhpcy54LmZyb21SZWQoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRZID0gZnVuY3Rpb24gZ2V0WSgpIHtcbiAgdGhpcy5ub3JtYWxpemUoKTtcbiAgcmV0dXJuIHRoaXMueS5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShvdGhlcikge1xuICByZXR1cm4gdGhpcyA9PT0gb3RoZXIgfHxcbiAgICAgICAgIHRoaXMuZ2V0WCgpLmNtcChvdGhlci5nZXRYKCkpID09PSAwICYmXG4gICAgICAgICB0aGlzLmdldFkoKS5jbXAob3RoZXIuZ2V0WSgpKSA9PT0gMDtcbn07XG5cblBvaW50LnByb3RvdHlwZS5lcVhUb1AgPSBmdW5jdGlvbiBlcVhUb1AoeCkge1xuICB2YXIgcnggPSB4LnRvUmVkKHRoaXMuY3VydmUucmVkKS5yZWRNdWwodGhpcy56KTtcbiAgaWYgKHRoaXMueC5jbXAocngpID09PSAwKVxuICAgIHJldHVybiB0cnVlO1xuXG4gIHZhciB4YyA9IHguY2xvbmUoKTtcbiAgdmFyIHQgPSB0aGlzLmN1cnZlLnJlZE4ucmVkTXVsKHRoaXMueik7XG4gIGZvciAoOzspIHtcbiAgICB4Yy5pYWRkKHRoaXMuY3VydmUubik7XG4gICAgaWYgKHhjLmNtcCh0aGlzLmN1cnZlLnApID49IDApXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICByeC5yZWRJQWRkKHQpO1xuICAgIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG4vLyBDb21wYXRpYmlsaXR5IHdpdGggQmFzZUN1cnZlXG5Qb2ludC5wcm90b3R5cGUudG9QID0gUG9pbnQucHJvdG90eXBlLm5vcm1hbGl6ZTtcblBvaW50LnByb3RvdHlwZS5taXhlZEFkZCA9IFBvaW50LnByb3RvdHlwZS5hZGQ7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGN1cnZlID0gZXhwb3J0cztcblxuY3VydmUuYmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xuY3VydmUuc2hvcnQgPSByZXF1aXJlKCcuL3Nob3J0Jyk7XG5jdXJ2ZS5tb250ID0gcmVxdWlyZSgnLi9tb250Jyk7XG5jdXJ2ZS5lZHdhcmRzID0gcmVxdWlyZSgnLi9lZHdhcmRzJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuaW5oZXJpdHMgPSBpbmhlcml0cztcblxuZnVuY3Rpb24gaXNTdXJyb2dhdGVQYWlyKG1zZywgaSkge1xuICBpZiAoKG1zZy5jaGFyQ29kZUF0KGkpICYgMHhGQzAwKSAhPT0gMHhEODAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChpIDwgMCB8fCBpICsgMSA+PSBtc2cubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAobXNnLmNoYXJDb2RlQXQoaSArIDEpICYgMHhGQzAwKSA9PT0gMHhEQzAwO1xufVxuXG5mdW5jdGlvbiB0b0FycmF5KG1zZywgZW5jKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG1zZykpXG4gICAgcmV0dXJuIG1zZy5zbGljZSgpO1xuICBpZiAoIW1zZylcbiAgICByZXR1cm4gW107XG4gIHZhciByZXMgPSBbXTtcbiAgaWYgKHR5cGVvZiBtc2cgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFlbmMpIHtcbiAgICAgIC8vIEluc3BpcmVkIGJ5IHN0cmluZ1RvVXRmOEJ5dGVBcnJheSgpIGluIGNsb3N1cmUtbGlicmFyeSBieSBHb29nbGVcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1saWJyYXJ5L2Jsb2IvODU5OGQ4NzI0MmFmNTlhYWMyMzMyNzA3NDJjODk4NGUyYjJiZGJlMC9jbG9zdXJlL2dvb2cvY3J5cHQvY3J5cHQuanMjTDExNy1MMTQzXG4gICAgICAvLyBBcGFjaGUgTGljZW5zZSAyLjBcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1saWJyYXJ5L2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAgICAgIHZhciBwID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjID0gbXNnLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjIDwgMTI4KSB7XG4gICAgICAgICAgcmVzW3ArK10gPSBjO1xuICAgICAgICB9IGVsc2UgaWYgKGMgPCAyMDQ4KSB7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyA+PiA2KSB8IDE5MjtcbiAgICAgICAgICByZXNbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xuICAgICAgICB9IGVsc2UgaWYgKGlzU3Vycm9nYXRlUGFpcihtc2csIGkpKSB7XG4gICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgJiAweDAzRkYpIDw8IDEwKSArIChtc2cuY2hhckNvZGVBdCgrK2kpICYgMHgwM0ZGKTtcbiAgICAgICAgICByZXNbcCsrXSA9IChjID4+IDE4KSB8IDI0MDtcbiAgICAgICAgICByZXNbcCsrXSA9ICgoYyA+PiAxMikgJiA2MykgfCAxMjg7XG4gICAgICAgICAgcmVzW3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyAmIDYzKSB8IDEyODtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNbcCsrXSA9IChjID4+IDEyKSB8IDIyNDtcbiAgICAgICAgICByZXNbcCsrXSA9ICgoYyA+PiA2KSAmIDYzKSB8IDEyODtcbiAgICAgICAgICByZXNbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbmMgPT09ICdoZXgnKSB7XG4gICAgICBtc2cgPSBtc2cucmVwbGFjZSgvW15hLXowLTldKy9pZywgJycpO1xuICAgICAgaWYgKG1zZy5sZW5ndGggJSAyICE9PSAwKVxuICAgICAgICBtc2cgPSAnMCcgKyBtc2c7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICByZXMucHVzaChwYXJzZUludChtc2dbaV0gKyBtc2dbaSArIDFdLCAxNikpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgICAgcmVzW2ldID0gbXNnW2ldIHwgMDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy50b0FycmF5ID0gdG9BcnJheTtcblxuZnVuY3Rpb24gdG9IZXgobXNnKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgcmVzICs9IHplcm8yKG1zZ1tpXS50b1N0cmluZygxNikpO1xuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy50b0hleCA9IHRvSGV4O1xuXG5mdW5jdGlvbiBodG9ubCh3KSB7XG4gIHZhciByZXMgPSAodyA+Pj4gMjQpIHxcbiAgICAgICAgICAgICgodyA+Pj4gOCkgJiAweGZmMDApIHxcbiAgICAgICAgICAgICgodyA8PCA4KSAmIDB4ZmYwMDAwKSB8XG4gICAgICAgICAgICAoKHcgJiAweGZmKSA8PCAyNCk7XG4gIHJldHVybiByZXMgPj4+IDA7XG59XG5leHBvcnRzLmh0b25sID0gaHRvbmw7XG5cbmZ1bmN0aW9uIHRvSGV4MzIobXNnLCBlbmRpYW4pIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB3ID0gbXNnW2ldO1xuICAgIGlmIChlbmRpYW4gPT09ICdsaXR0bGUnKVxuICAgICAgdyA9IGh0b25sKHcpO1xuICAgIHJlcyArPSB6ZXJvOCh3LnRvU3RyaW5nKDE2KSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudG9IZXgzMiA9IHRvSGV4MzI7XG5cbmZ1bmN0aW9uIHplcm8yKHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG5leHBvcnRzLnplcm8yID0gemVybzI7XG5cbmZ1bmN0aW9uIHplcm84KHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSA3KVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNilcbiAgICByZXR1cm4gJzAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA1KVxuICAgIHJldHVybiAnMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA0KVxuICAgIHJldHVybiAnMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMylcbiAgICByZXR1cm4gJzAwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAyKVxuICAgIHJldHVybiAnMDAwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMDAwMDAwMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG5leHBvcnRzLnplcm84ID0gemVybzg7XG5cbmZ1bmN0aW9uIGpvaW4zMihtc2csIHN0YXJ0LCBlbmQsIGVuZGlhbikge1xuICB2YXIgbGVuID0gZW5kIC0gc3RhcnQ7XG4gIGFzc2VydChsZW4gJSA0ID09PSAwKTtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheShsZW4gLyA0KTtcbiAgZm9yICh2YXIgaSA9IDAsIGsgPSBzdGFydDsgaSA8IHJlcy5sZW5ndGg7IGkrKywgayArPSA0KSB7XG4gICAgdmFyIHc7XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2JpZycpXG4gICAgICB3ID0gKG1zZ1trXSA8PCAyNCkgfCAobXNnW2sgKyAxXSA8PCAxNikgfCAobXNnW2sgKyAyXSA8PCA4KSB8IG1zZ1trICsgM107XG4gICAgZWxzZVxuICAgICAgdyA9IChtc2dbayArIDNdIDw8IDI0KSB8IChtc2dbayArIDJdIDw8IDE2KSB8IChtc2dbayArIDFdIDw8IDgpIHwgbXNnW2tdO1xuICAgIHJlc1tpXSA9IHcgPj4+IDA7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMuam9pbjMyID0gam9pbjMyO1xuXG5mdW5jdGlvbiBzcGxpdDMyKG1zZywgZW5kaWFuKSB7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkobXNnLmxlbmd0aCAqIDQpO1xuICBmb3IgKHZhciBpID0gMCwgayA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyssIGsgKz0gNCkge1xuICAgIHZhciBtID0gbXNnW2ldO1xuICAgIGlmIChlbmRpYW4gPT09ICdiaWcnKSB7XG4gICAgICByZXNba10gPSBtID4+PiAyNDtcbiAgICAgIHJlc1trICsgMV0gPSAobSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgIHJlc1trICsgMl0gPSAobSA+Pj4gOCkgJiAweGZmO1xuICAgICAgcmVzW2sgKyAzXSA9IG0gJiAweGZmO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNbayArIDNdID0gbSA+Pj4gMjQ7XG4gICAgICByZXNbayArIDJdID0gKG0gPj4+IDE2KSAmIDB4ZmY7XG4gICAgICByZXNbayArIDFdID0gKG0gPj4+IDgpICYgMHhmZjtcbiAgICAgIHJlc1trXSA9IG0gJiAweGZmO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy5zcGxpdDMyID0gc3BsaXQzMjtcblxuZnVuY3Rpb24gcm90cjMyKHcsIGIpIHtcbiAgcmV0dXJuICh3ID4+PiBiKSB8ICh3IDw8ICgzMiAtIGIpKTtcbn1cbmV4cG9ydHMucm90cjMyID0gcm90cjMyO1xuXG5mdW5jdGlvbiByb3RsMzIodywgYikge1xuICByZXR1cm4gKHcgPDwgYikgfCAodyA+Pj4gKDMyIC0gYikpO1xufVxuZXhwb3J0cy5yb3RsMzIgPSByb3RsMzI7XG5cbmZ1bmN0aW9uIHN1bTMyKGEsIGIpIHtcbiAgcmV0dXJuIChhICsgYikgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyID0gc3VtMzI7XG5cbmZ1bmN0aW9uIHN1bTMyXzMoYSwgYiwgYykge1xuICByZXR1cm4gKGEgKyBiICsgYykgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyXzMgPSBzdW0zMl8zO1xuXG5mdW5jdGlvbiBzdW0zMl80KGEsIGIsIGMsIGQpIHtcbiAgcmV0dXJuIChhICsgYiArIGMgKyBkKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzJfNCA9IHN1bTMyXzQ7XG5cbmZ1bmN0aW9uIHN1bTMyXzUoYSwgYiwgYywgZCwgZSkge1xuICByZXR1cm4gKGEgKyBiICsgYyArIGQgKyBlKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzJfNSA9IHN1bTMyXzU7XG5cbmZ1bmN0aW9uIHN1bTY0KGJ1ZiwgcG9zLCBhaCwgYWwpIHtcbiAgdmFyIGJoID0gYnVmW3Bvc107XG4gIHZhciBibCA9IGJ1Zltwb3MgKyAxXTtcblxuICB2YXIgbG8gPSAoYWwgKyBibCkgPj4+IDA7XG4gIHZhciBoaSA9IChsbyA8IGFsID8gMSA6IDApICsgYWggKyBiaDtcbiAgYnVmW3Bvc10gPSBoaSA+Pj4gMDtcbiAgYnVmW3BvcyArIDFdID0gbG87XG59XG5leHBvcnRzLnN1bTY0ID0gc3VtNjQ7XG5cbmZ1bmN0aW9uIHN1bTY0X2hpKGFoLCBhbCwgYmgsIGJsKSB7XG4gIHZhciBsbyA9IChhbCArIGJsKSA+Pj4gMDtcbiAgdmFyIGhpID0gKGxvIDwgYWwgPyAxIDogMCkgKyBhaCArIGJoO1xuICByZXR1cm4gaGkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0X2hpID0gc3VtNjRfaGk7XG5cbmZ1bmN0aW9uIHN1bTY0X2xvKGFoLCBhbCwgYmgsIGJsKSB7XG4gIHZhciBsbyA9IGFsICsgYmw7XG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfbG8gPSBzdW02NF9sbztcblxuZnVuY3Rpb24gc3VtNjRfNF9oaShhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgdmFyIGxvID0gYWw7XG4gIGxvID0gKGxvICsgYmwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGFsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgY2wpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGNsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZGwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGRsID8gMSA6IDA7XG5cbiAgdmFyIGhpID0gYWggKyBiaCArIGNoICsgZGggKyBjYXJyeTtcbiAgcmV0dXJuIGhpID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF80X2hpID0gc3VtNjRfNF9oaTtcblxuZnVuY3Rpb24gc3VtNjRfNF9sbyhhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwpIHtcbiAgdmFyIGxvID0gYWwgKyBibCArIGNsICsgZGw7XG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfNF9sbyA9IHN1bTY0XzRfbG87XG5cbmZ1bmN0aW9uIHN1bTY0XzVfaGkoYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsLCBlaCwgZWwpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgdmFyIGxvID0gYWw7XG4gIGxvID0gKGxvICsgYmwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGFsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgY2wpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGNsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZGwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGRsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZWwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGVsID8gMSA6IDA7XG5cbiAgdmFyIGhpID0gYWggKyBiaCArIGNoICsgZGggKyBlaCArIGNhcnJ5O1xuICByZXR1cm4gaGkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0XzVfaGkgPSBzdW02NF81X2hpO1xuXG5mdW5jdGlvbiBzdW02NF81X2xvKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCwgZWgsIGVsKSB7XG4gIHZhciBsbyA9IGFsICsgYmwgKyBjbCArIGRsICsgZWw7XG5cbiAgcmV0dXJuIGxvID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF81X2xvID0gc3VtNjRfNV9sbztcblxuZnVuY3Rpb24gcm90cjY0X2hpKGFoLCBhbCwgbnVtKSB7XG4gIHZhciByID0gKGFsIDw8ICgzMiAtIG51bSkpIHwgKGFoID4+PiBudW0pO1xuICByZXR1cm4gciA+Pj4gMDtcbn1cbmV4cG9ydHMucm90cjY0X2hpID0gcm90cjY0X2hpO1xuXG5mdW5jdGlvbiByb3RyNjRfbG8oYWgsIGFsLCBudW0pIHtcbiAgdmFyIHIgPSAoYWggPDwgKDMyIC0gbnVtKSkgfCAoYWwgPj4+IG51bSk7XG4gIHJldHVybiByID4+PiAwO1xufVxuZXhwb3J0cy5yb3RyNjRfbG8gPSByb3RyNjRfbG87XG5cbmZ1bmN0aW9uIHNocjY0X2hpKGFoLCBhbCwgbnVtKSB7XG4gIHJldHVybiBhaCA+Pj4gbnVtO1xufVxuZXhwb3J0cy5zaHI2NF9oaSA9IHNocjY0X2hpO1xuXG5mdW5jdGlvbiBzaHI2NF9sbyhhaCwgYWwsIG51bSkge1xuICB2YXIgciA9IChhaCA8PCAoMzIgLSBudW0pKSB8IChhbCA+Pj4gbnVtKTtcbiAgcmV0dXJuIHIgPj4+IDA7XG59XG5leHBvcnRzLnNocjY0X2xvID0gc2hyNjRfbG87XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuZnVuY3Rpb24gQmxvY2tIYXNoKCkge1xuICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuICB0aGlzLnBlbmRpbmdUb3RhbCA9IDA7XG4gIHRoaXMuYmxvY2tTaXplID0gdGhpcy5jb25zdHJ1Y3Rvci5ibG9ja1NpemU7XG4gIHRoaXMub3V0U2l6ZSA9IHRoaXMuY29uc3RydWN0b3Iub3V0U2l6ZTtcbiAgdGhpcy5obWFjU3RyZW5ndGggPSB0aGlzLmNvbnN0cnVjdG9yLmhtYWNTdHJlbmd0aDtcbiAgdGhpcy5wYWRMZW5ndGggPSB0aGlzLmNvbnN0cnVjdG9yLnBhZExlbmd0aCAvIDg7XG4gIHRoaXMuZW5kaWFuID0gJ2JpZyc7XG5cbiAgdGhpcy5fZGVsdGE4ID0gdGhpcy5ibG9ja1NpemUgLyA4O1xuICB0aGlzLl9kZWx0YTMyID0gdGhpcy5ibG9ja1NpemUgLyAzMjtcbn1cbmV4cG9ydHMuQmxvY2tIYXNoID0gQmxvY2tIYXNoO1xuXG5CbG9ja0hhc2gucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIGVuYykge1xuICAvLyBDb252ZXJ0IG1lc3NhZ2UgdG8gYXJyYXksIHBhZCBpdCwgYW5kIGpvaW4gaW50byAzMmJpdCBibG9ja3NcbiAgbXNnID0gdXRpbHMudG9BcnJheShtc2csIGVuYyk7XG4gIGlmICghdGhpcy5wZW5kaW5nKVxuICAgIHRoaXMucGVuZGluZyA9IG1zZztcbiAgZWxzZVxuICAgIHRoaXMucGVuZGluZyA9IHRoaXMucGVuZGluZy5jb25jYXQobXNnKTtcbiAgdGhpcy5wZW5kaW5nVG90YWwgKz0gbXNnLmxlbmd0aDtcblxuICAvLyBFbm91Z2ggZGF0YSwgdHJ5IHVwZGF0aW5nXG4gIGlmICh0aGlzLnBlbmRpbmcubGVuZ3RoID49IHRoaXMuX2RlbHRhOCkge1xuICAgIG1zZyA9IHRoaXMucGVuZGluZztcblxuICAgIC8vIFByb2Nlc3MgcGVuZGluZyBkYXRhIGluIGJsb2Nrc1xuICAgIHZhciByID0gbXNnLmxlbmd0aCAlIHRoaXMuX2RlbHRhODtcbiAgICB0aGlzLnBlbmRpbmcgPSBtc2cuc2xpY2UobXNnLmxlbmd0aCAtIHIsIG1zZy5sZW5ndGgpO1xuICAgIGlmICh0aGlzLnBlbmRpbmcubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcblxuICAgIG1zZyA9IHV0aWxzLmpvaW4zMihtc2csIDAsIG1zZy5sZW5ndGggLSByLCB0aGlzLmVuZGlhbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpICs9IHRoaXMuX2RlbHRhMzIpXG4gICAgICB0aGlzLl91cGRhdGUobXNnLCBpLCBpICsgdGhpcy5fZGVsdGEzMik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkJsb2NrSGFzaC5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICB0aGlzLnVwZGF0ZSh0aGlzLl9wYWQoKSk7XG4gIGFzc2VydCh0aGlzLnBlbmRpbmcgPT09IG51bGwpO1xuXG4gIHJldHVybiB0aGlzLl9kaWdlc3QoZW5jKTtcbn07XG5cbkJsb2NrSGFzaC5wcm90b3R5cGUuX3BhZCA9IGZ1bmN0aW9uIHBhZCgpIHtcbiAgdmFyIGxlbiA9IHRoaXMucGVuZGluZ1RvdGFsO1xuICB2YXIgYnl0ZXMgPSB0aGlzLl9kZWx0YTg7XG4gIHZhciBrID0gYnl0ZXMgLSAoKGxlbiArIHRoaXMucGFkTGVuZ3RoKSAlIGJ5dGVzKTtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheShrICsgdGhpcy5wYWRMZW5ndGgpO1xuICByZXNbMF0gPSAweDgwO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGs7IGkrKylcbiAgICByZXNbaV0gPSAwO1xuXG4gIC8vIEFwcGVuZCBsZW5ndGhcbiAgbGVuIDw8PSAzO1xuICBpZiAodGhpcy5lbmRpYW4gPT09ICdiaWcnKSB7XG4gICAgZm9yICh2YXIgdCA9IDg7IHQgPCB0aGlzLnBhZExlbmd0aDsgdCsrKVxuICAgICAgcmVzW2krK10gPSAwO1xuXG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMjQpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDE2KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiA4KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSBsZW4gJiAweGZmO1xuICB9IGVsc2Uge1xuICAgIHJlc1tpKytdID0gbGVuICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDgpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDE2KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAyNCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcblxuICAgIGZvciAodCA9IDg7IHQgPCB0aGlzLnBhZExlbmd0aDsgdCsrKVxuICAgICAgcmVzW2krK10gPSAwO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciByb3RyMzIgPSB1dGlscy5yb3RyMzI7XG5cbmZ1bmN0aW9uIGZ0XzEocywgeCwgeSwgeikge1xuICBpZiAocyA9PT0gMClcbiAgICByZXR1cm4gY2gzMih4LCB5LCB6KTtcbiAgaWYgKHMgPT09IDEgfHwgcyA9PT0gMylcbiAgICByZXR1cm4gcDMyKHgsIHksIHopO1xuICBpZiAocyA9PT0gMilcbiAgICByZXR1cm4gbWFqMzIoeCwgeSwgeik7XG59XG5leHBvcnRzLmZ0XzEgPSBmdF8xO1xuXG5mdW5jdGlvbiBjaDMyKHgsIHksIHopIHtcbiAgcmV0dXJuICh4ICYgeSkgXiAoKH54KSAmIHopO1xufVxuZXhwb3J0cy5jaDMyID0gY2gzMjtcblxuZnVuY3Rpb24gbWFqMzIoeCwgeSwgeikge1xuICByZXR1cm4gKHggJiB5KSBeICh4ICYgeikgXiAoeSAmIHopO1xufVxuZXhwb3J0cy5tYWozMiA9IG1hajMyO1xuXG5mdW5jdGlvbiBwMzIoeCwgeSwgeikge1xuICByZXR1cm4geCBeIHkgXiB6O1xufVxuZXhwb3J0cy5wMzIgPSBwMzI7XG5cbmZ1bmN0aW9uIHMwXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgMikgXiByb3RyMzIoeCwgMTMpIF4gcm90cjMyKHgsIDIyKTtcbn1cbmV4cG9ydHMuczBfMjU2ID0gczBfMjU2O1xuXG5mdW5jdGlvbiBzMV8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDYpIF4gcm90cjMyKHgsIDExKSBeIHJvdHIzMih4LCAyNSk7XG59XG5leHBvcnRzLnMxXzI1NiA9IHMxXzI1NjtcblxuZnVuY3Rpb24gZzBfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCA3KSBeIHJvdHIzMih4LCAxOCkgXiAoeCA+Pj4gMyk7XG59XG5leHBvcnRzLmcwXzI1NiA9IGcwXzI1NjtcblxuZnVuY3Rpb24gZzFfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCAxNykgXiByb3RyMzIoeCwgMTkpIF4gKHggPj4+IDEwKTtcbn1cbmV4cG9ydHMuZzFfMjU2ID0gZzFfMjU2O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgc2hhQ29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxudmFyIHJvdGwzMiA9IHV0aWxzLnJvdGwzMjtcbnZhciBzdW0zMiA9IHV0aWxzLnN1bTMyO1xudmFyIHN1bTMyXzUgPSB1dGlscy5zdW0zMl81O1xudmFyIGZ0XzEgPSBzaGFDb21tb24uZnRfMTtcbnZhciBCbG9ja0hhc2ggPSBjb21tb24uQmxvY2tIYXNoO1xuXG52YXIgc2hhMV9LID0gW1xuICAweDVBODI3OTk5LCAweDZFRDlFQkExLFxuICAweDhGMUJCQ0RDLCAweENBNjJDMUQ2XG5dO1xuXG5mdW5jdGlvbiBTSEExKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBMSkpXG4gICAgcmV0dXJuIG5ldyBTSEExKCk7XG5cbiAgQmxvY2tIYXNoLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweDY3NDUyMzAxLCAweGVmY2RhYjg5LCAweDk4YmFkY2ZlLFxuICAgIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjAgXTtcbiAgdGhpcy5XID0gbmV3IEFycmF5KDgwKTtcbn1cblxudXRpbHMuaW5oZXJpdHMoU0hBMSwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMTtcblxuU0hBMS5ibG9ja1NpemUgPSA1MTI7XG5TSEExLm91dFNpemUgPSAxNjA7XG5TSEExLmhtYWNTdHJlbmd0aCA9IDgwO1xuU0hBMS5wYWRMZW5ndGggPSA2NDtcblxuU0hBMS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIF91cGRhdGUobXNnLCBzdGFydCkge1xuICB2YXIgVyA9IHRoaXMuVztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspXG4gICAgV1tpXSA9IG1zZ1tzdGFydCArIGldO1xuXG4gIGZvcig7IGkgPCBXLmxlbmd0aDsgaSsrKVxuICAgIFdbaV0gPSByb3RsMzIoV1tpIC0gM10gXiBXW2kgLSA4XSBeIFdbaSAtIDE0XSBeIFdbaSAtIDE2XSwgMSk7XG5cbiAgdmFyIGEgPSB0aGlzLmhbMF07XG4gIHZhciBiID0gdGhpcy5oWzFdO1xuICB2YXIgYyA9IHRoaXMuaFsyXTtcbiAgdmFyIGQgPSB0aGlzLmhbM107XG4gIHZhciBlID0gdGhpcy5oWzRdO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBXLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHMgPSB+fihpIC8gMjApO1xuICAgIHZhciB0ID0gc3VtMzJfNShyb3RsMzIoYSwgNSksIGZ0XzEocywgYiwgYywgZCksIGUsIFdbaV0sIHNoYTFfS1tzXSk7XG4gICAgZSA9IGQ7XG4gICAgZCA9IGM7XG4gICAgYyA9IHJvdGwzMihiLCAzMCk7XG4gICAgYiA9IGE7XG4gICAgYSA9IHQ7XG4gIH1cblxuICB0aGlzLmhbMF0gPSBzdW0zMih0aGlzLmhbMF0sIGEpO1xuICB0aGlzLmhbMV0gPSBzdW0zMih0aGlzLmhbMV0sIGIpO1xuICB0aGlzLmhbMl0gPSBzdW0zMih0aGlzLmhbMl0sIGMpO1xuICB0aGlzLmhbM10gPSBzdW0zMih0aGlzLmhbM10sIGQpO1xuICB0aGlzLmhbNF0gPSBzdW0zMih0aGlzLmhbNF0sIGUpO1xufTtcblxuU0hBMS5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdiaWcnKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBzaGFDb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxudmFyIHN1bTMyID0gdXRpbHMuc3VtMzI7XG52YXIgc3VtMzJfNCA9IHV0aWxzLnN1bTMyXzQ7XG52YXIgc3VtMzJfNSA9IHV0aWxzLnN1bTMyXzU7XG52YXIgY2gzMiA9IHNoYUNvbW1vbi5jaDMyO1xudmFyIG1hajMyID0gc2hhQ29tbW9uLm1hajMyO1xudmFyIHMwXzI1NiA9IHNoYUNvbW1vbi5zMF8yNTY7XG52YXIgczFfMjU2ID0gc2hhQ29tbW9uLnMxXzI1NjtcbnZhciBnMF8yNTYgPSBzaGFDb21tb24uZzBfMjU2O1xudmFyIGcxXzI1NiA9IHNoYUNvbW1vbi5nMV8yNTY7XG5cbnZhciBCbG9ja0hhc2ggPSBjb21tb24uQmxvY2tIYXNoO1xuXG52YXIgc2hhMjU2X0sgPSBbXG4gIDB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsXG4gIDB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsIDB4OTIzZjgyYTQsIDB4YWIxYzVlZDUsXG4gIDB4ZDgwN2FhOTgsIDB4MTI4MzViMDEsIDB4MjQzMTg1YmUsIDB4NTUwYzdkYzMsXG4gIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsXG4gIDB4ZTQ5YjY5YzEsIDB4ZWZiZTQ3ODYsIDB4MGZjMTlkYzYsIDB4MjQwY2ExY2MsXG4gIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsXG4gIDB4OTgzZTUxNTIsIDB4YTgzMWM2NmQsIDB4YjAwMzI3YzgsIDB4YmY1OTdmYzcsXG4gIDB4YzZlMDBiZjMsIDB4ZDVhNzkxNDcsIDB4MDZjYTYzNTEsIDB4MTQyOTI5NjcsXG4gIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsXG4gIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsXG4gIDB4YTJiZmU4YTEsIDB4YTgxYTY2NGIsIDB4YzI0YjhiNzAsIDB4Yzc2YzUxYTMsXG4gIDB4ZDE5MmU4MTksIDB4ZDY5OTA2MjQsIDB4ZjQwZTM1ODUsIDB4MTA2YWEwNzAsXG4gIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsXG4gIDB4MzkxYzBjYjMsIDB4NGVkOGFhNGEsIDB4NWI5Y2NhNGYsIDB4NjgyZTZmZjMsXG4gIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsXG4gIDB4OTBiZWZmZmEsIDB4YTQ1MDZjZWIsIDB4YmVmOWEzZjcsIDB4YzY3MTc4ZjJcbl07XG5cbmZ1bmN0aW9uIFNIQTI1NigpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTI1NikpXG4gICAgcmV0dXJuIG5ldyBTSEEyNTYoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4NmEwOWU2NjcsIDB4YmI2N2FlODUsIDB4M2M2ZWYzNzIsIDB4YTU0ZmY1M2EsXG4gICAgMHg1MTBlNTI3ZiwgMHg5YjA1Njg4YywgMHgxZjgzZDlhYiwgMHg1YmUwY2QxOVxuICBdO1xuICB0aGlzLmsgPSBzaGEyNTZfSztcbiAgdGhpcy5XID0gbmV3IEFycmF5KDY0KTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTI1NiwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMjU2O1xuXG5TSEEyNTYuYmxvY2tTaXplID0gNTEyO1xuU0hBMjU2Lm91dFNpemUgPSAyNTY7XG5TSEEyNTYuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBMjU2LnBhZExlbmd0aCA9IDY0O1xuXG5TSEEyNTYucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcbiAgZm9yICg7IGkgPCBXLmxlbmd0aDsgaSsrKVxuICAgIFdbaV0gPSBzdW0zMl80KGcxXzI1NihXW2kgLSAyXSksIFdbaSAtIDddLCBnMF8yNTYoV1tpIC0gMTVdKSwgV1tpIC0gMTZdKTtcblxuICB2YXIgYSA9IHRoaXMuaFswXTtcbiAgdmFyIGIgPSB0aGlzLmhbMV07XG4gIHZhciBjID0gdGhpcy5oWzJdO1xuICB2YXIgZCA9IHRoaXMuaFszXTtcbiAgdmFyIGUgPSB0aGlzLmhbNF07XG4gIHZhciBmID0gdGhpcy5oWzVdO1xuICB2YXIgZyA9IHRoaXMuaFs2XTtcbiAgdmFyIGggPSB0aGlzLmhbN107XG5cbiAgYXNzZXJ0KHRoaXMuay5sZW5ndGggPT09IFcubGVuZ3RoKTtcbiAgZm9yIChpID0gMDsgaSA8IFcubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgVDEgPSBzdW0zMl81KGgsIHMxXzI1NihlKSwgY2gzMihlLCBmLCBnKSwgdGhpcy5rW2ldLCBXW2ldKTtcbiAgICB2YXIgVDIgPSBzdW0zMihzMF8yNTYoYSksIG1hajMyKGEsIGIsIGMpKTtcbiAgICBoID0gZztcbiAgICBnID0gZjtcbiAgICBmID0gZTtcbiAgICBlID0gc3VtMzIoZCwgVDEpO1xuICAgIGQgPSBjO1xuICAgIGMgPSBiO1xuICAgIGIgPSBhO1xuICAgIGEgPSBzdW0zMihUMSwgVDIpO1xuICB9XG5cbiAgdGhpcy5oWzBdID0gc3VtMzIodGhpcy5oWzBdLCBhKTtcbiAgdGhpcy5oWzFdID0gc3VtMzIodGhpcy5oWzFdLCBiKTtcbiAgdGhpcy5oWzJdID0gc3VtMzIodGhpcy5oWzJdLCBjKTtcbiAgdGhpcy5oWzNdID0gc3VtMzIodGhpcy5oWzNdLCBkKTtcbiAgdGhpcy5oWzRdID0gc3VtMzIodGhpcy5oWzRdLCBlKTtcbiAgdGhpcy5oWzVdID0gc3VtMzIodGhpcy5oWzVdLCBmKTtcbiAgdGhpcy5oWzZdID0gc3VtMzIodGhpcy5oWzZdLCBnKTtcbiAgdGhpcy5oWzddID0gc3VtMzIodGhpcy5oWzddLCBoKTtcbn07XG5cblNIQTI1Ni5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdiaWcnKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBTSEEyNTYgPSByZXF1aXJlKCcuLzI1NicpO1xuXG5mdW5jdGlvbiBTSEEyMjQoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEyMjQpKVxuICAgIHJldHVybiBuZXcgU0hBMjI0KCk7XG5cbiAgU0hBMjU2LmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweGMxMDU5ZWQ4LCAweDM2N2NkNTA3LCAweDMwNzBkZDE3LCAweGY3MGU1OTM5LFxuICAgIDB4ZmZjMDBiMzEsIDB4Njg1ODE1MTEsIDB4NjRmOThmYTcsIDB4YmVmYTRmYTQgXTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTIyNCwgU0hBMjU2KTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMjI0O1xuXG5TSEEyMjQuYmxvY2tTaXplID0gNTEyO1xuU0hBMjI0Lm91dFNpemUgPSAyMjQ7XG5TSEEyMjQuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBMjI0LnBhZExlbmd0aCA9IDY0O1xuXG5TSEEyMjQucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIC8vIEp1c3QgdHJ1bmNhdGUgb3V0cHV0XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaC5zbGljZSgwLCA3KSwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsIDcpLCAnYmlnJyk7XG59O1xuXG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbnZhciByb3RyNjRfaGkgPSB1dGlscy5yb3RyNjRfaGk7XG52YXIgcm90cjY0X2xvID0gdXRpbHMucm90cjY0X2xvO1xudmFyIHNocjY0X2hpID0gdXRpbHMuc2hyNjRfaGk7XG52YXIgc2hyNjRfbG8gPSB1dGlscy5zaHI2NF9sbztcbnZhciBzdW02NCA9IHV0aWxzLnN1bTY0O1xudmFyIHN1bTY0X2hpID0gdXRpbHMuc3VtNjRfaGk7XG52YXIgc3VtNjRfbG8gPSB1dGlscy5zdW02NF9sbztcbnZhciBzdW02NF80X2hpID0gdXRpbHMuc3VtNjRfNF9oaTtcbnZhciBzdW02NF80X2xvID0gdXRpbHMuc3VtNjRfNF9sbztcbnZhciBzdW02NF81X2hpID0gdXRpbHMuc3VtNjRfNV9oaTtcbnZhciBzdW02NF81X2xvID0gdXRpbHMuc3VtNjRfNV9sbztcblxudmFyIEJsb2NrSGFzaCA9IGNvbW1vbi5CbG9ja0hhc2g7XG5cbnZhciBzaGE1MTJfSyA9IFtcbiAgMHg0MjhhMmY5OCwgMHhkNzI4YWUyMiwgMHg3MTM3NDQ5MSwgMHgyM2VmNjVjZCxcbiAgMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiwgMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyxcbiAgMHgzOTU2YzI1YiwgMHhmMzQ4YjUzOCwgMHg1OWYxMTFmMSwgMHhiNjA1ZDAxOSxcbiAgMHg5MjNmODJhNCwgMHhhZjE5NGY5YiwgMHhhYjFjNWVkNSwgMHhkYTZkODExOCxcbiAgMHhkODA3YWE5OCwgMHhhMzAzMDI0MiwgMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSxcbiAgMHgyNDMxODViZSwgMHg0ZWU0YjI4YywgMHg1NTBjN2RjMywgMHhkNWZmYjRlMixcbiAgMHg3MmJlNWQ3NCwgMHhmMjdiODk2ZiwgMHg4MGRlYjFmZSwgMHgzYjE2OTZiMSxcbiAgMHg5YmRjMDZhNywgMHgyNWM3MTIzNSwgMHhjMTliZjE3NCwgMHhjZjY5MjY5NCxcbiAgMHhlNDliNjljMSwgMHg5ZWYxNGFkMiwgMHhlZmJlNDc4NiwgMHgzODRmMjVlMyxcbiAgMHgwZmMxOWRjNiwgMHg4YjhjZDViNSwgMHgyNDBjYTFjYywgMHg3N2FjOWM2NSxcbiAgMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSwgMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyxcbiAgMHg1Y2IwYTlkYywgMHhiZDQxZmJkNCwgMHg3NmY5ODhkYSwgMHg4MzExNTNiNSxcbiAgMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiwgMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCxcbiAgMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiwgMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCxcbiAgMHhjNmUwMGJmMywgMHgzZGE4OGZjMiwgMHhkNWE3OTE0NywgMHg5MzBhYTcyNSxcbiAgMHgwNmNhNjM1MSwgMHhlMDAzODI2ZiwgMHgxNDI5Mjk2NywgMHgwYTBlNmU3MCxcbiAgMHgyN2I3MGE4NSwgMHg0NmQyMmZmYywgMHgyZTFiMjEzOCwgMHg1YzI2YzkyNixcbiAgMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCwgMHg1MzM4MGQxMywgMHg5ZDk1YjNkZixcbiAgMHg2NTBhNzM1NCwgMHg4YmFmNjNkZSwgMHg3NjZhMGFiYiwgMHgzYzc3YjJhOCxcbiAgMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiwgMHg5MjcyMmM4NSwgMHgxNDgyMzUzYixcbiAgMHhhMmJmZThhMSwgMHg0Y2YxMDM2NCwgMHhhODFhNjY0YiwgMHhiYzQyMzAwMSxcbiAgMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSwgMHhjNzZjNTFhMywgMHgwNjU0YmUzMCxcbiAgMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCwgMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCxcbiAgMHhmNDBlMzU4NSwgMHg1NzcxMjAyYSwgMHgxMDZhYTA3MCwgMHgzMmJiZDFiOCxcbiAgMHgxOWE0YzExNiwgMHhiOGQyZDBjOCwgMHgxZTM3NmMwOCwgMHg1MTQxYWI1MyxcbiAgMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSwgMHgzNGIwYmNiNSwgMHhlMTliNDhhOCxcbiAgMHgzOTFjMGNiMywgMHhjNWM5NWE2MywgMHg0ZWQ4YWE0YSwgMHhlMzQxOGFjYixcbiAgMHg1YjljY2E0ZiwgMHg3NzYzZTM3MywgMHg2ODJlNmZmMywgMHhkNmIyYjhhMyxcbiAgMHg3NDhmODJlZSwgMHg1ZGVmYjJmYywgMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCxcbiAgMHg4NGM4NzgxNCwgMHhhMWYwYWI3MiwgMHg4Y2M3MDIwOCwgMHgxYTY0MzllYyxcbiAgMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCwgMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSxcbiAgMHhiZWY5YTNmNywgMHhiMmM2NzkxNSwgMHhjNjcxNzhmMiwgMHhlMzcyNTMyYixcbiAgMHhjYTI3M2VjZSwgMHhlYTI2NjE5YywgMHhkMTg2YjhjNywgMHgyMWMwYzIwNyxcbiAgMHhlYWRhN2RkNiwgMHhjZGUwZWIxZSwgMHhmNTdkNGY3ZiwgMHhlZTZlZDE3OCxcbiAgMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSwgMHgwYTYzN2RjNSwgMHhhMmM4OThhNixcbiAgMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSwgMHgxYjcxMGIzNSwgMHgxMzFjNDcxYixcbiAgMHgyOGRiNzdmNSwgMHgyMzA0N2Q4NCwgMHgzMmNhYWI3YiwgMHg0MGM3MjQ5MyxcbiAgMHgzYzllYmUwYSwgMHgxNWM5YmViYywgMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyxcbiAgMHg0Y2M1ZDRiZSwgMHhjYjNlNDJiNiwgMHg1OTdmMjk5YywgMHhmYzY1N2UyYSxcbiAgMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYywgMHg2YzQ0MTk4YywgMHg0YTQ3NTgxN1xuXTtcblxuZnVuY3Rpb24gU0hBNTEyKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBNTEyKSlcbiAgICByZXR1cm4gbmV3IFNIQTUxMigpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHg2YTA5ZTY2NywgMHhmM2JjYzkwOCxcbiAgICAweGJiNjdhZTg1LCAweDg0Y2FhNzNiLFxuICAgIDB4M2M2ZWYzNzIsIDB4ZmU5NGY4MmIsXG4gICAgMHhhNTRmZjUzYSwgMHg1ZjFkMzZmMSxcbiAgICAweDUxMGU1MjdmLCAweGFkZTY4MmQxLFxuICAgIDB4OWIwNTY4OGMsIDB4MmIzZTZjMWYsXG4gICAgMHgxZjgzZDlhYiwgMHhmYjQxYmQ2YixcbiAgICAweDViZTBjZDE5LCAweDEzN2UyMTc5IF07XG4gIHRoaXMuayA9IHNoYTUxMl9LO1xuICB0aGlzLlcgPSBuZXcgQXJyYXkoMTYwKTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTUxMiwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBNTEyO1xuXG5TSEE1MTIuYmxvY2tTaXplID0gMTAyNDtcblNIQTUxMi5vdXRTaXplID0gNTEyO1xuU0hBNTEyLmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTUxMi5wYWRMZW5ndGggPSAxMjg7XG5cblNIQTUxMi5wcm90b3R5cGUuX3ByZXBhcmVCbG9jayA9IGZ1bmN0aW9uIF9wcmVwYXJlQmxvY2sobXNnLCBzdGFydCkge1xuICB2YXIgVyA9IHRoaXMuVztcblxuICAvLyAzMiB4IDMyYml0IHdvcmRzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzI7IGkrKylcbiAgICBXW2ldID0gbXNnW3N0YXJ0ICsgaV07XG4gIGZvciAoOyBpIDwgVy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBjMF9oaSA9IGcxXzUxMl9oaShXW2kgLSA0XSwgV1tpIC0gM10pOyAgLy8gaSAtIDJcbiAgICB2YXIgYzBfbG8gPSBnMV81MTJfbG8oV1tpIC0gNF0sIFdbaSAtIDNdKTtcbiAgICB2YXIgYzFfaGkgPSBXW2kgLSAxNF07ICAvLyBpIC0gN1xuICAgIHZhciBjMV9sbyA9IFdbaSAtIDEzXTtcbiAgICB2YXIgYzJfaGkgPSBnMF81MTJfaGkoV1tpIC0gMzBdLCBXW2kgLSAyOV0pOyAgLy8gaSAtIDE1XG4gICAgdmFyIGMyX2xvID0gZzBfNTEyX2xvKFdbaSAtIDMwXSwgV1tpIC0gMjldKTtcbiAgICB2YXIgYzNfaGkgPSBXW2kgLSAzMl07ICAvLyBpIC0gMTZcbiAgICB2YXIgYzNfbG8gPSBXW2kgLSAzMV07XG5cbiAgICBXW2ldID0gc3VtNjRfNF9oaShcbiAgICAgIGMwX2hpLCBjMF9sbyxcbiAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgIGMzX2hpLCBjM19sbyk7XG4gICAgV1tpICsgMV0gPSBzdW02NF80X2xvKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvKTtcbiAgfVxufTtcblxuU0hBNTEyLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gX3VwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHRoaXMuX3ByZXBhcmVCbG9jayhtc2csIHN0YXJ0KTtcblxuICB2YXIgVyA9IHRoaXMuVztcblxuICB2YXIgYWggPSB0aGlzLmhbMF07XG4gIHZhciBhbCA9IHRoaXMuaFsxXTtcbiAgdmFyIGJoID0gdGhpcy5oWzJdO1xuICB2YXIgYmwgPSB0aGlzLmhbM107XG4gIHZhciBjaCA9IHRoaXMuaFs0XTtcbiAgdmFyIGNsID0gdGhpcy5oWzVdO1xuICB2YXIgZGggPSB0aGlzLmhbNl07XG4gIHZhciBkbCA9IHRoaXMuaFs3XTtcbiAgdmFyIGVoID0gdGhpcy5oWzhdO1xuICB2YXIgZWwgPSB0aGlzLmhbOV07XG4gIHZhciBmaCA9IHRoaXMuaFsxMF07XG4gIHZhciBmbCA9IHRoaXMuaFsxMV07XG4gIHZhciBnaCA9IHRoaXMuaFsxMl07XG4gIHZhciBnbCA9IHRoaXMuaFsxM107XG4gIHZhciBoaCA9IHRoaXMuaFsxNF07XG4gIHZhciBobCA9IHRoaXMuaFsxNV07XG5cbiAgYXNzZXJ0KHRoaXMuay5sZW5ndGggPT09IFcubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBXLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGMwX2hpID0gaGg7XG4gICAgdmFyIGMwX2xvID0gaGw7XG4gICAgdmFyIGMxX2hpID0gczFfNTEyX2hpKGVoLCBlbCk7XG4gICAgdmFyIGMxX2xvID0gczFfNTEyX2xvKGVoLCBlbCk7XG4gICAgdmFyIGMyX2hpID0gY2g2NF9oaShlaCwgZWwsIGZoLCBmbCwgZ2gsIGdsKTtcbiAgICB2YXIgYzJfbG8gPSBjaDY0X2xvKGVoLCBlbCwgZmgsIGZsLCBnaCwgZ2wpO1xuICAgIHZhciBjM19oaSA9IHRoaXMua1tpXTtcbiAgICB2YXIgYzNfbG8gPSB0aGlzLmtbaSArIDFdO1xuICAgIHZhciBjNF9oaSA9IFdbaV07XG4gICAgdmFyIGM0X2xvID0gV1tpICsgMV07XG5cbiAgICB2YXIgVDFfaGkgPSBzdW02NF81X2hpKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvLFxuICAgICAgYzRfaGksIGM0X2xvKTtcbiAgICB2YXIgVDFfbG8gPSBzdW02NF81X2xvKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvLFxuICAgICAgYzRfaGksIGM0X2xvKTtcblxuICAgIGMwX2hpID0gczBfNTEyX2hpKGFoLCBhbCk7XG4gICAgYzBfbG8gPSBzMF81MTJfbG8oYWgsIGFsKTtcbiAgICBjMV9oaSA9IG1hajY0X2hpKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wpO1xuICAgIGMxX2xvID0gbWFqNjRfbG8oYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCk7XG5cbiAgICB2YXIgVDJfaGkgPSBzdW02NF9oaShjMF9oaSwgYzBfbG8sIGMxX2hpLCBjMV9sbyk7XG4gICAgdmFyIFQyX2xvID0gc3VtNjRfbG8oYzBfaGksIGMwX2xvLCBjMV9oaSwgYzFfbG8pO1xuXG4gICAgaGggPSBnaDtcbiAgICBobCA9IGdsO1xuXG4gICAgZ2ggPSBmaDtcbiAgICBnbCA9IGZsO1xuXG4gICAgZmggPSBlaDtcbiAgICBmbCA9IGVsO1xuXG4gICAgZWggPSBzdW02NF9oaShkaCwgZGwsIFQxX2hpLCBUMV9sbyk7XG4gICAgZWwgPSBzdW02NF9sbyhkbCwgZGwsIFQxX2hpLCBUMV9sbyk7XG5cbiAgICBkaCA9IGNoO1xuICAgIGRsID0gY2w7XG5cbiAgICBjaCA9IGJoO1xuICAgIGNsID0gYmw7XG5cbiAgICBiaCA9IGFoO1xuICAgIGJsID0gYWw7XG5cbiAgICBhaCA9IHN1bTY0X2hpKFQxX2hpLCBUMV9sbywgVDJfaGksIFQyX2xvKTtcbiAgICBhbCA9IHN1bTY0X2xvKFQxX2hpLCBUMV9sbywgVDJfaGksIFQyX2xvKTtcbiAgfVxuXG4gIHN1bTY0KHRoaXMuaCwgMCwgYWgsIGFsKTtcbiAgc3VtNjQodGhpcy5oLCAyLCBiaCwgYmwpO1xuICBzdW02NCh0aGlzLmgsIDQsIGNoLCBjbCk7XG4gIHN1bTY0KHRoaXMuaCwgNiwgZGgsIGRsKTtcbiAgc3VtNjQodGhpcy5oLCA4LCBlaCwgZWwpO1xuICBzdW02NCh0aGlzLmgsIDEwLCBmaCwgZmwpO1xuICBzdW02NCh0aGlzLmgsIDEyLCBnaCwgZ2wpO1xuICBzdW02NCh0aGlzLmgsIDE0LCBoaCwgaGwpO1xufTtcblxuU0hBNTEyLnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmgsICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaCwgJ2JpZycpO1xufTtcblxuZnVuY3Rpb24gY2g2NF9oaSh4aCwgeGwsIHloLCB5bCwgemgpIHtcbiAgdmFyIHIgPSAoeGggJiB5aCkgXiAoKH54aCkgJiB6aCk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gY2g2NF9sbyh4aCwgeGwsIHloLCB5bCwgemgsIHpsKSB7XG4gIHZhciByID0gKHhsICYgeWwpIF4gKCh+eGwpICYgemwpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIG1hajY0X2hpKHhoLCB4bCwgeWgsIHlsLCB6aCkge1xuICB2YXIgciA9ICh4aCAmIHloKSBeICh4aCAmIHpoKSBeICh5aCAmIHpoKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBtYWo2NF9sbyh4aCwgeGwsIHloLCB5bCwgemgsIHpsKSB7XG4gIHZhciByID0gKHhsICYgeWwpIF4gKHhsICYgemwpIF4gKHlsICYgemwpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMwXzUxMl9oaSh4aCwgeGwpIHtcbiAgdmFyIGMwX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMjgpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGwsIHhoLCAyKTsgIC8vIDM0XG4gIHZhciBjMl9oaSA9IHJvdHI2NF9oaSh4bCwgeGgsIDcpOyAgLy8gMzlcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBzMF81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDI4KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgMik7ICAvLyAzNFxuICB2YXIgYzJfbG8gPSByb3RyNjRfbG8oeGwsIHhoLCA3KTsgIC8vIDM5XG5cbiAgdmFyIHIgPSBjMF9sbyBeIGMxX2xvIF4gYzJfbG87XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gczFfNTEyX2hpKHhoLCB4bCkge1xuICB2YXIgYzBfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAxNCk7XG4gIHZhciBjMV9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE4KTtcbiAgdmFyIGMyX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgOSk7ICAvLyA0MVxuXG4gIHZhciByID0gYzBfaGkgXiBjMV9oaSBeIGMyX2hpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMxXzUxMl9sbyh4aCwgeGwpIHtcbiAgdmFyIGMwX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMTQpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAxOCk7XG4gIHZhciBjMl9sbyA9IHJvdHI2NF9sbyh4bCwgeGgsIDkpOyAgLy8gNDFcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMF81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDEpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCA4KTtcbiAgdmFyIGMyX2hpID0gc2hyNjRfaGkoeGgsIHhsLCA3KTtcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMF81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDEpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCA4KTtcbiAgdmFyIGMyX2xvID0gc2hyNjRfbG8oeGgsIHhsLCA3KTtcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMV81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE5KTtcbiAgdmFyIGMxX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgMjkpOyAgLy8gNjFcbiAgdmFyIGMyX2hpID0gc2hyNjRfaGkoeGgsIHhsLCA2KTtcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMV81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDE5KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgMjkpOyAgLy8gNjFcbiAgdmFyIGMyX2xvID0gc2hyNjRfbG8oeGgsIHhsLCA2KTtcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbnZhciBTSEE1MTIgPSByZXF1aXJlKCcuLzUxMicpO1xuXG5mdW5jdGlvbiBTSEEzODQoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEzODQpKVxuICAgIHJldHVybiBuZXcgU0hBMzg0KCk7XG5cbiAgU0hBNTEyLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweGNiYmI5ZDVkLCAweGMxMDU5ZWQ4LFxuICAgIDB4NjI5YTI5MmEsIDB4MzY3Y2Q1MDcsXG4gICAgMHg5MTU5MDE1YSwgMHgzMDcwZGQxNyxcbiAgICAweDE1MmZlY2Q4LCAweGY3MGU1OTM5LFxuICAgIDB4NjczMzI2NjcsIDB4ZmZjMDBiMzEsXG4gICAgMHg4ZWI0NGE4NywgMHg2ODU4MTUxMSxcbiAgICAweGRiMGMyZTBkLCAweDY0Zjk4ZmE3LFxuICAgIDB4NDdiNTQ4MWQsIDB4YmVmYTRmYTQgXTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTM4NCwgU0hBNTEyKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMzg0O1xuXG5TSEEzODQuYmxvY2tTaXplID0gMTAyNDtcblNIQTM4NC5vdXRTaXplID0gMzg0O1xuU0hBMzg0LmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTM4NC5wYWRMZW5ndGggPSAxMjg7XG5cblNIQTM4NC5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLnNsaWNlKDAsIDEyKSwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsIDEyKSwgJ2JpZycpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnNoYTEgPSByZXF1aXJlKCcuL3NoYS8xJyk7XG5leHBvcnRzLnNoYTIyNCA9IHJlcXVpcmUoJy4vc2hhLzIyNCcpO1xuZXhwb3J0cy5zaGEyNTYgPSByZXF1aXJlKCcuL3NoYS8yNTYnKTtcbmV4cG9ydHMuc2hhMzg0ID0gcmVxdWlyZSgnLi9zaGEvMzg0Jyk7XG5leHBvcnRzLnNoYTUxMiA9IHJlcXVpcmUoJy4vc2hhLzUxMicpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG52YXIgcm90bDMyID0gdXRpbHMucm90bDMyO1xudmFyIHN1bTMyID0gdXRpbHMuc3VtMzI7XG52YXIgc3VtMzJfMyA9IHV0aWxzLnN1bTMyXzM7XG52YXIgc3VtMzJfNCA9IHV0aWxzLnN1bTMyXzQ7XG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxuZnVuY3Rpb24gUklQRU1EMTYwKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUklQRU1EMTYwKSlcbiAgICByZXR1cm4gbmV3IFJJUEVNRDE2MCgpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuXG4gIHRoaXMuaCA9IFsgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMCBdO1xuICB0aGlzLmVuZGlhbiA9ICdsaXR0bGUnO1xufVxudXRpbHMuaW5oZXJpdHMoUklQRU1EMTYwLCBCbG9ja0hhc2gpO1xuZXhwb3J0cy5yaXBlbWQxNjAgPSBSSVBFTUQxNjA7XG5cblJJUEVNRDE2MC5ibG9ja1NpemUgPSA1MTI7XG5SSVBFTUQxNjAub3V0U2l6ZSA9IDE2MDtcblJJUEVNRDE2MC5obWFjU3RyZW5ndGggPSAxOTI7XG5SSVBFTUQxNjAucGFkTGVuZ3RoID0gNjQ7XG5cblJJUEVNRDE2MC5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHZhciBBID0gdGhpcy5oWzBdO1xuICB2YXIgQiA9IHRoaXMuaFsxXTtcbiAgdmFyIEMgPSB0aGlzLmhbMl07XG4gIHZhciBEID0gdGhpcy5oWzNdO1xuICB2YXIgRSA9IHRoaXMuaFs0XTtcbiAgdmFyIEFoID0gQTtcbiAgdmFyIEJoID0gQjtcbiAgdmFyIENoID0gQztcbiAgdmFyIERoID0gRDtcbiAgdmFyIEVoID0gRTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4MDsgaisrKSB7XG4gICAgdmFyIFQgPSBzdW0zMihcbiAgICAgIHJvdGwzMihcbiAgICAgICAgc3VtMzJfNChBLCBmKGosIEIsIEMsIEQpLCBtc2dbcltqXSArIHN0YXJ0XSwgSyhqKSksXG4gICAgICAgIHNbal0pLFxuICAgICAgRSk7XG4gICAgQSA9IEU7XG4gICAgRSA9IEQ7XG4gICAgRCA9IHJvdGwzMihDLCAxMCk7XG4gICAgQyA9IEI7XG4gICAgQiA9IFQ7XG4gICAgVCA9IHN1bTMyKFxuICAgICAgcm90bDMyKFxuICAgICAgICBzdW0zMl80KEFoLCBmKDc5IC0gaiwgQmgsIENoLCBEaCksIG1zZ1tyaFtqXSArIHN0YXJ0XSwgS2goaikpLFxuICAgICAgICBzaFtqXSksXG4gICAgICBFaCk7XG4gICAgQWggPSBFaDtcbiAgICBFaCA9IERoO1xuICAgIERoID0gcm90bDMyKENoLCAxMCk7XG4gICAgQ2ggPSBCaDtcbiAgICBCaCA9IFQ7XG4gIH1cbiAgVCA9IHN1bTMyXzModGhpcy5oWzFdLCBDLCBEaCk7XG4gIHRoaXMuaFsxXSA9IHN1bTMyXzModGhpcy5oWzJdLCBELCBFaCk7XG4gIHRoaXMuaFsyXSA9IHN1bTMyXzModGhpcy5oWzNdLCBFLCBBaCk7XG4gIHRoaXMuaFszXSA9IHN1bTMyXzModGhpcy5oWzRdLCBBLCBCaCk7XG4gIHRoaXMuaFs0XSA9IHN1bTMyXzModGhpcy5oWzBdLCBCLCBDaCk7XG4gIHRoaXMuaFswXSA9IFQ7XG59O1xuXG5SSVBFTUQxNjAucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2xpdHRsZScpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnbGl0dGxlJyk7XG59O1xuXG5mdW5jdGlvbiBmKGosIHgsIHksIHopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIHggXiB5IF4gejtcbiAgZWxzZSBpZiAoaiA8PSAzMSlcbiAgICByZXR1cm4gKHggJiB5KSB8ICgofngpICYgeik7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuICh4IHwgKH55KSkgXiB6O1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAoeCAmIHopIHwgKHkgJiAofnopKTtcbiAgZWxzZVxuICAgIHJldHVybiB4IF4gKHkgfCAofnopKTtcbn1cblxuZnVuY3Rpb24gSyhqKSB7XG4gIGlmIChqIDw9IDE1KVxuICAgIHJldHVybiAweDAwMDAwMDAwO1xuICBlbHNlIGlmIChqIDw9IDMxKVxuICAgIHJldHVybiAweDVhODI3OTk5O1xuICBlbHNlIGlmIChqIDw9IDQ3KVxuICAgIHJldHVybiAweDZlZDllYmExO1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAweDhmMWJiY2RjO1xuICBlbHNlXG4gICAgcmV0dXJuIDB4YTk1M2ZkNGU7XG59XG5cbmZ1bmN0aW9uIEtoKGopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIDB4NTBhMjhiZTY7XG4gIGVsc2UgaWYgKGogPD0gMzEpXG4gICAgcmV0dXJuIDB4NWM0ZGQxMjQ7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuIDB4NmQ3MDNlZjM7XG4gIGVsc2UgaWYgKGogPD0gNjMpXG4gICAgcmV0dXJuIDB4N2E2ZDc2ZTk7XG4gIGVsc2VcbiAgICByZXR1cm4gMHgwMDAwMDAwMDtcbn1cblxudmFyIHIgPSBbXG4gIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsXG4gIDcsIDQsIDEzLCAxLCAxMCwgNiwgMTUsIDMsIDEyLCAwLCA5LCA1LCAyLCAxNCwgMTEsIDgsXG4gIDMsIDEwLCAxNCwgNCwgOSwgMTUsIDgsIDEsIDIsIDcsIDAsIDYsIDEzLCAxMSwgNSwgMTIsXG4gIDEsIDksIDExLCAxMCwgMCwgOCwgMTIsIDQsIDEzLCAzLCA3LCAxNSwgMTQsIDUsIDYsIDIsXG4gIDQsIDAsIDUsIDksIDcsIDEyLCAyLCAxMCwgMTQsIDEsIDMsIDgsIDExLCA2LCAxNSwgMTNcbl07XG5cbnZhciByaCA9IFtcbiAgNSwgMTQsIDcsIDAsIDksIDIsIDExLCA0LCAxMywgNiwgMTUsIDgsIDEsIDEwLCAzLCAxMixcbiAgNiwgMTEsIDMsIDcsIDAsIDEzLCA1LCAxMCwgMTQsIDE1LCA4LCAxMiwgNCwgOSwgMSwgMixcbiAgMTUsIDUsIDEsIDMsIDcsIDE0LCA2LCA5LCAxMSwgOCwgMTIsIDIsIDEwLCAwLCA0LCAxMyxcbiAgOCwgNiwgNCwgMSwgMywgMTEsIDE1LCAwLCA1LCAxMiwgMiwgMTMsIDksIDcsIDEwLCAxNCxcbiAgMTIsIDE1LCAxMCwgNCwgMSwgNSwgOCwgNywgNiwgMiwgMTMsIDE0LCAwLCAzLCA5LCAxMVxuXTtcblxudmFyIHMgPSBbXG4gIDExLCAxNCwgMTUsIDEyLCA1LCA4LCA3LCA5LCAxMSwgMTMsIDE0LCAxNSwgNiwgNywgOSwgOCxcbiAgNywgNiwgOCwgMTMsIDExLCA5LCA3LCAxNSwgNywgMTIsIDE1LCA5LCAxMSwgNywgMTMsIDEyLFxuICAxMSwgMTMsIDYsIDcsIDE0LCA5LCAxMywgMTUsIDE0LCA4LCAxMywgNiwgNSwgMTIsIDcsIDUsXG4gIDExLCAxMiwgMTQsIDE1LCAxNCwgMTUsIDksIDgsIDksIDE0LCA1LCA2LCA4LCA2LCA1LCAxMixcbiAgOSwgMTUsIDUsIDExLCA2LCA4LCAxMywgMTIsIDUsIDEyLCAxMywgMTQsIDExLCA4LCA1LCA2XG5dO1xuXG52YXIgc2ggPSBbXG4gIDgsIDksIDksIDExLCAxMywgMTUsIDE1LCA1LCA3LCA3LCA4LCAxMSwgMTQsIDE0LCAxMiwgNixcbiAgOSwgMTMsIDE1LCA3LCAxMiwgOCwgOSwgMTEsIDcsIDcsIDEyLCA3LCA2LCAxNSwgMTMsIDExLFxuICA5LCA3LCAxNSwgMTEsIDgsIDYsIDYsIDE0LCAxMiwgMTMsIDUsIDE0LCAxMywgMTMsIDcsIDUsXG4gIDE1LCA1LCA4LCAxMSwgMTQsIDE0LCA2LCAxNCwgNiwgOSwgMTIsIDksIDEyLCA1LCAxNSwgOCxcbiAgOCwgNSwgMTIsIDksIDEyLCA1LCAxNCwgNiwgOCwgMTMsIDYsIDUsIDE1LCAxMywgMTEsIDExXG5dO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbmZ1bmN0aW9uIEhtYWMoaGFzaCwga2V5LCBlbmMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEhtYWMpKVxuICAgIHJldHVybiBuZXcgSG1hYyhoYXNoLCBrZXksIGVuYyk7XG4gIHRoaXMuSGFzaCA9IGhhc2g7XG4gIHRoaXMuYmxvY2tTaXplID0gaGFzaC5ibG9ja1NpemUgLyA4O1xuICB0aGlzLm91dFNpemUgPSBoYXNoLm91dFNpemUgLyA4O1xuICB0aGlzLmlubmVyID0gbnVsbDtcbiAgdGhpcy5vdXRlciA9IG51bGw7XG5cbiAgdGhpcy5faW5pdCh1dGlscy50b0FycmF5KGtleSwgZW5jKSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEhtYWM7XG5cbkhtYWMucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gaW5pdChrZXkpIHtcbiAgLy8gU2hvcnRlbiBrZXksIGlmIG5lZWRlZFxuICBpZiAoa2V5Lmxlbmd0aCA+IHRoaXMuYmxvY2tTaXplKVxuICAgIGtleSA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoa2V5KS5kaWdlc3QoKTtcbiAgYXNzZXJ0KGtleS5sZW5ndGggPD0gdGhpcy5ibG9ja1NpemUpO1xuXG4gIC8vIEFkZCBwYWRkaW5nIHRvIGtleVxuICBmb3IgKHZhciBpID0ga2V5Lmxlbmd0aDsgaSA8IHRoaXMuYmxvY2tTaXplOyBpKyspXG4gICAga2V5LnB1c2goMCk7XG5cbiAgZm9yIChpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcbiAgICBrZXlbaV0gXj0gMHgzNjtcbiAgdGhpcy5pbm5lciA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoa2V5KTtcblxuICAvLyAweDM2IF4gMHg1YyA9IDB4NmFcbiAgZm9yIChpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcbiAgICBrZXlbaV0gXj0gMHg2YTtcbiAgdGhpcy5vdXRlciA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoa2V5KTtcbn07XG5cbkhtYWMucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIGVuYykge1xuICB0aGlzLmlubmVyLnVwZGF0ZShtc2csIGVuYyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuSG1hYy5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICB0aGlzLm91dGVyLnVwZGF0ZSh0aGlzLmlubmVyLmRpZ2VzdCgpKTtcbiAgcmV0dXJuIHRoaXMub3V0ZXIuZGlnZXN0KGVuYyk7XG59O1xuIiwKICAgICJ2YXIgaGFzaCA9IGV4cG9ydHM7XG5cbmhhc2gudXRpbHMgPSByZXF1aXJlKCcuL2hhc2gvdXRpbHMnKTtcbmhhc2guY29tbW9uID0gcmVxdWlyZSgnLi9oYXNoL2NvbW1vbicpO1xuaGFzaC5zaGEgPSByZXF1aXJlKCcuL2hhc2gvc2hhJyk7XG5oYXNoLnJpcGVtZCA9IHJlcXVpcmUoJy4vaGFzaC9yaXBlbWQnKTtcbmhhc2guaG1hYyA9IHJlcXVpcmUoJy4vaGFzaC9obWFjJyk7XG5cbi8vIFByb3h5IGhhc2ggZnVuY3Rpb25zIHRvIHRoZSBtYWluIG9iamVjdFxuaGFzaC5zaGExID0gaGFzaC5zaGEuc2hhMTtcbmhhc2guc2hhMjU2ID0gaGFzaC5zaGEuc2hhMjU2O1xuaGFzaC5zaGEyMjQgPSBoYXNoLnNoYS5zaGEyMjQ7XG5oYXNoLnNoYTM4NCA9IGhhc2guc2hhLnNoYTM4NDtcbmhhc2guc2hhNTEyID0gaGFzaC5zaGEuc2hhNTEyO1xuaGFzaC5yaXBlbWQxNjAgPSBoYXNoLnJpcGVtZC5yaXBlbWQxNjA7XG4iLAogICAgIm1vZHVsZS5leHBvcnRzID0ge1xuICBkb3VibGVzOiB7XG4gICAgc3RlcDogNCxcbiAgICBwb2ludHM6IFtcbiAgICAgIFtcbiAgICAgICAgJ2U2MGZjZTkzYjU5ZTllYzUzMDExYWFiYzIxYzIzZTk3YjJhMzEzNjliODdhNWFlOWM0NGVlODllMmE2ZGVjMGEnLFxuICAgICAgICAnZjdlMzUwNzM5OWU1OTU5MjlkYjk5ZjM0ZjU3OTM3MTAxMjk2ODkxZTQ0ZDIzZjBiZTFmMzJjY2U2OTYxNjgyMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODI4MjI2MzIxMmM2MDlkOWVhMmE2ZTNlMTcyZGUyMzhkOGMzOWNhYmQ1YWMxY2ExMDY0NmUyM2ZkNWY1MTUwOCcsXG4gICAgICAgICcxMWY4YTgwOTg1NTdkZmU0NWU4MjU2ZTgzMGI2MGFjZTYyZDYxM2FjMmY3YjE3YmVkMzFiNmVhZmY2ZTI2Y2FmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNzVlMTU5ZjcyOGI4NjVhNzJmOTljYzZjNmZjODQ2ZGUwYjkzODMzZmQyMjIyZWQ3M2ZjZTViNTUxZTViNzM5JyxcbiAgICAgICAgJ2QzNTA2ZTBkOWUzYzc5ZWJhNGVmOTdhNTFmZjcxZjVlYWNiNTk1NWFkZDI0MzQ1YzZlZmE2ZmZlZTlmZWQ2OTUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM2M2Q5MGQ0NDdiMDBjOWM5OWNlYWMwNWI2MjYyZWUwNTM0NDFjN2U1NTU1MmZmZTUyNmJhZDhmODNmZjQ2NDAnLFxuICAgICAgICAnNGUyNzNhZGZjNzMyMjIxOTUzYjQ0NTM5N2YzMzYzMTQ1YjlhODkwMDgxOTllY2I2MjAwM2M3ZjNiZWU5ZGU5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4YjRiNWYxNjVkZjNjMmJlOGM2MjQ0YjViNzQ1NjM4ODQzZTRhNzgxYTE1YmNkMWI2OWY3OWE1NWRmZmRmODBjJyxcbiAgICAgICAgJzRhYWQwYTZmNjhkMzA4YjRiM2ZiZDc4MTNhYjBkYTA0ZjllMzM2NTQ2MTYyZWU1NmIzZWZmMGM2NWZkNGZkMzYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzcyM2NiYWE2ZTVkYjk5NmQ2YmY3NzFjMDBiZDU0OGM3YjcwMGRiZmZhNmMwZTc3YmNiNjExNTkyNTIzMmZjZGEnLFxuICAgICAgICAnOTZlODY3YjU1OTVjYzQ5OGE5MjExMzc0ODg4MjRkNmUyNjYwYTA2NTM3Nzk0OTQ4MDFkYzA2OWQ5ZWIzOWY1ZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWViZmE0ZDQ5M2JlYmY5OGJhNWZlZWM4MTJjMmQzYjUwOTQ3OTYxMjM3YTkxOTgzOWE1MzNlY2EwZTdkZDdmYScsXG4gICAgICAgICc1ZDlhOGNhMzk3MGVmMGYyNjllZTdlZGFmMTc4MDg5ZDlhZTRjZGMzYTcxMWY3MTJkZGZkNGZkYWUxZGU4OTk5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxMDBmNDRkYTY5NmU3MTY3Mjc5MWQwYTA5YjdiZGU0NTlmMTIxNWEyOWIzYzAzYmZlZmQ3ODM1YjM5YTQ4ZGIwJyxcbiAgICAgICAgJ2NkZDllMTMxOTJhMDBiNzcyZWM4ZjMzMDBjMDkwNjY2YjdmZjRhMThmZjUxOTVhYzBmYmQ1Y2Q2MmJjNjVhMDknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UxMDMxYmUyNjJjN2VkMWIxZGM5MjI3YTRhMDRjMDE3YTc3ZjhkNDQ2NGYzYjM4NTJjOGFjZGU2ZTUzNGZkMmQnLFxuICAgICAgICAnOWQ3MDYxOTI4OTQwNDA1ZTZiYjZhNDE3NjU5NzUzNWFmMjkyZGQ0MTllMWNlZDc5YTQ0ZjE4ZjI5NDU2YTAwZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmVlYTZjYWU0NmQ1NWI1MzBhYzI4MzlmMTQzYmQ3ZWM1Y2Y4YjI2NmE0MWQ2YWY1MmQ1ZTY4OGQ5MDk0Njk2ZCcsXG4gICAgICAgICdlNTdjNmI2Yzk3ZGNlMWJhYjA2ZTRlMTJiZjNlY2Q1Yzk4MWM4OTU3Y2M0MTQ0MmQzMTU1ZGViZjE4MDkwMDg4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkYTY3YTkxZDkxMDQ5Y2RjYjM2N2JlNGJlNmZmY2EzY2ZlZWQ2NTdkODA4NTgzZGUzM2ZhOTc4YmMxZWM2Y2IxJyxcbiAgICAgICAgJzliYWNhYTM1NDgxNjQyYmM0MWY0NjNmN2VjOTc4MGU1ZGVjN2FkYzUwOGY3NDBhMTdlOWVhOGUyN2E2OGJlMWQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzUzOTA0ZmFhMGIzMzRjZGRhNmUwMDA5MzVlZjIyMTUxZWMwOGQwZjdiYjExMDY5ZjU3NTQ1Y2NjMWEzN2I3YzAnLFxuICAgICAgICAnNWJjMDg3ZDBiYzgwMTA2ZDg4YzllY2NhYzIwZDNjMWMxMzk5OTk4MWUxNDQzNDY5OWRjYjA5NmIwMjI3NzFjOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGU3YmNkMGJkMzU5ODNhNzcxOWNjYTc3NjRjYTkwNjc3OWI1M2EwNDNhOWI4YmNhZWZmOTU5ZjQzYWQ4NjA0NycsXG4gICAgICAgICcxMGI3NzcwYjJhM2RhNGIzOTQwMzEwNDIwY2E5NTE0NTc5ZTg4ZTJlNDdmZDY4YjNlYTEwMDQ3ZTg0NjAzNzJhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczODVlZWQzNGMxY2RmZjIxZTZkMDgxODY4OWI4MWJkZTcxYTdmNGYxODM5N2U2NjkwYTg0MWUxNTk5YzQzODYyJyxcbiAgICAgICAgJzI4M2JlYmMzZThlYTIzZjU2NzAxZGUxOWU5ZWJmNDU3NmIzMDRlZWMyMDg2ZGM4Y2MwNDU4ZmU1NTQyZTU0NTMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzZmOWQ5YjgwM2VjZjE5MTYzN2M3M2E0NDEzZGZhMTgwZmRkZjg0YTU5NDdmYmM5YzYwNmVkODZjM2ZhYzNhNycsXG4gICAgICAgICc3YzgwYzY4ZTYwMzA1OWJhNjliOGUyYTMwZTQ1YzRkNDdlYTRkZDJmNWMyODEwMDJkODY4OTA2MDNhODQyMTYwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMzIyZDQwMTI0M2M0ZTI1ODJhMjE0N2MxMDRkNmVjYmY3NzRkMTYzZGIwZjVlNTMxM2I3ZTBlNzQyZDBlNmJkJyxcbiAgICAgICAgJzU2ZTcwNzk3ZTk2NjRlZjViZmIwMTliYzRkZGFmOWI3MjgwNWY2M2VhMjg3M2FmNjI0ZjNhMmU5NmMyOGIyYTAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg1NjcyYzdkMmRlMGI3ZGEyYmQxNzcwZDg5NjY1ODY4NzQxYjNmOWFmNzY0MzM5NzcyMWQ3NGQyODEzNGFiODMnLFxuICAgICAgICAnN2M0ODFiOWI1YjQzYjJlYjYzNzQwNDliZmE2MmMyZTVlNzdmMTdmY2M1Mjk4ZjQ0YzhlMzA5NGY3OTAzMTNhNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTQ4YmY4MDliMTk4OGE0NmIwNmM5ZjE5MTk0MTNiMTBmOTIyNmM2MGY2Njg4MzJmZmQ5NTlhZjYwYzgyYTBhJyxcbiAgICAgICAgJzUzYTU2Mjg1NmRjYjY2NDZkYzZiNzRjNWQxYzM0MThjNmQ0ZGZmMDhjOTdjZDJiZWQ0Y2I3Zjg4ZDhjOGU1ODknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzYyNjBjZTdmNDYxODAxYzM0ZjA2N2NlMGYwMjg3M2E4ZjFiMGU0NGRmYzY5NzUyYWNjZWNkODE5ZjM4ZmQ4ZTgnLFxuICAgICAgICAnYmMyZGE4MmI2ZmE1YjU3MWE3ZjA5MDQ5Nzc2YTFlZjdlY2QyOTIyMzgwNTFjMTk4YzFhODRlOTViMmI0YWUxNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTUwMzdkZTBhZmMxZDhkNDNkODM0ODQxNGJiZjQxMDMwNDNlYzhmNTc1YmZkYzQzMjk1M2NjOGQyMDM3ZmEyZCcsXG4gICAgICAgICc0NTcxNTM0YmFhOTRkM2I1ZjlmOThkMDlmYjk5MGJkZGJkNWY1YjAzZWM0ODFmMTBlMGU1ZGM4NDFkNzU1YmRhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlMDYzNzJiMGY0YTIwN2FkZjVlYTkwNWU4ZjE3NzFiNGU3ZThkYmQxYzZhNmM1YjcyNTg2NmEwYWU0ZmNlNzI1JyxcbiAgICAgICAgJzdhOTA4OTc0YmNlMThjZmUxMmEyN2JiMmFkNWE0ODhjZDc0ODRhNzc4NzEwNDg3MGIyNzAzNGY5NGVlZTMxZGQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzIxM2M3YTcxNWNkNWQ0NTM1OGQwYmJmOWRjMGNlMDIyMDRiMTBiZGRlMmEzZjU4NTQwYWQ2OTA4ZDA1NTk3NTQnLFxuICAgICAgICAnNGI2ZGFkMGI1YWU0NjI1MDcwMTNhZDA2MjQ1YmExOTBiYjQ4NTBmNWYzNmE3ZWVkZGZmMmMyNzUzNGI0NThmMicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNGU3YzI3MmE3YWY0YjM0ZThkYmI5MzUyYTU0MTlhODdlMjgzOGM3MGFkYzYyY2RkZjBjYzNhM2IwOGZiZDUzYycsXG4gICAgICAgICcxNzc0OWM3NjZjOWQwYjE4ZTE2ZmQwOWY2ZGVmNjgxYjUzMGI5NjE0YmZmN2RkMzNlMGIzOTQxODE3ZGNhYWU2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmZWE3NGUzZGJlNzc4YjFiMTBmMjM4YWQ2MTY4NmFhNWM3NmUzZGIyYmU0MzA1NzYzMjQyN2UyODQwZmIyN2I2JyxcbiAgICAgICAgJzZlMDU2OGRiOWIwYjEzMjk3Y2Y2NzRkZWNjYjZhZjkzMTI2YjU5NmI5NzNmN2I3NzcwMWQzZGI3ZjIzY2I5NmYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc2ZTY0MTEzZjY3N2NmMGUxMGEyNTcwZDU5OTk2OGQzMTU0NGUxNzliNzYwNDMyOTUyYzAyYTQ0MTdiZGRlMzknLFxuICAgICAgICAnYzkwZGRmOGRlZTRlOTVjZjU3NzA2NmQ3MDY4MWYwZDM1ZTJhMzNkMmI1NmQyMDMyYjRiMTc1MmQxOTAxYWMwMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzczOGM1NmIwM2IyYWJlMWU4MjgxYmFhNzQzZjhmOWE4ZjdjYzY0M2RmMjZjYmVlM2FiMTUwMjQyYmNiYjg5MScsXG4gICAgICAgICc4OTNmYjU3ODk1MWFkMjUzN2Y3MThmMmVhY2JmYmJiYjgyMzE0ZWVmNzg4MGNmZTkxN2U3MzVkOTY5OWE4NGMzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkODk1NjI2NTQ4YjY1YjgxZTI2NGM3NjM3Yzk3Mjg3N2QxZDcyZTVmM2E5MjUwMTQzNzJlOWY2NTg4ZjZjMTRiJyxcbiAgICAgICAgJ2ZlYmZhYTM4ZjJiYzdlYWU3MjhlYzYwODE4YzM0MGViMDM0MjhkNjMyYmIwNjdlMTc5MzYzZWQ3NWQ3ZDk5MWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2I4ZGE5NDAzMmE5NTc1MThlYjBmNjQzMzU3MWU4NzYxY2VmZmM3MzY5M2U4NGVkZDQ5MTUwYTU2NGY2NzZlMDMnLFxuICAgICAgICAnMjgwNGRmYTQ0ODA1YTFlNGQ3Yzk5Y2M5NzYyODA4YjA5MmNjNTg0ZDk1ZmYzYjUxMTQ4OGU0ZTc0ZWZkZjZlNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTgwZmVhMTQ0NDFmYjMzYTdkOGFkYWI5NDc1ZDdmYWIyMDE5ZWZmYjUxNTZhNzkyZjFhMTE3NzhlM2MwZGY1ZCcsXG4gICAgICAgICdlZWQxZGU3ZjYzOGUwMDc3MWU4OTc2OGNhM2NhOTQ0NzJkMTU1ZTgwYWYzMjJlYTlmY2I0MjkxYjZhYzllYzc4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhMzAxNjk3YmRmY2Q3MDQzMTNiYTQ4ZTUxZDU2NzU0M2YyYTE4MjAzMWVmZDY5MTVkZGMwN2JiY2M0ZTE2MDcwJyxcbiAgICAgICAgJzczNzBmOTFjZmI2N2U0ZjUwODE4MDlmYTI1ZDQwZjliMTczNWRiZjdjMGExMWExMzBjMGQxYTA0MWUxNzdlYTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkwYWQ4NWIzODlkNmI5MzY0NjNmOWQwNTEyNjc4ZGUyMDhjYzMzMGIxMTMwN2ZmZmFiN2FjNjNlM2ZiMDRlZDQnLFxuICAgICAgICAnZTUwN2EzNjIwYTM4MjYxYWZmZGNiZDk0MjcyMjJiODM5YWVmYWJlMTU4Mjg5NGQ5OTFkNGQ0OGNiNmVmMTUwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4ZjY4YjlkMmY2M2I1ZjMzOTIzOWMxYWQ5ODFmMTYyZWU4OGM1Njc4NzIzZWEzMzUxYjdiNDQ0YzllYzRjMGRhJyxcbiAgICAgICAgJzY2MmE5ZjJkYmEwNjM5ODZkZTFkOTBjMmI2YmUyMTVkYmJlYTJjZmU5NTUxMGJmZGYyM2NiZjc5NTAxZmZmODInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U0ZjNmYjAxNzZhZjg1ZDY1ZmY5OWZmOTE5OGMzNjA5MWY0OGU4NjUwMzY4MWUzZTY2ODZmZDUwNTMyMzFlMTEnLFxuICAgICAgICAnMWU2MzYzM2FkMGVmNGYxYzE2NjFhNmQwZWEwMmI3Mjg2Y2M3ZTc0ZWM5NTFkMWM5ODIyYzM4NTc2ZmViNzNiYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGMwMGZhOWIxOGViZjMzMWViOTYxNTM3YTQ1YTQyNjZjNzAzNGYyZjBkNGUxZDA3MTZmYjZlYWUyMGVhZTI5ZScsXG4gICAgICAgICdlZmE0NzI2N2ZlYTUyMWExYTlkYzM0M2EzNzM2Yzk3NGMyZmFkYWZhODFlMzZjNTRlN2QyYTRjNjY3MDI0MTRiJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlN2EyNmNlNjlkZDQ4MjlmM2UxMGNlYzBhOWU5OGVkMzE0M2QwODRmMzA4YjkyYzA5OTdmZGRmYzYwY2IzZTQxJyxcbiAgICAgICAgJzJhNzU4ZTMwMGZhNzk4NGI0NzFiMDA2YTFhYWZiYjE4ZDBhNmIyYzA0MjBlODNlMjBlOGE5NDIxY2YyY2ZkNTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2I2NDU5ZTBlZTM2NjJlYzhkMjM1NDBjMjIzYmNiZGM1NzFjYmNiOTY3ZDc5NDI0ZjNjZjI5ZWIzZGU2YjgwZWYnLFxuICAgICAgICAnNjdjODc2ZDA2ZjNlMDZkZTFkYWRmMTZlNTY2MWRiM2M0YjNhZTZkNDhlMzViMmZmMzBiZjBiNjFhNzFiYTQ1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNjhhODBjODI4MGJiODQwNzkzMjM0YWExMThmMDYyMzFkNmYxZmM2N2U3M2M1YTVkZWRhMGY1YjQ5Njk0M2U4JyxcbiAgICAgICAgJ2RiOGJhOWZmZjRiNTg2ZDAwYzRiMWY5MTc3YjBlMjhiNWIwZTdiOGY3ODQ1Mjk1YTI5NGM4NDI2NmIxMzMxMjAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMyNGFlZDdkZjY1YzgwNDI1MmRjMDI3MDkwN2EzMGIwOTYxMmFlYjk3MzQ0OWNlYTQwOTU5ODBmYzI4ZDNkNWQnLFxuICAgICAgICAnNjQ4YTM2NTc3NGI2MWYyZmYxMzBjMGMzNWFlYzFmNGYxOTIxM2IwYzdlMzMyODQzOTY3MjI0YWY5NmFiN2M4NCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNGRmOWMxNDkxOWNkZTYxZjZkNTFkZmRiZTVmZWU1ZGNlZWM0MTQzYmE4ZDFjYTg4OGU4YmQzNzNmZDA1NGM5NicsXG4gICAgICAgICczNWVjNTEwOTJkODcyODA1MDk3NGMyM2ExZDg1ZDRiNWQ1MDZjZGMyODg0OTAxOTJlYmFjMDZjYWQxMGQ1ZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOWMzOTE5YTg0YTQ3NDg3MGZhZWQ4YTljMWNjNjYwMjE1MjM0ODkwNTRkN2YwMzA4Y2JmYzk5YzhhYzFmOThjZCcsXG4gICAgICAgICdkZGI4NGYwZjRhNGRkZDU3NTg0ZjA0NGJmMjYwZTY0MTkwNTMyNmY3NmM2NGM4ZTZiZTdlNWUwM2Q0ZmM1OTlkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2MDU3MTcwYjFkZDEyZmRmOGRlMDVmMjgxZDhlMDZiYjkxZTE0OTNhOGI5MWQ0Y2M1YTIxMzgyMTIwYTk1OWU1JyxcbiAgICAgICAgJzlhMWFmMGIyNmE2YTQ4MDdhZGQ5YTJkYWY3MWRmMjYyNDY1MTUyYmMzZWUyNGM2NWU4OTliZTkzMjM4NWEyYTgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E1NzZkZjhlMjNhMDg0MTE0MjE0MzlhNDUxOGRhMzE4ODBjZWYwZmJhN2Q0ZGYxMmIxYTY5NzNlZWNiOTQyNjYnLFxuICAgICAgICAnNDBhNmJmMjBlNzY2NDBiMmM5MmI5N2FmZTU4Y2Q4MmM0MzJlMTBhN2Y1MTRkOWYzZWU4YmUxMWFlMWIyOGVjOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzc3OGE3OGMyOGRlYzNlMzBhMDVmZTk2MjlkZThjMzhiYjMwZDFmNWNmOWEzYTIwOGY3NjM4ODliZTU4YWQ3MScsXG4gICAgICAgICczNDYyNmQ5YWI1YTViMjJmZjcwOThlMTJmMmZmNTgwMDg3YjM4NDExZmYyNGFjNTYzYjUxM2ZjMWZkOWY0M2FjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5Mjg5NTVlZTYzN2E4NDQ2MzcyOWZkMzBlN2FmZDJlZDVmOTYyNzRlNWFkN2U1Y2IwOWVkYTljMDZkOTAzYWMnLFxuICAgICAgICAnYzI1NjIxMDAzZDNmNDJhODI3Yjc4YTEzMDkzYTk1ZWVhYzNkMjZlZmE4YThkODNmYzUxODBlOTM1YmNkMDkxZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODVkMGZlZjNlYzZkYjEwOTM5OTA2NGYzYTBlM2IyODU1NjQ1YjRhOTA3YWQzNTQ1MjdhYWU3NTE2M2Q4Mjc1MScsXG4gICAgICAgICcxZjAzNjQ4NDEzYTM4YzBiZTI5ZDQ5NmU1ODJjZjU2NjNlODc1MWU5Njg3NzMzMTU4MmMyMzdhMjRlYjFmOTYyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmZjJiMGRjZTk3ZWVjZTk3YzFjOWI2MDQxNzk4Yjg1ZGZkZmI2ZDg4ODJkYTIwMzA4ZjU0MDQ4MjQ1MjYwODdlJyxcbiAgICAgICAgJzQ5M2QxM2ZlZjUyNGJhMTg4YWY0YzRkYzU0ZDA3OTM2YzdiN2VkNmZiOTBlMmNlYjJjOTUxZTAxZjBjMjk5MDcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzgyN2ZiYmU0YjFlODgwZWE5ZWQyYjJlNjMwMWIyMTJiNTdmMWVlMTQ4Y2Q2ZGQyODc4MGU1ZTJjZjg1NmUyNDEnLFxuICAgICAgICAnYzYwZjljOTIzYzcyN2IwYjcxYmVmMmM2N2QxZDEyNjg3ZmY3YTYzMTg2OTAzMTY2ZDYwNWI2OGJhZWMyOTNlYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWFhNjQ5ZjIxZjUxYmRiYWU3YmU0YWUzNGNlNmU1MjE3YTU4ZmRjZTdmNDdmOWFhN2YzYjU4ZmEyMTIwZTJiMycsXG4gICAgICAgICdiZTMyNzllZDViYmJiMDNhYzY5YTgwZjg5ODc5YWE1YTAxYTZiOTY1ZjEzZjdlNTlkNDdhNTMwNWJhNWFkOTNkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNGE0MmQ0M2M1Y2YxNjlkOTM5MWRmNmRlY2Y0MmVlNTQxYjZkOGYwYzlhMTM3NDAxZTIzNjMyZGRhMzRkMjRmJyxcbiAgICAgICAgJzRkOWY5MmU3MTZkMWM3MzUyNmZjOTljY2ZiOGFkMzRjZTg4NmVlZGZhOGQ4ZTRmMTNhN2Y3MTMxZGViYTk0MTQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzFlYzgwZmVmMzYwY2JkZDk1NDE2MGZhZGFiMzUyYjZiOTJiNTM1NzZhODhmZWE0OTQ3MTczYjlkNDMwMGJmMTknLFxuICAgICAgICAnYWVlZmU5Mzc1NmI1MzQwZDJmM2E0OTU4YTdhYmJmNWUwMTQ2ZTc3ZjYyOTVhMDdiNjcxY2RjMWNjMTA3Y2VmZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTQ2YTc3OGMwNDY3MGMyZjkxYjAwYWY0NjgwZGZhOGJjZTM0OTA3MTdkNThiYTg4OWRkYjU5MjgzNjY2NDJiZScsXG4gICAgICAgICdiMzE4ZTBlYzMzNTQwMjhhZGQ2Njk4MjdmOWQ0YjI4NzBhYWE5NzFkMmY3ZTVlZDFkMGIyOTc0ODNkODNlZmQwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmYTUwYzBmNjFkMjJlNWYwN2UzYWNlYmIxYWEwN2IxMjhkMDAxMjIwOWEyOGI5Nzc2ZDc2YTg3OTMxODBlZWY5JyxcbiAgICAgICAgJzZiODRjNjkyMjM5N2ViYTliNzJjZDI4NzIyODFhNjhhNWU2ODMyOTNhNTdhMjEzYjM4Y2Q4ZDdkM2Y0ZjI4MTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RhMWQ2MWQwY2E3MjFhMTFiMWE1YmY2YjdkODhlODQyMWEyODhhYjVkNWJiYTUyMjBlNTNkMzJiNWYwNjdlYzInLFxuICAgICAgICAnODE1N2Y1NWE3Yzk5MzA2Yzc5YzA3NjYxNjFjOTFlMjk2NmE3Mzg5OWQyNzliNDhhNjU1ZmJhMGYxYWQ4MzZmMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYThlMjgyZmYwYzk3MDY5MDcyMTVmZjk4ZThmZDQxNjYxNTMxMWRlMDQ0NmYxZTA2MmE3M2IwNjEwZDA2NGUxMycsXG4gICAgICAgICc3Zjk3MzU1YjhkYjgxYzA5YWJmYjdmM2M1YjI1MTU4ODhiNjc5YTNlNTBkZDZiZDZjZWY3YzczMTExZjRjYzBjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNzRhNTNiOWM5YTI4NTg3MmQzOWU1NmU2OTEzY2FiMTVkNTliMWZhNTEyNTA4YzAyMmYzODJkZTgzMTk0OTdjJyxcbiAgICAgICAgJ2NjYzlkYzM3YWJmYzljMTY1N2I0MTU1ZjJjNDdmOWU2NjQ2YjNhMWQ4Y2I5ODU0MzgzZGExM2FjMDc5YWZhNzMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzk1OTM5Njk4MTk0Mzc4NWMzZDNlNTdlZGY1MDE4Y2RiZTAzOWU3MzBlNDkxOGIzZDg4NGZkZmYwOTQ3NWI3YmEnLFxuICAgICAgICAnMmU3ZTU1Mjg4OGMzMzFkZDhiYTAzODZhNGI5Y2Q2ODQ5YzY1M2Y2NGM4NzA5Mzg1ZTliOGFiZjg3NTI0ZjJmZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDJhNjNhNTBhZTQwMWU1NmQ2NDVhMTE1M2IxMDlhOGZjY2EwYTQzZDU2MWZiYTJkYmI1MTM0MGM5ZDgyYjE1MScsXG4gICAgICAgICdlODJkODZmYjY0NDNmY2I3NTY1YWVlNThiMjk0ODIyMGE3MGY3NTBhZjQ4NGNhNTJkNDE0MjE3NGRjZjg5NDA1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2NDU4N2UyMzM1NDcxZWI4OTBlZTc4OTZkN2NmZGM4NjZiYWNiZGJkMzgzOTMxN2IzNDM2ZjliNDU2MTdlMDczJyxcbiAgICAgICAgJ2Q5OWZjZGQ1YmY2OTAyZTJhZTk2ZGQ2NDQ3YzI5OWExODViOTBhMzkxMzNhZWFiMzU4Mjk5ZTVlOWZhZjY1ODknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg0ODFiZGUwZTRlNGQ4ODViM2E1NDZkM2U1NDlkZTA0MmYwYWE2Y2VhMjUwZTdmZDM1OGQ2Yzg2ZGQ0NWU0NTgnLFxuICAgICAgICAnMzhlZTdiOGNiYTU0MDRkZDg0YTI1YmYzOWNlY2IyY2E5MDBhNzljNDJiMjYyZTU1NmQ2NGIxYjU5Nzc5MDU3ZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTM0NjRhNTdhNzgxMDJhYTYyYjY5NzlhZTgxN2Y0NjM3ZmZjZmVkM2M0YjFjZTMwYmNkNjMwM2Y2Y2FmNjY2YicsXG4gICAgICAgICc2OWJlMTU5MDA0NjE0NTgwZWY3ZTQzMzQ1M2NjYjBjYTQ4ZjMwMGE4MWQwOTQyZTEzZjQ5NWE5MDdmNmVjYzI3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiYzRhOWRmNWI3MTNmZTJlOWFlZjQzMGJjYzFkYzk3YTBjZDljY2VkZTJmMjg1ODhjYWRhM2EwZDJkODNmMzY2JyxcbiAgICAgICAgJ2QzYTgxY2E2ZTc4NWMwNjM4MzkzN2FkZjRiNzk4Y2FhNmU4YTlmYmZhNTQ3YjE2ZDc1OGQ2NjY1ODFmMzNjMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGMyOGE5N2JmODI5OGJjMGQyM2Q4Yzc0OTQ1MmEzMmU2OTRiNjVlMzBhOTQ3MmEzOTU0YWIzMGZlNTMyNGNhYScsXG4gICAgICAgICc0MGEzMDQ2M2EzMzA1MTkzMzc4ZmVkZjMxZjdjYzBlYjdhZTc4NGYwNDUxY2I5NDU5ZTcxZGM3M2NiZWY5NDgyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4ZWE5NjY2MTM5NTI3YThjMWRkOTRjZTRmMDcxZmQyM2M4YjM1MGM1YTRiYjMzNzQ4YzRiYTExMWZhY2NhZTAnLFxuICAgICAgICAnNjIwZWZhYmJjOGVlMjc4MmUyNGU3YzBjZmI5NWM1ZDczNWI3ODNiZTljZjBmOGU5NTVhZjM0YTMwZTYyYjk0NScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGQzNjI1ZmFlZjViYTA2MDc0NjY5NzE2YmJkMzc4OGQ4OWJkZGU4MTU5NTk5NjgwOTJmNzZjYzRlYjlhOTc4NycsXG4gICAgICAgICc3YTE4OGZhMzUyMGUzMGQ0NjFkYTI1MDEwNDU3MzFjYTk0MTQ2MTk4Mjg4MzM5NTkzN2Y2OGQwMGM2NDRhNTczJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmNzEwZDc5ZDllYjk2MjI5N2U0ZjYyMzJiNDBlOGY3ZmViMmJjNjM4MTQ2MTRkNjkyYzEyZGU3NTI0MDgyMjFlJyxcbiAgICAgICAgJ2VhOThlNjcyMzJkM2IzMjk1ZDNiNTM1NTMyMTE1Y2NhYzg2MTJjNzIxODUxNjE3NTI2YWU0N2E5Yzc3YmZjODInLFxuICAgICAgXSxcbiAgICBdLFxuICB9LFxuICBuYWY6IHtcbiAgICB3bmQ6IDcsXG4gICAgcG9pbnRzOiBbXG4gICAgICBbXG4gICAgICAgICdmOTMwOGEwMTkyNThjMzEwNDkzNDRmODVmODlkNTIyOWI1MzFjODQ1ODM2Zjk5YjA4NjAxZjExM2JjZTAzNmY5JyxcbiAgICAgICAgJzM4OGY3YjBmNjMyZGU4MTQwZmUzMzdlNjJhMzdmMzU2NjUwMGE5OTkzNGMyMjMxYjZjYjlmZDc1ODRiOGU2NzInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzJmOGJkZTRkMWEwNzIwOTM1NWI0YTcyNTBhNWM1MTI4ZTg4Yjg0YmRkYzYxOWFiN2NiYThkNTY5YjI0MGVmZTQnLFxuICAgICAgICAnZDhhYzIyMjYzNmU1ZTNkNmQ0ZGJhOWRkYTZjOWM0MjZmNzg4MjcxYmFiMGQ2ODQwZGNhODdkM2FhNmFjNjJkNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNWNiZGYwNjQ2ZTVkYjRlYWEzOThmMzY1ZjJlYTdhMGUzZDQxOWI3ZTAzMzBlMzljZTkyYmRkZWRjYWM0ZjliYycsXG4gICAgICAgICc2YWViY2E0MGJhMjU1OTYwYTMxNzhkNmQ4NjFhNTRkYmE4MTNkMGI4MTNmZGU3YjVhNTA4MjYyODA4NzI2NGRhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhY2Q0ODRlMmYwYzdmNjUzMDlhZDE3OGE5ZjU1OWFiZGUwOTc5Njk3NGM1N2U3MTRjMzVmMTEwZGZjMjdjY2JlJyxcbiAgICAgICAgJ2NjMzM4OTIxYjBhN2Q5ZmQ2NDM4MDk3MTc2M2I2MWU5YWRkODg4YTQzNzVmOGUwZjA1Y2MyNjJhYzY0ZjljMzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3NGFlN2Y4NThhOTQxMWU1ZWY0MjQ2YjcwYzY1YWFjNTY0OTk4MGJlNWMxNzg5MWJiZWMxNzg5NWRhMDA4Y2InLFxuICAgICAgICAnZDk4NGEwMzJlYjZiNWUxOTAyNDNkZDU2ZDdiN2IzNjUzNzJkYjFlMmRmZjlkNmE4MzAxZDc0YzljOTUzYzYxYicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjI4NzczYzJkOTc1Mjg4YmM3ZDFkMjA1YzM3NDg2NTFiMDc1ZmJjNjYxMGU1OGNkZGVlZGRmOGYxOTQwNWFhOCcsXG4gICAgICAgICdhYjA5MDJlOGQ4ODBhODk3NTgyMTJlYjY1Y2RhZjQ3M2ExYTA2ZGE1MjFmYTkxZjI5YjVjYjUyZGIwM2VkODEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q3OTI0ZDRmN2Q0M2VhOTY1YTQ2NWFlMzA5NWZmNDExMzFlNTk0NmYzYzg1Zjc5ZTQ0YWRiY2Y4ZTI3ZTA4MGUnLFxuICAgICAgICAnNTgxZTI4NzJhODZjNzJhNjgzODQyZWMyMjhjYzZkZWZlYTQwYWYyYmQ4OTZkM2E1YzUwNGRjOWZmNmEyNmI1OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGVmZGVhNGNkYjY3Nzc1MGE0MjBmZWU4MDdlYWNmMjFlYjk4OThhZTc5Yjk3Njg3NjZlNGZhYTA0YTJkNGEzNCcsXG4gICAgICAgICc0MjExYWIwNjk0NjM1MTY4ZTk5N2IwZWFkMmE5M2RhZWNlZDFmNGEwNGE5NWMwZjZjZmIxOTlmNjllNTZlYjc3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyYjRlYTBhNzk3YTQ0M2QyOTNlZjVjZmY0NDRmNDk3OWYwNmFjZmViZDdlODZkMjc3NDc1NjU2MTM4Mzg1YjZjJyxcbiAgICAgICAgJzg1ZTg5YmMwMzc5NDVkOTNiMzQzMDgzYjVhMWM4NjEzMWEwMWY2MGM1MDI2OTc2M2I1NzBjODU0ZTVjMDliN2EnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM1MmJiZjRhNGNkZDEyNTY0ZjkzZmEzMzJjZTMzMzMwMWQ5YWQ0MDI3MWY4MTA3MTgxMzQwYWVmMjViZTU5ZDUnLFxuICAgICAgICAnMzIxZWI0MDc1MzQ4ZjUzNGQ1OWMxODI1OWRkYTNlMWY0YTFiM2IyZTcxYjEwMzljNjdiZDNkOGJjZjgxOTk4YycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMmZhMjEwNGQ2YjM4ZDExYjAyMzAwMTA1NTk4NzkxMjRlNDJhYjhkZmVmZjVmZjI5ZGM5Y2RhZGQ0ZWNhY2MzZicsXG4gICAgICAgICcyZGUxMDY4Mjk1ZGQ4NjViNjQ1NjkzMzViZDVkZDgwMTgxZDcwZWNmYzg4MjY0ODQyM2JhNzZiNTMyYjdkNjcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkyNDgyNzliMDliNGQ2OGRhYjIxYTliMDY2ZWRkYTgzMjYzYzNkODRlMDk1NzJlMjY5Y2EwY2Q3ZjU0NTM3MTQnLFxuICAgICAgICAnNzMwMTZmN2JmMjM0YWFkZTVkMWFhNzFiZGVhMmIxZmYzZmMwZGUyYTg4NzkxMmZmZTU0YTMyY2U5N2NiMzQwMicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGFlZDRmMmJlM2E4YmYyNzhlNzAxMzJmYjBiZWI3NTIyZjU3MGUxNDRiZjYxNWMwN2U5OTZkNDQzZGVlODcyOScsXG4gICAgICAgICdhNjlkY2U0YTdkNmM5OGU4ZDRhMWFjYTg3ZWY4ZDcwMDNmODNjMjMwZjNhZmE3MjZhYjQwZTUyMjkwYmUxYzU1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjNDRkMTJjNzA2NWQ4MTJlOGFjZjI4ZDdjYmIxOWY5MDExZWNkOWU5ZmRmMjgxYjBlNmEzYjVlODdkMjJlN2RiJyxcbiAgICAgICAgJzIxMTlhNDYwY2UzMjZjZGM3NmM0NTkyNmM5ODJmZGFjMGUxMDZlODYxZWRmNjFjNWEwMzkwNjNmMGUwZTY0ODInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzZhMjQ1YmY2ZGM2OTg1MDRjODlhMjBjZmRlZDYwODUzMTUyYjY5NTMzNmMyODA2M2I2MWM2NWNiZDI2OWU2YjQnLFxuICAgICAgICAnZTAyMmNmNDJjMmJkNGE3MDhiM2Y1MTI2ZjE2YTI0YWQ4YjMzYmE0OGQwNDIzYjZlZmQ1ZTYzNDgxMDBkOGE4MicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTY5N2ZmYTZmZDlkZTYyN2MwNzdlM2QyZmU1NDEwODRjZTEzMzAwYjBiZWMxMTQ2Zjk1YWU1N2YwZDBiZDZhNScsXG4gICAgICAgICdiOWMzOThmMTg2ODA2ZjVkMjc1NjE1MDZlNDU1NzQzM2EyY2YxNTAwOWU0OThhZTdhZGVlOWQ2M2QwMWIyMzk2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2MDViZGIwMTk5ODE3MThiOTg2ZDBmMDdlODM0Y2IwZDlkZWI4MzYwZmZiN2Y2MWRmOTgyMzQ1ZWYyN2E3NDc5JyxcbiAgICAgICAgJzI5NzJkMmRlNGY4ZDIwNjgxYTc4ZDkzZWM5NmZlMjNjMjZiZmFlODRmYjE0ZGI0M2IwMWUxZTkwNTZiOGM0OScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjJkMTRkYWI0MTUwYmY0OTc0MDJmZGM0NWEyMTVlMTBkY2IwMWMzNTQ5NTliMTBjZmUzMWM3ZTlkODdmZjMzZCcsXG4gICAgICAgICc4MGZjMDZiZDhjYzViMDEwOTgwODhhMTk1MGVlZDBkYjAxYWExMzI5NjdhYjQ3MjIzNWY1NjQyNDgzYjI1ZWFmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4MGM2MGFkMDA0MGYyN2RhZGU1YjRiMDZjNDA4ZTU2YjJjNTBlOWY1NmI5YjhiNDI1ZTU1NWMyZjg2MzA4YjZmJyxcbiAgICAgICAgJzFjMzgzMDNmMWNjNWMzMGYyNmU2NmJhZDdmZTcyZjcwYTY1ZWVkNGNiZTcwMjRlYjFhYTAxZjU2NDMwYmQ1N2EnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzdhOTM3NWFkNjE2N2FkNTRhYTc0YzYzNDhjYzU0ZDM0NGNjNWRjOTQ4N2Q4NDcwNDlkNWVhYmIwZmEwM2M4ZmInLFxuICAgICAgICAnZDBlM2ZhOWVjYTg3MjY5MDk1NTllMGQ3OTI2OTA0NmJkYzU5ZWExMGM3MGNlMmIwMmQ0OTllYzIyNGRjN2Y3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNTI4ZWNkOWI2OTZiNTRjOTA3YTllZDA0NTQ0N2E3OWJiNDA4ZWMzOWI2OGRmNTA0YmI1MWY0NTliYzNmZmM5JyxcbiAgICAgICAgJ2VlY2Y0MTI1MzEzNmU1Zjk5OTY2ZjIxODgxZmQ2NTZlYmM0MzQ1NDA1YzUyMGRiYzA2MzQ2NWI1MjE0MDk5MzMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQ5MzcwYTRiNWY0MzQxMmVhMjVmNTE0ZThlY2RhZDA1MjY2MTE1ZTRhN2VjYjEzODcyMzE4MDhmOGI0NTk2MycsXG4gICAgICAgICc3NThmM2Y0MWFmZDZlZDQyOGIzMDgxYjA1MTJmZDYyYTU0YzNmM2FmYmI1YjY3NjRiNjUzMDUyYTEyOTQ5YzlhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3N2YyMzA5MzZlZTg4Y2JiZDczZGY5MzBkNjQ3MDJlZjg4MWQ4MTFlMGUxNDk4ZTJmMWMxM2ViMWZjMzQ1ZDc0JyxcbiAgICAgICAgJzk1OGVmNDJhNzg4NmI2NDAwYTA4MjY2ZTliYTFiMzc4OTZjOTUzMzBkOTcwNzdjYmJlOGViM2M3NjcxYzYwZDYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YyZGFjOTkxY2M0Y2U0YjllYTQ0ODg3ZTVjN2MwYmNlNThjODAwNzRhYjlkNGRiYWViMjg1MzFiNzczOWY1MzAnLFxuICAgICAgICAnZTBkZWRjOWIzYjJmOGRhZDRkYTFmMzJkZWMyNTMxZGY5ZWI1ZmJlYjA1OThlNGZkMWExMTdkYmE3MDNhM2MzNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDYzYjNkOWY2NjI2MjFmYjFiNGJlOGZiYmUyNTIwMTI1YTIxNmNkZmM5ZGFlM2RlYmNiYTQ4NTBjNjkwZDQ1YicsXG4gICAgICAgICc1ZWQ0MzBkNzhjMjk2YzM1NDMxMTQzMDZkZDg2MjJkN2M2MjJlMjdjOTcwYTFkZTMxY2IzNzdiMDFhZjczMDdlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMTZmODA0MjQ0ZTQ2ZTJhMDkyMzJkNGFmZjNiNTk5NzZiOThmYWMxNDMyOGEyZDFhMzI0OTZiNDk5OThmMjQ3JyxcbiAgICAgICAgJ2NlZGFiZDliODIyMDNmN2UxM2QyMDZmY2RmNGUzM2Q5MmE2YzUzYzI2ZTVjY2UyNmQ2NTc5OTYyYzRlMzFkZjYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2NhZjc1NDI3MmRjODQ1NjNiMDM1MmI3YTE0MzExYWY1NWQyNDUzMTVhY2UyN2M2NTM2OWUxNWY3MTUxZDQxZDEnLFxuICAgICAgICAnY2I0NzQ2NjBlZjM1ZjVmMmE0MWI2NDNmYTVlNDYwNTc1ZjRmYTliNzk2MjIzMmE1YzMyZjkwODMxOGEwNDQ3NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMjYwMGNhNGIyODJjYjk4NmY4NWQwZjE3MDk5NzlkOGI0NGEwOWMwN2NiODZkN2MxMjQ0OTdiYzg2ZjA4MjEyMCcsXG4gICAgICAgICc0MTE5Yjg4NzUzYzE1YmQ2YTY5M2IwM2ZjZGRiYjQ1ZDVhYzZiZTc0YWI1ZjBlZjQ0YjBiZTk0NzVhN2U0YjQwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NjM1Y2E3MmQ3ZTg0MzJjMzM4ZWM1M2NkMTIyMjBiYzAxYzQ4Njg1ZTI0ZjdkYzhjNjAyYTc3NDY5OThlNDM1JyxcbiAgICAgICAgJzkxYjY0OTYwOTQ4OWQ2MTNkMWQ1ZTU5MGY3OGU2ZDc0ZWNmYzA2MWQ1NzA0OGJhZDllNzZmMzAyYzViOWM2MScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzU0ZTMyMzlmMzI1NTcwY2RiYmY0YTg3ZGVlZThhNjZiN2YyYjMzNDc5ZDQ2OGZiYzFhNTA3NDNiZjU2Y2MxOCcsXG4gICAgICAgICc2NzNmYjg2ZTViZGEzMGZiM2NkMGVkMzA0ZWE0OWEwMjNlZTMzZDAxOTdhNjk1ZDBjNWQ5ODA5M2M1MzY2ODMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UzZTZiZDEwNzFhMWU5NmFmZjU3ODU5YzgyZDU3MGYwMzMwODAwNjYxZDFjOTUyZjlmZTI2OTQ2OTFkOWI5ZTgnLFxuICAgICAgICAnNTljOWUwYmJhMzk0ZTc2ZjQwYzBhYTU4Mzc5YTNjYjZhNWEyMjgzOTkzZTkwYzQxNjcwMDJhZjQ5MjBlMzdmNScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTg2YjQ4M2QwNTZhMDMzODI2YWU3M2Q4OGY3MzI5ODVjNGNjYjFmMzJiYTM1ZjRiNGNjNDdmZGNmMDRhYTZlYicsXG4gICAgICAgICczYjk1MmQzMmM2N2NmNzdlMmUxNzQ0NmUyMDQxODBhYjIxZmI4MDkwODk1MTM4YjRhNGE3OTdmODZlODA4ODhiJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkZjlkNzBhNmI5ODc2Y2U1NDRjOTg1NjFmNGJlNGY3MjU0NDJlNmQyYjczN2Q5YzkxYTgzMjE3MjRjZTA5NjNmJyxcbiAgICAgICAgJzU1ZWIyZGFmZDg0ZDZjY2Q1Zjg2MmI3ODVkYzM5ZDRhYjE1NzIyMjcyMGVmOWRhMjE3YjhjNDVjZjJiYTI0MTcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzVlZGQ1Y2MyM2M1MWU4N2E0OTdjYTgxNWQ1ZGNlMGY4YWI1MjU1NGY4NDllZDg5OTVkZTY0YzVmMzRjZTcxNDMnLFxuICAgICAgICAnZWZhZTljOGRiYzE0MTMwNjYxZThjZWMwMzBjODlhZDBjMTNjNjZjMGQxN2EyOTA1Y2RjNzA2YWI3Mzk5YTg2OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMjkwNzk4YzJiNjQ3NjgzMGRhMTJmZTAyMjg3ZTllNzc3YWEzZmJhMWMzNTViMTdhNzIyZDM2MmY4NDYxNGZiYScsXG4gICAgICAgICdlMzhkYTc2ZGNkNDQwNjIxOTg4ZDAwYmNmNzlhZjI1ZDViMjljMDk0ZGIyYTIzMTQ2ZDAwM2FmZDQxOTQzZTdhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhZjNjNDIzYTk1ZDlmNWIzMDU0NzU0ZWZhMTUwYWMzOWNkMjk1NTJmZTM2MDI1NzM2MmRmZGVjZWY0MDUzYjQ1JyxcbiAgICAgICAgJ2Y5OGEzZmQ4MzFlYjJiNzQ5YTkzYjBlNmYzNWNmYjQwYzhjZDVhYTY2N2ExNTU4MWJjMmZlZGVkNDk4ZmQ5YzYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc2NmRiYjI0ZDEzNGU3NDVjY2NhYTI4Yzk5YmYyNzQ5MDZiYjY2YjI2ZGNmOThkZjhkMmZlZDUwZDg4NDI0OWEnLFxuICAgICAgICAnNzQ0YjExNTJlYWNiZTVlMzhkY2M4ODc5ODBkYTM4Yjg5NzU4NGE2NWZhMDZjZWRkMmM5MjRmOTdjYmFjNTk5NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNTlkYmY0NmY4Yzk0NzU5YmEyMTI3N2MzMzc4NGY0MTY0NWY3YjQ0ZjZjNTk2YTU4Y2U5MmU2NjYxOTFhYmUzZScsXG4gICAgICAgICdjNTM0YWQ0NDE3NWZiYzMwMGY0ZWE2Y2U2NDgzMDlhMDQyY2U3MzlhNzkxOTc5OGNkODVlMjE2YzRhMzA3ZjZlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMTNhZGE5NTEwM2M0NTM3MzA1ZTY5MWU3NGU5YTRhOGRkNjQ3ZTcxMWE5NWU3M2NiNjJkYzYwMThjZmQ4N2I4JyxcbiAgICAgICAgJ2UxMzgxN2I0NGVlMTRkZTY2M2JmNGJjODA4MzQxZjMyNjk0OWUyMWE2YTc1YzI1NzA3Nzg0MTliZGFmNTczM2QnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3NTRiNGZhMGU4YWNlZDA2ZDQxNjdhMmM1OWNjYTRjZGExODY5YzA2ZWJhZGZiNjQ4ODU1MDAxNWE4ODUyMmMnLFxuICAgICAgICAnMzBlOTNlODY0ZTY2OWQ4MjIyNGI5NjdjMzAyMGI4ZmE4ZDFlNGUzNTBiNmNiY2M1MzdhNDhiNTc4NDExNjNhMicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTQ4ZGNhZGY1OTkwZTA0OGFhMzg3NGQ0NmFiZWY5ZDcwMTg1OGY5NWRlODA0MWQyYTY4MjhjOTllMjI2MjUxOScsXG4gICAgICAgICdlNDkxYTQyNTM3ZjZlNTk3ZDVkMjhhMzIyNGIxYmMyNWRmOTE1NGVmYmQyZWYxZDJjYmJhMmNhZTUzNDdkNTdlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3OTYyNDE0NDUwYzc2YzE2ODljN2I0OGY4MjAyZWMzN2ZiMjI0Y2Y1YWMwYmZhMTU3MDMyOGE4YTNkN2M3N2FiJyxcbiAgICAgICAgJzEwMGI2MTBlYzRmZmI0NzYwZDVjMWZjMTMzZWY2ZjZiMTI1MDdhMDUxZjA0YWM1NzYwYWZhNWIyOWRiODM0MzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM1MTQwODc4MzQ5NjRiNTRiMTViMTYwNjQ0ZDkxNTQ4NWExNjk3NzIyNWI4ODQ3YmIwZGQwODUxMzdlYzQ3Y2EnLFxuICAgICAgICAnZWYwYWZiYjIwNTYyMDU0NDhlMTY1MmM0OGU4MTI3ZmM2MDM5ZTc3YzE1YzIzNzhiN2U3ZDE1YTBkZTI5MzMxMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDNjYzMwYWQ2YjQ4M2U0YmM3OWNlMmM5ZGQ4YmM1NDk5M2U5NDdlYjhkZjc4N2I0NDI5NDNkM2Y3YjUyN2VhZicsXG4gICAgICAgICc4YjM3OGEyMmQ4MjcyNzhkODljNWU5YmU4Zjk1MDhhZTNjMmFkNDYyOTAzNTg2MzBhZmIzNGRiMDRlZWRlMGE0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNjI0ZDg0NzgwNzMyODYwY2UxYzc4ZmNiZmVmZTA4YjJiMjk4MjNkYjkxM2Y2NDkzOTc1YmEwZmY0ODQ3NjEwJyxcbiAgICAgICAgJzY4NjUxY2Y5YjZkYTkwM2UwOTE0NDQ4YzZjZDlkNGNhODk2ODc4ZjUyODJiZTRjOGNjMDZlMmE0MDQwNzg1NzUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzczM2NlODBkYTk1NWE4YTI2OTAyYzk1NjMzZTYyYTk4NTE5MjQ3NGI1YWYyMDdkYTZkZjdiNGZkNWZjNjFjZDQnLFxuICAgICAgICAnZjU0MzVhMmJkMmJhZGY3ZDQ4NWE0ZDhiOGRiOWZjY2UzZTFlZjhlMDIwMWU0NTc4YzU0NjczYmMxZGM1ZWExZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTVkOTQ0MTI1NDk0NTA2NGNmMWExYzMzYmJkM2I0OWY4OTY2YzUwOTIxNzFlNjk5ZWYyNThkZmFiODFjMDQ1YycsXG4gICAgICAgICdkNTZlYjMwYjY5NDYzZTcyMzRmNTEzN2I3M2I4NDE3NzQzNDgwMGJhY2ViZmM2ODVmYzM3YmJlOWVmZTQwNzBkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhMWQwZmNmMmVjOWRlNjc1YjYxMjEzNmU1Y2U3MGQyNzFjMjE0MTdjOWQyYjhhYWFhYzEzODU5OWQwNzE3OTQwJyxcbiAgICAgICAgJ2VkZDc3ZjUwYmNiNWEzY2FiMmU5MDczNzMwOTY2N2YyNjQxNDYyYTU0MDcwZjNkNTE5MjEyZDM5YzE5N2E2MjknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UyMmZiZTE1YzBhZjhjY2M1NzgwYzA3MzVmODRkYmU5YTc5MGJhZGVlODI0NWMwNmM3Y2EzNzMzMWNiMzY5ODAnLFxuICAgICAgICAnYTg1NWJhYmFkNWNkNjBjODhiNDMwYTY5ZjUzYTFhN2EzODI4OTE1NDk2NDc5OWJlNDNkMDZkNzdkMzFkYTA2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMTEwOTFkZDk4NjBlOGUyMGVlMTM0NzNjMTE1NWY1ZjY5NjM1ZTM5NDcwNGVhYTc0MDA5NDUyMjQ2Y2ZhOWIzJyxcbiAgICAgICAgJzY2ZGI2NTZmODdkMWYwNGZmZmQxZjA0Nzg4YzA2ODMwODcxZWM1YTY0ZmVlZTY4NWJkODBmMGIxMjg2ZDgzNzQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM0YzFmZDA0ZDMwMWJlODliMzFjMDQ0MmQzZTZhYzI0ODgzOTI4YjQ1YTkzNDA3ODE4NjdkNDIzMmVjMmRiZGYnLFxuICAgICAgICAnOTQxNDY4NWU5N2IxYjU5NTRiZDQ2ZjczMDE3NDEzNmQ1N2YxY2VlYjQ4NzQ0M2RjNTMyMTg1N2JhNzNhYmVlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMjE5ZWE1ZDZiNTQ3MDFjMWMxNGRlNWI1NTdlYjQyYThkMTNmM2FiYmNkMDhhZmZjYzJhNWU2YjA0OWI4ZDYzJyxcbiAgICAgICAgJzRjYjk1OTU3ZTgzZDQwYjBmNzNhZjQ1NDRjY2NmNmIxZjRiMDhkM2MwN2IyN2ZiOGQ4YzI5NjJhNDAwNzY2ZDEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q3Yjg3NDBmNzRhOGZiYWFiMWY2ODNkYjhmNDVkZTI2NTQzYTU0OTBiY2E2MjcwODcyMzY5MTI0NjlhMGI0NDgnLFxuICAgICAgICAnZmE3Nzk2ODEyOGQ5YzkyZWUxMDEwZjMzN2FkNDcxN2VmZjE1ZGI1ZWQzYzA0OWIzNDExZTAzMTVlYWE0NTkzYicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzJkMzFjMjIyZjhmNmYwZWY4NmY3Yzk4ZDNhMzMzNWVhZDViY2QzMmFiZGQ5NDI4OWZlNGQzMDkxYWE4MjRiZicsXG4gICAgICAgICc1ZjMwMzJmNTg5MjE1NmUzOWNjZDNkNzkxNWI5ZTFkYTJlNmRhYzllNmYyNmU5NjExMThkMTRiODQ2MmUxNjYxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NDYxZjM3MTkxNGFiMzI2NzEwNDVhMTU1ZDk4MzFlYTg3OTNkNzdjZDU5NTkyYzQzNDBmODZjYmMxODM0N2I1JyxcbiAgICAgICAgJzhlYzBiYTIzOGI5NmJlYzBjYmRkZGNhZTBhYTQ0MjU0MmVlZTFmZjUwYzk4NmVhNmIzOTg0N2IzY2MwOTJmZjYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VlMDc5YWRiMWRmMTg2MDA3NDM1NmEyNWFhMzgyMDZhNmQ3MTZiMmMzZTY3NDUzZDI4NzY5OGJhZDdiMmIyZDYnLFxuICAgICAgICAnOGRjMjQxMmFhZmUzYmU1YzRjNWYzN2UwZWNjNWY5ZjZhNDQ2OTg5YWYwNGM0ZTI1ZWJhYWM0NzllYzFjOGMxZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTZlYzkzZTQ0N2VjODNmMDQ2N2IxODMwMmVlNjIwZjdlNjVkZTMzMTg3NGM5ZGM3MmJmZDg2MTZiYTlkYTZiNScsXG4gICAgICAgICc1ZTQ2MzExNTBlNjJmYjQwZDBlOGMyYTdjYTU4MDRhMzlkNTgxODZhNTBlNDk3MTM5NjI2Nzc4ZTI1YjA2NzRkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlYWE1Zjk4MGMyNDVmNmYwMzg5NzgyOTBhZmE3MGI2YmQ4ODU1ODk3Zjk4YjZhYTQ4NWI5NjA2NWQ1MzdiZDk5JyxcbiAgICAgICAgJ2Y2NWY1ZDNlMjkyYzJlMDgxOWE1MjgzOTFjOTk0NjI0ZDc4NDg2OWQ3ZTZlYTY3ZmIxODA0MTAyNGVkYzA3ZGMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc4Yzk0MDc1NDRhYzEzMjY5MmVlMTkxMGEwMjQzOTk1OGFlMDQ4NzcxNTEzNDJlYTk2YzRiNmIzNWE0OWY1MScsXG4gICAgICAgICdmM2UwMzE5MTY5ZWI5Yjg1ZDU0MDQ3OTU1MzlhNWU2OGZhMWZiZDU4M2MwNjRkMjQ2MmI2NzVmMTk0YTNkZGI0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0OTRmNGJlMjE5YTFhNzcwMTZkY2Q4Mzg0MzFhZWEwMDAxY2RjOGFlN2E2ZmM2ODg3MjY1NzhkOTcwMjg1N2E1JyxcbiAgICAgICAgJzQyMjQyYTk2OTI4M2E1ZjMzOWJhN2YwNzVlMzZiYTJhZjkyNWNlMzBkNzY3ZWQ2ZTU1ZjRiMDMxODgwZDU2MmMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E1OThhODAzMGRhNmQ4NmM2YmM3ZjJmNTE0NGVhNTQ5ZDI4MjExZWE1OGZhYTcwZWJmNGMxZTY2NWMxZmU5YjUnLFxuICAgICAgICAnMjA0YjVkNmY4NDgyMmMzMDdlNGI0YTcxNDA3MzdhZWMyM2ZjNjNiNjViMzVmODZhMTAwMjZkYmQyZDg2NGU2YicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzQxOTE2MzY1YWJiMmI1ZDA5MTkyZjVmMmRiZWFmZWMyMDhmMDIwZjEyNTcwYTE4NGRiYWRjM2U1ODU5NTk5NycsXG4gICAgICAgICc0ZjE0MzUxZDAwODdlZmE0OWQyNDViMzI4OTg0OTg5ZDVjYWY5NDUwZjM0YmZjMGVkMTZlOTZiNThmYTk5MTMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg0MWQ2MDYzYTU4NmZhNDc1YTcyNDYwNGRhMDNiYzViOTJhMmUwZDJlMGEzNmFjZmU0YzczYTU1MTQ3NDI4ODEnLFxuICAgICAgICAnNzM4NjdmNTljMDY1OWU4MTkwNGY5YTFjNzU0MzY5OGU2MjU2MmQ2NzQ0YzE2OWNlN2EzNmRlMDFhOGQ2MTU0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1ZTk1YmIzOTlhNjk3MWQzNzYwMjY5NDdmODliZGUyZjI4MmIzMzgxMDkyOGJlNGRlZDExMmFjNGQ3MGUyMGQ1JyxcbiAgICAgICAgJzM5ZjIzZjM2NjgwOTA4NWJlZWJmYzcxMTgxMzEzNzc1YTk5YzlhZWQ3ZDhiYTM4YjE2MTM4NGM3NDYwMTI4NjUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM2ZTQ2NDFhNTM5NDhmZDQ3NmMzOWY4YTk5ZmQ5NzRlNWVjMDc1NjRiNTMxNWQ4YmY5OTQ3MWJjYTBlZjJmNjYnLFxuICAgICAgICAnZDI0MjRiMWIxYWJlNGViODE2NDIyN2IwODVjOWFhOTQ1NmVhMTM0OTNmZDU2M2UwNmZkNTFjZjU2OTRjNzhmYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzM2NTgxZWE3YmZiYmIyOTBjMTkxYTJmNTA3YTQxY2Y1NjQzODQyMTcwZTkxNGZhZWFiMjdjMmM1NzlmNzI2JyxcbiAgICAgICAgJ2VhZDEyMTY4NTk1ZmUxYmU5OTI1MjEyOWI2ZTU2YjMzOTFmN2FiMTQxMGNkMWUwZWYzZGNkY2FiZDJmZGEyMjQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhhYjg5ODE2ZGFkZmQ2YjZhMWYyNjM0ZmNmMDBlYzg0MDM3ODEwMjVlZDY4OTBjNDg0OTc0MjcwNmJkNDNlZGUnLFxuICAgICAgICAnNmZkY2VmMDlmMmY2ZDBhMDQ0ZTY1NGFlZjYyNDEzNmY1MDNkNDU5YzNlODk4NDU4NThhNDdhOTEyOWNkZDI0ZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMWUzM2YxYTc0NmM5YzU3NzgxMzMzNDRkOTI5OWZjYWEyMGIwOTM4ZThhY2ZmMjU0NGJiNDAyODRiOGM1ZmI5NCcsXG4gICAgICAgICc2MDY2MDI1N2RkMTFiM2FhOWM4ZWQ2MThkMjRlZGZmMjMwNmQzMjBmMWQwMzAxMGUzM2E3ZDIwNTdmM2IzYjYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg1YjdjMWRjYjNjZWMxYjdlZTdmMzBkZWQ3OWRkMjBhMGVkMWY0Y2MxOGNiY2ZjZmE0MTAzNjFmZDhmMDhmMzEnLFxuICAgICAgICAnM2Q5OGE5Y2RkMDI2ZGQ0M2YzOTA0OGYyNWE4ODQ3ZjRmY2FmYWQxODk1ZDdhNjMzYzZmZWQzYzM1ZTk5OTUxMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMjlkZjlmYmQ4ZDllNDY1MDkyNzVmNGIxMjVkNmQ0NWQ3ZmJlOWEzYjg3OGE3YWY4NzJhMjgwMDY2MWFjNWY1MScsXG4gICAgICAgICdiNGM0ZmU5OWM3NzVhNjA2ZTJkODg2MjE3OTEzOWZmZGE2MWRjODYxYzAxOWU1NWNkMjg3NmViMmEyN2Q4NGInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2EwYjFjYWUwNmIwYTg0N2EzZmVhNmU2NzFhYWY4YWRmZGZlNThjYTJmNzY4MTA1YzgwODJiMmU0NDlmY2UyNTInLFxuICAgICAgICAnYWU0MzQxMDJlZGRlMDk1OGVjNGIxOWQ5MTdhNmEyOGU2YjcyZGExODM0YWZmMGU2NTBmMDQ5NTAzYTI5NmNmMicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNGU4Y2VhZmI5YjNlOWExMzZkYzdmZjY3ZTg0MDI5NWI0OTlkZmIzYjIxMzNlNGJhMTEzZjJlNGMwZTEyMWU1JyxcbiAgICAgICAgJ2NmMjE3NDExOGM4YjZkN2E0YjQ4ZjZkNTM0Y2U1Yzc5NDIyYzA4NmE2MzQ2MDUwMmI4MjdjZTYyYTMyNjY4M2MnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QyNGE0NGUwNDdlMTliNmY1YWZiODFjN2NhMmY2OTA4MGE1MDc2Njg5YTAxMDkxOWY0MjcyNWMyYjc4OWEzM2InLFxuICAgICAgICAnNmZiOGQ1NTkxYjQ2NmY4ZmM2M2RiNTBmMWMwZjFjNjkwMTNmOTk2ODg3YjgyNDRkMmNkZWM0MTdhZmVhOGZhMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWEwMTYwNmE3YTZjOWNkZDI0OWZkZmNmYWNiOTk1ODQwMDFlZGQyOGFiYmFiNzdiNTEwNGU5OGU4ZTNiMzVkNCcsXG4gICAgICAgICczMjJhZjQ5MDhjNzMxMmIwY2ZiZmUzNjlmN2E3YjNjZGI3ZDQ0OTRiYzI4MjM3MDBjZmQ2NTIxODhhM2VhOThkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhZjhhZGRiZjJiNjYxYzhhNmM2MzI4NjU1ZWI5NjY1MTI1MjAwN2Q4YzVlYTMxYmU0YWQxOTZkZThjZTIxMzFmJyxcbiAgICAgICAgJzY3NDllNjdjMDI5Yjg1ZjUyYTAzNGVhZmQwOTY4MzZiMjUyMDgxODY4MGUyNmFjOGYzZGZiY2RiNzE3NDk3MDAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UzYWUxOTc0NTY2Y2EwNmNjNTE2ZDQ3ZTBmYjE2NWE2NzRhM2RhYmNmY2ExNWU3MjJmMGUzNDUwZjQ1ODg5JyxcbiAgICAgICAgJzJhZWFiZTdlNDUzMTUxMDExNjIxN2YwN2JmNGQwNzMwMGRlOTdlNDg3NGY4MWY1MzM0MjBhNzJlZWIwYmQ2YTQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzU5MWVlMzU1MzEzZDk5NzIxY2Y2OTkzZmZlZDFlM2UzMDE5OTNmZjNlZDI1ODgwMjA3NWVhOGNlZDM5N2UyNDYnLFxuICAgICAgICAnYjBlYTU1OGExMTNjMzBiZWE2MGZjNDc3NTQ2MGM3OTAxZmYwYjA1M2QyNWNhMmJkZWVlOThmMWE0YmU1ZDE5NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTEzOTZkNTVmZGE1NGM0OWYxOWFhOTczMThkOGRhNjFmYTg1ODRlNDdiMDg0OTQ1MDc3Y2YwMzI1NWI1Mjk4NCcsXG4gICAgICAgICc5OThjNzRhOGNkNDVhYzAxMjg5ZDU4MzNhN2JlYjQ3NDRmZjUzNmIwMWIyNTdiZTRjNTc2N2JlYTkzZWE1N2E0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczYzVkMmExYmEzOWM1YTE3OTAwMDA3MzhjOWUwYzQwYjhkY2RmZDU0Njg3NTRiNjQwNTU0MDE1N2UwMTdhYTdhJyxcbiAgICAgICAgJ2IyMjg0Mjc5OTk1YTM0ZTJmOWQ0ZGU3Mzk2ZmMxOGI4MGY5YjhiOWZkZDI3MGY2NjYxZjc5Y2E0YzgxYmQyNTcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2NjODcwNGI4YTYwYTBkZWZhM2E5OWE3Mjk5ZjJlOWMzZmJjMzk1YWZiMDRhYzA3ODQyNWVmOGExNzkzY2MwMzAnLFxuICAgICAgICAnYmRkNDYwMzlmZWVkMTc4ODFkMWUwODYyZGIzNDdmOGNmMzk1Yjc0ZmM0YmNkYzRlOTQwYjc0ZTNhYzFmMWIxMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzUzM2U0ZjdlYTg1NTVhYWNkOTc3N2FjNWNhZDI5Yjk3ZGQ0ZGVmY2NjNTNlZTdlYTIwNDExOWIyODg5YjE5NycsXG4gICAgICAgICc2ZjBhMjU2YmM1ZWZkZjQyOWEyZmI2MjQyZjFhNDNhMmQ5YjkyNWJiNGE0YjNhMjZiYjhlMGY0NWViNTk2MDk2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjMTRmOGYyY2NiMjdkNmYxMDlmNmQwOGQwM2NjOTZhNjliYThjMzRlZWMwN2JiY2Y1NjZkNDhlMzNkYTY1OTMnLFxuICAgICAgICAnYzM1OWQ2OTIzYmIzOThmN2ZkNDQ3M2UxNmZlMWMyODQ3NWI3NDBkZDA5ODA3NWU2YzBlODY0OTExM2RjM2EzOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTZjYmMzMDQ2YmM2YTQ1MGJhYzI0Nzg5ZmExNzExNWE0Yzk3MzllZDc1ZjhmMjFjZTQ0MWY3MmUwYjkwZTZlZicsXG4gICAgICAgICcyMWFlN2Y0NjgwZTg4OWJiMTMwNjE5ZTJjMGY5NWEzNjBjZWI1NzNjNzA2MDMxMzk4NjJhZmQ2MTdmYTliOWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM0N2Q2ZDlhMDJjNDg5MjdlYmZiODZjMTM1OWIxY2FmMTMwYTNjMDI2N2QxMWNlNjM0NGIzOWY5OWQ0M2NjMzgnLFxuICAgICAgICAnNjBlYTdmNjFhMzUzNTI0ZDFjOTg3ZjZlY2VjOTJmMDg2ZDU2NWFiNjg3ODcwY2IxMjY4OWZmMWUzMWM3NDQ0OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGE2NTQ1ZDIxODFkYjhkOTgzZjdkY2IzNzVlZjU4NjZkNDdjNjdiMWJmMzFjOGNmODU1ZWY3NDM3YjcyNjU2YScsXG4gICAgICAgICc0OWI5NjcxNWFiNjg3OGE3OWU3OGYwN2NlNTY4MGM1ZDY2NzMwNTFiNDkzNWJkODk3ZmVhODI0Yjc3ZGMyMDhhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjNDA3NDdjYzlkMDEyY2IxYTEzYjgxNDgzMDljNmRlN2VjMjVkNjk0NWQ2NTcxNDZiOWQ1OTk0YjhmZWIxMTExJyxcbiAgICAgICAgJzVjYTU2MDc1M2JlMmExMmZjNmRlNmNhZjJjYjQ4OTU2NWRiOTM2MTU2Yjk1MTRlMWJiNWU4MzAzN2UwZmEyZDQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRlNDJjOGVjODJjOTk3OThjY2YzYTYxMGJlODcwZTc4MzM4YzdmNzEzMzQ4YmQzNGM4MjAzZWY0MDM3ZjM1MDInLFxuICAgICAgICAnNzU3MWQ3NGVlNWUwZmI5MmE3YThiMzNhMDc3ODMzNDFhNTQ5MjE0NGNjNTRiY2M0MGE5NDQ3MzY5MzYwNjQzNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzc3NWFiNzA4OWJjNmFmODIzYWJhMmUxYWY3MGIyMzZkMjUxY2FkYjBjODY3NDMyODc1MjJhMWIzYjBkZWRlYScsXG4gICAgICAgICdiZTUyZDEwN2JjZmEwOWQ4YmNiOTczNmE4MjhjZmE3ZmFjOGRiMTdiZjdhNzZhMmM0MmFkOTYxNDA5MDE4Y2Y3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjZWUzMWNiZjdlMzRlYzM3OWQ5NGZiODE0ZDNkNzc1YWQ5NTQ1OTVkMTMxNGJhODg0Njk1OWUzZTgyZjc0ZTI2JyxcbiAgICAgICAgJzhmZDY0YTE0YzA2YjU4OWMyNmI5NDdhZTJiY2Y2YmZhMDE0OWVmMGJlMTRlZDRkODBmNDQ4YTAxYzQzYjFjNmQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2I0ZjllYWVhMDliNjkxNzYxOWY2ZWE2YTRlYjU0NjRlZmRkYjU4ZmQ0NWIxZWJlZmNkYzFhMDFkMDhiNDc5ODYnLFxuICAgICAgICAnMzllNWM5OTI1YjVhNTRiMDc0MzNhNGYxOGM2MTcyNmY4YmIxMzFjMDEyY2E1NDJlYjI0YThhYzA3MjAwNjgyYScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDQyNjNkZmMzZDJkZjkyM2EwMTc5YTQ4OTY2ZDMwY2U4NGUyNTE1YWZjM2RjY2MxYjc3OTA3NzkyZWJjYzYwZScsXG4gICAgICAgICc2MmRmYWYwN2EwZjc4ZmViMzBlMzBkNjI5NTg1M2NlMTg5ZTEyNzc2MGFkNmNmN2ZhZTE2NGUxMjJhMjA4ZDU0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0ODQ1NzUyNDgyMGZhNjVhNGY4ZDM1ZWI2OTMwODU3YzAwMzJhY2MwYTRhMmRlNDIyMjMzZWVkYTg5NzYxMmM0JyxcbiAgICAgICAgJzI1YTc0OGFiMzY3OTc5ZDk4NzMzYzM4YTFmYTFjMmU3ZGM2Y2MwN2RiMmQ2MGE5YWU3YTc2YWFhNDliZDBmNzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RmZWVlZjE4ODExMDFmMmNiMTE2NDRmM2EyYWZkZmMyMDQ1ZTE5OTE5MTUyOTIzZjM2N2ExNzY3YzExY2NlZGEnLFxuICAgICAgICAnZWNmYjcwNTZjZjFkZTA0MmY5NDIwYmFiMzk2NzkzYzBjMzkwYmRlNzRiNGJiZGZmMTZhODNhZTA5YTlhNzUxNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNmQ3ZWY2YjE3NTQzZjgzNzNjNTczZjQ0ZTFmMzg5ODM1ZDg5YmNiYzYwNjJjZWQzNmM4MmRmODNiOGZhZTg1OScsXG4gICAgICAgICdjZDQ1MGVjMzM1NDM4OTg2ZGZlZmExMGM1N2ZlYTliY2M1MjFhMDk1OWIyZDgwYmJmNzRiMTkwZGNhNzEyZDEwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNzU2MDVkNTkxMDJhNWEyNjg0NTAwZDNiOTkxZjJlM2YzYzg4YjkzMjI1NTQ3MDM1YWYyNWFmNjZlMDQ1NDFmJyxcbiAgICAgICAgJ2Y1YzU0NzU0YThmNzFlZTU0MGI5YjQ4NzI4NDczZTMxNGY3MjlhYzUzMDhiMDY5MzgzNjA5OTBlMmJmYWQxMjUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ViOTg2NjBmNGM0ZGZhYTA2YTJiZTQ1M2Q1MDIwYmM5OWEwYzJlNjBhYmUzODg0NTdkZDQzZmVmYjFlZDYyMGMnLFxuICAgICAgICAnNmNiOWE4ODc2ZDljYjg1MjA2MDlhZjNhZGQyNmNkMjBhMGE3Y2Q4YTk0MTExMzFjZTg1ZjQ0MTAwMDk5MjIzZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTNlODdiMDI3ZDg1MTRkMzU5MzlmMmU2ODkyYjE5OTIyMTU0NTk2OTQxODg4MzM2ZGMzNTYzZTNiOGRiYTk0MicsXG4gICAgICAgICdmZWY1YTNjNjgwNTlhNmRlYzVkNjI0MTE0YmYxZTkxYWFjMmI5ZGE1NjhkNmFiZWIyNTcwZDU1NjQ2YjhhZGYxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlZTE2MzAyNmU5ZmQ2ZmUwMTdjMzhmMDZhNWJlNmZjMTI1NDI0YjM3MWNlMjcwOGU3YmY0NDkxNjkxZTU3NjRhJyxcbiAgICAgICAgJzFhY2IyNTBmMjU1ZGQ2MWM0M2Q5NGNjYzY3MGQwZjU4ZjQ5YWUzZmExNWI5NjYyM2U1NDMwZGEwYWQ2YzYyYjInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2IyNjhmNWVmOWFkNTFlNGQ3OGRlM2E3NTBjMmRjODliMWU2MjZkNDM1MDU4Njc5OTk5MzJlNWRiMzNhZjNkODAnLFxuICAgICAgICAnNWYzMTBkNGIzYzk5YjllYmIxOWY3N2Q0MWMxZGVlMDE4Y2YwZDM0ZmQ0MTkxNjE0MDAzZTk0NWExMjE2ZTQyMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmYwN2YzMTE4YTlkZjAzNWU5ZmFkODVlYjZjN2JmZTQyYjAyZjAxY2E5OWNlZWEzYmY3ZmZkYmE5M2M0NzUwZCcsXG4gICAgICAgICc0MzgxMzZkNjAzZTg1OGEzYTVjNDQwYzM4ZWNjYmFkZGMxZDI5NDIxMTRlMmVkZGQ0NzQwZDA5OGNlZDFmMGQ4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4ZDhiOTg1NWM3YzA1MmEzNDE0NmZkMjBmZmI2NThiZWE0YjlmNjllMGQ4MjVlYmVjMTZlOGMzY2UyYjUyNmExJyxcbiAgICAgICAgJ2NkYjU1OWVlZGMyZDc5ZjkyNmJhZjQ0ZmI4NGVhNGQ0NGJjZjUwZmVlNTFkN2NlYjMwZTJlN2Y0NjMwMzY3NTgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzUyZGIwYjUzODRkZmJmMDViZmE5ZDQ3MmQ3YWUyNmRmZTRiODUxY2VjYTkxYjFlYmE1NDI2MzE4MGRhMzJiNjMnLFxuICAgICAgICAnYzNiOTk3ZDA1MGVlNWQ0MjNlYmFmNjZhNmRiOWY1N2IzMTgwYzkwMjg3NTY3OWRlOTI0YjY5ZDg0YTdiMzc1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNjJmOTQ5MGQzZDUxZGE2Mzk1ZWZkMjRlODA5MTljYzdkMGYyOWMzZjNmYTQ4YzZmZmY1NDNiZWNiZDQzMzUyJyxcbiAgICAgICAgJzZkODlhZDdiYTQ4NzZiMGIyMmMyY2EyODBjNjgyODYyZjM0MmM4NTkxZjFkYWY1MTcwZTA3YmZkOWNjYWZhN2QnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzdmMzBlYTI0NzZiMzk5YjQ5NTc1MDljODhmNzdkMDE5MWFmYTJmZjVjYjdiMTRmZDZkOGU3ZDY1YWFhYjExOTMnLFxuICAgICAgICAnY2E1ZWY3ZDRiMjMxYzk0YzNiMTUzODlhNWY2MzExZTlkYWZmN2JiNjdiMTAzZTk4ODBlZjRiZmY2MzdhY2FlYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNTA5OGZmMWUxZDlmMTRmYjQ2YTIxMGZhZGE2YzkwM2ZlZjBmYjdiNGExZGQxZDlhYzYwYTAzNjE4MDBiN2EwMCcsXG4gICAgICAgICc5NzMxMTQxZDgxZmM4ZjgwODRkMzdjNmU3NTQyMDA2YjNlZTFiNDBkNjBkZmU1MzYyYTViMTMyZmQxN2RkYzAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMyYjc4YzdkZTllZTUxMmE3Mjg5NWJlNmI5Y2JlZmE2ZTJmM2M0Y2NjZTQ0NWM5NmI5ZjJjODFlMjc3OGFkNTgnLFxuICAgICAgICAnZWUxODQ5ZjUxM2RmNzFlMzJlZmMzODk2ZWUyODI2MGM3M2JiODA1NDdhZTIyNzViYTQ5NzIzNzc5NGM4NzUzYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTJjYjc0ZmRkYzhlOWZiY2QwNzZlZWYyYTdjNzJiMGNlMzdkNTBmMDgyNjlkZmMwNzRiNTgxNTUwNTQ3YTRmNycsXG4gICAgICAgICdkM2FhMmVkNzFjOWRkMjI0N2E2MmRmMDYyNzM2ZWIwYmFkZGVhOWUzNjEyMmQyYmU4NjQxYWJjYjAwNWNjNGE0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NDM4NDQ3NTY2ZDRkN2JlZGFkYzI5OTQ5NmFiMzU3NDI2MDA5YTM1ZjIzNWNiMTQxYmUwZDk5Y2QxMGFlM2E4JyxcbiAgICAgICAgJ2M0ZTEwMjA5MTY5ODBhNGRhNWQwMWFjNWU2YWQzMzA3MzRlZjBkNzkwNjYzMWM0ZjIzOTA0MjZiMmVkZDc5MWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQxNjJkNDg4Yjg5NDAyMDM5YjU4NGM2ZmM2YzMwODg3MDU4N2Q5YzQ2ZjY2MGI4NzhhYjY1YzgyYzcxMWQ2N2UnLFxuICAgICAgICAnNjcxNjNlOTAzMjM2Mjg5Zjc3NmYyMmMyNWZiOGEzYWZjMTczMmYyYjg0YjRlOTVkYmRhNDdhZTVhMDg1MjY0OScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnM2ZhZDNmYTg0Y2FmMGYzNGYwZjg5YmZkMmRjZjU0ZmMxNzVkNzY3YWVjM2U1MDY4NGYzYmE0YTRiZjVmNjgzZCcsXG4gICAgICAgICdjZDFiYzdjYjZjYzQwN2JiMmYwY2E2NDdjNzE4YTczMGNmNzE4NzJlN2QwZDJhNTNmYTIwZWZjZGZlNjE4MjYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzY3NGYyNjAwYTMwMDdhMDA1NjhjMWE3Y2UwNWQwODE2YzFmYjg0YmYxMzcwNzk4ZjFjNjk1MzJmYWViMWE4NmInLFxuICAgICAgICAnMjk5ZDIxZjk0MTNmMzNiM2VkZjQzYjI1NzAwNDU4MGI3MGRiNTdkYTBiMTgyMjU5ZTA5ZWVjYzY5ZTBkMzhhNScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDMyZjRkYTU0YWRlNzRhYmI4MWI4MTVhZDFmYjNiMjYzZDgyZDZjNjkyNzE0YmNmZjg3ZDI5YmQ1ZWU5ZjA4ZicsXG4gICAgICAgICdmOTQyOWU3MzhiOGU1M2I5NjhlOTkwMTZjMDU5NzA3NzgyZTE0ZjQ1MzUzNTlkNTgyZmM0MTY5MTBiM2VlYTg3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMGU0ZTY3MDQzNTM4NTU1NmU1OTM2NTcxMzU4NDVkMzZmYmI2OTMxZjcyYjA4Y2IxZWQ5NTRmMWUzY2UzZmY2JyxcbiAgICAgICAgJzQ2MmY5YmNlNjE5ODk4NjM4NDk5MzUwMTEzYmJjOWIxMGE4NzhkMzVkYTcwNzQwZGM2OTVhNTU5ZWI4OGRiN2InLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2JlMjA2MjAwM2M1MWNjMzAwNDY4MjkwNDMzMGU0ZGVlN2YzZGNkMTBiMDFlNTgwYmYxOTcxYjA0ZDRjYWQyOTcnLFxuICAgICAgICAnNjIxODhiYzQ5ZDYxZTU0Mjg1NzNkNDhhNzRlMWM2NTViMWM2MTA5MDkwNTY4MmEwZDU1NThlZDcyZGNjYjliYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTMxNDQ0MjNhY2UzNDUxZWQyOWUwZmI5YWMyYWYyMTFjYjZlODRhNjAxZGY1OTkzYzQxOTg1OWZmZjVkZjA0YScsXG4gICAgICAgICc3YzEwZGZiMTY0YzM0MjVmNWM3MWEzZjlkNzk5MjAzOGYxMDY1MjI0ZjcyYmI5ZDFkOTAyYTZkMTMwMzdiNDdjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiMDE1ZjgwNDRmNWZjYmRjZjIxY2EyNmQ2YzM0ZmI4MTk3ODI5MjA1YzdiN2QyYTdjYjY2NDE4YzE1N2IxMTJjJyxcbiAgICAgICAgJ2FiOGMxZTA4NmQwNGU4MTM3NDRhNjU1YjJkZjhkNWY4M2IzY2RjNmZhYTMwODhjMWQzYWVhMTQ1NGUzYTFkNWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q1ZTllMWRhNjQ5ZDk3ZDg5ZTQ4NjgxMTdhNDY1YTNhNGY4YTE4ZGU1N2ExNDBkMzZiM2YyYWYzNDFhMjFiNTInLFxuICAgICAgICAnNGNiMDQ0MzdmMzkxZWQ3MzExMWExM2NjMWQ0ZGQwZGIxNjkzNDY1YzIyNDA0ODBkODk1NWU4NTkyZjI3NDQ3YScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDNhZTQxMDQ3ZGQ3Y2EwNjVkYmY4ZWQ3N2I5OTI0Mzk5ODMwMDVjZDcyZTE2ZDZmOTk2YTUzMTZkMzY5NjZiYicsXG4gICAgICAgICdiZDFhZWIyMWFkMjJlYmIyMmExMGYwMzAzNDE3YzZkOTY0ZjhjZGQ3ZGYwYWNhNjE0YjEwZGMxNGQxMjVhYzQ2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0NjNlMjc2M2Q4ODVmOTU4ZmM2NmNkZDIyODAwZjBhNDg3MTk3ZDBhODJlMzc3YjQ5ZjgwYWY4N2M4OTdiMDY1JyxcbiAgICAgICAgJ2JmZWZhY2RiMGU1ZDBmZDdkZjNhMzExYTk0ZGUwNjJiMjZiODBjNjFmYmM5NzUwOGI3OTk5MjY3MWVmN2NhN2YnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc5ODVmZGZkMTI3YzA1NjdjNmY1M2VjMWJiNjNlYzMxNThlNTk3YzQwYmZlNzQ3YzgzY2RkZmM5MTA2NDE5MTcnLFxuICAgICAgICAnNjAzYzEyZGFmM2Q5ODYyZWYyYjI1ZmUxZGUyODlhZWQyNGVkMjkxZTBlYzY3MDg3MDNhNWJkNTY3ZjMyZWQwMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzRhMWFkNmI1Zjc2ZTM5ZGIyZGQyNDk0MTBlYWM3Zjk5ZTc0YzU5Y2I4M2QyZDBlZDVmZjE1NDNkYTc3MDNlOScsXG4gICAgICAgICdjYzYxNTdlZjE4YzljNjNjZDYxOTNkODM2MzFiYmVhMDA5M2UwOTY4OTQyZThjMzNkNTczN2ZkNzkwZTBkYjA4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMDY4MmE1MDcwMzM3NWY2MDJkNDE2NjY0YmExOWI3ZmM5YmFiNDJjNzI3NDc0NjNhNzFkMDg5NmIyMmY2ZGEzJyxcbiAgICAgICAgJzU1M2UwNGY2YjAxOGI0ZmE2YzhmMzllN2YzMTFkMzE3NjI5MGQwZTBmMTljYTczZjE3NzE0ZDk5NzdhMjJmZjgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzllMjE1OGYwZDdjMGQ1ZjI2YzM3OTFlZmVmYTc5NTk3NjU0ZTdhMmIyNDY0ZjUyYjFlZTZjMTM0Nzc2OWVmNTcnLFxuICAgICAgICAnNzEyZmNkZDFiOTA1M2YwOTAwM2EzNDgxZmE3NzYyZTlmZmQ3YzhlZjM1YTM4NTA5ZTJmYmYyNjI5MDA4MzczJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNzZlMjY5ODlhNDNjOWNmZWJhNDAyOWMyMDI1MzhjMjgxNzJlNTY2ZTNjNGZjZTczMjI4NTdmM2JlMzI3ZDY2JyxcbiAgICAgICAgJ2VkOGNjOWQwNGIyOWViODc3ZDI3MGI0ODc4ZGM0M2MxOWFlZmQzMWY0ZWVlMDllZTdiNDc4MzRjMWZhNGIxYzMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc1ZDQ2ZWZlYTM3NzFlNmU2OGFiYjg5YTEzYWQ3NDdlY2YxODkyMzkzZGZjNGYxYjcwMDQ3ODhjNTAzNzRkYTgnLFxuICAgICAgICAnOTg1MjM5MGE5OTUwNzY3OWZkMGI4NmZkMmIzOWE4NjhkN2VmYzIyMTUxMzQ2ZTFhM2NhNDcyNjU4NmE2YmVkOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODA5YTIwYzY3ZDY0OTAwZmZiNjk4YzRjODI1ZjZkNWYyMzEwZmIwNDUxYzg2OTM0NWI3MzE5ZjY0NTYwNTcyMScsXG4gICAgICAgICc5ZTk5NDk4MGQ5OTE3ZTIyYjc2YjA2MTkyN2ZhMDQxNDNkMDk2Y2NjNTQ5NjNlNmE1ZWJmYTVmM2Y4ZTI4NmMxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxYjM4OTAzYTQzZjdmMTE0ZWQ0NTAwYjRlYWM3MDgzZmRlZmVjZTFjZjI5YzYzNTI4ZDU2MzQ0NmY5NzJjMTgwJyxcbiAgICAgICAgJzQwMzZlZGM5MzFhNjBhZTg4OTM1M2Y3N2ZkNTNkZTRhMjcwOGIyNmI2ZjVkYTcyYWQzMzk0MTE5ZGFmNDA4ZjknLFxuICAgICAgXSxcbiAgICBdLFxuICB9LFxufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VydmVzID0gZXhwb3J0cztcblxudmFyIGhhc2ggPSByZXF1aXJlKCdoYXNoLmpzJyk7XG52YXIgY3VydmUgPSByZXF1aXJlKCcuL2N1cnZlJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIFByZXNldEN1cnZlKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMudHlwZSA9PT0gJ3Nob3J0JylcbiAgICB0aGlzLmN1cnZlID0gbmV3IGN1cnZlLnNob3J0KG9wdGlvbnMpO1xuICBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdlZHdhcmRzJylcbiAgICB0aGlzLmN1cnZlID0gbmV3IGN1cnZlLmVkd2FyZHMob3B0aW9ucyk7XG4gIGVsc2VcbiAgICB0aGlzLmN1cnZlID0gbmV3IGN1cnZlLm1vbnQob3B0aW9ucyk7XG4gIHRoaXMuZyA9IHRoaXMuY3VydmUuZztcbiAgdGhpcy5uID0gdGhpcy5jdXJ2ZS5uO1xuICB0aGlzLmhhc2ggPSBvcHRpb25zLmhhc2g7XG5cbiAgYXNzZXJ0KHRoaXMuZy52YWxpZGF0ZSgpLCAnSW52YWxpZCBjdXJ2ZScpO1xuICBhc3NlcnQodGhpcy5nLm11bCh0aGlzLm4pLmlzSW5maW5pdHkoKSwgJ0ludmFsaWQgY3VydmUsIEcqTiAhPSBPJyk7XG59XG5jdXJ2ZXMuUHJlc2V0Q3VydmUgPSBQcmVzZXRDdXJ2ZTtcblxuZnVuY3Rpb24gZGVmaW5lQ3VydmUobmFtZSwgb3B0aW9ucykge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VydmVzLCBuYW1lLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjdXJ2ZSA9IG5ldyBQcmVzZXRDdXJ2ZShvcHRpb25zKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdXJ2ZXMsIG5hbWUsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogY3VydmUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjdXJ2ZTtcbiAgICB9LFxuICB9KTtcbn1cblxuZGVmaW5lQ3VydmUoJ3AxOTInLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiAncDE5MicsXG4gIHA6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZicsXG4gIGE6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmYycsXG4gIGI6ICc2NDIxMDUxOSBlNTljODBlNyAwZmE3ZTlhYiA3MjI0MzA0OSBmZWI4ZGVlYyBjMTQ2YjliMScsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiA5OWRlZjgzNiAxNDZiYzliMSBiNGQyMjgzMScsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICcxODhkYTgwZSBiMDMwOTBmNiA3Y2JmMjBlYiA0M2ExODgwMCBmNGZmMGFmZCA4MmZmMTAxMicsXG4gICAgJzA3MTkyYjk1IGZmYzhkYTc4IDYzMTAxMWVkIDZiMjRjZGQ1IDczZjk3N2ExIDFlNzk0ODExJyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDIyNCcsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6ICdwMjI0JyxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxJyxcbiAgYTogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlJyxcbiAgYjogJ2I0MDUwYTg1IDBjMDRiM2FiIGY1NDEzMjU2IDUwNDRiMGI3IGQ3YmZkOGJhIDI3MGIzOTQzIDIzNTVmZmI0JyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmYxNmEyIGUwYjhmMDNlIDEzZGQyOTQ1IDVjNWMyYTNkJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJ2I3MGUwY2JkIDZiYjRiZjdmIDMyMTM5MGI5IDRhMDNjMWQzIDU2YzIxMTIyIDM0MzI4MGQ2IDExNWMxZDIxJyxcbiAgICAnYmQzNzYzODggYjVmNzIzZmIgNGMyMmRmZTYgY2Q0Mzc1YTAgNWEwNzQ3NjQgNDRkNTgxOTkgODUwMDdlMzQnLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdwMjU2Jywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogbnVsbCxcbiAgcDogJ2ZmZmZmZmZmIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmJyxcbiAgYTogJ2ZmZmZmZmZmIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZjJyxcbiAgYjogJzVhYzYzNWQ4IGFhM2E5M2U3IGIzZWJiZDU1IDc2OTg4NmJjIDY1MWQwNmIwIGNjNTNiMGY2IDNiY2UzYzNlIDI3ZDI2MDRiJyxcbiAgbjogJ2ZmZmZmZmZmIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGJjZTZmYWFkIGE3MTc5ZTg0IGYzYjljYWMyIGZjNjMyNTUxJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzZiMTdkMWYyIGUxMmM0MjQ3IGY4YmNlNmU1IDYzYTQ0MGYyIDc3MDM3ZDgxIDJkZWIzM2EwIGY0YTEzOTQ1IGQ4OThjMjk2JyxcbiAgICAnNGZlMzQyZTIgZmUxYTdmOWIgOGVlN2ViNGEgN2MwZjllMTYgMmJjZTMzNTcgNmIzMTVlY2UgY2JiNjQwNjggMzdiZjUxZjUnLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdwMzg0Jywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogbnVsbCxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmUgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmYnLFxuICBhOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZSBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmYycsXG4gIGI6ICdiMzMxMmZhNyBlMjNlZTdlNCA5ODhlMDU2YiBlM2Y4MmQxOSAxODFkOWM2ZSBmZTgxNDExMiAwMzE0MDg4ZiAnICtcbiAgICAgJzUwMTM4NzVhIGM2NTYzOThkIDhhMmVkMTlkIDJhODVjOGVkIGQzZWMyYWVmJyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGM3NjM0ZDgxICcgK1xuICAgICAnZjQzNzJkZGYgNTgxYTBkYjIgNDhiMGE3N2EgZWNlYzE5NmEgY2NjNTI5NzMnLFxuICBoYXNoOiBoYXNoLnNoYTM4NCxcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnYWE4N2NhMjIgYmU4YjA1MzcgOGViMWM3MWUgZjMyMGFkNzQgNmUxZDNiNjIgOGJhNzliOTggNTlmNzQxZTAgODI1NDJhMzggJyArXG4gICAgJzU1MDJmMjVkIGJmNTUyOTZjIDNhNTQ1ZTM4IDcyNzYwYWI3JyxcbiAgICAnMzYxN2RlNGEgOTYyNjJjNmYgNWQ5ZTk4YmYgOTI5MmRjMjkgZjhmNDFkYmQgMjg5YTE0N2MgZTlkYTMxMTMgYjVmMGI4YzAgJyArXG4gICAgJzBhNjBiMWNlIDFkN2U4MTlkIDdhNDMxZDdjIDkwZWEwZTVmJyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDUyMScsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6IG51bGwsXG4gIHA6ICcwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYnLFxuICBhOiAnMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZjJyxcbiAgYjogJzAwMDAwMDUxIDk1M2ViOTYxIDhlMWM5YTFmIDkyOWEyMWEwIGI2ODU0MGVlIGEyZGE3MjViICcgK1xuICAgICAnOTliMzE1ZjMgYjhiNDg5OTEgOGVmMTA5ZTEgNTYxOTM5NTEgZWM3ZTkzN2IgMTY1MmMwYmQgJyArXG4gICAgICczYmIxYmYwNyAzNTczZGY4OCAzZDJjMzRmMSBlZjQ1MWZkNCA2YjUwM2YwMCcsXG4gIG46ICcwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZhIDUxODY4NzgzIGJmMmY5NjZiIDdmY2MwMTQ4ICcgK1xuICAgICAnZjcwOWE1ZDAgM2JiNWM5YjggODk5YzQ3YWUgYmI2ZmI3MWUgOTEzODY0MDknLFxuICBoYXNoOiBoYXNoLnNoYTUxMixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnMDAwMDAwYzYgODU4ZTA2YjcgMDQwNGU5Y2QgOWUzZWNiNjYgMjM5NWI0NDIgOWM2NDgxMzkgJyArXG4gICAgJzA1M2ZiNTIxIGY4MjhhZjYwIDZiNGQzZGJhIGExNGI1ZTc3IGVmZTc1OTI4IGZlMWRjMTI3ICcgK1xuICAgICdhMmZmYThkZSAzMzQ4YjNjMSA4NTZhNDI5YiBmOTdlN2UzMSBjMmU1YmQ2NicsXG4gICAgJzAwMDAwMTE4IDM5Mjk2YTc4IDlhM2JjMDA0IDVjOGE1ZmI0IDJjN2QxYmQ5IDk4ZjU0NDQ5ICcgK1xuICAgICc1NzliNDQ2OCAxN2FmYmQxNyAyNzNlNjYyYyA5N2VlNzI5OSA1ZWY0MjY0MCBjNTUwYjkwMSAnICtcbiAgICAnM2ZhZDA3NjEgMzUzYzcwODYgYTI3MmMyNDAgODhiZTk0NzYgOWZkMTY2NTAnLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdjdXJ2ZTI1NTE5Jywge1xuICB0eXBlOiAnbW9udCcsXG4gIHByaW1lOiAncDI1NTE5JyxcbiAgcDogJzdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQnLFxuICBhOiAnNzZkMDYnLFxuICBiOiAnMScsXG4gIG46ICcxMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgMTRkZWY5ZGVhMmY3OWNkNiA1ODEyNjMxYTVjZjVkM2VkJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzknLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdlZDI1NTE5Jywge1xuICB0eXBlOiAnZWR3YXJkcycsXG4gIHByaW1lOiAncDI1NTE5JyxcbiAgcDogJzdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQnLFxuICBhOiAnLTEnLFxuICBjOiAnMScsXG4gIC8vIC0xMjE2NjUgKiAoMTIxNjY2XigtMSkpIChtb2QgUClcbiAgZDogJzUyMDM2Y2VlMmI2ZmZlNzMgOGNjNzQwNzk3Nzc5ZTg5OCAwMDcwMGE0ZDQxNDFkOGFiIDc1ZWI0ZGNhMTM1OTc4YTMnLFxuICBuOiAnMTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIDE0ZGVmOWRlYTJmNzljZDYgNTgxMjYzMWE1Y2Y1ZDNlZCcsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICcyMTY5MzZkM2NkNmU1M2ZlYzBhNGUyMzFmZGQ2ZGM1YzY5MmNjNzYwOTUyNWE3YjJjOTU2MmQ2MDhmMjVkNTFhJyxcblxuICAgIC8vIDQvNVxuICAgICc2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjU4JyxcbiAgXSxcbn0pO1xuXG52YXIgcHJlO1xudHJ5IHtcbiAgcHJlID0gcmVxdWlyZSgnLi9wcmVjb21wdXRlZC9zZWNwMjU2azEnKTtcbn0gY2F0Y2ggKGUpIHtcbiAgcHJlID0gdW5kZWZpbmVkO1xufVxuXG5kZWZpbmVDdXJ2ZSgnc2VjcDI1NmsxJywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogJ2syNTYnLFxuICBwOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZjMmYnLFxuICBhOiAnMCcsXG4gIGI6ICc3JyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGJhYWVkY2U2IGFmNDhhMDNiIGJmZDI1ZThjIGQwMzY0MTQxJyxcbiAgaDogJzEnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcblxuICAvLyBQcmVjb21wdXRlZCBlbmRvbW9ycGhpc21cbiAgYmV0YTogJzdhZTk2YTJiNjU3YzA3MTA2ZTY0NDc5ZWFjMzQzNGU5OWNmMDQ5NzUxMmY1ODk5NWMxMzk2YzI4NzE5NTAxZWUnLFxuICBsYW1iZGE6ICc1MzYzYWQ0Y2MwNWMzMGUwYTUyNjFjMDI4ODEyNjQ1YTEyMmUyMmVhMjA4MTY2NzhkZjAyOTY3YzFiMjNiZDcyJyxcbiAgYmFzaXM6IFtcbiAgICB7XG4gICAgICBhOiAnMzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTUnLFxuICAgICAgYjogJy1lNDQzN2VkNjAxMGU4ODI4NmY1NDdmYTkwYWJmZTRjMycsXG4gICAgfSxcbiAgICB7XG4gICAgICBhOiAnMTE0Y2E1MGY3YThlMmYzZjY1N2MxMTA4ZDlkNDRjZmQ4JyxcbiAgICAgIGI6ICczMDg2ZDIyMWE3ZDQ2YmNkZTg2YzkwZTQ5Mjg0ZWIxNScsXG4gICAgfSxcbiAgXSxcblxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICc3OWJlNjY3ZWY5ZGNiYmFjNTVhMDYyOTVjZTg3MGIwNzAyOWJmY2RiMmRjZTI4ZDk1OWYyODE1YjE2ZjgxNzk4JyxcbiAgICAnNDgzYWRhNzcyNmEzYzQ2NTVkYTRmYmZjMGUxMTA4YThmZDE3YjQ0OGE2ODU1NDE5OWM0N2QwOGZmYjEwZDRiOCcsXG4gICAgcHJlLFxuICBdLFxufSk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc2ggPSByZXF1aXJlKCdoYXNoLmpzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG5mdW5jdGlvbiBIbWFjRFJCRyhvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBIbWFjRFJCRykpXG4gICAgcmV0dXJuIG5ldyBIbWFjRFJCRyhvcHRpb25zKTtcbiAgdGhpcy5oYXNoID0gb3B0aW9ucy5oYXNoO1xuICB0aGlzLnByZWRSZXNpc3QgPSAhIW9wdGlvbnMucHJlZFJlc2lzdDtcblxuICB0aGlzLm91dExlbiA9IHRoaXMuaGFzaC5vdXRTaXplO1xuICB0aGlzLm1pbkVudHJvcHkgPSBvcHRpb25zLm1pbkVudHJvcHkgfHwgdGhpcy5oYXNoLmhtYWNTdHJlbmd0aDtcblxuICB0aGlzLl9yZXNlZWQgPSBudWxsO1xuICB0aGlzLnJlc2VlZEludGVydmFsID0gbnVsbDtcbiAgdGhpcy5LID0gbnVsbDtcbiAgdGhpcy5WID0gbnVsbDtcblxuICB2YXIgZW50cm9weSA9IHV0aWxzLnRvQXJyYXkob3B0aW9ucy5lbnRyb3B5LCBvcHRpb25zLmVudHJvcHlFbmMgfHwgJ2hleCcpO1xuICB2YXIgbm9uY2UgPSB1dGlscy50b0FycmF5KG9wdGlvbnMubm9uY2UsIG9wdGlvbnMubm9uY2VFbmMgfHwgJ2hleCcpO1xuICB2YXIgcGVycyA9IHV0aWxzLnRvQXJyYXkob3B0aW9ucy5wZXJzLCBvcHRpb25zLnBlcnNFbmMgfHwgJ2hleCcpO1xuICBhc3NlcnQoZW50cm9weS5sZW5ndGggPj0gKHRoaXMubWluRW50cm9weSAvIDgpLFxuICAgICAgICAgJ05vdCBlbm91Z2ggZW50cm9weS4gTWluaW11bSBpczogJyArIHRoaXMubWluRW50cm9weSArICcgYml0cycpO1xuICB0aGlzLl9pbml0KGVudHJvcHksIG5vbmNlLCBwZXJzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gSG1hY0RSQkc7XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIGluaXQoZW50cm9weSwgbm9uY2UsIHBlcnMpIHtcbiAgdmFyIHNlZWQgPSBlbnRyb3B5LmNvbmNhdChub25jZSkuY29uY2F0KHBlcnMpO1xuXG4gIHRoaXMuSyA9IG5ldyBBcnJheSh0aGlzLm91dExlbiAvIDgpO1xuICB0aGlzLlYgPSBuZXcgQXJyYXkodGhpcy5vdXRMZW4gLyA4KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLlYubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLktbaV0gPSAweDAwO1xuICAgIHRoaXMuVltpXSA9IDB4MDE7XG4gIH1cblxuICB0aGlzLl91cGRhdGUoc2VlZCk7XG4gIHRoaXMuX3Jlc2VlZCA9IDE7XG4gIHRoaXMucmVzZWVkSW50ZXJ2YWwgPSAweDEwMDAwMDAwMDAwMDA7ICAvLyAyXjQ4XG59O1xuXG5IbWFjRFJCRy5wcm90b3R5cGUuX2htYWMgPSBmdW5jdGlvbiBobWFjKCkge1xuICByZXR1cm4gbmV3IGhhc2guaG1hYyh0aGlzLmhhc2gsIHRoaXMuSyk7XG59O1xuXG5IbWFjRFJCRy5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShzZWVkKSB7XG4gIHZhciBrbWFjID0gdGhpcy5faG1hYygpXG4gICAgICAgICAgICAgICAgIC51cGRhdGUodGhpcy5WKVxuICAgICAgICAgICAgICAgICAudXBkYXRlKFsgMHgwMCBdKTtcbiAgaWYgKHNlZWQpXG4gICAga21hYyA9IGttYWMudXBkYXRlKHNlZWQpO1xuICB0aGlzLksgPSBrbWFjLmRpZ2VzdCgpO1xuICB0aGlzLlYgPSB0aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCk7XG4gIGlmICghc2VlZClcbiAgICByZXR1cm47XG5cbiAgdGhpcy5LID0gdGhpcy5faG1hYygpXG4gICAgICAgICAgICAgICAudXBkYXRlKHRoaXMuVilcbiAgICAgICAgICAgICAgIC51cGRhdGUoWyAweDAxIF0pXG4gICAgICAgICAgICAgICAudXBkYXRlKHNlZWQpXG4gICAgICAgICAgICAgICAuZGlnZXN0KCk7XG4gIHRoaXMuViA9IHRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKTtcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5yZXNlZWQgPSBmdW5jdGlvbiByZXNlZWQoZW50cm9weSwgZW50cm9weUVuYywgYWRkLCBhZGRFbmMpIHtcbiAgLy8gT3B0aW9uYWwgZW50cm9weSBlbmNcbiAgaWYgKHR5cGVvZiBlbnRyb3B5RW5jICE9PSAnc3RyaW5nJykge1xuICAgIGFkZEVuYyA9IGFkZDtcbiAgICBhZGQgPSBlbnRyb3B5RW5jO1xuICAgIGVudHJvcHlFbmMgPSBudWxsO1xuICB9XG5cbiAgZW50cm9weSA9IHV0aWxzLnRvQXJyYXkoZW50cm9weSwgZW50cm9weUVuYyk7XG4gIGFkZCA9IHV0aWxzLnRvQXJyYXkoYWRkLCBhZGRFbmMpO1xuXG4gIGFzc2VydChlbnRyb3B5Lmxlbmd0aCA+PSAodGhpcy5taW5FbnRyb3B5IC8gOCksXG4gICAgICAgICAnTm90IGVub3VnaCBlbnRyb3B5LiBNaW5pbXVtIGlzOiAnICsgdGhpcy5taW5FbnRyb3B5ICsgJyBiaXRzJyk7XG5cbiAgdGhpcy5fdXBkYXRlKGVudHJvcHkuY29uY2F0KGFkZCB8fCBbXSkpO1xuICB0aGlzLl9yZXNlZWQgPSAxO1xufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLmdlbmVyYXRlID0gZnVuY3Rpb24gZ2VuZXJhdGUobGVuLCBlbmMsIGFkZCwgYWRkRW5jKSB7XG4gIGlmICh0aGlzLl9yZXNlZWQgPiB0aGlzLnJlc2VlZEludGVydmFsKVxuICAgIHRocm93IG5ldyBFcnJvcignUmVzZWVkIGlzIHJlcXVpcmVkJyk7XG5cbiAgLy8gT3B0aW9uYWwgZW5jb2RpbmdcbiAgaWYgKHR5cGVvZiBlbmMgIT09ICdzdHJpbmcnKSB7XG4gICAgYWRkRW5jID0gYWRkO1xuICAgIGFkZCA9IGVuYztcbiAgICBlbmMgPSBudWxsO1xuICB9XG5cbiAgLy8gT3B0aW9uYWwgYWRkaXRpb25hbCBkYXRhXG4gIGlmIChhZGQpIHtcbiAgICBhZGQgPSB1dGlscy50b0FycmF5KGFkZCwgYWRkRW5jIHx8ICdoZXgnKTtcbiAgICB0aGlzLl91cGRhdGUoYWRkKTtcbiAgfVxuXG4gIHZhciB0ZW1wID0gW107XG4gIHdoaWxlICh0ZW1wLmxlbmd0aCA8IGxlbikge1xuICAgIHRoaXMuViA9IHRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKTtcbiAgICB0ZW1wID0gdGVtcC5jb25jYXQodGhpcy5WKTtcbiAgfVxuXG4gIHZhciByZXMgPSB0ZW1wLnNsaWNlKDAsIGxlbik7XG4gIHRoaXMuX3VwZGF0ZShhZGQpO1xuICB0aGlzLl9yZXNlZWQrKztcbiAgcmV0dXJuIHV0aWxzLmVuY29kZShyZXMsIGVuYyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gS2V5UGFpcihlYywgb3B0aW9ucykge1xuICB0aGlzLmVjID0gZWM7XG4gIHRoaXMucHJpdiA9IG51bGw7XG4gIHRoaXMucHViID0gbnVsbDtcblxuICAvLyBLZXlQYWlyKGVjLCB7IHByaXY6IC4uLiwgcHViOiAuLi4gfSlcbiAgaWYgKG9wdGlvbnMucHJpdilcbiAgICB0aGlzLl9pbXBvcnRQcml2YXRlKG9wdGlvbnMucHJpdiwgb3B0aW9ucy5wcml2RW5jKTtcbiAgaWYgKG9wdGlvbnMucHViKVxuICAgIHRoaXMuX2ltcG9ydFB1YmxpYyhvcHRpb25zLnB1Yiwgb3B0aW9ucy5wdWJFbmMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBLZXlQYWlyO1xuXG5LZXlQYWlyLmZyb21QdWJsaWMgPSBmdW5jdGlvbiBmcm9tUHVibGljKGVjLCBwdWIsIGVuYykge1xuICBpZiAocHViIGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gcHViO1xuXG4gIHJldHVybiBuZXcgS2V5UGFpcihlYywge1xuICAgIHB1YjogcHViLFxuICAgIHB1YkVuYzogZW5jLFxuICB9KTtcbn07XG5cbktleVBhaXIuZnJvbVByaXZhdGUgPSBmdW5jdGlvbiBmcm9tUHJpdmF0ZShlYywgcHJpdiwgZW5jKSB7XG4gIGlmIChwcml2IGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gcHJpdjtcblxuICByZXR1cm4gbmV3IEtleVBhaXIoZWMsIHtcbiAgICBwcml2OiBwcml2LFxuICAgIHByaXZFbmM6IGVuYyxcbiAgfSk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICB2YXIgcHViID0gdGhpcy5nZXRQdWJsaWMoKTtcblxuICBpZiAocHViLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCByZWFzb246ICdJbnZhbGlkIHB1YmxpYyBrZXknIH07XG4gIGlmICghcHViLnZhbGlkYXRlKCkpXG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgcmVhc29uOiAnUHVibGljIGtleSBpcyBub3QgYSBwb2ludCcgfTtcbiAgaWYgKCFwdWIubXVsKHRoaXMuZWMuY3VydmUubikuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIHJlYXNvbjogJ1B1YmxpYyBrZXkgKiBOICE9IE8nIH07XG5cbiAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlLCByZWFzb246IG51bGwgfTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFB1YmxpYyA9IGZ1bmN0aW9uIGdldFB1YmxpYyhjb21wYWN0LCBlbmMpIHtcbiAgLy8gY29tcGFjdCBpcyBvcHRpb25hbCBhcmd1bWVudFxuICBpZiAodHlwZW9mIGNvbXBhY3QgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jID0gY29tcGFjdDtcbiAgICBjb21wYWN0ID0gbnVsbDtcbiAgfVxuXG4gIGlmICghdGhpcy5wdWIpXG4gICAgdGhpcy5wdWIgPSB0aGlzLmVjLmcubXVsKHRoaXMucHJpdik7XG5cbiAgaWYgKCFlbmMpXG4gICAgcmV0dXJuIHRoaXMucHViO1xuXG4gIHJldHVybiB0aGlzLnB1Yi5lbmNvZGUoZW5jLCBjb21wYWN0KTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFByaXZhdGUgPSBmdW5jdGlvbiBnZXRQcml2YXRlKGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdGhpcy5wcml2LnRvU3RyaW5nKDE2LCAyKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLnByaXY7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5faW1wb3J0UHJpdmF0ZSA9IGZ1bmN0aW9uIF9pbXBvcnRQcml2YXRlKGtleSwgZW5jKSB7XG4gIHRoaXMucHJpdiA9IG5ldyBCTihrZXksIGVuYyB8fCAxNik7XG5cbiAgLy8gRW5zdXJlIHRoYXQgdGhlIHByaXYgd29uJ3QgYmUgYmlnZ2VyIHRoYW4gbiwgb3RoZXJ3aXNlIHdlIG1heSBmYWlsXG4gIC8vIGluIGZpeGVkIG11bHRpcGxpY2F0aW9uIG1ldGhvZFxuICB0aGlzLnByaXYgPSB0aGlzLnByaXYudW1vZCh0aGlzLmVjLmN1cnZlLm4pO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuX2ltcG9ydFB1YmxpYyA9IGZ1bmN0aW9uIF9pbXBvcnRQdWJsaWMoa2V5LCBlbmMpIHtcbiAgaWYgKGtleS54IHx8IGtleS55KSB7XG4gICAgLy8gTW9udGdvbWVyeSBwb2ludHMgb25seSBoYXZlIGFuIGB4YCBjb29yZGluYXRlLlxuICAgIC8vIFdlaWVyc3RyYXNzL0Vkd2FyZHMgcG9pbnRzIG9uIHRoZSBvdGhlciBoYW5kIGhhdmUgYm90aCBgeGAgYW5kXG4gICAgLy8gYHlgIGNvb3JkaW5hdGVzLlxuICAgIGlmICh0aGlzLmVjLmN1cnZlLnR5cGUgPT09ICdtb250Jykge1xuICAgICAgYXNzZXJ0KGtleS54LCAnTmVlZCB4IGNvb3JkaW5hdGUnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZWMuY3VydmUudHlwZSA9PT0gJ3Nob3J0JyB8fFxuICAgICAgICAgICAgICAgdGhpcy5lYy5jdXJ2ZS50eXBlID09PSAnZWR3YXJkcycpIHtcbiAgICAgIGFzc2VydChrZXkueCAmJiBrZXkueSwgJ05lZWQgYm90aCB4IGFuZCB5IGNvb3JkaW5hdGUnKTtcbiAgICB9XG4gICAgdGhpcy5wdWIgPSB0aGlzLmVjLmN1cnZlLnBvaW50KGtleS54LCBrZXkueSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMucHViID0gdGhpcy5lYy5jdXJ2ZS5kZWNvZGVQb2ludChrZXksIGVuYyk7XG59O1xuXG4vLyBFQ0RIXG5LZXlQYWlyLnByb3RvdHlwZS5kZXJpdmUgPSBmdW5jdGlvbiBkZXJpdmUocHViKSB7XG4gIGlmKCFwdWIudmFsaWRhdGUoKSkge1xuICAgIGFzc2VydChwdWIudmFsaWRhdGUoKSwgJ3B1YmxpYyBwb2ludCBub3QgdmFsaWRhdGVkJyk7XG4gIH1cbiAgcmV0dXJuIHB1Yi5tdWwodGhpcy5wcml2KS5nZXRYKCk7XG59O1xuXG4vLyBFQ0RTQVxuS2V5UGFpci5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obXNnLCBlbmMsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRoaXMuZWMuc2lnbihtc2csIHRoaXMsIGVuYywgb3B0aW9ucyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkobXNnLCBzaWduYXR1cmUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRoaXMuZWMudmVyaWZ5KG1zZywgc2lnbmF0dXJlLCB0aGlzLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gIHJldHVybiAnPEtleSBwcml2OiAnICsgKHRoaXMucHJpdiAmJiB0aGlzLnByaXYudG9TdHJpbmcoMTYsIDIpKSArXG4gICAgICAgICAnIHB1YjogJyArICh0aGlzLnB1YiAmJiB0aGlzLnB1Yi5pbnNwZWN0KCkpICsgJyA+Jztcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIFNpZ25hdHVyZShvcHRpb25zLCBlbmMpIHtcbiAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBTaWduYXR1cmUpXG4gICAgcmV0dXJuIG9wdGlvbnM7XG5cbiAgaWYgKHRoaXMuX2ltcG9ydERFUihvcHRpb25zLCBlbmMpKVxuICAgIHJldHVybjtcblxuICBhc3NlcnQob3B0aW9ucy5yICYmIG9wdGlvbnMucywgJ1NpZ25hdHVyZSB3aXRob3V0IHIgb3IgcycpO1xuICB0aGlzLnIgPSBuZXcgQk4ob3B0aW9ucy5yLCAxNik7XG4gIHRoaXMucyA9IG5ldyBCTihvcHRpb25zLnMsIDE2KTtcbiAgaWYgKG9wdGlvbnMucmVjb3ZlcnlQYXJhbSA9PT0gdW5kZWZpbmVkKVxuICAgIHRoaXMucmVjb3ZlcnlQYXJhbSA9IG51bGw7XG4gIGVsc2VcbiAgICB0aGlzLnJlY292ZXJ5UGFyYW0gPSBvcHRpb25zLnJlY292ZXJ5UGFyYW07XG59XG5tb2R1bGUuZXhwb3J0cyA9IFNpZ25hdHVyZTtcblxuZnVuY3Rpb24gUG9zaXRpb24oKSB7XG4gIHRoaXMucGxhY2UgPSAwO1xufVxuXG5mdW5jdGlvbiBnZXRMZW5ndGgoYnVmLCBwKSB7XG4gIHZhciBpbml0aWFsID0gYnVmW3AucGxhY2UrK107XG4gIGlmICghKGluaXRpYWwgJiAweDgwKSkge1xuICAgIHJldHVybiBpbml0aWFsO1xuICB9XG4gIHZhciBvY3RldExlbiA9IGluaXRpYWwgJiAweGY7XG5cbiAgLy8gSW5kZWZpbml0ZSBsZW5ndGggb3Igb3ZlcmZsb3dcbiAgaWYgKG9jdGV0TGVuID09PSAwIHx8IG9jdGV0TGVuID4gNCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmKGJ1ZltwLnBsYWNlXSA9PT0gMHgwMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB2YWwgPSAwO1xuICBmb3IgKHZhciBpID0gMCwgb2ZmID0gcC5wbGFjZTsgaSA8IG9jdGV0TGVuOyBpKyssIG9mZisrKSB7XG4gICAgdmFsIDw8PSA4O1xuICAgIHZhbCB8PSBidWZbb2ZmXTtcbiAgICB2YWwgPj4+PSAwO1xuICB9XG5cbiAgLy8gTGVhZGluZyB6ZXJvZXNcbiAgaWYgKHZhbCA8PSAweDdmKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcC5wbGFjZSA9IG9mZjtcbiAgcmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gcm1QYWRkaW5nKGJ1Zikge1xuICB2YXIgaSA9IDA7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoIC0gMTtcbiAgd2hpbGUgKCFidWZbaV0gJiYgIShidWZbaSArIDFdICYgMHg4MCkgJiYgaSA8IGxlbikge1xuICAgIGkrKztcbiAgfVxuICBpZiAoaSA9PT0gMCkge1xuICAgIHJldHVybiBidWY7XG4gIH1cbiAgcmV0dXJuIGJ1Zi5zbGljZShpKTtcbn1cblxuU2lnbmF0dXJlLnByb3RvdHlwZS5faW1wb3J0REVSID0gZnVuY3Rpb24gX2ltcG9ydERFUihkYXRhLCBlbmMpIHtcbiAgZGF0YSA9IHV0aWxzLnRvQXJyYXkoZGF0YSwgZW5jKTtcbiAgdmFyIHAgPSBuZXcgUG9zaXRpb24oKTtcbiAgaWYgKGRhdGFbcC5wbGFjZSsrXSAhPT0gMHgzMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGVuID0gZ2V0TGVuZ3RoKGRhdGEsIHApO1xuICBpZiAobGVuID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoKGxlbiArIHAucGxhY2UpICE9PSBkYXRhLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZGF0YVtwLnBsYWNlKytdICE9PSAweDAyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBybGVuID0gZ2V0TGVuZ3RoKGRhdGEsIHApO1xuICBpZiAocmxlbiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKChkYXRhW3AucGxhY2VdICYgMTI4KSAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgciA9IGRhdGEuc2xpY2UocC5wbGFjZSwgcmxlbiArIHAucGxhY2UpO1xuICBwLnBsYWNlICs9IHJsZW47XG4gIGlmIChkYXRhW3AucGxhY2UrK10gIT09IDB4MDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHNsZW4gPSBnZXRMZW5ndGgoZGF0YSwgcCk7XG4gIGlmIChzbGVuID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZGF0YS5sZW5ndGggIT09IHNsZW4gKyBwLnBsYWNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICgoZGF0YVtwLnBsYWNlXSAmIDEyOCkgIT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHMgPSBkYXRhLnNsaWNlKHAucGxhY2UsIHNsZW4gKyBwLnBsYWNlKTtcbiAgaWYgKHJbMF0gPT09IDApIHtcbiAgICBpZiAoclsxXSAmIDB4ODApIHtcbiAgICAgIHIgPSByLnNsaWNlKDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMZWFkaW5nIHplcm9lc1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoc1swXSA9PT0gMCkge1xuICAgIGlmIChzWzFdICYgMHg4MCkge1xuICAgICAgcyA9IHMuc2xpY2UoMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExlYWRpbmcgemVyb2VzXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5yID0gbmV3IEJOKHIpO1xuICB0aGlzLnMgPSBuZXcgQk4ocyk7XG4gIHRoaXMucmVjb3ZlcnlQYXJhbSA9IG51bGw7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBjb25zdHJ1Y3RMZW5ndGgoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA8IDB4ODApIHtcbiAgICBhcnIucHVzaChsZW4pO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgb2N0ZXRzID0gMSArIChNYXRoLmxvZyhsZW4pIC8gTWF0aC5MTjIgPj4+IDMpO1xuICBhcnIucHVzaChvY3RldHMgfCAweDgwKTtcbiAgd2hpbGUgKC0tb2N0ZXRzKSB7XG4gICAgYXJyLnB1c2goKGxlbiA+Pj4gKG9jdGV0cyA8PCAzKSkgJiAweGZmKTtcbiAgfVxuICBhcnIucHVzaChsZW4pO1xufVxuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvREVSID0gZnVuY3Rpb24gdG9ERVIoZW5jKSB7XG4gIHZhciByID0gdGhpcy5yLnRvQXJyYXkoKTtcbiAgdmFyIHMgPSB0aGlzLnMudG9BcnJheSgpO1xuXG4gIC8vIFBhZCB2YWx1ZXNcbiAgaWYgKHJbMF0gJiAweDgwKVxuICAgIHIgPSBbIDAgXS5jb25jYXQocik7XG4gIC8vIFBhZCB2YWx1ZXNcbiAgaWYgKHNbMF0gJiAweDgwKVxuICAgIHMgPSBbIDAgXS5jb25jYXQocyk7XG5cbiAgciA9IHJtUGFkZGluZyhyKTtcbiAgcyA9IHJtUGFkZGluZyhzKTtcblxuICB3aGlsZSAoIXNbMF0gJiYgIShzWzFdICYgMHg4MCkpIHtcbiAgICBzID0gcy5zbGljZSgxKTtcbiAgfVxuICB2YXIgYXJyID0gWyAweDAyIF07XG4gIGNvbnN0cnVjdExlbmd0aChhcnIsIHIubGVuZ3RoKTtcbiAgYXJyID0gYXJyLmNvbmNhdChyKTtcbiAgYXJyLnB1c2goMHgwMik7XG4gIGNvbnN0cnVjdExlbmd0aChhcnIsIHMubGVuZ3RoKTtcbiAgdmFyIGJhY2tIYWxmID0gYXJyLmNvbmNhdChzKTtcbiAgdmFyIHJlcyA9IFsgMHgzMCBdO1xuICBjb25zdHJ1Y3RMZW5ndGgocmVzLCBiYWNrSGFsZi5sZW5ndGgpO1xuICByZXMgPSByZXMuY29uY2F0KGJhY2tIYWxmKTtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZShyZXMsIGVuYyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgSG1hY0RSQkcgPSByZXF1aXJlKCdobWFjLWRyYmcnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgY3VydmVzID0gcmVxdWlyZSgnLi4vY3VydmVzJyk7XG52YXIgcmFuZCA9IHJlcXVpcmUoJ2Jyb3JhbmQnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbnZhciBLZXlQYWlyID0gcmVxdWlyZSgnLi9rZXknKTtcbnZhciBTaWduYXR1cmUgPSByZXF1aXJlKCcuL3NpZ25hdHVyZScpO1xuXG5mdW5jdGlvbiBFQyhvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBFQykpXG4gICAgcmV0dXJuIG5ldyBFQyhvcHRpb25zKTtcblxuICAvLyBTaG9ydGN1dCBgZWxsaXB0aWMuZWMoY3VydmUtbmFtZSlgXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICBhc3NlcnQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnZlcywgb3B0aW9ucyksXG4gICAgICAnVW5rbm93biBjdXJ2ZSAnICsgb3B0aW9ucyk7XG5cbiAgICBvcHRpb25zID0gY3VydmVzW29wdGlvbnNdO1xuICB9XG5cbiAgLy8gU2hvcnRjdXQgZm9yIGBlbGxpcHRpYy5lYyhlbGxpcHRpYy5jdXJ2ZXMuY3VydmVOYW1lKWBcbiAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBjdXJ2ZXMuUHJlc2V0Q3VydmUpXG4gICAgb3B0aW9ucyA9IHsgY3VydmU6IG9wdGlvbnMgfTtcblxuICB0aGlzLmN1cnZlID0gb3B0aW9ucy5jdXJ2ZS5jdXJ2ZTtcbiAgdGhpcy5uID0gdGhpcy5jdXJ2ZS5uO1xuICB0aGlzLm5oID0gdGhpcy5uLnVzaHJuKDEpO1xuICB0aGlzLmcgPSB0aGlzLmN1cnZlLmc7XG5cbiAgLy8gUG9pbnQgb24gY3VydmVcbiAgdGhpcy5nID0gb3B0aW9ucy5jdXJ2ZS5nO1xuICB0aGlzLmcucHJlY29tcHV0ZShvcHRpb25zLmN1cnZlLm4uYml0TGVuZ3RoKCkgKyAxKTtcblxuICAvLyBIYXNoIGZvciBmdW5jdGlvbiBmb3IgRFJCR1xuICB0aGlzLmhhc2ggPSBvcHRpb25zLmhhc2ggfHwgb3B0aW9ucy5jdXJ2ZS5oYXNoO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFQztcblxuRUMucHJvdG90eXBlLmtleVBhaXIgPSBmdW5jdGlvbiBrZXlQYWlyKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBLZXlQYWlyKHRoaXMsIG9wdGlvbnMpO1xufTtcblxuRUMucHJvdG90eXBlLmtleUZyb21Qcml2YXRlID0gZnVuY3Rpb24ga2V5RnJvbVByaXZhdGUocHJpdiwgZW5jKSB7XG4gIHJldHVybiBLZXlQYWlyLmZyb21Qcml2YXRlKHRoaXMsIHByaXYsIGVuYyk7XG59O1xuXG5FQy5wcm90b3R5cGUua2V5RnJvbVB1YmxpYyA9IGZ1bmN0aW9uIGtleUZyb21QdWJsaWMocHViLCBlbmMpIHtcbiAgcmV0dXJuIEtleVBhaXIuZnJvbVB1YmxpYyh0aGlzLCBwdWIsIGVuYyk7XG59O1xuXG5FQy5wcm90b3R5cGUuZ2VuS2V5UGFpciA9IGZ1bmN0aW9uIGdlbktleVBhaXIob3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpXG4gICAgb3B0aW9ucyA9IHt9O1xuXG4gIC8vIEluc3RhbnRpYXRlIEhtYWNfRFJCR1xuICB2YXIgZHJiZyA9IG5ldyBIbWFjRFJCRyh7XG4gICAgaGFzaDogdGhpcy5oYXNoLFxuICAgIHBlcnM6IG9wdGlvbnMucGVycyxcbiAgICBwZXJzRW5jOiBvcHRpb25zLnBlcnNFbmMgfHwgJ3V0ZjgnLFxuICAgIGVudHJvcHk6IG9wdGlvbnMuZW50cm9weSB8fCByYW5kKHRoaXMuaGFzaC5obWFjU3RyZW5ndGgpLFxuICAgIGVudHJvcHlFbmM6IG9wdGlvbnMuZW50cm9weSAmJiBvcHRpb25zLmVudHJvcHlFbmMgfHwgJ3V0ZjgnLFxuICAgIG5vbmNlOiB0aGlzLm4udG9BcnJheSgpLFxuICB9KTtcblxuICB2YXIgYnl0ZXMgPSB0aGlzLm4uYnl0ZUxlbmd0aCgpO1xuICB2YXIgbnMyID0gdGhpcy5uLnN1YihuZXcgQk4oMikpO1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIHByaXYgPSBuZXcgQk4oZHJiZy5nZW5lcmF0ZShieXRlcykpO1xuICAgIGlmIChwcml2LmNtcChuczIpID4gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgcHJpdi5pYWRkbigxKTtcbiAgICByZXR1cm4gdGhpcy5rZXlGcm9tUHJpdmF0ZShwcml2KTtcbiAgfVxufTtcblxuRUMucHJvdG90eXBlLl90cnVuY2F0ZVRvTiA9IGZ1bmN0aW9uIF90cnVuY2F0ZVRvTihtc2csIHRydW5jT25seSwgYml0TGVuZ3RoKSB7XG4gIHZhciBieXRlTGVuZ3RoO1xuICBpZiAoQk4uaXNCTihtc2cpIHx8IHR5cGVvZiBtc2cgPT09ICdudW1iZXInKSB7XG4gICAgbXNnID0gbmV3IEJOKG1zZywgMTYpO1xuICAgIGJ5dGVMZW5ndGggPSBtc2cuYnl0ZUxlbmd0aCgpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtc2cgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gQk4gYXNzdW1lcyBhbiBhcnJheS1saWtlIGlucHV0IGFuZCBhc3NlcnRzIGxlbmd0aFxuICAgIGJ5dGVMZW5ndGggPSBtc2cubGVuZ3RoO1xuICAgIG1zZyA9IG5ldyBCTihtc2csIDE2KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBCTiBjb252ZXJ0cyB0aGUgdmFsdWUgdG8gc3RyaW5nXG4gICAgdmFyIHN0ciA9IG1zZy50b1N0cmluZygpO1xuICAgIC8vIEhFWCBlbmNvZGluZ1xuICAgIGJ5dGVMZW5ndGggPSAoc3RyLmxlbmd0aCArIDEpID4+PiAxO1xuICAgIG1zZyA9IG5ldyBCTihzdHIsIDE2KTtcbiAgfVxuICAvLyBBbGxvdyBvdmVycmlkaW5nXG4gIGlmICh0eXBlb2YgYml0TGVuZ3RoICE9PSAnbnVtYmVyJykge1xuICAgIGJpdExlbmd0aCA9IGJ5dGVMZW5ndGggKiA4O1xuICB9XG4gIHZhciBkZWx0YSA9IGJpdExlbmd0aCAtIHRoaXMubi5iaXRMZW5ndGgoKTtcbiAgaWYgKGRlbHRhID4gMClcbiAgICBtc2cgPSBtc2cudXNocm4oZGVsdGEpO1xuICBpZiAoIXRydW5jT25seSAmJiBtc2cuY21wKHRoaXMubikgPj0gMClcbiAgICByZXR1cm4gbXNnLnN1Yih0aGlzLm4pO1xuICBlbHNlXG4gICAgcmV0dXJuIG1zZztcbn07XG5cbkVDLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gc2lnbihtc2csIGtleSwgZW5jLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZW5jID09PSAnb2JqZWN0Jykge1xuICAgIG9wdGlvbnMgPSBlbmM7XG4gICAgZW5jID0gbnVsbDtcbiAgfVxuICBpZiAoIW9wdGlvbnMpXG4gICAgb3B0aW9ucyA9IHt9O1xuXG4gIGlmICh0eXBlb2YgbXNnICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgbXNnICE9PSAnbnVtYmVyJyAmJiAhQk4uaXNCTihtc2cpKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBtc2cgPT09ICdvYmplY3QnICYmIG1zZyAmJiB0eXBlb2YgbXNnLmxlbmd0aCA9PT0gJ251bWJlcicsXG4gICAgICAnRXhwZWN0ZWQgbWVzc2FnZSB0byBiZSBhbiBhcnJheS1saWtlLCBhIGhleCBzdHJpbmcsIG9yIGEgQk4gaW5zdGFuY2UnKTtcbiAgICBhc3NlcnQoKG1zZy5sZW5ndGggPj4+IDApID09PSBtc2cubGVuZ3RoKTsgLy8gbm9uLW5lZ2F0aXZlIDMyLWJpdCBpbnRlZ2VyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIGFzc2VydCgobXNnW2ldICYgMjU1KSA9PT0gbXNnW2ldKTtcbiAgfVxuXG4gIGtleSA9IHRoaXMua2V5RnJvbVByaXZhdGUoa2V5LCBlbmMpO1xuICBtc2cgPSB0aGlzLl90cnVuY2F0ZVRvTihtc2csIGZhbHNlLCBvcHRpb25zLm1zZ0JpdExlbmd0aCk7XG5cbiAgLy8gV291bGQgZmFpbCBmdXJ0aGVyIGNoZWNrcywgYnV0IGxldCdzIG1ha2UgdGhlIGVycm9yIG1lc3NhZ2UgY2xlYXJcbiAgYXNzZXJ0KCFtc2cuaXNOZWcoKSwgJ0NhbiBub3Qgc2lnbiBhIG5lZ2F0aXZlIG1lc3NhZ2UnKTtcblxuICAvLyBaZXJvLWV4dGVuZCBrZXkgdG8gcHJvdmlkZSBlbm91Z2ggZW50cm9weVxuICB2YXIgYnl0ZXMgPSB0aGlzLm4uYnl0ZUxlbmd0aCgpO1xuICB2YXIgYmtleSA9IGtleS5nZXRQcml2YXRlKCkudG9BcnJheSgnYmUnLCBieXRlcyk7XG5cbiAgLy8gWmVyby1leHRlbmQgbm9uY2UgdG8gaGF2ZSB0aGUgc2FtZSBieXRlIHNpemUgYXMgTlxuICB2YXIgbm9uY2UgPSBtc2cudG9BcnJheSgnYmUnLCBieXRlcyk7XG5cbiAgLy8gUmVjaGVjayBub25jZSB0byBiZSBiaWplY3RpdmUgdG8gbXNnXG4gIGFzc2VydCgobmV3IEJOKG5vbmNlKSkuZXEobXNnKSwgJ0NhbiBub3Qgc2lnbiBtZXNzYWdlJyk7XG5cbiAgLy8gSW5zdGFudGlhdGUgSG1hY19EUkJHXG4gIHZhciBkcmJnID0gbmV3IEhtYWNEUkJHKHtcbiAgICBoYXNoOiB0aGlzLmhhc2gsXG4gICAgZW50cm9weTogYmtleSxcbiAgICBub25jZTogbm9uY2UsXG4gICAgcGVyczogb3B0aW9ucy5wZXJzLFxuICAgIHBlcnNFbmM6IG9wdGlvbnMucGVyc0VuYyB8fCAndXRmOCcsXG4gIH0pO1xuXG4gIC8vIE51bWJlciBvZiBieXRlcyB0byBnZW5lcmF0ZVxuICB2YXIgbnMxID0gdGhpcy5uLnN1YihuZXcgQk4oMSkpO1xuXG4gIGZvciAodmFyIGl0ZXIgPSAwOyA7IGl0ZXIrKykge1xuICAgIHZhciBrID0gb3B0aW9ucy5rID9cbiAgICAgIG9wdGlvbnMuayhpdGVyKSA6XG4gICAgICBuZXcgQk4oZHJiZy5nZW5lcmF0ZSh0aGlzLm4uYnl0ZUxlbmd0aCgpKSk7XG4gICAgayA9IHRoaXMuX3RydW5jYXRlVG9OKGssIHRydWUpO1xuICAgIGlmIChrLmNtcG4oMSkgPD0gMCB8fCBrLmNtcChuczEpID49IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBrcCA9IHRoaXMuZy5tdWwoayk7XG4gICAgaWYgKGtwLmlzSW5maW5pdHkoKSlcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgdmFyIGtwWCA9IGtwLmdldFgoKTtcbiAgICB2YXIgciA9IGtwWC51bW9kKHRoaXMubik7XG4gICAgaWYgKHIuY21wbigwKSA9PT0gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgdmFyIHMgPSBrLmludm0odGhpcy5uKS5tdWwoci5tdWwoa2V5LmdldFByaXZhdGUoKSkuaWFkZChtc2cpKTtcbiAgICBzID0gcy51bW9kKHRoaXMubik7XG4gICAgaWYgKHMuY21wbigwKSA9PT0gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgdmFyIHJlY292ZXJ5UGFyYW0gPSAoa3AuZ2V0WSgpLmlzT2RkKCkgPyAxIDogMCkgfFxuICAgICAgICAgICAgICAgICAgICAgICAgKGtwWC5jbXAocikgIT09IDAgPyAyIDogMCk7XG5cbiAgICAvLyBVc2UgY29tcGxlbWVudCBvZiBgc2AsIGlmIGl0IGlzID4gYG4gLyAyYFxuICAgIGlmIChvcHRpb25zLmNhbm9uaWNhbCAmJiBzLmNtcCh0aGlzLm5oKSA+IDApIHtcbiAgICAgIHMgPSB0aGlzLm4uc3ViKHMpO1xuICAgICAgcmVjb3ZlcnlQYXJhbSBePSAxO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKHsgcjogciwgczogcywgcmVjb3ZlcnlQYXJhbTogcmVjb3ZlcnlQYXJhbSB9KTtcbiAgfVxufTtcblxuRUMucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtc2csIHNpZ25hdHVyZSwga2V5LCBlbmMsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKVxuICAgIG9wdGlvbnMgPSB7fTtcblxuICBtc2cgPSB0aGlzLl90cnVuY2F0ZVRvTihtc2csIGZhbHNlLCBvcHRpb25zLm1zZ0JpdExlbmd0aCk7XG4gIGtleSA9IHRoaXMua2V5RnJvbVB1YmxpYyhrZXksIGVuYyk7XG4gIHNpZ25hdHVyZSA9IG5ldyBTaWduYXR1cmUoc2lnbmF0dXJlLCAnaGV4Jyk7XG5cbiAgLy8gUGVyZm9ybSBwcmltaXRpdmUgdmFsdWVzIHZhbGlkYXRpb25cbiAgdmFyIHIgPSBzaWduYXR1cmUucjtcbiAgdmFyIHMgPSBzaWduYXR1cmUucztcbiAgaWYgKHIuY21wbigxKSA8IDAgfHwgci5jbXAodGhpcy5uKSA+PSAwKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKHMuY21wbigxKSA8IDAgfHwgcy5jbXAodGhpcy5uKSA+PSAwKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBWYWxpZGF0ZSBzaWduYXR1cmVcbiAgdmFyIHNpbnYgPSBzLmludm0odGhpcy5uKTtcbiAgdmFyIHUxID0gc2ludi5tdWwobXNnKS51bW9kKHRoaXMubik7XG4gIHZhciB1MiA9IHNpbnYubXVsKHIpLnVtb2QodGhpcy5uKTtcbiAgdmFyIHA7XG5cbiAgaWYgKCF0aGlzLmN1cnZlLl9tYXh3ZWxsVHJpY2spIHtcbiAgICBwID0gdGhpcy5nLm11bEFkZCh1MSwga2V5LmdldFB1YmxpYygpLCB1Mik7XG4gICAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIHAuZ2V0WCgpLnVtb2QodGhpcy5uKS5jbXAocikgPT09IDA7XG4gIH1cblxuICAvLyBOT1RFOiBHcmVnIE1heHdlbGwncyB0cmljaywgaW5zcGlyZWQgYnk6XG4gIC8vIGh0dHBzOi8vZ2l0LmlvL3ZhZDNLXG5cbiAgcCA9IHRoaXMuZy5qbXVsQWRkKHUxLCBrZXkuZ2V0UHVibGljKCksIHUyKTtcbiAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBDb21wYXJlIGBwLnhgIG9mIEphY29iaWFuIHBvaW50IHdpdGggYHJgLFxuICAvLyB0aGlzIHdpbGwgZG8gYHAueCA9PSByICogcC56XjJgIGluc3RlYWQgb2YgbXVsdGlwbHlpbmcgYHAueGAgYnkgdGhlXG4gIC8vIGludmVyc2Ugb2YgYHAuel4yYFxuICByZXR1cm4gcC5lcVhUb1Aocik7XG59O1xuXG5FQy5wcm90b3R5cGUucmVjb3ZlclB1YktleSA9IGZ1bmN0aW9uKG1zZywgc2lnbmF0dXJlLCBqLCBlbmMpIHtcbiAgYXNzZXJ0KCgzICYgaikgPT09IGosICdUaGUgcmVjb3ZlcnkgcGFyYW0gaXMgbW9yZSB0aGFuIHR3byBiaXRzJyk7XG4gIHNpZ25hdHVyZSA9IG5ldyBTaWduYXR1cmUoc2lnbmF0dXJlLCBlbmMpO1xuXG4gIHZhciBuID0gdGhpcy5uO1xuICB2YXIgZSA9IG5ldyBCTihtc2cpO1xuICB2YXIgciA9IHNpZ25hdHVyZS5yO1xuICB2YXIgcyA9IHNpZ25hdHVyZS5zO1xuXG4gIC8vIEEgc2V0IExTQiBzaWduaWZpZXMgdGhhdCB0aGUgeS1jb29yZGluYXRlIGlzIG9kZFxuICB2YXIgaXNZT2RkID0gaiAmIDE7XG4gIHZhciBpc1NlY29uZEtleSA9IGogPj4gMTtcbiAgaWYgKHIuY21wKHRoaXMuY3VydmUucC51bW9kKHRoaXMuY3VydmUubikpID49IDAgJiYgaXNTZWNvbmRLZXkpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBzZW5jb25kIGtleSBjYW5kaW5hdGUnKTtcblxuICAvLyAxLjEuIExldCB4ID0gciArIGpuLlxuICBpZiAoaXNTZWNvbmRLZXkpXG4gICAgciA9IHRoaXMuY3VydmUucG9pbnRGcm9tWChyLmFkZCh0aGlzLmN1cnZlLm4pLCBpc1lPZGQpO1xuICBlbHNlXG4gICAgciA9IHRoaXMuY3VydmUucG9pbnRGcm9tWChyLCBpc1lPZGQpO1xuXG4gIHZhciBySW52ID0gc2lnbmF0dXJlLnIuaW52bShuKTtcbiAgdmFyIHMxID0gbi5zdWIoZSkubXVsKHJJbnYpLnVtb2Qobik7XG4gIHZhciBzMiA9IHMubXVsKHJJbnYpLnVtb2Qobik7XG5cbiAgLy8gMS42LjEgQ29tcHV0ZSBRID0gcl4tMSAoc1IgLSAgZUcpXG4gIC8vICAgICAgICAgICAgICAgUSA9IHJeLTEgKHNSICsgLWVHKVxuICByZXR1cm4gdGhpcy5nLm11bEFkZChzMSwgciwgczIpO1xufTtcblxuRUMucHJvdG90eXBlLmdldEtleVJlY292ZXJ5UGFyYW0gPSBmdW5jdGlvbihlLCBzaWduYXR1cmUsIFEsIGVuYykge1xuICBzaWduYXR1cmUgPSBuZXcgU2lnbmF0dXJlKHNpZ25hdHVyZSwgZW5jKTtcbiAgaWYgKHNpZ25hdHVyZS5yZWNvdmVyeVBhcmFtICE9PSBudWxsKVxuICAgIHJldHVybiBzaWduYXR1cmUucmVjb3ZlcnlQYXJhbTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgIHZhciBRcHJpbWU7XG4gICAgdHJ5IHtcbiAgICAgIFFwcmltZSA9IHRoaXMucmVjb3ZlclB1YktleShlLCBzaWduYXR1cmUsIGkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChRcHJpbWUuZXEoUSkpXG4gICAgICByZXR1cm4gaTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIHZhbGlkIHJlY292ZXJ5IGZhY3RvcicpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcbnZhciBwYXJzZUJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcztcbnZhciBjYWNoZWRQcm9wZXJ0eSA9IHV0aWxzLmNhY2hlZFByb3BlcnR5O1xuXG4vKipcbiogQHBhcmFtIHtFRERTQX0gZWRkc2EgLSBpbnN0YW5jZVxuKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcHVibGljL3ByaXZhdGUga2V5IHBhcmFtZXRlcnNcbipcbiogQHBhcmFtIHtBcnJheTxCeXRlPn0gW3BhcmFtcy5zZWNyZXRdIC0gc2VjcmV0IHNlZWQgYnl0ZXNcbiogQHBhcmFtIHtQb2ludH0gW3BhcmFtcy5wdWJdIC0gcHVibGljIGtleSBwb2ludCAoYWthIGBBYCBpbiBlZGRzYSB0ZXJtcylcbiogQHBhcmFtIHtBcnJheTxCeXRlPn0gW3BhcmFtcy5wdWJdIC0gcHVibGljIGtleSBwb2ludCBlbmNvZGVkIGFzIGJ5dGVzXG4qXG4qL1xuZnVuY3Rpb24gS2V5UGFpcihlZGRzYSwgcGFyYW1zKSB7XG4gIHRoaXMuZWRkc2EgPSBlZGRzYTtcbiAgdGhpcy5fc2VjcmV0ID0gcGFyc2VCeXRlcyhwYXJhbXMuc2VjcmV0KTtcbiAgaWYgKGVkZHNhLmlzUG9pbnQocGFyYW1zLnB1YikpXG4gICAgdGhpcy5fcHViID0gcGFyYW1zLnB1YjtcbiAgZWxzZVxuICAgIHRoaXMuX3B1YkJ5dGVzID0gcGFyc2VCeXRlcyhwYXJhbXMucHViKTtcbn1cblxuS2V5UGFpci5mcm9tUHVibGljID0gZnVuY3Rpb24gZnJvbVB1YmxpYyhlZGRzYSwgcHViKSB7XG4gIGlmIChwdWIgaW5zdGFuY2VvZiBLZXlQYWlyKVxuICAgIHJldHVybiBwdWI7XG4gIHJldHVybiBuZXcgS2V5UGFpcihlZGRzYSwgeyBwdWI6IHB1YiB9KTtcbn07XG5cbktleVBhaXIuZnJvbVNlY3JldCA9IGZ1bmN0aW9uIGZyb21TZWNyZXQoZWRkc2EsIHNlY3JldCkge1xuICBpZiAoc2VjcmV0IGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gc2VjcmV0O1xuICByZXR1cm4gbmV3IEtleVBhaXIoZWRkc2EsIHsgc2VjcmV0OiBzZWNyZXQgfSk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5zZWNyZXQgPSBmdW5jdGlvbiBzZWNyZXQoKSB7XG4gIHJldHVybiB0aGlzLl9zZWNyZXQ7XG59O1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAncHViQnl0ZXMnLCBmdW5jdGlvbiBwdWJCeXRlcygpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZW5jb2RlUG9pbnQodGhpcy5wdWIoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ3B1YicsIGZ1bmN0aW9uIHB1YigpIHtcbiAgaWYgKHRoaXMuX3B1YkJ5dGVzKVxuICAgIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZVBvaW50KHRoaXMuX3B1YkJ5dGVzKTtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZy5tdWwodGhpcy5wcml2KCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsICdwcml2Qnl0ZXMnLCBmdW5jdGlvbiBwcml2Qnl0ZXMoKSB7XG4gIHZhciBlZGRzYSA9IHRoaXMuZWRkc2E7XG4gIHZhciBoYXNoID0gdGhpcy5oYXNoKCk7XG4gIHZhciBsYXN0SXggPSBlZGRzYS5lbmNvZGluZ0xlbmd0aCAtIDE7XG5cbiAgdmFyIGEgPSBoYXNoLnNsaWNlKDAsIGVkZHNhLmVuY29kaW5nTGVuZ3RoKTtcbiAgYVswXSAmPSAyNDg7XG4gIGFbbGFzdEl4XSAmPSAxMjc7XG4gIGFbbGFzdEl4XSB8PSA2NDtcblxuICByZXR1cm4gYTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAncHJpdicsIGZ1bmN0aW9uIHByaXYoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZUludCh0aGlzLnByaXZCeXRlcygpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAnaGFzaCcsIGZ1bmN0aW9uIGhhc2goKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmhhc2goKS51cGRhdGUodGhpcy5zZWNyZXQoKSkuZGlnZXN0KCk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ21lc3NhZ2VQcmVmaXgnLCBmdW5jdGlvbiBtZXNzYWdlUHJlZml4KCkge1xuICByZXR1cm4gdGhpcy5oYXNoKCkuc2xpY2UodGhpcy5lZGRzYS5lbmNvZGluZ0xlbmd0aCk7XG59KTtcblxuS2V5UGFpci5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obWVzc2FnZSkge1xuICBhc3NlcnQodGhpcy5fc2VjcmV0LCAnS2V5UGFpciBjYW4gb25seSB2ZXJpZnknKTtcbiAgcmV0dXJuIHRoaXMuZWRkc2Euc2lnbihtZXNzYWdlLCB0aGlzKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtZXNzYWdlLCBzaWcpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EudmVyaWZ5KG1lc3NhZ2UsIHNpZywgdGhpcyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRTZWNyZXQgPSBmdW5jdGlvbiBnZXRTZWNyZXQoZW5jKSB7XG4gIGFzc2VydCh0aGlzLl9zZWNyZXQsICdLZXlQYWlyIGlzIHB1YmxpYyBvbmx5Jyk7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy5zZWNyZXQoKSwgZW5jKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFB1YmxpYyA9IGZ1bmN0aW9uIGdldFB1YmxpYyhlbmMpIHtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZSh0aGlzLnB1YkJ5dGVzKCksIGVuYyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEtleVBhaXI7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xudmFyIGNhY2hlZFByb3BlcnR5ID0gdXRpbHMuY2FjaGVkUHJvcGVydHk7XG52YXIgcGFyc2VCeXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXM7XG5cbi8qKlxuKiBAcGFyYW0ge0VERFNBfSBlZGRzYSAtIGVkZHNhIGluc3RhbmNlXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fE9iamVjdH0gc2lnIC1cbiogQHBhcmFtIHtBcnJheTxCeXRlcz58UG9pbnR9IFtzaWcuUl0gLSBSIHBvaW50IGFzIFBvaW50IG9yIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fGJufSBbc2lnLlNdIC0gUyBzY2FsYXIgYXMgYm4gb3IgYnl0ZXNcbiogQHBhcmFtIHtBcnJheTxCeXRlcz59IFtzaWcuUmVuY29kZWRdIC0gUiBwb2ludCBlbmNvZGVkXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fSBbc2lnLlNlbmNvZGVkXSAtIFMgc2NhbGFyIGVuY29kZWRcbiovXG5mdW5jdGlvbiBTaWduYXR1cmUoZWRkc2EsIHNpZykge1xuICB0aGlzLmVkZHNhID0gZWRkc2E7XG5cbiAgaWYgKHR5cGVvZiBzaWcgIT09ICdvYmplY3QnKVxuICAgIHNpZyA9IHBhcnNlQnl0ZXMoc2lnKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShzaWcpKSB7XG4gICAgYXNzZXJ0KHNpZy5sZW5ndGggPT09IGVkZHNhLmVuY29kaW5nTGVuZ3RoICogMiwgJ1NpZ25hdHVyZSBoYXMgaW52YWxpZCBzaXplJyk7XG4gICAgc2lnID0ge1xuICAgICAgUjogc2lnLnNsaWNlKDAsIGVkZHNhLmVuY29kaW5nTGVuZ3RoKSxcbiAgICAgIFM6IHNpZy5zbGljZShlZGRzYS5lbmNvZGluZ0xlbmd0aCksXG4gICAgfTtcbiAgfVxuXG4gIGFzc2VydChzaWcuUiAmJiBzaWcuUywgJ1NpZ25hdHVyZSB3aXRob3V0IFIgb3IgUycpO1xuXG4gIGlmIChlZGRzYS5pc1BvaW50KHNpZy5SKSlcbiAgICB0aGlzLl9SID0gc2lnLlI7XG4gIGlmIChzaWcuUyBpbnN0YW5jZW9mIEJOKVxuICAgIHRoaXMuX1MgPSBzaWcuUztcblxuICB0aGlzLl9SZW5jb2RlZCA9IEFycmF5LmlzQXJyYXkoc2lnLlIpID8gc2lnLlIgOiBzaWcuUmVuY29kZWQ7XG4gIHRoaXMuX1NlbmNvZGVkID0gQXJyYXkuaXNBcnJheShzaWcuUykgPyBzaWcuUyA6IHNpZy5TZW5jb2RlZDtcbn1cblxuY2FjaGVkUHJvcGVydHkoU2lnbmF0dXJlLCAnUycsIGZ1bmN0aW9uIFMoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZUludCh0aGlzLlNlbmNvZGVkKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwgJ1InLCBmdW5jdGlvbiBSKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVQb2ludCh0aGlzLlJlbmNvZGVkKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwgJ1JlbmNvZGVkJywgZnVuY3Rpb24gUmVuY29kZWQoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmVuY29kZVBvaW50KHRoaXMuUigpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShTaWduYXR1cmUsICdTZW5jb2RlZCcsIGZ1bmN0aW9uIFNlbmNvZGVkKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVJbnQodGhpcy5TKCkpO1xufSk7XG5cblNpZ25hdHVyZS5wcm90b3R5cGUudG9CeXRlcyA9IGZ1bmN0aW9uIHRvQnl0ZXMoKSB7XG4gIHJldHVybiB0aGlzLlJlbmNvZGVkKCkuY29uY2F0KHRoaXMuU2VuY29kZWQoKSk7XG59O1xuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvSGV4ID0gZnVuY3Rpb24gdG9IZXgoKSB7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy50b0J5dGVzKCksICdoZXgnKS50b1VwcGVyQ2FzZSgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBTaWduYXR1cmU7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc2ggPSByZXF1aXJlKCdoYXNoLmpzJyk7XG52YXIgY3VydmVzID0gcmVxdWlyZSgnLi4vY3VydmVzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcbnZhciBwYXJzZUJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcztcbnZhciBLZXlQYWlyID0gcmVxdWlyZSgnLi9rZXknKTtcbnZhciBTaWduYXR1cmUgPSByZXF1aXJlKCcuL3NpZ25hdHVyZScpO1xuXG5mdW5jdGlvbiBFRERTQShjdXJ2ZSkge1xuICBhc3NlcnQoY3VydmUgPT09ICdlZDI1NTE5JywgJ29ubHkgdGVzdGVkIHdpdGggZWQyNTUxOSBzbyBmYXInKTtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRUREU0EpKVxuICAgIHJldHVybiBuZXcgRUREU0EoY3VydmUpO1xuXG4gIGN1cnZlID0gY3VydmVzW2N1cnZlXS5jdXJ2ZTtcbiAgdGhpcy5jdXJ2ZSA9IGN1cnZlO1xuICB0aGlzLmcgPSBjdXJ2ZS5nO1xuICB0aGlzLmcucHJlY29tcHV0ZShjdXJ2ZS5uLmJpdExlbmd0aCgpICsgMSk7XG5cbiAgdGhpcy5wb2ludENsYXNzID0gY3VydmUucG9pbnQoKS5jb25zdHJ1Y3RvcjtcbiAgdGhpcy5lbmNvZGluZ0xlbmd0aCA9IE1hdGguY2VpbChjdXJ2ZS5uLmJpdExlbmd0aCgpIC8gOCk7XG4gIHRoaXMuaGFzaCA9IGhhc2guc2hhNTEyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEVERFNBO1xuXG4vKipcbiogQHBhcmFtIHtBcnJheXxTdHJpbmd9IG1lc3NhZ2UgLSBtZXNzYWdlIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfEtleVBhaXJ9IHNlY3JldCAtIHNlY3JldCBieXRlcyBvciBhIGtleXBhaXJcbiogQHJldHVybnMge1NpZ25hdHVyZX0gLSBzaWduYXR1cmVcbiovXG5FRERTQS5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obWVzc2FnZSwgc2VjcmV0KSB7XG4gIG1lc3NhZ2UgPSBwYXJzZUJ5dGVzKG1lc3NhZ2UpO1xuICB2YXIga2V5ID0gdGhpcy5rZXlGcm9tU2VjcmV0KHNlY3JldCk7XG4gIHZhciByID0gdGhpcy5oYXNoSW50KGtleS5tZXNzYWdlUHJlZml4KCksIG1lc3NhZ2UpO1xuICB2YXIgUiA9IHRoaXMuZy5tdWwocik7XG4gIHZhciBSZW5jb2RlZCA9IHRoaXMuZW5jb2RlUG9pbnQoUik7XG4gIHZhciBzXyA9IHRoaXMuaGFzaEludChSZW5jb2RlZCwga2V5LnB1YkJ5dGVzKCksIG1lc3NhZ2UpXG4gICAgLm11bChrZXkucHJpdigpKTtcbiAgdmFyIFMgPSByLmFkZChzXykudW1vZCh0aGlzLmN1cnZlLm4pO1xuICByZXR1cm4gdGhpcy5tYWtlU2lnbmF0dXJlKHsgUjogUiwgUzogUywgUmVuY29kZWQ6IFJlbmNvZGVkIH0pO1xufTtcblxuLyoqXG4qIEBwYXJhbSB7QXJyYXl9IG1lc3NhZ2UgLSBtZXNzYWdlIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfFNpZ25hdHVyZX0gc2lnIC0gc2lnIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfFBvaW50fEtleVBhaXJ9IHB1YiAtIHB1YmxpYyBrZXlcbiogQHJldHVybnMge0Jvb2xlYW59IC0gdHJ1ZSBpZiBwdWJsaWMga2V5IG1hdGNoZXMgc2lnIG9mIG1lc3NhZ2VcbiovXG5FRERTQS5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KG1lc3NhZ2UsIHNpZywgcHViKSB7XG4gIG1lc3NhZ2UgPSBwYXJzZUJ5dGVzKG1lc3NhZ2UpO1xuICBzaWcgPSB0aGlzLm1ha2VTaWduYXR1cmUoc2lnKTtcbiAgaWYgKHNpZy5TKCkuZ3RlKHNpZy5lZGRzYS5jdXJ2ZS5uKSB8fCBzaWcuUygpLmlzTmVnKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGtleSA9IHRoaXMua2V5RnJvbVB1YmxpYyhwdWIpO1xuICB2YXIgaCA9IHRoaXMuaGFzaEludChzaWcuUmVuY29kZWQoKSwga2V5LnB1YkJ5dGVzKCksIG1lc3NhZ2UpO1xuICB2YXIgU0cgPSB0aGlzLmcubXVsKHNpZy5TKCkpO1xuICB2YXIgUnBsdXNBaCA9IHNpZy5SKCkuYWRkKGtleS5wdWIoKS5tdWwoaCkpO1xuICByZXR1cm4gUnBsdXNBaC5lcShTRyk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuaGFzaEludCA9IGZ1bmN0aW9uIGhhc2hJbnQoKSB7XG4gIHZhciBoYXNoID0gdGhpcy5oYXNoKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgIGhhc2gudXBkYXRlKGFyZ3VtZW50c1tpXSk7XG4gIHJldHVybiB1dGlscy5pbnRGcm9tTEUoaGFzaC5kaWdlc3QoKSkudW1vZCh0aGlzLmN1cnZlLm4pO1xufTtcblxuRUREU0EucHJvdG90eXBlLmtleUZyb21QdWJsaWMgPSBmdW5jdGlvbiBrZXlGcm9tUHVibGljKHB1Yikge1xuICByZXR1cm4gS2V5UGFpci5mcm9tUHVibGljKHRoaXMsIHB1Yik7XG59O1xuXG5FRERTQS5wcm90b3R5cGUua2V5RnJvbVNlY3JldCA9IGZ1bmN0aW9uIGtleUZyb21TZWNyZXQoc2VjcmV0KSB7XG4gIHJldHVybiBLZXlQYWlyLmZyb21TZWNyZXQodGhpcywgc2VjcmV0KTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5tYWtlU2lnbmF0dXJlID0gZnVuY3Rpb24gbWFrZVNpZ25hdHVyZShzaWcpIHtcbiAgaWYgKHNpZyBpbnN0YW5jZW9mIFNpZ25hdHVyZSlcbiAgICByZXR1cm4gc2lnO1xuICByZXR1cm4gbmV3IFNpZ25hdHVyZSh0aGlzLCBzaWcpO1xufTtcblxuLyoqXG4qICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWpvc2Vmc3Nvbi1lZGRzYS1lZDI1NTE5LTAzI3NlY3Rpb24tNS4yXG4qXG4qIEVERFNBIGRlZmluZXMgbWV0aG9kcyBmb3IgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHBvaW50cyBhbmQgaW50ZWdlcnMuIFRoZXNlIGFyZVxuKiBoZWxwZXIgY29udmVuaWVuY2UgbWV0aG9kcywgdGhhdCBwYXNzIGFsb25nIHRvIHV0aWxpdHkgZnVuY3Rpb25zIGltcGxpZWRcbiogcGFyYW1ldGVycy5cbipcbiovXG5FRERTQS5wcm90b3R5cGUuZW5jb2RlUG9pbnQgPSBmdW5jdGlvbiBlbmNvZGVQb2ludChwb2ludCkge1xuICB2YXIgZW5jID0gcG9pbnQuZ2V0WSgpLnRvQXJyYXkoJ2xlJywgdGhpcy5lbmNvZGluZ0xlbmd0aCk7XG4gIGVuY1t0aGlzLmVuY29kaW5nTGVuZ3RoIC0gMV0gfD0gcG9pbnQuZ2V0WCgpLmlzT2RkKCkgPyAweDgwIDogMDtcbiAgcmV0dXJuIGVuYztcbn07XG5cbkVERFNBLnByb3RvdHlwZS5kZWNvZGVQb2ludCA9IGZ1bmN0aW9uIGRlY29kZVBvaW50KGJ5dGVzKSB7XG4gIGJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcyhieXRlcyk7XG5cbiAgdmFyIGxhc3RJeCA9IGJ5dGVzLmxlbmd0aCAtIDE7XG4gIHZhciBub3JtZWQgPSBieXRlcy5zbGljZSgwLCBsYXN0SXgpLmNvbmNhdChieXRlc1tsYXN0SXhdICYgfjB4ODApO1xuICB2YXIgeElzT2RkID0gKGJ5dGVzW2xhc3RJeF0gJiAweDgwKSAhPT0gMDtcblxuICB2YXIgeSA9IHV0aWxzLmludEZyb21MRShub3JtZWQpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludEZyb21ZKHksIHhJc09kZCk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuZW5jb2RlSW50ID0gZnVuY3Rpb24gZW5jb2RlSW50KG51bSkge1xuICByZXR1cm4gbnVtLnRvQXJyYXkoJ2xlJywgdGhpcy5lbmNvZGluZ0xlbmd0aCk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuZGVjb2RlSW50ID0gZnVuY3Rpb24gZGVjb2RlSW50KGJ5dGVzKSB7XG4gIHJldHVybiB1dGlscy5pbnRGcm9tTEUoYnl0ZXMpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmlzUG9pbnQgPSBmdW5jdGlvbiBpc1BvaW50KHZhbCkge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgdGhpcy5wb2ludENsYXNzO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZWxsaXB0aWMgPSBleHBvcnRzO1xuXG5lbGxpcHRpYy52ZXJzaW9uID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcbmVsbGlwdGljLnV0aWxzID0gcmVxdWlyZSgnLi9lbGxpcHRpYy91dGlscycpO1xuZWxsaXB0aWMucmFuZCA9IHJlcXVpcmUoJ2Jyb3JhbmQnKTtcbmVsbGlwdGljLmN1cnZlID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9jdXJ2ZScpO1xuZWxsaXB0aWMuY3VydmVzID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9jdXJ2ZXMnKTtcblxuLy8gUHJvdG9jb2xzXG5lbGxpcHRpYy5lYyA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvZWMnKTtcbmVsbGlwdGljLmVkZHNhID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9lZGRzYScpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2FzbjEuanMnKS5iaWdudW0sXG5cdEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJhc2U2NFRvQmlnTnVtKHZhbCwgemVybykge1xuXHR2YXIgYnVmID0gQnVmZmVyLmZyb20odmFsLCAnYmFzZTY0Jyk7XG5cdHZhciBibiA9IHZhbCA9IG5ldyBCTihidWYsIDEwLCAnYmUnKS5pYWJzKCk7XG5cdGlmICh6ZXJvKSB7XG5cdFx0YnVmLmZpbGwoMCk7XG5cdH1cblx0cmV0dXJuIGJuO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2FzbjEuanMnKS5kZWZpbmUoJ0FsZ29yaXRobUlkZW50aWZlcicsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLnNlcSgpLm9iaihcblx0XHR0aGlzLmtleSgnYWxnb3JpdGhtJykub2JqaWQoKSxcblx0XHR0aGlzLmtleSgncGFyYW1ldGVycycpLm9wdGlvbmFsKCkuYW55KClcblx0KTtcbn0pO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBBbGdvcml0aG1JZGVudGlmaWVyID0gcmVxdWlyZSgnLi9hbGdvcml0aG0taWRlbnRpZmllcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2FzbjEuanMnKS5kZWZpbmUoJ1B1YmxpY0tleUluZm8nLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5zZXEoKS5vYmooXG5cdFx0dGhpcy5rZXkoJ2FsZ29yaXRobScpLnVzZShBbGdvcml0aG1JZGVudGlmaWVyKSxcblx0XHR0aGlzLmtleSgnUHVibGljS2V5JykuYml0c3RyKClcblx0KTtcbn0pO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnYXNuMS5qcycpLmRlZmluZSgnVmVyc2lvbicsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLmludCgpO1xufSk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEFsZ29yaXRobUlkZW50aWZpZXIgPSByZXF1aXJlKCcuL2FsZ29yaXRobS1pZGVudGlmaWVyJyk7XG52YXIgVmVyc2lvbiA9IHJlcXVpcmUoJy4vdmVyc2lvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2FzbjEuanMnKS5kZWZpbmUoJ1ByaXZhdGVLZXlJbmZvJywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCd2ZXJzaW9uJykudXNlKFZlcnNpb24pLFxuXHRcdHRoaXMua2V5KCdwcml2YXRlS2V5QWxnb3JpdGhtJykudXNlKEFsZ29yaXRobUlkZW50aWZpZXIpLFxuXHRcdHRoaXMua2V5KCdwcml2YXRlS2V5Jykub2N0c3RyKCksXG5cdFx0dGhpcy5rZXkoJ2F0dHJpYnV0ZXMnKS5vcHRpb25hbCgpLmFueSgpXG5cdCk7XG59KTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNuMSA9IHJlcXVpcmUoJ2FzbjEuanMnKSxcblx0QnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXIsXG5cdEVDID0gcmVxdWlyZSgnZWxsaXB0aWMnKS5lYztcblxudmFyIGI2NFRvQm4gPSByZXF1aXJlKCcuL2I2NC10by1ibicpO1xuXG52YXIgUHVibGljS2V5SW5mbyA9IHJlcXVpcmUoJy4vYXNuMS9wdWJsaWMta2V5LWluZm8nKSxcblx0UHJpdmF0ZUtleUluZm8gPSByZXF1aXJlKCcuL2FzbjEvcHJpdmF0ZS1rZXktaW5mbycpLFxuXHRWZXJzaW9uID0gcmVxdWlyZSgnLi9hc24xL3ZlcnNpb24nKTtcblxudmFyIEVDUGFyYW1ldGVycyA9IGFzbjEuZGVmaW5lKCdFQ1BhcmFtZXRlcnMnLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5jaG9pY2Uoe1xuXHRcdG5hbWVkQ3VydmU6IHRoaXMub2JqaWQoKVxuXHR9KTtcbn0pO1xuXG52YXIgZWNQcml2a2V5VmVyMSA9IDE7XG5cbnZhciBFQ1ByaXZhdGVLZXkgPSBhc24xLmRlZmluZSgnRUNQcml2YXRlS2V5JywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCd2ZXJzaW9uJykudXNlKFZlcnNpb24pLFxuXHRcdHRoaXMua2V5KCdwcml2YXRlS2V5Jykub2N0c3RyKCksXG5cdFx0dGhpcy5rZXkoJ3BhcmFtZXRlcnMnKS5leHBsaWNpdCgwKS5vcHRpb25hbCgpLmFueSgpLFxuXHRcdHRoaXMua2V5KCdwdWJsaWNLZXknKS5leHBsaWNpdCgxKS5vcHRpb25hbCgpLmJpdHN0cigpXG5cdCk7XG59KTtcblxudmFyIGN1cnZlcyA9IHtcblx0J1AtMjU2JzogJ3AyNTYnLFxuXHQnUC0zODQnOiAncDM4NCcsXG5cdCdQLTUyMSc6ICdwNTIxJ1xufTtcblxudmFyIG9pZHMgPSB7XG5cdCdQLTI1Nic6IFsxLCAyLCA4NDAsIDEwMDQ1LCAzLCAxLCA3XSxcblx0J1AtMzg0JzogWzEsIDMsIDEzMiwgMCwgMzRdLFxuXHQnUC01MjEnOiBbMSwgMywgMTMyLCAwLCAzNV1cbn07XG52YXIgcGFyYW1ldGVycyA9IHt9O1xudmFyIGFsZ29yaXRobXMgPSB7fTtcbk9iamVjdC5rZXlzKG9pZHMpLmZvckVhY2goZnVuY3Rpb24oY3J2KSB7XG5cdHBhcmFtZXRlcnNbY3J2XSA9IEVDUGFyYW1ldGVycy5lbmNvZGUoe1xuXHRcdHR5cGU6ICduYW1lZEN1cnZlJyxcblx0XHR2YWx1ZTogb2lkc1tjcnZdXG5cdH0sICdkZXInKTtcblx0YWxnb3JpdGhtc1tjcnZdID0ge1xuXHRcdGFsZ29yaXRobTogIFsxLCAyLCA4NDAsIDEwMDQ1LCAyLCAxXSxcblx0XHRwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzW2Nydl1cblx0fTtcbn0pO1xub2lkcyA9IG51bGw7XG5cbmZ1bmN0aW9uIGVjSndrVG9CdWZmZXIoandrLCBvcHRzKSB7XG5cdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5jcnYpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5jcnZcIiB0byBiZSBhIFN0cmluZycpO1xuXHR9XG5cblx0dmFyIGhhc0QgPSAnc3RyaW5nJyA9PT0gdHlwZW9mIGp3ay5kO1xuXHR2YXIgeHlUeXBlcyA9IGhhc0Rcblx0XHQ/IFsndW5kZWZpbmVkJywgJ3N0cmluZyddXG5cdFx0OiBbJ3N0cmluZyddO1xuXG5cdGlmICgtMSA9PT0geHlUeXBlcy5pbmRleE9mKHR5cGVvZiBqd2sueCkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay54XCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdGlmICgtMSA9PT0geHlUeXBlcy5pbmRleE9mKHR5cGVvZiBqd2sueSkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay55XCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdGlmIChvcHRzLnByaXZhdGUgJiYgIWhhc0QpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5kXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdHZhciBjdXJ2ZU5hbWUgPSBjdXJ2ZXNbandrLmNydl07XG5cdGlmICghY3VydmVOYW1lKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBjdXJ2ZSBcIicgKyBqd2suY3J2ICsgJ1wiJyk7XG5cdH1cblxuXHR2YXIgY3VydmUgPSBuZXcgRUMoY3VydmVOYW1lKTtcblxuXHR2YXIga2V5ID0ge307XG5cblx0dmFyIGhhc1B1YiA9IGp3ay54ICYmIGp3ay55O1xuXHRpZiAoaGFzUHViKSB7XG5cdFx0a2V5LnB1YiA9IHtcblx0XHRcdHg6IGI2NFRvQm4oandrLngsIGZhbHNlKSxcblx0XHRcdHk6IGI2NFRvQm4oandrLnksIGZhbHNlKVxuXHRcdH07XG5cdH1cblxuXHRpZiAob3B0cy5wcml2YXRlIHx8ICFoYXNQdWIpIHtcblx0XHRrZXkucHJpdiA9IGI2NFRvQm4oandrLmQsIHRydWUpO1xuXHR9XG5cblx0a2V5ID0gY3VydmUua2V5UGFpcihrZXkpO1xuXG5cdHZhciBrZXlWYWxpZGF0aW9uID0ga2V5LnZhbGlkYXRlKCk7XG5cdGlmICgha2V5VmFsaWRhdGlvbi5yZXN1bHQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQga2V5IGZvciBjdXJ2ZTogXCInICsga2V5VmFsaWRhdGlvbi5yZWFzb24gKyAnXCInKTtcblx0fVxuXG5cdHZhciByZXN1bHQgPSBrZXlUb1BlbShqd2suY3J2LCBrZXksIG9wdHMpO1xuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGtleVRvUGVtKGNydiwga2V5LCBvcHRzKSB7XG5cdHZhciBjb21wYWN0ID0gZmFsc2U7XG5cdHZhciBwdWJsaWNLZXkgPSBrZXkuZ2V0UHVibGljKGNvbXBhY3QsICdoZXgnKTtcblx0cHVibGljS2V5ID0gQnVmZmVyLmZyb20ocHVibGljS2V5LCAnaGV4Jyk7XG5cdHB1YmxpY0tleSA9IHtcblx0XHR1bnVzZWQ6IDAsXG5cdFx0ZGF0YTogcHVibGljS2V5XG5cdH07XG5cblx0dmFyIHJlc3VsdDtcblx0aWYgKG9wdHMucHJpdmF0ZSkge1xuXHRcdHZhciBwcml2YXRlS2V5ID0ga2V5LmdldFByaXZhdGUoJ2hleCcpO1xuXHRcdHByaXZhdGVLZXkgPSBCdWZmZXIuZnJvbShwcml2YXRlS2V5LCAnaGV4Jyk7XG5cblx0XHRyZXN1bHQgPSBQcml2YXRlS2V5SW5mby5lbmNvZGUoe1xuXHRcdFx0dmVyc2lvbjogMCxcblx0XHRcdHByaXZhdGVLZXlBbGdvcml0aG06IGFsZ29yaXRobXNbY3J2XSxcblx0XHRcdHByaXZhdGVLZXk6IEVDUHJpdmF0ZUtleS5lbmNvZGUoe1xuXHRcdFx0XHR2ZXJzaW9uOiBlY1ByaXZrZXlWZXIxLFxuXHRcdFx0XHRwcml2YXRlS2V5OiBwcml2YXRlS2V5LFxuXHRcdFx0XHRwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzW2Nydl0sXG5cdFx0XHRcdHB1YmxpY0tleTogcHVibGljS2V5XG5cdFx0XHR9LCAnZGVyJylcblx0XHR9LCAncGVtJywge1xuXHRcdFx0bGFiZWw6ICdQUklWQVRFIEtFWSdcblx0XHR9KTtcblxuXHRcdHByaXZhdGVLZXkuZmlsbCgwKTtcblx0fSBlbHNlIHtcblx0XHRyZXN1bHQgPSBQdWJsaWNLZXlJbmZvLmVuY29kZSh7XG5cdFx0XHRhbGdvcml0aG06IGFsZ29yaXRobXNbY3J2XSxcblx0XHRcdFB1YmxpY0tleTogcHVibGljS2V5XG5cdFx0fSwgJ3BlbScsIHtcblx0XHRcdGxhYmVsOiAnUFVCTElDIEtFWSdcblx0XHR9KTtcblx0fVxuXG5cdC8vIFRoaXMgaXMgaW4gYW4gaWYgaW5jYXNlIGFzbjEuanMgYWRkcyBhIHRyYWlsaW5nIFxcblxuXHQvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuXHRpZiAoJ1xcbicgIT09IHJlc3VsdC5zbGljZSgtMSkpIHtcblx0XHRyZXN1bHQgKz0gJ1xcbic7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVjSndrVG9CdWZmZXI7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGFzbjEgPSByZXF1aXJlKCdhc24xLmpzJyk7XG5cbnZhciBiNjRUb0JuID0gcmVxdWlyZSgnLi9iNjQtdG8tYm4nKTtcblxudmFyIFB1YmxpY0tleUluZm8gPSByZXF1aXJlKCcuL2FzbjEvcHVibGljLWtleS1pbmZvJyksXG5cdFByaXZhdGVLZXlJbmZvID0gcmVxdWlyZSgnLi9hc24xL3ByaXZhdGUta2V5LWluZm8nKSxcblx0VmVyc2lvbiA9IHJlcXVpcmUoJy4vYXNuMS92ZXJzaW9uJyk7XG5cbnZhciBSU0FQcml2YXRlS2V5ID0gYXNuMS5kZWZpbmUoJ1JTQVByaXZhdGVLZXknLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5zZXEoKS5vYmooXG5cdFx0dGhpcy5rZXkoJ3ZlcnNpb24nKS51c2UoVmVyc2lvbiksXG5cdFx0dGhpcy5rZXkoJ21vZHVsdXMnKS5pbnQoKSxcblx0XHR0aGlzLmtleSgncHVibGljRXhwb25lbnQnKS5pbnQoKSxcblx0XHR0aGlzLmtleSgncHJpdmF0ZUV4cG9uZW50JykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ3ByaW1lMScpLmludCgpLFxuXHRcdHRoaXMua2V5KCdwcmltZTInKS5pbnQoKSxcblx0XHR0aGlzLmtleSgnZXhwb25lbnQxJykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ2V4cG9uZW50MicpLmludCgpLFxuXHRcdHRoaXMua2V5KCdjb2VmZmljaWVudCcpLmludCgpXG5cdCk7XG59KTtcblxudmFyIFJTQVB1YmxpY0tleSA9IGFzbjEuZGVmaW5lKCdSU0FQdWJsaWNLZXknLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5zZXEoKS5vYmooXG5cdFx0dGhpcy5rZXkoJ21vZHVsdXMnKS5pbnQoKSxcblx0XHR0aGlzLmtleSgncHVibGljRXhwb25lbnQnKS5pbnQoKVxuXHQpO1xufSk7XG5cbnZhciBhbGdvcml0aG0gPSB7XG5cdGFsZ29yaXRobTogWzEsIDIsIDg0MCwgMTEzNTQ5LCAxLCAxLCAxXSxcblx0cGFyYW1ldGVyczogWzUsIDBdXG59O1xuXG5mdW5jdGlvbiByc2FKd2tUb0J1ZmZlcihqd2ssIG9wdHMpIHtcblx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLmUpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5lXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5uKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sublwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHRpZiAob3B0cy5wcml2YXRlKSB7XG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLmQpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLmRcIiB0byBiZSBhIFN0cmluZycpO1xuXHRcdH1cblxuXHRcdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5wKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5wXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cblx0XHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2sucSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sucVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLmRwKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5kcFwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLmRxKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5kcVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLnFpKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5xaVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXHR9XG5cblx0dmFyIHBlbTtcblx0aWYgKG9wdHMucHJpdmF0ZSkge1xuXHRcdHBlbSA9IFByaXZhdGVLZXlJbmZvLmVuY29kZSh7XG5cdFx0XHR2ZXJzaW9uOiAwLFxuXHRcdFx0cHJpdmF0ZUtleUFsZ29yaXRobTogYWxnb3JpdGhtLFxuXHRcdFx0cHJpdmF0ZUtleTogUlNBUHJpdmF0ZUtleS5lbmNvZGUoe1xuXHRcdFx0XHR2ZXJzaW9uOiAwLFxuXHRcdFx0XHRtb2R1bHVzOiBiNjRUb0JuKGp3ay5uLCBmYWxzZSksXG5cdFx0XHRcdHB1YmxpY0V4cG9uZW50OiBiNjRUb0JuKGp3ay5lLCBmYWxzZSksXG5cdFx0XHRcdHByaXZhdGVFeHBvbmVudDogYjY0VG9Cbihqd2suZCwgdHJ1ZSksXG5cdFx0XHRcdHByaW1lMTogYjY0VG9Cbihqd2sucCwgdHJ1ZSksXG5cdFx0XHRcdHByaW1lMjogYjY0VG9Cbihqd2sucSwgdHJ1ZSksXG5cdFx0XHRcdGV4cG9uZW50MTogYjY0VG9Cbihqd2suZHAsIHRydWUpLFxuXHRcdFx0XHRleHBvbmVudDI6IGI2NFRvQm4oandrLmRxLCB0cnVlKSxcblx0XHRcdFx0Y29lZmZpY2llbnQ6IGI2NFRvQm4oandrLnFpLCB0cnVlKVxuXHRcdFx0fSwgJ2RlcicpXG5cdFx0fSwgJ3BlbScsIHtcblx0XHRcdGxhYmVsOiAnUFJJVkFURSBLRVknXG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0cGVtID0gUHVibGljS2V5SW5mby5lbmNvZGUoe1xuXHRcdFx0YWxnb3JpdGhtOiBhbGdvcml0aG0sXG5cdFx0XHRQdWJsaWNLZXk6IHtcblx0XHRcdFx0dW51c2VkOiAwLFxuXHRcdFx0XHRkYXRhOiBSU0FQdWJsaWNLZXkuZW5jb2RlKHtcblx0XHRcdFx0XHRtb2R1bHVzOiBiNjRUb0JuKGp3ay5uLCBmYWxzZSksXG5cdFx0XHRcdFx0cHVibGljRXhwb25lbnQ6IGI2NFRvQm4oandrLmUsIGZhbHNlKVxuXHRcdFx0XHR9LCAnZGVyJylcblx0XHRcdH1cblx0XHR9LCAncGVtJywge1xuXHRcdFx0bGFiZWw6ICdQVUJMSUMgS0VZJ1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gVGhpcyBpcyBpbiBhbiBpZiBpbmNhc2UgYXNuMS5qcyBhZGRzIGEgdHJhaWxpbmcgXFxuXG5cdC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlXG5cdGlmICgnXFxuJyAhPT0gcGVtLnNsaWNlKC0xKSkge1xuXHRcdHBlbSArPSAnXFxuJztcblx0fVxuXG5cdHJldHVybiBwZW07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcnNhSndrVG9CdWZmZXI7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGVjID0gcmVxdWlyZSgnLi9lYycpLFxuXHRyc2EgPSByZXF1aXJlKCcuL3JzYScpO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3trdHk6J0VDJywgY3J2OnN0cmluZywgZDpzdHJpbmcsIHg/OnN0cmluZywgeT86c3RyaW5nfSB8IHtrdHk6J0VDJywgY3J2OnN0cmluZywgeDpzdHJpbmcsIHk6c3RyaW5nfSB8IHtrdHk6J1JTQScsIGU6c3RyaW5nLCBuOnN0cmluZywgZD86c3RyaW5nLCBwPzpzdHJpbmcsIHE/OnN0cmluZywgZHA/OnN0cmluZywgZHE/OnN0cmluZywgcWk/OnN0cmluZ319IGp3a1xuICogQHBhcmFtIHt7cHJpdmF0ZTpib29sZWFufT19IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGp3a1RvQnVmZmVyKGp3aywgb3B0cykge1xuXHRpZiAoJ29iamVjdCcgIT09IHR5cGVvZiBqd2sgfHwgbnVsbCA9PT0gandrKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2tcIiB0byBiZSBhbiBPYmplY3QnKTtcblx0fVxuXG5cdHZhciBrdHkgPSBqd2sua3R5O1xuXHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBrdHkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5rdHlcIiB0byBiZSBhIFN0cmluZycpO1xuXHR9XG5cblx0b3B0cyA9IG9wdHMgfHwge307XG5cdG9wdHMucHJpdmF0ZSA9IG9wdHMucHJpdmF0ZSA9PT0gdHJ1ZTtcblxuXHRzd2l0Y2ggKGt0eSkge1xuXHRcdGNhc2UgJ0VDJzoge1xuXHRcdFx0cmV0dXJuIGVjKGp3aywgb3B0cyk7XG5cdFx0fVxuXHRcdGNhc2UgJ1JTQSc6IHtcblx0XHRcdHJldHVybiByc2EoandrLCBvcHRzKTtcblx0XHR9XG5cdFx0ZGVmYXVsdDoge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBrZXkgdHlwZSBcIicgKyBrdHkgKyAnXCInKTtcblx0XHR9XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBqd2tUb0J1ZmZlcjtcbiIsCiAgICAiXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29va2llcyhoZWFkZXJzOiBIZWFkZXJzKSB7XG4gIGlmICghaGVhZGVycykgcmV0dXJuIHt9O1xuICBjb25zdCBjb29raWVIZWFkZXIgPSBoZWFkZXJzLmdldChcIkNvb2tpZVwiKTtcbiAgY29uc3QgY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGlmIChjb29raWVIZWFkZXIgPT09IG51bGwpIHJldHVybiB7fTtcblxuICBmb3IgKGNvbnN0IGt2IG9mIGNvb2tpZUhlYWRlci5zcGxpdChcIjtcIikpIHtcbiAgICBjb25zdCBbY29va2llS2V5LCAuLi5jb29raWVWYWxdID0ga3Yuc3BsaXQoXCI9XCIpO1xuICAgIGNvbnN0IGtleSA9IGNvb2tpZUtleS50cmltKCk7XG4gICAgY29va2llc1trZXldID0gY29va2llVmFsLmpvaW4oXCI9XCIpO1xuICB9XG5cbiAgcmV0dXJuIGNvb2tpZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb29raWUocmVzcG9uc2U6IFJlc3BvbnNlLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgbWF4QWdlPzogbnVtYmVyKSB7XG4gIHJlc3BvbnNlLmhlYWRlcnMuYXBwZW5kKCdTZXQtQ29va2llJywgYCR7a2V5fT0ke3ZhbHVlfSR7bWF4QWdlID8gJzsgUGF0aD0vOyBNYXgtQWdlPScgKyBtYXhBZ2UgOiAnJ31gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUNvb2tpZShyZXNwb25zZTogUmVzcG9uc2UsIGtleTogc3RyaW5nKSB7XG4gIHJlc3BvbnNlLmhlYWRlcnMuYXBwZW5kKCdTZXQtQ29va2llJywgYCR7a2V5fT1cIlwiOyBQYXRoPS87IE1heC1BZ2U9LTE7YCk7XG59IiwKICAgICIvLyNyZWdpb24gc3JjL2VzaS9vcHRpb25zLnRzXG5jb25zdCBDTElFTlRfSUQgPSBwcm9jZXNzLmVudi5FVkVfQ0xJRU5UX0lEIHx8IFwiXCI7XG5jb25zdCBDTElFTlRfU0VDUkVUID0gcHJvY2Vzcy5lbnYuRVZFX0NMSUVOVF9TRUNSRVQgfHwgXCJcIjtcbmNvbnN0IENBTExCQUNLX1VSTCA9IHByb2Nlc3MuZW52LkVWRV9DQUxMQkFDS19VUkwgfHwgXCJcIjtcbmNvbnN0IFVTRVJfQUdFTlQgPSBwcm9jZXNzLmVudi5FU0lfVVNFUl9BR0VOVCB8fCBcIlwiO1xuY29uc3Qgb3B0aW9ucyA9IHtcblx0Y2xpZW50X2lkOiBDTElFTlRfSUQsXG5cdGNsaWVudF9zZWNyZXQ6IENMSUVOVF9TRUNSRVQsXG5cdGNhbGxiYWNrX3VybDogQ0FMTEJBQ0tfVVJMLFxuXHR1c2VyX2FnZW50OiBVU0VSX0FHRU5UXG59O1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IG9wdGlvbnMgfTsiLAogICAgIi8vI3JlZ2lvbiByb2xsZG93bjpydW50aW1lXG52YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZXhwb3J0ID0gKHRhcmdldCwgYWxsKSA9PiB7XG5cdGZvciAodmFyIG5hbWUgaW4gYWxsKSBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7XG5cdFx0Z2V0OiBhbGxbbmFtZV0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcbn07XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgX19leHBvcnQgfTsiLAogICAgImV4cG9ydCBjbGFzcyBJbnZhbGlkVG9rZW5FcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbkludmFsaWRUb2tlbkVycm9yLnByb3RvdHlwZS5uYW1lID0gXCJJbnZhbGlkVG9rZW5FcnJvclwiO1xuZnVuY3Rpb24gYjY0RGVjb2RlVW5pY29kZShzdHIpIHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGF0b2Ioc3RyKS5yZXBsYWNlKC8oLikvZywgKG0sIHApID0+IHtcbiAgICAgICAgbGV0IGNvZGUgPSBwLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGlmIChjb2RlLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIGNvZGUgPSBcIjBcIiArIGNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiJVwiICsgY29kZTtcbiAgICB9KSk7XG59XG5mdW5jdGlvbiBiYXNlNjRVcmxEZWNvZGUoc3RyKSB7XG4gICAgbGV0IG91dHB1dCA9IHN0ci5yZXBsYWNlKC8tL2csIFwiK1wiKS5yZXBsYWNlKC9fL2csIFwiL1wiKTtcbiAgICBzd2l0Y2ggKG91dHB1dC5sZW5ndGggJSA0KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBvdXRwdXQgKz0gXCI9PVwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIG91dHB1dCArPSBcIj1cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmFzZTY0IHN0cmluZyBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgbGVuZ3RoXCIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYjY0RGVjb2RlVW5pY29kZShvdXRwdXQpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBhdG9iKG91dHB1dCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGp3dERlY29kZSh0b2tlbiwgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgdG9rZW4gIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbkVycm9yKFwiSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IG11c3QgYmUgYSBzdHJpbmdcIik7XG4gICAgfVxuICAgIG9wdGlvbnMgfHwgKG9wdGlvbnMgPSB7fSk7XG4gICAgY29uc3QgcG9zID0gb3B0aW9ucy5oZWFkZXIgPT09IHRydWUgPyAwIDogMTtcbiAgICBjb25zdCBwYXJ0ID0gdG9rZW4uc3BsaXQoXCIuXCIpW3Bvc107XG4gICAgaWYgKHR5cGVvZiBwYXJ0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FcnJvcihgSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IG1pc3NpbmcgcGFydCAjJHtwb3MgKyAxfWApO1xuICAgIH1cbiAgICBsZXQgZGVjb2RlZDtcbiAgICB0cnkge1xuICAgICAgICBkZWNvZGVkID0gYmFzZTY0VXJsRGVjb2RlKHBhcnQpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBpbnZhbGlkIGJhc2U2NCBmb3IgcGFydCAjJHtwb3MgKyAxfSAoJHtlLm1lc3NhZ2V9KWApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVkKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbkVycm9yKGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogaW52YWxpZCBqc29uIGZvciBwYXJ0ICMke3BvcyArIDF9ICgke2UubWVzc2FnZX0pYCk7XG4gICAgfVxufVxuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTMyVXBwZXJDYXNlKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2UzMl9pbnRlcm5hbChieXRlcywgYmFzZTMyVXBwZXJDYXNlQWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5JbmNsdWRlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlMzJVcHBlckNhc2VOb1BhZGRpbmcoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTMyX2ludGVybmFsKGJ5dGVzLCBiYXNlMzJVcHBlckNhc2VBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLk5vbmUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMkxvd2VyQ2FzZShieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJfaW50ZXJuYWwoYnl0ZXMsIGJhc2UzMkxvd2VyQ2FzZUFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTMyTG93ZXJDYXNlTm9QYWRkaW5nKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2UzMl9pbnRlcm5hbChieXRlcywgYmFzZTMyTG93ZXJDYXNlQWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5Ob25lKTtcbn1cbi8qKiBSZXBsYWNlZDogVXNlIGVuY29kZUJhc2UzMlVwcGVyQ2FzZSgpIGluc3RlYWQuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTMyKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2UzMlVwcGVyQ2FzZShieXRlcyk7XG59XG4vKiogUmVwbGFjZWQ6IFVzZSBlbmNvZGVCYXNlMzJVcHBlckNhc2VOb1BhZGRpbmcoKSBpbnN0ZWFkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMk5vUGFkZGluZyhieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJVcHBlckNhc2VOb1BhZGRpbmcoYnl0ZXMpO1xufVxuZnVuY3Rpb24gZW5jb2RlQmFzZTMyX2ludGVybmFsKGJ5dGVzLCBhbHBoYWJldCwgcGFkZGluZykge1xuICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMuYnl0ZUxlbmd0aDsgaSArPSA1KSB7XG4gICAgICAgIGxldCBidWZmZXIgPSAwbjtcbiAgICAgICAgbGV0IGJ1ZmZlckJpdFNpemUgPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDUgJiYgaSArIGogPCBieXRlcy5ieXRlTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IChidWZmZXIgPDwgOG4pIHwgQmlnSW50KGJ5dGVzW2kgKyBqXSk7XG4gICAgICAgICAgICBidWZmZXJCaXRTaXplICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1ZmZlckJpdFNpemUgJSA1ICE9PSAwKSB7XG4gICAgICAgICAgICBidWZmZXIgPSBidWZmZXIgPDwgQmlnSW50KDUgLSAoYnVmZmVyQml0U2l6ZSAlIDUpKTtcbiAgICAgICAgICAgIGJ1ZmZlckJpdFNpemUgKz0gNSAtIChidWZmZXJCaXRTaXplICUgNSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA4OyBqKyspIHtcbiAgICAgICAgICAgIGlmIChidWZmZXJCaXRTaXplID49IDUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gYWxwaGFiZXRbTnVtYmVyKChidWZmZXIgPj4gQmlnSW50KGJ1ZmZlckJpdFNpemUgLSA1KSkgJiAweDFmbildO1xuICAgICAgICAgICAgICAgIGJ1ZmZlckJpdFNpemUgLT0gNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJ1ZmZlckJpdFNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFscGhhYmV0W051bWJlcigoYnVmZmVyIDw8IEJpZ0ludCg2IC0gYnVmZmVyQml0U2l6ZSkpICYgMHgzZm4pXTtcbiAgICAgICAgICAgICAgICBidWZmZXJCaXRTaXplID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhZGRpbmcgPT09IEVuY29kaW5nUGFkZGluZy5JbmNsdWRlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IFwiPVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTMyKGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTMyX2ludGVybmFsKGVuY29kZWQsIGJhc2UzMkRlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLlJlcXVpcmVkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlMzJJZ25vcmVQYWRkaW5nKGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTMyX2ludGVybmFsKGVuY29kZWQsIGJhc2UzMkRlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLklnbm9yZSk7XG59XG5mdW5jdGlvbiBkZWNvZGVCYXNlMzJfaW50ZXJuYWwoZW5jb2RlZCwgZGVjb2RlTWFwLCBwYWRkaW5nKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKGVuY29kZWQubGVuZ3RoIC8gOCkgKiA1KTtcbiAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbmNvZGVkLmxlbmd0aDsgaSArPSA4KSB7XG4gICAgICAgIGxldCBjaHVuayA9IDBuO1xuICAgICAgICBsZXQgYml0c1JlYWQgPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDg7IGorKykge1xuICAgICAgICAgICAgaWYgKHBhZGRpbmcgPT09IERlY29kaW5nUGFkZGluZy5SZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgIGlmIChlbmNvZGVkW2kgKyBqXSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpICsgaiA+PSBlbmNvZGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhZGRpbmcgPT09IERlY29kaW5nUGFkZGluZy5JZ25vcmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSArIGogPj0gZW5jb2RlZC5sZW5ndGggfHwgZW5jb2RlZFtpICsgal0gPT09IFwiPVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqID4gMCAmJiBlbmNvZGVkW2kgKyBqIC0gMV0gPT09IFwiPVwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoZW5jb2RlZFtpICsgal0gaW4gZGVjb2RlTWFwKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2hhcmFjdGVyXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2h1bmsgfD0gQmlnSW50KGRlY29kZU1hcFtlbmNvZGVkW2kgKyBqXV0pIDw8IEJpZ0ludCgoNyAtIGopICogNSk7XG4gICAgICAgICAgICBiaXRzUmVhZCArPSA1O1xuICAgICAgICB9XG4gICAgICAgIGlmIChiaXRzUmVhZCA8IDQwKSB7XG4gICAgICAgICAgICBsZXQgdW51c2VkO1xuICAgICAgICAgICAgaWYgKGJpdHNSZWFkID09PSAxMCkge1xuICAgICAgICAgICAgICAgIHVudXNlZCA9IGNodW5rICYgMHhmZmZmZmZmZm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaXRzUmVhZCA9PT0gMjApIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmZmZmZmbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJpdHNSZWFkID09PSAyNSkge1xuICAgICAgICAgICAgICAgIHVudXNlZCA9IGNodW5rICYgMHhmZmZmbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJpdHNSZWFkID09PSAzNSkge1xuICAgICAgICAgICAgICAgIHVudXNlZCA9IGNodW5rICYgMHhmZm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodW51c2VkICE9PSAwbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBieXRlTGVuZ3RoID0gTWF0aC5mbG9vcihiaXRzUmVhZCAvIDgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0W3RvdGFsQnl0ZXNdID0gTnVtYmVyKChjaHVuayA+PiBCaWdJbnQoMzIgLSBpICogOCkpICYgMHhmZm4pO1xuICAgICAgICAgICAgdG90YWxCeXRlcysrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuc2xpY2UoMCwgdG90YWxCeXRlcyk7XG59XG5jb25zdCBiYXNlMzJVcHBlckNhc2VBbHBoYWJldCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoyMzQ1NjdcIjtcbmNvbnN0IGJhc2UzMkxvd2VyQ2FzZUFscGhhYmV0ID0gXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejIzNDU2N1wiO1xuY29uc3QgYmFzZTMyRGVjb2RlTWFwID0ge1xuICAgIEE6IDAsXG4gICAgQjogMSxcbiAgICBDOiAyLFxuICAgIEQ6IDMsXG4gICAgRTogNCxcbiAgICBGOiA1LFxuICAgIEc6IDYsXG4gICAgSDogNyxcbiAgICBJOiA4LFxuICAgIEo6IDksXG4gICAgSzogMTAsXG4gICAgTDogMTEsXG4gICAgTTogMTIsXG4gICAgTjogMTMsXG4gICAgTzogMTQsXG4gICAgUDogMTUsXG4gICAgUTogMTYsXG4gICAgUjogMTcsXG4gICAgUzogMTgsXG4gICAgVDogMTksXG4gICAgVTogMjAsXG4gICAgVjogMjEsXG4gICAgVzogMjIsXG4gICAgWDogMjMsXG4gICAgWTogMjQsXG4gICAgWjogMjUsXG4gICAgYTogMCxcbiAgICBiOiAxLFxuICAgIGM6IDIsXG4gICAgZDogMyxcbiAgICBlOiA0LFxuICAgIGY6IDUsXG4gICAgZzogNixcbiAgICBoOiA3LFxuICAgIGk6IDgsXG4gICAgajogOSxcbiAgICBrOiAxMCxcbiAgICBsOiAxMSxcbiAgICBtOiAxMixcbiAgICBuOiAxMyxcbiAgICBvOiAxNCxcbiAgICBwOiAxNSxcbiAgICBxOiAxNixcbiAgICByOiAxNyxcbiAgICBzOiAxOCxcbiAgICB0OiAxOSxcbiAgICB1OiAyMCxcbiAgICB2OiAyMSxcbiAgICB3OiAyMixcbiAgICB4OiAyMyxcbiAgICB5OiAyNCxcbiAgICB6OiAyNSxcbiAgICBcIjJcIjogMjYsXG4gICAgXCIzXCI6IDI3LFxuICAgIFwiNFwiOiAyOCxcbiAgICBcIjVcIjogMjksXG4gICAgXCI2XCI6IDMwLFxuICAgIFwiN1wiOiAzMVxufTtcbnZhciBFbmNvZGluZ1BhZGRpbmc7XG4oZnVuY3Rpb24gKEVuY29kaW5nUGFkZGluZykge1xuICAgIEVuY29kaW5nUGFkZGluZ1tFbmNvZGluZ1BhZGRpbmdbXCJJbmNsdWRlXCJdID0gMF0gPSBcIkluY2x1ZGVcIjtcbiAgICBFbmNvZGluZ1BhZGRpbmdbRW5jb2RpbmdQYWRkaW5nW1wiTm9uZVwiXSA9IDFdID0gXCJOb25lXCI7XG59KShFbmNvZGluZ1BhZGRpbmcgfHwgKEVuY29kaW5nUGFkZGluZyA9IHt9KSk7XG52YXIgRGVjb2RpbmdQYWRkaW5nO1xuKGZ1bmN0aW9uIChEZWNvZGluZ1BhZGRpbmcpIHtcbiAgICBEZWNvZGluZ1BhZGRpbmdbRGVjb2RpbmdQYWRkaW5nW1wiUmVxdWlyZWRcIl0gPSAwXSA9IFwiUmVxdWlyZWRcIjtcbiAgICBEZWNvZGluZ1BhZGRpbmdbRGVjb2RpbmdQYWRkaW5nW1wiSWdub3JlXCJdID0gMV0gPSBcIklnbm9yZVwiO1xufSkoRGVjb2RpbmdQYWRkaW5nIHx8IChEZWNvZGluZ1BhZGRpbmcgPSB7fSkpO1xuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTY0KGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2U2NF9pbnRlcm5hbChieXRlcywgYmFzZTY0QWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5JbmNsdWRlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlNjROb1BhZGRpbmcoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTY0X2ludGVybmFsKGJ5dGVzLCBiYXNlNjRBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLk5vbmUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2U2NHVybChieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlNjRfaW50ZXJuYWwoYnl0ZXMsIGJhc2U2NHVybEFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTY0dXJsTm9QYWRkaW5nKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2U2NF9pbnRlcm5hbChieXRlcywgYmFzZTY0dXJsQWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5Ob25lKTtcbn1cbmZ1bmN0aW9uIGVuY29kZUJhc2U2NF9pbnRlcm5hbChieXRlcywgYWxwaGFiZXQsIHBhZGRpbmcpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmJ5dGVMZW5ndGg7IGkgKz0gMykge1xuICAgICAgICBsZXQgYnVmZmVyID0gMDtcbiAgICAgICAgbGV0IGJ1ZmZlckJpdFNpemUgPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDMgJiYgaSArIGogPCBieXRlcy5ieXRlTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IChidWZmZXIgPDwgOCkgfCBieXRlc1tpICsgal07XG4gICAgICAgICAgICBidWZmZXJCaXRTaXplICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA0OyBqKyspIHtcbiAgICAgICAgICAgIGlmIChidWZmZXJCaXRTaXplID49IDYpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gYWxwaGFiZXRbKGJ1ZmZlciA+PiAoYnVmZmVyQml0U2l6ZSAtIDYpKSAmIDB4M2ZdO1xuICAgICAgICAgICAgICAgIGJ1ZmZlckJpdFNpemUgLT0gNjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJ1ZmZlckJpdFNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFscGhhYmV0WyhidWZmZXIgPDwgKDYgLSBidWZmZXJCaXRTaXplKSkgJiAweDNmXTtcbiAgICAgICAgICAgICAgICBidWZmZXJCaXRTaXplID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhZGRpbmcgPT09IEVuY29kaW5nUGFkZGluZy5JbmNsdWRlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IFwiPVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBiYXNlNjRBbHBoYWJldCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiO1xuY29uc3QgYmFzZTY0dXJsQWxwaGFiZXQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV9cIjtcbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlNjQoZW5jb2RlZCkge1xuICAgIHJldHVybiBkZWNvZGVCYXNlNjRfaW50ZXJuYWwoZW5jb2RlZCwgYmFzZTY0RGVjb2RlTWFwLCBEZWNvZGluZ1BhZGRpbmcuUmVxdWlyZWQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2U2NElnbm9yZVBhZGRpbmcoZW5jb2RlZCkge1xuICAgIHJldHVybiBkZWNvZGVCYXNlNjRfaW50ZXJuYWwoZW5jb2RlZCwgYmFzZTY0RGVjb2RlTWFwLCBEZWNvZGluZ1BhZGRpbmcuSWdub3JlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlNjR1cmwoZW5jb2RlZCkge1xuICAgIHJldHVybiBkZWNvZGVCYXNlNjRfaW50ZXJuYWwoZW5jb2RlZCwgYmFzZTY0dXJsRGVjb2RlTWFwLCBEZWNvZGluZ1BhZGRpbmcuUmVxdWlyZWQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2U2NHVybElnbm9yZVBhZGRpbmcoZW5jb2RlZCkge1xuICAgIHJldHVybiBkZWNvZGVCYXNlNjRfaW50ZXJuYWwoZW5jb2RlZCwgYmFzZTY0dXJsRGVjb2RlTWFwLCBEZWNvZGluZ1BhZGRpbmcuSWdub3JlKTtcbn1cbmZ1bmN0aW9uIGRlY29kZUJhc2U2NF9pbnRlcm5hbChlbmNvZGVkLCBkZWNvZGVNYXAsIHBhZGRpbmcpIHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShNYXRoLmNlaWwoZW5jb2RlZC5sZW5ndGggLyA0KSAqIDMpO1xuICAgIGxldCB0b3RhbEJ5dGVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kZWQubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgbGV0IGNodW5rID0gMDtcbiAgICAgICAgbGV0IGJpdHNSZWFkID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA0OyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYWRkaW5nID09PSBEZWNvZGluZ1BhZGRpbmcuUmVxdWlyZWQgJiYgZW5jb2RlZFtpICsgal0gPT09IFwiPVwiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFkZGluZyA9PT0gRGVjb2RpbmdQYWRkaW5nLklnbm9yZSAmJlxuICAgICAgICAgICAgICAgIChpICsgaiA+PSBlbmNvZGVkLmxlbmd0aCB8fCBlbmNvZGVkW2kgKyBqXSA9PT0gXCI9XCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaiA+IDAgJiYgZW5jb2RlZFtpICsgaiAtIDFdID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKGVuY29kZWRbaSArIGpdIGluIGRlY29kZU1hcCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNoYXJhY3RlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNodW5rIHw9IGRlY29kZU1hcFtlbmNvZGVkW2kgKyBqXV0gPDwgKCgzIC0gaikgKiA2KTtcbiAgICAgICAgICAgIGJpdHNSZWFkICs9IDY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJpdHNSZWFkIDwgMjQpIHtcbiAgICAgICAgICAgIGxldCB1bnVzZWQ7XG4gICAgICAgICAgICBpZiAoYml0c1JlYWQgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgdW51c2VkID0gY2h1bmsgJiAweGZmZmY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaXRzUmVhZCA9PT0gMTgpIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodW51c2VkICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ5dGVMZW5ndGggPSBNYXRoLmZsb29yKGJpdHNSZWFkIC8gOCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHRbdG90YWxCeXRlc10gPSAoY2h1bmsgPj4gKDE2IC0gaSAqIDgpKSAmIDB4ZmY7XG4gICAgICAgICAgICB0b3RhbEJ5dGVzKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zbGljZSgwLCB0b3RhbEJ5dGVzKTtcbn1cbnZhciBFbmNvZGluZ1BhZGRpbmc7XG4oZnVuY3Rpb24gKEVuY29kaW5nUGFkZGluZykge1xuICAgIEVuY29kaW5nUGFkZGluZ1tFbmNvZGluZ1BhZGRpbmdbXCJJbmNsdWRlXCJdID0gMF0gPSBcIkluY2x1ZGVcIjtcbiAgICBFbmNvZGluZ1BhZGRpbmdbRW5jb2RpbmdQYWRkaW5nW1wiTm9uZVwiXSA9IDFdID0gXCJOb25lXCI7XG59KShFbmNvZGluZ1BhZGRpbmcgfHwgKEVuY29kaW5nUGFkZGluZyA9IHt9KSk7XG52YXIgRGVjb2RpbmdQYWRkaW5nO1xuKGZ1bmN0aW9uIChEZWNvZGluZ1BhZGRpbmcpIHtcbiAgICBEZWNvZGluZ1BhZGRpbmdbRGVjb2RpbmdQYWRkaW5nW1wiUmVxdWlyZWRcIl0gPSAwXSA9IFwiUmVxdWlyZWRcIjtcbiAgICBEZWNvZGluZ1BhZGRpbmdbRGVjb2RpbmdQYWRkaW5nW1wiSWdub3JlXCJdID0gMV0gPSBcIklnbm9yZVwiO1xufSkoRGVjb2RpbmdQYWRkaW5nIHx8IChEZWNvZGluZ1BhZGRpbmcgPSB7fSkpO1xuY29uc3QgYmFzZTY0RGVjb2RlTWFwID0ge1xuICAgIFwiMFwiOiA1MixcbiAgICBcIjFcIjogNTMsXG4gICAgXCIyXCI6IDU0LFxuICAgIFwiM1wiOiA1NSxcbiAgICBcIjRcIjogNTYsXG4gICAgXCI1XCI6IDU3LFxuICAgIFwiNlwiOiA1OCxcbiAgICBcIjdcIjogNTksXG4gICAgXCI4XCI6IDYwLFxuICAgIFwiOVwiOiA2MSxcbiAgICBBOiAwLFxuICAgIEI6IDEsXG4gICAgQzogMixcbiAgICBEOiAzLFxuICAgIEU6IDQsXG4gICAgRjogNSxcbiAgICBHOiA2LFxuICAgIEg6IDcsXG4gICAgSTogOCxcbiAgICBKOiA5LFxuICAgIEs6IDEwLFxuICAgIEw6IDExLFxuICAgIE06IDEyLFxuICAgIE46IDEzLFxuICAgIE86IDE0LFxuICAgIFA6IDE1LFxuICAgIFE6IDE2LFxuICAgIFI6IDE3LFxuICAgIFM6IDE4LFxuICAgIFQ6IDE5LFxuICAgIFU6IDIwLFxuICAgIFY6IDIxLFxuICAgIFc6IDIyLFxuICAgIFg6IDIzLFxuICAgIFk6IDI0LFxuICAgIFo6IDI1LFxuICAgIGE6IDI2LFxuICAgIGI6IDI3LFxuICAgIGM6IDI4LFxuICAgIGQ6IDI5LFxuICAgIGU6IDMwLFxuICAgIGY6IDMxLFxuICAgIGc6IDMyLFxuICAgIGg6IDMzLFxuICAgIGk6IDM0LFxuICAgIGo6IDM1LFxuICAgIGs6IDM2LFxuICAgIGw6IDM3LFxuICAgIG06IDM4LFxuICAgIG46IDM5LFxuICAgIG86IDQwLFxuICAgIHA6IDQxLFxuICAgIHE6IDQyLFxuICAgIHI6IDQzLFxuICAgIHM6IDQ0LFxuICAgIHQ6IDQ1LFxuICAgIHU6IDQ2LFxuICAgIHY6IDQ3LFxuICAgIHc6IDQ4LFxuICAgIHg6IDQ5LFxuICAgIHk6IDUwLFxuICAgIHo6IDUxLFxuICAgIFwiK1wiOiA2MixcbiAgICBcIi9cIjogNjNcbn07XG5jb25zdCBiYXNlNjR1cmxEZWNvZGVNYXAgPSB7XG4gICAgXCIwXCI6IDUyLFxuICAgIFwiMVwiOiA1MyxcbiAgICBcIjJcIjogNTQsXG4gICAgXCIzXCI6IDU1LFxuICAgIFwiNFwiOiA1NixcbiAgICBcIjVcIjogNTcsXG4gICAgXCI2XCI6IDU4LFxuICAgIFwiN1wiOiA1OSxcbiAgICBcIjhcIjogNjAsXG4gICAgXCI5XCI6IDYxLFxuICAgIEE6IDAsXG4gICAgQjogMSxcbiAgICBDOiAyLFxuICAgIEQ6IDMsXG4gICAgRTogNCxcbiAgICBGOiA1LFxuICAgIEc6IDYsXG4gICAgSDogNyxcbiAgICBJOiA4LFxuICAgIEo6IDksXG4gICAgSzogMTAsXG4gICAgTDogMTEsXG4gICAgTTogMTIsXG4gICAgTjogMTMsXG4gICAgTzogMTQsXG4gICAgUDogMTUsXG4gICAgUTogMTYsXG4gICAgUjogMTcsXG4gICAgUzogMTgsXG4gICAgVDogMTksXG4gICAgVTogMjAsXG4gICAgVjogMjEsXG4gICAgVzogMjIsXG4gICAgWDogMjMsXG4gICAgWTogMjQsXG4gICAgWjogMjUsXG4gICAgYTogMjYsXG4gICAgYjogMjcsXG4gICAgYzogMjgsXG4gICAgZDogMjksXG4gICAgZTogMzAsXG4gICAgZjogMzEsXG4gICAgZzogMzIsXG4gICAgaDogMzMsXG4gICAgaTogMzQsXG4gICAgajogMzUsXG4gICAgazogMzYsXG4gICAgbDogMzcsXG4gICAgbTogMzgsXG4gICAgbjogMzksXG4gICAgbzogNDAsXG4gICAgcDogNDEsXG4gICAgcTogNDIsXG4gICAgcjogNDMsXG4gICAgczogNDQsXG4gICAgdDogNDUsXG4gICAgdTogNDYsXG4gICAgdjogNDcsXG4gICAgdzogNDgsXG4gICAgeDogNDksXG4gICAgeTogNTAsXG4gICAgejogNTEsXG4gICAgXCItXCI6IDYyLFxuICAgIF86IDYzXG59O1xuIiwKICAgICJpbXBvcnQgeyBfX2V4cG9ydCB9IGZyb20gXCIuLi9fdmlydHVhbC9yb2xsZG93bl9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSBcIi4vb3B0aW9ucy5qc1wiO1xuaW1wb3J0IHsgand0RGVjb2RlIH0gZnJvbSBcImp3dC1kZWNvZGVcIjtcbmltcG9ydCB7IGVuY29kZUJhc2U2NHVybE5vUGFkZGluZyB9IGZyb20gXCJAb3Nsb2pzL2VuY29kaW5nXCI7XG5pbXBvcnQgand0IGZyb20gXCJqc29ud2VidG9rZW5cIjtcbmltcG9ydCBqd2tUb1BlbSBmcm9tIFwiandrLXRvLXBlbVwiO1xuXG4vLyNyZWdpb24gc3JjL2VzaS9hdXRoLnRzXG52YXIgYXV0aF9leHBvcnRzID0ge307XG5fX2V4cG9ydChhdXRoX2V4cG9ydHMsIHtcblx0Y2hhcmFjdGVySWRGcm9tVG9rZW46ICgpID0+IGNoYXJhY3RlcklkRnJvbVRva2VuLFxuXHRjcmVhdGVBdXRob3JpemF0aW9uVVJMOiAoKSA9PiBjcmVhdGVBdXRob3JpemF0aW9uVVJMLFxuXHRyZWZyZXNoOiAoKSA9PiByZWZyZXNoLFxuXHR2YWxpZGF0ZUF1dGhvcml6YXRpb25Db2RlOiAoKSA9PiB2YWxpZGF0ZUF1dGhvcml6YXRpb25Db2RlLFxuXHR2YWxpZGF0ZVRva2VuOiAoKSA9PiB2YWxpZGF0ZVRva2VuXG59KTtcbmZ1bmN0aW9uIGdlbmVyYXRlU3RhdGUoKSB7XG5cdGNvbnN0IHJhbmRvbVZhbHVlcyA9IG5ldyBVaW50OEFycmF5KDMyKTtcblx0Y3J5cHRvLmdldFJhbmRvbVZhbHVlcyhyYW5kb21WYWx1ZXMpO1xuXHRyZXR1cm4gZW5jb2RlQmFzZTY0dXJsTm9QYWRkaW5nKHJhbmRvbVZhbHVlcyk7XG59XG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBdXRob3JpemF0aW9uVVJMKHNjb3BlcyA9IFwicHVibGljRGF0YVwiKSB7XG5cdGNvbnN0IHN0YXRlID0gZ2VuZXJhdGVTdGF0ZSgpO1xuXHRjb25zdCB1cmwgPSBuZXcgVVJMKFwiaHR0cHM6Ly9sb2dpbi5ldmVvbmxpbmUuY29tL3YyL29hdXRoL2F1dGhvcml6ZS9cIik7XG5cdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwicmVzcG9uc2VfdHlwZVwiLCBcImNvZGVcIik7XG5cdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwicmVkaXJlY3RfdXJpXCIsIG9wdGlvbnMuY2FsbGJhY2tfdXJsKTtcblx0dXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJjbGllbnRfaWRcIiwgb3B0aW9ucy5jbGllbnRfaWQpO1xuXHR1cmwuc2VhcmNoUGFyYW1zLnNldChcInN0YXRlXCIsIHN0YXRlKTtcblx0dXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJzY29wZVwiLCBBcnJheS5pc0FycmF5KHNjb3BlcykgPyBzY29wZXMuam9pbihcIiBcIikgOiBzY29wZXMpO1xuXHRyZXR1cm4ge1xuXHRcdHVybCxcblx0XHRzdGF0ZVxuXHR9O1xufVxuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVBdXRob3JpemF0aW9uQ29kZShjb2RlKSB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vbG9naW4uZXZlb25saW5lLmNvbS92Mi9vYXV0aC90b2tlblwiLCB7XG5cdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiLFxuXHRcdFx0XHRBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtvcHRpb25zLmNsaWVudF9pZH06JHtvcHRpb25zLmNsaWVudF9zZWNyZXR9YCkudG9TdHJpbmcoXCJiYXNlNjRcIil9YFxuXHRcdFx0fSxcblx0XHRcdGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuXHRcdFx0XHRncmFudF90eXBlOiBcImF1dGhvcml6YXRpb25fY29kZVwiLFxuXHRcdFx0XHRjb2RlXG5cdFx0XHR9KVxuXHRcdH0pO1xuXHRcdHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Y29uc29sZS5lcnJvcihgZmFpbGVkIHRvIHZhbGlkYXRlIEVWRSBhdXRob3JpemF0aW9uIGNvZGVgLCBlcnJvcik7XG5cdFx0dGhyb3cgYCR7ZXJyb3J9YDtcblx0fVxufVxubGV0IGV2ZUF1dGhQdWJsaWNLZXk7XG5hc3luYyBmdW5jdGlvbiB2YWxpZGF0ZVRva2VuKHRva2VuKSB7XG5cdGlmICghZXZlQXV0aFB1YmxpY0tleSkgdHJ5IHtcblx0XHRjb25zdCBldmVKV0tTID0gYXdhaXQgKGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9sb2dpbi5ldmVvbmxpbmUuY29tL29hdXRoL2p3a3NcIikpLmpzb24oKTtcblx0XHRldmVBdXRoUHVibGljS2V5ID0gandrVG9QZW0oZXZlSldLUy5rZXlzWzBdKTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Y29uc29sZS5lcnJvcihgZmFpbGVkIHRvIGdldCBFVkUgQXV0aCBwdWJsaWMga2V5c2AsIGVycik7XG5cdH1cblx0dHJ5IHtcblx0XHRjb25zdCBkZWNvZGVkID0gand0LnZlcmlmeSh0b2tlbiwgZXZlQXV0aFB1YmxpY0tleSk7XG5cdFx0cmV0dXJuIGRlY29kZWQ7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGNvbnNvbGUuZXJyb3IoYGZhaWxlZCB0byB2YWxpZGF0ZSBFVkUgdG9rZW5gLCBlcnIpO1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG59XG5hc3luYyBmdW5jdGlvbiByZWZyZXNoKHsgcmVmcmVzaF90b2tlbiB9LCBzY29wZXMpIHtcblx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdGdyYW50X3R5cGU6IFwicmVmcmVzaF90b2tlblwiLFxuXHRcdHJlZnJlc2hfdG9rZW4sXG5cdFx0c2NvcGU6IFwiXCJcblx0fTtcblx0aWYgKHNjb3BlcykgcGFyYW1zW1wic2NvcGVcIl0gPSBBcnJheS5pc0FycmF5KHNjb3BlcykgPyBzY29wZXMuam9pbihcIiBcIikgOiBzY29wZXM7XG5cdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCJodHRwczovL2xvZ2luLmV2ZW9ubGluZS5jb20vdjIvb2F1dGgvdG9rZW5cIiwge1xuXHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0aGVhZGVyczoge1xuXHRcdFx0XCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIixcblx0XHRcdEF1dGhvcml6YXRpb246IGBCYXNpYyAke0J1ZmZlci5mcm9tKGAke29wdGlvbnMuY2xpZW50X2lkfToke29wdGlvbnMuY2xpZW50X3NlY3JldH1gKS50b1N0cmluZyhcImJhc2U2NFwiKX1gXG5cdFx0fSxcblx0XHRib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmFtcylcblx0fSk7XG5cdHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCk7XG59XG5mdW5jdGlvbiBjaGFyYWN0ZXJJZEZyb21Ub2tlbih0b2tlbikge1xuXHRjb25zdCBwYXlsb2FkID0gand0RGVjb2RlKHRva2VuKTtcblx0cmV0dXJuIHBhcnNlSW50KHBheWxvYWQuc3ViLnNwbGl0KFwiOlwiKVsyXSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgYXV0aF9leHBvcnRzLCBjaGFyYWN0ZXJJZEZyb21Ub2tlbiwgY3JlYXRlQXV0aG9yaXphdGlvblVSTCwgcmVmcmVzaCwgdmFsaWRhdGVBdXRob3JpemF0aW9uQ29kZSwgdmFsaWRhdGVUb2tlbiB9OyIsCiAgICAiaW1wb3J0IHsgand0RGVjb2RlIH0gZnJvbSBcImp3dC1kZWNvZGVcIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvc2NvcGVzLnRzXG5jb25zdCBFVkVfSldLU19VUkwgPSBcImh0dHBzOi8vbG9naW4uZXZlb25saW5lLmNvbS9vYXV0aC9qd2tzXCI7XG5jb25zdCBFVkVfSVNTVUVSID0gXCJsb2dpbi5ldmVvbmxpbmUuY29tXCI7XG5jb25zdCBFVkVfQVVESUVOQ0UgPSBcImV2ZW9ubGluZVwiO1xuY29uc3QgRVNJX0xBVEVTVF9VUkwgPSBcImh0dHBzOi8vZXNpLmV2ZXRlY2gubmV0L2xhdGVzdFwiO1xuY29uc3QgREFUQV9TT1VSQ0UgPSBcInRyYW5xdWlsaXR5XCI7XG5mdW5jdGlvbiBqb2luU2NvcGVzKC4uLnNjb3Blcykge1xuXHRyZXR1cm4gc2NvcGVzLmpvaW4oXCIgXCIpO1xufVxubGV0IFNDT1BFUyA9IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbihTQ09QRVMkMSkge1xuXHRTQ09QRVMkMVtcIlBVQkxJQ19EQVRBXCJdID0gXCJwdWJsaWNEYXRhXCI7XG5cdFNDT1BFUyQxW1wiQ0FMRU5EQVJfUkVTUE9ORF9DQUxFTkRBUl9FVkVOVFNcIl0gPSBcImVzaS1jYWxlbmRhci5yZXNwb25kX2NhbGVuZGFyX2V2ZW50cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNBTEVOREFSX1JFQURfQ0FMRU5EQVJfRVZFTlRTXCJdID0gXCJlc2ktY2FsZW5kYXIucmVhZF9jYWxlbmRhcl9ldmVudHMudjFcIjtcblx0U0NPUEVTJDFbXCJMT0NBVElPTl9SRUFEX0xPQ0FUSU9OXCJdID0gXCJlc2ktbG9jYXRpb24ucmVhZF9sb2NhdGlvbi52MVwiO1xuXHRTQ09QRVMkMVtcIkxPQ0FUSU9OX1JFQURfU0hJUF9UWVBFXCJdID0gXCJlc2ktbG9jYXRpb24ucmVhZF9zaGlwX3R5cGUudjFcIjtcblx0U0NPUEVTJDFbXCJNQUlMX09SR0FOSVpFX01BSUxcIl0gPSBcImVzaS1tYWlsLm9yZ2FuaXplX21haWwudjFcIjtcblx0U0NPUEVTJDFbXCJNQUlMX1JFQURfTUFJTFwiXSA9IFwiZXNpLW1haWwucmVhZF9tYWlsLnYxXCI7XG5cdFNDT1BFUyQxW1wiTUFJTF9TRU5EX01BSUxcIl0gPSBcImVzaS1tYWlsLnNlbmRfbWFpbC52MVwiO1xuXHRTQ09QRVMkMVtcIlNLSUxMU19SRUFEX1NLSUxMU1wiXSA9IFwiZXNpLXNraWxscy5yZWFkX3NraWxscy52MVwiO1xuXHRTQ09QRVMkMVtcIlNLSUxMU19SRUFEX1NLSUxMUVVFVUVcIl0gPSBcImVzaS1za2lsbHMucmVhZF9za2lsbHF1ZXVlLnYxXCI7XG5cdFNDT1BFUyQxW1wiV0FMTEVUX1JFQURfQ0hBUkFDVEVSX1dBTExFVFwiXSA9IFwiZXNpLXdhbGxldC5yZWFkX2NoYXJhY3Rlcl93YWxsZXQudjFcIjtcblx0U0NPUEVTJDFbXCJXQUxMRVRfUkVBRF9DT1JQT1JBVElPTl9XQUxMRVRcIl0gPSBcImVzaS13YWxsZXQucmVhZF9jb3Jwb3JhdGlvbl93YWxsZXQudjFcIjtcblx0U0NPUEVTJDFbXCJTRUFSQ0hfU0VBUkNIX1NUUlVDVFVSRVNcIl0gPSBcImVzaS1zZWFyY2guc2VhcmNoX3N0cnVjdHVyZXMudjFcIjtcblx0U0NPUEVTJDFbXCJDTE9ORVNfUkVBRF9DTE9ORVNcIl0gPSBcImVzaS1jbG9uZXMucmVhZF9jbG9uZXMudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfQ09OVEFDVFNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfY29udGFjdHMudjFcIjtcblx0U0NPUEVTJDFbXCJVTklWRVJTRV9SRUFEX1NUUlVDVFVSRVNcIl0gPSBcImVzaS11bml2ZXJzZS5yZWFkX3N0cnVjdHVyZXMudjFcIjtcblx0U0NPUEVTJDFbXCJLSUxMTUFJTFNfUkVBRF9LSUxMTUFJTFNcIl0gPSBcImVzaS1raWxsbWFpbHMucmVhZF9raWxsbWFpbHMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9DT1JQT1JBVElPTl9NRU1CRVJTSElQXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfY29ycG9yYXRpb25fbWVtYmVyc2hpcC52MVwiO1xuXHRTQ09QRVMkMVtcIkFTU0VUU19SRUFEX0FTU0VUU1wiXSA9IFwiZXNpLWFzc2V0cy5yZWFkX2Fzc2V0cy52MVwiO1xuXHRTQ09QRVMkMVtcIlBMQU5FVFNfTUFOQUdFX1BMQU5FVFNcIl0gPSBcImVzaS1wbGFuZXRzLm1hbmFnZV9wbGFuZXRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiRkxFRVRTX1JFQURfRkxFRVRcIl0gPSBcImVzaS1mbGVldHMucmVhZF9mbGVldC52MVwiO1xuXHRTQ09QRVMkMVtcIkZMRUVUU19XUklURV9GTEVFVFwiXSA9IFwiZXNpLWZsZWV0cy53cml0ZV9mbGVldC52MVwiO1xuXHRTQ09QRVMkMVtcIlVJX09QRU5fV0lORE9XXCJdID0gXCJlc2ktdWkub3Blbl93aW5kb3cudjFcIjtcblx0U0NPUEVTJDFbXCJVSV9XUklURV9XQVlQT0lOVFwiXSA9IFwiZXNpLXVpLndyaXRlX3dheXBvaW50LnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19XUklURV9DT05UQUNUU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMud3JpdGVfY29udGFjdHMudjFcIjtcblx0U0NPUEVTJDFbXCJGSVRUSU5HU19SRUFEX0ZJVFRJTkdTXCJdID0gXCJlc2ktZml0dGluZ3MucmVhZF9maXR0aW5ncy52MVwiO1xuXHRTQ09QRVMkMVtcIkZJVFRJTkdTX1dSSVRFX0ZJVFRJTkdTXCJdID0gXCJlc2ktZml0dGluZ3Mud3JpdGVfZml0dGluZ3MudjFcIjtcblx0U0NPUEVTJDFbXCJNQVJLRVRTX1NUUlVDVFVSRV9NQVJLRVRTXCJdID0gXCJlc2ktbWFya2V0cy5zdHJ1Y3R1cmVfbWFya2V0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX1NUUlVDVFVSRVNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9zdHJ1Y3R1cmVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0xPWUFMVFlcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfbG95YWx0eS52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9PUFBPUlRVTklUSUVTXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX29wcG9ydHVuaXRpZXMudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfQ0hBVF9DSEFOTkVMU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9jaGF0X2NoYW5uZWxzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX01FREFMU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9tZWRhbHMudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfU1RBTkRJTkdTXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX3N0YW5kaW5ncy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9BR0VOVFNfUkVTRUFSQ0hcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfYWdlbnRzX3Jlc2VhcmNoLnYxXCI7XG5cdFNDT1BFUyQxW1wiSU5EVVNUUllfUkVBRF9DSEFSQUNURVJfSk9CU1wiXSA9IFwiZXNpLWluZHVzdHJ5LnJlYWRfY2hhcmFjdGVyX2pvYnMudjFcIjtcblx0U0NPUEVTJDFbXCJNQVJLRVRTX1JFQURfQ0hBUkFDVEVSX09SREVSU1wiXSA9IFwiZXNpLW1hcmtldHMucmVhZF9jaGFyYWN0ZXJfb3JkZXJzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0JMVUVQUklOVFNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfYmx1ZXByaW50cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9DT1JQT1JBVElPTl9ST0xFU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9jb3Jwb3JhdGlvbl9yb2xlcy52MVwiO1xuXHRTQ09QRVMkMVtcIkxPQ0FUSU9OX1JFQURfT05MSU5FXCJdID0gXCJlc2ktbG9jYXRpb24ucmVhZF9vbmxpbmUudjFcIjtcblx0U0NPUEVTJDFbXCJDT05UUkFDVFNfUkVBRF9DSEFSQUNURVJfQ09OVFJBQ1RTXCJdID0gXCJlc2ktY29udHJhY3RzLnJlYWRfY2hhcmFjdGVyX2NvbnRyYWN0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNMT05FU19SRUFEX0lNUExBTlRTXCJdID0gXCJlc2ktY2xvbmVzLnJlYWRfaW1wbGFudHMudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfRkFUSUdVRVwiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9mYXRpZ3VlLnYxXCI7XG5cdFNDT1BFUyQxW1wiS0lMTE1BSUxTX1JFQURfQ09SUE9SQVRJT05fS0lMTE1BSUxTXCJdID0gXCJlc2kta2lsbG1haWxzLnJlYWRfY29ycG9yYXRpb25fa2lsbG1haWxzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1RSQUNLX01FTUJFUlNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMudHJhY2tfbWVtYmVycy52MVwiO1xuXHRTQ09QRVMkMVtcIldBTExFVF9SRUFEX0NPUlBPUkFUSU9OX1dBTExFVFNcIl0gPSBcImVzaS13YWxsZXQucmVhZF9jb3Jwb3JhdGlvbl93YWxsZXRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX05PVElGSUNBVElPTlNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfbm90aWZpY2F0aW9ucy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX0RJVklTSU9OU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX2RpdmlzaW9ucy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX0NPTlRBQ1RTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfY29udGFjdHMudjFcIjtcblx0U0NPUEVTJDFbXCJBU1NFVFNfUkVBRF9DT1JQT1JBVElPTl9BU1NFVFNcIl0gPSBcImVzaS1hc3NldHMucmVhZF9jb3Jwb3JhdGlvbl9hc3NldHMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9USVRMRVNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF90aXRsZXMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9CTFVFUFJJTlRTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfYmx1ZXByaW50cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPTlRSQUNUU19SRUFEX0NPUlBPUkFUSU9OX0NPTlRSQUNUU1wiXSA9IFwiZXNpLWNvbnRyYWN0cy5yZWFkX2NvcnBvcmF0aW9uX2NvbnRyYWN0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX1NUQU5ESU5HU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX3N0YW5kaW5ncy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX1NUQVJCQVNFU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX3N0YXJiYXNlcy52MVwiO1xuXHRTQ09QRVMkMVtcIklORFVTVFJZX1JFQURfQ09SUE9SQVRJT05fSk9CU1wiXSA9IFwiZXNpLWluZHVzdHJ5LnJlYWRfY29ycG9yYXRpb25fam9icy52MVwiO1xuXHRTQ09QRVMkMVtcIk1BUktFVFNfUkVBRF9DT1JQT1JBVElPTl9PUkRFUlNcIl0gPSBcImVzaS1tYXJrZXRzLnJlYWRfY29ycG9yYXRpb25fb3JkZXJzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfQ09OVEFJTkVSX0xPR1NcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9jb250YWluZXJfbG9ncy52MVwiO1xuXHRTQ09QRVMkMVtcIklORFVTVFJZX1JFQURfQ0hBUkFDVEVSX01JTklOR1wiXSA9IFwiZXNpLWluZHVzdHJ5LnJlYWRfY2hhcmFjdGVyX21pbmluZy52MVwiO1xuXHRTQ09QRVMkMVtcIklORFVTVFJZX1JFQURfQ09SUE9SQVRJT05fTUlOSU5HXCJdID0gXCJlc2ktaW5kdXN0cnkucmVhZF9jb3Jwb3JhdGlvbl9taW5pbmcudjFcIjtcblx0U0NPUEVTJDFbXCJQTEFORVRTX1JFQURfQ1VTVE9NU19PRkZJQ0VTXCJdID0gXCJlc2ktcGxhbmV0cy5yZWFkX2N1c3RvbXNfb2ZmaWNlcy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX0ZBQ0lMSVRJRVNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9mYWNpbGl0aWVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfTUVEQUxTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfbWVkYWxzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX1RJVExFU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF90aXRsZXMudjFcIjtcblx0U0NPUEVTJDFbXCJBTExJQU5DRVNfUkVBRF9DT05UQUNUU1wiXSA9IFwiZXNpLWFsbGlhbmNlcy5yZWFkX2NvbnRhY3RzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0ZXX1NUQVRTXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX2Z3X3N0YXRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfRldfU1RBVFNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9md19zdGF0cy52MVwiO1xuXHRyZXR1cm4gU0NPUEVTJDE7XG59KHt9KTtcbmZ1bmN0aW9uIHRva2VuSGFzU2NvcGVzKGFjY2Vzc190b2tlbiwgLi4uc2NvcGVzKSB7XG5cdGxldCB0b2tlblNjb3BlcyA9IGdldFNjb3Blc0Zyb21Ub2tlbihhY2Nlc3NfdG9rZW4pO1xuXHRyZXR1cm4gc2NvcGVzLmV2ZXJ5KChzY29wZSkgPT4gdG9rZW5TY29wZXMuaW5jbHVkZXMoc2NvcGUpKTtcbn1cbmZ1bmN0aW9uIGdldFNjb3Blc0Zyb21Ub2tlbihhY2Nlc3NfdG9rZW4pIHtcblx0Y29uc3QgZGVjb2RlZCA9IGp3dERlY29kZShhY2Nlc3NfdG9rZW4pO1xuXHRyZXR1cm4gdHlwZW9mIGRlY29kZWQuc2NwID09PSBcInN0cmluZ1wiID8gW2RlY29kZWQuc2NwXSA6IGRlY29kZWQuc2NwO1xufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IERBVEFfU09VUkNFLCBFU0lfTEFURVNUX1VSTCwgRVZFX0FVRElFTkNFLCBFVkVfSVNTVUVSLCBFVkVfSldLU19VUkwsIFNDT1BFUywgZ2V0U2NvcGVzRnJvbVRva2VuLCBqb2luU2NvcGVzLCB0b2tlbkhhc1Njb3BlcyB9OyIsCiAgICAiY29uc3QgZW50aXR5S2luZCA9IFN5bWJvbC5mb3IoXCJkcml6emxlOmVudGl0eUtpbmRcIik7XG5jb25zdCBoYXNPd25FbnRpdHlLaW5kID0gU3ltYm9sLmZvcihcImRyaXp6bGU6aGFzT3duRW50aXR5S2luZFwiKTtcbmZ1bmN0aW9uIGlzKHZhbHVlLCB0eXBlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIHR5cGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0eXBlLCBlbnRpdHlLaW5kKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDbGFzcyBcIiR7dHlwZS5uYW1lID8/IFwiPHVua25vd24+XCJ9XCIgZG9lc24ndCBsb29rIGxpa2UgYSBEcml6emxlIGVudGl0eS4gSWYgdGhpcyBpcyBpbmNvcnJlY3QgYW5kIHRoZSBjbGFzcyBpcyBwcm92aWRlZCBieSBEcml6emxlLCBwbGVhc2UgcmVwb3J0IHRoaXMgYXMgYSBidWcuYFxuICAgICk7XG4gIH1cbiAgbGV0IGNscyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkuY29uc3RydWN0b3I7XG4gIGlmIChjbHMpIHtcbiAgICB3aGlsZSAoY2xzKSB7XG4gICAgICBpZiAoZW50aXR5S2luZCBpbiBjbHMgJiYgY2xzW2VudGl0eUtpbmRdID09PSB0eXBlW2VudGl0eUtpbmRdKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY2xzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNscyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCB7XG4gIGVudGl0eUtpbmQsXG4gIGhhc093bkVudGl0eUtpbmQsXG4gIGlzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW50aXR5LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuY2xhc3MgQ29sdW1uIHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICB0aGlzLmtleUFzTmFtZSA9IGNvbmZpZy5rZXlBc05hbWU7XG4gICAgdGhpcy5ub3ROdWxsID0gY29uZmlnLm5vdE51bGw7XG4gICAgdGhpcy5kZWZhdWx0ID0gY29uZmlnLmRlZmF1bHQ7XG4gICAgdGhpcy5kZWZhdWx0Rm4gPSBjb25maWcuZGVmYXVsdEZuO1xuICAgIHRoaXMub25VcGRhdGVGbiA9IGNvbmZpZy5vblVwZGF0ZUZuO1xuICAgIHRoaXMuaGFzRGVmYXVsdCA9IGNvbmZpZy5oYXNEZWZhdWx0O1xuICAgIHRoaXMucHJpbWFyeSA9IGNvbmZpZy5wcmltYXJ5S2V5O1xuICAgIHRoaXMuaXNVbmlxdWUgPSBjb25maWcuaXNVbmlxdWU7XG4gICAgdGhpcy51bmlxdWVOYW1lID0gY29uZmlnLnVuaXF1ZU5hbWU7XG4gICAgdGhpcy51bmlxdWVUeXBlID0gY29uZmlnLnVuaXF1ZVR5cGU7XG4gICAgdGhpcy5kYXRhVHlwZSA9IGNvbmZpZy5kYXRhVHlwZTtcbiAgICB0aGlzLmNvbHVtblR5cGUgPSBjb25maWcuY29sdW1uVHlwZTtcbiAgICB0aGlzLmdlbmVyYXRlZCA9IGNvbmZpZy5nZW5lcmF0ZWQ7XG4gICAgdGhpcy5nZW5lcmF0ZWRJZGVudGl0eSA9IGNvbmZpZy5nZW5lcmF0ZWRJZGVudGl0eTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJDb2x1bW5cIjtcbiAgbmFtZTtcbiAga2V5QXNOYW1lO1xuICBwcmltYXJ5O1xuICBub3ROdWxsO1xuICBkZWZhdWx0O1xuICBkZWZhdWx0Rm47XG4gIG9uVXBkYXRlRm47XG4gIGhhc0RlZmF1bHQ7XG4gIGlzVW5pcXVlO1xuICB1bmlxdWVOYW1lO1xuICB1bmlxdWVUeXBlO1xuICBkYXRhVHlwZTtcbiAgY29sdW1uVHlwZTtcbiAgZW51bVZhbHVlcyA9IHZvaWQgMDtcbiAgZ2VuZXJhdGVkID0gdm9pZCAwO1xuICBnZW5lcmF0ZWRJZGVudGl0eSA9IHZvaWQgMDtcbiAgY29uZmlnO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICAvLyAqKiBAaW50ZXJuYWwgKi9cbiAgc2hvdWxkRGlzYWJsZUluc2VydCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZ2VuZXJhdGVkICE9PSB2b2lkIDAgJiYgdGhpcy5jb25maWcuZ2VuZXJhdGVkLnR5cGUgIT09IFwiYnlEZWZhdWx0XCI7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIENvbHVtblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbHVtbi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIENvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJDb2x1bW5CdWlsZGVyXCI7XG4gIGNvbmZpZztcbiAgY29uc3RydWN0b3IobmFtZSwgZGF0YVR5cGUsIGNvbHVtblR5cGUpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBrZXlBc05hbWU6IG5hbWUgPT09IFwiXCIsXG4gICAgICBub3ROdWxsOiBmYWxzZSxcbiAgICAgIGRlZmF1bHQ6IHZvaWQgMCxcbiAgICAgIGhhc0RlZmF1bHQ6IGZhbHNlLFxuICAgICAgcHJpbWFyeUtleTogZmFsc2UsXG4gICAgICBpc1VuaXF1ZTogZmFsc2UsXG4gICAgICB1bmlxdWVOYW1lOiB2b2lkIDAsXG4gICAgICB1bmlxdWVUeXBlOiB2b2lkIDAsXG4gICAgICBkYXRhVHlwZSxcbiAgICAgIGNvbHVtblR5cGUsXG4gICAgICBnZW5lcmF0ZWQ6IHZvaWQgMFxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIGRhdGEgdHlwZSBvZiB0aGUgY29sdW1uLiBDb21tb25seSB1c2VkIHdpdGggYGpzb25gIGNvbHVtbnMuIEFsc28sIHVzZWZ1bCBmb3IgYnJhbmRlZCB0eXBlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogY29uc3QgdXNlcnMgPSBwZ1RhYmxlKCd1c2VycycsIHtcbiAgICogXHRpZDogaW50ZWdlcignaWQnKS4kdHlwZTxVc2VySWQ+KCkucHJpbWFyeUtleSgpLFxuICAgKiBcdGRldGFpbHM6IGpzb24oJ2RldGFpbHMnKS4kdHlwZTxVc2VyRGV0YWlscz4oKS5ub3ROdWxsKCksXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gICR0eXBlKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgYG5vdCBudWxsYCBjbGF1c2UgdG8gdGhlIGNvbHVtbiBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBBZmZlY3RzIHRoZSBgc2VsZWN0YCBtb2RlbCBvZiB0aGUgdGFibGUgLSBjb2x1bW5zICp3aXRob3V0KiBgbm90IG51bGxgIHdpbGwgYmUgbnVsbGFibGUgb24gc2VsZWN0LlxuICAgKi9cbiAgbm90TnVsbCgpIHtcbiAgICB0aGlzLmNvbmZpZy5ub3ROdWxsID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGBkZWZhdWx0IDx2YWx1ZT5gIGNsYXVzZSB0byB0aGUgY29sdW1uIGRlZmluaXRpb24uXG4gICAqXG4gICAqIEFmZmVjdHMgdGhlIGBpbnNlcnRgIG1vZGVsIG9mIHRoZSB0YWJsZSAtIGNvbHVtbnMgKndpdGgqIGBkZWZhdWx0YCBhcmUgb3B0aW9uYWwgb24gaW5zZXJ0LlxuICAgKlxuICAgKiBJZiB5b3UgbmVlZCB0byBzZXQgYSBkeW5hbWljIGRlZmF1bHQgdmFsdWUsIHVzZSB7QGxpbmsgJGRlZmF1bHRGbn0gaW5zdGVhZC5cbiAgICovXG4gIGRlZmF1bHQodmFsdWUpIHtcbiAgICB0aGlzLmNvbmZpZy5kZWZhdWx0ID0gdmFsdWU7XG4gICAgdGhpcy5jb25maWcuaGFzRGVmYXVsdCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBkeW5hbWljIGRlZmF1bHQgdmFsdWUgdG8gdGhlIGNvbHVtbi5cbiAgICogVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJvdyBpcyBpbnNlcnRlZCwgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbHVtbiB2YWx1ZS5cbiAgICpcbiAgICogKipOb3RlOioqIFRoaXMgdmFsdWUgZG9lcyBub3QgYWZmZWN0IHRoZSBgZHJpenpsZS1raXRgIGJlaGF2aW9yLCBpdCBpcyBvbmx5IHVzZWQgYXQgcnVudGltZSBpbiBgZHJpenpsZS1vcm1gLlxuICAgKi9cbiAgJGRlZmF1bHRGbihmbikge1xuICAgIHRoaXMuY29uZmlnLmRlZmF1bHRGbiA9IGZuO1xuICAgIHRoaXMuY29uZmlnLmhhc0RlZmF1bHQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBbGlhcyBmb3Ige0BsaW5rICRkZWZhdWx0Rm59LlxuICAgKi9cbiAgJGRlZmF1bHQgPSB0aGlzLiRkZWZhdWx0Rm47XG4gIC8qKlxuICAgKiBBZGRzIGEgZHluYW1pYyB1cGRhdGUgdmFsdWUgdG8gdGhlIGNvbHVtbi5cbiAgICogVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJvdyBpcyB1cGRhdGVkLCBhbmQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgY29sdW1uIHZhbHVlIGlmIG5vbmUgaXMgcHJvdmlkZWQuXG4gICAqIElmIG5vIGBkZWZhdWx0YCAob3IgYCRkZWZhdWx0Rm5gKSB2YWx1ZSBpcyBwcm92aWRlZCwgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJvdyBpcyBpbnNlcnRlZCBhcyB3ZWxsLCBhbmQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgY29sdW1uIHZhbHVlLlxuICAgKlxuICAgKiAqKk5vdGU6KiogVGhpcyB2YWx1ZSBkb2VzIG5vdCBhZmZlY3QgdGhlIGBkcml6emxlLWtpdGAgYmVoYXZpb3IsIGl0IGlzIG9ubHkgdXNlZCBhdCBydW50aW1lIGluIGBkcml6emxlLW9ybWAuXG4gICAqL1xuICAkb25VcGRhdGVGbihmbikge1xuICAgIHRoaXMuY29uZmlnLm9uVXBkYXRlRm4gPSBmbjtcbiAgICB0aGlzLmNvbmZpZy5oYXNEZWZhdWx0ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWxpYXMgZm9yIHtAbGluayAkb25VcGRhdGVGbn0uXG4gICAqL1xuICAkb25VcGRhdGUgPSB0aGlzLiRvblVwZGF0ZUZuO1xuICAvKipcbiAgICogQWRkcyBhIGBwcmltYXJ5IGtleWAgY2xhdXNlIHRvIHRoZSBjb2x1bW4gZGVmaW5pdGlvbi4gVGhpcyBpbXBsaWNpdGx5IG1ha2VzIHRoZSBjb2x1bW4gYG5vdCBudWxsYC5cbiAgICpcbiAgICogSW4gU1FMaXRlLCBgaW50ZWdlciBwcmltYXJ5IGtleWAgaW1wbGljaXRseSBtYWtlcyB0aGUgY29sdW1uIGF1dG8taW5jcmVtZW50aW5nLlxuICAgKi9cbiAgcHJpbWFyeUtleSgpIHtcbiAgICB0aGlzLmNvbmZpZy5wcmltYXJ5S2V5ID0gdHJ1ZTtcbiAgICB0aGlzLmNvbmZpZy5ub3ROdWxsID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsIFNldHMgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB0aGUga2V5IHdpdGhpbiB0aGUgdGFibGUgZGVmaW5pdGlvbiBpZiBhIG5hbWUgd2FzIG5vdCBnaXZlbi4gKi9cbiAgc2V0TmFtZShuYW1lKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm5hbWUgIT09IFwiXCIpIHJldHVybjtcbiAgICB0aGlzLmNvbmZpZy5uYW1lID0gbmFtZTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgQ29sdW1uQnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbHVtbi1idWlsZGVyLmpzLm1hcCIsCiAgICAiY29uc3QgVGFibGVOYW1lID0gU3ltYm9sLmZvcihcImRyaXp6bGU6TmFtZVwiKTtcbmV4cG9ydCB7XG4gIFRhYmxlTmFtZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhYmxlLnV0aWxzLmpzLm1hcCIsCiAgICAiZnVuY3Rpb24gaWlmZShmbiwgLi4uYXJncykge1xuICByZXR1cm4gZm4oLi4uYXJncyk7XG59XG5leHBvcnQge1xuICBpaWZlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhY2luZy11dGlscy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZU5hbWUgfSBmcm9tIFwiLi4vdGFibGUudXRpbHMuanNcIjtcbmZ1bmN0aW9uIHVuaXF1ZShuYW1lKSB7XG4gIHJldHVybiBuZXcgVW5pcXVlT25Db25zdHJhaW50QnVpbGRlcihuYW1lKTtcbn1cbmZ1bmN0aW9uIHVuaXF1ZUtleU5hbWUodGFibGUsIGNvbHVtbnMpIHtcbiAgcmV0dXJuIGAke3RhYmxlW1RhYmxlTmFtZV19XyR7Y29sdW1ucy5qb2luKFwiX1wiKX1fdW5pcXVlYDtcbn1cbmNsYXNzIFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoY29sdW1ucywgbmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ1VuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29sdW1ucztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBudWxsc05vdERpc3RpbmN0Q29uZmlnID0gZmFsc2U7XG4gIG51bGxzTm90RGlzdGluY3QoKSB7XG4gICAgdGhpcy5udWxsc05vdERpc3RpbmN0Q29uZmlnID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50KHRhYmxlLCB0aGlzLmNvbHVtbnMsIHRoaXMubnVsbHNOb3REaXN0aW5jdENvbmZpZywgdGhpcy5uYW1lKTtcbiAgfVxufVxuY2xhc3MgVW5pcXVlT25Db25zdHJhaW50QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnVW5pcXVlT25Db25zdHJhaW50QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIG5hbWU7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG4gIG9uKC4uLmNvbHVtbnMpIHtcbiAgICByZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyKGNvbHVtbnMsIHRoaXMubmFtZSk7XG4gIH1cbn1cbmNsYXNzIFVuaXF1ZUNvbnN0cmFpbnQge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29sdW1ucywgbnVsbHNOb3REaXN0aW5jdCwgbmFtZSkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICAgIHRoaXMubmFtZSA9IG5hbWUgPz8gdW5pcXVlS2V5TmFtZSh0aGlzLnRhYmxlLCB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKSk7XG4gICAgdGhpcy5udWxsc05vdERpc3RpbmN0ID0gbnVsbHNOb3REaXN0aW5jdDtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ1VuaXF1ZUNvbnN0cmFpbnRcIjtcbiAgY29sdW1ucztcbiAgbmFtZTtcbiAgbnVsbHNOb3REaXN0aW5jdCA9IGZhbHNlO1xuICBnZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFVuaXF1ZUNvbnN0cmFpbnQsXG4gIFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyLFxuICBVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyLFxuICB1bmlxdWUsXG4gIHVuaXF1ZUtleU5hbWVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmlxdWUtY29uc3RyYWludC5qcy5tYXAiLAogICAgImltcG9ydCB7IENvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi4vLi4vY29sdW1uLWJ1aWxkZXIuanNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuLi8uLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgRm9yZWlnbktleUJ1aWxkZXIgfSBmcm9tIFwiLi4vZm9yZWlnbi1rZXlzLmpzXCI7XG5pbXBvcnQgeyBpaWZlIH0gZnJvbSBcIi4uLy4uL3RyYWNpbmctdXRpbHMuanNcIjtcbmltcG9ydCB7IHVuaXF1ZUtleU5hbWUgfSBmcm9tIFwiLi4vdW5pcXVlLWNvbnN0cmFpbnQuanNcIjtcbmltcG9ydCB7IG1ha2VQZ0FycmF5LCBwYXJzZVBnQXJyYXkgfSBmcm9tIFwiLi4vdXRpbHMvYXJyYXkuanNcIjtcbmNsYXNzIFBnQ29sdW1uQnVpbGRlciBleHRlbmRzIENvbHVtbkJ1aWxkZXIge1xuICBmb3JlaWduS2V5Q29uZmlncyA9IFtdO1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0NvbHVtbkJ1aWxkZXJcIjtcbiAgYXJyYXkoc2l6ZSkge1xuICAgIHJldHVybiBuZXcgUGdBcnJheUJ1aWxkZXIodGhpcy5jb25maWcubmFtZSwgdGhpcywgc2l6ZSk7XG4gIH1cbiAgcmVmZXJlbmNlcyhyZWYsIGFjdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuZm9yZWlnbktleUNvbmZpZ3MucHVzaCh7IHJlZiwgYWN0aW9ucyB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB1bmlxdWUobmFtZSwgY29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcuaXNVbmlxdWUgPSB0cnVlO1xuICAgIHRoaXMuY29uZmlnLnVuaXF1ZU5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY29uZmlnLnVuaXF1ZVR5cGUgPSBjb25maWc/Lm51bGxzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdlbmVyYXRlZEFsd2F5c0FzKGFzKSB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkID0ge1xuICAgICAgYXMsXG4gICAgICB0eXBlOiBcImFsd2F5c1wiLFxuICAgICAgbW9kZTogXCJzdG9yZWRcIlxuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZEZvcmVpZ25LZXlzKGNvbHVtbiwgdGFibGUpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JlaWduS2V5Q29uZmlncy5tYXAoKHsgcmVmLCBhY3Rpb25zIH0pID0+IHtcbiAgICAgIHJldHVybiBpaWZlKFxuICAgICAgICAocmVmMiwgYWN0aW9uczIpID0+IHtcbiAgICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IEZvcmVpZ25LZXlCdWlsZGVyKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvcmVpZ25Db2x1bW4gPSByZWYyKCk7XG4gICAgICAgICAgICByZXR1cm4geyBjb2x1bW5zOiBbY29sdW1uXSwgZm9yZWlnbkNvbHVtbnM6IFtmb3JlaWduQ29sdW1uXSB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChhY3Rpb25zMi5vblVwZGF0ZSkge1xuICAgICAgICAgICAgYnVpbGRlci5vblVwZGF0ZShhY3Rpb25zMi5vblVwZGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhY3Rpb25zMi5vbkRlbGV0ZSkge1xuICAgICAgICAgICAgYnVpbGRlci5vbkRlbGV0ZShhY3Rpb25zMi5vbkRlbGV0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKHRhYmxlKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVmLFxuICAgICAgICBhY3Rpb25zXG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGRFeHRyYUNvbmZpZ0NvbHVtbih0YWJsZSkge1xuICAgIHJldHVybiBuZXcgRXh0cmFDb25maWdDb2x1bW4odGFibGUsIHRoaXMuY29uZmlnKTtcbiAgfVxufVxuY2xhc3MgUGdDb2x1bW4gZXh0ZW5kcyBDb2x1bW4ge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgaWYgKCFjb25maWcudW5pcXVlTmFtZSkge1xuICAgICAgY29uZmlnLnVuaXF1ZU5hbWUgPSB1bmlxdWVLZXlOYW1lKHRhYmxlLCBbY29uZmlnLm5hbWVdKTtcbiAgICB9XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnQ29sdW1uXCI7XG59XG5jbGFzcyBFeHRyYUNvbmZpZ0NvbHVtbiBleHRlbmRzIFBnQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiRXh0cmFDb25maWdDb2x1bW5cIjtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTUUxUeXBlKCk7XG4gIH1cbiAgaW5kZXhDb25maWcgPSB7XG4gICAgb3JkZXI6IHRoaXMuY29uZmlnLm9yZGVyID8/IFwiYXNjXCIsXG4gICAgbnVsbHM6IHRoaXMuY29uZmlnLm51bGxzID8/IFwibGFzdFwiLFxuICAgIG9wQ2xhc3M6IHRoaXMuY29uZmlnLm9wQ2xhc3NcbiAgfTtcbiAgZGVmYXVsdENvbmZpZyA9IHtcbiAgICBvcmRlcjogXCJhc2NcIixcbiAgICBudWxsczogXCJsYXN0XCIsXG4gICAgb3BDbGFzczogdm9pZCAwXG4gIH07XG4gIGFzYygpIHtcbiAgICB0aGlzLmluZGV4Q29uZmlnLm9yZGVyID0gXCJhc2NcIjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBkZXNjKCkge1xuICAgIHRoaXMuaW5kZXhDb25maWcub3JkZXIgPSBcImRlc2NcIjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBudWxsc0ZpcnN0KCkge1xuICAgIHRoaXMuaW5kZXhDb25maWcubnVsbHMgPSBcImZpcnN0XCI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgbnVsbHNMYXN0KCkge1xuICAgIHRoaXMuaW5kZXhDb25maWcubnVsbHMgPSBcImxhc3RcIjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogIyMjIFBvc3RncmVTUUwgZG9jdW1lbnRhdGlvbiBxdW90ZVxuICAgKlxuICAgKiA+IEFuIG9wZXJhdG9yIGNsYXNzIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyBjYW4gYmUgc3BlY2lmaWVkIGZvciBlYWNoIGNvbHVtbiBvZiBhbiBpbmRleC5cbiAgICogVGhlIG9wZXJhdG9yIGNsYXNzIGlkZW50aWZpZXMgdGhlIG9wZXJhdG9ycyB0byBiZSB1c2VkIGJ5IHRoZSBpbmRleCBmb3IgdGhhdCBjb2x1bW4uXG4gICAqIEZvciBleGFtcGxlLCBhIEItdHJlZSBpbmRleCBvbiBmb3VyLWJ5dGUgaW50ZWdlcnMgd291bGQgdXNlIHRoZSBpbnQ0X29wcyBjbGFzcztcbiAgICogdGhpcyBvcGVyYXRvciBjbGFzcyBpbmNsdWRlcyBjb21wYXJpc29uIGZ1bmN0aW9ucyBmb3IgZm91ci1ieXRlIGludGVnZXJzLlxuICAgKiBJbiBwcmFjdGljZSB0aGUgZGVmYXVsdCBvcGVyYXRvciBjbGFzcyBmb3IgdGhlIGNvbHVtbidzIGRhdGEgdHlwZSBpcyB1c3VhbGx5IHN1ZmZpY2llbnQuXG4gICAqIFRoZSBtYWluIHBvaW50IG9mIGhhdmluZyBvcGVyYXRvciBjbGFzc2VzIGlzIHRoYXQgZm9yIHNvbWUgZGF0YSB0eXBlcywgdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBtZWFuaW5nZnVsIG9yZGVyaW5nLlxuICAgKiBGb3IgZXhhbXBsZSwgd2UgbWlnaHQgd2FudCB0byBzb3J0IGEgY29tcGxleC1udW1iZXIgZGF0YSB0eXBlIGVpdGhlciBieSBhYnNvbHV0ZSB2YWx1ZSBvciBieSByZWFsIHBhcnQuXG4gICAqIFdlIGNvdWxkIGRvIHRoaXMgYnkgZGVmaW5pbmcgdHdvIG9wZXJhdG9yIGNsYXNzZXMgZm9yIHRoZSBkYXRhIHR5cGUgYW5kIHRoZW4gc2VsZWN0aW5nIHRoZSBwcm9wZXIgY2xhc3Mgd2hlbiBjcmVhdGluZyBhbiBpbmRleC5cbiAgICogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvcGVyYXRvciBjbGFzc2VzIGNoZWNrOlxuICAgKlxuICAgKiAjIyMgVXNlZnVsIGxpbmtzXG4gICAqIGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC9zcWwtY3JlYXRlaW5kZXguaHRtbFxuICAgKlxuICAgKiBodHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzL2N1cnJlbnQvaW5kZXhlcy1vcGNsYXNzLmh0bWxcbiAgICpcbiAgICogaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvZG9jcy9jdXJyZW50L3hpbmRleC5odG1sXG4gICAqXG4gICAqICMjIyBBZGRpdGlvbmFsIHR5cGVzXG4gICAqIElmIHlvdSBoYXZlIHRoZSBgcGdfdmVjdG9yYCBleHRlbnNpb24gaW5zdGFsbGVkIGluIHlvdXIgZGF0YWJhc2UsIHlvdSBjYW4gdXNlIHRoZVxuICAgKiBgdmVjdG9yX2wyX29wc2AsIGB2ZWN0b3JfaXBfb3BzYCwgYHZlY3Rvcl9jb3NpbmVfb3BzYCwgYHZlY3Rvcl9sMV9vcHNgLCBgYml0X2hhbW1pbmdfb3BzYCwgYGJpdF9qYWNjYXJkX29wc2AsIGBoYWxmdmVjX2wyX29wc2AsIGBzcGFyc2V2ZWNfbDJfb3BzYCBvcHRpb25zLCB3aGljaCBhcmUgcHJlZGVmaW5lZCB0eXBlcy5cbiAgICpcbiAgICogKipZb3UgY2FuIGFsd2F5cyBzcGVjaWZ5IGFueSBzdHJpbmcgeW91IHdhbnQgaW4gdGhlIG9wZXJhdG9yIGNsYXNzLCBpbiBjYXNlIERyaXp6bGUgZG9lc24ndCBoYXZlIGl0IG5hdGl2ZWx5IGluIGl0cyB0eXBlcyoqXG4gICAqXG4gICAqIEBwYXJhbSBvcENsYXNzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBvcChvcENsYXNzKSB7XG4gICAgdGhpcy5pbmRleENvbmZpZy5vcENsYXNzID0gb3BDbGFzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuY2xhc3MgSW5kZXhlZENvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkluZGV4ZWRDb2x1bW5cIjtcbiAgY29uc3RydWN0b3IobmFtZSwga2V5QXNOYW1lLCB0eXBlLCBpbmRleENvbmZpZykge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5rZXlBc05hbWUgPSBrZXlBc05hbWU7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmluZGV4Q29uZmlnID0gaW5kZXhDb25maWc7XG4gIH1cbiAgbmFtZTtcbiAga2V5QXNOYW1lO1xuICB0eXBlO1xuICBpbmRleENvbmZpZztcbn1cbmNsYXNzIFBnQXJyYXlCdWlsZGVyIGV4dGVuZHMgUGdDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdBcnJheUJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgYmFzZUJ1aWxkZXIsIHNpemUpIHtcbiAgICBzdXBlcihuYW1lLCBcImFycmF5XCIsIFwiUGdBcnJheVwiKTtcbiAgICB0aGlzLmNvbmZpZy5iYXNlQnVpbGRlciA9IGJhc2VCdWlsZGVyO1xuICAgIHRoaXMuY29uZmlnLnNpemUgPSBzaXplO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICBjb25zdCBiYXNlQ29sdW1uID0gdGhpcy5jb25maWcuYmFzZUJ1aWxkZXIuYnVpbGQodGFibGUpO1xuICAgIHJldHVybiBuZXcgUGdBcnJheShcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWcsXG4gICAgICBiYXNlQ29sdW1uXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgUGdBcnJheSBleHRlbmRzIFBnQ29sdW1uIHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZywgYmFzZUNvbHVtbiwgcmFuZ2UpIHtcbiAgICBzdXBlcih0YWJsZSwgY29uZmlnKTtcbiAgICB0aGlzLmJhc2VDb2x1bW4gPSBiYXNlQ29sdW1uO1xuICAgIHRoaXMucmFuZ2UgPSByYW5nZTtcbiAgICB0aGlzLnNpemUgPSBjb25maWcuc2l6ZTtcbiAgfVxuICBzaXplO1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0FycmF5XCI7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuYmFzZUNvbHVtbi5nZXRTUUxUeXBlKCl9WyR7dHlwZW9mIHRoaXMuc2l6ZSA9PT0gXCJudW1iZXJcIiA/IHRoaXMuc2l6ZSA6IFwiXCJ9XWA7XG4gIH1cbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdmFsdWUgPSBwYXJzZVBnQXJyYXkodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUubWFwKCh2KSA9PiB0aGlzLmJhc2VDb2x1bW4ubWFwRnJvbURyaXZlclZhbHVlKHYpKTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlLCBpc05lc3RlZEFycmF5ID0gZmFsc2UpIHtcbiAgICBjb25zdCBhID0gdmFsdWUubWFwKFxuICAgICAgKHYpID0+IHYgPT09IG51bGwgPyBudWxsIDogaXModGhpcy5iYXNlQ29sdW1uLCBQZ0FycmF5KSA/IHRoaXMuYmFzZUNvbHVtbi5tYXBUb0RyaXZlclZhbHVlKHYsIHRydWUpIDogdGhpcy5iYXNlQ29sdW1uLm1hcFRvRHJpdmVyVmFsdWUodilcbiAgICApO1xuICAgIGlmIChpc05lc3RlZEFycmF5KSByZXR1cm4gYTtcbiAgICByZXR1cm4gbWFrZVBnQXJyYXkoYSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIEV4dHJhQ29uZmlnQ29sdW1uLFxuICBJbmRleGVkQ29sdW1uLFxuICBQZ0FycmF5LFxuICBQZ0FycmF5QnVpbGRlcixcbiAgUGdDb2x1bW4sXG4gIFBnQ29sdW1uQnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbW1vbi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBQZ0NvbHVtbiwgUGdDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBQZ0VudW1PYmplY3RDb2x1bW5CdWlsZGVyIGV4dGVuZHMgUGdDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdFbnVtT2JqZWN0Q29sdW1uQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBlbnVtSW5zdGFuY2UpIHtcbiAgICBzdXBlcihuYW1lLCBcInN0cmluZ1wiLCBcIlBnRW51bU9iamVjdENvbHVtblwiKTtcbiAgICB0aGlzLmNvbmZpZy5lbnVtID0gZW51bUluc3RhbmNlO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFBnRW51bU9iamVjdENvbHVtbihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBQZ0VudW1PYmplY3RDb2x1bW4gZXh0ZW5kcyBQZ0NvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnRW51bU9iamVjdENvbHVtblwiO1xuICBlbnVtO1xuICBlbnVtVmFsdWVzID0gdGhpcy5jb25maWcuZW51bS5lbnVtVmFsdWVzO1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gICAgdGhpcy5lbnVtID0gY29uZmlnLmVudW07XG4gIH1cbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbnVtLmVudW1OYW1lO1xuICB9XG59XG5jb25zdCBpc1BnRW51bVN5bSA9IFN5bWJvbC5mb3IoXCJkcml6emxlOmlzUGdFbnVtXCIpO1xuZnVuY3Rpb24gaXNQZ0VudW0ob2JqKSB7XG4gIHJldHVybiAhIW9iaiAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgJiYgaXNQZ0VudW1TeW0gaW4gb2JqICYmIG9ialtpc1BnRW51bVN5bV0gPT09IHRydWU7XG59XG5jbGFzcyBQZ0VudW1Db2x1bW5CdWlsZGVyIGV4dGVuZHMgUGdDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdFbnVtQ29sdW1uQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBlbnVtSW5zdGFuY2UpIHtcbiAgICBzdXBlcihuYW1lLCBcInN0cmluZ1wiLCBcIlBnRW51bUNvbHVtblwiKTtcbiAgICB0aGlzLmNvbmZpZy5lbnVtID0gZW51bUluc3RhbmNlO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFBnRW51bUNvbHVtbihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBQZ0VudW1Db2x1bW4gZXh0ZW5kcyBQZ0NvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnRW51bUNvbHVtblwiO1xuICBlbnVtID0gdGhpcy5jb25maWcuZW51bTtcbiAgZW51bVZhbHVlcyA9IHRoaXMuY29uZmlnLmVudW0uZW51bVZhbHVlcztcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICAgIHRoaXMuZW51bSA9IGNvbmZpZy5lbnVtO1xuICB9XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW51bS5lbnVtTmFtZTtcbiAgfVxufVxuZnVuY3Rpb24gcGdFbnVtKGVudW1OYW1lLCBpbnB1dCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBwZ0VudW1XaXRoU2NoZW1hKGVudW1OYW1lLCBbLi4uaW5wdXRdLCB2b2lkIDApIDogcGdFbnVtT2JqZWN0V2l0aFNjaGVtYShlbnVtTmFtZSwgaW5wdXQsIHZvaWQgMCk7XG59XG5mdW5jdGlvbiBwZ0VudW1XaXRoU2NoZW1hKGVudW1OYW1lLCB2YWx1ZXMsIHNjaGVtYSkge1xuICBjb25zdCBlbnVtSW5zdGFuY2UgPSBPYmplY3QuYXNzaWduKFxuICAgIChuYW1lKSA9PiBuZXcgUGdFbnVtQ29sdW1uQnVpbGRlcihuYW1lID8/IFwiXCIsIGVudW1JbnN0YW5jZSksXG4gICAge1xuICAgICAgZW51bU5hbWUsXG4gICAgICBlbnVtVmFsdWVzOiB2YWx1ZXMsXG4gICAgICBzY2hlbWEsXG4gICAgICBbaXNQZ0VudW1TeW1dOiB0cnVlXG4gICAgfVxuICApO1xuICByZXR1cm4gZW51bUluc3RhbmNlO1xufVxuZnVuY3Rpb24gcGdFbnVtT2JqZWN0V2l0aFNjaGVtYShlbnVtTmFtZSwgdmFsdWVzLCBzY2hlbWEpIHtcbiAgY29uc3QgZW51bUluc3RhbmNlID0gT2JqZWN0LmFzc2lnbihcbiAgICAobmFtZSkgPT4gbmV3IFBnRW51bU9iamVjdENvbHVtbkJ1aWxkZXIobmFtZSA/PyBcIlwiLCBlbnVtSW5zdGFuY2UpLFxuICAgIHtcbiAgICAgIGVudW1OYW1lLFxuICAgICAgZW51bVZhbHVlczogT2JqZWN0LnZhbHVlcyh2YWx1ZXMpLFxuICAgICAgc2NoZW1hLFxuICAgICAgW2lzUGdFbnVtU3ltXTogdHJ1ZVxuICAgIH1cbiAgKTtcbiAgcmV0dXJuIGVudW1JbnN0YW5jZTtcbn1cbmV4cG9ydCB7XG4gIFBnRW51bUNvbHVtbixcbiAgUGdFbnVtQ29sdW1uQnVpbGRlcixcbiAgUGdFbnVtT2JqZWN0Q29sdW1uLFxuICBQZ0VudW1PYmplY3RDb2x1bW5CdWlsZGVyLFxuICBpc1BnRW51bSxcbiAgcGdFbnVtLFxuICBwZ0VudW1PYmplY3RXaXRoU2NoZW1hLFxuICBwZ0VudW1XaXRoU2NoZW1hXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW51bS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIFN1YnF1ZXJ5IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU3VicXVlcnlcIjtcbiAgY29uc3RydWN0b3Ioc3FsLCBmaWVsZHMsIGFsaWFzLCBpc1dpdGggPSBmYWxzZSwgdXNlZFRhYmxlcyA9IFtdKSB7XG4gICAgdGhpcy5fID0ge1xuICAgICAgYnJhbmQ6IFwiU3VicXVlcnlcIixcbiAgICAgIHNxbCxcbiAgICAgIHNlbGVjdGVkRmllbGRzOiBmaWVsZHMsXG4gICAgICBhbGlhcyxcbiAgICAgIGlzV2l0aCxcbiAgICAgIHVzZWRUYWJsZXNcbiAgICB9O1xuICB9XG4gIC8vIGdldFNRTCgpOiBTUUw8dW5rbm93bj4ge1xuICAvLyBcdHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG4gIC8vIH1cbn1cbmNsYXNzIFdpdGhTdWJxdWVyeSBleHRlbmRzIFN1YnF1ZXJ5IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiV2l0aFN1YnF1ZXJ5XCI7XG59XG5leHBvcnQge1xuICBTdWJxdWVyeSxcbiAgV2l0aFN1YnF1ZXJ5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3VicXVlcnkuanMubWFwIiwKICAgICIvLyBwYWNrYWdlLmpzb25cbnZhciB2ZXJzaW9uID0gXCIwLjQ0LjVcIjtcblxuLy8gc3JjL3ZlcnNpb24udHNcbnZhciBjb21wYXRpYmlsaXR5VmVyc2lvbiA9IDEwO1xuZXhwb3J0IHtcbiAgY29tcGF0aWJpbGl0eVZlcnNpb24sXG4gIHZlcnNpb24gYXMgbnBtVmVyc2lvblxufTtcbiIsCiAgICAiaW1wb3J0IHsgaWlmZSB9IGZyb20gXCIuL3RyYWNpbmctdXRpbHMuanNcIjtcbmltcG9ydCB7IG5wbVZlcnNpb24gfSBmcm9tIFwiLi92ZXJzaW9uLmpzXCI7XG5sZXQgb3RlbDtcbmxldCByYXdUcmFjZXI7XG5jb25zdCB0cmFjZXIgPSB7XG4gIHN0YXJ0QWN0aXZlU3BhbihuYW1lLCBmbikge1xuICAgIGlmICghb3RlbCkge1xuICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfVxuICAgIGlmICghcmF3VHJhY2VyKSB7XG4gICAgICByYXdUcmFjZXIgPSBvdGVsLnRyYWNlLmdldFRyYWNlcihcImRyaXp6bGUtb3JtXCIsIG5wbVZlcnNpb24pO1xuICAgIH1cbiAgICByZXR1cm4gaWlmZShcbiAgICAgIChvdGVsMiwgcmF3VHJhY2VyMikgPT4gcmF3VHJhY2VyMi5zdGFydEFjdGl2ZVNwYW4oXG4gICAgICAgIG5hbWUsXG4gICAgICAgIChzcGFuKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBmbihzcGFuKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgIGNvZGU6IG90ZWwyLlNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIlxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWluc3RhbmNlb2Yvbm8taW5zdGFuY2VvZlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKSxcbiAgICAgIG90ZWwsXG4gICAgICByYXdUcmFjZXJcbiAgICApO1xuICB9XG59O1xuZXhwb3J0IHtcbiAgdHJhY2VyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhY2luZy5qcy5tYXAiLAogICAgImNvbnN0IFZpZXdCYXNlQ29uZmlnID0gU3ltYm9sLmZvcihcImRyaXp6bGU6Vmlld0Jhc2VDb25maWdcIik7XG5leHBvcnQge1xuICBWaWV3QmFzZUNvbmZpZ1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZpZXctY29tbW9uLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGVOYW1lIH0gZnJvbSBcIi4vdGFibGUudXRpbHMuanNcIjtcbmNvbnN0IFNjaGVtYSA9IFN5bWJvbC5mb3IoXCJkcml6emxlOlNjaGVtYVwiKTtcbmNvbnN0IENvbHVtbnMgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpDb2x1bW5zXCIpO1xuY29uc3QgRXh0cmFDb25maWdDb2x1bW5zID0gU3ltYm9sLmZvcihcImRyaXp6bGU6RXh0cmFDb25maWdDb2x1bW5zXCIpO1xuY29uc3QgT3JpZ2luYWxOYW1lID0gU3ltYm9sLmZvcihcImRyaXp6bGU6T3JpZ2luYWxOYW1lXCIpO1xuY29uc3QgQmFzZU5hbWUgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpCYXNlTmFtZVwiKTtcbmNvbnN0IElzQWxpYXMgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpJc0FsaWFzXCIpO1xuY29uc3QgRXh0cmFDb25maWdCdWlsZGVyID0gU3ltYm9sLmZvcihcImRyaXp6bGU6RXh0cmFDb25maWdCdWlsZGVyXCIpO1xuY29uc3QgSXNEcml6emxlVGFibGUgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpJc0RyaXp6bGVUYWJsZVwiKTtcbmNsYXNzIFRhYmxlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiVGFibGVcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgU3ltYm9sID0ge1xuICAgIE5hbWU6IFRhYmxlTmFtZSxcbiAgICBTY2hlbWEsXG4gICAgT3JpZ2luYWxOYW1lLFxuICAgIENvbHVtbnMsXG4gICAgRXh0cmFDb25maWdDb2x1bW5zLFxuICAgIEJhc2VOYW1lLFxuICAgIElzQWxpYXMsXG4gICAgRXh0cmFDb25maWdCdWlsZGVyXG4gIH07XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQ2FuIGJlIGNoYW5nZWQgaWYgdGhlIHRhYmxlIGlzIGFsaWFzZWQuXG4gICAqL1xuICBbVGFibGVOYW1lXTtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBVc2VkIHRvIHN0b3JlIHRoZSBvcmlnaW5hbCBuYW1lIG9mIHRoZSB0YWJsZSwgYmVmb3JlIGFueSBhbGlhc2luZy5cbiAgICovXG4gIFtPcmlnaW5hbE5hbWVdO1xuICAvKiogQGludGVybmFsICovXG4gIFtTY2hlbWFdO1xuICAvKiogQGludGVybmFsICovXG4gIFtDb2x1bW5zXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbRXh0cmFDb25maWdDb2x1bW5zXTtcbiAgLyoqXG4gICAqICBAaW50ZXJuYWxcbiAgICogVXNlZCB0byBzdG9yZSB0aGUgdGFibGUgbmFtZSBiZWZvcmUgdGhlIHRyYW5zZm9ybWF0aW9uIHZpYSB0aGUgYHRhYmxlQ3JlYXRvcmAgZnVuY3Rpb25zLlxuICAgKi9cbiAgW0Jhc2VOYW1lXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbSXNBbGlhc10gPSBmYWxzZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbSXNEcml6emxlVGFibGVdID0gdHJ1ZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbRXh0cmFDb25maWdCdWlsZGVyXSA9IHZvaWQgMDtcbiAgY29uc3RydWN0b3IobmFtZSwgc2NoZW1hLCBiYXNlTmFtZSkge1xuICAgIHRoaXNbVGFibGVOYW1lXSA9IHRoaXNbT3JpZ2luYWxOYW1lXSA9IG5hbWU7XG4gICAgdGhpc1tTY2hlbWFdID0gc2NoZW1hO1xuICAgIHRoaXNbQmFzZU5hbWVdID0gYmFzZU5hbWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzVGFibGUodGFibGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0YWJsZSA9PT0gXCJvYmplY3RcIiAmJiB0YWJsZSAhPT0gbnVsbCAmJiBJc0RyaXp6bGVUYWJsZSBpbiB0YWJsZTtcbn1cbmZ1bmN0aW9uIGdldFRhYmxlTmFtZSh0YWJsZSkge1xuICByZXR1cm4gdGFibGVbVGFibGVOYW1lXTtcbn1cbmZ1bmN0aW9uIGdldFRhYmxlVW5pcXVlTmFtZSh0YWJsZSkge1xuICByZXR1cm4gYCR7dGFibGVbU2NoZW1hXSA/PyBcInB1YmxpY1wifS4ke3RhYmxlW1RhYmxlTmFtZV19YDtcbn1cbmV4cG9ydCB7XG4gIEJhc2VOYW1lLFxuICBDb2x1bW5zLFxuICBFeHRyYUNvbmZpZ0J1aWxkZXIsXG4gIEV4dHJhQ29uZmlnQ29sdW1ucyxcbiAgSXNBbGlhcyxcbiAgT3JpZ2luYWxOYW1lLFxuICBTY2hlbWEsXG4gIFRhYmxlLFxuICBnZXRUYWJsZU5hbWUsXG4gIGdldFRhYmxlVW5pcXVlTmFtZSxcbiAgaXNUYWJsZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhYmxlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBpc1BnRW51bSB9IGZyb20gXCIuLi9wZy1jb3JlL2NvbHVtbnMvZW51bS5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IHRyYWNlciB9IGZyb20gXCIuLi90cmFjaW5nLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuLi92aWV3LWNvbW1vbi5qc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgSXNBbGlhcywgVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmNsYXNzIEZha2VQcmltaXRpdmVQYXJhbSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkZha2VQcmltaXRpdmVQYXJhbVwiO1xufVxuZnVuY3Rpb24gaXNTUUxXcmFwcGVyKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwICYmIHR5cGVvZiB2YWx1ZS5nZXRTUUwgPT09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIG1lcmdlUXVlcmllcyhxdWVyaWVzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHsgc3FsOiBcIlwiLCBwYXJhbXM6IFtdIH07XG4gIGZvciAoY29uc3QgcXVlcnkgb2YgcXVlcmllcykge1xuICAgIHJlc3VsdC5zcWwgKz0gcXVlcnkuc3FsO1xuICAgIHJlc3VsdC5wYXJhbXMucHVzaCguLi5xdWVyeS5wYXJhbXMpO1xuICAgIGlmIChxdWVyeS50eXBpbmdzPy5sZW5ndGgpIHtcbiAgICAgIGlmICghcmVzdWx0LnR5cGluZ3MpIHtcbiAgICAgICAgcmVzdWx0LnR5cGluZ3MgPSBbXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC50eXBpbmdzLnB1c2goLi4ucXVlcnkudHlwaW5ncyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5jbGFzcyBTdHJpbmdDaHVuayB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlN0cmluZ0NodW5rXCI7XG4gIHZhbHVlO1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHRoaXMudmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgfVxuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbiAgfVxufVxuY2xhc3MgU1FMIHtcbiAgY29uc3RydWN0b3IocXVlcnlDaHVua3MpIHtcbiAgICB0aGlzLnF1ZXJ5Q2h1bmtzID0gcXVlcnlDaHVua3M7XG4gICAgZm9yIChjb25zdCBjaHVuayBvZiBxdWVyeUNodW5rcykge1xuICAgICAgaWYgKGlzKGNodW5rLCBUYWJsZSkpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IGNodW5rW1RhYmxlLlN5bWJvbC5TY2hlbWFdO1xuICAgICAgICB0aGlzLnVzZWRUYWJsZXMucHVzaChcbiAgICAgICAgICBzY2hlbWFOYW1lID09PSB2b2lkIDAgPyBjaHVua1tUYWJsZS5TeW1ib2wuTmFtZV0gOiBzY2hlbWFOYW1lICsgXCIuXCIgKyBjaHVua1tUYWJsZS5TeW1ib2wuTmFtZV1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZGVjb2RlciA9IG5vb3BEZWNvZGVyO1xuICBzaG91bGRJbmxpbmVQYXJhbXMgPSBmYWxzZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICB1c2VkVGFibGVzID0gW107XG4gIGFwcGVuZChxdWVyeSkge1xuICAgIHRoaXMucXVlcnlDaHVua3MucHVzaCguLi5xdWVyeS5xdWVyeUNodW5rcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdG9RdWVyeShjb25maWcpIHtcbiAgICByZXR1cm4gdHJhY2VyLnN0YXJ0QWN0aXZlU3BhbihcImRyaXp6bGUuYnVpbGRTUUxcIiwgKHNwYW4pID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyh0aGlzLnF1ZXJ5Q2h1bmtzLCBjb25maWcpO1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIFwiZHJpenpsZS5xdWVyeS50ZXh0XCI6IHF1ZXJ5LnNxbCxcbiAgICAgICAgXCJkcml6emxlLnF1ZXJ5LnBhcmFtc1wiOiBKU09OLnN0cmluZ2lmeShxdWVyeS5wYXJhbXMpXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBxdWVyeTtcbiAgICB9KTtcbiAgfVxuICBidWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhjaHVua3MsIF9jb25maWcpIHtcbiAgICBjb25zdCBjb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBfY29uZmlnLCB7XG4gICAgICBpbmxpbmVQYXJhbXM6IF9jb25maWcuaW5saW5lUGFyYW1zIHx8IHRoaXMuc2hvdWxkSW5saW5lUGFyYW1zLFxuICAgICAgcGFyYW1TdGFydEluZGV4OiBfY29uZmlnLnBhcmFtU3RhcnRJbmRleCB8fCB7IHZhbHVlOiAwIH1cbiAgICB9KTtcbiAgICBjb25zdCB7XG4gICAgICBjYXNpbmcsXG4gICAgICBlc2NhcGVOYW1lLFxuICAgICAgZXNjYXBlUGFyYW0sXG4gICAgICBwcmVwYXJlVHlwaW5nLFxuICAgICAgaW5saW5lUGFyYW1zLFxuICAgICAgcGFyYW1TdGFydEluZGV4XG4gICAgfSA9IGNvbmZpZztcbiAgICByZXR1cm4gbWVyZ2VRdWVyaWVzKGNodW5rcy5tYXAoKGNodW5rKSA9PiB7XG4gICAgICBpZiAoaXMoY2h1bmssIFN0cmluZ0NodW5rKSkge1xuICAgICAgICByZXR1cm4geyBzcWw6IGNodW5rLnZhbHVlLmpvaW4oXCJcIiksIHBhcmFtczogW10gfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVOYW1lKGNodW5rLnZhbHVlKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgfVxuICAgICAgaWYgKGNodW5rID09PSB2b2lkIDApIHtcbiAgICAgICAgcmV0dXJuIHsgc3FsOiBcIlwiLCBwYXJhbXM6IFtdIH07XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaHVuaykpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW25ldyBTdHJpbmdDaHVuayhcIihcIildO1xuICAgICAgICBmb3IgKGNvbnN0IFtpLCBwXSBvZiBjaHVuay5lbnRyaWVzKCkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChwKTtcbiAgICAgICAgICBpZiAoaSA8IGNodW5rLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBTdHJpbmdDaHVuayhcIiwgXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2gobmV3IFN0cmluZ0NodW5rKFwiKVwiKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKHJlc3VsdCwgY29uZmlnKTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgU1FMKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhjaHVuay5xdWVyeUNodW5rcywge1xuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICBpbmxpbmVQYXJhbXM6IGlubGluZVBhcmFtcyB8fCBjaHVuay5zaG91bGRJbmxpbmVQYXJhbXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFRhYmxlKSkge1xuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gY2h1bmtbVGFibGUuU3ltYm9sLlNjaGVtYV07XG4gICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGNodW5rW1RhYmxlLlN5bWJvbC5OYW1lXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzcWw6IHNjaGVtYU5hbWUgPT09IHZvaWQgMCB8fCBjaHVua1tJc0FsaWFzXSA/IGVzY2FwZU5hbWUodGFibGVOYW1lKSA6IGVzY2FwZU5hbWUoc2NoZW1hTmFtZSkgKyBcIi5cIiArIGVzY2FwZU5hbWUodGFibGVOYW1lKSxcbiAgICAgICAgICBwYXJhbXM6IFtdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIENvbHVtbikpIHtcbiAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IGNhc2luZy5nZXRDb2x1bW5DYXNpbmcoY2h1bmspO1xuICAgICAgICBpZiAoX2NvbmZpZy5pbnZva2VTb3VyY2UgPT09IFwiaW5kZXhlc1wiKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVOYW1lKGNvbHVtbk5hbWUpLCBwYXJhbXM6IFtdIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IGNodW5rLnRhYmxlW1RhYmxlLlN5bWJvbC5TY2hlbWFdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNxbDogY2h1bmsudGFibGVbSXNBbGlhc10gfHwgc2NoZW1hTmFtZSA9PT0gdm9pZCAwID8gZXNjYXBlTmFtZShjaHVuay50YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV0pICsgXCIuXCIgKyBlc2NhcGVOYW1lKGNvbHVtbk5hbWUpIDogZXNjYXBlTmFtZShzY2hlbWFOYW1lKSArIFwiLlwiICsgZXNjYXBlTmFtZShjaHVuay50YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV0pICsgXCIuXCIgKyBlc2NhcGVOYW1lKGNvbHVtbk5hbWUpLFxuICAgICAgICAgIHBhcmFtczogW11cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgVmlldykpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IGNodW5rW1ZpZXdCYXNlQ29uZmlnXS5zY2hlbWE7XG4gICAgICAgIGNvbnN0IHZpZXdOYW1lID0gY2h1bmtbVmlld0Jhc2VDb25maWddLm5hbWU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3FsOiBzY2hlbWFOYW1lID09PSB2b2lkIDAgfHwgY2h1bmtbVmlld0Jhc2VDb25maWddLmlzQWxpYXMgPyBlc2NhcGVOYW1lKHZpZXdOYW1lKSA6IGVzY2FwZU5hbWUoc2NoZW1hTmFtZSkgKyBcIi5cIiArIGVzY2FwZU5hbWUodmlld05hbWUpLFxuICAgICAgICAgIHBhcmFtczogW11cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgUGFyYW0pKSB7XG4gICAgICAgIGlmIChpcyhjaHVuay52YWx1ZSwgUGxhY2Vob2xkZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVQYXJhbShwYXJhbVN0YXJ0SW5kZXgudmFsdWUrKywgY2h1bmspLCBwYXJhbXM6IFtjaHVua10sIHR5cGluZ3M6IFtcIm5vbmVcIl0gfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXBwZWRWYWx1ZSA9IGNodW5rLnZhbHVlID09PSBudWxsID8gbnVsbCA6IGNodW5rLmVuY29kZXIubWFwVG9Ecml2ZXJWYWx1ZShjaHVuay52YWx1ZSk7XG4gICAgICAgIGlmIChpcyhtYXBwZWRWYWx1ZSwgU1FMKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKFttYXBwZWRWYWx1ZV0sIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlubGluZVBhcmFtcykge1xuICAgICAgICAgIHJldHVybiB7IHNxbDogdGhpcy5tYXBJbmxpbmVQYXJhbShtYXBwZWRWYWx1ZSwgY29uZmlnKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBpbmdzID0gW1wibm9uZVwiXTtcbiAgICAgICAgaWYgKHByZXBhcmVUeXBpbmcpIHtcbiAgICAgICAgICB0eXBpbmdzID0gW3ByZXBhcmVUeXBpbmcoY2h1bmsuZW5jb2RlcildO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlUGFyYW0ocGFyYW1TdGFydEluZGV4LnZhbHVlKyssIG1hcHBlZFZhbHVlKSwgcGFyYW1zOiBbbWFwcGVkVmFsdWVdLCB0eXBpbmdzIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFBsYWNlaG9sZGVyKSkge1xuICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZVBhcmFtKHBhcmFtU3RhcnRJbmRleC52YWx1ZSsrLCBjaHVuayksIHBhcmFtczogW2NodW5rXSwgdHlwaW5nczogW1wibm9uZVwiXSB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBTUUwuQWxpYXNlZCkgJiYgY2h1bmsuZmllbGRBbGlhcyAhPT0gdm9pZCAwKSB7XG4gICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjaHVuay5maWVsZEFsaWFzKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBTdWJxdWVyeSkpIHtcbiAgICAgICAgaWYgKGNodW5rLl8uaXNXaXRoKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVOYW1lKGNodW5rLl8uYWxpYXMpLCBwYXJhbXM6IFtdIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMoW1xuICAgICAgICAgIG5ldyBTdHJpbmdDaHVuayhcIihcIiksXG4gICAgICAgICAgY2h1bmsuXy5zcWwsXG4gICAgICAgICAgbmV3IFN0cmluZ0NodW5rKFwiKSBcIiksXG4gICAgICAgICAgbmV3IE5hbWUoY2h1bmsuXy5hbGlhcylcbiAgICAgICAgXSwgY29uZmlnKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1BnRW51bShjaHVuaykpIHtcbiAgICAgICAgaWYgKGNodW5rLnNjaGVtYSkge1xuICAgICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjaHVuay5zY2hlbWEpICsgXCIuXCIgKyBlc2NhcGVOYW1lKGNodW5rLmVudW1OYW1lKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjaHVuay5lbnVtTmFtZSksIHBhcmFtczogW10gfTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1NRTFdyYXBwZXIoY2h1bmspKSB7XG4gICAgICAgIGlmIChjaHVuay5zaG91bGRPbWl0U1FMUGFyZW5zPy4oKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKFtjaHVuay5nZXRTUUwoKV0sIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMoW1xuICAgICAgICAgIG5ldyBTdHJpbmdDaHVuayhcIihcIiksXG4gICAgICAgICAgY2h1bmsuZ2V0U1FMKCksXG4gICAgICAgICAgbmV3IFN0cmluZ0NodW5rKFwiKVwiKVxuICAgICAgICBdLCBjb25maWcpO1xuICAgICAgfVxuICAgICAgaWYgKGlubGluZVBhcmFtcykge1xuICAgICAgICByZXR1cm4geyBzcWw6IHRoaXMubWFwSW5saW5lUGFyYW0oY2h1bmssIGNvbmZpZyksIHBhcmFtczogW10gfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlUGFyYW0ocGFyYW1TdGFydEluZGV4LnZhbHVlKyssIGNodW5rKSwgcGFyYW1zOiBbY2h1bmtdLCB0eXBpbmdzOiBbXCJub25lXCJdIH07XG4gICAgfSkpO1xuICB9XG4gIG1hcElubGluZVBhcmFtKGNodW5rLCB7IGVzY2FwZVN0cmluZyB9KSB7XG4gICAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIGNodW5rID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIGNodW5rLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBlc2NhcGVTdHJpbmcoY2h1bmspO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNodW5rID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBtYXBwZWRWYWx1ZUFzU3RyaW5nID0gY2h1bmsudG9TdHJpbmcoKTtcbiAgICAgIGlmIChtYXBwZWRWYWx1ZUFzU3RyaW5nID09PSBcIltvYmplY3QgT2JqZWN0XVwiKSB7XG4gICAgICAgIHJldHVybiBlc2NhcGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkoY2h1bmspKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlc2NhcGVTdHJpbmcobWFwcGVkVmFsdWVBc1N0cmluZyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgcGFyYW0gdmFsdWU6IFwiICsgY2h1bmspO1xuICB9XG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBhcyhhbGlhcykge1xuICAgIGlmIChhbGlhcyA9PT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTUUwuQWxpYXNlZCh0aGlzLCBhbGlhcyk7XG4gIH1cbiAgbWFwV2l0aChkZWNvZGVyKSB7XG4gICAgdGhpcy5kZWNvZGVyID0gdHlwZW9mIGRlY29kZXIgPT09IFwiZnVuY3Rpb25cIiA/IHsgbWFwRnJvbURyaXZlclZhbHVlOiBkZWNvZGVyIH0gOiBkZWNvZGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGlubGluZVBhcmFtcygpIHtcbiAgICB0aGlzLnNob3VsZElubGluZVBhcmFtcyA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY29uZGl0aW9uYWxseSBpbmNsdWRlIGEgcGFydCBvZiB0aGUgcXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSBjb25kaXRpb24gLSBDb25kaXRpb24gdG8gY2hlY2tcbiAgICogQHJldHVybnMgaXRzZWxmIGlmIHRoZSBjb25kaXRpb24gaXMgYHRydWVgLCBvdGhlcndpc2UgYHVuZGVmaW5lZGBcbiAgICovXG4gIGlmKGNvbmRpdGlvbikge1xuICAgIHJldHVybiBjb25kaXRpb24gPyB0aGlzIDogdm9pZCAwO1xuICB9XG59XG5jbGFzcyBOYW1lIHtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiTmFtZVwiO1xuICBicmFuZDtcbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5hbWUodmFsdWUpIHtcbiAgcmV0dXJuIG5ldyBOYW1lKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGlzRHJpdmVyVmFsdWVFbmNvZGVyKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgXCJtYXBUb0RyaXZlclZhbHVlXCIgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLm1hcFRvRHJpdmVyVmFsdWUgPT09IFwiZnVuY3Rpb25cIjtcbn1cbmNvbnN0IG5vb3BEZWNvZGVyID0ge1xuICBtYXBGcm9tRHJpdmVyVmFsdWU6ICh2YWx1ZSkgPT4gdmFsdWVcbn07XG5jb25zdCBub29wRW5jb2RlciA9IHtcbiAgbWFwVG9Ecml2ZXJWYWx1ZTogKHZhbHVlKSA9PiB2YWx1ZVxufTtcbmNvbnN0IG5vb3BNYXBwZXIgPSB7XG4gIC4uLm5vb3BEZWNvZGVyLFxuICAuLi5ub29wRW5jb2RlclxufTtcbmNsYXNzIFBhcmFtIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFBhcmFtZXRlciB2YWx1ZVxuICAgKiBAcGFyYW0gZW5jb2RlciAtIEVuY29kZXIgdG8gY29udmVydCB0aGUgdmFsdWUgdG8gYSBkcml2ZXIgcGFyYW1ldGVyXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSwgZW5jb2RlciA9IG5vb3BFbmNvZGVyKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuZW5jb2RlciA9IGVuY29kZXI7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGFyYW1cIjtcbiAgYnJhbmQ7XG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xuICB9XG59XG5mdW5jdGlvbiBwYXJhbSh2YWx1ZSwgZW5jb2Rlcikge1xuICByZXR1cm4gbmV3IFBhcmFtKHZhbHVlLCBlbmNvZGVyKTtcbn1cbmZ1bmN0aW9uIHNxbChzdHJpbmdzLCAuLi5wYXJhbXMpIHtcbiAgY29uc3QgcXVlcnlDaHVua3MgPSBbXTtcbiAgaWYgKHBhcmFtcy5sZW5ndGggPiAwIHx8IHN0cmluZ3MubGVuZ3RoID4gMCAmJiBzdHJpbmdzWzBdICE9PSBcIlwiKSB7XG4gICAgcXVlcnlDaHVua3MucHVzaChuZXcgU3RyaW5nQ2h1bmsoc3RyaW5nc1swXSkpO1xuICB9XG4gIGZvciAoY29uc3QgW3BhcmFtSW5kZXgsIHBhcmFtMl0gb2YgcGFyYW1zLmVudHJpZXMoKSkge1xuICAgIHF1ZXJ5Q2h1bmtzLnB1c2gocGFyYW0yLCBuZXcgU3RyaW5nQ2h1bmsoc3RyaW5nc1twYXJhbUluZGV4ICsgMV0pKTtcbiAgfVxuICByZXR1cm4gbmV3IFNRTChxdWVyeUNodW5rcyk7XG59XG4oKHNxbDIpID0+IHtcbiAgZnVuY3Rpb24gZW1wdHkoKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW10pO1xuICB9XG4gIHNxbDIuZW1wdHkgPSBlbXB0eTtcbiAgZnVuY3Rpb24gZnJvbUxpc3QobGlzdCkge1xuICAgIHJldHVybiBuZXcgU1FMKGxpc3QpO1xuICB9XG4gIHNxbDIuZnJvbUxpc3QgPSBmcm9tTGlzdDtcbiAgZnVuY3Rpb24gcmF3KHN0cikge1xuICAgIHJldHVybiBuZXcgU1FMKFtuZXcgU3RyaW5nQ2h1bmsoc3RyKV0pO1xuICB9XG4gIHNxbDIucmF3ID0gcmF3O1xuICBmdW5jdGlvbiBqb2luKGNodW5rcywgc2VwYXJhdG9yKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChjb25zdCBbaSwgY2h1bmtdIG9mIGNodW5rcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChpID4gMCAmJiBzZXBhcmF0b3IgIT09IHZvaWQgMCkge1xuICAgICAgICByZXN1bHQucHVzaChzZXBhcmF0b3IpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goY2h1bmspO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNRTChyZXN1bHQpO1xuICB9XG4gIHNxbDIuam9pbiA9IGpvaW47XG4gIGZ1bmN0aW9uIGlkZW50aWZpZXIodmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IE5hbWUodmFsdWUpO1xuICB9XG4gIHNxbDIuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gIGZ1bmN0aW9uIHBsYWNlaG9sZGVyMihuYW1lMikge1xuICAgIHJldHVybiBuZXcgUGxhY2Vob2xkZXIobmFtZTIpO1xuICB9XG4gIHNxbDIucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjI7XG4gIGZ1bmN0aW9uIHBhcmFtMih2YWx1ZSwgZW5jb2Rlcikge1xuICAgIHJldHVybiBuZXcgUGFyYW0odmFsdWUsIGVuY29kZXIpO1xuICB9XG4gIHNxbDIucGFyYW0gPSBwYXJhbTI7XG59KShzcWwgfHwgKHNxbCA9IHt9KSk7XG4oKFNRTDIpID0+IHtcbiAgY2xhc3MgQWxpYXNlZCB7XG4gICAgY29uc3RydWN0b3Ioc3FsMiwgZmllbGRBbGlhcykge1xuICAgICAgdGhpcy5zcWwgPSBzcWwyO1xuICAgICAgdGhpcy5maWVsZEFsaWFzID0gZmllbGRBbGlhcztcbiAgICB9XG4gICAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMLkFsaWFzZWRcIjtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgaXNTZWxlY3Rpb25GaWVsZCA9IGZhbHNlO1xuICAgIGdldFNRTCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNxbDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGNsb25lKCkge1xuICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkKHRoaXMuc3FsLCB0aGlzLmZpZWxkQWxpYXMpO1xuICAgIH1cbiAgfVxuICBTUUwyLkFsaWFzZWQgPSBBbGlhc2VkO1xufSkoU1FMIHx8IChTUUwgPSB7fSkpO1xuY2xhc3MgUGxhY2Vob2xkZXIge1xuICBjb25zdHJ1Y3RvcihuYW1lMikge1xuICAgIHRoaXMubmFtZSA9IG5hbWUyO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBsYWNlaG9sZGVyXCI7XG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xuICB9XG59XG5mdW5jdGlvbiBwbGFjZWhvbGRlcihuYW1lMikge1xuICByZXR1cm4gbmV3IFBsYWNlaG9sZGVyKG5hbWUyKTtcbn1cbmZ1bmN0aW9uIGZpbGxQbGFjZWhvbGRlcnMocGFyYW1zLCB2YWx1ZXMpIHtcbiAgcmV0dXJuIHBhcmFtcy5tYXAoKHApID0+IHtcbiAgICBpZiAoaXMocCwgUGxhY2Vob2xkZXIpKSB7XG4gICAgICBpZiAoIShwLm5hbWUgaW4gdmFsdWVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHZhbHVlIGZvciBwbGFjZWhvbGRlciBcIiR7cC5uYW1lfVwiIHdhcyBwcm92aWRlZGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlc1twLm5hbWVdO1xuICAgIH1cbiAgICBpZiAoaXMocCwgUGFyYW0pICYmIGlzKHAudmFsdWUsIFBsYWNlaG9sZGVyKSkge1xuICAgICAgaWYgKCEocC52YWx1ZS5uYW1lIGluIHZhbHVlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB2YWx1ZSBmb3IgcGxhY2Vob2xkZXIgXCIke3AudmFsdWUubmFtZX1cIiB3YXMgcHJvdmlkZWRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwLmVuY29kZXIubWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZXNbcC52YWx1ZS5uYW1lXSk7XG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9KTtcbn1cbmNvbnN0IElzRHJpenpsZVZpZXcgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpJc0RyaXp6bGVWaWV3XCIpO1xuY2xhc3MgVmlldyB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlZpZXdcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbVmlld0Jhc2VDb25maWddO1xuICAvKiogQGludGVybmFsICovXG4gIFtJc0RyaXp6bGVWaWV3XSA9IHRydWU7XG4gIGNvbnN0cnVjdG9yKHsgbmFtZTogbmFtZTIsIHNjaGVtYSwgc2VsZWN0ZWRGaWVsZHMsIHF1ZXJ5IH0pIHtcbiAgICB0aGlzW1ZpZXdCYXNlQ29uZmlnXSA9IHtcbiAgICAgIG5hbWU6IG5hbWUyLFxuICAgICAgb3JpZ2luYWxOYW1lOiBuYW1lMixcbiAgICAgIHNjaGVtYSxcbiAgICAgIHNlbGVjdGVkRmllbGRzLFxuICAgICAgcXVlcnksXG4gICAgICBpc0V4aXN0aW5nOiAhcXVlcnksXG4gICAgICBpc0FsaWFzOiBmYWxzZVxuICAgIH07XG4gIH1cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzVmlldyh2aWV3KSB7XG4gIHJldHVybiB0eXBlb2YgdmlldyA9PT0gXCJvYmplY3RcIiAmJiB2aWV3ICE9PSBudWxsICYmIElzRHJpenpsZVZpZXcgaW4gdmlldztcbn1cbmZ1bmN0aW9uIGdldFZpZXdOYW1lKHZpZXcpIHtcbiAgcmV0dXJuIHZpZXdbVmlld0Jhc2VDb25maWddLm5hbWU7XG59XG5Db2x1bW4ucHJvdG90eXBlLmdldFNRTCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xufTtcblRhYmxlLnByb3RvdHlwZS5nZXRTUUwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbn07XG5TdWJxdWVyeS5wcm90b3R5cGUuZ2V0U1FMID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG59O1xuZXhwb3J0IHtcbiAgRmFrZVByaW1pdGl2ZVBhcmFtLFxuICBOYW1lLFxuICBQYXJhbSxcbiAgUGxhY2Vob2xkZXIsXG4gIFNRTCxcbiAgU3RyaW5nQ2h1bmssXG4gIFZpZXcsXG4gIGZpbGxQbGFjZWhvbGRlcnMsXG4gIGdldFZpZXdOYW1lLFxuICBpc0RyaXZlclZhbHVlRW5jb2RlcixcbiAgaXNTUUxXcmFwcGVyLFxuICBpc1ZpZXcsXG4gIG5hbWUsXG4gIG5vb3BEZWNvZGVyLFxuICBub29wRW5jb2RlcixcbiAgbm9vcE1hcHBlcixcbiAgcGFyYW0sXG4gIHBsYWNlaG9sZGVyLFxuICBzcWxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcWwuanMubWFwIiwKICAgICJpbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTUUwsIHNxbCB9IGZyb20gXCIuL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4vdmlldy1jb21tb24uanNcIjtcbmNsYXNzIENvbHVtbkFsaWFzUHJveHlIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IodGFibGUpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQ29sdW1uQWxpYXNQcm94eUhhbmRsZXJcIjtcbiAgZ2V0KGNvbHVtbk9iaiwgcHJvcCkge1xuICAgIGlmIChwcm9wID09PSBcInRhYmxlXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnRhYmxlO1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uT2JqW3Byb3BdO1xuICB9XG59XG5jbGFzcyBUYWJsZUFsaWFzUHJveHlIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IoYWxpYXMsIHJlcGxhY2VPcmlnaW5hbE5hbWUpIHtcbiAgICB0aGlzLmFsaWFzID0gYWxpYXM7XG4gICAgdGhpcy5yZXBsYWNlT3JpZ2luYWxOYW1lID0gcmVwbGFjZU9yaWdpbmFsTmFtZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJUYWJsZUFsaWFzUHJveHlIYW5kbGVyXCI7XG4gIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICBpZiAocHJvcCA9PT0gVGFibGUuU3ltYm9sLklzQWxpYXMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocHJvcCA9PT0gVGFibGUuU3ltYm9sLk5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmFsaWFzO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZXBsYWNlT3JpZ2luYWxOYW1lICYmIHByb3AgPT09IFRhYmxlLlN5bWJvbC5PcmlnaW5hbE5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmFsaWFzO1xuICAgIH1cbiAgICBpZiAocHJvcCA9PT0gVmlld0Jhc2VDb25maWcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRhcmdldFtWaWV3QmFzZUNvbmZpZ10sXG4gICAgICAgIG5hbWU6IHRoaXMuYWxpYXMsXG4gICAgICAgIGlzQWxpYXM6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChwcm9wID09PSBUYWJsZS5TeW1ib2wuQ29sdW1ucykge1xuICAgICAgY29uc3QgY29sdW1ucyA9IHRhcmdldFtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG4gICAgICBpZiAoIWNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgICB9XG4gICAgICBjb25zdCBwcm94aWVkQ29sdW1ucyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMoY29sdW1ucykubWFwKChrZXkpID0+IHtcbiAgICAgICAgcHJveGllZENvbHVtbnNba2V5XSA9IG5ldyBQcm94eShcbiAgICAgICAgICBjb2x1bW5zW2tleV0sXG4gICAgICAgICAgbmV3IENvbHVtbkFsaWFzUHJveHlIYW5kbGVyKG5ldyBQcm94eSh0YXJnZXQsIHRoaXMpKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcHJveGllZENvbHVtbnM7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0W3Byb3BdO1xuICAgIGlmIChpcyh2YWx1ZSwgQ29sdW1uKSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm94eSh2YWx1ZSwgbmV3IENvbHVtbkFsaWFzUHJveHlIYW5kbGVyKG5ldyBQcm94eSh0YXJnZXQsIHRoaXMpKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuY2xhc3MgUmVsYXRpb25UYWJsZUFsaWFzUHJveHlIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IoYWxpYXMpIHtcbiAgICB0aGlzLmFsaWFzID0gYWxpYXM7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUmVsYXRpb25UYWJsZUFsaWFzUHJveHlIYW5kbGVyXCI7XG4gIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICBpZiAocHJvcCA9PT0gXCJzb3VyY2VUYWJsZVwiKSB7XG4gICAgICByZXR1cm4gYWxpYXNlZFRhYmxlKHRhcmdldC5zb3VyY2VUYWJsZSwgdGhpcy5hbGlhcyk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gIH1cbn1cbmZ1bmN0aW9uIGFsaWFzZWRUYWJsZSh0YWJsZSwgdGFibGVBbGlhcykge1xuICByZXR1cm4gbmV3IFByb3h5KHRhYmxlLCBuZXcgVGFibGVBbGlhc1Byb3h5SGFuZGxlcih0YWJsZUFsaWFzLCBmYWxzZSkpO1xufVxuZnVuY3Rpb24gYWxpYXNlZFJlbGF0aW9uKHJlbGF0aW9uLCB0YWJsZUFsaWFzKSB7XG4gIHJldHVybiBuZXcgUHJveHkocmVsYXRpb24sIG5ldyBSZWxhdGlvblRhYmxlQWxpYXNQcm94eUhhbmRsZXIodGFibGVBbGlhcykpO1xufVxuZnVuY3Rpb24gYWxpYXNlZFRhYmxlQ29sdW1uKGNvbHVtbiwgdGFibGVBbGlhcykge1xuICByZXR1cm4gbmV3IFByb3h5KFxuICAgIGNvbHVtbixcbiAgICBuZXcgQ29sdW1uQWxpYXNQcm94eUhhbmRsZXIobmV3IFByb3h5KGNvbHVtbi50YWJsZSwgbmV3IFRhYmxlQWxpYXNQcm94eUhhbmRsZXIodGFibGVBbGlhcywgZmFsc2UpKSlcbiAgKTtcbn1cbmZ1bmN0aW9uIG1hcENvbHVtbnNJbkFsaWFzZWRTUUxUb0FsaWFzKHF1ZXJ5LCBhbGlhcykge1xuICByZXR1cm4gbmV3IFNRTC5BbGlhc2VkKG1hcENvbHVtbnNJblNRTFRvQWxpYXMocXVlcnkuc3FsLCBhbGlhcyksIHF1ZXJ5LmZpZWxkQWxpYXMpO1xufVxuZnVuY3Rpb24gbWFwQ29sdW1uc0luU1FMVG9BbGlhcyhxdWVyeSwgYWxpYXMpIHtcbiAgcmV0dXJuIHNxbC5qb2luKHF1ZXJ5LnF1ZXJ5Q2h1bmtzLm1hcCgoYykgPT4ge1xuICAgIGlmIChpcyhjLCBDb2x1bW4pKSB7XG4gICAgICByZXR1cm4gYWxpYXNlZFRhYmxlQ29sdW1uKGMsIGFsaWFzKTtcbiAgICB9XG4gICAgaWYgKGlzKGMsIFNRTCkpIHtcbiAgICAgIHJldHVybiBtYXBDb2x1bW5zSW5TUUxUb0FsaWFzKGMsIGFsaWFzKTtcbiAgICB9XG4gICAgaWYgKGlzKGMsIFNRTC5BbGlhc2VkKSkge1xuICAgICAgcmV0dXJuIG1hcENvbHVtbnNJbkFsaWFzZWRTUUxUb0FsaWFzKGMsIGFsaWFzKTtcbiAgICB9XG4gICAgcmV0dXJuIGM7XG4gIH0pKTtcbn1cbmV4cG9ydCB7XG4gIENvbHVtbkFsaWFzUHJveHlIYW5kbGVyLFxuICBSZWxhdGlvblRhYmxlQWxpYXNQcm94eUhhbmRsZXIsXG4gIFRhYmxlQWxpYXNQcm94eUhhbmRsZXIsXG4gIGFsaWFzZWRSZWxhdGlvbixcbiAgYWxpYXNlZFRhYmxlLFxuICBhbGlhc2VkVGFibGVDb2x1bW4sXG4gIG1hcENvbHVtbnNJbkFsaWFzZWRTUUxUb0FsaWFzLFxuICBtYXBDb2x1bW5zSW5TUUxUb0FsaWFzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWxpYXMuanMubWFwIiwKICAgICJpbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGlzIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBQYXJhbSwgU1FMLCBWaWV3IH0gZnJvbSBcIi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgZ2V0VGFibGVOYW1lLCBUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuL3ZpZXctY29tbW9uLmpzXCI7XG5mdW5jdGlvbiBtYXBSZXN1bHRSb3coY29sdW1ucywgcm93LCBqb2luc05vdE51bGxhYmxlTWFwKSB7XG4gIGNvbnN0IG51bGxpZnlNYXAgPSB7fTtcbiAgY29uc3QgcmVzdWx0ID0gY29sdW1ucy5yZWR1Y2UoXG4gICAgKHJlc3VsdDIsIHsgcGF0aCwgZmllbGQgfSwgY29sdW1uSW5kZXgpID0+IHtcbiAgICAgIGxldCBkZWNvZGVyO1xuICAgICAgaWYgKGlzKGZpZWxkLCBDb2x1bW4pKSB7XG4gICAgICAgIGRlY29kZXIgPSBmaWVsZDtcbiAgICAgIH0gZWxzZSBpZiAoaXMoZmllbGQsIFNRTCkpIHtcbiAgICAgICAgZGVjb2RlciA9IGZpZWxkLmRlY29kZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvZGVyID0gZmllbGQuc3FsLmRlY29kZXI7XG4gICAgICB9XG4gICAgICBsZXQgbm9kZSA9IHJlc3VsdDI7XG4gICAgICBmb3IgKGNvbnN0IFtwYXRoQ2h1bmtJbmRleCwgcGF0aENodW5rXSBvZiBwYXRoLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAocGF0aENodW5rSW5kZXggPCBwYXRoLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBpZiAoIShwYXRoQ2h1bmsgaW4gbm9kZSkpIHtcbiAgICAgICAgICAgIG5vZGVbcGF0aENodW5rXSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2RlID0gbm9kZVtwYXRoQ2h1bmtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gcm93W2NvbHVtbkluZGV4XTtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5vZGVbcGF0aENodW5rXSA9IHJhd1ZhbHVlID09PSBudWxsID8gbnVsbCA6IGRlY29kZXIubWFwRnJvbURyaXZlclZhbHVlKHJhd1ZhbHVlKTtcbiAgICAgICAgICBpZiAoam9pbnNOb3ROdWxsYWJsZU1hcCAmJiBpcyhmaWVsZCwgQ29sdW1uKSAmJiBwYXRoLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0TmFtZSA9IHBhdGhbMF07XG4gICAgICAgICAgICBpZiAoIShvYmplY3ROYW1lIGluIG51bGxpZnlNYXApKSB7XG4gICAgICAgICAgICAgIG51bGxpZnlNYXBbb2JqZWN0TmFtZV0gPSB2YWx1ZSA9PT0gbnVsbCA/IGdldFRhYmxlTmFtZShmaWVsZC50YWJsZSkgOiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG51bGxpZnlNYXBbb2JqZWN0TmFtZV0gPT09IFwic3RyaW5nXCIgJiYgbnVsbGlmeU1hcFtvYmplY3ROYW1lXSAhPT0gZ2V0VGFibGVOYW1lKGZpZWxkLnRhYmxlKSkge1xuICAgICAgICAgICAgICBudWxsaWZ5TWFwW29iamVjdE5hbWVdID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0MjtcbiAgICB9LFxuICAgIHt9XG4gICk7XG4gIGlmIChqb2luc05vdE51bGxhYmxlTWFwICYmIE9iamVjdC5rZXlzKG51bGxpZnlNYXApLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IFtvYmplY3ROYW1lLCB0YWJsZU5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKG51bGxpZnlNYXApKSB7XG4gICAgICBpZiAodHlwZW9mIHRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiAham9pbnNOb3ROdWxsYWJsZU1hcFt0YWJsZU5hbWVdKSB7XG4gICAgICAgIHJlc3VsdFtvYmplY3ROYW1lXSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBvcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkcywgcGF0aFByZWZpeCkge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZmllbGRzKS5yZWR1Y2UoKHJlc3VsdCwgW25hbWUsIGZpZWxkXSkgPT4ge1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY29uc3QgbmV3UGF0aCA9IHBhdGhQcmVmaXggPyBbLi4ucGF0aFByZWZpeCwgbmFtZV0gOiBbbmFtZV07XG4gICAgaWYgKGlzKGZpZWxkLCBDb2x1bW4pIHx8IGlzKGZpZWxkLCBTUUwpIHx8IGlzKGZpZWxkLCBTUUwuQWxpYXNlZCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHsgcGF0aDogbmV3UGF0aCwgZmllbGQgfSk7XG4gICAgfSBlbHNlIGlmIChpcyhmaWVsZCwgVGFibGUpKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5vcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSwgbmV3UGF0aCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaCguLi5vcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkLCBuZXdQYXRoKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIFtdKTtcbn1cbmZ1bmN0aW9uIGhhdmVTYW1lS2V5cyhsZWZ0LCByaWdodCkge1xuICBjb25zdCBsZWZ0S2V5cyA9IE9iamVjdC5rZXlzKGxlZnQpO1xuICBjb25zdCByaWdodEtleXMgPSBPYmplY3Qua2V5cyhyaWdodCk7XG4gIGlmIChsZWZ0S2V5cy5sZW5ndGggIT09IHJpZ2h0S2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChjb25zdCBbaW5kZXgsIGtleV0gb2YgbGVmdEtleXMuZW50cmllcygpKSB7XG4gICAgaWYgKGtleSAhPT0gcmlnaHRLZXlzW2luZGV4XSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIG1hcFVwZGF0ZVNldCh0YWJsZSwgdmFsdWVzKSB7XG4gIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh2YWx1ZXMpLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdm9pZCAwKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGlmIChpcyh2YWx1ZSwgU1FMKSB8fCBpcyh2YWx1ZSwgQ29sdW1uKSkge1xuICAgICAgcmV0dXJuIFtrZXksIHZhbHVlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtrZXksIG5ldyBQYXJhbSh2YWx1ZSwgdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdW2tleV0pXTtcbiAgICB9XG4gIH0pO1xuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyB2YWx1ZXMgdG8gc2V0XCIpO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcyk7XG59XG5mdW5jdGlvbiBhcHBseU1peGlucyhiYXNlQ2xhc3MsIGV4dGVuZGVkQ2xhc3Nlcykge1xuICBmb3IgKGNvbnN0IGV4dGVuZGVkQ2xhc3Mgb2YgZXh0ZW5kZWRDbGFzc2VzKSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGV4dGVuZGVkQ2xhc3MucHJvdG90eXBlKSkge1xuICAgICAgaWYgKG5hbWUgPT09IFwiY29uc3RydWN0b3JcIikgY29udGludWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgIGJhc2VDbGFzcy5wcm90b3R5cGUsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZXh0ZW5kZWRDbGFzcy5wcm90b3R5cGUsIG5hbWUpIHx8IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZ2V0VGFibGVDb2x1bW5zKHRhYmxlKSB7XG4gIHJldHVybiB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG59XG5mdW5jdGlvbiBnZXRWaWV3U2VsZWN0ZWRGaWVsZHModmlldykge1xuICByZXR1cm4gdmlld1tWaWV3QmFzZUNvbmZpZ10uc2VsZWN0ZWRGaWVsZHM7XG59XG5mdW5jdGlvbiBnZXRUYWJsZUxpa2VOYW1lKHRhYmxlKSB7XG4gIHJldHVybiBpcyh0YWJsZSwgU3VicXVlcnkpID8gdGFibGUuXy5hbGlhcyA6IGlzKHRhYmxlLCBWaWV3KSA/IHRhYmxlW1ZpZXdCYXNlQ29uZmlnXS5uYW1lIDogaXModGFibGUsIFNRTCkgPyB2b2lkIDAgOiB0YWJsZVtUYWJsZS5TeW1ib2wuSXNBbGlhc10gPyB0YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV0gOiB0YWJsZVtUYWJsZS5TeW1ib2wuQmFzZU5hbWVdO1xufVxuZnVuY3Rpb24gZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyhhLCBiKSB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogdHlwZW9mIGEgPT09IFwic3RyaW5nXCIgJiYgYS5sZW5ndGggPiAwID8gYSA6IFwiXCIsXG4gICAgY29uZmlnOiB0eXBlb2YgYSA9PT0gXCJvYmplY3RcIiA/IGEgOiBiXG4gIH07XG59XG5jb25zdCBfID0ge307XG5jb25zdCBfXyA9IHt9O1xuZnVuY3Rpb24gaXNDb25maWcoZGF0YSkge1xuICBpZiAodHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGF0YS5jb25zdHJ1Y3Rvci5uYW1lICE9PSBcIk9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gIGlmIChcImxvZ2dlclwiIGluIGRhdGEpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGRhdGFbXCJsb2dnZXJcIl07XG4gICAgaWYgKHR5cGUgIT09IFwiYm9vbGVhblwiICYmICh0eXBlICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBkYXRhW1wibG9nZ2VyXCJdW1wibG9nUXVlcnlcIl0gIT09IFwiZnVuY3Rpb25cIikgJiYgdHlwZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChcInNjaGVtYVwiIGluIGRhdGEpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGRhdGFbXCJzY2hlbWFcIl07XG4gICAgaWYgKHR5cGUgIT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChcImNhc2luZ1wiIGluIGRhdGEpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGRhdGFbXCJjYXNpbmdcIl07XG4gICAgaWYgKHR5cGUgIT09IFwic3RyaW5nXCIgJiYgdHlwZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChcIm1vZGVcIiBpbiBkYXRhKSB7XG4gICAgaWYgKGRhdGFbXCJtb2RlXCJdICE9PSBcImRlZmF1bHRcIiB8fCBkYXRhW1wibW9kZVwiXSAhPT0gXCJwbGFuZXRzY2FsZVwiIHx8IGRhdGFbXCJtb2RlXCJdICE9PSB2b2lkIDApIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoXCJjb25uZWN0aW9uXCIgaW4gZGF0YSkge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgZGF0YVtcImNvbm5lY3Rpb25cIl07XG4gICAgaWYgKHR5cGUgIT09IFwic3RyaW5nXCIgJiYgdHlwZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKFwiY2xpZW50XCIgaW4gZGF0YSkge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgZGF0YVtcImNsaWVudFwiXTtcbiAgICBpZiAodHlwZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlICE9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5jb25zdCB0ZXh0RGVjb2RlciA9IHR5cGVvZiBUZXh0RGVjb2RlciA9PT0gXCJ1bmRlZmluZWRcIiA/IG51bGwgOiBuZXcgVGV4dERlY29kZXIoKTtcbmV4cG9ydCB7XG4gIGFwcGx5TWl4aW5zLFxuICBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnLFxuICBnZXRUYWJsZUNvbHVtbnMsXG4gIGdldFRhYmxlTGlrZU5hbWUsXG4gIGdldFZpZXdTZWxlY3RlZEZpZWxkcyxcbiAgaGF2ZVNhbWVLZXlzLFxuICBpc0NvbmZpZyxcbiAgbWFwUmVzdWx0Um93LFxuICBtYXBVcGRhdGVTZXQsXG4gIG9yZGVyU2VsZWN0ZWRGaWVsZHMsXG4gIHRleHREZWNvZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGVOYW1lIH0gZnJvbSBcIi4uL3RhYmxlLnV0aWxzLmpzXCI7XG5jbGFzcyBGb3JlaWduS2V5QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUZvcmVpZ25LZXlCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcmVmZXJlbmNlO1xuICAvKiogQGludGVybmFsICovXG4gIF9vblVwZGF0ZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfb25EZWxldGU7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZywgYWN0aW9ucykge1xuICAgIHRoaXMucmVmZXJlbmNlID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyBuYW1lLCBjb2x1bW5zLCBmb3JlaWduQ29sdW1ucyB9ID0gY29uZmlnKCk7XG4gICAgICByZXR1cm4geyBuYW1lLCBjb2x1bW5zLCBmb3JlaWduVGFibGU6IGZvcmVpZ25Db2x1bW5zWzBdLnRhYmxlLCBmb3JlaWduQ29sdW1ucyB9O1xuICAgIH07XG4gICAgaWYgKGFjdGlvbnMpIHtcbiAgICAgIHRoaXMuX29uVXBkYXRlID0gYWN0aW9ucy5vblVwZGF0ZTtcbiAgICAgIHRoaXMuX29uRGVsZXRlID0gYWN0aW9ucy5vbkRlbGV0ZTtcbiAgICB9XG4gIH1cbiAgb25VcGRhdGUoYWN0aW9uKSB7XG4gICAgdGhpcy5fb25VcGRhdGUgPSBhY3Rpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb25EZWxldGUoYWN0aW9uKSB7XG4gICAgdGhpcy5fb25EZWxldGUgPSBhY3Rpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgRm9yZWlnbktleSh0YWJsZSwgdGhpcyk7XG4gIH1cbn1cbmNsYXNzIEZvcmVpZ25LZXkge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgYnVpbGRlcikge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnJlZmVyZW5jZSA9IGJ1aWxkZXIucmVmZXJlbmNlO1xuICAgIHRoaXMub25VcGRhdGUgPSBidWlsZGVyLl9vblVwZGF0ZTtcbiAgICB0aGlzLm9uRGVsZXRlID0gYnVpbGRlci5fb25EZWxldGU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlRm9yZWlnbktleVwiO1xuICByZWZlcmVuY2U7XG4gIG9uVXBkYXRlO1xuICBvbkRlbGV0ZTtcbiAgZ2V0TmFtZSgpIHtcbiAgICBjb25zdCB7IG5hbWUsIGNvbHVtbnMsIGZvcmVpZ25Db2x1bW5zIH0gPSB0aGlzLnJlZmVyZW5jZSgpO1xuICAgIGNvbnN0IGNvbHVtbk5hbWVzID0gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpO1xuICAgIGNvbnN0IGZvcmVpZ25Db2x1bW5OYW1lcyA9IGZvcmVpZ25Db2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSk7XG4gICAgY29uc3QgY2h1bmtzID0gW1xuICAgICAgdGhpcy50YWJsZVtUYWJsZU5hbWVdLFxuICAgICAgLi4uY29sdW1uTmFtZXMsXG4gICAgICBmb3JlaWduQ29sdW1uc1swXS50YWJsZVtUYWJsZU5hbWVdLFxuICAgICAgLi4uZm9yZWlnbkNvbHVtbk5hbWVzXG4gICAgXTtcbiAgICByZXR1cm4gbmFtZSA/PyBgJHtjaHVua3Muam9pbihcIl9cIil9X2ZrYDtcbiAgfVxufVxuZnVuY3Rpb24gZm9yZWlnbktleShjb25maWcpIHtcbiAgZnVuY3Rpb24gbWFwcGVkQ29uZmlnKCkge1xuICAgIGlmICh0eXBlb2YgY29uZmlnID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgY29sdW1ucywgZm9yZWlnbkNvbHVtbnMgfSA9IGNvbmZpZygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgY29sdW1ucyxcbiAgICAgICAgZm9yZWlnbkNvbHVtbnNcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgcmV0dXJuIG5ldyBGb3JlaWduS2V5QnVpbGRlcihtYXBwZWRDb25maWcpO1xufVxuZXhwb3J0IHtcbiAgRm9yZWlnbktleSxcbiAgRm9yZWlnbktleUJ1aWxkZXIsXG4gIGZvcmVpZ25LZXlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb3JlaWduLWtleXMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGVOYW1lIH0gZnJvbSBcIi4uL3RhYmxlLnV0aWxzLmpzXCI7XG5mdW5jdGlvbiB1bmlxdWVLZXlOYW1lKHRhYmxlLCBjb2x1bW5zKSB7XG4gIHJldHVybiBgJHt0YWJsZVtUYWJsZU5hbWVdfV8ke2NvbHVtbnMuam9pbihcIl9cIil9X3VuaXF1ZWA7XG59XG5mdW5jdGlvbiB1bmlxdWUobmFtZSkge1xuICByZXR1cm4gbmV3IFVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXIobmFtZSk7XG59XG5jbGFzcyBVbmlxdWVDb25zdHJhaW50QnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKGNvbHVtbnMsIG5hbWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVW5pcXVlQ29uc3RyYWludEJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb2x1bW5zO1xuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50KHRhYmxlLCB0aGlzLmNvbHVtbnMsIHRoaXMubmFtZSk7XG4gIH1cbn1cbmNsYXNzIFVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbmFtZTtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cbiAgb24oLi4uY29sdW1ucykge1xuICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIoY29sdW1ucywgdGhpcy5uYW1lKTtcbiAgfVxufVxuY2xhc3MgVW5pcXVlQ29uc3RyYWludCB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb2x1bW5zLCBuYW1lKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gICAgdGhpcy5uYW1lID0gbmFtZSA/PyB1bmlxdWVLZXlOYW1lKHRoaXMudGFibGUsIHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpKTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVVbmlxdWVDb25zdHJhaW50XCI7XG4gIGNvbHVtbnM7XG4gIG5hbWU7XG4gIGdldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgVW5pcXVlQ29uc3RyYWludCxcbiAgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIsXG4gIFVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXIsXG4gIHVuaXF1ZSxcbiAgdW5pcXVlS2V5TmFtZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuaXF1ZS1jb25zdHJhaW50LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuLi8uLi9jb2x1bW4tYnVpbGRlci5qc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uLy4uL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IEZvcmVpZ25LZXlCdWlsZGVyIH0gZnJvbSBcIi4uL2ZvcmVpZ24ta2V5cy5qc1wiO1xuaW1wb3J0IHsgdW5pcXVlS2V5TmFtZSB9IGZyb20gXCIuLi91bmlxdWUtY29uc3RyYWludC5qc1wiO1xuY2xhc3MgU1FMaXRlQ29sdW1uQnVpbGRlciBleHRlbmRzIENvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVDb2x1bW5CdWlsZGVyXCI7XG4gIGZvcmVpZ25LZXlDb25maWdzID0gW107XG4gIHJlZmVyZW5jZXMocmVmLCBhY3Rpb25zID0ge30pIHtcbiAgICB0aGlzLmZvcmVpZ25LZXlDb25maWdzLnB1c2goeyByZWYsIGFjdGlvbnMgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdW5pcXVlKG5hbWUpIHtcbiAgICB0aGlzLmNvbmZpZy5pc1VuaXF1ZSA9IHRydWU7XG4gICAgdGhpcy5jb25maWcudW5pcXVlTmFtZSA9IG5hbWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2VuZXJhdGVkQWx3YXlzQXMoYXMsIGNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZCA9IHtcbiAgICAgIGFzLFxuICAgICAgdHlwZTogXCJhbHdheXNcIixcbiAgICAgIG1vZGU6IGNvbmZpZz8ubW9kZSA/PyBcInZpcnR1YWxcIlxuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZEZvcmVpZ25LZXlzKGNvbHVtbiwgdGFibGUpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JlaWduS2V5Q29uZmlncy5tYXAoKHsgcmVmLCBhY3Rpb25zIH0pID0+IHtcbiAgICAgIHJldHVybiAoKHJlZjIsIGFjdGlvbnMyKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgRm9yZWlnbktleUJ1aWxkZXIoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZvcmVpZ25Db2x1bW4gPSByZWYyKCk7XG4gICAgICAgICAgcmV0dXJuIHsgY29sdW1uczogW2NvbHVtbl0sIGZvcmVpZ25Db2x1bW5zOiBbZm9yZWlnbkNvbHVtbl0gfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChhY3Rpb25zMi5vblVwZGF0ZSkge1xuICAgICAgICAgIGJ1aWxkZXIub25VcGRhdGUoYWN0aW9uczIub25VcGRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhY3Rpb25zMi5vbkRlbGV0ZSkge1xuICAgICAgICAgIGJ1aWxkZXIub25EZWxldGUoYWN0aW9uczIub25EZWxldGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKHRhYmxlKTtcbiAgICAgIH0pKHJlZiwgYWN0aW9ucyk7XG4gICAgfSk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUNvbHVtbiBleHRlbmRzIENvbHVtbiB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICBpZiAoIWNvbmZpZy51bmlxdWVOYW1lKSB7XG4gICAgICBjb25maWcudW5pcXVlTmFtZSA9IHVuaXF1ZUtleU5hbWUodGFibGUsIFtjb25maWcubmFtZV0pO1xuICAgIH1cbiAgICBzdXBlcih0YWJsZSwgY29uZmlnKTtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQ29sdW1uXCI7XG59XG5leHBvcnQge1xuICBTUUxpdGVDb2x1bW4sXG4gIFNRTGl0ZUNvbHVtbkJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21tb24uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29sdW1uTmFtZUFuZENvbmZpZywgdGV4dERlY29kZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiwgU1FMaXRlQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgU1FMaXRlQmlnSW50QnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCaWdJbnRCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcImJpZ2ludFwiLCBcIlNRTGl0ZUJpZ0ludFwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCaWdJbnQodGFibGUsIHRoaXMuY29uZmlnKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQmlnSW50IGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmlnSW50XCI7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwiYmxvYlwiO1xuICB9XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiICYmIEJ1ZmZlci5mcm9tKSB7XG4gICAgICBjb25zdCBidWYgPSBCdWZmZXIuaXNCdWZmZXIodmFsdWUpID8gdmFsdWUgOiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyID8gQnVmZmVyLmZyb20odmFsdWUpIDogdmFsdWUuYnVmZmVyID8gQnVmZmVyLmZyb20odmFsdWUuYnVmZmVyLCB2YWx1ZS5ieXRlT2Zmc2V0LCB2YWx1ZS5ieXRlTGVuZ3RoKSA6IEJ1ZmZlci5mcm9tKHZhbHVlKTtcbiAgICAgIHJldHVybiBCaWdJbnQoYnVmLnRvU3RyaW5nKFwidXRmOFwiKSk7XG4gICAgfVxuICAgIHJldHVybiBCaWdJbnQodGV4dERlY29kZXIuZGVjb2RlKHZhbHVlKSk7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZS50b1N0cmluZygpKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQmxvYkpzb25CdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJsb2JKc29uQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJqc29uXCIsIFwiU1FMaXRlQmxvYkpzb25cIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQmxvYkpzb24oXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQmxvYkpzb24gZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCbG9iSnNvblwiO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcImJsb2JcIjtcbiAgfVxuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBCdWZmZXIuZnJvbSkge1xuICAgICAgY29uc3QgYnVmID0gQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSA/IHZhbHVlIDogdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciA/IEJ1ZmZlci5mcm9tKHZhbHVlKSA6IHZhbHVlLmJ1ZmZlciA/IEJ1ZmZlci5mcm9tKHZhbHVlLmJ1ZmZlciwgdmFsdWUuYnl0ZU9mZnNldCwgdmFsdWUuYnl0ZUxlbmd0aCkgOiBCdWZmZXIuZnJvbSh2YWx1ZSk7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShidWYudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dERlY29kZXIuZGVjb2RlKHZhbHVlKSk7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVCbG9iQnVmZmVyQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCbG9iQnVmZmVyQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJidWZmZXJcIiwgXCJTUUxpdGVCbG9iQnVmZmVyXCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJsb2JCdWZmZXIodGFibGUsIHRoaXMuY29uZmlnKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQmxvYkJ1ZmZlciBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJsb2JCdWZmZXJcIjtcbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlKTtcbiAgfVxuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcImJsb2JcIjtcbiAgfVxufVxuZnVuY3Rpb24gYmxvYihhLCBiKSB7XG4gIGNvbnN0IHsgbmFtZSwgY29uZmlnIH0gPSBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnKGEsIGIpO1xuICBpZiAoY29uZmlnPy5tb2RlID09PSBcImpzb25cIikge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQmxvYkpzb25CdWlsZGVyKG5hbWUpO1xuICB9XG4gIGlmIChjb25maWc/Lm1vZGUgPT09IFwiYmlnaW50XCIpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJpZ0ludEJ1aWxkZXIobmFtZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTUUxpdGVCbG9iQnVmZmVyQnVpbGRlcihuYW1lKTtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZUJpZ0ludCxcbiAgU1FMaXRlQmlnSW50QnVpbGRlcixcbiAgU1FMaXRlQmxvYkJ1ZmZlcixcbiAgU1FMaXRlQmxvYkJ1ZmZlckJ1aWxkZXIsXG4gIFNRTGl0ZUJsb2JKc29uLFxuICBTUUxpdGVCbG9iSnNvbkJ1aWxkZXIsXG4gIGJsb2Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ibG9iLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWVBbmRDb25maWcgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiwgU1FMaXRlQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgU1FMaXRlQ3VzdG9tQ29sdW1uQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVDdXN0b21Db2x1bW5CdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGZpZWxkQ29uZmlnLCBjdXN0b21UeXBlUGFyYW1zKSB7XG4gICAgc3VwZXIobmFtZSwgXCJjdXN0b21cIiwgXCJTUUxpdGVDdXN0b21Db2x1bW5cIik7XG4gICAgdGhpcy5jb25maWcuZmllbGRDb25maWcgPSBmaWVsZENvbmZpZztcbiAgICB0aGlzLmNvbmZpZy5jdXN0b21UeXBlUGFyYW1zID0gY3VzdG9tVHlwZVBhcmFtcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVDdXN0b21Db2x1bW4oXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQ3VzdG9tQ29sdW1uIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQ3VzdG9tQ29sdW1uXCI7XG4gIHNxbE5hbWU7XG4gIG1hcFRvO1xuICBtYXBGcm9tO1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gICAgdGhpcy5zcWxOYW1lID0gY29uZmlnLmN1c3RvbVR5cGVQYXJhbXMuZGF0YVR5cGUoY29uZmlnLmZpZWxkQ29uZmlnKTtcbiAgICB0aGlzLm1hcFRvID0gY29uZmlnLmN1c3RvbVR5cGVQYXJhbXMudG9Ecml2ZXI7XG4gICAgdGhpcy5tYXBGcm9tID0gY29uZmlnLmN1c3RvbVR5cGVQYXJhbXMuZnJvbURyaXZlcjtcbiAgfVxuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnNxbE5hbWU7XG4gIH1cbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLm1hcEZyb20gPT09IFwiZnVuY3Rpb25cIiA/IHRoaXMubWFwRnJvbSh2YWx1ZSkgOiB2YWx1ZTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLm1hcFRvID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLm1hcFRvKHZhbHVlKSA6IHZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBjdXN0b21UeXBlKGN1c3RvbVR5cGVQYXJhbXMpIHtcbiAgcmV0dXJuIChhLCBiKSA9PiB7XG4gICAgY29uc3QgeyBuYW1lLCBjb25maWcgfSA9IGdldENvbHVtbk5hbWVBbmRDb25maWcoYSwgYik7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVDdXN0b21Db2x1bW5CdWlsZGVyKFxuICAgICAgbmFtZSxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGN1c3RvbVR5cGVQYXJhbXNcbiAgICApO1xuICB9O1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlQ3VzdG9tQ29sdW1uLFxuICBTUUxpdGVDdXN0b21Db2x1bW5CdWlsZGVyLFxuICBjdXN0b21UeXBlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3VzdG9tLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IHNxbCB9IGZyb20gXCIuLi8uLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4sIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFNRTGl0ZUJhc2VJbnRlZ2VyQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgZGF0YVR5cGUsIGNvbHVtblR5cGUpIHtcbiAgICBzdXBlcihuYW1lLCBkYXRhVHlwZSwgY29sdW1uVHlwZSk7XG4gICAgdGhpcy5jb25maWcuYXV0b0luY3JlbWVudCA9IGZhbHNlO1xuICB9XG4gIHByaW1hcnlLZXkoY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZz8uYXV0b0luY3JlbWVudCkge1xuICAgICAgdGhpcy5jb25maWcuYXV0b0luY3JlbWVudCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLmhhc0RlZmF1bHQgPSB0cnVlO1xuICAgIHJldHVybiBzdXBlci5wcmltYXJ5S2V5KCk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJhc2VJbnRlZ2VyIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmFzZUludGVnZXJcIjtcbiAgYXV0b0luY3JlbWVudCA9IHRoaXMuY29uZmlnLmF1dG9JbmNyZW1lbnQ7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwiaW50ZWdlclwiO1xuICB9XG59XG5jbGFzcyBTUUxpdGVJbnRlZ2VyQnVpbGRlciBleHRlbmRzIFNRTGl0ZUJhc2VJbnRlZ2VyQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUludGVnZXJCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcIm51bWJlclwiLCBcIlNRTGl0ZUludGVnZXJcIik7XG4gIH1cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUludGVnZXIoXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlSW50ZWdlciBleHRlbmRzIFNRTGl0ZUJhc2VJbnRlZ2VyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW50ZWdlclwiO1xufVxuY2xhc3MgU1FMaXRlVGltZXN0YW1wQnVpbGRlciBleHRlbmRzIFNRTGl0ZUJhc2VJbnRlZ2VyQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRpbWVzdGFtcEJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgbW9kZSkge1xuICAgIHN1cGVyKG5hbWUsIFwiZGF0ZVwiLCBcIlNRTGl0ZVRpbWVzdGFtcFwiKTtcbiAgICB0aGlzLmNvbmZpZy5tb2RlID0gbW9kZTtcbiAgfVxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBkZWZhdWx0KClgIHdpdGggeW91ciBvd24gZXhwcmVzc2lvbiBpbnN0ZWFkLlxuICAgKlxuICAgKiBBZGRzIGBERUZBVUxUIChjYXN0KChqdWxpYW5kYXkoJ25vdycpIC0gMjQ0MDU4Ny41KSo4NjQwMDAwMCBhcyBpbnRlZ2VyKSlgIHRvIHRoZSBjb2x1bW4sIHdoaWNoIGlzIHRoZSBjdXJyZW50IGVwb2NoIHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICBkZWZhdWx0Tm93KCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHQoc3FsYChjYXN0KChqdWxpYW5kYXkoJ25vdycpIC0gMjQ0MDU4Ny41KSo4NjQwMDAwMCBhcyBpbnRlZ2VyKSlgKTtcbiAgfVxuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVGltZXN0YW1wKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVRpbWVzdGFtcCBleHRlbmRzIFNRTGl0ZUJhc2VJbnRlZ2VyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGltZXN0YW1wXCI7XG4gIG1vZGUgPSB0aGlzLmNvbmZpZy5tb2RlO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodGhpcy5jb25maWcubW9kZSA9PT0gXCJ0aW1lc3RhbXBcIikge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlICogMWUzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgY29uc3QgdW5peCA9IHZhbHVlLmdldFRpbWUoKTtcbiAgICBpZiAodGhpcy5jb25maWcubW9kZSA9PT0gXCJ0aW1lc3RhbXBcIikge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IodW5peCAvIDFlMyk7XG4gICAgfVxuICAgIHJldHVybiB1bml4O1xuICB9XG59XG5jbGFzcyBTUUxpdGVCb29sZWFuQnVpbGRlciBleHRlbmRzIFNRTGl0ZUJhc2VJbnRlZ2VyQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJvb2xlYW5CdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIG1vZGUpIHtcbiAgICBzdXBlcihuYW1lLCBcImJvb2xlYW5cIiwgXCJTUUxpdGVCb29sZWFuXCIpO1xuICAgIHRoaXMuY29uZmlnLm1vZGUgPSBtb2RlO1xuICB9XG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCb29sZWFuKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJvb2xlYW4gZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJvb2xlYW5cIjtcbiAgbW9kZSA9IHRoaXMuY29uZmlnLm1vZGU7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiBOdW1iZXIodmFsdWUpID09PSAxO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPyAxIDogMDtcbiAgfVxufVxuZnVuY3Rpb24gaW50ZWdlcihhLCBiKSB7XG4gIGNvbnN0IHsgbmFtZSwgY29uZmlnIH0gPSBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnKGEsIGIpO1xuICBpZiAoY29uZmlnPy5tb2RlID09PSBcInRpbWVzdGFtcFwiIHx8IGNvbmZpZz8ubW9kZSA9PT0gXCJ0aW1lc3RhbXBfbXNcIikge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVGltZXN0YW1wQnVpbGRlcihuYW1lLCBjb25maWcubW9kZSk7XG4gIH1cbiAgaWYgKGNvbmZpZz8ubW9kZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJvb2xlYW5CdWlsZGVyKG5hbWUsIGNvbmZpZy5tb2RlKTtcbiAgfVxuICByZXR1cm4gbmV3IFNRTGl0ZUludGVnZXJCdWlsZGVyKG5hbWUpO1xufVxuY29uc3QgaW50ID0gaW50ZWdlcjtcbmV4cG9ydCB7XG4gIFNRTGl0ZUJhc2VJbnRlZ2VyLFxuICBTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXIsXG4gIFNRTGl0ZUJvb2xlYW4sXG4gIFNRTGl0ZUJvb2xlYW5CdWlsZGVyLFxuICBTUUxpdGVJbnRlZ2VyLFxuICBTUUxpdGVJbnRlZ2VyQnVpbGRlcixcbiAgU1FMaXRlVGltZXN0YW1wLFxuICBTUUxpdGVUaW1lc3RhbXBCdWlsZGVyLFxuICBpbnQsXG4gIGludGVnZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnRlZ2VyLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWVBbmRDb25maWcgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiwgU1FMaXRlQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgU1FMaXRlTnVtZXJpY0J1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY0J1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwic3RyaW5nXCIsIFwiU1FMaXRlTnVtZXJpY1wiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVOdW1lcmljKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZU51bWVyaWMgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVOdW1lcmljXCI7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcIm51bWVyaWNcIjtcbiAgfVxufVxuY2xhc3MgU1FMaXRlTnVtZXJpY051bWJlckJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY051bWJlckJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwibnVtYmVyXCIsIFwiU1FMaXRlTnVtZXJpY051bWJlclwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVOdW1lcmljTnVtYmVyKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZU51bWVyaWNOdW1iZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVOdW1lcmljTnVtYmVyXCI7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlID0gU3RyaW5nO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcIm51bWVyaWNcIjtcbiAgfVxufVxuY2xhc3MgU1FMaXRlTnVtZXJpY0JpZ0ludEJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY0JpZ0ludEJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwiYmlnaW50XCIsIFwiU1FMaXRlTnVtZXJpY0JpZ0ludFwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVOdW1lcmljQmlnSW50KFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZU51bWVyaWNCaWdJbnQgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVOdW1lcmljQmlnSW50XCI7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSA9IEJpZ0ludDtcbiAgbWFwVG9Ecml2ZXJWYWx1ZSA9IFN0cmluZztcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJudW1lcmljXCI7XG4gIH1cbn1cbmZ1bmN0aW9uIG51bWVyaWMoYSwgYikge1xuICBjb25zdCB7IG5hbWUsIGNvbmZpZyB9ID0gZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyhhLCBiKTtcbiAgY29uc3QgbW9kZSA9IGNvbmZpZz8ubW9kZTtcbiAgcmV0dXJuIG1vZGUgPT09IFwibnVtYmVyXCIgPyBuZXcgU1FMaXRlTnVtZXJpY051bWJlckJ1aWxkZXIobmFtZSkgOiBtb2RlID09PSBcImJpZ2ludFwiID8gbmV3IFNRTGl0ZU51bWVyaWNCaWdJbnRCdWlsZGVyKG5hbWUpIDogbmV3IFNRTGl0ZU51bWVyaWNCdWlsZGVyKG5hbWUpO1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlTnVtZXJpYyxcbiAgU1FMaXRlTnVtZXJpY0JpZ0ludCxcbiAgU1FMaXRlTnVtZXJpY0JpZ0ludEJ1aWxkZXIsXG4gIFNRTGl0ZU51bWVyaWNCdWlsZGVyLFxuICBTUUxpdGVOdW1lcmljTnVtYmVyLFxuICBTUUxpdGVOdW1lcmljTnVtYmVyQnVpbGRlcixcbiAgbnVtZXJpY1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW51bWVyaWMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uLCBTUUxpdGVDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBTUUxpdGVSZWFsQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVSZWFsQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJudW1iZXJcIiwgXCJTUUxpdGVSZWFsXCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVJlYWwodGFibGUsIHRoaXMuY29uZmlnKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlUmVhbCBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVJlYWxcIjtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJyZWFsXCI7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlYWwobmFtZSkge1xuICByZXR1cm4gbmV3IFNRTGl0ZVJlYWxCdWlsZGVyKG5hbWUgPz8gXCJcIik7XG59XG5leHBvcnQge1xuICBTUUxpdGVSZWFsLFxuICBTUUxpdGVSZWFsQnVpbGRlcixcbiAgcmVhbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWwuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uLCBTUUxpdGVDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBTUUxpdGVUZXh0QnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUZXh0QnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBjb25maWcpIHtcbiAgICBzdXBlcihuYW1lLCBcInN0cmluZ1wiLCBcIlNRTGl0ZVRleHRcIik7XG4gICAgdGhpcy5jb25maWcuZW51bVZhbHVlcyA9IGNvbmZpZy5lbnVtO1xuICAgIHRoaXMuY29uZmlnLmxlbmd0aCA9IGNvbmZpZy5sZW5ndGg7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVGV4dChcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVUZXh0IGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGV4dFwiO1xuICBlbnVtVmFsdWVzID0gdGhpcy5jb25maWcuZW51bVZhbHVlcztcbiAgbGVuZ3RoID0gdGhpcy5jb25maWcubGVuZ3RoO1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gIH1cbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gYHRleHQke3RoaXMuY29uZmlnLmxlbmd0aCA/IGAoJHt0aGlzLmNvbmZpZy5sZW5ndGh9KWAgOiBcIlwifWA7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVRleHRKc29uQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUZXh0SnNvbkJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwianNvblwiLCBcIlNRTGl0ZVRleHRKc29uXCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVRleHRKc29uKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVRleHRKc29uIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGV4dEpzb25cIjtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gIH1cbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9XG59XG5mdW5jdGlvbiB0ZXh0KGEsIGIgPSB7fSkge1xuICBjb25zdCB7IG5hbWUsIGNvbmZpZyB9ID0gZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyhhLCBiKTtcbiAgaWYgKGNvbmZpZy5tb2RlID09PSBcImpzb25cIikge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVGV4dEpzb25CdWlsZGVyKG5hbWUpO1xuICB9XG4gIHJldHVybiBuZXcgU1FMaXRlVGV4dEJ1aWxkZXIobmFtZSwgY29uZmlnKTtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZVRleHQsXG4gIFNRTGl0ZVRleHRCdWlsZGVyLFxuICBTUUxpdGVUZXh0SnNvbixcbiAgU1FMaXRlVGV4dEpzb25CdWlsZGVyLFxuICB0ZXh0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGV4dC5qcy5tYXAiLAogICAgImltcG9ydCB7IENvbHVtbkFsaWFzUHJveHlIYW5kbGVyLCBUYWJsZUFsaWFzUHJveHlIYW5kbGVyIH0gZnJvbSBcIi4vYWxpYXMuanNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNRTCwgVmlldyB9IGZyb20gXCIuL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4vdmlldy1jb21tb24uanNcIjtcbmNsYXNzIFNlbGVjdGlvblByb3h5SGFuZGxlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNlbGVjdGlvblByb3h5SGFuZGxlclwiO1xuICBjb25maWc7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0geyAuLi5jb25maWcgfTtcbiAgfVxuICBnZXQoc3VicXVlcnksIHByb3ApIHtcbiAgICBpZiAocHJvcCA9PT0gXCJfXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN1YnF1ZXJ5W1wiX1wiXSxcbiAgICAgICAgc2VsZWN0ZWRGaWVsZHM6IG5ldyBQcm94eShcbiAgICAgICAgICBzdWJxdWVyeS5fLnNlbGVjdGVkRmllbGRzLFxuICAgICAgICAgIHRoaXNcbiAgICAgICAgKVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHByb3AgPT09IFZpZXdCYXNlQ29uZmlnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdWJxdWVyeVtWaWV3QmFzZUNvbmZpZ10sXG4gICAgICAgIHNlbGVjdGVkRmllbGRzOiBuZXcgUHJveHkoXG4gICAgICAgICAgc3VicXVlcnlbVmlld0Jhc2VDb25maWddLnNlbGVjdGVkRmllbGRzLFxuICAgICAgICAgIHRoaXNcbiAgICAgICAgKVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9wID09PSBcInN5bWJvbFwiKSB7XG4gICAgICByZXR1cm4gc3VicXVlcnlbcHJvcF07XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbnMgPSBpcyhzdWJxdWVyeSwgU3VicXVlcnkpID8gc3VicXVlcnkuXy5zZWxlY3RlZEZpZWxkcyA6IGlzKHN1YnF1ZXJ5LCBWaWV3KSA/IHN1YnF1ZXJ5W1ZpZXdCYXNlQ29uZmlnXS5zZWxlY3RlZEZpZWxkcyA6IHN1YnF1ZXJ5O1xuICAgIGNvbnN0IHZhbHVlID0gY29sdW1uc1twcm9wXTtcbiAgICBpZiAoaXModmFsdWUsIFNRTC5BbGlhc2VkKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLnNxbEFsaWFzZWRCZWhhdmlvciA9PT0gXCJzcWxcIiAmJiAhdmFsdWUuaXNTZWxlY3Rpb25GaWVsZCkge1xuICAgICAgICByZXR1cm4gdmFsdWUuc3FsO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3VmFsdWUgPSB2YWx1ZS5jbG9uZSgpO1xuICAgICAgbmV3VmFsdWUuaXNTZWxlY3Rpb25GaWVsZCA9IHRydWU7XG4gICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgfVxuICAgIGlmIChpcyh2YWx1ZSwgU1FMKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLnNxbEJlaGF2aW9yID09PSBcInNxbFwiKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFlvdSB0cmllZCB0byByZWZlcmVuY2UgXCIke3Byb3B9XCIgZmllbGQgZnJvbSBhIHN1YnF1ZXJ5LCB3aGljaCBpcyBhIHJhdyBTUUwgZmllbGQsIGJ1dCBpdCBkb2Vzbid0IGhhdmUgYW4gYWxpYXMgZGVjbGFyZWQuIFBsZWFzZSBhZGQgYW4gYWxpYXMgdG8gdGhlIGZpZWxkIHVzaW5nIFwiLmFzKCdhbGlhcycpXCIgbWV0aG9kLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChpcyh2YWx1ZSwgQ29sdW1uKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLmFsaWFzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgbmV3IENvbHVtbkFsaWFzUHJveHlIYW5kbGVyKFxuICAgICAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgICAgICB2YWx1ZS50YWJsZSxcbiAgICAgICAgICAgICAgbmV3IFRhYmxlQWxpYXNQcm94eUhhbmRsZXIodGhpcy5jb25maWcuYWxpYXMsIHRoaXMuY29uZmlnLnJlcGxhY2VPcmlnaW5hbE5hbWUgPz8gZmFsc2UpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJveHkodmFsdWUsIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIodGhpcy5jb25maWcpKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgU2VsZWN0aW9uUHJveHlIYW5kbGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VsZWN0aW9uLXByb3h5LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuY2xhc3MgUXVlcnlQcm9taXNlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUXVlcnlQcm9taXNlXCI7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddID0gXCJRdWVyeVByb21pc2VcIjtcbiAgY2F0Y2gob25SZWplY3RlZCkge1xuICAgIHJldHVybiB0aGlzLnRoZW4odm9pZCAwLCBvblJlamVjdGVkKTtcbiAgfVxuICBmaW5hbGx5KG9uRmluYWxseSkge1xuICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgb25GaW5hbGx5Py4oKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSxcbiAgICAgIChyZWFzb24pID0+IHtcbiAgICAgICAgb25GaW5hbGx5Py4oKTtcbiAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgUXVlcnlQcm9taXNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnktcHJvbWlzZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGJsb2IgfSBmcm9tIFwiLi9ibG9iLmpzXCI7XG5pbXBvcnQgeyBjdXN0b21UeXBlIH0gZnJvbSBcIi4vY3VzdG9tLmpzXCI7XG5pbXBvcnQgeyBpbnRlZ2VyIH0gZnJvbSBcIi4vaW50ZWdlci5qc1wiO1xuaW1wb3J0IHsgbnVtZXJpYyB9IGZyb20gXCIuL251bWVyaWMuanNcIjtcbmltcG9ydCB7IHJlYWwgfSBmcm9tIFwiLi9yZWFsLmpzXCI7XG5pbXBvcnQgeyB0ZXh0IH0gZnJvbSBcIi4vdGV4dC5qc1wiO1xuZnVuY3Rpb24gZ2V0U1FMaXRlQ29sdW1uQnVpbGRlcnMoKSB7XG4gIHJldHVybiB7XG4gICAgYmxvYixcbiAgICBjdXN0b21UeXBlLFxuICAgIGludGVnZXIsXG4gICAgbnVtZXJpYyxcbiAgICByZWFsLFxuICAgIHRleHRcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIGdldFNRTGl0ZUNvbHVtbkJ1aWxkZXJzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWxsLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBnZXRTUUxpdGVDb2x1bW5CdWlsZGVycyB9IGZyb20gXCIuL2NvbHVtbnMvYWxsLmpzXCI7XG5jb25zdCBJbmxpbmVGb3JlaWduS2V5cyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOlNRTGl0ZUlubGluZUZvcmVpZ25LZXlzXCIpO1xuY2xhc3MgU1FMaXRlVGFibGUgZXh0ZW5kcyBUYWJsZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRhYmxlXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIFN5bWJvbCA9IE9iamVjdC5hc3NpZ24oe30sIFRhYmxlLlN5bWJvbCwge1xuICAgIElubGluZUZvcmVpZ25LZXlzXG4gIH0pO1xuICAvKiogQGludGVybmFsICovXG4gIFtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0lubGluZUZvcmVpZ25LZXlzXSA9IFtdO1xuICAvKiogQGludGVybmFsICovXG4gIFtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdCdWlsZGVyXSA9IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIHNxbGl0ZVRhYmxlQmFzZShuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZywgc2NoZW1hLCBiYXNlTmFtZSA9IG5hbWUpIHtcbiAgY29uc3QgcmF3VGFibGUgPSBuZXcgU1FMaXRlVGFibGUobmFtZSwgc2NoZW1hLCBiYXNlTmFtZSk7XG4gIGNvbnN0IHBhcnNlZENvbHVtbnMgPSB0eXBlb2YgY29sdW1ucyA9PT0gXCJmdW5jdGlvblwiID8gY29sdW1ucyhnZXRTUUxpdGVDb2x1bW5CdWlsZGVycygpKSA6IGNvbHVtbnM7XG4gIGNvbnN0IGJ1aWx0Q29sdW1ucyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhwYXJzZWRDb2x1bW5zKS5tYXAoKFtuYW1lMiwgY29sQnVpbGRlckJhc2VdKSA9PiB7XG4gICAgICBjb25zdCBjb2xCdWlsZGVyID0gY29sQnVpbGRlckJhc2U7XG4gICAgICBjb2xCdWlsZGVyLnNldE5hbWUobmFtZTIpO1xuICAgICAgY29uc3QgY29sdW1uID0gY29sQnVpbGRlci5idWlsZChyYXdUYWJsZSk7XG4gICAgICByYXdUYWJsZVtJbmxpbmVGb3JlaWduS2V5c10ucHVzaCguLi5jb2xCdWlsZGVyLmJ1aWxkRm9yZWlnbktleXMoY29sdW1uLCByYXdUYWJsZSkpO1xuICAgICAgcmV0dXJuIFtuYW1lMiwgY29sdW1uXTtcbiAgICB9KVxuICApO1xuICBjb25zdCB0YWJsZSA9IE9iamVjdC5hc3NpZ24ocmF3VGFibGUsIGJ1aWx0Q29sdW1ucyk7XG4gIHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSA9IGJ1aWx0Q29sdW1ucztcbiAgdGFibGVbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQ29sdW1uc10gPSBidWlsdENvbHVtbnM7XG4gIGlmIChleHRyYUNvbmZpZykge1xuICAgIHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0J1aWxkZXJdID0gZXh0cmFDb25maWc7XG4gIH1cbiAgcmV0dXJuIHRhYmxlO1xufVxuY29uc3Qgc3FsaXRlVGFibGUgPSAobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcpID0+IHtcbiAgcmV0dXJuIHNxbGl0ZVRhYmxlQmFzZShuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZyk7XG59O1xuZnVuY3Rpb24gc3FsaXRlVGFibGVDcmVhdG9yKGN1c3RvbWl6ZVRhYmxlTmFtZSkge1xuICByZXR1cm4gKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnKSA9PiB7XG4gICAgcmV0dXJuIHNxbGl0ZVRhYmxlQmFzZShjdXN0b21pemVUYWJsZU5hbWUobmFtZSksIGNvbHVtbnMsIGV4dHJhQ29uZmlnLCB2b2lkIDAsIG5hbWUpO1xuICB9O1xufVxuZXhwb3J0IHtcbiAgSW5saW5lRm9yZWlnbktleXMsXG4gIFNRTGl0ZVRhYmxlLFxuICBzcWxpdGVUYWJsZSxcbiAgc3FsaXRlVGFibGVDcmVhdG9yXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFibGUuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuY2xhc3MgSW5kZXhCdWlsZGVyT24ge1xuICBjb25zdHJ1Y3RvcihuYW1lLCB1bmlxdWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudW5pcXVlID0gdW5pcXVlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUluZGV4QnVpbGRlck9uXCI7XG4gIG9uKC4uLmNvbHVtbnMpIHtcbiAgICByZXR1cm4gbmV3IEluZGV4QnVpbGRlcih0aGlzLm5hbWUsIGNvbHVtbnMsIHRoaXMudW5pcXVlKTtcbiAgfVxufVxuY2xhc3MgSW5kZXhCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW5kZXhCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uZmlnO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBjb2x1bW5zLCB1bmlxdWUpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBjb2x1bW5zLFxuICAgICAgdW5pcXVlLFxuICAgICAgd2hlcmU6IHZvaWQgMFxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIENvbmRpdGlvbiBmb3IgcGFydGlhbCBpbmRleC5cbiAgICovXG4gIHdoZXJlKGNvbmRpdGlvbikge1xuICAgIHRoaXMuY29uZmlnLndoZXJlID0gY29uZGl0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IEluZGV4KHRoaXMuY29uZmlnLCB0YWJsZSk7XG4gIH1cbn1cbmNsYXNzIEluZGV4IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW5kZXhcIjtcbiAgY29uZmlnO1xuICBjb25zdHJ1Y3Rvcihjb25maWcsIHRhYmxlKSB7XG4gICAgdGhpcy5jb25maWcgPSB7IC4uLmNvbmZpZywgdGFibGUgfTtcbiAgfVxufVxuZnVuY3Rpb24gaW5kZXgobmFtZSkge1xuICByZXR1cm4gbmV3IEluZGV4QnVpbGRlck9uKG5hbWUsIGZhbHNlKTtcbn1cbmZ1bmN0aW9uIHVuaXF1ZUluZGV4KG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBJbmRleEJ1aWxkZXJPbihuYW1lLCB0cnVlKTtcbn1cbmV4cG9ydCB7XG4gIEluZGV4LFxuICBJbmRleEJ1aWxkZXIsXG4gIEluZGV4QnVpbGRlck9uLFxuICBpbmRleCxcbiAgdW5pcXVlSW5kZXhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleGVzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgaXMgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTUUwgfSBmcm9tIFwiLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuLi92aWV3LWNvbW1vbi5qc1wiO1xuaW1wb3J0IHsgQ2hlY2tCdWlsZGVyIH0gZnJvbSBcIi4vY2hlY2tzLmpzXCI7XG5pbXBvcnQgeyBGb3JlaWduS2V5QnVpbGRlciB9IGZyb20gXCIuL2ZvcmVpZ24ta2V5cy5qc1wiO1xuaW1wb3J0IHsgSW5kZXhCdWlsZGVyIH0gZnJvbSBcIi4vaW5kZXhlcy5qc1wiO1xuaW1wb3J0IHsgUHJpbWFyeUtleUJ1aWxkZXIgfSBmcm9tIFwiLi9wcmltYXJ5LWtleXMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVRhYmxlIH0gZnJvbSBcIi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyIH0gZnJvbSBcIi4vdW5pcXVlLWNvbnN0cmFpbnQuanNcIjtcbmZ1bmN0aW9uIGdldFRhYmxlQ29uZmlnKHRhYmxlKSB7XG4gIGNvbnN0IGNvbHVtbnMgPSBPYmplY3QudmFsdWVzKHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5Db2x1bW5zXSk7XG4gIGNvbnN0IGluZGV4ZXMgPSBbXTtcbiAgY29uc3QgY2hlY2tzID0gW107XG4gIGNvbnN0IHByaW1hcnlLZXlzID0gW107XG4gIGNvbnN0IHVuaXF1ZUNvbnN0cmFpbnRzID0gW107XG4gIGNvbnN0IGZvcmVpZ25LZXlzID0gT2JqZWN0LnZhbHVlcyh0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuSW5saW5lRm9yZWlnbktleXNdKTtcbiAgY29uc3QgbmFtZSA9IHRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXTtcbiAgY29uc3QgZXh0cmFDb25maWdCdWlsZGVyID0gdGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQnVpbGRlcl07XG4gIGlmIChleHRyYUNvbmZpZ0J1aWxkZXIgIT09IHZvaWQgMCkge1xuICAgIGNvbnN0IGV4dHJhQ29uZmlnID0gZXh0cmFDb25maWdCdWlsZGVyKHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5Db2x1bW5zXSk7XG4gICAgY29uc3QgZXh0cmFWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGV4dHJhQ29uZmlnKSA/IGV4dHJhQ29uZmlnLmZsYXQoMSkgOiBPYmplY3QudmFsdWVzKGV4dHJhQ29uZmlnKTtcbiAgICBmb3IgKGNvbnN0IGJ1aWxkZXIgb2YgT2JqZWN0LnZhbHVlcyhleHRyYVZhbHVlcykpIHtcbiAgICAgIGlmIChpcyhidWlsZGVyLCBJbmRleEJ1aWxkZXIpKSB7XG4gICAgICAgIGluZGV4ZXMucHVzaChidWlsZGVyLmJ1aWxkKHRhYmxlKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzKGJ1aWxkZXIsIENoZWNrQnVpbGRlcikpIHtcbiAgICAgICAgY2hlY2tzLnB1c2goYnVpbGRlci5idWlsZCh0YWJsZSkpO1xuICAgICAgfSBlbHNlIGlmIChpcyhidWlsZGVyLCBVbmlxdWVDb25zdHJhaW50QnVpbGRlcikpIHtcbiAgICAgICAgdW5pcXVlQ29uc3RyYWludHMucHVzaChidWlsZGVyLmJ1aWxkKHRhYmxlKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzKGJ1aWxkZXIsIFByaW1hcnlLZXlCdWlsZGVyKSkge1xuICAgICAgICBwcmltYXJ5S2V5cy5wdXNoKGJ1aWxkZXIuYnVpbGQodGFibGUpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXMoYnVpbGRlciwgRm9yZWlnbktleUJ1aWxkZXIpKSB7XG4gICAgICAgIGZvcmVpZ25LZXlzLnB1c2goYnVpbGRlci5idWlsZCh0YWJsZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGNvbHVtbnMsXG4gICAgaW5kZXhlcyxcbiAgICBmb3JlaWduS2V5cyxcbiAgICBjaGVja3MsXG4gICAgcHJpbWFyeUtleXMsXG4gICAgdW5pcXVlQ29uc3RyYWludHMsXG4gICAgbmFtZVxuICB9O1xufVxuZnVuY3Rpb24gZXh0cmFjdFVzZWRUYWJsZSh0YWJsZSkge1xuICBpZiAoaXModGFibGUsIFNRTGl0ZVRhYmxlKSkge1xuICAgIHJldHVybiBbYCR7dGFibGVbVGFibGUuU3ltYm9sLkJhc2VOYW1lXX1gXTtcbiAgfVxuICBpZiAoaXModGFibGUsIFN1YnF1ZXJ5KSkge1xuICAgIHJldHVybiB0YWJsZS5fLnVzZWRUYWJsZXMgPz8gW107XG4gIH1cbiAgaWYgKGlzKHRhYmxlLCBTUUwpKSB7XG4gICAgcmV0dXJuIHRhYmxlLnVzZWRUYWJsZXMgPz8gW107XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuZnVuY3Rpb24gZ2V0Vmlld0NvbmZpZyh2aWV3KSB7XG4gIHJldHVybiB7XG4gICAgLi4udmlld1tWaWV3QmFzZUNvbmZpZ11cbiAgICAvLyAuLi52aWV3W1NRTGl0ZVZpZXdDb25maWddLFxuICB9O1xufVxuZXhwb3J0IHtcbiAgZXh0cmFjdFVzZWRUYWJsZSxcbiAgZ2V0VGFibGVDb25maWcsXG4gIGdldFZpZXdDb25maWdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuaW1wb3J0IHsgU2VsZWN0aW9uUHJveHlIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL3NlbGVjdGlvbi1wcm94eS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBvcmRlclNlbGVjdGVkRmllbGRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBleHRyYWN0VXNlZFRhYmxlIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5jbGFzcyBTUUxpdGVEZWxldGVCYXNlIGV4dGVuZHMgUXVlcnlQcm9taXNlIHtcbiAgY29uc3RydWN0b3IodGFibGUsIHNlc3Npb24sIGRpYWxlY3QsIHdpdGhMaXN0KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuY29uZmlnID0geyB0YWJsZSwgd2l0aExpc3QgfTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVEZWxldGVcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25maWc7XG4gIC8qKlxuICAgKiBBZGRzIGEgYHdoZXJlYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgZGVsZXRlIG9ubHkgdGhvc2Ugcm93cyB0aGF0IGZ1bGZpbGwgYSBzcGVjaWZpZWQgY29uZGl0aW9uLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2RlbGV0ZX1cbiAgICpcbiAgICogQHBhcmFtIHdoZXJlIHRoZSBgd2hlcmVgIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogWW91IGNhbiB1c2UgY29uZGl0aW9uYWwgb3BlcmF0b3JzIGFuZCBgc3FsIGZ1bmN0aW9uYCB0byBmaWx0ZXIgdGhlIHJvd3MgdG8gYmUgZGVsZXRlZC5cbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gRGVsZXRlIGFsbCBjYXJzIHdpdGggZ3JlZW4gY29sb3JcbiAgICogZGIuZGVsZXRlKGNhcnMpLndoZXJlKGVxKGNhcnMuY29sb3IsICdncmVlbicpKTtcbiAgICogLy8gb3JcbiAgICogZGIuZGVsZXRlKGNhcnMpLndoZXJlKHNxbGAke2NhcnMuY29sb3J9ID0gJ2dyZWVuJ2ApXG4gICAqIGBgYFxuICAgKlxuICAgKiBZb3UgY2FuIGxvZ2ljYWxseSBjb21iaW5lIGNvbmRpdGlvbmFsIG9wZXJhdG9ycyB3aXRoIGBhbmQoKWAgYW5kIGBvcigpYCBvcGVyYXRvcnM6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIERlbGV0ZSBhbGwgQk1XIGNhcnMgd2l0aCBhIGdyZWVuIGNvbG9yXG4gICAqIGRiLmRlbGV0ZShjYXJzKS53aGVyZShhbmQoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJyksIGVxKGNhcnMuYnJhbmQsICdCTVcnKSkpO1xuICAgKlxuICAgKiAvLyBEZWxldGUgYWxsIGNhcnMgd2l0aCB0aGUgZ3JlZW4gb3IgYmx1ZSBjb2xvclxuICAgKiBkYi5kZWxldGUoY2Fycykud2hlcmUob3IoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJyksIGVxKGNhcnMuY29sb3IsICdibHVlJykpKTtcbiAgICogYGBgXG4gICAqL1xuICB3aGVyZSh3aGVyZSkge1xuICAgIHRoaXMuY29uZmlnLndoZXJlID0gd2hlcmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb3JkZXJCeSguLi5jb2x1bW5zKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW5zWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yZGVyQnkgPSBjb2x1bW5zWzBdKFxuICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgdGhpcy5jb25maWcudGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdLFxuICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG9yZGVyQnlBcnJheSA9IEFycmF5LmlzQXJyYXkob3JkZXJCeSkgPyBvcmRlckJ5IDogW29yZGVyQnldO1xuICAgICAgdGhpcy5jb25maWcub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3JkZXJCeUFycmF5ID0gY29sdW1ucztcbiAgICAgIHRoaXMuY29uZmlnLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGxpbWl0KGxpbWl0KSB7XG4gICAgdGhpcy5jb25maWcubGltaXQgPSBsaW1pdDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICByZXR1cm5pbmcoZmllbGRzID0gdGhpcy50YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuQ29sdW1uc10pIHtcbiAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPSBvcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbGVjdC5idWlsZERlbGV0ZVF1ZXJ5KHRoaXMuY29uZmlnKTtcbiAgfVxuICB0b1NRTCgpIHtcbiAgICBjb25zdCB7IHR5cGluZ3M6IF90eXBpbmdzLCAuLi5yZXN0IH0gPSB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKTtcbiAgICByZXR1cm4gcmVzdDtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9wcmVwYXJlKGlzT25lVGltZVF1ZXJ5ID0gdHJ1ZSkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25baXNPbmVUaW1lUXVlcnkgPyBcInByZXBhcmVPbmVUaW1lUXVlcnlcIiA6IFwicHJlcGFyZVF1ZXJ5XCJdKFxuICAgICAgdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSksXG4gICAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcsXG4gICAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPyBcImFsbFwiIDogXCJydW5cIixcbiAgICAgIHRydWUsXG4gICAgICB2b2lkIDAsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiZGVsZXRlXCIsXG4gICAgICAgIHRhYmxlczogZXh0cmFjdFVzZWRUYWJsZSh0aGlzLmNvbmZpZy50YWJsZSlcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByZXBhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpO1xuICB9XG4gIHJ1biA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkucnVuKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYWxsID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5hbGwocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBnZXQgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmdldChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIHZhbHVlcyA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkudmFsdWVzKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYXN5bmMgZXhlY3V0ZShwbGFjZWhvbGRlclZhbHVlcykge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuZXhlY3V0ZShwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH1cbiAgJGR5bmFtaWMoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZURlbGV0ZUJhc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWxldGUuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5mdW5jdGlvbiB0b1NuYWtlQ2FzZShpbnB1dCkge1xuICBjb25zdCB3b3JkcyA9IGlucHV0LnJlcGxhY2UoL1snXFx1MjAxOV0vZywgXCJcIikubWF0Y2goL1tcXGRhLXpdK3xbQS1aXSsoPyFbYS16XSl8W0EtWl1bXFxkYS16XSsvZykgPz8gW107XG4gIHJldHVybiB3b3Jkcy5tYXAoKHdvcmQpID0+IHdvcmQudG9Mb3dlckNhc2UoKSkuam9pbihcIl9cIik7XG59XG5mdW5jdGlvbiB0b0NhbWVsQ2FzZShpbnB1dCkge1xuICBjb25zdCB3b3JkcyA9IGlucHV0LnJlcGxhY2UoL1snXFx1MjAxOV0vZywgXCJcIikubWF0Y2goL1tcXGRhLXpdK3xbQS1aXSsoPyFbYS16XSl8W0EtWl1bXFxkYS16XSsvZykgPz8gW107XG4gIHJldHVybiB3b3Jkcy5yZWR1Y2UoKGFjYywgd29yZCwgaSkgPT4ge1xuICAgIGNvbnN0IGZvcm1hdHRlZFdvcmQgPSBpID09PSAwID8gd29yZC50b0xvd2VyQ2FzZSgpIDogYCR7d29yZFswXS50b1VwcGVyQ2FzZSgpfSR7d29yZC5zbGljZSgxKX1gO1xuICAgIHJldHVybiBhY2MgKyBmb3JtYXR0ZWRXb3JkO1xuICB9LCBcIlwiKTtcbn1cbmZ1bmN0aW9uIG5vb3BDYXNlKGlucHV0KSB7XG4gIHJldHVybiBpbnB1dDtcbn1cbmNsYXNzIENhc2luZ0NhY2hlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQ2FzaW5nQ2FjaGVcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjYWNoZSA9IHt9O1xuICBjYWNoZWRUYWJsZXMgPSB7fTtcbiAgY29udmVydDtcbiAgY29uc3RydWN0b3IoY2FzaW5nKSB7XG4gICAgdGhpcy5jb252ZXJ0ID0gY2FzaW5nID09PSBcInNuYWtlX2Nhc2VcIiA/IHRvU25ha2VDYXNlIDogY2FzaW5nID09PSBcImNhbWVsQ2FzZVwiID8gdG9DYW1lbENhc2UgOiBub29wQ2FzZTtcbiAgfVxuICBnZXRDb2x1bW5DYXNpbmcoY29sdW1uKSB7XG4gICAgaWYgKCFjb2x1bW4ua2V5QXNOYW1lKSByZXR1cm4gY29sdW1uLm5hbWU7XG4gICAgY29uc3Qgc2NoZW1hID0gY29sdW1uLnRhYmxlW1RhYmxlLlN5bWJvbC5TY2hlbWFdID8/IFwicHVibGljXCI7XG4gICAgY29uc3QgdGFibGVOYW1lID0gY29sdW1uLnRhYmxlW1RhYmxlLlN5bWJvbC5PcmlnaW5hbE5hbWVdO1xuICAgIGNvbnN0IGtleSA9IGAke3NjaGVtYX0uJHt0YWJsZU5hbWV9LiR7Y29sdW1uLm5hbWV9YDtcbiAgICBpZiAoIXRoaXMuY2FjaGVba2V5XSkge1xuICAgICAgdGhpcy5jYWNoZVRhYmxlKGNvbHVtbi50YWJsZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNhY2hlW2tleV07XG4gIH1cbiAgY2FjaGVUYWJsZSh0YWJsZSkge1xuICAgIGNvbnN0IHNjaGVtYSA9IHRhYmxlW1RhYmxlLlN5bWJvbC5TY2hlbWFdID8/IFwicHVibGljXCI7XG4gICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVbVGFibGUuU3ltYm9sLk9yaWdpbmFsTmFtZV07XG4gICAgY29uc3QgdGFibGVLZXkgPSBgJHtzY2hlbWF9LiR7dGFibGVOYW1lfWA7XG4gICAgaWYgKCF0aGlzLmNhY2hlZFRhYmxlc1t0YWJsZUtleV0pIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIE9iamVjdC52YWx1ZXModGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdKSkge1xuICAgICAgICBjb25zdCBjb2x1bW5LZXkgPSBgJHt0YWJsZUtleX0uJHtjb2x1bW4ubmFtZX1gO1xuICAgICAgICB0aGlzLmNhY2hlW2NvbHVtbktleV0gPSB0aGlzLmNvbnZlcnQoY29sdW1uLm5hbWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWNoZWRUYWJsZXNbdGFibGVLZXldID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgY2xlYXJDYWNoZSgpIHtcbiAgICB0aGlzLmNhY2hlID0ge307XG4gICAgdGhpcy5jYWNoZWRUYWJsZXMgPSB7fTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgQ2FzaW5nQ2FjaGUsXG4gIHRvQ2FtZWxDYXNlLFxuICB0b1NuYWtlQ2FzZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNhc2luZy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIERyaXp6bGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiRHJpenpsZUVycm9yXCI7XG4gIGNvbnN0cnVjdG9yKHsgbWVzc2FnZSwgY2F1c2UgfSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiRHJpenpsZUVycm9yXCI7XG4gICAgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICB9XG59XG5jbGFzcyBEcml6emxlUXVlcnlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocXVlcnksIHBhcmFtcywgY2F1c2UpIHtcbiAgICBzdXBlcihgRmFpbGVkIHF1ZXJ5OiAke3F1ZXJ5fVxucGFyYW1zOiAke3BhcmFtc31gKTtcbiAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIERyaXp6bGVRdWVyeUVycm9yKTtcbiAgICBpZiAoY2F1c2UpIHRoaXMuY2F1c2UgPSBjYXVzZTtcbiAgfVxufVxuY2xhc3MgVHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yIGV4dGVuZHMgRHJpenpsZUVycm9yIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiVHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yXCI7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHsgbWVzc2FnZTogXCJSb2xsYmFja1wiIH0pO1xuICB9XG59XG5leHBvcnQge1xuICBEcml6emxlRXJyb3IsXG4gIERyaXp6bGVRdWVyeUVycm9yLFxuICBUcmFuc2FjdGlvblJvbGxiYWNrRXJyb3Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvcnMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IGdldFBnQ29sdW1uQnVpbGRlcnMgfSBmcm9tIFwiLi9jb2x1bW5zL2FsbC5qc1wiO1xuY29uc3QgSW5saW5lRm9yZWlnbktleXMgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpQZ0lubGluZUZvcmVpZ25LZXlzXCIpO1xuY29uc3QgRW5hYmxlUkxTID0gU3ltYm9sLmZvcihcImRyaXp6bGU6RW5hYmxlUkxTXCIpO1xuY2xhc3MgUGdUYWJsZSBleHRlbmRzIFRhYmxlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdUYWJsZVwiO1xuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBTeW1ib2wgPSBPYmplY3QuYXNzaWduKHt9LCBUYWJsZS5TeW1ib2wsIHtcbiAgICBJbmxpbmVGb3JlaWduS2V5cyxcbiAgICBFbmFibGVSTFNcbiAgfSk7XG4gIC8qKkBpbnRlcm5hbCAqL1xuICBbSW5saW5lRm9yZWlnbktleXNdID0gW107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0VuYWJsZVJMU10gPSBmYWxzZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQnVpbGRlcl0gPSB2b2lkIDA7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0NvbHVtbnNdID0ge307XG59XG5mdW5jdGlvbiBwZ1RhYmxlV2l0aFNjaGVtYShuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZywgc2NoZW1hLCBiYXNlTmFtZSA9IG5hbWUpIHtcbiAgY29uc3QgcmF3VGFibGUgPSBuZXcgUGdUYWJsZShuYW1lLCBzY2hlbWEsIGJhc2VOYW1lKTtcbiAgY29uc3QgcGFyc2VkQ29sdW1ucyA9IHR5cGVvZiBjb2x1bW5zID09PSBcImZ1bmN0aW9uXCIgPyBjb2x1bW5zKGdldFBnQ29sdW1uQnVpbGRlcnMoKSkgOiBjb2x1bW5zO1xuICBjb25zdCBidWlsdENvbHVtbnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMocGFyc2VkQ29sdW1ucykubWFwKChbbmFtZTIsIGNvbEJ1aWxkZXJCYXNlXSkgPT4ge1xuICAgICAgY29uc3QgY29sQnVpbGRlciA9IGNvbEJ1aWxkZXJCYXNlO1xuICAgICAgY29sQnVpbGRlci5zZXROYW1lKG5hbWUyKTtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbEJ1aWxkZXIuYnVpbGQocmF3VGFibGUpO1xuICAgICAgcmF3VGFibGVbSW5saW5lRm9yZWlnbktleXNdLnB1c2goLi4uY29sQnVpbGRlci5idWlsZEZvcmVpZ25LZXlzKGNvbHVtbiwgcmF3VGFibGUpKTtcbiAgICAgIHJldHVybiBbbmFtZTIsIGNvbHVtbl07XG4gICAgfSlcbiAgKTtcbiAgY29uc3QgYnVpbHRDb2x1bW5zRm9yRXh0cmFDb25maWcgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMocGFyc2VkQ29sdW1ucykubWFwKChbbmFtZTIsIGNvbEJ1aWxkZXJCYXNlXSkgPT4ge1xuICAgICAgY29uc3QgY29sQnVpbGRlciA9IGNvbEJ1aWxkZXJCYXNlO1xuICAgICAgY29sQnVpbGRlci5zZXROYW1lKG5hbWUyKTtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbEJ1aWxkZXIuYnVpbGRFeHRyYUNvbmZpZ0NvbHVtbihyYXdUYWJsZSk7XG4gICAgICByZXR1cm4gW25hbWUyLCBjb2x1bW5dO1xuICAgIH0pXG4gICk7XG4gIGNvbnN0IHRhYmxlID0gT2JqZWN0LmFzc2lnbihyYXdUYWJsZSwgYnVpbHRDb2x1bW5zKTtcbiAgdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdID0gYnVpbHRDb2x1bW5zO1xuICB0YWJsZVtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdDb2x1bW5zXSA9IGJ1aWx0Q29sdW1uc0ZvckV4dHJhQ29uZmlnO1xuICBpZiAoZXh0cmFDb25maWcpIHtcbiAgICB0YWJsZVtQZ1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0J1aWxkZXJdID0gZXh0cmFDb25maWc7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGFibGUsIHtcbiAgICBlbmFibGVSTFM6ICgpID0+IHtcbiAgICAgIHRhYmxlW1BnVGFibGUuU3ltYm9sLkVuYWJsZVJMU10gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH1cbiAgfSk7XG59XG5jb25zdCBwZ1RhYmxlID0gKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnKSA9PiB7XG4gIHJldHVybiBwZ1RhYmxlV2l0aFNjaGVtYShuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZywgdm9pZCAwKTtcbn07XG5mdW5jdGlvbiBwZ1RhYmxlQ3JlYXRvcihjdXN0b21pemVUYWJsZU5hbWUpIHtcbiAgcmV0dXJuIChuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZykgPT4ge1xuICAgIHJldHVybiBwZ1RhYmxlV2l0aFNjaGVtYShjdXN0b21pemVUYWJsZU5hbWUobmFtZSksIGNvbHVtbnMsIGV4dHJhQ29uZmlnLCB2b2lkIDAsIG5hbWUpO1xuICB9O1xufVxuZXhwb3J0IHtcbiAgRW5hYmxlUkxTLFxuICBJbmxpbmVGb3JlaWduS2V5cyxcbiAgUGdUYWJsZSxcbiAgcGdUYWJsZSxcbiAgcGdUYWJsZUNyZWF0b3IsXG4gIHBnVGFibGVXaXRoU2NoZW1hXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFibGUuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUGdUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5mdW5jdGlvbiBwcmltYXJ5S2V5KC4uLmNvbmZpZykge1xuICBpZiAoY29uZmlnWzBdLmNvbHVtbnMpIHtcbiAgICByZXR1cm4gbmV3IFByaW1hcnlLZXlCdWlsZGVyKGNvbmZpZ1swXS5jb2x1bW5zLCBjb25maWdbMF0ubmFtZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBQcmltYXJ5S2V5QnVpbGRlcihjb25maWcpO1xufVxuY2xhc3MgUHJpbWFyeUtleUJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ1ByaW1hcnlLZXlCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29sdW1ucztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBuYW1lO1xuICBjb25zdHJ1Y3Rvcihjb2x1bW5zLCBuYW1lKSB7XG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFByaW1hcnlLZXkodGFibGUsIHRoaXMuY29sdW1ucywgdGhpcy5uYW1lKTtcbiAgfVxufVxuY2xhc3MgUHJpbWFyeUtleSB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb2x1bW5zLCBuYW1lKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ1ByaW1hcnlLZXlcIjtcbiAgY29sdW1ucztcbiAgbmFtZTtcbiAgZ2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lID8/IGAke3RoaXMudGFibGVbUGdUYWJsZS5TeW1ib2wuTmFtZV19XyR7dGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSkuam9pbihcIl9cIil9X3BrYDtcbiAgfVxufVxuZXhwb3J0IHtcbiAgUHJpbWFyeUtleSxcbiAgUHJpbWFyeUtleUJ1aWxkZXIsXG4gIHByaW1hcnlLZXlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcmltYXJ5LWtleXMuanMubWFwIiwKICAgICJpbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi4vLi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBpcyB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlLmpzXCI7XG5pbXBvcnQge1xuICBpc0RyaXZlclZhbHVlRW5jb2RlcixcbiAgaXNTUUxXcmFwcGVyLFxuICBQYXJhbSxcbiAgUGxhY2Vob2xkZXIsXG4gIFNRTCxcbiAgc3FsLFxuICBTdHJpbmdDaHVuayxcbiAgVmlld1xufSBmcm9tIFwiLi4vc3FsLmpzXCI7XG5mdW5jdGlvbiBiaW5kSWZQYXJhbSh2YWx1ZSwgY29sdW1uKSB7XG4gIGlmIChpc0RyaXZlclZhbHVlRW5jb2Rlcihjb2x1bW4pICYmICFpc1NRTFdyYXBwZXIodmFsdWUpICYmICFpcyh2YWx1ZSwgUGFyYW0pICYmICFpcyh2YWx1ZSwgUGxhY2Vob2xkZXIpICYmICFpcyh2YWx1ZSwgQ29sdW1uKSAmJiAhaXModmFsdWUsIFRhYmxlKSAmJiAhaXModmFsdWUsIFZpZXcpKSB7XG4gICAgcmV0dXJuIG5ldyBQYXJhbSh2YWx1ZSwgY29sdW1uKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5jb25zdCBlcSA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPSAke2JpbmRJZlBhcmFtKHJpZ2h0LCBsZWZ0KX1gO1xufTtcbmNvbnN0IG5lID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIHJldHVybiBzcWxgJHtsZWZ0fSA8PiAke2JpbmRJZlBhcmFtKHJpZ2h0LCBsZWZ0KX1gO1xufTtcbmZ1bmN0aW9uIGFuZCguLi51bmZpbHRlcmVkQ29uZGl0aW9ucykge1xuICBjb25zdCBjb25kaXRpb25zID0gdW5maWx0ZXJlZENvbmRpdGlvbnMuZmlsdGVyKFxuICAgIChjKSA9PiBjICE9PSB2b2lkIDBcbiAgKTtcbiAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gbmV3IFNRTChjb25kaXRpb25zKTtcbiAgfVxuICByZXR1cm4gbmV3IFNRTChbXG4gICAgbmV3IFN0cmluZ0NodW5rKFwiKFwiKSxcbiAgICBzcWwuam9pbihjb25kaXRpb25zLCBuZXcgU3RyaW5nQ2h1bmsoXCIgYW5kIFwiKSksXG4gICAgbmV3IFN0cmluZ0NodW5rKFwiKVwiKVxuICBdKTtcbn1cbmZ1bmN0aW9uIG9yKC4uLnVuZmlsdGVyZWRDb25kaXRpb25zKSB7XG4gIGNvbnN0IGNvbmRpdGlvbnMgPSB1bmZpbHRlcmVkQ29uZGl0aW9ucy5maWx0ZXIoXG4gICAgKGMpID0+IGMgIT09IHZvaWQgMFxuICApO1xuICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBuZXcgU1FMKGNvbmRpdGlvbnMpO1xuICB9XG4gIHJldHVybiBuZXcgU1FMKFtcbiAgICBuZXcgU3RyaW5nQ2h1bmsoXCIoXCIpLFxuICAgIHNxbC5qb2luKGNvbmRpdGlvbnMsIG5ldyBTdHJpbmdDaHVuayhcIiBvciBcIikpLFxuICAgIG5ldyBTdHJpbmdDaHVuayhcIilcIilcbiAgXSk7XG59XG5mdW5jdGlvbiBub3QoY29uZGl0aW9uKSB7XG4gIHJldHVybiBzcWxgbm90ICR7Y29uZGl0aW9ufWA7XG59XG5jb25zdCBndCA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPiAke2JpbmRJZlBhcmFtKHJpZ2h0LCBsZWZ0KX1gO1xufTtcbmNvbnN0IGd0ZSA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPj0gJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5jb25zdCBsdCA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPCAke2JpbmRJZlBhcmFtKHJpZ2h0LCBsZWZ0KX1gO1xufTtcbmNvbnN0IGx0ZSA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPD0gJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5mdW5jdGlvbiBpbkFycmF5KGNvbHVtbiwgdmFsdWVzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHNxbGBmYWxzZWA7XG4gICAgfVxuICAgIHJldHVybiBzcWxgJHtjb2x1bW59IGluICR7dmFsdWVzLm1hcCgodikgPT4gYmluZElmUGFyYW0odiwgY29sdW1uKSl9YDtcbiAgfVxuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBpbiAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xufVxuZnVuY3Rpb24gbm90SW5BcnJheShjb2x1bW4sIHZhbHVlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBzcWxgdHJ1ZWA7XG4gICAgfVxuICAgIHJldHVybiBzcWxgJHtjb2x1bW59IG5vdCBpbiAke3ZhbHVlcy5tYXAoKHYpID0+IGJpbmRJZlBhcmFtKHYsIGNvbHVtbikpfWA7XG4gIH1cbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gbm90IGluICR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG59XG5mdW5jdGlvbiBpc051bGwodmFsdWUpIHtcbiAgcmV0dXJuIHNxbGAke3ZhbHVlfSBpcyBudWxsYDtcbn1cbmZ1bmN0aW9uIGlzTm90TnVsbCh2YWx1ZSkge1xuICByZXR1cm4gc3FsYCR7dmFsdWV9IGlzIG5vdCBudWxsYDtcbn1cbmZ1bmN0aW9uIGV4aXN0cyhzdWJxdWVyeSkge1xuICByZXR1cm4gc3FsYGV4aXN0cyAke3N1YnF1ZXJ5fWA7XG59XG5mdW5jdGlvbiBub3RFeGlzdHMoc3VicXVlcnkpIHtcbiAgcmV0dXJuIHNxbGBub3QgZXhpc3RzICR7c3VicXVlcnl9YDtcbn1cbmZ1bmN0aW9uIGJldHdlZW4oY29sdW1uLCBtaW4sIG1heCkge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBiZXR3ZWVuICR7YmluZElmUGFyYW0obWluLCBjb2x1bW4pfSBhbmQgJHtiaW5kSWZQYXJhbShcbiAgICBtYXgsXG4gICAgY29sdW1uXG4gICl9YDtcbn1cbmZ1bmN0aW9uIG5vdEJldHdlZW4oY29sdW1uLCBtaW4sIG1heCkge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBub3QgYmV0d2VlbiAke2JpbmRJZlBhcmFtKFxuICAgIG1pbixcbiAgICBjb2x1bW5cbiAgKX0gYW5kICR7YmluZElmUGFyYW0obWF4LCBjb2x1bW4pfWA7XG59XG5mdW5jdGlvbiBsaWtlKGNvbHVtbiwgdmFsdWUpIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gbGlrZSAke3ZhbHVlfWA7XG59XG5mdW5jdGlvbiBub3RMaWtlKGNvbHVtbiwgdmFsdWUpIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gbm90IGxpa2UgJHt2YWx1ZX1gO1xufVxuZnVuY3Rpb24gaWxpa2UoY29sdW1uLCB2YWx1ZSkge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBpbGlrZSAke3ZhbHVlfWA7XG59XG5mdW5jdGlvbiBub3RJbGlrZShjb2x1bW4sIHZhbHVlKSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IG5vdCBpbGlrZSAke3ZhbHVlfWA7XG59XG5mdW5jdGlvbiBhcnJheUNvbnRhaW5zKGNvbHVtbiwgdmFsdWVzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXJyYXlDb250YWlucyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdmFsdWVcIik7XG4gICAgfVxuICAgIGNvbnN0IGFycmF5ID0gc3FsYCR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG4gICAgcmV0dXJuIHNxbGAke2NvbHVtbn0gQD4gJHthcnJheX1gO1xuICB9XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IEA+ICR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG59XG5mdW5jdGlvbiBhcnJheUNvbnRhaW5lZChjb2x1bW4sIHZhbHVlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFycmF5Q29udGFpbmVkIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSB2YWx1ZVwiKTtcbiAgICB9XG4gICAgY29uc3QgYXJyYXkgPSBzcWxgJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbiAgICByZXR1cm4gc3FsYCR7Y29sdW1ufSA8QCAke2FycmF5fWA7XG4gIH1cbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gPEAgJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbn1cbmZ1bmN0aW9uIGFycmF5T3ZlcmxhcHMoY29sdW1uLCB2YWx1ZXMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhcnJheU92ZXJsYXBzIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSB2YWx1ZVwiKTtcbiAgICB9XG4gICAgY29uc3QgYXJyYXkgPSBzcWxgJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbiAgICByZXR1cm4gc3FsYCR7Y29sdW1ufSAmJiAke2FycmF5fWA7XG4gIH1cbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gJiYgJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbn1cbmV4cG9ydCB7XG4gIGFuZCxcbiAgYXJyYXlDb250YWluZWQsXG4gIGFycmF5Q29udGFpbnMsXG4gIGFycmF5T3ZlcmxhcHMsXG4gIGJldHdlZW4sXG4gIGJpbmRJZlBhcmFtLFxuICBlcSxcbiAgZXhpc3RzLFxuICBndCxcbiAgZ3RlLFxuICBpbGlrZSxcbiAgaW5BcnJheSxcbiAgaXNOb3ROdWxsLFxuICBpc051bGwsXG4gIGxpa2UsXG4gIGx0LFxuICBsdGUsXG4gIG5lLFxuICBub3QsXG4gIG5vdEJldHdlZW4sXG4gIG5vdEV4aXN0cyxcbiAgbm90SWxpa2UsXG4gIG5vdEluQXJyYXksXG4gIG5vdExpa2UsXG4gIG9yXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uZGl0aW9ucy5qcy5tYXAiLAogICAgImltcG9ydCB7IHNxbCB9IGZyb20gXCIuLi9zcWwuanNcIjtcbmZ1bmN0aW9uIGFzYyhjb2x1bW4pIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gYXNjYDtcbn1cbmZ1bmN0aW9uIGRlc2MoY29sdW1uKSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IGRlc2NgO1xufVxuZXhwb3J0IHtcbiAgYXNjLFxuICBkZXNjXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VsZWN0LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZ2V0VGFibGVVbmlxdWVOYW1lLCBUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBQcmltYXJ5S2V5QnVpbGRlciB9IGZyb20gXCIuL3BnLWNvcmUvcHJpbWFyeS1rZXlzLmpzXCI7XG5pbXBvcnQge1xuICBhbmQsXG4gIGFzYyxcbiAgYmV0d2VlbixcbiAgZGVzYyxcbiAgZXEsXG4gIGV4aXN0cyxcbiAgZ3QsXG4gIGd0ZSxcbiAgaWxpa2UsXG4gIGluQXJyYXksXG4gIGlzTm90TnVsbCxcbiAgaXNOdWxsLFxuICBsaWtlLFxuICBsdCxcbiAgbHRlLFxuICBuZSxcbiAgbm90LFxuICBub3RCZXR3ZWVuLFxuICBub3RFeGlzdHMsXG4gIG5vdElsaWtlLFxuICBub3RJbkFycmF5LFxuICBub3RMaWtlLFxuICBvclxufSBmcm9tIFwiLi9zcWwvZXhwcmVzc2lvbnMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNRTCwgc3FsIH0gZnJvbSBcIi4vc3FsL3NxbC5qc1wiO1xuY2xhc3MgUmVsYXRpb24ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2VUYWJsZSwgcmVmZXJlbmNlZFRhYmxlLCByZWxhdGlvbk5hbWUpIHtcbiAgICB0aGlzLnNvdXJjZVRhYmxlID0gc291cmNlVGFibGU7XG4gICAgdGhpcy5yZWZlcmVuY2VkVGFibGUgPSByZWZlcmVuY2VkVGFibGU7XG4gICAgdGhpcy5yZWxhdGlvbk5hbWUgPSByZWxhdGlvbk5hbWU7XG4gICAgdGhpcy5yZWZlcmVuY2VkVGFibGVOYW1lID0gcmVmZXJlbmNlZFRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJSZWxhdGlvblwiO1xuICByZWZlcmVuY2VkVGFibGVOYW1lO1xuICBmaWVsZE5hbWU7XG59XG5jbGFzcyBSZWxhdGlvbnMge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlJlbGF0aW9uc1wiO1xufVxuY2xhc3MgT25lIGV4dGVuZHMgUmVsYXRpb24ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2VUYWJsZSwgcmVmZXJlbmNlZFRhYmxlLCBjb25maWcsIGlzTnVsbGFibGUpIHtcbiAgICBzdXBlcihzb3VyY2VUYWJsZSwgcmVmZXJlbmNlZFRhYmxlLCBjb25maWc/LnJlbGF0aW9uTmFtZSk7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5pc051bGxhYmxlID0gaXNOdWxsYWJsZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJPbmVcIjtcbiAgd2l0aEZpZWxkTmFtZShmaWVsZE5hbWUpIHtcbiAgICBjb25zdCByZWxhdGlvbiA9IG5ldyBPbmUoXG4gICAgICB0aGlzLnNvdXJjZVRhYmxlLFxuICAgICAgdGhpcy5yZWZlcmVuY2VkVGFibGUsXG4gICAgICB0aGlzLmNvbmZpZyxcbiAgICAgIHRoaXMuaXNOdWxsYWJsZVxuICAgICk7XG4gICAgcmVsYXRpb24uZmllbGROYW1lID0gZmllbGROYW1lO1xuICAgIHJldHVybiByZWxhdGlvbjtcbiAgfVxufVxuY2xhc3MgTWFueSBleHRlbmRzIFJlbGF0aW9uIHtcbiAgY29uc3RydWN0b3Ioc291cmNlVGFibGUsIHJlZmVyZW5jZWRUYWJsZSwgY29uZmlnKSB7XG4gICAgc3VwZXIoc291cmNlVGFibGUsIHJlZmVyZW5jZWRUYWJsZSwgY29uZmlnPy5yZWxhdGlvbk5hbWUpO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIk1hbnlcIjtcbiAgd2l0aEZpZWxkTmFtZShmaWVsZE5hbWUpIHtcbiAgICBjb25zdCByZWxhdGlvbiA9IG5ldyBNYW55KFxuICAgICAgdGhpcy5zb3VyY2VUYWJsZSxcbiAgICAgIHRoaXMucmVmZXJlbmNlZFRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICAgIHJlbGF0aW9uLmZpZWxkTmFtZSA9IGZpZWxkTmFtZTtcbiAgICByZXR1cm4gcmVsYXRpb247XG4gIH1cbn1cbmZ1bmN0aW9uIGdldE9wZXJhdG9ycygpIHtcbiAgcmV0dXJuIHtcbiAgICBhbmQsXG4gICAgYmV0d2VlbixcbiAgICBlcSxcbiAgICBleGlzdHMsXG4gICAgZ3QsXG4gICAgZ3RlLFxuICAgIGlsaWtlLFxuICAgIGluQXJyYXksXG4gICAgaXNOdWxsLFxuICAgIGlzTm90TnVsbCxcbiAgICBsaWtlLFxuICAgIGx0LFxuICAgIGx0ZSxcbiAgICBuZSxcbiAgICBub3QsXG4gICAgbm90QmV0d2VlbixcbiAgICBub3RFeGlzdHMsXG4gICAgbm90TGlrZSxcbiAgICBub3RJbGlrZSxcbiAgICBub3RJbkFycmF5LFxuICAgIG9yLFxuICAgIHNxbFxuICB9O1xufVxuZnVuY3Rpb24gZ2V0T3JkZXJCeU9wZXJhdG9ycygpIHtcbiAgcmV0dXJuIHtcbiAgICBzcWwsXG4gICAgYXNjLFxuICAgIGRlc2NcbiAgfTtcbn1cbmZ1bmN0aW9uIGV4dHJhY3RUYWJsZXNSZWxhdGlvbmFsQ29uZmlnKHNjaGVtYSwgY29uZmlnSGVscGVycykge1xuICBpZiAoT2JqZWN0LmtleXMoc2NoZW1hKS5sZW5ndGggPT09IDEgJiYgXCJkZWZhdWx0XCIgaW4gc2NoZW1hICYmICFpcyhzY2hlbWFbXCJkZWZhdWx0XCJdLCBUYWJsZSkpIHtcbiAgICBzY2hlbWEgPSBzY2hlbWFbXCJkZWZhdWx0XCJdO1xuICB9XG4gIGNvbnN0IHRhYmxlTmFtZXNNYXAgPSB7fTtcbiAgY29uc3QgcmVsYXRpb25zQnVmZmVyID0ge307XG4gIGNvbnN0IHRhYmxlc0NvbmZpZyA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWEpKSB7XG4gICAgaWYgKGlzKHZhbHVlLCBUYWJsZSkpIHtcbiAgICAgIGNvbnN0IGRiTmFtZSA9IGdldFRhYmxlVW5pcXVlTmFtZSh2YWx1ZSk7XG4gICAgICBjb25zdCBidWZmZXJlZFJlbGF0aW9ucyA9IHJlbGF0aW9uc0J1ZmZlcltkYk5hbWVdO1xuICAgICAgdGFibGVOYW1lc01hcFtkYk5hbWVdID0ga2V5O1xuICAgICAgdGFibGVzQ29uZmlnW2tleV0gPSB7XG4gICAgICAgIHRzTmFtZToga2V5LFxuICAgICAgICBkYk5hbWU6IHZhbHVlW1RhYmxlLlN5bWJvbC5OYW1lXSxcbiAgICAgICAgc2NoZW1hOiB2YWx1ZVtUYWJsZS5TeW1ib2wuU2NoZW1hXSxcbiAgICAgICAgY29sdW1uczogdmFsdWVbVGFibGUuU3ltYm9sLkNvbHVtbnNdLFxuICAgICAgICByZWxhdGlvbnM6IGJ1ZmZlcmVkUmVsYXRpb25zPy5yZWxhdGlvbnMgPz8ge30sXG4gICAgICAgIHByaW1hcnlLZXk6IGJ1ZmZlcmVkUmVsYXRpb25zPy5wcmltYXJ5S2V5ID8/IFtdXG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgdmFsdWVbVGFibGUuU3ltYm9sLkNvbHVtbnNdXG4gICAgICApKSB7XG4gICAgICAgIGlmIChjb2x1bW4ucHJpbWFyeSkge1xuICAgICAgICAgIHRhYmxlc0NvbmZpZ1trZXldLnByaW1hcnlLZXkucHVzaChjb2x1bW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBleHRyYUNvbmZpZyA9IHZhbHVlW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0J1aWxkZXJdPy4odmFsdWVbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQ29sdW1uc10pO1xuICAgICAgaWYgKGV4dHJhQ29uZmlnKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29uZmlnRW50cnkgb2YgT2JqZWN0LnZhbHVlcyhleHRyYUNvbmZpZykpIHtcbiAgICAgICAgICBpZiAoaXMoY29uZmlnRW50cnksIFByaW1hcnlLZXlCdWlsZGVyKSkge1xuICAgICAgICAgICAgdGFibGVzQ29uZmlnW2tleV0ucHJpbWFyeUtleS5wdXNoKC4uLmNvbmZpZ0VudHJ5LmNvbHVtbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXModmFsdWUsIFJlbGF0aW9ucykpIHtcbiAgICAgIGNvbnN0IGRiTmFtZSA9IGdldFRhYmxlVW5pcXVlTmFtZSh2YWx1ZS50YWJsZSk7XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSB0YWJsZU5hbWVzTWFwW2RiTmFtZV07XG4gICAgICBjb25zdCByZWxhdGlvbnMyID0gdmFsdWUuY29uZmlnKFxuICAgICAgICBjb25maWdIZWxwZXJzKHZhbHVlLnRhYmxlKVxuICAgICAgKTtcbiAgICAgIGxldCBwcmltYXJ5S2V5O1xuICAgICAgZm9yIChjb25zdCBbcmVsYXRpb25OYW1lLCByZWxhdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMocmVsYXRpb25zMikpIHtcbiAgICAgICAgaWYgKHRhYmxlTmFtZSkge1xuICAgICAgICAgIGNvbnN0IHRhYmxlQ29uZmlnID0gdGFibGVzQ29uZmlnW3RhYmxlTmFtZV07XG4gICAgICAgICAgdGFibGVDb25maWcucmVsYXRpb25zW3JlbGF0aW9uTmFtZV0gPSByZWxhdGlvbjtcbiAgICAgICAgICBpZiAocHJpbWFyeUtleSkge1xuICAgICAgICAgICAgdGFibGVDb25maWcucHJpbWFyeUtleS5wdXNoKC4uLnByaW1hcnlLZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIShkYk5hbWUgaW4gcmVsYXRpb25zQnVmZmVyKSkge1xuICAgICAgICAgICAgcmVsYXRpb25zQnVmZmVyW2RiTmFtZV0gPSB7XG4gICAgICAgICAgICAgIHJlbGF0aW9uczoge30sXG4gICAgICAgICAgICAgIHByaW1hcnlLZXlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlbGF0aW9uc0J1ZmZlcltkYk5hbWVdLnJlbGF0aW9uc1tyZWxhdGlvbk5hbWVdID0gcmVsYXRpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgdGFibGVzOiB0YWJsZXNDb25maWcsIHRhYmxlTmFtZXNNYXAgfTtcbn1cbmZ1bmN0aW9uIHJlbGF0aW9ucyh0YWJsZSwgcmVsYXRpb25zMikge1xuICByZXR1cm4gbmV3IFJlbGF0aW9ucyhcbiAgICB0YWJsZSxcbiAgICAoaGVscGVycykgPT4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMocmVsYXRpb25zMihoZWxwZXJzKSkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZS53aXRoRmllbGROYW1lKGtleSlcbiAgICAgIF0pXG4gICAgKVxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlT25lKHNvdXJjZVRhYmxlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBvbmUodGFibGUsIGNvbmZpZykge1xuICAgIHJldHVybiBuZXcgT25lKFxuICAgICAgc291cmNlVGFibGUsXG4gICAgICB0YWJsZSxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGNvbmZpZz8uZmllbGRzLnJlZHVjZSgocmVzLCBmKSA9PiByZXMgJiYgZi5ub3ROdWxsLCB0cnVlKSA/PyBmYWxzZVxuICAgICk7XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVNYW55KHNvdXJjZVRhYmxlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBtYW55KHJlZmVyZW5jZWRUYWJsZSwgY29uZmlnKSB7XG4gICAgcmV0dXJuIG5ldyBNYW55KHNvdXJjZVRhYmxlLCByZWZlcmVuY2VkVGFibGUsIGNvbmZpZyk7XG4gIH07XG59XG5mdW5jdGlvbiBub3JtYWxpemVSZWxhdGlvbihzY2hlbWEsIHRhYmxlTmFtZXNNYXAsIHJlbGF0aW9uKSB7XG4gIGlmIChpcyhyZWxhdGlvbiwgT25lKSAmJiByZWxhdGlvbi5jb25maWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmllbGRzOiByZWxhdGlvbi5jb25maWcuZmllbGRzLFxuICAgICAgcmVmZXJlbmNlczogcmVsYXRpb24uY29uZmlnLnJlZmVyZW5jZXNcbiAgICB9O1xuICB9XG4gIGNvbnN0IHJlZmVyZW5jZWRUYWJsZVRzTmFtZSA9IHRhYmxlTmFtZXNNYXBbZ2V0VGFibGVVbmlxdWVOYW1lKHJlbGF0aW9uLnJlZmVyZW5jZWRUYWJsZSldO1xuICBpZiAoIXJlZmVyZW5jZWRUYWJsZVRzTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUYWJsZSBcIiR7cmVsYXRpb24ucmVmZXJlbmNlZFRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXX1cIiBub3QgZm91bmQgaW4gc2NoZW1hYFxuICAgICk7XG4gIH1cbiAgY29uc3QgcmVmZXJlbmNlZFRhYmxlQ29uZmlnID0gc2NoZW1hW3JlZmVyZW5jZWRUYWJsZVRzTmFtZV07XG4gIGlmICghcmVmZXJlbmNlZFRhYmxlQ29uZmlnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7cmVmZXJlbmNlZFRhYmxlVHNOYW1lfVwiIG5vdCBmb3VuZCBpbiBzY2hlbWFgKTtcbiAgfVxuICBjb25zdCBzb3VyY2VUYWJsZSA9IHJlbGF0aW9uLnNvdXJjZVRhYmxlO1xuICBjb25zdCBzb3VyY2VUYWJsZVRzTmFtZSA9IHRhYmxlTmFtZXNNYXBbZ2V0VGFibGVVbmlxdWVOYW1lKHNvdXJjZVRhYmxlKV07XG4gIGlmICghc291cmNlVGFibGVUc05hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGFibGUgXCIke3NvdXJjZVRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXX1cIiBub3QgZm91bmQgaW4gc2NoZW1hYFxuICAgICk7XG4gIH1cbiAgY29uc3QgcmV2ZXJzZVJlbGF0aW9ucyA9IFtdO1xuICBmb3IgKGNvbnN0IHJlZmVyZW5jZWRUYWJsZVJlbGF0aW9uIG9mIE9iamVjdC52YWx1ZXMoXG4gICAgcmVmZXJlbmNlZFRhYmxlQ29uZmlnLnJlbGF0aW9uc1xuICApKSB7XG4gICAgaWYgKHJlbGF0aW9uLnJlbGF0aW9uTmFtZSAmJiByZWxhdGlvbiAhPT0gcmVmZXJlbmNlZFRhYmxlUmVsYXRpb24gJiYgcmVmZXJlbmNlZFRhYmxlUmVsYXRpb24ucmVsYXRpb25OYW1lID09PSByZWxhdGlvbi5yZWxhdGlvbk5hbWUgfHwgIXJlbGF0aW9uLnJlbGF0aW9uTmFtZSAmJiByZWZlcmVuY2VkVGFibGVSZWxhdGlvbi5yZWZlcmVuY2VkVGFibGUgPT09IHJlbGF0aW9uLnNvdXJjZVRhYmxlKSB7XG4gICAgICByZXZlcnNlUmVsYXRpb25zLnB1c2gocmVmZXJlbmNlZFRhYmxlUmVsYXRpb24pO1xuICAgIH1cbiAgfVxuICBpZiAocmV2ZXJzZVJlbGF0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgdGhyb3cgcmVsYXRpb24ucmVsYXRpb25OYW1lID8gbmV3IEVycm9yKFxuICAgICAgYFRoZXJlIGFyZSBtdWx0aXBsZSByZWxhdGlvbnMgd2l0aCBuYW1lIFwiJHtyZWxhdGlvbi5yZWxhdGlvbk5hbWV9XCIgaW4gdGFibGUgXCIke3JlZmVyZW5jZWRUYWJsZVRzTmFtZX1cImBcbiAgICApIDogbmV3IEVycm9yKFxuICAgICAgYFRoZXJlIGFyZSBtdWx0aXBsZSByZWxhdGlvbnMgYmV0d2VlbiBcIiR7cmVmZXJlbmNlZFRhYmxlVHNOYW1lfVwiIGFuZCBcIiR7cmVsYXRpb24uc291cmNlVGFibGVbVGFibGUuU3ltYm9sLk5hbWVdfVwiLiBQbGVhc2Ugc3BlY2lmeSByZWxhdGlvbiBuYW1lYFxuICAgICk7XG4gIH1cbiAgaWYgKHJldmVyc2VSZWxhdGlvbnNbMF0gJiYgaXMocmV2ZXJzZVJlbGF0aW9uc1swXSwgT25lKSAmJiByZXZlcnNlUmVsYXRpb25zWzBdLmNvbmZpZykge1xuICAgIHJldHVybiB7XG4gICAgICBmaWVsZHM6IHJldmVyc2VSZWxhdGlvbnNbMF0uY29uZmlnLnJlZmVyZW5jZXMsXG4gICAgICByZWZlcmVuY2VzOiByZXZlcnNlUmVsYXRpb25zWzBdLmNvbmZpZy5maWVsZHNcbiAgICB9O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgVGhlcmUgaXMgbm90IGVub3VnaCBpbmZvcm1hdGlvbiB0byBpbmZlciByZWxhdGlvbiBcIiR7c291cmNlVGFibGVUc05hbWV9LiR7cmVsYXRpb24uZmllbGROYW1lfVwiYFxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlVGFibGVSZWxhdGlvbnNIZWxwZXJzKHNvdXJjZVRhYmxlKSB7XG4gIHJldHVybiB7XG4gICAgb25lOiBjcmVhdGVPbmUoc291cmNlVGFibGUpLFxuICAgIG1hbnk6IGNyZWF0ZU1hbnkoc291cmNlVGFibGUpXG4gIH07XG59XG5mdW5jdGlvbiBtYXBSZWxhdGlvbmFsUm93KHRhYmxlc0NvbmZpZywgdGFibGVDb25maWcsIHJvdywgYnVpbGRRdWVyeVJlc3VsdFNlbGVjdGlvbiwgbWFwQ29sdW1uVmFsdWUgPSAodmFsdWUpID0+IHZhbHVlKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBmb3IgKGNvbnN0IFtcbiAgICBzZWxlY3Rpb25JdGVtSW5kZXgsXG4gICAgc2VsZWN0aW9uSXRlbVxuICBdIG9mIGJ1aWxkUXVlcnlSZXN1bHRTZWxlY3Rpb24uZW50cmllcygpKSB7XG4gICAgaWYgKHNlbGVjdGlvbkl0ZW0uaXNKc29uKSB7XG4gICAgICBjb25zdCByZWxhdGlvbiA9IHRhYmxlQ29uZmlnLnJlbGF0aW9uc1tzZWxlY3Rpb25JdGVtLnRzS2V5XTtcbiAgICAgIGNvbnN0IHJhd1N1YlJvd3MgPSByb3dbc2VsZWN0aW9uSXRlbUluZGV4XTtcbiAgICAgIGNvbnN0IHN1YlJvd3MgPSB0eXBlb2YgcmF3U3ViUm93cyA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2UocmF3U3ViUm93cykgOiByYXdTdWJSb3dzO1xuICAgICAgcmVzdWx0W3NlbGVjdGlvbkl0ZW0udHNLZXldID0gaXMocmVsYXRpb24sIE9uZSkgPyBzdWJSb3dzICYmIG1hcFJlbGF0aW9uYWxSb3coXG4gICAgICAgIHRhYmxlc0NvbmZpZyxcbiAgICAgICAgdGFibGVzQ29uZmlnW3NlbGVjdGlvbkl0ZW0ucmVsYXRpb25UYWJsZVRzS2V5XSxcbiAgICAgICAgc3ViUm93cyxcbiAgICAgICAgc2VsZWN0aW9uSXRlbS5zZWxlY3Rpb24sXG4gICAgICAgIG1hcENvbHVtblZhbHVlXG4gICAgICApIDogc3ViUm93cy5tYXAoXG4gICAgICAgIChzdWJSb3cpID0+IG1hcFJlbGF0aW9uYWxSb3coXG4gICAgICAgICAgdGFibGVzQ29uZmlnLFxuICAgICAgICAgIHRhYmxlc0NvbmZpZ1tzZWxlY3Rpb25JdGVtLnJlbGF0aW9uVGFibGVUc0tleV0sXG4gICAgICAgICAgc3ViUm93LFxuICAgICAgICAgIHNlbGVjdGlvbkl0ZW0uc2VsZWN0aW9uLFxuICAgICAgICAgIG1hcENvbHVtblZhbHVlXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gbWFwQ29sdW1uVmFsdWUocm93W3NlbGVjdGlvbkl0ZW1JbmRleF0pO1xuICAgICAgY29uc3QgZmllbGQgPSBzZWxlY3Rpb25JdGVtLmZpZWxkO1xuICAgICAgbGV0IGRlY29kZXI7XG4gICAgICBpZiAoaXMoZmllbGQsIENvbHVtbikpIHtcbiAgICAgICAgZGVjb2RlciA9IGZpZWxkO1xuICAgICAgfSBlbHNlIGlmIChpcyhmaWVsZCwgU1FMKSkge1xuICAgICAgICBkZWNvZGVyID0gZmllbGQuZGVjb2RlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlY29kZXIgPSBmaWVsZC5zcWwuZGVjb2RlcjtcbiAgICAgIH1cbiAgICAgIHJlc3VsdFtzZWxlY3Rpb25JdGVtLnRzS2V5XSA9IHZhbHVlID09PSBudWxsID8gbnVsbCA6IGRlY29kZXIubWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCB7XG4gIE1hbnksXG4gIE9uZSxcbiAgUmVsYXRpb24sXG4gIFJlbGF0aW9ucyxcbiAgY3JlYXRlTWFueSxcbiAgY3JlYXRlT25lLFxuICBjcmVhdGVUYWJsZVJlbGF0aW9uc0hlbHBlcnMsXG4gIGV4dHJhY3RUYWJsZXNSZWxhdGlvbmFsQ29uZmlnLFxuICBnZXRPcGVyYXRvcnMsXG4gIGdldE9yZGVyQnlPcGVyYXRvcnMsXG4gIG1hcFJlbGF0aW9uYWxSb3csXG4gIG5vcm1hbGl6ZVJlbGF0aW9uLFxuICByZWxhdGlvbnNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWxhdGlvbnMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVmlldyB9IGZyb20gXCIuLi9zcWwvc3FsLmpzXCI7XG5jbGFzcyBTUUxpdGVWaWV3QmFzZSBleHRlbmRzIFZpZXcge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVWaWV3QmFzZVwiO1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlVmlld0Jhc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD12aWV3LWJhc2UuanMubWFwIiwKICAgICJpbXBvcnQgeyBhbGlhc2VkVGFibGUsIGFsaWFzZWRUYWJsZUNvbHVtbiwgbWFwQ29sdW1uc0luQWxpYXNlZFNRTFRvQWxpYXMsIG1hcENvbHVtbnNJblNRTFRvQWxpYXMgfSBmcm9tIFwiLi4vYWxpYXMuanNcIjtcbmltcG9ydCB7IENhc2luZ0NhY2hlIH0gZnJvbSBcIi4uL2Nhc2luZy5qc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBEcml6emxlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQge1xuICBnZXRPcGVyYXRvcnMsXG4gIGdldE9yZGVyQnlPcGVyYXRvcnMsXG4gIE1hbnksXG4gIG5vcm1hbGl6ZVJlbGF0aW9uLFxuICBPbmVcbn0gZnJvbSBcIi4uL3JlbGF0aW9ucy5qc1wiO1xuaW1wb3J0IHsgYW5kLCBlcSB9IGZyb20gXCIuLi9zcWwvaW5kZXguanNcIjtcbmltcG9ydCB7IFBhcmFtLCBTUUwsIHNxbCB9IGZyb20gXCIuLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4gfSBmcm9tIFwiLi9jb2x1bW5zL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBTdWJxdWVyeSB9IGZyb20gXCIuLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgZ2V0VGFibGVOYW1lLCBnZXRUYWJsZVVuaXF1ZU5hbWUsIFRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBvcmRlclNlbGVjdGVkRmllbGRzIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuLi92aWV3LWNvbW1vbi5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVmlld0Jhc2UgfSBmcm9tIFwiLi92aWV3LWJhc2UuanNcIjtcbmNsYXNzIFNRTGl0ZURpYWxlY3Qge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVEaWFsZWN0XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY2FzaW5nO1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLmNhc2luZyA9IG5ldyBDYXNpbmdDYWNoZShjb25maWc/LmNhc2luZyk7XG4gIH1cbiAgZXNjYXBlTmFtZShuYW1lKSB7XG4gICAgcmV0dXJuIGBcIiR7bmFtZX1cImA7XG4gIH1cbiAgZXNjYXBlUGFyYW0oX251bSkge1xuICAgIHJldHVybiBcIj9cIjtcbiAgfVxuICBlc2NhcGVTdHJpbmcoc3RyKSB7XG4gICAgcmV0dXJuIGAnJHtzdHIucmVwbGFjZSgvJy9nLCBcIicnXCIpfSdgO1xuICB9XG4gIGJ1aWxkV2l0aENURShxdWVyaWVzKSB7XG4gICAgaWYgKCFxdWVyaWVzPy5sZW5ndGgpIHJldHVybiB2b2lkIDA7XG4gICAgY29uc3Qgd2l0aFNxbENodW5rcyA9IFtzcWxgd2l0aCBgXTtcbiAgICBmb3IgKGNvbnN0IFtpLCB3XSBvZiBxdWVyaWVzLmVudHJpZXMoKSkge1xuICAgICAgd2l0aFNxbENodW5rcy5wdXNoKHNxbGAke3NxbC5pZGVudGlmaWVyKHcuXy5hbGlhcyl9IGFzICgke3cuXy5zcWx9KWApO1xuICAgICAgaWYgKGkgPCBxdWVyaWVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgd2l0aFNxbENodW5rcy5wdXNoKHNxbGAsIGApO1xuICAgICAgfVxuICAgIH1cbiAgICB3aXRoU3FsQ2h1bmtzLnB1c2goc3FsYCBgKTtcbiAgICByZXR1cm4gc3FsLmpvaW4od2l0aFNxbENodW5rcyk7XG4gIH1cbiAgYnVpbGREZWxldGVRdWVyeSh7IHRhYmxlLCB3aGVyZSwgcmV0dXJuaW5nLCB3aXRoTGlzdCwgbGltaXQsIG9yZGVyQnkgfSkge1xuICAgIGNvbnN0IHdpdGhTcWwgPSB0aGlzLmJ1aWxkV2l0aENURSh3aXRoTGlzdCk7XG4gICAgY29uc3QgcmV0dXJuaW5nU3FsID0gcmV0dXJuaW5nID8gc3FsYCByZXR1cm5pbmcgJHt0aGlzLmJ1aWxkU2VsZWN0aW9uKHJldHVybmluZywgeyBpc1NpbmdsZVRhYmxlOiB0cnVlIH0pfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgd2hlcmVTcWwgPSB3aGVyZSA/IHNxbGAgd2hlcmUgJHt3aGVyZX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IG9yZGVyQnlTcWwgPSB0aGlzLmJ1aWxkT3JkZXJCeShvcmRlckJ5KTtcbiAgICBjb25zdCBsaW1pdFNxbCA9IHRoaXMuYnVpbGRMaW1pdChsaW1pdCk7XG4gICAgcmV0dXJuIHNxbGAke3dpdGhTcWx9ZGVsZXRlIGZyb20gJHt0YWJsZX0ke3doZXJlU3FsfSR7cmV0dXJuaW5nU3FsfSR7b3JkZXJCeVNxbH0ke2xpbWl0U3FsfWA7XG4gIH1cbiAgYnVpbGRVcGRhdGVTZXQodGFibGUsIHNldCkge1xuICAgIGNvbnN0IHRhYmxlQ29sdW1ucyA9IHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXTtcbiAgICBjb25zdCBjb2x1bW5OYW1lcyA9IE9iamVjdC5rZXlzKHRhYmxlQ29sdW1ucykuZmlsdGVyKFxuICAgICAgKGNvbE5hbWUpID0+IHNldFtjb2xOYW1lXSAhPT0gdm9pZCAwIHx8IHRhYmxlQ29sdW1uc1tjb2xOYW1lXT8ub25VcGRhdGVGbiAhPT0gdm9pZCAwXG4gICAgKTtcbiAgICBjb25zdCBzZXRTaXplID0gY29sdW1uTmFtZXMubGVuZ3RoO1xuICAgIHJldHVybiBzcWwuam9pbihjb2x1bW5OYW1lcy5mbGF0TWFwKChjb2xOYW1lLCBpKSA9PiB7XG4gICAgICBjb25zdCBjb2wgPSB0YWJsZUNvbHVtbnNbY29sTmFtZV07XG4gICAgICBjb25zdCB2YWx1ZSA9IHNldFtjb2xOYW1lXSA/PyBzcWwucGFyYW0oY29sLm9uVXBkYXRlRm4oKSwgY29sKTtcbiAgICAgIGNvbnN0IHJlcyA9IHNxbGAke3NxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhjb2wpKX0gPSAke3ZhbHVlfWA7XG4gICAgICBpZiAoaSA8IHNldFNpemUgLSAxKSB7XG4gICAgICAgIHJldHVybiBbcmVzLCBzcWwucmF3KFwiLCBcIildO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtyZXNdO1xuICAgIH0pKTtcbiAgfVxuICBidWlsZFVwZGF0ZVF1ZXJ5KHsgdGFibGUsIHNldCwgd2hlcmUsIHJldHVybmluZywgd2l0aExpc3QsIGpvaW5zLCBmcm9tLCBsaW1pdCwgb3JkZXJCeSB9KSB7XG4gICAgY29uc3Qgd2l0aFNxbCA9IHRoaXMuYnVpbGRXaXRoQ1RFKHdpdGhMaXN0KTtcbiAgICBjb25zdCBzZXRTcWwgPSB0aGlzLmJ1aWxkVXBkYXRlU2V0KHRhYmxlLCBzZXQpO1xuICAgIGNvbnN0IGZyb21TcWwgPSBmcm9tICYmIHNxbC5qb2luKFtzcWwucmF3KFwiIGZyb20gXCIpLCB0aGlzLmJ1aWxkRnJvbVRhYmxlKGZyb20pXSk7XG4gICAgY29uc3Qgam9pbnNTcWwgPSB0aGlzLmJ1aWxkSm9pbnMoam9pbnMpO1xuICAgIGNvbnN0IHJldHVybmluZ1NxbCA9IHJldHVybmluZyA/IHNxbGAgcmV0dXJuaW5nICR7dGhpcy5idWlsZFNlbGVjdGlvbihyZXR1cm5pbmcsIHsgaXNTaW5nbGVUYWJsZTogdHJ1ZSB9KX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IHdoZXJlU3FsID0gd2hlcmUgPyBzcWxgIHdoZXJlICR7d2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBvcmRlckJ5U3FsID0gdGhpcy5idWlsZE9yZGVyQnkob3JkZXJCeSk7XG4gICAgY29uc3QgbGltaXRTcWwgPSB0aGlzLmJ1aWxkTGltaXQobGltaXQpO1xuICAgIHJldHVybiBzcWxgJHt3aXRoU3FsfXVwZGF0ZSAke3RhYmxlfSBzZXQgJHtzZXRTcWx9JHtmcm9tU3FsfSR7am9pbnNTcWx9JHt3aGVyZVNxbH0ke3JldHVybmluZ1NxbH0ke29yZGVyQnlTcWx9JHtsaW1pdFNxbH1gO1xuICB9XG4gIC8qKlxuICAgKiBCdWlsZHMgc2VsZWN0aW9uIFNRTCB3aXRoIHByb3ZpZGVkIGZpZWxkcy9leHByZXNzaW9uc1xuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICpcbiAgICogYHNlbGVjdCA8c2VsZWN0aW9uPiBmcm9tYFxuICAgKlxuICAgKiBgaW5zZXJ0IC4uLiByZXR1cm5pbmcgPHNlbGVjdGlvbj5gXG4gICAqXG4gICAqIElmIGBpc1NpbmdsZVRhYmxlYCBpcyB0cnVlLCB0aGVuIGNvbHVtbnMgd29uJ3QgYmUgcHJlZml4ZWQgd2l0aCB0YWJsZSBuYW1lXG4gICAqL1xuICBidWlsZFNlbGVjdGlvbihmaWVsZHMsIHsgaXNTaW5nbGVUYWJsZSA9IGZhbHNlIH0gPSB7fSkge1xuICAgIGNvbnN0IGNvbHVtbnNMZW4gPSBmaWVsZHMubGVuZ3RoO1xuICAgIGNvbnN0IGNodW5rcyA9IGZpZWxkcy5mbGF0TWFwKCh7IGZpZWxkIH0sIGkpID0+IHtcbiAgICAgIGNvbnN0IGNodW5rID0gW107XG4gICAgICBpZiAoaXMoZmllbGQsIFNRTC5BbGlhc2VkKSAmJiBmaWVsZC5pc1NlbGVjdGlvbkZpZWxkKSB7XG4gICAgICAgIGNodW5rLnB1c2goc3FsLmlkZW50aWZpZXIoZmllbGQuZmllbGRBbGlhcykpO1xuICAgICAgfSBlbHNlIGlmIChpcyhmaWVsZCwgU1FMLkFsaWFzZWQpIHx8IGlzKGZpZWxkLCBTUUwpKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaXMoZmllbGQsIFNRTC5BbGlhc2VkKSA/IGZpZWxkLnNxbCA6IGZpZWxkO1xuICAgICAgICBpZiAoaXNTaW5nbGVUYWJsZSkge1xuICAgICAgICAgIGNodW5rLnB1c2goXG4gICAgICAgICAgICBuZXcgU1FMKFxuICAgICAgICAgICAgICBxdWVyeS5xdWVyeUNodW5rcy5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXMoYywgQ29sdW1uKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHNxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhjKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2h1bmsucHVzaChxdWVyeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzKGZpZWxkLCBTUUwuQWxpYXNlZCkpIHtcbiAgICAgICAgICBjaHVuay5wdXNoKHNxbGAgYXMgJHtzcWwuaWRlbnRpZmllcihmaWVsZC5maWVsZEFsaWFzKX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpcyhmaWVsZCwgQ29sdW1uKSkge1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBmaWVsZC50YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV07XG4gICAgICAgIGlmIChmaWVsZC5jb2x1bW5UeXBlID09PSBcIlNRTGl0ZU51bWVyaWNCaWdJbnRcIikge1xuICAgICAgICAgIGlmIChpc1NpbmdsZVRhYmxlKSB7XG4gICAgICAgICAgICBjaHVuay5wdXNoKHNxbGBjYXN0KCR7c3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGZpZWxkKSl9IGFzIHRleHQpYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNodW5rLnB1c2goXG4gICAgICAgICAgICAgIHNxbGBjYXN0KCR7c3FsLmlkZW50aWZpZXIodGFibGVOYW1lKX0uJHtzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoZmllbGQpKX0gYXMgdGV4dClgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaXNTaW5nbGVUYWJsZSkge1xuICAgICAgICAgICAgY2h1bmsucHVzaChzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoZmllbGQpKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNodW5rLnB1c2goc3FsYCR7c3FsLmlkZW50aWZpZXIodGFibGVOYW1lKX0uJHtzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoZmllbGQpKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpIDwgY29sdW1uc0xlbiAtIDEpIHtcbiAgICAgICAgY2h1bmsucHVzaChzcWxgLCBgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaHVuaztcbiAgICB9KTtcbiAgICByZXR1cm4gc3FsLmpvaW4oY2h1bmtzKTtcbiAgfVxuICBidWlsZEpvaW5zKGpvaW5zKSB7XG4gICAgaWYgKCFqb2lucyB8fCBqb2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICAgIGNvbnN0IGpvaW5zQXJyYXkgPSBbXTtcbiAgICBpZiAoam9pbnMpIHtcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBqb2luTWV0YV0gb2Ygam9pbnMuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgIGpvaW5zQXJyYXkucHVzaChzcWxgIGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhYmxlID0gam9pbk1ldGEudGFibGU7XG4gICAgICAgIGNvbnN0IG9uU3FsID0gam9pbk1ldGEub24gPyBzcWxgIG9uICR7am9pbk1ldGEub259YCA6IHZvaWQgMDtcbiAgICAgICAgaWYgKGlzKHRhYmxlLCBTUUxpdGVUYWJsZSkpIHtcbiAgICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSB0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuTmFtZV07XG4gICAgICAgICAgY29uc3QgdGFibGVTY2hlbWEgPSB0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuU2NoZW1hXTtcbiAgICAgICAgICBjb25zdCBvcmlnVGFibGVOYW1lID0gdGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLk9yaWdpbmFsTmFtZV07XG4gICAgICAgICAgY29uc3QgYWxpYXMgPSB0YWJsZU5hbWUgPT09IG9yaWdUYWJsZU5hbWUgPyB2b2lkIDAgOiBqb2luTWV0YS5hbGlhcztcbiAgICAgICAgICBqb2luc0FycmF5LnB1c2goXG4gICAgICAgICAgICBzcWxgJHtzcWwucmF3KGpvaW5NZXRhLmpvaW5UeXBlKX0gam9pbiAke3RhYmxlU2NoZW1hID8gc3FsYCR7c3FsLmlkZW50aWZpZXIodGFibGVTY2hlbWEpfS5gIDogdm9pZCAwfSR7c3FsLmlkZW50aWZpZXIob3JpZ1RhYmxlTmFtZSl9JHthbGlhcyAmJiBzcWxgICR7c3FsLmlkZW50aWZpZXIoYWxpYXMpfWB9JHtvblNxbH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqb2luc0FycmF5LnB1c2goXG4gICAgICAgICAgICBzcWxgJHtzcWwucmF3KGpvaW5NZXRhLmpvaW5UeXBlKX0gam9pbiAke3RhYmxlfSR7b25TcWx9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4IDwgam9pbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGpvaW5zQXJyYXkucHVzaChzcWxgIGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcWwuam9pbihqb2luc0FycmF5KTtcbiAgfVxuICBidWlsZExpbWl0KGxpbWl0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBsaW1pdCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgbGltaXQgPT09IFwibnVtYmVyXCIgJiYgbGltaXQgPj0gMCA/IHNxbGAgbGltaXQgJHtsaW1pdH1gIDogdm9pZCAwO1xuICB9XG4gIGJ1aWxkT3JkZXJCeShvcmRlckJ5KSB7XG4gICAgY29uc3Qgb3JkZXJCeUxpc3QgPSBbXTtcbiAgICBpZiAob3JkZXJCeSkge1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIG9yZGVyQnlWYWx1ZV0gb2Ygb3JkZXJCeS5lbnRyaWVzKCkpIHtcbiAgICAgICAgb3JkZXJCeUxpc3QucHVzaChvcmRlckJ5VmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPCBvcmRlckJ5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBvcmRlckJ5TGlzdC5wdXNoKHNxbGAsIGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvcmRlckJ5TGlzdC5sZW5ndGggPiAwID8gc3FsYCBvcmRlciBieSAke3NxbC5qb2luKG9yZGVyQnlMaXN0KX1gIDogdm9pZCAwO1xuICB9XG4gIGJ1aWxkRnJvbVRhYmxlKHRhYmxlKSB7XG4gICAgaWYgKGlzKHRhYmxlLCBUYWJsZSkgJiYgdGFibGVbVGFibGUuU3ltYm9sLklzQWxpYXNdKSB7XG4gICAgICByZXR1cm4gc3FsYCR7c3FsYCR7c3FsLmlkZW50aWZpZXIodGFibGVbVGFibGUuU3ltYm9sLlNjaGVtYV0gPz8gXCJcIil9LmAuaWYodGFibGVbVGFibGUuU3ltYm9sLlNjaGVtYV0pfSR7c3FsLmlkZW50aWZpZXIodGFibGVbVGFibGUuU3ltYm9sLk9yaWdpbmFsTmFtZV0pfSAke3NxbC5pZGVudGlmaWVyKHRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRhYmxlO1xuICB9XG4gIGJ1aWxkU2VsZWN0UXVlcnkoe1xuICAgIHdpdGhMaXN0LFxuICAgIGZpZWxkcyxcbiAgICBmaWVsZHNGbGF0LFxuICAgIHdoZXJlLFxuICAgIGhhdmluZyxcbiAgICB0YWJsZSxcbiAgICBqb2lucyxcbiAgICBvcmRlckJ5LFxuICAgIGdyb3VwQnksXG4gICAgbGltaXQsXG4gICAgb2Zmc2V0LFxuICAgIGRpc3RpbmN0LFxuICAgIHNldE9wZXJhdG9yc1xuICB9KSB7XG4gICAgY29uc3QgZmllbGRzTGlzdCA9IGZpZWxkc0ZsYXQgPz8gb3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZHMpO1xuICAgIGZvciAoY29uc3QgZiBvZiBmaWVsZHNMaXN0KSB7XG4gICAgICBpZiAoaXMoZi5maWVsZCwgQ29sdW1uKSAmJiBnZXRUYWJsZU5hbWUoZi5maWVsZC50YWJsZSkgIT09IChpcyh0YWJsZSwgU3VicXVlcnkpID8gdGFibGUuXy5hbGlhcyA6IGlzKHRhYmxlLCBTUUxpdGVWaWV3QmFzZSkgPyB0YWJsZVtWaWV3QmFzZUNvbmZpZ10ubmFtZSA6IGlzKHRhYmxlLCBTUUwpID8gdm9pZCAwIDogZ2V0VGFibGVOYW1lKHRhYmxlKSkgJiYgISgodGFibGUyKSA9PiBqb2lucz8uc29tZShcbiAgICAgICAgKHsgYWxpYXMgfSkgPT4gYWxpYXMgPT09ICh0YWJsZTJbVGFibGUuU3ltYm9sLklzQWxpYXNdID8gZ2V0VGFibGVOYW1lKHRhYmxlMikgOiB0YWJsZTJbVGFibGUuU3ltYm9sLkJhc2VOYW1lXSlcbiAgICAgICkpKGYuZmllbGQudGFibGUpKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGdldFRhYmxlTmFtZShmLmZpZWxkLnRhYmxlKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBZb3VyIFwiJHtmLnBhdGguam9pbihcIi0+XCIpfVwiIGZpZWxkIHJlZmVyZW5jZXMgYSBjb2x1bW4gXCIke3RhYmxlTmFtZX1cIi5cIiR7Zi5maWVsZC5uYW1lfVwiLCBidXQgdGhlIHRhYmxlIFwiJHt0YWJsZU5hbWV9XCIgaXMgbm90IHBhcnQgb2YgdGhlIHF1ZXJ5ISBEaWQgeW91IGZvcmdldCB0byBqb2luIGl0P2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaXNTaW5nbGVUYWJsZSA9ICFqb2lucyB8fCBqb2lucy5sZW5ndGggPT09IDA7XG4gICAgY29uc3Qgd2l0aFNxbCA9IHRoaXMuYnVpbGRXaXRoQ1RFKHdpdGhMaXN0KTtcbiAgICBjb25zdCBkaXN0aW5jdFNxbCA9IGRpc3RpbmN0ID8gc3FsYCBkaXN0aW5jdGAgOiB2b2lkIDA7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5idWlsZFNlbGVjdGlvbihmaWVsZHNMaXN0LCB7IGlzU2luZ2xlVGFibGUgfSk7XG4gICAgY29uc3QgdGFibGVTcWwgPSB0aGlzLmJ1aWxkRnJvbVRhYmxlKHRhYmxlKTtcbiAgICBjb25zdCBqb2luc1NxbCA9IHRoaXMuYnVpbGRKb2lucyhqb2lucyk7XG4gICAgY29uc3Qgd2hlcmVTcWwgPSB3aGVyZSA/IHNxbGAgd2hlcmUgJHt3aGVyZX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IGhhdmluZ1NxbCA9IGhhdmluZyA/IHNxbGAgaGF2aW5nICR7aGF2aW5nfWAgOiB2b2lkIDA7XG4gICAgY29uc3QgZ3JvdXBCeUxpc3QgPSBbXTtcbiAgICBpZiAoZ3JvdXBCeSkge1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGdyb3VwQnlWYWx1ZV0gb2YgZ3JvdXBCeS5lbnRyaWVzKCkpIHtcbiAgICAgICAgZ3JvdXBCeUxpc3QucHVzaChncm91cEJ5VmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPCBncm91cEJ5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBncm91cEJ5TGlzdC5wdXNoKHNxbGAsIGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGdyb3VwQnlTcWwgPSBncm91cEJ5TGlzdC5sZW5ndGggPiAwID8gc3FsYCBncm91cCBieSAke3NxbC5qb2luKGdyb3VwQnlMaXN0KX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IG9yZGVyQnlTcWwgPSB0aGlzLmJ1aWxkT3JkZXJCeShvcmRlckJ5KTtcbiAgICBjb25zdCBsaW1pdFNxbCA9IHRoaXMuYnVpbGRMaW1pdChsaW1pdCk7XG4gICAgY29uc3Qgb2Zmc2V0U3FsID0gb2Zmc2V0ID8gc3FsYCBvZmZzZXQgJHtvZmZzZXR9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBmaW5hbFF1ZXJ5ID0gc3FsYCR7d2l0aFNxbH1zZWxlY3Qke2Rpc3RpbmN0U3FsfSAke3NlbGVjdGlvbn0gZnJvbSAke3RhYmxlU3FsfSR7am9pbnNTcWx9JHt3aGVyZVNxbH0ke2dyb3VwQnlTcWx9JHtoYXZpbmdTcWx9JHtvcmRlckJ5U3FsfSR7bGltaXRTcWx9JHtvZmZzZXRTcWx9YDtcbiAgICBpZiAoc2V0T3BlcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkU2V0T3BlcmF0aW9ucyhmaW5hbFF1ZXJ5LCBzZXRPcGVyYXRvcnMpO1xuICAgIH1cbiAgICByZXR1cm4gZmluYWxRdWVyeTtcbiAgfVxuICBidWlsZFNldE9wZXJhdGlvbnMobGVmdFNlbGVjdCwgc2V0T3BlcmF0b3JzKSB7XG4gICAgY29uc3QgW3NldE9wZXJhdG9yLCAuLi5yZXN0XSA9IHNldE9wZXJhdG9ycztcbiAgICBpZiAoIXNldE9wZXJhdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcGFzcyB1bmRlZmluZWQgdmFsdWVzIHRvIGFueSBzZXQgb3BlcmF0b3JcIik7XG4gICAgfVxuICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRTZXRPcGVyYXRpb25RdWVyeSh7IGxlZnRTZWxlY3QsIHNldE9wZXJhdG9yIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5idWlsZFNldE9wZXJhdGlvbnMoXG4gICAgICB0aGlzLmJ1aWxkU2V0T3BlcmF0aW9uUXVlcnkoeyBsZWZ0U2VsZWN0LCBzZXRPcGVyYXRvciB9KSxcbiAgICAgIHJlc3RcbiAgICApO1xuICB9XG4gIGJ1aWxkU2V0T3BlcmF0aW9uUXVlcnkoe1xuICAgIGxlZnRTZWxlY3QsXG4gICAgc2V0T3BlcmF0b3I6IHsgdHlwZSwgaXNBbGwsIHJpZ2h0U2VsZWN0LCBsaW1pdCwgb3JkZXJCeSwgb2Zmc2V0IH1cbiAgfSkge1xuICAgIGNvbnN0IGxlZnRDaHVuayA9IHNxbGAke2xlZnRTZWxlY3QuZ2V0U1FMKCl9IGA7XG4gICAgY29uc3QgcmlnaHRDaHVuayA9IHNxbGAke3JpZ2h0U2VsZWN0LmdldFNRTCgpfWA7XG4gICAgbGV0IG9yZGVyQnlTcWw7XG4gICAgaWYgKG9yZGVyQnkgJiYgb3JkZXJCeS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBvcmRlckJ5VmFsdWVzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHNpbmdsZU9yZGVyQnkgb2Ygb3JkZXJCeSkge1xuICAgICAgICBpZiAoaXMoc2luZ2xlT3JkZXJCeSwgU1FMaXRlQ29sdW1uKSkge1xuICAgICAgICAgIG9yZGVyQnlWYWx1ZXMucHVzaChzcWwuaWRlbnRpZmllcihzaW5nbGVPcmRlckJ5Lm5hbWUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpcyhzaW5nbGVPcmRlckJ5LCBTUUwpKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaW5nbGVPcmRlckJ5LnF1ZXJ5Q2h1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHNpbmdsZU9yZGVyQnkucXVlcnlDaHVua3NbaV07XG4gICAgICAgICAgICBpZiAoaXMoY2h1bmssIFNRTGl0ZUNvbHVtbikpIHtcbiAgICAgICAgICAgICAgc2luZ2xlT3JkZXJCeS5xdWVyeUNodW5rc1tpXSA9IHNxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhjaHVuaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvcmRlckJ5VmFsdWVzLnB1c2goc3FsYCR7c2luZ2xlT3JkZXJCeX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcmRlckJ5VmFsdWVzLnB1c2goc3FsYCR7c2luZ2xlT3JkZXJCeX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb3JkZXJCeVNxbCA9IHNxbGAgb3JkZXIgYnkgJHtzcWwuam9pbihvcmRlckJ5VmFsdWVzLCBzcWxgLCBgKX1gO1xuICAgIH1cbiAgICBjb25zdCBsaW1pdFNxbCA9IHR5cGVvZiBsaW1pdCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgbGltaXQgPT09IFwibnVtYmVyXCIgJiYgbGltaXQgPj0gMCA/IHNxbGAgbGltaXQgJHtsaW1pdH1gIDogdm9pZCAwO1xuICAgIGNvbnN0IG9wZXJhdG9yQ2h1bmsgPSBzcWwucmF3KGAke3R5cGV9ICR7aXNBbGwgPyBcImFsbCBcIiA6IFwiXCJ9YCk7XG4gICAgY29uc3Qgb2Zmc2V0U3FsID0gb2Zmc2V0ID8gc3FsYCBvZmZzZXQgJHtvZmZzZXR9YCA6IHZvaWQgMDtcbiAgICByZXR1cm4gc3FsYCR7bGVmdENodW5rfSR7b3BlcmF0b3JDaHVua30ke3JpZ2h0Q2h1bmt9JHtvcmRlckJ5U3FsfSR7bGltaXRTcWx9JHtvZmZzZXRTcWx9YDtcbiAgfVxuICBidWlsZEluc2VydFF1ZXJ5KHsgdGFibGUsIHZhbHVlczogdmFsdWVzT3JTZWxlY3QsIG9uQ29uZmxpY3QsIHJldHVybmluZywgd2l0aExpc3QsIHNlbGVjdCB9KSB7XG4gICAgY29uc3QgdmFsdWVzU3FsTGlzdCA9IFtdO1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG4gICAgY29uc3QgY29sRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGNvbHVtbnMpLmZpbHRlcihcbiAgICAgIChbXywgY29sXSkgPT4gIWNvbC5zaG91bGREaXNhYmxlSW5zZXJ0KClcbiAgICApO1xuICAgIGNvbnN0IGluc2VydE9yZGVyID0gY29sRW50cmllcy5tYXAoKFssIGNvbHVtbl0pID0+IHNxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhjb2x1bW4pKSk7XG4gICAgaWYgKHNlbGVjdCkge1xuICAgICAgY29uc3Qgc2VsZWN0MiA9IHZhbHVlc09yU2VsZWN0O1xuICAgICAgaWYgKGlzKHNlbGVjdDIsIFNRTCkpIHtcbiAgICAgICAgdmFsdWVzU3FsTGlzdC5wdXNoKHNlbGVjdDIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzU3FsTGlzdC5wdXNoKHNlbGVjdDIuZ2V0U1FMKCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZXNPclNlbGVjdDtcbiAgICAgIHZhbHVlc1NxbExpc3QucHVzaChzcWwucmF3KFwidmFsdWVzIFwiKSk7XG4gICAgICBmb3IgKGNvbnN0IFt2YWx1ZUluZGV4LCB2YWx1ZV0gb2YgdmFsdWVzLmVudHJpZXMoKSkge1xuICAgICAgICBjb25zdCB2YWx1ZUxpc3QgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBbZmllbGROYW1lLCBjb2xdIG9mIGNvbEVudHJpZXMpIHtcbiAgICAgICAgICBjb25zdCBjb2xWYWx1ZSA9IHZhbHVlW2ZpZWxkTmFtZV07XG4gICAgICAgICAgaWYgKGNvbFZhbHVlID09PSB2b2lkIDAgfHwgaXMoY29sVmFsdWUsIFBhcmFtKSAmJiBjb2xWYWx1ZS52YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgaWYgKGNvbC5kZWZhdWx0ICE9PSBudWxsICYmIGNvbC5kZWZhdWx0ICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gaXMoY29sLmRlZmF1bHQsIFNRTCkgPyBjb2wuZGVmYXVsdCA6IHNxbC5wYXJhbShjb2wuZGVmYXVsdCwgY29sKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sLmRlZmF1bHRGbiAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRGblJlc3VsdCA9IGNvbC5kZWZhdWx0Rm4oKTtcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gaXMoZGVmYXVsdEZuUmVzdWx0LCBTUUwpID8gZGVmYXVsdEZuUmVzdWx0IDogc3FsLnBhcmFtKGRlZmF1bHRGblJlc3VsdCwgY29sKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNvbC5kZWZhdWx0ICYmIGNvbC5vblVwZGF0ZUZuICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgY29uc3Qgb25VcGRhdGVGblJlc3VsdCA9IGNvbC5vblVwZGF0ZUZuKCk7XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGlzKG9uVXBkYXRlRm5SZXN1bHQsIFNRTCkgPyBvblVwZGF0ZUZuUmVzdWx0IDogc3FsLnBhcmFtKG9uVXBkYXRlRm5SZXN1bHQsIGNvbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBzcWxgbnVsbGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZUxpc3QucHVzaChkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZUxpc3QucHVzaChjb2xWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhbHVlc1NxbExpc3QucHVzaCh2YWx1ZUxpc3QpO1xuICAgICAgICBpZiAodmFsdWVJbmRleCA8IHZhbHVlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgdmFsdWVzU3FsTGlzdC5wdXNoKHNxbGAsIGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHdpdGhTcWwgPSB0aGlzLmJ1aWxkV2l0aENURSh3aXRoTGlzdCk7XG4gICAgY29uc3QgdmFsdWVzU3FsID0gc3FsLmpvaW4odmFsdWVzU3FsTGlzdCk7XG4gICAgY29uc3QgcmV0dXJuaW5nU3FsID0gcmV0dXJuaW5nID8gc3FsYCByZXR1cm5pbmcgJHt0aGlzLmJ1aWxkU2VsZWN0aW9uKHJldHVybmluZywgeyBpc1NpbmdsZVRhYmxlOiB0cnVlIH0pfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgb25Db25mbGljdFNxbCA9IG9uQ29uZmxpY3Q/Lmxlbmd0aCA/IHNxbC5qb2luKG9uQ29uZmxpY3QpIDogdm9pZCAwO1xuICAgIHJldHVybiBzcWxgJHt3aXRoU3FsfWluc2VydCBpbnRvICR7dGFibGV9ICR7aW5zZXJ0T3JkZXJ9ICR7dmFsdWVzU3FsfSR7b25Db25mbGljdFNxbH0ke3JldHVybmluZ1NxbH1gO1xuICB9XG4gIHNxbFRvUXVlcnkoc3FsMiwgaW52b2tlU291cmNlKSB7XG4gICAgcmV0dXJuIHNxbDIudG9RdWVyeSh7XG4gICAgICBjYXNpbmc6IHRoaXMuY2FzaW5nLFxuICAgICAgZXNjYXBlTmFtZTogdGhpcy5lc2NhcGVOYW1lLFxuICAgICAgZXNjYXBlUGFyYW06IHRoaXMuZXNjYXBlUGFyYW0sXG4gICAgICBlc2NhcGVTdHJpbmc6IHRoaXMuZXNjYXBlU3RyaW5nLFxuICAgICAgaW52b2tlU291cmNlXG4gICAgfSk7XG4gIH1cbiAgYnVpbGRSZWxhdGlvbmFsUXVlcnkoe1xuICAgIGZ1bGxTY2hlbWEsXG4gICAgc2NoZW1hLFxuICAgIHRhYmxlTmFtZXNNYXAsXG4gICAgdGFibGUsXG4gICAgdGFibGVDb25maWcsXG4gICAgcXVlcnlDb25maWc6IGNvbmZpZyxcbiAgICB0YWJsZUFsaWFzLFxuICAgIG5lc3RlZFF1ZXJ5UmVsYXRpb24sXG4gICAgam9pbk9uXG4gIH0pIHtcbiAgICBsZXQgc2VsZWN0aW9uID0gW107XG4gICAgbGV0IGxpbWl0LCBvZmZzZXQsIG9yZGVyQnkgPSBbXSwgd2hlcmU7XG4gICAgY29uc3Qgam9pbnMgPSBbXTtcbiAgICBpZiAoY29uZmlnID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBzZWxlY3Rpb25FbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVDb25maWcuY29sdW1ucyk7XG4gICAgICBzZWxlY3Rpb24gPSBzZWxlY3Rpb25FbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICBkYktleTogdmFsdWUubmFtZSxcbiAgICAgICAgdHNLZXk6IGtleSxcbiAgICAgICAgZmllbGQ6IGFsaWFzZWRUYWJsZUNvbHVtbih2YWx1ZSwgdGFibGVBbGlhcyksXG4gICAgICAgIHJlbGF0aW9uVGFibGVUc0tleTogdm9pZCAwLFxuICAgICAgICBpc0pzb246IGZhbHNlLFxuICAgICAgICBzZWxlY3Rpb246IFtdXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFsaWFzZWRDb2x1bW5zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyh0YWJsZUNvbmZpZy5jb2x1bW5zKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgYWxpYXNlZFRhYmxlQ29sdW1uKHZhbHVlLCB0YWJsZUFsaWFzKV0pXG4gICAgICApO1xuICAgICAgaWYgKGNvbmZpZy53aGVyZSkge1xuICAgICAgICBjb25zdCB3aGVyZVNxbCA9IHR5cGVvZiBjb25maWcud2hlcmUgPT09IFwiZnVuY3Rpb25cIiA/IGNvbmZpZy53aGVyZShhbGlhc2VkQ29sdW1ucywgZ2V0T3BlcmF0b3JzKCkpIDogY29uZmlnLndoZXJlO1xuICAgICAgICB3aGVyZSA9IHdoZXJlU3FsICYmIG1hcENvbHVtbnNJblNRTFRvQWxpYXMod2hlcmVTcWwsIHRhYmxlQWxpYXMpO1xuICAgICAgfVxuICAgICAgY29uc3QgZmllbGRzU2VsZWN0aW9uID0gW107XG4gICAgICBsZXQgc2VsZWN0ZWRDb2x1bW5zID0gW107XG4gICAgICBpZiAoY29uZmlnLmNvbHVtbnMpIHtcbiAgICAgICAgbGV0IGlzSW5jbHVkZU1vZGUgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBbZmllbGQsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcuY29sdW1ucykpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWVsZCBpbiB0YWJsZUNvbmZpZy5jb2x1bW5zKSB7XG4gICAgICAgICAgICBpZiAoIWlzSW5jbHVkZU1vZGUgJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgaXNJbmNsdWRlTW9kZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxlY3RlZENvbHVtbnMucHVzaChmaWVsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxlY3RlZENvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNlbGVjdGVkQ29sdW1ucyA9IGlzSW5jbHVkZU1vZGUgPyBzZWxlY3RlZENvbHVtbnMuZmlsdGVyKChjKSA9PiBjb25maWcuY29sdW1ucz8uW2NdID09PSB0cnVlKSA6IE9iamVjdC5rZXlzKHRhYmxlQ29uZmlnLmNvbHVtbnMpLmZpbHRlcigoa2V5KSA9PiAhc2VsZWN0ZWRDb2x1bW5zLmluY2x1ZGVzKGtleSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZENvbHVtbnMgPSBPYmplY3Qua2V5cyh0YWJsZUNvbmZpZy5jb2x1bW5zKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2Ygc2VsZWN0ZWRDb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRhYmxlQ29uZmlnLmNvbHVtbnNbZmllbGRdO1xuICAgICAgICBmaWVsZHNTZWxlY3Rpb24ucHVzaCh7IHRzS2V5OiBmaWVsZCwgdmFsdWU6IGNvbHVtbiB9KTtcbiAgICAgIH1cbiAgICAgIGxldCBzZWxlY3RlZFJlbGF0aW9ucyA9IFtdO1xuICAgICAgaWYgKGNvbmZpZy53aXRoKSB7XG4gICAgICAgIHNlbGVjdGVkUmVsYXRpb25zID0gT2JqZWN0LmVudHJpZXMoY29uZmlnLndpdGgpLmZpbHRlcigoZW50cnkpID0+ICEhZW50cnlbMV0pLm1hcCgoW3RzS2V5LCBxdWVyeUNvbmZpZ10pID0+ICh7IHRzS2V5LCBxdWVyeUNvbmZpZywgcmVsYXRpb246IHRhYmxlQ29uZmlnLnJlbGF0aW9uc1t0c0tleV0gfSkpO1xuICAgICAgfVxuICAgICAgbGV0IGV4dHJhcztcbiAgICAgIGlmIChjb25maWcuZXh0cmFzKSB7XG4gICAgICAgIGV4dHJhcyA9IHR5cGVvZiBjb25maWcuZXh0cmFzID09PSBcImZ1bmN0aW9uXCIgPyBjb25maWcuZXh0cmFzKGFsaWFzZWRDb2x1bW5zLCB7IHNxbCB9KSA6IGNvbmZpZy5leHRyYXM7XG4gICAgICAgIGZvciAoY29uc3QgW3RzS2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXh0cmFzKSkge1xuICAgICAgICAgIGZpZWxkc1NlbGVjdGlvbi5wdXNoKHtcbiAgICAgICAgICAgIHRzS2V5LFxuICAgICAgICAgICAgdmFsdWU6IG1hcENvbHVtbnNJbkFsaWFzZWRTUUxUb0FsaWFzKHZhbHVlLCB0YWJsZUFsaWFzKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHsgdHNLZXksIHZhbHVlIH0gb2YgZmllbGRzU2VsZWN0aW9uKSB7XG4gICAgICAgIHNlbGVjdGlvbi5wdXNoKHtcbiAgICAgICAgICBkYktleTogaXModmFsdWUsIFNRTC5BbGlhc2VkKSA/IHZhbHVlLmZpZWxkQWxpYXMgOiB0YWJsZUNvbmZpZy5jb2x1bW5zW3RzS2V5XS5uYW1lLFxuICAgICAgICAgIHRzS2V5LFxuICAgICAgICAgIGZpZWxkOiBpcyh2YWx1ZSwgQ29sdW1uKSA/IGFsaWFzZWRUYWJsZUNvbHVtbih2YWx1ZSwgdGFibGVBbGlhcykgOiB2YWx1ZSxcbiAgICAgICAgICByZWxhdGlvblRhYmxlVHNLZXk6IHZvaWQgMCxcbiAgICAgICAgICBpc0pzb246IGZhbHNlLFxuICAgICAgICAgIHNlbGVjdGlvbjogW11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsZXQgb3JkZXJCeU9yaWcgPSB0eXBlb2YgY29uZmlnLm9yZGVyQnkgPT09IFwiZnVuY3Rpb25cIiA/IGNvbmZpZy5vcmRlckJ5KGFsaWFzZWRDb2x1bW5zLCBnZXRPcmRlckJ5T3BlcmF0b3JzKCkpIDogY29uZmlnLm9yZGVyQnkgPz8gW107XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkob3JkZXJCeU9yaWcpKSB7XG4gICAgICAgIG9yZGVyQnlPcmlnID0gW29yZGVyQnlPcmlnXTtcbiAgICAgIH1cbiAgICAgIG9yZGVyQnkgPSBvcmRlckJ5T3JpZy5tYXAoKG9yZGVyQnlWYWx1ZSkgPT4ge1xuICAgICAgICBpZiAoaXMob3JkZXJCeVZhbHVlLCBDb2x1bW4pKSB7XG4gICAgICAgICAgcmV0dXJuIGFsaWFzZWRUYWJsZUNvbHVtbihvcmRlckJ5VmFsdWUsIHRhYmxlQWxpYXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXBDb2x1bW5zSW5TUUxUb0FsaWFzKG9yZGVyQnlWYWx1ZSwgdGFibGVBbGlhcyk7XG4gICAgICB9KTtcbiAgICAgIGxpbWl0ID0gY29uZmlnLmxpbWl0O1xuICAgICAgb2Zmc2V0ID0gY29uZmlnLm9mZnNldDtcbiAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICB0c0tleTogc2VsZWN0ZWRSZWxhdGlvblRzS2V5LFxuICAgICAgICBxdWVyeUNvbmZpZzogc2VsZWN0ZWRSZWxhdGlvbkNvbmZpZ1ZhbHVlLFxuICAgICAgICByZWxhdGlvblxuICAgICAgfSBvZiBzZWxlY3RlZFJlbGF0aW9ucykge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkUmVsYXRpb24gPSBub3JtYWxpemVSZWxhdGlvbihzY2hlbWEsIHRhYmxlTmFtZXNNYXAsIHJlbGF0aW9uKTtcbiAgICAgICAgY29uc3QgcmVsYXRpb25UYWJsZU5hbWUgPSBnZXRUYWJsZVVuaXF1ZU5hbWUocmVsYXRpb24ucmVmZXJlbmNlZFRhYmxlKTtcbiAgICAgICAgY29uc3QgcmVsYXRpb25UYWJsZVRzTmFtZSA9IHRhYmxlTmFtZXNNYXBbcmVsYXRpb25UYWJsZU5hbWVdO1xuICAgICAgICBjb25zdCByZWxhdGlvblRhYmxlQWxpYXMgPSBgJHt0YWJsZUFsaWFzfV8ke3NlbGVjdGVkUmVsYXRpb25Uc0tleX1gO1xuICAgICAgICBjb25zdCBqb2luT24yID0gYW5kKFxuICAgICAgICAgIC4uLm5vcm1hbGl6ZWRSZWxhdGlvbi5maWVsZHMubWFwKFxuICAgICAgICAgICAgKGZpZWxkMiwgaSkgPT4gZXEoXG4gICAgICAgICAgICAgIGFsaWFzZWRUYWJsZUNvbHVtbihub3JtYWxpemVkUmVsYXRpb24ucmVmZXJlbmNlc1tpXSwgcmVsYXRpb25UYWJsZUFsaWFzKSxcbiAgICAgICAgICAgICAgYWxpYXNlZFRhYmxlQ29sdW1uKGZpZWxkMiwgdGFibGVBbGlhcylcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGJ1aWx0UmVsYXRpb24gPSB0aGlzLmJ1aWxkUmVsYXRpb25hbFF1ZXJ5KHtcbiAgICAgICAgICBmdWxsU2NoZW1hLFxuICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICB0YWJsZU5hbWVzTWFwLFxuICAgICAgICAgIHRhYmxlOiBmdWxsU2NoZW1hW3JlbGF0aW9uVGFibGVUc05hbWVdLFxuICAgICAgICAgIHRhYmxlQ29uZmlnOiBzY2hlbWFbcmVsYXRpb25UYWJsZVRzTmFtZV0sXG4gICAgICAgICAgcXVlcnlDb25maWc6IGlzKHJlbGF0aW9uLCBPbmUpID8gc2VsZWN0ZWRSZWxhdGlvbkNvbmZpZ1ZhbHVlID09PSB0cnVlID8geyBsaW1pdDogMSB9IDogeyAuLi5zZWxlY3RlZFJlbGF0aW9uQ29uZmlnVmFsdWUsIGxpbWl0OiAxIH0gOiBzZWxlY3RlZFJlbGF0aW9uQ29uZmlnVmFsdWUsXG4gICAgICAgICAgdGFibGVBbGlhczogcmVsYXRpb25UYWJsZUFsaWFzLFxuICAgICAgICAgIGpvaW5Pbjogam9pbk9uMixcbiAgICAgICAgICBuZXN0ZWRRdWVyeVJlbGF0aW9uOiByZWxhdGlvblxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZmllbGQgPSBzcWxgKCR7YnVpbHRSZWxhdGlvbi5zcWx9KWAuYXMoc2VsZWN0ZWRSZWxhdGlvblRzS2V5KTtcbiAgICAgICAgc2VsZWN0aW9uLnB1c2goe1xuICAgICAgICAgIGRiS2V5OiBzZWxlY3RlZFJlbGF0aW9uVHNLZXksXG4gICAgICAgICAgdHNLZXk6IHNlbGVjdGVkUmVsYXRpb25Uc0tleSxcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICByZWxhdGlvblRhYmxlVHNLZXk6IHJlbGF0aW9uVGFibGVUc05hbWUsXG4gICAgICAgICAgaXNKc29uOiB0cnVlLFxuICAgICAgICAgIHNlbGVjdGlvbjogYnVpbHRSZWxhdGlvbi5zZWxlY3Rpb25cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRHJpenpsZUVycm9yKHtcbiAgICAgICAgbWVzc2FnZTogYE5vIGZpZWxkcyBzZWxlY3RlZCBmb3IgdGFibGUgXCIke3RhYmxlQ29uZmlnLnRzTmFtZX1cIiAoXCIke3RhYmxlQWxpYXN9XCIpLiBZb3UgbmVlZCB0byBoYXZlIGF0IGxlYXN0IG9uZSBpdGVtIGluIFwiY29sdW1uc1wiLCBcIndpdGhcIiBvciBcImV4dHJhc1wiLiBJZiB5b3UgbmVlZCB0byBzZWxlY3QgYWxsIGNvbHVtbnMsIG9taXQgdGhlIFwiY29sdW1uc1wiIGtleSBvciBzZXQgaXQgdG8gdW5kZWZpbmVkLmBcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0O1xuICAgIHdoZXJlID0gYW5kKGpvaW5Pbiwgd2hlcmUpO1xuICAgIGlmIChuZXN0ZWRRdWVyeVJlbGF0aW9uKSB7XG4gICAgICBsZXQgZmllbGQgPSBzcWxganNvbl9hcnJheSgke3NxbC5qb2luKFxuICAgICAgICBzZWxlY3Rpb24ubWFwKFxuICAgICAgICAgICh7IGZpZWxkOiBmaWVsZDIgfSkgPT4gaXMoZmllbGQyLCBTUUxpdGVDb2x1bW4pID8gc3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGZpZWxkMikpIDogaXMoZmllbGQyLCBTUUwuQWxpYXNlZCkgPyBmaWVsZDIuc3FsIDogZmllbGQyXG4gICAgICAgICksXG4gICAgICAgIHNxbGAsIGBcbiAgICAgICl9KWA7XG4gICAgICBpZiAoaXMobmVzdGVkUXVlcnlSZWxhdGlvbiwgTWFueSkpIHtcbiAgICAgICAgZmllbGQgPSBzcWxgY29hbGVzY2UoanNvbl9ncm91cF9hcnJheSgke2ZpZWxkfSksIGpzb25fYXJyYXkoKSlgO1xuICAgICAgfVxuICAgICAgY29uc3QgbmVzdGVkU2VsZWN0aW9uID0gW3tcbiAgICAgICAgZGJLZXk6IFwiZGF0YVwiLFxuICAgICAgICB0c0tleTogXCJkYXRhXCIsXG4gICAgICAgIGZpZWxkOiBmaWVsZC5hcyhcImRhdGFcIiksXG4gICAgICAgIGlzSnNvbjogdHJ1ZSxcbiAgICAgICAgcmVsYXRpb25UYWJsZVRzS2V5OiB0YWJsZUNvbmZpZy50c05hbWUsXG4gICAgICAgIHNlbGVjdGlvblxuICAgICAgfV07XG4gICAgICBjb25zdCBuZWVkc1N1YnF1ZXJ5ID0gbGltaXQgIT09IHZvaWQgMCB8fCBvZmZzZXQgIT09IHZvaWQgMCB8fCBvcmRlckJ5Lmxlbmd0aCA+IDA7XG4gICAgICBpZiAobmVlZHNTdWJxdWVyeSkge1xuICAgICAgICByZXN1bHQgPSB0aGlzLmJ1aWxkU2VsZWN0UXVlcnkoe1xuICAgICAgICAgIHRhYmxlOiBhbGlhc2VkVGFibGUodGFibGUsIHRhYmxlQWxpYXMpLFxuICAgICAgICAgIGZpZWxkczoge30sXG4gICAgICAgICAgZmllbGRzRmxhdDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgICAgICAgZmllbGQ6IHNxbC5yYXcoXCIqXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICB3aGVyZSxcbiAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgb3JkZXJCeSxcbiAgICAgICAgICBzZXRPcGVyYXRvcnM6IFtdXG4gICAgICAgIH0pO1xuICAgICAgICB3aGVyZSA9IHZvaWQgMDtcbiAgICAgICAgbGltaXQgPSB2b2lkIDA7XG4gICAgICAgIG9mZnNldCA9IHZvaWQgMDtcbiAgICAgICAgb3JkZXJCeSA9IHZvaWQgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IGFsaWFzZWRUYWJsZSh0YWJsZSwgdGFibGVBbGlhcyk7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSB0aGlzLmJ1aWxkU2VsZWN0UXVlcnkoe1xuICAgICAgICB0YWJsZTogaXMocmVzdWx0LCBTUUxpdGVUYWJsZSkgPyByZXN1bHQgOiBuZXcgU3VicXVlcnkocmVzdWx0LCB7fSwgdGFibGVBbGlhcyksXG4gICAgICAgIGZpZWxkczoge30sXG4gICAgICAgIGZpZWxkc0ZsYXQ6IG5lc3RlZFNlbGVjdGlvbi5tYXAoKHsgZmllbGQ6IGZpZWxkMiB9KSA9PiAoe1xuICAgICAgICAgIHBhdGg6IFtdLFxuICAgICAgICAgIGZpZWxkOiBpcyhmaWVsZDIsIENvbHVtbikgPyBhbGlhc2VkVGFibGVDb2x1bW4oZmllbGQyLCB0YWJsZUFsaWFzKSA6IGZpZWxkMlxuICAgICAgICB9KSksXG4gICAgICAgIGpvaW5zLFxuICAgICAgICB3aGVyZSxcbiAgICAgICAgbGltaXQsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgb3JkZXJCeSxcbiAgICAgICAgc2V0T3BlcmF0b3JzOiBbXVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuYnVpbGRTZWxlY3RRdWVyeSh7XG4gICAgICAgIHRhYmxlOiBhbGlhc2VkVGFibGUodGFibGUsIHRhYmxlQWxpYXMpLFxuICAgICAgICBmaWVsZHM6IHt9LFxuICAgICAgICBmaWVsZHNGbGF0OiBzZWxlY3Rpb24ubWFwKCh7IGZpZWxkIH0pID0+ICh7XG4gICAgICAgICAgcGF0aDogW10sXG4gICAgICAgICAgZmllbGQ6IGlzKGZpZWxkLCBDb2x1bW4pID8gYWxpYXNlZFRhYmxlQ29sdW1uKGZpZWxkLCB0YWJsZUFsaWFzKSA6IGZpZWxkXG4gICAgICAgIH0pKSxcbiAgICAgICAgam9pbnMsXG4gICAgICAgIHdoZXJlLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICBvcmRlckJ5LFxuICAgICAgICBzZXRPcGVyYXRvcnM6IFtdXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhYmxlVHNLZXk6IHRhYmxlQ29uZmlnLnRzTmFtZSxcbiAgICAgIHNxbDogcmVzdWx0LFxuICAgICAgc2VsZWN0aW9uXG4gICAgfTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlU3luY0RpYWxlY3QgZXh0ZW5kcyBTUUxpdGVEaWFsZWN0IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlU3luY0RpYWxlY3RcIjtcbiAgbWlncmF0ZShtaWdyYXRpb25zLCBzZXNzaW9uLCBjb25maWcpIHtcbiAgICBjb25zdCBtaWdyYXRpb25zVGFibGUgPSBjb25maWcgPT09IHZvaWQgMCA/IFwiX19kcml6emxlX21pZ3JhdGlvbnNcIiA6IHR5cGVvZiBjb25maWcgPT09IFwic3RyaW5nXCIgPyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCIgOiBjb25maWcubWlncmF0aW9uc1RhYmxlID8/IFwiX19kcml6emxlX21pZ3JhdGlvbnNcIjtcbiAgICBjb25zdCBtaWdyYXRpb25UYWJsZUNyZWF0ZSA9IHNxbGBcblx0XHRcdENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICR7c3FsLmlkZW50aWZpZXIobWlncmF0aW9uc1RhYmxlKX0gKFxuXHRcdFx0XHRpZCBTRVJJQUwgUFJJTUFSWSBLRVksXG5cdFx0XHRcdGhhc2ggdGV4dCBOT1QgTlVMTCxcblx0XHRcdFx0Y3JlYXRlZF9hdCBudW1lcmljXG5cdFx0XHQpXG5cdFx0YDtcbiAgICBzZXNzaW9uLnJ1bihtaWdyYXRpb25UYWJsZUNyZWF0ZSk7XG4gICAgY29uc3QgZGJNaWdyYXRpb25zID0gc2Vzc2lvbi52YWx1ZXMoXG4gICAgICBzcWxgU0VMRUNUIGlkLCBoYXNoLCBjcmVhdGVkX2F0IEZST00gJHtzcWwuaWRlbnRpZmllcihtaWdyYXRpb25zVGFibGUpfSBPUkRFUiBCWSBjcmVhdGVkX2F0IERFU0MgTElNSVQgMWBcbiAgICApO1xuICAgIGNvbnN0IGxhc3REYk1pZ3JhdGlvbiA9IGRiTWlncmF0aW9uc1swXSA/PyB2b2lkIDA7XG4gICAgc2Vzc2lvbi5ydW4oc3FsYEJFR0lOYCk7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgbWlncmF0aW9uIG9mIG1pZ3JhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFsYXN0RGJNaWdyYXRpb24gfHwgTnVtYmVyKGxhc3REYk1pZ3JhdGlvblsyXSkgPCBtaWdyYXRpb24uZm9sZGVyTWlsbGlzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzdG10IG9mIG1pZ3JhdGlvbi5zcWwpIHtcbiAgICAgICAgICAgIHNlc3Npb24ucnVuKHNxbC5yYXcoc3RtdCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXNzaW9uLnJ1bihcbiAgICAgICAgICAgIHNxbGBJTlNFUlQgSU5UTyAke3NxbC5pZGVudGlmaWVyKG1pZ3JhdGlvbnNUYWJsZSl9IChcImhhc2hcIiwgXCJjcmVhdGVkX2F0XCIpIFZBTFVFUygke21pZ3JhdGlvbi5oYXNofSwgJHttaWdyYXRpb24uZm9sZGVyTWlsbGlzfSlgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2Vzc2lvbi5ydW4oc3FsYENPTU1JVGApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNlc3Npb24ucnVuKHNxbGBST0xMQkFDS2ApO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUFzeW5jRGlhbGVjdCBleHRlbmRzIFNRTGl0ZURpYWxlY3Qge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVBc3luY0RpYWxlY3RcIjtcbiAgYXN5bmMgbWlncmF0ZShtaWdyYXRpb25zLCBzZXNzaW9uLCBjb25maWcpIHtcbiAgICBjb25zdCBtaWdyYXRpb25zVGFibGUgPSBjb25maWcgPT09IHZvaWQgMCA/IFwiX19kcml6emxlX21pZ3JhdGlvbnNcIiA6IHR5cGVvZiBjb25maWcgPT09IFwic3RyaW5nXCIgPyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCIgOiBjb25maWcubWlncmF0aW9uc1RhYmxlID8/IFwiX19kcml6emxlX21pZ3JhdGlvbnNcIjtcbiAgICBjb25zdCBtaWdyYXRpb25UYWJsZUNyZWF0ZSA9IHNxbGBcblx0XHRcdENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICR7c3FsLmlkZW50aWZpZXIobWlncmF0aW9uc1RhYmxlKX0gKFxuXHRcdFx0XHRpZCBTRVJJQUwgUFJJTUFSWSBLRVksXG5cdFx0XHRcdGhhc2ggdGV4dCBOT1QgTlVMTCxcblx0XHRcdFx0Y3JlYXRlZF9hdCBudW1lcmljXG5cdFx0XHQpXG5cdFx0YDtcbiAgICBhd2FpdCBzZXNzaW9uLnJ1bihtaWdyYXRpb25UYWJsZUNyZWF0ZSk7XG4gICAgY29uc3QgZGJNaWdyYXRpb25zID0gYXdhaXQgc2Vzc2lvbi52YWx1ZXMoXG4gICAgICBzcWxgU0VMRUNUIGlkLCBoYXNoLCBjcmVhdGVkX2F0IEZST00gJHtzcWwuaWRlbnRpZmllcihtaWdyYXRpb25zVGFibGUpfSBPUkRFUiBCWSBjcmVhdGVkX2F0IERFU0MgTElNSVQgMWBcbiAgICApO1xuICAgIGNvbnN0IGxhc3REYk1pZ3JhdGlvbiA9IGRiTWlncmF0aW9uc1swXSA/PyB2b2lkIDA7XG4gICAgYXdhaXQgc2Vzc2lvbi50cmFuc2FjdGlvbihhc3luYyAodHgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbWlncmF0aW9uIG9mIG1pZ3JhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFsYXN0RGJNaWdyYXRpb24gfHwgTnVtYmVyKGxhc3REYk1pZ3JhdGlvblsyXSkgPCBtaWdyYXRpb24uZm9sZGVyTWlsbGlzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzdG10IG9mIG1pZ3JhdGlvbi5zcWwpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4LnJ1bihzcWwucmF3KHN0bXQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgdHgucnVuKFxuICAgICAgICAgICAgc3FsYElOU0VSVCBJTlRPICR7c3FsLmlkZW50aWZpZXIobWlncmF0aW9uc1RhYmxlKX0gKFwiaGFzaFwiLCBcImNyZWF0ZWRfYXRcIikgVkFMVUVTKCR7bWlncmF0aW9uLmhhc2h9LCAke21pZ3JhdGlvbi5mb2xkZXJNaWxsaXN9KWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZUFzeW5jRGlhbGVjdCxcbiAgU1FMaXRlRGlhbGVjdCxcbiAgU1FMaXRlU3luY0RpYWxlY3Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWFsZWN0LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmNsYXNzIFR5cGVkUXVlcnlCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiVHlwZWRRdWVyeUJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTZWxlY3RlZEZpZWxkcygpIHtcbiAgICByZXR1cm4gdGhpcy5fLnNlbGVjdGVkRmllbGRzO1xuICB9XG59XG5leHBvcnQge1xuICBUeXBlZFF1ZXJ5QnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1ZXJ5LWJ1aWxkZXIuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFR5cGVkUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LWJ1aWxkZXJzL3F1ZXJ5LWJ1aWxkZXIuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi8uLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5pbXBvcnQgeyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vc2VsZWN0aW9uLXByb3h5LmpzXCI7XG5pbXBvcnQgeyBTUUwsIFZpZXcgfSBmcm9tIFwiLi4vLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi4vLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlLmpzXCI7XG5pbXBvcnQge1xuICBhcHBseU1peGlucyxcbiAgZ2V0VGFibGVDb2x1bW5zLFxuICBnZXRUYWJsZUxpa2VOYW1lLFxuICBoYXZlU2FtZUtleXMsXG4gIG9yZGVyU2VsZWN0ZWRGaWVsZHNcbn0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuLi8uLi92aWV3LWNvbW1vbi5qc1wiO1xuaW1wb3J0IHsgZXh0cmFjdFVzZWRUYWJsZSB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVmlld0Jhc2UgfSBmcm9tIFwiLi4vdmlldy1iYXNlLmpzXCI7XG5jbGFzcyBTUUxpdGVTZWxlY3RCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlU2VsZWN0QnVpbGRlclwiO1xuICBmaWVsZHM7XG4gIHNlc3Npb247XG4gIGRpYWxlY3Q7XG4gIHdpdGhMaXN0O1xuICBkaXN0aW5jdDtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy5maWVsZHMgPSBjb25maWcuZmllbGRzO1xuICAgIHRoaXMuc2Vzc2lvbiA9IGNvbmZpZy5zZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGNvbmZpZy5kaWFsZWN0O1xuICAgIHRoaXMud2l0aExpc3QgPSBjb25maWcud2l0aExpc3Q7XG4gICAgdGhpcy5kaXN0aW5jdCA9IGNvbmZpZy5kaXN0aW5jdDtcbiAgfVxuICBmcm9tKHNvdXJjZSkge1xuICAgIGNvbnN0IGlzUGFydGlhbFNlbGVjdCA9ICEhdGhpcy5maWVsZHM7XG4gICAgbGV0IGZpZWxkcztcbiAgICBpZiAodGhpcy5maWVsZHMpIHtcbiAgICAgIGZpZWxkcyA9IHRoaXMuZmllbGRzO1xuICAgIH0gZWxzZSBpZiAoaXMoc291cmNlLCBTdWJxdWVyeSkpIHtcbiAgICAgIGZpZWxkcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmtleXMoc291cmNlLl8uc2VsZWN0ZWRGaWVsZHMpLm1hcCgoa2V5KSA9PiBba2V5LCBzb3VyY2Vba2V5XV0pXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoaXMoc291cmNlLCBTUUxpdGVWaWV3QmFzZSkpIHtcbiAgICAgIGZpZWxkcyA9IHNvdXJjZVtWaWV3QmFzZUNvbmZpZ10uc2VsZWN0ZWRGaWVsZHM7XG4gICAgfSBlbHNlIGlmIChpcyhzb3VyY2UsIFNRTCkpIHtcbiAgICAgIGZpZWxkcyA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWVsZHMgPSBnZXRUYWJsZUNvbHVtbnMoc291cmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCYXNlKHtcbiAgICAgIHRhYmxlOiBzb3VyY2UsXG4gICAgICBmaWVsZHMsXG4gICAgICBpc1BhcnRpYWxTZWxlY3QsXG4gICAgICBzZXNzaW9uOiB0aGlzLnNlc3Npb24sXG4gICAgICBkaWFsZWN0OiB0aGlzLmRpYWxlY3QsXG4gICAgICB3aXRoTGlzdDogdGhpcy53aXRoTGlzdCxcbiAgICAgIGRpc3RpbmN0OiB0aGlzLmRpc3RpbmN0XG4gICAgfSk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVNlbGVjdFF1ZXJ5QnVpbGRlckJhc2UgZXh0ZW5kcyBUeXBlZFF1ZXJ5QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVNlbGVjdFF1ZXJ5QnVpbGRlclwiO1xuICBfO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbmZpZztcbiAgam9pbnNOb3ROdWxsYWJsZU1hcDtcbiAgdGFibGVOYW1lO1xuICBpc1BhcnRpYWxTZWxlY3Q7XG4gIHNlc3Npb247XG4gIGRpYWxlY3Q7XG4gIGNhY2hlQ29uZmlnID0gdm9pZCAwO1xuICB1c2VkVGFibGVzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgY29uc3RydWN0b3IoeyB0YWJsZSwgZmllbGRzLCBpc1BhcnRpYWxTZWxlY3QsIHNlc3Npb24sIGRpYWxlY3QsIHdpdGhMaXN0LCBkaXN0aW5jdCB9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIHdpdGhMaXN0LFxuICAgICAgdGFibGUsXG4gICAgICBmaWVsZHM6IHsgLi4uZmllbGRzIH0sXG4gICAgICBkaXN0aW5jdCxcbiAgICAgIHNldE9wZXJhdG9yczogW11cbiAgICB9O1xuICAgIHRoaXMuaXNQYXJ0aWFsU2VsZWN0ID0gaXNQYXJ0aWFsU2VsZWN0O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLl8gPSB7XG4gICAgICBzZWxlY3RlZEZpZWxkczogZmllbGRzLFxuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZ1xuICAgIH07XG4gICAgdGhpcy50YWJsZU5hbWUgPSBnZXRUYWJsZUxpa2VOYW1lKHRhYmxlKTtcbiAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXAgPSB0eXBlb2YgdGhpcy50YWJsZU5hbWUgPT09IFwic3RyaW5nXCIgPyB7IFt0aGlzLnRhYmxlTmFtZV06IHRydWUgfSA6IHt9O1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBleHRyYWN0VXNlZFRhYmxlKHRhYmxlKSkgdGhpcy51c2VkVGFibGVzLmFkZChpdGVtKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGdldFVzZWRUYWJsZXMoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnVzZWRUYWJsZXNdO1xuICB9XG4gIGNyZWF0ZUpvaW4oam9pblR5cGUpIHtcbiAgICByZXR1cm4gKHRhYmxlLCBvbikgPT4ge1xuICAgICAgY29uc3QgYmFzZVRhYmxlTmFtZSA9IHRoaXMudGFibGVOYW1lO1xuICAgICAgY29uc3QgdGFibGVOYW1lID0gZ2V0VGFibGVMaWtlTmFtZSh0YWJsZSk7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZXh0cmFjdFVzZWRUYWJsZSh0YWJsZSkpIHRoaXMudXNlZFRhYmxlcy5hZGQoaXRlbSk7XG4gICAgICBpZiAodHlwZW9mIHRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLmNvbmZpZy5qb2lucz8uc29tZSgoam9pbikgPT4gam9pbi5hbGlhcyA9PT0gdGFibGVOYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFsaWFzIFwiJHt0YWJsZU5hbWV9XCIgaXMgYWxyZWFkeSB1c2VkIGluIHRoaXMgcXVlcnlgKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc1BhcnRpYWxTZWxlY3QpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcCkubGVuZ3RoID09PSAxICYmIHR5cGVvZiBiYXNlVGFibGVOYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzID0ge1xuICAgICAgICAgICAgW2Jhc2VUYWJsZU5hbWVdOiB0aGlzLmNvbmZpZy5maWVsZHNcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFibGVOYW1lID09PSBcInN0cmluZ1wiICYmICFpcyh0YWJsZSwgU1FMKSkge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGlzKHRhYmxlLCBTdWJxdWVyeSkgPyB0YWJsZS5fLnNlbGVjdGVkRmllbGRzIDogaXModGFibGUsIFZpZXcpID8gdGFibGVbVmlld0Jhc2VDb25maWddLnNlbGVjdGVkRmllbGRzIDogdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkc1t0YWJsZU5hbWVdID0gc2VsZWN0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgb24gPSBvbihcbiAgICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMsXG4gICAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcInNxbFwiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5jb25maWcuam9pbnMpIHtcbiAgICAgICAgdGhpcy5jb25maWcuam9pbnMgPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uZmlnLmpvaW5zLnB1c2goeyBvbiwgdGFibGUsIGpvaW5UeXBlLCBhbGlhczogdGFibGVOYW1lIH0pO1xuICAgICAgaWYgKHR5cGVvZiB0YWJsZU5hbWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgc3dpdGNoIChqb2luVHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6IHtcbiAgICAgICAgICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcFt0YWJsZU5hbWVdID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcInJpZ2h0XCI6IHtcbiAgICAgICAgICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5qb2luc05vdE51bGxhYmxlTWFwKS5tYXAoKFtrZXldKSA9PiBba2V5LCBmYWxzZV0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwW3RhYmxlTmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJjcm9zc1wiOlxuICAgICAgICAgIGNhc2UgXCJpbm5lclwiOiB7XG4gICAgICAgICAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXBbdGFibGVOYW1lXSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImZ1bGxcIjoge1xuICAgICAgICAgICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLmpvaW5zTm90TnVsbGFibGVNYXApLm1hcCgoW2tleV0pID0+IFtrZXksIGZhbHNlXSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXBbdGFibGVOYW1lXSA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGBsZWZ0IGpvaW5gIG9wZXJhdGlvbiBieSBhZGRpbmcgYW5vdGhlciB0YWJsZSB0byB0aGUgY3VycmVudCBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBhc3NvY2lhdGVzIGVhY2ggcm93IG9mIHRoZSB0YWJsZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHJvdyBmcm9tIHRoZSBqb2luZWQgdGFibGUsIGlmIGEgbWF0Y2ggaXMgZm91bmQuIElmIG5vIG1hdGNoaW5nIHJvdyBleGlzdHMsIGl0IHNldHMgYWxsIGNvbHVtbnMgb2YgdGhlIGpvaW5lZCB0YWJsZSB0byBudWxsLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2pvaW5zI2xlZnQtam9pbn1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBqb2luLlxuICAgKiBAcGFyYW0gb24gdGhlIGBvbmAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHVzZXJzIGFuZCB0aGVpciBwZXRzXG4gICAqIGNvbnN0IHVzZXJzV2l0aFBldHM6IHsgdXNlcjogVXNlcjsgcGV0czogUGV0IHwgbnVsbDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KClcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAubGVmdEpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqXG4gICAqIC8vIFNlbGVjdCB1c2VySWQgYW5kIHBldElkXG4gICAqIGNvbnN0IHVzZXJzSWRzQW5kUGV0SWRzOiB7IHVzZXJJZDogbnVtYmVyOyBwZXRJZDogbnVtYmVyIHwgbnVsbDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KHtcbiAgICogICB1c2VySWQ6IHVzZXJzLmlkLFxuICAgKiAgIHBldElkOiBwZXRzLmlkLFxuICAgKiB9KVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5sZWZ0Sm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICogYGBgXG4gICAqL1xuICBsZWZ0Sm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImxlZnRcIik7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGByaWdodCBqb2luYCBvcGVyYXRpb24gYnkgYWRkaW5nIGFub3RoZXIgdGFibGUgdG8gdGhlIGN1cnJlbnQgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2QgYXNzb2NpYXRlcyBlYWNoIHJvdyBvZiB0aGUgam9pbmVkIHRhYmxlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcm93IGZyb20gdGhlIG1haW4gdGFibGUsIGlmIGEgbWF0Y2ggaXMgZm91bmQuIElmIG5vIG1hdGNoaW5nIHJvdyBleGlzdHMsIGl0IHNldHMgYWxsIGNvbHVtbnMgb2YgdGhlIG1haW4gdGFibGUgdG8gbnVsbC5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9qb2lucyNyaWdodC1qb2lufVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRvIGpvaW4uXG4gICAqIEBwYXJhbSBvbiB0aGUgYG9uYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdXNlcnMgYW5kIHRoZWlyIHBldHNcbiAgICogY29uc3QgdXNlcnNXaXRoUGV0czogeyB1c2VyOiBVc2VyIHwgbnVsbDsgcGV0czogUGV0OyB9W10gPSBhd2FpdCBkYi5zZWxlY3QoKVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5yaWdodEpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqXG4gICAqIC8vIFNlbGVjdCB1c2VySWQgYW5kIHBldElkXG4gICAqIGNvbnN0IHVzZXJzSWRzQW5kUGV0SWRzOiB7IHVzZXJJZDogbnVtYmVyIHwgbnVsbDsgcGV0SWQ6IG51bWJlcjsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KHtcbiAgICogICB1c2VySWQ6IHVzZXJzLmlkLFxuICAgKiAgIHBldElkOiBwZXRzLmlkLFxuICAgKiB9KVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5yaWdodEpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqIGBgYFxuICAgKi9cbiAgcmlnaHRKb2luID0gdGhpcy5jcmVhdGVKb2luKFwicmlnaHRcIik7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhbiBgaW5uZXIgam9pbmAgb3BlcmF0aW9uLCBjcmVhdGluZyBhIG5ldyB0YWJsZSBieSBjb21iaW5pbmcgcm93cyBmcm9tIHR3byB0YWJsZXMgdGhhdCBoYXZlIG1hdGNoaW5nIHZhbHVlcy5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCByZXRyaWV2ZXMgcm93cyB0aGF0IGhhdmUgY29ycmVzcG9uZGluZyBlbnRyaWVzIGluIGJvdGggam9pbmVkIHRhYmxlcy4gUm93cyB3aXRob3V0IG1hdGNoaW5nIGVudHJpZXMgaW4gZWl0aGVyIHRhYmxlIGFyZSBleGNsdWRlZCwgcmVzdWx0aW5nIGluIGEgdGFibGUgdGhhdCBpbmNsdWRlcyBvbmx5IG1hdGNoaW5nIHBhaXJzLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2pvaW5zI2lubmVyLWpvaW59XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdG8gam9pbi5cbiAgICogQHBhcmFtIG9uIHRoZSBgb25gIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB1c2VycyBhbmQgdGhlaXIgcGV0c1xuICAgKiBjb25zdCB1c2Vyc1dpdGhQZXRzOiB7IHVzZXI6IFVzZXI7IHBldHM6IFBldDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KClcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAuaW5uZXJKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKlxuICAgKiAvLyBTZWxlY3QgdXNlcklkIGFuZCBwZXRJZFxuICAgKiBjb25zdCB1c2Vyc0lkc0FuZFBldElkczogeyB1c2VySWQ6IG51bWJlcjsgcGV0SWQ6IG51bWJlcjsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KHtcbiAgICogICB1c2VySWQ6IHVzZXJzLmlkLFxuICAgKiAgIHBldElkOiBwZXRzLmlkLFxuICAgKiB9KVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5pbm5lckpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqIGBgYFxuICAgKi9cbiAgaW5uZXJKb2luID0gdGhpcy5jcmVhdGVKb2luKFwiaW5uZXJcIik7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGBmdWxsIGpvaW5gIG9wZXJhdGlvbiBieSBjb21iaW5pbmcgcm93cyBmcm9tIHR3byB0YWJsZXMgaW50byBhIG5ldyB0YWJsZS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCByZXRyaWV2ZXMgYWxsIHJvd3MgZnJvbSBib3RoIG1haW4gYW5kIGpvaW5lZCB0YWJsZXMsIG1lcmdpbmcgcm93cyB3aXRoIG1hdGNoaW5nIHZhbHVlcyBhbmQgZmlsbGluZyBpbiBgbnVsbGAgZm9yIG5vbi1tYXRjaGluZyBjb2x1bW5zLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2pvaW5zI2Z1bGwtam9pbn1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBqb2luLlxuICAgKiBAcGFyYW0gb24gdGhlIGBvbmAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHVzZXJzIGFuZCB0aGVpciBwZXRzXG4gICAqIGNvbnN0IHVzZXJzV2l0aFBldHM6IHsgdXNlcjogVXNlciB8IG51bGw7IHBldHM6IFBldCB8IG51bGw7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCgpXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmZ1bGxKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKlxuICAgKiAvLyBTZWxlY3QgdXNlcklkIGFuZCBwZXRJZFxuICAgKiBjb25zdCB1c2Vyc0lkc0FuZFBldElkczogeyB1c2VySWQ6IG51bWJlciB8IG51bGw7IHBldElkOiBudW1iZXIgfCBudWxsOyB9W10gPSBhd2FpdCBkYi5zZWxlY3Qoe1xuICAgKiAgIHVzZXJJZDogdXNlcnMuaWQsXG4gICAqICAgcGV0SWQ6IHBldHMuaWQsXG4gICAqIH0pXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmZ1bGxKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKiBgYGBcbiAgICovXG4gIGZ1bGxKb2luID0gdGhpcy5jcmVhdGVKb2luKFwiZnVsbFwiKTtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgYGNyb3NzIGpvaW5gIG9wZXJhdGlvbiBieSBjb21iaW5pbmcgcm93cyBmcm9tIHR3byB0YWJsZXMgaW50byBhIG5ldyB0YWJsZS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCByZXRyaWV2ZXMgYWxsIHJvd3MgZnJvbSBib3RoIG1haW4gYW5kIGpvaW5lZCB0YWJsZXMsIG1lcmdpbmcgYWxsIHJvd3MgZnJvbSBlYWNoIHRhYmxlLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2pvaW5zI2Nyb3NzLWpvaW59XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdG8gam9pbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB1c2VycywgZWFjaCB1c2VyIHdpdGggZXZlcnkgcGV0XG4gICAqIGNvbnN0IHVzZXJzV2l0aFBldHM6IHsgdXNlcjogVXNlcjsgcGV0czogUGV0OyB9W10gPSBhd2FpdCBkYi5zZWxlY3QoKVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5jcm9zc0pvaW4ocGV0cylcbiAgICpcbiAgICogLy8gU2VsZWN0IHVzZXJJZCBhbmQgcGV0SWRcbiAgICogY29uc3QgdXNlcnNJZHNBbmRQZXRJZHM6IHsgdXNlcklkOiBudW1iZXI7IHBldElkOiBudW1iZXI7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCh7XG4gICAqICAgdXNlcklkOiB1c2Vycy5pZCxcbiAgICogICBwZXRJZDogcGV0cy5pZCxcbiAgICogfSlcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAuY3Jvc3NKb2luKHBldHMpXG4gICAqIGBgYFxuICAgKi9cbiAgY3Jvc3NKb2luID0gdGhpcy5jcmVhdGVKb2luKFwiY3Jvc3NcIik7XG4gIGNyZWF0ZVNldE9wZXJhdG9yKHR5cGUsIGlzQWxsKSB7XG4gICAgcmV0dXJuIChyaWdodFNlbGVjdGlvbikgPT4ge1xuICAgICAgY29uc3QgcmlnaHRTZWxlY3QgPSB0eXBlb2YgcmlnaHRTZWxlY3Rpb24gPT09IFwiZnVuY3Rpb25cIiA/IHJpZ2h0U2VsZWN0aW9uKGdldFNRTGl0ZVNldE9wZXJhdG9ycygpKSA6IHJpZ2h0U2VsZWN0aW9uO1xuICAgICAgaWYgKCFoYXZlU2FtZUtleXModGhpcy5nZXRTZWxlY3RlZEZpZWxkcygpLCByaWdodFNlbGVjdC5nZXRTZWxlY3RlZEZpZWxkcygpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJTZXQgb3BlcmF0b3IgZXJyb3IgKHVuaW9uIC8gaW50ZXJzZWN0IC8gZXhjZXB0KTogc2VsZWN0ZWQgZmllbGRzIGFyZSBub3QgdGhlIHNhbWUgb3IgYXJlIGluIGEgZGlmZmVyZW50IG9yZGVyXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5wdXNoKHsgdHlwZSwgaXNBbGwsIHJpZ2h0U2VsZWN0IH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogQWRkcyBgdW5pb25gIHNldCBvcGVyYXRvciB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBjb21iaW5lIHRoZSByZXN1bHQgc2V0cyBvZiB0aGUgYHNlbGVjdGAgc3RhdGVtZW50cyBhbmQgcmVtb3ZlIGFueSBkdXBsaWNhdGUgcm93cyB0aGF0IGFwcGVhciBhY3Jvc3MgdGhlbS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZXQtb3BlcmF0aW9ucyN1bmlvbn1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB1bmlxdWUgbmFtZXMgZnJvbSBjdXN0b21lcnMgYW5kIHVzZXJzIHRhYmxlc1xuICAgKiBhd2FpdCBkYi5zZWxlY3QoeyBuYW1lOiB1c2Vycy5uYW1lIH0pXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLnVuaW9uKFxuICAgKiAgICAgZGIuc2VsZWN0KHsgbmFtZTogY3VzdG9tZXJzLm5hbWUgfSkuZnJvbShjdXN0b21lcnMpXG4gICAqICAgKTtcbiAgICogLy8gb3JcbiAgICogaW1wb3J0IHsgdW5pb24gfSBmcm9tICdkcml6emxlLW9ybS9zcWxpdGUtY29yZSdcbiAgICpcbiAgICogYXdhaXQgdW5pb24oXG4gICAqICAgZGIuc2VsZWN0KHsgbmFtZTogdXNlcnMubmFtZSB9KS5mcm9tKHVzZXJzKSxcbiAgICogICBkYi5zZWxlY3QoeyBuYW1lOiBjdXN0b21lcnMubmFtZSB9KS5mcm9tKGN1c3RvbWVycylcbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICB1bmlvbiA9IHRoaXMuY3JlYXRlU2V0T3BlcmF0b3IoXCJ1bmlvblwiLCBmYWxzZSk7XG4gIC8qKlxuICAgKiBBZGRzIGB1bmlvbiBhbGxgIHNldCBvcGVyYXRvciB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBjb21iaW5lIHRoZSByZXN1bHQtc2V0IG9mIHRoZSBgc2VsZWN0YCBzdGF0ZW1lbnRzIGFuZCBrZWVwIGFsbCBkdXBsaWNhdGUgcm93cyB0aGF0IGFwcGVhciBhY3Jvc3MgdGhlbS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZXQtb3BlcmF0aW9ucyN1bmlvbi1hbGx9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdHJhbnNhY3Rpb24gaWRzIGZyb20gYm90aCBvbmxpbmUgYW5kIGluLXN0b3JlIHNhbGVzXG4gICAqIGF3YWl0IGRiLnNlbGVjdCh7IHRyYW5zYWN0aW9uOiBvbmxpbmVTYWxlcy50cmFuc2FjdGlvbklkIH0pXG4gICAqICAgLmZyb20ob25saW5lU2FsZXMpXG4gICAqICAgLnVuaW9uQWxsKFxuICAgKiAgICAgZGIuc2VsZWN0KHsgdHJhbnNhY3Rpb246IGluU3RvcmVTYWxlcy50cmFuc2FjdGlvbklkIH0pLmZyb20oaW5TdG9yZVNhbGVzKVxuICAgKiAgICk7XG4gICAqIC8vIG9yXG4gICAqIGltcG9ydCB7IHVuaW9uQWxsIH0gZnJvbSAnZHJpenpsZS1vcm0vc3FsaXRlLWNvcmUnXG4gICAqXG4gICAqIGF3YWl0IHVuaW9uQWxsKFxuICAgKiAgIGRiLnNlbGVjdCh7IHRyYW5zYWN0aW9uOiBvbmxpbmVTYWxlcy50cmFuc2FjdGlvbklkIH0pLmZyb20ob25saW5lU2FsZXMpLFxuICAgKiAgIGRiLnNlbGVjdCh7IHRyYW5zYWN0aW9uOiBpblN0b3JlU2FsZXMudHJhbnNhY3Rpb25JZCB9KS5mcm9tKGluU3RvcmVTYWxlcylcbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICB1bmlvbkFsbCA9IHRoaXMuY3JlYXRlU2V0T3BlcmF0b3IoXCJ1bmlvblwiLCB0cnVlKTtcbiAgLyoqXG4gICAqIEFkZHMgYGludGVyc2VjdGAgc2V0IG9wZXJhdG9yIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHJldGFpbiBvbmx5IHRoZSByb3dzIHRoYXQgYXJlIHByZXNlbnQgaW4gYm90aCByZXN1bHQgc2V0cyBhbmQgZWxpbWluYXRlIGR1cGxpY2F0ZXMuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2V0LW9wZXJhdGlvbnMjaW50ZXJzZWN0fVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgY291cnNlIG5hbWVzIHRoYXQgYXJlIG9mZmVyZWQgaW4gYm90aCBkZXBhcnRtZW50cyBBIGFuZCBCXG4gICAqIGF3YWl0IGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEEuY291cnNlTmFtZSB9KVxuICAgKiAgIC5mcm9tKGRlcEEpXG4gICAqICAgLmludGVyc2VjdChcbiAgICogICAgIGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEIuY291cnNlTmFtZSB9KS5mcm9tKGRlcEIpXG4gICAqICAgKTtcbiAgICogLy8gb3JcbiAgICogaW1wb3J0IHsgaW50ZXJzZWN0IH0gZnJvbSAnZHJpenpsZS1vcm0vc3FsaXRlLWNvcmUnXG4gICAqXG4gICAqIGF3YWl0IGludGVyc2VjdChcbiAgICogICBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBBLmNvdXJzZU5hbWUgfSkuZnJvbShkZXBBKSxcbiAgICogICBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBCLmNvdXJzZU5hbWUgfSkuZnJvbShkZXBCKVxuICAgKiApO1xuICAgKiBgYGBcbiAgICovXG4gIGludGVyc2VjdCA9IHRoaXMuY3JlYXRlU2V0T3BlcmF0b3IoXCJpbnRlcnNlY3RcIiwgZmFsc2UpO1xuICAvKipcbiAgICogQWRkcyBgZXhjZXB0YCBzZXQgb3BlcmF0b3IgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgcmV0cmlldmUgYWxsIHVuaXF1ZSByb3dzIGZyb20gdGhlIGxlZnQgcXVlcnksIGV4Y2VwdCBmb3IgdGhlIHJvd3MgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcmVzdWx0IHNldCBvZiB0aGUgcmlnaHQgcXVlcnkuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2V0LW9wZXJhdGlvbnMjZXhjZXB0fVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIGNvdXJzZXMgb2ZmZXJlZCBpbiBkZXBhcnRtZW50IEEgYnV0IG5vdCBpbiBkZXBhcnRtZW50IEJcbiAgICogYXdhaXQgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQS5jb3Vyc2VOYW1lIH0pXG4gICAqICAgLmZyb20oZGVwQSlcbiAgICogICAuZXhjZXB0KFxuICAgKiAgICAgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQi5jb3Vyc2VOYW1lIH0pLmZyb20oZGVwQilcbiAgICogICApO1xuICAgKiAvLyBvclxuICAgKiBpbXBvcnQgeyBleGNlcHQgfSBmcm9tICdkcml6emxlLW9ybS9zcWxpdGUtY29yZSdcbiAgICpcbiAgICogYXdhaXQgZXhjZXB0KFxuICAgKiAgIGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEEuY291cnNlTmFtZSB9KS5mcm9tKGRlcEEpLFxuICAgKiAgIGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEIuY291cnNlTmFtZSB9KS5mcm9tKGRlcEIpXG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgZXhjZXB0ID0gdGhpcy5jcmVhdGVTZXRPcGVyYXRvcihcImV4Y2VwdFwiLCBmYWxzZSk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYWRkU2V0T3BlcmF0b3JzKHNldE9wZXJhdG9ycykge1xuICAgIHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5wdXNoKC4uLnNldE9wZXJhdG9ycyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBgd2hlcmVgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBzZWxlY3Qgb25seSB0aG9zZSByb3dzIHRoYXQgZnVsZmlsbCBhIHNwZWNpZmllZCBjb25kaXRpb24uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2VsZWN0I2ZpbHRlcmluZ31cbiAgICpcbiAgICogQHBhcmFtIHdoZXJlIHRoZSBgd2hlcmVgIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogWW91IGNhbiB1c2UgY29uZGl0aW9uYWwgb3BlcmF0b3JzIGFuZCBgc3FsIGZ1bmN0aW9uYCB0byBmaWx0ZXIgdGhlIHJvd3MgdG8gYmUgc2VsZWN0ZWQuXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgY2FycyB3aXRoIGdyZWVuIGNvbG9yXG4gICAqIGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oY2Fycykud2hlcmUoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJykpO1xuICAgKiAvLyBvclxuICAgKiBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKGNhcnMpLndoZXJlKHNxbGAke2NhcnMuY29sb3J9ID0gJ2dyZWVuJ2ApXG4gICAqIGBgYFxuICAgKlxuICAgKiBZb3UgY2FuIGxvZ2ljYWxseSBjb21iaW5lIGNvbmRpdGlvbmFsIG9wZXJhdG9ycyB3aXRoIGBhbmQoKWAgYW5kIGBvcigpYCBvcGVyYXRvcnM6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgQk1XIGNhcnMgd2l0aCBhIGdyZWVuIGNvbG9yXG4gICAqIGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oY2Fycykud2hlcmUoYW5kKGVxKGNhcnMuY29sb3IsICdncmVlbicpLCBlcShjYXJzLmJyYW5kLCAnQk1XJykpKTtcbiAgICpcbiAgICogLy8gU2VsZWN0IGFsbCBjYXJzIHdpdGggdGhlIGdyZWVuIG9yIGJsdWUgY29sb3JcbiAgICogYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShjYXJzKS53aGVyZShvcihlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSwgZXEoY2Fycy5jb2xvciwgJ2JsdWUnKSkpO1xuICAgKiBgYGBcbiAgICovXG4gIHdoZXJlKHdoZXJlKSB7XG4gICAgaWYgKHR5cGVvZiB3aGVyZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB3aGVyZSA9IHdoZXJlKFxuICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzLFxuICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwic3FsXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLndoZXJlID0gd2hlcmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBgaGF2aW5nYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgc2VsZWN0IG9ubHkgdGhvc2Ugcm93cyB0aGF0IGZ1bGZpbGwgYSBzcGVjaWZpZWQgY29uZGl0aW9uLiBJdCBpcyB0eXBpY2FsbHkgdXNlZCB3aXRoIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMgdG8gZmlsdGVyIHRoZSBhZ2dyZWdhdGVkIGRhdGEgYmFzZWQgb24gYSBzcGVjaWZpZWQgY29uZGl0aW9uLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NlbGVjdCNhZ2dyZWdhdGlvbnN9XG4gICAqXG4gICAqIEBwYXJhbSBoYXZpbmcgdGhlIGBoYXZpbmdgIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCBicmFuZHMgd2l0aCBtb3JlIHRoYW4gb25lIGNhclxuICAgKiBhd2FpdCBkYi5zZWxlY3Qoe1xuICAgKiBcdGJyYW5kOiBjYXJzLmJyYW5kLFxuICAgKiBcdGNvdW50OiBzcWw8bnVtYmVyPmBjYXN0KGNvdW50KCR7Y2Fycy5pZH0pIGFzIGludClgLFxuICAgKiB9KVxuICAgKiAgIC5mcm9tKGNhcnMpXG4gICAqICAgLmdyb3VwQnkoY2Fycy5icmFuZClcbiAgICogICAuaGF2aW5nKCh7IGNvdW50IH0pID0+IGd0KGNvdW50LCAxKSk7XG4gICAqIGBgYFxuICAgKi9cbiAgaGF2aW5nKGhhdmluZykge1xuICAgIGlmICh0eXBlb2YgaGF2aW5nID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGhhdmluZyA9IGhhdmluZyhcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcInNxbFwiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy5oYXZpbmcgPSBoYXZpbmc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ3JvdXBCeSguLi5jb2x1bW5zKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW5zWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IGdyb3VwQnkgPSBjb2x1bW5zWzBdKFxuICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzLFxuICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLmdyb3VwQnkgPSBBcnJheS5pc0FycmF5KGdyb3VwQnkpID8gZ3JvdXBCeSA6IFtncm91cEJ5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWcuZ3JvdXBCeSA9IGNvbHVtbnM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9yZGVyQnkoLi4uY29sdW1ucykge1xuICAgIGlmICh0eXBlb2YgY29sdW1uc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmRlckJ5ID0gY29sdW1uc1swXShcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCBvcmRlckJ5QXJyYXkgPSBBcnJheS5pc0FycmF5KG9yZGVyQnkpID8gb3JkZXJCeSA6IFtvcmRlckJ5XTtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMuYXQoLTEpLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbmZpZy5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcmRlckJ5QXJyYXkgPSBjb2x1bW5zO1xuICAgICAgaWYgKHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5hdCgtMSkub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgYGxpbWl0YCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSB0aGlzIHF1ZXJ5LlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NlbGVjdCNsaW1pdC0tb2Zmc2V0fVxuICAgKlxuICAgKiBAcGFyYW0gbGltaXQgdGhlIGBsaW1pdGAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBHZXQgdGhlIGZpcnN0IDEwIHBlb3BsZSBmcm9tIHRoaXMgcXVlcnkuXG4gICAqIGF3YWl0IGRiLnNlbGVjdCgpLmZyb20ocGVvcGxlKS5saW1pdCgxMCk7XG4gICAqIGBgYFxuICAgKi9cbiAgbGltaXQobGltaXQpIHtcbiAgICBpZiAodGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5hdCgtMSkubGltaXQgPSBsaW1pdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWcubGltaXQgPSBsaW1pdDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYW4gYG9mZnNldGAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHNraXAgYSBudW1iZXIgb2Ygcm93cyB3aGVuIHJldHVybmluZyByZXN1bHRzIGZyb20gdGhpcyBxdWVyeS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZWxlY3QjbGltaXQtLW9mZnNldH1cbiAgICpcbiAgICogQHBhcmFtIG9mZnNldCB0aGUgYG9mZnNldGAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBHZXQgdGhlIDEwdGgtMjB0aCBwZW9wbGUgZnJvbSB0aGlzIHF1ZXJ5LlxuICAgKiBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKHBlb3BsZSkub2Zmc2V0KDEwKS5saW1pdCgxMCk7XG4gICAqIGBgYFxuICAgKi9cbiAgb2Zmc2V0KG9mZnNldCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmF0KC0xKS5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZmlnLm9mZnNldCA9IG9mZnNldDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbGVjdC5idWlsZFNlbGVjdFF1ZXJ5KHRoaXMuY29uZmlnKTtcbiAgfVxuICB0b1NRTCgpIHtcbiAgICBjb25zdCB7IHR5cGluZ3M6IF90eXBpbmdzLCAuLi5yZXN0IH0gPSB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKTtcbiAgICByZXR1cm4gcmVzdDtcbiAgfVxuICBhcyhhbGlhcykge1xuICAgIGNvbnN0IHVzZWRUYWJsZXMgPSBbXTtcbiAgICB1c2VkVGFibGVzLnB1c2goLi4uZXh0cmFjdFVzZWRUYWJsZSh0aGlzLmNvbmZpZy50YWJsZSkpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5qb2lucykge1xuICAgICAgZm9yIChjb25zdCBpdCBvZiB0aGlzLmNvbmZpZy5qb2lucykgdXNlZFRhYmxlcy5wdXNoKC4uLmV4dHJhY3RVc2VkVGFibGUoaXQudGFibGUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm94eShcbiAgICAgIG5ldyBTdWJxdWVyeSh0aGlzLmdldFNRTCgpLCB0aGlzLmNvbmZpZy5maWVsZHMsIGFsaWFzLCBmYWxzZSwgWy4uLm5ldyBTZXQodXNlZFRhYmxlcyldKSxcbiAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBhbGlhcywgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcImVycm9yXCIgfSlcbiAgICApO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U2VsZWN0ZWRGaWVsZHMoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShcbiAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyxcbiAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBhbGlhczogdGhpcy50YWJsZU5hbWUsIHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJlcnJvclwiIH0pXG4gICAgKTtcbiAgfVxuICAkZHluYW1pYygpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuY2xhc3MgU1FMaXRlU2VsZWN0QmFzZSBleHRlbmRzIFNRTGl0ZVNlbGVjdFF1ZXJ5QnVpbGRlckJhc2Uge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVTZWxlY3RcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJlcGFyZShpc09uZVRpbWVRdWVyeSA9IHRydWUpIHtcbiAgICBpZiAoIXRoaXMuc2Vzc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGV4ZWN1dGUgYSBxdWVyeSBvbiBhIHF1ZXJ5IGJ1aWxkZXIuIFBsZWFzZSB1c2UgYSBkYXRhYmFzZSBpbnN0YW5jZSBpbnN0ZWFkLlwiKTtcbiAgICB9XG4gICAgY29uc3QgZmllbGRzTGlzdCA9IG9yZGVyU2VsZWN0ZWRGaWVsZHModGhpcy5jb25maWcuZmllbGRzKTtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2Vzc2lvbltpc09uZVRpbWVRdWVyeSA/IFwicHJlcGFyZU9uZVRpbWVRdWVyeVwiIDogXCJwcmVwYXJlUXVlcnlcIl0oXG4gICAgICB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKSxcbiAgICAgIGZpZWxkc0xpc3QsXG4gICAgICBcImFsbFwiLFxuICAgICAgdHJ1ZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJzZWxlY3RcIixcbiAgICAgICAgdGFibGVzOiBbLi4udGhpcy51c2VkVGFibGVzXVxuICAgICAgfSxcbiAgICAgIHRoaXMuY2FjaGVDb25maWdcbiAgICApO1xuICAgIHF1ZXJ5LmpvaW5zTm90TnVsbGFibGVNYXAgPSB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXA7XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG4gICR3aXRoQ2FjaGUoY29uZmlnKSB7XG4gICAgdGhpcy5jYWNoZUNvbmZpZyA9IGNvbmZpZyA9PT0gdm9pZCAwID8geyBjb25maWc6IHt9LCBlbmFibGU6IHRydWUsIGF1dG9JbnZhbGlkYXRlOiB0cnVlIH0gOiBjb25maWcgPT09IGZhbHNlID8geyBlbmFibGU6IGZhbHNlIH0gOiB7IGVuYWJsZTogdHJ1ZSwgYXV0b0ludmFsaWRhdGU6IHRydWUsIC4uLmNvbmZpZyB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHByZXBhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpO1xuICB9XG4gIHJ1biA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkucnVuKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYWxsID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5hbGwocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBnZXQgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmdldChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIHZhbHVlcyA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkudmFsdWVzKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5hbGwoKTtcbiAgfVxufVxuYXBwbHlNaXhpbnMoU1FMaXRlU2VsZWN0QmFzZSwgW1F1ZXJ5UHJvbWlzZV0pO1xuZnVuY3Rpb24gY3JlYXRlU2V0T3BlcmF0b3IodHlwZSwgaXNBbGwpIHtcbiAgcmV0dXJuIChsZWZ0U2VsZWN0LCByaWdodFNlbGVjdCwgLi4ucmVzdFNlbGVjdHMpID0+IHtcbiAgICBjb25zdCBzZXRPcGVyYXRvcnMgPSBbcmlnaHRTZWxlY3QsIC4uLnJlc3RTZWxlY3RzXS5tYXAoKHNlbGVjdCkgPT4gKHtcbiAgICAgIHR5cGUsXG4gICAgICBpc0FsbCxcbiAgICAgIHJpZ2h0U2VsZWN0OiBzZWxlY3RcbiAgICB9KSk7XG4gICAgZm9yIChjb25zdCBzZXRPcGVyYXRvciBvZiBzZXRPcGVyYXRvcnMpIHtcbiAgICAgIGlmICghaGF2ZVNhbWVLZXlzKGxlZnRTZWxlY3QuZ2V0U2VsZWN0ZWRGaWVsZHMoKSwgc2V0T3BlcmF0b3IucmlnaHRTZWxlY3QuZ2V0U2VsZWN0ZWRGaWVsZHMoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiU2V0IG9wZXJhdG9yIGVycm9yICh1bmlvbiAvIGludGVyc2VjdCAvIGV4Y2VwdCk6IHNlbGVjdGVkIGZpZWxkcyBhcmUgbm90IHRoZSBzYW1lIG9yIGFyZSBpbiBhIGRpZmZlcmVudCBvcmRlclwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsZWZ0U2VsZWN0LmFkZFNldE9wZXJhdG9ycyhzZXRPcGVyYXRvcnMpO1xuICB9O1xufVxuY29uc3QgZ2V0U1FMaXRlU2V0T3BlcmF0b3JzID0gKCkgPT4gKHtcbiAgdW5pb24sXG4gIHVuaW9uQWxsLFxuICBpbnRlcnNlY3QsXG4gIGV4Y2VwdFxufSk7XG5jb25zdCB1bmlvbiA9IGNyZWF0ZVNldE9wZXJhdG9yKFwidW5pb25cIiwgZmFsc2UpO1xuY29uc3QgdW5pb25BbGwgPSBjcmVhdGVTZXRPcGVyYXRvcihcInVuaW9uXCIsIHRydWUpO1xuY29uc3QgaW50ZXJzZWN0ID0gY3JlYXRlU2V0T3BlcmF0b3IoXCJpbnRlcnNlY3RcIiwgZmFsc2UpO1xuY29uc3QgZXhjZXB0ID0gY3JlYXRlU2V0T3BlcmF0b3IoXCJleGNlcHRcIiwgZmFsc2UpO1xuZXhwb3J0IHtcbiAgU1FMaXRlU2VsZWN0QmFzZSxcbiAgU1FMaXRlU2VsZWN0QnVpbGRlcixcbiAgU1FMaXRlU2VsZWN0UXVlcnlCdWlsZGVyQmFzZSxcbiAgZXhjZXB0LFxuICBpbnRlcnNlY3QsXG4gIHVuaW9uLFxuICB1bmlvbkFsbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlbGVjdC5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU2VsZWN0aW9uUHJveHlIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL3NlbGVjdGlvbi1wcm94eS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlRGlhbGVjdCwgU1FMaXRlU3luY0RpYWxlY3QgfSBmcm9tIFwiLi4vZGlhbGVjdC5qc1wiO1xuaW1wb3J0IHsgV2l0aFN1YnF1ZXJ5IH0gZnJvbSBcIi4uLy4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVTZWxlY3RCdWlsZGVyIH0gZnJvbSBcIi4vc2VsZWN0LmpzXCI7XG5jbGFzcyBRdWVyeUJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVRdWVyeUJ1aWxkZXJcIjtcbiAgZGlhbGVjdDtcbiAgZGlhbGVjdENvbmZpZztcbiAgY29uc3RydWN0b3IoZGlhbGVjdCkge1xuICAgIHRoaXMuZGlhbGVjdCA9IGlzKGRpYWxlY3QsIFNRTGl0ZURpYWxlY3QpID8gZGlhbGVjdCA6IHZvaWQgMDtcbiAgICB0aGlzLmRpYWxlY3RDb25maWcgPSBpcyhkaWFsZWN0LCBTUUxpdGVEaWFsZWN0KSA/IHZvaWQgMCA6IGRpYWxlY3Q7XG4gIH1cbiAgJHdpdGggPSAoYWxpYXMsIHNlbGVjdGlvbikgPT4ge1xuICAgIGNvbnN0IHF1ZXJ5QnVpbGRlciA9IHRoaXM7XG4gICAgY29uc3QgYXMgPSAocWIpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcWIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBxYiA9IHFiKHF1ZXJ5QnVpbGRlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFByb3h5KFxuICAgICAgICBuZXcgV2l0aFN1YnF1ZXJ5KFxuICAgICAgICAgIHFiLmdldFNRTCgpLFxuICAgICAgICAgIHNlbGVjdGlvbiA/PyAoXCJnZXRTZWxlY3RlZEZpZWxkc1wiIGluIHFiID8gcWIuZ2V0U2VsZWN0ZWRGaWVsZHMoKSA/PyB7fSA6IHt9KSxcbiAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICksXG4gICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBhbGlhcywgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcImVycm9yXCIgfSlcbiAgICAgICk7XG4gICAgfTtcbiAgICByZXR1cm4geyBhcyB9O1xuICB9O1xuICB3aXRoKC4uLnF1ZXJpZXMpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBmdW5jdGlvbiBzZWxlY3QoZmllbGRzKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoe1xuICAgICAgICBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsXG4gICAgICAgIHNlc3Npb246IHZvaWQgMCxcbiAgICAgICAgZGlhbGVjdDogc2VsZi5nZXREaWFsZWN0KCksXG4gICAgICAgIHdpdGhMaXN0OiBxdWVyaWVzXG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2VsZWN0RGlzdGluY3QoZmllbGRzKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoe1xuICAgICAgICBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsXG4gICAgICAgIHNlc3Npb246IHZvaWQgMCxcbiAgICAgICAgZGlhbGVjdDogc2VsZi5nZXREaWFsZWN0KCksXG4gICAgICAgIHdpdGhMaXN0OiBxdWVyaWVzLFxuICAgICAgICBkaXN0aW5jdDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7IHNlbGVjdCwgc2VsZWN0RGlzdGluY3QgfTtcbiAgfVxuICBzZWxlY3QoZmllbGRzKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHsgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLCBzZXNzaW9uOiB2b2lkIDAsIGRpYWxlY3Q6IHRoaXMuZ2V0RGlhbGVjdCgpIH0pO1xuICB9XG4gIHNlbGVjdERpc3RpbmN0KGZpZWxkcykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7XG4gICAgICBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsXG4gICAgICBzZXNzaW9uOiB2b2lkIDAsXG4gICAgICBkaWFsZWN0OiB0aGlzLmdldERpYWxlY3QoKSxcbiAgICAgIGRpc3RpbmN0OiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgLy8gTGF6eSBsb2FkIGRpYWxlY3QgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeVxuICBnZXREaWFsZWN0KCkge1xuICAgIGlmICghdGhpcy5kaWFsZWN0KSB7XG4gICAgICB0aGlzLmRpYWxlY3QgPSBuZXcgU1FMaXRlU3luY0RpYWxlY3QodGhpcy5kaWFsZWN0Q29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGlhbGVjdDtcbiAgfVxufVxuZXhwb3J0IHtcbiAgUXVlcnlCdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnktYnVpbGRlci5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmltcG9ydCB7IFBhcmFtLCBTUUwsIHNxbCB9IGZyb20gXCIuLi8uLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgQ29sdW1ucywgVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IGhhdmVTYW1lS2V5cywgbWFwVXBkYXRlU2V0LCBvcmRlclNlbGVjdGVkRmllbGRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBleHRyYWN0VXNlZFRhYmxlIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9xdWVyeS1idWlsZGVyLmpzXCI7XG5jbGFzcyBTUUxpdGVJbnNlcnRCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IodGFibGUsIHNlc3Npb24sIGRpYWxlY3QsIHdpdGhMaXN0KSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLndpdGhMaXN0ID0gd2l0aExpc3Q7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW5zZXJ0QnVpbGRlclwiO1xuICB2YWx1ZXModmFsdWVzKSB7XG4gICAgdmFsdWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZXMpID8gdmFsdWVzIDogW3ZhbHVlc107XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInZhbHVlcygpIG11c3QgYmUgY2FsbGVkIHdpdGggYXQgbGVhc3Qgb25lIHZhbHVlXCIpO1xuICAgIH1cbiAgICBjb25zdCBtYXBwZWRWYWx1ZXMgPSB2YWx1ZXMubWFwKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICBjb25zdCBjb2xzID0gdGhpcy50YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG4gICAgICBmb3IgKGNvbnN0IGNvbEtleSBvZiBPYmplY3Qua2V5cyhlbnRyeSkpIHtcbiAgICAgICAgY29uc3QgY29sVmFsdWUgPSBlbnRyeVtjb2xLZXldO1xuICAgICAgICByZXN1bHRbY29sS2V5XSA9IGlzKGNvbFZhbHVlLCBTUUwpID8gY29sVmFsdWUgOiBuZXcgUGFyYW0oY29sVmFsdWUsIGNvbHNbY29sS2V5XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgU1FMaXRlSW5zZXJ0QmFzZSh0aGlzLnRhYmxlLCBtYXBwZWRWYWx1ZXMsIHRoaXMuc2Vzc2lvbiwgdGhpcy5kaWFsZWN0LCB0aGlzLndpdGhMaXN0KTtcbiAgfVxuICBzZWxlY3Qoc2VsZWN0UXVlcnkpIHtcbiAgICBjb25zdCBzZWxlY3QgPSB0eXBlb2Ygc2VsZWN0UXVlcnkgPT09IFwiZnVuY3Rpb25cIiA/IHNlbGVjdFF1ZXJ5KG5ldyBRdWVyeUJ1aWxkZXIoKSkgOiBzZWxlY3RRdWVyeTtcbiAgICBpZiAoIWlzKHNlbGVjdCwgU1FMKSAmJiAhaGF2ZVNhbWVLZXlzKHRoaXMudGFibGVbQ29sdW1uc10sIHNlbGVjdC5fLnNlbGVjdGVkRmllbGRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkluc2VydCBzZWxlY3QgZXJyb3I6IHNlbGVjdGVkIGZpZWxkcyBhcmUgbm90IHRoZSBzYW1lIG9yIGFyZSBpbiBhIGRpZmZlcmVudCBvcmRlciBjb21wYXJlZCB0byB0aGUgdGFibGUgZGVmaW5pdGlvblwiXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNRTGl0ZUluc2VydEJhc2UodGhpcy50YWJsZSwgc2VsZWN0LCB0aGlzLnNlc3Npb24sIHRoaXMuZGlhbGVjdCwgdGhpcy53aXRoTGlzdCwgdHJ1ZSk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUluc2VydEJhc2UgZXh0ZW5kcyBRdWVyeVByb21pc2Uge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgdmFsdWVzLCBzZXNzaW9uLCBkaWFsZWN0LCB3aXRoTGlzdCwgc2VsZWN0KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5jb25maWcgPSB7IHRhYmxlLCB2YWx1ZXMsIHdpdGhMaXN0LCBzZWxlY3QgfTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVJbnNlcnRcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25maWc7XG4gIHJldHVybmluZyhmaWVsZHMgPSB0aGlzLmNvbmZpZy50YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuQ29sdW1uc10pIHtcbiAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPSBvcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYW4gYG9uIGNvbmZsaWN0IGRvIG5vdGhpbmdgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgc2ltcGx5IGF2b2lkcyBpbnNlcnRpbmcgYSByb3cgYXMgaXRzIGFsdGVybmF0aXZlIGFjdGlvbi5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9pbnNlcnQjb24tY29uZmxpY3QtZG8tbm90aGluZ31cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyBUaGUgYHRhcmdldGAgYW5kIGB3aGVyZWAgY2xhdXNlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogLy8gSW5zZXJ0IG9uZSByb3cgYW5kIGNhbmNlbCB0aGUgaW5zZXJ0IGlmIHRoZXJlJ3MgYSBjb25mbGljdFxuICAgKiBhd2FpdCBkYi5pbnNlcnQoY2FycylcbiAgICogICAudmFsdWVzKHsgaWQ6IDEsIGJyYW5kOiAnQk1XJyB9KVxuICAgKiAgIC5vbkNvbmZsaWN0RG9Ob3RoaW5nKCk7XG4gICAqXG4gICAqIC8vIEV4cGxpY2l0bHkgc3BlY2lmeSBjb25mbGljdCB0YXJnZXRcbiAgICogYXdhaXQgZGIuaW5zZXJ0KGNhcnMpXG4gICAqICAgLnZhbHVlcyh7IGlkOiAxLCBicmFuZDogJ0JNVycgfSlcbiAgICogICAub25Db25mbGljdERvTm90aGluZyh7IHRhcmdldDogY2Fycy5pZCB9KTtcbiAgICogYGBgXG4gICAqL1xuICBvbkNvbmZsaWN0RG9Ob3RoaW5nKGNvbmZpZyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5vbkNvbmZsaWN0KSB0aGlzLmNvbmZpZy5vbkNvbmZsaWN0ID0gW107XG4gICAgaWYgKGNvbmZpZy50YXJnZXQgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5jb25maWcub25Db25mbGljdC5wdXNoKHNxbGAgb24gY29uZmxpY3QgZG8gbm90aGluZ2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YXJnZXRTcWwgPSBBcnJheS5pc0FycmF5KGNvbmZpZy50YXJnZXQpID8gc3FsYCR7Y29uZmlnLnRhcmdldH1gIDogc3FsYCR7W2NvbmZpZy50YXJnZXRdfWA7XG4gICAgICBjb25zdCB3aGVyZVNxbCA9IGNvbmZpZy53aGVyZSA/IHNxbGAgd2hlcmUgJHtjb25maWcud2hlcmV9YCA6IHNxbGBgO1xuICAgICAgdGhpcy5jb25maWcub25Db25mbGljdC5wdXNoKHNxbGAgb24gY29uZmxpY3QgJHt0YXJnZXRTcWx9IGRvIG5vdGhpbmcke3doZXJlU3FsfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhbiBgb24gY29uZmxpY3QgZG8gdXBkYXRlYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZSBleGlzdGluZyByb3cgdGhhdCBjb25mbGljdHMgd2l0aCB0aGUgcm93IHByb3Bvc2VkIGZvciBpbnNlcnRpb24gYXMgaXRzIGFsdGVybmF0aXZlIGFjdGlvbi5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9pbnNlcnQjdXBzZXJ0cy1hbmQtY29uZmxpY3RzfVxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIFRoZSBgdGFyZ2V0YCwgYHNldGAgYW5kIGB3aGVyZWAgY2xhdXNlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogLy8gVXBkYXRlIHRoZSByb3cgaWYgdGhlcmUncyBhIGNvbmZsaWN0XG4gICAqIGF3YWl0IGRiLmluc2VydChjYXJzKVxuICAgKiAgIC52YWx1ZXMoeyBpZDogMSwgYnJhbmQ6ICdCTVcnIH0pXG4gICAqICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAqICAgICB0YXJnZXQ6IGNhcnMuaWQsXG4gICAqICAgICBzZXQ6IHsgYnJhbmQ6ICdQb3JzY2hlJyB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqIC8vIFVwc2VydCB3aXRoICd3aGVyZScgY2xhdXNlXG4gICAqIGF3YWl0IGRiLmluc2VydChjYXJzKVxuICAgKiAgIC52YWx1ZXMoeyBpZDogMSwgYnJhbmQ6ICdCTVcnIH0pXG4gICAqICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAqICAgICB0YXJnZXQ6IGNhcnMuaWQsXG4gICAqICAgICBzZXQ6IHsgYnJhbmQ6ICduZXdCTVcnIH0sXG4gICAqICAgICB3aGVyZTogc3FsYCR7Y2Fycy5jcmVhdGVkQXR9ID4gJzIwMjMtMDEtMDEnOjpkYXRlYCxcbiAgICogICB9KTtcbiAgICogYGBgXG4gICAqL1xuICBvbkNvbmZsaWN0RG9VcGRhdGUoY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZy53aGVyZSAmJiAoY29uZmlnLnRhcmdldFdoZXJlIHx8IGNvbmZpZy5zZXRXaGVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1lvdSBjYW5ub3QgdXNlIGJvdGggXCJ3aGVyZVwiIGFuZCBcInRhcmdldFdoZXJlXCIvXCJzZXRXaGVyZVwiIGF0IHRoZSBzYW1lIHRpbWUgLSBcIndoZXJlXCIgaXMgZGVwcmVjYXRlZCwgdXNlIFwidGFyZ2V0V2hlcmVcIiBvciBcInNldFdoZXJlXCIgaW5zdGVhZC4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY29uZmlnLm9uQ29uZmxpY3QpIHRoaXMuY29uZmlnLm9uQ29uZmxpY3QgPSBbXTtcbiAgICBjb25zdCB3aGVyZVNxbCA9IGNvbmZpZy53aGVyZSA/IHNxbGAgd2hlcmUgJHtjb25maWcud2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCB0YXJnZXRXaGVyZVNxbCA9IGNvbmZpZy50YXJnZXRXaGVyZSA/IHNxbGAgd2hlcmUgJHtjb25maWcudGFyZ2V0V2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBzZXRXaGVyZVNxbCA9IGNvbmZpZy5zZXRXaGVyZSA/IHNxbGAgd2hlcmUgJHtjb25maWcuc2V0V2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCB0YXJnZXRTcWwgPSBBcnJheS5pc0FycmF5KGNvbmZpZy50YXJnZXQpID8gc3FsYCR7Y29uZmlnLnRhcmdldH1gIDogc3FsYCR7W2NvbmZpZy50YXJnZXRdfWA7XG4gICAgY29uc3Qgc2V0U3FsID0gdGhpcy5kaWFsZWN0LmJ1aWxkVXBkYXRlU2V0KHRoaXMuY29uZmlnLnRhYmxlLCBtYXBVcGRhdGVTZXQodGhpcy5jb25maWcudGFibGUsIGNvbmZpZy5zZXQpKTtcbiAgICB0aGlzLmNvbmZpZy5vbkNvbmZsaWN0LnB1c2goXG4gICAgICBzcWxgIG9uIGNvbmZsaWN0ICR7dGFyZ2V0U3FsfSR7dGFyZ2V0V2hlcmVTcWx9IGRvIHVwZGF0ZSBzZXQgJHtzZXRTcWx9JHt3aGVyZVNxbH0ke3NldFdoZXJlU3FsfWBcbiAgICApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiB0aGlzLmRpYWxlY3QuYnVpbGRJbnNlcnRRdWVyeSh0aGlzLmNvbmZpZyk7XG4gIH1cbiAgdG9TUUwoKSB7XG4gICAgY29uc3QgeyB0eXBpbmdzOiBfdHlwaW5ncywgLi4ucmVzdCB9ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSk7XG4gICAgcmV0dXJuIHJlc3Q7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJlcGFyZShpc09uZVRpbWVRdWVyeSA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uW2lzT25lVGltZVF1ZXJ5ID8gXCJwcmVwYXJlT25lVGltZVF1ZXJ5XCIgOiBcInByZXBhcmVRdWVyeVwiXShcbiAgICAgIHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nID8gXCJhbGxcIiA6IFwicnVuXCIsXG4gICAgICB0cnVlLFxuICAgICAgdm9pZCAwLFxuICAgICAge1xuICAgICAgICB0eXBlOiBcImluc2VydFwiLFxuICAgICAgICB0YWJsZXM6IGV4dHJhY3RVc2VkVGFibGUodGhpcy5jb25maWcudGFibGUpXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwcmVwYXJlKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKTtcbiAgfVxuICBydW4gPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnJ1bihwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFsbCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuYWxsKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgZ2V0ID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5nZXQocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICB2YWx1ZXMgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJldHVybmluZyA/IHRoaXMuYWxsKCkgOiB0aGlzLnJ1bigpO1xuICB9XG4gICRkeW5hbWljKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5leHBvcnQge1xuICBTUUxpdGVJbnNlcnRCYXNlLFxuICBTUUxpdGVJbnNlcnRCdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5zZXJ0LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuaW1wb3J0IHsgU2VsZWN0aW9uUHJveHlIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL3NlbGVjdGlvbi1wcm94eS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4uLy4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS5qc1wiO1xuaW1wb3J0IHtcbiAgZ2V0VGFibGVMaWtlTmFtZSxcbiAgbWFwVXBkYXRlU2V0LFxuICBvcmRlclNlbGVjdGVkRmllbGRzXG59IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi4vLi4vdmlldy1jb21tb24uanNcIjtcbmltcG9ydCB7IGV4dHJhY3RVc2VkVGFibGUgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVZpZXdCYXNlIH0gZnJvbSBcIi4uL3ZpZXctYmFzZS5qc1wiO1xuY2xhc3MgU1FMaXRlVXBkYXRlQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBzZXNzaW9uLCBkaWFsZWN0LCB3aXRoTGlzdCkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy53aXRoTGlzdCA9IHdpdGhMaXN0O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVVwZGF0ZUJ1aWxkZXJcIjtcbiAgc2V0KHZhbHVlcykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVXBkYXRlQmFzZShcbiAgICAgIHRoaXMudGFibGUsXG4gICAgICBtYXBVcGRhdGVTZXQodGhpcy50YWJsZSwgdmFsdWVzKSxcbiAgICAgIHRoaXMuc2Vzc2lvbixcbiAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgIHRoaXMud2l0aExpc3RcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVVcGRhdGVCYXNlIGV4dGVuZHMgUXVlcnlQcm9taXNlIHtcbiAgY29uc3RydWN0b3IodGFibGUsIHNldCwgc2Vzc2lvbiwgZGlhbGVjdCwgd2l0aExpc3QpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLmNvbmZpZyA9IHsgc2V0LCB0YWJsZSwgd2l0aExpc3QsIGpvaW5zOiBbXSB9O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVVwZGF0ZVwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbmZpZztcbiAgZnJvbShzb3VyY2UpIHtcbiAgICB0aGlzLmNvbmZpZy5mcm9tID0gc291cmNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGNyZWF0ZUpvaW4oam9pblR5cGUpIHtcbiAgICByZXR1cm4gKHRhYmxlLCBvbikgPT4ge1xuICAgICAgY29uc3QgdGFibGVOYW1lID0gZ2V0VGFibGVMaWtlTmFtZSh0YWJsZSk7XG4gICAgICBpZiAodHlwZW9mIHRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLmNvbmZpZy5qb2lucy5zb21lKChqb2luKSA9PiBqb2luLmFsaWFzID09PSB0YWJsZU5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQWxpYXMgXCIke3RhYmxlTmFtZX1cIiBpcyBhbHJlYWR5IHVzZWQgaW4gdGhpcyBxdWVyeWApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IGZyb20gPSB0aGlzLmNvbmZpZy5mcm9tID8gaXModGFibGUsIFNRTGl0ZVRhYmxlKSA/IHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSA6IGlzKHRhYmxlLCBTdWJxdWVyeSkgPyB0YWJsZS5fLnNlbGVjdGVkRmllbGRzIDogaXModGFibGUsIFNRTGl0ZVZpZXdCYXNlKSA/IHRhYmxlW1ZpZXdCYXNlQ29uZmlnXS5zZWxlY3RlZEZpZWxkcyA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgICAgb24gPSBvbihcbiAgICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy50YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10sXG4gICAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcInNxbFwiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICAgICksXG4gICAgICAgICAgZnJvbSAmJiBuZXcgUHJveHkoXG4gICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJzcWxcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbmZpZy5qb2lucy5wdXNoKHsgb24sIHRhYmxlLCBqb2luVHlwZSwgYWxpYXM6IHRhYmxlTmFtZSB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gIH1cbiAgbGVmdEpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJsZWZ0XCIpO1xuICByaWdodEpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJyaWdodFwiKTtcbiAgaW5uZXJKb2luID0gdGhpcy5jcmVhdGVKb2luKFwiaW5uZXJcIik7XG4gIGZ1bGxKb2luID0gdGhpcy5jcmVhdGVKb2luKFwiZnVsbFwiKTtcbiAgLyoqXG4gICAqIEFkZHMgYSAnd2hlcmUnIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgb25seSB0aG9zZSByb3dzIHRoYXQgZnVsZmlsbCBhIHNwZWNpZmllZCBjb25kaXRpb24uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvdXBkYXRlfVxuICAgKlxuICAgKiBAcGFyYW0gd2hlcmUgdGhlICd3aGVyZScgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBZb3UgY2FuIHVzZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgYW5kIGBzcWwgZnVuY3Rpb25gIHRvIGZpbHRlciB0aGUgcm93cyB0byBiZSB1cGRhdGVkLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBVcGRhdGUgYWxsIGNhcnMgd2l0aCBncmVlbiBjb2xvclxuICAgKiBkYi51cGRhdGUoY2Fycykuc2V0KHsgY29sb3I6ICdyZWQnIH0pXG4gICAqICAgLndoZXJlKGVxKGNhcnMuY29sb3IsICdncmVlbicpKTtcbiAgICogLy8gb3JcbiAgICogZGIudXBkYXRlKGNhcnMpLnNldCh7IGNvbG9yOiAncmVkJyB9KVxuICAgKiAgIC53aGVyZShzcWxgJHtjYXJzLmNvbG9yfSA9ICdncmVlbidgKVxuICAgKiBgYGBcbiAgICpcbiAgICogWW91IGNhbiBsb2dpY2FsbHkgY29tYmluZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgd2l0aCBgYW5kKClgIGFuZCBgb3IoKWAgb3BlcmF0b3JzOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBVcGRhdGUgYWxsIEJNVyBjYXJzIHdpdGggYSBncmVlbiBjb2xvclxuICAgKiBkYi51cGRhdGUoY2Fycykuc2V0KHsgY29sb3I6ICdyZWQnIH0pXG4gICAqICAgLndoZXJlKGFuZChlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSwgZXEoY2Fycy5icmFuZCwgJ0JNVycpKSk7XG4gICAqXG4gICAqIC8vIFVwZGF0ZSBhbGwgY2FycyB3aXRoIHRoZSBncmVlbiBvciBibHVlIGNvbG9yXG4gICAqIGRiLnVwZGF0ZShjYXJzKS5zZXQoeyBjb2xvcjogJ3JlZCcgfSlcbiAgICogICAud2hlcmUob3IoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJyksIGVxKGNhcnMuY29sb3IsICdibHVlJykpKTtcbiAgICogYGBgXG4gICAqL1xuICB3aGVyZSh3aGVyZSkge1xuICAgIHRoaXMuY29uZmlnLndoZXJlID0gd2hlcmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb3JkZXJCeSguLi5jb2x1bW5zKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW5zWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yZGVyQnkgPSBjb2x1bW5zWzBdKFxuICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgdGhpcy5jb25maWcudGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdLFxuICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG9yZGVyQnlBcnJheSA9IEFycmF5LmlzQXJyYXkob3JkZXJCeSkgPyBvcmRlckJ5IDogW29yZGVyQnldO1xuICAgICAgdGhpcy5jb25maWcub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3JkZXJCeUFycmF5ID0gY29sdW1ucztcbiAgICAgIHRoaXMuY29uZmlnLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGxpbWl0KGxpbWl0KSB7XG4gICAgdGhpcy5jb25maWcubGltaXQgPSBsaW1pdDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICByZXR1cm5pbmcoZmllbGRzID0gdGhpcy5jb25maWcudGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkNvbHVtbnNdKSB7XG4gICAgdGhpcy5jb25maWcucmV0dXJuaW5nID0gb3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiB0aGlzLmRpYWxlY3QuYnVpbGRVcGRhdGVRdWVyeSh0aGlzLmNvbmZpZyk7XG4gIH1cbiAgdG9TUUwoKSB7XG4gICAgY29uc3QgeyB0eXBpbmdzOiBfdHlwaW5ncywgLi4ucmVzdCB9ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSk7XG4gICAgcmV0dXJuIHJlc3Q7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJlcGFyZShpc09uZVRpbWVRdWVyeSA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uW2lzT25lVGltZVF1ZXJ5ID8gXCJwcmVwYXJlT25lVGltZVF1ZXJ5XCIgOiBcInByZXBhcmVRdWVyeVwiXShcbiAgICAgIHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nID8gXCJhbGxcIiA6IFwicnVuXCIsXG4gICAgICB0cnVlLFxuICAgICAgdm9pZCAwLFxuICAgICAge1xuICAgICAgICB0eXBlOiBcImluc2VydFwiLFxuICAgICAgICB0YWJsZXM6IGV4dHJhY3RVc2VkVGFibGUodGhpcy5jb25maWcudGFibGUpXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwcmVwYXJlKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKTtcbiAgfVxuICBydW4gPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnJ1bihwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFsbCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuYWxsKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgZ2V0ID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5nZXQocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICB2YWx1ZXMgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJldHVybmluZyA/IHRoaXMuYWxsKCkgOiB0aGlzLnJ1bigpO1xuICB9XG4gICRkeW5hbWljKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5leHBvcnQge1xuICBTUUxpdGVVcGRhdGVCYXNlLFxuICBTUUxpdGVVcGRhdGVCdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXBkYXRlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNRTCwgc3FsIH0gZnJvbSBcIi4uLy4uL3NxbC9zcWwuanNcIjtcbmNsYXNzIFNRTGl0ZUNvdW50QnVpbGRlciBleHRlbmRzIFNRTCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKFNRTGl0ZUNvdW50QnVpbGRlci5idWlsZEVtYmVkZGVkQ291bnQocGFyYW1zLnNvdXJjZSwgcGFyYW1zLmZpbHRlcnMpLnF1ZXJ5Q2h1bmtzKTtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLnNlc3Npb24gPSBwYXJhbXMuc2Vzc2lvbjtcbiAgICB0aGlzLnNxbCA9IFNRTGl0ZUNvdW50QnVpbGRlci5idWlsZENvdW50KFxuICAgICAgcGFyYW1zLnNvdXJjZSxcbiAgICAgIHBhcmFtcy5maWx0ZXJzXG4gICAgKTtcbiAgfVxuICBzcWw7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUNvdW50QnVpbGRlckFzeW5jXCI7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddID0gXCJTUUxpdGVDb3VudEJ1aWxkZXJBc3luY1wiO1xuICBzZXNzaW9uO1xuICBzdGF0aWMgYnVpbGRFbWJlZGRlZENvdW50KHNvdXJjZSwgZmlsdGVycykge1xuICAgIHJldHVybiBzcWxgKHNlbGVjdCBjb3VudCgqKSBmcm9tICR7c291cmNlfSR7c3FsLnJhdyhcIiB3aGVyZSBcIikuaWYoZmlsdGVycyl9JHtmaWx0ZXJzfSlgO1xuICB9XG4gIHN0YXRpYyBidWlsZENvdW50KHNvdXJjZSwgZmlsdGVycykge1xuICAgIHJldHVybiBzcWxgc2VsZWN0IGNvdW50KCopIGZyb20gJHtzb3VyY2V9JHtzcWwucmF3KFwiIHdoZXJlIFwiKS5pZihmaWx0ZXJzKX0ke2ZpbHRlcnN9YDtcbiAgfVxuICB0aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnNlc3Npb24uY291bnQodGhpcy5zcWwpKS50aGVuKFxuICAgICAgb25mdWxmaWxsZWQsXG4gICAgICBvbnJlamVjdGVkXG4gICAgKTtcbiAgfVxuICBjYXRjaChvblJlamVjdGVkKSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbih2b2lkIDAsIG9uUmVqZWN0ZWQpO1xuICB9XG4gIGZpbmFsbHkob25GaW5hbGx5KSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICBvbkZpbmFsbHk/LigpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9LFxuICAgICAgKHJlYXNvbikgPT4ge1xuICAgICAgICBvbkZpbmFsbHk/LigpO1xuICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgU1FMaXRlQ291bnRCdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y291bnQuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmltcG9ydCB7XG4gIG1hcFJlbGF0aW9uYWxSb3dcbn0gZnJvbSBcIi4uLy4uL3JlbGF0aW9ucy5qc1wiO1xuY2xhc3MgUmVsYXRpb25hbFF1ZXJ5QnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKG1vZGUsIGZ1bGxTY2hlbWEsIHNjaGVtYSwgdGFibGVOYW1lc01hcCwgdGFibGUsIHRhYmxlQ29uZmlnLCBkaWFsZWN0LCBzZXNzaW9uKSB7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICB0aGlzLmZ1bGxTY2hlbWEgPSBmdWxsU2NoZW1hO1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMudGFibGVOYW1lc01hcCA9IHRhYmxlTmFtZXNNYXA7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMudGFibGVDb25maWcgPSB0YWJsZUNvbmZpZztcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQXN5bmNSZWxhdGlvbmFsUXVlcnlCdWlsZGVyXCI7XG4gIGZpbmRNYW55KGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09IFwic3luY1wiID8gbmV3IFNRTGl0ZVN5bmNSZWxhdGlvbmFsUXVlcnkoXG4gICAgICB0aGlzLmZ1bGxTY2hlbWEsXG4gICAgICB0aGlzLnNjaGVtYSxcbiAgICAgIHRoaXMudGFibGVOYW1lc01hcCxcbiAgICAgIHRoaXMudGFibGUsXG4gICAgICB0aGlzLnRhYmxlQ29uZmlnLFxuICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgdGhpcy5zZXNzaW9uLFxuICAgICAgY29uZmlnID8gY29uZmlnIDoge30sXG4gICAgICBcIm1hbnlcIlxuICAgICkgOiBuZXcgU1FMaXRlUmVsYXRpb25hbFF1ZXJ5KFxuICAgICAgdGhpcy5mdWxsU2NoZW1hLFxuICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0aGlzLnRhYmxlLFxuICAgICAgdGhpcy50YWJsZUNvbmZpZyxcbiAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgIHRoaXMuc2Vzc2lvbixcbiAgICAgIGNvbmZpZyA/IGNvbmZpZyA6IHt9LFxuICAgICAgXCJtYW55XCJcbiAgICApO1xuICB9XG4gIGZpbmRGaXJzdChjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBcInN5bmNcIiA/IG5ldyBTUUxpdGVTeW5jUmVsYXRpb25hbFF1ZXJ5KFxuICAgICAgdGhpcy5mdWxsU2NoZW1hLFxuICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0aGlzLnRhYmxlLFxuICAgICAgdGhpcy50YWJsZUNvbmZpZyxcbiAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgIHRoaXMuc2Vzc2lvbixcbiAgICAgIGNvbmZpZyA/IHsgLi4uY29uZmlnLCBsaW1pdDogMSB9IDogeyBsaW1pdDogMSB9LFxuICAgICAgXCJmaXJzdFwiXG4gICAgKSA6IG5ldyBTUUxpdGVSZWxhdGlvbmFsUXVlcnkoXG4gICAgICB0aGlzLmZ1bGxTY2hlbWEsXG4gICAgICB0aGlzLnNjaGVtYSxcbiAgICAgIHRoaXMudGFibGVOYW1lc01hcCxcbiAgICAgIHRoaXMudGFibGUsXG4gICAgICB0aGlzLnRhYmxlQ29uZmlnLFxuICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgdGhpcy5zZXNzaW9uLFxuICAgICAgY29uZmlnID8geyAuLi5jb25maWcsIGxpbWl0OiAxIH0gOiB7IGxpbWl0OiAxIH0sXG4gICAgICBcImZpcnN0XCJcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVSZWxhdGlvbmFsUXVlcnkgZXh0ZW5kcyBRdWVyeVByb21pc2Uge1xuICBjb25zdHJ1Y3RvcihmdWxsU2NoZW1hLCBzY2hlbWEsIHRhYmxlTmFtZXNNYXAsIHRhYmxlLCB0YWJsZUNvbmZpZywgZGlhbGVjdCwgc2Vzc2lvbiwgY29uZmlnLCBtb2RlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmZ1bGxTY2hlbWEgPSBmdWxsU2NoZW1hO1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMudGFibGVOYW1lc01hcCA9IHRhYmxlTmFtZXNNYXA7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMudGFibGVDb25maWcgPSB0YWJsZUNvbmZpZztcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVBc3luY1JlbGF0aW9uYWxRdWVyeVwiO1xuICAvKiogQGludGVybmFsICovXG4gIG1vZGU7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiB0aGlzLmRpYWxlY3QuYnVpbGRSZWxhdGlvbmFsUXVlcnkoe1xuICAgICAgZnVsbFNjaGVtYTogdGhpcy5mdWxsU2NoZW1hLFxuICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgIHRhYmxlTmFtZXNNYXA6IHRoaXMudGFibGVOYW1lc01hcCxcbiAgICAgIHRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgdGFibGVDb25maWc6IHRoaXMudGFibGVDb25maWcsXG4gICAgICBxdWVyeUNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICB0YWJsZUFsaWFzOiB0aGlzLnRhYmxlQ29uZmlnLnRzTmFtZVxuICAgIH0pLnNxbDtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9wcmVwYXJlKGlzT25lVGltZVF1ZXJ5ID0gZmFsc2UpIHtcbiAgICBjb25zdCB7IHF1ZXJ5LCBidWlsdFF1ZXJ5IH0gPSB0aGlzLl90b1NRTCgpO1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25baXNPbmVUaW1lUXVlcnkgPyBcInByZXBhcmVPbmVUaW1lUXVlcnlcIiA6IFwicHJlcGFyZVF1ZXJ5XCJdKFxuICAgICAgYnVpbHRRdWVyeSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHRoaXMubW9kZSA9PT0gXCJmaXJzdFwiID8gXCJnZXRcIiA6IFwiYWxsXCIsXG4gICAgICB0cnVlLFxuICAgICAgKHJhd1Jvd3MsIG1hcENvbHVtblZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSByYXdSb3dzLm1hcChcbiAgICAgICAgICAocm93KSA9PiBtYXBSZWxhdGlvbmFsUm93KHRoaXMuc2NoZW1hLCB0aGlzLnRhYmxlQ29uZmlnLCByb3csIHF1ZXJ5LnNlbGVjdGlvbiwgbWFwQ29sdW1uVmFsdWUpXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09IFwiZmlyc3RcIikge1xuICAgICAgICAgIHJldHVybiByb3dzWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJlcGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSk7XG4gIH1cbiAgX3RvU1FMKCkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5kaWFsZWN0LmJ1aWxkUmVsYXRpb25hbFF1ZXJ5KHtcbiAgICAgIGZ1bGxTY2hlbWE6IHRoaXMuZnVsbFNjaGVtYSxcbiAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICB0YWJsZU5hbWVzTWFwOiB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0YWJsZTogdGhpcy50YWJsZSxcbiAgICAgIHRhYmxlQ29uZmlnOiB0aGlzLnRhYmxlQ29uZmlnLFxuICAgICAgcXVlcnlDb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgdGFibGVBbGlhczogdGhpcy50YWJsZUNvbmZpZy50c05hbWVcbiAgICB9KTtcbiAgICBjb25zdCBidWlsdFF1ZXJ5ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkocXVlcnkuc3FsKTtcbiAgICByZXR1cm4geyBxdWVyeSwgYnVpbHRRdWVyeSB9O1xuICB9XG4gIHRvU1FMKCkge1xuICAgIHJldHVybiB0aGlzLl90b1NRTCgpLmJ1aWx0UXVlcnk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBleGVjdXRlUmF3KCkge1xuICAgIGlmICh0aGlzLm1vZGUgPT09IFwiZmlyc3RcIikge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpLmdldCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSkuYWxsKCk7XG4gIH1cbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmF3KCk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVN5bmNSZWxhdGlvbmFsUXVlcnkgZXh0ZW5kcyBTUUxpdGVSZWxhdGlvbmFsUXVlcnkge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVTeW5jUmVsYXRpb25hbFF1ZXJ5XCI7XG4gIHN5bmMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJhdygpO1xuICB9XG59XG5leHBvcnQge1xuICBSZWxhdGlvbmFsUXVlcnlCdWlsZGVyLFxuICBTUUxpdGVSZWxhdGlvbmFsUXVlcnksXG4gIFNRTGl0ZVN5bmNSZWxhdGlvbmFsUXVlcnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1xdWVyeS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuY2xhc3MgU1FMaXRlUmF3IGV4dGVuZHMgUXVlcnlQcm9taXNlIHtcbiAgY29uc3RydWN0b3IoZXhlY3V0ZSwgZ2V0U1FMLCBhY3Rpb24sIGRpYWxlY3QsIG1hcEJhdGNoUmVzdWx0KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmV4ZWN1dGUgPSBleGVjdXRlO1xuICAgIHRoaXMuZ2V0U1FMID0gZ2V0U1FMO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5tYXBCYXRjaFJlc3VsdCA9IG1hcEJhdGNoUmVzdWx0O1xuICAgIHRoaXMuY29uZmlnID0geyBhY3Rpb24gfTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVSYXdcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25maWc7XG4gIGdldFF1ZXJ5KCkge1xuICAgIHJldHVybiB7IC4uLnRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpLCBtZXRob2Q6IHRoaXMuY29uZmlnLmFjdGlvbiB9O1xuICB9XG4gIG1hcFJlc3VsdChyZXN1bHQsIGlzRnJvbUJhdGNoKSB7XG4gICAgcmV0dXJuIGlzRnJvbUJhdGNoID8gdGhpcy5tYXBCYXRjaFJlc3VsdChyZXN1bHQpIDogcmVzdWx0O1xuICB9XG4gIF9wcmVwYXJlKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgaXNSZXNwb25zZUluQXJyYXlNb2RlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgU1FMaXRlUmF3XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmF3LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNlbGVjdGlvblByb3h5SGFuZGxlciB9IGZyb20gXCIuLi9zZWxlY3Rpb24tcHJveHkuanNcIjtcbmltcG9ydCB7IHNxbCB9IGZyb20gXCIuLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQge1xuICBRdWVyeUJ1aWxkZXIsXG4gIFNRTGl0ZURlbGV0ZUJhc2UsXG4gIFNRTGl0ZUluc2VydEJ1aWxkZXIsXG4gIFNRTGl0ZVNlbGVjdEJ1aWxkZXIsXG4gIFNRTGl0ZVVwZGF0ZUJ1aWxkZXJcbn0gZnJvbSBcIi4vcXVlcnktYnVpbGRlcnMvaW5kZXguanNcIjtcbmltcG9ydCB7IFdpdGhTdWJxdWVyeSB9IGZyb20gXCIuLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ291bnRCdWlsZGVyIH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlcnMvY291bnQuanNcIjtcbmltcG9ydCB7IFJlbGF0aW9uYWxRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9xdWVyeS1idWlsZGVycy9xdWVyeS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlUmF3IH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlcnMvcmF3LmpzXCI7XG5jbGFzcyBCYXNlU1FMaXRlRGF0YWJhc2Uge1xuICBjb25zdHJ1Y3RvcihyZXN1bHRLaW5kLCBkaWFsZWN0LCBzZXNzaW9uLCBzY2hlbWEpIHtcbiAgICB0aGlzLnJlc3VsdEtpbmQgPSByZXN1bHRLaW5kO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLl8gPSBzY2hlbWEgPyB7XG4gICAgICBzY2hlbWE6IHNjaGVtYS5zY2hlbWEsXG4gICAgICBmdWxsU2NoZW1hOiBzY2hlbWEuZnVsbFNjaGVtYSxcbiAgICAgIHRhYmxlTmFtZXNNYXA6IHNjaGVtYS50YWJsZU5hbWVzTWFwXG4gICAgfSA6IHtcbiAgICAgIHNjaGVtYTogdm9pZCAwLFxuICAgICAgZnVsbFNjaGVtYToge30sXG4gICAgICB0YWJsZU5hbWVzTWFwOiB7fVxuICAgIH07XG4gICAgdGhpcy5xdWVyeSA9IHt9O1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyeTtcbiAgICBpZiAodGhpcy5fLnNjaGVtYSkge1xuICAgICAgZm9yIChjb25zdCBbdGFibGVOYW1lLCBjb2x1bW5zXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl8uc2NoZW1hKSkge1xuICAgICAgICBxdWVyeVt0YWJsZU5hbWVdID0gbmV3IFJlbGF0aW9uYWxRdWVyeUJ1aWxkZXIoXG4gICAgICAgICAgcmVzdWx0S2luZCxcbiAgICAgICAgICBzY2hlbWEuZnVsbFNjaGVtYSxcbiAgICAgICAgICB0aGlzLl8uc2NoZW1hLFxuICAgICAgICAgIHRoaXMuXy50YWJsZU5hbWVzTWFwLFxuICAgICAgICAgIHNjaGVtYS5mdWxsU2NoZW1hW3RhYmxlTmFtZV0sXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBkaWFsZWN0LFxuICAgICAgICAgIHNlc3Npb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4kY2FjaGUgPSB7IGludmFsaWRhdGU6IGFzeW5jIChfcGFyYW1zKSA9PiB7XG4gICAgfSB9O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkJhc2VTUUxpdGVEYXRhYmFzZVwiO1xuICBxdWVyeTtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBzdWJxdWVyeSB0aGF0IGRlZmluZXMgYSB0ZW1wb3JhcnkgbmFtZWQgcmVzdWx0IHNldCBhcyBhIENURS5cbiAgICpcbiAgICogSXQgaXMgdXNlZnVsIGZvciBicmVha2luZyBkb3duIGNvbXBsZXggcXVlcmllcyBpbnRvIHNpbXBsZXIgcGFydHMgYW5kIGZvciByZXVzaW5nIHRoZSByZXN1bHQgc2V0IGluIHN1YnNlcXVlbnQgcGFydHMgb2YgdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NlbGVjdCN3aXRoLWNsYXVzZX1cbiAgICpcbiAgICogQHBhcmFtIGFsaWFzIFRoZSBhbGlhcyBmb3IgdGhlIHN1YnF1ZXJ5LlxuICAgKlxuICAgKiBGYWlsdXJlIHRvIHByb3ZpZGUgYW4gYWxpYXMgd2lsbCByZXN1bHQgaW4gYSBEcml6emxlVHlwZUVycm9yLCBwcmV2ZW50aW5nIHRoZSBzdWJxdWVyeSBmcm9tIGJlaW5nIHJlZmVyZW5jZWQgaW4gb3RoZXIgcXVlcmllcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gQ3JlYXRlIGEgc3VicXVlcnkgd2l0aCBhbGlhcyAnc3EnIGFuZCB1c2UgaXQgaW4gdGhlIHNlbGVjdCBxdWVyeVxuICAgKiBjb25zdCBzcSA9IGRiLiR3aXRoKCdzcScpLmFzKGRiLnNlbGVjdCgpLmZyb20odXNlcnMpLndoZXJlKGVxKHVzZXJzLmlkLCA0MikpKTtcbiAgICpcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIud2l0aChzcSkuc2VsZWN0KCkuZnJvbShzcSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBUbyBzZWxlY3QgYXJiaXRyYXJ5IFNRTCB2YWx1ZXMgYXMgZmllbGRzIGluIGEgQ1RFIGFuZCByZWZlcmVuY2UgdGhlbSBpbiBvdGhlciBDVEVzIG9yIGluIHRoZSBtYWluIHF1ZXJ5LCB5b3UgbmVlZCB0byBhZGQgYWxpYXNlcyB0byB0aGVtOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYW4gYXJiaXRyYXJ5IFNRTCB2YWx1ZSBhcyBhIGZpZWxkIGluIGEgQ1RFIGFuZCByZWZlcmVuY2UgaXQgaW4gdGhlIG1haW4gcXVlcnlcbiAgICogY29uc3Qgc3EgPSBkYi4kd2l0aCgnc3EnKS5hcyhkYi5zZWxlY3Qoe1xuICAgKiAgIG5hbWU6IHNxbDxzdHJpbmc+YHVwcGVyKCR7dXNlcnMubmFtZX0pYC5hcygnbmFtZScpLFxuICAgKiB9KVxuICAgKiAuZnJvbSh1c2VycykpO1xuICAgKlxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi53aXRoKHNxKS5zZWxlY3QoeyBuYW1lOiBzcS5uYW1lIH0pLmZyb20oc3EpO1xuICAgKiBgYGBcbiAgICovXG4gICR3aXRoID0gKGFsaWFzLCBzZWxlY3Rpb24pID0+IHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBhcyA9IChxYikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBxYiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHFiID0gcWIobmV3IFF1ZXJ5QnVpbGRlcihzZWxmLmRpYWxlY3QpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICAgIG5ldyBXaXRoU3VicXVlcnkoXG4gICAgICAgICAgcWIuZ2V0U1FMKCksXG4gICAgICAgICAgc2VsZWN0aW9uID8/IChcImdldFNlbGVjdGVkRmllbGRzXCIgaW4gcWIgPyBxYi5nZXRTZWxlY3RlZEZpZWxkcygpID8/IHt9IDoge30pLFxuICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKSxcbiAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IGFsaWFzLCBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwiZXJyb3JcIiB9KVxuICAgICAgKTtcbiAgICB9O1xuICAgIHJldHVybiB7IGFzIH07XG4gIH07XG4gICRjb3VudChzb3VyY2UsIGZpbHRlcnMpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUNvdW50QnVpbGRlcih7IHNvdXJjZSwgZmlsdGVycywgc2Vzc2lvbjogdGhpcy5zZXNzaW9uIH0pO1xuICB9XG4gIC8qKlxuICAgKiBJbmNvcnBvcmF0ZXMgYSBwcmV2aW91c2x5IGRlZmluZWQgQ1RFICh1c2luZyBgJHdpdGhgKSBpbnRvIHRoZSBtYWluIHF1ZXJ5LlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgdGhlIG1haW4gcXVlcnkgdG8gcmVmZXJlbmNlIGEgdGVtcG9yYXJ5IG5hbWVkIHJlc3VsdCBzZXQuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2VsZWN0I3dpdGgtY2xhdXNlfVxuICAgKlxuICAgKiBAcGFyYW0gcXVlcmllcyBUaGUgQ1RFcyB0byBpbmNvcnBvcmF0ZSBpbnRvIHRoZSBtYWluIHF1ZXJ5LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBEZWZpbmUgYSBzdWJxdWVyeSAnc3EnIGFzIGEgQ1RFIHVzaW5nICR3aXRoXG4gICAqIGNvbnN0IHNxID0gZGIuJHdpdGgoJ3NxJykuYXMoZGIuc2VsZWN0KCkuZnJvbSh1c2Vycykud2hlcmUoZXEodXNlcnMuaWQsIDQyKSkpO1xuICAgKlxuICAgKiAvLyBJbmNvcnBvcmF0ZSB0aGUgQ1RFICdzcScgaW50byB0aGUgbWFpbiBxdWVyeSBhbmQgc2VsZWN0IGZyb20gaXRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIud2l0aChzcSkuc2VsZWN0KCkuZnJvbShzcSk7XG4gICAqIGBgYFxuICAgKi9cbiAgd2l0aCguLi5xdWVyaWVzKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgZnVuY3Rpb24gc2VsZWN0KGZpZWxkcykge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHtcbiAgICAgICAgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLFxuICAgICAgICBzZXNzaW9uOiBzZWxmLnNlc3Npb24sXG4gICAgICAgIGRpYWxlY3Q6IHNlbGYuZGlhbGVjdCxcbiAgICAgICAgd2l0aExpc3Q6IHF1ZXJpZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZWxlY3REaXN0aW5jdChmaWVsZHMpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7XG4gICAgICAgIGZpZWxkczogZmllbGRzID8/IHZvaWQgMCxcbiAgICAgICAgc2Vzc2lvbjogc2VsZi5zZXNzaW9uLFxuICAgICAgICBkaWFsZWN0OiBzZWxmLmRpYWxlY3QsXG4gICAgICAgIHdpdGhMaXN0OiBxdWVyaWVzLFxuICAgICAgICBkaXN0aW5jdDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZSh0YWJsZSkge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVVcGRhdGVCdWlsZGVyKHRhYmxlLCBzZWxmLnNlc3Npb24sIHNlbGYuZGlhbGVjdCwgcXVlcmllcyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGluc2VydChpbnRvKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZUluc2VydEJ1aWxkZXIoaW50bywgc2VsZi5zZXNzaW9uLCBzZWxmLmRpYWxlY3QsIHF1ZXJpZXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWxldGVfKGZyb20pIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlRGVsZXRlQmFzZShmcm9tLCBzZWxmLnNlc3Npb24sIHNlbGYuZGlhbGVjdCwgcXVlcmllcyk7XG4gICAgfVxuICAgIHJldHVybiB7IHNlbGVjdCwgc2VsZWN0RGlzdGluY3QsIHVwZGF0ZSwgaW5zZXJ0LCBkZWxldGU6IGRlbGV0ZV8gfTtcbiAgfVxuICBzZWxlY3QoZmllbGRzKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHsgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLCBzZXNzaW9uOiB0aGlzLnNlc3Npb24sIGRpYWxlY3Q6IHRoaXMuZGlhbGVjdCB9KTtcbiAgfVxuICBzZWxlY3REaXN0aW5jdChmaWVsZHMpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoe1xuICAgICAgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLFxuICAgICAgc2Vzc2lvbjogdGhpcy5zZXNzaW9uLFxuICAgICAgZGlhbGVjdDogdGhpcy5kaWFsZWN0LFxuICAgICAgZGlzdGluY3Q6IHRydWVcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhbiB1cGRhdGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aG91dCBgLndoZXJlKClgIGNsYXVzZSB3aWxsIHVwZGF0ZSBhbGwgcm93cyBpbiBhIHRhYmxlLiBUaGUgYC53aGVyZSgpYCBjbGF1c2Ugc3BlY2lmaWVzIHdoaWNoIHJvd3Mgc2hvdWxkIGJlIHVwZGF0ZWQuXG4gICAqXG4gICAqIFVzZSBgLnNldCgpYCBtZXRob2QgdG8gc3BlY2lmeSB3aGljaCB2YWx1ZXMgdG8gdXBkYXRlLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3VwZGF0ZX1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB0byB1cGRhdGUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFVwZGF0ZSBhbGwgcm93cyBpbiB0aGUgJ2NhcnMnIHRhYmxlXG4gICAqIGF3YWl0IGRiLnVwZGF0ZShjYXJzKS5zZXQoeyBjb2xvcjogJ3JlZCcgfSk7XG4gICAqXG4gICAqIC8vIFVwZGF0ZSByb3dzIHdpdGggZmlsdGVycyBhbmQgY29uZGl0aW9uc1xuICAgKiBhd2FpdCBkYi51cGRhdGUoY2Fycykuc2V0KHsgY29sb3I6ICdyZWQnIH0pLndoZXJlKGVxKGNhcnMuYnJhbmQsICdCTVcnKSk7XG4gICAqXG4gICAqIC8vIFVwZGF0ZSB3aXRoIHJldHVybmluZyBjbGF1c2VcbiAgICogY29uc3QgdXBkYXRlZENhcjogQ2FyW10gPSBhd2FpdCBkYi51cGRhdGUoY2FycylcbiAgICogICAuc2V0KHsgY29sb3I6ICdyZWQnIH0pXG4gICAqICAgLndoZXJlKGVxKGNhcnMuaWQsIDEpKVxuICAgKiAgIC5yZXR1cm5pbmcoKTtcbiAgICogYGBgXG4gICAqL1xuICB1cGRhdGUodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVVwZGF0ZUJ1aWxkZXIodGFibGUsIHRoaXMuc2Vzc2lvbiwgdGhpcy5kaWFsZWN0KTtcbiAgfVxuICAkY2FjaGU7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc2VydCBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSBuZXcgcm93cyBpbiBhIHRhYmxlLiBVc2UgYC52YWx1ZXMoKWAgbWV0aG9kIHRvIHNwZWNpZnkgd2hpY2ggdmFsdWVzIHRvIGluc2VydC5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9pbnNlcnR9XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgdG8gaW5zZXJ0IGludG8uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIEluc2VydCBvbmUgcm93XG4gICAqIGF3YWl0IGRiLmluc2VydChjYXJzKS52YWx1ZXMoeyBicmFuZDogJ0JNVycgfSk7XG4gICAqXG4gICAqIC8vIEluc2VydCBtdWx0aXBsZSByb3dzXG4gICAqIGF3YWl0IGRiLmluc2VydChjYXJzKS52YWx1ZXMoW3sgYnJhbmQ6ICdCTVcnIH0sIHsgYnJhbmQ6ICdQb3JzY2hlJyB9XSk7XG4gICAqXG4gICAqIC8vIEluc2VydCB3aXRoIHJldHVybmluZyBjbGF1c2VcbiAgICogY29uc3QgaW5zZXJ0ZWRDYXI6IENhcltdID0gYXdhaXQgZGIuaW5zZXJ0KGNhcnMpXG4gICAqICAgLnZhbHVlcyh7IGJyYW5kOiAnQk1XJyB9KVxuICAgKiAgIC5yZXR1cm5pbmcoKTtcbiAgICogYGBgXG4gICAqL1xuICBpbnNlcnQoaW50bykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlSW5zZXJ0QnVpbGRlcihpbnRvLCB0aGlzLnNlc3Npb24sIHRoaXMuZGlhbGVjdCk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBkZWxldGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aG91dCBgLndoZXJlKClgIGNsYXVzZSB3aWxsIGRlbGV0ZSBhbGwgcm93cyBpbiBhIHRhYmxlLiBUaGUgYC53aGVyZSgpYCBjbGF1c2Ugc3BlY2lmaWVzIHdoaWNoIHJvd3Mgc2hvdWxkIGJlIGRlbGV0ZWQuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvZGVsZXRlfVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHRvIGRlbGV0ZSBmcm9tLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBEZWxldGUgYWxsIHJvd3MgaW4gdGhlICdjYXJzJyB0YWJsZVxuICAgKiBhd2FpdCBkYi5kZWxldGUoY2Fycyk7XG4gICAqXG4gICAqIC8vIERlbGV0ZSByb3dzIHdpdGggZmlsdGVycyBhbmQgY29uZGl0aW9uc1xuICAgKiBhd2FpdCBkYi5kZWxldGUoY2Fycykud2hlcmUoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJykpO1xuICAgKlxuICAgKiAvLyBEZWxldGUgd2l0aCByZXR1cm5pbmcgY2xhdXNlXG4gICAqIGNvbnN0IGRlbGV0ZWRDYXI6IENhcltdID0gYXdhaXQgZGIuZGVsZXRlKGNhcnMpXG4gICAqICAgLndoZXJlKGVxKGNhcnMuaWQsIDEpKVxuICAgKiAgIC5yZXR1cm5pbmcoKTtcbiAgICogYGBgXG4gICAqL1xuICBkZWxldGUoZnJvbSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlRGVsZXRlQmFzZShmcm9tLCB0aGlzLnNlc3Npb24sIHRoaXMuZGlhbGVjdCk7XG4gIH1cbiAgcnVuKHF1ZXJ5KSB7XG4gICAgY29uc3Qgc2VxdWVsID0gdHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiID8gc3FsLnJhdyhxdWVyeSkgOiBxdWVyeS5nZXRTUUwoKTtcbiAgICBpZiAodGhpcy5yZXN1bHRLaW5kID09PSBcImFzeW5jXCIpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlUmF3KFxuICAgICAgICBhc3luYyAoKSA9PiB0aGlzLnNlc3Npb24ucnVuKHNlcXVlbCksXG4gICAgICAgICgpID0+IHNlcXVlbCxcbiAgICAgICAgXCJydW5cIixcbiAgICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgICB0aGlzLnNlc3Npb24uZXh0cmFjdFJhd1J1blZhbHVlRnJvbUJhdGNoUmVzdWx0LmJpbmQodGhpcy5zZXNzaW9uKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5ydW4oc2VxdWVsKTtcbiAgfVxuICBhbGwocXVlcnkpIHtcbiAgICBjb25zdCBzZXF1ZWwgPSB0eXBlb2YgcXVlcnkgPT09IFwic3RyaW5nXCIgPyBzcWwucmF3KHF1ZXJ5KSA6IHF1ZXJ5LmdldFNRTCgpO1xuICAgIGlmICh0aGlzLnJlc3VsdEtpbmQgPT09IFwiYXN5bmNcIikge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVSYXcoXG4gICAgICAgIGFzeW5jICgpID0+IHRoaXMuc2Vzc2lvbi5hbGwoc2VxdWVsKSxcbiAgICAgICAgKCkgPT4gc2VxdWVsLFxuICAgICAgICBcImFsbFwiLFxuICAgICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICAgIHRoaXMuc2Vzc2lvbi5leHRyYWN0UmF3QWxsVmFsdWVGcm9tQmF0Y2hSZXN1bHQuYmluZCh0aGlzLnNlc3Npb24pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmFsbChzZXF1ZWwpO1xuICB9XG4gIGdldChxdWVyeSkge1xuICAgIGNvbnN0IHNlcXVlbCA9IHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiA/IHNxbC5yYXcocXVlcnkpIDogcXVlcnkuZ2V0U1FMKCk7XG4gICAgaWYgKHRoaXMucmVzdWx0S2luZCA9PT0gXCJhc3luY1wiKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVJhdyhcbiAgICAgICAgYXN5bmMgKCkgPT4gdGhpcy5zZXNzaW9uLmdldChzZXF1ZWwpLFxuICAgICAgICAoKSA9PiBzZXF1ZWwsXG4gICAgICAgIFwiZ2V0XCIsXG4gICAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgICAgdGhpcy5zZXNzaW9uLmV4dHJhY3RSYXdHZXRWYWx1ZUZyb21CYXRjaFJlc3VsdC5iaW5kKHRoaXMuc2Vzc2lvbilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlc3Npb24uZ2V0KHNlcXVlbCk7XG4gIH1cbiAgdmFsdWVzKHF1ZXJ5KSB7XG4gICAgY29uc3Qgc2VxdWVsID0gdHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiID8gc3FsLnJhdyhxdWVyeSkgOiBxdWVyeS5nZXRTUUwoKTtcbiAgICBpZiAodGhpcy5yZXN1bHRLaW5kID09PSBcImFzeW5jXCIpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlUmF3KFxuICAgICAgICBhc3luYyAoKSA9PiB0aGlzLnNlc3Npb24udmFsdWVzKHNlcXVlbCksXG4gICAgICAgICgpID0+IHNlcXVlbCxcbiAgICAgICAgXCJ2YWx1ZXNcIixcbiAgICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgICB0aGlzLnNlc3Npb24uZXh0cmFjdFJhd1ZhbHVlc1ZhbHVlRnJvbUJhdGNoUmVzdWx0LmJpbmQodGhpcy5zZXNzaW9uKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi52YWx1ZXMoc2VxdWVsKTtcbiAgfVxuICB0cmFuc2FjdGlvbih0cmFuc2FjdGlvbiwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi50cmFuc2FjdGlvbih0cmFuc2FjdGlvbiwgY29uZmlnKTtcbiAgfVxufVxuY29uc3Qgd2l0aFJlcGxpY2FzID0gKHByaW1hcnksIHJlcGxpY2FzLCBnZXRSZXBsaWNhID0gKCkgPT4gcmVwbGljYXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcmVwbGljYXMubGVuZ3RoKV0pID0+IHtcbiAgY29uc3Qgc2VsZWN0ID0gKC4uLmFyZ3MpID0+IGdldFJlcGxpY2EocmVwbGljYXMpLnNlbGVjdCguLi5hcmdzKTtcbiAgY29uc3Qgc2VsZWN0RGlzdGluY3QgPSAoLi4uYXJncykgPT4gZ2V0UmVwbGljYShyZXBsaWNhcykuc2VsZWN0RGlzdGluY3QoLi4uYXJncyk7XG4gIGNvbnN0ICRjb3VudCA9ICguLi5hcmdzKSA9PiBnZXRSZXBsaWNhKHJlcGxpY2FzKS4kY291bnQoLi4uYXJncyk7XG4gIGNvbnN0ICR3aXRoID0gKC4uLmFyZ3MpID0+IGdldFJlcGxpY2EocmVwbGljYXMpLndpdGgoLi4uYXJncyk7XG4gIGNvbnN0IHVwZGF0ZSA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LnVwZGF0ZSguLi5hcmdzKTtcbiAgY29uc3QgaW5zZXJ0ID0gKC4uLmFyZ3MpID0+IHByaW1hcnkuaW5zZXJ0KC4uLmFyZ3MpO1xuICBjb25zdCAkZGVsZXRlID0gKC4uLmFyZ3MpID0+IHByaW1hcnkuZGVsZXRlKC4uLmFyZ3MpO1xuICBjb25zdCBydW4gPSAoLi4uYXJncykgPT4gcHJpbWFyeS5ydW4oLi4uYXJncyk7XG4gIGNvbnN0IGFsbCA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LmFsbCguLi5hcmdzKTtcbiAgY29uc3QgZ2V0ID0gKC4uLmFyZ3MpID0+IHByaW1hcnkuZ2V0KC4uLmFyZ3MpO1xuICBjb25zdCB2YWx1ZXMgPSAoLi4uYXJncykgPT4gcHJpbWFyeS52YWx1ZXMoLi4uYXJncyk7XG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gKC4uLmFyZ3MpID0+IHByaW1hcnkudHJhbnNhY3Rpb24oLi4uYXJncyk7XG4gIHJldHVybiB7XG4gICAgLi4ucHJpbWFyeSxcbiAgICB1cGRhdGUsXG4gICAgaW5zZXJ0LFxuICAgIGRlbGV0ZTogJGRlbGV0ZSxcbiAgICBydW4sXG4gICAgYWxsLFxuICAgIGdldCxcbiAgICB2YWx1ZXMsXG4gICAgdHJhbnNhY3Rpb24sXG4gICAgJHByaW1hcnk6IHByaW1hcnksXG4gICAgc2VsZWN0LFxuICAgIHNlbGVjdERpc3RpbmN0LFxuICAgICRjb3VudCxcbiAgICB3aXRoOiAkd2l0aCxcbiAgICBnZXQgcXVlcnkoKSB7XG4gICAgICByZXR1cm4gZ2V0UmVwbGljYShyZXBsaWNhcykucXVlcnk7XG4gICAgfVxuICB9O1xufTtcbmV4cG9ydCB7XG4gIEJhc2VTUUxpdGVEYXRhYmFzZSxcbiAgd2l0aFJlcGxpY2FzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGIuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuY2xhc3MgQ2FjaGUge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJDYWNoZVwiO1xufVxuY2xhc3MgTm9vcENhY2hlIGV4dGVuZHMgQ2FjaGUge1xuICBzdHJhdGVneSgpIHtcbiAgICByZXR1cm4gXCJhbGxcIjtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJOb29wQ2FjaGVcIjtcbiAgYXN5bmMgZ2V0KF9rZXkpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGFzeW5jIHB1dChfaGFzaGVkUXVlcnksIF9yZXNwb25zZSwgX3RhYmxlcywgX2NvbmZpZykge1xuICB9XG4gIGFzeW5jIG9uTXV0YXRlKF9wYXJhbXMpIHtcbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gaGFzaFF1ZXJ5KHNxbCwgcGFyYW1zKSB7XG4gIGNvbnN0IGRhdGFUb0hhc2ggPSBgJHtzcWx9LSR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX1gO1xuICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIGNvbnN0IGRhdGEgPSBlbmNvZGVyLmVuY29kZShkYXRhVG9IYXNoKTtcbiAgY29uc3QgaGFzaEJ1ZmZlciA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KFwiU0hBLTI1NlwiLCBkYXRhKTtcbiAgY29uc3QgaGFzaEFycmF5ID0gWy4uLm5ldyBVaW50OEFycmF5KGhhc2hCdWZmZXIpXTtcbiAgY29uc3QgaGFzaEhleCA9IGhhc2hBcnJheS5tYXAoKGIpID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSkuam9pbihcIlwiKTtcbiAgcmV0dXJuIGhhc2hIZXg7XG59XG5leHBvcnQge1xuICBDYWNoZSxcbiAgTm9vcENhY2hlLFxuICBoYXNoUXVlcnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYWNoZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGhhc2hRdWVyeSwgTm9vcENhY2hlIH0gZnJvbSBcIi4uL2NhY2hlL2NvcmUvY2FjaGUuanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgRHJpenpsZUVycm9yLCBEcml6emxlUXVlcnlFcnJvciwgVHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmltcG9ydCB7IEJhc2VTUUxpdGVEYXRhYmFzZSB9IGZyb20gXCIuL2RiLmpzXCI7XG5jbGFzcyBFeGVjdXRlUmVzdWx0U3luYyBleHRlbmRzIFF1ZXJ5UHJvbWlzZSB7XG4gIGNvbnN0cnVjdG9yKHJlc3VsdENiKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlc3VsdENiID0gcmVzdWx0Q2I7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiRXhlY3V0ZVJlc3VsdFN5bmNcIjtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHRDYigpO1xuICB9XG4gIHN5bmMoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0Q2IoKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlUHJlcGFyZWRRdWVyeSB7XG4gIGNvbnN0cnVjdG9yKG1vZGUsIGV4ZWN1dGVNZXRob2QsIHF1ZXJ5LCBjYWNoZSwgcXVlcnlNZXRhZGF0YSwgY2FjaGVDb25maWcpIHtcbiAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgIHRoaXMuZXhlY3V0ZU1ldGhvZCA9IGV4ZWN1dGVNZXRob2Q7XG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5O1xuICAgIHRoaXMuY2FjaGUgPSBjYWNoZTtcbiAgICB0aGlzLnF1ZXJ5TWV0YWRhdGEgPSBxdWVyeU1ldGFkYXRhO1xuICAgIHRoaXMuY2FjaGVDb25maWcgPSBjYWNoZUNvbmZpZztcbiAgICBpZiAoY2FjaGUgJiYgY2FjaGUuc3RyYXRlZ3koKSA9PT0gXCJhbGxcIiAmJiBjYWNoZUNvbmZpZyA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLmNhY2hlQ29uZmlnID0geyBlbmFibGU6IHRydWUsIGF1dG9JbnZhbGlkYXRlOiB0cnVlIH07XG4gICAgfVxuICAgIGlmICghdGhpcy5jYWNoZUNvbmZpZz8uZW5hYmxlKSB7XG4gICAgICB0aGlzLmNhY2hlQ29uZmlnID0gdm9pZCAwO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQcmVwYXJlZFF1ZXJ5XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgam9pbnNOb3ROdWxsYWJsZU1hcDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBhc3luYyBxdWVyeVdpdGhDYWNoZShxdWVyeVN0cmluZywgcGFyYW1zLCBxdWVyeSkge1xuICAgIGlmICh0aGlzLmNhY2hlID09PSB2b2lkIDAgfHwgaXModGhpcy5jYWNoZSwgTm9vcENhY2hlKSB8fCB0aGlzLnF1ZXJ5TWV0YWRhdGEgPT09IHZvaWQgMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBEcml6emxlUXVlcnlFcnJvcihxdWVyeVN0cmluZywgcGFyYW1zLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuY2FjaGVDb25maWcgJiYgIXRoaXMuY2FjaGVDb25maWcuZW5hYmxlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcXVlcnkoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IERyaXp6bGVRdWVyeUVycm9yKHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKHRoaXMucXVlcnlNZXRhZGF0YS50eXBlID09PSBcImluc2VydFwiIHx8IHRoaXMucXVlcnlNZXRhZGF0YS50eXBlID09PSBcInVwZGF0ZVwiIHx8IHRoaXMucXVlcnlNZXRhZGF0YS50eXBlID09PSBcImRlbGV0ZVwiKSAmJiB0aGlzLnF1ZXJ5TWV0YWRhdGEudGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IFtyZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIHF1ZXJ5KCksXG4gICAgICAgICAgdGhpcy5jYWNoZS5vbk11dGF0ZSh7IHRhYmxlczogdGhpcy5xdWVyeU1ldGFkYXRhLnRhYmxlcyB9KVxuICAgICAgICBdKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IERyaXp6bGVRdWVyeUVycm9yKHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuY2FjaGVDb25maWcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBxdWVyeSgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRHJpenpsZVF1ZXJ5RXJyb3IocXVlcnlTdHJpbmcsIHBhcmFtcywgZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnF1ZXJ5TWV0YWRhdGEudHlwZSA9PT0gXCJzZWxlY3RcIikge1xuICAgICAgY29uc3QgZnJvbUNhY2hlID0gYXdhaXQgdGhpcy5jYWNoZS5nZXQoXG4gICAgICAgIHRoaXMuY2FjaGVDb25maWcudGFnID8/IChhd2FpdCBoYXNoUXVlcnkocXVlcnlTdHJpbmcsIHBhcmFtcykpLFxuICAgICAgICB0aGlzLnF1ZXJ5TWV0YWRhdGEudGFibGVzLFxuICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLnRhZyAhPT0gdm9pZCAwLFxuICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLmF1dG9JbnZhbGlkYXRlXG4gICAgICApO1xuICAgICAgaWYgKGZyb21DYWNoZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcXVlcnkoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRocm93IG5ldyBEcml6emxlUXVlcnlFcnJvcihxdWVyeVN0cmluZywgcGFyYW1zLCBlKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmNhY2hlLnB1dChcbiAgICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLnRhZyA/PyAoYXdhaXQgaGFzaFF1ZXJ5KHF1ZXJ5U3RyaW5nLCBwYXJhbXMpKSxcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIHNlbmQgdGFibGVzIHRoYXQgd2VyZSB1c2VkIGluIGEgcXVlcnkgb25seSBpZiB1c2VyIHdhbnRzIHRvIGludmFsaWRhdGUgaXQgb24gZWFjaCB3cml0ZVxuICAgICAgICAgIHRoaXMuY2FjaGVDb25maWcuYXV0b0ludmFsaWRhdGUgPyB0aGlzLnF1ZXJ5TWV0YWRhdGEudGFibGVzIDogW10sXG4gICAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy50YWcgIT09IHZvaWQgMCxcbiAgICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLmNvbmZpZ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21DYWNoZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBxdWVyeSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBEcml6emxlUXVlcnlFcnJvcihxdWVyeVN0cmluZywgcGFyYW1zLCBlKTtcbiAgICB9XG4gIH1cbiAgZ2V0UXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnk7XG4gIH1cbiAgbWFwUnVuUmVzdWx0KHJlc3VsdCwgX2lzRnJvbUJhdGNoKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBtYXBBbGxSZXN1bHQoX3Jlc3VsdCwgX2lzRnJvbUJhdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIG1hcEdldFJlc3VsdChfcmVzdWx0LCBfaXNGcm9tQmF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgZXhlY3V0ZShwbGFjZWhvbGRlclZhbHVlcykge1xuICAgIGlmICh0aGlzLm1vZGUgPT09IFwiYXN5bmNcIikge1xuICAgICAgcmV0dXJuIHRoaXNbdGhpcy5leGVjdXRlTWV0aG9kXShwbGFjZWhvbGRlclZhbHVlcyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXhlY3V0ZVJlc3VsdFN5bmMoKCkgPT4gdGhpc1t0aGlzLmV4ZWN1dGVNZXRob2RdKHBsYWNlaG9sZGVyVmFsdWVzKSk7XG4gIH1cbiAgbWFwUmVzdWx0KHJlc3BvbnNlLCBpc0Zyb21CYXRjaCkge1xuICAgIHN3aXRjaCAodGhpcy5leGVjdXRlTWV0aG9kKSB7XG4gICAgICBjYXNlIFwicnVuXCI6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwUnVuUmVzdWx0KHJlc3BvbnNlLCBpc0Zyb21CYXRjaCk7XG4gICAgICB9XG4gICAgICBjYXNlIFwiYWxsXCI6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwQWxsUmVzdWx0KHJlc3BvbnNlLCBpc0Zyb21CYXRjaCk7XG4gICAgICB9XG4gICAgICBjYXNlIFwiZ2V0XCI6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwR2V0UmVzdWx0KHJlc3BvbnNlLCBpc0Zyb21CYXRjaCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5jbGFzcyBTUUxpdGVTZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoZGlhbGVjdCkge1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlU2Vzc2lvblwiO1xuICBwcmVwYXJlT25lVGltZVF1ZXJ5KHF1ZXJ5LCBmaWVsZHMsIGV4ZWN1dGVNZXRob2QsIGlzUmVzcG9uc2VJbkFycmF5TW9kZSwgY3VzdG9tUmVzdWx0TWFwcGVyLCBxdWVyeU1ldGFkYXRhLCBjYWNoZUNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnByZXBhcmVRdWVyeShcbiAgICAgIHF1ZXJ5LFxuICAgICAgZmllbGRzLFxuICAgICAgZXhlY3V0ZU1ldGhvZCxcbiAgICAgIGlzUmVzcG9uc2VJbkFycmF5TW9kZSxcbiAgICAgIGN1c3RvbVJlc3VsdE1hcHBlcixcbiAgICAgIHF1ZXJ5TWV0YWRhdGEsXG4gICAgICBjYWNoZUNvbmZpZ1xuICAgICk7XG4gIH1cbiAgcnVuKHF1ZXJ5KSB7XG4gICAgY29uc3Qgc3RhdGljUXVlcnkgPSB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeShxdWVyeSk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnByZXBhcmVPbmVUaW1lUXVlcnkoc3RhdGljUXVlcnksIHZvaWQgMCwgXCJydW5cIiwgZmFsc2UpLnJ1bigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IERyaXp6bGVFcnJvcih7IGNhdXNlOiBlcnIsIG1lc3NhZ2U6IGBGYWlsZWQgdG8gcnVuIHRoZSBxdWVyeSAnJHtzdGF0aWNRdWVyeS5zcWx9J2AgfSk7XG4gICAgfVxuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZXh0cmFjdFJhd1J1blZhbHVlRnJvbUJhdGNoUmVzdWx0KHJlc3VsdCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgYWxsKHF1ZXJ5KSB7XG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU9uZVRpbWVRdWVyeSh0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeShxdWVyeSksIHZvaWQgMCwgXCJydW5cIiwgZmFsc2UpLmFsbCgpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZXh0cmFjdFJhd0FsbFZhbHVlRnJvbUJhdGNoUmVzdWx0KF9yZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgZ2V0KHF1ZXJ5KSB7XG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU9uZVRpbWVRdWVyeSh0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeShxdWVyeSksIHZvaWQgMCwgXCJydW5cIiwgZmFsc2UpLmdldCgpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZXh0cmFjdFJhd0dldFZhbHVlRnJvbUJhdGNoUmVzdWx0KF9yZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgdmFsdWVzKHF1ZXJ5KSB7XG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU9uZVRpbWVRdWVyeSh0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeShxdWVyeSksIHZvaWQgMCwgXCJydW5cIiwgZmFsc2UpLnZhbHVlcygpO1xuICB9XG4gIGFzeW5jIGNvdW50KHNxbCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudmFsdWVzKHNxbCk7XG4gICAgcmV0dXJuIHJlc3VsdFswXVswXTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGV4dHJhY3RSYXdWYWx1ZXNWYWx1ZUZyb21CYXRjaFJlc3VsdChfcmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VTUUxpdGVEYXRhYmFzZSB7XG4gIGNvbnN0cnVjdG9yKHJlc3VsdFR5cGUsIGRpYWxlY3QsIHNlc3Npb24sIHNjaGVtYSwgbmVzdGVkSW5kZXggPSAwKSB7XG4gICAgc3VwZXIocmVzdWx0VHlwZSwgZGlhbGVjdCwgc2Vzc2lvbiwgc2NoZW1hKTtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLm5lc3RlZEluZGV4ID0gbmVzdGVkSW5kZXg7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVHJhbnNhY3Rpb25cIjtcbiAgcm9sbGJhY2soKSB7XG4gICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvcigpO1xuICB9XG59XG5leHBvcnQge1xuICBFeGVjdXRlUmVzdWx0U3luYyxcbiAgU1FMaXRlUHJlcGFyZWRRdWVyeSxcbiAgU1FMaXRlU2Vzc2lvbixcbiAgU1FMaXRlVHJhbnNhY3Rpb25cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXNzaW9uLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuY2xhc3MgQ29uc29sZUxvZ1dyaXRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkNvbnNvbGVMb2dXcml0ZXJcIjtcbiAgd3JpdGUobWVzc2FnZSkge1xuICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICB9XG59XG5jbGFzcyBEZWZhdWx0TG9nZ2VyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiRGVmYXVsdExvZ2dlclwiO1xuICB3cml0ZXI7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHRoaXMud3JpdGVyID0gY29uZmlnPy53cml0ZXIgPz8gbmV3IENvbnNvbGVMb2dXcml0ZXIoKTtcbiAgfVxuICBsb2dRdWVyeShxdWVyeSwgcGFyYW1zKSB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWRQYXJhbXMgPSBwYXJhbXMubWFwKChwKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBwYXJhbXNTdHIgPSBzdHJpbmdpZmllZFBhcmFtcy5sZW5ndGggPyBgIC0tIHBhcmFtczogWyR7c3RyaW5naWZpZWRQYXJhbXMuam9pbihcIiwgXCIpfV1gIDogXCJcIjtcbiAgICB0aGlzLndyaXRlci53cml0ZShgUXVlcnk6ICR7cXVlcnl9JHtwYXJhbXNTdHJ9YCk7XG4gIH1cbn1cbmNsYXNzIE5vb3BMb2dnZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJOb29wTG9nZ2VyXCI7XG4gIGxvZ1F1ZXJ5KCkge1xuICB9XG59XG5leHBvcnQge1xuICBDb25zb2xlTG9nV3JpdGVyLFxuICBEZWZhdWx0TG9nZ2VyLFxuICBOb29wTG9nZ2VyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nZ2VyLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgaW5kZXgsIGludGVnZXIsIHJlYWwsIHNxbGl0ZVRhYmxlLCB0ZXh0IH0gZnJvbSBcImRyaXp6bGUtb3JtL3NxbGl0ZS1jb3JlXCI7XG5pbXBvcnQgeyByZWxhdGlvbnMgfSBmcm9tIFwiZHJpenpsZS1vcm1cIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9zY2hlbWEudHNcbnZhciBzY2hlbWFfZXhwb3J0cyA9IHt9O1xuX19leHBvcnQoc2NoZW1hX2V4cG9ydHMsIHtcblx0Y2hhcmFjdGVyczogKCkgPT4gY2hhcmFjdGVycyxcblx0Y2hhcmFjdGVyc1JlbGF0aW9uczogKCkgPT4gY2hhcmFjdGVyc1JlbGF0aW9ucyxcblx0bWluaW5nRmxlZXRQYXJ0aWNpcGFudHM6ICgpID0+IG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzLFxuXHRtaW5pbmdGbGVldFBhcnRpY2lwYW50c1JlbGF0aW9uczogKCkgPT4gbWluaW5nRmxlZXRQYXJ0aWNpcGFudHNSZWxhdGlvbnMsXG5cdG1pbmluZ0ZsZWV0czogKCkgPT4gbWluaW5nRmxlZXRzLFxuXHRtaW5pbmdGbGVldHNSZWxhdGlvbnM6ICgpID0+IG1pbmluZ0ZsZWV0c1JlbGF0aW9ucyxcblx0cmVzdW1lQ29tbWFuZHM6ICgpID0+IHJlc3VtZUNvbW1hbmRzLFxuXHRzaGFyZWQ6ICgpID0+IHNoYXJlZCxcblx0dXNlcnM6ICgpID0+IHVzZXJzLFxuXHR1c2Vyc1JlbGF0aW9uczogKCkgPT4gdXNlcnNSZWxhdGlvbnNcbn0pO1xuY29uc3Qgc2hhcmVkID0ge1xuXHRjcmVhdGVkQXQ6IGludGVnZXIoXCJjcmVhdGVkX2F0XCIpLm5vdE51bGwoKSxcblx0dXBkYXRlZEF0OiBpbnRlZ2VyKFwidXBkYXRlZF9hdFwiKVxufTtcbmNvbnN0IHVzZXJzID0gc3FsaXRlVGFibGUoXCJ1c2Vyc1wiLCB7XG5cdGlkOiBpbnRlZ2VyKCkucHJpbWFyeUtleSgpLnVuaXF1ZSgpLm5vdE51bGwoKSxcblx0ZGlzY29yZElEOiB0ZXh0KFwiZGlzY29yZF9pZFwiKS51bmlxdWUoKS5ub3ROdWxsKCksXG5cdG1haW5DaGFyYWN0ZXI6IGludGVnZXIoXCJtYWluX2NoYXJhY3RlclwiKSxcblx0Li4uc2hhcmVkXG59LCAodGFibGUpID0+IFtpbmRleChcImlkeF9kaXNjb3JkX2lkXCIpLm9uKHRhYmxlLmRpc2NvcmRJRCksIGluZGV4KFwiaWR4X21haW5fY2hhcmFjdGVyXCIpLm9uKHRhYmxlLm1haW5DaGFyYWN0ZXIpXSk7XG5jb25zdCB1c2Vyc1JlbGF0aW9ucyA9IHJlbGF0aW9ucyh1c2VycywgKHsgb25lLCBtYW55IH0pID0+ICh7XG5cdGNoYXJhY3RlcnM6IG1hbnkoY2hhcmFjdGVycyksXG5cdG1haW46IG9uZShjaGFyYWN0ZXJzLCB7XG5cdFx0ZmllbGRzOiBbdXNlcnMubWFpbkNoYXJhY3Rlcl0sXG5cdFx0cmVmZXJlbmNlczogW2NoYXJhY3RlcnMuaWRdXG5cdH0pXG59KSk7XG5jb25zdCBjaGFyYWN0ZXJzID0gc3FsaXRlVGFibGUoXCJjaGFyYWN0ZXJzXCIsIHtcblx0aWQ6IGludGVnZXIoXCJpZFwiKS5wcmltYXJ5S2V5KHsgYXV0b0luY3JlbWVudDogdHJ1ZSB9KSxcblx0ZXZlSUQ6IGludGVnZXIoXCJldmVfaWRcIikubm90TnVsbCgpLFxuXHR1c2VySUQ6IGludGVnZXIoXCJ1c2VyX2lkXCIpLm5vdE51bGwoKSxcblx0bmFtZTogdGV4dCgpLm5vdE51bGwoKSxcblx0YWNjZXNzVG9rZW46IHRleHQoXCJhY2Nlc3NfdG9rZW5cIikubm90TnVsbCgpLFxuXHRleHBpcmVzQXQ6IGludGVnZXIoXCJleHBpcmVzX2F0XCIpLm5vdE51bGwoKSxcblx0cmVmcmVzaFRva2VuOiB0ZXh0KFwicmVmcmVzaF90b2tlblwiKS5ub3ROdWxsKCksXG5cdC4uLnNoYXJlZFxufSwgKHRhYmxlKSA9PiBbaW5kZXgoXCJpZHhfdXNlcl9pZFwiKS5vbih0YWJsZS51c2VySUQpLCBpbmRleChcImlkeF9ldmVfaWRcIikub24odGFibGUuZXZlSUQpXSk7XG5jb25zdCBjaGFyYWN0ZXJzUmVsYXRpb25zID0gcmVsYXRpb25zKGNoYXJhY3RlcnMsICh7IG9uZSB9KSA9PiAoeyB1c2VyOiBvbmUodXNlcnMsIHtcblx0ZmllbGRzOiBbY2hhcmFjdGVycy51c2VySURdLFxuXHRyZWZlcmVuY2VzOiBbdXNlcnMuaWRdXG59KSB9KSk7XG5jb25zdCByZXN1bWVDb21tYW5kcyA9IHNxbGl0ZVRhYmxlKFwicmVzdW1lY29tbWFuZHNcIiwge1xuXHRpZDogdGV4dCgpLnByaW1hcnlLZXkoKSxcblx0Y29tbWFuZDogdGV4dCgpLm5vdE51bGwoKSxcblx0cGFyYW1zOiB0ZXh0KCkubm90TnVsbCgpLFxuXHRjb250ZXh0OiB0ZXh0KCkubm90TnVsbCgpLFxuXHQuLi5zaGFyZWRcbn0pO1xuY29uc3QgbWluaW5nRmxlZXRzID0gc3FsaXRlVGFibGUoXCJtaW5pbmdfZmxlZXRzXCIsIHtcblx0aWQ6IGludGVnZXIoXCJpZFwiKS5wcmltYXJ5S2V5KHsgYXV0b0luY3JlbWVudDogdHJ1ZSB9KSxcblx0bmFtZTogdGV4dChcIm5hbWVcIikubm90TnVsbCgpLFxuXHRkZXNjcmlwdGlvbjogdGV4dChcImRlc2NyaXB0aW9uXCIpLFxuXHRjcmVhdG9yRGlzY29yZElkOiB0ZXh0KFwiY3JlYXRvcl9kaXNjb3JkX2lkXCIpLm5vdE51bGwoKSxcblx0c3RhcnRUaW1lOiBpbnRlZ2VyKFwic3RhcnRfdGltZVwiKS5ub3ROdWxsKCksXG5cdGVuZFRpbWU6IGludGVnZXIoXCJlbmRfdGltZVwiKSxcblx0c3RhdHVzOiB0ZXh0KFwic3RhdHVzXCIsIHsgZW51bTogW1xuXHRcdFwiY29uZmlndXJpbmdcIixcblx0XHRcImFjdGl2ZVwiLFxuXHRcdFwiZW5kZWRcIixcblx0XHRcImdlbmVyYXRpbmdfcmVwb3J0XCIsXG5cdFx0XCJjb21wbGV0ZWRcIixcblx0XHRcImZhaWxlZFwiXG5cdF0gfSkubm90TnVsbCgpLmRlZmF1bHQoXCJjb25maWd1cmluZ1wiKSxcblx0dGF4UmF0ZTogcmVhbChcInRheF9yYXRlXCIpLm5vdE51bGwoKS5kZWZhdWx0KDApLFxuXHRwdWJsaWNNZXNzYWdlSWQ6IHRleHQoXCJwdWJsaWNfbWVzc2FnZV9pZFwiKS51bmlxdWUoKSxcblx0cHVibGljQ2hhbm5lbElkOiB0ZXh0KFwicHVibGljX2NoYW5uZWxfaWRcIiksXG5cdHJlcG9ydERhdGE6IHRleHQoXCJyZXBvcnRfZGF0YVwiKSxcblx0Y3JlYXRvckVwaGVtZXJhbE1lc3NhZ2VJZDogdGV4dChcImNyZWF0b3JfZXBoZW1lcmFsX21lc3NhZ2VfaWRcIiksXG5cdC4uLnNoYXJlZFxufSwgKHRhYmxlKSA9PiBbXG5cdGluZGV4KFwiaWR4X2ZsZWV0X2NyZWF0b3JfZGlzY29yZF9pZFwiKS5vbih0YWJsZS5jcmVhdG9yRGlzY29yZElkKSxcblx0aW5kZXgoXCJpZHhfZmxlZXRfc3RhdHVzXCIpLm9uKHRhYmxlLnN0YXR1cyksXG5cdGluZGV4KFwiaWR4X2ZsZWV0X3B1YmxpY19tZXNzYWdlX2lkXCIpLm9uKHRhYmxlLnB1YmxpY01lc3NhZ2VJZClcbl0pO1xuY29uc3QgbWluaW5nRmxlZXRQYXJ0aWNpcGFudHMgPSBzcWxpdGVUYWJsZShcIm1pbmluZ19mbGVldF9wYXJ0aWNpcGFudHNcIiwge1xuXHRpZDogaW50ZWdlcihcImlkXCIpLnByaW1hcnlLZXkoeyBhdXRvSW5jcmVtZW50OiB0cnVlIH0pLFxuXHRmbGVldElkOiBpbnRlZ2VyKFwiZmxlZXRfaWRcIikubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gbWluaW5nRmxlZXRzLmlkLCB7IG9uRGVsZXRlOiBcImNhc2NhZGVcIiB9KSxcblx0Y2hhcmFjdGVySWQ6IGludGVnZXIoXCJjaGFyYWN0ZXJfaWRcIikubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gY2hhcmFjdGVycy5pZCwgeyBvbkRlbGV0ZTogXCJjYXNjYWRlXCIgfSksXG5cdGRpc2NvcmRJZDogdGV4dChcImRpc2NvcmRfaWRcIikubm90TnVsbCgpLFxuXHRyb2xlOiB0ZXh0KFwicm9sZVwiLCB7IGVudW06IFtcblx0XHRcIm1pbmVyXCIsXG5cdFx0XCJzZWN1cml0eVwiLFxuXHRcdFwiaGF1bGVyXCJcblx0XSB9KS5ub3ROdWxsKCksXG5cdGpvaW5UaW1lOiBpbnRlZ2VyKFwiam9pbl90aW1lXCIpLm5vdE51bGwoKSxcblx0Li4uc2hhcmVkXG59LCAodGFibGUpID0+IFtcblx0aW5kZXgoXCJpZHhfcGFydGljaXBhbnRfZmxlZXRfaWRcIikub24odGFibGUuZmxlZXRJZCksXG5cdGluZGV4KFwiaWR4X3BhcnRpY2lwYW50X2NoYXJhY3Rlcl9pZFwiKS5vbih0YWJsZS5jaGFyYWN0ZXJJZCksXG5cdGluZGV4KFwiaWR4X3BhcnRpY2lwYW50X2Rpc2NvcmRfaWRcIikub24odGFibGUuZGlzY29yZElkKVxuXSk7XG5jb25zdCBtaW5pbmdGbGVldHNSZWxhdGlvbnMgPSByZWxhdGlvbnMobWluaW5nRmxlZXRzLCAoeyBtYW55IH0pID0+ICh7IHBhcnRpY2lwYW50czogbWFueShtaW5pbmdGbGVldFBhcnRpY2lwYW50cykgfSkpO1xuY29uc3QgbWluaW5nRmxlZXRQYXJ0aWNpcGFudHNSZWxhdGlvbnMgPSByZWxhdGlvbnMobWluaW5nRmxlZXRQYXJ0aWNpcGFudHMsICh7IG9uZSB9KSA9PiAoe1xuXHRmbGVldDogb25lKG1pbmluZ0ZsZWV0cywge1xuXHRcdGZpZWxkczogW21pbmluZ0ZsZWV0UGFydGljaXBhbnRzLmZsZWV0SWRdLFxuXHRcdHJlZmVyZW5jZXM6IFttaW5pbmdGbGVldHMuaWRdXG5cdH0pLFxuXHRjaGFyYWN0ZXI6IG9uZShjaGFyYWN0ZXJzLCB7XG5cdFx0ZmllbGRzOiBbbWluaW5nRmxlZXRQYXJ0aWNpcGFudHMuY2hhcmFjdGVySWRdLFxuXHRcdHJlZmVyZW5jZXM6IFtjaGFyYWN0ZXJzLmlkXVxuXHR9KVxufSkpO1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGNoYXJhY3RlcnMsIG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzLCBtaW5pbmdGbGVldHMsIHJlc3VtZUNvbW1hbmRzLCBzY2hlbWFfZXhwb3J0cywgdXNlcnMgfTsiLAogICAgImltcG9ydCB7IGNoYXJhY3RlcnMsIHVzZXJzIH0gZnJvbSBcIi4uL3NjaGVtYS5qc1wiO1xuaW1wb3J0IHsgQ2hhcmFjdGVySGVscGVyIH0gZnJvbSBcIi4vY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBkYiB9IGZyb20gXCIuLi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZXEsIHNxbCB9IGZyb20gXCJkcml6emxlLW9ybVwiO1xuXG4vLyNyZWdpb24gc3JjL2RiL21vZGVscy91c2VyLm1vZGVsLnRzXG52YXIgVXNlckhlbHBlciA9IGNsYXNzIHtcblx0c3RhdGljIGZpbmQoaWQpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3Qoe1xuXHRcdFx0aWQ6IHVzZXJzLmlkLFxuXHRcdFx0ZGlzY29yZElEOiB1c2Vycy5kaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IHVzZXJzLmNyZWF0ZWRBdCxcblx0XHRcdHVwZGF0ZWRBdDogdXNlcnMudXBkYXRlZEF0LFxuXHRcdFx0bWFpbkNoYXJhY3RlcklEOiB1c2Vycy5tYWluQ2hhcmFjdGVyLFxuXHRcdFx0Y2hhcmFjdGVySURzU3RyaW5nOiBzcWxganNvbl9ncm91cF9hcnJheShjaGFyYWN0ZXJzLmlkKWBcblx0XHR9KS5mcm9tKHVzZXJzKS53aGVyZShlcSh1c2Vycy5pZCwgaWQpKS5sZWZ0Sm9pbihjaGFyYWN0ZXJzLCBlcSh1c2Vycy5pZCwgY2hhcmFjdGVycy51c2VySUQpKS5nZXQoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGcm9tUXVlcnkocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgZmluZEJ5RGlzY29yZElkKGlkKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KHtcblx0XHRcdGlkOiB1c2Vycy5pZCxcblx0XHRcdGRpc2NvcmRJRDogdXNlcnMuZGlzY29yZElELFxuXHRcdFx0Y3JlYXRlZEF0OiB1c2Vycy5jcmVhdGVkQXQsXG5cdFx0XHR1cGRhdGVkQXQ6IHVzZXJzLnVwZGF0ZWRBdCxcblx0XHRcdG1haW5DaGFyYWN0ZXJJRDogdXNlcnMubWFpbkNoYXJhY3Rlcixcblx0XHRcdGNoYXJhY3RlcklEc1N0cmluZzogc3FsYGpzb25fZ3JvdXBfYXJyYXkoY2hhcmFjdGVycy5pZClgXG5cdFx0fSkuZnJvbSh1c2Vycykud2hlcmUoZXEodXNlcnMuZGlzY29yZElELCBpZCkpLmxlZnRKb2luKGNoYXJhY3RlcnMsIGVxKHVzZXJzLmlkLCBjaGFyYWN0ZXJzLnVzZXJJRCkpLmdldCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUZyb21RdWVyeShyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBmaW5kQWxsKCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCh7XG5cdFx0XHRpZDogdXNlcnMuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHVzZXJzLmRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogdXNlcnMuY3JlYXRlZEF0LFxuXHRcdFx0dXBkYXRlZEF0OiB1c2Vycy51cGRhdGVkQXQsXG5cdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHVzZXJzLm1haW5DaGFyYWN0ZXIsXG5cdFx0XHRjaGFyYWN0ZXJJRHNTdHJpbmc6IHNxbGBqc29uX2dyb3VwX2FycmF5KGNoYXJhY3RlcnMuaWQpYFxuXHRcdH0pLmZyb20odXNlcnMpLmxlZnRKb2luKGNoYXJhY3RlcnMsIGVxKHVzZXJzLmlkLCBjaGFyYWN0ZXJzLnVzZXJJRCkpLmFsbCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUZyb21RdWVyeShyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlDaGFyYWN0ZXJJZChpZCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCh7XG5cdFx0XHRpZDogdXNlcnMuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHVzZXJzLmRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogdXNlcnMuY3JlYXRlZEF0LFxuXHRcdFx0dXBkYXRlZEF0OiB1c2Vycy51cGRhdGVkQXQsXG5cdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHVzZXJzLm1haW5DaGFyYWN0ZXIsXG5cdFx0XHRjaGFyYWN0ZXJJRHNTdHJpbmc6IHNxbGBqc29uX2dyb3VwX2FycmF5KGNoYXJhY3RlcnMuaWQpYFxuXHRcdH0pLmZyb20odXNlcnMpLmxlZnRKb2luKGNoYXJhY3RlcnMsIGVxKHVzZXJzLmlkLCBjaGFyYWN0ZXJzLnVzZXJJRCkpLndoZXJlKGVxKGNoYXJhY3RlcnMuaWQsIGlkKSkuYWxsKCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRnJvbVF1ZXJ5KHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGZpbmRCeUNoYXJhY3Rlck5hbWUobmFtZSkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCh7XG5cdFx0XHRpZDogdXNlcnMuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHVzZXJzLmRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogdXNlcnMuY3JlYXRlZEF0LFxuXHRcdFx0dXBkYXRlZEF0OiB1c2Vycy51cGRhdGVkQXQsXG5cdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHVzZXJzLm1haW5DaGFyYWN0ZXIsXG5cdFx0XHRjaGFyYWN0ZXJJRHNTdHJpbmc6IHNxbGBqc29uX2dyb3VwX2FycmF5KGNoYXJhY3RlcnMuaWQpYFxuXHRcdH0pLmZyb20odXNlcnMpLmxlZnRKb2luKGNoYXJhY3RlcnMsIGVxKHVzZXJzLmlkLCBjaGFyYWN0ZXJzLnVzZXJJRCkpLndoZXJlKGVxKGNoYXJhY3RlcnMubmFtZSwgbmFtZSkpLmFsbCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUZyb21RdWVyeShyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBjcmVhdGVGcm9tUXVlcnkocXVlcnkpIHtcblx0XHRpZiAoIXF1ZXJ5KSByZXR1cm4gW107XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkocXVlcnkpKSByZXR1cm4gcXVlcnkubWFwKCh1c2VyKSA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRpZDogdXNlci5pZCxcblx0XHRcdFx0ZGlzY29yZElEOiB1c2VyLmRpc2NvcmRJRCxcblx0XHRcdFx0Y3JlYXRlZEF0OiBuZXcgRGF0ZSh1c2VyLmNyZWF0ZWRBdCksXG5cdFx0XHRcdHVwZGF0ZWRBdDogbmV3IERhdGUodXNlci51cGRhdGVkQXQpLFxuXHRcdFx0XHRjaGFyYWN0ZXJJRHM6IHVzZXIuY2hhcmFjdGVySURzU3RyaW5nID8gSlNPTi5wYXJzZSh1c2VyLmNoYXJhY3RlcklEc1N0cmluZyA/PyBcIltdXCIpLm1hcCgocykgPT4gTnVtYmVyKHMpKS5zb3J0KCkgOiBbXSxcblx0XHRcdFx0bWFpbkNoYXJhY3RlcklEOiB1c2VyLm1haW5DaGFyYWN0ZXJJRFxuXHRcdFx0fTtcblx0XHR9KTtcblx0XHRlbHNlIHJldHVybiB7XG5cdFx0XHRpZDogcXVlcnkuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHF1ZXJ5LmRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogbmV3IERhdGUocXVlcnkuY3JlYXRlZEF0KSxcblx0XHRcdHVwZGF0ZWRBdDogbmV3IERhdGUocXVlcnkudXBkYXRlZEF0KSxcblx0XHRcdGNoYXJhY3RlcklEczogcXVlcnkuY2hhcmFjdGVySURzU3RyaW5nID8gSlNPTi5wYXJzZShxdWVyeS5jaGFyYWN0ZXJJRHNTdHJpbmcgPz8gXCJbXVwiKS5tYXAoKHMpID0+IE51bWJlcihzKSkuc29ydCgpIDogW10sXG5cdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHF1ZXJ5Lm1haW5DaGFyYWN0ZXJJRFxuXHRcdH07XG5cdH1cblx0c3RhdGljIGNyZWF0ZShkaXNjb3JkSUQpIHtcblx0XHR0aGlzLnNhdmUoe1xuXHRcdFx0ZGlzY29yZElELFxuXHRcdFx0Y3JlYXRlZEF0OiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSxcblx0XHRcdHVwZGF0ZWRBdDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKClcblx0XHR9KTtcblx0XHRyZXR1cm4gdGhpcy5maW5kQnlEaXNjb3JkSWQoZGlzY29yZElEKTtcblx0fVxuXHRzdGF0aWMgc2F2ZSh1c2VyKSB7XG5cdFx0ZGIuaW5zZXJ0KHVzZXJzKS52YWx1ZXMoe1xuXHRcdFx0aWQ6IHVzZXIuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHVzZXIuZGlzY29yZElELFxuXHRcdFx0bWFpbkNoYXJhY3RlcjogdXNlci5tYWluQ2hhcmFjdGVySUQsXG5cdFx0XHRjcmVhdGVkQXQ6IHVzZXIuY3JlYXRlZEF0LmdldFRpbWUoKSxcblx0XHRcdHVwZGF0ZWRBdDogdXNlci51cGRhdGVkQXQuZ2V0VGltZSgpXG5cdFx0fSkub25Db25mbGljdERvVXBkYXRlKHtcblx0XHRcdHRhcmdldDogdXNlcnMuaWQsXG5cdFx0XHRzZXQ6IHtcblx0XHRcdFx0ZGlzY29yZElEOiB1c2VyLmRpc2NvcmRJRCxcblx0XHRcdFx0bWFpbkNoYXJhY3RlcjogdXNlci5tYWluQ2hhcmFjdGVySUQsXG5cdFx0XHRcdHVwZGF0ZWRBdDogdXNlci51cGRhdGVkQXQuZ2V0VGltZSgpXG5cdFx0XHR9XG5cdFx0fSkucnVuKCk7XG5cdFx0cmV0dXJuIHVzZXI7XG5cdH1cblx0c3RhdGljIGRlbGV0ZSh1c2VyKSB7XG5cdFx0ZGIuZGVsZXRlKHVzZXJzKS53aGVyZShlcSh1c2Vycy5pZCwgdXNlci5pZCkpLnJ1bigpO1xuXHR9XG5cdHN0YXRpYyBnZXRDaGFyYWN0ZXIodXNlciwgaW5kZXgpIHtcblx0XHRpZiAoIXVzZXIuY2hhcmFjdGVySURzKSByZXR1cm4gdm9pZCAwO1xuXHRcdGlmIChpbmRleCA+PSB1c2VyLmNoYXJhY3RlcklEcy5sZW5ndGgpIHJldHVybiB2b2lkIDA7XG5cdFx0cmV0dXJuIENoYXJhY3RlckhlbHBlci5maW5kKHVzZXIuY2hhcmFjdGVySURzW2luZGV4XSk7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgVXNlckhlbHBlciB9OyIsCiAgICAiaW1wb3J0IHsgcmVzdW1lQ29tbWFuZHMgfSBmcm9tIFwiLi4vc2NoZW1hLmpzXCI7XG5pbXBvcnQgeyBkYiB9IGZyb20gXCIuLi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZXEgfSBmcm9tIFwiZHJpenpsZS1vcm1cIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9tb2RlbHMvcmVzdW1lLWNvbW1hbmQubW9kZWwudHNcbnZhciBSZXN1bWVDb21tYW5kID0gY2xhc3MgUmVzdW1lQ29tbWFuZCB7XG5cdGlkO1xuXHRjb21tYW5kO1xuXHRwYXJhbXM7XG5cdGNvbnRleHQ7XG5cdGNyZWF0ZWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTtcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5jcmVhdGVkID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7XG5cdH1cblx0c3RhdGljIGZpbmQobWVzc2FnZUlkKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KCkuZnJvbShyZXN1bWVDb21tYW5kcykud2hlcmUoZXEocmVzdW1lQ29tbWFuZHMuaWQsIG1lc3NhZ2VJZCkpLmdldCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUZyb21RdWVyeShyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBjcmVhdGUobWVzc2FnZUlkLCBjb21tYW5kLCBwYXJhbXMgPSB7fSwgY29udGV4dCA9IHt9KSB7XG5cdFx0Y29uc3QgcmVzdW1lID0gbmV3IFJlc3VtZUNvbW1hbmQoKTtcblx0XHRyZXN1bWUuaWQgPSBtZXNzYWdlSWQ7XG5cdFx0cmVzdW1lLmNvbW1hbmQgPSBjb21tYW5kO1xuXHRcdHJlc3VtZS5wYXJhbXMgPSBKU09OLnN0cmluZ2lmeShwYXJhbXMpO1xuXHRcdHJlc3VtZS5jb250ZXh0ID0gSlNPTi5zdHJpbmdpZnkoY29udGV4dCk7XG5cdFx0cmV0dXJuIHJlc3VtZTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlRnJvbVF1ZXJ5KHF1ZXJ5KSB7XG5cdFx0aWYgKCFxdWVyeSkgcmV0dXJuIG51bGw7XG5cdFx0Y29uc3QgcmVzdW1lID0gbmV3IFJlc3VtZUNvbW1hbmQoKTtcblx0XHRyZXN1bWUuaWQgPSBxdWVyeS5pZDtcblx0XHRyZXN1bWUuY29tbWFuZCA9IHF1ZXJ5LmNvbW1hbmQ7XG5cdFx0cmVzdW1lLnBhcmFtcyA9IHF1ZXJ5LnBhcmFtcztcblx0XHRyZXN1bWUuY29udGV4dCA9IHF1ZXJ5LmNvbnRleHQ7XG5cdFx0cmVzdW1lLmNyZWF0ZWQgPSBxdWVyeS5jcmVhdGVkO1xuXHRcdHJldHVybiByZXN1bWU7XG5cdH1cblx0c2F2ZSgpIHtcblx0XHRkYi5pbnNlcnQocmVzdW1lQ29tbWFuZHMpLnZhbHVlcyh7XG5cdFx0XHRpZDogdGhpcy5pZCxcblx0XHRcdGNvbW1hbmQ6IHRoaXMuY29tbWFuZCxcblx0XHRcdHBhcmFtczogdGhpcy5wYXJhbXMsXG5cdFx0XHRjb250ZXh0OiB0aGlzLmNvbnRleHQsXG5cdFx0XHRjcmVhdGVkQXQ6IHRoaXMuY3JlYXRlZC5nZXRUaW1lKClcblx0XHR9KS5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuXHRcdFx0dGFyZ2V0OiByZXN1bWVDb21tYW5kcy5pZCxcblx0XHRcdHNldDoge1xuXHRcdFx0XHRjb21tYW5kOiB0aGlzLmNvbW1hbmQsXG5cdFx0XHRcdHBhcmFtczogdGhpcy5wYXJhbXMsXG5cdFx0XHRcdGNvbnRleHQ6IHRoaXMuY29udGV4dFxuXHRcdFx0fVxuXHRcdH0pLnJ1bigpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdGRlbGV0ZSgpIHtcblx0XHRkYi5kZWxldGUocmVzdW1lQ29tbWFuZHMpLndoZXJlKGVxKHJlc3VtZUNvbW1hbmRzLmlkLCB0aGlzLmlkKSkucnVuKCk7XG5cdH1cblx0c3RhdGljIGRlbGV0ZShtZXNzYWdlSWQpIHtcblx0XHRkYi5kZWxldGUocmVzdW1lQ29tbWFuZHMpLndoZXJlKGVxKHJlc3VtZUNvbW1hbmRzLmlkLCBtZXNzYWdlSWQpKS5ydW4oKTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBSZXN1bWVDb21tYW5kIH07IiwKICAgICJpbXBvcnQgeyBfX2V4cG9ydCB9IGZyb20gXCIuLi8uLi9fdmlydHVhbC9yb2xsZG93bl9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIgfSBmcm9tIFwiLi9jaGFyYWN0ZXIubW9kZWwuanNcIjtcbmltcG9ydCB7IFVzZXJIZWxwZXIgfSBmcm9tIFwiLi91c2VyLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBSZXN1bWVDb21tYW5kIH0gZnJvbSBcIi4vcmVzdW1lLWNvbW1hbmQubW9kZWwuanNcIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9tb2RlbHMvaW5kZXgudHNcbnZhciBtb2RlbHNfZXhwb3J0cyA9IHt9O1xuX19leHBvcnQobW9kZWxzX2V4cG9ydHMsIHtcblx0Q2hhcmFjdGVySGVscGVyOiAoKSA9PiBDaGFyYWN0ZXJIZWxwZXIsXG5cdFJlc3VtZUNvbW1hbmQ6ICgpID0+IFJlc3VtZUNvbW1hbmQsXG5cdFVzZXJIZWxwZXI6ICgpID0+IFVzZXJIZWxwZXJcbn0pO1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IG1vZGVsc19leHBvcnRzIH07IiwKICAgICJpbXBvcnQgeyBEYXRhYmFzZSB9IGZyb20gXCJidW46c3FsaXRlXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgRGVmYXVsdExvZ2dlciB9IGZyb20gXCIuLi9sb2dnZXIuanNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZVRhYmxlUmVsYXRpb25zSGVscGVycyxcbiAgZXh0cmFjdFRhYmxlc1JlbGF0aW9uYWxDb25maWdcbn0gZnJvbSBcIi4uL3JlbGF0aW9ucy5qc1wiO1xuaW1wb3J0IHsgQmFzZVNRTGl0ZURhdGFiYXNlIH0gZnJvbSBcIi4uL3NxbGl0ZS1jb3JlL2RiLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVTeW5jRGlhbGVjdCB9IGZyb20gXCIuLi9zcWxpdGUtY29yZS9kaWFsZWN0LmpzXCI7XG5pbXBvcnQgeyBpc0NvbmZpZyB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQnVuU2Vzc2lvbiB9IGZyb20gXCIuL3Nlc3Npb24uanNcIjtcbmNsYXNzIEJ1blNRTGl0ZURhdGFiYXNlIGV4dGVuZHMgQmFzZVNRTGl0ZURhdGFiYXNlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQnVuU1FMaXRlRGF0YWJhc2VcIjtcbn1cbmZ1bmN0aW9uIGNvbnN0cnVjdChjbGllbnQsIGNvbmZpZyA9IHt9KSB7XG4gIGNvbnN0IGRpYWxlY3QgPSBuZXcgU1FMaXRlU3luY0RpYWxlY3QoeyBjYXNpbmc6IGNvbmZpZy5jYXNpbmcgfSk7XG4gIGxldCBsb2dnZXI7XG4gIGlmIChjb25maWcubG9nZ2VyID09PSB0cnVlKSB7XG4gICAgbG9nZ2VyID0gbmV3IERlZmF1bHRMb2dnZXIoKTtcbiAgfSBlbHNlIGlmIChjb25maWcubG9nZ2VyICE9PSBmYWxzZSkge1xuICAgIGxvZ2dlciA9IGNvbmZpZy5sb2dnZXI7XG4gIH1cbiAgbGV0IHNjaGVtYTtcbiAgaWYgKGNvbmZpZy5zY2hlbWEpIHtcbiAgICBjb25zdCB0YWJsZXNDb25maWcgPSBleHRyYWN0VGFibGVzUmVsYXRpb25hbENvbmZpZyhcbiAgICAgIGNvbmZpZy5zY2hlbWEsXG4gICAgICBjcmVhdGVUYWJsZVJlbGF0aW9uc0hlbHBlcnNcbiAgICApO1xuICAgIHNjaGVtYSA9IHtcbiAgICAgIGZ1bGxTY2hlbWE6IGNvbmZpZy5zY2hlbWEsXG4gICAgICBzY2hlbWE6IHRhYmxlc0NvbmZpZy50YWJsZXMsXG4gICAgICB0YWJsZU5hbWVzTWFwOiB0YWJsZXNDb25maWcudGFibGVOYW1lc01hcFxuICAgIH07XG4gIH1cbiAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBTUUxpdGVCdW5TZXNzaW9uKGNsaWVudCwgZGlhbGVjdCwgc2NoZW1hLCB7IGxvZ2dlciB9KTtcbiAgY29uc3QgZGIgPSBuZXcgQnVuU1FMaXRlRGF0YWJhc2UoXCJzeW5jXCIsIGRpYWxlY3QsIHNlc3Npb24sIHNjaGVtYSk7XG4gIGRiLiRjbGllbnQgPSBjbGllbnQ7XG4gIHJldHVybiBkYjtcbn1cbmZ1bmN0aW9uIGRyaXp6bGUoLi4ucGFyYW1zKSB7XG4gIGlmIChwYXJhbXNbMF0gPT09IHZvaWQgMCB8fCB0eXBlb2YgcGFyYW1zWzBdID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBwYXJhbXNbMF0gPT09IHZvaWQgMCA/IG5ldyBEYXRhYmFzZSgpIDogbmV3IERhdGFiYXNlKHBhcmFtc1swXSk7XG4gICAgcmV0dXJuIGNvbnN0cnVjdChpbnN0YW5jZSwgcGFyYW1zWzFdKTtcbiAgfVxuICBpZiAoaXNDb25maWcocGFyYW1zWzBdKSkge1xuICAgIGNvbnN0IHsgY29ubmVjdGlvbiwgY2xpZW50LCAuLi5kcml6emxlQ29uZmlnIH0gPSBwYXJhbXNbMF07XG4gICAgaWYgKGNsaWVudCkgcmV0dXJuIGNvbnN0cnVjdChjbGllbnQsIGRyaXp6bGVDb25maWcpO1xuICAgIGlmICh0eXBlb2YgY29ubmVjdGlvbiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgeyBzb3VyY2UsIC4uLm9wdHMgfSA9IGNvbm5lY3Rpb247XG4gICAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LnZhbHVlcyhvcHRzKS5maWx0ZXIoKHYpID0+IHYgIT09IHZvaWQgMCkubGVuZ3RoID8gb3B0cyA6IHZvaWQgMDtcbiAgICAgIGNvbnN0IGluc3RhbmNlMiA9IG5ldyBEYXRhYmFzZShzb3VyY2UsIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIGNvbnN0cnVjdChpbnN0YW5jZTIsIGRyaXp6bGVDb25maWcpO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBEYXRhYmFzZShjb25uZWN0aW9uKTtcbiAgICByZXR1cm4gY29uc3RydWN0KGluc3RhbmNlLCBkcml6emxlQ29uZmlnKTtcbiAgfVxuICByZXR1cm4gY29uc3RydWN0KHBhcmFtc1swXSwgcGFyYW1zWzFdKTtcbn1cbigoZHJpenpsZTIpID0+IHtcbiAgZnVuY3Rpb24gbW9jayhjb25maWcpIHtcbiAgICByZXR1cm4gY29uc3RydWN0KHt9LCBjb25maWcpO1xuICB9XG4gIGRyaXp6bGUyLm1vY2sgPSBtb2NrO1xufSkoZHJpenpsZSB8fCAoZHJpenpsZSA9IHt9KSk7XG5leHBvcnQge1xuICBCdW5TUUxpdGVEYXRhYmFzZSxcbiAgZHJpenpsZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRyaXZlci5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBOb29wTG9nZ2VyIH0gZnJvbSBcIi4uL2xvZ2dlci5qc1wiO1xuaW1wb3J0IHsgZmlsbFBsYWNlaG9sZGVycywgc3FsIH0gZnJvbSBcIi4uL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVRyYW5zYWN0aW9uIH0gZnJvbSBcIi4uL3NxbGl0ZS1jb3JlL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVQcmVwYXJlZFF1ZXJ5IGFzIFByZXBhcmVkUXVlcnlCYXNlLCBTUUxpdGVTZXNzaW9uIH0gZnJvbSBcIi4uL3NxbGl0ZS1jb3JlL3Nlc3Npb24uanNcIjtcbmltcG9ydCB7IG1hcFJlc3VsdFJvdyB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuY2xhc3MgU1FMaXRlQnVuU2Vzc2lvbiBleHRlbmRzIFNRTGl0ZVNlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihjbGllbnQsIGRpYWxlY3QsIHNjaGVtYSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoZGlhbGVjdCk7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zLmxvZ2dlciA/PyBuZXcgTm9vcExvZ2dlcigpO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJ1blNlc3Npb25cIjtcbiAgbG9nZ2VyO1xuICBleGVjKHF1ZXJ5KSB7XG4gICAgdGhpcy5jbGllbnQuZXhlYyhxdWVyeSk7XG4gIH1cbiAgcHJlcGFyZVF1ZXJ5KHF1ZXJ5LCBmaWVsZHMsIGV4ZWN1dGVNZXRob2QsIGlzUmVzcG9uc2VJbkFycmF5TW9kZSwgY3VzdG9tUmVzdWx0TWFwcGVyKSB7XG4gICAgY29uc3Qgc3RtdCA9IHRoaXMuY2xpZW50LnByZXBhcmUocXVlcnkuc3FsKTtcbiAgICByZXR1cm4gbmV3IFByZXBhcmVkUXVlcnkoXG4gICAgICBzdG10LFxuICAgICAgcXVlcnksXG4gICAgICB0aGlzLmxvZ2dlcixcbiAgICAgIGZpZWxkcyxcbiAgICAgIGV4ZWN1dGVNZXRob2QsXG4gICAgICBpc1Jlc3BvbnNlSW5BcnJheU1vZGUsXG4gICAgICBjdXN0b21SZXN1bHRNYXBwZXJcbiAgICApO1xuICB9XG4gIHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uLCBjb25maWcgPSB7fSkge1xuICAgIGNvbnN0IHR4ID0gbmV3IFNRTGl0ZUJ1blRyYW5zYWN0aW9uKFwic3luY1wiLCB0aGlzLmRpYWxlY3QsIHRoaXMsIHRoaXMuc2NoZW1hKTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGNvbnN0IG5hdGl2ZVR4ID0gdGhpcy5jbGllbnQudHJhbnNhY3Rpb24oKCkgPT4ge1xuICAgICAgcmVzdWx0ID0gdHJhbnNhY3Rpb24odHgpO1xuICAgIH0pO1xuICAgIG5hdGl2ZVR4W2NvbmZpZy5iZWhhdmlvciA/PyBcImRlZmVycmVkXCJdKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQnVuVHJhbnNhY3Rpb24gZXh0ZW5kcyBTUUxpdGVUcmFuc2FjdGlvbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJ1blRyYW5zYWN0aW9uXCI7XG4gIHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgY29uc3Qgc2F2ZXBvaW50TmFtZSA9IGBzcCR7dGhpcy5uZXN0ZWRJbmRleH1gO1xuICAgIGNvbnN0IHR4ID0gbmV3IFNRTGl0ZUJ1blRyYW5zYWN0aW9uKFwic3luY1wiLCB0aGlzLmRpYWxlY3QsIHRoaXMuc2Vzc2lvbiwgdGhpcy5zY2hlbWEsIHRoaXMubmVzdGVkSW5kZXggKyAxKTtcbiAgICB0aGlzLnNlc3Npb24ucnVuKHNxbC5yYXcoYHNhdmVwb2ludCAke3NhdmVwb2ludE5hbWV9YCkpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0cmFuc2FjdGlvbih0eCk7XG4gICAgICB0aGlzLnNlc3Npb24ucnVuKHNxbC5yYXcoYHJlbGVhc2Ugc2F2ZXBvaW50ICR7c2F2ZXBvaW50TmFtZX1gKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5zZXNzaW9uLnJ1bihzcWwucmF3KGByb2xsYmFjayB0byBzYXZlcG9pbnQgJHtzYXZlcG9pbnROYW1lfWApKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIFByZXBhcmVkUXVlcnkgZXh0ZW5kcyBQcmVwYXJlZFF1ZXJ5QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHN0bXQsIHF1ZXJ5LCBsb2dnZXIsIGZpZWxkcywgZXhlY3V0ZU1ldGhvZCwgX2lzUmVzcG9uc2VJbkFycmF5TW9kZSwgY3VzdG9tUmVzdWx0TWFwcGVyKSB7XG4gICAgc3VwZXIoXCJzeW5jXCIsIGV4ZWN1dGVNZXRob2QsIHF1ZXJ5KTtcbiAgICB0aGlzLnN0bXQgPSBzdG10O1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICAgIHRoaXMuZmllbGRzID0gZmllbGRzO1xuICAgIHRoaXMuX2lzUmVzcG9uc2VJbkFycmF5TW9kZSA9IF9pc1Jlc3BvbnNlSW5BcnJheU1vZGU7XG4gICAgdGhpcy5jdXN0b21SZXN1bHRNYXBwZXIgPSBjdXN0b21SZXN1bHRNYXBwZXI7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQnVuUHJlcGFyZWRRdWVyeVwiO1xuICBydW4ocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBmaWxsUGxhY2Vob2xkZXJzKHRoaXMucXVlcnkucGFyYW1zLCBwbGFjZWhvbGRlclZhbHVlcyA/PyB7fSk7XG4gICAgdGhpcy5sb2dnZXIubG9nUXVlcnkodGhpcy5xdWVyeS5zcWwsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXMuc3RtdC5ydW4oLi4ucGFyYW1zKTtcbiAgfVxuICBhbGwocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICBjb25zdCB7IGZpZWxkcywgcXVlcnksIGxvZ2dlciwgam9pbnNOb3ROdWxsYWJsZU1hcCwgc3RtdCwgY3VzdG9tUmVzdWx0TWFwcGVyIH0gPSB0aGlzO1xuICAgIGlmICghZmllbGRzICYmICFjdXN0b21SZXN1bHRNYXBwZXIpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IGZpbGxQbGFjZWhvbGRlcnMocXVlcnkucGFyYW1zLCBwbGFjZWhvbGRlclZhbHVlcyA/PyB7fSk7XG4gICAgICBsb2dnZXIubG9nUXVlcnkocXVlcnkuc3FsLCBwYXJhbXMpO1xuICAgICAgcmV0dXJuIHN0bXQuYWxsKC4uLnBhcmFtcyk7XG4gICAgfVxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcyk7XG4gICAgaWYgKGN1c3RvbVJlc3VsdE1hcHBlcikge1xuICAgICAgcmV0dXJuIGN1c3RvbVJlc3VsdE1hcHBlcihyb3dzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IG1hcFJlc3VsdFJvdyhmaWVsZHMsIHJvdywgam9pbnNOb3ROdWxsYWJsZU1hcCkpO1xuICB9XG4gIGdldChwbGFjZWhvbGRlclZhbHVlcykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGZpbGxQbGFjZWhvbGRlcnModGhpcy5xdWVyeS5wYXJhbXMsIHBsYWNlaG9sZGVyVmFsdWVzID8/IHt9KTtcbiAgICB0aGlzLmxvZ2dlci5sb2dRdWVyeSh0aGlzLnF1ZXJ5LnNxbCwgcGFyYW1zKTtcbiAgICBjb25zdCByb3cgPSB0aGlzLnN0bXQudmFsdWVzKC4uLnBhcmFtcylbMF07XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICAgIGNvbnN0IHsgZmllbGRzLCBqb2luc05vdE51bGxhYmxlTWFwLCBjdXN0b21SZXN1bHRNYXBwZXIgfSA9IHRoaXM7XG4gICAgaWYgKCFmaWVsZHMgJiYgIWN1c3RvbVJlc3VsdE1hcHBlcikge1xuICAgICAgcmV0dXJuIHJvdztcbiAgICB9XG4gICAgaWYgKGN1c3RvbVJlc3VsdE1hcHBlcikge1xuICAgICAgcmV0dXJuIGN1c3RvbVJlc3VsdE1hcHBlcihbcm93XSk7XG4gICAgfVxuICAgIHJldHVybiBtYXBSZXN1bHRSb3coZmllbGRzLCByb3csIGpvaW5zTm90TnVsbGFibGVNYXApO1xuICB9XG4gIHZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGZpbGxQbGFjZWhvbGRlcnModGhpcy5xdWVyeS5wYXJhbXMsIHBsYWNlaG9sZGVyVmFsdWVzID8/IHt9KTtcbiAgICB0aGlzLmxvZ2dlci5sb2dRdWVyeSh0aGlzLnF1ZXJ5LnNxbCwgcGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcy5zdG10LnZhbHVlcyguLi5wYXJhbXMpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgaXNSZXNwb25zZUluQXJyYXlNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Jlc3BvbnNlSW5BcnJheU1vZGU7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFByZXBhcmVkUXVlcnksXG4gIFNRTGl0ZUJ1blNlc3Npb24sXG4gIFNRTGl0ZUJ1blRyYW5zYWN0aW9uXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2Vzc2lvbi5qcy5tYXAiLAogICAgImltcG9ydCB7IGNoYXJhY3RlcnMsIG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzLCBtaW5pbmdGbGVldHMsIHJlc3VtZUNvbW1hbmRzLCBzY2hlbWFfZXhwb3J0cywgdXNlcnMgfSBmcm9tIFwiLi9zY2hlbWEuanNcIjtcbmltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuL21vZGVscy9jaGFyYWN0ZXIubW9kZWwuanNcIjtcbmltcG9ydCB7IFVzZXJIZWxwZXIgfSBmcm9tIFwiLi9tb2RlbHMvdXNlci5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgUmVzdW1lQ29tbWFuZCB9IGZyb20gXCIuL21vZGVscy9yZXN1bWUtY29tbWFuZC5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgbW9kZWxzX2V4cG9ydHMgfSBmcm9tIFwiLi9tb2RlbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IGRyaXp6bGUgfSBmcm9tIFwiZHJpenpsZS1vcm0vYnVuLXNxbGl0ZVwiO1xuaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tIFwiYnVuOnNxbGl0ZVwiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9pbmRleC50c1xuY29uc3QgREJfUEFUSCA9IHByb2Nlc3MuZW52LkFVVEhfREJfUEFUSCB8fCBqb2luKHByb2Nlc3MuY3dkKCksIFwiLi4vLi4vZGIva2l0dGVuLmRiXCIpO1xuY29uc29sZS5sb2coXCJVc2luZyBEQl9QQVRIOlwiLCBEQl9QQVRIKTtcbmNvbnN0IHNxbGl0ZSA9IG5ldyBEYXRhYmFzZShEQl9QQVRIKTtcbmNvbnN0IGRiID0gZHJpenpsZShzcWxpdGUsIHsgc2NoZW1hOiB7XG5cdHVzZXJzLFxuXHRjaGFyYWN0ZXJzLFxuXHRyZXN1bWVDb21tYW5kcyxcblx0bWluaW5nRmxlZXRzLFxuXHRtaW5pbmdGbGVldFBhcnRpY2lwYW50c1xufSB9KTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIsIERCX1BBVEgsIFJlc3VtZUNvbW1hbmQsIFVzZXJIZWxwZXIsIGRiLCBtb2RlbHNfZXhwb3J0cyBhcyBtb2RlbHMsIHNjaGVtYV9leHBvcnRzIGFzIHNjaGVtYSB9OyIsCiAgICAiaW1wb3J0IHsgY2hhcmFjdGVycyB9IGZyb20gXCIuLi9zY2hlbWEuanNcIjtcbmltcG9ydCB7IHJlZnJlc2gsIHZhbGlkYXRlVG9rZW4gfSBmcm9tIFwiLi4vLi4vZXNpL2F1dGguanNcIjtcbmltcG9ydCB7IGRiIH0gZnJvbSBcIi4uL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBhbmQsIGVxIH0gZnJvbSBcImRyaXp6bGUtb3JtXCI7XG5pbXBvcnQgeyBqd3REZWNvZGUgfSBmcm9tIFwiand0LWRlY29kZVwiO1xuXG4vLyNyZWdpb24gc3JjL2RiL21vZGVscy9jaGFyYWN0ZXIubW9kZWwudHNcbnZhciBDaGFyYWN0ZXJIZWxwZXIgPSBjbGFzcyBDaGFyYWN0ZXJIZWxwZXIge1xuXHRzdGF0aWMgaGFzVmFsaWRUb2tlbihjaGFyYWN0ZXIpIHtcblx0XHRyZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkgPCBjaGFyYWN0ZXIuZXhwaXJlc0F0O1xuXHR9XG5cdHN0YXRpYyBnZXRTY29wZXMoY2hhcmFjdGVyKSB7XG5cdFx0Y29uc3QgZGVjb2RlZCA9IGp3dERlY29kZShjaGFyYWN0ZXIuYWNjZXNzVG9rZW4pO1xuXHRcdHJldHVybiB0eXBlb2YgZGVjb2RlZC5zY3AgPT09IFwic3RyaW5nXCIgPyBbZGVjb2RlZC5zY3BdIDogZGVjb2RlZC5zY3A7XG5cdH1cblx0c3RhdGljIGhhc09ubHlQdWJsaWNTY29wZShjaGFyYWN0ZXIpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRTY29wZXMoY2hhcmFjdGVyKS5sZW5ndGggPT09IDEgJiYgdGhpcy5oYXNTY29wZShjaGFyYWN0ZXIsIFwicHVibGljRGF0YVwiKTtcblx0fVxuXHRzdGF0aWMgZ2V0VG9rZW5zKGNoYXJhY3Rlcikge1xuXHRcdHJldHVybiB7XG5cdFx0XHRhY2Nlc3NfdG9rZW46IGNoYXJhY3Rlci5hY2Nlc3NUb2tlbixcblx0XHRcdHJlZnJlc2hfdG9rZW46IGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4sXG5cdFx0XHRleHBpcmVzX2luOiAoY2hhcmFjdGVyLmV4cGlyZXNBdC5nZXRUaW1lKCkgLSBEYXRlLm5vdygpKSAvIDFlM1xuXHRcdH07XG5cdH1cblx0c3RhdGljIGhhc1Njb3BlKGNoYXJhY3Rlciwgc2NvcGUpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRTY29wZXMoY2hhcmFjdGVyKS5pbmNsdWRlcyhzY29wZSk7XG5cdH1cblx0c3RhdGljIGhhc0FsbFNjb3BlcyhjaGFyYWN0ZXIsIHNjb3Blcykge1xuXHRcdGNvbnN0IGhhcyA9IHRoaXMuZ2V0U2NvcGVzKGNoYXJhY3Rlcik7XG5cdFx0cmV0dXJuIHNjb3Blcy5ldmVyeSgoc2NvcGUpID0+IGhhcy5pbmNsdWRlcyhzY29wZSkpO1xuXHR9XG5cdHN0YXRpYyBmaW5kKGlkKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KCkuZnJvbShjaGFyYWN0ZXJzKS53aGVyZShlcShjaGFyYWN0ZXJzLmlkLCBpZCkpLmxpbWl0KDEpLmdldCgpO1xuXHRcdGNvbnN0IGMgPSB0aGlzLmNyZWF0ZUNoYXJhY3RlcnMocmVzdWx0KTtcblx0XHRyZXR1cm4gYyA/IGNbMF0gOiB2b2lkIDA7XG5cdH1cblx0c3RhdGljIGZpbmRCeVVzZXIodXNlcikge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20oY2hhcmFjdGVycykud2hlcmUoZXEoY2hhcmFjdGVycy51c2VySUQsIHVzZXIuaWQpKS5hbGwoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVDaGFyYWN0ZXJzKHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGZpbmRCeVVzZXJBbmRFdmVJRCh1c2VySUQsIGV2ZUlEKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KCkuZnJvbShjaGFyYWN0ZXJzKS53aGVyZShhbmQoZXEoY2hhcmFjdGVycy51c2VySUQsIHVzZXJJRCksIGVxKGNoYXJhY3RlcnMuZXZlSUQsIGV2ZUlEKSkpLmxpbWl0KDEpLmdldCgpO1xuXHRcdGNvbnN0IGMgPSB0aGlzLmNyZWF0ZUNoYXJhY3RlcnMocmVzdWx0KTtcblx0XHRyZXR1cm4gYyA/IGNbMF0gOiB2b2lkIDA7XG5cdH1cblx0c3RhdGljIGZpbmRCeU5hbWUodXNlcklELCBuYW1lKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KCkuZnJvbShjaGFyYWN0ZXJzKS53aGVyZShhbmQoZXEoY2hhcmFjdGVycy5uYW1lLCBuYW1lKSwgZXEoY2hhcmFjdGVycy51c2VySUQsIHVzZXJJRCkpKS5saW1pdCgxKS5nZXQoKTtcblx0XHRjb25zdCBjID0gdGhpcy5jcmVhdGVDaGFyYWN0ZXJzKHJlc3VsdCk7XG5cdFx0cmV0dXJuIGMgPyBjWzBdIDogdm9pZCAwO1xuXHR9XG5cdHN0YXRpYyBmaW5kQWxsKCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20oY2hhcmFjdGVycykuYWxsKCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ2hhcmFjdGVycyhyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBjcmVhdGUoZXZlSUQsIG5hbWUsIHVzZXIsIHRva2Vucykge1xuXHRcdHJldHVybiB0aGlzLnNhdmUoe1xuXHRcdFx0ZXZlSUQsXG5cdFx0XHR1c2VySUQ6IHVzZXIuaWQsXG5cdFx0XHRhY2Nlc3NUb2tlbjogdG9rZW5zLmFjY2Vzc190b2tlbixcblx0XHRcdGV4cGlyZXNBdDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKHRva2Vucy5leHBpcmVzX2luICogMWUzKSxcblx0XHRcdHJlZnJlc2hUb2tlbjogdG9rZW5zLnJlZnJlc2hfdG9rZW4sXG5cdFx0XHRuYW1lLFxuXHRcdFx0Y3JlYXRlZEF0OiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKVxuXHRcdH0pO1xuXHR9XG5cdHN0YXRpYyBjcmVhdGVDaGFyYWN0ZXJzKHF1ZXJ5KSB7XG5cdFx0aWYgKCFxdWVyeSkgcmV0dXJuIFtdO1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5KSkgcmV0dXJuIHF1ZXJ5Lm1hcCgoY2hhcmFjdGVyKSA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRpZDogY2hhcmFjdGVyLmlkLFxuXHRcdFx0XHRldmVJRDogY2hhcmFjdGVyLmV2ZUlELFxuXHRcdFx0XHR1c2VySUQ6IGNoYXJhY3Rlci51c2VySUQsXG5cdFx0XHRcdGFjY2Vzc1Rva2VuOiBjaGFyYWN0ZXIuYWNjZXNzVG9rZW4sXG5cdFx0XHRcdGV4cGlyZXNBdDogbmV3IERhdGUoY2hhcmFjdGVyLmV4cGlyZXNBdCksXG5cdFx0XHRcdHJlZnJlc2hUb2tlbjogY2hhcmFjdGVyLnJlZnJlc2hUb2tlbixcblx0XHRcdFx0bmFtZTogY2hhcmFjdGVyLm5hbWUsXG5cdFx0XHRcdGNyZWF0ZWRBdDogbmV3IERhdGUoY2hhcmFjdGVyLmNyZWF0ZWRBdCksXG5cdFx0XHRcdHVwZGF0ZWRBdDogbmV3IERhdGUoY2hhcmFjdGVyLnVwZGF0ZWRBdClcblx0XHRcdH07XG5cdFx0fSk7XG5cdFx0ZWxzZSByZXR1cm4gW3tcblx0XHRcdGlkOiBxdWVyeS5pZCxcblx0XHRcdGV2ZUlEOiBxdWVyeS5ldmVJRCxcblx0XHRcdHVzZXJJRDogcXVlcnkudXNlcklELFxuXHRcdFx0YWNjZXNzVG9rZW46IHF1ZXJ5LmFjY2Vzc1Rva2VuLFxuXHRcdFx0ZXhwaXJlc0F0OiBuZXcgRGF0ZShxdWVyeS5leHBpcmVzQXQpLFxuXHRcdFx0cmVmcmVzaFRva2VuOiBxdWVyeS5yZWZyZXNoVG9rZW4sXG5cdFx0XHRuYW1lOiBxdWVyeS5uYW1lLFxuXHRcdFx0Y3JlYXRlZEF0OiBuZXcgRGF0ZShxdWVyeS5jcmVhdGVkQXQpLFxuXHRcdFx0dXBkYXRlZEF0OiBuZXcgRGF0ZShxdWVyeS51cGRhdGVkQXQpXG5cdFx0fV07XG5cdH1cblx0c3RhdGljIHNhdmUoY2hhcmFjdGVyKSB7XG5cdFx0ZGIuaW5zZXJ0KGNoYXJhY3RlcnMpLnZhbHVlcyh7XG5cdFx0XHRpZDogY2hhcmFjdGVyLmlkLFxuXHRcdFx0ZXZlSUQ6IGNoYXJhY3Rlci5ldmVJRCxcblx0XHRcdHVzZXJJRDogY2hhcmFjdGVyLnVzZXJJRCxcblx0XHRcdG5hbWU6IGNoYXJhY3Rlci5uYW1lLFxuXHRcdFx0YWNjZXNzVG9rZW46IGNoYXJhY3Rlci5hY2Nlc3NUb2tlbixcblx0XHRcdGV4cGlyZXNBdDogY2hhcmFjdGVyLmV4cGlyZXNBdC5nZXRUaW1lKCksXG5cdFx0XHRyZWZyZXNoVG9rZW46IGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4sXG5cdFx0XHRjcmVhdGVkQXQ6IERhdGUubm93KCksXG5cdFx0XHR1cGRhdGVkQXQ6IERhdGUubm93KClcblx0XHR9KS5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuXHRcdFx0dGFyZ2V0OiBjaGFyYWN0ZXJzLmlkLFxuXHRcdFx0c2V0OiB7XG5cdFx0XHRcdGV2ZUlEOiBjaGFyYWN0ZXIuZXZlSUQsXG5cdFx0XHRcdHVzZXJJRDogY2hhcmFjdGVyLnVzZXJJRCxcblx0XHRcdFx0bmFtZTogY2hhcmFjdGVyLm5hbWUsXG5cdFx0XHRcdGFjY2Vzc1Rva2VuOiBjaGFyYWN0ZXIuYWNjZXNzVG9rZW4sXG5cdFx0XHRcdGV4cGlyZXNBdDogY2hhcmFjdGVyLmV4cGlyZXNBdC5nZXRUaW1lKCksXG5cdFx0XHRcdHJlZnJlc2hUb2tlbjogY2hhcmFjdGVyLnJlZnJlc2hUb2tlbixcblx0XHRcdFx0dXBkYXRlZEF0OiBEYXRlLm5vdygpXG5cdFx0XHR9XG5cdFx0fSkucnVuKCk7XG5cdFx0cmV0dXJuIENoYXJhY3RlckhlbHBlci5maW5kQnlVc2VyQW5kRXZlSUQoY2hhcmFjdGVyLnVzZXJJRCwgY2hhcmFjdGVyLmV2ZUlEKTtcblx0fVxuXHRzdGF0aWMgZGVsZXRlKGNoYXJhY3Rlcikge1xuXHRcdGRiLmRlbGV0ZShjaGFyYWN0ZXJzKS53aGVyZShlcShjaGFyYWN0ZXJzLmlkLCBjaGFyYWN0ZXIuaWQpKS5ydW4oKTtcblx0fVxuXHRzdGF0aWMgYXN5bmMgcmVmcmVzaFRva2VucyhjaGFyYWN0ZXIsIHNjb3Blcykge1xuXHRcdGNvbnN0IHRva2VucyA9IGF3YWl0IHJlZnJlc2goeyByZWZyZXNoX3Rva2VuOiBjaGFyYWN0ZXIucmVmcmVzaFRva2VuIH0sIHNjb3Blcyk7XG5cdFx0Y29uc3QgZGVjb2RlZCA9IGF3YWl0IHZhbGlkYXRlVG9rZW4odG9rZW5zLmFjY2Vzc190b2tlbik7XG5cdFx0aWYgKCFkZWNvZGVkKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gdmFsaWRhdGUgdG9rZW4gZm9yIGNoYXJhY3RlciAke2NoYXJhY3Rlci5ldmVJRH1gKTtcblx0XHRcdHJldHVybiBjaGFyYWN0ZXI7XG5cdFx0fVxuXHRcdGNoYXJhY3Rlci5hY2Nlc3NUb2tlbiA9IHRva2Vucy5hY2Nlc3NfdG9rZW47XG5cdFx0Y2hhcmFjdGVyLmV4cGlyZXNBdCA9IG5ldyBEYXRlKERhdGUubm93KCkgKyB0b2tlbnMuZXhwaXJlc19pbiAqIDFlMyk7XG5cdFx0Y2hhcmFjdGVyLnJlZnJlc2hUb2tlbiA9IHRva2Vucy5yZWZyZXNoX3Rva2VuO1xuXHRcdHRoaXMuc2F2ZShjaGFyYWN0ZXIpO1xuXHRcdHJldHVybiBjaGFyYWN0ZXI7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgQ2hhcmFjdGVySGVscGVyIH07IiwKICAgICJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSBcIi4vb3B0aW9ucy5qc1wiO1xuaW1wb3J0IHsgQ2hhcmFjdGVySGVscGVyIH0gZnJvbSBcIi4uL2RiL21vZGVscy9jaGFyYWN0ZXIubW9kZWwuanNcIjtcbmltcG9ydCBcIi4uL2RiL21vZGVscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgRVNJX0xBVEVTVF9VUkwgfSBmcm9tIFwiLi9zY29wZXMuanNcIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvZmV0Y2gudHNcbmNvbnN0IGNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbmZ1bmN0aW9uIGNsZWFuQ2FjaGUoKSB7XG5cdGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGNhY2hlKSBpZiAodmFsdWUuZXhwaXJlcyA8IG5vdykgY2FjaGUuZGVsZXRlKGtleSk7XG59XG5zZXRJbnRlcnZhbChjbGVhbkNhY2hlLCAxZTMgKiA2MCAqIDE1KTtcbmNvbnN0IGRlZmF1bHRDYWNoZUR1cmF0aW9uID0gMWUzICogNjAgKiAzMDtcbmFzeW5jIGZ1bmN0aW9uIGVzaUZldGNoKHBhdGgsIGNoYXJhY3RlciwgeyBtZXRob2QgPSBcIkdFVFwiLCBib2R5LCBub0NhY2hlID0gZmFsc2UsIGNhY2hlRHVyYXRpb24gPSBkZWZhdWx0Q2FjaGVEdXJhdGlvbiB9ID0ge30pIHtcblx0dHJ5IHtcblx0XHRjb25zdCBoZWFkZXJzID0ge1xuXHRcdFx0XCJVc2VyLUFnZW50XCI6IG9wdGlvbnMudXNlcl9hZ2VudCxcblx0XHRcdFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXG5cdFx0fTtcblx0XHRpZiAoY2hhcmFjdGVyKSB7XG5cdFx0XHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNWYWxpZFRva2VuKGNoYXJhY3RlcikpIHtcblx0XHRcdFx0YXdhaXQgQ2hhcmFjdGVySGVscGVyLnJlZnJlc2hUb2tlbnMoY2hhcmFjdGVyKTtcblx0XHRcdFx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzVmFsaWRUb2tlbihjaGFyYWN0ZXIpKSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIHRva2VuIGZvciBjaGFyYWN0ZXI6ICR7Y2hhcmFjdGVyLmV2ZUlEfWApO1xuXHRcdFx0fVxuXHRcdFx0aGVhZGVyc1tcIkF1dGhvcml6YXRpb25cIl0gPSBgQmVhcmVyICR7Y2hhcmFjdGVyLmFjY2Vzc1Rva2VufWA7XG5cdFx0fVxuXHRcdGNvbnN0IGluaXQgPSB7XG5cdFx0XHRoZWFkZXJzLFxuXHRcdFx0bWV0aG9kOiBtZXRob2QgfHwgXCJHRVRcIixcblx0XHRcdGJvZHk6IGJvZHkgfHwgdm9pZCAwXG5cdFx0fTtcblx0XHRjb25zdCB1cmwgPSBuZXcgVVJMKGAke0VTSV9MQVRFU1RfVVJMfSR7cGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBcIi9cIiArIHBhdGh9YCk7XG5cdFx0dXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJkYXRhc291cmNlXCIsIFwidHJhbnF1aWxpdHlcIik7XG5cdFx0aWYgKCFub0NhY2hlICYmIGluaXQubWV0aG9kID09PSBcIkdFVFwiKSB7XG5cdFx0XHRjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQodXJsLmhyZWYpO1xuXHRcdFx0aWYgKGNhY2hlZCAmJiBjYWNoZWQ/LmV4cGlyZXMgPiBEYXRlLm5vdygpKSByZXR1cm4gY2FjaGVkLmRhdGE7XG5cdFx0fVxuXHRcdGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgaW5pdCk7XG5cdFx0Y29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cdFx0aWYgKCFyZXMub2spIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYEVTSSByZXF1ZXN0IGZhaWx1cmUgYXQgJHtwYXRofSB8ICR7cmVzLnN0YXR1c306JHtyZXMuc3RhdHVzVGV4dH0gPT4gJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gKTtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRpZiAoaW5pdC5tZXRob2QgPT09IFwiR0VUXCIpIGNhY2hlLnNldCh1cmwuaHJlZiwge1xuXHRcdFx0ZXhwaXJlczogTWF0aC5tYXgocmVzLmhlYWRlcnMuZ2V0KFwiZXhwaXJlc1wiKSAmJiBuZXcgRGF0ZShOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KFwiZXhwaXJlc1wiKSB8fCBcIlwiKSkuZ2V0VGltZSgpIHx8IDAsIERhdGUubm93KCkgKyBjYWNoZUR1cmF0aW9uKSxcblx0XHRcdGRhdGFcblx0XHR9KTtcblx0XHRyZXR1cm4gZGF0YTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Y29uc29sZS5lcnJvcihgRVNJIHJlcXVlc3QgZmFpbHVyZSBhdCAke3BhdGh9IHwgJHtKU09OLnN0cmluZ2lmeShlcnIpfWAsIGVycik7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBlc2lGZXRjaCB9OyIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgQ2hhcmFjdGVySGVscGVyIH0gZnJvbSBcIi4uL2RiL21vZGVscy9jaGFyYWN0ZXIubW9kZWwuanNcIjtcbmltcG9ydCBcIi4uL2RiL2luZGV4LmpzXCI7XG5pbXBvcnQgXCIuL3Njb3Blcy5qc1wiO1xuaW1wb3J0IHsgZXNpRmV0Y2ggfSBmcm9tIFwiLi9mZXRjaC5qc1wiO1xuXG4vLyNyZWdpb24gc3JjL2VzaS9jaGFyYWN0ZXIudHNcbnZhciBjaGFyYWN0ZXJfZXhwb3J0cyA9IHt9O1xuX19leHBvcnQoY2hhcmFjdGVyX2V4cG9ydHMsIHtcblx0Z2V0Q2hhcmFjdGVyQWZmaWxpYXRpb25zOiAoKSA9PiBnZXRDaGFyYWN0ZXJBZmZpbGlhdGlvbnMsXG5cdGdldENoYXJhY3RlckFnZW50UmVzZWFyY2g6ICgpID0+IGdldENoYXJhY3RlckFnZW50UmVzZWFyY2gsXG5cdGdldENoYXJhY3RlckFzc2V0TG9jYXRpb25zOiAoKSA9PiBnZXRDaGFyYWN0ZXJBc3NldExvY2F0aW9ucyxcblx0Z2V0Q2hhcmFjdGVyQXNzZXROYW1lczogKCkgPT4gZ2V0Q2hhcmFjdGVyQXNzZXROYW1lcyxcblx0Z2V0Q2hhcmFjdGVyQXNzZXRzOiAoKSA9PiBnZXRDaGFyYWN0ZXJBc3NldHMsXG5cdGdldENoYXJhY3RlckJsdWVwcmludHM6ICgpID0+IGdldENoYXJhY3RlckJsdWVwcmludHMsXG5cdGdldENoYXJhY3RlckNsb25lczogKCkgPT4gZ2V0Q2hhcmFjdGVyQ2xvbmVzLFxuXHRnZXRDaGFyYWN0ZXJDb250YWN0Tm90aWZpY2F0aW9uczogKCkgPT4gZ2V0Q2hhcmFjdGVyQ29udGFjdE5vdGlmaWNhdGlvbnMsXG5cdGdldENoYXJhY3RlckNvcnBvcmF0aW9uSGlzdG9yeTogKCkgPT4gZ2V0Q2hhcmFjdGVyQ29ycG9yYXRpb25IaXN0b3J5LFxuXHRnZXRDaGFyYWN0ZXJDdXJyZW50U2hpcDogKCkgPT4gZ2V0Q2hhcmFjdGVyQ3VycmVudFNoaXAsXG5cdGdldENoYXJhY3RlckltcGxhbnRzOiAoKSA9PiBnZXRDaGFyYWN0ZXJJbXBsYW50cyxcblx0Z2V0Q2hhcmFjdGVySnVtcEZhdGlndWU6ICgpID0+IGdldENoYXJhY3Rlckp1bXBGYXRpZ3VlLFxuXHRnZXRDaGFyYWN0ZXJMb2NhdGlvbjogKCkgPT4gZ2V0Q2hhcmFjdGVyTG9jYXRpb24sXG5cdGdldENoYXJhY3Rlck1lZGFsczogKCkgPT4gZ2V0Q2hhcmFjdGVyTWVkYWxzLFxuXHRnZXRDaGFyYWN0ZXJOb3RpZmljYXRpb25zOiAoKSA9PiBnZXRDaGFyYWN0ZXJOb3RpZmljYXRpb25zLFxuXHRnZXRDaGFyYWN0ZXJPbmxpbmU6ICgpID0+IGdldENoYXJhY3Rlck9ubGluZSxcblx0Z2V0Q2hhcmFjdGVyUG9ydHJhaXRzOiAoKSA9PiBnZXRDaGFyYWN0ZXJQb3J0cmFpdHMsXG5cdGdldENoYXJhY3RlclB1YmxpY0RhdGE6ICgpID0+IGdldENoYXJhY3RlclB1YmxpY0RhdGEsXG5cdGdldENoYXJhY3RlclJvbGVzOiAoKSA9PiBnZXRDaGFyYWN0ZXJSb2xlcyxcblx0Z2V0Q2hhcmFjdGVyU3RhbmRpbmdzOiAoKSA9PiBnZXRDaGFyYWN0ZXJTdGFuZGluZ3MsXG5cdGdldENoYXJhY3RlclRpdGxlczogKCkgPT4gZ2V0Q2hhcmFjdGVyVGl0bGVzLFxuXHRnZXRDaGFyYWN0ZXJXYWxsZXQ6ICgpID0+IGdldENoYXJhY3RlcldhbGxldCxcblx0Z2V0Q2hhcmFjdGVyV2FsbGV0Sm91cm5hbDogKCkgPT4gZ2V0Q2hhcmFjdGVyV2FsbGV0Sm91cm5hbCxcblx0Z2V0Q2hhcmFjdGVyV2FsbGV0VHJhbnNhY3Rpb25zOiAoKSA9PiBnZXRDaGFyYWN0ZXJXYWxsZXRUcmFuc2FjdGlvbnMsXG5cdGdldFBvcnRyYWl0VVJMOiAoKSA9PiBnZXRQb3J0cmFpdFVSTFxufSk7XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJQdWJsaWNEYXRhKGlkKSB7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtpZH0vYCk7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJBZmZpbGlhdGlvbnMoaWRzKSB7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvYWZmaWxpYXRpb24vYCwgdm9pZCAwLCB7XG5cdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRib2R5OiBKU09OLnN0cmluZ2lmeShpZHMpXG5cdH0pWzBdO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyUG9ydHJhaXRzKGlkKSB7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtpZH0vcG9ydHJhaXQvYCk7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJDb3Jwb3JhdGlvbkhpc3RvcnkoaWQpIHtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2lkfS9jb3Jwb3JhdGlvbmhpc3RvcnkvYCk7XG59XG5mdW5jdGlvbiBnZXRQb3J0cmFpdFVSTChpZCkge1xuXHRyZXR1cm4gYGh0dHBzOi8vaW1hZ2VzLmV2ZXRlY2gubmV0L2NoYXJhY3RlcnMvJHtpZH0vcG9ydHJhaXRgO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyUm9sZXMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX2NvcnBvcmF0aW9uX3JvbGVzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vcm9sZXMvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlclRpdGxlcyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfdGl0bGVzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vdGl0bGVzL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJTdGFuZGluZ3MoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX3N0YW5kaW5ncy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3N0YW5kaW5ncy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyTm90aWZpY2F0aW9ucyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfbm90aWZpY2F0aW9ucy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L25vdGlmaWNhdGlvbnMvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckNvbnRhY3ROb3RpZmljYXRpb25zKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9ub3RpZmljYXRpb25zLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vbm90aWZpY2F0aW9ucy9jb250YWN0c2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJNZWRhbHMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX21lZGFscy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L21lZGFscy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVySnVtcEZhdGlndWUoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX2ZhdGlndWUudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9mYXRpZ3VlL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJCbHVlcHJpbnRzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9ibHVlcHJpbnRzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vYmx1ZXByaW50cy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQWdlbnRSZXNlYXJjaChjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfYWdlbnRzX3Jlc2VhcmNoLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vYWdlbnRzX3Jlc2VhcmNoL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJDbG9uZXMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2xvbmVzLnJlYWRfY2xvbmVzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vY2xvbmVzL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJJbXBsYW50cyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1jbG9uZXMucmVhZF9pbXBsYW50cy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2ltcGxhbnRzL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJBc3NldHMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktYXNzZXRzLnJlYWRfYXNzZXRzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vYXNzZXRzL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJBc3NldExvY2F0aW9ucyhjaGFyYWN0ZXIsIGlkcykge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWFzc2V0cy5yZWFkX2Fzc2V0cy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2Fzc2V0cy9sb2NhdGlvbnMvYCwgY2hhcmFjdGVyLCB7XG5cdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRib2R5OiBKU09OLnN0cmluZ2lmeShpZHMpXG5cdH0pO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQXNzZXROYW1lcyhjaGFyYWN0ZXIsIGlkcykge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWFzc2V0cy5yZWFkX2Fzc2V0cy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2Fzc2V0cy9uYW1lcy9gLCBjaGFyYWN0ZXIsIHtcblx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KGlkcylcblx0fSk7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJXYWxsZXQoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktd2FsbGV0LnJlYWRfY2hhcmFjdGVyX3dhbGxldC52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3dhbGxldC9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyV2FsbGV0VHJhbnNhY3Rpb25zKGNoYXJhY3RlciwgZnJvbUlkKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktd2FsbGV0LnJlYWRfY2hhcmFjdGVyX3dhbGxldC52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3dhbGxldC90cmFuc2FjdGlvbnMvYCwgY2hhcmFjdGVyLCB7XG5cdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRib2R5OiBKU09OLnN0cmluZ2lmeShmcm9tSWQpXG5cdH0pO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyV2FsbGV0Sm91cm5hbChjaGFyYWN0ZXIsIHBhZ2UgPSAxKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktd2FsbGV0LnJlYWRfY2hhcmFjdGVyX3dhbGxldC52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3dhbGxldC9qb3VybmFsLz9wYWdlPSR7cGFnZX1gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyTG9jYXRpb24oY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktbG9jYXRpb24ucmVhZF9sb2NhdGlvbi52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2xvY2F0aW9uL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJPbmxpbmUoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktbG9jYXRpb24ucmVhZF9vbmxpbmUudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9vbmxpbmUvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckN1cnJlbnRTaGlwKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWxvY2F0aW9uLnJlYWRfc2hpcF90eXBlLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vc2hpcC9gLCBjaGFyYWN0ZXIpO1xufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGNoYXJhY3Rlcl9leHBvcnRzLCBnZXRDaGFyYWN0ZXJBZmZpbGlhdGlvbnMsIGdldENoYXJhY3RlckFnZW50UmVzZWFyY2gsIGdldENoYXJhY3RlckFzc2V0TG9jYXRpb25zLCBnZXRDaGFyYWN0ZXJBc3NldE5hbWVzLCBnZXRDaGFyYWN0ZXJBc3NldHMsIGdldENoYXJhY3RlckJsdWVwcmludHMsIGdldENoYXJhY3RlckNsb25lcywgZ2V0Q2hhcmFjdGVyQ29udGFjdE5vdGlmaWNhdGlvbnMsIGdldENoYXJhY3RlckNvcnBvcmF0aW9uSGlzdG9yeSwgZ2V0Q2hhcmFjdGVyQ3VycmVudFNoaXAsIGdldENoYXJhY3RlckltcGxhbnRzLCBnZXRDaGFyYWN0ZXJKdW1wRmF0aWd1ZSwgZ2V0Q2hhcmFjdGVyTG9jYXRpb24sIGdldENoYXJhY3Rlck1lZGFscywgZ2V0Q2hhcmFjdGVyTm90aWZpY2F0aW9ucywgZ2V0Q2hhcmFjdGVyT25saW5lLCBnZXRDaGFyYWN0ZXJQb3J0cmFpdHMsIGdldENoYXJhY3RlclB1YmxpY0RhdGEsIGdldENoYXJhY3RlclJvbGVzLCBnZXRDaGFyYWN0ZXJTdGFuZGluZ3MsIGdldENoYXJhY3RlclRpdGxlcywgZ2V0Q2hhcmFjdGVyV2FsbGV0LCBnZXRDaGFyYWN0ZXJXYWxsZXRKb3VybmFsLCBnZXRDaGFyYWN0ZXJXYWxsZXRUcmFuc2FjdGlvbnMsIGdldFBvcnRyYWl0VVJMIH07IiwKICAgICJpbXBvcnQgeyBfX2V4cG9ydCB9IGZyb20gXCIuLi9fdmlydHVhbC9yb2xsZG93bl9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIgfSBmcm9tIFwiLi4vZGIvbW9kZWxzL2NoYXJhY3Rlci5tb2RlbC5qc1wiO1xuaW1wb3J0IFwiLi4vZGIvaW5kZXguanNcIjtcbmltcG9ydCB7IGVzaUZldGNoIH0gZnJvbSBcIi4vZmV0Y2guanNcIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvY29ycG9yYXRpb24udHNcbnZhciBjb3Jwb3JhdGlvbl9leHBvcnRzID0ge307XG5fX2V4cG9ydChjb3Jwb3JhdGlvbl9leHBvcnRzLCB7XG5cdGdldENvcnBvcmF0aW9uQWxsaWFuY2VIaXN0b3J5OiAoKSA9PiBnZXRDb3Jwb3JhdGlvbkFsbGlhbmNlSGlzdG9yeSxcblx0Z2V0Q29ycG9yYXRpb25Bc3NldExvY2F0aW9uczogKCkgPT4gZ2V0Q29ycG9yYXRpb25Bc3NldExvY2F0aW9ucyxcblx0Z2V0Q29ycG9yYXRpb25Bc3NldE5hbWVzOiAoKSA9PiBnZXRDb3Jwb3JhdGlvbkFzc2V0TmFtZXMsXG5cdGdldENvcnBvcmF0aW9uQXNzZXRzOiAoKSA9PiBnZXRDb3Jwb3JhdGlvbkFzc2V0cyxcblx0Z2V0Q29ycG9yYXRpb25EYXRhOiAoKSA9PiBnZXRDb3Jwb3JhdGlvbkRhdGEsXG5cdGdldENvcnBvcmF0aW9uSWNvbnM6ICgpID0+IGdldENvcnBvcmF0aW9uSWNvbnNcbn0pO1xuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ycG9yYXRpb25EYXRhKGlkKSB7XG5cdHJldHVybiBhd2FpdCBlc2lGZXRjaChgL2NvcnBvcmF0aW9ucy8ke2lkfS9gKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldENvcnBvcmF0aW9uQWxsaWFuY2VIaXN0b3J5KGlkKSB7XG5cdHJldHVybiBhd2FpdCBlc2lGZXRjaChgL2NvcnBvcmF0aW9ucy8ke2lkfS9hbGxpYW5jZWhpc3RvcnkvYCk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRDb3Jwb3JhdGlvbkljb25zKGlkKSB7XG5cdHJldHVybiBhd2FpdCBlc2lGZXRjaChgL2NvcnBvcmF0aW9ucy8ke2lkfS9pY29ucy9gKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldENvcnBvcmF0aW9uQXNzZXRzKGlkLCBjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1hc3NldHMucmVhZF9jb3Jwb3JhdGlvbl9hc3NldHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vYXNzZXRzL2AsIGNoYXJhY3Rlcik7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRDb3Jwb3JhdGlvbkFzc2V0TG9jYXRpb25zKGlkLCBjaGFyYWN0ZXIsIGlkcykge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWFzc2V0cy5yZWFkX2NvcnBvcmF0aW9uX2Fzc2V0cy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBhd2FpdCBlc2lGZXRjaChgL2NvcnBvcmF0aW9ucy8ke2lkfS9hc3NldHMvbG9jYXRpb25zL2AsIGNoYXJhY3Rlciwge1xuXHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoaWRzKVxuXHR9KTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldENvcnBvcmF0aW9uQXNzZXROYW1lcyhpZCwgY2hhcmFjdGVyLCBpZHMpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1hc3NldHMucmVhZF9jb3Jwb3JhdGlvbl9hc3NldHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vYXNzZXRzL25hbWVzL2AsIGNoYXJhY3Rlciwge1xuXHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoaWRzKVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBjb3Jwb3JhdGlvbl9leHBvcnRzIH07IiwKICAgICJpbXBvcnQgeyBfX2V4cG9ydCB9IGZyb20gXCIuLi9fdmlydHVhbC9yb2xsZG93bl9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBlc2lGZXRjaCB9IGZyb20gXCIuL2ZldGNoLmpzXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZXNpL2FsbGlhbmNlLnRzXG52YXIgYWxsaWFuY2VfZXhwb3J0cyA9IHt9O1xuX19leHBvcnQoYWxsaWFuY2VfZXhwb3J0cywge1xuXHRnZXRBbGxpYW5jZUNvcnBvcmF0aW9uczogKCkgPT4gZ2V0QWxsaWFuY2VDb3Jwb3JhdGlvbnMsXG5cdGdldEFsbGlhbmNlRGF0YTogKCkgPT4gZ2V0QWxsaWFuY2VEYXRhLFxuXHRnZXRBbGxpYW5jZUljb25zOiAoKSA9PiBnZXRBbGxpYW5jZUljb25zXG59KTtcbmFzeW5jIGZ1bmN0aW9uIGdldEFsbGlhbmNlRGF0YShpZCkge1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9hbGxpYW5jZXMvJHtpZH0vYCk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRBbGxpYW5jZUNvcnBvcmF0aW9ucyhpZCkge1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9hbGxpYW5jZXMvJHtpZH0vY29ycG9yYXRpb25zL2ApO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsaWFuY2VJY29ucyhpZCkge1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9hbGxpYW5jZXMvJHtpZH0vaWNvbnMvYCk7XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgYWxsaWFuY2VfZXhwb3J0cywgZ2V0QWxsaWFuY2VDb3Jwb3JhdGlvbnMsIGdldEFsbGlhbmNlRGF0YSwgZ2V0QWxsaWFuY2VJY29ucyB9OyIsCiAgICAiaW1wb3J0IHsgQ2hhcmFjdGVySGVscGVyIH0gZnJvbSBcIi4uL2RiL21vZGVscy9jaGFyYWN0ZXIubW9kZWwuanNcIjtcbmltcG9ydCBcIi4uL2RiL21vZGVscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZXNpRmV0Y2ggfSBmcm9tIFwiLi9mZXRjaC5qc1wiO1xuXG4vLyNyZWdpb24gc3JjL2VzaS9za2lsbHMudHNcbmZ1bmN0aW9uIGdldENoYXJhY3RlckF0dHJpYnV0ZXMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktc2tpbGxzLnJlYWRfc2tpbGxzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vYXR0cmlidXRlc2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJTa2lsbFF1ZXVlKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXNraWxscy5yZWFkX3NraWxscXVldWUudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9za2lsbHF1ZXVlYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlclNraWxscyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1za2lsbHMucmVhZF9za2lsbHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9za2lsbHNgLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gY2FsY3VsYXRlVHJhaW5pbmdQZXJjZW50YWdlKHF1ZXVlZFNraWxsKSB7XG5cdGNvbnN0IHRyYWluaW5nU3RhcnRQb3NpdGlvbiA9IChxdWV1ZWRTa2lsbC50cmFpbmluZ19zdGFydF9zcCAtIHF1ZXVlZFNraWxsLmxldmVsX3N0YXJ0X3NwKSAvIHF1ZXVlZFNraWxsLmxldmVsX2VuZF9zcDtcblx0Y29uc3QgdGltZVBvc2l0aW9uID0gKCgvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSkuZ2V0VGltZSgpIC0gbmV3IERhdGUocXVldWVkU2tpbGwuc3RhcnRfZGF0ZSkuZ2V0VGltZSgpKSAvIChuZXcgRGF0ZShxdWV1ZWRTa2lsbC5maW5pc2hfZGF0ZSkuZ2V0VGltZSgpIC0gbmV3IERhdGUocXVldWVkU2tpbGwuc3RhcnRfZGF0ZSkuZ2V0VGltZSgpKTtcblx0cmV0dXJuIHRyYWluaW5nU3RhcnRQb3NpdGlvbiArICgxIC0gdHJhaW5pbmdTdGFydFBvc2l0aW9uKSAqIHRpbWVQb3NpdGlvbjtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBjYWxjdWxhdGVUcmFpbmluZ1BlcmNlbnRhZ2UsIGdldENoYXJhY3RlckF0dHJpYnV0ZXMsIGdldENoYXJhY3RlclNraWxsUXVldWUsIGdldENoYXJhY3RlclNraWxscyB9OyIsCiAgICAiaW1wb3J0IHR5cGUgeyBFVkVBdXRoIH0gZnJvbSAnQC9taWRkbGV3YXJlJztcbmltcG9ydCB7IHNldENvb2tpZSB9IGZyb20gJ0AvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gJ2JyaXNhJztcbmltcG9ydCB7IGpvaW5TY29wZXMsIFNDT1BFUyB9IGZyb20gJ0BzdGFyLWtpdHRlbi9ldmUvZXNpJztcblxuY29uc3QgYWxsU2NvcGVzID0gT2JqZWN0LnZhbHVlcyhTQ09QRVMpLmZpbHRlcigodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIGFzIHN0cmluZ1tdO1xuY29uc3QgYWxsU2NvcGVzU3RyaW5nID0gYWxsU2NvcGVzLmpvaW4oJyAnKTtcblxuY29uc3QgbW9kdWxlX1Njb3BlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgJ0Z1bGwgRVNJJzogYWxsU2NvcGVzU3RyaW5nLFxuICAnUHVibGljJzogam9pblNjb3BlcyhTQ09QRVMuUFVCTElDX0RBVEEpLFxuICAnQ2hhcmFjdGVycyc6IGpvaW5TY29wZXMoU0NPUEVTLlBVQkxJQ19EQVRBKSxcbiAgJ01haWwnOiBqb2luU2NvcGVzKFNDT1BFUy5NQUlMX1JFQURfTUFJTCwgU0NPUEVTLk1BSUxfU0VORF9NQUlMLCBTQ09QRVMuTUFJTF9PUkdBTklaRV9NQUlMKSxcbiAgJ1NraWxscyc6IGpvaW5TY29wZXMoU0NPUEVTLlNLSUxMU19SRUFEX1NLSUxMUVVFVUUsIFNDT1BFUy5TS0lMTFNfUkVBRF9TS0lMTFMpLFxufVxuXG4vLyBHRVQgL2FwaS9hdXRoL2Rpc2NvcmRJRC86ZGlzY29yZElEL2NoYXJhY3RlcklELzpjaGFyYWN0ZXJJRC9tb2R1bGVzLzptb2R1bGVzXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gR0VUKHsgc3RvcmUsIHJvdXRlOiB7IHBhcmFtcyB9IH06IFJlcXVlc3RDb250ZXh0KSB7XG4gIC8vIHdlIG5lZWQgdG8gY2hlY2sgdGhlIG1vZHVsZXMgdGhhdCB3ZXJlIHNlbnQsIGluIG9yZGVyIHRvIGdldCB0aGUgY29ycmVjdCBzY29wZXNcbiAgLy8gdGhhdCBlYWNoIG1vZHVsZSByZXF1aXJlcy5cbiAgbGV0IG1vZHVsZXMgPSAocGFyYW1zIVsnbW9kdWxlcyddIGFzIHN0cmluZykuc3BsaXQoJyAnKTtcbiAgbGV0IHNjb3BlcyA9IGpvaW5TY29wZXMoLi4ubW9kdWxlcy5tYXAoKG1vZHVsZSkgPT4gbW9kdWxlX1Njb3Blc1ttb2R1bGVdKSk7XG5cbiAgY29uc3QgZXZlYXV0aDogRVZFQXV0aCA9IHN0b3JlLmdldCgnZXZlYXV0aCcpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGV2ZWF1dGgucmVkaXJlY3Qoc2NvcGVzKTtcbiAgc2V0Q29va2llKHJlc3BvbnNlLCAnZGlzY29yZElEJywgcGFyYW1zIVsnZGlzY29yZElEJ10gYXMgc3RyaW5nLCA2MCAqIDEwIC8qIDEwIG1pbiAqLyk7XG4gIHNldENvb2tpZShyZXNwb25zZSwgJ2NoYXJhY3RlcklEJywgcGFyYW1zIVsnY2hhcmFjdGVySUQnXSBhcyBzdHJpbmcsIDYwICogMTAgLyogMTAgbWluICovKTtcbiAgcmV0dXJuIHJlc3BvbnNlO1xufSIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBRUEsSUFBSTtBQUFBLEVBQ0osSUFBSSxVQUFTLE9BQU87QUFBQSxFQUdwQixTQUFTLFNBQVUsQ0FBQyxLQUFLLEtBQUs7QUFBQSxJQUM1QixTQUFTLE9BQU8sS0FBSztBQUFBLE1BQ25CLElBQUksT0FBTyxJQUFJO0FBQUEsSUFDakI7QUFBQTtBQUFBLEVBRUYsSUFBSSxRQUFPLFFBQVEsUUFBTyxTQUFTLFFBQU8sZUFBZSxRQUFPLGlCQUFpQjtBQUFBLElBQy9FLE9BQU8sVUFBVTtBQUFBLEVBQ25CLEVBQU87QUFBQSxJQUVMLFVBQVUsUUFBUSxPQUFPO0FBQUEsSUFDekIsUUFBUSxTQUFT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O0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsSUFFQSxJQUFJLGFBQWE7QUFBQSxNQUNmO0FBQUEsTUFBRztBQUFBLE1BQ0g7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUc7QUFBQSxNQUN2QjtBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQ2xCO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFDbEI7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUNsQjtBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLElBQ3BCO0FBQUEsSUFFQSxJQUFJLGFBQWE7QUFBQSxNQUNmO0FBQUEsTUFBRztBQUFBLE1BQ0g7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUM1RDtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBUztBQUFBLE1BQzNEO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFTO0FBQUEsTUFDM0Q7QUFBQSxNQUFTO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUN6RDtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLElBQzlEO0FBQUEsSUFFQSxHQUFHLFVBQVUsV0FBVyxTQUFTLFFBQVMsQ0FBQyxNQUFNLFNBQVM7QUFBQSxNQUN4RCxPQUFPLFFBQVE7QUFBQSxNQUNmLFVBQVUsVUFBVSxLQUFLO0FBQUEsTUFFekIsSUFBSTtBQUFBLE1BQ0osSUFBSSxTQUFTLE1BQU0sU0FBUyxPQUFPO0FBQUEsUUFDakMsTUFBTTtBQUFBLFFBQ04sSUFBSSxNQUFNO0FBQUEsUUFDVixJQUFJLFFBQVE7QUFBQSxRQUNaLFNBQVMsSUFBSSxFQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFBQSxVQUNwQyxJQUFJLElBQUksS0FBSyxNQUFNO0FBQUEsVUFDbkIsSUFBSSxTQUFVLEtBQUssTUFBTyxTQUFTLFVBQVUsU0FBUyxFQUFFO0FBQUEsVUFDeEQsUUFBUyxNQUFPLEtBQUssTUFBUTtBQUFBLFVBQzdCLE9BQU87QUFBQSxVQUNQLElBQUksT0FBTyxJQUFJO0FBQUEsWUFDYixPQUFPO0FBQUEsWUFDUDtBQUFBLFVBQ0Y7QUFBQSxVQUNBLElBQUksVUFBVSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUc7QUFBQSxZQUN4QyxNQUFNLE1BQU0sSUFBSSxLQUFLLFVBQVUsT0FBTztBQUFBLFVBQ3hDLEVBQU87QUFBQSxZQUNMLE1BQU0sT0FBTztBQUFBO0FBQUEsUUFFakI7QUFBQSxRQUNBLElBQUksVUFBVSxHQUFHO0FBQUEsVUFDZixNQUFNLE1BQU0sU0FBUyxFQUFFLElBQUk7QUFBQSxRQUM3QjtBQUFBLFFBQ0EsT0FBTyxJQUFJLFNBQVMsWUFBWSxHQUFHO0FBQUEsVUFDakMsTUFBTSxNQUFNO0FBQUEsUUFDZDtBQUFBLFFBQ0EsSUFBSSxLQUFLLGFBQWEsR0FBRztBQUFBLFVBQ3ZCLE1BQU0sTUFBTTtBQUFBLFFBQ2Q7QUFBQSxRQUNBLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFFQSxJQUFJLFVBQVUsT0FBTyxNQUFNLFFBQVEsS0FBSyxRQUFRLElBQUk7QUFBQSxRQUVsRCxJQUFJLFlBQVksV0FBVztBQUFBLFFBRTNCLElBQUksWUFBWSxXQUFXO0FBQUEsUUFDM0IsTUFBTTtBQUFBLFFBQ04sSUFBSSxJQUFJLEtBQUssTUFBTTtBQUFBLFFBQ25CLEVBQUUsV0FBVztBQUFBLFFBQ2IsUUFBUSxFQUFFLE9BQU8sR0FBRztBQUFBLFVBQ2xCLElBQUksSUFBSSxFQUFFLEtBQUssU0FBUyxFQUFFLFNBQVMsSUFBSTtBQUFBLFVBQ3ZDLElBQUksRUFBRSxNQUFNLFNBQVM7QUFBQSxVQUVyQixLQUFLLEVBQUUsT0FBTyxHQUFHO0FBQUEsWUFDZixNQUFNLE1BQU0sWUFBWSxFQUFFLFVBQVUsSUFBSTtBQUFBLFVBQzFDLEVBQU87QUFBQSxZQUNMLE1BQU0sSUFBSTtBQUFBO0FBQUEsUUFFZDtBQUFBLFFBQ0EsSUFBSSxLQUFLLE9BQU8sR0FBRztBQUFBLFVBQ2pCLE1BQU0sTUFBTTtBQUFBLFFBQ2Q7QUFBQSxRQUNBLE9BQU8sSUFBSSxTQUFTLFlBQVksR0FBRztBQUFBLFVBQ2pDLE1BQU0sTUFBTTtBQUFBLFFBQ2Q7QUFBQSxRQUNBLElBQUksS0FBSyxhQUFhLEdBQUc7QUFBQSxVQUN2QixNQUFNLE1BQU07QUFBQSxRQUNkO0FBQUEsUUFDQSxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BRUEsT0FBTyxPQUFPLGlDQUFpQztBQUFBO0FBQUEsSUFHakQsR0FBRyxVQUFVLFdBQVcsU0FBUyxRQUFTLEdBQUc7QUFBQSxNQUMzQyxJQUFJLE1BQU0sS0FBSyxNQUFNO0FBQUEsTUFDckIsSUFBSSxLQUFLLFdBQVcsR0FBRztBQUFBLFFBQ3JCLE9BQU8sS0FBSyxNQUFNLEtBQUs7QUFBQSxNQUN6QixFQUFPLFNBQUksS0FBSyxXQUFXLEtBQUssS0FBSyxNQUFNLE9BQU8sR0FBTTtBQUFBLFFBRXRELE9BQU8sbUJBQW9CLEtBQUssTUFBTSxLQUFLO0FBQUEsTUFDN0MsRUFBTyxTQUFJLEtBQUssU0FBUyxHQUFHO0FBQUEsUUFDMUIsT0FBTyxPQUFPLDRDQUE0QztBQUFBLE1BQzVEO0FBQUEsTUFDQSxPQUFRLEtBQUssYUFBYSxLQUFNLE1BQU07QUFBQTtBQUFBLElBR3hDLEdBQUcsVUFBVSxTQUFTLFNBQVMsTUFBTyxHQUFHO0FBQUEsTUFDdkMsT0FBTyxLQUFLLFNBQVMsRUFBRTtBQUFBO0FBQUEsSUFHekIsR0FBRyxVQUFVLFdBQVcsU0FBUyxRQUFTLENBQUMsUUFBUSxRQUFRO0FBQUEsTUFDekQsT0FBTyxPQUFPLFlBQVcsV0FBVztBQUFBLE1BQ3BDLE9BQU8sS0FBSyxZQUFZLFNBQVEsUUFBUSxNQUFNO0FBQUE7QUFBQSxJQUdoRCxHQUFHLFVBQVUsVUFBVSxTQUFTLE9BQVEsQ0FBQyxRQUFRLFFBQVE7QUFBQSxNQUN2RCxPQUFPLEtBQUssWUFBWSxPQUFPLFFBQVEsTUFBTTtBQUFBO0FBQUEsSUFHL0MsR0FBRyxVQUFVLGNBQWMsU0FBUyxXQUFZLENBQUMsV0FBVyxRQUFRLFFBQVE7QUFBQSxNQUMxRSxJQUFJLGFBQWEsS0FBSyxXQUFXO0FBQUEsTUFDakMsSUFBSSxZQUFZLFVBQVUsS0FBSyxJQUFJLEdBQUcsVUFBVTtBQUFBLE1BQ2hELE9BQU8sY0FBYyxXQUFXLHVDQUF1QztBQUFBLE1BQ3ZFLE9BQU8sWUFBWSxHQUFHLDZCQUE2QjtBQUFBLE1BRW5ELEtBQUssTUFBTTtBQUFBLE1BQ1gsSUFBSSxlQUFlLFdBQVc7QUFBQSxNQUM5QixJQUFJLE1BQU0sSUFBSSxVQUFVLFNBQVM7QUFBQSxNQUVqQyxJQUFJLEdBQUc7QUFBQSxNQUNQLElBQUksSUFBSSxLQUFLLE1BQU07QUFBQSxNQUNuQixLQUFLLGNBQWM7QUFBQSxRQUVqQixLQUFLLElBQUksRUFBRyxJQUFJLFlBQVksWUFBWSxLQUFLO0FBQUEsVUFDM0MsSUFBSSxLQUFLO0FBQUEsUUFDWDtBQUFBLFFBRUEsS0FBSyxJQUFJLEdBQUksRUFBRSxPQUFPLEdBQUcsS0FBSztBQUFBLFVBQzVCLElBQUksRUFBRSxNQUFNLEdBQUk7QUFBQSxVQUNoQixFQUFFLE9BQU8sQ0FBQztBQUFBLFVBRVYsSUFBSSxZQUFZLElBQUksS0FBSztBQUFBLFFBQzNCO0FBQUEsTUFDRixFQUFPO0FBQUEsUUFDTCxLQUFLLElBQUksR0FBSSxFQUFFLE9BQU8sR0FBRyxLQUFLO0FBQUEsVUFDNUIsSUFBSSxFQUFFLE1BQU0sR0FBSTtBQUFBLFVBQ2hCLEVBQUUsT0FBTyxDQUFDO0FBQUEsVUFFVixJQUFJLEtBQUs7QUFBQSxRQUNYO0FBQUEsUUFFQSxNQUFPLElBQUksV0FBVyxLQUFLO0FBQUEsVUFDekIsSUFBSSxLQUFLO0FBQUEsUUFDWDtBQUFBO0FBQUEsTUFHRixPQUFPO0FBQUE7QUFBQSxJQUdULElBQUksS0FBSyxPQUFPO0FBQUEsTUFDZCxHQUFHLFVBQVUsYUFBYSxTQUFTLFVBQVcsQ0FBQyxHQUFHO0FBQUEsUUFDaEQsT0FBTyxLQUFLLEtBQUssTUFBTSxDQUFDO0FBQUE7QUFBQSxJQUU1QixFQUFPO0FBQUEsTUFDTCxHQUFHLFVBQVUsYUFBYSxTQUFTLFVBQVcsQ0FBQyxHQUFHO0FBQUEsUUFDaEQsSUFBSSxJQUFJO0FBQUEsUUFDUixJQUFJLElBQUk7QUFBQSxRQUNSLElBQUksS0FBSyxNQUFRO0FBQUEsVUFDZixLQUFLO0FBQUEsVUFDTCxPQUFPO0FBQUEsUUFDVDtBQUFBLFFBQ0EsSUFBSSxLQUFLLElBQU07QUFBQSxVQUNiLEtBQUs7QUFBQSxVQUNMLE9BQU87QUFBQSxRQUNUO0FBQUEsUUFDQSxJQUFJLEtBQUssR0FBSztBQUFBLFVBQ1osS0FBSztBQUFBLFVBQ0wsT0FBTztBQUFBLFFBQ1Q7QUFBQSxRQUNBLElBQUksS0FBSyxHQUFNO0FBQUEsVUFDYixLQUFLO0FBQUEsVUFDTCxPQUFPO0FBQUEsUUFDVDtBQUFBLFFBQ0EsT0FBTyxJQUFJO0FBQUE7QUFBQTtBQUFBLElBSWYsR0FBRyxVQUFVLFlBQVksU0FBUyxTQUFVLENBQUMsR0FBRztBQUFBLE1BRTlDLElBQUksTUFBTTtBQUFBLFFBQUcsT0FBTztBQUFBLE1BRXBCLElBQUksSUFBSTtBQUFBLE1BQ1IsSUFBSSxJQUFJO0FBQUEsTUFDUixLQUFLLElBQUksVUFBWSxHQUFHO0FBQUEsUUFDdEIsS0FBSztBQUFBLFFBQ0wsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUNBLEtBQUssSUFBSSxTQUFVLEdBQUc7QUFBQSxRQUNwQixLQUFLO0FBQUEsUUFDTCxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BQ0EsS0FBSyxJQUFJLFFBQVMsR0FBRztBQUFBLFFBQ25CLEtBQUs7QUFBQSxRQUNMLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFDQSxLQUFLLElBQUksT0FBUyxHQUFHO0FBQUEsUUFDbkIsS0FBSztBQUFBLFFBQ0wsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUNBLEtBQUssSUFBSSxPQUFTLEdBQUc7QUFBQSxRQUNuQjtBQUFBLE1BQ0Y7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLElBSVQsR0FBRyxVQUFVLFlBQVksU0FBUyxTQUFVLEdBQUc7QUFBQSxNQUM3QyxJQUFJLElBQUksS0FBSyxNQUFNLEtBQUssU0FBUztBQUFBLE1BQ2pDLElBQUksS0FBSyxLQUFLLFdBQVcsQ0FBQztBQUFBLE1BQzFCLFFBQVEsS0FBSyxTQUFTLEtBQUssS0FBSztBQUFBO0FBQUEsSUFHbEMsU0FBUyxVQUFXLENBQUMsS0FBSztBQUFBLE1BQ3hCLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxVQUFVLENBQUM7QUFBQSxNQUVqQyxTQUFTLE1BQU0sRUFBRyxNQUFNLEVBQUUsUUFBUSxPQUFPO0FBQUEsUUFDdkMsSUFBSSxNQUFPLE1BQU0sS0FBTTtBQUFBLFFBQ3ZCLElBQUksT0FBTyxNQUFNO0FBQUEsUUFFakIsRUFBRSxRQUFRLElBQUksTUFBTSxPQUFRLEtBQUssVUFBVztBQUFBLE1BQzlDO0FBQUEsTUFFQSxPQUFPO0FBQUE7QUFBQSxJQUlULEdBQUcsVUFBVSxXQUFXLFNBQVMsUUFBUyxHQUFHO0FBQUEsTUFDM0MsSUFBSSxLQUFLLE9BQU87QUFBQSxRQUFHLE9BQU87QUFBQSxNQUUxQixJQUFJLElBQUk7QUFBQSxNQUNSLFNBQVMsSUFBSSxFQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFBQSxRQUNwQyxJQUFJLElBQUksS0FBSyxVQUFVLEtBQUssTUFBTSxFQUFFO0FBQUEsUUFDcEMsS0FBSztBQUFBLFFBQ0wsSUFBSSxNQUFNO0FBQUEsVUFBSTtBQUFBLE1BQ2hCO0FBQUEsTUFDQSxPQUFPO0FBQUE7QUFBQSxJQUdULEdBQUcsVUFBVSxhQUFhLFNBQVMsVUFBVyxHQUFHO0FBQUEsTUFDL0MsT0FBTyxLQUFLLEtBQUssS0FBSyxVQUFVLElBQUksQ0FBQztBQUFBO0FBQUEsSUFHdkMsR0FBRyxVQUFVLFNBQVMsU0FBUyxNQUFPLENBQUMsT0FBTztBQUFBLE1BQzVDLElBQUksS0FBSyxhQUFhLEdBQUc7QUFBQSxRQUN2QixPQUFPLEtBQUssSUFBSSxFQUFFLE1BQU0sS0FBSyxFQUFFLE1BQU0sQ0FBQztBQUFBLE1BQ3hDO0FBQUEsTUFDQSxPQUFPLEtBQUssTUFBTTtBQUFBO0FBQUEsSUFHcEIsR0FBRyxVQUFVLFdBQVcsU0FBUyxRQUFTLENBQUMsT0FBTztBQUFBLE1BQ2hELElBQUksS0FBSyxNQUFNLFFBQVEsQ0FBQyxHQUFHO0FBQUEsUUFDekIsT0FBTyxLQUFLLEtBQUssS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEtBQUs7QUFBQSxNQUN4QztBQUFBLE1BQ0EsT0FBTyxLQUFLLE1BQU07QUFBQTtBQUFBLElBR3BCLEdBQUcsVUFBVSxRQUFRLFNBQVMsS0FBTSxHQUFHO0FBQUEsTUFDckMsT0FBTyxLQUFLLGFBQWE7QUFBQTtBQUFBLElBSTNCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxHQUFHO0FBQUEsTUFDakMsT0FBTyxLQUFLLE1BQU0sRUFBRSxLQUFLO0FBQUE7QUFBQSxJQUczQixHQUFHLFVBQVUsT0FBTyxTQUFTLElBQUssR0FBRztBQUFBLE1BQ25DLEtBQUssS0FBSyxPQUFPLEdBQUc7QUFBQSxRQUNsQixLQUFLLFlBQVk7QUFBQSxNQUNuQjtBQUFBLE1BRUEsT0FBTztBQUFBO0FBQUEsSUFJVCxHQUFHLFVBQVUsT0FBTyxTQUFTLElBQUssQ0FBQyxLQUFLO0FBQUEsTUFDdEMsT0FBTyxLQUFLLFNBQVMsSUFBSSxRQUFRO0FBQUEsUUFDL0IsS0FBSyxNQUFNLEtBQUssWUFBWTtBQUFBLE1BQzlCO0FBQUEsTUFFQSxTQUFTLElBQUksRUFBRyxJQUFJLElBQUksUUFBUSxLQUFLO0FBQUEsUUFDbkMsS0FBSyxNQUFNLEtBQUssS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNO0FBQUEsTUFDNUM7QUFBQSxNQUVBLE9BQU8sS0FBSyxNQUFNO0FBQUE7QUFBQSxJQUdwQixHQUFHLFVBQVUsTUFBTSxTQUFTLEdBQUksQ0FBQyxLQUFLO0FBQUEsTUFDcEMsUUFBUSxLQUFLLFdBQVcsSUFBSSxjQUFjLENBQUM7QUFBQSxNQUMzQyxPQUFPLEtBQUssS0FBSyxHQUFHO0FBQUE7QUFBQSxJQUl0QixHQUFHLFVBQVUsS0FBSyxTQUFTLEVBQUcsQ0FBQyxLQUFLO0FBQUEsTUFDbEMsSUFBSSxLQUFLLFNBQVMsSUFBSTtBQUFBLFFBQVEsT0FBTyxLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUc7QUFBQSxNQUN6RCxPQUFPLElBQUksTUFBTSxFQUFFLElBQUksSUFBSTtBQUFBO0FBQUEsSUFHN0IsR0FBRyxVQUFVLE1BQU0sU0FBUyxHQUFJLENBQUMsS0FBSztBQUFBLE1BQ3BDLElBQUksS0FBSyxTQUFTLElBQUk7QUFBQSxRQUFRLE9BQU8sS0FBSyxNQUFNLEVBQUUsS0FBSyxHQUFHO0FBQUEsTUFDMUQsT0FBTyxJQUFJLE1BQU0sRUFBRSxLQUFLLElBQUk7QUFBQTtBQUFBLElBSTlCLEdBQUcsVUFBVSxRQUFRLFNBQVMsS0FBTSxDQUFDLEtBQUs7QUFBQSxNQUV4QyxJQUFJO0FBQUEsTUFDSixJQUFJLEtBQUssU0FBUyxJQUFJLFFBQVE7QUFBQSxRQUM1QixJQUFJO0FBQUEsTUFDTixFQUFPO0FBQUEsUUFDTCxJQUFJO0FBQUE7QUFBQSxNQUdOLFNBQVMsSUFBSSxFQUFHLElBQUksRUFBRSxRQUFRLEtBQUs7QUFBQSxRQUNqQyxLQUFLLE1BQU0sS0FBSyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU07QUFBQSxNQUM1QztBQUFBLE1BRUEsS0FBSyxTQUFTLEVBQUU7QUFBQSxNQUVoQixPQUFPLEtBQUssTUFBTTtBQUFBO0FBQUEsSUFHcEIsR0FBRyxVQUFVLE9BQU8sU0FBUyxJQUFLLENBQUMsS0FBSztBQUFBLE1BQ3RDLFFBQVEsS0FBSyxXQUFXLElBQUksY0FBYyxDQUFDO0FBQUEsTUFDM0MsT0FBTyxLQUFLLE1BQU0sR0FBRztBQUFBO0FBQUEsSUFJdkIsR0FBRyxVQUFVLE1BQU0sU0FBUyxHQUFJLENBQUMsS0FBSztBQUFBLE1BQ3BDLElBQUksS0FBSyxTQUFTLElBQUk7QUFBQSxRQUFRLE9BQU8sS0FBSyxNQUFNLEVBQUUsS0FBSyxHQUFHO0FBQUEsTUFDMUQsT0FBTyxJQUFJLE1BQU0sRUFBRSxLQUFLLElBQUk7QUFBQTtBQUFBLElBRzlCLEdBQUcsVUFBVSxPQUFPLFNBQVMsSUFBSyxDQUFDLEtBQUs7QUFBQSxNQUN0QyxJQUFJLEtBQUssU0FBUyxJQUFJO0FBQUEsUUFBUSxPQUFPLEtBQUssTUFBTSxFQUFFLE1BQU0sR0FBRztBQUFBLE1BQzNELE9BQU8sSUFBSSxNQUFNLEVBQUUsTUFBTSxJQUFJO0FBQUE7QUFBQSxJQUkvQixHQUFHLFVBQVUsUUFBUSxTQUFTLEtBQU0sQ0FBQyxLQUFLO0FBQUEsTUFFeEMsSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSSxLQUFLLFNBQVMsSUFBSSxRQUFRO0FBQUEsUUFDNUIsSUFBSTtBQUFBLFFBQ0osSUFBSTtBQUFBLE1BQ04sRUFBTztBQUFBLFFBQ0wsSUFBSTtBQUFBLFFBQ0osSUFBSTtBQUFBO0FBQUEsTUFHTixTQUFTLElBQUksRUFBRyxJQUFJLEVBQUUsUUFBUSxLQUFLO0FBQUEsUUFDakMsS0FBSyxNQUFNLEtBQUssRUFBRSxNQUFNLEtBQUssRUFBRSxNQUFNO0FBQUEsTUFDdkM7QUFBQSxNQUVBLElBQUksU0FBUyxHQUFHO0FBQUEsUUFDZCxNQUFPLElBQUksRUFBRSxRQUFRLEtBQUs7QUFBQSxVQUN4QixLQUFLLE1BQU0sS0FBSyxFQUFFLE1BQU07QUFBQSxRQUMxQjtBQUFBLE1BQ0Y7QUFBQSxNQUVBLEtBQUssU0FBUyxFQUFFO0FBQUEsTUFFaEIsT0FBTyxLQUFLLE1BQU07QUFBQTtBQUFBLElBR3BCLEdBQUcsVUFBVSxPQUFPLFNBQVMsSUFBSyxDQUFDLEtBQUs7QUFBQSxNQUN0QyxRQUFRLEtBQUssV0FBVyxJQUFJLGNBQWMsQ0FBQztBQUFBLE1BQzNDLE9BQU8sS0FBSyxNQUFNLEdBQUc7QUFBQTtBQUFBLElBSXZCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxJQUFJLEtBQUssU0FBUyxJQUFJO0FBQUEsUUFBUSxPQUFPLEtBQUssTUFBTSxFQUFFLEtBQUssR0FBRztBQUFBLE1BQzFELE9BQU8sSUFBSSxNQUFNLEVBQUUsS0FBSyxJQUFJO0FBQUE7QUFBQSxJQUc5QixHQUFHLFVBQVUsT0FBTyxTQUFTLElBQUssQ0FBQyxLQUFLO0FBQUEsTUFDdEMsSUFBSSxLQUFLLFNBQVMsSUFBSTtBQUFBLFFBQVEsT0FBTyxLQUFLLE1BQU0sRUFBRSxNQUFNLEdBQUc7QUFBQSxNQUMzRCxPQUFPLElBQUksTUFBTSxFQUFFLE1BQU0sSUFBSTtBQUFBO0FBQUEsSUFJL0IsR0FBRyxVQUFVLFFBQVEsU0FBUyxLQUFNLENBQUMsT0FBTztBQUFBLE1BQzFDLE9BQU8sT0FBTyxVQUFVLFlBQVksU0FBUyxDQUFDO0FBQUEsTUFFOUMsSUFBSSxjQUFjLEtBQUssS0FBSyxRQUFRLEVBQUUsSUFBSTtBQUFBLE1BQzFDLElBQUksV0FBVyxRQUFRO0FBQUEsTUFHdkIsS0FBSyxRQUFRLFdBQVc7QUFBQSxNQUV4QixJQUFJLFdBQVcsR0FBRztBQUFBLFFBQ2hCO0FBQUEsTUFDRjtBQUFBLE1BR0EsU0FBUyxJQUFJLEVBQUcsSUFBSSxhQUFhLEtBQUs7QUFBQSxRQUNwQyxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sS0FBSztBQUFBLE1BQ25DO0FBQUEsTUFHQSxJQUFJLFdBQVcsR0FBRztBQUFBLFFBQ2hCLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxLQUFNLFlBQWMsS0FBSztBQUFBLE1BQ3ZEO0FBQUEsTUFHQSxPQUFPLEtBQUssTUFBTTtBQUFBO0FBQUEsSUFHcEIsR0FBRyxVQUFVLE9BQU8sU0FBUyxJQUFLLENBQUMsT0FBTztBQUFBLE1BQ3hDLE9BQU8sS0FBSyxNQUFNLEVBQUUsTUFBTSxLQUFLO0FBQUE7QUFBQSxJQUlqQyxHQUFHLFVBQVUsT0FBTyxTQUFTLElBQUssQ0FBQyxLQUFLLEtBQUs7QUFBQSxNQUMzQyxPQUFPLE9BQU8sUUFBUSxZQUFZLE9BQU8sQ0FBQztBQUFBLE1BRTFDLElBQUksTUFBTyxNQUFNLEtBQU07QUFBQSxNQUN2QixJQUFJLE9BQU8sTUFBTTtBQUFBLE1BRWpCLEtBQUssUUFBUSxNQUFNLENBQUM7QUFBQSxNQUVwQixJQUFJLEtBQUs7QUFBQSxRQUNQLEtBQUssTUFBTSxPQUFPLEtBQUssTUFBTSxPQUFRLEtBQUs7QUFBQSxNQUM1QyxFQUFPO0FBQUEsUUFDTCxLQUFLLE1BQU0sT0FBTyxLQUFLLE1BQU0sU0FBUyxLQUFLO0FBQUE7QUFBQSxNQUc3QyxPQUFPLEtBQUssTUFBTTtBQUFBO0FBQUEsSUFJcEIsR0FBRyxVQUFVLE9BQU8sU0FBUyxJQUFLLENBQUMsS0FBSztBQUFBLE1BQ3RDLElBQUk7QUFBQSxNQUdKLElBQUksS0FBSyxhQUFhLEtBQUssSUFBSSxhQUFhLEdBQUc7QUFBQSxRQUM3QyxLQUFLLFdBQVc7QUFBQSxRQUNoQixJQUFJLEtBQUssS0FBSyxHQUFHO0FBQUEsUUFDakIsS0FBSyxZQUFZO0FBQUEsUUFDakIsT0FBTyxLQUFLLFVBQVU7QUFBQSxNQUd4QixFQUFPLFNBQUksS0FBSyxhQUFhLEtBQUssSUFBSSxhQUFhLEdBQUc7QUFBQSxRQUNwRCxJQUFJLFdBQVc7QUFBQSxRQUNmLElBQUksS0FBSyxLQUFLLEdBQUc7QUFBQSxRQUNqQixJQUFJLFdBQVc7QUFBQSxRQUNmLE9BQU8sRUFBRSxVQUFVO0FBQUEsTUFDckI7QUFBQSxNQUdBLElBQUksR0FBRztBQUFBLE1BQ1AsSUFBSSxLQUFLLFNBQVMsSUFBSSxRQUFRO0FBQUEsUUFDNUIsSUFBSTtBQUFBLFFBQ0osSUFBSTtBQUFBLE1BQ04sRUFBTztBQUFBLFFBQ0wsSUFBSTtBQUFBLFFBQ0osSUFBSTtBQUFBO0FBQUEsTUFHTixJQUFJLFFBQVE7QUFBQSxNQUNaLFNBQVMsSUFBSSxFQUFHLElBQUksRUFBRSxRQUFRLEtBQUs7QUFBQSxRQUNqQyxLQUFLLEVBQUUsTUFBTSxLQUFLLE1BQU0sRUFBRSxNQUFNLEtBQUssS0FBSztBQUFBLFFBQzFDLEtBQUssTUFBTSxLQUFLLElBQUk7QUFBQSxRQUNwQixRQUFRLE1BQU07QUFBQSxNQUNoQjtBQUFBLE1BQ0EsTUFBTyxVQUFVLEtBQUssSUFBSSxFQUFFLFFBQVEsS0FBSztBQUFBLFFBQ3ZDLEtBQUssRUFBRSxNQUFNLEtBQUssS0FBSztBQUFBLFFBQ3ZCLEtBQUssTUFBTSxLQUFLLElBQUk7QUFBQSxRQUNwQixRQUFRLE1BQU07QUFBQSxNQUNoQjtBQUFBLE1BRUEsS0FBSyxTQUFTLEVBQUU7QUFBQSxNQUNoQixJQUFJLFVBQVUsR0FBRztBQUFBLFFBQ2YsS0FBSyxNQUFNLEtBQUssVUFBVTtBQUFBLFFBQzFCLEtBQUs7QUFBQSxNQUVQLEVBQU8sU0FBSSxNQUFNLE1BQU07QUFBQSxRQUNyQixNQUFPLElBQUksRUFBRSxRQUFRLEtBQUs7QUFBQSxVQUN4QixLQUFLLE1BQU0sS0FBSyxFQUFFLE1BQU07QUFBQSxRQUMxQjtBQUFBLE1BQ0Y7QUFBQSxNQUVBLE9BQU87QUFBQTtBQUFBLElBSVQsR0FBRyxVQUFVLE1BQU0sU0FBUyxHQUFJLENBQUMsS0FBSztBQUFBLE1BQ3BDLElBQUk7QUFBQSxNQUNKLElBQUksSUFBSSxhQUFhLEtBQUssS0FBSyxhQUFhLEdBQUc7QUFBQSxRQUM3QyxJQUFJLFdBQVc7QUFBQSxRQUNmLE1BQU0sS0FBSyxJQUFJLEdBQUc7QUFBQSxRQUNsQixJQUFJLFlBQVk7QUFBQSxRQUNoQixPQUFPO0FBQUEsTUFDVCxFQUFPLFNBQUksSUFBSSxhQUFhLEtBQUssS0FBSyxhQUFhLEdBQUc7QUFBQSxRQUNwRCxLQUFLLFdBQVc7QUFBQSxRQUNoQixNQUFNLElBQUksSUFBSSxJQUFJO0FBQUEsUUFDbEIsS0FBSyxXQUFXO0FBQUEsUUFDaEIsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUVBLElBQUksS0FBSyxTQUFTLElBQUk7QUFBQSxRQUFRLE9BQU8sS0FBSyxNQUFNLEVBQUUsS0FBSyxHQUFHO0FBQUEsTUFFMUQsT0FBTyxJQUFJLE1BQU0sRUFBRSxLQUFLLElBQUk7QUFBQTtBQUFBLElBSTlCLEdBQUcsVUFBVSxPQUFPLFNBQVMsSUFBSyxDQUFDLEtBQUs7QUFBQSxNQUV0QyxJQUFJLElBQUksYUFBYSxHQUFHO0FBQUEsUUFDdEIsSUFBSSxXQUFXO0FBQUEsUUFDZixJQUFJLElBQUksS0FBSyxLQUFLLEdBQUc7QUFBQSxRQUNyQixJQUFJLFdBQVc7QUFBQSxRQUNmLE9BQU8sRUFBRSxVQUFVO0FBQUEsTUFHckIsRUFBTyxTQUFJLEtBQUssYUFBYSxHQUFHO0FBQUEsUUFDOUIsS0FBSyxXQUFXO0FBQUEsUUFDaEIsS0FBSyxLQUFLLEdBQUc7QUFBQSxRQUNiLEtBQUssV0FBVztBQUFBLFFBQ2hCLE9BQU8sS0FBSyxVQUFVO0FBQUEsTUFDeEI7QUFBQSxNQUdBLElBQUksTUFBTSxLQUFLLElBQUksR0FBRztBQUFBLE1BR3RCLElBQUksUUFBUSxHQUFHO0FBQUEsUUFDYixLQUFLLFdBQVc7QUFBQSxRQUNoQixLQUFLLFNBQVM7QUFBQSxRQUNkLEtBQUssTUFBTSxLQUFLO0FBQUEsUUFDaEIsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUdBLElBQUksR0FBRztBQUFBLE1BQ1AsSUFBSSxNQUFNLEdBQUc7QUFBQSxRQUNYLElBQUk7QUFBQSxRQUNKLElBQUk7QUFBQSxNQUNOLEVBQU87QUFBQSxRQUNMLElBQUk7QUFBQSxRQUNKLElBQUk7QUFBQTtBQUFBLE1BR04sSUFBSSxRQUFRO0FBQUEsTUFDWixTQUFTLElBQUksRUFBRyxJQUFJLEVBQUUsUUFBUSxLQUFLO0FBQUEsUUFDakMsS0FBSyxFQUFFLE1BQU0sS0FBSyxNQUFNLEVBQUUsTUFBTSxLQUFLLEtBQUs7QUFBQSxRQUMxQyxRQUFRLEtBQUs7QUFBQSxRQUNiLEtBQUssTUFBTSxLQUFLLElBQUk7QUFBQSxNQUN0QjtBQUFBLE1BQ0EsTUFBTyxVQUFVLEtBQUssSUFBSSxFQUFFLFFBQVEsS0FBSztBQUFBLFFBQ3ZDLEtBQUssRUFBRSxNQUFNLEtBQUssS0FBSztBQUFBLFFBQ3ZCLFFBQVEsS0FBSztBQUFBLFFBQ2IsS0FBSyxNQUFNLEtBQUssSUFBSTtBQUFBLE1BQ3RCO0FBQUEsTUFHQSxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUUsVUFBVSxNQUFNLE1BQU07QUFBQSxRQUM3QyxNQUFPLElBQUksRUFBRSxRQUFRLEtBQUs7QUFBQSxVQUN4QixLQUFLLE1BQU0sS0FBSyxFQUFFLE1BQU07QUFBQSxRQUMxQjtBQUFBLE1BQ0Y7QUFBQSxNQUVBLEtBQUssU0FBUyxLQUFLLElBQUksS0FBSyxRQUFRLENBQUM7QUFBQSxNQUVyQyxJQUFJLE1BQU0sTUFBTTtBQUFBLFFBQ2QsS0FBSyxXQUFXO0FBQUEsTUFDbEI7QUFBQSxNQUVBLE9BQU8sS0FBSyxNQUFNO0FBQUE7QUFBQSxJQUlwQixHQUFHLFVBQVUsTUFBTSxTQUFTLEdBQUksQ0FBQyxLQUFLO0FBQUEsTUFDcEMsT0FBTyxLQUFLLE1BQU0sRUFBRSxLQUFLLEdBQUc7QUFBQTtBQUFBLElBRzlCLFNBQVMsVUFBVyxDQUFDLE9BQU0sS0FBSyxLQUFLO0FBQUEsTUFDbkMsSUFBSSxXQUFXLElBQUksV0FBVyxNQUFLO0FBQUEsTUFDbkMsSUFBSSxNQUFPLE1BQUssU0FBUyxJQUFJLFNBQVU7QUFBQSxNQUN2QyxJQUFJLFNBQVM7QUFBQSxNQUNiLE1BQU8sTUFBTSxJQUFLO0FBQUEsTUFHbEIsSUFBSSxJQUFJLE1BQUssTUFBTSxLQUFLO0FBQUEsTUFDeEIsSUFBSSxJQUFJLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDdkIsSUFBSSxJQUFJLElBQUk7QUFBQSxNQUVaLElBQUksS0FBSyxJQUFJO0FBQUEsTUFDYixJQUFJLFFBQVMsSUFBSSxXQUFhO0FBQUEsTUFDOUIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUVmLFNBQVMsSUFBSSxFQUFHLElBQUksS0FBSyxLQUFLO0FBQUEsUUFHNUIsSUFBSSxTQUFTLFVBQVU7QUFBQSxRQUN2QixJQUFJLFFBQVEsUUFBUTtBQUFBLFFBQ3BCLElBQUksT0FBTyxLQUFLLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQztBQUFBLFFBQ3JDLFNBQVMsSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLE1BQUssU0FBUyxDQUFDLEVBQUcsS0FBSyxNQUFNLEtBQUs7QUFBQSxVQUM3RCxJQUFJLElBQUssSUFBSSxJQUFLO0FBQUEsVUFDbEIsSUFBSSxNQUFLLE1BQU0sS0FBSztBQUFBLFVBQ3BCLElBQUksSUFBSSxNQUFNLEtBQUs7QUFBQSxVQUNuQixJQUFJLElBQUksSUFBSTtBQUFBLFVBQ1osVUFBVyxJQUFJLFdBQWE7QUFBQSxVQUM1QixRQUFRLElBQUk7QUFBQSxRQUNkO0FBQUEsUUFDQSxJQUFJLE1BQU0sS0FBSyxRQUFRO0FBQUEsUUFDdkIsUUFBUSxTQUFTO0FBQUEsTUFDbkI7QUFBQSxNQUNBLElBQUksVUFBVSxHQUFHO0FBQUEsUUFDZixJQUFJLE1BQU0sS0FBSyxRQUFRO0FBQUEsTUFDekIsRUFBTztBQUFBLFFBQ0wsSUFBSTtBQUFBO0FBQUEsTUFHTixPQUFPLElBQUksTUFBTTtBQUFBO0FBQUEsSUFNbkIsSUFBSSxjQUFjLFNBQVMsV0FBWSxDQUFDLE9BQU0sS0FBSyxLQUFLO0FBQUEsTUFDdEQsSUFBSSxJQUFJLE1BQUs7QUFBQSxNQUNiLElBQUksSUFBSSxJQUFJO0FBQUEsTUFDWixJQUFJLElBQUksSUFBSTtBQUFBLE1BQ1osSUFBSSxJQUFJO0FBQUEsTUFDUixJQUFJO0FBQUEsTUFDSixJQUFJO0FBQUEsTUFDSixJQUFJO0FBQUEsTUFDSixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BRWpCLElBQUksV0FBVyxNQUFLLFdBQVcsSUFBSTtBQUFBLE1BQ25DLElBQUksU0FBUztBQUFBLE1BRWIsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE1BQVEsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUNyRCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sT0FBTyxNQUFPO0FBQUEsTUFDaEQsTUFBTTtBQUFBLE1BRU4sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE1BQVEsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUNyRCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sT0FBTyxNQUFPO0FBQUEsTUFDaEQsTUFBTTtBQUFBLE1BRU4sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE1BQVEsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUNyRCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sT0FBTyxNQUFPO0FBQUEsTUFDaEQsTUFBTTtBQUFBLE1BRU4sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE9BQVMsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUN0RCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sUUFBUSxNQUFPO0FBQUEsTUFDakQsT0FBTztBQUFBLE1BRVAsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE9BQVMsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUN0RCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sUUFBUSxNQUFPO0FBQUEsTUFDakQsT0FBTztBQUFBLE1BRVAsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUss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S0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE9BQVMsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUN0RCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sUUFBUSxNQUFPO0FBQUEsTUFDakQsT0FBTztBQUFBLE1BRVAsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE9BQVMsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUN0RCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sUUFBUSxNQUFPO0FBQUEsTUFDakQsT0FBTztBQUFBLE1BRVAsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztB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O0FBQUEsUUFDUixFQUFPLFNBQUksSUFBSSxHQUFHO0FBQUEsVUFDaEIsTUFBTTtBQUFBLFFBQ1I7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUEsSUFHVCxHQUFHLFVBQVUsTUFBTSxTQUFTLEdBQUksQ0FBQyxLQUFLO0FBQUEsTUFDcEMsT0FBTyxLQUFLLEtBQUssR0FBRyxNQUFNO0FBQUE7QUFBQSxJQUc1QixHQUFHLFVBQVUsS0FBSyxTQUFTLEVBQUcsQ0FBQyxLQUFLO0FBQUEsTUFDbEMsT0FBTyxLQUFLLElBQUksR0FBRyxNQUFNO0FBQUE7QUFBQSxJQUczQixHQUFHLFVBQVUsT0FBTyxTQUFTLElBQUssQ0FBQyxLQUFLO0FBQUEsTUFDdEMsT0FBTyxLQUFLLEtBQUssR0FBRyxLQUFLO0FBQUE7QUFBQSxJQUczQixHQUFHLFVBQVUsTUFBTSxTQUFTLEdBQUksQ0FBQyxLQUFLO0FBQUEsTUFDcEMsT0FBTyxLQUFLLElBQUksR0FBRyxLQUFLO0FBQUE7QUFBQSxJQUcxQixHQUFHLFVBQVUsTUFBTSxTQUFTLEdBQUksQ0FBQyxLQUFLO0FBQUEsTUFDcEMsT0FBTyxLQUFLLEtBQUssR0FBRyxNQUFNO0FBQUE7QUFBQSxJQUc1QixHQUFHLFVBQVUsS0FBSyxTQUFTLEVBQUcsQ0FBQyxLQUFLO0FBQUEsTUFDbEMsT0FBTyxLQUFLLElBQUksR0FBRyxNQUFNO0FBQUE7QUFBQSxJQUczQixHQUFHLFVBQVUsT0FBTyxTQUFTLElBQUssQ0FBQyxLQUFLO0FBQUEsTUFDdEMsT0FBTyxLQUFLLEtBQUssR0FBRyxLQUFLO0FBQUE7QUFBQSxJQUczQixHQUFHLFVBQVUsTUFBTSxTQUFTLEdBQUksQ0FBQyxLQUFLO0FBQUEsTUFDcEMsT0FBTyxLQUFLLElBQUksR0FBRyxLQUFLO0FBQUE7QUFBQSxJQUcxQixHQUFHLFVBQVUsTUFBTSxTQUFTLEdBQUksQ0FBQyxLQUFLO0FBQUEsTUFDcEMsT0FBTyxLQUFLLEtBQUssR0FBRyxNQUFNO0FBQUE7QUFBQSxJQUc1QixHQUFHLFVBQVUs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QU87QUFBQSxNQUV2QixJQUFJLEtBQUssS0FBSyxFQUFFLE9BQU87QUFBQSxNQUV2QixJQUFJLE9BQU8sR0FBRyxPQUFPO0FBQUEsTUFFckIsSUFBSSxJQUFJLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsUUFBUSxJQUFJO0FBQUEsTUFDM0QsSUFBSSxFQUFFLFFBQVEsQ0FBQztBQUFBLE1BRWYsSUFBSSxJQUFJLEdBQUcsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsUUFBUSxLQUFLLE1BQU0sQ0FBQztBQUFBLE1BRXRELElBQUksSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUM7QUFBQSxNQUV2QyxLQUFLO0FBQUEsTUFFTCxJQUFJLFFBQVEsS0FBSyxRQUFRLElBQUk7QUFBQSxNQUM3QixRQUFRLE1BQU0sUUFBUSxLQUFLO0FBQUEsTUFDM0IsUUFBUSxNQUFNLFFBQVEsS0FBSztBQUFBLE1BQzNCLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLEtBQUs7QUFBQSxNQUV6QyxLQUFLLEtBQUssRUFBRSxPQUFPLEtBQUssQ0FBQztBQUFBLElBQzNCLEVBQU87QUFBQSxNQUtMLElBQUksUUFBUSxLQUFLLEVBQUUsT0FBTztBQUFBLE1BRTFCLElBQUksUUFBUSxLQUFLLEVBQUUsT0FBTztBQUFBLE1BRTFCLElBQUksT0FBTyxLQUFLLEVBQUUsT0FBTyxLQUFLO0FBQUEsTUFFOUIsSUFBSSxRQUFRLEtBQUssRUFBRSxPQUFPLEtBQUssRUFBRSxPQUFPLEtBQUssRUFBRSxPQUFPLEtBQUssQ0FBQztBQUFBLE1BQzVELFFBQVEsTUFBTSxPQUFPLEtBQUssRUFBRSxRQUFRLEtBQUs7QUFBQSxNQUV6QyxJQUFJLFFBQVEsS0FBSyxRQUFRLElBQUk7QUFBQSxNQUM3QixRQUFRLE1BQU0sUUFBUSxLQUFLO0FBQUEsTUFDM0IsSUFBSSxRQUFRLE1BQU0sT0FBTyxLQUFLO0FBQUEsTUFDOUIsS0FB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QU0sQ0FBQyxNQUFNO0FBQUE7QUFBQSxFQUcvQyxNQUFNLFVBQVUsVUFBVSxTQUFTLE9BQU8sR0FBRztBQUFBLElBTTNDLElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTztBQUFBLElBRXRCLElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTztBQUFBLElBRXRCLElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTztBQUFBLElBQ3RCLElBQUksRUFBRSxRQUFRLENBQUM7QUFBQSxJQUVmLElBQUksSUFBSSxLQUFLLE1BQU0sTUFBTSxDQUFDO0FBQUEsSUFFMUIsSUFBSSxJQUFJLEtBQUssRUFBRSxPQUFPLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUM7QUFBQSxJQUUzRCxJQUFJLElBQUksRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVsQixJQUFJLElBQUksRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVsQixJQUFJLElBQUksRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVsQixJQUFJLEtBQUssRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVuQixJQUFJLEtBQUssRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVuQixJQUFJLEtBQUssRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVuQixJQUFJLEtBQUssRUFBRSxPQUFPLENBQUM7QUFBQSxJQUNuQixPQUFPLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxJQUFJLEVBQUU7QUFBQTtBQUFBLEVBR3hDLE1BQU0sVUFBVSxXQUFXLFNBQVMsUUFBUSxHQUFHO0FBQUEsSUFRN0MsSUFBSSxJQUFJLEtBQUssRUFBRSxPQUFPLEtBQUssQ0FBQyxFQUFFLE9BQU87QUFBQSxJQUVyQyxJQUFJLElBQUksS0FBSyxFQUFFLE9BQU87QUFBQSxJQUV0QixJQUFJLElBQUksS0FBSyxFQUFFLE9BQU87QUFBQSxJQUV0QixJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFDSixJQUFJO0FBQUEsSUFD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QUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFB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QUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBRWhCLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNO0FBQUEsSUFDakMsU0FBUyxJQUFJLEVBQUcsSUFBSSxFQUFFLFFBQVEsS0FBSyxHQUFHO0FBQUEsTUFDcEMsSUFBSSxRQUFRO0FBQUEsTUFDWixJQUFJLFFBQVE7QUFBQSxNQUNaLElBQUksUUFBUSxVQUFVLElBQUksRUFBRTtBQUFBLE1BQzVCLElBQUksUUFBUSxVQUFVLElBQUksRUFBRTtBQUFBLE1BQzVCLElBQUksUUFBUSxRQUFRLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO0FBQUEsTUFDMUMsSUFBSSxRQUFRLFFBQVEsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7QUFBQSxNQUMxQyxJQUFJLFFBQVEsS0FBSyxFQUFFO0FBQUEsTUFDbkIsSUFBSSxRQUFRLEtBQUssRUFBRSxJQUFJO0FBQUEsTUFDdkIsSUFBSSxRQUFRLEVBQUU7QUFBQSxNQUNkLElB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QUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQ25EO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFDbEQ7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUNuRDtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLEVBQ3BEO0FBQUEsRUFFQSxJQUFJLEtBQUs7QUFBQSxJQUNQO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFDbEQ7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUNuRDtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQ2xEO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFDbEQ7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxFQUNwRDtBQUFBLEVBRUEsSUFBSSxJQUFJO0FBQUEsSUFDTjtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQ3JEO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFDcEQ7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUNyRDtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQ3BEO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsRUFDdkQ7QUFBQSxFQUVBLElBQUksS0FBSztBQUFBLElBQ1A7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUNyRDtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQ3BEO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJ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RjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsS0FBSztBQUFBLE1BQ0gsS0FBSztBQUFBLE1BQ0wsUUFBUTtBQUFBLFFBQ047QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFB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QUFNLGtCQUFrQixVQUFVLEtBQUssR0FBRztBQUUxQyxJQUFNLGdCQUEyQztBQUFBLEVBQy9DLFlBQVk7QUFBQSxFQUNaLFFBQVUsV0FBVyxPQUFPLFdBQVc7QUFBQSxFQUN2QyxZQUFjLFdBQVcsT0FBTyxXQUFXO0FBQUEsRUFDM0MsTUFBUSxXQUFXLE9BQU8sZ0JBQWdCLE9BQU8sZ0JBQWdCLE9BQU8sa0JBQWtCO0FBQUEsRUFDMUYsUUFBVSxXQUFXLE9BQU8sd0JBQXdCLE9BQU8sa0JBQWtCO0FBQy9FO0FBR0EsZUFBc0IsR0FBRyxHQUFHLE9BQU8sU0FBUyxZQUE0QjtBQUFBLEVBR3RFLElBQUksVUFBVyxPQUFRLFdBQXNCLE1BQU0sR0FBRztBQUFBLEVBQ3RELElBQUksU0FBUyxXQUFXLEdBQUcsUUFBUSxJQUFJLENBQUMsV0FBVyxjQUFjLE9BQU8sQ0FBQztBQUFBLEVBRXpFLE1BQU0sVUFBbUIsTUFBTSxJQUFJLFNBQVM7QUFBQSxFQUM1QyxNQUFNLFdBQVcsTUFBTSxRQUFRLFNBQVMsTUFBTTtBQUFBLEVBQzlDLFVBQVUsVUFBVSxhQUFhLE9BQVEsY0FBd0IsS0FBSyxFQUFlO0FBQUEsRUFDckYsVUFBVSxVQUFVLGVBQWUsT0FBUSxnQkFBMEIsS0FBSyxFQUFlO0FBQUEsRUFDekYsT0FBTztBQUFBOyIsCiAgImRlYnVnSWQiOiAiNzA0QTA1MDgxRDE5NTFGODY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
diff --git a/packages/eve-web/build/api/auth/discordID/[discordID]/characterID/[characterID]/refresh.js b/packages/eve-web/build/api/auth/discordID/[discordID]/characterID/[characterID]/refresh.js
deleted file mode 100644
index 168dc09..0000000
--- a/packages/eve-web/build/api/auth/discordID/[discordID]/characterID/[characterID]/refresh.js
+++ /dev/null
@@ -1,18217 +0,0 @@
-// @bun
-var __create = Object.create;
-var __getProtoOf = Object.getPrototypeOf;
-var __defProp = Object.defineProperty;
-var __getOwnPropNames = Object.getOwnPropertyNames;
-var __hasOwnProp = Object.prototype.hasOwnProperty;
-var __toESM = (mod, isNodeMode, target) => {
- target = mod != null ? __create(__getProtoOf(mod)) : {};
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
- for (let key of __getOwnPropNames(mod))
- if (!__hasOwnProp.call(to, key))
- __defProp(to, key, {
- get: () => mod[key],
- enumerable: true
- });
- return to;
-};
-var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
-var __require = import.meta.require;
-
-// ../eve/node_modules/safe-buffer/index.js
-var require_safe_buffer = __commonJS((exports, module) => {
- /*! safe-buffer. MIT License. Feross Aboukhadijeh */
- var buffer = __require("buffer");
- var Buffer2 = buffer.Buffer;
- function copyProps(src, dst) {
- for (var key in src) {
- dst[key] = src[key];
- }
- }
- if (Buffer2.from && Buffer2.alloc && Buffer2.allocUnsafe && Buffer2.allocUnsafeSlow) {
- module.exports = buffer;
- } else {
- copyProps(buffer, exports);
- exports.Buffer = SafeBuffer;
- }
- function SafeBuffer(arg, encodingOrOffset, length) {
- return Buffer2(arg, encodingOrOffset, length);
- }
- SafeBuffer.prototype = Object.create(Buffer2.prototype);
- copyProps(Buffer2, SafeBuffer);
- SafeBuffer.from = function(arg, encodingOrOffset, length) {
- if (typeof arg === "number") {
- throw new TypeError("Argument must not be a number");
- }
- return Buffer2(arg, encodingOrOffset, length);
- };
- SafeBuffer.alloc = function(size, fill, encoding) {
- if (typeof size !== "number") {
- throw new TypeError("Argument must be a number");
- }
- var buf = Buffer2(size);
- if (fill !== undefined) {
- if (typeof encoding === "string") {
- buf.fill(fill, encoding);
- } else {
- buf.fill(fill);
- }
- } else {
- buf.fill(0);
- }
- return buf;
- };
- SafeBuffer.allocUnsafe = function(size) {
- if (typeof size !== "number") {
- throw new TypeError("Argument must be a number");
- }
- return Buffer2(size);
- };
- SafeBuffer.allocUnsafeSlow = function(size) {
- if (typeof size !== "number") {
- throw new TypeError("Argument must be a number");
- }
- return buffer.SlowBuffer(size);
- };
-});
-
-// ../eve/node_modules/jws/lib/data-stream.js
-var require_data_stream = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var Stream = __require("stream");
- var util = __require("util");
- function DataStream(data) {
- this.buffer = null;
- this.writable = true;
- this.readable = true;
- if (!data) {
- this.buffer = Buffer2.alloc(0);
- return this;
- }
- if (typeof data.pipe === "function") {
- this.buffer = Buffer2.alloc(0);
- data.pipe(this);
- return this;
- }
- if (data.length || typeof data === "object") {
- this.buffer = data;
- this.writable = false;
- process.nextTick(function() {
- this.emit("end", data);
- this.readable = false;
- this.emit("close");
- }.bind(this));
- return this;
- }
- throw new TypeError("Unexpected data type (" + typeof data + ")");
- }
- util.inherits(DataStream, Stream);
- DataStream.prototype.write = function write(data) {
- this.buffer = Buffer2.concat([this.buffer, Buffer2.from(data)]);
- this.emit("data", data);
- };
- DataStream.prototype.end = function end(data) {
- if (data)
- this.write(data);
- this.emit("end", data);
- this.emit("close");
- this.writable = false;
- this.readable = false;
- };
- module.exports = DataStream;
-});
-
-// ../eve/node_modules/ecdsa-sig-formatter/src/param-bytes-for-alg.js
-var require_param_bytes_for_alg = __commonJS((exports, module) => {
- function getParamSize(keySize) {
- var result = (keySize / 8 | 0) + (keySize % 8 === 0 ? 0 : 1);
- return result;
- }
- var paramBytesForAlg = {
- ES256: getParamSize(256),
- ES384: getParamSize(384),
- ES512: getParamSize(521)
- };
- function getParamBytesForAlg(alg) {
- var paramBytes = paramBytesForAlg[alg];
- if (paramBytes) {
- return paramBytes;
- }
- throw new Error('Unknown algorithm "' + alg + '"');
- }
- module.exports = getParamBytesForAlg;
-});
-
-// ../eve/node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.js
-var require_ecdsa_sig_formatter = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var getParamBytesForAlg = require_param_bytes_for_alg();
- var MAX_OCTET = 128;
- var CLASS_UNIVERSAL = 0;
- var PRIMITIVE_BIT = 32;
- var TAG_SEQ = 16;
- var TAG_INT = 2;
- var ENCODED_TAG_SEQ = TAG_SEQ | PRIMITIVE_BIT | CLASS_UNIVERSAL << 6;
- var ENCODED_TAG_INT = TAG_INT | CLASS_UNIVERSAL << 6;
- function base64Url(base64) {
- return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
- }
- function signatureAsBuffer(signature) {
- if (Buffer2.isBuffer(signature)) {
- return signature;
- } else if (typeof signature === "string") {
- return Buffer2.from(signature, "base64");
- }
- throw new TypeError("ECDSA signature must be a Base64 string or a Buffer");
- }
- function derToJose(signature, alg) {
- signature = signatureAsBuffer(signature);
- var paramBytes = getParamBytesForAlg(alg);
- var maxEncodedParamLength = paramBytes + 1;
- var inputLength = signature.length;
- var offset = 0;
- if (signature[offset++] !== ENCODED_TAG_SEQ) {
- throw new Error('Could not find expected "seq"');
- }
- var seqLength = signature[offset++];
- if (seqLength === (MAX_OCTET | 1)) {
- seqLength = signature[offset++];
- }
- if (inputLength - offset < seqLength) {
- throw new Error('"seq" specified length of "' + seqLength + '", only "' + (inputLength - offset) + '" remaining');
- }
- if (signature[offset++] !== ENCODED_TAG_INT) {
- throw new Error('Could not find expected "int" for "r"');
- }
- var rLength = signature[offset++];
- if (inputLength - offset - 2 < rLength) {
- throw new Error('"r" specified length of "' + rLength + '", only "' + (inputLength - offset - 2) + '" available');
- }
- if (maxEncodedParamLength < rLength) {
- throw new Error('"r" specified length of "' + rLength + '", max of "' + maxEncodedParamLength + '" is acceptable');
- }
- var rOffset = offset;
- offset += rLength;
- if (signature[offset++] !== ENCODED_TAG_INT) {
- throw new Error('Could not find expected "int" for "s"');
- }
- var sLength = signature[offset++];
- if (inputLength - offset !== sLength) {
- throw new Error('"s" specified length of "' + sLength + '", expected "' + (inputLength - offset) + '"');
- }
- if (maxEncodedParamLength < sLength) {
- throw new Error('"s" specified length of "' + sLength + '", max of "' + maxEncodedParamLength + '" is acceptable');
- }
- var sOffset = offset;
- offset += sLength;
- if (offset !== inputLength) {
- throw new Error('Expected to consume entire buffer, but "' + (inputLength - offset) + '" bytes remain');
- }
- var rPadding = paramBytes - rLength, sPadding = paramBytes - sLength;
- var dst = Buffer2.allocUnsafe(rPadding + rLength + sPadding + sLength);
- for (offset = 0;offset < rPadding; ++offset) {
- dst[offset] = 0;
- }
- signature.copy(dst, offset, rOffset + Math.max(-rPadding, 0), rOffset + rLength);
- offset = paramBytes;
- for (var o = offset;offset < o + sPadding; ++offset) {
- dst[offset] = 0;
- }
- signature.copy(dst, offset, sOffset + Math.max(-sPadding, 0), sOffset + sLength);
- dst = dst.toString("base64");
- dst = base64Url(dst);
- return dst;
- }
- function countPadding(buf, start, stop) {
- var padding = 0;
- while (start + padding < stop && buf[start + padding] === 0) {
- ++padding;
- }
- var needsSign = buf[start + padding] >= MAX_OCTET;
- if (needsSign) {
- --padding;
- }
- return padding;
- }
- function joseToDer(signature, alg) {
- signature = signatureAsBuffer(signature);
- var paramBytes = getParamBytesForAlg(alg);
- var signatureBytes = signature.length;
- if (signatureBytes !== paramBytes * 2) {
- throw new TypeError('"' + alg + '" signatures must be "' + paramBytes * 2 + '" bytes, saw "' + signatureBytes + '"');
- }
- var rPadding = countPadding(signature, 0, paramBytes);
- var sPadding = countPadding(signature, paramBytes, signature.length);
- var rLength = paramBytes - rPadding;
- var sLength = paramBytes - sPadding;
- var rsBytes = 1 + 1 + rLength + 1 + 1 + sLength;
- var shortLength = rsBytes < MAX_OCTET;
- var dst = Buffer2.allocUnsafe((shortLength ? 2 : 3) + rsBytes);
- var offset = 0;
- dst[offset++] = ENCODED_TAG_SEQ;
- if (shortLength) {
- dst[offset++] = rsBytes;
- } else {
- dst[offset++] = MAX_OCTET | 1;
- dst[offset++] = rsBytes & 255;
- }
- dst[offset++] = ENCODED_TAG_INT;
- dst[offset++] = rLength;
- if (rPadding < 0) {
- dst[offset++] = 0;
- offset += signature.copy(dst, offset, 0, paramBytes);
- } else {
- offset += signature.copy(dst, offset, rPadding, paramBytes);
- }
- dst[offset++] = ENCODED_TAG_INT;
- dst[offset++] = sLength;
- if (sPadding < 0) {
- dst[offset++] = 0;
- signature.copy(dst, offset, paramBytes);
- } else {
- signature.copy(dst, offset, paramBytes + sPadding);
- }
- return dst;
- }
- module.exports = {
- derToJose,
- joseToDer
- };
-});
-
-// ../eve/node_modules/buffer-equal-constant-time/index.js
-var require_buffer_equal_constant_time = __commonJS((exports, module) => {
- var Buffer2 = __require("buffer").Buffer;
- var SlowBuffer = __require("buffer").SlowBuffer;
- module.exports = bufferEq;
- function bufferEq(a, b) {
- if (!Buffer2.isBuffer(a) || !Buffer2.isBuffer(b)) {
- return false;
- }
- if (a.length !== b.length) {
- return false;
- }
- var c = 0;
- for (var i = 0;i < a.length; i++) {
- c |= a[i] ^ b[i];
- }
- return c === 0;
- }
- bufferEq.install = function() {
- Buffer2.prototype.equal = SlowBuffer.prototype.equal = function equal(that) {
- return bufferEq(this, that);
- };
- };
- var origBufEqual = Buffer2.prototype.equal;
- var origSlowBufEqual = SlowBuffer.prototype.equal;
- bufferEq.restore = function() {
- Buffer2.prototype.equal = origBufEqual;
- SlowBuffer.prototype.equal = origSlowBufEqual;
- };
-});
-
-// ../eve/node_modules/jwa/index.js
-var require_jwa = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var crypto2 = __require("crypto");
- var formatEcdsa = require_ecdsa_sig_formatter();
- var util = __require("util");
- var MSG_INVALID_ALGORITHM = `"%s" is not a valid algorithm.
- Supported algorithms are:
- "HS256", "HS384", "HS512", "RS256", "RS384", "RS512", "PS256", "PS384", "PS512", "ES256", "ES384", "ES512" and "none".`;
- var MSG_INVALID_SECRET = "secret must be a string or buffer";
- var MSG_INVALID_VERIFIER_KEY = "key must be a string or a buffer";
- var MSG_INVALID_SIGNER_KEY = "key must be a string, a buffer or an object";
- var supportsKeyObjects = typeof crypto2.createPublicKey === "function";
- if (supportsKeyObjects) {
- MSG_INVALID_VERIFIER_KEY += " or a KeyObject";
- MSG_INVALID_SECRET += "or a KeyObject";
- }
- function checkIsPublicKey(key) {
- if (Buffer2.isBuffer(key)) {
- return;
- }
- if (typeof key === "string") {
- return;
- }
- if (!supportsKeyObjects) {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key !== "object") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key.type !== "string") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key.asymmetricKeyType !== "string") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key.export !== "function") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- }
- function checkIsPrivateKey(key) {
- if (Buffer2.isBuffer(key)) {
- return;
- }
- if (typeof key === "string") {
- return;
- }
- if (typeof key === "object") {
- return;
- }
- throw typeError(MSG_INVALID_SIGNER_KEY);
- }
- function checkIsSecretKey(key) {
- if (Buffer2.isBuffer(key)) {
- return;
- }
- if (typeof key === "string") {
- return key;
- }
- if (!supportsKeyObjects) {
- throw typeError(MSG_INVALID_SECRET);
- }
- if (typeof key !== "object") {
- throw typeError(MSG_INVALID_SECRET);
- }
- if (key.type !== "secret") {
- throw typeError(MSG_INVALID_SECRET);
- }
- if (typeof key.export !== "function") {
- throw typeError(MSG_INVALID_SECRET);
- }
- }
- function fromBase64(base64) {
- return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
- }
- function toBase64(base64url) {
- base64url = base64url.toString();
- var padding = 4 - base64url.length % 4;
- if (padding !== 4) {
- for (var i = 0;i < padding; ++i) {
- base64url += "=";
- }
- }
- return base64url.replace(/\-/g, "+").replace(/_/g, "/");
- }
- function typeError(template) {
- var args = [].slice.call(arguments, 1);
- var errMsg = util.format.bind(util, template).apply(null, args);
- return new TypeError(errMsg);
- }
- function bufferOrString(obj) {
- return Buffer2.isBuffer(obj) || typeof obj === "string";
- }
- function normalizeInput(thing) {
- if (!bufferOrString(thing))
- thing = JSON.stringify(thing);
- return thing;
- }
- function createHmacSigner(bits) {
- return function sign(thing, secret) {
- checkIsSecretKey(secret);
- thing = normalizeInput(thing);
- var hmac = crypto2.createHmac("sha" + bits, secret);
- var sig = (hmac.update(thing), hmac.digest("base64"));
- return fromBase64(sig);
- };
- }
- var bufferEqual;
- var timingSafeEqual = "timingSafeEqual" in crypto2 ? function timingSafeEqual(a, b) {
- if (a.byteLength !== b.byteLength) {
- return false;
- }
- return crypto2.timingSafeEqual(a, b);
- } : function timingSafeEqual(a, b) {
- if (!bufferEqual) {
- bufferEqual = require_buffer_equal_constant_time();
- }
- return bufferEqual(a, b);
- };
- function createHmacVerifier(bits) {
- return function verify(thing, signature, secret) {
- var computedSig = createHmacSigner(bits)(thing, secret);
- return timingSafeEqual(Buffer2.from(signature), Buffer2.from(computedSig));
- };
- }
- function createKeySigner(bits) {
- return function sign(thing, privateKey) {
- checkIsPrivateKey(privateKey);
- thing = normalizeInput(thing);
- var signer = crypto2.createSign("RSA-SHA" + bits);
- var sig = (signer.update(thing), signer.sign(privateKey, "base64"));
- return fromBase64(sig);
- };
- }
- function createKeyVerifier(bits) {
- return function verify(thing, signature, publicKey) {
- checkIsPublicKey(publicKey);
- thing = normalizeInput(thing);
- signature = toBase64(signature);
- var verifier = crypto2.createVerify("RSA-SHA" + bits);
- verifier.update(thing);
- return verifier.verify(publicKey, signature, "base64");
- };
- }
- function createPSSKeySigner(bits) {
- return function sign(thing, privateKey) {
- checkIsPrivateKey(privateKey);
- thing = normalizeInput(thing);
- var signer = crypto2.createSign("RSA-SHA" + bits);
- var sig = (signer.update(thing), signer.sign({
- key: privateKey,
- padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
- saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
- }, "base64"));
- return fromBase64(sig);
- };
- }
- function createPSSKeyVerifier(bits) {
- return function verify(thing, signature, publicKey) {
- checkIsPublicKey(publicKey);
- thing = normalizeInput(thing);
- signature = toBase64(signature);
- var verifier = crypto2.createVerify("RSA-SHA" + bits);
- verifier.update(thing);
- return verifier.verify({
- key: publicKey,
- padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
- saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
- }, signature, "base64");
- };
- }
- function createECDSASigner(bits) {
- var inner = createKeySigner(bits);
- return function sign() {
- var signature = inner.apply(null, arguments);
- signature = formatEcdsa.derToJose(signature, "ES" + bits);
- return signature;
- };
- }
- function createECDSAVerifer(bits) {
- var inner = createKeyVerifier(bits);
- return function verify(thing, signature, publicKey) {
- signature = formatEcdsa.joseToDer(signature, "ES" + bits).toString("base64");
- var result = inner(thing, signature, publicKey);
- return result;
- };
- }
- function createNoneSigner() {
- return function sign() {
- return "";
- };
- }
- function createNoneVerifier() {
- return function verify(thing, signature) {
- return signature === "";
- };
- }
- module.exports = function jwa(algorithm) {
- var signerFactories = {
- hs: createHmacSigner,
- rs: createKeySigner,
- ps: createPSSKeySigner,
- es: createECDSASigner,
- none: createNoneSigner
- };
- var verifierFactories = {
- hs: createHmacVerifier,
- rs: createKeyVerifier,
- ps: createPSSKeyVerifier,
- es: createECDSAVerifer,
- none: createNoneVerifier
- };
- var match = algorithm.match(/^(RS|PS|ES|HS)(256|384|512)$|^(none)$/i);
- if (!match)
- throw typeError(MSG_INVALID_ALGORITHM, algorithm);
- var algo = (match[1] || match[3]).toLowerCase();
- var bits = match[2];
- return {
- sign: signerFactories[algo](bits),
- verify: verifierFactories[algo](bits)
- };
- };
-});
-
-// ../eve/node_modules/jws/lib/tostring.js
-var require_tostring = __commonJS((exports, module) => {
- var Buffer2 = __require("buffer").Buffer;
- module.exports = function toString(obj) {
- if (typeof obj === "string")
- return obj;
- if (typeof obj === "number" || Buffer2.isBuffer(obj))
- return obj.toString();
- return JSON.stringify(obj);
- };
-});
-
-// ../eve/node_modules/jws/lib/sign-stream.js
-var require_sign_stream = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var DataStream = require_data_stream();
- var jwa = require_jwa();
- var Stream = __require("stream");
- var toString = require_tostring();
- var util = __require("util");
- function base64url(string, encoding) {
- return Buffer2.from(string, encoding).toString("base64").replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
- }
- function jwsSecuredInput(header, payload, encoding) {
- encoding = encoding || "utf8";
- var encodedHeader = base64url(toString(header), "binary");
- var encodedPayload = base64url(toString(payload), encoding);
- return util.format("%s.%s", encodedHeader, encodedPayload);
- }
- function jwsSign(opts) {
- var header = opts.header;
- var payload = opts.payload;
- var secretOrKey = opts.secret || opts.privateKey;
- var encoding = opts.encoding;
- var algo = jwa(header.alg);
- var securedInput = jwsSecuredInput(header, payload, encoding);
- var signature = algo.sign(securedInput, secretOrKey);
- return util.format("%s.%s", securedInput, signature);
- }
- function SignStream(opts) {
- var secret = opts.secret || opts.privateKey || opts.key;
- var secretStream = new DataStream(secret);
- this.readable = true;
- this.header = opts.header;
- this.encoding = opts.encoding;
- this.secret = this.privateKey = this.key = secretStream;
- this.payload = new DataStream(opts.payload);
- this.secret.once("close", function() {
- if (!this.payload.writable && this.readable)
- this.sign();
- }.bind(this));
- this.payload.once("close", function() {
- if (!this.secret.writable && this.readable)
- this.sign();
- }.bind(this));
- }
- util.inherits(SignStream, Stream);
- SignStream.prototype.sign = function sign() {
- try {
- var signature = jwsSign({
- header: this.header,
- payload: this.payload.buffer,
- secret: this.secret.buffer,
- encoding: this.encoding
- });
- this.emit("done", signature);
- this.emit("data", signature);
- this.emit("end");
- this.readable = false;
- return signature;
- } catch (e) {
- this.readable = false;
- this.emit("error", e);
- this.emit("close");
- }
- };
- SignStream.sign = jwsSign;
- module.exports = SignStream;
-});
-
-// ../eve/node_modules/jws/lib/verify-stream.js
-var require_verify_stream = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var DataStream = require_data_stream();
- var jwa = require_jwa();
- var Stream = __require("stream");
- var toString = require_tostring();
- var util = __require("util");
- var JWS_REGEX = /^[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?\.([a-zA-Z0-9\-_]+)?$/;
- function isObject(thing) {
- return Object.prototype.toString.call(thing) === "[object Object]";
- }
- function safeJsonParse(thing) {
- if (isObject(thing))
- return thing;
- try {
- return JSON.parse(thing);
- } catch (e) {
- return;
- }
- }
- function headerFromJWS(jwsSig) {
- var encodedHeader = jwsSig.split(".", 1)[0];
- return safeJsonParse(Buffer2.from(encodedHeader, "base64").toString("binary"));
- }
- function securedInputFromJWS(jwsSig) {
- return jwsSig.split(".", 2).join(".");
- }
- function signatureFromJWS(jwsSig) {
- return jwsSig.split(".")[2];
- }
- function payloadFromJWS(jwsSig, encoding) {
- encoding = encoding || "utf8";
- var payload = jwsSig.split(".")[1];
- return Buffer2.from(payload, "base64").toString(encoding);
- }
- function isValidJws(string) {
- return JWS_REGEX.test(string) && !!headerFromJWS(string);
- }
- function jwsVerify(jwsSig, algorithm, secretOrKey) {
- if (!algorithm) {
- var err = new Error("Missing algorithm parameter for jws.verify");
- err.code = "MISSING_ALGORITHM";
- throw err;
- }
- jwsSig = toString(jwsSig);
- var signature = signatureFromJWS(jwsSig);
- var securedInput = securedInputFromJWS(jwsSig);
- var algo = jwa(algorithm);
- return algo.verify(securedInput, signature, secretOrKey);
- }
- function jwsDecode(jwsSig, opts) {
- opts = opts || {};
- jwsSig = toString(jwsSig);
- if (!isValidJws(jwsSig))
- return null;
- var header = headerFromJWS(jwsSig);
- if (!header)
- return null;
- var payload = payloadFromJWS(jwsSig);
- if (header.typ === "JWT" || opts.json)
- payload = JSON.parse(payload, opts.encoding);
- return {
- header,
- payload,
- signature: signatureFromJWS(jwsSig)
- };
- }
- function VerifyStream(opts) {
- opts = opts || {};
- var secretOrKey = opts.secret || opts.publicKey || opts.key;
- var secretStream = new DataStream(secretOrKey);
- this.readable = true;
- this.algorithm = opts.algorithm;
- this.encoding = opts.encoding;
- this.secret = this.publicKey = this.key = secretStream;
- this.signature = new DataStream(opts.signature);
- this.secret.once("close", function() {
- if (!this.signature.writable && this.readable)
- this.verify();
- }.bind(this));
- this.signature.once("close", function() {
- if (!this.secret.writable && this.readable)
- this.verify();
- }.bind(this));
- }
- util.inherits(VerifyStream, Stream);
- VerifyStream.prototype.verify = function verify() {
- try {
- var valid = jwsVerify(this.signature.buffer, this.algorithm, this.key.buffer);
- var obj = jwsDecode(this.signature.buffer, this.encoding);
- this.emit("done", valid, obj);
- this.emit("data", valid);
- this.emit("end");
- this.readable = false;
- return valid;
- } catch (e) {
- this.readable = false;
- this.emit("error", e);
- this.emit("close");
- }
- };
- VerifyStream.decode = jwsDecode;
- VerifyStream.isValid = isValidJws;
- VerifyStream.verify = jwsVerify;
- module.exports = VerifyStream;
-});
-
-// ../eve/node_modules/jws/index.js
-var require_jws = __commonJS((exports) => {
- var SignStream = require_sign_stream();
- var VerifyStream = require_verify_stream();
- var ALGORITHMS = [
- "HS256",
- "HS384",
- "HS512",
- "RS256",
- "RS384",
- "RS512",
- "PS256",
- "PS384",
- "PS512",
- "ES256",
- "ES384",
- "ES512"
- ];
- exports.ALGORITHMS = ALGORITHMS;
- exports.sign = SignStream.sign;
- exports.verify = VerifyStream.verify;
- exports.decode = VerifyStream.decode;
- exports.isValid = VerifyStream.isValid;
- exports.createSign = function createSign(opts) {
- return new SignStream(opts);
- };
- exports.createVerify = function createVerify(opts) {
- return new VerifyStream(opts);
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/decode.js
-var require_decode = __commonJS((exports, module) => {
- var jws = require_jws();
- module.exports = function(jwt, options2) {
- options2 = options2 || {};
- var decoded = jws.decode(jwt, options2);
- if (!decoded) {
- return null;
- }
- var payload = decoded.payload;
- if (typeof payload === "string") {
- try {
- var obj = JSON.parse(payload);
- if (obj !== null && typeof obj === "object") {
- payload = obj;
- }
- } catch (e) {}
- }
- if (options2.complete === true) {
- return {
- header: decoded.header,
- payload,
- signature: decoded.signature
- };
- }
- return payload;
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/JsonWebTokenError.js
-var require_JsonWebTokenError = __commonJS((exports, module) => {
- var JsonWebTokenError = function(message, error) {
- Error.call(this, message);
- if (Error.captureStackTrace) {
- Error.captureStackTrace(this, this.constructor);
- }
- this.name = "JsonWebTokenError";
- this.message = message;
- if (error)
- this.inner = error;
- };
- JsonWebTokenError.prototype = Object.create(Error.prototype);
- JsonWebTokenError.prototype.constructor = JsonWebTokenError;
- module.exports = JsonWebTokenError;
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/NotBeforeError.js
-var require_NotBeforeError = __commonJS((exports, module) => {
- var JsonWebTokenError = require_JsonWebTokenError();
- var NotBeforeError = function(message, date) {
- JsonWebTokenError.call(this, message);
- this.name = "NotBeforeError";
- this.date = date;
- };
- NotBeforeError.prototype = Object.create(JsonWebTokenError.prototype);
- NotBeforeError.prototype.constructor = NotBeforeError;
- module.exports = NotBeforeError;
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/TokenExpiredError.js
-var require_TokenExpiredError = __commonJS((exports, module) => {
- var JsonWebTokenError = require_JsonWebTokenError();
- var TokenExpiredError = function(message, expiredAt) {
- JsonWebTokenError.call(this, message);
- this.name = "TokenExpiredError";
- this.expiredAt = expiredAt;
- };
- TokenExpiredError.prototype = Object.create(JsonWebTokenError.prototype);
- TokenExpiredError.prototype.constructor = TokenExpiredError;
- module.exports = TokenExpiredError;
-});
-
-// ../eve/node_modules/ms/index.js
-var require_ms = __commonJS((exports, module) => {
- var s = 1000;
- var m = s * 60;
- var h = m * 60;
- var d = h * 24;
- var w = d * 7;
- var y = d * 365.25;
- module.exports = function(val, options2) {
- options2 = options2 || {};
- var type = typeof val;
- if (type === "string" && val.length > 0) {
- return parse(val);
- } else if (type === "number" && isFinite(val)) {
- return options2.long ? fmtLong(val) : fmtShort(val);
- }
- throw new Error("val is not a non-empty string or a valid number. val=" + JSON.stringify(val));
- };
- function parse(str) {
- str = String(str);
- if (str.length > 100) {
- return;
- }
- var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);
- if (!match) {
- return;
- }
- var n = parseFloat(match[1]);
- var type = (match[2] || "ms").toLowerCase();
- switch (type) {
- case "years":
- case "year":
- case "yrs":
- case "yr":
- case "y":
- return n * y;
- case "weeks":
- case "week":
- case "w":
- return n * w;
- case "days":
- case "day":
- case "d":
- return n * d;
- case "hours":
- case "hour":
- case "hrs":
- case "hr":
- case "h":
- return n * h;
- case "minutes":
- case "minute":
- case "mins":
- case "min":
- case "m":
- return n * m;
- case "seconds":
- case "second":
- case "secs":
- case "sec":
- case "s":
- return n * s;
- case "milliseconds":
- case "millisecond":
- case "msecs":
- case "msec":
- case "ms":
- return n;
- default:
- return;
- }
- }
- function fmtShort(ms) {
- var msAbs = Math.abs(ms);
- if (msAbs >= d) {
- return Math.round(ms / d) + "d";
- }
- if (msAbs >= h) {
- return Math.round(ms / h) + "h";
- }
- if (msAbs >= m) {
- return Math.round(ms / m) + "m";
- }
- if (msAbs >= s) {
- return Math.round(ms / s) + "s";
- }
- return ms + "ms";
- }
- function fmtLong(ms) {
- var msAbs = Math.abs(ms);
- if (msAbs >= d) {
- return plural(ms, msAbs, d, "day");
- }
- if (msAbs >= h) {
- return plural(ms, msAbs, h, "hour");
- }
- if (msAbs >= m) {
- return plural(ms, msAbs, m, "minute");
- }
- if (msAbs >= s) {
- return plural(ms, msAbs, s, "second");
- }
- return ms + " ms";
- }
- function plural(ms, msAbs, n, name) {
- var isPlural = msAbs >= n * 1.5;
- return Math.round(ms / n) + " " + name + (isPlural ? "s" : "");
- }
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/timespan.js
-var require_timespan = __commonJS((exports, module) => {
- var ms = require_ms();
- module.exports = function(time, iat) {
- var timestamp = iat || Math.floor(Date.now() / 1000);
- if (typeof time === "string") {
- var milliseconds = ms(time);
- if (typeof milliseconds === "undefined") {
- return;
- }
- return Math.floor(timestamp + milliseconds / 1000);
- } else if (typeof time === "number") {
- return timestamp + time;
- } else {
- return;
- }
- };
-});
-
-// ../eve/node_modules/semver/internal/constants.js
-var require_constants = __commonJS((exports, module) => {
- var SEMVER_SPEC_VERSION = "2.0.0";
- var MAX_LENGTH = 256;
- var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
- var MAX_SAFE_COMPONENT_LENGTH = 16;
- var MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6;
- var RELEASE_TYPES = [
- "major",
- "premajor",
- "minor",
- "preminor",
- "patch",
- "prepatch",
- "prerelease"
- ];
- module.exports = {
- MAX_LENGTH,
- MAX_SAFE_COMPONENT_LENGTH,
- MAX_SAFE_BUILD_LENGTH,
- MAX_SAFE_INTEGER,
- RELEASE_TYPES,
- SEMVER_SPEC_VERSION,
- FLAG_INCLUDE_PRERELEASE: 1,
- FLAG_LOOSE: 2
- };
-});
-
-// ../eve/node_modules/semver/internal/debug.js
-var require_debug = __commonJS((exports, module) => {
- var debug = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => {};
- module.exports = debug;
-});
-
-// ../eve/node_modules/semver/internal/re.js
-var require_re = __commonJS((exports, module) => {
- var {
- MAX_SAFE_COMPONENT_LENGTH,
- MAX_SAFE_BUILD_LENGTH,
- MAX_LENGTH
- } = require_constants();
- var debug = require_debug();
- exports = module.exports = {};
- var re = exports.re = [];
- var safeRe = exports.safeRe = [];
- var src = exports.src = [];
- var safeSrc = exports.safeSrc = [];
- var t = exports.t = {};
- var R = 0;
- var LETTERDASHNUMBER = "[a-zA-Z0-9-]";
- var safeRegexReplacements = [
- ["\\s", 1],
- ["\\d", MAX_LENGTH],
- [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH]
- ];
- var makeSafeRegex = (value) => {
- for (const [token, max] of safeRegexReplacements) {
- value = value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);
- }
- return value;
- };
- var createToken = (name, value, isGlobal) => {
- const safe = makeSafeRegex(value);
- const index2 = R++;
- debug(name, index2, value);
- t[name] = index2;
- src[index2] = value;
- safeSrc[index2] = safe;
- re[index2] = new RegExp(value, isGlobal ? "g" : undefined);
- safeRe[index2] = new RegExp(safe, isGlobal ? "g" : undefined);
- };
- createToken("NUMERICIDENTIFIER", "0|[1-9]\\d*");
- createToken("NUMERICIDENTIFIERLOOSE", "\\d+");
- createToken("NONNUMERICIDENTIFIER", `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);
- createToken("MAINVERSION", `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})`);
- createToken("MAINVERSIONLOOSE", `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})`);
- createToken("PRERELEASEIDENTIFIER", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIER]})`);
- createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIERLOOSE]})`);
- createToken("PRERELEASE", `(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);
- createToken("PRERELEASELOOSE", `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);
- createToken("BUILDIDENTIFIER", `${LETTERDASHNUMBER}+`);
- createToken("BUILD", `(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);
- createToken("FULLPLAIN", `v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);
- createToken("FULL", `^${src[t.FULLPLAIN]}$`);
- createToken("LOOSEPLAIN", `[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);
- createToken("LOOSE", `^${src[t.LOOSEPLAIN]}$`);
- createToken("GTLT", "((?:<|>)?=?)");
- createToken("XRANGEIDENTIFIERLOOSE", `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);
- createToken("XRANGEIDENTIFIER", `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);
- createToken("XRANGEPLAIN", `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?` + `)?)?`);
- createToken("XRANGEPLAINLOOSE", `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?` + `)?)?`);
- createToken("XRANGE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);
- createToken("XRANGELOOSE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);
- createToken("COERCEPLAIN", `${"(^|[^\\d])" + "(\\d{1,"}${MAX_SAFE_COMPONENT_LENGTH}})` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);
- createToken("COERCE", `${src[t.COERCEPLAIN]}(?:$|[^\\d])`);
- createToken("COERCEFULL", src[t.COERCEPLAIN] + `(?:${src[t.PRERELEASE]})?` + `(?:${src[t.BUILD]})?` + `(?:$|[^\\d])`);
- createToken("COERCERTL", src[t.COERCE], true);
- createToken("COERCERTLFULL", src[t.COERCEFULL], true);
- createToken("LONETILDE", "(?:~>?)");
- createToken("TILDETRIM", `(\\s*)${src[t.LONETILDE]}\\s+`, true);
- exports.tildeTrimReplace = "$1~";
- createToken("TILDE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);
- createToken("TILDELOOSE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);
- createToken("LONECARET", "(?:\\^)");
- createToken("CARETTRIM", `(\\s*)${src[t.LONECARET]}\\s+`, true);
- exports.caretTrimReplace = "$1^";
- createToken("CARET", `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);
- createToken("CARETLOOSE", `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);
- createToken("COMPARATORLOOSE", `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);
- createToken("COMPARATOR", `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);
- createToken("COMPARATORTRIM", `(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true);
- exports.comparatorTrimReplace = "$1$2$3";
- createToken("HYPHENRANGE", `^\\s*(${src[t.XRANGEPLAIN]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAIN]})` + `\\s*$`);
- createToken("HYPHENRANGELOOSE", `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAINLOOSE]})` + `\\s*$`);
- createToken("STAR", "(<|>)?=?\\s*\\*");
- createToken("GTE0", "^\\s*>=\\s*0\\.0\\.0\\s*$");
- createToken("GTE0PRE", "^\\s*>=\\s*0\\.0\\.0-0\\s*$");
-});
-
-// ../eve/node_modules/semver/internal/parse-options.js
-var require_parse_options = __commonJS((exports, module) => {
- var looseOption = Object.freeze({ loose: true });
- var emptyOpts = Object.freeze({});
- var parseOptions = (options2) => {
- if (!options2) {
- return emptyOpts;
- }
- if (typeof options2 !== "object") {
- return looseOption;
- }
- return options2;
- };
- module.exports = parseOptions;
-});
-
-// ../eve/node_modules/semver/internal/identifiers.js
-var require_identifiers = __commonJS((exports, module) => {
- var numeric2 = /^[0-9]+$/;
- var compareIdentifiers = (a, b) => {
- const anum = numeric2.test(a);
- const bnum = numeric2.test(b);
- if (anum && bnum) {
- a = +a;
- b = +b;
- }
- return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;
- };
- var rcompareIdentifiers = (a, b) => compareIdentifiers(b, a);
- module.exports = {
- compareIdentifiers,
- rcompareIdentifiers
- };
-});
-
-// ../eve/node_modules/semver/classes/semver.js
-var require_semver = __commonJS((exports, module) => {
- var debug = require_debug();
- var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants();
- var { safeRe: re, t } = require_re();
- var parseOptions = require_parse_options();
- var { compareIdentifiers } = require_identifiers();
-
- class SemVer {
- constructor(version2, options2) {
- options2 = parseOptions(options2);
- if (version2 instanceof SemVer) {
- if (version2.loose === !!options2.loose && version2.includePrerelease === !!options2.includePrerelease) {
- return version2;
- } else {
- version2 = version2.version;
- }
- } else if (typeof version2 !== "string") {
- throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version2}".`);
- }
- if (version2.length > MAX_LENGTH) {
- throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);
- }
- debug("SemVer", version2, options2);
- this.options = options2;
- this.loose = !!options2.loose;
- this.includePrerelease = !!options2.includePrerelease;
- const m = version2.trim().match(options2.loose ? re[t.LOOSE] : re[t.FULL]);
- if (!m) {
- throw new TypeError(`Invalid Version: ${version2}`);
- }
- this.raw = version2;
- this.major = +m[1];
- this.minor = +m[2];
- this.patch = +m[3];
- if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
- throw new TypeError("Invalid major version");
- }
- if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
- throw new TypeError("Invalid minor version");
- }
- if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
- throw new TypeError("Invalid patch version");
- }
- if (!m[4]) {
- this.prerelease = [];
- } else {
- this.prerelease = m[4].split(".").map((id) => {
- if (/^[0-9]+$/.test(id)) {
- const num = +id;
- if (num >= 0 && num < MAX_SAFE_INTEGER) {
- return num;
- }
- }
- return id;
- });
- }
- this.build = m[5] ? m[5].split(".") : [];
- this.format();
- }
- format() {
- this.version = `${this.major}.${this.minor}.${this.patch}`;
- if (this.prerelease.length) {
- this.version += `-${this.prerelease.join(".")}`;
- }
- return this.version;
- }
- toString() {
- return this.version;
- }
- compare(other) {
- debug("SemVer.compare", this.version, this.options, other);
- if (!(other instanceof SemVer)) {
- if (typeof other === "string" && other === this.version) {
- return 0;
- }
- other = new SemVer(other, this.options);
- }
- if (other.version === this.version) {
- return 0;
- }
- return this.compareMain(other) || this.comparePre(other);
- }
- compareMain(other) {
- if (!(other instanceof SemVer)) {
- other = new SemVer(other, this.options);
- }
- return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch);
- }
- comparePre(other) {
- if (!(other instanceof SemVer)) {
- other = new SemVer(other, this.options);
- }
- if (this.prerelease.length && !other.prerelease.length) {
- return -1;
- } else if (!this.prerelease.length && other.prerelease.length) {
- return 1;
- } else if (!this.prerelease.length && !other.prerelease.length) {
- return 0;
- }
- let i = 0;
- do {
- const a = this.prerelease[i];
- const b = other.prerelease[i];
- debug("prerelease compare", i, a, b);
- if (a === undefined && b === undefined) {
- return 0;
- } else if (b === undefined) {
- return 1;
- } else if (a === undefined) {
- return -1;
- } else if (a === b) {
- continue;
- } else {
- return compareIdentifiers(a, b);
- }
- } while (++i);
- }
- compareBuild(other) {
- if (!(other instanceof SemVer)) {
- other = new SemVer(other, this.options);
- }
- let i = 0;
- do {
- const a = this.build[i];
- const b = other.build[i];
- debug("build compare", i, a, b);
- if (a === undefined && b === undefined) {
- return 0;
- } else if (b === undefined) {
- return 1;
- } else if (a === undefined) {
- return -1;
- } else if (a === b) {
- continue;
- } else {
- return compareIdentifiers(a, b);
- }
- } while (++i);
- }
- inc(release, identifier, identifierBase) {
- if (release.startsWith("pre")) {
- if (!identifier && identifierBase === false) {
- throw new Error("invalid increment argument: identifier is empty");
- }
- if (identifier) {
- const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]);
- if (!match || match[1] !== identifier) {
- throw new Error(`invalid identifier: ${identifier}`);
- }
- }
- }
- switch (release) {
- case "premajor":
- this.prerelease.length = 0;
- this.patch = 0;
- this.minor = 0;
- this.major++;
- this.inc("pre", identifier, identifierBase);
- break;
- case "preminor":
- this.prerelease.length = 0;
- this.patch = 0;
- this.minor++;
- this.inc("pre", identifier, identifierBase);
- break;
- case "prepatch":
- this.prerelease.length = 0;
- this.inc("patch", identifier, identifierBase);
- this.inc("pre", identifier, identifierBase);
- break;
- case "prerelease":
- if (this.prerelease.length === 0) {
- this.inc("patch", identifier, identifierBase);
- }
- this.inc("pre", identifier, identifierBase);
- break;
- case "release":
- if (this.prerelease.length === 0) {
- throw new Error(`version ${this.raw} is not a prerelease`);
- }
- this.prerelease.length = 0;
- break;
- case "major":
- if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) {
- this.major++;
- }
- this.minor = 0;
- this.patch = 0;
- this.prerelease = [];
- break;
- case "minor":
- if (this.patch !== 0 || this.prerelease.length === 0) {
- this.minor++;
- }
- this.patch = 0;
- this.prerelease = [];
- break;
- case "patch":
- if (this.prerelease.length === 0) {
- this.patch++;
- }
- this.prerelease = [];
- break;
- case "pre": {
- const base = Number(identifierBase) ? 1 : 0;
- if (this.prerelease.length === 0) {
- this.prerelease = [base];
- } else {
- let i = this.prerelease.length;
- while (--i >= 0) {
- if (typeof this.prerelease[i] === "number") {
- this.prerelease[i]++;
- i = -2;
- }
- }
- if (i === -1) {
- if (identifier === this.prerelease.join(".") && identifierBase === false) {
- throw new Error("invalid increment argument: identifier already exists");
- }
- this.prerelease.push(base);
- }
- }
- if (identifier) {
- let prerelease = [identifier, base];
- if (identifierBase === false) {
- prerelease = [identifier];
- }
- if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
- if (isNaN(this.prerelease[1])) {
- this.prerelease = prerelease;
- }
- } else {
- this.prerelease = prerelease;
- }
- }
- break;
- }
- default:
- throw new Error(`invalid increment argument: ${release}`);
- }
- this.raw = this.format();
- if (this.build.length) {
- this.raw += `+${this.build.join(".")}`;
- }
- return this;
- }
- }
- module.exports = SemVer;
-});
-
-// ../eve/node_modules/semver/functions/parse.js
-var require_parse = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var parse = (version2, options2, throwErrors = false) => {
- if (version2 instanceof SemVer) {
- return version2;
- }
- try {
- return new SemVer(version2, options2);
- } catch (er) {
- if (!throwErrors) {
- return null;
- }
- throw er;
- }
- };
- module.exports = parse;
-});
-
-// ../eve/node_modules/semver/functions/valid.js
-var require_valid = __commonJS((exports, module) => {
- var parse = require_parse();
- var valid = (version2, options2) => {
- const v = parse(version2, options2);
- return v ? v.version : null;
- };
- module.exports = valid;
-});
-
-// ../eve/node_modules/semver/functions/clean.js
-var require_clean = __commonJS((exports, module) => {
- var parse = require_parse();
- var clean = (version2, options2) => {
- const s = parse(version2.trim().replace(/^[=v]+/, ""), options2);
- return s ? s.version : null;
- };
- module.exports = clean;
-});
-
-// ../eve/node_modules/semver/functions/inc.js
-var require_inc = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var inc = (version2, release, options2, identifier, identifierBase) => {
- if (typeof options2 === "string") {
- identifierBase = identifier;
- identifier = options2;
- options2 = undefined;
- }
- try {
- return new SemVer(version2 instanceof SemVer ? version2.version : version2, options2).inc(release, identifier, identifierBase).version;
- } catch (er) {
- return null;
- }
- };
- module.exports = inc;
-});
-
-// ../eve/node_modules/semver/functions/diff.js
-var require_diff = __commonJS((exports, module) => {
- var parse = require_parse();
- var diff = (version1, version2) => {
- const v1 = parse(version1, null, true);
- const v2 = parse(version2, null, true);
- const comparison = v1.compare(v2);
- if (comparison === 0) {
- return null;
- }
- const v1Higher = comparison > 0;
- const highVersion = v1Higher ? v1 : v2;
- const lowVersion = v1Higher ? v2 : v1;
- const highHasPre = !!highVersion.prerelease.length;
- const lowHasPre = !!lowVersion.prerelease.length;
- if (lowHasPre && !highHasPre) {
- if (!lowVersion.patch && !lowVersion.minor) {
- return "major";
- }
- if (lowVersion.compareMain(highVersion) === 0) {
- if (lowVersion.minor && !lowVersion.patch) {
- return "minor";
- }
- return "patch";
- }
- }
- const prefix = highHasPre ? "pre" : "";
- if (v1.major !== v2.major) {
- return prefix + "major";
- }
- if (v1.minor !== v2.minor) {
- return prefix + "minor";
- }
- if (v1.patch !== v2.patch) {
- return prefix + "patch";
- }
- return "prerelease";
- };
- module.exports = diff;
-});
-
-// ../eve/node_modules/semver/functions/major.js
-var require_major = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var major = (a, loose) => new SemVer(a, loose).major;
- module.exports = major;
-});
-
-// ../eve/node_modules/semver/functions/minor.js
-var require_minor = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var minor = (a, loose) => new SemVer(a, loose).minor;
- module.exports = minor;
-});
-
-// ../eve/node_modules/semver/functions/patch.js
-var require_patch = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var patch = (a, loose) => new SemVer(a, loose).patch;
- module.exports = patch;
-});
-
-// ../eve/node_modules/semver/functions/prerelease.js
-var require_prerelease = __commonJS((exports, module) => {
- var parse = require_parse();
- var prerelease = (version2, options2) => {
- const parsed = parse(version2, options2);
- return parsed && parsed.prerelease.length ? parsed.prerelease : null;
- };
- module.exports = prerelease;
-});
-
-// ../eve/node_modules/semver/functions/compare.js
-var require_compare = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose));
- module.exports = compare;
-});
-
-// ../eve/node_modules/semver/functions/rcompare.js
-var require_rcompare = __commonJS((exports, module) => {
- var compare = require_compare();
- var rcompare = (a, b, loose) => compare(b, a, loose);
- module.exports = rcompare;
-});
-
-// ../eve/node_modules/semver/functions/compare-loose.js
-var require_compare_loose = __commonJS((exports, module) => {
- var compare = require_compare();
- var compareLoose = (a, b) => compare(a, b, true);
- module.exports = compareLoose;
-});
-
-// ../eve/node_modules/semver/functions/compare-build.js
-var require_compare_build = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var compareBuild = (a, b, loose) => {
- const versionA = new SemVer(a, loose);
- const versionB = new SemVer(b, loose);
- return versionA.compare(versionB) || versionA.compareBuild(versionB);
- };
- module.exports = compareBuild;
-});
-
-// ../eve/node_modules/semver/functions/sort.js
-var require_sort = __commonJS((exports, module) => {
- var compareBuild = require_compare_build();
- var sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose));
- module.exports = sort;
-});
-
-// ../eve/node_modules/semver/functions/rsort.js
-var require_rsort = __commonJS((exports, module) => {
- var compareBuild = require_compare_build();
- var rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose));
- module.exports = rsort;
-});
-
-// ../eve/node_modules/semver/functions/gt.js
-var require_gt = __commonJS((exports, module) => {
- var compare = require_compare();
- var gt2 = (a, b, loose) => compare(a, b, loose) > 0;
- module.exports = gt2;
-});
-
-// ../eve/node_modules/semver/functions/lt.js
-var require_lt = __commonJS((exports, module) => {
- var compare = require_compare();
- var lt2 = (a, b, loose) => compare(a, b, loose) < 0;
- module.exports = lt2;
-});
-
-// ../eve/node_modules/semver/functions/eq.js
-var require_eq = __commonJS((exports, module) => {
- var compare = require_compare();
- var eq2 = (a, b, loose) => compare(a, b, loose) === 0;
- module.exports = eq2;
-});
-
-// ../eve/node_modules/semver/functions/neq.js
-var require_neq = __commonJS((exports, module) => {
- var compare = require_compare();
- var neq = (a, b, loose) => compare(a, b, loose) !== 0;
- module.exports = neq;
-});
-
-// ../eve/node_modules/semver/functions/gte.js
-var require_gte = __commonJS((exports, module) => {
- var compare = require_compare();
- var gte2 = (a, b, loose) => compare(a, b, loose) >= 0;
- module.exports = gte2;
-});
-
-// ../eve/node_modules/semver/functions/lte.js
-var require_lte = __commonJS((exports, module) => {
- var compare = require_compare();
- var lte2 = (a, b, loose) => compare(a, b, loose) <= 0;
- module.exports = lte2;
-});
-
-// ../eve/node_modules/semver/functions/cmp.js
-var require_cmp = __commonJS((exports, module) => {
- var eq2 = require_eq();
- var neq = require_neq();
- var gt2 = require_gt();
- var gte2 = require_gte();
- var lt2 = require_lt();
- var lte2 = require_lte();
- var cmp = (a, op, b, loose) => {
- switch (op) {
- case "===":
- if (typeof a === "object") {
- a = a.version;
- }
- if (typeof b === "object") {
- b = b.version;
- }
- return a === b;
- case "!==":
- if (typeof a === "object") {
- a = a.version;
- }
- if (typeof b === "object") {
- b = b.version;
- }
- return a !== b;
- case "":
- case "=":
- case "==":
- return eq2(a, b, loose);
- case "!=":
- return neq(a, b, loose);
- case ">":
- return gt2(a, b, loose);
- case ">=":
- return gte2(a, b, loose);
- case "<":
- return lt2(a, b, loose);
- case "<=":
- return lte2(a, b, loose);
- default:
- throw new TypeError(`Invalid operator: ${op}`);
- }
- };
- module.exports = cmp;
-});
-
-// ../eve/node_modules/semver/functions/coerce.js
-var require_coerce = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var parse = require_parse();
- var { safeRe: re, t } = require_re();
- var coerce = (version2, options2) => {
- if (version2 instanceof SemVer) {
- return version2;
- }
- if (typeof version2 === "number") {
- version2 = String(version2);
- }
- if (typeof version2 !== "string") {
- return null;
- }
- options2 = options2 || {};
- let match = null;
- if (!options2.rtl) {
- match = version2.match(options2.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]);
- } else {
- const coerceRtlRegex = options2.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL];
- let next;
- while ((next = coerceRtlRegex.exec(version2)) && (!match || match.index + match[0].length !== version2.length)) {
- if (!match || next.index + next[0].length !== match.index + match[0].length) {
- match = next;
- }
- coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length;
- }
- coerceRtlRegex.lastIndex = -1;
- }
- if (match === null) {
- return null;
- }
- const major = match[2];
- const minor = match[3] || "0";
- const patch = match[4] || "0";
- const prerelease = options2.includePrerelease && match[5] ? `-${match[5]}` : "";
- const build = options2.includePrerelease && match[6] ? `+${match[6]}` : "";
- return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options2);
- };
- module.exports = coerce;
-});
-
-// ../eve/node_modules/semver/internal/lrucache.js
-var require_lrucache = __commonJS((exports, module) => {
- class LRUCache {
- constructor() {
- this.max = 1000;
- this.map = new Map;
- }
- get(key) {
- const value = this.map.get(key);
- if (value === undefined) {
- return;
- } else {
- this.map.delete(key);
- this.map.set(key, value);
- return value;
- }
- }
- delete(key) {
- return this.map.delete(key);
- }
- set(key, value) {
- const deleted = this.delete(key);
- if (!deleted && value !== undefined) {
- if (this.map.size >= this.max) {
- const firstKey = this.map.keys().next().value;
- this.delete(firstKey);
- }
- this.map.set(key, value);
- }
- return this;
- }
- }
- module.exports = LRUCache;
-});
-
-// ../eve/node_modules/semver/classes/range.js
-var require_range = __commonJS((exports, module) => {
- var SPACE_CHARACTERS = /\s+/g;
-
- class Range {
- constructor(range, options2) {
- options2 = parseOptions(options2);
- if (range instanceof Range) {
- if (range.loose === !!options2.loose && range.includePrerelease === !!options2.includePrerelease) {
- return range;
- } else {
- return new Range(range.raw, options2);
- }
- }
- if (range instanceof Comparator) {
- this.raw = range.value;
- this.set = [[range]];
- this.formatted = undefined;
- return this;
- }
- this.options = options2;
- this.loose = !!options2.loose;
- this.includePrerelease = !!options2.includePrerelease;
- this.raw = range.trim().replace(SPACE_CHARACTERS, " ");
- this.set = this.raw.split("||").map((r) => this.parseRange(r.trim())).filter((c) => c.length);
- if (!this.set.length) {
- throw new TypeError(`Invalid SemVer Range: ${this.raw}`);
- }
- if (this.set.length > 1) {
- const first = this.set[0];
- this.set = this.set.filter((c) => !isNullSet(c[0]));
- if (this.set.length === 0) {
- this.set = [first];
- } else if (this.set.length > 1) {
- for (const c of this.set) {
- if (c.length === 1 && isAny(c[0])) {
- this.set = [c];
- break;
- }
- }
- }
- }
- this.formatted = undefined;
- }
- get range() {
- if (this.formatted === undefined) {
- this.formatted = "";
- for (let i = 0;i < this.set.length; i++) {
- if (i > 0) {
- this.formatted += "||";
- }
- const comps = this.set[i];
- for (let k = 0;k < comps.length; k++) {
- if (k > 0) {
- this.formatted += " ";
- }
- this.formatted += comps[k].toString().trim();
- }
- }
- }
- return this.formatted;
- }
- format() {
- return this.range;
- }
- toString() {
- return this.range;
- }
- parseRange(range) {
- const memoOpts = (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | (this.options.loose && FLAG_LOOSE);
- const memoKey = memoOpts + ":" + range;
- const cached = cache.get(memoKey);
- if (cached) {
- return cached;
- }
- const loose = this.options.loose;
- const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE];
- range = range.replace(hr, hyphenReplace(this.options.includePrerelease));
- debug("hyphen replace", range);
- range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace);
- debug("comparator trim", range);
- range = range.replace(re[t.TILDETRIM], tildeTrimReplace);
- debug("tilde trim", range);
- range = range.replace(re[t.CARETTRIM], caretTrimReplace);
- debug("caret trim", range);
- let rangeList = range.split(" ").map((comp) => parseComparator(comp, this.options)).join(" ").split(/\s+/).map((comp) => replaceGTE0(comp, this.options));
- if (loose) {
- rangeList = rangeList.filter((comp) => {
- debug("loose invalid filter", comp, this.options);
- return !!comp.match(re[t.COMPARATORLOOSE]);
- });
- }
- debug("range list", rangeList);
- const rangeMap = new Map;
- const comparators = rangeList.map((comp) => new Comparator(comp, this.options));
- for (const comp of comparators) {
- if (isNullSet(comp)) {
- return [comp];
- }
- rangeMap.set(comp.value, comp);
- }
- if (rangeMap.size > 1 && rangeMap.has("")) {
- rangeMap.delete("");
- }
- const result = [...rangeMap.values()];
- cache.set(memoKey, result);
- return result;
- }
- intersects(range, options2) {
- if (!(range instanceof Range)) {
- throw new TypeError("a Range is required");
- }
- return this.set.some((thisComparators) => {
- return isSatisfiable(thisComparators, options2) && range.set.some((rangeComparators) => {
- return isSatisfiable(rangeComparators, options2) && thisComparators.every((thisComparator) => {
- return rangeComparators.every((rangeComparator) => {
- return thisComparator.intersects(rangeComparator, options2);
- });
- });
- });
- });
- }
- test(version2) {
- if (!version2) {
- return false;
- }
- if (typeof version2 === "string") {
- try {
- version2 = new SemVer(version2, this.options);
- } catch (er) {
- return false;
- }
- }
- for (let i = 0;i < this.set.length; i++) {
- if (testSet(this.set[i], version2, this.options)) {
- return true;
- }
- }
- return false;
- }
- }
- module.exports = Range;
- var LRU = require_lrucache();
- var cache = new LRU;
- var parseOptions = require_parse_options();
- var Comparator = require_comparator();
- var debug = require_debug();
- var SemVer = require_semver();
- var {
- safeRe: re,
- t,
- comparatorTrimReplace,
- tildeTrimReplace,
- caretTrimReplace
- } = require_re();
- var { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require_constants();
- var isNullSet = (c) => c.value === "<0.0.0-0";
- var isAny = (c) => c.value === "";
- var isSatisfiable = (comparators, options2) => {
- let result = true;
- const remainingComparators = comparators.slice();
- let testComparator = remainingComparators.pop();
- while (result && remainingComparators.length) {
- result = remainingComparators.every((otherComparator) => {
- return testComparator.intersects(otherComparator, options2);
- });
- testComparator = remainingComparators.pop();
- }
- return result;
- };
- var parseComparator = (comp, options2) => {
- debug("comp", comp, options2);
- comp = replaceCarets(comp, options2);
- debug("caret", comp);
- comp = replaceTildes(comp, options2);
- debug("tildes", comp);
- comp = replaceXRanges(comp, options2);
- debug("xrange", comp);
- comp = replaceStars(comp, options2);
- debug("stars", comp);
- return comp;
- };
- var isX = (id) => !id || id.toLowerCase() === "x" || id === "*";
- var replaceTildes = (comp, options2) => {
- return comp.trim().split(/\s+/).map((c) => replaceTilde(c, options2)).join(" ");
- };
- var replaceTilde = (comp, options2) => {
- const r = options2.loose ? re[t.TILDELOOSE] : re[t.TILDE];
- return comp.replace(r, (_, M, m, p, pr) => {
- debug("tilde", comp, _, M, m, p, pr);
- let ret;
- if (isX(M)) {
- ret = "";
- } else if (isX(m)) {
- ret = `>=${M}.0.0 <${+M + 1}.0.0-0`;
- } else if (isX(p)) {
- ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;
- } else if (pr) {
- debug("replaceTilde pr", pr);
- ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
- } else {
- ret = `>=${M}.${m}.${p} <${M}.${+m + 1}.0-0`;
- }
- debug("tilde return", ret);
- return ret;
- });
- };
- var replaceCarets = (comp, options2) => {
- return comp.trim().split(/\s+/).map((c) => replaceCaret(c, options2)).join(" ");
- };
- var replaceCaret = (comp, options2) => {
- debug("caret", comp, options2);
- const r = options2.loose ? re[t.CARETLOOSE] : re[t.CARET];
- const z = options2.includePrerelease ? "-0" : "";
- return comp.replace(r, (_, M, m, p, pr) => {
- debug("caret", comp, _, M, m, p, pr);
- let ret;
- if (isX(M)) {
- ret = "";
- } else if (isX(m)) {
- ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`;
- } else if (isX(p)) {
- if (M === "0") {
- ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`;
- } else {
- ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`;
- }
- } else if (pr) {
- debug("replaceCaret pr", pr);
- if (M === "0") {
- if (m === "0") {
- ret = `>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p + 1}-0`;
- } else {
- ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
- }
- } else {
- ret = `>=${M}.${m}.${p}-${pr} <${+M + 1}.0.0-0`;
- }
- } else {
- debug("no pr");
- if (M === "0") {
- if (m === "0") {
- ret = `>=${M}.${m}.${p}${z} <${M}.${m}.${+p + 1}-0`;
- } else {
- ret = `>=${M}.${m}.${p}${z} <${M}.${+m + 1}.0-0`;
- }
- } else {
- ret = `>=${M}.${m}.${p} <${+M + 1}.0.0-0`;
- }
- }
- debug("caret return", ret);
- return ret;
- });
- };
- var replaceXRanges = (comp, options2) => {
- debug("replaceXRanges", comp, options2);
- return comp.split(/\s+/).map((c) => replaceXRange(c, options2)).join(" ");
- };
- var replaceXRange = (comp, options2) => {
- comp = comp.trim();
- const r = options2.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];
- return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
- debug("xRange", comp, ret, gtlt, M, m, p, pr);
- const xM = isX(M);
- const xm = xM || isX(m);
- const xp = xm || isX(p);
- const anyX = xp;
- if (gtlt === "=" && anyX) {
- gtlt = "";
- }
- pr = options2.includePrerelease ? "-0" : "";
- if (xM) {
- if (gtlt === ">" || gtlt === "<") {
- ret = "<0.0.0-0";
- } else {
- ret = "*";
- }
- } else if (gtlt && anyX) {
- if (xm) {
- m = 0;
- }
- p = 0;
- if (gtlt === ">") {
- gtlt = ">=";
- if (xm) {
- M = +M + 1;
- m = 0;
- p = 0;
- } else {
- m = +m + 1;
- p = 0;
- }
- } else if (gtlt === "<=") {
- gtlt = "<";
- if (xm) {
- M = +M + 1;
- } else {
- m = +m + 1;
- }
- }
- if (gtlt === "<") {
- pr = "-0";
- }
- ret = `${gtlt + M}.${m}.${p}${pr}`;
- } else if (xm) {
- ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`;
- } else if (xp) {
- ret = `>=${M}.${m}.0${pr} <${M}.${+m + 1}.0-0`;
- }
- debug("xRange return", ret);
- return ret;
- });
- };
- var replaceStars = (comp, options2) => {
- debug("replaceStars", comp, options2);
- return comp.trim().replace(re[t.STAR], "");
- };
- var replaceGTE0 = (comp, options2) => {
- debug("replaceGTE0", comp, options2);
- return comp.trim().replace(re[options2.includePrerelease ? t.GTE0PRE : t.GTE0], "");
- };
- var hyphenReplace = (incPr) => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr) => {
- if (isX(fM)) {
- from = "";
- } else if (isX(fm)) {
- from = `>=${fM}.0.0${incPr ? "-0" : ""}`;
- } else if (isX(fp)) {
- from = `>=${fM}.${fm}.0${incPr ? "-0" : ""}`;
- } else if (fpr) {
- from = `>=${from}`;
- } else {
- from = `>=${from}${incPr ? "-0" : ""}`;
- }
- if (isX(tM)) {
- to = "";
- } else if (isX(tm)) {
- to = `<${+tM + 1}.0.0-0`;
- } else if (isX(tp)) {
- to = `<${tM}.${+tm + 1}.0-0`;
- } else if (tpr) {
- to = `<=${tM}.${tm}.${tp}-${tpr}`;
- } else if (incPr) {
- to = `<${tM}.${tm}.${+tp + 1}-0`;
- } else {
- to = `<=${to}`;
- }
- return `${from} ${to}`.trim();
- };
- var testSet = (set, version2, options2) => {
- for (let i = 0;i < set.length; i++) {
- if (!set[i].test(version2)) {
- return false;
- }
- }
- if (version2.prerelease.length && !options2.includePrerelease) {
- for (let i = 0;i < set.length; i++) {
- debug(set[i].semver);
- if (set[i].semver === Comparator.ANY) {
- continue;
- }
- if (set[i].semver.prerelease.length > 0) {
- const allowed = set[i].semver;
- if (allowed.major === version2.major && allowed.minor === version2.minor && allowed.patch === version2.patch) {
- return true;
- }
- }
- }
- return false;
- }
- return true;
- };
-});
-
-// ../eve/node_modules/semver/classes/comparator.js
-var require_comparator = __commonJS((exports, module) => {
- var ANY = Symbol("SemVer ANY");
-
- class Comparator {
- static get ANY() {
- return ANY;
- }
- constructor(comp, options2) {
- options2 = parseOptions(options2);
- if (comp instanceof Comparator) {
- if (comp.loose === !!options2.loose) {
- return comp;
- } else {
- comp = comp.value;
- }
- }
- comp = comp.trim().split(/\s+/).join(" ");
- debug("comparator", comp, options2);
- this.options = options2;
- this.loose = !!options2.loose;
- this.parse(comp);
- if (this.semver === ANY) {
- this.value = "";
- } else {
- this.value = this.operator + this.semver.version;
- }
- debug("comp", this);
- }
- parse(comp) {
- const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR];
- const m = comp.match(r);
- if (!m) {
- throw new TypeError(`Invalid comparator: ${comp}`);
- }
- this.operator = m[1] !== undefined ? m[1] : "";
- if (this.operator === "=") {
- this.operator = "";
- }
- if (!m[2]) {
- this.semver = ANY;
- } else {
- this.semver = new SemVer(m[2], this.options.loose);
- }
- }
- toString() {
- return this.value;
- }
- test(version2) {
- debug("Comparator.test", version2, this.options.loose);
- if (this.semver === ANY || version2 === ANY) {
- return true;
- }
- if (typeof version2 === "string") {
- try {
- version2 = new SemVer(version2, this.options);
- } catch (er) {
- return false;
- }
- }
- return cmp(version2, this.operator, this.semver, this.options);
- }
- intersects(comp, options2) {
- if (!(comp instanceof Comparator)) {
- throw new TypeError("a Comparator is required");
- }
- if (this.operator === "") {
- if (this.value === "") {
- return true;
- }
- return new Range(comp.value, options2).test(this.value);
- } else if (comp.operator === "") {
- if (comp.value === "") {
- return true;
- }
- return new Range(this.value, options2).test(comp.semver);
- }
- options2 = parseOptions(options2);
- if (options2.includePrerelease && (this.value === "<0.0.0-0" || comp.value === "<0.0.0-0")) {
- return false;
- }
- if (!options2.includePrerelease && (this.value.startsWith("<0.0.0") || comp.value.startsWith("<0.0.0"))) {
- return false;
- }
- if (this.operator.startsWith(">") && comp.operator.startsWith(">")) {
- return true;
- }
- if (this.operator.startsWith("<") && comp.operator.startsWith("<")) {
- return true;
- }
- if (this.semver.version === comp.semver.version && this.operator.includes("=") && comp.operator.includes("=")) {
- return true;
- }
- if (cmp(this.semver, "<", comp.semver, options2) && this.operator.startsWith(">") && comp.operator.startsWith("<")) {
- return true;
- }
- if (cmp(this.semver, ">", comp.semver, options2) && this.operator.startsWith("<") && comp.operator.startsWith(">")) {
- return true;
- }
- return false;
- }
- }
- module.exports = Comparator;
- var parseOptions = require_parse_options();
- var { safeRe: re, t } = require_re();
- var cmp = require_cmp();
- var debug = require_debug();
- var SemVer = require_semver();
- var Range = require_range();
-});
-
-// ../eve/node_modules/semver/functions/satisfies.js
-var require_satisfies = __commonJS((exports, module) => {
- var Range = require_range();
- var satisfies = (version2, range, options2) => {
- try {
- range = new Range(range, options2);
- } catch (er) {
- return false;
- }
- return range.test(version2);
- };
- module.exports = satisfies;
-});
-
-// ../eve/node_modules/semver/ranges/to-comparators.js
-var require_to_comparators = __commonJS((exports, module) => {
- var Range = require_range();
- var toComparators = (range, options2) => new Range(range, options2).set.map((comp) => comp.map((c) => c.value).join(" ").trim().split(" "));
- module.exports = toComparators;
-});
-
-// ../eve/node_modules/semver/ranges/max-satisfying.js
-var require_max_satisfying = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Range = require_range();
- var maxSatisfying = (versions, range, options2) => {
- let max = null;
- let maxSV = null;
- let rangeObj = null;
- try {
- rangeObj = new Range(range, options2);
- } catch (er) {
- return null;
- }
- versions.forEach((v) => {
- if (rangeObj.test(v)) {
- if (!max || maxSV.compare(v) === -1) {
- max = v;
- maxSV = new SemVer(max, options2);
- }
- }
- });
- return max;
- };
- module.exports = maxSatisfying;
-});
-
-// ../eve/node_modules/semver/ranges/min-satisfying.js
-var require_min_satisfying = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Range = require_range();
- var minSatisfying = (versions, range, options2) => {
- let min = null;
- let minSV = null;
- let rangeObj = null;
- try {
- rangeObj = new Range(range, options2);
- } catch (er) {
- return null;
- }
- versions.forEach((v) => {
- if (rangeObj.test(v)) {
- if (!min || minSV.compare(v) === 1) {
- min = v;
- minSV = new SemVer(min, options2);
- }
- }
- });
- return min;
- };
- module.exports = minSatisfying;
-});
-
-// ../eve/node_modules/semver/ranges/min-version.js
-var require_min_version = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Range = require_range();
- var gt2 = require_gt();
- var minVersion = (range, loose) => {
- range = new Range(range, loose);
- let minver = new SemVer("0.0.0");
- if (range.test(minver)) {
- return minver;
- }
- minver = new SemVer("0.0.0-0");
- if (range.test(minver)) {
- return minver;
- }
- minver = null;
- for (let i = 0;i < range.set.length; ++i) {
- const comparators = range.set[i];
- let setMin = null;
- comparators.forEach((comparator) => {
- const compver = new SemVer(comparator.semver.version);
- switch (comparator.operator) {
- case ">":
- if (compver.prerelease.length === 0) {
- compver.patch++;
- } else {
- compver.prerelease.push(0);
- }
- compver.raw = compver.format();
- case "":
- case ">=":
- if (!setMin || gt2(compver, setMin)) {
- setMin = compver;
- }
- break;
- case "<":
- case "<=":
- break;
- default:
- throw new Error(`Unexpected operation: ${comparator.operator}`);
- }
- });
- if (setMin && (!minver || gt2(minver, setMin))) {
- minver = setMin;
- }
- }
- if (minver && range.test(minver)) {
- return minver;
- }
- return null;
- };
- module.exports = minVersion;
-});
-
-// ../eve/node_modules/semver/ranges/valid.js
-var require_valid2 = __commonJS((exports, module) => {
- var Range = require_range();
- var validRange = (range, options2) => {
- try {
- return new Range(range, options2).range || "*";
- } catch (er) {
- return null;
- }
- };
- module.exports = validRange;
-});
-
-// ../eve/node_modules/semver/ranges/outside.js
-var require_outside = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Comparator = require_comparator();
- var { ANY } = Comparator;
- var Range = require_range();
- var satisfies = require_satisfies();
- var gt2 = require_gt();
- var lt2 = require_lt();
- var lte2 = require_lte();
- var gte2 = require_gte();
- var outside = (version2, range, hilo, options2) => {
- version2 = new SemVer(version2, options2);
- range = new Range(range, options2);
- let gtfn, ltefn, ltfn, comp, ecomp;
- switch (hilo) {
- case ">":
- gtfn = gt2;
- ltefn = lte2;
- ltfn = lt2;
- comp = ">";
- ecomp = ">=";
- break;
- case "<":
- gtfn = lt2;
- ltefn = gte2;
- ltfn = gt2;
- comp = "<";
- ecomp = "<=";
- break;
- default:
- throw new TypeError('Must provide a hilo val of "<" or ">"');
- }
- if (satisfies(version2, range, options2)) {
- return false;
- }
- for (let i = 0;i < range.set.length; ++i) {
- const comparators = range.set[i];
- let high = null;
- let low = null;
- comparators.forEach((comparator) => {
- if (comparator.semver === ANY) {
- comparator = new Comparator(">=0.0.0");
- }
- high = high || comparator;
- low = low || comparator;
- if (gtfn(comparator.semver, high.semver, options2)) {
- high = comparator;
- } else if (ltfn(comparator.semver, low.semver, options2)) {
- low = comparator;
- }
- });
- if (high.operator === comp || high.operator === ecomp) {
- return false;
- }
- if ((!low.operator || low.operator === comp) && ltefn(version2, low.semver)) {
- return false;
- } else if (low.operator === ecomp && ltfn(version2, low.semver)) {
- return false;
- }
- }
- return true;
- };
- module.exports = outside;
-});
-
-// ../eve/node_modules/semver/ranges/gtr.js
-var require_gtr = __commonJS((exports, module) => {
- var outside = require_outside();
- var gtr = (version2, range, options2) => outside(version2, range, ">", options2);
- module.exports = gtr;
-});
-
-// ../eve/node_modules/semver/ranges/ltr.js
-var require_ltr = __commonJS((exports, module) => {
- var outside = require_outside();
- var ltr = (version2, range, options2) => outside(version2, range, "<", options2);
- module.exports = ltr;
-});
-
-// ../eve/node_modules/semver/ranges/intersects.js
-var require_intersects = __commonJS((exports, module) => {
- var Range = require_range();
- var intersects = (r1, r2, options2) => {
- r1 = new Range(r1, options2);
- r2 = new Range(r2, options2);
- return r1.intersects(r2, options2);
- };
- module.exports = intersects;
-});
-
-// ../eve/node_modules/semver/ranges/simplify.js
-var require_simplify = __commonJS((exports, module) => {
- var satisfies = require_satisfies();
- var compare = require_compare();
- module.exports = (versions, range, options2) => {
- const set = [];
- let first = null;
- let prev = null;
- const v = versions.sort((a, b) => compare(a, b, options2));
- for (const version2 of v) {
- const included = satisfies(version2, range, options2);
- if (included) {
- prev = version2;
- if (!first) {
- first = version2;
- }
- } else {
- if (prev) {
- set.push([first, prev]);
- }
- prev = null;
- first = null;
- }
- }
- if (first) {
- set.push([first, null]);
- }
- const ranges = [];
- for (const [min, max] of set) {
- if (min === max) {
- ranges.push(min);
- } else if (!max && min === v[0]) {
- ranges.push("*");
- } else if (!max) {
- ranges.push(`>=${min}`);
- } else if (min === v[0]) {
- ranges.push(`<=${max}`);
- } else {
- ranges.push(`${min} - ${max}`);
- }
- }
- const simplified = ranges.join(" || ");
- const original = typeof range.raw === "string" ? range.raw : String(range);
- return simplified.length < original.length ? simplified : range;
- };
-});
-
-// ../eve/node_modules/semver/ranges/subset.js
-var require_subset = __commonJS((exports, module) => {
- var Range = require_range();
- var Comparator = require_comparator();
- var { ANY } = Comparator;
- var satisfies = require_satisfies();
- var compare = require_compare();
- var subset = (sub, dom, options2 = {}) => {
- if (sub === dom) {
- return true;
- }
- sub = new Range(sub, options2);
- dom = new Range(dom, options2);
- let sawNonNull = false;
- OUTER:
- for (const simpleSub of sub.set) {
- for (const simpleDom of dom.set) {
- const isSub = simpleSubset(simpleSub, simpleDom, options2);
- sawNonNull = sawNonNull || isSub !== null;
- if (isSub) {
- continue OUTER;
- }
- }
- if (sawNonNull) {
- return false;
- }
- }
- return true;
- };
- var minimumVersionWithPreRelease = [new Comparator(">=0.0.0-0")];
- var minimumVersion = [new Comparator(">=0.0.0")];
- var simpleSubset = (sub, dom, options2) => {
- if (sub === dom) {
- return true;
- }
- if (sub.length === 1 && sub[0].semver === ANY) {
- if (dom.length === 1 && dom[0].semver === ANY) {
- return true;
- } else if (options2.includePrerelease) {
- sub = minimumVersionWithPreRelease;
- } else {
- sub = minimumVersion;
- }
- }
- if (dom.length === 1 && dom[0].semver === ANY) {
- if (options2.includePrerelease) {
- return true;
- } else {
- dom = minimumVersion;
- }
- }
- const eqSet = new Set;
- let gt2, lt2;
- for (const c of sub) {
- if (c.operator === ">" || c.operator === ">=") {
- gt2 = higherGT(gt2, c, options2);
- } else if (c.operator === "<" || c.operator === "<=") {
- lt2 = lowerLT(lt2, c, options2);
- } else {
- eqSet.add(c.semver);
- }
- }
- if (eqSet.size > 1) {
- return null;
- }
- let gtltComp;
- if (gt2 && lt2) {
- gtltComp = compare(gt2.semver, lt2.semver, options2);
- if (gtltComp > 0) {
- return null;
- } else if (gtltComp === 0 && (gt2.operator !== ">=" || lt2.operator !== "<=")) {
- return null;
- }
- }
- for (const eq2 of eqSet) {
- if (gt2 && !satisfies(eq2, String(gt2), options2)) {
- return null;
- }
- if (lt2 && !satisfies(eq2, String(lt2), options2)) {
- return null;
- }
- for (const c of dom) {
- if (!satisfies(eq2, String(c), options2)) {
- return false;
- }
- }
- return true;
- }
- let higher, lower;
- let hasDomLT, hasDomGT;
- let needDomLTPre = lt2 && !options2.includePrerelease && lt2.semver.prerelease.length ? lt2.semver : false;
- let needDomGTPre = gt2 && !options2.includePrerelease && gt2.semver.prerelease.length ? gt2.semver : false;
- if (needDomLTPre && needDomLTPre.prerelease.length === 1 && lt2.operator === "<" && needDomLTPre.prerelease[0] === 0) {
- needDomLTPre = false;
- }
- for (const c of dom) {
- hasDomGT = hasDomGT || c.operator === ">" || c.operator === ">=";
- hasDomLT = hasDomLT || c.operator === "<" || c.operator === "<=";
- if (gt2) {
- if (needDomGTPre) {
- if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomGTPre.major && c.semver.minor === needDomGTPre.minor && c.semver.patch === needDomGTPre.patch) {
- needDomGTPre = false;
- }
- }
- if (c.operator === ">" || c.operator === ">=") {
- higher = higherGT(gt2, c, options2);
- if (higher === c && higher !== gt2) {
- return false;
- }
- } else if (gt2.operator === ">=" && !satisfies(gt2.semver, String(c), options2)) {
- return false;
- }
- }
- if (lt2) {
- if (needDomLTPre) {
- if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomLTPre.major && c.semver.minor === needDomLTPre.minor && c.semver.patch === needDomLTPre.patch) {
- needDomLTPre = false;
- }
- }
- if (c.operator === "<" || c.operator === "<=") {
- lower = lowerLT(lt2, c, options2);
- if (lower === c && lower !== lt2) {
- return false;
- }
- } else if (lt2.operator === "<=" && !satisfies(lt2.semver, String(c), options2)) {
- return false;
- }
- }
- if (!c.operator && (lt2 || gt2) && gtltComp !== 0) {
- return false;
- }
- }
- if (gt2 && hasDomLT && !lt2 && gtltComp !== 0) {
- return false;
- }
- if (lt2 && hasDomGT && !gt2 && gtltComp !== 0) {
- return false;
- }
- if (needDomGTPre || needDomLTPre) {
- return false;
- }
- return true;
- };
- var higherGT = (a, b, options2) => {
- if (!a) {
- return b;
- }
- const comp = compare(a.semver, b.semver, options2);
- return comp > 0 ? a : comp < 0 ? b : b.operator === ">" && a.operator === ">=" ? b : a;
- };
- var lowerLT = (a, b, options2) => {
- if (!a) {
- return b;
- }
- const comp = compare(a.semver, b.semver, options2);
- return comp < 0 ? a : comp > 0 ? b : b.operator === "<" && a.operator === "<=" ? b : a;
- };
- module.exports = subset;
-});
-
-// ../eve/node_modules/semver/index.js
-var require_semver2 = __commonJS((exports, module) => {
- var internalRe = require_re();
- var constants = require_constants();
- var SemVer = require_semver();
- var identifiers = require_identifiers();
- var parse = require_parse();
- var valid = require_valid();
- var clean = require_clean();
- var inc = require_inc();
- var diff = require_diff();
- var major = require_major();
- var minor = require_minor();
- var patch = require_patch();
- var prerelease = require_prerelease();
- var compare = require_compare();
- var rcompare = require_rcompare();
- var compareLoose = require_compare_loose();
- var compareBuild = require_compare_build();
- var sort = require_sort();
- var rsort = require_rsort();
- var gt2 = require_gt();
- var lt2 = require_lt();
- var eq2 = require_eq();
- var neq = require_neq();
- var gte2 = require_gte();
- var lte2 = require_lte();
- var cmp = require_cmp();
- var coerce = require_coerce();
- var Comparator = require_comparator();
- var Range = require_range();
- var satisfies = require_satisfies();
- var toComparators = require_to_comparators();
- var maxSatisfying = require_max_satisfying();
- var minSatisfying = require_min_satisfying();
- var minVersion = require_min_version();
- var validRange = require_valid2();
- var outside = require_outside();
- var gtr = require_gtr();
- var ltr = require_ltr();
- var intersects = require_intersects();
- var simplifyRange = require_simplify();
- var subset = require_subset();
- module.exports = {
- parse,
- valid,
- clean,
- inc,
- diff,
- major,
- minor,
- patch,
- prerelease,
- compare,
- rcompare,
- compareLoose,
- compareBuild,
- sort,
- rsort,
- gt: gt2,
- lt: lt2,
- eq: eq2,
- neq,
- gte: gte2,
- lte: lte2,
- cmp,
- coerce,
- Comparator,
- Range,
- satisfies,
- toComparators,
- maxSatisfying,
- minSatisfying,
- minVersion,
- validRange,
- outside,
- gtr,
- ltr,
- intersects,
- simplifyRange,
- subset,
- SemVer,
- re: internalRe.re,
- src: internalRe.src,
- tokens: internalRe.t,
- SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,
- RELEASE_TYPES: constants.RELEASE_TYPES,
- compareIdentifiers: identifiers.compareIdentifiers,
- rcompareIdentifiers: identifiers.rcompareIdentifiers
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/asymmetricKeyDetailsSupported.js
-var require_asymmetricKeyDetailsSupported = __commonJS((exports, module) => {
- var semver = require_semver2();
- module.exports = semver.satisfies(process.version, ">=15.7.0");
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/rsaPssKeyDetailsSupported.js
-var require_rsaPssKeyDetailsSupported = __commonJS((exports, module) => {
- var semver = require_semver2();
- module.exports = semver.satisfies(process.version, ">=16.9.0");
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/validateAsymmetricKey.js
-var require_validateAsymmetricKey = __commonJS((exports, module) => {
- var ASYMMETRIC_KEY_DETAILS_SUPPORTED = require_asymmetricKeyDetailsSupported();
- var RSA_PSS_KEY_DETAILS_SUPPORTED = require_rsaPssKeyDetailsSupported();
- var allowedAlgorithmsForKeys = {
- ec: ["ES256", "ES384", "ES512"],
- rsa: ["RS256", "PS256", "RS384", "PS384", "RS512", "PS512"],
- "rsa-pss": ["PS256", "PS384", "PS512"]
- };
- var allowedCurves = {
- ES256: "prime256v1",
- ES384: "secp384r1",
- ES512: "secp521r1"
- };
- module.exports = function(algorithm, key) {
- if (!algorithm || !key)
- return;
- const keyType = key.asymmetricKeyType;
- if (!keyType)
- return;
- const allowedAlgorithms = allowedAlgorithmsForKeys[keyType];
- if (!allowedAlgorithms) {
- throw new Error(`Unknown key type "${keyType}".`);
- }
- if (!allowedAlgorithms.includes(algorithm)) {
- throw new Error(`"alg" parameter for "${keyType}" key type must be one of: ${allowedAlgorithms.join(", ")}.`);
- }
- if (ASYMMETRIC_KEY_DETAILS_SUPPORTED) {
- switch (keyType) {
- case "ec":
- const keyCurve = key.asymmetricKeyDetails.namedCurve;
- const allowedCurve = allowedCurves[algorithm];
- if (keyCurve !== allowedCurve) {
- throw new Error(`"alg" parameter "${algorithm}" requires curve "${allowedCurve}".`);
- }
- break;
- case "rsa-pss":
- if (RSA_PSS_KEY_DETAILS_SUPPORTED) {
- const length = parseInt(algorithm.slice(-3), 10);
- const { hashAlgorithm, mgf1HashAlgorithm, saltLength } = key.asymmetricKeyDetails;
- if (hashAlgorithm !== `sha${length}` || mgf1HashAlgorithm !== hashAlgorithm) {
- throw new Error(`Invalid key for this operation, its RSA-PSS parameters do not meet the requirements of "alg" ${algorithm}.`);
- }
- if (saltLength !== undefined && saltLength > length >> 3) {
- throw new Error(`Invalid key for this operation, its RSA-PSS parameter saltLength does not meet the requirements of "alg" ${algorithm}.`);
- }
- }
- break;
- }
- }
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/psSupported.js
-var require_psSupported = __commonJS((exports, module) => {
- var semver = require_semver2();
- module.exports = semver.satisfies(process.version, "^6.12.0 || >=8.0.0");
-});
-
-// ../eve/node_modules/jsonwebtoken/verify.js
-var require_verify = __commonJS((exports, module) => {
- var JsonWebTokenError = require_JsonWebTokenError();
- var NotBeforeError = require_NotBeforeError();
- var TokenExpiredError = require_TokenExpiredError();
- var decode = require_decode();
- var timespan = require_timespan();
- var validateAsymmetricKey = require_validateAsymmetricKey();
- var PS_SUPPORTED = require_psSupported();
- var jws = require_jws();
- var { KeyObject, createSecretKey, createPublicKey } = __require("crypto");
- var PUB_KEY_ALGS = ["RS256", "RS384", "RS512"];
- var EC_KEY_ALGS = ["ES256", "ES384", "ES512"];
- var RSA_KEY_ALGS = ["RS256", "RS384", "RS512"];
- var HS_ALGS = ["HS256", "HS384", "HS512"];
- if (PS_SUPPORTED) {
- PUB_KEY_ALGS.splice(PUB_KEY_ALGS.length, 0, "PS256", "PS384", "PS512");
- RSA_KEY_ALGS.splice(RSA_KEY_ALGS.length, 0, "PS256", "PS384", "PS512");
- }
- module.exports = function(jwtString, secretOrPublicKey, options2, callback) {
- if (typeof options2 === "function" && !callback) {
- callback = options2;
- options2 = {};
- }
- if (!options2) {
- options2 = {};
- }
- options2 = Object.assign({}, options2);
- let done;
- if (callback) {
- done = callback;
- } else {
- done = function(err, data) {
- if (err)
- throw err;
- return data;
- };
- }
- if (options2.clockTimestamp && typeof options2.clockTimestamp !== "number") {
- return done(new JsonWebTokenError("clockTimestamp must be a number"));
- }
- if (options2.nonce !== undefined && (typeof options2.nonce !== "string" || options2.nonce.trim() === "")) {
- return done(new JsonWebTokenError("nonce must be a non-empty string"));
- }
- if (options2.allowInvalidAsymmetricKeyTypes !== undefined && typeof options2.allowInvalidAsymmetricKeyTypes !== "boolean") {
- return done(new JsonWebTokenError("allowInvalidAsymmetricKeyTypes must be a boolean"));
- }
- const clockTimestamp = options2.clockTimestamp || Math.floor(Date.now() / 1000);
- if (!jwtString) {
- return done(new JsonWebTokenError("jwt must be provided"));
- }
- if (typeof jwtString !== "string") {
- return done(new JsonWebTokenError("jwt must be a string"));
- }
- const parts = jwtString.split(".");
- if (parts.length !== 3) {
- return done(new JsonWebTokenError("jwt malformed"));
- }
- let decodedToken;
- try {
- decodedToken = decode(jwtString, { complete: true });
- } catch (err) {
- return done(err);
- }
- if (!decodedToken) {
- return done(new JsonWebTokenError("invalid token"));
- }
- const header = decodedToken.header;
- let getSecret;
- if (typeof secretOrPublicKey === "function") {
- if (!callback) {
- return done(new JsonWebTokenError("verify must be called asynchronous if secret or public key is provided as a callback"));
- }
- getSecret = secretOrPublicKey;
- } else {
- getSecret = function(header2, secretCallback) {
- return secretCallback(null, secretOrPublicKey);
- };
- }
- return getSecret(header, function(err, secretOrPublicKey2) {
- if (err) {
- return done(new JsonWebTokenError("error in secret or public key callback: " + err.message));
- }
- const hasSignature = parts[2].trim() !== "";
- if (!hasSignature && secretOrPublicKey2) {
- return done(new JsonWebTokenError("jwt signature is required"));
- }
- if (hasSignature && !secretOrPublicKey2) {
- return done(new JsonWebTokenError("secret or public key must be provided"));
- }
- if (!hasSignature && !options2.algorithms) {
- return done(new JsonWebTokenError('please specify "none" in "algorithms" to verify unsigned tokens'));
- }
- if (secretOrPublicKey2 != null && !(secretOrPublicKey2 instanceof KeyObject)) {
- try {
- secretOrPublicKey2 = createPublicKey(secretOrPublicKey2);
- } catch (_) {
- try {
- secretOrPublicKey2 = createSecretKey(typeof secretOrPublicKey2 === "string" ? Buffer.from(secretOrPublicKey2) : secretOrPublicKey2);
- } catch (_2) {
- return done(new JsonWebTokenError("secretOrPublicKey is not valid key material"));
- }
- }
- }
- if (!options2.algorithms) {
- if (secretOrPublicKey2.type === "secret") {
- options2.algorithms = HS_ALGS;
- } else if (["rsa", "rsa-pss"].includes(secretOrPublicKey2.asymmetricKeyType)) {
- options2.algorithms = RSA_KEY_ALGS;
- } else if (secretOrPublicKey2.asymmetricKeyType === "ec") {
- options2.algorithms = EC_KEY_ALGS;
- } else {
- options2.algorithms = PUB_KEY_ALGS;
- }
- }
- if (options2.algorithms.indexOf(decodedToken.header.alg) === -1) {
- return done(new JsonWebTokenError("invalid algorithm"));
- }
- if (header.alg.startsWith("HS") && secretOrPublicKey2.type !== "secret") {
- return done(new JsonWebTokenError(`secretOrPublicKey must be a symmetric key when using ${header.alg}`));
- } else if (/^(?:RS|PS|ES)/.test(header.alg) && secretOrPublicKey2.type !== "public") {
- return done(new JsonWebTokenError(`secretOrPublicKey must be an asymmetric key when using ${header.alg}`));
- }
- if (!options2.allowInvalidAsymmetricKeyTypes) {
- try {
- validateAsymmetricKey(header.alg, secretOrPublicKey2);
- } catch (e) {
- return done(e);
- }
- }
- let valid;
- try {
- valid = jws.verify(jwtString, decodedToken.header.alg, secretOrPublicKey2);
- } catch (e) {
- return done(e);
- }
- if (!valid) {
- return done(new JsonWebTokenError("invalid signature"));
- }
- const payload = decodedToken.payload;
- if (typeof payload.nbf !== "undefined" && !options2.ignoreNotBefore) {
- if (typeof payload.nbf !== "number") {
- return done(new JsonWebTokenError("invalid nbf value"));
- }
- if (payload.nbf > clockTimestamp + (options2.clockTolerance || 0)) {
- return done(new NotBeforeError("jwt not active", new Date(payload.nbf * 1000)));
- }
- }
- if (typeof payload.exp !== "undefined" && !options2.ignoreExpiration) {
- if (typeof payload.exp !== "number") {
- return done(new JsonWebTokenError("invalid exp value"));
- }
- if (clockTimestamp >= payload.exp + (options2.clockTolerance || 0)) {
- return done(new TokenExpiredError("jwt expired", new Date(payload.exp * 1000)));
- }
- }
- if (options2.audience) {
- const audiences = Array.isArray(options2.audience) ? options2.audience : [options2.audience];
- const target = Array.isArray(payload.aud) ? payload.aud : [payload.aud];
- const match = target.some(function(targetAudience) {
- return audiences.some(function(audience) {
- return audience instanceof RegExp ? audience.test(targetAudience) : audience === targetAudience;
- });
- });
- if (!match) {
- return done(new JsonWebTokenError("jwt audience invalid. expected: " + audiences.join(" or ")));
- }
- }
- if (options2.issuer) {
- const invalid_issuer = typeof options2.issuer === "string" && payload.iss !== options2.issuer || Array.isArray(options2.issuer) && options2.issuer.indexOf(payload.iss) === -1;
- if (invalid_issuer) {
- return done(new JsonWebTokenError("jwt issuer invalid. expected: " + options2.issuer));
- }
- }
- if (options2.subject) {
- if (payload.sub !== options2.subject) {
- return done(new JsonWebTokenError("jwt subject invalid. expected: " + options2.subject));
- }
- }
- if (options2.jwtid) {
- if (payload.jti !== options2.jwtid) {
- return done(new JsonWebTokenError("jwt jwtid invalid. expected: " + options2.jwtid));
- }
- }
- if (options2.nonce) {
- if (payload.nonce !== options2.nonce) {
- return done(new JsonWebTokenError("jwt nonce invalid. expected: " + options2.nonce));
- }
- }
- if (options2.maxAge) {
- if (typeof payload.iat !== "number") {
- return done(new JsonWebTokenError("iat required when maxAge is specified"));
- }
- const maxAgeTimestamp = timespan(options2.maxAge, payload.iat);
- if (typeof maxAgeTimestamp === "undefined") {
- return done(new JsonWebTokenError('"maxAge" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
- }
- if (clockTimestamp >= maxAgeTimestamp + (options2.clockTolerance || 0)) {
- return done(new TokenExpiredError("maxAge exceeded", new Date(maxAgeTimestamp * 1000)));
- }
- }
- if (options2.complete === true) {
- const signature = decodedToken.signature;
- return done(null, {
- header,
- payload,
- signature
- });
- }
- return done(null, payload);
- });
- };
-});
-
-// ../eve/node_modules/lodash.includes/index.js
-var require_lodash = __commonJS((exports, module) => {
- var INFINITY = 1 / 0;
- var MAX_SAFE_INTEGER = 9007199254740991;
- var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
- var NAN = 0 / 0;
- var argsTag = "[object Arguments]";
- var funcTag = "[object Function]";
- var genTag = "[object GeneratorFunction]";
- var stringTag = "[object String]";
- var symbolTag = "[object Symbol]";
- var reTrim = /^\s+|\s+$/g;
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
- var reIsBinary = /^0b[01]+$/i;
- var reIsOctal = /^0o[0-7]+$/i;
- var reIsUint = /^(?:0|[1-9]\d*)$/;
- var freeParseInt = parseInt;
- function arrayMap(array, iteratee) {
- var index2 = -1, length = array ? array.length : 0, result = Array(length);
- while (++index2 < length) {
- result[index2] = iteratee(array[index2], index2, array);
- }
- return result;
- }
- function baseFindIndex(array, predicate, fromIndex, fromRight) {
- var length = array.length, index2 = fromIndex + (fromRight ? 1 : -1);
- while (fromRight ? index2-- : ++index2 < length) {
- if (predicate(array[index2], index2, array)) {
- return index2;
- }
- }
- return -1;
- }
- function baseIndexOf(array, value, fromIndex) {
- if (value !== value) {
- return baseFindIndex(array, baseIsNaN, fromIndex);
- }
- var index2 = fromIndex - 1, length = array.length;
- while (++index2 < length) {
- if (array[index2] === value) {
- return index2;
- }
- }
- return -1;
- }
- function baseIsNaN(value) {
- return value !== value;
- }
- function baseTimes(n, iteratee) {
- var index2 = -1, result = Array(n);
- while (++index2 < n) {
- result[index2] = iteratee(index2);
- }
- return result;
- }
- function baseValues(object, props) {
- return arrayMap(props, function(key) {
- return object[key];
- });
- }
- function overArg(func, transform) {
- return function(arg) {
- return func(transform(arg));
- };
- }
- var objectProto = Object.prototype;
- var hasOwnProperty = objectProto.hasOwnProperty;
- var objectToString = objectProto.toString;
- var propertyIsEnumerable = objectProto.propertyIsEnumerable;
- var nativeKeys = overArg(Object.keys, Object);
- var nativeMax = Math.max;
- function arrayLikeKeys(value, inherited) {
- var result = isArray(value) || isArguments(value) ? baseTimes(value.length, String) : [];
- var length = result.length, skipIndexes = !!length;
- for (var key in value) {
- if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && (key == "length" || isIndex(key, length)))) {
- result.push(key);
- }
- }
- return result;
- }
- function baseKeys(object) {
- if (!isPrototype(object)) {
- return nativeKeys(object);
- }
- var result = [];
- for (var key in Object(object)) {
- if (hasOwnProperty.call(object, key) && key != "constructor") {
- result.push(key);
- }
- }
- return result;
- }
- function isIndex(value, length) {
- length = length == null ? MAX_SAFE_INTEGER : length;
- return !!length && (typeof value == "number" || reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
- }
- function isPrototype(value) {
- var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto;
- return value === proto;
- }
- function includes(collection, value, fromIndex, guard) {
- collection = isArrayLike(collection) ? collection : values(collection);
- fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0;
- var length = collection.length;
- if (fromIndex < 0) {
- fromIndex = nativeMax(length + fromIndex, 0);
- }
- return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;
- }
- function isArguments(value) {
- return isArrayLikeObject(value) && hasOwnProperty.call(value, "callee") && (!propertyIsEnumerable.call(value, "callee") || objectToString.call(value) == argsTag);
- }
- var isArray = Array.isArray;
- function isArrayLike(value) {
- return value != null && isLength(value.length) && !isFunction(value);
- }
- function isArrayLikeObject(value) {
- return isObjectLike(value) && isArrayLike(value);
- }
- function isFunction(value) {
- var tag = isObject(value) ? objectToString.call(value) : "";
- return tag == funcTag || tag == genTag;
- }
- function isLength(value) {
- return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
- }
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == "object" || type == "function");
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isString(value) {
- return typeof value == "string" || !isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag;
- }
- function isSymbol(value) {
- return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
- }
- function toFinite(value) {
- if (!value) {
- return value === 0 ? value : 0;
- }
- value = toNumber(value);
- if (value === INFINITY || value === -INFINITY) {
- var sign = value < 0 ? -1 : 1;
- return sign * MAX_INTEGER;
- }
- return value === value ? value : 0;
- }
- function toInteger(value) {
- var result = toFinite(value), remainder = result % 1;
- return result === result ? remainder ? result - remainder : result : 0;
- }
- function toNumber(value) {
- if (typeof value == "number") {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == "function" ? value.valueOf() : value;
- value = isObject(other) ? other + "" : other;
- }
- if (typeof value != "string") {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, "");
- var isBinary = reIsBinary.test(value);
- return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
- }
- function keys(object) {
- return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
- }
- function values(object) {
- return object ? baseValues(object, keys(object)) : [];
- }
- module.exports = includes;
-});
-
-// ../eve/node_modules/lodash.isboolean/index.js
-var require_lodash2 = __commonJS((exports, module) => {
- var boolTag = "[object Boolean]";
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function isBoolean(value) {
- return value === true || value === false || isObjectLike(value) && objectToString.call(value) == boolTag;
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- module.exports = isBoolean;
-});
-
-// ../eve/node_modules/lodash.isinteger/index.js
-var require_lodash3 = __commonJS((exports, module) => {
- var INFINITY = 1 / 0;
- var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
- var NAN = 0 / 0;
- var symbolTag = "[object Symbol]";
- var reTrim = /^\s+|\s+$/g;
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
- var reIsBinary = /^0b[01]+$/i;
- var reIsOctal = /^0o[0-7]+$/i;
- var freeParseInt = parseInt;
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function isInteger(value) {
- return typeof value == "number" && value == toInteger(value);
- }
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == "object" || type == "function");
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isSymbol(value) {
- return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
- }
- function toFinite(value) {
- if (!value) {
- return value === 0 ? value : 0;
- }
- value = toNumber(value);
- if (value === INFINITY || value === -INFINITY) {
- var sign = value < 0 ? -1 : 1;
- return sign * MAX_INTEGER;
- }
- return value === value ? value : 0;
- }
- function toInteger(value) {
- var result = toFinite(value), remainder = result % 1;
- return result === result ? remainder ? result - remainder : result : 0;
- }
- function toNumber(value) {
- if (typeof value == "number") {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == "function" ? value.valueOf() : value;
- value = isObject(other) ? other + "" : other;
- }
- if (typeof value != "string") {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, "");
- var isBinary = reIsBinary.test(value);
- return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
- }
- module.exports = isInteger;
-});
-
-// ../eve/node_modules/lodash.isnumber/index.js
-var require_lodash4 = __commonJS((exports, module) => {
- var numberTag = "[object Number]";
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isNumber(value) {
- return typeof value == "number" || isObjectLike(value) && objectToString.call(value) == numberTag;
- }
- module.exports = isNumber;
-});
-
-// ../eve/node_modules/lodash.isplainobject/index.js
-var require_lodash5 = __commonJS((exports, module) => {
- var objectTag = "[object Object]";
- function isHostObject(value) {
- var result = false;
- if (value != null && typeof value.toString != "function") {
- try {
- result = !!(value + "");
- } catch (e) {}
- }
- return result;
- }
- function overArg(func, transform) {
- return function(arg) {
- return func(transform(arg));
- };
- }
- var funcProto = Function.prototype;
- var objectProto = Object.prototype;
- var funcToString = funcProto.toString;
- var hasOwnProperty = objectProto.hasOwnProperty;
- var objectCtorString = funcToString.call(Object);
- var objectToString = objectProto.toString;
- var getPrototype = overArg(Object.getPrototypeOf, Object);
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isPlainObject(value) {
- if (!isObjectLike(value) || objectToString.call(value) != objectTag || isHostObject(value)) {
- return false;
- }
- var proto = getPrototype(value);
- if (proto === null) {
- return true;
- }
- var Ctor = hasOwnProperty.call(proto, "constructor") && proto.constructor;
- return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
- }
- module.exports = isPlainObject;
-});
-
-// ../eve/node_modules/lodash.isstring/index.js
-var require_lodash6 = __commonJS((exports, module) => {
- var stringTag = "[object String]";
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- var isArray = Array.isArray;
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isString(value) {
- return typeof value == "string" || !isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag;
- }
- module.exports = isString;
-});
-
-// ../eve/node_modules/lodash.once/index.js
-var require_lodash7 = __commonJS((exports, module) => {
- var FUNC_ERROR_TEXT = "Expected a function";
- var INFINITY = 1 / 0;
- var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
- var NAN = 0 / 0;
- var symbolTag = "[object Symbol]";
- var reTrim = /^\s+|\s+$/g;
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
- var reIsBinary = /^0b[01]+$/i;
- var reIsOctal = /^0o[0-7]+$/i;
- var freeParseInt = parseInt;
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function before(n, func) {
- var result;
- if (typeof func != "function") {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- n = toInteger(n);
- return function() {
- if (--n > 0) {
- result = func.apply(this, arguments);
- }
- if (n <= 1) {
- func = undefined;
- }
- return result;
- };
- }
- function once(func) {
- return before(2, func);
- }
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == "object" || type == "function");
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isSymbol(value) {
- return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
- }
- function toFinite(value) {
- if (!value) {
- return value === 0 ? value : 0;
- }
- value = toNumber(value);
- if (value === INFINITY || value === -INFINITY) {
- var sign = value < 0 ? -1 : 1;
- return sign * MAX_INTEGER;
- }
- return value === value ? value : 0;
- }
- function toInteger(value) {
- var result = toFinite(value), remainder = result % 1;
- return result === result ? remainder ? result - remainder : result : 0;
- }
- function toNumber(value) {
- if (typeof value == "number") {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == "function" ? value.valueOf() : value;
- value = isObject(other) ? other + "" : other;
- }
- if (typeof value != "string") {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, "");
- var isBinary = reIsBinary.test(value);
- return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
- }
- module.exports = once;
-});
-
-// ../eve/node_modules/jsonwebtoken/sign.js
-var require_sign = __commonJS((exports, module) => {
- var timespan = require_timespan();
- var PS_SUPPORTED = require_psSupported();
- var validateAsymmetricKey = require_validateAsymmetricKey();
- var jws = require_jws();
- var includes = require_lodash();
- var isBoolean = require_lodash2();
- var isInteger = require_lodash3();
- var isNumber = require_lodash4();
- var isPlainObject = require_lodash5();
- var isString = require_lodash6();
- var once = require_lodash7();
- var { KeyObject, createSecretKey, createPrivateKey } = __require("crypto");
- var SUPPORTED_ALGS = ["RS256", "RS384", "RS512", "ES256", "ES384", "ES512", "HS256", "HS384", "HS512", "none"];
- if (PS_SUPPORTED) {
- SUPPORTED_ALGS.splice(3, 0, "PS256", "PS384", "PS512");
- }
- var sign_options_schema = {
- expiresIn: { isValid: function(value) {
- return isInteger(value) || isString(value) && value;
- }, message: '"expiresIn" should be a number of seconds or string representing a timespan' },
- notBefore: { isValid: function(value) {
- return isInteger(value) || isString(value) && value;
- }, message: '"notBefore" should be a number of seconds or string representing a timespan' },
- audience: { isValid: function(value) {
- return isString(value) || Array.isArray(value);
- }, message: '"audience" must be a string or array' },
- algorithm: { isValid: includes.bind(null, SUPPORTED_ALGS), message: '"algorithm" must be a valid string enum value' },
- header: { isValid: isPlainObject, message: '"header" must be an object' },
- encoding: { isValid: isString, message: '"encoding" must be a string' },
- issuer: { isValid: isString, message: '"issuer" must be a string' },
- subject: { isValid: isString, message: '"subject" must be a string' },
- jwtid: { isValid: isString, message: '"jwtid" must be a string' },
- noTimestamp: { isValid: isBoolean, message: '"noTimestamp" must be a boolean' },
- keyid: { isValid: isString, message: '"keyid" must be a string' },
- mutatePayload: { isValid: isBoolean, message: '"mutatePayload" must be a boolean' },
- allowInsecureKeySizes: { isValid: isBoolean, message: '"allowInsecureKeySizes" must be a boolean' },
- allowInvalidAsymmetricKeyTypes: { isValid: isBoolean, message: '"allowInvalidAsymmetricKeyTypes" must be a boolean' }
- };
- var registered_claims_schema = {
- iat: { isValid: isNumber, message: '"iat" should be a number of seconds' },
- exp: { isValid: isNumber, message: '"exp" should be a number of seconds' },
- nbf: { isValid: isNumber, message: '"nbf" should be a number of seconds' }
- };
- function validate(schema, allowUnknown, object, parameterName) {
- if (!isPlainObject(object)) {
- throw new Error('Expected "' + parameterName + '" to be a plain object.');
- }
- Object.keys(object).forEach(function(key) {
- const validator = schema[key];
- if (!validator) {
- if (!allowUnknown) {
- throw new Error('"' + key + '" is not allowed in "' + parameterName + '"');
- }
- return;
- }
- if (!validator.isValid(object[key])) {
- throw new Error(validator.message);
- }
- });
- }
- function validateOptions(options2) {
- return validate(sign_options_schema, false, options2, "options");
- }
- function validatePayload(payload) {
- return validate(registered_claims_schema, true, payload, "payload");
- }
- var options_to_payload = {
- audience: "aud",
- issuer: "iss",
- subject: "sub",
- jwtid: "jti"
- };
- var options_for_objects = [
- "expiresIn",
- "notBefore",
- "noTimestamp",
- "audience",
- "issuer",
- "subject",
- "jwtid"
- ];
- module.exports = function(payload, secretOrPrivateKey, options2, callback) {
- if (typeof options2 === "function") {
- callback = options2;
- options2 = {};
- } else {
- options2 = options2 || {};
- }
- const isObjectPayload = typeof payload === "object" && !Buffer.isBuffer(payload);
- const header = Object.assign({
- alg: options2.algorithm || "HS256",
- typ: isObjectPayload ? "JWT" : undefined,
- kid: options2.keyid
- }, options2.header);
- function failure(err) {
- if (callback) {
- return callback(err);
- }
- throw err;
- }
- if (!secretOrPrivateKey && options2.algorithm !== "none") {
- return failure(new Error("secretOrPrivateKey must have a value"));
- }
- if (secretOrPrivateKey != null && !(secretOrPrivateKey instanceof KeyObject)) {
- try {
- secretOrPrivateKey = createPrivateKey(secretOrPrivateKey);
- } catch (_) {
- try {
- secretOrPrivateKey = createSecretKey(typeof secretOrPrivateKey === "string" ? Buffer.from(secretOrPrivateKey) : secretOrPrivateKey);
- } catch (_2) {
- return failure(new Error("secretOrPrivateKey is not valid key material"));
- }
- }
- }
- if (header.alg.startsWith("HS") && secretOrPrivateKey.type !== "secret") {
- return failure(new Error(`secretOrPrivateKey must be a symmetric key when using ${header.alg}`));
- } else if (/^(?:RS|PS|ES)/.test(header.alg)) {
- if (secretOrPrivateKey.type !== "private") {
- return failure(new Error(`secretOrPrivateKey must be an asymmetric key when using ${header.alg}`));
- }
- if (!options2.allowInsecureKeySizes && !header.alg.startsWith("ES") && secretOrPrivateKey.asymmetricKeyDetails !== undefined && secretOrPrivateKey.asymmetricKeyDetails.modulusLength < 2048) {
- return failure(new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`));
- }
- }
- if (typeof payload === "undefined") {
- return failure(new Error("payload is required"));
- } else if (isObjectPayload) {
- try {
- validatePayload(payload);
- } catch (error) {
- return failure(error);
- }
- if (!options2.mutatePayload) {
- payload = Object.assign({}, payload);
- }
- } else {
- const invalid_options = options_for_objects.filter(function(opt) {
- return typeof options2[opt] !== "undefined";
- });
- if (invalid_options.length > 0) {
- return failure(new Error("invalid " + invalid_options.join(",") + " option for " + typeof payload + " payload"));
- }
- }
- if (typeof payload.exp !== "undefined" && typeof options2.expiresIn !== "undefined") {
- return failure(new Error('Bad "options.expiresIn" option the payload already has an "exp" property.'));
- }
- if (typeof payload.nbf !== "undefined" && typeof options2.notBefore !== "undefined") {
- return failure(new Error('Bad "options.notBefore" option the payload already has an "nbf" property.'));
- }
- try {
- validateOptions(options2);
- } catch (error) {
- return failure(error);
- }
- if (!options2.allowInvalidAsymmetricKeyTypes) {
- try {
- validateAsymmetricKey(header.alg, secretOrPrivateKey);
- } catch (error) {
- return failure(error);
- }
- }
- const timestamp = payload.iat || Math.floor(Date.now() / 1000);
- if (options2.noTimestamp) {
- delete payload.iat;
- } else if (isObjectPayload) {
- payload.iat = timestamp;
- }
- if (typeof options2.notBefore !== "undefined") {
- try {
- payload.nbf = timespan(options2.notBefore, timestamp);
- } catch (err) {
- return failure(err);
- }
- if (typeof payload.nbf === "undefined") {
- return failure(new Error('"notBefore" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
- }
- }
- if (typeof options2.expiresIn !== "undefined" && typeof payload === "object") {
- try {
- payload.exp = timespan(options2.expiresIn, timestamp);
- } catch (err) {
- return failure(err);
- }
- if (typeof payload.exp === "undefined") {
- return failure(new Error('"expiresIn" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
- }
- }
- Object.keys(options_to_payload).forEach(function(key) {
- const claim = options_to_payload[key];
- if (typeof options2[key] !== "undefined") {
- if (typeof payload[claim] !== "undefined") {
- return failure(new Error('Bad "options.' + key + '" option. The payload already has an "' + claim + '" property.'));
- }
- payload[claim] = options2[key];
- }
- });
- const encoding = options2.encoding || "utf8";
- if (typeof callback === "function") {
- callback = callback && once(callback);
- jws.createSign({
- header,
- privateKey: secretOrPrivateKey,
- payload,
- encoding
- }).once("error", callback).once("done", function(signature) {
- if (!options2.allowInsecureKeySizes && /^(?:RS|PS)/.test(header.alg) && signature.length < 256) {
- return callback(new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`));
- }
- callback(null, signature);
- });
- } else {
- let signature = jws.sign({ header, payload, secret: secretOrPrivateKey, encoding });
- if (!options2.allowInsecureKeySizes && /^(?:RS|PS)/.test(header.alg) && signature.length < 256) {
- throw new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`);
- }
- return signature;
- }
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/index.js
-var require_jsonwebtoken = __commonJS((exports, module) => {
- module.exports = {
- decode: require_decode(),
- verify: require_verify(),
- sign: require_sign(),
- JsonWebTokenError: require_JsonWebTokenError(),
- NotBeforeError: require_NotBeforeError(),
- TokenExpiredError: require_TokenExpiredError()
- };
-});
-
-// ../eve/node_modules/bn.js/lib/bn.js
-var require_bn = __commonJS((exports, module) => {
- (function(module2, exports2) {
- function assert(val, msg) {
- if (!val)
- throw new Error(msg || "Assertion failed");
- }
- function inherits(ctor, superCtor) {
- ctor.super_ = superCtor;
- var TempCtor = function() {};
- TempCtor.prototype = superCtor.prototype;
- ctor.prototype = new TempCtor;
- ctor.prototype.constructor = ctor;
- }
- function BN(number, base, endian) {
- if (BN.isBN(number)) {
- return number;
- }
- this.negative = 0;
- this.words = null;
- this.length = 0;
- this.red = null;
- if (number !== null) {
- if (base === "le" || base === "be") {
- endian = base;
- base = 10;
- }
- this._init(number || 0, base || 10, endian || "be");
- }
- }
- if (typeof module2 === "object") {
- module2.exports = BN;
- } else {
- exports2.BN = BN;
- }
- BN.BN = BN;
- BN.wordSize = 26;
- var Buffer2;
- try {
- if (typeof window !== "undefined" && typeof window.Buffer !== "undefined") {
- Buffer2 = window.Buffer;
- } else {
- Buffer2 = __require("buffer").Buffer;
- }
- } catch (e) {}
- BN.isBN = function isBN(num) {
- if (num instanceof BN) {
- return true;
- }
- return num !== null && typeof num === "object" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);
- };
- BN.max = function max(left, right) {
- if (left.cmp(right) > 0)
- return left;
- return right;
- };
- BN.min = function min(left, right) {
- if (left.cmp(right) < 0)
- return left;
- return right;
- };
- BN.prototype._init = function init(number, base, endian) {
- if (typeof number === "number") {
- return this._initNumber(number, base, endian);
- }
- if (typeof number === "object") {
- return this._initArray(number, base, endian);
- }
- if (base === "hex") {
- base = 16;
- }
- assert(base === (base | 0) && base >= 2 && base <= 36);
- number = number.toString().replace(/\s+/g, "");
- var start = 0;
- if (number[0] === "-") {
- start++;
- this.negative = 1;
- }
- if (start < number.length) {
- if (base === 16) {
- this._parseHex(number, start, endian);
- } else {
- this._parseBase(number, base, start);
- if (endian === "le") {
- this._initArray(this.toArray(), base, endian);
- }
- }
- }
- };
- BN.prototype._initNumber = function _initNumber(number, base, endian) {
- if (number < 0) {
- this.negative = 1;
- number = -number;
- }
- if (number < 67108864) {
- this.words = [number & 67108863];
- this.length = 1;
- } else if (number < 4503599627370496) {
- this.words = [
- number & 67108863,
- number / 67108864 & 67108863
- ];
- this.length = 2;
- } else {
- assert(number < 9007199254740992);
- this.words = [
- number & 67108863,
- number / 67108864 & 67108863,
- 1
- ];
- this.length = 3;
- }
- if (endian !== "le")
- return;
- this._initArray(this.toArray(), base, endian);
- };
- BN.prototype._initArray = function _initArray(number, base, endian) {
- assert(typeof number.length === "number");
- if (number.length <= 0) {
- this.words = [0];
- this.length = 1;
- return this;
- }
- this.length = Math.ceil(number.length / 3);
- this.words = new Array(this.length);
- for (var i = 0;i < this.length; i++) {
- this.words[i] = 0;
- }
- var j, w;
- var off = 0;
- if (endian === "be") {
- for (i = number.length - 1, j = 0;i >= 0; i -= 3) {
- w = number[i] | number[i - 1] << 8 | number[i - 2] << 16;
- this.words[j] |= w << off & 67108863;
- this.words[j + 1] = w >>> 26 - off & 67108863;
- off += 24;
- if (off >= 26) {
- off -= 26;
- j++;
- }
- }
- } else if (endian === "le") {
- for (i = 0, j = 0;i < number.length; i += 3) {
- w = number[i] | number[i + 1] << 8 | number[i + 2] << 16;
- this.words[j] |= w << off & 67108863;
- this.words[j + 1] = w >>> 26 - off & 67108863;
- off += 24;
- if (off >= 26) {
- off -= 26;
- j++;
- }
- }
- }
- return this.strip();
- };
- function parseHex4Bits(string, index2) {
- var c = string.charCodeAt(index2);
- if (c >= 65 && c <= 70) {
- return c - 55;
- } else if (c >= 97 && c <= 102) {
- return c - 87;
- } else {
- return c - 48 & 15;
- }
- }
- function parseHexByte(string, lowerBound, index2) {
- var r = parseHex4Bits(string, index2);
- if (index2 - 1 >= lowerBound) {
- r |= parseHex4Bits(string, index2 - 1) << 4;
- }
- return r;
- }
- BN.prototype._parseHex = function _parseHex(number, start, endian) {
- this.length = Math.ceil((number.length - start) / 6);
- this.words = new Array(this.length);
- for (var i = 0;i < this.length; i++) {
- this.words[i] = 0;
- }
- var off = 0;
- var j = 0;
- var w;
- if (endian === "be") {
- for (i = number.length - 1;i >= start; i -= 2) {
- w = parseHexByte(number, start, i) << off;
- this.words[j] |= w & 67108863;
- if (off >= 18) {
- off -= 18;
- j += 1;
- this.words[j] |= w >>> 26;
- } else {
- off += 8;
- }
- }
- } else {
- var parseLength = number.length - start;
- for (i = parseLength % 2 === 0 ? start + 1 : start;i < number.length; i += 2) {
- w = parseHexByte(number, start, i) << off;
- this.words[j] |= w & 67108863;
- if (off >= 18) {
- off -= 18;
- j += 1;
- this.words[j] |= w >>> 26;
- } else {
- off += 8;
- }
- }
- }
- this.strip();
- };
- function parseBase(str, start, end, mul) {
- var r = 0;
- var len = Math.min(str.length, end);
- for (var i = start;i < len; i++) {
- var c = str.charCodeAt(i) - 48;
- r *= mul;
- if (c >= 49) {
- r += c - 49 + 10;
- } else if (c >= 17) {
- r += c - 17 + 10;
- } else {
- r += c;
- }
- }
- return r;
- }
- BN.prototype._parseBase = function _parseBase(number, base, start) {
- this.words = [0];
- this.length = 1;
- for (var limbLen = 0, limbPow = 1;limbPow <= 67108863; limbPow *= base) {
- limbLen++;
- }
- limbLen--;
- limbPow = limbPow / base | 0;
- var total = number.length - start;
- var mod = total % limbLen;
- var end = Math.min(total, total - mod) + start;
- var word = 0;
- for (var i = start;i < end; i += limbLen) {
- word = parseBase(number, i, i + limbLen, base);
- this.imuln(limbPow);
- if (this.words[0] + word < 67108864) {
- this.words[0] += word;
- } else {
- this._iaddn(word);
- }
- }
- if (mod !== 0) {
- var pow = 1;
- word = parseBase(number, i, number.length, base);
- for (i = 0;i < mod; i++) {
- pow *= base;
- }
- this.imuln(pow);
- if (this.words[0] + word < 67108864) {
- this.words[0] += word;
- } else {
- this._iaddn(word);
- }
- }
- this.strip();
- };
- BN.prototype.copy = function copy(dest) {
- dest.words = new Array(this.length);
- for (var i = 0;i < this.length; i++) {
- dest.words[i] = this.words[i];
- }
- dest.length = this.length;
- dest.negative = this.negative;
- dest.red = this.red;
- };
- BN.prototype.clone = function clone() {
- var r = new BN(null);
- this.copy(r);
- return r;
- };
- BN.prototype._expand = function _expand(size) {
- while (this.length < size) {
- this.words[this.length++] = 0;
- }
- return this;
- };
- BN.prototype.strip = function strip() {
- while (this.length > 1 && this.words[this.length - 1] === 0) {
- this.length--;
- }
- return this._normSign();
- };
- BN.prototype._normSign = function _normSign() {
- if (this.length === 1 && this.words[0] === 0) {
- this.negative = 0;
- }
- return this;
- };
- BN.prototype.inspect = function inspect() {
- return (this.red ? "";
- };
- var zeros = [
- "",
- "0",
- "00",
- "000",
- "0000",
- "00000",
- "000000",
- "0000000",
- "00000000",
- "000000000",
- "0000000000",
- "00000000000",
- "000000000000",
- "0000000000000",
- "00000000000000",
- "000000000000000",
- "0000000000000000",
- "00000000000000000",
- "000000000000000000",
- "0000000000000000000",
- "00000000000000000000",
- "000000000000000000000",
- "0000000000000000000000",
- "00000000000000000000000",
- "000000000000000000000000",
- "0000000000000000000000000"
- ];
- var groupSizes = [
- 0,
- 0,
- 25,
- 16,
- 12,
- 11,
- 10,
- 9,
- 8,
- 8,
- 7,
- 7,
- 7,
- 7,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5
- ];
- var groupBases = [
- 0,
- 0,
- 33554432,
- 43046721,
- 16777216,
- 48828125,
- 60466176,
- 40353607,
- 16777216,
- 43046721,
- 1e7,
- 19487171,
- 35831808,
- 62748517,
- 7529536,
- 11390625,
- 16777216,
- 24137569,
- 34012224,
- 47045881,
- 64000000,
- 4084101,
- 5153632,
- 6436343,
- 7962624,
- 9765625,
- 11881376,
- 14348907,
- 17210368,
- 20511149,
- 24300000,
- 28629151,
- 33554432,
- 39135393,
- 45435424,
- 52521875,
- 60466176
- ];
- BN.prototype.toString = function toString(base, padding) {
- base = base || 10;
- padding = padding | 0 || 1;
- var out;
- if (base === 16 || base === "hex") {
- out = "";
- var off = 0;
- var carry = 0;
- for (var i = 0;i < this.length; i++) {
- var w = this.words[i];
- var word = ((w << off | carry) & 16777215).toString(16);
- carry = w >>> 24 - off & 16777215;
- off += 2;
- if (off >= 26) {
- off -= 26;
- i--;
- }
- if (carry !== 0 || i !== this.length - 1) {
- out = zeros[6 - word.length] + word + out;
- } else {
- out = word + out;
- }
- }
- if (carry !== 0) {
- out = carry.toString(16) + out;
- }
- while (out.length % padding !== 0) {
- out = "0" + out;
- }
- if (this.negative !== 0) {
- out = "-" + out;
- }
- return out;
- }
- if (base === (base | 0) && base >= 2 && base <= 36) {
- var groupSize = groupSizes[base];
- var groupBase = groupBases[base];
- out = "";
- var c = this.clone();
- c.negative = 0;
- while (!c.isZero()) {
- var r = c.modn(groupBase).toString(base);
- c = c.idivn(groupBase);
- if (!c.isZero()) {
- out = zeros[groupSize - r.length] + r + out;
- } else {
- out = r + out;
- }
- }
- if (this.isZero()) {
- out = "0" + out;
- }
- while (out.length % padding !== 0) {
- out = "0" + out;
- }
- if (this.negative !== 0) {
- out = "-" + out;
- }
- return out;
- }
- assert(false, "Base should be between 2 and 36");
- };
- BN.prototype.toNumber = function toNumber() {
- var ret = this.words[0];
- if (this.length === 2) {
- ret += this.words[1] * 67108864;
- } else if (this.length === 3 && this.words[2] === 1) {
- ret += 4503599627370496 + this.words[1] * 67108864;
- } else if (this.length > 2) {
- assert(false, "Number can only safely store up to 53 bits");
- }
- return this.negative !== 0 ? -ret : ret;
- };
- BN.prototype.toJSON = function toJSON() {
- return this.toString(16);
- };
- BN.prototype.toBuffer = function toBuffer(endian, length) {
- assert(typeof Buffer2 !== "undefined");
- return this.toArrayLike(Buffer2, endian, length);
- };
- BN.prototype.toArray = function toArray(endian, length) {
- return this.toArrayLike(Array, endian, length);
- };
- BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) {
- var byteLength = this.byteLength();
- var reqLength = length || Math.max(1, byteLength);
- assert(byteLength <= reqLength, "byte array longer than desired length");
- assert(reqLength > 0, "Requested array length <= 0");
- this.strip();
- var littleEndian = endian === "le";
- var res = new ArrayType(reqLength);
- var b, i;
- var q = this.clone();
- if (!littleEndian) {
- for (i = 0;i < reqLength - byteLength; i++) {
- res[i] = 0;
- }
- for (i = 0;!q.isZero(); i++) {
- b = q.andln(255);
- q.iushrn(8);
- res[reqLength - i - 1] = b;
- }
- } else {
- for (i = 0;!q.isZero(); i++) {
- b = q.andln(255);
- q.iushrn(8);
- res[i] = b;
- }
- for (;i < reqLength; i++) {
- res[i] = 0;
- }
- }
- return res;
- };
- if (Math.clz32) {
- BN.prototype._countBits = function _countBits(w) {
- return 32 - Math.clz32(w);
- };
- } else {
- BN.prototype._countBits = function _countBits(w) {
- var t = w;
- var r = 0;
- if (t >= 4096) {
- r += 13;
- t >>>= 13;
- }
- if (t >= 64) {
- r += 7;
- t >>>= 7;
- }
- if (t >= 8) {
- r += 4;
- t >>>= 4;
- }
- if (t >= 2) {
- r += 2;
- t >>>= 2;
- }
- return r + t;
- };
- }
- BN.prototype._zeroBits = function _zeroBits(w) {
- if (w === 0)
- return 26;
- var t = w;
- var r = 0;
- if ((t & 8191) === 0) {
- r += 13;
- t >>>= 13;
- }
- if ((t & 127) === 0) {
- r += 7;
- t >>>= 7;
- }
- if ((t & 15) === 0) {
- r += 4;
- t >>>= 4;
- }
- if ((t & 3) === 0) {
- r += 2;
- t >>>= 2;
- }
- if ((t & 1) === 0) {
- r++;
- }
- return r;
- };
- BN.prototype.bitLength = function bitLength() {
- var w = this.words[this.length - 1];
- var hi = this._countBits(w);
- return (this.length - 1) * 26 + hi;
- };
- function toBitArray(num) {
- var w = new Array(num.bitLength());
- for (var bit = 0;bit < w.length; bit++) {
- var off = bit / 26 | 0;
- var wbit = bit % 26;
- w[bit] = (num.words[off] & 1 << wbit) >>> wbit;
- }
- return w;
- }
- BN.prototype.zeroBits = function zeroBits() {
- if (this.isZero())
- return 0;
- var r = 0;
- for (var i = 0;i < this.length; i++) {
- var b = this._zeroBits(this.words[i]);
- r += b;
- if (b !== 26)
- break;
- }
- return r;
- };
- BN.prototype.byteLength = function byteLength() {
- return Math.ceil(this.bitLength() / 8);
- };
- BN.prototype.toTwos = function toTwos(width) {
- if (this.negative !== 0) {
- return this.abs().inotn(width).iaddn(1);
- }
- return this.clone();
- };
- BN.prototype.fromTwos = function fromTwos(width) {
- if (this.testn(width - 1)) {
- return this.notn(width).iaddn(1).ineg();
- }
- return this.clone();
- };
- BN.prototype.isNeg = function isNeg() {
- return this.negative !== 0;
- };
- BN.prototype.neg = function neg() {
- return this.clone().ineg();
- };
- BN.prototype.ineg = function ineg() {
- if (!this.isZero()) {
- this.negative ^= 1;
- }
- return this;
- };
- BN.prototype.iuor = function iuor(num) {
- while (this.length < num.length) {
- this.words[this.length++] = 0;
- }
- for (var i = 0;i < num.length; i++) {
- this.words[i] = this.words[i] | num.words[i];
- }
- return this.strip();
- };
- BN.prototype.ior = function ior(num) {
- assert((this.negative | num.negative) === 0);
- return this.iuor(num);
- };
- BN.prototype.or = function or(num) {
- if (this.length > num.length)
- return this.clone().ior(num);
- return num.clone().ior(this);
- };
- BN.prototype.uor = function uor(num) {
- if (this.length > num.length)
- return this.clone().iuor(num);
- return num.clone().iuor(this);
- };
- BN.prototype.iuand = function iuand(num) {
- var b;
- if (this.length > num.length) {
- b = num;
- } else {
- b = this;
- }
- for (var i = 0;i < b.length; i++) {
- this.words[i] = this.words[i] & num.words[i];
- }
- this.length = b.length;
- return this.strip();
- };
- BN.prototype.iand = function iand(num) {
- assert((this.negative | num.negative) === 0);
- return this.iuand(num);
- };
- BN.prototype.and = function and(num) {
- if (this.length > num.length)
- return this.clone().iand(num);
- return num.clone().iand(this);
- };
- BN.prototype.uand = function uand(num) {
- if (this.length > num.length)
- return this.clone().iuand(num);
- return num.clone().iuand(this);
- };
- BN.prototype.iuxor = function iuxor(num) {
- var a;
- var b;
- if (this.length > num.length) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
- for (var i = 0;i < b.length; i++) {
- this.words[i] = a.words[i] ^ b.words[i];
- }
- if (this !== a) {
- for (;i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
- this.length = a.length;
- return this.strip();
- };
- BN.prototype.ixor = function ixor(num) {
- assert((this.negative | num.negative) === 0);
- return this.iuxor(num);
- };
- BN.prototype.xor = function xor(num) {
- if (this.length > num.length)
- return this.clone().ixor(num);
- return num.clone().ixor(this);
- };
- BN.prototype.uxor = function uxor(num) {
- if (this.length > num.length)
- return this.clone().iuxor(num);
- return num.clone().iuxor(this);
- };
- BN.prototype.inotn = function inotn(width) {
- assert(typeof width === "number" && width >= 0);
- var bytesNeeded = Math.ceil(width / 26) | 0;
- var bitsLeft = width % 26;
- this._expand(bytesNeeded);
- if (bitsLeft > 0) {
- bytesNeeded--;
- }
- for (var i = 0;i < bytesNeeded; i++) {
- this.words[i] = ~this.words[i] & 67108863;
- }
- if (bitsLeft > 0) {
- this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft;
- }
- return this.strip();
- };
- BN.prototype.notn = function notn(width) {
- return this.clone().inotn(width);
- };
- BN.prototype.setn = function setn(bit, val) {
- assert(typeof bit === "number" && bit >= 0);
- var off = bit / 26 | 0;
- var wbit = bit % 26;
- this._expand(off + 1);
- if (val) {
- this.words[off] = this.words[off] | 1 << wbit;
- } else {
- this.words[off] = this.words[off] & ~(1 << wbit);
- }
- return this.strip();
- };
- BN.prototype.iadd = function iadd(num) {
- var r;
- if (this.negative !== 0 && num.negative === 0) {
- this.negative = 0;
- r = this.isub(num);
- this.negative ^= 1;
- return this._normSign();
- } else if (this.negative === 0 && num.negative !== 0) {
- num.negative = 0;
- r = this.isub(num);
- num.negative = 1;
- return r._normSign();
- }
- var a, b;
- if (this.length > num.length) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
- var carry = 0;
- for (var i = 0;i < b.length; i++) {
- r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
- this.words[i] = r & 67108863;
- carry = r >>> 26;
- }
- for (;carry !== 0 && i < a.length; i++) {
- r = (a.words[i] | 0) + carry;
- this.words[i] = r & 67108863;
- carry = r >>> 26;
- }
- this.length = a.length;
- if (carry !== 0) {
- this.words[this.length] = carry;
- this.length++;
- } else if (a !== this) {
- for (;i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
- return this;
- };
- BN.prototype.add = function add(num) {
- var res;
- if (num.negative !== 0 && this.negative === 0) {
- num.negative = 0;
- res = this.sub(num);
- num.negative ^= 1;
- return res;
- } else if (num.negative === 0 && this.negative !== 0) {
- this.negative = 0;
- res = num.sub(this);
- this.negative = 1;
- return res;
- }
- if (this.length > num.length)
- return this.clone().iadd(num);
- return num.clone().iadd(this);
- };
- BN.prototype.isub = function isub(num) {
- if (num.negative !== 0) {
- num.negative = 0;
- var r = this.iadd(num);
- num.negative = 1;
- return r._normSign();
- } else if (this.negative !== 0) {
- this.negative = 0;
- this.iadd(num);
- this.negative = 1;
- return this._normSign();
- }
- var cmp = this.cmp(num);
- if (cmp === 0) {
- this.negative = 0;
- this.length = 1;
- this.words[0] = 0;
- return this;
- }
- var a, b;
- if (cmp > 0) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
- var carry = 0;
- for (var i = 0;i < b.length; i++) {
- r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
- carry = r >> 26;
- this.words[i] = r & 67108863;
- }
- for (;carry !== 0 && i < a.length; i++) {
- r = (a.words[i] | 0) + carry;
- carry = r >> 26;
- this.words[i] = r & 67108863;
- }
- if (carry === 0 && i < a.length && a !== this) {
- for (;i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
- this.length = Math.max(this.length, i);
- if (a !== this) {
- this.negative = 1;
- }
- return this.strip();
- };
- BN.prototype.sub = function sub(num) {
- return this.clone().isub(num);
- };
- function smallMulTo(self2, num, out) {
- out.negative = num.negative ^ self2.negative;
- var len = self2.length + num.length | 0;
- out.length = len;
- len = len - 1 | 0;
- var a = self2.words[0] | 0;
- var b = num.words[0] | 0;
- var r = a * b;
- var lo = r & 67108863;
- var carry = r / 67108864 | 0;
- out.words[0] = lo;
- for (var k = 1;k < len; k++) {
- var ncarry = carry >>> 26;
- var rword = carry & 67108863;
- var maxJ = Math.min(k, num.length - 1);
- for (var j = Math.max(0, k - self2.length + 1);j <= maxJ; j++) {
- var i = k - j | 0;
- a = self2.words[i] | 0;
- b = num.words[j] | 0;
- r = a * b + rword;
- ncarry += r / 67108864 | 0;
- rword = r & 67108863;
- }
- out.words[k] = rword | 0;
- carry = ncarry | 0;
- }
- if (carry !== 0) {
- out.words[k] = carry | 0;
- } else {
- out.length--;
- }
- return out.strip();
- }
- var comb10MulTo = function comb10MulTo(self2, num, out) {
- var a = self2.words;
- var b = num.words;
- var o = out.words;
- var c = 0;
- var lo;
- var mid;
- var hi;
- var a0 = a[0] | 0;
- var al0 = a0 & 8191;
- var ah0 = a0 >>> 13;
- var a1 = a[1] | 0;
- var al1 = a1 & 8191;
- var ah1 = a1 >>> 13;
- var a2 = a[2] | 0;
- var al2 = a2 & 8191;
- var ah2 = a2 >>> 13;
- var a3 = a[3] | 0;
- var al3 = a3 & 8191;
- var ah3 = a3 >>> 13;
- var a4 = a[4] | 0;
- var al4 = a4 & 8191;
- var ah4 = a4 >>> 13;
- var a5 = a[5] | 0;
- var al5 = a5 & 8191;
- var ah5 = a5 >>> 13;
- var a6 = a[6] | 0;
- var al6 = a6 & 8191;
- var ah6 = a6 >>> 13;
- var a7 = a[7] | 0;
- var al7 = a7 & 8191;
- var ah7 = a7 >>> 13;
- var a8 = a[8] | 0;
- var al8 = a8 & 8191;
- var ah8 = a8 >>> 13;
- var a9 = a[9] | 0;
- var al9 = a9 & 8191;
- var ah9 = a9 >>> 13;
- var b0 = b[0] | 0;
- var bl0 = b0 & 8191;
- var bh0 = b0 >>> 13;
- var b1 = b[1] | 0;
- var bl1 = b1 & 8191;
- var bh1 = b1 >>> 13;
- var b2 = b[2] | 0;
- var bl2 = b2 & 8191;
- var bh2 = b2 >>> 13;
- var b3 = b[3] | 0;
- var bl3 = b3 & 8191;
- var bh3 = b3 >>> 13;
- var b4 = b[4] | 0;
- var bl4 = b4 & 8191;
- var bh4 = b4 >>> 13;
- var b5 = b[5] | 0;
- var bl5 = b5 & 8191;
- var bh5 = b5 >>> 13;
- var b6 = b[6] | 0;
- var bl6 = b6 & 8191;
- var bh6 = b6 >>> 13;
- var b7 = b[7] | 0;
- var bl7 = b7 & 8191;
- var bh7 = b7 >>> 13;
- var b8 = b[8] | 0;
- var bl8 = b8 & 8191;
- var bh8 = b8 >>> 13;
- var b9 = b[9] | 0;
- var bl9 = b9 & 8191;
- var bh9 = b9 >>> 13;
- out.negative = self2.negative ^ num.negative;
- out.length = 19;
- lo = Math.imul(al0, bl0);
- mid = Math.imul(al0, bh0);
- mid = mid + Math.imul(ah0, bl0) | 0;
- hi = Math.imul(ah0, bh0);
- var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0;
- w0 &= 67108863;
- lo = Math.imul(al1, bl0);
- mid = Math.imul(al1, bh0);
- mid = mid + Math.imul(ah1, bl0) | 0;
- hi = Math.imul(ah1, bh0);
- lo = lo + Math.imul(al0, bl1) | 0;
- mid = mid + Math.imul(al0, bh1) | 0;
- mid = mid + Math.imul(ah0, bl1) | 0;
- hi = hi + Math.imul(ah0, bh1) | 0;
- var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0;
- w1 &= 67108863;
- lo = Math.imul(al2, bl0);
- mid = Math.imul(al2, bh0);
- mid = mid + Math.imul(ah2, bl0) | 0;
- hi = Math.imul(ah2, bh0);
- lo = lo + Math.imul(al1, bl1) | 0;
- mid = mid + Math.imul(al1, bh1) | 0;
- mid = mid + Math.imul(ah1, bl1) | 0;
- hi = hi + Math.imul(ah1, bh1) | 0;
- lo = lo + Math.imul(al0, bl2) | 0;
- mid = mid + Math.imul(al0, bh2) | 0;
- mid = mid + Math.imul(ah0, bl2) | 0;
- hi = hi + Math.imul(ah0, bh2) | 0;
- var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0;
- w2 &= 67108863;
- lo = Math.imul(al3, bl0);
- mid = Math.imul(al3, bh0);
- mid = mid + Math.imul(ah3, bl0) | 0;
- hi = Math.imul(ah3, bh0);
- lo = lo + Math.imul(al2, bl1) | 0;
- mid = mid + Math.imul(al2, bh1) | 0;
- mid = mid + Math.imul(ah2, bl1) | 0;
- hi = hi + Math.imul(ah2, bh1) | 0;
- lo = lo + Math.imul(al1, bl2) | 0;
- mid = mid + Math.imul(al1, bh2) | 0;
- mid = mid + Math.imul(ah1, bl2) | 0;
- hi = hi + Math.imul(ah1, bh2) | 0;
- lo = lo + Math.imul(al0, bl3) | 0;
- mid = mid + Math.imul(al0, bh3) | 0;
- mid = mid + Math.imul(ah0, bl3) | 0;
- hi = hi + Math.imul(ah0, bh3) | 0;
- var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0;
- w3 &= 67108863;
- lo = Math.imul(al4, bl0);
- mid = Math.imul(al4, bh0);
- mid = mid + Math.imul(ah4, bl0) | 0;
- hi = Math.imul(ah4, bh0);
- lo = lo + Math.imul(al3, bl1) | 0;
- mid = mid + Math.imul(al3, bh1) | 0;
- mid = mid + Math.imul(ah3, bl1) | 0;
- hi = hi + Math.imul(ah3, bh1) | 0;
- lo = lo + Math.imul(al2, bl2) | 0;
- mid = mid + Math.imul(al2, bh2) | 0;
- mid = mid + Math.imul(ah2, bl2) | 0;
- hi = hi + Math.imul(ah2, bh2) | 0;
- lo = lo + Math.imul(al1, bl3) | 0;
- mid = mid + Math.imul(al1, bh3) | 0;
- mid = mid + Math.imul(ah1, bl3) | 0;
- hi = hi + Math.imul(ah1, bh3) | 0;
- lo = lo + Math.imul(al0, bl4) | 0;
- mid = mid + Math.imul(al0, bh4) | 0;
- mid = mid + Math.imul(ah0, bl4) | 0;
- hi = hi + Math.imul(ah0, bh4) | 0;
- var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0;
- w4 &= 67108863;
- lo = Math.imul(al5, bl0);
- mid = Math.imul(al5, bh0);
- mid = mid + Math.imul(ah5, bl0) | 0;
- hi = Math.imul(ah5, bh0);
- lo = lo + Math.imul(al4, bl1) | 0;
- mid = mid + Math.imul(al4, bh1) | 0;
- mid = mid + Math.imul(ah4, bl1) | 0;
- hi = hi + Math.imul(ah4, bh1) | 0;
- lo = lo + Math.imul(al3, bl2) | 0;
- mid = mid + Math.imul(al3, bh2) | 0;
- mid = mid + Math.imul(ah3, bl2) | 0;
- hi = hi + Math.imul(ah3, bh2) | 0;
- lo = lo + Math.imul(al2, bl3) | 0;
- mid = mid + Math.imul(al2, bh3) | 0;
- mid = mid + Math.imul(ah2, bl3) | 0;
- hi = hi + Math.imul(ah2, bh3) | 0;
- lo = lo + Math.imul(al1, bl4) | 0;
- mid = mid + Math.imul(al1, bh4) | 0;
- mid = mid + Math.imul(ah1, bl4) | 0;
- hi = hi + Math.imul(ah1, bh4) | 0;
- lo = lo + Math.imul(al0, bl5) | 0;
- mid = mid + Math.imul(al0, bh5) | 0;
- mid = mid + Math.imul(ah0, bl5) | 0;
- hi = hi + Math.imul(ah0, bh5) | 0;
- var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0;
- w5 &= 67108863;
- lo = Math.imul(al6, bl0);
- mid = Math.imul(al6, bh0);
- mid = mid + Math.imul(ah6, bl0) | 0;
- hi = Math.imul(ah6, bh0);
- lo = lo + Math.imul(al5, bl1) | 0;
- mid = mid + Math.imul(al5, bh1) | 0;
- mid = mid + Math.imul(ah5, bl1) | 0;
- hi = hi + Math.imul(ah5, bh1) | 0;
- lo = lo + Math.imul(al4, bl2) | 0;
- mid = mid + Math.imul(al4, bh2) | 0;
- mid = mid + Math.imul(ah4, bl2) | 0;
- hi = hi + Math.imul(ah4, bh2) | 0;
- lo = lo + Math.imul(al3, bl3) | 0;
- mid = mid + Math.imul(al3, bh3) | 0;
- mid = mid + Math.imul(ah3, bl3) | 0;
- hi = hi + Math.imul(ah3, bh3) | 0;
- lo = lo + Math.imul(al2, bl4) | 0;
- mid = mid + Math.imul(al2, bh4) | 0;
- mid = mid + Math.imul(ah2, bl4) | 0;
- hi = hi + Math.imul(ah2, bh4) | 0;
- lo = lo + Math.imul(al1, bl5) | 0;
- mid = mid + Math.imul(al1, bh5) | 0;
- mid = mid + Math.imul(ah1, bl5) | 0;
- hi = hi + Math.imul(ah1, bh5) | 0;
- lo = lo + Math.imul(al0, bl6) | 0;
- mid = mid + Math.imul(al0, bh6) | 0;
- mid = mid + Math.imul(ah0, bl6) | 0;
- hi = hi + Math.imul(ah0, bh6) | 0;
- var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0;
- w6 &= 67108863;
- lo = Math.imul(al7, bl0);
- mid = Math.imul(al7, bh0);
- mid = mid + Math.imul(ah7, bl0) | 0;
- hi = Math.imul(ah7, bh0);
- lo = lo + Math.imul(al6, bl1) | 0;
- mid = mid + Math.imul(al6, bh1) | 0;
- mid = mid + Math.imul(ah6, bl1) | 0;
- hi = hi + Math.imul(ah6, bh1) | 0;
- lo = lo + Math.imul(al5, bl2) | 0;
- mid = mid + Math.imul(al5, bh2) | 0;
- mid = mid + Math.imul(ah5, bl2) | 0;
- hi = hi + Math.imul(ah5, bh2) | 0;
- lo = lo + Math.imul(al4, bl3) | 0;
- mid = mid + Math.imul(al4, bh3) | 0;
- mid = mid + Math.imul(ah4, bl3) | 0;
- hi = hi + Math.imul(ah4, bh3) | 0;
- lo = lo + Math.imul(al3, bl4) | 0;
- mid = mid + Math.imul(al3, bh4) | 0;
- mid = mid + Math.imul(ah3, bl4) | 0;
- hi = hi + Math.imul(ah3, bh4) | 0;
- lo = lo + Math.imul(al2, bl5) | 0;
- mid = mid + Math.imul(al2, bh5) | 0;
- mid = mid + Math.imul(ah2, bl5) | 0;
- hi = hi + Math.imul(ah2, bh5) | 0;
- lo = lo + Math.imul(al1, bl6) | 0;
- mid = mid + Math.imul(al1, bh6) | 0;
- mid = mid + Math.imul(ah1, bl6) | 0;
- hi = hi + Math.imul(ah1, bh6) | 0;
- lo = lo + Math.imul(al0, bl7) | 0;
- mid = mid + Math.imul(al0, bh7) | 0;
- mid = mid + Math.imul(ah0, bl7) | 0;
- hi = hi + Math.imul(ah0, bh7) | 0;
- var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0;
- w7 &= 67108863;
- lo = Math.imul(al8, bl0);
- mid = Math.imul(al8, bh0);
- mid = mid + Math.imul(ah8, bl0) | 0;
- hi = Math.imul(ah8, bh0);
- lo = lo + Math.imul(al7, bl1) | 0;
- mid = mid + Math.imul(al7, bh1) | 0;
- mid = mid + Math.imul(ah7, bl1) | 0;
- hi = hi + Math.imul(ah7, bh1) | 0;
- lo = lo + Math.imul(al6, bl2) | 0;
- mid = mid + Math.imul(al6, bh2) | 0;
- mid = mid + Math.imul(ah6, bl2) | 0;
- hi = hi + Math.imul(ah6, bh2) | 0;
- lo = lo + Math.imul(al5, bl3) | 0;
- mid = mid + Math.imul(al5, bh3) | 0;
- mid = mid + Math.imul(ah5, bl3) | 0;
- hi = hi + Math.imul(ah5, bh3) | 0;
- lo = lo + Math.imul(al4, bl4) | 0;
- mid = mid + Math.imul(al4, bh4) | 0;
- mid = mid + Math.imul(ah4, bl4) | 0;
- hi = hi + Math.imul(ah4, bh4) | 0;
- lo = lo + Math.imul(al3, bl5) | 0;
- mid = mid + Math.imul(al3, bh5) | 0;
- mid = mid + Math.imul(ah3, bl5) | 0;
- hi = hi + Math.imul(ah3, bh5) | 0;
- lo = lo + Math.imul(al2, bl6) | 0;
- mid = mid + Math.imul(al2, bh6) | 0;
- mid = mid + Math.imul(ah2, bl6) | 0;
- hi = hi + Math.imul(ah2, bh6) | 0;
- lo = lo + Math.imul(al1, bl7) | 0;
- mid = mid + Math.imul(al1, bh7) | 0;
- mid = mid + Math.imul(ah1, bl7) | 0;
- hi = hi + Math.imul(ah1, bh7) | 0;
- lo = lo + Math.imul(al0, bl8) | 0;
- mid = mid + Math.imul(al0, bh8) | 0;
- mid = mid + Math.imul(ah0, bl8) | 0;
- hi = hi + Math.imul(ah0, bh8) | 0;
- var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0;
- w8 &= 67108863;
- lo = Math.imul(al9, bl0);
- mid = Math.imul(al9, bh0);
- mid = mid + Math.imul(ah9, bl0) | 0;
- hi = Math.imul(ah9, bh0);
- lo = lo + Math.imul(al8, bl1) | 0;
- mid = mid + Math.imul(al8, bh1) | 0;
- mid = mid + Math.imul(ah8, bl1) | 0;
- hi = hi + Math.imul(ah8, bh1) | 0;
- lo = lo + Math.imul(al7, bl2) | 0;
- mid = mid + Math.imul(al7, bh2) | 0;
- mid = mid + Math.imul(ah7, bl2) | 0;
- hi = hi + Math.imul(ah7, bh2) | 0;
- lo = lo + Math.imul(al6, bl3) | 0;
- mid = mid + Math.imul(al6, bh3) | 0;
- mid = mid + Math.imul(ah6, bl3) | 0;
- hi = hi + Math.imul(ah6, bh3) | 0;
- lo = lo + Math.imul(al5, bl4) | 0;
- mid = mid + Math.imul(al5, bh4) | 0;
- mid = mid + Math.imul(ah5, bl4) | 0;
- hi = hi + Math.imul(ah5, bh4) | 0;
- lo = lo + Math.imul(al4, bl5) | 0;
- mid = mid + Math.imul(al4, bh5) | 0;
- mid = mid + Math.imul(ah4, bl5) | 0;
- hi = hi + Math.imul(ah4, bh5) | 0;
- lo = lo + Math.imul(al3, bl6) | 0;
- mid = mid + Math.imul(al3, bh6) | 0;
- mid = mid + Math.imul(ah3, bl6) | 0;
- hi = hi + Math.imul(ah3, bh6) | 0;
- lo = lo + Math.imul(al2, bl7) | 0;
- mid = mid + Math.imul(al2, bh7) | 0;
- mid = mid + Math.imul(ah2, bl7) | 0;
- hi = hi + Math.imul(ah2, bh7) | 0;
- lo = lo + Math.imul(al1, bl8) | 0;
- mid = mid + Math.imul(al1, bh8) | 0;
- mid = mid + Math.imul(ah1, bl8) | 0;
- hi = hi + Math.imul(ah1, bh8) | 0;
- lo = lo + Math.imul(al0, bl9) | 0;
- mid = mid + Math.imul(al0, bh9) | 0;
- mid = mid + Math.imul(ah0, bl9) | 0;
- hi = hi + Math.imul(ah0, bh9) | 0;
- var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0;
- w9 &= 67108863;
- lo = Math.imul(al9, bl1);
- mid = Math.imul(al9, bh1);
- mid = mid + Math.imul(ah9, bl1) | 0;
- hi = Math.imul(ah9, bh1);
- lo = lo + Math.imul(al8, bl2) | 0;
- mid = mid + Math.imul(al8, bh2) | 0;
- mid = mid + Math.imul(ah8, bl2) | 0;
- hi = hi + Math.imul(ah8, bh2) | 0;
- lo = lo + Math.imul(al7, bl3) | 0;
- mid = mid + Math.imul(al7, bh3) | 0;
- mid = mid + Math.imul(ah7, bl3) | 0;
- hi = hi + Math.imul(ah7, bh3) | 0;
- lo = lo + Math.imul(al6, bl4) | 0;
- mid = mid + Math.imul(al6, bh4) | 0;
- mid = mid + Math.imul(ah6, bl4) | 0;
- hi = hi + Math.imul(ah6, bh4) | 0;
- lo = lo + Math.imul(al5, bl5) | 0;
- mid = mid + Math.imul(al5, bh5) | 0;
- mid = mid + Math.imul(ah5, bl5) | 0;
- hi = hi + Math.imul(ah5, bh5) | 0;
- lo = lo + Math.imul(al4, bl6) | 0;
- mid = mid + Math.imul(al4, bh6) | 0;
- mid = mid + Math.imul(ah4, bl6) | 0;
- hi = hi + Math.imul(ah4, bh6) | 0;
- lo = lo + Math.imul(al3, bl7) | 0;
- mid = mid + Math.imul(al3, bh7) | 0;
- mid = mid + Math.imul(ah3, bl7) | 0;
- hi = hi + Math.imul(ah3, bh7) | 0;
- lo = lo + Math.imul(al2, bl8) | 0;
- mid = mid + Math.imul(al2, bh8) | 0;
- mid = mid + Math.imul(ah2, bl8) | 0;
- hi = hi + Math.imul(ah2, bh8) | 0;
- lo = lo + Math.imul(al1, bl9) | 0;
- mid = mid + Math.imul(al1, bh9) | 0;
- mid = mid + Math.imul(ah1, bl9) | 0;
- hi = hi + Math.imul(ah1, bh9) | 0;
- var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0;
- w10 &= 67108863;
- lo = Math.imul(al9, bl2);
- mid = Math.imul(al9, bh2);
- mid = mid + Math.imul(ah9, bl2) | 0;
- hi = Math.imul(ah9, bh2);
- lo = lo + Math.imul(al8, bl3) | 0;
- mid = mid + Math.imul(al8, bh3) | 0;
- mid = mid + Math.imul(ah8, bl3) | 0;
- hi = hi + Math.imul(ah8, bh3) | 0;
- lo = lo + Math.imul(al7, bl4) | 0;
- mid = mid + Math.imul(al7, bh4) | 0;
- mid = mid + Math.imul(ah7, bl4) | 0;
- hi = hi + Math.imul(ah7, bh4) | 0;
- lo = lo + Math.imul(al6, bl5) | 0;
- mid = mid + Math.imul(al6, bh5) | 0;
- mid = mid + Math.imul(ah6, bl5) | 0;
- hi = hi + Math.imul(ah6, bh5) | 0;
- lo = lo + Math.imul(al5, bl6) | 0;
- mid = mid + Math.imul(al5, bh6) | 0;
- mid = mid + Math.imul(ah5, bl6) | 0;
- hi = hi + Math.imul(ah5, bh6) | 0;
- lo = lo + Math.imul(al4, bl7) | 0;
- mid = mid + Math.imul(al4, bh7) | 0;
- mid = mid + Math.imul(ah4, bl7) | 0;
- hi = hi + Math.imul(ah4, bh7) | 0;
- lo = lo + Math.imul(al3, bl8) | 0;
- mid = mid + Math.imul(al3, bh8) | 0;
- mid = mid + Math.imul(ah3, bl8) | 0;
- hi = hi + Math.imul(ah3, bh8) | 0;
- lo = lo + Math.imul(al2, bl9) | 0;
- mid = mid + Math.imul(al2, bh9) | 0;
- mid = mid + Math.imul(ah2, bl9) | 0;
- hi = hi + Math.imul(ah2, bh9) | 0;
- var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0;
- w11 &= 67108863;
- lo = Math.imul(al9, bl3);
- mid = Math.imul(al9, bh3);
- mid = mid + Math.imul(ah9, bl3) | 0;
- hi = Math.imul(ah9, bh3);
- lo = lo + Math.imul(al8, bl4) | 0;
- mid = mid + Math.imul(al8, bh4) | 0;
- mid = mid + Math.imul(ah8, bl4) | 0;
- hi = hi + Math.imul(ah8, bh4) | 0;
- lo = lo + Math.imul(al7, bl5) | 0;
- mid = mid + Math.imul(al7, bh5) | 0;
- mid = mid + Math.imul(ah7, bl5) | 0;
- hi = hi + Math.imul(ah7, bh5) | 0;
- lo = lo + Math.imul(al6, bl6) | 0;
- mid = mid + Math.imul(al6, bh6) | 0;
- mid = mid + Math.imul(ah6, bl6) | 0;
- hi = hi + Math.imul(ah6, bh6) | 0;
- lo = lo + Math.imul(al5, bl7) | 0;
- mid = mid + Math.imul(al5, bh7) | 0;
- mid = mid + Math.imul(ah5, bl7) | 0;
- hi = hi + Math.imul(ah5, bh7) | 0;
- lo = lo + Math.imul(al4, bl8) | 0;
- mid = mid + Math.imul(al4, bh8) | 0;
- mid = mid + Math.imul(ah4, bl8) | 0;
- hi = hi + Math.imul(ah4, bh8) | 0;
- lo = lo + Math.imul(al3, bl9) | 0;
- mid = mid + Math.imul(al3, bh9) | 0;
- mid = mid + Math.imul(ah3, bl9) | 0;
- hi = hi + Math.imul(ah3, bh9) | 0;
- var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0;
- w12 &= 67108863;
- lo = Math.imul(al9, bl4);
- mid = Math.imul(al9, bh4);
- mid = mid + Math.imul(ah9, bl4) | 0;
- hi = Math.imul(ah9, bh4);
- lo = lo + Math.imul(al8, bl5) | 0;
- mid = mid + Math.imul(al8, bh5) | 0;
- mid = mid + Math.imul(ah8, bl5) | 0;
- hi = hi + Math.imul(ah8, bh5) | 0;
- lo = lo + Math.imul(al7, bl6) | 0;
- mid = mid + Math.imul(al7, bh6) | 0;
- mid = mid + Math.imul(ah7, bl6) | 0;
- hi = hi + Math.imul(ah7, bh6) | 0;
- lo = lo + Math.imul(al6, bl7) | 0;
- mid = mid + Math.imul(al6, bh7) | 0;
- mid = mid + Math.imul(ah6, bl7) | 0;
- hi = hi + Math.imul(ah6, bh7) | 0;
- lo = lo + Math.imul(al5, bl8) | 0;
- mid = mid + Math.imul(al5, bh8) | 0;
- mid = mid + Math.imul(ah5, bl8) | 0;
- hi = hi + Math.imul(ah5, bh8) | 0;
- lo = lo + Math.imul(al4, bl9) | 0;
- mid = mid + Math.imul(al4, bh9) | 0;
- mid = mid + Math.imul(ah4, bl9) | 0;
- hi = hi + Math.imul(ah4, bh9) | 0;
- var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0;
- w13 &= 67108863;
- lo = Math.imul(al9, bl5);
- mid = Math.imul(al9, bh5);
- mid = mid + Math.imul(ah9, bl5) | 0;
- hi = Math.imul(ah9, bh5);
- lo = lo + Math.imul(al8, bl6) | 0;
- mid = mid + Math.imul(al8, bh6) | 0;
- mid = mid + Math.imul(ah8, bl6) | 0;
- hi = hi + Math.imul(ah8, bh6) | 0;
- lo = lo + Math.imul(al7, bl7) | 0;
- mid = mid + Math.imul(al7, bh7) | 0;
- mid = mid + Math.imul(ah7, bl7) | 0;
- hi = hi + Math.imul(ah7, bh7) | 0;
- lo = lo + Math.imul(al6, bl8) | 0;
- mid = mid + Math.imul(al6, bh8) | 0;
- mid = mid + Math.imul(ah6, bl8) | 0;
- hi = hi + Math.imul(ah6, bh8) | 0;
- lo = lo + Math.imul(al5, bl9) | 0;
- mid = mid + Math.imul(al5, bh9) | 0;
- mid = mid + Math.imul(ah5, bl9) | 0;
- hi = hi + Math.imul(ah5, bh9) | 0;
- var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0;
- w14 &= 67108863;
- lo = Math.imul(al9, bl6);
- mid = Math.imul(al9, bh6);
- mid = mid + Math.imul(ah9, bl6) | 0;
- hi = Math.imul(ah9, bh6);
- lo = lo + Math.imul(al8, bl7) | 0;
- mid = mid + Math.imul(al8, bh7) | 0;
- mid = mid + Math.imul(ah8, bl7) | 0;
- hi = hi + Math.imul(ah8, bh7) | 0;
- lo = lo + Math.imul(al7, bl8) | 0;
- mid = mid + Math.imul(al7, bh8) | 0;
- mid = mid + Math.imul(ah7, bl8) | 0;
- hi = hi + Math.imul(ah7, bh8) | 0;
- lo = lo + Math.imul(al6, bl9) | 0;
- mid = mid + Math.imul(al6, bh9) | 0;
- mid = mid + Math.imul(ah6, bl9) | 0;
- hi = hi + Math.imul(ah6, bh9) | 0;
- var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0;
- w15 &= 67108863;
- lo = Math.imul(al9, bl7);
- mid = Math.imul(al9, bh7);
- mid = mid + Math.imul(ah9, bl7) | 0;
- hi = Math.imul(ah9, bh7);
- lo = lo + Math.imul(al8, bl8) | 0;
- mid = mid + Math.imul(al8, bh8) | 0;
- mid = mid + Math.imul(ah8, bl8) | 0;
- hi = hi + Math.imul(ah8, bh8) | 0;
- lo = lo + Math.imul(al7, bl9) | 0;
- mid = mid + Math.imul(al7, bh9) | 0;
- mid = mid + Math.imul(ah7, bl9) | 0;
- hi = hi + Math.imul(ah7, bh9) | 0;
- var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0;
- w16 &= 67108863;
- lo = Math.imul(al9, bl8);
- mid = Math.imul(al9, bh8);
- mid = mid + Math.imul(ah9, bl8) | 0;
- hi = Math.imul(ah9, bh8);
- lo = lo + Math.imul(al8, bl9) | 0;
- mid = mid + Math.imul(al8, bh9) | 0;
- mid = mid + Math.imul(ah8, bl9) | 0;
- hi = hi + Math.imul(ah8, bh9) | 0;
- var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0;
- w17 &= 67108863;
- lo = Math.imul(al9, bl9);
- mid = Math.imul(al9, bh9);
- mid = mid + Math.imul(ah9, bl9) | 0;
- hi = Math.imul(ah9, bh9);
- var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0;
- w18 &= 67108863;
- o[0] = w0;
- o[1] = w1;
- o[2] = w2;
- o[3] = w3;
- o[4] = w4;
- o[5] = w5;
- o[6] = w6;
- o[7] = w7;
- o[8] = w8;
- o[9] = w9;
- o[10] = w10;
- o[11] = w11;
- o[12] = w12;
- o[13] = w13;
- o[14] = w14;
- o[15] = w15;
- o[16] = w16;
- o[17] = w17;
- o[18] = w18;
- if (c !== 0) {
- o[19] = c;
- out.length++;
- }
- return out;
- };
- if (!Math.imul) {
- comb10MulTo = smallMulTo;
- }
- function bigMulTo(self2, num, out) {
- out.negative = num.negative ^ self2.negative;
- out.length = self2.length + num.length;
- var carry = 0;
- var hncarry = 0;
- for (var k = 0;k < out.length - 1; k++) {
- var ncarry = hncarry;
- hncarry = 0;
- var rword = carry & 67108863;
- var maxJ = Math.min(k, num.length - 1);
- for (var j = Math.max(0, k - self2.length + 1);j <= maxJ; j++) {
- var i = k - j;
- var a = self2.words[i] | 0;
- var b = num.words[j] | 0;
- var r = a * b;
- var lo = r & 67108863;
- ncarry = ncarry + (r / 67108864 | 0) | 0;
- lo = lo + rword | 0;
- rword = lo & 67108863;
- ncarry = ncarry + (lo >>> 26) | 0;
- hncarry += ncarry >>> 26;
- ncarry &= 67108863;
- }
- out.words[k] = rword;
- carry = ncarry;
- ncarry = hncarry;
- }
- if (carry !== 0) {
- out.words[k] = carry;
- } else {
- out.length--;
- }
- return out.strip();
- }
- function jumboMulTo(self2, num, out) {
- var fftm = new FFTM;
- return fftm.mulp(self2, num, out);
- }
- BN.prototype.mulTo = function mulTo(num, out) {
- var res;
- var len = this.length + num.length;
- if (this.length === 10 && num.length === 10) {
- res = comb10MulTo(this, num, out);
- } else if (len < 63) {
- res = smallMulTo(this, num, out);
- } else if (len < 1024) {
- res = bigMulTo(this, num, out);
- } else {
- res = jumboMulTo(this, num, out);
- }
- return res;
- };
- function FFTM(x, y) {
- this.x = x;
- this.y = y;
- }
- FFTM.prototype.makeRBT = function makeRBT(N) {
- var t = new Array(N);
- var l = BN.prototype._countBits(N) - 1;
- for (var i = 0;i < N; i++) {
- t[i] = this.revBin(i, l, N);
- }
- return t;
- };
- FFTM.prototype.revBin = function revBin(x, l, N) {
- if (x === 0 || x === N - 1)
- return x;
- var rb = 0;
- for (var i = 0;i < l; i++) {
- rb |= (x & 1) << l - i - 1;
- x >>= 1;
- }
- return rb;
- };
- FFTM.prototype.permute = function permute(rbt, rws, iws, rtws, itws, N) {
- for (var i = 0;i < N; i++) {
- rtws[i] = rws[rbt[i]];
- itws[i] = iws[rbt[i]];
- }
- };
- FFTM.prototype.transform = function transform(rws, iws, rtws, itws, N, rbt) {
- this.permute(rbt, rws, iws, rtws, itws, N);
- for (var s = 1;s < N; s <<= 1) {
- var l = s << 1;
- var rtwdf = Math.cos(2 * Math.PI / l);
- var itwdf = Math.sin(2 * Math.PI / l);
- for (var p = 0;p < N; p += l) {
- var rtwdf_ = rtwdf;
- var itwdf_ = itwdf;
- for (var j = 0;j < s; j++) {
- var re = rtws[p + j];
- var ie = itws[p + j];
- var ro = rtws[p + j + s];
- var io = itws[p + j + s];
- var rx = rtwdf_ * ro - itwdf_ * io;
- io = rtwdf_ * io + itwdf_ * ro;
- ro = rx;
- rtws[p + j] = re + ro;
- itws[p + j] = ie + io;
- rtws[p + j + s] = re - ro;
- itws[p + j + s] = ie - io;
- if (j !== l) {
- rx = rtwdf * rtwdf_ - itwdf * itwdf_;
- itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;
- rtwdf_ = rx;
- }
- }
- }
- }
- };
- FFTM.prototype.guessLen13b = function guessLen13b(n, m) {
- var N = Math.max(m, n) | 1;
- var odd = N & 1;
- var i = 0;
- for (N = N / 2 | 0;N; N = N >>> 1) {
- i++;
- }
- return 1 << i + 1 + odd;
- };
- FFTM.prototype.conjugate = function conjugate(rws, iws, N) {
- if (N <= 1)
- return;
- for (var i = 0;i < N / 2; i++) {
- var t = rws[i];
- rws[i] = rws[N - i - 1];
- rws[N - i - 1] = t;
- t = iws[i];
- iws[i] = -iws[N - i - 1];
- iws[N - i - 1] = -t;
- }
- };
- FFTM.prototype.normalize13b = function normalize13b(ws, N) {
- var carry = 0;
- for (var i = 0;i < N / 2; i++) {
- var w = Math.round(ws[2 * i + 1] / N) * 8192 + Math.round(ws[2 * i] / N) + carry;
- ws[i] = w & 67108863;
- if (w < 67108864) {
- carry = 0;
- } else {
- carry = w / 67108864 | 0;
- }
- }
- return ws;
- };
- FFTM.prototype.convert13b = function convert13b(ws, len, rws, N) {
- var carry = 0;
- for (var i = 0;i < len; i++) {
- carry = carry + (ws[i] | 0);
- rws[2 * i] = carry & 8191;
- carry = carry >>> 13;
- rws[2 * i + 1] = carry & 8191;
- carry = carry >>> 13;
- }
- for (i = 2 * len;i < N; ++i) {
- rws[i] = 0;
- }
- assert(carry === 0);
- assert((carry & ~8191) === 0);
- };
- FFTM.prototype.stub = function stub(N) {
- var ph = new Array(N);
- for (var i = 0;i < N; i++) {
- ph[i] = 0;
- }
- return ph;
- };
- FFTM.prototype.mulp = function mulp(x, y, out) {
- var N = 2 * this.guessLen13b(x.length, y.length);
- var rbt = this.makeRBT(N);
- var _ = this.stub(N);
- var rws = new Array(N);
- var rwst = new Array(N);
- var iwst = new Array(N);
- var nrws = new Array(N);
- var nrwst = new Array(N);
- var niwst = new Array(N);
- var rmws = out.words;
- rmws.length = N;
- this.convert13b(x.words, x.length, rws, N);
- this.convert13b(y.words, y.length, nrws, N);
- this.transform(rws, _, rwst, iwst, N, rbt);
- this.transform(nrws, _, nrwst, niwst, N, rbt);
- for (var i = 0;i < N; i++) {
- var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];
- iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];
- rwst[i] = rx;
- }
- this.conjugate(rwst, iwst, N);
- this.transform(rwst, iwst, rmws, _, N, rbt);
- this.conjugate(rmws, _, N);
- this.normalize13b(rmws, N);
- out.negative = x.negative ^ y.negative;
- out.length = x.length + y.length;
- return out.strip();
- };
- BN.prototype.mul = function mul(num) {
- var out = new BN(null);
- out.words = new Array(this.length + num.length);
- return this.mulTo(num, out);
- };
- BN.prototype.mulf = function mulf(num) {
- var out = new BN(null);
- out.words = new Array(this.length + num.length);
- return jumboMulTo(this, num, out);
- };
- BN.prototype.imul = function imul(num) {
- return this.clone().mulTo(num, this);
- };
- BN.prototype.imuln = function imuln(num) {
- assert(typeof num === "number");
- assert(num < 67108864);
- var carry = 0;
- for (var i = 0;i < this.length; i++) {
- var w = (this.words[i] | 0) * num;
- var lo = (w & 67108863) + (carry & 67108863);
- carry >>= 26;
- carry += w / 67108864 | 0;
- carry += lo >>> 26;
- this.words[i] = lo & 67108863;
- }
- if (carry !== 0) {
- this.words[i] = carry;
- this.length++;
- }
- this.length = num === 0 ? 1 : this.length;
- return this;
- };
- BN.prototype.muln = function muln(num) {
- return this.clone().imuln(num);
- };
- BN.prototype.sqr = function sqr() {
- return this.mul(this);
- };
- BN.prototype.isqr = function isqr() {
- return this.imul(this.clone());
- };
- BN.prototype.pow = function pow(num) {
- var w = toBitArray(num);
- if (w.length === 0)
- return new BN(1);
- var res = this;
- for (var i = 0;i < w.length; i++, res = res.sqr()) {
- if (w[i] !== 0)
- break;
- }
- if (++i < w.length) {
- for (var q = res.sqr();i < w.length; i++, q = q.sqr()) {
- if (w[i] === 0)
- continue;
- res = res.mul(q);
- }
- }
- return res;
- };
- BN.prototype.iushln = function iushln(bits) {
- assert(typeof bits === "number" && bits >= 0);
- var r = bits % 26;
- var s = (bits - r) / 26;
- var carryMask = 67108863 >>> 26 - r << 26 - r;
- var i;
- if (r !== 0) {
- var carry = 0;
- for (i = 0;i < this.length; i++) {
- var newCarry = this.words[i] & carryMask;
- var c = (this.words[i] | 0) - newCarry << r;
- this.words[i] = c | carry;
- carry = newCarry >>> 26 - r;
- }
- if (carry) {
- this.words[i] = carry;
- this.length++;
- }
- }
- if (s !== 0) {
- for (i = this.length - 1;i >= 0; i--) {
- this.words[i + s] = this.words[i];
- }
- for (i = 0;i < s; i++) {
- this.words[i] = 0;
- }
- this.length += s;
- }
- return this.strip();
- };
- BN.prototype.ishln = function ishln(bits) {
- assert(this.negative === 0);
- return this.iushln(bits);
- };
- BN.prototype.iushrn = function iushrn(bits, hint, extended) {
- assert(typeof bits === "number" && bits >= 0);
- var h;
- if (hint) {
- h = (hint - hint % 26) / 26;
- } else {
- h = 0;
- }
- var r = bits % 26;
- var s = Math.min((bits - r) / 26, this.length);
- var mask = 67108863 ^ 67108863 >>> r << r;
- var maskedWords = extended;
- h -= s;
- h = Math.max(0, h);
- if (maskedWords) {
- for (var i = 0;i < s; i++) {
- maskedWords.words[i] = this.words[i];
- }
- maskedWords.length = s;
- }
- if (s === 0) {} else if (this.length > s) {
- this.length -= s;
- for (i = 0;i < this.length; i++) {
- this.words[i] = this.words[i + s];
- }
- } else {
- this.words[0] = 0;
- this.length = 1;
- }
- var carry = 0;
- for (i = this.length - 1;i >= 0 && (carry !== 0 || i >= h); i--) {
- var word = this.words[i] | 0;
- this.words[i] = carry << 26 - r | word >>> r;
- carry = word & mask;
- }
- if (maskedWords && carry !== 0) {
- maskedWords.words[maskedWords.length++] = carry;
- }
- if (this.length === 0) {
- this.words[0] = 0;
- this.length = 1;
- }
- return this.strip();
- };
- BN.prototype.ishrn = function ishrn(bits, hint, extended) {
- assert(this.negative === 0);
- return this.iushrn(bits, hint, extended);
- };
- BN.prototype.shln = function shln(bits) {
- return this.clone().ishln(bits);
- };
- BN.prototype.ushln = function ushln(bits) {
- return this.clone().iushln(bits);
- };
- BN.prototype.shrn = function shrn(bits) {
- return this.clone().ishrn(bits);
- };
- BN.prototype.ushrn = function ushrn(bits) {
- return this.clone().iushrn(bits);
- };
- BN.prototype.testn = function testn(bit) {
- assert(typeof bit === "number" && bit >= 0);
- var r = bit % 26;
- var s = (bit - r) / 26;
- var q = 1 << r;
- if (this.length <= s)
- return false;
- var w = this.words[s];
- return !!(w & q);
- };
- BN.prototype.imaskn = function imaskn(bits) {
- assert(typeof bits === "number" && bits >= 0);
- var r = bits % 26;
- var s = (bits - r) / 26;
- assert(this.negative === 0, "imaskn works only with positive numbers");
- if (this.length <= s) {
- return this;
- }
- if (r !== 0) {
- s++;
- }
- this.length = Math.min(s, this.length);
- if (r !== 0) {
- var mask = 67108863 ^ 67108863 >>> r << r;
- this.words[this.length - 1] &= mask;
- }
- return this.strip();
- };
- BN.prototype.maskn = function maskn(bits) {
- return this.clone().imaskn(bits);
- };
- BN.prototype.iaddn = function iaddn(num) {
- assert(typeof num === "number");
- assert(num < 67108864);
- if (num < 0)
- return this.isubn(-num);
- if (this.negative !== 0) {
- if (this.length === 1 && (this.words[0] | 0) < num) {
- this.words[0] = num - (this.words[0] | 0);
- this.negative = 0;
- return this;
- }
- this.negative = 0;
- this.isubn(num);
- this.negative = 1;
- return this;
- }
- return this._iaddn(num);
- };
- BN.prototype._iaddn = function _iaddn(num) {
- this.words[0] += num;
- for (var i = 0;i < this.length && this.words[i] >= 67108864; i++) {
- this.words[i] -= 67108864;
- if (i === this.length - 1) {
- this.words[i + 1] = 1;
- } else {
- this.words[i + 1]++;
- }
- }
- this.length = Math.max(this.length, i + 1);
- return this;
- };
- BN.prototype.isubn = function isubn(num) {
- assert(typeof num === "number");
- assert(num < 67108864);
- if (num < 0)
- return this.iaddn(-num);
- if (this.negative !== 0) {
- this.negative = 0;
- this.iaddn(num);
- this.negative = 1;
- return this;
- }
- this.words[0] -= num;
- if (this.length === 1 && this.words[0] < 0) {
- this.words[0] = -this.words[0];
- this.negative = 1;
- } else {
- for (var i = 0;i < this.length && this.words[i] < 0; i++) {
- this.words[i] += 67108864;
- this.words[i + 1] -= 1;
- }
- }
- return this.strip();
- };
- BN.prototype.addn = function addn(num) {
- return this.clone().iaddn(num);
- };
- BN.prototype.subn = function subn(num) {
- return this.clone().isubn(num);
- };
- BN.prototype.iabs = function iabs() {
- this.negative = 0;
- return this;
- };
- BN.prototype.abs = function abs() {
- return this.clone().iabs();
- };
- BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) {
- var len = num.length + shift;
- var i;
- this._expand(len);
- var w;
- var carry = 0;
- for (i = 0;i < num.length; i++) {
- w = (this.words[i + shift] | 0) + carry;
- var right = (num.words[i] | 0) * mul;
- w -= right & 67108863;
- carry = (w >> 26) - (right / 67108864 | 0);
- this.words[i + shift] = w & 67108863;
- }
- for (;i < this.length - shift; i++) {
- w = (this.words[i + shift] | 0) + carry;
- carry = w >> 26;
- this.words[i + shift] = w & 67108863;
- }
- if (carry === 0)
- return this.strip();
- assert(carry === -1);
- carry = 0;
- for (i = 0;i < this.length; i++) {
- w = -(this.words[i] | 0) + carry;
- carry = w >> 26;
- this.words[i] = w & 67108863;
- }
- this.negative = 1;
- return this.strip();
- };
- BN.prototype._wordDiv = function _wordDiv(num, mode) {
- var shift = this.length - num.length;
- var a = this.clone();
- var b = num;
- var bhi = b.words[b.length - 1] | 0;
- var bhiBits = this._countBits(bhi);
- shift = 26 - bhiBits;
- if (shift !== 0) {
- b = b.ushln(shift);
- a.iushln(shift);
- bhi = b.words[b.length - 1] | 0;
- }
- var m = a.length - b.length;
- var q;
- if (mode !== "mod") {
- q = new BN(null);
- q.length = m + 1;
- q.words = new Array(q.length);
- for (var i = 0;i < q.length; i++) {
- q.words[i] = 0;
- }
- }
- var diff = a.clone()._ishlnsubmul(b, 1, m);
- if (diff.negative === 0) {
- a = diff;
- if (q) {
- q.words[m] = 1;
- }
- }
- for (var j = m - 1;j >= 0; j--) {
- var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0);
- qj = Math.min(qj / bhi | 0, 67108863);
- a._ishlnsubmul(b, qj, j);
- while (a.negative !== 0) {
- qj--;
- a.negative = 0;
- a._ishlnsubmul(b, 1, j);
- if (!a.isZero()) {
- a.negative ^= 1;
- }
- }
- if (q) {
- q.words[j] = qj;
- }
- }
- if (q) {
- q.strip();
- }
- a.strip();
- if (mode !== "div" && shift !== 0) {
- a.iushrn(shift);
- }
- return {
- div: q || null,
- mod: a
- };
- };
- BN.prototype.divmod = function divmod(num, mode, positive) {
- assert(!num.isZero());
- if (this.isZero()) {
- return {
- div: new BN(0),
- mod: new BN(0)
- };
- }
- var div, mod, res;
- if (this.negative !== 0 && num.negative === 0) {
- res = this.neg().divmod(num, mode);
- if (mode !== "mod") {
- div = res.div.neg();
- }
- if (mode !== "div") {
- mod = res.mod.neg();
- if (positive && mod.negative !== 0) {
- mod.iadd(num);
- }
- }
- return {
- div,
- mod
- };
- }
- if (this.negative === 0 && num.negative !== 0) {
- res = this.divmod(num.neg(), mode);
- if (mode !== "mod") {
- div = res.div.neg();
- }
- return {
- div,
- mod: res.mod
- };
- }
- if ((this.negative & num.negative) !== 0) {
- res = this.neg().divmod(num.neg(), mode);
- if (mode !== "div") {
- mod = res.mod.neg();
- if (positive && mod.negative !== 0) {
- mod.isub(num);
- }
- }
- return {
- div: res.div,
- mod
- };
- }
- if (num.length > this.length || this.cmp(num) < 0) {
- return {
- div: new BN(0),
- mod: this
- };
- }
- if (num.length === 1) {
- if (mode === "div") {
- return {
- div: this.divn(num.words[0]),
- mod: null
- };
- }
- if (mode === "mod") {
- return {
- div: null,
- mod: new BN(this.modn(num.words[0]))
- };
- }
- return {
- div: this.divn(num.words[0]),
- mod: new BN(this.modn(num.words[0]))
- };
- }
- return this._wordDiv(num, mode);
- };
- BN.prototype.div = function div(num) {
- return this.divmod(num, "div", false).div;
- };
- BN.prototype.mod = function mod(num) {
- return this.divmod(num, "mod", false).mod;
- };
- BN.prototype.umod = function umod(num) {
- return this.divmod(num, "mod", true).mod;
- };
- BN.prototype.divRound = function divRound(num) {
- var dm = this.divmod(num);
- if (dm.mod.isZero())
- return dm.div;
- var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;
- var half = num.ushrn(1);
- var r2 = num.andln(1);
- var cmp = mod.cmp(half);
- if (cmp < 0 || r2 === 1 && cmp === 0)
- return dm.div;
- return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
- };
- BN.prototype.modn = function modn(num) {
- assert(num <= 67108863);
- var p = (1 << 26) % num;
- var acc = 0;
- for (var i = this.length - 1;i >= 0; i--) {
- acc = (p * acc + (this.words[i] | 0)) % num;
- }
- return acc;
- };
- BN.prototype.idivn = function idivn(num) {
- assert(num <= 67108863);
- var carry = 0;
- for (var i = this.length - 1;i >= 0; i--) {
- var w = (this.words[i] | 0) + carry * 67108864;
- this.words[i] = w / num | 0;
- carry = w % num;
- }
- return this.strip();
- };
- BN.prototype.divn = function divn(num) {
- return this.clone().idivn(num);
- };
- BN.prototype.egcd = function egcd(p) {
- assert(p.negative === 0);
- assert(!p.isZero());
- var x = this;
- var y = p.clone();
- if (x.negative !== 0) {
- x = x.umod(p);
- } else {
- x = x.clone();
- }
- var A = new BN(1);
- var B = new BN(0);
- var C = new BN(0);
- var D = new BN(1);
- var g = 0;
- while (x.isEven() && y.isEven()) {
- x.iushrn(1);
- y.iushrn(1);
- ++g;
- }
- var yp = y.clone();
- var xp = x.clone();
- while (!x.isZero()) {
- for (var i = 0, im = 1;(x.words[0] & im) === 0 && i < 26; ++i, im <<= 1)
- ;
- if (i > 0) {
- x.iushrn(i);
- while (i-- > 0) {
- if (A.isOdd() || B.isOdd()) {
- A.iadd(yp);
- B.isub(xp);
- }
- A.iushrn(1);
- B.iushrn(1);
- }
- }
- for (var j = 0, jm = 1;(y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1)
- ;
- if (j > 0) {
- y.iushrn(j);
- while (j-- > 0) {
- if (C.isOdd() || D.isOdd()) {
- C.iadd(yp);
- D.isub(xp);
- }
- C.iushrn(1);
- D.iushrn(1);
- }
- }
- if (x.cmp(y) >= 0) {
- x.isub(y);
- A.isub(C);
- B.isub(D);
- } else {
- y.isub(x);
- C.isub(A);
- D.isub(B);
- }
- }
- return {
- a: C,
- b: D,
- gcd: y.iushln(g)
- };
- };
- BN.prototype._invmp = function _invmp(p) {
- assert(p.negative === 0);
- assert(!p.isZero());
- var a = this;
- var b = p.clone();
- if (a.negative !== 0) {
- a = a.umod(p);
- } else {
- a = a.clone();
- }
- var x1 = new BN(1);
- var x2 = new BN(0);
- var delta = b.clone();
- while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
- for (var i = 0, im = 1;(a.words[0] & im) === 0 && i < 26; ++i, im <<= 1)
- ;
- if (i > 0) {
- a.iushrn(i);
- while (i-- > 0) {
- if (x1.isOdd()) {
- x1.iadd(delta);
- }
- x1.iushrn(1);
- }
- }
- for (var j = 0, jm = 1;(b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1)
- ;
- if (j > 0) {
- b.iushrn(j);
- while (j-- > 0) {
- if (x2.isOdd()) {
- x2.iadd(delta);
- }
- x2.iushrn(1);
- }
- }
- if (a.cmp(b) >= 0) {
- a.isub(b);
- x1.isub(x2);
- } else {
- b.isub(a);
- x2.isub(x1);
- }
- }
- var res;
- if (a.cmpn(1) === 0) {
- res = x1;
- } else {
- res = x2;
- }
- if (res.cmpn(0) < 0) {
- res.iadd(p);
- }
- return res;
- };
- BN.prototype.gcd = function gcd(num) {
- if (this.isZero())
- return num.abs();
- if (num.isZero())
- return this.abs();
- var a = this.clone();
- var b = num.clone();
- a.negative = 0;
- b.negative = 0;
- for (var shift = 0;a.isEven() && b.isEven(); shift++) {
- a.iushrn(1);
- b.iushrn(1);
- }
- do {
- while (a.isEven()) {
- a.iushrn(1);
- }
- while (b.isEven()) {
- b.iushrn(1);
- }
- var r = a.cmp(b);
- if (r < 0) {
- var t = a;
- a = b;
- b = t;
- } else if (r === 0 || b.cmpn(1) === 0) {
- break;
- }
- a.isub(b);
- } while (true);
- return b.iushln(shift);
- };
- BN.prototype.invm = function invm(num) {
- return this.egcd(num).a.umod(num);
- };
- BN.prototype.isEven = function isEven() {
- return (this.words[0] & 1) === 0;
- };
- BN.prototype.isOdd = function isOdd() {
- return (this.words[0] & 1) === 1;
- };
- BN.prototype.andln = function andln(num) {
- return this.words[0] & num;
- };
- BN.prototype.bincn = function bincn(bit) {
- assert(typeof bit === "number");
- var r = bit % 26;
- var s = (bit - r) / 26;
- var q = 1 << r;
- if (this.length <= s) {
- this._expand(s + 1);
- this.words[s] |= q;
- return this;
- }
- var carry = q;
- for (var i = s;carry !== 0 && i < this.length; i++) {
- var w = this.words[i] | 0;
- w += carry;
- carry = w >>> 26;
- w &= 67108863;
- this.words[i] = w;
- }
- if (carry !== 0) {
- this.words[i] = carry;
- this.length++;
- }
- return this;
- };
- BN.prototype.isZero = function isZero() {
- return this.length === 1 && this.words[0] === 0;
- };
- BN.prototype.cmpn = function cmpn(num) {
- var negative = num < 0;
- if (this.negative !== 0 && !negative)
- return -1;
- if (this.negative === 0 && negative)
- return 1;
- this.strip();
- var res;
- if (this.length > 1) {
- res = 1;
- } else {
- if (negative) {
- num = -num;
- }
- assert(num <= 67108863, "Number is too big");
- var w = this.words[0] | 0;
- res = w === num ? 0 : w < num ? -1 : 1;
- }
- if (this.negative !== 0)
- return -res | 0;
- return res;
- };
- BN.prototype.cmp = function cmp(num) {
- if (this.negative !== 0 && num.negative === 0)
- return -1;
- if (this.negative === 0 && num.negative !== 0)
- return 1;
- var res = this.ucmp(num);
- if (this.negative !== 0)
- return -res | 0;
- return res;
- };
- BN.prototype.ucmp = function ucmp(num) {
- if (this.length > num.length)
- return 1;
- if (this.length < num.length)
- return -1;
- var res = 0;
- for (var i = this.length - 1;i >= 0; i--) {
- var a = this.words[i] | 0;
- var b = num.words[i] | 0;
- if (a === b)
- continue;
- if (a < b) {
- res = -1;
- } else if (a > b) {
- res = 1;
- }
- break;
- }
- return res;
- };
- BN.prototype.gtn = function gtn(num) {
- return this.cmpn(num) === 1;
- };
- BN.prototype.gt = function gt(num) {
- return this.cmp(num) === 1;
- };
- BN.prototype.gten = function gten(num) {
- return this.cmpn(num) >= 0;
- };
- BN.prototype.gte = function gte(num) {
- return this.cmp(num) >= 0;
- };
- BN.prototype.ltn = function ltn(num) {
- return this.cmpn(num) === -1;
- };
- BN.prototype.lt = function lt(num) {
- return this.cmp(num) === -1;
- };
- BN.prototype.lten = function lten(num) {
- return this.cmpn(num) <= 0;
- };
- BN.prototype.lte = function lte(num) {
- return this.cmp(num) <= 0;
- };
- BN.prototype.eqn = function eqn(num) {
- return this.cmpn(num) === 0;
- };
- BN.prototype.eq = function eq(num) {
- return this.cmp(num) === 0;
- };
- BN.red = function red(num) {
- return new Red(num);
- };
- BN.prototype.toRed = function toRed(ctx) {
- assert(!this.red, "Already a number in reduction context");
- assert(this.negative === 0, "red works only with positives");
- return ctx.convertTo(this)._forceRed(ctx);
- };
- BN.prototype.fromRed = function fromRed() {
- assert(this.red, "fromRed works only with numbers in reduction context");
- return this.red.convertFrom(this);
- };
- BN.prototype._forceRed = function _forceRed(ctx) {
- this.red = ctx;
- return this;
- };
- BN.prototype.forceRed = function forceRed(ctx) {
- assert(!this.red, "Already a number in reduction context");
- return this._forceRed(ctx);
- };
- BN.prototype.redAdd = function redAdd(num) {
- assert(this.red, "redAdd works only with red numbers");
- return this.red.add(this, num);
- };
- BN.prototype.redIAdd = function redIAdd(num) {
- assert(this.red, "redIAdd works only with red numbers");
- return this.red.iadd(this, num);
- };
- BN.prototype.redSub = function redSub(num) {
- assert(this.red, "redSub works only with red numbers");
- return this.red.sub(this, num);
- };
- BN.prototype.redISub = function redISub(num) {
- assert(this.red, "redISub works only with red numbers");
- return this.red.isub(this, num);
- };
- BN.prototype.redShl = function redShl(num) {
- assert(this.red, "redShl works only with red numbers");
- return this.red.shl(this, num);
- };
- BN.prototype.redMul = function redMul(num) {
- assert(this.red, "redMul works only with red numbers");
- this.red._verify2(this, num);
- return this.red.mul(this, num);
- };
- BN.prototype.redIMul = function redIMul(num) {
- assert(this.red, "redMul works only with red numbers");
- this.red._verify2(this, num);
- return this.red.imul(this, num);
- };
- BN.prototype.redSqr = function redSqr() {
- assert(this.red, "redSqr works only with red numbers");
- this.red._verify1(this);
- return this.red.sqr(this);
- };
- BN.prototype.redISqr = function redISqr() {
- assert(this.red, "redISqr works only with red numbers");
- this.red._verify1(this);
- return this.red.isqr(this);
- };
- BN.prototype.redSqrt = function redSqrt() {
- assert(this.red, "redSqrt works only with red numbers");
- this.red._verify1(this);
- return this.red.sqrt(this);
- };
- BN.prototype.redInvm = function redInvm() {
- assert(this.red, "redInvm works only with red numbers");
- this.red._verify1(this);
- return this.red.invm(this);
- };
- BN.prototype.redNeg = function redNeg() {
- assert(this.red, "redNeg works only with red numbers");
- this.red._verify1(this);
- return this.red.neg(this);
- };
- BN.prototype.redPow = function redPow(num) {
- assert(this.red && !num.red, "redPow(normalNum)");
- this.red._verify1(this);
- return this.red.pow(this, num);
- };
- var primes = {
- k256: null,
- p224: null,
- p192: null,
- p25519: null
- };
- function MPrime(name, p) {
- this.name = name;
- this.p = new BN(p, 16);
- this.n = this.p.bitLength();
- this.k = new BN(1).iushln(this.n).isub(this.p);
- this.tmp = this._tmp();
- }
- MPrime.prototype._tmp = function _tmp() {
- var tmp = new BN(null);
- tmp.words = new Array(Math.ceil(this.n / 13));
- return tmp;
- };
- MPrime.prototype.ireduce = function ireduce(num) {
- var r = num;
- var rlen;
- do {
- this.split(r, this.tmp);
- r = this.imulK(r);
- r = r.iadd(this.tmp);
- rlen = r.bitLength();
- } while (rlen > this.n);
- var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
- if (cmp === 0) {
- r.words[0] = 0;
- r.length = 1;
- } else if (cmp > 0) {
- r.isub(this.p);
- } else {
- if (r.strip !== undefined) {
- r.strip();
- } else {
- r._strip();
- }
- }
- return r;
- };
- MPrime.prototype.split = function split(input, out) {
- input.iushrn(this.n, 0, out);
- };
- MPrime.prototype.imulK = function imulK(num) {
- return num.imul(this.k);
- };
- function K256() {
- MPrime.call(this, "k256", "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f");
- }
- inherits(K256, MPrime);
- K256.prototype.split = function split(input, output) {
- var mask = 4194303;
- var outLen = Math.min(input.length, 9);
- for (var i = 0;i < outLen; i++) {
- output.words[i] = input.words[i];
- }
- output.length = outLen;
- if (input.length <= 9) {
- input.words[0] = 0;
- input.length = 1;
- return;
- }
- var prev = input.words[9];
- output.words[output.length++] = prev & mask;
- for (i = 10;i < input.length; i++) {
- var next = input.words[i] | 0;
- input.words[i - 10] = (next & mask) << 4 | prev >>> 22;
- prev = next;
- }
- prev >>>= 22;
- input.words[i - 10] = prev;
- if (prev === 0 && input.length > 10) {
- input.length -= 10;
- } else {
- input.length -= 9;
- }
- };
- K256.prototype.imulK = function imulK(num) {
- num.words[num.length] = 0;
- num.words[num.length + 1] = 0;
- num.length += 2;
- var lo = 0;
- for (var i = 0;i < num.length; i++) {
- var w = num.words[i] | 0;
- lo += w * 977;
- num.words[i] = lo & 67108863;
- lo = w * 64 + (lo / 67108864 | 0);
- }
- if (num.words[num.length - 1] === 0) {
- num.length--;
- if (num.words[num.length - 1] === 0) {
- num.length--;
- }
- }
- return num;
- };
- function P224() {
- MPrime.call(this, "p224", "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001");
- }
- inherits(P224, MPrime);
- function P192() {
- MPrime.call(this, "p192", "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff");
- }
- inherits(P192, MPrime);
- function P25519() {
- MPrime.call(this, "25519", "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed");
- }
- inherits(P25519, MPrime);
- P25519.prototype.imulK = function imulK(num) {
- var carry = 0;
- for (var i = 0;i < num.length; i++) {
- var hi = (num.words[i] | 0) * 19 + carry;
- var lo = hi & 67108863;
- hi >>>= 26;
- num.words[i] = lo;
- carry = hi;
- }
- if (carry !== 0) {
- num.words[num.length++] = carry;
- }
- return num;
- };
- BN._prime = function prime(name) {
- if (primes[name])
- return primes[name];
- var prime;
- if (name === "k256") {
- prime = new K256;
- } else if (name === "p224") {
- prime = new P224;
- } else if (name === "p192") {
- prime = new P192;
- } else if (name === "p25519") {
- prime = new P25519;
- } else {
- throw new Error("Unknown prime " + name);
- }
- primes[name] = prime;
- return prime;
- };
- function Red(m) {
- if (typeof m === "string") {
- var prime = BN._prime(m);
- this.m = prime.p;
- this.prime = prime;
- } else {
- assert(m.gtn(1), "modulus must be greater than 1");
- this.m = m;
- this.prime = null;
- }
- }
- Red.prototype._verify1 = function _verify1(a) {
- assert(a.negative === 0, "red works only with positives");
- assert(a.red, "red works only with red numbers");
- };
- Red.prototype._verify2 = function _verify2(a, b) {
- assert((a.negative | b.negative) === 0, "red works only with positives");
- assert(a.red && a.red === b.red, "red works only with red numbers");
- };
- Red.prototype.imod = function imod(a) {
- if (this.prime)
- return this.prime.ireduce(a)._forceRed(this);
- return a.umod(this.m)._forceRed(this);
- };
- Red.prototype.neg = function neg(a) {
- if (a.isZero()) {
- return a.clone();
- }
- return this.m.sub(a)._forceRed(this);
- };
- Red.prototype.add = function add(a, b) {
- this._verify2(a, b);
- var res = a.add(b);
- if (res.cmp(this.m) >= 0) {
- res.isub(this.m);
- }
- return res._forceRed(this);
- };
- Red.prototype.iadd = function iadd(a, b) {
- this._verify2(a, b);
- var res = a.iadd(b);
- if (res.cmp(this.m) >= 0) {
- res.isub(this.m);
- }
- return res;
- };
- Red.prototype.sub = function sub(a, b) {
- this._verify2(a, b);
- var res = a.sub(b);
- if (res.cmpn(0) < 0) {
- res.iadd(this.m);
- }
- return res._forceRed(this);
- };
- Red.prototype.isub = function isub(a, b) {
- this._verify2(a, b);
- var res = a.isub(b);
- if (res.cmpn(0) < 0) {
- res.iadd(this.m);
- }
- return res;
- };
- Red.prototype.shl = function shl(a, num) {
- this._verify1(a);
- return this.imod(a.ushln(num));
- };
- Red.prototype.imul = function imul(a, b) {
- this._verify2(a, b);
- return this.imod(a.imul(b));
- };
- Red.prototype.mul = function mul(a, b) {
- this._verify2(a, b);
- return this.imod(a.mul(b));
- };
- Red.prototype.isqr = function isqr(a) {
- return this.imul(a, a.clone());
- };
- Red.prototype.sqr = function sqr(a) {
- return this.mul(a, a);
- };
- Red.prototype.sqrt = function sqrt(a) {
- if (a.isZero())
- return a.clone();
- var mod3 = this.m.andln(3);
- assert(mod3 % 2 === 1);
- if (mod3 === 3) {
- var pow = this.m.add(new BN(1)).iushrn(2);
- return this.pow(a, pow);
- }
- var q = this.m.subn(1);
- var s = 0;
- while (!q.isZero() && q.andln(1) === 0) {
- s++;
- q.iushrn(1);
- }
- assert(!q.isZero());
- var one = new BN(1).toRed(this);
- var nOne = one.redNeg();
- var lpow = this.m.subn(1).iushrn(1);
- var z = this.m.bitLength();
- z = new BN(2 * z * z).toRed(this);
- while (this.pow(z, lpow).cmp(nOne) !== 0) {
- z.redIAdd(nOne);
- }
- var c = this.pow(z, q);
- var r = this.pow(a, q.addn(1).iushrn(1));
- var t = this.pow(a, q);
- var m = s;
- while (t.cmp(one) !== 0) {
- var tmp = t;
- for (var i = 0;tmp.cmp(one) !== 0; i++) {
- tmp = tmp.redSqr();
- }
- assert(i < m);
- var b = this.pow(c, new BN(1).iushln(m - i - 1));
- r = r.redMul(b);
- c = b.redSqr();
- t = t.redMul(c);
- m = i;
- }
- return r;
- };
- Red.prototype.invm = function invm(a) {
- var inv = a._invmp(this.m);
- if (inv.negative !== 0) {
- inv.negative = 0;
- return this.imod(inv).redNeg();
- } else {
- return this.imod(inv);
- }
- };
- Red.prototype.pow = function pow(a, num) {
- if (num.isZero())
- return new BN(1).toRed(this);
- if (num.cmpn(1) === 0)
- return a.clone();
- var windowSize = 4;
- var wnd = new Array(1 << windowSize);
- wnd[0] = new BN(1).toRed(this);
- wnd[1] = a;
- for (var i = 2;i < wnd.length; i++) {
- wnd[i] = this.mul(wnd[i - 1], a);
- }
- var res = wnd[0];
- var current = 0;
- var currentLen = 0;
- var start = num.bitLength() % 26;
- if (start === 0) {
- start = 26;
- }
- for (i = num.length - 1;i >= 0; i--) {
- var word = num.words[i];
- for (var j = start - 1;j >= 0; j--) {
- var bit = word >> j & 1;
- if (res !== wnd[0]) {
- res = this.sqr(res);
- }
- if (bit === 0 && current === 0) {
- currentLen = 0;
- continue;
- }
- current <<= 1;
- current |= bit;
- currentLen++;
- if (currentLen !== windowSize && (i !== 0 || j !== 0))
- continue;
- res = this.mul(res, wnd[current]);
- currentLen = 0;
- current = 0;
- }
- start = 26;
- }
- return res;
- };
- Red.prototype.convertTo = function convertTo(num) {
- var r = num.umod(this.m);
- return r === num ? r.clone() : r;
- };
- Red.prototype.convertFrom = function convertFrom(num) {
- var res = num.clone();
- res.red = null;
- return res;
- };
- BN.mont = function mont(num) {
- return new Mont(num);
- };
- function Mont(m) {
- Red.call(this, m);
- this.shift = this.m.bitLength();
- if (this.shift % 26 !== 0) {
- this.shift += 26 - this.shift % 26;
- }
- this.r = new BN(1).iushln(this.shift);
- this.r2 = this.imod(this.r.sqr());
- this.rinv = this.r._invmp(this.m);
- this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);
- this.minv = this.minv.umod(this.r);
- this.minv = this.r.sub(this.minv);
- }
- inherits(Mont, Red);
- Mont.prototype.convertTo = function convertTo(num) {
- return this.imod(num.ushln(this.shift));
- };
- Mont.prototype.convertFrom = function convertFrom(num) {
- var r = this.imod(num.mul(this.rinv));
- r.red = null;
- return r;
- };
- Mont.prototype.imul = function imul(a, b) {
- if (a.isZero() || b.isZero()) {
- a.words[0] = 0;
- a.length = 1;
- return a;
- }
- var t = a.imul(b);
- var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
- var u = t.isub(c).iushrn(this.shift);
- var res = u;
- if (u.cmp(this.m) >= 0) {
- res = u.isub(this.m);
- } else if (u.cmpn(0) < 0) {
- res = u.iadd(this.m);
- }
- return res._forceRed(this);
- };
- Mont.prototype.mul = function mul(a, b) {
- if (a.isZero() || b.isZero())
- return new BN(0)._forceRed(this);
- var t = a.mul(b);
- var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
- var u = t.isub(c).iushrn(this.shift);
- var res = u;
- if (u.cmp(this.m) >= 0) {
- res = u.isub(this.m);
- } else if (u.cmpn(0) < 0) {
- res = u.iadd(this.m);
- }
- return res._forceRed(this);
- };
- Mont.prototype.invm = function invm(a) {
- var res = this.imod(a._invmp(this.m).mul(this.r2));
- return res._forceRed(this);
- };
- })(typeof module === "undefined" || module, exports);
-});
-
-// ../eve/node_modules/inherits/inherits_browser.js
-var require_inherits_browser = __commonJS((exports, module) => {
- if (typeof Object.create === "function") {
- module.exports = function inherits(ctor, superCtor) {
- if (superCtor) {
- ctor.super_ = superCtor;
- ctor.prototype = Object.create(superCtor.prototype, {
- constructor: {
- value: ctor,
- enumerable: false,
- writable: true,
- configurable: true
- }
- });
- }
- };
- } else {
- module.exports = function inherits(ctor, superCtor) {
- if (superCtor) {
- ctor.super_ = superCtor;
- var TempCtor = function() {};
- TempCtor.prototype = superCtor.prototype;
- ctor.prototype = new TempCtor;
- ctor.prototype.constructor = ctor;
- }
- };
- }
-});
-
-// ../eve/node_modules/inherits/inherits.js
-var require_inherits = __commonJS((exports, module) => {
- try {
- util = __require("util");
- if (typeof util.inherits !== "function")
- throw "";
- module.exports = util.inherits;
- } catch (e) {
- module.exports = require_inherits_browser();
- }
- var util;
-});
-
-// ../eve/node_modules/safer-buffer/safer.js
-var require_safer = __commonJS((exports, module) => {
- var buffer = __require("buffer");
- var Buffer2 = buffer.Buffer;
- var safer = {};
- var key;
- for (key in buffer) {
- if (!buffer.hasOwnProperty(key))
- continue;
- if (key === "SlowBuffer" || key === "Buffer")
- continue;
- safer[key] = buffer[key];
- }
- var Safer = safer.Buffer = {};
- for (key in Buffer2) {
- if (!Buffer2.hasOwnProperty(key))
- continue;
- if (key === "allocUnsafe" || key === "allocUnsafeSlow")
- continue;
- Safer[key] = Buffer2[key];
- }
- safer.Buffer.prototype = Buffer2.prototype;
- if (!Safer.from || Safer.from === Uint8Array.from) {
- Safer.from = function(value, encodingOrOffset, length) {
- if (typeof value === "number") {
- throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value);
- }
- if (value && typeof value.length === "undefined") {
- throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value);
- }
- return Buffer2(value, encodingOrOffset, length);
- };
- }
- if (!Safer.alloc) {
- Safer.alloc = function(size, fill, encoding) {
- if (typeof size !== "number") {
- throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size);
- }
- if (size < 0 || size >= 2 * (1 << 30)) {
- throw new RangeError('The value "' + size + '" is invalid for option "size"');
- }
- var buf = Buffer2(size);
- if (!fill || fill.length === 0) {
- buf.fill(0);
- } else if (typeof encoding === "string") {
- buf.fill(fill, encoding);
- } else {
- buf.fill(fill);
- }
- return buf;
- };
- }
- if (!safer.kStringMaxLength) {
- try {
- safer.kStringMaxLength = process.binding("buffer").kStringMaxLength;
- } catch (e) {}
- }
- if (!safer.constants) {
- safer.constants = {
- MAX_LENGTH: safer.kMaxLength
- };
- if (safer.kStringMaxLength) {
- safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength;
- }
- }
- module.exports = safer;
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/reporter.js
-var require_reporter = __commonJS((exports) => {
- var inherits = require_inherits();
- function Reporter(options2) {
- this._reporterState = {
- obj: null,
- path: [],
- options: options2 || {},
- errors: []
- };
- }
- exports.Reporter = Reporter;
- Reporter.prototype.isError = function isError(obj) {
- return obj instanceof ReporterError;
- };
- Reporter.prototype.save = function save() {
- const state = this._reporterState;
- return { obj: state.obj, pathLen: state.path.length };
- };
- Reporter.prototype.restore = function restore(data) {
- const state = this._reporterState;
- state.obj = data.obj;
- state.path = state.path.slice(0, data.pathLen);
- };
- Reporter.prototype.enterKey = function enterKey(key) {
- return this._reporterState.path.push(key);
- };
- Reporter.prototype.exitKey = function exitKey(index2) {
- const state = this._reporterState;
- state.path = state.path.slice(0, index2 - 1);
- };
- Reporter.prototype.leaveKey = function leaveKey(index2, key, value) {
- const state = this._reporterState;
- this.exitKey(index2);
- if (state.obj !== null)
- state.obj[key] = value;
- };
- Reporter.prototype.path = function path() {
- return this._reporterState.path.join("/");
- };
- Reporter.prototype.enterObject = function enterObject() {
- const state = this._reporterState;
- const prev = state.obj;
- state.obj = {};
- return prev;
- };
- Reporter.prototype.leaveObject = function leaveObject(prev) {
- const state = this._reporterState;
- const now = state.obj;
- state.obj = prev;
- return now;
- };
- Reporter.prototype.error = function error(msg) {
- let err;
- const state = this._reporterState;
- const inherited = msg instanceof ReporterError;
- if (inherited) {
- err = msg;
- } else {
- err = new ReporterError(state.path.map(function(elem) {
- return "[" + JSON.stringify(elem) + "]";
- }).join(""), msg.message || msg, msg.stack);
- }
- if (!state.options.partial)
- throw err;
- if (!inherited)
- state.errors.push(err);
- return err;
- };
- Reporter.prototype.wrapResult = function wrapResult(result) {
- const state = this._reporterState;
- if (!state.options.partial)
- return result;
- return {
- result: this.isError(result) ? null : result,
- errors: state.errors
- };
- };
- function ReporterError(path, msg) {
- this.path = path;
- this.rethrow(msg);
- }
- inherits(ReporterError, Error);
- ReporterError.prototype.rethrow = function rethrow(msg) {
- this.message = msg + " at: " + (this.path || "(shallow)");
- if (Error.captureStackTrace)
- Error.captureStackTrace(this, ReporterError);
- if (!this.stack) {
- try {
- throw new Error(this.message);
- } catch (e) {
- this.stack = e.stack;
- }
- }
- return this;
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/buffer.js
-var require_buffer = __commonJS((exports) => {
- var inherits = require_inherits();
- var Reporter = require_reporter().Reporter;
- var Buffer2 = require_safer().Buffer;
- function DecoderBuffer(base, options2) {
- Reporter.call(this, options2);
- if (!Buffer2.isBuffer(base)) {
- this.error("Input not Buffer");
- return;
- }
- this.base = base;
- this.offset = 0;
- this.length = base.length;
- }
- inherits(DecoderBuffer, Reporter);
- exports.DecoderBuffer = DecoderBuffer;
- DecoderBuffer.isDecoderBuffer = function isDecoderBuffer(data) {
- if (data instanceof DecoderBuffer) {
- return true;
- }
- const isCompatible = typeof data === "object" && Buffer2.isBuffer(data.base) && data.constructor.name === "DecoderBuffer" && typeof data.offset === "number" && typeof data.length === "number" && typeof data.save === "function" && typeof data.restore === "function" && typeof data.isEmpty === "function" && typeof data.readUInt8 === "function" && typeof data.skip === "function" && typeof data.raw === "function";
- return isCompatible;
- };
- DecoderBuffer.prototype.save = function save() {
- return { offset: this.offset, reporter: Reporter.prototype.save.call(this) };
- };
- DecoderBuffer.prototype.restore = function restore(save) {
- const res = new DecoderBuffer(this.base);
- res.offset = save.offset;
- res.length = this.offset;
- this.offset = save.offset;
- Reporter.prototype.restore.call(this, save.reporter);
- return res;
- };
- DecoderBuffer.prototype.isEmpty = function isEmpty() {
- return this.offset === this.length;
- };
- DecoderBuffer.prototype.readUInt8 = function readUInt8(fail) {
- if (this.offset + 1 <= this.length)
- return this.base.readUInt8(this.offset++, true);
- else
- return this.error(fail || "DecoderBuffer overrun");
- };
- DecoderBuffer.prototype.skip = function skip(bytes, fail) {
- if (!(this.offset + bytes <= this.length))
- return this.error(fail || "DecoderBuffer overrun");
- const res = new DecoderBuffer(this.base);
- res._reporterState = this._reporterState;
- res.offset = this.offset;
- res.length = this.offset + bytes;
- this.offset += bytes;
- return res;
- };
- DecoderBuffer.prototype.raw = function raw(save) {
- return this.base.slice(save ? save.offset : this.offset, this.length);
- };
- function EncoderBuffer(value, reporter) {
- if (Array.isArray(value)) {
- this.length = 0;
- this.value = value.map(function(item) {
- if (!EncoderBuffer.isEncoderBuffer(item))
- item = new EncoderBuffer(item, reporter);
- this.length += item.length;
- return item;
- }, this);
- } else if (typeof value === "number") {
- if (!(0 <= value && value <= 255))
- return reporter.error("non-byte EncoderBuffer value");
- this.value = value;
- this.length = 1;
- } else if (typeof value === "string") {
- this.value = value;
- this.length = Buffer2.byteLength(value);
- } else if (Buffer2.isBuffer(value)) {
- this.value = value;
- this.length = value.length;
- } else {
- return reporter.error("Unsupported type: " + typeof value);
- }
- }
- exports.EncoderBuffer = EncoderBuffer;
- EncoderBuffer.isEncoderBuffer = function isEncoderBuffer(data) {
- if (data instanceof EncoderBuffer) {
- return true;
- }
- const isCompatible = typeof data === "object" && data.constructor.name === "EncoderBuffer" && typeof data.length === "number" && typeof data.join === "function";
- return isCompatible;
- };
- EncoderBuffer.prototype.join = function join(out, offset) {
- if (!out)
- out = Buffer2.alloc(this.length);
- if (!offset)
- offset = 0;
- if (this.length === 0)
- return out;
- if (Array.isArray(this.value)) {
- this.value.forEach(function(item) {
- item.join(out, offset);
- offset += item.length;
- });
- } else {
- if (typeof this.value === "number")
- out[offset] = this.value;
- else if (typeof this.value === "string")
- out.write(this.value, offset);
- else if (Buffer2.isBuffer(this.value))
- this.value.copy(out, offset);
- offset += this.length;
- }
- return out;
- };
-});
-
-// ../eve/node_modules/minimalistic-assert/index.js
-var require_minimalistic_assert = __commonJS((exports, module) => {
- module.exports = assert;
- function assert(val, msg) {
- if (!val)
- throw new Error(msg || "Assertion failed");
- }
- assert.equal = function assertEqual(l, r, msg) {
- if (l != r)
- throw new Error(msg || "Assertion failed: " + l + " != " + r);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/node.js
-var require_node = __commonJS((exports, module) => {
- var Reporter = require_reporter().Reporter;
- var EncoderBuffer = require_buffer().EncoderBuffer;
- var DecoderBuffer = require_buffer().DecoderBuffer;
- var assert = require_minimalistic_assert();
- var tags = [
- "seq",
- "seqof",
- "set",
- "setof",
- "objid",
- "bool",
- "gentime",
- "utctime",
- "null_",
- "enum",
- "int",
- "objDesc",
- "bitstr",
- "bmpstr",
- "charstr",
- "genstr",
- "graphstr",
- "ia5str",
- "iso646str",
- "numstr",
- "octstr",
- "printstr",
- "t61str",
- "unistr",
- "utf8str",
- "videostr"
- ];
- var methods = [
- "key",
- "obj",
- "use",
- "optional",
- "explicit",
- "implicit",
- "def",
- "choice",
- "any",
- "contains"
- ].concat(tags);
- var overrided = [
- "_peekTag",
- "_decodeTag",
- "_use",
- "_decodeStr",
- "_decodeObjid",
- "_decodeTime",
- "_decodeNull",
- "_decodeInt",
- "_decodeBool",
- "_decodeList",
- "_encodeComposite",
- "_encodeStr",
- "_encodeObjid",
- "_encodeTime",
- "_encodeNull",
- "_encodeInt",
- "_encodeBool"
- ];
- function Node(enc, parent, name) {
- const state = {};
- this._baseState = state;
- state.name = name;
- state.enc = enc;
- state.parent = parent || null;
- state.children = null;
- state.tag = null;
- state.args = null;
- state.reverseArgs = null;
- state.choice = null;
- state.optional = false;
- state.any = false;
- state.obj = false;
- state.use = null;
- state.useDecoder = null;
- state.key = null;
- state["default"] = null;
- state.explicit = null;
- state.implicit = null;
- state.contains = null;
- if (!state.parent) {
- state.children = [];
- this._wrap();
- }
- }
- module.exports = Node;
- var stateProps = [
- "enc",
- "parent",
- "children",
- "tag",
- "args",
- "reverseArgs",
- "choice",
- "optional",
- "any",
- "obj",
- "use",
- "alteredUse",
- "key",
- "default",
- "explicit",
- "implicit",
- "contains"
- ];
- Node.prototype.clone = function clone() {
- const state = this._baseState;
- const cstate = {};
- stateProps.forEach(function(prop) {
- cstate[prop] = state[prop];
- });
- const res = new this.constructor(cstate.parent);
- res._baseState = cstate;
- return res;
- };
- Node.prototype._wrap = function wrap() {
- const state = this._baseState;
- methods.forEach(function(method) {
- this[method] = function _wrappedMethod() {
- const clone = new this.constructor(this);
- state.children.push(clone);
- return clone[method].apply(clone, arguments);
- };
- }, this);
- };
- Node.prototype._init = function init(body) {
- const state = this._baseState;
- assert(state.parent === null);
- body.call(this);
- state.children = state.children.filter(function(child) {
- return child._baseState.parent === this;
- }, this);
- assert.equal(state.children.length, 1, "Root node can have only one child");
- };
- Node.prototype._useArgs = function useArgs(args) {
- const state = this._baseState;
- const children = args.filter(function(arg) {
- return arg instanceof this.constructor;
- }, this);
- args = args.filter(function(arg) {
- return !(arg instanceof this.constructor);
- }, this);
- if (children.length !== 0) {
- assert(state.children === null);
- state.children = children;
- children.forEach(function(child) {
- child._baseState.parent = this;
- }, this);
- }
- if (args.length !== 0) {
- assert(state.args === null);
- state.args = args;
- state.reverseArgs = args.map(function(arg) {
- if (typeof arg !== "object" || arg.constructor !== Object)
- return arg;
- const res = {};
- Object.keys(arg).forEach(function(key) {
- if (key == (key | 0))
- key |= 0;
- const value = arg[key];
- res[value] = key;
- });
- return res;
- });
- }
- };
- overrided.forEach(function(method) {
- Node.prototype[method] = function _overrided() {
- const state = this._baseState;
- throw new Error(method + " not implemented for encoding: " + state.enc);
- };
- });
- tags.forEach(function(tag) {
- Node.prototype[tag] = function _tagMethod() {
- const state = this._baseState;
- const args = Array.prototype.slice.call(arguments);
- assert(state.tag === null);
- state.tag = tag;
- this._useArgs(args);
- return this;
- };
- });
- Node.prototype.use = function use(item) {
- assert(item);
- const state = this._baseState;
- assert(state.use === null);
- state.use = item;
- return this;
- };
- Node.prototype.optional = function optional() {
- const state = this._baseState;
- state.optional = true;
- return this;
- };
- Node.prototype.def = function def(val) {
- const state = this._baseState;
- assert(state["default"] === null);
- state["default"] = val;
- state.optional = true;
- return this;
- };
- Node.prototype.explicit = function explicit(num) {
- const state = this._baseState;
- assert(state.explicit === null && state.implicit === null);
- state.explicit = num;
- return this;
- };
- Node.prototype.implicit = function implicit(num) {
- const state = this._baseState;
- assert(state.explicit === null && state.implicit === null);
- state.implicit = num;
- return this;
- };
- Node.prototype.obj = function obj() {
- const state = this._baseState;
- const args = Array.prototype.slice.call(arguments);
- state.obj = true;
- if (args.length !== 0)
- this._useArgs(args);
- return this;
- };
- Node.prototype.key = function key(newKey) {
- const state = this._baseState;
- assert(state.key === null);
- state.key = newKey;
- return this;
- };
- Node.prototype.any = function any() {
- const state = this._baseState;
- state.any = true;
- return this;
- };
- Node.prototype.choice = function choice(obj) {
- const state = this._baseState;
- assert(state.choice === null);
- state.choice = obj;
- this._useArgs(Object.keys(obj).map(function(key) {
- return obj[key];
- }));
- return this;
- };
- Node.prototype.contains = function contains(item) {
- const state = this._baseState;
- assert(state.use === null);
- state.contains = item;
- return this;
- };
- Node.prototype._decode = function decode(input, options2) {
- const state = this._baseState;
- if (state.parent === null)
- return input.wrapResult(state.children[0]._decode(input, options2));
- let result = state["default"];
- let present = true;
- let prevKey = null;
- if (state.key !== null)
- prevKey = input.enterKey(state.key);
- if (state.optional) {
- let tag = null;
- if (state.explicit !== null)
- tag = state.explicit;
- else if (state.implicit !== null)
- tag = state.implicit;
- else if (state.tag !== null)
- tag = state.tag;
- if (tag === null && !state.any) {
- const save = input.save();
- try {
- if (state.choice === null)
- this._decodeGeneric(state.tag, input, options2);
- else
- this._decodeChoice(input, options2);
- present = true;
- } catch (e) {
- present = false;
- }
- input.restore(save);
- } else {
- present = this._peekTag(input, tag, state.any);
- if (input.isError(present))
- return present;
- }
- }
- let prevObj;
- if (state.obj && present)
- prevObj = input.enterObject();
- if (present) {
- if (state.explicit !== null) {
- const explicit = this._decodeTag(input, state.explicit);
- if (input.isError(explicit))
- return explicit;
- input = explicit;
- }
- const start = input.offset;
- if (state.use === null && state.choice === null) {
- let save;
- if (state.any)
- save = input.save();
- const body = this._decodeTag(input, state.implicit !== null ? state.implicit : state.tag, state.any);
- if (input.isError(body))
- return body;
- if (state.any)
- result = input.raw(save);
- else
- input = body;
- }
- if (options2 && options2.track && state.tag !== null)
- options2.track(input.path(), start, input.length, "tagged");
- if (options2 && options2.track && state.tag !== null)
- options2.track(input.path(), input.offset, input.length, "content");
- if (state.any) {} else if (state.choice === null) {
- result = this._decodeGeneric(state.tag, input, options2);
- } else {
- result = this._decodeChoice(input, options2);
- }
- if (input.isError(result))
- return result;
- if (!state.any && state.choice === null && state.children !== null) {
- state.children.forEach(function decodeChildren(child) {
- child._decode(input, options2);
- });
- }
- if (state.contains && (state.tag === "octstr" || state.tag === "bitstr")) {
- const data = new DecoderBuffer(result);
- result = this._getUse(state.contains, input._reporterState.obj)._decode(data, options2);
- }
- }
- if (state.obj && present)
- result = input.leaveObject(prevObj);
- if (state.key !== null && (result !== null || present === true))
- input.leaveKey(prevKey, state.key, result);
- else if (prevKey !== null)
- input.exitKey(prevKey);
- return result;
- };
- Node.prototype._decodeGeneric = function decodeGeneric(tag, input, options2) {
- const state = this._baseState;
- if (tag === "seq" || tag === "set")
- return null;
- if (tag === "seqof" || tag === "setof")
- return this._decodeList(input, tag, state.args[0], options2);
- else if (/str$/.test(tag))
- return this._decodeStr(input, tag, options2);
- else if (tag === "objid" && state.args)
- return this._decodeObjid(input, state.args[0], state.args[1], options2);
- else if (tag === "objid")
- return this._decodeObjid(input, null, null, options2);
- else if (tag === "gentime" || tag === "utctime")
- return this._decodeTime(input, tag, options2);
- else if (tag === "null_")
- return this._decodeNull(input, options2);
- else if (tag === "bool")
- return this._decodeBool(input, options2);
- else if (tag === "objDesc")
- return this._decodeStr(input, tag, options2);
- else if (tag === "int" || tag === "enum")
- return this._decodeInt(input, state.args && state.args[0], options2);
- if (state.use !== null) {
- return this._getUse(state.use, input._reporterState.obj)._decode(input, options2);
- } else {
- return input.error("unknown tag: " + tag);
- }
- };
- Node.prototype._getUse = function _getUse(entity, obj) {
- const state = this._baseState;
- state.useDecoder = this._use(entity, obj);
- assert(state.useDecoder._baseState.parent === null);
- state.useDecoder = state.useDecoder._baseState.children[0];
- if (state.implicit !== state.useDecoder._baseState.implicit) {
- state.useDecoder = state.useDecoder.clone();
- state.useDecoder._baseState.implicit = state.implicit;
- }
- return state.useDecoder;
- };
- Node.prototype._decodeChoice = function decodeChoice(input, options2) {
- const state = this._baseState;
- let result = null;
- let match = false;
- Object.keys(state.choice).some(function(key) {
- const save = input.save();
- const node = state.choice[key];
- try {
- const value = node._decode(input, options2);
- if (input.isError(value))
- return false;
- result = { type: key, value };
- match = true;
- } catch (e) {
- input.restore(save);
- return false;
- }
- return true;
- }, this);
- if (!match)
- return input.error("Choice not matched");
- return result;
- };
- Node.prototype._createEncoderBuffer = function createEncoderBuffer(data) {
- return new EncoderBuffer(data, this.reporter);
- };
- Node.prototype._encode = function encode(data, reporter, parent) {
- const state = this._baseState;
- if (state["default"] !== null && state["default"] === data)
- return;
- const result = this._encodeValue(data, reporter, parent);
- if (result === undefined)
- return;
- if (this._skipDefault(result, reporter, parent))
- return;
- return result;
- };
- Node.prototype._encodeValue = function encode(data, reporter, parent) {
- const state = this._baseState;
- if (state.parent === null)
- return state.children[0]._encode(data, reporter || new Reporter);
- let result = null;
- this.reporter = reporter;
- if (state.optional && data === undefined) {
- if (state["default"] !== null)
- data = state["default"];
- else
- return;
- }
- let content = null;
- let primitive = false;
- if (state.any) {
- result = this._createEncoderBuffer(data);
- } else if (state.choice) {
- result = this._encodeChoice(data, reporter);
- } else if (state.contains) {
- content = this._getUse(state.contains, parent)._encode(data, reporter);
- primitive = true;
- } else if (state.children) {
- content = state.children.map(function(child) {
- if (child._baseState.tag === "null_")
- return child._encode(null, reporter, data);
- if (child._baseState.key === null)
- return reporter.error("Child should have a key");
- const prevKey = reporter.enterKey(child._baseState.key);
- if (typeof data !== "object")
- return reporter.error("Child expected, but input is not object");
- const res = child._encode(data[child._baseState.key], reporter, data);
- reporter.leaveKey(prevKey);
- return res;
- }, this).filter(function(child) {
- return child;
- });
- content = this._createEncoderBuffer(content);
- } else {
- if (state.tag === "seqof" || state.tag === "setof") {
- if (!(state.args && state.args.length === 1))
- return reporter.error("Too many args for : " + state.tag);
- if (!Array.isArray(data))
- return reporter.error("seqof/setof, but data is not Array");
- const child = this.clone();
- child._baseState.implicit = null;
- content = this._createEncoderBuffer(data.map(function(item) {
- const state2 = this._baseState;
- return this._getUse(state2.args[0], data)._encode(item, reporter);
- }, child));
- } else if (state.use !== null) {
- result = this._getUse(state.use, parent)._encode(data, reporter);
- } else {
- content = this._encodePrimitive(state.tag, data);
- primitive = true;
- }
- }
- if (!state.any && state.choice === null) {
- const tag = state.implicit !== null ? state.implicit : state.tag;
- const cls = state.implicit === null ? "universal" : "context";
- if (tag === null) {
- if (state.use === null)
- reporter.error("Tag could be omitted only for .use()");
- } else {
- if (state.use === null)
- result = this._encodeComposite(tag, primitive, cls, content);
- }
- }
- if (state.explicit !== null)
- result = this._encodeComposite(state.explicit, false, "context", result);
- return result;
- };
- Node.prototype._encodeChoice = function encodeChoice(data, reporter) {
- const state = this._baseState;
- const node = state.choice[data.type];
- if (!node) {
- assert(false, data.type + " not found in " + JSON.stringify(Object.keys(state.choice)));
- }
- return node._encode(data.value, reporter);
- };
- Node.prototype._encodePrimitive = function encodePrimitive(tag, data) {
- const state = this._baseState;
- if (/str$/.test(tag))
- return this._encodeStr(data, tag);
- else if (tag === "objid" && state.args)
- return this._encodeObjid(data, state.reverseArgs[0], state.args[1]);
- else if (tag === "objid")
- return this._encodeObjid(data, null, null);
- else if (tag === "gentime" || tag === "utctime")
- return this._encodeTime(data, tag);
- else if (tag === "null_")
- return this._encodeNull();
- else if (tag === "int" || tag === "enum")
- return this._encodeInt(data, state.args && state.reverseArgs[0]);
- else if (tag === "bool")
- return this._encodeBool(data);
- else if (tag === "objDesc")
- return this._encodeStr(data, tag);
- else
- throw new Error("Unsupported tag: " + tag);
- };
- Node.prototype._isNumstr = function isNumstr(str) {
- return /^[0-9 ]*$/.test(str);
- };
- Node.prototype._isPrintstr = function isPrintstr(str) {
- return /^[A-Za-z0-9 '()+,-./:=?]*$/.test(str);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/constants/der.js
-var require_der = __commonJS((exports) => {
- function reverse(map) {
- const res = {};
- Object.keys(map).forEach(function(key) {
- if ((key | 0) == key)
- key = key | 0;
- const value = map[key];
- res[value] = key;
- });
- return res;
- }
- exports.tagClass = {
- 0: "universal",
- 1: "application",
- 2: "context",
- 3: "private"
- };
- exports.tagClassByName = reverse(exports.tagClass);
- exports.tag = {
- 0: "end",
- 1: "bool",
- 2: "int",
- 3: "bitstr",
- 4: "octstr",
- 5: "null_",
- 6: "objid",
- 7: "objDesc",
- 8: "external",
- 9: "real",
- 10: "enum",
- 11: "embed",
- 12: "utf8str",
- 13: "relativeOid",
- 16: "seq",
- 17: "set",
- 18: "numstr",
- 19: "printstr",
- 20: "t61str",
- 21: "videostr",
- 22: "ia5str",
- 23: "utctime",
- 24: "gentime",
- 25: "graphstr",
- 26: "iso646str",
- 27: "genstr",
- 28: "unistr",
- 29: "charstr",
- 30: "bmpstr"
- };
- exports.tagByName = reverse(exports.tag);
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/encoders/der.js
-var require_der2 = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var Buffer2 = require_safer().Buffer;
- var Node = require_node();
- var der = require_der();
- function DEREncoder(entity) {
- this.enc = "der";
- this.name = entity.name;
- this.entity = entity;
- this.tree = new DERNode;
- this.tree._init(entity.body);
- }
- module.exports = DEREncoder;
- DEREncoder.prototype.encode = function encode(data, reporter) {
- return this.tree._encode(data, reporter).join();
- };
- function DERNode(parent) {
- Node.call(this, "der", parent);
- }
- inherits(DERNode, Node);
- DERNode.prototype._encodeComposite = function encodeComposite(tag, primitive, cls, content) {
- const encodedTag = encodeTag(tag, primitive, cls, this.reporter);
- if (content.length < 128) {
- const header2 = Buffer2.alloc(2);
- header2[0] = encodedTag;
- header2[1] = content.length;
- return this._createEncoderBuffer([header2, content]);
- }
- let lenOctets = 1;
- for (let i = content.length;i >= 256; i >>= 8)
- lenOctets++;
- const header = Buffer2.alloc(1 + 1 + lenOctets);
- header[0] = encodedTag;
- header[1] = 128 | lenOctets;
- for (let i = 1 + lenOctets, j = content.length;j > 0; i--, j >>= 8)
- header[i] = j & 255;
- return this._createEncoderBuffer([header, content]);
- };
- DERNode.prototype._encodeStr = function encodeStr(str, tag) {
- if (tag === "bitstr") {
- return this._createEncoderBuffer([str.unused | 0, str.data]);
- } else if (tag === "bmpstr") {
- const buf = Buffer2.alloc(str.length * 2);
- for (let i = 0;i < str.length; i++) {
- buf.writeUInt16BE(str.charCodeAt(i), i * 2);
- }
- return this._createEncoderBuffer(buf);
- } else if (tag === "numstr") {
- if (!this._isNumstr(str)) {
- return this.reporter.error("Encoding of string type: numstr supports " + "only digits and space");
- }
- return this._createEncoderBuffer(str);
- } else if (tag === "printstr") {
- if (!this._isPrintstr(str)) {
- return this.reporter.error("Encoding of string type: printstr supports " + "only latin upper and lower case letters, " + "digits, space, apostrophe, left and rigth " + "parenthesis, plus sign, comma, hyphen, " + "dot, slash, colon, equal sign, " + "question mark");
- }
- return this._createEncoderBuffer(str);
- } else if (/str$/.test(tag)) {
- return this._createEncoderBuffer(str);
- } else if (tag === "objDesc") {
- return this._createEncoderBuffer(str);
- } else {
- return this.reporter.error("Encoding of string type: " + tag + " unsupported");
- }
- };
- DERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) {
- if (typeof id === "string") {
- if (!values)
- return this.reporter.error("string objid given, but no values map found");
- if (!values.hasOwnProperty(id))
- return this.reporter.error("objid not found in values map");
- id = values[id].split(/[\s.]+/g);
- for (let i = 0;i < id.length; i++)
- id[i] |= 0;
- } else if (Array.isArray(id)) {
- id = id.slice();
- for (let i = 0;i < id.length; i++)
- id[i] |= 0;
- }
- if (!Array.isArray(id)) {
- return this.reporter.error("objid() should be either array or string, " + "got: " + JSON.stringify(id));
- }
- if (!relative) {
- if (id[1] >= 40)
- return this.reporter.error("Second objid identifier OOB");
- id.splice(0, 2, id[0] * 40 + id[1]);
- }
- let size = 0;
- for (let i = 0;i < id.length; i++) {
- let ident = id[i];
- for (size++;ident >= 128; ident >>= 7)
- size++;
- }
- const objid = Buffer2.alloc(size);
- let offset = objid.length - 1;
- for (let i = id.length - 1;i >= 0; i--) {
- let ident = id[i];
- objid[offset--] = ident & 127;
- while ((ident >>= 7) > 0)
- objid[offset--] = 128 | ident & 127;
- }
- return this._createEncoderBuffer(objid);
- };
- function two(num) {
- if (num < 10)
- return "0" + num;
- else
- return num;
- }
- DERNode.prototype._encodeTime = function encodeTime(time, tag) {
- let str;
- const date = new Date(time);
- if (tag === "gentime") {
- str = [
- two(date.getUTCFullYear()),
- two(date.getUTCMonth() + 1),
- two(date.getUTCDate()),
- two(date.getUTCHours()),
- two(date.getUTCMinutes()),
- two(date.getUTCSeconds()),
- "Z"
- ].join("");
- } else if (tag === "utctime") {
- str = [
- two(date.getUTCFullYear() % 100),
- two(date.getUTCMonth() + 1),
- two(date.getUTCDate()),
- two(date.getUTCHours()),
- two(date.getUTCMinutes()),
- two(date.getUTCSeconds()),
- "Z"
- ].join("");
- } else {
- this.reporter.error("Encoding " + tag + " time is not supported yet");
- }
- return this._encodeStr(str, "octstr");
- };
- DERNode.prototype._encodeNull = function encodeNull() {
- return this._createEncoderBuffer("");
- };
- DERNode.prototype._encodeInt = function encodeInt(num, values) {
- if (typeof num === "string") {
- if (!values)
- return this.reporter.error("String int or enum given, but no values map");
- if (!values.hasOwnProperty(num)) {
- return this.reporter.error("Values map doesn't contain: " + JSON.stringify(num));
- }
- num = values[num];
- }
- if (typeof num !== "number" && !Buffer2.isBuffer(num)) {
- const numArray = num.toArray();
- if (!num.sign && numArray[0] & 128) {
- numArray.unshift(0);
- }
- num = Buffer2.from(numArray);
- }
- if (Buffer2.isBuffer(num)) {
- let size2 = num.length;
- if (num.length === 0)
- size2++;
- const out2 = Buffer2.alloc(size2);
- num.copy(out2);
- if (num.length === 0)
- out2[0] = 0;
- return this._createEncoderBuffer(out2);
- }
- if (num < 128)
- return this._createEncoderBuffer(num);
- if (num < 256)
- return this._createEncoderBuffer([0, num]);
- let size = 1;
- for (let i = num;i >= 256; i >>= 8)
- size++;
- const out = new Array(size);
- for (let i = out.length - 1;i >= 0; i--) {
- out[i] = num & 255;
- num >>= 8;
- }
- if (out[0] & 128) {
- out.unshift(0);
- }
- return this._createEncoderBuffer(Buffer2.from(out));
- };
- DERNode.prototype._encodeBool = function encodeBool(value) {
- return this._createEncoderBuffer(value ? 255 : 0);
- };
- DERNode.prototype._use = function use(entity, obj) {
- if (typeof entity === "function")
- entity = entity(obj);
- return entity._getEncoder("der").tree;
- };
- DERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) {
- const state = this._baseState;
- let i;
- if (state["default"] === null)
- return false;
- const data = dataBuffer.join();
- if (state.defaultBuffer === undefined)
- state.defaultBuffer = this._encodeValue(state["default"], reporter, parent).join();
- if (data.length !== state.defaultBuffer.length)
- return false;
- for (i = 0;i < data.length; i++)
- if (data[i] !== state.defaultBuffer[i])
- return false;
- return true;
- };
- function encodeTag(tag, primitive, cls, reporter) {
- let res;
- if (tag === "seqof")
- tag = "seq";
- else if (tag === "setof")
- tag = "set";
- if (der.tagByName.hasOwnProperty(tag))
- res = der.tagByName[tag];
- else if (typeof tag === "number" && (tag | 0) === tag)
- res = tag;
- else
- return reporter.error("Unknown tag: " + tag);
- if (res >= 31)
- return reporter.error("Multi-octet tag encoding unsupported");
- if (!primitive)
- res |= 32;
- res |= der.tagClassByName[cls || "universal"] << 6;
- return res;
- }
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/encoders/pem.js
-var require_pem = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var DEREncoder = require_der2();
- function PEMEncoder(entity) {
- DEREncoder.call(this, entity);
- this.enc = "pem";
- }
- inherits(PEMEncoder, DEREncoder);
- module.exports = PEMEncoder;
- PEMEncoder.prototype.encode = function encode(data, options2) {
- const buf = DEREncoder.prototype.encode.call(this, data);
- const p = buf.toString("base64");
- const out = ["-----BEGIN " + options2.label + "-----"];
- for (let i = 0;i < p.length; i += 64)
- out.push(p.slice(i, i + 64));
- out.push("-----END " + options2.label + "-----");
- return out.join(`
-`);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/encoders/index.js
-var require_encoders = __commonJS((exports) => {
- var encoders = exports;
- encoders.der = require_der2();
- encoders.pem = require_pem();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/decoders/der.js
-var require_der3 = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var bignum = require_bn();
- var DecoderBuffer = require_buffer().DecoderBuffer;
- var Node = require_node();
- var der = require_der();
- function DERDecoder(entity) {
- this.enc = "der";
- this.name = entity.name;
- this.entity = entity;
- this.tree = new DERNode;
- this.tree._init(entity.body);
- }
- module.exports = DERDecoder;
- DERDecoder.prototype.decode = function decode(data, options2) {
- if (!DecoderBuffer.isDecoderBuffer(data)) {
- data = new DecoderBuffer(data, options2);
- }
- return this.tree._decode(data, options2);
- };
- function DERNode(parent) {
- Node.call(this, "der", parent);
- }
- inherits(DERNode, Node);
- DERNode.prototype._peekTag = function peekTag(buffer, tag, any) {
- if (buffer.isEmpty())
- return false;
- const state = buffer.save();
- const decodedTag = derDecodeTag(buffer, 'Failed to peek tag: "' + tag + '"');
- if (buffer.isError(decodedTag))
- return decodedTag;
- buffer.restore(state);
- return decodedTag.tag === tag || decodedTag.tagStr === tag || decodedTag.tagStr + "of" === tag || any;
- };
- DERNode.prototype._decodeTag = function decodeTag(buffer, tag, any) {
- const decodedTag = derDecodeTag(buffer, 'Failed to decode tag of "' + tag + '"');
- if (buffer.isError(decodedTag))
- return decodedTag;
- let len = derDecodeLen(buffer, decodedTag.primitive, 'Failed to get length of "' + tag + '"');
- if (buffer.isError(len))
- return len;
- if (!any && decodedTag.tag !== tag && decodedTag.tagStr !== tag && decodedTag.tagStr + "of" !== tag) {
- return buffer.error('Failed to match tag: "' + tag + '"');
- }
- if (decodedTag.primitive || len !== null)
- return buffer.skip(len, 'Failed to match body of: "' + tag + '"');
- const state = buffer.save();
- const res = this._skipUntilEnd(buffer, 'Failed to skip indefinite length body: "' + this.tag + '"');
- if (buffer.isError(res))
- return res;
- len = buffer.offset - state.offset;
- buffer.restore(state);
- return buffer.skip(len, 'Failed to match body of: "' + tag + '"');
- };
- DERNode.prototype._skipUntilEnd = function skipUntilEnd(buffer, fail) {
- for (;; ) {
- const tag = derDecodeTag(buffer, fail);
- if (buffer.isError(tag))
- return tag;
- const len = derDecodeLen(buffer, tag.primitive, fail);
- if (buffer.isError(len))
- return len;
- let res;
- if (tag.primitive || len !== null)
- res = buffer.skip(len);
- else
- res = this._skipUntilEnd(buffer, fail);
- if (buffer.isError(res))
- return res;
- if (tag.tagStr === "end")
- break;
- }
- };
- DERNode.prototype._decodeList = function decodeList(buffer, tag, decoder, options2) {
- const result = [];
- while (!buffer.isEmpty()) {
- const possibleEnd = this._peekTag(buffer, "end");
- if (buffer.isError(possibleEnd))
- return possibleEnd;
- const res = decoder.decode(buffer, "der", options2);
- if (buffer.isError(res) && possibleEnd)
- break;
- result.push(res);
- }
- return result;
- };
- DERNode.prototype._decodeStr = function decodeStr(buffer, tag) {
- if (tag === "bitstr") {
- const unused = buffer.readUInt8();
- if (buffer.isError(unused))
- return unused;
- return { unused, data: buffer.raw() };
- } else if (tag === "bmpstr") {
- const raw = buffer.raw();
- if (raw.length % 2 === 1)
- return buffer.error("Decoding of string type: bmpstr length mismatch");
- let str = "";
- for (let i = 0;i < raw.length / 2; i++) {
- str += String.fromCharCode(raw.readUInt16BE(i * 2));
- }
- return str;
- } else if (tag === "numstr") {
- const numstr = buffer.raw().toString("ascii");
- if (!this._isNumstr(numstr)) {
- return buffer.error("Decoding of string type: " + "numstr unsupported characters");
- }
- return numstr;
- } else if (tag === "octstr") {
- return buffer.raw();
- } else if (tag === "objDesc") {
- return buffer.raw();
- } else if (tag === "printstr") {
- const printstr = buffer.raw().toString("ascii");
- if (!this._isPrintstr(printstr)) {
- return buffer.error("Decoding of string type: " + "printstr unsupported characters");
- }
- return printstr;
- } else if (/str$/.test(tag)) {
- return buffer.raw().toString();
- } else {
- return buffer.error("Decoding of string type: " + tag + " unsupported");
- }
- };
- DERNode.prototype._decodeObjid = function decodeObjid(buffer, values, relative) {
- let result;
- const identifiers = [];
- let ident = 0;
- let subident = 0;
- while (!buffer.isEmpty()) {
- subident = buffer.readUInt8();
- ident <<= 7;
- ident |= subident & 127;
- if ((subident & 128) === 0) {
- identifiers.push(ident);
- ident = 0;
- }
- }
- if (subident & 128)
- identifiers.push(ident);
- const first = identifiers[0] / 40 | 0;
- const second = identifiers[0] % 40;
- if (relative)
- result = identifiers;
- else
- result = [first, second].concat(identifiers.slice(1));
- if (values) {
- let tmp = values[result.join(" ")];
- if (tmp === undefined)
- tmp = values[result.join(".")];
- if (tmp !== undefined)
- result = tmp;
- }
- return result;
- };
- DERNode.prototype._decodeTime = function decodeTime(buffer, tag) {
- const str = buffer.raw().toString();
- let year;
- let mon;
- let day;
- let hour;
- let min;
- let sec;
- if (tag === "gentime") {
- year = str.slice(0, 4) | 0;
- mon = str.slice(4, 6) | 0;
- day = str.slice(6, 8) | 0;
- hour = str.slice(8, 10) | 0;
- min = str.slice(10, 12) | 0;
- sec = str.slice(12, 14) | 0;
- } else if (tag === "utctime") {
- year = str.slice(0, 2) | 0;
- mon = str.slice(2, 4) | 0;
- day = str.slice(4, 6) | 0;
- hour = str.slice(6, 8) | 0;
- min = str.slice(8, 10) | 0;
- sec = str.slice(10, 12) | 0;
- if (year < 70)
- year = 2000 + year;
- else
- year = 1900 + year;
- } else {
- return buffer.error("Decoding " + tag + " time is not supported yet");
- }
- return Date.UTC(year, mon - 1, day, hour, min, sec, 0);
- };
- DERNode.prototype._decodeNull = function decodeNull() {
- return null;
- };
- DERNode.prototype._decodeBool = function decodeBool(buffer) {
- const res = buffer.readUInt8();
- if (buffer.isError(res))
- return res;
- else
- return res !== 0;
- };
- DERNode.prototype._decodeInt = function decodeInt(buffer, values) {
- const raw = buffer.raw();
- let res = new bignum(raw);
- if (values)
- res = values[res.toString(10)] || res;
- return res;
- };
- DERNode.prototype._use = function use(entity, obj) {
- if (typeof entity === "function")
- entity = entity(obj);
- return entity._getDecoder("der").tree;
- };
- function derDecodeTag(buf, fail) {
- let tag = buf.readUInt8(fail);
- if (buf.isError(tag))
- return tag;
- const cls = der.tagClass[tag >> 6];
- const primitive = (tag & 32) === 0;
- if ((tag & 31) === 31) {
- let oct = tag;
- tag = 0;
- while ((oct & 128) === 128) {
- oct = buf.readUInt8(fail);
- if (buf.isError(oct))
- return oct;
- tag <<= 7;
- tag |= oct & 127;
- }
- } else {
- tag &= 31;
- }
- const tagStr = der.tag[tag];
- return {
- cls,
- primitive,
- tag,
- tagStr
- };
- }
- function derDecodeLen(buf, primitive, fail) {
- let len = buf.readUInt8(fail);
- if (buf.isError(len))
- return len;
- if (!primitive && len === 128)
- return null;
- if ((len & 128) === 0) {
- return len;
- }
- const num = len & 127;
- if (num > 4)
- return buf.error("length octect is too long");
- len = 0;
- for (let i = 0;i < num; i++) {
- len <<= 8;
- const j = buf.readUInt8(fail);
- if (buf.isError(j))
- return j;
- len |= j;
- }
- return len;
- }
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/decoders/pem.js
-var require_pem2 = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var Buffer2 = require_safer().Buffer;
- var DERDecoder = require_der3();
- function PEMDecoder(entity) {
- DERDecoder.call(this, entity);
- this.enc = "pem";
- }
- inherits(PEMDecoder, DERDecoder);
- module.exports = PEMDecoder;
- PEMDecoder.prototype.decode = function decode(data, options2) {
- const lines = data.toString().split(/[\r\n]+/g);
- const label = options2.label.toUpperCase();
- const re = /^-----(BEGIN|END) ([^-]+)-----$/;
- let start = -1;
- let end = -1;
- for (let i = 0;i < lines.length; i++) {
- const match = lines[i].match(re);
- if (match === null)
- continue;
- if (match[2] !== label)
- continue;
- if (start === -1) {
- if (match[1] !== "BEGIN")
- break;
- start = i;
- } else {
- if (match[1] !== "END")
- break;
- end = i;
- break;
- }
- }
- if (start === -1 || end === -1)
- throw new Error("PEM section not found for: " + label);
- const base64 = lines.slice(start + 1, end).join("");
- base64.replace(/[^a-z0-9+/=]+/gi, "");
- const input = Buffer2.from(base64, "base64");
- return DERDecoder.prototype.decode.call(this, input, options2);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/decoders/index.js
-var require_decoders = __commonJS((exports) => {
- var decoders = exports;
- decoders.der = require_der3();
- decoders.pem = require_pem2();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/api.js
-var require_api = __commonJS((exports) => {
- var encoders = require_encoders();
- var decoders = require_decoders();
- var inherits = require_inherits();
- var api = exports;
- api.define = function define(name, body) {
- return new Entity(name, body);
- };
- function Entity(name, body) {
- this.name = name;
- this.body = body;
- this.decoders = {};
- this.encoders = {};
- }
- Entity.prototype._createNamed = function createNamed(Base) {
- const name = this.name;
- function Generated(entity) {
- this._initNamed(entity, name);
- }
- inherits(Generated, Base);
- Generated.prototype._initNamed = function _initNamed(entity, name2) {
- Base.call(this, entity, name2);
- };
- return new Generated(this);
- };
- Entity.prototype._getDecoder = function _getDecoder(enc) {
- enc = enc || "der";
- if (!this.decoders.hasOwnProperty(enc))
- this.decoders[enc] = this._createNamed(decoders[enc]);
- return this.decoders[enc];
- };
- Entity.prototype.decode = function decode(data, enc, options2) {
- return this._getDecoder(enc).decode(data, options2);
- };
- Entity.prototype._getEncoder = function _getEncoder(enc) {
- enc = enc || "der";
- if (!this.encoders.hasOwnProperty(enc))
- this.encoders[enc] = this._createNamed(encoders[enc]);
- return this.encoders[enc];
- };
- Entity.prototype.encode = function encode(data, enc, reporter) {
- return this._getEncoder(enc).encode(data, reporter);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/index.js
-var require_base = __commonJS((exports) => {
- var base = exports;
- base.Reporter = require_reporter().Reporter;
- base.DecoderBuffer = require_buffer().DecoderBuffer;
- base.EncoderBuffer = require_buffer().EncoderBuffer;
- base.Node = require_node();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/constants/index.js
-var require_constants2 = __commonJS((exports) => {
- var constants = exports;
- constants._reverse = function reverse(map) {
- const res = {};
- Object.keys(map).forEach(function(key) {
- if ((key | 0) == key)
- key = key | 0;
- const value = map[key];
- res[value] = key;
- });
- return res;
- };
- constants.der = require_der();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1.js
-var require_asn1 = __commonJS((exports) => {
- var asn1 = exports;
- asn1.bignum = require_bn();
- asn1.define = require_api().define;
- asn1.base = require_base();
- asn1.constants = require_constants2();
- asn1.decoders = require_decoders();
- asn1.encoders = require_encoders();
-});
-
-// ../eve/node_modules/elliptic/package.json
-var require_package = __commonJS((exports, module) => {
- module.exports = {
- name: "elliptic",
- version: "6.6.1",
- description: "EC cryptography",
- main: "lib/elliptic.js",
- files: [
- "lib"
- ],
- scripts: {
- lint: "eslint lib test",
- "lint:fix": "npm run lint -- --fix",
- unit: "istanbul test _mocha --reporter=spec test/index.js",
- test: "npm run lint && npm run unit",
- version: "grunt dist && git add dist/"
- },
- repository: {
- type: "git",
- url: "git@github.com:indutny/elliptic"
- },
- keywords: [
- "EC",
- "Elliptic",
- "curve",
- "Cryptography"
- ],
- author: "Fedor Indutny ",
- license: "MIT",
- bugs: {
- url: "https://github.com/indutny/elliptic/issues"
- },
- homepage: "https://github.com/indutny/elliptic",
- devDependencies: {
- brfs: "^2.0.2",
- coveralls: "^3.1.0",
- eslint: "^7.6.0",
- grunt: "^1.2.1",
- "grunt-browserify": "^5.3.0",
- "grunt-cli": "^1.3.2",
- "grunt-contrib-connect": "^3.0.0",
- "grunt-contrib-copy": "^1.0.0",
- "grunt-contrib-uglify": "^5.0.0",
- "grunt-mocha-istanbul": "^5.0.2",
- "grunt-saucelabs": "^9.0.1",
- istanbul: "^0.4.5",
- mocha: "^8.0.1"
- },
- dependencies: {
- "bn.js": "^4.11.9",
- brorand: "^1.1.0",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.1",
- inherits: "^2.0.4",
- "minimalistic-assert": "^1.0.1",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- };
-});
-
-// ../eve/node_modules/minimalistic-crypto-utils/lib/utils.js
-var require_utils = __commonJS((exports) => {
- var utils = exports;
- function toArray(msg, enc) {
- if (Array.isArray(msg))
- return msg.slice();
- if (!msg)
- return [];
- var res = [];
- if (typeof msg !== "string") {
- for (var i = 0;i < msg.length; i++)
- res[i] = msg[i] | 0;
- return res;
- }
- if (enc === "hex") {
- msg = msg.replace(/[^a-z0-9]+/ig, "");
- if (msg.length % 2 !== 0)
- msg = "0" + msg;
- for (var i = 0;i < msg.length; i += 2)
- res.push(parseInt(msg[i] + msg[i + 1], 16));
- } else {
- for (var i = 0;i < msg.length; i++) {
- var c = msg.charCodeAt(i);
- var hi = c >> 8;
- var lo = c & 255;
- if (hi)
- res.push(hi, lo);
- else
- res.push(lo);
- }
- }
- return res;
- }
- utils.toArray = toArray;
- function zero2(word) {
- if (word.length === 1)
- return "0" + word;
- else
- return word;
- }
- utils.zero2 = zero2;
- function toHex(msg) {
- var res = "";
- for (var i = 0;i < msg.length; i++)
- res += zero2(msg[i].toString(16));
- return res;
- }
- utils.toHex = toHex;
- utils.encode = function encode(arr, enc) {
- if (enc === "hex")
- return toHex(arr);
- else
- return arr;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/utils.js
-var require_utils2 = __commonJS((exports) => {
- var utils = exports;
- var BN = require_bn();
- var minAssert = require_minimalistic_assert();
- var minUtils = require_utils();
- utils.assert = minAssert;
- utils.toArray = minUtils.toArray;
- utils.zero2 = minUtils.zero2;
- utils.toHex = minUtils.toHex;
- utils.encode = minUtils.encode;
- function getNAF(num, w, bits) {
- var naf = new Array(Math.max(num.bitLength(), bits) + 1);
- var i;
- for (i = 0;i < naf.length; i += 1) {
- naf[i] = 0;
- }
- var ws = 1 << w + 1;
- var k = num.clone();
- for (i = 0;i < naf.length; i++) {
- var z;
- var mod = k.andln(ws - 1);
- if (k.isOdd()) {
- if (mod > (ws >> 1) - 1)
- z = (ws >> 1) - mod;
- else
- z = mod;
- k.isubn(z);
- } else {
- z = 0;
- }
- naf[i] = z;
- k.iushrn(1);
- }
- return naf;
- }
- utils.getNAF = getNAF;
- function getJSF(k1, k2) {
- var jsf = [
- [],
- []
- ];
- k1 = k1.clone();
- k2 = k2.clone();
- var d1 = 0;
- var d2 = 0;
- var m8;
- while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {
- var m14 = k1.andln(3) + d1 & 3;
- var m24 = k2.andln(3) + d2 & 3;
- if (m14 === 3)
- m14 = -1;
- if (m24 === 3)
- m24 = -1;
- var u1;
- if ((m14 & 1) === 0) {
- u1 = 0;
- } else {
- m8 = k1.andln(7) + d1 & 7;
- if ((m8 === 3 || m8 === 5) && m24 === 2)
- u1 = -m14;
- else
- u1 = m14;
- }
- jsf[0].push(u1);
- var u2;
- if ((m24 & 1) === 0) {
- u2 = 0;
- } else {
- m8 = k2.andln(7) + d2 & 7;
- if ((m8 === 3 || m8 === 5) && m14 === 2)
- u2 = -m24;
- else
- u2 = m24;
- }
- jsf[1].push(u2);
- if (2 * d1 === u1 + 1)
- d1 = 1 - d1;
- if (2 * d2 === u2 + 1)
- d2 = 1 - d2;
- k1.iushrn(1);
- k2.iushrn(1);
- }
- return jsf;
- }
- utils.getJSF = getJSF;
- function cachedProperty(obj, name, computer) {
- var key = "_" + name;
- obj.prototype[name] = function cachedProperty() {
- return this[key] !== undefined ? this[key] : this[key] = computer.call(this);
- };
- }
- utils.cachedProperty = cachedProperty;
- function parseBytes(bytes) {
- return typeof bytes === "string" ? utils.toArray(bytes, "hex") : bytes;
- }
- utils.parseBytes = parseBytes;
- function intFromLE(bytes) {
- return new BN(bytes, "hex", "le");
- }
- utils.intFromLE = intFromLE;
-});
-
-// ../eve/node_modules/brorand/index.js
-var require_brorand = __commonJS((exports, module) => {
- var r;
- module.exports = function rand(len) {
- if (!r)
- r = new Rand(null);
- return r.generate(len);
- };
- function Rand(rand) {
- this.rand = rand;
- }
- module.exports.Rand = Rand;
- Rand.prototype.generate = function generate(len) {
- return this._rand(len);
- };
- Rand.prototype._rand = function _rand(n) {
- if (this.rand.getBytes)
- return this.rand.getBytes(n);
- var res = new Uint8Array(n);
- for (var i = 0;i < res.length; i++)
- res[i] = this.rand.getByte();
- return res;
- };
- if (typeof self === "object") {
- if (self.crypto && self.crypto.getRandomValues) {
- Rand.prototype._rand = function _rand(n) {
- var arr = new Uint8Array(n);
- self.crypto.getRandomValues(arr);
- return arr;
- };
- } else if (self.msCrypto && self.msCrypto.getRandomValues) {
- Rand.prototype._rand = function _rand(n) {
- var arr = new Uint8Array(n);
- self.msCrypto.getRandomValues(arr);
- return arr;
- };
- } else if (typeof window === "object") {
- Rand.prototype._rand = function() {
- throw new Error("Not implemented yet");
- };
- }
- } else {
- try {
- crypto2 = __require("crypto");
- if (typeof crypto2.randomBytes !== "function")
- throw new Error("Not supported");
- Rand.prototype._rand = function _rand(n) {
- return crypto2.randomBytes(n);
- };
- } catch (e) {}
- }
- var crypto2;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/base.js
-var require_base2 = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var getNAF = utils.getNAF;
- var getJSF = utils.getJSF;
- var assert = utils.assert;
- function BaseCurve(type, conf) {
- this.type = type;
- this.p = new BN(conf.p, 16);
- this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p);
- this.zero = new BN(0).toRed(this.red);
- this.one = new BN(1).toRed(this.red);
- this.two = new BN(2).toRed(this.red);
- this.n = conf.n && new BN(conf.n, 16);
- this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed);
- this._wnafT1 = new Array(4);
- this._wnafT2 = new Array(4);
- this._wnafT3 = new Array(4);
- this._wnafT4 = new Array(4);
- this._bitLength = this.n ? this.n.bitLength() : 0;
- var adjustCount = this.n && this.p.div(this.n);
- if (!adjustCount || adjustCount.cmpn(100) > 0) {
- this.redN = null;
- } else {
- this._maxwellTrick = true;
- this.redN = this.n.toRed(this.red);
- }
- }
- module.exports = BaseCurve;
- BaseCurve.prototype.point = function point() {
- throw new Error("Not implemented");
- };
- BaseCurve.prototype.validate = function validate() {
- throw new Error("Not implemented");
- };
- BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) {
- assert(p.precomputed);
- var doubles = p._getDoubles();
- var naf = getNAF(k, 1, this._bitLength);
- var I = (1 << doubles.step + 1) - (doubles.step % 2 === 0 ? 2 : 1);
- I /= 3;
- var repr = [];
- var j;
- var nafW;
- for (j = 0;j < naf.length; j += doubles.step) {
- nafW = 0;
- for (var l = j + doubles.step - 1;l >= j; l--)
- nafW = (nafW << 1) + naf[l];
- repr.push(nafW);
- }
- var a = this.jpoint(null, null, null);
- var b = this.jpoint(null, null, null);
- for (var i = I;i > 0; i--) {
- for (j = 0;j < repr.length; j++) {
- nafW = repr[j];
- if (nafW === i)
- b = b.mixedAdd(doubles.points[j]);
- else if (nafW === -i)
- b = b.mixedAdd(doubles.points[j].neg());
- }
- a = a.add(b);
- }
- return a.toP();
- };
- BaseCurve.prototype._wnafMul = function _wnafMul(p, k) {
- var w = 4;
- var nafPoints = p._getNAFPoints(w);
- w = nafPoints.wnd;
- var wnd = nafPoints.points;
- var naf = getNAF(k, w, this._bitLength);
- var acc = this.jpoint(null, null, null);
- for (var i = naf.length - 1;i >= 0; i--) {
- for (var l = 0;i >= 0 && naf[i] === 0; i--)
- l++;
- if (i >= 0)
- l++;
- acc = acc.dblp(l);
- if (i < 0)
- break;
- var z = naf[i];
- assert(z !== 0);
- if (p.type === "affine") {
- if (z > 0)
- acc = acc.mixedAdd(wnd[z - 1 >> 1]);
- else
- acc = acc.mixedAdd(wnd[-z - 1 >> 1].neg());
- } else {
- if (z > 0)
- acc = acc.add(wnd[z - 1 >> 1]);
- else
- acc = acc.add(wnd[-z - 1 >> 1].neg());
- }
- }
- return p.type === "affine" ? acc.toP() : acc;
- };
- BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, points, coeffs, len, jacobianResult) {
- var wndWidth = this._wnafT1;
- var wnd = this._wnafT2;
- var naf = this._wnafT3;
- var max = 0;
- var i;
- var j;
- var p;
- for (i = 0;i < len; i++) {
- p = points[i];
- var nafPoints = p._getNAFPoints(defW);
- wndWidth[i] = nafPoints.wnd;
- wnd[i] = nafPoints.points;
- }
- for (i = len - 1;i >= 1; i -= 2) {
- var a = i - 1;
- var b = i;
- if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {
- naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength);
- naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength);
- max = Math.max(naf[a].length, max);
- max = Math.max(naf[b].length, max);
- continue;
- }
- var comb = [
- points[a],
- null,
- null,
- points[b]
- ];
- if (points[a].y.cmp(points[b].y) === 0) {
- comb[1] = points[a].add(points[b]);
- comb[2] = points[a].toJ().mixedAdd(points[b].neg());
- } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) {
- comb[1] = points[a].toJ().mixedAdd(points[b]);
- comb[2] = points[a].add(points[b].neg());
- } else {
- comb[1] = points[a].toJ().mixedAdd(points[b]);
- comb[2] = points[a].toJ().mixedAdd(points[b].neg());
- }
- var index2 = [
- -3,
- -1,
- -5,
- -7,
- 0,
- 7,
- 5,
- 1,
- 3
- ];
- var jsf = getJSF(coeffs[a], coeffs[b]);
- max = Math.max(jsf[0].length, max);
- naf[a] = new Array(max);
- naf[b] = new Array(max);
- for (j = 0;j < max; j++) {
- var ja = jsf[0][j] | 0;
- var jb = jsf[1][j] | 0;
- naf[a][j] = index2[(ja + 1) * 3 + (jb + 1)];
- naf[b][j] = 0;
- wnd[a] = comb;
- }
- }
- var acc = this.jpoint(null, null, null);
- var tmp = this._wnafT4;
- for (i = max;i >= 0; i--) {
- var k = 0;
- while (i >= 0) {
- var zero = true;
- for (j = 0;j < len; j++) {
- tmp[j] = naf[j][i] | 0;
- if (tmp[j] !== 0)
- zero = false;
- }
- if (!zero)
- break;
- k++;
- i--;
- }
- if (i >= 0)
- k++;
- acc = acc.dblp(k);
- if (i < 0)
- break;
- for (j = 0;j < len; j++) {
- var z = tmp[j];
- if (z === 0)
- continue;
- else if (z > 0)
- p = wnd[j][z - 1 >> 1];
- else if (z < 0)
- p = wnd[j][-z - 1 >> 1].neg();
- if (p.type === "affine")
- acc = acc.mixedAdd(p);
- else
- acc = acc.add(p);
- }
- }
- for (i = 0;i < len; i++)
- wnd[i] = null;
- if (jacobianResult)
- return acc;
- else
- return acc.toP();
- };
- function BasePoint(curve, type) {
- this.curve = curve;
- this.type = type;
- this.precomputed = null;
- }
- BaseCurve.BasePoint = BasePoint;
- BasePoint.prototype.eq = function eq() {
- throw new Error("Not implemented");
- };
- BasePoint.prototype.validate = function validate() {
- return this.curve.validate(this);
- };
- BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
- bytes = utils.toArray(bytes, enc);
- var len = this.p.byteLength();
- if ((bytes[0] === 4 || bytes[0] === 6 || bytes[0] === 7) && bytes.length - 1 === 2 * len) {
- if (bytes[0] === 6)
- assert(bytes[bytes.length - 1] % 2 === 0);
- else if (bytes[0] === 7)
- assert(bytes[bytes.length - 1] % 2 === 1);
- var res = this.point(bytes.slice(1, 1 + len), bytes.slice(1 + len, 1 + 2 * len));
- return res;
- } else if ((bytes[0] === 2 || bytes[0] === 3) && bytes.length - 1 === len) {
- return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 3);
- }
- throw new Error("Unknown point format");
- };
- BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) {
- return this.encode(enc, true);
- };
- BasePoint.prototype._encode = function _encode(compact) {
- var len = this.curve.p.byteLength();
- var x = this.getX().toArray("be", len);
- if (compact)
- return [this.getY().isEven() ? 2 : 3].concat(x);
- return [4].concat(x, this.getY().toArray("be", len));
- };
- BasePoint.prototype.encode = function encode(enc, compact) {
- return utils.encode(this._encode(compact), enc);
- };
- BasePoint.prototype.precompute = function precompute(power) {
- if (this.precomputed)
- return this;
- var precomputed = {
- doubles: null,
- naf: null,
- beta: null
- };
- precomputed.naf = this._getNAFPoints(8);
- precomputed.doubles = this._getDoubles(4, power);
- precomputed.beta = this._getBeta();
- this.precomputed = precomputed;
- return this;
- };
- BasePoint.prototype._hasDoubles = function _hasDoubles(k) {
- if (!this.precomputed)
- return false;
- var doubles = this.precomputed.doubles;
- if (!doubles)
- return false;
- return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step);
- };
- BasePoint.prototype._getDoubles = function _getDoubles(step, power) {
- if (this.precomputed && this.precomputed.doubles)
- return this.precomputed.doubles;
- var doubles = [this];
- var acc = this;
- for (var i = 0;i < power; i += step) {
- for (var j = 0;j < step; j++)
- acc = acc.dbl();
- doubles.push(acc);
- }
- return {
- step,
- points: doubles
- };
- };
- BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) {
- if (this.precomputed && this.precomputed.naf)
- return this.precomputed.naf;
- var res = [this];
- var max = (1 << wnd) - 1;
- var dbl = max === 1 ? null : this.dbl();
- for (var i = 1;i < max; i++)
- res[i] = res[i - 1].add(dbl);
- return {
- wnd,
- points: res
- };
- };
- BasePoint.prototype._getBeta = function _getBeta() {
- return null;
- };
- BasePoint.prototype.dblp = function dblp(k) {
- var r = this;
- for (var i = 0;i < k; i++)
- r = r.dbl();
- return r;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/short.js
-var require_short = __commonJS((exports, module) => {
- var utils = require_utils2();
- var BN = require_bn();
- var inherits = require_inherits();
- var Base = require_base2();
- var assert = utils.assert;
- function ShortCurve(conf) {
- Base.call(this, "short", conf);
- this.a = new BN(conf.a, 16).toRed(this.red);
- this.b = new BN(conf.b, 16).toRed(this.red);
- this.tinv = this.two.redInvm();
- this.zeroA = this.a.fromRed().cmpn(0) === 0;
- this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0;
- this.endo = this._getEndomorphism(conf);
- this._endoWnafT1 = new Array(4);
- this._endoWnafT2 = new Array(4);
- }
- inherits(ShortCurve, Base);
- module.exports = ShortCurve;
- ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) {
- if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1)
- return;
- var beta;
- var lambda;
- if (conf.beta) {
- beta = new BN(conf.beta, 16).toRed(this.red);
- } else {
- var betas = this._getEndoRoots(this.p);
- beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1];
- beta = beta.toRed(this.red);
- }
- if (conf.lambda) {
- lambda = new BN(conf.lambda, 16);
- } else {
- var lambdas = this._getEndoRoots(this.n);
- if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) {
- lambda = lambdas[0];
- } else {
- lambda = lambdas[1];
- assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0);
- }
- }
- var basis;
- if (conf.basis) {
- basis = conf.basis.map(function(vec) {
- return {
- a: new BN(vec.a, 16),
- b: new BN(vec.b, 16)
- };
- });
- } else {
- basis = this._getEndoBasis(lambda);
- }
- return {
- beta,
- lambda,
- basis
- };
- };
- ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) {
- var red = num === this.p ? this.red : BN.mont(num);
- var tinv = new BN(2).toRed(red).redInvm();
- var ntinv = tinv.redNeg();
- var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv);
- var l1 = ntinv.redAdd(s).fromRed();
- var l2 = ntinv.redSub(s).fromRed();
- return [l1, l2];
- };
- ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) {
- var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2));
- var u = lambda;
- var v = this.n.clone();
- var x1 = new BN(1);
- var y1 = new BN(0);
- var x2 = new BN(0);
- var y2 = new BN(1);
- var a0;
- var b0;
- var a1;
- var b1;
- var a2;
- var b2;
- var prevR;
- var i = 0;
- var r;
- var x;
- while (u.cmpn(0) !== 0) {
- var q = v.div(u);
- r = v.sub(q.mul(u));
- x = x2.sub(q.mul(x1));
- var y = y2.sub(q.mul(y1));
- if (!a1 && r.cmp(aprxSqrt) < 0) {
- a0 = prevR.neg();
- b0 = x1;
- a1 = r.neg();
- b1 = x;
- } else if (a1 && ++i === 2) {
- break;
- }
- prevR = r;
- v = u;
- u = r;
- x2 = x1;
- x1 = x;
- y2 = y1;
- y1 = y;
- }
- a2 = r.neg();
- b2 = x;
- var len1 = a1.sqr().add(b1.sqr());
- var len2 = a2.sqr().add(b2.sqr());
- if (len2.cmp(len1) >= 0) {
- a2 = a0;
- b2 = b0;
- }
- if (a1.negative) {
- a1 = a1.neg();
- b1 = b1.neg();
- }
- if (a2.negative) {
- a2 = a2.neg();
- b2 = b2.neg();
- }
- return [
- { a: a1, b: b1 },
- { a: a2, b: b2 }
- ];
- };
- ShortCurve.prototype._endoSplit = function _endoSplit(k) {
- var basis = this.endo.basis;
- var v1 = basis[0];
- var v2 = basis[1];
- var c1 = v2.b.mul(k).divRound(this.n);
- var c2 = v1.b.neg().mul(k).divRound(this.n);
- var p1 = c1.mul(v1.a);
- var p2 = c2.mul(v2.a);
- var q1 = c1.mul(v1.b);
- var q2 = c2.mul(v2.b);
- var k1 = k.sub(p1).sub(p2);
- var k2 = q1.add(q2).neg();
- return { k1, k2 };
- };
- ShortCurve.prototype.pointFromX = function pointFromX(x, odd) {
- x = new BN(x, 16);
- if (!x.red)
- x = x.toRed(this.red);
- var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b);
- var y = y2.redSqrt();
- if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
- throw new Error("invalid point");
- var isOdd = y.fromRed().isOdd();
- if (odd && !isOdd || !odd && isOdd)
- y = y.redNeg();
- return this.point(x, y);
- };
- ShortCurve.prototype.validate = function validate(point) {
- if (point.inf)
- return true;
- var x = point.x;
- var y = point.y;
- var ax = this.a.redMul(x);
- var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b);
- return y.redSqr().redISub(rhs).cmpn(0) === 0;
- };
- ShortCurve.prototype._endoWnafMulAdd = function _endoWnafMulAdd(points, coeffs, jacobianResult) {
- var npoints = this._endoWnafT1;
- var ncoeffs = this._endoWnafT2;
- for (var i = 0;i < points.length; i++) {
- var split = this._endoSplit(coeffs[i]);
- var p = points[i];
- var beta = p._getBeta();
- if (split.k1.negative) {
- split.k1.ineg();
- p = p.neg(true);
- }
- if (split.k2.negative) {
- split.k2.ineg();
- beta = beta.neg(true);
- }
- npoints[i * 2] = p;
- npoints[i * 2 + 1] = beta;
- ncoeffs[i * 2] = split.k1;
- ncoeffs[i * 2 + 1] = split.k2;
- }
- var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult);
- for (var j = 0;j < i * 2; j++) {
- npoints[j] = null;
- ncoeffs[j] = null;
- }
- return res;
- };
- function Point(curve, x, y, isRed) {
- Base.BasePoint.call(this, curve, "affine");
- if (x === null && y === null) {
- this.x = null;
- this.y = null;
- this.inf = true;
- } else {
- this.x = new BN(x, 16);
- this.y = new BN(y, 16);
- if (isRed) {
- this.x.forceRed(this.curve.red);
- this.y.forceRed(this.curve.red);
- }
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.y.red)
- this.y = this.y.toRed(this.curve.red);
- this.inf = false;
- }
- }
- inherits(Point, Base.BasePoint);
- ShortCurve.prototype.point = function point(x, y, isRed) {
- return new Point(this, x, y, isRed);
- };
- ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) {
- return Point.fromJSON(this, obj, red);
- };
- Point.prototype._getBeta = function _getBeta() {
- if (!this.curve.endo)
- return;
- var pre = this.precomputed;
- if (pre && pre.beta)
- return pre.beta;
- var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);
- if (pre) {
- var curve = this.curve;
- var endoMul = function(p) {
- return curve.point(p.x.redMul(curve.endo.beta), p.y);
- };
- pre.beta = beta;
- beta.precomputed = {
- beta: null,
- naf: pre.naf && {
- wnd: pre.naf.wnd,
- points: pre.naf.points.map(endoMul)
- },
- doubles: pre.doubles && {
- step: pre.doubles.step,
- points: pre.doubles.points.map(endoMul)
- }
- };
- }
- return beta;
- };
- Point.prototype.toJSON = function toJSON() {
- if (!this.precomputed)
- return [this.x, this.y];
- return [this.x, this.y, this.precomputed && {
- doubles: this.precomputed.doubles && {
- step: this.precomputed.doubles.step,
- points: this.precomputed.doubles.points.slice(1)
- },
- naf: this.precomputed.naf && {
- wnd: this.precomputed.naf.wnd,
- points: this.precomputed.naf.points.slice(1)
- }
- }];
- };
- Point.fromJSON = function fromJSON(curve, obj, red) {
- if (typeof obj === "string")
- obj = JSON.parse(obj);
- var res = curve.point(obj[0], obj[1], red);
- if (!obj[2])
- return res;
- function obj2point(obj2) {
- return curve.point(obj2[0], obj2[1], red);
- }
- var pre = obj[2];
- res.precomputed = {
- beta: null,
- doubles: pre.doubles && {
- step: pre.doubles.step,
- points: [res].concat(pre.doubles.points.map(obj2point))
- },
- naf: pre.naf && {
- wnd: pre.naf.wnd,
- points: [res].concat(pre.naf.points.map(obj2point))
- }
- };
- return res;
- };
- Point.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- Point.prototype.isInfinity = function isInfinity() {
- return this.inf;
- };
- Point.prototype.add = function add(p) {
- if (this.inf)
- return p;
- if (p.inf)
- return this;
- if (this.eq(p))
- return this.dbl();
- if (this.neg().eq(p))
- return this.curve.point(null, null);
- if (this.x.cmp(p.x) === 0)
- return this.curve.point(null, null);
- var c = this.y.redSub(p.y);
- if (c.cmpn(0) !== 0)
- c = c.redMul(this.x.redSub(p.x).redInvm());
- var nx = c.redSqr().redISub(this.x).redISub(p.x);
- var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
- return this.curve.point(nx, ny);
- };
- Point.prototype.dbl = function dbl() {
- if (this.inf)
- return this;
- var ys1 = this.y.redAdd(this.y);
- if (ys1.cmpn(0) === 0)
- return this.curve.point(null, null);
- var a = this.curve.a;
- var x2 = this.x.redSqr();
- var dyinv = ys1.redInvm();
- var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv);
- var nx = c.redSqr().redISub(this.x.redAdd(this.x));
- var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
- return this.curve.point(nx, ny);
- };
- Point.prototype.getX = function getX() {
- return this.x.fromRed();
- };
- Point.prototype.getY = function getY() {
- return this.y.fromRed();
- };
- Point.prototype.mul = function mul(k) {
- k = new BN(k, 16);
- if (this.isInfinity())
- return this;
- else if (this._hasDoubles(k))
- return this.curve._fixedNafMul(this, k);
- else if (this.curve.endo)
- return this.curve._endoWnafMulAdd([this], [k]);
- else
- return this.curve._wnafMul(this, k);
- };
- Point.prototype.mulAdd = function mulAdd(k1, p2, k2) {
- var points = [this, p2];
- var coeffs = [k1, k2];
- if (this.curve.endo)
- return this.curve._endoWnafMulAdd(points, coeffs);
- else
- return this.curve._wnafMulAdd(1, points, coeffs, 2);
- };
- Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) {
- var points = [this, p2];
- var coeffs = [k1, k2];
- if (this.curve.endo)
- return this.curve._endoWnafMulAdd(points, coeffs, true);
- else
- return this.curve._wnafMulAdd(1, points, coeffs, 2, true);
- };
- Point.prototype.eq = function eq(p) {
- return this === p || this.inf === p.inf && (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0);
- };
- Point.prototype.neg = function neg(_precompute) {
- if (this.inf)
- return this;
- var res = this.curve.point(this.x, this.y.redNeg());
- if (_precompute && this.precomputed) {
- var pre = this.precomputed;
- var negate = function(p) {
- return p.neg();
- };
- res.precomputed = {
- naf: pre.naf && {
- wnd: pre.naf.wnd,
- points: pre.naf.points.map(negate)
- },
- doubles: pre.doubles && {
- step: pre.doubles.step,
- points: pre.doubles.points.map(negate)
- }
- };
- }
- return res;
- };
- Point.prototype.toJ = function toJ() {
- if (this.inf)
- return this.curve.jpoint(null, null, null);
- var res = this.curve.jpoint(this.x, this.y, this.curve.one);
- return res;
- };
- function JPoint(curve, x, y, z) {
- Base.BasePoint.call(this, curve, "jacobian");
- if (x === null && y === null && z === null) {
- this.x = this.curve.one;
- this.y = this.curve.one;
- this.z = new BN(0);
- } else {
- this.x = new BN(x, 16);
- this.y = new BN(y, 16);
- this.z = new BN(z, 16);
- }
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.y.red)
- this.y = this.y.toRed(this.curve.red);
- if (!this.z.red)
- this.z = this.z.toRed(this.curve.red);
- this.zOne = this.z === this.curve.one;
- }
- inherits(JPoint, Base.BasePoint);
- ShortCurve.prototype.jpoint = function jpoint(x, y, z) {
- return new JPoint(this, x, y, z);
- };
- JPoint.prototype.toP = function toP() {
- if (this.isInfinity())
- return this.curve.point(null, null);
- var zinv = this.z.redInvm();
- var zinv2 = zinv.redSqr();
- var ax = this.x.redMul(zinv2);
- var ay = this.y.redMul(zinv2).redMul(zinv);
- return this.curve.point(ax, ay);
- };
- JPoint.prototype.neg = function neg() {
- return this.curve.jpoint(this.x, this.y.redNeg(), this.z);
- };
- JPoint.prototype.add = function add(p) {
- if (this.isInfinity())
- return p;
- if (p.isInfinity())
- return this;
- var pz2 = p.z.redSqr();
- var z2 = this.z.redSqr();
- var u1 = this.x.redMul(pz2);
- var u2 = p.x.redMul(z2);
- var s1 = this.y.redMul(pz2.redMul(p.z));
- var s2 = p.y.redMul(z2.redMul(this.z));
- var h = u1.redSub(u2);
- var r = s1.redSub(s2);
- if (h.cmpn(0) === 0) {
- if (r.cmpn(0) !== 0)
- return this.curve.jpoint(null, null, null);
- else
- return this.dbl();
- }
- var h2 = h.redSqr();
- var h3 = h2.redMul(h);
- var v = u1.redMul(h2);
- var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
- var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
- var nz = this.z.redMul(p.z).redMul(h);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.mixedAdd = function mixedAdd(p) {
- if (this.isInfinity())
- return p.toJ();
- if (p.isInfinity())
- return this;
- var z2 = this.z.redSqr();
- var u1 = this.x;
- var u2 = p.x.redMul(z2);
- var s1 = this.y;
- var s2 = p.y.redMul(z2).redMul(this.z);
- var h = u1.redSub(u2);
- var r = s1.redSub(s2);
- if (h.cmpn(0) === 0) {
- if (r.cmpn(0) !== 0)
- return this.curve.jpoint(null, null, null);
- else
- return this.dbl();
- }
- var h2 = h.redSqr();
- var h3 = h2.redMul(h);
- var v = u1.redMul(h2);
- var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
- var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
- var nz = this.z.redMul(h);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.dblp = function dblp(pow) {
- if (pow === 0)
- return this;
- if (this.isInfinity())
- return this;
- if (!pow)
- return this.dbl();
- var i;
- if (this.curve.zeroA || this.curve.threeA) {
- var r = this;
- for (i = 0;i < pow; i++)
- r = r.dbl();
- return r;
- }
- var a = this.curve.a;
- var tinv = this.curve.tinv;
- var jx = this.x;
- var jy = this.y;
- var jz = this.z;
- var jz4 = jz.redSqr().redSqr();
- var jyd = jy.redAdd(jy);
- for (i = 0;i < pow; i++) {
- var jx2 = jx.redSqr();
- var jyd2 = jyd.redSqr();
- var jyd4 = jyd2.redSqr();
- var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));
- var t1 = jx.redMul(jyd2);
- var nx = c.redSqr().redISub(t1.redAdd(t1));
- var t2 = t1.redISub(nx);
- var dny = c.redMul(t2);
- dny = dny.redIAdd(dny).redISub(jyd4);
- var nz = jyd.redMul(jz);
- if (i + 1 < pow)
- jz4 = jz4.redMul(jyd4);
- jx = nx;
- jz = nz;
- jyd = dny;
- }
- return this.curve.jpoint(jx, jyd.redMul(tinv), jz);
- };
- JPoint.prototype.dbl = function dbl() {
- if (this.isInfinity())
- return this;
- if (this.curve.zeroA)
- return this._zeroDbl();
- else if (this.curve.threeA)
- return this._threeDbl();
- else
- return this._dbl();
- };
- JPoint.prototype._zeroDbl = function _zeroDbl() {
- var nx;
- var ny;
- var nz;
- if (this.zOne) {
- var xx = this.x.redSqr();
- var yy = this.y.redSqr();
- var yyyy = yy.redSqr();
- var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
- s = s.redIAdd(s);
- var m = xx.redAdd(xx).redIAdd(xx);
- var t = m.redSqr().redISub(s).redISub(s);
- var yyyy8 = yyyy.redIAdd(yyyy);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- nx = t;
- ny = m.redMul(s.redISub(t)).redISub(yyyy8);
- nz = this.y.redAdd(this.y);
- } else {
- var a = this.x.redSqr();
- var b = this.y.redSqr();
- var c = b.redSqr();
- var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c);
- d = d.redIAdd(d);
- var e = a.redAdd(a).redIAdd(a);
- var f = e.redSqr();
- var c8 = c.redIAdd(c);
- c8 = c8.redIAdd(c8);
- c8 = c8.redIAdd(c8);
- nx = f.redISub(d).redISub(d);
- ny = e.redMul(d.redISub(nx)).redISub(c8);
- nz = this.y.redMul(this.z);
- nz = nz.redIAdd(nz);
- }
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype._threeDbl = function _threeDbl() {
- var nx;
- var ny;
- var nz;
- if (this.zOne) {
- var xx = this.x.redSqr();
- var yy = this.y.redSqr();
- var yyyy = yy.redSqr();
- var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
- s = s.redIAdd(s);
- var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a);
- var t = m.redSqr().redISub(s).redISub(s);
- nx = t;
- var yyyy8 = yyyy.redIAdd(yyyy);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- ny = m.redMul(s.redISub(t)).redISub(yyyy8);
- nz = this.y.redAdd(this.y);
- } else {
- var delta = this.z.redSqr();
- var gamma = this.y.redSqr();
- var beta = this.x.redMul(gamma);
- var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta));
- alpha = alpha.redAdd(alpha).redIAdd(alpha);
- var beta4 = beta.redIAdd(beta);
- beta4 = beta4.redIAdd(beta4);
- var beta8 = beta4.redAdd(beta4);
- nx = alpha.redSqr().redISub(beta8);
- nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta);
- var ggamma8 = gamma.redSqr();
- ggamma8 = ggamma8.redIAdd(ggamma8);
- ggamma8 = ggamma8.redIAdd(ggamma8);
- ggamma8 = ggamma8.redIAdd(ggamma8);
- ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8);
- }
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype._dbl = function _dbl() {
- var a = this.curve.a;
- var jx = this.x;
- var jy = this.y;
- var jz = this.z;
- var jz4 = jz.redSqr().redSqr();
- var jx2 = jx.redSqr();
- var jy2 = jy.redSqr();
- var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));
- var jxd4 = jx.redAdd(jx);
- jxd4 = jxd4.redIAdd(jxd4);
- var t1 = jxd4.redMul(jy2);
- var nx = c.redSqr().redISub(t1.redAdd(t1));
- var t2 = t1.redISub(nx);
- var jyd8 = jy2.redSqr();
- jyd8 = jyd8.redIAdd(jyd8);
- jyd8 = jyd8.redIAdd(jyd8);
- jyd8 = jyd8.redIAdd(jyd8);
- var ny = c.redMul(t2).redISub(jyd8);
- var nz = jy.redAdd(jy).redMul(jz);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.trpl = function trpl() {
- if (!this.curve.zeroA)
- return this.dbl().add(this);
- var xx = this.x.redSqr();
- var yy = this.y.redSqr();
- var zz = this.z.redSqr();
- var yyyy = yy.redSqr();
- var m = xx.redAdd(xx).redIAdd(xx);
- var mm = m.redSqr();
- var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
- e = e.redIAdd(e);
- e = e.redAdd(e).redIAdd(e);
- e = e.redISub(mm);
- var ee = e.redSqr();
- var t = yyyy.redIAdd(yyyy);
- t = t.redIAdd(t);
- t = t.redIAdd(t);
- t = t.redIAdd(t);
- var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t);
- var yyu4 = yy.redMul(u);
- yyu4 = yyu4.redIAdd(yyu4);
- yyu4 = yyu4.redIAdd(yyu4);
- var nx = this.x.redMul(ee).redISub(yyu4);
- nx = nx.redIAdd(nx);
- nx = nx.redIAdd(nx);
- var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee)));
- ny = ny.redIAdd(ny);
- ny = ny.redIAdd(ny);
- ny = ny.redIAdd(ny);
- var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.mul = function mul(k, kbase) {
- k = new BN(k, kbase);
- return this.curve._wnafMul(this, k);
- };
- JPoint.prototype.eq = function eq(p) {
- if (p.type === "affine")
- return this.eq(p.toJ());
- if (this === p)
- return true;
- var z2 = this.z.redSqr();
- var pz2 = p.z.redSqr();
- if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0)
- return false;
- var z3 = z2.redMul(this.z);
- var pz3 = pz2.redMul(p.z);
- return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0;
- };
- JPoint.prototype.eqXToP = function eqXToP(x) {
- var zs = this.z.redSqr();
- var rx = x.toRed(this.curve.red).redMul(zs);
- if (this.x.cmp(rx) === 0)
- return true;
- var xc = x.clone();
- var t = this.curve.redN.redMul(zs);
- for (;; ) {
- xc.iadd(this.curve.n);
- if (xc.cmp(this.curve.p) >= 0)
- return false;
- rx.redIAdd(t);
- if (this.x.cmp(rx) === 0)
- return true;
- }
- };
- JPoint.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- JPoint.prototype.isInfinity = function isInfinity() {
- return this.z.cmpn(0) === 0;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/mont.js
-var require_mont = __commonJS((exports, module) => {
- var BN = require_bn();
- var inherits = require_inherits();
- var Base = require_base2();
- var utils = require_utils2();
- function MontCurve(conf) {
- Base.call(this, "mont", conf);
- this.a = new BN(conf.a, 16).toRed(this.red);
- this.b = new BN(conf.b, 16).toRed(this.red);
- this.i4 = new BN(4).toRed(this.red).redInvm();
- this.two = new BN(2).toRed(this.red);
- this.a24 = this.i4.redMul(this.a.redAdd(this.two));
- }
- inherits(MontCurve, Base);
- module.exports = MontCurve;
- MontCurve.prototype.validate = function validate(point) {
- var x = point.normalize().x;
- var x2 = x.redSqr();
- var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x);
- var y = rhs.redSqrt();
- return y.redSqr().cmp(rhs) === 0;
- };
- function Point(curve, x, z) {
- Base.BasePoint.call(this, curve, "projective");
- if (x === null && z === null) {
- this.x = this.curve.one;
- this.z = this.curve.zero;
- } else {
- this.x = new BN(x, 16);
- this.z = new BN(z, 16);
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.z.red)
- this.z = this.z.toRed(this.curve.red);
- }
- }
- inherits(Point, Base.BasePoint);
- MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
- return this.point(utils.toArray(bytes, enc), 1);
- };
- MontCurve.prototype.point = function point(x, z) {
- return new Point(this, x, z);
- };
- MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
- return Point.fromJSON(this, obj);
- };
- Point.prototype.precompute = function precompute() {};
- Point.prototype._encode = function _encode() {
- return this.getX().toArray("be", this.curve.p.byteLength());
- };
- Point.fromJSON = function fromJSON(curve, obj) {
- return new Point(curve, obj[0], obj[1] || curve.one);
- };
- Point.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- Point.prototype.isInfinity = function isInfinity() {
- return this.z.cmpn(0) === 0;
- };
- Point.prototype.dbl = function dbl() {
- var a = this.x.redAdd(this.z);
- var aa = a.redSqr();
- var b = this.x.redSub(this.z);
- var bb = b.redSqr();
- var c = aa.redSub(bb);
- var nx = aa.redMul(bb);
- var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c)));
- return this.curve.point(nx, nz);
- };
- Point.prototype.add = function add() {
- throw new Error("Not supported on Montgomery curve");
- };
- Point.prototype.diffAdd = function diffAdd(p, diff) {
- var a = this.x.redAdd(this.z);
- var b = this.x.redSub(this.z);
- var c = p.x.redAdd(p.z);
- var d = p.x.redSub(p.z);
- var da = d.redMul(a);
- var cb = c.redMul(b);
- var nx = diff.z.redMul(da.redAdd(cb).redSqr());
- var nz = diff.x.redMul(da.redISub(cb).redSqr());
- return this.curve.point(nx, nz);
- };
- Point.prototype.mul = function mul(k) {
- var t = k.clone();
- var a = this;
- var b = this.curve.point(null, null);
- var c = this;
- for (var bits = [];t.cmpn(0) !== 0; t.iushrn(1))
- bits.push(t.andln(1));
- for (var i = bits.length - 1;i >= 0; i--) {
- if (bits[i] === 0) {
- a = a.diffAdd(b, c);
- b = b.dbl();
- } else {
- b = a.diffAdd(b, c);
- a = a.dbl();
- }
- }
- return b;
- };
- Point.prototype.mulAdd = function mulAdd() {
- throw new Error("Not supported on Montgomery curve");
- };
- Point.prototype.jumlAdd = function jumlAdd() {
- throw new Error("Not supported on Montgomery curve");
- };
- Point.prototype.eq = function eq(other) {
- return this.getX().cmp(other.getX()) === 0;
- };
- Point.prototype.normalize = function normalize() {
- this.x = this.x.redMul(this.z.redInvm());
- this.z = this.curve.one;
- return this;
- };
- Point.prototype.getX = function getX() {
- this.normalize();
- return this.x.fromRed();
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/edwards.js
-var require_edwards = __commonJS((exports, module) => {
- var utils = require_utils2();
- var BN = require_bn();
- var inherits = require_inherits();
- var Base = require_base2();
- var assert = utils.assert;
- function EdwardsCurve(conf) {
- this.twisted = (conf.a | 0) !== 1;
- this.mOneA = this.twisted && (conf.a | 0) === -1;
- this.extended = this.mOneA;
- Base.call(this, "edwards", conf);
- this.a = new BN(conf.a, 16).umod(this.red.m);
- this.a = this.a.toRed(this.red);
- this.c = new BN(conf.c, 16).toRed(this.red);
- this.c2 = this.c.redSqr();
- this.d = new BN(conf.d, 16).toRed(this.red);
- this.dd = this.d.redAdd(this.d);
- assert(!this.twisted || this.c.fromRed().cmpn(1) === 0);
- this.oneC = (conf.c | 0) === 1;
- }
- inherits(EdwardsCurve, Base);
- module.exports = EdwardsCurve;
- EdwardsCurve.prototype._mulA = function _mulA(num) {
- if (this.mOneA)
- return num.redNeg();
- else
- return this.a.redMul(num);
- };
- EdwardsCurve.prototype._mulC = function _mulC(num) {
- if (this.oneC)
- return num;
- else
- return this.c.redMul(num);
- };
- EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) {
- return this.point(x, y, z, t);
- };
- EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) {
- x = new BN(x, 16);
- if (!x.red)
- x = x.toRed(this.red);
- var x2 = x.redSqr();
- var rhs = this.c2.redSub(this.a.redMul(x2));
- var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2));
- var y2 = rhs.redMul(lhs.redInvm());
- var y = y2.redSqrt();
- if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
- throw new Error("invalid point");
- var isOdd = y.fromRed().isOdd();
- if (odd && !isOdd || !odd && isOdd)
- y = y.redNeg();
- return this.point(x, y);
- };
- EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) {
- y = new BN(y, 16);
- if (!y.red)
- y = y.toRed(this.red);
- var y2 = y.redSqr();
- var lhs = y2.redSub(this.c2);
- var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a);
- var x2 = lhs.redMul(rhs.redInvm());
- if (x2.cmp(this.zero) === 0) {
- if (odd)
- throw new Error("invalid point");
- else
- return this.point(this.zero, y);
- }
- var x = x2.redSqrt();
- if (x.redSqr().redSub(x2).cmp(this.zero) !== 0)
- throw new Error("invalid point");
- if (x.fromRed().isOdd() !== odd)
- x = x.redNeg();
- return this.point(x, y);
- };
- EdwardsCurve.prototype.validate = function validate(point) {
- if (point.isInfinity())
- return true;
- point.normalize();
- var x2 = point.x.redSqr();
- var y2 = point.y.redSqr();
- var lhs = x2.redMul(this.a).redAdd(y2);
- var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2)));
- return lhs.cmp(rhs) === 0;
- };
- function Point(curve, x, y, z, t) {
- Base.BasePoint.call(this, curve, "projective");
- if (x === null && y === null && z === null) {
- this.x = this.curve.zero;
- this.y = this.curve.one;
- this.z = this.curve.one;
- this.t = this.curve.zero;
- this.zOne = true;
- } else {
- this.x = new BN(x, 16);
- this.y = new BN(y, 16);
- this.z = z ? new BN(z, 16) : this.curve.one;
- this.t = t && new BN(t, 16);
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.y.red)
- this.y = this.y.toRed(this.curve.red);
- if (!this.z.red)
- this.z = this.z.toRed(this.curve.red);
- if (this.t && !this.t.red)
- this.t = this.t.toRed(this.curve.red);
- this.zOne = this.z === this.curve.one;
- if (this.curve.extended && !this.t) {
- this.t = this.x.redMul(this.y);
- if (!this.zOne)
- this.t = this.t.redMul(this.z.redInvm());
- }
- }
- }
- inherits(Point, Base.BasePoint);
- EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
- return Point.fromJSON(this, obj);
- };
- EdwardsCurve.prototype.point = function point(x, y, z, t) {
- return new Point(this, x, y, z, t);
- };
- Point.fromJSON = function fromJSON(curve, obj) {
- return new Point(curve, obj[0], obj[1], obj[2]);
- };
- Point.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- Point.prototype.isInfinity = function isInfinity() {
- return this.x.cmpn(0) === 0 && (this.y.cmp(this.z) === 0 || this.zOne && this.y.cmp(this.curve.c) === 0);
- };
- Point.prototype._extDbl = function _extDbl() {
- var a = this.x.redSqr();
- var b = this.y.redSqr();
- var c = this.z.redSqr();
- c = c.redIAdd(c);
- var d = this.curve._mulA(a);
- var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b);
- var g = d.redAdd(b);
- var f = g.redSub(c);
- var h = d.redSub(b);
- var nx = e.redMul(f);
- var ny = g.redMul(h);
- var nt = e.redMul(h);
- var nz = f.redMul(g);
- return this.curve.point(nx, ny, nz, nt);
- };
- Point.prototype._projDbl = function _projDbl() {
- var b = this.x.redAdd(this.y).redSqr();
- var c = this.x.redSqr();
- var d = this.y.redSqr();
- var nx;
- var ny;
- var nz;
- var e;
- var h;
- var j;
- if (this.curve.twisted) {
- e = this.curve._mulA(c);
- var f = e.redAdd(d);
- if (this.zOne) {
- nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two));
- ny = f.redMul(e.redSub(d));
- nz = f.redSqr().redSub(f).redSub(f);
- } else {
- h = this.z.redSqr();
- j = f.redSub(h).redISub(h);
- nx = b.redSub(c).redISub(d).redMul(j);
- ny = f.redMul(e.redSub(d));
- nz = f.redMul(j);
- }
- } else {
- e = c.redAdd(d);
- h = this.curve._mulC(this.z).redSqr();
- j = e.redSub(h).redSub(h);
- nx = this.curve._mulC(b.redISub(e)).redMul(j);
- ny = this.curve._mulC(e).redMul(c.redISub(d));
- nz = e.redMul(j);
- }
- return this.curve.point(nx, ny, nz);
- };
- Point.prototype.dbl = function dbl() {
- if (this.isInfinity())
- return this;
- if (this.curve.extended)
- return this._extDbl();
- else
- return this._projDbl();
- };
- Point.prototype._extAdd = function _extAdd(p) {
- var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x));
- var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x));
- var c = this.t.redMul(this.curve.dd).redMul(p.t);
- var d = this.z.redMul(p.z.redAdd(p.z));
- var e = b.redSub(a);
- var f = d.redSub(c);
- var g = d.redAdd(c);
- var h = b.redAdd(a);
- var nx = e.redMul(f);
- var ny = g.redMul(h);
- var nt = e.redMul(h);
- var nz = f.redMul(g);
- return this.curve.point(nx, ny, nz, nt);
- };
- Point.prototype._projAdd = function _projAdd(p) {
- var a = this.z.redMul(p.z);
- var b = a.redSqr();
- var c = this.x.redMul(p.x);
- var d = this.y.redMul(p.y);
- var e = this.curve.d.redMul(c).redMul(d);
- var f = b.redSub(e);
- var g = b.redAdd(e);
- var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d);
- var nx = a.redMul(f).redMul(tmp);
- var ny;
- var nz;
- if (this.curve.twisted) {
- ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c)));
- nz = f.redMul(g);
- } else {
- ny = a.redMul(g).redMul(d.redSub(c));
- nz = this.curve._mulC(f).redMul(g);
- }
- return this.curve.point(nx, ny, nz);
- };
- Point.prototype.add = function add(p) {
- if (this.isInfinity())
- return p;
- if (p.isInfinity())
- return this;
- if (this.curve.extended)
- return this._extAdd(p);
- else
- return this._projAdd(p);
- };
- Point.prototype.mul = function mul(k) {
- if (this._hasDoubles(k))
- return this.curve._fixedNafMul(this, k);
- else
- return this.curve._wnafMul(this, k);
- };
- Point.prototype.mulAdd = function mulAdd(k1, p, k2) {
- return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, false);
- };
- Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) {
- return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, true);
- };
- Point.prototype.normalize = function normalize() {
- if (this.zOne)
- return this;
- var zi = this.z.redInvm();
- this.x = this.x.redMul(zi);
- this.y = this.y.redMul(zi);
- if (this.t)
- this.t = this.t.redMul(zi);
- this.z = this.curve.one;
- this.zOne = true;
- return this;
- };
- Point.prototype.neg = function neg() {
- return this.curve.point(this.x.redNeg(), this.y, this.z, this.t && this.t.redNeg());
- };
- Point.prototype.getX = function getX() {
- this.normalize();
- return this.x.fromRed();
- };
- Point.prototype.getY = function getY() {
- this.normalize();
- return this.y.fromRed();
- };
- Point.prototype.eq = function eq(other) {
- return this === other || this.getX().cmp(other.getX()) === 0 && this.getY().cmp(other.getY()) === 0;
- };
- Point.prototype.eqXToP = function eqXToP(x) {
- var rx = x.toRed(this.curve.red).redMul(this.z);
- if (this.x.cmp(rx) === 0)
- return true;
- var xc = x.clone();
- var t = this.curve.redN.redMul(this.z);
- for (;; ) {
- xc.iadd(this.curve.n);
- if (xc.cmp(this.curve.p) >= 0)
- return false;
- rx.redIAdd(t);
- if (this.x.cmp(rx) === 0)
- return true;
- }
- };
- Point.prototype.toP = Point.prototype.normalize;
- Point.prototype.mixedAdd = Point.prototype.add;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/index.js
-var require_curve = __commonJS((exports) => {
- var curve = exports;
- curve.base = require_base2();
- curve.short = require_short();
- curve.mont = require_mont();
- curve.edwards = require_edwards();
-});
-
-// ../eve/node_modules/hash.js/lib/hash/utils.js
-var require_utils3 = __commonJS((exports) => {
- var assert = require_minimalistic_assert();
- var inherits = require_inherits();
- exports.inherits = inherits;
- function isSurrogatePair(msg, i) {
- if ((msg.charCodeAt(i) & 64512) !== 55296) {
- return false;
- }
- if (i < 0 || i + 1 >= msg.length) {
- return false;
- }
- return (msg.charCodeAt(i + 1) & 64512) === 56320;
- }
- function toArray(msg, enc) {
- if (Array.isArray(msg))
- return msg.slice();
- if (!msg)
- return [];
- var res = [];
- if (typeof msg === "string") {
- if (!enc) {
- var p = 0;
- for (var i = 0;i < msg.length; i++) {
- var c = msg.charCodeAt(i);
- if (c < 128) {
- res[p++] = c;
- } else if (c < 2048) {
- res[p++] = c >> 6 | 192;
- res[p++] = c & 63 | 128;
- } else if (isSurrogatePair(msg, i)) {
- c = 65536 + ((c & 1023) << 10) + (msg.charCodeAt(++i) & 1023);
- res[p++] = c >> 18 | 240;
- res[p++] = c >> 12 & 63 | 128;
- res[p++] = c >> 6 & 63 | 128;
- res[p++] = c & 63 | 128;
- } else {
- res[p++] = c >> 12 | 224;
- res[p++] = c >> 6 & 63 | 128;
- res[p++] = c & 63 | 128;
- }
- }
- } else if (enc === "hex") {
- msg = msg.replace(/[^a-z0-9]+/ig, "");
- if (msg.length % 2 !== 0)
- msg = "0" + msg;
- for (i = 0;i < msg.length; i += 2)
- res.push(parseInt(msg[i] + msg[i + 1], 16));
- }
- } else {
- for (i = 0;i < msg.length; i++)
- res[i] = msg[i] | 0;
- }
- return res;
- }
- exports.toArray = toArray;
- function toHex(msg) {
- var res = "";
- for (var i = 0;i < msg.length; i++)
- res += zero2(msg[i].toString(16));
- return res;
- }
- exports.toHex = toHex;
- function htonl(w) {
- var res = w >>> 24 | w >>> 8 & 65280 | w << 8 & 16711680 | (w & 255) << 24;
- return res >>> 0;
- }
- exports.htonl = htonl;
- function toHex32(msg, endian) {
- var res = "";
- for (var i = 0;i < msg.length; i++) {
- var w = msg[i];
- if (endian === "little")
- w = htonl(w);
- res += zero8(w.toString(16));
- }
- return res;
- }
- exports.toHex32 = toHex32;
- function zero2(word) {
- if (word.length === 1)
- return "0" + word;
- else
- return word;
- }
- exports.zero2 = zero2;
- function zero8(word) {
- if (word.length === 7)
- return "0" + word;
- else if (word.length === 6)
- return "00" + word;
- else if (word.length === 5)
- return "000" + word;
- else if (word.length === 4)
- return "0000" + word;
- else if (word.length === 3)
- return "00000" + word;
- else if (word.length === 2)
- return "000000" + word;
- else if (word.length === 1)
- return "0000000" + word;
- else
- return word;
- }
- exports.zero8 = zero8;
- function join32(msg, start, end, endian) {
- var len = end - start;
- assert(len % 4 === 0);
- var res = new Array(len / 4);
- for (var i = 0, k = start;i < res.length; i++, k += 4) {
- var w;
- if (endian === "big")
- w = msg[k] << 24 | msg[k + 1] << 16 | msg[k + 2] << 8 | msg[k + 3];
- else
- w = msg[k + 3] << 24 | msg[k + 2] << 16 | msg[k + 1] << 8 | msg[k];
- res[i] = w >>> 0;
- }
- return res;
- }
- exports.join32 = join32;
- function split32(msg, endian) {
- var res = new Array(msg.length * 4);
- for (var i = 0, k = 0;i < msg.length; i++, k += 4) {
- var m = msg[i];
- if (endian === "big") {
- res[k] = m >>> 24;
- res[k + 1] = m >>> 16 & 255;
- res[k + 2] = m >>> 8 & 255;
- res[k + 3] = m & 255;
- } else {
- res[k + 3] = m >>> 24;
- res[k + 2] = m >>> 16 & 255;
- res[k + 1] = m >>> 8 & 255;
- res[k] = m & 255;
- }
- }
- return res;
- }
- exports.split32 = split32;
- function rotr32(w, b) {
- return w >>> b | w << 32 - b;
- }
- exports.rotr32 = rotr32;
- function rotl32(w, b) {
- return w << b | w >>> 32 - b;
- }
- exports.rotl32 = rotl32;
- function sum32(a, b) {
- return a + b >>> 0;
- }
- exports.sum32 = sum32;
- function sum32_3(a, b, c) {
- return a + b + c >>> 0;
- }
- exports.sum32_3 = sum32_3;
- function sum32_4(a, b, c, d) {
- return a + b + c + d >>> 0;
- }
- exports.sum32_4 = sum32_4;
- function sum32_5(a, b, c, d, e) {
- return a + b + c + d + e >>> 0;
- }
- exports.sum32_5 = sum32_5;
- function sum64(buf, pos, ah, al) {
- var bh = buf[pos];
- var bl = buf[pos + 1];
- var lo = al + bl >>> 0;
- var hi = (lo < al ? 1 : 0) + ah + bh;
- buf[pos] = hi >>> 0;
- buf[pos + 1] = lo;
- }
- exports.sum64 = sum64;
- function sum64_hi(ah, al, bh, bl) {
- var lo = al + bl >>> 0;
- var hi = (lo < al ? 1 : 0) + ah + bh;
- return hi >>> 0;
- }
- exports.sum64_hi = sum64_hi;
- function sum64_lo(ah, al, bh, bl) {
- var lo = al + bl;
- return lo >>> 0;
- }
- exports.sum64_lo = sum64_lo;
- function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) {
- var carry = 0;
- var lo = al;
- lo = lo + bl >>> 0;
- carry += lo < al ? 1 : 0;
- lo = lo + cl >>> 0;
- carry += lo < cl ? 1 : 0;
- lo = lo + dl >>> 0;
- carry += lo < dl ? 1 : 0;
- var hi = ah + bh + ch + dh + carry;
- return hi >>> 0;
- }
- exports.sum64_4_hi = sum64_4_hi;
- function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) {
- var lo = al + bl + cl + dl;
- return lo >>> 0;
- }
- exports.sum64_4_lo = sum64_4_lo;
- function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
- var carry = 0;
- var lo = al;
- lo = lo + bl >>> 0;
- carry += lo < al ? 1 : 0;
- lo = lo + cl >>> 0;
- carry += lo < cl ? 1 : 0;
- lo = lo + dl >>> 0;
- carry += lo < dl ? 1 : 0;
- lo = lo + el >>> 0;
- carry += lo < el ? 1 : 0;
- var hi = ah + bh + ch + dh + eh + carry;
- return hi >>> 0;
- }
- exports.sum64_5_hi = sum64_5_hi;
- function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
- var lo = al + bl + cl + dl + el;
- return lo >>> 0;
- }
- exports.sum64_5_lo = sum64_5_lo;
- function rotr64_hi(ah, al, num) {
- var r = al << 32 - num | ah >>> num;
- return r >>> 0;
- }
- exports.rotr64_hi = rotr64_hi;
- function rotr64_lo(ah, al, num) {
- var r = ah << 32 - num | al >>> num;
- return r >>> 0;
- }
- exports.rotr64_lo = rotr64_lo;
- function shr64_hi(ah, al, num) {
- return ah >>> num;
- }
- exports.shr64_hi = shr64_hi;
- function shr64_lo(ah, al, num) {
- var r = ah << 32 - num | al >>> num;
- return r >>> 0;
- }
- exports.shr64_lo = shr64_lo;
-});
-
-// ../eve/node_modules/hash.js/lib/hash/common.js
-var require_common = __commonJS((exports) => {
- var utils = require_utils3();
- var assert = require_minimalistic_assert();
- function BlockHash() {
- this.pending = null;
- this.pendingTotal = 0;
- this.blockSize = this.constructor.blockSize;
- this.outSize = this.constructor.outSize;
- this.hmacStrength = this.constructor.hmacStrength;
- this.padLength = this.constructor.padLength / 8;
- this.endian = "big";
- this._delta8 = this.blockSize / 8;
- this._delta32 = this.blockSize / 32;
- }
- exports.BlockHash = BlockHash;
- BlockHash.prototype.update = function update(msg, enc) {
- msg = utils.toArray(msg, enc);
- if (!this.pending)
- this.pending = msg;
- else
- this.pending = this.pending.concat(msg);
- this.pendingTotal += msg.length;
- if (this.pending.length >= this._delta8) {
- msg = this.pending;
- var r = msg.length % this._delta8;
- this.pending = msg.slice(msg.length - r, msg.length);
- if (this.pending.length === 0)
- this.pending = null;
- msg = utils.join32(msg, 0, msg.length - r, this.endian);
- for (var i = 0;i < msg.length; i += this._delta32)
- this._update(msg, i, i + this._delta32);
- }
- return this;
- };
- BlockHash.prototype.digest = function digest(enc) {
- this.update(this._pad());
- assert(this.pending === null);
- return this._digest(enc);
- };
- BlockHash.prototype._pad = function pad() {
- var len = this.pendingTotal;
- var bytes = this._delta8;
- var k = bytes - (len + this.padLength) % bytes;
- var res = new Array(k + this.padLength);
- res[0] = 128;
- for (var i = 1;i < k; i++)
- res[i] = 0;
- len <<= 3;
- if (this.endian === "big") {
- for (var t = 8;t < this.padLength; t++)
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = len >>> 24 & 255;
- res[i++] = len >>> 16 & 255;
- res[i++] = len >>> 8 & 255;
- res[i++] = len & 255;
- } else {
- res[i++] = len & 255;
- res[i++] = len >>> 8 & 255;
- res[i++] = len >>> 16 & 255;
- res[i++] = len >>> 24 & 255;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- for (t = 8;t < this.padLength; t++)
- res[i++] = 0;
- }
- return res;
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/common.js
-var require_common2 = __commonJS((exports) => {
- var utils = require_utils3();
- var rotr32 = utils.rotr32;
- function ft_1(s, x, y, z) {
- if (s === 0)
- return ch32(x, y, z);
- if (s === 1 || s === 3)
- return p32(x, y, z);
- if (s === 2)
- return maj32(x, y, z);
- }
- exports.ft_1 = ft_1;
- function ch32(x, y, z) {
- return x & y ^ ~x & z;
- }
- exports.ch32 = ch32;
- function maj32(x, y, z) {
- return x & y ^ x & z ^ y & z;
- }
- exports.maj32 = maj32;
- function p32(x, y, z) {
- return x ^ y ^ z;
- }
- exports.p32 = p32;
- function s0_256(x) {
- return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22);
- }
- exports.s0_256 = s0_256;
- function s1_256(x) {
- return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25);
- }
- exports.s1_256 = s1_256;
- function g0_256(x) {
- return rotr32(x, 7) ^ rotr32(x, 18) ^ x >>> 3;
- }
- exports.g0_256 = g0_256;
- function g1_256(x) {
- return rotr32(x, 17) ^ rotr32(x, 19) ^ x >>> 10;
- }
- exports.g1_256 = g1_256;
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/1.js
-var require_1 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var common = require_common();
- var shaCommon = require_common2();
- var rotl32 = utils.rotl32;
- var sum32 = utils.sum32;
- var sum32_5 = utils.sum32_5;
- var ft_1 = shaCommon.ft_1;
- var BlockHash = common.BlockHash;
- var sha1_K = [
- 1518500249,
- 1859775393,
- 2400959708,
- 3395469782
- ];
- function SHA1() {
- if (!(this instanceof SHA1))
- return new SHA1;
- BlockHash.call(this);
- this.h = [
- 1732584193,
- 4023233417,
- 2562383102,
- 271733878,
- 3285377520
- ];
- this.W = new Array(80);
- }
- utils.inherits(SHA1, BlockHash);
- module.exports = SHA1;
- SHA1.blockSize = 512;
- SHA1.outSize = 160;
- SHA1.hmacStrength = 80;
- SHA1.padLength = 64;
- SHA1.prototype._update = function _update(msg, start) {
- var W = this.W;
- for (var i = 0;i < 16; i++)
- W[i] = msg[start + i];
- for (;i < W.length; i++)
- W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
- var a = this.h[0];
- var b = this.h[1];
- var c = this.h[2];
- var d = this.h[3];
- var e = this.h[4];
- for (i = 0;i < W.length; i++) {
- var s = ~~(i / 20);
- var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]);
- e = d;
- d = c;
- c = rotl32(b, 30);
- b = a;
- a = t;
- }
- this.h[0] = sum32(this.h[0], a);
- this.h[1] = sum32(this.h[1], b);
- this.h[2] = sum32(this.h[2], c);
- this.h[3] = sum32(this.h[3], d);
- this.h[4] = sum32(this.h[4], e);
- };
- SHA1.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "big");
- else
- return utils.split32(this.h, "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/256.js
-var require_256 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var common = require_common();
- var shaCommon = require_common2();
- var assert = require_minimalistic_assert();
- var sum32 = utils.sum32;
- var sum32_4 = utils.sum32_4;
- var sum32_5 = utils.sum32_5;
- var ch32 = shaCommon.ch32;
- var maj32 = shaCommon.maj32;
- var s0_256 = shaCommon.s0_256;
- var s1_256 = shaCommon.s1_256;
- var g0_256 = shaCommon.g0_256;
- var g1_256 = shaCommon.g1_256;
- var BlockHash = common.BlockHash;
- var sha256_K = [
- 1116352408,
- 1899447441,
- 3049323471,
- 3921009573,
- 961987163,
- 1508970993,
- 2453635748,
- 2870763221,
- 3624381080,
- 310598401,
- 607225278,
- 1426881987,
- 1925078388,
- 2162078206,
- 2614888103,
- 3248222580,
- 3835390401,
- 4022224774,
- 264347078,
- 604807628,
- 770255983,
- 1249150122,
- 1555081692,
- 1996064986,
- 2554220882,
- 2821834349,
- 2952996808,
- 3210313671,
- 3336571891,
- 3584528711,
- 113926993,
- 338241895,
- 666307205,
- 773529912,
- 1294757372,
- 1396182291,
- 1695183700,
- 1986661051,
- 2177026350,
- 2456956037,
- 2730485921,
- 2820302411,
- 3259730800,
- 3345764771,
- 3516065817,
- 3600352804,
- 4094571909,
- 275423344,
- 430227734,
- 506948616,
- 659060556,
- 883997877,
- 958139571,
- 1322822218,
- 1537002063,
- 1747873779,
- 1955562222,
- 2024104815,
- 2227730452,
- 2361852424,
- 2428436474,
- 2756734187,
- 3204031479,
- 3329325298
- ];
- function SHA256() {
- if (!(this instanceof SHA256))
- return new SHA256;
- BlockHash.call(this);
- this.h = [
- 1779033703,
- 3144134277,
- 1013904242,
- 2773480762,
- 1359893119,
- 2600822924,
- 528734635,
- 1541459225
- ];
- this.k = sha256_K;
- this.W = new Array(64);
- }
- utils.inherits(SHA256, BlockHash);
- module.exports = SHA256;
- SHA256.blockSize = 512;
- SHA256.outSize = 256;
- SHA256.hmacStrength = 192;
- SHA256.padLength = 64;
- SHA256.prototype._update = function _update(msg, start) {
- var W = this.W;
- for (var i = 0;i < 16; i++)
- W[i] = msg[start + i];
- for (;i < W.length; i++)
- W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]);
- var a = this.h[0];
- var b = this.h[1];
- var c = this.h[2];
- var d = this.h[3];
- var e = this.h[4];
- var f = this.h[5];
- var g = this.h[6];
- var h = this.h[7];
- assert(this.k.length === W.length);
- for (i = 0;i < W.length; i++) {
- var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]);
- var T2 = sum32(s0_256(a), maj32(a, b, c));
- h = g;
- g = f;
- f = e;
- e = sum32(d, T1);
- d = c;
- c = b;
- b = a;
- a = sum32(T1, T2);
- }
- this.h[0] = sum32(this.h[0], a);
- this.h[1] = sum32(this.h[1], b);
- this.h[2] = sum32(this.h[2], c);
- this.h[3] = sum32(this.h[3], d);
- this.h[4] = sum32(this.h[4], e);
- this.h[5] = sum32(this.h[5], f);
- this.h[6] = sum32(this.h[6], g);
- this.h[7] = sum32(this.h[7], h);
- };
- SHA256.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "big");
- else
- return utils.split32(this.h, "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/224.js
-var require_224 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var SHA256 = require_256();
- function SHA224() {
- if (!(this instanceof SHA224))
- return new SHA224;
- SHA256.call(this);
- this.h = [
- 3238371032,
- 914150663,
- 812702999,
- 4144912697,
- 4290775857,
- 1750603025,
- 1694076839,
- 3204075428
- ];
- }
- utils.inherits(SHA224, SHA256);
- module.exports = SHA224;
- SHA224.blockSize = 512;
- SHA224.outSize = 224;
- SHA224.hmacStrength = 192;
- SHA224.padLength = 64;
- SHA224.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h.slice(0, 7), "big");
- else
- return utils.split32(this.h.slice(0, 7), "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/512.js
-var require_512 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var common = require_common();
- var assert = require_minimalistic_assert();
- var rotr64_hi = utils.rotr64_hi;
- var rotr64_lo = utils.rotr64_lo;
- var shr64_hi = utils.shr64_hi;
- var shr64_lo = utils.shr64_lo;
- var sum64 = utils.sum64;
- var sum64_hi = utils.sum64_hi;
- var sum64_lo = utils.sum64_lo;
- var sum64_4_hi = utils.sum64_4_hi;
- var sum64_4_lo = utils.sum64_4_lo;
- var sum64_5_hi = utils.sum64_5_hi;
- var sum64_5_lo = utils.sum64_5_lo;
- var BlockHash = common.BlockHash;
- var sha512_K = [
- 1116352408,
- 3609767458,
- 1899447441,
- 602891725,
- 3049323471,
- 3964484399,
- 3921009573,
- 2173295548,
- 961987163,
- 4081628472,
- 1508970993,
- 3053834265,
- 2453635748,
- 2937671579,
- 2870763221,
- 3664609560,
- 3624381080,
- 2734883394,
- 310598401,
- 1164996542,
- 607225278,
- 1323610764,
- 1426881987,
- 3590304994,
- 1925078388,
- 4068182383,
- 2162078206,
- 991336113,
- 2614888103,
- 633803317,
- 3248222580,
- 3479774868,
- 3835390401,
- 2666613458,
- 4022224774,
- 944711139,
- 264347078,
- 2341262773,
- 604807628,
- 2007800933,
- 770255983,
- 1495990901,
- 1249150122,
- 1856431235,
- 1555081692,
- 3175218132,
- 1996064986,
- 2198950837,
- 2554220882,
- 3999719339,
- 2821834349,
- 766784016,
- 2952996808,
- 2566594879,
- 3210313671,
- 3203337956,
- 3336571891,
- 1034457026,
- 3584528711,
- 2466948901,
- 113926993,
- 3758326383,
- 338241895,
- 168717936,
- 666307205,
- 1188179964,
- 773529912,
- 1546045734,
- 1294757372,
- 1522805485,
- 1396182291,
- 2643833823,
- 1695183700,
- 2343527390,
- 1986661051,
- 1014477480,
- 2177026350,
- 1206759142,
- 2456956037,
- 344077627,
- 2730485921,
- 1290863460,
- 2820302411,
- 3158454273,
- 3259730800,
- 3505952657,
- 3345764771,
- 106217008,
- 3516065817,
- 3606008344,
- 3600352804,
- 1432725776,
- 4094571909,
- 1467031594,
- 275423344,
- 851169720,
- 430227734,
- 3100823752,
- 506948616,
- 1363258195,
- 659060556,
- 3750685593,
- 883997877,
- 3785050280,
- 958139571,
- 3318307427,
- 1322822218,
- 3812723403,
- 1537002063,
- 2003034995,
- 1747873779,
- 3602036899,
- 1955562222,
- 1575990012,
- 2024104815,
- 1125592928,
- 2227730452,
- 2716904306,
- 2361852424,
- 442776044,
- 2428436474,
- 593698344,
- 2756734187,
- 3733110249,
- 3204031479,
- 2999351573,
- 3329325298,
- 3815920427,
- 3391569614,
- 3928383900,
- 3515267271,
- 566280711,
- 3940187606,
- 3454069534,
- 4118630271,
- 4000239992,
- 116418474,
- 1914138554,
- 174292421,
- 2731055270,
- 289380356,
- 3203993006,
- 460393269,
- 320620315,
- 685471733,
- 587496836,
- 852142971,
- 1086792851,
- 1017036298,
- 365543100,
- 1126000580,
- 2618297676,
- 1288033470,
- 3409855158,
- 1501505948,
- 4234509866,
- 1607167915,
- 987167468,
- 1816402316,
- 1246189591
- ];
- function SHA512() {
- if (!(this instanceof SHA512))
- return new SHA512;
- BlockHash.call(this);
- this.h = [
- 1779033703,
- 4089235720,
- 3144134277,
- 2227873595,
- 1013904242,
- 4271175723,
- 2773480762,
- 1595750129,
- 1359893119,
- 2917565137,
- 2600822924,
- 725511199,
- 528734635,
- 4215389547,
- 1541459225,
- 327033209
- ];
- this.k = sha512_K;
- this.W = new Array(160);
- }
- utils.inherits(SHA512, BlockHash);
- module.exports = SHA512;
- SHA512.blockSize = 1024;
- SHA512.outSize = 512;
- SHA512.hmacStrength = 192;
- SHA512.padLength = 128;
- SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) {
- var W = this.W;
- for (var i = 0;i < 32; i++)
- W[i] = msg[start + i];
- for (;i < W.length; i += 2) {
- var c0_hi = g1_512_hi(W[i - 4], W[i - 3]);
- var c0_lo = g1_512_lo(W[i - 4], W[i - 3]);
- var c1_hi = W[i - 14];
- var c1_lo = W[i - 13];
- var c2_hi = g0_512_hi(W[i - 30], W[i - 29]);
- var c2_lo = g0_512_lo(W[i - 30], W[i - 29]);
- var c3_hi = W[i - 32];
- var c3_lo = W[i - 31];
- W[i] = sum64_4_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo);
- W[i + 1] = sum64_4_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo);
- }
- };
- SHA512.prototype._update = function _update(msg, start) {
- this._prepareBlock(msg, start);
- var W = this.W;
- var ah = this.h[0];
- var al = this.h[1];
- var bh = this.h[2];
- var bl = this.h[3];
- var ch = this.h[4];
- var cl = this.h[5];
- var dh = this.h[6];
- var dl = this.h[7];
- var eh = this.h[8];
- var el = this.h[9];
- var fh = this.h[10];
- var fl = this.h[11];
- var gh = this.h[12];
- var gl = this.h[13];
- var hh = this.h[14];
- var hl = this.h[15];
- assert(this.k.length === W.length);
- for (var i = 0;i < W.length; i += 2) {
- var c0_hi = hh;
- var c0_lo = hl;
- var c1_hi = s1_512_hi(eh, el);
- var c1_lo = s1_512_lo(eh, el);
- var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl);
- var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl);
- var c3_hi = this.k[i];
- var c3_lo = this.k[i + 1];
- var c4_hi = W[i];
- var c4_lo = W[i + 1];
- var T1_hi = sum64_5_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo);
- var T1_lo = sum64_5_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo);
- c0_hi = s0_512_hi(ah, al);
- c0_lo = s0_512_lo(ah, al);
- c1_hi = maj64_hi(ah, al, bh, bl, ch, cl);
- c1_lo = maj64_lo(ah, al, bh, bl, ch, cl);
- var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo);
- var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo);
- hh = gh;
- hl = gl;
- gh = fh;
- gl = fl;
- fh = eh;
- fl = el;
- eh = sum64_hi(dh, dl, T1_hi, T1_lo);
- el = sum64_lo(dl, dl, T1_hi, T1_lo);
- dh = ch;
- dl = cl;
- ch = bh;
- cl = bl;
- bh = ah;
- bl = al;
- ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo);
- al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo);
- }
- sum64(this.h, 0, ah, al);
- sum64(this.h, 2, bh, bl);
- sum64(this.h, 4, ch, cl);
- sum64(this.h, 6, dh, dl);
- sum64(this.h, 8, eh, el);
- sum64(this.h, 10, fh, fl);
- sum64(this.h, 12, gh, gl);
- sum64(this.h, 14, hh, hl);
- };
- SHA512.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "big");
- else
- return utils.split32(this.h, "big");
- };
- function ch64_hi(xh, xl, yh, yl, zh) {
- var r = xh & yh ^ ~xh & zh;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function ch64_lo(xh, xl, yh, yl, zh, zl) {
- var r = xl & yl ^ ~xl & zl;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function maj64_hi(xh, xl, yh, yl, zh) {
- var r = xh & yh ^ xh & zh ^ yh & zh;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function maj64_lo(xh, xl, yh, yl, zh, zl) {
- var r = xl & yl ^ xl & zl ^ yl & zl;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s0_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 28);
- var c1_hi = rotr64_hi(xl, xh, 2);
- var c2_hi = rotr64_hi(xl, xh, 7);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s0_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 28);
- var c1_lo = rotr64_lo(xl, xh, 2);
- var c2_lo = rotr64_lo(xl, xh, 7);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s1_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 14);
- var c1_hi = rotr64_hi(xh, xl, 18);
- var c2_hi = rotr64_hi(xl, xh, 9);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s1_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 14);
- var c1_lo = rotr64_lo(xh, xl, 18);
- var c2_lo = rotr64_lo(xl, xh, 9);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g0_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 1);
- var c1_hi = rotr64_hi(xh, xl, 8);
- var c2_hi = shr64_hi(xh, xl, 7);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g0_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 1);
- var c1_lo = rotr64_lo(xh, xl, 8);
- var c2_lo = shr64_lo(xh, xl, 7);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g1_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 19);
- var c1_hi = rotr64_hi(xl, xh, 29);
- var c2_hi = shr64_hi(xh, xl, 6);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g1_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 19);
- var c1_lo = rotr64_lo(xl, xh, 29);
- var c2_lo = shr64_lo(xh, xl, 6);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/384.js
-var require_384 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var SHA512 = require_512();
- function SHA384() {
- if (!(this instanceof SHA384))
- return new SHA384;
- SHA512.call(this);
- this.h = [
- 3418070365,
- 3238371032,
- 1654270250,
- 914150663,
- 2438529370,
- 812702999,
- 355462360,
- 4144912697,
- 1731405415,
- 4290775857,
- 2394180231,
- 1750603025,
- 3675008525,
- 1694076839,
- 1203062813,
- 3204075428
- ];
- }
- utils.inherits(SHA384, SHA512);
- module.exports = SHA384;
- SHA384.blockSize = 1024;
- SHA384.outSize = 384;
- SHA384.hmacStrength = 192;
- SHA384.padLength = 128;
- SHA384.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h.slice(0, 12), "big");
- else
- return utils.split32(this.h.slice(0, 12), "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha.js
-var require_sha = __commonJS((exports) => {
- exports.sha1 = require_1();
- exports.sha224 = require_224();
- exports.sha256 = require_256();
- exports.sha384 = require_384();
- exports.sha512 = require_512();
-});
-
-// ../eve/node_modules/hash.js/lib/hash/ripemd.js
-var require_ripemd = __commonJS((exports) => {
- var utils = require_utils3();
- var common = require_common();
- var rotl32 = utils.rotl32;
- var sum32 = utils.sum32;
- var sum32_3 = utils.sum32_3;
- var sum32_4 = utils.sum32_4;
- var BlockHash = common.BlockHash;
- function RIPEMD160() {
- if (!(this instanceof RIPEMD160))
- return new RIPEMD160;
- BlockHash.call(this);
- this.h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];
- this.endian = "little";
- }
- utils.inherits(RIPEMD160, BlockHash);
- exports.ripemd160 = RIPEMD160;
- RIPEMD160.blockSize = 512;
- RIPEMD160.outSize = 160;
- RIPEMD160.hmacStrength = 192;
- RIPEMD160.padLength = 64;
- RIPEMD160.prototype._update = function update(msg, start) {
- var A = this.h[0];
- var B = this.h[1];
- var C = this.h[2];
- var D = this.h[3];
- var E = this.h[4];
- var Ah = A;
- var Bh = B;
- var Ch = C;
- var Dh = D;
- var Eh = E;
- for (var j = 0;j < 80; j++) {
- var T = sum32(rotl32(sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), s[j]), E);
- A = E;
- E = D;
- D = rotl32(C, 10);
- C = B;
- B = T;
- T = sum32(rotl32(sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), sh[j]), Eh);
- Ah = Eh;
- Eh = Dh;
- Dh = rotl32(Ch, 10);
- Ch = Bh;
- Bh = T;
- }
- T = sum32_3(this.h[1], C, Dh);
- this.h[1] = sum32_3(this.h[2], D, Eh);
- this.h[2] = sum32_3(this.h[3], E, Ah);
- this.h[3] = sum32_3(this.h[4], A, Bh);
- this.h[4] = sum32_3(this.h[0], B, Ch);
- this.h[0] = T;
- };
- RIPEMD160.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "little");
- else
- return utils.split32(this.h, "little");
- };
- function f(j, x, y, z) {
- if (j <= 15)
- return x ^ y ^ z;
- else if (j <= 31)
- return x & y | ~x & z;
- else if (j <= 47)
- return (x | ~y) ^ z;
- else if (j <= 63)
- return x & z | y & ~z;
- else
- return x ^ (y | ~z);
- }
- function K(j) {
- if (j <= 15)
- return 0;
- else if (j <= 31)
- return 1518500249;
- else if (j <= 47)
- return 1859775393;
- else if (j <= 63)
- return 2400959708;
- else
- return 2840853838;
- }
- function Kh(j) {
- if (j <= 15)
- return 1352829926;
- else if (j <= 31)
- return 1548603684;
- else if (j <= 47)
- return 1836072691;
- else if (j <= 63)
- return 2053994217;
- else
- return 0;
- }
- var r = [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 7,
- 4,
- 13,
- 1,
- 10,
- 6,
- 15,
- 3,
- 12,
- 0,
- 9,
- 5,
- 2,
- 14,
- 11,
- 8,
- 3,
- 10,
- 14,
- 4,
- 9,
- 15,
- 8,
- 1,
- 2,
- 7,
- 0,
- 6,
- 13,
- 11,
- 5,
- 12,
- 1,
- 9,
- 11,
- 10,
- 0,
- 8,
- 12,
- 4,
- 13,
- 3,
- 7,
- 15,
- 14,
- 5,
- 6,
- 2,
- 4,
- 0,
- 5,
- 9,
- 7,
- 12,
- 2,
- 10,
- 14,
- 1,
- 3,
- 8,
- 11,
- 6,
- 15,
- 13
- ];
- var rh = [
- 5,
- 14,
- 7,
- 0,
- 9,
- 2,
- 11,
- 4,
- 13,
- 6,
- 15,
- 8,
- 1,
- 10,
- 3,
- 12,
- 6,
- 11,
- 3,
- 7,
- 0,
- 13,
- 5,
- 10,
- 14,
- 15,
- 8,
- 12,
- 4,
- 9,
- 1,
- 2,
- 15,
- 5,
- 1,
- 3,
- 7,
- 14,
- 6,
- 9,
- 11,
- 8,
- 12,
- 2,
- 10,
- 0,
- 4,
- 13,
- 8,
- 6,
- 4,
- 1,
- 3,
- 11,
- 15,
- 0,
- 5,
- 12,
- 2,
- 13,
- 9,
- 7,
- 10,
- 14,
- 12,
- 15,
- 10,
- 4,
- 1,
- 5,
- 8,
- 7,
- 6,
- 2,
- 13,
- 14,
- 0,
- 3,
- 9,
- 11
- ];
- var s = [
- 11,
- 14,
- 15,
- 12,
- 5,
- 8,
- 7,
- 9,
- 11,
- 13,
- 14,
- 15,
- 6,
- 7,
- 9,
- 8,
- 7,
- 6,
- 8,
- 13,
- 11,
- 9,
- 7,
- 15,
- 7,
- 12,
- 15,
- 9,
- 11,
- 7,
- 13,
- 12,
- 11,
- 13,
- 6,
- 7,
- 14,
- 9,
- 13,
- 15,
- 14,
- 8,
- 13,
- 6,
- 5,
- 12,
- 7,
- 5,
- 11,
- 12,
- 14,
- 15,
- 14,
- 15,
- 9,
- 8,
- 9,
- 14,
- 5,
- 6,
- 8,
- 6,
- 5,
- 12,
- 9,
- 15,
- 5,
- 11,
- 6,
- 8,
- 13,
- 12,
- 5,
- 12,
- 13,
- 14,
- 11,
- 8,
- 5,
- 6
- ];
- var sh = [
- 8,
- 9,
- 9,
- 11,
- 13,
- 15,
- 15,
- 5,
- 7,
- 7,
- 8,
- 11,
- 14,
- 14,
- 12,
- 6,
- 9,
- 13,
- 15,
- 7,
- 12,
- 8,
- 9,
- 11,
- 7,
- 7,
- 12,
- 7,
- 6,
- 15,
- 13,
- 11,
- 9,
- 7,
- 15,
- 11,
- 8,
- 6,
- 6,
- 14,
- 12,
- 13,
- 5,
- 14,
- 13,
- 13,
- 7,
- 5,
- 15,
- 5,
- 8,
- 11,
- 14,
- 14,
- 6,
- 14,
- 6,
- 9,
- 12,
- 9,
- 12,
- 5,
- 15,
- 8,
- 8,
- 5,
- 12,
- 9,
- 12,
- 5,
- 14,
- 6,
- 8,
- 13,
- 6,
- 5,
- 15,
- 13,
- 11,
- 11
- ];
-});
-
-// ../eve/node_modules/hash.js/lib/hash/hmac.js
-var require_hmac = __commonJS((exports, module) => {
- var utils = require_utils3();
- var assert = require_minimalistic_assert();
- function Hmac(hash, key, enc) {
- if (!(this instanceof Hmac))
- return new Hmac(hash, key, enc);
- this.Hash = hash;
- this.blockSize = hash.blockSize / 8;
- this.outSize = hash.outSize / 8;
- this.inner = null;
- this.outer = null;
- this._init(utils.toArray(key, enc));
- }
- module.exports = Hmac;
- Hmac.prototype._init = function init(key) {
- if (key.length > this.blockSize)
- key = new this.Hash().update(key).digest();
- assert(key.length <= this.blockSize);
- for (var i = key.length;i < this.blockSize; i++)
- key.push(0);
- for (i = 0;i < key.length; i++)
- key[i] ^= 54;
- this.inner = new this.Hash().update(key);
- for (i = 0;i < key.length; i++)
- key[i] ^= 106;
- this.outer = new this.Hash().update(key);
- };
- Hmac.prototype.update = function update(msg, enc) {
- this.inner.update(msg, enc);
- return this;
- };
- Hmac.prototype.digest = function digest(enc) {
- this.outer.update(this.inner.digest());
- return this.outer.digest(enc);
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash.js
-var require_hash = __commonJS((exports) => {
- var hash = exports;
- hash.utils = require_utils3();
- hash.common = require_common();
- hash.sha = require_sha();
- hash.ripemd = require_ripemd();
- hash.hmac = require_hmac();
- hash.sha1 = hash.sha.sha1;
- hash.sha256 = hash.sha.sha256;
- hash.sha224 = hash.sha.sha224;
- hash.sha384 = hash.sha.sha384;
- hash.sha512 = hash.sha.sha512;
- hash.ripemd160 = hash.ripemd.ripemd160;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js
-var require_secp256k1 = __commonJS((exports, module) => {
- module.exports = {
- doubles: {
- step: 4,
- points: [
- [
- "e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a",
- "f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821"
- ],
- [
- "8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508",
- "11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"
- ],
- [
- "175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739",
- "d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695"
- ],
- [
- "363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640",
- "4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9"
- ],
- [
- "8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c",
- "4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36"
- ],
- [
- "723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda",
- "96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f"
- ],
- [
- "eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa",
- "5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999"
- ],
- [
- "100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0",
- "cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09"
- ],
- [
- "e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d",
- "9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d"
- ],
- [
- "feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d",
- "e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088"
- ],
- [
- "da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1",
- "9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d"
- ],
- [
- "53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0",
- "5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8"
- ],
- [
- "8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047",
- "10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a"
- ],
- [
- "385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862",
- "283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453"
- ],
- [
- "6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7",
- "7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160"
- ],
- [
- "3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd",
- "56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0"
- ],
- [
- "85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83",
- "7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6"
- ],
- [
- "948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a",
- "53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589"
- ],
- [
- "6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8",
- "bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17"
- ],
- [
- "e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d",
- "4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda"
- ],
- [
- "e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725",
- "7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd"
- ],
- [
- "213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754",
- "4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2"
- ],
- [
- "4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c",
- "17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6"
- ],
- [
- "fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6",
- "6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f"
- ],
- [
- "76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39",
- "c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01"
- ],
- [
- "c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891",
- "893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3"
- ],
- [
- "d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b",
- "febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f"
- ],
- [
- "b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03",
- "2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7"
- ],
- [
- "e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d",
- "eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78"
- ],
- [
- "a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070",
- "7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1"
- ],
- [
- "90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4",
- "e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150"
- ],
- [
- "8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da",
- "662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82"
- ],
- [
- "e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11",
- "1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc"
- ],
- [
- "8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e",
- "efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b"
- ],
- [
- "e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41",
- "2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51"
- ],
- [
- "b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef",
- "67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45"
- ],
- [
- "d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8",
- "db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120"
- ],
- [
- "324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d",
- "648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84"
- ],
- [
- "4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96",
- "35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d"
- ],
- [
- "9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd",
- "ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d"
- ],
- [
- "6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5",
- "9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8"
- ],
- [
- "a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266",
- "40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8"
- ],
- [
- "7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71",
- "34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac"
- ],
- [
- "928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac",
- "c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f"
- ],
- [
- "85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751",
- "1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962"
- ],
- [
- "ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e",
- "493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907"
- ],
- [
- "827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241",
- "c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec"
- ],
- [
- "eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3",
- "be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d"
- ],
- [
- "e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f",
- "4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414"
- ],
- [
- "1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19",
- "aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd"
- ],
- [
- "146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be",
- "b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0"
- ],
- [
- "fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9",
- "6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811"
- ],
- [
- "da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2",
- "8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1"
- ],
- [
- "a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13",
- "7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c"
- ],
- [
- "174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c",
- "ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73"
- ],
- [
- "959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba",
- "2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd"
- ],
- [
- "d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151",
- "e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405"
- ],
- [
- "64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073",
- "d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589"
- ],
- [
- "8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458",
- "38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e"
- ],
- [
- "13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b",
- "69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27"
- ],
- [
- "bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366",
- "d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1"
- ],
- [
- "8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa",
- "40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482"
- ],
- [
- "8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0",
- "620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945"
- ],
- [
- "dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787",
- "7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573"
- ],
- [
- "f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e",
- "ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82"
- ]
- ]
- },
- naf: {
- wnd: 7,
- points: [
- [
- "f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9",
- "388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672"
- ],
- [
- "2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4",
- "d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6"
- ],
- [
- "5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc",
- "6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da"
- ],
- [
- "acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe",
- "cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37"
- ],
- [
- "774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb",
- "d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b"
- ],
- [
- "f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8",
- "ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81"
- ],
- [
- "d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e",
- "581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58"
- ],
- [
- "defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34",
- "4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77"
- ],
- [
- "2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c",
- "85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a"
- ],
- [
- "352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5",
- "321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c"
- ],
- [
- "2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f",
- "2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67"
- ],
- [
- "9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714",
- "73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402"
- ],
- [
- "daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729",
- "a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55"
- ],
- [
- "c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db",
- "2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482"
- ],
- [
- "6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4",
- "e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82"
- ],
- [
- "1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5",
- "b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396"
- ],
- [
- "605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479",
- "2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49"
- ],
- [
- "62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d",
- "80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf"
- ],
- [
- "80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f",
- "1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a"
- ],
- [
- "7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb",
- "d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7"
- ],
- [
- "d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9",
- "eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933"
- ],
- [
- "49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963",
- "758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a"
- ],
- [
- "77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74",
- "958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6"
- ],
- [
- "f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530",
- "e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37"
- ],
- [
- "463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b",
- "5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e"
- ],
- [
- "f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247",
- "cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6"
- ],
- [
- "caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1",
- "cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476"
- ],
- [
- "2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120",
- "4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40"
- ],
- [
- "7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435",
- "91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61"
- ],
- [
- "754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18",
- "673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683"
- ],
- [
- "e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8",
- "59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5"
- ],
- [
- "186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb",
- "3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b"
- ],
- [
- "df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f",
- "55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417"
- ],
- [
- "5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143",
- "efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868"
- ],
- [
- "290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba",
- "e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a"
- ],
- [
- "af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45",
- "f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6"
- ],
- [
- "766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a",
- "744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996"
- ],
- [
- "59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e",
- "c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e"
- ],
- [
- "f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8",
- "e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d"
- ],
- [
- "7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c",
- "30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2"
- ],
- [
- "948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519",
- "e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e"
- ],
- [
- "7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab",
- "100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437"
- ],
- [
- "3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca",
- "ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311"
- ],
- [
- "d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf",
- "8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4"
- ],
- [
- "1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610",
- "68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575"
- ],
- [
- "733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4",
- "f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d"
- ],
- [
- "15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c",
- "d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d"
- ],
- [
- "a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940",
- "edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629"
- ],
- [
- "e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980",
- "a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06"
- ],
- [
- "311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3",
- "66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374"
- ],
- [
- "34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf",
- "9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee"
- ],
- [
- "f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63",
- "4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1"
- ],
- [
- "d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448",
- "fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b"
- ],
- [
- "32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf",
- "5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661"
- ],
- [
- "7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5",
- "8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6"
- ],
- [
- "ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6",
- "8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e"
- ],
- [
- "16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5",
- "5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d"
- ],
- [
- "eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99",
- "f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc"
- ],
- [
- "78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51",
- "f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4"
- ],
- [
- "494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5",
- "42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c"
- ],
- [
- "a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5",
- "204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b"
- ],
- [
- "c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997",
- "4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913"
- ],
- [
- "841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881",
- "73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154"
- ],
- [
- "5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5",
- "39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865"
- ],
- [
- "36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66",
- "d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc"
- ],
- [
- "336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726",
- "ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224"
- ],
- [
- "8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede",
- "6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e"
- ],
- [
- "1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94",
- "60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6"
- ],
- [
- "85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31",
- "3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511"
- ],
- [
- "29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51",
- "b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b"
- ],
- [
- "a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252",
- "ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2"
- ],
- [
- "4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5",
- "cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c"
- ],
- [
- "d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b",
- "6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3"
- ],
- [
- "ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4",
- "322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d"
- ],
- [
- "af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f",
- "6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700"
- ],
- [
- "e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889",
- "2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4"
- ],
- [
- "591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246",
- "b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196"
- ],
- [
- "11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984",
- "998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4"
- ],
- [
- "3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a",
- "b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257"
- ],
- [
- "cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030",
- "bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13"
- ],
- [
- "c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197",
- "6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096"
- ],
- [
- "c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593",
- "c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38"
- ],
- [
- "a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef",
- "21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f"
- ],
- [
- "347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38",
- "60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448"
- ],
- [
- "da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a",
- "49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a"
- ],
- [
- "c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111",
- "5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4"
- ],
- [
- "4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502",
- "7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437"
- ],
- [
- "3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea",
- "be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7"
- ],
- [
- "cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26",
- "8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d"
- ],
- [
- "b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986",
- "39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a"
- ],
- [
- "d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e",
- "62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54"
- ],
- [
- "48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4",
- "25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77"
- ],
- [
- "dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda",
- "ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517"
- ],
- [
- "6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859",
- "cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10"
- ],
- [
- "e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f",
- "f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125"
- ],
- [
- "eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c",
- "6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e"
- ],
- [
- "13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942",
- "fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1"
- ],
- [
- "ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a",
- "1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2"
- ],
- [
- "b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80",
- "5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423"
- ],
- [
- "ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d",
- "438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8"
- ],
- [
- "8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1",
- "cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758"
- ],
- [
- "52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63",
- "c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375"
- ],
- [
- "e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352",
- "6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d"
- ],
- [
- "7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193",
- "ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec"
- ],
- [
- "5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00",
- "9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0"
- ],
- [
- "32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58",
- "ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c"
- ],
- [
- "e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7",
- "d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4"
- ],
- [
- "8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8",
- "c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f"
- ],
- [
- "4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e",
- "67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649"
- ],
- [
- "3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d",
- "cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826"
- ],
- [
- "674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b",
- "299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5"
- ],
- [
- "d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f",
- "f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87"
- ],
- [
- "30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6",
- "462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b"
- ],
- [
- "be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297",
- "62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc"
- ],
- [
- "93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a",
- "7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c"
- ],
- [
- "b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c",
- "ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f"
- ],
- [
- "d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52",
- "4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a"
- ],
- [
- "d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb",
- "bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46"
- ],
- [
- "463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065",
- "bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f"
- ],
- [
- "7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917",
- "603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03"
- ],
- [
- "74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9",
- "cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08"
- ],
- [
- "30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3",
- "553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8"
- ],
- [
- "9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57",
- "712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373"
- ],
- [
- "176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66",
- "ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3"
- ],
- [
- "75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8",
- "9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8"
- ],
- [
- "809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721",
- "9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1"
- ],
- [
- "1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180",
- "4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9"
- ]
- ]
- }
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curves.js
-var require_curves = __commonJS((exports) => {
- var curves = exports;
- var hash = require_hash();
- var curve = require_curve();
- var utils = require_utils2();
- var assert = utils.assert;
- function PresetCurve(options2) {
- if (options2.type === "short")
- this.curve = new curve.short(options2);
- else if (options2.type === "edwards")
- this.curve = new curve.edwards(options2);
- else
- this.curve = new curve.mont(options2);
- this.g = this.curve.g;
- this.n = this.curve.n;
- this.hash = options2.hash;
- assert(this.g.validate(), "Invalid curve");
- assert(this.g.mul(this.n).isInfinity(), "Invalid curve, G*N != O");
- }
- curves.PresetCurve = PresetCurve;
- function defineCurve(name, options2) {
- Object.defineProperty(curves, name, {
- configurable: true,
- enumerable: true,
- get: function() {
- var curve2 = new PresetCurve(options2);
- Object.defineProperty(curves, name, {
- configurable: true,
- enumerable: true,
- value: curve2
- });
- return curve2;
- }
- });
- }
- defineCurve("p192", {
- type: "short",
- prime: "p192",
- p: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff",
- a: "ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc",
- b: "64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1",
- n: "ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831",
- hash: hash.sha256,
- gRed: false,
- g: [
- "188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012",
- "07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"
- ]
- });
- defineCurve("p224", {
- type: "short",
- prime: "p224",
- p: "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001",
- a: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe",
- b: "b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4",
- n: "ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d",
- hash: hash.sha256,
- gRed: false,
- g: [
- "b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21",
- "bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"
- ]
- });
- defineCurve("p256", {
- type: "short",
- prime: null,
- p: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff",
- a: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc",
- b: "5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b",
- n: "ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551",
- hash: hash.sha256,
- gRed: false,
- g: [
- "6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296",
- "4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"
- ]
- });
- defineCurve("p384", {
- type: "short",
- prime: null,
- p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "fffffffe ffffffff 00000000 00000000 ffffffff",
- a: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "fffffffe ffffffff 00000000 00000000 fffffffc",
- b: "b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f " + "5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef",
- n: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 " + "f4372ddf 581a0db2 48b0a77a ecec196a ccc52973",
- hash: hash.sha384,
- gRed: false,
- g: [
- "aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 " + "5502f25d bf55296c 3a545e38 72760ab7",
- "3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 " + "0a60b1ce 1d7e819d 7a431d7c 90ea0e5f"
- ]
- });
- defineCurve("p521", {
- type: "short",
- prime: null,
- p: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff",
- a: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff fffffffc",
- b: "00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b " + "99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd " + "3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00",
- n: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 " + "f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409",
- hash: hash.sha512,
- gRed: false,
- g: [
- "000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 " + "053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 " + "a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66",
- "00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 " + "579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 " + "3fad0761 353c7086 a272c240 88be9476 9fd16650"
- ]
- });
- defineCurve("curve25519", {
- type: "mont",
- prime: "p25519",
- p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",
- a: "76d06",
- b: "1",
- n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",
- hash: hash.sha256,
- gRed: false,
- g: [
- "9"
- ]
- });
- defineCurve("ed25519", {
- type: "edwards",
- prime: "p25519",
- p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",
- a: "-1",
- c: "1",
- d: "52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3",
- n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",
- hash: hash.sha256,
- gRed: false,
- g: [
- "216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a",
- "6666666666666666666666666666666666666666666666666666666666666658"
- ]
- });
- var pre;
- try {
- pre = require_secp256k1();
- } catch (e) {
- pre = undefined;
- }
- defineCurve("secp256k1", {
- type: "short",
- prime: "k256",
- p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f",
- a: "0",
- b: "7",
- n: "ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141",
- h: "1",
- hash: hash.sha256,
- beta: "7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee",
- lambda: "5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72",
- basis: [
- {
- a: "3086d221a7d46bcde86c90e49284eb15",
- b: "-e4437ed6010e88286f547fa90abfe4c3"
- },
- {
- a: "114ca50f7a8e2f3f657c1108d9d44cfd8",
- b: "3086d221a7d46bcde86c90e49284eb15"
- }
- ],
- gRed: false,
- g: [
- "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
- "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
- pre
- ]
- });
-});
-
-// ../eve/node_modules/hmac-drbg/lib/hmac-drbg.js
-var require_hmac_drbg = __commonJS((exports, module) => {
- var hash = require_hash();
- var utils = require_utils();
- var assert = require_minimalistic_assert();
- function HmacDRBG(options2) {
- if (!(this instanceof HmacDRBG))
- return new HmacDRBG(options2);
- this.hash = options2.hash;
- this.predResist = !!options2.predResist;
- this.outLen = this.hash.outSize;
- this.minEntropy = options2.minEntropy || this.hash.hmacStrength;
- this._reseed = null;
- this.reseedInterval = null;
- this.K = null;
- this.V = null;
- var entropy = utils.toArray(options2.entropy, options2.entropyEnc || "hex");
- var nonce = utils.toArray(options2.nonce, options2.nonceEnc || "hex");
- var pers = utils.toArray(options2.pers, options2.persEnc || "hex");
- assert(entropy.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits");
- this._init(entropy, nonce, pers);
- }
- module.exports = HmacDRBG;
- HmacDRBG.prototype._init = function init(entropy, nonce, pers) {
- var seed = entropy.concat(nonce).concat(pers);
- this.K = new Array(this.outLen / 8);
- this.V = new Array(this.outLen / 8);
- for (var i = 0;i < this.V.length; i++) {
- this.K[i] = 0;
- this.V[i] = 1;
- }
- this._update(seed);
- this._reseed = 1;
- this.reseedInterval = 281474976710656;
- };
- HmacDRBG.prototype._hmac = function hmac() {
- return new hash.hmac(this.hash, this.K);
- };
- HmacDRBG.prototype._update = function update(seed) {
- var kmac = this._hmac().update(this.V).update([0]);
- if (seed)
- kmac = kmac.update(seed);
- this.K = kmac.digest();
- this.V = this._hmac().update(this.V).digest();
- if (!seed)
- return;
- this.K = this._hmac().update(this.V).update([1]).update(seed).digest();
- this.V = this._hmac().update(this.V).digest();
- };
- HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) {
- if (typeof entropyEnc !== "string") {
- addEnc = add;
- add = entropyEnc;
- entropyEnc = null;
- }
- entropy = utils.toArray(entropy, entropyEnc);
- add = utils.toArray(add, addEnc);
- assert(entropy.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits");
- this._update(entropy.concat(add || []));
- this._reseed = 1;
- };
- HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) {
- if (this._reseed > this.reseedInterval)
- throw new Error("Reseed is required");
- if (typeof enc !== "string") {
- addEnc = add;
- add = enc;
- enc = null;
- }
- if (add) {
- add = utils.toArray(add, addEnc || "hex");
- this._update(add);
- }
- var temp = [];
- while (temp.length < len) {
- this.V = this._hmac().update(this.V).digest();
- temp = temp.concat(this.V);
- }
- var res = temp.slice(0, len);
- this._update(add);
- this._reseed++;
- return utils.encode(res, enc);
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/ec/key.js
-var require_key = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var assert = utils.assert;
- function KeyPair(ec, options2) {
- this.ec = ec;
- this.priv = null;
- this.pub = null;
- if (options2.priv)
- this._importPrivate(options2.priv, options2.privEnc);
- if (options2.pub)
- this._importPublic(options2.pub, options2.pubEnc);
- }
- module.exports = KeyPair;
- KeyPair.fromPublic = function fromPublic(ec, pub, enc) {
- if (pub instanceof KeyPair)
- return pub;
- return new KeyPair(ec, {
- pub,
- pubEnc: enc
- });
- };
- KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) {
- if (priv instanceof KeyPair)
- return priv;
- return new KeyPair(ec, {
- priv,
- privEnc: enc
- });
- };
- KeyPair.prototype.validate = function validate() {
- var pub = this.getPublic();
- if (pub.isInfinity())
- return { result: false, reason: "Invalid public key" };
- if (!pub.validate())
- return { result: false, reason: "Public key is not a point" };
- if (!pub.mul(this.ec.curve.n).isInfinity())
- return { result: false, reason: "Public key * N != O" };
- return { result: true, reason: null };
- };
- KeyPair.prototype.getPublic = function getPublic(compact, enc) {
- if (typeof compact === "string") {
- enc = compact;
- compact = null;
- }
- if (!this.pub)
- this.pub = this.ec.g.mul(this.priv);
- if (!enc)
- return this.pub;
- return this.pub.encode(enc, compact);
- };
- KeyPair.prototype.getPrivate = function getPrivate(enc) {
- if (enc === "hex")
- return this.priv.toString(16, 2);
- else
- return this.priv;
- };
- KeyPair.prototype._importPrivate = function _importPrivate(key, enc) {
- this.priv = new BN(key, enc || 16);
- this.priv = this.priv.umod(this.ec.curve.n);
- };
- KeyPair.prototype._importPublic = function _importPublic(key, enc) {
- if (key.x || key.y) {
- if (this.ec.curve.type === "mont") {
- assert(key.x, "Need x coordinate");
- } else if (this.ec.curve.type === "short" || this.ec.curve.type === "edwards") {
- assert(key.x && key.y, "Need both x and y coordinate");
- }
- this.pub = this.ec.curve.point(key.x, key.y);
- return;
- }
- this.pub = this.ec.curve.decodePoint(key, enc);
- };
- KeyPair.prototype.derive = function derive(pub) {
- if (!pub.validate()) {
- assert(pub.validate(), "public point not validated");
- }
- return pub.mul(this.priv).getX();
- };
- KeyPair.prototype.sign = function sign(msg, enc, options2) {
- return this.ec.sign(msg, this, enc, options2);
- };
- KeyPair.prototype.verify = function verify(msg, signature, options2) {
- return this.ec.verify(msg, signature, this, undefined, options2);
- };
- KeyPair.prototype.inspect = function inspect() {
- return "";
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/ec/signature.js
-var require_signature = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var assert = utils.assert;
- function Signature(options2, enc) {
- if (options2 instanceof Signature)
- return options2;
- if (this._importDER(options2, enc))
- return;
- assert(options2.r && options2.s, "Signature without r or s");
- this.r = new BN(options2.r, 16);
- this.s = new BN(options2.s, 16);
- if (options2.recoveryParam === undefined)
- this.recoveryParam = null;
- else
- this.recoveryParam = options2.recoveryParam;
- }
- module.exports = Signature;
- function Position() {
- this.place = 0;
- }
- function getLength(buf, p) {
- var initial = buf[p.place++];
- if (!(initial & 128)) {
- return initial;
- }
- var octetLen = initial & 15;
- if (octetLen === 0 || octetLen > 4) {
- return false;
- }
- if (buf[p.place] === 0) {
- return false;
- }
- var val = 0;
- for (var i = 0, off = p.place;i < octetLen; i++, off++) {
- val <<= 8;
- val |= buf[off];
- val >>>= 0;
- }
- if (val <= 127) {
- return false;
- }
- p.place = off;
- return val;
- }
- function rmPadding(buf) {
- var i = 0;
- var len = buf.length - 1;
- while (!buf[i] && !(buf[i + 1] & 128) && i < len) {
- i++;
- }
- if (i === 0) {
- return buf;
- }
- return buf.slice(i);
- }
- Signature.prototype._importDER = function _importDER(data, enc) {
- data = utils.toArray(data, enc);
- var p = new Position;
- if (data[p.place++] !== 48) {
- return false;
- }
- var len = getLength(data, p);
- if (len === false) {
- return false;
- }
- if (len + p.place !== data.length) {
- return false;
- }
- if (data[p.place++] !== 2) {
- return false;
- }
- var rlen = getLength(data, p);
- if (rlen === false) {
- return false;
- }
- if ((data[p.place] & 128) !== 0) {
- return false;
- }
- var r = data.slice(p.place, rlen + p.place);
- p.place += rlen;
- if (data[p.place++] !== 2) {
- return false;
- }
- var slen = getLength(data, p);
- if (slen === false) {
- return false;
- }
- if (data.length !== slen + p.place) {
- return false;
- }
- if ((data[p.place] & 128) !== 0) {
- return false;
- }
- var s = data.slice(p.place, slen + p.place);
- if (r[0] === 0) {
- if (r[1] & 128) {
- r = r.slice(1);
- } else {
- return false;
- }
- }
- if (s[0] === 0) {
- if (s[1] & 128) {
- s = s.slice(1);
- } else {
- return false;
- }
- }
- this.r = new BN(r);
- this.s = new BN(s);
- this.recoveryParam = null;
- return true;
- };
- function constructLength(arr, len) {
- if (len < 128) {
- arr.push(len);
- return;
- }
- var octets = 1 + (Math.log(len) / Math.LN2 >>> 3);
- arr.push(octets | 128);
- while (--octets) {
- arr.push(len >>> (octets << 3) & 255);
- }
- arr.push(len);
- }
- Signature.prototype.toDER = function toDER(enc) {
- var r = this.r.toArray();
- var s = this.s.toArray();
- if (r[0] & 128)
- r = [0].concat(r);
- if (s[0] & 128)
- s = [0].concat(s);
- r = rmPadding(r);
- s = rmPadding(s);
- while (!s[0] && !(s[1] & 128)) {
- s = s.slice(1);
- }
- var arr = [2];
- constructLength(arr, r.length);
- arr = arr.concat(r);
- arr.push(2);
- constructLength(arr, s.length);
- var backHalf = arr.concat(s);
- var res = [48];
- constructLength(res, backHalf.length);
- res = res.concat(backHalf);
- return utils.encode(res, enc);
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/ec/index.js
-var require_ec = __commonJS((exports, module) => {
- var BN = require_bn();
- var HmacDRBG = require_hmac_drbg();
- var utils = require_utils2();
- var curves = require_curves();
- var rand = require_brorand();
- var assert = utils.assert;
- var KeyPair = require_key();
- var Signature = require_signature();
- function EC(options2) {
- if (!(this instanceof EC))
- return new EC(options2);
- if (typeof options2 === "string") {
- assert(Object.prototype.hasOwnProperty.call(curves, options2), "Unknown curve " + options2);
- options2 = curves[options2];
- }
- if (options2 instanceof curves.PresetCurve)
- options2 = { curve: options2 };
- this.curve = options2.curve.curve;
- this.n = this.curve.n;
- this.nh = this.n.ushrn(1);
- this.g = this.curve.g;
- this.g = options2.curve.g;
- this.g.precompute(options2.curve.n.bitLength() + 1);
- this.hash = options2.hash || options2.curve.hash;
- }
- module.exports = EC;
- EC.prototype.keyPair = function keyPair(options2) {
- return new KeyPair(this, options2);
- };
- EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) {
- return KeyPair.fromPrivate(this, priv, enc);
- };
- EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) {
- return KeyPair.fromPublic(this, pub, enc);
- };
- EC.prototype.genKeyPair = function genKeyPair(options2) {
- if (!options2)
- options2 = {};
- var drbg = new HmacDRBG({
- hash: this.hash,
- pers: options2.pers,
- persEnc: options2.persEnc || "utf8",
- entropy: options2.entropy || rand(this.hash.hmacStrength),
- entropyEnc: options2.entropy && options2.entropyEnc || "utf8",
- nonce: this.n.toArray()
- });
- var bytes = this.n.byteLength();
- var ns2 = this.n.sub(new BN(2));
- for (;; ) {
- var priv = new BN(drbg.generate(bytes));
- if (priv.cmp(ns2) > 0)
- continue;
- priv.iaddn(1);
- return this.keyFromPrivate(priv);
- }
- };
- EC.prototype._truncateToN = function _truncateToN(msg, truncOnly, bitLength) {
- var byteLength;
- if (BN.isBN(msg) || typeof msg === "number") {
- msg = new BN(msg, 16);
- byteLength = msg.byteLength();
- } else if (typeof msg === "object") {
- byteLength = msg.length;
- msg = new BN(msg, 16);
- } else {
- var str = msg.toString();
- byteLength = str.length + 1 >>> 1;
- msg = new BN(str, 16);
- }
- if (typeof bitLength !== "number") {
- bitLength = byteLength * 8;
- }
- var delta = bitLength - this.n.bitLength();
- if (delta > 0)
- msg = msg.ushrn(delta);
- if (!truncOnly && msg.cmp(this.n) >= 0)
- return msg.sub(this.n);
- else
- return msg;
- };
- EC.prototype.sign = function sign(msg, key, enc, options2) {
- if (typeof enc === "object") {
- options2 = enc;
- enc = null;
- }
- if (!options2)
- options2 = {};
- if (typeof msg !== "string" && typeof msg !== "number" && !BN.isBN(msg)) {
- assert(typeof msg === "object" && msg && typeof msg.length === "number", "Expected message to be an array-like, a hex string, or a BN instance");
- assert(msg.length >>> 0 === msg.length);
- for (var i = 0;i < msg.length; i++)
- assert((msg[i] & 255) === msg[i]);
- }
- key = this.keyFromPrivate(key, enc);
- msg = this._truncateToN(msg, false, options2.msgBitLength);
- assert(!msg.isNeg(), "Can not sign a negative message");
- var bytes = this.n.byteLength();
- var bkey = key.getPrivate().toArray("be", bytes);
- var nonce = msg.toArray("be", bytes);
- assert(new BN(nonce).eq(msg), "Can not sign message");
- var drbg = new HmacDRBG({
- hash: this.hash,
- entropy: bkey,
- nonce,
- pers: options2.pers,
- persEnc: options2.persEnc || "utf8"
- });
- var ns1 = this.n.sub(new BN(1));
- for (var iter = 0;; iter++) {
- var k = options2.k ? options2.k(iter) : new BN(drbg.generate(this.n.byteLength()));
- k = this._truncateToN(k, true);
- if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0)
- continue;
- var kp = this.g.mul(k);
- if (kp.isInfinity())
- continue;
- var kpX = kp.getX();
- var r = kpX.umod(this.n);
- if (r.cmpn(0) === 0)
- continue;
- var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg));
- s = s.umod(this.n);
- if (s.cmpn(0) === 0)
- continue;
- var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | (kpX.cmp(r) !== 0 ? 2 : 0);
- if (options2.canonical && s.cmp(this.nh) > 0) {
- s = this.n.sub(s);
- recoveryParam ^= 1;
- }
- return new Signature({ r, s, recoveryParam });
- }
- };
- EC.prototype.verify = function verify(msg, signature, key, enc, options2) {
- if (!options2)
- options2 = {};
- msg = this._truncateToN(msg, false, options2.msgBitLength);
- key = this.keyFromPublic(key, enc);
- signature = new Signature(signature, "hex");
- var r = signature.r;
- var s = signature.s;
- if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0)
- return false;
- if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0)
- return false;
- var sinv = s.invm(this.n);
- var u1 = sinv.mul(msg).umod(this.n);
- var u2 = sinv.mul(r).umod(this.n);
- var p;
- if (!this.curve._maxwellTrick) {
- p = this.g.mulAdd(u1, key.getPublic(), u2);
- if (p.isInfinity())
- return false;
- return p.getX().umod(this.n).cmp(r) === 0;
- }
- p = this.g.jmulAdd(u1, key.getPublic(), u2);
- if (p.isInfinity())
- return false;
- return p.eqXToP(r);
- };
- EC.prototype.recoverPubKey = function(msg, signature, j, enc) {
- assert((3 & j) === j, "The recovery param is more than two bits");
- signature = new Signature(signature, enc);
- var n = this.n;
- var e = new BN(msg);
- var r = signature.r;
- var s = signature.s;
- var isYOdd = j & 1;
- var isSecondKey = j >> 1;
- if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey)
- throw new Error("Unable to find sencond key candinate");
- if (isSecondKey)
- r = this.curve.pointFromX(r.add(this.curve.n), isYOdd);
- else
- r = this.curve.pointFromX(r, isYOdd);
- var rInv = signature.r.invm(n);
- var s1 = n.sub(e).mul(rInv).umod(n);
- var s2 = s.mul(rInv).umod(n);
- return this.g.mulAdd(s1, r, s2);
- };
- EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) {
- signature = new Signature(signature, enc);
- if (signature.recoveryParam !== null)
- return signature.recoveryParam;
- for (var i = 0;i < 4; i++) {
- var Qprime;
- try {
- Qprime = this.recoverPubKey(e, signature, i);
- } catch (e2) {
- continue;
- }
- if (Qprime.eq(Q))
- return i;
- }
- throw new Error("Unable to find valid recovery factor");
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/eddsa/key.js
-var require_key2 = __commonJS((exports, module) => {
- var utils = require_utils2();
- var assert = utils.assert;
- var parseBytes = utils.parseBytes;
- var cachedProperty = utils.cachedProperty;
- function KeyPair(eddsa, params) {
- this.eddsa = eddsa;
- this._secret = parseBytes(params.secret);
- if (eddsa.isPoint(params.pub))
- this._pub = params.pub;
- else
- this._pubBytes = parseBytes(params.pub);
- }
- KeyPair.fromPublic = function fromPublic(eddsa, pub) {
- if (pub instanceof KeyPair)
- return pub;
- return new KeyPair(eddsa, { pub });
- };
- KeyPair.fromSecret = function fromSecret(eddsa, secret) {
- if (secret instanceof KeyPair)
- return secret;
- return new KeyPair(eddsa, { secret });
- };
- KeyPair.prototype.secret = function secret() {
- return this._secret;
- };
- cachedProperty(KeyPair, "pubBytes", function pubBytes() {
- return this.eddsa.encodePoint(this.pub());
- });
- cachedProperty(KeyPair, "pub", function pub() {
- if (this._pubBytes)
- return this.eddsa.decodePoint(this._pubBytes);
- return this.eddsa.g.mul(this.priv());
- });
- cachedProperty(KeyPair, "privBytes", function privBytes() {
- var eddsa = this.eddsa;
- var hash = this.hash();
- var lastIx = eddsa.encodingLength - 1;
- var a = hash.slice(0, eddsa.encodingLength);
- a[0] &= 248;
- a[lastIx] &= 127;
- a[lastIx] |= 64;
- return a;
- });
- cachedProperty(KeyPair, "priv", function priv() {
- return this.eddsa.decodeInt(this.privBytes());
- });
- cachedProperty(KeyPair, "hash", function hash() {
- return this.eddsa.hash().update(this.secret()).digest();
- });
- cachedProperty(KeyPair, "messagePrefix", function messagePrefix() {
- return this.hash().slice(this.eddsa.encodingLength);
- });
- KeyPair.prototype.sign = function sign(message) {
- assert(this._secret, "KeyPair can only verify");
- return this.eddsa.sign(message, this);
- };
- KeyPair.prototype.verify = function verify(message, sig) {
- return this.eddsa.verify(message, sig, this);
- };
- KeyPair.prototype.getSecret = function getSecret(enc) {
- assert(this._secret, "KeyPair is public only");
- return utils.encode(this.secret(), enc);
- };
- KeyPair.prototype.getPublic = function getPublic(enc) {
- return utils.encode(this.pubBytes(), enc);
- };
- module.exports = KeyPair;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/eddsa/signature.js
-var require_signature2 = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var assert = utils.assert;
- var cachedProperty = utils.cachedProperty;
- var parseBytes = utils.parseBytes;
- function Signature(eddsa, sig) {
- this.eddsa = eddsa;
- if (typeof sig !== "object")
- sig = parseBytes(sig);
- if (Array.isArray(sig)) {
- assert(sig.length === eddsa.encodingLength * 2, "Signature has invalid size");
- sig = {
- R: sig.slice(0, eddsa.encodingLength),
- S: sig.slice(eddsa.encodingLength)
- };
- }
- assert(sig.R && sig.S, "Signature without R or S");
- if (eddsa.isPoint(sig.R))
- this._R = sig.R;
- if (sig.S instanceof BN)
- this._S = sig.S;
- this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded;
- this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded;
- }
- cachedProperty(Signature, "S", function S() {
- return this.eddsa.decodeInt(this.Sencoded());
- });
- cachedProperty(Signature, "R", function R() {
- return this.eddsa.decodePoint(this.Rencoded());
- });
- cachedProperty(Signature, "Rencoded", function Rencoded() {
- return this.eddsa.encodePoint(this.R());
- });
- cachedProperty(Signature, "Sencoded", function Sencoded() {
- return this.eddsa.encodeInt(this.S());
- });
- Signature.prototype.toBytes = function toBytes() {
- return this.Rencoded().concat(this.Sencoded());
- };
- Signature.prototype.toHex = function toHex() {
- return utils.encode(this.toBytes(), "hex").toUpperCase();
- };
- module.exports = Signature;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/eddsa/index.js
-var require_eddsa = __commonJS((exports, module) => {
- var hash = require_hash();
- var curves = require_curves();
- var utils = require_utils2();
- var assert = utils.assert;
- var parseBytes = utils.parseBytes;
- var KeyPair = require_key2();
- var Signature = require_signature2();
- function EDDSA(curve) {
- assert(curve === "ed25519", "only tested with ed25519 so far");
- if (!(this instanceof EDDSA))
- return new EDDSA(curve);
- curve = curves[curve].curve;
- this.curve = curve;
- this.g = curve.g;
- this.g.precompute(curve.n.bitLength() + 1);
- this.pointClass = curve.point().constructor;
- this.encodingLength = Math.ceil(curve.n.bitLength() / 8);
- this.hash = hash.sha512;
- }
- module.exports = EDDSA;
- EDDSA.prototype.sign = function sign(message, secret) {
- message = parseBytes(message);
- var key = this.keyFromSecret(secret);
- var r = this.hashInt(key.messagePrefix(), message);
- var R = this.g.mul(r);
- var Rencoded = this.encodePoint(R);
- var s_ = this.hashInt(Rencoded, key.pubBytes(), message).mul(key.priv());
- var S = r.add(s_).umod(this.curve.n);
- return this.makeSignature({ R, S, Rencoded });
- };
- EDDSA.prototype.verify = function verify(message, sig, pub) {
- message = parseBytes(message);
- sig = this.makeSignature(sig);
- if (sig.S().gte(sig.eddsa.curve.n) || sig.S().isNeg()) {
- return false;
- }
- var key = this.keyFromPublic(pub);
- var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message);
- var SG = this.g.mul(sig.S());
- var RplusAh = sig.R().add(key.pub().mul(h));
- return RplusAh.eq(SG);
- };
- EDDSA.prototype.hashInt = function hashInt() {
- var hash2 = this.hash();
- for (var i = 0;i < arguments.length; i++)
- hash2.update(arguments[i]);
- return utils.intFromLE(hash2.digest()).umod(this.curve.n);
- };
- EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) {
- return KeyPair.fromPublic(this, pub);
- };
- EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) {
- return KeyPair.fromSecret(this, secret);
- };
- EDDSA.prototype.makeSignature = function makeSignature(sig) {
- if (sig instanceof Signature)
- return sig;
- return new Signature(this, sig);
- };
- EDDSA.prototype.encodePoint = function encodePoint(point) {
- var enc = point.getY().toArray("le", this.encodingLength);
- enc[this.encodingLength - 1] |= point.getX().isOdd() ? 128 : 0;
- return enc;
- };
- EDDSA.prototype.decodePoint = function decodePoint(bytes) {
- bytes = utils.parseBytes(bytes);
- var lastIx = bytes.length - 1;
- var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~128);
- var xIsOdd = (bytes[lastIx] & 128) !== 0;
- var y = utils.intFromLE(normed);
- return this.curve.pointFromY(y, xIsOdd);
- };
- EDDSA.prototype.encodeInt = function encodeInt(num) {
- return num.toArray("le", this.encodingLength);
- };
- EDDSA.prototype.decodeInt = function decodeInt(bytes) {
- return utils.intFromLE(bytes);
- };
- EDDSA.prototype.isPoint = function isPoint(val) {
- return val instanceof this.pointClass;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic.js
-var require_elliptic = __commonJS((exports) => {
- var elliptic = exports;
- elliptic.version = require_package().version;
- elliptic.utils = require_utils2();
- elliptic.rand = require_brorand();
- elliptic.curve = require_curve();
- elliptic.curves = require_curves();
- elliptic.ec = require_ec();
- elliptic.eddsa = require_eddsa();
-});
-
-// ../eve/node_modules/jwk-to-pem/src/b64-to-bn.js
-var require_b64_to_bn = __commonJS((exports, module) => {
- var BN = require_asn1().bignum;
- var Buffer2 = require_safe_buffer().Buffer;
- module.exports = function base64ToBigNum(val, zero) {
- var buf = Buffer2.from(val, "base64");
- var bn = val = new BN(buf, 10, "be").iabs();
- if (zero) {
- buf.fill(0);
- }
- return bn;
- };
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/algorithm-identifier.js
-var require_algorithm_identifier = __commonJS((exports, module) => {
- module.exports = require_asn1().define("AlgorithmIdentifer", function() {
- this.seq().obj(this.key("algorithm").objid(), this.key("parameters").optional().any());
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/public-key-info.js
-var require_public_key_info = __commonJS((exports, module) => {
- var AlgorithmIdentifier = require_algorithm_identifier();
- module.exports = require_asn1().define("PublicKeyInfo", function() {
- this.seq().obj(this.key("algorithm").use(AlgorithmIdentifier), this.key("PublicKey").bitstr());
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/version.js
-var require_version = __commonJS((exports, module) => {
- module.exports = require_asn1().define("Version", function() {
- this.int();
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/private-key-info.js
-var require_private_key_info = __commonJS((exports, module) => {
- var AlgorithmIdentifier = require_algorithm_identifier();
- var Version = require_version();
- module.exports = require_asn1().define("PrivateKeyInfo", function() {
- this.seq().obj(this.key("version").use(Version), this.key("privateKeyAlgorithm").use(AlgorithmIdentifier), this.key("privateKey").octstr(), this.key("attributes").optional().any());
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/ec.js
-var require_ec2 = __commonJS((exports, module) => {
- var asn1 = require_asn1();
- var Buffer2 = require_safe_buffer().Buffer;
- var EC = require_elliptic().ec;
- var b64ToBn = require_b64_to_bn();
- var PublicKeyInfo = require_public_key_info();
- var PrivateKeyInfo = require_private_key_info();
- var Version = require_version();
- var ECParameters = asn1.define("ECParameters", function() {
- this.choice({
- namedCurve: this.objid()
- });
- });
- var ecPrivkeyVer1 = 1;
- var ECPrivateKey = asn1.define("ECPrivateKey", function() {
- this.seq().obj(this.key("version").use(Version), this.key("privateKey").octstr(), this.key("parameters").explicit(0).optional().any(), this.key("publicKey").explicit(1).optional().bitstr());
- });
- var curves = {
- "P-256": "p256",
- "P-384": "p384",
- "P-521": "p521"
- };
- var oids = {
- "P-256": [1, 2, 840, 10045, 3, 1, 7],
- "P-384": [1, 3, 132, 0, 34],
- "P-521": [1, 3, 132, 0, 35]
- };
- var parameters = {};
- var algorithms = {};
- Object.keys(oids).forEach(function(crv) {
- parameters[crv] = ECParameters.encode({
- type: "namedCurve",
- value: oids[crv]
- }, "der");
- algorithms[crv] = {
- algorithm: [1, 2, 840, 10045, 2, 1],
- parameters: parameters[crv]
- };
- });
- oids = null;
- function ecJwkToBuffer(jwk, opts) {
- if (typeof jwk.crv !== "string") {
- throw new TypeError('Expected "jwk.crv" to be a String');
- }
- var hasD = typeof jwk.d === "string";
- var xyTypes = hasD ? ["undefined", "string"] : ["string"];
- if (xyTypes.indexOf(typeof jwk.x) === -1) {
- throw new TypeError('Expected "jwk.x" to be a String');
- }
- if (xyTypes.indexOf(typeof jwk.y) === -1) {
- throw new TypeError('Expected "jwk.y" to be a String');
- }
- if (opts.private && !hasD) {
- throw new TypeError('Expected "jwk.d" to be a String');
- }
- var curveName = curves[jwk.crv];
- if (!curveName) {
- throw new Error('Unsupported curve "' + jwk.crv + '"');
- }
- var curve = new EC(curveName);
- var key = {};
- var hasPub = jwk.x && jwk.y;
- if (hasPub) {
- key.pub = {
- x: b64ToBn(jwk.x, false),
- y: b64ToBn(jwk.y, false)
- };
- }
- if (opts.private || !hasPub) {
- key.priv = b64ToBn(jwk.d, true);
- }
- key = curve.keyPair(key);
- var keyValidation = key.validate();
- if (!keyValidation.result) {
- throw new Error('Invalid key for curve: "' + keyValidation.reason + '"');
- }
- var result = keyToPem(jwk.crv, key, opts);
- return result;
- }
- function keyToPem(crv, key, opts) {
- var compact = false;
- var publicKey = key.getPublic(compact, "hex");
- publicKey = Buffer2.from(publicKey, "hex");
- publicKey = {
- unused: 0,
- data: publicKey
- };
- var result;
- if (opts.private) {
- var privateKey = key.getPrivate("hex");
- privateKey = Buffer2.from(privateKey, "hex");
- result = PrivateKeyInfo.encode({
- version: 0,
- privateKeyAlgorithm: algorithms[crv],
- privateKey: ECPrivateKey.encode({
- version: ecPrivkeyVer1,
- privateKey,
- parameters: parameters[crv],
- publicKey
- }, "der")
- }, "pem", {
- label: "PRIVATE KEY"
- });
- privateKey.fill(0);
- } else {
- result = PublicKeyInfo.encode({
- algorithm: algorithms[crv],
- PublicKey: publicKey
- }, "pem", {
- label: "PUBLIC KEY"
- });
- }
- if (result.slice(-1) !== `
-`) {
- result += `
-`;
- }
- return result;
- }
- module.exports = ecJwkToBuffer;
-});
-
-// ../eve/node_modules/jwk-to-pem/src/rsa.js
-var require_rsa = __commonJS((exports, module) => {
- var asn1 = require_asn1();
- var b64ToBn = require_b64_to_bn();
- var PublicKeyInfo = require_public_key_info();
- var PrivateKeyInfo = require_private_key_info();
- var Version = require_version();
- var RSAPrivateKey = asn1.define("RSAPrivateKey", function() {
- this.seq().obj(this.key("version").use(Version), this.key("modulus").int(), this.key("publicExponent").int(), this.key("privateExponent").int(), this.key("prime1").int(), this.key("prime2").int(), this.key("exponent1").int(), this.key("exponent2").int(), this.key("coefficient").int());
- });
- var RSAPublicKey = asn1.define("RSAPublicKey", function() {
- this.seq().obj(this.key("modulus").int(), this.key("publicExponent").int());
- });
- var algorithm = {
- algorithm: [1, 2, 840, 113549, 1, 1, 1],
- parameters: [5, 0]
- };
- function rsaJwkToBuffer(jwk, opts) {
- if (typeof jwk.e !== "string") {
- throw new TypeError('Expected "jwk.e" to be a String');
- }
- if (typeof jwk.n !== "string") {
- throw new TypeError('Expected "jwk.n" to be a String');
- }
- if (opts.private) {
- if (typeof jwk.d !== "string") {
- throw new TypeError('Expected "jwk.d" to be a String');
- }
- if (typeof jwk.p !== "string") {
- throw new TypeError('Expected "jwk.p" to be a String');
- }
- if (typeof jwk.q !== "string") {
- throw new TypeError('Expected "jwk.q" to be a String');
- }
- if (typeof jwk.dp !== "string") {
- throw new TypeError('Expected "jwk.dp" to be a String');
- }
- if (typeof jwk.dq !== "string") {
- throw new TypeError('Expected "jwk.dq" to be a String');
- }
- if (typeof jwk.qi !== "string") {
- throw new TypeError('Expected "jwk.qi" to be a String');
- }
- }
- var pem;
- if (opts.private) {
- pem = PrivateKeyInfo.encode({
- version: 0,
- privateKeyAlgorithm: algorithm,
- privateKey: RSAPrivateKey.encode({
- version: 0,
- modulus: b64ToBn(jwk.n, false),
- publicExponent: b64ToBn(jwk.e, false),
- privateExponent: b64ToBn(jwk.d, true),
- prime1: b64ToBn(jwk.p, true),
- prime2: b64ToBn(jwk.q, true),
- exponent1: b64ToBn(jwk.dp, true),
- exponent2: b64ToBn(jwk.dq, true),
- coefficient: b64ToBn(jwk.qi, true)
- }, "der")
- }, "pem", {
- label: "PRIVATE KEY"
- });
- } else {
- pem = PublicKeyInfo.encode({
- algorithm,
- PublicKey: {
- unused: 0,
- data: RSAPublicKey.encode({
- modulus: b64ToBn(jwk.n, false),
- publicExponent: b64ToBn(jwk.e, false)
- }, "der")
- }
- }, "pem", {
- label: "PUBLIC KEY"
- });
- }
- if (pem.slice(-1) !== `
-`) {
- pem += `
-`;
- }
- return pem;
- }
- module.exports = rsaJwkToBuffer;
-});
-
-// ../eve/node_modules/jwk-to-pem/src/jwk-to-pem.js
-var require_jwk_to_pem = __commonJS((exports, module) => {
- var ec = require_ec2();
- var rsa = require_rsa();
- function jwkToBuffer(jwk, opts) {
- if (typeof jwk !== "object" || jwk === null) {
- throw new TypeError('Expected "jwk" to be an Object');
- }
- var kty = jwk.kty;
- if (typeof kty !== "string") {
- throw new TypeError('Expected "jwk.kty" to be a String');
- }
- opts = opts || {};
- opts.private = opts.private === true;
- switch (kty) {
- case "EC": {
- return ec(jwk, opts);
- }
- case "RSA": {
- return rsa(jwk, opts);
- }
- default: {
- throw new Error('Unsupported key type "' + kty + '"');
- }
- }
- }
- module.exports = jwkToBuffer;
-});
-
-// src/utils/cookies.ts
-function getCookies(headers) {
- if (!headers)
- return {};
- const cookieHeader = headers.get("Cookie");
- const cookies = {};
- if (cookieHeader === null)
- return {};
- for (const kv of cookieHeader.split(";")) {
- const [cookieKey, ...cookieVal] = kv.split("=");
- const key = cookieKey.trim();
- cookies[key] = cookieVal.join("=");
- }
- return cookies;
-}
-function setCookie(response, key, value, maxAge) {
- response.headers.append("Set-Cookie", `${key}=${value}${maxAge ? "; Path=/; Max-Age=" + maxAge : ""}`);
-}
-function removeCookie(response, key) {
- response.headers.append("Set-Cookie", `${key}=""; Path=/; Max-Age=-1;`);
-}
-// ../eve/dist/_virtual/rolldown_runtime.js
-var __defProp2 = Object.defineProperty;
-var __export = (target, all) => {
- for (var name in all)
- __defProp2(target, name, {
- get: all[name],
- enumerable: true
- });
-};
-
-// ../eve/node_modules/drizzle-orm/entity.js
-var entityKind = Symbol.for("drizzle:entityKind");
-var hasOwnEntityKind = Symbol.for("drizzle:hasOwnEntityKind");
-function is(value, type) {
- if (!value || typeof value !== "object") {
- return false;
- }
- if (value instanceof type) {
- return true;
- }
- if (!Object.prototype.hasOwnProperty.call(type, entityKind)) {
- throw new Error(`Class "${type.name ?? ""}" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`);
- }
- let cls = Object.getPrototypeOf(value).constructor;
- if (cls) {
- while (cls) {
- if (entityKind in cls && cls[entityKind] === type[entityKind]) {
- return true;
- }
- cls = Object.getPrototypeOf(cls);
- }
- }
- return false;
-}
-
-// ../eve/node_modules/drizzle-orm/column.js
-class Column {
- constructor(table, config) {
- this.table = table;
- this.config = config;
- this.name = config.name;
- this.keyAsName = config.keyAsName;
- this.notNull = config.notNull;
- this.default = config.default;
- this.defaultFn = config.defaultFn;
- this.onUpdateFn = config.onUpdateFn;
- this.hasDefault = config.hasDefault;
- this.primary = config.primaryKey;
- this.isUnique = config.isUnique;
- this.uniqueName = config.uniqueName;
- this.uniqueType = config.uniqueType;
- this.dataType = config.dataType;
- this.columnType = config.columnType;
- this.generated = config.generated;
- this.generatedIdentity = config.generatedIdentity;
- }
- static [entityKind] = "Column";
- name;
- keyAsName;
- primary;
- notNull;
- default;
- defaultFn;
- onUpdateFn;
- hasDefault;
- isUnique;
- uniqueName;
- uniqueType;
- dataType;
- columnType;
- enumValues = undefined;
- generated = undefined;
- generatedIdentity = undefined;
- config;
- mapFromDriverValue(value) {
- return value;
- }
- mapToDriverValue(value) {
- return value;
- }
- shouldDisableInsert() {
- return this.config.generated !== undefined && this.config.generated.type !== "byDefault";
- }
-}
-
-// ../eve/node_modules/drizzle-orm/column-builder.js
-class ColumnBuilder {
- static [entityKind] = "ColumnBuilder";
- config;
- constructor(name, dataType, columnType) {
- this.config = {
- name,
- keyAsName: name === "",
- notNull: false,
- default: undefined,
- hasDefault: false,
- primaryKey: false,
- isUnique: false,
- uniqueName: undefined,
- uniqueType: undefined,
- dataType,
- columnType,
- generated: undefined
- };
- }
- $type() {
- return this;
- }
- notNull() {
- this.config.notNull = true;
- return this;
- }
- default(value) {
- this.config.default = value;
- this.config.hasDefault = true;
- return this;
- }
- $defaultFn(fn) {
- this.config.defaultFn = fn;
- this.config.hasDefault = true;
- return this;
- }
- $default = this.$defaultFn;
- $onUpdateFn(fn) {
- this.config.onUpdateFn = fn;
- this.config.hasDefault = true;
- return this;
- }
- $onUpdate = this.$onUpdateFn;
- primaryKey() {
- this.config.primaryKey = true;
- this.config.notNull = true;
- return this;
- }
- setName(name) {
- if (this.config.name !== "")
- return;
- this.config.name = name;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/table.utils.js
-var TableName = Symbol.for("drizzle:Name");
-
-// ../eve/node_modules/drizzle-orm/tracing-utils.js
-function iife(fn, ...args) {
- return fn(...args);
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/unique-constraint.js
-function uniqueKeyName(table, columns) {
- return `${table[TableName]}_${columns.join("_")}_unique`;
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/columns/common.js
-class PgColumn extends Column {
- constructor(table, config) {
- if (!config.uniqueName) {
- config.uniqueName = uniqueKeyName(table, [config.name]);
- }
- super(table, config);
- this.table = table;
- }
- static [entityKind] = "PgColumn";
-}
-
-class ExtraConfigColumn extends PgColumn {
- static [entityKind] = "ExtraConfigColumn";
- getSQLType() {
- return this.getSQLType();
- }
- indexConfig = {
- order: this.config.order ?? "asc",
- nulls: this.config.nulls ?? "last",
- opClass: this.config.opClass
- };
- defaultConfig = {
- order: "asc",
- nulls: "last",
- opClass: undefined
- };
- asc() {
- this.indexConfig.order = "asc";
- return this;
- }
- desc() {
- this.indexConfig.order = "desc";
- return this;
- }
- nullsFirst() {
- this.indexConfig.nulls = "first";
- return this;
- }
- nullsLast() {
- this.indexConfig.nulls = "last";
- return this;
- }
- op(opClass) {
- this.indexConfig.opClass = opClass;
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/columns/enum.js
-class PgEnumObjectColumn extends PgColumn {
- static [entityKind] = "PgEnumObjectColumn";
- enum;
- enumValues = this.config.enum.enumValues;
- constructor(table, config) {
- super(table, config);
- this.enum = config.enum;
- }
- getSQLType() {
- return this.enum.enumName;
- }
-}
-var isPgEnumSym = Symbol.for("drizzle:isPgEnum");
-function isPgEnum(obj) {
- return !!obj && typeof obj === "function" && isPgEnumSym in obj && obj[isPgEnumSym] === true;
-}
-class PgEnumColumn extends PgColumn {
- static [entityKind] = "PgEnumColumn";
- enum = this.config.enum;
- enumValues = this.config.enum.enumValues;
- constructor(table, config) {
- super(table, config);
- this.enum = config.enum;
- }
- getSQLType() {
- return this.enum.enumName;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/subquery.js
-class Subquery {
- static [entityKind] = "Subquery";
- constructor(sql, fields, alias, isWith = false, usedTables = []) {
- this._ = {
- brand: "Subquery",
- sql,
- selectedFields: fields,
- alias,
- isWith,
- usedTables
- };
- }
-}
-
-class WithSubquery extends Subquery {
- static [entityKind] = "WithSubquery";
-}
-
-// ../eve/node_modules/drizzle-orm/version.js
-var version = "0.44.5";
-
-// ../eve/node_modules/drizzle-orm/tracing.js
-var otel;
-var rawTracer;
-var tracer = {
- startActiveSpan(name, fn) {
- if (!otel) {
- return fn();
- }
- if (!rawTracer) {
- rawTracer = otel.trace.getTracer("drizzle-orm", version);
- }
- return iife((otel2, rawTracer2) => rawTracer2.startActiveSpan(name, (span) => {
- try {
- return fn(span);
- } catch (e) {
- span.setStatus({
- code: otel2.SpanStatusCode.ERROR,
- message: e instanceof Error ? e.message : "Unknown error"
- });
- throw e;
- } finally {
- span.end();
- }
- }), otel, rawTracer);
- }
-};
-
-// ../eve/node_modules/drizzle-orm/view-common.js
-var ViewBaseConfig = Symbol.for("drizzle:ViewBaseConfig");
-
-// ../eve/node_modules/drizzle-orm/table.js
-var Schema = Symbol.for("drizzle:Schema");
-var Columns = Symbol.for("drizzle:Columns");
-var ExtraConfigColumns = Symbol.for("drizzle:ExtraConfigColumns");
-var OriginalName = Symbol.for("drizzle:OriginalName");
-var BaseName = Symbol.for("drizzle:BaseName");
-var IsAlias = Symbol.for("drizzle:IsAlias");
-var ExtraConfigBuilder = Symbol.for("drizzle:ExtraConfigBuilder");
-var IsDrizzleTable = Symbol.for("drizzle:IsDrizzleTable");
-
-class Table {
- static [entityKind] = "Table";
- static Symbol = {
- Name: TableName,
- Schema,
- OriginalName,
- Columns,
- ExtraConfigColumns,
- BaseName,
- IsAlias,
- ExtraConfigBuilder
- };
- [TableName];
- [OriginalName];
- [Schema];
- [Columns];
- [ExtraConfigColumns];
- [BaseName];
- [IsAlias] = false;
- [IsDrizzleTable] = true;
- [ExtraConfigBuilder] = undefined;
- constructor(name, schema, baseName) {
- this[TableName] = this[OriginalName] = name;
- this[Schema] = schema;
- this[BaseName] = baseName;
- }
-}
-function getTableName(table) {
- return table[TableName];
-}
-function getTableUniqueName(table) {
- return `${table[Schema] ?? "public"}.${table[TableName]}`;
-}
-
-// ../eve/node_modules/drizzle-orm/sql/sql.js
-function isSQLWrapper(value) {
- return value !== null && value !== undefined && typeof value.getSQL === "function";
-}
-function mergeQueries(queries) {
- const result = { sql: "", params: [] };
- for (const query of queries) {
- result.sql += query.sql;
- result.params.push(...query.params);
- if (query.typings?.length) {
- if (!result.typings) {
- result.typings = [];
- }
- result.typings.push(...query.typings);
- }
- }
- return result;
-}
-
-class StringChunk {
- static [entityKind] = "StringChunk";
- value;
- constructor(value) {
- this.value = Array.isArray(value) ? value : [value];
- }
- getSQL() {
- return new SQL([this]);
- }
-}
-
-class SQL {
- constructor(queryChunks) {
- this.queryChunks = queryChunks;
- for (const chunk of queryChunks) {
- if (is(chunk, Table)) {
- const schemaName = chunk[Table.Symbol.Schema];
- this.usedTables.push(schemaName === undefined ? chunk[Table.Symbol.Name] : schemaName + "." + chunk[Table.Symbol.Name]);
- }
- }
- }
- static [entityKind] = "SQL";
- decoder = noopDecoder;
- shouldInlineParams = false;
- usedTables = [];
- append(query) {
- this.queryChunks.push(...query.queryChunks);
- return this;
- }
- toQuery(config) {
- return tracer.startActiveSpan("drizzle.buildSQL", (span) => {
- const query = this.buildQueryFromSourceParams(this.queryChunks, config);
- span?.setAttributes({
- "drizzle.query.text": query.sql,
- "drizzle.query.params": JSON.stringify(query.params)
- });
- return query;
- });
- }
- buildQueryFromSourceParams(chunks, _config) {
- const config = Object.assign({}, _config, {
- inlineParams: _config.inlineParams || this.shouldInlineParams,
- paramStartIndex: _config.paramStartIndex || { value: 0 }
- });
- const {
- casing,
- escapeName,
- escapeParam,
- prepareTyping,
- inlineParams,
- paramStartIndex
- } = config;
- return mergeQueries(chunks.map((chunk) => {
- if (is(chunk, StringChunk)) {
- return { sql: chunk.value.join(""), params: [] };
- }
- if (is(chunk, Name)) {
- return { sql: escapeName(chunk.value), params: [] };
- }
- if (chunk === undefined) {
- return { sql: "", params: [] };
- }
- if (Array.isArray(chunk)) {
- const result = [new StringChunk("(")];
- for (const [i, p] of chunk.entries()) {
- result.push(p);
- if (i < chunk.length - 1) {
- result.push(new StringChunk(", "));
- }
- }
- result.push(new StringChunk(")"));
- return this.buildQueryFromSourceParams(result, config);
- }
- if (is(chunk, SQL)) {
- return this.buildQueryFromSourceParams(chunk.queryChunks, {
- ...config,
- inlineParams: inlineParams || chunk.shouldInlineParams
- });
- }
- if (is(chunk, Table)) {
- const schemaName = chunk[Table.Symbol.Schema];
- const tableName = chunk[Table.Symbol.Name];
- return {
- sql: schemaName === undefined || chunk[IsAlias] ? escapeName(tableName) : escapeName(schemaName) + "." + escapeName(tableName),
- params: []
- };
- }
- if (is(chunk, Column)) {
- const columnName = casing.getColumnCasing(chunk);
- if (_config.invokeSource === "indexes") {
- return { sql: escapeName(columnName), params: [] };
- }
- const schemaName = chunk.table[Table.Symbol.Schema];
- return {
- sql: chunk.table[IsAlias] || schemaName === undefined ? escapeName(chunk.table[Table.Symbol.Name]) + "." + escapeName(columnName) : escapeName(schemaName) + "." + escapeName(chunk.table[Table.Symbol.Name]) + "." + escapeName(columnName),
- params: []
- };
- }
- if (is(chunk, View)) {
- const schemaName = chunk[ViewBaseConfig].schema;
- const viewName = chunk[ViewBaseConfig].name;
- return {
- sql: schemaName === undefined || chunk[ViewBaseConfig].isAlias ? escapeName(viewName) : escapeName(schemaName) + "." + escapeName(viewName),
- params: []
- };
- }
- if (is(chunk, Param)) {
- if (is(chunk.value, Placeholder)) {
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
- }
- const mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);
- if (is(mappedValue, SQL)) {
- return this.buildQueryFromSourceParams([mappedValue], config);
- }
- if (inlineParams) {
- return { sql: this.mapInlineParam(mappedValue, config), params: [] };
- }
- let typings = ["none"];
- if (prepareTyping) {
- typings = [prepareTyping(chunk.encoder)];
- }
- return { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };
- }
- if (is(chunk, Placeholder)) {
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
- }
- if (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {
- return { sql: escapeName(chunk.fieldAlias), params: [] };
- }
- if (is(chunk, Subquery)) {
- if (chunk._.isWith) {
- return { sql: escapeName(chunk._.alias), params: [] };
- }
- return this.buildQueryFromSourceParams([
- new StringChunk("("),
- chunk._.sql,
- new StringChunk(") "),
- new Name(chunk._.alias)
- ], config);
- }
- if (isPgEnum(chunk)) {
- if (chunk.schema) {
- return { sql: escapeName(chunk.schema) + "." + escapeName(chunk.enumName), params: [] };
- }
- return { sql: escapeName(chunk.enumName), params: [] };
- }
- if (isSQLWrapper(chunk)) {
- if (chunk.shouldOmitSQLParens?.()) {
- return this.buildQueryFromSourceParams([chunk.getSQL()], config);
- }
- return this.buildQueryFromSourceParams([
- new StringChunk("("),
- chunk.getSQL(),
- new StringChunk(")")
- ], config);
- }
- if (inlineParams) {
- return { sql: this.mapInlineParam(chunk, config), params: [] };
- }
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
- }));
- }
- mapInlineParam(chunk, { escapeString }) {
- if (chunk === null) {
- return "null";
- }
- if (typeof chunk === "number" || typeof chunk === "boolean") {
- return chunk.toString();
- }
- if (typeof chunk === "string") {
- return escapeString(chunk);
- }
- if (typeof chunk === "object") {
- const mappedValueAsString = chunk.toString();
- if (mappedValueAsString === "[object Object]") {
- return escapeString(JSON.stringify(chunk));
- }
- return escapeString(mappedValueAsString);
- }
- throw new Error("Unexpected param value: " + chunk);
- }
- getSQL() {
- return this;
- }
- as(alias) {
- if (alias === undefined) {
- return this;
- }
- return new SQL.Aliased(this, alias);
- }
- mapWith(decoder) {
- this.decoder = typeof decoder === "function" ? { mapFromDriverValue: decoder } : decoder;
- return this;
- }
- inlineParams() {
- this.shouldInlineParams = true;
- return this;
- }
- if(condition) {
- return condition ? this : undefined;
- }
-}
-
-class Name {
- constructor(value) {
- this.value = value;
- }
- static [entityKind] = "Name";
- brand;
- getSQL() {
- return new SQL([this]);
- }
-}
-function isDriverValueEncoder(value) {
- return typeof value === "object" && value !== null && "mapToDriverValue" in value && typeof value.mapToDriverValue === "function";
-}
-var noopDecoder = {
- mapFromDriverValue: (value) => value
-};
-var noopEncoder = {
- mapToDriverValue: (value) => value
-};
-var noopMapper = {
- ...noopDecoder,
- ...noopEncoder
-};
-
-class Param {
- constructor(value, encoder = noopEncoder) {
- this.value = value;
- this.encoder = encoder;
- }
- static [entityKind] = "Param";
- brand;
- getSQL() {
- return new SQL([this]);
- }
-}
-function sql(strings, ...params) {
- const queryChunks = [];
- if (params.length > 0 || strings.length > 0 && strings[0] !== "") {
- queryChunks.push(new StringChunk(strings[0]));
- }
- for (const [paramIndex, param2] of params.entries()) {
- queryChunks.push(param2, new StringChunk(strings[paramIndex + 1]));
- }
- return new SQL(queryChunks);
-}
-((sql2) => {
- function empty() {
- return new SQL([]);
- }
- sql2.empty = empty;
- function fromList(list) {
- return new SQL(list);
- }
- sql2.fromList = fromList;
- function raw(str) {
- return new SQL([new StringChunk(str)]);
- }
- sql2.raw = raw;
- function join(chunks, separator) {
- const result = [];
- for (const [i, chunk] of chunks.entries()) {
- if (i > 0 && separator !== undefined) {
- result.push(separator);
- }
- result.push(chunk);
- }
- return new SQL(result);
- }
- sql2.join = join;
- function identifier(value) {
- return new Name(value);
- }
- sql2.identifier = identifier;
- function placeholder2(name2) {
- return new Placeholder(name2);
- }
- sql2.placeholder = placeholder2;
- function param2(value, encoder) {
- return new Param(value, encoder);
- }
- sql2.param = param2;
-})(sql || (sql = {}));
-((SQL2) => {
-
- class Aliased {
- constructor(sql2, fieldAlias) {
- this.sql = sql2;
- this.fieldAlias = fieldAlias;
- }
- static [entityKind] = "SQL.Aliased";
- isSelectionField = false;
- getSQL() {
- return this.sql;
- }
- clone() {
- return new Aliased(this.sql, this.fieldAlias);
- }
- }
- SQL2.Aliased = Aliased;
-})(SQL || (SQL = {}));
-
-class Placeholder {
- constructor(name2) {
- this.name = name2;
- }
- static [entityKind] = "Placeholder";
- getSQL() {
- return new SQL([this]);
- }
-}
-function fillPlaceholders(params, values) {
- return params.map((p) => {
- if (is(p, Placeholder)) {
- if (!(p.name in values)) {
- throw new Error(`No value for placeholder "${p.name}" was provided`);
- }
- return values[p.name];
- }
- if (is(p, Param) && is(p.value, Placeholder)) {
- if (!(p.value.name in values)) {
- throw new Error(`No value for placeholder "${p.value.name}" was provided`);
- }
- return p.encoder.mapToDriverValue(values[p.value.name]);
- }
- return p;
- });
-}
-var IsDrizzleView = Symbol.for("drizzle:IsDrizzleView");
-
-class View {
- static [entityKind] = "View";
- [ViewBaseConfig];
- [IsDrizzleView] = true;
- constructor({ name: name2, schema, selectedFields, query }) {
- this[ViewBaseConfig] = {
- name: name2,
- originalName: name2,
- schema,
- selectedFields,
- query,
- isExisting: !query,
- isAlias: false
- };
- }
- getSQL() {
- return new SQL([this]);
- }
-}
-Column.prototype.getSQL = function() {
- return new SQL([this]);
-};
-Table.prototype.getSQL = function() {
- return new SQL([this]);
-};
-Subquery.prototype.getSQL = function() {
- return new SQL([this]);
-};
-
-// ../eve/node_modules/drizzle-orm/alias.js
-class ColumnAliasProxyHandler {
- constructor(table) {
- this.table = table;
- }
- static [entityKind] = "ColumnAliasProxyHandler";
- get(columnObj, prop) {
- if (prop === "table") {
- return this.table;
- }
- return columnObj[prop];
- }
-}
-
-class TableAliasProxyHandler {
- constructor(alias, replaceOriginalName) {
- this.alias = alias;
- this.replaceOriginalName = replaceOriginalName;
- }
- static [entityKind] = "TableAliasProxyHandler";
- get(target, prop) {
- if (prop === Table.Symbol.IsAlias) {
- return true;
- }
- if (prop === Table.Symbol.Name) {
- return this.alias;
- }
- if (this.replaceOriginalName && prop === Table.Symbol.OriginalName) {
- return this.alias;
- }
- if (prop === ViewBaseConfig) {
- return {
- ...target[ViewBaseConfig],
- name: this.alias,
- isAlias: true
- };
- }
- if (prop === Table.Symbol.Columns) {
- const columns = target[Table.Symbol.Columns];
- if (!columns) {
- return columns;
- }
- const proxiedColumns = {};
- Object.keys(columns).map((key) => {
- proxiedColumns[key] = new Proxy(columns[key], new ColumnAliasProxyHandler(new Proxy(target, this)));
- });
- return proxiedColumns;
- }
- const value = target[prop];
- if (is(value, Column)) {
- return new Proxy(value, new ColumnAliasProxyHandler(new Proxy(target, this)));
- }
- return value;
- }
-}
-function aliasedTable(table, tableAlias) {
- return new Proxy(table, new TableAliasProxyHandler(tableAlias, false));
-}
-function aliasedTableColumn(column, tableAlias) {
- return new Proxy(column, new ColumnAliasProxyHandler(new Proxy(column.table, new TableAliasProxyHandler(tableAlias, false))));
-}
-function mapColumnsInAliasedSQLToAlias(query, alias) {
- return new SQL.Aliased(mapColumnsInSQLToAlias(query.sql, alias), query.fieldAlias);
-}
-function mapColumnsInSQLToAlias(query, alias) {
- return sql.join(query.queryChunks.map((c) => {
- if (is(c, Column)) {
- return aliasedTableColumn(c, alias);
- }
- if (is(c, SQL)) {
- return mapColumnsInSQLToAlias(c, alias);
- }
- if (is(c, SQL.Aliased)) {
- return mapColumnsInAliasedSQLToAlias(c, alias);
- }
- return c;
- }));
-}
-
-// ../eve/node_modules/drizzle-orm/utils.js
-function mapResultRow(columns, row, joinsNotNullableMap) {
- const nullifyMap = {};
- const result = columns.reduce((result2, { path, field }, columnIndex) => {
- let decoder;
- if (is(field, Column)) {
- decoder = field;
- } else if (is(field, SQL)) {
- decoder = field.decoder;
- } else {
- decoder = field.sql.decoder;
- }
- let node = result2;
- for (const [pathChunkIndex, pathChunk] of path.entries()) {
- if (pathChunkIndex < path.length - 1) {
- if (!(pathChunk in node)) {
- node[pathChunk] = {};
- }
- node = node[pathChunk];
- } else {
- const rawValue = row[columnIndex];
- const value = node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue);
- if (joinsNotNullableMap && is(field, Column) && path.length === 2) {
- const objectName = path[0];
- if (!(objectName in nullifyMap)) {
- nullifyMap[objectName] = value === null ? getTableName(field.table) : false;
- } else if (typeof nullifyMap[objectName] === "string" && nullifyMap[objectName] !== getTableName(field.table)) {
- nullifyMap[objectName] = false;
- }
- }
- }
- }
- return result2;
- }, {});
- if (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {
- for (const [objectName, tableName] of Object.entries(nullifyMap)) {
- if (typeof tableName === "string" && !joinsNotNullableMap[tableName]) {
- result[objectName] = null;
- }
- }
- }
- return result;
-}
-function orderSelectedFields(fields, pathPrefix) {
- return Object.entries(fields).reduce((result, [name, field]) => {
- if (typeof name !== "string") {
- return result;
- }
- const newPath = pathPrefix ? [...pathPrefix, name] : [name];
- if (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased)) {
- result.push({ path: newPath, field });
- } else if (is(field, Table)) {
- result.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath));
- } else {
- result.push(...orderSelectedFields(field, newPath));
- }
- return result;
- }, []);
-}
-function haveSameKeys(left, right) {
- const leftKeys = Object.keys(left);
- const rightKeys = Object.keys(right);
- if (leftKeys.length !== rightKeys.length) {
- return false;
- }
- for (const [index, key] of leftKeys.entries()) {
- if (key !== rightKeys[index]) {
- return false;
- }
- }
- return true;
-}
-function mapUpdateSet(table, values) {
- const entries = Object.entries(values).filter(([, value]) => value !== undefined).map(([key, value]) => {
- if (is(value, SQL) || is(value, Column)) {
- return [key, value];
- } else {
- return [key, new Param(value, table[Table.Symbol.Columns][key])];
- }
- });
- if (entries.length === 0) {
- throw new Error("No values to set");
- }
- return Object.fromEntries(entries);
-}
-function applyMixins(baseClass, extendedClasses) {
- for (const extendedClass of extendedClasses) {
- for (const name of Object.getOwnPropertyNames(extendedClass.prototype)) {
- if (name === "constructor")
- continue;
- Object.defineProperty(baseClass.prototype, name, Object.getOwnPropertyDescriptor(extendedClass.prototype, name) || /* @__PURE__ */ Object.create(null));
- }
- }
-}
-function getTableColumns(table) {
- return table[Table.Symbol.Columns];
-}
-function getTableLikeName(table) {
- return is(table, Subquery) ? table._.alias : is(table, View) ? table[ViewBaseConfig].name : is(table, SQL) ? undefined : table[Table.Symbol.IsAlias] ? table[Table.Symbol.Name] : table[Table.Symbol.BaseName];
-}
-function getColumnNameAndConfig(a, b) {
- return {
- name: typeof a === "string" && a.length > 0 ? a : "",
- config: typeof a === "object" ? a : b
- };
-}
-function isConfig(data) {
- if (typeof data !== "object" || data === null)
- return false;
- if (data.constructor.name !== "Object")
- return false;
- if ("logger" in data) {
- const type = typeof data["logger"];
- if (type !== "boolean" && (type !== "object" || typeof data["logger"]["logQuery"] !== "function") && type !== "undefined")
- return false;
- return true;
- }
- if ("schema" in data) {
- const type = typeof data["schema"];
- if (type !== "object" && type !== "undefined")
- return false;
- return true;
- }
- if ("casing" in data) {
- const type = typeof data["casing"];
- if (type !== "string" && type !== "undefined")
- return false;
- return true;
- }
- if ("mode" in data) {
- if (data["mode"] !== "default" || data["mode"] !== "planetscale" || data["mode"] !== undefined)
- return false;
- return true;
- }
- if ("connection" in data) {
- const type = typeof data["connection"];
- if (type !== "string" && type !== "object" && type !== "undefined")
- return false;
- return true;
- }
- if ("client" in data) {
- const type = typeof data["client"];
- if (type !== "object" && type !== "function" && type !== "undefined")
- return false;
- return true;
- }
- if (Object.keys(data).length === 0)
- return true;
- return false;
-}
-var textDecoder = typeof TextDecoder === "undefined" ? null : new TextDecoder;
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/foreign-keys.js
-class ForeignKeyBuilder {
- static [entityKind] = "SQLiteForeignKeyBuilder";
- reference;
- _onUpdate;
- _onDelete;
- constructor(config, actions) {
- this.reference = () => {
- const { name, columns, foreignColumns } = config();
- return { name, columns, foreignTable: foreignColumns[0].table, foreignColumns };
- };
- if (actions) {
- this._onUpdate = actions.onUpdate;
- this._onDelete = actions.onDelete;
- }
- }
- onUpdate(action) {
- this._onUpdate = action;
- return this;
- }
- onDelete(action) {
- this._onDelete = action;
- return this;
- }
- build(table) {
- return new ForeignKey(table, this);
- }
-}
-
-class ForeignKey {
- constructor(table, builder) {
- this.table = table;
- this.reference = builder.reference;
- this.onUpdate = builder._onUpdate;
- this.onDelete = builder._onDelete;
- }
- static [entityKind] = "SQLiteForeignKey";
- reference;
- onUpdate;
- onDelete;
- getName() {
- const { name, columns, foreignColumns } = this.reference();
- const columnNames = columns.map((column) => column.name);
- const foreignColumnNames = foreignColumns.map((column) => column.name);
- const chunks = [
- this.table[TableName],
- ...columnNames,
- foreignColumns[0].table[TableName],
- ...foreignColumnNames
- ];
- return name ?? `${chunks.join("_")}_fk`;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/unique-constraint.js
-function uniqueKeyName2(table, columns) {
- return `${table[TableName]}_${columns.join("_")}_unique`;
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/common.js
-class SQLiteColumnBuilder extends ColumnBuilder {
- static [entityKind] = "SQLiteColumnBuilder";
- foreignKeyConfigs = [];
- references(ref, actions = {}) {
- this.foreignKeyConfigs.push({ ref, actions });
- return this;
- }
- unique(name) {
- this.config.isUnique = true;
- this.config.uniqueName = name;
- return this;
- }
- generatedAlwaysAs(as, config) {
- this.config.generated = {
- as,
- type: "always",
- mode: config?.mode ?? "virtual"
- };
- return this;
- }
- buildForeignKeys(column, table) {
- return this.foreignKeyConfigs.map(({ ref, actions }) => {
- return ((ref2, actions2) => {
- const builder = new ForeignKeyBuilder(() => {
- const foreignColumn = ref2();
- return { columns: [column], foreignColumns: [foreignColumn] };
- });
- if (actions2.onUpdate) {
- builder.onUpdate(actions2.onUpdate);
- }
- if (actions2.onDelete) {
- builder.onDelete(actions2.onDelete);
- }
- return builder.build(table);
- })(ref, actions);
- });
- }
-}
-
-class SQLiteColumn extends Column {
- constructor(table, config) {
- if (!config.uniqueName) {
- config.uniqueName = uniqueKeyName2(table, [config.name]);
- }
- super(table, config);
- this.table = table;
- }
- static [entityKind] = "SQLiteColumn";
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/blob.js
-class SQLiteBigIntBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBigIntBuilder";
- constructor(name) {
- super(name, "bigint", "SQLiteBigInt");
- }
- build(table) {
- return new SQLiteBigInt(table, this.config);
- }
-}
-
-class SQLiteBigInt extends SQLiteColumn {
- static [entityKind] = "SQLiteBigInt";
- getSQLType() {
- return "blob";
- }
- mapFromDriverValue(value) {
- if (typeof Buffer !== "undefined" && Buffer.from) {
- const buf = Buffer.isBuffer(value) ? value : value instanceof ArrayBuffer ? Buffer.from(value) : value.buffer ? Buffer.from(value.buffer, value.byteOffset, value.byteLength) : Buffer.from(value);
- return BigInt(buf.toString("utf8"));
- }
- return BigInt(textDecoder.decode(value));
- }
- mapToDriverValue(value) {
- return Buffer.from(value.toString());
- }
-}
-
-class SQLiteBlobJsonBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBlobJsonBuilder";
- constructor(name) {
- super(name, "json", "SQLiteBlobJson");
- }
- build(table) {
- return new SQLiteBlobJson(table, this.config);
- }
-}
-
-class SQLiteBlobJson extends SQLiteColumn {
- static [entityKind] = "SQLiteBlobJson";
- getSQLType() {
- return "blob";
- }
- mapFromDriverValue(value) {
- if (typeof Buffer !== "undefined" && Buffer.from) {
- const buf = Buffer.isBuffer(value) ? value : value instanceof ArrayBuffer ? Buffer.from(value) : value.buffer ? Buffer.from(value.buffer, value.byteOffset, value.byteLength) : Buffer.from(value);
- return JSON.parse(buf.toString("utf8"));
- }
- return JSON.parse(textDecoder.decode(value));
- }
- mapToDriverValue(value) {
- return Buffer.from(JSON.stringify(value));
- }
-}
-
-class SQLiteBlobBufferBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBlobBufferBuilder";
- constructor(name) {
- super(name, "buffer", "SQLiteBlobBuffer");
- }
- build(table) {
- return new SQLiteBlobBuffer(table, this.config);
- }
-}
-
-class SQLiteBlobBuffer extends SQLiteColumn {
- static [entityKind] = "SQLiteBlobBuffer";
- mapFromDriverValue(value) {
- if (Buffer.isBuffer(value)) {
- return value;
- }
- return Buffer.from(value);
- }
- getSQLType() {
- return "blob";
- }
-}
-function blob(a, b) {
- const { name, config } = getColumnNameAndConfig(a, b);
- if (config?.mode === "json") {
- return new SQLiteBlobJsonBuilder(name);
- }
- if (config?.mode === "bigint") {
- return new SQLiteBigIntBuilder(name);
- }
- return new SQLiteBlobBufferBuilder(name);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/custom.js
-class SQLiteCustomColumnBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteCustomColumnBuilder";
- constructor(name, fieldConfig, customTypeParams) {
- super(name, "custom", "SQLiteCustomColumn");
- this.config.fieldConfig = fieldConfig;
- this.config.customTypeParams = customTypeParams;
- }
- build(table) {
- return new SQLiteCustomColumn(table, this.config);
- }
-}
-
-class SQLiteCustomColumn extends SQLiteColumn {
- static [entityKind] = "SQLiteCustomColumn";
- sqlName;
- mapTo;
- mapFrom;
- constructor(table, config) {
- super(table, config);
- this.sqlName = config.customTypeParams.dataType(config.fieldConfig);
- this.mapTo = config.customTypeParams.toDriver;
- this.mapFrom = config.customTypeParams.fromDriver;
- }
- getSQLType() {
- return this.sqlName;
- }
- mapFromDriverValue(value) {
- return typeof this.mapFrom === "function" ? this.mapFrom(value) : value;
- }
- mapToDriverValue(value) {
- return typeof this.mapTo === "function" ? this.mapTo(value) : value;
- }
-}
-function customType(customTypeParams) {
- return (a, b) => {
- const { name, config } = getColumnNameAndConfig(a, b);
- return new SQLiteCustomColumnBuilder(name, config, customTypeParams);
- };
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/integer.js
-class SQLiteBaseIntegerBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBaseIntegerBuilder";
- constructor(name, dataType, columnType) {
- super(name, dataType, columnType);
- this.config.autoIncrement = false;
- }
- primaryKey(config) {
- if (config?.autoIncrement) {
- this.config.autoIncrement = true;
- }
- this.config.hasDefault = true;
- return super.primaryKey();
- }
-}
-
-class SQLiteBaseInteger extends SQLiteColumn {
- static [entityKind] = "SQLiteBaseInteger";
- autoIncrement = this.config.autoIncrement;
- getSQLType() {
- return "integer";
- }
-}
-
-class SQLiteIntegerBuilder extends SQLiteBaseIntegerBuilder {
- static [entityKind] = "SQLiteIntegerBuilder";
- constructor(name) {
- super(name, "number", "SQLiteInteger");
- }
- build(table) {
- return new SQLiteInteger(table, this.config);
- }
-}
-
-class SQLiteInteger extends SQLiteBaseInteger {
- static [entityKind] = "SQLiteInteger";
-}
-
-class SQLiteTimestampBuilder extends SQLiteBaseIntegerBuilder {
- static [entityKind] = "SQLiteTimestampBuilder";
- constructor(name, mode) {
- super(name, "date", "SQLiteTimestamp");
- this.config.mode = mode;
- }
- defaultNow() {
- return this.default(sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`);
- }
- build(table) {
- return new SQLiteTimestamp(table, this.config);
- }
-}
-
-class SQLiteTimestamp extends SQLiteBaseInteger {
- static [entityKind] = "SQLiteTimestamp";
- mode = this.config.mode;
- mapFromDriverValue(value) {
- if (this.config.mode === "timestamp") {
- return new Date(value * 1000);
- }
- return new Date(value);
- }
- mapToDriverValue(value) {
- const unix = value.getTime();
- if (this.config.mode === "timestamp") {
- return Math.floor(unix / 1000);
- }
- return unix;
- }
-}
-
-class SQLiteBooleanBuilder extends SQLiteBaseIntegerBuilder {
- static [entityKind] = "SQLiteBooleanBuilder";
- constructor(name, mode) {
- super(name, "boolean", "SQLiteBoolean");
- this.config.mode = mode;
- }
- build(table) {
- return new SQLiteBoolean(table, this.config);
- }
-}
-
-class SQLiteBoolean extends SQLiteBaseInteger {
- static [entityKind] = "SQLiteBoolean";
- mode = this.config.mode;
- mapFromDriverValue(value) {
- return Number(value) === 1;
- }
- mapToDriverValue(value) {
- return value ? 1 : 0;
- }
-}
-function integer(a, b) {
- const { name, config } = getColumnNameAndConfig(a, b);
- if (config?.mode === "timestamp" || config?.mode === "timestamp_ms") {
- return new SQLiteTimestampBuilder(name, config.mode);
- }
- if (config?.mode === "boolean") {
- return new SQLiteBooleanBuilder(name, config.mode);
- }
- return new SQLiteIntegerBuilder(name);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/numeric.js
-class SQLiteNumericBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteNumericBuilder";
- constructor(name) {
- super(name, "string", "SQLiteNumeric");
- }
- build(table) {
- return new SQLiteNumeric(table, this.config);
- }
-}
-
-class SQLiteNumeric extends SQLiteColumn {
- static [entityKind] = "SQLiteNumeric";
- mapFromDriverValue(value) {
- if (typeof value === "string")
- return value;
- return String(value);
- }
- getSQLType() {
- return "numeric";
- }
-}
-
-class SQLiteNumericNumberBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteNumericNumberBuilder";
- constructor(name) {
- super(name, "number", "SQLiteNumericNumber");
- }
- build(table) {
- return new SQLiteNumericNumber(table, this.config);
- }
-}
-
-class SQLiteNumericNumber extends SQLiteColumn {
- static [entityKind] = "SQLiteNumericNumber";
- mapFromDriverValue(value) {
- if (typeof value === "number")
- return value;
- return Number(value);
- }
- mapToDriverValue = String;
- getSQLType() {
- return "numeric";
- }
-}
-
-class SQLiteNumericBigIntBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteNumericBigIntBuilder";
- constructor(name) {
- super(name, "bigint", "SQLiteNumericBigInt");
- }
- build(table) {
- return new SQLiteNumericBigInt(table, this.config);
- }
-}
-
-class SQLiteNumericBigInt extends SQLiteColumn {
- static [entityKind] = "SQLiteNumericBigInt";
- mapFromDriverValue = BigInt;
- mapToDriverValue = String;
- getSQLType() {
- return "numeric";
- }
-}
-function numeric(a, b) {
- const { name, config } = getColumnNameAndConfig(a, b);
- const mode = config?.mode;
- return mode === "number" ? new SQLiteNumericNumberBuilder(name) : mode === "bigint" ? new SQLiteNumericBigIntBuilder(name) : new SQLiteNumericBuilder(name);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/real.js
-class SQLiteRealBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteRealBuilder";
- constructor(name) {
- super(name, "number", "SQLiteReal");
- }
- build(table) {
- return new SQLiteReal(table, this.config);
- }
-}
-
-class SQLiteReal extends SQLiteColumn {
- static [entityKind] = "SQLiteReal";
- getSQLType() {
- return "real";
- }
-}
-function real(name) {
- return new SQLiteRealBuilder(name ?? "");
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/text.js
-class SQLiteTextBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteTextBuilder";
- constructor(name, config) {
- super(name, "string", "SQLiteText");
- this.config.enumValues = config.enum;
- this.config.length = config.length;
- }
- build(table) {
- return new SQLiteText(table, this.config);
- }
-}
-
-class SQLiteText extends SQLiteColumn {
- static [entityKind] = "SQLiteText";
- enumValues = this.config.enumValues;
- length = this.config.length;
- constructor(table, config) {
- super(table, config);
- }
- getSQLType() {
- return `text${this.config.length ? `(${this.config.length})` : ""}`;
- }
-}
-
-class SQLiteTextJsonBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteTextJsonBuilder";
- constructor(name) {
- super(name, "json", "SQLiteTextJson");
- }
- build(table) {
- return new SQLiteTextJson(table, this.config);
- }
-}
-
-class SQLiteTextJson extends SQLiteColumn {
- static [entityKind] = "SQLiteTextJson";
- getSQLType() {
- return "text";
- }
- mapFromDriverValue(value) {
- return JSON.parse(value);
- }
- mapToDriverValue(value) {
- return JSON.stringify(value);
- }
-}
-function text(a, b = {}) {
- const { name, config } = getColumnNameAndConfig(a, b);
- if (config.mode === "json") {
- return new SQLiteTextJsonBuilder(name);
- }
- return new SQLiteTextBuilder(name, config);
-}
-
-// ../eve/node_modules/drizzle-orm/selection-proxy.js
-class SelectionProxyHandler {
- static [entityKind] = "SelectionProxyHandler";
- config;
- constructor(config) {
- this.config = { ...config };
- }
- get(subquery, prop) {
- if (prop === "_") {
- return {
- ...subquery["_"],
- selectedFields: new Proxy(subquery._.selectedFields, this)
- };
- }
- if (prop === ViewBaseConfig) {
- return {
- ...subquery[ViewBaseConfig],
- selectedFields: new Proxy(subquery[ViewBaseConfig].selectedFields, this)
- };
- }
- if (typeof prop === "symbol") {
- return subquery[prop];
- }
- const columns = is(subquery, Subquery) ? subquery._.selectedFields : is(subquery, View) ? subquery[ViewBaseConfig].selectedFields : subquery;
- const value = columns[prop];
- if (is(value, SQL.Aliased)) {
- if (this.config.sqlAliasedBehavior === "sql" && !value.isSelectionField) {
- return value.sql;
- }
- const newValue = value.clone();
- newValue.isSelectionField = true;
- return newValue;
- }
- if (is(value, SQL)) {
- if (this.config.sqlBehavior === "sql") {
- return value;
- }
- throw new Error(`You tried to reference "${prop}" field from a subquery, which is a raw SQL field, but it doesn't have an alias declared. Please add an alias to the field using ".as('alias')" method.`);
- }
- if (is(value, Column)) {
- if (this.config.alias) {
- return new Proxy(value, new ColumnAliasProxyHandler(new Proxy(value.table, new TableAliasProxyHandler(this.config.alias, this.config.replaceOriginalName ?? false))));
- }
- return value;
- }
- if (typeof value !== "object" || value === null) {
- return value;
- }
- return new Proxy(value, new SelectionProxyHandler(this.config));
- }
-}
-
-// ../eve/node_modules/drizzle-orm/query-promise.js
-class QueryPromise {
- static [entityKind] = "QueryPromise";
- [Symbol.toStringTag] = "QueryPromise";
- catch(onRejected) {
- return this.then(undefined, onRejected);
- }
- finally(onFinally) {
- return this.then((value) => {
- onFinally?.();
- return value;
- }, (reason) => {
- onFinally?.();
- throw reason;
- });
- }
- then(onFulfilled, onRejected) {
- return this.execute().then(onFulfilled, onRejected);
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/all.js
-function getSQLiteColumnBuilders() {
- return {
- blob,
- customType,
- integer,
- numeric,
- real,
- text
- };
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/table.js
-var InlineForeignKeys = Symbol.for("drizzle:SQLiteInlineForeignKeys");
-
-class SQLiteTable extends Table {
- static [entityKind] = "SQLiteTable";
- static Symbol = Object.assign({}, Table.Symbol, {
- InlineForeignKeys
- });
- [Table.Symbol.Columns];
- [InlineForeignKeys] = [];
- [Table.Symbol.ExtraConfigBuilder] = undefined;
-}
-function sqliteTableBase(name, columns, extraConfig, schema, baseName = name) {
- const rawTable = new SQLiteTable(name, schema, baseName);
- const parsedColumns = typeof columns === "function" ? columns(getSQLiteColumnBuilders()) : columns;
- const builtColumns = Object.fromEntries(Object.entries(parsedColumns).map(([name2, colBuilderBase]) => {
- const colBuilder = colBuilderBase;
- colBuilder.setName(name2);
- const column = colBuilder.build(rawTable);
- rawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));
- return [name2, column];
- }));
- const table = Object.assign(rawTable, builtColumns);
- table[Table.Symbol.Columns] = builtColumns;
- table[Table.Symbol.ExtraConfigColumns] = builtColumns;
- if (extraConfig) {
- table[SQLiteTable.Symbol.ExtraConfigBuilder] = extraConfig;
- }
- return table;
-}
-var sqliteTable = (name, columns, extraConfig) => {
- return sqliteTableBase(name, columns, extraConfig);
-};
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/indexes.js
-class IndexBuilderOn {
- constructor(name, unique) {
- this.name = name;
- this.unique = unique;
- }
- static [entityKind] = "SQLiteIndexBuilderOn";
- on(...columns) {
- return new IndexBuilder(this.name, columns, this.unique);
- }
-}
-
-class IndexBuilder {
- static [entityKind] = "SQLiteIndexBuilder";
- config;
- constructor(name, columns, unique) {
- this.config = {
- name,
- columns,
- unique,
- where: undefined
- };
- }
- where(condition) {
- this.config.where = condition;
- return this;
- }
- build(table) {
- return new Index(this.config, table);
- }
-}
-
-class Index {
- static [entityKind] = "SQLiteIndex";
- config;
- constructor(config, table) {
- this.config = { ...config, table };
- }
-}
-function index(name) {
- return new IndexBuilderOn(name, false);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/utils.js
-function extractUsedTable(table) {
- if (is(table, SQLiteTable)) {
- return [`${table[Table.Symbol.BaseName]}`];
- }
- if (is(table, Subquery)) {
- return table._.usedTables ?? [];
- }
- if (is(table, SQL)) {
- return table.usedTables ?? [];
- }
- return [];
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js
-class SQLiteDeleteBase extends QueryPromise {
- constructor(table, session, dialect, withList) {
- super();
- this.table = table;
- this.session = session;
- this.dialect = dialect;
- this.config = { table, withList };
- }
- static [entityKind] = "SQLiteDelete";
- config;
- where(where) {
- this.config.where = where;
- return this;
- }
- orderBy(...columns) {
- if (typeof columns[0] === "function") {
- const orderBy = columns[0](new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
- this.config.orderBy = orderByArray;
- } else {
- const orderByArray = columns;
- this.config.orderBy = orderByArray;
- }
- return this;
- }
- limit(limit) {
- this.config.limit = limit;
- return this;
- }
- returning(fields = this.table[SQLiteTable.Symbol.Columns]) {
- this.config.returning = orderSelectedFields(fields);
- return this;
- }
- getSQL() {
- return this.dialect.buildDeleteQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- _prepare(isOneTimeQuery = true) {
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
- type: "delete",
- tables: extractUsedTable(this.config.table)
- });
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute(placeholderValues) {
- return this._prepare().execute(placeholderValues);
- }
- $dynamic() {
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/casing.js
-function toSnakeCase(input) {
- const words = input.replace(/['\u2019]/g, "").match(/[\da-z]+|[A-Z]+(?![a-z])|[A-Z][\da-z]+/g) ?? [];
- return words.map((word) => word.toLowerCase()).join("_");
-}
-function toCamelCase(input) {
- const words = input.replace(/['\u2019]/g, "").match(/[\da-z]+|[A-Z]+(?![a-z])|[A-Z][\da-z]+/g) ?? [];
- return words.reduce((acc, word, i) => {
- const formattedWord = i === 0 ? word.toLowerCase() : `${word[0].toUpperCase()}${word.slice(1)}`;
- return acc + formattedWord;
- }, "");
-}
-function noopCase(input) {
- return input;
-}
-
-class CasingCache {
- static [entityKind] = "CasingCache";
- cache = {};
- cachedTables = {};
- convert;
- constructor(casing) {
- this.convert = casing === "snake_case" ? toSnakeCase : casing === "camelCase" ? toCamelCase : noopCase;
- }
- getColumnCasing(column) {
- if (!column.keyAsName)
- return column.name;
- const schema = column.table[Table.Symbol.Schema] ?? "public";
- const tableName = column.table[Table.Symbol.OriginalName];
- const key = `${schema}.${tableName}.${column.name}`;
- if (!this.cache[key]) {
- this.cacheTable(column.table);
- }
- return this.cache[key];
- }
- cacheTable(table) {
- const schema = table[Table.Symbol.Schema] ?? "public";
- const tableName = table[Table.Symbol.OriginalName];
- const tableKey = `${schema}.${tableName}`;
- if (!this.cachedTables[tableKey]) {
- for (const column of Object.values(table[Table.Symbol.Columns])) {
- const columnKey = `${tableKey}.${column.name}`;
- this.cache[columnKey] = this.convert(column.name);
- }
- this.cachedTables[tableKey] = true;
- }
- }
- clearCache() {
- this.cache = {};
- this.cachedTables = {};
- }
-}
-
-// ../eve/node_modules/drizzle-orm/errors.js
-class DrizzleError extends Error {
- static [entityKind] = "DrizzleError";
- constructor({ message, cause }) {
- super(message);
- this.name = "DrizzleError";
- this.cause = cause;
- }
-}
-
-class DrizzleQueryError extends Error {
- constructor(query, params, cause) {
- super(`Failed query: ${query}
-params: ${params}`);
- this.query = query;
- this.params = params;
- this.cause = cause;
- Error.captureStackTrace(this, DrizzleQueryError);
- if (cause)
- this.cause = cause;
- }
-}
-
-class TransactionRollbackError extends DrizzleError {
- static [entityKind] = "TransactionRollbackError";
- constructor() {
- super({ message: "Rollback" });
- }
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/table.js
-var InlineForeignKeys2 = Symbol.for("drizzle:PgInlineForeignKeys");
-var EnableRLS = Symbol.for("drizzle:EnableRLS");
-
-class PgTable extends Table {
- static [entityKind] = "PgTable";
- static Symbol = Object.assign({}, Table.Symbol, {
- InlineForeignKeys: InlineForeignKeys2,
- EnableRLS
- });
- [InlineForeignKeys2] = [];
- [EnableRLS] = false;
- [Table.Symbol.ExtraConfigBuilder] = undefined;
- [Table.Symbol.ExtraConfigColumns] = {};
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/primary-keys.js
-class PrimaryKeyBuilder {
- static [entityKind] = "PgPrimaryKeyBuilder";
- columns;
- name;
- constructor(columns, name) {
- this.columns = columns;
- this.name = name;
- }
- build(table) {
- return new PrimaryKey(table, this.columns, this.name);
- }
-}
-
-class PrimaryKey {
- constructor(table, columns, name) {
- this.table = table;
- this.columns = columns;
- this.name = name;
- }
- static [entityKind] = "PgPrimaryKey";
- columns;
- name;
- getName() {
- return this.name ?? `${this.table[PgTable.Symbol.Name]}_${this.columns.map((column) => column.name).join("_")}_pk`;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sql/expressions/conditions.js
-function bindIfParam(value, column) {
- if (isDriverValueEncoder(column) && !isSQLWrapper(value) && !is(value, Param) && !is(value, Placeholder) && !is(value, Column) && !is(value, Table) && !is(value, View)) {
- return new Param(value, column);
- }
- return value;
-}
-var eq = (left, right) => {
- return sql`${left} = ${bindIfParam(right, left)}`;
-};
-var ne = (left, right) => {
- return sql`${left} <> ${bindIfParam(right, left)}`;
-};
-function and(...unfilteredConditions) {
- const conditions = unfilteredConditions.filter((c) => c !== undefined);
- if (conditions.length === 0) {
- return;
- }
- if (conditions.length === 1) {
- return new SQL(conditions);
- }
- return new SQL([
- new StringChunk("("),
- sql.join(conditions, new StringChunk(" and ")),
- new StringChunk(")")
- ]);
-}
-function or(...unfilteredConditions) {
- const conditions = unfilteredConditions.filter((c) => c !== undefined);
- if (conditions.length === 0) {
- return;
- }
- if (conditions.length === 1) {
- return new SQL(conditions);
- }
- return new SQL([
- new StringChunk("("),
- sql.join(conditions, new StringChunk(" or ")),
- new StringChunk(")")
- ]);
-}
-function not(condition) {
- return sql`not ${condition}`;
-}
-var gt = (left, right) => {
- return sql`${left} > ${bindIfParam(right, left)}`;
-};
-var gte = (left, right) => {
- return sql`${left} >= ${bindIfParam(right, left)}`;
-};
-var lt = (left, right) => {
- return sql`${left} < ${bindIfParam(right, left)}`;
-};
-var lte = (left, right) => {
- return sql`${left} <= ${bindIfParam(right, left)}`;
-};
-function inArray(column, values) {
- if (Array.isArray(values)) {
- if (values.length === 0) {
- return sql`false`;
- }
- return sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;
- }
- return sql`${column} in ${bindIfParam(values, column)}`;
-}
-function notInArray(column, values) {
- if (Array.isArray(values)) {
- if (values.length === 0) {
- return sql`true`;
- }
- return sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;
- }
- return sql`${column} not in ${bindIfParam(values, column)}`;
-}
-function isNull(value) {
- return sql`${value} is null`;
-}
-function isNotNull(value) {
- return sql`${value} is not null`;
-}
-function exists(subquery) {
- return sql`exists ${subquery}`;
-}
-function notExists(subquery) {
- return sql`not exists ${subquery}`;
-}
-function between(column, min, max) {
- return sql`${column} between ${bindIfParam(min, column)} and ${bindIfParam(max, column)}`;
-}
-function notBetween(column, min, max) {
- return sql`${column} not between ${bindIfParam(min, column)} and ${bindIfParam(max, column)}`;
-}
-function like(column, value) {
- return sql`${column} like ${value}`;
-}
-function notLike(column, value) {
- return sql`${column} not like ${value}`;
-}
-function ilike(column, value) {
- return sql`${column} ilike ${value}`;
-}
-function notIlike(column, value) {
- return sql`${column} not ilike ${value}`;
-}
-
-// ../eve/node_modules/drizzle-orm/sql/expressions/select.js
-function asc(column) {
- return sql`${column} asc`;
-}
-function desc(column) {
- return sql`${column} desc`;
-}
-
-// ../eve/node_modules/drizzle-orm/relations.js
-class Relation {
- constructor(sourceTable, referencedTable, relationName) {
- this.sourceTable = sourceTable;
- this.referencedTable = referencedTable;
- this.relationName = relationName;
- this.referencedTableName = referencedTable[Table.Symbol.Name];
- }
- static [entityKind] = "Relation";
- referencedTableName;
- fieldName;
-}
-
-class Relations {
- constructor(table, config) {
- this.table = table;
- this.config = config;
- }
- static [entityKind] = "Relations";
-}
-
-class One extends Relation {
- constructor(sourceTable, referencedTable, config, isNullable) {
- super(sourceTable, referencedTable, config?.relationName);
- this.config = config;
- this.isNullable = isNullable;
- }
- static [entityKind] = "One";
- withFieldName(fieldName) {
- const relation = new One(this.sourceTable, this.referencedTable, this.config, this.isNullable);
- relation.fieldName = fieldName;
- return relation;
- }
-}
-
-class Many extends Relation {
- constructor(sourceTable, referencedTable, config) {
- super(sourceTable, referencedTable, config?.relationName);
- this.config = config;
- }
- static [entityKind] = "Many";
- withFieldName(fieldName) {
- const relation = new Many(this.sourceTable, this.referencedTable, this.config);
- relation.fieldName = fieldName;
- return relation;
- }
-}
-function getOperators() {
- return {
- and,
- between,
- eq,
- exists,
- gt,
- gte,
- ilike,
- inArray,
- isNull,
- isNotNull,
- like,
- lt,
- lte,
- ne,
- not,
- notBetween,
- notExists,
- notLike,
- notIlike,
- notInArray,
- or,
- sql
- };
-}
-function getOrderByOperators() {
- return {
- sql,
- asc,
- desc
- };
-}
-function extractTablesRelationalConfig(schema, configHelpers) {
- if (Object.keys(schema).length === 1 && "default" in schema && !is(schema["default"], Table)) {
- schema = schema["default"];
- }
- const tableNamesMap = {};
- const relationsBuffer = {};
- const tablesConfig = {};
- for (const [key, value] of Object.entries(schema)) {
- if (is(value, Table)) {
- const dbName = getTableUniqueName(value);
- const bufferedRelations = relationsBuffer[dbName];
- tableNamesMap[dbName] = key;
- tablesConfig[key] = {
- tsName: key,
- dbName: value[Table.Symbol.Name],
- schema: value[Table.Symbol.Schema],
- columns: value[Table.Symbol.Columns],
- relations: bufferedRelations?.relations ?? {},
- primaryKey: bufferedRelations?.primaryKey ?? []
- };
- for (const column of Object.values(value[Table.Symbol.Columns])) {
- if (column.primary) {
- tablesConfig[key].primaryKey.push(column);
- }
- }
- const extraConfig = value[Table.Symbol.ExtraConfigBuilder]?.(value[Table.Symbol.ExtraConfigColumns]);
- if (extraConfig) {
- for (const configEntry of Object.values(extraConfig)) {
- if (is(configEntry, PrimaryKeyBuilder)) {
- tablesConfig[key].primaryKey.push(...configEntry.columns);
- }
- }
- }
- } else if (is(value, Relations)) {
- const dbName = getTableUniqueName(value.table);
- const tableName = tableNamesMap[dbName];
- const relations2 = value.config(configHelpers(value.table));
- let primaryKey;
- for (const [relationName, relation] of Object.entries(relations2)) {
- if (tableName) {
- const tableConfig = tablesConfig[tableName];
- tableConfig.relations[relationName] = relation;
- if (primaryKey) {
- tableConfig.primaryKey.push(...primaryKey);
- }
- } else {
- if (!(dbName in relationsBuffer)) {
- relationsBuffer[dbName] = {
- relations: {},
- primaryKey
- };
- }
- relationsBuffer[dbName].relations[relationName] = relation;
- }
- }
- }
- }
- return { tables: tablesConfig, tableNamesMap };
-}
-function relations(table, relations2) {
- return new Relations(table, (helpers) => Object.fromEntries(Object.entries(relations2(helpers)).map(([key, value]) => [
- key,
- value.withFieldName(key)
- ])));
-}
-function createOne(sourceTable) {
- return function one(table, config) {
- return new One(sourceTable, table, config, config?.fields.reduce((res, f) => res && f.notNull, true) ?? false);
- };
-}
-function createMany(sourceTable) {
- return function many(referencedTable, config) {
- return new Many(sourceTable, referencedTable, config);
- };
-}
-function normalizeRelation(schema, tableNamesMap, relation) {
- if (is(relation, One) && relation.config) {
- return {
- fields: relation.config.fields,
- references: relation.config.references
- };
- }
- const referencedTableTsName = tableNamesMap[getTableUniqueName(relation.referencedTable)];
- if (!referencedTableTsName) {
- throw new Error(`Table "${relation.referencedTable[Table.Symbol.Name]}" not found in schema`);
- }
- const referencedTableConfig = schema[referencedTableTsName];
- if (!referencedTableConfig) {
- throw new Error(`Table "${referencedTableTsName}" not found in schema`);
- }
- const sourceTable = relation.sourceTable;
- const sourceTableTsName = tableNamesMap[getTableUniqueName(sourceTable)];
- if (!sourceTableTsName) {
- throw new Error(`Table "${sourceTable[Table.Symbol.Name]}" not found in schema`);
- }
- const reverseRelations = [];
- for (const referencedTableRelation of Object.values(referencedTableConfig.relations)) {
- if (relation.relationName && relation !== referencedTableRelation && referencedTableRelation.relationName === relation.relationName || !relation.relationName && referencedTableRelation.referencedTable === relation.sourceTable) {
- reverseRelations.push(referencedTableRelation);
- }
- }
- if (reverseRelations.length > 1) {
- throw relation.relationName ? new Error(`There are multiple relations with name "${relation.relationName}" in table "${referencedTableTsName}"`) : new Error(`There are multiple relations between "${referencedTableTsName}" and "${relation.sourceTable[Table.Symbol.Name]}". Please specify relation name`);
- }
- if (reverseRelations[0] && is(reverseRelations[0], One) && reverseRelations[0].config) {
- return {
- fields: reverseRelations[0].config.references,
- references: reverseRelations[0].config.fields
- };
- }
- throw new Error(`There is not enough information to infer relation "${sourceTableTsName}.${relation.fieldName}"`);
-}
-function createTableRelationsHelpers(sourceTable) {
- return {
- one: createOne(sourceTable),
- many: createMany(sourceTable)
- };
-}
-function mapRelationalRow(tablesConfig, tableConfig, row, buildQueryResultSelection, mapColumnValue = (value) => value) {
- const result = {};
- for (const [
- selectionItemIndex,
- selectionItem
- ] of buildQueryResultSelection.entries()) {
- if (selectionItem.isJson) {
- const relation = tableConfig.relations[selectionItem.tsKey];
- const rawSubRows = row[selectionItemIndex];
- const subRows = typeof rawSubRows === "string" ? JSON.parse(rawSubRows) : rawSubRows;
- result[selectionItem.tsKey] = is(relation, One) ? subRows && mapRelationalRow(tablesConfig, tablesConfig[selectionItem.relationTableTsKey], subRows, selectionItem.selection, mapColumnValue) : subRows.map((subRow) => mapRelationalRow(tablesConfig, tablesConfig[selectionItem.relationTableTsKey], subRow, selectionItem.selection, mapColumnValue));
- } else {
- const value = mapColumnValue(row[selectionItemIndex]);
- const field = selectionItem.field;
- let decoder;
- if (is(field, Column)) {
- decoder = field;
- } else if (is(field, SQL)) {
- decoder = field.decoder;
- } else {
- decoder = field.sql.decoder;
- }
- result[selectionItem.tsKey] = value === null ? null : decoder.mapFromDriverValue(value);
- }
- }
- return result;
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/view-base.js
-class SQLiteViewBase extends View {
- static [entityKind] = "SQLiteViewBase";
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/dialect.js
-class SQLiteDialect {
- static [entityKind] = "SQLiteDialect";
- casing;
- constructor(config) {
- this.casing = new CasingCache(config?.casing);
- }
- escapeName(name) {
- return `"${name}"`;
- }
- escapeParam(_num) {
- return "?";
- }
- escapeString(str) {
- return `'${str.replace(/'/g, "''")}'`;
- }
- buildWithCTE(queries) {
- if (!queries?.length)
- return;
- const withSqlChunks = [sql`with `];
- for (const [i, w] of queries.entries()) {
- withSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);
- if (i < queries.length - 1) {
- withSqlChunks.push(sql`, `);
- }
- }
- withSqlChunks.push(sql` `);
- return sql.join(withSqlChunks);
- }
- buildDeleteQuery({ table, where, returning, withList, limit, orderBy }) {
- const withSql = this.buildWithCTE(withList);
- const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
- const whereSql = where ? sql` where ${where}` : undefined;
- const orderBySql = this.buildOrderBy(orderBy);
- const limitSql = this.buildLimit(limit);
- return sql`${withSql}delete from ${table}${whereSql}${returningSql}${orderBySql}${limitSql}`;
- }
- buildUpdateSet(table, set) {
- const tableColumns = table[Table.Symbol.Columns];
- const columnNames = Object.keys(tableColumns).filter((colName) => set[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined);
- const setSize = columnNames.length;
- return sql.join(columnNames.flatMap((colName, i) => {
- const col = tableColumns[colName];
- const value = set[colName] ?? sql.param(col.onUpdateFn(), col);
- const res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;
- if (i < setSize - 1) {
- return [res, sql.raw(", ")];
- }
- return [res];
- }));
- }
- buildUpdateQuery({ table, set, where, returning, withList, joins, from, limit, orderBy }) {
- const withSql = this.buildWithCTE(withList);
- const setSql = this.buildUpdateSet(table, set);
- const fromSql = from && sql.join([sql.raw(" from "), this.buildFromTable(from)]);
- const joinsSql = this.buildJoins(joins);
- const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
- const whereSql = where ? sql` where ${where}` : undefined;
- const orderBySql = this.buildOrderBy(orderBy);
- const limitSql = this.buildLimit(limit);
- return sql`${withSql}update ${table} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}${orderBySql}${limitSql}`;
- }
- buildSelection(fields, { isSingleTable = false } = {}) {
- const columnsLen = fields.length;
- const chunks = fields.flatMap(({ field }, i) => {
- const chunk = [];
- if (is(field, SQL.Aliased) && field.isSelectionField) {
- chunk.push(sql.identifier(field.fieldAlias));
- } else if (is(field, SQL.Aliased) || is(field, SQL)) {
- const query = is(field, SQL.Aliased) ? field.sql : field;
- if (isSingleTable) {
- chunk.push(new SQL(query.queryChunks.map((c) => {
- if (is(c, Column)) {
- return sql.identifier(this.casing.getColumnCasing(c));
- }
- return c;
- })));
- } else {
- chunk.push(query);
- }
- if (is(field, SQL.Aliased)) {
- chunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);
- }
- } else if (is(field, Column)) {
- const tableName = field.table[Table.Symbol.Name];
- if (field.columnType === "SQLiteNumericBigInt") {
- if (isSingleTable) {
- chunk.push(sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`);
- } else {
- chunk.push(sql`cast(${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))} as text)`);
- }
- } else {
- if (isSingleTable) {
- chunk.push(sql.identifier(this.casing.getColumnCasing(field)));
- } else {
- chunk.push(sql`${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))}`);
- }
- }
- }
- if (i < columnsLen - 1) {
- chunk.push(sql`, `);
- }
- return chunk;
- });
- return sql.join(chunks);
- }
- buildJoins(joins) {
- if (!joins || joins.length === 0) {
- return;
- }
- const joinsArray = [];
- if (joins) {
- for (const [index2, joinMeta] of joins.entries()) {
- if (index2 === 0) {
- joinsArray.push(sql` `);
- }
- const table = joinMeta.table;
- const onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;
- if (is(table, SQLiteTable)) {
- const tableName = table[SQLiteTable.Symbol.Name];
- const tableSchema = table[SQLiteTable.Symbol.Schema];
- const origTableName = table[SQLiteTable.Symbol.OriginalName];
- const alias = tableName === origTableName ? undefined : joinMeta.alias;
- joinsArray.push(sql`${sql.raw(joinMeta.joinType)} join ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${sql.identifier(origTableName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`);
- } else {
- joinsArray.push(sql`${sql.raw(joinMeta.joinType)} join ${table}${onSql}`);
- }
- if (index2 < joins.length - 1) {
- joinsArray.push(sql` `);
- }
- }
- }
- return sql.join(joinsArray);
- }
- buildLimit(limit) {
- return typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : undefined;
- }
- buildOrderBy(orderBy) {
- const orderByList = [];
- if (orderBy) {
- for (const [index2, orderByValue] of orderBy.entries()) {
- orderByList.push(orderByValue);
- if (index2 < orderBy.length - 1) {
- orderByList.push(sql`, `);
- }
- }
- }
- return orderByList.length > 0 ? sql` order by ${sql.join(orderByList)}` : undefined;
- }
- buildFromTable(table) {
- if (is(table, Table) && table[Table.Symbol.IsAlias]) {
- return sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? "")}.`.if(table[Table.Symbol.Schema])}${sql.identifier(table[Table.Symbol.OriginalName])} ${sql.identifier(table[Table.Symbol.Name])}`;
- }
- return table;
- }
- buildSelectQuery({
- withList,
- fields,
- fieldsFlat,
- where,
- having,
- table,
- joins,
- orderBy,
- groupBy,
- limit,
- offset,
- distinct,
- setOperators
- }) {
- const fieldsList = fieldsFlat ?? orderSelectedFields(fields);
- for (const f of fieldsList) {
- if (is(f.field, Column) && getTableName(f.field.table) !== (is(table, Subquery) ? table._.alias : is(table, SQLiteViewBase) ? table[ViewBaseConfig].name : is(table, SQL) ? undefined : getTableName(table)) && !((table2) => joins?.some(({ alias }) => alias === (table2[Table.Symbol.IsAlias] ? getTableName(table2) : table2[Table.Symbol.BaseName])))(f.field.table)) {
- const tableName = getTableName(f.field.table);
- throw new Error(`Your "${f.path.join("->")}" field references a column "${tableName}"."${f.field.name}", but the table "${tableName}" is not part of the query! Did you forget to join it?`);
- }
- }
- const isSingleTable = !joins || joins.length === 0;
- const withSql = this.buildWithCTE(withList);
- const distinctSql = distinct ? sql` distinct` : undefined;
- const selection = this.buildSelection(fieldsList, { isSingleTable });
- const tableSql = this.buildFromTable(table);
- const joinsSql = this.buildJoins(joins);
- const whereSql = where ? sql` where ${where}` : undefined;
- const havingSql = having ? sql` having ${having}` : undefined;
- const groupByList = [];
- if (groupBy) {
- for (const [index2, groupByValue] of groupBy.entries()) {
- groupByList.push(groupByValue);
- if (index2 < groupBy.length - 1) {
- groupByList.push(sql`, `);
- }
- }
- }
- const groupBySql = groupByList.length > 0 ? sql` group by ${sql.join(groupByList)}` : undefined;
- const orderBySql = this.buildOrderBy(orderBy);
- const limitSql = this.buildLimit(limit);
- const offsetSql = offset ? sql` offset ${offset}` : undefined;
- const finalQuery = sql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}`;
- if (setOperators.length > 0) {
- return this.buildSetOperations(finalQuery, setOperators);
- }
- return finalQuery;
- }
- buildSetOperations(leftSelect, setOperators) {
- const [setOperator, ...rest] = setOperators;
- if (!setOperator) {
- throw new Error("Cannot pass undefined values to any set operator");
- }
- if (rest.length === 0) {
- return this.buildSetOperationQuery({ leftSelect, setOperator });
- }
- return this.buildSetOperations(this.buildSetOperationQuery({ leftSelect, setOperator }), rest);
- }
- buildSetOperationQuery({
- leftSelect,
- setOperator: { type, isAll, rightSelect, limit, orderBy, offset }
- }) {
- const leftChunk = sql`${leftSelect.getSQL()} `;
- const rightChunk = sql`${rightSelect.getSQL()}`;
- let orderBySql;
- if (orderBy && orderBy.length > 0) {
- const orderByValues = [];
- for (const singleOrderBy of orderBy) {
- if (is(singleOrderBy, SQLiteColumn)) {
- orderByValues.push(sql.identifier(singleOrderBy.name));
- } else if (is(singleOrderBy, SQL)) {
- for (let i = 0;i < singleOrderBy.queryChunks.length; i++) {
- const chunk = singleOrderBy.queryChunks[i];
- if (is(chunk, SQLiteColumn)) {
- singleOrderBy.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk));
- }
- }
- orderByValues.push(sql`${singleOrderBy}`);
- } else {
- orderByValues.push(sql`${singleOrderBy}`);
- }
- }
- orderBySql = sql` order by ${sql.join(orderByValues, sql`, `)}`;
- }
- const limitSql = typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : undefined;
- const operatorChunk = sql.raw(`${type} ${isAll ? "all " : ""}`);
- const offsetSql = offset ? sql` offset ${offset}` : undefined;
- return sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;
- }
- buildInsertQuery({ table, values: valuesOrSelect, onConflict, returning, withList, select }) {
- const valuesSqlList = [];
- const columns = table[Table.Symbol.Columns];
- const colEntries = Object.entries(columns).filter(([_, col]) => !col.shouldDisableInsert());
- const insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));
- if (select) {
- const select2 = valuesOrSelect;
- if (is(select2, SQL)) {
- valuesSqlList.push(select2);
- } else {
- valuesSqlList.push(select2.getSQL());
- }
- } else {
- const values = valuesOrSelect;
- valuesSqlList.push(sql.raw("values "));
- for (const [valueIndex, value] of values.entries()) {
- const valueList = [];
- for (const [fieldName, col] of colEntries) {
- const colValue = value[fieldName];
- if (colValue === undefined || is(colValue, Param) && colValue.value === undefined) {
- let defaultValue;
- if (col.default !== null && col.default !== undefined) {
- defaultValue = is(col.default, SQL) ? col.default : sql.param(col.default, col);
- } else if (col.defaultFn !== undefined) {
- const defaultFnResult = col.defaultFn();
- defaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);
- } else if (!col.default && col.onUpdateFn !== undefined) {
- const onUpdateFnResult = col.onUpdateFn();
- defaultValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);
- } else {
- defaultValue = sql`null`;
- }
- valueList.push(defaultValue);
- } else {
- valueList.push(colValue);
- }
- }
- valuesSqlList.push(valueList);
- if (valueIndex < values.length - 1) {
- valuesSqlList.push(sql`, `);
- }
- }
- }
- const withSql = this.buildWithCTE(withList);
- const valuesSql = sql.join(valuesSqlList);
- const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
- const onConflictSql = onConflict?.length ? sql.join(onConflict) : undefined;
- return sql`${withSql}insert into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${returningSql}`;
- }
- sqlToQuery(sql2, invokeSource) {
- return sql2.toQuery({
- casing: this.casing,
- escapeName: this.escapeName,
- escapeParam: this.escapeParam,
- escapeString: this.escapeString,
- invokeSource
- });
- }
- buildRelationalQuery({
- fullSchema,
- schema,
- tableNamesMap,
- table,
- tableConfig,
- queryConfig: config,
- tableAlias,
- nestedQueryRelation,
- joinOn
- }) {
- let selection = [];
- let limit, offset, orderBy = [], where;
- const joins = [];
- if (config === true) {
- const selectionEntries = Object.entries(tableConfig.columns);
- selection = selectionEntries.map(([key, value]) => ({
- dbKey: value.name,
- tsKey: key,
- field: aliasedTableColumn(value, tableAlias),
- relationTableTsKey: undefined,
- isJson: false,
- selection: []
- }));
- } else {
- const aliasedColumns = Object.fromEntries(Object.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]));
- if (config.where) {
- const whereSql = typeof config.where === "function" ? config.where(aliasedColumns, getOperators()) : config.where;
- where = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);
- }
- const fieldsSelection = [];
- let selectedColumns = [];
- if (config.columns) {
- let isIncludeMode = false;
- for (const [field, value] of Object.entries(config.columns)) {
- if (value === undefined) {
- continue;
- }
- if (field in tableConfig.columns) {
- if (!isIncludeMode && value === true) {
- isIncludeMode = true;
- }
- selectedColumns.push(field);
- }
- }
- if (selectedColumns.length > 0) {
- selectedColumns = isIncludeMode ? selectedColumns.filter((c) => config.columns?.[c] === true) : Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));
- }
- } else {
- selectedColumns = Object.keys(tableConfig.columns);
- }
- for (const field of selectedColumns) {
- const column = tableConfig.columns[field];
- fieldsSelection.push({ tsKey: field, value: column });
- }
- let selectedRelations = [];
- if (config.with) {
- selectedRelations = Object.entries(config.with).filter((entry) => !!entry[1]).map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey] }));
- }
- let extras;
- if (config.extras) {
- extras = typeof config.extras === "function" ? config.extras(aliasedColumns, { sql }) : config.extras;
- for (const [tsKey, value] of Object.entries(extras)) {
- fieldsSelection.push({
- tsKey,
- value: mapColumnsInAliasedSQLToAlias(value, tableAlias)
- });
- }
- }
- for (const { tsKey, value } of fieldsSelection) {
- selection.push({
- dbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey].name,
- tsKey,
- field: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,
- relationTableTsKey: undefined,
- isJson: false,
- selection: []
- });
- }
- let orderByOrig = typeof config.orderBy === "function" ? config.orderBy(aliasedColumns, getOrderByOperators()) : config.orderBy ?? [];
- if (!Array.isArray(orderByOrig)) {
- orderByOrig = [orderByOrig];
- }
- orderBy = orderByOrig.map((orderByValue) => {
- if (is(orderByValue, Column)) {
- return aliasedTableColumn(orderByValue, tableAlias);
- }
- return mapColumnsInSQLToAlias(orderByValue, tableAlias);
- });
- limit = config.limit;
- offset = config.offset;
- for (const {
- tsKey: selectedRelationTsKey,
- queryConfig: selectedRelationConfigValue,
- relation
- } of selectedRelations) {
- const normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);
- const relationTableName = getTableUniqueName(relation.referencedTable);
- const relationTableTsName = tableNamesMap[relationTableName];
- const relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;
- const joinOn2 = and(...normalizedRelation.fields.map((field2, i) => eq(aliasedTableColumn(normalizedRelation.references[i], relationTableAlias), aliasedTableColumn(field2, tableAlias))));
- const builtRelation = this.buildRelationalQuery({
- fullSchema,
- schema,
- tableNamesMap,
- table: fullSchema[relationTableTsName],
- tableConfig: schema[relationTableTsName],
- queryConfig: is(relation, One) ? selectedRelationConfigValue === true ? { limit: 1 } : { ...selectedRelationConfigValue, limit: 1 } : selectedRelationConfigValue,
- tableAlias: relationTableAlias,
- joinOn: joinOn2,
- nestedQueryRelation: relation
- });
- const field = sql`(${builtRelation.sql})`.as(selectedRelationTsKey);
- selection.push({
- dbKey: selectedRelationTsKey,
- tsKey: selectedRelationTsKey,
- field,
- relationTableTsKey: relationTableTsName,
- isJson: true,
- selection: builtRelation.selection
- });
- }
- }
- if (selection.length === 0) {
- throw new DrizzleError({
- message: `No fields selected for table "${tableConfig.tsName}" ("${tableAlias}"). You need to have at least one item in "columns", "with" or "extras". If you need to select all columns, omit the "columns" key or set it to undefined.`
- });
- }
- let result;
- where = and(joinOn, where);
- if (nestedQueryRelation) {
- let field = sql`json_array(${sql.join(selection.map(({ field: field2 }) => is(field2, SQLiteColumn) ? sql.identifier(this.casing.getColumnCasing(field2)) : is(field2, SQL.Aliased) ? field2.sql : field2), sql`, `)})`;
- if (is(nestedQueryRelation, Many)) {
- field = sql`coalesce(json_group_array(${field}), json_array())`;
- }
- const nestedSelection = [{
- dbKey: "data",
- tsKey: "data",
- field: field.as("data"),
- isJson: true,
- relationTableTsKey: tableConfig.tsName,
- selection
- }];
- const needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;
- if (needsSubquery) {
- result = this.buildSelectQuery({
- table: aliasedTable(table, tableAlias),
- fields: {},
- fieldsFlat: [
- {
- path: [],
- field: sql.raw("*")
- }
- ],
- where,
- limit,
- offset,
- orderBy,
- setOperators: []
- });
- where = undefined;
- limit = undefined;
- offset = undefined;
- orderBy = undefined;
- } else {
- result = aliasedTable(table, tableAlias);
- }
- result = this.buildSelectQuery({
- table: is(result, SQLiteTable) ? result : new Subquery(result, {}, tableAlias),
- fields: {},
- fieldsFlat: nestedSelection.map(({ field: field2 }) => ({
- path: [],
- field: is(field2, Column) ? aliasedTableColumn(field2, tableAlias) : field2
- })),
- joins,
- where,
- limit,
- offset,
- orderBy,
- setOperators: []
- });
- } else {
- result = this.buildSelectQuery({
- table: aliasedTable(table, tableAlias),
- fields: {},
- fieldsFlat: selection.map(({ field }) => ({
- path: [],
- field: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field
- })),
- joins,
- where,
- limit,
- offset,
- orderBy,
- setOperators: []
- });
- }
- return {
- tableTsKey: tableConfig.tsName,
- sql: result,
- selection
- };
- }
-}
-
-class SQLiteSyncDialect extends SQLiteDialect {
- static [entityKind] = "SQLiteSyncDialect";
- migrate(migrations, session, config) {
- const migrationsTable = config === undefined ? "__drizzle_migrations" : typeof config === "string" ? "__drizzle_migrations" : config.migrationsTable ?? "__drizzle_migrations";
- const migrationTableCreate = sql`
- CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (
- id SERIAL PRIMARY KEY,
- hash text NOT NULL,
- created_at numeric
- )
- `;
- session.run(migrationTableCreate);
- const dbMigrations = session.values(sql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`);
- const lastDbMigration = dbMigrations[0] ?? undefined;
- session.run(sql`BEGIN`);
- try {
- for (const migration of migrations) {
- if (!lastDbMigration || Number(lastDbMigration[2]) < migration.folderMillis) {
- for (const stmt of migration.sql) {
- session.run(sql.raw(stmt));
- }
- session.run(sql`INSERT INTO ${sql.identifier(migrationsTable)} ("hash", "created_at") VALUES(${migration.hash}, ${migration.folderMillis})`);
- }
- }
- session.run(sql`COMMIT`);
- } catch (e) {
- session.run(sql`ROLLBACK`);
- throw e;
- }
- }
-}
-
-// ../eve/node_modules/drizzle-orm/query-builders/query-builder.js
-class TypedQueryBuilder {
- static [entityKind] = "TypedQueryBuilder";
- getSelectedFields() {
- return this._.selectedFields;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/select.js
-class SQLiteSelectBuilder {
- static [entityKind] = "SQLiteSelectBuilder";
- fields;
- session;
- dialect;
- withList;
- distinct;
- constructor(config) {
- this.fields = config.fields;
- this.session = config.session;
- this.dialect = config.dialect;
- this.withList = config.withList;
- this.distinct = config.distinct;
- }
- from(source) {
- const isPartialSelect = !!this.fields;
- let fields;
- if (this.fields) {
- fields = this.fields;
- } else if (is(source, Subquery)) {
- fields = Object.fromEntries(Object.keys(source._.selectedFields).map((key) => [key, source[key]]));
- } else if (is(source, SQLiteViewBase)) {
- fields = source[ViewBaseConfig].selectedFields;
- } else if (is(source, SQL)) {
- fields = {};
- } else {
- fields = getTableColumns(source);
- }
- return new SQLiteSelectBase({
- table: source,
- fields,
- isPartialSelect,
- session: this.session,
- dialect: this.dialect,
- withList: this.withList,
- distinct: this.distinct
- });
- }
-}
-
-class SQLiteSelectQueryBuilderBase extends TypedQueryBuilder {
- static [entityKind] = "SQLiteSelectQueryBuilder";
- _;
- config;
- joinsNotNullableMap;
- tableName;
- isPartialSelect;
- session;
- dialect;
- cacheConfig = undefined;
- usedTables = /* @__PURE__ */ new Set;
- constructor({ table, fields, isPartialSelect, session, dialect, withList, distinct }) {
- super();
- this.config = {
- withList,
- table,
- fields: { ...fields },
- distinct,
- setOperators: []
- };
- this.isPartialSelect = isPartialSelect;
- this.session = session;
- this.dialect = dialect;
- this._ = {
- selectedFields: fields,
- config: this.config
- };
- this.tableName = getTableLikeName(table);
- this.joinsNotNullableMap = typeof this.tableName === "string" ? { [this.tableName]: true } : {};
- for (const item of extractUsedTable(table))
- this.usedTables.add(item);
- }
- getUsedTables() {
- return [...this.usedTables];
- }
- createJoin(joinType) {
- return (table, on) => {
- const baseTableName = this.tableName;
- const tableName = getTableLikeName(table);
- for (const item of extractUsedTable(table))
- this.usedTables.add(item);
- if (typeof tableName === "string" && this.config.joins?.some((join) => join.alias === tableName)) {
- throw new Error(`Alias "${tableName}" is already used in this query`);
- }
- if (!this.isPartialSelect) {
- if (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === "string") {
- this.config.fields = {
- [baseTableName]: this.config.fields
- };
- }
- if (typeof tableName === "string" && !is(table, SQL)) {
- const selection = is(table, Subquery) ? table._.selectedFields : is(table, View) ? table[ViewBaseConfig].selectedFields : table[Table.Symbol.Columns];
- this.config.fields[tableName] = selection;
- }
- }
- if (typeof on === "function") {
- on = on(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- if (!this.config.joins) {
- this.config.joins = [];
- }
- this.config.joins.push({ on, table, joinType, alias: tableName });
- if (typeof tableName === "string") {
- switch (joinType) {
- case "left": {
- this.joinsNotNullableMap[tableName] = false;
- break;
- }
- case "right": {
- this.joinsNotNullableMap = Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([key]) => [key, false]));
- this.joinsNotNullableMap[tableName] = true;
- break;
- }
- case "cross":
- case "inner": {
- this.joinsNotNullableMap[tableName] = true;
- break;
- }
- case "full": {
- this.joinsNotNullableMap = Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([key]) => [key, false]));
- this.joinsNotNullableMap[tableName] = false;
- break;
- }
- }
- }
- return this;
- };
- }
- leftJoin = this.createJoin("left");
- rightJoin = this.createJoin("right");
- innerJoin = this.createJoin("inner");
- fullJoin = this.createJoin("full");
- crossJoin = this.createJoin("cross");
- createSetOperator(type, isAll) {
- return (rightSelection) => {
- const rightSelect = typeof rightSelection === "function" ? rightSelection(getSQLiteSetOperators()) : rightSelection;
- if (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) {
- throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");
- }
- this.config.setOperators.push({ type, isAll, rightSelect });
- return this;
- };
- }
- union = this.createSetOperator("union", false);
- unionAll = this.createSetOperator("union", true);
- intersect = this.createSetOperator("intersect", false);
- except = this.createSetOperator("except", false);
- addSetOperators(setOperators) {
- this.config.setOperators.push(...setOperators);
- return this;
- }
- where(where) {
- if (typeof where === "function") {
- where = where(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- this.config.where = where;
- return this;
- }
- having(having) {
- if (typeof having === "function") {
- having = having(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- this.config.having = having;
- return this;
- }
- groupBy(...columns) {
- if (typeof columns[0] === "function") {
- const groupBy = columns[0](new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- this.config.groupBy = Array.isArray(groupBy) ? groupBy : [groupBy];
- } else {
- this.config.groupBy = columns;
- }
- return this;
- }
- orderBy(...columns) {
- if (typeof columns[0] === "function") {
- const orderBy = columns[0](new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).orderBy = orderByArray;
- } else {
- this.config.orderBy = orderByArray;
- }
- } else {
- const orderByArray = columns;
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).orderBy = orderByArray;
- } else {
- this.config.orderBy = orderByArray;
- }
- }
- return this;
- }
- limit(limit) {
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).limit = limit;
- } else {
- this.config.limit = limit;
- }
- return this;
- }
- offset(offset) {
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).offset = offset;
- } else {
- this.config.offset = offset;
- }
- return this;
- }
- getSQL() {
- return this.dialect.buildSelectQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- as(alias) {
- const usedTables = [];
- usedTables.push(...extractUsedTable(this.config.table));
- if (this.config.joins) {
- for (const it of this.config.joins)
- usedTables.push(...extractUsedTable(it.table));
- }
- return new Proxy(new Subquery(this.getSQL(), this.config.fields, alias, false, [...new Set(usedTables)]), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- }
- getSelectedFields() {
- return new Proxy(this.config.fields, new SelectionProxyHandler({ alias: this.tableName, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- }
- $dynamic() {
- return this;
- }
-}
-
-class SQLiteSelectBase extends SQLiteSelectQueryBuilderBase {
- static [entityKind] = "SQLiteSelect";
- _prepare(isOneTimeQuery = true) {
- if (!this.session) {
- throw new Error("Cannot execute a query on a query builder. Please use a database instance instead.");
- }
- const fieldsList = orderSelectedFields(this.config.fields);
- const query = this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), fieldsList, "all", true, undefined, {
- type: "select",
- tables: [...this.usedTables]
- }, this.cacheConfig);
- query.joinsNotNullableMap = this.joinsNotNullableMap;
- return query;
- }
- $withCache(config) {
- this.cacheConfig = config === undefined ? { config: {}, enable: true, autoInvalidate: true } : config === false ? { enable: false } : { enable: true, autoInvalidate: true, ...config };
- return this;
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute() {
- return this.all();
- }
-}
-applyMixins(SQLiteSelectBase, [QueryPromise]);
-function createSetOperator(type, isAll) {
- return (leftSelect, rightSelect, ...restSelects) => {
- const setOperators = [rightSelect, ...restSelects].map((select) => ({
- type,
- isAll,
- rightSelect: select
- }));
- for (const setOperator of setOperators) {
- if (!haveSameKeys(leftSelect.getSelectedFields(), setOperator.rightSelect.getSelectedFields())) {
- throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");
- }
- }
- return leftSelect.addSetOperators(setOperators);
- };
-}
-var getSQLiteSetOperators = () => ({
- union,
- unionAll,
- intersect,
- except
-});
-var union = createSetOperator("union", false);
-var unionAll = createSetOperator("union", true);
-var intersect = createSetOperator("intersect", false);
-var except = createSetOperator("except", false);
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.js
-class QueryBuilder {
- static [entityKind] = "SQLiteQueryBuilder";
- dialect;
- dialectConfig;
- constructor(dialect) {
- this.dialect = is(dialect, SQLiteDialect) ? dialect : undefined;
- this.dialectConfig = is(dialect, SQLiteDialect) ? undefined : dialect;
- }
- $with = (alias, selection) => {
- const queryBuilder = this;
- const as = (qb) => {
- if (typeof qb === "function") {
- qb = qb(queryBuilder);
- }
- return new Proxy(new WithSubquery(qb.getSQL(), selection ?? ("getSelectedFields" in qb ? qb.getSelectedFields() ?? {} : {}), alias, true), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- };
- return { as };
- };
- with(...queries) {
- const self2 = this;
- function select(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: undefined,
- dialect: self2.getDialect(),
- withList: queries
- });
- }
- function selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: undefined,
- dialect: self2.getDialect(),
- withList: queries,
- distinct: true
- });
- }
- return { select, selectDistinct };
- }
- select(fields) {
- return new SQLiteSelectBuilder({ fields: fields ?? undefined, session: undefined, dialect: this.getDialect() });
- }
- selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: undefined,
- dialect: this.getDialect(),
- distinct: true
- });
- }
- getDialect() {
- if (!this.dialect) {
- this.dialect = new SQLiteSyncDialect(this.dialectConfig);
- }
- return this.dialect;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/insert.js
-class SQLiteInsertBuilder {
- constructor(table, session, dialect, withList) {
- this.table = table;
- this.session = session;
- this.dialect = dialect;
- this.withList = withList;
- }
- static [entityKind] = "SQLiteInsertBuilder";
- values(values) {
- values = Array.isArray(values) ? values : [values];
- if (values.length === 0) {
- throw new Error("values() must be called with at least one value");
- }
- const mappedValues = values.map((entry) => {
- const result = {};
- const cols = this.table[Table.Symbol.Columns];
- for (const colKey of Object.keys(entry)) {
- const colValue = entry[colKey];
- result[colKey] = is(colValue, SQL) ? colValue : new Param(colValue, cols[colKey]);
- }
- return result;
- });
- return new SQLiteInsertBase(this.table, mappedValues, this.session, this.dialect, this.withList);
- }
- select(selectQuery) {
- const select = typeof selectQuery === "function" ? selectQuery(new QueryBuilder) : selectQuery;
- if (!is(select, SQL) && !haveSameKeys(this.table[Columns], select._.selectedFields)) {
- throw new Error("Insert select error: selected fields are not the same or are in a different order compared to the table definition");
- }
- return new SQLiteInsertBase(this.table, select, this.session, this.dialect, this.withList, true);
- }
-}
-
-class SQLiteInsertBase extends QueryPromise {
- constructor(table, values, session, dialect, withList, select) {
- super();
- this.session = session;
- this.dialect = dialect;
- this.config = { table, values, withList, select };
- }
- static [entityKind] = "SQLiteInsert";
- config;
- returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) {
- this.config.returning = orderSelectedFields(fields);
- return this;
- }
- onConflictDoNothing(config = {}) {
- if (!this.config.onConflict)
- this.config.onConflict = [];
- if (config.target === undefined) {
- this.config.onConflict.push(sql` on conflict do nothing`);
- } else {
- const targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;
- const whereSql = config.where ? sql` where ${config.where}` : sql``;
- this.config.onConflict.push(sql` on conflict ${targetSql} do nothing${whereSql}`);
- }
- return this;
- }
- onConflictDoUpdate(config) {
- if (config.where && (config.targetWhere || config.setWhere)) {
- throw new Error('You cannot use both "where" and "targetWhere"/"setWhere" at the same time - "where" is deprecated, use "targetWhere" or "setWhere" instead.');
- }
- if (!this.config.onConflict)
- this.config.onConflict = [];
- const whereSql = config.where ? sql` where ${config.where}` : undefined;
- const targetWhereSql = config.targetWhere ? sql` where ${config.targetWhere}` : undefined;
- const setWhereSql = config.setWhere ? sql` where ${config.setWhere}` : undefined;
- const targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;
- const setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));
- this.config.onConflict.push(sql` on conflict ${targetSql}${targetWhereSql} do update set ${setSql}${whereSql}${setWhereSql}`);
- return this;
- }
- getSQL() {
- return this.dialect.buildInsertQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- _prepare(isOneTimeQuery = true) {
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
- type: "insert",
- tables: extractUsedTable(this.config.table)
- });
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute() {
- return this.config.returning ? this.all() : this.run();
- }
- $dynamic() {
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/update.js
-class SQLiteUpdateBuilder {
- constructor(table, session, dialect, withList) {
- this.table = table;
- this.session = session;
- this.dialect = dialect;
- this.withList = withList;
- }
- static [entityKind] = "SQLiteUpdateBuilder";
- set(values) {
- return new SQLiteUpdateBase(this.table, mapUpdateSet(this.table, values), this.session, this.dialect, this.withList);
- }
-}
-
-class SQLiteUpdateBase extends QueryPromise {
- constructor(table, set, session, dialect, withList) {
- super();
- this.session = session;
- this.dialect = dialect;
- this.config = { set, table, withList, joins: [] };
- }
- static [entityKind] = "SQLiteUpdate";
- config;
- from(source) {
- this.config.from = source;
- return this;
- }
- createJoin(joinType) {
- return (table, on) => {
- const tableName = getTableLikeName(table);
- if (typeof tableName === "string" && this.config.joins.some((join) => join.alias === tableName)) {
- throw new Error(`Alias "${tableName}" is already used in this query`);
- }
- if (typeof on === "function") {
- const from = this.config.from ? is(table, SQLiteTable) ? table[Table.Symbol.Columns] : is(table, Subquery) ? table._.selectedFields : is(table, SQLiteViewBase) ? table[ViewBaseConfig].selectedFields : undefined : undefined;
- on = on(new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })), from && new Proxy(from, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- this.config.joins.push({ on, table, joinType, alias: tableName });
- return this;
- };
- }
- leftJoin = this.createJoin("left");
- rightJoin = this.createJoin("right");
- innerJoin = this.createJoin("inner");
- fullJoin = this.createJoin("full");
- where(where) {
- this.config.where = where;
- return this;
- }
- orderBy(...columns) {
- if (typeof columns[0] === "function") {
- const orderBy = columns[0](new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
- this.config.orderBy = orderByArray;
- } else {
- const orderByArray = columns;
- this.config.orderBy = orderByArray;
- }
- return this;
- }
- limit(limit) {
- this.config.limit = limit;
- return this;
- }
- returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) {
- this.config.returning = orderSelectedFields(fields);
- return this;
- }
- getSQL() {
- return this.dialect.buildUpdateQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- _prepare(isOneTimeQuery = true) {
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
- type: "insert",
- tables: extractUsedTable(this.config.table)
- });
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute() {
- return this.config.returning ? this.all() : this.run();
- }
- $dynamic() {
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/count.js
-class SQLiteCountBuilder extends SQL {
- constructor(params) {
- super(SQLiteCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);
- this.params = params;
- this.session = params.session;
- this.sql = SQLiteCountBuilder.buildCount(params.source, params.filters);
- }
- sql;
- static [entityKind] = "SQLiteCountBuilderAsync";
- [Symbol.toStringTag] = "SQLiteCountBuilderAsync";
- session;
- static buildEmbeddedCount(source, filters) {
- return sql`(select count(*) from ${source}${sql.raw(" where ").if(filters)}${filters})`;
- }
- static buildCount(source, filters) {
- return sql`select count(*) from ${source}${sql.raw(" where ").if(filters)}${filters}`;
- }
- then(onfulfilled, onrejected) {
- return Promise.resolve(this.session.count(this.sql)).then(onfulfilled, onrejected);
- }
- catch(onRejected) {
- return this.then(undefined, onRejected);
- }
- finally(onFinally) {
- return this.then((value) => {
- onFinally?.();
- return value;
- }, (reason) => {
- onFinally?.();
- throw reason;
- });
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/query.js
-class RelationalQueryBuilder {
- constructor(mode, fullSchema, schema, tableNamesMap, table, tableConfig, dialect, session) {
- this.mode = mode;
- this.fullSchema = fullSchema;
- this.schema = schema;
- this.tableNamesMap = tableNamesMap;
- this.table = table;
- this.tableConfig = tableConfig;
- this.dialect = dialect;
- this.session = session;
- }
- static [entityKind] = "SQLiteAsyncRelationalQueryBuilder";
- findMany(config) {
- return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? config : {}, "many") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? config : {}, "many");
- }
- findFirst(config) {
- return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? { ...config, limit: 1 } : { limit: 1 }, "first") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? { ...config, limit: 1 } : { limit: 1 }, "first");
- }
-}
-
-class SQLiteRelationalQuery extends QueryPromise {
- constructor(fullSchema, schema, tableNamesMap, table, tableConfig, dialect, session, config, mode) {
- super();
- this.fullSchema = fullSchema;
- this.schema = schema;
- this.tableNamesMap = tableNamesMap;
- this.table = table;
- this.tableConfig = tableConfig;
- this.dialect = dialect;
- this.session = session;
- this.config = config;
- this.mode = mode;
- }
- static [entityKind] = "SQLiteAsyncRelationalQuery";
- mode;
- getSQL() {
- return this.dialect.buildRelationalQuery({
- fullSchema: this.fullSchema,
- schema: this.schema,
- tableNamesMap: this.tableNamesMap,
- table: this.table,
- tableConfig: this.tableConfig,
- queryConfig: this.config,
- tableAlias: this.tableConfig.tsName
- }).sql;
- }
- _prepare(isOneTimeQuery = false) {
- const { query, builtQuery } = this._toSQL();
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](builtQuery, undefined, this.mode === "first" ? "get" : "all", true, (rawRows, mapColumnValue) => {
- const rows = rawRows.map((row) => mapRelationalRow(this.schema, this.tableConfig, row, query.selection, mapColumnValue));
- if (this.mode === "first") {
- return rows[0];
- }
- return rows;
- });
- }
- prepare() {
- return this._prepare(false);
- }
- _toSQL() {
- const query = this.dialect.buildRelationalQuery({
- fullSchema: this.fullSchema,
- schema: this.schema,
- tableNamesMap: this.tableNamesMap,
- table: this.table,
- tableConfig: this.tableConfig,
- queryConfig: this.config,
- tableAlias: this.tableConfig.tsName
- });
- const builtQuery = this.dialect.sqlToQuery(query.sql);
- return { query, builtQuery };
- }
- toSQL() {
- return this._toSQL().builtQuery;
- }
- executeRaw() {
- if (this.mode === "first") {
- return this._prepare(false).get();
- }
- return this._prepare(false).all();
- }
- async execute() {
- return this.executeRaw();
- }
-}
-
-class SQLiteSyncRelationalQuery extends SQLiteRelationalQuery {
- static [entityKind] = "SQLiteSyncRelationalQuery";
- sync() {
- return this.executeRaw();
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/raw.js
-class SQLiteRaw extends QueryPromise {
- constructor(execute, getSQL, action, dialect, mapBatchResult) {
- super();
- this.execute = execute;
- this.getSQL = getSQL;
- this.dialect = dialect;
- this.mapBatchResult = mapBatchResult;
- this.config = { action };
- }
- static [entityKind] = "SQLiteRaw";
- config;
- getQuery() {
- return { ...this.dialect.sqlToQuery(this.getSQL()), method: this.config.action };
- }
- mapResult(result, isFromBatch) {
- return isFromBatch ? this.mapBatchResult(result) : result;
- }
- _prepare() {
- return this;
- }
- isResponseInArrayMode() {
- return false;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/db.js
-class BaseSQLiteDatabase {
- constructor(resultKind, dialect, session, schema) {
- this.resultKind = resultKind;
- this.dialect = dialect;
- this.session = session;
- this._ = schema ? {
- schema: schema.schema,
- fullSchema: schema.fullSchema,
- tableNamesMap: schema.tableNamesMap
- } : {
- schema: undefined,
- fullSchema: {},
- tableNamesMap: {}
- };
- this.query = {};
- const query = this.query;
- if (this._.schema) {
- for (const [tableName, columns] of Object.entries(this._.schema)) {
- query[tableName] = new RelationalQueryBuilder(resultKind, schema.fullSchema, this._.schema, this._.tableNamesMap, schema.fullSchema[tableName], columns, dialect, session);
- }
- }
- this.$cache = { invalidate: async (_params) => {} };
- }
- static [entityKind] = "BaseSQLiteDatabase";
- query;
- $with = (alias, selection) => {
- const self2 = this;
- const as = (qb) => {
- if (typeof qb === "function") {
- qb = qb(new QueryBuilder(self2.dialect));
- }
- return new Proxy(new WithSubquery(qb.getSQL(), selection ?? ("getSelectedFields" in qb ? qb.getSelectedFields() ?? {} : {}), alias, true), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- };
- return { as };
- };
- $count(source, filters) {
- return new SQLiteCountBuilder({ source, filters, session: this.session });
- }
- with(...queries) {
- const self2 = this;
- function select(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: self2.session,
- dialect: self2.dialect,
- withList: queries
- });
- }
- function selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: self2.session,
- dialect: self2.dialect,
- withList: queries,
- distinct: true
- });
- }
- function update(table) {
- return new SQLiteUpdateBuilder(table, self2.session, self2.dialect, queries);
- }
- function insert(into) {
- return new SQLiteInsertBuilder(into, self2.session, self2.dialect, queries);
- }
- function delete_(from) {
- return new SQLiteDeleteBase(from, self2.session, self2.dialect, queries);
- }
- return { select, selectDistinct, update, insert, delete: delete_ };
- }
- select(fields) {
- return new SQLiteSelectBuilder({ fields: fields ?? undefined, session: this.session, dialect: this.dialect });
- }
- selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: this.session,
- dialect: this.dialect,
- distinct: true
- });
- }
- update(table) {
- return new SQLiteUpdateBuilder(table, this.session, this.dialect);
- }
- $cache;
- insert(into) {
- return new SQLiteInsertBuilder(into, this.session, this.dialect);
- }
- delete(from) {
- return new SQLiteDeleteBase(from, this.session, this.dialect);
- }
- run(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.run(sequel), () => sequel, "run", this.dialect, this.session.extractRawRunValueFromBatchResult.bind(this.session));
- }
- return this.session.run(sequel);
- }
- all(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.all(sequel), () => sequel, "all", this.dialect, this.session.extractRawAllValueFromBatchResult.bind(this.session));
- }
- return this.session.all(sequel);
- }
- get(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.get(sequel), () => sequel, "get", this.dialect, this.session.extractRawGetValueFromBatchResult.bind(this.session));
- }
- return this.session.get(sequel);
- }
- values(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.values(sequel), () => sequel, "values", this.dialect, this.session.extractRawValuesValueFromBatchResult.bind(this.session));
- }
- return this.session.values(sequel);
- }
- transaction(transaction, config) {
- return this.session.transaction(transaction, config);
- }
-}
-
-// ../eve/node_modules/drizzle-orm/cache/core/cache.js
-class Cache {
- static [entityKind] = "Cache";
-}
-
-class NoopCache extends Cache {
- strategy() {
- return "all";
- }
- static [entityKind] = "NoopCache";
- async get(_key) {
- return;
- }
- async put(_hashedQuery, _response, _tables, _config) {}
- async onMutate(_params) {}
-}
-async function hashQuery(sql2, params) {
- const dataToHash = `${sql2}-${JSON.stringify(params)}`;
- const encoder = new TextEncoder;
- const data = encoder.encode(dataToHash);
- const hashBuffer = await crypto.subtle.digest("SHA-256", data);
- const hashArray = [...new Uint8Array(hashBuffer)];
- const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
- return hashHex;
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/session.js
-class ExecuteResultSync extends QueryPromise {
- constructor(resultCb) {
- super();
- this.resultCb = resultCb;
- }
- static [entityKind] = "ExecuteResultSync";
- async execute() {
- return this.resultCb();
- }
- sync() {
- return this.resultCb();
- }
-}
-
-class SQLitePreparedQuery {
- constructor(mode, executeMethod, query, cache, queryMetadata, cacheConfig) {
- this.mode = mode;
- this.executeMethod = executeMethod;
- this.query = query;
- this.cache = cache;
- this.queryMetadata = queryMetadata;
- this.cacheConfig = cacheConfig;
- if (cache && cache.strategy() === "all" && cacheConfig === undefined) {
- this.cacheConfig = { enable: true, autoInvalidate: true };
- }
- if (!this.cacheConfig?.enable) {
- this.cacheConfig = undefined;
- }
- }
- static [entityKind] = "PreparedQuery";
- joinsNotNullableMap;
- async queryWithCache(queryString, params, query) {
- if (this.cache === undefined || is(this.cache, NoopCache) || this.queryMetadata === undefined) {
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if (this.cacheConfig && !this.cacheConfig.enable) {
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if ((this.queryMetadata.type === "insert" || this.queryMetadata.type === "update" || this.queryMetadata.type === "delete") && this.queryMetadata.tables.length > 0) {
- try {
- const [res] = await Promise.all([
- query(),
- this.cache.onMutate({ tables: this.queryMetadata.tables })
- ]);
- return res;
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if (!this.cacheConfig) {
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if (this.queryMetadata.type === "select") {
- const fromCache = await this.cache.get(this.cacheConfig.tag ?? await hashQuery(queryString, params), this.queryMetadata.tables, this.cacheConfig.tag !== undefined, this.cacheConfig.autoInvalidate);
- if (fromCache === undefined) {
- let result;
- try {
- result = await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- await this.cache.put(this.cacheConfig.tag ?? await hashQuery(queryString, params), result, this.cacheConfig.autoInvalidate ? this.queryMetadata.tables : [], this.cacheConfig.tag !== undefined, this.cacheConfig.config);
- return result;
- }
- return fromCache;
- }
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- getQuery() {
- return this.query;
- }
- mapRunResult(result, _isFromBatch) {
- return result;
- }
- mapAllResult(_result, _isFromBatch) {
- throw new Error("Not implemented");
- }
- mapGetResult(_result, _isFromBatch) {
- throw new Error("Not implemented");
- }
- execute(placeholderValues) {
- if (this.mode === "async") {
- return this[this.executeMethod](placeholderValues);
- }
- return new ExecuteResultSync(() => this[this.executeMethod](placeholderValues));
- }
- mapResult(response, isFromBatch) {
- switch (this.executeMethod) {
- case "run": {
- return this.mapRunResult(response, isFromBatch);
- }
- case "all": {
- return this.mapAllResult(response, isFromBatch);
- }
- case "get": {
- return this.mapGetResult(response, isFromBatch);
- }
- }
- }
-}
-
-class SQLiteSession {
- constructor(dialect) {
- this.dialect = dialect;
- }
- static [entityKind] = "SQLiteSession";
- prepareOneTimeQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper, queryMetadata, cacheConfig) {
- return this.prepareQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper, queryMetadata, cacheConfig);
- }
- run(query) {
- const staticQuery = this.dialect.sqlToQuery(query);
- try {
- return this.prepareOneTimeQuery(staticQuery, undefined, "run", false).run();
- } catch (err) {
- throw new DrizzleError({ cause: err, message: `Failed to run the query '${staticQuery.sql}'` });
- }
- }
- extractRawRunValueFromBatchResult(result) {
- return result;
- }
- all(query) {
- return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).all();
- }
- extractRawAllValueFromBatchResult(_result) {
- throw new Error("Not implemented");
- }
- get(query) {
- return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).get();
- }
- extractRawGetValueFromBatchResult(_result) {
- throw new Error("Not implemented");
- }
- values(query) {
- return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).values();
- }
- async count(sql2) {
- const result = await this.values(sql2);
- return result[0][0];
- }
- extractRawValuesValueFromBatchResult(_result) {
- throw new Error("Not implemented");
- }
-}
-
-class SQLiteTransaction extends BaseSQLiteDatabase {
- constructor(resultType, dialect, session, schema, nestedIndex = 0) {
- super(resultType, dialect, session, schema);
- this.schema = schema;
- this.nestedIndex = nestedIndex;
- }
- static [entityKind] = "SQLiteTransaction";
- rollback() {
- throw new TransactionRollbackError;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/logger.js
-class ConsoleLogWriter {
- static [entityKind] = "ConsoleLogWriter";
- write(message) {
- console.log(message);
- }
-}
-
-class DefaultLogger {
- static [entityKind] = "DefaultLogger";
- writer;
- constructor(config) {
- this.writer = config?.writer ?? new ConsoleLogWriter;
- }
- logQuery(query, params) {
- const stringifiedParams = params.map((p) => {
- try {
- return JSON.stringify(p);
- } catch {
- return String(p);
- }
- });
- const paramsStr = stringifiedParams.length ? ` -- params: [${stringifiedParams.join(", ")}]` : "";
- this.writer.write(`Query: ${query}${paramsStr}`);
- }
-}
-
-class NoopLogger {
- static [entityKind] = "NoopLogger";
- logQuery() {}
-}
-
-// ../eve/dist/db/schema.js
-var schema_exports = {};
-__export(schema_exports, {
- characters: () => characters,
- charactersRelations: () => charactersRelations,
- miningFleetParticipants: () => miningFleetParticipants,
- miningFleetParticipantsRelations: () => miningFleetParticipantsRelations,
- miningFleets: () => miningFleets,
- miningFleetsRelations: () => miningFleetsRelations,
- resumeCommands: () => resumeCommands,
- shared: () => shared,
- users: () => users,
- usersRelations: () => usersRelations
-});
-var shared = {
- createdAt: integer("created_at").notNull(),
- updatedAt: integer("updated_at")
-};
-var users = sqliteTable("users", {
- id: integer().primaryKey().unique().notNull(),
- discordID: text("discord_id").unique().notNull(),
- mainCharacter: integer("main_character"),
- ...shared
-}, (table) => [index("idx_discord_id").on(table.discordID), index("idx_main_character").on(table.mainCharacter)]);
-var usersRelations = relations(users, ({ one, many }) => ({
- characters: many(characters),
- main: one(characters, {
- fields: [users.mainCharacter],
- references: [characters.id]
- })
-}));
-var characters = sqliteTable("characters", {
- id: integer("id").primaryKey({ autoIncrement: true }),
- eveID: integer("eve_id").notNull(),
- userID: integer("user_id").notNull(),
- name: text().notNull(),
- accessToken: text("access_token").notNull(),
- expiresAt: integer("expires_at").notNull(),
- refreshToken: text("refresh_token").notNull(),
- ...shared
-}, (table) => [index("idx_user_id").on(table.userID), index("idx_eve_id").on(table.eveID)]);
-var charactersRelations = relations(characters, ({ one }) => ({ user: one(users, {
- fields: [characters.userID],
- references: [users.id]
-}) }));
-var resumeCommands = sqliteTable("resumecommands", {
- id: text().primaryKey(),
- command: text().notNull(),
- params: text().notNull(),
- context: text().notNull(),
- ...shared
-});
-var miningFleets = sqliteTable("mining_fleets", {
- id: integer("id").primaryKey({ autoIncrement: true }),
- name: text("name").notNull(),
- description: text("description"),
- creatorDiscordId: text("creator_discord_id").notNull(),
- startTime: integer("start_time").notNull(),
- endTime: integer("end_time"),
- status: text("status", { enum: [
- "configuring",
- "active",
- "ended",
- "generating_report",
- "completed",
- "failed"
- ] }).notNull().default("configuring"),
- taxRate: real("tax_rate").notNull().default(0),
- publicMessageId: text("public_message_id").unique(),
- publicChannelId: text("public_channel_id"),
- reportData: text("report_data"),
- creatorEphemeralMessageId: text("creator_ephemeral_message_id"),
- ...shared
-}, (table) => [
- index("idx_fleet_creator_discord_id").on(table.creatorDiscordId),
- index("idx_fleet_status").on(table.status),
- index("idx_fleet_public_message_id").on(table.publicMessageId)
-]);
-var miningFleetParticipants = sqliteTable("mining_fleet_participants", {
- id: integer("id").primaryKey({ autoIncrement: true }),
- fleetId: integer("fleet_id").notNull().references(() => miningFleets.id, { onDelete: "cascade" }),
- characterId: integer("character_id").notNull().references(() => characters.id, { onDelete: "cascade" }),
- discordId: text("discord_id").notNull(),
- role: text("role", { enum: [
- "miner",
- "security",
- "hauler"
- ] }).notNull(),
- joinTime: integer("join_time").notNull(),
- ...shared
-}, (table) => [
- index("idx_participant_fleet_id").on(table.fleetId),
- index("idx_participant_character_id").on(table.characterId),
- index("idx_participant_discord_id").on(table.discordId)
-]);
-var miningFleetsRelations = relations(miningFleets, ({ many }) => ({ participants: many(miningFleetParticipants) }));
-var miningFleetParticipantsRelations = relations(miningFleetParticipants, ({ one }) => ({
- fleet: one(miningFleets, {
- fields: [miningFleetParticipants.fleetId],
- references: [miningFleets.id]
- }),
- character: one(characters, {
- fields: [miningFleetParticipants.characterId],
- references: [characters.id]
- })
-}));
-
-// ../eve/dist/esi/options.js
-var CLIENT_ID = process.env.EVE_CLIENT_ID || "";
-var CLIENT_SECRET = process.env.EVE_CLIENT_SECRET || "";
-var CALLBACK_URL = process.env.EVE_CALLBACK_URL || "";
-var USER_AGENT = process.env.ESI_USER_AGENT || "";
-var options = {
- client_id: CLIENT_ID,
- client_secret: CLIENT_SECRET,
- callback_url: CALLBACK_URL,
- user_agent: USER_AGENT
-};
-
-// ../eve/node_modules/jwt-decode/build/esm/index.js
-class InvalidTokenError extends Error {
-}
-InvalidTokenError.prototype.name = "InvalidTokenError";
-function b64DecodeUnicode(str) {
- return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {
- let code = p.charCodeAt(0).toString(16).toUpperCase();
- if (code.length < 2) {
- code = "0" + code;
- }
- return "%" + code;
- }));
-}
-function base64UrlDecode(str) {
- let output = str.replace(/-/g, "+").replace(/_/g, "/");
- switch (output.length % 4) {
- case 0:
- break;
- case 2:
- output += "==";
- break;
- case 3:
- output += "=";
- break;
- default:
- throw new Error("base64 string is not of the correct length");
- }
- try {
- return b64DecodeUnicode(output);
- } catch (err) {
- return atob(output);
- }
-}
-function jwtDecode(token, options2) {
- if (typeof token !== "string") {
- throw new InvalidTokenError("Invalid token specified: must be a string");
- }
- options2 || (options2 = {});
- const pos = options2.header === true ? 0 : 1;
- const part = token.split(".")[pos];
- if (typeof part !== "string") {
- throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);
- }
- let decoded;
- try {
- decoded = base64UrlDecode(part);
- } catch (e) {
- throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);
- }
- try {
- return JSON.parse(decoded);
- } catch (e) {
- throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);
- }
-}
-// ../eve/node_modules/@oslojs/encoding/dist/base32.js
-var EncodingPadding;
-(function(EncodingPadding2) {
- EncodingPadding2[EncodingPadding2["Include"] = 0] = "Include";
- EncodingPadding2[EncodingPadding2["None"] = 1] = "None";
-})(EncodingPadding || (EncodingPadding = {}));
-var DecodingPadding;
-(function(DecodingPadding2) {
- DecodingPadding2[DecodingPadding2["Required"] = 0] = "Required";
- DecodingPadding2[DecodingPadding2["Ignore"] = 1] = "Ignore";
-})(DecodingPadding || (DecodingPadding = {}));
-// ../eve/node_modules/@oslojs/encoding/dist/base64.js
-function encodeBase64urlNoPadding(bytes) {
- return encodeBase64_internal(bytes, base64urlAlphabet, EncodingPadding2.None);
-}
-function encodeBase64_internal(bytes, alphabet, padding) {
- let result = "";
- for (let i = 0;i < bytes.byteLength; i += 3) {
- let buffer = 0;
- let bufferBitSize = 0;
- for (let j = 0;j < 3 && i + j < bytes.byteLength; j++) {
- buffer = buffer << 8 | bytes[i + j];
- bufferBitSize += 8;
- }
- for (let j = 0;j < 4; j++) {
- if (bufferBitSize >= 6) {
- result += alphabet[buffer >> bufferBitSize - 6 & 63];
- bufferBitSize -= 6;
- } else if (bufferBitSize > 0) {
- result += alphabet[buffer << 6 - bufferBitSize & 63];
- bufferBitSize = 0;
- } else if (padding === EncodingPadding2.Include) {
- result += "=";
- }
- }
- }
- return result;
-}
-var base64urlAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
-var EncodingPadding2;
-(function(EncodingPadding3) {
- EncodingPadding3[EncodingPadding3["Include"] = 0] = "Include";
- EncodingPadding3[EncodingPadding3["None"] = 1] = "None";
-})(EncodingPadding2 || (EncodingPadding2 = {}));
-var DecodingPadding2;
-(function(DecodingPadding3) {
- DecodingPadding3[DecodingPadding3["Required"] = 0] = "Required";
- DecodingPadding3[DecodingPadding3["Ignore"] = 1] = "Ignore";
-})(DecodingPadding2 || (DecodingPadding2 = {}));
-// ../eve/dist/esi/auth.js
-var import_jsonwebtoken = __toESM(require_jsonwebtoken(), 1);
-var import_jwk_to_pem = __toESM(require_jwk_to_pem(), 1);
-var auth_exports = {};
-__export(auth_exports, {
- characterIdFromToken: () => characterIdFromToken,
- createAuthorizationURL: () => createAuthorizationURL,
- refresh: () => refresh,
- validateAuthorizationCode: () => validateAuthorizationCode,
- validateToken: () => validateToken
-});
-function generateState() {
- const randomValues = new Uint8Array(32);
- crypto.getRandomValues(randomValues);
- return encodeBase64urlNoPadding(randomValues);
-}
-async function createAuthorizationURL(scopes = "publicData") {
- const state = generateState();
- const url = new URL("https://login.eveonline.com/v2/oauth/authorize/");
- url.searchParams.set("response_type", "code");
- url.searchParams.set("redirect_uri", options.callback_url);
- url.searchParams.set("client_id", options.client_id);
- url.searchParams.set("state", state);
- url.searchParams.set("scope", Array.isArray(scopes) ? scopes.join(" ") : scopes);
- return {
- url,
- state
- };
-}
-async function validateAuthorizationCode(code) {
- try {
- const response = await fetch("https://login.eveonline.com/v2/oauth/token", {
- method: "POST",
- headers: {
- "Content-Type": "application/x-www-form-urlencoded",
- Authorization: `Basic ${Buffer.from(`${options.client_id}:${options.client_secret}`).toString("base64")}`
- },
- body: new URLSearchParams({
- grant_type: "authorization_code",
- code
- })
- });
- return await response.json();
- } catch (error) {
- console.error(`failed to validate EVE authorization code`, error);
- throw `${error}`;
- }
-}
-var eveAuthPublicKey;
-async function validateToken(token) {
- if (!eveAuthPublicKey)
- try {
- const eveJWKS = await (await fetch("https://login.eveonline.com/oauth/jwks")).json();
- eveAuthPublicKey = import_jwk_to_pem.default(eveJWKS.keys[0]);
- } catch (err) {
- console.error(`failed to get EVE Auth public keys`, err);
- }
- try {
- const decoded = import_jsonwebtoken.default.verify(token, eveAuthPublicKey);
- return decoded;
- } catch (err) {
- console.error(`failed to validate EVE token`, err);
- return null;
- }
-}
-async function refresh({ refresh_token }, scopes) {
- const params = {
- grant_type: "refresh_token",
- refresh_token,
- scope: ""
- };
- if (scopes)
- params["scope"] = Array.isArray(scopes) ? scopes.join(" ") : scopes;
- const response = await fetch("https://login.eveonline.com/v2/oauth/token", {
- method: "POST",
- headers: {
- "Content-Type": "application/x-www-form-urlencoded",
- Authorization: `Basic ${Buffer.from(`${options.client_id}:${options.client_secret}`).toString("base64")}`
- },
- body: new URLSearchParams(params)
- });
- return await response.json();
-}
-function characterIdFromToken(token) {
- const payload = jwtDecode(token);
- return parseInt(payload.sub.split(":")[2]);
-}
-
-// ../eve/dist/db/models/character.model.js
-var CharacterHelper = class CharacterHelper2 {
- static hasValidToken(character) {
- return /* @__PURE__ */ new Date < character.expiresAt;
- }
- static getScopes(character) {
- const decoded = jwtDecode(character.accessToken);
- return typeof decoded.scp === "string" ? [decoded.scp] : decoded.scp;
- }
- static hasOnlyPublicScope(character) {
- return this.getScopes(character).length === 1 && this.hasScope(character, "publicData");
- }
- static getTokens(character) {
- return {
- access_token: character.accessToken,
- refresh_token: character.refreshToken,
- expires_in: (character.expiresAt.getTime() - Date.now()) / 1000
- };
- }
- static hasScope(character, scope) {
- return this.getScopes(character).includes(scope);
- }
- static hasAllScopes(character, scopes) {
- const has = this.getScopes(character);
- return scopes.every((scope) => has.includes(scope));
- }
- static find(id) {
- const result = db.select().from(characters).where(eq(characters.id, id)).limit(1).get();
- const c = this.createCharacters(result);
- return c ? c[0] : undefined;
- }
- static findByUser(user) {
- const result = db.select().from(characters).where(eq(characters.userID, user.id)).all();
- return this.createCharacters(result);
- }
- static findByUserAndEveID(userID, eveID) {
- const result = db.select().from(characters).where(and(eq(characters.userID, userID), eq(characters.eveID, eveID))).limit(1).get();
- const c = this.createCharacters(result);
- return c ? c[0] : undefined;
- }
- static findByName(userID, name) {
- const result = db.select().from(characters).where(and(eq(characters.name, name), eq(characters.userID, userID))).limit(1).get();
- const c = this.createCharacters(result);
- return c ? c[0] : undefined;
- }
- static findAll() {
- const result = db.select().from(characters).all();
- return this.createCharacters(result);
- }
- static create(eveID, name, user, tokens) {
- return this.save({
- eveID,
- userID: user.id,
- accessToken: tokens.access_token,
- expiresAt: /* @__PURE__ */ new Date(tokens.expires_in * 1000),
- refreshToken: tokens.refresh_token,
- name,
- createdAt: /* @__PURE__ */ new Date
- });
- }
- static createCharacters(query) {
- if (!query)
- return [];
- if (Array.isArray(query))
- return query.map((character) => {
- return {
- id: character.id,
- eveID: character.eveID,
- userID: character.userID,
- accessToken: character.accessToken,
- expiresAt: new Date(character.expiresAt),
- refreshToken: character.refreshToken,
- name: character.name,
- createdAt: new Date(character.createdAt),
- updatedAt: new Date(character.updatedAt)
- };
- });
- else
- return [{
- id: query.id,
- eveID: query.eveID,
- userID: query.userID,
- accessToken: query.accessToken,
- expiresAt: new Date(query.expiresAt),
- refreshToken: query.refreshToken,
- name: query.name,
- createdAt: new Date(query.createdAt),
- updatedAt: new Date(query.updatedAt)
- }];
- }
- static save(character) {
- db.insert(characters).values({
- id: character.id,
- eveID: character.eveID,
- userID: character.userID,
- name: character.name,
- accessToken: character.accessToken,
- expiresAt: character.expiresAt.getTime(),
- refreshToken: character.refreshToken,
- createdAt: Date.now(),
- updatedAt: Date.now()
- }).onConflictDoUpdate({
- target: characters.id,
- set: {
- eveID: character.eveID,
- userID: character.userID,
- name: character.name,
- accessToken: character.accessToken,
- expiresAt: character.expiresAt.getTime(),
- refreshToken: character.refreshToken,
- updatedAt: Date.now()
- }
- }).run();
- return CharacterHelper2.findByUserAndEveID(character.userID, character.eveID);
- }
- static delete(character) {
- db.delete(characters).where(eq(characters.id, character.id)).run();
- }
- static async refreshTokens(character, scopes) {
- const tokens = await refresh({ refresh_token: character.refreshToken }, scopes);
- const decoded = await validateToken(tokens.access_token);
- if (!decoded) {
- console.error(`Failed to validate token for character ${character.eveID}`);
- return character;
- }
- character.accessToken = tokens.access_token;
- character.expiresAt = new Date(Date.now() + tokens.expires_in * 1000);
- character.refreshToken = tokens.refresh_token;
- this.save(character);
- return character;
- }
-};
-
-// ../eve/dist/db/models/user.model.js
-var UserHelper = class {
- static find(id) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).where(eq(users.id, id)).leftJoin(characters, eq(users.id, characters.userID)).get();
- return this.createFromQuery(result);
- }
- static findByDiscordId(id) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).where(eq(users.discordID, id)).leftJoin(characters, eq(users.id, characters.userID)).get();
- return this.createFromQuery(result);
- }
- static findAll() {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).leftJoin(characters, eq(users.id, characters.userID)).all();
- return this.createFromQuery(result);
- }
- static findByCharacterId(id) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).leftJoin(characters, eq(users.id, characters.userID)).where(eq(characters.id, id)).all();
- return this.createFromQuery(result);
- }
- static findByCharacterName(name) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).leftJoin(characters, eq(users.id, characters.userID)).where(eq(characters.name, name)).all();
- return this.createFromQuery(result);
- }
- static createFromQuery(query) {
- if (!query)
- return [];
- if (Array.isArray(query))
- return query.map((user) => {
- return {
- id: user.id,
- discordID: user.discordID,
- createdAt: new Date(user.createdAt),
- updatedAt: new Date(user.updatedAt),
- characterIDs: user.characterIDsString ? JSON.parse(user.characterIDsString ?? "[]").map((s) => Number(s)).sort() : [],
- mainCharacterID: user.mainCharacterID
- };
- });
- else
- return {
- id: query.id,
- discordID: query.discordID,
- createdAt: new Date(query.createdAt),
- updatedAt: new Date(query.updatedAt),
- characterIDs: query.characterIDsString ? JSON.parse(query.characterIDsString ?? "[]").map((s) => Number(s)).sort() : [],
- mainCharacterID: query.mainCharacterID
- };
- }
- static create(discordID) {
- this.save({
- discordID,
- createdAt: /* @__PURE__ */ new Date,
- updatedAt: /* @__PURE__ */ new Date
- });
- return this.findByDiscordId(discordID);
- }
- static save(user) {
- db.insert(users).values({
- id: user.id,
- discordID: user.discordID,
- mainCharacter: user.mainCharacterID,
- createdAt: user.createdAt.getTime(),
- updatedAt: user.updatedAt.getTime()
- }).onConflictDoUpdate({
- target: users.id,
- set: {
- discordID: user.discordID,
- mainCharacter: user.mainCharacterID,
- updatedAt: user.updatedAt.getTime()
- }
- }).run();
- return user;
- }
- static delete(user) {
- db.delete(users).where(eq(users.id, user.id)).run();
- }
- static getCharacter(user, index2) {
- if (!user.characterIDs)
- return;
- if (index2 >= user.characterIDs.length)
- return;
- return CharacterHelper.find(user.characterIDs[index2]);
- }
-};
-
-// ../eve/dist/db/models/resume-command.model.js
-var ResumeCommand = class ResumeCommand2 {
- id;
- command;
- params;
- context;
- created = /* @__PURE__ */ new Date;
- constructor() {
- this.created = /* @__PURE__ */ new Date;
- }
- static find(messageId) {
- const result = db.select().from(resumeCommands).where(eq(resumeCommands.id, messageId)).get();
- return this.createFromQuery(result);
- }
- static create(messageId, command, params = {}, context = {}) {
- const resume = new ResumeCommand2;
- resume.id = messageId;
- resume.command = command;
- resume.params = JSON.stringify(params);
- resume.context = JSON.stringify(context);
- return resume;
- }
- static createFromQuery(query) {
- if (!query)
- return null;
- const resume = new ResumeCommand2;
- resume.id = query.id;
- resume.command = query.command;
- resume.params = query.params;
- resume.context = query.context;
- resume.created = query.created;
- return resume;
- }
- save() {
- db.insert(resumeCommands).values({
- id: this.id,
- command: this.command,
- params: this.params,
- context: this.context,
- createdAt: this.created.getTime()
- }).onConflictDoUpdate({
- target: resumeCommands.id,
- set: {
- command: this.command,
- params: this.params,
- context: this.context
- }
- }).run();
- return this;
- }
- delete() {
- db.delete(resumeCommands).where(eq(resumeCommands.id, this.id)).run();
- }
- static delete(messageId) {
- db.delete(resumeCommands).where(eq(resumeCommands.id, messageId)).run();
- }
-};
-
-// ../eve/dist/db/models/index.js
-var models_exports = {};
-__export(models_exports, {
- CharacterHelper: () => CharacterHelper,
- ResumeCommand: () => ResumeCommand,
- UserHelper: () => UserHelper
-});
-
-// ../eve/node_modules/drizzle-orm/bun-sqlite/driver.js
-import { Database } from "bun:sqlite";
-
-// ../eve/node_modules/drizzle-orm/bun-sqlite/session.js
-class SQLiteBunSession extends SQLiteSession {
- constructor(client, dialect, schema, options2 = {}) {
- super(dialect);
- this.client = client;
- this.schema = schema;
- this.logger = options2.logger ?? new NoopLogger;
- }
- static [entityKind] = "SQLiteBunSession";
- logger;
- exec(query) {
- this.client.exec(query);
- }
- prepareQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper) {
- const stmt = this.client.prepare(query.sql);
- return new PreparedQuery(stmt, query, this.logger, fields, executeMethod, isResponseInArrayMode, customResultMapper);
- }
- transaction(transaction, config = {}) {
- const tx = new SQLiteBunTransaction("sync", this.dialect, this, this.schema);
- let result;
- const nativeTx = this.client.transaction(() => {
- result = transaction(tx);
- });
- nativeTx[config.behavior ?? "deferred"]();
- return result;
- }
-}
-
-class SQLiteBunTransaction extends SQLiteTransaction {
- static [entityKind] = "SQLiteBunTransaction";
- transaction(transaction) {
- const savepointName = `sp${this.nestedIndex}`;
- const tx = new SQLiteBunTransaction("sync", this.dialect, this.session, this.schema, this.nestedIndex + 1);
- this.session.run(sql.raw(`savepoint ${savepointName}`));
- try {
- const result = transaction(tx);
- this.session.run(sql.raw(`release savepoint ${savepointName}`));
- return result;
- } catch (err) {
- this.session.run(sql.raw(`rollback to savepoint ${savepointName}`));
- throw err;
- }
- }
-}
-
-class PreparedQuery extends SQLitePreparedQuery {
- constructor(stmt, query, logger, fields, executeMethod, _isResponseInArrayMode, customResultMapper) {
- super("sync", executeMethod, query);
- this.stmt = stmt;
- this.logger = logger;
- this.fields = fields;
- this._isResponseInArrayMode = _isResponseInArrayMode;
- this.customResultMapper = customResultMapper;
- }
- static [entityKind] = "SQLiteBunPreparedQuery";
- run(placeholderValues) {
- const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
- this.logger.logQuery(this.query.sql, params);
- return this.stmt.run(...params);
- }
- all(placeholderValues) {
- const { fields, query, logger, joinsNotNullableMap, stmt, customResultMapper } = this;
- if (!fields && !customResultMapper) {
- const params = fillPlaceholders(query.params, placeholderValues ?? {});
- logger.logQuery(query.sql, params);
- return stmt.all(...params);
- }
- const rows = this.values(placeholderValues);
- if (customResultMapper) {
- return customResultMapper(rows);
- }
- return rows.map((row) => mapResultRow(fields, row, joinsNotNullableMap));
- }
- get(placeholderValues) {
- const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
- this.logger.logQuery(this.query.sql, params);
- const row = this.stmt.values(...params)[0];
- if (!row) {
- return;
- }
- const { fields, joinsNotNullableMap, customResultMapper } = this;
- if (!fields && !customResultMapper) {
- return row;
- }
- if (customResultMapper) {
- return customResultMapper([row]);
- }
- return mapResultRow(fields, row, joinsNotNullableMap);
- }
- values(placeholderValues) {
- const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
- this.logger.logQuery(this.query.sql, params);
- return this.stmt.values(...params);
- }
- isResponseInArrayMode() {
- return this._isResponseInArrayMode;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/bun-sqlite/driver.js
-class BunSQLiteDatabase extends BaseSQLiteDatabase {
- static [entityKind] = "BunSQLiteDatabase";
-}
-function construct(client, config = {}) {
- const dialect = new SQLiteSyncDialect({ casing: config.casing });
- let logger;
- if (config.logger === true) {
- logger = new DefaultLogger;
- } else if (config.logger !== false) {
- logger = config.logger;
- }
- let schema;
- if (config.schema) {
- const tablesConfig = extractTablesRelationalConfig(config.schema, createTableRelationsHelpers);
- schema = {
- fullSchema: config.schema,
- schema: tablesConfig.tables,
- tableNamesMap: tablesConfig.tableNamesMap
- };
- }
- const session = new SQLiteBunSession(client, dialect, schema, { logger });
- const db2 = new BunSQLiteDatabase("sync", dialect, session, schema);
- db2.$client = client;
- return db2;
-}
-function drizzle(...params) {
- if (params[0] === undefined || typeof params[0] === "string") {
- const instance = params[0] === undefined ? new Database : new Database(params[0]);
- return construct(instance, params[1]);
- }
- if (isConfig(params[0])) {
- const { connection, client, ...drizzleConfig } = params[0];
- if (client)
- return construct(client, drizzleConfig);
- if (typeof connection === "object") {
- const { source, ...opts } = connection;
- const options2 = Object.values(opts).filter((v) => v !== undefined).length ? opts : undefined;
- const instance2 = new Database(source, options2);
- return construct(instance2, drizzleConfig);
- }
- const instance = new Database(connection);
- return construct(instance, drizzleConfig);
- }
- return construct(params[0], params[1]);
-}
-((drizzle2) => {
- function mock(config) {
- return construct({}, config);
- }
- drizzle2.mock = mock;
-})(drizzle || (drizzle = {}));
-
-// ../eve/dist/db/index.js
-import { Database as Database2 } from "bun:sqlite";
-import { join } from "path";
-var DB_PATH = process.env.AUTH_DB_PATH || join(process.cwd(), "../../db/kitten.db");
-console.log("Using DB_PATH:", DB_PATH);
-var sqlite = new Database2(DB_PATH);
-var db = drizzle(sqlite, { schema: {
- users,
- characters,
- resumeCommands,
- miningFleets,
- miningFleetParticipants
-} });
-
-// ../eve/dist/esi/scopes.js
-var ESI_LATEST_URL = "https://esi.evetech.net/latest";
-function joinScopes(...scopes) {
- return scopes.join(" ");
-}
-var SCOPES = /* @__PURE__ */ function(SCOPES$1) {
- SCOPES$1["PUBLIC_DATA"] = "publicData";
- SCOPES$1["CALENDAR_RESPOND_CALENDAR_EVENTS"] = "esi-calendar.respond_calendar_events.v1";
- SCOPES$1["CALENDAR_READ_CALENDAR_EVENTS"] = "esi-calendar.read_calendar_events.v1";
- SCOPES$1["LOCATION_READ_LOCATION"] = "esi-location.read_location.v1";
- SCOPES$1["LOCATION_READ_SHIP_TYPE"] = "esi-location.read_ship_type.v1";
- SCOPES$1["MAIL_ORGANIZE_MAIL"] = "esi-mail.organize_mail.v1";
- SCOPES$1["MAIL_READ_MAIL"] = "esi-mail.read_mail.v1";
- SCOPES$1["MAIL_SEND_MAIL"] = "esi-mail.send_mail.v1";
- SCOPES$1["SKILLS_READ_SKILLS"] = "esi-skills.read_skills.v1";
- SCOPES$1["SKILLS_READ_SKILLQUEUE"] = "esi-skills.read_skillqueue.v1";
- SCOPES$1["WALLET_READ_CHARACTER_WALLET"] = "esi-wallet.read_character_wallet.v1";
- SCOPES$1["WALLET_READ_CORPORATION_WALLET"] = "esi-wallet.read_corporation_wallet.v1";
- SCOPES$1["SEARCH_SEARCH_STRUCTURES"] = "esi-search.search_structures.v1";
- SCOPES$1["CLONES_READ_CLONES"] = "esi-clones.read_clones.v1";
- SCOPES$1["CHARACTERS_READ_CONTACTS"] = "esi-characters.read_contacts.v1";
- SCOPES$1["UNIVERSE_READ_STRUCTURES"] = "esi-universe.read_structures.v1";
- SCOPES$1["KILLMAILS_READ_KILLMAILS"] = "esi-killmails.read_killmails.v1";
- SCOPES$1["CORPORATIONS_READ_CORPORATION_MEMBERSHIP"] = "esi-corporations.read_corporation_membership.v1";
- SCOPES$1["ASSETS_READ_ASSETS"] = "esi-assets.read_assets.v1";
- SCOPES$1["PLANETS_MANAGE_PLANETS"] = "esi-planets.manage_planets.v1";
- SCOPES$1["FLEETS_READ_FLEET"] = "esi-fleets.read_fleet.v1";
- SCOPES$1["FLEETS_WRITE_FLEET"] = "esi-fleets.write_fleet.v1";
- SCOPES$1["UI_OPEN_WINDOW"] = "esi-ui.open_window.v1";
- SCOPES$1["UI_WRITE_WAYPOINT"] = "esi-ui.write_waypoint.v1";
- SCOPES$1["CHARACTERS_WRITE_CONTACTS"] = "esi-characters.write_contacts.v1";
- SCOPES$1["FITTINGS_READ_FITTINGS"] = "esi-fittings.read_fittings.v1";
- SCOPES$1["FITTINGS_WRITE_FITTINGS"] = "esi-fittings.write_fittings.v1";
- SCOPES$1["MARKETS_STRUCTURE_MARKETS"] = "esi-markets.structure_markets.v1";
- SCOPES$1["CORPORATIONS_READ_STRUCTURES"] = "esi-corporations.read_structures.v1";
- SCOPES$1["CHARACTERS_READ_LOYALTY"] = "esi-characters.read_loyalty.v1";
- SCOPES$1["CHARACTERS_READ_OPPORTUNITIES"] = "esi-characters.read_opportunities.v1";
- SCOPES$1["CHARACTERS_READ_CHAT_CHANNELS"] = "esi-characters.read_chat_channels.v1";
- SCOPES$1["CHARACTERS_READ_MEDALS"] = "esi-characters.read_medals.v1";
- SCOPES$1["CHARACTERS_READ_STANDINGS"] = "esi-characters.read_standings.v1";
- SCOPES$1["CHARACTERS_READ_AGENTS_RESEARCH"] = "esi-characters.read_agents_research.v1";
- SCOPES$1["INDUSTRY_READ_CHARACTER_JOBS"] = "esi-industry.read_character_jobs.v1";
- SCOPES$1["MARKETS_READ_CHARACTER_ORDERS"] = "esi-markets.read_character_orders.v1";
- SCOPES$1["CHARACTERS_READ_BLUEPRINTS"] = "esi-characters.read_blueprints.v1";
- SCOPES$1["CHARACTERS_READ_CORPORATION_ROLES"] = "esi-characters.read_corporation_roles.v1";
- SCOPES$1["LOCATION_READ_ONLINE"] = "esi-location.read_online.v1";
- SCOPES$1["CONTRACTS_READ_CHARACTER_CONTRACTS"] = "esi-contracts.read_character_contracts.v1";
- SCOPES$1["CLONES_READ_IMPLANTS"] = "esi-clones.read_implants.v1";
- SCOPES$1["CHARACTERS_READ_FATIGUE"] = "esi-characters.read_fatigue.v1";
- SCOPES$1["KILLMAILS_READ_CORPORATION_KILLMAILS"] = "esi-killmails.read_corporation_killmails.v1";
- SCOPES$1["CORPORATIONS_TRACK_MEMBERS"] = "esi-corporations.track_members.v1";
- SCOPES$1["WALLET_READ_CORPORATION_WALLETS"] = "esi-wallet.read_corporation_wallets.v1";
- SCOPES$1["CHARACTERS_READ_NOTIFICATIONS"] = "esi-characters.read_notifications.v1";
- SCOPES$1["CORPORATIONS_READ_DIVISIONS"] = "esi-corporations.read_divisions.v1";
- SCOPES$1["CORPORATIONS_READ_CONTACTS"] = "esi-corporations.read_contacts.v1";
- SCOPES$1["ASSETS_READ_CORPORATION_ASSETS"] = "esi-assets.read_corporation_assets.v1";
- SCOPES$1["CORPORATIONS_READ_TITLES"] = "esi-corporations.read_titles.v1";
- SCOPES$1["CORPORATIONS_READ_BLUEPRINTS"] = "esi-corporations.read_blueprints.v1";
- SCOPES$1["CONTRACTS_READ_CORPORATION_CONTRACTS"] = "esi-contracts.read_corporation_contracts.v1";
- SCOPES$1["CORPORATIONS_READ_STANDINGS"] = "esi-corporations.read_standings.v1";
- SCOPES$1["CORPORATIONS_READ_STARBASES"] = "esi-corporations.read_starbases.v1";
- SCOPES$1["INDUSTRY_READ_CORPORATION_JOBS"] = "esi-industry.read_corporation_jobs.v1";
- SCOPES$1["MARKETS_READ_CORPORATION_ORDERS"] = "esi-markets.read_corporation_orders.v1";
- SCOPES$1["CORPORATIONS_READ_CONTAINER_LOGS"] = "esi-corporations.read_container_logs.v1";
- SCOPES$1["INDUSTRY_READ_CHARACTER_MINING"] = "esi-industry.read_character_mining.v1";
- SCOPES$1["INDUSTRY_READ_CORPORATION_MINING"] = "esi-industry.read_corporation_mining.v1";
- SCOPES$1["PLANETS_READ_CUSTOMS_OFFICES"] = "esi-planets.read_customs_offices.v1";
- SCOPES$1["CORPORATIONS_READ_FACILITIES"] = "esi-corporations.read_facilities.v1";
- SCOPES$1["CORPORATIONS_READ_MEDALS"] = "esi-corporations.read_medals.v1";
- SCOPES$1["CHARACTERS_READ_TITLES"] = "esi-characters.read_titles.v1";
- SCOPES$1["ALLIANCES_READ_CONTACTS"] = "esi-alliances.read_contacts.v1";
- SCOPES$1["CHARACTERS_READ_FW_STATS"] = "esi-characters.read_fw_stats.v1";
- SCOPES$1["CORPORATIONS_READ_FW_STATS"] = "esi-corporations.read_fw_stats.v1";
- return SCOPES$1;
-}({});
-
-// ../eve/dist/esi/fetch.js
-var cache = /* @__PURE__ */ new Map;
-function cleanCache() {
- const now = Date.now();
- for (const [key, value] of cache)
- if (value.expires < now)
- cache.delete(key);
-}
-setInterval(cleanCache, 1000 * 60 * 15);
-var defaultCacheDuration = 1000 * 60 * 30;
-async function esiFetch(path, character, { method = "GET", body, noCache = false, cacheDuration = defaultCacheDuration } = {}) {
- try {
- const headers = {
- "User-Agent": options.user_agent,
- Accept: "application/json"
- };
- if (character) {
- if (!CharacterHelper.hasValidToken(character)) {
- await CharacterHelper.refreshTokens(character);
- if (!CharacterHelper.hasValidToken(character))
- throw new Error(`Failed to refresh token for character: ${character.eveID}`);
- }
- headers["Authorization"] = `Bearer ${character.accessToken}`;
- }
- const init = {
- headers,
- method: method || "GET",
- body: body || undefined
- };
- const url = new URL(`${ESI_LATEST_URL}${path.startsWith("/") ? path : "/" + path}`);
- url.searchParams.set("datasource", "tranquility");
- if (!noCache && init.method === "GET") {
- const cached = cache.get(url.href);
- if (cached && cached?.expires > Date.now())
- return cached.data;
- }
- const res = await fetch(url, init);
- const data = await res.json();
- if (!res.ok) {
- console.error(`ESI request failure at ${path} | ${res.status}:${res.statusText} => ${JSON.stringify(data)}`);
- return null;
- }
- if (init.method === "GET")
- cache.set(url.href, {
- expires: Math.max(res.headers.get("expires") && new Date(Number(res.headers.get("expires") || "")).getTime() || 0, Date.now() + cacheDuration),
- data
- });
- return data;
- } catch (err) {
- console.error(`ESI request failure at ${path} | ${JSON.stringify(err)}`, err);
- return null;
- }
-}
-
-// ../eve/dist/esi/character.js
-var character_exports = {};
-__export(character_exports, {
- getCharacterAffiliations: () => getCharacterAffiliations,
- getCharacterAgentResearch: () => getCharacterAgentResearch,
- getCharacterAssetLocations: () => getCharacterAssetLocations,
- getCharacterAssetNames: () => getCharacterAssetNames,
- getCharacterAssets: () => getCharacterAssets,
- getCharacterBlueprints: () => getCharacterBlueprints,
- getCharacterClones: () => getCharacterClones,
- getCharacterContactNotifications: () => getCharacterContactNotifications,
- getCharacterCorporationHistory: () => getCharacterCorporationHistory,
- getCharacterCurrentShip: () => getCharacterCurrentShip,
- getCharacterImplants: () => getCharacterImplants,
- getCharacterJumpFatigue: () => getCharacterJumpFatigue,
- getCharacterLocation: () => getCharacterLocation,
- getCharacterMedals: () => getCharacterMedals,
- getCharacterNotifications: () => getCharacterNotifications,
- getCharacterOnline: () => getCharacterOnline,
- getCharacterPortraits: () => getCharacterPortraits,
- getCharacterPublicData: () => getCharacterPublicData,
- getCharacterRoles: () => getCharacterRoles,
- getCharacterStandings: () => getCharacterStandings,
- getCharacterTitles: () => getCharacterTitles,
- getCharacterWallet: () => getCharacterWallet,
- getCharacterWalletJournal: () => getCharacterWalletJournal,
- getCharacterWalletTransactions: () => getCharacterWalletTransactions,
- getPortraitURL: () => getPortraitURL
-});
-function getCharacterPublicData(id) {
- return esiFetch(`/characters/${id}/`);
-}
-function getCharacterAffiliations(ids) {
- return esiFetch(`/characters/affiliation/`, undefined, {
- method: "POST",
- body: JSON.stringify(ids)
- })[0];
-}
-function getCharacterPortraits(id) {
- return esiFetch(`/characters/${id}/portrait/`);
-}
-function getCharacterCorporationHistory(id) {
- return esiFetch(`/characters/${id}/corporationhistory/`);
-}
-function getPortraitURL(id) {
- return `https://images.evetech.net/characters/${id}/portrait`;
-}
-function getCharacterRoles(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_corporation_roles.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/roles/`, character);
-}
-function getCharacterTitles(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_titles.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/titles/`, character);
-}
-function getCharacterStandings(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_standings.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/standings/`, character);
-}
-function getCharacterNotifications(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_notifications.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/notifications/`, character);
-}
-function getCharacterContactNotifications(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_notifications.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/notifications/contacts`, character);
-}
-function getCharacterMedals(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_medals.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/medals/`, character);
-}
-function getCharacterJumpFatigue(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_fatigue.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/fatigue/`, character);
-}
-function getCharacterBlueprints(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_blueprints.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/blueprints/`, character);
-}
-function getCharacterAgentResearch(character) {
- if (!CharacterHelper.hasScope(character, "esi-characters.read_agents_research.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/agents_research/`, character);
-}
-function getCharacterClones(character) {
- if (!CharacterHelper.hasScope(character, "esi-clones.read_clones.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/clones/`, character);
-}
-function getCharacterImplants(character) {
- if (!CharacterHelper.hasScope(character, "esi-clones.read_implants.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/implants/`, character);
-}
-function getCharacterAssets(character) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_assets.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/assets/`, character);
-}
-function getCharacterAssetLocations(character, ids) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_assets.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/assets/locations/`, character, {
- method: "POST",
- body: JSON.stringify(ids)
- });
-}
-function getCharacterAssetNames(character, ids) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_assets.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/assets/names/`, character, {
- method: "POST",
- body: JSON.stringify(ids)
- });
-}
-function getCharacterWallet(character) {
- if (!CharacterHelper.hasScope(character, "esi-wallet.read_character_wallet.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/wallet/`, character);
-}
-function getCharacterWalletTransactions(character, fromId) {
- if (!CharacterHelper.hasScope(character, "esi-wallet.read_character_wallet.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/wallet/transactions/`, character, {
- method: "POST",
- body: JSON.stringify(fromId)
- });
-}
-function getCharacterWalletJournal(character, page = 1) {
- if (!CharacterHelper.hasScope(character, "esi-wallet.read_character_wallet.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/wallet/journal/?page=${page}`, character);
-}
-function getCharacterLocation(character) {
- if (!CharacterHelper.hasScope(character, "esi-location.read_location.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/location/`, character);
-}
-function getCharacterOnline(character) {
- if (!CharacterHelper.hasScope(character, "esi-location.read_online.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/online/`, character);
-}
-function getCharacterCurrentShip(character) {
- if (!CharacterHelper.hasScope(character, "esi-location.read_ship_type.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/ship/`, character);
-}
-
-// ../eve/dist/esi/corporation.js
-var corporation_exports = {};
-__export(corporation_exports, {
- getCorporationAllianceHistory: () => getCorporationAllianceHistory,
- getCorporationAssetLocations: () => getCorporationAssetLocations,
- getCorporationAssetNames: () => getCorporationAssetNames,
- getCorporationAssets: () => getCorporationAssets,
- getCorporationData: () => getCorporationData,
- getCorporationIcons: () => getCorporationIcons
-});
-async function getCorporationData(id) {
- return await esiFetch(`/corporations/${id}/`);
-}
-async function getCorporationAllianceHistory(id) {
- return await esiFetch(`/corporations/${id}/alliancehistory/`);
-}
-async function getCorporationIcons(id) {
- return await esiFetch(`/corporations/${id}/icons/`);
-}
-async function getCorporationAssets(id, character) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_corporation_assets.v1"))
- return null;
- return await esiFetch(`/corporations/${id}/assets/`, character);
-}
-async function getCorporationAssetLocations(id, character, ids) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_corporation_assets.v1"))
- return null;
- return await esiFetch(`/corporations/${id}/assets/locations/`, character, {
- method: "POST",
- body: JSON.stringify(ids)
- });
-}
-async function getCorporationAssetNames(id, character, ids) {
- if (!CharacterHelper.hasScope(character, "esi-assets.read_corporation_assets.v1"))
- return null;
- return await esiFetch(`/corporations/${id}/assets/names/`, character, {
- method: "POST",
- body: JSON.stringify(ids)
- });
-}
-
-// ../eve/dist/esi/alliance.js
-var alliance_exports = {};
-__export(alliance_exports, {
- getAllianceCorporations: () => getAllianceCorporations,
- getAllianceData: () => getAllianceData,
- getAllianceIcons: () => getAllianceIcons
-});
-async function getAllianceData(id) {
- return await esiFetch(`/alliances/${id}/`);
-}
-async function getAllianceCorporations(id) {
- return await esiFetch(`/alliances/${id}/corporations/`);
-}
-async function getAllianceIcons(id) {
- return await esiFetch(`/alliances/${id}/icons/`);
-}
-
-// ../eve/dist/esi/skills.js
-function getCharacterSkillQueue(character) {
- if (!CharacterHelper.hasScope(character, "esi-skills.read_skillqueue.v1"))
- return null;
- return esiFetch(`/characters/${character.eveID}/skillqueue`, character);
-}
-function calculateTrainingPercentage(queuedSkill) {
- const trainingStartPosition = (queuedSkill.training_start_sp - queuedSkill.level_start_sp) / queuedSkill.level_end_sp;
- const timePosition = ((/* @__PURE__ */ new Date()).getTime() - new Date(queuedSkill.start_date).getTime()) / (new Date(queuedSkill.finish_date).getTime() - new Date(queuedSkill.start_date).getTime());
- return trainingStartPosition + (1 - trainingStartPosition) * timePosition;
-}
-
-// src/api/auth/discordID/[discordID]/characterID/[characterID]/refresh.ts
-async function GET({ store, route: { params } }) {
- const discordID = params["discordID"];
- const characterID = params["characterID"];
- const user = UserHelper.findByDiscordId(discordID);
- const character = CharacterHelper.findByUserAndEveID(user.id, Number(characterID));
- if (!user) {
- throw new Error(`User not found for discordID: ${discordID}`);
- }
- if (!character) {
- throw new Error(`Character not found for user: ${user.id} and characterID: ${characterID}`);
- }
- const scopes = CharacterHelper.getScopes(character);
- const eveauth = store.get("eveauth");
- const response = await eveauth.redirect(joinScopes(...scopes));
- setCookie(response, "discordID", discordID, 60 * 10);
- setCookie(response, "characterID", characterID, 60 * 10);
- return response;
-}
-export {
- GET
-};
-
-//# debugId=F5DE3BB1D4B0C51264756E2164756E21
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2FmZS1idWZmZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3c1xcbGliXFxkYXRhLXN0cmVhbS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlY2RzYS1zaWctZm9ybWF0dGVyXFxzcmNcXHBhcmFtLWJ5dGVzLWZvci1hbGcuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWNkc2Etc2lnLWZvcm1hdHRlclxcc3JjXFxlY2RzYS1zaWctZm9ybWF0dGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGJ1ZmZlci1lcXVhbC1jb25zdGFudC10aW1lXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd2FcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3c1xcbGliXFx0b3N0cmluZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd3NcXGxpYlxcc2lnbi1zdHJlYW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandzXFxsaWJcXHZlcmlmeS1zdHJlYW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGRlY29kZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxcSnNvbldlYlRva2VuRXJyb3IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcanNvbndlYnRva2VuXFxsaWJcXE5vdEJlZm9yZUVycm9yLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxUb2tlbkV4cGlyZWRFcnJvci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxtc1xcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcanNvbndlYnRva2VuXFxsaWJcXHRpbWVzcGFuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcaW50ZXJuYWxcXGNvbnN0YW50cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxkZWJ1Zy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxyZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxwYXJzZS1vcHRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcaW50ZXJuYWxcXGlkZW50aWZpZXJzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcY2xhc3Nlc1xcc2VtdmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxwYXJzZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcdmFsaWQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGNsZWFuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxpbmMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGRpZmYuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXG1ham9yLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxtaW5vci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xccGF0Y2guanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHByZXJlbGVhc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGNvbXBhcmUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHJjb21wYXJlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb21wYXJlLWxvb3NlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb21wYXJlLWJ1aWxkLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxzb3J0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxyc29ydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcZ3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGx0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxlcS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcbmVxLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxndGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGx0ZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcY21wLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb2VyY2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxpbnRlcm5hbFxcbHJ1Y2FjaGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxjbGFzc2VzXFxyYW5nZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGNsYXNzZXNcXGNvbXBhcmF0b3IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHNhdGlzZmllcy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcdG8tY29tcGFyYXRvcnMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXG1heC1zYXRpc2Z5aW5nLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxtaW4tc2F0aXNmeWluZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcbWluLXZlcnNpb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXHZhbGlkLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxvdXRzaWRlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxndHIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXGx0ci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcaW50ZXJzZWN0cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcc2ltcGxpZnkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXHN1YnNldC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxhc3ltbWV0cmljS2V5RGV0YWlsc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxccnNhUHNzS2V5RGV0YWlsc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxcdmFsaWRhdGVBc3ltbWV0cmljS2V5LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxwc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXHZlcmlmeS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxsb2Rhc2guaW5jbHVkZXNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc2Jvb2xlYW5cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc2ludGVnZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc251bWJlclxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbG9kYXNoLmlzcGxhaW5vYmplY3RcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc3N0cmluZ1xcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbG9kYXNoLm9uY2VcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcc2lnbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGJuLmpzXFxsaWJcXGJuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGluaGVyaXRzXFxpbmhlcml0c19icm93c2VyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGluaGVyaXRzXFxpbmhlcml0cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzYWZlci1idWZmZXJcXHNhZmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYmFzZVxccmVwb3J0ZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxiYXNlXFxidWZmZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbWluaW1hbGlzdGljLWFzc2VydFxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxiYXNlXFxub2RlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcY29uc3RhbnRzXFxkZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxlbmNvZGVyc1xcZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcZW5jb2RlcnNcXHBlbS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxhc24xLmpzXFxsaWJcXGFzbjFcXGVuY29kZXJzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxhc24xLmpzXFxsaWJcXGFzbjFcXGRlY29kZXJzXFxkZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxkZWNvZGVyc1xccGVtLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcZGVjb2RlcnNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYXBpLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYmFzZVxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxjb25zdGFudHNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzXFxsaWJcXHV0aWxzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxicm9yYW5kXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVcXGJhc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGN1cnZlXFxzaG9ydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVcXG1vbnQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGN1cnZlXFxlZHdhcmRzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljXFxjdXJ2ZVxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXGNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXHNoYVxcY29tbW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwxLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwyNTYuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxzaGFcXDIyNC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXHNoYVxcNTEyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwzODQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxzaGEuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxyaXBlbWQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxobWFjLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xccHJlY29tcHV0ZWRcXHNlY3AyNTZrMS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhtYWMtZHJiZ1xcbGliXFxobWFjLWRyYmcuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxrZXkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxzaWduYXR1cmUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXGtleS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXHNpZ25hdHVyZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYjY0LXRvLWJuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYXNuMVxcYWxnb3JpdGhtLWlkZW50aWZpZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandrLXRvLXBlbVxcc3JjXFxhc24xXFxwdWJsaWMta2V5LWluZm8uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandrLXRvLXBlbVxcc3JjXFxhc24xXFx2ZXJzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYXNuMVxccHJpdmF0ZS1rZXktaW5mby5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd2stdG8tcGVtXFxzcmNcXGVjLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xccnNhLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcandrLXRvLXBlbS5qcyIsICIuLlxcc3JjXFx1dGlsc1xcY29va2llcy50cyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcX3ZpcnR1YWxcXHJvbGxkb3duX3J1bnRpbWUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGVudGl0eS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcY29sdW1uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxjb2x1bW4tYnVpbGRlci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdGFibGUudXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHRyYWNpbmctdXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHBnLWNvcmVcXHVuaXF1ZS1jb25zdHJhaW50LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxwZy1jb3JlXFxjb2x1bW5zXFxjb21tb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHBnLWNvcmVcXGNvbHVtbnNcXGVudW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHN1YnF1ZXJ5LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx2ZXJzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx0cmFjaW5nLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx2aWV3LWNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdGFibGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbFxcc3FsLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxhbGlhcy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxmb3JlaWduLWtleXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx1bmlxdWUtY29uc3RyYWludC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXGNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXGJsb2IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxjdXN0b20uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxpbnRlZ2VyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxcY29sdW1uc1xcbnVtZXJpYy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXHJlYWwuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFx0ZXh0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzZWxlY3Rpb24tcHJveHkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHF1ZXJ5LXByb21pc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxhbGwuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx0YWJsZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGluZGV4ZXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFxkZWxldGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGNhc2luZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcZXJyb3JzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxwZy1jb3JlXFx0YWJsZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxccGctY29yZVxccHJpbWFyeS1rZXlzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxcXGV4cHJlc3Npb25zXFxjb25kaXRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxcXGV4cHJlc3Npb25zXFxzZWxlY3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHJlbGF0aW9ucy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHZpZXctYmFzZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGRpYWxlY3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHF1ZXJ5LWJ1aWxkZXJzXFxxdWVyeS1idWlsZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxccXVlcnktYnVpbGRlcnNcXHNlbGVjdC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFxxdWVyeS1idWlsZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxccXVlcnktYnVpbGRlcnNcXGluc2VydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFx1cGRhdGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xcY291bnQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xccXVlcnkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xccmF3LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxcZGIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGNhY2hlXFxjb3JlXFxjYWNoZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHNlc3Npb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGxvZ2dlci5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZGJcXHNjaGVtYS5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxvcHRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3dC1kZWNvZGVcXGJ1aWxkXFxlc21cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXEBvc2xvanNcXGVuY29kaW5nXFxkaXN0XFxiYXNlMzIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcQG9zbG9qc1xcZW5jb2RpbmdcXGRpc3RcXGJhc2U2NC5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxhdXRoLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxkYlxcbW9kZWxzXFxjaGFyYWN0ZXIubW9kZWwuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGRiXFxtb2RlbHNcXHVzZXIubW9kZWwuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGRiXFxtb2RlbHNcXHJlc3VtZS1jb21tYW5kLm1vZGVsLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxkYlxcbW9kZWxzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcYnVuLXNxbGl0ZVxcZHJpdmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxidW4tc3FsaXRlXFxzZXNzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxkYlxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGVzaVxcc2NvcGVzLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxlc2lcXGZldGNoLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxlc2lcXGNoYXJhY3Rlci5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxjb3Jwb3JhdGlvbi5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxhbGxpYW5jZS5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxza2lsbHMuanMiLCAiLi5cXHNyY1xcYXBpXFxhdXRoXFxkaXNjb3JkSURcXFtkaXNjb3JkSURdXFxjaGFyYWN0ZXJJRFxcW2NoYXJhY3RlcklEXVxccmVmcmVzaC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKiEgc2FmZS1idWZmZXIuIE1JVCBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuU2FmZUJ1ZmZlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEJ1ZmZlci5wcm90b3R5cGUpXG5cbi8vIENvcHkgc3RhdGljIG1ldGhvZHMgZnJvbSBCdWZmZXJcbmNvcHlQcm9wcyhCdWZmZXIsIFNhZmVCdWZmZXIpXG5cblNhZmVCdWZmZXIuZnJvbSA9IGZ1bmN0aW9uIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuU2FmZUJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgdmFyIGJ1ZiA9IEJ1ZmZlcihzaXplKVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuZmlsbChmaWxsKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBidWYuZmlsbCgwKVxuICB9XG4gIHJldHVybiBidWZcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKHNpemUpXG59XG5cblNhZmVCdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBidWZmZXIuU2xvd0J1ZmZlcihzaXplKVxufVxuIiwKICAgICIvKmdsb2JhbCBtb2R1bGUsIHByb2Nlc3MqL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbmZ1bmN0aW9uIERhdGFTdHJlYW0oZGF0YSkge1xuICB0aGlzLmJ1ZmZlciA9IG51bGw7XG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyBObyBpbnB1dFxuICBpZiAoIWRhdGEpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFN0cmVhbVxuICBpZiAodHlwZW9mIGRhdGEucGlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuICAgIGRhdGEucGlwZSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEJ1ZmZlciBvciBTdHJpbmdcbiAgLy8gb3IgT2JqZWN0IChhc3N1bWVkbHkgYSBwYXNzd29yZGVkIGtleSlcbiAgaWYgKGRhdGEubGVuZ3RoIHx8IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xuICAgIHRoaXMuYnVmZmVyID0gZGF0YTtcbiAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmVtaXQoJ2VuZCcsIGRhdGEpO1xuICAgICAgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5lbWl0KCdjbG9zZScpO1xuICAgIH0uYmluZCh0aGlzKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmV4cGVjdGVkIGRhdGEgdHlwZSAoJysgdHlwZW9mIGRhdGEgKyAnKScpO1xufVxudXRpbC5pbmhlcml0cyhEYXRhU3RyZWFtLCBTdHJlYW0pO1xuXG5EYXRhU3RyZWFtLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlKGRhdGEpIHtcbiAgdGhpcy5idWZmZXIgPSBCdWZmZXIuY29uY2F0KFt0aGlzLmJ1ZmZlciwgQnVmZmVyLmZyb20oZGF0YSldKTtcbiAgdGhpcy5lbWl0KCdkYXRhJywgZGF0YSk7XG59O1xuXG5EYXRhU3RyZWFtLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiBlbmQoZGF0YSkge1xuICBpZiAoZGF0YSlcbiAgICB0aGlzLndyaXRlKGRhdGEpO1xuICB0aGlzLmVtaXQoJ2VuZCcsIGRhdGEpO1xuICB0aGlzLmVtaXQoJ2Nsb3NlJyk7XG4gIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBEYXRhU3RyZWFtO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGdldFBhcmFtU2l6ZShrZXlTaXplKSB7XG5cdHZhciByZXN1bHQgPSAoKGtleVNpemUgLyA4KSB8IDApICsgKGtleVNpemUgJSA4ID09PSAwID8gMCA6IDEpO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG52YXIgcGFyYW1CeXRlc0ZvckFsZyA9IHtcblx0RVMyNTY6IGdldFBhcmFtU2l6ZSgyNTYpLFxuXHRFUzM4NDogZ2V0UGFyYW1TaXplKDM4NCksXG5cdEVTNTEyOiBnZXRQYXJhbVNpemUoNTIxKVxufTtcblxuZnVuY3Rpb24gZ2V0UGFyYW1CeXRlc0ZvckFsZyhhbGcpIHtcblx0dmFyIHBhcmFtQnl0ZXMgPSBwYXJhbUJ5dGVzRm9yQWxnW2FsZ107XG5cdGlmIChwYXJhbUJ5dGVzKSB7XG5cdFx0cmV0dXJuIHBhcmFtQnl0ZXM7XG5cdH1cblxuXHR0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gYWxnb3JpdGhtIFwiJyArIGFsZyArICdcIicpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFBhcmFtQnl0ZXNGb3JBbGc7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgZ2V0UGFyYW1CeXRlc0ZvckFsZyA9IHJlcXVpcmUoJy4vcGFyYW0tYnl0ZXMtZm9yLWFsZycpO1xuXG52YXIgTUFYX09DVEVUID0gMHg4MCxcblx0Q0xBU1NfVU5JVkVSU0FMID0gMCxcblx0UFJJTUlUSVZFX0JJVCA9IDB4MjAsXG5cdFRBR19TRVEgPSAweDEwLFxuXHRUQUdfSU5UID0gMHgwMixcblx0RU5DT0RFRF9UQUdfU0VRID0gKFRBR19TRVEgfCBQUklNSVRJVkVfQklUKSB8IChDTEFTU19VTklWRVJTQUwgPDwgNiksXG5cdEVOQ09ERURfVEFHX0lOVCA9IFRBR19JTlQgfCAoQ0xBU1NfVU5JVkVSU0FMIDw8IDYpO1xuXG5mdW5jdGlvbiBiYXNlNjRVcmwoYmFzZTY0KSB7XG5cdHJldHVybiBiYXNlNjRcblx0XHQucmVwbGFjZSgvPS9nLCAnJylcblx0XHQucmVwbGFjZSgvXFwrL2csICctJylcblx0XHQucmVwbGFjZSgvXFwvL2csICdfJyk7XG59XG5cbmZ1bmN0aW9uIHNpZ25hdHVyZUFzQnVmZmVyKHNpZ25hdHVyZSkge1xuXHRpZiAoQnVmZmVyLmlzQnVmZmVyKHNpZ25hdHVyZSkpIHtcblx0XHRyZXR1cm4gc2lnbmF0dXJlO1xuXHR9IGVsc2UgaWYgKCdzdHJpbmcnID09PSB0eXBlb2Ygc2lnbmF0dXJlKSB7XG5cdFx0cmV0dXJuIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSwgJ2Jhc2U2NCcpO1xuXHR9XG5cblx0dGhyb3cgbmV3IFR5cGVFcnJvcignRUNEU0Egc2lnbmF0dXJlIG11c3QgYmUgYSBCYXNlNjQgc3RyaW5nIG9yIGEgQnVmZmVyJyk7XG59XG5cbmZ1bmN0aW9uIGRlclRvSm9zZShzaWduYXR1cmUsIGFsZykge1xuXHRzaWduYXR1cmUgPSBzaWduYXR1cmVBc0J1ZmZlcihzaWduYXR1cmUpO1xuXHR2YXIgcGFyYW1CeXRlcyA9IGdldFBhcmFtQnl0ZXNGb3JBbGcoYWxnKTtcblxuXHQvLyB0aGUgREVSIGVuY29kZWQgcGFyYW0gc2hvdWxkIGF0IG1vc3QgYmUgdGhlIHBhcmFtIHNpemUsIHBsdXMgYSBwYWRkaW5nXG5cdC8vIHplcm8sIHNpbmNlIGR1ZSB0byBiZWluZyBhIHNpZ25lZCBpbnRlZ2VyXG5cdHZhciBtYXhFbmNvZGVkUGFyYW1MZW5ndGggPSBwYXJhbUJ5dGVzICsgMTtcblxuXHR2YXIgaW5wdXRMZW5ndGggPSBzaWduYXR1cmUubGVuZ3RoO1xuXG5cdHZhciBvZmZzZXQgPSAwO1xuXHRpZiAoc2lnbmF0dXJlW29mZnNldCsrXSAhPT0gRU5DT0RFRF9UQUdfU0VRKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBleHBlY3RlZCBcInNlcVwiJyk7XG5cdH1cblxuXHR2YXIgc2VxTGVuZ3RoID0gc2lnbmF0dXJlW29mZnNldCsrXTtcblx0aWYgKHNlcUxlbmd0aCA9PT0gKE1BWF9PQ1RFVCB8IDEpKSB7XG5cdFx0c2VxTGVuZ3RoID0gc2lnbmF0dXJlW29mZnNldCsrXTtcblx0fVxuXG5cdGlmIChpbnB1dExlbmd0aCAtIG9mZnNldCA8IHNlcUxlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJzZXFcIiBzcGVjaWZpZWQgbGVuZ3RoIG9mIFwiJyArIHNlcUxlbmd0aCArICdcIiwgb25seSBcIicgKyAoaW5wdXRMZW5ndGggLSBvZmZzZXQpICsgJ1wiIHJlbWFpbmluZycpO1xuXHR9XG5cblx0aWYgKHNpZ25hdHVyZVtvZmZzZXQrK10gIT09IEVOQ09ERURfVEFHX0lOVCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgZXhwZWN0ZWQgXCJpbnRcIiBmb3IgXCJyXCInKTtcblx0fVxuXG5cdHZhciByTGVuZ3RoID0gc2lnbmF0dXJlW29mZnNldCsrXTtcblxuXHRpZiAoaW5wdXRMZW5ndGggLSBvZmZzZXQgLSAyIDwgckxlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJyXCIgc3BlY2lmaWVkIGxlbmd0aCBvZiBcIicgKyByTGVuZ3RoICsgJ1wiLCBvbmx5IFwiJyArIChpbnB1dExlbmd0aCAtIG9mZnNldCAtIDIpICsgJ1wiIGF2YWlsYWJsZScpO1xuXHR9XG5cblx0aWYgKG1heEVuY29kZWRQYXJhbUxlbmd0aCA8IHJMZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1wiclwiIHNwZWNpZmllZCBsZW5ndGggb2YgXCInICsgckxlbmd0aCArICdcIiwgbWF4IG9mIFwiJyArIG1heEVuY29kZWRQYXJhbUxlbmd0aCArICdcIiBpcyBhY2NlcHRhYmxlJyk7XG5cdH1cblxuXHR2YXIgck9mZnNldCA9IG9mZnNldDtcblx0b2Zmc2V0ICs9IHJMZW5ndGg7XG5cblx0aWYgKHNpZ25hdHVyZVtvZmZzZXQrK10gIT09IEVOQ09ERURfVEFHX0lOVCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgZXhwZWN0ZWQgXCJpbnRcIiBmb3IgXCJzXCInKTtcblx0fVxuXG5cdHZhciBzTGVuZ3RoID0gc2lnbmF0dXJlW29mZnNldCsrXTtcblxuXHRpZiAoaW5wdXRMZW5ndGggLSBvZmZzZXQgIT09IHNMZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1wic1wiIHNwZWNpZmllZCBsZW5ndGggb2YgXCInICsgc0xlbmd0aCArICdcIiwgZXhwZWN0ZWQgXCInICsgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0KSArICdcIicpO1xuXHR9XG5cblx0aWYgKG1heEVuY29kZWRQYXJhbUxlbmd0aCA8IHNMZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1wic1wiIHNwZWNpZmllZCBsZW5ndGggb2YgXCInICsgc0xlbmd0aCArICdcIiwgbWF4IG9mIFwiJyArIG1heEVuY29kZWRQYXJhbUxlbmd0aCArICdcIiBpcyBhY2NlcHRhYmxlJyk7XG5cdH1cblxuXHR2YXIgc09mZnNldCA9IG9mZnNldDtcblx0b2Zmc2V0ICs9IHNMZW5ndGg7XG5cblx0aWYgKG9mZnNldCAhPT0gaW5wdXRMZW5ndGgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGNvbnN1bWUgZW50aXJlIGJ1ZmZlciwgYnV0IFwiJyArIChpbnB1dExlbmd0aCAtIG9mZnNldCkgKyAnXCIgYnl0ZXMgcmVtYWluJyk7XG5cdH1cblxuXHR2YXIgclBhZGRpbmcgPSBwYXJhbUJ5dGVzIC0gckxlbmd0aCxcblx0XHRzUGFkZGluZyA9IHBhcmFtQnl0ZXMgLSBzTGVuZ3RoO1xuXG5cdHZhciBkc3QgPSBCdWZmZXIuYWxsb2NVbnNhZmUoclBhZGRpbmcgKyByTGVuZ3RoICsgc1BhZGRpbmcgKyBzTGVuZ3RoKTtcblxuXHRmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IHJQYWRkaW5nOyArK29mZnNldCkge1xuXHRcdGRzdFtvZmZzZXRdID0gMDtcblx0fVxuXHRzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgck9mZnNldCArIE1hdGgubWF4KC1yUGFkZGluZywgMCksIHJPZmZzZXQgKyByTGVuZ3RoKTtcblxuXHRvZmZzZXQgPSBwYXJhbUJ5dGVzO1xuXG5cdGZvciAodmFyIG8gPSBvZmZzZXQ7IG9mZnNldCA8IG8gKyBzUGFkZGluZzsgKytvZmZzZXQpIHtcblx0XHRkc3Rbb2Zmc2V0XSA9IDA7XG5cdH1cblx0c2lnbmF0dXJlLmNvcHkoZHN0LCBvZmZzZXQsIHNPZmZzZXQgKyBNYXRoLm1heCgtc1BhZGRpbmcsIDApLCBzT2Zmc2V0ICsgc0xlbmd0aCk7XG5cblx0ZHN0ID0gZHN0LnRvU3RyaW5nKCdiYXNlNjQnKTtcblx0ZHN0ID0gYmFzZTY0VXJsKGRzdCk7XG5cblx0cmV0dXJuIGRzdDtcbn1cblxuZnVuY3Rpb24gY291bnRQYWRkaW5nKGJ1Ziwgc3RhcnQsIHN0b3ApIHtcblx0dmFyIHBhZGRpbmcgPSAwO1xuXHR3aGlsZSAoc3RhcnQgKyBwYWRkaW5nIDwgc3RvcCAmJiBidWZbc3RhcnQgKyBwYWRkaW5nXSA9PT0gMCkge1xuXHRcdCsrcGFkZGluZztcblx0fVxuXG5cdHZhciBuZWVkc1NpZ24gPSBidWZbc3RhcnQgKyBwYWRkaW5nXSA+PSBNQVhfT0NURVQ7XG5cdGlmIChuZWVkc1NpZ24pIHtcblx0XHQtLXBhZGRpbmc7XG5cdH1cblxuXHRyZXR1cm4gcGFkZGluZztcbn1cblxuZnVuY3Rpb24gam9zZVRvRGVyKHNpZ25hdHVyZSwgYWxnKSB7XG5cdHNpZ25hdHVyZSA9IHNpZ25hdHVyZUFzQnVmZmVyKHNpZ25hdHVyZSk7XG5cdHZhciBwYXJhbUJ5dGVzID0gZ2V0UGFyYW1CeXRlc0ZvckFsZyhhbGcpO1xuXG5cdHZhciBzaWduYXR1cmVCeXRlcyA9IHNpZ25hdHVyZS5sZW5ndGg7XG5cdGlmIChzaWduYXR1cmVCeXRlcyAhPT0gcGFyYW1CeXRlcyAqIDIpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdcIicgKyBhbGcgKyAnXCIgc2lnbmF0dXJlcyBtdXN0IGJlIFwiJyArIHBhcmFtQnl0ZXMgKiAyICsgJ1wiIGJ5dGVzLCBzYXcgXCInICsgc2lnbmF0dXJlQnl0ZXMgKyAnXCInKTtcblx0fVxuXG5cdHZhciByUGFkZGluZyA9IGNvdW50UGFkZGluZyhzaWduYXR1cmUsIDAsIHBhcmFtQnl0ZXMpO1xuXHR2YXIgc1BhZGRpbmcgPSBjb3VudFBhZGRpbmcoc2lnbmF0dXJlLCBwYXJhbUJ5dGVzLCBzaWduYXR1cmUubGVuZ3RoKTtcblx0dmFyIHJMZW5ndGggPSBwYXJhbUJ5dGVzIC0gclBhZGRpbmc7XG5cdHZhciBzTGVuZ3RoID0gcGFyYW1CeXRlcyAtIHNQYWRkaW5nO1xuXG5cdHZhciByc0J5dGVzID0gMSArIDEgKyByTGVuZ3RoICsgMSArIDEgKyBzTGVuZ3RoO1xuXG5cdHZhciBzaG9ydExlbmd0aCA9IHJzQnl0ZXMgPCBNQVhfT0NURVQ7XG5cblx0dmFyIGRzdCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgoc2hvcnRMZW5ndGggPyAyIDogMykgKyByc0J5dGVzKTtcblxuXHR2YXIgb2Zmc2V0ID0gMDtcblx0ZHN0W29mZnNldCsrXSA9IEVOQ09ERURfVEFHX1NFUTtcblx0aWYgKHNob3J0TGVuZ3RoKSB7XG5cdFx0Ly8gQml0IDggaGFzIHZhbHVlIFwiMFwiXG5cdFx0Ly8gYml0cyA3LTEgZ2l2ZSB0aGUgbGVuZ3RoLlxuXHRcdGRzdFtvZmZzZXQrK10gPSByc0J5dGVzO1xuXHR9IGVsc2Uge1xuXHRcdC8vIEJpdCA4IG9mIGZpcnN0IG9jdGV0IGhhcyB2YWx1ZSBcIjFcIlxuXHRcdC8vIGJpdHMgNy0xIGdpdmUgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGxlbmd0aCBvY3RldHMuXG5cdFx0ZHN0W29mZnNldCsrXSA9IE1BWF9PQ1RFVFx0fCAxO1xuXHRcdC8vIGxlbmd0aCwgYmFzZSAyNTZcblx0XHRkc3Rbb2Zmc2V0KytdID0gcnNCeXRlcyAmIDB4ZmY7XG5cdH1cblx0ZHN0W29mZnNldCsrXSA9IEVOQ09ERURfVEFHX0lOVDtcblx0ZHN0W29mZnNldCsrXSA9IHJMZW5ndGg7XG5cdGlmIChyUGFkZGluZyA8IDApIHtcblx0XHRkc3Rbb2Zmc2V0KytdID0gMDtcblx0XHRvZmZzZXQgKz0gc2lnbmF0dXJlLmNvcHkoZHN0LCBvZmZzZXQsIDAsIHBhcmFtQnl0ZXMpO1xuXHR9IGVsc2Uge1xuXHRcdG9mZnNldCArPSBzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgclBhZGRpbmcsIHBhcmFtQnl0ZXMpO1xuXHR9XG5cdGRzdFtvZmZzZXQrK10gPSBFTkNPREVEX1RBR19JTlQ7XG5cdGRzdFtvZmZzZXQrK10gPSBzTGVuZ3RoO1xuXHRpZiAoc1BhZGRpbmcgPCAwKSB7XG5cdFx0ZHN0W29mZnNldCsrXSA9IDA7XG5cdFx0c2lnbmF0dXJlLmNvcHkoZHN0LCBvZmZzZXQsIHBhcmFtQnl0ZXMpO1xuXHR9IGVsc2Uge1xuXHRcdHNpZ25hdHVyZS5jb3B5KGRzdCwgb2Zmc2V0LCBwYXJhbUJ5dGVzICsgc1BhZGRpbmcpO1xuXHR9XG5cblx0cmV0dXJuIGRzdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGRlclRvSm9zZTogZGVyVG9Kb3NlLFxuXHRqb3NlVG9EZXI6IGpvc2VUb0RlclxufTtcbiIsCiAgICAiLypqc2hpbnQgbm9kZTp0cnVlICovXG4ndXNlIHN0cmljdCc7XG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyOyAvLyBicm93c2VyaWZ5XG52YXIgU2xvd0J1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLlNsb3dCdWZmZXI7XG5cbm1vZHVsZS5leHBvcnRzID0gYnVmZmVyRXE7XG5cbmZ1bmN0aW9uIGJ1ZmZlckVxKGEsIGIpIHtcblxuICAvLyBzaG9ydGN1dHRpbmcgb24gdHlwZSBpcyBuZWNlc3NhcnkgZm9yIGNvcnJlY3RuZXNzXG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBidWZmZXIgc2l6ZXMgc2hvdWxkIGJlIHdlbGwta25vd24gaW5mb3JtYXRpb24sIHNvIGRlc3BpdGUgdGhpc1xuICAvLyBzaG9ydGN1dHRpbmcsIGl0IGRvZXNuJ3QgbGVhayBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlICpjb250ZW50cyogb2YgdGhlXG4gIC8vIGJ1ZmZlcnMuXG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgYyA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgIC8qanNoaW50IGJpdHdpc2U6ZmFsc2UgKi9cbiAgICBjIHw9IGFbaV0gXiBiW2ldOyAvLyBYT1JcbiAgfVxuICByZXR1cm4gYyA9PT0gMDtcbn1cblxuYnVmZmVyRXEuaW5zdGFsbCA9IGZ1bmN0aW9uKCkge1xuICBCdWZmZXIucHJvdG90eXBlLmVxdWFsID0gU2xvd0J1ZmZlci5wcm90b3R5cGUuZXF1YWwgPSBmdW5jdGlvbiBlcXVhbCh0aGF0KSB7XG4gICAgcmV0dXJuIGJ1ZmZlckVxKHRoaXMsIHRoYXQpO1xuICB9O1xufTtcblxudmFyIG9yaWdCdWZFcXVhbCA9IEJ1ZmZlci5wcm90b3R5cGUuZXF1YWw7XG52YXIgb3JpZ1Nsb3dCdWZFcXVhbCA9IFNsb3dCdWZmZXIucHJvdG90eXBlLmVxdWFsO1xuYnVmZmVyRXEucmVzdG9yZSA9IGZ1bmN0aW9uKCkge1xuICBCdWZmZXIucHJvdG90eXBlLmVxdWFsID0gb3JpZ0J1ZkVxdWFsO1xuICBTbG93QnVmZmVyLnByb3RvdHlwZS5lcXVhbCA9IG9yaWdTbG93QnVmRXF1YWw7XG59O1xuIiwKICAgICJ2YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG52YXIgZm9ybWF0RWNkc2EgPSByZXF1aXJlKCdlY2RzYS1zaWctZm9ybWF0dGVyJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxudmFyIE1TR19JTlZBTElEX0FMR09SSVRITSA9ICdcIiVzXCIgaXMgbm90IGEgdmFsaWQgYWxnb3JpdGhtLlxcbiAgU3VwcG9ydGVkIGFsZ29yaXRobXMgYXJlOlxcbiAgXCJIUzI1NlwiLCBcIkhTMzg0XCIsIFwiSFM1MTJcIiwgXCJSUzI1NlwiLCBcIlJTMzg0XCIsIFwiUlM1MTJcIiwgXCJQUzI1NlwiLCBcIlBTMzg0XCIsIFwiUFM1MTJcIiwgXCJFUzI1NlwiLCBcIkVTMzg0XCIsIFwiRVM1MTJcIiBhbmQgXCJub25lXCIuJ1xudmFyIE1TR19JTlZBTElEX1NFQ1JFVCA9ICdzZWNyZXQgbXVzdCBiZSBhIHN0cmluZyBvciBidWZmZXInO1xudmFyIE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSA9ICdrZXkgbXVzdCBiZSBhIHN0cmluZyBvciBhIGJ1ZmZlcic7XG52YXIgTVNHX0lOVkFMSURfU0lHTkVSX0tFWSA9ICdrZXkgbXVzdCBiZSBhIHN0cmluZywgYSBidWZmZXIgb3IgYW4gb2JqZWN0JztcblxudmFyIHN1cHBvcnRzS2V5T2JqZWN0cyA9IHR5cGVvZiBjcnlwdG8uY3JlYXRlUHVibGljS2V5ID09PSAnZnVuY3Rpb24nO1xuaWYgKHN1cHBvcnRzS2V5T2JqZWN0cykge1xuICBNU0dfSU5WQUxJRF9WRVJJRklFUl9LRVkgKz0gJyBvciBhIEtleU9iamVjdCc7XG4gIE1TR19JTlZBTElEX1NFQ1JFVCArPSAnb3IgYSBLZXlPYmplY3QnO1xufVxuXG5mdW5jdGlvbiBjaGVja0lzUHVibGljS2V5KGtleSkge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGtleSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXN1cHBvcnRzS2V5T2JqZWN0cykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9WRVJJRklFUl9LRVkpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleS50eXBlICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9WRVJJRklFUl9LRVkpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkuYXN5bW1ldHJpY0tleVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleS5leHBvcnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gY2hlY2tJc1ByaXZhdGVLZXkoa2V5KSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9TSUdORVJfS0VZKTtcbn07XG5cbmZ1bmN0aW9uIGNoZWNrSXNTZWNyZXRLZXkoa2V5KSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICBpZiAoIXN1cHBvcnRzS2V5T2JqZWN0cykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9TRUNSRVQpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1NFQ1JFVCk7XG4gIH1cblxuICBpZiAoa2V5LnR5cGUgIT09ICdzZWNyZXQnKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1NFQ1JFVCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleS5leHBvcnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfU0VDUkVUKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmcm9tQmFzZTY0KGJhc2U2NCkge1xuICByZXR1cm4gYmFzZTY0XG4gICAgLnJlcGxhY2UoLz0vZywgJycpXG4gICAgLnJlcGxhY2UoL1xcKy9nLCAnLScpXG4gICAgLnJlcGxhY2UoL1xcLy9nLCAnXycpO1xufVxuXG5mdW5jdGlvbiB0b0Jhc2U2NChiYXNlNjR1cmwpIHtcbiAgYmFzZTY0dXJsID0gYmFzZTY0dXJsLnRvU3RyaW5nKCk7XG5cbiAgdmFyIHBhZGRpbmcgPSA0IC0gYmFzZTY0dXJsLmxlbmd0aCAlIDQ7XG4gIGlmIChwYWRkaW5nICE9PSA0KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWRkaW5nOyArK2kpIHtcbiAgICAgIGJhc2U2NHVybCArPSAnPSc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhc2U2NHVybFxuICAgIC5yZXBsYWNlKC9cXC0vZywgJysnKVxuICAgIC5yZXBsYWNlKC9fL2csICcvJyk7XG59XG5cbmZ1bmN0aW9uIHR5cGVFcnJvcih0ZW1wbGF0ZSkge1xuICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgdmFyIGVyck1zZyA9IHV0aWwuZm9ybWF0LmJpbmQodXRpbCwgdGVtcGxhdGUpLmFwcGx5KG51bGwsIGFyZ3MpO1xuICByZXR1cm4gbmV3IFR5cGVFcnJvcihlcnJNc2cpO1xufVxuXG5mdW5jdGlvbiBidWZmZXJPclN0cmluZyhvYmopIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihvYmopIHx8IHR5cGVvZiBvYmogPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVJbnB1dCh0aGluZykge1xuICBpZiAoIWJ1ZmZlck9yU3RyaW5nKHRoaW5nKSlcbiAgICB0aGluZyA9IEpTT04uc3RyaW5naWZ5KHRoaW5nKTtcbiAgcmV0dXJuIHRoaW5nO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIbWFjU2lnbmVyKGJpdHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNpZ24odGhpbmcsIHNlY3JldCkge1xuICAgIGNoZWNrSXNTZWNyZXRLZXkoc2VjcmV0KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICB2YXIgaG1hYyA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGEnICsgYml0cywgc2VjcmV0KTtcbiAgICB2YXIgc2lnID0gKGhtYWMudXBkYXRlKHRoaW5nKSwgaG1hYy5kaWdlc3QoJ2Jhc2U2NCcpKVxuICAgIHJldHVybiBmcm9tQmFzZTY0KHNpZyk7XG4gIH1cbn1cblxudmFyIGJ1ZmZlckVxdWFsO1xudmFyIHRpbWluZ1NhZmVFcXVhbCA9ICd0aW1pbmdTYWZlRXF1YWwnIGluIGNyeXB0byA/IGZ1bmN0aW9uIHRpbWluZ1NhZmVFcXVhbChhLCBiKSB7XG4gIGlmIChhLmJ5dGVMZW5ndGggIT09IGIuYnl0ZUxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBjcnlwdG8udGltaW5nU2FmZUVxdWFsKGEsIGIpXG59IDogZnVuY3Rpb24gdGltaW5nU2FmZUVxdWFsKGEsIGIpIHtcbiAgaWYgKCFidWZmZXJFcXVhbCkge1xuICAgIGJ1ZmZlckVxdWFsID0gcmVxdWlyZSgnYnVmZmVyLWVxdWFsLWNvbnN0YW50LXRpbWUnKTtcbiAgfVxuXG4gIHJldHVybiBidWZmZXJFcXVhbChhLCBiKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVIbWFjVmVyaWZpZXIoYml0cykge1xuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KHRoaW5nLCBzaWduYXR1cmUsIHNlY3JldCkge1xuICAgIHZhciBjb21wdXRlZFNpZyA9IGNyZWF0ZUhtYWNTaWduZXIoYml0cykodGhpbmcsIHNlY3JldCk7XG4gICAgcmV0dXJuIHRpbWluZ1NhZmVFcXVhbChCdWZmZXIuZnJvbShzaWduYXR1cmUpLCBCdWZmZXIuZnJvbShjb21wdXRlZFNpZykpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleVNpZ25lcihiaXRzKSB7XG4gcmV0dXJuIGZ1bmN0aW9uIHNpZ24odGhpbmcsIHByaXZhdGVLZXkpIHtcbiAgICBjaGVja0lzUHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICAvLyBFdmVuIHRob3VnaCB3ZSBhcmUgc3BlY2lmeWluZyBcIlJTQVwiIGhlcmUsIHRoaXMgd29ya3Mgd2l0aCBFQ0RTQVxuICAgIC8vIGtleXMgYXMgd2VsbC5cbiAgICB2YXIgc2lnbmVyID0gY3J5cHRvLmNyZWF0ZVNpZ24oJ1JTQS1TSEEnICsgYml0cyk7XG4gICAgdmFyIHNpZyA9IChzaWduZXIudXBkYXRlKHRoaW5nKSwgc2lnbmVyLnNpZ24ocHJpdmF0ZUtleSwgJ2Jhc2U2NCcpKTtcbiAgICByZXR1cm4gZnJvbUJhc2U2NChzaWcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleVZlcmlmaWVyKGJpdHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZlcmlmeSh0aGluZywgc2lnbmF0dXJlLCBwdWJsaWNLZXkpIHtcbiAgICBjaGVja0lzUHVibGljS2V5KHB1YmxpY0tleSk7XG4gICAgdGhpbmcgPSBub3JtYWxpemVJbnB1dCh0aGluZyk7XG4gICAgc2lnbmF0dXJlID0gdG9CYXNlNjQoc2lnbmF0dXJlKTtcbiAgICB2YXIgdmVyaWZpZXIgPSBjcnlwdG8uY3JlYXRlVmVyaWZ5KCdSU0EtU0hBJyArIGJpdHMpO1xuICAgIHZlcmlmaWVyLnVwZGF0ZSh0aGluZyk7XG4gICAgcmV0dXJuIHZlcmlmaWVyLnZlcmlmeShwdWJsaWNLZXksIHNpZ25hdHVyZSwgJ2Jhc2U2NCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBTU0tleVNpZ25lcihiaXRzKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzaWduKHRoaW5nLCBwcml2YXRlS2V5KSB7XG4gICAgY2hlY2tJc1ByaXZhdGVLZXkocHJpdmF0ZUtleSk7XG4gICAgdGhpbmcgPSBub3JtYWxpemVJbnB1dCh0aGluZyk7XG4gICAgdmFyIHNpZ25lciA9IGNyeXB0by5jcmVhdGVTaWduKCdSU0EtU0hBJyArIGJpdHMpO1xuICAgIHZhciBzaWcgPSAoc2lnbmVyLnVwZGF0ZSh0aGluZyksIHNpZ25lci5zaWduKHtcbiAgICAgIGtleTogcHJpdmF0ZUtleSxcbiAgICAgIHBhZGRpbmc6IGNyeXB0by5jb25zdGFudHMuUlNBX1BLQ1MxX1BTU19QQURESU5HLFxuICAgICAgc2FsdExlbmd0aDogY3J5cHRvLmNvbnN0YW50cy5SU0FfUFNTX1NBTFRMRU5fRElHRVNUXG4gICAgfSwgJ2Jhc2U2NCcpKTtcbiAgICByZXR1cm4gZnJvbUJhc2U2NChzaWcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBTU0tleVZlcmlmaWVyKGJpdHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZlcmlmeSh0aGluZywgc2lnbmF0dXJlLCBwdWJsaWNLZXkpIHtcbiAgICBjaGVja0lzUHVibGljS2V5KHB1YmxpY0tleSk7XG4gICAgdGhpbmcgPSBub3JtYWxpemVJbnB1dCh0aGluZyk7XG4gICAgc2lnbmF0dXJlID0gdG9CYXNlNjQoc2lnbmF0dXJlKTtcbiAgICB2YXIgdmVyaWZpZXIgPSBjcnlwdG8uY3JlYXRlVmVyaWZ5KCdSU0EtU0hBJyArIGJpdHMpO1xuICAgIHZlcmlmaWVyLnVwZGF0ZSh0aGluZyk7XG4gICAgcmV0dXJuIHZlcmlmaWVyLnZlcmlmeSh7XG4gICAgICBrZXk6IHB1YmxpY0tleSxcbiAgICAgIHBhZGRpbmc6IGNyeXB0by5jb25zdGFudHMuUlNBX1BLQ1MxX1BTU19QQURESU5HLFxuICAgICAgc2FsdExlbmd0aDogY3J5cHRvLmNvbnN0YW50cy5SU0FfUFNTX1NBTFRMRU5fRElHRVNUXG4gICAgfSwgc2lnbmF0dXJlLCAnYmFzZTY0Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRUNEU0FTaWduZXIoYml0cykge1xuICB2YXIgaW5uZXIgPSBjcmVhdGVLZXlTaWduZXIoYml0cyk7XG4gIHJldHVybiBmdW5jdGlvbiBzaWduKCkge1xuICAgIHZhciBzaWduYXR1cmUgPSBpbm5lci5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIHNpZ25hdHVyZSA9IGZvcm1hdEVjZHNhLmRlclRvSm9zZShzaWduYXR1cmUsICdFUycgKyBiaXRzKTtcbiAgICByZXR1cm4gc2lnbmF0dXJlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVFQ0RTQVZlcmlmZXIoYml0cykge1xuICB2YXIgaW5uZXIgPSBjcmVhdGVLZXlWZXJpZmllcihiaXRzKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZlcmlmeSh0aGluZywgc2lnbmF0dXJlLCBwdWJsaWNLZXkpIHtcbiAgICBzaWduYXR1cmUgPSBmb3JtYXRFY2RzYS5qb3NlVG9EZXIoc2lnbmF0dXJlLCAnRVMnICsgYml0cykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIHZhciByZXN1bHQgPSBpbm5lcih0aGluZywgc2lnbmF0dXJlLCBwdWJsaWNLZXkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5vbmVTaWduZXIoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzaWduKCkge1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVOb25lVmVyaWZpZXIoKSB7XG4gIHJldHVybiBmdW5jdGlvbiB2ZXJpZnkodGhpbmcsIHNpZ25hdHVyZSkge1xuICAgIHJldHVybiBzaWduYXR1cmUgPT09ICcnO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gandhKGFsZ29yaXRobSkge1xuICB2YXIgc2lnbmVyRmFjdG9yaWVzID0ge1xuICAgIGhzOiBjcmVhdGVIbWFjU2lnbmVyLFxuICAgIHJzOiBjcmVhdGVLZXlTaWduZXIsXG4gICAgcHM6IGNyZWF0ZVBTU0tleVNpZ25lcixcbiAgICBlczogY3JlYXRlRUNEU0FTaWduZXIsXG4gICAgbm9uZTogY3JlYXRlTm9uZVNpZ25lcixcbiAgfVxuICB2YXIgdmVyaWZpZXJGYWN0b3JpZXMgPSB7XG4gICAgaHM6IGNyZWF0ZUhtYWNWZXJpZmllcixcbiAgICByczogY3JlYXRlS2V5VmVyaWZpZXIsXG4gICAgcHM6IGNyZWF0ZVBTU0tleVZlcmlmaWVyLFxuICAgIGVzOiBjcmVhdGVFQ0RTQVZlcmlmZXIsXG4gICAgbm9uZTogY3JlYXRlTm9uZVZlcmlmaWVyLFxuICB9XG4gIHZhciBtYXRjaCA9IGFsZ29yaXRobS5tYXRjaCgvXihSU3xQU3xFU3xIUykoMjU2fDM4NHw1MTIpJHxeKG5vbmUpJC9pKTtcbiAgaWYgKCFtYXRjaClcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfQUxHT1JJVEhNLCBhbGdvcml0aG0pO1xuICB2YXIgYWxnbyA9IChtYXRjaFsxXSB8fCBtYXRjaFszXSkudG9Mb3dlckNhc2UoKTtcbiAgdmFyIGJpdHMgPSBtYXRjaFsyXTtcblxuICByZXR1cm4ge1xuICAgIHNpZ246IHNpZ25lckZhY3Rvcmllc1thbGdvXShiaXRzKSxcbiAgICB2ZXJpZnk6IHZlcmlmaWVyRmFjdG9yaWVzW2FsZ29dKGJpdHMpLFxuICB9XG59O1xuIiwKICAgICIvKmdsb2JhbCBtb2R1bGUqL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0b1N0cmluZyhvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKVxuICAgIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyB8fCBCdWZmZXIuaXNCdWZmZXIob2JqKSlcbiAgICByZXR1cm4gb2JqLnRvU3RyaW5nKCk7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopO1xufTtcbiIsCiAgICAiLypnbG9iYWwgbW9kdWxlKi9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBEYXRhU3RyZWFtID0gcmVxdWlyZSgnLi9kYXRhLXN0cmVhbScpO1xudmFyIGp3YSA9IHJlcXVpcmUoJ2p3YScpO1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b3N0cmluZycpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbmZ1bmN0aW9uIGJhc2U2NHVybChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIHJldHVybiBCdWZmZXJcbiAgICAuZnJvbShzdHJpbmcsIGVuY29kaW5nKVxuICAgIC50b1N0cmluZygnYmFzZTY0JylcbiAgICAucmVwbGFjZSgvPS9nLCAnJylcbiAgICAucmVwbGFjZSgvXFwrL2csICctJylcbiAgICAucmVwbGFjZSgvXFwvL2csICdfJyk7XG59XG5cbmZ1bmN0aW9uIGp3c1NlY3VyZWRJbnB1dChoZWFkZXIsIHBheWxvYWQsIGVuY29kaW5nKSB7XG4gIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0ZjgnO1xuICB2YXIgZW5jb2RlZEhlYWRlciA9IGJhc2U2NHVybCh0b1N0cmluZyhoZWFkZXIpLCAnYmluYXJ5Jyk7XG4gIHZhciBlbmNvZGVkUGF5bG9hZCA9IGJhc2U2NHVybCh0b1N0cmluZyhwYXlsb2FkKSwgZW5jb2RpbmcpO1xuICByZXR1cm4gdXRpbC5mb3JtYXQoJyVzLiVzJywgZW5jb2RlZEhlYWRlciwgZW5jb2RlZFBheWxvYWQpO1xufVxuXG5mdW5jdGlvbiBqd3NTaWduKG9wdHMpIHtcbiAgdmFyIGhlYWRlciA9IG9wdHMuaGVhZGVyO1xuICB2YXIgcGF5bG9hZCA9IG9wdHMucGF5bG9hZDtcbiAgdmFyIHNlY3JldE9yS2V5ID0gb3B0cy5zZWNyZXQgfHwgb3B0cy5wcml2YXRlS2V5O1xuICB2YXIgZW5jb2RpbmcgPSBvcHRzLmVuY29kaW5nO1xuICB2YXIgYWxnbyA9IGp3YShoZWFkZXIuYWxnKTtcbiAgdmFyIHNlY3VyZWRJbnB1dCA9IGp3c1NlY3VyZWRJbnB1dChoZWFkZXIsIHBheWxvYWQsIGVuY29kaW5nKTtcbiAgdmFyIHNpZ25hdHVyZSA9IGFsZ28uc2lnbihzZWN1cmVkSW5wdXQsIHNlY3JldE9yS2V5KTtcbiAgcmV0dXJuIHV0aWwuZm9ybWF0KCclcy4lcycsIHNlY3VyZWRJbnB1dCwgc2lnbmF0dXJlKTtcbn1cblxuZnVuY3Rpb24gU2lnblN0cmVhbShvcHRzKSB7XG4gIHZhciBzZWNyZXQgPSBvcHRzLnNlY3JldHx8b3B0cy5wcml2YXRlS2V5fHxvcHRzLmtleTtcbiAgdmFyIHNlY3JldFN0cmVhbSA9IG5ldyBEYXRhU3RyZWFtKHNlY3JldCk7XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuICB0aGlzLmhlYWRlciA9IG9wdHMuaGVhZGVyO1xuICB0aGlzLmVuY29kaW5nID0gb3B0cy5lbmNvZGluZztcbiAgdGhpcy5zZWNyZXQgPSB0aGlzLnByaXZhdGVLZXkgPSB0aGlzLmtleSA9IHNlY3JldFN0cmVhbTtcbiAgdGhpcy5wYXlsb2FkID0gbmV3IERhdGFTdHJlYW0ob3B0cy5wYXlsb2FkKTtcbiAgdGhpcy5zZWNyZXQub25jZSgnY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLnBheWxvYWQud3JpdGFibGUgJiYgdGhpcy5yZWFkYWJsZSlcbiAgICAgIHRoaXMuc2lnbigpO1xuICB9LmJpbmQodGhpcykpO1xuXG4gIHRoaXMucGF5bG9hZC5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuc2VjcmV0LndyaXRhYmxlICYmIHRoaXMucmVhZGFibGUpXG4gICAgICB0aGlzLnNpZ24oKTtcbiAgfS5iaW5kKHRoaXMpKTtcbn1cbnV0aWwuaW5oZXJpdHMoU2lnblN0cmVhbSwgU3RyZWFtKTtcblxuU2lnblN0cmVhbS5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24oKSB7XG4gIHRyeSB7XG4gICAgdmFyIHNpZ25hdHVyZSA9IGp3c1NpZ24oe1xuICAgICAgaGVhZGVyOiB0aGlzLmhlYWRlcixcbiAgICAgIHBheWxvYWQ6IHRoaXMucGF5bG9hZC5idWZmZXIsXG4gICAgICBzZWNyZXQ6IHRoaXMuc2VjcmV0LmJ1ZmZlcixcbiAgICAgIGVuY29kaW5nOiB0aGlzLmVuY29kaW5nXG4gICAgfSk7XG4gICAgdGhpcy5lbWl0KCdkb25lJywgc2lnbmF0dXJlKTtcbiAgICB0aGlzLmVtaXQoJ2RhdGEnLCBzaWduYXR1cmUpO1xuICAgIHRoaXMuZW1pdCgnZW5kJyk7XG4gICAgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHJldHVybiBzaWduYXR1cmU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGUpO1xuICAgIHRoaXMuZW1pdCgnY2xvc2UnKTtcbiAgfVxufTtcblxuU2lnblN0cmVhbS5zaWduID0gandzU2lnbjtcblxubW9kdWxlLmV4cG9ydHMgPSBTaWduU3RyZWFtO1xuIiwKICAgICIvKmdsb2JhbCBtb2R1bGUqL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIERhdGFTdHJlYW0gPSByZXF1aXJlKCcuL2RhdGEtc3RyZWFtJyk7XG52YXIgandhID0gcmVxdWlyZSgnandhJyk7XG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3Rvc3RyaW5nJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBKV1NfUkVHRVggPSAvXlthLXpBLVowLTlcXC1fXSs/XFwuW2EtekEtWjAtOVxcLV9dKz9cXC4oW2EtekEtWjAtOVxcLV9dKyk/JC87XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHRoaW5nKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpbmcpID09PSAnW29iamVjdCBPYmplY3RdJztcbn1cblxuZnVuY3Rpb24gc2FmZUpzb25QYXJzZSh0aGluZykge1xuICBpZiAoaXNPYmplY3QodGhpbmcpKVxuICAgIHJldHVybiB0aGluZztcbiAgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2UodGhpbmcpOyB9XG4gIGNhdGNoIChlKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbn1cblxuZnVuY3Rpb24gaGVhZGVyRnJvbUpXUyhqd3NTaWcpIHtcbiAgdmFyIGVuY29kZWRIZWFkZXIgPSBqd3NTaWcuc3BsaXQoJy4nLCAxKVswXTtcbiAgcmV0dXJuIHNhZmVKc29uUGFyc2UoQnVmZmVyLmZyb20oZW5jb2RlZEhlYWRlciwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdiaW5hcnknKSk7XG59XG5cbmZ1bmN0aW9uIHNlY3VyZWRJbnB1dEZyb21KV1MoandzU2lnKSB7XG4gIHJldHVybiBqd3NTaWcuc3BsaXQoJy4nLCAyKS5qb2luKCcuJyk7XG59XG5cbmZ1bmN0aW9uIHNpZ25hdHVyZUZyb21KV1MoandzU2lnKSB7XG4gIHJldHVybiBqd3NTaWcuc3BsaXQoJy4nKVsyXTtcbn1cblxuZnVuY3Rpb24gcGF5bG9hZEZyb21KV1MoandzU2lnLCBlbmNvZGluZykge1xuICBlbmNvZGluZyA9IGVuY29kaW5nIHx8ICd1dGY4JztcbiAgdmFyIHBheWxvYWQgPSBqd3NTaWcuc3BsaXQoJy4nKVsxXTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHBheWxvYWQsICdiYXNlNjQnKS50b1N0cmluZyhlbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRKd3Moc3RyaW5nKSB7XG4gIHJldHVybiBKV1NfUkVHRVgudGVzdChzdHJpbmcpICYmICEhaGVhZGVyRnJvbUpXUyhzdHJpbmcpO1xufVxuXG5mdW5jdGlvbiBqd3NWZXJpZnkoandzU2lnLCBhbGdvcml0aG0sIHNlY3JldE9yS2V5KSB7XG4gIGlmICghYWxnb3JpdGhtKSB7XG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIk1pc3NpbmcgYWxnb3JpdGhtIHBhcmFtZXRlciBmb3IgandzLnZlcmlmeVwiKTtcbiAgICBlcnIuY29kZSA9IFwiTUlTU0lOR19BTEdPUklUSE1cIjtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbiAgandzU2lnID0gdG9TdHJpbmcoandzU2lnKTtcbiAgdmFyIHNpZ25hdHVyZSA9IHNpZ25hdHVyZUZyb21KV1MoandzU2lnKTtcbiAgdmFyIHNlY3VyZWRJbnB1dCA9IHNlY3VyZWRJbnB1dEZyb21KV1MoandzU2lnKTtcbiAgdmFyIGFsZ28gPSBqd2EoYWxnb3JpdGhtKTtcbiAgcmV0dXJuIGFsZ28udmVyaWZ5KHNlY3VyZWRJbnB1dCwgc2lnbmF0dXJlLCBzZWNyZXRPcktleSk7XG59XG5cbmZ1bmN0aW9uIGp3c0RlY29kZShqd3NTaWcsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge307XG4gIGp3c1NpZyA9IHRvU3RyaW5nKGp3c1NpZyk7XG5cbiAgaWYgKCFpc1ZhbGlkSndzKGp3c1NpZykpXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgdmFyIGhlYWRlciA9IGhlYWRlckZyb21KV1MoandzU2lnKTtcblxuICBpZiAoIWhlYWRlcilcbiAgICByZXR1cm4gbnVsbDtcblxuICB2YXIgcGF5bG9hZCA9IHBheWxvYWRGcm9tSldTKGp3c1NpZyk7XG4gIGlmIChoZWFkZXIudHlwID09PSAnSldUJyB8fCBvcHRzLmpzb24pXG4gICAgcGF5bG9hZCA9IEpTT04ucGFyc2UocGF5bG9hZCwgb3B0cy5lbmNvZGluZyk7XG5cbiAgcmV0dXJuIHtcbiAgICBoZWFkZXI6IGhlYWRlcixcbiAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlRnJvbUpXUyhqd3NTaWcpXG4gIH07XG59XG5cbmZ1bmN0aW9uIFZlcmlmeVN0cmVhbShvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICB2YXIgc2VjcmV0T3JLZXkgPSBvcHRzLnNlY3JldHx8b3B0cy5wdWJsaWNLZXl8fG9wdHMua2V5O1xuICB2YXIgc2VjcmV0U3RyZWFtID0gbmV3IERhdGFTdHJlYW0oc2VjcmV0T3JLZXkpO1xuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgdGhpcy5hbGdvcml0aG0gPSBvcHRzLmFsZ29yaXRobTtcbiAgdGhpcy5lbmNvZGluZyA9IG9wdHMuZW5jb2Rpbmc7XG4gIHRoaXMuc2VjcmV0ID0gdGhpcy5wdWJsaWNLZXkgPSB0aGlzLmtleSA9IHNlY3JldFN0cmVhbTtcbiAgdGhpcy5zaWduYXR1cmUgPSBuZXcgRGF0YVN0cmVhbShvcHRzLnNpZ25hdHVyZSk7XG4gIHRoaXMuc2VjcmV0Lm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5zaWduYXR1cmUud3JpdGFibGUgJiYgdGhpcy5yZWFkYWJsZSlcbiAgICAgIHRoaXMudmVyaWZ5KCk7XG4gIH0uYmluZCh0aGlzKSk7XG5cbiAgdGhpcy5zaWduYXR1cmUub25jZSgnY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLnNlY3JldC53cml0YWJsZSAmJiB0aGlzLnJlYWRhYmxlKVxuICAgICAgdGhpcy52ZXJpZnkoKTtcbiAgfS5iaW5kKHRoaXMpKTtcbn1cbnV0aWwuaW5oZXJpdHMoVmVyaWZ5U3RyZWFtLCBTdHJlYW0pO1xuVmVyaWZ5U3RyZWFtLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHZhbGlkID0gandzVmVyaWZ5KHRoaXMuc2lnbmF0dXJlLmJ1ZmZlciwgdGhpcy5hbGdvcml0aG0sIHRoaXMua2V5LmJ1ZmZlcik7XG4gICAgdmFyIG9iaiA9IGp3c0RlY29kZSh0aGlzLnNpZ25hdHVyZS5idWZmZXIsIHRoaXMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW1pdCgnZG9uZScsIHZhbGlkLCBvYmopO1xuICAgIHRoaXMuZW1pdCgnZGF0YScsIHZhbGlkKTtcbiAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbiAgICByZXR1cm4gdmFsaWQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGUpO1xuICAgIHRoaXMuZW1pdCgnY2xvc2UnKTtcbiAgfVxufTtcblxuVmVyaWZ5U3RyZWFtLmRlY29kZSA9IGp3c0RlY29kZTtcblZlcmlmeVN0cmVhbS5pc1ZhbGlkID0gaXNWYWxpZEp3cztcblZlcmlmeVN0cmVhbS52ZXJpZnkgPSBqd3NWZXJpZnk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVyaWZ5U3RyZWFtO1xuIiwKICAgICIvKmdsb2JhbCBleHBvcnRzKi9cbnZhciBTaWduU3RyZWFtID0gcmVxdWlyZSgnLi9saWIvc2lnbi1zdHJlYW0nKTtcbnZhciBWZXJpZnlTdHJlYW0gPSByZXF1aXJlKCcuL2xpYi92ZXJpZnktc3RyZWFtJyk7XG5cbnZhciBBTEdPUklUSE1TID0gW1xuICAnSFMyNTYnLCAnSFMzODQnLCAnSFM1MTInLFxuICAnUlMyNTYnLCAnUlMzODQnLCAnUlM1MTInLFxuICAnUFMyNTYnLCAnUFMzODQnLCAnUFM1MTInLFxuICAnRVMyNTYnLCAnRVMzODQnLCAnRVM1MTInXG5dO1xuXG5leHBvcnRzLkFMR09SSVRITVMgPSBBTEdPUklUSE1TO1xuZXhwb3J0cy5zaWduID0gU2lnblN0cmVhbS5zaWduO1xuZXhwb3J0cy52ZXJpZnkgPSBWZXJpZnlTdHJlYW0udmVyaWZ5O1xuZXhwb3J0cy5kZWNvZGUgPSBWZXJpZnlTdHJlYW0uZGVjb2RlO1xuZXhwb3J0cy5pc1ZhbGlkID0gVmVyaWZ5U3RyZWFtLmlzVmFsaWQ7XG5leHBvcnRzLmNyZWF0ZVNpZ24gPSBmdW5jdGlvbiBjcmVhdGVTaWduKG9wdHMpIHtcbiAgcmV0dXJuIG5ldyBTaWduU3RyZWFtKG9wdHMpO1xufTtcbmV4cG9ydHMuY3JlYXRlVmVyaWZ5ID0gZnVuY3Rpb24gY3JlYXRlVmVyaWZ5KG9wdHMpIHtcbiAgcmV0dXJuIG5ldyBWZXJpZnlTdHJlYW0ob3B0cyk7XG59O1xuIiwKICAgICJ2YXIgandzID0gcmVxdWlyZSgnandzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGp3dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGRlY29kZWQgPSBqd3MuZGVjb2RlKGp3dCwgb3B0aW9ucyk7XG4gIGlmICghZGVjb2RlZCkgeyByZXR1cm4gbnVsbDsgfVxuICB2YXIgcGF5bG9hZCA9IGRlY29kZWQucGF5bG9hZDtcblxuICAvL3RyeSBwYXJzZSB0aGUgcGF5bG9hZFxuICBpZih0eXBlb2YgcGF5bG9hZCA9PT0gJ3N0cmluZycpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIG9iaiA9IEpTT04ucGFyc2UocGF5bG9hZCk7XG4gICAgICBpZihvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcGF5bG9hZCA9IG9iajtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IH1cbiAgfVxuXG4gIC8vcmV0dXJuIGhlYWRlciBpZiBgY29tcGxldGVgIG9wdGlvbiBpcyBlbmFibGVkLiAgaGVhZGVyIGluY2x1ZGVzIGNsYWltc1xuICAvL3N1Y2ggYXMgYGtpZGAgYW5kIGBhbGdgIHVzZWQgdG8gc2VsZWN0IHRoZSBrZXkgd2l0aGluIGEgSldLUyBuZWVkZWQgdG9cbiAgLy92ZXJpZnkgdGhlIHNpZ25hdHVyZVxuICBpZiAob3B0aW9ucy5jb21wbGV0ZSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB7XG4gICAgICBoZWFkZXI6IGRlY29kZWQuaGVhZGVyLFxuICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgIHNpZ25hdHVyZTogZGVjb2RlZC5zaWduYXR1cmVcbiAgICB9O1xuICB9XG4gIHJldHVybiBwYXlsb2FkO1xufTtcbiIsCiAgICAidmFyIEpzb25XZWJUb2tlbkVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UsIGVycm9yKSB7XG4gIEVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gIGlmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbiAgdGhpcy5uYW1lID0gJ0pzb25XZWJUb2tlbkVycm9yJztcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgaWYgKGVycm9yKSB0aGlzLmlubmVyID0gZXJyb3I7XG59O1xuXG5Kc29uV2ViVG9rZW5FcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5Kc29uV2ViVG9rZW5FcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBKc29uV2ViVG9rZW5FcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBKc29uV2ViVG9rZW5FcnJvcjtcbiIsCiAgICAidmFyIEpzb25XZWJUb2tlbkVycm9yID0gcmVxdWlyZSgnLi9Kc29uV2ViVG9rZW5FcnJvcicpO1xuXG52YXIgTm90QmVmb3JlRXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSwgZGF0ZSkge1xuICBKc29uV2ViVG9rZW5FcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UpO1xuICB0aGlzLm5hbWUgPSAnTm90QmVmb3JlRXJyb3InO1xuICB0aGlzLmRhdGUgPSBkYXRlO1xufTtcblxuTm90QmVmb3JlRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShKc29uV2ViVG9rZW5FcnJvci5wcm90b3R5cGUpO1xuXG5Ob3RCZWZvcmVFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBOb3RCZWZvcmVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBOb3RCZWZvcmVFcnJvcjsiLAogICAgInZhciBKc29uV2ViVG9rZW5FcnJvciA9IHJlcXVpcmUoJy4vSnNvbldlYlRva2VuRXJyb3InKTtcblxudmFyIFRva2VuRXhwaXJlZEVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UsIGV4cGlyZWRBdCkge1xuICBKc29uV2ViVG9rZW5FcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UpO1xuICB0aGlzLm5hbWUgPSAnVG9rZW5FeHBpcmVkRXJyb3InO1xuICB0aGlzLmV4cGlyZWRBdCA9IGV4cGlyZWRBdDtcbn07XG5cblRva2VuRXhwaXJlZEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSnNvbldlYlRva2VuRXJyb3IucHJvdG90eXBlKTtcblxuVG9rZW5FeHBpcmVkRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9rZW5FeHBpcmVkRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gVG9rZW5FeHBpcmVkRXJyb3I7IiwKICAgICIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHcgPSBkICogNztcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnd2Vla3MnOlxuICAgIGNhc2UgJ3dlZWsnOlxuICAgIGNhc2UgJ3cnOlxuICAgICAgcmV0dXJuIG4gKiB3O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICB9XG4gIHJldHVybiBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBuKSArICcgJyArIG5hbWUgKyAoaXNQbHVyYWwgPyAncycgOiAnJyk7XG59XG4iLAogICAgInZhciBtcyA9IHJlcXVpcmUoJ21zJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRpbWUsIGlhdCkge1xuICB2YXIgdGltZXN0YW1wID0gaWF0IHx8IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuXG4gIGlmICh0eXBlb2YgdGltZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gbXModGltZSk7XG4gICAgaWYgKHR5cGVvZiBtaWxsaXNlY29uZHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBNYXRoLmZsb29yKHRpbWVzdGFtcCArIG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB0aW1lID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB0aW1lc3RhbXAgKyB0aW1lO1xuICB9IGVsc2Uge1xuICAgIHJldHVybjtcbiAgfVxuXG59OyIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8vIE5vdGU6IHRoaXMgaXMgdGhlIHNlbXZlci5vcmcgdmVyc2lvbiBvZiB0aGUgc3BlYyB0aGF0IGl0IGltcGxlbWVudHNcbi8vIE5vdCBuZWNlc3NhcmlseSB0aGUgcGFja2FnZSB2ZXJzaW9uIG9mIHRoaXMgY29kZS5cbmNvbnN0IFNFTVZFUl9TUEVDX1ZFUlNJT04gPSAnMi4wLjAnXG5cbmNvbnN0IE1BWF9MRU5HVEggPSAyNTZcbmNvbnN0IE1BWF9TQUZFX0lOVEVHRVIgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fFxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gOTAwNzE5OTI1NDc0MDk5MVxuXG4vLyBNYXggc2FmZSBzZWdtZW50IGxlbmd0aCBmb3IgY29lcmNpb24uXG5jb25zdCBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIID0gMTZcblxuLy8gTWF4IHNhZmUgbGVuZ3RoIGZvciBhIGJ1aWxkIGlkZW50aWZpZXIuIFRoZSBtYXggbGVuZ3RoIG1pbnVzIDYgY2hhcmFjdGVycyBmb3Jcbi8vIHRoZSBzaG9ydGVzdCB2ZXJzaW9uIHdpdGggYSBidWlsZCAwLjAuMCtCVUlMRC5cbmNvbnN0IE1BWF9TQUZFX0JVSUxEX0xFTkdUSCA9IE1BWF9MRU5HVEggLSA2XG5cbmNvbnN0IFJFTEVBU0VfVFlQRVMgPSBbXG4gICdtYWpvcicsXG4gICdwcmVtYWpvcicsXG4gICdtaW5vcicsXG4gICdwcmVtaW5vcicsXG4gICdwYXRjaCcsXG4gICdwcmVwYXRjaCcsXG4gICdwcmVyZWxlYXNlJyxcbl1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE1BWF9MRU5HVEgsXG4gIE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEgsXG4gIE1BWF9TQUZFX0JVSUxEX0xFTkdUSCxcbiAgTUFYX1NBRkVfSU5URUdFUixcbiAgUkVMRUFTRV9UWVBFUyxcbiAgU0VNVkVSX1NQRUNfVkVSU0lPTixcbiAgRkxBR19JTkNMVURFX1BSRVJFTEVBU0U6IDBiMDAxLFxuICBGTEFHX0xPT1NFOiAwYjAxMCxcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGRlYnVnID0gKFxuICB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgcHJvY2Vzcy5lbnYgJiZcbiAgcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyAmJlxuICAvXFxic2VtdmVyXFxiL2kudGVzdChwcm9jZXNzLmVudi5OT0RFX0RFQlVHKVxuKSA/ICguLi5hcmdzKSA9PiBjb25zb2xlLmVycm9yKCdTRU1WRVInLCAuLi5hcmdzKVxuICA6ICgpID0+IHt9XG5cbm1vZHVsZS5leHBvcnRzID0gZGVidWdcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCxcbiAgTUFYX1NBRkVfQlVJTERfTEVOR1RILFxuICBNQVhfTEVOR1RILFxufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi9kZWJ1ZycpXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB7fVxuXG4vLyBUaGUgYWN0dWFsIHJlZ2V4cHMgZ28gb24gZXhwb3J0cy5yZVxuY29uc3QgcmUgPSBleHBvcnRzLnJlID0gW11cbmNvbnN0IHNhZmVSZSA9IGV4cG9ydHMuc2FmZVJlID0gW11cbmNvbnN0IHNyYyA9IGV4cG9ydHMuc3JjID0gW11cbmNvbnN0IHNhZmVTcmMgPSBleHBvcnRzLnNhZmVTcmMgPSBbXVxuY29uc3QgdCA9IGV4cG9ydHMudCA9IHt9XG5sZXQgUiA9IDBcblxuY29uc3QgTEVUVEVSREFTSE5VTUJFUiA9ICdbYS16QS1aMC05LV0nXG5cbi8vIFJlcGxhY2Ugc29tZSBncmVlZHkgcmVnZXggdG9rZW5zIHRvIHByZXZlbnQgcmVnZXggZG9zIGlzc3Vlcy4gVGhlc2UgcmVnZXggYXJlXG4vLyB1c2VkIGludGVybmFsbHkgdmlhIHRoZSBzYWZlUmUgb2JqZWN0IHNpbmNlIGFsbCBpbnB1dHMgaW4gdGhpcyBsaWJyYXJ5IGdldFxuLy8gbm9ybWFsaXplZCBmaXJzdCB0byB0cmltIGFuZCBjb2xsYXBzZSBhbGwgZXh0cmEgd2hpdGVzcGFjZS4gVGhlIG9yaWdpbmFsXG4vLyByZWdleGVzIGFyZSBleHBvcnRlZCBmb3IgdXNlcmxhbmQgY29uc3VtcHRpb24gYW5kIGxvd2VyIGxldmVsIHVzYWdlLiBBXG4vLyBmdXR1cmUgYnJlYWtpbmcgY2hhbmdlIGNvdWxkIGV4cG9ydCB0aGUgc2FmZXIgcmVnZXggb25seSB3aXRoIGEgbm90ZSB0aGF0XG4vLyBhbGwgaW5wdXQgc2hvdWxkIGhhdmUgZXh0cmEgd2hpdGVzcGFjZSByZW1vdmVkLlxuY29uc3Qgc2FmZVJlZ2V4UmVwbGFjZW1lbnRzID0gW1xuICBbJ1xcXFxzJywgMV0sXG4gIFsnXFxcXGQnLCBNQVhfTEVOR1RIXSxcbiAgW0xFVFRFUkRBU0hOVU1CRVIsIE1BWF9TQUZFX0JVSUxEX0xFTkdUSF0sXG5dXG5cbmNvbnN0IG1ha2VTYWZlUmVnZXggPSAodmFsdWUpID0+IHtcbiAgZm9yIChjb25zdCBbdG9rZW4sIG1heF0gb2Ygc2FmZVJlZ2V4UmVwbGFjZW1lbnRzKSB7XG4gICAgdmFsdWUgPSB2YWx1ZVxuICAgICAgLnNwbGl0KGAke3Rva2VufSpgKS5qb2luKGAke3Rva2VufXswLCR7bWF4fX1gKVxuICAgICAgLnNwbGl0KGAke3Rva2VufStgKS5qb2luKGAke3Rva2VufXsxLCR7bWF4fX1gKVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG5jb25zdCBjcmVhdGVUb2tlbiA9IChuYW1lLCB2YWx1ZSwgaXNHbG9iYWwpID0+IHtcbiAgY29uc3Qgc2FmZSA9IG1ha2VTYWZlUmVnZXgodmFsdWUpXG4gIGNvbnN0IGluZGV4ID0gUisrXG4gIGRlYnVnKG5hbWUsIGluZGV4LCB2YWx1ZSlcbiAgdFtuYW1lXSA9IGluZGV4XG4gIHNyY1tpbmRleF0gPSB2YWx1ZVxuICBzYWZlU3JjW2luZGV4XSA9IHNhZmVcbiAgcmVbaW5kZXhdID0gbmV3IFJlZ0V4cCh2YWx1ZSwgaXNHbG9iYWwgPyAnZycgOiB1bmRlZmluZWQpXG4gIHNhZmVSZVtpbmRleF0gPSBuZXcgUmVnRXhwKHNhZmUsIGlzR2xvYmFsID8gJ2cnIDogdW5kZWZpbmVkKVxufVxuXG4vLyBUaGUgZm9sbG93aW5nIFJlZ3VsYXIgRXhwcmVzc2lvbnMgY2FuIGJlIHVzZWQgZm9yIHRva2VuaXppbmcsXG4vLyB2YWxpZGF0aW5nLCBhbmQgcGFyc2luZyBTZW1WZXIgdmVyc2lvbiBzdHJpbmdzLlxuXG4vLyAjIyBOdW1lcmljIElkZW50aWZpZXJcbi8vIEEgc2luZ2xlIGAwYCwgb3IgYSBub24temVybyBkaWdpdCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgZGlnaXRzLlxuXG5jcmVhdGVUb2tlbignTlVNRVJJQ0lERU5USUZJRVInLCAnMHxbMS05XVxcXFxkKicpXG5jcmVhdGVUb2tlbignTlVNRVJJQ0lERU5USUZJRVJMT09TRScsICdcXFxcZCsnKVxuXG4vLyAjIyBOb24tbnVtZXJpYyBJZGVudGlmaWVyXG4vLyBaZXJvIG9yIG1vcmUgZGlnaXRzLCBmb2xsb3dlZCBieSBhIGxldHRlciBvciBoeXBoZW4sIGFuZCB0aGVuIHplcm8gb3Jcbi8vIG1vcmUgbGV0dGVycywgZGlnaXRzLCBvciBoeXBoZW5zLlxuXG5jcmVhdGVUb2tlbignTk9OTlVNRVJJQ0lERU5USUZJRVInLCBgXFxcXGQqW2EtekEtWi1dJHtMRVRURVJEQVNITlVNQkVSfSpgKVxuXG4vLyAjIyBNYWluIFZlcnNpb25cbi8vIFRocmVlIGRvdC1zZXBhcmF0ZWQgbnVtZXJpYyBpZGVudGlmaWVycy5cblxuY3JlYXRlVG9rZW4oJ01BSU5WRVJTSU9OJywgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KWApXG5cbmNyZWF0ZVRva2VuKCdNQUlOVkVSU0lPTkxPT1NFJywgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlgKVxuXG4vLyAjIyBQcmUtcmVsZWFzZSBWZXJzaW9uIElkZW50aWZpZXJcbi8vIEEgbnVtZXJpYyBpZGVudGlmaWVyLCBvciBhIG5vbi1udW1lcmljIGlkZW50aWZpZXIuXG4vLyBOb24tbnVtYmVyaWMgaWRlbnRpZmllcnMgaW5jbHVkZSBudW1iZXJpYyBpZGVudGlmaWVycyBidXQgY2FuIGJlIGxvbmdlci5cbi8vIFRoZXJlZm9yZSBub24tbnVtYmVyaWMgaWRlbnRpZmllcnMgbXVzdCBnbyBmaXJzdC5cblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VJREVOVElGSUVSJywgYCg/OiR7c3JjW3QuTk9OTlVNRVJJQ0lERU5USUZJRVJdXG59fCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlgKVxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRScsIGAoPzoke3NyY1t0Lk5PTk5VTUVSSUNJREVOVElGSUVSXVxufXwke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlgKVxuXG4vLyAjIyBQcmUtcmVsZWFzZSBWZXJzaW9uXG4vLyBIeXBoZW4sIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGRvdC1zZXBhcmF0ZWQgcHJlLXJlbGVhc2UgdmVyc2lvblxuLy8gaWRlbnRpZmllcnMuXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFJywgYCg/Oi0oJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUl1cbn0oPzpcXFxcLiR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJdfSkqKSlgKVxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRUxPT1NFJywgYCg/Oi0/KCR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRV1cbn0oPzpcXFxcLiR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRV19KSopKWApXG5cbi8vICMjIEJ1aWxkIE1ldGFkYXRhIElkZW50aWZpZXJcbi8vIEFueSBjb21iaW5hdGlvbiBvZiBkaWdpdHMsIGxldHRlcnMsIG9yIGh5cGhlbnMuXG5cbmNyZWF0ZVRva2VuKCdCVUlMRElERU5USUZJRVInLCBgJHtMRVRURVJEQVNITlVNQkVSfStgKVxuXG4vLyAjIyBCdWlsZCBNZXRhZGF0YVxuLy8gUGx1cyBzaWduLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwZXJpb2Qtc2VwYXJhdGVkIGJ1aWxkIG1ldGFkYXRhXG4vLyBpZGVudGlmaWVycy5cblxuY3JlYXRlVG9rZW4oJ0JVSUxEJywgYCg/OlxcXFwrKCR7c3JjW3QuQlVJTERJREVOVElGSUVSXVxufSg/OlxcXFwuJHtzcmNbdC5CVUlMRElERU5USUZJRVJdfSkqKSlgKVxuXG4vLyAjIyBGdWxsIFZlcnNpb24gU3RyaW5nXG4vLyBBIG1haW4gdmVyc2lvbiwgZm9sbG93ZWQgb3B0aW9uYWxseSBieSBhIHByZS1yZWxlYXNlIHZlcnNpb24gYW5kXG4vLyBidWlsZCBtZXRhZGF0YS5cblxuLy8gTm90ZSB0aGF0IHRoZSBvbmx5IG1ham9yLCBtaW5vciwgcGF0Y2gsIGFuZCBwcmUtcmVsZWFzZSBzZWN0aW9ucyBvZlxuLy8gdGhlIHZlcnNpb24gc3RyaW5nIGFyZSBjYXB0dXJpbmcgZ3JvdXBzLiAgVGhlIGJ1aWxkIG1ldGFkYXRhIGlzIG5vdCBhXG4vLyBjYXB0dXJpbmcgZ3JvdXAsIGJlY2F1c2UgaXQgc2hvdWxkIG5vdCBldmVyIGJlIHVzZWQgaW4gdmVyc2lvblxuLy8gY29tcGFyaXNvbi5cblxuY3JlYXRlVG9rZW4oJ0ZVTExQTEFJTicsIGB2PyR7c3JjW3QuTUFJTlZFUlNJT05dXG59JHtzcmNbdC5QUkVSRUxFQVNFXX0/JHtcbiAgc3JjW3QuQlVJTERdfT9gKVxuXG5jcmVhdGVUb2tlbignRlVMTCcsIGBeJHtzcmNbdC5GVUxMUExBSU5dfSRgKVxuXG4vLyBsaWtlIGZ1bGwsIGJ1dCBhbGxvd3MgdjEuMi4zIGFuZCA9MS4yLjMsIHdoaWNoIHBlb3BsZSBkbyBzb21ldGltZXMuXG4vLyBhbHNvLCAxLjAuMGFscGhhMSAocHJlcmVsZWFzZSB3aXRob3V0IHRoZSBoeXBoZW4pIHdoaWNoIGlzIHByZXR0eVxuLy8gY29tbW9uIGluIHRoZSBucG0gcmVnaXN0cnkuXG5jcmVhdGVUb2tlbignTE9PU0VQTEFJTicsIGBbdj1cXFxcc10qJHtzcmNbdC5NQUlOVkVSU0lPTkxPT1NFXVxufSR7c3JjW3QuUFJFUkVMRUFTRUxPT1NFXX0/JHtcbiAgc3JjW3QuQlVJTERdfT9gKVxuXG5jcmVhdGVUb2tlbignTE9PU0UnLCBgXiR7c3JjW3QuTE9PU0VQTEFJTl19JGApXG5cbmNyZWF0ZVRva2VuKCdHVExUJywgJygoPzo8fD4pPz0/KScpXG5cbi8vIFNvbWV0aGluZyBsaWtlIFwiMi4qXCIgb3IgXCIxLjIueFwiLlxuLy8gTm90ZSB0aGF0IFwieC54XCIgaXMgYSB2YWxpZCB4UmFuZ2UgaWRlbnRpZmVyLCBtZWFuaW5nIFwiYW55IHZlcnNpb25cIlxuLy8gT25seSB0aGUgZmlyc3QgaXRlbSBpcyBzdHJpY3RseSByZXF1aXJlZC5cbmNyZWF0ZVRva2VuKCdYUkFOR0VJREVOVElGSUVSTE9PU0UnLCBgJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX18eHxYfFxcXFwqYClcbmNyZWF0ZVRva2VuKCdYUkFOR0VJREVOVElGSUVSJywgYCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfXx4fFh8XFxcXCpgKVxuXG5jcmVhdGVUb2tlbignWFJBTkdFUExBSU4nLCBgW3Y9XFxcXHNdKigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJdfSlgICtcbiAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VdfSk/JHtcbiAgICAgICAgICAgICAgICAgICAgIHNyY1t0LkJVSUxEXX0/YCArXG4gICAgICAgICAgICAgICAgICAgYCk/KT9gKVxuXG5jcmVhdGVUb2tlbignWFJBTkdFUExBSU5MT09TRScsIGBbdj1cXFxcc10qKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuUFJFUkVMRUFTRUxPT1NFXX0pPyR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1t0LkJVSUxEXX0/YCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKT8pP2ApXG5cbmNyZWF0ZVRva2VuKCdYUkFOR0UnLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqJHtzcmNbdC5YUkFOR0VQTEFJTl19JGApXG5jcmVhdGVUb2tlbignWFJBTkdFTE9PU0UnLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqJHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0kYClcblxuLy8gQ29lcmNpb24uXG4vLyBFeHRyYWN0IGFueXRoaW5nIHRoYXQgY291bGQgY29uY2VpdmFibHkgYmUgYSBwYXJ0IG9mIGEgdmFsaWQgc2VtdmVyXG5jcmVhdGVUb2tlbignQ09FUkNFUExBSU4nLCBgJHsnKF58W15cXFxcZF0pJyArXG4gICAgICAgICAgICAgICcoXFxcXGR7MSwnfSR7TUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSH19KWAgK1xuICAgICAgICAgICAgICBgKD86XFxcXC4oXFxcXGR7MSwke01BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEh9fSkpP2AgK1xuICAgICAgICAgICAgICBgKD86XFxcXC4oXFxcXGR7MSwke01BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEh9fSkpP2ApXG5jcmVhdGVUb2tlbignQ09FUkNFJywgYCR7c3JjW3QuQ09FUkNFUExBSU5dfSg/OiR8W15cXFxcZF0pYClcbmNyZWF0ZVRva2VuKCdDT0VSQ0VGVUxMJywgc3JjW3QuQ09FUkNFUExBSU5dICtcbiAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuUFJFUkVMRUFTRV19KT9gICtcbiAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuQlVJTERdfSk/YCArXG4gICAgICAgICAgICAgIGAoPzokfFteXFxcXGRdKWApXG5jcmVhdGVUb2tlbignQ09FUkNFUlRMJywgc3JjW3QuQ09FUkNFXSwgdHJ1ZSlcbmNyZWF0ZVRva2VuKCdDT0VSQ0VSVExGVUxMJywgc3JjW3QuQ09FUkNFRlVMTF0sIHRydWUpXG5cbi8vIFRpbGRlIHJhbmdlcy5cbi8vIE1lYW5pbmcgaXMgXCJyZWFzb25hYmx5IGF0IG9yIGdyZWF0ZXIgdGhhblwiXG5jcmVhdGVUb2tlbignTE9ORVRJTERFJywgJyg/On4+PyknKVxuXG5jcmVhdGVUb2tlbignVElMREVUUklNJywgYChcXFxccyopJHtzcmNbdC5MT05FVElMREVdfVxcXFxzK2AsIHRydWUpXG5leHBvcnRzLnRpbGRlVHJpbVJlcGxhY2UgPSAnJDF+J1xuXG5jcmVhdGVUb2tlbignVElMREUnLCBgXiR7c3JjW3QuTE9ORVRJTERFXX0ke3NyY1t0LlhSQU5HRVBMQUlOXX0kYClcbmNyZWF0ZVRva2VuKCdUSUxERUxPT1NFJywgYF4ke3NyY1t0LkxPTkVUSUxERV19JHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0kYClcblxuLy8gQ2FyZXQgcmFuZ2VzLlxuLy8gTWVhbmluZyBpcyBcImF0IGxlYXN0IGFuZCBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoXCJcbmNyZWF0ZVRva2VuKCdMT05FQ0FSRVQnLCAnKD86XFxcXF4pJylcblxuY3JlYXRlVG9rZW4oJ0NBUkVUVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuTE9ORUNBUkVUXX1cXFxccytgLCB0cnVlKVxuZXhwb3J0cy5jYXJldFRyaW1SZXBsYWNlID0gJyQxXidcblxuY3JlYXRlVG9rZW4oJ0NBUkVUJywgYF4ke3NyY1t0LkxPTkVDQVJFVF19JHtzcmNbdC5YUkFOR0VQTEFJTl19JGApXG5jcmVhdGVUb2tlbignQ0FSRVRMT09TRScsIGBeJHtzcmNbdC5MT05FQ0FSRVRdfSR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIEEgc2ltcGxlIGd0L2x0L2VxIHRoaW5nLCBvciBqdXN0IFwiXCIgdG8gaW5kaWNhdGUgXCJhbnkgdmVyc2lvblwiXG5jcmVhdGVUb2tlbignQ09NUEFSQVRPUkxPT1NFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKigke3NyY1t0LkxPT1NFUExBSU5dfSkkfF4kYClcbmNyZWF0ZVRva2VuKCdDT01QQVJBVE9SJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKigke3NyY1t0LkZVTExQTEFJTl19KSR8XiRgKVxuXG4vLyBBbiBleHByZXNzaW9uIHRvIHN0cmlwIGFueSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlIGd0bHQgYW5kIHRoZSB0aGluZ1xuLy8gaXQgbW9kaWZpZXMsIHNvIHRoYXQgYD4gMS4yLjNgID09PiBgPjEuMi4zYFxuY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1JUUklNJywgYChcXFxccyopJHtzcmNbdC5HVExUXVxufVxcXFxzKigke3NyY1t0LkxPT1NFUExBSU5dfXwke3NyY1t0LlhSQU5HRVBMQUlOXX0pYCwgdHJ1ZSlcbmV4cG9ydHMuY29tcGFyYXRvclRyaW1SZXBsYWNlID0gJyQxJDIkMydcblxuLy8gU29tZXRoaW5nIGxpa2UgYDEuMi4zIC0gMS4yLjRgXG4vLyBOb3RlIHRoYXQgdGhlc2UgYWxsIHVzZSB0aGUgbG9vc2UgZm9ybSwgYmVjYXVzZSB0aGV5J2xsIGJlXG4vLyBjaGVja2VkIGFnYWluc3QgZWl0aGVyIHRoZSBzdHJpY3Qgb3IgbG9vc2UgY29tcGFyYXRvciBmb3JtXG4vLyBsYXRlci5cbmNyZWF0ZVRva2VuKCdIWVBIRU5SQU5HRScsIGBeXFxcXHMqKCR7c3JjW3QuWFJBTkdFUExBSU5dfSlgICtcbiAgICAgICAgICAgICAgICAgICBgXFxcXHMrLVxcXFxzK2AgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5YUkFOR0VQTEFJTl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGBcXFxccyokYClcblxuY3JlYXRlVG9rZW4oJ0hZUEhFTlJBTkdFTE9PU0UnLCBgXlxcXFxzKigke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBcXFxccystXFxcXHMrYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYFxcXFxzKiRgKVxuXG4vLyBTdGFyIHJhbmdlcyBiYXNpY2FsbHkganVzdCBhbGxvdyBhbnl0aGluZyBhdCBhbGwuXG5jcmVhdGVUb2tlbignU1RBUicsICcoPHw+KT89P1xcXFxzKlxcXFwqJylcbi8vID49MC4wLjAgaXMgbGlrZSBhIHN0YXJcbmNyZWF0ZVRva2VuKCdHVEUwJywgJ15cXFxccyo+PVxcXFxzKjBcXFxcLjBcXFxcLjBcXFxccyokJylcbmNyZWF0ZVRva2VuKCdHVEUwUFJFJywgJ15cXFxccyo+PVxcXFxzKjBcXFxcLjBcXFxcLjAtMFxcXFxzKiQnKVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuLy8gcGFyc2Ugb3V0IGp1c3QgdGhlIG9wdGlvbnMgd2UgY2FyZSBhYm91dFxuY29uc3QgbG9vc2VPcHRpb24gPSBPYmplY3QuZnJlZXplKHsgbG9vc2U6IHRydWUgfSlcbmNvbnN0IGVtcHR5T3B0cyA9IE9iamVjdC5mcmVlemUoeyB9KVxuY29uc3QgcGFyc2VPcHRpb25zID0gb3B0aW9ucyA9PiB7XG4gIGlmICghb3B0aW9ucykge1xuICAgIHJldHVybiBlbXB0eU9wdHNcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbG9vc2VPcHRpb25cbiAgfVxuXG4gIHJldHVybiBvcHRpb25zXG59XG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlT3B0aW9uc1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgbnVtZXJpYyA9IC9eWzAtOV0rJC9cbmNvbnN0IGNvbXBhcmVJZGVudGlmaWVycyA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IGFudW0gPSBudW1lcmljLnRlc3QoYSlcbiAgY29uc3QgYm51bSA9IG51bWVyaWMudGVzdChiKVxuXG4gIGlmIChhbnVtICYmIGJudW0pIHtcbiAgICBhID0gK2FcbiAgICBiID0gK2JcbiAgfVxuXG4gIHJldHVybiBhID09PSBiID8gMFxuICAgIDogKGFudW0gJiYgIWJudW0pID8gLTFcbiAgICA6IChibnVtICYmICFhbnVtKSA/IDFcbiAgICA6IGEgPCBiID8gLTFcbiAgICA6IDFcbn1cblxuY29uc3QgcmNvbXBhcmVJZGVudGlmaWVycyA9IChhLCBiKSA9PiBjb21wYXJlSWRlbnRpZmllcnMoYiwgYSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbXBhcmVJZGVudGlmaWVycyxcbiAgcmNvbXBhcmVJZGVudGlmaWVycyxcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvZGVidWcnKVxuY29uc3QgeyBNQVhfTEVOR1RILCBNQVhfU0FGRV9JTlRFR0VSIH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9jb25zdGFudHMnKVxuY29uc3QgeyBzYWZlUmU6IHJlLCB0IH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZScpXG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3BhcnNlLW9wdGlvbnMnKVxuY29uc3QgeyBjb21wYXJlSWRlbnRpZmllcnMgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lkZW50aWZpZXJzJylcbmNsYXNzIFNlbVZlciB7XG4gIGNvbnN0cnVjdG9yICh2ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICAgIGlmICh2ZXJzaW9uLmxvb3NlID09PSAhIW9wdGlvbnMubG9vc2UgJiZcbiAgICAgICAgdmVyc2lvbi5pbmNsdWRlUHJlcmVsZWFzZSA9PT0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi52ZXJzaW9uXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgdmVyc2lvbi4gTXVzdCBiZSBhIHN0cmluZy4gR290IHR5cGUgXCIke3R5cGVvZiB2ZXJzaW9ufVwiLmApXG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24ubGVuZ3RoID4gTUFYX0xFTkdUSCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYHZlcnNpb24gaXMgbG9uZ2VyIHRoYW4gJHtNQVhfTEVOR1RIfSBjaGFyYWN0ZXJzYFxuICAgICAgKVxuICAgIH1cblxuICAgIGRlYnVnKCdTZW1WZXInLCB2ZXJzaW9uLCBvcHRpb25zKVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgLy8gdGhpcyBpc24ndCBhY3R1YWxseSByZWxldmFudCBmb3IgdmVyc2lvbnMsIGJ1dCBrZWVwIGl0IHNvIHRoYXQgd2VcbiAgICAvLyBkb24ndCBydW4gaW50byB0cm91YmxlIHBhc3NpbmcgdGhpcy5vcHRpb25zIGFyb3VuZC5cbiAgICB0aGlzLmluY2x1ZGVQcmVyZWxlYXNlID0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlXG5cbiAgICBjb25zdCBtID0gdmVyc2lvbi50cmltKCkubWF0Y2gob3B0aW9ucy5sb29zZSA/IHJlW3QuTE9PU0VdIDogcmVbdC5GVUxMXSlcblxuICAgIGlmICghbSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBWZXJzaW9uOiAke3ZlcnNpb259YClcbiAgICB9XG5cbiAgICB0aGlzLnJhdyA9IHZlcnNpb25cblxuICAgIC8vIHRoZXNlIGFyZSBhY3R1YWxseSBudW1iZXJzXG4gICAgdGhpcy5tYWpvciA9ICttWzFdXG4gICAgdGhpcy5taW5vciA9ICttWzJdXG4gICAgdGhpcy5wYXRjaCA9ICttWzNdXG5cbiAgICBpZiAodGhpcy5tYWpvciA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5tYWpvciA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWFqb3IgdmVyc2lvbicpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWlub3IgPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMubWlub3IgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1pbm9yIHZlcnNpb24nKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBhdGNoID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLnBhdGNoIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBwYXRjaCB2ZXJzaW9uJylcbiAgICB9XG5cbiAgICAvLyBudW1iZXJpZnkgYW55IHByZXJlbGVhc2UgbnVtZXJpYyBpZHNcbiAgICBpZiAoIW1bNF0pIHtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IG1bNF0uc3BsaXQoJy4nKS5tYXAoKGlkKSA9PiB7XG4gICAgICAgIGlmICgvXlswLTldKyQvLnRlc3QoaWQpKSB7XG4gICAgICAgICAgY29uc3QgbnVtID0gK2lkXG4gICAgICAgICAgaWYgKG51bSA+PSAwICYmIG51bSA8IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlkXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuYnVpbGQgPSBtWzVdID8gbVs1XS5zcGxpdCgnLicpIDogW11cbiAgICB0aGlzLmZvcm1hdCgpXG4gIH1cblxuICBmb3JtYXQgKCkge1xuICAgIHRoaXMudmVyc2lvbiA9IGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLnBhdGNofWBcbiAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgdGhpcy52ZXJzaW9uICs9IGAtJHt0aGlzLnByZXJlbGVhc2Uuam9pbignLicpfWBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmVyc2lvblxuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLnZlcnNpb25cbiAgfVxuXG4gIGNvbXBhcmUgKG90aGVyKSB7XG4gICAgZGVidWcoJ1NlbVZlci5jb21wYXJlJywgdGhpcy52ZXJzaW9uLCB0aGlzLm9wdGlvbnMsIG90aGVyKVxuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gJ3N0cmluZycgJiYgb3RoZXIgPT09IHRoaXMudmVyc2lvbikge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgaWYgKG90aGVyLnZlcnNpb24gPT09IHRoaXMudmVyc2lvbikge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21wYXJlTWFpbihvdGhlcikgfHwgdGhpcy5jb21wYXJlUHJlKG90aGVyKVxuICB9XG5cbiAgY29tcGFyZU1haW4gKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWFqb3IsIG90aGVyLm1ham9yKSB8fFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWlub3IsIG90aGVyLm1pbm9yKSB8fFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMucGF0Y2gsIG90aGVyLnBhdGNoKVxuICAgIClcbiAgfVxuXG4gIGNvbXBhcmVQcmUgKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICAvLyBOT1QgaGF2aW5nIGEgcHJlcmVsZWFzZSBpcyA+IGhhdmluZyBvbmVcbiAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH0gZWxzZSBpZiAoIXRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAxXG4gICAgfSBlbHNlIGlmICghdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAwXG4gICAgfVxuXG4gICAgbGV0IGkgPSAwXG4gICAgZG8ge1xuICAgICAgY29uc3QgYSA9IHRoaXMucHJlcmVsZWFzZVtpXVxuICAgICAgY29uc3QgYiA9IG90aGVyLnByZXJlbGVhc2VbaV1cbiAgICAgIGRlYnVnKCdwcmVyZWxlYXNlIGNvbXBhcmUnLCBpLCBhLCBiKVxuICAgICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0gZWxzZSBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyhhLCBiKVxuICAgICAgfVxuICAgIH0gd2hpbGUgKCsraSlcbiAgfVxuXG4gIGNvbXBhcmVCdWlsZCAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIGxldCBpID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmJ1aWxkW2ldXG4gICAgICBjb25zdCBiID0gb3RoZXIuYnVpbGRbaV1cbiAgICAgIGRlYnVnKCdidWlsZCBjb21wYXJlJywgaSwgYSwgYilcbiAgICAgIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9IGVsc2UgaWYgKGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMVxuICAgICAgfSBlbHNlIGlmIChhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlSWRlbnRpZmllcnMoYSwgYilcbiAgICAgIH1cbiAgICB9IHdoaWxlICgrK2kpXG4gIH1cblxuICAvLyBwcmVtaW5vciB3aWxsIGJ1bXAgdGhlIHZlcnNpb24gdXAgdG8gdGhlIG5leHQgbWlub3IgcmVsZWFzZSwgYW5kIGltbWVkaWF0ZWx5XG4gIC8vIGRvd24gdG8gcHJlLXJlbGVhc2UuIHByZW1ham9yIGFuZCBwcmVwYXRjaCB3b3JrIHRoZSBzYW1lIHdheS5cbiAgaW5jIChyZWxlYXNlLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkge1xuICAgIGlmIChyZWxlYXNlLnN0YXJ0c1dpdGgoJ3ByZScpKSB7XG4gICAgICBpZiAoIWlkZW50aWZpZXIgJiYgaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6IGlkZW50aWZpZXIgaXMgZW1wdHknKVxuICAgICAgfVxuICAgICAgLy8gQXZvaWQgYW4gaW52YWxpZCBzZW12ZXIgcmVzdWx0c1xuICAgICAgaWYgKGlkZW50aWZpZXIpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBgLSR7aWRlbnRpZmllcn1gLm1hdGNoKHRoaXMub3B0aW9ucy5sb29zZSA/IHJlW3QuUFJFUkVMRUFTRUxPT1NFXSA6IHJlW3QuUFJFUkVMRUFTRV0pXG4gICAgICAgIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gIT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaWRlbnRpZmllcjogJHtpZGVudGlmaWVyfWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJlbGVhc2UpIHtcbiAgICAgIGNhc2UgJ3ByZW1ham9yJzpcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5taW5vciA9IDBcbiAgICAgICAgdGhpcy5tYWpvcisrXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3ByZW1pbm9yJzpcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5taW5vcisrXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3ByZXBhdGNoJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhbHJlYWR5IGEgcHJlcmVsZWFzZSwgaXQgd2lsbCBidW1wIHRvIHRoZSBuZXh0IHZlcnNpb25cbiAgICAgICAgLy8gZHJvcCBhbnkgcHJlcmVsZWFzZXMgdGhhdCBtaWdodCBhbHJlYWR5IGV4aXN0LCBzaW5jZSB0aGV5IGFyZSBub3RcbiAgICAgICAgLy8gcmVsZXZhbnQgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5pbmMoJ3BhdGNoJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBhIG5vbi1wcmVyZWxlYXNlIHZlcnNpb24sIHRoaXMgYWN0cyB0aGUgc2FtZSBhc1xuICAgICAgLy8gcHJlcGF0Y2guXG4gICAgICBjYXNlICdwcmVyZWxlYXNlJzpcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmluYygncGF0Y2gnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdyZWxlYXNlJzpcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHZlcnNpb24gJHt0aGlzLnJhd30gaXMgbm90IGEgcHJlcmVsZWFzZWApXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSAnbWFqb3InOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlLW1ham9yIHZlcnNpb24sIGJ1bXAgdXAgdG8gdGhlIHNhbWUgbWFqb3IgdmVyc2lvbi5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGluY3JlbWVudCBtYWpvci5cbiAgICAgICAgLy8gMS4wLjAtNSBidW1wcyB0byAxLjAuMFxuICAgICAgICAvLyAxLjEuMCBidW1wcyB0byAyLjAuMFxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5taW5vciAhPT0gMCB8fFxuICAgICAgICAgIHRoaXMucGF0Y2ggIT09IDAgfHxcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMubWFqb3IrK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWlub3IgPSAwXG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdtaW5vcic6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmUtbWlub3IgdmVyc2lvbiwgYnVtcCB1cCB0byB0aGUgc2FtZSBtaW5vciB2ZXJzaW9uLlxuICAgICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IG1pbm9yLlxuICAgICAgICAvLyAxLjIuMC01IGJ1bXBzIHRvIDEuMi4wXG4gICAgICAgIC8vIDEuMi4xIGJ1bXBzIHRvIDEuMy4wXG4gICAgICAgIGlmICh0aGlzLnBhdGNoICE9PSAwIHx8IHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLm1pbm9yKytcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncGF0Y2gnOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIHByZS1yZWxlYXNlIHZlcnNpb24sIGl0IHdpbGwgaW5jcmVtZW50IHRoZSBwYXRjaC5cbiAgICAgICAgLy8gSWYgaXQgaXMgYSBwcmUtcmVsZWFzZSBpdCB3aWxsIGJ1bXAgdXAgdG8gdGhlIHNhbWUgcGF0Y2ggdmVyc2lvbi5cbiAgICAgICAgLy8gMS4yLjAtNSBwYXRjaGVzIHRvIDEuMi4wXG4gICAgICAgIC8vIDEuMi4wIHBhdGNoZXMgdG8gMS4yLjFcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnBhdGNoKytcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgICBicmVha1xuICAgICAgLy8gVGhpcyBwcm9iYWJseSBzaG91bGRuJ3QgYmUgdXNlZCBwdWJsaWNseS5cbiAgICAgIC8vIDEuMC4wICdwcmUnIHdvdWxkIGJlY29tZSAxLjAuMC0wIHdoaWNoIGlzIHRoZSB3cm9uZyBkaXJlY3Rpb24uXG4gICAgICBjYXNlICdwcmUnOiB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBOdW1iZXIoaWRlbnRpZmllckJhc2UpID8gMSA6IDBcblxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtiYXNlXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBpID0gdGhpcy5wcmVyZWxlYXNlLmxlbmd0aFxuICAgICAgICAgIHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByZXJlbGVhc2VbaV0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZVtpXSsrXG4gICAgICAgICAgICAgIGkgPSAtMlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIGRpZG4ndCBpbmNyZW1lbnQgYW55dGhpbmdcbiAgICAgICAgICAgIGlmIChpZGVudGlmaWVyID09PSB0aGlzLnByZXJlbGVhc2Uuam9pbignLicpICYmIGlkZW50aWZpZXJCYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiBpZGVudGlmaWVyIGFscmVhZHkgZXhpc3RzJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZS5wdXNoKGJhc2UpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpZGVudGlmaWVyKSB7XG4gICAgICAgICAgLy8gMS4yLjAtYmV0YS4xIGJ1bXBzIHRvIDEuMi4wLWJldGEuMixcbiAgICAgICAgICAvLyAxLjIuMC1iZXRhLmZvb2JseiBvciAxLjIuMC1iZXRhIGJ1bXBzIHRvIDEuMi4wLWJldGEuMFxuICAgICAgICAgIGxldCBwcmVyZWxlYXNlID0gW2lkZW50aWZpZXIsIGJhc2VdXG4gICAgICAgICAgaWYgKGlkZW50aWZpZXJCYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcHJlcmVsZWFzZSA9IFtpZGVudGlmaWVyXVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29tcGFyZUlkZW50aWZpZXJzKHRoaXMucHJlcmVsZWFzZVswXSwgaWRlbnRpZmllcikgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChpc05hTih0aGlzLnByZXJlbGVhc2VbMV0pKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IHByZXJlbGVhc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gcHJlcmVsZWFzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogJHtyZWxlYXNlfWApXG4gICAgfVxuICAgIHRoaXMucmF3ID0gdGhpcy5mb3JtYXQoKVxuICAgIGlmICh0aGlzLmJ1aWxkLmxlbmd0aCkge1xuICAgICAgdGhpcy5yYXcgKz0gYCske3RoaXMuYnVpbGQuam9pbignLicpfWBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNlbVZlclxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgcGFyc2UgPSAodmVyc2lvbiwgb3B0aW9ucywgdGhyb3dFcnJvcnMgPSBmYWxzZSkgPT4ge1xuICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcikge1xuICAgIHJldHVybiB2ZXJzaW9uXG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFNlbVZlcih2ZXJzaW9uLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIGlmICghdGhyb3dFcnJvcnMpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIHRocm93IGVyXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHZhbGlkID0gKHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgdiA9IHBhcnNlKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJldHVybiB2ID8gdi52ZXJzaW9uIDogbnVsbFxufVxubW9kdWxlLmV4cG9ydHMgPSB2YWxpZFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IGNsZWFuID0gKHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgcyA9IHBhcnNlKHZlcnNpb24udHJpbSgpLnJlcGxhY2UoL15bPXZdKy8sICcnKSwgb3B0aW9ucylcbiAgcmV0dXJuIHMgPyBzLnZlcnNpb24gOiBudWxsXG59XG5tb2R1bGUuZXhwb3J0cyA9IGNsZWFuXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5cbmNvbnN0IGluYyA9ICh2ZXJzaW9uLCByZWxlYXNlLCBvcHRpb25zLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkgPT4ge1xuICBpZiAodHlwZW9mIChvcHRpb25zKSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZGVudGlmaWVyQmFzZSA9IGlkZW50aWZpZXJcbiAgICBpZGVudGlmaWVyID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSB1bmRlZmluZWRcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBTZW1WZXIoXG4gICAgICB2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyID8gdmVyc2lvbi52ZXJzaW9uIDogdmVyc2lvbixcbiAgICAgIG9wdGlvbnNcbiAgICApLmluYyhyZWxlYXNlLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkudmVyc2lvblxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gaW5jXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UuanMnKVxuXG5jb25zdCBkaWZmID0gKHZlcnNpb24xLCB2ZXJzaW9uMikgPT4ge1xuICBjb25zdCB2MSA9IHBhcnNlKHZlcnNpb24xLCBudWxsLCB0cnVlKVxuICBjb25zdCB2MiA9IHBhcnNlKHZlcnNpb24yLCBudWxsLCB0cnVlKVxuICBjb25zdCBjb21wYXJpc29uID0gdjEuY29tcGFyZSh2MilcblxuICBpZiAoY29tcGFyaXNvbiA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCB2MUhpZ2hlciA9IGNvbXBhcmlzb24gPiAwXG4gIGNvbnN0IGhpZ2hWZXJzaW9uID0gdjFIaWdoZXIgPyB2MSA6IHYyXG4gIGNvbnN0IGxvd1ZlcnNpb24gPSB2MUhpZ2hlciA/IHYyIDogdjFcbiAgY29uc3QgaGlnaEhhc1ByZSA9ICEhaGlnaFZlcnNpb24ucHJlcmVsZWFzZS5sZW5ndGhcbiAgY29uc3QgbG93SGFzUHJlID0gISFsb3dWZXJzaW9uLnByZXJlbGVhc2UubGVuZ3RoXG5cbiAgaWYgKGxvd0hhc1ByZSAmJiAhaGlnaEhhc1ByZSkge1xuICAgIC8vIEdvaW5nIGZyb20gcHJlcmVsZWFzZSAtPiBubyBwcmVyZWxlYXNlIHJlcXVpcmVzIHNvbWUgc3BlY2lhbCBjYXNpbmdcblxuICAgIC8vIElmIHRoZSBsb3cgdmVyc2lvbiBoYXMgb25seSBhIG1ham9yLCB0aGVuIGl0IHdpbGwgYWx3YXlzIGJlIGEgbWFqb3JcbiAgICAvLyBTb21lIGV4YW1wbGVzOlxuICAgIC8vIDEuMC4wLTEgLT4gMS4wLjBcbiAgICAvLyAxLjAuMC0xIC0+IDEuMS4xXG4gICAgLy8gMS4wLjAtMSAtPiAyLjAuMFxuICAgIGlmICghbG93VmVyc2lvbi5wYXRjaCAmJiAhbG93VmVyc2lvbi5taW5vcikge1xuICAgICAgcmV0dXJuICdtYWpvcidcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbWFpbiBwYXJ0IGhhcyBubyBkaWZmZXJlbmNlXG4gICAgaWYgKGxvd1ZlcnNpb24uY29tcGFyZU1haW4oaGlnaFZlcnNpb24pID09PSAwKSB7XG4gICAgICBpZiAobG93VmVyc2lvbi5taW5vciAmJiAhbG93VmVyc2lvbi5wYXRjaCkge1xuICAgICAgICByZXR1cm4gJ21pbm9yJ1xuICAgICAgfVxuICAgICAgcmV0dXJuICdwYXRjaCdcbiAgICB9XG4gIH1cblxuICAvLyBhZGQgdGhlIGBwcmVgIHByZWZpeCBpZiB3ZSBhcmUgZ29pbmcgdG8gYSBwcmVyZWxlYXNlIHZlcnNpb25cbiAgY29uc3QgcHJlZml4ID0gaGlnaEhhc1ByZSA/ICdwcmUnIDogJydcblxuICBpZiAodjEubWFqb3IgIT09IHYyLm1ham9yKSB7XG4gICAgcmV0dXJuIHByZWZpeCArICdtYWpvcidcbiAgfVxuXG4gIGlmICh2MS5taW5vciAhPT0gdjIubWlub3IpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgJ21pbm9yJ1xuICB9XG5cbiAgaWYgKHYxLnBhdGNoICE9PSB2Mi5wYXRjaCkge1xuICAgIHJldHVybiBwcmVmaXggKyAncGF0Y2gnXG4gIH1cblxuICAvLyBoaWdoIGFuZCBsb3cgYXJlIHByZWxlYXNlc1xuICByZXR1cm4gJ3ByZXJlbGVhc2UnXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGlmZlxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgbWFqb3IgPSAoYSwgbG9vc2UpID0+IG5ldyBTZW1WZXIoYSwgbG9vc2UpLm1ham9yXG5tb2R1bGUuZXhwb3J0cyA9IG1ham9yXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBtaW5vciA9IChhLCBsb29zZSkgPT4gbmV3IFNlbVZlcihhLCBsb29zZSkubWlub3Jcbm1vZHVsZS5leHBvcnRzID0gbWlub3JcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IHBhdGNoID0gKGEsIGxvb3NlKSA9PiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5wYXRjaFxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHByZXJlbGVhc2UgPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZSh2ZXJzaW9uLCBvcHRpb25zKVxuICByZXR1cm4gKHBhcnNlZCAmJiBwYXJzZWQucHJlcmVsZWFzZS5sZW5ndGgpID8gcGFyc2VkLnByZXJlbGVhc2UgOiBudWxsXG59XG5tb2R1bGUuZXhwb3J0cyA9IHByZXJlbGVhc2VcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGNvbXBhcmUgPSAoYSwgYiwgbG9vc2UpID0+XG4gIG5ldyBTZW1WZXIoYSwgbG9vc2UpLmNvbXBhcmUobmV3IFNlbVZlcihiLCBsb29zZSkpXG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCByY29tcGFyZSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShiLCBhLCBsb29zZSlcbm1vZHVsZS5leHBvcnRzID0gcmNvbXBhcmVcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgY29tcGFyZUxvb3NlID0gKGEsIGIpID0+IGNvbXBhcmUoYSwgYiwgdHJ1ZSlcbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZUxvb3NlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBjb21wYXJlQnVpbGQgPSAoYSwgYiwgbG9vc2UpID0+IHtcbiAgY29uc3QgdmVyc2lvbkEgPSBuZXcgU2VtVmVyKGEsIGxvb3NlKVxuICBjb25zdCB2ZXJzaW9uQiA9IG5ldyBTZW1WZXIoYiwgbG9vc2UpXG4gIHJldHVybiB2ZXJzaW9uQS5jb21wYXJlKHZlcnNpb25CKSB8fCB2ZXJzaW9uQS5jb21wYXJlQnVpbGQodmVyc2lvbkIpXG59XG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVCdWlsZFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZUJ1aWxkID0gcmVxdWlyZSgnLi9jb21wYXJlLWJ1aWxkJylcbmNvbnN0IHNvcnQgPSAobGlzdCwgbG9vc2UpID0+IGxpc3Quc29ydCgoYSwgYikgPT4gY29tcGFyZUJ1aWxkKGEsIGIsIGxvb3NlKSlcbm1vZHVsZS5leHBvcnRzID0gc29ydFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZUJ1aWxkID0gcmVxdWlyZSgnLi9jb21wYXJlLWJ1aWxkJylcbmNvbnN0IHJzb3J0ID0gKGxpc3QsIGxvb3NlKSA9PiBsaXN0LnNvcnQoKGEsIGIpID0+IGNvbXBhcmVCdWlsZChiLCBhLCBsb29zZSkpXG5tb2R1bGUuZXhwb3J0cyA9IHJzb3J0XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGd0ID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA+IDBcbm1vZHVsZS5leHBvcnRzID0gZ3RcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgbHQgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpIDwgMFxubW9kdWxlLmV4cG9ydHMgPSBsdFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBlcSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPT09IDBcbm1vZHVsZS5leHBvcnRzID0gZXFcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgbmVxID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSAhPT0gMFxubW9kdWxlLmV4cG9ydHMgPSBuZXFcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgZ3RlID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA+PSAwXG5tb2R1bGUuZXhwb3J0cyA9IGd0ZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBsdGUgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpIDw9IDBcbm1vZHVsZS5leHBvcnRzID0gbHRlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBlcSA9IHJlcXVpcmUoJy4vZXEnKVxuY29uc3QgbmVxID0gcmVxdWlyZSgnLi9uZXEnKVxuY29uc3QgZ3QgPSByZXF1aXJlKCcuL2d0JylcbmNvbnN0IGd0ZSA9IHJlcXVpcmUoJy4vZ3RlJylcbmNvbnN0IGx0ID0gcmVxdWlyZSgnLi9sdCcpXG5jb25zdCBsdGUgPSByZXF1aXJlKCcuL2x0ZScpXG5cbmNvbnN0IGNtcCA9IChhLCBvcCwgYiwgbG9vc2UpID0+IHtcbiAgc3dpdGNoIChvcCkge1xuICAgIGNhc2UgJz09PSc6XG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGEgPSBhLnZlcnNpb25cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYiA9IGIudmVyc2lvblxuICAgICAgfVxuICAgICAgcmV0dXJuIGEgPT09IGJcblxuICAgIGNhc2UgJyE9PSc6XG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGEgPSBhLnZlcnNpb25cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYiA9IGIudmVyc2lvblxuICAgICAgfVxuICAgICAgcmV0dXJuIGEgIT09IGJcblxuICAgIGNhc2UgJyc6XG4gICAgY2FzZSAnPSc6XG4gICAgY2FzZSAnPT0nOlxuICAgICAgcmV0dXJuIGVxKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnIT0nOlxuICAgICAgcmV0dXJuIG5lcShhLCBiLCBsb29zZSlcblxuICAgIGNhc2UgJz4nOlxuICAgICAgcmV0dXJuIGd0KGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPj0nOlxuICAgICAgcmV0dXJuIGd0ZShhLCBiLCBsb29zZSlcblxuICAgIGNhc2UgJzwnOlxuICAgICAgcmV0dXJuIGx0KGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPD0nOlxuICAgICAgcmV0dXJuIGx0ZShhLCBiLCBsb29zZSlcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIG9wZXJhdG9yOiAke29wfWApXG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gY21wXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgeyBzYWZlUmU6IHJlLCB0IH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZScpXG5cbmNvbnN0IGNvZXJjZSA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgcmV0dXJuIHZlcnNpb25cbiAgfVxuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ251bWJlcicpIHtcbiAgICB2ZXJzaW9uID0gU3RyaW5nKHZlcnNpb24pXG4gIH1cblxuICBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgbGV0IG1hdGNoID0gbnVsbFxuICBpZiAoIW9wdGlvbnMucnRsKSB7XG4gICAgbWF0Y2ggPSB2ZXJzaW9uLm1hdGNoKG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyByZVt0LkNPRVJDRUZVTExdIDogcmVbdC5DT0VSQ0VdKVxuICB9IGVsc2Uge1xuICAgIC8vIEZpbmQgdGhlIHJpZ2h0LW1vc3QgY29lcmNpYmxlIHN0cmluZyB0aGF0IGRvZXMgbm90IHNoYXJlXG4gICAgLy8gYSB0ZXJtaW51cyB3aXRoIGEgbW9yZSBsZWZ0LXdhcmQgY29lcmNpYmxlIHN0cmluZy5cbiAgICAvLyBFZywgJzEuMi4zLjQnIHdhbnRzIHRvIGNvZXJjZSAnMi4zLjQnLCBub3QgJzMuNCcgb3IgJzQnXG4gICAgLy8gV2l0aCBpbmNsdWRlUHJlcmVsZWFzZSBvcHRpb24gc2V0LCAnMS4yLjMuNC1yYycgd2FudHMgdG8gY29lcmNlICcyLjMuNC1yYycsIG5vdCAnMi4zLjQnXG4gICAgLy9cbiAgICAvLyBXYWxrIHRocm91Z2ggdGhlIHN0cmluZyBjaGVja2luZyB3aXRoIGEgL2cgcmVnZXhwXG4gICAgLy8gTWFudWFsbHkgc2V0IHRoZSBpbmRleCBzbyBhcyB0byBwaWNrIHVwIG92ZXJsYXBwaW5nIG1hdGNoZXMuXG4gICAgLy8gU3RvcCB3aGVuIHdlIGdldCBhIG1hdGNoIHRoYXQgZW5kcyBhdCB0aGUgc3RyaW5nIGVuZCwgc2luY2Ugbm9cbiAgICAvLyBjb2VyY2libGUgc3RyaW5nIGNhbiBiZSBtb3JlIHJpZ2h0LXdhcmQgd2l0aG91dCB0aGUgc2FtZSB0ZXJtaW51cy5cbiAgICBjb25zdCBjb2VyY2VSdGxSZWdleCA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyByZVt0LkNPRVJDRVJUTEZVTExdIDogcmVbdC5DT0VSQ0VSVExdXG4gICAgbGV0IG5leHRcbiAgICB3aGlsZSAoKG5leHQgPSBjb2VyY2VSdGxSZWdleC5leGVjKHZlcnNpb24pKSAmJlxuICAgICAgICAoIW1hdGNoIHx8IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoICE9PSB2ZXJzaW9uLmxlbmd0aClcbiAgICApIHtcbiAgICAgIGlmICghbWF0Y2ggfHxcbiAgICAgICAgICAgIG5leHQuaW5kZXggKyBuZXh0WzBdLmxlbmd0aCAhPT0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpIHtcbiAgICAgICAgbWF0Y2ggPSBuZXh0XG4gICAgICB9XG4gICAgICBjb2VyY2VSdGxSZWdleC5sYXN0SW5kZXggPSBuZXh0LmluZGV4ICsgbmV4dFsxXS5sZW5ndGggKyBuZXh0WzJdLmxlbmd0aFxuICAgIH1cbiAgICAvLyBsZWF2ZSBpdCBpbiBhIGNsZWFuIHN0YXRlXG4gICAgY29lcmNlUnRsUmVnZXgubGFzdEluZGV4ID0gLTFcbiAgfVxuXG4gIGlmIChtYXRjaCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBtYWpvciA9IG1hdGNoWzJdXG4gIGNvbnN0IG1pbm9yID0gbWF0Y2hbM10gfHwgJzAnXG4gIGNvbnN0IHBhdGNoID0gbWF0Y2hbNF0gfHwgJzAnXG4gIGNvbnN0IHByZXJlbGVhc2UgPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmIG1hdGNoWzVdID8gYC0ke21hdGNoWzVdfWAgOiAnJ1xuICBjb25zdCBidWlsZCA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiYgbWF0Y2hbNl0gPyBgKyR7bWF0Y2hbNl19YCA6ICcnXG5cbiAgcmV0dXJuIHBhcnNlKGAke21ham9yfS4ke21pbm9yfS4ke3BhdGNofSR7cHJlcmVsZWFzZX0ke2J1aWxkfWAsIG9wdGlvbnMpXG59XG5tb2R1bGUuZXhwb3J0cyA9IGNvZXJjZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY2xhc3MgTFJVQ2FjaGUge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5tYXggPSAxMDAwXG4gICAgdGhpcy5tYXAgPSBuZXcgTWFwKClcbiAgfVxuXG4gIGdldCAoa2V5KSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm1hcC5nZXQoa2V5KVxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUga2V5IGZyb20gdGhlIG1hcCBhbmQgYWRkIGl0IHRvIHRoZSBlbmRcbiAgICAgIHRoaXMubWFwLmRlbGV0ZShrZXkpXG4gICAgICB0aGlzLm1hcC5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZSAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmRlbGV0ZShrZXkpXG4gIH1cblxuICBzZXQgKGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy5kZWxldGUoa2V5KVxuXG4gICAgaWYgKCFkZWxldGVkICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIElmIGNhY2hlIGlzIGZ1bGwsIGRlbGV0ZSB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBpdGVtXG4gICAgICBpZiAodGhpcy5tYXAuc2l6ZSA+PSB0aGlzLm1heCkge1xuICAgICAgICBjb25zdCBmaXJzdEtleSA9IHRoaXMubWFwLmtleXMoKS5uZXh0KCkudmFsdWVcbiAgICAgICAgdGhpcy5kZWxldGUoZmlyc3RLZXkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFwLnNldChrZXksIHZhbHVlKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMUlVDYWNoZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU1BBQ0VfQ0hBUkFDVEVSUyA9IC9cXHMrL2dcblxuLy8gaG9pc3RlZCBjbGFzcyBmb3IgY3ljbGljIGRlcGVuZGVuY3lcbmNsYXNzIFJhbmdlIHtcbiAgY29uc3RydWN0b3IgKHJhbmdlLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKHJhbmdlIGluc3RhbmNlb2YgUmFuZ2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcmFuZ2UubG9vc2UgPT09ICEhb3B0aW9ucy5sb29zZSAmJlxuICAgICAgICByYW5nZS5pbmNsdWRlUHJlcmVsZWFzZSA9PT0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLnJhdywgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmFuZ2UgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSB7XG4gICAgICAvLyBqdXN0IHB1dCBpdCBpbiB0aGUgc2V0IGFuZCByZXR1cm5cbiAgICAgIHRoaXMucmF3ID0gcmFuZ2UudmFsdWVcbiAgICAgIHRoaXMuc2V0ID0gW1tyYW5nZV1dXG4gICAgICB0aGlzLmZvcm1hdHRlZCA9IHVuZGVmaW5lZFxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5sb29zZSA9ICEhb3B0aW9ucy5sb29zZVxuICAgIHRoaXMuaW5jbHVkZVByZXJlbGVhc2UgPSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2VcblxuICAgIC8vIEZpcnN0IHJlZHVjZSBhbGwgd2hpdGVzcGFjZSBhcyBtdWNoIGFzIHBvc3NpYmxlIHNvIHdlIGRvIG5vdCBoYXZlIHRvIHJlbHlcbiAgICAvLyBvbiBwb3RlbnRpYWxseSBzbG93IHJlZ2V4ZXMgbGlrZSBcXHMqLiBUaGlzIGlzIHRoZW4gc3RvcmVkIGFuZCB1c2VkIGZvclxuICAgIC8vIGZ1dHVyZSBlcnJvciBtZXNzYWdlcyBhcyB3ZWxsLlxuICAgIHRoaXMucmF3ID0gcmFuZ2UudHJpbSgpLnJlcGxhY2UoU1BBQ0VfQ0hBUkFDVEVSUywgJyAnKVxuXG4gICAgLy8gRmlyc3QsIHNwbGl0IG9uIHx8XG4gICAgdGhpcy5zZXQgPSB0aGlzLnJhd1xuICAgICAgLnNwbGl0KCd8fCcpXG4gICAgICAvLyBtYXAgdGhlIHJhbmdlIHRvIGEgMmQgYXJyYXkgb2YgY29tcGFyYXRvcnNcbiAgICAgIC5tYXAociA9PiB0aGlzLnBhcnNlUmFuZ2Uoci50cmltKCkpKVxuICAgICAgLy8gdGhyb3cgb3V0IGFueSBjb21wYXJhdG9yIGxpc3RzIHRoYXQgYXJlIGVtcHR5XG4gICAgICAvLyB0aGlzIGdlbmVyYWxseSBtZWFucyB0aGF0IGl0IHdhcyBub3QgYSB2YWxpZCByYW5nZSwgd2hpY2ggaXMgYWxsb3dlZFxuICAgICAgLy8gaW4gbG9vc2UgbW9kZSwgYnV0IHdpbGwgc3RpbGwgdGhyb3cgaWYgdGhlIFdIT0xFIHJhbmdlIGlzIGludmFsaWQuXG4gICAgICAuZmlsdGVyKGMgPT4gYy5sZW5ndGgpXG5cbiAgICBpZiAoIXRoaXMuc2V0Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBTZW1WZXIgUmFuZ2U6ICR7dGhpcy5yYXd9YClcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBoYXZlIGFueSB0aGF0IGFyZSBub3QgdGhlIG51bGwgc2V0LCB0aHJvdyBvdXQgbnVsbCBzZXRzLlxuICAgIGlmICh0aGlzLnNldC5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBrZWVwIHRoZSBmaXJzdCBvbmUsIGluIGNhc2UgdGhleSdyZSBhbGwgbnVsbCBzZXRzXG4gICAgICBjb25zdCBmaXJzdCA9IHRoaXMuc2V0WzBdXG4gICAgICB0aGlzLnNldCA9IHRoaXMuc2V0LmZpbHRlcihjID0+ICFpc051bGxTZXQoY1swXSkpXG4gICAgICBpZiAodGhpcy5zZXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuc2V0ID0gW2ZpcnN0XVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNldC5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIGlmIHdlIGhhdmUgYW55IHRoYXQgYXJlICosIHRoZW4gdGhlIHJhbmdlIGlzIGp1c3QgKlxuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5zZXQpIHtcbiAgICAgICAgICBpZiAoYy5sZW5ndGggPT09IDEgJiYgaXNBbnkoY1swXSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0ID0gW2NdXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZm9ybWF0dGVkID0gdW5kZWZpbmVkXG4gIH1cblxuICBnZXQgcmFuZ2UgKCkge1xuICAgIGlmICh0aGlzLmZvcm1hdHRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZvcm1hdHRlZCA9ICcnXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgIHRoaXMuZm9ybWF0dGVkICs9ICd8fCdcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wcyA9IHRoaXMuc2V0W2ldXG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY29tcHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICBpZiAoayA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0dGVkICs9ICcgJ1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmZvcm1hdHRlZCArPSBjb21wc1trXS50b1N0cmluZygpLnRyaW0oKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZvcm1hdHRlZFxuICB9XG5cbiAgZm9ybWF0ICgpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5nZVxuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmdlXG4gIH1cblxuICBwYXJzZVJhbmdlIChyYW5nZSkge1xuICAgIC8vIG1lbW9pemUgcmFuZ2UgcGFyc2luZyBmb3IgcGVyZm9ybWFuY2UuXG4gICAgLy8gdGhpcyBpcyBhIHZlcnkgaG90IHBhdGgsIGFuZCBmdWxseSBkZXRlcm1pbmlzdGljLlxuICAgIGNvbnN0IG1lbW9PcHRzID1cbiAgICAgICh0aGlzLm9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiYgRkxBR19JTkNMVURFX1BSRVJFTEVBU0UpIHxcbiAgICAgICh0aGlzLm9wdGlvbnMubG9vc2UgJiYgRkxBR19MT09TRSlcbiAgICBjb25zdCBtZW1vS2V5ID0gbWVtb09wdHMgKyAnOicgKyByYW5nZVxuICAgIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChtZW1vS2V5KVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRcbiAgICB9XG5cbiAgICBjb25zdCBsb29zZSA9IHRoaXMub3B0aW9ucy5sb29zZVxuICAgIC8vIGAxLjIuMyAtIDEuMi40YCA9PiBgPj0xLjIuMyA8PTEuMi40YFxuICAgIGNvbnN0IGhyID0gbG9vc2UgPyByZVt0LkhZUEhFTlJBTkdFTE9PU0VdIDogcmVbdC5IWVBIRU5SQU5HRV1cbiAgICByYW5nZSA9IHJhbmdlLnJlcGxhY2UoaHIsIGh5cGhlblJlcGxhY2UodGhpcy5vcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSlcbiAgICBkZWJ1ZygnaHlwaGVuIHJlcGxhY2UnLCByYW5nZSlcblxuICAgIC8vIGA+IDEuMi4zIDwgMS4yLjVgID0+IGA+MS4yLjMgPDEuMi41YFxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVt0LkNPTVBBUkFUT1JUUklNXSwgY29tcGFyYXRvclRyaW1SZXBsYWNlKVxuICAgIGRlYnVnKCdjb21wYXJhdG9yIHRyaW0nLCByYW5nZSlcblxuICAgIC8vIGB+IDEuMi4zYCA9PiBgfjEuMi4zYFxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVt0LlRJTERFVFJJTV0sIHRpbGRlVHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ3RpbGRlIHRyaW0nLCByYW5nZSlcblxuICAgIC8vIGBeIDEuMi4zYCA9PiBgXjEuMi4zYFxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVt0LkNBUkVUVFJJTV0sIGNhcmV0VHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ2NhcmV0IHRyaW0nLCByYW5nZSlcblxuICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSByYW5nZSBpcyBjb21wbGV0ZWx5IHRyaW1tZWQgYW5kXG4gICAgLy8gcmVhZHkgdG8gYmUgc3BsaXQgaW50byBjb21wYXJhdG9ycy5cblxuICAgIGxldCByYW5nZUxpc3QgPSByYW5nZVxuICAgICAgLnNwbGl0KCcgJylcbiAgICAgIC5tYXAoY29tcCA9PiBwYXJzZUNvbXBhcmF0b3IoY29tcCwgdGhpcy5vcHRpb25zKSlcbiAgICAgIC5qb2luKCcgJylcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAvLyA+PTAuMC4wIGlzIGVxdWl2YWxlbnQgdG8gKlxuICAgICAgLm1hcChjb21wID0+IHJlcGxhY2VHVEUwKGNvbXAsIHRoaXMub3B0aW9ucykpXG5cbiAgICBpZiAobG9vc2UpIHtcbiAgICAgIC8vIGluIGxvb3NlIG1vZGUsIHRocm93IG91dCBhbnkgdGhhdCBhcmUgbm90IHZhbGlkIGNvbXBhcmF0b3JzXG4gICAgICByYW5nZUxpc3QgPSByYW5nZUxpc3QuZmlsdGVyKGNvbXAgPT4ge1xuICAgICAgICBkZWJ1ZygnbG9vc2UgaW52YWxpZCBmaWx0ZXInLCBjb21wLCB0aGlzLm9wdGlvbnMpXG4gICAgICAgIHJldHVybiAhIWNvbXAubWF0Y2gocmVbdC5DT01QQVJBVE9STE9PU0VdKVxuICAgICAgfSlcbiAgICB9XG4gICAgZGVidWcoJ3JhbmdlIGxpc3QnLCByYW5nZUxpc3QpXG5cbiAgICAvLyBpZiBhbnkgY29tcGFyYXRvcnMgYXJlIHRoZSBudWxsIHNldCwgdGhlbiByZXBsYWNlIHdpdGggSlVTVCBudWxsIHNldFxuICAgIC8vIGlmIG1vcmUgdGhhbiBvbmUgY29tcGFyYXRvciwgcmVtb3ZlIGFueSAqIGNvbXBhcmF0b3JzXG4gICAgLy8gYWxzbywgZG9uJ3QgaW5jbHVkZSB0aGUgc2FtZSBjb21wYXJhdG9yIG1vcmUgdGhhbiBvbmNlXG4gICAgY29uc3QgcmFuZ2VNYXAgPSBuZXcgTWFwKClcbiAgICBjb25zdCBjb21wYXJhdG9ycyA9IHJhbmdlTGlzdC5tYXAoY29tcCA9PiBuZXcgQ29tcGFyYXRvcihjb21wLCB0aGlzLm9wdGlvbnMpKVxuICAgIGZvciAoY29uc3QgY29tcCBvZiBjb21wYXJhdG9ycykge1xuICAgICAgaWYgKGlzTnVsbFNldChjb21wKSkge1xuICAgICAgICByZXR1cm4gW2NvbXBdXG4gICAgICB9XG4gICAgICByYW5nZU1hcC5zZXQoY29tcC52YWx1ZSwgY29tcClcbiAgICB9XG4gICAgaWYgKHJhbmdlTWFwLnNpemUgPiAxICYmIHJhbmdlTWFwLmhhcygnJykpIHtcbiAgICAgIHJhbmdlTWFwLmRlbGV0ZSgnJylcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBbLi4ucmFuZ2VNYXAudmFsdWVzKCldXG4gICAgY2FjaGUuc2V0KG1lbW9LZXksIHJlc3VsdClcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBpbnRlcnNlY3RzIChyYW5nZSwgb3B0aW9ucykge1xuICAgIGlmICghKHJhbmdlIGluc3RhbmNlb2YgUmFuZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhIFJhbmdlIGlzIHJlcXVpcmVkJylcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXQuc29tZSgodGhpc0NvbXBhcmF0b3JzKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpc1NhdGlzZmlhYmxlKHRoaXNDb21wYXJhdG9ycywgb3B0aW9ucykgJiZcbiAgICAgICAgcmFuZ2Uuc2V0LnNvbWUoKHJhbmdlQ29tcGFyYXRvcnMpID0+IHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaXNTYXRpc2ZpYWJsZShyYW5nZUNvbXBhcmF0b3JzLCBvcHRpb25zKSAmJlxuICAgICAgICAgICAgdGhpc0NvbXBhcmF0b3JzLmV2ZXJ5KCh0aGlzQ29tcGFyYXRvcikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gcmFuZ2VDb21wYXJhdG9ycy5ldmVyeSgocmFuZ2VDb21wYXJhdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNDb21wYXJhdG9yLmludGVyc2VjdHMocmFuZ2VDb21wYXJhdG9yLCBvcHRpb25zKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfSlcbiAgfVxuXG4gIC8vIGlmIEFOWSBvZiB0aGUgc2V0cyBtYXRjaCBBTEwgb2YgaXRzIGNvbXBhcmF0b3JzLCB0aGVuIHBhc3NcbiAgdGVzdCAodmVyc2lvbikge1xuICAgIGlmICghdmVyc2lvbikge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgdGhpcy5vcHRpb25zKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNldC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRlc3RTZXQodGhpcy5zZXRbaV0sIHZlcnNpb24sIHRoaXMub3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSYW5nZVxuXG5jb25zdCBMUlUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9scnVjYWNoZScpXG5jb25zdCBjYWNoZSA9IG5ldyBMUlUoKVxuXG5jb25zdCBwYXJzZU9wdGlvbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9wYXJzZS1vcHRpb25zJylcbmNvbnN0IENvbXBhcmF0b3IgPSByZXF1aXJlKCcuL2NvbXBhcmF0b3InKVxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9kZWJ1ZycpXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuL3NlbXZlcicpXG5jb25zdCB7XG4gIHNhZmVSZTogcmUsXG4gIHQsXG4gIGNvbXBhcmF0b3JUcmltUmVwbGFjZSxcbiAgdGlsZGVUcmltUmVwbGFjZSxcbiAgY2FyZXRUcmltUmVwbGFjZSxcbn0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZScpXG5jb25zdCB7IEZMQUdfSU5DTFVERV9QUkVSRUxFQVNFLCBGTEFHX0xPT1NFIH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9jb25zdGFudHMnKVxuXG5jb25zdCBpc051bGxTZXQgPSBjID0+IGMudmFsdWUgPT09ICc8MC4wLjAtMCdcbmNvbnN0IGlzQW55ID0gYyA9PiBjLnZhbHVlID09PSAnJ1xuXG4vLyB0YWtlIGEgc2V0IG9mIGNvbXBhcmF0b3JzIGFuZCBkZXRlcm1pbmUgd2hldGhlciB0aGVyZVxuLy8gZXhpc3RzIGEgdmVyc2lvbiB3aGljaCBjYW4gc2F0aXNmeSBpdFxuY29uc3QgaXNTYXRpc2ZpYWJsZSA9IChjb21wYXJhdG9ycywgb3B0aW9ucykgPT4ge1xuICBsZXQgcmVzdWx0ID0gdHJ1ZVxuICBjb25zdCByZW1haW5pbmdDb21wYXJhdG9ycyA9IGNvbXBhcmF0b3JzLnNsaWNlKClcbiAgbGV0IHRlc3RDb21wYXJhdG9yID0gcmVtYWluaW5nQ29tcGFyYXRvcnMucG9wKClcblxuICB3aGlsZSAocmVzdWx0ICYmIHJlbWFpbmluZ0NvbXBhcmF0b3JzLmxlbmd0aCkge1xuICAgIHJlc3VsdCA9IHJlbWFpbmluZ0NvbXBhcmF0b3JzLmV2ZXJ5KChvdGhlckNvbXBhcmF0b3IpID0+IHtcbiAgICAgIHJldHVybiB0ZXN0Q29tcGFyYXRvci5pbnRlcnNlY3RzKG90aGVyQ29tcGFyYXRvciwgb3B0aW9ucylcbiAgICB9KVxuXG4gICAgdGVzdENvbXBhcmF0b3IgPSByZW1haW5pbmdDb21wYXJhdG9ycy5wb3AoKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vLyBjb21wcmlzZWQgb2YgeHJhbmdlcywgdGlsZGVzLCBzdGFycywgYW5kIGd0bHQncyBhdCB0aGlzIHBvaW50LlxuLy8gYWxyZWFkeSByZXBsYWNlZCB0aGUgaHlwaGVuIHJhbmdlc1xuLy8gdHVybiBpbnRvIGEgc2V0IG9mIEpVU1QgY29tcGFyYXRvcnMuXG5jb25zdCBwYXJzZUNvbXBhcmF0b3IgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygnY29tcCcsIGNvbXAsIG9wdGlvbnMpXG4gIGNvbXAgPSByZXBsYWNlQ2FyZXRzKGNvbXAsIG9wdGlvbnMpXG4gIGRlYnVnKCdjYXJldCcsIGNvbXApXG4gIGNvbXAgPSByZXBsYWNlVGlsZGVzKGNvbXAsIG9wdGlvbnMpXG4gIGRlYnVnKCd0aWxkZXMnLCBjb21wKVxuICBjb21wID0gcmVwbGFjZVhSYW5nZXMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ3hyYW5nZScsIGNvbXApXG4gIGNvbXAgPSByZXBsYWNlU3RhcnMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ3N0YXJzJywgY29tcClcbiAgcmV0dXJuIGNvbXBcbn1cblxuY29uc3QgaXNYID0gaWQgPT4gIWlkIHx8IGlkLnRvTG93ZXJDYXNlKCkgPT09ICd4JyB8fCBpZCA9PT0gJyonXG5cbi8vIH4sIH4+IC0tPiAqIChhbnksIGtpbmRhIHNpbGx5KVxuLy8gfjIsIH4yLngsIH4yLngueCwgfj4yLCB+PjIueCB+PjIueC54IC0tPiA+PTIuMC4wIDwzLjAuMC0wXG4vLyB+Mi4wLCB+Mi4wLngsIH4+Mi4wLCB+PjIuMC54IC0tPiA+PTIuMC4wIDwyLjEuMC0wXG4vLyB+MS4yLCB+MS4yLngsIH4+MS4yLCB+PjEuMi54IC0tPiA+PTEuMi4wIDwxLjMuMC0wXG4vLyB+MS4yLjMsIH4+MS4yLjMgLS0+ID49MS4yLjMgPDEuMy4wLTBcbi8vIH4xLjIuMCwgfj4xLjIuMCAtLT4gPj0xLjIuMCA8MS4zLjAtMFxuLy8gfjAuMC4xIC0tPiA+PTAuMC4xIDwwLjEuMC0wXG5jb25zdCByZXBsYWNlVGlsZGVzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgcmV0dXJuIGNvbXBcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChjKSA9PiByZXBsYWNlVGlsZGUoYywgb3B0aW9ucykpXG4gICAgLmpvaW4oJyAnKVxufVxuXG5jb25zdCByZXBsYWNlVGlsZGUgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBjb25zdCByID0gb3B0aW9ucy5sb29zZSA/IHJlW3QuVElMREVMT09TRV0gOiByZVt0LlRJTERFXVxuICByZXR1cm4gY29tcC5yZXBsYWNlKHIsIChfLCBNLCBtLCBwLCBwcikgPT4ge1xuICAgIGRlYnVnKCd0aWxkZScsIGNvbXAsIF8sIE0sIG0sIHAsIHByKVxuICAgIGxldCByZXRcblxuICAgIGlmIChpc1goTSkpIHtcbiAgICAgIHJldCA9ICcnXG4gICAgfSBlbHNlIGlmIChpc1gobSkpIHtcbiAgICAgIHJldCA9IGA+PSR7TX0uMC4wIDwkeytNICsgMX0uMC4wLTBgXG4gICAgfSBlbHNlIGlmIChpc1gocCkpIHtcbiAgICAgIC8vIH4xLjIgPT0gPj0xLjIuMCA8MS4zLjAtMFxuICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAgPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9IGVsc2UgaWYgKHByKSB7XG4gICAgICBkZWJ1ZygncmVwbGFjZVRpbGRlIHByJywgcHIpXG4gICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwfS0ke3ByXG4gICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIH4xLjIuMyA9PSA+PTEuMi4zIDwxLjMuMC0wXG4gICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwXG4gICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgfVxuXG4gICAgZGVidWcoJ3RpbGRlIHJldHVybicsIHJldClcbiAgICByZXR1cm4gcmV0XG4gIH0pXG59XG5cbi8vIF4gLS0+ICogKGFueSwga2luZGEgc2lsbHkpXG4vLyBeMiwgXjIueCwgXjIueC54IC0tPiA+PTIuMC4wIDwzLjAuMC0wXG4vLyBeMi4wLCBeMi4wLnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIF4xLjIsIF4xLjIueCAtLT4gPj0xLjIuMCA8Mi4wLjAtMFxuLy8gXjEuMi4zIC0tPiA+PTEuMi4zIDwyLjAuMC0wXG4vLyBeMS4yLjAgLS0+ID49MS4yLjAgPDIuMC4wLTBcbi8vIF4wLjAuMSAtLT4gPj0wLjAuMSA8MC4wLjItMFxuLy8gXjAuMS4wIC0tPiA+PTAuMS4wIDwwLjIuMC0wXG5jb25zdCByZXBsYWNlQ2FyZXRzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgcmV0dXJuIGNvbXBcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChjKSA9PiByZXBsYWNlQ2FyZXQoYywgb3B0aW9ucykpXG4gICAgLmpvaW4oJyAnKVxufVxuXG5jb25zdCByZXBsYWNlQ2FyZXQgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygnY2FyZXQnLCBjb21wLCBvcHRpb25zKVxuICBjb25zdCByID0gb3B0aW9ucy5sb29zZSA/IHJlW3QuQ0FSRVRMT09TRV0gOiByZVt0LkNBUkVUXVxuICBjb25zdCB6ID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/ICctMCcgOiAnJ1xuICByZXR1cm4gY29tcC5yZXBsYWNlKHIsIChfLCBNLCBtLCBwLCBwcikgPT4ge1xuICAgIGRlYnVnKCdjYXJldCcsIGNvbXAsIF8sIE0sIG0sIHAsIHByKVxuICAgIGxldCByZXRcblxuICAgIGlmIChpc1goTSkpIHtcbiAgICAgIHJldCA9ICcnXG4gICAgfSBlbHNlIGlmIChpc1gobSkpIHtcbiAgICAgIHJldCA9IGA+PSR7TX0uMC4wJHt6fSA8JHsrTSArIDF9LjAuMC0wYFxuICAgIH0gZWxzZSBpZiAoaXNYKHApKSB7XG4gICAgICBpZiAoTSA9PT0gJzAnKSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wJHt6fSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAke3p9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcikge1xuICAgICAgZGVidWcoJ3JlcGxhY2VDYXJldCBwcicsIHByKVxuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICBpZiAobSA9PT0gJzAnKSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cH0tJHtwclxuICAgICAgICAgIH0gPCR7TX0uJHttfS4keytwICsgMX0tMGBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwfS0ke3ByXG4gICAgICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwfS0ke3ByXG4gICAgICAgIH0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWcoJ25vIHByJylcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgaWYgKG0gPT09ICcwJykge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgICAgICB9JHt6fSA8JHtNfS4ke219LiR7K3AgKyAxfS0wYFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgICAgICB9JHt6fSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwXG4gICAgICAgIH0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWJ1ZygnY2FyZXQgcmV0dXJuJywgcmV0KVxuICAgIHJldHVybiByZXRcbiAgfSlcbn1cblxuY29uc3QgcmVwbGFjZVhSYW5nZXMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygncmVwbGFjZVhSYW5nZXMnLCBjb21wLCBvcHRpb25zKVxuICByZXR1cm4gY29tcFxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoYykgPT4gcmVwbGFjZVhSYW5nZShjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VYUmFuZ2UgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBjb21wID0gY29tcC50cmltKClcbiAgY29uc3QgciA9IG9wdGlvbnMubG9vc2UgPyByZVt0LlhSQU5HRUxPT1NFXSA6IHJlW3QuWFJBTkdFXVxuICByZXR1cm4gY29tcC5yZXBsYWNlKHIsIChyZXQsIGd0bHQsIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ3hSYW5nZScsIGNvbXAsIHJldCwgZ3RsdCwgTSwgbSwgcCwgcHIpXG4gICAgY29uc3QgeE0gPSBpc1goTSlcbiAgICBjb25zdCB4bSA9IHhNIHx8IGlzWChtKVxuICAgIGNvbnN0IHhwID0geG0gfHwgaXNYKHApXG4gICAgY29uc3QgYW55WCA9IHhwXG5cbiAgICBpZiAoZ3RsdCA9PT0gJz0nICYmIGFueVgpIHtcbiAgICAgIGd0bHQgPSAnJ1xuICAgIH1cblxuICAgIC8vIGlmIHdlJ3JlIGluY2x1ZGluZyBwcmVyZWxlYXNlcyBpbiB0aGUgbWF0Y2gsIHRoZW4gd2UgbmVlZFxuICAgIC8vIHRvIGZpeCB0aGlzIHRvIC0wLCB0aGUgbG93ZXN0IHBvc3NpYmxlIHByZXJlbGVhc2UgdmFsdWVcbiAgICBwciA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyAnLTAnIDogJydcblxuICAgIGlmICh4TSkge1xuICAgICAgaWYgKGd0bHQgPT09ICc+JyB8fCBndGx0ID09PSAnPCcpIHtcbiAgICAgICAgLy8gbm90aGluZyBpcyBhbGxvd2VkXG4gICAgICAgIHJldCA9ICc8MC4wLjAtMCdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vdGhpbmcgaXMgZm9yYmlkZGVuXG4gICAgICAgIHJldCA9ICcqJ1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZ3RsdCAmJiBhbnlYKSB7XG4gICAgICAvLyB3ZSBrbm93IHBhdGNoIGlzIGFuIHgsIGJlY2F1c2Ugd2UgaGF2ZSBhbnkgeCBhdCBhbGwuXG4gICAgICAvLyByZXBsYWNlIFggd2l0aCAwXG4gICAgICBpZiAoeG0pIHtcbiAgICAgICAgbSA9IDBcbiAgICAgIH1cbiAgICAgIHAgPSAwXG5cbiAgICAgIGlmIChndGx0ID09PSAnPicpIHtcbiAgICAgICAgLy8gPjEgPT4gPj0yLjAuMFxuICAgICAgICAvLyA+MS4yID0+ID49MS4zLjBcbiAgICAgICAgZ3RsdCA9ICc+PSdcbiAgICAgICAgaWYgKHhtKSB7XG4gICAgICAgICAgTSA9ICtNICsgMVxuICAgICAgICAgIG0gPSAwXG4gICAgICAgICAgcCA9IDBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtID0gK20gKyAxXG4gICAgICAgICAgcCA9IDBcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChndGx0ID09PSAnPD0nKSB7XG4gICAgICAgIC8vIDw9MC43LnggaXMgYWN0dWFsbHkgPDAuOC4wLCBzaW5jZSBhbnkgMC43Lnggc2hvdWxkXG4gICAgICAgIC8vIHBhc3MuICBTaW1pbGFybHksIDw9Ny54IGlzIGFjdHVhbGx5IDw4LjAuMCwgZXRjLlxuICAgICAgICBndGx0ID0gJzwnXG4gICAgICAgIGlmICh4bSkge1xuICAgICAgICAgIE0gPSArTSArIDFcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtID0gK20gKyAxXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGd0bHQgPT09ICc8Jykge1xuICAgICAgICBwciA9ICctMCdcbiAgICAgIH1cblxuICAgICAgcmV0ID0gYCR7Z3RsdCArIE19LiR7bX0uJHtwfSR7cHJ9YFxuICAgIH0gZWxzZSBpZiAoeG0pIHtcbiAgICAgIHJldCA9IGA+PSR7TX0uMC4wJHtwcn0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICB9IGVsc2UgaWYgKHhwKSB7XG4gICAgICByZXQgPSBgPj0ke019LiR7bX0uMCR7cHJcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9XG5cbiAgICBkZWJ1ZygneFJhbmdlIHJldHVybicsIHJldClcblxuICAgIHJldHVybiByZXRcbiAgfSlcbn1cblxuLy8gQmVjYXVzZSAqIGlzIEFORC1lZCB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgY29tcGFyYXRvcixcbi8vIGFuZCAnJyBtZWFucyBcImFueSB2ZXJzaW9uXCIsIGp1c3QgcmVtb3ZlIHRoZSAqcyBlbnRpcmVseS5cbmNvbnN0IHJlcGxhY2VTdGFycyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdyZXBsYWNlU3RhcnMnLCBjb21wLCBvcHRpb25zKVxuICAvLyBMb29zZW5lc3MgaXMgaWdub3JlZCBoZXJlLiAgc3RhciBpcyBhbHdheXMgYXMgbG9vc2UgYXMgaXQgZ2V0cyFcbiAgcmV0dXJuIGNvbXBcbiAgICAudHJpbSgpXG4gICAgLnJlcGxhY2UocmVbdC5TVEFSXSwgJycpXG59XG5cbmNvbnN0IHJlcGxhY2VHVEUwID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ3JlcGxhY2VHVEUwJywgY29tcCwgb3B0aW9ucylcbiAgcmV0dXJuIGNvbXBcbiAgICAudHJpbSgpXG4gICAgLnJlcGxhY2UocmVbb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHQuR1RFMFBSRSA6IHQuR1RFMF0sICcnKVxufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byBzdHJpbmcucmVwbGFjZShyZVt0LkhZUEhFTlJBTkdFXSlcbi8vIE0sIG0sIHBhdGNoLCBwcmVyZWxlYXNlLCBidWlsZFxuLy8gMS4yIC0gMy40LjUgPT4gPj0xLjIuMCA8PTMuNC41XG4vLyAxLjIuMyAtIDMuNCA9PiA+PTEuMi4wIDwzLjUuMC0wIEFueSAzLjQueCB3aWxsIGRvXG4vLyAxLjIgLSAzLjQgPT4gPj0xLjIuMCA8My41LjAtMFxuLy8gVE9ETyBidWlsZD9cbmNvbnN0IGh5cGhlblJlcGxhY2UgPSBpbmNQciA9PiAoJDAsXG4gIGZyb20sIGZNLCBmbSwgZnAsIGZwciwgZmIsXG4gIHRvLCB0TSwgdG0sIHRwLCB0cHIpID0+IHtcbiAgaWYgKGlzWChmTSkpIHtcbiAgICBmcm9tID0gJydcbiAgfSBlbHNlIGlmIChpc1goZm0pKSB7XG4gICAgZnJvbSA9IGA+PSR7Zk19LjAuMCR7aW5jUHIgPyAnLTAnIDogJyd9YFxuICB9IGVsc2UgaWYgKGlzWChmcCkpIHtcbiAgICBmcm9tID0gYD49JHtmTX0uJHtmbX0uMCR7aW5jUHIgPyAnLTAnIDogJyd9YFxuICB9IGVsc2UgaWYgKGZwcikge1xuICAgIGZyb20gPSBgPj0ke2Zyb219YFxuICB9IGVsc2Uge1xuICAgIGZyb20gPSBgPj0ke2Zyb219JHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH1cblxuICBpZiAoaXNYKHRNKSkge1xuICAgIHRvID0gJydcbiAgfSBlbHNlIGlmIChpc1godG0pKSB7XG4gICAgdG8gPSBgPCR7K3RNICsgMX0uMC4wLTBgXG4gIH0gZWxzZSBpZiAoaXNYKHRwKSkge1xuICAgIHRvID0gYDwke3RNfS4keyt0bSArIDF9LjAtMGBcbiAgfSBlbHNlIGlmICh0cHIpIHtcbiAgICB0byA9IGA8PSR7dE19LiR7dG19LiR7dHB9LSR7dHByfWBcbiAgfSBlbHNlIGlmIChpbmNQcikge1xuICAgIHRvID0gYDwke3RNfS4ke3RtfS4keyt0cCArIDF9LTBgXG4gIH0gZWxzZSB7XG4gICAgdG8gPSBgPD0ke3RvfWBcbiAgfVxuXG4gIHJldHVybiBgJHtmcm9tfSAke3RvfWAudHJpbSgpXG59XG5cbmNvbnN0IHRlc3RTZXQgPSAoc2V0LCB2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFzZXRbaV0udGVzdCh2ZXJzaW9uKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgaWYgKHZlcnNpb24ucHJlcmVsZWFzZS5sZW5ndGggJiYgIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAvLyBGaW5kIHRoZSBzZXQgb2YgdmVyc2lvbnMgdGhhdCBhcmUgYWxsb3dlZCB0byBoYXZlIHByZXJlbGVhc2VzXG4gICAgLy8gRm9yIGV4YW1wbGUsIF4xLjIuMy1wci4xIGRlc3VnYXJzIHRvID49MS4yLjMtcHIuMSA8Mi4wLjBcbiAgICAvLyBUaGF0IHNob3VsZCBhbGxvdyBgMS4yLjMtcHIuMmAgdG8gcGFzcy5cbiAgICAvLyBIb3dldmVyLCBgMS4yLjQtYWxwaGEubm90cmVhZHlgIHNob3VsZCBOT1QgYmUgYWxsb3dlZCxcbiAgICAvLyBldmVuIHRob3VnaCBpdCdzIHdpdGhpbiB0aGUgcmFuZ2Ugc2V0IGJ5IHRoZSBjb21wYXJhdG9ycy5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgZGVidWcoc2V0W2ldLnNlbXZlcilcbiAgICAgIGlmIChzZXRbaV0uc2VtdmVyID09PSBDb21wYXJhdG9yLkFOWSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoc2V0W2ldLnNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYWxsb3dlZCA9IHNldFtpXS5zZW12ZXJcbiAgICAgICAgaWYgKGFsbG93ZWQubWFqb3IgPT09IHZlcnNpb24ubWFqb3IgJiZcbiAgICAgICAgICAgIGFsbG93ZWQubWlub3IgPT09IHZlcnNpb24ubWlub3IgJiZcbiAgICAgICAgICAgIGFsbG93ZWQucGF0Y2ggPT09IHZlcnNpb24ucGF0Y2gpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmVyc2lvbiBoYXMgYSAtcHJlLCBidXQgaXQncyBub3Qgb25lIG9mIHRoZSBvbmVzIHdlIGxpa2UuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgQU5ZID0gU3ltYm9sKCdTZW1WZXIgQU5ZJylcbi8vIGhvaXN0ZWQgY2xhc3MgZm9yIGN5Y2xpYyBkZXBlbmRlbmN5XG5jbGFzcyBDb21wYXJhdG9yIHtcbiAgc3RhdGljIGdldCBBTlkgKCkge1xuICAgIHJldHVybiBBTllcbiAgfVxuXG4gIGNvbnN0cnVjdG9yIChjb21wLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSB7XG4gICAgICBpZiAoY29tcC5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlKSB7XG4gICAgICAgIHJldHVybiBjb21wXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wID0gY29tcC52YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXAgPSBjb21wLnRyaW0oKS5zcGxpdCgvXFxzKy8pLmpvaW4oJyAnKVxuICAgIGRlYnVnKCdjb21wYXJhdG9yJywgY29tcCwgb3B0aW9ucylcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5sb29zZSA9ICEhb3B0aW9ucy5sb29zZVxuICAgIHRoaXMucGFyc2UoY29tcClcblxuICAgIGlmICh0aGlzLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICB0aGlzLnZhbHVlID0gJydcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMub3BlcmF0b3IgKyB0aGlzLnNlbXZlci52ZXJzaW9uXG4gICAgfVxuXG4gICAgZGVidWcoJ2NvbXAnLCB0aGlzKVxuICB9XG5cbiAgcGFyc2UgKGNvbXApIHtcbiAgICBjb25zdCByID0gdGhpcy5vcHRpb25zLmxvb3NlID8gcmVbdC5DT01QQVJBVE9STE9PU0VdIDogcmVbdC5DT01QQVJBVE9SXVxuICAgIGNvbnN0IG0gPSBjb21wLm1hdGNoKHIpXG5cbiAgICBpZiAoIW0pIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgY29tcGFyYXRvcjogJHtjb21wfWApXG4gICAgfVxuXG4gICAgdGhpcy5vcGVyYXRvciA9IG1bMV0gIT09IHVuZGVmaW5lZCA/IG1bMV0gOiAnJ1xuICAgIGlmICh0aGlzLm9wZXJhdG9yID09PSAnPScpIHtcbiAgICAgIHRoaXMub3BlcmF0b3IgPSAnJ1xuICAgIH1cblxuICAgIC8vIGlmIGl0IGxpdGVyYWxseSBpcyBqdXN0ICc+JyBvciAnJyB0aGVuIGFsbG93IGFueXRoaW5nLlxuICAgIGlmICghbVsyXSkge1xuICAgICAgdGhpcy5zZW12ZXIgPSBBTllcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW12ZXIgPSBuZXcgU2VtVmVyKG1bMl0sIHRoaXMub3B0aW9ucy5sb29zZSlcbiAgICB9XG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVcbiAgfVxuXG4gIHRlc3QgKHZlcnNpb24pIHtcbiAgICBkZWJ1ZygnQ29tcGFyYXRvci50ZXN0JywgdmVyc2lvbiwgdGhpcy5vcHRpb25zLmxvb3NlKVxuXG4gICAgaWYgKHRoaXMuc2VtdmVyID09PSBBTlkgfHwgdmVyc2lvbiA9PT0gQU5ZKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIHRoaXMub3B0aW9ucylcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbXAodmVyc2lvbiwgdGhpcy5vcGVyYXRvciwgdGhpcy5zZW12ZXIsIHRoaXMub3B0aW9ucylcbiAgfVxuXG4gIGludGVyc2VjdHMgKGNvbXAsIG9wdGlvbnMpIHtcbiAgICBpZiAoIShjb21wIGluc3RhbmNlb2YgQ29tcGFyYXRvcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgQ29tcGFyYXRvciBpcyByZXF1aXJlZCcpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICcnKSB7XG4gICAgICBpZiAodGhpcy52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmFuZ2UoY29tcC52YWx1ZSwgb3B0aW9ucykudGVzdCh0aGlzLnZhbHVlKVxuICAgIH0gZWxzZSBpZiAoY29tcC5vcGVyYXRvciA9PT0gJycpIHtcbiAgICAgIGlmIChjb21wLnZhbHVlID09PSAnJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnZhbHVlLCBvcHRpb25zKS50ZXN0KGNvbXAuc2VtdmVyKVxuICAgIH1cblxuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIC8vIFNwZWNpYWwgY2FzZXMgd2hlcmUgbm90aGluZyBjYW4gcG9zc2libHkgYmUgbG93ZXJcbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgICAgKHRoaXMudmFsdWUgPT09ICc8MC4wLjAtMCcgfHwgY29tcC52YWx1ZSA9PT0gJzwwLjAuMC0wJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICAgICh0aGlzLnZhbHVlLnN0YXJ0c1dpdGgoJzwwLjAuMCcpIHx8IGNvbXAudmFsdWUuc3RhcnRzV2l0aCgnPDAuMC4wJykpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBTYW1lIGRpcmVjdGlvbiBpbmNyZWFzaW5nICg+IG9yID49KVxuICAgIGlmICh0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gU2FtZSBkaXJlY3Rpb24gZGVjcmVhc2luZyAoPCBvciA8PSlcbiAgICBpZiAodGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIHNhbWUgU2VtVmVyIGFuZCBib3RoIHNpZGVzIGFyZSBpbmNsdXNpdmUgKDw9IG9yID49KVxuICAgIGlmIChcbiAgICAgICh0aGlzLnNlbXZlci52ZXJzaW9uID09PSBjb21wLnNlbXZlci52ZXJzaW9uKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5pbmNsdWRlcygnPScpICYmIGNvbXAub3BlcmF0b3IuaW5jbHVkZXMoJz0nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gb3Bwb3NpdGUgZGlyZWN0aW9ucyBsZXNzIHRoYW5cbiAgICBpZiAoY21wKHRoaXMuc2VtdmVyLCAnPCcsIGNvbXAuc2VtdmVyLCBvcHRpb25zKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIG9wcG9zaXRlIGRpcmVjdGlvbnMgZ3JlYXRlciB0aGFuXG4gICAgaWYgKGNtcCh0aGlzLnNlbXZlciwgJz4nLCBjb21wLnNlbXZlciwgb3B0aW9ucykgJiZcbiAgICAgIHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPCcpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBhcmF0b3JcblxuY29uc3QgcGFyc2VPcHRpb25zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcGFyc2Utb3B0aW9ucycpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcbmNvbnN0IGNtcCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9jbXAnKVxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9kZWJ1ZycpXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2UnKVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHNhdGlzZmllcyA9ICh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICB0cnkge1xuICAgIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiByYW5nZS50ZXN0KHZlcnNpb24pXG59XG5tb2R1bGUuZXhwb3J0cyA9IHNhdGlzZmllc1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcblxuLy8gTW9zdGx5IGp1c3QgZm9yIHRlc3RpbmcgYW5kIGxlZ2FjeSBBUEkgcmVhc29uc1xuY29uc3QgdG9Db21wYXJhdG9ycyA9IChyYW5nZSwgb3B0aW9ucykgPT5cbiAgbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKS5zZXRcbiAgICAubWFwKGNvbXAgPT4gY29tcC5tYXAoYyA9PiBjLnZhbHVlKS5qb2luKCcgJykudHJpbSgpLnNwbGl0KCcgJykpXG5cbm1vZHVsZS5leHBvcnRzID0gdG9Db21wYXJhdG9yc1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcblxuY29uc3QgbWF4U2F0aXNmeWluZyA9ICh2ZXJzaW9ucywgcmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgbGV0IG1heCA9IG51bGxcbiAgbGV0IG1heFNWID0gbnVsbFxuICBsZXQgcmFuZ2VPYmogPSBudWxsXG4gIHRyeSB7XG4gICAgcmFuZ2VPYmogPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICB2ZXJzaW9ucy5mb3JFYWNoKCh2KSA9PiB7XG4gICAgaWYgKHJhbmdlT2JqLnRlc3QodikpIHtcbiAgICAgIC8vIHNhdGlzZmllcyh2LCByYW5nZSwgb3B0aW9ucylcbiAgICAgIGlmICghbWF4IHx8IG1heFNWLmNvbXBhcmUodikgPT09IC0xKSB7XG4gICAgICAgIC8vIGNvbXBhcmUobWF4LCB2LCB0cnVlKVxuICAgICAgICBtYXggPSB2XG4gICAgICAgIG1heFNWID0gbmV3IFNlbVZlcihtYXgsIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gbWF4XG59XG5tb2R1bGUuZXhwb3J0cyA9IG1heFNhdGlzZnlpbmdcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBtaW5TYXRpc2Z5aW5nID0gKHZlcnNpb25zLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICBsZXQgbWluID0gbnVsbFxuICBsZXQgbWluU1YgPSBudWxsXG4gIGxldCByYW5nZU9iaiA9IG51bGxcbiAgdHJ5IHtcbiAgICByYW5nZU9iaiA9IG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHZlcnNpb25zLmZvckVhY2goKHYpID0+IHtcbiAgICBpZiAocmFuZ2VPYmoudGVzdCh2KSkge1xuICAgICAgLy8gc2F0aXNmaWVzKHYsIHJhbmdlLCBvcHRpb25zKVxuICAgICAgaWYgKCFtaW4gfHwgbWluU1YuY29tcGFyZSh2KSA9PT0gMSkge1xuICAgICAgICAvLyBjb21wYXJlKG1pbiwgdiwgdHJ1ZSlcbiAgICAgICAgbWluID0gdlxuICAgICAgICBtaW5TViA9IG5ldyBTZW1WZXIobWluLCBvcHRpb25zKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1pblxufVxubW9kdWxlLmV4cG9ydHMgPSBtaW5TYXRpc2Z5aW5nXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgZ3QgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvZ3QnKVxuXG5jb25zdCBtaW5WZXJzaW9uID0gKHJhbmdlLCBsb29zZSkgPT4ge1xuICByYW5nZSA9IG5ldyBSYW5nZShyYW5nZSwgbG9vc2UpXG5cbiAgbGV0IG1pbnZlciA9IG5ldyBTZW1WZXIoJzAuMC4wJylcbiAgaWYgKHJhbmdlLnRlc3QobWludmVyKSkge1xuICAgIHJldHVybiBtaW52ZXJcbiAgfVxuXG4gIG1pbnZlciA9IG5ldyBTZW1WZXIoJzAuMC4wLTAnKVxuICBpZiAocmFuZ2UudGVzdChtaW52ZXIpKSB7XG4gICAgcmV0dXJuIG1pbnZlclxuICB9XG5cbiAgbWludmVyID0gbnVsbFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlLnNldC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGNvbXBhcmF0b3JzID0gcmFuZ2Uuc2V0W2ldXG5cbiAgICBsZXQgc2V0TWluID0gbnVsbFxuICAgIGNvbXBhcmF0b3JzLmZvckVhY2goKGNvbXBhcmF0b3IpID0+IHtcbiAgICAgIC8vIENsb25lIHRvIGF2b2lkIG1hbmlwdWxhdGluZyB0aGUgY29tcGFyYXRvcidzIHNlbXZlciBvYmplY3QuXG4gICAgICBjb25zdCBjb21wdmVyID0gbmV3IFNlbVZlcihjb21wYXJhdG9yLnNlbXZlci52ZXJzaW9uKVxuICAgICAgc3dpdGNoIChjb21wYXJhdG9yLm9wZXJhdG9yKSB7XG4gICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgIGlmIChjb21wdmVyLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb21wdmVyLnBhdGNoKytcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tcHZlci5wcmVyZWxlYXNlLnB1c2goMClcbiAgICAgICAgICB9XG4gICAgICAgICAgY29tcHZlci5yYXcgPSBjb21wdmVyLmZvcm1hdCgpXG4gICAgICAgICAgLyogZmFsbHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAnJzpcbiAgICAgICAgY2FzZSAnPj0nOlxuICAgICAgICAgIGlmICghc2V0TWluIHx8IGd0KGNvbXB2ZXIsIHNldE1pbikpIHtcbiAgICAgICAgICAgIHNldE1pbiA9IGNvbXB2ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgIGNhc2UgJzw9JzpcbiAgICAgICAgICAvKiBJZ25vcmUgbWF4aW11bSB2ZXJzaW9ucyAqL1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIG9wZXJhdGlvbjogJHtjb21wYXJhdG9yLm9wZXJhdG9yfWApXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoc2V0TWluICYmICghbWludmVyIHx8IGd0KG1pbnZlciwgc2V0TWluKSkpIHtcbiAgICAgIG1pbnZlciA9IHNldE1pblxuICAgIH1cbiAgfVxuXG4gIGlmIChtaW52ZXIgJiYgcmFuZ2UudGVzdChtaW52ZXIpKSB7XG4gICAgcmV0dXJuIG1pbnZlclxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gbWluVmVyc2lvblxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHZhbGlkUmFuZ2UgPSAocmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBSZXR1cm4gJyonIGluc3RlYWQgb2YgJycgc28gdGhhdCB0cnV0aGluZXNzIHdvcmtzLlxuICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBpZiBpdCdzIGludmFsaWQgYW55d2F5XG4gICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucykucmFuZ2UgfHwgJyonXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB2YWxpZFJhbmdlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBDb21wYXJhdG9yID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9jb21wYXJhdG9yJylcbmNvbnN0IHsgQU5ZIH0gPSBDb21wYXJhdG9yXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3Qgc2F0aXNmaWVzID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL3NhdGlzZmllcycpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndCcpXG5jb25zdCBsdCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9sdCcpXG5jb25zdCBsdGUgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvbHRlJylcbmNvbnN0IGd0ZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndGUnKVxuXG5jb25zdCBvdXRzaWRlID0gKHZlcnNpb24sIHJhbmdlLCBoaWxvLCBvcHRpb25zKSA9PiB7XG4gIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuXG4gIGxldCBndGZuLCBsdGVmbiwgbHRmbiwgY29tcCwgZWNvbXBcbiAgc3dpdGNoIChoaWxvKSB7XG4gICAgY2FzZSAnPic6XG4gICAgICBndGZuID0gZ3RcbiAgICAgIGx0ZWZuID0gbHRlXG4gICAgICBsdGZuID0gbHRcbiAgICAgIGNvbXAgPSAnPidcbiAgICAgIGVjb21wID0gJz49J1xuICAgICAgYnJlYWtcbiAgICBjYXNlICc8JzpcbiAgICAgIGd0Zm4gPSBsdFxuICAgICAgbHRlZm4gPSBndGVcbiAgICAgIGx0Zm4gPSBndFxuICAgICAgY29tcCA9ICc8J1xuICAgICAgZWNvbXAgPSAnPD0nXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNdXN0IHByb3ZpZGUgYSBoaWxvIHZhbCBvZiBcIjxcIiBvciBcIj5cIicpXG4gIH1cblxuICAvLyBJZiBpdCBzYXRpc2ZpZXMgdGhlIHJhbmdlIGl0IGlzIG5vdCBvdXRzaWRlXG4gIGlmIChzYXRpc2ZpZXModmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBGcm9tIG5vdyBvbiwgdmFyaWFibGUgdGVybXMgYXJlIGFzIGlmIHdlJ3JlIGluIFwiZ3RyXCIgbW9kZS5cbiAgLy8gYnV0IG5vdGUgdGhhdCBldmVyeXRoaW5nIGlzIGZsaXBwZWQgZm9yIHRoZSBcImx0clwiIGZ1bmN0aW9uLlxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2Uuc2V0Lmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSByYW5nZS5zZXRbaV1cblxuICAgIGxldCBoaWdoID0gbnVsbFxuICAgIGxldCBsb3cgPSBudWxsXG5cbiAgICBjb21wYXJhdG9ycy5mb3JFYWNoKChjb21wYXJhdG9yKSA9PiB7XG4gICAgICBpZiAoY29tcGFyYXRvci5zZW12ZXIgPT09IEFOWSkge1xuICAgICAgICBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoJz49MC4wLjAnKVxuICAgICAgfVxuICAgICAgaGlnaCA9IGhpZ2ggfHwgY29tcGFyYXRvclxuICAgICAgbG93ID0gbG93IHx8IGNvbXBhcmF0b3JcbiAgICAgIGlmIChndGZuKGNvbXBhcmF0b3Iuc2VtdmVyLCBoaWdoLnNlbXZlciwgb3B0aW9ucykpIHtcbiAgICAgICAgaGlnaCA9IGNvbXBhcmF0b3JcbiAgICAgIH0gZWxzZSBpZiAobHRmbihjb21wYXJhdG9yLnNlbXZlciwgbG93LnNlbXZlciwgb3B0aW9ucykpIHtcbiAgICAgICAgbG93ID0gY29tcGFyYXRvclxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBJZiB0aGUgZWRnZSB2ZXJzaW9uIGNvbXBhcmF0b3IgaGFzIGEgb3BlcmF0b3IgdGhlbiBvdXIgdmVyc2lvblxuICAgIC8vIGlzbid0IG91dHNpZGUgaXRcbiAgICBpZiAoaGlnaC5vcGVyYXRvciA9PT0gY29tcCB8fCBoaWdoLm9wZXJhdG9yID09PSBlY29tcCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGxvd2VzdCB2ZXJzaW9uIGNvbXBhcmF0b3IgaGFzIGFuIG9wZXJhdG9yIGFuZCBvdXIgdmVyc2lvblxuICAgIC8vIGlzIGxlc3MgdGhhbiBpdCB0aGVuIGl0IGlzbid0IGhpZ2hlciB0aGFuIHRoZSByYW5nZVxuICAgIGlmICgoIWxvdy5vcGVyYXRvciB8fCBsb3cub3BlcmF0b3IgPT09IGNvbXApICYmXG4gICAgICAgIGx0ZWZuKHZlcnNpb24sIGxvdy5zZW12ZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKGxvdy5vcGVyYXRvciA9PT0gZWNvbXAgJiYgbHRmbih2ZXJzaW9uLCBsb3cuc2VtdmVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3V0c2lkZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuLy8gRGV0ZXJtaW5lIGlmIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIGFsbCB0aGUgdmVyc2lvbnMgcG9zc2libGUgaW4gdGhlIHJhbmdlLlxuY29uc3Qgb3V0c2lkZSA9IHJlcXVpcmUoJy4vb3V0c2lkZScpXG5jb25zdCBndHIgPSAodmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IG91dHNpZGUodmVyc2lvbiwgcmFuZ2UsICc+Jywgb3B0aW9ucylcbm1vZHVsZS5leHBvcnRzID0gZ3RyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBvdXRzaWRlID0gcmVxdWlyZSgnLi9vdXRzaWRlJylcbi8vIERldGVybWluZSBpZiB2ZXJzaW9uIGlzIGxlc3MgdGhhbiBhbGwgdGhlIHZlcnNpb25zIHBvc3NpYmxlIGluIHRoZSByYW5nZVxuY29uc3QgbHRyID0gKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKSA9PiBvdXRzaWRlKHZlcnNpb24sIHJhbmdlLCAnPCcsIG9wdGlvbnMpXG5tb2R1bGUuZXhwb3J0cyA9IGx0clxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IGludGVyc2VjdHMgPSAocjEsIHIyLCBvcHRpb25zKSA9PiB7XG4gIHIxID0gbmV3IFJhbmdlKHIxLCBvcHRpb25zKVxuICByMiA9IG5ldyBSYW5nZShyMiwgb3B0aW9ucylcbiAgcmV0dXJuIHIxLmludGVyc2VjdHMocjIsIG9wdGlvbnMpXG59XG5tb2R1bGUuZXhwb3J0cyA9IGludGVyc2VjdHNcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8vIGdpdmVuIGEgc2V0IG9mIHZlcnNpb25zIGFuZCBhIHJhbmdlLCBjcmVhdGUgYSBcInNpbXBsaWZpZWRcIiByYW5nZVxuLy8gdGhhdCBpbmNsdWRlcyB0aGUgc2FtZSB2ZXJzaW9ucyB0aGF0IHRoZSBvcmlnaW5hbCByYW5nZSBkb2VzXG4vLyBJZiB0aGUgb3JpZ2luYWwgcmFuZ2UgaXMgc2hvcnRlciB0aGFuIHRoZSBzaW1wbGlmaWVkIG9uZSwgcmV0dXJuIHRoYXQuXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvc2F0aXNmaWVzLmpzJylcbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvY29tcGFyZS5qcycpXG5tb2R1bGUuZXhwb3J0cyA9ICh2ZXJzaW9ucywgcmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qgc2V0ID0gW11cbiAgbGV0IGZpcnN0ID0gbnVsbFxuICBsZXQgcHJldiA9IG51bGxcbiAgY29uc3QgdiA9IHZlcnNpb25zLnNvcnQoKGEsIGIpID0+IGNvbXBhcmUoYSwgYiwgb3B0aW9ucykpXG4gIGZvciAoY29uc3QgdmVyc2lvbiBvZiB2KSB7XG4gICAgY29uc3QgaW5jbHVkZWQgPSBzYXRpc2ZpZXModmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpXG4gICAgaWYgKGluY2x1ZGVkKSB7XG4gICAgICBwcmV2ID0gdmVyc2lvblxuICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICBmaXJzdCA9IHZlcnNpb25cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgc2V0LnB1c2goW2ZpcnN0LCBwcmV2XSlcbiAgICAgIH1cbiAgICAgIHByZXYgPSBudWxsXG4gICAgICBmaXJzdCA9IG51bGxcbiAgICB9XG4gIH1cbiAgaWYgKGZpcnN0KSB7XG4gICAgc2V0LnB1c2goW2ZpcnN0LCBudWxsXSlcbiAgfVxuXG4gIGNvbnN0IHJhbmdlcyA9IFtdXG4gIGZvciAoY29uc3QgW21pbiwgbWF4XSBvZiBzZXQpIHtcbiAgICBpZiAobWluID09PSBtYXgpIHtcbiAgICAgIHJhbmdlcy5wdXNoKG1pbilcbiAgICB9IGVsc2UgaWYgKCFtYXggJiYgbWluID09PSB2WzBdKSB7XG4gICAgICByYW5nZXMucHVzaCgnKicpXG4gICAgfSBlbHNlIGlmICghbWF4KSB7XG4gICAgICByYW5nZXMucHVzaChgPj0ke21pbn1gKVxuICAgIH0gZWxzZSBpZiAobWluID09PSB2WzBdKSB7XG4gICAgICByYW5nZXMucHVzaChgPD0ke21heH1gKVxuICAgIH0gZWxzZSB7XG4gICAgICByYW5nZXMucHVzaChgJHttaW59IC0gJHttYXh9YClcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2ltcGxpZmllZCA9IHJhbmdlcy5qb2luKCcgfHwgJylcbiAgY29uc3Qgb3JpZ2luYWwgPSB0eXBlb2YgcmFuZ2UucmF3ID09PSAnc3RyaW5nJyA/IHJhbmdlLnJhdyA6IFN0cmluZyhyYW5nZSlcbiAgcmV0dXJuIHNpbXBsaWZpZWQubGVuZ3RoIDwgb3JpZ2luYWwubGVuZ3RoID8gc2ltcGxpZmllZCA6IHJhbmdlXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UuanMnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvY29tcGFyYXRvci5qcycpXG5jb25zdCB7IEFOWSB9ID0gQ29tcGFyYXRvclxuY29uc3Qgc2F0aXNmaWVzID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL3NhdGlzZmllcy5qcycpXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2NvbXBhcmUuanMnKVxuXG4vLyBDb21wbGV4IHJhbmdlIGByMSB8fCByMiB8fCAuLi5gIGlzIGEgc3Vic2V0IG9mIGBSMSB8fCBSMiB8fCAuLi5gIGlmZjpcbi8vIC0gRXZlcnkgc2ltcGxlIHJhbmdlIGByMSwgcjIsIC4uLmAgaXMgYSBudWxsIHNldCwgT1Jcbi8vIC0gRXZlcnkgc2ltcGxlIHJhbmdlIGByMSwgcjIsIC4uLmAgd2hpY2ggaXMgbm90IGEgbnVsbCBzZXQgaXMgYSBzdWJzZXQgb2Zcbi8vICAgc29tZSBgUjEsIFIyLCAuLi5gXG4vL1xuLy8gU2ltcGxlIHJhbmdlIGBjMSBjMiAuLi5gIGlzIGEgc3Vic2V0IG9mIHNpbXBsZSByYW5nZSBgQzEgQzIgLi4uYCBpZmY6XG4vLyAtIElmIGMgaXMgb25seSB0aGUgQU5ZIGNvbXBhcmF0b3Jcbi8vICAgLSBJZiBDIGlzIG9ubHkgdGhlIEFOWSBjb21wYXJhdG9yLCByZXR1cm4gdHJ1ZVxuLy8gICAtIEVsc2UgaWYgaW4gcHJlcmVsZWFzZSBtb2RlLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBlbHNlIHJlcGxhY2UgYyB3aXRoIGBbPj0wLjAuMF1gXG4vLyAtIElmIEMgaXMgb25seSB0aGUgQU5ZIGNvbXBhcmF0b3Jcbi8vICAgLSBpZiBpbiBwcmVyZWxlYXNlIG1vZGUsIHJldHVybiB0cnVlXG4vLyAgIC0gZWxzZSByZXBsYWNlIEMgd2l0aCBgWz49MC4wLjBdYFxuLy8gLSBMZXQgRVEgYmUgdGhlIHNldCBvZiA9IGNvbXBhcmF0b3JzIGluIGNcbi8vIC0gSWYgRVEgaXMgbW9yZSB0aGFuIG9uZSwgcmV0dXJuIHRydWUgKG51bGwgc2V0KVxuLy8gLSBMZXQgR1QgYmUgdGhlIGhpZ2hlc3QgPiBvciA+PSBjb21wYXJhdG9yIGluIGNcbi8vIC0gTGV0IExUIGJlIHRoZSBsb3dlc3QgPCBvciA8PSBjb21wYXJhdG9yIGluIGNcbi8vIC0gSWYgR1QgYW5kIExULCBhbmQgR1Quc2VtdmVyID4gTFQuc2VtdmVyLCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAtIElmIGFueSBDIGlzIGEgPSByYW5nZSwgYW5kIEdUIG9yIExUIGFyZSBzZXQsIHJldHVybiBmYWxzZVxuLy8gLSBJZiBFUVxuLy8gICAtIElmIEdULCBhbmQgRVEgZG9lcyBub3Qgc2F0aXNmeSBHVCwgcmV0dXJuIHRydWUgKG51bGwgc2V0KVxuLy8gICAtIElmIExULCBhbmQgRVEgZG9lcyBub3Qgc2F0aXNmeSBMVCwgcmV0dXJuIHRydWUgKG51bGwgc2V0KVxuLy8gICAtIElmIEVRIHNhdGlzZmllcyBldmVyeSBDLCByZXR1cm4gdHJ1ZVxuLy8gICAtIEVsc2UgcmV0dXJuIGZhbHNlXG4vLyAtIElmIEdUXG4vLyAgIC0gSWYgR1Quc2VtdmVyIGlzIGxvd2VyIHRoYW4gYW55ID4gb3IgPj0gY29tcCBpbiBDLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBJZiBHVCBpcyA+PSwgYW5kIEdULnNlbXZlciBkb2VzIG5vdCBzYXRpc2Z5IGV2ZXJ5IEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIEdULnNlbXZlciBoYXMgYSBwcmVyZWxlYXNlLCBhbmQgbm90IGluIHByZXJlbGVhc2UgbW9kZVxuLy8gICAgIC0gSWYgbm8gQyBoYXMgYSBwcmVyZWxlYXNlIGFuZCB0aGUgR1Quc2VtdmVyIHR1cGxlLCByZXR1cm4gZmFsc2Vcbi8vIC0gSWYgTFRcbi8vICAgLSBJZiBMVC5zZW12ZXIgaXMgZ3JlYXRlciB0aGFuIGFueSA8IG9yIDw9IGNvbXAgaW4gQywgcmV0dXJuIGZhbHNlXG4vLyAgIC0gSWYgTFQgaXMgPD0sIGFuZCBMVC5zZW12ZXIgZG9lcyBub3Qgc2F0aXNmeSBldmVyeSBDLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBJZiBHVC5zZW12ZXIgaGFzIGEgcHJlcmVsZWFzZSwgYW5kIG5vdCBpbiBwcmVyZWxlYXNlIG1vZGVcbi8vICAgICAtIElmIG5vIEMgaGFzIGEgcHJlcmVsZWFzZSBhbmQgdGhlIExULnNlbXZlciB0dXBsZSwgcmV0dXJuIGZhbHNlXG4vLyAtIEVsc2UgcmV0dXJuIHRydWVcblxuY29uc3Qgc3Vic2V0ID0gKHN1YiwgZG9tLCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKHN1YiA9PT0gZG9tKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHN1YiA9IG5ldyBSYW5nZShzdWIsIG9wdGlvbnMpXG4gIGRvbSA9IG5ldyBSYW5nZShkb20sIG9wdGlvbnMpXG4gIGxldCBzYXdOb25OdWxsID0gZmFsc2VcblxuICBPVVRFUjogZm9yIChjb25zdCBzaW1wbGVTdWIgb2Ygc3ViLnNldCkge1xuICAgIGZvciAoY29uc3Qgc2ltcGxlRG9tIG9mIGRvbS5zZXQpIHtcbiAgICAgIGNvbnN0IGlzU3ViID0gc2ltcGxlU3Vic2V0KHNpbXBsZVN1Yiwgc2ltcGxlRG9tLCBvcHRpb25zKVxuICAgICAgc2F3Tm9uTnVsbCA9IHNhd05vbk51bGwgfHwgaXNTdWIgIT09IG51bGxcbiAgICAgIGlmIChpc1N1Yikge1xuICAgICAgICBjb250aW51ZSBPVVRFUlxuICAgICAgfVxuICAgIH1cbiAgICAvLyB0aGUgbnVsbCBzZXQgaXMgYSBzdWJzZXQgb2YgZXZlcnl0aGluZywgYnV0IG51bGwgc2ltcGxlIHJhbmdlcyBpblxuICAgIC8vIGEgY29tcGxleCByYW5nZSBzaG91bGQgYmUgaWdub3JlZC4gIHNvIGlmIHdlIHNhdyBhIG5vbi1udWxsIHJhbmdlLFxuICAgIC8vIHRoZW4gd2Uga25vdyB0aGlzIGlzbid0IGEgc3Vic2V0LCBidXQgaWYgRVZFUlkgc2ltcGxlIHJhbmdlIHdhcyBudWxsLFxuICAgIC8vIHRoZW4gaXQgaXMgYSBzdWJzZXQuXG4gICAgaWYgKHNhd05vbk51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5jb25zdCBtaW5pbXVtVmVyc2lvbldpdGhQcmVSZWxlYXNlID0gW25ldyBDb21wYXJhdG9yKCc+PTAuMC4wLTAnKV1cbmNvbnN0IG1pbmltdW1WZXJzaW9uID0gW25ldyBDb21wYXJhdG9yKCc+PTAuMC4wJyldXG5cbmNvbnN0IHNpbXBsZVN1YnNldCA9IChzdWIsIGRvbSwgb3B0aW9ucykgPT4ge1xuICBpZiAoc3ViID09PSBkb20pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHN1Yi5sZW5ndGggPT09IDEgJiYgc3ViWzBdLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgaWYgKGRvbS5sZW5ndGggPT09IDEgJiYgZG9tWzBdLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgICAgc3ViID0gbWluaW11bVZlcnNpb25XaXRoUHJlUmVsZWFzZVxuICAgIH0gZWxzZSB7XG4gICAgICBzdWIgPSBtaW5pbXVtVmVyc2lvblxuICAgIH1cbiAgfVxuXG4gIGlmIChkb20ubGVuZ3RoID09PSAxICYmIGRvbVswXS5zZW12ZXIgPT09IEFOWSkge1xuICAgIGlmIChvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICBkb20gPSBtaW5pbXVtVmVyc2lvblxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGVxU2V0ID0gbmV3IFNldCgpXG4gIGxldCBndCwgbHRcbiAgZm9yIChjb25zdCBjIG9mIHN1Yikge1xuICAgIGlmIChjLm9wZXJhdG9yID09PSAnPicgfHwgYy5vcGVyYXRvciA9PT0gJz49Jykge1xuICAgICAgZ3QgPSBoaWdoZXJHVChndCwgYywgb3B0aW9ucylcbiAgICB9IGVsc2UgaWYgKGMub3BlcmF0b3IgPT09ICc8JyB8fCBjLm9wZXJhdG9yID09PSAnPD0nKSB7XG4gICAgICBsdCA9IGxvd2VyTFQobHQsIGMsIG9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVxU2V0LmFkZChjLnNlbXZlcilcbiAgICB9XG4gIH1cblxuICBpZiAoZXFTZXQuc2l6ZSA+IDEpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgbGV0IGd0bHRDb21wXG4gIGlmIChndCAmJiBsdCkge1xuICAgIGd0bHRDb21wID0gY29tcGFyZShndC5zZW12ZXIsIGx0LnNlbXZlciwgb3B0aW9ucylcbiAgICBpZiAoZ3RsdENvbXAgPiAwKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0gZWxzZSBpZiAoZ3RsdENvbXAgPT09IDAgJiYgKGd0Lm9wZXJhdG9yICE9PSAnPj0nIHx8IGx0Lm9wZXJhdG9yICE9PSAnPD0nKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvLyB3aWxsIGl0ZXJhdGUgb25lIG9yIHplcm8gdGltZXNcbiAgZm9yIChjb25zdCBlcSBvZiBlcVNldCkge1xuICAgIGlmIChndCAmJiAhc2F0aXNmaWVzKGVxLCBTdHJpbmcoZ3QpLCBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBpZiAobHQgJiYgIXNhdGlzZmllcyhlcSwgU3RyaW5nKGx0KSwgb3B0aW9ucykpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjIG9mIGRvbSkge1xuICAgICAgaWYgKCFzYXRpc2ZpZXMoZXEsIFN0cmluZyhjKSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGxldCBoaWdoZXIsIGxvd2VyXG4gIGxldCBoYXNEb21MVCwgaGFzRG9tR1RcbiAgLy8gaWYgdGhlIHN1YnNldCBoYXMgYSBwcmVyZWxlYXNlLCB3ZSBuZWVkIGEgY29tcGFyYXRvciBpbiB0aGUgc3VwZXJzZXRcbiAgLy8gd2l0aCB0aGUgc2FtZSB0dXBsZSBhbmQgYSBwcmVyZWxlYXNlLCBvciBpdCdzIG5vdCBhIHN1YnNldFxuICBsZXQgbmVlZERvbUxUUHJlID0gbHQgJiZcbiAgICAhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgIGx0LnNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCA/IGx0LnNlbXZlciA6IGZhbHNlXG4gIGxldCBuZWVkRG9tR1RQcmUgPSBndCAmJlxuICAgICFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmXG4gICAgZ3Quc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID8gZ3Quc2VtdmVyIDogZmFsc2VcbiAgLy8gZXhjZXB0aW9uOiA8MS4yLjMtMCBpcyB0aGUgc2FtZSBhcyA8MS4yLjNcbiAgaWYgKG5lZWREb21MVFByZSAmJiBuZWVkRG9tTFRQcmUucHJlcmVsZWFzZS5sZW5ndGggPT09IDEgJiZcbiAgICAgIGx0Lm9wZXJhdG9yID09PSAnPCcgJiYgbmVlZERvbUxUUHJlLnByZXJlbGVhc2VbMF0gPT09IDApIHtcbiAgICBuZWVkRG9tTFRQcmUgPSBmYWxzZVxuICB9XG5cbiAgZm9yIChjb25zdCBjIG9mIGRvbSkge1xuICAgIGhhc0RvbUdUID0gaGFzRG9tR1QgfHwgYy5vcGVyYXRvciA9PT0gJz4nIHx8IGMub3BlcmF0b3IgPT09ICc+PSdcbiAgICBoYXNEb21MVCA9IGhhc0RvbUxUIHx8IGMub3BlcmF0b3IgPT09ICc8JyB8fCBjLm9wZXJhdG9yID09PSAnPD0nXG4gICAgaWYgKGd0KSB7XG4gICAgICBpZiAobmVlZERvbUdUUHJlKSB7XG4gICAgICAgIGlmIChjLnNlbXZlci5wcmVyZWxlYXNlICYmIGMuc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoICYmXG4gICAgICAgICAgICBjLnNlbXZlci5tYWpvciA9PT0gbmVlZERvbUdUUHJlLm1ham9yICYmXG4gICAgICAgICAgICBjLnNlbXZlci5taW5vciA9PT0gbmVlZERvbUdUUHJlLm1pbm9yICYmXG4gICAgICAgICAgICBjLnNlbXZlci5wYXRjaCA9PT0gbmVlZERvbUdUUHJlLnBhdGNoKSB7XG4gICAgICAgICAgbmVlZERvbUdUUHJlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGMub3BlcmF0b3IgPT09ICc+JyB8fCBjLm9wZXJhdG9yID09PSAnPj0nKSB7XG4gICAgICAgIGhpZ2hlciA9IGhpZ2hlckdUKGd0LCBjLCBvcHRpb25zKVxuICAgICAgICBpZiAoaGlnaGVyID09PSBjICYmIGhpZ2hlciAhPT0gZ3QpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChndC5vcGVyYXRvciA9PT0gJz49JyAmJiAhc2F0aXNmaWVzKGd0LnNlbXZlciwgU3RyaW5nKGMpLCBvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGx0KSB7XG4gICAgICBpZiAobmVlZERvbUxUUHJlKSB7XG4gICAgICAgIGlmIChjLnNlbXZlci5wcmVyZWxlYXNlICYmIGMuc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoICYmXG4gICAgICAgICAgICBjLnNlbXZlci5tYWpvciA9PT0gbmVlZERvbUxUUHJlLm1ham9yICYmXG4gICAgICAgICAgICBjLnNlbXZlci5taW5vciA9PT0gbmVlZERvbUxUUHJlLm1pbm9yICYmXG4gICAgICAgICAgICBjLnNlbXZlci5wYXRjaCA9PT0gbmVlZERvbUxUUHJlLnBhdGNoKSB7XG4gICAgICAgICAgbmVlZERvbUxUUHJlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGMub3BlcmF0b3IgPT09ICc8JyB8fCBjLm9wZXJhdG9yID09PSAnPD0nKSB7XG4gICAgICAgIGxvd2VyID0gbG93ZXJMVChsdCwgYywgb3B0aW9ucylcbiAgICAgICAgaWYgKGxvd2VyID09PSBjICYmIGxvd2VyICE9PSBsdCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGx0Lm9wZXJhdG9yID09PSAnPD0nICYmICFzYXRpc2ZpZXMobHQuc2VtdmVyLCBTdHJpbmcoYyksIG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWMub3BlcmF0b3IgJiYgKGx0IHx8IGd0KSAmJiBndGx0Q29tcCAhPT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlcmUgd2FzIGEgPCBvciA+LCBhbmQgbm90aGluZyBpbiB0aGUgZG9tLCB0aGVuIG11c3QgYmUgZmFsc2VcbiAgLy8gVU5MRVNTIGl0IHdhcyBsaW1pdGVkIGJ5IGFub3RoZXIgcmFuZ2UgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi5cbiAgLy8gRWcsID4xLjAuMCA8MS4wLjEgaXMgc3RpbGwgYSBzdWJzZXQgb2YgPDIuMC4wXG4gIGlmIChndCAmJiBoYXNEb21MVCAmJiAhbHQgJiYgZ3RsdENvbXAgIT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChsdCAmJiBoYXNEb21HVCAmJiAhZ3QgJiYgZ3RsdENvbXAgIT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIHdlIG5lZWRlZCBhIHByZXJlbGVhc2UgcmFuZ2UgaW4gYSBzcGVjaWZpYyB0dXBsZSwgYnV0IGRpZG4ndCBnZXQgb25lXG4gIC8vIHRoZW4gdGhpcyBpc24ndCBhIHN1YnNldC4gIGVnID49MS4yLjMtcHJlIGlzIG5vdCBhIHN1YnNldCBvZiA+PTEuMC4wLFxuICAvLyBiZWNhdXNlIGl0IGluY2x1ZGVzIHByZXJlbGVhc2VzIGluIHRoZSAxLjIuMyB0dXBsZVxuICBpZiAobmVlZERvbUdUUHJlIHx8IG5lZWREb21MVFByZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLy8gPj0xLjIuMyBpcyBsb3dlciB0aGFuID4xLjIuM1xuY29uc3QgaGlnaGVyR1QgPSAoYSwgYiwgb3B0aW9ucykgPT4ge1xuICBpZiAoIWEpIHtcbiAgICByZXR1cm4gYlxuICB9XG4gIGNvbnN0IGNvbXAgPSBjb21wYXJlKGEuc2VtdmVyLCBiLnNlbXZlciwgb3B0aW9ucylcbiAgcmV0dXJuIGNvbXAgPiAwID8gYVxuICAgIDogY29tcCA8IDAgPyBiXG4gICAgOiBiLm9wZXJhdG9yID09PSAnPicgJiYgYS5vcGVyYXRvciA9PT0gJz49JyA/IGJcbiAgICA6IGFcbn1cblxuLy8gPD0xLjIuMyBpcyBoaWdoZXIgdGhhbiA8MS4yLjNcbmNvbnN0IGxvd2VyTFQgPSAoYSwgYiwgb3B0aW9ucykgPT4ge1xuICBpZiAoIWEpIHtcbiAgICByZXR1cm4gYlxuICB9XG4gIGNvbnN0IGNvbXAgPSBjb21wYXJlKGEuc2VtdmVyLCBiLnNlbXZlciwgb3B0aW9ucylcbiAgcmV0dXJuIGNvbXAgPCAwID8gYVxuICAgIDogY29tcCA+IDAgPyBiXG4gICAgOiBiLm9wZXJhdG9yID09PSAnPCcgJiYgYS5vcGVyYXRvciA9PT0gJzw9JyA/IGJcbiAgICA6IGFcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdWJzZXRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8vIGp1c3QgcHJlLWxvYWQgYWxsIHRoZSBzdHVmZiB0aGF0IGluZGV4LmpzIGxhemlseSBleHBvcnRzXG5jb25zdCBpbnRlcm5hbFJlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9yZScpXG5jb25zdCBjb25zdGFudHMgPSByZXF1aXJlKCcuL2ludGVybmFsL2NvbnN0YW50cycpXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGlkZW50aWZpZXJzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9pZGVudGlmaWVycycpXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3BhcnNlJylcbmNvbnN0IHZhbGlkID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvdmFsaWQnKVxuY29uc3QgY2xlYW4gPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jbGVhbicpXG5jb25zdCBpbmMgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9pbmMnKVxuY29uc3QgZGlmZiA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2RpZmYnKVxuY29uc3QgbWFqb3IgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9tYWpvcicpXG5jb25zdCBtaW5vciA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL21pbm9yJylcbmNvbnN0IHBhdGNoID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcGF0Y2gnKVxuY29uc3QgcHJlcmVsZWFzZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3ByZXJlbGVhc2UnKVxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvbXBhcmUnKVxuY29uc3QgcmNvbXBhcmUgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9yY29tcGFyZScpXG5jb25zdCBjb21wYXJlTG9vc2UgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jb21wYXJlLWxvb3NlJylcbmNvbnN0IGNvbXBhcmVCdWlsZCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvbXBhcmUtYnVpbGQnKVxuY29uc3Qgc29ydCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3NvcnQnKVxuY29uc3QgcnNvcnQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9yc29ydCcpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2d0JylcbmNvbnN0IGx0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbHQnKVxuY29uc3QgZXEgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9lcScpXG5jb25zdCBuZXEgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9uZXEnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZ3RlJylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2x0ZScpXG5jb25zdCBjbXAgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jbXAnKVxuY29uc3QgY29lcmNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29lcmNlJylcbmNvbnN0IENvbXBhcmF0b3IgPSByZXF1aXJlKCcuL2NsYXNzZXMvY29tcGFyYXRvcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9zYXRpc2ZpZXMnKVxuY29uc3QgdG9Db21wYXJhdG9ycyA9IHJlcXVpcmUoJy4vcmFuZ2VzL3RvLWNvbXBhcmF0b3JzJylcbmNvbnN0IG1heFNhdGlzZnlpbmcgPSByZXF1aXJlKCcuL3Jhbmdlcy9tYXgtc2F0aXNmeWluZycpXG5jb25zdCBtaW5TYXRpc2Z5aW5nID0gcmVxdWlyZSgnLi9yYW5nZXMvbWluLXNhdGlzZnlpbmcnKVxuY29uc3QgbWluVmVyc2lvbiA9IHJlcXVpcmUoJy4vcmFuZ2VzL21pbi12ZXJzaW9uJylcbmNvbnN0IHZhbGlkUmFuZ2UgPSByZXF1aXJlKCcuL3Jhbmdlcy92YWxpZCcpXG5jb25zdCBvdXRzaWRlID0gcmVxdWlyZSgnLi9yYW5nZXMvb3V0c2lkZScpXG5jb25zdCBndHIgPSByZXF1aXJlKCcuL3Jhbmdlcy9ndHInKVxuY29uc3QgbHRyID0gcmVxdWlyZSgnLi9yYW5nZXMvbHRyJylcbmNvbnN0IGludGVyc2VjdHMgPSByZXF1aXJlKCcuL3Jhbmdlcy9pbnRlcnNlY3RzJylcbmNvbnN0IHNpbXBsaWZ5UmFuZ2UgPSByZXF1aXJlKCcuL3Jhbmdlcy9zaW1wbGlmeScpXG5jb25zdCBzdWJzZXQgPSByZXF1aXJlKCcuL3Jhbmdlcy9zdWJzZXQnKVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBhcnNlLFxuICB2YWxpZCxcbiAgY2xlYW4sXG4gIGluYyxcbiAgZGlmZixcbiAgbWFqb3IsXG4gIG1pbm9yLFxuICBwYXRjaCxcbiAgcHJlcmVsZWFzZSxcbiAgY29tcGFyZSxcbiAgcmNvbXBhcmUsXG4gIGNvbXBhcmVMb29zZSxcbiAgY29tcGFyZUJ1aWxkLFxuICBzb3J0LFxuICByc29ydCxcbiAgZ3QsXG4gIGx0LFxuICBlcSxcbiAgbmVxLFxuICBndGUsXG4gIGx0ZSxcbiAgY21wLFxuICBjb2VyY2UsXG4gIENvbXBhcmF0b3IsXG4gIFJhbmdlLFxuICBzYXRpc2ZpZXMsXG4gIHRvQ29tcGFyYXRvcnMsXG4gIG1heFNhdGlzZnlpbmcsXG4gIG1pblNhdGlzZnlpbmcsXG4gIG1pblZlcnNpb24sXG4gIHZhbGlkUmFuZ2UsXG4gIG91dHNpZGUsXG4gIGd0cixcbiAgbHRyLFxuICBpbnRlcnNlY3RzLFxuICBzaW1wbGlmeVJhbmdlLFxuICBzdWJzZXQsXG4gIFNlbVZlcixcbiAgcmU6IGludGVybmFsUmUucmUsXG4gIHNyYzogaW50ZXJuYWxSZS5zcmMsXG4gIHRva2VuczogaW50ZXJuYWxSZS50LFxuICBTRU1WRVJfU1BFQ19WRVJTSU9OOiBjb25zdGFudHMuU0VNVkVSX1NQRUNfVkVSU0lPTixcbiAgUkVMRUFTRV9UWVBFUzogY29uc3RhbnRzLlJFTEVBU0VfVFlQRVMsXG4gIGNvbXBhcmVJZGVudGlmaWVyczogaWRlbnRpZmllcnMuY29tcGFyZUlkZW50aWZpZXJzLFxuICByY29tcGFyZUlkZW50aWZpZXJzOiBpZGVudGlmaWVycy5yY29tcGFyZUlkZW50aWZpZXJzLFxufVxuIiwKICAgICJjb25zdCBzZW12ZXIgPSByZXF1aXJlKCdzZW12ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZW12ZXIuc2F0aXNmaWVzKHByb2Nlc3MudmVyc2lvbiwgJz49MTUuNy4wJyk7XG4iLAogICAgImNvbnN0IHNlbXZlciA9IHJlcXVpcmUoJ3NlbXZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbXZlci5zYXRpc2ZpZXMocHJvY2Vzcy52ZXJzaW9uLCAnPj0xNi45LjAnKTtcbiIsCiAgICAiY29uc3QgQVNZTU1FVFJJQ19LRVlfREVUQUlMU19TVVBQT1JURUQgPSByZXF1aXJlKCcuL2FzeW1tZXRyaWNLZXlEZXRhaWxzU3VwcG9ydGVkJyk7XG5jb25zdCBSU0FfUFNTX0tFWV9ERVRBSUxTX1NVUFBPUlRFRCA9IHJlcXVpcmUoJy4vcnNhUHNzS2V5RGV0YWlsc1N1cHBvcnRlZCcpO1xuXG5jb25zdCBhbGxvd2VkQWxnb3JpdGhtc0ZvcktleXMgPSB7XG4gICdlYyc6IFsnRVMyNTYnLCAnRVMzODQnLCAnRVM1MTInXSxcbiAgJ3JzYSc6IFsnUlMyNTYnLCAnUFMyNTYnLCAnUlMzODQnLCAnUFMzODQnLCAnUlM1MTInLCAnUFM1MTInXSxcbiAgJ3JzYS1wc3MnOiBbJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJ11cbn07XG5cbmNvbnN0IGFsbG93ZWRDdXJ2ZXMgPSB7XG4gIEVTMjU2OiAncHJpbWUyNTZ2MScsXG4gIEVTMzg0OiAnc2VjcDM4NHIxJyxcbiAgRVM1MTI6ICdzZWNwNTIxcjEnLFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihhbGdvcml0aG0sIGtleSkge1xuICBpZiAoIWFsZ29yaXRobSB8fCAha2V5KSByZXR1cm47XG5cbiAgY29uc3Qga2V5VHlwZSA9IGtleS5hc3ltbWV0cmljS2V5VHlwZTtcbiAgaWYgKCFrZXlUeXBlKSByZXR1cm47XG5cbiAgY29uc3QgYWxsb3dlZEFsZ29yaXRobXMgPSBhbGxvd2VkQWxnb3JpdGhtc0ZvcktleXNba2V5VHlwZV07XG5cbiAgaWYgKCFhbGxvd2VkQWxnb3JpdGhtcykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBrZXkgdHlwZSBcIiR7a2V5VHlwZX1cIi5gKTtcbiAgfVxuXG4gIGlmICghYWxsb3dlZEFsZ29yaXRobXMuaW5jbHVkZXMoYWxnb3JpdGhtKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgXCJhbGdcIiBwYXJhbWV0ZXIgZm9yIFwiJHtrZXlUeXBlfVwiIGtleSB0eXBlIG11c3QgYmUgb25lIG9mOiAke2FsbG93ZWRBbGdvcml0aG1zLmpvaW4oJywgJyl9LmApXG4gIH1cblxuICAvKlxuICAgKiBJZ25vcmUgdGhlIG5leHQgYmxvY2sgZnJvbSB0ZXN0IGNvdmVyYWdlIGJlY2F1c2UgaXQgZ2V0cyBleGVjdXRlZFxuICAgKiBjb25kaXRpb25hbGx5IGRlcGVuZGluZyBvbiB0aGUgTm9kZSB2ZXJzaW9uLiBOb3QgaWdub3JpbmcgaXQgd291bGRcbiAgICogcHJldmVudCB1cyBmcm9tIHJlYWNoaW5nIHRoZSB0YXJnZXQgJSBvZiBjb3ZlcmFnZSBmb3IgdmVyc2lvbnMgb2ZcbiAgICogTm9kZSB1bmRlciAxNS43LjAuXG4gICAqL1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoQVNZTU1FVFJJQ19LRVlfREVUQUlMU19TVVBQT1JURUQpIHtcbiAgICBzd2l0Y2ggKGtleVR5cGUpIHtcbiAgICBjYXNlICdlYyc6XG4gICAgICBjb25zdCBrZXlDdXJ2ZSA9IGtleS5hc3ltbWV0cmljS2V5RGV0YWlscy5uYW1lZEN1cnZlO1xuICAgICAgY29uc3QgYWxsb3dlZEN1cnZlID0gYWxsb3dlZEN1cnZlc1thbGdvcml0aG1dO1xuXG4gICAgICBpZiAoa2V5Q3VydmUgIT09IGFsbG93ZWRDdXJ2ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwiYWxnXCIgcGFyYW1ldGVyIFwiJHthbGdvcml0aG19XCIgcmVxdWlyZXMgY3VydmUgXCIke2FsbG93ZWRDdXJ2ZX1cIi5gKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncnNhLXBzcyc6XG4gICAgICBpZiAoUlNBX1BTU19LRVlfREVUQUlMU19TVVBQT1JURUQpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gcGFyc2VJbnQoYWxnb3JpdGhtLnNsaWNlKC0zKSwgMTApO1xuICAgICAgICBjb25zdCB7IGhhc2hBbGdvcml0aG0sIG1nZjFIYXNoQWxnb3JpdGhtLCBzYWx0TGVuZ3RoIH0gPSBrZXkuYXN5bW1ldHJpY0tleURldGFpbHM7XG5cbiAgICAgICAgaWYgKGhhc2hBbGdvcml0aG0gIT09IGBzaGEke2xlbmd0aH1gIHx8IG1nZjFIYXNoQWxnb3JpdGhtICE9PSBoYXNoQWxnb3JpdGhtKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleSBmb3IgdGhpcyBvcGVyYXRpb24sIGl0cyBSU0EtUFNTIHBhcmFtZXRlcnMgZG8gbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBvZiBcImFsZ1wiICR7YWxnb3JpdGhtfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzYWx0TGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgc2FsdExlbmd0aCA+IGxlbmd0aCA+PiAzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleSBmb3IgdGhpcyBvcGVyYXRpb24sIGl0cyBSU0EtUFNTIHBhcmFtZXRlciBzYWx0TGVuZ3RoIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBvZiBcImFsZ1wiICR7YWxnb3JpdGhtfS5gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAidmFyIHNlbXZlciA9IHJlcXVpcmUoJ3NlbXZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbXZlci5zYXRpc2ZpZXMocHJvY2Vzcy52ZXJzaW9uLCAnXjYuMTIuMCB8fCA+PTguMC4wJyk7XG4iLAogICAgImNvbnN0IEpzb25XZWJUb2tlbkVycm9yID0gcmVxdWlyZSgnLi9saWIvSnNvbldlYlRva2VuRXJyb3InKTtcbmNvbnN0IE5vdEJlZm9yZUVycm9yID0gcmVxdWlyZSgnLi9saWIvTm90QmVmb3JlRXJyb3InKTtcbmNvbnN0IFRva2VuRXhwaXJlZEVycm9yID0gcmVxdWlyZSgnLi9saWIvVG9rZW5FeHBpcmVkRXJyb3InKTtcbmNvbnN0IGRlY29kZSA9IHJlcXVpcmUoJy4vZGVjb2RlJyk7XG5jb25zdCB0aW1lc3BhbiA9IHJlcXVpcmUoJy4vbGliL3RpbWVzcGFuJyk7XG5jb25zdCB2YWxpZGF0ZUFzeW1tZXRyaWNLZXkgPSByZXF1aXJlKCcuL2xpYi92YWxpZGF0ZUFzeW1tZXRyaWNLZXknKTtcbmNvbnN0IFBTX1NVUFBPUlRFRCA9IHJlcXVpcmUoJy4vbGliL3BzU3VwcG9ydGVkJyk7XG5jb25zdCBqd3MgPSByZXF1aXJlKCdqd3MnKTtcbmNvbnN0IHtLZXlPYmplY3QsIGNyZWF0ZVNlY3JldEtleSwgY3JlYXRlUHVibGljS2V5fSA9IHJlcXVpcmUoXCJjcnlwdG9cIik7XG5cbmNvbnN0IFBVQl9LRVlfQUxHUyA9IFsnUlMyNTYnLCAnUlMzODQnLCAnUlM1MTInXTtcbmNvbnN0IEVDX0tFWV9BTEdTID0gWydFUzI1NicsICdFUzM4NCcsICdFUzUxMiddO1xuY29uc3QgUlNBX0tFWV9BTEdTID0gWydSUzI1NicsICdSUzM4NCcsICdSUzUxMiddO1xuY29uc3QgSFNfQUxHUyA9IFsnSFMyNTYnLCAnSFMzODQnLCAnSFM1MTInXTtcblxuaWYgKFBTX1NVUFBPUlRFRCkge1xuICBQVUJfS0VZX0FMR1Muc3BsaWNlKFBVQl9LRVlfQUxHUy5sZW5ndGgsIDAsICdQUzI1NicsICdQUzM4NCcsICdQUzUxMicpO1xuICBSU0FfS0VZX0FMR1Muc3BsaWNlKFJTQV9LRVlfQUxHUy5sZW5ndGgsIDAsICdQUzI1NicsICdQUzM4NCcsICdQUzUxMicpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChqd3RTdHJpbmcsIHNlY3JldE9yUHVibGljS2V5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZiAoKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSAmJiAhY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgLy9jbG9uZSB0aGlzIG9iamVjdCBzaW5jZSB3ZSBhcmUgZ29pbmcgdG8gbXV0YXRlIGl0LlxuICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG5cbiAgbGV0IGRvbmU7XG5cbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgZG9uZSA9IGNhbGxiYWNrO1xuICB9IGVsc2Uge1xuICAgIGRvbmUgPSBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHRocm93IGVycjtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH07XG4gIH1cblxuICBpZiAob3B0aW9ucy5jbG9ja1RpbWVzdGFtcCAmJiB0eXBlb2Ygb3B0aW9ucy5jbG9ja1RpbWVzdGFtcCAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2Nsb2NrVGltZXN0YW1wIG11c3QgYmUgYSBudW1iZXInKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5ub25jZSAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2Ygb3B0aW9ucy5ub25jZSAhPT0gJ3N0cmluZycgfHwgb3B0aW9ucy5ub25jZS50cmltKCkgPT09ICcnKSkge1xuICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignbm9uY2UgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5hbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5hbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXMgIT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignYWxsb3dJbnZhbGlkQXN5bW1ldHJpY0tleVR5cGVzIG11c3QgYmUgYSBib29sZWFuJykpO1xuICB9XG5cbiAgY29uc3QgY2xvY2tUaW1lc3RhbXAgPSBvcHRpb25zLmNsb2NrVGltZXN0YW1wIHx8IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuXG4gIGlmICghand0U3RyaW5nKXtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBtdXN0IGJlIHByb3ZpZGVkJykpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBqd3RTdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3QgbXVzdCBiZSBhIHN0cmluZycpKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gand0U3RyaW5nLnNwbGl0KCcuJyk7XG5cbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMyl7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3QgbWFsZm9ybWVkJykpO1xuICB9XG5cbiAgbGV0IGRlY29kZWRUb2tlbjtcblxuICB0cnkge1xuICAgIGRlY29kZWRUb2tlbiA9IGRlY29kZShqd3RTdHJpbmcsIHsgY29tcGxldGU6IHRydWUgfSk7XG4gIH0gY2F0Y2goZXJyKSB7XG4gICAgcmV0dXJuIGRvbmUoZXJyKTtcbiAgfVxuXG4gIGlmICghZGVjb2RlZFRva2VuKSB7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpbnZhbGlkIHRva2VuJykpO1xuICB9XG5cbiAgY29uc3QgaGVhZGVyID0gZGVjb2RlZFRva2VuLmhlYWRlcjtcbiAgbGV0IGdldFNlY3JldDtcblxuICBpZih0eXBlb2Ygc2VjcmV0T3JQdWJsaWNLZXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZighY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcigndmVyaWZ5IG11c3QgYmUgY2FsbGVkIGFzeW5jaHJvbm91cyBpZiBzZWNyZXQgb3IgcHVibGljIGtleSBpcyBwcm92aWRlZCBhcyBhIGNhbGxiYWNrJykpO1xuICAgIH1cblxuICAgIGdldFNlY3JldCA9IHNlY3JldE9yUHVibGljS2V5O1xuICB9XG4gIGVsc2Uge1xuICAgIGdldFNlY3JldCA9IGZ1bmN0aW9uKGhlYWRlciwgc2VjcmV0Q2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBzZWNyZXRDYWxsYmFjayhudWxsLCBzZWNyZXRPclB1YmxpY0tleSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBnZXRTZWNyZXQoaGVhZGVyLCBmdW5jdGlvbihlcnIsIHNlY3JldE9yUHVibGljS2V5KSB7XG4gICAgaWYoZXJyKSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2Vycm9yIGluIHNlY3JldCBvciBwdWJsaWMga2V5IGNhbGxiYWNrOiAnICsgZXJyLm1lc3NhZ2UpKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNTaWduYXR1cmUgPSBwYXJ0c1syXS50cmltKCkgIT09ICcnO1xuXG4gICAgaWYgKCFoYXNTaWduYXR1cmUgJiYgc2VjcmV0T3JQdWJsaWNLZXkpe1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3Qgc2lnbmF0dXJlIGlzIHJlcXVpcmVkJykpO1xuICAgIH1cblxuICAgIGlmIChoYXNTaWduYXR1cmUgJiYgIXNlY3JldE9yUHVibGljS2V5KSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ3NlY3JldCBvciBwdWJsaWMga2V5IG11c3QgYmUgcHJvdmlkZWQnKSk7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNTaWduYXR1cmUgJiYgIW9wdGlvbnMuYWxnb3JpdGhtcykge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdwbGVhc2Ugc3BlY2lmeSBcIm5vbmVcIiBpbiBcImFsZ29yaXRobXNcIiB0byB2ZXJpZnkgdW5zaWduZWQgdG9rZW5zJykpO1xuICAgIH1cblxuICAgIGlmIChzZWNyZXRPclB1YmxpY0tleSAhPSBudWxsICYmICEoc2VjcmV0T3JQdWJsaWNLZXkgaW5zdGFuY2VvZiBLZXlPYmplY3QpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZWNyZXRPclB1YmxpY0tleSA9IGNyZWF0ZVB1YmxpY0tleShzZWNyZXRPclB1YmxpY0tleSk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2VjcmV0T3JQdWJsaWNLZXkgPSBjcmVhdGVTZWNyZXRLZXkodHlwZW9mIHNlY3JldE9yUHVibGljS2V5ID09PSAnc3RyaW5nJyA/IEJ1ZmZlci5mcm9tKHNlY3JldE9yUHVibGljS2V5KSA6IHNlY3JldE9yUHVibGljS2V5KTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignc2VjcmV0T3JQdWJsaWNLZXkgaXMgbm90IHZhbGlkIGtleSBtYXRlcmlhbCcpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmFsZ29yaXRobXMpIHtcbiAgICAgIGlmIChzZWNyZXRPclB1YmxpY0tleS50eXBlID09PSAnc2VjcmV0Jykge1xuICAgICAgICBvcHRpb25zLmFsZ29yaXRobXMgPSBIU19BTEdTO1xuICAgICAgfSBlbHNlIGlmIChbJ3JzYScsICdyc2EtcHNzJ10uaW5jbHVkZXMoc2VjcmV0T3JQdWJsaWNLZXkuYXN5bW1ldHJpY0tleVR5cGUpKSB7XG4gICAgICAgIG9wdGlvbnMuYWxnb3JpdGhtcyA9IFJTQV9LRVlfQUxHU1xuICAgICAgfSBlbHNlIGlmIChzZWNyZXRPclB1YmxpY0tleS5hc3ltbWV0cmljS2V5VHlwZSA9PT0gJ2VjJykge1xuICAgICAgICBvcHRpb25zLmFsZ29yaXRobXMgPSBFQ19LRVlfQUxHU1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy5hbGdvcml0aG1zID0gUFVCX0tFWV9BTEdTXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYWxnb3JpdGhtcy5pbmRleE9mKGRlY29kZWRUb2tlbi5oZWFkZXIuYWxnKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignaW52YWxpZCBhbGdvcml0aG0nKSk7XG4gICAgfVxuXG4gICAgaWYgKGhlYWRlci5hbGcuc3RhcnRzV2l0aCgnSFMnKSAmJiBzZWNyZXRPclB1YmxpY0tleS50eXBlICE9PSAnc2VjcmV0Jykge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKChgc2VjcmV0T3JQdWJsaWNLZXkgbXVzdCBiZSBhIHN5bW1ldHJpYyBrZXkgd2hlbiB1c2luZyAke2hlYWRlci5hbGd9YCkpKVxuICAgIH0gZWxzZSBpZiAoL14oPzpSU3xQU3xFUykvLnRlc3QoaGVhZGVyLmFsZykgJiYgc2VjcmV0T3JQdWJsaWNLZXkudHlwZSAhPT0gJ3B1YmxpYycpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcigoYHNlY3JldE9yUHVibGljS2V5IG11c3QgYmUgYW4gYXN5bW1ldHJpYyBrZXkgd2hlbiB1c2luZyAke2hlYWRlci5hbGd9YCkpKVxuICAgIH1cblxuICAgIGlmICghb3B0aW9ucy5hbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbGlkYXRlQXN5bW1ldHJpY0tleShoZWFkZXIuYWxnLCBzZWNyZXRPclB1YmxpY0tleSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBkb25lKGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCB2YWxpZDtcblxuICAgIHRyeSB7XG4gICAgICB2YWxpZCA9IGp3cy52ZXJpZnkoand0U3RyaW5nLCBkZWNvZGVkVG9rZW4uaGVhZGVyLmFsZywgc2VjcmV0T3JQdWJsaWNLZXkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBkb25lKGUpO1xuICAgIH1cblxuICAgIGlmICghdmFsaWQpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignaW52YWxpZCBzaWduYXR1cmUnKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZCA9IGRlY29kZWRUb2tlbi5wYXlsb2FkO1xuXG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkLm5iZiAhPT0gJ3VuZGVmaW5lZCcgJiYgIW9wdGlvbnMuaWdub3JlTm90QmVmb3JlKSB7XG4gICAgICBpZiAodHlwZW9mIHBheWxvYWQubmJmICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2ludmFsaWQgbmJmIHZhbHVlJykpO1xuICAgICAgfVxuICAgICAgaWYgKHBheWxvYWQubmJmID4gY2xvY2tUaW1lc3RhbXAgKyAob3B0aW9ucy5jbG9ja1RvbGVyYW5jZSB8fCAwKSkge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgTm90QmVmb3JlRXJyb3IoJ2p3dCBub3QgYWN0aXZlJywgbmV3IERhdGUocGF5bG9hZC5uYmYgKiAxMDAwKSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcGF5bG9hZC5leHAgIT09ICd1bmRlZmluZWQnICYmICFvcHRpb25zLmlnbm9yZUV4cGlyYXRpb24pIHtcbiAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC5leHAgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignaW52YWxpZCBleHAgdmFsdWUnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY2xvY2tUaW1lc3RhbXAgPj0gcGF5bG9hZC5leHAgKyAob3B0aW9ucy5jbG9ja1RvbGVyYW5jZSB8fCAwKSkge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgVG9rZW5FeHBpcmVkRXJyb3IoJ2p3dCBleHBpcmVkJywgbmV3IERhdGUocGF5bG9hZC5leHAgKiAxMDAwKSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmF1ZGllbmNlKSB7XG4gICAgICBjb25zdCBhdWRpZW5jZXMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuYXVkaWVuY2UpID8gb3B0aW9ucy5hdWRpZW5jZSA6IFtvcHRpb25zLmF1ZGllbmNlXTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IEFycmF5LmlzQXJyYXkocGF5bG9hZC5hdWQpID8gcGF5bG9hZC5hdWQgOiBbcGF5bG9hZC5hdWRdO1xuXG4gICAgICBjb25zdCBtYXRjaCA9IHRhcmdldC5zb21lKGZ1bmN0aW9uICh0YXJnZXRBdWRpZW5jZSkge1xuICAgICAgICByZXR1cm4gYXVkaWVuY2VzLnNvbWUoZnVuY3Rpb24gKGF1ZGllbmNlKSB7XG4gICAgICAgICAgcmV0dXJuIGF1ZGllbmNlIGluc3RhbmNlb2YgUmVnRXhwID8gYXVkaWVuY2UudGVzdCh0YXJnZXRBdWRpZW5jZSkgOiBhdWRpZW5jZSA9PT0gdGFyZ2V0QXVkaWVuY2U7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3QgYXVkaWVuY2UgaW52YWxpZC4gZXhwZWN0ZWQ6ICcgKyBhdWRpZW5jZXMuam9pbignIG9yICcpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaXNzdWVyKSB7XG4gICAgICBjb25zdCBpbnZhbGlkX2lzc3VlciA9XG4gICAgICAgICAgICAgICh0eXBlb2Ygb3B0aW9ucy5pc3N1ZXIgPT09ICdzdHJpbmcnICYmIHBheWxvYWQuaXNzICE9PSBvcHRpb25zLmlzc3VlcikgfHxcbiAgICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5pc3N1ZXIpICYmIG9wdGlvbnMuaXNzdWVyLmluZGV4T2YocGF5bG9hZC5pc3MpID09PSAtMSk7XG5cbiAgICAgIGlmIChpbnZhbGlkX2lzc3Vlcikge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBpc3N1ZXIgaW52YWxpZC4gZXhwZWN0ZWQ6ICcgKyBvcHRpb25zLmlzc3VlcikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnN1YmplY3QpIHtcbiAgICAgIGlmIChwYXlsb2FkLnN1YiAhPT0gb3B0aW9ucy5zdWJqZWN0KSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IHN1YmplY3QgaW52YWxpZC4gZXhwZWN0ZWQ6ICcgKyBvcHRpb25zLnN1YmplY3QpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5qd3RpZCkge1xuICAgICAgaWYgKHBheWxvYWQuanRpICE9PSBvcHRpb25zLmp3dGlkKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IGp3dGlkIGludmFsaWQuIGV4cGVjdGVkOiAnICsgb3B0aW9ucy5qd3RpZCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm5vbmNlKSB7XG4gICAgICBpZiAocGF5bG9hZC5ub25jZSAhPT0gb3B0aW9ucy5ub25jZSkge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBub25jZSBpbnZhbGlkLiBleHBlY3RlZDogJyArIG9wdGlvbnMubm9uY2UpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5tYXhBZ2UpIHtcbiAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC5pYXQgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignaWF0IHJlcXVpcmVkIHdoZW4gbWF4QWdlIGlzIHNwZWNpZmllZCcpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF4QWdlVGltZXN0YW1wID0gdGltZXNwYW4ob3B0aW9ucy5tYXhBZ2UsIHBheWxvYWQuaWF0KTtcbiAgICAgIGlmICh0eXBlb2YgbWF4QWdlVGltZXN0YW1wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ1wibWF4QWdlXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMgb3Igc3RyaW5nIHJlcHJlc2VudGluZyBhIHRpbWVzcGFuIGVnOiBcIjFkXCIsIFwiMjBoXCIsIDYwJykpO1xuICAgICAgfVxuICAgICAgaWYgKGNsb2NrVGltZXN0YW1wID49IG1heEFnZVRpbWVzdGFtcCArIChvcHRpb25zLmNsb2NrVG9sZXJhbmNlIHx8IDApKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBUb2tlbkV4cGlyZWRFcnJvcignbWF4QWdlIGV4Y2VlZGVkJywgbmV3IERhdGUobWF4QWdlVGltZXN0YW1wICogMTAwMCkpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5jb21wbGV0ZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZGVjb2RlZFRva2VuLnNpZ25hdHVyZTtcblxuICAgICAgcmV0dXJuIGRvbmUobnVsbCwge1xuICAgICAgICBoZWFkZXI6IGhlYWRlcixcbiAgICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgICAgc2lnbmF0dXJlOiBzaWduYXR1cmVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkb25lKG51bGwsIHBheWxvYWQpO1xuICB9KTtcbn07XG4iLAogICAgIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxLFxuICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgsXG4gICAgTkFOID0gMCAvIDA7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW0gPSAvXlxccyt8XFxzKyQvZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tYXBgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICogc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4LCBmcm9tUmlnaHQpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIGlmICh2YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBmcm9tSW5kZXgpO1xuICB9XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYU5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbnVtYmVyIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICogb2YgYHByb3BzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KSxcbiAgICBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gIC8vIFNhZmFyaSA4LjEgbWFrZXMgYGFyZ3VtZW50cy5jYWxsZWVgIGVudW1lcmFibGUgaW4gc3RyaWN0IG1vZGUuXG4gIC8vIFNhZmFyaSA5IG1ha2VzIGBhcmd1bWVudHMubGVuZ3RoYCBlbnVtZXJhYmxlIGluIHN0cmljdCBtb2RlLlxuICB2YXIgcmVzdWx0ID0gKGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSlcbiAgICA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZylcbiAgICA6IFtdO1xuXG4gIHZhciBsZW5ndGggPSByZXN1bHQubGVuZ3RoLFxuICAgICAgc2tpcEluZGV4ZXMgPSAhIWxlbmd0aDtcblxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAhKHNraXBJbmRleGVzICYmIChrZXkgPT0gJ2xlbmd0aCcgfHwgaXNJbmRleChrZXksIGxlbmd0aCkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICBpZiAoIWlzUHJvdG90eXBlKG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG4gIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgfHwgcmVJc1VpbnQudGVzdCh2YWx1ZSkpICYmXG4gICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xuXG4gIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gYGNvbGxlY3Rpb25gLiBJZiBgY29sbGVjdGlvbmAgaXMgYSBzdHJpbmcsIGl0J3NcbiAqIGNoZWNrZWQgZm9yIGEgc3Vic3RyaW5nIG9mIGB2YWx1ZWAsIG90aGVyd2lzZVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGlzIHVzZWQgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQncyB1c2VkIGFzXG4gKiB0aGUgb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgY29sbGVjdGlvbmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLnJlZHVjZWAuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pbmNsdWRlcyhbMSwgMiwgM10sIDEsIDIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmluY2x1ZGVzKHsgJ2EnOiAxLCAnYic6IDIgfSwgMSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pbmNsdWRlcygnYWJjZCcsICdiYycpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpbmNsdWRlcyhjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4LCBndWFyZCkge1xuICBjb2xsZWN0aW9uID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uIDogdmFsdWVzKGNvbGxlY3Rpb24pO1xuICBmcm9tSW5kZXggPSAoZnJvbUluZGV4ICYmICFndWFyZCkgPyB0b0ludGVnZXIoZnJvbUluZGV4KSA6IDA7XG5cbiAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBmcm9tSW5kZXgsIDApO1xuICB9XG4gIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKVxuICAgID8gKGZyb21JbmRleCA8PSBsZW5ndGggJiYgY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpXG4gICAgOiAoISFsZW5ndGggJiYgYmFzZUluZGV4T2YoY29sbGVjdGlvbiwgdmFsdWUsIGZyb21JbmRleCkgPiAtMSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG4gIC8vIFNhZmFyaSA4LjEgbWFrZXMgYGFyZ3VtZW50cy5jYWxsZWVgIGVudW1lcmFibGUgaW4gc3RyaWN0IG1vZGUuXG4gIHJldHVybiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgKCFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgfHwgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gYXJnc1RhZyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gKiBpcyBhbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDgtOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheSBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gaXNPYmplY3QodmFsdWUpID8gb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTdHJpbmdgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzdHJpbmcsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N0cmluZygnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N0cmluZygxKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAoIWlzQXJyYXkodmFsdWUpICYmIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3RyaW5nVGFnKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8ua2V5cygnaGknKTtcbiAqIC8vID0+IFsnMCcsICcxJ11cbiAqL1xuZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8udmFsdWVzKG5ldyBGb28pO1xuICogLy8gPT4gWzEsIDJdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy52YWx1ZXMoJ2hpJyk7XG4gKiAvLyA9PiBbJ2gnLCAnaSddXG4gKi9cbmZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCA/IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzKG9iamVjdCkpIDogW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5jbHVkZXM7XG4iLAogICAgIi8qKlxuICogbG9kYXNoIDMuMC4zIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgMjAxMi0yMDE2IFRoZSBEb2pvIEZvdW5kYXRpb24gPGh0dHA6Ly9kb2pvZm91bmRhdGlvbi5vcmcvPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCAyMDA5LTIwMTYgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqIEF2YWlsYWJsZSB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKi9cblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZSBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGJvb2xlYW4gcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Jvb2xlYW4oZmFsc2UpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNCb29sZWFuKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2UgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBib29sVGFnKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQm9vbGVhbjtcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gKiBbYE51bWJlci5pc0ludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNJbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBpbnRlZ2VyLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNJbnRlZ2VyKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzSW50ZWdlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNJbnRlZ2VyKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSA9PSB0b0ludGVnZXIodmFsdWUpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIGZpbml0ZSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEyLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0Zpbml0ZSgzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9GaW5pdGUoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvRmluaXRlKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b0Zpbml0ZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiAwO1xuICB9XG4gIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICBpZiAodmFsdWUgPT09IElORklOSVRZIHx8IHZhbHVlID09PSAtSU5GSU5JVFkpIHtcbiAgICB2YXIgc2lnbiA9ICh2YWx1ZSA8IDAgPyAtMSA6IDEpO1xuICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gIH1cbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/IHZhbHVlIDogMDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvaW50ZWdlcikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0ludGVnZXIoMy4yKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDBcbiAqXG4gKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICByZW1haW5kZXIgPSByZXN1bHQgJSAxO1xuXG4gIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzSW50ZWdlcjtcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggMy4wLjMgKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCAyMDEyLTIwMTYgVGhlIERvam8gRm91bmRhdGlvbiA8aHR0cDovL2Rvam9mb3VuZGF0aW9uLm9yZy8+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IDIwMDktMjAxNiBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICogQXZhaWxhYmxlIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqL1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZSBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE51bWJlcmAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiAqKk5vdGU6KiogVG8gZXhjbHVkZSBgSW5maW5pdHlgLCBgLUluZmluaXR5YCwgYW5kIGBOYU5gLCB3aGljaCBhcmUgY2xhc3NpZmllZFxuICogYXMgbnVtYmVycywgdXNlIHRoZSBgXy5pc0Zpbml0ZWAgbWV0aG9kLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTnVtYmVyKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNOdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcignMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IG51bWJlclRhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNOdW1iZXI7XG4iLAogICAgIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBob3N0IG9iamVjdCBpbiBJRSA8IDkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBob3N0IG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0hvc3RPYmplY3QodmFsdWUpIHtcbiAgLy8gTWFueSBob3N0IG9iamVjdHMgYXJlIGBPYmplY3RgIG9iamVjdHMgdGhhdCBjYW4gY29lcmNlIHRvIHN0cmluZ3NcbiAgLy8gZGVzcGl0ZSBoYXZpbmcgaW1wcm9wZXJseSBkZWZpbmVkIGB0b1N0cmluZ2AgbWV0aG9kcy5cbiAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuICBpZiAodmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSAhISh2YWx1ZSArICcnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICB9O1xufVxuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xudmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGVcbiAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuOC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiB9XG4gKlxuICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fFxuICAgICAgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgIT0gb2JqZWN0VGFnIHx8IGlzSG9zdE9iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIEN0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCAnY29uc3RydWN0b3InKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgcmV0dXJuICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmXG4gICAgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiYgZnVuY1RvU3RyaW5nLmNhbGwoQ3RvcikgPT0gb2JqZWN0Q3RvclN0cmluZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQbGFpbk9iamVjdDtcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggNC4wLjEgKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCAyMDEyLTIwMTYgVGhlIERvam8gRm91bmRhdGlvbiA8aHR0cDovL2Rvam9mb3VuZGF0aW9uLm9yZy8+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IDIwMDktMjAxNiBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICogQXZhaWxhYmxlIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqL1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZSBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHR5cGUgRnVuY3Rpb25cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N0cmluZygnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N0cmluZygxKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAoIWlzQXJyYXkodmFsdWUpICYmIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3RyaW5nVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N0cmluZztcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHRoZSBgVHlwZUVycm9yYCBtZXNzYWdlIGZvciBcIkZ1bmN0aW9uc1wiIG1ldGhvZHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgIE1BWF9JTlRFR0VSID0gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgsXG4gICAgTkFOID0gMCAvIDA7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW0gPSAvXlxccyt8XFxzKyQvZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCwgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50c1xuICogb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoaWxlIGl0J3MgY2FsbGVkIGxlc3MgdGhhbiBgbmAgdGltZXMuIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBjYWxscyBhdCB3aGljaCBgZnVuY2AgaXMgbm8gbG9uZ2VyIGludm9rZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmJlZm9yZSg1LCBhZGRDb250YWN0VG9MaXN0KSk7XG4gKiAvLyA9PiBBbGxvd3MgYWRkaW5nIHVwIHRvIDQgY29udGFjdHMgdG8gdGhlIGxpc3QuXG4gKi9cbmZ1bmN0aW9uIGJlZm9yZShuLCBmdW5jKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIG4gPSB0b0ludGVnZXIobik7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpZiAoLS1uID4gMCkge1xuICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgICBpZiAobiA8PSAxKSB7XG4gICAgICBmdW5jID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIHJlc3RyaWN0ZWQgdG8gaW52b2tpbmcgYGZ1bmNgIG9uY2UuIFJlcGVhdCBjYWxsc1xuICogdG8gdGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludm9jYXRpb24uIFRoZSBgZnVuY2AgaXNcbiAqIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIGluaXRpYWxpemUgPSBfLm9uY2UoY3JlYXRlQXBwbGljYXRpb24pO1xuICogaW5pdGlhbGl6ZSgpO1xuICogaW5pdGlhbGl6ZSgpO1xuICogLy8gPT4gYGNyZWF0ZUFwcGxpY2F0aW9uYCBpcyBpbnZva2VkIG9uY2VcbiAqL1xuZnVuY3Rpb24gb25jZShmdW5jKSB7XG4gIHJldHVybiBiZWZvcmUoMiwgZnVuYyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb25jZTtcbiIsCiAgICAiY29uc3QgdGltZXNwYW4gPSByZXF1aXJlKCcuL2xpYi90aW1lc3BhbicpO1xuY29uc3QgUFNfU1VQUE9SVEVEID0gcmVxdWlyZSgnLi9saWIvcHNTdXBwb3J0ZWQnKTtcbmNvbnN0IHZhbGlkYXRlQXN5bW1ldHJpY0tleSA9IHJlcXVpcmUoJy4vbGliL3ZhbGlkYXRlQXN5bW1ldHJpY0tleScpO1xuY29uc3QgandzID0gcmVxdWlyZSgnandzJyk7XG5jb25zdCBpbmNsdWRlcyA9IHJlcXVpcmUoJ2xvZGFzaC5pbmNsdWRlcycpO1xuY29uc3QgaXNCb29sZWFuID0gcmVxdWlyZSgnbG9kYXNoLmlzYm9vbGVhbicpO1xuY29uc3QgaXNJbnRlZ2VyID0gcmVxdWlyZSgnbG9kYXNoLmlzaW50ZWdlcicpO1xuY29uc3QgaXNOdW1iZXIgPSByZXF1aXJlKCdsb2Rhc2guaXNudW1iZXInKTtcbmNvbnN0IGlzUGxhaW5PYmplY3QgPSByZXF1aXJlKCdsb2Rhc2guaXNwbGFpbm9iamVjdCcpO1xuY29uc3QgaXNTdHJpbmcgPSByZXF1aXJlKCdsb2Rhc2guaXNzdHJpbmcnKTtcbmNvbnN0IG9uY2UgPSByZXF1aXJlKCdsb2Rhc2gub25jZScpO1xuY29uc3QgeyBLZXlPYmplY3QsIGNyZWF0ZVNlY3JldEtleSwgY3JlYXRlUHJpdmF0ZUtleSB9ID0gcmVxdWlyZSgnY3J5cHRvJylcblxuY29uc3QgU1VQUE9SVEVEX0FMR1MgPSBbJ1JTMjU2JywgJ1JTMzg0JywgJ1JTNTEyJywgJ0VTMjU2JywgJ0VTMzg0JywgJ0VTNTEyJywgJ0hTMjU2JywgJ0hTMzg0JywgJ0hTNTEyJywgJ25vbmUnXTtcbmlmIChQU19TVVBQT1JURUQpIHtcbiAgU1VQUE9SVEVEX0FMR1Muc3BsaWNlKDMsIDAsICdQUzI1NicsICdQUzM4NCcsICdQUzUxMicpO1xufVxuXG5jb25zdCBzaWduX29wdGlvbnNfc2NoZW1hID0ge1xuICBleHBpcmVzSW46IHsgaXNWYWxpZDogZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIGlzSW50ZWdlcih2YWx1ZSkgfHwgKGlzU3RyaW5nKHZhbHVlKSAmJiB2YWx1ZSk7IH0sIG1lc3NhZ2U6ICdcImV4cGlyZXNJblwiIHNob3VsZCBiZSBhIG51bWJlciBvZiBzZWNvbmRzIG9yIHN0cmluZyByZXByZXNlbnRpbmcgYSB0aW1lc3BhbicgfSxcbiAgbm90QmVmb3JlOiB7IGlzVmFsaWQ6IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiBpc0ludGVnZXIodmFsdWUpIHx8IChpc1N0cmluZyh2YWx1ZSkgJiYgdmFsdWUpOyB9LCBtZXNzYWdlOiAnXCJub3RCZWZvcmVcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcyBvciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgdGltZXNwYW4nIH0sXG4gIGF1ZGllbmNlOiB7IGlzVmFsaWQ6IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiBpc1N0cmluZyh2YWx1ZSkgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSk7IH0sIG1lc3NhZ2U6ICdcImF1ZGllbmNlXCIgbXVzdCBiZSBhIHN0cmluZyBvciBhcnJheScgfSxcbiAgYWxnb3JpdGhtOiB7IGlzVmFsaWQ6IGluY2x1ZGVzLmJpbmQobnVsbCwgU1VQUE9SVEVEX0FMR1MpLCBtZXNzYWdlOiAnXCJhbGdvcml0aG1cIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVudW0gdmFsdWUnIH0sXG4gIGhlYWRlcjogeyBpc1ZhbGlkOiBpc1BsYWluT2JqZWN0LCBtZXNzYWdlOiAnXCJoZWFkZXJcIiBtdXN0IGJlIGFuIG9iamVjdCcgfSxcbiAgZW5jb2Rpbmc6IHsgaXNWYWxpZDogaXNTdHJpbmcsIG1lc3NhZ2U6ICdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHN0cmluZycgfSxcbiAgaXNzdWVyOiB7IGlzVmFsaWQ6IGlzU3RyaW5nLCBtZXNzYWdlOiAnXCJpc3N1ZXJcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBzdWJqZWN0OiB7IGlzVmFsaWQ6IGlzU3RyaW5nLCBtZXNzYWdlOiAnXCJzdWJqZWN0XCIgbXVzdCBiZSBhIHN0cmluZycgfSxcbiAgand0aWQ6IHsgaXNWYWxpZDogaXNTdHJpbmcsIG1lc3NhZ2U6ICdcImp3dGlkXCIgbXVzdCBiZSBhIHN0cmluZycgfSxcbiAgbm9UaW1lc3RhbXA6IHsgaXNWYWxpZDogaXNCb29sZWFuLCBtZXNzYWdlOiAnXCJub1RpbWVzdGFtcFwiIG11c3QgYmUgYSBib29sZWFuJyB9LFxuICBrZXlpZDogeyBpc1ZhbGlkOiBpc1N0cmluZywgbWVzc2FnZTogJ1wia2V5aWRcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBtdXRhdGVQYXlsb2FkOiB7IGlzVmFsaWQ6IGlzQm9vbGVhbiwgbWVzc2FnZTogJ1wibXV0YXRlUGF5bG9hZFwiIG11c3QgYmUgYSBib29sZWFuJyB9LFxuICBhbGxvd0luc2VjdXJlS2V5U2l6ZXM6IHsgaXNWYWxpZDogaXNCb29sZWFuLCBtZXNzYWdlOiAnXCJhbGxvd0luc2VjdXJlS2V5U2l6ZXNcIiBtdXN0IGJlIGEgYm9vbGVhbid9LFxuICBhbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXM6IHsgaXNWYWxpZDogaXNCb29sZWFuLCBtZXNzYWdlOiAnXCJhbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXNcIiBtdXN0IGJlIGEgYm9vbGVhbid9XG59O1xuXG5jb25zdCByZWdpc3RlcmVkX2NsYWltc19zY2hlbWEgPSB7XG4gIGlhdDogeyBpc1ZhbGlkOiBpc051bWJlciwgbWVzc2FnZTogJ1wiaWF0XCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMnIH0sXG4gIGV4cDogeyBpc1ZhbGlkOiBpc051bWJlciwgbWVzc2FnZTogJ1wiZXhwXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMnIH0sXG4gIG5iZjogeyBpc1ZhbGlkOiBpc051bWJlciwgbWVzc2FnZTogJ1wibmJmXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMnIH1cbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlKHNjaGVtYSwgYWxsb3dVbmtub3duLCBvYmplY3QsIHBhcmFtZXRlck5hbWUpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KG9iamVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIFwiJyArIHBhcmFtZXRlck5hbWUgKyAnXCIgdG8gYmUgYSBwbGFpbiBvYmplY3QuJyk7XG4gIH1cbiAgT2JqZWN0LmtleXMob2JqZWN0KVxuICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gc2NoZW1hW2tleV07XG4gICAgICBpZiAoIXZhbGlkYXRvcikge1xuICAgICAgICBpZiAoIWFsbG93VW5rbm93bikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsga2V5ICsgJ1wiIGlzIG5vdCBhbGxvd2VkIGluIFwiJyArIHBhcmFtZXRlck5hbWUgKyAnXCInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXZhbGlkYXRvci5pc1ZhbGlkKG9iamVjdFtrZXldKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodmFsaWRhdG9yLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucykge1xuICByZXR1cm4gdmFsaWRhdGUoc2lnbl9vcHRpb25zX3NjaGVtYSwgZmFsc2UsIG9wdGlvbnMsICdvcHRpb25zJyk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUGF5bG9hZChwYXlsb2FkKSB7XG4gIHJldHVybiB2YWxpZGF0ZShyZWdpc3RlcmVkX2NsYWltc19zY2hlbWEsIHRydWUsIHBheWxvYWQsICdwYXlsb2FkJyk7XG59XG5cbmNvbnN0IG9wdGlvbnNfdG9fcGF5bG9hZCA9IHtcbiAgJ2F1ZGllbmNlJzogJ2F1ZCcsXG4gICdpc3N1ZXInOiAnaXNzJyxcbiAgJ3N1YmplY3QnOiAnc3ViJyxcbiAgJ2p3dGlkJzogJ2p0aSdcbn07XG5cbmNvbnN0IG9wdGlvbnNfZm9yX29iamVjdHMgPSBbXG4gICdleHBpcmVzSW4nLFxuICAnbm90QmVmb3JlJyxcbiAgJ25vVGltZXN0YW1wJyxcbiAgJ2F1ZGllbmNlJyxcbiAgJ2lzc3VlcicsXG4gICdzdWJqZWN0JyxcbiAgJ2p3dGlkJyxcbl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHBheWxvYWQsIHNlY3JldE9yUHJpdmF0ZUtleSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgfVxuXG4gIGNvbnN0IGlzT2JqZWN0UGF5bG9hZCA9IHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIUJ1ZmZlci5pc0J1ZmZlcihwYXlsb2FkKTtcblxuICBjb25zdCBoZWFkZXIgPSBPYmplY3QuYXNzaWduKHtcbiAgICBhbGc6IG9wdGlvbnMuYWxnb3JpdGhtIHx8ICdIUzI1NicsXG4gICAgdHlwOiBpc09iamVjdFBheWxvYWQgPyAnSldUJyA6IHVuZGVmaW5lZCxcbiAgICBraWQ6IG9wdGlvbnMua2V5aWRcbiAgfSwgb3B0aW9ucy5oZWFkZXIpO1xuXG4gIGZ1bmN0aW9uIGZhaWx1cmUoZXJyKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgaWYgKCFzZWNyZXRPclByaXZhdGVLZXkgJiYgb3B0aW9ucy5hbGdvcml0aG0gIT09ICdub25lJykge1xuICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignc2VjcmV0T3JQcml2YXRlS2V5IG11c3QgaGF2ZSBhIHZhbHVlJykpO1xuICB9XG5cbiAgaWYgKHNlY3JldE9yUHJpdmF0ZUtleSAhPSBudWxsICYmICEoc2VjcmV0T3JQcml2YXRlS2V5IGluc3RhbmNlb2YgS2V5T2JqZWN0KSkge1xuICAgIHRyeSB7XG4gICAgICBzZWNyZXRPclByaXZhdGVLZXkgPSBjcmVhdGVQcml2YXRlS2V5KHNlY3JldE9yUHJpdmF0ZUtleSlcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZWNyZXRPclByaXZhdGVLZXkgPSBjcmVhdGVTZWNyZXRLZXkodHlwZW9mIHNlY3JldE9yUHJpdmF0ZUtleSA9PT0gJ3N0cmluZycgPyBCdWZmZXIuZnJvbShzZWNyZXRPclByaXZhdGVLZXkpIDogc2VjcmV0T3JQcml2YXRlS2V5KVxuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ3NlY3JldE9yUHJpdmF0ZUtleSBpcyBub3QgdmFsaWQga2V5IG1hdGVyaWFsJykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChoZWFkZXIuYWxnLnN0YXJ0c1dpdGgoJ0hTJykgJiYgc2VjcmV0T3JQcml2YXRlS2V5LnR5cGUgIT09ICdzZWNyZXQnKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKChgc2VjcmV0T3JQcml2YXRlS2V5IG11c3QgYmUgYSBzeW1tZXRyaWMga2V5IHdoZW4gdXNpbmcgJHtoZWFkZXIuYWxnfWApKSlcbiAgfSBlbHNlIGlmICgvXig/OlJTfFBTfEVTKS8udGVzdChoZWFkZXIuYWxnKSkge1xuICAgIGlmIChzZWNyZXRPclByaXZhdGVLZXkudHlwZSAhPT0gJ3ByaXZhdGUnKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoKGBzZWNyZXRPclByaXZhdGVLZXkgbXVzdCBiZSBhbiBhc3ltbWV0cmljIGtleSB3aGVuIHVzaW5nICR7aGVhZGVyLmFsZ31gKSkpXG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5hbGxvd0luc2VjdXJlS2V5U2l6ZXMgJiZcbiAgICAgICFoZWFkZXIuYWxnLnN0YXJ0c1dpdGgoJ0VTJykgJiZcbiAgICAgIHNlY3JldE9yUHJpdmF0ZUtleS5hc3ltbWV0cmljS2V5RGV0YWlscyAhPT0gdW5kZWZpbmVkICYmIC8vS2V5T2JqZWN0LmFzeW1tZXRyaWNLZXlEZXRhaWxzIGlzIHN1cHBvcnRlZCBpbiBOb2RlIDE1K1xuICAgICAgc2VjcmV0T3JQcml2YXRlS2V5LmFzeW1tZXRyaWNLZXlEZXRhaWxzLm1vZHVsdXNMZW5ndGggPCAyMDQ4KSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoYHNlY3JldE9yUHJpdmF0ZUtleSBoYXMgYSBtaW5pbXVtIGtleSBzaXplIG9mIDIwNDggYml0cyBmb3IgJHtoZWFkZXIuYWxnfWApKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHBheWxvYWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdwYXlsb2FkIGlzIHJlcXVpcmVkJykpO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0UGF5bG9hZCkge1xuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZVBheWxvYWQocGF5bG9hZCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhaWx1cmUoZXJyb3IpO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMubXV0YXRlUGF5bG9hZCkge1xuICAgICAgcGF5bG9hZCA9IE9iamVjdC5hc3NpZ24oe30scGF5bG9hZCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGludmFsaWRfb3B0aW9ucyA9IG9wdGlvbnNfZm9yX29iamVjdHMuZmlsdGVyKGZ1bmN0aW9uIChvcHQpIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb3B0aW9uc1tvcHRdICE9PSAndW5kZWZpbmVkJztcbiAgICB9KTtcblxuICAgIGlmIChpbnZhbGlkX29wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdpbnZhbGlkICcgKyBpbnZhbGlkX29wdGlvbnMuam9pbignLCcpICsgJyBvcHRpb24gZm9yICcgKyAodHlwZW9mIHBheWxvYWQgKSArICcgcGF5bG9hZCcpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHBheWxvYWQuZXhwICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygb3B0aW9ucy5leHBpcmVzSW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdCYWQgXCJvcHRpb25zLmV4cGlyZXNJblwiIG9wdGlvbiB0aGUgcGF5bG9hZCBhbHJlYWR5IGhhcyBhbiBcImV4cFwiIHByb3BlcnR5LicpKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF5bG9hZC5uYmYgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLm5vdEJlZm9yZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ0JhZCBcIm9wdGlvbnMubm90QmVmb3JlXCIgb3B0aW9uIHRoZSBwYXlsb2FkIGFscmVhZHkgaGFzIGFuIFwibmJmXCIgcHJvcGVydHkuJykpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7XG4gIH1cbiAgY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUoZXJyb3IpO1xuICB9XG5cbiAgaWYgKCFvcHRpb25zLmFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlcykge1xuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZUFzeW1tZXRyaWNLZXkoaGVhZGVyLmFsZywgc2VjcmV0T3JQcml2YXRlS2V5KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhaWx1cmUoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRpbWVzdGFtcCA9IHBheWxvYWQuaWF0IHx8IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuXG4gIGlmIChvcHRpb25zLm5vVGltZXN0YW1wKSB7XG4gICAgZGVsZXRlIHBheWxvYWQuaWF0O1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0UGF5bG9hZCkge1xuICAgIHBheWxvYWQuaWF0ID0gdGltZXN0YW1wO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLm5vdEJlZm9yZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0cnkge1xuICAgICAgcGF5bG9hZC5uYmYgPSB0aW1lc3BhbihvcHRpb25zLm5vdEJlZm9yZSwgdGltZXN0YW1wKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIGZhaWx1cmUoZXJyKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkLm5iZiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignXCJub3RCZWZvcmVcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcyBvciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgdGltZXNwYW4gZWc6IFwiMWRcIiwgXCIyMGhcIiwgNjAnKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmV4cGlyZXNJbiAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBheWxvYWQuZXhwID0gdGltZXNwYW4ob3B0aW9ucy5leHBpcmVzSW4sIHRpbWVzdGFtcCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKGVycik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGF5bG9hZC5leHAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ1wiZXhwaXJlc0luXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMgb3Igc3RyaW5nIHJlcHJlc2VudGluZyBhIHRpbWVzcGFuIGVnOiBcIjFkXCIsIFwiMjBoXCIsIDYwJykpO1xuICAgIH1cbiAgfVxuXG4gIE9iamVjdC5rZXlzKG9wdGlvbnNfdG9fcGF5bG9hZCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgY29uc3QgY2xhaW0gPSBvcHRpb25zX3RvX3BheWxvYWRba2V5XTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnNba2V5XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmICh0eXBlb2YgcGF5bG9hZFtjbGFpbV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignQmFkIFwib3B0aW9ucy4nICsga2V5ICsgJ1wiIG9wdGlvbi4gVGhlIHBheWxvYWQgYWxyZWFkeSBoYXMgYW4gXCInICsgY2xhaW0gKyAnXCIgcHJvcGVydHkuJykpO1xuICAgICAgfVxuICAgICAgcGF5bG9hZFtjbGFpbV0gPSBvcHRpb25zW2tleV07XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBlbmNvZGluZyA9IG9wdGlvbnMuZW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrICYmIG9uY2UoY2FsbGJhY2spO1xuXG4gICAgandzLmNyZWF0ZVNpZ24oe1xuICAgICAgaGVhZGVyOiBoZWFkZXIsXG4gICAgICBwcml2YXRlS2V5OiBzZWNyZXRPclByaXZhdGVLZXksXG4gICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nXG4gICAgfSkub25jZSgnZXJyb3InLCBjYWxsYmFjaylcbiAgICAgIC5vbmNlKCdkb25lJywgZnVuY3Rpb24gKHNpZ25hdHVyZSkge1xuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgaW4gZmF2b3Igb2YgdGhlIG1vZHVsdXMgbGVuZ3RoIGNoZWNrIGJlZm9yZSBzaWduaW5nIG9uY2Ugbm9kZSAxNSsgaXMgdGhlIG1pbmltdW0gc3VwcG9ydGVkIHZlcnNpb25cbiAgICAgICAgaWYoIW9wdGlvbnMuYWxsb3dJbnNlY3VyZUtleVNpemVzICYmIC9eKD86UlN8UFMpLy50ZXN0KGhlYWRlci5hbGcpICYmIHNpZ25hdHVyZS5sZW5ndGggPCAyNTYpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBzZWNyZXRPclByaXZhdGVLZXkgaGFzIGEgbWluaW11bSBrZXkgc2l6ZSBvZiAyMDQ4IGJpdHMgZm9yICR7aGVhZGVyLmFsZ31gKSlcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayhudWxsLCBzaWduYXR1cmUpO1xuICAgICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHNpZ25hdHVyZSA9IGp3cy5zaWduKHtoZWFkZXI6IGhlYWRlciwgcGF5bG9hZDogcGF5bG9hZCwgc2VjcmV0OiBzZWNyZXRPclByaXZhdGVLZXksIGVuY29kaW5nOiBlbmNvZGluZ30pO1xuICAgIC8vIFRPRE86IFJlbW92ZSBpbiBmYXZvciBvZiB0aGUgbW9kdWx1cyBsZW5ndGggY2hlY2sgYmVmb3JlIHNpZ25pbmcgb25jZSBub2RlIDE1KyBpcyB0aGUgbWluaW11bSBzdXBwb3J0ZWQgdmVyc2lvblxuICAgIGlmKCFvcHRpb25zLmFsbG93SW5zZWN1cmVLZXlTaXplcyAmJiAvXig/OlJTfFBTKS8udGVzdChoZWFkZXIuYWxnKSAmJiBzaWduYXR1cmUubGVuZ3RoIDwgMjU2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHNlY3JldE9yUHJpdmF0ZUtleSBoYXMgYSBtaW5pbXVtIGtleSBzaXplIG9mIDIwNDggYml0cyBmb3IgJHtoZWFkZXIuYWxnfWApXG4gICAgfVxuICAgIHJldHVybiBzaWduYXR1cmVcbiAgfVxufTtcbiIsCiAgICAibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlY29kZTogcmVxdWlyZSgnLi9kZWNvZGUnKSxcbiAgdmVyaWZ5OiByZXF1aXJlKCcuL3ZlcmlmeScpLFxuICBzaWduOiByZXF1aXJlKCcuL3NpZ24nKSxcbiAgSnNvbldlYlRva2VuRXJyb3I6IHJlcXVpcmUoJy4vbGliL0pzb25XZWJUb2tlbkVycm9yJyksXG4gIE5vdEJlZm9yZUVycm9yOiByZXF1aXJlKCcuL2xpYi9Ob3RCZWZvcmVFcnJvcicpLFxuICBUb2tlbkV4cGlyZWRFcnJvcjogcmVxdWlyZSgnLi9saWIvVG9rZW5FeHBpcmVkRXJyb3InKSxcbn07XG4iLAogICAgIihmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBVdGlsc1xuICBmdW5jdGlvbiBhc3NlcnQgKHZhbCwgbXNnKSB7XG4gICAgaWYgKCF2YWwpIHRocm93IG5ldyBFcnJvcihtc2cgfHwgJ0Fzc2VydGlvbiBmYWlsZWQnKTtcbiAgfVxuXG4gIC8vIENvdWxkIHVzZSBgaW5oZXJpdHNgIG1vZHVsZSwgYnV0IGRvbid0IHdhbnQgdG8gbW92ZSBmcm9tIHNpbmdsZSBmaWxlXG4gIC8vIGFyY2hpdGVjdHVyZSB5ZXQuXG4gIGZ1bmN0aW9uIGluaGVyaXRzIChjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvcjtcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlO1xuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKCk7XG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yO1xuICB9XG5cbiAgLy8gQk5cblxuICBmdW5jdGlvbiBCTiAobnVtYmVyLCBiYXNlLCBlbmRpYW4pIHtcbiAgICBpZiAoQk4uaXNCTihudW1iZXIpKSB7XG4gICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH1cblxuICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgIHRoaXMud29yZHMgPSBudWxsO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgIC8vIFJlZHVjdGlvbiBjb250ZXh0XG4gICAgdGhpcy5yZWQgPSBudWxsO1xuXG4gICAgaWYgKG51bWJlciAhPT0gbnVsbCkge1xuICAgICAgaWYgKGJhc2UgPT09ICdsZScgfHwgYmFzZSA9PT0gJ2JlJykge1xuICAgICAgICBlbmRpYW4gPSBiYXNlO1xuICAgICAgICBiYXNlID0gMTA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2luaXQobnVtYmVyIHx8IDAsIGJhc2UgfHwgMTAsIGVuZGlhbiB8fCAnYmUnKTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBCTjtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRzLkJOID0gQk47XG4gIH1cblxuICBCTi5CTiA9IEJOO1xuICBCTi53b3JkU2l6ZSA9IDI2O1xuXG4gIHZhciBCdWZmZXI7XG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuQnVmZmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgQnVmZmVyID0gd2luZG93LkJ1ZmZlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICB9XG5cbiAgQk4uaXNCTiA9IGZ1bmN0aW9uIGlzQk4gKG51bSkge1xuICAgIGlmIChudW0gaW5zdGFuY2VvZiBCTikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bSAhPT0gbnVsbCAmJiB0eXBlb2YgbnVtID09PSAnb2JqZWN0JyAmJlxuICAgICAgbnVtLmNvbnN0cnVjdG9yLndvcmRTaXplID09PSBCTi53b3JkU2l6ZSAmJiBBcnJheS5pc0FycmF5KG51bS53b3Jkcyk7XG4gIH07XG5cbiAgQk4ubWF4ID0gZnVuY3Rpb24gbWF4IChsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0LmNtcChyaWdodCkgPiAwKSByZXR1cm4gbGVmdDtcbiAgICByZXR1cm4gcmlnaHQ7XG4gIH07XG5cbiAgQk4ubWluID0gZnVuY3Rpb24gbWluIChsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0LmNtcChyaWdodCkgPCAwKSByZXR1cm4gbGVmdDtcbiAgICByZXR1cm4gcmlnaHQ7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gaW5pdCAobnVtYmVyLCBiYXNlLCBlbmRpYW4pIHtcbiAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0TnVtYmVyKG51bWJlciwgYmFzZSwgZW5kaWFuKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0QXJyYXkobnVtYmVyLCBiYXNlLCBlbmRpYW4pO1xuICAgIH1cblxuICAgIGlmIChiYXNlID09PSAnaGV4Jykge1xuICAgICAgYmFzZSA9IDE2O1xuICAgIH1cbiAgICBhc3NlcnQoYmFzZSA9PT0gKGJhc2UgfCAwKSAmJiBiYXNlID49IDIgJiYgYmFzZSA8PSAzNik7XG5cbiAgICBudW1iZXIgPSBudW1iZXIudG9TdHJpbmcoKS5yZXBsYWNlKC9cXHMrL2csICcnKTtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGlmIChudW1iZXJbMF0gPT09ICctJykge1xuICAgICAgc3RhcnQrKztcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA8IG51bWJlci5sZW5ndGgpIHtcbiAgICAgIGlmIChiYXNlID09PSAxNikge1xuICAgICAgICB0aGlzLl9wYXJzZUhleChudW1iZXIsIHN0YXJ0LCBlbmRpYW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcGFyc2VCYXNlKG51bWJlciwgYmFzZSwgc3RhcnQpO1xuICAgICAgICBpZiAoZW5kaWFuID09PSAnbGUnKSB7XG4gICAgICAgICAgdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLCBiYXNlLCBlbmRpYW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faW5pdE51bWJlciA9IGZ1bmN0aW9uIF9pbml0TnVtYmVyIChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIG51bWJlciA9IC1udW1iZXI7XG4gICAgfVxuICAgIGlmIChudW1iZXIgPCAweDQwMDAwMDApIHtcbiAgICAgIHRoaXMud29yZHMgPSBbIG51bWJlciAmIDB4M2ZmZmZmZiBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgMHgxMDAwMDAwMDAwMDAwMCkge1xuICAgICAgdGhpcy53b3JkcyA9IFtcbiAgICAgICAgbnVtYmVyICYgMHgzZmZmZmZmLFxuICAgICAgICAobnVtYmVyIC8gMHg0MDAwMDAwKSAmIDB4M2ZmZmZmZlxuICAgICAgXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KG51bWJlciA8IDB4MjAwMDAwMDAwMDAwMDApOyAvLyAyIF4gNTMgKHVuc2FmZSlcbiAgICAgIHRoaXMud29yZHMgPSBbXG4gICAgICAgIG51bWJlciAmIDB4M2ZmZmZmZixcbiAgICAgICAgKG51bWJlciAvIDB4NDAwMDAwMCkgJiAweDNmZmZmZmYsXG4gICAgICAgIDFcbiAgICAgIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDM7XG4gICAgfVxuXG4gICAgaWYgKGVuZGlhbiAhPT0gJ2xlJykgcmV0dXJuO1xuXG4gICAgLy8gUmV2ZXJzZSB0aGUgYnl0ZXNcbiAgICB0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksIGJhc2UsIGVuZGlhbik7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0QXJyYXkgPSBmdW5jdGlvbiBfaW5pdEFycmF5IChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIC8vIFBlcmhhcHMgYSBVaW50OEFycmF5XG4gICAgYXNzZXJ0KHR5cGVvZiBudW1iZXIubGVuZ3RoID09PSAnbnVtYmVyJyk7XG4gICAgaWYgKG51bWJlci5sZW5ndGggPD0gMCkge1xuICAgICAgdGhpcy53b3JkcyA9IFsgMCBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwobnVtYmVyLmxlbmd0aCAvIDMpO1xuICAgIHRoaXMud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IDA7XG4gICAgfVxuXG4gICAgdmFyIGosIHc7XG4gICAgdmFyIG9mZiA9IDA7XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2JlJykge1xuICAgICAgZm9yIChpID0gbnVtYmVyLmxlbmd0aCAtIDEsIGogPSAwOyBpID49IDA7IGkgLT0gMykge1xuICAgICAgICB3ID0gbnVtYmVyW2ldIHwgKG51bWJlcltpIC0gMV0gPDwgOCkgfCAobnVtYmVyW2kgLSAyXSA8PCAxNik7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gKHcgPDwgb2ZmKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgdGhpcy53b3Jkc1tqICsgMV0gPSAodyA+Pj4gKDI2IC0gb2ZmKSkgJiAweDNmZmZmZmY7XG4gICAgICAgIG9mZiArPSAyNDtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVuZGlhbiA9PT0gJ2xlJykge1xuICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBudW1iZXIubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgdyA9IG51bWJlcltpXSB8IChudW1iZXJbaSArIDFdIDw8IDgpIHwgKG51bWJlcltpICsgMl0gPDwgMTYpO1xuICAgICAgICB0aGlzLndvcmRzW2pdIHw9ICh3IDw8IG9mZikgJiAweDNmZmZmZmY7XG4gICAgICAgIHRoaXMud29yZHNbaiArIDFdID0gKHcgPj4+ICgyNiAtIG9mZikpICYgMHgzZmZmZmZmO1xuICAgICAgICBvZmYgKz0gMjQ7XG4gICAgICAgIGlmIChvZmYgPj0gMjYpIHtcbiAgICAgICAgICBvZmYgLT0gMjY7XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gcGFyc2VIZXg0Qml0cyAoc3RyaW5nLCBpbmRleCkge1xuICAgIHZhciBjID0gc3RyaW5nLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgIC8vICdBJyAtICdGJ1xuICAgIGlmIChjID49IDY1ICYmIGMgPD0gNzApIHtcbiAgICAgIHJldHVybiBjIC0gNTU7XG4gICAgLy8gJ2EnIC0gJ2YnXG4gICAgfSBlbHNlIGlmIChjID49IDk3ICYmIGMgPD0gMTAyKSB7XG4gICAgICByZXR1cm4gYyAtIDg3O1xuICAgIC8vICcwJyAtICc5J1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKGMgLSA0OCkgJiAweGY7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VIZXhCeXRlIChzdHJpbmcsIGxvd2VyQm91bmQsIGluZGV4KSB7XG4gICAgdmFyIHIgPSBwYXJzZUhleDRCaXRzKHN0cmluZywgaW5kZXgpO1xuICAgIGlmIChpbmRleCAtIDEgPj0gbG93ZXJCb3VuZCkge1xuICAgICAgciB8PSBwYXJzZUhleDRCaXRzKHN0cmluZywgaW5kZXggLSAxKSA8PCA0O1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5fcGFyc2VIZXggPSBmdW5jdGlvbiBfcGFyc2VIZXggKG51bWJlciwgc3RhcnQsIGVuZGlhbikge1xuICAgIC8vIENyZWF0ZSBwb3NzaWJseSBiaWdnZXIgYXJyYXkgdG8gZW5zdXJlIHRoYXQgaXQgZml0cyB0aGUgbnVtYmVyXG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwoKG51bWJlci5sZW5ndGggLSBzdGFydCkgLyA2KTtcbiAgICB0aGlzLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAwO1xuICAgIH1cblxuICAgIC8vIDI0LWJpdHMgY2h1bmtzXG4gICAgdmFyIG9mZiA9IDA7XG4gICAgdmFyIGogPSAwO1xuXG4gICAgdmFyIHc7XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2JlJykge1xuICAgICAgZm9yIChpID0gbnVtYmVyLmxlbmd0aCAtIDE7IGkgPj0gc3RhcnQ7IGkgLT0gMikge1xuICAgICAgICB3ID0gcGFyc2VIZXhCeXRlKG51bWJlciwgc3RhcnQsIGkpIDw8IG9mZjtcbiAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSB3ICYgMHgzZmZmZmZmO1xuICAgICAgICBpZiAob2ZmID49IDE4KSB7XG4gICAgICAgICAgb2ZmIC09IDE4O1xuICAgICAgICAgIGogKz0gMTtcbiAgICAgICAgICB0aGlzLndvcmRzW2pdIHw9IHcgPj4+IDI2O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9mZiArPSA4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwYXJzZUxlbmd0aCA9IG51bWJlci5sZW5ndGggLSBzdGFydDtcbiAgICAgIGZvciAoaSA9IHBhcnNlTGVuZ3RoICUgMiA9PT0gMCA/IHN0YXJ0ICsgMSA6IHN0YXJ0OyBpIDwgbnVtYmVyLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHcgPSBwYXJzZUhleEJ5dGUobnVtYmVyLCBzdGFydCwgaSkgPDwgb2ZmO1xuICAgICAgICB0aGlzLndvcmRzW2pdIHw9IHcgJiAweDNmZmZmZmY7XG4gICAgICAgIGlmIChvZmYgPj0gMTgpIHtcbiAgICAgICAgICBvZmYgLT0gMTg7XG4gICAgICAgICAgaiArPSAxO1xuICAgICAgICAgIHRoaXMud29yZHNbal0gfD0gdyA+Pj4gMjY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2ZmICs9IDg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gcGFyc2VCYXNlIChzdHIsIHN0YXJ0LCBlbmQsIG11bCkge1xuICAgIHZhciByID0gMDtcbiAgICB2YXIgbGVuID0gTWF0aC5taW4oc3RyLmxlbmd0aCwgZW5kKTtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBsZW47IGkrKykge1xuICAgICAgdmFyIGMgPSBzdHIuY2hhckNvZGVBdChpKSAtIDQ4O1xuXG4gICAgICByICo9IG11bDtcblxuICAgICAgLy8gJ2EnXG4gICAgICBpZiAoYyA+PSA0OSkge1xuICAgICAgICByICs9IGMgLSA0OSArIDB4YTtcblxuICAgICAgLy8gJ0EnXG4gICAgICB9IGVsc2UgaWYgKGMgPj0gMTcpIHtcbiAgICAgICAgciArPSBjIC0gMTcgKyAweGE7XG5cbiAgICAgIC8vICcwJyAtICc5J1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgciArPSBjO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5fcGFyc2VCYXNlID0gZnVuY3Rpb24gX3BhcnNlQmFzZSAobnVtYmVyLCBiYXNlLCBzdGFydCkge1xuICAgIC8vIEluaXRpYWxpemUgYXMgemVyb1xuICAgIHRoaXMud29yZHMgPSBbIDAgXTtcbiAgICB0aGlzLmxlbmd0aCA9IDE7XG5cbiAgICAvLyBGaW5kIGxlbmd0aCBvZiBsaW1iIGluIGJhc2VcbiAgICBmb3IgKHZhciBsaW1iTGVuID0gMCwgbGltYlBvdyA9IDE7IGxpbWJQb3cgPD0gMHgzZmZmZmZmOyBsaW1iUG93ICo9IGJhc2UpIHtcbiAgICAgIGxpbWJMZW4rKztcbiAgICB9XG4gICAgbGltYkxlbi0tO1xuICAgIGxpbWJQb3cgPSAobGltYlBvdyAvIGJhc2UpIHwgMDtcblxuICAgIHZhciB0b3RhbCA9IG51bWJlci5sZW5ndGggLSBzdGFydDtcbiAgICB2YXIgbW9kID0gdG90YWwgJSBsaW1iTGVuO1xuICAgIHZhciBlbmQgPSBNYXRoLm1pbih0b3RhbCwgdG90YWwgLSBtb2QpICsgc3RhcnQ7XG5cbiAgICB2YXIgd29yZCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGxpbWJMZW4pIHtcbiAgICAgIHdvcmQgPSBwYXJzZUJhc2UobnVtYmVyLCBpLCBpICsgbGltYkxlbiwgYmFzZSk7XG5cbiAgICAgIHRoaXMuaW11bG4obGltYlBvdyk7XG4gICAgICBpZiAodGhpcy53b3Jkc1swXSArIHdvcmQgPCAweDQwMDAwMDApIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSArPSB3b3JkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faWFkZG4od29yZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vZCAhPT0gMCkge1xuICAgICAgdmFyIHBvdyA9IDE7XG4gICAgICB3b3JkID0gcGFyc2VCYXNlKG51bWJlciwgaSwgbnVtYmVyLmxlbmd0aCwgYmFzZSk7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBtb2Q7IGkrKykge1xuICAgICAgICBwb3cgKj0gYmFzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbXVsbihwb3cpO1xuICAgICAgaWYgKHRoaXMud29yZHNbMF0gKyB3b3JkIDwgMHg0MDAwMDAwKSB7XG4gICAgICAgIHRoaXMud29yZHNbMF0gKz0gd29yZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2lhZGRuKHdvcmQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKGRlc3QpIHtcbiAgICBkZXN0LndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlc3Qud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldO1xuICAgIH1cbiAgICBkZXN0Lmxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgIGRlc3QubmVnYXRpdmUgPSB0aGlzLm5lZ2F0aXZlO1xuICAgIGRlc3QucmVkID0gdGhpcy5yZWQ7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gY2xvbmUgKCkge1xuICAgIHZhciByID0gbmV3IEJOKG51bGwpO1xuICAgIHRoaXMuY29weShyKTtcbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2V4cGFuZCA9IGZ1bmN0aW9uIF9leHBhbmQgKHNpemUpIHtcbiAgICB3aGlsZSAodGhpcy5sZW5ndGggPCBzaXplKSB7XG4gICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gUmVtb3ZlIGxlYWRpbmcgYDBgIGZyb20gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zdHJpcCA9IGZ1bmN0aW9uIHN0cmlwICgpIHtcbiAgICB3aGlsZSAodGhpcy5sZW5ndGggPiAxICYmIHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSA9PT0gMCkge1xuICAgICAgdGhpcy5sZW5ndGgtLTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX25vcm1TaWduKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9ub3JtU2lnbiA9IGZ1bmN0aW9uIF9ub3JtU2lnbiAoKSB7XG4gICAgLy8gLTAgPSAwXG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICAgIHJldHVybiAodGhpcy5yZWQgPyAnPEJOLVI6ICcgOiAnPEJOOiAnKSArIHRoaXMudG9TdHJpbmcoMTYpICsgJz4nO1xuICB9O1xuXG4gIC8qXG5cbiAgdmFyIHplcm9zID0gW107XG4gIHZhciBncm91cFNpemVzID0gW107XG4gIHZhciBncm91cEJhc2VzID0gW107XG5cbiAgdmFyIHMgPSAnJztcbiAgdmFyIGkgPSAtMTtcbiAgd2hpbGUgKCsraSA8IEJOLndvcmRTaXplKSB7XG4gICAgemVyb3NbaV0gPSBzO1xuICAgIHMgKz0gJzAnO1xuICB9XG4gIGdyb3VwU2l6ZXNbMF0gPSAwO1xuICBncm91cFNpemVzWzFdID0gMDtcbiAgZ3JvdXBCYXNlc1swXSA9IDA7XG4gIGdyb3VwQmFzZXNbMV0gPSAwO1xuICB2YXIgYmFzZSA9IDIgLSAxO1xuICB3aGlsZSAoKytiYXNlIDwgMzYgKyAxKSB7XG4gICAgdmFyIGdyb3VwU2l6ZSA9IDA7XG4gICAgdmFyIGdyb3VwQmFzZSA9IDE7XG4gICAgd2hpbGUgKGdyb3VwQmFzZSA8ICgxIDw8IEJOLndvcmRTaXplKSAvIGJhc2UpIHtcbiAgICAgIGdyb3VwQmFzZSAqPSBiYXNlO1xuICAgICAgZ3JvdXBTaXplICs9IDE7XG4gICAgfVxuICAgIGdyb3VwU2l6ZXNbYmFzZV0gPSBncm91cFNpemU7XG4gICAgZ3JvdXBCYXNlc1tiYXNlXSA9IGdyb3VwQmFzZTtcbiAgfVxuXG4gICovXG5cbiAgdmFyIHplcm9zID0gW1xuICAgICcnLFxuICAgICcwJyxcbiAgICAnMDAnLFxuICAgICcwMDAnLFxuICAgICcwMDAwJyxcbiAgICAnMDAwMDAnLFxuICAgICcwMDAwMDAnLFxuICAgICcwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuICBdO1xuXG4gIHZhciBncm91cFNpemVzID0gW1xuICAgIDAsIDAsXG4gICAgMjUsIDE2LCAxMiwgMTEsIDEwLCA5LCA4LFxuICAgIDgsIDcsIDcsIDcsIDcsIDYsIDYsXG4gICAgNiwgNiwgNiwgNiwgNiwgNSwgNSxcbiAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LFxuICAgIDUsIDUsIDUsIDUsIDUsIDUsIDVcbiAgXTtcblxuICB2YXIgZ3JvdXBCYXNlcyA9IFtcbiAgICAwLCAwLFxuICAgIDMzNTU0NDMyLCA0MzA0NjcyMSwgMTY3NzcyMTYsIDQ4ODI4MTI1LCA2MDQ2NjE3NiwgNDAzNTM2MDcsIDE2Nzc3MjE2LFxuICAgIDQzMDQ2NzIxLCAxMDAwMDAwMCwgMTk0ODcxNzEsIDM1ODMxODA4LCA2Mjc0ODUxNywgNzUyOTUzNiwgMTEzOTA2MjUsXG4gICAgMTY3NzcyMTYsIDI0MTM3NTY5LCAzNDAxMjIyNCwgNDcwNDU4ODEsIDY0MDAwMDAwLCA0MDg0MTAxLCA1MTUzNjMyLFxuICAgIDY0MzYzNDMsIDc5NjI2MjQsIDk3NjU2MjUsIDExODgxMzc2LCAxNDM0ODkwNywgMTcyMTAzNjgsIDIwNTExMTQ5LFxuICAgIDI0MzAwMDAwLCAyODYyOTE1MSwgMzM1NTQ0MzIsIDM5MTM1MzkzLCA0NTQzNTQyNCwgNTI1MjE4NzUsIDYwNDY2MTc2XG4gIF07XG5cbiAgQk4ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKGJhc2UsIHBhZGRpbmcpIHtcbiAgICBiYXNlID0gYmFzZSB8fCAxMDtcbiAgICBwYWRkaW5nID0gcGFkZGluZyB8IDAgfHwgMTtcblxuICAgIHZhciBvdXQ7XG4gICAgaWYgKGJhc2UgPT09IDE2IHx8IGJhc2UgPT09ICdoZXgnKSB7XG4gICAgICBvdXQgPSAnJztcbiAgICAgIHZhciBvZmYgPSAwO1xuICAgICAgdmFyIGNhcnJ5ID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdyA9IHRoaXMud29yZHNbaV07XG4gICAgICAgIHZhciB3b3JkID0gKCgodyA8PCBvZmYpIHwgY2FycnkpICYgMHhmZmZmZmYpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgY2FycnkgPSAodyA+Pj4gKDI0IC0gb2ZmKSkgJiAweGZmZmZmZjtcbiAgICAgICAgb2ZmICs9IDI7XG4gICAgICAgIGlmIChvZmYgPj0gMjYpIHtcbiAgICAgICAgICBvZmYgLT0gMjY7XG4gICAgICAgICAgaS0tO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYXJyeSAhPT0gMCB8fCBpICE9PSB0aGlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBvdXQgPSB6ZXJvc1s2IC0gd29yZC5sZW5ndGhdICsgd29yZCArIG91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgPSB3b3JkICsgb3V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgICAgb3V0ID0gY2FycnkudG9TdHJpbmcoMTYpICsgb3V0O1xuICAgICAgfVxuICAgICAgd2hpbGUgKG91dC5sZW5ndGggJSBwYWRkaW5nICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICcwJyArIG91dDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICctJyArIG91dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgaWYgKGJhc2UgPT09IChiYXNlIHwgMCkgJiYgYmFzZSA+PSAyICYmIGJhc2UgPD0gMzYpIHtcbiAgICAgIC8vIHZhciBncm91cFNpemUgPSBNYXRoLmZsb29yKEJOLndvcmRTaXplICogTWF0aC5MTjIgLyBNYXRoLmxvZyhiYXNlKSk7XG4gICAgICB2YXIgZ3JvdXBTaXplID0gZ3JvdXBTaXplc1tiYXNlXTtcbiAgICAgIC8vIHZhciBncm91cEJhc2UgPSBNYXRoLnBvdyhiYXNlLCBncm91cFNpemUpO1xuICAgICAgdmFyIGdyb3VwQmFzZSA9IGdyb3VwQmFzZXNbYmFzZV07XG4gICAgICBvdXQgPSAnJztcbiAgICAgIHZhciBjID0gdGhpcy5jbG9uZSgpO1xuICAgICAgYy5uZWdhdGl2ZSA9IDA7XG4gICAgICB3aGlsZSAoIWMuaXNaZXJvKCkpIHtcbiAgICAgICAgdmFyIHIgPSBjLm1vZG4oZ3JvdXBCYXNlKS50b1N0cmluZyhiYXNlKTtcbiAgICAgICAgYyA9IGMuaWRpdm4oZ3JvdXBCYXNlKTtcblxuICAgICAgICBpZiAoIWMuaXNaZXJvKCkpIHtcbiAgICAgICAgICBvdXQgPSB6ZXJvc1tncm91cFNpemUgLSByLmxlbmd0aF0gKyByICsgb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCA9IHIgKyBvdXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzWmVybygpKSB7XG4gICAgICAgIG91dCA9ICcwJyArIG91dDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChvdXQubGVuZ3RoICUgcGFkZGluZyAhPT0gMCkge1xuICAgICAgICBvdXQgPSAnMCcgKyBvdXQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICBvdXQgPSAnLScgKyBvdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIGFzc2VydChmYWxzZSwgJ0Jhc2Ugc2hvdWxkIGJlIGJldHdlZW4gMiBhbmQgMzYnKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9OdW1iZXIgPSBmdW5jdGlvbiB0b051bWJlciAoKSB7XG4gICAgdmFyIHJldCA9IHRoaXMud29yZHNbMF07XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAyKSB7XG4gICAgICByZXQgKz0gdGhpcy53b3Jkc1sxXSAqIDB4NDAwMDAwMDtcbiAgICB9IGVsc2UgaWYgKHRoaXMubGVuZ3RoID09PSAzICYmIHRoaXMud29yZHNbMl0gPT09IDB4MDEpIHtcbiAgICAgIC8vIE5PVEU6IGF0IHRoaXMgc3RhZ2UgaXQgaXMga25vd24gdGhhdCB0aGUgdG9wIGJpdCBpcyBzZXRcbiAgICAgIHJldCArPSAweDEwMDAwMDAwMDAwMDAwICsgKHRoaXMud29yZHNbMV0gKiAweDQwMDAwMDApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sZW5ndGggPiAyKSB7XG4gICAgICBhc3NlcnQoZmFsc2UsICdOdW1iZXIgY2FuIG9ubHkgc2FmZWx5IHN0b3JlIHVwIHRvIDUzIGJpdHMnKTtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLm5lZ2F0aXZlICE9PSAwKSA/IC1yZXQgOiByZXQ7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoMTYpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b0J1ZmZlciA9IGZ1bmN0aW9uIHRvQnVmZmVyIChlbmRpYW4sIGxlbmd0aCkge1xuICAgIGFzc2VydCh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJyk7XG4gICAgcmV0dXJuIHRoaXMudG9BcnJheUxpa2UoQnVmZmVyLCBlbmRpYW4sIGxlbmd0aCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiB0b0FycmF5IChlbmRpYW4sIGxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLnRvQXJyYXlMaWtlKEFycmF5LCBlbmRpYW4sIGxlbmd0aCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvQXJyYXlMaWtlID0gZnVuY3Rpb24gdG9BcnJheUxpa2UgKEFycmF5VHlwZSwgZW5kaWFuLCBsZW5ndGgpIHtcbiAgICB2YXIgYnl0ZUxlbmd0aCA9IHRoaXMuYnl0ZUxlbmd0aCgpO1xuICAgIHZhciByZXFMZW5ndGggPSBsZW5ndGggfHwgTWF0aC5tYXgoMSwgYnl0ZUxlbmd0aCk7XG4gICAgYXNzZXJ0KGJ5dGVMZW5ndGggPD0gcmVxTGVuZ3RoLCAnYnl0ZSBhcnJheSBsb25nZXIgdGhhbiBkZXNpcmVkIGxlbmd0aCcpO1xuICAgIGFzc2VydChyZXFMZW5ndGggPiAwLCAnUmVxdWVzdGVkIGFycmF5IGxlbmd0aCA8PSAwJyk7XG5cbiAgICB0aGlzLnN0cmlwKCk7XG4gICAgdmFyIGxpdHRsZUVuZGlhbiA9IGVuZGlhbiA9PT0gJ2xlJztcbiAgICB2YXIgcmVzID0gbmV3IEFycmF5VHlwZShyZXFMZW5ndGgpO1xuXG4gICAgdmFyIGIsIGk7XG4gICAgdmFyIHEgPSB0aGlzLmNsb25lKCk7XG4gICAgaWYgKCFsaXR0bGVFbmRpYW4pIHtcbiAgICAgIC8vIEFzc3VtZSBiaWctZW5kaWFuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgcmVxTGVuZ3RoIC0gYnl0ZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc1tpXSA9IDA7XG4gICAgICB9XG5cbiAgICAgIGZvciAoaSA9IDA7ICFxLmlzWmVybygpOyBpKyspIHtcbiAgICAgICAgYiA9IHEuYW5kbG4oMHhmZik7XG4gICAgICAgIHEuaXVzaHJuKDgpO1xuXG4gICAgICAgIHJlc1tyZXFMZW5ndGggLSBpIC0gMV0gPSBiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGkgPSAwOyAhcS5pc1plcm8oKTsgaSsrKSB7XG4gICAgICAgIGIgPSBxLmFuZGxuKDB4ZmYpO1xuICAgICAgICBxLml1c2hybig4KTtcblxuICAgICAgICByZXNbaV0gPSBiO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgaSA8IHJlcUxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc1tpXSA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBpZiAoTWF0aC5jbHozMikge1xuICAgIEJOLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24gX2NvdW50Qml0cyAodykge1xuICAgICAgcmV0dXJuIDMyIC0gTWF0aC5jbHozMih3KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIEJOLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24gX2NvdW50Qml0cyAodykge1xuICAgICAgdmFyIHQgPSB3O1xuICAgICAgdmFyIHIgPSAwO1xuICAgICAgaWYgKHQgPj0gMHgxMDAwKSB7XG4gICAgICAgIHIgKz0gMTM7XG4gICAgICAgIHQgPj4+PSAxMztcbiAgICAgIH1cbiAgICAgIGlmICh0ID49IDB4NDApIHtcbiAgICAgICAgciArPSA3O1xuICAgICAgICB0ID4+Pj0gNztcbiAgICAgIH1cbiAgICAgIGlmICh0ID49IDB4OCkge1xuICAgICAgICByICs9IDQ7XG4gICAgICAgIHQgPj4+PSA0O1xuICAgICAgfVxuICAgICAgaWYgKHQgPj0gMHgwMikge1xuICAgICAgICByICs9IDI7XG4gICAgICAgIHQgPj4+PSAyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHIgKyB0O1xuICAgIH07XG4gIH1cblxuICBCTi5wcm90b3R5cGUuX3plcm9CaXRzID0gZnVuY3Rpb24gX3plcm9CaXRzICh3KSB7XG4gICAgLy8gU2hvcnQtY3V0XG4gICAgaWYgKHcgPT09IDApIHJldHVybiAyNjtcblxuICAgIHZhciB0ID0gdztcbiAgICB2YXIgciA9IDA7XG4gICAgaWYgKCh0ICYgMHgxZmZmKSA9PT0gMCkge1xuICAgICAgciArPSAxMztcbiAgICAgIHQgPj4+PSAxMztcbiAgICB9XG4gICAgaWYgKCh0ICYgMHg3ZikgPT09IDApIHtcbiAgICAgIHIgKz0gNztcbiAgICAgIHQgPj4+PSA3O1xuICAgIH1cbiAgICBpZiAoKHQgJiAweGYpID09PSAwKSB7XG4gICAgICByICs9IDQ7XG4gICAgICB0ID4+Pj0gNDtcbiAgICB9XG4gICAgaWYgKCh0ICYgMHgzKSA9PT0gMCkge1xuICAgICAgciArPSAyO1xuICAgICAgdCA+Pj49IDI7XG4gICAgfVxuICAgIGlmICgodCAmIDB4MSkgPT09IDApIHtcbiAgICAgIHIrKztcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG51bWJlciBvZiB1c2VkIGJpdHMgaW4gYSBCTlxuICBCTi5wcm90b3R5cGUuYml0TGVuZ3RoID0gZnVuY3Rpb24gYml0TGVuZ3RoICgpIHtcbiAgICB2YXIgdyA9IHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXTtcbiAgICB2YXIgaGkgPSB0aGlzLl9jb3VudEJpdHModyk7XG4gICAgcmV0dXJuICh0aGlzLmxlbmd0aCAtIDEpICogMjYgKyBoaTtcbiAgfTtcblxuICBmdW5jdGlvbiB0b0JpdEFycmF5IChudW0pIHtcbiAgICB2YXIgdyA9IG5ldyBBcnJheShudW0uYml0TGVuZ3RoKCkpO1xuXG4gICAgZm9yICh2YXIgYml0ID0gMDsgYml0IDwgdy5sZW5ndGg7IGJpdCsrKSB7XG4gICAgICB2YXIgb2ZmID0gKGJpdCAvIDI2KSB8IDA7XG4gICAgICB2YXIgd2JpdCA9IGJpdCAlIDI2O1xuXG4gICAgICB3W2JpdF0gPSAobnVtLndvcmRzW29mZl0gJiAoMSA8PCB3Yml0KSkgPj4+IHdiaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHc7XG4gIH1cblxuICAvLyBOdW1iZXIgb2YgdHJhaWxpbmcgemVybyBiaXRzXG4gIEJOLnByb3RvdHlwZS56ZXJvQml0cyA9IGZ1bmN0aW9uIHplcm9CaXRzICgpIHtcbiAgICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIDA7XG5cbiAgICB2YXIgciA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYiA9IHRoaXMuX3plcm9CaXRzKHRoaXMud29yZHNbaV0pO1xuICAgICAgciArPSBiO1xuICAgICAgaWYgKGIgIT09IDI2KSBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmJ5dGVMZW5ndGggPSBmdW5jdGlvbiBieXRlTGVuZ3RoICgpIHtcbiAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMuYml0TGVuZ3RoKCkgLyA4KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9Ud29zID0gZnVuY3Rpb24gdG9Ud29zICh3aWR0aCkge1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5hYnMoKS5pbm90bih3aWR0aCkuaWFkZG4oMSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb25lKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmZyb21Ud29zID0gZnVuY3Rpb24gZnJvbVR3b3MgKHdpZHRoKSB7XG4gICAgaWYgKHRoaXMudGVzdG4od2lkdGggLSAxKSkge1xuICAgICAgcmV0dXJuIHRoaXMubm90bih3aWR0aCkuaWFkZG4oMSkuaW5lZygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc05lZyA9IGZ1bmN0aW9uIGlzTmVnICgpIHtcbiAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMDtcbiAgfTtcblxuICAvLyBSZXR1cm4gbmVnYXRpdmUgY2xvbmUgb2YgYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcgKCkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW5lZygpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pbmVnID0gZnVuY3Rpb24gaW5lZyAoKSB7XG4gICAgaWYgKCF0aGlzLmlzWmVybygpKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlIF49IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gT3IgYG51bWAgd2l0aCBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1b3IgPSBmdW5jdGlvbiBpdW9yIChudW0pIHtcbiAgICB3aGlsZSAodGhpcy5sZW5ndGggPCBudW0ubGVuZ3RoKSB7XG4gICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV0gfCBudW0ud29yZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaW9yID0gZnVuY3Rpb24gaW9yIChudW0pIHtcbiAgICBhc3NlcnQoKHRoaXMubmVnYXRpdmUgfCBudW0ubmVnYXRpdmUpID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdW9yKG51bSk7XG4gIH07XG5cbiAgLy8gT3IgYG51bWAgd2l0aCBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLm9yID0gZnVuY3Rpb24gb3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaW9yKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLmlvcih0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudW9yID0gZnVuY3Rpb24gdW9yIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLml1b3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXVvcih0aGlzKTtcbiAgfTtcblxuICAvLyBBbmQgYG51bWAgd2l0aCBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1YW5kID0gZnVuY3Rpb24gaXVhbmQgKG51bSkge1xuICAgIC8vIGIgPSBtaW4tbGVuZ3RoKG51bSwgdGhpcylcbiAgICB2YXIgYjtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSB7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldICYgbnVtLndvcmRzW2ldO1xuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gYi5sZW5ndGg7XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pYW5kID0gZnVuY3Rpb24gaWFuZCAobnVtKSB7XG4gICAgYXNzZXJ0KCh0aGlzLm5lZ2F0aXZlIHwgbnVtLm5lZ2F0aXZlKSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXVhbmQobnVtKTtcbiAgfTtcblxuICAvLyBBbmQgYG51bWAgd2l0aCBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uIGFuZCAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYW5kKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLmlhbmQodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVhbmQgPSBmdW5jdGlvbiB1YW5kIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLml1YW5kKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLml1YW5kKHRoaXMpO1xuICB9O1xuXG4gIC8vIFhvciBgbnVtYCB3aXRoIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXV4b3IgPSBmdW5jdGlvbiBpdXhvciAobnVtKSB7XG4gICAgLy8gYS5sZW5ndGggPiBiLmxlbmd0aFxuICAgIHZhciBhO1xuICAgIHZhciBiO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHtcbiAgICAgIGEgPSB0aGlzO1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IG51bTtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGEud29yZHNbaV0gXiBiLndvcmRzW2ldO1xuICAgIH1cblxuICAgIGlmICh0aGlzICE9PSBhKSB7XG4gICAgICBmb3IgKDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGEud29yZHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBhLmxlbmd0aDtcblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLml4b3IgPSBmdW5jdGlvbiBpeG9yIChudW0pIHtcbiAgICBhc3NlcnQoKHRoaXMubmVnYXRpdmUgfCBudW0ubmVnYXRpdmUpID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdXhvcihudW0pO1xuICB9O1xuXG4gIC8vIFhvciBgbnVtYCB3aXRoIGB0aGlzYFxuICBCTi5wcm90b3R5cGUueG9yID0gZnVuY3Rpb24geG9yIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLml4b3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXhvcih0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudXhvciA9IGZ1bmN0aW9uIHV4b3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXV4b3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXV4b3IodGhpcyk7XG4gIH07XG5cbiAgLy8gTm90IGBgdGhpc2BgIHdpdGggYGB3aWR0aGBgIGJpdHdpZHRoXG4gIEJOLnByb3RvdHlwZS5pbm90biA9IGZ1bmN0aW9uIGlub3RuICh3aWR0aCkge1xuICAgIGFzc2VydCh0eXBlb2Ygd2lkdGggPT09ICdudW1iZXInICYmIHdpZHRoID49IDApO1xuXG4gICAgdmFyIGJ5dGVzTmVlZGVkID0gTWF0aC5jZWlsKHdpZHRoIC8gMjYpIHwgMDtcbiAgICB2YXIgYml0c0xlZnQgPSB3aWR0aCAlIDI2O1xuXG4gICAgLy8gRXh0ZW5kIHRoZSBidWZmZXIgd2l0aCBsZWFkaW5nIHplcm9lc1xuICAgIHRoaXMuX2V4cGFuZChieXRlc05lZWRlZCk7XG5cbiAgICBpZiAoYml0c0xlZnQgPiAwKSB7XG4gICAgICBieXRlc05lZWRlZC0tO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBjb21wbGV0ZSB3b3Jkc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXNOZWVkZWQ7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IH50aGlzLndvcmRzW2ldICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0aGUgcmVzaWR1ZVxuICAgIGlmIChiaXRzTGVmdCA+IDApIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB+dGhpcy53b3Jkc1tpXSAmICgweDNmZmZmZmYgPj4gKDI2IC0gYml0c0xlZnQpKTtcbiAgICB9XG5cbiAgICAvLyBBbmQgcmVtb3ZlIGxlYWRpbmcgemVyb2VzXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubm90biA9IGZ1bmN0aW9uIG5vdG4gKHdpZHRoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbm90bih3aWR0aCk7XG4gIH07XG5cbiAgLy8gU2V0IGBiaXRgIG9mIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuc2V0biA9IGZ1bmN0aW9uIHNldG4gKGJpdCwgdmFsKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXQgPT09ICdudW1iZXInICYmIGJpdCA+PSAwKTtcblxuICAgIHZhciBvZmYgPSAoYml0IC8gMjYpIHwgMDtcbiAgICB2YXIgd2JpdCA9IGJpdCAlIDI2O1xuXG4gICAgdGhpcy5fZXhwYW5kKG9mZiArIDEpO1xuXG4gICAgaWYgKHZhbCkge1xuICAgICAgdGhpcy53b3Jkc1tvZmZdID0gdGhpcy53b3Jkc1tvZmZdIHwgKDEgPDwgd2JpdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud29yZHNbb2ZmXSA9IHRoaXMud29yZHNbb2ZmXSAmIH4oMSA8PCB3Yml0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIC8vIEFkZCBgbnVtYCB0byBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLmlhZGQgPSBmdW5jdGlvbiBpYWRkIChudW0pIHtcbiAgICB2YXIgcjtcblxuICAgIC8vIG5lZ2F0aXZlICsgcG9zaXRpdmVcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBudW0ubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgciA9IHRoaXMuaXN1YihudW0pO1xuICAgICAgdGhpcy5uZWdhdGl2ZSBePSAxO1xuICAgICAgcmV0dXJuIHRoaXMuX25vcm1TaWduKCk7XG5cbiAgICAvLyBwb3NpdGl2ZSArIG5lZ2F0aXZlXG4gICAgfSBlbHNlIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG51bS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMDtcbiAgICAgIHIgPSB0aGlzLmlzdWIobnVtKTtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gci5fbm9ybVNpZ24oKTtcbiAgICB9XG5cbiAgICAvLyBhLmxlbmd0aCA+IGIubGVuZ3RoXG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkge1xuICAgICAgYSA9IHRoaXM7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gbnVtO1xuICAgICAgYiA9IHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSAoYS53b3Jkc1tpXSB8IDApICsgKGIud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgICBjYXJyeSA9IHIgPj4+IDI2O1xuICAgIH1cbiAgICBmb3IgKDsgY2FycnkgIT09IDAgJiYgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSAoYS53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICAgIGNhcnJ5ID0gciA+Pj4gMjY7XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBhLmxlbmd0aDtcbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGhdID0gY2Fycnk7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIC8vIENvcHkgdGhlIHJlc3Qgb2YgdGhlIHdvcmRzXG4gICAgfSBlbHNlIGlmIChhICE9PSB0aGlzKSB7XG4gICAgICBmb3IgKDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGEud29yZHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gQWRkIGBudW1gIHRvIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkIChudW0pIHtcbiAgICB2YXIgcmVzO1xuICAgIGlmIChudW0ubmVnYXRpdmUgIT09IDAgJiYgdGhpcy5uZWdhdGl2ZSA9PT0gMCkge1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMDtcbiAgICAgIHJlcyA9IHRoaXMuc3ViKG51bSk7XG4gICAgICBudW0ubmVnYXRpdmUgXj0gMTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSBlbHNlIGlmIChudW0ubmVnYXRpdmUgPT09IDAgJiYgdGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICByZXMgPSBudW0uc3ViKHRoaXMpO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaWFkZChudW0pO1xuXG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLmlhZGQodGhpcyk7XG4gIH07XG5cbiAgLy8gU3VidHJhY3QgYG51bWAgZnJvbSBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLmlzdWIgPSBmdW5jdGlvbiBpc3ViIChudW0pIHtcbiAgICAvLyB0aGlzIC0gKC1udW0pID0gdGhpcyArIG51bVxuICAgIGlmIChudW0ubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDA7XG4gICAgICB2YXIgciA9IHRoaXMuaWFkZChudW0pO1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiByLl9ub3JtU2lnbigpO1xuXG4gICAgLy8gLXRoaXMgLSBudW0gPSAtKHRoaXMgKyBudW0pXG4gICAgfSBlbHNlIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHRoaXMuaWFkZChudW0pO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcbiAgICB9XG5cbiAgICAvLyBBdCB0aGlzIHBvaW50IGJvdGggbnVtYmVycyBhcmUgcG9zaXRpdmVcbiAgICB2YXIgY21wID0gdGhpcy5jbXAobnVtKTtcblxuICAgIC8vIE9wdGltaXphdGlvbiAtIHplcm9pZnlcbiAgICBpZiAoY21wID09PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAwO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gYSA+IGJcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAoY21wID4gMCkge1xuICAgICAgYSA9IHRoaXM7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gbnVtO1xuICAgICAgYiA9IHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSAoYS53b3Jkc1tpXSB8IDApIC0gKGIud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgY2FycnkgPSByID4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgfVxuICAgIGZvciAoOyBjYXJyeSAhPT0gMCAmJiBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gciA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIC8vIENvcHkgcmVzdCBvZiB0aGUgd29yZHNcbiAgICBpZiAoY2FycnkgPT09IDAgJiYgaSA8IGEubGVuZ3RoICYmIGEgIT09IHRoaXMpIHtcbiAgICAgIGZvciAoOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoLCBpKTtcblxuICAgIGlmIChhICE9PSB0aGlzKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIC8vIFN1YnRyYWN0IGBudW1gIGZyb20gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zdWIgPSBmdW5jdGlvbiBzdWIgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXN1YihudW0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHNtYWxsTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgb3V0Lm5lZ2F0aXZlID0gbnVtLm5lZ2F0aXZlIF4gc2VsZi5uZWdhdGl2ZTtcbiAgICB2YXIgbGVuID0gKHNlbGYubGVuZ3RoICsgbnVtLmxlbmd0aCkgfCAwO1xuICAgIG91dC5sZW5ndGggPSBsZW47XG4gICAgbGVuID0gKGxlbiAtIDEpIHwgMDtcblxuICAgIC8vIFBlZWwgb25lIGl0ZXJhdGlvbiAoY29tcGlsZXIgY2FuJ3QgZG8gaXQsIGJlY2F1c2Ugb2YgY29kZSBjb21wbGV4aXR5KVxuICAgIHZhciBhID0gc2VsZi53b3Jkc1swXSB8IDA7XG4gICAgdmFyIGIgPSBudW0ud29yZHNbMF0gfCAwO1xuICAgIHZhciByID0gYSAqIGI7XG5cbiAgICB2YXIgbG8gPSByICYgMHgzZmZmZmZmO1xuICAgIHZhciBjYXJyeSA9IChyIC8gMHg0MDAwMDAwKSB8IDA7XG4gICAgb3V0LndvcmRzWzBdID0gbG87XG5cbiAgICBmb3IgKHZhciBrID0gMTsgayA8IGxlbjsgaysrKSB7XG4gICAgICAvLyBTdW0gYWxsIHdvcmRzIHdpdGggdGhlIHNhbWUgYGkgKyBqID0ga2AgYW5kIGFjY3VtdWxhdGUgYG5jYXJyeWAsXG4gICAgICAvLyBub3RlIHRoYXQgbmNhcnJ5IGNvdWxkIGJlID49IDB4M2ZmZmZmZlxuICAgICAgdmFyIG5jYXJyeSA9IGNhcnJ5ID4+PiAyNjtcbiAgICAgIHZhciByd29yZCA9IGNhcnJ5ICYgMHgzZmZmZmZmO1xuICAgICAgdmFyIG1heEogPSBNYXRoLm1pbihrLCBudW0ubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBqID0gTWF0aC5tYXgoMCwgayAtIHNlbGYubGVuZ3RoICsgMSk7IGogPD0gbWF4SjsgaisrKSB7XG4gICAgICAgIHZhciBpID0gKGsgLSBqKSB8IDA7XG4gICAgICAgIGEgPSBzZWxmLndvcmRzW2ldIHwgMDtcbiAgICAgICAgYiA9IG51bS53b3Jkc1tqXSB8IDA7XG4gICAgICAgIHIgPSBhICogYiArIHJ3b3JkO1xuICAgICAgICBuY2FycnkgKz0gKHIgLyAweDQwMDAwMDApIHwgMDtcbiAgICAgICAgcndvcmQgPSByICYgMHgzZmZmZmZmO1xuICAgICAgfVxuICAgICAgb3V0LndvcmRzW2tdID0gcndvcmQgfCAwO1xuICAgICAgY2FycnkgPSBuY2FycnkgfCAwO1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIG91dC53b3Jkc1trXSA9IGNhcnJ5IHwgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0Lmxlbmd0aC0tO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQuc3RyaXAoKTtcbiAgfVxuXG4gIC8vIFRPRE8oaW5kdXRueSk6IGl0IG1heSBiZSByZWFzb25hYmxlIHRvIG9taXQgaXQgZm9yIHVzZXJzIHdobyBkb24ndCBuZWVkXG4gIC8vIHRvIHdvcmsgd2l0aCAyNTYtYml0IG51bWJlcnMsIG90aGVyd2lzZSBpdCBnaXZlcyAyMCUgaW1wcm92ZW1lbnQgZm9yIDI1Ni1iaXRcbiAgLy8gbXVsdGlwbGljYXRpb24gKGxpa2UgZWxsaXB0aWMgc2VjcDI1NmsxKS5cbiAgdmFyIGNvbWIxME11bFRvID0gZnVuY3Rpb24gY29tYjEwTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgdmFyIGEgPSBzZWxmLndvcmRzO1xuICAgIHZhciBiID0gbnVtLndvcmRzO1xuICAgIHZhciBvID0gb3V0LndvcmRzO1xuICAgIHZhciBjID0gMDtcbiAgICB2YXIgbG87XG4gICAgdmFyIG1pZDtcbiAgICB2YXIgaGk7XG4gICAgdmFyIGEwID0gYVswXSB8IDA7XG4gICAgdmFyIGFsMCA9IGEwICYgMHgxZmZmO1xuICAgIHZhciBhaDAgPSBhMCA+Pj4gMTM7XG4gICAgdmFyIGExID0gYVsxXSB8IDA7XG4gICAgdmFyIGFsMSA9IGExICYgMHgxZmZmO1xuICAgIHZhciBhaDEgPSBhMSA+Pj4gMTM7XG4gICAgdmFyIGEyID0gYVsyXSB8IDA7XG4gICAgdmFyIGFsMiA9IGEyICYgMHgxZmZmO1xuICAgIHZhciBhaDIgPSBhMiA+Pj4gMTM7XG4gICAgdmFyIGEzID0gYVszXSB8IDA7XG4gICAgdmFyIGFsMyA9IGEzICYgMHgxZmZmO1xuICAgIHZhciBhaDMgPSBhMyA+Pj4gMTM7XG4gICAgdmFyIGE0ID0gYVs0XSB8IDA7XG4gICAgdmFyIGFsNCA9IGE0ICYgMHgxZmZmO1xuICAgIHZhciBhaDQgPSBhNCA+Pj4gMTM7XG4gICAgdmFyIGE1ID0gYVs1XSB8IDA7XG4gICAgdmFyIGFsNSA9IGE1ICYgMHgxZmZmO1xuICAgIHZhciBhaDUgPSBhNSA+Pj4gMTM7XG4gICAgdmFyIGE2ID0gYVs2XSB8IDA7XG4gICAgdmFyIGFsNiA9IGE2ICYgMHgxZmZmO1xuICAgIHZhciBhaDYgPSBhNiA+Pj4gMTM7XG4gICAgdmFyIGE3ID0gYVs3XSB8IDA7XG4gICAgdmFyIGFsNyA9IGE3ICYgMHgxZmZmO1xuICAgIHZhciBhaDcgPSBhNyA+Pj4gMTM7XG4gICAgdmFyIGE4ID0gYVs4XSB8IDA7XG4gICAgdmFyIGFsOCA9IGE4ICYgMHgxZmZmO1xuICAgIHZhciBhaDggPSBhOCA+Pj4gMTM7XG4gICAgdmFyIGE5ID0gYVs5XSB8IDA7XG4gICAgdmFyIGFsOSA9IGE5ICYgMHgxZmZmO1xuICAgIHZhciBhaDkgPSBhOSA+Pj4gMTM7XG4gICAgdmFyIGIwID0gYlswXSB8IDA7XG4gICAgdmFyIGJsMCA9IGIwICYgMHgxZmZmO1xuICAgIHZhciBiaDAgPSBiMCA+Pj4gMTM7XG4gICAgdmFyIGIxID0gYlsxXSB8IDA7XG4gICAgdmFyIGJsMSA9IGIxICYgMHgxZmZmO1xuICAgIHZhciBiaDEgPSBiMSA+Pj4gMTM7XG4gICAgdmFyIGIyID0gYlsyXSB8IDA7XG4gICAgdmFyIGJsMiA9IGIyICYgMHgxZmZmO1xuICAgIHZhciBiaDIgPSBiMiA+Pj4gMTM7XG4gICAgdmFyIGIzID0gYlszXSB8IDA7XG4gICAgdmFyIGJsMyA9IGIzICYgMHgxZmZmO1xuICAgIHZhciBiaDMgPSBiMyA+Pj4gMTM7XG4gICAgdmFyIGI0ID0gYls0XSB8IDA7XG4gICAgdmFyIGJsNCA9IGI0ICYgMHgxZmZmO1xuICAgIHZhciBiaDQgPSBiNCA+Pj4gMTM7XG4gICAgdmFyIGI1ID0gYls1XSB8IDA7XG4gICAgdmFyIGJsNSA9IGI1ICYgMHgxZmZmO1xuICAgIHZhciBiaDUgPSBiNSA+Pj4gMTM7XG4gICAgdmFyIGI2ID0gYls2XSB8IDA7XG4gICAgdmFyIGJsNiA9IGI2ICYgMHgxZmZmO1xuICAgIHZhciBiaDYgPSBiNiA+Pj4gMTM7XG4gICAgdmFyIGI3ID0gYls3XSB8IDA7XG4gICAgdmFyIGJsNyA9IGI3ICYgMHgxZmZmO1xuICAgIHZhciBiaDcgPSBiNyA+Pj4gMTM7XG4gICAgdmFyIGI4ID0gYls4XSB8IDA7XG4gICAgdmFyIGJsOCA9IGI4ICYgMHgxZmZmO1xuICAgIHZhciBiaDggPSBiOCA+Pj4gMTM7XG4gICAgdmFyIGI5ID0gYls5XSB8IDA7XG4gICAgdmFyIGJsOSA9IGI5ICYgMHgxZmZmO1xuICAgIHZhciBiaDkgPSBiOSA+Pj4gMTM7XG5cbiAgICBvdXQubmVnYXRpdmUgPSBzZWxmLm5lZ2F0aXZlIF4gbnVtLm5lZ2F0aXZlO1xuICAgIG91dC5sZW5ndGggPSAxOTtcbiAgICAvKiBrID0gMCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMCwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwwLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgwLCBiaDApO1xuICAgIHZhciB3MCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzAgPj4+IDI2KSkgfCAwO1xuICAgIHcwICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMSwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwxLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgxLCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoMSkpIHwgMDtcbiAgICB2YXIgdzEgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxID4+PiAyNikpIHwgMDtcbiAgICB3MSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDIgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDIsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsMiwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoMiwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmgyKSkgfCAwO1xuICAgIHZhciB3MiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzIgPj4+IDI2KSkgfCAwO1xuICAgIHcyICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMywgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwzLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgzLCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmgzKSkgfCAwO1xuICAgIHZhciB3MyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzMgPj4+IDI2KSkgfCAwO1xuICAgIHczICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNCwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw0LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg0LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoNCkpIHwgMDtcbiAgICB2YXIgdzQgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc0ID4+PiAyNikpIHwgMDtcbiAgICB3NCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDUgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDUsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsNSwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoNSwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg1KSkgfCAwO1xuICAgIHZhciB3NSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzUgPj4+IDI2KSkgfCAwO1xuICAgIHc1ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNiwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw2LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg2LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg2KSkgfCAwO1xuICAgIHZhciB3NiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzYgPj4+IDI2KSkgfCAwO1xuICAgIHc2ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNywgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw3LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg3LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoNykpIHwgMDtcbiAgICB2YXIgdzcgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc3ID4+PiAyNikpIHwgMDtcbiAgICB3NyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDggKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDgsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOCwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOCwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg4KSkgfCAwO1xuICAgIHZhciB3OCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzggPj4+IDI2KSkgfCAwO1xuICAgIHc4ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gOSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg5KSkgfCAwO1xuICAgIHZhciB3OSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzkgPj4+IDI2KSkgfCAwO1xuICAgIHc5ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTAgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMSk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgxKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmwxKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgxKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTAgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMCA+Pj4gMjYpKSB8IDA7XG4gICAgdzEwICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTEgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMik7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgyKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmwyKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgyKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxMSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzExID4+PiAyNikpIHwgMDtcbiAgICB3MTEgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwzKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDMpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDMpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDMpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg5KSkgfCAwO1xuICAgIHZhciB3MTIgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMiA+Pj4gMjYpKSB8IDA7XG4gICAgdzEyICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTMgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg0KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw0KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg0KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTMgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMyA+Pj4gMjYpKSB8IDA7XG4gICAgdzEzICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTQgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNSk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg1KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw1KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg1KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE0ID4+PiAyNikpIHwgMDtcbiAgICB3MTQgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw2KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDYpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDYpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDYpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTUgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxNSA+Pj4gMjYpKSB8IDA7XG4gICAgdzE1ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTYgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNyk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg3KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw3KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg3KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg5KSkgfCAwO1xuICAgIHZhciB3MTYgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxNiA+Pj4gMjYpKSB8IDA7XG4gICAgdzE2ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTcgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsOCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg4KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw4KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg4KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE3ID4+PiAyNikpIHwgMDtcbiAgICB3MTcgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxOCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw5KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDkpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDkpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDkpO1xuICAgIHZhciB3MTggPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxOCA+Pj4gMjYpKSB8IDA7XG4gICAgdzE4ICY9IDB4M2ZmZmZmZjtcbiAgICBvWzBdID0gdzA7XG4gICAgb1sxXSA9IHcxO1xuICAgIG9bMl0gPSB3MjtcbiAgICBvWzNdID0gdzM7XG4gICAgb1s0XSA9IHc0O1xuICAgIG9bNV0gPSB3NTtcbiAgICBvWzZdID0gdzY7XG4gICAgb1s3XSA9IHc3O1xuICAgIG9bOF0gPSB3ODtcbiAgICBvWzldID0gdzk7XG4gICAgb1sxMF0gPSB3MTA7XG4gICAgb1sxMV0gPSB3MTE7XG4gICAgb1sxMl0gPSB3MTI7XG4gICAgb1sxM10gPSB3MTM7XG4gICAgb1sxNF0gPSB3MTQ7XG4gICAgb1sxNV0gPSB3MTU7XG4gICAgb1sxNl0gPSB3MTY7XG4gICAgb1sxN10gPSB3MTc7XG4gICAgb1sxOF0gPSB3MTg7XG4gICAgaWYgKGMgIT09IDApIHtcbiAgICAgIG9bMTldID0gYztcbiAgICAgIG91dC5sZW5ndGgrKztcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfTtcblxuICAvLyBQb2x5ZmlsbCBjb21iXG4gIGlmICghTWF0aC5pbXVsKSB7XG4gICAgY29tYjEwTXVsVG8gPSBzbWFsbE11bFRvO1xuICB9XG5cbiAgZnVuY3Rpb24gYmlnTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgb3V0Lm5lZ2F0aXZlID0gbnVtLm5lZ2F0aXZlIF4gc2VsZi5uZWdhdGl2ZTtcbiAgICBvdXQubGVuZ3RoID0gc2VsZi5sZW5ndGggKyBudW0ubGVuZ3RoO1xuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICB2YXIgaG5jYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBvdXQubGVuZ3RoIC0gMTsgaysrKSB7XG4gICAgICAvLyBTdW0gYWxsIHdvcmRzIHdpdGggdGhlIHNhbWUgYGkgKyBqID0ga2AgYW5kIGFjY3VtdWxhdGUgYG5jYXJyeWAsXG4gICAgICAvLyBub3RlIHRoYXQgbmNhcnJ5IGNvdWxkIGJlID49IDB4M2ZmZmZmZlxuICAgICAgdmFyIG5jYXJyeSA9IGhuY2Fycnk7XG4gICAgICBobmNhcnJ5ID0gMDtcbiAgICAgIHZhciByd29yZCA9IGNhcnJ5ICYgMHgzZmZmZmZmO1xuICAgICAgdmFyIG1heEogPSBNYXRoLm1pbihrLCBudW0ubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBqID0gTWF0aC5tYXgoMCwgayAtIHNlbGYubGVuZ3RoICsgMSk7IGogPD0gbWF4SjsgaisrKSB7XG4gICAgICAgIHZhciBpID0gayAtIGo7XG4gICAgICAgIHZhciBhID0gc2VsZi53b3Jkc1tpXSB8IDA7XG4gICAgICAgIHZhciBiID0gbnVtLndvcmRzW2pdIHwgMDtcbiAgICAgICAgdmFyIHIgPSBhICogYjtcblxuICAgICAgICB2YXIgbG8gPSByICYgMHgzZmZmZmZmO1xuICAgICAgICBuY2FycnkgPSAobmNhcnJ5ICsgKChyIC8gMHg0MDAwMDAwKSB8IDApKSB8IDA7XG4gICAgICAgIGxvID0gKGxvICsgcndvcmQpIHwgMDtcbiAgICAgICAgcndvcmQgPSBsbyAmIDB4M2ZmZmZmZjtcbiAgICAgICAgbmNhcnJ5ID0gKG5jYXJyeSArIChsbyA+Pj4gMjYpKSB8IDA7XG5cbiAgICAgICAgaG5jYXJyeSArPSBuY2FycnkgPj4+IDI2O1xuICAgICAgICBuY2FycnkgJj0gMHgzZmZmZmZmO1xuICAgICAgfVxuICAgICAgb3V0LndvcmRzW2tdID0gcndvcmQ7XG4gICAgICBjYXJyeSA9IG5jYXJyeTtcbiAgICAgIG5jYXJyeSA9IGhuY2Fycnk7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgb3V0LndvcmRzW2tdID0gY2Fycnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5sZW5ndGgtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0LnN0cmlwKCk7XG4gIH1cblxuICBmdW5jdGlvbiBqdW1ib011bFRvIChzZWxmLCBudW0sIG91dCkge1xuICAgIHZhciBmZnRtID0gbmV3IEZGVE0oKTtcbiAgICByZXR1cm4gZmZ0bS5tdWxwKHNlbGYsIG51bSwgb3V0KTtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5tdWxUbyA9IGZ1bmN0aW9uIG11bFRvIChudW0sIG91dCkge1xuICAgIHZhciByZXM7XG4gICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoICsgbnVtLmxlbmd0aDtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEwICYmIG51bS5sZW5ndGggPT09IDEwKSB7XG4gICAgICByZXMgPSBjb21iMTBNdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfSBlbHNlIGlmIChsZW4gPCA2Mykge1xuICAgICAgcmVzID0gc21hbGxNdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfSBlbHNlIGlmIChsZW4gPCAxMDI0KSB7XG4gICAgICByZXMgPSBiaWdNdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IGp1bWJvTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gQ29vbGV5LVR1a2V5IGFsZ29yaXRobSBmb3IgRkZUXG4gIC8vIHNsaWdodGx5IHJldmlzaXRlZCB0byByZWx5IG9uIGxvb3BpbmcgaW5zdGVhZCBvZiByZWN1cnNpb25cblxuICBmdW5jdGlvbiBGRlRNICh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICB9XG5cbiAgRkZUTS5wcm90b3R5cGUubWFrZVJCVCA9IGZ1bmN0aW9uIG1ha2VSQlQgKE4pIHtcbiAgICB2YXIgdCA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgbCA9IEJOLnByb3RvdHlwZS5fY291bnRCaXRzKE4pIC0gMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgdFtpXSA9IHRoaXMucmV2QmluKGksIGwsIE4pO1xuICAgIH1cblxuICAgIHJldHVybiB0O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYmluYXJ5LXJldmVyc2VkIHJlcHJlc2VudGF0aW9uIG9mIGB4YFxuICBGRlRNLnByb3RvdHlwZS5yZXZCaW4gPSBmdW5jdGlvbiByZXZCaW4gKHgsIGwsIE4pIHtcbiAgICBpZiAoeCA9PT0gMCB8fCB4ID09PSBOIC0gMSkgcmV0dXJuIHg7XG5cbiAgICB2YXIgcmIgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICByYiB8PSAoeCAmIDEpIDw8IChsIC0gaSAtIDEpO1xuICAgICAgeCA+Pj0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmI7XG4gIH07XG5cbiAgLy8gUGVyZm9ybXMgXCJ0d2VlZGxpbmdcIiBwaGFzZSwgdGhlcmVmb3JlICdlbXVsYXRpbmcnXG4gIC8vIGJlaGF2aW91ciBvZiB0aGUgcmVjdXJzaXZlIGFsZ29yaXRobVxuICBGRlRNLnByb3RvdHlwZS5wZXJtdXRlID0gZnVuY3Rpb24gcGVybXV0ZSAocmJ0LCByd3MsIGl3cywgcnR3cywgaXR3cywgTikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICBydHdzW2ldID0gcndzW3JidFtpXV07XG4gICAgICBpdHdzW2ldID0gaXdzW3JidFtpXV07XG4gICAgfVxuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIHRyYW5zZm9ybSAocndzLCBpd3MsIHJ0d3MsIGl0d3MsIE4sIHJidCkge1xuICAgIHRoaXMucGVybXV0ZShyYnQsIHJ3cywgaXdzLCBydHdzLCBpdHdzLCBOKTtcblxuICAgIGZvciAodmFyIHMgPSAxOyBzIDwgTjsgcyA8PD0gMSkge1xuICAgICAgdmFyIGwgPSBzIDw8IDE7XG5cbiAgICAgIHZhciBydHdkZiA9IE1hdGguY29zKDIgKiBNYXRoLlBJIC8gbCk7XG4gICAgICB2YXIgaXR3ZGYgPSBNYXRoLnNpbigyICogTWF0aC5QSSAvIGwpO1xuXG4gICAgICBmb3IgKHZhciBwID0gMDsgcCA8IE47IHAgKz0gbCkge1xuICAgICAgICB2YXIgcnR3ZGZfID0gcnR3ZGY7XG4gICAgICAgIHZhciBpdHdkZl8gPSBpdHdkZjtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHM7IGorKykge1xuICAgICAgICAgIHZhciByZSA9IHJ0d3NbcCArIGpdO1xuICAgICAgICAgIHZhciBpZSA9IGl0d3NbcCArIGpdO1xuXG4gICAgICAgICAgdmFyIHJvID0gcnR3c1twICsgaiArIHNdO1xuICAgICAgICAgIHZhciBpbyA9IGl0d3NbcCArIGogKyBzXTtcblxuICAgICAgICAgIHZhciByeCA9IHJ0d2RmXyAqIHJvIC0gaXR3ZGZfICogaW87XG5cbiAgICAgICAgICBpbyA9IHJ0d2RmXyAqIGlvICsgaXR3ZGZfICogcm87XG4gICAgICAgICAgcm8gPSByeDtcblxuICAgICAgICAgIHJ0d3NbcCArIGpdID0gcmUgKyBybztcbiAgICAgICAgICBpdHdzW3AgKyBqXSA9IGllICsgaW87XG5cbiAgICAgICAgICBydHdzW3AgKyBqICsgc10gPSByZSAtIHJvO1xuICAgICAgICAgIGl0d3NbcCArIGogKyBzXSA9IGllIC0gaW87XG5cbiAgICAgICAgICAvKiBqc2hpbnQgbWF4ZGVwdGggOiBmYWxzZSAqL1xuICAgICAgICAgIGlmIChqICE9PSBsKSB7XG4gICAgICAgICAgICByeCA9IHJ0d2RmICogcnR3ZGZfIC0gaXR3ZGYgKiBpdHdkZl87XG5cbiAgICAgICAgICAgIGl0d2RmXyA9IHJ0d2RmICogaXR3ZGZfICsgaXR3ZGYgKiBydHdkZl87XG4gICAgICAgICAgICBydHdkZl8gPSByeDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuZ3Vlc3NMZW4xM2IgPSBmdW5jdGlvbiBndWVzc0xlbjEzYiAobiwgbSkge1xuICAgIHZhciBOID0gTWF0aC5tYXgobSwgbikgfCAxO1xuICAgIHZhciBvZGQgPSBOICYgMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgZm9yIChOID0gTiAvIDIgfCAwOyBOOyBOID0gTiA+Pj4gMSkge1xuICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybiAxIDw8IGkgKyAxICsgb2RkO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLmNvbmp1Z2F0ZSA9IGZ1bmN0aW9uIGNvbmp1Z2F0ZSAocndzLCBpd3MsIE4pIHtcbiAgICBpZiAoTiA8PSAxKSByZXR1cm47XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE4gLyAyOyBpKyspIHtcbiAgICAgIHZhciB0ID0gcndzW2ldO1xuXG4gICAgICByd3NbaV0gPSByd3NbTiAtIGkgLSAxXTtcbiAgICAgIHJ3c1tOIC0gaSAtIDFdID0gdDtcblxuICAgICAgdCA9IGl3c1tpXTtcblxuICAgICAgaXdzW2ldID0gLWl3c1tOIC0gaSAtIDFdO1xuICAgICAgaXdzW04gLSBpIC0gMV0gPSAtdDtcbiAgICB9XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUubm9ybWFsaXplMTNiID0gZnVuY3Rpb24gbm9ybWFsaXplMTNiICh3cywgTikge1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOIC8gMjsgaSsrKSB7XG4gICAgICB2YXIgdyA9IE1hdGgucm91bmQod3NbMiAqIGkgKyAxXSAvIE4pICogMHgyMDAwICtcbiAgICAgICAgTWF0aC5yb3VuZCh3c1syICogaV0gLyBOKSArXG4gICAgICAgIGNhcnJ5O1xuXG4gICAgICB3c1tpXSA9IHcgJiAweDNmZmZmZmY7XG5cbiAgICAgIGlmICh3IDwgMHg0MDAwMDAwKSB7XG4gICAgICAgIGNhcnJ5ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhcnJ5ID0gdyAvIDB4NDAwMDAwMCB8IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHdzO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLmNvbnZlcnQxM2IgPSBmdW5jdGlvbiBjb252ZXJ0MTNiICh3cywgbGVuLCByd3MsIE4pIHtcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNhcnJ5ID0gY2FycnkgKyAod3NbaV0gfCAwKTtcblxuICAgICAgcndzWzIgKiBpXSA9IGNhcnJ5ICYgMHgxZmZmOyBjYXJyeSA9IGNhcnJ5ID4+PiAxMztcbiAgICAgIHJ3c1syICogaSArIDFdID0gY2FycnkgJiAweDFmZmY7IGNhcnJ5ID0gY2FycnkgPj4+IDEzO1xuICAgIH1cblxuICAgIC8vIFBhZCB3aXRoIHplcm9lc1xuICAgIGZvciAoaSA9IDIgKiBsZW47IGkgPCBOOyArK2kpIHtcbiAgICAgIHJ3c1tpXSA9IDA7XG4gICAgfVxuXG4gICAgYXNzZXJ0KGNhcnJ5ID09PSAwKTtcbiAgICBhc3NlcnQoKGNhcnJ5ICYgfjB4MWZmZikgPT09IDApO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLnN0dWIgPSBmdW5jdGlvbiBzdHViIChOKSB7XG4gICAgdmFyIHBoID0gbmV3IEFycmF5KE4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICBwaFtpXSA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBoO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLm11bHAgPSBmdW5jdGlvbiBtdWxwICh4LCB5LCBvdXQpIHtcbiAgICB2YXIgTiA9IDIgKiB0aGlzLmd1ZXNzTGVuMTNiKHgubGVuZ3RoLCB5Lmxlbmd0aCk7XG5cbiAgICB2YXIgcmJ0ID0gdGhpcy5tYWtlUkJUKE4pO1xuXG4gICAgdmFyIF8gPSB0aGlzLnN0dWIoTik7XG5cbiAgICB2YXIgcndzID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciByd3N0ID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBpd3N0ID0gbmV3IEFycmF5KE4pO1xuXG4gICAgdmFyIG5yd3MgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIG5yd3N0ID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBuaXdzdCA9IG5ldyBBcnJheShOKTtcblxuICAgIHZhciBybXdzID0gb3V0LndvcmRzO1xuICAgIHJtd3MubGVuZ3RoID0gTjtcblxuICAgIHRoaXMuY29udmVydDEzYih4LndvcmRzLCB4Lmxlbmd0aCwgcndzLCBOKTtcbiAgICB0aGlzLmNvbnZlcnQxM2IoeS53b3JkcywgeS5sZW5ndGgsIG5yd3MsIE4pO1xuXG4gICAgdGhpcy50cmFuc2Zvcm0ocndzLCBfLCByd3N0LCBpd3N0LCBOLCByYnQpO1xuICAgIHRoaXMudHJhbnNmb3JtKG5yd3MsIF8sIG5yd3N0LCBuaXdzdCwgTiwgcmJ0KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICB2YXIgcnggPSByd3N0W2ldICogbnJ3c3RbaV0gLSBpd3N0W2ldICogbml3c3RbaV07XG4gICAgICBpd3N0W2ldID0gcndzdFtpXSAqIG5pd3N0W2ldICsgaXdzdFtpXSAqIG5yd3N0W2ldO1xuICAgICAgcndzdFtpXSA9IHJ4O1xuICAgIH1cblxuICAgIHRoaXMuY29uanVnYXRlKHJ3c3QsIGl3c3QsIE4pO1xuICAgIHRoaXMudHJhbnNmb3JtKHJ3c3QsIGl3c3QsIHJtd3MsIF8sIE4sIHJidCk7XG4gICAgdGhpcy5jb25qdWdhdGUocm13cywgXywgTik7XG4gICAgdGhpcy5ub3JtYWxpemUxM2Iocm13cywgTik7XG5cbiAgICBvdXQubmVnYXRpdmUgPSB4Lm5lZ2F0aXZlIF4geS5uZWdhdGl2ZTtcbiAgICBvdXQubGVuZ3RoID0geC5sZW5ndGggKyB5Lmxlbmd0aDtcbiAgICByZXR1cm4gb3V0LnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gTXVsdGlwbHkgYHRoaXNgIGJ5IGBudW1gXG4gIEJOLnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwgKG51bSkge1xuICAgIHZhciBvdXQgPSBuZXcgQk4obnVsbCk7XG4gICAgb3V0LndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoICsgbnVtLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRoaXMubXVsVG8obnVtLCBvdXQpO1xuICB9O1xuXG4gIC8vIE11bHRpcGx5IGVtcGxveWluZyBGRlRcbiAgQk4ucHJvdG90eXBlLm11bGYgPSBmdW5jdGlvbiBtdWxmIChudW0pIHtcbiAgICB2YXIgb3V0ID0gbmV3IEJOKG51bGwpO1xuICAgIG91dC53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCArIG51bS5sZW5ndGgpO1xuICAgIHJldHVybiBqdW1ib011bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgfTtcblxuICAvLyBJbi1wbGFjZSBNdWx0aXBsaWNhdGlvblxuICBCTi5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uIGltdWwgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkubXVsVG8obnVtLCB0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaW11bG4gPSBmdW5jdGlvbiBpbXVsbiAobnVtKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBudW0gPT09ICdudW1iZXInKTtcbiAgICBhc3NlcnQobnVtIDwgMHg0MDAwMDAwKTtcblxuICAgIC8vIENhcnJ5XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3ID0gKHRoaXMud29yZHNbaV0gfCAwKSAqIG51bTtcbiAgICAgIHZhciBsbyA9ICh3ICYgMHgzZmZmZmZmKSArIChjYXJyeSAmIDB4M2ZmZmZmZik7XG4gICAgICBjYXJyeSA+Pj0gMjY7XG4gICAgICBjYXJyeSArPSAodyAvIDB4NDAwMDAwMCkgfCAwO1xuICAgICAgLy8gTk9URTogbG8gaXMgMjdiaXQgbWF4aW11bVxuICAgICAgY2FycnkgKz0gbG8gPj4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGxvICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGNhcnJ5O1xuICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICB9XG4gICAgdGhpcy5sZW5ndGggPSBudW0gPT09IDAgPyAxIDogdGhpcy5sZW5ndGg7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubXVsbiA9IGZ1bmN0aW9uIG11bG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW11bG4obnVtKTtcbiAgfTtcblxuICAvLyBgdGhpc2AgKiBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uIHNxciAoKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsKHRoaXMpO1xuICB9O1xuXG4gIC8vIGB0aGlzYCAqIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXNxciA9IGZ1bmN0aW9uIGlzcXIgKCkge1xuICAgIHJldHVybiB0aGlzLmltdWwodGhpcy5jbG9uZSgpKTtcbiAgfTtcblxuICAvLyBNYXRoLnBvdyhgdGhpc2AsIGBudW1gKVxuICBCTi5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24gcG93IChudW0pIHtcbiAgICB2YXIgdyA9IHRvQml0QXJyYXkobnVtKTtcbiAgICBpZiAody5sZW5ndGggPT09IDApIHJldHVybiBuZXcgQk4oMSk7XG5cbiAgICAvLyBTa2lwIGxlYWRpbmcgemVyb2VzXG4gICAgdmFyIHJlcyA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3Lmxlbmd0aDsgaSsrLCByZXMgPSByZXMuc3FyKCkpIHtcbiAgICAgIGlmICh3W2ldICE9PSAwKSBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoKytpIDwgdy5sZW5ndGgpIHtcbiAgICAgIGZvciAodmFyIHEgPSByZXMuc3FyKCk7IGkgPCB3Lmxlbmd0aDsgaSsrLCBxID0gcS5zcXIoKSkge1xuICAgICAgICBpZiAod1tpXSA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgcmVzID0gcmVzLm11bChxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIFNoaWZ0LWxlZnQgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1c2hsbiA9IGZ1bmN0aW9uIGl1c2hsbiAoYml0cykge1xuICAgIGFzc2VydCh0eXBlb2YgYml0cyA9PT0gJ251bWJlcicgJiYgYml0cyA+PSAwKTtcbiAgICB2YXIgciA9IGJpdHMgJSAyNjtcbiAgICB2YXIgcyA9IChiaXRzIC0gcikgLyAyNjtcbiAgICB2YXIgY2FycnlNYXNrID0gKDB4M2ZmZmZmZiA+Pj4gKDI2IC0gcikpIDw8ICgyNiAtIHIpO1xuICAgIHZhciBpO1xuXG4gICAgaWYgKHIgIT09IDApIHtcbiAgICAgIHZhciBjYXJyeSA9IDA7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBuZXdDYXJyeSA9IHRoaXMud29yZHNbaV0gJiBjYXJyeU1hc2s7XG4gICAgICAgIHZhciBjID0gKCh0aGlzLndvcmRzW2ldIHwgMCkgLSBuZXdDYXJyeSkgPDwgcjtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGMgfCBjYXJyeTtcbiAgICAgICAgY2FycnkgPSBuZXdDYXJyeSA+Pj4gKDI2IC0gcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChjYXJyeSkge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gY2Fycnk7XG4gICAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHMgIT09IDApIHtcbiAgICAgIGZvciAoaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpICsgc10gPSB0aGlzLndvcmRzW2ldO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSAwO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxlbmd0aCArPSBzO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzaGxuID0gZnVuY3Rpb24gaXNobG4gKGJpdHMpIHtcbiAgICAvLyBUT0RPKGluZHV0bnkpOiBpbXBsZW1lbnQgbWVcbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXVzaGxuKGJpdHMpO1xuICB9O1xuXG4gIC8vIFNoaWZ0LXJpZ2h0IGluLXBsYWNlXG4gIC8vIE5PVEU6IGBoaW50YCBpcyBhIGxvd2VzdCBiaXQgYmVmb3JlIHRyYWlsaW5nIHplcm9lc1xuICAvLyBOT1RFOiBpZiBgZXh0ZW5kZWRgIGlzIHByZXNlbnQgLSBpdCB3aWxsIGJlIGZpbGxlZCB3aXRoIGRlc3Ryb3llZCBiaXRzXG4gIEJOLnByb3RvdHlwZS5pdXNocm4gPSBmdW5jdGlvbiBpdXNocm4gKGJpdHMsIGhpbnQsIGV4dGVuZGVkKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXRzID09PSAnbnVtYmVyJyAmJiBiaXRzID49IDApO1xuICAgIHZhciBoO1xuICAgIGlmIChoaW50KSB7XG4gICAgICBoID0gKGhpbnQgLSAoaGludCAlIDI2KSkgLyAyNjtcbiAgICB9IGVsc2Uge1xuICAgICAgaCA9IDA7XG4gICAgfVxuXG4gICAgdmFyIHIgPSBiaXRzICUgMjY7XG4gICAgdmFyIHMgPSBNYXRoLm1pbigoYml0cyAtIHIpIC8gMjYsIHRoaXMubGVuZ3RoKTtcbiAgICB2YXIgbWFzayA9IDB4M2ZmZmZmZiBeICgoMHgzZmZmZmZmID4+PiByKSA8PCByKTtcbiAgICB2YXIgbWFza2VkV29yZHMgPSBleHRlbmRlZDtcblxuICAgIGggLT0gcztcbiAgICBoID0gTWF0aC5tYXgoMCwgaCk7XG5cbiAgICAvLyBFeHRlbmRlZCBtb2RlLCBjb3B5IG1hc2tlZCBwYXJ0XG4gICAgaWYgKG1hc2tlZFdvcmRzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHM7IGkrKykge1xuICAgICAgICBtYXNrZWRXb3Jkcy53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV07XG4gICAgICB9XG4gICAgICBtYXNrZWRXb3Jkcy5sZW5ndGggPSBzO1xuICAgIH1cblxuICAgIGlmIChzID09PSAwKSB7XG4gICAgICAvLyBOby1vcCwgd2Ugc2hvdWxkIG5vdCBtb3ZlIGFueXRoaW5nIGF0IGFsbFxuICAgIH0gZWxzZSBpZiAodGhpcy5sZW5ndGggPiBzKSB7XG4gICAgICB0aGlzLmxlbmd0aCAtPSBzO1xuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IHRoaXMud29yZHNbaSArIHNdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndvcmRzWzBdID0gMDtcbiAgICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgICB9XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAoaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwICYmIChjYXJyeSAhPT0gMCB8fCBpID49IGgpOyBpLS0pIHtcbiAgICAgIHZhciB3b3JkID0gdGhpcy53b3Jkc1tpXSB8IDA7XG4gICAgICB0aGlzLndvcmRzW2ldID0gKGNhcnJ5IDw8ICgyNiAtIHIpKSB8ICh3b3JkID4+PiByKTtcbiAgICAgIGNhcnJ5ID0gd29yZCAmIG1hc2s7XG4gICAgfVxuXG4gICAgLy8gUHVzaCBjYXJyaWVkIGJpdHMgYXMgYSBtYXNrXG4gICAgaWYgKG1hc2tlZFdvcmRzICYmIGNhcnJ5ICE9PSAwKSB7XG4gICAgICBtYXNrZWRXb3Jkcy53b3Jkc1ttYXNrZWRXb3Jkcy5sZW5ndGgrK10gPSBjYXJyeTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAwO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzaHJuID0gZnVuY3Rpb24gaXNocm4gKGJpdHMsIGhpbnQsIGV4dGVuZGVkKSB7XG4gICAgLy8gVE9ETyhpbmR1dG55KTogaW1wbGVtZW50IG1lXG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1c2hybihiaXRzLCBoaW50LCBleHRlbmRlZCk7XG4gIH07XG5cbiAgLy8gU2hpZnQtbGVmdFxuICBCTi5wcm90b3R5cGUuc2hsbiA9IGZ1bmN0aW9uIHNobG4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaGxuKGJpdHMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51c2hsbiA9IGZ1bmN0aW9uIHVzaGxuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNobG4oYml0cyk7XG4gIH07XG5cbiAgLy8gU2hpZnQtcmlnaHRcbiAgQk4ucHJvdG90eXBlLnNocm4gPSBmdW5jdGlvbiBzaHJuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hybihiaXRzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudXNocm4gPSBmdW5jdGlvbiB1c2hybiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXVzaHJuKGJpdHMpO1xuICB9O1xuXG4gIC8vIFRlc3QgaWYgbiBiaXQgaXMgc2V0XG4gIEJOLnByb3RvdHlwZS50ZXN0biA9IGZ1bmN0aW9uIHRlc3RuIChiaXQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdCA9PT0gJ251bWJlcicgJiYgYml0ID49IDApO1xuICAgIHZhciByID0gYml0ICUgMjY7XG4gICAgdmFyIHMgPSAoYml0IC0gcikgLyAyNjtcbiAgICB2YXIgcSA9IDEgPDwgcjtcblxuICAgIC8vIEZhc3QgY2FzZTogYml0IGlzIG11Y2ggaGlnaGVyIHRoYW4gYWxsIGV4aXN0aW5nIHdvcmRzXG4gICAgaWYgKHRoaXMubGVuZ3RoIDw9IHMpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIENoZWNrIGJpdCBhbmQgcmV0dXJuXG4gICAgdmFyIHcgPSB0aGlzLndvcmRzW3NdO1xuXG4gICAgcmV0dXJuICEhKHcgJiBxKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gb25seSBsb3dlcnMgYml0cyBvZiBudW1iZXIgKGluLXBsYWNlKVxuICBCTi5wcm90b3R5cGUuaW1hc2tuID0gZnVuY3Rpb24gaW1hc2tuIChiaXRzKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXRzID09PSAnbnVtYmVyJyAmJiBiaXRzID49IDApO1xuICAgIHZhciByID0gYml0cyAlIDI2O1xuICAgIHZhciBzID0gKGJpdHMgLSByKSAvIDI2O1xuXG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDAsICdpbWFza24gd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlIG51bWJlcnMnKTtcblxuICAgIGlmICh0aGlzLmxlbmd0aCA8PSBzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAociAhPT0gMCkge1xuICAgICAgcysrO1xuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGgubWluKHMsIHRoaXMubGVuZ3RoKTtcblxuICAgIGlmIChyICE9PSAwKSB7XG4gICAgICB2YXIgbWFzayA9IDB4M2ZmZmZmZiBeICgoMHgzZmZmZmZmID4+PiByKSA8PCByKTtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSAmPSBtYXNrO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG9ubHkgbG93ZXJzIGJpdHMgb2YgbnVtYmVyXG4gIEJOLnByb3RvdHlwZS5tYXNrbiA9IGZ1bmN0aW9uIG1hc2tuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbWFza24oYml0cyk7XG4gIH07XG5cbiAgLy8gQWRkIHBsYWluIG51bWJlciBgbnVtYCB0byBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmlhZGRuID0gZnVuY3Rpb24gaWFkZG4gKG51bSkge1xuICAgIGFzc2VydCh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyk7XG4gICAgYXNzZXJ0KG51bSA8IDB4NDAwMDAwMCk7XG4gICAgaWYgKG51bSA8IDApIHJldHVybiB0aGlzLmlzdWJuKC1udW0pO1xuXG4gICAgLy8gUG9zc2libGUgc2lnbiBjaGFuZ2VcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAxICYmICh0aGlzLndvcmRzWzBdIHwgMCkgPCBudW0pIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSA9IG51bSAtICh0aGlzLndvcmRzWzBdIHwgMCk7XG4gICAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmlzdWJuKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCB3aXRob3V0IGNoZWNrc1xuICAgIHJldHVybiB0aGlzLl9pYWRkbihudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faWFkZG4gPSBmdW5jdGlvbiBfaWFkZG4gKG51bSkge1xuICAgIHRoaXMud29yZHNbMF0gKz0gbnVtO1xuXG4gICAgLy8gQ2FycnlcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbaV0gPj0gMHg0MDAwMDAwOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gLT0gMHg0MDAwMDAwO1xuICAgICAgaWYgKGkgPT09IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgICB0aGlzLndvcmRzW2kgKyAxXSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndvcmRzW2kgKyAxXSsrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGgubWF4KHRoaXMubGVuZ3RoLCBpICsgMSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBTdWJ0cmFjdCBwbGFpbiBudW1iZXIgYG51bWAgZnJvbSBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmlzdWJuID0gZnVuY3Rpb24gaXN1Ym4gKG51bSkge1xuICAgIGFzc2VydCh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyk7XG4gICAgYXNzZXJ0KG51bSA8IDB4NDAwMDAwMCk7XG4gICAgaWYgKG51bSA8IDApIHJldHVybiB0aGlzLmlhZGRuKC1udW0pO1xuXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5pYWRkbihudW0pO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLndvcmRzWzBdIC09IG51bTtcblxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdIDwgMCkge1xuICAgICAgdGhpcy53b3Jkc1swXSA9IC10aGlzLndvcmRzWzBdO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhcnJ5XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbaV0gPCAwOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSArPSAweDQwMDAwMDA7XG4gICAgICAgIHRoaXMud29yZHNbaSArIDFdIC09IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuYWRkbiA9IGZ1bmN0aW9uIGFkZG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWFkZG4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuc3VibiA9IGZ1bmN0aW9uIHN1Ym4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXN1Ym4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaWFicyA9IGZ1bmN0aW9uIGlhYnMgKCkge1xuICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmFicyA9IGZ1bmN0aW9uIGFicyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWJzKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pc2hsbnN1Ym11bCA9IGZ1bmN0aW9uIF9pc2hsbnN1Ym11bCAobnVtLCBtdWwsIHNoaWZ0KSB7XG4gICAgdmFyIGxlbiA9IG51bS5sZW5ndGggKyBzaGlmdDtcbiAgICB2YXIgaTtcblxuICAgIHRoaXMuX2V4cGFuZChsZW4pO1xuXG4gICAgdmFyIHc7XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICB3ID0gKHRoaXMud29yZHNbaSArIHNoaWZ0XSB8IDApICsgY2Fycnk7XG4gICAgICB2YXIgcmlnaHQgPSAobnVtLndvcmRzW2ldIHwgMCkgKiBtdWw7XG4gICAgICB3IC09IHJpZ2h0ICYgMHgzZmZmZmZmO1xuICAgICAgY2FycnkgPSAodyA+PiAyNikgLSAoKHJpZ2h0IC8gMHg0MDAwMDAwKSB8IDApO1xuICAgICAgdGhpcy53b3Jkc1tpICsgc2hpZnRdID0gdyAmIDB4M2ZmZmZmZjtcbiAgICB9XG4gICAgZm9yICg7IGkgPCB0aGlzLmxlbmd0aCAtIHNoaWZ0OyBpKyspIHtcbiAgICAgIHcgPSAodGhpcy53b3Jkc1tpICsgc2hpZnRdIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gdyA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaSArIHNoaWZ0XSA9IHcgJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgaWYgKGNhcnJ5ID09PSAwKSByZXR1cm4gdGhpcy5zdHJpcCgpO1xuXG4gICAgLy8gU3VidHJhY3Rpb24gb3ZlcmZsb3dcbiAgICBhc3NlcnQoY2FycnkgPT09IC0xKTtcbiAgICBjYXJyeSA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHcgPSAtKHRoaXMud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgY2FycnkgPSB3ID4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHcgJiAweDNmZmZmZmY7XG4gICAgfVxuICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX3dvcmREaXYgPSBmdW5jdGlvbiBfd29yZERpdiAobnVtLCBtb2RlKSB7XG4gICAgdmFyIHNoaWZ0ID0gdGhpcy5sZW5ndGggLSBudW0ubGVuZ3RoO1xuXG4gICAgdmFyIGEgPSB0aGlzLmNsb25lKCk7XG4gICAgdmFyIGIgPSBudW07XG5cbiAgICAvLyBOb3JtYWxpemVcbiAgICB2YXIgYmhpID0gYi53b3Jkc1tiLmxlbmd0aCAtIDFdIHwgMDtcbiAgICB2YXIgYmhpQml0cyA9IHRoaXMuX2NvdW50Qml0cyhiaGkpO1xuICAgIHNoaWZ0ID0gMjYgLSBiaGlCaXRzO1xuICAgIGlmIChzaGlmdCAhPT0gMCkge1xuICAgICAgYiA9IGIudXNobG4oc2hpZnQpO1xuICAgICAgYS5pdXNobG4oc2hpZnQpO1xuICAgICAgYmhpID0gYi53b3Jkc1tiLmxlbmd0aCAtIDFdIHwgMDtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHF1b3RpZW50XG4gICAgdmFyIG0gPSBhLmxlbmd0aCAtIGIubGVuZ3RoO1xuICAgIHZhciBxO1xuXG4gICAgaWYgKG1vZGUgIT09ICdtb2QnKSB7XG4gICAgICBxID0gbmV3IEJOKG51bGwpO1xuICAgICAgcS5sZW5ndGggPSBtICsgMTtcbiAgICAgIHEud29yZHMgPSBuZXcgQXJyYXkocS5sZW5ndGgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHEud29yZHNbaV0gPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkaWZmID0gYS5jbG9uZSgpLl9pc2hsbnN1Ym11bChiLCAxLCBtKTtcbiAgICBpZiAoZGlmZi5uZWdhdGl2ZSA9PT0gMCkge1xuICAgICAgYSA9IGRpZmY7XG4gICAgICBpZiAocSkge1xuICAgICAgICBxLndvcmRzW21dID0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBqID0gbSAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICB2YXIgcWogPSAoYS53b3Jkc1tiLmxlbmd0aCArIGpdIHwgMCkgKiAweDQwMDAwMDAgK1xuICAgICAgICAoYS53b3Jkc1tiLmxlbmd0aCArIGogLSAxXSB8IDApO1xuXG4gICAgICAvLyBOT1RFOiAocWogLyBiaGkpIGlzICgweDNmZmZmZmYgKiAweDQwMDAwMDAgKyAweDNmZmZmZmYpIC8gMHgyMDAwMDAwIG1heFxuICAgICAgLy8gKDB4N2ZmZmZmZilcbiAgICAgIHFqID0gTWF0aC5taW4oKHFqIC8gYmhpKSB8IDAsIDB4M2ZmZmZmZik7XG5cbiAgICAgIGEuX2lzaGxuc3VibXVsKGIsIHFqLCBqKTtcbiAgICAgIHdoaWxlIChhLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgIHFqLS07XG4gICAgICAgIGEubmVnYXRpdmUgPSAwO1xuICAgICAgICBhLl9pc2hsbnN1Ym11bChiLCAxLCBqKTtcbiAgICAgICAgaWYgKCFhLmlzWmVybygpKSB7XG4gICAgICAgICAgYS5uZWdhdGl2ZSBePSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocSkge1xuICAgICAgICBxLndvcmRzW2pdID0gcWo7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChxKSB7XG4gICAgICBxLnN0cmlwKCk7XG4gICAgfVxuICAgIGEuc3RyaXAoKTtcblxuICAgIC8vIERlbm9ybWFsaXplXG4gICAgaWYgKG1vZGUgIT09ICdkaXYnICYmIHNoaWZ0ICE9PSAwKSB7XG4gICAgICBhLml1c2hybihzaGlmdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpdjogcSB8fCBudWxsLFxuICAgICAgbW9kOiBhXG4gICAgfTtcbiAgfTtcblxuICAvLyBOT1RFOiAxKSBgbW9kZWAgY2FuIGJlIHNldCB0byBgbW9kYCB0byByZXF1ZXN0IG1vZCBvbmx5LFxuICAvLyAgICAgICB0byBgZGl2YCB0byByZXF1ZXN0IGRpdiBvbmx5LCBvciBiZSBhYnNlbnQgdG9cbiAgLy8gICAgICAgcmVxdWVzdCBib3RoIGRpdiAmIG1vZFxuICAvLyAgICAgICAyKSBgcG9zaXRpdmVgIGlzIHRydWUgaWYgdW5zaWduZWQgbW9kIGlzIHJlcXVlc3RlZFxuICBCTi5wcm90b3R5cGUuZGl2bW9kID0gZnVuY3Rpb24gZGl2bW9kIChudW0sIG1vZGUsIHBvc2l0aXZlKSB7XG4gICAgYXNzZXJ0KCFudW0uaXNaZXJvKCkpO1xuXG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogbmV3IEJOKDApLFxuICAgICAgICBtb2Q6IG5ldyBCTigwKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgZGl2LCBtb2QsIHJlcztcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBudW0ubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIHJlcyA9IHRoaXMubmVnKCkuZGl2bW9kKG51bSwgbW9kZSk7XG5cbiAgICAgIGlmIChtb2RlICE9PSAnbW9kJykge1xuICAgICAgICBkaXYgPSByZXMuZGl2Lm5lZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kZSAhPT0gJ2RpdicpIHtcbiAgICAgICAgbW9kID0gcmVzLm1vZC5uZWcoKTtcbiAgICAgICAgaWYgKHBvc2l0aXZlICYmIG1vZC5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICAgIG1vZC5pYWRkKG51bSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiBkaXYsXG4gICAgICAgIG1vZDogbW9kXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG51bS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgcmVzID0gdGhpcy5kaXZtb2QobnVtLm5lZygpLCBtb2RlKTtcblxuICAgICAgaWYgKG1vZGUgIT09ICdtb2QnKSB7XG4gICAgICAgIGRpdiA9IHJlcy5kaXYubmVnKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogZGl2LFxuICAgICAgICBtb2Q6IHJlcy5tb2RcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCh0aGlzLm5lZ2F0aXZlICYgbnVtLm5lZ2F0aXZlKSAhPT0gMCkge1xuICAgICAgcmVzID0gdGhpcy5uZWcoKS5kaXZtb2QobnVtLm5lZygpLCBtb2RlKTtcblxuICAgICAgaWYgKG1vZGUgIT09ICdkaXYnKSB7XG4gICAgICAgIG1vZCA9IHJlcy5tb2QubmVnKCk7XG4gICAgICAgIGlmIChwb3NpdGl2ZSAmJiBtb2QubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgICBtb2QuaXN1YihudW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogcmVzLmRpdixcbiAgICAgICAgbW9kOiBtb2RcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQm90aCBudW1iZXJzIGFyZSBwb3NpdGl2ZSBhdCB0aGlzIHBvaW50XG5cbiAgICAvLyBTdHJpcCBib3RoIG51bWJlcnMgdG8gYXBwcm94aW1hdGUgc2hpZnQgdmFsdWVcbiAgICBpZiAobnVtLmxlbmd0aCA+IHRoaXMubGVuZ3RoIHx8IHRoaXMuY21wKG51bSkgPCAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IG5ldyBCTigwKSxcbiAgICAgICAgbW9kOiB0aGlzXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFZlcnkgc2hvcnQgcmVkdWN0aW9uXG4gICAgaWYgKG51bS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmIChtb2RlID09PSAnZGl2Jykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRpdjogdGhpcy5kaXZuKG51bS53b3Jkc1swXSksXG4gICAgICAgICAgbW9kOiBudWxsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2RlID09PSAnbW9kJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRpdjogbnVsbCxcbiAgICAgICAgICBtb2Q6IG5ldyBCTih0aGlzLm1vZG4obnVtLndvcmRzWzBdKSlcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiB0aGlzLmRpdm4obnVtLndvcmRzWzBdKSxcbiAgICAgICAgbW9kOiBuZXcgQk4odGhpcy5tb2RuKG51bS53b3Jkc1swXSkpXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3JkRGl2KG51bSwgbW9kZSk7XG4gIH07XG5cbiAgLy8gRmluZCBgdGhpc2AgLyBgbnVtYFxuICBCTi5wcm90b3R5cGUuZGl2ID0gZnVuY3Rpb24gZGl2IChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5kaXZtb2QobnVtLCAnZGl2JywgZmFsc2UpLmRpdjtcbiAgfTtcblxuICAvLyBGaW5kIGB0aGlzYCAlIGBudW1gXG4gIEJOLnByb3RvdHlwZS5tb2QgPSBmdW5jdGlvbiBtb2QgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmRpdm1vZChudW0sICdtb2QnLCBmYWxzZSkubW9kO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51bW9kID0gZnVuY3Rpb24gdW1vZCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2bW9kKG51bSwgJ21vZCcsIHRydWUpLm1vZDtcbiAgfTtcblxuICAvLyBGaW5kIFJvdW5kKGB0aGlzYCAvIGBudW1gKVxuICBCTi5wcm90b3R5cGUuZGl2Um91bmQgPSBmdW5jdGlvbiBkaXZSb3VuZCAobnVtKSB7XG4gICAgdmFyIGRtID0gdGhpcy5kaXZtb2QobnVtKTtcblxuICAgIC8vIEZhc3QgY2FzZSAtIGV4YWN0IGRpdmlzaW9uXG4gICAgaWYgKGRtLm1vZC5pc1plcm8oKSkgcmV0dXJuIGRtLmRpdjtcblxuICAgIHZhciBtb2QgPSBkbS5kaXYubmVnYXRpdmUgIT09IDAgPyBkbS5tb2QuaXN1YihudW0pIDogZG0ubW9kO1xuXG4gICAgdmFyIGhhbGYgPSBudW0udXNocm4oMSk7XG4gICAgdmFyIHIyID0gbnVtLmFuZGxuKDEpO1xuICAgIHZhciBjbXAgPSBtb2QuY21wKGhhbGYpO1xuXG4gICAgLy8gUm91bmQgZG93blxuICAgIGlmIChjbXAgPCAwIHx8IHIyID09PSAxICYmIGNtcCA9PT0gMCkgcmV0dXJuIGRtLmRpdjtcblxuICAgIC8vIFJvdW5kIHVwXG4gICAgcmV0dXJuIGRtLmRpdi5uZWdhdGl2ZSAhPT0gMCA/IGRtLmRpdi5pc3VibigxKSA6IGRtLmRpdi5pYWRkbigxKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubW9kbiA9IGZ1bmN0aW9uIG1vZG4gKG51bSkge1xuICAgIGFzc2VydChudW0gPD0gMHgzZmZmZmZmKTtcbiAgICB2YXIgcCA9ICgxIDw8IDI2KSAlIG51bTtcblxuICAgIHZhciBhY2MgPSAwO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBhY2MgPSAocCAqIGFjYyArICh0aGlzLndvcmRzW2ldIHwgMCkpICUgbnVtO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH07XG5cbiAgLy8gSW4tcGxhY2UgZGl2aXNpb24gYnkgbnVtYmVyXG4gIEJOLnByb3RvdHlwZS5pZGl2biA9IGZ1bmN0aW9uIGlkaXZuIChudW0pIHtcbiAgICBhc3NlcnQobnVtIDw9IDB4M2ZmZmZmZik7XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgdyA9ICh0aGlzLndvcmRzW2ldIHwgMCkgKyBjYXJyeSAqIDB4NDAwMDAwMDtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAodyAvIG51bSkgfCAwO1xuICAgICAgY2FycnkgPSB3ICUgbnVtO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmRpdm4gPSBmdW5jdGlvbiBkaXZuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlkaXZuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmVnY2QgPSBmdW5jdGlvbiBlZ2NkIChwKSB7XG4gICAgYXNzZXJ0KHAubmVnYXRpdmUgPT09IDApO1xuICAgIGFzc2VydCghcC5pc1plcm8oKSk7XG5cbiAgICB2YXIgeCA9IHRoaXM7XG4gICAgdmFyIHkgPSBwLmNsb25lKCk7XG5cbiAgICBpZiAoeC5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgeCA9IHgudW1vZChwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IHguY2xvbmUoKTtcbiAgICB9XG5cbiAgICAvLyBBICogeCArIEIgKiB5ID0geFxuICAgIHZhciBBID0gbmV3IEJOKDEpO1xuICAgIHZhciBCID0gbmV3IEJOKDApO1xuXG4gICAgLy8gQyAqIHggKyBEICogeSA9IHlcbiAgICB2YXIgQyA9IG5ldyBCTigwKTtcbiAgICB2YXIgRCA9IG5ldyBCTigxKTtcblxuICAgIHZhciBnID0gMDtcblxuICAgIHdoaWxlICh4LmlzRXZlbigpICYmIHkuaXNFdmVuKCkpIHtcbiAgICAgIHguaXVzaHJuKDEpO1xuICAgICAgeS5pdXNocm4oMSk7XG4gICAgICArK2c7XG4gICAgfVxuXG4gICAgdmFyIHlwID0geS5jbG9uZSgpO1xuICAgIHZhciB4cCA9IHguY2xvbmUoKTtcblxuICAgIHdoaWxlICgheC5pc1plcm8oKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGltID0gMTsgKHgud29yZHNbMF0gJiBpbSkgPT09IDAgJiYgaSA8IDI2OyArK2ksIGltIDw8PSAxKTtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICB4Lml1c2hybihpKTtcbiAgICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgICBpZiAoQS5pc09kZCgpIHx8IEIuaXNPZGQoKSkge1xuICAgICAgICAgICAgQS5pYWRkKHlwKTtcbiAgICAgICAgICAgIEIuaXN1Yih4cCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQS5pdXNocm4oMSk7XG4gICAgICAgICAgQi5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaiA9IDAsIGptID0gMTsgKHkud29yZHNbMF0gJiBqbSkgPT09IDAgJiYgaiA8IDI2OyArK2osIGptIDw8PSAxKTtcbiAgICAgIGlmIChqID4gMCkge1xuICAgICAgICB5Lml1c2hybihqKTtcbiAgICAgICAgd2hpbGUgKGotLSA+IDApIHtcbiAgICAgICAgICBpZiAoQy5pc09kZCgpIHx8IEQuaXNPZGQoKSkge1xuICAgICAgICAgICAgQy5pYWRkKHlwKTtcbiAgICAgICAgICAgIEQuaXN1Yih4cCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQy5pdXNocm4oMSk7XG4gICAgICAgICAgRC5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHguY21wKHkpID49IDApIHtcbiAgICAgICAgeC5pc3ViKHkpO1xuICAgICAgICBBLmlzdWIoQyk7XG4gICAgICAgIEIuaXN1YihEKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHkuaXN1Yih4KTtcbiAgICAgICAgQy5pc3ViKEEpO1xuICAgICAgICBELmlzdWIoQik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGE6IEMsXG4gICAgICBiOiBELFxuICAgICAgZ2NkOiB5Lml1c2hsbihnKVxuICAgIH07XG4gIH07XG5cbiAgLy8gVGhpcyBpcyByZWR1Y2VkIGluY2FybmF0aW9uIG9mIHRoZSBiaW5hcnkgRUVBXG4gIC8vIGFib3ZlLCBkZXNpZ25hdGVkIHRvIGludmVydCBtZW1iZXJzIG9mIHRoZVxuICAvLyBfcHJpbWVfIGZpZWxkcyBGKHApIGF0IGEgbWF4aW1hbCBzcGVlZFxuICBCTi5wcm90b3R5cGUuX2ludm1wID0gZnVuY3Rpb24gX2ludm1wIChwKSB7XG4gICAgYXNzZXJ0KHAubmVnYXRpdmUgPT09IDApO1xuICAgIGFzc2VydCghcC5pc1plcm8oKSk7XG5cbiAgICB2YXIgYSA9IHRoaXM7XG4gICAgdmFyIGIgPSBwLmNsb25lKCk7XG5cbiAgICBpZiAoYS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgYSA9IGEudW1vZChwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IGEuY2xvbmUoKTtcbiAgICB9XG5cbiAgICB2YXIgeDEgPSBuZXcgQk4oMSk7XG4gICAgdmFyIHgyID0gbmV3IEJOKDApO1xuXG4gICAgdmFyIGRlbHRhID0gYi5jbG9uZSgpO1xuXG4gICAgd2hpbGUgKGEuY21wbigxKSA+IDAgJiYgYi5jbXBuKDEpID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGltID0gMTsgKGEud29yZHNbMF0gJiBpbSkgPT09IDAgJiYgaSA8IDI2OyArK2ksIGltIDw8PSAxKTtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBhLml1c2hybihpKTtcbiAgICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgICBpZiAoeDEuaXNPZGQoKSkge1xuICAgICAgICAgICAgeDEuaWFkZChkZWx0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgeDEuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGogPSAwLCBqbSA9IDE7IChiLndvcmRzWzBdICYgam0pID09PSAwICYmIGogPCAyNjsgKytqLCBqbSA8PD0gMSk7XG4gICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgYi5pdXNocm4oaik7XG4gICAgICAgIHdoaWxlIChqLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKHgyLmlzT2RkKCkpIHtcbiAgICAgICAgICAgIHgyLmlhZGQoZGVsdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHgyLml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYS5jbXAoYikgPj0gMCkge1xuICAgICAgICBhLmlzdWIoYik7XG4gICAgICAgIHgxLmlzdWIoeDIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYi5pc3ViKGEpO1xuICAgICAgICB4Mi5pc3ViKHgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVzO1xuICAgIGlmIChhLmNtcG4oMSkgPT09IDApIHtcbiAgICAgIHJlcyA9IHgxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMgPSB4MjtcbiAgICB9XG5cbiAgICBpZiAocmVzLmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMuaWFkZChwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5nY2QgPSBmdW5jdGlvbiBnY2QgKG51bSkge1xuICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gbnVtLmFicygpO1xuICAgIGlmIChudW0uaXNaZXJvKCkpIHJldHVybiB0aGlzLmFicygpO1xuXG4gICAgdmFyIGEgPSB0aGlzLmNsb25lKCk7XG4gICAgdmFyIGIgPSBudW0uY2xvbmUoKTtcbiAgICBhLm5lZ2F0aXZlID0gMDtcbiAgICBiLm5lZ2F0aXZlID0gMDtcblxuICAgIC8vIFJlbW92ZSBjb21tb24gZmFjdG9yIG9mIHR3b1xuICAgIGZvciAodmFyIHNoaWZ0ID0gMDsgYS5pc0V2ZW4oKSAmJiBiLmlzRXZlbigpOyBzaGlmdCsrKSB7XG4gICAgICBhLml1c2hybigxKTtcbiAgICAgIGIuaXVzaHJuKDEpO1xuICAgIH1cblxuICAgIGRvIHtcbiAgICAgIHdoaWxlIChhLmlzRXZlbigpKSB7XG4gICAgICAgIGEuaXVzaHJuKDEpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKGIuaXNFdmVuKCkpIHtcbiAgICAgICAgYi5pdXNocm4oMSk7XG4gICAgICB9XG5cbiAgICAgIHZhciByID0gYS5jbXAoYik7XG4gICAgICBpZiAociA8IDApIHtcbiAgICAgICAgLy8gU3dhcCBgYWAgYW5kIGBiYCB0byBtYWtlIGBhYCBhbHdheXMgYmlnZ2VyIHRoYW4gYGJgXG4gICAgICAgIHZhciB0ID0gYTtcbiAgICAgICAgYSA9IGI7XG4gICAgICAgIGIgPSB0O1xuICAgICAgfSBlbHNlIGlmIChyID09PSAwIHx8IGIuY21wbigxKSA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgYS5pc3ViKGIpO1xuICAgIH0gd2hpbGUgKHRydWUpO1xuXG4gICAgcmV0dXJuIGIuaXVzaGxuKHNoaWZ0KTtcbiAgfTtcblxuICAvLyBJbnZlcnQgbnVtYmVyIGluIHRoZSBmaWVsZCBGKG51bSlcbiAgQk4ucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbiBpbnZtIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5lZ2NkKG51bSkuYS51bW9kKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzRXZlbiA9IGZ1bmN0aW9uIGlzRXZlbiAoKSB7XG4gICAgcmV0dXJuICh0aGlzLndvcmRzWzBdICYgMSkgPT09IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzT2RkID0gZnVuY3Rpb24gaXNPZGQgKCkge1xuICAgIHJldHVybiAodGhpcy53b3Jkc1swXSAmIDEpID09PSAxO1xuICB9O1xuXG4gIC8vIEFuZCBmaXJzdCB3b3JkIGFuZCBudW1cbiAgQk4ucHJvdG90eXBlLmFuZGxuID0gZnVuY3Rpb24gYW5kbG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLndvcmRzWzBdICYgbnVtO1xuICB9O1xuXG4gIC8vIEluY3JlbWVudCBhdCB0aGUgYml0IHBvc2l0aW9uIGluLWxpbmVcbiAgQk4ucHJvdG90eXBlLmJpbmNuID0gZnVuY3Rpb24gYmluY24gKGJpdCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0ID09PSAnbnVtYmVyJyk7XG4gICAgdmFyIHIgPSBiaXQgJSAyNjtcbiAgICB2YXIgcyA9IChiaXQgLSByKSAvIDI2O1xuICAgIHZhciBxID0gMSA8PCByO1xuXG4gICAgLy8gRmFzdCBjYXNlOiBiaXQgaXMgbXVjaCBoaWdoZXIgdGhhbiBhbGwgZXhpc3Rpbmcgd29yZHNcbiAgICBpZiAodGhpcy5sZW5ndGggPD0gcykge1xuICAgICAgdGhpcy5fZXhwYW5kKHMgKyAxKTtcbiAgICAgIHRoaXMud29yZHNbc10gfD0gcTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBiaXQgYW5kIHByb3BhZ2F0ZSwgaWYgbmVlZGVkXG4gICAgdmFyIGNhcnJ5ID0gcTtcbiAgICBmb3IgKHZhciBpID0gczsgY2FycnkgIT09IDAgJiYgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1tpXSB8IDA7XG4gICAgICB3ICs9IGNhcnJ5O1xuICAgICAgY2FycnkgPSB3ID4+PiAyNjtcbiAgICAgIHcgJj0gMHgzZmZmZmZmO1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHc7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGNhcnJ5O1xuICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybyAoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPT09IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmNtcG4gPSBmdW5jdGlvbiBjbXBuIChudW0pIHtcbiAgICB2YXIgbmVnYXRpdmUgPSBudW0gPCAwO1xuXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgIW5lZ2F0aXZlKSByZXR1cm4gLTE7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbmVnYXRpdmUpIHJldHVybiAxO1xuXG4gICAgdGhpcy5zdHJpcCgpO1xuXG4gICAgdmFyIHJlcztcbiAgICBpZiAodGhpcy5sZW5ndGggPiAxKSB7XG4gICAgICByZXMgPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmVnYXRpdmUpIHtcbiAgICAgICAgbnVtID0gLW51bTtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0KG51bSA8PSAweDNmZmZmZmYsICdOdW1iZXIgaXMgdG9vIGJpZycpO1xuXG4gICAgICB2YXIgdyA9IHRoaXMud29yZHNbMF0gfCAwO1xuICAgICAgcmVzID0gdyA9PT0gbnVtID8gMCA6IHcgPCBudW0gPyAtMSA6IDE7XG4gICAgfVxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSByZXR1cm4gLXJlcyB8IDA7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBDb21wYXJlIHR3byBudW1iZXJzIGFuZCByZXR1cm46XG4gIC8vIDEgLSBpZiBgdGhpc2AgPiBgbnVtYFxuICAvLyAwIC0gaWYgYHRoaXNgID09IGBudW1gXG4gIC8vIC0xIC0gaWYgYHRoaXNgIDwgYG51bWBcbiAgQk4ucHJvdG90eXBlLmNtcCA9IGZ1bmN0aW9uIGNtcCAobnVtKSB7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgbnVtLm5lZ2F0aXZlID09PSAwKSByZXR1cm4gLTE7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbnVtLm5lZ2F0aXZlICE9PSAwKSByZXR1cm4gMTtcblxuICAgIHZhciByZXMgPSB0aGlzLnVjbXAobnVtKTtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkgcmV0dXJuIC1yZXMgfCAwO1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gVW5zaWduZWQgY29tcGFyaXNvblxuICBCTi5wcm90b3R5cGUudWNtcCA9IGZ1bmN0aW9uIHVjbXAgKG51bSkge1xuICAgIC8vIEF0IHRoaXMgcG9pbnQgYm90aCBudW1iZXJzIGhhdmUgdGhlIHNhbWUgc2lnblxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiAxO1xuICAgIGlmICh0aGlzLmxlbmd0aCA8IG51bS5sZW5ndGgpIHJldHVybiAtMTtcblxuICAgIHZhciByZXMgPSAwO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgYSA9IHRoaXMud29yZHNbaV0gfCAwO1xuICAgICAgdmFyIGIgPSBudW0ud29yZHNbaV0gfCAwO1xuXG4gICAgICBpZiAoYSA9PT0gYikgY29udGludWU7XG4gICAgICBpZiAoYSA8IGIpIHtcbiAgICAgICAgcmVzID0gLTE7XG4gICAgICB9IGVsc2UgaWYgKGEgPiBiKSB7XG4gICAgICAgIHJlcyA9IDE7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3RuID0gZnVuY3Rpb24gZ3RuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPT09IDE7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0ID0gZnVuY3Rpb24gZ3QgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID09PSAxO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndGVuID0gZnVuY3Rpb24gZ3RlbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID49IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0ZSA9IGZ1bmN0aW9uIGd0ZSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPj0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHRuID0gZnVuY3Rpb24gbHRuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPT09IC0xO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdCA9IGZ1bmN0aW9uIGx0IChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA9PT0gLTE7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0ZW4gPSBmdW5jdGlvbiBsdGVuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPD0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHRlID0gZnVuY3Rpb24gbHRlIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA8PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5lcW4gPSBmdW5jdGlvbiBlcW4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA9PT0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPT09IDA7XG4gIH07XG5cbiAgLy9cbiAgLy8gQSByZWR1Y2UgY29udGV4dCwgY291bGQgYmUgdXNpbmcgbW9udGdvbWVyeSBvciBzb21ldGhpbmcgYmV0dGVyLCBkZXBlbmRpbmdcbiAgLy8gb24gdGhlIGBtYCBpdHNlbGYuXG4gIC8vXG4gIEJOLnJlZCA9IGZ1bmN0aW9uIHJlZCAobnVtKSB7XG4gICAgcmV0dXJuIG5ldyBSZWQobnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9SZWQgPSBmdW5jdGlvbiB0b1JlZCAoY3R4KSB7XG4gICAgYXNzZXJ0KCF0aGlzLnJlZCwgJ0FscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQnKTtcbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCwgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzJyk7XG4gICAgcmV0dXJuIGN0eC5jb252ZXJ0VG8odGhpcykuX2ZvcmNlUmVkKGN0eCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmZyb21SZWQgPSBmdW5jdGlvbiBmcm9tUmVkICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdmcm9tUmVkIHdvcmtzIG9ubHkgd2l0aCBudW1iZXJzIGluIHJlZHVjdGlvbiBjb250ZXh0Jyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmNvbnZlcnRGcm9tKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fZm9yY2VSZWQgPSBmdW5jdGlvbiBfZm9yY2VSZWQgKGN0eCkge1xuICAgIHRoaXMucmVkID0gY3R4O1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5mb3JjZVJlZCA9IGZ1bmN0aW9uIGZvcmNlUmVkIChjdHgpIHtcbiAgICBhc3NlcnQoIXRoaXMucmVkLCAnQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCcpO1xuICAgIHJldHVybiB0aGlzLl9mb3JjZVJlZChjdHgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRBZGQgPSBmdW5jdGlvbiByZWRBZGQgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZEFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuYWRkKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElBZGQgPSBmdW5jdGlvbiByZWRJQWRkIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pYWRkKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFN1YiA9IGZ1bmN0aW9uIHJlZFN1YiAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zdWIodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSVN1YiA9IGZ1bmN0aW9uIHJlZElTdWIgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZElTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmlzdWIodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkU2hsID0gZnVuY3Rpb24gcmVkU2hsIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTaGwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnNobCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRNdWwgPSBmdW5jdGlvbiByZWRNdWwgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLCBudW0pO1xuICAgIHJldHVybiB0aGlzLnJlZC5tdWwodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSU11bCA9IGZ1bmN0aW9uIHJlZElNdWwgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLCBudW0pO1xuICAgIHJldHVybiB0aGlzLnJlZC5pbXVsKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFNxciA9IGZ1bmN0aW9uIHJlZFNxciAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zcXIodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElTcXIgPSBmdW5jdGlvbiByZWRJU3FyICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pc3FyKHRoaXMpO1xuICB9O1xuXG4gIC8vIFNxdWFyZSByb290IG92ZXIgcFxuICBCTi5wcm90b3R5cGUucmVkU3FydCA9IGZ1bmN0aW9uIHJlZFNxcnQgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFNxcnQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnNxcnQodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZEludm0gPSBmdW5jdGlvbiByZWRJbnZtICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJbnZtIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pbnZtKHRoaXMpO1xuICB9O1xuXG4gIC8vIFJldHVybiBuZWdhdGl2ZSBjbG9uZSBvZiBgdGhpc2AgJSBgcmVkIG1vZHVsb2BcbiAgQk4ucHJvdG90eXBlLnJlZE5lZyA9IGZ1bmN0aW9uIHJlZE5lZyAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkTmVnIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5uZWcodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFBvdyA9IGZ1bmN0aW9uIHJlZFBvdyAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkICYmICFudW0ucmVkLCAncmVkUG93KG5vcm1hbE51bSknKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQucG93KHRoaXMsIG51bSk7XG4gIH07XG5cbiAgLy8gUHJpbWUgbnVtYmVycyB3aXRoIGVmZmljaWVudCByZWR1Y3Rpb25cbiAgdmFyIHByaW1lcyA9IHtcbiAgICBrMjU2OiBudWxsLFxuICAgIHAyMjQ6IG51bGwsXG4gICAgcDE5MjogbnVsbCxcbiAgICBwMjU1MTk6IG51bGxcbiAgfTtcblxuICAvLyBQc2V1ZG8tTWVyc2VubmUgcHJpbWVcbiAgZnVuY3Rpb24gTVByaW1lIChuYW1lLCBwKSB7XG4gICAgLy8gUCA9IDIgXiBOIC0gS1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5wID0gbmV3IEJOKHAsIDE2KTtcbiAgICB0aGlzLm4gPSB0aGlzLnAuYml0TGVuZ3RoKCk7XG4gICAgdGhpcy5rID0gbmV3IEJOKDEpLml1c2hsbih0aGlzLm4pLmlzdWIodGhpcy5wKTtcblxuICAgIHRoaXMudG1wID0gdGhpcy5fdG1wKCk7XG4gIH1cblxuICBNUHJpbWUucHJvdG90eXBlLl90bXAgPSBmdW5jdGlvbiBfdG1wICgpIHtcbiAgICB2YXIgdG1wID0gbmV3IEJOKG51bGwpO1xuICAgIHRtcC53b3JkcyA9IG5ldyBBcnJheShNYXRoLmNlaWwodGhpcy5uIC8gMTMpKTtcbiAgICByZXR1cm4gdG1wO1xuICB9O1xuXG4gIE1QcmltZS5wcm90b3R5cGUuaXJlZHVjZSA9IGZ1bmN0aW9uIGlyZWR1Y2UgKG51bSkge1xuICAgIC8vIEFzc3VtZXMgdGhhdCBgbnVtYCBpcyBsZXNzIHRoYW4gYFBeMmBcbiAgICAvLyBudW0gPSBISSAqICgyIF4gTiAtIEspICsgSEkgKiBLICsgTE8gPSBISSAqIEsgKyBMTyAobW9kIFApXG4gICAgdmFyIHIgPSBudW07XG4gICAgdmFyIHJsZW47XG5cbiAgICBkbyB7XG4gICAgICB0aGlzLnNwbGl0KHIsIHRoaXMudG1wKTtcbiAgICAgIHIgPSB0aGlzLmltdWxLKHIpO1xuICAgICAgciA9IHIuaWFkZCh0aGlzLnRtcCk7XG4gICAgICBybGVuID0gci5iaXRMZW5ndGgoKTtcbiAgICB9IHdoaWxlIChybGVuID4gdGhpcy5uKTtcblxuICAgIHZhciBjbXAgPSBybGVuIDwgdGhpcy5uID8gLTEgOiByLnVjbXAodGhpcy5wKTtcbiAgICBpZiAoY21wID09PSAwKSB7XG4gICAgICByLndvcmRzWzBdID0gMDtcbiAgICAgIHIubGVuZ3RoID0gMTtcbiAgICB9IGVsc2UgaWYgKGNtcCA+IDApIHtcbiAgICAgIHIuaXN1Yih0aGlzLnApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoci5zdHJpcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIHIgaXMgQk4gdjQgaW5zdGFuY2VcbiAgICAgICAgci5zdHJpcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gciBpcyBCTiB2NSBpbnN0YW5jZVxuICAgICAgICByLl9zdHJpcCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIE1QcmltZS5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbiBzcGxpdCAoaW5wdXQsIG91dCkge1xuICAgIGlucHV0Lml1c2hybih0aGlzLm4sIDAsIG91dCk7XG4gIH07XG5cbiAgTVByaW1lLnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uIGltdWxLIChudW0pIHtcbiAgICByZXR1cm4gbnVtLmltdWwodGhpcy5rKTtcbiAgfTtcblxuICBmdW5jdGlvbiBLMjU2ICgpIHtcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAnazI1NicsXG4gICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZjMmYnKTtcbiAgfVxuICBpbmhlcml0cyhLMjU2LCBNUHJpbWUpO1xuXG4gIEsyNTYucHJvdG90eXBlLnNwbGl0ID0gZnVuY3Rpb24gc3BsaXQgKGlucHV0LCBvdXRwdXQpIHtcbiAgICAvLyAyNTYgPSA5ICogMjYgKyAyMlxuICAgIHZhciBtYXNrID0gMHgzZmZmZmY7XG5cbiAgICB2YXIgb3V0TGVuID0gTWF0aC5taW4oaW5wdXQubGVuZ3RoLCA5KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG91dExlbjsgaSsrKSB7XG4gICAgICBvdXRwdXQud29yZHNbaV0gPSBpbnB1dC53b3Jkc1tpXTtcbiAgICB9XG4gICAgb3V0cHV0Lmxlbmd0aCA9IG91dExlbjtcblxuICAgIGlmIChpbnB1dC5sZW5ndGggPD0gOSkge1xuICAgICAgaW5wdXQud29yZHNbMF0gPSAwO1xuICAgICAgaW5wdXQubGVuZ3RoID0gMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTaGlmdCBieSA5IGxpbWJzXG4gICAgdmFyIHByZXYgPSBpbnB1dC53b3Jkc1s5XTtcbiAgICBvdXRwdXQud29yZHNbb3V0cHV0Lmxlbmd0aCsrXSA9IHByZXYgJiBtYXNrO1xuXG4gICAgZm9yIChpID0gMTA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5leHQgPSBpbnB1dC53b3Jkc1tpXSB8IDA7XG4gICAgICBpbnB1dC53b3Jkc1tpIC0gMTBdID0gKChuZXh0ICYgbWFzaykgPDwgNCkgfCAocHJldiA+Pj4gMjIpO1xuICAgICAgcHJldiA9IG5leHQ7XG4gICAgfVxuICAgIHByZXYgPj4+PSAyMjtcbiAgICBpbnB1dC53b3Jkc1tpIC0gMTBdID0gcHJldjtcbiAgICBpZiAocHJldiA9PT0gMCAmJiBpbnB1dC5sZW5ndGggPiAxMCkge1xuICAgICAgaW5wdXQubGVuZ3RoIC09IDEwO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnB1dC5sZW5ndGggLT0gOTtcbiAgICB9XG4gIH07XG5cbiAgSzI1Ni5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbiBpbXVsSyAobnVtKSB7XG4gICAgLy8gSyA9IDB4MTAwMDAwM2QxID0gWyAweDQwLCAweDNkMSBdXG4gICAgbnVtLndvcmRzW251bS5sZW5ndGhdID0gMDtcbiAgICBudW0ud29yZHNbbnVtLmxlbmd0aCArIDFdID0gMDtcbiAgICBudW0ubGVuZ3RoICs9IDI7XG5cbiAgICAvLyBib3VuZGVkIGF0OiAweDQwICogMHgzZmZmZmZmICsgMHgzZDAgPSAweDEwMDAwMDM5MFxuICAgIHZhciBsbyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3ID0gbnVtLndvcmRzW2ldIHwgMDtcbiAgICAgIGxvICs9IHcgKiAweDNkMTtcbiAgICAgIG51bS53b3Jkc1tpXSA9IGxvICYgMHgzZmZmZmZmO1xuICAgICAgbG8gPSB3ICogMHg0MCArICgobG8gLyAweDQwMDAwMDApIHwgMCk7XG4gICAgfVxuXG4gICAgLy8gRmFzdCBsZW5ndGggcmVkdWN0aW9uXG4gICAgaWYgKG51bS53b3Jkc1tudW0ubGVuZ3RoIC0gMV0gPT09IDApIHtcbiAgICAgIG51bS5sZW5ndGgtLTtcbiAgICAgIGlmIChudW0ud29yZHNbbnVtLmxlbmd0aCAtIDFdID09PSAwKSB7XG4gICAgICAgIG51bS5sZW5ndGgtLTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bTtcbiAgfTtcblxuICBmdW5jdGlvbiBQMjI0ICgpIHtcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAncDIyNCcsXG4gICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEnKTtcbiAgfVxuICBpbmhlcml0cyhQMjI0LCBNUHJpbWUpO1xuXG4gIGZ1bmN0aW9uIFAxOTIgKCkge1xuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICdwMTkyJyxcbiAgICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZicpO1xuICB9XG4gIGluaGVyaXRzKFAxOTIsIE1QcmltZSk7XG5cbiAgZnVuY3Rpb24gUDI1NTE5ICgpIHtcbiAgICAvLyAyIF4gMjU1IC0gMTlcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAnMjU1MTknLFxuICAgICAgJzdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQnKTtcbiAgfVxuICBpbmhlcml0cyhQMjU1MTksIE1QcmltZSk7XG5cbiAgUDI1NTE5LnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uIGltdWxLIChudW0pIHtcbiAgICAvLyBLID0gMHgxM1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoaSA9IChudW0ud29yZHNbaV0gfCAwKSAqIDB4MTMgKyBjYXJyeTtcbiAgICAgIHZhciBsbyA9IGhpICYgMHgzZmZmZmZmO1xuICAgICAgaGkgPj4+PSAyNjtcblxuICAgICAgbnVtLndvcmRzW2ldID0gbG87XG4gICAgICBjYXJyeSA9IGhpO1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIG51bS53b3Jkc1tudW0ubGVuZ3RoKytdID0gY2Fycnk7XG4gICAgfVxuICAgIHJldHVybiBudW07XG4gIH07XG5cbiAgLy8gRXhwb3J0ZWQgbW9zdGx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB1c2UgcGxhaW4gbmFtZSBpbnN0ZWFkXG4gIEJOLl9wcmltZSA9IGZ1bmN0aW9uIHByaW1lIChuYW1lKSB7XG4gICAgLy8gQ2FjaGVkIHZlcnNpb24gb2YgcHJpbWVcbiAgICBpZiAocHJpbWVzW25hbWVdKSByZXR1cm4gcHJpbWVzW25hbWVdO1xuXG4gICAgdmFyIHByaW1lO1xuICAgIGlmIChuYW1lID09PSAnazI1NicpIHtcbiAgICAgIHByaW1lID0gbmV3IEsyNTYoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdwMjI0Jykge1xuICAgICAgcHJpbWUgPSBuZXcgUDIyNCgpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3AxOTInKSB7XG4gICAgICBwcmltZSA9IG5ldyBQMTkyKCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAncDI1NTE5Jykge1xuICAgICAgcHJpbWUgPSBuZXcgUDI1NTE5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBwcmltZSAnICsgbmFtZSk7XG4gICAgfVxuICAgIHByaW1lc1tuYW1lXSA9IHByaW1lO1xuXG4gICAgcmV0dXJuIHByaW1lO1xuICB9O1xuXG4gIC8vXG4gIC8vIEJhc2UgcmVkdWN0aW9uIGVuZ2luZVxuICAvL1xuICBmdW5jdGlvbiBSZWQgKG0pIHtcbiAgICBpZiAodHlwZW9mIG0gPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgcHJpbWUgPSBCTi5fcHJpbWUobSk7XG4gICAgICB0aGlzLm0gPSBwcmltZS5wO1xuICAgICAgdGhpcy5wcmltZSA9IHByaW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQobS5ndG4oMSksICdtb2R1bHVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEnKTtcbiAgICAgIHRoaXMubSA9IG07XG4gICAgICB0aGlzLnByaW1lID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBSZWQucHJvdG90eXBlLl92ZXJpZnkxID0gZnVuY3Rpb24gX3ZlcmlmeTEgKGEpIHtcbiAgICBhc3NlcnQoYS5uZWdhdGl2ZSA9PT0gMCwgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzJyk7XG4gICAgYXNzZXJ0KGEucmVkLCAncmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuX3ZlcmlmeTIgPSBmdW5jdGlvbiBfdmVyaWZ5MiAoYSwgYikge1xuICAgIGFzc2VydCgoYS5uZWdhdGl2ZSB8IGIubmVnYXRpdmUpID09PSAwLCAncmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMnKTtcbiAgICBhc3NlcnQoYS5yZWQgJiYgYS5yZWQgPT09IGIucmVkLFxuICAgICAgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmltb2QgPSBmdW5jdGlvbiBpbW9kIChhKSB7XG4gICAgaWYgKHRoaXMucHJpbWUpIHJldHVybiB0aGlzLnByaW1lLmlyZWR1Y2UoYSkuX2ZvcmNlUmVkKHRoaXMpO1xuICAgIHJldHVybiBhLnVtb2QodGhpcy5tKS5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcgKGEpIHtcbiAgICBpZiAoYS5pc1plcm8oKSkge1xuICAgICAgcmV0dXJuIGEuY2xvbmUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tLnN1YihhKS5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuXG4gICAgdmFyIHJlcyA9IGEuYWRkKGIpO1xuICAgIGlmIChyZXMuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzLmlzdWIodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24gaWFkZCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5pYWRkKGIpO1xuICAgIGlmIChyZXMuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzLmlzdWIodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uIHN1YiAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5zdWIoYik7XG4gICAgaWYgKHJlcy5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzLmlhZGQodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pc3ViID0gZnVuY3Rpb24gaXN1YiAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5pc3ViKGIpO1xuICAgIGlmIChyZXMuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcy5pYWRkKHRoaXMubSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5zaGwgPSBmdW5jdGlvbiBzaGwgKGEsIG51bSkge1xuICAgIHRoaXMuX3ZlcmlmeTEoYSk7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLnVzaGxuKG51bSkpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uIGltdWwgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuICAgIHJldHVybiB0aGlzLmltb2QoYS5pbXVsKGIpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLm11bChiKSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pc3FyID0gZnVuY3Rpb24gaXNxciAoYSkge1xuICAgIHJldHVybiB0aGlzLmltdWwoYSwgYS5jbG9uZSgpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uIHNxciAoYSkge1xuICAgIHJldHVybiB0aGlzLm11bChhLCBhKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNxcnQgPSBmdW5jdGlvbiBzcXJ0IChhKSB7XG4gICAgaWYgKGEuaXNaZXJvKCkpIHJldHVybiBhLmNsb25lKCk7XG5cbiAgICB2YXIgbW9kMyA9IHRoaXMubS5hbmRsbigzKTtcbiAgICBhc3NlcnQobW9kMyAlIDIgPT09IDEpO1xuXG4gICAgLy8gRmFzdCBjYXNlXG4gICAgaWYgKG1vZDMgPT09IDMpIHtcbiAgICAgIHZhciBwb3cgPSB0aGlzLm0uYWRkKG5ldyBCTigxKSkuaXVzaHJuKDIpO1xuICAgICAgcmV0dXJuIHRoaXMucG93KGEsIHBvdyk7XG4gICAgfVxuXG4gICAgLy8gVG9uZWxsaS1TaGFua3MgYWxnb3JpdGhtIChUb3RhbGx5IHVub3B0aW1pemVkIGFuZCBzbG93KVxuICAgIC8vXG4gICAgLy8gRmluZCBRIGFuZCBTLCB0aGF0IFEgKiAyIF4gUyA9IChQIC0gMSlcbiAgICB2YXIgcSA9IHRoaXMubS5zdWJuKDEpO1xuICAgIHZhciBzID0gMDtcbiAgICB3aGlsZSAoIXEuaXNaZXJvKCkgJiYgcS5hbmRsbigxKSA9PT0gMCkge1xuICAgICAgcysrO1xuICAgICAgcS5pdXNocm4oMSk7XG4gICAgfVxuICAgIGFzc2VydCghcS5pc1plcm8oKSk7XG5cbiAgICB2YXIgb25lID0gbmV3IEJOKDEpLnRvUmVkKHRoaXMpO1xuICAgIHZhciBuT25lID0gb25lLnJlZE5lZygpO1xuXG4gICAgLy8gRmluZCBxdWFkcmF0aWMgbm9uLXJlc2lkdWVcbiAgICAvLyBOT1RFOiBNYXggaXMgc3VjaCBiZWNhdXNlIG9mIGdlbmVyYWxpemVkIFJpZW1hbm4gaHlwb3RoZXNpcy5cbiAgICB2YXIgbHBvdyA9IHRoaXMubS5zdWJuKDEpLml1c2hybigxKTtcbiAgICB2YXIgeiA9IHRoaXMubS5iaXRMZW5ndGgoKTtcbiAgICB6ID0gbmV3IEJOKDIgKiB6ICogeikudG9SZWQodGhpcyk7XG5cbiAgICB3aGlsZSAodGhpcy5wb3coeiwgbHBvdykuY21wKG5PbmUpICE9PSAwKSB7XG4gICAgICB6LnJlZElBZGQobk9uZSk7XG4gICAgfVxuXG4gICAgdmFyIGMgPSB0aGlzLnBvdyh6LCBxKTtcbiAgICB2YXIgciA9IHRoaXMucG93KGEsIHEuYWRkbigxKS5pdXNocm4oMSkpO1xuICAgIHZhciB0ID0gdGhpcy5wb3coYSwgcSk7XG4gICAgdmFyIG0gPSBzO1xuICAgIHdoaWxlICh0LmNtcChvbmUpICE9PSAwKSB7XG4gICAgICB2YXIgdG1wID0gdDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyB0bXAuY21wKG9uZSkgIT09IDA7IGkrKykge1xuICAgICAgICB0bXAgPSB0bXAucmVkU3FyKCk7XG4gICAgICB9XG4gICAgICBhc3NlcnQoaSA8IG0pO1xuICAgICAgdmFyIGIgPSB0aGlzLnBvdyhjLCBuZXcgQk4oMSkuaXVzaGxuKG0gLSBpIC0gMSkpO1xuXG4gICAgICByID0gci5yZWRNdWwoYik7XG4gICAgICBjID0gYi5yZWRTcXIoKTtcbiAgICAgIHQgPSB0LnJlZE11bChjKTtcbiAgICAgIG0gPSBpO1xuICAgIH1cblxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uIGludm0gKGEpIHtcbiAgICB2YXIgaW52ID0gYS5faW52bXAodGhpcy5tKTtcbiAgICBpZiAoaW52Lm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBpbnYubmVnYXRpdmUgPSAwO1xuICAgICAgcmV0dXJuIHRoaXMuaW1vZChpbnYpLnJlZE5lZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5pbW9kKGludik7XG4gICAgfVxuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24gcG93IChhLCBudW0pIHtcbiAgICBpZiAobnVtLmlzWmVybygpKSByZXR1cm4gbmV3IEJOKDEpLnRvUmVkKHRoaXMpO1xuICAgIGlmIChudW0uY21wbigxKSA9PT0gMCkgcmV0dXJuIGEuY2xvbmUoKTtcblxuICAgIHZhciB3aW5kb3dTaXplID0gNDtcbiAgICB2YXIgd25kID0gbmV3IEFycmF5KDEgPDwgd2luZG93U2l6ZSk7XG4gICAgd25kWzBdID0gbmV3IEJOKDEpLnRvUmVkKHRoaXMpO1xuICAgIHduZFsxXSA9IGE7XG4gICAgZm9yICh2YXIgaSA9IDI7IGkgPCB3bmQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHduZFtpXSA9IHRoaXMubXVsKHduZFtpIC0gMV0sIGEpO1xuICAgIH1cblxuICAgIHZhciByZXMgPSB3bmRbMF07XG4gICAgdmFyIGN1cnJlbnQgPSAwO1xuICAgIHZhciBjdXJyZW50TGVuID0gMDtcbiAgICB2YXIgc3RhcnQgPSBudW0uYml0TGVuZ3RoKCkgJSAyNjtcbiAgICBpZiAoc3RhcnQgPT09IDApIHtcbiAgICAgIHN0YXJ0ID0gMjY7XG4gICAgfVxuXG4gICAgZm9yIChpID0gbnVtLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgd29yZCA9IG51bS53b3Jkc1tpXTtcbiAgICAgIGZvciAodmFyIGogPSBzdGFydCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIHZhciBiaXQgPSAod29yZCA+PiBqKSAmIDE7XG4gICAgICAgIGlmIChyZXMgIT09IHduZFswXSkge1xuICAgICAgICAgIHJlcyA9IHRoaXMuc3FyKHJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYml0ID09PSAwICYmIGN1cnJlbnQgPT09IDApIHtcbiAgICAgICAgICBjdXJyZW50TGVuID0gMDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnQgPDw9IDE7XG4gICAgICAgIGN1cnJlbnQgfD0gYml0O1xuICAgICAgICBjdXJyZW50TGVuKys7XG4gICAgICAgIGlmIChjdXJyZW50TGVuICE9PSB3aW5kb3dTaXplICYmIChpICE9PSAwIHx8IGogIT09IDApKSBjb250aW51ZTtcblxuICAgICAgICByZXMgPSB0aGlzLm11bChyZXMsIHduZFtjdXJyZW50XSk7XG4gICAgICAgIGN1cnJlbnRMZW4gPSAwO1xuICAgICAgICBjdXJyZW50ID0gMDtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gMjY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmNvbnZlcnRUbyA9IGZ1bmN0aW9uIGNvbnZlcnRUbyAobnVtKSB7XG4gICAgdmFyIHIgPSBudW0udW1vZCh0aGlzLm0pO1xuXG4gICAgcmV0dXJuIHIgPT09IG51bSA/IHIuY2xvbmUoKSA6IHI7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uIGNvbnZlcnRGcm9tIChudW0pIHtcbiAgICB2YXIgcmVzID0gbnVtLmNsb25lKCk7XG4gICAgcmVzLnJlZCA9IG51bGw7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvL1xuICAvLyBNb250Z29tZXJ5IG1ldGhvZCBlbmdpbmVcbiAgLy9cblxuICBCTi5tb250ID0gZnVuY3Rpb24gbW9udCAobnVtKSB7XG4gICAgcmV0dXJuIG5ldyBNb250KG51bSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gTW9udCAobSkge1xuICAgIFJlZC5jYWxsKHRoaXMsIG0pO1xuXG4gICAgdGhpcy5zaGlmdCA9IHRoaXMubS5iaXRMZW5ndGgoKTtcbiAgICBpZiAodGhpcy5zaGlmdCAlIDI2ICE9PSAwKSB7XG4gICAgICB0aGlzLnNoaWZ0ICs9IDI2IC0gKHRoaXMuc2hpZnQgJSAyNik7XG4gICAgfVxuXG4gICAgdGhpcy5yID0gbmV3IEJOKDEpLml1c2hsbih0aGlzLnNoaWZ0KTtcbiAgICB0aGlzLnIyID0gdGhpcy5pbW9kKHRoaXMuci5zcXIoKSk7XG4gICAgdGhpcy5yaW52ID0gdGhpcy5yLl9pbnZtcCh0aGlzLm0pO1xuXG4gICAgdGhpcy5taW52ID0gdGhpcy5yaW52Lm11bCh0aGlzLnIpLmlzdWJuKDEpLmRpdih0aGlzLm0pO1xuICAgIHRoaXMubWludiA9IHRoaXMubWludi51bW9kKHRoaXMucik7XG4gICAgdGhpcy5taW52ID0gdGhpcy5yLnN1Yih0aGlzLm1pbnYpO1xuICB9XG4gIGluaGVyaXRzKE1vbnQsIFJlZCk7XG5cbiAgTW9udC5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24gY29udmVydFRvIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5pbW9kKG51bS51c2hsbih0aGlzLnNoaWZ0KSk7XG4gIH07XG5cbiAgTW9udC5wcm90b3R5cGUuY29udmVydEZyb20gPSBmdW5jdGlvbiBjb252ZXJ0RnJvbSAobnVtKSB7XG4gICAgdmFyIHIgPSB0aGlzLmltb2QobnVtLm11bCh0aGlzLnJpbnYpKTtcbiAgICByLnJlZCA9IG51bGw7XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgTW9udC5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uIGltdWwgKGEsIGIpIHtcbiAgICBpZiAoYS5pc1plcm8oKSB8fCBiLmlzWmVybygpKSB7XG4gICAgICBhLndvcmRzWzBdID0gMDtcbiAgICAgIGEubGVuZ3RoID0gMTtcbiAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIHZhciB0ID0gYS5pbXVsKGIpO1xuICAgIHZhciBjID0gdC5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSk7XG4gICAgdmFyIHUgPSB0LmlzdWIoYykuaXVzaHJuKHRoaXMuc2hpZnQpO1xuICAgIHZhciByZXMgPSB1O1xuXG4gICAgaWYgKHUuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzID0gdS5pc3ViKHRoaXMubSk7XG4gICAgfSBlbHNlIGlmICh1LmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMgPSB1LmlhZGQodGhpcy5tKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwgKGEsIGIpIHtcbiAgICBpZiAoYS5pc1plcm8oKSB8fCBiLmlzWmVybygpKSByZXR1cm4gbmV3IEJOKDApLl9mb3JjZVJlZCh0aGlzKTtcblxuICAgIHZhciB0ID0gYS5tdWwoYik7XG4gICAgdmFyIGMgPSB0Lm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKTtcbiAgICB2YXIgdSA9IHQuaXN1YihjKS5pdXNocm4odGhpcy5zaGlmdCk7XG4gICAgdmFyIHJlcyA9IHU7XG4gICAgaWYgKHUuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzID0gdS5pc3ViKHRoaXMubSk7XG4gICAgfSBlbHNlIGlmICh1LmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMgPSB1LmlhZGQodGhpcy5tKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24gaW52bSAoYSkge1xuICAgIC8vIChBUileLTEgKiBSXjIgPSAoQV4tMSAqIFJeLTEpICogUl4yID0gQV4tMSAqIFJcbiAgICB2YXIgcmVzID0gdGhpcy5pbW9kKGEuX2ludm1wKHRoaXMubSkubXVsKHRoaXMucjIpKTtcbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcbn0pKHR5cGVvZiBtb2R1bGUgPT09ICd1bmRlZmluZWQnIHx8IG1vZHVsZSwgdGhpcyk7XG4iLAogICAgImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAidHJ5IHtcbiAgdmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmICh0eXBlb2YgdXRpbC5pbmhlcml0cyAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgJyc7XG4gIG1vZHVsZS5leHBvcnRzID0gdXRpbC5pbmhlcml0cztcbn0gY2F0Y2ggKGUpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2luaGVyaXRzX2Jyb3dzZXIuanMnKTtcbn1cbiIsCiAgICAiLyogZXNsaW50LWRpc2FibGUgbm9kZS9uby1kZXByZWNhdGVkLWFwaSAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpXG52YXIgQnVmZmVyID0gYnVmZmVyLkJ1ZmZlclxuXG52YXIgc2FmZXIgPSB7fVxuXG52YXIga2V5XG5cbmZvciAoa2V5IGluIGJ1ZmZlcikge1xuICBpZiAoIWJ1ZmZlci5oYXNPd25Qcm9wZXJ0eShrZXkpKSBjb250aW51ZVxuICBpZiAoa2V5ID09PSAnU2xvd0J1ZmZlcicgfHwga2V5ID09PSAnQnVmZmVyJykgY29udGludWVcbiAgc2FmZXJba2V5XSA9IGJ1ZmZlcltrZXldXG59XG5cbnZhciBTYWZlciA9IHNhZmVyLkJ1ZmZlciA9IHt9XG5mb3IgKGtleSBpbiBCdWZmZXIpIHtcbiAgaWYgKCFCdWZmZXIuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWVcbiAgaWYgKGtleSA9PT0gJ2FsbG9jVW5zYWZlJyB8fCBrZXkgPT09ICdhbGxvY1Vuc2FmZVNsb3cnKSBjb250aW51ZVxuICBTYWZlcltrZXldID0gQnVmZmVyW2tleV1cbn1cblxuc2FmZXIuQnVmZmVyLnByb3RvdHlwZSA9IEJ1ZmZlci5wcm90b3R5cGVcblxuaWYgKCFTYWZlci5mcm9tIHx8IFNhZmVyLmZyb20gPT09IFVpbnQ4QXJyYXkuZnJvbSkge1xuICBTYWZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwidmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHZhbHVlKVxuICAgIH1cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgdmFsdWUpXG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxufVxuXG5pZiAoIVNhZmVyLmFsbG9jKSB7XG4gIFNhZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzaXplKVxuICAgIH1cbiAgICBpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA+PSAyICogKDEgPDwgMzApKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIHNpemUgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgICB9XG4gICAgdmFyIGJ1ZiA9IEJ1ZmZlcihzaXplKVxuICAgIGlmICghZmlsbCB8fCBmaWxsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYnVmLmZpbGwoMClcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuZmlsbChmaWxsKVxuICAgIH1cbiAgICByZXR1cm4gYnVmXG4gIH1cbn1cblxuaWYgKCFzYWZlci5rU3RyaW5nTWF4TGVuZ3RoKSB7XG4gIHRyeSB7XG4gICAgc2FmZXIua1N0cmluZ01heExlbmd0aCA9IHByb2Nlc3MuYmluZGluZygnYnVmZmVyJykua1N0cmluZ01heExlbmd0aFxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gd2UgY2FuJ3QgZGV0ZXJtaW5lIGtTdHJpbmdNYXhMZW5ndGggaW4gZW52aXJvbm1lbnRzIHdoZXJlIHByb2Nlc3MuYmluZGluZ1xuICAgIC8vIGlzIHVuc3VwcG9ydGVkLCBzbyBsZXQncyBub3Qgc2V0IGl0XG4gIH1cbn1cblxuaWYgKCFzYWZlci5jb25zdGFudHMpIHtcbiAgc2FmZXIuY29uc3RhbnRzID0ge1xuICAgIE1BWF9MRU5HVEg6IHNhZmVyLmtNYXhMZW5ndGhcbiAgfVxuICBpZiAoc2FmZXIua1N0cmluZ01heExlbmd0aCkge1xuICAgIHNhZmVyLmNvbnN0YW50cy5NQVhfU1RSSU5HX0xFTkdUSCA9IHNhZmVyLmtTdHJpbmdNYXhMZW5ndGhcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNhZmVyXG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5mdW5jdGlvbiBSZXBvcnRlcihvcHRpb25zKSB7XG4gIHRoaXMuX3JlcG9ydGVyU3RhdGUgPSB7XG4gICAgb2JqOiBudWxsLFxuICAgIHBhdGg6IFtdLFxuICAgIG9wdGlvbnM6IG9wdGlvbnMgfHwge30sXG4gICAgZXJyb3JzOiBbXVxuICB9O1xufVxuZXhwb3J0cy5SZXBvcnRlciA9IFJlcG9ydGVyO1xuXG5SZXBvcnRlci5wcm90b3R5cGUuaXNFcnJvciA9IGZ1bmN0aW9uIGlzRXJyb3Iob2JqKSB7XG4gIHJldHVybiBvYmogaW5zdGFuY2VvZiBSZXBvcnRlckVycm9yO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbiBzYXZlKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgcmV0dXJuIHsgb2JqOiBzdGF0ZS5vYmosIHBhdGhMZW46IHN0YXRlLnBhdGgubGVuZ3RoIH07XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUucmVzdG9yZSA9IGZ1bmN0aW9uIHJlc3RvcmUoZGF0YSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgc3RhdGUub2JqID0gZGF0YS5vYmo7XG4gIHN0YXRlLnBhdGggPSBzdGF0ZS5wYXRoLnNsaWNlKDAsIGRhdGEucGF0aExlbik7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuZW50ZXJLZXkgPSBmdW5jdGlvbiBlbnRlcktleShrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX3JlcG9ydGVyU3RhdGUucGF0aC5wdXNoKGtleSk7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuZXhpdEtleSA9IGZ1bmN0aW9uIGV4aXRLZXkoaW5kZXgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIHN0YXRlLnBhdGggPSBzdGF0ZS5wYXRoLnNsaWNlKDAsIGluZGV4IC0gMSk7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUubGVhdmVLZXkgPSBmdW5jdGlvbiBsZWF2ZUtleShpbmRleCwga2V5LCB2YWx1ZSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgdGhpcy5leGl0S2V5KGluZGV4KTtcbiAgaWYgKHN0YXRlLm9iaiAhPT0gbnVsbClcbiAgICBzdGF0ZS5vYmpba2V5XSA9IHZhbHVlO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLnBhdGggPSBmdW5jdGlvbiBwYXRoKCkge1xuICByZXR1cm4gdGhpcy5fcmVwb3J0ZXJTdGF0ZS5wYXRoLmpvaW4oJy8nKTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5lbnRlck9iamVjdCA9IGZ1bmN0aW9uIGVudGVyT2JqZWN0KCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgY29uc3QgcHJldiA9IHN0YXRlLm9iajtcbiAgc3RhdGUub2JqID0ge307XG4gIHJldHVybiBwcmV2O1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmxlYXZlT2JqZWN0ID0gZnVuY3Rpb24gbGVhdmVPYmplY3QocHJldikge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgY29uc3Qgbm93ID0gc3RhdGUub2JqO1xuICBzdGF0ZS5vYmogPSBwcmV2O1xuICByZXR1cm4gbm93O1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gZXJyb3IobXNnKSB7XG4gIGxldCBlcnI7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBjb25zdCBpbmhlcml0ZWQgPSBtc2cgaW5zdGFuY2VvZiBSZXBvcnRlckVycm9yO1xuICBpZiAoaW5oZXJpdGVkKSB7XG4gICAgZXJyID0gbXNnO1xuICB9IGVsc2Uge1xuICAgIGVyciA9IG5ldyBSZXBvcnRlckVycm9yKHN0YXRlLnBhdGgubWFwKGZ1bmN0aW9uKGVsZW0pIHtcbiAgICAgIHJldHVybiAnWycgKyBKU09OLnN0cmluZ2lmeShlbGVtKSArICddJztcbiAgICB9KS5qb2luKCcnKSwgbXNnLm1lc3NhZ2UgfHwgbXNnLCBtc2cuc3RhY2spO1xuICB9XG5cbiAgaWYgKCFzdGF0ZS5vcHRpb25zLnBhcnRpYWwpXG4gICAgdGhyb3cgZXJyO1xuXG4gIGlmICghaW5oZXJpdGVkKVxuICAgIHN0YXRlLmVycm9ycy5wdXNoKGVycik7XG5cbiAgcmV0dXJuIGVycjtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS53cmFwUmVzdWx0ID0gZnVuY3Rpb24gd3JhcFJlc3VsdChyZXN1bHQpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuICBpZiAoIXN0YXRlLm9wdGlvbnMucGFydGlhbClcbiAgICByZXR1cm4gcmVzdWx0O1xuXG4gIHJldHVybiB7XG4gICAgcmVzdWx0OiB0aGlzLmlzRXJyb3IocmVzdWx0KSA/IG51bGwgOiByZXN1bHQsXG4gICAgZXJyb3JzOiBzdGF0ZS5lcnJvcnNcbiAgfTtcbn07XG5cbmZ1bmN0aW9uIFJlcG9ydGVyRXJyb3IocGF0aCwgbXNnKSB7XG4gIHRoaXMucGF0aCA9IHBhdGg7XG4gIHRoaXMucmV0aHJvdyhtc2cpO1xufVxuaW5oZXJpdHMoUmVwb3J0ZXJFcnJvciwgRXJyb3IpO1xuXG5SZXBvcnRlckVycm9yLnByb3RvdHlwZS5yZXRocm93ID0gZnVuY3Rpb24gcmV0aHJvdyhtc2cpIHtcbiAgdGhpcy5tZXNzYWdlID0gbXNnICsgJyBhdDogJyArICh0aGlzLnBhdGggfHwgJyhzaGFsbG93KScpO1xuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgUmVwb3J0ZXJFcnJvcik7XG5cbiAgaWYgKCF0aGlzLnN0YWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIElFIG9ubHkgYWRkcyBzdGFjayB3aGVuIHRocm93blxuICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMubWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5zdGFjayA9IGUuc3RhY2s7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5jb25zdCBSZXBvcnRlciA9IHJlcXVpcmUoJy4uL2Jhc2UvcmVwb3J0ZXInKS5SZXBvcnRlcjtcbmNvbnN0IEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmVyLWJ1ZmZlcicpLkJ1ZmZlcjtcblxuZnVuY3Rpb24gRGVjb2RlckJ1ZmZlcihiYXNlLCBvcHRpb25zKSB7XG4gIFJlcG9ydGVyLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJhc2UpKSB7XG4gICAgdGhpcy5lcnJvcignSW5wdXQgbm90IEJ1ZmZlcicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuYmFzZSA9IGJhc2U7XG4gIHRoaXMub2Zmc2V0ID0gMDtcbiAgdGhpcy5sZW5ndGggPSBiYXNlLmxlbmd0aDtcbn1cbmluaGVyaXRzKERlY29kZXJCdWZmZXIsIFJlcG9ydGVyKTtcbmV4cG9ydHMuRGVjb2RlckJ1ZmZlciA9IERlY29kZXJCdWZmZXI7XG5cbkRlY29kZXJCdWZmZXIuaXNEZWNvZGVyQnVmZmVyID0gZnVuY3Rpb24gaXNEZWNvZGVyQnVmZmVyKGRhdGEpIHtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBEZWNvZGVyQnVmZmVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBPciBhY2NlcHQgY29tcGF0aWJsZSBBUElcbiAgY29uc3QgaXNDb21wYXRpYmxlID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgQnVmZmVyLmlzQnVmZmVyKGRhdGEuYmFzZSkgJiZcbiAgICBkYXRhLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdEZWNvZGVyQnVmZmVyJyAmJlxuICAgIHR5cGVvZiBkYXRhLm9mZnNldCA9PT0gJ251bWJlcicgJiZcbiAgICB0eXBlb2YgZGF0YS5sZW5ndGggPT09ICdudW1iZXInICYmXG4gICAgdHlwZW9mIGRhdGEuc2F2ZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBkYXRhLnJlc3RvcmUgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZGF0YS5pc0VtcHR5ID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIGRhdGEucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIGRhdGEuc2tpcCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBkYXRhLnJhdyA9PT0gJ2Z1bmN0aW9uJztcblxuICByZXR1cm4gaXNDb21wYXRpYmxlO1xufTtcblxuRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uIHNhdmUoKSB7XG4gIHJldHVybiB7IG9mZnNldDogdGhpcy5vZmZzZXQsIHJlcG9ydGVyOiBSZXBvcnRlci5wcm90b3R5cGUuc2F2ZS5jYWxsKHRoaXMpIH07XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5yZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZShzYXZlKSB7XG4gIC8vIFJldHVybiBza2lwcGVkIGRhdGFcbiAgY29uc3QgcmVzID0gbmV3IERlY29kZXJCdWZmZXIodGhpcy5iYXNlKTtcbiAgcmVzLm9mZnNldCA9IHNhdmUub2Zmc2V0O1xuICByZXMubGVuZ3RoID0gdGhpcy5vZmZzZXQ7XG5cbiAgdGhpcy5vZmZzZXQgPSBzYXZlLm9mZnNldDtcbiAgUmVwb3J0ZXIucHJvdG90eXBlLnJlc3RvcmUuY2FsbCh0aGlzLCBzYXZlLnJlcG9ydGVyKTtcblxuICByZXR1cm4gcmVzO1xufTtcblxuRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uIGlzRW1wdHkoKSB7XG4gIHJldHVybiB0aGlzLm9mZnNldCA9PT0gdGhpcy5sZW5ndGg7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDgoZmFpbCkge1xuICBpZiAodGhpcy5vZmZzZXQgKyAxIDw9IHRoaXMubGVuZ3RoKVxuICAgIHJldHVybiB0aGlzLmJhc2UucmVhZFVJbnQ4KHRoaXMub2Zmc2V0KyssIHRydWUpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuZXJyb3IoZmFpbCB8fCAnRGVjb2RlckJ1ZmZlciBvdmVycnVuJyk7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24gc2tpcChieXRlcywgZmFpbCkge1xuICBpZiAoISh0aGlzLm9mZnNldCArIGJ5dGVzIDw9IHRoaXMubGVuZ3RoKSlcbiAgICByZXR1cm4gdGhpcy5lcnJvcihmYWlsIHx8ICdEZWNvZGVyQnVmZmVyIG92ZXJydW4nKTtcblxuICBjb25zdCByZXMgPSBuZXcgRGVjb2RlckJ1ZmZlcih0aGlzLmJhc2UpO1xuXG4gIC8vIFNoYXJlIHJlcG9ydGVyIHN0YXRlXG4gIHJlcy5fcmVwb3J0ZXJTdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgcmVzLm9mZnNldCA9IHRoaXMub2Zmc2V0O1xuICByZXMubGVuZ3RoID0gdGhpcy5vZmZzZXQgKyBieXRlcztcbiAgdGhpcy5vZmZzZXQgKz0gYnl0ZXM7XG4gIHJldHVybiByZXM7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5yYXcgPSBmdW5jdGlvbiByYXcoc2F2ZSkge1xuICByZXR1cm4gdGhpcy5iYXNlLnNsaWNlKHNhdmUgPyBzYXZlLm9mZnNldCA6IHRoaXMub2Zmc2V0LCB0aGlzLmxlbmd0aCk7XG59O1xuXG5mdW5jdGlvbiBFbmNvZGVyQnVmZmVyKHZhbHVlLCByZXBvcnRlcikge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlLm1hcChmdW5jdGlvbihpdGVtKSB7XG4gICAgICBpZiAoIUVuY29kZXJCdWZmZXIuaXNFbmNvZGVyQnVmZmVyKGl0ZW0pKVxuICAgICAgICBpdGVtID0gbmV3IEVuY29kZXJCdWZmZXIoaXRlbSwgcmVwb3J0ZXIpO1xuICAgICAgdGhpcy5sZW5ndGggKz0gaXRlbS5sZW5ndGg7XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9LCB0aGlzKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKCEoMCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAweGZmKSlcbiAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignbm9uLWJ5dGUgRW5jb2RlckJ1ZmZlciB2YWx1ZScpO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmxlbmd0aCA9IDE7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHZhbHVlKTtcbiAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXBvcnRlci5lcnJvcignVW5zdXBwb3J0ZWQgdHlwZTogJyArIHR5cGVvZiB2YWx1ZSk7XG4gIH1cbn1cbmV4cG9ydHMuRW5jb2RlckJ1ZmZlciA9IEVuY29kZXJCdWZmZXI7XG5cbkVuY29kZXJCdWZmZXIuaXNFbmNvZGVyQnVmZmVyID0gZnVuY3Rpb24gaXNFbmNvZGVyQnVmZmVyKGRhdGEpIHtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBFbmNvZGVyQnVmZmVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBPciBhY2NlcHQgY29tcGF0aWJsZSBBUElcbiAgY29uc3QgaXNDb21wYXRpYmxlID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgZGF0YS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnRW5jb2RlckJ1ZmZlcicgJiZcbiAgICB0eXBlb2YgZGF0YS5sZW5ndGggPT09ICdudW1iZXInICYmXG4gICAgdHlwZW9mIGRhdGEuam9pbiA9PT0gJ2Z1bmN0aW9uJztcblxuICByZXR1cm4gaXNDb21wYXRpYmxlO1xufTtcblxuRW5jb2RlckJ1ZmZlci5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIGpvaW4ob3V0LCBvZmZzZXQpIHtcbiAgaWYgKCFvdXQpXG4gICAgb3V0ID0gQnVmZmVyLmFsbG9jKHRoaXMubGVuZ3RoKTtcbiAgaWYgKCFvZmZzZXQpXG4gICAgb2Zmc2V0ID0gMDtcblxuICBpZiAodGhpcy5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIG91dDtcblxuICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgIHRoaXMudmFsdWUuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XG4gICAgICBpdGVtLmpvaW4ob3V0LCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IGl0ZW0ubGVuZ3RoO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ251bWJlcicpXG4gICAgICBvdXRbb2Zmc2V0XSA9IHRoaXMudmFsdWU7XG4gICAgZWxzZSBpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgb3V0LndyaXRlKHRoaXMudmFsdWUsIG9mZnNldCk7XG4gICAgZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKHRoaXMudmFsdWUpKVxuICAgICAgdGhpcy52YWx1ZS5jb3B5KG91dCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gdGhpcy5sZW5ndGg7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufTtcbiIsCiAgICAibW9kdWxlLmV4cG9ydHMgPSBhc3NlcnQ7XG5cbmZ1bmN0aW9uIGFzc2VydCh2YWwsIG1zZykge1xuICBpZiAoIXZhbClcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnIHx8ICdBc3NlcnRpb24gZmFpbGVkJyk7XG59XG5cbmFzc2VydC5lcXVhbCA9IGZ1bmN0aW9uIGFzc2VydEVxdWFsKGwsIHIsIG1zZykge1xuICBpZiAobCAhPSByKVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cgfHwgKCdBc3NlcnRpb24gZmFpbGVkOiAnICsgbCArICcgIT0gJyArIHIpKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgUmVwb3J0ZXIgPSByZXF1aXJlKCcuLi9iYXNlL3JlcG9ydGVyJykuUmVwb3J0ZXI7XG5jb25zdCBFbmNvZGVyQnVmZmVyID0gcmVxdWlyZSgnLi4vYmFzZS9idWZmZXInKS5FbmNvZGVyQnVmZmVyO1xuY29uc3QgRGVjb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4uL2Jhc2UvYnVmZmVyJykuRGVjb2RlckJ1ZmZlcjtcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuLy8gU3VwcG9ydGVkIHRhZ3NcbmNvbnN0IHRhZ3MgPSBbXG4gICdzZXEnLCAnc2Vxb2YnLCAnc2V0JywgJ3NldG9mJywgJ29iamlkJywgJ2Jvb2wnLFxuICAnZ2VudGltZScsICd1dGN0aW1lJywgJ251bGxfJywgJ2VudW0nLCAnaW50JywgJ29iakRlc2MnLFxuICAnYml0c3RyJywgJ2JtcHN0cicsICdjaGFyc3RyJywgJ2dlbnN0cicsICdncmFwaHN0cicsICdpYTVzdHInLCAnaXNvNjQ2c3RyJyxcbiAgJ251bXN0cicsICdvY3RzdHInLCAncHJpbnRzdHInLCAndDYxc3RyJywgJ3VuaXN0cicsICd1dGY4c3RyJywgJ3ZpZGVvc3RyJ1xuXTtcblxuLy8gUHVibGljIG1ldGhvZHMgbGlzdFxuY29uc3QgbWV0aG9kcyA9IFtcbiAgJ2tleScsICdvYmonLCAndXNlJywgJ29wdGlvbmFsJywgJ2V4cGxpY2l0JywgJ2ltcGxpY2l0JywgJ2RlZicsICdjaG9pY2UnLFxuICAnYW55JywgJ2NvbnRhaW5zJ1xuXS5jb25jYXQodGFncyk7XG5cbi8vIE92ZXJyaWRlZCBtZXRob2RzIGxpc3RcbmNvbnN0IG92ZXJyaWRlZCA9IFtcbiAgJ19wZWVrVGFnJywgJ19kZWNvZGVUYWcnLCAnX3VzZScsXG4gICdfZGVjb2RlU3RyJywgJ19kZWNvZGVPYmppZCcsICdfZGVjb2RlVGltZScsXG4gICdfZGVjb2RlTnVsbCcsICdfZGVjb2RlSW50JywgJ19kZWNvZGVCb29sJywgJ19kZWNvZGVMaXN0JyxcblxuICAnX2VuY29kZUNvbXBvc2l0ZScsICdfZW5jb2RlU3RyJywgJ19lbmNvZGVPYmppZCcsICdfZW5jb2RlVGltZScsXG4gICdfZW5jb2RlTnVsbCcsICdfZW5jb2RlSW50JywgJ19lbmNvZGVCb29sJ1xuXTtcblxuZnVuY3Rpb24gTm9kZShlbmMsIHBhcmVudCwgbmFtZSkge1xuICBjb25zdCBzdGF0ZSA9IHt9O1xuICB0aGlzLl9iYXNlU3RhdGUgPSBzdGF0ZTtcblxuICBzdGF0ZS5uYW1lID0gbmFtZTtcbiAgc3RhdGUuZW5jID0gZW5jO1xuXG4gIHN0YXRlLnBhcmVudCA9IHBhcmVudCB8fCBudWxsO1xuICBzdGF0ZS5jaGlsZHJlbiA9IG51bGw7XG5cbiAgLy8gU3RhdGVcbiAgc3RhdGUudGFnID0gbnVsbDtcbiAgc3RhdGUuYXJncyA9IG51bGw7XG4gIHN0YXRlLnJldmVyc2VBcmdzID0gbnVsbDtcbiAgc3RhdGUuY2hvaWNlID0gbnVsbDtcbiAgc3RhdGUub3B0aW9uYWwgPSBmYWxzZTtcbiAgc3RhdGUuYW55ID0gZmFsc2U7XG4gIHN0YXRlLm9iaiA9IGZhbHNlO1xuICBzdGF0ZS51c2UgPSBudWxsO1xuICBzdGF0ZS51c2VEZWNvZGVyID0gbnVsbDtcbiAgc3RhdGUua2V5ID0gbnVsbDtcbiAgc3RhdGVbJ2RlZmF1bHQnXSA9IG51bGw7XG4gIHN0YXRlLmV4cGxpY2l0ID0gbnVsbDtcbiAgc3RhdGUuaW1wbGljaXQgPSBudWxsO1xuICBzdGF0ZS5jb250YWlucyA9IG51bGw7XG5cbiAgLy8gU2hvdWxkIGNyZWF0ZSBuZXcgaW5zdGFuY2Ugb24gZWFjaCBtZXRob2RcbiAgaWYgKCFzdGF0ZS5wYXJlbnQpIHtcbiAgICBzdGF0ZS5jaGlsZHJlbiA9IFtdO1xuICAgIHRoaXMuX3dyYXAoKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBOb2RlO1xuXG5jb25zdCBzdGF0ZVByb3BzID0gW1xuICAnZW5jJywgJ3BhcmVudCcsICdjaGlsZHJlbicsICd0YWcnLCAnYXJncycsICdyZXZlcnNlQXJncycsICdjaG9pY2UnLFxuICAnb3B0aW9uYWwnLCAnYW55JywgJ29iaicsICd1c2UnLCAnYWx0ZXJlZFVzZScsICdrZXknLCAnZGVmYXVsdCcsICdleHBsaWNpdCcsXG4gICdpbXBsaWNpdCcsICdjb250YWlucydcbl07XG5cbk5vZGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gY2xvbmUoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBjb25zdCBjc3RhdGUgPSB7fTtcbiAgc3RhdGVQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcbiAgICBjc3RhdGVbcHJvcF0gPSBzdGF0ZVtwcm9wXTtcbiAgfSk7XG4gIGNvbnN0IHJlcyA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGNzdGF0ZS5wYXJlbnQpO1xuICByZXMuX2Jhc2VTdGF0ZSA9IGNzdGF0ZTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbk5vZGUucHJvdG90eXBlLl93cmFwID0gZnVuY3Rpb24gd3JhcCgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIG1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICB0aGlzW21ldGhvZF0gPSBmdW5jdGlvbiBfd3JhcHBlZE1ldGhvZCgpIHtcbiAgICAgIGNvbnN0IGNsb25lID0gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyk7XG4gICAgICBzdGF0ZS5jaGlsZHJlbi5wdXNoKGNsb25lKTtcbiAgICAgIHJldHVybiBjbG9uZVttZXRob2RdLmFwcGx5KGNsb25lLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0sIHRoaXMpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0KGJvZHkpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLnBhcmVudCA9PT0gbnVsbCk7XG4gIGJvZHkuY2FsbCh0aGlzKTtcblxuICAvLyBGaWx0ZXIgY2hpbGRyZW5cbiAgc3RhdGUuY2hpbGRyZW4gPSBzdGF0ZS5jaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24oY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQuX2Jhc2VTdGF0ZS5wYXJlbnQgPT09IHRoaXM7XG4gIH0sIHRoaXMpO1xuICBhc3NlcnQuZXF1YWwoc3RhdGUuY2hpbGRyZW4ubGVuZ3RoLCAxLCAnUm9vdCBub2RlIGNhbiBoYXZlIG9ubHkgb25lIGNoaWxkJyk7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fdXNlQXJncyA9IGZ1bmN0aW9uIHVzZUFyZ3MoYXJncykge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAvLyBGaWx0ZXIgY2hpbGRyZW4gYW5kIGFyZ3NcbiAgY29uc3QgY2hpbGRyZW4gPSBhcmdzLmZpbHRlcihmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gYXJnIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3RvcjtcbiAgfSwgdGhpcyk7XG4gIGFyZ3MgPSBhcmdzLmZpbHRlcihmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gIShhcmcgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfSwgdGhpcyk7XG5cbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCAhPT0gMCkge1xuICAgIGFzc2VydChzdGF0ZS5jaGlsZHJlbiA9PT0gbnVsbCk7XG4gICAgc3RhdGUuY2hpbGRyZW4gPSBjaGlsZHJlbjtcblxuICAgIC8vIFJlcGxhY2UgcGFyZW50IHRvIG1haW50YWluIGJhY2t3YXJkIGxpbmtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBjaGlsZC5fYmFzZVN0YXRlLnBhcmVudCA9IHRoaXM7XG4gICAgfSwgdGhpcyk7XG4gIH1cbiAgaWYgKGFyZ3MubGVuZ3RoICE9PSAwKSB7XG4gICAgYXNzZXJ0KHN0YXRlLmFyZ3MgPT09IG51bGwpO1xuICAgIHN0YXRlLmFyZ3MgPSBhcmdzO1xuICAgIHN0YXRlLnJldmVyc2VBcmdzID0gYXJncy5tYXAoZnVuY3Rpb24oYXJnKSB7XG4gICAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ29iamVjdCcgfHwgYXJnLmNvbnN0cnVjdG9yICE9PSBPYmplY3QpXG4gICAgICAgIHJldHVybiBhcmc7XG5cbiAgICAgIGNvbnN0IHJlcyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMoYXJnKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBpZiAoa2V5ID09IChrZXkgfCAwKSlcbiAgICAgICAgICBrZXkgfD0gMDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhcmdba2V5XTtcbiAgICAgICAgcmVzW3ZhbHVlXSA9IGtleTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcbiAgfVxufTtcblxuLy9cbi8vIE92ZXJyaWRlZCBtZXRob2RzXG4vL1xuXG5vdmVycmlkZWQuZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgTm9kZS5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uIF9vdmVycmlkZWQoKSB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1ldGhvZCArICcgbm90IGltcGxlbWVudGVkIGZvciBlbmNvZGluZzogJyArIHN0YXRlLmVuYyk7XG4gIH07XG59KTtcblxuLy9cbi8vIFB1YmxpYyBtZXRob2RzXG4vL1xuXG50YWdzLmZvckVhY2goZnVuY3Rpb24odGFnKSB7XG4gIE5vZGUucHJvdG90eXBlW3RhZ10gPSBmdW5jdGlvbiBfdGFnTWV0aG9kKCkge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gICAgYXNzZXJ0KHN0YXRlLnRhZyA9PT0gbnVsbCk7XG4gICAgc3RhdGUudGFnID0gdGFnO1xuXG4gICAgdGhpcy5fdXNlQXJncyhhcmdzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufSk7XG5cbk5vZGUucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIHVzZShpdGVtKSB7XG4gIGFzc2VydChpdGVtKTtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLnVzZSA9PT0gbnVsbCk7XG4gIHN0YXRlLnVzZSA9IGl0ZW07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5vcHRpb25hbCA9IGZ1bmN0aW9uIG9wdGlvbmFsKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBzdGF0ZS5vcHRpb25hbCA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5kZWYgPSBmdW5jdGlvbiBkZWYodmFsKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZVsnZGVmYXVsdCddID09PSBudWxsKTtcbiAgc3RhdGVbJ2RlZmF1bHQnXSA9IHZhbDtcbiAgc3RhdGUub3B0aW9uYWwgPSB0cnVlO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuZXhwbGljaXQgPSBmdW5jdGlvbiBleHBsaWNpdChudW0pIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLmV4cGxpY2l0ID09PSBudWxsICYmIHN0YXRlLmltcGxpY2l0ID09PSBudWxsKTtcbiAgc3RhdGUuZXhwbGljaXQgPSBudW07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5pbXBsaWNpdCA9IGZ1bmN0aW9uIGltcGxpY2l0KG51bSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUuZXhwbGljaXQgPT09IG51bGwgJiYgc3RhdGUuaW1wbGljaXQgPT09IG51bGwpO1xuICBzdGF0ZS5pbXBsaWNpdCA9IG51bTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLm9iaiA9IGZ1bmN0aW9uIG9iaigpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gIHN0YXRlLm9iaiA9IHRydWU7XG5cbiAgaWYgKGFyZ3MubGVuZ3RoICE9PSAwKVxuICAgIHRoaXMuX3VzZUFyZ3MoYXJncyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5rZXkgPSBmdW5jdGlvbiBrZXkobmV3S2V5KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS5rZXkgPT09IG51bGwpO1xuICBzdGF0ZS5rZXkgPSBuZXdLZXk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5hbnkgPSBmdW5jdGlvbiBhbnkoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIHN0YXRlLmFueSA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5jaG9pY2UgPSBmdW5jdGlvbiBjaG9pY2Uob2JqKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS5jaG9pY2UgPT09IG51bGwpO1xuICBzdGF0ZS5jaG9pY2UgPSBvYmo7XG4gIHRoaXMuX3VzZUFyZ3MoT2JqZWN0LmtleXMob2JqKS5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIG9ialtrZXldO1xuICB9KSk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIGNvbnRhaW5zKGl0ZW0pIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLnVzZSA9PT0gbnVsbCk7XG4gIHN0YXRlLmNvbnRhaW5zID0gaXRlbTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vXG4vLyBEZWNvZGluZ1xuLy9cblxuTm9kZS5wcm90b3R5cGUuX2RlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShpbnB1dCwgb3B0aW9ucykge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAvLyBEZWNvZGUgcm9vdCBub2RlXG4gIGlmIChzdGF0ZS5wYXJlbnQgPT09IG51bGwpXG4gICAgcmV0dXJuIGlucHV0LndyYXBSZXN1bHQoc3RhdGUuY2hpbGRyZW5bMF0uX2RlY29kZShpbnB1dCwgb3B0aW9ucykpO1xuXG4gIGxldCByZXN1bHQgPSBzdGF0ZVsnZGVmYXVsdCddO1xuICBsZXQgcHJlc2VudCA9IHRydWU7XG5cbiAgbGV0IHByZXZLZXkgPSBudWxsO1xuICBpZiAoc3RhdGUua2V5ICE9PSBudWxsKVxuICAgIHByZXZLZXkgPSBpbnB1dC5lbnRlcktleShzdGF0ZS5rZXkpO1xuXG4gIC8vIENoZWNrIGlmIHRhZyBpcyB0aGVyZVxuICBpZiAoc3RhdGUub3B0aW9uYWwpIHtcbiAgICBsZXQgdGFnID0gbnVsbDtcbiAgICBpZiAoc3RhdGUuZXhwbGljaXQgIT09IG51bGwpXG4gICAgICB0YWcgPSBzdGF0ZS5leHBsaWNpdDtcbiAgICBlbHNlIGlmIChzdGF0ZS5pbXBsaWNpdCAhPT0gbnVsbClcbiAgICAgIHRhZyA9IHN0YXRlLmltcGxpY2l0O1xuICAgIGVsc2UgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbClcbiAgICAgIHRhZyA9IHN0YXRlLnRhZztcblxuICAgIGlmICh0YWcgPT09IG51bGwgJiYgIXN0YXRlLmFueSkge1xuICAgICAgLy8gVHJpYWwgYW5kIEVycm9yXG4gICAgICBjb25zdCBzYXZlID0gaW5wdXQuc2F2ZSgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHN0YXRlLmNob2ljZSA9PT0gbnVsbClcbiAgICAgICAgICB0aGlzLl9kZWNvZGVHZW5lcmljKHN0YXRlLnRhZywgaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhpcy5fZGVjb2RlQ2hvaWNlKGlucHV0LCBvcHRpb25zKTtcbiAgICAgICAgcHJlc2VudCA9IHRydWU7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHByZXNlbnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlucHV0LnJlc3RvcmUoc2F2ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZXNlbnQgPSB0aGlzLl9wZWVrVGFnKGlucHV0LCB0YWcsIHN0YXRlLmFueSk7XG5cbiAgICAgIGlmIChpbnB1dC5pc0Vycm9yKHByZXNlbnQpKVxuICAgICAgICByZXR1cm4gcHJlc2VudDtcbiAgICB9XG4gIH1cblxuICAvLyBQdXNoIG9iamVjdCBvbiBzdGFja1xuICBsZXQgcHJldk9iajtcbiAgaWYgKHN0YXRlLm9iaiAmJiBwcmVzZW50KVxuICAgIHByZXZPYmogPSBpbnB1dC5lbnRlck9iamVjdCgpO1xuXG4gIGlmIChwcmVzZW50KSB7XG4gICAgLy8gVW53cmFwIGV4cGxpY2l0IHZhbHVlc1xuICAgIGlmIChzdGF0ZS5leHBsaWNpdCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgZXhwbGljaXQgPSB0aGlzLl9kZWNvZGVUYWcoaW5wdXQsIHN0YXRlLmV4cGxpY2l0KTtcbiAgICAgIGlmIChpbnB1dC5pc0Vycm9yKGV4cGxpY2l0KSlcbiAgICAgICAgcmV0dXJuIGV4cGxpY2l0O1xuICAgICAgaW5wdXQgPSBleHBsaWNpdDtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydCA9IGlucHV0Lm9mZnNldDtcblxuICAgIC8vIFVud3JhcCBpbXBsaWNpdCBhbmQgbm9ybWFsIHZhbHVlc1xuICAgIGlmIChzdGF0ZS51c2UgPT09IG51bGwgJiYgc3RhdGUuY2hvaWNlID09PSBudWxsKSB7XG4gICAgICBsZXQgc2F2ZTtcbiAgICAgIGlmIChzdGF0ZS5hbnkpXG4gICAgICAgIHNhdmUgPSBpbnB1dC5zYXZlKCk7XG4gICAgICBjb25zdCBib2R5ID0gdGhpcy5fZGVjb2RlVGFnKFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgc3RhdGUuaW1wbGljaXQgIT09IG51bGwgPyBzdGF0ZS5pbXBsaWNpdCA6IHN0YXRlLnRhZyxcbiAgICAgICAgc3RhdGUuYW55XG4gICAgICApO1xuICAgICAgaWYgKGlucHV0LmlzRXJyb3IoYm9keSkpXG4gICAgICAgIHJldHVybiBib2R5O1xuXG4gICAgICBpZiAoc3RhdGUuYW55KVxuICAgICAgICByZXN1bHQgPSBpbnB1dC5yYXcoc2F2ZSk7XG4gICAgICBlbHNlXG4gICAgICAgIGlucHV0ID0gYm9keTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRyYWNrICYmIHN0YXRlLnRhZyAhPT0gbnVsbClcbiAgICAgIG9wdGlvbnMudHJhY2soaW5wdXQucGF0aCgpLCBzdGFydCwgaW5wdXQubGVuZ3RoLCAndGFnZ2VkJyk7XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRyYWNrICYmIHN0YXRlLnRhZyAhPT0gbnVsbClcbiAgICAgIG9wdGlvbnMudHJhY2soaW5wdXQucGF0aCgpLCBpbnB1dC5vZmZzZXQsIGlucHV0Lmxlbmd0aCwgJ2NvbnRlbnQnKTtcblxuICAgIC8vIFNlbGVjdCBwcm9wZXIgbWV0aG9kIGZvciB0YWdcbiAgICBpZiAoc3RhdGUuYW55KSB7XG4gICAgICAvLyBuby1vcFxuICAgIH0gZWxzZSBpZiAoc3RhdGUuY2hvaWNlID09PSBudWxsKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLl9kZWNvZGVHZW5lcmljKHN0YXRlLnRhZywgaW5wdXQsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLl9kZWNvZGVDaG9pY2UoaW5wdXQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChpbnB1dC5pc0Vycm9yKHJlc3VsdCkpXG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgLy8gRGVjb2RlIGNoaWxkcmVuXG4gICAgaWYgKCFzdGF0ZS5hbnkgJiYgc3RhdGUuY2hvaWNlID09PSBudWxsICYmIHN0YXRlLmNoaWxkcmVuICE9PSBudWxsKSB7XG4gICAgICBzdGF0ZS5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIGRlY29kZUNoaWxkcmVuKGNoaWxkKSB7XG4gICAgICAgIC8vIE5PVEU6IFdlIGFyZSBpZ25vcmluZyBlcnJvcnMgaGVyZSwgdG8gbGV0IHBhcnNlciBjb250aW51ZSB3aXRoIG90aGVyXG4gICAgICAgIC8vIHBhcnRzIG9mIGVuY29kZWQgZGF0YVxuICAgICAgICBjaGlsZC5fZGVjb2RlKGlucHV0LCBvcHRpb25zKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERlY29kZSBjb250YWluZWQvZW5jb2RlZCBieSBzY2hlbWEsIG9ubHkgaW4gYml0IG9yIG9jdGV0IHN0cmluZ3NcbiAgICBpZiAoc3RhdGUuY29udGFpbnMgJiYgKHN0YXRlLnRhZyA9PT0gJ29jdHN0cicgfHwgc3RhdGUudGFnID09PSAnYml0c3RyJykpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgRGVjb2RlckJ1ZmZlcihyZXN1bHQpO1xuICAgICAgcmVzdWx0ID0gdGhpcy5fZ2V0VXNlKHN0YXRlLmNvbnRhaW5zLCBpbnB1dC5fcmVwb3J0ZXJTdGF0ZS5vYmopXG4gICAgICAgIC5fZGVjb2RlKGRhdGEsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBvcCBvYmplY3RcbiAgaWYgKHN0YXRlLm9iaiAmJiBwcmVzZW50KVxuICAgIHJlc3VsdCA9IGlucHV0LmxlYXZlT2JqZWN0KHByZXZPYmopO1xuXG4gIC8vIFNldCBrZXlcbiAgaWYgKHN0YXRlLmtleSAhPT0gbnVsbCAmJiAocmVzdWx0ICE9PSBudWxsIHx8IHByZXNlbnQgPT09IHRydWUpKVxuICAgIGlucHV0LmxlYXZlS2V5KHByZXZLZXksIHN0YXRlLmtleSwgcmVzdWx0KTtcbiAgZWxzZSBpZiAocHJldktleSAhPT0gbnVsbClcbiAgICBpbnB1dC5leGl0S2V5KHByZXZLZXkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZGVjb2RlR2VuZXJpYyA9IGZ1bmN0aW9uIGRlY29kZUdlbmVyaWModGFnLCBpbnB1dCwgb3B0aW9ucykge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBpZiAodGFnID09PSAnc2VxJyB8fCB0YWcgPT09ICdzZXQnKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAodGFnID09PSAnc2Vxb2YnIHx8IHRhZyA9PT0gJ3NldG9mJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlTGlzdChpbnB1dCwgdGFnLCBzdGF0ZS5hcmdzWzBdLCBvcHRpb25zKTtcbiAgZWxzZSBpZiAoL3N0ciQvLnRlc3QodGFnKSlcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlU3RyKGlucHV0LCB0YWcsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmppZCcgJiYgc3RhdGUuYXJncylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlT2JqaWQoaW5wdXQsIHN0YXRlLmFyZ3NbMF0sIHN0YXRlLmFyZ3NbMV0sIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmppZCcpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZU9iamlkKGlucHV0LCBudWxsLCBudWxsLCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnZ2VudGltZScgfHwgdGFnID09PSAndXRjdGltZScpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZVRpbWUoaW5wdXQsIHRhZywgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ251bGxfJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlTnVsbChpbnB1dCwgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2Jvb2wnKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVCb29sKGlucHV0LCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnb2JqRGVzYycpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZVN0cihpbnB1dCwgdGFnLCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnaW50JyB8fCB0YWcgPT09ICdlbnVtJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlSW50KGlucHV0LCBzdGF0ZS5hcmdzICYmIHN0YXRlLmFyZ3NbMF0sIG9wdGlvbnMpO1xuXG4gIGlmIChzdGF0ZS51c2UgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0VXNlKHN0YXRlLnVzZSwgaW5wdXQuX3JlcG9ydGVyU3RhdGUub2JqKVxuICAgICAgLl9kZWNvZGUoaW5wdXQsIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBpbnB1dC5lcnJvcigndW5rbm93biB0YWc6ICcgKyB0YWcpO1xuICB9XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZ2V0VXNlID0gZnVuY3Rpb24gX2dldFVzZShlbnRpdHksIG9iaikge1xuXG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICAvLyBDcmVhdGUgYWx0ZXJlZCB1c2UgZGVjb2RlciBpZiBpbXBsaWNpdCBpcyBzZXRcbiAgc3RhdGUudXNlRGVjb2RlciA9IHRoaXMuX3VzZShlbnRpdHksIG9iaik7XG4gIGFzc2VydChzdGF0ZS51c2VEZWNvZGVyLl9iYXNlU3RhdGUucGFyZW50ID09PSBudWxsKTtcbiAgc3RhdGUudXNlRGVjb2RlciA9IHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5jaGlsZHJlblswXTtcbiAgaWYgKHN0YXRlLmltcGxpY2l0ICE9PSBzdGF0ZS51c2VEZWNvZGVyLl9iYXNlU3RhdGUuaW1wbGljaXQpIHtcbiAgICBzdGF0ZS51c2VEZWNvZGVyID0gc3RhdGUudXNlRGVjb2Rlci5jbG9uZSgpO1xuICAgIHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5pbXBsaWNpdCA9IHN0YXRlLmltcGxpY2l0O1xuICB9XG4gIHJldHVybiBzdGF0ZS51c2VEZWNvZGVyO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2RlY29kZUNob2ljZSA9IGZ1bmN0aW9uIGRlY29kZUNob2ljZShpbnB1dCwgb3B0aW9ucykge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgbGV0IHJlc3VsdCA9IG51bGw7XG4gIGxldCBtYXRjaCA9IGZhbHNlO1xuXG4gIE9iamVjdC5rZXlzKHN0YXRlLmNob2ljZSkuc29tZShmdW5jdGlvbihrZXkpIHtcbiAgICBjb25zdCBzYXZlID0gaW5wdXQuc2F2ZSgpO1xuICAgIGNvbnN0IG5vZGUgPSBzdGF0ZS5jaG9pY2Vba2V5XTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsdWUgPSBub2RlLl9kZWNvZGUoaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgaWYgKGlucHV0LmlzRXJyb3IodmFsdWUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJlc3VsdCA9IHsgdHlwZToga2V5LCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgIG1hdGNoID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpbnB1dC5yZXN0b3JlKHNhdmUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSwgdGhpcyk7XG5cbiAgaWYgKCFtYXRjaClcbiAgICByZXR1cm4gaW5wdXQuZXJyb3IoJ0Nob2ljZSBub3QgbWF0Y2hlZCcpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vL1xuLy8gRW5jb2Rpbmdcbi8vXG5cbk5vZGUucHJvdG90eXBlLl9jcmVhdGVFbmNvZGVyQnVmZmVyID0gZnVuY3Rpb24gY3JlYXRlRW5jb2RlckJ1ZmZlcihkYXRhKSB7XG4gIHJldHVybiBuZXcgRW5jb2RlckJ1ZmZlcihkYXRhLCB0aGlzLnJlcG9ydGVyKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgcmVwb3J0ZXIsIHBhcmVudCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgaWYgKHN0YXRlWydkZWZhdWx0J10gIT09IG51bGwgJiYgc3RhdGVbJ2RlZmF1bHQnXSA9PT0gZGF0YSlcbiAgICByZXR1cm47XG5cbiAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZW5jb2RlVmFsdWUoZGF0YSwgcmVwb3J0ZXIsIHBhcmVudCk7XG4gIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm47XG5cbiAgaWYgKHRoaXMuX3NraXBEZWZhdWx0KHJlc3VsdCwgcmVwb3J0ZXIsIHBhcmVudCkpXG4gICAgcmV0dXJuO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZW5jb2RlVmFsdWUgPSBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgcmVwb3J0ZXIsIHBhcmVudCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAvLyBEZWNvZGUgcm9vdCBub2RlXG4gIGlmIChzdGF0ZS5wYXJlbnQgPT09IG51bGwpXG4gICAgcmV0dXJuIHN0YXRlLmNoaWxkcmVuWzBdLl9lbmNvZGUoZGF0YSwgcmVwb3J0ZXIgfHwgbmV3IFJlcG9ydGVyKCkpO1xuXG4gIGxldCByZXN1bHQgPSBudWxsO1xuXG4gIC8vIFNldCByZXBvcnRlciB0byBzaGFyZSBpdCB3aXRoIGEgY2hpbGQgY2xhc3NcbiAgdGhpcy5yZXBvcnRlciA9IHJlcG9ydGVyO1xuXG4gIC8vIENoZWNrIGlmIGRhdGEgaXMgdGhlcmVcbiAgaWYgKHN0YXRlLm9wdGlvbmFsICYmIGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzdGF0ZVsnZGVmYXVsdCddICE9PSBudWxsKVxuICAgICAgZGF0YSA9IHN0YXRlWydkZWZhdWx0J107XG4gICAgZWxzZVxuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRW5jb2RlIGNoaWxkcmVuIGZpcnN0XG4gIGxldCBjb250ZW50ID0gbnVsbDtcbiAgbGV0IHByaW1pdGl2ZSA9IGZhbHNlO1xuICBpZiAoc3RhdGUuYW55KSB7XG4gICAgLy8gQW55dGhpbmcgdGhhdCB3YXMgZ2l2ZW4gaXMgdHJhbnNsYXRlZCB0byBidWZmZXJcbiAgICByZXN1bHQgPSB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGRhdGEpO1xuICB9IGVsc2UgaWYgKHN0YXRlLmNob2ljZSkge1xuICAgIHJlc3VsdCA9IHRoaXMuX2VuY29kZUNob2ljZShkYXRhLCByZXBvcnRlcik7XG4gIH0gZWxzZSBpZiAoc3RhdGUuY29udGFpbnMpIHtcbiAgICBjb250ZW50ID0gdGhpcy5fZ2V0VXNlKHN0YXRlLmNvbnRhaW5zLCBwYXJlbnQpLl9lbmNvZGUoZGF0YSwgcmVwb3J0ZXIpO1xuICAgIHByaW1pdGl2ZSA9IHRydWU7XG4gIH0gZWxzZSBpZiAoc3RhdGUuY2hpbGRyZW4pIHtcbiAgICBjb250ZW50ID0gc3RhdGUuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBpZiAoY2hpbGQuX2Jhc2VTdGF0ZS50YWcgPT09ICdudWxsXycpXG4gICAgICAgIHJldHVybiBjaGlsZC5fZW5jb2RlKG51bGwsIHJlcG9ydGVyLCBkYXRhKTtcblxuICAgICAgaWYgKGNoaWxkLl9iYXNlU3RhdGUua2V5ID09PSBudWxsKVxuICAgICAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ0NoaWxkIHNob3VsZCBoYXZlIGEga2V5Jyk7XG4gICAgICBjb25zdCBwcmV2S2V5ID0gcmVwb3J0ZXIuZW50ZXJLZXkoY2hpbGQuX2Jhc2VTdGF0ZS5rZXkpO1xuXG4gICAgICBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKVxuICAgICAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ0NoaWxkIGV4cGVjdGVkLCBidXQgaW5wdXQgaXMgbm90IG9iamVjdCcpO1xuXG4gICAgICBjb25zdCByZXMgPSBjaGlsZC5fZW5jb2RlKGRhdGFbY2hpbGQuX2Jhc2VTdGF0ZS5rZXldLCByZXBvcnRlciwgZGF0YSk7XG4gICAgICByZXBvcnRlci5sZWF2ZUtleShwcmV2S2V5KTtcblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LCB0aGlzKS5maWx0ZXIoZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9KTtcbiAgICBjb250ZW50ID0gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihjb250ZW50KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoc3RhdGUudGFnID09PSAnc2Vxb2YnIHx8IHN0YXRlLnRhZyA9PT0gJ3NldG9mJykge1xuICAgICAgLy8gVE9ETyhpbmR1dG55KTogdGhpcyBzaG91bGQgYmUgdGhyb3duIG9uIERTTCBsZXZlbFxuICAgICAgaWYgKCEoc3RhdGUuYXJncyAmJiBzdGF0ZS5hcmdzLmxlbmd0aCA9PT0gMSkpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignVG9vIG1hbnkgYXJncyBmb3IgOiAnICsgc3RhdGUudGFnKTtcblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKVxuICAgICAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ3NlcW9mL3NldG9mLCBidXQgZGF0YSBpcyBub3QgQXJyYXknKTtcblxuICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLmNsb25lKCk7XG4gICAgICBjaGlsZC5fYmFzZVN0YXRlLmltcGxpY2l0ID0gbnVsbDtcbiAgICAgIGNvbnRlbnQgPSB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGRhdGEubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFVzZShzdGF0ZS5hcmdzWzBdLCBkYXRhKS5fZW5jb2RlKGl0ZW0sIHJlcG9ydGVyKTtcbiAgICAgIH0sIGNoaWxkKSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS51c2UgIT09IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2dldFVzZShzdGF0ZS51c2UsIHBhcmVudCkuX2VuY29kZShkYXRhLCByZXBvcnRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnQgPSB0aGlzLl9lbmNvZGVQcmltaXRpdmUoc3RhdGUudGFnLCBkYXRhKTtcbiAgICAgIHByaW1pdGl2ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gRW5jb2RlIGRhdGEgaXRzZWxmXG4gIGlmICghc3RhdGUuYW55ICYmIHN0YXRlLmNob2ljZSA9PT0gbnVsbCkge1xuICAgIGNvbnN0IHRhZyA9IHN0YXRlLmltcGxpY2l0ICE9PSBudWxsID8gc3RhdGUuaW1wbGljaXQgOiBzdGF0ZS50YWc7XG4gICAgY29uc3QgY2xzID0gc3RhdGUuaW1wbGljaXQgPT09IG51bGwgPyAndW5pdmVyc2FsJyA6ICdjb250ZXh0JztcblxuICAgIGlmICh0YWcgPT09IG51bGwpIHtcbiAgICAgIGlmIChzdGF0ZS51c2UgPT09IG51bGwpXG4gICAgICAgIHJlcG9ydGVyLmVycm9yKCdUYWcgY291bGQgYmUgb21pdHRlZCBvbmx5IGZvciAudXNlKCknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHN0YXRlLnVzZSA9PT0gbnVsbClcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fZW5jb2RlQ29tcG9zaXRlKHRhZywgcHJpbWl0aXZlLCBjbHMsIGNvbnRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdyYXAgaW4gZXhwbGljaXRcbiAgaWYgKHN0YXRlLmV4cGxpY2l0ICE9PSBudWxsKVxuICAgIHJlc3VsdCA9IHRoaXMuX2VuY29kZUNvbXBvc2l0ZShzdGF0ZS5leHBsaWNpdCwgZmFsc2UsICdjb250ZXh0JywgcmVzdWx0KTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2VuY29kZUNob2ljZSA9IGZ1bmN0aW9uIGVuY29kZUNob2ljZShkYXRhLCByZXBvcnRlcikge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBjb25zdCBub2RlID0gc3RhdGUuY2hvaWNlW2RhdGEudHlwZV07XG4gIGlmICghbm9kZSkge1xuICAgIGFzc2VydChcbiAgICAgIGZhbHNlLFxuICAgICAgZGF0YS50eXBlICsgJyBub3QgZm91bmQgaW4gJyArXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhzdGF0ZS5jaG9pY2UpKSk7XG4gIH1cbiAgcmV0dXJuIG5vZGUuX2VuY29kZShkYXRhLnZhbHVlLCByZXBvcnRlcik7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZW5jb2RlUHJpbWl0aXZlID0gZnVuY3Rpb24gZW5jb2RlUHJpbWl0aXZlKHRhZywgZGF0YSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBpZiAoL3N0ciQvLnRlc3QodGFnKSlcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlU3RyKGRhdGEsIHRhZyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJyAmJiBzdGF0ZS5hcmdzKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVPYmppZChkYXRhLCBzdGF0ZS5yZXZlcnNlQXJnc1swXSwgc3RhdGUuYXJnc1sxXSk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlT2JqaWQoZGF0YSwgbnVsbCwgbnVsbCk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2dlbnRpbWUnIHx8IHRhZyA9PT0gJ3V0Y3RpbWUnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVUaW1lKGRhdGEsIHRhZyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ251bGxfJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlTnVsbCgpO1xuICBlbHNlIGlmICh0YWcgPT09ICdpbnQnIHx8IHRhZyA9PT0gJ2VudW0nKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVJbnQoZGF0YSwgc3RhdGUuYXJncyAmJiBzdGF0ZS5yZXZlcnNlQXJnc1swXSk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2Jvb2wnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVCb29sKGRhdGEpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmpEZXNjJylcbiAgICByZXR1cm4gdGhpcy5fZW5jb2RlU3RyKGRhdGEsIHRhZyk7XG4gIGVsc2VcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHRhZzogJyArIHRhZyk7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5faXNOdW1zdHIgPSBmdW5jdGlvbiBpc051bXN0cihzdHIpIHtcbiAgcmV0dXJuIC9eWzAtOSBdKiQvLnRlc3Qoc3RyKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9pc1ByaW50c3RyID0gZnVuY3Rpb24gaXNQcmludHN0cihzdHIpIHtcbiAgcmV0dXJuIC9eW0EtWmEtejAtOSAnKCkrLC0uLzo9P10qJC8udGVzdChzdHIpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG4vLyBIZWxwZXJcbmZ1bmN0aW9uIHJldmVyc2UobWFwKSB7XG4gIGNvbnN0IHJlcyA9IHt9O1xuXG4gIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAvLyBDb252ZXJ0IGtleSB0byBpbnRlZ2VyIGlmIGl0IGlzIHN0cmluZ2lmaWVkXG4gICAgaWYgKChrZXkgfCAwKSA9PSBrZXkpXG4gICAgICBrZXkgPSBrZXkgfCAwO1xuXG4gICAgY29uc3QgdmFsdWUgPSBtYXBba2V5XTtcbiAgICByZXNbdmFsdWVdID0ga2V5O1xuICB9KTtcblxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnRzLnRhZ0NsYXNzID0ge1xuICAwOiAndW5pdmVyc2FsJyxcbiAgMTogJ2FwcGxpY2F0aW9uJyxcbiAgMjogJ2NvbnRleHQnLFxuICAzOiAncHJpdmF0ZSdcbn07XG5leHBvcnRzLnRhZ0NsYXNzQnlOYW1lID0gcmV2ZXJzZShleHBvcnRzLnRhZ0NsYXNzKTtcblxuZXhwb3J0cy50YWcgPSB7XG4gIDB4MDA6ICdlbmQnLFxuICAweDAxOiAnYm9vbCcsXG4gIDB4MDI6ICdpbnQnLFxuICAweDAzOiAnYml0c3RyJyxcbiAgMHgwNDogJ29jdHN0cicsXG4gIDB4MDU6ICdudWxsXycsXG4gIDB4MDY6ICdvYmppZCcsXG4gIDB4MDc6ICdvYmpEZXNjJyxcbiAgMHgwODogJ2V4dGVybmFsJyxcbiAgMHgwOTogJ3JlYWwnLFxuICAweDBhOiAnZW51bScsXG4gIDB4MGI6ICdlbWJlZCcsXG4gIDB4MGM6ICd1dGY4c3RyJyxcbiAgMHgwZDogJ3JlbGF0aXZlT2lkJyxcbiAgMHgxMDogJ3NlcScsXG4gIDB4MTE6ICdzZXQnLFxuICAweDEyOiAnbnVtc3RyJyxcbiAgMHgxMzogJ3ByaW50c3RyJyxcbiAgMHgxNDogJ3Q2MXN0cicsXG4gIDB4MTU6ICd2aWRlb3N0cicsXG4gIDB4MTY6ICdpYTVzdHInLFxuICAweDE3OiAndXRjdGltZScsXG4gIDB4MTg6ICdnZW50aW1lJyxcbiAgMHgxOTogJ2dyYXBoc3RyJyxcbiAgMHgxYTogJ2lzbzY0NnN0cicsXG4gIDB4MWI6ICdnZW5zdHInLFxuICAweDFjOiAndW5pc3RyJyxcbiAgMHgxZDogJ2NoYXJzdHInLFxuICAweDFlOiAnYm1wc3RyJ1xufTtcbmV4cG9ydHMudGFnQnlOYW1lID0gcmV2ZXJzZShleHBvcnRzLnRhZyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuY29uc3QgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xuY29uc3QgTm9kZSA9IHJlcXVpcmUoJy4uL2Jhc2Uvbm9kZScpO1xuXG4vLyBJbXBvcnQgREVSIGNvbnN0YW50c1xuY29uc3QgZGVyID0gcmVxdWlyZSgnLi4vY29uc3RhbnRzL2RlcicpO1xuXG5mdW5jdGlvbiBERVJFbmNvZGVyKGVudGl0eSkge1xuICB0aGlzLmVuYyA9ICdkZXInO1xuICB0aGlzLm5hbWUgPSBlbnRpdHkubmFtZTtcbiAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG5cbiAgLy8gQ29uc3RydWN0IGJhc2UgdHJlZVxuICB0aGlzLnRyZWUgPSBuZXcgREVSTm9kZSgpO1xuICB0aGlzLnRyZWUuX2luaXQoZW50aXR5LmJvZHkpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBERVJFbmNvZGVyO1xuXG5ERVJFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgcmVwb3J0ZXIpIHtcbiAgcmV0dXJuIHRoaXMudHJlZS5fZW5jb2RlKGRhdGEsIHJlcG9ydGVyKS5qb2luKCk7XG59O1xuXG4vLyBUcmVlIG1ldGhvZHNcblxuZnVuY3Rpb24gREVSTm9kZShwYXJlbnQpIHtcbiAgTm9kZS5jYWxsKHRoaXMsICdkZXInLCBwYXJlbnQpO1xufVxuaW5oZXJpdHMoREVSTm9kZSwgTm9kZSk7XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVDb21wb3NpdGUgPSBmdW5jdGlvbiBlbmNvZGVDb21wb3NpdGUodGFnLFxuICBwcmltaXRpdmUsXG4gIGNscyxcbiAgY29udGVudCkge1xuICBjb25zdCBlbmNvZGVkVGFnID0gZW5jb2RlVGFnKHRhZywgcHJpbWl0aXZlLCBjbHMsIHRoaXMucmVwb3J0ZXIpO1xuXG4gIC8vIFNob3J0IGZvcm1cbiAgaWYgKGNvbnRlbnQubGVuZ3RoIDwgMHg4MCkge1xuICAgIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYygyKTtcbiAgICBoZWFkZXJbMF0gPSBlbmNvZGVkVGFnO1xuICAgIGhlYWRlclsxXSA9IGNvbnRlbnQubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFsgaGVhZGVyLCBjb250ZW50IF0pO1xuICB9XG5cbiAgLy8gTG9uZyBmb3JtXG4gIC8vIENvdW50IG9jdGV0cyByZXF1aXJlZCB0byBzdG9yZSBsZW5ndGhcbiAgbGV0IGxlbk9jdGV0cyA9IDE7XG4gIGZvciAobGV0IGkgPSBjb250ZW50Lmxlbmd0aDsgaSA+PSAweDEwMDsgaSA+Pj0gOClcbiAgICBsZW5PY3RldHMrKztcblxuICBjb25zdCBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMSArIDEgKyBsZW5PY3RldHMpO1xuICBoZWFkZXJbMF0gPSBlbmNvZGVkVGFnO1xuICBoZWFkZXJbMV0gPSAweDgwIHwgbGVuT2N0ZXRzO1xuXG4gIGZvciAobGV0IGkgPSAxICsgbGVuT2N0ZXRzLCBqID0gY29udGVudC5sZW5ndGg7IGogPiAwOyBpLS0sIGogPj49IDgpXG4gICAgaGVhZGVyW2ldID0gaiAmIDB4ZmY7XG5cbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoWyBoZWFkZXIsIGNvbnRlbnQgXSk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlU3RyID0gZnVuY3Rpb24gZW5jb2RlU3RyKHN0ciwgdGFnKSB7XG4gIGlmICh0YWcgPT09ICdiaXRzdHInKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoWyBzdHIudW51c2VkIHwgMCwgc3RyLmRhdGEgXSk7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnYm1wc3RyJykge1xuICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5hbGxvYyhzdHIubGVuZ3RoICogMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGJ1Zi53cml0ZVVJbnQxNkJFKHN0ci5jaGFyQ29kZUF0KGkpLCBpICogMik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGJ1Zik7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnbnVtc3RyJykge1xuICAgIGlmICghdGhpcy5faXNOdW1zdHIoc3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ0VuY29kaW5nIG9mIHN0cmluZyB0eXBlOiBudW1zdHIgc3VwcG9ydHMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25seSBkaWdpdHMgYW5kIHNwYWNlJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik7XG4gIH0gZWxzZSBpZiAodGFnID09PSAncHJpbnRzdHInKSB7XG4gICAgaWYgKCF0aGlzLl9pc1ByaW50c3RyKHN0cikpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogcHJpbnRzdHIgc3VwcG9ydHMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25seSBsYXRpbiB1cHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXJzLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaWdpdHMsIHNwYWNlLCBhcG9zdHJvcGhlLCBsZWZ0IGFuZCByaWd0aCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXJlbnRoZXNpcywgcGx1cyBzaWduLCBjb21tYSwgaHlwaGVuLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkb3QsIHNsYXNoLCBjb2xvbiwgZXF1YWwgc2lnbiwgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncXVlc3Rpb24gbWFyaycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzdHIpO1xuICB9IGVsc2UgaWYgKC9zdHIkLy50ZXN0KHRhZykpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzdHIpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ29iakRlc2MnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoc3RyKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignRW5jb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6ICcgKyB0YWcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgdW5zdXBwb3J0ZWQnKTtcbiAgfVxufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZU9iamlkID0gZnVuY3Rpb24gZW5jb2RlT2JqaWQoaWQsIHZhbHVlcywgcmVsYXRpdmUpIHtcbiAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIXZhbHVlcylcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdzdHJpbmcgb2JqaWQgZ2l2ZW4sIGJ1dCBubyB2YWx1ZXMgbWFwIGZvdW5kJyk7XG4gICAgaWYgKCF2YWx1ZXMuaGFzT3duUHJvcGVydHkoaWQpKVxuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ29iamlkIG5vdCBmb3VuZCBpbiB2YWx1ZXMgbWFwJyk7XG4gICAgaWQgPSB2YWx1ZXNbaWRdLnNwbGl0KC9bXFxzLl0rL2cpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWQubGVuZ3RoOyBpKyspXG4gICAgICBpZFtpXSB8PSAwO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaWQpKSB7XG4gICAgaWQgPSBpZC5zbGljZSgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWQubGVuZ3RoOyBpKyspXG4gICAgICBpZFtpXSB8PSAwO1xuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGlkKSkge1xuICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdvYmppZCgpIHNob3VsZCBiZSBlaXRoZXIgYXJyYXkgb3Igc3RyaW5nLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ290OiAnICsgSlNPTi5zdHJpbmdpZnkoaWQpKTtcbiAgfVxuXG4gIGlmICghcmVsYXRpdmUpIHtcbiAgICBpZiAoaWRbMV0gPj0gNDApXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignU2Vjb25kIG9iamlkIGlkZW50aWZpZXIgT09CJyk7XG4gICAgaWQuc3BsaWNlKDAsIDIsIGlkWzBdICogNDAgKyBpZFsxXSk7XG4gIH1cblxuICAvLyBDb3VudCBudW1iZXIgb2Ygb2N0ZXRzXG4gIGxldCBzaXplID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZC5sZW5ndGg7IGkrKykge1xuICAgIGxldCBpZGVudCA9IGlkW2ldO1xuICAgIGZvciAoc2l6ZSsrOyBpZGVudCA+PSAweDgwOyBpZGVudCA+Pj0gNylcbiAgICAgIHNpemUrKztcbiAgfVxuXG4gIGNvbnN0IG9iamlkID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICBsZXQgb2Zmc2V0ID0gb2JqaWQubGVuZ3RoIC0gMTtcbiAgZm9yIChsZXQgaSA9IGlkLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgbGV0IGlkZW50ID0gaWRbaV07XG4gICAgb2JqaWRbb2Zmc2V0LS1dID0gaWRlbnQgJiAweDdmO1xuICAgIHdoaWxlICgoaWRlbnQgPj49IDcpID4gMClcbiAgICAgIG9iamlkW29mZnNldC0tXSA9IDB4ODAgfCAoaWRlbnQgJiAweDdmKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG9iamlkKTtcbn07XG5cbmZ1bmN0aW9uIHR3byhudW0pIHtcbiAgaWYgKG51bSA8IDEwKVxuICAgIHJldHVybiAnMCcgKyBudW07XG4gIGVsc2VcbiAgICByZXR1cm4gbnVtO1xufVxuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlVGltZSA9IGZ1bmN0aW9uIGVuY29kZVRpbWUodGltZSwgdGFnKSB7XG4gIGxldCBzdHI7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aW1lKTtcblxuICBpZiAodGFnID09PSAnZ2VudGltZScpIHtcbiAgICBzdHIgPSBbXG4gICAgICB0d28oZGF0ZS5nZXRVVENGdWxsWWVhcigpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ01vbnRoKCkgKyAxKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ0RhdGUoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENIb3VycygpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ01pbnV0ZXMoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENTZWNvbmRzKCkpLFxuICAgICAgJ1onXG4gICAgXS5qb2luKCcnKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICd1dGN0aW1lJykge1xuICAgIHN0ciA9IFtcbiAgICAgIHR3byhkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgJSAxMDApLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDRGF0ZSgpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ0hvdXJzKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTWludXRlcygpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ1NlY29uZHMoKSksXG4gICAgICAnWidcbiAgICBdLmpvaW4oJycpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ0VuY29kaW5nICcgKyB0YWcgKyAnIHRpbWUgaXMgbm90IHN1cHBvcnRlZCB5ZXQnKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9lbmNvZGVTdHIoc3RyLCAnb2N0c3RyJyk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlTnVsbCA9IGZ1bmN0aW9uIGVuY29kZU51bGwoKSB7XG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKCcnKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVJbnQgPSBmdW5jdGlvbiBlbmNvZGVJbnQobnVtLCB2YWx1ZXMpIHtcbiAgaWYgKHR5cGVvZiBudW0gPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCF2YWx1ZXMpXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignU3RyaW5nIGludCBvciBlbnVtIGdpdmVuLCBidXQgbm8gdmFsdWVzIG1hcCcpO1xuICAgIGlmICghdmFsdWVzLmhhc093blByb3BlcnR5KG51bSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdWYWx1ZXMgbWFwIGRvZXNuXFwndCBjb250YWluOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG51bSkpO1xuICAgIH1cbiAgICBudW0gPSB2YWx1ZXNbbnVtXTtcbiAgfVxuXG4gIC8vIEJpZ251bSwgYXNzdW1lIGJpZyBlbmRpYW5cbiAgaWYgKHR5cGVvZiBudW0gIT09ICdudW1iZXInICYmICFCdWZmZXIuaXNCdWZmZXIobnVtKSkge1xuICAgIGNvbnN0IG51bUFycmF5ID0gbnVtLnRvQXJyYXkoKTtcbiAgICBpZiAoIW51bS5zaWduICYmIG51bUFycmF5WzBdICYgMHg4MCkge1xuICAgICAgbnVtQXJyYXkudW5zaGlmdCgwKTtcbiAgICB9XG4gICAgbnVtID0gQnVmZmVyLmZyb20obnVtQXJyYXkpO1xuICB9XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihudW0pKSB7XG4gICAgbGV0IHNpemUgPSBudW0ubGVuZ3RoO1xuICAgIGlmIChudW0ubGVuZ3RoID09PSAwKVxuICAgICAgc2l6ZSsrO1xuXG4gICAgY29uc3Qgb3V0ID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICAgIG51bS5jb3B5KG91dCk7XG4gICAgaWYgKG51bS5sZW5ndGggPT09IDApXG4gICAgICBvdXRbMF0gPSAwO1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG91dCk7XG4gIH1cblxuICBpZiAobnVtIDwgMHg4MClcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihudW0pO1xuXG4gIGlmIChudW0gPCAweDEwMClcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbMCwgbnVtXSk7XG5cbiAgbGV0IHNpemUgPSAxO1xuICBmb3IgKGxldCBpID0gbnVtOyBpID49IDB4MTAwOyBpID4+PSA4KVxuICAgIHNpemUrKztcblxuICBjb25zdCBvdXQgPSBuZXcgQXJyYXkoc2l6ZSk7XG4gIGZvciAobGV0IGkgPSBvdXQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBvdXRbaV0gPSBudW0gJiAweGZmO1xuICAgIG51bSA+Pj0gODtcbiAgfVxuICBpZihvdXRbMF0gJiAweDgwKSB7XG4gICAgb3V0LnVuc2hpZnQoMCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihCdWZmZXIuZnJvbShvdXQpKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVCb29sID0gZnVuY3Rpb24gZW5jb2RlQm9vbCh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcih2YWx1ZSA/IDB4ZmYgOiAwKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl91c2UgPSBmdW5jdGlvbiB1c2UoZW50aXR5LCBvYmopIHtcbiAgaWYgKHR5cGVvZiBlbnRpdHkgPT09ICdmdW5jdGlvbicpXG4gICAgZW50aXR5ID0gZW50aXR5KG9iaik7XG4gIHJldHVybiBlbnRpdHkuX2dldEVuY29kZXIoJ2RlcicpLnRyZWU7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fc2tpcERlZmF1bHQgPSBmdW5jdGlvbiBza2lwRGVmYXVsdChkYXRhQnVmZmVyLCByZXBvcnRlciwgcGFyZW50KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBsZXQgaTtcbiAgaWYgKHN0YXRlWydkZWZhdWx0J10gPT09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGRhdGEgPSBkYXRhQnVmZmVyLmpvaW4oKTtcbiAgaWYgKHN0YXRlLmRlZmF1bHRCdWZmZXIgPT09IHVuZGVmaW5lZClcbiAgICBzdGF0ZS5kZWZhdWx0QnVmZmVyID0gdGhpcy5fZW5jb2RlVmFsdWUoc3RhdGVbJ2RlZmF1bHQnXSwgcmVwb3J0ZXIsIHBhcmVudCkuam9pbigpO1xuXG4gIGlmIChkYXRhLmxlbmd0aCAhPT0gc3RhdGUuZGVmYXVsdEJ1ZmZlci5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGZvciAoaT0wOyBpIDwgZGF0YS5sZW5ndGg7IGkrKylcbiAgICBpZiAoZGF0YVtpXSAhPT0gc3RhdGUuZGVmYXVsdEJ1ZmZlcltpXSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIFV0aWxpdHkgbWV0aG9kc1xuXG5mdW5jdGlvbiBlbmNvZGVUYWcodGFnLCBwcmltaXRpdmUsIGNscywgcmVwb3J0ZXIpIHtcbiAgbGV0IHJlcztcblxuICBpZiAodGFnID09PSAnc2Vxb2YnKVxuICAgIHRhZyA9ICdzZXEnO1xuICBlbHNlIGlmICh0YWcgPT09ICdzZXRvZicpXG4gICAgdGFnID0gJ3NldCc7XG5cbiAgaWYgKGRlci50YWdCeU5hbWUuaGFzT3duUHJvcGVydHkodGFnKSlcbiAgICByZXMgPSBkZXIudGFnQnlOYW1lW3RhZ107XG4gIGVsc2UgaWYgKHR5cGVvZiB0YWcgPT09ICdudW1iZXInICYmICh0YWcgfCAwKSA9PT0gdGFnKVxuICAgIHJlcyA9IHRhZztcbiAgZWxzZVxuICAgIHJldHVybiByZXBvcnRlci5lcnJvcignVW5rbm93biB0YWc6ICcgKyB0YWcpO1xuXG4gIGlmIChyZXMgPj0gMHgxZilcbiAgICByZXR1cm4gcmVwb3J0ZXIuZXJyb3IoJ011bHRpLW9jdGV0IHRhZyBlbmNvZGluZyB1bnN1cHBvcnRlZCcpO1xuXG4gIGlmICghcHJpbWl0aXZlKVxuICAgIHJlcyB8PSAweDIwO1xuXG4gIHJlcyB8PSAoZGVyLnRhZ0NsYXNzQnlOYW1lW2NscyB8fCAndW5pdmVyc2FsJ10gPDwgNik7XG5cbiAgcmV0dXJuIHJlcztcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmNvbnN0IERFUkVuY29kZXIgPSByZXF1aXJlKCcuL2RlcicpO1xuXG5mdW5jdGlvbiBQRU1FbmNvZGVyKGVudGl0eSkge1xuICBERVJFbmNvZGVyLmNhbGwodGhpcywgZW50aXR5KTtcbiAgdGhpcy5lbmMgPSAncGVtJztcbn1cbmluaGVyaXRzKFBFTUVuY29kZXIsIERFUkVuY29kZXIpO1xubW9kdWxlLmV4cG9ydHMgPSBQRU1FbmNvZGVyO1xuXG5QRU1FbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgb3B0aW9ucykge1xuICBjb25zdCBidWYgPSBERVJFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUuY2FsbCh0aGlzLCBkYXRhKTtcblxuICBjb25zdCBwID0gYnVmLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgY29uc3Qgb3V0ID0gWyAnLS0tLS1CRUdJTiAnICsgb3B0aW9ucy5sYWJlbCArICctLS0tLScgXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwLmxlbmd0aDsgaSArPSA2NClcbiAgICBvdXQucHVzaChwLnNsaWNlKGksIGkgKyA2NCkpO1xuICBvdXQucHVzaCgnLS0tLS1FTkQgJyArIG9wdGlvbnMubGFiZWwgKyAnLS0tLS0nKTtcbiAgcmV0dXJuIG91dC5qb2luKCdcXG4nKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZW5jb2RlcnMgPSBleHBvcnRzO1xuXG5lbmNvZGVycy5kZXIgPSByZXF1aXJlKCcuL2RlcicpO1xuZW5jb2RlcnMucGVtID0gcmVxdWlyZSgnLi9wZW0nKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmNvbnN0IGJpZ251bSA9IHJlcXVpcmUoJ2JuLmpzJyk7XG5jb25zdCBEZWNvZGVyQnVmZmVyID0gcmVxdWlyZSgnLi4vYmFzZS9idWZmZXInKS5EZWNvZGVyQnVmZmVyO1xuY29uc3QgTm9kZSA9IHJlcXVpcmUoJy4uL2Jhc2Uvbm9kZScpO1xuXG4vLyBJbXBvcnQgREVSIGNvbnN0YW50c1xuY29uc3QgZGVyID0gcmVxdWlyZSgnLi4vY29uc3RhbnRzL2RlcicpO1xuXG5mdW5jdGlvbiBERVJEZWNvZGVyKGVudGl0eSkge1xuICB0aGlzLmVuYyA9ICdkZXInO1xuICB0aGlzLm5hbWUgPSBlbnRpdHkubmFtZTtcbiAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG5cbiAgLy8gQ29uc3RydWN0IGJhc2UgdHJlZVxuICB0aGlzLnRyZWUgPSBuZXcgREVSTm9kZSgpO1xuICB0aGlzLnRyZWUuX2luaXQoZW50aXR5LmJvZHkpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBERVJEZWNvZGVyO1xuXG5ERVJEZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoZGF0YSwgb3B0aW9ucykge1xuICBpZiAoIURlY29kZXJCdWZmZXIuaXNEZWNvZGVyQnVmZmVyKGRhdGEpKSB7XG4gICAgZGF0YSA9IG5ldyBEZWNvZGVyQnVmZmVyKGRhdGEsIG9wdGlvbnMpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMudHJlZS5fZGVjb2RlKGRhdGEsIG9wdGlvbnMpO1xufTtcblxuLy8gVHJlZSBtZXRob2RzXG5cbmZ1bmN0aW9uIERFUk5vZGUocGFyZW50KSB7XG4gIE5vZGUuY2FsbCh0aGlzLCAnZGVyJywgcGFyZW50KTtcbn1cbmluaGVyaXRzKERFUk5vZGUsIE5vZGUpO1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fcGVla1RhZyA9IGZ1bmN0aW9uIHBlZWtUYWcoYnVmZmVyLCB0YWcsIGFueSkge1xuICBpZiAoYnVmZmVyLmlzRW1wdHkoKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3Qgc3RhdGUgPSBidWZmZXIuc2F2ZSgpO1xuICBjb25zdCBkZWNvZGVkVGFnID0gZGVyRGVjb2RlVGFnKGJ1ZmZlciwgJ0ZhaWxlZCB0byBwZWVrIHRhZzogXCInICsgdGFnICsgJ1wiJyk7XG4gIGlmIChidWZmZXIuaXNFcnJvcihkZWNvZGVkVGFnKSlcbiAgICByZXR1cm4gZGVjb2RlZFRhZztcblxuICBidWZmZXIucmVzdG9yZShzdGF0ZSk7XG5cbiAgcmV0dXJuIGRlY29kZWRUYWcudGFnID09PSB0YWcgfHwgZGVjb2RlZFRhZy50YWdTdHIgPT09IHRhZyB8fFxuICAgIChkZWNvZGVkVGFnLnRhZ1N0ciArICdvZicpID09PSB0YWcgfHwgYW55O1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZVRhZyA9IGZ1bmN0aW9uIGRlY29kZVRhZyhidWZmZXIsIHRhZywgYW55KSB7XG4gIGNvbnN0IGRlY29kZWRUYWcgPSBkZXJEZWNvZGVUYWcoYnVmZmVyLFxuICAgICdGYWlsZWQgdG8gZGVjb2RlIHRhZyBvZiBcIicgKyB0YWcgKyAnXCInKTtcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKGRlY29kZWRUYWcpKVxuICAgIHJldHVybiBkZWNvZGVkVGFnO1xuXG4gIGxldCBsZW4gPSBkZXJEZWNvZGVMZW4oYnVmZmVyLFxuICAgIGRlY29kZWRUYWcucHJpbWl0aXZlLFxuICAgICdGYWlsZWQgdG8gZ2V0IGxlbmd0aCBvZiBcIicgKyB0YWcgKyAnXCInKTtcblxuICAvLyBGYWlsdXJlXG4gIGlmIChidWZmZXIuaXNFcnJvcihsZW4pKVxuICAgIHJldHVybiBsZW47XG5cbiAgaWYgKCFhbnkgJiZcbiAgICAgIGRlY29kZWRUYWcudGFnICE9PSB0YWcgJiZcbiAgICAgIGRlY29kZWRUYWcudGFnU3RyICE9PSB0YWcgJiZcbiAgICAgIGRlY29kZWRUYWcudGFnU3RyICsgJ29mJyAhPT0gdGFnKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRmFpbGVkIHRvIG1hdGNoIHRhZzogXCInICsgdGFnICsgJ1wiJyk7XG4gIH1cblxuICBpZiAoZGVjb2RlZFRhZy5wcmltaXRpdmUgfHwgbGVuICE9PSBudWxsKVxuICAgIHJldHVybiBidWZmZXIuc2tpcChsZW4sICdGYWlsZWQgdG8gbWF0Y2ggYm9keSBvZjogXCInICsgdGFnICsgJ1wiJyk7XG5cbiAgLy8gSW5kZWZpbml0ZSBsZW5ndGguLi4gZmluZCBFTkQgdGFnXG4gIGNvbnN0IHN0YXRlID0gYnVmZmVyLnNhdmUoKTtcbiAgY29uc3QgcmVzID0gdGhpcy5fc2tpcFVudGlsRW5kKFxuICAgIGJ1ZmZlcixcbiAgICAnRmFpbGVkIHRvIHNraXAgaW5kZWZpbml0ZSBsZW5ndGggYm9keTogXCInICsgdGhpcy50YWcgKyAnXCInKTtcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKHJlcykpXG4gICAgcmV0dXJuIHJlcztcblxuICBsZW4gPSBidWZmZXIub2Zmc2V0IC0gc3RhdGUub2Zmc2V0O1xuICBidWZmZXIucmVzdG9yZShzdGF0ZSk7XG4gIHJldHVybiBidWZmZXIuc2tpcChsZW4sICdGYWlsZWQgdG8gbWF0Y2ggYm9keSBvZjogXCInICsgdGFnICsgJ1wiJyk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fc2tpcFVudGlsRW5kID0gZnVuY3Rpb24gc2tpcFVudGlsRW5kKGJ1ZmZlciwgZmFpbCkge1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgdGFnID0gZGVyRGVjb2RlVGFnKGJ1ZmZlciwgZmFpbCk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKHRhZykpXG4gICAgICByZXR1cm4gdGFnO1xuICAgIGNvbnN0IGxlbiA9IGRlckRlY29kZUxlbihidWZmZXIsIHRhZy5wcmltaXRpdmUsIGZhaWwpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcihsZW4pKVxuICAgICAgcmV0dXJuIGxlbjtcblxuICAgIGxldCByZXM7XG4gICAgaWYgKHRhZy5wcmltaXRpdmUgfHwgbGVuICE9PSBudWxsKVxuICAgICAgcmVzID0gYnVmZmVyLnNraXAobGVuKTtcbiAgICBlbHNlXG4gICAgICByZXMgPSB0aGlzLl9za2lwVW50aWxFbmQoYnVmZmVyLCBmYWlsKTtcblxuICAgIC8vIEZhaWx1cmVcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IocmVzKSlcbiAgICAgIHJldHVybiByZXM7XG5cbiAgICBpZiAodGFnLnRhZ1N0ciA9PT0gJ2VuZCcpXG4gICAgICBicmVhaztcbiAgfVxufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZUxpc3QgPSBmdW5jdGlvbiBkZWNvZGVMaXN0KGJ1ZmZlciwgdGFnLCBkZWNvZGVyLFxuICBvcHRpb25zKSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICB3aGlsZSAoIWJ1ZmZlci5pc0VtcHR5KCkpIHtcbiAgICBjb25zdCBwb3NzaWJsZUVuZCA9IHRoaXMuX3BlZWtUYWcoYnVmZmVyLCAnZW5kJyk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKHBvc3NpYmxlRW5kKSlcbiAgICAgIHJldHVybiBwb3NzaWJsZUVuZDtcblxuICAgIGNvbnN0IHJlcyA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlciwgJ2RlcicsIG9wdGlvbnMpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcihyZXMpICYmIHBvc3NpYmxlRW5kKVxuICAgICAgYnJlYWs7XG4gICAgcmVzdWx0LnB1c2gocmVzKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZVN0ciA9IGZ1bmN0aW9uIGRlY29kZVN0cihidWZmZXIsIHRhZykge1xuICBpZiAodGFnID09PSAnYml0c3RyJykge1xuICAgIGNvbnN0IHVudXNlZCA9IGJ1ZmZlci5yZWFkVUludDgoKTtcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IodW51c2VkKSlcbiAgICAgIHJldHVybiB1bnVzZWQ7XG4gICAgcmV0dXJuIHsgdW51c2VkOiB1bnVzZWQsIGRhdGE6IGJ1ZmZlci5yYXcoKSB9O1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ2JtcHN0cicpIHtcbiAgICBjb25zdCByYXcgPSBidWZmZXIucmF3KCk7XG4gICAgaWYgKHJhdy5sZW5ndGggJSAyID09PSAxKVxuICAgICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IGJtcHN0ciBsZW5ndGggbWlzbWF0Y2gnKTtcblxuICAgIGxldCBzdHIgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhdy5sZW5ndGggLyAyOyBpKyspIHtcbiAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHJhdy5yZWFkVUludDE2QkUoaSAqIDIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdudW1zdHInKSB7XG4gICAgY29uc3QgbnVtc3RyID0gYnVmZmVyLnJhdygpLnRvU3RyaW5nKCdhc2NpaScpO1xuICAgIGlmICghdGhpcy5faXNOdW1zdHIobnVtc3RyKSkge1xuICAgICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnbnVtc3RyIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnMnKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bXN0cjtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdvY3RzdHInKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5yYXcoKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdvYmpEZXNjJykge1xuICAgIHJldHVybiBidWZmZXIucmF3KCk7XG4gIH0gZWxzZSBpZiAodGFnID09PSAncHJpbnRzdHInKSB7XG4gICAgY29uc3QgcHJpbnRzdHIgPSBidWZmZXIucmF3KCkudG9TdHJpbmcoJ2FzY2lpJyk7XG4gICAgaWYgKCF0aGlzLl9pc1ByaW50c3RyKHByaW50c3RyKSkge1xuICAgICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAncHJpbnRzdHIgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgICByZXR1cm4gcHJpbnRzdHI7XG4gIH0gZWxzZSBpZiAoL3N0ciQvLnRlc3QodGFnKSkge1xuICAgIHJldHVybiBidWZmZXIucmF3KCkudG9TdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArIHRhZyArICcgdW5zdXBwb3J0ZWQnKTtcbiAgfVxufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZU9iamlkID0gZnVuY3Rpb24gZGVjb2RlT2JqaWQoYnVmZmVyLCB2YWx1ZXMsIHJlbGF0aXZlKSB7XG4gIGxldCByZXN1bHQ7XG4gIGNvbnN0IGlkZW50aWZpZXJzID0gW107XG4gIGxldCBpZGVudCA9IDA7XG4gIGxldCBzdWJpZGVudCA9IDA7XG4gIHdoaWxlICghYnVmZmVyLmlzRW1wdHkoKSkge1xuICAgIHN1YmlkZW50ID0gYnVmZmVyLnJlYWRVSW50OCgpO1xuICAgIGlkZW50IDw8PSA3O1xuICAgIGlkZW50IHw9IHN1YmlkZW50ICYgMHg3ZjtcbiAgICBpZiAoKHN1YmlkZW50ICYgMHg4MCkgPT09IDApIHtcbiAgICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnQpO1xuICAgICAgaWRlbnQgPSAwO1xuICAgIH1cbiAgfVxuICBpZiAoc3ViaWRlbnQgJiAweDgwKVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnQpO1xuXG4gIGNvbnN0IGZpcnN0ID0gKGlkZW50aWZpZXJzWzBdIC8gNDApIHwgMDtcbiAgY29uc3Qgc2Vjb25kID0gaWRlbnRpZmllcnNbMF0gJSA0MDtcblxuICBpZiAocmVsYXRpdmUpXG4gICAgcmVzdWx0ID0gaWRlbnRpZmllcnM7XG4gIGVsc2VcbiAgICByZXN1bHQgPSBbZmlyc3QsIHNlY29uZF0uY29uY2F0KGlkZW50aWZpZXJzLnNsaWNlKDEpKTtcblxuICBpZiAodmFsdWVzKSB7XG4gICAgbGV0IHRtcCA9IHZhbHVlc1tyZXN1bHQuam9pbignICcpXTtcbiAgICBpZiAodG1wID09PSB1bmRlZmluZWQpXG4gICAgICB0bXAgPSB2YWx1ZXNbcmVzdWx0LmpvaW4oJy4nKV07XG4gICAgaWYgKHRtcCAhPT0gdW5kZWZpbmVkKVxuICAgICAgcmVzdWx0ID0gdG1wO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVUaW1lID0gZnVuY3Rpb24gZGVjb2RlVGltZShidWZmZXIsIHRhZykge1xuICBjb25zdCBzdHIgPSBidWZmZXIucmF3KCkudG9TdHJpbmcoKTtcblxuICBsZXQgeWVhcjtcbiAgbGV0IG1vbjtcbiAgbGV0IGRheTtcbiAgbGV0IGhvdXI7XG4gIGxldCBtaW47XG4gIGxldCBzZWM7XG4gIGlmICh0YWcgPT09ICdnZW50aW1lJykge1xuICAgIHllYXIgPSBzdHIuc2xpY2UoMCwgNCkgfCAwO1xuICAgIG1vbiA9IHN0ci5zbGljZSg0LCA2KSB8IDA7XG4gICAgZGF5ID0gc3RyLnNsaWNlKDYsIDgpIHwgMDtcbiAgICBob3VyID0gc3RyLnNsaWNlKDgsIDEwKSB8IDA7XG4gICAgbWluID0gc3RyLnNsaWNlKDEwLCAxMikgfCAwO1xuICAgIHNlYyA9IHN0ci5zbGljZSgxMiwgMTQpIHwgMDtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICd1dGN0aW1lJykge1xuICAgIHllYXIgPSBzdHIuc2xpY2UoMCwgMikgfCAwO1xuICAgIG1vbiA9IHN0ci5zbGljZSgyLCA0KSB8IDA7XG4gICAgZGF5ID0gc3RyLnNsaWNlKDQsIDYpIHwgMDtcbiAgICBob3VyID0gc3RyLnNsaWNlKDYsIDgpIHwgMDtcbiAgICBtaW4gPSBzdHIuc2xpY2UoOCwgMTApIHwgMDtcbiAgICBzZWMgPSBzdHIuc2xpY2UoMTAsIDEyKSB8IDA7XG4gICAgaWYgKHllYXIgPCA3MClcbiAgICAgIHllYXIgPSAyMDAwICsgeWVhcjtcbiAgICBlbHNlXG4gICAgICB5ZWFyID0gMTkwMCArIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5lcnJvcignRGVjb2RpbmcgJyArIHRhZyArICcgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldCcpO1xuICB9XG5cbiAgcmV0dXJuIERhdGUuVVRDKHllYXIsIG1vbiAtIDEsIGRheSwgaG91ciwgbWluLCBzZWMsIDApO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZU51bGwgPSBmdW5jdGlvbiBkZWNvZGVOdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVCb29sID0gZnVuY3Rpb24gZGVjb2RlQm9vbChidWZmZXIpIHtcbiAgY29uc3QgcmVzID0gYnVmZmVyLnJlYWRVSW50OCgpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IocmVzKSlcbiAgICByZXR1cm4gcmVzO1xuICBlbHNlXG4gICAgcmV0dXJuIHJlcyAhPT0gMDtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVJbnQgPSBmdW5jdGlvbiBkZWNvZGVJbnQoYnVmZmVyLCB2YWx1ZXMpIHtcbiAgLy8gQmlnaW50LCByZXR1cm4gYXMgaXQgaXMgKGFzc3VtZSBiaWcgZW5kaWFuKVxuICBjb25zdCByYXcgPSBidWZmZXIucmF3KCk7XG4gIGxldCByZXMgPSBuZXcgYmlnbnVtKHJhdyk7XG5cbiAgaWYgKHZhbHVlcylcbiAgICByZXMgPSB2YWx1ZXNbcmVzLnRvU3RyaW5nKDEwKV0gfHwgcmVzO1xuXG4gIHJldHVybiByZXM7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fdXNlID0gZnVuY3Rpb24gdXNlKGVudGl0eSwgb2JqKSB7XG4gIGlmICh0eXBlb2YgZW50aXR5ID09PSAnZnVuY3Rpb24nKVxuICAgIGVudGl0eSA9IGVudGl0eShvYmopO1xuICByZXR1cm4gZW50aXR5Ll9nZXREZWNvZGVyKCdkZXInKS50cmVlO1xufTtcblxuLy8gVXRpbGl0eSBtZXRob2RzXG5cbmZ1bmN0aW9uIGRlckRlY29kZVRhZyhidWYsIGZhaWwpIHtcbiAgbGV0IHRhZyA9IGJ1Zi5yZWFkVUludDgoZmFpbCk7XG4gIGlmIChidWYuaXNFcnJvcih0YWcpKVxuICAgIHJldHVybiB0YWc7XG5cbiAgY29uc3QgY2xzID0gZGVyLnRhZ0NsYXNzW3RhZyA+PiA2XTtcbiAgY29uc3QgcHJpbWl0aXZlID0gKHRhZyAmIDB4MjApID09PSAwO1xuXG4gIC8vIE11bHRpLW9jdGV0IHRhZyAtIGxvYWRcbiAgaWYgKCh0YWcgJiAweDFmKSA9PT0gMHgxZikge1xuICAgIGxldCBvY3QgPSB0YWc7XG4gICAgdGFnID0gMDtcbiAgICB3aGlsZSAoKG9jdCAmIDB4ODApID09PSAweDgwKSB7XG4gICAgICBvY3QgPSBidWYucmVhZFVJbnQ4KGZhaWwpO1xuICAgICAgaWYgKGJ1Zi5pc0Vycm9yKG9jdCkpXG4gICAgICAgIHJldHVybiBvY3Q7XG5cbiAgICAgIHRhZyA8PD0gNztcbiAgICAgIHRhZyB8PSBvY3QgJiAweDdmO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0YWcgJj0gMHgxZjtcbiAgfVxuICBjb25zdCB0YWdTdHIgPSBkZXIudGFnW3RhZ107XG5cbiAgcmV0dXJuIHtcbiAgICBjbHM6IGNscyxcbiAgICBwcmltaXRpdmU6IHByaW1pdGl2ZSxcbiAgICB0YWc6IHRhZyxcbiAgICB0YWdTdHI6IHRhZ1N0clxuICB9O1xufVxuXG5mdW5jdGlvbiBkZXJEZWNvZGVMZW4oYnVmLCBwcmltaXRpdmUsIGZhaWwpIHtcbiAgbGV0IGxlbiA9IGJ1Zi5yZWFkVUludDgoZmFpbCk7XG4gIGlmIChidWYuaXNFcnJvcihsZW4pKVxuICAgIHJldHVybiBsZW47XG5cbiAgLy8gSW5kZWZpbml0ZSBmb3JtXG4gIGlmICghcHJpbWl0aXZlICYmIGxlbiA9PT0gMHg4MClcbiAgICByZXR1cm4gbnVsbDtcblxuICAvLyBEZWZpbml0ZSBmb3JtXG4gIGlmICgobGVuICYgMHg4MCkgPT09IDApIHtcbiAgICAvLyBTaG9ydCBmb3JtXG4gICAgcmV0dXJuIGxlbjtcbiAgfVxuXG4gIC8vIExvbmcgZm9ybVxuICBjb25zdCBudW0gPSBsZW4gJiAweDdmO1xuICBpZiAobnVtID4gNClcbiAgICByZXR1cm4gYnVmLmVycm9yKCdsZW5ndGggb2N0ZWN0IGlzIHRvbyBsb25nJyk7XG5cbiAgbGVuID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW07IGkrKykge1xuICAgIGxlbiA8PD0gODtcbiAgICBjb25zdCBqID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgICBpZiAoYnVmLmlzRXJyb3IoaikpXG4gICAgICByZXR1cm4gajtcbiAgICBsZW4gfD0gajtcbiAgfVxuXG4gIHJldHVybiBsZW47XG59XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuY29uc3QgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xuXG5jb25zdCBERVJEZWNvZGVyID0gcmVxdWlyZSgnLi9kZXInKTtcblxuZnVuY3Rpb24gUEVNRGVjb2RlcihlbnRpdHkpIHtcbiAgREVSRGVjb2Rlci5jYWxsKHRoaXMsIGVudGl0eSk7XG4gIHRoaXMuZW5jID0gJ3BlbSc7XG59XG5pbmhlcml0cyhQRU1EZWNvZGVyLCBERVJEZWNvZGVyKTtcbm1vZHVsZS5leHBvcnRzID0gUEVNRGVjb2RlcjtcblxuUEVNRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGRhdGEsIG9wdGlvbnMpIHtcbiAgY29uc3QgbGluZXMgPSBkYXRhLnRvU3RyaW5nKCkuc3BsaXQoL1tcXHJcXG5dKy9nKTtcblxuICBjb25zdCBsYWJlbCA9IG9wdGlvbnMubGFiZWwudG9VcHBlckNhc2UoKTtcblxuICBjb25zdCByZSA9IC9eLS0tLS0oQkVHSU58RU5EKSAoW14tXSspLS0tLS0kLztcbiAgbGV0IHN0YXJ0ID0gLTE7XG4gIGxldCBlbmQgPSAtMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG1hdGNoID0gbGluZXNbaV0ubWF0Y2gocmUpO1xuICAgIGlmIChtYXRjaCA9PT0gbnVsbClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgaWYgKG1hdGNoWzJdICE9PSBsYWJlbClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgaWYgKHN0YXJ0ID09PSAtMSkge1xuICAgICAgaWYgKG1hdGNoWzFdICE9PSAnQkVHSU4nKVxuICAgICAgICBicmVhaztcbiAgICAgIHN0YXJ0ID0gaTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1hdGNoWzFdICE9PSAnRU5EJylcbiAgICAgICAgYnJlYWs7XG4gICAgICBlbmQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChzdGFydCA9PT0gLTEgfHwgZW5kID09PSAtMSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BFTSBzZWN0aW9uIG5vdCBmb3VuZCBmb3I6ICcgKyBsYWJlbCk7XG5cbiAgY29uc3QgYmFzZTY0ID0gbGluZXMuc2xpY2Uoc3RhcnQgKyAxLCBlbmQpLmpvaW4oJycpO1xuICAvLyBSZW1vdmUgZXhjZXNzaXZlIHN5bWJvbHNcbiAgYmFzZTY0LnJlcGxhY2UoL1teYS16MC05Ky89XSsvZ2ksICcnKTtcblxuICBjb25zdCBpbnB1dCA9IEJ1ZmZlci5mcm9tKGJhc2U2NCwgJ2Jhc2U2NCcpO1xuICByZXR1cm4gREVSRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlLmNhbGwodGhpcywgaW5wdXQsIG9wdGlvbnMpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBkZWNvZGVycyA9IGV4cG9ydHM7XG5cbmRlY29kZXJzLmRlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG5kZWNvZGVycy5wZW0gPSByZXF1aXJlKCcuL3BlbScpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGVuY29kZXJzID0gcmVxdWlyZSgnLi9lbmNvZGVycycpO1xuY29uc3QgZGVjb2RlcnMgPSByZXF1aXJlKCcuL2RlY29kZXJzJyk7XG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmNvbnN0IGFwaSA9IGV4cG9ydHM7XG5cbmFwaS5kZWZpbmUgPSBmdW5jdGlvbiBkZWZpbmUobmFtZSwgYm9keSkge1xuICByZXR1cm4gbmV3IEVudGl0eShuYW1lLCBib2R5KTtcbn07XG5cbmZ1bmN0aW9uIEVudGl0eShuYW1lLCBib2R5KSB7XG4gIHRoaXMubmFtZSA9IG5hbWU7XG4gIHRoaXMuYm9keSA9IGJvZHk7XG5cbiAgdGhpcy5kZWNvZGVycyA9IHt9O1xuICB0aGlzLmVuY29kZXJzID0ge307XG59XG5cbkVudGl0eS5wcm90b3R5cGUuX2NyZWF0ZU5hbWVkID0gZnVuY3Rpb24gY3JlYXRlTmFtZWQoQmFzZSkge1xuICBjb25zdCBuYW1lID0gdGhpcy5uYW1lO1xuXG4gIGZ1bmN0aW9uIEdlbmVyYXRlZChlbnRpdHkpIHtcbiAgICB0aGlzLl9pbml0TmFtZWQoZW50aXR5LCBuYW1lKTtcbiAgfVxuICBpbmhlcml0cyhHZW5lcmF0ZWQsIEJhc2UpO1xuICBHZW5lcmF0ZWQucHJvdG90eXBlLl9pbml0TmFtZWQgPSBmdW5jdGlvbiBfaW5pdE5hbWVkKGVudGl0eSwgbmFtZSkge1xuICAgIEJhc2UuY2FsbCh0aGlzLCBlbnRpdHksIG5hbWUpO1xuICB9O1xuXG4gIHJldHVybiBuZXcgR2VuZXJhdGVkKHRoaXMpO1xufTtcblxuRW50aXR5LnByb3RvdHlwZS5fZ2V0RGVjb2RlciA9IGZ1bmN0aW9uIF9nZXREZWNvZGVyKGVuYykge1xuICBlbmMgPSBlbmMgfHwgJ2Rlcic7XG4gIC8vIExhemlseSBjcmVhdGUgZGVjb2RlclxuICBpZiAoIXRoaXMuZGVjb2RlcnMuaGFzT3duUHJvcGVydHkoZW5jKSlcbiAgICB0aGlzLmRlY29kZXJzW2VuY10gPSB0aGlzLl9jcmVhdGVOYW1lZChkZWNvZGVyc1tlbmNdKTtcbiAgcmV0dXJuIHRoaXMuZGVjb2RlcnNbZW5jXTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGRhdGEsIGVuYywgb3B0aW9ucykge1xuICByZXR1cm4gdGhpcy5fZ2V0RGVjb2RlcihlbmMpLmRlY29kZShkYXRhLCBvcHRpb25zKTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuX2dldEVuY29kZXIgPSBmdW5jdGlvbiBfZ2V0RW5jb2RlcihlbmMpIHtcbiAgZW5jID0gZW5jIHx8ICdkZXInO1xuICAvLyBMYXppbHkgY3JlYXRlIGVuY29kZXJcbiAgaWYgKCF0aGlzLmVuY29kZXJzLmhhc093blByb3BlcnR5KGVuYykpXG4gICAgdGhpcy5lbmNvZGVyc1tlbmNdID0gdGhpcy5fY3JlYXRlTmFtZWQoZW5jb2RlcnNbZW5jXSk7XG4gIHJldHVybiB0aGlzLmVuY29kZXJzW2VuY107XG59O1xuXG5FbnRpdHkucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCBlbmMsIC8qIGludGVybmFsICovIHJlcG9ydGVyKSB7XG4gIHJldHVybiB0aGlzLl9nZXRFbmNvZGVyKGVuYykuZW5jb2RlKGRhdGEsIHJlcG9ydGVyKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgYmFzZSA9IGV4cG9ydHM7XG5cbmJhc2UuUmVwb3J0ZXIgPSByZXF1aXJlKCcuL3JlcG9ydGVyJykuUmVwb3J0ZXI7XG5iYXNlLkRlY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuL2J1ZmZlcicpLkRlY29kZXJCdWZmZXI7XG5iYXNlLkVuY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuL2J1ZmZlcicpLkVuY29kZXJCdWZmZXI7XG5iYXNlLk5vZGUgPSByZXF1aXJlKCcuL25vZGUnKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBjb25zdGFudHMgPSBleHBvcnRzO1xuXG4vLyBIZWxwZXJcbmNvbnN0YW50cy5fcmV2ZXJzZSA9IGZ1bmN0aW9uIHJldmVyc2UobWFwKSB7XG4gIGNvbnN0IHJlcyA9IHt9O1xuXG4gIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAvLyBDb252ZXJ0IGtleSB0byBpbnRlZ2VyIGlmIGl0IGlzIHN0cmluZ2lmaWVkXG4gICAgaWYgKChrZXkgfCAwKSA9PSBrZXkpXG4gICAgICBrZXkgPSBrZXkgfCAwO1xuXG4gICAgY29uc3QgdmFsdWUgPSBtYXBba2V5XTtcbiAgICByZXNbdmFsdWVdID0ga2V5O1xuICB9KTtcblxuICByZXR1cm4gcmVzO1xufTtcblxuY29uc3RhbnRzLmRlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgYXNuMSA9IGV4cG9ydHM7XG5cbmFzbjEuYmlnbnVtID0gcmVxdWlyZSgnYm4uanMnKTtcblxuYXNuMS5kZWZpbmUgPSByZXF1aXJlKCcuL2FzbjEvYXBpJykuZGVmaW5lO1xuYXNuMS5iYXNlID0gcmVxdWlyZSgnLi9hc24xL2Jhc2UnKTtcbmFzbjEuY29uc3RhbnRzID0gcmVxdWlyZSgnLi9hc24xL2NvbnN0YW50cycpO1xuYXNuMS5kZWNvZGVycyA9IHJlcXVpcmUoJy4vYXNuMS9kZWNvZGVycycpO1xuYXNuMS5lbmNvZGVycyA9IHJlcXVpcmUoJy4vYXNuMS9lbmNvZGVycycpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IGV4cG9ydHM7XG5cbmZ1bmN0aW9uIHRvQXJyYXkobXNnLCBlbmMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobXNnKSlcbiAgICByZXR1cm4gbXNnLnNsaWNlKCk7XG4gIGlmICghbXNnKVxuICAgIHJldHVybiBbXTtcbiAgdmFyIHJlcyA9IFtdO1xuICBpZiAodHlwZW9mIG1zZyAhPT0gJ3N0cmluZycpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKylcbiAgICAgIHJlc1tpXSA9IG1zZ1tpXSB8IDA7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBpZiAoZW5jID09PSAnaGV4Jykge1xuICAgIG1zZyA9IG1zZy5yZXBsYWNlKC9bXmEtejAtOV0rL2lnLCAnJyk7XG4gICAgaWYgKG1zZy5sZW5ndGggJSAyICE9PSAwKVxuICAgICAgbXNnID0gJzAnICsgbXNnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSAyKVxuICAgICAgcmVzLnB1c2gocGFyc2VJbnQobXNnW2ldICsgbXNnW2kgKyAxXSwgMTYpKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGMgPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICAgIHZhciBoaSA9IGMgPj4gODtcbiAgICAgIHZhciBsbyA9IGMgJiAweGZmO1xuICAgICAgaWYgKGhpKVxuICAgICAgICByZXMucHVzaChoaSwgbG8pO1xuICAgICAgZWxzZVxuICAgICAgICByZXMucHVzaChsbyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG51dGlscy50b0FycmF5ID0gdG9BcnJheTtcblxuZnVuY3Rpb24gemVybzIod29yZCkge1xuICBpZiAod29yZC5sZW5ndGggPT09IDEpXG4gICAgcmV0dXJuICcwJyArIHdvcmQ7XG4gIGVsc2VcbiAgICByZXR1cm4gd29yZDtcbn1cbnV0aWxzLnplcm8yID0gemVybzI7XG5cbmZ1bmN0aW9uIHRvSGV4KG1zZykge1xuICB2YXIgcmVzID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgIHJlcyArPSB6ZXJvMihtc2dbaV0udG9TdHJpbmcoMTYpKTtcbiAgcmV0dXJuIHJlcztcbn1cbnV0aWxzLnRvSGV4ID0gdG9IZXg7XG5cbnV0aWxzLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShhcnIsIGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdG9IZXgoYXJyKTtcbiAgZWxzZVxuICAgIHJldHVybiBhcnI7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IGV4cG9ydHM7XG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIG1pbkFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcbnZhciBtaW5VdGlscyA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1jcnlwdG8tdXRpbHMnKTtcblxudXRpbHMuYXNzZXJ0ID0gbWluQXNzZXJ0O1xudXRpbHMudG9BcnJheSA9IG1pblV0aWxzLnRvQXJyYXk7XG51dGlscy56ZXJvMiA9IG1pblV0aWxzLnplcm8yO1xudXRpbHMudG9IZXggPSBtaW5VdGlscy50b0hleDtcbnV0aWxzLmVuY29kZSA9IG1pblV0aWxzLmVuY29kZTtcblxuLy8gUmVwcmVzZW50IG51bSBpbiBhIHctTkFGIGZvcm1cbmZ1bmN0aW9uIGdldE5BRihudW0sIHcsIGJpdHMpIHtcbiAgdmFyIG5hZiA9IG5ldyBBcnJheShNYXRoLm1heChudW0uYml0TGVuZ3RoKCksIGJpdHMpICsgMSk7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgbmFmLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgbmFmW2ldID0gMDtcbiAgfVxuXG4gIHZhciB3cyA9IDEgPDwgKHcgKyAxKTtcbiAgdmFyIGsgPSBudW0uY2xvbmUoKTtcblxuICBmb3IgKGkgPSAwOyBpIDwgbmFmLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHo7XG4gICAgdmFyIG1vZCA9IGsuYW5kbG4od3MgLSAxKTtcbiAgICBpZiAoay5pc09kZCgpKSB7XG4gICAgICBpZiAobW9kID4gKHdzID4+IDEpIC0gMSlcbiAgICAgICAgeiA9ICh3cyA+PiAxKSAtIG1vZDtcbiAgICAgIGVsc2VcbiAgICAgICAgeiA9IG1vZDtcbiAgICAgIGsuaXN1Ym4oeik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHogPSAwO1xuICAgIH1cblxuICAgIG5hZltpXSA9IHo7XG4gICAgay5pdXNocm4oMSk7XG4gIH1cblxuICByZXR1cm4gbmFmO1xufVxudXRpbHMuZ2V0TkFGID0gZ2V0TkFGO1xuXG4vLyBSZXByZXNlbnQgazEsIGsyIGluIGEgSm9pbnQgU3BhcnNlIEZvcm1cbmZ1bmN0aW9uIGdldEpTRihrMSwgazIpIHtcbiAgdmFyIGpzZiA9IFtcbiAgICBbXSxcbiAgICBbXSxcbiAgXTtcblxuICBrMSA9IGsxLmNsb25lKCk7XG4gIGsyID0gazIuY2xvbmUoKTtcbiAgdmFyIGQxID0gMDtcbiAgdmFyIGQyID0gMDtcbiAgdmFyIG04O1xuICB3aGlsZSAoazEuY21wbigtZDEpID4gMCB8fCBrMi5jbXBuKC1kMikgPiAwKSB7XG4gICAgLy8gRmlyc3QgcGhhc2VcbiAgICB2YXIgbTE0ID0gKGsxLmFuZGxuKDMpICsgZDEpICYgMztcbiAgICB2YXIgbTI0ID0gKGsyLmFuZGxuKDMpICsgZDIpICYgMztcbiAgICBpZiAobTE0ID09PSAzKVxuICAgICAgbTE0ID0gLTE7XG4gICAgaWYgKG0yNCA9PT0gMylcbiAgICAgIG0yNCA9IC0xO1xuICAgIHZhciB1MTtcbiAgICBpZiAoKG0xNCAmIDEpID09PSAwKSB7XG4gICAgICB1MSA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG04ID0gKGsxLmFuZGxuKDcpICsgZDEpICYgNztcbiAgICAgIGlmICgobTggPT09IDMgfHwgbTggPT09IDUpICYmIG0yNCA9PT0gMilcbiAgICAgICAgdTEgPSAtbTE0O1xuICAgICAgZWxzZVxuICAgICAgICB1MSA9IG0xNDtcbiAgICB9XG4gICAganNmWzBdLnB1c2godTEpO1xuXG4gICAgdmFyIHUyO1xuICAgIGlmICgobTI0ICYgMSkgPT09IDApIHtcbiAgICAgIHUyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgbTggPSAoazIuYW5kbG4oNykgKyBkMikgJiA3O1xuICAgICAgaWYgKChtOCA9PT0gMyB8fCBtOCA9PT0gNSkgJiYgbTE0ID09PSAyKVxuICAgICAgICB1MiA9IC1tMjQ7XG4gICAgICBlbHNlXG4gICAgICAgIHUyID0gbTI0O1xuICAgIH1cbiAgICBqc2ZbMV0ucHVzaCh1Mik7XG5cbiAgICAvLyBTZWNvbmQgcGhhc2VcbiAgICBpZiAoMiAqIGQxID09PSB1MSArIDEpXG4gICAgICBkMSA9IDEgLSBkMTtcbiAgICBpZiAoMiAqIGQyID09PSB1MiArIDEpXG4gICAgICBkMiA9IDEgLSBkMjtcbiAgICBrMS5pdXNocm4oMSk7XG4gICAgazIuaXVzaHJuKDEpO1xuICB9XG5cbiAgcmV0dXJuIGpzZjtcbn1cbnV0aWxzLmdldEpTRiA9IGdldEpTRjtcblxuZnVuY3Rpb24gY2FjaGVkUHJvcGVydHkob2JqLCBuYW1lLCBjb21wdXRlcikge1xuICB2YXIga2V5ID0gJ18nICsgbmFtZTtcbiAgb2JqLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uIGNhY2hlZFByb3BlcnR5KCkge1xuICAgIHJldHVybiB0aGlzW2tleV0gIT09IHVuZGVmaW5lZCA/IHRoaXNba2V5XSA6XG4gICAgICB0aGlzW2tleV0gPSBjb21wdXRlci5jYWxsKHRoaXMpO1xuICB9O1xufVxudXRpbHMuY2FjaGVkUHJvcGVydHkgPSBjYWNoZWRQcm9wZXJ0eTtcblxuZnVuY3Rpb24gcGFyc2VCeXRlcyhieXRlcykge1xuICByZXR1cm4gdHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJyA/IHV0aWxzLnRvQXJyYXkoYnl0ZXMsICdoZXgnKSA6XG4gICAgYnl0ZXM7XG59XG51dGlscy5wYXJzZUJ5dGVzID0gcGFyc2VCeXRlcztcblxuZnVuY3Rpb24gaW50RnJvbUxFKGJ5dGVzKSB7XG4gIHJldHVybiBuZXcgQk4oYnl0ZXMsICdoZXgnLCAnbGUnKTtcbn1cbnV0aWxzLmludEZyb21MRSA9IGludEZyb21MRTtcblxuIiwKICAgICJ2YXIgcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByYW5kKGxlbikge1xuICBpZiAoIXIpXG4gICAgciA9IG5ldyBSYW5kKG51bGwpO1xuXG4gIHJldHVybiByLmdlbmVyYXRlKGxlbik7XG59O1xuXG5mdW5jdGlvbiBSYW5kKHJhbmQpIHtcbiAgdGhpcy5yYW5kID0gcmFuZDtcbn1cbm1vZHVsZS5leHBvcnRzLlJhbmQgPSBSYW5kO1xuXG5SYW5kLnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uIGdlbmVyYXRlKGxlbikge1xuICByZXR1cm4gdGhpcy5fcmFuZChsZW4pO1xufTtcblxuLy8gRW11bGF0ZSBjcnlwdG8gQVBJIHVzaW5nIHJhbmR5XG5SYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgaWYgKHRoaXMucmFuZC5nZXRCeXRlcylcbiAgICByZXR1cm4gdGhpcy5yYW5kLmdldEJ5dGVzKG4pO1xuXG4gIHZhciByZXMgPSBuZXcgVWludDhBcnJheShuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspXG4gICAgcmVzW2ldID0gdGhpcy5yYW5kLmdldEJ5dGUoKTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbmlmICh0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcpIHtcbiAgaWYgKHNlbGYuY3J5cHRvICYmIHNlbGYuY3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIE1vZGVybiBicm93c2Vyc1xuICAgIFJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICAgICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KG4pO1xuICAgICAgc2VsZi5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycik7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH07XG4gIH0gZWxzZSBpZiAoc2VsZi5tc0NyeXB0byAmJiBzZWxmLm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIElFXG4gICAgUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbiBfcmFuZChuKSB7XG4gICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gICAgICBzZWxmLm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnIpO1xuICAgICAgcmV0dXJuIGFycjtcbiAgICB9O1xuXG4gIC8vIFNhZmFyaSdzIFdlYldvcmtlcnMgZG8gbm90IGhhdmUgYGNyeXB0b2BcbiAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0Jykge1xuICAgIC8vIE9sZCBqdW5rXG4gICAgUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkIHlldCcpO1xuICAgIH07XG4gIH1cbn0gZWxzZSB7XG4gIC8vIE5vZGUuanMgb3IgV2ViIHdvcmtlciB3aXRoIG5vIGNyeXB0byBzdXBwb3J0XG4gIHRyeSB7XG4gICAgdmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuICAgIGlmICh0eXBlb2YgY3J5cHRvLnJhbmRvbUJ5dGVzICE9PSAnZnVuY3Rpb24nKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkJyk7XG5cbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgICAgIHJldHVybiBjcnlwdG8ucmFuZG9tQnl0ZXMobik7XG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICB9XG59XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgZ2V0TkFGID0gdXRpbHMuZ2V0TkFGO1xudmFyIGdldEpTRiA9IHV0aWxzLmdldEpTRjtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIEJhc2VDdXJ2ZSh0eXBlLCBjb25mKSB7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMucCA9IG5ldyBCTihjb25mLnAsIDE2KTtcblxuICAvLyBVc2UgTW9udGdvbWVyeSwgd2hlbiB0aGVyZSBpcyBubyBmYXN0IHJlZHVjdGlvbiBmb3IgdGhlIHByaW1lXG4gIHRoaXMucmVkID0gY29uZi5wcmltZSA/IEJOLnJlZChjb25mLnByaW1lKSA6IEJOLm1vbnQodGhpcy5wKTtcblxuICAvLyBVc2VmdWwgZm9yIG1hbnkgY3VydmVzXG4gIHRoaXMuemVybyA9IG5ldyBCTigwKS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMub25lID0gbmV3IEJOKDEpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy50d28gPSBuZXcgQk4oMikudG9SZWQodGhpcy5yZWQpO1xuXG4gIC8vIEN1cnZlIGNvbmZpZ3VyYXRpb24sIG9wdGlvbmFsXG4gIHRoaXMubiA9IGNvbmYubiAmJiBuZXcgQk4oY29uZi5uLCAxNik7XG4gIHRoaXMuZyA9IGNvbmYuZyAmJiB0aGlzLnBvaW50RnJvbUpTT04oY29uZi5nLCBjb25mLmdSZWQpO1xuXG4gIC8vIFRlbXBvcmFyeSBhcnJheXNcbiAgdGhpcy5fd25hZlQxID0gbmV3IEFycmF5KDQpO1xuICB0aGlzLl93bmFmVDIgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX3duYWZUMyA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fd25hZlQ0ID0gbmV3IEFycmF5KDQpO1xuXG4gIHRoaXMuX2JpdExlbmd0aCA9IHRoaXMubiA/IHRoaXMubi5iaXRMZW5ndGgoKSA6IDA7XG5cbiAgLy8gR2VuZXJhbGl6ZWQgR3JlZyBNYXh3ZWxsJ3MgdHJpY2tcbiAgdmFyIGFkanVzdENvdW50ID0gdGhpcy5uICYmIHRoaXMucC5kaXYodGhpcy5uKTtcbiAgaWYgKCFhZGp1c3RDb3VudCB8fCBhZGp1c3RDb3VudC5jbXBuKDEwMCkgPiAwKSB7XG4gICAgdGhpcy5yZWROID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9tYXh3ZWxsVHJpY2sgPSB0cnVlO1xuICAgIHRoaXMucmVkTiA9IHRoaXMubi50b1JlZCh0aGlzLnJlZCk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gQmFzZUN1cnZlO1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24gcG9pbnQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLl9maXhlZE5hZk11bCA9IGZ1bmN0aW9uIF9maXhlZE5hZk11bChwLCBrKSB7XG4gIGFzc2VydChwLnByZWNvbXB1dGVkKTtcbiAgdmFyIGRvdWJsZXMgPSBwLl9nZXREb3VibGVzKCk7XG5cbiAgdmFyIG5hZiA9IGdldE5BRihrLCAxLCB0aGlzLl9iaXRMZW5ndGgpO1xuICB2YXIgSSA9ICgxIDw8IChkb3VibGVzLnN0ZXAgKyAxKSkgLSAoZG91Ymxlcy5zdGVwICUgMiA9PT0gMCA/IDIgOiAxKTtcbiAgSSAvPSAzO1xuXG4gIC8vIFRyYW5zbGF0ZSBpbnRvIG1vcmUgd2luZG93ZWQgZm9ybVxuICB2YXIgcmVwciA9IFtdO1xuICB2YXIgajtcbiAgdmFyIG5hZlc7XG4gIGZvciAoaiA9IDA7IGogPCBuYWYubGVuZ3RoOyBqICs9IGRvdWJsZXMuc3RlcCkge1xuICAgIG5hZlcgPSAwO1xuICAgIGZvciAodmFyIGwgPSBqICsgZG91Ymxlcy5zdGVwIC0gMTsgbCA+PSBqOyBsLS0pXG4gICAgICBuYWZXID0gKG5hZlcgPDwgMSkgKyBuYWZbbF07XG4gICAgcmVwci5wdXNoKG5hZlcpO1xuICB9XG5cbiAgdmFyIGEgPSB0aGlzLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgdmFyIGIgPSB0aGlzLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgZm9yICh2YXIgaSA9IEk7IGkgPiAwOyBpLS0pIHtcbiAgICBmb3IgKGogPSAwOyBqIDwgcmVwci5sZW5ndGg7IGorKykge1xuICAgICAgbmFmVyA9IHJlcHJbal07XG4gICAgICBpZiAobmFmVyA9PT0gaSlcbiAgICAgICAgYiA9IGIubWl4ZWRBZGQoZG91Ymxlcy5wb2ludHNbal0pO1xuICAgICAgZWxzZSBpZiAobmFmVyA9PT0gLWkpXG4gICAgICAgIGIgPSBiLm1peGVkQWRkKGRvdWJsZXMucG9pbnRzW2pdLm5lZygpKTtcbiAgICB9XG4gICAgYSA9IGEuYWRkKGIpO1xuICB9XG4gIHJldHVybiBhLnRvUCgpO1xufTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS5fd25hZk11bCA9IGZ1bmN0aW9uIF93bmFmTXVsKHAsIGspIHtcbiAgdmFyIHcgPSA0O1xuXG4gIC8vIFByZWNvbXB1dGUgd2luZG93XG4gIHZhciBuYWZQb2ludHMgPSBwLl9nZXROQUZQb2ludHModyk7XG4gIHcgPSBuYWZQb2ludHMud25kO1xuICB2YXIgd25kID0gbmFmUG9pbnRzLnBvaW50cztcblxuICAvLyBHZXQgTkFGIGZvcm1cbiAgdmFyIG5hZiA9IGdldE5BRihrLCB3LCB0aGlzLl9iaXRMZW5ndGgpO1xuXG4gIC8vIEFkZCBgdGhpc2AqKE4rMSkgZm9yIGV2ZXJ5IHctTkFGIGluZGV4XG4gIHZhciBhY2MgPSB0aGlzLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgZm9yICh2YXIgaSA9IG5hZi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIC8vIENvdW50IHplcm9lc1xuICAgIGZvciAodmFyIGwgPSAwOyBpID49IDAgJiYgbmFmW2ldID09PSAwOyBpLS0pXG4gICAgICBsKys7XG4gICAgaWYgKGkgPj0gMClcbiAgICAgIGwrKztcbiAgICBhY2MgPSBhY2MuZGJscChsKTtcblxuICAgIGlmIChpIDwgMClcbiAgICAgIGJyZWFrO1xuICAgIHZhciB6ID0gbmFmW2ldO1xuICAgIGFzc2VydCh6ICE9PSAwKTtcbiAgICBpZiAocC50eXBlID09PSAnYWZmaW5lJykge1xuICAgICAgLy8gSiArLSBQXG4gICAgICBpZiAoeiA+IDApXG4gICAgICAgIGFjYyA9IGFjYy5taXhlZEFkZCh3bmRbKHogLSAxKSA+PiAxXSk7XG4gICAgICBlbHNlXG4gICAgICAgIGFjYyA9IGFjYy5taXhlZEFkZCh3bmRbKC16IC0gMSkgPj4gMV0ubmVnKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBKICstIEpcbiAgICAgIGlmICh6ID4gMClcbiAgICAgICAgYWNjID0gYWNjLmFkZCh3bmRbKHogLSAxKSA+PiAxXSk7XG4gICAgICBlbHNlXG4gICAgICAgIGFjYyA9IGFjYy5hZGQod25kWygteiAtIDEpID4+IDFdLm5lZygpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHAudHlwZSA9PT0gJ2FmZmluZScgPyBhY2MudG9QKCkgOiBhY2M7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLl93bmFmTXVsQWRkID0gZnVuY3Rpb24gX3duYWZNdWxBZGQoZGVmVyxcbiAgcG9pbnRzLFxuICBjb2VmZnMsXG4gIGxlbixcbiAgamFjb2JpYW5SZXN1bHQpIHtcbiAgdmFyIHduZFdpZHRoID0gdGhpcy5fd25hZlQxO1xuICB2YXIgd25kID0gdGhpcy5fd25hZlQyO1xuICB2YXIgbmFmID0gdGhpcy5fd25hZlQzO1xuXG4gIC8vIEZpbGwgYWxsIGFycmF5c1xuICB2YXIgbWF4ID0gMDtcbiAgdmFyIGk7XG4gIHZhciBqO1xuICB2YXIgcDtcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgcCA9IHBvaW50c1tpXTtcbiAgICB2YXIgbmFmUG9pbnRzID0gcC5fZ2V0TkFGUG9pbnRzKGRlZlcpO1xuICAgIHduZFdpZHRoW2ldID0gbmFmUG9pbnRzLnduZDtcbiAgICB3bmRbaV0gPSBuYWZQb2ludHMucG9pbnRzO1xuICB9XG5cbiAgLy8gQ29tYiBzbWFsbCB3aW5kb3cgTkFGc1xuICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDE7IGkgLT0gMikge1xuICAgIHZhciBhID0gaSAtIDE7XG4gICAgdmFyIGIgPSBpO1xuICAgIGlmICh3bmRXaWR0aFthXSAhPT0gMSB8fCB3bmRXaWR0aFtiXSAhPT0gMSkge1xuICAgICAgbmFmW2FdID0gZ2V0TkFGKGNvZWZmc1thXSwgd25kV2lkdGhbYV0sIHRoaXMuX2JpdExlbmd0aCk7XG4gICAgICBuYWZbYl0gPSBnZXROQUYoY29lZmZzW2JdLCB3bmRXaWR0aFtiXSwgdGhpcy5fYml0TGVuZ3RoKTtcbiAgICAgIG1heCA9IE1hdGgubWF4KG5hZlthXS5sZW5ndGgsIG1heCk7XG4gICAgICBtYXggPSBNYXRoLm1heChuYWZbYl0ubGVuZ3RoLCBtYXgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGNvbWIgPSBbXG4gICAgICBwb2ludHNbYV0sIC8qIDEgKi9cbiAgICAgIG51bGwsIC8qIDMgKi9cbiAgICAgIG51bGwsIC8qIDUgKi9cbiAgICAgIHBvaW50c1tiXSwgLyogNyAqL1xuICAgIF07XG5cbiAgICAvLyBUcnkgdG8gYXZvaWQgUHJvamVjdGl2ZSBwb2ludHMsIGlmIHBvc3NpYmxlXG4gICAgaWYgKHBvaW50c1thXS55LmNtcChwb2ludHNbYl0ueSkgPT09IDApIHtcbiAgICAgIGNvbWJbMV0gPSBwb2ludHNbYV0uYWRkKHBvaW50c1tiXSk7XG4gICAgICBjb21iWzJdID0gcG9pbnRzW2FdLnRvSigpLm1peGVkQWRkKHBvaW50c1tiXS5uZWcoKSk7XG4gICAgfSBlbHNlIGlmIChwb2ludHNbYV0ueS5jbXAocG9pbnRzW2JdLnkucmVkTmVnKCkpID09PSAwKSB7XG4gICAgICBjb21iWzFdID0gcG9pbnRzW2FdLnRvSigpLm1peGVkQWRkKHBvaW50c1tiXSk7XG4gICAgICBjb21iWzJdID0gcG9pbnRzW2FdLmFkZChwb2ludHNbYl0ubmVnKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21iWzFdID0gcG9pbnRzW2FdLnRvSigpLm1peGVkQWRkKHBvaW50c1tiXSk7XG4gICAgICBjb21iWzJdID0gcG9pbnRzW2FdLnRvSigpLm1peGVkQWRkKHBvaW50c1tiXS5uZWcoKSk7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4ID0gW1xuICAgICAgLTMsIC8qIC0xIC0xICovXG4gICAgICAtMSwgLyogLTEgMCAqL1xuICAgICAgLTUsIC8qIC0xIDEgKi9cbiAgICAgIC03LCAvKiAwIC0xICovXG4gICAgICAwLCAvKiAwIDAgKi9cbiAgICAgIDcsIC8qIDAgMSAqL1xuICAgICAgNSwgLyogMSAtMSAqL1xuICAgICAgMSwgLyogMSAwICovXG4gICAgICAzLCAgLyogMSAxICovXG4gICAgXTtcblxuICAgIHZhciBqc2YgPSBnZXRKU0YoY29lZmZzW2FdLCBjb2VmZnNbYl0pO1xuICAgIG1heCA9IE1hdGgubWF4KGpzZlswXS5sZW5ndGgsIG1heCk7XG4gICAgbmFmW2FdID0gbmV3IEFycmF5KG1heCk7XG4gICAgbmFmW2JdID0gbmV3IEFycmF5KG1heCk7XG4gICAgZm9yIChqID0gMDsgaiA8IG1heDsgaisrKSB7XG4gICAgICB2YXIgamEgPSBqc2ZbMF1bal0gfCAwO1xuICAgICAgdmFyIGpiID0ganNmWzFdW2pdIHwgMDtcblxuICAgICAgbmFmW2FdW2pdID0gaW5kZXhbKGphICsgMSkgKiAzICsgKGpiICsgMSldO1xuICAgICAgbmFmW2JdW2pdID0gMDtcbiAgICAgIHduZFthXSA9IGNvbWI7XG4gICAgfVxuICB9XG5cbiAgdmFyIGFjYyA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICB2YXIgdG1wID0gdGhpcy5fd25hZlQ0O1xuICBmb3IgKGkgPSBtYXg7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGsgPSAwO1xuXG4gICAgd2hpbGUgKGkgPj0gMCkge1xuICAgICAgdmFyIHplcm8gPSB0cnVlO1xuICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgIHRtcFtqXSA9IG5hZltqXVtpXSB8IDA7XG4gICAgICAgIGlmICh0bXBbal0gIT09IDApXG4gICAgICAgICAgemVybyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCF6ZXJvKVxuICAgICAgICBicmVhaztcbiAgICAgIGsrKztcbiAgICAgIGktLTtcbiAgICB9XG4gICAgaWYgKGkgPj0gMClcbiAgICAgIGsrKztcbiAgICBhY2MgPSBhY2MuZGJscChrKTtcbiAgICBpZiAoaSA8IDApXG4gICAgICBicmVhaztcblxuICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykge1xuICAgICAgdmFyIHogPSB0bXBbal07XG4gICAgICBwO1xuICAgICAgaWYgKHogPT09IDApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgZWxzZSBpZiAoeiA+IDApXG4gICAgICAgIHAgPSB3bmRbal1bKHogLSAxKSA+PiAxXTtcbiAgICAgIGVsc2UgaWYgKHogPCAwKVxuICAgICAgICBwID0gd25kW2pdWygteiAtIDEpID4+IDFdLm5lZygpO1xuXG4gICAgICBpZiAocC50eXBlID09PSAnYWZmaW5lJylcbiAgICAgICAgYWNjID0gYWNjLm1peGVkQWRkKHApO1xuICAgICAgZWxzZVxuICAgICAgICBhY2MgPSBhY2MuYWRkKHApO1xuICAgIH1cbiAgfVxuICAvLyBaZXJvaWZ5IHJlZmVyZW5jZXNcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgIHduZFtpXSA9IG51bGw7XG5cbiAgaWYgKGphY29iaWFuUmVzdWx0KVxuICAgIHJldHVybiBhY2M7XG4gIGVsc2VcbiAgICByZXR1cm4gYWNjLnRvUCgpO1xufTtcblxuZnVuY3Rpb24gQmFzZVBvaW50KGN1cnZlLCB0eXBlKSB7XG4gIHRoaXMuY3VydmUgPSBjdXJ2ZTtcbiAgdGhpcy50eXBlID0gdHlwZTtcbiAgdGhpcy5wcmVjb21wdXRlZCA9IG51bGw7XG59XG5CYXNlQ3VydmUuQmFzZVBvaW50ID0gQmFzZVBvaW50O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEoLypvdGhlciovKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG4gIHJldHVybiB0aGlzLmN1cnZlLnZhbGlkYXRlKHRoaXMpO1xufTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS5kZWNvZGVQb2ludCA9IGZ1bmN0aW9uIGRlY29kZVBvaW50KGJ5dGVzLCBlbmMpIHtcbiAgYnl0ZXMgPSB1dGlscy50b0FycmF5KGJ5dGVzLCBlbmMpO1xuXG4gIHZhciBsZW4gPSB0aGlzLnAuYnl0ZUxlbmd0aCgpO1xuXG4gIC8vIHVuY29tcHJlc3NlZCwgaHlicmlkLW9kZCwgaHlicmlkLWV2ZW5cbiAgaWYgKChieXRlc1swXSA9PT0gMHgwNCB8fCBieXRlc1swXSA9PT0gMHgwNiB8fCBieXRlc1swXSA9PT0gMHgwNykgJiZcbiAgICAgIGJ5dGVzLmxlbmd0aCAtIDEgPT09IDIgKiBsZW4pIHtcbiAgICBpZiAoYnl0ZXNbMF0gPT09IDB4MDYpXG4gICAgICBhc3NlcnQoYnl0ZXNbYnl0ZXMubGVuZ3RoIC0gMV0gJSAyID09PSAwKTtcbiAgICBlbHNlIGlmIChieXRlc1swXSA9PT0gMHgwNylcbiAgICAgIGFzc2VydChieXRlc1tieXRlcy5sZW5ndGggLSAxXSAlIDIgPT09IDEpO1xuXG4gICAgdmFyIHJlcyA9ICB0aGlzLnBvaW50KGJ5dGVzLnNsaWNlKDEsIDEgKyBsZW4pLFxuICAgICAgYnl0ZXMuc2xpY2UoMSArIGxlbiwgMSArIDIgKiBsZW4pKTtcblxuICAgIHJldHVybiByZXM7XG4gIH0gZWxzZSBpZiAoKGJ5dGVzWzBdID09PSAweDAyIHx8IGJ5dGVzWzBdID09PSAweDAzKSAmJlxuICAgICAgICAgICAgICBieXRlcy5sZW5ndGggLSAxID09PSBsZW4pIHtcbiAgICByZXR1cm4gdGhpcy5wb2ludEZyb21YKGJ5dGVzLnNsaWNlKDEsIDEgKyBsZW4pLCBieXRlc1swXSA9PT0gMHgwMyk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHBvaW50IGZvcm1hdCcpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5lbmNvZGVDb21wcmVzc2VkID0gZnVuY3Rpb24gZW5jb2RlQ29tcHJlc3NlZChlbmMpIHtcbiAgcmV0dXJuIHRoaXMuZW5jb2RlKGVuYywgdHJ1ZSk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9lbmNvZGUgPSBmdW5jdGlvbiBfZW5jb2RlKGNvbXBhY3QpIHtcbiAgdmFyIGxlbiA9IHRoaXMuY3VydmUucC5ieXRlTGVuZ3RoKCk7XG4gIHZhciB4ID0gdGhpcy5nZXRYKCkudG9BcnJheSgnYmUnLCBsZW4pO1xuXG4gIGlmIChjb21wYWN0KVxuICAgIHJldHVybiBbIHRoaXMuZ2V0WSgpLmlzRXZlbigpID8gMHgwMiA6IDB4MDMgXS5jb25jYXQoeCk7XG5cbiAgcmV0dXJuIFsgMHgwNCBdLmNvbmNhdCh4LCB0aGlzLmdldFkoKS50b0FycmF5KCdiZScsIGxlbikpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoZW5jLCBjb21wYWN0KSB7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy5fZW5jb2RlKGNvbXBhY3QpLCBlbmMpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5wcmVjb21wdXRlID0gZnVuY3Rpb24gcHJlY29tcHV0ZShwb3dlcikge1xuICBpZiAodGhpcy5wcmVjb21wdXRlZClcbiAgICByZXR1cm4gdGhpcztcblxuICB2YXIgcHJlY29tcHV0ZWQgPSB7XG4gICAgZG91YmxlczogbnVsbCxcbiAgICBuYWY6IG51bGwsXG4gICAgYmV0YTogbnVsbCxcbiAgfTtcbiAgcHJlY29tcHV0ZWQubmFmID0gdGhpcy5fZ2V0TkFGUG9pbnRzKDgpO1xuICBwcmVjb21wdXRlZC5kb3VibGVzID0gdGhpcy5fZ2V0RG91Ymxlcyg0LCBwb3dlcik7XG4gIHByZWNvbXB1dGVkLmJldGEgPSB0aGlzLl9nZXRCZXRhKCk7XG4gIHRoaXMucHJlY29tcHV0ZWQgPSBwcmVjb21wdXRlZDtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2hhc0RvdWJsZXMgPSBmdW5jdGlvbiBfaGFzRG91YmxlcyhrKSB7XG4gIGlmICghdGhpcy5wcmVjb21wdXRlZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGRvdWJsZXMgPSB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXM7XG4gIGlmICghZG91YmxlcylcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGRvdWJsZXMucG9pbnRzLmxlbmd0aCA+PSBNYXRoLmNlaWwoKGsuYml0TGVuZ3RoKCkgKyAxKSAvIGRvdWJsZXMuc3RlcCk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9nZXREb3VibGVzID0gZnVuY3Rpb24gX2dldERvdWJsZXMoc3RlcCwgcG93ZXIpIHtcbiAgaWYgKHRoaXMucHJlY29tcHV0ZWQgJiYgdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzKVxuICAgIHJldHVybiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXM7XG5cbiAgdmFyIGRvdWJsZXMgPSBbIHRoaXMgXTtcbiAgdmFyIGFjYyA9IHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG93ZXI7IGkgKz0gc3RlcCkge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3RlcDsgaisrKVxuICAgICAgYWNjID0gYWNjLmRibCgpO1xuICAgIGRvdWJsZXMucHVzaChhY2MpO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RlcDogc3RlcCxcbiAgICBwb2ludHM6IGRvdWJsZXMsXG4gIH07XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9nZXROQUZQb2ludHMgPSBmdW5jdGlvbiBfZ2V0TkFGUG9pbnRzKHduZCkge1xuICBpZiAodGhpcy5wcmVjb21wdXRlZCAmJiB0aGlzLnByZWNvbXB1dGVkLm5hZilcbiAgICByZXR1cm4gdGhpcy5wcmVjb21wdXRlZC5uYWY7XG5cbiAgdmFyIHJlcyA9IFsgdGhpcyBdO1xuICB2YXIgbWF4ID0gKDEgPDwgd25kKSAtIDE7XG4gIHZhciBkYmwgPSBtYXggPT09IDEgPyBudWxsIDogdGhpcy5kYmwoKTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBtYXg7IGkrKylcbiAgICByZXNbaV0gPSByZXNbaSAtIDFdLmFkZChkYmwpO1xuICByZXR1cm4ge1xuICAgIHduZDogd25kLFxuICAgIHBvaW50czogcmVzLFxuICB9O1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5fZ2V0QmV0YSA9IGZ1bmN0aW9uIF9nZXRCZXRhKCkge1xuICByZXR1cm4gbnVsbDtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuZGJscCA9IGZ1bmN0aW9uIGRibHAoaykge1xuICB2YXIgciA9IHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgazsgaSsrKVxuICAgIHIgPSByLmRibCgpO1xuICByZXR1cm4gcjtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIEJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcblxudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gU2hvcnRDdXJ2ZShjb25mKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCAnc2hvcnQnLCBjb25mKTtcblxuICB0aGlzLmEgPSBuZXcgQk4oY29uZi5hLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmIgPSBuZXcgQk4oY29uZi5iLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLnRpbnYgPSB0aGlzLnR3by5yZWRJbnZtKCk7XG5cbiAgdGhpcy56ZXJvQSA9IHRoaXMuYS5mcm9tUmVkKCkuY21wbigwKSA9PT0gMDtcbiAgdGhpcy50aHJlZUEgPSB0aGlzLmEuZnJvbVJlZCgpLnN1Yih0aGlzLnApLmNtcG4oLTMpID09PSAwO1xuXG4gIC8vIElmIHRoZSBjdXJ2ZSBpcyBlbmRvbW9ycGhpYywgcHJlY2FsY3VsYXRlIGJldGEgYW5kIGxhbWJkYVxuICB0aGlzLmVuZG8gPSB0aGlzLl9nZXRFbmRvbW9ycGhpc20oY29uZik7XG4gIHRoaXMuX2VuZG9XbmFmVDEgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX2VuZG9XbmFmVDIgPSBuZXcgQXJyYXkoNCk7XG59XG5pbmhlcml0cyhTaG9ydEN1cnZlLCBCYXNlKTtcbm1vZHVsZS5leHBvcnRzID0gU2hvcnRDdXJ2ZTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2dldEVuZG9tb3JwaGlzbSA9IGZ1bmN0aW9uIF9nZXRFbmRvbW9ycGhpc20oY29uZikge1xuICAvLyBObyBlZmZpY2llbnQgZW5kb21vcnBoaXNtXG4gIGlmICghdGhpcy56ZXJvQSB8fCAhdGhpcy5nIHx8ICF0aGlzLm4gfHwgdGhpcy5wLm1vZG4oMykgIT09IDEpXG4gICAgcmV0dXJuO1xuXG4gIC8vIENvbXB1dGUgYmV0YSBhbmQgbGFtYmRhLCB0aGF0IGxhbWJkYSAqIFAgPSAoYmV0YSAqIFB4OyBQeSlcbiAgdmFyIGJldGE7XG4gIHZhciBsYW1iZGE7XG4gIGlmIChjb25mLmJldGEpIHtcbiAgICBiZXRhID0gbmV3IEJOKGNvbmYuYmV0YSwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYmV0YXMgPSB0aGlzLl9nZXRFbmRvUm9vdHModGhpcy5wKTtcbiAgICAvLyBDaG9vc2UgdGhlIHNtYWxsZXN0IGJldGFcbiAgICBiZXRhID0gYmV0YXNbMF0uY21wKGJldGFzWzFdKSA8IDAgPyBiZXRhc1swXSA6IGJldGFzWzFdO1xuICAgIGJldGEgPSBiZXRhLnRvUmVkKHRoaXMucmVkKTtcbiAgfVxuICBpZiAoY29uZi5sYW1iZGEpIHtcbiAgICBsYW1iZGEgPSBuZXcgQk4oY29uZi5sYW1iZGEsIDE2KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDaG9vc2UgdGhlIGxhbWJkYSB0aGF0IGlzIG1hdGNoaW5nIHNlbGVjdGVkIGJldGFcbiAgICB2YXIgbGFtYmRhcyA9IHRoaXMuX2dldEVuZG9Sb290cyh0aGlzLm4pO1xuICAgIGlmICh0aGlzLmcubXVsKGxhbWJkYXNbMF0pLnguY21wKHRoaXMuZy54LnJlZE11bChiZXRhKSkgPT09IDApIHtcbiAgICAgIGxhbWJkYSA9IGxhbWJkYXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhbWJkYSA9IGxhbWJkYXNbMV07XG4gICAgICBhc3NlcnQodGhpcy5nLm11bChsYW1iZGEpLnguY21wKHRoaXMuZy54LnJlZE11bChiZXRhKSkgPT09IDApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdldCBiYXNpcyB2ZWN0b3JzLCB1c2VkIGZvciBiYWxhbmNlZCBsZW5ndGgtdHdvIHJlcHJlc2VudGF0aW9uXG4gIHZhciBiYXNpcztcbiAgaWYgKGNvbmYuYmFzaXMpIHtcbiAgICBiYXNpcyA9IGNvbmYuYmFzaXMubWFwKGZ1bmN0aW9uKHZlYykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYTogbmV3IEJOKHZlYy5hLCAxNiksXG4gICAgICAgIGI6IG5ldyBCTih2ZWMuYiwgMTYpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBiYXNpcyA9IHRoaXMuX2dldEVuZG9CYXNpcyhsYW1iZGEpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBiZXRhOiBiZXRhLFxuICAgIGxhbWJkYTogbGFtYmRhLFxuICAgIGJhc2lzOiBiYXNpcyxcbiAgfTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9nZXRFbmRvUm9vdHMgPSBmdW5jdGlvbiBfZ2V0RW5kb1Jvb3RzKG51bSkge1xuICAvLyBGaW5kIHJvb3RzIG9mIGZvciB4XjIgKyB4ICsgMSBpbiBGXG4gIC8vIFJvb3QgPSAoLTEgKy0gU3FydCgtMykpIC8gMlxuICAvL1xuICB2YXIgcmVkID0gbnVtID09PSB0aGlzLnAgPyB0aGlzLnJlZCA6IEJOLm1vbnQobnVtKTtcbiAgdmFyIHRpbnYgPSBuZXcgQk4oMikudG9SZWQocmVkKS5yZWRJbnZtKCk7XG4gIHZhciBudGludiA9IHRpbnYucmVkTmVnKCk7XG5cbiAgdmFyIHMgPSBuZXcgQk4oMykudG9SZWQocmVkKS5yZWROZWcoKS5yZWRTcXJ0KCkucmVkTXVsKHRpbnYpO1xuXG4gIHZhciBsMSA9IG50aW52LnJlZEFkZChzKS5mcm9tUmVkKCk7XG4gIHZhciBsMiA9IG50aW52LnJlZFN1YihzKS5mcm9tUmVkKCk7XG4gIHJldHVybiBbIGwxLCBsMiBdO1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2dldEVuZG9CYXNpcyA9IGZ1bmN0aW9uIF9nZXRFbmRvQmFzaXMobGFtYmRhKSB7XG4gIC8vIGFwcnhTcXJ0ID49IHNxcnQodGhpcy5uKVxuICB2YXIgYXByeFNxcnQgPSB0aGlzLm4udXNocm4oTWF0aC5mbG9vcih0aGlzLm4uYml0TGVuZ3RoKCkgLyAyKSk7XG5cbiAgLy8gMy43NFxuICAvLyBSdW4gRUdDRCwgdW50aWwgcihMICsgMSkgPCBhcHJ4U3FydFxuICB2YXIgdSA9IGxhbWJkYTtcbiAgdmFyIHYgPSB0aGlzLm4uY2xvbmUoKTtcbiAgdmFyIHgxID0gbmV3IEJOKDEpO1xuICB2YXIgeTEgPSBuZXcgQk4oMCk7XG4gIHZhciB4MiA9IG5ldyBCTigwKTtcbiAgdmFyIHkyID0gbmV3IEJOKDEpO1xuXG4gIC8vIE5PVEU6IGFsbCB2ZWN0b3JzIGFyZSByb290cyBvZjogYSArIGIgKiBsYW1iZGEgPSAwIChtb2QgbilcbiAgdmFyIGEwO1xuICB2YXIgYjA7XG4gIC8vIEZpcnN0IHZlY3RvclxuICB2YXIgYTE7XG4gIHZhciBiMTtcbiAgLy8gU2Vjb25kIHZlY3RvclxuICB2YXIgYTI7XG4gIHZhciBiMjtcblxuICB2YXIgcHJldlI7XG4gIHZhciBpID0gMDtcbiAgdmFyIHI7XG4gIHZhciB4O1xuICB3aGlsZSAodS5jbXBuKDApICE9PSAwKSB7XG4gICAgdmFyIHEgPSB2LmRpdih1KTtcbiAgICByID0gdi5zdWIocS5tdWwodSkpO1xuICAgIHggPSB4Mi5zdWIocS5tdWwoeDEpKTtcbiAgICB2YXIgeSA9IHkyLnN1YihxLm11bCh5MSkpO1xuXG4gICAgaWYgKCFhMSAmJiByLmNtcChhcHJ4U3FydCkgPCAwKSB7XG4gICAgICBhMCA9IHByZXZSLm5lZygpO1xuICAgICAgYjAgPSB4MTtcbiAgICAgIGExID0gci5uZWcoKTtcbiAgICAgIGIxID0geDtcbiAgICB9IGVsc2UgaWYgKGExICYmICsraSA9PT0gMikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHByZXZSID0gcjtcblxuICAgIHYgPSB1O1xuICAgIHUgPSByO1xuICAgIHgyID0geDE7XG4gICAgeDEgPSB4O1xuICAgIHkyID0geTE7XG4gICAgeTEgPSB5O1xuICB9XG4gIGEyID0gci5uZWcoKTtcbiAgYjIgPSB4O1xuXG4gIHZhciBsZW4xID0gYTEuc3FyKCkuYWRkKGIxLnNxcigpKTtcbiAgdmFyIGxlbjIgPSBhMi5zcXIoKS5hZGQoYjIuc3FyKCkpO1xuICBpZiAobGVuMi5jbXAobGVuMSkgPj0gMCkge1xuICAgIGEyID0gYTA7XG4gICAgYjIgPSBiMDtcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBzaWduc1xuICBpZiAoYTEubmVnYXRpdmUpIHtcbiAgICBhMSA9IGExLm5lZygpO1xuICAgIGIxID0gYjEubmVnKCk7XG4gIH1cbiAgaWYgKGEyLm5lZ2F0aXZlKSB7XG4gICAgYTIgPSBhMi5uZWcoKTtcbiAgICBiMiA9IGIyLm5lZygpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICB7IGE6IGExLCBiOiBiMSB9LFxuICAgIHsgYTogYTIsIGI6IGIyIH0sXG4gIF07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZW5kb1NwbGl0ID0gZnVuY3Rpb24gX2VuZG9TcGxpdChrKSB7XG4gIHZhciBiYXNpcyA9IHRoaXMuZW5kby5iYXNpcztcbiAgdmFyIHYxID0gYmFzaXNbMF07XG4gIHZhciB2MiA9IGJhc2lzWzFdO1xuXG4gIHZhciBjMSA9IHYyLmIubXVsKGspLmRpdlJvdW5kKHRoaXMubik7XG4gIHZhciBjMiA9IHYxLmIubmVnKCkubXVsKGspLmRpdlJvdW5kKHRoaXMubik7XG5cbiAgdmFyIHAxID0gYzEubXVsKHYxLmEpO1xuICB2YXIgcDIgPSBjMi5tdWwodjIuYSk7XG4gIHZhciBxMSA9IGMxLm11bCh2MS5iKTtcbiAgdmFyIHEyID0gYzIubXVsKHYyLmIpO1xuXG4gIC8vIENhbGN1bGF0ZSBhbnN3ZXJcbiAgdmFyIGsxID0gay5zdWIocDEpLnN1YihwMik7XG4gIHZhciBrMiA9IHExLmFkZChxMikubmVnKCk7XG4gIHJldHVybiB7IGsxOiBrMSwgazI6IGsyIH07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5wb2ludEZyb21YID0gZnVuY3Rpb24gcG9pbnRGcm9tWCh4LCBvZGQpIHtcbiAgeCA9IG5ldyBCTih4LCAxNik7XG4gIGlmICgheC5yZWQpXG4gICAgeCA9IHgudG9SZWQodGhpcy5yZWQpO1xuXG4gIHZhciB5MiA9IHgucmVkU3FyKCkucmVkTXVsKHgpLnJlZElBZGQoeC5yZWRNdWwodGhpcy5hKSkucmVkSUFkZCh0aGlzLmIpO1xuICB2YXIgeSA9IHkyLnJlZFNxcnQoKTtcbiAgaWYgKHkucmVkU3FyKCkucmVkU3ViKHkyKS5jbXAodGhpcy56ZXJvKSAhPT0gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcG9pbnQnKTtcblxuICAvLyBYWFggSXMgdGhlcmUgYW55IHdheSB0byB0ZWxsIGlmIHRoZSBudW1iZXIgaXMgb2RkIHdpdGhvdXQgY29udmVydGluZyBpdFxuICAvLyB0byBub24tcmVkIGZvcm0/XG4gIHZhciBpc09kZCA9IHkuZnJvbVJlZCgpLmlzT2RkKCk7XG4gIGlmIChvZGQgJiYgIWlzT2RkIHx8ICFvZGQgJiYgaXNPZGQpXG4gICAgeSA9IHkucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHBvaW50KSB7XG4gIGlmIChwb2ludC5pbmYpXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgdmFyIHggPSBwb2ludC54O1xuICB2YXIgeSA9IHBvaW50Lnk7XG5cbiAgdmFyIGF4ID0gdGhpcy5hLnJlZE11bCh4KTtcbiAgdmFyIHJocyA9IHgucmVkU3FyKCkucmVkTXVsKHgpLnJlZElBZGQoYXgpLnJlZElBZGQodGhpcy5iKTtcbiAgcmV0dXJuIHkucmVkU3FyKCkucmVkSVN1YihyaHMpLmNtcG4oMCkgPT09IDA7XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZW5kb1duYWZNdWxBZGQgPVxuICAgIGZ1bmN0aW9uIF9lbmRvV25hZk11bEFkZChwb2ludHMsIGNvZWZmcywgamFjb2JpYW5SZXN1bHQpIHtcbiAgICAgIHZhciBucG9pbnRzID0gdGhpcy5fZW5kb1duYWZUMTtcbiAgICAgIHZhciBuY29lZmZzID0gdGhpcy5fZW5kb1duYWZUMjtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzcGxpdCA9IHRoaXMuX2VuZG9TcGxpdChjb2VmZnNbaV0pO1xuICAgICAgICB2YXIgcCA9IHBvaW50c1tpXTtcbiAgICAgICAgdmFyIGJldGEgPSBwLl9nZXRCZXRhKCk7XG5cbiAgICAgICAgaWYgKHNwbGl0LmsxLm5lZ2F0aXZlKSB7XG4gICAgICAgICAgc3BsaXQuazEuaW5lZygpO1xuICAgICAgICAgIHAgPSBwLm5lZyh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3BsaXQuazIubmVnYXRpdmUpIHtcbiAgICAgICAgICBzcGxpdC5rMi5pbmVnKCk7XG4gICAgICAgICAgYmV0YSA9IGJldGEubmVnKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbnBvaW50c1tpICogMl0gPSBwO1xuICAgICAgICBucG9pbnRzW2kgKiAyICsgMV0gPSBiZXRhO1xuICAgICAgICBuY29lZmZzW2kgKiAyXSA9IHNwbGl0LmsxO1xuICAgICAgICBuY29lZmZzW2kgKiAyICsgMV0gPSBzcGxpdC5rMjtcbiAgICAgIH1cbiAgICAgIHZhciByZXMgPSB0aGlzLl93bmFmTXVsQWRkKDEsIG5wb2ludHMsIG5jb2VmZnMsIGkgKiAyLCBqYWNvYmlhblJlc3VsdCk7XG5cbiAgICAgIC8vIENsZWFuLXVwIHJlZmVyZW5jZXMgdG8gcG9pbnRzIGFuZCBjb2VmZmljaWVudHNcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaSAqIDI7IGorKykge1xuICAgICAgICBucG9pbnRzW2pdID0gbnVsbDtcbiAgICAgICAgbmNvZWZmc1tqXSA9IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG5cbmZ1bmN0aW9uIFBvaW50KGN1cnZlLCB4LCB5LCBpc1JlZCkge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAnYWZmaW5lJyk7XG4gIGlmICh4ID09PSBudWxsICYmIHkgPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSBudWxsO1xuICAgIHRoaXMueSA9IG51bGw7XG4gICAgdGhpcy5pbmYgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IG5ldyBCTih4LCAxNik7XG4gICAgdGhpcy55ID0gbmV3IEJOKHksIDE2KTtcbiAgICAvLyBGb3JjZSByZWRnb21lcnkgcmVwcmVzZW50YXRpb24gd2hlbiBsb2FkaW5nIGZyb20gSlNPTlxuICAgIGlmIChpc1JlZCkge1xuICAgICAgdGhpcy54LmZvcmNlUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICAgIHRoaXMueS5mb3JjZVJlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgfVxuICAgIGlmICghdGhpcy54LnJlZClcbiAgICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKCF0aGlzLnkucmVkKVxuICAgICAgdGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICB0aGlzLmluZiA9IGZhbHNlO1xuICB9XG59XG5pbmhlcml0cyhQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KHgsIHksIGlzUmVkKSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcywgeCwgeSwgaXNSZWQpO1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uIHBvaW50RnJvbUpTT04ob2JqLCByZWQpIHtcbiAgcmV0dXJuIFBvaW50LmZyb21KU09OKHRoaXMsIG9iaiwgcmVkKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZ2V0QmV0YSA9IGZ1bmN0aW9uIF9nZXRCZXRhKCkge1xuICBpZiAoIXRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm47XG5cbiAgdmFyIHByZSA9IHRoaXMucHJlY29tcHV0ZWQ7XG4gIGlmIChwcmUgJiYgcHJlLmJldGEpXG4gICAgcmV0dXJuIHByZS5iZXRhO1xuXG4gIHZhciBiZXRhID0gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngucmVkTXVsKHRoaXMuY3VydmUuZW5kby5iZXRhKSwgdGhpcy55KTtcbiAgaWYgKHByZSkge1xuICAgIHZhciBjdXJ2ZSA9IHRoaXMuY3VydmU7XG4gICAgdmFyIGVuZG9NdWwgPSBmdW5jdGlvbihwKSB7XG4gICAgICByZXR1cm4gY3VydmUucG9pbnQocC54LnJlZE11bChjdXJ2ZS5lbmRvLmJldGEpLCBwLnkpO1xuICAgIH07XG4gICAgcHJlLmJldGEgPSBiZXRhO1xuICAgIGJldGEucHJlY29tcHV0ZWQgPSB7XG4gICAgICBiZXRhOiBudWxsLFxuICAgICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgICAgd25kOiBwcmUubmFmLnduZCxcbiAgICAgICAgcG9pbnRzOiBwcmUubmFmLnBvaW50cy5tYXAoZW5kb011bCksXG4gICAgICB9LFxuICAgICAgZG91YmxlczogcHJlLmRvdWJsZXMgJiYge1xuICAgICAgICBzdGVwOiBwcmUuZG91Ymxlcy5zdGVwLFxuICAgICAgICBwb2ludHM6IHByZS5kb3VibGVzLnBvaW50cy5tYXAoZW5kb011bCksXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGJldGE7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xuICBpZiAoIXRoaXMucHJlY29tcHV0ZWQpXG4gICAgcmV0dXJuIFsgdGhpcy54LCB0aGlzLnkgXTtcblxuICByZXR1cm4gWyB0aGlzLngsIHRoaXMueSwgdGhpcy5wcmVjb21wdXRlZCAmJiB7XG4gICAgZG91YmxlczogdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzICYmIHtcbiAgICAgIHN0ZXA6IHRoaXMucHJlY29tcHV0ZWQuZG91Ymxlcy5zdGVwLFxuICAgICAgcG9pbnRzOiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMucG9pbnRzLnNsaWNlKDEpLFxuICAgIH0sXG4gICAgbmFmOiB0aGlzLnByZWNvbXB1dGVkLm5hZiAmJiB7XG4gICAgICB3bmQ6IHRoaXMucHJlY29tcHV0ZWQubmFmLnduZCxcbiAgICAgIHBvaW50czogdGhpcy5wcmVjb21wdXRlZC5uYWYucG9pbnRzLnNsaWNlKDEpLFxuICAgIH0sXG4gIH0gXTtcbn07XG5cblBvaW50LmZyb21KU09OID0gZnVuY3Rpb24gZnJvbUpTT04oY3VydmUsIG9iaiwgcmVkKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJylcbiAgICBvYmogPSBKU09OLnBhcnNlKG9iaik7XG4gIHZhciByZXMgPSBjdXJ2ZS5wb2ludChvYmpbMF0sIG9ialsxXSwgcmVkKTtcbiAgaWYgKCFvYmpbMl0pXG4gICAgcmV0dXJuIHJlcztcblxuICBmdW5jdGlvbiBvYmoycG9pbnQob2JqKSB7XG4gICAgcmV0dXJuIGN1cnZlLnBvaW50KG9ialswXSwgb2JqWzFdLCByZWQpO1xuICB9XG5cbiAgdmFyIHByZSA9IG9ialsyXTtcbiAgcmVzLnByZWNvbXB1dGVkID0ge1xuICAgIGJldGE6IG51bGwsXG4gICAgZG91YmxlczogcHJlLmRvdWJsZXMgJiYge1xuICAgICAgc3RlcDogcHJlLmRvdWJsZXMuc3RlcCxcbiAgICAgIHBvaW50czogWyByZXMgXS5jb25jYXQocHJlLmRvdWJsZXMucG9pbnRzLm1hcChvYmoycG9pbnQpKSxcbiAgICB9LFxuICAgIG5hZjogcHJlLm5hZiAmJiB7XG4gICAgICB3bmQ6IHByZS5uYWYud25kLFxuICAgICAgcG9pbnRzOiBbIHJlcyBdLmNvbmNhdChwcmUubmFmLnBvaW50cy5tYXAob2JqMnBvaW50KSksXG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIHJlcztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkuZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgcmV0dXJuIHRoaXMuaW5mO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZChwKSB7XG4gIC8vIE8gKyBQID0gUFxuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHA7XG5cbiAgLy8gUCArIE8gPSBQXG4gIGlmIChwLmluZilcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBQICsgUCA9IDJQXG4gIGlmICh0aGlzLmVxKHApKVxuICAgIHJldHVybiB0aGlzLmRibCgpO1xuXG4gIC8vIFAgKyAoLVApID0gT1xuICBpZiAodGhpcy5uZWcoKS5lcShwKSlcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICAvLyBQICsgUSA9IE9cbiAgaWYgKHRoaXMueC5jbXAocC54KSA9PT0gMClcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICB2YXIgYyA9IHRoaXMueS5yZWRTdWIocC55KTtcbiAgaWYgKGMuY21wbigwKSAhPT0gMClcbiAgICBjID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihwLngpLnJlZEludm0oKSk7XG4gIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0aGlzLngpLnJlZElTdWIocC54KTtcbiAgdmFyIG55ID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihueCkpLnJlZElTdWIodGhpcy55KTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kYmwgPSBmdW5jdGlvbiBkYmwoKSB7XG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyAyUCA9IE9cbiAgdmFyIHlzMSA9IHRoaXMueS5yZWRBZGQodGhpcy55KTtcbiAgaWYgKHlzMS5jbXBuKDApID09PSAwKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIHZhciBhID0gdGhpcy5jdXJ2ZS5hO1xuXG4gIHZhciB4MiA9IHRoaXMueC5yZWRTcXIoKTtcbiAgdmFyIGR5aW52ID0geXMxLnJlZEludm0oKTtcbiAgdmFyIGMgPSB4Mi5yZWRBZGQoeDIpLnJlZElBZGQoeDIpLnJlZElBZGQoYSkucmVkTXVsKGR5aW52KTtcblxuICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodGhpcy54LnJlZEFkZCh0aGlzLngpKTtcbiAgdmFyIG55ID0gYy5yZWRNdWwodGhpcy54LnJlZFN1YihueCkpLnJlZElTdWIodGhpcy55KTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gZ2V0WCgpIHtcbiAgcmV0dXJuIHRoaXMueC5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uIGdldFkoKSB7XG4gIHJldHVybiB0aGlzLnkuZnJvbVJlZCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrKSB7XG4gIGsgPSBuZXcgQk4oaywgMTYpO1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG4gIGVsc2UgaWYgKHRoaXMuX2hhc0RvdWJsZXMoaykpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2ZpeGVkTmFmTXVsKHRoaXMsIGspO1xuICBlbHNlIGlmICh0aGlzLmN1cnZlLmVuZG8pXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2VuZG9XbmFmTXVsQWRkKFsgdGhpcyBdLCBbIGsgXSk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bCh0aGlzLCBrKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWxBZGQgPSBmdW5jdGlvbiBtdWxBZGQoazEsIHAyLCBrMikge1xuICB2YXIgcG9pbnRzID0gWyB0aGlzLCBwMiBdO1xuICB2YXIgY29lZmZzID0gWyBrMSwgazIgXTtcbiAgaWYgKHRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQocG9pbnRzLCBjb2VmZnMpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgcG9pbnRzLCBjb2VmZnMsIDIpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmptdWxBZGQgPSBmdW5jdGlvbiBqbXVsQWRkKGsxLCBwMiwgazIpIHtcbiAgdmFyIHBvaW50cyA9IFsgdGhpcywgcDIgXTtcbiAgdmFyIGNvZWZmcyA9IFsgazEsIGsyIF07XG4gIGlmICh0aGlzLmN1cnZlLmVuZG8pXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2VuZG9XbmFmTXVsQWRkKHBvaW50cywgY29lZmZzLCB0cnVlKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsIHBvaW50cywgY29lZmZzLCAyLCB0cnVlKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKHApIHtcbiAgcmV0dXJuIHRoaXMgPT09IHAgfHxcbiAgICAgICAgIHRoaXMuaW5mID09PSBwLmluZiAmJlxuICAgICAgICAgICAgICh0aGlzLmluZiB8fCB0aGlzLnguY21wKHAueCkgPT09IDAgJiYgdGhpcy55LmNtcChwLnkpID09PSAwKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcoX3ByZWNvbXB1dGUpIHtcbiAgaWYgKHRoaXMuaW5mKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIHZhciByZXMgPSB0aGlzLmN1cnZlLnBvaW50KHRoaXMueCwgdGhpcy55LnJlZE5lZygpKTtcbiAgaWYgKF9wcmVjb21wdXRlICYmIHRoaXMucHJlY29tcHV0ZWQpIHtcbiAgICB2YXIgcHJlID0gdGhpcy5wcmVjb21wdXRlZDtcbiAgICB2YXIgbmVnYXRlID0gZnVuY3Rpb24ocCkge1xuICAgICAgcmV0dXJuIHAubmVnKCk7XG4gICAgfTtcbiAgICByZXMucHJlY29tcHV0ZWQgPSB7XG4gICAgICBuYWY6IHByZS5uYWYgJiYge1xuICAgICAgICB3bmQ6IHByZS5uYWYud25kLFxuICAgICAgICBwb2ludHM6IHByZS5uYWYucG9pbnRzLm1hcChuZWdhdGUpLFxuICAgICAgfSxcbiAgICAgIGRvdWJsZXM6IHByZS5kb3VibGVzICYmIHtcbiAgICAgICAgc3RlcDogcHJlLmRvdWJsZXMuc3RlcCxcbiAgICAgICAgcG9pbnRzOiBwcmUuZG91Ymxlcy5wb2ludHMubWFwKG5lZ2F0ZSksXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cblBvaW50LnByb3RvdHlwZS50b0ogPSBmdW5jdGlvbiB0b0ooKSB7XG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG5cbiAgdmFyIHJlcyA9IHRoaXMuY3VydmUuanBvaW50KHRoaXMueCwgdGhpcy55LCB0aGlzLmN1cnZlLm9uZSk7XG4gIHJldHVybiByZXM7XG59O1xuXG5mdW5jdGlvbiBKUG9pbnQoY3VydmUsIHgsIHksIHopIHtcbiAgQmFzZS5CYXNlUG9pbnQuY2FsbCh0aGlzLCBjdXJ2ZSwgJ2phY29iaWFuJyk7XG4gIGlmICh4ID09PSBudWxsICYmIHkgPT09IG51bGwgJiYgeiA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMueSA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMueiA9IG5ldyBCTigwKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSBuZXcgQk4oeCwgMTYpO1xuICAgIHRoaXMueSA9IG5ldyBCTih5LCAxNik7XG4gICAgdGhpcy56ID0gbmV3IEJOKHosIDE2KTtcbiAgfVxuICBpZiAoIXRoaXMueC5yZWQpXG4gICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgaWYgKCF0aGlzLnkucmVkKVxuICAgIHRoaXMueSA9IHRoaXMueS50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gIGlmICghdGhpcy56LnJlZClcbiAgICB0aGlzLnogPSB0aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuXG4gIHRoaXMuek9uZSA9IHRoaXMueiA9PT0gdGhpcy5jdXJ2ZS5vbmU7XG59XG5pbmhlcml0cyhKUG9pbnQsIEJhc2UuQmFzZVBvaW50KTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuanBvaW50ID0gZnVuY3Rpb24ganBvaW50KHgsIHksIHopIHtcbiAgcmV0dXJuIG5ldyBKUG9pbnQodGhpcywgeCwgeSwgeik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLnRvUCA9IGZ1bmN0aW9uIHRvUCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIHZhciB6aW52ID0gdGhpcy56LnJlZEludm0oKTtcbiAgdmFyIHppbnYyID0gemludi5yZWRTcXIoKTtcbiAgdmFyIGF4ID0gdGhpcy54LnJlZE11bCh6aW52Mik7XG4gIHZhciBheSA9IHRoaXMueS5yZWRNdWwoemludjIpLnJlZE11bCh6aW52KTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChheCwgYXkpO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcoKSB7XG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludCh0aGlzLngsIHRoaXMueS5yZWROZWcoKSwgdGhpcy56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKHApIHtcbiAgLy8gTyArIFAgPSBQXG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gcDtcblxuICAvLyBQICsgTyA9IFBcbiAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIDEyTSArIDRTICsgN0FcbiAgdmFyIHB6MiA9IHAuei5yZWRTcXIoKTtcbiAgdmFyIHoyID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgdTEgPSB0aGlzLngucmVkTXVsKHB6Mik7XG4gIHZhciB1MiA9IHAueC5yZWRNdWwoejIpO1xuICB2YXIgczEgPSB0aGlzLnkucmVkTXVsKHB6Mi5yZWRNdWwocC56KSk7XG4gIHZhciBzMiA9IHAueS5yZWRNdWwoejIucmVkTXVsKHRoaXMueikpO1xuXG4gIHZhciBoID0gdTEucmVkU3ViKHUyKTtcbiAgdmFyIHIgPSBzMS5yZWRTdWIoczIpO1xuICBpZiAoaC5jbXBuKDApID09PSAwKSB7XG4gICAgaWYgKHIuY21wbigwKSAhPT0gMClcbiAgICAgIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5kYmwoKTtcbiAgfVxuXG4gIHZhciBoMiA9IGgucmVkU3FyKCk7XG4gIHZhciBoMyA9IGgyLnJlZE11bChoKTtcbiAgdmFyIHYgPSB1MS5yZWRNdWwoaDIpO1xuXG4gIHZhciBueCA9IHIucmVkU3FyKCkucmVkSUFkZChoMykucmVkSVN1Yih2KS5yZWRJU3ViKHYpO1xuICB2YXIgbnkgPSByLnJlZE11bCh2LnJlZElTdWIobngpKS5yZWRJU3ViKHMxLnJlZE11bChoMykpO1xuICB2YXIgbnogPSB0aGlzLnoucmVkTXVsKHAueikucmVkTXVsKGgpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUubWl4ZWRBZGQgPSBmdW5jdGlvbiBtaXhlZEFkZChwKSB7XG4gIC8vIE8gKyBQID0gUFxuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHAudG9KKCk7XG5cbiAgLy8gUCArIE8gPSBQXG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyA4TSArIDNTICsgN0FcbiAgdmFyIHoyID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgdTEgPSB0aGlzLng7XG4gIHZhciB1MiA9IHAueC5yZWRNdWwoejIpO1xuICB2YXIgczEgPSB0aGlzLnk7XG4gIHZhciBzMiA9IHAueS5yZWRNdWwoejIpLnJlZE11bCh0aGlzLnopO1xuXG4gIHZhciBoID0gdTEucmVkU3ViKHUyKTtcbiAgdmFyIHIgPSBzMS5yZWRTdWIoczIpO1xuICBpZiAoaC5jbXBuKDApID09PSAwKSB7XG4gICAgaWYgKHIuY21wbigwKSAhPT0gMClcbiAgICAgIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5kYmwoKTtcbiAgfVxuXG4gIHZhciBoMiA9IGgucmVkU3FyKCk7XG4gIHZhciBoMyA9IGgyLnJlZE11bChoKTtcbiAgdmFyIHYgPSB1MS5yZWRNdWwoaDIpO1xuXG4gIHZhciBueCA9IHIucmVkU3FyKCkucmVkSUFkZChoMykucmVkSVN1Yih2KS5yZWRJU3ViKHYpO1xuICB2YXIgbnkgPSByLnJlZE11bCh2LnJlZElTdWIobngpKS5yZWRJU3ViKHMxLnJlZE11bChoMykpO1xuICB2YXIgbnogPSB0aGlzLnoucmVkTXVsKGgpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZGJscCA9IGZ1bmN0aW9uIGRibHAocG93KSB7XG4gIGlmIChwb3cgPT09IDApXG4gICAgcmV0dXJuIHRoaXM7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcbiAgaWYgKCFwb3cpXG4gICAgcmV0dXJuIHRoaXMuZGJsKCk7XG5cbiAgdmFyIGk7XG4gIGlmICh0aGlzLmN1cnZlLnplcm9BIHx8IHRoaXMuY3VydmUudGhyZWVBKSB7XG4gICAgdmFyIHIgPSB0aGlzO1xuICAgIGZvciAoaSA9IDA7IGkgPCBwb3c7IGkrKylcbiAgICAgIHIgPSByLmRibCgpO1xuICAgIHJldHVybiByO1xuICB9XG5cbiAgLy8gMU0gKyAyUyArIDFBICsgTiAqICg0UyArIDVNICsgOEEpXG4gIC8vIE4gPSAxID0+IDZNICsgNlMgKyA5QVxuICB2YXIgYSA9IHRoaXMuY3VydmUuYTtcbiAgdmFyIHRpbnYgPSB0aGlzLmN1cnZlLnRpbnY7XG5cbiAgdmFyIGp4ID0gdGhpcy54O1xuICB2YXIgankgPSB0aGlzLnk7XG4gIHZhciBqeiA9IHRoaXMuejtcbiAgdmFyIGp6NCA9IGp6LnJlZFNxcigpLnJlZFNxcigpO1xuXG4gIC8vIFJldXNlIHJlc3VsdHNcbiAgdmFyIGp5ZCA9IGp5LnJlZEFkZChqeSk7XG4gIGZvciAoaSA9IDA7IGkgPCBwb3c7IGkrKykge1xuICAgIHZhciBqeDIgPSBqeC5yZWRTcXIoKTtcbiAgICB2YXIganlkMiA9IGp5ZC5yZWRTcXIoKTtcbiAgICB2YXIganlkNCA9IGp5ZDIucmVkU3FyKCk7XG4gICAgdmFyIGMgPSBqeDIucmVkQWRkKGp4MikucmVkSUFkZChqeDIpLnJlZElBZGQoYS5yZWRNdWwoano0KSk7XG5cbiAgICB2YXIgdDEgPSBqeC5yZWRNdWwoanlkMik7XG4gICAgdmFyIG54ID0gYy5yZWRTcXIoKS5yZWRJU3ViKHQxLnJlZEFkZCh0MSkpO1xuICAgIHZhciB0MiA9IHQxLnJlZElTdWIobngpO1xuICAgIHZhciBkbnkgPSBjLnJlZE11bCh0Mik7XG4gICAgZG55ID0gZG55LnJlZElBZGQoZG55KS5yZWRJU3ViKGp5ZDQpO1xuICAgIHZhciBueiA9IGp5ZC5yZWRNdWwoanopO1xuICAgIGlmIChpICsgMSA8IHBvdylcbiAgICAgIGp6NCA9IGp6NC5yZWRNdWwoanlkNCk7XG5cbiAgICBqeCA9IG54O1xuICAgIGp6ID0gbno7XG4gICAganlkID0gZG55O1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KGp4LCBqeWQucmVkTXVsKHRpbnYpLCBqeik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIGlmICh0aGlzLmN1cnZlLnplcm9BKVxuICAgIHJldHVybiB0aGlzLl96ZXJvRGJsKCk7XG4gIGVsc2UgaWYgKHRoaXMuY3VydmUudGhyZWVBKVxuICAgIHJldHVybiB0aGlzLl90aHJlZURibCgpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuX2RibCgpO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5femVyb0RibCA9IGZ1bmN0aW9uIF96ZXJvRGJsKCkge1xuICB2YXIgbng7XG4gIHZhciBueTtcbiAgdmFyIG56O1xuICAvLyBaID0gMVxuICBpZiAodGhpcy56T25lKSB7XG4gICAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0wLmh0bWxcbiAgICAvLyAgICAgI2RvdWJsaW5nLW1kYmwtMjAwNy1ibFxuICAgIC8vIDFNICsgNVMgKyAxNEFcblxuICAgIC8vIFhYID0gWDFeMlxuICAgIHZhciB4eCA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBZWSA9IFkxXjJcbiAgICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gICAgLy8gWVlZWSA9IFlZXjJcbiAgICB2YXIgeXl5eSA9IHl5LnJlZFNxcigpO1xuICAgIC8vIFMgPSAyICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKVxuICAgIHZhciBzID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgICBzID0gcy5yZWRJQWRkKHMpO1xuICAgIC8vIE0gPSAzICogWFggKyBhOyBhID0gMFxuICAgIHZhciBtID0geHgucmVkQWRkKHh4KS5yZWRJQWRkKHh4KTtcbiAgICAvLyBUID0gTSBeIDIgLSAyKlNcbiAgICB2YXIgdCA9IG0ucmVkU3FyKCkucmVkSVN1YihzKS5yZWRJU3ViKHMpO1xuXG4gICAgLy8gOCAqIFlZWVlcbiAgICB2YXIgeXl5eTggPSB5eXl5LnJlZElBZGQoeXl5eSk7XG4gICAgeXl5eTggPSB5eXl5OC5yZWRJQWRkKHl5eXk4KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuXG4gICAgLy8gWDMgPSBUXG4gICAgbnggPSB0O1xuICAgIC8vIFkzID0gTSAqIChTIC0gVCkgLSA4ICogWVlZWVxuICAgIG55ID0gbS5yZWRNdWwocy5yZWRJU3ViKHQpKS5yZWRJU3ViKHl5eXk4KTtcbiAgICAvLyBaMyA9IDIqWTFcbiAgICBueiA9IHRoaXMueS5yZWRBZGQodGhpcy55KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbFxuICAgIC8vICAgICAjZG91YmxpbmctZGJsLTIwMDktbFxuICAgIC8vIDJNICsgNVMgKyAxM0FcblxuICAgIC8vIEEgPSBYMV4yXG4gICAgdmFyIGEgPSB0aGlzLngucmVkU3FyKCk7XG4gICAgLy8gQiA9IFkxXjJcbiAgICB2YXIgYiA9IHRoaXMueS5yZWRTcXIoKTtcbiAgICAvLyBDID0gQl4yXG4gICAgdmFyIGMgPSBiLnJlZFNxcigpO1xuICAgIC8vIEQgPSAyICogKChYMSArIEIpXjIgLSBBIC0gQylcbiAgICB2YXIgZCA9IHRoaXMueC5yZWRBZGQoYikucmVkU3FyKCkucmVkSVN1YihhKS5yZWRJU3ViKGMpO1xuICAgIGQgPSBkLnJlZElBZGQoZCk7XG4gICAgLy8gRSA9IDMgKiBBXG4gICAgdmFyIGUgPSBhLnJlZEFkZChhKS5yZWRJQWRkKGEpO1xuICAgIC8vIEYgPSBFXjJcbiAgICB2YXIgZiA9IGUucmVkU3FyKCk7XG5cbiAgICAvLyA4ICogQ1xuICAgIHZhciBjOCA9IGMucmVkSUFkZChjKTtcbiAgICBjOCA9IGM4LnJlZElBZGQoYzgpO1xuICAgIGM4ID0gYzgucmVkSUFkZChjOCk7XG5cbiAgICAvLyBYMyA9IEYgLSAyICogRFxuICAgIG54ID0gZi5yZWRJU3ViKGQpLnJlZElTdWIoZCk7XG4gICAgLy8gWTMgPSBFICogKEQgLSBYMykgLSA4ICogQ1xuICAgIG55ID0gZS5yZWRNdWwoZC5yZWRJU3ViKG54KSkucmVkSVN1YihjOCk7XG4gICAgLy8gWjMgPSAyICogWTEgKiBaMVxuICAgIG56ID0gdGhpcy55LnJlZE11bCh0aGlzLnopO1xuICAgIG56ID0gbnoucmVkSUFkZChueik7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl90aHJlZURibCA9IGZ1bmN0aW9uIF90aHJlZURibCgpIHtcbiAgdmFyIG54O1xuICB2YXIgbnk7XG4gIHZhciBuejtcbiAgLy8gWiA9IDFcbiAgaWYgKHRoaXMuek9uZSkge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMy5odG1sXG4gICAgLy8gICAgICNkb3VibGluZy1tZGJsLTIwMDctYmxcbiAgICAvLyAxTSArIDVTICsgMTVBXG5cbiAgICAvLyBYWCA9IFgxXjJcbiAgICB2YXIgeHggPSB0aGlzLngucmVkU3FyKCk7XG4gICAgLy8gWVkgPSBZMV4yXG4gICAgdmFyIHl5ID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIFlZWVkgPSBZWV4yXG4gICAgdmFyIHl5eXkgPSB5eS5yZWRTcXIoKTtcbiAgICAvLyBTID0gMiAqICgoWDEgKyBZWSleMiAtIFhYIC0gWVlZWSlcbiAgICB2YXIgcyA9IHRoaXMueC5yZWRBZGQoeXkpLnJlZFNxcigpLnJlZElTdWIoeHgpLnJlZElTdWIoeXl5eSk7XG4gICAgcyA9IHMucmVkSUFkZChzKTtcbiAgICAvLyBNID0gMyAqIFhYICsgYVxuICAgIHZhciBtID0geHgucmVkQWRkKHh4KS5yZWRJQWRkKHh4KS5yZWRJQWRkKHRoaXMuY3VydmUuYSk7XG4gICAgLy8gVCA9IE1eMiAtIDIgKiBTXG4gICAgdmFyIHQgPSBtLnJlZFNxcigpLnJlZElTdWIocykucmVkSVN1YihzKTtcbiAgICAvLyBYMyA9IFRcbiAgICBueCA9IHQ7XG4gICAgLy8gWTMgPSBNICogKFMgLSBUKSAtIDggKiBZWVlZXG4gICAgdmFyIHl5eXk4ID0geXl5eS5yZWRJQWRkKHl5eXkpO1xuICAgIHl5eXk4ID0geXl5eTgucmVkSUFkZCh5eXl5OCk7XG4gICAgeXl5eTggPSB5eXl5OC5yZWRJQWRkKHl5eXk4KTtcbiAgICBueSA9IG0ucmVkTXVsKHMucmVkSVN1Yih0KSkucmVkSVN1Yih5eXl5OCk7XG4gICAgLy8gWjMgPSAyICogWTFcbiAgICBueiA9IHRoaXMueS5yZWRBZGQodGhpcy55KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTMuaHRtbCNkb3VibGluZy1kYmwtMjAwMS1iXG4gICAgLy8gM00gKyA1U1xuXG4gICAgLy8gZGVsdGEgPSBaMV4yXG4gICAgdmFyIGRlbHRhID0gdGhpcy56LnJlZFNxcigpO1xuICAgIC8vIGdhbW1hID0gWTFeMlxuICAgIHZhciBnYW1tYSA9IHRoaXMueS5yZWRTcXIoKTtcbiAgICAvLyBiZXRhID0gWDEgKiBnYW1tYVxuICAgIHZhciBiZXRhID0gdGhpcy54LnJlZE11bChnYW1tYSk7XG4gICAgLy8gYWxwaGEgPSAzICogKFgxIC0gZGVsdGEpICogKFgxICsgZGVsdGEpXG4gICAgdmFyIGFscGhhID0gdGhpcy54LnJlZFN1YihkZWx0YSkucmVkTXVsKHRoaXMueC5yZWRBZGQoZGVsdGEpKTtcbiAgICBhbHBoYSA9IGFscGhhLnJlZEFkZChhbHBoYSkucmVkSUFkZChhbHBoYSk7XG4gICAgLy8gWDMgPSBhbHBoYV4yIC0gOCAqIGJldGFcbiAgICB2YXIgYmV0YTQgPSBiZXRhLnJlZElBZGQoYmV0YSk7XG4gICAgYmV0YTQgPSBiZXRhNC5yZWRJQWRkKGJldGE0KTtcbiAgICB2YXIgYmV0YTggPSBiZXRhNC5yZWRBZGQoYmV0YTQpO1xuICAgIG54ID0gYWxwaGEucmVkU3FyKCkucmVkSVN1YihiZXRhOCk7XG4gICAgLy8gWjMgPSAoWTEgKyBaMSleMiAtIGdhbW1hIC0gZGVsdGFcbiAgICBueiA9IHRoaXMueS5yZWRBZGQodGhpcy56KS5yZWRTcXIoKS5yZWRJU3ViKGdhbW1hKS5yZWRJU3ViKGRlbHRhKTtcbiAgICAvLyBZMyA9IGFscGhhICogKDQgKiBiZXRhIC0gWDMpIC0gOCAqIGdhbW1hXjJcbiAgICB2YXIgZ2dhbW1hOCA9IGdhbW1hLnJlZFNxcigpO1xuICAgIGdnYW1tYTggPSBnZ2FtbWE4LnJlZElBZGQoZ2dhbW1hOCk7XG4gICAgZ2dhbW1hOCA9IGdnYW1tYTgucmVkSUFkZChnZ2FtbWE4KTtcbiAgICBnZ2FtbWE4ID0gZ2dhbW1hOC5yZWRJQWRkKGdnYW1tYTgpO1xuICAgIG55ID0gYWxwaGEucmVkTXVsKGJldGE0LnJlZElTdWIobngpKS5yZWRJU3ViKGdnYW1tYTgpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5fZGJsID0gZnVuY3Rpb24gX2RibCgpIHtcbiAgdmFyIGEgPSB0aGlzLmN1cnZlLmE7XG5cbiAgLy8gNE0gKyA2UyArIDEwQVxuICB2YXIganggPSB0aGlzLng7XG4gIHZhciBqeSA9IHRoaXMueTtcbiAgdmFyIGp6ID0gdGhpcy56O1xuICB2YXIgano0ID0ganoucmVkU3FyKCkucmVkU3FyKCk7XG5cbiAgdmFyIGp4MiA9IGp4LnJlZFNxcigpO1xuICB2YXIgankyID0gankucmVkU3FyKCk7XG5cbiAgdmFyIGMgPSBqeDIucmVkQWRkKGp4MikucmVkSUFkZChqeDIpLnJlZElBZGQoYS5yZWRNdWwoano0KSk7XG5cbiAgdmFyIGp4ZDQgPSBqeC5yZWRBZGQoangpO1xuICBqeGQ0ID0ganhkNC5yZWRJQWRkKGp4ZDQpO1xuICB2YXIgdDEgPSBqeGQ0LnJlZE11bChqeTIpO1xuICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodDEucmVkQWRkKHQxKSk7XG4gIHZhciB0MiA9IHQxLnJlZElTdWIobngpO1xuXG4gIHZhciBqeWQ4ID0gankyLnJlZFNxcigpO1xuICBqeWQ4ID0ganlkOC5yZWRJQWRkKGp5ZDgpO1xuICBqeWQ4ID0ganlkOC5yZWRJQWRkKGp5ZDgpO1xuICBqeWQ4ID0ganlkOC5yZWRJQWRkKGp5ZDgpO1xuICB2YXIgbnkgPSBjLnJlZE11bCh0MikucmVkSVN1YihqeWQ4KTtcbiAgdmFyIG56ID0gankucmVkQWRkKGp5KS5yZWRNdWwoanopO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUudHJwbCA9IGZ1bmN0aW9uIHRycGwoKSB7XG4gIGlmICghdGhpcy5jdXJ2ZS56ZXJvQSlcbiAgICByZXR1cm4gdGhpcy5kYmwoKS5hZGQodGhpcyk7XG5cbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0wLmh0bWwjdHJpcGxpbmctdHBsLTIwMDctYmxcbiAgLy8gNU0gKyAxMFMgKyAuLi5cblxuICAvLyBYWCA9IFgxXjJcbiAgdmFyIHh4ID0gdGhpcy54LnJlZFNxcigpO1xuICAvLyBZWSA9IFkxXjJcbiAgdmFyIHl5ID0gdGhpcy55LnJlZFNxcigpO1xuICAvLyBaWiA9IFoxXjJcbiAgdmFyIHp6ID0gdGhpcy56LnJlZFNxcigpO1xuICAvLyBZWVlZID0gWVleMlxuICB2YXIgeXl5eSA9IHl5LnJlZFNxcigpO1xuICAvLyBNID0gMyAqIFhYICsgYSAqIFpaMjsgYSA9IDBcbiAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpO1xuICAvLyBNTSA9IE1eMlxuICB2YXIgbW0gPSBtLnJlZFNxcigpO1xuICAvLyBFID0gNiAqICgoWDEgKyBZWSleMiAtIFhYIC0gWVlZWSkgLSBNTVxuICB2YXIgZSA9IHRoaXMueC5yZWRBZGQoeXkpLnJlZFNxcigpLnJlZElTdWIoeHgpLnJlZElTdWIoeXl5eSk7XG4gIGUgPSBlLnJlZElBZGQoZSk7XG4gIGUgPSBlLnJlZEFkZChlKS5yZWRJQWRkKGUpO1xuICBlID0gZS5yZWRJU3ViKG1tKTtcbiAgLy8gRUUgPSBFXjJcbiAgdmFyIGVlID0gZS5yZWRTcXIoKTtcbiAgLy8gVCA9IDE2KllZWVlcbiAgdmFyIHQgPSB5eXl5LnJlZElBZGQoeXl5eSk7XG4gIHQgPSB0LnJlZElBZGQodCk7XG4gIHQgPSB0LnJlZElBZGQodCk7XG4gIHQgPSB0LnJlZElBZGQodCk7XG4gIC8vIFUgPSAoTSArIEUpXjIgLSBNTSAtIEVFIC0gVFxuICB2YXIgdSA9IG0ucmVkSUFkZChlKS5yZWRTcXIoKS5yZWRJU3ViKG1tKS5yZWRJU3ViKGVlKS5yZWRJU3ViKHQpO1xuICAvLyBYMyA9IDQgKiAoWDEgKiBFRSAtIDQgKiBZWSAqIFUpXG4gIHZhciB5eXU0ID0geXkucmVkTXVsKHUpO1xuICB5eXU0ID0geXl1NC5yZWRJQWRkKHl5dTQpO1xuICB5eXU0ID0geXl1NC5yZWRJQWRkKHl5dTQpO1xuICB2YXIgbnggPSB0aGlzLngucmVkTXVsKGVlKS5yZWRJU3ViKHl5dTQpO1xuICBueCA9IG54LnJlZElBZGQobngpO1xuICBueCA9IG54LnJlZElBZGQobngpO1xuICAvLyBZMyA9IDggKiBZMSAqIChVICogKFQgLSBVKSAtIEUgKiBFRSlcbiAgdmFyIG55ID0gdGhpcy55LnJlZE11bCh1LnJlZE11bCh0LnJlZElTdWIodSkpLnJlZElTdWIoZS5yZWRNdWwoZWUpKSk7XG4gIG55ID0gbnkucmVkSUFkZChueSk7XG4gIG55ID0gbnkucmVkSUFkZChueSk7XG4gIG55ID0gbnkucmVkSUFkZChueSk7XG4gIC8vIFozID0gKFoxICsgRSleMiAtIFpaIC0gRUVcbiAgdmFyIG56ID0gdGhpcy56LnJlZEFkZChlKS5yZWRTcXIoKS5yZWRJU3ViKHp6KS5yZWRJU3ViKGVlKTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrLCBrYmFzZSkge1xuICBrID0gbmV3IEJOKGssIGtiYXNlKTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bCh0aGlzLCBrKTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShwKSB7XG4gIGlmIChwLnR5cGUgPT09ICdhZmZpbmUnKVxuICAgIHJldHVybiB0aGlzLmVxKHAudG9KKCkpO1xuXG4gIGlmICh0aGlzID09PSBwKVxuICAgIHJldHVybiB0cnVlO1xuXG4gIC8vIHgxICogejJeMiA9PSB4MiAqIHoxXjJcbiAgdmFyIHoyID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgcHoyID0gcC56LnJlZFNxcigpO1xuICBpZiAodGhpcy54LnJlZE11bChwejIpLnJlZElTdWIocC54LnJlZE11bCh6MikpLmNtcG4oMCkgIT09IDApXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIHkxICogejJeMyA9PSB5MiAqIHoxXjNcbiAgdmFyIHozID0gejIucmVkTXVsKHRoaXMueik7XG4gIHZhciBwejMgPSBwejIucmVkTXVsKHAueik7XG4gIHJldHVybiB0aGlzLnkucmVkTXVsKHB6MykucmVkSVN1YihwLnkucmVkTXVsKHozKSkuY21wbigwKSA9PT0gMDtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZXFYVG9QID0gZnVuY3Rpb24gZXFYVG9QKHgpIHtcbiAgdmFyIHpzID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgcnggPSB4LnRvUmVkKHRoaXMuY3VydmUucmVkKS5yZWRNdWwoenMpO1xuICBpZiAodGhpcy54LmNtcChyeCkgPT09IDApXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgdmFyIHhjID0geC5jbG9uZSgpO1xuICB2YXIgdCA9IHRoaXMuY3VydmUucmVkTi5yZWRNdWwoenMpO1xuICBmb3IgKDs7KSB7XG4gICAgeGMuaWFkZCh0aGlzLmN1cnZlLm4pO1xuICAgIGlmICh4Yy5jbXAodGhpcy5jdXJ2ZS5wKSA+PSAwKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgcngucmVkSUFkZCh0KTtcbiAgICBpZiAodGhpcy54LmNtcChyeCkgPT09IDApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuSlBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIEpQb2ludCBJbmZpbml0eT4nO1xuICByZXR1cm4gJzxFQyBKUG9pbnQgeDogJyArIHRoaXMueC50b1N0cmluZygxNiwgMikgK1xuICAgICAgJyB5OiAnICsgdGhpcy55LnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHo6ICcgKyB0aGlzLnoudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgLy8gWFhYIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgemVybyBpcyBhbHdheXMgemVybyBpbiByZWRcbiAgcmV0dXJuIHRoaXMuei5jbXBuKDApID09PSAwO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbnZhciBCYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIE1vbnRDdXJ2ZShjb25mKSB7XG4gIEJhc2UuY2FsbCh0aGlzLCAnbW9udCcsIGNvbmYpO1xuXG4gIHRoaXMuYSA9IG5ldyBCTihjb25mLmEsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYiA9IG5ldyBCTihjb25mLmIsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuaTQgPSBuZXcgQk4oNCkudG9SZWQodGhpcy5yZWQpLnJlZEludm0oKTtcbiAgdGhpcy50d28gPSBuZXcgQk4oMikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmEyNCA9IHRoaXMuaTQucmVkTXVsKHRoaXMuYS5yZWRBZGQodGhpcy50d28pKTtcbn1cbmluaGVyaXRzKE1vbnRDdXJ2ZSwgQmFzZSk7XG5tb2R1bGUuZXhwb3J0cyA9IE1vbnRDdXJ2ZTtcblxuTW9udEN1cnZlLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHBvaW50KSB7XG4gIHZhciB4ID0gcG9pbnQubm9ybWFsaXplKCkueDtcbiAgdmFyIHgyID0geC5yZWRTcXIoKTtcbiAgdmFyIHJocyA9IHgyLnJlZE11bCh4KS5yZWRBZGQoeDIucmVkTXVsKHRoaXMuYSkpLnJlZEFkZCh4KTtcbiAgdmFyIHkgPSByaHMucmVkU3FydCgpO1xuXG4gIHJldHVybiB5LnJlZFNxcigpLmNtcChyaHMpID09PSAwO1xufTtcblxuZnVuY3Rpb24gUG9pbnQoY3VydmUsIHgsIHopIHtcbiAgQmFzZS5CYXNlUG9pbnQuY2FsbCh0aGlzLCBjdXJ2ZSwgJ3Byb2plY3RpdmUnKTtcbiAgaWYgKHggPT09IG51bGwgJiYgeiA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHRoaXMuY3VydmUub25lO1xuICAgIHRoaXMueiA9IHRoaXMuY3VydmUuemVybztcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSBuZXcgQk4oeCwgMTYpO1xuICAgIHRoaXMueiA9IG5ldyBCTih6LCAxNik7XG4gICAgaWYgKCF0aGlzLngucmVkKVxuICAgICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMuei5yZWQpXG4gICAgICB0aGlzLnogPSB0aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICB9XG59XG5pbmhlcml0cyhQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5Nb250Q3VydmUucHJvdG90eXBlLmRlY29kZVBvaW50ID0gZnVuY3Rpb24gZGVjb2RlUG9pbnQoYnl0ZXMsIGVuYykge1xuICByZXR1cm4gdGhpcy5wb2ludCh1dGlscy50b0FycmF5KGJ5dGVzLCBlbmMpLCAxKTtcbn07XG5cbk1vbnRDdXJ2ZS5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbiBwb2ludCh4LCB6KSB7XG4gIHJldHVybiBuZXcgUG9pbnQodGhpcywgeCwgeik7XG59O1xuXG5Nb250Q3VydmUucHJvdG90eXBlLnBvaW50RnJvbUpTT04gPSBmdW5jdGlvbiBwb2ludEZyb21KU09OKG9iaikge1xuICByZXR1cm4gUG9pbnQuZnJvbUpTT04odGhpcywgb2JqKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5wcmVjb21wdXRlID0gZnVuY3Rpb24gcHJlY29tcHV0ZSgpIHtcbiAgLy8gTm8tb3Bcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZW5jb2RlID0gZnVuY3Rpb24gX2VuY29kZSgpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0WCgpLnRvQXJyYXkoJ2JlJywgdGhpcy5jdXJ2ZS5wLmJ5dGVMZW5ndGgoKSk7XG59O1xuXG5Qb2ludC5mcm9tSlNPTiA9IGZ1bmN0aW9uIGZyb21KU09OKGN1cnZlLCBvYmopIHtcbiAgcmV0dXJuIG5ldyBQb2ludChjdXJ2ZSwgb2JqWzBdLCBvYmpbMV0gfHwgY3VydmUub25lKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHo6ICcgKyB0aGlzLnouZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgLy8gWFhYIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgemVybyBpcyBhbHdheXMgemVybyBpbiByZWRcbiAgcmV0dXJuIHRoaXMuei5jbXBuKDApID09PSAwO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgLy8gaHR0cDovL2h5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1tb250Z29tLXh6Lmh0bWwjZG91YmxpbmctZGJsLTE5ODctbS0zXG4gIC8vIDJNICsgMlMgKyA0QVxuXG4gIC8vIEEgPSBYMSArIFoxXG4gIHZhciBhID0gdGhpcy54LnJlZEFkZCh0aGlzLnopO1xuICAvLyBBQSA9IEFeMlxuICB2YXIgYWEgPSBhLnJlZFNxcigpO1xuICAvLyBCID0gWDEgLSBaMVxuICB2YXIgYiA9IHRoaXMueC5yZWRTdWIodGhpcy56KTtcbiAgLy8gQkIgPSBCXjJcbiAgdmFyIGJiID0gYi5yZWRTcXIoKTtcbiAgLy8gQyA9IEFBIC0gQkJcbiAgdmFyIGMgPSBhYS5yZWRTdWIoYmIpO1xuICAvLyBYMyA9IEFBICogQkJcbiAgdmFyIG54ID0gYWEucmVkTXVsKGJiKTtcbiAgLy8gWjMgPSBDICogKEJCICsgQTI0ICogQylcbiAgdmFyIG56ID0gYy5yZWRNdWwoYmIucmVkQWRkKHRoaXMuY3VydmUuYTI0LnJlZE11bChjKSkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUnKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kaWZmQWRkID0gZnVuY3Rpb24gZGlmZkFkZChwLCBkaWZmKSB7XG4gIC8vIGh0dHA6Ly9oeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tbW9udGdvbS14ei5odG1sI2RpZmZhZGQtZGFkZC0xOTg3LW0tM1xuICAvLyA0TSArIDJTICsgNkFcblxuICAvLyBBID0gWDIgKyBaMlxuICB2YXIgYSA9IHRoaXMueC5yZWRBZGQodGhpcy56KTtcbiAgLy8gQiA9IFgyIC0gWjJcbiAgdmFyIGIgPSB0aGlzLngucmVkU3ViKHRoaXMueik7XG4gIC8vIEMgPSBYMyArIFozXG4gIHZhciBjID0gcC54LnJlZEFkZChwLnopO1xuICAvLyBEID0gWDMgLSBaM1xuICB2YXIgZCA9IHAueC5yZWRTdWIocC56KTtcbiAgLy8gREEgPSBEICogQVxuICB2YXIgZGEgPSBkLnJlZE11bChhKTtcbiAgLy8gQ0IgPSBDICogQlxuICB2YXIgY2IgPSBjLnJlZE11bChiKTtcbiAgLy8gWDUgPSBaMSAqIChEQSArIENCKV4yXG4gIHZhciBueCA9IGRpZmYuei5yZWRNdWwoZGEucmVkQWRkKGNiKS5yZWRTcXIoKSk7XG4gIC8vIFo1ID0gWDEgKiAoREEgLSBDQileMlxuICB2YXIgbnogPSBkaWZmLngucmVkTXVsKGRhLnJlZElTdWIoY2IpLnJlZFNxcigpKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG56KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwoaykge1xuICB2YXIgdCA9IGsuY2xvbmUoKTtcbiAgdmFyIGEgPSB0aGlzOyAvLyAoTiAvIDIpICogUSArIFFcbiAgdmFyIGIgPSB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpOyAvLyAoTiAvIDIpICogUVxuICB2YXIgYyA9IHRoaXM7IC8vIFFcblxuICBmb3IgKHZhciBiaXRzID0gW107IHQuY21wbigwKSAhPT0gMDsgdC5pdXNocm4oMSkpXG4gICAgYml0cy5wdXNoKHQuYW5kbG4oMSkpO1xuXG4gIGZvciAodmFyIGkgPSBiaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGJpdHNbaV0gPT09IDApIHtcbiAgICAgIC8vIE4gKiBRICsgUSA9ICgoTiAvIDIpICogUSArIFEpKSArIChOIC8gMikgKiBRXG4gICAgICBhID0gYS5kaWZmQWRkKGIsIGMpO1xuICAgICAgLy8gTiAqIFEgPSAyICogKChOIC8gMikgKiBRICsgUSkpXG4gICAgICBiID0gYi5kYmwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTiAqIFEgPSAoKE4gLyAyKSAqIFEgKyBRKSArICgoTiAvIDIpICogUSlcbiAgICAgIGIgPSBhLmRpZmZBZGQoYiwgYyk7XG4gICAgICAvLyBOICogUSArIFEgPSAyICogKChOIC8gMikgKiBRICsgUSlcbiAgICAgIGEgPSBhLmRibCgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYjtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWxBZGQgPSBmdW5jdGlvbiBtdWxBZGQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlJyk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuanVtbEFkZCA9IGZ1bmN0aW9uIGp1bWxBZGQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlJyk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShvdGhlcikge1xuICByZXR1cm4gdGhpcy5nZXRYKCkuY21wKG90aGVyLmdldFgoKSkgPT09IDA7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKCkge1xuICB0aGlzLnggPSB0aGlzLngucmVkTXVsKHRoaXMuei5yZWRJbnZtKCkpO1xuICB0aGlzLnogPSB0aGlzLmN1cnZlLm9uZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uIGdldFgoKSB7XG4gIC8vIE5vcm1hbGl6ZSBjb29yZGluYXRlc1xuICB0aGlzLm5vcm1hbGl6ZSgpO1xuXG4gIHJldHVybiB0aGlzLnguZnJvbVJlZCgpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xuXG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBFZHdhcmRzQ3VydmUoY29uZikge1xuICAvLyBOT1RFOiBJbXBvcnRhbnQgYXMgd2UgYXJlIGNyZWF0aW5nIHBvaW50IGluIEJhc2UuY2FsbCgpXG4gIHRoaXMudHdpc3RlZCA9IChjb25mLmEgfCAwKSAhPT0gMTtcbiAgdGhpcy5tT25lQSA9IHRoaXMudHdpc3RlZCAmJiAoY29uZi5hIHwgMCkgPT09IC0xO1xuICB0aGlzLmV4dGVuZGVkID0gdGhpcy5tT25lQTtcblxuICBCYXNlLmNhbGwodGhpcywgJ2Vkd2FyZHMnLCBjb25mKTtcblxuICB0aGlzLmEgPSBuZXcgQk4oY29uZi5hLCAxNikudW1vZCh0aGlzLnJlZC5tKTtcbiAgdGhpcy5hID0gdGhpcy5hLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5jID0gbmV3IEJOKGNvbmYuYywgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5jMiA9IHRoaXMuYy5yZWRTcXIoKTtcbiAgdGhpcy5kID0gbmV3IEJOKGNvbmYuZCwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5kZCA9IHRoaXMuZC5yZWRBZGQodGhpcy5kKTtcblxuICBhc3NlcnQoIXRoaXMudHdpc3RlZCB8fCB0aGlzLmMuZnJvbVJlZCgpLmNtcG4oMSkgPT09IDApO1xuICB0aGlzLm9uZUMgPSAoY29uZi5jIHwgMCkgPT09IDE7XG59XG5pbmhlcml0cyhFZHdhcmRzQ3VydmUsIEJhc2UpO1xubW9kdWxlLmV4cG9ydHMgPSBFZHdhcmRzQ3VydmU7XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuX211bEEgPSBmdW5jdGlvbiBfbXVsQShudW0pIHtcbiAgaWYgKHRoaXMubU9uZUEpXG4gICAgcmV0dXJuIG51bS5yZWROZWcoKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmEucmVkTXVsKG51bSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLl9tdWxDID0gZnVuY3Rpb24gX211bEMobnVtKSB7XG4gIGlmICh0aGlzLm9uZUMpXG4gICAgcmV0dXJuIG51bTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmMucmVkTXVsKG51bSk7XG59O1xuXG4vLyBKdXN0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggU2hvcnQgY3VydmVcbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuanBvaW50ID0gZnVuY3Rpb24ganBvaW50KHgsIHksIHosIHQpIHtcbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSwgeiwgdCk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50RnJvbVggPSBmdW5jdGlvbiBwb2ludEZyb21YKHgsIG9kZCkge1xuICB4ID0gbmV3IEJOKHgsIDE2KTtcbiAgaWYgKCF4LnJlZClcbiAgICB4ID0geC50b1JlZCh0aGlzLnJlZCk7XG5cbiAgdmFyIHgyID0geC5yZWRTcXIoKTtcbiAgdmFyIHJocyA9IHRoaXMuYzIucmVkU3ViKHRoaXMuYS5yZWRNdWwoeDIpKTtcbiAgdmFyIGxocyA9IHRoaXMub25lLnJlZFN1Yih0aGlzLmMyLnJlZE11bCh0aGlzLmQpLnJlZE11bCh4MikpO1xuXG4gIHZhciB5MiA9IHJocy5yZWRNdWwobGhzLnJlZEludm0oKSk7XG4gIHZhciB5ID0geTIucmVkU3FydCgpO1xuICBpZiAoeS5yZWRTcXIoKS5yZWRTdWIoeTIpLmNtcCh0aGlzLnplcm8pICE9PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuXG4gIHZhciBpc09kZCA9IHkuZnJvbVJlZCgpLmlzT2RkKCk7XG4gIGlmIChvZGQgJiYgIWlzT2RkIHx8ICFvZGQgJiYgaXNPZGQpXG4gICAgeSA9IHkucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50RnJvbVkgPSBmdW5jdGlvbiBwb2ludEZyb21ZKHksIG9kZCkge1xuICB5ID0gbmV3IEJOKHksIDE2KTtcbiAgaWYgKCF5LnJlZClcbiAgICB5ID0geS50b1JlZCh0aGlzLnJlZCk7XG5cbiAgLy8geF4yID0gKHleMiAtIGNeMikgLyAoY14yIGQgeV4yIC0gYSlcbiAgdmFyIHkyID0geS5yZWRTcXIoKTtcbiAgdmFyIGxocyA9IHkyLnJlZFN1Yih0aGlzLmMyKTtcbiAgdmFyIHJocyA9IHkyLnJlZE11bCh0aGlzLmQpLnJlZE11bCh0aGlzLmMyKS5yZWRTdWIodGhpcy5hKTtcbiAgdmFyIHgyID0gbGhzLnJlZE11bChyaHMucmVkSW52bSgpKTtcblxuICBpZiAoeDIuY21wKHRoaXMuemVybykgPT09IDApIHtcbiAgICBpZiAob2RkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBvaW50Jyk7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHRoaXMucG9pbnQodGhpcy56ZXJvLCB5KTtcbiAgfVxuXG4gIHZhciB4ID0geDIucmVkU3FydCgpO1xuICBpZiAoeC5yZWRTcXIoKS5yZWRTdWIoeDIpLmNtcCh0aGlzLnplcm8pICE9PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuXG4gIGlmICh4LmZyb21SZWQoKS5pc09kZCgpICE9PSBvZGQpXG4gICAgeCA9IHgucmVkTmVnKCk7XG5cbiAgcmV0dXJuIHRoaXMucG9pbnQoeCwgeSk7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpIHtcbiAgaWYgKHBvaW50LmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdHJ1ZTtcblxuICAvLyBDdXJ2ZTogQSAqIFheMiArIFleMiA9IENeMiAqICgxICsgRCAqIFheMiAqIFleMilcbiAgcG9pbnQubm9ybWFsaXplKCk7XG5cbiAgdmFyIHgyID0gcG9pbnQueC5yZWRTcXIoKTtcbiAgdmFyIHkyID0gcG9pbnQueS5yZWRTcXIoKTtcbiAgdmFyIGxocyA9IHgyLnJlZE11bCh0aGlzLmEpLnJlZEFkZCh5Mik7XG4gIHZhciByaHMgPSB0aGlzLmMyLnJlZE11bCh0aGlzLm9uZS5yZWRBZGQodGhpcy5kLnJlZE11bCh4MikucmVkTXVsKHkyKSkpO1xuXG4gIHJldHVybiBsaHMuY21wKHJocykgPT09IDA7XG59O1xuXG5mdW5jdGlvbiBQb2ludChjdXJ2ZSwgeCwgeSwgeiwgdCkge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAncHJvamVjdGl2ZScpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB5ID09PSBudWxsICYmIHogPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSB0aGlzLmN1cnZlLnplcm87XG4gICAgdGhpcy55ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy56ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy50ID0gdGhpcy5jdXJ2ZS56ZXJvO1xuICAgIHRoaXMuek9uZSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0gbmV3IEJOKHgsIDE2KTtcbiAgICB0aGlzLnkgPSBuZXcgQk4oeSwgMTYpO1xuICAgIHRoaXMueiA9IHogPyBuZXcgQk4oeiwgMTYpIDogdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy50ID0gdCAmJiBuZXcgQk4odCwgMTYpO1xuICAgIGlmICghdGhpcy54LnJlZClcbiAgICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKCF0aGlzLnkucmVkKVxuICAgICAgdGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMuei5yZWQpXG4gICAgICB0aGlzLnogPSB0aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICh0aGlzLnQgJiYgIXRoaXMudC5yZWQpXG4gICAgICB0aGlzLnQgPSB0aGlzLnQudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIHRoaXMuek9uZSA9IHRoaXMueiA9PT0gdGhpcy5jdXJ2ZS5vbmU7XG5cbiAgICAvLyBVc2UgZXh0ZW5kZWQgY29vcmRpbmF0ZXNcbiAgICBpZiAodGhpcy5jdXJ2ZS5leHRlbmRlZCAmJiAhdGhpcy50KSB7XG4gICAgICB0aGlzLnQgPSB0aGlzLngucmVkTXVsKHRoaXMueSk7XG4gICAgICBpZiAoIXRoaXMuek9uZSlcbiAgICAgICAgdGhpcy50ID0gdGhpcy50LnJlZE11bCh0aGlzLnoucmVkSW52bSgpKTtcbiAgICB9XG4gIH1cbn1cbmluaGVyaXRzKFBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uIHBvaW50RnJvbUpTT04ob2JqKSB7XG4gIHJldHVybiBQb2ludC5mcm9tSlNPTih0aGlzLCBvYmopO1xufTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KHgsIHksIHosIHQpIHtcbiAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLCB4LCB5LCB6LCB0KTtcbn07XG5cblBvaW50LmZyb21KU09OID0gZnVuY3Rpb24gZnJvbUpTT04oY3VydmUsIG9iaikge1xuICByZXR1cm4gbmV3IFBvaW50KGN1cnZlLCBvYmpbMF0sIG9ialsxXSwgb2JqWzJdKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIFBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIFBvaW50IHg6ICcgKyB0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkuZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHo6ICcgKyB0aGlzLnouZnJvbVJlZCgpLnRvU3RyaW5nKDE2LCAyKSArICc+Jztcbn07XG5cblBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgLy8gWFhYIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgemVybyBpcyBhbHdheXMgemVybyBpbiByZWRcbiAgcmV0dXJuIHRoaXMueC5jbXBuKDApID09PSAwICYmXG4gICAgKHRoaXMueS5jbXAodGhpcy56KSA9PT0gMCB8fFxuICAgICh0aGlzLnpPbmUgJiYgdGhpcy55LmNtcCh0aGlzLmN1cnZlLmMpID09PSAwKSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuX2V4dERibCA9IGZ1bmN0aW9uIF9leHREYmwoKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLWV4dGVuZGVkLTEuaHRtbFxuICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA4LWh3Y2RcbiAgLy8gNE0gKyA0U1xuXG4gIC8vIEEgPSBYMV4yXG4gIHZhciBhID0gdGhpcy54LnJlZFNxcigpO1xuICAvLyBCID0gWTFeMlxuICB2YXIgYiA9IHRoaXMueS5yZWRTcXIoKTtcbiAgLy8gQyA9IDIgKiBaMV4yXG4gIHZhciBjID0gdGhpcy56LnJlZFNxcigpO1xuICBjID0gYy5yZWRJQWRkKGMpO1xuICAvLyBEID0gYSAqIEFcbiAgdmFyIGQgPSB0aGlzLmN1cnZlLl9tdWxBKGEpO1xuICAvLyBFID0gKFgxICsgWTEpXjIgLSBBIC0gQlxuICB2YXIgZSA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKS5yZWRJU3ViKGEpLnJlZElTdWIoYik7XG4gIC8vIEcgPSBEICsgQlxuICB2YXIgZyA9IGQucmVkQWRkKGIpO1xuICAvLyBGID0gRyAtIENcbiAgdmFyIGYgPSBnLnJlZFN1YihjKTtcbiAgLy8gSCA9IEQgLSBCXG4gIHZhciBoID0gZC5yZWRTdWIoYik7XG4gIC8vIFgzID0gRSAqIEZcbiAgdmFyIG54ID0gZS5yZWRNdWwoZik7XG4gIC8vIFkzID0gRyAqIEhcbiAgdmFyIG55ID0gZy5yZWRNdWwoaCk7XG4gIC8vIFQzID0gRSAqIEhcbiAgdmFyIG50ID0gZS5yZWRNdWwoaCk7XG4gIC8vIFozID0gRiAqIEdcbiAgdmFyIG56ID0gZi5yZWRNdWwoZyk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnosIG50KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fcHJvakRibCA9IGZ1bmN0aW9uIF9wcm9qRGJsKCkge1xuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tdHdpc3RlZC1wcm9qZWN0aXZlLmh0bWxcbiAgLy8gICAgICNkb3VibGluZy1kYmwtMjAwOC1iYmpscFxuICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA3LWJsXG4gIC8vIGFuZCBvdGhlcnNcbiAgLy8gR2VuZXJhbGx5IDNNICsgNFMgb3IgMk0gKyA0U1xuXG4gIC8vIEIgPSAoWDEgKyBZMSleMlxuICB2YXIgYiA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKTtcbiAgLy8gQyA9IFgxXjJcbiAgdmFyIGMgPSB0aGlzLngucmVkU3FyKCk7XG4gIC8vIEQgPSBZMV4yXG4gIHZhciBkID0gdGhpcy55LnJlZFNxcigpO1xuXG4gIHZhciBueDtcbiAgdmFyIG55O1xuICB2YXIgbno7XG4gIHZhciBlO1xuICB2YXIgaDtcbiAgdmFyIGo7XG4gIGlmICh0aGlzLmN1cnZlLnR3aXN0ZWQpIHtcbiAgICAvLyBFID0gYSAqIENcbiAgICBlID0gdGhpcy5jdXJ2ZS5fbXVsQShjKTtcbiAgICAvLyBGID0gRSArIERcbiAgICB2YXIgZiA9IGUucmVkQWRkKGQpO1xuICAgIGlmICh0aGlzLnpPbmUpIHtcbiAgICAgIC8vIFgzID0gKEIgLSBDIC0gRCkgKiAoRiAtIDIpXG4gICAgICBueCA9IGIucmVkU3ViKGMpLnJlZFN1YihkKS5yZWRNdWwoZi5yZWRTdWIodGhpcy5jdXJ2ZS50d28pKTtcbiAgICAgIC8vIFkzID0gRiAqIChFIC0gRClcbiAgICAgIG55ID0gZi5yZWRNdWwoZS5yZWRTdWIoZCkpO1xuICAgICAgLy8gWjMgPSBGXjIgLSAyICogRlxuICAgICAgbnogPSBmLnJlZFNxcigpLnJlZFN1YihmKS5yZWRTdWIoZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEggPSBaMV4yXG4gICAgICBoID0gdGhpcy56LnJlZFNxcigpO1xuICAgICAgLy8gSiA9IEYgLSAyICogSFxuICAgICAgaiA9IGYucmVkU3ViKGgpLnJlZElTdWIoaCk7XG4gICAgICAvLyBYMyA9IChCLUMtRCkqSlxuICAgICAgbnggPSBiLnJlZFN1YihjKS5yZWRJU3ViKGQpLnJlZE11bChqKTtcbiAgICAgIC8vIFkzID0gRiAqIChFIC0gRClcbiAgICAgIG55ID0gZi5yZWRNdWwoZS5yZWRTdWIoZCkpO1xuICAgICAgLy8gWjMgPSBGICogSlxuICAgICAgbnogPSBmLnJlZE11bChqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRSA9IEMgKyBEXG4gICAgZSA9IGMucmVkQWRkKGQpO1xuICAgIC8vIEggPSAoYyAqIFoxKV4yXG4gICAgaCA9IHRoaXMuY3VydmUuX211bEModGhpcy56KS5yZWRTcXIoKTtcbiAgICAvLyBKID0gRSAtIDIgKiBIXG4gICAgaiA9IGUucmVkU3ViKGgpLnJlZFN1YihoKTtcbiAgICAvLyBYMyA9IGMgKiAoQiAtIEUpICogSlxuICAgIG54ID0gdGhpcy5jdXJ2ZS5fbXVsQyhiLnJlZElTdWIoZSkpLnJlZE11bChqKTtcbiAgICAvLyBZMyA9IGMgKiBFICogKEMgLSBEKVxuICAgIG55ID0gdGhpcy5jdXJ2ZS5fbXVsQyhlKS5yZWRNdWwoYy5yZWRJU3ViKGQpKTtcbiAgICAvLyBaMyA9IEUgKiBKXG4gICAgbnogPSBlLnJlZE11bChqKTtcbiAgfVxuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnksIG56KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kYmwgPSBmdW5jdGlvbiBkYmwoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBEb3VibGUgaW4gZXh0ZW5kZWQgY29vcmRpbmF0ZXNcbiAgaWYgKHRoaXMuY3VydmUuZXh0ZW5kZWQpXG4gICAgcmV0dXJuIHRoaXMuX2V4dERibCgpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuX3Byb2pEYmwoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZXh0QWRkID0gZnVuY3Rpb24gX2V4dEFkZChwKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLWV4dGVuZGVkLTEuaHRtbFxuICAvLyAgICAgI2FkZGl0aW9uLWFkZC0yMDA4LWh3Y2QtM1xuICAvLyA4TVxuXG4gIC8vIEEgPSAoWTEgLSBYMSkgKiAoWTIgLSBYMilcbiAgdmFyIGEgPSB0aGlzLnkucmVkU3ViKHRoaXMueCkucmVkTXVsKHAueS5yZWRTdWIocC54KSk7XG4gIC8vIEIgPSAoWTEgKyBYMSkgKiAoWTIgKyBYMilcbiAgdmFyIGIgPSB0aGlzLnkucmVkQWRkKHRoaXMueCkucmVkTXVsKHAueS5yZWRBZGQocC54KSk7XG4gIC8vIEMgPSBUMSAqIGsgKiBUMlxuICB2YXIgYyA9IHRoaXMudC5yZWRNdWwodGhpcy5jdXJ2ZS5kZCkucmVkTXVsKHAudCk7XG4gIC8vIEQgPSBaMSAqIDIgKiBaMlxuICB2YXIgZCA9IHRoaXMuei5yZWRNdWwocC56LnJlZEFkZChwLnopKTtcbiAgLy8gRSA9IEIgLSBBXG4gIHZhciBlID0gYi5yZWRTdWIoYSk7XG4gIC8vIEYgPSBEIC0gQ1xuICB2YXIgZiA9IGQucmVkU3ViKGMpO1xuICAvLyBHID0gRCArIENcbiAgdmFyIGcgPSBkLnJlZEFkZChjKTtcbiAgLy8gSCA9IEIgKyBBXG4gIHZhciBoID0gYi5yZWRBZGQoYSk7XG4gIC8vIFgzID0gRSAqIEZcbiAgdmFyIG54ID0gZS5yZWRNdWwoZik7XG4gIC8vIFkzID0gRyAqIEhcbiAgdmFyIG55ID0gZy5yZWRNdWwoaCk7XG4gIC8vIFQzID0gRSAqIEhcbiAgdmFyIG50ID0gZS5yZWRNdWwoaCk7XG4gIC8vIFozID0gRiAqIEdcbiAgdmFyIG56ID0gZi5yZWRNdWwoZyk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnosIG50KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fcHJvakFkZCA9IGZ1bmN0aW9uIF9wcm9qQWRkKHApIHtcbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtcHJvamVjdGl2ZS5odG1sXG4gIC8vICAgICAjYWRkaXRpb24tYWRkLTIwMDgtYmJqbHBcbiAgLy8gICAgICNhZGRpdGlvbi1hZGQtMjAwNy1ibFxuICAvLyAxME0gKyAxU1xuXG4gIC8vIEEgPSBaMSAqIFoyXG4gIHZhciBhID0gdGhpcy56LnJlZE11bChwLnopO1xuICAvLyBCID0gQV4yXG4gIHZhciBiID0gYS5yZWRTcXIoKTtcbiAgLy8gQyA9IFgxICogWDJcbiAgdmFyIGMgPSB0aGlzLngucmVkTXVsKHAueCk7XG4gIC8vIEQgPSBZMSAqIFkyXG4gIHZhciBkID0gdGhpcy55LnJlZE11bChwLnkpO1xuICAvLyBFID0gZCAqIEMgKiBEXG4gIHZhciBlID0gdGhpcy5jdXJ2ZS5kLnJlZE11bChjKS5yZWRNdWwoZCk7XG4gIC8vIEYgPSBCIC0gRVxuICB2YXIgZiA9IGIucmVkU3ViKGUpO1xuICAvLyBHID0gQiArIEVcbiAgdmFyIGcgPSBiLnJlZEFkZChlKTtcbiAgLy8gWDMgPSBBICogRiAqICgoWDEgKyBZMSkgKiAoWDIgKyBZMikgLSBDIC0gRClcbiAgdmFyIHRtcCA9IHRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRNdWwocC54LnJlZEFkZChwLnkpKS5yZWRJU3ViKGMpLnJlZElTdWIoZCk7XG4gIHZhciBueCA9IGEucmVkTXVsKGYpLnJlZE11bCh0bXApO1xuICB2YXIgbnk7XG4gIHZhciBuejtcbiAgaWYgKHRoaXMuY3VydmUudHdpc3RlZCkge1xuICAgIC8vIFkzID0gQSAqIEcgKiAoRCAtIGEgKiBDKVxuICAgIG55ID0gYS5yZWRNdWwoZykucmVkTXVsKGQucmVkU3ViKHRoaXMuY3VydmUuX211bEEoYykpKTtcbiAgICAvLyBaMyA9IEYgKiBHXG4gICAgbnogPSBmLnJlZE11bChnKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBZMyA9IEEgKiBHICogKEQgLSBDKVxuICAgIG55ID0gYS5yZWRNdWwoZykucmVkTXVsKGQucmVkU3ViKGMpKTtcbiAgICAvLyBaMyA9IGMgKiBGICogR1xuICAgIG56ID0gdGhpcy5jdXJ2ZS5fbXVsQyhmKS5yZWRNdWwoZyk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55LCBueik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKHApIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBwO1xuICBpZiAocC5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgaWYgKHRoaXMuY3VydmUuZXh0ZW5kZWQpXG4gICAgcmV0dXJuIHRoaXMuX2V4dEFkZChwKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLl9wcm9qQWRkKHApO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrKSB7XG4gIGlmICh0aGlzLl9oYXNEb3VibGVzKGspKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9maXhlZE5hZk11bCh0aGlzLCBrKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uIG11bEFkZChrMSwgcCwgazIpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgWyB0aGlzLCBwIF0sIFsgazEsIGsyIF0sIDIsIGZhbHNlKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5qbXVsQWRkID0gZnVuY3Rpb24gam11bEFkZChrMSwgcCwgazIpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgWyB0aGlzLCBwIF0sIFsgazEsIGsyIF0sIDIsIHRydWUpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZSgpIHtcbiAgaWYgKHRoaXMuek9uZSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBOb3JtYWxpemUgY29vcmRpbmF0ZXNcbiAgdmFyIHppID0gdGhpcy56LnJlZEludm0oKTtcbiAgdGhpcy54ID0gdGhpcy54LnJlZE11bCh6aSk7XG4gIHRoaXMueSA9IHRoaXMueS5yZWRNdWwoemkpO1xuICBpZiAodGhpcy50KVxuICAgIHRoaXMudCA9IHRoaXMudC5yZWRNdWwoemkpO1xuICB0aGlzLnogPSB0aGlzLmN1cnZlLm9uZTtcbiAgdGhpcy56T25lID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnKCkge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngucmVkTmVnKCksXG4gICAgdGhpcy55LFxuICAgIHRoaXMueixcbiAgICB0aGlzLnQgJiYgdGhpcy50LnJlZE5lZygpKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gZ2V0WCgpIHtcbiAgdGhpcy5ub3JtYWxpemUoKTtcbiAgcmV0dXJuIHRoaXMueC5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WSA9IGZ1bmN0aW9uIGdldFkoKSB7XG4gIHRoaXMubm9ybWFsaXplKCk7XG4gIHJldHVybiB0aGlzLnkuZnJvbVJlZCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEob3RoZXIpIHtcbiAgcmV0dXJuIHRoaXMgPT09IG90aGVyIHx8XG4gICAgICAgICB0aGlzLmdldFgoKS5jbXAob3RoZXIuZ2V0WCgpKSA9PT0gMCAmJlxuICAgICAgICAgdGhpcy5nZXRZKCkuY21wKG90aGVyLmdldFkoKSkgPT09IDA7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXFYVG9QID0gZnVuY3Rpb24gZXFYVG9QKHgpIHtcbiAgdmFyIHJ4ID0geC50b1JlZCh0aGlzLmN1cnZlLnJlZCkucmVkTXVsKHRoaXMueik7XG4gIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB2YXIgeGMgPSB4LmNsb25lKCk7XG4gIHZhciB0ID0gdGhpcy5jdXJ2ZS5yZWROLnJlZE11bCh0aGlzLnopO1xuICBmb3IgKDs7KSB7XG4gICAgeGMuaWFkZCh0aGlzLmN1cnZlLm4pO1xuICAgIGlmICh4Yy5jbXAodGhpcy5jdXJ2ZS5wKSA+PSAwKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgcngucmVkSUFkZCh0KTtcbiAgICBpZiAodGhpcy54LmNtcChyeCkgPT09IDApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuLy8gQ29tcGF0aWJpbGl0eSB3aXRoIEJhc2VDdXJ2ZVxuUG9pbnQucHJvdG90eXBlLnRvUCA9IFBvaW50LnByb3RvdHlwZS5ub3JtYWxpemU7XG5Qb2ludC5wcm90b3R5cGUubWl4ZWRBZGQgPSBQb2ludC5wcm90b3R5cGUuYWRkO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBjdXJ2ZSA9IGV4cG9ydHM7XG5cbmN1cnZlLmJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcbmN1cnZlLnNob3J0ID0gcmVxdWlyZSgnLi9zaG9ydCcpO1xuY3VydmUubW9udCA9IHJlcXVpcmUoJy4vbW9udCcpO1xuY3VydmUuZWR3YXJkcyA9IHJlcXVpcmUoJy4vZWR3YXJkcycpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLmluaGVyaXRzID0gaW5oZXJpdHM7XG5cbmZ1bmN0aW9uIGlzU3Vycm9nYXRlUGFpcihtc2csIGkpIHtcbiAgaWYgKChtc2cuY2hhckNvZGVBdChpKSAmIDB4RkMwMCkgIT09IDB4RDgwMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoaSA8IDAgfHwgaSArIDEgPj0gbXNnLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gKG1zZy5jaGFyQ29kZUF0KGkgKyAxKSAmIDB4RkMwMCkgPT09IDB4REMwMDtcbn1cblxuZnVuY3Rpb24gdG9BcnJheShtc2csIGVuYykge1xuICBpZiAoQXJyYXkuaXNBcnJheShtc2cpKVxuICAgIHJldHVybiBtc2cuc2xpY2UoKTtcbiAgaWYgKCFtc2cpXG4gICAgcmV0dXJuIFtdO1xuICB2YXIgcmVzID0gW107XG4gIGlmICh0eXBlb2YgbXNnID09PSAnc3RyaW5nJykge1xuICAgIGlmICghZW5jKSB7XG4gICAgICAvLyBJbnNwaXJlZCBieSBzdHJpbmdUb1V0ZjhCeXRlQXJyYXkoKSBpbiBjbG9zdXJlLWxpYnJhcnkgYnkgR29vZ2xlXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtbGlicmFyeS9ibG9iLzg1OThkODcyNDJhZjU5YWFjMjMzMjcwNzQyYzg5ODRlMmIyYmRiZTAvY2xvc3VyZS9nb29nL2NyeXB0L2NyeXB0LmpzI0wxMTctTDE0M1xuICAgICAgLy8gQXBhY2hlIExpY2Vuc2UgMi4wXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtbGlicmFyeS9ibG9iL21hc3Rlci9MSUNFTlNFXG4gICAgICB2YXIgcCA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYyA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoYyA8IDEyOCkge1xuICAgICAgICAgIHJlc1twKytdID0gYztcbiAgICAgICAgfSBlbHNlIGlmIChjIDwgMjA0OCkge1xuICAgICAgICAgIHJlc1twKytdID0gKGMgPj4gNikgfCAxOTI7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyAmIDYzKSB8IDEyODtcbiAgICAgICAgfSBlbHNlIGlmIChpc1N1cnJvZ2F0ZVBhaXIobXNnLCBpKSkge1xuICAgICAgICAgIGMgPSAweDEwMDAwICsgKChjICYgMHgwM0ZGKSA8PCAxMCkgKyAobXNnLmNoYXJDb2RlQXQoKytpKSAmIDB4MDNGRik7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyA+PiAxOCkgfCAyNDA7XG4gICAgICAgICAgcmVzW3ArK10gPSAoKGMgPj4gMTIpICYgNjMpIHwgMTI4O1xuICAgICAgICAgIHJlc1twKytdID0gKChjID4+IDYpICYgNjMpIHwgMTI4O1xuICAgICAgICAgIHJlc1twKytdID0gKGMgJiA2MykgfCAxMjg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyA+PiAxMikgfCAyMjQ7XG4gICAgICAgICAgcmVzW3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyAmIDYzKSB8IDEyODtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5jID09PSAnaGV4Jykge1xuICAgICAgbXNnID0gbXNnLnJlcGxhY2UoL1teYS16MC05XSsvaWcsICcnKTtcbiAgICAgIGlmIChtc2cubGVuZ3RoICUgMiAhPT0gMClcbiAgICAgICAgbXNnID0gJzAnICsgbXNnO1xuICAgICAgZm9yIChpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgcmVzLnB1c2gocGFyc2VJbnQobXNnW2ldICsgbXNnW2kgKyAxXSwgMTYpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKylcbiAgICAgIHJlc1tpXSA9IG1zZ1tpXSB8IDA7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudG9BcnJheSA9IHRvQXJyYXk7XG5cbmZ1bmN0aW9uIHRvSGV4KG1zZykge1xuICB2YXIgcmVzID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgIHJlcyArPSB6ZXJvMihtc2dbaV0udG9TdHJpbmcoMTYpKTtcbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudG9IZXggPSB0b0hleDtcblxuZnVuY3Rpb24gaHRvbmwodykge1xuICB2YXIgcmVzID0gKHcgPj4+IDI0KSB8XG4gICAgICAgICAgICAoKHcgPj4+IDgpICYgMHhmZjAwKSB8XG4gICAgICAgICAgICAoKHcgPDwgOCkgJiAweGZmMDAwMCkgfFxuICAgICAgICAgICAgKCh3ICYgMHhmZikgPDwgMjQpO1xuICByZXR1cm4gcmVzID4+PiAwO1xufVxuZXhwb3J0cy5odG9ubCA9IGh0b25sO1xuXG5mdW5jdGlvbiB0b0hleDMyKG1zZywgZW5kaWFuKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdyA9IG1zZ1tpXTtcbiAgICBpZiAoZW5kaWFuID09PSAnbGl0dGxlJylcbiAgICAgIHcgPSBodG9ubCh3KTtcbiAgICByZXMgKz0gemVybzgody50b1N0cmluZygxNikpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5leHBvcnRzLnRvSGV4MzIgPSB0b0hleDMyO1xuXG5mdW5jdGlvbiB6ZXJvMih3b3JkKSB7XG4gIGlmICh3b3JkLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gJzAnICsgd29yZDtcbiAgZWxzZVxuICAgIHJldHVybiB3b3JkO1xufVxuZXhwb3J0cy56ZXJvMiA9IHplcm8yO1xuXG5mdW5jdGlvbiB6ZXJvOCh3b3JkKSB7XG4gIGlmICh3b3JkLmxlbmd0aCA9PT0gNylcbiAgICByZXR1cm4gJzAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDYpXG4gICAgcmV0dXJuICcwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNSlcbiAgICByZXR1cm4gJzAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNClcbiAgICByZXR1cm4gJzAwMDAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDMpXG4gICAgcmV0dXJuICcwMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMilcbiAgICByZXR1cm4gJzAwMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gJzAwMDAwMDAnICsgd29yZDtcbiAgZWxzZVxuICAgIHJldHVybiB3b3JkO1xufVxuZXhwb3J0cy56ZXJvOCA9IHplcm84O1xuXG5mdW5jdGlvbiBqb2luMzIobXNnLCBzdGFydCwgZW5kLCBlbmRpYW4pIHtcbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0O1xuICBhc3NlcnQobGVuICUgNCA9PT0gMCk7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkobGVuIC8gNCk7XG4gIGZvciAodmFyIGkgPSAwLCBrID0gc3RhcnQ7IGkgPCByZXMubGVuZ3RoOyBpKyssIGsgKz0gNCkge1xuICAgIHZhciB3O1xuICAgIGlmIChlbmRpYW4gPT09ICdiaWcnKVxuICAgICAgdyA9IChtc2dba10gPDwgMjQpIHwgKG1zZ1trICsgMV0gPDwgMTYpIHwgKG1zZ1trICsgMl0gPDwgOCkgfCBtc2dbayArIDNdO1xuICAgIGVsc2VcbiAgICAgIHcgPSAobXNnW2sgKyAzXSA8PCAyNCkgfCAobXNnW2sgKyAyXSA8PCAxNikgfCAobXNnW2sgKyAxXSA8PCA4KSB8IG1zZ1trXTtcbiAgICByZXNbaV0gPSB3ID4+PiAwO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5leHBvcnRzLmpvaW4zMiA9IGpvaW4zMjtcblxuZnVuY3Rpb24gc3BsaXQzMihtc2csIGVuZGlhbikge1xuICB2YXIgcmVzID0gbmV3IEFycmF5KG1zZy5sZW5ndGggKiA0KTtcbiAgZm9yICh2YXIgaSA9IDAsIGsgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrLCBrICs9IDQpIHtcbiAgICB2YXIgbSA9IG1zZ1tpXTtcbiAgICBpZiAoZW5kaWFuID09PSAnYmlnJykge1xuICAgICAgcmVzW2tdID0gbSA+Pj4gMjQ7XG4gICAgICByZXNbayArIDFdID0gKG0gPj4+IDE2KSAmIDB4ZmY7XG4gICAgICByZXNbayArIDJdID0gKG0gPj4+IDgpICYgMHhmZjtcbiAgICAgIHJlc1trICsgM10gPSBtICYgMHhmZjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzW2sgKyAzXSA9IG0gPj4+IDI0O1xuICAgICAgcmVzW2sgKyAyXSA9IChtID4+PiAxNikgJiAweGZmO1xuICAgICAgcmVzW2sgKyAxXSA9IChtID4+PiA4KSAmIDB4ZmY7XG4gICAgICByZXNba10gPSBtICYgMHhmZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMuc3BsaXQzMiA9IHNwbGl0MzI7XG5cbmZ1bmN0aW9uIHJvdHIzMih3LCBiKSB7XG4gIHJldHVybiAodyA+Pj4gYikgfCAodyA8PCAoMzIgLSBiKSk7XG59XG5leHBvcnRzLnJvdHIzMiA9IHJvdHIzMjtcblxuZnVuY3Rpb24gcm90bDMyKHcsIGIpIHtcbiAgcmV0dXJuICh3IDw8IGIpIHwgKHcgPj4+ICgzMiAtIGIpKTtcbn1cbmV4cG9ydHMucm90bDMyID0gcm90bDMyO1xuXG5mdW5jdGlvbiBzdW0zMihhLCBiKSB7XG4gIHJldHVybiAoYSArIGIpID4+PiAwO1xufVxuZXhwb3J0cy5zdW0zMiA9IHN1bTMyO1xuXG5mdW5jdGlvbiBzdW0zMl8zKGEsIGIsIGMpIHtcbiAgcmV0dXJuIChhICsgYiArIGMpID4+PiAwO1xufVxuZXhwb3J0cy5zdW0zMl8zID0gc3VtMzJfMztcblxuZnVuY3Rpb24gc3VtMzJfNChhLCBiLCBjLCBkKSB7XG4gIHJldHVybiAoYSArIGIgKyBjICsgZCkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyXzQgPSBzdW0zMl80O1xuXG5mdW5jdGlvbiBzdW0zMl81KGEsIGIsIGMsIGQsIGUpIHtcbiAgcmV0dXJuIChhICsgYiArIGMgKyBkICsgZSkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyXzUgPSBzdW0zMl81O1xuXG5mdW5jdGlvbiBzdW02NChidWYsIHBvcywgYWgsIGFsKSB7XG4gIHZhciBiaCA9IGJ1Zltwb3NdO1xuICB2YXIgYmwgPSBidWZbcG9zICsgMV07XG5cbiAgdmFyIGxvID0gKGFsICsgYmwpID4+PiAwO1xuICB2YXIgaGkgPSAobG8gPCBhbCA/IDEgOiAwKSArIGFoICsgYmg7XG4gIGJ1Zltwb3NdID0gaGkgPj4+IDA7XG4gIGJ1Zltwb3MgKyAxXSA9IGxvO1xufVxuZXhwb3J0cy5zdW02NCA9IHN1bTY0O1xuXG5mdW5jdGlvbiBzdW02NF9oaShhaCwgYWwsIGJoLCBibCkge1xuICB2YXIgbG8gPSAoYWwgKyBibCkgPj4+IDA7XG4gIHZhciBoaSA9IChsbyA8IGFsID8gMSA6IDApICsgYWggKyBiaDtcbiAgcmV0dXJuIGhpID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF9oaSA9IHN1bTY0X2hpO1xuXG5mdW5jdGlvbiBzdW02NF9sbyhhaCwgYWwsIGJoLCBibCkge1xuICB2YXIgbG8gPSBhbCArIGJsO1xuICByZXR1cm4gbG8gPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0X2xvID0gc3VtNjRfbG87XG5cbmZ1bmN0aW9uIHN1bTY0XzRfaGkoYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIHZhciBsbyA9IGFsO1xuICBsbyA9IChsbyArIGJsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBhbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGNsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBjbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGRsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBkbCA/IDEgOiAwO1xuXG4gIHZhciBoaSA9IGFoICsgYmggKyBjaCArIGRoICsgY2Fycnk7XG4gIHJldHVybiBoaSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfNF9oaSA9IHN1bTY0XzRfaGk7XG5cbmZ1bmN0aW9uIHN1bTY0XzRfbG8oYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsKSB7XG4gIHZhciBsbyA9IGFsICsgYmwgKyBjbCArIGRsO1xuICByZXR1cm4gbG8gPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0XzRfbG8gPSBzdW02NF80X2xvO1xuXG5mdW5jdGlvbiBzdW02NF81X2hpKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCwgZWgsIGVsKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIHZhciBsbyA9IGFsO1xuICBsbyA9IChsbyArIGJsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBhbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGNsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBjbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGRsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBkbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGVsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBlbCA/IDEgOiAwO1xuXG4gIHZhciBoaSA9IGFoICsgYmggKyBjaCArIGRoICsgZWggKyBjYXJyeTtcbiAgcmV0dXJuIGhpID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF81X2hpID0gc3VtNjRfNV9oaTtcblxuZnVuY3Rpb24gc3VtNjRfNV9sbyhhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwsIGVoLCBlbCkge1xuICB2YXIgbG8gPSBhbCArIGJsICsgY2wgKyBkbCArIGVsO1xuXG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfNV9sbyA9IHN1bTY0XzVfbG87XG5cbmZ1bmN0aW9uIHJvdHI2NF9oaShhaCwgYWwsIG51bSkge1xuICB2YXIgciA9IChhbCA8PCAoMzIgLSBudW0pKSB8IChhaCA+Pj4gbnVtKTtcbiAgcmV0dXJuIHIgPj4+IDA7XG59XG5leHBvcnRzLnJvdHI2NF9oaSA9IHJvdHI2NF9oaTtcblxuZnVuY3Rpb24gcm90cjY0X2xvKGFoLCBhbCwgbnVtKSB7XG4gIHZhciByID0gKGFoIDw8ICgzMiAtIG51bSkpIHwgKGFsID4+PiBudW0pO1xuICByZXR1cm4gciA+Pj4gMDtcbn1cbmV4cG9ydHMucm90cjY0X2xvID0gcm90cjY0X2xvO1xuXG5mdW5jdGlvbiBzaHI2NF9oaShhaCwgYWwsIG51bSkge1xuICByZXR1cm4gYWggPj4+IG51bTtcbn1cbmV4cG9ydHMuc2hyNjRfaGkgPSBzaHI2NF9oaTtcblxuZnVuY3Rpb24gc2hyNjRfbG8oYWgsIGFsLCBudW0pIHtcbiAgdmFyIHIgPSAoYWggPDwgKDMyIC0gbnVtKSkgfCAoYWwgPj4+IG51bSk7XG4gIHJldHVybiByID4+PiAwO1xufVxuZXhwb3J0cy5zaHI2NF9sbyA9IHNocjY0X2xvO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbmZ1bmN0aW9uIEJsb2NrSGFzaCgpIHtcbiAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nVG90YWwgPSAwO1xuICB0aGlzLmJsb2NrU2l6ZSA9IHRoaXMuY29uc3RydWN0b3IuYmxvY2tTaXplO1xuICB0aGlzLm91dFNpemUgPSB0aGlzLmNvbnN0cnVjdG9yLm91dFNpemU7XG4gIHRoaXMuaG1hY1N0cmVuZ3RoID0gdGhpcy5jb25zdHJ1Y3Rvci5obWFjU3RyZW5ndGg7XG4gIHRoaXMucGFkTGVuZ3RoID0gdGhpcy5jb25zdHJ1Y3Rvci5wYWRMZW5ndGggLyA4O1xuICB0aGlzLmVuZGlhbiA9ICdiaWcnO1xuXG4gIHRoaXMuX2RlbHRhOCA9IHRoaXMuYmxvY2tTaXplIC8gODtcbiAgdGhpcy5fZGVsdGEzMiA9IHRoaXMuYmxvY2tTaXplIC8gMzI7XG59XG5leHBvcnRzLkJsb2NrSGFzaCA9IEJsb2NrSGFzaDtcblxuQmxvY2tIYXNoLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUobXNnLCBlbmMpIHtcbiAgLy8gQ29udmVydCBtZXNzYWdlIHRvIGFycmF5LCBwYWQgaXQsIGFuZCBqb2luIGludG8gMzJiaXQgYmxvY2tzXG4gIG1zZyA9IHV0aWxzLnRvQXJyYXkobXNnLCBlbmMpO1xuICBpZiAoIXRoaXMucGVuZGluZylcbiAgICB0aGlzLnBlbmRpbmcgPSBtc2c7XG4gIGVsc2VcbiAgICB0aGlzLnBlbmRpbmcgPSB0aGlzLnBlbmRpbmcuY29uY2F0KG1zZyk7XG4gIHRoaXMucGVuZGluZ1RvdGFsICs9IG1zZy5sZW5ndGg7XG5cbiAgLy8gRW5vdWdoIGRhdGEsIHRyeSB1cGRhdGluZ1xuICBpZiAodGhpcy5wZW5kaW5nLmxlbmd0aCA+PSB0aGlzLl9kZWx0YTgpIHtcbiAgICBtc2cgPSB0aGlzLnBlbmRpbmc7XG5cbiAgICAvLyBQcm9jZXNzIHBlbmRpbmcgZGF0YSBpbiBibG9ja3NcbiAgICB2YXIgciA9IG1zZy5sZW5ndGggJSB0aGlzLl9kZWx0YTg7XG4gICAgdGhpcy5wZW5kaW5nID0gbXNnLnNsaWNlKG1zZy5sZW5ndGggLSByLCBtc2cubGVuZ3RoKTtcbiAgICBpZiAodGhpcy5wZW5kaW5nLmxlbmd0aCA9PT0gMClcbiAgICAgIHRoaXMucGVuZGluZyA9IG51bGw7XG5cbiAgICBtc2cgPSB1dGlscy5qb2luMzIobXNnLCAwLCBtc2cubGVuZ3RoIC0gciwgdGhpcy5lbmRpYW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSB0aGlzLl9kZWx0YTMyKVxuICAgICAgdGhpcy5fdXBkYXRlKG1zZywgaSwgaSArIHRoaXMuX2RlbHRhMzIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5CbG9ja0hhc2gucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgdGhpcy51cGRhdGUodGhpcy5fcGFkKCkpO1xuICBhc3NlcnQodGhpcy5wZW5kaW5nID09PSBudWxsKTtcblxuICByZXR1cm4gdGhpcy5fZGlnZXN0KGVuYyk7XG59O1xuXG5CbG9ja0hhc2gucHJvdG90eXBlLl9wYWQgPSBmdW5jdGlvbiBwYWQoKSB7XG4gIHZhciBsZW4gPSB0aGlzLnBlbmRpbmdUb3RhbDtcbiAgdmFyIGJ5dGVzID0gdGhpcy5fZGVsdGE4O1xuICB2YXIgayA9IGJ5dGVzIC0gKChsZW4gKyB0aGlzLnBhZExlbmd0aCkgJSBieXRlcyk7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkoayArIHRoaXMucGFkTGVuZ3RoKTtcbiAgcmVzWzBdID0gMHg4MDtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBrOyBpKyspXG4gICAgcmVzW2ldID0gMDtcblxuICAvLyBBcHBlbmQgbGVuZ3RoXG4gIGxlbiA8PD0gMztcbiAgaWYgKHRoaXMuZW5kaWFuID09PSAnYmlnJykge1xuICAgIGZvciAodmFyIHQgPSA4OyB0IDwgdGhpcy5wYWRMZW5ndGg7IHQrKylcbiAgICAgIHJlc1tpKytdID0gMDtcblxuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDI0KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAxNikgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gOCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gbGVuICYgMHhmZjtcbiAgfSBlbHNlIHtcbiAgICByZXNbaSsrXSA9IGxlbiAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiA4KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAxNikgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMjQpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG5cbiAgICBmb3IgKHQgPSA4OyB0IDwgdGhpcy5wYWRMZW5ndGg7IHQrKylcbiAgICAgIHJlc1tpKytdID0gMDtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgcm90cjMyID0gdXRpbHMucm90cjMyO1xuXG5mdW5jdGlvbiBmdF8xKHMsIHgsIHksIHopIHtcbiAgaWYgKHMgPT09IDApXG4gICAgcmV0dXJuIGNoMzIoeCwgeSwgeik7XG4gIGlmIChzID09PSAxIHx8IHMgPT09IDMpXG4gICAgcmV0dXJuIHAzMih4LCB5LCB6KTtcbiAgaWYgKHMgPT09IDIpXG4gICAgcmV0dXJuIG1hajMyKHgsIHksIHopO1xufVxuZXhwb3J0cy5mdF8xID0gZnRfMTtcblxuZnVuY3Rpb24gY2gzMih4LCB5LCB6KSB7XG4gIHJldHVybiAoeCAmIHkpIF4gKCh+eCkgJiB6KTtcbn1cbmV4cG9ydHMuY2gzMiA9IGNoMzI7XG5cbmZ1bmN0aW9uIG1hajMyKHgsIHksIHopIHtcbiAgcmV0dXJuICh4ICYgeSkgXiAoeCAmIHopIF4gKHkgJiB6KTtcbn1cbmV4cG9ydHMubWFqMzIgPSBtYWozMjtcblxuZnVuY3Rpb24gcDMyKHgsIHksIHopIHtcbiAgcmV0dXJuIHggXiB5IF4gejtcbn1cbmV4cG9ydHMucDMyID0gcDMyO1xuXG5mdW5jdGlvbiBzMF8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDIpIF4gcm90cjMyKHgsIDEzKSBeIHJvdHIzMih4LCAyMik7XG59XG5leHBvcnRzLnMwXzI1NiA9IHMwXzI1NjtcblxuZnVuY3Rpb24gczFfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCA2KSBeIHJvdHIzMih4LCAxMSkgXiByb3RyMzIoeCwgMjUpO1xufVxuZXhwb3J0cy5zMV8yNTYgPSBzMV8yNTY7XG5cbmZ1bmN0aW9uIGcwXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgNykgXiByb3RyMzIoeCwgMTgpIF4gKHggPj4+IDMpO1xufVxuZXhwb3J0cy5nMF8yNTYgPSBnMF8yNTY7XG5cbmZ1bmN0aW9uIGcxXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgMTcpIF4gcm90cjMyKHgsIDE5KSBeICh4ID4+PiAxMCk7XG59XG5leHBvcnRzLmcxXzI1NiA9IGcxXzI1NjtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4uL2NvbW1vbicpO1xudmFyIHNoYUNvbW1vbiA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG5cbnZhciByb3RsMzIgPSB1dGlscy5yb3RsMzI7XG52YXIgc3VtMzIgPSB1dGlscy5zdW0zMjtcbnZhciBzdW0zMl81ID0gdXRpbHMuc3VtMzJfNTtcbnZhciBmdF8xID0gc2hhQ29tbW9uLmZ0XzE7XG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxudmFyIHNoYTFfSyA9IFtcbiAgMHg1QTgyNzk5OSwgMHg2RUQ5RUJBMSxcbiAgMHg4RjFCQkNEQywgMHhDQTYyQzFENlxuXTtcblxuZnVuY3Rpb24gU0hBMSgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTEpKVxuICAgIHJldHVybiBuZXcgU0hBMSgpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSxcbiAgICAweDEwMzI1NDc2LCAweGMzZDJlMWYwIF07XG4gIHRoaXMuVyA9IG5ldyBBcnJheSg4MCk7XG59XG5cbnV0aWxzLmluaGVyaXRzKFNIQTEsIEJsb2NrSGFzaCk7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTE7XG5cblNIQTEuYmxvY2tTaXplID0gNTEyO1xuU0hBMS5vdXRTaXplID0gMTYwO1xuU0hBMS5obWFjU3RyZW5ndGggPSA4MDtcblNIQTEucGFkTGVuZ3RoID0gNjQ7XG5cblNIQTEucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcblxuICBmb3IoOyBpIDwgVy5sZW5ndGg7IGkrKylcbiAgICBXW2ldID0gcm90bDMyKFdbaSAtIDNdIF4gV1tpIC0gOF0gXiBXW2kgLSAxNF0gXiBXW2kgLSAxNl0sIDEpO1xuXG4gIHZhciBhID0gdGhpcy5oWzBdO1xuICB2YXIgYiA9IHRoaXMuaFsxXTtcbiAgdmFyIGMgPSB0aGlzLmhbMl07XG4gIHZhciBkID0gdGhpcy5oWzNdO1xuICB2YXIgZSA9IHRoaXMuaFs0XTtcblxuICBmb3IgKGkgPSAwOyBpIDwgVy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzID0gfn4oaSAvIDIwKTtcbiAgICB2YXIgdCA9IHN1bTMyXzUocm90bDMyKGEsIDUpLCBmdF8xKHMsIGIsIGMsIGQpLCBlLCBXW2ldLCBzaGExX0tbc10pO1xuICAgIGUgPSBkO1xuICAgIGQgPSBjO1xuICAgIGMgPSByb3RsMzIoYiwgMzApO1xuICAgIGIgPSBhO1xuICAgIGEgPSB0O1xuICB9XG5cbiAgdGhpcy5oWzBdID0gc3VtMzIodGhpcy5oWzBdLCBhKTtcbiAgdGhpcy5oWzFdID0gc3VtMzIodGhpcy5oWzFdLCBiKTtcbiAgdGhpcy5oWzJdID0gc3VtMzIodGhpcy5oWzJdLCBjKTtcbiAgdGhpcy5oWzNdID0gc3VtMzIodGhpcy5oWzNdLCBkKTtcbiAgdGhpcy5oWzRdID0gc3VtMzIodGhpcy5oWzRdLCBlKTtcbn07XG5cblNIQTEucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnYmlnJyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgc2hhQ29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbnZhciBzdW0zMiA9IHV0aWxzLnN1bTMyO1xudmFyIHN1bTMyXzQgPSB1dGlscy5zdW0zMl80O1xudmFyIHN1bTMyXzUgPSB1dGlscy5zdW0zMl81O1xudmFyIGNoMzIgPSBzaGFDb21tb24uY2gzMjtcbnZhciBtYWozMiA9IHNoYUNvbW1vbi5tYWozMjtcbnZhciBzMF8yNTYgPSBzaGFDb21tb24uczBfMjU2O1xudmFyIHMxXzI1NiA9IHNoYUNvbW1vbi5zMV8yNTY7XG52YXIgZzBfMjU2ID0gc2hhQ29tbW9uLmcwXzI1NjtcbnZhciBnMV8yNTYgPSBzaGFDb21tb24uZzFfMjU2O1xuXG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxudmFyIHNoYTI1Nl9LID0gW1xuICAweDQyOGEyZjk4LCAweDcxMzc0NDkxLCAweGI1YzBmYmNmLCAweGU5YjVkYmE1LFxuICAweDM5NTZjMjViLCAweDU5ZjExMWYxLCAweDkyM2Y4MmE0LCAweGFiMWM1ZWQ1LFxuICAweGQ4MDdhYTk4LCAweDEyODM1YjAxLCAweDI0MzE4NWJlLCAweDU1MGM3ZGMzLFxuICAweDcyYmU1ZDc0LCAweDgwZGViMWZlLCAweDliZGMwNmE3LCAweGMxOWJmMTc0LFxuICAweGU0OWI2OWMxLCAweGVmYmU0Nzg2LCAweDBmYzE5ZGM2LCAweDI0MGNhMWNjLFxuICAweDJkZTkyYzZmLCAweDRhNzQ4NGFhLCAweDVjYjBhOWRjLCAweDc2Zjk4OGRhLFxuICAweDk4M2U1MTUyLCAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3LFxuICAweGM2ZTAwYmYzLCAweGQ1YTc5MTQ3LCAweDA2Y2E2MzUxLCAweDE0MjkyOTY3LFxuICAweDI3YjcwYTg1LCAweDJlMWIyMTM4LCAweDRkMmM2ZGZjLCAweDUzMzgwZDEzLFxuICAweDY1MGE3MzU0LCAweDc2NmEwYWJiLCAweDgxYzJjOTJlLCAweDkyNzIyYzg1LFxuICAweGEyYmZlOGExLCAweGE4MWE2NjRiLCAweGMyNGI4YjcwLCAweGM3NmM1MWEzLFxuICAweGQxOTJlODE5LCAweGQ2OTkwNjI0LCAweGY0MGUzNTg1LCAweDEwNmFhMDcwLFxuICAweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1LFxuICAweDM5MWMwY2IzLCAweDRlZDhhYTRhLCAweDViOWNjYTRmLCAweDY4MmU2ZmYzLFxuICAweDc0OGY4MmVlLCAweDc4YTU2MzZmLCAweDg0Yzg3ODE0LCAweDhjYzcwMjA4LFxuICAweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyXG5dO1xuXG5mdW5jdGlvbiBTSEEyNTYoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEyNTYpKVxuICAgIHJldHVybiBuZXcgU0hBMjU2KCk7XG5cbiAgQmxvY2tIYXNoLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweDZhMDllNjY3LCAweGJiNjdhZTg1LCAweDNjNmVmMzcyLCAweGE1NGZmNTNhLFxuICAgIDB4NTEwZTUyN2YsIDB4OWIwNTY4OGMsIDB4MWY4M2Q5YWIsIDB4NWJlMGNkMTlcbiAgXTtcbiAgdGhpcy5rID0gc2hhMjU2X0s7XG4gIHRoaXMuVyA9IG5ldyBBcnJheSg2NCk7XG59XG51dGlscy5pbmhlcml0cyhTSEEyNTYsIEJsb2NrSGFzaCk7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTI1NjtcblxuU0hBMjU2LmJsb2NrU2l6ZSA9IDUxMjtcblNIQTI1Ni5vdXRTaXplID0gMjU2O1xuU0hBMjU2LmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTI1Ni5wYWRMZW5ndGggPSA2NDtcblxuU0hBMjU2LnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gX3VwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHZhciBXID0gdGhpcy5XO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKylcbiAgICBXW2ldID0gbXNnW3N0YXJ0ICsgaV07XG4gIGZvciAoOyBpIDwgVy5sZW5ndGg7IGkrKylcbiAgICBXW2ldID0gc3VtMzJfNChnMV8yNTYoV1tpIC0gMl0pLCBXW2kgLSA3XSwgZzBfMjU2KFdbaSAtIDE1XSksIFdbaSAtIDE2XSk7XG5cbiAgdmFyIGEgPSB0aGlzLmhbMF07XG4gIHZhciBiID0gdGhpcy5oWzFdO1xuICB2YXIgYyA9IHRoaXMuaFsyXTtcbiAgdmFyIGQgPSB0aGlzLmhbM107XG4gIHZhciBlID0gdGhpcy5oWzRdO1xuICB2YXIgZiA9IHRoaXMuaFs1XTtcbiAgdmFyIGcgPSB0aGlzLmhbNl07XG4gIHZhciBoID0gdGhpcy5oWzddO1xuXG4gIGFzc2VydCh0aGlzLmsubGVuZ3RoID09PSBXLmxlbmd0aCk7XG4gIGZvciAoaSA9IDA7IGkgPCBXLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIFQxID0gc3VtMzJfNShoLCBzMV8yNTYoZSksIGNoMzIoZSwgZiwgZyksIHRoaXMua1tpXSwgV1tpXSk7XG4gICAgdmFyIFQyID0gc3VtMzIoczBfMjU2KGEpLCBtYWozMihhLCBiLCBjKSk7XG4gICAgaCA9IGc7XG4gICAgZyA9IGY7XG4gICAgZiA9IGU7XG4gICAgZSA9IHN1bTMyKGQsIFQxKTtcbiAgICBkID0gYztcbiAgICBjID0gYjtcbiAgICBiID0gYTtcbiAgICBhID0gc3VtMzIoVDEsIFQyKTtcbiAgfVxuXG4gIHRoaXMuaFswXSA9IHN1bTMyKHRoaXMuaFswXSwgYSk7XG4gIHRoaXMuaFsxXSA9IHN1bTMyKHRoaXMuaFsxXSwgYik7XG4gIHRoaXMuaFsyXSA9IHN1bTMyKHRoaXMuaFsyXSwgYyk7XG4gIHRoaXMuaFszXSA9IHN1bTMyKHRoaXMuaFszXSwgZCk7XG4gIHRoaXMuaFs0XSA9IHN1bTMyKHRoaXMuaFs0XSwgZSk7XG4gIHRoaXMuaFs1XSA9IHN1bTMyKHRoaXMuaFs1XSwgZik7XG4gIHRoaXMuaFs2XSA9IHN1bTMyKHRoaXMuaFs2XSwgZyk7XG4gIHRoaXMuaFs3XSA9IHN1bTMyKHRoaXMuaFs3XSwgaCk7XG59O1xuXG5TSEEyNTYucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnYmlnJyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgU0hBMjU2ID0gcmVxdWlyZSgnLi8yNTYnKTtcblxuZnVuY3Rpb24gU0hBMjI0KCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBMjI0KSlcbiAgICByZXR1cm4gbmV3IFNIQTIyNCgpO1xuXG4gIFNIQTI1Ni5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHhjMTA1OWVkOCwgMHgzNjdjZDUwNywgMHgzMDcwZGQxNywgMHhmNzBlNTkzOSxcbiAgICAweGZmYzAwYjMxLCAweDY4NTgxNTExLCAweDY0Zjk4ZmE3LCAweGJlZmE0ZmE0IF07XG59XG51dGlscy5pbmhlcml0cyhTSEEyMjQsIFNIQTI1Nik7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTIyNDtcblxuU0hBMjI0LmJsb2NrU2l6ZSA9IDUxMjtcblNIQTIyNC5vdXRTaXplID0gMjI0O1xuU0hBMjI0LmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTIyNC5wYWRMZW5ndGggPSA2NDtcblxuU0hBMjI0LnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICAvLyBKdXN0IHRydW5jYXRlIG91dHB1dFxuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmguc2xpY2UoMCwgNyksICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaC5zbGljZSgwLCA3KSwgJ2JpZycpO1xufTtcblxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG52YXIgcm90cjY0X2hpID0gdXRpbHMucm90cjY0X2hpO1xudmFyIHJvdHI2NF9sbyA9IHV0aWxzLnJvdHI2NF9sbztcbnZhciBzaHI2NF9oaSA9IHV0aWxzLnNocjY0X2hpO1xudmFyIHNocjY0X2xvID0gdXRpbHMuc2hyNjRfbG87XG52YXIgc3VtNjQgPSB1dGlscy5zdW02NDtcbnZhciBzdW02NF9oaSA9IHV0aWxzLnN1bTY0X2hpO1xudmFyIHN1bTY0X2xvID0gdXRpbHMuc3VtNjRfbG87XG52YXIgc3VtNjRfNF9oaSA9IHV0aWxzLnN1bTY0XzRfaGk7XG52YXIgc3VtNjRfNF9sbyA9IHV0aWxzLnN1bTY0XzRfbG87XG52YXIgc3VtNjRfNV9oaSA9IHV0aWxzLnN1bTY0XzVfaGk7XG52YXIgc3VtNjRfNV9sbyA9IHV0aWxzLnN1bTY0XzVfbG87XG5cbnZhciBCbG9ja0hhc2ggPSBjb21tb24uQmxvY2tIYXNoO1xuXG52YXIgc2hhNTEyX0sgPSBbXG4gIDB4NDI4YTJmOTgsIDB4ZDcyOGFlMjIsIDB4NzEzNzQ0OTEsIDB4MjNlZjY1Y2QsXG4gIDB4YjVjMGZiY2YsIDB4ZWM0ZDNiMmYsIDB4ZTliNWRiYTUsIDB4ODE4OWRiYmMsXG4gIDB4Mzk1NmMyNWIsIDB4ZjM0OGI1MzgsIDB4NTlmMTExZjEsIDB4YjYwNWQwMTksXG4gIDB4OTIzZjgyYTQsIDB4YWYxOTRmOWIsIDB4YWIxYzVlZDUsIDB4ZGE2ZDgxMTgsXG4gIDB4ZDgwN2FhOTgsIDB4YTMwMzAyNDIsIDB4MTI4MzViMDEsIDB4NDU3MDZmYmUsXG4gIDB4MjQzMTg1YmUsIDB4NGVlNGIyOGMsIDB4NTUwYzdkYzMsIDB4ZDVmZmI0ZTIsXG4gIDB4NzJiZTVkNzQsIDB4ZjI3Yjg5NmYsIDB4ODBkZWIxZmUsIDB4M2IxNjk2YjEsXG4gIDB4OWJkYzA2YTcsIDB4MjVjNzEyMzUsIDB4YzE5YmYxNzQsIDB4Y2Y2OTI2OTQsXG4gIDB4ZTQ5YjY5YzEsIDB4OWVmMTRhZDIsIDB4ZWZiZTQ3ODYsIDB4Mzg0ZjI1ZTMsXG4gIDB4MGZjMTlkYzYsIDB4OGI4Y2Q1YjUsIDB4MjQwY2ExY2MsIDB4NzdhYzljNjUsXG4gIDB4MmRlOTJjNmYsIDB4NTkyYjAyNzUsIDB4NGE3NDg0YWEsIDB4NmVhNmU0ODMsXG4gIDB4NWNiMGE5ZGMsIDB4YmQ0MWZiZDQsIDB4NzZmOTg4ZGEsIDB4ODMxMTUzYjUsXG4gIDB4OTgzZTUxNTIsIDB4ZWU2NmRmYWIsIDB4YTgzMWM2NmQsIDB4MmRiNDMyMTAsXG4gIDB4YjAwMzI3YzgsIDB4OThmYjIxM2YsIDB4YmY1OTdmYzcsIDB4YmVlZjBlZTQsXG4gIDB4YzZlMDBiZjMsIDB4M2RhODhmYzIsIDB4ZDVhNzkxNDcsIDB4OTMwYWE3MjUsXG4gIDB4MDZjYTYzNTEsIDB4ZTAwMzgyNmYsIDB4MTQyOTI5NjcsIDB4MGEwZTZlNzAsXG4gIDB4MjdiNzBhODUsIDB4NDZkMjJmZmMsIDB4MmUxYjIxMzgsIDB4NWMyNmM5MjYsXG4gIDB4NGQyYzZkZmMsIDB4NWFjNDJhZWQsIDB4NTMzODBkMTMsIDB4OWQ5NWIzZGYsXG4gIDB4NjUwYTczNTQsIDB4OGJhZjYzZGUsIDB4NzY2YTBhYmIsIDB4M2M3N2IyYTgsXG4gIDB4ODFjMmM5MmUsIDB4NDdlZGFlZTYsIDB4OTI3MjJjODUsIDB4MTQ4MjM1M2IsXG4gIDB4YTJiZmU4YTEsIDB4NGNmMTAzNjQsIDB4YTgxYTY2NGIsIDB4YmM0MjMwMDEsXG4gIDB4YzI0YjhiNzAsIDB4ZDBmODk3OTEsIDB4Yzc2YzUxYTMsIDB4MDY1NGJlMzAsXG4gIDB4ZDE5MmU4MTksIDB4ZDZlZjUyMTgsIDB4ZDY5OTA2MjQsIDB4NTU2NWE5MTAsXG4gIDB4ZjQwZTM1ODUsIDB4NTc3MTIwMmEsIDB4MTA2YWEwNzAsIDB4MzJiYmQxYjgsXG4gIDB4MTlhNGMxMTYsIDB4YjhkMmQwYzgsIDB4MWUzNzZjMDgsIDB4NTE0MWFiNTMsXG4gIDB4Mjc0ODc3NGMsIDB4ZGY4ZWViOTksIDB4MzRiMGJjYjUsIDB4ZTE5YjQ4YTgsXG4gIDB4MzkxYzBjYjMsIDB4YzVjOTVhNjMsIDB4NGVkOGFhNGEsIDB4ZTM0MThhY2IsXG4gIDB4NWI5Y2NhNGYsIDB4Nzc2M2UzNzMsIDB4NjgyZTZmZjMsIDB4ZDZiMmI4YTMsXG4gIDB4NzQ4ZjgyZWUsIDB4NWRlZmIyZmMsIDB4NzhhNTYzNmYsIDB4NDMxNzJmNjAsXG4gIDB4ODRjODc4MTQsIDB4YTFmMGFiNzIsIDB4OGNjNzAyMDgsIDB4MWE2NDM5ZWMsXG4gIDB4OTBiZWZmZmEsIDB4MjM2MzFlMjgsIDB4YTQ1MDZjZWIsIDB4ZGU4MmJkZTksXG4gIDB4YmVmOWEzZjcsIDB4YjJjNjc5MTUsIDB4YzY3MTc4ZjIsIDB4ZTM3MjUzMmIsXG4gIDB4Y2EyNzNlY2UsIDB4ZWEyNjYxOWMsIDB4ZDE4NmI4YzcsIDB4MjFjMGMyMDcsXG4gIDB4ZWFkYTdkZDYsIDB4Y2RlMGViMWUsIDB4ZjU3ZDRmN2YsIDB4ZWU2ZWQxNzgsXG4gIDB4MDZmMDY3YWEsIDB4NzIxNzZmYmEsIDB4MGE2MzdkYzUsIDB4YTJjODk4YTYsXG4gIDB4MTEzZjk4MDQsIDB4YmVmOTBkYWUsIDB4MWI3MTBiMzUsIDB4MTMxYzQ3MWIsXG4gIDB4MjhkYjc3ZjUsIDB4MjMwNDdkODQsIDB4MzJjYWFiN2IsIDB4NDBjNzI0OTMsXG4gIDB4M2M5ZWJlMGEsIDB4MTVjOWJlYmMsIDB4NDMxZDY3YzQsIDB4OWMxMDBkNGMsXG4gIDB4NGNjNWQ0YmUsIDB4Y2IzZTQyYjYsIDB4NTk3ZjI5OWMsIDB4ZmM2NTdlMmEsXG4gIDB4NWZjYjZmYWIsIDB4M2FkNmZhZWMsIDB4NmM0NDE5OGMsIDB4NGE0NzU4MTdcbl07XG5cbmZ1bmN0aW9uIFNIQTUxMigpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTUxMikpXG4gICAgcmV0dXJuIG5ldyBTSEE1MTIoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4NmEwOWU2NjcsIDB4ZjNiY2M5MDgsXG4gICAgMHhiYjY3YWU4NSwgMHg4NGNhYTczYixcbiAgICAweDNjNmVmMzcyLCAweGZlOTRmODJiLFxuICAgIDB4YTU0ZmY1M2EsIDB4NWYxZDM2ZjEsXG4gICAgMHg1MTBlNTI3ZiwgMHhhZGU2ODJkMSxcbiAgICAweDliMDU2ODhjLCAweDJiM2U2YzFmLFxuICAgIDB4MWY4M2Q5YWIsIDB4ZmI0MWJkNmIsXG4gICAgMHg1YmUwY2QxOSwgMHgxMzdlMjE3OSBdO1xuICB0aGlzLmsgPSBzaGE1MTJfSztcbiAgdGhpcy5XID0gbmV3IEFycmF5KDE2MCk7XG59XG51dGlscy5pbmhlcml0cyhTSEE1MTIsIEJsb2NrSGFzaCk7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTUxMjtcblxuU0hBNTEyLmJsb2NrU2l6ZSA9IDEwMjQ7XG5TSEE1MTIub3V0U2l6ZSA9IDUxMjtcblNIQTUxMi5obWFjU3RyZW5ndGggPSAxOTI7XG5TSEE1MTIucGFkTGVuZ3RoID0gMTI4O1xuXG5TSEE1MTIucHJvdG90eXBlLl9wcmVwYXJlQmxvY2sgPSBmdW5jdGlvbiBfcHJlcGFyZUJsb2NrKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgLy8gMzIgeCAzMmJpdCB3b3Jkc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDMyOyBpKyspXG4gICAgV1tpXSA9IG1zZ1tzdGFydCArIGldO1xuICBmb3IgKDsgaSA8IFcubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgYzBfaGkgPSBnMV81MTJfaGkoV1tpIC0gNF0sIFdbaSAtIDNdKTsgIC8vIGkgLSAyXG4gICAgdmFyIGMwX2xvID0gZzFfNTEyX2xvKFdbaSAtIDRdLCBXW2kgLSAzXSk7XG4gICAgdmFyIGMxX2hpID0gV1tpIC0gMTRdOyAgLy8gaSAtIDdcbiAgICB2YXIgYzFfbG8gPSBXW2kgLSAxM107XG4gICAgdmFyIGMyX2hpID0gZzBfNTEyX2hpKFdbaSAtIDMwXSwgV1tpIC0gMjldKTsgIC8vIGkgLSAxNVxuICAgIHZhciBjMl9sbyA9IGcwXzUxMl9sbyhXW2kgLSAzMF0sIFdbaSAtIDI5XSk7XG4gICAgdmFyIGMzX2hpID0gV1tpIC0gMzJdOyAgLy8gaSAtIDE2XG4gICAgdmFyIGMzX2xvID0gV1tpIC0gMzFdO1xuXG4gICAgV1tpXSA9IHN1bTY0XzRfaGkoXG4gICAgICBjMF9oaSwgYzBfbG8sXG4gICAgICBjMV9oaSwgYzFfbG8sXG4gICAgICBjMl9oaSwgYzJfbG8sXG4gICAgICBjM19oaSwgYzNfbG8pO1xuICAgIFdbaSArIDFdID0gc3VtNjRfNF9sbyhcbiAgICAgIGMwX2hpLCBjMF9sbyxcbiAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgIGMzX2hpLCBjM19sbyk7XG4gIH1cbn07XG5cblNIQTUxMi5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIF91cGRhdGUobXNnLCBzdGFydCkge1xuICB0aGlzLl9wcmVwYXJlQmxvY2sobXNnLCBzdGFydCk7XG5cbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgdmFyIGFoID0gdGhpcy5oWzBdO1xuICB2YXIgYWwgPSB0aGlzLmhbMV07XG4gIHZhciBiaCA9IHRoaXMuaFsyXTtcbiAgdmFyIGJsID0gdGhpcy5oWzNdO1xuICB2YXIgY2ggPSB0aGlzLmhbNF07XG4gIHZhciBjbCA9IHRoaXMuaFs1XTtcbiAgdmFyIGRoID0gdGhpcy5oWzZdO1xuICB2YXIgZGwgPSB0aGlzLmhbN107XG4gIHZhciBlaCA9IHRoaXMuaFs4XTtcbiAgdmFyIGVsID0gdGhpcy5oWzldO1xuICB2YXIgZmggPSB0aGlzLmhbMTBdO1xuICB2YXIgZmwgPSB0aGlzLmhbMTFdO1xuICB2YXIgZ2ggPSB0aGlzLmhbMTJdO1xuICB2YXIgZ2wgPSB0aGlzLmhbMTNdO1xuICB2YXIgaGggPSB0aGlzLmhbMTRdO1xuICB2YXIgaGwgPSB0aGlzLmhbMTVdO1xuXG4gIGFzc2VydCh0aGlzLmsubGVuZ3RoID09PSBXLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgVy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBjMF9oaSA9IGhoO1xuICAgIHZhciBjMF9sbyA9IGhsO1xuICAgIHZhciBjMV9oaSA9IHMxXzUxMl9oaShlaCwgZWwpO1xuICAgIHZhciBjMV9sbyA9IHMxXzUxMl9sbyhlaCwgZWwpO1xuICAgIHZhciBjMl9oaSA9IGNoNjRfaGkoZWgsIGVsLCBmaCwgZmwsIGdoLCBnbCk7XG4gICAgdmFyIGMyX2xvID0gY2g2NF9sbyhlaCwgZWwsIGZoLCBmbCwgZ2gsIGdsKTtcbiAgICB2YXIgYzNfaGkgPSB0aGlzLmtbaV07XG4gICAgdmFyIGMzX2xvID0gdGhpcy5rW2kgKyAxXTtcbiAgICB2YXIgYzRfaGkgPSBXW2ldO1xuICAgIHZhciBjNF9sbyA9IFdbaSArIDFdO1xuXG4gICAgdmFyIFQxX2hpID0gc3VtNjRfNV9oaShcbiAgICAgIGMwX2hpLCBjMF9sbyxcbiAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgIGMzX2hpLCBjM19sbyxcbiAgICAgIGM0X2hpLCBjNF9sbyk7XG4gICAgdmFyIFQxX2xvID0gc3VtNjRfNV9sbyhcbiAgICAgIGMwX2hpLCBjMF9sbyxcbiAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgIGMzX2hpLCBjM19sbyxcbiAgICAgIGM0X2hpLCBjNF9sbyk7XG5cbiAgICBjMF9oaSA9IHMwXzUxMl9oaShhaCwgYWwpO1xuICAgIGMwX2xvID0gczBfNTEyX2xvKGFoLCBhbCk7XG4gICAgYzFfaGkgPSBtYWo2NF9oaShhaCwgYWwsIGJoLCBibCwgY2gsIGNsKTtcbiAgICBjMV9sbyA9IG1hajY0X2xvKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wpO1xuXG4gICAgdmFyIFQyX2hpID0gc3VtNjRfaGkoYzBfaGksIGMwX2xvLCBjMV9oaSwgYzFfbG8pO1xuICAgIHZhciBUMl9sbyA9IHN1bTY0X2xvKGMwX2hpLCBjMF9sbywgYzFfaGksIGMxX2xvKTtcblxuICAgIGhoID0gZ2g7XG4gICAgaGwgPSBnbDtcblxuICAgIGdoID0gZmg7XG4gICAgZ2wgPSBmbDtcblxuICAgIGZoID0gZWg7XG4gICAgZmwgPSBlbDtcblxuICAgIGVoID0gc3VtNjRfaGkoZGgsIGRsLCBUMV9oaSwgVDFfbG8pO1xuICAgIGVsID0gc3VtNjRfbG8oZGwsIGRsLCBUMV9oaSwgVDFfbG8pO1xuXG4gICAgZGggPSBjaDtcbiAgICBkbCA9IGNsO1xuXG4gICAgY2ggPSBiaDtcbiAgICBjbCA9IGJsO1xuXG4gICAgYmggPSBhaDtcbiAgICBibCA9IGFsO1xuXG4gICAgYWggPSBzdW02NF9oaShUMV9oaSwgVDFfbG8sIFQyX2hpLCBUMl9sbyk7XG4gICAgYWwgPSBzdW02NF9sbyhUMV9oaSwgVDFfbG8sIFQyX2hpLCBUMl9sbyk7XG4gIH1cblxuICBzdW02NCh0aGlzLmgsIDAsIGFoLCBhbCk7XG4gIHN1bTY0KHRoaXMuaCwgMiwgYmgsIGJsKTtcbiAgc3VtNjQodGhpcy5oLCA0LCBjaCwgY2wpO1xuICBzdW02NCh0aGlzLmgsIDYsIGRoLCBkbCk7XG4gIHN1bTY0KHRoaXMuaCwgOCwgZWgsIGVsKTtcbiAgc3VtNjQodGhpcy5oLCAxMCwgZmgsIGZsKTtcbiAgc3VtNjQodGhpcy5oLCAxMiwgZ2gsIGdsKTtcbiAgc3VtNjQodGhpcy5oLCAxNCwgaGgsIGhsKTtcbn07XG5cblNIQTUxMi5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdiaWcnKTtcbn07XG5cbmZ1bmN0aW9uIGNoNjRfaGkoeGgsIHhsLCB5aCwgeWwsIHpoKSB7XG4gIHZhciByID0gKHhoICYgeWgpIF4gKCh+eGgpICYgemgpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIGNoNjRfbG8oeGgsIHhsLCB5aCwgeWwsIHpoLCB6bCkge1xuICB2YXIgciA9ICh4bCAmIHlsKSBeICgofnhsKSAmIHpsKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBtYWo2NF9oaSh4aCwgeGwsIHloLCB5bCwgemgpIHtcbiAgdmFyIHIgPSAoeGggJiB5aCkgXiAoeGggJiB6aCkgXiAoeWggJiB6aCk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gbWFqNjRfbG8oeGgsIHhsLCB5aCwgeWwsIHpoLCB6bCkge1xuICB2YXIgciA9ICh4bCAmIHlsKSBeICh4bCAmIHpsKSBeICh5bCAmIHpsKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBzMF81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDI4KTtcbiAgdmFyIGMxX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgMik7ICAvLyAzNFxuICB2YXIgYzJfaGkgPSByb3RyNjRfaGkoeGwsIHhoLCA3KTsgIC8vIDM5XG5cbiAgdmFyIHIgPSBjMF9oaSBeIGMxX2hpIF4gYzJfaGk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gczBfNTEyX2xvKHhoLCB4bCkge1xuICB2YXIgYzBfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAyOCk7XG4gIHZhciBjMV9sbyA9IHJvdHI2NF9sbyh4bCwgeGgsIDIpOyAgLy8gMzRcbiAgdmFyIGMyX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgNyk7ICAvLyAzOVxuXG4gIHZhciByID0gYzBfbG8gXiBjMV9sbyBeIGMyX2xvO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMxXzUxMl9oaSh4aCwgeGwpIHtcbiAgdmFyIGMwX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMTQpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAxOCk7XG4gIHZhciBjMl9oaSA9IHJvdHI2NF9oaSh4bCwgeGgsIDkpOyAgLy8gNDFcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBzMV81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDE0KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMTgpO1xuICB2YXIgYzJfbG8gPSByb3RyNjRfbG8oeGwsIHhoLCA5KTsgIC8vIDQxXG5cbiAgdmFyIHIgPSBjMF9sbyBeIGMxX2xvIF4gYzJfbG87XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gZzBfNTEyX2hpKHhoLCB4bCkge1xuICB2YXIgYzBfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAxKTtcbiAgdmFyIGMxX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgOCk7XG4gIHZhciBjMl9oaSA9IHNocjY0X2hpKHhoLCB4bCwgNyk7XG5cbiAgdmFyIHIgPSBjMF9oaSBeIGMxX2hpIF4gYzJfaGk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gZzBfNTEyX2xvKHhoLCB4bCkge1xuICB2YXIgYzBfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAxKTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgOCk7XG4gIHZhciBjMl9sbyA9IHNocjY0X2xvKHhoLCB4bCwgNyk7XG5cbiAgdmFyIHIgPSBjMF9sbyBeIGMxX2xvIF4gYzJfbG87XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gZzFfNTEyX2hpKHhoLCB4bCkge1xuICB2YXIgYzBfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAxOSk7XG4gIHZhciBjMV9oaSA9IHJvdHI2NF9oaSh4bCwgeGgsIDI5KTsgIC8vIDYxXG4gIHZhciBjMl9oaSA9IHNocjY0X2hpKHhoLCB4bCwgNik7XG5cbiAgdmFyIHIgPSBjMF9oaSBeIGMxX2hpIF4gYzJfaGk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gZzFfNTEyX2xvKHhoLCB4bCkge1xuICB2YXIgYzBfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAxOSk7XG4gIHZhciBjMV9sbyA9IHJvdHI2NF9sbyh4bCwgeGgsIDI5KTsgIC8vIDYxXG4gIHZhciBjMl9sbyA9IHNocjY0X2xvKHhoLCB4bCwgNik7XG5cbiAgdmFyIHIgPSBjMF9sbyBeIGMxX2xvIF4gYzJfbG87XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG52YXIgU0hBNTEyID0gcmVxdWlyZSgnLi81MTInKTtcblxuZnVuY3Rpb24gU0hBMzg0KCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBMzg0KSlcbiAgICByZXR1cm4gbmV3IFNIQTM4NCgpO1xuXG4gIFNIQTUxMi5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHhjYmJiOWQ1ZCwgMHhjMTA1OWVkOCxcbiAgICAweDYyOWEyOTJhLCAweDM2N2NkNTA3LFxuICAgIDB4OTE1OTAxNWEsIDB4MzA3MGRkMTcsXG4gICAgMHgxNTJmZWNkOCwgMHhmNzBlNTkzOSxcbiAgICAweDY3MzMyNjY3LCAweGZmYzAwYjMxLFxuICAgIDB4OGViNDRhODcsIDB4Njg1ODE1MTEsXG4gICAgMHhkYjBjMmUwZCwgMHg2NGY5OGZhNyxcbiAgICAweDQ3YjU0ODFkLCAweGJlZmE0ZmE0IF07XG59XG51dGlscy5pbmhlcml0cyhTSEEzODQsIFNIQTUxMik7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTM4NDtcblxuU0hBMzg0LmJsb2NrU2l6ZSA9IDEwMjQ7XG5TSEEzODQub3V0U2l6ZSA9IDM4NDtcblNIQTM4NC5obWFjU3RyZW5ndGggPSAxOTI7XG5TSEEzODQucGFkTGVuZ3RoID0gMTI4O1xuXG5TSEEzODQucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaC5zbGljZSgwLCAxMiksICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaC5zbGljZSgwLCAxMiksICdiaWcnKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5zaGExID0gcmVxdWlyZSgnLi9zaGEvMScpO1xuZXhwb3J0cy5zaGEyMjQgPSByZXF1aXJlKCcuL3NoYS8yMjQnKTtcbmV4cG9ydHMuc2hhMjU2ID0gcmVxdWlyZSgnLi9zaGEvMjU2Jyk7XG5leHBvcnRzLnNoYTM4NCA9IHJlcXVpcmUoJy4vc2hhLzM4NCcpO1xuZXhwb3J0cy5zaGE1MTIgPSByZXF1aXJlKCcuL3NoYS81MTInKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxudmFyIHJvdGwzMiA9IHV0aWxzLnJvdGwzMjtcbnZhciBzdW0zMiA9IHV0aWxzLnN1bTMyO1xudmFyIHN1bTMyXzMgPSB1dGlscy5zdW0zMl8zO1xudmFyIHN1bTMyXzQgPSB1dGlscy5zdW0zMl80O1xudmFyIEJsb2NrSGFzaCA9IGNvbW1vbi5CbG9ja0hhc2g7XG5cbmZ1bmN0aW9uIFJJUEVNRDE2MCgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJJUEVNRDE2MCkpXG4gICAgcmV0dXJuIG5ldyBSSVBFTUQxNjAoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcblxuICB0aGlzLmggPSBbIDB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjAgXTtcbiAgdGhpcy5lbmRpYW4gPSAnbGl0dGxlJztcbn1cbnV0aWxzLmluaGVyaXRzKFJJUEVNRDE2MCwgQmxvY2tIYXNoKTtcbmV4cG9ydHMucmlwZW1kMTYwID0gUklQRU1EMTYwO1xuXG5SSVBFTUQxNjAuYmxvY2tTaXplID0gNTEyO1xuUklQRU1EMTYwLm91dFNpemUgPSAxNjA7XG5SSVBFTUQxNjAuaG1hY1N0cmVuZ3RoID0gMTkyO1xuUklQRU1EMTYwLnBhZExlbmd0aCA9IDY0O1xuXG5SSVBFTUQxNjAucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUobXNnLCBzdGFydCkge1xuICB2YXIgQSA9IHRoaXMuaFswXTtcbiAgdmFyIEIgPSB0aGlzLmhbMV07XG4gIHZhciBDID0gdGhpcy5oWzJdO1xuICB2YXIgRCA9IHRoaXMuaFszXTtcbiAgdmFyIEUgPSB0aGlzLmhbNF07XG4gIHZhciBBaCA9IEE7XG4gIHZhciBCaCA9IEI7XG4gIHZhciBDaCA9IEM7XG4gIHZhciBEaCA9IEQ7XG4gIHZhciBFaCA9IEU7XG4gIGZvciAodmFyIGogPSAwOyBqIDwgODA7IGorKykge1xuICAgIHZhciBUID0gc3VtMzIoXG4gICAgICByb3RsMzIoXG4gICAgICAgIHN1bTMyXzQoQSwgZihqLCBCLCBDLCBEKSwgbXNnW3Jbal0gKyBzdGFydF0sIEsoaikpLFxuICAgICAgICBzW2pdKSxcbiAgICAgIEUpO1xuICAgIEEgPSBFO1xuICAgIEUgPSBEO1xuICAgIEQgPSByb3RsMzIoQywgMTApO1xuICAgIEMgPSBCO1xuICAgIEIgPSBUO1xuICAgIFQgPSBzdW0zMihcbiAgICAgIHJvdGwzMihcbiAgICAgICAgc3VtMzJfNChBaCwgZig3OSAtIGosIEJoLCBDaCwgRGgpLCBtc2dbcmhbal0gKyBzdGFydF0sIEtoKGopKSxcbiAgICAgICAgc2hbal0pLFxuICAgICAgRWgpO1xuICAgIEFoID0gRWg7XG4gICAgRWggPSBEaDtcbiAgICBEaCA9IHJvdGwzMihDaCwgMTApO1xuICAgIENoID0gQmg7XG4gICAgQmggPSBUO1xuICB9XG4gIFQgPSBzdW0zMl8zKHRoaXMuaFsxXSwgQywgRGgpO1xuICB0aGlzLmhbMV0gPSBzdW0zMl8zKHRoaXMuaFsyXSwgRCwgRWgpO1xuICB0aGlzLmhbMl0gPSBzdW0zMl8zKHRoaXMuaFszXSwgRSwgQWgpO1xuICB0aGlzLmhbM10gPSBzdW0zMl8zKHRoaXMuaFs0XSwgQSwgQmgpO1xuICB0aGlzLmhbNF0gPSBzdW0zMl8zKHRoaXMuaFswXSwgQiwgQ2gpO1xuICB0aGlzLmhbMF0gPSBUO1xufTtcblxuUklQRU1EMTYwLnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmgsICdsaXR0bGUnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaCwgJ2xpdHRsZScpO1xufTtcblxuZnVuY3Rpb24gZihqLCB4LCB5LCB6KSB7XG4gIGlmIChqIDw9IDE1KVxuICAgIHJldHVybiB4IF4geSBeIHo7XG4gIGVsc2UgaWYgKGogPD0gMzEpXG4gICAgcmV0dXJuICh4ICYgeSkgfCAoKH54KSAmIHopO1xuICBlbHNlIGlmIChqIDw9IDQ3KVxuICAgIHJldHVybiAoeCB8ICh+eSkpIF4gejtcbiAgZWxzZSBpZiAoaiA8PSA2MylcbiAgICByZXR1cm4gKHggJiB6KSB8ICh5ICYgKH56KSk7XG4gIGVsc2VcbiAgICByZXR1cm4geCBeICh5IHwgKH56KSk7XG59XG5cbmZ1bmN0aW9uIEsoaikge1xuICBpZiAoaiA8PSAxNSlcbiAgICByZXR1cm4gMHgwMDAwMDAwMDtcbiAgZWxzZSBpZiAoaiA8PSAzMSlcbiAgICByZXR1cm4gMHg1YTgyNzk5OTtcbiAgZWxzZSBpZiAoaiA8PSA0NylcbiAgICByZXR1cm4gMHg2ZWQ5ZWJhMTtcbiAgZWxzZSBpZiAoaiA8PSA2MylcbiAgICByZXR1cm4gMHg4ZjFiYmNkYztcbiAgZWxzZVxuICAgIHJldHVybiAweGE5NTNmZDRlO1xufVxuXG5mdW5jdGlvbiBLaChqKSB7XG4gIGlmIChqIDw9IDE1KVxuICAgIHJldHVybiAweDUwYTI4YmU2O1xuICBlbHNlIGlmIChqIDw9IDMxKVxuICAgIHJldHVybiAweDVjNGRkMTI0O1xuICBlbHNlIGlmIChqIDw9IDQ3KVxuICAgIHJldHVybiAweDZkNzAzZWYzO1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAweDdhNmQ3NmU5O1xuICBlbHNlXG4gICAgcmV0dXJuIDB4MDAwMDAwMDA7XG59XG5cbnZhciByID0gW1xuICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LFxuICA3LCA0LCAxMywgMSwgMTAsIDYsIDE1LCAzLCAxMiwgMCwgOSwgNSwgMiwgMTQsIDExLCA4LFxuICAzLCAxMCwgMTQsIDQsIDksIDE1LCA4LCAxLCAyLCA3LCAwLCA2LCAxMywgMTEsIDUsIDEyLFxuICAxLCA5LCAxMSwgMTAsIDAsIDgsIDEyLCA0LCAxMywgMywgNywgMTUsIDE0LCA1LCA2LCAyLFxuICA0LCAwLCA1LCA5LCA3LCAxMiwgMiwgMTAsIDE0LCAxLCAzLCA4LCAxMSwgNiwgMTUsIDEzXG5dO1xuXG52YXIgcmggPSBbXG4gIDUsIDE0LCA3LCAwLCA5LCAyLCAxMSwgNCwgMTMsIDYsIDE1LCA4LCAxLCAxMCwgMywgMTIsXG4gIDYsIDExLCAzLCA3LCAwLCAxMywgNSwgMTAsIDE0LCAxNSwgOCwgMTIsIDQsIDksIDEsIDIsXG4gIDE1LCA1LCAxLCAzLCA3LCAxNCwgNiwgOSwgMTEsIDgsIDEyLCAyLCAxMCwgMCwgNCwgMTMsXG4gIDgsIDYsIDQsIDEsIDMsIDExLCAxNSwgMCwgNSwgMTIsIDIsIDEzLCA5LCA3LCAxMCwgMTQsXG4gIDEyLCAxNSwgMTAsIDQsIDEsIDUsIDgsIDcsIDYsIDIsIDEzLCAxNCwgMCwgMywgOSwgMTFcbl07XG5cbnZhciBzID0gW1xuICAxMSwgMTQsIDE1LCAxMiwgNSwgOCwgNywgOSwgMTEsIDEzLCAxNCwgMTUsIDYsIDcsIDksIDgsXG4gIDcsIDYsIDgsIDEzLCAxMSwgOSwgNywgMTUsIDcsIDEyLCAxNSwgOSwgMTEsIDcsIDEzLCAxMixcbiAgMTEsIDEzLCA2LCA3LCAxNCwgOSwgMTMsIDE1LCAxNCwgOCwgMTMsIDYsIDUsIDEyLCA3LCA1LFxuICAxMSwgMTIsIDE0LCAxNSwgMTQsIDE1LCA5LCA4LCA5LCAxNCwgNSwgNiwgOCwgNiwgNSwgMTIsXG4gIDksIDE1LCA1LCAxMSwgNiwgOCwgMTMsIDEyLCA1LCAxMiwgMTMsIDE0LCAxMSwgOCwgNSwgNlxuXTtcblxudmFyIHNoID0gW1xuICA4LCA5LCA5LCAxMSwgMTMsIDE1LCAxNSwgNSwgNywgNywgOCwgMTEsIDE0LCAxNCwgMTIsIDYsXG4gIDksIDEzLCAxNSwgNywgMTIsIDgsIDksIDExLCA3LCA3LCAxMiwgNywgNiwgMTUsIDEzLCAxMSxcbiAgOSwgNywgMTUsIDExLCA4LCA2LCA2LCAxNCwgMTIsIDEzLCA1LCAxNCwgMTMsIDEzLCA3LCA1LFxuICAxNSwgNSwgOCwgMTEsIDE0LCAxNCwgNiwgMTQsIDYsIDksIDEyLCA5LCAxMiwgNSwgMTUsIDgsXG4gIDgsIDUsIDEyLCA5LCAxMiwgNSwgMTQsIDYsIDgsIDEzLCA2LCA1LCAxNSwgMTMsIDExLCAxMVxuXTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG5mdW5jdGlvbiBIbWFjKGhhc2gsIGtleSwgZW5jKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBIbWFjKSlcbiAgICByZXR1cm4gbmV3IEhtYWMoaGFzaCwga2V5LCBlbmMpO1xuICB0aGlzLkhhc2ggPSBoYXNoO1xuICB0aGlzLmJsb2NrU2l6ZSA9IGhhc2guYmxvY2tTaXplIC8gODtcbiAgdGhpcy5vdXRTaXplID0gaGFzaC5vdXRTaXplIC8gODtcbiAgdGhpcy5pbm5lciA9IG51bGw7XG4gIHRoaXMub3V0ZXIgPSBudWxsO1xuXG4gIHRoaXMuX2luaXQodXRpbHMudG9BcnJheShrZXksIGVuYykpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBIbWFjO1xuXG5IbWFjLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIGluaXQoa2V5KSB7XG4gIC8vIFNob3J0ZW4ga2V5LCBpZiBuZWVkZWRcbiAgaWYgKGtleS5sZW5ndGggPiB0aGlzLmJsb2NrU2l6ZSlcbiAgICBrZXkgPSBuZXcgdGhpcy5IYXNoKCkudXBkYXRlKGtleSkuZGlnZXN0KCk7XG4gIGFzc2VydChrZXkubGVuZ3RoIDw9IHRoaXMuYmxvY2tTaXplKTtcblxuICAvLyBBZGQgcGFkZGluZyB0byBrZXlcbiAgZm9yICh2YXIgaSA9IGtleS5sZW5ndGg7IGkgPCB0aGlzLmJsb2NrU2l6ZTsgaSsrKVxuICAgIGtleS5wdXNoKDApO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBrZXkubGVuZ3RoOyBpKyspXG4gICAga2V5W2ldIF49IDB4MzY7XG4gIHRoaXMuaW5uZXIgPSBuZXcgdGhpcy5IYXNoKCkudXBkYXRlKGtleSk7XG5cbiAgLy8gMHgzNiBeIDB4NWMgPSAweDZhXG4gIGZvciAoaSA9IDA7IGkgPCBrZXkubGVuZ3RoOyBpKyspXG4gICAga2V5W2ldIF49IDB4NmE7XG4gIHRoaXMub3V0ZXIgPSBuZXcgdGhpcy5IYXNoKCkudXBkYXRlKGtleSk7XG59O1xuXG5IbWFjLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUobXNnLCBlbmMpIHtcbiAgdGhpcy5pbm5lci51cGRhdGUobXNnLCBlbmMpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkhtYWMucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgdGhpcy5vdXRlci51cGRhdGUodGhpcy5pbm5lci5kaWdlc3QoKSk7XG4gIHJldHVybiB0aGlzLm91dGVyLmRpZ2VzdChlbmMpO1xufTtcbiIsCiAgICAidmFyIGhhc2ggPSBleHBvcnRzO1xuXG5oYXNoLnV0aWxzID0gcmVxdWlyZSgnLi9oYXNoL3V0aWxzJyk7XG5oYXNoLmNvbW1vbiA9IHJlcXVpcmUoJy4vaGFzaC9jb21tb24nKTtcbmhhc2guc2hhID0gcmVxdWlyZSgnLi9oYXNoL3NoYScpO1xuaGFzaC5yaXBlbWQgPSByZXF1aXJlKCcuL2hhc2gvcmlwZW1kJyk7XG5oYXNoLmhtYWMgPSByZXF1aXJlKCcuL2hhc2gvaG1hYycpO1xuXG4vLyBQcm94eSBoYXNoIGZ1bmN0aW9ucyB0byB0aGUgbWFpbiBvYmplY3Rcbmhhc2guc2hhMSA9IGhhc2guc2hhLnNoYTE7XG5oYXNoLnNoYTI1NiA9IGhhc2guc2hhLnNoYTI1Njtcbmhhc2guc2hhMjI0ID0gaGFzaC5zaGEuc2hhMjI0O1xuaGFzaC5zaGEzODQgPSBoYXNoLnNoYS5zaGEzODQ7XG5oYXNoLnNoYTUxMiA9IGhhc2guc2hhLnNoYTUxMjtcbmhhc2gucmlwZW1kMTYwID0gaGFzaC5yaXBlbWQucmlwZW1kMTYwO1xuIiwKICAgICJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgZG91Ymxlczoge1xuICAgIHN0ZXA6IDQsXG4gICAgcG9pbnRzOiBbXG4gICAgICBbXG4gICAgICAgICdlNjBmY2U5M2I1OWU5ZWM1MzAxMWFhYmMyMWMyM2U5N2IyYTMxMzY5Yjg3YTVhZTljNDRlZTg5ZTJhNmRlYzBhJyxcbiAgICAgICAgJ2Y3ZTM1MDczOTllNTk1OTI5ZGI5OWYzNGY1NzkzNzEwMTI5Njg5MWU0NGQyM2YwYmUxZjMyY2NlNjk2MTY4MjEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzgyODIyNjMyMTJjNjA5ZDllYTJhNmUzZTE3MmRlMjM4ZDhjMzljYWJkNWFjMWNhMTA2NDZlMjNmZDVmNTE1MDgnLFxuICAgICAgICAnMTFmOGE4MDk4NTU3ZGZlNDVlODI1NmU4MzBiNjBhY2U2MmQ2MTNhYzJmN2IxN2JlZDMxYjZlYWZmNmUyNmNhZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTc1ZTE1OWY3MjhiODY1YTcyZjk5Y2M2YzZmYzg0NmRlMGI5MzgzM2ZkMjIyMmVkNzNmY2U1YjU1MWU1YjczOScsXG4gICAgICAgICdkMzUwNmUwZDllM2M3OWViYTRlZjk3YTUxZmY3MWY1ZWFjYjU5NTVhZGQyNDM0NWM2ZWZhNmZmZWU5ZmVkNjk1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNjNkOTBkNDQ3YjAwYzljOTljZWFjMDViNjI2MmVlMDUzNDQxYzdlNTU1NTJmZmU1MjZiYWQ4ZjgzZmY0NjQwJyxcbiAgICAgICAgJzRlMjczYWRmYzczMjIyMTk1M2I0NDUzOTdmMzM2MzE0NWI5YTg5MDA4MTk5ZWNiNjIwMDNjN2YzYmVlOWRlOScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGI0YjVmMTY1ZGYzYzJiZThjNjI0NGI1Yjc0NTYzODg0M2U0YTc4MWExNWJjZDFiNjlmNzlhNTVkZmZkZjgwYycsXG4gICAgICAgICc0YWFkMGE2ZjY4ZDMwOGI0YjNmYmQ3ODEzYWIwZGEwNGY5ZTMzNjU0NjE2MmVlNTZiM2VmZjBjNjVmZDRmZDM2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3MjNjYmFhNmU1ZGI5OTZkNmJmNzcxYzAwYmQ1NDhjN2I3MDBkYmZmYTZjMGU3N2JjYjYxMTU5MjUyMzJmY2RhJyxcbiAgICAgICAgJzk2ZTg2N2I1NTk1Y2M0OThhOTIxMTM3NDg4ODI0ZDZlMjY2MGEwNjUzNzc5NDk0ODAxZGMwNjlkOWViMzlmNWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VlYmZhNGQ0OTNiZWJmOThiYTVmZWVjODEyYzJkM2I1MDk0Nzk2MTIzN2E5MTk4MzlhNTMzZWNhMGU3ZGQ3ZmEnLFxuICAgICAgICAnNWQ5YThjYTM5NzBlZjBmMjY5ZWU3ZWRhZjE3ODA4OWQ5YWU0Y2RjM2E3MTFmNzEyZGRmZDRmZGFlMWRlODk5OScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTAwZjQ0ZGE2OTZlNzE2NzI3OTFkMGEwOWI3YmRlNDU5ZjEyMTVhMjliM2MwM2JmZWZkNzgzNWIzOWE0OGRiMCcsXG4gICAgICAgICdjZGQ5ZTEzMTkyYTAwYjc3MmVjOGYzMzAwYzA5MDY2NmI3ZmY0YTE4ZmY1MTk1YWMwZmJkNWNkNjJiYzY1YTA5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlMTAzMWJlMjYyYzdlZDFiMWRjOTIyN2E0YTA0YzAxN2E3N2Y4ZDQ0NjRmM2IzODUyYzhhY2RlNmU1MzRmZDJkJyxcbiAgICAgICAgJzlkNzA2MTkyODk0MDQwNWU2YmI2YTQxNzY1OTc1MzVhZjI5MmRkNDE5ZTFjZWQ3OWE0NGYxOGYyOTQ1NmEwMGQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ZlZWE2Y2FlNDZkNTViNTMwYWMyODM5ZjE0M2JkN2VjNWNmOGIyNjZhNDFkNmFmNTJkNWU2ODhkOTA5NDY5NmQnLFxuICAgICAgICAnZTU3YzZiNmM5N2RjZTFiYWIwNmU0ZTEyYmYzZWNkNWM5ODFjODk1N2NjNDE0NDJkMzE1NWRlYmYxODA5MDA4OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGE2N2E5MWQ5MTA0OWNkY2IzNjdiZTRiZTZmZmNhM2NmZWVkNjU3ZDgwODU4M2RlMzNmYTk3OGJjMWVjNmNiMScsXG4gICAgICAgICc5YmFjYWEzNTQ4MTY0MmJjNDFmNDYzZjdlYzk3ODBlNWRlYzdhZGM1MDhmNzQwYTE3ZTllYThlMjdhNjhiZTFkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1MzkwNGZhYTBiMzM0Y2RkYTZlMDAwOTM1ZWYyMjE1MWVjMDhkMGY3YmIxMTA2OWY1NzU0NWNjYzFhMzdiN2MwJyxcbiAgICAgICAgJzViYzA4N2QwYmM4MDEwNmQ4OGM5ZWNjYWMyMGQzYzFjMTM5OTk5ODFlMTQ0MzQ2OTlkY2IwOTZiMDIyNzcxYzgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhlN2JjZDBiZDM1OTgzYTc3MTljY2E3NzY0Y2E5MDY3NzliNTNhMDQzYTliOGJjYWVmZjk1OWY0M2FkODYwNDcnLFxuICAgICAgICAnMTBiNzc3MGIyYTNkYTRiMzk0MDMxMDQyMGNhOTUxNDU3OWU4OGUyZTQ3ZmQ2OGIzZWExMDA0N2U4NDYwMzcyYScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzg1ZWVkMzRjMWNkZmYyMWU2ZDA4MTg2ODliODFiZGU3MWE3ZjRmMTgzOTdlNjY5MGE4NDFlMTU5OWM0Mzg2MicsXG4gICAgICAgICcyODNiZWJjM2U4ZWEyM2Y1NjcwMWRlMTllOWViZjQ1NzZiMzA0ZWVjMjA4NmRjOGNjMDQ1OGZlNTU0MmU1NDUzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2ZjlkOWI4MDNlY2YxOTE2MzdjNzNhNDQxM2RmYTE4MGZkZGY4NGE1OTQ3ZmJjOWM2MDZlZDg2YzNmYWMzYTcnLFxuICAgICAgICAnN2M4MGM2OGU2MDMwNTliYTY5YjhlMmEzMGU0NWM0ZDQ3ZWE0ZGQyZjVjMjgxMDAyZDg2ODkwNjAzYTg0MjE2MCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzMyMmQ0MDEyNDNjNGUyNTgyYTIxNDdjMTA0ZDZlY2JmNzc0ZDE2M2RiMGY1ZTUzMTNiN2UwZTc0MmQwZTZiZCcsXG4gICAgICAgICc1NmU3MDc5N2U5NjY0ZWY1YmZiMDE5YmM0ZGRhZjliNzI4MDVmNjNlYTI4NzNhZjYyNGYzYTJlOTZjMjhiMmEwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NTY3MmM3ZDJkZTBiN2RhMmJkMTc3MGQ4OTY2NTg2ODc0MWIzZjlhZjc2NDMzOTc3MjFkNzRkMjgxMzRhYjgzJyxcbiAgICAgICAgJzdjNDgxYjliNWI0M2IyZWI2Mzc0MDQ5YmZhNjJjMmU1ZTc3ZjE3ZmNjNTI5OGY0NGM4ZTMwOTRmNzkwMzEzYTYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzk0OGJmODA5YjE5ODhhNDZiMDZjOWYxOTE5NDEzYjEwZjkyMjZjNjBmNjY4ODMyZmZkOTU5YWY2MGM4MmEwYScsXG4gICAgICAgICc1M2E1NjI4NTZkY2I2NjQ2ZGM2Yjc0YzVkMWMzNDE4YzZkNGRmZjA4Yzk3Y2QyYmVkNGNiN2Y4OGQ4YzhlNTg5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2MjYwY2U3ZjQ2MTgwMWMzNGYwNjdjZTBmMDI4NzNhOGYxYjBlNDRkZmM2OTc1MmFjY2VjZDgxOWYzOGZkOGU4JyxcbiAgICAgICAgJ2JjMmRhODJiNmZhNWI1NzFhN2YwOTA0OTc3NmExZWY3ZWNkMjkyMjM4MDUxYzE5OGMxYTg0ZTk1YjJiNGFlMTcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U1MDM3ZGUwYWZjMWQ4ZDQzZDgzNDg0MTRiYmY0MTAzMDQzZWM4ZjU3NWJmZGM0MzI5NTNjYzhkMjAzN2ZhMmQnLFxuICAgICAgICAnNDU3MTUzNGJhYTk0ZDNiNWY5Zjk4ZDA5ZmI5OTBiZGRiZDVmNWIwM2VjNDgxZjEwZTBlNWRjODQxZDc1NWJkYScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTA2MzcyYjBmNGEyMDdhZGY1ZWE5MDVlOGYxNzcxYjRlN2U4ZGJkMWM2YTZjNWI3MjU4NjZhMGFlNGZjZTcyNScsXG4gICAgICAgICc3YTkwODk3NGJjZTE4Y2ZlMTJhMjdiYjJhZDVhNDg4Y2Q3NDg0YTc3ODcxMDQ4NzBiMjcwMzRmOTRlZWUzMWRkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyMTNjN2E3MTVjZDVkNDUzNThkMGJiZjlkYzBjZTAyMjA0YjEwYmRkZTJhM2Y1ODU0MGFkNjkwOGQwNTU5NzU0JyxcbiAgICAgICAgJzRiNmRhZDBiNWFlNDYyNTA3MDEzYWQwNjI0NWJhMTkwYmI0ODUwZjVmMzZhN2VlZGRmZjJjMjc1MzRiNDU4ZjInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRlN2MyNzJhN2FmNGIzNGU4ZGJiOTM1MmE1NDE5YTg3ZTI4MzhjNzBhZGM2MmNkZGYwY2MzYTNiMDhmYmQ1M2MnLFxuICAgICAgICAnMTc3NDljNzY2YzlkMGIxOGUxNmZkMDlmNmRlZjY4MWI1MzBiOTYxNGJmZjdkZDMzZTBiMzk0MTgxN2RjYWFlNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmVhNzRlM2RiZTc3OGIxYjEwZjIzOGFkNjE2ODZhYTVjNzZlM2RiMmJlNDMwNTc2MzI0MjdlMjg0MGZiMjdiNicsXG4gICAgICAgICc2ZTA1NjhkYjliMGIxMzI5N2NmNjc0ZGVjY2I2YWY5MzEyNmI1OTZiOTczZjdiNzc3MDFkM2RiN2YyM2NiOTZmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NmU2NDExM2Y2NzdjZjBlMTBhMjU3MGQ1OTk5NjhkMzE1NDRlMTc5Yjc2MDQzMjk1MmMwMmE0NDE3YmRkZTM5JyxcbiAgICAgICAgJ2M5MGRkZjhkZWU0ZTk1Y2Y1NzcwNjZkNzA2ODFmMGQzNWUyYTMzZDJiNTZkMjAzMmI0YjE3NTJkMTkwMWFjMDEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M3MzhjNTZiMDNiMmFiZTFlODI4MWJhYTc0M2Y4ZjlhOGY3Y2M2NDNkZjI2Y2JlZTNhYjE1MDI0MmJjYmI4OTEnLFxuICAgICAgICAnODkzZmI1Nzg5NTFhZDI1MzdmNzE4ZjJlYWNiZmJiYmI4MjMxNGVlZjc4ODBjZmU5MTdlNzM1ZDk2OTlhODRjMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDg5NTYyNjU0OGI2NWI4MWUyNjRjNzYzN2M5NzI4NzdkMWQ3MmU1ZjNhOTI1MDE0MzcyZTlmNjU4OGY2YzE0YicsXG4gICAgICAgICdmZWJmYWEzOGYyYmM3ZWFlNzI4ZWM2MDgxOGMzNDBlYjAzNDI4ZDYzMmJiMDY3ZTE3OTM2M2VkNzVkN2Q5OTFmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiOGRhOTQwMzJhOTU3NTE4ZWIwZjY0MzM1NzFlODc2MWNlZmZjNzM2OTNlODRlZGQ0OTE1MGE1NjRmNjc2ZTAzJyxcbiAgICAgICAgJzI4MDRkZmE0NDgwNWExZTRkN2M5OWNjOTc2MjgwOGIwOTJjYzU4NGQ5NWZmM2I1MTE0ODhlNGU3NGVmZGY2ZTcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U4MGZlYTE0NDQxZmIzM2E3ZDhhZGFiOTQ3NWQ3ZmFiMjAxOWVmZmI1MTU2YTc5MmYxYTExNzc4ZTNjMGRmNWQnLFxuICAgICAgICAnZWVkMWRlN2Y2MzhlMDA3NzFlODk3NjhjYTNjYTk0NDcyZDE1NWU4MGFmMzIyZWE5ZmNiNDI5MWI2YWM5ZWM3OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTMwMTY5N2JkZmNkNzA0MzEzYmE0OGU1MWQ1Njc1NDNmMmExODIwMzFlZmQ2OTE1ZGRjMDdiYmNjNGUxNjA3MCcsXG4gICAgICAgICc3MzcwZjkxY2ZiNjdlNGY1MDgxODA5ZmEyNWQ0MGY5YjE3MzVkYmY3YzBhMTFhMTMwYzBkMWEwNDFlMTc3ZWExJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5MGFkODViMzg5ZDZiOTM2NDYzZjlkMDUxMjY3OGRlMjA4Y2MzMzBiMTEzMDdmZmZhYjdhYzYzZTNmYjA0ZWQ0JyxcbiAgICAgICAgJ2U1MDdhMzYyMGEzODI2MWFmZmRjYmQ5NDI3MjIyYjgzOWFlZmFiZTE1ODI4OTRkOTkxZDRkNDhjYjZlZjE1MCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGY2OGI5ZDJmNjNiNWYzMzkyMzljMWFkOTgxZjE2MmVlODhjNTY3ODcyM2VhMzM1MWI3YjQ0NGM5ZWM0YzBkYScsXG4gICAgICAgICc2NjJhOWYyZGJhMDYzOTg2ZGUxZDkwYzJiNmJlMjE1ZGJiZWEyY2ZlOTU1MTBiZmRmMjNjYmY3OTUwMWZmZjgyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNGYzZmIwMTc2YWY4NWQ2NWZmOTlmZjkxOThjMzYwOTFmNDhlODY1MDM2ODFlM2U2Njg2ZmQ1MDUzMjMxZTExJyxcbiAgICAgICAgJzFlNjM2MzNhZDBlZjRmMWMxNjYxYTZkMGVhMDJiNzI4NmNjN2U3NGVjOTUxZDFjOTgyMmMzODU3NmZlYjczYmMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhjMDBmYTliMThlYmYzMzFlYjk2MTUzN2E0NWE0MjY2YzcwMzRmMmYwZDRlMWQwNzE2ZmI2ZWFlMjBlYWUyOWUnLFxuICAgICAgICAnZWZhNDcyNjdmZWE1MjFhMWE5ZGMzNDNhMzczNmM5NzRjMmZhZGFmYTgxZTM2YzU0ZTdkMmE0YzY2NzAyNDE0YicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTdhMjZjZTY5ZGQ0ODI5ZjNlMTBjZWMwYTllOThlZDMxNDNkMDg0ZjMwOGI5MmMwOTk3ZmRkZmM2MGNiM2U0MScsXG4gICAgICAgICcyYTc1OGUzMDBmYTc5ODRiNDcxYjAwNmExYWFmYmIxOGQwYTZiMmMwNDIwZTgzZTIwZThhOTQyMWNmMmNmZDUxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiNjQ1OWUwZWUzNjYyZWM4ZDIzNTQwYzIyM2JjYmRjNTcxY2JjYjk2N2Q3OTQyNGYzY2YyOWViM2RlNmI4MGVmJyxcbiAgICAgICAgJzY3Yzg3NmQwNmYzZTA2ZGUxZGFkZjE2ZTU2NjFkYjNjNGIzYWU2ZDQ4ZTM1YjJmZjMwYmYwYjYxYTcxYmE0NScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDY4YTgwYzgyODBiYjg0MDc5MzIzNGFhMTE4ZjA2MjMxZDZmMWZjNjdlNzNjNWE1ZGVkYTBmNWI0OTY5NDNlOCcsXG4gICAgICAgICdkYjhiYTlmZmY0YjU4NmQwMGM0YjFmOTE3N2IwZTI4YjViMGU3YjhmNzg0NTI5NWEyOTRjODQyNjZiMTMzMTIwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMjRhZWQ3ZGY2NWM4MDQyNTJkYzAyNzA5MDdhMzBiMDk2MTJhZWI5NzM0NDljZWE0MDk1OTgwZmMyOGQzZDVkJyxcbiAgICAgICAgJzY0OGEzNjU3NzRiNjFmMmZmMTMwYzBjMzVhZWMxZjRmMTkyMTNiMGM3ZTMzMjg0Mzk2NzIyNGFmOTZhYjdjODQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRkZjljMTQ5MTljZGU2MWY2ZDUxZGZkYmU1ZmVlNWRjZWVjNDE0M2JhOGQxY2E4ODhlOGJkMzczZmQwNTRjOTYnLFxuICAgICAgICAnMzVlYzUxMDkyZDg3MjgwNTA5NzRjMjNhMWQ4NWQ0YjVkNTA2Y2RjMjg4NDkwMTkyZWJhYzA2Y2FkMTBkNWQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzljMzkxOWE4NGE0NzQ4NzBmYWVkOGE5YzFjYzY2MDIxNTIzNDg5MDU0ZDdmMDMwOGNiZmM5OWM4YWMxZjk4Y2QnLFxuICAgICAgICAnZGRiODRmMGY0YTRkZGQ1NzU4NGYwNDRiZjI2MGU2NDE5MDUzMjZmNzZjNjRjOGU2YmU3ZTVlMDNkNGZjNTk5ZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjA1NzE3MGIxZGQxMmZkZjhkZTA1ZjI4MWQ4ZTA2YmI5MWUxNDkzYThiOTFkNGNjNWEyMTM4MjEyMGE5NTllNScsXG4gICAgICAgICc5YTFhZjBiMjZhNmE0ODA3YWRkOWEyZGFmNzFkZjI2MjQ2NTE1MmJjM2VlMjRjNjVlODk5YmU5MzIzODVhMmE4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhNTc2ZGY4ZTIzYTA4NDExNDIxNDM5YTQ1MThkYTMxODgwY2VmMGZiYTdkNGRmMTJiMWE2OTczZWVjYjk0MjY2JyxcbiAgICAgICAgJzQwYTZiZjIwZTc2NjQwYjJjOTJiOTdhZmU1OGNkODJjNDMyZTEwYTdmNTE0ZDlmM2VlOGJlMTFhZTFiMjhlYzgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3NzhhNzhjMjhkZWMzZTMwYTA1ZmU5NjI5ZGU4YzM4YmIzMGQxZjVjZjlhM2EyMDhmNzYzODg5YmU1OGFkNzEnLFxuICAgICAgICAnMzQ2MjZkOWFiNWE1YjIyZmY3MDk4ZTEyZjJmZjU4MDA4N2IzODQxMWZmMjRhYzU2M2I1MTNmYzFmZDlmNDNhYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTI4OTU1ZWU2MzdhODQ0NjM3MjlmZDMwZTdhZmQyZWQ1Zjk2Mjc0ZTVhZDdlNWNiMDllZGE5YzA2ZDkwM2FjJyxcbiAgICAgICAgJ2MyNTYyMTAwM2QzZjQyYTgyN2I3OGExMzA5M2E5NWVlYWMzZDI2ZWZhOGE4ZDgzZmM1MTgwZTkzNWJjZDA5MWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg1ZDBmZWYzZWM2ZGIxMDkzOTkwNjRmM2EwZTNiMjg1NTY0NWI0YTkwN2FkMzU0NTI3YWFlNzUxNjNkODI3NTEnLFxuICAgICAgICAnMWYwMzY0ODQxM2EzOGMwYmUyOWQ0OTZlNTgyY2Y1NjYzZTg3NTFlOTY4NzczMzE1ODJjMjM3YTI0ZWIxZjk2MicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmYyYjBkY2U5N2VlY2U5N2MxYzliNjA0MTc5OGI4NWRmZGZiNmQ4ODgyZGEyMDMwOGY1NDA0ODI0NTI2MDg3ZScsXG4gICAgICAgICc0OTNkMTNmZWY1MjRiYTE4OGFmNGM0ZGM1NGQwNzkzNmM3YjdlZDZmYjkwZTJjZWIyYzk1MWUwMWYwYzI5OTA3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4MjdmYmJlNGIxZTg4MGVhOWVkMmIyZTYzMDFiMjEyYjU3ZjFlZTE0OGNkNmRkMjg3ODBlNWUyY2Y4NTZlMjQxJyxcbiAgICAgICAgJ2M2MGY5YzkyM2M3MjdiMGI3MWJlZjJjNjdkMWQxMjY4N2ZmN2E2MzE4NjkwMzE2NmQ2MDViNjhiYWVjMjkzZWMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VhYTY0OWYyMWY1MWJkYmFlN2JlNGFlMzRjZTZlNTIxN2E1OGZkY2U3ZjQ3ZjlhYTdmM2I1OGZhMjEyMGUyYjMnLFxuICAgICAgICAnYmUzMjc5ZWQ1YmJiYjAzYWM2OWE4MGY4OTg3OWFhNWEwMWE2Yjk2NWYxM2Y3ZTU5ZDQ3YTUzMDViYTVhZDkzZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTRhNDJkNDNjNWNmMTY5ZDkzOTFkZjZkZWNmNDJlZTU0MWI2ZDhmMGM5YTEzNzQwMWUyMzYzMmRkYTM0ZDI0ZicsXG4gICAgICAgICc0ZDlmOTJlNzE2ZDFjNzM1MjZmYzk5Y2NmYjhhZDM0Y2U4ODZlZWRmYThkOGU0ZjEzYTdmNzEzMWRlYmE5NDE0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxZWM4MGZlZjM2MGNiZGQ5NTQxNjBmYWRhYjM1MmI2YjkyYjUzNTc2YTg4ZmVhNDk0NzE3M2I5ZDQzMDBiZjE5JyxcbiAgICAgICAgJ2FlZWZlOTM3NTZiNTM0MGQyZjNhNDk1OGE3YWJiZjVlMDE0NmU3N2Y2Mjk1YTA3YjY3MWNkYzFjYzEwN2NlZmQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE0NmE3NzhjMDQ2NzBjMmY5MWIwMGFmNDY4MGRmYThiY2UzNDkwNzE3ZDU4YmE4ODlkZGI1OTI4MzY2NjQyYmUnLFxuICAgICAgICAnYjMxOGUwZWMzMzU0MDI4YWRkNjY5ODI3ZjlkNGIyODcwYWFhOTcxZDJmN2U1ZWQxZDBiMjk3NDgzZDgzZWZkMCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmE1MGMwZjYxZDIyZTVmMDdlM2FjZWJiMWFhMDdiMTI4ZDAwMTIyMDlhMjhiOTc3NmQ3NmE4NzkzMTgwZWVmOScsXG4gICAgICAgICc2Yjg0YzY5MjIzOTdlYmE5YjcyY2QyODcyMjgxYTY4YTVlNjgzMjkzYTU3YTIxM2IzOGNkOGQ3ZDNmNGYyODExJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkYTFkNjFkMGNhNzIxYTExYjFhNWJmNmI3ZDg4ZTg0MjFhMjg4YWI1ZDViYmE1MjIwZTUzZDMyYjVmMDY3ZWMyJyxcbiAgICAgICAgJzgxNTdmNTVhN2M5OTMwNmM3OWMwNzY2MTYxYzkxZTI5NjZhNzM4OTlkMjc5YjQ4YTY1NWZiYTBmMWFkODM2ZjEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E4ZTI4MmZmMGM5NzA2OTA3MjE1ZmY5OGU4ZmQ0MTY2MTUzMTFkZTA0NDZmMWUwNjJhNzNiMDYxMGQwNjRlMTMnLFxuICAgICAgICAnN2Y5NzM1NWI4ZGI4MWMwOWFiZmI3ZjNjNWIyNTE1ODg4YjY3OWEzZTUwZGQ2YmQ2Y2VmN2M3MzExMWY0Y2MwYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTc0YTUzYjljOWEyODU4NzJkMzllNTZlNjkxM2NhYjE1ZDU5YjFmYTUxMjUwOGMwMjJmMzgyZGU4MzE5NDk3YycsXG4gICAgICAgICdjY2M5ZGMzN2FiZmM5YzE2NTdiNDE1NWYyYzQ3ZjllNjY0NmIzYTFkOGNiOTg1NDM4M2RhMTNhYzA3OWFmYTczJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5NTkzOTY5ODE5NDM3ODVjM2QzZTU3ZWRmNTAxOGNkYmUwMzllNzMwZTQ5MThiM2Q4ODRmZGZmMDk0NzViN2JhJyxcbiAgICAgICAgJzJlN2U1NTI4ODhjMzMxZGQ4YmEwMzg2YTRiOWNkNjg0OWM2NTNmNjRjODcwOTM4NWU5YjhhYmY4NzUyNGYyZmQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QyYTYzYTUwYWU0MDFlNTZkNjQ1YTExNTNiMTA5YThmY2NhMGE0M2Q1NjFmYmEyZGJiNTEzNDBjOWQ4MmIxNTEnLFxuICAgICAgICAnZTgyZDg2ZmI2NDQzZmNiNzU2NWFlZTU4YjI5NDgyMjBhNzBmNzUwYWY0ODRjYTUyZDQxNDIxNzRkY2Y4OTQwNScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjQ1ODdlMjMzNTQ3MWViODkwZWU3ODk2ZDdjZmRjODY2YmFjYmRiZDM4MzkzMTdiMzQzNmY5YjQ1NjE3ZTA3MycsXG4gICAgICAgICdkOTlmY2RkNWJmNjkwMmUyYWU5NmRkNjQ0N2MyOTlhMTg1YjkwYTM5MTMzYWVhYjM1ODI5OWU1ZTlmYWY2NTg5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NDgxYmRlMGU0ZTRkODg1YjNhNTQ2ZDNlNTQ5ZGUwNDJmMGFhNmNlYTI1MGU3ZmQzNThkNmM4NmRkNDVlNDU4JyxcbiAgICAgICAgJzM4ZWU3YjhjYmE1NDA0ZGQ4NGEyNWJmMzljZWNiMmNhOTAwYTc5YzQyYjI2MmU1NTZkNjRiMWI1OTc3OTA1N2UnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzEzNDY0YTU3YTc4MTAyYWE2MmI2OTc5YWU4MTdmNDYzN2ZmY2ZlZDNjNGIxY2UzMGJjZDYzMDNmNmNhZjY2NmInLFxuICAgICAgICAnNjliZTE1OTAwNDYxNDU4MGVmN2U0MzM0NTNjY2IwY2E0OGYzMDBhODFkMDk0MmUxM2Y0OTVhOTA3ZjZlY2MyNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYmM0YTlkZjViNzEzZmUyZTlhZWY0MzBiY2MxZGM5N2EwY2Q5Y2NlZGUyZjI4NTg4Y2FkYTNhMGQyZDgzZjM2NicsXG4gICAgICAgICdkM2E4MWNhNmU3ODVjMDYzODM5MzdhZGY0Yjc5OGNhYTZlOGE5ZmJmYTU0N2IxNmQ3NThkNjY2NTgxZjMzYzEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhjMjhhOTdiZjgyOThiYzBkMjNkOGM3NDk0NTJhMzJlNjk0YjY1ZTMwYTk0NzJhMzk1NGFiMzBmZTUzMjRjYWEnLFxuICAgICAgICAnNDBhMzA0NjNhMzMwNTE5MzM3OGZlZGYzMWY3Y2MwZWI3YWU3ODRmMDQ1MWNiOTQ1OWU3MWRjNzNjYmVmOTQ4MicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGVhOTY2NjEzOTUyN2E4YzFkZDk0Y2U0ZjA3MWZkMjNjOGIzNTBjNWE0YmIzMzc0OGM0YmExMTFmYWNjYWUwJyxcbiAgICAgICAgJzYyMGVmYWJiYzhlZTI3ODJlMjRlN2MwY2ZiOTVjNWQ3MzViNzgzYmU5Y2YwZjhlOTU1YWYzNGEzMGU2MmI5NDUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RkMzYyNWZhZWY1YmEwNjA3NDY2OTcxNmJiZDM3ODhkODliZGRlODE1OTU5OTY4MDkyZjc2Y2M0ZWI5YTk3ODcnLFxuICAgICAgICAnN2ExODhmYTM1MjBlMzBkNDYxZGEyNTAxMDQ1NzMxY2E5NDE0NjE5ODI4ODMzOTU5MzdmNjhkMDBjNjQ0YTU3MycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjcxMGQ3OWQ5ZWI5NjIyOTdlNGY2MjMyYjQwZThmN2ZlYjJiYzYzODE0NjE0ZDY5MmMxMmRlNzUyNDA4MjIxZScsXG4gICAgICAgICdlYTk4ZTY3MjMyZDNiMzI5NWQzYjUzNTUzMjExNWNjYWM4NjEyYzcyMTg1MTYxNzUyNmFlNDdhOWM3N2JmYzgyJyxcbiAgICAgIF0sXG4gICAgXSxcbiAgfSxcbiAgbmFmOiB7XG4gICAgd25kOiA3LFxuICAgIHBvaW50czogW1xuICAgICAgW1xuICAgICAgICAnZjkzMDhhMDE5MjU4YzMxMDQ5MzQ0Zjg1Zjg5ZDUyMjliNTMxYzg0NTgzNmY5OWIwODYwMWYxMTNiY2UwMzZmOScsXG4gICAgICAgICczODhmN2IwZjYzMmRlODE0MGZlMzM3ZTYyYTM3ZjM1NjY1MDBhOTk5MzRjMjIzMWI2Y2I5ZmQ3NTg0YjhlNjcyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyZjhiZGU0ZDFhMDcyMDkzNTViNGE3MjUwYTVjNTEyOGU4OGI4NGJkZGM2MTlhYjdjYmE4ZDU2OWIyNDBlZmU0JyxcbiAgICAgICAgJ2Q4YWMyMjI2MzZlNWUzZDZkNGRiYTlkZGE2YzljNDI2Zjc4ODI3MWJhYjBkNjg0MGRjYTg3ZDNhYTZhYzYyZDYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzVjYmRmMDY0NmU1ZGI0ZWFhMzk4ZjM2NWYyZWE3YTBlM2Q0MTliN2UwMzMwZTM5Y2U5MmJkZGVkY2FjNGY5YmMnLFxuICAgICAgICAnNmFlYmNhNDBiYTI1NTk2MGEzMTc4ZDZkODYxYTU0ZGJhODEzZDBiODEzZmRlN2I1YTUwODI2MjgwODcyNjRkYScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYWNkNDg0ZTJmMGM3ZjY1MzA5YWQxNzhhOWY1NTlhYmRlMDk3OTY5NzRjNTdlNzE0YzM1ZjExMGRmYzI3Y2NiZScsXG4gICAgICAgICdjYzMzODkyMWIwYTdkOWZkNjQzODA5NzE3NjNiNjFlOWFkZDg4OGE0Mzc1ZjhlMGYwNWNjMjYyYWM2NGY5YzM3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NzRhZTdmODU4YTk0MTFlNWVmNDI0NmI3MGM2NWFhYzU2NDk5ODBiZTVjMTc4OTFiYmVjMTc4OTVkYTAwOGNiJyxcbiAgICAgICAgJ2Q5ODRhMDMyZWI2YjVlMTkwMjQzZGQ1NmQ3YjdiMzY1MzcyZGIxZTJkZmY5ZDZhODMwMWQ3NGM5Yzk1M2M2MWInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YyODc3M2MyZDk3NTI4OGJjN2QxZDIwNWMzNzQ4NjUxYjA3NWZiYzY2MTBlNThjZGRlZWRkZjhmMTk0MDVhYTgnLFxuICAgICAgICAnYWIwOTAyZThkODgwYTg5NzU4MjEyZWI2NWNkYWY0NzNhMWEwNmRhNTIxZmE5MWYyOWI1Y2I1MmRiMDNlZDgxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNzkyNGQ0ZjdkNDNlYTk2NWE0NjVhZTMwOTVmZjQxMTMxZTU5NDZmM2M4NWY3OWU0NGFkYmNmOGUyN2UwODBlJyxcbiAgICAgICAgJzU4MWUyODcyYTg2YzcyYTY4Mzg0MmVjMjI4Y2M2ZGVmZWE0MGFmMmJkODk2ZDNhNWM1MDRkYzlmZjZhMjZiNTgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RlZmRlYTRjZGI2Nzc3NTBhNDIwZmVlODA3ZWFjZjIxZWI5ODk4YWU3OWI5NzY4NzY2ZTRmYWEwNGEyZDRhMzQnLFxuICAgICAgICAnNDIxMWFiMDY5NDYzNTE2OGU5OTdiMGVhZDJhOTNkYWVjZWQxZjRhMDRhOTVjMGY2Y2ZiMTk5ZjY5ZTU2ZWI3NycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMmI0ZWEwYTc5N2E0NDNkMjkzZWY1Y2ZmNDQ0ZjQ5NzlmMDZhY2ZlYmQ3ZTg2ZDI3NzQ3NTY1NjEzODM4NWI2YycsXG4gICAgICAgICc4NWU4OWJjMDM3OTQ1ZDkzYjM0MzA4M2I1YTFjODYxMzFhMDFmNjBjNTAyNjk3NjNiNTcwYzg1NGU1YzA5YjdhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNTJiYmY0YTRjZGQxMjU2NGY5M2ZhMzMyY2UzMzMzMDFkOWFkNDAyNzFmODEwNzE4MTM0MGFlZjI1YmU1OWQ1JyxcbiAgICAgICAgJzMyMWViNDA3NTM0OGY1MzRkNTljMTgyNTlkZGEzZTFmNGExYjNiMmU3MWIxMDM5YzY3YmQzZDhiY2Y4MTk5OGMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzJmYTIxMDRkNmIzOGQxMWIwMjMwMDEwNTU5ODc5MTI0ZTQyYWI4ZGZlZmY1ZmYyOWRjOWNkYWRkNGVjYWNjM2YnLFxuICAgICAgICAnMmRlMTA2ODI5NWRkODY1YjY0NTY5MzM1YmQ1ZGQ4MDE4MWQ3MGVjZmM4ODI2NDg0MjNiYTc2YjUzMmI3ZDY3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5MjQ4Mjc5YjA5YjRkNjhkYWIyMWE5YjA2NmVkZGE4MzI2M2MzZDg0ZTA5NTcyZTI2OWNhMGNkN2Y1NDUzNzE0JyxcbiAgICAgICAgJzczMDE2ZjdiZjIzNGFhZGU1ZDFhYTcxYmRlYTJiMWZmM2ZjMGRlMmE4ODc5MTJmZmU1NGEzMmNlOTdjYjM0MDInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RhZWQ0ZjJiZTNhOGJmMjc4ZTcwMTMyZmIwYmViNzUyMmY1NzBlMTQ0YmY2MTVjMDdlOTk2ZDQ0M2RlZTg3MjknLFxuICAgICAgICAnYTY5ZGNlNGE3ZDZjOThlOGQ0YTFhY2E4N2VmOGQ3MDAzZjgzYzIzMGYzYWZhNzI2YWI0MGU1MjI5MGJlMWM1NScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzQ0ZDEyYzcwNjVkODEyZThhY2YyOGQ3Y2JiMTlmOTAxMWVjZDllOWZkZjI4MWIwZTZhM2I1ZTg3ZDIyZTdkYicsXG4gICAgICAgICcyMTE5YTQ2MGNlMzI2Y2RjNzZjNDU5MjZjOTgyZmRhYzBlMTA2ZTg2MWVkZjYxYzVhMDM5MDYzZjBlMGU2NDgyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2YTI0NWJmNmRjNjk4NTA0Yzg5YTIwY2ZkZWQ2MDg1MzE1MmI2OTUzMzZjMjgwNjNiNjFjNjVjYmQyNjllNmI0JyxcbiAgICAgICAgJ2UwMjJjZjQyYzJiZDRhNzA4YjNmNTEyNmYxNmEyNGFkOGIzM2JhNDhkMDQyM2I2ZWZkNWU2MzQ4MTAwZDhhODInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE2OTdmZmE2ZmQ5ZGU2MjdjMDc3ZTNkMmZlNTQxMDg0Y2UxMzMwMGIwYmVjMTE0NmY5NWFlNTdmMGQwYmQ2YTUnLFxuICAgICAgICAnYjljMzk4ZjE4NjgwNmY1ZDI3NTYxNTA2ZTQ1NTc0MzNhMmNmMTUwMDllNDk4YWU3YWRlZTlkNjNkMDFiMjM5NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjA1YmRiMDE5OTgxNzE4Yjk4NmQwZjA3ZTgzNGNiMGQ5ZGViODM2MGZmYjdmNjFkZjk4MjM0NWVmMjdhNzQ3OScsXG4gICAgICAgICcyOTcyZDJkZTRmOGQyMDY4MWE3OGQ5M2VjOTZmZTIzYzI2YmZhZTg0ZmIxNGRiNDNiMDFlMWU5MDU2YjhjNDknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzYyZDE0ZGFiNDE1MGJmNDk3NDAyZmRjNDVhMjE1ZTEwZGNiMDFjMzU0OTU5YjEwY2ZlMzFjN2U5ZDg3ZmYzM2QnLFxuICAgICAgICAnODBmYzA2YmQ4Y2M1YjAxMDk4MDg4YTE5NTBlZWQwZGIwMWFhMTMyOTY3YWI0NzIyMzVmNTY0MjQ4M2IyNWVhZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODBjNjBhZDAwNDBmMjdkYWRlNWI0YjA2YzQwOGU1NmIyYzUwZTlmNTZiOWI4YjQyNWU1NTVjMmY4NjMwOGI2ZicsXG4gICAgICAgICcxYzM4MzAzZjFjYzVjMzBmMjZlNjZiYWQ3ZmU3MmY3MGE2NWVlZDRjYmU3MDI0ZWIxYWEwMWY1NjQzMGJkNTdhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3YTkzNzVhZDYxNjdhZDU0YWE3NGM2MzQ4Y2M1NGQzNDRjYzVkYzk0ODdkODQ3MDQ5ZDVlYWJiMGZhMDNjOGZiJyxcbiAgICAgICAgJ2QwZTNmYTllY2E4NzI2OTA5NTU5ZTBkNzkyNjkwNDZiZGM1OWVhMTBjNzBjZTJiMDJkNDk5ZWMyMjRkYzdmNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDUyOGVjZDliNjk2YjU0YzkwN2E5ZWQwNDU0NDdhNzliYjQwOGVjMzliNjhkZjUwNGJiNTFmNDU5YmMzZmZjOScsXG4gICAgICAgICdlZWNmNDEyNTMxMzZlNWY5OTk2NmYyMTg4MWZkNjU2ZWJjNDM0NTQwNWM1MjBkYmMwNjM0NjViNTIxNDA5OTMzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0OTM3MGE0YjVmNDM0MTJlYTI1ZjUxNGU4ZWNkYWQwNTI2NjExNWU0YTdlY2IxMzg3MjMxODA4ZjhiNDU5NjMnLFxuICAgICAgICAnNzU4ZjNmNDFhZmQ2ZWQ0MjhiMzA4MWIwNTEyZmQ2MmE1NGMzZjNhZmJiNWI2NzY0YjY1MzA1MmExMjk0OWM5YScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzdmMjMwOTM2ZWU4OGNiYmQ3M2RmOTMwZDY0NzAyZWY4ODFkODExZTBlMTQ5OGUyZjFjMTNlYjFmYzM0NWQ3NCcsXG4gICAgICAgICc5NThlZjQyYTc4ODZiNjQwMGEwODI2NmU5YmExYjM3ODk2Yzk1MzMwZDk3MDc3Y2JiZThlYjNjNzY3MWM2MGQ2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMmRhYzk5MWNjNGNlNGI5ZWE0NDg4N2U1YzdjMGJjZTU4YzgwMDc0YWI5ZDRkYmFlYjI4NTMxYjc3MzlmNTMwJyxcbiAgICAgICAgJ2UwZGVkYzliM2IyZjhkYWQ0ZGExZjMyZGVjMjUzMWRmOWViNWZiZWIwNTk4ZTRmZDFhMTE3ZGJhNzAzYTNjMzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQ2M2IzZDlmNjYyNjIxZmIxYjRiZThmYmJlMjUyMDEyNWEyMTZjZGZjOWRhZTNkZWJjYmE0ODUwYzY5MGQ0NWInLFxuICAgICAgICAnNWVkNDMwZDc4YzI5NmMzNTQzMTE0MzA2ZGQ4NjIyZDdjNjIyZTI3Yzk3MGExZGUzMWNiMzc3YjAxYWY3MzA3ZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjE2ZjgwNDI0NGU0NmUyYTA5MjMyZDRhZmYzYjU5OTc2Yjk4ZmFjMTQzMjhhMmQxYTMyNDk2YjQ5OTk4ZjI0NycsXG4gICAgICAgICdjZWRhYmQ5YjgyMjAzZjdlMTNkMjA2ZmNkZjRlMzNkOTJhNmM1M2MyNmU1Y2NlMjZkNjU3OTk2MmM0ZTMxZGY2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjYWY3NTQyNzJkYzg0NTYzYjAzNTJiN2ExNDMxMWFmNTVkMjQ1MzE1YWNlMjdjNjUzNjllMTVmNzE1MWQ0MWQxJyxcbiAgICAgICAgJ2NiNDc0NjYwZWYzNWY1ZjJhNDFiNjQzZmE1ZTQ2MDU3NWY0ZmE5Yjc5NjIyMzJhNWMzMmY5MDgzMThhMDQ0NzYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzI2MDBjYTRiMjgyY2I5ODZmODVkMGYxNzA5OTc5ZDhiNDRhMDljMDdjYjg2ZDdjMTI0NDk3YmM4NmYwODIxMjAnLFxuICAgICAgICAnNDExOWI4ODc1M2MxNWJkNmE2OTNiMDNmY2RkYmI0NWQ1YWM2YmU3NGFiNWYwZWY0NGIwYmU5NDc1YTdlNGI0MCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzYzNWNhNzJkN2U4NDMyYzMzOGVjNTNjZDEyMjIwYmMwMWM0ODY4NWUyNGY3ZGM4YzYwMmE3NzQ2OTk4ZTQzNScsXG4gICAgICAgICc5MWI2NDk2MDk0ODlkNjEzZDFkNWU1OTBmNzhlNmQ3NGVjZmMwNjFkNTcwNDhiYWQ5ZTc2ZjMwMmM1YjljNjEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc1NGUzMjM5ZjMyNTU3MGNkYmJmNGE4N2RlZWU4YTY2YjdmMmIzMzQ3OWQ0NjhmYmMxYTUwNzQzYmY1NmNjMTgnLFxuICAgICAgICAnNjczZmI4NmU1YmRhMzBmYjNjZDBlZDMwNGVhNDlhMDIzZWUzM2QwMTk3YTY5NWQwYzVkOTgwOTNjNTM2NjgzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlM2U2YmQxMDcxYTFlOTZhZmY1Nzg1OWM4MmQ1NzBmMDMzMDgwMDY2MWQxYzk1MmY5ZmUyNjk0NjkxZDliOWU4JyxcbiAgICAgICAgJzU5YzllMGJiYTM5NGU3NmY0MGMwYWE1ODM3OWEzY2I2YTVhMjI4Mzk5M2U5MGM0MTY3MDAyYWY0OTIwZTM3ZjUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE4NmI0ODNkMDU2YTAzMzgyNmFlNzNkODhmNzMyOTg1YzRjY2IxZjMyYmEzNWY0YjRjYzQ3ZmRjZjA0YWE2ZWInLFxuICAgICAgICAnM2I5NTJkMzJjNjdjZjc3ZTJlMTc0NDZlMjA0MTgwYWIyMWZiODA5MDg5NTEzOGI0YTRhNzk3Zjg2ZTgwODg4YicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGY5ZDcwYTZiOTg3NmNlNTQ0Yzk4NTYxZjRiZTRmNzI1NDQyZTZkMmI3MzdkOWM5MWE4MzIxNzI0Y2UwOTYzZicsXG4gICAgICAgICc1NWViMmRhZmQ4NGQ2Y2NkNWY4NjJiNzg1ZGMzOWQ0YWIxNTcyMjI3MjBlZjlkYTIxN2I4YzQ1Y2YyYmEyNDE3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1ZWRkNWNjMjNjNTFlODdhNDk3Y2E4MTVkNWRjZTBmOGFiNTI1NTRmODQ5ZWQ4OTk1ZGU2NGM1ZjM0Y2U3MTQzJyxcbiAgICAgICAgJ2VmYWU5YzhkYmMxNDEzMDY2MWU4Y2VjMDMwYzg5YWQwYzEzYzY2YzBkMTdhMjkwNWNkYzcwNmFiNzM5OWE4NjgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzI5MDc5OGMyYjY0NzY4MzBkYTEyZmUwMjI4N2U5ZTc3N2FhM2ZiYTFjMzU1YjE3YTcyMmQzNjJmODQ2MTRmYmEnLFxuICAgICAgICAnZTM4ZGE3NmRjZDQ0MDYyMTk4OGQwMGJjZjc5YWYyNWQ1YjI5YzA5NGRiMmEyMzE0NmQwMDNhZmQ0MTk0M2U3YScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYWYzYzQyM2E5NWQ5ZjViMzA1NDc1NGVmYTE1MGFjMzljZDI5NTUyZmUzNjAyNTczNjJkZmRlY2VmNDA1M2I0NScsXG4gICAgICAgICdmOThhM2ZkODMxZWIyYjc0OWE5M2IwZTZmMzVjZmI0MGM4Y2Q1YWE2NjdhMTU1ODFiYzJmZWRlZDQ5OGZkOWM2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NjZkYmIyNGQxMzRlNzQ1Y2NjYWEyOGM5OWJmMjc0OTA2YmI2NmIyNmRjZjk4ZGY4ZDJmZWQ1MGQ4ODQyNDlhJyxcbiAgICAgICAgJzc0NGIxMTUyZWFjYmU1ZTM4ZGNjODg3OTgwZGEzOGI4OTc1ODRhNjVmYTA2Y2VkZDJjOTI0Zjk3Y2JhYzU5OTYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzU5ZGJmNDZmOGM5NDc1OWJhMjEyNzdjMzM3ODRmNDE2NDVmN2I0NGY2YzU5NmE1OGNlOTJlNjY2MTkxYWJlM2UnLFxuICAgICAgICAnYzUzNGFkNDQxNzVmYmMzMDBmNGVhNmNlNjQ4MzA5YTA0MmNlNzM5YTc5MTk3OThjZDg1ZTIxNmM0YTMwN2Y2ZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjEzYWRhOTUxMDNjNDUzNzMwNWU2OTFlNzRlOWE0YThkZDY0N2U3MTFhOTVlNzNjYjYyZGM2MDE4Y2ZkODdiOCcsXG4gICAgICAgICdlMTM4MTdiNDRlZTE0ZGU2NjNiZjRiYzgwODM0MWYzMjY5NDllMjFhNmE3NWMyNTcwNzc4NDE5YmRhZjU3MzNkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NzU0YjRmYTBlOGFjZWQwNmQ0MTY3YTJjNTljY2E0Y2RhMTg2OWMwNmViYWRmYjY0ODg1NTAwMTVhODg1MjJjJyxcbiAgICAgICAgJzMwZTkzZTg2NGU2NjlkODIyMjRiOTY3YzMwMjBiOGZhOGQxZTRlMzUwYjZjYmNjNTM3YTQ4YjU3ODQxMTYzYTInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzk0OGRjYWRmNTk5MGUwNDhhYTM4NzRkNDZhYmVmOWQ3MDE4NThmOTVkZTgwNDFkMmE2ODI4Yzk5ZTIyNjI1MTknLFxuICAgICAgICAnZTQ5MWE0MjUzN2Y2ZTU5N2Q1ZDI4YTMyMjRiMWJjMjVkZjkxNTRlZmJkMmVmMWQyY2JiYTJjYWU1MzQ3ZDU3ZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzk2MjQxNDQ1MGM3NmMxNjg5YzdiNDhmODIwMmVjMzdmYjIyNGNmNWFjMGJmYTE1NzAzMjhhOGEzZDdjNzdhYicsXG4gICAgICAgICcxMDBiNjEwZWM0ZmZiNDc2MGQ1YzFmYzEzM2VmNmY2YjEyNTA3YTA1MWYwNGFjNTc2MGFmYTViMjlkYjgzNDM3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNTE0MDg3ODM0OTY0YjU0YjE1YjE2MDY0NGQ5MTU0ODVhMTY5NzcyMjViODg0N2JiMGRkMDg1MTM3ZWM0N2NhJyxcbiAgICAgICAgJ2VmMGFmYmIyMDU2MjA1NDQ4ZTE2NTJjNDhlODEyN2ZjNjAzOWU3N2MxNWMyMzc4YjdlN2QxNWEwZGUyOTMzMTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QzY2MzMGFkNmI0ODNlNGJjNzljZTJjOWRkOGJjNTQ5OTNlOTQ3ZWI4ZGY3ODdiNDQyOTQzZDNmN2I1MjdlYWYnLFxuICAgICAgICAnOGIzNzhhMjJkODI3Mjc4ZDg5YzVlOWJlOGY5NTA4YWUzYzJhZDQ2MjkwMzU4NjMwYWZiMzRkYjA0ZWVkZTBhNCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTYyNGQ4NDc4MDczMjg2MGNlMWM3OGZjYmZlZmUwOGIyYjI5ODIzZGI5MTNmNjQ5Mzk3NWJhMGZmNDg0NzYxMCcsXG4gICAgICAgICc2ODY1MWNmOWI2ZGE5MDNlMDkxNDQ0OGM2Y2Q5ZDRjYTg5Njg3OGY1MjgyYmU0YzhjYzA2ZTJhNDA0MDc4NTc1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3MzNjZTgwZGE5NTVhOGEyNjkwMmM5NTYzM2U2MmE5ODUxOTI0NzRiNWFmMjA3ZGE2ZGY3YjRmZDVmYzYxY2Q0JyxcbiAgICAgICAgJ2Y1NDM1YTJiZDJiYWRmN2Q0ODVhNGQ4YjhkYjlmY2NlM2UxZWY4ZTAyMDFlNDU3OGM1NDY3M2JjMWRjNWVhMWQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE1ZDk0NDEyNTQ5NDUwNjRjZjFhMWMzM2JiZDNiNDlmODk2NmM1MDkyMTcxZTY5OWVmMjU4ZGZhYjgxYzA0NWMnLFxuICAgICAgICAnZDU2ZWIzMGI2OTQ2M2U3MjM0ZjUxMzdiNzNiODQxNzc0MzQ4MDBiYWNlYmZjNjg1ZmMzN2JiZTllZmU0MDcwZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTFkMGZjZjJlYzlkZTY3NWI2MTIxMzZlNWNlNzBkMjcxYzIxNDE3YzlkMmI4YWFhYWMxMzg1OTlkMDcxNzk0MCcsXG4gICAgICAgICdlZGQ3N2Y1MGJjYjVhM2NhYjJlOTA3MzczMDk2NjdmMjY0MTQ2MmE1NDA3MGYzZDUxOTIxMmQzOWMxOTdhNjI5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlMjJmYmUxNWMwYWY4Y2NjNTc4MGMwNzM1Zjg0ZGJlOWE3OTBiYWRlZTgyNDVjMDZjN2NhMzczMzFjYjM2OTgwJyxcbiAgICAgICAgJ2E4NTViYWJhZDVjZDYwYzg4YjQzMGE2OWY1M2ExYTdhMzgyODkxNTQ5NjQ3OTliZTQzZDA2ZDc3ZDMxZGEwNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzExMDkxZGQ5ODYwZThlMjBlZTEzNDczYzExNTVmNWY2OTYzNWUzOTQ3MDRlYWE3NDAwOTQ1MjI0NmNmYTliMycsXG4gICAgICAgICc2NmRiNjU2Zjg3ZDFmMDRmZmZkMWYwNDc4OGMwNjgzMDg3MWVjNWE2NGZlZWU2ODViZDgwZjBiMTI4NmQ4Mzc0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNGMxZmQwNGQzMDFiZTg5YjMxYzA0NDJkM2U2YWMyNDg4MzkyOGI0NWE5MzQwNzgxODY3ZDQyMzJlYzJkYmRmJyxcbiAgICAgICAgJzk0MTQ2ODVlOTdiMWI1OTU0YmQ0NmY3MzAxNzQxMzZkNTdmMWNlZWI0ODc0NDNkYzUzMjE4NTdiYTczYWJlZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjIxOWVhNWQ2YjU0NzAxYzFjMTRkZTViNTU3ZWI0MmE4ZDEzZjNhYmJjZDA4YWZmY2MyYTVlNmIwNDliOGQ2MycsXG4gICAgICAgICc0Y2I5NTk1N2U4M2Q0MGIwZjczYWY0NTQ0Y2NjZjZiMWY0YjA4ZDNjMDdiMjdmYjhkOGMyOTYyYTQwMDc2NmQxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkN2I4NzQwZjc0YThmYmFhYjFmNjgzZGI4ZjQ1ZGUyNjU0M2E1NDkwYmNhNjI3MDg3MjM2OTEyNDY5YTBiNDQ4JyxcbiAgICAgICAgJ2ZhNzc5NjgxMjhkOWM5MmVlMTAxMGYzMzdhZDQ3MTdlZmYxNWRiNWVkM2MwNDliMzQxMWUwMzE1ZWFhNDU5M2InLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMyZDMxYzIyMmY4ZjZmMGVmODZmN2M5OGQzYTMzMzVlYWQ1YmNkMzJhYmRkOTQyODlmZTRkMzA5MWFhODI0YmYnLFxuICAgICAgICAnNWYzMDMyZjU4OTIxNTZlMzljY2QzZDc5MTViOWUxZGEyZTZkYWM5ZTZmMjZlOTYxMTE4ZDE0Yjg0NjJlMTY2MScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzQ2MWYzNzE5MTRhYjMyNjcxMDQ1YTE1NWQ5ODMxZWE4NzkzZDc3Y2Q1OTU5MmM0MzQwZjg2Y2JjMTgzNDdiNScsXG4gICAgICAgICc4ZWMwYmEyMzhiOTZiZWMwY2JkZGRjYWUwYWE0NDI1NDJlZWUxZmY1MGM5ODZlYTZiMzk4NDdiM2NjMDkyZmY2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlZTA3OWFkYjFkZjE4NjAwNzQzNTZhMjVhYTM4MjA2YTZkNzE2YjJjM2U2NzQ1M2QyODc2OThiYWQ3YjJiMmQ2JyxcbiAgICAgICAgJzhkYzI0MTJhYWZlM2JlNWM0YzVmMzdlMGVjYzVmOWY2YTQ0Njk4OWFmMDRjNGUyNWViYWFjNDc5ZWMxYzhjMWUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzE2ZWM5M2U0NDdlYzgzZjA0NjdiMTgzMDJlZTYyMGY3ZTY1ZGUzMzE4NzRjOWRjNzJiZmQ4NjE2YmE5ZGE2YjUnLFxuICAgICAgICAnNWU0NjMxMTUwZTYyZmI0MGQwZThjMmE3Y2E1ODA0YTM5ZDU4MTg2YTUwZTQ5NzEzOTYyNjc3OGUyNWIwNjc0ZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWFhNWY5ODBjMjQ1ZjZmMDM4OTc4MjkwYWZhNzBiNmJkODg1NTg5N2Y5OGI2YWE0ODViOTYwNjVkNTM3YmQ5OScsXG4gICAgICAgICdmNjVmNWQzZTI5MmMyZTA4MTlhNTI4MzkxYzk5NDYyNGQ3ODQ4NjlkN2U2ZWE2N2ZiMTgwNDEwMjRlZGMwN2RjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3OGM5NDA3NTQ0YWMxMzI2OTJlZTE5MTBhMDI0Mzk5NThhZTA0ODc3MTUxMzQyZWE5NmM0YjZiMzVhNDlmNTEnLFxuICAgICAgICAnZjNlMDMxOTE2OWViOWI4NWQ1NDA0Nzk1NTM5YTVlNjhmYTFmYmQ1ODNjMDY0ZDI0NjJiNjc1ZjE5NGEzZGRiNCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDk0ZjRiZTIxOWExYTc3MDE2ZGNkODM4NDMxYWVhMDAwMWNkYzhhZTdhNmZjNjg4NzI2NTc4ZDk3MDI4NTdhNScsXG4gICAgICAgICc0MjI0MmE5NjkyODNhNWYzMzliYTdmMDc1ZTM2YmEyYWY5MjVjZTMwZDc2N2VkNmU1NWY0YjAzMTg4MGQ1NjJjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhNTk4YTgwMzBkYTZkODZjNmJjN2YyZjUxNDRlYTU0OWQyODIxMWVhNThmYWE3MGViZjRjMWU2NjVjMWZlOWI1JyxcbiAgICAgICAgJzIwNGI1ZDZmODQ4MjJjMzA3ZTRiNGE3MTQwNzM3YWVjMjNmYzYzYjY1YjM1Zjg2YTEwMDI2ZGJkMmQ4NjRlNmInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M0MTkxNjM2NWFiYjJiNWQwOTE5MmY1ZjJkYmVhZmVjMjA4ZjAyMGYxMjU3MGExODRkYmFkYzNlNTg1OTU5OTcnLFxuICAgICAgICAnNGYxNDM1MWQwMDg3ZWZhNDlkMjQ1YjMyODk4NDk4OWQ1Y2FmOTQ1MGYzNGJmYzBlZDE2ZTk2YjU4ZmE5OTEzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NDFkNjA2M2E1ODZmYTQ3NWE3MjQ2MDRkYTAzYmM1YjkyYTJlMGQyZTBhMzZhY2ZlNGM3M2E1NTE0NzQyODgxJyxcbiAgICAgICAgJzczODY3ZjU5YzA2NTllODE5MDRmOWExYzc1NDM2OThlNjI1NjJkNjc0NGMxNjljZTdhMzZkZTAxYThkNjE1NCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNWU5NWJiMzk5YTY5NzFkMzc2MDI2OTQ3Zjg5YmRlMmYyODJiMzM4MTA5MjhiZTRkZWQxMTJhYzRkNzBlMjBkNScsXG4gICAgICAgICczOWYyM2YzNjY4MDkwODViZWViZmM3MTE4MTMxMzc3NWE5OWM5YWVkN2Q4YmEzOGIxNjEzODRjNzQ2MDEyODY1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNmU0NjQxYTUzOTQ4ZmQ0NzZjMzlmOGE5OWZkOTc0ZTVlYzA3NTY0YjUzMTVkOGJmOTk0NzFiY2EwZWYyZjY2JyxcbiAgICAgICAgJ2QyNDI0YjFiMWFiZTRlYjgxNjQyMjdiMDg1YzlhYTk0NTZlYTEzNDkzZmQ1NjNlMDZmZDUxY2Y1Njk0Yzc4ZmMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMzNjU4MWVhN2JmYmJiMjkwYzE5MWEyZjUwN2E0MWNmNTY0Mzg0MjE3MGU5MTRmYWVhYjI3YzJjNTc5ZjcyNicsXG4gICAgICAgICdlYWQxMjE2ODU5NWZlMWJlOTkyNTIxMjliNmU1NmIzMzkxZjdhYjE0MTBjZDFlMGVmM2RjZGNhYmQyZmRhMjI0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4YWI4OTgxNmRhZGZkNmI2YTFmMjYzNGZjZjAwZWM4NDAzNzgxMDI1ZWQ2ODkwYzQ4NDk3NDI3MDZiZDQzZWRlJyxcbiAgICAgICAgJzZmZGNlZjA5ZjJmNmQwYTA0NGU2NTRhZWY2MjQxMzZmNTAzZDQ1OWMzZTg5ODQ1ODU4YTQ3YTkxMjljZGQyNGUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzFlMzNmMWE3NDZjOWM1Nzc4MTMzMzQ0ZDkyOTlmY2FhMjBiMDkzOGU4YWNmZjI1NDRiYjQwMjg0YjhjNWZiOTQnLFxuICAgICAgICAnNjA2NjAyNTdkZDExYjNhYTljOGVkNjE4ZDI0ZWRmZjIzMDZkMzIwZjFkMDMwMTBlMzNhN2QyMDU3ZjNiM2I2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NWI3YzFkY2IzY2VjMWI3ZWU3ZjMwZGVkNzlkZDIwYTBlZDFmNGNjMThjYmNmY2ZhNDEwMzYxZmQ4ZjA4ZjMxJyxcbiAgICAgICAgJzNkOThhOWNkZDAyNmRkNDNmMzkwNDhmMjVhODg0N2Y0ZmNhZmFkMTg5NWQ3YTYzM2M2ZmVkM2MzNWU5OTk1MTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzI5ZGY5ZmJkOGQ5ZTQ2NTA5Mjc1ZjRiMTI1ZDZkNDVkN2ZiZTlhM2I4NzhhN2FmODcyYTI4MDA2NjFhYzVmNTEnLFxuICAgICAgICAnYjRjNGZlOTljNzc1YTYwNmUyZDg4NjIxNzkxMzlmZmRhNjFkYzg2MWMwMTllNTVjZDI4NzZlYjJhMjdkODRiJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhMGIxY2FlMDZiMGE4NDdhM2ZlYTZlNjcxYWFmOGFkZmRmZTU4Y2EyZjc2ODEwNWM4MDgyYjJlNDQ5ZmNlMjUyJyxcbiAgICAgICAgJ2FlNDM0MTAyZWRkZTA5NThlYzRiMTlkOTE3YTZhMjhlNmI3MmRhMTgzNGFmZjBlNjUwZjA0OTUwM2EyOTZjZjInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRlOGNlYWZiOWIzZTlhMTM2ZGM3ZmY2N2U4NDAyOTViNDk5ZGZiM2IyMTMzZTRiYTExM2YyZTRjMGUxMjFlNScsXG4gICAgICAgICdjZjIxNzQxMThjOGI2ZDdhNGI0OGY2ZDUzNGNlNWM3OTQyMmMwODZhNjM0NjA1MDJiODI3Y2U2MmEzMjY2ODNjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkMjRhNDRlMDQ3ZTE5YjZmNWFmYjgxYzdjYTJmNjkwODBhNTA3NjY4OWEwMTA5MTlmNDI3MjVjMmI3ODlhMzNiJyxcbiAgICAgICAgJzZmYjhkNTU5MWI0NjZmOGZjNjNkYjUwZjFjMGYxYzY5MDEzZjk5Njg4N2I4MjQ0ZDJjZGVjNDE3YWZlYThmYTMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VhMDE2MDZhN2E2YzljZGQyNDlmZGZjZmFjYjk5NTg0MDAxZWRkMjhhYmJhYjc3YjUxMDRlOThlOGUzYjM1ZDQnLFxuICAgICAgICAnMzIyYWY0OTA4YzczMTJiMGNmYmZlMzY5ZjdhN2IzY2RiN2Q0NDk0YmMyODIzNzAwY2ZkNjUyMTg4YTNlYTk4ZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYWY4YWRkYmYyYjY2MWM4YTZjNjMyODY1NWViOTY2NTEyNTIwMDdkOGM1ZWEzMWJlNGFkMTk2ZGU4Y2UyMTMxZicsXG4gICAgICAgICc2NzQ5ZTY3YzAyOWI4NWY1MmEwMzRlYWZkMDk2ODM2YjI1MjA4MTg2ODBlMjZhYzhmM2RmYmNkYjcxNzQ5NzAwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlM2FlMTk3NDU2NmNhMDZjYzUxNmQ0N2UwZmIxNjVhNjc0YTNkYWJjZmNhMTVlNzIyZjBlMzQ1MGY0NTg4OScsXG4gICAgICAgICcyYWVhYmU3ZTQ1MzE1MTAxMTYyMTdmMDdiZjRkMDczMDBkZTk3ZTQ4NzRmODFmNTMzNDIwYTcyZWViMGJkNmE0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1OTFlZTM1NTMxM2Q5OTcyMWNmNjk5M2ZmZWQxZTNlMzAxOTkzZmYzZWQyNTg4MDIwNzVlYThjZWQzOTdlMjQ2JyxcbiAgICAgICAgJ2IwZWE1NThhMTEzYzMwYmVhNjBmYzQ3NzU0NjBjNzkwMWZmMGIwNTNkMjVjYTJiZGVlZTk4ZjFhNGJlNWQxOTYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzExMzk2ZDU1ZmRhNTRjNDlmMTlhYTk3MzE4ZDhkYTYxZmE4NTg0ZTQ3YjA4NDk0NTA3N2NmMDMyNTViNTI5ODQnLFxuICAgICAgICAnOTk4Yzc0YThjZDQ1YWMwMTI4OWQ1ODMzYTdiZWI0NzQ0ZmY1MzZiMDFiMjU3YmU0YzU3NjdiZWE5M2VhNTdhNCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnM2M1ZDJhMWJhMzljNWExNzkwMDAwNzM4YzllMGM0MGI4ZGNkZmQ1NDY4NzU0YjY0MDU1NDAxNTdlMDE3YWE3YScsXG4gICAgICAgICdiMjI4NDI3OTk5NWEzNGUyZjlkNGRlNzM5NmZjMThiODBmOWI4YjlmZGQyNzBmNjY2MWY3OWNhNGM4MWJkMjU3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjYzg3MDRiOGE2MGEwZGVmYTNhOTlhNzI5OWYyZTljM2ZiYzM5NWFmYjA0YWMwNzg0MjVlZjhhMTc5M2NjMDMwJyxcbiAgICAgICAgJ2JkZDQ2MDM5ZmVlZDE3ODgxZDFlMDg2MmRiMzQ3ZjhjZjM5NWI3NGZjNGJjZGM0ZTk0MGI3NGUzYWMxZjFiMTMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2M1MzNlNGY3ZWE4NTU1YWFjZDk3NzdhYzVjYWQyOWI5N2RkNGRlZmNjYzUzZWU3ZWEyMDQxMTliMjg4OWIxOTcnLFxuICAgICAgICAnNmYwYTI1NmJjNWVmZGY0MjlhMmZiNjI0MmYxYTQzYTJkOWI5MjViYjRhNGIzYTI2YmI4ZTBmNDVlYjU5NjA5NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzE0ZjhmMmNjYjI3ZDZmMTA5ZjZkMDhkMDNjYzk2YTY5YmE4YzM0ZWVjMDdiYmNmNTY2ZDQ4ZTMzZGE2NTkzJyxcbiAgICAgICAgJ2MzNTlkNjkyM2JiMzk4ZjdmZDQ0NzNlMTZmZTFjMjg0NzViNzQwZGQwOTgwNzVlNmMwZTg2NDkxMTNkYzNhMzgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E2Y2JjMzA0NmJjNmE0NTBiYWMyNDc4OWZhMTcxMTVhNGM5NzM5ZWQ3NWY4ZjIxY2U0NDFmNzJlMGI5MGU2ZWYnLFxuICAgICAgICAnMjFhZTdmNDY4MGU4ODliYjEzMDYxOWUyYzBmOTVhMzYwY2ViNTczYzcwNjAzMTM5ODYyYWZkNjE3ZmE5YjlmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczNDdkNmQ5YTAyYzQ4OTI3ZWJmYjg2YzEzNTliMWNhZjEzMGEzYzAyNjdkMTFjZTYzNDRiMzlmOTlkNDNjYzM4JyxcbiAgICAgICAgJzYwZWE3ZjYxYTM1MzUyNGQxYzk4N2Y2ZWNlYzkyZjA4NmQ1NjVhYjY4Nzg3MGNiMTI2ODlmZjFlMzFjNzQ0NDgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RhNjU0NWQyMTgxZGI4ZDk4M2Y3ZGNiMzc1ZWY1ODY2ZDQ3YzY3YjFiZjMxYzhjZjg1NWVmNzQzN2I3MjY1NmEnLFxuICAgICAgICAnNDliOTY3MTVhYjY4NzhhNzllNzhmMDdjZTU2ODBjNWQ2NjczMDUxYjQ5MzViZDg5N2ZlYTgyNGI3N2RjMjA4YScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzQwNzQ3Y2M5ZDAxMmNiMWExM2I4MTQ4MzA5YzZkZTdlYzI1ZDY5NDVkNjU3MTQ2YjlkNTk5NGI4ZmViMTExMScsXG4gICAgICAgICc1Y2E1NjA3NTNiZTJhMTJmYzZkZTZjYWYyY2I0ODk1NjVkYjkzNjE1NmI5NTE0ZTFiYjVlODMwMzdlMGZhMmQ0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0ZTQyYzhlYzgyYzk5Nzk4Y2NmM2E2MTBiZTg3MGU3ODMzOGM3ZjcxMzM0OGJkMzRjODIwM2VmNDAzN2YzNTAyJyxcbiAgICAgICAgJzc1NzFkNzRlZTVlMGZiOTJhN2E4YjMzYTA3NzgzMzQxYTU0OTIxNDRjYzU0YmNjNDBhOTQ0NzM2OTM2MDY0MzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM3NzVhYjcwODliYzZhZjgyM2FiYTJlMWFmNzBiMjM2ZDI1MWNhZGIwYzg2NzQzMjg3NTIyYTFiM2IwZGVkZWEnLFxuICAgICAgICAnYmU1MmQxMDdiY2ZhMDlkOGJjYjk3MzZhODI4Y2ZhN2ZhYzhkYjE3YmY3YTc2YTJjNDJhZDk2MTQwOTAxOGNmNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnY2VlMzFjYmY3ZTM0ZWMzNzlkOTRmYjgxNGQzZDc3NWFkOTU0NTk1ZDEzMTRiYTg4NDY5NTllM2U4MmY3NGUyNicsXG4gICAgICAgICc4ZmQ2NGExNGMwNmI1ODljMjZiOTQ3YWUyYmNmNmJmYTAxNDllZjBiZTE0ZWQ0ZDgwZjQ0OGEwMWM0M2IxYzZkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiNGY5ZWFlYTA5YjY5MTc2MTlmNmVhNmE0ZWI1NDY0ZWZkZGI1OGZkNDViMWViZWZjZGMxYTAxZDA4YjQ3OTg2JyxcbiAgICAgICAgJzM5ZTVjOTkyNWI1YTU0YjA3NDMzYTRmMThjNjE3MjZmOGJiMTMxYzAxMmNhNTQyZWIyNGE4YWMwNzIwMDY4MmEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q0MjYzZGZjM2QyZGY5MjNhMDE3OWE0ODk2NmQzMGNlODRlMjUxNWFmYzNkY2NjMWI3NzkwNzc5MmViY2M2MGUnLFxuICAgICAgICAnNjJkZmFmMDdhMGY3OGZlYjMwZTMwZDYyOTU4NTNjZTE4OWUxMjc3NjBhZDZjZjdmYWUxNjRlMTIyYTIwOGQ1NCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDg0NTc1MjQ4MjBmYTY1YTRmOGQzNWViNjkzMDg1N2MwMDMyYWNjMGE0YTJkZTQyMjIzM2VlZGE4OTc2MTJjNCcsXG4gICAgICAgICcyNWE3NDhhYjM2Nzk3OWQ5ODczM2MzOGExZmExYzJlN2RjNmNjMDdkYjJkNjBhOWFlN2E3NmFhYTQ5YmQwZjc3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkZmVlZWYxODgxMTAxZjJjYjExNjQ0ZjNhMmFmZGZjMjA0NWUxOTkxOTE1MjkyM2YzNjdhMTc2N2MxMWNjZWRhJyxcbiAgICAgICAgJ2VjZmI3MDU2Y2YxZGUwNDJmOTQyMGJhYjM5Njc5M2MwYzM5MGJkZTc0YjRiYmRmZjE2YTgzYWUwOWE5YTc1MTcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzZkN2VmNmIxNzU0M2Y4MzczYzU3M2Y0NGUxZjM4OTgzNWQ4OWJjYmM2MDYyY2VkMzZjODJkZjgzYjhmYWU4NTknLFxuICAgICAgICAnY2Q0NTBlYzMzNTQzODk4NmRmZWZhMTBjNTdmZWE5YmNjNTIxYTA5NTliMmQ4MGJiZjc0YjE5MGRjYTcxMmQxMCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTc1NjA1ZDU5MTAyYTVhMjY4NDUwMGQzYjk5MWYyZTNmM2M4OGI5MzIyNTU0NzAzNWFmMjVhZjY2ZTA0NTQxZicsXG4gICAgICAgICdmNWM1NDc1NGE4ZjcxZWU1NDBiOWI0ODcyODQ3M2UzMTRmNzI5YWM1MzA4YjA2OTM4MzYwOTkwZTJiZmFkMTI1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlYjk4NjYwZjRjNGRmYWEwNmEyYmU0NTNkNTAyMGJjOTlhMGMyZTYwYWJlMzg4NDU3ZGQ0M2ZlZmIxZWQ2MjBjJyxcbiAgICAgICAgJzZjYjlhODg3NmQ5Y2I4NTIwNjA5YWYzYWRkMjZjZDIwYTBhN2NkOGE5NDExMTMxY2U4NWY0NDEwMDA5OTIyM2UnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzEzZTg3YjAyN2Q4NTE0ZDM1OTM5ZjJlNjg5MmIxOTkyMjE1NDU5Njk0MTg4ODMzNmRjMzU2M2UzYjhkYmE5NDInLFxuICAgICAgICAnZmVmNWEzYzY4MDU5YTZkZWM1ZDYyNDExNGJmMWU5MWFhYzJiOWRhNTY4ZDZhYmViMjU3MGQ1NTY0NmI4YWRmMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWUxNjMwMjZlOWZkNmZlMDE3YzM4ZjA2YTViZTZmYzEyNTQyNGIzNzFjZTI3MDhlN2JmNDQ5MTY5MWU1NzY0YScsXG4gICAgICAgICcxYWNiMjUwZjI1NWRkNjFjNDNkOTRjY2M2NzBkMGY1OGY0OWFlM2ZhMTViOTY2MjNlNTQzMGRhMGFkNmM2MmIyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiMjY4ZjVlZjlhZDUxZTRkNzhkZTNhNzUwYzJkYzg5YjFlNjI2ZDQzNTA1ODY3OTk5OTMyZTVkYjMzYWYzZDgwJyxcbiAgICAgICAgJzVmMzEwZDRiM2M5OWI5ZWJiMTlmNzdkNDFjMWRlZTAxOGNmMGQzNGZkNDE5MTYxNDAwM2U5NDVhMTIxNmU0MjMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ZmMDdmMzExOGE5ZGYwMzVlOWZhZDg1ZWI2YzdiZmU0MmIwMmYwMWNhOTljZWVhM2JmN2ZmZGJhOTNjNDc1MGQnLFxuICAgICAgICAnNDM4MTM2ZDYwM2U4NThhM2E1YzQ0MGMzOGVjY2JhZGRjMWQyOTQyMTE0ZTJlZGRkNDc0MGQwOThjZWQxZjBkOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGQ4Yjk4NTVjN2MwNTJhMzQxNDZmZDIwZmZiNjU4YmVhNGI5ZjY5ZTBkODI1ZWJlYzE2ZThjM2NlMmI1MjZhMScsXG4gICAgICAgICdjZGI1NTllZWRjMmQ3OWY5MjZiYWY0NGZiODRlYTRkNDRiY2Y1MGZlZTUxZDdjZWIzMGUyZTdmNDYzMDM2NzU4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1MmRiMGI1Mzg0ZGZiZjA1YmZhOWQ0NzJkN2FlMjZkZmU0Yjg1MWNlY2E5MWIxZWJhNTQyNjMxODBkYTMyYjYzJyxcbiAgICAgICAgJ2MzYjk5N2QwNTBlZTVkNDIzZWJhZjY2YTZkYjlmNTdiMzE4MGM5MDI4NzU2NzlkZTkyNGI2OWQ4NGE3YjM3NScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTYyZjk0OTBkM2Q1MWRhNjM5NWVmZDI0ZTgwOTE5Y2M3ZDBmMjljM2YzZmE0OGM2ZmZmNTQzYmVjYmQ0MzM1MicsXG4gICAgICAgICc2ZDg5YWQ3YmE0ODc2YjBiMjJjMmNhMjgwYzY4Mjg2MmYzNDJjODU5MWYxZGFmNTE3MGUwN2JmZDljY2FmYTdkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3ZjMwZWEyNDc2YjM5OWI0OTU3NTA5Yzg4Zjc3ZDAxOTFhZmEyZmY1Y2I3YjE0ZmQ2ZDhlN2Q2NWFhYWIxMTkzJyxcbiAgICAgICAgJ2NhNWVmN2Q0YjIzMWM5NGMzYjE1Mzg5YTVmNjMxMWU5ZGFmZjdiYjY3YjEwM2U5ODgwZWY0YmZmNjM3YWNhZWMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzUwOThmZjFlMWQ5ZjE0ZmI0NmEyMTBmYWRhNmM5MDNmZWYwZmI3YjRhMWRkMWQ5YWM2MGEwMzYxODAwYjdhMDAnLFxuICAgICAgICAnOTczMTE0MWQ4MWZjOGY4MDg0ZDM3YzZlNzU0MjAwNmIzZWUxYjQwZDYwZGZlNTM2MmE1YjEzMmZkMTdkZGMwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMmI3OGM3ZGU5ZWU1MTJhNzI4OTViZTZiOWNiZWZhNmUyZjNjNGNjY2U0NDVjOTZiOWYyYzgxZTI3NzhhZDU4JyxcbiAgICAgICAgJ2VlMTg0OWY1MTNkZjcxZTMyZWZjMzg5NmVlMjgyNjBjNzNiYjgwNTQ3YWUyMjc1YmE0OTcyMzc3OTRjODc1M2MnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UyY2I3NGZkZGM4ZTlmYmNkMDc2ZWVmMmE3YzcyYjBjZTM3ZDUwZjA4MjY5ZGZjMDc0YjU4MTU1MDU0N2E0ZjcnLFxuICAgICAgICAnZDNhYTJlZDcxYzlkZDIyNDdhNjJkZjA2MjczNmViMGJhZGRlYTllMzYxMjJkMmJlODY0MWFiY2IwMDVjYzRhNCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODQzODQ0NzU2NmQ0ZDdiZWRhZGMyOTk0OTZhYjM1NzQyNjAwOWEzNWYyMzVjYjE0MWJlMGQ5OWNkMTBhZTNhOCcsXG4gICAgICAgICdjNGUxMDIwOTE2OTgwYTRkYTVkMDFhYzVlNmFkMzMwNzM0ZWYwZDc5MDY2MzFjNGYyMzkwNDI2YjJlZGQ3OTFmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0MTYyZDQ4OGI4OTQwMjAzOWI1ODRjNmZjNmMzMDg4NzA1ODdkOWM0NmY2NjBiODc4YWI2NWM4MmM3MTFkNjdlJyxcbiAgICAgICAgJzY3MTYzZTkwMzIzNjI4OWY3NzZmMjJjMjVmYjhhM2FmYzE3MzJmMmI4NGI0ZTk1ZGJkYTQ3YWU1YTA4NTI2NDknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzNmYWQzZmE4NGNhZjBmMzRmMGY4OWJmZDJkY2Y1NGZjMTc1ZDc2N2FlYzNlNTA2ODRmM2JhNGE0YmY1ZjY4M2QnLFxuICAgICAgICAnY2QxYmM3Y2I2Y2M0MDdiYjJmMGNhNjQ3YzcxOGE3MzBjZjcxODcyZTdkMGQyYTUzZmEyMGVmY2RmZTYxODI2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2NzRmMjYwMGEzMDA3YTAwNTY4YzFhN2NlMDVkMDgxNmMxZmI4NGJmMTM3MDc5OGYxYzY5NTMyZmFlYjFhODZiJyxcbiAgICAgICAgJzI5OWQyMWY5NDEzZjMzYjNlZGY0M2IyNTcwMDQ1ODBiNzBkYjU3ZGEwYjE4MjI1OWUwOWVlY2M2OWUwZDM4YTUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QzMmY0ZGE1NGFkZTc0YWJiODFiODE1YWQxZmIzYjI2M2Q4MmQ2YzY5MjcxNGJjZmY4N2QyOWJkNWVlOWYwOGYnLFxuICAgICAgICAnZjk0MjllNzM4YjhlNTNiOTY4ZTk5MDE2YzA1OTcwNzc4MmUxNGY0NTM1MzU5ZDU4MmZjNDE2OTEwYjNlZWE4NycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzBlNGU2NzA0MzUzODU1NTZlNTkzNjU3MTM1ODQ1ZDM2ZmJiNjkzMWY3MmIwOGNiMWVkOTU0ZjFlM2NlM2ZmNicsXG4gICAgICAgICc0NjJmOWJjZTYxOTg5ODYzODQ5OTM1MDExM2JiYzliMTBhODc4ZDM1ZGE3MDc0MGRjNjk1YTU1OWViODhkYjdiJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiZTIwNjIwMDNjNTFjYzMwMDQ2ODI5MDQzMzBlNGRlZTdmM2RjZDEwYjAxZTU4MGJmMTk3MWIwNGQ0Y2FkMjk3JyxcbiAgICAgICAgJzYyMTg4YmM0OWQ2MWU1NDI4NTczZDQ4YTc0ZTFjNjU1YjFjNjEwOTA5MDU2ODJhMGQ1NTU4ZWQ3MmRjY2I5YmMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkzMTQ0NDIzYWNlMzQ1MWVkMjllMGZiOWFjMmFmMjExY2I2ZTg0YTYwMWRmNTk5M2M0MTk4NTlmZmY1ZGYwNGEnLFxuICAgICAgICAnN2MxMGRmYjE2NGMzNDI1ZjVjNzFhM2Y5ZDc5OTIwMzhmMTA2NTIyNGY3MmJiOWQxZDkwMmE2ZDEzMDM3YjQ3YycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYjAxNWY4MDQ0ZjVmY2JkY2YyMWNhMjZkNmMzNGZiODE5NzgyOTIwNWM3YjdkMmE3Y2I2NjQxOGMxNTdiMTEyYycsXG4gICAgICAgICdhYjhjMWUwODZkMDRlODEzNzQ0YTY1NWIyZGY4ZDVmODNiM2NkYzZmYWEzMDg4YzFkM2FlYTE0NTRlM2ExZDVmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNWU5ZTFkYTY0OWQ5N2Q4OWU0ODY4MTE3YTQ2NWEzYTRmOGExOGRlNTdhMTQwZDM2YjNmMmFmMzQxYTIxYjUyJyxcbiAgICAgICAgJzRjYjA0NDM3ZjM5MWVkNzMxMTFhMTNjYzFkNGRkMGRiMTY5MzQ2NWMyMjQwNDgwZDg5NTVlODU5MmYyNzQ0N2EnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QzYWU0MTA0N2RkN2NhMDY1ZGJmOGVkNzdiOTkyNDM5OTgzMDA1Y2Q3MmUxNmQ2Zjk5NmE1MzE2ZDM2OTY2YmInLFxuICAgICAgICAnYmQxYWViMjFhZDIyZWJiMjJhMTBmMDMwMzQxN2M2ZDk2NGY4Y2RkN2RmMGFjYTYxNGIxMGRjMTRkMTI1YWM0NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDYzZTI3NjNkODg1Zjk1OGZjNjZjZGQyMjgwMGYwYTQ4NzE5N2QwYTgyZTM3N2I0OWY4MGFmODdjODk3YjA2NScsXG4gICAgICAgICdiZmVmYWNkYjBlNWQwZmQ3ZGYzYTMxMWE5NGRlMDYyYjI2YjgwYzYxZmJjOTc1MDhiNzk5OTI2NzFlZjdjYTdmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3OTg1ZmRmZDEyN2MwNTY3YzZmNTNlYzFiYjYzZWMzMTU4ZTU5N2M0MGJmZTc0N2M4M2NkZGZjOTEwNjQxOTE3JyxcbiAgICAgICAgJzYwM2MxMmRhZjNkOTg2MmVmMmIyNWZlMWRlMjg5YWVkMjRlZDI5MWUwZWM2NzA4NzAzYTViZDU2N2YzMmVkMDMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc0YTFhZDZiNWY3NmUzOWRiMmRkMjQ5NDEwZWFjN2Y5OWU3NGM1OWNiODNkMmQwZWQ1ZmYxNTQzZGE3NzAzZTknLFxuICAgICAgICAnY2M2MTU3ZWYxOGM5YzYzY2Q2MTkzZDgzNjMxYmJlYTAwOTNlMDk2ODk0MmU4YzMzZDU3MzdmZDc5MGUwZGIwOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzA2ODJhNTA3MDMzNzVmNjAyZDQxNjY2NGJhMTliN2ZjOWJhYjQyYzcyNzQ3NDYzYTcxZDA4OTZiMjJmNmRhMycsXG4gICAgICAgICc1NTNlMDRmNmIwMThiNGZhNmM4ZjM5ZTdmMzExZDMxNzYyOTBkMGUwZjE5Y2E3M2YxNzcxNGQ5OTc3YTIyZmY4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5ZTIxNThmMGQ3YzBkNWYyNmMzNzkxZWZlZmE3OTU5NzY1NGU3YTJiMjQ2NGY1MmIxZWU2YzEzNDc3NjllZjU3JyxcbiAgICAgICAgJzcxMmZjZGQxYjkwNTNmMDkwMDNhMzQ4MWZhNzc2MmU5ZmZkN2M4ZWYzNWEzODUwOWUyZmJmMjYyOTAwODM3MycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTc2ZTI2OTg5YTQzYzljZmViYTQwMjljMjAyNTM4YzI4MTcyZTU2NmUzYzRmY2U3MzIyODU3ZjNiZTMyN2Q2NicsXG4gICAgICAgICdlZDhjYzlkMDRiMjllYjg3N2QyNzBiNDg3OGRjNDNjMTlhZWZkMzFmNGVlZTA5ZWU3YjQ3ODM0YzFmYTRiMWMzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NWQ0NmVmZWEzNzcxZTZlNjhhYmI4OWExM2FkNzQ3ZWNmMTg5MjM5M2RmYzRmMWI3MDA0Nzg4YzUwMzc0ZGE4JyxcbiAgICAgICAgJzk4NTIzOTBhOTk1MDc2NzlmZDBiODZmZDJiMzlhODY4ZDdlZmMyMjE1MTM0NmUxYTNjYTQ3MjY1ODZhNmJlZDgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzgwOWEyMGM2N2Q2NDkwMGZmYjY5OGM0YzgyNWY2ZDVmMjMxMGZiMDQ1MWM4NjkzNDViNzMxOWY2NDU2MDU3MjEnLFxuICAgICAgICAnOWU5OTQ5ODBkOTkxN2UyMmI3NmIwNjE5MjdmYTA0MTQzZDA5NmNjYzU0OTYzZTZhNWViZmE1ZjNmOGUyODZjMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMWIzODkwM2E0M2Y3ZjExNGVkNDUwMGI0ZWFjNzA4M2ZkZWZlY2UxY2YyOWM2MzUyOGQ1NjM0NDZmOTcyYzE4MCcsXG4gICAgICAgICc0MDM2ZWRjOTMxYTYwYWU4ODkzNTNmNzdmZDUzZGU0YTI3MDhiMjZiNmY1ZGE3MmFkMzM5NDExOWRhZjQwOGY5JyxcbiAgICAgIF0sXG4gICAgXSxcbiAgfSxcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGN1cnZlcyA9IGV4cG9ydHM7XG5cbnZhciBoYXNoID0gcmVxdWlyZSgnaGFzaC5qcycpO1xudmFyIGN1cnZlID0gcmVxdWlyZSgnLi9jdXJ2ZScpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBQcmVzZXRDdXJ2ZShvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLnR5cGUgPT09ICdzaG9ydCcpXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBjdXJ2ZS5zaG9ydChvcHRpb25zKTtcbiAgZWxzZSBpZiAob3B0aW9ucy50eXBlID09PSAnZWR3YXJkcycpXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBjdXJ2ZS5lZHdhcmRzKG9wdGlvbnMpO1xuICBlbHNlXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBjdXJ2ZS5tb250KG9wdGlvbnMpO1xuICB0aGlzLmcgPSB0aGlzLmN1cnZlLmc7XG4gIHRoaXMubiA9IHRoaXMuY3VydmUubjtcbiAgdGhpcy5oYXNoID0gb3B0aW9ucy5oYXNoO1xuXG4gIGFzc2VydCh0aGlzLmcudmFsaWRhdGUoKSwgJ0ludmFsaWQgY3VydmUnKTtcbiAgYXNzZXJ0KHRoaXMuZy5tdWwodGhpcy5uKS5pc0luZmluaXR5KCksICdJbnZhbGlkIGN1cnZlLCBHKk4gIT0gTycpO1xufVxuY3VydmVzLlByZXNldEN1cnZlID0gUHJlc2V0Q3VydmU7XG5cbmZ1bmN0aW9uIGRlZmluZUN1cnZlKG5hbWUsIG9wdGlvbnMpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1cnZlcywgbmFtZSwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY3VydmUgPSBuZXcgUHJlc2V0Q3VydmUob3B0aW9ucyk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VydmVzLCBuYW1lLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGN1cnZlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gY3VydmU7XG4gICAgfSxcbiAgfSk7XG59XG5cbmRlZmluZUN1cnZlKCdwMTkyJywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogJ3AxOTInLFxuICBwOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYnLFxuICBhOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmMnLFxuICBiOiAnNjQyMTA1MTkgZTU5YzgwZTcgMGZhN2U5YWIgNzIyNDMwNDkgZmViOGRlZWMgYzE0NmI5YjEnLFxuICBuOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgOTlkZWY4MzYgMTQ2YmM5YjEgYjRkMjI4MzEnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnMTg4ZGE4MGUgYjAzMDkwZjYgN2NiZjIwZWIgNDNhMTg4MDAgZjRmZjBhZmQgODJmZjEwMTInLFxuICAgICcwNzE5MmI5NSBmZmM4ZGE3OCA2MzEwMTFlZCA2YjI0Y2RkNSA3M2Y5NzdhMSAxZTc5NDgxMScsXG4gIF0sXG59KTtcblxuZGVmaW5lQ3VydmUoJ3AyMjQnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiAncDIyNCcsXG4gIHA6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMScsXG4gIGE6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZScsXG4gIGI6ICdiNDA1MGE4NSAwYzA0YjNhYiBmNTQxMzI1NiA1MDQ0YjBiNyBkN2JmZDhiYSAyNzBiMzk0MyAyMzU1ZmZiNCcsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmMTZhMiBlMGI4ZjAzZSAxM2RkMjk0NSA1YzVjMmEzZCcsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICdiNzBlMGNiZCA2YmI0YmY3ZiAzMjEzOTBiOSA0YTAzYzFkMyA1NmMyMTEyMiAzNDMyODBkNiAxMTVjMWQyMScsXG4gICAgJ2JkMzc2Mzg4IGI1ZjcyM2ZiIDRjMjJkZmU2IGNkNDM3NWEwIDVhMDc0NzY0IDQ0ZDU4MTk5IDg1MDA3ZTM0JyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDI1NicsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6IG51bGwsXG4gIHA6ICdmZmZmZmZmZiAwMDAwMDAwMSAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZicsXG4gIGE6ICdmZmZmZmZmZiAwMDAwMDAwMSAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYycsXG4gIGI6ICc1YWM2MzVkOCBhYTNhOTNlNyBiM2ViYmQ1NSA3Njk4ODZiYyA2NTFkMDZiMCBjYzUzYjBmNiAzYmNlM2MzZSAyN2QyNjA0YicsXG4gIG46ICdmZmZmZmZmZiAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBiY2U2ZmFhZCBhNzE3OWU4NCBmM2I5Y2FjMiBmYzYzMjU1MScsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICc2YjE3ZDFmMiBlMTJjNDI0NyBmOGJjZTZlNSA2M2E0NDBmMiA3NzAzN2Q4MSAyZGViMzNhMCBmNGExMzk0NSBkODk4YzI5NicsXG4gICAgJzRmZTM0MmUyIGZlMWE3ZjliIDhlZTdlYjRhIDdjMGY5ZTE2IDJiY2UzMzU3IDZiMzE1ZWNlIGNiYjY0MDY4IDM3YmY1MWY1JyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDM4NCcsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6IG51bGwsXG4gIHA6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZlIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmJyxcbiAgYTogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmUgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmMnLFxuICBiOiAnYjMzMTJmYTcgZTIzZWU3ZTQgOTg4ZTA1NmIgZTNmODJkMTkgMTgxZDljNmUgZmU4MTQxMTIgMDMxNDA4OGYgJyArXG4gICAgICc1MDEzODc1YSBjNjU2Mzk4ZCA4YTJlZDE5ZCAyYTg1YzhlZCBkM2VjMmFlZicsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBjNzYzNGQ4MSAnICtcbiAgICAgJ2Y0MzcyZGRmIDU4MWEwZGIyIDQ4YjBhNzdhIGVjZWMxOTZhIGNjYzUyOTczJyxcbiAgaGFzaDogaGFzaC5zaGEzODQsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJ2FhODdjYTIyIGJlOGIwNTM3IDhlYjFjNzFlIGYzMjBhZDc0IDZlMWQzYjYyIDhiYTc5Yjk4IDU5Zjc0MWUwIDgyNTQyYTM4ICcgK1xuICAgICc1NTAyZjI1ZCBiZjU1Mjk2YyAzYTU0NWUzOCA3Mjc2MGFiNycsXG4gICAgJzM2MTdkZTRhIDk2MjYyYzZmIDVkOWU5OGJmIDkyOTJkYzI5IGY4ZjQxZGJkIDI4OWExNDdjIGU5ZGEzMTEzIGI1ZjBiOGMwICcgK1xuICAgICcwYTYwYjFjZSAxZDdlODE5ZCA3YTQzMWQ3YyA5MGVhMGU1ZicsXG4gIF0sXG59KTtcblxuZGVmaW5lQ3VydmUoJ3A1MjEnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiBudWxsLFxuICBwOiAnMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmJyxcbiAgYTogJzAwMDAwMWZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYycsXG4gIGI6ICcwMDAwMDA1MSA5NTNlYjk2MSA4ZTFjOWExZiA5MjlhMjFhMCBiNjg1NDBlZSBhMmRhNzI1YiAnICtcbiAgICAgJzk5YjMxNWYzIGI4YjQ4OTkxIDhlZjEwOWUxIDU2MTkzOTUxIGVjN2U5MzdiIDE2NTJjMGJkICcgK1xuICAgICAnM2JiMWJmMDcgMzU3M2RmODggM2QyYzM0ZjEgZWY0NTFmZDQgNmI1MDNmMDAnLFxuICBuOiAnMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmYSA1MTg2ODc4MyBiZjJmOTY2YiA3ZmNjMDE0OCAnICtcbiAgICAgJ2Y3MDlhNWQwIDNiYjVjOWI4IDg5OWM0N2FlIGJiNmZiNzFlIDkxMzg2NDA5JyxcbiAgaGFzaDogaGFzaC5zaGE1MTIsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzAwMDAwMGM2IDg1OGUwNmI3IDA0MDRlOWNkIDllM2VjYjY2IDIzOTViNDQyIDljNjQ4MTM5ICcgK1xuICAgICcwNTNmYjUyMSBmODI4YWY2MCA2YjRkM2RiYSBhMTRiNWU3NyBlZmU3NTkyOCBmZTFkYzEyNyAnICtcbiAgICAnYTJmZmE4ZGUgMzM0OGIzYzEgODU2YTQyOWIgZjk3ZTdlMzEgYzJlNWJkNjYnLFxuICAgICcwMDAwMDExOCAzOTI5NmE3OCA5YTNiYzAwNCA1YzhhNWZiNCAyYzdkMWJkOSA5OGY1NDQ0OSAnICtcbiAgICAnNTc5YjQ0NjggMTdhZmJkMTcgMjczZTY2MmMgOTdlZTcyOTkgNWVmNDI2NDAgYzU1MGI5MDEgJyArXG4gICAgJzNmYWQwNzYxIDM1M2M3MDg2IGEyNzJjMjQwIDg4YmU5NDc2IDlmZDE2NjUwJyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgnY3VydmUyNTUxOScsIHtcbiAgdHlwZTogJ21vbnQnLFxuICBwcmltZTogJ3AyNTUxOScsXG4gIHA6ICc3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkJyxcbiAgYTogJzc2ZDA2JyxcbiAgYjogJzEnLFxuICBuOiAnMTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIDE0ZGVmOWRlYTJmNzljZDYgNTgxMjYzMWE1Y2Y1ZDNlZCcsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICc5JyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgnZWQyNTUxOScsIHtcbiAgdHlwZTogJ2Vkd2FyZHMnLFxuICBwcmltZTogJ3AyNTUxOScsXG4gIHA6ICc3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkJyxcbiAgYTogJy0xJyxcbiAgYzogJzEnLFxuICAvLyAtMTIxNjY1ICogKDEyMTY2Nl4oLTEpKSAobW9kIFApXG4gIGQ6ICc1MjAzNmNlZTJiNmZmZTczIDhjYzc0MDc5Nzc3OWU4OTggMDA3MDBhNGQ0MTQxZDhhYiA3NWViNGRjYTEzNTk3OGEzJyxcbiAgbjogJzEwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAxNGRlZjlkZWEyZjc5Y2Q2IDU4MTI2MzFhNWNmNWQzZWQnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnMjE2OTM2ZDNjZDZlNTNmZWMwYTRlMjMxZmRkNmRjNWM2OTJjYzc2MDk1MjVhN2IyYzk1NjJkNjA4ZjI1ZDUxYScsXG5cbiAgICAvLyA0LzVcbiAgICAnNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY1OCcsXG4gIF0sXG59KTtcblxudmFyIHByZTtcbnRyeSB7XG4gIHByZSA9IHJlcXVpcmUoJy4vcHJlY29tcHV0ZWQvc2VjcDI1NmsxJyk7XG59IGNhdGNoIChlKSB7XG4gIHByZSA9IHVuZGVmaW5lZDtcbn1cblxuZGVmaW5lQ3VydmUoJ3NlY3AyNTZrMScsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6ICdrMjU2JyxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmJyxcbiAgYTogJzAnLFxuICBiOiAnNycsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBiYWFlZGNlNiBhZjQ4YTAzYiBiZmQyNWU4YyBkMDM2NDE0MScsXG4gIGg6ICcxJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG5cbiAgLy8gUHJlY29tcHV0ZWQgZW5kb21vcnBoaXNtXG4gIGJldGE6ICc3YWU5NmEyYjY1N2MwNzEwNmU2NDQ3OWVhYzM0MzRlOTljZjA0OTc1MTJmNTg5OTVjMTM5NmMyODcxOTUwMWVlJyxcbiAgbGFtYmRhOiAnNTM2M2FkNGNjMDVjMzBlMGE1MjYxYzAyODgxMjY0NWExMjJlMjJlYTIwODE2Njc4ZGYwMjk2N2MxYjIzYmQ3MicsXG4gIGJhc2lzOiBbXG4gICAge1xuICAgICAgYTogJzMwODZkMjIxYTdkNDZiY2RlODZjOTBlNDkyODRlYjE1JyxcbiAgICAgIGI6ICctZTQ0MzdlZDYwMTBlODgyODZmNTQ3ZmE5MGFiZmU0YzMnLFxuICAgIH0sXG4gICAge1xuICAgICAgYTogJzExNGNhNTBmN2E4ZTJmM2Y2NTdjMTEwOGQ5ZDQ0Y2ZkOCcsXG4gICAgICBiOiAnMzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTUnLFxuICAgIH0sXG4gIF0sXG5cbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnNzliZTY2N2VmOWRjYmJhYzU1YTA2Mjk1Y2U4NzBiMDcwMjliZmNkYjJkY2UyOGQ5NTlmMjgxNWIxNmY4MTc5OCcsXG4gICAgJzQ4M2FkYTc3MjZhM2M0NjU1ZGE0ZmJmYzBlMTEwOGE4ZmQxN2I0NDhhNjg1NTQxOTljNDdkMDhmZmIxMGQ0YjgnLFxuICAgIHByZSxcbiAgXSxcbn0pO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNoID0gcmVxdWlyZSgnaGFzaC5qcycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWNyeXB0by11dGlscycpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuZnVuY3Rpb24gSG1hY0RSQkcob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSG1hY0RSQkcpKVxuICAgIHJldHVybiBuZXcgSG1hY0RSQkcob3B0aW9ucyk7XG4gIHRoaXMuaGFzaCA9IG9wdGlvbnMuaGFzaDtcbiAgdGhpcy5wcmVkUmVzaXN0ID0gISFvcHRpb25zLnByZWRSZXNpc3Q7XG5cbiAgdGhpcy5vdXRMZW4gPSB0aGlzLmhhc2gub3V0U2l6ZTtcbiAgdGhpcy5taW5FbnRyb3B5ID0gb3B0aW9ucy5taW5FbnRyb3B5IHx8IHRoaXMuaGFzaC5obWFjU3RyZW5ndGg7XG5cbiAgdGhpcy5fcmVzZWVkID0gbnVsbDtcbiAgdGhpcy5yZXNlZWRJbnRlcnZhbCA9IG51bGw7XG4gIHRoaXMuSyA9IG51bGw7XG4gIHRoaXMuViA9IG51bGw7XG5cbiAgdmFyIGVudHJvcHkgPSB1dGlscy50b0FycmF5KG9wdGlvbnMuZW50cm9weSwgb3B0aW9ucy5lbnRyb3B5RW5jIHx8ICdoZXgnKTtcbiAgdmFyIG5vbmNlID0gdXRpbHMudG9BcnJheShvcHRpb25zLm5vbmNlLCBvcHRpb25zLm5vbmNlRW5jIHx8ICdoZXgnKTtcbiAgdmFyIHBlcnMgPSB1dGlscy50b0FycmF5KG9wdGlvbnMucGVycywgb3B0aW9ucy5wZXJzRW5jIHx8ICdoZXgnKTtcbiAgYXNzZXJ0KGVudHJvcHkubGVuZ3RoID49ICh0aGlzLm1pbkVudHJvcHkgLyA4KSxcbiAgICAgICAgICdOb3QgZW5vdWdoIGVudHJvcHkuIE1pbmltdW0gaXM6ICcgKyB0aGlzLm1pbkVudHJvcHkgKyAnIGJpdHMnKTtcbiAgdGhpcy5faW5pdChlbnRyb3B5LCBub25jZSwgcGVycyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEhtYWNEUkJHO1xuXG5IbWFjRFJCRy5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0KGVudHJvcHksIG5vbmNlLCBwZXJzKSB7XG4gIHZhciBzZWVkID0gZW50cm9weS5jb25jYXQobm9uY2UpLmNvbmNhdChwZXJzKTtcblxuICB0aGlzLksgPSBuZXcgQXJyYXkodGhpcy5vdXRMZW4gLyA4KTtcbiAgdGhpcy5WID0gbmV3IEFycmF5KHRoaXMub3V0TGVuIC8gOCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5WLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5LW2ldID0gMHgwMDtcbiAgICB0aGlzLlZbaV0gPSAweDAxO1xuICB9XG5cbiAgdGhpcy5fdXBkYXRlKHNlZWQpO1xuICB0aGlzLl9yZXNlZWQgPSAxO1xuICB0aGlzLnJlc2VlZEludGVydmFsID0gMHgxMDAwMDAwMDAwMDAwOyAgLy8gMl40OFxufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLl9obWFjID0gZnVuY3Rpb24gaG1hYygpIHtcbiAgcmV0dXJuIG5ldyBoYXNoLmhtYWModGhpcy5oYXNoLCB0aGlzLkspO1xufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoc2VlZCkge1xuICB2YXIga21hYyA9IHRoaXMuX2htYWMoKVxuICAgICAgICAgICAgICAgICAudXBkYXRlKHRoaXMuVilcbiAgICAgICAgICAgICAgICAgLnVwZGF0ZShbIDB4MDAgXSk7XG4gIGlmIChzZWVkKVxuICAgIGttYWMgPSBrbWFjLnVwZGF0ZShzZWVkKTtcbiAgdGhpcy5LID0ga21hYy5kaWdlc3QoKTtcbiAgdGhpcy5WID0gdGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLmRpZ2VzdCgpO1xuICBpZiAoIXNlZWQpXG4gICAgcmV0dXJuO1xuXG4gIHRoaXMuSyA9IHRoaXMuX2htYWMoKVxuICAgICAgICAgICAgICAgLnVwZGF0ZSh0aGlzLlYpXG4gICAgICAgICAgICAgICAudXBkYXRlKFsgMHgwMSBdKVxuICAgICAgICAgICAgICAgLnVwZGF0ZShzZWVkKVxuICAgICAgICAgICAgICAgLmRpZ2VzdCgpO1xuICB0aGlzLlYgPSB0aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCk7XG59O1xuXG5IbWFjRFJCRy5wcm90b3R5cGUucmVzZWVkID0gZnVuY3Rpb24gcmVzZWVkKGVudHJvcHksIGVudHJvcHlFbmMsIGFkZCwgYWRkRW5jKSB7XG4gIC8vIE9wdGlvbmFsIGVudHJvcHkgZW5jXG4gIGlmICh0eXBlb2YgZW50cm9weUVuYyAhPT0gJ3N0cmluZycpIHtcbiAgICBhZGRFbmMgPSBhZGQ7XG4gICAgYWRkID0gZW50cm9weUVuYztcbiAgICBlbnRyb3B5RW5jID0gbnVsbDtcbiAgfVxuXG4gIGVudHJvcHkgPSB1dGlscy50b0FycmF5KGVudHJvcHksIGVudHJvcHlFbmMpO1xuICBhZGQgPSB1dGlscy50b0FycmF5KGFkZCwgYWRkRW5jKTtcblxuICBhc3NlcnQoZW50cm9weS5sZW5ndGggPj0gKHRoaXMubWluRW50cm9weSAvIDgpLFxuICAgICAgICAgJ05vdCBlbm91Z2ggZW50cm9weS4gTWluaW11bSBpczogJyArIHRoaXMubWluRW50cm9weSArICcgYml0cycpO1xuXG4gIHRoaXMuX3VwZGF0ZShlbnRyb3B5LmNvbmNhdChhZGQgfHwgW10pKTtcbiAgdGhpcy5fcmVzZWVkID0gMTtcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uIGdlbmVyYXRlKGxlbiwgZW5jLCBhZGQsIGFkZEVuYykge1xuICBpZiAodGhpcy5fcmVzZWVkID4gdGhpcy5yZXNlZWRJbnRlcnZhbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc2VlZCBpcyByZXF1aXJlZCcpO1xuXG4gIC8vIE9wdGlvbmFsIGVuY29kaW5nXG4gIGlmICh0eXBlb2YgZW5jICE9PSAnc3RyaW5nJykge1xuICAgIGFkZEVuYyA9IGFkZDtcbiAgICBhZGQgPSBlbmM7XG4gICAgZW5jID0gbnVsbDtcbiAgfVxuXG4gIC8vIE9wdGlvbmFsIGFkZGl0aW9uYWwgZGF0YVxuICBpZiAoYWRkKSB7XG4gICAgYWRkID0gdXRpbHMudG9BcnJheShhZGQsIGFkZEVuYyB8fCAnaGV4Jyk7XG4gICAgdGhpcy5fdXBkYXRlKGFkZCk7XG4gIH1cblxuICB2YXIgdGVtcCA9IFtdO1xuICB3aGlsZSAodGVtcC5sZW5ndGggPCBsZW4pIHtcbiAgICB0aGlzLlYgPSB0aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCk7XG4gICAgdGVtcCA9IHRlbXAuY29uY2F0KHRoaXMuVik7XG4gIH1cblxuICB2YXIgcmVzID0gdGVtcC5zbGljZSgwLCBsZW4pO1xuICB0aGlzLl91cGRhdGUoYWRkKTtcbiAgdGhpcy5fcmVzZWVkKys7XG4gIHJldHVybiB1dGlscy5lbmNvZGUocmVzLCBlbmMpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIEtleVBhaXIoZWMsIG9wdGlvbnMpIHtcbiAgdGhpcy5lYyA9IGVjO1xuICB0aGlzLnByaXYgPSBudWxsO1xuICB0aGlzLnB1YiA9IG51bGw7XG5cbiAgLy8gS2V5UGFpcihlYywgeyBwcml2OiAuLi4sIHB1YjogLi4uIH0pXG4gIGlmIChvcHRpb25zLnByaXYpXG4gICAgdGhpcy5faW1wb3J0UHJpdmF0ZShvcHRpb25zLnByaXYsIG9wdGlvbnMucHJpdkVuYyk7XG4gIGlmIChvcHRpb25zLnB1YilcbiAgICB0aGlzLl9pbXBvcnRQdWJsaWMob3B0aW9ucy5wdWIsIG9wdGlvbnMucHViRW5jKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gS2V5UGFpcjtcblxuS2V5UGFpci5mcm9tUHVibGljID0gZnVuY3Rpb24gZnJvbVB1YmxpYyhlYywgcHViLCBlbmMpIHtcbiAgaWYgKHB1YiBpbnN0YW5jZW9mIEtleVBhaXIpXG4gICAgcmV0dXJuIHB1YjtcblxuICByZXR1cm4gbmV3IEtleVBhaXIoZWMsIHtcbiAgICBwdWI6IHB1YixcbiAgICBwdWJFbmM6IGVuYyxcbiAgfSk7XG59O1xuXG5LZXlQYWlyLmZyb21Qcml2YXRlID0gZnVuY3Rpb24gZnJvbVByaXZhdGUoZWMsIHByaXYsIGVuYykge1xuICBpZiAocHJpdiBpbnN0YW5jZW9mIEtleVBhaXIpXG4gICAgcmV0dXJuIHByaXY7XG5cbiAgcmV0dXJuIG5ldyBLZXlQYWlyKGVjLCB7XG4gICAgcHJpdjogcHJpdixcbiAgICBwcml2RW5jOiBlbmMsXG4gIH0pO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgdmFyIHB1YiA9IHRoaXMuZ2V0UHVibGljKCk7XG5cbiAgaWYgKHB1Yi5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgcmVhc29uOiAnSW52YWxpZCBwdWJsaWMga2V5JyB9O1xuICBpZiAoIXB1Yi52YWxpZGF0ZSgpKVxuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIHJlYXNvbjogJ1B1YmxpYyBrZXkgaXMgbm90IGEgcG9pbnQnIH07XG4gIGlmICghcHViLm11bCh0aGlzLmVjLmN1cnZlLm4pLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCByZWFzb246ICdQdWJsaWMga2V5ICogTiAhPSBPJyB9O1xuXG4gIHJldHVybiB7IHJlc3VsdDogdHJ1ZSwgcmVhc29uOiBudWxsIH07XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRQdWJsaWMgPSBmdW5jdGlvbiBnZXRQdWJsaWMoY29tcGFjdCwgZW5jKSB7XG4gIC8vIGNvbXBhY3QgaXMgb3B0aW9uYWwgYXJndW1lbnRcbiAgaWYgKHR5cGVvZiBjb21wYWN0ID09PSAnc3RyaW5nJykge1xuICAgIGVuYyA9IGNvbXBhY3Q7XG4gICAgY29tcGFjdCA9IG51bGw7XG4gIH1cblxuICBpZiAoIXRoaXMucHViKVxuICAgIHRoaXMucHViID0gdGhpcy5lYy5nLm11bCh0aGlzLnByaXYpO1xuXG4gIGlmICghZW5jKVxuICAgIHJldHVybiB0aGlzLnB1YjtcblxuICByZXR1cm4gdGhpcy5wdWIuZW5jb2RlKGVuYywgY29tcGFjdCk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRQcml2YXRlID0gZnVuY3Rpb24gZ2V0UHJpdmF0ZShlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHRoaXMucHJpdi50b1N0cmluZygxNiwgMik7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5wcml2O1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuX2ltcG9ydFByaXZhdGUgPSBmdW5jdGlvbiBfaW1wb3J0UHJpdmF0ZShrZXksIGVuYykge1xuICB0aGlzLnByaXYgPSBuZXcgQk4oa2V5LCBlbmMgfHwgMTYpO1xuXG4gIC8vIEVuc3VyZSB0aGF0IHRoZSBwcml2IHdvbid0IGJlIGJpZ2dlciB0aGFuIG4sIG90aGVyd2lzZSB3ZSBtYXkgZmFpbFxuICAvLyBpbiBmaXhlZCBtdWx0aXBsaWNhdGlvbiBtZXRob2RcbiAgdGhpcy5wcml2ID0gdGhpcy5wcml2LnVtb2QodGhpcy5lYy5jdXJ2ZS5uKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLl9pbXBvcnRQdWJsaWMgPSBmdW5jdGlvbiBfaW1wb3J0UHVibGljKGtleSwgZW5jKSB7XG4gIGlmIChrZXkueCB8fCBrZXkueSkge1xuICAgIC8vIE1vbnRnb21lcnkgcG9pbnRzIG9ubHkgaGF2ZSBhbiBgeGAgY29vcmRpbmF0ZS5cbiAgICAvLyBXZWllcnN0cmFzcy9FZHdhcmRzIHBvaW50cyBvbiB0aGUgb3RoZXIgaGFuZCBoYXZlIGJvdGggYHhgIGFuZFxuICAgIC8vIGB5YCBjb29yZGluYXRlcy5cbiAgICBpZiAodGhpcy5lYy5jdXJ2ZS50eXBlID09PSAnbW9udCcpIHtcbiAgICAgIGFzc2VydChrZXkueCwgJ05lZWQgeCBjb29yZGluYXRlJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmVjLmN1cnZlLnR5cGUgPT09ICdzaG9ydCcgfHxcbiAgICAgICAgICAgICAgIHRoaXMuZWMuY3VydmUudHlwZSA9PT0gJ2Vkd2FyZHMnKSB7XG4gICAgICBhc3NlcnQoa2V5LnggJiYga2V5LnksICdOZWVkIGJvdGggeCBhbmQgeSBjb29yZGluYXRlJyk7XG4gICAgfVxuICAgIHRoaXMucHViID0gdGhpcy5lYy5jdXJ2ZS5wb2ludChrZXkueCwga2V5LnkpO1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnB1YiA9IHRoaXMuZWMuY3VydmUuZGVjb2RlUG9pbnQoa2V5LCBlbmMpO1xufTtcblxuLy8gRUNESFxuS2V5UGFpci5wcm90b3R5cGUuZGVyaXZlID0gZnVuY3Rpb24gZGVyaXZlKHB1Yikge1xuICBpZighcHViLnZhbGlkYXRlKCkpIHtcbiAgICBhc3NlcnQocHViLnZhbGlkYXRlKCksICdwdWJsaWMgcG9pbnQgbm90IHZhbGlkYXRlZCcpO1xuICB9XG4gIHJldHVybiBwdWIubXVsKHRoaXMucHJpdikuZ2V0WCgpO1xufTtcblxuLy8gRUNEU0FcbktleVBhaXIucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduKG1zZywgZW5jLCBvcHRpb25zKSB7XG4gIHJldHVybiB0aGlzLmVjLnNpZ24obXNnLCB0aGlzLCBlbmMsIG9wdGlvbnMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KG1zZywgc2lnbmF0dXJlLCBvcHRpb25zKSB7XG4gIHJldHVybiB0aGlzLmVjLnZlcmlmeShtc2csIHNpZ25hdHVyZSwgdGhpcywgdW5kZWZpbmVkLCBvcHRpb25zKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICByZXR1cm4gJzxLZXkgcHJpdjogJyArICh0aGlzLnByaXYgJiYgdGhpcy5wcml2LnRvU3RyaW5nKDE2LCAyKSkgK1xuICAgICAgICAgJyBwdWI6ICcgKyAodGhpcy5wdWIgJiYgdGhpcy5wdWIuaW5zcGVjdCgpKSArICcgPic7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBTaWduYXR1cmUob3B0aW9ucywgZW5jKSB7XG4gIGlmIChvcHRpb25zIGluc3RhbmNlb2YgU2lnbmF0dXJlKVxuICAgIHJldHVybiBvcHRpb25zO1xuXG4gIGlmICh0aGlzLl9pbXBvcnRERVIob3B0aW9ucywgZW5jKSlcbiAgICByZXR1cm47XG5cbiAgYXNzZXJ0KG9wdGlvbnMuciAmJiBvcHRpb25zLnMsICdTaWduYXR1cmUgd2l0aG91dCByIG9yIHMnKTtcbiAgdGhpcy5yID0gbmV3IEJOKG9wdGlvbnMuciwgMTYpO1xuICB0aGlzLnMgPSBuZXcgQk4ob3B0aW9ucy5zLCAxNik7XG4gIGlmIChvcHRpb25zLnJlY292ZXJ5UGFyYW0gPT09IHVuZGVmaW5lZClcbiAgICB0aGlzLnJlY292ZXJ5UGFyYW0gPSBudWxsO1xuICBlbHNlXG4gICAgdGhpcy5yZWNvdmVyeVBhcmFtID0gb3B0aW9ucy5yZWNvdmVyeVBhcmFtO1xufVxubW9kdWxlLmV4cG9ydHMgPSBTaWduYXR1cmU7XG5cbmZ1bmN0aW9uIFBvc2l0aW9uKCkge1xuICB0aGlzLnBsYWNlID0gMDtcbn1cblxuZnVuY3Rpb24gZ2V0TGVuZ3RoKGJ1ZiwgcCkge1xuICB2YXIgaW5pdGlhbCA9IGJ1ZltwLnBsYWNlKytdO1xuICBpZiAoIShpbml0aWFsICYgMHg4MCkpIHtcbiAgICByZXR1cm4gaW5pdGlhbDtcbiAgfVxuICB2YXIgb2N0ZXRMZW4gPSBpbml0aWFsICYgMHhmO1xuXG4gIC8vIEluZGVmaW5pdGUgbGVuZ3RoIG9yIG92ZXJmbG93XG4gIGlmIChvY3RldExlbiA9PT0gMCB8fCBvY3RldExlbiA+IDQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZihidWZbcC5wbGFjZV0gPT09IDB4MDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdmFsID0gMDtcbiAgZm9yICh2YXIgaSA9IDAsIG9mZiA9IHAucGxhY2U7IGkgPCBvY3RldExlbjsgaSsrLCBvZmYrKykge1xuICAgIHZhbCA8PD0gODtcbiAgICB2YWwgfD0gYnVmW29mZl07XG4gICAgdmFsID4+Pj0gMDtcbiAgfVxuXG4gIC8vIExlYWRpbmcgemVyb2VzXG4gIGlmICh2YWwgPD0gMHg3Zikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHAucGxhY2UgPSBvZmY7XG4gIHJldHVybiB2YWw7XG59XG5cbmZ1bmN0aW9uIHJtUGFkZGluZyhidWYpIHtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aCAtIDE7XG4gIHdoaWxlICghYnVmW2ldICYmICEoYnVmW2kgKyAxXSAmIDB4ODApICYmIGkgPCBsZW4pIHtcbiAgICBpKys7XG4gIH1cbiAgaWYgKGkgPT09IDApIHtcbiAgICByZXR1cm4gYnVmO1xuICB9XG4gIHJldHVybiBidWYuc2xpY2UoaSk7XG59XG5cblNpZ25hdHVyZS5wcm90b3R5cGUuX2ltcG9ydERFUiA9IGZ1bmN0aW9uIF9pbXBvcnRERVIoZGF0YSwgZW5jKSB7XG4gIGRhdGEgPSB1dGlscy50b0FycmF5KGRhdGEsIGVuYyk7XG4gIHZhciBwID0gbmV3IFBvc2l0aW9uKCk7XG4gIGlmIChkYXRhW3AucGxhY2UrK10gIT09IDB4MzApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGxlbiA9IGdldExlbmd0aChkYXRhLCBwKTtcbiAgaWYgKGxlbiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKChsZW4gKyBwLnBsYWNlKSAhPT0gZGF0YS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGRhdGFbcC5wbGFjZSsrXSAhPT0gMHgwMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcmxlbiA9IGdldExlbmd0aChkYXRhLCBwKTtcbiAgaWYgKHJsZW4gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICgoZGF0YVtwLnBsYWNlXSAmIDEyOCkgIT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHIgPSBkYXRhLnNsaWNlKHAucGxhY2UsIHJsZW4gKyBwLnBsYWNlKTtcbiAgcC5wbGFjZSArPSBybGVuO1xuICBpZiAoZGF0YVtwLnBsYWNlKytdICE9PSAweDAyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBzbGVuID0gZ2V0TGVuZ3RoKGRhdGEsIHApO1xuICBpZiAoc2xlbiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGRhdGEubGVuZ3RoICE9PSBzbGVuICsgcC5wbGFjZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoKGRhdGFbcC5wbGFjZV0gJiAxMjgpICE9PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBzID0gZGF0YS5zbGljZShwLnBsYWNlLCBzbGVuICsgcC5wbGFjZSk7XG4gIGlmIChyWzBdID09PSAwKSB7XG4gICAgaWYgKHJbMV0gJiAweDgwKSB7XG4gICAgICByID0gci5zbGljZSgxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGVhZGluZyB6ZXJvZXNcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKHNbMF0gPT09IDApIHtcbiAgICBpZiAoc1sxXSAmIDB4ODApIHtcbiAgICAgIHMgPSBzLnNsaWNlKDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMZWFkaW5nIHplcm9lc1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuciA9IG5ldyBCTihyKTtcbiAgdGhpcy5zID0gbmV3IEJOKHMpO1xuICB0aGlzLnJlY292ZXJ5UGFyYW0gPSBudWxsO1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gY29uc3RydWN0TGVuZ3RoKGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPCAweDgwKSB7XG4gICAgYXJyLnB1c2gobGVuKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG9jdGV0cyA9IDEgKyAoTWF0aC5sb2cobGVuKSAvIE1hdGguTE4yID4+PiAzKTtcbiAgYXJyLnB1c2gob2N0ZXRzIHwgMHg4MCk7XG4gIHdoaWxlICgtLW9jdGV0cykge1xuICAgIGFyci5wdXNoKChsZW4gPj4+IChvY3RldHMgPDwgMykpICYgMHhmZik7XG4gIH1cbiAgYXJyLnB1c2gobGVuKTtcbn1cblxuU2lnbmF0dXJlLnByb3RvdHlwZS50b0RFUiA9IGZ1bmN0aW9uIHRvREVSKGVuYykge1xuICB2YXIgciA9IHRoaXMuci50b0FycmF5KCk7XG4gIHZhciBzID0gdGhpcy5zLnRvQXJyYXkoKTtcblxuICAvLyBQYWQgdmFsdWVzXG4gIGlmIChyWzBdICYgMHg4MClcbiAgICByID0gWyAwIF0uY29uY2F0KHIpO1xuICAvLyBQYWQgdmFsdWVzXG4gIGlmIChzWzBdICYgMHg4MClcbiAgICBzID0gWyAwIF0uY29uY2F0KHMpO1xuXG4gIHIgPSBybVBhZGRpbmcocik7XG4gIHMgPSBybVBhZGRpbmcocyk7XG5cbiAgd2hpbGUgKCFzWzBdICYmICEoc1sxXSAmIDB4ODApKSB7XG4gICAgcyA9IHMuc2xpY2UoMSk7XG4gIH1cbiAgdmFyIGFyciA9IFsgMHgwMiBdO1xuICBjb25zdHJ1Y3RMZW5ndGgoYXJyLCByLmxlbmd0aCk7XG4gIGFyciA9IGFyci5jb25jYXQocik7XG4gIGFyci5wdXNoKDB4MDIpO1xuICBjb25zdHJ1Y3RMZW5ndGgoYXJyLCBzLmxlbmd0aCk7XG4gIHZhciBiYWNrSGFsZiA9IGFyci5jb25jYXQocyk7XG4gIHZhciByZXMgPSBbIDB4MzAgXTtcbiAgY29uc3RydWN0TGVuZ3RoKHJlcywgYmFja0hhbGYubGVuZ3RoKTtcbiAgcmVzID0gcmVzLmNvbmNhdChiYWNrSGFsZik7XG4gIHJldHVybiB1dGlscy5lbmNvZGUocmVzLCBlbmMpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIEhtYWNEUkJHID0gcmVxdWlyZSgnaG1hYy1kcmJnJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGN1cnZlcyA9IHJlcXVpcmUoJy4uL2N1cnZlcycpO1xudmFyIHJhbmQgPSByZXF1aXJlKCdicm9yYW5kJyk7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG52YXIgS2V5UGFpciA9IHJlcXVpcmUoJy4va2V5Jyk7XG52YXIgU2lnbmF0dXJlID0gcmVxdWlyZSgnLi9zaWduYXR1cmUnKTtcblxuZnVuY3Rpb24gRUMob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRUMpKVxuICAgIHJldHVybiBuZXcgRUMob3B0aW9ucyk7XG5cbiAgLy8gU2hvcnRjdXQgYGVsbGlwdGljLmVjKGN1cnZlLW5hbWUpYFxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgYXNzZXJ0KE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJ2ZXMsIG9wdGlvbnMpLFxuICAgICAgJ1Vua25vd24gY3VydmUgJyArIG9wdGlvbnMpO1xuXG4gICAgb3B0aW9ucyA9IGN1cnZlc1tvcHRpb25zXTtcbiAgfVxuXG4gIC8vIFNob3J0Y3V0IGZvciBgZWxsaXB0aWMuZWMoZWxsaXB0aWMuY3VydmVzLmN1cnZlTmFtZSlgXG4gIGlmIChvcHRpb25zIGluc3RhbmNlb2YgY3VydmVzLlByZXNldEN1cnZlKVxuICAgIG9wdGlvbnMgPSB7IGN1cnZlOiBvcHRpb25zIH07XG5cbiAgdGhpcy5jdXJ2ZSA9IG9wdGlvbnMuY3VydmUuY3VydmU7XG4gIHRoaXMubiA9IHRoaXMuY3VydmUubjtcbiAgdGhpcy5uaCA9IHRoaXMubi51c2hybigxKTtcbiAgdGhpcy5nID0gdGhpcy5jdXJ2ZS5nO1xuXG4gIC8vIFBvaW50IG9uIGN1cnZlXG4gIHRoaXMuZyA9IG9wdGlvbnMuY3VydmUuZztcbiAgdGhpcy5nLnByZWNvbXB1dGUob3B0aW9ucy5jdXJ2ZS5uLmJpdExlbmd0aCgpICsgMSk7XG5cbiAgLy8gSGFzaCBmb3IgZnVuY3Rpb24gZm9yIERSQkdcbiAgdGhpcy5oYXNoID0gb3B0aW9ucy5oYXNoIHx8IG9wdGlvbnMuY3VydmUuaGFzaDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRUM7XG5cbkVDLnByb3RvdHlwZS5rZXlQYWlyID0gZnVuY3Rpb24ga2V5UGFpcihvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgS2V5UGFpcih0aGlzLCBvcHRpb25zKTtcbn07XG5cbkVDLnByb3RvdHlwZS5rZXlGcm9tUHJpdmF0ZSA9IGZ1bmN0aW9uIGtleUZyb21Qcml2YXRlKHByaXYsIGVuYykge1xuICByZXR1cm4gS2V5UGFpci5mcm9tUHJpdmF0ZSh0aGlzLCBwcml2LCBlbmMpO1xufTtcblxuRUMucHJvdG90eXBlLmtleUZyb21QdWJsaWMgPSBmdW5jdGlvbiBrZXlGcm9tUHVibGljKHB1YiwgZW5jKSB7XG4gIHJldHVybiBLZXlQYWlyLmZyb21QdWJsaWModGhpcywgcHViLCBlbmMpO1xufTtcblxuRUMucHJvdG90eXBlLmdlbktleVBhaXIgPSBmdW5jdGlvbiBnZW5LZXlQYWlyKG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKVxuICAgIG9wdGlvbnMgPSB7fTtcblxuICAvLyBJbnN0YW50aWF0ZSBIbWFjX0RSQkdcbiAgdmFyIGRyYmcgPSBuZXcgSG1hY0RSQkcoe1xuICAgIGhhc2g6IHRoaXMuaGFzaCxcbiAgICBwZXJzOiBvcHRpb25zLnBlcnMsXG4gICAgcGVyc0VuYzogb3B0aW9ucy5wZXJzRW5jIHx8ICd1dGY4JyxcbiAgICBlbnRyb3B5OiBvcHRpb25zLmVudHJvcHkgfHwgcmFuZCh0aGlzLmhhc2guaG1hY1N0cmVuZ3RoKSxcbiAgICBlbnRyb3B5RW5jOiBvcHRpb25zLmVudHJvcHkgJiYgb3B0aW9ucy5lbnRyb3B5RW5jIHx8ICd1dGY4JyxcbiAgICBub25jZTogdGhpcy5uLnRvQXJyYXkoKSxcbiAgfSk7XG5cbiAgdmFyIGJ5dGVzID0gdGhpcy5uLmJ5dGVMZW5ndGgoKTtcbiAgdmFyIG5zMiA9IHRoaXMubi5zdWIobmV3IEJOKDIpKTtcbiAgZm9yICg7Oykge1xuICAgIHZhciBwcml2ID0gbmV3IEJOKGRyYmcuZ2VuZXJhdGUoYnl0ZXMpKTtcbiAgICBpZiAocHJpdi5jbXAobnMyKSA+IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHByaXYuaWFkZG4oMSk7XG4gICAgcmV0dXJuIHRoaXMua2V5RnJvbVByaXZhdGUocHJpdik7XG4gIH1cbn07XG5cbkVDLnByb3RvdHlwZS5fdHJ1bmNhdGVUb04gPSBmdW5jdGlvbiBfdHJ1bmNhdGVUb04obXNnLCB0cnVuY09ubHksIGJpdExlbmd0aCkge1xuICB2YXIgYnl0ZUxlbmd0aDtcbiAgaWYgKEJOLmlzQk4obXNnKSB8fCB0eXBlb2YgbXNnID09PSAnbnVtYmVyJykge1xuICAgIG1zZyA9IG5ldyBCTihtc2csIDE2KTtcbiAgICBieXRlTGVuZ3RoID0gbXNnLmJ5dGVMZW5ndGgoKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbXNnID09PSAnb2JqZWN0Jykge1xuICAgIC8vIEJOIGFzc3VtZXMgYW4gYXJyYXktbGlrZSBpbnB1dCBhbmQgYXNzZXJ0cyBsZW5ndGhcbiAgICBieXRlTGVuZ3RoID0gbXNnLmxlbmd0aDtcbiAgICBtc2cgPSBuZXcgQk4obXNnLCAxNik7XG4gIH0gZWxzZSB7XG4gICAgLy8gQk4gY29udmVydHMgdGhlIHZhbHVlIHRvIHN0cmluZ1xuICAgIHZhciBzdHIgPSBtc2cudG9TdHJpbmcoKTtcbiAgICAvLyBIRVggZW5jb2RpbmdcbiAgICBieXRlTGVuZ3RoID0gKHN0ci5sZW5ndGggKyAxKSA+Pj4gMTtcbiAgICBtc2cgPSBuZXcgQk4oc3RyLCAxNik7XG4gIH1cbiAgLy8gQWxsb3cgb3ZlcnJpZGluZ1xuICBpZiAodHlwZW9mIGJpdExlbmd0aCAhPT0gJ251bWJlcicpIHtcbiAgICBiaXRMZW5ndGggPSBieXRlTGVuZ3RoICogODtcbiAgfVxuICB2YXIgZGVsdGEgPSBiaXRMZW5ndGggLSB0aGlzLm4uYml0TGVuZ3RoKCk7XG4gIGlmIChkZWx0YSA+IDApXG4gICAgbXNnID0gbXNnLnVzaHJuKGRlbHRhKTtcbiAgaWYgKCF0cnVuY09ubHkgJiYgbXNnLmNtcCh0aGlzLm4pID49IDApXG4gICAgcmV0dXJuIG1zZy5zdWIodGhpcy5uKTtcbiAgZWxzZVxuICAgIHJldHVybiBtc2c7XG59O1xuXG5FQy5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obXNnLCBrZXksIGVuYywgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGVuYyA9PT0gJ29iamVjdCcpIHtcbiAgICBvcHRpb25zID0gZW5jO1xuICAgIGVuYyA9IG51bGw7XG4gIH1cbiAgaWYgKCFvcHRpb25zKVxuICAgIG9wdGlvbnMgPSB7fTtcblxuICBpZiAodHlwZW9mIG1zZyAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIG1zZyAhPT0gJ251bWJlcicgJiYgIUJOLmlzQk4obXNnKSkge1xuICAgIGFzc2VydCh0eXBlb2YgbXNnID09PSAnb2JqZWN0JyAmJiBtc2cgJiYgdHlwZW9mIG1zZy5sZW5ndGggPT09ICdudW1iZXInLFxuICAgICAgJ0V4cGVjdGVkIG1lc3NhZ2UgdG8gYmUgYW4gYXJyYXktbGlrZSwgYSBoZXggc3RyaW5nLCBvciBhIEJOIGluc3RhbmNlJyk7XG4gICAgYXNzZXJ0KChtc2cubGVuZ3RoID4+PiAwKSA9PT0gbXNnLmxlbmd0aCk7IC8vIG5vbi1uZWdhdGl2ZSAzMi1iaXQgaW50ZWdlclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSBhc3NlcnQoKG1zZ1tpXSAmIDI1NSkgPT09IG1zZ1tpXSk7XG4gIH1cblxuICBrZXkgPSB0aGlzLmtleUZyb21Qcml2YXRlKGtleSwgZW5jKTtcbiAgbXNnID0gdGhpcy5fdHJ1bmNhdGVUb04obXNnLCBmYWxzZSwgb3B0aW9ucy5tc2dCaXRMZW5ndGgpO1xuXG4gIC8vIFdvdWxkIGZhaWwgZnVydGhlciBjaGVja3MsIGJ1dCBsZXQncyBtYWtlIHRoZSBlcnJvciBtZXNzYWdlIGNsZWFyXG4gIGFzc2VydCghbXNnLmlzTmVnKCksICdDYW4gbm90IHNpZ24gYSBuZWdhdGl2ZSBtZXNzYWdlJyk7XG5cbiAgLy8gWmVyby1leHRlbmQga2V5IHRvIHByb3ZpZGUgZW5vdWdoIGVudHJvcHlcbiAgdmFyIGJ5dGVzID0gdGhpcy5uLmJ5dGVMZW5ndGgoKTtcbiAgdmFyIGJrZXkgPSBrZXkuZ2V0UHJpdmF0ZSgpLnRvQXJyYXkoJ2JlJywgYnl0ZXMpO1xuXG4gIC8vIFplcm8tZXh0ZW5kIG5vbmNlIHRvIGhhdmUgdGhlIHNhbWUgYnl0ZSBzaXplIGFzIE5cbiAgdmFyIG5vbmNlID0gbXNnLnRvQXJyYXkoJ2JlJywgYnl0ZXMpO1xuXG4gIC8vIFJlY2hlY2sgbm9uY2UgdG8gYmUgYmlqZWN0aXZlIHRvIG1zZ1xuICBhc3NlcnQoKG5ldyBCTihub25jZSkpLmVxKG1zZyksICdDYW4gbm90IHNpZ24gbWVzc2FnZScpO1xuXG4gIC8vIEluc3RhbnRpYXRlIEhtYWNfRFJCR1xuICB2YXIgZHJiZyA9IG5ldyBIbWFjRFJCRyh7XG4gICAgaGFzaDogdGhpcy5oYXNoLFxuICAgIGVudHJvcHk6IGJrZXksXG4gICAgbm9uY2U6IG5vbmNlLFxuICAgIHBlcnM6IG9wdGlvbnMucGVycyxcbiAgICBwZXJzRW5jOiBvcHRpb25zLnBlcnNFbmMgfHwgJ3V0ZjgnLFxuICB9KTtcblxuICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gZ2VuZXJhdGVcbiAgdmFyIG5zMSA9IHRoaXMubi5zdWIobmV3IEJOKDEpKTtcblxuICBmb3IgKHZhciBpdGVyID0gMDsgOyBpdGVyKyspIHtcbiAgICB2YXIgayA9IG9wdGlvbnMuayA/XG4gICAgICBvcHRpb25zLmsoaXRlcikgOlxuICAgICAgbmV3IEJOKGRyYmcuZ2VuZXJhdGUodGhpcy5uLmJ5dGVMZW5ndGgoKSkpO1xuICAgIGsgPSB0aGlzLl90cnVuY2F0ZVRvTihrLCB0cnVlKTtcbiAgICBpZiAoay5jbXBuKDEpIDw9IDAgfHwgay5jbXAobnMxKSA+PSAwKVxuICAgICAgY29udGludWU7XG5cbiAgICB2YXIga3AgPSB0aGlzLmcubXVsKGspO1xuICAgIGlmIChrcC5pc0luZmluaXR5KCkpXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBrcFggPSBrcC5nZXRYKCk7XG4gICAgdmFyIHIgPSBrcFgudW1vZCh0aGlzLm4pO1xuICAgIGlmIChyLmNtcG4oMCkgPT09IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBzID0gay5pbnZtKHRoaXMubikubXVsKHIubXVsKGtleS5nZXRQcml2YXRlKCkpLmlhZGQobXNnKSk7XG4gICAgcyA9IHMudW1vZCh0aGlzLm4pO1xuICAgIGlmIChzLmNtcG4oMCkgPT09IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciByZWNvdmVyeVBhcmFtID0gKGtwLmdldFkoKS5pc09kZCgpID8gMSA6IDApIHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChrcFguY21wKHIpICE9PSAwID8gMiA6IDApO1xuXG4gICAgLy8gVXNlIGNvbXBsZW1lbnQgb2YgYHNgLCBpZiBpdCBpcyA+IGBuIC8gMmBcbiAgICBpZiAob3B0aW9ucy5jYW5vbmljYWwgJiYgcy5jbXAodGhpcy5uaCkgPiAwKSB7XG4gICAgICBzID0gdGhpcy5uLnN1YihzKTtcbiAgICAgIHJlY292ZXJ5UGFyYW0gXj0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFNpZ25hdHVyZSh7IHI6IHIsIHM6IHMsIHJlY292ZXJ5UGFyYW06IHJlY292ZXJ5UGFyYW0gfSk7XG4gIH1cbn07XG5cbkVDLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkobXNnLCBzaWduYXR1cmUsIGtleSwgZW5jLCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucylcbiAgICBvcHRpb25zID0ge307XG5cbiAgbXNnID0gdGhpcy5fdHJ1bmNhdGVUb04obXNnLCBmYWxzZSwgb3B0aW9ucy5tc2dCaXRMZW5ndGgpO1xuICBrZXkgPSB0aGlzLmtleUZyb21QdWJsaWMoa2V5LCBlbmMpO1xuICBzaWduYXR1cmUgPSBuZXcgU2lnbmF0dXJlKHNpZ25hdHVyZSwgJ2hleCcpO1xuXG4gIC8vIFBlcmZvcm0gcHJpbWl0aXZlIHZhbHVlcyB2YWxpZGF0aW9uXG4gIHZhciByID0gc2lnbmF0dXJlLnI7XG4gIHZhciBzID0gc2lnbmF0dXJlLnM7XG4gIGlmIChyLmNtcG4oMSkgPCAwIHx8IHIuY21wKHRoaXMubikgPj0gMClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChzLmNtcG4oMSkgPCAwIHx8IHMuY21wKHRoaXMubikgPj0gMClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gVmFsaWRhdGUgc2lnbmF0dXJlXG4gIHZhciBzaW52ID0gcy5pbnZtKHRoaXMubik7XG4gIHZhciB1MSA9IHNpbnYubXVsKG1zZykudW1vZCh0aGlzLm4pO1xuICB2YXIgdTIgPSBzaW52Lm11bChyKS51bW9kKHRoaXMubik7XG4gIHZhciBwO1xuXG4gIGlmICghdGhpcy5jdXJ2ZS5fbWF4d2VsbFRyaWNrKSB7XG4gICAgcCA9IHRoaXMuZy5tdWxBZGQodTEsIGtleS5nZXRQdWJsaWMoKSwgdTIpO1xuICAgIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBwLmdldFgoKS51bW9kKHRoaXMubikuY21wKHIpID09PSAwO1xuICB9XG5cbiAgLy8gTk9URTogR3JlZyBNYXh3ZWxsJ3MgdHJpY2ssIGluc3BpcmVkIGJ5OlxuICAvLyBodHRwczovL2dpdC5pby92YWQzS1xuXG4gIHAgPSB0aGlzLmcuam11bEFkZCh1MSwga2V5LmdldFB1YmxpYygpLCB1Mik7XG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gQ29tcGFyZSBgcC54YCBvZiBKYWNvYmlhbiBwb2ludCB3aXRoIGByYCxcbiAgLy8gdGhpcyB3aWxsIGRvIGBwLnggPT0gciAqIHAuel4yYCBpbnN0ZWFkIG9mIG11bHRpcGx5aW5nIGBwLnhgIGJ5IHRoZVxuICAvLyBpbnZlcnNlIG9mIGBwLnpeMmBcbiAgcmV0dXJuIHAuZXFYVG9QKHIpO1xufTtcblxuRUMucHJvdG90eXBlLnJlY292ZXJQdWJLZXkgPSBmdW5jdGlvbihtc2csIHNpZ25hdHVyZSwgaiwgZW5jKSB7XG4gIGFzc2VydCgoMyAmIGopID09PSBqLCAnVGhlIHJlY292ZXJ5IHBhcmFtIGlzIG1vcmUgdGhhbiB0d28gYml0cycpO1xuICBzaWduYXR1cmUgPSBuZXcgU2lnbmF0dXJlKHNpZ25hdHVyZSwgZW5jKTtcblxuICB2YXIgbiA9IHRoaXMubjtcbiAgdmFyIGUgPSBuZXcgQk4obXNnKTtcbiAgdmFyIHIgPSBzaWduYXR1cmUucjtcbiAgdmFyIHMgPSBzaWduYXR1cmUucztcblxuICAvLyBBIHNldCBMU0Igc2lnbmlmaWVzIHRoYXQgdGhlIHktY29vcmRpbmF0ZSBpcyBvZGRcbiAgdmFyIGlzWU9kZCA9IGogJiAxO1xuICB2YXIgaXNTZWNvbmRLZXkgPSBqID4+IDE7XG4gIGlmIChyLmNtcCh0aGlzLmN1cnZlLnAudW1vZCh0aGlzLmN1cnZlLm4pKSA+PSAwICYmIGlzU2Vjb25kS2V5KVxuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgc2VuY29uZCBrZXkgY2FuZGluYXRlJyk7XG5cbiAgLy8gMS4xLiBMZXQgeCA9IHIgKyBqbi5cbiAgaWYgKGlzU2Vjb25kS2V5KVxuICAgIHIgPSB0aGlzLmN1cnZlLnBvaW50RnJvbVgoci5hZGQodGhpcy5jdXJ2ZS5uKSwgaXNZT2RkKTtcbiAgZWxzZVxuICAgIHIgPSB0aGlzLmN1cnZlLnBvaW50RnJvbVgociwgaXNZT2RkKTtcblxuICB2YXIgckludiA9IHNpZ25hdHVyZS5yLmludm0obik7XG4gIHZhciBzMSA9IG4uc3ViKGUpLm11bChySW52KS51bW9kKG4pO1xuICB2YXIgczIgPSBzLm11bChySW52KS51bW9kKG4pO1xuXG4gIC8vIDEuNi4xIENvbXB1dGUgUSA9IHJeLTEgKHNSIC0gIGVHKVxuICAvLyAgICAgICAgICAgICAgIFEgPSByXi0xIChzUiArIC1lRylcbiAgcmV0dXJuIHRoaXMuZy5tdWxBZGQoczEsIHIsIHMyKTtcbn07XG5cbkVDLnByb3RvdHlwZS5nZXRLZXlSZWNvdmVyeVBhcmFtID0gZnVuY3Rpb24oZSwgc2lnbmF0dXJlLCBRLCBlbmMpIHtcbiAgc2lnbmF0dXJlID0gbmV3IFNpZ25hdHVyZShzaWduYXR1cmUsIGVuYyk7XG4gIGlmIChzaWduYXR1cmUucmVjb3ZlcnlQYXJhbSAhPT0gbnVsbClcbiAgICByZXR1cm4gc2lnbmF0dXJlLnJlY292ZXJ5UGFyYW07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICB2YXIgUXByaW1lO1xuICAgIHRyeSB7XG4gICAgICBRcHJpbWUgPSB0aGlzLnJlY292ZXJQdWJLZXkoZSwgc2lnbmF0dXJlLCBpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoUXByaW1lLmVxKFEpKVxuICAgICAgcmV0dXJuIGk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCB2YWxpZCByZWNvdmVyeSBmYWN0b3InKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG52YXIgcGFyc2VCeXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXM7XG52YXIgY2FjaGVkUHJvcGVydHkgPSB1dGlscy5jYWNoZWRQcm9wZXJ0eTtcblxuLyoqXG4qIEBwYXJhbSB7RUREU0F9IGVkZHNhIC0gaW5zdGFuY2VcbiogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHB1YmxpYy9wcml2YXRlIGtleSBwYXJhbWV0ZXJzXG4qXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZT59IFtwYXJhbXMuc2VjcmV0XSAtIHNlY3JldCBzZWVkIGJ5dGVzXG4qIEBwYXJhbSB7UG9pbnR9IFtwYXJhbXMucHViXSAtIHB1YmxpYyBrZXkgcG9pbnQgKGFrYSBgQWAgaW4gZWRkc2EgdGVybXMpXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZT59IFtwYXJhbXMucHViXSAtIHB1YmxpYyBrZXkgcG9pbnQgZW5jb2RlZCBhcyBieXRlc1xuKlxuKi9cbmZ1bmN0aW9uIEtleVBhaXIoZWRkc2EsIHBhcmFtcykge1xuICB0aGlzLmVkZHNhID0gZWRkc2E7XG4gIHRoaXMuX3NlY3JldCA9IHBhcnNlQnl0ZXMocGFyYW1zLnNlY3JldCk7XG4gIGlmIChlZGRzYS5pc1BvaW50KHBhcmFtcy5wdWIpKVxuICAgIHRoaXMuX3B1YiA9IHBhcmFtcy5wdWI7XG4gIGVsc2VcbiAgICB0aGlzLl9wdWJCeXRlcyA9IHBhcnNlQnl0ZXMocGFyYW1zLnB1Yik7XG59XG5cbktleVBhaXIuZnJvbVB1YmxpYyA9IGZ1bmN0aW9uIGZyb21QdWJsaWMoZWRkc2EsIHB1Yikge1xuICBpZiAocHViIGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gcHViO1xuICByZXR1cm4gbmV3IEtleVBhaXIoZWRkc2EsIHsgcHViOiBwdWIgfSk7XG59O1xuXG5LZXlQYWlyLmZyb21TZWNyZXQgPSBmdW5jdGlvbiBmcm9tU2VjcmV0KGVkZHNhLCBzZWNyZXQpIHtcbiAgaWYgKHNlY3JldCBpbnN0YW5jZW9mIEtleVBhaXIpXG4gICAgcmV0dXJuIHNlY3JldDtcbiAgcmV0dXJuIG5ldyBLZXlQYWlyKGVkZHNhLCB7IHNlY3JldDogc2VjcmV0IH0pO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuc2VjcmV0ID0gZnVuY3Rpb24gc2VjcmV0KCkge1xuICByZXR1cm4gdGhpcy5fc2VjcmV0O1xufTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ3B1YkJ5dGVzJywgZnVuY3Rpb24gcHViQnl0ZXMoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmVuY29kZVBvaW50KHRoaXMucHViKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsICdwdWInLCBmdW5jdGlvbiBwdWIoKSB7XG4gIGlmICh0aGlzLl9wdWJCeXRlcylcbiAgICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVQb2ludCh0aGlzLl9wdWJCeXRlcyk7XG4gIHJldHVybiB0aGlzLmVkZHNhLmcubXVsKHRoaXMucHJpdigpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAncHJpdkJ5dGVzJywgZnVuY3Rpb24gcHJpdkJ5dGVzKCkge1xuICB2YXIgZWRkc2EgPSB0aGlzLmVkZHNhO1xuICB2YXIgaGFzaCA9IHRoaXMuaGFzaCgpO1xuICB2YXIgbGFzdEl4ID0gZWRkc2EuZW5jb2RpbmdMZW5ndGggLSAxO1xuXG4gIHZhciBhID0gaGFzaC5zbGljZSgwLCBlZGRzYS5lbmNvZGluZ0xlbmd0aCk7XG4gIGFbMF0gJj0gMjQ4O1xuICBhW2xhc3RJeF0gJj0gMTI3O1xuICBhW2xhc3RJeF0gfD0gNjQ7XG5cbiAgcmV0dXJuIGE7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ3ByaXYnLCBmdW5jdGlvbiBwcml2KCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVJbnQodGhpcy5wcml2Qnl0ZXMoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ2hhc2gnLCBmdW5jdGlvbiBoYXNoKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5oYXNoKCkudXBkYXRlKHRoaXMuc2VjcmV0KCkpLmRpZ2VzdCgpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsICdtZXNzYWdlUHJlZml4JywgZnVuY3Rpb24gbWVzc2FnZVByZWZpeCgpIHtcbiAgcmV0dXJuIHRoaXMuaGFzaCgpLnNsaWNlKHRoaXMuZWRkc2EuZW5jb2RpbmdMZW5ndGgpO1xufSk7XG5cbktleVBhaXIucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduKG1lc3NhZ2UpIHtcbiAgYXNzZXJ0KHRoaXMuX3NlY3JldCwgJ0tleVBhaXIgY2FuIG9ubHkgdmVyaWZ5Jyk7XG4gIHJldHVybiB0aGlzLmVkZHNhLnNpZ24obWVzc2FnZSwgdGhpcyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkobWVzc2FnZSwgc2lnKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLnZlcmlmeShtZXNzYWdlLCBzaWcsIHRoaXMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuZ2V0U2VjcmV0ID0gZnVuY3Rpb24gZ2V0U2VjcmV0KGVuYykge1xuICBhc3NlcnQodGhpcy5fc2VjcmV0LCAnS2V5UGFpciBpcyBwdWJsaWMgb25seScpO1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHRoaXMuc2VjcmV0KCksIGVuYyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRQdWJsaWMgPSBmdW5jdGlvbiBnZXRQdWJsaWMoZW5jKSB7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy5wdWJCeXRlcygpLCBlbmMpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBLZXlQYWlyO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcbnZhciBjYWNoZWRQcm9wZXJ0eSA9IHV0aWxzLmNhY2hlZFByb3BlcnR5O1xudmFyIHBhcnNlQnl0ZXMgPSB1dGlscy5wYXJzZUJ5dGVzO1xuXG4vKipcbiogQHBhcmFtIHtFRERTQX0gZWRkc2EgLSBlZGRzYSBpbnN0YW5jZVxuKiBAcGFyYW0ge0FycmF5PEJ5dGVzPnxPYmplY3R9IHNpZyAtXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fFBvaW50fSBbc2lnLlJdIC0gUiBwb2ludCBhcyBQb2ludCBvciBieXRlc1xuKiBAcGFyYW0ge0FycmF5PEJ5dGVzPnxibn0gW3NpZy5TXSAtIFMgc2NhbGFyIGFzIGJuIG9yIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fSBbc2lnLlJlbmNvZGVkXSAtIFIgcG9pbnQgZW5jb2RlZFxuKiBAcGFyYW0ge0FycmF5PEJ5dGVzPn0gW3NpZy5TZW5jb2RlZF0gLSBTIHNjYWxhciBlbmNvZGVkXG4qL1xuZnVuY3Rpb24gU2lnbmF0dXJlKGVkZHNhLCBzaWcpIHtcbiAgdGhpcy5lZGRzYSA9IGVkZHNhO1xuXG4gIGlmICh0eXBlb2Ygc2lnICE9PSAnb2JqZWN0JylcbiAgICBzaWcgPSBwYXJzZUJ5dGVzKHNpZyk7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc2lnKSkge1xuICAgIGFzc2VydChzaWcubGVuZ3RoID09PSBlZGRzYS5lbmNvZGluZ0xlbmd0aCAqIDIsICdTaWduYXR1cmUgaGFzIGludmFsaWQgc2l6ZScpO1xuICAgIHNpZyA9IHtcbiAgICAgIFI6IHNpZy5zbGljZSgwLCBlZGRzYS5lbmNvZGluZ0xlbmd0aCksXG4gICAgICBTOiBzaWcuc2xpY2UoZWRkc2EuZW5jb2RpbmdMZW5ndGgpLFxuICAgIH07XG4gIH1cblxuICBhc3NlcnQoc2lnLlIgJiYgc2lnLlMsICdTaWduYXR1cmUgd2l0aG91dCBSIG9yIFMnKTtcblxuICBpZiAoZWRkc2EuaXNQb2ludChzaWcuUikpXG4gICAgdGhpcy5fUiA9IHNpZy5SO1xuICBpZiAoc2lnLlMgaW5zdGFuY2VvZiBCTilcbiAgICB0aGlzLl9TID0gc2lnLlM7XG5cbiAgdGhpcy5fUmVuY29kZWQgPSBBcnJheS5pc0FycmF5KHNpZy5SKSA/IHNpZy5SIDogc2lnLlJlbmNvZGVkO1xuICB0aGlzLl9TZW5jb2RlZCA9IEFycmF5LmlzQXJyYXkoc2lnLlMpID8gc2lnLlMgOiBzaWcuU2VuY29kZWQ7XG59XG5cbmNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwgJ1MnLCBmdW5jdGlvbiBTKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVJbnQodGhpcy5TZW5jb2RlZCgpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShTaWduYXR1cmUsICdSJywgZnVuY3Rpb24gUigpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZGVjb2RlUG9pbnQodGhpcy5SZW5jb2RlZCgpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShTaWduYXR1cmUsICdSZW5jb2RlZCcsIGZ1bmN0aW9uIFJlbmNvZGVkKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVQb2ludCh0aGlzLlIoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoU2lnbmF0dXJlLCAnU2VuY29kZWQnLCBmdW5jdGlvbiBTZW5jb2RlZCgpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZW5jb2RlSW50KHRoaXMuUygpKTtcbn0pO1xuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvQnl0ZXMgPSBmdW5jdGlvbiB0b0J5dGVzKCkge1xuICByZXR1cm4gdGhpcy5SZW5jb2RlZCgpLmNvbmNhdCh0aGlzLlNlbmNvZGVkKCkpO1xufTtcblxuU2lnbmF0dXJlLnByb3RvdHlwZS50b0hleCA9IGZ1bmN0aW9uIHRvSGV4KCkge1xuICByZXR1cm4gdXRpbHMuZW5jb2RlKHRoaXMudG9CeXRlcygpLCAnaGV4JykudG9VcHBlckNhc2UoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gU2lnbmF0dXJlO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNoID0gcmVxdWlyZSgnaGFzaC5qcycpO1xudmFyIGN1cnZlcyA9IHJlcXVpcmUoJy4uL2N1cnZlcycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG52YXIgcGFyc2VCeXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXM7XG52YXIgS2V5UGFpciA9IHJlcXVpcmUoJy4va2V5Jyk7XG52YXIgU2lnbmF0dXJlID0gcmVxdWlyZSgnLi9zaWduYXR1cmUnKTtcblxuZnVuY3Rpb24gRUREU0EoY3VydmUpIHtcbiAgYXNzZXJ0KGN1cnZlID09PSAnZWQyNTUxOScsICdvbmx5IHRlc3RlZCB3aXRoIGVkMjU1MTkgc28gZmFyJyk7XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEVERFNBKSlcbiAgICByZXR1cm4gbmV3IEVERFNBKGN1cnZlKTtcblxuICBjdXJ2ZSA9IGN1cnZlc1tjdXJ2ZV0uY3VydmU7XG4gIHRoaXMuY3VydmUgPSBjdXJ2ZTtcbiAgdGhpcy5nID0gY3VydmUuZztcbiAgdGhpcy5nLnByZWNvbXB1dGUoY3VydmUubi5iaXRMZW5ndGgoKSArIDEpO1xuXG4gIHRoaXMucG9pbnRDbGFzcyA9IGN1cnZlLnBvaW50KCkuY29uc3RydWN0b3I7XG4gIHRoaXMuZW5jb2RpbmdMZW5ndGggPSBNYXRoLmNlaWwoY3VydmUubi5iaXRMZW5ndGgoKSAvIDgpO1xuICB0aGlzLmhhc2ggPSBoYXNoLnNoYTUxMjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBFRERTQTtcblxuLyoqXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBtZXNzYWdlIC0gbWVzc2FnZSBieXRlc1xuKiBAcGFyYW0ge0FycmF5fFN0cmluZ3xLZXlQYWlyfSBzZWNyZXQgLSBzZWNyZXQgYnl0ZXMgb3IgYSBrZXlwYWlyXG4qIEByZXR1cm5zIHtTaWduYXR1cmV9IC0gc2lnbmF0dXJlXG4qL1xuRUREU0EucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduKG1lc3NhZ2UsIHNlY3JldCkge1xuICBtZXNzYWdlID0gcGFyc2VCeXRlcyhtZXNzYWdlKTtcbiAgdmFyIGtleSA9IHRoaXMua2V5RnJvbVNlY3JldChzZWNyZXQpO1xuICB2YXIgciA9IHRoaXMuaGFzaEludChrZXkubWVzc2FnZVByZWZpeCgpLCBtZXNzYWdlKTtcbiAgdmFyIFIgPSB0aGlzLmcubXVsKHIpO1xuICB2YXIgUmVuY29kZWQgPSB0aGlzLmVuY29kZVBvaW50KFIpO1xuICB2YXIgc18gPSB0aGlzLmhhc2hJbnQoUmVuY29kZWQsIGtleS5wdWJCeXRlcygpLCBtZXNzYWdlKVxuICAgIC5tdWwoa2V5LnByaXYoKSk7XG4gIHZhciBTID0gci5hZGQoc18pLnVtb2QodGhpcy5jdXJ2ZS5uKTtcbiAgcmV0dXJuIHRoaXMubWFrZVNpZ25hdHVyZSh7IFI6IFIsIFM6IFMsIFJlbmNvZGVkOiBSZW5jb2RlZCB9KTtcbn07XG5cbi8qKlxuKiBAcGFyYW0ge0FycmF5fSBtZXNzYWdlIC0gbWVzc2FnZSBieXRlc1xuKiBAcGFyYW0ge0FycmF5fFN0cmluZ3xTaWduYXR1cmV9IHNpZyAtIHNpZyBieXRlc1xuKiBAcGFyYW0ge0FycmF5fFN0cmluZ3xQb2ludHxLZXlQYWlyfSBwdWIgLSBwdWJsaWMga2V5XG4qIEByZXR1cm5zIHtCb29sZWFufSAtIHRydWUgaWYgcHVibGljIGtleSBtYXRjaGVzIHNpZyBvZiBtZXNzYWdlXG4qL1xuRUREU0EucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtZXNzYWdlLCBzaWcsIHB1Yikge1xuICBtZXNzYWdlID0gcGFyc2VCeXRlcyhtZXNzYWdlKTtcbiAgc2lnID0gdGhpcy5tYWtlU2lnbmF0dXJlKHNpZyk7XG4gIGlmIChzaWcuUygpLmd0ZShzaWcuZWRkc2EuY3VydmUubikgfHwgc2lnLlMoKS5pc05lZygpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBrZXkgPSB0aGlzLmtleUZyb21QdWJsaWMocHViKTtcbiAgdmFyIGggPSB0aGlzLmhhc2hJbnQoc2lnLlJlbmNvZGVkKCksIGtleS5wdWJCeXRlcygpLCBtZXNzYWdlKTtcbiAgdmFyIFNHID0gdGhpcy5nLm11bChzaWcuUygpKTtcbiAgdmFyIFJwbHVzQWggPSBzaWcuUigpLmFkZChrZXkucHViKCkubXVsKGgpKTtcbiAgcmV0dXJuIFJwbHVzQWguZXEoU0cpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmhhc2hJbnQgPSBmdW5jdGlvbiBoYXNoSW50KCkge1xuICB2YXIgaGFzaCA9IHRoaXMuaGFzaCgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICBoYXNoLnVwZGF0ZShhcmd1bWVudHNbaV0pO1xuICByZXR1cm4gdXRpbHMuaW50RnJvbUxFKGhhc2guZGlnZXN0KCkpLnVtb2QodGhpcy5jdXJ2ZS5uKTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5rZXlGcm9tUHVibGljID0gZnVuY3Rpb24ga2V5RnJvbVB1YmxpYyhwdWIpIHtcbiAgcmV0dXJuIEtleVBhaXIuZnJvbVB1YmxpYyh0aGlzLCBwdWIpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmtleUZyb21TZWNyZXQgPSBmdW5jdGlvbiBrZXlGcm9tU2VjcmV0KHNlY3JldCkge1xuICByZXR1cm4gS2V5UGFpci5mcm9tU2VjcmV0KHRoaXMsIHNlY3JldCk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUubWFrZVNpZ25hdHVyZSA9IGZ1bmN0aW9uIG1ha2VTaWduYXR1cmUoc2lnKSB7XG4gIGlmIChzaWcgaW5zdGFuY2VvZiBTaWduYXR1cmUpXG4gICAgcmV0dXJuIHNpZztcbiAgcmV0dXJuIG5ldyBTaWduYXR1cmUodGhpcywgc2lnKTtcbn07XG5cbi8qKlxuKiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1qb3NlZnNzb24tZWRkc2EtZWQyNTUxOS0wMyNzZWN0aW9uLTUuMlxuKlxuKiBFRERTQSBkZWZpbmVzIG1ldGhvZHMgZm9yIGVuY29kaW5nIGFuZCBkZWNvZGluZyBwb2ludHMgYW5kIGludGVnZXJzLiBUaGVzZSBhcmVcbiogaGVscGVyIGNvbnZlbmllbmNlIG1ldGhvZHMsIHRoYXQgcGFzcyBhbG9uZyB0byB1dGlsaXR5IGZ1bmN0aW9ucyBpbXBsaWVkXG4qIHBhcmFtZXRlcnMuXG4qXG4qL1xuRUREU0EucHJvdG90eXBlLmVuY29kZVBvaW50ID0gZnVuY3Rpb24gZW5jb2RlUG9pbnQocG9pbnQpIHtcbiAgdmFyIGVuYyA9IHBvaW50LmdldFkoKS50b0FycmF5KCdsZScsIHRoaXMuZW5jb2RpbmdMZW5ndGgpO1xuICBlbmNbdGhpcy5lbmNvZGluZ0xlbmd0aCAtIDFdIHw9IHBvaW50LmdldFgoKS5pc09kZCgpID8gMHg4MCA6IDA7XG4gIHJldHVybiBlbmM7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuZGVjb2RlUG9pbnQgPSBmdW5jdGlvbiBkZWNvZGVQb2ludChieXRlcykge1xuICBieXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXMoYnl0ZXMpO1xuXG4gIHZhciBsYXN0SXggPSBieXRlcy5sZW5ndGggLSAxO1xuICB2YXIgbm9ybWVkID0gYnl0ZXMuc2xpY2UoMCwgbGFzdEl4KS5jb25jYXQoYnl0ZXNbbGFzdEl4XSAmIH4weDgwKTtcbiAgdmFyIHhJc09kZCA9IChieXRlc1tsYXN0SXhdICYgMHg4MCkgIT09IDA7XG5cbiAgdmFyIHkgPSB1dGlscy5pbnRGcm9tTEUobm9ybWVkKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnRGcm9tWSh5LCB4SXNPZGQpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmVuY29kZUludCA9IGZ1bmN0aW9uIGVuY29kZUludChudW0pIHtcbiAgcmV0dXJuIG51bS50b0FycmF5KCdsZScsIHRoaXMuZW5jb2RpbmdMZW5ndGgpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmRlY29kZUludCA9IGZ1bmN0aW9uIGRlY29kZUludChieXRlcykge1xuICByZXR1cm4gdXRpbHMuaW50RnJvbUxFKGJ5dGVzKTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5pc1BvaW50ID0gZnVuY3Rpb24gaXNQb2ludCh2YWwpIHtcbiAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIHRoaXMucG9pbnRDbGFzcztcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGVsbGlwdGljID0gZXhwb3J0cztcblxuZWxsaXB0aWMudmVyc2lvbiA9IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpLnZlcnNpb247XG5lbGxpcHRpYy51dGlscyA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvdXRpbHMnKTtcbmVsbGlwdGljLnJhbmQgPSByZXF1aXJlKCdicm9yYW5kJyk7XG5lbGxpcHRpYy5jdXJ2ZSA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvY3VydmUnKTtcbmVsbGlwdGljLmN1cnZlcyA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvY3VydmVzJyk7XG5cbi8vIFByb3RvY29sc1xuZWxsaXB0aWMuZWMgPSByZXF1aXJlKCcuL2VsbGlwdGljL2VjJyk7XG5lbGxpcHRpYy5lZGRzYSA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvZWRkc2EnKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdhc24xLmpzJykuYmlnbnVtLFxuXHRCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiYXNlNjRUb0JpZ051bSh2YWwsIHplcm8pIHtcblx0dmFyIGJ1ZiA9IEJ1ZmZlci5mcm9tKHZhbCwgJ2Jhc2U2NCcpO1xuXHR2YXIgYm4gPSB2YWwgPSBuZXcgQk4oYnVmLCAxMCwgJ2JlJykuaWFicygpO1xuXHRpZiAoemVybykge1xuXHRcdGJ1Zi5maWxsKDApO1xuXHR9XG5cdHJldHVybiBibjtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdhc24xLmpzJykuZGVmaW5lKCdBbGdvcml0aG1JZGVudGlmZXInLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5zZXEoKS5vYmooXG5cdFx0dGhpcy5rZXkoJ2FsZ29yaXRobScpLm9iamlkKCksXG5cdFx0dGhpcy5rZXkoJ3BhcmFtZXRlcnMnKS5vcHRpb25hbCgpLmFueSgpXG5cdCk7XG59KTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQWxnb3JpdGhtSWRlbnRpZmllciA9IHJlcXVpcmUoJy4vYWxnb3JpdGhtLWlkZW50aWZpZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdhc24xLmpzJykuZGVmaW5lKCdQdWJsaWNLZXlJbmZvJywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCdhbGdvcml0aG0nKS51c2UoQWxnb3JpdGhtSWRlbnRpZmllciksXG5cdFx0dGhpcy5rZXkoJ1B1YmxpY0tleScpLmJpdHN0cigpXG5cdCk7XG59KTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2FzbjEuanMnKS5kZWZpbmUoJ1ZlcnNpb24nLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5pbnQoKTtcbn0pO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBBbGdvcml0aG1JZGVudGlmaWVyID0gcmVxdWlyZSgnLi9hbGdvcml0aG0taWRlbnRpZmllcicpO1xudmFyIFZlcnNpb24gPSByZXF1aXJlKCcuL3ZlcnNpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdhc24xLmpzJykuZGVmaW5lKCdQcml2YXRlS2V5SW5mbycsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLnNlcSgpLm9iaihcblx0XHR0aGlzLmtleSgndmVyc2lvbicpLnVzZShWZXJzaW9uKSxcblx0XHR0aGlzLmtleSgncHJpdmF0ZUtleUFsZ29yaXRobScpLnVzZShBbGdvcml0aG1JZGVudGlmaWVyKSxcblx0XHR0aGlzLmtleSgncHJpdmF0ZUtleScpLm9jdHN0cigpLFxuXHRcdHRoaXMua2V5KCdhdHRyaWJ1dGVzJykub3B0aW9uYWwoKS5hbnkoKVxuXHQpO1xufSk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGFzbjEgPSByZXF1aXJlKCdhc24xLmpzJyksXG5cdEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyLFxuXHRFQyA9IHJlcXVpcmUoJ2VsbGlwdGljJykuZWM7XG5cbnZhciBiNjRUb0JuID0gcmVxdWlyZSgnLi9iNjQtdG8tYm4nKTtcblxudmFyIFB1YmxpY0tleUluZm8gPSByZXF1aXJlKCcuL2FzbjEvcHVibGljLWtleS1pbmZvJyksXG5cdFByaXZhdGVLZXlJbmZvID0gcmVxdWlyZSgnLi9hc24xL3ByaXZhdGUta2V5LWluZm8nKSxcblx0VmVyc2lvbiA9IHJlcXVpcmUoJy4vYXNuMS92ZXJzaW9uJyk7XG5cbnZhciBFQ1BhcmFtZXRlcnMgPSBhc24xLmRlZmluZSgnRUNQYXJhbWV0ZXJzJywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuY2hvaWNlKHtcblx0XHRuYW1lZEN1cnZlOiB0aGlzLm9iamlkKClcblx0fSk7XG59KTtcblxudmFyIGVjUHJpdmtleVZlcjEgPSAxO1xuXG52YXIgRUNQcml2YXRlS2V5ID0gYXNuMS5kZWZpbmUoJ0VDUHJpdmF0ZUtleScsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLnNlcSgpLm9iaihcblx0XHR0aGlzLmtleSgndmVyc2lvbicpLnVzZShWZXJzaW9uKSxcblx0XHR0aGlzLmtleSgncHJpdmF0ZUtleScpLm9jdHN0cigpLFxuXHRcdHRoaXMua2V5KCdwYXJhbWV0ZXJzJykuZXhwbGljaXQoMCkub3B0aW9uYWwoKS5hbnkoKSxcblx0XHR0aGlzLmtleSgncHVibGljS2V5JykuZXhwbGljaXQoMSkub3B0aW9uYWwoKS5iaXRzdHIoKVxuXHQpO1xufSk7XG5cbnZhciBjdXJ2ZXMgPSB7XG5cdCdQLTI1Nic6ICdwMjU2Jyxcblx0J1AtMzg0JzogJ3AzODQnLFxuXHQnUC01MjEnOiAncDUyMSdcbn07XG5cbnZhciBvaWRzID0ge1xuXHQnUC0yNTYnOiBbMSwgMiwgODQwLCAxMDA0NSwgMywgMSwgN10sXG5cdCdQLTM4NCc6IFsxLCAzLCAxMzIsIDAsIDM0XSxcblx0J1AtNTIxJzogWzEsIDMsIDEzMiwgMCwgMzVdXG59O1xudmFyIHBhcmFtZXRlcnMgPSB7fTtcbnZhciBhbGdvcml0aG1zID0ge307XG5PYmplY3Qua2V5cyhvaWRzKS5mb3JFYWNoKGZ1bmN0aW9uKGNydikge1xuXHRwYXJhbWV0ZXJzW2Nydl0gPSBFQ1BhcmFtZXRlcnMuZW5jb2RlKHtcblx0XHR0eXBlOiAnbmFtZWRDdXJ2ZScsXG5cdFx0dmFsdWU6IG9pZHNbY3J2XVxuXHR9LCAnZGVyJyk7XG5cdGFsZ29yaXRobXNbY3J2XSA9IHtcblx0XHRhbGdvcml0aG06ICBbMSwgMiwgODQwLCAxMDA0NSwgMiwgMV0sXG5cdFx0cGFyYW1ldGVyczogcGFyYW1ldGVyc1tjcnZdXG5cdH07XG59KTtcbm9pZHMgPSBudWxsO1xuXG5mdW5jdGlvbiBlY0p3a1RvQnVmZmVyKGp3aywgb3B0cykge1xuXHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2suY3J2KSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2suY3J2XCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdHZhciBoYXNEID0gJ3N0cmluZycgPT09IHR5cGVvZiBqd2suZDtcblx0dmFyIHh5VHlwZXMgPSBoYXNEXG5cdFx0PyBbJ3VuZGVmaW5lZCcsICdzdHJpbmcnXVxuXHRcdDogWydzdHJpbmcnXTtcblxuXHRpZiAoLTEgPT09IHh5VHlwZXMuaW5kZXhPZih0eXBlb2YgandrLngpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sueFwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHRpZiAoLTEgPT09IHh5VHlwZXMuaW5kZXhPZih0eXBlb2YgandrLnkpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sueVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHRpZiAob3B0cy5wcml2YXRlICYmICFoYXNEKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2suZFwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHR2YXIgY3VydmVOYW1lID0gY3VydmVzW2p3ay5jcnZdO1xuXHRpZiAoIWN1cnZlTmFtZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY3VydmUgXCInICsgandrLmNydiArICdcIicpO1xuXHR9XG5cblx0dmFyIGN1cnZlID0gbmV3IEVDKGN1cnZlTmFtZSk7XG5cblx0dmFyIGtleSA9IHt9O1xuXG5cdHZhciBoYXNQdWIgPSBqd2sueCAmJiBqd2sueTtcblx0aWYgKGhhc1B1Yikge1xuXHRcdGtleS5wdWIgPSB7XG5cdFx0XHR4OiBiNjRUb0JuKGp3ay54LCBmYWxzZSksXG5cdFx0XHR5OiBiNjRUb0JuKGp3ay55LCBmYWxzZSlcblx0XHR9O1xuXHR9XG5cblx0aWYgKG9wdHMucHJpdmF0ZSB8fCAhaGFzUHViKSB7XG5cdFx0a2V5LnByaXYgPSBiNjRUb0JuKGp3ay5kLCB0cnVlKTtcblx0fVxuXG5cdGtleSA9IGN1cnZlLmtleVBhaXIoa2V5KTtcblxuXHR2YXIga2V5VmFsaWRhdGlvbiA9IGtleS52YWxpZGF0ZSgpO1xuXHRpZiAoIWtleVZhbGlkYXRpb24ucmVzdWx0KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleSBmb3IgY3VydmU6IFwiJyArIGtleVZhbGlkYXRpb24ucmVhc29uICsgJ1wiJyk7XG5cdH1cblxuXHR2YXIgcmVzdWx0ID0ga2V5VG9QZW0oandrLmNydiwga2V5LCBvcHRzKTtcblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBrZXlUb1BlbShjcnYsIGtleSwgb3B0cykge1xuXHR2YXIgY29tcGFjdCA9IGZhbHNlO1xuXHR2YXIgcHVibGljS2V5ID0ga2V5LmdldFB1YmxpYyhjb21wYWN0LCAnaGV4Jyk7XG5cdHB1YmxpY0tleSA9IEJ1ZmZlci5mcm9tKHB1YmxpY0tleSwgJ2hleCcpO1xuXHRwdWJsaWNLZXkgPSB7XG5cdFx0dW51c2VkOiAwLFxuXHRcdGRhdGE6IHB1YmxpY0tleVxuXHR9O1xuXG5cdHZhciByZXN1bHQ7XG5cdGlmIChvcHRzLnByaXZhdGUpIHtcblx0XHR2YXIgcHJpdmF0ZUtleSA9IGtleS5nZXRQcml2YXRlKCdoZXgnKTtcblx0XHRwcml2YXRlS2V5ID0gQnVmZmVyLmZyb20ocHJpdmF0ZUtleSwgJ2hleCcpO1xuXG5cdFx0cmVzdWx0ID0gUHJpdmF0ZUtleUluZm8uZW5jb2RlKHtcblx0XHRcdHZlcnNpb246IDAsXG5cdFx0XHRwcml2YXRlS2V5QWxnb3JpdGhtOiBhbGdvcml0aG1zW2Nydl0sXG5cdFx0XHRwcml2YXRlS2V5OiBFQ1ByaXZhdGVLZXkuZW5jb2RlKHtcblx0XHRcdFx0dmVyc2lvbjogZWNQcml2a2V5VmVyMSxcblx0XHRcdFx0cHJpdmF0ZUtleTogcHJpdmF0ZUtleSxcblx0XHRcdFx0cGFyYW1ldGVyczogcGFyYW1ldGVyc1tjcnZdLFxuXHRcdFx0XHRwdWJsaWNLZXk6IHB1YmxpY0tleVxuXHRcdFx0fSwgJ2RlcicpXG5cdFx0fSwgJ3BlbScsIHtcblx0XHRcdGxhYmVsOiAnUFJJVkFURSBLRVknXG5cdFx0fSk7XG5cblx0XHRwcml2YXRlS2V5LmZpbGwoMCk7XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gUHVibGljS2V5SW5mby5lbmNvZGUoe1xuXHRcdFx0YWxnb3JpdGhtOiBhbGdvcml0aG1zW2Nydl0sXG5cdFx0XHRQdWJsaWNLZXk6IHB1YmxpY0tleVxuXHRcdH0sICdwZW0nLCB7XG5cdFx0XHRsYWJlbDogJ1BVQkxJQyBLRVknXG5cdFx0fSk7XG5cdH1cblxuXHQvLyBUaGlzIGlzIGluIGFuIGlmIGluY2FzZSBhc24xLmpzIGFkZHMgYSB0cmFpbGluZyBcXG5cblx0Ly8gaXN0YW5idWwgaWdub3JlIGVsc2Vcblx0aWYgKCdcXG4nICE9PSByZXN1bHQuc2xpY2UoLTEpKSB7XG5cdFx0cmVzdWx0ICs9ICdcXG4nO1xuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlY0p3a1RvQnVmZmVyO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBhc24xID0gcmVxdWlyZSgnYXNuMS5qcycpO1xuXG52YXIgYjY0VG9CbiA9IHJlcXVpcmUoJy4vYjY0LXRvLWJuJyk7XG5cbnZhciBQdWJsaWNLZXlJbmZvID0gcmVxdWlyZSgnLi9hc24xL3B1YmxpYy1rZXktaW5mbycpLFxuXHRQcml2YXRlS2V5SW5mbyA9IHJlcXVpcmUoJy4vYXNuMS9wcml2YXRlLWtleS1pbmZvJyksXG5cdFZlcnNpb24gPSByZXF1aXJlKCcuL2FzbjEvdmVyc2lvbicpO1xuXG52YXIgUlNBUHJpdmF0ZUtleSA9IGFzbjEuZGVmaW5lKCdSU0FQcml2YXRlS2V5JywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCd2ZXJzaW9uJykudXNlKFZlcnNpb24pLFxuXHRcdHRoaXMua2V5KCdtb2R1bHVzJykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ3B1YmxpY0V4cG9uZW50JykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ3ByaXZhdGVFeHBvbmVudCcpLmludCgpLFxuXHRcdHRoaXMua2V5KCdwcmltZTEnKS5pbnQoKSxcblx0XHR0aGlzLmtleSgncHJpbWUyJykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ2V4cG9uZW50MScpLmludCgpLFxuXHRcdHRoaXMua2V5KCdleHBvbmVudDInKS5pbnQoKSxcblx0XHR0aGlzLmtleSgnY29lZmZpY2llbnQnKS5pbnQoKVxuXHQpO1xufSk7XG5cbnZhciBSU0FQdWJsaWNLZXkgPSBhc24xLmRlZmluZSgnUlNBUHVibGljS2V5JywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCdtb2R1bHVzJykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ3B1YmxpY0V4cG9uZW50JykuaW50KClcblx0KTtcbn0pO1xuXG52YXIgYWxnb3JpdGhtID0ge1xuXHRhbGdvcml0aG06IFsxLCAyLCA4NDAsIDExMzU0OSwgMSwgMSwgMV0sXG5cdHBhcmFtZXRlcnM6IFs1LCAwXVxufTtcblxuZnVuY3Rpb24gcnNhSndrVG9CdWZmZXIoandrLCBvcHRzKSB7XG5cdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5lKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2suZVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2subikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLm5cIiB0byBiZSBhIFN0cmluZycpO1xuXHR9XG5cblx0aWYgKG9wdHMucHJpdmF0ZSkge1xuXHRcdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5kKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5kXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cblx0XHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2sucCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sucFwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLnEpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLnFcIiB0byBiZSBhIFN0cmluZycpO1xuXHRcdH1cblxuXHRcdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5kcCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2suZHBcIiB0byBiZSBhIFN0cmluZycpO1xuXHRcdH1cblxuXHRcdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5kcSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2suZHFcIiB0byBiZSBhIFN0cmluZycpO1xuXHRcdH1cblxuXHRcdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5xaSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sucWlcIiB0byBiZSBhIFN0cmluZycpO1xuXHRcdH1cblx0fVxuXG5cdHZhciBwZW07XG5cdGlmIChvcHRzLnByaXZhdGUpIHtcblx0XHRwZW0gPSBQcml2YXRlS2V5SW5mby5lbmNvZGUoe1xuXHRcdFx0dmVyc2lvbjogMCxcblx0XHRcdHByaXZhdGVLZXlBbGdvcml0aG06IGFsZ29yaXRobSxcblx0XHRcdHByaXZhdGVLZXk6IFJTQVByaXZhdGVLZXkuZW5jb2RlKHtcblx0XHRcdFx0dmVyc2lvbjogMCxcblx0XHRcdFx0bW9kdWx1czogYjY0VG9Cbihqd2subiwgZmFsc2UpLFxuXHRcdFx0XHRwdWJsaWNFeHBvbmVudDogYjY0VG9Cbihqd2suZSwgZmFsc2UpLFxuXHRcdFx0XHRwcml2YXRlRXhwb25lbnQ6IGI2NFRvQm4oandrLmQsIHRydWUpLFxuXHRcdFx0XHRwcmltZTE6IGI2NFRvQm4oandrLnAsIHRydWUpLFxuXHRcdFx0XHRwcmltZTI6IGI2NFRvQm4oandrLnEsIHRydWUpLFxuXHRcdFx0XHRleHBvbmVudDE6IGI2NFRvQm4oandrLmRwLCB0cnVlKSxcblx0XHRcdFx0ZXhwb25lbnQyOiBiNjRUb0JuKGp3ay5kcSwgdHJ1ZSksXG5cdFx0XHRcdGNvZWZmaWNpZW50OiBiNjRUb0JuKGp3ay5xaSwgdHJ1ZSlcblx0XHRcdH0sICdkZXInKVxuXHRcdH0sICdwZW0nLCB7XG5cdFx0XHRsYWJlbDogJ1BSSVZBVEUgS0VZJ1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHBlbSA9IFB1YmxpY0tleUluZm8uZW5jb2RlKHtcblx0XHRcdGFsZ29yaXRobTogYWxnb3JpdGhtLFxuXHRcdFx0UHVibGljS2V5OiB7XG5cdFx0XHRcdHVudXNlZDogMCxcblx0XHRcdFx0ZGF0YTogUlNBUHVibGljS2V5LmVuY29kZSh7XG5cdFx0XHRcdFx0bW9kdWx1czogYjY0VG9Cbihqd2subiwgZmFsc2UpLFxuXHRcdFx0XHRcdHB1YmxpY0V4cG9uZW50OiBiNjRUb0JuKGp3ay5lLCBmYWxzZSlcblx0XHRcdFx0fSwgJ2RlcicpXG5cdFx0XHR9XG5cdFx0fSwgJ3BlbScsIHtcblx0XHRcdGxhYmVsOiAnUFVCTElDIEtFWSdcblx0XHR9KTtcblx0fVxuXG5cdC8vIFRoaXMgaXMgaW4gYW4gaWYgaW5jYXNlIGFzbjEuanMgYWRkcyBhIHRyYWlsaW5nIFxcblxuXHQvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuXHRpZiAoJ1xcbicgIT09IHBlbS5zbGljZSgtMSkpIHtcblx0XHRwZW0gKz0gJ1xcbic7XG5cdH1cblxuXHRyZXR1cm4gcGVtO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJzYUp3a1RvQnVmZmVyO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBlYyA9IHJlcXVpcmUoJy4vZWMnKSxcblx0cnNhID0gcmVxdWlyZSgnLi9yc2EnKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHt7a3R5OidFQycsIGNydjpzdHJpbmcsIGQ6c3RyaW5nLCB4PzpzdHJpbmcsIHk/OnN0cmluZ30gfCB7a3R5OidFQycsIGNydjpzdHJpbmcsIHg6c3RyaW5nLCB5OnN0cmluZ30gfCB7a3R5OidSU0EnLCBlOnN0cmluZywgbjpzdHJpbmcsIGQ/OnN0cmluZywgcD86c3RyaW5nLCBxPzpzdHJpbmcsIGRwPzpzdHJpbmcsIGRxPzpzdHJpbmcsIHFpPzpzdHJpbmd9fSBqd2tcbiAqIEBwYXJhbSB7e3ByaXZhdGU6Ym9vbGVhbn09fSBvcHRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBqd2tUb0J1ZmZlcihqd2ssIG9wdHMpIHtcblx0aWYgKCdvYmplY3QnICE9PSB0eXBlb2YgandrIHx8IG51bGwgPT09IGp3aykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrXCIgdG8gYmUgYW4gT2JqZWN0Jyk7XG5cdH1cblxuXHR2YXIga3R5ID0gandrLmt0eTtcblx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2Yga3R5KSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sua3R5XCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdG9wdHMgPSBvcHRzIHx8IHt9O1xuXHRvcHRzLnByaXZhdGUgPSBvcHRzLnByaXZhdGUgPT09IHRydWU7XG5cblx0c3dpdGNoIChrdHkpIHtcblx0XHRjYXNlICdFQyc6IHtcblx0XHRcdHJldHVybiBlYyhqd2ssIG9wdHMpO1xuXHRcdH1cblx0XHRjYXNlICdSU0EnOiB7XG5cdFx0XHRyZXR1cm4gcnNhKGp3aywgb3B0cyk7XG5cdFx0fVxuXHRcdGRlZmF1bHQ6IHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQga2V5IHR5cGUgXCInICsga3R5ICsgJ1wiJyk7XG5cdFx0fVxuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gandrVG9CdWZmZXI7XG4iLAogICAgIlxuZXhwb3J0IGZ1bmN0aW9uIGdldENvb2tpZXMoaGVhZGVyczogSGVhZGVycykge1xuICBpZiAoIWhlYWRlcnMpIHJldHVybiB7fTtcbiAgY29uc3QgY29va2llSGVhZGVyID0gaGVhZGVycy5nZXQoXCJDb29raWVcIik7XG4gIGNvbnN0IGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBpZiAoY29va2llSGVhZGVyID09PSBudWxsKSByZXR1cm4ge307XG5cbiAgZm9yIChjb25zdCBrdiBvZiBjb29raWVIZWFkZXIuc3BsaXQoXCI7XCIpKSB7XG4gICAgY29uc3QgW2Nvb2tpZUtleSwgLi4uY29va2llVmFsXSA9IGt2LnNwbGl0KFwiPVwiKTtcbiAgICBjb25zdCBrZXkgPSBjb29raWVLZXkudHJpbSgpO1xuICAgIGNvb2tpZXNba2V5XSA9IGNvb2tpZVZhbC5qb2luKFwiPVwiKTtcbiAgfVxuXG4gIHJldHVybiBjb29raWVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29va2llKHJlc3BvbnNlOiBSZXNwb25zZSwga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG1heEFnZT86IG51bWJlcikge1xuICByZXNwb25zZS5oZWFkZXJzLmFwcGVuZCgnU2V0LUNvb2tpZScsIGAke2tleX09JHt2YWx1ZX0ke21heEFnZSA/ICc7IFBhdGg9LzsgTWF4LUFnZT0nICsgbWF4QWdlIDogJyd9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDb29raWUocmVzcG9uc2U6IFJlc3BvbnNlLCBrZXk6IHN0cmluZykge1xuICByZXNwb25zZS5oZWFkZXJzLmFwcGVuZCgnU2V0LUNvb2tpZScsIGAke2tleX09XCJcIjsgUGF0aD0vOyBNYXgtQWdlPS0xO2ApO1xufSIsCiAgICAiLy8jcmVnaW9uIHJvbGxkb3duOnJ1bnRpbWVcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19leHBvcnQgPSAodGFyZ2V0LCBhbGwpID0+IHtcblx0Zm9yICh2YXIgbmFtZSBpbiBhbGwpIF9fZGVmUHJvcCh0YXJnZXQsIG5hbWUsIHtcblx0XHRnZXQ6IGFsbFtuYW1lXSxcblx0XHRlbnVtZXJhYmxlOiB0cnVlXG5cdH0pO1xufTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBfX2V4cG9ydCB9OyIsCiAgICAiY29uc3QgZW50aXR5S2luZCA9IFN5bWJvbC5mb3IoXCJkcml6emxlOmVudGl0eUtpbmRcIik7XG5jb25zdCBoYXNPd25FbnRpdHlLaW5kID0gU3ltYm9sLmZvcihcImRyaXp6bGU6aGFzT3duRW50aXR5S2luZFwiKTtcbmZ1bmN0aW9uIGlzKHZhbHVlLCB0eXBlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIHR5cGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0eXBlLCBlbnRpdHlLaW5kKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDbGFzcyBcIiR7dHlwZS5uYW1lID8/IFwiPHVua25vd24+XCJ9XCIgZG9lc24ndCBsb29rIGxpa2UgYSBEcml6emxlIGVudGl0eS4gSWYgdGhpcyBpcyBpbmNvcnJlY3QgYW5kIHRoZSBjbGFzcyBpcyBwcm92aWRlZCBieSBEcml6emxlLCBwbGVhc2UgcmVwb3J0IHRoaXMgYXMgYSBidWcuYFxuICAgICk7XG4gIH1cbiAgbGV0IGNscyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkuY29uc3RydWN0b3I7XG4gIGlmIChjbHMpIHtcbiAgICB3aGlsZSAoY2xzKSB7XG4gICAgICBpZiAoZW50aXR5S2luZCBpbiBjbHMgJiYgY2xzW2VudGl0eUtpbmRdID09PSB0eXBlW2VudGl0eUtpbmRdKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY2xzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNscyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCB7XG4gIGVudGl0eUtpbmQsXG4gIGhhc093bkVudGl0eUtpbmQsXG4gIGlzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW50aXR5LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuY2xhc3MgQ29sdW1uIHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICB0aGlzLmtleUFzTmFtZSA9IGNvbmZpZy5rZXlBc05hbWU7XG4gICAgdGhpcy5ub3ROdWxsID0gY29uZmlnLm5vdE51bGw7XG4gICAgdGhpcy5kZWZhdWx0ID0gY29uZmlnLmRlZmF1bHQ7XG4gICAgdGhpcy5kZWZhdWx0Rm4gPSBjb25maWcuZGVmYXVsdEZuO1xuICAgIHRoaXMub25VcGRhdGVGbiA9IGNvbmZpZy5vblVwZGF0ZUZuO1xuICAgIHRoaXMuaGFzRGVmYXVsdCA9IGNvbmZpZy5oYXNEZWZhdWx0O1xuICAgIHRoaXMucHJpbWFyeSA9IGNvbmZpZy5wcmltYXJ5S2V5O1xuICAgIHRoaXMuaXNVbmlxdWUgPSBjb25maWcuaXNVbmlxdWU7XG4gICAgdGhpcy51bmlxdWVOYW1lID0gY29uZmlnLnVuaXF1ZU5hbWU7XG4gICAgdGhpcy51bmlxdWVUeXBlID0gY29uZmlnLnVuaXF1ZVR5cGU7XG4gICAgdGhpcy5kYXRhVHlwZSA9IGNvbmZpZy5kYXRhVHlwZTtcbiAgICB0aGlzLmNvbHVtblR5cGUgPSBjb25maWcuY29sdW1uVHlwZTtcbiAgICB0aGlzLmdlbmVyYXRlZCA9IGNvbmZpZy5nZW5lcmF0ZWQ7XG4gICAgdGhpcy5nZW5lcmF0ZWRJZGVudGl0eSA9IGNvbmZpZy5nZW5lcmF0ZWRJZGVudGl0eTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJDb2x1bW5cIjtcbiAgbmFtZTtcbiAga2V5QXNOYW1lO1xuICBwcmltYXJ5O1xuICBub3ROdWxsO1xuICBkZWZhdWx0O1xuICBkZWZhdWx0Rm47XG4gIG9uVXBkYXRlRm47XG4gIGhhc0RlZmF1bHQ7XG4gIGlzVW5pcXVlO1xuICB1bmlxdWVOYW1lO1xuICB1bmlxdWVUeXBlO1xuICBkYXRhVHlwZTtcbiAgY29sdW1uVHlwZTtcbiAgZW51bVZhbHVlcyA9IHZvaWQgMDtcbiAgZ2VuZXJhdGVkID0gdm9pZCAwO1xuICBnZW5lcmF0ZWRJZGVudGl0eSA9IHZvaWQgMDtcbiAgY29uZmlnO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICAvLyAqKiBAaW50ZXJuYWwgKi9cbiAgc2hvdWxkRGlzYWJsZUluc2VydCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZ2VuZXJhdGVkICE9PSB2b2lkIDAgJiYgdGhpcy5jb25maWcuZ2VuZXJhdGVkLnR5cGUgIT09IFwiYnlEZWZhdWx0XCI7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIENvbHVtblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbHVtbi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIENvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJDb2x1bW5CdWlsZGVyXCI7XG4gIGNvbmZpZztcbiAgY29uc3RydWN0b3IobmFtZSwgZGF0YVR5cGUsIGNvbHVtblR5cGUpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBrZXlBc05hbWU6IG5hbWUgPT09IFwiXCIsXG4gICAgICBub3ROdWxsOiBmYWxzZSxcbiAgICAgIGRlZmF1bHQ6IHZvaWQgMCxcbiAgICAgIGhhc0RlZmF1bHQ6IGZhbHNlLFxuICAgICAgcHJpbWFyeUtleTogZmFsc2UsXG4gICAgICBpc1VuaXF1ZTogZmFsc2UsXG4gICAgICB1bmlxdWVOYW1lOiB2b2lkIDAsXG4gICAgICB1bmlxdWVUeXBlOiB2b2lkIDAsXG4gICAgICBkYXRhVHlwZSxcbiAgICAgIGNvbHVtblR5cGUsXG4gICAgICBnZW5lcmF0ZWQ6IHZvaWQgMFxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIGRhdGEgdHlwZSBvZiB0aGUgY29sdW1uLiBDb21tb25seSB1c2VkIHdpdGggYGpzb25gIGNvbHVtbnMuIEFsc28sIHVzZWZ1bCBmb3IgYnJhbmRlZCB0eXBlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogY29uc3QgdXNlcnMgPSBwZ1RhYmxlKCd1c2VycycsIHtcbiAgICogXHRpZDogaW50ZWdlcignaWQnKS4kdHlwZTxVc2VySWQ+KCkucHJpbWFyeUtleSgpLFxuICAgKiBcdGRldGFpbHM6IGpzb24oJ2RldGFpbHMnKS4kdHlwZTxVc2VyRGV0YWlscz4oKS5ub3ROdWxsKCksXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gICR0eXBlKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgYG5vdCBudWxsYCBjbGF1c2UgdG8gdGhlIGNvbHVtbiBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBBZmZlY3RzIHRoZSBgc2VsZWN0YCBtb2RlbCBvZiB0aGUgdGFibGUgLSBjb2x1bW5zICp3aXRob3V0KiBgbm90IG51bGxgIHdpbGwgYmUgbnVsbGFibGUgb24gc2VsZWN0LlxuICAgKi9cbiAgbm90TnVsbCgpIHtcbiAgICB0aGlzLmNvbmZpZy5ub3ROdWxsID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGBkZWZhdWx0IDx2YWx1ZT5gIGNsYXVzZSB0byB0aGUgY29sdW1uIGRlZmluaXRpb24uXG4gICAqXG4gICAqIEFmZmVjdHMgdGhlIGBpbnNlcnRgIG1vZGVsIG9mIHRoZSB0YWJsZSAtIGNvbHVtbnMgKndpdGgqIGBkZWZhdWx0YCBhcmUgb3B0aW9uYWwgb24gaW5zZXJ0LlxuICAgKlxuICAgKiBJZiB5b3UgbmVlZCB0byBzZXQgYSBkeW5hbWljIGRlZmF1bHQgdmFsdWUsIHVzZSB7QGxpbmsgJGRlZmF1bHRGbn0gaW5zdGVhZC5cbiAgICovXG4gIGRlZmF1bHQodmFsdWUpIHtcbiAgICB0aGlzLmNvbmZpZy5kZWZhdWx0ID0gdmFsdWU7XG4gICAgdGhpcy5jb25maWcuaGFzRGVmYXVsdCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBkeW5hbWljIGRlZmF1bHQgdmFsdWUgdG8gdGhlIGNvbHVtbi5cbiAgICogVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJvdyBpcyBpbnNlcnRlZCwgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbHVtbiB2YWx1ZS5cbiAgICpcbiAgICogKipOb3RlOioqIFRoaXMgdmFsdWUgZG9lcyBub3QgYWZmZWN0IHRoZSBgZHJpenpsZS1raXRgIGJlaGF2aW9yLCBpdCBpcyBvbmx5IHVzZWQgYXQgcnVudGltZSBpbiBgZHJpenpsZS1vcm1gLlxuICAgKi9cbiAgJGRlZmF1bHRGbihmbikge1xuICAgIHRoaXMuY29uZmlnLmRlZmF1bHRGbiA9IGZuO1xuICAgIHRoaXMuY29uZmlnLmhhc0RlZmF1bHQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBbGlhcyBmb3Ige0BsaW5rICRkZWZhdWx0Rm59LlxuICAgKi9cbiAgJGRlZmF1bHQgPSB0aGlzLiRkZWZhdWx0Rm47XG4gIC8qKlxuICAgKiBBZGRzIGEgZHluYW1pYyB1cGRhdGUgdmFsdWUgdG8gdGhlIGNvbHVtbi5cbiAgICogVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJvdyBpcyB1cGRhdGVkLCBhbmQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgY29sdW1uIHZhbHVlIGlmIG5vbmUgaXMgcHJvdmlkZWQuXG4gICAqIElmIG5vIGBkZWZhdWx0YCAob3IgYCRkZWZhdWx0Rm5gKSB2YWx1ZSBpcyBwcm92aWRlZCwgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJvdyBpcyBpbnNlcnRlZCBhcyB3ZWxsLCBhbmQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgY29sdW1uIHZhbHVlLlxuICAgKlxuICAgKiAqKk5vdGU6KiogVGhpcyB2YWx1ZSBkb2VzIG5vdCBhZmZlY3QgdGhlIGBkcml6emxlLWtpdGAgYmVoYXZpb3IsIGl0IGlzIG9ubHkgdXNlZCBhdCBydW50aW1lIGluIGBkcml6emxlLW9ybWAuXG4gICAqL1xuICAkb25VcGRhdGVGbihmbikge1xuICAgIHRoaXMuY29uZmlnLm9uVXBkYXRlRm4gPSBmbjtcbiAgICB0aGlzLmNvbmZpZy5oYXNEZWZhdWx0ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWxpYXMgZm9yIHtAbGluayAkb25VcGRhdGVGbn0uXG4gICAqL1xuICAkb25VcGRhdGUgPSB0aGlzLiRvblVwZGF0ZUZuO1xuICAvKipcbiAgICogQWRkcyBhIGBwcmltYXJ5IGtleWAgY2xhdXNlIHRvIHRoZSBjb2x1bW4gZGVmaW5pdGlvbi4gVGhpcyBpbXBsaWNpdGx5IG1ha2VzIHRoZSBjb2x1bW4gYG5vdCBudWxsYC5cbiAgICpcbiAgICogSW4gU1FMaXRlLCBgaW50ZWdlciBwcmltYXJ5IGtleWAgaW1wbGljaXRseSBtYWtlcyB0aGUgY29sdW1uIGF1dG8taW5jcmVtZW50aW5nLlxuICAgKi9cbiAgcHJpbWFyeUtleSgpIHtcbiAgICB0aGlzLmNvbmZpZy5wcmltYXJ5S2V5ID0gdHJ1ZTtcbiAgICB0aGlzLmNvbmZpZy5ub3ROdWxsID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsIFNldHMgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0byB0aGUga2V5IHdpdGhpbiB0aGUgdGFibGUgZGVmaW5pdGlvbiBpZiBhIG5hbWUgd2FzIG5vdCBnaXZlbi4gKi9cbiAgc2V0TmFtZShuYW1lKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm5hbWUgIT09IFwiXCIpIHJldHVybjtcbiAgICB0aGlzLmNvbmZpZy5uYW1lID0gbmFtZTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgQ29sdW1uQnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbHVtbi1idWlsZGVyLmpzLm1hcCIsCiAgICAiY29uc3QgVGFibGVOYW1lID0gU3ltYm9sLmZvcihcImRyaXp6bGU6TmFtZVwiKTtcbmV4cG9ydCB7XG4gIFRhYmxlTmFtZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhYmxlLnV0aWxzLmpzLm1hcCIsCiAgICAiZnVuY3Rpb24gaWlmZShmbiwgLi4uYXJncykge1xuICByZXR1cm4gZm4oLi4uYXJncyk7XG59XG5leHBvcnQge1xuICBpaWZlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhY2luZy11dGlscy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZU5hbWUgfSBmcm9tIFwiLi4vdGFibGUudXRpbHMuanNcIjtcbmZ1bmN0aW9uIHVuaXF1ZShuYW1lKSB7XG4gIHJldHVybiBuZXcgVW5pcXVlT25Db25zdHJhaW50QnVpbGRlcihuYW1lKTtcbn1cbmZ1bmN0aW9uIHVuaXF1ZUtleU5hbWUodGFibGUsIGNvbHVtbnMpIHtcbiAgcmV0dXJuIGAke3RhYmxlW1RhYmxlTmFtZV19XyR7Y29sdW1ucy5qb2luKFwiX1wiKX1fdW5pcXVlYDtcbn1cbmNsYXNzIFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoY29sdW1ucywgbmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ1VuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29sdW1ucztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBudWxsc05vdERpc3RpbmN0Q29uZmlnID0gZmFsc2U7XG4gIG51bGxzTm90RGlzdGluY3QoKSB7XG4gICAgdGhpcy5udWxsc05vdERpc3RpbmN0Q29uZmlnID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50KHRhYmxlLCB0aGlzLmNvbHVtbnMsIHRoaXMubnVsbHNOb3REaXN0aW5jdENvbmZpZywgdGhpcy5uYW1lKTtcbiAgfVxufVxuY2xhc3MgVW5pcXVlT25Db25zdHJhaW50QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnVW5pcXVlT25Db25zdHJhaW50QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIG5hbWU7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG4gIG9uKC4uLmNvbHVtbnMpIHtcbiAgICByZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyKGNvbHVtbnMsIHRoaXMubmFtZSk7XG4gIH1cbn1cbmNsYXNzIFVuaXF1ZUNvbnN0cmFpbnQge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29sdW1ucywgbnVsbHNOb3REaXN0aW5jdCwgbmFtZSkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICAgIHRoaXMubmFtZSA9IG5hbWUgPz8gdW5pcXVlS2V5TmFtZSh0aGlzLnRhYmxlLCB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKSk7XG4gICAgdGhpcy5udWxsc05vdERpc3RpbmN0ID0gbnVsbHNOb3REaXN0aW5jdDtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ1VuaXF1ZUNvbnN0cmFpbnRcIjtcbiAgY29sdW1ucztcbiAgbmFtZTtcbiAgbnVsbHNOb3REaXN0aW5jdCA9IGZhbHNlO1xuICBnZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFVuaXF1ZUNvbnN0cmFpbnQsXG4gIFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyLFxuICBVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyLFxuICB1bmlxdWUsXG4gIHVuaXF1ZUtleU5hbWVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmlxdWUtY29uc3RyYWludC5qcy5tYXAiLAogICAgImltcG9ydCB7IENvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi4vLi4vY29sdW1uLWJ1aWxkZXIuanNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuLi8uLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgRm9yZWlnbktleUJ1aWxkZXIgfSBmcm9tIFwiLi4vZm9yZWlnbi1rZXlzLmpzXCI7XG5pbXBvcnQgeyBpaWZlIH0gZnJvbSBcIi4uLy4uL3RyYWNpbmctdXRpbHMuanNcIjtcbmltcG9ydCB7IHVuaXF1ZUtleU5hbWUgfSBmcm9tIFwiLi4vdW5pcXVlLWNvbnN0cmFpbnQuanNcIjtcbmltcG9ydCB7IG1ha2VQZ0FycmF5LCBwYXJzZVBnQXJyYXkgfSBmcm9tIFwiLi4vdXRpbHMvYXJyYXkuanNcIjtcbmNsYXNzIFBnQ29sdW1uQnVpbGRlciBleHRlbmRzIENvbHVtbkJ1aWxkZXIge1xuICBmb3JlaWduS2V5Q29uZmlncyA9IFtdO1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0NvbHVtbkJ1aWxkZXJcIjtcbiAgYXJyYXkoc2l6ZSkge1xuICAgIHJldHVybiBuZXcgUGdBcnJheUJ1aWxkZXIodGhpcy5jb25maWcubmFtZSwgdGhpcywgc2l6ZSk7XG4gIH1cbiAgcmVmZXJlbmNlcyhyZWYsIGFjdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuZm9yZWlnbktleUNvbmZpZ3MucHVzaCh7IHJlZiwgYWN0aW9ucyB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB1bmlxdWUobmFtZSwgY29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcuaXNVbmlxdWUgPSB0cnVlO1xuICAgIHRoaXMuY29uZmlnLnVuaXF1ZU5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY29uZmlnLnVuaXF1ZVR5cGUgPSBjb25maWc/Lm51bGxzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdlbmVyYXRlZEFsd2F5c0FzKGFzKSB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkID0ge1xuICAgICAgYXMsXG4gICAgICB0eXBlOiBcImFsd2F5c1wiLFxuICAgICAgbW9kZTogXCJzdG9yZWRcIlxuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZEZvcmVpZ25LZXlzKGNvbHVtbiwgdGFibGUpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JlaWduS2V5Q29uZmlncy5tYXAoKHsgcmVmLCBhY3Rpb25zIH0pID0+IHtcbiAgICAgIHJldHVybiBpaWZlKFxuICAgICAgICAocmVmMiwgYWN0aW9uczIpID0+IHtcbiAgICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IEZvcmVpZ25LZXlCdWlsZGVyKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvcmVpZ25Db2x1bW4gPSByZWYyKCk7XG4gICAgICAgICAgICByZXR1cm4geyBjb2x1bW5zOiBbY29sdW1uXSwgZm9yZWlnbkNvbHVtbnM6IFtmb3JlaWduQ29sdW1uXSB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChhY3Rpb25zMi5vblVwZGF0ZSkge1xuICAgICAgICAgICAgYnVpbGRlci5vblVwZGF0ZShhY3Rpb25zMi5vblVwZGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhY3Rpb25zMi5vbkRlbGV0ZSkge1xuICAgICAgICAgICAgYnVpbGRlci5vbkRlbGV0ZShhY3Rpb25zMi5vbkRlbGV0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKHRhYmxlKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVmLFxuICAgICAgICBhY3Rpb25zXG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGRFeHRyYUNvbmZpZ0NvbHVtbih0YWJsZSkge1xuICAgIHJldHVybiBuZXcgRXh0cmFDb25maWdDb2x1bW4odGFibGUsIHRoaXMuY29uZmlnKTtcbiAgfVxufVxuY2xhc3MgUGdDb2x1bW4gZXh0ZW5kcyBDb2x1bW4ge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgaWYgKCFjb25maWcudW5pcXVlTmFtZSkge1xuICAgICAgY29uZmlnLnVuaXF1ZU5hbWUgPSB1bmlxdWVLZXlOYW1lKHRhYmxlLCBbY29uZmlnLm5hbWVdKTtcbiAgICB9XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnQ29sdW1uXCI7XG59XG5jbGFzcyBFeHRyYUNvbmZpZ0NvbHVtbiBleHRlbmRzIFBnQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiRXh0cmFDb25maWdDb2x1bW5cIjtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTUUxUeXBlKCk7XG4gIH1cbiAgaW5kZXhDb25maWcgPSB7XG4gICAgb3JkZXI6IHRoaXMuY29uZmlnLm9yZGVyID8/IFwiYXNjXCIsXG4gICAgbnVsbHM6IHRoaXMuY29uZmlnLm51bGxzID8/IFwibGFzdFwiLFxuICAgIG9wQ2xhc3M6IHRoaXMuY29uZmlnLm9wQ2xhc3NcbiAgfTtcbiAgZGVmYXVsdENvbmZpZyA9IHtcbiAgICBvcmRlcjogXCJhc2NcIixcbiAgICBudWxsczogXCJsYXN0XCIsXG4gICAgb3BDbGFzczogdm9pZCAwXG4gIH07XG4gIGFzYygpIHtcbiAgICB0aGlzLmluZGV4Q29uZmlnLm9yZGVyID0gXCJhc2NcIjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBkZXNjKCkge1xuICAgIHRoaXMuaW5kZXhDb25maWcub3JkZXIgPSBcImRlc2NcIjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBudWxsc0ZpcnN0KCkge1xuICAgIHRoaXMuaW5kZXhDb25maWcubnVsbHMgPSBcImZpcnN0XCI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgbnVsbHNMYXN0KCkge1xuICAgIHRoaXMuaW5kZXhDb25maWcubnVsbHMgPSBcImxhc3RcIjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogIyMjIFBvc3RncmVTUUwgZG9jdW1lbnRhdGlvbiBxdW90ZVxuICAgKlxuICAgKiA+IEFuIG9wZXJhdG9yIGNsYXNzIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyBjYW4gYmUgc3BlY2lmaWVkIGZvciBlYWNoIGNvbHVtbiBvZiBhbiBpbmRleC5cbiAgICogVGhlIG9wZXJhdG9yIGNsYXNzIGlkZW50aWZpZXMgdGhlIG9wZXJhdG9ycyB0byBiZSB1c2VkIGJ5IHRoZSBpbmRleCBmb3IgdGhhdCBjb2x1bW4uXG4gICAqIEZvciBleGFtcGxlLCBhIEItdHJlZSBpbmRleCBvbiBmb3VyLWJ5dGUgaW50ZWdlcnMgd291bGQgdXNlIHRoZSBpbnQ0X29wcyBjbGFzcztcbiAgICogdGhpcyBvcGVyYXRvciBjbGFzcyBpbmNsdWRlcyBjb21wYXJpc29uIGZ1bmN0aW9ucyBmb3IgZm91ci1ieXRlIGludGVnZXJzLlxuICAgKiBJbiBwcmFjdGljZSB0aGUgZGVmYXVsdCBvcGVyYXRvciBjbGFzcyBmb3IgdGhlIGNvbHVtbidzIGRhdGEgdHlwZSBpcyB1c3VhbGx5IHN1ZmZpY2llbnQuXG4gICAqIFRoZSBtYWluIHBvaW50IG9mIGhhdmluZyBvcGVyYXRvciBjbGFzc2VzIGlzIHRoYXQgZm9yIHNvbWUgZGF0YSB0eXBlcywgdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBtZWFuaW5nZnVsIG9yZGVyaW5nLlxuICAgKiBGb3IgZXhhbXBsZSwgd2UgbWlnaHQgd2FudCB0byBzb3J0IGEgY29tcGxleC1udW1iZXIgZGF0YSB0eXBlIGVpdGhlciBieSBhYnNvbHV0ZSB2YWx1ZSBvciBieSByZWFsIHBhcnQuXG4gICAqIFdlIGNvdWxkIGRvIHRoaXMgYnkgZGVmaW5pbmcgdHdvIG9wZXJhdG9yIGNsYXNzZXMgZm9yIHRoZSBkYXRhIHR5cGUgYW5kIHRoZW4gc2VsZWN0aW5nIHRoZSBwcm9wZXIgY2xhc3Mgd2hlbiBjcmVhdGluZyBhbiBpbmRleC5cbiAgICogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvcGVyYXRvciBjbGFzc2VzIGNoZWNrOlxuICAgKlxuICAgKiAjIyMgVXNlZnVsIGxpbmtzXG4gICAqIGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC9zcWwtY3JlYXRlaW5kZXguaHRtbFxuICAgKlxuICAgKiBodHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzL2N1cnJlbnQvaW5kZXhlcy1vcGNsYXNzLmh0bWxcbiAgICpcbiAgICogaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvZG9jcy9jdXJyZW50L3hpbmRleC5odG1sXG4gICAqXG4gICAqICMjIyBBZGRpdGlvbmFsIHR5cGVzXG4gICAqIElmIHlvdSBoYXZlIHRoZSBgcGdfdmVjdG9yYCBleHRlbnNpb24gaW5zdGFsbGVkIGluIHlvdXIgZGF0YWJhc2UsIHlvdSBjYW4gdXNlIHRoZVxuICAgKiBgdmVjdG9yX2wyX29wc2AsIGB2ZWN0b3JfaXBfb3BzYCwgYHZlY3Rvcl9jb3NpbmVfb3BzYCwgYHZlY3Rvcl9sMV9vcHNgLCBgYml0X2hhbW1pbmdfb3BzYCwgYGJpdF9qYWNjYXJkX29wc2AsIGBoYWxmdmVjX2wyX29wc2AsIGBzcGFyc2V2ZWNfbDJfb3BzYCBvcHRpb25zLCB3aGljaCBhcmUgcHJlZGVmaW5lZCB0eXBlcy5cbiAgICpcbiAgICogKipZb3UgY2FuIGFsd2F5cyBzcGVjaWZ5IGFueSBzdHJpbmcgeW91IHdhbnQgaW4gdGhlIG9wZXJhdG9yIGNsYXNzLCBpbiBjYXNlIERyaXp6bGUgZG9lc24ndCBoYXZlIGl0IG5hdGl2ZWx5IGluIGl0cyB0eXBlcyoqXG4gICAqXG4gICAqIEBwYXJhbSBvcENsYXNzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBvcChvcENsYXNzKSB7XG4gICAgdGhpcy5pbmRleENvbmZpZy5vcENsYXNzID0gb3BDbGFzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuY2xhc3MgSW5kZXhlZENvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkluZGV4ZWRDb2x1bW5cIjtcbiAgY29uc3RydWN0b3IobmFtZSwga2V5QXNOYW1lLCB0eXBlLCBpbmRleENvbmZpZykge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5rZXlBc05hbWUgPSBrZXlBc05hbWU7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmluZGV4Q29uZmlnID0gaW5kZXhDb25maWc7XG4gIH1cbiAgbmFtZTtcbiAga2V5QXNOYW1lO1xuICB0eXBlO1xuICBpbmRleENvbmZpZztcbn1cbmNsYXNzIFBnQXJyYXlCdWlsZGVyIGV4dGVuZHMgUGdDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdBcnJheUJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgYmFzZUJ1aWxkZXIsIHNpemUpIHtcbiAgICBzdXBlcihuYW1lLCBcImFycmF5XCIsIFwiUGdBcnJheVwiKTtcbiAgICB0aGlzLmNvbmZpZy5iYXNlQnVpbGRlciA9IGJhc2VCdWlsZGVyO1xuICAgIHRoaXMuY29uZmlnLnNpemUgPSBzaXplO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICBjb25zdCBiYXNlQ29sdW1uID0gdGhpcy5jb25maWcuYmFzZUJ1aWxkZXIuYnVpbGQodGFibGUpO1xuICAgIHJldHVybiBuZXcgUGdBcnJheShcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWcsXG4gICAgICBiYXNlQ29sdW1uXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgUGdBcnJheSBleHRlbmRzIFBnQ29sdW1uIHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZywgYmFzZUNvbHVtbiwgcmFuZ2UpIHtcbiAgICBzdXBlcih0YWJsZSwgY29uZmlnKTtcbiAgICB0aGlzLmJhc2VDb2x1bW4gPSBiYXNlQ29sdW1uO1xuICAgIHRoaXMucmFuZ2UgPSByYW5nZTtcbiAgICB0aGlzLnNpemUgPSBjb25maWcuc2l6ZTtcbiAgfVxuICBzaXplO1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0FycmF5XCI7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuYmFzZUNvbHVtbi5nZXRTUUxUeXBlKCl9WyR7dHlwZW9mIHRoaXMuc2l6ZSA9PT0gXCJudW1iZXJcIiA/IHRoaXMuc2l6ZSA6IFwiXCJ9XWA7XG4gIH1cbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdmFsdWUgPSBwYXJzZVBnQXJyYXkodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUubWFwKCh2KSA9PiB0aGlzLmJhc2VDb2x1bW4ubWFwRnJvbURyaXZlclZhbHVlKHYpKTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlLCBpc05lc3RlZEFycmF5ID0gZmFsc2UpIHtcbiAgICBjb25zdCBhID0gdmFsdWUubWFwKFxuICAgICAgKHYpID0+IHYgPT09IG51bGwgPyBudWxsIDogaXModGhpcy5iYXNlQ29sdW1uLCBQZ0FycmF5KSA/IHRoaXMuYmFzZUNvbHVtbi5tYXBUb0RyaXZlclZhbHVlKHYsIHRydWUpIDogdGhpcy5iYXNlQ29sdW1uLm1hcFRvRHJpdmVyVmFsdWUodilcbiAgICApO1xuICAgIGlmIChpc05lc3RlZEFycmF5KSByZXR1cm4gYTtcbiAgICByZXR1cm4gbWFrZVBnQXJyYXkoYSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIEV4dHJhQ29uZmlnQ29sdW1uLFxuICBJbmRleGVkQ29sdW1uLFxuICBQZ0FycmF5LFxuICBQZ0FycmF5QnVpbGRlcixcbiAgUGdDb2x1bW4sXG4gIFBnQ29sdW1uQnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbW1vbi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBQZ0NvbHVtbiwgUGdDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBQZ0VudW1PYmplY3RDb2x1bW5CdWlsZGVyIGV4dGVuZHMgUGdDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdFbnVtT2JqZWN0Q29sdW1uQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBlbnVtSW5zdGFuY2UpIHtcbiAgICBzdXBlcihuYW1lLCBcInN0cmluZ1wiLCBcIlBnRW51bU9iamVjdENvbHVtblwiKTtcbiAgICB0aGlzLmNvbmZpZy5lbnVtID0gZW51bUluc3RhbmNlO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFBnRW51bU9iamVjdENvbHVtbihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBQZ0VudW1PYmplY3RDb2x1bW4gZXh0ZW5kcyBQZ0NvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnRW51bU9iamVjdENvbHVtblwiO1xuICBlbnVtO1xuICBlbnVtVmFsdWVzID0gdGhpcy5jb25maWcuZW51bS5lbnVtVmFsdWVzO1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gICAgdGhpcy5lbnVtID0gY29uZmlnLmVudW07XG4gIH1cbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbnVtLmVudW1OYW1lO1xuICB9XG59XG5jb25zdCBpc1BnRW51bVN5bSA9IFN5bWJvbC5mb3IoXCJkcml6emxlOmlzUGdFbnVtXCIpO1xuZnVuY3Rpb24gaXNQZ0VudW0ob2JqKSB7XG4gIHJldHVybiAhIW9iaiAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgJiYgaXNQZ0VudW1TeW0gaW4gb2JqICYmIG9ialtpc1BnRW51bVN5bV0gPT09IHRydWU7XG59XG5jbGFzcyBQZ0VudW1Db2x1bW5CdWlsZGVyIGV4dGVuZHMgUGdDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdFbnVtQ29sdW1uQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBlbnVtSW5zdGFuY2UpIHtcbiAgICBzdXBlcihuYW1lLCBcInN0cmluZ1wiLCBcIlBnRW51bUNvbHVtblwiKTtcbiAgICB0aGlzLmNvbmZpZy5lbnVtID0gZW51bUluc3RhbmNlO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFBnRW51bUNvbHVtbihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBQZ0VudW1Db2x1bW4gZXh0ZW5kcyBQZ0NvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnRW51bUNvbHVtblwiO1xuICBlbnVtID0gdGhpcy5jb25maWcuZW51bTtcbiAgZW51bVZhbHVlcyA9IHRoaXMuY29uZmlnLmVudW0uZW51bVZhbHVlcztcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICAgIHRoaXMuZW51bSA9IGNvbmZpZy5lbnVtO1xuICB9XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW51bS5lbnVtTmFtZTtcbiAgfVxufVxuZnVuY3Rpb24gcGdFbnVtKGVudW1OYW1lLCBpbnB1dCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBwZ0VudW1XaXRoU2NoZW1hKGVudW1OYW1lLCBbLi4uaW5wdXRdLCB2b2lkIDApIDogcGdFbnVtT2JqZWN0V2l0aFNjaGVtYShlbnVtTmFtZSwgaW5wdXQsIHZvaWQgMCk7XG59XG5mdW5jdGlvbiBwZ0VudW1XaXRoU2NoZW1hKGVudW1OYW1lLCB2YWx1ZXMsIHNjaGVtYSkge1xuICBjb25zdCBlbnVtSW5zdGFuY2UgPSBPYmplY3QuYXNzaWduKFxuICAgIChuYW1lKSA9PiBuZXcgUGdFbnVtQ29sdW1uQnVpbGRlcihuYW1lID8/IFwiXCIsIGVudW1JbnN0YW5jZSksXG4gICAge1xuICAgICAgZW51bU5hbWUsXG4gICAgICBlbnVtVmFsdWVzOiB2YWx1ZXMsXG4gICAgICBzY2hlbWEsXG4gICAgICBbaXNQZ0VudW1TeW1dOiB0cnVlXG4gICAgfVxuICApO1xuICByZXR1cm4gZW51bUluc3RhbmNlO1xufVxuZnVuY3Rpb24gcGdFbnVtT2JqZWN0V2l0aFNjaGVtYShlbnVtTmFtZSwgdmFsdWVzLCBzY2hlbWEpIHtcbiAgY29uc3QgZW51bUluc3RhbmNlID0gT2JqZWN0LmFzc2lnbihcbiAgICAobmFtZSkgPT4gbmV3IFBnRW51bU9iamVjdENvbHVtbkJ1aWxkZXIobmFtZSA/PyBcIlwiLCBlbnVtSW5zdGFuY2UpLFxuICAgIHtcbiAgICAgIGVudW1OYW1lLFxuICAgICAgZW51bVZhbHVlczogT2JqZWN0LnZhbHVlcyh2YWx1ZXMpLFxuICAgICAgc2NoZW1hLFxuICAgICAgW2lzUGdFbnVtU3ltXTogdHJ1ZVxuICAgIH1cbiAgKTtcbiAgcmV0dXJuIGVudW1JbnN0YW5jZTtcbn1cbmV4cG9ydCB7XG4gIFBnRW51bUNvbHVtbixcbiAgUGdFbnVtQ29sdW1uQnVpbGRlcixcbiAgUGdFbnVtT2JqZWN0Q29sdW1uLFxuICBQZ0VudW1PYmplY3RDb2x1bW5CdWlsZGVyLFxuICBpc1BnRW51bSxcbiAgcGdFbnVtLFxuICBwZ0VudW1PYmplY3RXaXRoU2NoZW1hLFxuICBwZ0VudW1XaXRoU2NoZW1hXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW51bS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIFN1YnF1ZXJ5IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU3VicXVlcnlcIjtcbiAgY29uc3RydWN0b3Ioc3FsLCBmaWVsZHMsIGFsaWFzLCBpc1dpdGggPSBmYWxzZSwgdXNlZFRhYmxlcyA9IFtdKSB7XG4gICAgdGhpcy5fID0ge1xuICAgICAgYnJhbmQ6IFwiU3VicXVlcnlcIixcbiAgICAgIHNxbCxcbiAgICAgIHNlbGVjdGVkRmllbGRzOiBmaWVsZHMsXG4gICAgICBhbGlhcyxcbiAgICAgIGlzV2l0aCxcbiAgICAgIHVzZWRUYWJsZXNcbiAgICB9O1xuICB9XG4gIC8vIGdldFNRTCgpOiBTUUw8dW5rbm93bj4ge1xuICAvLyBcdHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG4gIC8vIH1cbn1cbmNsYXNzIFdpdGhTdWJxdWVyeSBleHRlbmRzIFN1YnF1ZXJ5IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiV2l0aFN1YnF1ZXJ5XCI7XG59XG5leHBvcnQge1xuICBTdWJxdWVyeSxcbiAgV2l0aFN1YnF1ZXJ5XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3VicXVlcnkuanMubWFwIiwKICAgICIvLyBwYWNrYWdlLmpzb25cbnZhciB2ZXJzaW9uID0gXCIwLjQ0LjVcIjtcblxuLy8gc3JjL3ZlcnNpb24udHNcbnZhciBjb21wYXRpYmlsaXR5VmVyc2lvbiA9IDEwO1xuZXhwb3J0IHtcbiAgY29tcGF0aWJpbGl0eVZlcnNpb24sXG4gIHZlcnNpb24gYXMgbnBtVmVyc2lvblxufTtcbiIsCiAgICAiaW1wb3J0IHsgaWlmZSB9IGZyb20gXCIuL3RyYWNpbmctdXRpbHMuanNcIjtcbmltcG9ydCB7IG5wbVZlcnNpb24gfSBmcm9tIFwiLi92ZXJzaW9uLmpzXCI7XG5sZXQgb3RlbDtcbmxldCByYXdUcmFjZXI7XG5jb25zdCB0cmFjZXIgPSB7XG4gIHN0YXJ0QWN0aXZlU3BhbihuYW1lLCBmbikge1xuICAgIGlmICghb3RlbCkge1xuICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfVxuICAgIGlmICghcmF3VHJhY2VyKSB7XG4gICAgICByYXdUcmFjZXIgPSBvdGVsLnRyYWNlLmdldFRyYWNlcihcImRyaXp6bGUtb3JtXCIsIG5wbVZlcnNpb24pO1xuICAgIH1cbiAgICByZXR1cm4gaWlmZShcbiAgICAgIChvdGVsMiwgcmF3VHJhY2VyMikgPT4gcmF3VHJhY2VyMi5zdGFydEFjdGl2ZVNwYW4oXG4gICAgICAgIG5hbWUsXG4gICAgICAgIChzcGFuKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBmbihzcGFuKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICAgIGNvZGU6IG90ZWwyLlNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIlxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWluc3RhbmNlb2Yvbm8taW5zdGFuY2VvZlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBzcGFuLmVuZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKSxcbiAgICAgIG90ZWwsXG4gICAgICByYXdUcmFjZXJcbiAgICApO1xuICB9XG59O1xuZXhwb3J0IHtcbiAgdHJhY2VyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhY2luZy5qcy5tYXAiLAogICAgImNvbnN0IFZpZXdCYXNlQ29uZmlnID0gU3ltYm9sLmZvcihcImRyaXp6bGU6Vmlld0Jhc2VDb25maWdcIik7XG5leHBvcnQge1xuICBWaWV3QmFzZUNvbmZpZ1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZpZXctY29tbW9uLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGVOYW1lIH0gZnJvbSBcIi4vdGFibGUudXRpbHMuanNcIjtcbmNvbnN0IFNjaGVtYSA9IFN5bWJvbC5mb3IoXCJkcml6emxlOlNjaGVtYVwiKTtcbmNvbnN0IENvbHVtbnMgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpDb2x1bW5zXCIpO1xuY29uc3QgRXh0cmFDb25maWdDb2x1bW5zID0gU3ltYm9sLmZvcihcImRyaXp6bGU6RXh0cmFDb25maWdDb2x1bW5zXCIpO1xuY29uc3QgT3JpZ2luYWxOYW1lID0gU3ltYm9sLmZvcihcImRyaXp6bGU6T3JpZ2luYWxOYW1lXCIpO1xuY29uc3QgQmFzZU5hbWUgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpCYXNlTmFtZVwiKTtcbmNvbnN0IElzQWxpYXMgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpJc0FsaWFzXCIpO1xuY29uc3QgRXh0cmFDb25maWdCdWlsZGVyID0gU3ltYm9sLmZvcihcImRyaXp6bGU6RXh0cmFDb25maWdCdWlsZGVyXCIpO1xuY29uc3QgSXNEcml6emxlVGFibGUgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpJc0RyaXp6bGVUYWJsZVwiKTtcbmNsYXNzIFRhYmxlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiVGFibGVcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgU3ltYm9sID0ge1xuICAgIE5hbWU6IFRhYmxlTmFtZSxcbiAgICBTY2hlbWEsXG4gICAgT3JpZ2luYWxOYW1lLFxuICAgIENvbHVtbnMsXG4gICAgRXh0cmFDb25maWdDb2x1bW5zLFxuICAgIEJhc2VOYW1lLFxuICAgIElzQWxpYXMsXG4gICAgRXh0cmFDb25maWdCdWlsZGVyXG4gIH07XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQ2FuIGJlIGNoYW5nZWQgaWYgdGhlIHRhYmxlIGlzIGFsaWFzZWQuXG4gICAqL1xuICBbVGFibGVOYW1lXTtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBVc2VkIHRvIHN0b3JlIHRoZSBvcmlnaW5hbCBuYW1lIG9mIHRoZSB0YWJsZSwgYmVmb3JlIGFueSBhbGlhc2luZy5cbiAgICovXG4gIFtPcmlnaW5hbE5hbWVdO1xuICAvKiogQGludGVybmFsICovXG4gIFtTY2hlbWFdO1xuICAvKiogQGludGVybmFsICovXG4gIFtDb2x1bW5zXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbRXh0cmFDb25maWdDb2x1bW5zXTtcbiAgLyoqXG4gICAqICBAaW50ZXJuYWxcbiAgICogVXNlZCB0byBzdG9yZSB0aGUgdGFibGUgbmFtZSBiZWZvcmUgdGhlIHRyYW5zZm9ybWF0aW9uIHZpYSB0aGUgYHRhYmxlQ3JlYXRvcmAgZnVuY3Rpb25zLlxuICAgKi9cbiAgW0Jhc2VOYW1lXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbSXNBbGlhc10gPSBmYWxzZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbSXNEcml6emxlVGFibGVdID0gdHJ1ZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbRXh0cmFDb25maWdCdWlsZGVyXSA9IHZvaWQgMDtcbiAgY29uc3RydWN0b3IobmFtZSwgc2NoZW1hLCBiYXNlTmFtZSkge1xuICAgIHRoaXNbVGFibGVOYW1lXSA9IHRoaXNbT3JpZ2luYWxOYW1lXSA9IG5hbWU7XG4gICAgdGhpc1tTY2hlbWFdID0gc2NoZW1hO1xuICAgIHRoaXNbQmFzZU5hbWVdID0gYmFzZU5hbWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzVGFibGUodGFibGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0YWJsZSA9PT0gXCJvYmplY3RcIiAmJiB0YWJsZSAhPT0gbnVsbCAmJiBJc0RyaXp6bGVUYWJsZSBpbiB0YWJsZTtcbn1cbmZ1bmN0aW9uIGdldFRhYmxlTmFtZSh0YWJsZSkge1xuICByZXR1cm4gdGFibGVbVGFibGVOYW1lXTtcbn1cbmZ1bmN0aW9uIGdldFRhYmxlVW5pcXVlTmFtZSh0YWJsZSkge1xuICByZXR1cm4gYCR7dGFibGVbU2NoZW1hXSA/PyBcInB1YmxpY1wifS4ke3RhYmxlW1RhYmxlTmFtZV19YDtcbn1cbmV4cG9ydCB7XG4gIEJhc2VOYW1lLFxuICBDb2x1bW5zLFxuICBFeHRyYUNvbmZpZ0J1aWxkZXIsXG4gIEV4dHJhQ29uZmlnQ29sdW1ucyxcbiAgSXNBbGlhcyxcbiAgT3JpZ2luYWxOYW1lLFxuICBTY2hlbWEsXG4gIFRhYmxlLFxuICBnZXRUYWJsZU5hbWUsXG4gIGdldFRhYmxlVW5pcXVlTmFtZSxcbiAgaXNUYWJsZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhYmxlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBpc1BnRW51bSB9IGZyb20gXCIuLi9wZy1jb3JlL2NvbHVtbnMvZW51bS5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IHRyYWNlciB9IGZyb20gXCIuLi90cmFjaW5nLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuLi92aWV3LWNvbW1vbi5qc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgSXNBbGlhcywgVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmNsYXNzIEZha2VQcmltaXRpdmVQYXJhbSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkZha2VQcmltaXRpdmVQYXJhbVwiO1xufVxuZnVuY3Rpb24gaXNTUUxXcmFwcGVyKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwICYmIHR5cGVvZiB2YWx1ZS5nZXRTUUwgPT09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIG1lcmdlUXVlcmllcyhxdWVyaWVzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHsgc3FsOiBcIlwiLCBwYXJhbXM6IFtdIH07XG4gIGZvciAoY29uc3QgcXVlcnkgb2YgcXVlcmllcykge1xuICAgIHJlc3VsdC5zcWwgKz0gcXVlcnkuc3FsO1xuICAgIHJlc3VsdC5wYXJhbXMucHVzaCguLi5xdWVyeS5wYXJhbXMpO1xuICAgIGlmIChxdWVyeS50eXBpbmdzPy5sZW5ndGgpIHtcbiAgICAgIGlmICghcmVzdWx0LnR5cGluZ3MpIHtcbiAgICAgICAgcmVzdWx0LnR5cGluZ3MgPSBbXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC50eXBpbmdzLnB1c2goLi4ucXVlcnkudHlwaW5ncyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5jbGFzcyBTdHJpbmdDaHVuayB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlN0cmluZ0NodW5rXCI7XG4gIHZhbHVlO1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHRoaXMudmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgfVxuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbiAgfVxufVxuY2xhc3MgU1FMIHtcbiAgY29uc3RydWN0b3IocXVlcnlDaHVua3MpIHtcbiAgICB0aGlzLnF1ZXJ5Q2h1bmtzID0gcXVlcnlDaHVua3M7XG4gICAgZm9yIChjb25zdCBjaHVuayBvZiBxdWVyeUNodW5rcykge1xuICAgICAgaWYgKGlzKGNodW5rLCBUYWJsZSkpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IGNodW5rW1RhYmxlLlN5bWJvbC5TY2hlbWFdO1xuICAgICAgICB0aGlzLnVzZWRUYWJsZXMucHVzaChcbiAgICAgICAgICBzY2hlbWFOYW1lID09PSB2b2lkIDAgPyBjaHVua1tUYWJsZS5TeW1ib2wuTmFtZV0gOiBzY2hlbWFOYW1lICsgXCIuXCIgKyBjaHVua1tUYWJsZS5TeW1ib2wuTmFtZV1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZGVjb2RlciA9IG5vb3BEZWNvZGVyO1xuICBzaG91bGRJbmxpbmVQYXJhbXMgPSBmYWxzZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICB1c2VkVGFibGVzID0gW107XG4gIGFwcGVuZChxdWVyeSkge1xuICAgIHRoaXMucXVlcnlDaHVua3MucHVzaCguLi5xdWVyeS5xdWVyeUNodW5rcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdG9RdWVyeShjb25maWcpIHtcbiAgICByZXR1cm4gdHJhY2VyLnN0YXJ0QWN0aXZlU3BhbihcImRyaXp6bGUuYnVpbGRTUUxcIiwgKHNwYW4pID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyh0aGlzLnF1ZXJ5Q2h1bmtzLCBjb25maWcpO1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIFwiZHJpenpsZS5xdWVyeS50ZXh0XCI6IHF1ZXJ5LnNxbCxcbiAgICAgICAgXCJkcml6emxlLnF1ZXJ5LnBhcmFtc1wiOiBKU09OLnN0cmluZ2lmeShxdWVyeS5wYXJhbXMpXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBxdWVyeTtcbiAgICB9KTtcbiAgfVxuICBidWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhjaHVua3MsIF9jb25maWcpIHtcbiAgICBjb25zdCBjb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBfY29uZmlnLCB7XG4gICAgICBpbmxpbmVQYXJhbXM6IF9jb25maWcuaW5saW5lUGFyYW1zIHx8IHRoaXMuc2hvdWxkSW5saW5lUGFyYW1zLFxuICAgICAgcGFyYW1TdGFydEluZGV4OiBfY29uZmlnLnBhcmFtU3RhcnRJbmRleCB8fCB7IHZhbHVlOiAwIH1cbiAgICB9KTtcbiAgICBjb25zdCB7XG4gICAgICBjYXNpbmcsXG4gICAgICBlc2NhcGVOYW1lLFxuICAgICAgZXNjYXBlUGFyYW0sXG4gICAgICBwcmVwYXJlVHlwaW5nLFxuICAgICAgaW5saW5lUGFyYW1zLFxuICAgICAgcGFyYW1TdGFydEluZGV4XG4gICAgfSA9IGNvbmZpZztcbiAgICByZXR1cm4gbWVyZ2VRdWVyaWVzKGNodW5rcy5tYXAoKGNodW5rKSA9PiB7XG4gICAgICBpZiAoaXMoY2h1bmssIFN0cmluZ0NodW5rKSkge1xuICAgICAgICByZXR1cm4geyBzcWw6IGNodW5rLnZhbHVlLmpvaW4oXCJcIiksIHBhcmFtczogW10gfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVOYW1lKGNodW5rLnZhbHVlKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgfVxuICAgICAgaWYgKGNodW5rID09PSB2b2lkIDApIHtcbiAgICAgICAgcmV0dXJuIHsgc3FsOiBcIlwiLCBwYXJhbXM6IFtdIH07XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaHVuaykpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW25ldyBTdHJpbmdDaHVuayhcIihcIildO1xuICAgICAgICBmb3IgKGNvbnN0IFtpLCBwXSBvZiBjaHVuay5lbnRyaWVzKCkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChwKTtcbiAgICAgICAgICBpZiAoaSA8IGNodW5rLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBTdHJpbmdDaHVuayhcIiwgXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2gobmV3IFN0cmluZ0NodW5rKFwiKVwiKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKHJlc3VsdCwgY29uZmlnKTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgU1FMKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhjaHVuay5xdWVyeUNodW5rcywge1xuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICBpbmxpbmVQYXJhbXM6IGlubGluZVBhcmFtcyB8fCBjaHVuay5zaG91bGRJbmxpbmVQYXJhbXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFRhYmxlKSkge1xuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gY2h1bmtbVGFibGUuU3ltYm9sLlNjaGVtYV07XG4gICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGNodW5rW1RhYmxlLlN5bWJvbC5OYW1lXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzcWw6IHNjaGVtYU5hbWUgPT09IHZvaWQgMCB8fCBjaHVua1tJc0FsaWFzXSA/IGVzY2FwZU5hbWUodGFibGVOYW1lKSA6IGVzY2FwZU5hbWUoc2NoZW1hTmFtZSkgKyBcIi5cIiArIGVzY2FwZU5hbWUodGFibGVOYW1lKSxcbiAgICAgICAgICBwYXJhbXM6IFtdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIENvbHVtbikpIHtcbiAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IGNhc2luZy5nZXRDb2x1bW5DYXNpbmcoY2h1bmspO1xuICAgICAgICBpZiAoX2NvbmZpZy5pbnZva2VTb3VyY2UgPT09IFwiaW5kZXhlc1wiKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVOYW1lKGNvbHVtbk5hbWUpLCBwYXJhbXM6IFtdIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IGNodW5rLnRhYmxlW1RhYmxlLlN5bWJvbC5TY2hlbWFdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNxbDogY2h1bmsudGFibGVbSXNBbGlhc10gfHwgc2NoZW1hTmFtZSA9PT0gdm9pZCAwID8gZXNjYXBlTmFtZShjaHVuay50YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV0pICsgXCIuXCIgKyBlc2NhcGVOYW1lKGNvbHVtbk5hbWUpIDogZXNjYXBlTmFtZShzY2hlbWFOYW1lKSArIFwiLlwiICsgZXNjYXBlTmFtZShjaHVuay50YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV0pICsgXCIuXCIgKyBlc2NhcGVOYW1lKGNvbHVtbk5hbWUpLFxuICAgICAgICAgIHBhcmFtczogW11cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgVmlldykpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IGNodW5rW1ZpZXdCYXNlQ29uZmlnXS5zY2hlbWE7XG4gICAgICAgIGNvbnN0IHZpZXdOYW1lID0gY2h1bmtbVmlld0Jhc2VDb25maWddLm5hbWU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3FsOiBzY2hlbWFOYW1lID09PSB2b2lkIDAgfHwgY2h1bmtbVmlld0Jhc2VDb25maWddLmlzQWxpYXMgPyBlc2NhcGVOYW1lKHZpZXdOYW1lKSA6IGVzY2FwZU5hbWUoc2NoZW1hTmFtZSkgKyBcIi5cIiArIGVzY2FwZU5hbWUodmlld05hbWUpLFxuICAgICAgICAgIHBhcmFtczogW11cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgUGFyYW0pKSB7XG4gICAgICAgIGlmIChpcyhjaHVuay52YWx1ZSwgUGxhY2Vob2xkZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVQYXJhbShwYXJhbVN0YXJ0SW5kZXgudmFsdWUrKywgY2h1bmspLCBwYXJhbXM6IFtjaHVua10sIHR5cGluZ3M6IFtcIm5vbmVcIl0gfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXBwZWRWYWx1ZSA9IGNodW5rLnZhbHVlID09PSBudWxsID8gbnVsbCA6IGNodW5rLmVuY29kZXIubWFwVG9Ecml2ZXJWYWx1ZShjaHVuay52YWx1ZSk7XG4gICAgICAgIGlmIChpcyhtYXBwZWRWYWx1ZSwgU1FMKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKFttYXBwZWRWYWx1ZV0sIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlubGluZVBhcmFtcykge1xuICAgICAgICAgIHJldHVybiB7IHNxbDogdGhpcy5tYXBJbmxpbmVQYXJhbShtYXBwZWRWYWx1ZSwgY29uZmlnKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBpbmdzID0gW1wibm9uZVwiXTtcbiAgICAgICAgaWYgKHByZXBhcmVUeXBpbmcpIHtcbiAgICAgICAgICB0eXBpbmdzID0gW3ByZXBhcmVUeXBpbmcoY2h1bmsuZW5jb2RlcildO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlUGFyYW0ocGFyYW1TdGFydEluZGV4LnZhbHVlKyssIG1hcHBlZFZhbHVlKSwgcGFyYW1zOiBbbWFwcGVkVmFsdWVdLCB0eXBpbmdzIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFBsYWNlaG9sZGVyKSkge1xuICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZVBhcmFtKHBhcmFtU3RhcnRJbmRleC52YWx1ZSsrLCBjaHVuayksIHBhcmFtczogW2NodW5rXSwgdHlwaW5nczogW1wibm9uZVwiXSB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBTUUwuQWxpYXNlZCkgJiYgY2h1bmsuZmllbGRBbGlhcyAhPT0gdm9pZCAwKSB7XG4gICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjaHVuay5maWVsZEFsaWFzKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBTdWJxdWVyeSkpIHtcbiAgICAgICAgaWYgKGNodW5rLl8uaXNXaXRoKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVOYW1lKGNodW5rLl8uYWxpYXMpLCBwYXJhbXM6IFtdIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMoW1xuICAgICAgICAgIG5ldyBTdHJpbmdDaHVuayhcIihcIiksXG4gICAgICAgICAgY2h1bmsuXy5zcWwsXG4gICAgICAgICAgbmV3IFN0cmluZ0NodW5rKFwiKSBcIiksXG4gICAgICAgICAgbmV3IE5hbWUoY2h1bmsuXy5hbGlhcylcbiAgICAgICAgXSwgY29uZmlnKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1BnRW51bShjaHVuaykpIHtcbiAgICAgICAgaWYgKGNodW5rLnNjaGVtYSkge1xuICAgICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjaHVuay5zY2hlbWEpICsgXCIuXCIgKyBlc2NhcGVOYW1lKGNodW5rLmVudW1OYW1lKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlTmFtZShjaHVuay5lbnVtTmFtZSksIHBhcmFtczogW10gfTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1NRTFdyYXBwZXIoY2h1bmspKSB7XG4gICAgICAgIGlmIChjaHVuay5zaG91bGRPbWl0U1FMUGFyZW5zPy4oKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKFtjaHVuay5nZXRTUUwoKV0sIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMoW1xuICAgICAgICAgIG5ldyBTdHJpbmdDaHVuayhcIihcIiksXG4gICAgICAgICAgY2h1bmsuZ2V0U1FMKCksXG4gICAgICAgICAgbmV3IFN0cmluZ0NodW5rKFwiKVwiKVxuICAgICAgICBdLCBjb25maWcpO1xuICAgICAgfVxuICAgICAgaWYgKGlubGluZVBhcmFtcykge1xuICAgICAgICByZXR1cm4geyBzcWw6IHRoaXMubWFwSW5saW5lUGFyYW0oY2h1bmssIGNvbmZpZyksIHBhcmFtczogW10gfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlUGFyYW0ocGFyYW1TdGFydEluZGV4LnZhbHVlKyssIGNodW5rKSwgcGFyYW1zOiBbY2h1bmtdLCB0eXBpbmdzOiBbXCJub25lXCJdIH07XG4gICAgfSkpO1xuICB9XG4gIG1hcElubGluZVBhcmFtKGNodW5rLCB7IGVzY2FwZVN0cmluZyB9KSB7XG4gICAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIGNodW5rID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIGNodW5rLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBlc2NhcGVTdHJpbmcoY2h1bmspO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNodW5rID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBtYXBwZWRWYWx1ZUFzU3RyaW5nID0gY2h1bmsudG9TdHJpbmcoKTtcbiAgICAgIGlmIChtYXBwZWRWYWx1ZUFzU3RyaW5nID09PSBcIltvYmplY3QgT2JqZWN0XVwiKSB7XG4gICAgICAgIHJldHVybiBlc2NhcGVTdHJpbmcoSlNPTi5zdHJpbmdpZnkoY2h1bmspKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlc2NhcGVTdHJpbmcobWFwcGVkVmFsdWVBc1N0cmluZyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgcGFyYW0gdmFsdWU6IFwiICsgY2h1bmspO1xuICB9XG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBhcyhhbGlhcykge1xuICAgIGlmIChhbGlhcyA9PT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTUUwuQWxpYXNlZCh0aGlzLCBhbGlhcyk7XG4gIH1cbiAgbWFwV2l0aChkZWNvZGVyKSB7XG4gICAgdGhpcy5kZWNvZGVyID0gdHlwZW9mIGRlY29kZXIgPT09IFwiZnVuY3Rpb25cIiA/IHsgbWFwRnJvbURyaXZlclZhbHVlOiBkZWNvZGVyIH0gOiBkZWNvZGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGlubGluZVBhcmFtcygpIHtcbiAgICB0aGlzLnNob3VsZElubGluZVBhcmFtcyA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY29uZGl0aW9uYWxseSBpbmNsdWRlIGEgcGFydCBvZiB0aGUgcXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSBjb25kaXRpb24gLSBDb25kaXRpb24gdG8gY2hlY2tcbiAgICogQHJldHVybnMgaXRzZWxmIGlmIHRoZSBjb25kaXRpb24gaXMgYHRydWVgLCBvdGhlcndpc2UgYHVuZGVmaW5lZGBcbiAgICovXG4gIGlmKGNvbmRpdGlvbikge1xuICAgIHJldHVybiBjb25kaXRpb24gPyB0aGlzIDogdm9pZCAwO1xuICB9XG59XG5jbGFzcyBOYW1lIHtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiTmFtZVwiO1xuICBicmFuZDtcbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5hbWUodmFsdWUpIHtcbiAgcmV0dXJuIG5ldyBOYW1lKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGlzRHJpdmVyVmFsdWVFbmNvZGVyKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgXCJtYXBUb0RyaXZlclZhbHVlXCIgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLm1hcFRvRHJpdmVyVmFsdWUgPT09IFwiZnVuY3Rpb25cIjtcbn1cbmNvbnN0IG5vb3BEZWNvZGVyID0ge1xuICBtYXBGcm9tRHJpdmVyVmFsdWU6ICh2YWx1ZSkgPT4gdmFsdWVcbn07XG5jb25zdCBub29wRW5jb2RlciA9IHtcbiAgbWFwVG9Ecml2ZXJWYWx1ZTogKHZhbHVlKSA9PiB2YWx1ZVxufTtcbmNvbnN0IG5vb3BNYXBwZXIgPSB7XG4gIC4uLm5vb3BEZWNvZGVyLFxuICAuLi5ub29wRW5jb2RlclxufTtcbmNsYXNzIFBhcmFtIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFBhcmFtZXRlciB2YWx1ZVxuICAgKiBAcGFyYW0gZW5jb2RlciAtIEVuY29kZXIgdG8gY29udmVydCB0aGUgdmFsdWUgdG8gYSBkcml2ZXIgcGFyYW1ldGVyXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSwgZW5jb2RlciA9IG5vb3BFbmNvZGVyKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuZW5jb2RlciA9IGVuY29kZXI7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGFyYW1cIjtcbiAgYnJhbmQ7XG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xuICB9XG59XG5mdW5jdGlvbiBwYXJhbSh2YWx1ZSwgZW5jb2Rlcikge1xuICByZXR1cm4gbmV3IFBhcmFtKHZhbHVlLCBlbmNvZGVyKTtcbn1cbmZ1bmN0aW9uIHNxbChzdHJpbmdzLCAuLi5wYXJhbXMpIHtcbiAgY29uc3QgcXVlcnlDaHVua3MgPSBbXTtcbiAgaWYgKHBhcmFtcy5sZW5ndGggPiAwIHx8IHN0cmluZ3MubGVuZ3RoID4gMCAmJiBzdHJpbmdzWzBdICE9PSBcIlwiKSB7XG4gICAgcXVlcnlDaHVua3MucHVzaChuZXcgU3RyaW5nQ2h1bmsoc3RyaW5nc1swXSkpO1xuICB9XG4gIGZvciAoY29uc3QgW3BhcmFtSW5kZXgsIHBhcmFtMl0gb2YgcGFyYW1zLmVudHJpZXMoKSkge1xuICAgIHF1ZXJ5Q2h1bmtzLnB1c2gocGFyYW0yLCBuZXcgU3RyaW5nQ2h1bmsoc3RyaW5nc1twYXJhbUluZGV4ICsgMV0pKTtcbiAgfVxuICByZXR1cm4gbmV3IFNRTChxdWVyeUNodW5rcyk7XG59XG4oKHNxbDIpID0+IHtcbiAgZnVuY3Rpb24gZW1wdHkoKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW10pO1xuICB9XG4gIHNxbDIuZW1wdHkgPSBlbXB0eTtcbiAgZnVuY3Rpb24gZnJvbUxpc3QobGlzdCkge1xuICAgIHJldHVybiBuZXcgU1FMKGxpc3QpO1xuICB9XG4gIHNxbDIuZnJvbUxpc3QgPSBmcm9tTGlzdDtcbiAgZnVuY3Rpb24gcmF3KHN0cikge1xuICAgIHJldHVybiBuZXcgU1FMKFtuZXcgU3RyaW5nQ2h1bmsoc3RyKV0pO1xuICB9XG4gIHNxbDIucmF3ID0gcmF3O1xuICBmdW5jdGlvbiBqb2luKGNodW5rcywgc2VwYXJhdG9yKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChjb25zdCBbaSwgY2h1bmtdIG9mIGNodW5rcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChpID4gMCAmJiBzZXBhcmF0b3IgIT09IHZvaWQgMCkge1xuICAgICAgICByZXN1bHQucHVzaChzZXBhcmF0b3IpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goY2h1bmspO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNRTChyZXN1bHQpO1xuICB9XG4gIHNxbDIuam9pbiA9IGpvaW47XG4gIGZ1bmN0aW9uIGlkZW50aWZpZXIodmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IE5hbWUodmFsdWUpO1xuICB9XG4gIHNxbDIuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gIGZ1bmN0aW9uIHBsYWNlaG9sZGVyMihuYW1lMikge1xuICAgIHJldHVybiBuZXcgUGxhY2Vob2xkZXIobmFtZTIpO1xuICB9XG4gIHNxbDIucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjI7XG4gIGZ1bmN0aW9uIHBhcmFtMih2YWx1ZSwgZW5jb2Rlcikge1xuICAgIHJldHVybiBuZXcgUGFyYW0odmFsdWUsIGVuY29kZXIpO1xuICB9XG4gIHNxbDIucGFyYW0gPSBwYXJhbTI7XG59KShzcWwgfHwgKHNxbCA9IHt9KSk7XG4oKFNRTDIpID0+IHtcbiAgY2xhc3MgQWxpYXNlZCB7XG4gICAgY29uc3RydWN0b3Ioc3FsMiwgZmllbGRBbGlhcykge1xuICAgICAgdGhpcy5zcWwgPSBzcWwyO1xuICAgICAgdGhpcy5maWVsZEFsaWFzID0gZmllbGRBbGlhcztcbiAgICB9XG4gICAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMLkFsaWFzZWRcIjtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgaXNTZWxlY3Rpb25GaWVsZCA9IGZhbHNlO1xuICAgIGdldFNRTCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNxbDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGNsb25lKCkge1xuICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkKHRoaXMuc3FsLCB0aGlzLmZpZWxkQWxpYXMpO1xuICAgIH1cbiAgfVxuICBTUUwyLkFsaWFzZWQgPSBBbGlhc2VkO1xufSkoU1FMIHx8IChTUUwgPSB7fSkpO1xuY2xhc3MgUGxhY2Vob2xkZXIge1xuICBjb25zdHJ1Y3RvcihuYW1lMikge1xuICAgIHRoaXMubmFtZSA9IG5hbWUyO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBsYWNlaG9sZGVyXCI7XG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xuICB9XG59XG5mdW5jdGlvbiBwbGFjZWhvbGRlcihuYW1lMikge1xuICByZXR1cm4gbmV3IFBsYWNlaG9sZGVyKG5hbWUyKTtcbn1cbmZ1bmN0aW9uIGZpbGxQbGFjZWhvbGRlcnMocGFyYW1zLCB2YWx1ZXMpIHtcbiAgcmV0dXJuIHBhcmFtcy5tYXAoKHApID0+IHtcbiAgICBpZiAoaXMocCwgUGxhY2Vob2xkZXIpKSB7XG4gICAgICBpZiAoIShwLm5hbWUgaW4gdmFsdWVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHZhbHVlIGZvciBwbGFjZWhvbGRlciBcIiR7cC5uYW1lfVwiIHdhcyBwcm92aWRlZGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlc1twLm5hbWVdO1xuICAgIH1cbiAgICBpZiAoaXMocCwgUGFyYW0pICYmIGlzKHAudmFsdWUsIFBsYWNlaG9sZGVyKSkge1xuICAgICAgaWYgKCEocC52YWx1ZS5uYW1lIGluIHZhbHVlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB2YWx1ZSBmb3IgcGxhY2Vob2xkZXIgXCIke3AudmFsdWUubmFtZX1cIiB3YXMgcHJvdmlkZWRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwLmVuY29kZXIubWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZXNbcC52YWx1ZS5uYW1lXSk7XG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9KTtcbn1cbmNvbnN0IElzRHJpenpsZVZpZXcgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpJc0RyaXp6bGVWaWV3XCIpO1xuY2xhc3MgVmlldyB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlZpZXdcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbVmlld0Jhc2VDb25maWddO1xuICAvKiogQGludGVybmFsICovXG4gIFtJc0RyaXp6bGVWaWV3XSA9IHRydWU7XG4gIGNvbnN0cnVjdG9yKHsgbmFtZTogbmFtZTIsIHNjaGVtYSwgc2VsZWN0ZWRGaWVsZHMsIHF1ZXJ5IH0pIHtcbiAgICB0aGlzW1ZpZXdCYXNlQ29uZmlnXSA9IHtcbiAgICAgIG5hbWU6IG5hbWUyLFxuICAgICAgb3JpZ2luYWxOYW1lOiBuYW1lMixcbiAgICAgIHNjaGVtYSxcbiAgICAgIHNlbGVjdGVkRmllbGRzLFxuICAgICAgcXVlcnksXG4gICAgICBpc0V4aXN0aW5nOiAhcXVlcnksXG4gICAgICBpc0FsaWFzOiBmYWxzZVxuICAgIH07XG4gIH1cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzVmlldyh2aWV3KSB7XG4gIHJldHVybiB0eXBlb2YgdmlldyA9PT0gXCJvYmplY3RcIiAmJiB2aWV3ICE9PSBudWxsICYmIElzRHJpenpsZVZpZXcgaW4gdmlldztcbn1cbmZ1bmN0aW9uIGdldFZpZXdOYW1lKHZpZXcpIHtcbiAgcmV0dXJuIHZpZXdbVmlld0Jhc2VDb25maWddLm5hbWU7XG59XG5Db2x1bW4ucHJvdG90eXBlLmdldFNRTCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xufTtcblRhYmxlLnByb3RvdHlwZS5nZXRTUUwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbn07XG5TdWJxdWVyeS5wcm90b3R5cGUuZ2V0U1FMID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG59O1xuZXhwb3J0IHtcbiAgRmFrZVByaW1pdGl2ZVBhcmFtLFxuICBOYW1lLFxuICBQYXJhbSxcbiAgUGxhY2Vob2xkZXIsXG4gIFNRTCxcbiAgU3RyaW5nQ2h1bmssXG4gIFZpZXcsXG4gIGZpbGxQbGFjZWhvbGRlcnMsXG4gIGdldFZpZXdOYW1lLFxuICBpc0RyaXZlclZhbHVlRW5jb2RlcixcbiAgaXNTUUxXcmFwcGVyLFxuICBpc1ZpZXcsXG4gIG5hbWUsXG4gIG5vb3BEZWNvZGVyLFxuICBub29wRW5jb2RlcixcbiAgbm9vcE1hcHBlcixcbiAgcGFyYW0sXG4gIHBsYWNlaG9sZGVyLFxuICBzcWxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcWwuanMubWFwIiwKICAgICJpbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTUUwsIHNxbCB9IGZyb20gXCIuL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4vdmlldy1jb21tb24uanNcIjtcbmNsYXNzIENvbHVtbkFsaWFzUHJveHlIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IodGFibGUpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQ29sdW1uQWxpYXNQcm94eUhhbmRsZXJcIjtcbiAgZ2V0KGNvbHVtbk9iaiwgcHJvcCkge1xuICAgIGlmIChwcm9wID09PSBcInRhYmxlXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnRhYmxlO1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uT2JqW3Byb3BdO1xuICB9XG59XG5jbGFzcyBUYWJsZUFsaWFzUHJveHlIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IoYWxpYXMsIHJlcGxhY2VPcmlnaW5hbE5hbWUpIHtcbiAgICB0aGlzLmFsaWFzID0gYWxpYXM7XG4gICAgdGhpcy5yZXBsYWNlT3JpZ2luYWxOYW1lID0gcmVwbGFjZU9yaWdpbmFsTmFtZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJUYWJsZUFsaWFzUHJveHlIYW5kbGVyXCI7XG4gIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICBpZiAocHJvcCA9PT0gVGFibGUuU3ltYm9sLklzQWxpYXMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocHJvcCA9PT0gVGFibGUuU3ltYm9sLk5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmFsaWFzO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZXBsYWNlT3JpZ2luYWxOYW1lICYmIHByb3AgPT09IFRhYmxlLlN5bWJvbC5PcmlnaW5hbE5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmFsaWFzO1xuICAgIH1cbiAgICBpZiAocHJvcCA9PT0gVmlld0Jhc2VDb25maWcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRhcmdldFtWaWV3QmFzZUNvbmZpZ10sXG4gICAgICAgIG5hbWU6IHRoaXMuYWxpYXMsXG4gICAgICAgIGlzQWxpYXM6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChwcm9wID09PSBUYWJsZS5TeW1ib2wuQ29sdW1ucykge1xuICAgICAgY29uc3QgY29sdW1ucyA9IHRhcmdldFtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG4gICAgICBpZiAoIWNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgICB9XG4gICAgICBjb25zdCBwcm94aWVkQ29sdW1ucyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMoY29sdW1ucykubWFwKChrZXkpID0+IHtcbiAgICAgICAgcHJveGllZENvbHVtbnNba2V5XSA9IG5ldyBQcm94eShcbiAgICAgICAgICBjb2x1bW5zW2tleV0sXG4gICAgICAgICAgbmV3IENvbHVtbkFsaWFzUHJveHlIYW5kbGVyKG5ldyBQcm94eSh0YXJnZXQsIHRoaXMpKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcHJveGllZENvbHVtbnM7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0W3Byb3BdO1xuICAgIGlmIChpcyh2YWx1ZSwgQ29sdW1uKSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm94eSh2YWx1ZSwgbmV3IENvbHVtbkFsaWFzUHJveHlIYW5kbGVyKG5ldyBQcm94eSh0YXJnZXQsIHRoaXMpKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuY2xhc3MgUmVsYXRpb25UYWJsZUFsaWFzUHJveHlIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IoYWxpYXMpIHtcbiAgICB0aGlzLmFsaWFzID0gYWxpYXM7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUmVsYXRpb25UYWJsZUFsaWFzUHJveHlIYW5kbGVyXCI7XG4gIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICBpZiAocHJvcCA9PT0gXCJzb3VyY2VUYWJsZVwiKSB7XG4gICAgICByZXR1cm4gYWxpYXNlZFRhYmxlKHRhcmdldC5zb3VyY2VUYWJsZSwgdGhpcy5hbGlhcyk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gIH1cbn1cbmZ1bmN0aW9uIGFsaWFzZWRUYWJsZSh0YWJsZSwgdGFibGVBbGlhcykge1xuICByZXR1cm4gbmV3IFByb3h5KHRhYmxlLCBuZXcgVGFibGVBbGlhc1Byb3h5SGFuZGxlcih0YWJsZUFsaWFzLCBmYWxzZSkpO1xufVxuZnVuY3Rpb24gYWxpYXNlZFJlbGF0aW9uKHJlbGF0aW9uLCB0YWJsZUFsaWFzKSB7XG4gIHJldHVybiBuZXcgUHJveHkocmVsYXRpb24sIG5ldyBSZWxhdGlvblRhYmxlQWxpYXNQcm94eUhhbmRsZXIodGFibGVBbGlhcykpO1xufVxuZnVuY3Rpb24gYWxpYXNlZFRhYmxlQ29sdW1uKGNvbHVtbiwgdGFibGVBbGlhcykge1xuICByZXR1cm4gbmV3IFByb3h5KFxuICAgIGNvbHVtbixcbiAgICBuZXcgQ29sdW1uQWxpYXNQcm94eUhhbmRsZXIobmV3IFByb3h5KGNvbHVtbi50YWJsZSwgbmV3IFRhYmxlQWxpYXNQcm94eUhhbmRsZXIodGFibGVBbGlhcywgZmFsc2UpKSlcbiAgKTtcbn1cbmZ1bmN0aW9uIG1hcENvbHVtbnNJbkFsaWFzZWRTUUxUb0FsaWFzKHF1ZXJ5LCBhbGlhcykge1xuICByZXR1cm4gbmV3IFNRTC5BbGlhc2VkKG1hcENvbHVtbnNJblNRTFRvQWxpYXMocXVlcnkuc3FsLCBhbGlhcyksIHF1ZXJ5LmZpZWxkQWxpYXMpO1xufVxuZnVuY3Rpb24gbWFwQ29sdW1uc0luU1FMVG9BbGlhcyhxdWVyeSwgYWxpYXMpIHtcbiAgcmV0dXJuIHNxbC5qb2luKHF1ZXJ5LnF1ZXJ5Q2h1bmtzLm1hcCgoYykgPT4ge1xuICAgIGlmIChpcyhjLCBDb2x1bW4pKSB7XG4gICAgICByZXR1cm4gYWxpYXNlZFRhYmxlQ29sdW1uKGMsIGFsaWFzKTtcbiAgICB9XG4gICAgaWYgKGlzKGMsIFNRTCkpIHtcbiAgICAgIHJldHVybiBtYXBDb2x1bW5zSW5TUUxUb0FsaWFzKGMsIGFsaWFzKTtcbiAgICB9XG4gICAgaWYgKGlzKGMsIFNRTC5BbGlhc2VkKSkge1xuICAgICAgcmV0dXJuIG1hcENvbHVtbnNJbkFsaWFzZWRTUUxUb0FsaWFzKGMsIGFsaWFzKTtcbiAgICB9XG4gICAgcmV0dXJuIGM7XG4gIH0pKTtcbn1cbmV4cG9ydCB7XG4gIENvbHVtbkFsaWFzUHJveHlIYW5kbGVyLFxuICBSZWxhdGlvblRhYmxlQWxpYXNQcm94eUhhbmRsZXIsXG4gIFRhYmxlQWxpYXNQcm94eUhhbmRsZXIsXG4gIGFsaWFzZWRSZWxhdGlvbixcbiAgYWxpYXNlZFRhYmxlLFxuICBhbGlhc2VkVGFibGVDb2x1bW4sXG4gIG1hcENvbHVtbnNJbkFsaWFzZWRTUUxUb0FsaWFzLFxuICBtYXBDb2x1bW5zSW5TUUxUb0FsaWFzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWxpYXMuanMubWFwIiwKICAgICJpbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGlzIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBQYXJhbSwgU1FMLCBWaWV3IH0gZnJvbSBcIi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgZ2V0VGFibGVOYW1lLCBUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuL3ZpZXctY29tbW9uLmpzXCI7XG5mdW5jdGlvbiBtYXBSZXN1bHRSb3coY29sdW1ucywgcm93LCBqb2luc05vdE51bGxhYmxlTWFwKSB7XG4gIGNvbnN0IG51bGxpZnlNYXAgPSB7fTtcbiAgY29uc3QgcmVzdWx0ID0gY29sdW1ucy5yZWR1Y2UoXG4gICAgKHJlc3VsdDIsIHsgcGF0aCwgZmllbGQgfSwgY29sdW1uSW5kZXgpID0+IHtcbiAgICAgIGxldCBkZWNvZGVyO1xuICAgICAgaWYgKGlzKGZpZWxkLCBDb2x1bW4pKSB7XG4gICAgICAgIGRlY29kZXIgPSBmaWVsZDtcbiAgICAgIH0gZWxzZSBpZiAoaXMoZmllbGQsIFNRTCkpIHtcbiAgICAgICAgZGVjb2RlciA9IGZpZWxkLmRlY29kZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvZGVyID0gZmllbGQuc3FsLmRlY29kZXI7XG4gICAgICB9XG4gICAgICBsZXQgbm9kZSA9IHJlc3VsdDI7XG4gICAgICBmb3IgKGNvbnN0IFtwYXRoQ2h1bmtJbmRleCwgcGF0aENodW5rXSBvZiBwYXRoLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAocGF0aENodW5rSW5kZXggPCBwYXRoLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBpZiAoIShwYXRoQ2h1bmsgaW4gbm9kZSkpIHtcbiAgICAgICAgICAgIG5vZGVbcGF0aENodW5rXSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2RlID0gbm9kZVtwYXRoQ2h1bmtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gcm93W2NvbHVtbkluZGV4XTtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5vZGVbcGF0aENodW5rXSA9IHJhd1ZhbHVlID09PSBudWxsID8gbnVsbCA6IGRlY29kZXIubWFwRnJvbURyaXZlclZhbHVlKHJhd1ZhbHVlKTtcbiAgICAgICAgICBpZiAoam9pbnNOb3ROdWxsYWJsZU1hcCAmJiBpcyhmaWVsZCwgQ29sdW1uKSAmJiBwYXRoLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0TmFtZSA9IHBhdGhbMF07XG4gICAgICAgICAgICBpZiAoIShvYmplY3ROYW1lIGluIG51bGxpZnlNYXApKSB7XG4gICAgICAgICAgICAgIG51bGxpZnlNYXBbb2JqZWN0TmFtZV0gPSB2YWx1ZSA9PT0gbnVsbCA/IGdldFRhYmxlTmFtZShmaWVsZC50YWJsZSkgOiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG51bGxpZnlNYXBbb2JqZWN0TmFtZV0gPT09IFwic3RyaW5nXCIgJiYgbnVsbGlmeU1hcFtvYmplY3ROYW1lXSAhPT0gZ2V0VGFibGVOYW1lKGZpZWxkLnRhYmxlKSkge1xuICAgICAgICAgICAgICBudWxsaWZ5TWFwW29iamVjdE5hbWVdID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0MjtcbiAgICB9LFxuICAgIHt9XG4gICk7XG4gIGlmIChqb2luc05vdE51bGxhYmxlTWFwICYmIE9iamVjdC5rZXlzKG51bGxpZnlNYXApLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IFtvYmplY3ROYW1lLCB0YWJsZU5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKG51bGxpZnlNYXApKSB7XG4gICAgICBpZiAodHlwZW9mIHRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiAham9pbnNOb3ROdWxsYWJsZU1hcFt0YWJsZU5hbWVdKSB7XG4gICAgICAgIHJlc3VsdFtvYmplY3ROYW1lXSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBvcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkcywgcGF0aFByZWZpeCkge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZmllbGRzKS5yZWR1Y2UoKHJlc3VsdCwgW25hbWUsIGZpZWxkXSkgPT4ge1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY29uc3QgbmV3UGF0aCA9IHBhdGhQcmVmaXggPyBbLi4ucGF0aFByZWZpeCwgbmFtZV0gOiBbbmFtZV07XG4gICAgaWYgKGlzKGZpZWxkLCBDb2x1bW4pIHx8IGlzKGZpZWxkLCBTUUwpIHx8IGlzKGZpZWxkLCBTUUwuQWxpYXNlZCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHsgcGF0aDogbmV3UGF0aCwgZmllbGQgfSk7XG4gICAgfSBlbHNlIGlmIChpcyhmaWVsZCwgVGFibGUpKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5vcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSwgbmV3UGF0aCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaCguLi5vcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkLCBuZXdQYXRoKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIFtdKTtcbn1cbmZ1bmN0aW9uIGhhdmVTYW1lS2V5cyhsZWZ0LCByaWdodCkge1xuICBjb25zdCBsZWZ0S2V5cyA9IE9iamVjdC5rZXlzKGxlZnQpO1xuICBjb25zdCByaWdodEtleXMgPSBPYmplY3Qua2V5cyhyaWdodCk7XG4gIGlmIChsZWZ0S2V5cy5sZW5ndGggIT09IHJpZ2h0S2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChjb25zdCBbaW5kZXgsIGtleV0gb2YgbGVmdEtleXMuZW50cmllcygpKSB7XG4gICAgaWYgKGtleSAhPT0gcmlnaHRLZXlzW2luZGV4XSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIG1hcFVwZGF0ZVNldCh0YWJsZSwgdmFsdWVzKSB7XG4gIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh2YWx1ZXMpLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdm9pZCAwKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGlmIChpcyh2YWx1ZSwgU1FMKSB8fCBpcyh2YWx1ZSwgQ29sdW1uKSkge1xuICAgICAgcmV0dXJuIFtrZXksIHZhbHVlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtrZXksIG5ldyBQYXJhbSh2YWx1ZSwgdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdW2tleV0pXTtcbiAgICB9XG4gIH0pO1xuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyB2YWx1ZXMgdG8gc2V0XCIpO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcyk7XG59XG5mdW5jdGlvbiBhcHBseU1peGlucyhiYXNlQ2xhc3MsIGV4dGVuZGVkQ2xhc3Nlcykge1xuICBmb3IgKGNvbnN0IGV4dGVuZGVkQ2xhc3Mgb2YgZXh0ZW5kZWRDbGFzc2VzKSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGV4dGVuZGVkQ2xhc3MucHJvdG90eXBlKSkge1xuICAgICAgaWYgKG5hbWUgPT09IFwiY29uc3RydWN0b3JcIikgY29udGludWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgIGJhc2VDbGFzcy5wcm90b3R5cGUsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZXh0ZW5kZWRDbGFzcy5wcm90b3R5cGUsIG5hbWUpIHx8IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZ2V0VGFibGVDb2x1bW5zKHRhYmxlKSB7XG4gIHJldHVybiB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG59XG5mdW5jdGlvbiBnZXRWaWV3U2VsZWN0ZWRGaWVsZHModmlldykge1xuICByZXR1cm4gdmlld1tWaWV3QmFzZUNvbmZpZ10uc2VsZWN0ZWRGaWVsZHM7XG59XG5mdW5jdGlvbiBnZXRUYWJsZUxpa2VOYW1lKHRhYmxlKSB7XG4gIHJldHVybiBpcyh0YWJsZSwgU3VicXVlcnkpID8gdGFibGUuXy5hbGlhcyA6IGlzKHRhYmxlLCBWaWV3KSA/IHRhYmxlW1ZpZXdCYXNlQ29uZmlnXS5uYW1lIDogaXModGFibGUsIFNRTCkgPyB2b2lkIDAgOiB0YWJsZVtUYWJsZS5TeW1ib2wuSXNBbGlhc10gPyB0YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV0gOiB0YWJsZVtUYWJsZS5TeW1ib2wuQmFzZU5hbWVdO1xufVxuZnVuY3Rpb24gZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyhhLCBiKSB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogdHlwZW9mIGEgPT09IFwic3RyaW5nXCIgJiYgYS5sZW5ndGggPiAwID8gYSA6IFwiXCIsXG4gICAgY29uZmlnOiB0eXBlb2YgYSA9PT0gXCJvYmplY3RcIiA/IGEgOiBiXG4gIH07XG59XG5jb25zdCBfID0ge307XG5jb25zdCBfXyA9IHt9O1xuZnVuY3Rpb24gaXNDb25maWcoZGF0YSkge1xuICBpZiAodHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGF0YS5jb25zdHJ1Y3Rvci5uYW1lICE9PSBcIk9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gIGlmIChcImxvZ2dlclwiIGluIGRhdGEpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGRhdGFbXCJsb2dnZXJcIl07XG4gICAgaWYgKHR5cGUgIT09IFwiYm9vbGVhblwiICYmICh0eXBlICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBkYXRhW1wibG9nZ2VyXCJdW1wibG9nUXVlcnlcIl0gIT09IFwiZnVuY3Rpb25cIikgJiYgdHlwZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChcInNjaGVtYVwiIGluIGRhdGEpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGRhdGFbXCJzY2hlbWFcIl07XG4gICAgaWYgKHR5cGUgIT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChcImNhc2luZ1wiIGluIGRhdGEpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGRhdGFbXCJjYXNpbmdcIl07XG4gICAgaWYgKHR5cGUgIT09IFwic3RyaW5nXCIgJiYgdHlwZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChcIm1vZGVcIiBpbiBkYXRhKSB7XG4gICAgaWYgKGRhdGFbXCJtb2RlXCJdICE9PSBcImRlZmF1bHRcIiB8fCBkYXRhW1wibW9kZVwiXSAhPT0gXCJwbGFuZXRzY2FsZVwiIHx8IGRhdGFbXCJtb2RlXCJdICE9PSB2b2lkIDApIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoXCJjb25uZWN0aW9uXCIgaW4gZGF0YSkge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgZGF0YVtcImNvbm5lY3Rpb25cIl07XG4gICAgaWYgKHR5cGUgIT09IFwic3RyaW5nXCIgJiYgdHlwZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKFwiY2xpZW50XCIgaW4gZGF0YSkge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgZGF0YVtcImNsaWVudFwiXTtcbiAgICBpZiAodHlwZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlICE9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5jb25zdCB0ZXh0RGVjb2RlciA9IHR5cGVvZiBUZXh0RGVjb2RlciA9PT0gXCJ1bmRlZmluZWRcIiA/IG51bGwgOiBuZXcgVGV4dERlY29kZXIoKTtcbmV4cG9ydCB7XG4gIGFwcGx5TWl4aW5zLFxuICBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnLFxuICBnZXRUYWJsZUNvbHVtbnMsXG4gIGdldFRhYmxlTGlrZU5hbWUsXG4gIGdldFZpZXdTZWxlY3RlZEZpZWxkcyxcbiAgaGF2ZVNhbWVLZXlzLFxuICBpc0NvbmZpZyxcbiAgbWFwUmVzdWx0Um93LFxuICBtYXBVcGRhdGVTZXQsXG4gIG9yZGVyU2VsZWN0ZWRGaWVsZHMsXG4gIHRleHREZWNvZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGVOYW1lIH0gZnJvbSBcIi4uL3RhYmxlLnV0aWxzLmpzXCI7XG5jbGFzcyBGb3JlaWduS2V5QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUZvcmVpZ25LZXlCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcmVmZXJlbmNlO1xuICAvKiogQGludGVybmFsICovXG4gIF9vblVwZGF0ZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfb25EZWxldGU7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZywgYWN0aW9ucykge1xuICAgIHRoaXMucmVmZXJlbmNlID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyBuYW1lLCBjb2x1bW5zLCBmb3JlaWduQ29sdW1ucyB9ID0gY29uZmlnKCk7XG4gICAgICByZXR1cm4geyBuYW1lLCBjb2x1bW5zLCBmb3JlaWduVGFibGU6IGZvcmVpZ25Db2x1bW5zWzBdLnRhYmxlLCBmb3JlaWduQ29sdW1ucyB9O1xuICAgIH07XG4gICAgaWYgKGFjdGlvbnMpIHtcbiAgICAgIHRoaXMuX29uVXBkYXRlID0gYWN0aW9ucy5vblVwZGF0ZTtcbiAgICAgIHRoaXMuX29uRGVsZXRlID0gYWN0aW9ucy5vbkRlbGV0ZTtcbiAgICB9XG4gIH1cbiAgb25VcGRhdGUoYWN0aW9uKSB7XG4gICAgdGhpcy5fb25VcGRhdGUgPSBhY3Rpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb25EZWxldGUoYWN0aW9uKSB7XG4gICAgdGhpcy5fb25EZWxldGUgPSBhY3Rpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgRm9yZWlnbktleSh0YWJsZSwgdGhpcyk7XG4gIH1cbn1cbmNsYXNzIEZvcmVpZ25LZXkge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgYnVpbGRlcikge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnJlZmVyZW5jZSA9IGJ1aWxkZXIucmVmZXJlbmNlO1xuICAgIHRoaXMub25VcGRhdGUgPSBidWlsZGVyLl9vblVwZGF0ZTtcbiAgICB0aGlzLm9uRGVsZXRlID0gYnVpbGRlci5fb25EZWxldGU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlRm9yZWlnbktleVwiO1xuICByZWZlcmVuY2U7XG4gIG9uVXBkYXRlO1xuICBvbkRlbGV0ZTtcbiAgZ2V0TmFtZSgpIHtcbiAgICBjb25zdCB7IG5hbWUsIGNvbHVtbnMsIGZvcmVpZ25Db2x1bW5zIH0gPSB0aGlzLnJlZmVyZW5jZSgpO1xuICAgIGNvbnN0IGNvbHVtbk5hbWVzID0gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpO1xuICAgIGNvbnN0IGZvcmVpZ25Db2x1bW5OYW1lcyA9IGZvcmVpZ25Db2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSk7XG4gICAgY29uc3QgY2h1bmtzID0gW1xuICAgICAgdGhpcy50YWJsZVtUYWJsZU5hbWVdLFxuICAgICAgLi4uY29sdW1uTmFtZXMsXG4gICAgICBmb3JlaWduQ29sdW1uc1swXS50YWJsZVtUYWJsZU5hbWVdLFxuICAgICAgLi4uZm9yZWlnbkNvbHVtbk5hbWVzXG4gICAgXTtcbiAgICByZXR1cm4gbmFtZSA/PyBgJHtjaHVua3Muam9pbihcIl9cIil9X2ZrYDtcbiAgfVxufVxuZnVuY3Rpb24gZm9yZWlnbktleShjb25maWcpIHtcbiAgZnVuY3Rpb24gbWFwcGVkQ29uZmlnKCkge1xuICAgIGlmICh0eXBlb2YgY29uZmlnID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgY29sdW1ucywgZm9yZWlnbkNvbHVtbnMgfSA9IGNvbmZpZygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgY29sdW1ucyxcbiAgICAgICAgZm9yZWlnbkNvbHVtbnNcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cbiAgcmV0dXJuIG5ldyBGb3JlaWduS2V5QnVpbGRlcihtYXBwZWRDb25maWcpO1xufVxuZXhwb3J0IHtcbiAgRm9yZWlnbktleSxcbiAgRm9yZWlnbktleUJ1aWxkZXIsXG4gIGZvcmVpZ25LZXlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb3JlaWduLWtleXMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGVOYW1lIH0gZnJvbSBcIi4uL3RhYmxlLnV0aWxzLmpzXCI7XG5mdW5jdGlvbiB1bmlxdWVLZXlOYW1lKHRhYmxlLCBjb2x1bW5zKSB7XG4gIHJldHVybiBgJHt0YWJsZVtUYWJsZU5hbWVdfV8ke2NvbHVtbnMuam9pbihcIl9cIil9X3VuaXF1ZWA7XG59XG5mdW5jdGlvbiB1bmlxdWUobmFtZSkge1xuICByZXR1cm4gbmV3IFVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXIobmFtZSk7XG59XG5jbGFzcyBVbmlxdWVDb25zdHJhaW50QnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKGNvbHVtbnMsIG5hbWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVW5pcXVlQ29uc3RyYWludEJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb2x1bW5zO1xuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50KHRhYmxlLCB0aGlzLmNvbHVtbnMsIHRoaXMubmFtZSk7XG4gIH1cbn1cbmNsYXNzIFVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbmFtZTtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cbiAgb24oLi4uY29sdW1ucykge1xuICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIoY29sdW1ucywgdGhpcy5uYW1lKTtcbiAgfVxufVxuY2xhc3MgVW5pcXVlQ29uc3RyYWludCB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb2x1bW5zLCBuYW1lKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gICAgdGhpcy5uYW1lID0gbmFtZSA/PyB1bmlxdWVLZXlOYW1lKHRoaXMudGFibGUsIHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpKTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVVbmlxdWVDb25zdHJhaW50XCI7XG4gIGNvbHVtbnM7XG4gIG5hbWU7XG4gIGdldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgVW5pcXVlQ29uc3RyYWludCxcbiAgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIsXG4gIFVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXIsXG4gIHVuaXF1ZSxcbiAgdW5pcXVlS2V5TmFtZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuaXF1ZS1jb25zdHJhaW50LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuLi8uLi9jb2x1bW4tYnVpbGRlci5qc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uLy4uL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IEZvcmVpZ25LZXlCdWlsZGVyIH0gZnJvbSBcIi4uL2ZvcmVpZ24ta2V5cy5qc1wiO1xuaW1wb3J0IHsgdW5pcXVlS2V5TmFtZSB9IGZyb20gXCIuLi91bmlxdWUtY29uc3RyYWludC5qc1wiO1xuY2xhc3MgU1FMaXRlQ29sdW1uQnVpbGRlciBleHRlbmRzIENvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVDb2x1bW5CdWlsZGVyXCI7XG4gIGZvcmVpZ25LZXlDb25maWdzID0gW107XG4gIHJlZmVyZW5jZXMocmVmLCBhY3Rpb25zID0ge30pIHtcbiAgICB0aGlzLmZvcmVpZ25LZXlDb25maWdzLnB1c2goeyByZWYsIGFjdGlvbnMgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgdW5pcXVlKG5hbWUpIHtcbiAgICB0aGlzLmNvbmZpZy5pc1VuaXF1ZSA9IHRydWU7XG4gICAgdGhpcy5jb25maWcudW5pcXVlTmFtZSA9IG5hbWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2VuZXJhdGVkQWx3YXlzQXMoYXMsIGNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZCA9IHtcbiAgICAgIGFzLFxuICAgICAgdHlwZTogXCJhbHdheXNcIixcbiAgICAgIG1vZGU6IGNvbmZpZz8ubW9kZSA/PyBcInZpcnR1YWxcIlxuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZEZvcmVpZ25LZXlzKGNvbHVtbiwgdGFibGUpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JlaWduS2V5Q29uZmlncy5tYXAoKHsgcmVmLCBhY3Rpb25zIH0pID0+IHtcbiAgICAgIHJldHVybiAoKHJlZjIsIGFjdGlvbnMyKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgRm9yZWlnbktleUJ1aWxkZXIoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZvcmVpZ25Db2x1bW4gPSByZWYyKCk7XG4gICAgICAgICAgcmV0dXJuIHsgY29sdW1uczogW2NvbHVtbl0sIGZvcmVpZ25Db2x1bW5zOiBbZm9yZWlnbkNvbHVtbl0gfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChhY3Rpb25zMi5vblVwZGF0ZSkge1xuICAgICAgICAgIGJ1aWxkZXIub25VcGRhdGUoYWN0aW9uczIub25VcGRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhY3Rpb25zMi5vbkRlbGV0ZSkge1xuICAgICAgICAgIGJ1aWxkZXIub25EZWxldGUoYWN0aW9uczIub25EZWxldGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKHRhYmxlKTtcbiAgICAgIH0pKHJlZiwgYWN0aW9ucyk7XG4gICAgfSk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUNvbHVtbiBleHRlbmRzIENvbHVtbiB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICBpZiAoIWNvbmZpZy51bmlxdWVOYW1lKSB7XG4gICAgICBjb25maWcudW5pcXVlTmFtZSA9IHVuaXF1ZUtleU5hbWUodGFibGUsIFtjb25maWcubmFtZV0pO1xuICAgIH1cbiAgICBzdXBlcih0YWJsZSwgY29uZmlnKTtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQ29sdW1uXCI7XG59XG5leHBvcnQge1xuICBTUUxpdGVDb2x1bW4sXG4gIFNRTGl0ZUNvbHVtbkJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21tb24uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29sdW1uTmFtZUFuZENvbmZpZywgdGV4dERlY29kZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiwgU1FMaXRlQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgU1FMaXRlQmlnSW50QnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCaWdJbnRCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcImJpZ2ludFwiLCBcIlNRTGl0ZUJpZ0ludFwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCaWdJbnQodGFibGUsIHRoaXMuY29uZmlnKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQmlnSW50IGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmlnSW50XCI7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwiYmxvYlwiO1xuICB9XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiICYmIEJ1ZmZlci5mcm9tKSB7XG4gICAgICBjb25zdCBidWYgPSBCdWZmZXIuaXNCdWZmZXIodmFsdWUpID8gdmFsdWUgOiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyID8gQnVmZmVyLmZyb20odmFsdWUpIDogdmFsdWUuYnVmZmVyID8gQnVmZmVyLmZyb20odmFsdWUuYnVmZmVyLCB2YWx1ZS5ieXRlT2Zmc2V0LCB2YWx1ZS5ieXRlTGVuZ3RoKSA6IEJ1ZmZlci5mcm9tKHZhbHVlKTtcbiAgICAgIHJldHVybiBCaWdJbnQoYnVmLnRvU3RyaW5nKFwidXRmOFwiKSk7XG4gICAgfVxuICAgIHJldHVybiBCaWdJbnQodGV4dERlY29kZXIuZGVjb2RlKHZhbHVlKSk7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZS50b1N0cmluZygpKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQmxvYkpzb25CdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJsb2JKc29uQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJqc29uXCIsIFwiU1FMaXRlQmxvYkpzb25cIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQmxvYkpzb24oXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQmxvYkpzb24gZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCbG9iSnNvblwiO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcImJsb2JcIjtcbiAgfVxuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBCdWZmZXIuZnJvbSkge1xuICAgICAgY29uc3QgYnVmID0gQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSA/IHZhbHVlIDogdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciA/IEJ1ZmZlci5mcm9tKHZhbHVlKSA6IHZhbHVlLmJ1ZmZlciA/IEJ1ZmZlci5mcm9tKHZhbHVlLmJ1ZmZlciwgdmFsdWUuYnl0ZU9mZnNldCwgdmFsdWUuYnl0ZUxlbmd0aCkgOiBCdWZmZXIuZnJvbSh2YWx1ZSk7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShidWYudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dERlY29kZXIuZGVjb2RlKHZhbHVlKSk7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVCbG9iQnVmZmVyQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCbG9iQnVmZmVyQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJidWZmZXJcIiwgXCJTUUxpdGVCbG9iQnVmZmVyXCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJsb2JCdWZmZXIodGFibGUsIHRoaXMuY29uZmlnKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQmxvYkJ1ZmZlciBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJsb2JCdWZmZXJcIjtcbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlKTtcbiAgfVxuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcImJsb2JcIjtcbiAgfVxufVxuZnVuY3Rpb24gYmxvYihhLCBiKSB7XG4gIGNvbnN0IHsgbmFtZSwgY29uZmlnIH0gPSBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnKGEsIGIpO1xuICBpZiAoY29uZmlnPy5tb2RlID09PSBcImpzb25cIikge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQmxvYkpzb25CdWlsZGVyKG5hbWUpO1xuICB9XG4gIGlmIChjb25maWc/Lm1vZGUgPT09IFwiYmlnaW50XCIpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJpZ0ludEJ1aWxkZXIobmFtZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTUUxpdGVCbG9iQnVmZmVyQnVpbGRlcihuYW1lKTtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZUJpZ0ludCxcbiAgU1FMaXRlQmlnSW50QnVpbGRlcixcbiAgU1FMaXRlQmxvYkJ1ZmZlcixcbiAgU1FMaXRlQmxvYkJ1ZmZlckJ1aWxkZXIsXG4gIFNRTGl0ZUJsb2JKc29uLFxuICBTUUxpdGVCbG9iSnNvbkJ1aWxkZXIsXG4gIGJsb2Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ibG9iLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWVBbmRDb25maWcgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiwgU1FMaXRlQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgU1FMaXRlQ3VzdG9tQ29sdW1uQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVDdXN0b21Db2x1bW5CdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGZpZWxkQ29uZmlnLCBjdXN0b21UeXBlUGFyYW1zKSB7XG4gICAgc3VwZXIobmFtZSwgXCJjdXN0b21cIiwgXCJTUUxpdGVDdXN0b21Db2x1bW5cIik7XG4gICAgdGhpcy5jb25maWcuZmllbGRDb25maWcgPSBmaWVsZENvbmZpZztcbiAgICB0aGlzLmNvbmZpZy5jdXN0b21UeXBlUGFyYW1zID0gY3VzdG9tVHlwZVBhcmFtcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVDdXN0b21Db2x1bW4oXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQ3VzdG9tQ29sdW1uIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQ3VzdG9tQ29sdW1uXCI7XG4gIHNxbE5hbWU7XG4gIG1hcFRvO1xuICBtYXBGcm9tO1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gICAgdGhpcy5zcWxOYW1lID0gY29uZmlnLmN1c3RvbVR5cGVQYXJhbXMuZGF0YVR5cGUoY29uZmlnLmZpZWxkQ29uZmlnKTtcbiAgICB0aGlzLm1hcFRvID0gY29uZmlnLmN1c3RvbVR5cGVQYXJhbXMudG9Ecml2ZXI7XG4gICAgdGhpcy5tYXBGcm9tID0gY29uZmlnLmN1c3RvbVR5cGVQYXJhbXMuZnJvbURyaXZlcjtcbiAgfVxuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnNxbE5hbWU7XG4gIH1cbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLm1hcEZyb20gPT09IFwiZnVuY3Rpb25cIiA/IHRoaXMubWFwRnJvbSh2YWx1ZSkgOiB2YWx1ZTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLm1hcFRvID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzLm1hcFRvKHZhbHVlKSA6IHZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBjdXN0b21UeXBlKGN1c3RvbVR5cGVQYXJhbXMpIHtcbiAgcmV0dXJuIChhLCBiKSA9PiB7XG4gICAgY29uc3QgeyBuYW1lLCBjb25maWcgfSA9IGdldENvbHVtbk5hbWVBbmRDb25maWcoYSwgYik7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVDdXN0b21Db2x1bW5CdWlsZGVyKFxuICAgICAgbmFtZSxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGN1c3RvbVR5cGVQYXJhbXNcbiAgICApO1xuICB9O1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlQ3VzdG9tQ29sdW1uLFxuICBTUUxpdGVDdXN0b21Db2x1bW5CdWlsZGVyLFxuICBjdXN0b21UeXBlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3VzdG9tLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IHNxbCB9IGZyb20gXCIuLi8uLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4sIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFNRTGl0ZUJhc2VJbnRlZ2VyQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgZGF0YVR5cGUsIGNvbHVtblR5cGUpIHtcbiAgICBzdXBlcihuYW1lLCBkYXRhVHlwZSwgY29sdW1uVHlwZSk7XG4gICAgdGhpcy5jb25maWcuYXV0b0luY3JlbWVudCA9IGZhbHNlO1xuICB9XG4gIHByaW1hcnlLZXkoY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZz8uYXV0b0luY3JlbWVudCkge1xuICAgICAgdGhpcy5jb25maWcuYXV0b0luY3JlbWVudCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLmhhc0RlZmF1bHQgPSB0cnVlO1xuICAgIHJldHVybiBzdXBlci5wcmltYXJ5S2V5KCk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJhc2VJbnRlZ2VyIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmFzZUludGVnZXJcIjtcbiAgYXV0b0luY3JlbWVudCA9IHRoaXMuY29uZmlnLmF1dG9JbmNyZW1lbnQ7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwiaW50ZWdlclwiO1xuICB9XG59XG5jbGFzcyBTUUxpdGVJbnRlZ2VyQnVpbGRlciBleHRlbmRzIFNRTGl0ZUJhc2VJbnRlZ2VyQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUludGVnZXJCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcIm51bWJlclwiLCBcIlNRTGl0ZUludGVnZXJcIik7XG4gIH1cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUludGVnZXIoXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlSW50ZWdlciBleHRlbmRzIFNRTGl0ZUJhc2VJbnRlZ2VyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW50ZWdlclwiO1xufVxuY2xhc3MgU1FMaXRlVGltZXN0YW1wQnVpbGRlciBleHRlbmRzIFNRTGl0ZUJhc2VJbnRlZ2VyQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRpbWVzdGFtcEJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgbW9kZSkge1xuICAgIHN1cGVyKG5hbWUsIFwiZGF0ZVwiLCBcIlNRTGl0ZVRpbWVzdGFtcFwiKTtcbiAgICB0aGlzLmNvbmZpZy5tb2RlID0gbW9kZTtcbiAgfVxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBkZWZhdWx0KClgIHdpdGggeW91ciBvd24gZXhwcmVzc2lvbiBpbnN0ZWFkLlxuICAgKlxuICAgKiBBZGRzIGBERUZBVUxUIChjYXN0KChqdWxpYW5kYXkoJ25vdycpIC0gMjQ0MDU4Ny41KSo4NjQwMDAwMCBhcyBpbnRlZ2VyKSlgIHRvIHRoZSBjb2x1bW4sIHdoaWNoIGlzIHRoZSBjdXJyZW50IGVwb2NoIHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICBkZWZhdWx0Tm93KCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHQoc3FsYChjYXN0KChqdWxpYW5kYXkoJ25vdycpIC0gMjQ0MDU4Ny41KSo4NjQwMDAwMCBhcyBpbnRlZ2VyKSlgKTtcbiAgfVxuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVGltZXN0YW1wKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVRpbWVzdGFtcCBleHRlbmRzIFNRTGl0ZUJhc2VJbnRlZ2VyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGltZXN0YW1wXCI7XG4gIG1vZGUgPSB0aGlzLmNvbmZpZy5tb2RlO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodGhpcy5jb25maWcubW9kZSA9PT0gXCJ0aW1lc3RhbXBcIikge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlICogMWUzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgY29uc3QgdW5peCA9IHZhbHVlLmdldFRpbWUoKTtcbiAgICBpZiAodGhpcy5jb25maWcubW9kZSA9PT0gXCJ0aW1lc3RhbXBcIikge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IodW5peCAvIDFlMyk7XG4gICAgfVxuICAgIHJldHVybiB1bml4O1xuICB9XG59XG5jbGFzcyBTUUxpdGVCb29sZWFuQnVpbGRlciBleHRlbmRzIFNRTGl0ZUJhc2VJbnRlZ2VyQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJvb2xlYW5CdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIG1vZGUpIHtcbiAgICBzdXBlcihuYW1lLCBcImJvb2xlYW5cIiwgXCJTUUxpdGVCb29sZWFuXCIpO1xuICAgIHRoaXMuY29uZmlnLm1vZGUgPSBtb2RlO1xuICB9XG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCb29sZWFuKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJvb2xlYW4gZXh0ZW5kcyBTUUxpdGVCYXNlSW50ZWdlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJvb2xlYW5cIjtcbiAgbW9kZSA9IHRoaXMuY29uZmlnLm1vZGU7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiBOdW1iZXIodmFsdWUpID09PSAxO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPyAxIDogMDtcbiAgfVxufVxuZnVuY3Rpb24gaW50ZWdlcihhLCBiKSB7XG4gIGNvbnN0IHsgbmFtZSwgY29uZmlnIH0gPSBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnKGEsIGIpO1xuICBpZiAoY29uZmlnPy5tb2RlID09PSBcInRpbWVzdGFtcFwiIHx8IGNvbmZpZz8ubW9kZSA9PT0gXCJ0aW1lc3RhbXBfbXNcIikge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVGltZXN0YW1wQnVpbGRlcihuYW1lLCBjb25maWcubW9kZSk7XG4gIH1cbiAgaWYgKGNvbmZpZz8ubW9kZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJvb2xlYW5CdWlsZGVyKG5hbWUsIGNvbmZpZy5tb2RlKTtcbiAgfVxuICByZXR1cm4gbmV3IFNRTGl0ZUludGVnZXJCdWlsZGVyKG5hbWUpO1xufVxuY29uc3QgaW50ID0gaW50ZWdlcjtcbmV4cG9ydCB7XG4gIFNRTGl0ZUJhc2VJbnRlZ2VyLFxuICBTUUxpdGVCYXNlSW50ZWdlckJ1aWxkZXIsXG4gIFNRTGl0ZUJvb2xlYW4sXG4gIFNRTGl0ZUJvb2xlYW5CdWlsZGVyLFxuICBTUUxpdGVJbnRlZ2VyLFxuICBTUUxpdGVJbnRlZ2VyQnVpbGRlcixcbiAgU1FMaXRlVGltZXN0YW1wLFxuICBTUUxpdGVUaW1lc3RhbXBCdWlsZGVyLFxuICBpbnQsXG4gIGludGVnZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnRlZ2VyLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWVBbmRDb25maWcgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiwgU1FMaXRlQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgU1FMaXRlTnVtZXJpY0J1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY0J1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwic3RyaW5nXCIsIFwiU1FMaXRlTnVtZXJpY1wiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVOdW1lcmljKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZU51bWVyaWMgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVOdW1lcmljXCI7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcIm51bWVyaWNcIjtcbiAgfVxufVxuY2xhc3MgU1FMaXRlTnVtZXJpY051bWJlckJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY051bWJlckJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwibnVtYmVyXCIsIFwiU1FMaXRlTnVtZXJpY051bWJlclwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVOdW1lcmljTnVtYmVyKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZU51bWVyaWNOdW1iZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVOdW1lcmljTnVtYmVyXCI7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlID0gU3RyaW5nO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcIm51bWVyaWNcIjtcbiAgfVxufVxuY2xhc3MgU1FMaXRlTnVtZXJpY0JpZ0ludEJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlTnVtZXJpY0JpZ0ludEJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwiYmlnaW50XCIsIFwiU1FMaXRlTnVtZXJpY0JpZ0ludFwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVOdW1lcmljQmlnSW50KFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZU51bWVyaWNCaWdJbnQgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVOdW1lcmljQmlnSW50XCI7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSA9IEJpZ0ludDtcbiAgbWFwVG9Ecml2ZXJWYWx1ZSA9IFN0cmluZztcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJudW1lcmljXCI7XG4gIH1cbn1cbmZ1bmN0aW9uIG51bWVyaWMoYSwgYikge1xuICBjb25zdCB7IG5hbWUsIGNvbmZpZyB9ID0gZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyhhLCBiKTtcbiAgY29uc3QgbW9kZSA9IGNvbmZpZz8ubW9kZTtcbiAgcmV0dXJuIG1vZGUgPT09IFwibnVtYmVyXCIgPyBuZXcgU1FMaXRlTnVtZXJpY051bWJlckJ1aWxkZXIobmFtZSkgOiBtb2RlID09PSBcImJpZ2ludFwiID8gbmV3IFNRTGl0ZU51bWVyaWNCaWdJbnRCdWlsZGVyKG5hbWUpIDogbmV3IFNRTGl0ZU51bWVyaWNCdWlsZGVyKG5hbWUpO1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlTnVtZXJpYyxcbiAgU1FMaXRlTnVtZXJpY0JpZ0ludCxcbiAgU1FMaXRlTnVtZXJpY0JpZ0ludEJ1aWxkZXIsXG4gIFNRTGl0ZU51bWVyaWNCdWlsZGVyLFxuICBTUUxpdGVOdW1lcmljTnVtYmVyLFxuICBTUUxpdGVOdW1lcmljTnVtYmVyQnVpbGRlcixcbiAgbnVtZXJpY1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW51bWVyaWMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uLCBTUUxpdGVDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBTUUxpdGVSZWFsQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVSZWFsQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJudW1iZXJcIiwgXCJTUUxpdGVSZWFsXCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVJlYWwodGFibGUsIHRoaXMuY29uZmlnKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlUmVhbCBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVJlYWxcIjtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJyZWFsXCI7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlYWwobmFtZSkge1xuICByZXR1cm4gbmV3IFNRTGl0ZVJlYWxCdWlsZGVyKG5hbWUgPz8gXCJcIik7XG59XG5leHBvcnQge1xuICBTUUxpdGVSZWFsLFxuICBTUUxpdGVSZWFsQnVpbGRlcixcbiAgcmVhbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWwuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uLCBTUUxpdGVDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBTUUxpdGVUZXh0QnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUZXh0QnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBjb25maWcpIHtcbiAgICBzdXBlcihuYW1lLCBcInN0cmluZ1wiLCBcIlNRTGl0ZVRleHRcIik7XG4gICAgdGhpcy5jb25maWcuZW51bVZhbHVlcyA9IGNvbmZpZy5lbnVtO1xuICAgIHRoaXMuY29uZmlnLmxlbmd0aCA9IGNvbmZpZy5sZW5ndGg7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVGV4dChcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVUZXh0IGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGV4dFwiO1xuICBlbnVtVmFsdWVzID0gdGhpcy5jb25maWcuZW51bVZhbHVlcztcbiAgbGVuZ3RoID0gdGhpcy5jb25maWcubGVuZ3RoO1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gIH1cbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gYHRleHQke3RoaXMuY29uZmlnLmxlbmd0aCA/IGAoJHt0aGlzLmNvbmZpZy5sZW5ndGh9KWAgOiBcIlwifWA7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVRleHRKc29uQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUZXh0SnNvbkJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwianNvblwiLCBcIlNRTGl0ZVRleHRKc29uXCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVRleHRKc29uKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVRleHRKc29uIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGV4dEpzb25cIjtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gIH1cbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9XG59XG5mdW5jdGlvbiB0ZXh0KGEsIGIgPSB7fSkge1xuICBjb25zdCB7IG5hbWUsIGNvbmZpZyB9ID0gZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyhhLCBiKTtcbiAgaWYgKGNvbmZpZy5tb2RlID09PSBcImpzb25cIikge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVGV4dEpzb25CdWlsZGVyKG5hbWUpO1xuICB9XG4gIHJldHVybiBuZXcgU1FMaXRlVGV4dEJ1aWxkZXIobmFtZSwgY29uZmlnKTtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZVRleHQsXG4gIFNRTGl0ZVRleHRCdWlsZGVyLFxuICBTUUxpdGVUZXh0SnNvbixcbiAgU1FMaXRlVGV4dEpzb25CdWlsZGVyLFxuICB0ZXh0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGV4dC5qcy5tYXAiLAogICAgImltcG9ydCB7IENvbHVtbkFsaWFzUHJveHlIYW5kbGVyLCBUYWJsZUFsaWFzUHJveHlIYW5kbGVyIH0gZnJvbSBcIi4vYWxpYXMuanNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNRTCwgVmlldyB9IGZyb20gXCIuL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4vdmlldy1jb21tb24uanNcIjtcbmNsYXNzIFNlbGVjdGlvblByb3h5SGFuZGxlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNlbGVjdGlvblByb3h5SGFuZGxlclwiO1xuICBjb25maWc7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0geyAuLi5jb25maWcgfTtcbiAgfVxuICBnZXQoc3VicXVlcnksIHByb3ApIHtcbiAgICBpZiAocHJvcCA9PT0gXCJfXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN1YnF1ZXJ5W1wiX1wiXSxcbiAgICAgICAgc2VsZWN0ZWRGaWVsZHM6IG5ldyBQcm94eShcbiAgICAgICAgICBzdWJxdWVyeS5fLnNlbGVjdGVkRmllbGRzLFxuICAgICAgICAgIHRoaXNcbiAgICAgICAgKVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHByb3AgPT09IFZpZXdCYXNlQ29uZmlnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdWJxdWVyeVtWaWV3QmFzZUNvbmZpZ10sXG4gICAgICAgIHNlbGVjdGVkRmllbGRzOiBuZXcgUHJveHkoXG4gICAgICAgICAgc3VicXVlcnlbVmlld0Jhc2VDb25maWddLnNlbGVjdGVkRmllbGRzLFxuICAgICAgICAgIHRoaXNcbiAgICAgICAgKVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9wID09PSBcInN5bWJvbFwiKSB7XG4gICAgICByZXR1cm4gc3VicXVlcnlbcHJvcF07XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbnMgPSBpcyhzdWJxdWVyeSwgU3VicXVlcnkpID8gc3VicXVlcnkuXy5zZWxlY3RlZEZpZWxkcyA6IGlzKHN1YnF1ZXJ5LCBWaWV3KSA/IHN1YnF1ZXJ5W1ZpZXdCYXNlQ29uZmlnXS5zZWxlY3RlZEZpZWxkcyA6IHN1YnF1ZXJ5O1xuICAgIGNvbnN0IHZhbHVlID0gY29sdW1uc1twcm9wXTtcbiAgICBpZiAoaXModmFsdWUsIFNRTC5BbGlhc2VkKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLnNxbEFsaWFzZWRCZWhhdmlvciA9PT0gXCJzcWxcIiAmJiAhdmFsdWUuaXNTZWxlY3Rpb25GaWVsZCkge1xuICAgICAgICByZXR1cm4gdmFsdWUuc3FsO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3VmFsdWUgPSB2YWx1ZS5jbG9uZSgpO1xuICAgICAgbmV3VmFsdWUuaXNTZWxlY3Rpb25GaWVsZCA9IHRydWU7XG4gICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgfVxuICAgIGlmIChpcyh2YWx1ZSwgU1FMKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLnNxbEJlaGF2aW9yID09PSBcInNxbFwiKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFlvdSB0cmllZCB0byByZWZlcmVuY2UgXCIke3Byb3B9XCIgZmllbGQgZnJvbSBhIHN1YnF1ZXJ5LCB3aGljaCBpcyBhIHJhdyBTUUwgZmllbGQsIGJ1dCBpdCBkb2Vzbid0IGhhdmUgYW4gYWxpYXMgZGVjbGFyZWQuIFBsZWFzZSBhZGQgYW4gYWxpYXMgdG8gdGhlIGZpZWxkIHVzaW5nIFwiLmFzKCdhbGlhcycpXCIgbWV0aG9kLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChpcyh2YWx1ZSwgQ29sdW1uKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLmFsaWFzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgbmV3IENvbHVtbkFsaWFzUHJveHlIYW5kbGVyKFxuICAgICAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgICAgICB2YWx1ZS50YWJsZSxcbiAgICAgICAgICAgICAgbmV3IFRhYmxlQWxpYXNQcm94eUhhbmRsZXIodGhpcy5jb25maWcuYWxpYXMsIHRoaXMuY29uZmlnLnJlcGxhY2VPcmlnaW5hbE5hbWUgPz8gZmFsc2UpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJveHkodmFsdWUsIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIodGhpcy5jb25maWcpKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgU2VsZWN0aW9uUHJveHlIYW5kbGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VsZWN0aW9uLXByb3h5LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuY2xhc3MgUXVlcnlQcm9taXNlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUXVlcnlQcm9taXNlXCI7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddID0gXCJRdWVyeVByb21pc2VcIjtcbiAgY2F0Y2gob25SZWplY3RlZCkge1xuICAgIHJldHVybiB0aGlzLnRoZW4odm9pZCAwLCBvblJlamVjdGVkKTtcbiAgfVxuICBmaW5hbGx5KG9uRmluYWxseSkge1xuICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgb25GaW5hbGx5Py4oKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSxcbiAgICAgIChyZWFzb24pID0+IHtcbiAgICAgICAgb25GaW5hbGx5Py4oKTtcbiAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgUXVlcnlQcm9taXNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnktcHJvbWlzZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGJsb2IgfSBmcm9tIFwiLi9ibG9iLmpzXCI7XG5pbXBvcnQgeyBjdXN0b21UeXBlIH0gZnJvbSBcIi4vY3VzdG9tLmpzXCI7XG5pbXBvcnQgeyBpbnRlZ2VyIH0gZnJvbSBcIi4vaW50ZWdlci5qc1wiO1xuaW1wb3J0IHsgbnVtZXJpYyB9IGZyb20gXCIuL251bWVyaWMuanNcIjtcbmltcG9ydCB7IHJlYWwgfSBmcm9tIFwiLi9yZWFsLmpzXCI7XG5pbXBvcnQgeyB0ZXh0IH0gZnJvbSBcIi4vdGV4dC5qc1wiO1xuZnVuY3Rpb24gZ2V0U1FMaXRlQ29sdW1uQnVpbGRlcnMoKSB7XG4gIHJldHVybiB7XG4gICAgYmxvYixcbiAgICBjdXN0b21UeXBlLFxuICAgIGludGVnZXIsXG4gICAgbnVtZXJpYyxcbiAgICByZWFsLFxuICAgIHRleHRcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIGdldFNRTGl0ZUNvbHVtbkJ1aWxkZXJzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWxsLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBnZXRTUUxpdGVDb2x1bW5CdWlsZGVycyB9IGZyb20gXCIuL2NvbHVtbnMvYWxsLmpzXCI7XG5jb25zdCBJbmxpbmVGb3JlaWduS2V5cyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOlNRTGl0ZUlubGluZUZvcmVpZ25LZXlzXCIpO1xuY2xhc3MgU1FMaXRlVGFibGUgZXh0ZW5kcyBUYWJsZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRhYmxlXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIFN5bWJvbCA9IE9iamVjdC5hc3NpZ24oe30sIFRhYmxlLlN5bWJvbCwge1xuICAgIElubGluZUZvcmVpZ25LZXlzXG4gIH0pO1xuICAvKiogQGludGVybmFsICovXG4gIFtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0lubGluZUZvcmVpZ25LZXlzXSA9IFtdO1xuICAvKiogQGludGVybmFsICovXG4gIFtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdCdWlsZGVyXSA9IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIHNxbGl0ZVRhYmxlQmFzZShuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZywgc2NoZW1hLCBiYXNlTmFtZSA9IG5hbWUpIHtcbiAgY29uc3QgcmF3VGFibGUgPSBuZXcgU1FMaXRlVGFibGUobmFtZSwgc2NoZW1hLCBiYXNlTmFtZSk7XG4gIGNvbnN0IHBhcnNlZENvbHVtbnMgPSB0eXBlb2YgY29sdW1ucyA9PT0gXCJmdW5jdGlvblwiID8gY29sdW1ucyhnZXRTUUxpdGVDb2x1bW5CdWlsZGVycygpKSA6IGNvbHVtbnM7XG4gIGNvbnN0IGJ1aWx0Q29sdW1ucyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhwYXJzZWRDb2x1bW5zKS5tYXAoKFtuYW1lMiwgY29sQnVpbGRlckJhc2VdKSA9PiB7XG4gICAgICBjb25zdCBjb2xCdWlsZGVyID0gY29sQnVpbGRlckJhc2U7XG4gICAgICBjb2xCdWlsZGVyLnNldE5hbWUobmFtZTIpO1xuICAgICAgY29uc3QgY29sdW1uID0gY29sQnVpbGRlci5idWlsZChyYXdUYWJsZSk7XG4gICAgICByYXdUYWJsZVtJbmxpbmVGb3JlaWduS2V5c10ucHVzaCguLi5jb2xCdWlsZGVyLmJ1aWxkRm9yZWlnbktleXMoY29sdW1uLCByYXdUYWJsZSkpO1xuICAgICAgcmV0dXJuIFtuYW1lMiwgY29sdW1uXTtcbiAgICB9KVxuICApO1xuICBjb25zdCB0YWJsZSA9IE9iamVjdC5hc3NpZ24ocmF3VGFibGUsIGJ1aWx0Q29sdW1ucyk7XG4gIHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSA9IGJ1aWx0Q29sdW1ucztcbiAgdGFibGVbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQ29sdW1uc10gPSBidWlsdENvbHVtbnM7XG4gIGlmIChleHRyYUNvbmZpZykge1xuICAgIHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0J1aWxkZXJdID0gZXh0cmFDb25maWc7XG4gIH1cbiAgcmV0dXJuIHRhYmxlO1xufVxuY29uc3Qgc3FsaXRlVGFibGUgPSAobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcpID0+IHtcbiAgcmV0dXJuIHNxbGl0ZVRhYmxlQmFzZShuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZyk7XG59O1xuZnVuY3Rpb24gc3FsaXRlVGFibGVDcmVhdG9yKGN1c3RvbWl6ZVRhYmxlTmFtZSkge1xuICByZXR1cm4gKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnKSA9PiB7XG4gICAgcmV0dXJuIHNxbGl0ZVRhYmxlQmFzZShjdXN0b21pemVUYWJsZU5hbWUobmFtZSksIGNvbHVtbnMsIGV4dHJhQ29uZmlnLCB2b2lkIDAsIG5hbWUpO1xuICB9O1xufVxuZXhwb3J0IHtcbiAgSW5saW5lRm9yZWlnbktleXMsXG4gIFNRTGl0ZVRhYmxlLFxuICBzcWxpdGVUYWJsZSxcbiAgc3FsaXRlVGFibGVDcmVhdG9yXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFibGUuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuY2xhc3MgSW5kZXhCdWlsZGVyT24ge1xuICBjb25zdHJ1Y3RvcihuYW1lLCB1bmlxdWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMudW5pcXVlID0gdW5pcXVlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUluZGV4QnVpbGRlck9uXCI7XG4gIG9uKC4uLmNvbHVtbnMpIHtcbiAgICByZXR1cm4gbmV3IEluZGV4QnVpbGRlcih0aGlzLm5hbWUsIGNvbHVtbnMsIHRoaXMudW5pcXVlKTtcbiAgfVxufVxuY2xhc3MgSW5kZXhCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW5kZXhCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uZmlnO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBjb2x1bW5zLCB1bmlxdWUpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBjb2x1bW5zLFxuICAgICAgdW5pcXVlLFxuICAgICAgd2hlcmU6IHZvaWQgMFxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIENvbmRpdGlvbiBmb3IgcGFydGlhbCBpbmRleC5cbiAgICovXG4gIHdoZXJlKGNvbmRpdGlvbikge1xuICAgIHRoaXMuY29uZmlnLndoZXJlID0gY29uZGl0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IEluZGV4KHRoaXMuY29uZmlnLCB0YWJsZSk7XG4gIH1cbn1cbmNsYXNzIEluZGV4IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW5kZXhcIjtcbiAgY29uZmlnO1xuICBjb25zdHJ1Y3Rvcihjb25maWcsIHRhYmxlKSB7XG4gICAgdGhpcy5jb25maWcgPSB7IC4uLmNvbmZpZywgdGFibGUgfTtcbiAgfVxufVxuZnVuY3Rpb24gaW5kZXgobmFtZSkge1xuICByZXR1cm4gbmV3IEluZGV4QnVpbGRlck9uKG5hbWUsIGZhbHNlKTtcbn1cbmZ1bmN0aW9uIHVuaXF1ZUluZGV4KG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBJbmRleEJ1aWxkZXJPbihuYW1lLCB0cnVlKTtcbn1cbmV4cG9ydCB7XG4gIEluZGV4LFxuICBJbmRleEJ1aWxkZXIsXG4gIEluZGV4QnVpbGRlck9uLFxuICBpbmRleCxcbiAgdW5pcXVlSW5kZXhcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleGVzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgaXMgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTUUwgfSBmcm9tIFwiLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuLi92aWV3LWNvbW1vbi5qc1wiO1xuaW1wb3J0IHsgQ2hlY2tCdWlsZGVyIH0gZnJvbSBcIi4vY2hlY2tzLmpzXCI7XG5pbXBvcnQgeyBGb3JlaWduS2V5QnVpbGRlciB9IGZyb20gXCIuL2ZvcmVpZ24ta2V5cy5qc1wiO1xuaW1wb3J0IHsgSW5kZXhCdWlsZGVyIH0gZnJvbSBcIi4vaW5kZXhlcy5qc1wiO1xuaW1wb3J0IHsgUHJpbWFyeUtleUJ1aWxkZXIgfSBmcm9tIFwiLi9wcmltYXJ5LWtleXMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVRhYmxlIH0gZnJvbSBcIi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyIH0gZnJvbSBcIi4vdW5pcXVlLWNvbnN0cmFpbnQuanNcIjtcbmZ1bmN0aW9uIGdldFRhYmxlQ29uZmlnKHRhYmxlKSB7XG4gIGNvbnN0IGNvbHVtbnMgPSBPYmplY3QudmFsdWVzKHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5Db2x1bW5zXSk7XG4gIGNvbnN0IGluZGV4ZXMgPSBbXTtcbiAgY29uc3QgY2hlY2tzID0gW107XG4gIGNvbnN0IHByaW1hcnlLZXlzID0gW107XG4gIGNvbnN0IHVuaXF1ZUNvbnN0cmFpbnRzID0gW107XG4gIGNvbnN0IGZvcmVpZ25LZXlzID0gT2JqZWN0LnZhbHVlcyh0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuSW5saW5lRm9yZWlnbktleXNdKTtcbiAgY29uc3QgbmFtZSA9IHRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXTtcbiAgY29uc3QgZXh0cmFDb25maWdCdWlsZGVyID0gdGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQnVpbGRlcl07XG4gIGlmIChleHRyYUNvbmZpZ0J1aWxkZXIgIT09IHZvaWQgMCkge1xuICAgIGNvbnN0IGV4dHJhQ29uZmlnID0gZXh0cmFDb25maWdCdWlsZGVyKHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5Db2x1bW5zXSk7XG4gICAgY29uc3QgZXh0cmFWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGV4dHJhQ29uZmlnKSA/IGV4dHJhQ29uZmlnLmZsYXQoMSkgOiBPYmplY3QudmFsdWVzKGV4dHJhQ29uZmlnKTtcbiAgICBmb3IgKGNvbnN0IGJ1aWxkZXIgb2YgT2JqZWN0LnZhbHVlcyhleHRyYVZhbHVlcykpIHtcbiAgICAgIGlmIChpcyhidWlsZGVyLCBJbmRleEJ1aWxkZXIpKSB7XG4gICAgICAgIGluZGV4ZXMucHVzaChidWlsZGVyLmJ1aWxkKHRhYmxlKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzKGJ1aWxkZXIsIENoZWNrQnVpbGRlcikpIHtcbiAgICAgICAgY2hlY2tzLnB1c2goYnVpbGRlci5idWlsZCh0YWJsZSkpO1xuICAgICAgfSBlbHNlIGlmIChpcyhidWlsZGVyLCBVbmlxdWVDb25zdHJhaW50QnVpbGRlcikpIHtcbiAgICAgICAgdW5pcXVlQ29uc3RyYWludHMucHVzaChidWlsZGVyLmJ1aWxkKHRhYmxlKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzKGJ1aWxkZXIsIFByaW1hcnlLZXlCdWlsZGVyKSkge1xuICAgICAgICBwcmltYXJ5S2V5cy5wdXNoKGJ1aWxkZXIuYnVpbGQodGFibGUpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXMoYnVpbGRlciwgRm9yZWlnbktleUJ1aWxkZXIpKSB7XG4gICAgICAgIGZvcmVpZ25LZXlzLnB1c2goYnVpbGRlci5idWlsZCh0YWJsZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGNvbHVtbnMsXG4gICAgaW5kZXhlcyxcbiAgICBmb3JlaWduS2V5cyxcbiAgICBjaGVja3MsXG4gICAgcHJpbWFyeUtleXMsXG4gICAgdW5pcXVlQ29uc3RyYWludHMsXG4gICAgbmFtZVxuICB9O1xufVxuZnVuY3Rpb24gZXh0cmFjdFVzZWRUYWJsZSh0YWJsZSkge1xuICBpZiAoaXModGFibGUsIFNRTGl0ZVRhYmxlKSkge1xuICAgIHJldHVybiBbYCR7dGFibGVbVGFibGUuU3ltYm9sLkJhc2VOYW1lXX1gXTtcbiAgfVxuICBpZiAoaXModGFibGUsIFN1YnF1ZXJ5KSkge1xuICAgIHJldHVybiB0YWJsZS5fLnVzZWRUYWJsZXMgPz8gW107XG4gIH1cbiAgaWYgKGlzKHRhYmxlLCBTUUwpKSB7XG4gICAgcmV0dXJuIHRhYmxlLnVzZWRUYWJsZXMgPz8gW107XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuZnVuY3Rpb24gZ2V0Vmlld0NvbmZpZyh2aWV3KSB7XG4gIHJldHVybiB7XG4gICAgLi4udmlld1tWaWV3QmFzZUNvbmZpZ11cbiAgICAvLyAuLi52aWV3W1NRTGl0ZVZpZXdDb25maWddLFxuICB9O1xufVxuZXhwb3J0IHtcbiAgZXh0cmFjdFVzZWRUYWJsZSxcbiAgZ2V0VGFibGVDb25maWcsXG4gIGdldFZpZXdDb25maWdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuaW1wb3J0IHsgU2VsZWN0aW9uUHJveHlIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL3NlbGVjdGlvbi1wcm94eS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBvcmRlclNlbGVjdGVkRmllbGRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBleHRyYWN0VXNlZFRhYmxlIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5jbGFzcyBTUUxpdGVEZWxldGVCYXNlIGV4dGVuZHMgUXVlcnlQcm9taXNlIHtcbiAgY29uc3RydWN0b3IodGFibGUsIHNlc3Npb24sIGRpYWxlY3QsIHdpdGhMaXN0KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuY29uZmlnID0geyB0YWJsZSwgd2l0aExpc3QgfTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVEZWxldGVcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25maWc7XG4gIC8qKlxuICAgKiBBZGRzIGEgYHdoZXJlYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgZGVsZXRlIG9ubHkgdGhvc2Ugcm93cyB0aGF0IGZ1bGZpbGwgYSBzcGVjaWZpZWQgY29uZGl0aW9uLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2RlbGV0ZX1cbiAgICpcbiAgICogQHBhcmFtIHdoZXJlIHRoZSBgd2hlcmVgIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogWW91IGNhbiB1c2UgY29uZGl0aW9uYWwgb3BlcmF0b3JzIGFuZCBgc3FsIGZ1bmN0aW9uYCB0byBmaWx0ZXIgdGhlIHJvd3MgdG8gYmUgZGVsZXRlZC5cbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gRGVsZXRlIGFsbCBjYXJzIHdpdGggZ3JlZW4gY29sb3JcbiAgICogZGIuZGVsZXRlKGNhcnMpLndoZXJlKGVxKGNhcnMuY29sb3IsICdncmVlbicpKTtcbiAgICogLy8gb3JcbiAgICogZGIuZGVsZXRlKGNhcnMpLndoZXJlKHNxbGAke2NhcnMuY29sb3J9ID0gJ2dyZWVuJ2ApXG4gICAqIGBgYFxuICAgKlxuICAgKiBZb3UgY2FuIGxvZ2ljYWxseSBjb21iaW5lIGNvbmRpdGlvbmFsIG9wZXJhdG9ycyB3aXRoIGBhbmQoKWAgYW5kIGBvcigpYCBvcGVyYXRvcnM6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIERlbGV0ZSBhbGwgQk1XIGNhcnMgd2l0aCBhIGdyZWVuIGNvbG9yXG4gICAqIGRiLmRlbGV0ZShjYXJzKS53aGVyZShhbmQoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJyksIGVxKGNhcnMuYnJhbmQsICdCTVcnKSkpO1xuICAgKlxuICAgKiAvLyBEZWxldGUgYWxsIGNhcnMgd2l0aCB0aGUgZ3JlZW4gb3IgYmx1ZSBjb2xvclxuICAgKiBkYi5kZWxldGUoY2Fycykud2hlcmUob3IoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJyksIGVxKGNhcnMuY29sb3IsICdibHVlJykpKTtcbiAgICogYGBgXG4gICAqL1xuICB3aGVyZSh3aGVyZSkge1xuICAgIHRoaXMuY29uZmlnLndoZXJlID0gd2hlcmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb3JkZXJCeSguLi5jb2x1bW5zKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW5zWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yZGVyQnkgPSBjb2x1bW5zWzBdKFxuICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgdGhpcy5jb25maWcudGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdLFxuICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG9yZGVyQnlBcnJheSA9IEFycmF5LmlzQXJyYXkob3JkZXJCeSkgPyBvcmRlckJ5IDogW29yZGVyQnldO1xuICAgICAgdGhpcy5jb25maWcub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3JkZXJCeUFycmF5ID0gY29sdW1ucztcbiAgICAgIHRoaXMuY29uZmlnLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGxpbWl0KGxpbWl0KSB7XG4gICAgdGhpcy5jb25maWcubGltaXQgPSBsaW1pdDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICByZXR1cm5pbmcoZmllbGRzID0gdGhpcy50YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuQ29sdW1uc10pIHtcbiAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPSBvcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbGVjdC5idWlsZERlbGV0ZVF1ZXJ5KHRoaXMuY29uZmlnKTtcbiAgfVxuICB0b1NRTCgpIHtcbiAgICBjb25zdCB7IHR5cGluZ3M6IF90eXBpbmdzLCAuLi5yZXN0IH0gPSB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKTtcbiAgICByZXR1cm4gcmVzdDtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9wcmVwYXJlKGlzT25lVGltZVF1ZXJ5ID0gdHJ1ZSkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25baXNPbmVUaW1lUXVlcnkgPyBcInByZXBhcmVPbmVUaW1lUXVlcnlcIiA6IFwicHJlcGFyZVF1ZXJ5XCJdKFxuICAgICAgdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSksXG4gICAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcsXG4gICAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPyBcImFsbFwiIDogXCJydW5cIixcbiAgICAgIHRydWUsXG4gICAgICB2b2lkIDAsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiZGVsZXRlXCIsXG4gICAgICAgIHRhYmxlczogZXh0cmFjdFVzZWRUYWJsZSh0aGlzLmNvbmZpZy50YWJsZSlcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByZXBhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpO1xuICB9XG4gIHJ1biA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkucnVuKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYWxsID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5hbGwocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBnZXQgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmdldChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIHZhbHVlcyA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkudmFsdWVzKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYXN5bmMgZXhlY3V0ZShwbGFjZWhvbGRlclZhbHVlcykge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuZXhlY3V0ZShwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH1cbiAgJGR5bmFtaWMoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZURlbGV0ZUJhc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWxldGUuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5mdW5jdGlvbiB0b1NuYWtlQ2FzZShpbnB1dCkge1xuICBjb25zdCB3b3JkcyA9IGlucHV0LnJlcGxhY2UoL1snXFx1MjAxOV0vZywgXCJcIikubWF0Y2goL1tcXGRhLXpdK3xbQS1aXSsoPyFbYS16XSl8W0EtWl1bXFxkYS16XSsvZykgPz8gW107XG4gIHJldHVybiB3b3Jkcy5tYXAoKHdvcmQpID0+IHdvcmQudG9Mb3dlckNhc2UoKSkuam9pbihcIl9cIik7XG59XG5mdW5jdGlvbiB0b0NhbWVsQ2FzZShpbnB1dCkge1xuICBjb25zdCB3b3JkcyA9IGlucHV0LnJlcGxhY2UoL1snXFx1MjAxOV0vZywgXCJcIikubWF0Y2goL1tcXGRhLXpdK3xbQS1aXSsoPyFbYS16XSl8W0EtWl1bXFxkYS16XSsvZykgPz8gW107XG4gIHJldHVybiB3b3Jkcy5yZWR1Y2UoKGFjYywgd29yZCwgaSkgPT4ge1xuICAgIGNvbnN0IGZvcm1hdHRlZFdvcmQgPSBpID09PSAwID8gd29yZC50b0xvd2VyQ2FzZSgpIDogYCR7d29yZFswXS50b1VwcGVyQ2FzZSgpfSR7d29yZC5zbGljZSgxKX1gO1xuICAgIHJldHVybiBhY2MgKyBmb3JtYXR0ZWRXb3JkO1xuICB9LCBcIlwiKTtcbn1cbmZ1bmN0aW9uIG5vb3BDYXNlKGlucHV0KSB7XG4gIHJldHVybiBpbnB1dDtcbn1cbmNsYXNzIENhc2luZ0NhY2hlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQ2FzaW5nQ2FjaGVcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjYWNoZSA9IHt9O1xuICBjYWNoZWRUYWJsZXMgPSB7fTtcbiAgY29udmVydDtcbiAgY29uc3RydWN0b3IoY2FzaW5nKSB7XG4gICAgdGhpcy5jb252ZXJ0ID0gY2FzaW5nID09PSBcInNuYWtlX2Nhc2VcIiA/IHRvU25ha2VDYXNlIDogY2FzaW5nID09PSBcImNhbWVsQ2FzZVwiID8gdG9DYW1lbENhc2UgOiBub29wQ2FzZTtcbiAgfVxuICBnZXRDb2x1bW5DYXNpbmcoY29sdW1uKSB7XG4gICAgaWYgKCFjb2x1bW4ua2V5QXNOYW1lKSByZXR1cm4gY29sdW1uLm5hbWU7XG4gICAgY29uc3Qgc2NoZW1hID0gY29sdW1uLnRhYmxlW1RhYmxlLlN5bWJvbC5TY2hlbWFdID8/IFwicHVibGljXCI7XG4gICAgY29uc3QgdGFibGVOYW1lID0gY29sdW1uLnRhYmxlW1RhYmxlLlN5bWJvbC5PcmlnaW5hbE5hbWVdO1xuICAgIGNvbnN0IGtleSA9IGAke3NjaGVtYX0uJHt0YWJsZU5hbWV9LiR7Y29sdW1uLm5hbWV9YDtcbiAgICBpZiAoIXRoaXMuY2FjaGVba2V5XSkge1xuICAgICAgdGhpcy5jYWNoZVRhYmxlKGNvbHVtbi50YWJsZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNhY2hlW2tleV07XG4gIH1cbiAgY2FjaGVUYWJsZSh0YWJsZSkge1xuICAgIGNvbnN0IHNjaGVtYSA9IHRhYmxlW1RhYmxlLlN5bWJvbC5TY2hlbWFdID8/IFwicHVibGljXCI7XG4gICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVbVGFibGUuU3ltYm9sLk9yaWdpbmFsTmFtZV07XG4gICAgY29uc3QgdGFibGVLZXkgPSBgJHtzY2hlbWF9LiR7dGFibGVOYW1lfWA7XG4gICAgaWYgKCF0aGlzLmNhY2hlZFRhYmxlc1t0YWJsZUtleV0pIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIE9iamVjdC52YWx1ZXModGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdKSkge1xuICAgICAgICBjb25zdCBjb2x1bW5LZXkgPSBgJHt0YWJsZUtleX0uJHtjb2x1bW4ubmFtZX1gO1xuICAgICAgICB0aGlzLmNhY2hlW2NvbHVtbktleV0gPSB0aGlzLmNvbnZlcnQoY29sdW1uLm5hbWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWNoZWRUYWJsZXNbdGFibGVLZXldID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgY2xlYXJDYWNoZSgpIHtcbiAgICB0aGlzLmNhY2hlID0ge307XG4gICAgdGhpcy5jYWNoZWRUYWJsZXMgPSB7fTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgQ2FzaW5nQ2FjaGUsXG4gIHRvQ2FtZWxDYXNlLFxuICB0b1NuYWtlQ2FzZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNhc2luZy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmNsYXNzIERyaXp6bGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiRHJpenpsZUVycm9yXCI7XG4gIGNvbnN0cnVjdG9yKHsgbWVzc2FnZSwgY2F1c2UgfSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiRHJpenpsZUVycm9yXCI7XG4gICAgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICB9XG59XG5jbGFzcyBEcml6emxlUXVlcnlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocXVlcnksIHBhcmFtcywgY2F1c2UpIHtcbiAgICBzdXBlcihgRmFpbGVkIHF1ZXJ5OiAke3F1ZXJ5fVxucGFyYW1zOiAke3BhcmFtc31gKTtcbiAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIERyaXp6bGVRdWVyeUVycm9yKTtcbiAgICBpZiAoY2F1c2UpIHRoaXMuY2F1c2UgPSBjYXVzZTtcbiAgfVxufVxuY2xhc3MgVHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yIGV4dGVuZHMgRHJpenpsZUVycm9yIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiVHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yXCI7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHsgbWVzc2FnZTogXCJSb2xsYmFja1wiIH0pO1xuICB9XG59XG5leHBvcnQge1xuICBEcml6emxlRXJyb3IsXG4gIERyaXp6bGVRdWVyeUVycm9yLFxuICBUcmFuc2FjdGlvblJvbGxiYWNrRXJyb3Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvcnMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IGdldFBnQ29sdW1uQnVpbGRlcnMgfSBmcm9tIFwiLi9jb2x1bW5zL2FsbC5qc1wiO1xuY29uc3QgSW5saW5lRm9yZWlnbktleXMgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpQZ0lubGluZUZvcmVpZ25LZXlzXCIpO1xuY29uc3QgRW5hYmxlUkxTID0gU3ltYm9sLmZvcihcImRyaXp6bGU6RW5hYmxlUkxTXCIpO1xuY2xhc3MgUGdUYWJsZSBleHRlbmRzIFRhYmxlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdUYWJsZVwiO1xuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBTeW1ib2wgPSBPYmplY3QuYXNzaWduKHt9LCBUYWJsZS5TeW1ib2wsIHtcbiAgICBJbmxpbmVGb3JlaWduS2V5cyxcbiAgICBFbmFibGVSTFNcbiAgfSk7XG4gIC8qKkBpbnRlcm5hbCAqL1xuICBbSW5saW5lRm9yZWlnbktleXNdID0gW107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0VuYWJsZVJMU10gPSBmYWxzZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQnVpbGRlcl0gPSB2b2lkIDA7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0NvbHVtbnNdID0ge307XG59XG5mdW5jdGlvbiBwZ1RhYmxlV2l0aFNjaGVtYShuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZywgc2NoZW1hLCBiYXNlTmFtZSA9IG5hbWUpIHtcbiAgY29uc3QgcmF3VGFibGUgPSBuZXcgUGdUYWJsZShuYW1lLCBzY2hlbWEsIGJhc2VOYW1lKTtcbiAgY29uc3QgcGFyc2VkQ29sdW1ucyA9IHR5cGVvZiBjb2x1bW5zID09PSBcImZ1bmN0aW9uXCIgPyBjb2x1bW5zKGdldFBnQ29sdW1uQnVpbGRlcnMoKSkgOiBjb2x1bW5zO1xuICBjb25zdCBidWlsdENvbHVtbnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMocGFyc2VkQ29sdW1ucykubWFwKChbbmFtZTIsIGNvbEJ1aWxkZXJCYXNlXSkgPT4ge1xuICAgICAgY29uc3QgY29sQnVpbGRlciA9IGNvbEJ1aWxkZXJCYXNlO1xuICAgICAgY29sQnVpbGRlci5zZXROYW1lKG5hbWUyKTtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbEJ1aWxkZXIuYnVpbGQocmF3VGFibGUpO1xuICAgICAgcmF3VGFibGVbSW5saW5lRm9yZWlnbktleXNdLnB1c2goLi4uY29sQnVpbGRlci5idWlsZEZvcmVpZ25LZXlzKGNvbHVtbiwgcmF3VGFibGUpKTtcbiAgICAgIHJldHVybiBbbmFtZTIsIGNvbHVtbl07XG4gICAgfSlcbiAgKTtcbiAgY29uc3QgYnVpbHRDb2x1bW5zRm9yRXh0cmFDb25maWcgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMocGFyc2VkQ29sdW1ucykubWFwKChbbmFtZTIsIGNvbEJ1aWxkZXJCYXNlXSkgPT4ge1xuICAgICAgY29uc3QgY29sQnVpbGRlciA9IGNvbEJ1aWxkZXJCYXNlO1xuICAgICAgY29sQnVpbGRlci5zZXROYW1lKG5hbWUyKTtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbEJ1aWxkZXIuYnVpbGRFeHRyYUNvbmZpZ0NvbHVtbihyYXdUYWJsZSk7XG4gICAgICByZXR1cm4gW25hbWUyLCBjb2x1bW5dO1xuICAgIH0pXG4gICk7XG4gIGNvbnN0IHRhYmxlID0gT2JqZWN0LmFzc2lnbihyYXdUYWJsZSwgYnVpbHRDb2x1bW5zKTtcbiAgdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdID0gYnVpbHRDb2x1bW5zO1xuICB0YWJsZVtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdDb2x1bW5zXSA9IGJ1aWx0Q29sdW1uc0ZvckV4dHJhQ29uZmlnO1xuICBpZiAoZXh0cmFDb25maWcpIHtcbiAgICB0YWJsZVtQZ1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0J1aWxkZXJdID0gZXh0cmFDb25maWc7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGFibGUsIHtcbiAgICBlbmFibGVSTFM6ICgpID0+IHtcbiAgICAgIHRhYmxlW1BnVGFibGUuU3ltYm9sLkVuYWJsZVJMU10gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH1cbiAgfSk7XG59XG5jb25zdCBwZ1RhYmxlID0gKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnKSA9PiB7XG4gIHJldHVybiBwZ1RhYmxlV2l0aFNjaGVtYShuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZywgdm9pZCAwKTtcbn07XG5mdW5jdGlvbiBwZ1RhYmxlQ3JlYXRvcihjdXN0b21pemVUYWJsZU5hbWUpIHtcbiAgcmV0dXJuIChuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZykgPT4ge1xuICAgIHJldHVybiBwZ1RhYmxlV2l0aFNjaGVtYShjdXN0b21pemVUYWJsZU5hbWUobmFtZSksIGNvbHVtbnMsIGV4dHJhQ29uZmlnLCB2b2lkIDAsIG5hbWUpO1xuICB9O1xufVxuZXhwb3J0IHtcbiAgRW5hYmxlUkxTLFxuICBJbmxpbmVGb3JlaWduS2V5cyxcbiAgUGdUYWJsZSxcbiAgcGdUYWJsZSxcbiAgcGdUYWJsZUNyZWF0b3IsXG4gIHBnVGFibGVXaXRoU2NoZW1hXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFibGUuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUGdUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5mdW5jdGlvbiBwcmltYXJ5S2V5KC4uLmNvbmZpZykge1xuICBpZiAoY29uZmlnWzBdLmNvbHVtbnMpIHtcbiAgICByZXR1cm4gbmV3IFByaW1hcnlLZXlCdWlsZGVyKGNvbmZpZ1swXS5jb2x1bW5zLCBjb25maWdbMF0ubmFtZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBQcmltYXJ5S2V5QnVpbGRlcihjb25maWcpO1xufVxuY2xhc3MgUHJpbWFyeUtleUJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ1ByaW1hcnlLZXlCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29sdW1ucztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBuYW1lO1xuICBjb25zdHJ1Y3Rvcihjb2x1bW5zLCBuYW1lKSB7XG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFByaW1hcnlLZXkodGFibGUsIHRoaXMuY29sdW1ucywgdGhpcy5uYW1lKTtcbiAgfVxufVxuY2xhc3MgUHJpbWFyeUtleSB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb2x1bW5zLCBuYW1lKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ1ByaW1hcnlLZXlcIjtcbiAgY29sdW1ucztcbiAgbmFtZTtcbiAgZ2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lID8/IGAke3RoaXMudGFibGVbUGdUYWJsZS5TeW1ib2wuTmFtZV19XyR7dGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSkuam9pbihcIl9cIil9X3BrYDtcbiAgfVxufVxuZXhwb3J0IHtcbiAgUHJpbWFyeUtleSxcbiAgUHJpbWFyeUtleUJ1aWxkZXIsXG4gIHByaW1hcnlLZXlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcmltYXJ5LWtleXMuanMubWFwIiwKICAgICJpbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi4vLi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBpcyB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlLmpzXCI7XG5pbXBvcnQge1xuICBpc0RyaXZlclZhbHVlRW5jb2RlcixcbiAgaXNTUUxXcmFwcGVyLFxuICBQYXJhbSxcbiAgUGxhY2Vob2xkZXIsXG4gIFNRTCxcbiAgc3FsLFxuICBTdHJpbmdDaHVuayxcbiAgVmlld1xufSBmcm9tIFwiLi4vc3FsLmpzXCI7XG5mdW5jdGlvbiBiaW5kSWZQYXJhbSh2YWx1ZSwgY29sdW1uKSB7XG4gIGlmIChpc0RyaXZlclZhbHVlRW5jb2Rlcihjb2x1bW4pICYmICFpc1NRTFdyYXBwZXIodmFsdWUpICYmICFpcyh2YWx1ZSwgUGFyYW0pICYmICFpcyh2YWx1ZSwgUGxhY2Vob2xkZXIpICYmICFpcyh2YWx1ZSwgQ29sdW1uKSAmJiAhaXModmFsdWUsIFRhYmxlKSAmJiAhaXModmFsdWUsIFZpZXcpKSB7XG4gICAgcmV0dXJuIG5ldyBQYXJhbSh2YWx1ZSwgY29sdW1uKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5jb25zdCBlcSA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPSAke2JpbmRJZlBhcmFtKHJpZ2h0LCBsZWZ0KX1gO1xufTtcbmNvbnN0IG5lID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIHJldHVybiBzcWxgJHtsZWZ0fSA8PiAke2JpbmRJZlBhcmFtKHJpZ2h0LCBsZWZ0KX1gO1xufTtcbmZ1bmN0aW9uIGFuZCguLi51bmZpbHRlcmVkQ29uZGl0aW9ucykge1xuICBjb25zdCBjb25kaXRpb25zID0gdW5maWx0ZXJlZENvbmRpdGlvbnMuZmlsdGVyKFxuICAgIChjKSA9PiBjICE9PSB2b2lkIDBcbiAgKTtcbiAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gbmV3IFNRTChjb25kaXRpb25zKTtcbiAgfVxuICByZXR1cm4gbmV3IFNRTChbXG4gICAgbmV3IFN0cmluZ0NodW5rKFwiKFwiKSxcbiAgICBzcWwuam9pbihjb25kaXRpb25zLCBuZXcgU3RyaW5nQ2h1bmsoXCIgYW5kIFwiKSksXG4gICAgbmV3IFN0cmluZ0NodW5rKFwiKVwiKVxuICBdKTtcbn1cbmZ1bmN0aW9uIG9yKC4uLnVuZmlsdGVyZWRDb25kaXRpb25zKSB7XG4gIGNvbnN0IGNvbmRpdGlvbnMgPSB1bmZpbHRlcmVkQ29uZGl0aW9ucy5maWx0ZXIoXG4gICAgKGMpID0+IGMgIT09IHZvaWQgMFxuICApO1xuICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBuZXcgU1FMKGNvbmRpdGlvbnMpO1xuICB9XG4gIHJldHVybiBuZXcgU1FMKFtcbiAgICBuZXcgU3RyaW5nQ2h1bmsoXCIoXCIpLFxuICAgIHNxbC5qb2luKGNvbmRpdGlvbnMsIG5ldyBTdHJpbmdDaHVuayhcIiBvciBcIikpLFxuICAgIG5ldyBTdHJpbmdDaHVuayhcIilcIilcbiAgXSk7XG59XG5mdW5jdGlvbiBub3QoY29uZGl0aW9uKSB7XG4gIHJldHVybiBzcWxgbm90ICR7Y29uZGl0aW9ufWA7XG59XG5jb25zdCBndCA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPiAke2JpbmRJZlBhcmFtKHJpZ2h0LCBsZWZ0KX1gO1xufTtcbmNvbnN0IGd0ZSA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPj0gJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5jb25zdCBsdCA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPCAke2JpbmRJZlBhcmFtKHJpZ2h0LCBsZWZ0KX1gO1xufTtcbmNvbnN0IGx0ZSA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gc3FsYCR7bGVmdH0gPD0gJHtiaW5kSWZQYXJhbShyaWdodCwgbGVmdCl9YDtcbn07XG5mdW5jdGlvbiBpbkFycmF5KGNvbHVtbiwgdmFsdWVzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHNxbGBmYWxzZWA7XG4gICAgfVxuICAgIHJldHVybiBzcWxgJHtjb2x1bW59IGluICR7dmFsdWVzLm1hcCgodikgPT4gYmluZElmUGFyYW0odiwgY29sdW1uKSl9YDtcbiAgfVxuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBpbiAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xufVxuZnVuY3Rpb24gbm90SW5BcnJheShjb2x1bW4sIHZhbHVlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBzcWxgdHJ1ZWA7XG4gICAgfVxuICAgIHJldHVybiBzcWxgJHtjb2x1bW59IG5vdCBpbiAke3ZhbHVlcy5tYXAoKHYpID0+IGJpbmRJZlBhcmFtKHYsIGNvbHVtbikpfWA7XG4gIH1cbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gbm90IGluICR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG59XG5mdW5jdGlvbiBpc051bGwodmFsdWUpIHtcbiAgcmV0dXJuIHNxbGAke3ZhbHVlfSBpcyBudWxsYDtcbn1cbmZ1bmN0aW9uIGlzTm90TnVsbCh2YWx1ZSkge1xuICByZXR1cm4gc3FsYCR7dmFsdWV9IGlzIG5vdCBudWxsYDtcbn1cbmZ1bmN0aW9uIGV4aXN0cyhzdWJxdWVyeSkge1xuICByZXR1cm4gc3FsYGV4aXN0cyAke3N1YnF1ZXJ5fWA7XG59XG5mdW5jdGlvbiBub3RFeGlzdHMoc3VicXVlcnkpIHtcbiAgcmV0dXJuIHNxbGBub3QgZXhpc3RzICR7c3VicXVlcnl9YDtcbn1cbmZ1bmN0aW9uIGJldHdlZW4oY29sdW1uLCBtaW4sIG1heCkge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBiZXR3ZWVuICR7YmluZElmUGFyYW0obWluLCBjb2x1bW4pfSBhbmQgJHtiaW5kSWZQYXJhbShcbiAgICBtYXgsXG4gICAgY29sdW1uXG4gICl9YDtcbn1cbmZ1bmN0aW9uIG5vdEJldHdlZW4oY29sdW1uLCBtaW4sIG1heCkge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBub3QgYmV0d2VlbiAke2JpbmRJZlBhcmFtKFxuICAgIG1pbixcbiAgICBjb2x1bW5cbiAgKX0gYW5kICR7YmluZElmUGFyYW0obWF4LCBjb2x1bW4pfWA7XG59XG5mdW5jdGlvbiBsaWtlKGNvbHVtbiwgdmFsdWUpIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gbGlrZSAke3ZhbHVlfWA7XG59XG5mdW5jdGlvbiBub3RMaWtlKGNvbHVtbiwgdmFsdWUpIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gbm90IGxpa2UgJHt2YWx1ZX1gO1xufVxuZnVuY3Rpb24gaWxpa2UoY29sdW1uLCB2YWx1ZSkge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBpbGlrZSAke3ZhbHVlfWA7XG59XG5mdW5jdGlvbiBub3RJbGlrZShjb2x1bW4sIHZhbHVlKSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IG5vdCBpbGlrZSAke3ZhbHVlfWA7XG59XG5mdW5jdGlvbiBhcnJheUNvbnRhaW5zKGNvbHVtbiwgdmFsdWVzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXJyYXlDb250YWlucyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdmFsdWVcIik7XG4gICAgfVxuICAgIGNvbnN0IGFycmF5ID0gc3FsYCR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG4gICAgcmV0dXJuIHNxbGAke2NvbHVtbn0gQD4gJHthcnJheX1gO1xuICB9XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IEA+ICR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG59XG5mdW5jdGlvbiBhcnJheUNvbnRhaW5lZChjb2x1bW4sIHZhbHVlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFycmF5Q29udGFpbmVkIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSB2YWx1ZVwiKTtcbiAgICB9XG4gICAgY29uc3QgYXJyYXkgPSBzcWxgJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbiAgICByZXR1cm4gc3FsYCR7Y29sdW1ufSA8QCAke2FycmF5fWA7XG4gIH1cbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gPEAgJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbn1cbmZ1bmN0aW9uIGFycmF5T3ZlcmxhcHMoY29sdW1uLCB2YWx1ZXMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhcnJheU92ZXJsYXBzIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSB2YWx1ZVwiKTtcbiAgICB9XG4gICAgY29uc3QgYXJyYXkgPSBzcWxgJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbiAgICByZXR1cm4gc3FsYCR7Y29sdW1ufSAmJiAke2FycmF5fWA7XG4gIH1cbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gJiYgJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbn1cbmV4cG9ydCB7XG4gIGFuZCxcbiAgYXJyYXlDb250YWluZWQsXG4gIGFycmF5Q29udGFpbnMsXG4gIGFycmF5T3ZlcmxhcHMsXG4gIGJldHdlZW4sXG4gIGJpbmRJZlBhcmFtLFxuICBlcSxcbiAgZXhpc3RzLFxuICBndCxcbiAgZ3RlLFxuICBpbGlrZSxcbiAgaW5BcnJheSxcbiAgaXNOb3ROdWxsLFxuICBpc051bGwsXG4gIGxpa2UsXG4gIGx0LFxuICBsdGUsXG4gIG5lLFxuICBub3QsXG4gIG5vdEJldHdlZW4sXG4gIG5vdEV4aXN0cyxcbiAgbm90SWxpa2UsXG4gIG5vdEluQXJyYXksXG4gIG5vdExpa2UsXG4gIG9yXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uZGl0aW9ucy5qcy5tYXAiLAogICAgImltcG9ydCB7IHNxbCB9IGZyb20gXCIuLi9zcWwuanNcIjtcbmZ1bmN0aW9uIGFzYyhjb2x1bW4pIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gYXNjYDtcbn1cbmZ1bmN0aW9uIGRlc2MoY29sdW1uKSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IGRlc2NgO1xufVxuZXhwb3J0IHtcbiAgYXNjLFxuICBkZXNjXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VsZWN0LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZ2V0VGFibGVVbmlxdWVOYW1lLCBUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBQcmltYXJ5S2V5QnVpbGRlciB9IGZyb20gXCIuL3BnLWNvcmUvcHJpbWFyeS1rZXlzLmpzXCI7XG5pbXBvcnQge1xuICBhbmQsXG4gIGFzYyxcbiAgYmV0d2VlbixcbiAgZGVzYyxcbiAgZXEsXG4gIGV4aXN0cyxcbiAgZ3QsXG4gIGd0ZSxcbiAgaWxpa2UsXG4gIGluQXJyYXksXG4gIGlzTm90TnVsbCxcbiAgaXNOdWxsLFxuICBsaWtlLFxuICBsdCxcbiAgbHRlLFxuICBuZSxcbiAgbm90LFxuICBub3RCZXR3ZWVuLFxuICBub3RFeGlzdHMsXG4gIG5vdElsaWtlLFxuICBub3RJbkFycmF5LFxuICBub3RMaWtlLFxuICBvclxufSBmcm9tIFwiLi9zcWwvZXhwcmVzc2lvbnMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNRTCwgc3FsIH0gZnJvbSBcIi4vc3FsL3NxbC5qc1wiO1xuY2xhc3MgUmVsYXRpb24ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2VUYWJsZSwgcmVmZXJlbmNlZFRhYmxlLCByZWxhdGlvbk5hbWUpIHtcbiAgICB0aGlzLnNvdXJjZVRhYmxlID0gc291cmNlVGFibGU7XG4gICAgdGhpcy5yZWZlcmVuY2VkVGFibGUgPSByZWZlcmVuY2VkVGFibGU7XG4gICAgdGhpcy5yZWxhdGlvbk5hbWUgPSByZWxhdGlvbk5hbWU7XG4gICAgdGhpcy5yZWZlcmVuY2VkVGFibGVOYW1lID0gcmVmZXJlbmNlZFRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJSZWxhdGlvblwiO1xuICByZWZlcmVuY2VkVGFibGVOYW1lO1xuICBmaWVsZE5hbWU7XG59XG5jbGFzcyBSZWxhdGlvbnMge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlJlbGF0aW9uc1wiO1xufVxuY2xhc3MgT25lIGV4dGVuZHMgUmVsYXRpb24ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2VUYWJsZSwgcmVmZXJlbmNlZFRhYmxlLCBjb25maWcsIGlzTnVsbGFibGUpIHtcbiAgICBzdXBlcihzb3VyY2VUYWJsZSwgcmVmZXJlbmNlZFRhYmxlLCBjb25maWc/LnJlbGF0aW9uTmFtZSk7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5pc051bGxhYmxlID0gaXNOdWxsYWJsZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJPbmVcIjtcbiAgd2l0aEZpZWxkTmFtZShmaWVsZE5hbWUpIHtcbiAgICBjb25zdCByZWxhdGlvbiA9IG5ldyBPbmUoXG4gICAgICB0aGlzLnNvdXJjZVRhYmxlLFxuICAgICAgdGhpcy5yZWZlcmVuY2VkVGFibGUsXG4gICAgICB0aGlzLmNvbmZpZyxcbiAgICAgIHRoaXMuaXNOdWxsYWJsZVxuICAgICk7XG4gICAgcmVsYXRpb24uZmllbGROYW1lID0gZmllbGROYW1lO1xuICAgIHJldHVybiByZWxhdGlvbjtcbiAgfVxufVxuY2xhc3MgTWFueSBleHRlbmRzIFJlbGF0aW9uIHtcbiAgY29uc3RydWN0b3Ioc291cmNlVGFibGUsIHJlZmVyZW5jZWRUYWJsZSwgY29uZmlnKSB7XG4gICAgc3VwZXIoc291cmNlVGFibGUsIHJlZmVyZW5jZWRUYWJsZSwgY29uZmlnPy5yZWxhdGlvbk5hbWUpO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIk1hbnlcIjtcbiAgd2l0aEZpZWxkTmFtZShmaWVsZE5hbWUpIHtcbiAgICBjb25zdCByZWxhdGlvbiA9IG5ldyBNYW55KFxuICAgICAgdGhpcy5zb3VyY2VUYWJsZSxcbiAgICAgIHRoaXMucmVmZXJlbmNlZFRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICAgIHJlbGF0aW9uLmZpZWxkTmFtZSA9IGZpZWxkTmFtZTtcbiAgICByZXR1cm4gcmVsYXRpb247XG4gIH1cbn1cbmZ1bmN0aW9uIGdldE9wZXJhdG9ycygpIHtcbiAgcmV0dXJuIHtcbiAgICBhbmQsXG4gICAgYmV0d2VlbixcbiAgICBlcSxcbiAgICBleGlzdHMsXG4gICAgZ3QsXG4gICAgZ3RlLFxuICAgIGlsaWtlLFxuICAgIGluQXJyYXksXG4gICAgaXNOdWxsLFxuICAgIGlzTm90TnVsbCxcbiAgICBsaWtlLFxuICAgIGx0LFxuICAgIGx0ZSxcbiAgICBuZSxcbiAgICBub3QsXG4gICAgbm90QmV0d2VlbixcbiAgICBub3RFeGlzdHMsXG4gICAgbm90TGlrZSxcbiAgICBub3RJbGlrZSxcbiAgICBub3RJbkFycmF5LFxuICAgIG9yLFxuICAgIHNxbFxuICB9O1xufVxuZnVuY3Rpb24gZ2V0T3JkZXJCeU9wZXJhdG9ycygpIHtcbiAgcmV0dXJuIHtcbiAgICBzcWwsXG4gICAgYXNjLFxuICAgIGRlc2NcbiAgfTtcbn1cbmZ1bmN0aW9uIGV4dHJhY3RUYWJsZXNSZWxhdGlvbmFsQ29uZmlnKHNjaGVtYSwgY29uZmlnSGVscGVycykge1xuICBpZiAoT2JqZWN0LmtleXMoc2NoZW1hKS5sZW5ndGggPT09IDEgJiYgXCJkZWZhdWx0XCIgaW4gc2NoZW1hICYmICFpcyhzY2hlbWFbXCJkZWZhdWx0XCJdLCBUYWJsZSkpIHtcbiAgICBzY2hlbWEgPSBzY2hlbWFbXCJkZWZhdWx0XCJdO1xuICB9XG4gIGNvbnN0IHRhYmxlTmFtZXNNYXAgPSB7fTtcbiAgY29uc3QgcmVsYXRpb25zQnVmZmVyID0ge307XG4gIGNvbnN0IHRhYmxlc0NvbmZpZyA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWEpKSB7XG4gICAgaWYgKGlzKHZhbHVlLCBUYWJsZSkpIHtcbiAgICAgIGNvbnN0IGRiTmFtZSA9IGdldFRhYmxlVW5pcXVlTmFtZSh2YWx1ZSk7XG4gICAgICBjb25zdCBidWZmZXJlZFJlbGF0aW9ucyA9IHJlbGF0aW9uc0J1ZmZlcltkYk5hbWVdO1xuICAgICAgdGFibGVOYW1lc01hcFtkYk5hbWVdID0ga2V5O1xuICAgICAgdGFibGVzQ29uZmlnW2tleV0gPSB7XG4gICAgICAgIHRzTmFtZToga2V5LFxuICAgICAgICBkYk5hbWU6IHZhbHVlW1RhYmxlLlN5bWJvbC5OYW1lXSxcbiAgICAgICAgc2NoZW1hOiB2YWx1ZVtUYWJsZS5TeW1ib2wuU2NoZW1hXSxcbiAgICAgICAgY29sdW1uczogdmFsdWVbVGFibGUuU3ltYm9sLkNvbHVtbnNdLFxuICAgICAgICByZWxhdGlvbnM6IGJ1ZmZlcmVkUmVsYXRpb25zPy5yZWxhdGlvbnMgPz8ge30sXG4gICAgICAgIHByaW1hcnlLZXk6IGJ1ZmZlcmVkUmVsYXRpb25zPy5wcmltYXJ5S2V5ID8/IFtdXG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgdmFsdWVbVGFibGUuU3ltYm9sLkNvbHVtbnNdXG4gICAgICApKSB7XG4gICAgICAgIGlmIChjb2x1bW4ucHJpbWFyeSkge1xuICAgICAgICAgIHRhYmxlc0NvbmZpZ1trZXldLnByaW1hcnlLZXkucHVzaChjb2x1bW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBleHRyYUNvbmZpZyA9IHZhbHVlW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0J1aWxkZXJdPy4odmFsdWVbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQ29sdW1uc10pO1xuICAgICAgaWYgKGV4dHJhQ29uZmlnKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29uZmlnRW50cnkgb2YgT2JqZWN0LnZhbHVlcyhleHRyYUNvbmZpZykpIHtcbiAgICAgICAgICBpZiAoaXMoY29uZmlnRW50cnksIFByaW1hcnlLZXlCdWlsZGVyKSkge1xuICAgICAgICAgICAgdGFibGVzQ29uZmlnW2tleV0ucHJpbWFyeUtleS5wdXNoKC4uLmNvbmZpZ0VudHJ5LmNvbHVtbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXModmFsdWUsIFJlbGF0aW9ucykpIHtcbiAgICAgIGNvbnN0IGRiTmFtZSA9IGdldFRhYmxlVW5pcXVlTmFtZSh2YWx1ZS50YWJsZSk7XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSB0YWJsZU5hbWVzTWFwW2RiTmFtZV07XG4gICAgICBjb25zdCByZWxhdGlvbnMyID0gdmFsdWUuY29uZmlnKFxuICAgICAgICBjb25maWdIZWxwZXJzKHZhbHVlLnRhYmxlKVxuICAgICAgKTtcbiAgICAgIGxldCBwcmltYXJ5S2V5O1xuICAgICAgZm9yIChjb25zdCBbcmVsYXRpb25OYW1lLCByZWxhdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMocmVsYXRpb25zMikpIHtcbiAgICAgICAgaWYgKHRhYmxlTmFtZSkge1xuICAgICAgICAgIGNvbnN0IHRhYmxlQ29uZmlnID0gdGFibGVzQ29uZmlnW3RhYmxlTmFtZV07XG4gICAgICAgICAgdGFibGVDb25maWcucmVsYXRpb25zW3JlbGF0aW9uTmFtZV0gPSByZWxhdGlvbjtcbiAgICAgICAgICBpZiAocHJpbWFyeUtleSkge1xuICAgICAgICAgICAgdGFibGVDb25maWcucHJpbWFyeUtleS5wdXNoKC4uLnByaW1hcnlLZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIShkYk5hbWUgaW4gcmVsYXRpb25zQnVmZmVyKSkge1xuICAgICAgICAgICAgcmVsYXRpb25zQnVmZmVyW2RiTmFtZV0gPSB7XG4gICAgICAgICAgICAgIHJlbGF0aW9uczoge30sXG4gICAgICAgICAgICAgIHByaW1hcnlLZXlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlbGF0aW9uc0J1ZmZlcltkYk5hbWVdLnJlbGF0aW9uc1tyZWxhdGlvbk5hbWVdID0gcmVsYXRpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgdGFibGVzOiB0YWJsZXNDb25maWcsIHRhYmxlTmFtZXNNYXAgfTtcbn1cbmZ1bmN0aW9uIHJlbGF0aW9ucyh0YWJsZSwgcmVsYXRpb25zMikge1xuICByZXR1cm4gbmV3IFJlbGF0aW9ucyhcbiAgICB0YWJsZSxcbiAgICAoaGVscGVycykgPT4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMocmVsYXRpb25zMihoZWxwZXJzKSkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZS53aXRoRmllbGROYW1lKGtleSlcbiAgICAgIF0pXG4gICAgKVxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlT25lKHNvdXJjZVRhYmxlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBvbmUodGFibGUsIGNvbmZpZykge1xuICAgIHJldHVybiBuZXcgT25lKFxuICAgICAgc291cmNlVGFibGUsXG4gICAgICB0YWJsZSxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGNvbmZpZz8uZmllbGRzLnJlZHVjZSgocmVzLCBmKSA9PiByZXMgJiYgZi5ub3ROdWxsLCB0cnVlKSA/PyBmYWxzZVxuICAgICk7XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVNYW55KHNvdXJjZVRhYmxlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBtYW55KHJlZmVyZW5jZWRUYWJsZSwgY29uZmlnKSB7XG4gICAgcmV0dXJuIG5ldyBNYW55KHNvdXJjZVRhYmxlLCByZWZlcmVuY2VkVGFibGUsIGNvbmZpZyk7XG4gIH07XG59XG5mdW5jdGlvbiBub3JtYWxpemVSZWxhdGlvbihzY2hlbWEsIHRhYmxlTmFtZXNNYXAsIHJlbGF0aW9uKSB7XG4gIGlmIChpcyhyZWxhdGlvbiwgT25lKSAmJiByZWxhdGlvbi5jb25maWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmllbGRzOiByZWxhdGlvbi5jb25maWcuZmllbGRzLFxuICAgICAgcmVmZXJlbmNlczogcmVsYXRpb24uY29uZmlnLnJlZmVyZW5jZXNcbiAgICB9O1xuICB9XG4gIGNvbnN0IHJlZmVyZW5jZWRUYWJsZVRzTmFtZSA9IHRhYmxlTmFtZXNNYXBbZ2V0VGFibGVVbmlxdWVOYW1lKHJlbGF0aW9uLnJlZmVyZW5jZWRUYWJsZSldO1xuICBpZiAoIXJlZmVyZW5jZWRUYWJsZVRzTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUYWJsZSBcIiR7cmVsYXRpb24ucmVmZXJlbmNlZFRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXX1cIiBub3QgZm91bmQgaW4gc2NoZW1hYFxuICAgICk7XG4gIH1cbiAgY29uc3QgcmVmZXJlbmNlZFRhYmxlQ29uZmlnID0gc2NoZW1hW3JlZmVyZW5jZWRUYWJsZVRzTmFtZV07XG4gIGlmICghcmVmZXJlbmNlZFRhYmxlQ29uZmlnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7cmVmZXJlbmNlZFRhYmxlVHNOYW1lfVwiIG5vdCBmb3VuZCBpbiBzY2hlbWFgKTtcbiAgfVxuICBjb25zdCBzb3VyY2VUYWJsZSA9IHJlbGF0aW9uLnNvdXJjZVRhYmxlO1xuICBjb25zdCBzb3VyY2VUYWJsZVRzTmFtZSA9IHRhYmxlTmFtZXNNYXBbZ2V0VGFibGVVbmlxdWVOYW1lKHNvdXJjZVRhYmxlKV07XG4gIGlmICghc291cmNlVGFibGVUc05hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGFibGUgXCIke3NvdXJjZVRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXX1cIiBub3QgZm91bmQgaW4gc2NoZW1hYFxuICAgICk7XG4gIH1cbiAgY29uc3QgcmV2ZXJzZVJlbGF0aW9ucyA9IFtdO1xuICBmb3IgKGNvbnN0IHJlZmVyZW5jZWRUYWJsZVJlbGF0aW9uIG9mIE9iamVjdC52YWx1ZXMoXG4gICAgcmVmZXJlbmNlZFRhYmxlQ29uZmlnLnJlbGF0aW9uc1xuICApKSB7XG4gICAgaWYgKHJlbGF0aW9uLnJlbGF0aW9uTmFtZSAmJiByZWxhdGlvbiAhPT0gcmVmZXJlbmNlZFRhYmxlUmVsYXRpb24gJiYgcmVmZXJlbmNlZFRhYmxlUmVsYXRpb24ucmVsYXRpb25OYW1lID09PSByZWxhdGlvbi5yZWxhdGlvbk5hbWUgfHwgIXJlbGF0aW9uLnJlbGF0aW9uTmFtZSAmJiByZWZlcmVuY2VkVGFibGVSZWxhdGlvbi5yZWZlcmVuY2VkVGFibGUgPT09IHJlbGF0aW9uLnNvdXJjZVRhYmxlKSB7XG4gICAgICByZXZlcnNlUmVsYXRpb25zLnB1c2gocmVmZXJlbmNlZFRhYmxlUmVsYXRpb24pO1xuICAgIH1cbiAgfVxuICBpZiAocmV2ZXJzZVJlbGF0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgdGhyb3cgcmVsYXRpb24ucmVsYXRpb25OYW1lID8gbmV3IEVycm9yKFxuICAgICAgYFRoZXJlIGFyZSBtdWx0aXBsZSByZWxhdGlvbnMgd2l0aCBuYW1lIFwiJHtyZWxhdGlvbi5yZWxhdGlvbk5hbWV9XCIgaW4gdGFibGUgXCIke3JlZmVyZW5jZWRUYWJsZVRzTmFtZX1cImBcbiAgICApIDogbmV3IEVycm9yKFxuICAgICAgYFRoZXJlIGFyZSBtdWx0aXBsZSByZWxhdGlvbnMgYmV0d2VlbiBcIiR7cmVmZXJlbmNlZFRhYmxlVHNOYW1lfVwiIGFuZCBcIiR7cmVsYXRpb24uc291cmNlVGFibGVbVGFibGUuU3ltYm9sLk5hbWVdfVwiLiBQbGVhc2Ugc3BlY2lmeSByZWxhdGlvbiBuYW1lYFxuICAgICk7XG4gIH1cbiAgaWYgKHJldmVyc2VSZWxhdGlvbnNbMF0gJiYgaXMocmV2ZXJzZVJlbGF0aW9uc1swXSwgT25lKSAmJiByZXZlcnNlUmVsYXRpb25zWzBdLmNvbmZpZykge1xuICAgIHJldHVybiB7XG4gICAgICBmaWVsZHM6IHJldmVyc2VSZWxhdGlvbnNbMF0uY29uZmlnLnJlZmVyZW5jZXMsXG4gICAgICByZWZlcmVuY2VzOiByZXZlcnNlUmVsYXRpb25zWzBdLmNvbmZpZy5maWVsZHNcbiAgICB9O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgVGhlcmUgaXMgbm90IGVub3VnaCBpbmZvcm1hdGlvbiB0byBpbmZlciByZWxhdGlvbiBcIiR7c291cmNlVGFibGVUc05hbWV9LiR7cmVsYXRpb24uZmllbGROYW1lfVwiYFxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlVGFibGVSZWxhdGlvbnNIZWxwZXJzKHNvdXJjZVRhYmxlKSB7XG4gIHJldHVybiB7XG4gICAgb25lOiBjcmVhdGVPbmUoc291cmNlVGFibGUpLFxuICAgIG1hbnk6IGNyZWF0ZU1hbnkoc291cmNlVGFibGUpXG4gIH07XG59XG5mdW5jdGlvbiBtYXBSZWxhdGlvbmFsUm93KHRhYmxlc0NvbmZpZywgdGFibGVDb25maWcsIHJvdywgYnVpbGRRdWVyeVJlc3VsdFNlbGVjdGlvbiwgbWFwQ29sdW1uVmFsdWUgPSAodmFsdWUpID0+IHZhbHVlKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBmb3IgKGNvbnN0IFtcbiAgICBzZWxlY3Rpb25JdGVtSW5kZXgsXG4gICAgc2VsZWN0aW9uSXRlbVxuICBdIG9mIGJ1aWxkUXVlcnlSZXN1bHRTZWxlY3Rpb24uZW50cmllcygpKSB7XG4gICAgaWYgKHNlbGVjdGlvbkl0ZW0uaXNKc29uKSB7XG4gICAgICBjb25zdCByZWxhdGlvbiA9IHRhYmxlQ29uZmlnLnJlbGF0aW9uc1tzZWxlY3Rpb25JdGVtLnRzS2V5XTtcbiAgICAgIGNvbnN0IHJhd1N1YlJvd3MgPSByb3dbc2VsZWN0aW9uSXRlbUluZGV4XTtcbiAgICAgIGNvbnN0IHN1YlJvd3MgPSB0eXBlb2YgcmF3U3ViUm93cyA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2UocmF3U3ViUm93cykgOiByYXdTdWJSb3dzO1xuICAgICAgcmVzdWx0W3NlbGVjdGlvbkl0ZW0udHNLZXldID0gaXMocmVsYXRpb24sIE9uZSkgPyBzdWJSb3dzICYmIG1hcFJlbGF0aW9uYWxSb3coXG4gICAgICAgIHRhYmxlc0NvbmZpZyxcbiAgICAgICAgdGFibGVzQ29uZmlnW3NlbGVjdGlvbkl0ZW0ucmVsYXRpb25UYWJsZVRzS2V5XSxcbiAgICAgICAgc3ViUm93cyxcbiAgICAgICAgc2VsZWN0aW9uSXRlbS5zZWxlY3Rpb24sXG4gICAgICAgIG1hcENvbHVtblZhbHVlXG4gICAgICApIDogc3ViUm93cy5tYXAoXG4gICAgICAgIChzdWJSb3cpID0+IG1hcFJlbGF0aW9uYWxSb3coXG4gICAgICAgICAgdGFibGVzQ29uZmlnLFxuICAgICAgICAgIHRhYmxlc0NvbmZpZ1tzZWxlY3Rpb25JdGVtLnJlbGF0aW9uVGFibGVUc0tleV0sXG4gICAgICAgICAgc3ViUm93LFxuICAgICAgICAgIHNlbGVjdGlvbkl0ZW0uc2VsZWN0aW9uLFxuICAgICAgICAgIG1hcENvbHVtblZhbHVlXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gbWFwQ29sdW1uVmFsdWUocm93W3NlbGVjdGlvbkl0ZW1JbmRleF0pO1xuICAgICAgY29uc3QgZmllbGQgPSBzZWxlY3Rpb25JdGVtLmZpZWxkO1xuICAgICAgbGV0IGRlY29kZXI7XG4gICAgICBpZiAoaXMoZmllbGQsIENvbHVtbikpIHtcbiAgICAgICAgZGVjb2RlciA9IGZpZWxkO1xuICAgICAgfSBlbHNlIGlmIChpcyhmaWVsZCwgU1FMKSkge1xuICAgICAgICBkZWNvZGVyID0gZmllbGQuZGVjb2RlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlY29kZXIgPSBmaWVsZC5zcWwuZGVjb2RlcjtcbiAgICAgIH1cbiAgICAgIHJlc3VsdFtzZWxlY3Rpb25JdGVtLnRzS2V5XSA9IHZhbHVlID09PSBudWxsID8gbnVsbCA6IGRlY29kZXIubWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCB7XG4gIE1hbnksXG4gIE9uZSxcbiAgUmVsYXRpb24sXG4gIFJlbGF0aW9ucyxcbiAgY3JlYXRlTWFueSxcbiAgY3JlYXRlT25lLFxuICBjcmVhdGVUYWJsZVJlbGF0aW9uc0hlbHBlcnMsXG4gIGV4dHJhY3RUYWJsZXNSZWxhdGlvbmFsQ29uZmlnLFxuICBnZXRPcGVyYXRvcnMsXG4gIGdldE9yZGVyQnlPcGVyYXRvcnMsXG4gIG1hcFJlbGF0aW9uYWxSb3csXG4gIG5vcm1hbGl6ZVJlbGF0aW9uLFxuICByZWxhdGlvbnNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWxhdGlvbnMuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVmlldyB9IGZyb20gXCIuLi9zcWwvc3FsLmpzXCI7XG5jbGFzcyBTUUxpdGVWaWV3QmFzZSBleHRlbmRzIFZpZXcge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVWaWV3QmFzZVwiO1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlVmlld0Jhc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD12aWV3LWJhc2UuanMubWFwIiwKICAgICJpbXBvcnQgeyBhbGlhc2VkVGFibGUsIGFsaWFzZWRUYWJsZUNvbHVtbiwgbWFwQ29sdW1uc0luQWxpYXNlZFNRTFRvQWxpYXMsIG1hcENvbHVtbnNJblNRTFRvQWxpYXMgfSBmcm9tIFwiLi4vYWxpYXMuanNcIjtcbmltcG9ydCB7IENhc2luZ0NhY2hlIH0gZnJvbSBcIi4uL2Nhc2luZy5qc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBEcml6emxlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQge1xuICBnZXRPcGVyYXRvcnMsXG4gIGdldE9yZGVyQnlPcGVyYXRvcnMsXG4gIE1hbnksXG4gIG5vcm1hbGl6ZVJlbGF0aW9uLFxuICBPbmVcbn0gZnJvbSBcIi4uL3JlbGF0aW9ucy5qc1wiO1xuaW1wb3J0IHsgYW5kLCBlcSB9IGZyb20gXCIuLi9zcWwvaW5kZXguanNcIjtcbmltcG9ydCB7IFBhcmFtLCBTUUwsIHNxbCB9IGZyb20gXCIuLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4gfSBmcm9tIFwiLi9jb2x1bW5zL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVUYWJsZSB9IGZyb20gXCIuL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBTdWJxdWVyeSB9IGZyb20gXCIuLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgZ2V0VGFibGVOYW1lLCBnZXRUYWJsZVVuaXF1ZU5hbWUsIFRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBvcmRlclNlbGVjdGVkRmllbGRzIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuLi92aWV3LWNvbW1vbi5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVmlld0Jhc2UgfSBmcm9tIFwiLi92aWV3LWJhc2UuanNcIjtcbmNsYXNzIFNRTGl0ZURpYWxlY3Qge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVEaWFsZWN0XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY2FzaW5nO1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLmNhc2luZyA9IG5ldyBDYXNpbmdDYWNoZShjb25maWc/LmNhc2luZyk7XG4gIH1cbiAgZXNjYXBlTmFtZShuYW1lKSB7XG4gICAgcmV0dXJuIGBcIiR7bmFtZX1cImA7XG4gIH1cbiAgZXNjYXBlUGFyYW0oX251bSkge1xuICAgIHJldHVybiBcIj9cIjtcbiAgfVxuICBlc2NhcGVTdHJpbmcoc3RyKSB7XG4gICAgcmV0dXJuIGAnJHtzdHIucmVwbGFjZSgvJy9nLCBcIicnXCIpfSdgO1xuICB9XG4gIGJ1aWxkV2l0aENURShxdWVyaWVzKSB7XG4gICAgaWYgKCFxdWVyaWVzPy5sZW5ndGgpIHJldHVybiB2b2lkIDA7XG4gICAgY29uc3Qgd2l0aFNxbENodW5rcyA9IFtzcWxgd2l0aCBgXTtcbiAgICBmb3IgKGNvbnN0IFtpLCB3XSBvZiBxdWVyaWVzLmVudHJpZXMoKSkge1xuICAgICAgd2l0aFNxbENodW5rcy5wdXNoKHNxbGAke3NxbC5pZGVudGlmaWVyKHcuXy5hbGlhcyl9IGFzICgke3cuXy5zcWx9KWApO1xuICAgICAgaWYgKGkgPCBxdWVyaWVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgd2l0aFNxbENodW5rcy5wdXNoKHNxbGAsIGApO1xuICAgICAgfVxuICAgIH1cbiAgICB3aXRoU3FsQ2h1bmtzLnB1c2goc3FsYCBgKTtcbiAgICByZXR1cm4gc3FsLmpvaW4od2l0aFNxbENodW5rcyk7XG4gIH1cbiAgYnVpbGREZWxldGVRdWVyeSh7IHRhYmxlLCB3aGVyZSwgcmV0dXJuaW5nLCB3aXRoTGlzdCwgbGltaXQsIG9yZGVyQnkgfSkge1xuICAgIGNvbnN0IHdpdGhTcWwgPSB0aGlzLmJ1aWxkV2l0aENURSh3aXRoTGlzdCk7XG4gICAgY29uc3QgcmV0dXJuaW5nU3FsID0gcmV0dXJuaW5nID8gc3FsYCByZXR1cm5pbmcgJHt0aGlzLmJ1aWxkU2VsZWN0aW9uKHJldHVybmluZywgeyBpc1NpbmdsZVRhYmxlOiB0cnVlIH0pfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgd2hlcmVTcWwgPSB3aGVyZSA/IHNxbGAgd2hlcmUgJHt3aGVyZX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IG9yZGVyQnlTcWwgPSB0aGlzLmJ1aWxkT3JkZXJCeShvcmRlckJ5KTtcbiAgICBjb25zdCBsaW1pdFNxbCA9IHRoaXMuYnVpbGRMaW1pdChsaW1pdCk7XG4gICAgcmV0dXJuIHNxbGAke3dpdGhTcWx9ZGVsZXRlIGZyb20gJHt0YWJsZX0ke3doZXJlU3FsfSR7cmV0dXJuaW5nU3FsfSR7b3JkZXJCeVNxbH0ke2xpbWl0U3FsfWA7XG4gIH1cbiAgYnVpbGRVcGRhdGVTZXQodGFibGUsIHNldCkge1xuICAgIGNvbnN0IHRhYmxlQ29sdW1ucyA9IHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXTtcbiAgICBjb25zdCBjb2x1bW5OYW1lcyA9IE9iamVjdC5rZXlzKHRhYmxlQ29sdW1ucykuZmlsdGVyKFxuICAgICAgKGNvbE5hbWUpID0+IHNldFtjb2xOYW1lXSAhPT0gdm9pZCAwIHx8IHRhYmxlQ29sdW1uc1tjb2xOYW1lXT8ub25VcGRhdGVGbiAhPT0gdm9pZCAwXG4gICAgKTtcbiAgICBjb25zdCBzZXRTaXplID0gY29sdW1uTmFtZXMubGVuZ3RoO1xuICAgIHJldHVybiBzcWwuam9pbihjb2x1bW5OYW1lcy5mbGF0TWFwKChjb2xOYW1lLCBpKSA9PiB7XG4gICAgICBjb25zdCBjb2wgPSB0YWJsZUNvbHVtbnNbY29sTmFtZV07XG4gICAgICBjb25zdCB2YWx1ZSA9IHNldFtjb2xOYW1lXSA/PyBzcWwucGFyYW0oY29sLm9uVXBkYXRlRm4oKSwgY29sKTtcbiAgICAgIGNvbnN0IHJlcyA9IHNxbGAke3NxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhjb2wpKX0gPSAke3ZhbHVlfWA7XG4gICAgICBpZiAoaSA8IHNldFNpemUgLSAxKSB7XG4gICAgICAgIHJldHVybiBbcmVzLCBzcWwucmF3KFwiLCBcIildO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtyZXNdO1xuICAgIH0pKTtcbiAgfVxuICBidWlsZFVwZGF0ZVF1ZXJ5KHsgdGFibGUsIHNldCwgd2hlcmUsIHJldHVybmluZywgd2l0aExpc3QsIGpvaW5zLCBmcm9tLCBsaW1pdCwgb3JkZXJCeSB9KSB7XG4gICAgY29uc3Qgd2l0aFNxbCA9IHRoaXMuYnVpbGRXaXRoQ1RFKHdpdGhMaXN0KTtcbiAgICBjb25zdCBzZXRTcWwgPSB0aGlzLmJ1aWxkVXBkYXRlU2V0KHRhYmxlLCBzZXQpO1xuICAgIGNvbnN0IGZyb21TcWwgPSBmcm9tICYmIHNxbC5qb2luKFtzcWwucmF3KFwiIGZyb20gXCIpLCB0aGlzLmJ1aWxkRnJvbVRhYmxlKGZyb20pXSk7XG4gICAgY29uc3Qgam9pbnNTcWwgPSB0aGlzLmJ1aWxkSm9pbnMoam9pbnMpO1xuICAgIGNvbnN0IHJldHVybmluZ1NxbCA9IHJldHVybmluZyA/IHNxbGAgcmV0dXJuaW5nICR7dGhpcy5idWlsZFNlbGVjdGlvbihyZXR1cm5pbmcsIHsgaXNTaW5nbGVUYWJsZTogdHJ1ZSB9KX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IHdoZXJlU3FsID0gd2hlcmUgPyBzcWxgIHdoZXJlICR7d2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBvcmRlckJ5U3FsID0gdGhpcy5idWlsZE9yZGVyQnkob3JkZXJCeSk7XG4gICAgY29uc3QgbGltaXRTcWwgPSB0aGlzLmJ1aWxkTGltaXQobGltaXQpO1xuICAgIHJldHVybiBzcWxgJHt3aXRoU3FsfXVwZGF0ZSAke3RhYmxlfSBzZXQgJHtzZXRTcWx9JHtmcm9tU3FsfSR7am9pbnNTcWx9JHt3aGVyZVNxbH0ke3JldHVybmluZ1NxbH0ke29yZGVyQnlTcWx9JHtsaW1pdFNxbH1gO1xuICB9XG4gIC8qKlxuICAgKiBCdWlsZHMgc2VsZWN0aW9uIFNRTCB3aXRoIHByb3ZpZGVkIGZpZWxkcy9leHByZXNzaW9uc1xuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICpcbiAgICogYHNlbGVjdCA8c2VsZWN0aW9uPiBmcm9tYFxuICAgKlxuICAgKiBgaW5zZXJ0IC4uLiByZXR1cm5pbmcgPHNlbGVjdGlvbj5gXG4gICAqXG4gICAqIElmIGBpc1NpbmdsZVRhYmxlYCBpcyB0cnVlLCB0aGVuIGNvbHVtbnMgd29uJ3QgYmUgcHJlZml4ZWQgd2l0aCB0YWJsZSBuYW1lXG4gICAqL1xuICBidWlsZFNlbGVjdGlvbihmaWVsZHMsIHsgaXNTaW5nbGVUYWJsZSA9IGZhbHNlIH0gPSB7fSkge1xuICAgIGNvbnN0IGNvbHVtbnNMZW4gPSBmaWVsZHMubGVuZ3RoO1xuICAgIGNvbnN0IGNodW5rcyA9IGZpZWxkcy5mbGF0TWFwKCh7IGZpZWxkIH0sIGkpID0+IHtcbiAgICAgIGNvbnN0IGNodW5rID0gW107XG4gICAgICBpZiAoaXMoZmllbGQsIFNRTC5BbGlhc2VkKSAmJiBmaWVsZC5pc1NlbGVjdGlvbkZpZWxkKSB7XG4gICAgICAgIGNodW5rLnB1c2goc3FsLmlkZW50aWZpZXIoZmllbGQuZmllbGRBbGlhcykpO1xuICAgICAgfSBlbHNlIGlmIChpcyhmaWVsZCwgU1FMLkFsaWFzZWQpIHx8IGlzKGZpZWxkLCBTUUwpKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaXMoZmllbGQsIFNRTC5BbGlhc2VkKSA/IGZpZWxkLnNxbCA6IGZpZWxkO1xuICAgICAgICBpZiAoaXNTaW5nbGVUYWJsZSkge1xuICAgICAgICAgIGNodW5rLnB1c2goXG4gICAgICAgICAgICBuZXcgU1FMKFxuICAgICAgICAgICAgICBxdWVyeS5xdWVyeUNodW5rcy5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXMoYywgQ29sdW1uKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHNxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhjKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2h1bmsucHVzaChxdWVyeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzKGZpZWxkLCBTUUwuQWxpYXNlZCkpIHtcbiAgICAgICAgICBjaHVuay5wdXNoKHNxbGAgYXMgJHtzcWwuaWRlbnRpZmllcihmaWVsZC5maWVsZEFsaWFzKX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpcyhmaWVsZCwgQ29sdW1uKSkge1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBmaWVsZC50YWJsZVtUYWJsZS5TeW1ib2wuTmFtZV07XG4gICAgICAgIGlmIChmaWVsZC5jb2x1bW5UeXBlID09PSBcIlNRTGl0ZU51bWVyaWNCaWdJbnRcIikge1xuICAgICAgICAgIGlmIChpc1NpbmdsZVRhYmxlKSB7XG4gICAgICAgICAgICBjaHVuay5wdXNoKHNxbGBjYXN0KCR7c3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGZpZWxkKSl9IGFzIHRleHQpYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNodW5rLnB1c2goXG4gICAgICAgICAgICAgIHNxbGBjYXN0KCR7c3FsLmlkZW50aWZpZXIodGFibGVOYW1lKX0uJHtzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoZmllbGQpKX0gYXMgdGV4dClgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaXNTaW5nbGVUYWJsZSkge1xuICAgICAgICAgICAgY2h1bmsucHVzaChzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoZmllbGQpKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNodW5rLnB1c2goc3FsYCR7c3FsLmlkZW50aWZpZXIodGFibGVOYW1lKX0uJHtzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoZmllbGQpKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpIDwgY29sdW1uc0xlbiAtIDEpIHtcbiAgICAgICAgY2h1bmsucHVzaChzcWxgLCBgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaHVuaztcbiAgICB9KTtcbiAgICByZXR1cm4gc3FsLmpvaW4oY2h1bmtzKTtcbiAgfVxuICBidWlsZEpvaW5zKGpvaW5zKSB7XG4gICAgaWYgKCFqb2lucyB8fCBqb2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICAgIGNvbnN0IGpvaW5zQXJyYXkgPSBbXTtcbiAgICBpZiAoam9pbnMpIHtcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBqb2luTWV0YV0gb2Ygam9pbnMuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgIGpvaW5zQXJyYXkucHVzaChzcWxgIGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhYmxlID0gam9pbk1ldGEudGFibGU7XG4gICAgICAgIGNvbnN0IG9uU3FsID0gam9pbk1ldGEub24gPyBzcWxgIG9uICR7am9pbk1ldGEub259YCA6IHZvaWQgMDtcbiAgICAgICAgaWYgKGlzKHRhYmxlLCBTUUxpdGVUYWJsZSkpIHtcbiAgICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSB0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuTmFtZV07XG4gICAgICAgICAgY29uc3QgdGFibGVTY2hlbWEgPSB0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuU2NoZW1hXTtcbiAgICAgICAgICBjb25zdCBvcmlnVGFibGVOYW1lID0gdGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLk9yaWdpbmFsTmFtZV07XG4gICAgICAgICAgY29uc3QgYWxpYXMgPSB0YWJsZU5hbWUgPT09IG9yaWdUYWJsZU5hbWUgPyB2b2lkIDAgOiBqb2luTWV0YS5hbGlhcztcbiAgICAgICAgICBqb2luc0FycmF5LnB1c2goXG4gICAgICAgICAgICBzcWxgJHtzcWwucmF3KGpvaW5NZXRhLmpvaW5UeXBlKX0gam9pbiAke3RhYmxlU2NoZW1hID8gc3FsYCR7c3FsLmlkZW50aWZpZXIodGFibGVTY2hlbWEpfS5gIDogdm9pZCAwfSR7c3FsLmlkZW50aWZpZXIob3JpZ1RhYmxlTmFtZSl9JHthbGlhcyAmJiBzcWxgICR7c3FsLmlkZW50aWZpZXIoYWxpYXMpfWB9JHtvblNxbH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqb2luc0FycmF5LnB1c2goXG4gICAgICAgICAgICBzcWxgJHtzcWwucmF3KGpvaW5NZXRhLmpvaW5UeXBlKX0gam9pbiAke3RhYmxlfSR7b25TcWx9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluZGV4IDwgam9pbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGpvaW5zQXJyYXkucHVzaChzcWxgIGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcWwuam9pbihqb2luc0FycmF5KTtcbiAgfVxuICBidWlsZExpbWl0KGxpbWl0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBsaW1pdCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgbGltaXQgPT09IFwibnVtYmVyXCIgJiYgbGltaXQgPj0gMCA/IHNxbGAgbGltaXQgJHtsaW1pdH1gIDogdm9pZCAwO1xuICB9XG4gIGJ1aWxkT3JkZXJCeShvcmRlckJ5KSB7XG4gICAgY29uc3Qgb3JkZXJCeUxpc3QgPSBbXTtcbiAgICBpZiAob3JkZXJCeSkge1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIG9yZGVyQnlWYWx1ZV0gb2Ygb3JkZXJCeS5lbnRyaWVzKCkpIHtcbiAgICAgICAgb3JkZXJCeUxpc3QucHVzaChvcmRlckJ5VmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPCBvcmRlckJ5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBvcmRlckJ5TGlzdC5wdXNoKHNxbGAsIGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvcmRlckJ5TGlzdC5sZW5ndGggPiAwID8gc3FsYCBvcmRlciBieSAke3NxbC5qb2luKG9yZGVyQnlMaXN0KX1gIDogdm9pZCAwO1xuICB9XG4gIGJ1aWxkRnJvbVRhYmxlKHRhYmxlKSB7XG4gICAgaWYgKGlzKHRhYmxlLCBUYWJsZSkgJiYgdGFibGVbVGFibGUuU3ltYm9sLklzQWxpYXNdKSB7XG4gICAgICByZXR1cm4gc3FsYCR7c3FsYCR7c3FsLmlkZW50aWZpZXIodGFibGVbVGFibGUuU3ltYm9sLlNjaGVtYV0gPz8gXCJcIil9LmAuaWYodGFibGVbVGFibGUuU3ltYm9sLlNjaGVtYV0pfSR7c3FsLmlkZW50aWZpZXIodGFibGVbVGFibGUuU3ltYm9sLk9yaWdpbmFsTmFtZV0pfSAke3NxbC5pZGVudGlmaWVyKHRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHRhYmxlO1xuICB9XG4gIGJ1aWxkU2VsZWN0UXVlcnkoe1xuICAgIHdpdGhMaXN0LFxuICAgIGZpZWxkcyxcbiAgICBmaWVsZHNGbGF0LFxuICAgIHdoZXJlLFxuICAgIGhhdmluZyxcbiAgICB0YWJsZSxcbiAgICBqb2lucyxcbiAgICBvcmRlckJ5LFxuICAgIGdyb3VwQnksXG4gICAgbGltaXQsXG4gICAgb2Zmc2V0LFxuICAgIGRpc3RpbmN0LFxuICAgIHNldE9wZXJhdG9yc1xuICB9KSB7XG4gICAgY29uc3QgZmllbGRzTGlzdCA9IGZpZWxkc0ZsYXQgPz8gb3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZHMpO1xuICAgIGZvciAoY29uc3QgZiBvZiBmaWVsZHNMaXN0KSB7XG4gICAgICBpZiAoaXMoZi5maWVsZCwgQ29sdW1uKSAmJiBnZXRUYWJsZU5hbWUoZi5maWVsZC50YWJsZSkgIT09IChpcyh0YWJsZSwgU3VicXVlcnkpID8gdGFibGUuXy5hbGlhcyA6IGlzKHRhYmxlLCBTUUxpdGVWaWV3QmFzZSkgPyB0YWJsZVtWaWV3QmFzZUNvbmZpZ10ubmFtZSA6IGlzKHRhYmxlLCBTUUwpID8gdm9pZCAwIDogZ2V0VGFibGVOYW1lKHRhYmxlKSkgJiYgISgodGFibGUyKSA9PiBqb2lucz8uc29tZShcbiAgICAgICAgKHsgYWxpYXMgfSkgPT4gYWxpYXMgPT09ICh0YWJsZTJbVGFibGUuU3ltYm9sLklzQWxpYXNdID8gZ2V0VGFibGVOYW1lKHRhYmxlMikgOiB0YWJsZTJbVGFibGUuU3ltYm9sLkJhc2VOYW1lXSlcbiAgICAgICkpKGYuZmllbGQudGFibGUpKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGdldFRhYmxlTmFtZShmLmZpZWxkLnRhYmxlKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBZb3VyIFwiJHtmLnBhdGguam9pbihcIi0+XCIpfVwiIGZpZWxkIHJlZmVyZW5jZXMgYSBjb2x1bW4gXCIke3RhYmxlTmFtZX1cIi5cIiR7Zi5maWVsZC5uYW1lfVwiLCBidXQgdGhlIHRhYmxlIFwiJHt0YWJsZU5hbWV9XCIgaXMgbm90IHBhcnQgb2YgdGhlIHF1ZXJ5ISBEaWQgeW91IGZvcmdldCB0byBqb2luIGl0P2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaXNTaW5nbGVUYWJsZSA9ICFqb2lucyB8fCBqb2lucy5sZW5ndGggPT09IDA7XG4gICAgY29uc3Qgd2l0aFNxbCA9IHRoaXMuYnVpbGRXaXRoQ1RFKHdpdGhMaXN0KTtcbiAgICBjb25zdCBkaXN0aW5jdFNxbCA9IGRpc3RpbmN0ID8gc3FsYCBkaXN0aW5jdGAgOiB2b2lkIDA7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5idWlsZFNlbGVjdGlvbihmaWVsZHNMaXN0LCB7IGlzU2luZ2xlVGFibGUgfSk7XG4gICAgY29uc3QgdGFibGVTcWwgPSB0aGlzLmJ1aWxkRnJvbVRhYmxlKHRhYmxlKTtcbiAgICBjb25zdCBqb2luc1NxbCA9IHRoaXMuYnVpbGRKb2lucyhqb2lucyk7XG4gICAgY29uc3Qgd2hlcmVTcWwgPSB3aGVyZSA/IHNxbGAgd2hlcmUgJHt3aGVyZX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IGhhdmluZ1NxbCA9IGhhdmluZyA/IHNxbGAgaGF2aW5nICR7aGF2aW5nfWAgOiB2b2lkIDA7XG4gICAgY29uc3QgZ3JvdXBCeUxpc3QgPSBbXTtcbiAgICBpZiAoZ3JvdXBCeSkge1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGdyb3VwQnlWYWx1ZV0gb2YgZ3JvdXBCeS5lbnRyaWVzKCkpIHtcbiAgICAgICAgZ3JvdXBCeUxpc3QucHVzaChncm91cEJ5VmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPCBncm91cEJ5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBncm91cEJ5TGlzdC5wdXNoKHNxbGAsIGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGdyb3VwQnlTcWwgPSBncm91cEJ5TGlzdC5sZW5ndGggPiAwID8gc3FsYCBncm91cCBieSAke3NxbC5qb2luKGdyb3VwQnlMaXN0KX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IG9yZGVyQnlTcWwgPSB0aGlzLmJ1aWxkT3JkZXJCeShvcmRlckJ5KTtcbiAgICBjb25zdCBsaW1pdFNxbCA9IHRoaXMuYnVpbGRMaW1pdChsaW1pdCk7XG4gICAgY29uc3Qgb2Zmc2V0U3FsID0gb2Zmc2V0ID8gc3FsYCBvZmZzZXQgJHtvZmZzZXR9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBmaW5hbFF1ZXJ5ID0gc3FsYCR7d2l0aFNxbH1zZWxlY3Qke2Rpc3RpbmN0U3FsfSAke3NlbGVjdGlvbn0gZnJvbSAke3RhYmxlU3FsfSR7am9pbnNTcWx9JHt3aGVyZVNxbH0ke2dyb3VwQnlTcWx9JHtoYXZpbmdTcWx9JHtvcmRlckJ5U3FsfSR7bGltaXRTcWx9JHtvZmZzZXRTcWx9YDtcbiAgICBpZiAoc2V0T3BlcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkU2V0T3BlcmF0aW9ucyhmaW5hbFF1ZXJ5LCBzZXRPcGVyYXRvcnMpO1xuICAgIH1cbiAgICByZXR1cm4gZmluYWxRdWVyeTtcbiAgfVxuICBidWlsZFNldE9wZXJhdGlvbnMobGVmdFNlbGVjdCwgc2V0T3BlcmF0b3JzKSB7XG4gICAgY29uc3QgW3NldE9wZXJhdG9yLCAuLi5yZXN0XSA9IHNldE9wZXJhdG9ycztcbiAgICBpZiAoIXNldE9wZXJhdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcGFzcyB1bmRlZmluZWQgdmFsdWVzIHRvIGFueSBzZXQgb3BlcmF0b3JcIik7XG4gICAgfVxuICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRTZXRPcGVyYXRpb25RdWVyeSh7IGxlZnRTZWxlY3QsIHNldE9wZXJhdG9yIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5idWlsZFNldE9wZXJhdGlvbnMoXG4gICAgICB0aGlzLmJ1aWxkU2V0T3BlcmF0aW9uUXVlcnkoeyBsZWZ0U2VsZWN0LCBzZXRPcGVyYXRvciB9KSxcbiAgICAgIHJlc3RcbiAgICApO1xuICB9XG4gIGJ1aWxkU2V0T3BlcmF0aW9uUXVlcnkoe1xuICAgIGxlZnRTZWxlY3QsXG4gICAgc2V0T3BlcmF0b3I6IHsgdHlwZSwgaXNBbGwsIHJpZ2h0U2VsZWN0LCBsaW1pdCwgb3JkZXJCeSwgb2Zmc2V0IH1cbiAgfSkge1xuICAgIGNvbnN0IGxlZnRDaHVuayA9IHNxbGAke2xlZnRTZWxlY3QuZ2V0U1FMKCl9IGA7XG4gICAgY29uc3QgcmlnaHRDaHVuayA9IHNxbGAke3JpZ2h0U2VsZWN0LmdldFNRTCgpfWA7XG4gICAgbGV0IG9yZGVyQnlTcWw7XG4gICAgaWYgKG9yZGVyQnkgJiYgb3JkZXJCeS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBvcmRlckJ5VmFsdWVzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHNpbmdsZU9yZGVyQnkgb2Ygb3JkZXJCeSkge1xuICAgICAgICBpZiAoaXMoc2luZ2xlT3JkZXJCeSwgU1FMaXRlQ29sdW1uKSkge1xuICAgICAgICAgIG9yZGVyQnlWYWx1ZXMucHVzaChzcWwuaWRlbnRpZmllcihzaW5nbGVPcmRlckJ5Lm5hbWUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpcyhzaW5nbGVPcmRlckJ5LCBTUUwpKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaW5nbGVPcmRlckJ5LnF1ZXJ5Q2h1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHNpbmdsZU9yZGVyQnkucXVlcnlDaHVua3NbaV07XG4gICAgICAgICAgICBpZiAoaXMoY2h1bmssIFNRTGl0ZUNvbHVtbikpIHtcbiAgICAgICAgICAgICAgc2luZ2xlT3JkZXJCeS5xdWVyeUNodW5rc1tpXSA9IHNxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhjaHVuaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvcmRlckJ5VmFsdWVzLnB1c2goc3FsYCR7c2luZ2xlT3JkZXJCeX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcmRlckJ5VmFsdWVzLnB1c2goc3FsYCR7c2luZ2xlT3JkZXJCeX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb3JkZXJCeVNxbCA9IHNxbGAgb3JkZXIgYnkgJHtzcWwuam9pbihvcmRlckJ5VmFsdWVzLCBzcWxgLCBgKX1gO1xuICAgIH1cbiAgICBjb25zdCBsaW1pdFNxbCA9IHR5cGVvZiBsaW1pdCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgbGltaXQgPT09IFwibnVtYmVyXCIgJiYgbGltaXQgPj0gMCA/IHNxbGAgbGltaXQgJHtsaW1pdH1gIDogdm9pZCAwO1xuICAgIGNvbnN0IG9wZXJhdG9yQ2h1bmsgPSBzcWwucmF3KGAke3R5cGV9ICR7aXNBbGwgPyBcImFsbCBcIiA6IFwiXCJ9YCk7XG4gICAgY29uc3Qgb2Zmc2V0U3FsID0gb2Zmc2V0ID8gc3FsYCBvZmZzZXQgJHtvZmZzZXR9YCA6IHZvaWQgMDtcbiAgICByZXR1cm4gc3FsYCR7bGVmdENodW5rfSR7b3BlcmF0b3JDaHVua30ke3JpZ2h0Q2h1bmt9JHtvcmRlckJ5U3FsfSR7bGltaXRTcWx9JHtvZmZzZXRTcWx9YDtcbiAgfVxuICBidWlsZEluc2VydFF1ZXJ5KHsgdGFibGUsIHZhbHVlczogdmFsdWVzT3JTZWxlY3QsIG9uQ29uZmxpY3QsIHJldHVybmluZywgd2l0aExpc3QsIHNlbGVjdCB9KSB7XG4gICAgY29uc3QgdmFsdWVzU3FsTGlzdCA9IFtdO1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG4gICAgY29uc3QgY29sRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGNvbHVtbnMpLmZpbHRlcihcbiAgICAgIChbXywgY29sXSkgPT4gIWNvbC5zaG91bGREaXNhYmxlSW5zZXJ0KClcbiAgICApO1xuICAgIGNvbnN0IGluc2VydE9yZGVyID0gY29sRW50cmllcy5tYXAoKFssIGNvbHVtbl0pID0+IHNxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhjb2x1bW4pKSk7XG4gICAgaWYgKHNlbGVjdCkge1xuICAgICAgY29uc3Qgc2VsZWN0MiA9IHZhbHVlc09yU2VsZWN0O1xuICAgICAgaWYgKGlzKHNlbGVjdDIsIFNRTCkpIHtcbiAgICAgICAgdmFsdWVzU3FsTGlzdC5wdXNoKHNlbGVjdDIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzU3FsTGlzdC5wdXNoKHNlbGVjdDIuZ2V0U1FMKCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZXNPclNlbGVjdDtcbiAgICAgIHZhbHVlc1NxbExpc3QucHVzaChzcWwucmF3KFwidmFsdWVzIFwiKSk7XG4gICAgICBmb3IgKGNvbnN0IFt2YWx1ZUluZGV4LCB2YWx1ZV0gb2YgdmFsdWVzLmVudHJpZXMoKSkge1xuICAgICAgICBjb25zdCB2YWx1ZUxpc3QgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBbZmllbGROYW1lLCBjb2xdIG9mIGNvbEVudHJpZXMpIHtcbiAgICAgICAgICBjb25zdCBjb2xWYWx1ZSA9IHZhbHVlW2ZpZWxkTmFtZV07XG4gICAgICAgICAgaWYgKGNvbFZhbHVlID09PSB2b2lkIDAgfHwgaXMoY29sVmFsdWUsIFBhcmFtKSAmJiBjb2xWYWx1ZS52YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgaWYgKGNvbC5kZWZhdWx0ICE9PSBudWxsICYmIGNvbC5kZWZhdWx0ICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gaXMoY29sLmRlZmF1bHQsIFNRTCkgPyBjb2wuZGVmYXVsdCA6IHNxbC5wYXJhbShjb2wuZGVmYXVsdCwgY29sKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sLmRlZmF1bHRGbiAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRGblJlc3VsdCA9IGNvbC5kZWZhdWx0Rm4oKTtcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gaXMoZGVmYXVsdEZuUmVzdWx0LCBTUUwpID8gZGVmYXVsdEZuUmVzdWx0IDogc3FsLnBhcmFtKGRlZmF1bHRGblJlc3VsdCwgY29sKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNvbC5kZWZhdWx0ICYmIGNvbC5vblVwZGF0ZUZuICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgY29uc3Qgb25VcGRhdGVGblJlc3VsdCA9IGNvbC5vblVwZGF0ZUZuKCk7XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGlzKG9uVXBkYXRlRm5SZXN1bHQsIFNRTCkgPyBvblVwZGF0ZUZuUmVzdWx0IDogc3FsLnBhcmFtKG9uVXBkYXRlRm5SZXN1bHQsIGNvbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBzcWxgbnVsbGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZUxpc3QucHVzaChkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZUxpc3QucHVzaChjb2xWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhbHVlc1NxbExpc3QucHVzaCh2YWx1ZUxpc3QpO1xuICAgICAgICBpZiAodmFsdWVJbmRleCA8IHZhbHVlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgdmFsdWVzU3FsTGlzdC5wdXNoKHNxbGAsIGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHdpdGhTcWwgPSB0aGlzLmJ1aWxkV2l0aENURSh3aXRoTGlzdCk7XG4gICAgY29uc3QgdmFsdWVzU3FsID0gc3FsLmpvaW4odmFsdWVzU3FsTGlzdCk7XG4gICAgY29uc3QgcmV0dXJuaW5nU3FsID0gcmV0dXJuaW5nID8gc3FsYCByZXR1cm5pbmcgJHt0aGlzLmJ1aWxkU2VsZWN0aW9uKHJldHVybmluZywgeyBpc1NpbmdsZVRhYmxlOiB0cnVlIH0pfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgb25Db25mbGljdFNxbCA9IG9uQ29uZmxpY3Q/Lmxlbmd0aCA/IHNxbC5qb2luKG9uQ29uZmxpY3QpIDogdm9pZCAwO1xuICAgIHJldHVybiBzcWxgJHt3aXRoU3FsfWluc2VydCBpbnRvICR7dGFibGV9ICR7aW5zZXJ0T3JkZXJ9ICR7dmFsdWVzU3FsfSR7b25Db25mbGljdFNxbH0ke3JldHVybmluZ1NxbH1gO1xuICB9XG4gIHNxbFRvUXVlcnkoc3FsMiwgaW52b2tlU291cmNlKSB7XG4gICAgcmV0dXJuIHNxbDIudG9RdWVyeSh7XG4gICAgICBjYXNpbmc6IHRoaXMuY2FzaW5nLFxuICAgICAgZXNjYXBlTmFtZTogdGhpcy5lc2NhcGVOYW1lLFxuICAgICAgZXNjYXBlUGFyYW06IHRoaXMuZXNjYXBlUGFyYW0sXG4gICAgICBlc2NhcGVTdHJpbmc6IHRoaXMuZXNjYXBlU3RyaW5nLFxuICAgICAgaW52b2tlU291cmNlXG4gICAgfSk7XG4gIH1cbiAgYnVpbGRSZWxhdGlvbmFsUXVlcnkoe1xuICAgIGZ1bGxTY2hlbWEsXG4gICAgc2NoZW1hLFxuICAgIHRhYmxlTmFtZXNNYXAsXG4gICAgdGFibGUsXG4gICAgdGFibGVDb25maWcsXG4gICAgcXVlcnlDb25maWc6IGNvbmZpZyxcbiAgICB0YWJsZUFsaWFzLFxuICAgIG5lc3RlZFF1ZXJ5UmVsYXRpb24sXG4gICAgam9pbk9uXG4gIH0pIHtcbiAgICBsZXQgc2VsZWN0aW9uID0gW107XG4gICAgbGV0IGxpbWl0LCBvZmZzZXQsIG9yZGVyQnkgPSBbXSwgd2hlcmU7XG4gICAgY29uc3Qgam9pbnMgPSBbXTtcbiAgICBpZiAoY29uZmlnID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBzZWxlY3Rpb25FbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVDb25maWcuY29sdW1ucyk7XG4gICAgICBzZWxlY3Rpb24gPSBzZWxlY3Rpb25FbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICBkYktleTogdmFsdWUubmFtZSxcbiAgICAgICAgdHNLZXk6IGtleSxcbiAgICAgICAgZmllbGQ6IGFsaWFzZWRUYWJsZUNvbHVtbih2YWx1ZSwgdGFibGVBbGlhcyksXG4gICAgICAgIHJlbGF0aW9uVGFibGVUc0tleTogdm9pZCAwLFxuICAgICAgICBpc0pzb246IGZhbHNlLFxuICAgICAgICBzZWxlY3Rpb246IFtdXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFsaWFzZWRDb2x1bW5zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyh0YWJsZUNvbmZpZy5jb2x1bW5zKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgYWxpYXNlZFRhYmxlQ29sdW1uKHZhbHVlLCB0YWJsZUFsaWFzKV0pXG4gICAgICApO1xuICAgICAgaWYgKGNvbmZpZy53aGVyZSkge1xuICAgICAgICBjb25zdCB3aGVyZVNxbCA9IHR5cGVvZiBjb25maWcud2hlcmUgPT09IFwiZnVuY3Rpb25cIiA/IGNvbmZpZy53aGVyZShhbGlhc2VkQ29sdW1ucywgZ2V0T3BlcmF0b3JzKCkpIDogY29uZmlnLndoZXJlO1xuICAgICAgICB3aGVyZSA9IHdoZXJlU3FsICYmIG1hcENvbHVtbnNJblNRTFRvQWxpYXMod2hlcmVTcWwsIHRhYmxlQWxpYXMpO1xuICAgICAgfVxuICAgICAgY29uc3QgZmllbGRzU2VsZWN0aW9uID0gW107XG4gICAgICBsZXQgc2VsZWN0ZWRDb2x1bW5zID0gW107XG4gICAgICBpZiAoY29uZmlnLmNvbHVtbnMpIHtcbiAgICAgICAgbGV0IGlzSW5jbHVkZU1vZGUgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBbZmllbGQsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcuY29sdW1ucykpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWVsZCBpbiB0YWJsZUNvbmZpZy5jb2x1bW5zKSB7XG4gICAgICAgICAgICBpZiAoIWlzSW5jbHVkZU1vZGUgJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgaXNJbmNsdWRlTW9kZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxlY3RlZENvbHVtbnMucHVzaChmaWVsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxlY3RlZENvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNlbGVjdGVkQ29sdW1ucyA9IGlzSW5jbHVkZU1vZGUgPyBzZWxlY3RlZENvbHVtbnMuZmlsdGVyKChjKSA9PiBjb25maWcuY29sdW1ucz8uW2NdID09PSB0cnVlKSA6IE9iamVjdC5rZXlzKHRhYmxlQ29uZmlnLmNvbHVtbnMpLmZpbHRlcigoa2V5KSA9PiAhc2VsZWN0ZWRDb2x1bW5zLmluY2x1ZGVzKGtleSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZENvbHVtbnMgPSBPYmplY3Qua2V5cyh0YWJsZUNvbmZpZy5jb2x1bW5zKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2Ygc2VsZWN0ZWRDb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRhYmxlQ29uZmlnLmNvbHVtbnNbZmllbGRdO1xuICAgICAgICBmaWVsZHNTZWxlY3Rpb24ucHVzaCh7IHRzS2V5OiBmaWVsZCwgdmFsdWU6IGNvbHVtbiB9KTtcbiAgICAgIH1cbiAgICAgIGxldCBzZWxlY3RlZFJlbGF0aW9ucyA9IFtdO1xuICAgICAgaWYgKGNvbmZpZy53aXRoKSB7XG4gICAgICAgIHNlbGVjdGVkUmVsYXRpb25zID0gT2JqZWN0LmVudHJpZXMoY29uZmlnLndpdGgpLmZpbHRlcigoZW50cnkpID0+ICEhZW50cnlbMV0pLm1hcCgoW3RzS2V5LCBxdWVyeUNvbmZpZ10pID0+ICh7IHRzS2V5LCBxdWVyeUNvbmZpZywgcmVsYXRpb246IHRhYmxlQ29uZmlnLnJlbGF0aW9uc1t0c0tleV0gfSkpO1xuICAgICAgfVxuICAgICAgbGV0IGV4dHJhcztcbiAgICAgIGlmIChjb25maWcuZXh0cmFzKSB7XG4gICAgICAgIGV4dHJhcyA9IHR5cGVvZiBjb25maWcuZXh0cmFzID09PSBcImZ1bmN0aW9uXCIgPyBjb25maWcuZXh0cmFzKGFsaWFzZWRDb2x1bW5zLCB7IHNxbCB9KSA6IGNvbmZpZy5leHRyYXM7XG4gICAgICAgIGZvciAoY29uc3QgW3RzS2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXh0cmFzKSkge1xuICAgICAgICAgIGZpZWxkc1NlbGVjdGlvbi5wdXNoKHtcbiAgICAgICAgICAgIHRzS2V5LFxuICAgICAgICAgICAgdmFsdWU6IG1hcENvbHVtbnNJbkFsaWFzZWRTUUxUb0FsaWFzKHZhbHVlLCB0YWJsZUFsaWFzKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHsgdHNLZXksIHZhbHVlIH0gb2YgZmllbGRzU2VsZWN0aW9uKSB7XG4gICAgICAgIHNlbGVjdGlvbi5wdXNoKHtcbiAgICAgICAgICBkYktleTogaXModmFsdWUsIFNRTC5BbGlhc2VkKSA/IHZhbHVlLmZpZWxkQWxpYXMgOiB0YWJsZUNvbmZpZy5jb2x1bW5zW3RzS2V5XS5uYW1lLFxuICAgICAgICAgIHRzS2V5LFxuICAgICAgICAgIGZpZWxkOiBpcyh2YWx1ZSwgQ29sdW1uKSA/IGFsaWFzZWRUYWJsZUNvbHVtbih2YWx1ZSwgdGFibGVBbGlhcykgOiB2YWx1ZSxcbiAgICAgICAgICByZWxhdGlvblRhYmxlVHNLZXk6IHZvaWQgMCxcbiAgICAgICAgICBpc0pzb246IGZhbHNlLFxuICAgICAgICAgIHNlbGVjdGlvbjogW11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsZXQgb3JkZXJCeU9yaWcgPSB0eXBlb2YgY29uZmlnLm9yZGVyQnkgPT09IFwiZnVuY3Rpb25cIiA/IGNvbmZpZy5vcmRlckJ5KGFsaWFzZWRDb2x1bW5zLCBnZXRPcmRlckJ5T3BlcmF0b3JzKCkpIDogY29uZmlnLm9yZGVyQnkgPz8gW107XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkob3JkZXJCeU9yaWcpKSB7XG4gICAgICAgIG9yZGVyQnlPcmlnID0gW29yZGVyQnlPcmlnXTtcbiAgICAgIH1cbiAgICAgIG9yZGVyQnkgPSBvcmRlckJ5T3JpZy5tYXAoKG9yZGVyQnlWYWx1ZSkgPT4ge1xuICAgICAgICBpZiAoaXMob3JkZXJCeVZhbHVlLCBDb2x1bW4pKSB7XG4gICAgICAgICAgcmV0dXJuIGFsaWFzZWRUYWJsZUNvbHVtbihvcmRlckJ5VmFsdWUsIHRhYmxlQWxpYXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXBDb2x1bW5zSW5TUUxUb0FsaWFzKG9yZGVyQnlWYWx1ZSwgdGFibGVBbGlhcyk7XG4gICAgICB9KTtcbiAgICAgIGxpbWl0ID0gY29uZmlnLmxpbWl0O1xuICAgICAgb2Zmc2V0ID0gY29uZmlnLm9mZnNldDtcbiAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICB0c0tleTogc2VsZWN0ZWRSZWxhdGlvblRzS2V5LFxuICAgICAgICBxdWVyeUNvbmZpZzogc2VsZWN0ZWRSZWxhdGlvbkNvbmZpZ1ZhbHVlLFxuICAgICAgICByZWxhdGlvblxuICAgICAgfSBvZiBzZWxlY3RlZFJlbGF0aW9ucykge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkUmVsYXRpb24gPSBub3JtYWxpemVSZWxhdGlvbihzY2hlbWEsIHRhYmxlTmFtZXNNYXAsIHJlbGF0aW9uKTtcbiAgICAgICAgY29uc3QgcmVsYXRpb25UYWJsZU5hbWUgPSBnZXRUYWJsZVVuaXF1ZU5hbWUocmVsYXRpb24ucmVmZXJlbmNlZFRhYmxlKTtcbiAgICAgICAgY29uc3QgcmVsYXRpb25UYWJsZVRzTmFtZSA9IHRhYmxlTmFtZXNNYXBbcmVsYXRpb25UYWJsZU5hbWVdO1xuICAgICAgICBjb25zdCByZWxhdGlvblRhYmxlQWxpYXMgPSBgJHt0YWJsZUFsaWFzfV8ke3NlbGVjdGVkUmVsYXRpb25Uc0tleX1gO1xuICAgICAgICBjb25zdCBqb2luT24yID0gYW5kKFxuICAgICAgICAgIC4uLm5vcm1hbGl6ZWRSZWxhdGlvbi5maWVsZHMubWFwKFxuICAgICAgICAgICAgKGZpZWxkMiwgaSkgPT4gZXEoXG4gICAgICAgICAgICAgIGFsaWFzZWRUYWJsZUNvbHVtbihub3JtYWxpemVkUmVsYXRpb24ucmVmZXJlbmNlc1tpXSwgcmVsYXRpb25UYWJsZUFsaWFzKSxcbiAgICAgICAgICAgICAgYWxpYXNlZFRhYmxlQ29sdW1uKGZpZWxkMiwgdGFibGVBbGlhcylcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGJ1aWx0UmVsYXRpb24gPSB0aGlzLmJ1aWxkUmVsYXRpb25hbFF1ZXJ5KHtcbiAgICAgICAgICBmdWxsU2NoZW1hLFxuICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICB0YWJsZU5hbWVzTWFwLFxuICAgICAgICAgIHRhYmxlOiBmdWxsU2NoZW1hW3JlbGF0aW9uVGFibGVUc05hbWVdLFxuICAgICAgICAgIHRhYmxlQ29uZmlnOiBzY2hlbWFbcmVsYXRpb25UYWJsZVRzTmFtZV0sXG4gICAgICAgICAgcXVlcnlDb25maWc6IGlzKHJlbGF0aW9uLCBPbmUpID8gc2VsZWN0ZWRSZWxhdGlvbkNvbmZpZ1ZhbHVlID09PSB0cnVlID8geyBsaW1pdDogMSB9IDogeyAuLi5zZWxlY3RlZFJlbGF0aW9uQ29uZmlnVmFsdWUsIGxpbWl0OiAxIH0gOiBzZWxlY3RlZFJlbGF0aW9uQ29uZmlnVmFsdWUsXG4gICAgICAgICAgdGFibGVBbGlhczogcmVsYXRpb25UYWJsZUFsaWFzLFxuICAgICAgICAgIGpvaW5Pbjogam9pbk9uMixcbiAgICAgICAgICBuZXN0ZWRRdWVyeVJlbGF0aW9uOiByZWxhdGlvblxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZmllbGQgPSBzcWxgKCR7YnVpbHRSZWxhdGlvbi5zcWx9KWAuYXMoc2VsZWN0ZWRSZWxhdGlvblRzS2V5KTtcbiAgICAgICAgc2VsZWN0aW9uLnB1c2goe1xuICAgICAgICAgIGRiS2V5OiBzZWxlY3RlZFJlbGF0aW9uVHNLZXksXG4gICAgICAgICAgdHNLZXk6IHNlbGVjdGVkUmVsYXRpb25Uc0tleSxcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICByZWxhdGlvblRhYmxlVHNLZXk6IHJlbGF0aW9uVGFibGVUc05hbWUsXG4gICAgICAgICAgaXNKc29uOiB0cnVlLFxuICAgICAgICAgIHNlbGVjdGlvbjogYnVpbHRSZWxhdGlvbi5zZWxlY3Rpb25cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRHJpenpsZUVycm9yKHtcbiAgICAgICAgbWVzc2FnZTogYE5vIGZpZWxkcyBzZWxlY3RlZCBmb3IgdGFibGUgXCIke3RhYmxlQ29uZmlnLnRzTmFtZX1cIiAoXCIke3RhYmxlQWxpYXN9XCIpLiBZb3UgbmVlZCB0byBoYXZlIGF0IGxlYXN0IG9uZSBpdGVtIGluIFwiY29sdW1uc1wiLCBcIndpdGhcIiBvciBcImV4dHJhc1wiLiBJZiB5b3UgbmVlZCB0byBzZWxlY3QgYWxsIGNvbHVtbnMsIG9taXQgdGhlIFwiY29sdW1uc1wiIGtleSBvciBzZXQgaXQgdG8gdW5kZWZpbmVkLmBcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0O1xuICAgIHdoZXJlID0gYW5kKGpvaW5Pbiwgd2hlcmUpO1xuICAgIGlmIChuZXN0ZWRRdWVyeVJlbGF0aW9uKSB7XG4gICAgICBsZXQgZmllbGQgPSBzcWxganNvbl9hcnJheSgke3NxbC5qb2luKFxuICAgICAgICBzZWxlY3Rpb24ubWFwKFxuICAgICAgICAgICh7IGZpZWxkOiBmaWVsZDIgfSkgPT4gaXMoZmllbGQyLCBTUUxpdGVDb2x1bW4pID8gc3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGZpZWxkMikpIDogaXMoZmllbGQyLCBTUUwuQWxpYXNlZCkgPyBmaWVsZDIuc3FsIDogZmllbGQyXG4gICAgICAgICksXG4gICAgICAgIHNxbGAsIGBcbiAgICAgICl9KWA7XG4gICAgICBpZiAoaXMobmVzdGVkUXVlcnlSZWxhdGlvbiwgTWFueSkpIHtcbiAgICAgICAgZmllbGQgPSBzcWxgY29hbGVzY2UoanNvbl9ncm91cF9hcnJheSgke2ZpZWxkfSksIGpzb25fYXJyYXkoKSlgO1xuICAgICAgfVxuICAgICAgY29uc3QgbmVzdGVkU2VsZWN0aW9uID0gW3tcbiAgICAgICAgZGJLZXk6IFwiZGF0YVwiLFxuICAgICAgICB0c0tleTogXCJkYXRhXCIsXG4gICAgICAgIGZpZWxkOiBmaWVsZC5hcyhcImRhdGFcIiksXG4gICAgICAgIGlzSnNvbjogdHJ1ZSxcbiAgICAgICAgcmVsYXRpb25UYWJsZVRzS2V5OiB0YWJsZUNvbmZpZy50c05hbWUsXG4gICAgICAgIHNlbGVjdGlvblxuICAgICAgfV07XG4gICAgICBjb25zdCBuZWVkc1N1YnF1ZXJ5ID0gbGltaXQgIT09IHZvaWQgMCB8fCBvZmZzZXQgIT09IHZvaWQgMCB8fCBvcmRlckJ5Lmxlbmd0aCA+IDA7XG4gICAgICBpZiAobmVlZHNTdWJxdWVyeSkge1xuICAgICAgICByZXN1bHQgPSB0aGlzLmJ1aWxkU2VsZWN0UXVlcnkoe1xuICAgICAgICAgIHRhYmxlOiBhbGlhc2VkVGFibGUodGFibGUsIHRhYmxlQWxpYXMpLFxuICAgICAgICAgIGZpZWxkczoge30sXG4gICAgICAgICAgZmllbGRzRmxhdDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgICAgICAgZmllbGQ6IHNxbC5yYXcoXCIqXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICB3aGVyZSxcbiAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgb3JkZXJCeSxcbiAgICAgICAgICBzZXRPcGVyYXRvcnM6IFtdXG4gICAgICAgIH0pO1xuICAgICAgICB3aGVyZSA9IHZvaWQgMDtcbiAgICAgICAgbGltaXQgPSB2b2lkIDA7XG4gICAgICAgIG9mZnNldCA9IHZvaWQgMDtcbiAgICAgICAgb3JkZXJCeSA9IHZvaWQgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IGFsaWFzZWRUYWJsZSh0YWJsZSwgdGFibGVBbGlhcyk7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSB0aGlzLmJ1aWxkU2VsZWN0UXVlcnkoe1xuICAgICAgICB0YWJsZTogaXMocmVzdWx0LCBTUUxpdGVUYWJsZSkgPyByZXN1bHQgOiBuZXcgU3VicXVlcnkocmVzdWx0LCB7fSwgdGFibGVBbGlhcyksXG4gICAgICAgIGZpZWxkczoge30sXG4gICAgICAgIGZpZWxkc0ZsYXQ6IG5lc3RlZFNlbGVjdGlvbi5tYXAoKHsgZmllbGQ6IGZpZWxkMiB9KSA9PiAoe1xuICAgICAgICAgIHBhdGg6IFtdLFxuICAgICAgICAgIGZpZWxkOiBpcyhmaWVsZDIsIENvbHVtbikgPyBhbGlhc2VkVGFibGVDb2x1bW4oZmllbGQyLCB0YWJsZUFsaWFzKSA6IGZpZWxkMlxuICAgICAgICB9KSksXG4gICAgICAgIGpvaW5zLFxuICAgICAgICB3aGVyZSxcbiAgICAgICAgbGltaXQsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgb3JkZXJCeSxcbiAgICAgICAgc2V0T3BlcmF0b3JzOiBbXVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuYnVpbGRTZWxlY3RRdWVyeSh7XG4gICAgICAgIHRhYmxlOiBhbGlhc2VkVGFibGUodGFibGUsIHRhYmxlQWxpYXMpLFxuICAgICAgICBmaWVsZHM6IHt9LFxuICAgICAgICBmaWVsZHNGbGF0OiBzZWxlY3Rpb24ubWFwKCh7IGZpZWxkIH0pID0+ICh7XG4gICAgICAgICAgcGF0aDogW10sXG4gICAgICAgICAgZmllbGQ6IGlzKGZpZWxkLCBDb2x1bW4pID8gYWxpYXNlZFRhYmxlQ29sdW1uKGZpZWxkLCB0YWJsZUFsaWFzKSA6IGZpZWxkXG4gICAgICAgIH0pKSxcbiAgICAgICAgam9pbnMsXG4gICAgICAgIHdoZXJlLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICBvcmRlckJ5LFxuICAgICAgICBzZXRPcGVyYXRvcnM6IFtdXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhYmxlVHNLZXk6IHRhYmxlQ29uZmlnLnRzTmFtZSxcbiAgICAgIHNxbDogcmVzdWx0LFxuICAgICAgc2VsZWN0aW9uXG4gICAgfTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlU3luY0RpYWxlY3QgZXh0ZW5kcyBTUUxpdGVEaWFsZWN0IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlU3luY0RpYWxlY3RcIjtcbiAgbWlncmF0ZShtaWdyYXRpb25zLCBzZXNzaW9uLCBjb25maWcpIHtcbiAgICBjb25zdCBtaWdyYXRpb25zVGFibGUgPSBjb25maWcgPT09IHZvaWQgMCA/IFwiX19kcml6emxlX21pZ3JhdGlvbnNcIiA6IHR5cGVvZiBjb25maWcgPT09IFwic3RyaW5nXCIgPyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCIgOiBjb25maWcubWlncmF0aW9uc1RhYmxlID8/IFwiX19kcml6emxlX21pZ3JhdGlvbnNcIjtcbiAgICBjb25zdCBtaWdyYXRpb25UYWJsZUNyZWF0ZSA9IHNxbGBcblx0XHRcdENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICR7c3FsLmlkZW50aWZpZXIobWlncmF0aW9uc1RhYmxlKX0gKFxuXHRcdFx0XHRpZCBTRVJJQUwgUFJJTUFSWSBLRVksXG5cdFx0XHRcdGhhc2ggdGV4dCBOT1QgTlVMTCxcblx0XHRcdFx0Y3JlYXRlZF9hdCBudW1lcmljXG5cdFx0XHQpXG5cdFx0YDtcbiAgICBzZXNzaW9uLnJ1bihtaWdyYXRpb25UYWJsZUNyZWF0ZSk7XG4gICAgY29uc3QgZGJNaWdyYXRpb25zID0gc2Vzc2lvbi52YWx1ZXMoXG4gICAgICBzcWxgU0VMRUNUIGlkLCBoYXNoLCBjcmVhdGVkX2F0IEZST00gJHtzcWwuaWRlbnRpZmllcihtaWdyYXRpb25zVGFibGUpfSBPUkRFUiBCWSBjcmVhdGVkX2F0IERFU0MgTElNSVQgMWBcbiAgICApO1xuICAgIGNvbnN0IGxhc3REYk1pZ3JhdGlvbiA9IGRiTWlncmF0aW9uc1swXSA/PyB2b2lkIDA7XG4gICAgc2Vzc2lvbi5ydW4oc3FsYEJFR0lOYCk7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgbWlncmF0aW9uIG9mIG1pZ3JhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFsYXN0RGJNaWdyYXRpb24gfHwgTnVtYmVyKGxhc3REYk1pZ3JhdGlvblsyXSkgPCBtaWdyYXRpb24uZm9sZGVyTWlsbGlzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzdG10IG9mIG1pZ3JhdGlvbi5zcWwpIHtcbiAgICAgICAgICAgIHNlc3Npb24ucnVuKHNxbC5yYXcoc3RtdCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXNzaW9uLnJ1bihcbiAgICAgICAgICAgIHNxbGBJTlNFUlQgSU5UTyAke3NxbC5pZGVudGlmaWVyKG1pZ3JhdGlvbnNUYWJsZSl9IChcImhhc2hcIiwgXCJjcmVhdGVkX2F0XCIpIFZBTFVFUygke21pZ3JhdGlvbi5oYXNofSwgJHttaWdyYXRpb24uZm9sZGVyTWlsbGlzfSlgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2Vzc2lvbi5ydW4oc3FsYENPTU1JVGApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNlc3Npb24ucnVuKHNxbGBST0xMQkFDS2ApO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUFzeW5jRGlhbGVjdCBleHRlbmRzIFNRTGl0ZURpYWxlY3Qge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVBc3luY0RpYWxlY3RcIjtcbiAgYXN5bmMgbWlncmF0ZShtaWdyYXRpb25zLCBzZXNzaW9uLCBjb25maWcpIHtcbiAgICBjb25zdCBtaWdyYXRpb25zVGFibGUgPSBjb25maWcgPT09IHZvaWQgMCA/IFwiX19kcml6emxlX21pZ3JhdGlvbnNcIiA6IHR5cGVvZiBjb25maWcgPT09IFwic3RyaW5nXCIgPyBcIl9fZHJpenpsZV9taWdyYXRpb25zXCIgOiBjb25maWcubWlncmF0aW9uc1RhYmxlID8/IFwiX19kcml6emxlX21pZ3JhdGlvbnNcIjtcbiAgICBjb25zdCBtaWdyYXRpb25UYWJsZUNyZWF0ZSA9IHNxbGBcblx0XHRcdENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICR7c3FsLmlkZW50aWZpZXIobWlncmF0aW9uc1RhYmxlKX0gKFxuXHRcdFx0XHRpZCBTRVJJQUwgUFJJTUFSWSBLRVksXG5cdFx0XHRcdGhhc2ggdGV4dCBOT1QgTlVMTCxcblx0XHRcdFx0Y3JlYXRlZF9hdCBudW1lcmljXG5cdFx0XHQpXG5cdFx0YDtcbiAgICBhd2FpdCBzZXNzaW9uLnJ1bihtaWdyYXRpb25UYWJsZUNyZWF0ZSk7XG4gICAgY29uc3QgZGJNaWdyYXRpb25zID0gYXdhaXQgc2Vzc2lvbi52YWx1ZXMoXG4gICAgICBzcWxgU0VMRUNUIGlkLCBoYXNoLCBjcmVhdGVkX2F0IEZST00gJHtzcWwuaWRlbnRpZmllcihtaWdyYXRpb25zVGFibGUpfSBPUkRFUiBCWSBjcmVhdGVkX2F0IERFU0MgTElNSVQgMWBcbiAgICApO1xuICAgIGNvbnN0IGxhc3REYk1pZ3JhdGlvbiA9IGRiTWlncmF0aW9uc1swXSA/PyB2b2lkIDA7XG4gICAgYXdhaXQgc2Vzc2lvbi50cmFuc2FjdGlvbihhc3luYyAodHgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbWlncmF0aW9uIG9mIG1pZ3JhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFsYXN0RGJNaWdyYXRpb24gfHwgTnVtYmVyKGxhc3REYk1pZ3JhdGlvblsyXSkgPCBtaWdyYXRpb24uZm9sZGVyTWlsbGlzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzdG10IG9mIG1pZ3JhdGlvbi5zcWwpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4LnJ1bihzcWwucmF3KHN0bXQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgdHgucnVuKFxuICAgICAgICAgICAgc3FsYElOU0VSVCBJTlRPICR7c3FsLmlkZW50aWZpZXIobWlncmF0aW9uc1RhYmxlKX0gKFwiaGFzaFwiLCBcImNyZWF0ZWRfYXRcIikgVkFMVUVTKCR7bWlncmF0aW9uLmhhc2h9LCAke21pZ3JhdGlvbi5mb2xkZXJNaWxsaXN9KWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZUFzeW5jRGlhbGVjdCxcbiAgU1FMaXRlRGlhbGVjdCxcbiAgU1FMaXRlU3luY0RpYWxlY3Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWFsZWN0LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmNsYXNzIFR5cGVkUXVlcnlCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiVHlwZWRRdWVyeUJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTZWxlY3RlZEZpZWxkcygpIHtcbiAgICByZXR1cm4gdGhpcy5fLnNlbGVjdGVkRmllbGRzO1xuICB9XG59XG5leHBvcnQge1xuICBUeXBlZFF1ZXJ5QnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1ZXJ5LWJ1aWxkZXIuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFR5cGVkUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LWJ1aWxkZXJzL3F1ZXJ5LWJ1aWxkZXIuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi8uLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5pbXBvcnQgeyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vc2VsZWN0aW9uLXByb3h5LmpzXCI7XG5pbXBvcnQgeyBTUUwsIFZpZXcgfSBmcm9tIFwiLi4vLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi4vLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlLmpzXCI7XG5pbXBvcnQge1xuICBhcHBseU1peGlucyxcbiAgZ2V0VGFibGVDb2x1bW5zLFxuICBnZXRUYWJsZUxpa2VOYW1lLFxuICBoYXZlU2FtZUtleXMsXG4gIG9yZGVyU2VsZWN0ZWRGaWVsZHNcbn0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuLi8uLi92aWV3LWNvbW1vbi5qc1wiO1xuaW1wb3J0IHsgZXh0cmFjdFVzZWRUYWJsZSB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVmlld0Jhc2UgfSBmcm9tIFwiLi4vdmlldy1iYXNlLmpzXCI7XG5jbGFzcyBTUUxpdGVTZWxlY3RCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlU2VsZWN0QnVpbGRlclwiO1xuICBmaWVsZHM7XG4gIHNlc3Npb247XG4gIGRpYWxlY3Q7XG4gIHdpdGhMaXN0O1xuICBkaXN0aW5jdDtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy5maWVsZHMgPSBjb25maWcuZmllbGRzO1xuICAgIHRoaXMuc2Vzc2lvbiA9IGNvbmZpZy5zZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGNvbmZpZy5kaWFsZWN0O1xuICAgIHRoaXMud2l0aExpc3QgPSBjb25maWcud2l0aExpc3Q7XG4gICAgdGhpcy5kaXN0aW5jdCA9IGNvbmZpZy5kaXN0aW5jdDtcbiAgfVxuICBmcm9tKHNvdXJjZSkge1xuICAgIGNvbnN0IGlzUGFydGlhbFNlbGVjdCA9ICEhdGhpcy5maWVsZHM7XG4gICAgbGV0IGZpZWxkcztcbiAgICBpZiAodGhpcy5maWVsZHMpIHtcbiAgICAgIGZpZWxkcyA9IHRoaXMuZmllbGRzO1xuICAgIH0gZWxzZSBpZiAoaXMoc291cmNlLCBTdWJxdWVyeSkpIHtcbiAgICAgIGZpZWxkcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmtleXMoc291cmNlLl8uc2VsZWN0ZWRGaWVsZHMpLm1hcCgoa2V5KSA9PiBba2V5LCBzb3VyY2Vba2V5XV0pXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoaXMoc291cmNlLCBTUUxpdGVWaWV3QmFzZSkpIHtcbiAgICAgIGZpZWxkcyA9IHNvdXJjZVtWaWV3QmFzZUNvbmZpZ10uc2VsZWN0ZWRGaWVsZHM7XG4gICAgfSBlbHNlIGlmIChpcyhzb3VyY2UsIFNRTCkpIHtcbiAgICAgIGZpZWxkcyA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWVsZHMgPSBnZXRUYWJsZUNvbHVtbnMoc291cmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCYXNlKHtcbiAgICAgIHRhYmxlOiBzb3VyY2UsXG4gICAgICBmaWVsZHMsXG4gICAgICBpc1BhcnRpYWxTZWxlY3QsXG4gICAgICBzZXNzaW9uOiB0aGlzLnNlc3Npb24sXG4gICAgICBkaWFsZWN0OiB0aGlzLmRpYWxlY3QsXG4gICAgICB3aXRoTGlzdDogdGhpcy53aXRoTGlzdCxcbiAgICAgIGRpc3RpbmN0OiB0aGlzLmRpc3RpbmN0XG4gICAgfSk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVNlbGVjdFF1ZXJ5QnVpbGRlckJhc2UgZXh0ZW5kcyBUeXBlZFF1ZXJ5QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVNlbGVjdFF1ZXJ5QnVpbGRlclwiO1xuICBfO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbmZpZztcbiAgam9pbnNOb3ROdWxsYWJsZU1hcDtcbiAgdGFibGVOYW1lO1xuICBpc1BhcnRpYWxTZWxlY3Q7XG4gIHNlc3Npb247XG4gIGRpYWxlY3Q7XG4gIGNhY2hlQ29uZmlnID0gdm9pZCAwO1xuICB1c2VkVGFibGVzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgY29uc3RydWN0b3IoeyB0YWJsZSwgZmllbGRzLCBpc1BhcnRpYWxTZWxlY3QsIHNlc3Npb24sIGRpYWxlY3QsIHdpdGhMaXN0LCBkaXN0aW5jdCB9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIHdpdGhMaXN0LFxuICAgICAgdGFibGUsXG4gICAgICBmaWVsZHM6IHsgLi4uZmllbGRzIH0sXG4gICAgICBkaXN0aW5jdCxcbiAgICAgIHNldE9wZXJhdG9yczogW11cbiAgICB9O1xuICAgIHRoaXMuaXNQYXJ0aWFsU2VsZWN0ID0gaXNQYXJ0aWFsU2VsZWN0O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLl8gPSB7XG4gICAgICBzZWxlY3RlZEZpZWxkczogZmllbGRzLFxuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZ1xuICAgIH07XG4gICAgdGhpcy50YWJsZU5hbWUgPSBnZXRUYWJsZUxpa2VOYW1lKHRhYmxlKTtcbiAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXAgPSB0eXBlb2YgdGhpcy50YWJsZU5hbWUgPT09IFwic3RyaW5nXCIgPyB7IFt0aGlzLnRhYmxlTmFtZV06IHRydWUgfSA6IHt9O1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBleHRyYWN0VXNlZFRhYmxlKHRhYmxlKSkgdGhpcy51c2VkVGFibGVzLmFkZChpdGVtKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGdldFVzZWRUYWJsZXMoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnVzZWRUYWJsZXNdO1xuICB9XG4gIGNyZWF0ZUpvaW4oam9pblR5cGUpIHtcbiAgICByZXR1cm4gKHRhYmxlLCBvbikgPT4ge1xuICAgICAgY29uc3QgYmFzZVRhYmxlTmFtZSA9IHRoaXMudGFibGVOYW1lO1xuICAgICAgY29uc3QgdGFibGVOYW1lID0gZ2V0VGFibGVMaWtlTmFtZSh0YWJsZSk7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZXh0cmFjdFVzZWRUYWJsZSh0YWJsZSkpIHRoaXMudXNlZFRhYmxlcy5hZGQoaXRlbSk7XG4gICAgICBpZiAodHlwZW9mIHRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLmNvbmZpZy5qb2lucz8uc29tZSgoam9pbikgPT4gam9pbi5hbGlhcyA9PT0gdGFibGVOYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFsaWFzIFwiJHt0YWJsZU5hbWV9XCIgaXMgYWxyZWFkeSB1c2VkIGluIHRoaXMgcXVlcnlgKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc1BhcnRpYWxTZWxlY3QpIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcCkubGVuZ3RoID09PSAxICYmIHR5cGVvZiBiYXNlVGFibGVOYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzID0ge1xuICAgICAgICAgICAgW2Jhc2VUYWJsZU5hbWVdOiB0aGlzLmNvbmZpZy5maWVsZHNcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFibGVOYW1lID09PSBcInN0cmluZ1wiICYmICFpcyh0YWJsZSwgU1FMKSkge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGlzKHRhYmxlLCBTdWJxdWVyeSkgPyB0YWJsZS5fLnNlbGVjdGVkRmllbGRzIDogaXModGFibGUsIFZpZXcpID8gdGFibGVbVmlld0Jhc2VDb25maWddLnNlbGVjdGVkRmllbGRzIDogdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkc1t0YWJsZU5hbWVdID0gc2VsZWN0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgb24gPSBvbihcbiAgICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMsXG4gICAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcInNxbFwiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5jb25maWcuam9pbnMpIHtcbiAgICAgICAgdGhpcy5jb25maWcuam9pbnMgPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uZmlnLmpvaW5zLnB1c2goeyBvbiwgdGFibGUsIGpvaW5UeXBlLCBhbGlhczogdGFibGVOYW1lIH0pO1xuICAgICAgaWYgKHR5cGVvZiB0YWJsZU5hbWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgc3dpdGNoIChqb2luVHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6IHtcbiAgICAgICAgICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcFt0YWJsZU5hbWVdID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcInJpZ2h0XCI6IHtcbiAgICAgICAgICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5qb2luc05vdE51bGxhYmxlTWFwKS5tYXAoKFtrZXldKSA9PiBba2V5LCBmYWxzZV0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwW3RhYmxlTmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJjcm9zc1wiOlxuICAgICAgICAgIGNhc2UgXCJpbm5lclwiOiB7XG4gICAgICAgICAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXBbdGFibGVOYW1lXSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImZ1bGxcIjoge1xuICAgICAgICAgICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLmpvaW5zTm90TnVsbGFibGVNYXApLm1hcCgoW2tleV0pID0+IFtrZXksIGZhbHNlXSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXBbdGFibGVOYW1lXSA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGBsZWZ0IGpvaW5gIG9wZXJhdGlvbiBieSBhZGRpbmcgYW5vdGhlciB0YWJsZSB0byB0aGUgY3VycmVudCBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBhc3NvY2lhdGVzIGVhY2ggcm93IG9mIHRoZSB0YWJsZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHJvdyBmcm9tIHRoZSBqb2luZWQgdGFibGUsIGlmIGEgbWF0Y2ggaXMgZm91bmQuIElmIG5vIG1hdGNoaW5nIHJvdyBleGlzdHMsIGl0IHNldHMgYWxsIGNvbHVtbnMgb2YgdGhlIGpvaW5lZCB0YWJsZSB0byBudWxsLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2pvaW5zI2xlZnQtam9pbn1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBqb2luLlxuICAgKiBAcGFyYW0gb24gdGhlIGBvbmAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHVzZXJzIGFuZCB0aGVpciBwZXRzXG4gICAqIGNvbnN0IHVzZXJzV2l0aFBldHM6IHsgdXNlcjogVXNlcjsgcGV0czogUGV0IHwgbnVsbDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KClcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAubGVmdEpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqXG4gICAqIC8vIFNlbGVjdCB1c2VySWQgYW5kIHBldElkXG4gICAqIGNvbnN0IHVzZXJzSWRzQW5kUGV0SWRzOiB7IHVzZXJJZDogbnVtYmVyOyBwZXRJZDogbnVtYmVyIHwgbnVsbDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KHtcbiAgICogICB1c2VySWQ6IHVzZXJzLmlkLFxuICAgKiAgIHBldElkOiBwZXRzLmlkLFxuICAgKiB9KVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5sZWZ0Sm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICogYGBgXG4gICAqL1xuICBsZWZ0Sm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImxlZnRcIik7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGByaWdodCBqb2luYCBvcGVyYXRpb24gYnkgYWRkaW5nIGFub3RoZXIgdGFibGUgdG8gdGhlIGN1cnJlbnQgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2QgYXNzb2NpYXRlcyBlYWNoIHJvdyBvZiB0aGUgam9pbmVkIHRhYmxlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcm93IGZyb20gdGhlIG1haW4gdGFibGUsIGlmIGEgbWF0Y2ggaXMgZm91bmQuIElmIG5vIG1hdGNoaW5nIHJvdyBleGlzdHMsIGl0IHNldHMgYWxsIGNvbHVtbnMgb2YgdGhlIG1haW4gdGFibGUgdG8gbnVsbC5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9qb2lucyNyaWdodC1qb2lufVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRvIGpvaW4uXG4gICAqIEBwYXJhbSBvbiB0aGUgYG9uYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdXNlcnMgYW5kIHRoZWlyIHBldHNcbiAgICogY29uc3QgdXNlcnNXaXRoUGV0czogeyB1c2VyOiBVc2VyIHwgbnVsbDsgcGV0czogUGV0OyB9W10gPSBhd2FpdCBkYi5zZWxlY3QoKVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5yaWdodEpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqXG4gICAqIC8vIFNlbGVjdCB1c2VySWQgYW5kIHBldElkXG4gICAqIGNvbnN0IHVzZXJzSWRzQW5kUGV0SWRzOiB7IHVzZXJJZDogbnVtYmVyIHwgbnVsbDsgcGV0SWQ6IG51bWJlcjsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KHtcbiAgICogICB1c2VySWQ6IHVzZXJzLmlkLFxuICAgKiAgIHBldElkOiBwZXRzLmlkLFxuICAgKiB9KVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5yaWdodEpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqIGBgYFxuICAgKi9cbiAgcmlnaHRKb2luID0gdGhpcy5jcmVhdGVKb2luKFwicmlnaHRcIik7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhbiBgaW5uZXIgam9pbmAgb3BlcmF0aW9uLCBjcmVhdGluZyBhIG5ldyB0YWJsZSBieSBjb21iaW5pbmcgcm93cyBmcm9tIHR3byB0YWJsZXMgdGhhdCBoYXZlIG1hdGNoaW5nIHZhbHVlcy5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCByZXRyaWV2ZXMgcm93cyB0aGF0IGhhdmUgY29ycmVzcG9uZGluZyBlbnRyaWVzIGluIGJvdGggam9pbmVkIHRhYmxlcy4gUm93cyB3aXRob3V0IG1hdGNoaW5nIGVudHJpZXMgaW4gZWl0aGVyIHRhYmxlIGFyZSBleGNsdWRlZCwgcmVzdWx0aW5nIGluIGEgdGFibGUgdGhhdCBpbmNsdWRlcyBvbmx5IG1hdGNoaW5nIHBhaXJzLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2pvaW5zI2lubmVyLWpvaW59XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdG8gam9pbi5cbiAgICogQHBhcmFtIG9uIHRoZSBgb25gIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB1c2VycyBhbmQgdGhlaXIgcGV0c1xuICAgKiBjb25zdCB1c2Vyc1dpdGhQZXRzOiB7IHVzZXI6IFVzZXI7IHBldHM6IFBldDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KClcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAuaW5uZXJKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKlxuICAgKiAvLyBTZWxlY3QgdXNlcklkIGFuZCBwZXRJZFxuICAgKiBjb25zdCB1c2Vyc0lkc0FuZFBldElkczogeyB1c2VySWQ6IG51bWJlcjsgcGV0SWQ6IG51bWJlcjsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KHtcbiAgICogICB1c2VySWQ6IHVzZXJzLmlkLFxuICAgKiAgIHBldElkOiBwZXRzLmlkLFxuICAgKiB9KVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5pbm5lckpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqIGBgYFxuICAgKi9cbiAgaW5uZXJKb2luID0gdGhpcy5jcmVhdGVKb2luKFwiaW5uZXJcIik7XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGBmdWxsIGpvaW5gIG9wZXJhdGlvbiBieSBjb21iaW5pbmcgcm93cyBmcm9tIHR3byB0YWJsZXMgaW50byBhIG5ldyB0YWJsZS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCByZXRyaWV2ZXMgYWxsIHJvd3MgZnJvbSBib3RoIG1haW4gYW5kIGpvaW5lZCB0YWJsZXMsIG1lcmdpbmcgcm93cyB3aXRoIG1hdGNoaW5nIHZhbHVlcyBhbmQgZmlsbGluZyBpbiBgbnVsbGAgZm9yIG5vbi1tYXRjaGluZyBjb2x1bW5zLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2pvaW5zI2Z1bGwtam9pbn1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBqb2luLlxuICAgKiBAcGFyYW0gb24gdGhlIGBvbmAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHVzZXJzIGFuZCB0aGVpciBwZXRzXG4gICAqIGNvbnN0IHVzZXJzV2l0aFBldHM6IHsgdXNlcjogVXNlciB8IG51bGw7IHBldHM6IFBldCB8IG51bGw7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCgpXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmZ1bGxKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKlxuICAgKiAvLyBTZWxlY3QgdXNlcklkIGFuZCBwZXRJZFxuICAgKiBjb25zdCB1c2Vyc0lkc0FuZFBldElkczogeyB1c2VySWQ6IG51bWJlciB8IG51bGw7IHBldElkOiBudW1iZXIgfCBudWxsOyB9W10gPSBhd2FpdCBkYi5zZWxlY3Qoe1xuICAgKiAgIHVzZXJJZDogdXNlcnMuaWQsXG4gICAqICAgcGV0SWQ6IHBldHMuaWQsXG4gICAqIH0pXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmZ1bGxKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKiBgYGBcbiAgICovXG4gIGZ1bGxKb2luID0gdGhpcy5jcmVhdGVKb2luKFwiZnVsbFwiKTtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgYGNyb3NzIGpvaW5gIG9wZXJhdGlvbiBieSBjb21iaW5pbmcgcm93cyBmcm9tIHR3byB0YWJsZXMgaW50byBhIG5ldyB0YWJsZS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCByZXRyaWV2ZXMgYWxsIHJvd3MgZnJvbSBib3RoIG1haW4gYW5kIGpvaW5lZCB0YWJsZXMsIG1lcmdpbmcgYWxsIHJvd3MgZnJvbSBlYWNoIHRhYmxlLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2pvaW5zI2Nyb3NzLWpvaW59XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdG8gam9pbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB1c2VycywgZWFjaCB1c2VyIHdpdGggZXZlcnkgcGV0XG4gICAqIGNvbnN0IHVzZXJzV2l0aFBldHM6IHsgdXNlcjogVXNlcjsgcGV0czogUGV0OyB9W10gPSBhd2FpdCBkYi5zZWxlY3QoKVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5jcm9zc0pvaW4ocGV0cylcbiAgICpcbiAgICogLy8gU2VsZWN0IHVzZXJJZCBhbmQgcGV0SWRcbiAgICogY29uc3QgdXNlcnNJZHNBbmRQZXRJZHM6IHsgdXNlcklkOiBudW1iZXI7IHBldElkOiBudW1iZXI7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCh7XG4gICAqICAgdXNlcklkOiB1c2Vycy5pZCxcbiAgICogICBwZXRJZDogcGV0cy5pZCxcbiAgICogfSlcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAuY3Jvc3NKb2luKHBldHMpXG4gICAqIGBgYFxuICAgKi9cbiAgY3Jvc3NKb2luID0gdGhpcy5jcmVhdGVKb2luKFwiY3Jvc3NcIik7XG4gIGNyZWF0ZVNldE9wZXJhdG9yKHR5cGUsIGlzQWxsKSB7XG4gICAgcmV0dXJuIChyaWdodFNlbGVjdGlvbikgPT4ge1xuICAgICAgY29uc3QgcmlnaHRTZWxlY3QgPSB0eXBlb2YgcmlnaHRTZWxlY3Rpb24gPT09IFwiZnVuY3Rpb25cIiA/IHJpZ2h0U2VsZWN0aW9uKGdldFNRTGl0ZVNldE9wZXJhdG9ycygpKSA6IHJpZ2h0U2VsZWN0aW9uO1xuICAgICAgaWYgKCFoYXZlU2FtZUtleXModGhpcy5nZXRTZWxlY3RlZEZpZWxkcygpLCByaWdodFNlbGVjdC5nZXRTZWxlY3RlZEZpZWxkcygpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJTZXQgb3BlcmF0b3IgZXJyb3IgKHVuaW9uIC8gaW50ZXJzZWN0IC8gZXhjZXB0KTogc2VsZWN0ZWQgZmllbGRzIGFyZSBub3QgdGhlIHNhbWUgb3IgYXJlIGluIGEgZGlmZmVyZW50IG9yZGVyXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5wdXNoKHsgdHlwZSwgaXNBbGwsIHJpZ2h0U2VsZWN0IH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogQWRkcyBgdW5pb25gIHNldCBvcGVyYXRvciB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBjb21iaW5lIHRoZSByZXN1bHQgc2V0cyBvZiB0aGUgYHNlbGVjdGAgc3RhdGVtZW50cyBhbmQgcmVtb3ZlIGFueSBkdXBsaWNhdGUgcm93cyB0aGF0IGFwcGVhciBhY3Jvc3MgdGhlbS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZXQtb3BlcmF0aW9ucyN1bmlvbn1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB1bmlxdWUgbmFtZXMgZnJvbSBjdXN0b21lcnMgYW5kIHVzZXJzIHRhYmxlc1xuICAgKiBhd2FpdCBkYi5zZWxlY3QoeyBuYW1lOiB1c2Vycy5uYW1lIH0pXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLnVuaW9uKFxuICAgKiAgICAgZGIuc2VsZWN0KHsgbmFtZTogY3VzdG9tZXJzLm5hbWUgfSkuZnJvbShjdXN0b21lcnMpXG4gICAqICAgKTtcbiAgICogLy8gb3JcbiAgICogaW1wb3J0IHsgdW5pb24gfSBmcm9tICdkcml6emxlLW9ybS9zcWxpdGUtY29yZSdcbiAgICpcbiAgICogYXdhaXQgdW5pb24oXG4gICAqICAgZGIuc2VsZWN0KHsgbmFtZTogdXNlcnMubmFtZSB9KS5mcm9tKHVzZXJzKSxcbiAgICogICBkYi5zZWxlY3QoeyBuYW1lOiBjdXN0b21lcnMubmFtZSB9KS5mcm9tKGN1c3RvbWVycylcbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICB1bmlvbiA9IHRoaXMuY3JlYXRlU2V0T3BlcmF0b3IoXCJ1bmlvblwiLCBmYWxzZSk7XG4gIC8qKlxuICAgKiBBZGRzIGB1bmlvbiBhbGxgIHNldCBvcGVyYXRvciB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBjb21iaW5lIHRoZSByZXN1bHQtc2V0IG9mIHRoZSBgc2VsZWN0YCBzdGF0ZW1lbnRzIGFuZCBrZWVwIGFsbCBkdXBsaWNhdGUgcm93cyB0aGF0IGFwcGVhciBhY3Jvc3MgdGhlbS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZXQtb3BlcmF0aW9ucyN1bmlvbi1hbGx9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdHJhbnNhY3Rpb24gaWRzIGZyb20gYm90aCBvbmxpbmUgYW5kIGluLXN0b3JlIHNhbGVzXG4gICAqIGF3YWl0IGRiLnNlbGVjdCh7IHRyYW5zYWN0aW9uOiBvbmxpbmVTYWxlcy50cmFuc2FjdGlvbklkIH0pXG4gICAqICAgLmZyb20ob25saW5lU2FsZXMpXG4gICAqICAgLnVuaW9uQWxsKFxuICAgKiAgICAgZGIuc2VsZWN0KHsgdHJhbnNhY3Rpb246IGluU3RvcmVTYWxlcy50cmFuc2FjdGlvbklkIH0pLmZyb20oaW5TdG9yZVNhbGVzKVxuICAgKiAgICk7XG4gICAqIC8vIG9yXG4gICAqIGltcG9ydCB7IHVuaW9uQWxsIH0gZnJvbSAnZHJpenpsZS1vcm0vc3FsaXRlLWNvcmUnXG4gICAqXG4gICAqIGF3YWl0IHVuaW9uQWxsKFxuICAgKiAgIGRiLnNlbGVjdCh7IHRyYW5zYWN0aW9uOiBvbmxpbmVTYWxlcy50cmFuc2FjdGlvbklkIH0pLmZyb20ob25saW5lU2FsZXMpLFxuICAgKiAgIGRiLnNlbGVjdCh7IHRyYW5zYWN0aW9uOiBpblN0b3JlU2FsZXMudHJhbnNhY3Rpb25JZCB9KS5mcm9tKGluU3RvcmVTYWxlcylcbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICB1bmlvbkFsbCA9IHRoaXMuY3JlYXRlU2V0T3BlcmF0b3IoXCJ1bmlvblwiLCB0cnVlKTtcbiAgLyoqXG4gICAqIEFkZHMgYGludGVyc2VjdGAgc2V0IG9wZXJhdG9yIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHJldGFpbiBvbmx5IHRoZSByb3dzIHRoYXQgYXJlIHByZXNlbnQgaW4gYm90aCByZXN1bHQgc2V0cyBhbmQgZWxpbWluYXRlIGR1cGxpY2F0ZXMuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2V0LW9wZXJhdGlvbnMjaW50ZXJzZWN0fVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgY291cnNlIG5hbWVzIHRoYXQgYXJlIG9mZmVyZWQgaW4gYm90aCBkZXBhcnRtZW50cyBBIGFuZCBCXG4gICAqIGF3YWl0IGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEEuY291cnNlTmFtZSB9KVxuICAgKiAgIC5mcm9tKGRlcEEpXG4gICAqICAgLmludGVyc2VjdChcbiAgICogICAgIGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEIuY291cnNlTmFtZSB9KS5mcm9tKGRlcEIpXG4gICAqICAgKTtcbiAgICogLy8gb3JcbiAgICogaW1wb3J0IHsgaW50ZXJzZWN0IH0gZnJvbSAnZHJpenpsZS1vcm0vc3FsaXRlLWNvcmUnXG4gICAqXG4gICAqIGF3YWl0IGludGVyc2VjdChcbiAgICogICBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBBLmNvdXJzZU5hbWUgfSkuZnJvbShkZXBBKSxcbiAgICogICBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBCLmNvdXJzZU5hbWUgfSkuZnJvbShkZXBCKVxuICAgKiApO1xuICAgKiBgYGBcbiAgICovXG4gIGludGVyc2VjdCA9IHRoaXMuY3JlYXRlU2V0T3BlcmF0b3IoXCJpbnRlcnNlY3RcIiwgZmFsc2UpO1xuICAvKipcbiAgICogQWRkcyBgZXhjZXB0YCBzZXQgb3BlcmF0b3IgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgcmV0cmlldmUgYWxsIHVuaXF1ZSByb3dzIGZyb20gdGhlIGxlZnQgcXVlcnksIGV4Y2VwdCBmb3IgdGhlIHJvd3MgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgcmVzdWx0IHNldCBvZiB0aGUgcmlnaHQgcXVlcnkuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2V0LW9wZXJhdGlvbnMjZXhjZXB0fVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIGNvdXJzZXMgb2ZmZXJlZCBpbiBkZXBhcnRtZW50IEEgYnV0IG5vdCBpbiBkZXBhcnRtZW50IEJcbiAgICogYXdhaXQgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQS5jb3Vyc2VOYW1lIH0pXG4gICAqICAgLmZyb20oZGVwQSlcbiAgICogICAuZXhjZXB0KFxuICAgKiAgICAgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQi5jb3Vyc2VOYW1lIH0pLmZyb20oZGVwQilcbiAgICogICApO1xuICAgKiAvLyBvclxuICAgKiBpbXBvcnQgeyBleGNlcHQgfSBmcm9tICdkcml6emxlLW9ybS9zcWxpdGUtY29yZSdcbiAgICpcbiAgICogYXdhaXQgZXhjZXB0KFxuICAgKiAgIGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEEuY291cnNlTmFtZSB9KS5mcm9tKGRlcEEpLFxuICAgKiAgIGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEIuY291cnNlTmFtZSB9KS5mcm9tKGRlcEIpXG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgZXhjZXB0ID0gdGhpcy5jcmVhdGVTZXRPcGVyYXRvcihcImV4Y2VwdFwiLCBmYWxzZSk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYWRkU2V0T3BlcmF0b3JzKHNldE9wZXJhdG9ycykge1xuICAgIHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5wdXNoKC4uLnNldE9wZXJhdG9ycyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBgd2hlcmVgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBzZWxlY3Qgb25seSB0aG9zZSByb3dzIHRoYXQgZnVsZmlsbCBhIHNwZWNpZmllZCBjb25kaXRpb24uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2VsZWN0I2ZpbHRlcmluZ31cbiAgICpcbiAgICogQHBhcmFtIHdoZXJlIHRoZSBgd2hlcmVgIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogWW91IGNhbiB1c2UgY29uZGl0aW9uYWwgb3BlcmF0b3JzIGFuZCBgc3FsIGZ1bmN0aW9uYCB0byBmaWx0ZXIgdGhlIHJvd3MgdG8gYmUgc2VsZWN0ZWQuXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgY2FycyB3aXRoIGdyZWVuIGNvbG9yXG4gICAqIGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oY2Fycykud2hlcmUoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJykpO1xuICAgKiAvLyBvclxuICAgKiBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKGNhcnMpLndoZXJlKHNxbGAke2NhcnMuY29sb3J9ID0gJ2dyZWVuJ2ApXG4gICAqIGBgYFxuICAgKlxuICAgKiBZb3UgY2FuIGxvZ2ljYWxseSBjb21iaW5lIGNvbmRpdGlvbmFsIG9wZXJhdG9ycyB3aXRoIGBhbmQoKWAgYW5kIGBvcigpYCBvcGVyYXRvcnM6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgQk1XIGNhcnMgd2l0aCBhIGdyZWVuIGNvbG9yXG4gICAqIGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oY2Fycykud2hlcmUoYW5kKGVxKGNhcnMuY29sb3IsICdncmVlbicpLCBlcShjYXJzLmJyYW5kLCAnQk1XJykpKTtcbiAgICpcbiAgICogLy8gU2VsZWN0IGFsbCBjYXJzIHdpdGggdGhlIGdyZWVuIG9yIGJsdWUgY29sb3JcbiAgICogYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShjYXJzKS53aGVyZShvcihlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSwgZXEoY2Fycy5jb2xvciwgJ2JsdWUnKSkpO1xuICAgKiBgYGBcbiAgICovXG4gIHdoZXJlKHdoZXJlKSB7XG4gICAgaWYgKHR5cGVvZiB3aGVyZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB3aGVyZSA9IHdoZXJlKFxuICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzLFxuICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwic3FsXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLndoZXJlID0gd2hlcmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBgaGF2aW5nYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgc2VsZWN0IG9ubHkgdGhvc2Ugcm93cyB0aGF0IGZ1bGZpbGwgYSBzcGVjaWZpZWQgY29uZGl0aW9uLiBJdCBpcyB0eXBpY2FsbHkgdXNlZCB3aXRoIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMgdG8gZmlsdGVyIHRoZSBhZ2dyZWdhdGVkIGRhdGEgYmFzZWQgb24gYSBzcGVjaWZpZWQgY29uZGl0aW9uLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NlbGVjdCNhZ2dyZWdhdGlvbnN9XG4gICAqXG4gICAqIEBwYXJhbSBoYXZpbmcgdGhlIGBoYXZpbmdgIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCBicmFuZHMgd2l0aCBtb3JlIHRoYW4gb25lIGNhclxuICAgKiBhd2FpdCBkYi5zZWxlY3Qoe1xuICAgKiBcdGJyYW5kOiBjYXJzLmJyYW5kLFxuICAgKiBcdGNvdW50OiBzcWw8bnVtYmVyPmBjYXN0KGNvdW50KCR7Y2Fycy5pZH0pIGFzIGludClgLFxuICAgKiB9KVxuICAgKiAgIC5mcm9tKGNhcnMpXG4gICAqICAgLmdyb3VwQnkoY2Fycy5icmFuZClcbiAgICogICAuaGF2aW5nKCh7IGNvdW50IH0pID0+IGd0KGNvdW50LCAxKSk7XG4gICAqIGBgYFxuICAgKi9cbiAgaGF2aW5nKGhhdmluZykge1xuICAgIGlmICh0eXBlb2YgaGF2aW5nID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGhhdmluZyA9IGhhdmluZyhcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcInNxbFwiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy5oYXZpbmcgPSBoYXZpbmc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ3JvdXBCeSguLi5jb2x1bW5zKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW5zWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IGdyb3VwQnkgPSBjb2x1bW5zWzBdKFxuICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzLFxuICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHRoaXMuY29uZmlnLmdyb3VwQnkgPSBBcnJheS5pc0FycmF5KGdyb3VwQnkpID8gZ3JvdXBCeSA6IFtncm91cEJ5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWcuZ3JvdXBCeSA9IGNvbHVtbnM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9yZGVyQnkoLi4uY29sdW1ucykge1xuICAgIGlmICh0eXBlb2YgY29sdW1uc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmRlckJ5ID0gY29sdW1uc1swXShcbiAgICAgICAgbmV3IFByb3h5KFxuICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyxcbiAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCBvcmRlckJ5QXJyYXkgPSBBcnJheS5pc0FycmF5KG9yZGVyQnkpID8gb3JkZXJCeSA6IFtvcmRlckJ5XTtcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMuYXQoLTEpLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbmZpZy5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcmRlckJ5QXJyYXkgPSBjb2x1bW5zO1xuICAgICAgaWYgKHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5hdCgtMSkub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgYGxpbWl0YCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSB0aGlzIHF1ZXJ5LlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NlbGVjdCNsaW1pdC0tb2Zmc2V0fVxuICAgKlxuICAgKiBAcGFyYW0gbGltaXQgdGhlIGBsaW1pdGAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBHZXQgdGhlIGZpcnN0IDEwIHBlb3BsZSBmcm9tIHRoaXMgcXVlcnkuXG4gICAqIGF3YWl0IGRiLnNlbGVjdCgpLmZyb20ocGVvcGxlKS5saW1pdCgxMCk7XG4gICAqIGBgYFxuICAgKi9cbiAgbGltaXQobGltaXQpIHtcbiAgICBpZiAodGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5hdCgtMSkubGltaXQgPSBsaW1pdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWcubGltaXQgPSBsaW1pdDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYW4gYG9mZnNldGAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHNraXAgYSBudW1iZXIgb2Ygcm93cyB3aGVuIHJldHVybmluZyByZXN1bHRzIGZyb20gdGhpcyBxdWVyeS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZWxlY3QjbGltaXQtLW9mZnNldH1cbiAgICpcbiAgICogQHBhcmFtIG9mZnNldCB0aGUgYG9mZnNldGAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBHZXQgdGhlIDEwdGgtMjB0aCBwZW9wbGUgZnJvbSB0aGlzIHF1ZXJ5LlxuICAgKiBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKHBlb3BsZSkub2Zmc2V0KDEwKS5saW1pdCgxMCk7XG4gICAqIGBgYFxuICAgKi9cbiAgb2Zmc2V0KG9mZnNldCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmF0KC0xKS5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZmlnLm9mZnNldCA9IG9mZnNldDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbGVjdC5idWlsZFNlbGVjdFF1ZXJ5KHRoaXMuY29uZmlnKTtcbiAgfVxuICB0b1NRTCgpIHtcbiAgICBjb25zdCB7IHR5cGluZ3M6IF90eXBpbmdzLCAuLi5yZXN0IH0gPSB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKTtcbiAgICByZXR1cm4gcmVzdDtcbiAgfVxuICBhcyhhbGlhcykge1xuICAgIGNvbnN0IHVzZWRUYWJsZXMgPSBbXTtcbiAgICB1c2VkVGFibGVzLnB1c2goLi4uZXh0cmFjdFVzZWRUYWJsZSh0aGlzLmNvbmZpZy50YWJsZSkpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5qb2lucykge1xuICAgICAgZm9yIChjb25zdCBpdCBvZiB0aGlzLmNvbmZpZy5qb2lucykgdXNlZFRhYmxlcy5wdXNoKC4uLmV4dHJhY3RVc2VkVGFibGUoaXQudGFibGUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm94eShcbiAgICAgIG5ldyBTdWJxdWVyeSh0aGlzLmdldFNRTCgpLCB0aGlzLmNvbmZpZy5maWVsZHMsIGFsaWFzLCBmYWxzZSwgWy4uLm5ldyBTZXQodXNlZFRhYmxlcyldKSxcbiAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBhbGlhcywgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcImVycm9yXCIgfSlcbiAgICApO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U2VsZWN0ZWRGaWVsZHMoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShcbiAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyxcbiAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBhbGlhczogdGhpcy50YWJsZU5hbWUsIHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJlcnJvclwiIH0pXG4gICAgKTtcbiAgfVxuICAkZHluYW1pYygpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuY2xhc3MgU1FMaXRlU2VsZWN0QmFzZSBleHRlbmRzIFNRTGl0ZVNlbGVjdFF1ZXJ5QnVpbGRlckJhc2Uge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVTZWxlY3RcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJlcGFyZShpc09uZVRpbWVRdWVyeSA9IHRydWUpIHtcbiAgICBpZiAoIXRoaXMuc2Vzc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGV4ZWN1dGUgYSBxdWVyeSBvbiBhIHF1ZXJ5IGJ1aWxkZXIuIFBsZWFzZSB1c2UgYSBkYXRhYmFzZSBpbnN0YW5jZSBpbnN0ZWFkLlwiKTtcbiAgICB9XG4gICAgY29uc3QgZmllbGRzTGlzdCA9IG9yZGVyU2VsZWN0ZWRGaWVsZHModGhpcy5jb25maWcuZmllbGRzKTtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2Vzc2lvbltpc09uZVRpbWVRdWVyeSA/IFwicHJlcGFyZU9uZVRpbWVRdWVyeVwiIDogXCJwcmVwYXJlUXVlcnlcIl0oXG4gICAgICB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKSxcbiAgICAgIGZpZWxkc0xpc3QsXG4gICAgICBcImFsbFwiLFxuICAgICAgdHJ1ZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJzZWxlY3RcIixcbiAgICAgICAgdGFibGVzOiBbLi4udGhpcy51c2VkVGFibGVzXVxuICAgICAgfSxcbiAgICAgIHRoaXMuY2FjaGVDb25maWdcbiAgICApO1xuICAgIHF1ZXJ5LmpvaW5zTm90TnVsbGFibGVNYXAgPSB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXA7XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG4gICR3aXRoQ2FjaGUoY29uZmlnKSB7XG4gICAgdGhpcy5jYWNoZUNvbmZpZyA9IGNvbmZpZyA9PT0gdm9pZCAwID8geyBjb25maWc6IHt9LCBlbmFibGU6IHRydWUsIGF1dG9JbnZhbGlkYXRlOiB0cnVlIH0gOiBjb25maWcgPT09IGZhbHNlID8geyBlbmFibGU6IGZhbHNlIH0gOiB7IGVuYWJsZTogdHJ1ZSwgYXV0b0ludmFsaWRhdGU6IHRydWUsIC4uLmNvbmZpZyB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHByZXBhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpO1xuICB9XG4gIHJ1biA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkucnVuKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYWxsID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5hbGwocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBnZXQgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmdldChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIHZhbHVlcyA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkudmFsdWVzKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5hbGwoKTtcbiAgfVxufVxuYXBwbHlNaXhpbnMoU1FMaXRlU2VsZWN0QmFzZSwgW1F1ZXJ5UHJvbWlzZV0pO1xuZnVuY3Rpb24gY3JlYXRlU2V0T3BlcmF0b3IodHlwZSwgaXNBbGwpIHtcbiAgcmV0dXJuIChsZWZ0U2VsZWN0LCByaWdodFNlbGVjdCwgLi4ucmVzdFNlbGVjdHMpID0+IHtcbiAgICBjb25zdCBzZXRPcGVyYXRvcnMgPSBbcmlnaHRTZWxlY3QsIC4uLnJlc3RTZWxlY3RzXS5tYXAoKHNlbGVjdCkgPT4gKHtcbiAgICAgIHR5cGUsXG4gICAgICBpc0FsbCxcbiAgICAgIHJpZ2h0U2VsZWN0OiBzZWxlY3RcbiAgICB9KSk7XG4gICAgZm9yIChjb25zdCBzZXRPcGVyYXRvciBvZiBzZXRPcGVyYXRvcnMpIHtcbiAgICAgIGlmICghaGF2ZVNhbWVLZXlzKGxlZnRTZWxlY3QuZ2V0U2VsZWN0ZWRGaWVsZHMoKSwgc2V0T3BlcmF0b3IucmlnaHRTZWxlY3QuZ2V0U2VsZWN0ZWRGaWVsZHMoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiU2V0IG9wZXJhdG9yIGVycm9yICh1bmlvbiAvIGludGVyc2VjdCAvIGV4Y2VwdCk6IHNlbGVjdGVkIGZpZWxkcyBhcmUgbm90IHRoZSBzYW1lIG9yIGFyZSBpbiBhIGRpZmZlcmVudCBvcmRlclwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsZWZ0U2VsZWN0LmFkZFNldE9wZXJhdG9ycyhzZXRPcGVyYXRvcnMpO1xuICB9O1xufVxuY29uc3QgZ2V0U1FMaXRlU2V0T3BlcmF0b3JzID0gKCkgPT4gKHtcbiAgdW5pb24sXG4gIHVuaW9uQWxsLFxuICBpbnRlcnNlY3QsXG4gIGV4Y2VwdFxufSk7XG5jb25zdCB1bmlvbiA9IGNyZWF0ZVNldE9wZXJhdG9yKFwidW5pb25cIiwgZmFsc2UpO1xuY29uc3QgdW5pb25BbGwgPSBjcmVhdGVTZXRPcGVyYXRvcihcInVuaW9uXCIsIHRydWUpO1xuY29uc3QgaW50ZXJzZWN0ID0gY3JlYXRlU2V0T3BlcmF0b3IoXCJpbnRlcnNlY3RcIiwgZmFsc2UpO1xuY29uc3QgZXhjZXB0ID0gY3JlYXRlU2V0T3BlcmF0b3IoXCJleGNlcHRcIiwgZmFsc2UpO1xuZXhwb3J0IHtcbiAgU1FMaXRlU2VsZWN0QmFzZSxcbiAgU1FMaXRlU2VsZWN0QnVpbGRlcixcbiAgU1FMaXRlU2VsZWN0UXVlcnlCdWlsZGVyQmFzZSxcbiAgZXhjZXB0LFxuICBpbnRlcnNlY3QsXG4gIHVuaW9uLFxuICB1bmlvbkFsbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlbGVjdC5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU2VsZWN0aW9uUHJveHlIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL3NlbGVjdGlvbi1wcm94eS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlRGlhbGVjdCwgU1FMaXRlU3luY0RpYWxlY3QgfSBmcm9tIFwiLi4vZGlhbGVjdC5qc1wiO1xuaW1wb3J0IHsgV2l0aFN1YnF1ZXJ5IH0gZnJvbSBcIi4uLy4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVTZWxlY3RCdWlsZGVyIH0gZnJvbSBcIi4vc2VsZWN0LmpzXCI7XG5jbGFzcyBRdWVyeUJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVRdWVyeUJ1aWxkZXJcIjtcbiAgZGlhbGVjdDtcbiAgZGlhbGVjdENvbmZpZztcbiAgY29uc3RydWN0b3IoZGlhbGVjdCkge1xuICAgIHRoaXMuZGlhbGVjdCA9IGlzKGRpYWxlY3QsIFNRTGl0ZURpYWxlY3QpID8gZGlhbGVjdCA6IHZvaWQgMDtcbiAgICB0aGlzLmRpYWxlY3RDb25maWcgPSBpcyhkaWFsZWN0LCBTUUxpdGVEaWFsZWN0KSA/IHZvaWQgMCA6IGRpYWxlY3Q7XG4gIH1cbiAgJHdpdGggPSAoYWxpYXMsIHNlbGVjdGlvbikgPT4ge1xuICAgIGNvbnN0IHF1ZXJ5QnVpbGRlciA9IHRoaXM7XG4gICAgY29uc3QgYXMgPSAocWIpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcWIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBxYiA9IHFiKHF1ZXJ5QnVpbGRlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFByb3h5KFxuICAgICAgICBuZXcgV2l0aFN1YnF1ZXJ5KFxuICAgICAgICAgIHFiLmdldFNRTCgpLFxuICAgICAgICAgIHNlbGVjdGlvbiA/PyAoXCJnZXRTZWxlY3RlZEZpZWxkc1wiIGluIHFiID8gcWIuZ2V0U2VsZWN0ZWRGaWVsZHMoKSA/PyB7fSA6IHt9KSxcbiAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICksXG4gICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBhbGlhcywgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcImVycm9yXCIgfSlcbiAgICAgICk7XG4gICAgfTtcbiAgICByZXR1cm4geyBhcyB9O1xuICB9O1xuICB3aXRoKC4uLnF1ZXJpZXMpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBmdW5jdGlvbiBzZWxlY3QoZmllbGRzKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoe1xuICAgICAgICBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsXG4gICAgICAgIHNlc3Npb246IHZvaWQgMCxcbiAgICAgICAgZGlhbGVjdDogc2VsZi5nZXREaWFsZWN0KCksXG4gICAgICAgIHdpdGhMaXN0OiBxdWVyaWVzXG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2VsZWN0RGlzdGluY3QoZmllbGRzKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoe1xuICAgICAgICBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsXG4gICAgICAgIHNlc3Npb246IHZvaWQgMCxcbiAgICAgICAgZGlhbGVjdDogc2VsZi5nZXREaWFsZWN0KCksXG4gICAgICAgIHdpdGhMaXN0OiBxdWVyaWVzLFxuICAgICAgICBkaXN0aW5jdDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7IHNlbGVjdCwgc2VsZWN0RGlzdGluY3QgfTtcbiAgfVxuICBzZWxlY3QoZmllbGRzKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHsgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLCBzZXNzaW9uOiB2b2lkIDAsIGRpYWxlY3Q6IHRoaXMuZ2V0RGlhbGVjdCgpIH0pO1xuICB9XG4gIHNlbGVjdERpc3RpbmN0KGZpZWxkcykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7XG4gICAgICBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsXG4gICAgICBzZXNzaW9uOiB2b2lkIDAsXG4gICAgICBkaWFsZWN0OiB0aGlzLmdldERpYWxlY3QoKSxcbiAgICAgIGRpc3RpbmN0OiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgLy8gTGF6eSBsb2FkIGRpYWxlY3QgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeVxuICBnZXREaWFsZWN0KCkge1xuICAgIGlmICghdGhpcy5kaWFsZWN0KSB7XG4gICAgICB0aGlzLmRpYWxlY3QgPSBuZXcgU1FMaXRlU3luY0RpYWxlY3QodGhpcy5kaWFsZWN0Q29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGlhbGVjdDtcbiAgfVxufVxuZXhwb3J0IHtcbiAgUXVlcnlCdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnktYnVpbGRlci5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmltcG9ydCB7IFBhcmFtLCBTUUwsIHNxbCB9IGZyb20gXCIuLi8uLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgQ29sdW1ucywgVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IGhhdmVTYW1lS2V5cywgbWFwVXBkYXRlU2V0LCBvcmRlclNlbGVjdGVkRmllbGRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBleHRyYWN0VXNlZFRhYmxlIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9xdWVyeS1idWlsZGVyLmpzXCI7XG5jbGFzcyBTUUxpdGVJbnNlcnRCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IodGFibGUsIHNlc3Npb24sIGRpYWxlY3QsIHdpdGhMaXN0KSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLndpdGhMaXN0ID0gd2l0aExpc3Q7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW5zZXJ0QnVpbGRlclwiO1xuICB2YWx1ZXModmFsdWVzKSB7XG4gICAgdmFsdWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZXMpID8gdmFsdWVzIDogW3ZhbHVlc107XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInZhbHVlcygpIG11c3QgYmUgY2FsbGVkIHdpdGggYXQgbGVhc3Qgb25lIHZhbHVlXCIpO1xuICAgIH1cbiAgICBjb25zdCBtYXBwZWRWYWx1ZXMgPSB2YWx1ZXMubWFwKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICBjb25zdCBjb2xzID0gdGhpcy50YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG4gICAgICBmb3IgKGNvbnN0IGNvbEtleSBvZiBPYmplY3Qua2V5cyhlbnRyeSkpIHtcbiAgICAgICAgY29uc3QgY29sVmFsdWUgPSBlbnRyeVtjb2xLZXldO1xuICAgICAgICByZXN1bHRbY29sS2V5XSA9IGlzKGNvbFZhbHVlLCBTUUwpID8gY29sVmFsdWUgOiBuZXcgUGFyYW0oY29sVmFsdWUsIGNvbHNbY29sS2V5XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgU1FMaXRlSW5zZXJ0QmFzZSh0aGlzLnRhYmxlLCBtYXBwZWRWYWx1ZXMsIHRoaXMuc2Vzc2lvbiwgdGhpcy5kaWFsZWN0LCB0aGlzLndpdGhMaXN0KTtcbiAgfVxuICBzZWxlY3Qoc2VsZWN0UXVlcnkpIHtcbiAgICBjb25zdCBzZWxlY3QgPSB0eXBlb2Ygc2VsZWN0UXVlcnkgPT09IFwiZnVuY3Rpb25cIiA/IHNlbGVjdFF1ZXJ5KG5ldyBRdWVyeUJ1aWxkZXIoKSkgOiBzZWxlY3RRdWVyeTtcbiAgICBpZiAoIWlzKHNlbGVjdCwgU1FMKSAmJiAhaGF2ZVNhbWVLZXlzKHRoaXMudGFibGVbQ29sdW1uc10sIHNlbGVjdC5fLnNlbGVjdGVkRmllbGRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkluc2VydCBzZWxlY3QgZXJyb3I6IHNlbGVjdGVkIGZpZWxkcyBhcmUgbm90IHRoZSBzYW1lIG9yIGFyZSBpbiBhIGRpZmZlcmVudCBvcmRlciBjb21wYXJlZCB0byB0aGUgdGFibGUgZGVmaW5pdGlvblwiXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNRTGl0ZUluc2VydEJhc2UodGhpcy50YWJsZSwgc2VsZWN0LCB0aGlzLnNlc3Npb24sIHRoaXMuZGlhbGVjdCwgdGhpcy53aXRoTGlzdCwgdHJ1ZSk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUluc2VydEJhc2UgZXh0ZW5kcyBRdWVyeVByb21pc2Uge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgdmFsdWVzLCBzZXNzaW9uLCBkaWFsZWN0LCB3aXRoTGlzdCwgc2VsZWN0KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5jb25maWcgPSB7IHRhYmxlLCB2YWx1ZXMsIHdpdGhMaXN0LCBzZWxlY3QgfTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVJbnNlcnRcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25maWc7XG4gIHJldHVybmluZyhmaWVsZHMgPSB0aGlzLmNvbmZpZy50YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuQ29sdW1uc10pIHtcbiAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPSBvcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYW4gYG9uIGNvbmZsaWN0IGRvIG5vdGhpbmdgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgc2ltcGx5IGF2b2lkcyBpbnNlcnRpbmcgYSByb3cgYXMgaXRzIGFsdGVybmF0aXZlIGFjdGlvbi5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9pbnNlcnQjb24tY29uZmxpY3QtZG8tbm90aGluZ31cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyBUaGUgYHRhcmdldGAgYW5kIGB3aGVyZWAgY2xhdXNlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogLy8gSW5zZXJ0IG9uZSByb3cgYW5kIGNhbmNlbCB0aGUgaW5zZXJ0IGlmIHRoZXJlJ3MgYSBjb25mbGljdFxuICAgKiBhd2FpdCBkYi5pbnNlcnQoY2FycylcbiAgICogICAudmFsdWVzKHsgaWQ6IDEsIGJyYW5kOiAnQk1XJyB9KVxuICAgKiAgIC5vbkNvbmZsaWN0RG9Ob3RoaW5nKCk7XG4gICAqXG4gICAqIC8vIEV4cGxpY2l0bHkgc3BlY2lmeSBjb25mbGljdCB0YXJnZXRcbiAgICogYXdhaXQgZGIuaW5zZXJ0KGNhcnMpXG4gICAqICAgLnZhbHVlcyh7IGlkOiAxLCBicmFuZDogJ0JNVycgfSlcbiAgICogICAub25Db25mbGljdERvTm90aGluZyh7IHRhcmdldDogY2Fycy5pZCB9KTtcbiAgICogYGBgXG4gICAqL1xuICBvbkNvbmZsaWN0RG9Ob3RoaW5nKGNvbmZpZyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5vbkNvbmZsaWN0KSB0aGlzLmNvbmZpZy5vbkNvbmZsaWN0ID0gW107XG4gICAgaWYgKGNvbmZpZy50YXJnZXQgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5jb25maWcub25Db25mbGljdC5wdXNoKHNxbGAgb24gY29uZmxpY3QgZG8gbm90aGluZ2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YXJnZXRTcWwgPSBBcnJheS5pc0FycmF5KGNvbmZpZy50YXJnZXQpID8gc3FsYCR7Y29uZmlnLnRhcmdldH1gIDogc3FsYCR7W2NvbmZpZy50YXJnZXRdfWA7XG4gICAgICBjb25zdCB3aGVyZVNxbCA9IGNvbmZpZy53aGVyZSA/IHNxbGAgd2hlcmUgJHtjb25maWcud2hlcmV9YCA6IHNxbGBgO1xuICAgICAgdGhpcy5jb25maWcub25Db25mbGljdC5wdXNoKHNxbGAgb24gY29uZmxpY3QgJHt0YXJnZXRTcWx9IGRvIG5vdGhpbmcke3doZXJlU3FsfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhbiBgb24gY29uZmxpY3QgZG8gdXBkYXRlYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZSBleGlzdGluZyByb3cgdGhhdCBjb25mbGljdHMgd2l0aCB0aGUgcm93IHByb3Bvc2VkIGZvciBpbnNlcnRpb24gYXMgaXRzIGFsdGVybmF0aXZlIGFjdGlvbi5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9pbnNlcnQjdXBzZXJ0cy1hbmQtY29uZmxpY3RzfVxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIFRoZSBgdGFyZ2V0YCwgYHNldGAgYW5kIGB3aGVyZWAgY2xhdXNlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogLy8gVXBkYXRlIHRoZSByb3cgaWYgdGhlcmUncyBhIGNvbmZsaWN0XG4gICAqIGF3YWl0IGRiLmluc2VydChjYXJzKVxuICAgKiAgIC52YWx1ZXMoeyBpZDogMSwgYnJhbmQ6ICdCTVcnIH0pXG4gICAqICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAqICAgICB0YXJnZXQ6IGNhcnMuaWQsXG4gICAqICAgICBzZXQ6IHsgYnJhbmQ6ICdQb3JzY2hlJyB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqIC8vIFVwc2VydCB3aXRoICd3aGVyZScgY2xhdXNlXG4gICAqIGF3YWl0IGRiLmluc2VydChjYXJzKVxuICAgKiAgIC52YWx1ZXMoeyBpZDogMSwgYnJhbmQ6ICdCTVcnIH0pXG4gICAqICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAqICAgICB0YXJnZXQ6IGNhcnMuaWQsXG4gICAqICAgICBzZXQ6IHsgYnJhbmQ6ICduZXdCTVcnIH0sXG4gICAqICAgICB3aGVyZTogc3FsYCR7Y2Fycy5jcmVhdGVkQXR9ID4gJzIwMjMtMDEtMDEnOjpkYXRlYCxcbiAgICogICB9KTtcbiAgICogYGBgXG4gICAqL1xuICBvbkNvbmZsaWN0RG9VcGRhdGUoY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZy53aGVyZSAmJiAoY29uZmlnLnRhcmdldFdoZXJlIHx8IGNvbmZpZy5zZXRXaGVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1lvdSBjYW5ub3QgdXNlIGJvdGggXCJ3aGVyZVwiIGFuZCBcInRhcmdldFdoZXJlXCIvXCJzZXRXaGVyZVwiIGF0IHRoZSBzYW1lIHRpbWUgLSBcIndoZXJlXCIgaXMgZGVwcmVjYXRlZCwgdXNlIFwidGFyZ2V0V2hlcmVcIiBvciBcInNldFdoZXJlXCIgaW5zdGVhZC4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY29uZmlnLm9uQ29uZmxpY3QpIHRoaXMuY29uZmlnLm9uQ29uZmxpY3QgPSBbXTtcbiAgICBjb25zdCB3aGVyZVNxbCA9IGNvbmZpZy53aGVyZSA/IHNxbGAgd2hlcmUgJHtjb25maWcud2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCB0YXJnZXRXaGVyZVNxbCA9IGNvbmZpZy50YXJnZXRXaGVyZSA/IHNxbGAgd2hlcmUgJHtjb25maWcudGFyZ2V0V2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBzZXRXaGVyZVNxbCA9IGNvbmZpZy5zZXRXaGVyZSA/IHNxbGAgd2hlcmUgJHtjb25maWcuc2V0V2hlcmV9YCA6IHZvaWQgMDtcbiAgICBjb25zdCB0YXJnZXRTcWwgPSBBcnJheS5pc0FycmF5KGNvbmZpZy50YXJnZXQpID8gc3FsYCR7Y29uZmlnLnRhcmdldH1gIDogc3FsYCR7W2NvbmZpZy50YXJnZXRdfWA7XG4gICAgY29uc3Qgc2V0U3FsID0gdGhpcy5kaWFsZWN0LmJ1aWxkVXBkYXRlU2V0KHRoaXMuY29uZmlnLnRhYmxlLCBtYXBVcGRhdGVTZXQodGhpcy5jb25maWcudGFibGUsIGNvbmZpZy5zZXQpKTtcbiAgICB0aGlzLmNvbmZpZy5vbkNvbmZsaWN0LnB1c2goXG4gICAgICBzcWxgIG9uIGNvbmZsaWN0ICR7dGFyZ2V0U3FsfSR7dGFyZ2V0V2hlcmVTcWx9IGRvIHVwZGF0ZSBzZXQgJHtzZXRTcWx9JHt3aGVyZVNxbH0ke3NldFdoZXJlU3FsfWBcbiAgICApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiB0aGlzLmRpYWxlY3QuYnVpbGRJbnNlcnRRdWVyeSh0aGlzLmNvbmZpZyk7XG4gIH1cbiAgdG9TUUwoKSB7XG4gICAgY29uc3QgeyB0eXBpbmdzOiBfdHlwaW5ncywgLi4ucmVzdCB9ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSk7XG4gICAgcmV0dXJuIHJlc3Q7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJlcGFyZShpc09uZVRpbWVRdWVyeSA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uW2lzT25lVGltZVF1ZXJ5ID8gXCJwcmVwYXJlT25lVGltZVF1ZXJ5XCIgOiBcInByZXBhcmVRdWVyeVwiXShcbiAgICAgIHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nID8gXCJhbGxcIiA6IFwicnVuXCIsXG4gICAgICB0cnVlLFxuICAgICAgdm9pZCAwLFxuICAgICAge1xuICAgICAgICB0eXBlOiBcImluc2VydFwiLFxuICAgICAgICB0YWJsZXM6IGV4dHJhY3RVc2VkVGFibGUodGhpcy5jb25maWcudGFibGUpXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwcmVwYXJlKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKTtcbiAgfVxuICBydW4gPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnJ1bihwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFsbCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuYWxsKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgZ2V0ID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5nZXQocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICB2YWx1ZXMgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJldHVybmluZyA/IHRoaXMuYWxsKCkgOiB0aGlzLnJ1bigpO1xuICB9XG4gICRkeW5hbWljKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5leHBvcnQge1xuICBTUUxpdGVJbnNlcnRCYXNlLFxuICBTUUxpdGVJbnNlcnRCdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5zZXJ0LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuaW1wb3J0IHsgU2VsZWN0aW9uUHJveHlIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL3NlbGVjdGlvbi1wcm94eS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4uLy4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS5qc1wiO1xuaW1wb3J0IHtcbiAgZ2V0VGFibGVMaWtlTmFtZSxcbiAgbWFwVXBkYXRlU2V0LFxuICBvcmRlclNlbGVjdGVkRmllbGRzXG59IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi4vLi4vdmlldy1jb21tb24uanNcIjtcbmltcG9ydCB7IGV4dHJhY3RVc2VkVGFibGUgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVZpZXdCYXNlIH0gZnJvbSBcIi4uL3ZpZXctYmFzZS5qc1wiO1xuY2xhc3MgU1FMaXRlVXBkYXRlQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBzZXNzaW9uLCBkaWFsZWN0LCB3aXRoTGlzdCkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy53aXRoTGlzdCA9IHdpdGhMaXN0O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVVwZGF0ZUJ1aWxkZXJcIjtcbiAgc2V0KHZhbHVlcykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVXBkYXRlQmFzZShcbiAgICAgIHRoaXMudGFibGUsXG4gICAgICBtYXBVcGRhdGVTZXQodGhpcy50YWJsZSwgdmFsdWVzKSxcbiAgICAgIHRoaXMuc2Vzc2lvbixcbiAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgIHRoaXMud2l0aExpc3RcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVVcGRhdGVCYXNlIGV4dGVuZHMgUXVlcnlQcm9taXNlIHtcbiAgY29uc3RydWN0b3IodGFibGUsIHNldCwgc2Vzc2lvbiwgZGlhbGVjdCwgd2l0aExpc3QpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLmNvbmZpZyA9IHsgc2V0LCB0YWJsZSwgd2l0aExpc3QsIGpvaW5zOiBbXSB9O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVVwZGF0ZVwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbmZpZztcbiAgZnJvbShzb3VyY2UpIHtcbiAgICB0aGlzLmNvbmZpZy5mcm9tID0gc291cmNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGNyZWF0ZUpvaW4oam9pblR5cGUpIHtcbiAgICByZXR1cm4gKHRhYmxlLCBvbikgPT4ge1xuICAgICAgY29uc3QgdGFibGVOYW1lID0gZ2V0VGFibGVMaWtlTmFtZSh0YWJsZSk7XG4gICAgICBpZiAodHlwZW9mIHRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLmNvbmZpZy5qb2lucy5zb21lKChqb2luKSA9PiBqb2luLmFsaWFzID09PSB0YWJsZU5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQWxpYXMgXCIke3RhYmxlTmFtZX1cIiBpcyBhbHJlYWR5IHVzZWQgaW4gdGhpcyBxdWVyeWApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IGZyb20gPSB0aGlzLmNvbmZpZy5mcm9tID8gaXModGFibGUsIFNRTGl0ZVRhYmxlKSA/IHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSA6IGlzKHRhYmxlLCBTdWJxdWVyeSkgPyB0YWJsZS5fLnNlbGVjdGVkRmllbGRzIDogaXModGFibGUsIFNRTGl0ZVZpZXdCYXNlKSA/IHRhYmxlW1ZpZXdCYXNlQ29uZmlnXS5zZWxlY3RlZEZpZWxkcyA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgICAgb24gPSBvbihcbiAgICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy50YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10sXG4gICAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcInNxbFwiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICAgICksXG4gICAgICAgICAgZnJvbSAmJiBuZXcgUHJveHkoXG4gICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJzcWxcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbmZpZy5qb2lucy5wdXNoKHsgb24sIHRhYmxlLCBqb2luVHlwZSwgYWxpYXM6IHRhYmxlTmFtZSB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gIH1cbiAgbGVmdEpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJsZWZ0XCIpO1xuICByaWdodEpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJyaWdodFwiKTtcbiAgaW5uZXJKb2luID0gdGhpcy5jcmVhdGVKb2luKFwiaW5uZXJcIik7XG4gIGZ1bGxKb2luID0gdGhpcy5jcmVhdGVKb2luKFwiZnVsbFwiKTtcbiAgLyoqXG4gICAqIEFkZHMgYSAnd2hlcmUnIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgb25seSB0aG9zZSByb3dzIHRoYXQgZnVsZmlsbCBhIHNwZWNpZmllZCBjb25kaXRpb24uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvdXBkYXRlfVxuICAgKlxuICAgKiBAcGFyYW0gd2hlcmUgdGhlICd3aGVyZScgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBZb3UgY2FuIHVzZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgYW5kIGBzcWwgZnVuY3Rpb25gIHRvIGZpbHRlciB0aGUgcm93cyB0byBiZSB1cGRhdGVkLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBVcGRhdGUgYWxsIGNhcnMgd2l0aCBncmVlbiBjb2xvclxuICAgKiBkYi51cGRhdGUoY2Fycykuc2V0KHsgY29sb3I6ICdyZWQnIH0pXG4gICAqICAgLndoZXJlKGVxKGNhcnMuY29sb3IsICdncmVlbicpKTtcbiAgICogLy8gb3JcbiAgICogZGIudXBkYXRlKGNhcnMpLnNldCh7IGNvbG9yOiAncmVkJyB9KVxuICAgKiAgIC53aGVyZShzcWxgJHtjYXJzLmNvbG9yfSA9ICdncmVlbidgKVxuICAgKiBgYGBcbiAgICpcbiAgICogWW91IGNhbiBsb2dpY2FsbHkgY29tYmluZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgd2l0aCBgYW5kKClgIGFuZCBgb3IoKWAgb3BlcmF0b3JzOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBVcGRhdGUgYWxsIEJNVyBjYXJzIHdpdGggYSBncmVlbiBjb2xvclxuICAgKiBkYi51cGRhdGUoY2Fycykuc2V0KHsgY29sb3I6ICdyZWQnIH0pXG4gICAqICAgLndoZXJlKGFuZChlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSwgZXEoY2Fycy5icmFuZCwgJ0JNVycpKSk7XG4gICAqXG4gICAqIC8vIFVwZGF0ZSBhbGwgY2FycyB3aXRoIHRoZSBncmVlbiBvciBibHVlIGNvbG9yXG4gICAqIGRiLnVwZGF0ZShjYXJzKS5zZXQoeyBjb2xvcjogJ3JlZCcgfSlcbiAgICogICAud2hlcmUob3IoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJyksIGVxKGNhcnMuY29sb3IsICdibHVlJykpKTtcbiAgICogYGBgXG4gICAqL1xuICB3aGVyZSh3aGVyZSkge1xuICAgIHRoaXMuY29uZmlnLndoZXJlID0gd2hlcmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb3JkZXJCeSguLi5jb2x1bW5zKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW5zWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yZGVyQnkgPSBjb2x1bW5zWzBdKFxuICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgdGhpcy5jb25maWcudGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdLFxuICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG9yZGVyQnlBcnJheSA9IEFycmF5LmlzQXJyYXkob3JkZXJCeSkgPyBvcmRlckJ5IDogW29yZGVyQnldO1xuICAgICAgdGhpcy5jb25maWcub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3JkZXJCeUFycmF5ID0gY29sdW1ucztcbiAgICAgIHRoaXMuY29uZmlnLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGxpbWl0KGxpbWl0KSB7XG4gICAgdGhpcy5jb25maWcubGltaXQgPSBsaW1pdDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICByZXR1cm5pbmcoZmllbGRzID0gdGhpcy5jb25maWcudGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkNvbHVtbnNdKSB7XG4gICAgdGhpcy5jb25maWcucmV0dXJuaW5nID0gb3JkZXJTZWxlY3RlZEZpZWxkcyhmaWVsZHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiB0aGlzLmRpYWxlY3QuYnVpbGRVcGRhdGVRdWVyeSh0aGlzLmNvbmZpZyk7XG4gIH1cbiAgdG9TUUwoKSB7XG4gICAgY29uc3QgeyB0eXBpbmdzOiBfdHlwaW5ncywgLi4ucmVzdCB9ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSk7XG4gICAgcmV0dXJuIHJlc3Q7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJlcGFyZShpc09uZVRpbWVRdWVyeSA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uW2lzT25lVGltZVF1ZXJ5ID8gXCJwcmVwYXJlT25lVGltZVF1ZXJ5XCIgOiBcInByZXBhcmVRdWVyeVwiXShcbiAgICAgIHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nLFxuICAgICAgdGhpcy5jb25maWcucmV0dXJuaW5nID8gXCJhbGxcIiA6IFwicnVuXCIsXG4gICAgICB0cnVlLFxuICAgICAgdm9pZCAwLFxuICAgICAge1xuICAgICAgICB0eXBlOiBcImluc2VydFwiLFxuICAgICAgICB0YWJsZXM6IGV4dHJhY3RVc2VkVGFibGUodGhpcy5jb25maWcudGFibGUpXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwcmVwYXJlKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKTtcbiAgfVxuICBydW4gPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnJ1bihwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFsbCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuYWxsKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgZ2V0ID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5nZXQocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICB2YWx1ZXMgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLnZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJldHVybmluZyA/IHRoaXMuYWxsKCkgOiB0aGlzLnJ1bigpO1xuICB9XG4gICRkeW5hbWljKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5leHBvcnQge1xuICBTUUxpdGVVcGRhdGVCYXNlLFxuICBTUUxpdGVVcGRhdGVCdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXBkYXRlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNRTCwgc3FsIH0gZnJvbSBcIi4uLy4uL3NxbC9zcWwuanNcIjtcbmNsYXNzIFNRTGl0ZUNvdW50QnVpbGRlciBleHRlbmRzIFNRTCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKFNRTGl0ZUNvdW50QnVpbGRlci5idWlsZEVtYmVkZGVkQ291bnQocGFyYW1zLnNvdXJjZSwgcGFyYW1zLmZpbHRlcnMpLnF1ZXJ5Q2h1bmtzKTtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLnNlc3Npb24gPSBwYXJhbXMuc2Vzc2lvbjtcbiAgICB0aGlzLnNxbCA9IFNRTGl0ZUNvdW50QnVpbGRlci5idWlsZENvdW50KFxuICAgICAgcGFyYW1zLnNvdXJjZSxcbiAgICAgIHBhcmFtcy5maWx0ZXJzXG4gICAgKTtcbiAgfVxuICBzcWw7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUNvdW50QnVpbGRlckFzeW5jXCI7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddID0gXCJTUUxpdGVDb3VudEJ1aWxkZXJBc3luY1wiO1xuICBzZXNzaW9uO1xuICBzdGF0aWMgYnVpbGRFbWJlZGRlZENvdW50KHNvdXJjZSwgZmlsdGVycykge1xuICAgIHJldHVybiBzcWxgKHNlbGVjdCBjb3VudCgqKSBmcm9tICR7c291cmNlfSR7c3FsLnJhdyhcIiB3aGVyZSBcIikuaWYoZmlsdGVycyl9JHtmaWx0ZXJzfSlgO1xuICB9XG4gIHN0YXRpYyBidWlsZENvdW50KHNvdXJjZSwgZmlsdGVycykge1xuICAgIHJldHVybiBzcWxgc2VsZWN0IGNvdW50KCopIGZyb20gJHtzb3VyY2V9JHtzcWwucmF3KFwiIHdoZXJlIFwiKS5pZihmaWx0ZXJzKX0ke2ZpbHRlcnN9YDtcbiAgfVxuICB0aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnNlc3Npb24uY291bnQodGhpcy5zcWwpKS50aGVuKFxuICAgICAgb25mdWxmaWxsZWQsXG4gICAgICBvbnJlamVjdGVkXG4gICAgKTtcbiAgfVxuICBjYXRjaChvblJlamVjdGVkKSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbih2b2lkIDAsIG9uUmVqZWN0ZWQpO1xuICB9XG4gIGZpbmFsbHkob25GaW5hbGx5KSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICBvbkZpbmFsbHk/LigpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9LFxuICAgICAgKHJlYXNvbikgPT4ge1xuICAgICAgICBvbkZpbmFsbHk/LigpO1xuICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgU1FMaXRlQ291bnRCdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y291bnQuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmltcG9ydCB7XG4gIG1hcFJlbGF0aW9uYWxSb3dcbn0gZnJvbSBcIi4uLy4uL3JlbGF0aW9ucy5qc1wiO1xuY2xhc3MgUmVsYXRpb25hbFF1ZXJ5QnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKG1vZGUsIGZ1bGxTY2hlbWEsIHNjaGVtYSwgdGFibGVOYW1lc01hcCwgdGFibGUsIHRhYmxlQ29uZmlnLCBkaWFsZWN0LCBzZXNzaW9uKSB7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICB0aGlzLmZ1bGxTY2hlbWEgPSBmdWxsU2NoZW1hO1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMudGFibGVOYW1lc01hcCA9IHRhYmxlTmFtZXNNYXA7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMudGFibGVDb25maWcgPSB0YWJsZUNvbmZpZztcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQXN5bmNSZWxhdGlvbmFsUXVlcnlCdWlsZGVyXCI7XG4gIGZpbmRNYW55KGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09IFwic3luY1wiID8gbmV3IFNRTGl0ZVN5bmNSZWxhdGlvbmFsUXVlcnkoXG4gICAgICB0aGlzLmZ1bGxTY2hlbWEsXG4gICAgICB0aGlzLnNjaGVtYSxcbiAgICAgIHRoaXMudGFibGVOYW1lc01hcCxcbiAgICAgIHRoaXMudGFibGUsXG4gICAgICB0aGlzLnRhYmxlQ29uZmlnLFxuICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgdGhpcy5zZXNzaW9uLFxuICAgICAgY29uZmlnID8gY29uZmlnIDoge30sXG4gICAgICBcIm1hbnlcIlxuICAgICkgOiBuZXcgU1FMaXRlUmVsYXRpb25hbFF1ZXJ5KFxuICAgICAgdGhpcy5mdWxsU2NoZW1hLFxuICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0aGlzLnRhYmxlLFxuICAgICAgdGhpcy50YWJsZUNvbmZpZyxcbiAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgIHRoaXMuc2Vzc2lvbixcbiAgICAgIGNvbmZpZyA/IGNvbmZpZyA6IHt9LFxuICAgICAgXCJtYW55XCJcbiAgICApO1xuICB9XG4gIGZpbmRGaXJzdChjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBcInN5bmNcIiA/IG5ldyBTUUxpdGVTeW5jUmVsYXRpb25hbFF1ZXJ5KFxuICAgICAgdGhpcy5mdWxsU2NoZW1hLFxuICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0aGlzLnRhYmxlLFxuICAgICAgdGhpcy50YWJsZUNvbmZpZyxcbiAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgIHRoaXMuc2Vzc2lvbixcbiAgICAgIGNvbmZpZyA/IHsgLi4uY29uZmlnLCBsaW1pdDogMSB9IDogeyBsaW1pdDogMSB9LFxuICAgICAgXCJmaXJzdFwiXG4gICAgKSA6IG5ldyBTUUxpdGVSZWxhdGlvbmFsUXVlcnkoXG4gICAgICB0aGlzLmZ1bGxTY2hlbWEsXG4gICAgICB0aGlzLnNjaGVtYSxcbiAgICAgIHRoaXMudGFibGVOYW1lc01hcCxcbiAgICAgIHRoaXMudGFibGUsXG4gICAgICB0aGlzLnRhYmxlQ29uZmlnLFxuICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgdGhpcy5zZXNzaW9uLFxuICAgICAgY29uZmlnID8geyAuLi5jb25maWcsIGxpbWl0OiAxIH0gOiB7IGxpbWl0OiAxIH0sXG4gICAgICBcImZpcnN0XCJcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVSZWxhdGlvbmFsUXVlcnkgZXh0ZW5kcyBRdWVyeVByb21pc2Uge1xuICBjb25zdHJ1Y3RvcihmdWxsU2NoZW1hLCBzY2hlbWEsIHRhYmxlTmFtZXNNYXAsIHRhYmxlLCB0YWJsZUNvbmZpZywgZGlhbGVjdCwgc2Vzc2lvbiwgY29uZmlnLCBtb2RlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmZ1bGxTY2hlbWEgPSBmdWxsU2NoZW1hO1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMudGFibGVOYW1lc01hcCA9IHRhYmxlTmFtZXNNYXA7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMudGFibGVDb25maWcgPSB0YWJsZUNvbmZpZztcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVBc3luY1JlbGF0aW9uYWxRdWVyeVwiO1xuICAvKiogQGludGVybmFsICovXG4gIG1vZGU7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiB0aGlzLmRpYWxlY3QuYnVpbGRSZWxhdGlvbmFsUXVlcnkoe1xuICAgICAgZnVsbFNjaGVtYTogdGhpcy5mdWxsU2NoZW1hLFxuICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgIHRhYmxlTmFtZXNNYXA6IHRoaXMudGFibGVOYW1lc01hcCxcbiAgICAgIHRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgdGFibGVDb25maWc6IHRoaXMudGFibGVDb25maWcsXG4gICAgICBxdWVyeUNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICB0YWJsZUFsaWFzOiB0aGlzLnRhYmxlQ29uZmlnLnRzTmFtZVxuICAgIH0pLnNxbDtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9wcmVwYXJlKGlzT25lVGltZVF1ZXJ5ID0gZmFsc2UpIHtcbiAgICBjb25zdCB7IHF1ZXJ5LCBidWlsdFF1ZXJ5IH0gPSB0aGlzLl90b1NRTCgpO1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25baXNPbmVUaW1lUXVlcnkgPyBcInByZXBhcmVPbmVUaW1lUXVlcnlcIiA6IFwicHJlcGFyZVF1ZXJ5XCJdKFxuICAgICAgYnVpbHRRdWVyeSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHRoaXMubW9kZSA9PT0gXCJmaXJzdFwiID8gXCJnZXRcIiA6IFwiYWxsXCIsXG4gICAgICB0cnVlLFxuICAgICAgKHJhd1Jvd3MsIG1hcENvbHVtblZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSByYXdSb3dzLm1hcChcbiAgICAgICAgICAocm93KSA9PiBtYXBSZWxhdGlvbmFsUm93KHRoaXMuc2NoZW1hLCB0aGlzLnRhYmxlQ29uZmlnLCByb3csIHF1ZXJ5LnNlbGVjdGlvbiwgbWFwQ29sdW1uVmFsdWUpXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09IFwiZmlyc3RcIikge1xuICAgICAgICAgIHJldHVybiByb3dzWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJlcGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSk7XG4gIH1cbiAgX3RvU1FMKCkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5kaWFsZWN0LmJ1aWxkUmVsYXRpb25hbFF1ZXJ5KHtcbiAgICAgIGZ1bGxTY2hlbWE6IHRoaXMuZnVsbFNjaGVtYSxcbiAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICB0YWJsZU5hbWVzTWFwOiB0aGlzLnRhYmxlTmFtZXNNYXAsXG4gICAgICB0YWJsZTogdGhpcy50YWJsZSxcbiAgICAgIHRhYmxlQ29uZmlnOiB0aGlzLnRhYmxlQ29uZmlnLFxuICAgICAgcXVlcnlDb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgdGFibGVBbGlhczogdGhpcy50YWJsZUNvbmZpZy50c05hbWVcbiAgICB9KTtcbiAgICBjb25zdCBidWlsdFF1ZXJ5ID0gdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkocXVlcnkuc3FsKTtcbiAgICByZXR1cm4geyBxdWVyeSwgYnVpbHRRdWVyeSB9O1xuICB9XG4gIHRvU1FMKCkge1xuICAgIHJldHVybiB0aGlzLl90b1NRTCgpLmJ1aWx0UXVlcnk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBleGVjdXRlUmF3KCkge1xuICAgIGlmICh0aGlzLm1vZGUgPT09IFwiZmlyc3RcIikge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpLmdldCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSkuYWxsKCk7XG4gIH1cbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmF3KCk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVN5bmNSZWxhdGlvbmFsUXVlcnkgZXh0ZW5kcyBTUUxpdGVSZWxhdGlvbmFsUXVlcnkge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVTeW5jUmVsYXRpb25hbFF1ZXJ5XCI7XG4gIHN5bmMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJhdygpO1xuICB9XG59XG5leHBvcnQge1xuICBSZWxhdGlvbmFsUXVlcnlCdWlsZGVyLFxuICBTUUxpdGVSZWxhdGlvbmFsUXVlcnksXG4gIFNRTGl0ZVN5bmNSZWxhdGlvbmFsUXVlcnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1xdWVyeS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuY2xhc3MgU1FMaXRlUmF3IGV4dGVuZHMgUXVlcnlQcm9taXNlIHtcbiAgY29uc3RydWN0b3IoZXhlY3V0ZSwgZ2V0U1FMLCBhY3Rpb24sIGRpYWxlY3QsIG1hcEJhdGNoUmVzdWx0KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmV4ZWN1dGUgPSBleGVjdXRlO1xuICAgIHRoaXMuZ2V0U1FMID0gZ2V0U1FMO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5tYXBCYXRjaFJlc3VsdCA9IG1hcEJhdGNoUmVzdWx0O1xuICAgIHRoaXMuY29uZmlnID0geyBhY3Rpb24gfTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVSYXdcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25maWc7XG4gIGdldFF1ZXJ5KCkge1xuICAgIHJldHVybiB7IC4uLnRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpLCBtZXRob2Q6IHRoaXMuY29uZmlnLmFjdGlvbiB9O1xuICB9XG4gIG1hcFJlc3VsdChyZXN1bHQsIGlzRnJvbUJhdGNoKSB7XG4gICAgcmV0dXJuIGlzRnJvbUJhdGNoID8gdGhpcy5tYXBCYXRjaFJlc3VsdChyZXN1bHQpIDogcmVzdWx0O1xuICB9XG4gIF9wcmVwYXJlKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgaXNSZXNwb25zZUluQXJyYXlNb2RlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgU1FMaXRlUmF3XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmF3LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNlbGVjdGlvblByb3h5SGFuZGxlciB9IGZyb20gXCIuLi9zZWxlY3Rpb24tcHJveHkuanNcIjtcbmltcG9ydCB7IHNxbCB9IGZyb20gXCIuLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQge1xuICBRdWVyeUJ1aWxkZXIsXG4gIFNRTGl0ZURlbGV0ZUJhc2UsXG4gIFNRTGl0ZUluc2VydEJ1aWxkZXIsXG4gIFNRTGl0ZVNlbGVjdEJ1aWxkZXIsXG4gIFNRTGl0ZVVwZGF0ZUJ1aWxkZXJcbn0gZnJvbSBcIi4vcXVlcnktYnVpbGRlcnMvaW5kZXguanNcIjtcbmltcG9ydCB7IFdpdGhTdWJxdWVyeSB9IGZyb20gXCIuLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ291bnRCdWlsZGVyIH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlcnMvY291bnQuanNcIjtcbmltcG9ydCB7IFJlbGF0aW9uYWxRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9xdWVyeS1idWlsZGVycy9xdWVyeS5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlUmF3IH0gZnJvbSBcIi4vcXVlcnktYnVpbGRlcnMvcmF3LmpzXCI7XG5jbGFzcyBCYXNlU1FMaXRlRGF0YWJhc2Uge1xuICBjb25zdHJ1Y3RvcihyZXN1bHRLaW5kLCBkaWFsZWN0LCBzZXNzaW9uLCBzY2hlbWEpIHtcbiAgICB0aGlzLnJlc3VsdEtpbmQgPSByZXN1bHRLaW5kO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLl8gPSBzY2hlbWEgPyB7XG4gICAgICBzY2hlbWE6IHNjaGVtYS5zY2hlbWEsXG4gICAgICBmdWxsU2NoZW1hOiBzY2hlbWEuZnVsbFNjaGVtYSxcbiAgICAgIHRhYmxlTmFtZXNNYXA6IHNjaGVtYS50YWJsZU5hbWVzTWFwXG4gICAgfSA6IHtcbiAgICAgIHNjaGVtYTogdm9pZCAwLFxuICAgICAgZnVsbFNjaGVtYToge30sXG4gICAgICB0YWJsZU5hbWVzTWFwOiB7fVxuICAgIH07XG4gICAgdGhpcy5xdWVyeSA9IHt9O1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyeTtcbiAgICBpZiAodGhpcy5fLnNjaGVtYSkge1xuICAgICAgZm9yIChjb25zdCBbdGFibGVOYW1lLCBjb2x1bW5zXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl8uc2NoZW1hKSkge1xuICAgICAgICBxdWVyeVt0YWJsZU5hbWVdID0gbmV3IFJlbGF0aW9uYWxRdWVyeUJ1aWxkZXIoXG4gICAgICAgICAgcmVzdWx0S2luZCxcbiAgICAgICAgICBzY2hlbWEuZnVsbFNjaGVtYSxcbiAgICAgICAgICB0aGlzLl8uc2NoZW1hLFxuICAgICAgICAgIHRoaXMuXy50YWJsZU5hbWVzTWFwLFxuICAgICAgICAgIHNjaGVtYS5mdWxsU2NoZW1hW3RhYmxlTmFtZV0sXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBkaWFsZWN0LFxuICAgICAgICAgIHNlc3Npb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4kY2FjaGUgPSB7IGludmFsaWRhdGU6IGFzeW5jIChfcGFyYW1zKSA9PiB7XG4gICAgfSB9O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkJhc2VTUUxpdGVEYXRhYmFzZVwiO1xuICBxdWVyeTtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBzdWJxdWVyeSB0aGF0IGRlZmluZXMgYSB0ZW1wb3JhcnkgbmFtZWQgcmVzdWx0IHNldCBhcyBhIENURS5cbiAgICpcbiAgICogSXQgaXMgdXNlZnVsIGZvciBicmVha2luZyBkb3duIGNvbXBsZXggcXVlcmllcyBpbnRvIHNpbXBsZXIgcGFydHMgYW5kIGZvciByZXVzaW5nIHRoZSByZXN1bHQgc2V0IGluIHN1YnNlcXVlbnQgcGFydHMgb2YgdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NlbGVjdCN3aXRoLWNsYXVzZX1cbiAgICpcbiAgICogQHBhcmFtIGFsaWFzIFRoZSBhbGlhcyBmb3IgdGhlIHN1YnF1ZXJ5LlxuICAgKlxuICAgKiBGYWlsdXJlIHRvIHByb3ZpZGUgYW4gYWxpYXMgd2lsbCByZXN1bHQgaW4gYSBEcml6emxlVHlwZUVycm9yLCBwcmV2ZW50aW5nIHRoZSBzdWJxdWVyeSBmcm9tIGJlaW5nIHJlZmVyZW5jZWQgaW4gb3RoZXIgcXVlcmllcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gQ3JlYXRlIGEgc3VicXVlcnkgd2l0aCBhbGlhcyAnc3EnIGFuZCB1c2UgaXQgaW4gdGhlIHNlbGVjdCBxdWVyeVxuICAgKiBjb25zdCBzcSA9IGRiLiR3aXRoKCdzcScpLmFzKGRiLnNlbGVjdCgpLmZyb20odXNlcnMpLndoZXJlKGVxKHVzZXJzLmlkLCA0MikpKTtcbiAgICpcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIud2l0aChzcSkuc2VsZWN0KCkuZnJvbShzcSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBUbyBzZWxlY3QgYXJiaXRyYXJ5IFNRTCB2YWx1ZXMgYXMgZmllbGRzIGluIGEgQ1RFIGFuZCByZWZlcmVuY2UgdGhlbSBpbiBvdGhlciBDVEVzIG9yIGluIHRoZSBtYWluIHF1ZXJ5LCB5b3UgbmVlZCB0byBhZGQgYWxpYXNlcyB0byB0aGVtOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYW4gYXJiaXRyYXJ5IFNRTCB2YWx1ZSBhcyBhIGZpZWxkIGluIGEgQ1RFIGFuZCByZWZlcmVuY2UgaXQgaW4gdGhlIG1haW4gcXVlcnlcbiAgICogY29uc3Qgc3EgPSBkYi4kd2l0aCgnc3EnKS5hcyhkYi5zZWxlY3Qoe1xuICAgKiAgIG5hbWU6IHNxbDxzdHJpbmc+YHVwcGVyKCR7dXNlcnMubmFtZX0pYC5hcygnbmFtZScpLFxuICAgKiB9KVxuICAgKiAuZnJvbSh1c2VycykpO1xuICAgKlxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi53aXRoKHNxKS5zZWxlY3QoeyBuYW1lOiBzcS5uYW1lIH0pLmZyb20oc3EpO1xuICAgKiBgYGBcbiAgICovXG4gICR3aXRoID0gKGFsaWFzLCBzZWxlY3Rpb24pID0+IHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBhcyA9IChxYikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBxYiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHFiID0gcWIobmV3IFF1ZXJ5QnVpbGRlcihzZWxmLmRpYWxlY3QpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICAgIG5ldyBXaXRoU3VicXVlcnkoXG4gICAgICAgICAgcWIuZ2V0U1FMKCksXG4gICAgICAgICAgc2VsZWN0aW9uID8/IChcImdldFNlbGVjdGVkRmllbGRzXCIgaW4gcWIgPyBxYi5nZXRTZWxlY3RlZEZpZWxkcygpID8/IHt9IDoge30pLFxuICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKSxcbiAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IGFsaWFzLCBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwiZXJyb3JcIiB9KVxuICAgICAgKTtcbiAgICB9O1xuICAgIHJldHVybiB7IGFzIH07XG4gIH07XG4gICRjb3VudChzb3VyY2UsIGZpbHRlcnMpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUNvdW50QnVpbGRlcih7IHNvdXJjZSwgZmlsdGVycywgc2Vzc2lvbjogdGhpcy5zZXNzaW9uIH0pO1xuICB9XG4gIC8qKlxuICAgKiBJbmNvcnBvcmF0ZXMgYSBwcmV2aW91c2x5IGRlZmluZWQgQ1RFICh1c2luZyBgJHdpdGhgKSBpbnRvIHRoZSBtYWluIHF1ZXJ5LlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgdGhlIG1haW4gcXVlcnkgdG8gcmVmZXJlbmNlIGEgdGVtcG9yYXJ5IG5hbWVkIHJlc3VsdCBzZXQuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2VsZWN0I3dpdGgtY2xhdXNlfVxuICAgKlxuICAgKiBAcGFyYW0gcXVlcmllcyBUaGUgQ1RFcyB0byBpbmNvcnBvcmF0ZSBpbnRvIHRoZSBtYWluIHF1ZXJ5LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBEZWZpbmUgYSBzdWJxdWVyeSAnc3EnIGFzIGEgQ1RFIHVzaW5nICR3aXRoXG4gICAqIGNvbnN0IHNxID0gZGIuJHdpdGgoJ3NxJykuYXMoZGIuc2VsZWN0KCkuZnJvbSh1c2Vycykud2hlcmUoZXEodXNlcnMuaWQsIDQyKSkpO1xuICAgKlxuICAgKiAvLyBJbmNvcnBvcmF0ZSB0aGUgQ1RFICdzcScgaW50byB0aGUgbWFpbiBxdWVyeSBhbmQgc2VsZWN0IGZyb20gaXRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIud2l0aChzcSkuc2VsZWN0KCkuZnJvbShzcSk7XG4gICAqIGBgYFxuICAgKi9cbiAgd2l0aCguLi5xdWVyaWVzKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgZnVuY3Rpb24gc2VsZWN0KGZpZWxkcykge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHtcbiAgICAgICAgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLFxuICAgICAgICBzZXNzaW9uOiBzZWxmLnNlc3Npb24sXG4gICAgICAgIGRpYWxlY3Q6IHNlbGYuZGlhbGVjdCxcbiAgICAgICAgd2l0aExpc3Q6IHF1ZXJpZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZWxlY3REaXN0aW5jdChmaWVsZHMpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7XG4gICAgICAgIGZpZWxkczogZmllbGRzID8/IHZvaWQgMCxcbiAgICAgICAgc2Vzc2lvbjogc2VsZi5zZXNzaW9uLFxuICAgICAgICBkaWFsZWN0OiBzZWxmLmRpYWxlY3QsXG4gICAgICAgIHdpdGhMaXN0OiBxdWVyaWVzLFxuICAgICAgICBkaXN0aW5jdDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZSh0YWJsZSkge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVVcGRhdGVCdWlsZGVyKHRhYmxlLCBzZWxmLnNlc3Npb24sIHNlbGYuZGlhbGVjdCwgcXVlcmllcyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGluc2VydChpbnRvKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZUluc2VydEJ1aWxkZXIoaW50bywgc2VsZi5zZXNzaW9uLCBzZWxmLmRpYWxlY3QsIHF1ZXJpZXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWxldGVfKGZyb20pIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlRGVsZXRlQmFzZShmcm9tLCBzZWxmLnNlc3Npb24sIHNlbGYuZGlhbGVjdCwgcXVlcmllcyk7XG4gICAgfVxuICAgIHJldHVybiB7IHNlbGVjdCwgc2VsZWN0RGlzdGluY3QsIHVwZGF0ZSwgaW5zZXJ0LCBkZWxldGU6IGRlbGV0ZV8gfTtcbiAgfVxuICBzZWxlY3QoZmllbGRzKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHsgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLCBzZXNzaW9uOiB0aGlzLnNlc3Npb24sIGRpYWxlY3Q6IHRoaXMuZGlhbGVjdCB9KTtcbiAgfVxuICBzZWxlY3REaXN0aW5jdChmaWVsZHMpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoe1xuICAgICAgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLFxuICAgICAgc2Vzc2lvbjogdGhpcy5zZXNzaW9uLFxuICAgICAgZGlhbGVjdDogdGhpcy5kaWFsZWN0LFxuICAgICAgZGlzdGluY3Q6IHRydWVcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhbiB1cGRhdGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aG91dCBgLndoZXJlKClgIGNsYXVzZSB3aWxsIHVwZGF0ZSBhbGwgcm93cyBpbiBhIHRhYmxlLiBUaGUgYC53aGVyZSgpYCBjbGF1c2Ugc3BlY2lmaWVzIHdoaWNoIHJvd3Mgc2hvdWxkIGJlIHVwZGF0ZWQuXG4gICAqXG4gICAqIFVzZSBgLnNldCgpYCBtZXRob2QgdG8gc3BlY2lmeSB3aGljaCB2YWx1ZXMgdG8gdXBkYXRlLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3VwZGF0ZX1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB0byB1cGRhdGUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFVwZGF0ZSBhbGwgcm93cyBpbiB0aGUgJ2NhcnMnIHRhYmxlXG4gICAqIGF3YWl0IGRiLnVwZGF0ZShjYXJzKS5zZXQoeyBjb2xvcjogJ3JlZCcgfSk7XG4gICAqXG4gICAqIC8vIFVwZGF0ZSByb3dzIHdpdGggZmlsdGVycyBhbmQgY29uZGl0aW9uc1xuICAgKiBhd2FpdCBkYi51cGRhdGUoY2Fycykuc2V0KHsgY29sb3I6ICdyZWQnIH0pLndoZXJlKGVxKGNhcnMuYnJhbmQsICdCTVcnKSk7XG4gICAqXG4gICAqIC8vIFVwZGF0ZSB3aXRoIHJldHVybmluZyBjbGF1c2VcbiAgICogY29uc3QgdXBkYXRlZENhcjogQ2FyW10gPSBhd2FpdCBkYi51cGRhdGUoY2FycylcbiAgICogICAuc2V0KHsgY29sb3I6ICdyZWQnIH0pXG4gICAqICAgLndoZXJlKGVxKGNhcnMuaWQsIDEpKVxuICAgKiAgIC5yZXR1cm5pbmcoKTtcbiAgICogYGBgXG4gICAqL1xuICB1cGRhdGUodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVVwZGF0ZUJ1aWxkZXIodGFibGUsIHRoaXMuc2Vzc2lvbiwgdGhpcy5kaWFsZWN0KTtcbiAgfVxuICAkY2FjaGU7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc2VydCBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSBuZXcgcm93cyBpbiBhIHRhYmxlLiBVc2UgYC52YWx1ZXMoKWAgbWV0aG9kIHRvIHNwZWNpZnkgd2hpY2ggdmFsdWVzIHRvIGluc2VydC5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9pbnNlcnR9XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgdG8gaW5zZXJ0IGludG8uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIEluc2VydCBvbmUgcm93XG4gICAqIGF3YWl0IGRiLmluc2VydChjYXJzKS52YWx1ZXMoeyBicmFuZDogJ0JNVycgfSk7XG4gICAqXG4gICAqIC8vIEluc2VydCBtdWx0aXBsZSByb3dzXG4gICAqIGF3YWl0IGRiLmluc2VydChjYXJzKS52YWx1ZXMoW3sgYnJhbmQ6ICdCTVcnIH0sIHsgYnJhbmQ6ICdQb3JzY2hlJyB9XSk7XG4gICAqXG4gICAqIC8vIEluc2VydCB3aXRoIHJldHVybmluZyBjbGF1c2VcbiAgICogY29uc3QgaW5zZXJ0ZWRDYXI6IENhcltdID0gYXdhaXQgZGIuaW5zZXJ0KGNhcnMpXG4gICAqICAgLnZhbHVlcyh7IGJyYW5kOiAnQk1XJyB9KVxuICAgKiAgIC5yZXR1cm5pbmcoKTtcbiAgICogYGBgXG4gICAqL1xuICBpbnNlcnQoaW50bykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlSW5zZXJ0QnVpbGRlcihpbnRvLCB0aGlzLnNlc3Npb24sIHRoaXMuZGlhbGVjdCk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBkZWxldGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aG91dCBgLndoZXJlKClgIGNsYXVzZSB3aWxsIGRlbGV0ZSBhbGwgcm93cyBpbiBhIHRhYmxlLiBUaGUgYC53aGVyZSgpYCBjbGF1c2Ugc3BlY2lmaWVzIHdoaWNoIHJvd3Mgc2hvdWxkIGJlIGRlbGV0ZWQuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvZGVsZXRlfVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHRvIGRlbGV0ZSBmcm9tLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBEZWxldGUgYWxsIHJvd3MgaW4gdGhlICdjYXJzJyB0YWJsZVxuICAgKiBhd2FpdCBkYi5kZWxldGUoY2Fycyk7XG4gICAqXG4gICAqIC8vIERlbGV0ZSByb3dzIHdpdGggZmlsdGVycyBhbmQgY29uZGl0aW9uc1xuICAgKiBhd2FpdCBkYi5kZWxldGUoY2Fycykud2hlcmUoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJykpO1xuICAgKlxuICAgKiAvLyBEZWxldGUgd2l0aCByZXR1cm5pbmcgY2xhdXNlXG4gICAqIGNvbnN0IGRlbGV0ZWRDYXI6IENhcltdID0gYXdhaXQgZGIuZGVsZXRlKGNhcnMpXG4gICAqICAgLndoZXJlKGVxKGNhcnMuaWQsIDEpKVxuICAgKiAgIC5yZXR1cm5pbmcoKTtcbiAgICogYGBgXG4gICAqL1xuICBkZWxldGUoZnJvbSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlRGVsZXRlQmFzZShmcm9tLCB0aGlzLnNlc3Npb24sIHRoaXMuZGlhbGVjdCk7XG4gIH1cbiAgcnVuKHF1ZXJ5KSB7XG4gICAgY29uc3Qgc2VxdWVsID0gdHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiID8gc3FsLnJhdyhxdWVyeSkgOiBxdWVyeS5nZXRTUUwoKTtcbiAgICBpZiAodGhpcy5yZXN1bHRLaW5kID09PSBcImFzeW5jXCIpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlUmF3KFxuICAgICAgICBhc3luYyAoKSA9PiB0aGlzLnNlc3Npb24ucnVuKHNlcXVlbCksXG4gICAgICAgICgpID0+IHNlcXVlbCxcbiAgICAgICAgXCJydW5cIixcbiAgICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgICB0aGlzLnNlc3Npb24uZXh0cmFjdFJhd1J1blZhbHVlRnJvbUJhdGNoUmVzdWx0LmJpbmQodGhpcy5zZXNzaW9uKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5ydW4oc2VxdWVsKTtcbiAgfVxuICBhbGwocXVlcnkpIHtcbiAgICBjb25zdCBzZXF1ZWwgPSB0eXBlb2YgcXVlcnkgPT09IFwic3RyaW5nXCIgPyBzcWwucmF3KHF1ZXJ5KSA6IHF1ZXJ5LmdldFNRTCgpO1xuICAgIGlmICh0aGlzLnJlc3VsdEtpbmQgPT09IFwiYXN5bmNcIikge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVSYXcoXG4gICAgICAgIGFzeW5jICgpID0+IHRoaXMuc2Vzc2lvbi5hbGwoc2VxdWVsKSxcbiAgICAgICAgKCkgPT4gc2VxdWVsLFxuICAgICAgICBcImFsbFwiLFxuICAgICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICAgIHRoaXMuc2Vzc2lvbi5leHRyYWN0UmF3QWxsVmFsdWVGcm9tQmF0Y2hSZXN1bHQuYmluZCh0aGlzLnNlc3Npb24pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmFsbChzZXF1ZWwpO1xuICB9XG4gIGdldChxdWVyeSkge1xuICAgIGNvbnN0IHNlcXVlbCA9IHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiA/IHNxbC5yYXcocXVlcnkpIDogcXVlcnkuZ2V0U1FMKCk7XG4gICAgaWYgKHRoaXMucmVzdWx0S2luZCA9PT0gXCJhc3luY1wiKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVJhdyhcbiAgICAgICAgYXN5bmMgKCkgPT4gdGhpcy5zZXNzaW9uLmdldChzZXF1ZWwpLFxuICAgICAgICAoKSA9PiBzZXF1ZWwsXG4gICAgICAgIFwiZ2V0XCIsXG4gICAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgICAgdGhpcy5zZXNzaW9uLmV4dHJhY3RSYXdHZXRWYWx1ZUZyb21CYXRjaFJlc3VsdC5iaW5kKHRoaXMuc2Vzc2lvbilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlc3Npb24uZ2V0KHNlcXVlbCk7XG4gIH1cbiAgdmFsdWVzKHF1ZXJ5KSB7XG4gICAgY29uc3Qgc2VxdWVsID0gdHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiID8gc3FsLnJhdyhxdWVyeSkgOiBxdWVyeS5nZXRTUUwoKTtcbiAgICBpZiAodGhpcy5yZXN1bHRLaW5kID09PSBcImFzeW5jXCIpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlUmF3KFxuICAgICAgICBhc3luYyAoKSA9PiB0aGlzLnNlc3Npb24udmFsdWVzKHNlcXVlbCksXG4gICAgICAgICgpID0+IHNlcXVlbCxcbiAgICAgICAgXCJ2YWx1ZXNcIixcbiAgICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgICB0aGlzLnNlc3Npb24uZXh0cmFjdFJhd1ZhbHVlc1ZhbHVlRnJvbUJhdGNoUmVzdWx0LmJpbmQodGhpcy5zZXNzaW9uKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi52YWx1ZXMoc2VxdWVsKTtcbiAgfVxuICB0cmFuc2FjdGlvbih0cmFuc2FjdGlvbiwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi50cmFuc2FjdGlvbih0cmFuc2FjdGlvbiwgY29uZmlnKTtcbiAgfVxufVxuY29uc3Qgd2l0aFJlcGxpY2FzID0gKHByaW1hcnksIHJlcGxpY2FzLCBnZXRSZXBsaWNhID0gKCkgPT4gcmVwbGljYXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcmVwbGljYXMubGVuZ3RoKV0pID0+IHtcbiAgY29uc3Qgc2VsZWN0ID0gKC4uLmFyZ3MpID0+IGdldFJlcGxpY2EocmVwbGljYXMpLnNlbGVjdCguLi5hcmdzKTtcbiAgY29uc3Qgc2VsZWN0RGlzdGluY3QgPSAoLi4uYXJncykgPT4gZ2V0UmVwbGljYShyZXBsaWNhcykuc2VsZWN0RGlzdGluY3QoLi4uYXJncyk7XG4gIGNvbnN0ICRjb3VudCA9ICguLi5hcmdzKSA9PiBnZXRSZXBsaWNhKHJlcGxpY2FzKS4kY291bnQoLi4uYXJncyk7XG4gIGNvbnN0ICR3aXRoID0gKC4uLmFyZ3MpID0+IGdldFJlcGxpY2EocmVwbGljYXMpLndpdGgoLi4uYXJncyk7XG4gIGNvbnN0IHVwZGF0ZSA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LnVwZGF0ZSguLi5hcmdzKTtcbiAgY29uc3QgaW5zZXJ0ID0gKC4uLmFyZ3MpID0+IHByaW1hcnkuaW5zZXJ0KC4uLmFyZ3MpO1xuICBjb25zdCAkZGVsZXRlID0gKC4uLmFyZ3MpID0+IHByaW1hcnkuZGVsZXRlKC4uLmFyZ3MpO1xuICBjb25zdCBydW4gPSAoLi4uYXJncykgPT4gcHJpbWFyeS5ydW4oLi4uYXJncyk7XG4gIGNvbnN0IGFsbCA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LmFsbCguLi5hcmdzKTtcbiAgY29uc3QgZ2V0ID0gKC4uLmFyZ3MpID0+IHByaW1hcnkuZ2V0KC4uLmFyZ3MpO1xuICBjb25zdCB2YWx1ZXMgPSAoLi4uYXJncykgPT4gcHJpbWFyeS52YWx1ZXMoLi4uYXJncyk7XG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gKC4uLmFyZ3MpID0+IHByaW1hcnkudHJhbnNhY3Rpb24oLi4uYXJncyk7XG4gIHJldHVybiB7XG4gICAgLi4ucHJpbWFyeSxcbiAgICB1cGRhdGUsXG4gICAgaW5zZXJ0LFxuICAgIGRlbGV0ZTogJGRlbGV0ZSxcbiAgICBydW4sXG4gICAgYWxsLFxuICAgIGdldCxcbiAgICB2YWx1ZXMsXG4gICAgdHJhbnNhY3Rpb24sXG4gICAgJHByaW1hcnk6IHByaW1hcnksXG4gICAgc2VsZWN0LFxuICAgIHNlbGVjdERpc3RpbmN0LFxuICAgICRjb3VudCxcbiAgICB3aXRoOiAkd2l0aCxcbiAgICBnZXQgcXVlcnkoKSB7XG4gICAgICByZXR1cm4gZ2V0UmVwbGljYShyZXBsaWNhcykucXVlcnk7XG4gICAgfVxuICB9O1xufTtcbmV4cG9ydCB7XG4gIEJhc2VTUUxpdGVEYXRhYmFzZSxcbiAgd2l0aFJlcGxpY2FzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGIuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuY2xhc3MgQ2FjaGUge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJDYWNoZVwiO1xufVxuY2xhc3MgTm9vcENhY2hlIGV4dGVuZHMgQ2FjaGUge1xuICBzdHJhdGVneSgpIHtcbiAgICByZXR1cm4gXCJhbGxcIjtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJOb29wQ2FjaGVcIjtcbiAgYXN5bmMgZ2V0KF9rZXkpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGFzeW5jIHB1dChfaGFzaGVkUXVlcnksIF9yZXNwb25zZSwgX3RhYmxlcywgX2NvbmZpZykge1xuICB9XG4gIGFzeW5jIG9uTXV0YXRlKF9wYXJhbXMpIHtcbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gaGFzaFF1ZXJ5KHNxbCwgcGFyYW1zKSB7XG4gIGNvbnN0IGRhdGFUb0hhc2ggPSBgJHtzcWx9LSR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX1gO1xuICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gIGNvbnN0IGRhdGEgPSBlbmNvZGVyLmVuY29kZShkYXRhVG9IYXNoKTtcbiAgY29uc3QgaGFzaEJ1ZmZlciA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KFwiU0hBLTI1NlwiLCBkYXRhKTtcbiAgY29uc3QgaGFzaEFycmF5ID0gWy4uLm5ldyBVaW50OEFycmF5KGhhc2hCdWZmZXIpXTtcbiAgY29uc3QgaGFzaEhleCA9IGhhc2hBcnJheS5tYXAoKGIpID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSkuam9pbihcIlwiKTtcbiAgcmV0dXJuIGhhc2hIZXg7XG59XG5leHBvcnQge1xuICBDYWNoZSxcbiAgTm9vcENhY2hlLFxuICBoYXNoUXVlcnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYWNoZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGhhc2hRdWVyeSwgTm9vcENhY2hlIH0gZnJvbSBcIi4uL2NhY2hlL2NvcmUvY2FjaGUuanNcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgRHJpenpsZUVycm9yLCBEcml6emxlUXVlcnlFcnJvciwgVHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmltcG9ydCB7IEJhc2VTUUxpdGVEYXRhYmFzZSB9IGZyb20gXCIuL2RiLmpzXCI7XG5jbGFzcyBFeGVjdXRlUmVzdWx0U3luYyBleHRlbmRzIFF1ZXJ5UHJvbWlzZSB7XG4gIGNvbnN0cnVjdG9yKHJlc3VsdENiKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlc3VsdENiID0gcmVzdWx0Q2I7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiRXhlY3V0ZVJlc3VsdFN5bmNcIjtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHRDYigpO1xuICB9XG4gIHN5bmMoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0Q2IoKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlUHJlcGFyZWRRdWVyeSB7XG4gIGNvbnN0cnVjdG9yKG1vZGUsIGV4ZWN1dGVNZXRob2QsIHF1ZXJ5LCBjYWNoZSwgcXVlcnlNZXRhZGF0YSwgY2FjaGVDb25maWcpIHtcbiAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgIHRoaXMuZXhlY3V0ZU1ldGhvZCA9IGV4ZWN1dGVNZXRob2Q7XG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5O1xuICAgIHRoaXMuY2FjaGUgPSBjYWNoZTtcbiAgICB0aGlzLnF1ZXJ5TWV0YWRhdGEgPSBxdWVyeU1ldGFkYXRhO1xuICAgIHRoaXMuY2FjaGVDb25maWcgPSBjYWNoZUNvbmZpZztcbiAgICBpZiAoY2FjaGUgJiYgY2FjaGUuc3RyYXRlZ3koKSA9PT0gXCJhbGxcIiAmJiBjYWNoZUNvbmZpZyA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLmNhY2hlQ29uZmlnID0geyBlbmFibGU6IHRydWUsIGF1dG9JbnZhbGlkYXRlOiB0cnVlIH07XG4gICAgfVxuICAgIGlmICghdGhpcy5jYWNoZUNvbmZpZz8uZW5hYmxlKSB7XG4gICAgICB0aGlzLmNhY2hlQ29uZmlnID0gdm9pZCAwO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQcmVwYXJlZFF1ZXJ5XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgam9pbnNOb3ROdWxsYWJsZU1hcDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBhc3luYyBxdWVyeVdpdGhDYWNoZShxdWVyeVN0cmluZywgcGFyYW1zLCBxdWVyeSkge1xuICAgIGlmICh0aGlzLmNhY2hlID09PSB2b2lkIDAgfHwgaXModGhpcy5jYWNoZSwgTm9vcENhY2hlKSB8fCB0aGlzLnF1ZXJ5TWV0YWRhdGEgPT09IHZvaWQgMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBEcml6emxlUXVlcnlFcnJvcihxdWVyeVN0cmluZywgcGFyYW1zLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuY2FjaGVDb25maWcgJiYgIXRoaXMuY2FjaGVDb25maWcuZW5hYmxlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcXVlcnkoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IERyaXp6bGVRdWVyeUVycm9yKHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKHRoaXMucXVlcnlNZXRhZGF0YS50eXBlID09PSBcImluc2VydFwiIHx8IHRoaXMucXVlcnlNZXRhZGF0YS50eXBlID09PSBcInVwZGF0ZVwiIHx8IHRoaXMucXVlcnlNZXRhZGF0YS50eXBlID09PSBcImRlbGV0ZVwiKSAmJiB0aGlzLnF1ZXJ5TWV0YWRhdGEudGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IFtyZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIHF1ZXJ5KCksXG4gICAgICAgICAgdGhpcy5jYWNoZS5vbk11dGF0ZSh7IHRhYmxlczogdGhpcy5xdWVyeU1ldGFkYXRhLnRhYmxlcyB9KVxuICAgICAgICBdKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IERyaXp6bGVRdWVyeUVycm9yKHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuY2FjaGVDb25maWcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBxdWVyeSgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRHJpenpsZVF1ZXJ5RXJyb3IocXVlcnlTdHJpbmcsIHBhcmFtcywgZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnF1ZXJ5TWV0YWRhdGEudHlwZSA9PT0gXCJzZWxlY3RcIikge1xuICAgICAgY29uc3QgZnJvbUNhY2hlID0gYXdhaXQgdGhpcy5jYWNoZS5nZXQoXG4gICAgICAgIHRoaXMuY2FjaGVDb25maWcudGFnID8/IChhd2FpdCBoYXNoUXVlcnkocXVlcnlTdHJpbmcsIHBhcmFtcykpLFxuICAgICAgICB0aGlzLnF1ZXJ5TWV0YWRhdGEudGFibGVzLFxuICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLnRhZyAhPT0gdm9pZCAwLFxuICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLmF1dG9JbnZhbGlkYXRlXG4gICAgICApO1xuICAgICAgaWYgKGZyb21DYWNoZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcXVlcnkoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRocm93IG5ldyBEcml6emxlUXVlcnlFcnJvcihxdWVyeVN0cmluZywgcGFyYW1zLCBlKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmNhY2hlLnB1dChcbiAgICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLnRhZyA/PyAoYXdhaXQgaGFzaFF1ZXJ5KHF1ZXJ5U3RyaW5nLCBwYXJhbXMpKSxcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIHNlbmQgdGFibGVzIHRoYXQgd2VyZSB1c2VkIGluIGEgcXVlcnkgb25seSBpZiB1c2VyIHdhbnRzIHRvIGludmFsaWRhdGUgaXQgb24gZWFjaCB3cml0ZVxuICAgICAgICAgIHRoaXMuY2FjaGVDb25maWcuYXV0b0ludmFsaWRhdGUgPyB0aGlzLnF1ZXJ5TWV0YWRhdGEudGFibGVzIDogW10sXG4gICAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy50YWcgIT09IHZvaWQgMCxcbiAgICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLmNvbmZpZ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21DYWNoZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBxdWVyeSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBEcml6emxlUXVlcnlFcnJvcihxdWVyeVN0cmluZywgcGFyYW1zLCBlKTtcbiAgICB9XG4gIH1cbiAgZ2V0UXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnk7XG4gIH1cbiAgbWFwUnVuUmVzdWx0KHJlc3VsdCwgX2lzRnJvbUJhdGNoKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBtYXBBbGxSZXN1bHQoX3Jlc3VsdCwgX2lzRnJvbUJhdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIG1hcEdldFJlc3VsdChfcmVzdWx0LCBfaXNGcm9tQmF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgZXhlY3V0ZShwbGFjZWhvbGRlclZhbHVlcykge1xuICAgIGlmICh0aGlzLm1vZGUgPT09IFwiYXN5bmNcIikge1xuICAgICAgcmV0dXJuIHRoaXNbdGhpcy5leGVjdXRlTWV0aG9kXShwbGFjZWhvbGRlclZhbHVlcyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXhlY3V0ZVJlc3VsdFN5bmMoKCkgPT4gdGhpc1t0aGlzLmV4ZWN1dGVNZXRob2RdKHBsYWNlaG9sZGVyVmFsdWVzKSk7XG4gIH1cbiAgbWFwUmVzdWx0KHJlc3BvbnNlLCBpc0Zyb21CYXRjaCkge1xuICAgIHN3aXRjaCAodGhpcy5leGVjdXRlTWV0aG9kKSB7XG4gICAgICBjYXNlIFwicnVuXCI6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwUnVuUmVzdWx0KHJlc3BvbnNlLCBpc0Zyb21CYXRjaCk7XG4gICAgICB9XG4gICAgICBjYXNlIFwiYWxsXCI6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwQWxsUmVzdWx0KHJlc3BvbnNlLCBpc0Zyb21CYXRjaCk7XG4gICAgICB9XG4gICAgICBjYXNlIFwiZ2V0XCI6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwR2V0UmVzdWx0KHJlc3BvbnNlLCBpc0Zyb21CYXRjaCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5jbGFzcyBTUUxpdGVTZXNzaW9uIHtcbiAgY29uc3RydWN0b3IoZGlhbGVjdCkge1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlU2Vzc2lvblwiO1xuICBwcmVwYXJlT25lVGltZVF1ZXJ5KHF1ZXJ5LCBmaWVsZHMsIGV4ZWN1dGVNZXRob2QsIGlzUmVzcG9uc2VJbkFycmF5TW9kZSwgY3VzdG9tUmVzdWx0TWFwcGVyLCBxdWVyeU1ldGFkYXRhLCBjYWNoZUNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnByZXBhcmVRdWVyeShcbiAgICAgIHF1ZXJ5LFxuICAgICAgZmllbGRzLFxuICAgICAgZXhlY3V0ZU1ldGhvZCxcbiAgICAgIGlzUmVzcG9uc2VJbkFycmF5TW9kZSxcbiAgICAgIGN1c3RvbVJlc3VsdE1hcHBlcixcbiAgICAgIHF1ZXJ5TWV0YWRhdGEsXG4gICAgICBjYWNoZUNvbmZpZ1xuICAgICk7XG4gIH1cbiAgcnVuKHF1ZXJ5KSB7XG4gICAgY29uc3Qgc3RhdGljUXVlcnkgPSB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeShxdWVyeSk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnByZXBhcmVPbmVUaW1lUXVlcnkoc3RhdGljUXVlcnksIHZvaWQgMCwgXCJydW5cIiwgZmFsc2UpLnJ1bigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IERyaXp6bGVFcnJvcih7IGNhdXNlOiBlcnIsIG1lc3NhZ2U6IGBGYWlsZWQgdG8gcnVuIHRoZSBxdWVyeSAnJHtzdGF0aWNRdWVyeS5zcWx9J2AgfSk7XG4gICAgfVxuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZXh0cmFjdFJhd1J1blZhbHVlRnJvbUJhdGNoUmVzdWx0KHJlc3VsdCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgYWxsKHF1ZXJ5KSB7XG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU9uZVRpbWVRdWVyeSh0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeShxdWVyeSksIHZvaWQgMCwgXCJydW5cIiwgZmFsc2UpLmFsbCgpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZXh0cmFjdFJhd0FsbFZhbHVlRnJvbUJhdGNoUmVzdWx0KF9yZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgZ2V0KHF1ZXJ5KSB7XG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU9uZVRpbWVRdWVyeSh0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeShxdWVyeSksIHZvaWQgMCwgXCJydW5cIiwgZmFsc2UpLmdldCgpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZXh0cmFjdFJhd0dldFZhbHVlRnJvbUJhdGNoUmVzdWx0KF9yZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgdmFsdWVzKHF1ZXJ5KSB7XG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU9uZVRpbWVRdWVyeSh0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeShxdWVyeSksIHZvaWQgMCwgXCJydW5cIiwgZmFsc2UpLnZhbHVlcygpO1xuICB9XG4gIGFzeW5jIGNvdW50KHNxbCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudmFsdWVzKHNxbCk7XG4gICAgcmV0dXJuIHJlc3VsdFswXVswXTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGV4dHJhY3RSYXdWYWx1ZXNWYWx1ZUZyb21CYXRjaFJlc3VsdChfcmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VTUUxpdGVEYXRhYmFzZSB7XG4gIGNvbnN0cnVjdG9yKHJlc3VsdFR5cGUsIGRpYWxlY3QsIHNlc3Npb24sIHNjaGVtYSwgbmVzdGVkSW5kZXggPSAwKSB7XG4gICAgc3VwZXIocmVzdWx0VHlwZSwgZGlhbGVjdCwgc2Vzc2lvbiwgc2NoZW1hKTtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLm5lc3RlZEluZGV4ID0gbmVzdGVkSW5kZXg7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVHJhbnNhY3Rpb25cIjtcbiAgcm9sbGJhY2soKSB7XG4gICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvcigpO1xuICB9XG59XG5leHBvcnQge1xuICBFeGVjdXRlUmVzdWx0U3luYyxcbiAgU1FMaXRlUHJlcGFyZWRRdWVyeSxcbiAgU1FMaXRlU2Vzc2lvbixcbiAgU1FMaXRlVHJhbnNhY3Rpb25cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXNzaW9uLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuY2xhc3MgQ29uc29sZUxvZ1dyaXRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkNvbnNvbGVMb2dXcml0ZXJcIjtcbiAgd3JpdGUobWVzc2FnZSkge1xuICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICB9XG59XG5jbGFzcyBEZWZhdWx0TG9nZ2VyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiRGVmYXVsdExvZ2dlclwiO1xuICB3cml0ZXI7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHRoaXMud3JpdGVyID0gY29uZmlnPy53cml0ZXIgPz8gbmV3IENvbnNvbGVMb2dXcml0ZXIoKTtcbiAgfVxuICBsb2dRdWVyeShxdWVyeSwgcGFyYW1zKSB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWRQYXJhbXMgPSBwYXJhbXMubWFwKChwKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBwYXJhbXNTdHIgPSBzdHJpbmdpZmllZFBhcmFtcy5sZW5ndGggPyBgIC0tIHBhcmFtczogWyR7c3RyaW5naWZpZWRQYXJhbXMuam9pbihcIiwgXCIpfV1gIDogXCJcIjtcbiAgICB0aGlzLndyaXRlci53cml0ZShgUXVlcnk6ICR7cXVlcnl9JHtwYXJhbXNTdHJ9YCk7XG4gIH1cbn1cbmNsYXNzIE5vb3BMb2dnZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJOb29wTG9nZ2VyXCI7XG4gIGxvZ1F1ZXJ5KCkge1xuICB9XG59XG5leHBvcnQge1xuICBDb25zb2xlTG9nV3JpdGVyLFxuICBEZWZhdWx0TG9nZ2VyLFxuICBOb29wTG9nZ2VyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nZ2VyLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgaW5kZXgsIGludGVnZXIsIHJlYWwsIHNxbGl0ZVRhYmxlLCB0ZXh0IH0gZnJvbSBcImRyaXp6bGUtb3JtL3NxbGl0ZS1jb3JlXCI7XG5pbXBvcnQgeyByZWxhdGlvbnMgfSBmcm9tIFwiZHJpenpsZS1vcm1cIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9zY2hlbWEudHNcbnZhciBzY2hlbWFfZXhwb3J0cyA9IHt9O1xuX19leHBvcnQoc2NoZW1hX2V4cG9ydHMsIHtcblx0Y2hhcmFjdGVyczogKCkgPT4gY2hhcmFjdGVycyxcblx0Y2hhcmFjdGVyc1JlbGF0aW9uczogKCkgPT4gY2hhcmFjdGVyc1JlbGF0aW9ucyxcblx0bWluaW5nRmxlZXRQYXJ0aWNpcGFudHM6ICgpID0+IG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzLFxuXHRtaW5pbmdGbGVldFBhcnRpY2lwYW50c1JlbGF0aW9uczogKCkgPT4gbWluaW5nRmxlZXRQYXJ0aWNpcGFudHNSZWxhdGlvbnMsXG5cdG1pbmluZ0ZsZWV0czogKCkgPT4gbWluaW5nRmxlZXRzLFxuXHRtaW5pbmdGbGVldHNSZWxhdGlvbnM6ICgpID0+IG1pbmluZ0ZsZWV0c1JlbGF0aW9ucyxcblx0cmVzdW1lQ29tbWFuZHM6ICgpID0+IHJlc3VtZUNvbW1hbmRzLFxuXHRzaGFyZWQ6ICgpID0+IHNoYXJlZCxcblx0dXNlcnM6ICgpID0+IHVzZXJzLFxuXHR1c2Vyc1JlbGF0aW9uczogKCkgPT4gdXNlcnNSZWxhdGlvbnNcbn0pO1xuY29uc3Qgc2hhcmVkID0ge1xuXHRjcmVhdGVkQXQ6IGludGVnZXIoXCJjcmVhdGVkX2F0XCIpLm5vdE51bGwoKSxcblx0dXBkYXRlZEF0OiBpbnRlZ2VyKFwidXBkYXRlZF9hdFwiKVxufTtcbmNvbnN0IHVzZXJzID0gc3FsaXRlVGFibGUoXCJ1c2Vyc1wiLCB7XG5cdGlkOiBpbnRlZ2VyKCkucHJpbWFyeUtleSgpLnVuaXF1ZSgpLm5vdE51bGwoKSxcblx0ZGlzY29yZElEOiB0ZXh0KFwiZGlzY29yZF9pZFwiKS51bmlxdWUoKS5ub3ROdWxsKCksXG5cdG1haW5DaGFyYWN0ZXI6IGludGVnZXIoXCJtYWluX2NoYXJhY3RlclwiKSxcblx0Li4uc2hhcmVkXG59LCAodGFibGUpID0+IFtpbmRleChcImlkeF9kaXNjb3JkX2lkXCIpLm9uKHRhYmxlLmRpc2NvcmRJRCksIGluZGV4KFwiaWR4X21haW5fY2hhcmFjdGVyXCIpLm9uKHRhYmxlLm1haW5DaGFyYWN0ZXIpXSk7XG5jb25zdCB1c2Vyc1JlbGF0aW9ucyA9IHJlbGF0aW9ucyh1c2VycywgKHsgb25lLCBtYW55IH0pID0+ICh7XG5cdGNoYXJhY3RlcnM6IG1hbnkoY2hhcmFjdGVycyksXG5cdG1haW46IG9uZShjaGFyYWN0ZXJzLCB7XG5cdFx0ZmllbGRzOiBbdXNlcnMubWFpbkNoYXJhY3Rlcl0sXG5cdFx0cmVmZXJlbmNlczogW2NoYXJhY3RlcnMuaWRdXG5cdH0pXG59KSk7XG5jb25zdCBjaGFyYWN0ZXJzID0gc3FsaXRlVGFibGUoXCJjaGFyYWN0ZXJzXCIsIHtcblx0aWQ6IGludGVnZXIoXCJpZFwiKS5wcmltYXJ5S2V5KHsgYXV0b0luY3JlbWVudDogdHJ1ZSB9KSxcblx0ZXZlSUQ6IGludGVnZXIoXCJldmVfaWRcIikubm90TnVsbCgpLFxuXHR1c2VySUQ6IGludGVnZXIoXCJ1c2VyX2lkXCIpLm5vdE51bGwoKSxcblx0bmFtZTogdGV4dCgpLm5vdE51bGwoKSxcblx0YWNjZXNzVG9rZW46IHRleHQoXCJhY2Nlc3NfdG9rZW5cIikubm90TnVsbCgpLFxuXHRleHBpcmVzQXQ6IGludGVnZXIoXCJleHBpcmVzX2F0XCIpLm5vdE51bGwoKSxcblx0cmVmcmVzaFRva2VuOiB0ZXh0KFwicmVmcmVzaF90b2tlblwiKS5ub3ROdWxsKCksXG5cdC4uLnNoYXJlZFxufSwgKHRhYmxlKSA9PiBbaW5kZXgoXCJpZHhfdXNlcl9pZFwiKS5vbih0YWJsZS51c2VySUQpLCBpbmRleChcImlkeF9ldmVfaWRcIikub24odGFibGUuZXZlSUQpXSk7XG5jb25zdCBjaGFyYWN0ZXJzUmVsYXRpb25zID0gcmVsYXRpb25zKGNoYXJhY3RlcnMsICh7IG9uZSB9KSA9PiAoeyB1c2VyOiBvbmUodXNlcnMsIHtcblx0ZmllbGRzOiBbY2hhcmFjdGVycy51c2VySURdLFxuXHRyZWZlcmVuY2VzOiBbdXNlcnMuaWRdXG59KSB9KSk7XG5jb25zdCByZXN1bWVDb21tYW5kcyA9IHNxbGl0ZVRhYmxlKFwicmVzdW1lY29tbWFuZHNcIiwge1xuXHRpZDogdGV4dCgpLnByaW1hcnlLZXkoKSxcblx0Y29tbWFuZDogdGV4dCgpLm5vdE51bGwoKSxcblx0cGFyYW1zOiB0ZXh0KCkubm90TnVsbCgpLFxuXHRjb250ZXh0OiB0ZXh0KCkubm90TnVsbCgpLFxuXHQuLi5zaGFyZWRcbn0pO1xuY29uc3QgbWluaW5nRmxlZXRzID0gc3FsaXRlVGFibGUoXCJtaW5pbmdfZmxlZXRzXCIsIHtcblx0aWQ6IGludGVnZXIoXCJpZFwiKS5wcmltYXJ5S2V5KHsgYXV0b0luY3JlbWVudDogdHJ1ZSB9KSxcblx0bmFtZTogdGV4dChcIm5hbWVcIikubm90TnVsbCgpLFxuXHRkZXNjcmlwdGlvbjogdGV4dChcImRlc2NyaXB0aW9uXCIpLFxuXHRjcmVhdG9yRGlzY29yZElkOiB0ZXh0KFwiY3JlYXRvcl9kaXNjb3JkX2lkXCIpLm5vdE51bGwoKSxcblx0c3RhcnRUaW1lOiBpbnRlZ2VyKFwic3RhcnRfdGltZVwiKS5ub3ROdWxsKCksXG5cdGVuZFRpbWU6IGludGVnZXIoXCJlbmRfdGltZVwiKSxcblx0c3RhdHVzOiB0ZXh0KFwic3RhdHVzXCIsIHsgZW51bTogW1xuXHRcdFwiY29uZmlndXJpbmdcIixcblx0XHRcImFjdGl2ZVwiLFxuXHRcdFwiZW5kZWRcIixcblx0XHRcImdlbmVyYXRpbmdfcmVwb3J0XCIsXG5cdFx0XCJjb21wbGV0ZWRcIixcblx0XHRcImZhaWxlZFwiXG5cdF0gfSkubm90TnVsbCgpLmRlZmF1bHQoXCJjb25maWd1cmluZ1wiKSxcblx0dGF4UmF0ZTogcmVhbChcInRheF9yYXRlXCIpLm5vdE51bGwoKS5kZWZhdWx0KDApLFxuXHRwdWJsaWNNZXNzYWdlSWQ6IHRleHQoXCJwdWJsaWNfbWVzc2FnZV9pZFwiKS51bmlxdWUoKSxcblx0cHVibGljQ2hhbm5lbElkOiB0ZXh0KFwicHVibGljX2NoYW5uZWxfaWRcIiksXG5cdHJlcG9ydERhdGE6IHRleHQoXCJyZXBvcnRfZGF0YVwiKSxcblx0Y3JlYXRvckVwaGVtZXJhbE1lc3NhZ2VJZDogdGV4dChcImNyZWF0b3JfZXBoZW1lcmFsX21lc3NhZ2VfaWRcIiksXG5cdC4uLnNoYXJlZFxufSwgKHRhYmxlKSA9PiBbXG5cdGluZGV4KFwiaWR4X2ZsZWV0X2NyZWF0b3JfZGlzY29yZF9pZFwiKS5vbih0YWJsZS5jcmVhdG9yRGlzY29yZElkKSxcblx0aW5kZXgoXCJpZHhfZmxlZXRfc3RhdHVzXCIpLm9uKHRhYmxlLnN0YXR1cyksXG5cdGluZGV4KFwiaWR4X2ZsZWV0X3B1YmxpY19tZXNzYWdlX2lkXCIpLm9uKHRhYmxlLnB1YmxpY01lc3NhZ2VJZClcbl0pO1xuY29uc3QgbWluaW5nRmxlZXRQYXJ0aWNpcGFudHMgPSBzcWxpdGVUYWJsZShcIm1pbmluZ19mbGVldF9wYXJ0aWNpcGFudHNcIiwge1xuXHRpZDogaW50ZWdlcihcImlkXCIpLnByaW1hcnlLZXkoeyBhdXRvSW5jcmVtZW50OiB0cnVlIH0pLFxuXHRmbGVldElkOiBpbnRlZ2VyKFwiZmxlZXRfaWRcIikubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gbWluaW5nRmxlZXRzLmlkLCB7IG9uRGVsZXRlOiBcImNhc2NhZGVcIiB9KSxcblx0Y2hhcmFjdGVySWQ6IGludGVnZXIoXCJjaGFyYWN0ZXJfaWRcIikubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gY2hhcmFjdGVycy5pZCwgeyBvbkRlbGV0ZTogXCJjYXNjYWRlXCIgfSksXG5cdGRpc2NvcmRJZDogdGV4dChcImRpc2NvcmRfaWRcIikubm90TnVsbCgpLFxuXHRyb2xlOiB0ZXh0KFwicm9sZVwiLCB7IGVudW06IFtcblx0XHRcIm1pbmVyXCIsXG5cdFx0XCJzZWN1cml0eVwiLFxuXHRcdFwiaGF1bGVyXCJcblx0XSB9KS5ub3ROdWxsKCksXG5cdGpvaW5UaW1lOiBpbnRlZ2VyKFwiam9pbl90aW1lXCIpLm5vdE51bGwoKSxcblx0Li4uc2hhcmVkXG59LCAodGFibGUpID0+IFtcblx0aW5kZXgoXCJpZHhfcGFydGljaXBhbnRfZmxlZXRfaWRcIikub24odGFibGUuZmxlZXRJZCksXG5cdGluZGV4KFwiaWR4X3BhcnRpY2lwYW50X2NoYXJhY3Rlcl9pZFwiKS5vbih0YWJsZS5jaGFyYWN0ZXJJZCksXG5cdGluZGV4KFwiaWR4X3BhcnRpY2lwYW50X2Rpc2NvcmRfaWRcIikub24odGFibGUuZGlzY29yZElkKVxuXSk7XG5jb25zdCBtaW5pbmdGbGVldHNSZWxhdGlvbnMgPSByZWxhdGlvbnMobWluaW5nRmxlZXRzLCAoeyBtYW55IH0pID0+ICh7IHBhcnRpY2lwYW50czogbWFueShtaW5pbmdGbGVldFBhcnRpY2lwYW50cykgfSkpO1xuY29uc3QgbWluaW5nRmxlZXRQYXJ0aWNpcGFudHNSZWxhdGlvbnMgPSByZWxhdGlvbnMobWluaW5nRmxlZXRQYXJ0aWNpcGFudHMsICh7IG9uZSB9KSA9PiAoe1xuXHRmbGVldDogb25lKG1pbmluZ0ZsZWV0cywge1xuXHRcdGZpZWxkczogW21pbmluZ0ZsZWV0UGFydGljaXBhbnRzLmZsZWV0SWRdLFxuXHRcdHJlZmVyZW5jZXM6IFttaW5pbmdGbGVldHMuaWRdXG5cdH0pLFxuXHRjaGFyYWN0ZXI6IG9uZShjaGFyYWN0ZXJzLCB7XG5cdFx0ZmllbGRzOiBbbWluaW5nRmxlZXRQYXJ0aWNpcGFudHMuY2hhcmFjdGVySWRdLFxuXHRcdHJlZmVyZW5jZXM6IFtjaGFyYWN0ZXJzLmlkXVxuXHR9KVxufSkpO1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGNoYXJhY3RlcnMsIG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzLCBtaW5pbmdGbGVldHMsIHJlc3VtZUNvbW1hbmRzLCBzY2hlbWFfZXhwb3J0cywgdXNlcnMgfTsiLAogICAgIi8vI3JlZ2lvbiBzcmMvZXNpL29wdGlvbnMudHNcbmNvbnN0IENMSUVOVF9JRCA9IHByb2Nlc3MuZW52LkVWRV9DTElFTlRfSUQgfHwgXCJcIjtcbmNvbnN0IENMSUVOVF9TRUNSRVQgPSBwcm9jZXNzLmVudi5FVkVfQ0xJRU5UX1NFQ1JFVCB8fCBcIlwiO1xuY29uc3QgQ0FMTEJBQ0tfVVJMID0gcHJvY2Vzcy5lbnYuRVZFX0NBTExCQUNLX1VSTCB8fCBcIlwiO1xuY29uc3QgVVNFUl9BR0VOVCA9IHByb2Nlc3MuZW52LkVTSV9VU0VSX0FHRU5UIHx8IFwiXCI7XG5jb25zdCBvcHRpb25zID0ge1xuXHRjbGllbnRfaWQ6IENMSUVOVF9JRCxcblx0Y2xpZW50X3NlY3JldDogQ0xJRU5UX1NFQ1JFVCxcblx0Y2FsbGJhY2tfdXJsOiBDQUxMQkFDS19VUkwsXG5cdHVzZXJfYWdlbnQ6IFVTRVJfQUdFTlRcbn07XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgb3B0aW9ucyB9OyIsCiAgICAiZXhwb3J0IGNsYXNzIEludmFsaWRUb2tlbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xufVxuSW52YWxpZFRva2VuRXJyb3IucHJvdG90eXBlLm5hbWUgPSBcIkludmFsaWRUb2tlbkVycm9yXCI7XG5mdW5jdGlvbiBiNjREZWNvZGVVbmljb2RlKHN0cikge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoYXRvYihzdHIpLnJlcGxhY2UoLyguKS9nLCAobSwgcCkgPT4ge1xuICAgICAgICBsZXQgY29kZSA9IHAuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICAgICAgaWYgKGNvZGUubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgY29kZSA9IFwiMFwiICsgY29kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCIlXCIgKyBjb2RlO1xuICAgIH0pKTtcbn1cbmZ1bmN0aW9uIGJhc2U2NFVybERlY29kZShzdHIpIHtcbiAgICBsZXQgb3V0cHV0ID0gc3RyLnJlcGxhY2UoLy0vZywgXCIrXCIpLnJlcGxhY2UoL18vZywgXCIvXCIpO1xuICAgIHN3aXRjaCAob3V0cHV0Lmxlbmd0aCAlIDQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIG91dHB1dCArPSBcIj09XCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgb3V0cHV0ICs9IFwiPVwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYXNlNjQgc3RyaW5nIGlzIG5vdCBvZiB0aGUgY29ycmVjdCBsZW5ndGhcIik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBiNjREZWNvZGVVbmljb2RlKG91dHB1dCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGF0b2Iob3V0cHV0KTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gand0RGVjb2RlKHRva2VuLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoXCJJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogbXVzdCBiZSBhIHN0cmluZ1wiKTtcbiAgICB9XG4gICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgICBjb25zdCBwb3MgPSBvcHRpb25zLmhlYWRlciA9PT0gdHJ1ZSA/IDAgOiAxO1xuICAgIGNvbnN0IHBhcnQgPSB0b2tlbi5zcGxpdChcIi5cIilbcG9zXTtcbiAgICBpZiAodHlwZW9mIHBhcnQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbkVycm9yKGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogbWlzc2luZyBwYXJ0ICMke3BvcyArIDF9YCk7XG4gICAgfVxuICAgIGxldCBkZWNvZGVkO1xuICAgIHRyeSB7XG4gICAgICAgIGRlY29kZWQgPSBiYXNlNjRVcmxEZWNvZGUocGFydCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FcnJvcihgSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IGludmFsaWQgYmFzZTY0IGZvciBwYXJ0ICMke3BvcyArIDF9ICgke2UubWVzc2FnZX0pYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZWQpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBpbnZhbGlkIGpzb24gZm9yIHBhcnQgIyR7cG9zICsgMX0gKCR7ZS5tZXNzYWdlfSlgKTtcbiAgICB9XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlMzJVcHBlckNhc2UoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTMyX2ludGVybmFsKGJ5dGVzLCBiYXNlMzJVcHBlckNhc2VBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLkluY2x1ZGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMlVwcGVyQ2FzZU5vUGFkZGluZyhieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJfaW50ZXJuYWwoYnl0ZXMsIGJhc2UzMlVwcGVyQ2FzZUFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuTm9uZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTMyTG93ZXJDYXNlKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2UzMl9pbnRlcm5hbChieXRlcywgYmFzZTMyTG93ZXJDYXNlQWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5JbmNsdWRlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlMzJMb3dlckNhc2VOb1BhZGRpbmcoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTMyX2ludGVybmFsKGJ5dGVzLCBiYXNlMzJMb3dlckNhc2VBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLk5vbmUpO1xufVxuLyoqIFJlcGxhY2VkOiBVc2UgZW5jb2RlQmFzZTMyVXBwZXJDYXNlKCkgaW5zdGVhZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlMzIoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTMyVXBwZXJDYXNlKGJ5dGVzKTtcbn1cbi8qKiBSZXBsYWNlZDogVXNlIGVuY29kZUJhc2UzMlVwcGVyQ2FzZU5vUGFkZGluZygpIGluc3RlYWQuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTMyTm9QYWRkaW5nKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2UzMlVwcGVyQ2FzZU5vUGFkZGluZyhieXRlcyk7XG59XG5mdW5jdGlvbiBlbmNvZGVCYXNlMzJfaW50ZXJuYWwoYnl0ZXMsIGFscGhhYmV0LCBwYWRkaW5nKSB7XG4gICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5ieXRlTGVuZ3RoOyBpICs9IDUpIHtcbiAgICAgICAgbGV0IGJ1ZmZlciA9IDBuO1xuICAgICAgICBsZXQgYnVmZmVyQml0U2l6ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNSAmJiBpICsgaiA8IGJ5dGVzLmJ5dGVMZW5ndGg7IGorKykge1xuICAgICAgICAgICAgYnVmZmVyID0gKGJ1ZmZlciA8PCA4bikgfCBCaWdJbnQoYnl0ZXNbaSArIGpdKTtcbiAgICAgICAgICAgIGJ1ZmZlckJpdFNpemUgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnVmZmVyQml0U2l6ZSAlIDUgIT09IDApIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciA8PCBCaWdJbnQoNSAtIChidWZmZXJCaXRTaXplICUgNSkpO1xuICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSArPSA1IC0gKGJ1ZmZlckJpdFNpemUgJSA1KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDg7IGorKykge1xuICAgICAgICAgICAgaWYgKGJ1ZmZlckJpdFNpemUgPj0gNSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhbHBoYWJldFtOdW1iZXIoKGJ1ZmZlciA+PiBCaWdJbnQoYnVmZmVyQml0U2l6ZSAtIDUpKSAmIDB4MWZuKV07XG4gICAgICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSAtPSA1O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYnVmZmVyQml0U2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gYWxwaGFiZXRbTnVtYmVyKChidWZmZXIgPDwgQmlnSW50KDYgLSBidWZmZXJCaXRTaXplKSkgJiAweDNmbildO1xuICAgICAgICAgICAgICAgIGJ1ZmZlckJpdFNpemUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGFkZGluZyA9PT0gRW5jb2RpbmdQYWRkaW5nLkluY2x1ZGUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCI9XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlMzIoZW5jb2RlZCkge1xuICAgIHJldHVybiBkZWNvZGVCYXNlMzJfaW50ZXJuYWwoZW5jb2RlZCwgYmFzZTMyRGVjb2RlTWFwLCBEZWNvZGluZ1BhZGRpbmcuUmVxdWlyZWQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2UzMklnbm9yZVBhZGRpbmcoZW5jb2RlZCkge1xuICAgIHJldHVybiBkZWNvZGVCYXNlMzJfaW50ZXJuYWwoZW5jb2RlZCwgYmFzZTMyRGVjb2RlTWFwLCBEZWNvZGluZ1BhZGRpbmcuSWdub3JlKTtcbn1cbmZ1bmN0aW9uIGRlY29kZUJhc2UzMl9pbnRlcm5hbChlbmNvZGVkLCBkZWNvZGVNYXAsIHBhZGRpbmcpIHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShNYXRoLmNlaWwoZW5jb2RlZC5sZW5ndGggLyA4KSAqIDUpO1xuICAgIGxldCB0b3RhbEJ5dGVzID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kZWQubGVuZ3RoOyBpICs9IDgpIHtcbiAgICAgICAgbGV0IGNodW5rID0gMG47XG4gICAgICAgIGxldCBiaXRzUmVhZCA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgODsgaisrKSB7XG4gICAgICAgICAgICBpZiAocGFkZGluZyA9PT0gRGVjb2RpbmdQYWRkaW5nLlJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVuY29kZWRbaSArIGpdID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGkgKyBqID49IGVuY29kZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFkZGluZyA9PT0gRGVjb2RpbmdQYWRkaW5nLklnbm9yZSkge1xuICAgICAgICAgICAgICAgIGlmIChpICsgaiA+PSBlbmNvZGVkLmxlbmd0aCB8fCBlbmNvZGVkW2kgKyBqXSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGogPiAwICYmIGVuY29kZWRbaSArIGogLSAxXSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShlbmNvZGVkW2kgKyBqXSBpbiBkZWNvZGVNYXApKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjaGFyYWN0ZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVuayB8PSBCaWdJbnQoZGVjb2RlTWFwW2VuY29kZWRbaSArIGpdXSkgPDwgQmlnSW50KCg3IC0gaikgKiA1KTtcbiAgICAgICAgICAgIGJpdHNSZWFkICs9IDU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJpdHNSZWFkIDwgNDApIHtcbiAgICAgICAgICAgIGxldCB1bnVzZWQ7XG4gICAgICAgICAgICBpZiAoYml0c1JlYWQgPT09IDEwKSB7XG4gICAgICAgICAgICAgICAgdW51c2VkID0gY2h1bmsgJiAweGZmZmZmZmZmbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJpdHNSZWFkID09PSAyMCkge1xuICAgICAgICAgICAgICAgIHVudXNlZCA9IGNodW5rICYgMHhmZmZmZmZuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYml0c1JlYWQgPT09IDI1KSB7XG4gICAgICAgICAgICAgICAgdW51c2VkID0gY2h1bmsgJiAweGZmZmZuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYml0c1JlYWQgPT09IDM1KSB7XG4gICAgICAgICAgICAgICAgdW51c2VkID0gY2h1bmsgJiAweGZmbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1bnVzZWQgIT09IDBuKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ5dGVMZW5ndGggPSBNYXRoLmZsb29yKGJpdHNSZWFkIC8gOCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHRbdG90YWxCeXRlc10gPSBOdW1iZXIoKGNodW5rID4+IEJpZ0ludCgzMiAtIGkgKiA4KSkgJiAweGZmbik7XG4gICAgICAgICAgICB0b3RhbEJ5dGVzKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zbGljZSgwLCB0b3RhbEJ5dGVzKTtcbn1cbmNvbnN0IGJhc2UzMlVwcGVyQ2FzZUFscGhhYmV0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjIzNDU2N1wiO1xuY29uc3QgYmFzZTMyTG93ZXJDYXNlQWxwaGFiZXQgPSBcImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MjM0NTY3XCI7XG5jb25zdCBiYXNlMzJEZWNvZGVNYXAgPSB7XG4gICAgQTogMCxcbiAgICBCOiAxLFxuICAgIEM6IDIsXG4gICAgRDogMyxcbiAgICBFOiA0LFxuICAgIEY6IDUsXG4gICAgRzogNixcbiAgICBIOiA3LFxuICAgIEk6IDgsXG4gICAgSjogOSxcbiAgICBLOiAxMCxcbiAgICBMOiAxMSxcbiAgICBNOiAxMixcbiAgICBOOiAxMyxcbiAgICBPOiAxNCxcbiAgICBQOiAxNSxcbiAgICBROiAxNixcbiAgICBSOiAxNyxcbiAgICBTOiAxOCxcbiAgICBUOiAxOSxcbiAgICBVOiAyMCxcbiAgICBWOiAyMSxcbiAgICBXOiAyMixcbiAgICBYOiAyMyxcbiAgICBZOiAyNCxcbiAgICBaOiAyNSxcbiAgICBhOiAwLFxuICAgIGI6IDEsXG4gICAgYzogMixcbiAgICBkOiAzLFxuICAgIGU6IDQsXG4gICAgZjogNSxcbiAgICBnOiA2LFxuICAgIGg6IDcsXG4gICAgaTogOCxcbiAgICBqOiA5LFxuICAgIGs6IDEwLFxuICAgIGw6IDExLFxuICAgIG06IDEyLFxuICAgIG46IDEzLFxuICAgIG86IDE0LFxuICAgIHA6IDE1LFxuICAgIHE6IDE2LFxuICAgIHI6IDE3LFxuICAgIHM6IDE4LFxuICAgIHQ6IDE5LFxuICAgIHU6IDIwLFxuICAgIHY6IDIxLFxuICAgIHc6IDIyLFxuICAgIHg6IDIzLFxuICAgIHk6IDI0LFxuICAgIHo6IDI1LFxuICAgIFwiMlwiOiAyNixcbiAgICBcIjNcIjogMjcsXG4gICAgXCI0XCI6IDI4LFxuICAgIFwiNVwiOiAyOSxcbiAgICBcIjZcIjogMzAsXG4gICAgXCI3XCI6IDMxXG59O1xudmFyIEVuY29kaW5nUGFkZGluZztcbihmdW5jdGlvbiAoRW5jb2RpbmdQYWRkaW5nKSB7XG4gICAgRW5jb2RpbmdQYWRkaW5nW0VuY29kaW5nUGFkZGluZ1tcIkluY2x1ZGVcIl0gPSAwXSA9IFwiSW5jbHVkZVwiO1xuICAgIEVuY29kaW5nUGFkZGluZ1tFbmNvZGluZ1BhZGRpbmdbXCJOb25lXCJdID0gMV0gPSBcIk5vbmVcIjtcbn0pKEVuY29kaW5nUGFkZGluZyB8fCAoRW5jb2RpbmdQYWRkaW5nID0ge30pKTtcbnZhciBEZWNvZGluZ1BhZGRpbmc7XG4oZnVuY3Rpb24gKERlY29kaW5nUGFkZGluZykge1xuICAgIERlY29kaW5nUGFkZGluZ1tEZWNvZGluZ1BhZGRpbmdbXCJSZXF1aXJlZFwiXSA9IDBdID0gXCJSZXF1aXJlZFwiO1xuICAgIERlY29kaW5nUGFkZGluZ1tEZWNvZGluZ1BhZGRpbmdbXCJJZ25vcmVcIl0gPSAxXSA9IFwiSWdub3JlXCI7XG59KShEZWNvZGluZ1BhZGRpbmcgfHwgKERlY29kaW5nUGFkZGluZyA9IHt9KSk7XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlNjQoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTY0X2ludGVybmFsKGJ5dGVzLCBiYXNlNjRBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLkluY2x1ZGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2U2NE5vUGFkZGluZyhieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlNjRfaW50ZXJuYWwoYnl0ZXMsIGJhc2U2NEFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuTm9uZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTY0dXJsKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2U2NF9pbnRlcm5hbChieXRlcywgYmFzZTY0dXJsQWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5JbmNsdWRlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlNjR1cmxOb1BhZGRpbmcoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTY0X2ludGVybmFsKGJ5dGVzLCBiYXNlNjR1cmxBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLk5vbmUpO1xufVxuZnVuY3Rpb24gZW5jb2RlQmFzZTY0X2ludGVybmFsKGJ5dGVzLCBhbHBoYWJldCwgcGFkZGluZykge1xuICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMuYnl0ZUxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIGxldCBidWZmZXIgPSAwO1xuICAgICAgICBsZXQgYnVmZmVyQml0U2l6ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMyAmJiBpICsgaiA8IGJ5dGVzLmJ5dGVMZW5ndGg7IGorKykge1xuICAgICAgICAgICAgYnVmZmVyID0gKGJ1ZmZlciA8PCA4KSB8IGJ5dGVzW2kgKyBqXTtcbiAgICAgICAgICAgIGJ1ZmZlckJpdFNpemUgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgaWYgKGJ1ZmZlckJpdFNpemUgPj0gNikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhbHBoYWJldFsoYnVmZmVyID4+IChidWZmZXJCaXRTaXplIC0gNikpICYgMHgzZl07XG4gICAgICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSAtPSA2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYnVmZmVyQml0U2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gYWxwaGFiZXRbKGJ1ZmZlciA8PCAoNiAtIGJ1ZmZlckJpdFNpemUpKSAmIDB4M2ZdO1xuICAgICAgICAgICAgICAgIGJ1ZmZlckJpdFNpemUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGFkZGluZyA9PT0gRW5jb2RpbmdQYWRkaW5nLkluY2x1ZGUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCI9XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmNvbnN0IGJhc2U2NEFscGhhYmV0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7XG5jb25zdCBiYXNlNjR1cmxBbHBoYWJldCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktX1wiO1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2U2NChlbmNvZGVkKSB7XG4gICAgcmV0dXJuIGRlY29kZUJhc2U2NF9pbnRlcm5hbChlbmNvZGVkLCBiYXNlNjREZWNvZGVNYXAsIERlY29kaW5nUGFkZGluZy5SZXF1aXJlZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTY0SWdub3JlUGFkZGluZyhlbmNvZGVkKSB7XG4gICAgcmV0dXJuIGRlY29kZUJhc2U2NF9pbnRlcm5hbChlbmNvZGVkLCBiYXNlNjREZWNvZGVNYXAsIERlY29kaW5nUGFkZGluZy5JZ25vcmUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2U2NHVybChlbmNvZGVkKSB7XG4gICAgcmV0dXJuIGRlY29kZUJhc2U2NF9pbnRlcm5hbChlbmNvZGVkLCBiYXNlNjR1cmxEZWNvZGVNYXAsIERlY29kaW5nUGFkZGluZy5SZXF1aXJlZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTY0dXJsSWdub3JlUGFkZGluZyhlbmNvZGVkKSB7XG4gICAgcmV0dXJuIGRlY29kZUJhc2U2NF9pbnRlcm5hbChlbmNvZGVkLCBiYXNlNjR1cmxEZWNvZGVNYXAsIERlY29kaW5nUGFkZGluZy5JZ25vcmUpO1xufVxuZnVuY3Rpb24gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGRlY29kZU1hcCwgcGFkZGluZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KE1hdGguY2VpbChlbmNvZGVkLmxlbmd0aCAvIDQpICogMyk7XG4gICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RlZC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICBsZXQgY2h1bmsgPSAwO1xuICAgICAgICBsZXQgYml0c1JlYWQgPSAwO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgaWYgKHBhZGRpbmcgPT09IERlY29kaW5nUGFkZGluZy5SZXF1aXJlZCAmJiBlbmNvZGVkW2kgKyBqXSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWRkaW5nID09PSBEZWNvZGluZ1BhZGRpbmcuSWdub3JlICYmXG4gICAgICAgICAgICAgICAgKGkgKyBqID49IGVuY29kZWQubGVuZ3RoIHx8IGVuY29kZWRbaSArIGpdID09PSBcIj1cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqID4gMCAmJiBlbmNvZGVkW2kgKyBqIC0gMV0gPT09IFwiPVwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoZW5jb2RlZFtpICsgal0gaW4gZGVjb2RlTWFwKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2hhcmFjdGVyXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2h1bmsgfD0gZGVjb2RlTWFwW2VuY29kZWRbaSArIGpdXSA8PCAoKDMgLSBqKSAqIDYpO1xuICAgICAgICAgICAgYml0c1JlYWQgKz0gNjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYml0c1JlYWQgPCAyNCkge1xuICAgICAgICAgICAgbGV0IHVudXNlZDtcbiAgICAgICAgICAgIGlmIChiaXRzUmVhZCA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmZmZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJpdHNSZWFkID09PSAxOCkge1xuICAgICAgICAgICAgICAgIHVudXNlZCA9IGNodW5rICYgMHhmZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1bnVzZWQgIT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnl0ZUxlbmd0aCA9IE1hdGguZmxvb3IoYml0c1JlYWQgLyA4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdFt0b3RhbEJ5dGVzXSA9IChjaHVuayA+PiAoMTYgLSBpICogOCkpICYgMHhmZjtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LnNsaWNlKDAsIHRvdGFsQnl0ZXMpO1xufVxudmFyIEVuY29kaW5nUGFkZGluZztcbihmdW5jdGlvbiAoRW5jb2RpbmdQYWRkaW5nKSB7XG4gICAgRW5jb2RpbmdQYWRkaW5nW0VuY29kaW5nUGFkZGluZ1tcIkluY2x1ZGVcIl0gPSAwXSA9IFwiSW5jbHVkZVwiO1xuICAgIEVuY29kaW5nUGFkZGluZ1tFbmNvZGluZ1BhZGRpbmdbXCJOb25lXCJdID0gMV0gPSBcIk5vbmVcIjtcbn0pKEVuY29kaW5nUGFkZGluZyB8fCAoRW5jb2RpbmdQYWRkaW5nID0ge30pKTtcbnZhciBEZWNvZGluZ1BhZGRpbmc7XG4oZnVuY3Rpb24gKERlY29kaW5nUGFkZGluZykge1xuICAgIERlY29kaW5nUGFkZGluZ1tEZWNvZGluZ1BhZGRpbmdbXCJSZXF1aXJlZFwiXSA9IDBdID0gXCJSZXF1aXJlZFwiO1xuICAgIERlY29kaW5nUGFkZGluZ1tEZWNvZGluZ1BhZGRpbmdbXCJJZ25vcmVcIl0gPSAxXSA9IFwiSWdub3JlXCI7XG59KShEZWNvZGluZ1BhZGRpbmcgfHwgKERlY29kaW5nUGFkZGluZyA9IHt9KSk7XG5jb25zdCBiYXNlNjREZWNvZGVNYXAgPSB7XG4gICAgXCIwXCI6IDUyLFxuICAgIFwiMVwiOiA1MyxcbiAgICBcIjJcIjogNTQsXG4gICAgXCIzXCI6IDU1LFxuICAgIFwiNFwiOiA1NixcbiAgICBcIjVcIjogNTcsXG4gICAgXCI2XCI6IDU4LFxuICAgIFwiN1wiOiA1OSxcbiAgICBcIjhcIjogNjAsXG4gICAgXCI5XCI6IDYxLFxuICAgIEE6IDAsXG4gICAgQjogMSxcbiAgICBDOiAyLFxuICAgIEQ6IDMsXG4gICAgRTogNCxcbiAgICBGOiA1LFxuICAgIEc6IDYsXG4gICAgSDogNyxcbiAgICBJOiA4LFxuICAgIEo6IDksXG4gICAgSzogMTAsXG4gICAgTDogMTEsXG4gICAgTTogMTIsXG4gICAgTjogMTMsXG4gICAgTzogMTQsXG4gICAgUDogMTUsXG4gICAgUTogMTYsXG4gICAgUjogMTcsXG4gICAgUzogMTgsXG4gICAgVDogMTksXG4gICAgVTogMjAsXG4gICAgVjogMjEsXG4gICAgVzogMjIsXG4gICAgWDogMjMsXG4gICAgWTogMjQsXG4gICAgWjogMjUsXG4gICAgYTogMjYsXG4gICAgYjogMjcsXG4gICAgYzogMjgsXG4gICAgZDogMjksXG4gICAgZTogMzAsXG4gICAgZjogMzEsXG4gICAgZzogMzIsXG4gICAgaDogMzMsXG4gICAgaTogMzQsXG4gICAgajogMzUsXG4gICAgazogMzYsXG4gICAgbDogMzcsXG4gICAgbTogMzgsXG4gICAgbjogMzksXG4gICAgbzogNDAsXG4gICAgcDogNDEsXG4gICAgcTogNDIsXG4gICAgcjogNDMsXG4gICAgczogNDQsXG4gICAgdDogNDUsXG4gICAgdTogNDYsXG4gICAgdjogNDcsXG4gICAgdzogNDgsXG4gICAgeDogNDksXG4gICAgeTogNTAsXG4gICAgejogNTEsXG4gICAgXCIrXCI6IDYyLFxuICAgIFwiL1wiOiA2M1xufTtcbmNvbnN0IGJhc2U2NHVybERlY29kZU1hcCA9IHtcbiAgICBcIjBcIjogNTIsXG4gICAgXCIxXCI6IDUzLFxuICAgIFwiMlwiOiA1NCxcbiAgICBcIjNcIjogNTUsXG4gICAgXCI0XCI6IDU2LFxuICAgIFwiNVwiOiA1NyxcbiAgICBcIjZcIjogNTgsXG4gICAgXCI3XCI6IDU5LFxuICAgIFwiOFwiOiA2MCxcbiAgICBcIjlcIjogNjEsXG4gICAgQTogMCxcbiAgICBCOiAxLFxuICAgIEM6IDIsXG4gICAgRDogMyxcbiAgICBFOiA0LFxuICAgIEY6IDUsXG4gICAgRzogNixcbiAgICBIOiA3LFxuICAgIEk6IDgsXG4gICAgSjogOSxcbiAgICBLOiAxMCxcbiAgICBMOiAxMSxcbiAgICBNOiAxMixcbiAgICBOOiAxMyxcbiAgICBPOiAxNCxcbiAgICBQOiAxNSxcbiAgICBROiAxNixcbiAgICBSOiAxNyxcbiAgICBTOiAxOCxcbiAgICBUOiAxOSxcbiAgICBVOiAyMCxcbiAgICBWOiAyMSxcbiAgICBXOiAyMixcbiAgICBYOiAyMyxcbiAgICBZOiAyNCxcbiAgICBaOiAyNSxcbiAgICBhOiAyNixcbiAgICBiOiAyNyxcbiAgICBjOiAyOCxcbiAgICBkOiAyOSxcbiAgICBlOiAzMCxcbiAgICBmOiAzMSxcbiAgICBnOiAzMixcbiAgICBoOiAzMyxcbiAgICBpOiAzNCxcbiAgICBqOiAzNSxcbiAgICBrOiAzNixcbiAgICBsOiAzNyxcbiAgICBtOiAzOCxcbiAgICBuOiAzOSxcbiAgICBvOiA0MCxcbiAgICBwOiA0MSxcbiAgICBxOiA0MixcbiAgICByOiA0MyxcbiAgICBzOiA0NCxcbiAgICB0OiA0NSxcbiAgICB1OiA0NixcbiAgICB2OiA0NyxcbiAgICB3OiA0OCxcbiAgICB4OiA0OSxcbiAgICB5OiA1MCxcbiAgICB6OiA1MSxcbiAgICBcIi1cIjogNjIsXG4gICAgXzogNjNcbn07XG4iLAogICAgImltcG9ydCB7IF9fZXhwb3J0IH0gZnJvbSBcIi4uL192aXJ0dWFsL3JvbGxkb3duX3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tIFwiLi9vcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBqd3REZWNvZGUgfSBmcm9tIFwiand0LWRlY29kZVwiO1xuaW1wb3J0IHsgZW5jb2RlQmFzZTY0dXJsTm9QYWRkaW5nIH0gZnJvbSBcIkBvc2xvanMvZW5jb2RpbmdcIjtcbmltcG9ydCBqd3QgZnJvbSBcImpzb253ZWJ0b2tlblwiO1xuaW1wb3J0IGp3a1RvUGVtIGZyb20gXCJqd2stdG8tcGVtXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZXNpL2F1dGgudHNcbnZhciBhdXRoX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGF1dGhfZXhwb3J0cywge1xuXHRjaGFyYWN0ZXJJZEZyb21Ub2tlbjogKCkgPT4gY2hhcmFjdGVySWRGcm9tVG9rZW4sXG5cdGNyZWF0ZUF1dGhvcml6YXRpb25VUkw6ICgpID0+IGNyZWF0ZUF1dGhvcml6YXRpb25VUkwsXG5cdHJlZnJlc2g6ICgpID0+IHJlZnJlc2gsXG5cdHZhbGlkYXRlQXV0aG9yaXphdGlvbkNvZGU6ICgpID0+IHZhbGlkYXRlQXV0aG9yaXphdGlvbkNvZGUsXG5cdHZhbGlkYXRlVG9rZW46ICgpID0+IHZhbGlkYXRlVG9rZW5cbn0pO1xuZnVuY3Rpb24gZ2VuZXJhdGVTdGF0ZSgpIHtcblx0Y29uc3QgcmFuZG9tVmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuXHRjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHJhbmRvbVZhbHVlcyk7XG5cdHJldHVybiBlbmNvZGVCYXNlNjR1cmxOb1BhZGRpbmcocmFuZG9tVmFsdWVzKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUF1dGhvcml6YXRpb25VUkwoc2NvcGVzID0gXCJwdWJsaWNEYXRhXCIpIHtcblx0Y29uc3Qgc3RhdGUgPSBnZW5lcmF0ZVN0YXRlKCk7XG5cdGNvbnN0IHVybCA9IG5ldyBVUkwoXCJodHRwczovL2xvZ2luLmV2ZW9ubGluZS5jb20vdjIvb2F1dGgvYXV0aG9yaXplL1wiKTtcblx0dXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJyZXNwb25zZV90eXBlXCIsIFwiY29kZVwiKTtcblx0dXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJyZWRpcmVjdF91cmlcIiwgb3B0aW9ucy5jYWxsYmFja191cmwpO1xuXHR1cmwuc2VhcmNoUGFyYW1zLnNldChcImNsaWVudF9pZFwiLCBvcHRpb25zLmNsaWVudF9pZCk7XG5cdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwic3RhdGVcIiwgc3RhdGUpO1xuXHR1cmwuc2VhcmNoUGFyYW1zLnNldChcInNjb3BlXCIsIEFycmF5LmlzQXJyYXkoc2NvcGVzKSA/IHNjb3Blcy5qb2luKFwiIFwiKSA6IHNjb3Blcyk7XG5cdHJldHVybiB7XG5cdFx0dXJsLFxuXHRcdHN0YXRlXG5cdH07XG59XG5hc3luYyBmdW5jdGlvbiB2YWxpZGF0ZUF1dGhvcml6YXRpb25Db2RlKGNvZGUpIHtcblx0dHJ5IHtcblx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9sb2dpbi5ldmVvbmxpbmUuY29tL3YyL29hdXRoL3Rva2VuXCIsIHtcblx0XHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIsXG5cdFx0XHRcdEF1dGhvcml6YXRpb246IGBCYXNpYyAke0J1ZmZlci5mcm9tKGAke29wdGlvbnMuY2xpZW50X2lkfToke29wdGlvbnMuY2xpZW50X3NlY3JldH1gKS50b1N0cmluZyhcImJhc2U2NFwiKX1gXG5cdFx0XHR9LFxuXHRcdFx0Ym9keTogbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG5cdFx0XHRcdGdyYW50X3R5cGU6IFwiYXV0aG9yaXphdGlvbl9jb2RlXCIsXG5cdFx0XHRcdGNvZGVcblx0XHRcdH0pXG5cdFx0fSk7XG5cdFx0cmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRjb25zb2xlLmVycm9yKGBmYWlsZWQgdG8gdmFsaWRhdGUgRVZFIGF1dGhvcml6YXRpb24gY29kZWAsIGVycm9yKTtcblx0XHR0aHJvdyBgJHtlcnJvcn1gO1xuXHR9XG59XG5sZXQgZXZlQXV0aFB1YmxpY0tleTtcbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlVG9rZW4odG9rZW4pIHtcblx0aWYgKCFldmVBdXRoUHVibGljS2V5KSB0cnkge1xuXHRcdGNvbnN0IGV2ZUpXS1MgPSBhd2FpdCAoYXdhaXQgZmV0Y2goXCJodHRwczovL2xvZ2luLmV2ZW9ubGluZS5jb20vb2F1dGgvandrc1wiKSkuanNvbigpO1xuXHRcdGV2ZUF1dGhQdWJsaWNLZXkgPSBqd2tUb1BlbShldmVKV0tTLmtleXNbMF0pO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRjb25zb2xlLmVycm9yKGBmYWlsZWQgdG8gZ2V0IEVWRSBBdXRoIHB1YmxpYyBrZXlzYCwgZXJyKTtcblx0fVxuXHR0cnkge1xuXHRcdGNvbnN0IGRlY29kZWQgPSBqd3QudmVyaWZ5KHRva2VuLCBldmVBdXRoUHVibGljS2V5KTtcblx0XHRyZXR1cm4gZGVjb2RlZDtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Y29uc29sZS5lcnJvcihgZmFpbGVkIHRvIHZhbGlkYXRlIEVWRSB0b2tlbmAsIGVycik7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cbn1cbmFzeW5jIGZ1bmN0aW9uIHJlZnJlc2goeyByZWZyZXNoX3Rva2VuIH0sIHNjb3Blcykge1xuXHRjb25zdCBwYXJhbXMgPSB7XG5cdFx0Z3JhbnRfdHlwZTogXCJyZWZyZXNoX3Rva2VuXCIsXG5cdFx0cmVmcmVzaF90b2tlbixcblx0XHRzY29wZTogXCJcIlxuXHR9O1xuXHRpZiAoc2NvcGVzKSBwYXJhbXNbXCJzY29wZVwiXSA9IEFycmF5LmlzQXJyYXkoc2NvcGVzKSA/IHNjb3Blcy5qb2luKFwiIFwiKSA6IHNjb3Blcztcblx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vbG9naW4uZXZlb25saW5lLmNvbS92Mi9vYXV0aC90b2tlblwiLCB7XG5cdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiLFxuXHRcdFx0QXV0aG9yaXphdGlvbjogYEJhc2ljICR7QnVmZmVyLmZyb20oYCR7b3B0aW9ucy5jbGllbnRfaWR9OiR7b3B0aW9ucy5jbGllbnRfc2VjcmV0fWApLnRvU3RyaW5nKFwiYmFzZTY0XCIpfWBcblx0XHR9LFxuXHRcdGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zKVxuXHR9KTtcblx0cmV0dXJuIGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbn1cbmZ1bmN0aW9uIGNoYXJhY3RlcklkRnJvbVRva2VuKHRva2VuKSB7XG5cdGNvbnN0IHBheWxvYWQgPSBqd3REZWNvZGUodG9rZW4pO1xuXHRyZXR1cm4gcGFyc2VJbnQocGF5bG9hZC5zdWIuc3BsaXQoXCI6XCIpWzJdKTtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBhdXRoX2V4cG9ydHMsIGNoYXJhY3RlcklkRnJvbVRva2VuLCBjcmVhdGVBdXRob3JpemF0aW9uVVJMLCByZWZyZXNoLCB2YWxpZGF0ZUF1dGhvcml6YXRpb25Db2RlLCB2YWxpZGF0ZVRva2VuIH07IiwKICAgICJpbXBvcnQgeyBjaGFyYWN0ZXJzIH0gZnJvbSBcIi4uL3NjaGVtYS5qc1wiO1xuaW1wb3J0IHsgcmVmcmVzaCwgdmFsaWRhdGVUb2tlbiB9IGZyb20gXCIuLi8uLi9lc2kvYXV0aC5qc1wiO1xuaW1wb3J0IHsgZGIgfSBmcm9tIFwiLi4vaW5kZXguanNcIjtcbmltcG9ydCB7IGFuZCwgZXEgfSBmcm9tIFwiZHJpenpsZS1vcm1cIjtcbmltcG9ydCB7IGp3dERlY29kZSB9IGZyb20gXCJqd3QtZGVjb2RlXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZGIvbW9kZWxzL2NoYXJhY3Rlci5tb2RlbC50c1xudmFyIENoYXJhY3RlckhlbHBlciA9IGNsYXNzIENoYXJhY3RlckhlbHBlciB7XG5cdHN0YXRpYyBoYXNWYWxpZFRva2VuKGNoYXJhY3Rlcikge1xuXHRcdHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSA8IGNoYXJhY3Rlci5leHBpcmVzQXQ7XG5cdH1cblx0c3RhdGljIGdldFNjb3BlcyhjaGFyYWN0ZXIpIHtcblx0XHRjb25zdCBkZWNvZGVkID0gand0RGVjb2RlKGNoYXJhY3Rlci5hY2Nlc3NUb2tlbik7XG5cdFx0cmV0dXJuIHR5cGVvZiBkZWNvZGVkLnNjcCA9PT0gXCJzdHJpbmdcIiA/IFtkZWNvZGVkLnNjcF0gOiBkZWNvZGVkLnNjcDtcblx0fVxuXHRzdGF0aWMgaGFzT25seVB1YmxpY1Njb3BlKGNoYXJhY3Rlcikge1xuXHRcdHJldHVybiB0aGlzLmdldFNjb3BlcyhjaGFyYWN0ZXIpLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJwdWJsaWNEYXRhXCIpO1xuXHR9XG5cdHN0YXRpYyBnZXRUb2tlbnMoY2hhcmFjdGVyKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGFjY2Vzc190b2tlbjogY2hhcmFjdGVyLmFjY2Vzc1Rva2VuLFxuXHRcdFx0cmVmcmVzaF90b2tlbjogY2hhcmFjdGVyLnJlZnJlc2hUb2tlbixcblx0XHRcdGV4cGlyZXNfaW46IChjaGFyYWN0ZXIuZXhwaXJlc0F0LmdldFRpbWUoKSAtIERhdGUubm93KCkpIC8gMWUzXG5cdFx0fTtcblx0fVxuXHRzdGF0aWMgaGFzU2NvcGUoY2hhcmFjdGVyLCBzY29wZSkge1xuXHRcdHJldHVybiB0aGlzLmdldFNjb3BlcyhjaGFyYWN0ZXIpLmluY2x1ZGVzKHNjb3BlKTtcblx0fVxuXHRzdGF0aWMgaGFzQWxsU2NvcGVzKGNoYXJhY3Rlciwgc2NvcGVzKSB7XG5cdFx0Y29uc3QgaGFzID0gdGhpcy5nZXRTY29wZXMoY2hhcmFjdGVyKTtcblx0XHRyZXR1cm4gc2NvcGVzLmV2ZXJ5KChzY29wZSkgPT4gaGFzLmluY2x1ZGVzKHNjb3BlKSk7XG5cdH1cblx0c3RhdGljIGZpbmQoaWQpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3QoKS5mcm9tKGNoYXJhY3RlcnMpLndoZXJlKGVxKGNoYXJhY3RlcnMuaWQsIGlkKSkubGltaXQoMSkuZ2V0KCk7XG5cdFx0Y29uc3QgYyA9IHRoaXMuY3JlYXRlQ2hhcmFjdGVycyhyZXN1bHQpO1xuXHRcdHJldHVybiBjID8gY1swXSA6IHZvaWQgMDtcblx0fVxuXHRzdGF0aWMgZmluZEJ5VXNlcih1c2VyKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KCkuZnJvbShjaGFyYWN0ZXJzKS53aGVyZShlcShjaGFyYWN0ZXJzLnVzZXJJRCwgdXNlci5pZCkpLmFsbCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUNoYXJhY3RlcnMocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgZmluZEJ5VXNlckFuZEV2ZUlEKHVzZXJJRCwgZXZlSUQpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3QoKS5mcm9tKGNoYXJhY3RlcnMpLndoZXJlKGFuZChlcShjaGFyYWN0ZXJzLnVzZXJJRCwgdXNlcklEKSwgZXEoY2hhcmFjdGVycy5ldmVJRCwgZXZlSUQpKSkubGltaXQoMSkuZ2V0KCk7XG5cdFx0Y29uc3QgYyA9IHRoaXMuY3JlYXRlQ2hhcmFjdGVycyhyZXN1bHQpO1xuXHRcdHJldHVybiBjID8gY1swXSA6IHZvaWQgMDtcblx0fVxuXHRzdGF0aWMgZmluZEJ5TmFtZSh1c2VySUQsIG5hbWUpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3QoKS5mcm9tKGNoYXJhY3RlcnMpLndoZXJlKGFuZChlcShjaGFyYWN0ZXJzLm5hbWUsIG5hbWUpLCBlcShjaGFyYWN0ZXJzLnVzZXJJRCwgdXNlcklEKSkpLmxpbWl0KDEpLmdldCgpO1xuXHRcdGNvbnN0IGMgPSB0aGlzLmNyZWF0ZUNoYXJhY3RlcnMocmVzdWx0KTtcblx0XHRyZXR1cm4gYyA/IGNbMF0gOiB2b2lkIDA7XG5cdH1cblx0c3RhdGljIGZpbmRBbGwoKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KCkuZnJvbShjaGFyYWN0ZXJzKS5hbGwoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVDaGFyYWN0ZXJzKHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGNyZWF0ZShldmVJRCwgbmFtZSwgdXNlciwgdG9rZW5zKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2F2ZSh7XG5cdFx0XHRldmVJRCxcblx0XHRcdHVzZXJJRDogdXNlci5pZCxcblx0XHRcdGFjY2Vzc1Rva2VuOiB0b2tlbnMuYWNjZXNzX3Rva2VuLFxuXHRcdFx0ZXhwaXJlc0F0OiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUodG9rZW5zLmV4cGlyZXNfaW4gKiAxZTMpLFxuXHRcdFx0cmVmcmVzaFRva2VuOiB0b2tlbnMucmVmcmVzaF90b2tlbixcblx0XHRcdG5hbWUsXG5cdFx0XHRjcmVhdGVkQXQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpXG5cdFx0fSk7XG5cdH1cblx0c3RhdGljIGNyZWF0ZUNoYXJhY3RlcnMocXVlcnkpIHtcblx0XHRpZiAoIXF1ZXJ5KSByZXR1cm4gW107XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkocXVlcnkpKSByZXR1cm4gcXVlcnkubWFwKChjaGFyYWN0ZXIpID0+IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGlkOiBjaGFyYWN0ZXIuaWQsXG5cdFx0XHRcdGV2ZUlEOiBjaGFyYWN0ZXIuZXZlSUQsXG5cdFx0XHRcdHVzZXJJRDogY2hhcmFjdGVyLnVzZXJJRCxcblx0XHRcdFx0YWNjZXNzVG9rZW46IGNoYXJhY3Rlci5hY2Nlc3NUb2tlbixcblx0XHRcdFx0ZXhwaXJlc0F0OiBuZXcgRGF0ZShjaGFyYWN0ZXIuZXhwaXJlc0F0KSxcblx0XHRcdFx0cmVmcmVzaFRva2VuOiBjaGFyYWN0ZXIucmVmcmVzaFRva2VuLFxuXHRcdFx0XHRuYW1lOiBjaGFyYWN0ZXIubmFtZSxcblx0XHRcdFx0Y3JlYXRlZEF0OiBuZXcgRGF0ZShjaGFyYWN0ZXIuY3JlYXRlZEF0KSxcblx0XHRcdFx0dXBkYXRlZEF0OiBuZXcgRGF0ZShjaGFyYWN0ZXIudXBkYXRlZEF0KVxuXHRcdFx0fTtcblx0XHR9KTtcblx0XHRlbHNlIHJldHVybiBbe1xuXHRcdFx0aWQ6IHF1ZXJ5LmlkLFxuXHRcdFx0ZXZlSUQ6IHF1ZXJ5LmV2ZUlELFxuXHRcdFx0dXNlcklEOiBxdWVyeS51c2VySUQsXG5cdFx0XHRhY2Nlc3NUb2tlbjogcXVlcnkuYWNjZXNzVG9rZW4sXG5cdFx0XHRleHBpcmVzQXQ6IG5ldyBEYXRlKHF1ZXJ5LmV4cGlyZXNBdCksXG5cdFx0XHRyZWZyZXNoVG9rZW46IHF1ZXJ5LnJlZnJlc2hUb2tlbixcblx0XHRcdG5hbWU6IHF1ZXJ5Lm5hbWUsXG5cdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKHF1ZXJ5LmNyZWF0ZWRBdCksXG5cdFx0XHR1cGRhdGVkQXQ6IG5ldyBEYXRlKHF1ZXJ5LnVwZGF0ZWRBdClcblx0XHR9XTtcblx0fVxuXHRzdGF0aWMgc2F2ZShjaGFyYWN0ZXIpIHtcblx0XHRkYi5pbnNlcnQoY2hhcmFjdGVycykudmFsdWVzKHtcblx0XHRcdGlkOiBjaGFyYWN0ZXIuaWQsXG5cdFx0XHRldmVJRDogY2hhcmFjdGVyLmV2ZUlELFxuXHRcdFx0dXNlcklEOiBjaGFyYWN0ZXIudXNlcklELFxuXHRcdFx0bmFtZTogY2hhcmFjdGVyLm5hbWUsXG5cdFx0XHRhY2Nlc3NUb2tlbjogY2hhcmFjdGVyLmFjY2Vzc1Rva2VuLFxuXHRcdFx0ZXhwaXJlc0F0OiBjaGFyYWN0ZXIuZXhwaXJlc0F0LmdldFRpbWUoKSxcblx0XHRcdHJlZnJlc2hUb2tlbjogY2hhcmFjdGVyLnJlZnJlc2hUb2tlbixcblx0XHRcdGNyZWF0ZWRBdDogRGF0ZS5ub3coKSxcblx0XHRcdHVwZGF0ZWRBdDogRGF0ZS5ub3coKVxuXHRcdH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG5cdFx0XHR0YXJnZXQ6IGNoYXJhY3RlcnMuaWQsXG5cdFx0XHRzZXQ6IHtcblx0XHRcdFx0ZXZlSUQ6IGNoYXJhY3Rlci5ldmVJRCxcblx0XHRcdFx0dXNlcklEOiBjaGFyYWN0ZXIudXNlcklELFxuXHRcdFx0XHRuYW1lOiBjaGFyYWN0ZXIubmFtZSxcblx0XHRcdFx0YWNjZXNzVG9rZW46IGNoYXJhY3Rlci5hY2Nlc3NUb2tlbixcblx0XHRcdFx0ZXhwaXJlc0F0OiBjaGFyYWN0ZXIuZXhwaXJlc0F0LmdldFRpbWUoKSxcblx0XHRcdFx0cmVmcmVzaFRva2VuOiBjaGFyYWN0ZXIucmVmcmVzaFRva2VuLFxuXHRcdFx0XHR1cGRhdGVkQXQ6IERhdGUubm93KClcblx0XHRcdH1cblx0XHR9KS5ydW4oKTtcblx0XHRyZXR1cm4gQ2hhcmFjdGVySGVscGVyLmZpbmRCeVVzZXJBbmRFdmVJRChjaGFyYWN0ZXIudXNlcklELCBjaGFyYWN0ZXIuZXZlSUQpO1xuXHR9XG5cdHN0YXRpYyBkZWxldGUoY2hhcmFjdGVyKSB7XG5cdFx0ZGIuZGVsZXRlKGNoYXJhY3RlcnMpLndoZXJlKGVxKGNoYXJhY3RlcnMuaWQsIGNoYXJhY3Rlci5pZCkpLnJ1bigpO1xuXHR9XG5cdHN0YXRpYyBhc3luYyByZWZyZXNoVG9rZW5zKGNoYXJhY3Rlciwgc2NvcGVzKSB7XG5cdFx0Y29uc3QgdG9rZW5zID0gYXdhaXQgcmVmcmVzaCh7IHJlZnJlc2hfdG9rZW46IGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4gfSwgc2NvcGVzKTtcblx0XHRjb25zdCBkZWNvZGVkID0gYXdhaXQgdmFsaWRhdGVUb2tlbih0b2tlbnMuYWNjZXNzX3Rva2VuKTtcblx0XHRpZiAoIWRlY29kZWQpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byB2YWxpZGF0ZSB0b2tlbiBmb3IgY2hhcmFjdGVyICR7Y2hhcmFjdGVyLmV2ZUlEfWApO1xuXHRcdFx0cmV0dXJuIGNoYXJhY3Rlcjtcblx0XHR9XG5cdFx0Y2hhcmFjdGVyLmFjY2Vzc1Rva2VuID0gdG9rZW5zLmFjY2Vzc190b2tlbjtcblx0XHRjaGFyYWN0ZXIuZXhwaXJlc0F0ID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIHRva2Vucy5leHBpcmVzX2luICogMWUzKTtcblx0XHRjaGFyYWN0ZXIucmVmcmVzaFRva2VuID0gdG9rZW5zLnJlZnJlc2hfdG9rZW47XG5cdFx0dGhpcy5zYXZlKGNoYXJhY3Rlcik7XG5cdFx0cmV0dXJuIGNoYXJhY3Rlcjtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIgfTsiLAogICAgImltcG9ydCB7IGNoYXJhY3RlcnMsIHVzZXJzIH0gZnJvbSBcIi4uL3NjaGVtYS5qc1wiO1xuaW1wb3J0IHsgQ2hhcmFjdGVySGVscGVyIH0gZnJvbSBcIi4vY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBkYiB9IGZyb20gXCIuLi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZXEsIHNxbCB9IGZyb20gXCJkcml6emxlLW9ybVwiO1xuXG4vLyNyZWdpb24gc3JjL2RiL21vZGVscy91c2VyLm1vZGVsLnRzXG52YXIgVXNlckhlbHBlciA9IGNsYXNzIHtcblx0c3RhdGljIGZpbmQoaWQpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3Qoe1xuXHRcdFx0aWQ6IHVzZXJzLmlkLFxuXHRcdFx0ZGlzY29yZElEOiB1c2Vycy5kaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IHVzZXJzLmNyZWF0ZWRBdCxcblx0XHRcdHVwZGF0ZWRBdDogdXNlcnMudXBkYXRlZEF0LFxuXHRcdFx0bWFpbkNoYXJhY3RlcklEOiB1c2Vycy5tYWluQ2hhcmFjdGVyLFxuXHRcdFx0Y2hhcmFjdGVySURzU3RyaW5nOiBzcWxganNvbl9ncm91cF9hcnJheShjaGFyYWN0ZXJzLmlkKWBcblx0XHR9KS5mcm9tKHVzZXJzKS53aGVyZShlcSh1c2Vycy5pZCwgaWQpKS5sZWZ0Sm9pbihjaGFyYWN0ZXJzLCBlcSh1c2Vycy5pZCwgY2hhcmFjdGVycy51c2VySUQpKS5nZXQoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGcm9tUXVlcnkocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgZmluZEJ5RGlzY29yZElkKGlkKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KHtcblx0XHRcdGlkOiB1c2Vycy5pZCxcblx0XHRcdGRpc2NvcmRJRDogdXNlcnMuZGlzY29yZElELFxuXHRcdFx0Y3JlYXRlZEF0OiB1c2Vycy5jcmVhdGVkQXQsXG5cdFx0XHR1cGRhdGVkQXQ6IHVzZXJzLnVwZGF0ZWRBdCxcblx0XHRcdG1haW5DaGFyYWN0ZXJJRDogdXNlcnMubWFpbkNoYXJhY3Rlcixcblx0XHRcdGNoYXJhY3RlcklEc1N0cmluZzogc3FsYGpzb25fZ3JvdXBfYXJyYXkoY2hhcmFjdGVycy5pZClgXG5cdFx0fSkuZnJvbSh1c2Vycykud2hlcmUoZXEodXNlcnMuZGlzY29yZElELCBpZCkpLmxlZnRKb2luKGNoYXJhY3RlcnMsIGVxKHVzZXJzLmlkLCBjaGFyYWN0ZXJzLnVzZXJJRCkpLmdldCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUZyb21RdWVyeShyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBmaW5kQWxsKCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCh7XG5cdFx0XHRpZDogdXNlcnMuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHVzZXJzLmRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogdXNlcnMuY3JlYXRlZEF0LFxuXHRcdFx0dXBkYXRlZEF0OiB1c2Vycy51cGRhdGVkQXQsXG5cdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHVzZXJzLm1haW5DaGFyYWN0ZXIsXG5cdFx0XHRjaGFyYWN0ZXJJRHNTdHJpbmc6IHNxbGBqc29uX2dyb3VwX2FycmF5KGNoYXJhY3RlcnMuaWQpYFxuXHRcdH0pLmZyb20odXNlcnMpLmxlZnRKb2luKGNoYXJhY3RlcnMsIGVxKHVzZXJzLmlkLCBjaGFyYWN0ZXJzLnVzZXJJRCkpLmFsbCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUZyb21RdWVyeShyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlDaGFyYWN0ZXJJZChpZCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCh7XG5cdFx0XHRpZDogdXNlcnMuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHVzZXJzLmRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogdXNlcnMuY3JlYXRlZEF0LFxuXHRcdFx0dXBkYXRlZEF0OiB1c2Vycy51cGRhdGVkQXQsXG5cdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHVzZXJzLm1haW5DaGFyYWN0ZXIsXG5cdFx0XHRjaGFyYWN0ZXJJRHNTdHJpbmc6IHNxbGBqc29uX2dyb3VwX2FycmF5KGNoYXJhY3RlcnMuaWQpYFxuXHRcdH0pLmZyb20odXNlcnMpLmxlZnRKb2luKGNoYXJhY3RlcnMsIGVxKHVzZXJzLmlkLCBjaGFyYWN0ZXJzLnVzZXJJRCkpLndoZXJlKGVxKGNoYXJhY3RlcnMuaWQsIGlkKSkuYWxsKCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRnJvbVF1ZXJ5KHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGZpbmRCeUNoYXJhY3Rlck5hbWUobmFtZSkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCh7XG5cdFx0XHRpZDogdXNlcnMuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHVzZXJzLmRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogdXNlcnMuY3JlYXRlZEF0LFxuXHRcdFx0dXBkYXRlZEF0OiB1c2Vycy51cGRhdGVkQXQsXG5cdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHVzZXJzLm1haW5DaGFyYWN0ZXIsXG5cdFx0XHRjaGFyYWN0ZXJJRHNTdHJpbmc6IHNxbGBqc29uX2dyb3VwX2FycmF5KGNoYXJhY3RlcnMuaWQpYFxuXHRcdH0pLmZyb20odXNlcnMpLmxlZnRKb2luKGNoYXJhY3RlcnMsIGVxKHVzZXJzLmlkLCBjaGFyYWN0ZXJzLnVzZXJJRCkpLndoZXJlKGVxKGNoYXJhY3RlcnMubmFtZSwgbmFtZSkpLmFsbCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUZyb21RdWVyeShyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBjcmVhdGVGcm9tUXVlcnkocXVlcnkpIHtcblx0XHRpZiAoIXF1ZXJ5KSByZXR1cm4gW107XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkocXVlcnkpKSByZXR1cm4gcXVlcnkubWFwKCh1c2VyKSA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRpZDogdXNlci5pZCxcblx0XHRcdFx0ZGlzY29yZElEOiB1c2VyLmRpc2NvcmRJRCxcblx0XHRcdFx0Y3JlYXRlZEF0OiBuZXcgRGF0ZSh1c2VyLmNyZWF0ZWRBdCksXG5cdFx0XHRcdHVwZGF0ZWRBdDogbmV3IERhdGUodXNlci51cGRhdGVkQXQpLFxuXHRcdFx0XHRjaGFyYWN0ZXJJRHM6IHVzZXIuY2hhcmFjdGVySURzU3RyaW5nID8gSlNPTi5wYXJzZSh1c2VyLmNoYXJhY3RlcklEc1N0cmluZyA/PyBcIltdXCIpLm1hcCgocykgPT4gTnVtYmVyKHMpKS5zb3J0KCkgOiBbXSxcblx0XHRcdFx0bWFpbkNoYXJhY3RlcklEOiB1c2VyLm1haW5DaGFyYWN0ZXJJRFxuXHRcdFx0fTtcblx0XHR9KTtcblx0XHRlbHNlIHJldHVybiB7XG5cdFx0XHRpZDogcXVlcnkuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHF1ZXJ5LmRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogbmV3IERhdGUocXVlcnkuY3JlYXRlZEF0KSxcblx0XHRcdHVwZGF0ZWRBdDogbmV3IERhdGUocXVlcnkudXBkYXRlZEF0KSxcblx0XHRcdGNoYXJhY3RlcklEczogcXVlcnkuY2hhcmFjdGVySURzU3RyaW5nID8gSlNPTi5wYXJzZShxdWVyeS5jaGFyYWN0ZXJJRHNTdHJpbmcgPz8gXCJbXVwiKS5tYXAoKHMpID0+IE51bWJlcihzKSkuc29ydCgpIDogW10sXG5cdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHF1ZXJ5Lm1haW5DaGFyYWN0ZXJJRFxuXHRcdH07XG5cdH1cblx0c3RhdGljIGNyZWF0ZShkaXNjb3JkSUQpIHtcblx0XHR0aGlzLnNhdmUoe1xuXHRcdFx0ZGlzY29yZElELFxuXHRcdFx0Y3JlYXRlZEF0OiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSxcblx0XHRcdHVwZGF0ZWRBdDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKClcblx0XHR9KTtcblx0XHRyZXR1cm4gdGhpcy5maW5kQnlEaXNjb3JkSWQoZGlzY29yZElEKTtcblx0fVxuXHRzdGF0aWMgc2F2ZSh1c2VyKSB7XG5cdFx0ZGIuaW5zZXJ0KHVzZXJzKS52YWx1ZXMoe1xuXHRcdFx0aWQ6IHVzZXIuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHVzZXIuZGlzY29yZElELFxuXHRcdFx0bWFpbkNoYXJhY3RlcjogdXNlci5tYWluQ2hhcmFjdGVySUQsXG5cdFx0XHRjcmVhdGVkQXQ6IHVzZXIuY3JlYXRlZEF0LmdldFRpbWUoKSxcblx0XHRcdHVwZGF0ZWRBdDogdXNlci51cGRhdGVkQXQuZ2V0VGltZSgpXG5cdFx0fSkub25Db25mbGljdERvVXBkYXRlKHtcblx0XHRcdHRhcmdldDogdXNlcnMuaWQsXG5cdFx0XHRzZXQ6IHtcblx0XHRcdFx0ZGlzY29yZElEOiB1c2VyLmRpc2NvcmRJRCxcblx0XHRcdFx0bWFpbkNoYXJhY3RlcjogdXNlci5tYWluQ2hhcmFjdGVySUQsXG5cdFx0XHRcdHVwZGF0ZWRBdDogdXNlci51cGRhdGVkQXQuZ2V0VGltZSgpXG5cdFx0XHR9XG5cdFx0fSkucnVuKCk7XG5cdFx0cmV0dXJuIHVzZXI7XG5cdH1cblx0c3RhdGljIGRlbGV0ZSh1c2VyKSB7XG5cdFx0ZGIuZGVsZXRlKHVzZXJzKS53aGVyZShlcSh1c2Vycy5pZCwgdXNlci5pZCkpLnJ1bigpO1xuXHR9XG5cdHN0YXRpYyBnZXRDaGFyYWN0ZXIodXNlciwgaW5kZXgpIHtcblx0XHRpZiAoIXVzZXIuY2hhcmFjdGVySURzKSByZXR1cm4gdm9pZCAwO1xuXHRcdGlmIChpbmRleCA+PSB1c2VyLmNoYXJhY3RlcklEcy5sZW5ndGgpIHJldHVybiB2b2lkIDA7XG5cdFx0cmV0dXJuIENoYXJhY3RlckhlbHBlci5maW5kKHVzZXIuY2hhcmFjdGVySURzW2luZGV4XSk7XG5cdH1cbn07XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgVXNlckhlbHBlciB9OyIsCiAgICAiaW1wb3J0IHsgcmVzdW1lQ29tbWFuZHMgfSBmcm9tIFwiLi4vc2NoZW1hLmpzXCI7XG5pbXBvcnQgeyBkYiB9IGZyb20gXCIuLi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZXEgfSBmcm9tIFwiZHJpenpsZS1vcm1cIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9tb2RlbHMvcmVzdW1lLWNvbW1hbmQubW9kZWwudHNcbnZhciBSZXN1bWVDb21tYW5kID0gY2xhc3MgUmVzdW1lQ29tbWFuZCB7XG5cdGlkO1xuXHRjb21tYW5kO1xuXHRwYXJhbXM7XG5cdGNvbnRleHQ7XG5cdGNyZWF0ZWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTtcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5jcmVhdGVkID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7XG5cdH1cblx0c3RhdGljIGZpbmQobWVzc2FnZUlkKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KCkuZnJvbShyZXN1bWVDb21tYW5kcykud2hlcmUoZXEocmVzdW1lQ29tbWFuZHMuaWQsIG1lc3NhZ2VJZCkpLmdldCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUZyb21RdWVyeShyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBjcmVhdGUobWVzc2FnZUlkLCBjb21tYW5kLCBwYXJhbXMgPSB7fSwgY29udGV4dCA9IHt9KSB7XG5cdFx0Y29uc3QgcmVzdW1lID0gbmV3IFJlc3VtZUNvbW1hbmQoKTtcblx0XHRyZXN1bWUuaWQgPSBtZXNzYWdlSWQ7XG5cdFx0cmVzdW1lLmNvbW1hbmQgPSBjb21tYW5kO1xuXHRcdHJlc3VtZS5wYXJhbXMgPSBKU09OLnN0cmluZ2lmeShwYXJhbXMpO1xuXHRcdHJlc3VtZS5jb250ZXh0ID0gSlNPTi5zdHJpbmdpZnkoY29udGV4dCk7XG5cdFx0cmV0dXJuIHJlc3VtZTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlRnJvbVF1ZXJ5KHF1ZXJ5KSB7XG5cdFx0aWYgKCFxdWVyeSkgcmV0dXJuIG51bGw7XG5cdFx0Y29uc3QgcmVzdW1lID0gbmV3IFJlc3VtZUNvbW1hbmQoKTtcblx0XHRyZXN1bWUuaWQgPSBxdWVyeS5pZDtcblx0XHRyZXN1bWUuY29tbWFuZCA9IHF1ZXJ5LmNvbW1hbmQ7XG5cdFx0cmVzdW1lLnBhcmFtcyA9IHF1ZXJ5LnBhcmFtcztcblx0XHRyZXN1bWUuY29udGV4dCA9IHF1ZXJ5LmNvbnRleHQ7XG5cdFx0cmVzdW1lLmNyZWF0ZWQgPSBxdWVyeS5jcmVhdGVkO1xuXHRcdHJldHVybiByZXN1bWU7XG5cdH1cblx0c2F2ZSgpIHtcblx0XHRkYi5pbnNlcnQocmVzdW1lQ29tbWFuZHMpLnZhbHVlcyh7XG5cdFx0XHRpZDogdGhpcy5pZCxcblx0XHRcdGNvbW1hbmQ6IHRoaXMuY29tbWFuZCxcblx0XHRcdHBhcmFtczogdGhpcy5wYXJhbXMsXG5cdFx0XHRjb250ZXh0OiB0aGlzLmNvbnRleHQsXG5cdFx0XHRjcmVhdGVkQXQ6IHRoaXMuY3JlYXRlZC5nZXRUaW1lKClcblx0XHR9KS5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuXHRcdFx0dGFyZ2V0OiByZXN1bWVDb21tYW5kcy5pZCxcblx0XHRcdHNldDoge1xuXHRcdFx0XHRjb21tYW5kOiB0aGlzLmNvbW1hbmQsXG5cdFx0XHRcdHBhcmFtczogdGhpcy5wYXJhbXMsXG5cdFx0XHRcdGNvbnRleHQ6IHRoaXMuY29udGV4dFxuXHRcdFx0fVxuXHRcdH0pLnJ1bigpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdGRlbGV0ZSgpIHtcblx0XHRkYi5kZWxldGUocmVzdW1lQ29tbWFuZHMpLndoZXJlKGVxKHJlc3VtZUNvbW1hbmRzLmlkLCB0aGlzLmlkKSkucnVuKCk7XG5cdH1cblx0c3RhdGljIGRlbGV0ZShtZXNzYWdlSWQpIHtcblx0XHRkYi5kZWxldGUocmVzdW1lQ29tbWFuZHMpLndoZXJlKGVxKHJlc3VtZUNvbW1hbmRzLmlkLCBtZXNzYWdlSWQpKS5ydW4oKTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBSZXN1bWVDb21tYW5kIH07IiwKICAgICJpbXBvcnQgeyBfX2V4cG9ydCB9IGZyb20gXCIuLi8uLi9fdmlydHVhbC9yb2xsZG93bl9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIgfSBmcm9tIFwiLi9jaGFyYWN0ZXIubW9kZWwuanNcIjtcbmltcG9ydCB7IFVzZXJIZWxwZXIgfSBmcm9tIFwiLi91c2VyLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBSZXN1bWVDb21tYW5kIH0gZnJvbSBcIi4vcmVzdW1lLWNvbW1hbmQubW9kZWwuanNcIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9tb2RlbHMvaW5kZXgudHNcbnZhciBtb2RlbHNfZXhwb3J0cyA9IHt9O1xuX19leHBvcnQobW9kZWxzX2V4cG9ydHMsIHtcblx0Q2hhcmFjdGVySGVscGVyOiAoKSA9PiBDaGFyYWN0ZXJIZWxwZXIsXG5cdFJlc3VtZUNvbW1hbmQ6ICgpID0+IFJlc3VtZUNvbW1hbmQsXG5cdFVzZXJIZWxwZXI6ICgpID0+IFVzZXJIZWxwZXJcbn0pO1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IG1vZGVsc19leHBvcnRzIH07IiwKICAgICJpbXBvcnQgeyBEYXRhYmFzZSB9IGZyb20gXCJidW46c3FsaXRlXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgRGVmYXVsdExvZ2dlciB9IGZyb20gXCIuLi9sb2dnZXIuanNcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZVRhYmxlUmVsYXRpb25zSGVscGVycyxcbiAgZXh0cmFjdFRhYmxlc1JlbGF0aW9uYWxDb25maWdcbn0gZnJvbSBcIi4uL3JlbGF0aW9ucy5qc1wiO1xuaW1wb3J0IHsgQmFzZVNRTGl0ZURhdGFiYXNlIH0gZnJvbSBcIi4uL3NxbGl0ZS1jb3JlL2RiLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVTeW5jRGlhbGVjdCB9IGZyb20gXCIuLi9zcWxpdGUtY29yZS9kaWFsZWN0LmpzXCI7XG5pbXBvcnQgeyBpc0NvbmZpZyB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQnVuU2Vzc2lvbiB9IGZyb20gXCIuL3Nlc3Npb24uanNcIjtcbmNsYXNzIEJ1blNRTGl0ZURhdGFiYXNlIGV4dGVuZHMgQmFzZVNRTGl0ZURhdGFiYXNlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQnVuU1FMaXRlRGF0YWJhc2VcIjtcbn1cbmZ1bmN0aW9uIGNvbnN0cnVjdChjbGllbnQsIGNvbmZpZyA9IHt9KSB7XG4gIGNvbnN0IGRpYWxlY3QgPSBuZXcgU1FMaXRlU3luY0RpYWxlY3QoeyBjYXNpbmc6IGNvbmZpZy5jYXNpbmcgfSk7XG4gIGxldCBsb2dnZXI7XG4gIGlmIChjb25maWcubG9nZ2VyID09PSB0cnVlKSB7XG4gICAgbG9nZ2VyID0gbmV3IERlZmF1bHRMb2dnZXIoKTtcbiAgfSBlbHNlIGlmIChjb25maWcubG9nZ2VyICE9PSBmYWxzZSkge1xuICAgIGxvZ2dlciA9IGNvbmZpZy5sb2dnZXI7XG4gIH1cbiAgbGV0IHNjaGVtYTtcbiAgaWYgKGNvbmZpZy5zY2hlbWEpIHtcbiAgICBjb25zdCB0YWJsZXNDb25maWcgPSBleHRyYWN0VGFibGVzUmVsYXRpb25hbENvbmZpZyhcbiAgICAgIGNvbmZpZy5zY2hlbWEsXG4gICAgICBjcmVhdGVUYWJsZVJlbGF0aW9uc0hlbHBlcnNcbiAgICApO1xuICAgIHNjaGVtYSA9IHtcbiAgICAgIGZ1bGxTY2hlbWE6IGNvbmZpZy5zY2hlbWEsXG4gICAgICBzY2hlbWE6IHRhYmxlc0NvbmZpZy50YWJsZXMsXG4gICAgICB0YWJsZU5hbWVzTWFwOiB0YWJsZXNDb25maWcudGFibGVOYW1lc01hcFxuICAgIH07XG4gIH1cbiAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBTUUxpdGVCdW5TZXNzaW9uKGNsaWVudCwgZGlhbGVjdCwgc2NoZW1hLCB7IGxvZ2dlciB9KTtcbiAgY29uc3QgZGIgPSBuZXcgQnVuU1FMaXRlRGF0YWJhc2UoXCJzeW5jXCIsIGRpYWxlY3QsIHNlc3Npb24sIHNjaGVtYSk7XG4gIGRiLiRjbGllbnQgPSBjbGllbnQ7XG4gIHJldHVybiBkYjtcbn1cbmZ1bmN0aW9uIGRyaXp6bGUoLi4ucGFyYW1zKSB7XG4gIGlmIChwYXJhbXNbMF0gPT09IHZvaWQgMCB8fCB0eXBlb2YgcGFyYW1zWzBdID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBwYXJhbXNbMF0gPT09IHZvaWQgMCA/IG5ldyBEYXRhYmFzZSgpIDogbmV3IERhdGFiYXNlKHBhcmFtc1swXSk7XG4gICAgcmV0dXJuIGNvbnN0cnVjdChpbnN0YW5jZSwgcGFyYW1zWzFdKTtcbiAgfVxuICBpZiAoaXNDb25maWcocGFyYW1zWzBdKSkge1xuICAgIGNvbnN0IHsgY29ubmVjdGlvbiwgY2xpZW50LCAuLi5kcml6emxlQ29uZmlnIH0gPSBwYXJhbXNbMF07XG4gICAgaWYgKGNsaWVudCkgcmV0dXJuIGNvbnN0cnVjdChjbGllbnQsIGRyaXp6bGVDb25maWcpO1xuICAgIGlmICh0eXBlb2YgY29ubmVjdGlvbiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgeyBzb3VyY2UsIC4uLm9wdHMgfSA9IGNvbm5lY3Rpb247XG4gICAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LnZhbHVlcyhvcHRzKS5maWx0ZXIoKHYpID0+IHYgIT09IHZvaWQgMCkubGVuZ3RoID8gb3B0cyA6IHZvaWQgMDtcbiAgICAgIGNvbnN0IGluc3RhbmNlMiA9IG5ldyBEYXRhYmFzZShzb3VyY2UsIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIGNvbnN0cnVjdChpbnN0YW5jZTIsIGRyaXp6bGVDb25maWcpO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBEYXRhYmFzZShjb25uZWN0aW9uKTtcbiAgICByZXR1cm4gY29uc3RydWN0KGluc3RhbmNlLCBkcml6emxlQ29uZmlnKTtcbiAgfVxuICByZXR1cm4gY29uc3RydWN0KHBhcmFtc1swXSwgcGFyYW1zWzFdKTtcbn1cbigoZHJpenpsZTIpID0+IHtcbiAgZnVuY3Rpb24gbW9jayhjb25maWcpIHtcbiAgICByZXR1cm4gY29uc3RydWN0KHt9LCBjb25maWcpO1xuICB9XG4gIGRyaXp6bGUyLm1vY2sgPSBtb2NrO1xufSkoZHJpenpsZSB8fCAoZHJpenpsZSA9IHt9KSk7XG5leHBvcnQge1xuICBCdW5TUUxpdGVEYXRhYmFzZSxcbiAgZHJpenpsZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRyaXZlci5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBOb29wTG9nZ2VyIH0gZnJvbSBcIi4uL2xvZ2dlci5qc1wiO1xuaW1wb3J0IHsgZmlsbFBsYWNlaG9sZGVycywgc3FsIH0gZnJvbSBcIi4uL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVRyYW5zYWN0aW9uIH0gZnJvbSBcIi4uL3NxbGl0ZS1jb3JlL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVQcmVwYXJlZFF1ZXJ5IGFzIFByZXBhcmVkUXVlcnlCYXNlLCBTUUxpdGVTZXNzaW9uIH0gZnJvbSBcIi4uL3NxbGl0ZS1jb3JlL3Nlc3Npb24uanNcIjtcbmltcG9ydCB7IG1hcFJlc3VsdFJvdyB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuY2xhc3MgU1FMaXRlQnVuU2Vzc2lvbiBleHRlbmRzIFNRTGl0ZVNlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihjbGllbnQsIGRpYWxlY3QsIHNjaGVtYSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoZGlhbGVjdCk7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zLmxvZ2dlciA/PyBuZXcgTm9vcExvZ2dlcigpO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJ1blNlc3Npb25cIjtcbiAgbG9nZ2VyO1xuICBleGVjKHF1ZXJ5KSB7XG4gICAgdGhpcy5jbGllbnQuZXhlYyhxdWVyeSk7XG4gIH1cbiAgcHJlcGFyZVF1ZXJ5KHF1ZXJ5LCBmaWVsZHMsIGV4ZWN1dGVNZXRob2QsIGlzUmVzcG9uc2VJbkFycmF5TW9kZSwgY3VzdG9tUmVzdWx0TWFwcGVyKSB7XG4gICAgY29uc3Qgc3RtdCA9IHRoaXMuY2xpZW50LnByZXBhcmUocXVlcnkuc3FsKTtcbiAgICByZXR1cm4gbmV3IFByZXBhcmVkUXVlcnkoXG4gICAgICBzdG10LFxuICAgICAgcXVlcnksXG4gICAgICB0aGlzLmxvZ2dlcixcbiAgICAgIGZpZWxkcyxcbiAgICAgIGV4ZWN1dGVNZXRob2QsXG4gICAgICBpc1Jlc3BvbnNlSW5BcnJheU1vZGUsXG4gICAgICBjdXN0b21SZXN1bHRNYXBwZXJcbiAgICApO1xuICB9XG4gIHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uLCBjb25maWcgPSB7fSkge1xuICAgIGNvbnN0IHR4ID0gbmV3IFNRTGl0ZUJ1blRyYW5zYWN0aW9uKFwic3luY1wiLCB0aGlzLmRpYWxlY3QsIHRoaXMsIHRoaXMuc2NoZW1hKTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGNvbnN0IG5hdGl2ZVR4ID0gdGhpcy5jbGllbnQudHJhbnNhY3Rpb24oKCkgPT4ge1xuICAgICAgcmVzdWx0ID0gdHJhbnNhY3Rpb24odHgpO1xuICAgIH0pO1xuICAgIG5hdGl2ZVR4W2NvbmZpZy5iZWhhdmlvciA/PyBcImRlZmVycmVkXCJdKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQnVuVHJhbnNhY3Rpb24gZXh0ZW5kcyBTUUxpdGVUcmFuc2FjdGlvbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJ1blRyYW5zYWN0aW9uXCI7XG4gIHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgY29uc3Qgc2F2ZXBvaW50TmFtZSA9IGBzcCR7dGhpcy5uZXN0ZWRJbmRleH1gO1xuICAgIGNvbnN0IHR4ID0gbmV3IFNRTGl0ZUJ1blRyYW5zYWN0aW9uKFwic3luY1wiLCB0aGlzLmRpYWxlY3QsIHRoaXMuc2Vzc2lvbiwgdGhpcy5zY2hlbWEsIHRoaXMubmVzdGVkSW5kZXggKyAxKTtcbiAgICB0aGlzLnNlc3Npb24ucnVuKHNxbC5yYXcoYHNhdmVwb2ludCAke3NhdmVwb2ludE5hbWV9YCkpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0cmFuc2FjdGlvbih0eCk7XG4gICAgICB0aGlzLnNlc3Npb24ucnVuKHNxbC5yYXcoYHJlbGVhc2Ugc2F2ZXBvaW50ICR7c2F2ZXBvaW50TmFtZX1gKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5zZXNzaW9uLnJ1bihzcWwucmF3KGByb2xsYmFjayB0byBzYXZlcG9pbnQgJHtzYXZlcG9pbnROYW1lfWApKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIFByZXBhcmVkUXVlcnkgZXh0ZW5kcyBQcmVwYXJlZFF1ZXJ5QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHN0bXQsIHF1ZXJ5LCBsb2dnZXIsIGZpZWxkcywgZXhlY3V0ZU1ldGhvZCwgX2lzUmVzcG9uc2VJbkFycmF5TW9kZSwgY3VzdG9tUmVzdWx0TWFwcGVyKSB7XG4gICAgc3VwZXIoXCJzeW5jXCIsIGV4ZWN1dGVNZXRob2QsIHF1ZXJ5KTtcbiAgICB0aGlzLnN0bXQgPSBzdG10O1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICAgIHRoaXMuZmllbGRzID0gZmllbGRzO1xuICAgIHRoaXMuX2lzUmVzcG9uc2VJbkFycmF5TW9kZSA9IF9pc1Jlc3BvbnNlSW5BcnJheU1vZGU7XG4gICAgdGhpcy5jdXN0b21SZXN1bHRNYXBwZXIgPSBjdXN0b21SZXN1bHRNYXBwZXI7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQnVuUHJlcGFyZWRRdWVyeVwiO1xuICBydW4ocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBmaWxsUGxhY2Vob2xkZXJzKHRoaXMucXVlcnkucGFyYW1zLCBwbGFjZWhvbGRlclZhbHVlcyA/PyB7fSk7XG4gICAgdGhpcy5sb2dnZXIubG9nUXVlcnkodGhpcy5xdWVyeS5zcWwsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXMuc3RtdC5ydW4oLi4ucGFyYW1zKTtcbiAgfVxuICBhbGwocGxhY2Vob2xkZXJWYWx1ZXMpIHtcbiAgICBjb25zdCB7IGZpZWxkcywgcXVlcnksIGxvZ2dlciwgam9pbnNOb3ROdWxsYWJsZU1hcCwgc3RtdCwgY3VzdG9tUmVzdWx0TWFwcGVyIH0gPSB0aGlzO1xuICAgIGlmICghZmllbGRzICYmICFjdXN0b21SZXN1bHRNYXBwZXIpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IGZpbGxQbGFjZWhvbGRlcnMocXVlcnkucGFyYW1zLCBwbGFjZWhvbGRlclZhbHVlcyA/PyB7fSk7XG4gICAgICBsb2dnZXIubG9nUXVlcnkocXVlcnkuc3FsLCBwYXJhbXMpO1xuICAgICAgcmV0dXJuIHN0bXQuYWxsKC4uLnBhcmFtcyk7XG4gICAgfVxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcyk7XG4gICAgaWYgKGN1c3RvbVJlc3VsdE1hcHBlcikge1xuICAgICAgcmV0dXJuIGN1c3RvbVJlc3VsdE1hcHBlcihyb3dzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IG1hcFJlc3VsdFJvdyhmaWVsZHMsIHJvdywgam9pbnNOb3ROdWxsYWJsZU1hcCkpO1xuICB9XG4gIGdldChwbGFjZWhvbGRlclZhbHVlcykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGZpbGxQbGFjZWhvbGRlcnModGhpcy5xdWVyeS5wYXJhbXMsIHBsYWNlaG9sZGVyVmFsdWVzID8/IHt9KTtcbiAgICB0aGlzLmxvZ2dlci5sb2dRdWVyeSh0aGlzLnF1ZXJ5LnNxbCwgcGFyYW1zKTtcbiAgICBjb25zdCByb3cgPSB0aGlzLnN0bXQudmFsdWVzKC4uLnBhcmFtcylbMF07XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICAgIGNvbnN0IHsgZmllbGRzLCBqb2luc05vdE51bGxhYmxlTWFwLCBjdXN0b21SZXN1bHRNYXBwZXIgfSA9IHRoaXM7XG4gICAgaWYgKCFmaWVsZHMgJiYgIWN1c3RvbVJlc3VsdE1hcHBlcikge1xuICAgICAgcmV0dXJuIHJvdztcbiAgICB9XG4gICAgaWYgKGN1c3RvbVJlc3VsdE1hcHBlcikge1xuICAgICAgcmV0dXJuIGN1c3RvbVJlc3VsdE1hcHBlcihbcm93XSk7XG4gICAgfVxuICAgIHJldHVybiBtYXBSZXN1bHRSb3coZmllbGRzLCByb3csIGpvaW5zTm90TnVsbGFibGVNYXApO1xuICB9XG4gIHZhbHVlcyhwbGFjZWhvbGRlclZhbHVlcykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGZpbGxQbGFjZWhvbGRlcnModGhpcy5xdWVyeS5wYXJhbXMsIHBsYWNlaG9sZGVyVmFsdWVzID8/IHt9KTtcbiAgICB0aGlzLmxvZ2dlci5sb2dRdWVyeSh0aGlzLnF1ZXJ5LnNxbCwgcGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcy5zdG10LnZhbHVlcyguLi5wYXJhbXMpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgaXNSZXNwb25zZUluQXJyYXlNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Jlc3BvbnNlSW5BcnJheU1vZGU7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFByZXBhcmVkUXVlcnksXG4gIFNRTGl0ZUJ1blNlc3Npb24sXG4gIFNRTGl0ZUJ1blRyYW5zYWN0aW9uXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2Vzc2lvbi5qcy5tYXAiLAogICAgImltcG9ydCB7IGNoYXJhY3RlcnMsIG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzLCBtaW5pbmdGbGVldHMsIHJlc3VtZUNvbW1hbmRzLCBzY2hlbWFfZXhwb3J0cywgdXNlcnMgfSBmcm9tIFwiLi9zY2hlbWEuanNcIjtcbmltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuL21vZGVscy9jaGFyYWN0ZXIubW9kZWwuanNcIjtcbmltcG9ydCB7IFVzZXJIZWxwZXIgfSBmcm9tIFwiLi9tb2RlbHMvdXNlci5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgUmVzdW1lQ29tbWFuZCB9IGZyb20gXCIuL21vZGVscy9yZXN1bWUtY29tbWFuZC5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgbW9kZWxzX2V4cG9ydHMgfSBmcm9tIFwiLi9tb2RlbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IGRyaXp6bGUgfSBmcm9tIFwiZHJpenpsZS1vcm0vYnVuLXNxbGl0ZVwiO1xuaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tIFwiYnVuOnNxbGl0ZVwiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9pbmRleC50c1xuY29uc3QgREJfUEFUSCA9IHByb2Nlc3MuZW52LkFVVEhfREJfUEFUSCB8fCBqb2luKHByb2Nlc3MuY3dkKCksIFwiLi4vLi4vZGIva2l0dGVuLmRiXCIpO1xuY29uc29sZS5sb2coXCJVc2luZyBEQl9QQVRIOlwiLCBEQl9QQVRIKTtcbmNvbnN0IHNxbGl0ZSA9IG5ldyBEYXRhYmFzZShEQl9QQVRIKTtcbmNvbnN0IGRiID0gZHJpenpsZShzcWxpdGUsIHsgc2NoZW1hOiB7XG5cdHVzZXJzLFxuXHRjaGFyYWN0ZXJzLFxuXHRyZXN1bWVDb21tYW5kcyxcblx0bWluaW5nRmxlZXRzLFxuXHRtaW5pbmdGbGVldFBhcnRpY2lwYW50c1xufSB9KTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIsIERCX1BBVEgsIFJlc3VtZUNvbW1hbmQsIFVzZXJIZWxwZXIsIGRiLCBtb2RlbHNfZXhwb3J0cyBhcyBtb2RlbHMsIHNjaGVtYV9leHBvcnRzIGFzIHNjaGVtYSB9OyIsCiAgICAiaW1wb3J0IHsgand0RGVjb2RlIH0gZnJvbSBcImp3dC1kZWNvZGVcIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvc2NvcGVzLnRzXG5jb25zdCBFVkVfSldLU19VUkwgPSBcImh0dHBzOi8vbG9naW4uZXZlb25saW5lLmNvbS9vYXV0aC9qd2tzXCI7XG5jb25zdCBFVkVfSVNTVUVSID0gXCJsb2dpbi5ldmVvbmxpbmUuY29tXCI7XG5jb25zdCBFVkVfQVVESUVOQ0UgPSBcImV2ZW9ubGluZVwiO1xuY29uc3QgRVNJX0xBVEVTVF9VUkwgPSBcImh0dHBzOi8vZXNpLmV2ZXRlY2gubmV0L2xhdGVzdFwiO1xuY29uc3QgREFUQV9TT1VSQ0UgPSBcInRyYW5xdWlsaXR5XCI7XG5mdW5jdGlvbiBqb2luU2NvcGVzKC4uLnNjb3Blcykge1xuXHRyZXR1cm4gc2NvcGVzLmpvaW4oXCIgXCIpO1xufVxubGV0IFNDT1BFUyA9IC8qIEBfX1BVUkVfXyAqLyBmdW5jdGlvbihTQ09QRVMkMSkge1xuXHRTQ09QRVMkMVtcIlBVQkxJQ19EQVRBXCJdID0gXCJwdWJsaWNEYXRhXCI7XG5cdFNDT1BFUyQxW1wiQ0FMRU5EQVJfUkVTUE9ORF9DQUxFTkRBUl9FVkVOVFNcIl0gPSBcImVzaS1jYWxlbmRhci5yZXNwb25kX2NhbGVuZGFyX2V2ZW50cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNBTEVOREFSX1JFQURfQ0FMRU5EQVJfRVZFTlRTXCJdID0gXCJlc2ktY2FsZW5kYXIucmVhZF9jYWxlbmRhcl9ldmVudHMudjFcIjtcblx0U0NPUEVTJDFbXCJMT0NBVElPTl9SRUFEX0xPQ0FUSU9OXCJdID0gXCJlc2ktbG9jYXRpb24ucmVhZF9sb2NhdGlvbi52MVwiO1xuXHRTQ09QRVMkMVtcIkxPQ0FUSU9OX1JFQURfU0hJUF9UWVBFXCJdID0gXCJlc2ktbG9jYXRpb24ucmVhZF9zaGlwX3R5cGUudjFcIjtcblx0U0NPUEVTJDFbXCJNQUlMX09SR0FOSVpFX01BSUxcIl0gPSBcImVzaS1tYWlsLm9yZ2FuaXplX21haWwudjFcIjtcblx0U0NPUEVTJDFbXCJNQUlMX1JFQURfTUFJTFwiXSA9IFwiZXNpLW1haWwucmVhZF9tYWlsLnYxXCI7XG5cdFNDT1BFUyQxW1wiTUFJTF9TRU5EX01BSUxcIl0gPSBcImVzaS1tYWlsLnNlbmRfbWFpbC52MVwiO1xuXHRTQ09QRVMkMVtcIlNLSUxMU19SRUFEX1NLSUxMU1wiXSA9IFwiZXNpLXNraWxscy5yZWFkX3NraWxscy52MVwiO1xuXHRTQ09QRVMkMVtcIlNLSUxMU19SRUFEX1NLSUxMUVVFVUVcIl0gPSBcImVzaS1za2lsbHMucmVhZF9za2lsbHF1ZXVlLnYxXCI7XG5cdFNDT1BFUyQxW1wiV0FMTEVUX1JFQURfQ0hBUkFDVEVSX1dBTExFVFwiXSA9IFwiZXNpLXdhbGxldC5yZWFkX2NoYXJhY3Rlcl93YWxsZXQudjFcIjtcblx0U0NPUEVTJDFbXCJXQUxMRVRfUkVBRF9DT1JQT1JBVElPTl9XQUxMRVRcIl0gPSBcImVzaS13YWxsZXQucmVhZF9jb3Jwb3JhdGlvbl93YWxsZXQudjFcIjtcblx0U0NPUEVTJDFbXCJTRUFSQ0hfU0VBUkNIX1NUUlVDVFVSRVNcIl0gPSBcImVzaS1zZWFyY2guc2VhcmNoX3N0cnVjdHVyZXMudjFcIjtcblx0U0NPUEVTJDFbXCJDTE9ORVNfUkVBRF9DTE9ORVNcIl0gPSBcImVzaS1jbG9uZXMucmVhZF9jbG9uZXMudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfQ09OVEFDVFNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfY29udGFjdHMudjFcIjtcblx0U0NPUEVTJDFbXCJVTklWRVJTRV9SRUFEX1NUUlVDVFVSRVNcIl0gPSBcImVzaS11bml2ZXJzZS5yZWFkX3N0cnVjdHVyZXMudjFcIjtcblx0U0NPUEVTJDFbXCJLSUxMTUFJTFNfUkVBRF9LSUxMTUFJTFNcIl0gPSBcImVzaS1raWxsbWFpbHMucmVhZF9raWxsbWFpbHMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9DT1JQT1JBVElPTl9NRU1CRVJTSElQXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfY29ycG9yYXRpb25fbWVtYmVyc2hpcC52MVwiO1xuXHRTQ09QRVMkMVtcIkFTU0VUU19SRUFEX0FTU0VUU1wiXSA9IFwiZXNpLWFzc2V0cy5yZWFkX2Fzc2V0cy52MVwiO1xuXHRTQ09QRVMkMVtcIlBMQU5FVFNfTUFOQUdFX1BMQU5FVFNcIl0gPSBcImVzaS1wbGFuZXRzLm1hbmFnZV9wbGFuZXRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiRkxFRVRTX1JFQURfRkxFRVRcIl0gPSBcImVzaS1mbGVldHMucmVhZF9mbGVldC52MVwiO1xuXHRTQ09QRVMkMVtcIkZMRUVUU19XUklURV9GTEVFVFwiXSA9IFwiZXNpLWZsZWV0cy53cml0ZV9mbGVldC52MVwiO1xuXHRTQ09QRVMkMVtcIlVJX09QRU5fV0lORE9XXCJdID0gXCJlc2ktdWkub3Blbl93aW5kb3cudjFcIjtcblx0U0NPUEVTJDFbXCJVSV9XUklURV9XQVlQT0lOVFwiXSA9IFwiZXNpLXVpLndyaXRlX3dheXBvaW50LnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19XUklURV9DT05UQUNUU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMud3JpdGVfY29udGFjdHMudjFcIjtcblx0U0NPUEVTJDFbXCJGSVRUSU5HU19SRUFEX0ZJVFRJTkdTXCJdID0gXCJlc2ktZml0dGluZ3MucmVhZF9maXR0aW5ncy52MVwiO1xuXHRTQ09QRVMkMVtcIkZJVFRJTkdTX1dSSVRFX0ZJVFRJTkdTXCJdID0gXCJlc2ktZml0dGluZ3Mud3JpdGVfZml0dGluZ3MudjFcIjtcblx0U0NPUEVTJDFbXCJNQVJLRVRTX1NUUlVDVFVSRV9NQVJLRVRTXCJdID0gXCJlc2ktbWFya2V0cy5zdHJ1Y3R1cmVfbWFya2V0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX1NUUlVDVFVSRVNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9zdHJ1Y3R1cmVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0xPWUFMVFlcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfbG95YWx0eS52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9PUFBPUlRVTklUSUVTXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX29wcG9ydHVuaXRpZXMudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfQ0hBVF9DSEFOTkVMU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9jaGF0X2NoYW5uZWxzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX01FREFMU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9tZWRhbHMudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfU1RBTkRJTkdTXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX3N0YW5kaW5ncy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9BR0VOVFNfUkVTRUFSQ0hcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfYWdlbnRzX3Jlc2VhcmNoLnYxXCI7XG5cdFNDT1BFUyQxW1wiSU5EVVNUUllfUkVBRF9DSEFSQUNURVJfSk9CU1wiXSA9IFwiZXNpLWluZHVzdHJ5LnJlYWRfY2hhcmFjdGVyX2pvYnMudjFcIjtcblx0U0NPUEVTJDFbXCJNQVJLRVRTX1JFQURfQ0hBUkFDVEVSX09SREVSU1wiXSA9IFwiZXNpLW1hcmtldHMucmVhZF9jaGFyYWN0ZXJfb3JkZXJzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0JMVUVQUklOVFNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfYmx1ZXByaW50cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNIQVJBQ1RFUlNfUkVBRF9DT1JQT1JBVElPTl9ST0xFU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9jb3Jwb3JhdGlvbl9yb2xlcy52MVwiO1xuXHRTQ09QRVMkMVtcIkxPQ0FUSU9OX1JFQURfT05MSU5FXCJdID0gXCJlc2ktbG9jYXRpb24ucmVhZF9vbmxpbmUudjFcIjtcblx0U0NPUEVTJDFbXCJDT05UUkFDVFNfUkVBRF9DSEFSQUNURVJfQ09OVFJBQ1RTXCJdID0gXCJlc2ktY29udHJhY3RzLnJlYWRfY2hhcmFjdGVyX2NvbnRyYWN0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNMT05FU19SRUFEX0lNUExBTlRTXCJdID0gXCJlc2ktY2xvbmVzLnJlYWRfaW1wbGFudHMudjFcIjtcblx0U0NPUEVTJDFbXCJDSEFSQUNURVJTX1JFQURfRkFUSUdVRVwiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF9mYXRpZ3VlLnYxXCI7XG5cdFNDT1BFUyQxW1wiS0lMTE1BSUxTX1JFQURfQ09SUE9SQVRJT05fS0lMTE1BSUxTXCJdID0gXCJlc2kta2lsbG1haWxzLnJlYWRfY29ycG9yYXRpb25fa2lsbG1haWxzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1RSQUNLX01FTUJFUlNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMudHJhY2tfbWVtYmVycy52MVwiO1xuXHRTQ09QRVMkMVtcIldBTExFVF9SRUFEX0NPUlBPUkFUSU9OX1dBTExFVFNcIl0gPSBcImVzaS13YWxsZXQucmVhZF9jb3Jwb3JhdGlvbl93YWxsZXRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX05PVElGSUNBVElPTlNcIl0gPSBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfbm90aWZpY2F0aW9ucy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX0RJVklTSU9OU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX2RpdmlzaW9ucy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX0NPTlRBQ1RTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfY29udGFjdHMudjFcIjtcblx0U0NPUEVTJDFbXCJBU1NFVFNfUkVBRF9DT1JQT1JBVElPTl9BU1NFVFNcIl0gPSBcImVzaS1hc3NldHMucmVhZF9jb3Jwb3JhdGlvbl9hc3NldHMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9USVRMRVNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF90aXRsZXMudjFcIjtcblx0U0NPUEVTJDFbXCJDT1JQT1JBVElPTlNfUkVBRF9CTFVFUFJJTlRTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfYmx1ZXByaW50cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPTlRSQUNUU19SRUFEX0NPUlBPUkFUSU9OX0NPTlRSQUNUU1wiXSA9IFwiZXNpLWNvbnRyYWN0cy5yZWFkX2NvcnBvcmF0aW9uX2NvbnRyYWN0cy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX1NUQU5ESU5HU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX3N0YW5kaW5ncy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX1NUQVJCQVNFU1wiXSA9IFwiZXNpLWNvcnBvcmF0aW9ucy5yZWFkX3N0YXJiYXNlcy52MVwiO1xuXHRTQ09QRVMkMVtcIklORFVTVFJZX1JFQURfQ09SUE9SQVRJT05fSk9CU1wiXSA9IFwiZXNpLWluZHVzdHJ5LnJlYWRfY29ycG9yYXRpb25fam9icy52MVwiO1xuXHRTQ09QRVMkMVtcIk1BUktFVFNfUkVBRF9DT1JQT1JBVElPTl9PUkRFUlNcIl0gPSBcImVzaS1tYXJrZXRzLnJlYWRfY29ycG9yYXRpb25fb3JkZXJzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfQ09OVEFJTkVSX0xPR1NcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9jb250YWluZXJfbG9ncy52MVwiO1xuXHRTQ09QRVMkMVtcIklORFVTVFJZX1JFQURfQ0hBUkFDVEVSX01JTklOR1wiXSA9IFwiZXNpLWluZHVzdHJ5LnJlYWRfY2hhcmFjdGVyX21pbmluZy52MVwiO1xuXHRTQ09QRVMkMVtcIklORFVTVFJZX1JFQURfQ09SUE9SQVRJT05fTUlOSU5HXCJdID0gXCJlc2ktaW5kdXN0cnkucmVhZF9jb3Jwb3JhdGlvbl9taW5pbmcudjFcIjtcblx0U0NPUEVTJDFbXCJQTEFORVRTX1JFQURfQ1VTVE9NU19PRkZJQ0VTXCJdID0gXCJlc2ktcGxhbmV0cy5yZWFkX2N1c3RvbXNfb2ZmaWNlcy52MVwiO1xuXHRTQ09QRVMkMVtcIkNPUlBPUkFUSU9OU19SRUFEX0ZBQ0lMSVRJRVNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9mYWNpbGl0aWVzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfTUVEQUxTXCJdID0gXCJlc2ktY29ycG9yYXRpb25zLnJlYWRfbWVkYWxzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX1RJVExFU1wiXSA9IFwiZXNpLWNoYXJhY3RlcnMucmVhZF90aXRsZXMudjFcIjtcblx0U0NPUEVTJDFbXCJBTExJQU5DRVNfUkVBRF9DT05UQUNUU1wiXSA9IFwiZXNpLWFsbGlhbmNlcy5yZWFkX2NvbnRhY3RzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ0hBUkFDVEVSU19SRUFEX0ZXX1NUQVRTXCJdID0gXCJlc2ktY2hhcmFjdGVycy5yZWFkX2Z3X3N0YXRzLnYxXCI7XG5cdFNDT1BFUyQxW1wiQ09SUE9SQVRJT05TX1JFQURfRldfU1RBVFNcIl0gPSBcImVzaS1jb3Jwb3JhdGlvbnMucmVhZF9md19zdGF0cy52MVwiO1xuXHRyZXR1cm4gU0NPUEVTJDE7XG59KHt9KTtcbmZ1bmN0aW9uIHRva2VuSGFzU2NvcGVzKGFjY2Vzc190b2tlbiwgLi4uc2NvcGVzKSB7XG5cdGxldCB0b2tlblNjb3BlcyA9IGdldFNjb3Blc0Zyb21Ub2tlbihhY2Nlc3NfdG9rZW4pO1xuXHRyZXR1cm4gc2NvcGVzLmV2ZXJ5KChzY29wZSkgPT4gdG9rZW5TY29wZXMuaW5jbHVkZXMoc2NvcGUpKTtcbn1cbmZ1bmN0aW9uIGdldFNjb3Blc0Zyb21Ub2tlbihhY2Nlc3NfdG9rZW4pIHtcblx0Y29uc3QgZGVjb2RlZCA9IGp3dERlY29kZShhY2Nlc3NfdG9rZW4pO1xuXHRyZXR1cm4gdHlwZW9mIGRlY29kZWQuc2NwID09PSBcInN0cmluZ1wiID8gW2RlY29kZWQuc2NwXSA6IGRlY29kZWQuc2NwO1xufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IERBVEFfU09VUkNFLCBFU0lfTEFURVNUX1VSTCwgRVZFX0FVRElFTkNFLCBFVkVfSVNTVUVSLCBFVkVfSldLU19VUkwsIFNDT1BFUywgZ2V0U2NvcGVzRnJvbVRva2VuLCBqb2luU2NvcGVzLCB0b2tlbkhhc1Njb3BlcyB9OyIsCiAgICAiaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gXCIuL29wdGlvbnMuanNcIjtcbmltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuLi9kYi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgXCIuLi9kYi9tb2RlbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IEVTSV9MQVRFU1RfVVJMIH0gZnJvbSBcIi4vc2NvcGVzLmpzXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZXNpL2ZldGNoLnRzXG5jb25zdCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5mdW5jdGlvbiBjbGVhbkNhY2hlKCkge1xuXHRjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBjYWNoZSkgaWYgKHZhbHVlLmV4cGlyZXMgPCBub3cpIGNhY2hlLmRlbGV0ZShrZXkpO1xufVxuc2V0SW50ZXJ2YWwoY2xlYW5DYWNoZSwgMWUzICogNjAgKiAxNSk7XG5jb25zdCBkZWZhdWx0Q2FjaGVEdXJhdGlvbiA9IDFlMyAqIDYwICogMzA7XG5hc3luYyBmdW5jdGlvbiBlc2lGZXRjaChwYXRoLCBjaGFyYWN0ZXIsIHsgbWV0aG9kID0gXCJHRVRcIiwgYm9keSwgbm9DYWNoZSA9IGZhbHNlLCBjYWNoZUR1cmF0aW9uID0gZGVmYXVsdENhY2hlRHVyYXRpb24gfSA9IHt9KSB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgaGVhZGVycyA9IHtcblx0XHRcdFwiVXNlci1BZ2VudFwiOiBvcHRpb25zLnVzZXJfYWdlbnQsXG5cdFx0XHRcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuXHRcdH07XG5cdFx0aWYgKGNoYXJhY3Rlcikge1xuXHRcdFx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzVmFsaWRUb2tlbihjaGFyYWN0ZXIpKSB7XG5cdFx0XHRcdGF3YWl0IENoYXJhY3RlckhlbHBlci5yZWZyZXNoVG9rZW5zKGNoYXJhY3Rlcik7XG5cdFx0XHRcdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1ZhbGlkVG9rZW4oY2hhcmFjdGVyKSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCB0b2tlbiBmb3IgY2hhcmFjdGVyOiAke2NoYXJhY3Rlci5ldmVJRH1gKTtcblx0XHRcdH1cblx0XHRcdGhlYWRlcnNbXCJBdXRob3JpemF0aW9uXCJdID0gYEJlYXJlciAke2NoYXJhY3Rlci5hY2Nlc3NUb2tlbn1gO1xuXHRcdH1cblx0XHRjb25zdCBpbml0ID0ge1xuXHRcdFx0aGVhZGVycyxcblx0XHRcdG1ldGhvZDogbWV0aG9kIHx8IFwiR0VUXCIsXG5cdFx0XHRib2R5OiBib2R5IHx8IHZvaWQgMFxuXHRcdH07XG5cdFx0Y29uc3QgdXJsID0gbmV3IFVSTChgJHtFU0lfTEFURVNUX1VSTH0ke3BhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogXCIvXCIgKyBwYXRofWApO1xuXHRcdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiZGF0YXNvdXJjZVwiLCBcInRyYW5xdWlsaXR5XCIpO1xuXHRcdGlmICghbm9DYWNoZSAmJiBpbml0Lm1ldGhvZCA9PT0gXCJHRVRcIikge1xuXHRcdFx0Y29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KHVybC5ocmVmKTtcblx0XHRcdGlmIChjYWNoZWQgJiYgY2FjaGVkPy5leHBpcmVzID4gRGF0ZS5ub3coKSkgcmV0dXJuIGNhY2hlZC5kYXRhO1xuXHRcdH1cblx0XHRjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIGluaXQpO1xuXHRcdGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuXHRcdGlmICghcmVzLm9rKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGBFU0kgcmVxdWVzdCBmYWlsdXJlIGF0ICR7cGF0aH0gfCAke3Jlcy5zdGF0dXN9OiR7cmVzLnN0YXR1c1RleHR9ID0+ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YCk7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0aWYgKGluaXQubWV0aG9kID09PSBcIkdFVFwiKSBjYWNoZS5zZXQodXJsLmhyZWYsIHtcblx0XHRcdGV4cGlyZXM6IE1hdGgubWF4KHJlcy5oZWFkZXJzLmdldChcImV4cGlyZXNcIikgJiYgbmV3IERhdGUoTnVtYmVyKHJlcy5oZWFkZXJzLmdldChcImV4cGlyZXNcIikgfHwgXCJcIikpLmdldFRpbWUoKSB8fCAwLCBEYXRlLm5vdygpICsgY2FjaGVEdXJhdGlvbiksXG5cdFx0XHRkYXRhXG5cdFx0fSk7XG5cdFx0cmV0dXJuIGRhdGE7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGNvbnNvbGUuZXJyb3IoYEVTSSByZXF1ZXN0IGZhaWx1cmUgYXQgJHtwYXRofSB8ICR7SlNPTi5zdHJpbmdpZnkoZXJyKX1gLCBlcnIpO1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgZXNpRmV0Y2ggfTsiLAogICAgImltcG9ydCB7IF9fZXhwb3J0IH0gZnJvbSBcIi4uL192aXJ0dWFsL3JvbGxkb3duX3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuLi9kYi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgXCIuLi9kYi9pbmRleC5qc1wiO1xuaW1wb3J0IFwiLi9zY29wZXMuanNcIjtcbmltcG9ydCB7IGVzaUZldGNoIH0gZnJvbSBcIi4vZmV0Y2guanNcIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvY2hhcmFjdGVyLnRzXG52YXIgY2hhcmFjdGVyX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGNoYXJhY3Rlcl9leHBvcnRzLCB7XG5cdGdldENoYXJhY3RlckFmZmlsaWF0aW9uczogKCkgPT4gZ2V0Q2hhcmFjdGVyQWZmaWxpYXRpb25zLFxuXHRnZXRDaGFyYWN0ZXJBZ2VudFJlc2VhcmNoOiAoKSA9PiBnZXRDaGFyYWN0ZXJBZ2VudFJlc2VhcmNoLFxuXHRnZXRDaGFyYWN0ZXJBc3NldExvY2F0aW9uczogKCkgPT4gZ2V0Q2hhcmFjdGVyQXNzZXRMb2NhdGlvbnMsXG5cdGdldENoYXJhY3RlckFzc2V0TmFtZXM6ICgpID0+IGdldENoYXJhY3RlckFzc2V0TmFtZXMsXG5cdGdldENoYXJhY3RlckFzc2V0czogKCkgPT4gZ2V0Q2hhcmFjdGVyQXNzZXRzLFxuXHRnZXRDaGFyYWN0ZXJCbHVlcHJpbnRzOiAoKSA9PiBnZXRDaGFyYWN0ZXJCbHVlcHJpbnRzLFxuXHRnZXRDaGFyYWN0ZXJDbG9uZXM6ICgpID0+IGdldENoYXJhY3RlckNsb25lcyxcblx0Z2V0Q2hhcmFjdGVyQ29udGFjdE5vdGlmaWNhdGlvbnM6ICgpID0+IGdldENoYXJhY3RlckNvbnRhY3ROb3RpZmljYXRpb25zLFxuXHRnZXRDaGFyYWN0ZXJDb3Jwb3JhdGlvbkhpc3Rvcnk6ICgpID0+IGdldENoYXJhY3RlckNvcnBvcmF0aW9uSGlzdG9yeSxcblx0Z2V0Q2hhcmFjdGVyQ3VycmVudFNoaXA6ICgpID0+IGdldENoYXJhY3RlckN1cnJlbnRTaGlwLFxuXHRnZXRDaGFyYWN0ZXJJbXBsYW50czogKCkgPT4gZ2V0Q2hhcmFjdGVySW1wbGFudHMsXG5cdGdldENoYXJhY3Rlckp1bXBGYXRpZ3VlOiAoKSA9PiBnZXRDaGFyYWN0ZXJKdW1wRmF0aWd1ZSxcblx0Z2V0Q2hhcmFjdGVyTG9jYXRpb246ICgpID0+IGdldENoYXJhY3RlckxvY2F0aW9uLFxuXHRnZXRDaGFyYWN0ZXJNZWRhbHM6ICgpID0+IGdldENoYXJhY3Rlck1lZGFscyxcblx0Z2V0Q2hhcmFjdGVyTm90aWZpY2F0aW9uczogKCkgPT4gZ2V0Q2hhcmFjdGVyTm90aWZpY2F0aW9ucyxcblx0Z2V0Q2hhcmFjdGVyT25saW5lOiAoKSA9PiBnZXRDaGFyYWN0ZXJPbmxpbmUsXG5cdGdldENoYXJhY3RlclBvcnRyYWl0czogKCkgPT4gZ2V0Q2hhcmFjdGVyUG9ydHJhaXRzLFxuXHRnZXRDaGFyYWN0ZXJQdWJsaWNEYXRhOiAoKSA9PiBnZXRDaGFyYWN0ZXJQdWJsaWNEYXRhLFxuXHRnZXRDaGFyYWN0ZXJSb2xlczogKCkgPT4gZ2V0Q2hhcmFjdGVyUm9sZXMsXG5cdGdldENoYXJhY3RlclN0YW5kaW5nczogKCkgPT4gZ2V0Q2hhcmFjdGVyU3RhbmRpbmdzLFxuXHRnZXRDaGFyYWN0ZXJUaXRsZXM6ICgpID0+IGdldENoYXJhY3RlclRpdGxlcyxcblx0Z2V0Q2hhcmFjdGVyV2FsbGV0OiAoKSA9PiBnZXRDaGFyYWN0ZXJXYWxsZXQsXG5cdGdldENoYXJhY3RlcldhbGxldEpvdXJuYWw6ICgpID0+IGdldENoYXJhY3RlcldhbGxldEpvdXJuYWwsXG5cdGdldENoYXJhY3RlcldhbGxldFRyYW5zYWN0aW9uczogKCkgPT4gZ2V0Q2hhcmFjdGVyV2FsbGV0VHJhbnNhY3Rpb25zLFxuXHRnZXRQb3J0cmFpdFVSTDogKCkgPT4gZ2V0UG9ydHJhaXRVUkxcbn0pO1xuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyUHVibGljRGF0YShpZCkge1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7aWR9L2ApO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQWZmaWxpYXRpb25zKGlkcykge1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzL2FmZmlsaWF0aW9uL2AsIHZvaWQgMCwge1xuXHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoaWRzKVxuXHR9KVswXTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlclBvcnRyYWl0cyhpZCkge1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7aWR9L3BvcnRyYWl0L2ApO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQ29ycG9yYXRpb25IaXN0b3J5KGlkKSB7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtpZH0vY29ycG9yYXRpb25oaXN0b3J5L2ApO1xufVxuZnVuY3Rpb24gZ2V0UG9ydHJhaXRVUkwoaWQpIHtcblx0cmV0dXJuIGBodHRwczovL2ltYWdlcy5ldmV0ZWNoLm5ldC9jaGFyYWN0ZXJzLyR7aWR9L3BvcnRyYWl0YDtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlclJvbGVzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9jb3Jwb3JhdGlvbl9yb2xlcy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3JvbGVzL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJUaXRsZXMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX3RpdGxlcy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3RpdGxlcy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyU3RhbmRpbmdzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9zdGFuZGluZ3MudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9zdGFuZGluZ3MvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3Rlck5vdGlmaWNhdGlvbnMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX25vdGlmaWNhdGlvbnMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9ub3RpZmljYXRpb25zL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJDb250YWN0Tm90aWZpY2F0aW9ucyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfbm90aWZpY2F0aW9ucy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L25vdGlmaWNhdGlvbnMvY29udGFjdHNgLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyTWVkYWxzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9tZWRhbHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9tZWRhbHMvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3Rlckp1bXBGYXRpZ3VlKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNoYXJhY3RlcnMucmVhZF9mYXRpZ3VlLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vZmF0aWd1ZS9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQmx1ZXByaW50cyhjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1jaGFyYWN0ZXJzLnJlYWRfYmx1ZXByaW50cy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2JsdWVwcmludHMvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckFnZW50UmVzZWFyY2goY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2hhcmFjdGVycy5yZWFkX2FnZW50c19yZXNlYXJjaC52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2FnZW50c19yZXNlYXJjaC9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQ2xvbmVzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWNsb25lcy5yZWFkX2Nsb25lcy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2Nsb25lcy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVySW1wbGFudHMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktY2xvbmVzLnJlYWRfaW1wbGFudHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9pbXBsYW50cy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQXNzZXRzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWFzc2V0cy5yZWFkX2Fzc2V0cy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2Fzc2V0cy9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyQXNzZXRMb2NhdGlvbnMoY2hhcmFjdGVyLCBpZHMpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1hc3NldHMucmVhZF9hc3NldHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9hc3NldHMvbG9jYXRpb25zL2AsIGNoYXJhY3Rlciwge1xuXHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoaWRzKVxuXHR9KTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckFzc2V0TmFtZXMoY2hhcmFjdGVyLCBpZHMpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1hc3NldHMucmVhZF9hc3NldHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9hc3NldHMvbmFtZXMvYCwgY2hhcmFjdGVyLCB7XG5cdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRib2R5OiBKU09OLnN0cmluZ2lmeShpZHMpXG5cdH0pO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyV2FsbGV0KGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXdhbGxldC5yZWFkX2NoYXJhY3Rlcl93YWxsZXQudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS93YWxsZXQvYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlcldhbGxldFRyYW5zYWN0aW9ucyhjaGFyYWN0ZXIsIGZyb21JZCkge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXdhbGxldC5yZWFkX2NoYXJhY3Rlcl93YWxsZXQudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS93YWxsZXQvdHJhbnNhY3Rpb25zL2AsIGNoYXJhY3Rlciwge1xuXHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoZnJvbUlkKVxuXHR9KTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlcldhbGxldEpvdXJuYWwoY2hhcmFjdGVyLCBwYWdlID0gMSkge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXdhbGxldC5yZWFkX2NoYXJhY3Rlcl93YWxsZXQudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS93YWxsZXQvam91cm5hbC8/cGFnZT0ke3BhZ2V9YCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGdldENoYXJhY3RlckxvY2F0aW9uKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWxvY2F0aW9uLnJlYWRfbG9jYXRpb24udjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gZXNpRmV0Y2goYC9jaGFyYWN0ZXJzLyR7Y2hhcmFjdGVyLmV2ZUlEfS9sb2NhdGlvbi9gLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyT25saW5lKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLWxvY2F0aW9uLnJlYWRfb25saW5lLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vb25saW5lL2AsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJDdXJyZW50U2hpcChjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1sb2NhdGlvbi5yZWFkX3NoaXBfdHlwZS52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L3NoaXAvYCwgY2hhcmFjdGVyKTtcbn1cblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBjaGFyYWN0ZXJfZXhwb3J0cywgZ2V0Q2hhcmFjdGVyQWZmaWxpYXRpb25zLCBnZXRDaGFyYWN0ZXJBZ2VudFJlc2VhcmNoLCBnZXRDaGFyYWN0ZXJBc3NldExvY2F0aW9ucywgZ2V0Q2hhcmFjdGVyQXNzZXROYW1lcywgZ2V0Q2hhcmFjdGVyQXNzZXRzLCBnZXRDaGFyYWN0ZXJCbHVlcHJpbnRzLCBnZXRDaGFyYWN0ZXJDbG9uZXMsIGdldENoYXJhY3RlckNvbnRhY3ROb3RpZmljYXRpb25zLCBnZXRDaGFyYWN0ZXJDb3Jwb3JhdGlvbkhpc3RvcnksIGdldENoYXJhY3RlckN1cnJlbnRTaGlwLCBnZXRDaGFyYWN0ZXJJbXBsYW50cywgZ2V0Q2hhcmFjdGVySnVtcEZhdGlndWUsIGdldENoYXJhY3RlckxvY2F0aW9uLCBnZXRDaGFyYWN0ZXJNZWRhbHMsIGdldENoYXJhY3Rlck5vdGlmaWNhdGlvbnMsIGdldENoYXJhY3Rlck9ubGluZSwgZ2V0Q2hhcmFjdGVyUG9ydHJhaXRzLCBnZXRDaGFyYWN0ZXJQdWJsaWNEYXRhLCBnZXRDaGFyYWN0ZXJSb2xlcywgZ2V0Q2hhcmFjdGVyU3RhbmRpbmdzLCBnZXRDaGFyYWN0ZXJUaXRsZXMsIGdldENoYXJhY3RlcldhbGxldCwgZ2V0Q2hhcmFjdGVyV2FsbGV0Sm91cm5hbCwgZ2V0Q2hhcmFjdGVyV2FsbGV0VHJhbnNhY3Rpb25zLCBnZXRQb3J0cmFpdFVSTCB9OyIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgQ2hhcmFjdGVySGVscGVyIH0gZnJvbSBcIi4uL2RiL21vZGVscy9jaGFyYWN0ZXIubW9kZWwuanNcIjtcbmltcG9ydCBcIi4uL2RiL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBlc2lGZXRjaCB9IGZyb20gXCIuL2ZldGNoLmpzXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZXNpL2NvcnBvcmF0aW9uLnRzXG52YXIgY29ycG9yYXRpb25fZXhwb3J0cyA9IHt9O1xuX19leHBvcnQoY29ycG9yYXRpb25fZXhwb3J0cywge1xuXHRnZXRDb3Jwb3JhdGlvbkFsbGlhbmNlSGlzdG9yeTogKCkgPT4gZ2V0Q29ycG9yYXRpb25BbGxpYW5jZUhpc3RvcnksXG5cdGdldENvcnBvcmF0aW9uQXNzZXRMb2NhdGlvbnM6ICgpID0+IGdldENvcnBvcmF0aW9uQXNzZXRMb2NhdGlvbnMsXG5cdGdldENvcnBvcmF0aW9uQXNzZXROYW1lczogKCkgPT4gZ2V0Q29ycG9yYXRpb25Bc3NldE5hbWVzLFxuXHRnZXRDb3Jwb3JhdGlvbkFzc2V0czogKCkgPT4gZ2V0Q29ycG9yYXRpb25Bc3NldHMsXG5cdGdldENvcnBvcmF0aW9uRGF0YTogKCkgPT4gZ2V0Q29ycG9yYXRpb25EYXRhLFxuXHRnZXRDb3Jwb3JhdGlvbkljb25zOiAoKSA9PiBnZXRDb3Jwb3JhdGlvbkljb25zXG59KTtcbmFzeW5jIGZ1bmN0aW9uIGdldENvcnBvcmF0aW9uRGF0YShpZCkge1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vYCk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRDb3Jwb3JhdGlvbkFsbGlhbmNlSGlzdG9yeShpZCkge1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vYWxsaWFuY2VoaXN0b3J5L2ApO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ycG9yYXRpb25JY29ucyhpZCkge1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vaWNvbnMvYCk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRDb3Jwb3JhdGlvbkFzc2V0cyhpZCwgY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktYXNzZXRzLnJlYWRfY29ycG9yYXRpb25fYXNzZXRzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvY29ycG9yYXRpb25zLyR7aWR9L2Fzc2V0cy9gLCBjaGFyYWN0ZXIpO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ycG9yYXRpb25Bc3NldExvY2F0aW9ucyhpZCwgY2hhcmFjdGVyLCBpZHMpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1hc3NldHMucmVhZF9jb3Jwb3JhdGlvbl9hc3NldHMudjFcIikpIHJldHVybiBudWxsO1xuXHRyZXR1cm4gYXdhaXQgZXNpRmV0Y2goYC9jb3Jwb3JhdGlvbnMvJHtpZH0vYXNzZXRzL2xvY2F0aW9ucy9gLCBjaGFyYWN0ZXIsIHtcblx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KGlkcylcblx0fSk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRDb3Jwb3JhdGlvbkFzc2V0TmFtZXMoaWQsIGNoYXJhY3RlciwgaWRzKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktYXNzZXRzLnJlYWRfY29ycG9yYXRpb25fYXNzZXRzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvY29ycG9yYXRpb25zLyR7aWR9L2Fzc2V0cy9uYW1lcy9gLCBjaGFyYWN0ZXIsIHtcblx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KGlkcylcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgY29ycG9yYXRpb25fZXhwb3J0cyB9OyIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgZXNpRmV0Y2ggfSBmcm9tIFwiLi9mZXRjaC5qc1wiO1xuXG4vLyNyZWdpb24gc3JjL2VzaS9hbGxpYW5jZS50c1xudmFyIGFsbGlhbmNlX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGFsbGlhbmNlX2V4cG9ydHMsIHtcblx0Z2V0QWxsaWFuY2VDb3Jwb3JhdGlvbnM6ICgpID0+IGdldEFsbGlhbmNlQ29ycG9yYXRpb25zLFxuXHRnZXRBbGxpYW5jZURhdGE6ICgpID0+IGdldEFsbGlhbmNlRGF0YSxcblx0Z2V0QWxsaWFuY2VJY29uczogKCkgPT4gZ2V0QWxsaWFuY2VJY29uc1xufSk7XG5hc3luYyBmdW5jdGlvbiBnZXRBbGxpYW5jZURhdGEoaWQpIHtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvYWxsaWFuY2VzLyR7aWR9L2ApO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsaWFuY2VDb3Jwb3JhdGlvbnMoaWQpIHtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvYWxsaWFuY2VzLyR7aWR9L2NvcnBvcmF0aW9ucy9gKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldEFsbGlhbmNlSWNvbnMoaWQpIHtcblx0cmV0dXJuIGF3YWl0IGVzaUZldGNoKGAvYWxsaWFuY2VzLyR7aWR9L2ljb25zL2ApO1xufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGFsbGlhbmNlX2V4cG9ydHMsIGdldEFsbGlhbmNlQ29ycG9yYXRpb25zLCBnZXRBbGxpYW5jZURhdGEsIGdldEFsbGlhbmNlSWNvbnMgfTsiLAogICAgImltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuLi9kYi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgXCIuLi9kYi9tb2RlbHMvaW5kZXguanNcIjtcbmltcG9ydCB7IGVzaUZldGNoIH0gZnJvbSBcIi4vZmV0Y2guanNcIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvc2tpbGxzLnRzXG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJBdHRyaWJ1dGVzKGNoYXJhY3Rlcikge1xuXHRpZiAoIUNoYXJhY3RlckhlbHBlci5oYXNTY29wZShjaGFyYWN0ZXIsIFwiZXNpLXNraWxscy5yZWFkX3NraWxscy52MVwiKSkgcmV0dXJuIG51bGw7XG5cdHJldHVybiBlc2lGZXRjaChgL2NoYXJhY3RlcnMvJHtjaGFyYWN0ZXIuZXZlSUR9L2F0dHJpYnV0ZXNgLCBjaGFyYWN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyU2tpbGxRdWV1ZShjaGFyYWN0ZXIpIHtcblx0aWYgKCFDaGFyYWN0ZXJIZWxwZXIuaGFzU2NvcGUoY2hhcmFjdGVyLCBcImVzaS1za2lsbHMucmVhZF9za2lsbHF1ZXVlLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vc2tpbGxxdWV1ZWAsIGNoYXJhY3Rlcik7XG59XG5mdW5jdGlvbiBnZXRDaGFyYWN0ZXJTa2lsbHMoY2hhcmFjdGVyKSB7XG5cdGlmICghQ2hhcmFjdGVySGVscGVyLmhhc1Njb3BlKGNoYXJhY3RlciwgXCJlc2ktc2tpbGxzLnJlYWRfc2tpbGxzLnYxXCIpKSByZXR1cm4gbnVsbDtcblx0cmV0dXJuIGVzaUZldGNoKGAvY2hhcmFjdGVycy8ke2NoYXJhY3Rlci5ldmVJRH0vc2tpbGxzYCwgY2hhcmFjdGVyKTtcbn1cbmZ1bmN0aW9uIGNhbGN1bGF0ZVRyYWluaW5nUGVyY2VudGFnZShxdWV1ZWRTa2lsbCkge1xuXHRjb25zdCB0cmFpbmluZ1N0YXJ0UG9zaXRpb24gPSAocXVldWVkU2tpbGwudHJhaW5pbmdfc3RhcnRfc3AgLSBxdWV1ZWRTa2lsbC5sZXZlbF9zdGFydF9zcCkgLyBxdWV1ZWRTa2lsbC5sZXZlbF9lbmRfc3A7XG5cdGNvbnN0IHRpbWVQb3NpdGlvbiA9ICgoLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCkpLmdldFRpbWUoKSAtIG5ldyBEYXRlKHF1ZXVlZFNraWxsLnN0YXJ0X2RhdGUpLmdldFRpbWUoKSkgLyAobmV3IERhdGUocXVldWVkU2tpbGwuZmluaXNoX2RhdGUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKHF1ZXVlZFNraWxsLnN0YXJ0X2RhdGUpLmdldFRpbWUoKSk7XG5cdHJldHVybiB0cmFpbmluZ1N0YXJ0UG9zaXRpb24gKyAoMSAtIHRyYWluaW5nU3RhcnRQb3NpdGlvbikgKiB0aW1lUG9zaXRpb247XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgY2FsY3VsYXRlVHJhaW5pbmdQZXJjZW50YWdlLCBnZXRDaGFyYWN0ZXJBdHRyaWJ1dGVzLCBnZXRDaGFyYWN0ZXJTa2lsbFF1ZXVlLCBnZXRDaGFyYWN0ZXJTa2lsbHMgfTsiLAogICAgImltcG9ydCB0eXBlIHsgRVZFQXV0aCB9IGZyb20gJ0AvbWlkZGxld2FyZSc7XG5pbXBvcnQgeyBzZXRDb29raWUgfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tICdicmlzYSc7XG5pbXBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIsIFVzZXJIZWxwZXIgfSBmcm9tICdAc3Rhci1raXR0ZW4vZXZlL2RiJztcbmltcG9ydCB7IGpvaW5TY29wZXMgfSBmcm9tICdAc3Rhci1raXR0ZW4vZXZlL2VzaSc7XG5cbi8vIEdFVCAvYXBpL2F1dGgvZGlzY29yZElELzpkaXNjb3JkSUQvY2hhcmFjdGVySUQvOmNoYXJhY3RlcklEL3JlZnJlc2hcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBHRVQoeyBzdG9yZSwgcm91dGU6IHsgcGFyYW1zIH0gfTogUmVxdWVzdENvbnRleHQpIHtcblxuICBjb25zdCBkaXNjb3JkSUQgPSBwYXJhbXMhWydkaXNjb3JkSUQnXSBhcyBzdHJpbmc7XG4gIGNvbnN0IGNoYXJhY3RlcklEID0gcGFyYW1zIVsnY2hhcmFjdGVySUQnXSBhcyBzdHJpbmc7XG5cbiAgY29uc3QgdXNlciA9IFVzZXJIZWxwZXIuZmluZEJ5RGlzY29yZElkKGRpc2NvcmRJRCk7XG4gIGNvbnN0IGNoYXJhY3RlciA9IENoYXJhY3RlckhlbHBlci5maW5kQnlVc2VyQW5kRXZlSUQodXNlci5pZCwgTnVtYmVyKGNoYXJhY3RlcklEKSk7XG4gIGlmICghdXNlcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgVXNlciBub3QgZm91bmQgZm9yIGRpc2NvcmRJRDogJHtkaXNjb3JkSUR9YCk7XG4gIH1cbiAgaWYgKCFjaGFyYWN0ZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENoYXJhY3RlciBub3QgZm91bmQgZm9yIHVzZXI6ICR7dXNlci5pZH0gYW5kIGNoYXJhY3RlcklEOiAke2NoYXJhY3RlcklEfWApO1xuICB9XG4gIGNvbnN0IHNjb3BlcyA9IENoYXJhY3RlckhlbHBlci5nZXRTY29wZXMoY2hhcmFjdGVyKTtcblxuICBjb25zdCBldmVhdXRoOiBFVkVBdXRoID0gc3RvcmUuZ2V0KCdldmVhdXRoJyk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZXZlYXV0aC5yZWRpcmVjdChqb2luU2NvcGVzKC4uLnNjb3BlcykpO1xuICBzZXRDb29raWUocmVzcG9uc2UsICdkaXNjb3JkSUQnLCBkaXNjb3JkSUQsIDYwICogMTAgLyogMTAgbWluICovKTtcbiAgc2V0Q29va2llKHJlc3BvbnNlLCAnY2hhcmFjdGVySUQnLCBjaGFyYWN0ZXJJRCwgNjAgKiAxMCAvKiAxMCBtaW4gKi8pO1xuICByZXR1cm4gcmVzcG9uc2U7XG59IgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFFQSxJQUFJO0FBQUEsRUFDSixJQUFJLFVBQVMsT0FBTztBQUFBLEVBR3BCLFNBQVMsU0FBVSxDQUFDLEtBQUssS0FBSztBQUFBLElBQzVCLFNBQVMsT0FBTyxLQUFLO0FBQUEsTUFDbkIsSUFBSSxPQUFPLElBQUk7QUFBQSxJQUNqQjtBQUFBO0FBQUEsRUFFRixJQUFJLFFBQU8sUUFBUSxRQUFPLFNBQVMsUUFBTyxlQUFlLFFBQU8saUJBQWlCO0FBQUEsSUFDL0UsT0FBTyxVQUFVO0FBQUEsRUFDbkIsRUFBTztBQUFBLElBRUwsVUFBVSxRQUFRLE9BQU87QUFBQSxJQUN6QixRQUFRLFNBQVM7QUFBQTtBQUFBLEVBR25CLFNBQVMsVUFBVyxDQUFDLEtBQUssa0JBQWtCLFFBQVE7QUFBQSxJQUNsRCxPQUFPLFFBQU8sS0FBSyxrQkFBa0IsTUFBTTtBQUFBO0FBQUEsRUFHN0MsV0FBVyxZQUFZLE9BQU8sT0FBTyxRQUFPLFNBQVM7QUFBQSxFQUdyRCxVQUFVLFNBQVEsVUFBVTtBQUFBLEVBRTVCLFdBQVcsT0FBTyxRQUFTLENBQUMsS0FBSyxrQkFBa0IsUUFBUTtBQUFBLElBQ3pELElBQUksT0FBTyxRQUFRLFVBQVU7QUFBQSxNQUMzQixNQUFNLElBQUksVUFBVSwrQkFBK0I7QUFBQSxJQUNyRDtBQUFBLElBQ0EsT0FBTyxRQUFPLEtBQUssa0JBQWtCLE1BQU07QUFBQTtBQUFBLEVBRzdDLFdBQVcsUUFBUSxRQUFTLENBQUMsTUFBTSxNQUFNLFVBQVU7QUFBQSxJQUNqRCxJQUFJLE9BQU8sU0FBUyxVQUFVO0FBQUEsTUFDNUIsTUFBTSxJQUFJLFVBQVUsMkJBQTJCO0FBQUEsSUFDakQ7QUFBQSxJQUNBLElBQUksTUFBTSxRQUFPLElBQUk7QUFBQSxJQUNyQixJQUFJLFNBQVMsV0FBVztBQUFBLE1BQ3RCLElBQUksT0FBTyxhQUFhLFVBQVU7QUFBQSxRQUNoQyxJQUFJLEtBQUssTUFBTSxRQUFRO0FBQUEsTUFDekIsRUFBTztBQUFBLFFBQ0wsSUFBSSxLQUFLLElBQUk7QUFBQTtBQUFBLElBRWpCLEVBQU87QUFBQSxNQUNMLElBQUksS0FBSyxDQUFDO0FBQUE7QUFBQSxJQUVaLE9BQU87QUFBQTtBQUFBLEVBR1QsV0FBVyxjQUFjLFFBQVMsQ0FBQyxNQUFNO0FBQUEsSUFDdkMsSUFBSSxPQUFPLFNBQVMsVUFBVTtBQUFBLE1BQzVCLE1BQU0sSUFBSSxVQUFVLDJCQUEyQjtBQUFBLElBQ2pEO0FBQUEsSUFDQSxPQUFPLFFBQU8sSUFBSTtBQUFBO0FBQUEsRUFHcEIsV0FBVyxrQkFBa0IsUUFBUyxDQUFDLE1BQU07QUFBQSxJQUMzQyxJQUFJLE9BQU8sU0FBUyxVQUFVO0FBQUEsTUFDNUIsTUFBTSxJQUFJLFVBQVUsMkJBQTJCO0FBQUEsSUFDakQ7QUFBQSxJQUNBLE9BQU8sT0FBTyxXQUFXLElBQUk7QUFBQTtBQUFBOzs7O0VDOUQvQixJQUFJLGdDQUFnQztBQUFBLEVBQ3BDLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUVKLFNBQVMsVUFBVSxDQUFDLE1BQU07QUFBQSxJQUN4QixLQUFLLFNBQVM7QUFBQSxJQUNkLEtBQUssV0FBVztBQUFBLElBQ2hCLEtBQUssV0FBVztBQUFBLElBR2hCLEtBQUssTUFBTTtBQUFBLE1BQ1QsS0FBSyxTQUFTLFFBQU8sTUFBTSxDQUFDO0FBQUEsTUFDNUIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUdBLElBQUksT0FBTyxLQUFLLFNBQVMsWUFBWTtBQUFBLE1BQ25DLEtBQUssU0FBUyxRQUFPLE1BQU0sQ0FBQztBQUFBLE1BQzVCLEtBQUssS0FBSyxJQUFJO0FBQUEsTUFDZCxPQUFPO0FBQUEsSUFDVDtBQUFBLElBSUEsSUFBSSxLQUFLLFVBQVUsT0FBTyxTQUFTLFVBQVU7QUFBQSxNQUMzQyxLQUFLLFNBQVM7QUFBQSxNQUNkLEtBQUssV0FBVztBQUFBLE1BQ2hCLFFBQVEsU0FBUyxRQUFTLEdBQUc7QUFBQSxRQUMzQixLQUFLLEtBQUssT0FBTyxJQUFJO0FBQUEsUUFDckIsS0FBSyxXQUFXO0FBQUEsUUFDaEIsS0FBSyxLQUFLLE9BQU87QUFBQSxRQUNqQixLQUFLLElBQUksQ0FBQztBQUFBLE1BQ1osT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLE1BQU0sSUFBSSxVQUFVLDJCQUEwQixPQUFPLE9BQU8sR0FBRztBQUFBO0FBQUEsRUFFakUsS0FBSyxTQUFTLFlBQVksTUFBTTtBQUFBLEVBRWhDLFdBQVcsVUFBVSxRQUFRLFNBQVMsS0FBSyxDQUFDLE1BQU07QUFBQSxJQUNoRCxLQUFLLFNBQVMsUUFBTyxPQUFPLENBQUMsS0FBSyxRQUFRLFFBQU8sS0FBSyxJQUFJLENBQUMsQ0FBQztBQUFBLElBQzVELEtBQUssS0FBSyxRQUFRLElBQUk7QUFBQTtBQUFBLEVBR3hCLFdBQVcsVUFBVSxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU07QUFBQSxJQUM1QyxJQUFJO0FBQUEsTUFDRixLQUFLLE1BQU0sSUFBSTtBQUFBLElBQ2pCLEtBQUssS0FBSyxPQUFPLElBQUk7QUFBQSxJQUNyQixLQUFLLEtBQUssT0FBTztBQUFBLElBQ2pCLEtBQUssV0FBVztBQUFBLElBQ2hCLEtBQUssV0FBVztBQUFBO0FBQUEsRUFHbEIsT0FBTyxVQUFVO0FBQUE7Ozs7RUNwRGpCLFNBQVMsWUFBWSxDQUFDLFNBQVM7QUFBQSxJQUM5QixJQUFJLFVBQVcsVUFBVSxJQUFLLE1BQU0sVUFBVSxNQUFNLElBQUksSUFBSTtBQUFBLElBQzVELE9BQU87QUFBQTtBQUFBLEVBR1IsSUFBSSxtQkFBbUI7QUFBQSxJQUN0QixPQUFPLGFBQWEsR0FBRztBQUFBLElBQ3ZCLE9BQU8sYUFBYSxHQUFHO0FBQUEsSUFDdkIsT0FBTyxhQUFhLEdBQUc7QUFBQSxFQUN4QjtBQUFBLEVBRUEsU0FBUyxtQkFBbUIsQ0FBQyxLQUFLO0FBQUEsSUFDakMsSUFBSSxhQUFhLGlCQUFpQjtBQUFBLElBQ2xDLElBQUksWUFBWTtBQUFBLE1BQ2YsT0FBTztBQUFBLElBQ1I7QUFBQSxJQUVBLE1BQU0sSUFBSSxNQUFNLHdCQUF3QixNQUFNLEdBQUc7QUFBQTtBQUFBLEVBR2xELE9BQU8sVUFBVTtBQUFBOzs7O0VDcEJqQixJQUFJLGdDQUFnQztBQUFBLEVBRXBDLElBQUk7QUFBQSxFQUVKLElBQUksWUFBWTtBQUFBLEVBQWhCLElBQ0Msa0JBQWtCO0FBQUEsRUFEbkIsSUFFQyxnQkFBZ0I7QUFBQSxFQUZqQixJQUdDLFVBQVU7QUFBQSxFQUhYLElBSUMsVUFBVTtBQUFBLEVBSlgsSUFLQyxrQkFBbUIsVUFBVSxnQkFBa0IsbUJBQW1CO0FBQUEsRUFMbkUsSUFNQyxrQkFBa0IsVUFBVyxtQkFBbUI7QUFBQSxFQUVqRCxTQUFTLFNBQVMsQ0FBQyxRQUFRO0FBQUEsSUFDMUIsT0FBTyxPQUNMLFFBQVEsTUFBTSxFQUFFLEVBQ2hCLFFBQVEsT0FBTyxHQUFHLEVBQ2xCLFFBQVEsT0FBTyxHQUFHO0FBQUE7QUFBQSxFQUdyQixTQUFTLGlCQUFpQixDQUFDLFdBQVc7QUFBQSxJQUNyQyxJQUFJLFFBQU8sU0FBUyxTQUFTLEdBQUc7QUFBQSxNQUMvQixPQUFPO0FBQUEsSUFDUixFQUFPLFNBQWlCLE9BQU8sY0FBcEIsVUFBK0I7QUFBQSxNQUN6QyxPQUFPLFFBQU8sS0FBSyxXQUFXLFFBQVE7QUFBQSxJQUN2QztBQUFBLElBRUEsTUFBTSxJQUFJLFVBQVUscURBQXFEO0FBQUE7QUFBQSxFQUcxRSxTQUFTLFNBQVMsQ0FBQyxXQUFXLEtBQUs7QUFBQSxJQUNsQyxZQUFZLGtCQUFrQixTQUFTO0FBQUEsSUFDdkMsSUFBSSxhQUFhLG9CQUFvQixHQUFHO0FBQUEsSUFJeEMsSUFBSSx3QkFBd0IsYUFBYTtBQUFBLElBRXpDLElBQUksY0FBYyxVQUFVO0FBQUEsSUFFNUIsSUFBSSxTQUFTO0FBQUEsSUFDYixJQUFJLFVBQVUsY0FBYyxpQkFBaUI7QUFBQSxNQUM1QyxNQUFNLElBQUksTUFBTSwrQkFBK0I7QUFBQSxJQUNoRDtBQUFBLElBRUEsSUFBSSxZQUFZLFVBQVU7QUFBQSxJQUMxQixJQUFJLGVBQWUsWUFBWSxJQUFJO0FBQUEsTUFDbEMsWUFBWSxVQUFVO0FBQUEsSUFDdkI7QUFBQSxJQUVBLElBQUksY0FBYyxTQUFTLFdBQVc7QUFBQSxNQUNyQyxNQUFNLElBQUksTUFBTSxnQ0FBZ0MsWUFBWSxlQUFlLGNBQWMsVUFBVSxhQUFhO0FBQUEsSUFDakg7QUFBQSxJQUVBLElBQUksVUFBVSxjQUFjLGlCQUFpQjtBQUFBLE1BQzVDLE1BQU0sSUFBSSxNQUFNLHVDQUF1QztBQUFBLElBQ3hEO0FBQUEsSUFFQSxJQUFJLFVBQVUsVUFBVTtBQUFBLElBRXhCLElBQUksY0FBYyxTQUFTLElBQUksU0FBUztBQUFBLE1BQ3ZDLE1BQU0sSUFBSSxNQUFNLDhCQUE4QixVQUFVLGVBQWUsY0FBYyxTQUFTLEtBQUssYUFBYTtBQUFBLElBQ2pIO0FBQUEsSUFFQSxJQUFJLHdCQUF3QixTQUFTO0FBQUEsTUFDcEMsTUFBTSxJQUFJLE1BQU0sOEJBQThCLFVBQVUsZ0JBQWdCLHdCQUF3QixpQkFBaUI7QUFBQSxJQUNsSDtBQUFBLElBRUEsSUFBSSxVQUFVO0FBQUEsSUFDZCxVQUFVO0FBQUEsSUFFVixJQUFJLFVBQVUsY0FBYyxpQkFBaUI7QUFBQSxNQUM1QyxNQUFNLElBQUksTUFBTSx1Q0FBdUM7QUFBQSxJQUN4RDtBQUFBLElBRUEsSUFBSSxVQUFVLFVBQVU7QUFBQSxJQUV4QixJQUFJLGNBQWMsV0FBVyxTQUFTO0FBQUEsTUFDckMsTUFBTSxJQUFJLE1BQU0sOEJBQThCLFVBQVUsbUJBQW1CLGNBQWMsVUFBVSxHQUFHO0FBQUEsSUFDdkc7QUFBQSxJQUVBLElBQUksd0JBQXdCLFNBQVM7QUFBQSxNQUNwQyxNQUFNLElBQUksTUFBTSw4QkFBOEIsVUFBVSxnQkFBZ0Isd0JBQXdCLGlCQUFpQjtBQUFBLElBQ2xIO0FBQUEsSUFFQSxJQUFJLFVBQVU7QUFBQSxJQUNkLFVBQVU7QUFBQSxJQUVWLElBQUksV0FBVyxhQUFhO0FBQUEsTUFDM0IsTUFBTSxJQUFJLE1BQU0sOENBQThDLGNBQWMsVUFBVSxnQkFBZ0I7QUFBQSxJQUN2RztBQUFBLElBRUEsSUFBSSxXQUFXLGFBQWEsU0FDM0IsV0FBVyxhQUFhO0FBQUEsSUFFekIsSUFBSSxNQUFNLFFBQU8sWUFBWSxXQUFXLFVBQVUsV0FBVyxPQUFPO0FBQUEsSUFFcEUsS0FBSyxTQUFTLEVBQUcsU0FBUyxZQUFZLFFBQVE7QUFBQSxNQUM3QyxJQUFJLFVBQVU7QUFBQSxJQUNmO0FBQUEsSUFDQSxVQUFVLEtBQUssS0FBSyxRQUFRLFVBQVUsS0FBSyxLQUFLLFVBQVUsQ0FBQyxHQUFHLFVBQVUsT0FBTztBQUFBLElBRS9FLFNBQVM7QUFBQSxJQUVULFNBQVMsSUFBSSxPQUFRLFNBQVMsSUFBSSxZQUFZLFFBQVE7QUFBQSxNQUNyRCxJQUFJLFVBQVU7QUFBQSxJQUNmO0FBQUEsSUFDQSxVQUFVLEtBQUssS0FBSyxRQUFRLFVBQVUsS0FBSyxLQUFLLFVBQVUsQ0FBQyxHQUFHLFVBQVUsT0FBTztBQUFBLElBRS9FLE1BQU0sSUFBSSxTQUFTLFFBQVE7QUFBQSxJQUMzQixNQUFNLFVBQVUsR0FBRztBQUFBLElBRW5CLE9BQU87QUFBQTtBQUFBLEVBR1IsU0FBUyxZQUFZLENBQUMsS0FBSyxPQUFPLE1BQU07QUFBQSxJQUN2QyxJQUFJLFVBQVU7QUFBQSxJQUNkLE9BQU8sUUFBUSxVQUFVLFFBQVEsSUFBSSxRQUFRLGFBQWEsR0FBRztBQUFBLFFBQzFEO0FBQUEsSUFDSDtBQUFBLElBRUEsSUFBSSxZQUFZLElBQUksUUFBUSxZQUFZO0FBQUEsSUFDeEMsSUFBSSxXQUFXO0FBQUEsUUFDWjtBQUFBLElBQ0g7QUFBQSxJQUVBLE9BQU87QUFBQTtBQUFBLEVBR1IsU0FBUyxTQUFTLENBQUMsV0FBVyxLQUFLO0FBQUEsSUFDbEMsWUFBWSxrQkFBa0IsU0FBUztBQUFBLElBQ3ZDLElBQUksYUFBYSxvQkFBb0IsR0FBRztBQUFBLElBRXhDLElBQUksaUJBQWlCLFVBQVU7QUFBQSxJQUMvQixJQUFJLG1CQUFtQixhQUFhLEdBQUc7QUFBQSxNQUN0QyxNQUFNLElBQUksVUFBVSxNQUFNLE1BQU0sMkJBQTJCLGFBQWEsSUFBSSxtQkFBbUIsaUJBQWlCLEdBQUc7QUFBQSxJQUNwSDtBQUFBLElBRUEsSUFBSSxXQUFXLGFBQWEsV0FBVyxHQUFHLFVBQVU7QUFBQSxJQUNwRCxJQUFJLFdBQVcsYUFBYSxXQUFXLFlBQVksVUFBVSxNQUFNO0FBQUEsSUFDbkUsSUFBSSxVQUFVLGFBQWE7QUFBQSxJQUMzQixJQUFJLFVBQVUsYUFBYTtBQUFBLElBRTNCLElBQUksVUFBVSxJQUFJLElBQUksVUFBVSxJQUFJLElBQUk7QUFBQSxJQUV4QyxJQUFJLGNBQWMsVUFBVTtBQUFBLElBRTVCLElBQUksTUFBTSxRQUFPLGFBQWEsY0FBYyxJQUFJLEtBQUssT0FBTztBQUFBLElBRTVELElBQUksU0FBUztBQUFBLElBQ2IsSUFBSSxZQUFZO0FBQUEsSUFDaEIsSUFBSSxhQUFhO0FBQUEsTUFHaEIsSUFBSSxZQUFZO0FBQUEsSUFDakIsRUFBTztBQUFBLE1BR04sSUFBSSxZQUFZLFlBQVk7QUFBQSxNQUU1QixJQUFJLFlBQVksVUFBVTtBQUFBO0FBQUEsSUFFM0IsSUFBSSxZQUFZO0FBQUEsSUFDaEIsSUFBSSxZQUFZO0FBQUEsSUFDaEIsSUFBSSxXQUFXLEdBQUc7QUFBQSxNQUNqQixJQUFJLFlBQVk7QUFBQSxNQUNoQixVQUFVLFVBQVUsS0FBSyxLQUFLLFFBQVEsR0FBRyxVQUFVO0FBQUEsSUFDcEQsRUFBTztBQUFBLE1BQ04sVUFBVSxVQUFVLEtBQUssS0FBSyxRQUFRLFVBQVUsVUFBVTtBQUFBO0FBQUEsSUFFM0QsSUFBSSxZQUFZO0FBQUEsSUFDaEIsSUFBSSxZQUFZO0FBQUEsSUFDaEIsSUFBSSxXQUFXLEdBQUc7QUFBQSxNQUNqQixJQUFJLFlBQVk7QUFBQSxNQUNoQixVQUFVLEtBQUssS0FBSyxRQUFRLFVBQVU7QUFBQSxJQUN2QyxFQUFPO0FBQUEsTUFDTixVQUFVLEtBQUssS0FBSyxRQUFRLGFBQWEsUUFBUTtBQUFBO0FBQUEsSUFHbEQsT0FBTztBQUFBO0FBQUEsRUFHUixPQUFPLFVBQVU7QUFBQSxJQUNoQjtBQUFBLElBQ0E7QUFBQSxFQUNEO0FBQUE7Ozs7RUN4TEEsSUFBSSw4QkFBMkI7QUFBQSxFQUMvQixJQUFJLGlDQUErQjtBQUFBLEVBRW5DLE9BQU8sVUFBVTtBQUFBLEVBRWpCLFNBQVMsUUFBUSxDQUFDLEdBQUcsR0FBRztBQUFBLElBR3RCLEtBQUssUUFBTyxTQUFTLENBQUMsTUFBTSxRQUFPLFNBQVMsQ0FBQyxHQUFHO0FBQUEsTUFDOUMsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUtBLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUTtBQUFBLE1BQ3pCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxJQUFJLElBQUk7QUFBQSxJQUNSLFNBQVMsSUFBSSxFQUFHLElBQUksRUFBRSxRQUFRLEtBQUs7QUFBQSxNQUVqQyxLQUFLLEVBQUUsS0FBSyxFQUFFO0FBQUEsSUFDaEI7QUFBQSxJQUNBLE9BQU8sTUFBTTtBQUFBO0FBQUEsRUFHZixTQUFTLFVBQVUsUUFBUSxHQUFHO0FBQUEsSUFDNUIsUUFBTyxVQUFVLFFBQVEsV0FBVyxVQUFVLFFBQVEsU0FBUyxLQUFLLENBQUMsTUFBTTtBQUFBLE1BQ3pFLE9BQU8sU0FBUyxNQUFNLElBQUk7QUFBQTtBQUFBO0FBQUEsRUFJOUIsSUFBSSxlQUFlLFFBQU8sVUFBVTtBQUFBLEVBQ3BDLElBQUksbUJBQW1CLFdBQVcsVUFBVTtBQUFBLEVBQzVDLFNBQVMsVUFBVSxRQUFRLEdBQUc7QUFBQSxJQUM1QixRQUFPLFVBQVUsUUFBUTtBQUFBLElBQ3pCLFdBQVcsVUFBVSxRQUFRO0FBQUE7QUFBQTs7OztFQ3ZDL0IsSUFBSSxnQ0FBZ0M7QUFBQSxFQUNwQyxJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFFSixJQUFJLHdCQUF3QjtBQUFBO0FBQUE7QUFBQSxFQUM1QixJQUFJLHFCQUFxQjtBQUFBLEVBQ3pCLElBQUksMkJBQTJCO0FBQUEsRUFDL0IsSUFBSSx5QkFBeUI7QUFBQSxFQUU3QixJQUFJLHFCQUFxQixPQUFPLFFBQU8sb0JBQW9CO0FBQUEsRUFDM0QsSUFBSSxvQkFBb0I7QUFBQSxJQUN0Qiw0QkFBNEI7QUFBQSxJQUM1QixzQkFBc0I7QUFBQSxFQUN4QjtBQUFBLEVBRUEsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFLO0FBQUEsSUFDN0IsSUFBSSxRQUFPLFNBQVMsR0FBRyxHQUFHO0FBQUEsTUFDeEI7QUFBQSxJQUNGO0FBQUEsSUFFQSxJQUFJLE9BQU8sUUFBUSxVQUFVO0FBQUEsTUFDM0I7QUFBQSxJQUNGO0FBQUEsSUFFQSxLQUFLLG9CQUFvQjtBQUFBLE1BQ3ZCLE1BQU0sVUFBVSx3QkFBd0I7QUFBQSxJQUMxQztBQUFBLElBRUEsSUFBSSxPQUFPLFFBQVEsVUFBVTtBQUFBLE1BQzNCLE1BQU0sVUFBVSx3QkFBd0I7QUFBQSxJQUMxQztBQUFBLElBRUEsSUFBSSxPQUFPLElBQUksU0FBUyxVQUFVO0FBQUEsTUFDaEMsTUFBTSxVQUFVLHdCQUF3QjtBQUFBLElBQzFDO0FBQUEsSUFFQSxJQUFJLE9BQU8sSUFBSSxzQkFBc0IsVUFBVTtBQUFBLE1BQzdDLE1BQU0sVUFBVSx3QkFBd0I7QUFBQSxJQUMxQztBQUFBLElBRUEsSUFBSSxPQUFPLElBQUksV0FBVyxZQUFZO0FBQUEsTUFDcEMsTUFBTSxVQUFVLHdCQUF3QjtBQUFBLElBQzFDO0FBQUE7QUFBQSxFQUdGLFNBQVMsaUJBQWlCLENBQUMsS0FBSztBQUFBLElBQzlCLElBQUksUUFBTyxTQUFTLEdBQUcsR0FBRztBQUFBLE1BQ3hCO0FBQUEsSUFDRjtBQUFBLElBRUEsSUFBSSxPQUFPLFFBQVEsVUFBVTtBQUFBLE1BQzNCO0FBQUEsSUFDRjtBQUFBLElBRUEsSUFBSSxPQUFPLFFBQVEsVUFBVTtBQUFBLE1BQzNCO0FBQUEsSUFDRjtBQUFBLElBRUEsTUFBTSxVQUFVLHNCQUFzQjtBQUFBO0FBQUEsRUFHeEMsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFLO0FBQUEsSUFDN0IsSUFBSSxRQUFPLFNBQVMsR0FBRyxHQUFHO0FBQUEsTUFDeEI7QUFBQSxJQUNGO0FBQUEsSUFFQSxJQUFJLE9BQU8sUUFBUSxVQUFVO0FBQUEsTUFDM0IsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLEtBQUssb0JBQW9CO0FBQUEsTUFDdkIsTUFBTSxVQUFVLGtCQUFrQjtBQUFBLElBQ3BDO0FBQUEsSUFFQSxJQUFJLE9BQU8sUUFBUSxVQUFVO0FBQUEsTUFDM0IsTUFBTSxVQUFVLGtCQUFrQjtBQUFBLElBQ3BDO0FBQUEsSUFFQSxJQUFJLElBQUksU0FBUyxVQUFVO0FBQUEsTUFDekIsTUFBTSxVQUFVLGtCQUFrQjtBQUFBLElBQ3BDO0FBQUEsSUFFQSxJQUFJLE9BQU8sSUFBSSxXQUFXLFlBQVk7QUFBQSxNQUNwQyxNQUFNLFVBQVUsa0JBQWtCO0FBQUEsSUFDcEM7QUFBQTtBQUFBLEVBR0YsU0FBUyxVQUFVLENBQUMsUUFBUTtBQUFBLElBQzFCLE9BQU8sT0FDSixRQUFRLE1BQU0sRUFBRSxFQUNoQixRQUFRLE9BQU8sR0FBRyxFQUNsQixRQUFRLE9BQU8sR0FBRztBQUFBO0FBQUEsRUFHdkIsU0FBUyxRQUFRLENBQUMsV0FBVztBQUFBLElBQzNCLFlBQVksVUFBVSxTQUFTO0FBQUEsSUFFL0IsSUFBSSxVQUFVLElBQUksVUFBVSxTQUFTO0FBQUEsSUFDckMsSUFBSSxZQUFZLEdBQUc7QUFBQSxNQUNqQixTQUFTLElBQUksRUFBRyxJQUFJLFdBQVcsR0FBRztBQUFBLFFBQ2hDLGFBQWE7QUFBQSxNQUNmO0FBQUEsSUFDRjtBQUFBLElBRUEsT0FBTyxVQUNKLFFBQVEsT0FBTyxHQUFHLEVBQ2xCLFFBQVEsTUFBTSxHQUFHO0FBQUE7QUFBQSxFQUd0QixTQUFTLFNBQVMsQ0FBQyxVQUFVO0FBQUEsSUFDM0IsSUFBSSxPQUFPLENBQUMsRUFBRSxNQUFNLEtBQUssV0FBVyxDQUFDO0FBQUEsSUFDckMsSUFBSSxTQUFTLEtBQUssT0FBTyxLQUFLLE1BQU0sUUFBUSxFQUFFLE1BQU0sTUFBTSxJQUFJO0FBQUEsSUFDOUQsT0FBTyxJQUFJLFVBQVUsTUFBTTtBQUFBO0FBQUEsRUFHN0IsU0FBUyxjQUFjLENBQUMsS0FBSztBQUFBLElBQzNCLE9BQU8sUUFBTyxTQUFTLEdBQUcsS0FBSyxPQUFPLFFBQVE7QUFBQTtBQUFBLEVBR2hELFNBQVMsY0FBYyxDQUFDLE9BQU87QUFBQSxJQUM3QixLQUFLLGVBQWUsS0FBSztBQUFBLE1BQ3ZCLFFBQVEsS0FBSyxVQUFVLEtBQUs7QUFBQSxJQUM5QixPQUFPO0FBQUE7QUFBQSxFQUdULFNBQVMsZ0JBQWdCLENBQUMsTUFBTTtBQUFBLElBQzlCLE9BQU8sU0FBUyxJQUFJLENBQUMsT0FBTyxRQUFRO0FBQUEsTUFDbEMsaUJBQWlCLE1BQU07QUFBQSxNQUN2QixRQUFRLGVBQWUsS0FBSztBQUFBLE1BQzVCLElBQUksT0FBTyxRQUFPLFdBQVcsUUFBUSxNQUFNLE1BQU07QUFBQSxNQUNqRCxJQUFJLE9BQU8sS0FBSyxPQUFPLEtBQUssR0FBRyxLQUFLLE9BQU8sUUFBUTtBQUFBLE1BQ25ELE9BQU8sV0FBVyxHQUFHO0FBQUE7QUFBQTtBQUFBLEVBSXpCLElBQUk7QUFBQSxFQUNKLElBQUksa0JBQWtCLHFCQUFxQixVQUFTLFNBQVMsZUFBZSxDQUFDLEdBQUcsR0FBRztBQUFBLElBQ2pGLElBQUksRUFBRSxlQUFlLEVBQUUsWUFBWTtBQUFBLE1BQ2pDLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxPQUFPLFFBQU8sZ0JBQWdCLEdBQUcsQ0FBQztBQUFBLE1BQ2hDLFNBQVMsZUFBZSxDQUFDLEdBQUcsR0FBRztBQUFBLElBQ2pDLEtBQUssYUFBYTtBQUFBLE1BQ2hCO0FBQUEsSUFDRjtBQUFBLElBRUEsT0FBTyxZQUFZLEdBQUcsQ0FBQztBQUFBO0FBQUEsRUFHekIsU0FBUyxrQkFBa0IsQ0FBQyxNQUFNO0FBQUEsSUFDaEMsT0FBTyxTQUFTLE1BQU0sQ0FBQyxPQUFPLFdBQVcsUUFBUTtBQUFBLE1BQy9DLElBQUksY0FBYyxpQkFBaUIsSUFBSSxFQUFFLE9BQU8sTUFBTTtBQUFBLE1BQ3RELE9BQU8sZ0JBQWdCLFFBQU8sS0FBSyxTQUFTLEdBQUcsUUFBTyxLQUFLLFdBQVcsQ0FBQztBQUFBO0FBQUE7QUFBQSxFQUkzRSxTQUFTLGVBQWUsQ0FBQyxNQUFNO0FBQUEsSUFDOUIsT0FBTyxTQUFTLElBQUksQ0FBQyxPQUFPLFlBQVk7QUFBQSxNQUNyQyxrQkFBa0IsVUFBVTtBQUFBLE1BQzVCLFFBQVEsZUFBZSxLQUFLO0FBQUEsTUFHNUIsSUFBSSxTQUFTLFFBQU8sV0FBVyxZQUFZLElBQUk7QUFBQSxNQUMvQyxJQUFJLE9BQU8sT0FBTyxPQUFPLEtBQUssR0FBRyxPQUFPLEtBQUssWUFBWSxRQUFRO0FBQUEsTUFDakUsT0FBTyxXQUFXLEdBQUc7QUFBQTtBQUFBO0FBQUEsRUFJekIsU0FBUyxpQkFBaUIsQ0FBQyxNQUFNO0FBQUEsSUFDL0IsT0FBTyxTQUFTLE1BQU0sQ0FBQyxPQUFPLFdBQVcsV0FBVztBQUFBLE1BQ2xELGlCQUFpQixTQUFTO0FBQUEsTUFDMUIsUUFBUSxlQUFlLEtBQUs7QUFBQSxNQUM1QixZQUFZLFNBQVMsU0FBUztBQUFBLE1BQzlCLElBQUksV0FBVyxRQUFPLGFBQWEsWUFBWSxJQUFJO0FBQUEsTUFDbkQsU0FBUyxPQUFPLEtBQUs7QUFBQSxNQUNyQixPQUFPLFNBQVMsT0FBTyxXQUFXLFdBQVcsUUFBUTtBQUFBO0FBQUE7QUFBQSxFQUl6RCxTQUFTLGtCQUFrQixDQUFDLE1BQU07QUFBQSxJQUNoQyxPQUFPLFNBQVMsSUFBSSxDQUFDLE9BQU8sWUFBWTtBQUFBLE1BQ3RDLGtCQUFrQixVQUFVO0FBQUEsTUFDNUIsUUFBUSxlQUFlLEtBQUs7QUFBQSxNQUM1QixJQUFJLFNBQVMsUUFBTyxXQUFXLFlBQVksSUFBSTtBQUFBLE1BQy9DLElBQUksT0FBTyxPQUFPLE9BQU8sS0FBSyxHQUFHLE9BQU8sS0FBSztBQUFBLFFBQzNDLEtBQUs7QUFBQSxRQUNMLFNBQVMsUUFBTyxVQUFVO0FBQUEsUUFDMUIsWUFBWSxRQUFPLFVBQVU7QUFBQSxNQUMvQixHQUFHLFFBQVE7QUFBQSxNQUNYLE9BQU8sV0FBVyxHQUFHO0FBQUE7QUFBQTtBQUFBLEVBSXpCLFNBQVMsb0JBQW9CLENBQUMsTUFBTTtBQUFBLElBQ2xDLE9BQU8sU0FBUyxNQUFNLENBQUMsT0FBTyxXQUFXLFdBQVc7QUFBQSxNQUNsRCxpQkFBaUIsU0FBUztBQUFBLE1BQzFCLFFBQVEsZUFBZSxLQUFLO0FBQUEsTUFDNUIsWUFBWSxTQUFTLFNBQVM7QUFBQSxNQUM5QixJQUFJLFdBQVcsUUFBTyxhQUFhLFlBQVksSUFBSTtBQUFBLE1BQ25ELFNBQVMsT0FBTyxLQUFLO0FBQUEsTUFDckIsT0FBTyxTQUFTLE9BQU87QUFBQSxRQUNyQixLQUFLO0FBQUEsUUFDTCxTQUFTLFFBQU8sVUFBVTtBQUFBLFFBQzFCLFlBQVksUUFBTyxVQUFVO0FBQUEsTUFDL0IsR0FBRyxXQUFXLFFBQVE7QUFBQTtBQUFBO0FBQUEsRUFJMUIsU0FBUyxpQkFBaUIsQ0FBQyxNQUFNO0FBQUEsSUFDL0IsSUFBSSxRQUFRLGdCQUFnQixJQUFJO0FBQUEsSUFDaEMsT0FBTyxTQUFTLElBQUksR0FBRztBQUFBLE1BQ3JCLElBQUksWUFBWSxNQUFNLE1BQU0sTUFBTSxTQUFTO0FBQUEsTUFDM0MsWUFBWSxZQUFZLFVBQVUsV0FBVyxPQUFPLElBQUk7QUFBQSxNQUN4RCxPQUFPO0FBQUE7QUFBQTtBQUFBLEVBSVgsU0FBUyxrQkFBa0IsQ0FBQyxNQUFNO0FBQUEsSUFDaEMsSUFBSSxRQUFRLGtCQUFrQixJQUFJO0FBQUEsSUFDbEMsT0FBTyxTQUFTLE1BQU0sQ0FBQyxPQUFPLFdBQVcsV0FBVztBQUFBLE1BQ2xELFlBQVksWUFBWSxVQUFVLFdBQVcsT0FBTyxJQUFJLEVBQUUsU0FBUyxRQUFRO0FBQUEsTUFDM0UsSUFBSSxTQUFTLE1BQU0sT0FBTyxXQUFXLFNBQVM7QUFBQSxNQUM5QyxPQUFPO0FBQUE7QUFBQTtBQUFBLEVBSVgsU0FBUyxnQkFBZ0IsR0FBRztBQUFBLElBQzFCLE9BQU8sU0FBUyxJQUFJLEdBQUc7QUFBQSxNQUNyQixPQUFPO0FBQUE7QUFBQTtBQUFBLEVBSVgsU0FBUyxrQkFBa0IsR0FBRztBQUFBLElBQzVCLE9BQU8sU0FBUyxNQUFNLENBQUMsT0FBTyxXQUFXO0FBQUEsTUFDdkMsT0FBTyxjQUFjO0FBQUE7QUFBQTtBQUFBLEVBSXpCLE9BQU8sVUFBVSxTQUFTLEdBQUcsQ0FBQyxXQUFXO0FBQUEsSUFDdkMsSUFBSSxrQkFBa0I7QUFBQSxNQUNwQixJQUFJO0FBQUEsTUFDSixJQUFJO0FBQUEsTUFDSixJQUFJO0FBQUEsTUFDSixJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsSUFDUjtBQUFBLElBQ0EsSUFBSSxvQkFBb0I7QUFBQSxNQUN0QixJQUFJO0FBQUEsTUFDSixJQUFJO0FBQUEsTUFDSixJQUFJO0FBQUEsTUFDSixJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsSUFDUjtBQUFBLElBQ0EsSUFBSSxRQUFRLFVBQVUsTUFBTSx3Q0FBd0M7QUFBQSxJQUNwRSxLQUFLO0FBQUEsTUFDSCxNQUFNLFVBQVUsdUJBQXVCLFNBQVM7QUFBQSxJQUNsRCxJQUFJLFFBQVEsTUFBTSxNQUFNLE1BQU0sSUFBSSxZQUFZO0FBQUEsSUFDOUMsSUFBSSxPQUFPLE1BQU07QUFBQSxJQUVqQixPQUFPO0FBQUEsTUFDTCxNQUFNLGdCQUFnQixNQUFNLElBQUk7QUFBQSxNQUNoQyxRQUFRLGtCQUFrQixNQUFNLElBQUk7QUFBQSxJQUN0QztBQUFBO0FBQUE7Ozs7RUN2UUYsSUFBSSw4QkFBMkI7QUFBQSxFQUUvQixPQUFPLFVBQVUsU0FBUyxRQUFRLENBQUMsS0FBSztBQUFBLElBQ3RDLElBQUksT0FBTyxRQUFRO0FBQUEsTUFDakIsT0FBTztBQUFBLElBQ1QsSUFBSSxPQUFPLFFBQVEsWUFBWSxRQUFPLFNBQVMsR0FBRztBQUFBLE1BQ2hELE9BQU8sSUFBSSxTQUFTO0FBQUEsSUFDdEIsT0FBTyxLQUFLLFVBQVUsR0FBRztBQUFBO0FBQUE7Ozs7RUNQM0IsSUFBSSxnQ0FBZ0M7QUFBQSxFQUNwQyxJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFFSixTQUFTLFNBQVMsQ0FBQyxRQUFRLFVBQVU7QUFBQSxJQUNuQyxPQUFPLFFBQ0osS0FBSyxRQUFRLFFBQVEsRUFDckIsU0FBUyxRQUFRLEVBQ2pCLFFBQVEsTUFBTSxFQUFFLEVBQ2hCLFFBQVEsT0FBTyxHQUFHLEVBQ2xCLFFBQVEsT0FBTyxHQUFHO0FBQUE7QUFBQSxFQUd2QixTQUFTLGVBQWUsQ0FBQyxRQUFRLFNBQVMsVUFBVTtBQUFBLElBQ2xELFdBQVcsWUFBWTtBQUFBLElBQ3ZCLElBQUksZ0JBQWdCLFVBQVUsU0FBUyxNQUFNLEdBQUcsUUFBUTtBQUFBLElBQ3hELElBQUksaUJBQWlCLFVBQVUsU0FBUyxPQUFPLEdBQUcsUUFBUTtBQUFBLElBQzFELE9BQU8sS0FBSyxPQUFPLFNBQVMsZUFBZSxjQUFjO0FBQUE7QUFBQSxFQUczRCxTQUFTLE9BQU8sQ0FBQyxNQUFNO0FBQUEsSUFDckIsSUFBSSxTQUFTLEtBQUs7QUFBQSxJQUNsQixJQUFJLFVBQVUsS0FBSztBQUFBLElBQ25CLElBQUksY0FBYyxLQUFLLFVBQVUsS0FBSztBQUFBLElBQ3RDLElBQUksV0FBVyxLQUFLO0FBQUEsSUFDcEIsSUFBSSxPQUFPLElBQUksT0FBTyxHQUFHO0FBQUEsSUFDekIsSUFBSSxlQUFlLGdCQUFnQixRQUFRLFNBQVMsUUFBUTtBQUFBLElBQzVELElBQUksWUFBWSxLQUFLLEtBQUssY0FBYyxXQUFXO0FBQUEsSUFDbkQsT0FBTyxLQUFLLE9BQU8sU0FBUyxjQUFjLFNBQVM7QUFBQTtBQUFBLEVBR3JELFNBQVMsVUFBVSxDQUFDLE1BQU07QUFBQSxJQUN4QixJQUFJLFNBQVMsS0FBSyxVQUFRLEtBQUssY0FBWSxLQUFLO0FBQUEsSUFDaEQsSUFBSSxlQUFlLElBQUksV0FBVyxNQUFNO0FBQUEsSUFDeEMsS0FBSyxXQUFXO0FBQUEsSUFDaEIsS0FBSyxTQUFTLEtBQUs7QUFBQSxJQUNuQixLQUFLLFdBQVcsS0FBSztBQUFBLElBQ3JCLEtBQUssU0FBUyxLQUFLLGFBQWEsS0FBSyxNQUFNO0FBQUEsSUFDM0MsS0FBSyxVQUFVLElBQUksV0FBVyxLQUFLLE9BQU87QUFBQSxJQUMxQyxLQUFLLE9BQU8sS0FBSyxTQUFTLFFBQVMsR0FBRztBQUFBLE1BQ3BDLEtBQUssS0FBSyxRQUFRLFlBQVksS0FBSztBQUFBLFFBQ2pDLEtBQUssS0FBSztBQUFBLE1BQ1osS0FBSyxJQUFJLENBQUM7QUFBQSxJQUVaLEtBQUssUUFBUSxLQUFLLFNBQVMsUUFBUyxHQUFHO0FBQUEsTUFDckMsS0FBSyxLQUFLLE9BQU8sWUFBWSxLQUFLO0FBQUEsUUFDaEMsS0FBSyxLQUFLO0FBQUEsTUFDWixLQUFLLElBQUksQ0FBQztBQUFBO0FBQUEsRUFFZCxLQUFLLFNBQVMsWUFBWSxNQUFNO0FBQUEsRUFFaEMsV0FBVyxVQUFVLE9BQU8sU0FBUyxJQUFJLEdBQUc7QUFBQSxJQUMxQyxJQUFJO0FBQUEsTUFDRixJQUFJLFlBQVksUUFBUTtBQUFBLFFBQ3RCLFFBQVEsS0FBSztBQUFBLFFBQ2IsU0FBUyxLQUFLLFFBQVE7QUFBQSxRQUN0QixRQUFRLEtBQUssT0FBTztBQUFBLFFBQ3BCLFVBQVUsS0FBSztBQUFBLE1BQ2pCLENBQUM7QUFBQSxNQUNELEtBQUssS0FBSyxRQUFRLFNBQVM7QUFBQSxNQUMzQixLQUFLLEtBQUssUUFBUSxTQUFTO0FBQUEsTUFDM0IsS0FBSyxLQUFLLEtBQUs7QUFBQSxNQUNmLEtBQUssV0FBVztBQUFBLE1BQ2hCLE9BQU87QUFBQSxNQUNQLE9BQU8sR0FBRztBQUFBLE1BQ1YsS0FBSyxXQUFXO0FBQUEsTUFDaEIsS0FBSyxLQUFLLFNBQVMsQ0FBQztBQUFBLE1BQ3BCLEtBQUssS0FBSyxPQUFPO0FBQUE7QUFBQTtBQUFBLEVBSXJCLFdBQVcsT0FBTztBQUFBLEVBRWxCLE9BQU8sVUFBVTtBQUFBOzs7O0VDNUVqQixJQUFJLGdDQUFnQztBQUFBLEVBQ3BDLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLElBQUksWUFBWTtBQUFBLEVBRWhCLFNBQVMsUUFBUSxDQUFDLE9BQU87QUFBQSxJQUN2QixPQUFPLE9BQU8sVUFBVSxTQUFTLEtBQUssS0FBSyxNQUFNO0FBQUE7QUFBQSxFQUduRCxTQUFTLGFBQWEsQ0FBQyxPQUFPO0FBQUEsSUFDNUIsSUFBSSxTQUFTLEtBQUs7QUFBQSxNQUNoQixPQUFPO0FBQUEsSUFDVCxJQUFJO0FBQUEsTUFBRSxPQUFPLEtBQUssTUFBTSxLQUFLO0FBQUEsTUFDN0IsT0FBTyxHQUFHO0FBQUEsTUFBRTtBQUFBO0FBQUE7QUFBQSxFQUdkLFNBQVMsYUFBYSxDQUFDLFFBQVE7QUFBQSxJQUM3QixJQUFJLGdCQUFnQixPQUFPLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFBQSxJQUN6QyxPQUFPLGNBQWMsUUFBTyxLQUFLLGVBQWUsUUFBUSxFQUFFLFNBQVMsUUFBUSxDQUFDO0FBQUE7QUFBQSxFQUc5RSxTQUFTLG1CQUFtQixDQUFDLFFBQVE7QUFBQSxJQUNuQyxPQUFPLE9BQU8sTUFBTSxLQUFLLENBQUMsRUFBRSxLQUFLLEdBQUc7QUFBQTtBQUFBLEVBR3RDLFNBQVMsZ0JBQWdCLENBQUMsUUFBUTtBQUFBLElBQ2hDLE9BQU8sT0FBTyxNQUFNLEdBQUcsRUFBRTtBQUFBO0FBQUEsRUFHM0IsU0FBUyxjQUFjLENBQUMsUUFBUSxVQUFVO0FBQUEsSUFDeEMsV0FBVyxZQUFZO0FBQUEsSUFDdkIsSUFBSSxVQUFVLE9BQU8sTUFBTSxHQUFHLEVBQUU7QUFBQSxJQUNoQyxPQUFPLFFBQU8sS0FBSyxTQUFTLFFBQVEsRUFBRSxTQUFTLFFBQVE7QUFBQTtBQUFBLEVBR3pELFNBQVMsVUFBVSxDQUFDLFFBQVE7QUFBQSxJQUMxQixPQUFPLFVBQVUsS0FBSyxNQUFNLE9BQU8sY0FBYyxNQUFNO0FBQUE7QUFBQSxFQUd6RCxTQUFTLFNBQVMsQ0FBQyxRQUFRLFdBQVcsYUFBYTtBQUFBLElBQ2pELEtBQUssV0FBVztBQUFBLE1BQ2QsSUFBSSxNQUFNLElBQUksTUFBTSw0Q0FBNEM7QUFBQSxNQUNoRSxJQUFJLE9BQU87QUFBQSxNQUNYLE1BQU07QUFBQSxJQUNSO0FBQUEsSUFDQSxTQUFTLFNBQVMsTUFBTTtBQUFBLElBQ3hCLElBQUksWUFBWSxpQkFBaUIsTUFBTTtBQUFBLElBQ3ZDLElBQUksZUFBZSxvQkFBb0IsTUFBTTtBQUFBLElBQzdDLElBQUksT0FBTyxJQUFJLFNBQVM7QUFBQSxJQUN4QixPQUFPLEtBQUssT0FBTyxjQUFjLFdBQVcsV0FBVztBQUFBO0FBQUEsRUFHekQsU0FBUyxTQUFTLENBQUMsUUFBUSxNQUFNO0FBQUEsSUFDL0IsT0FBTyxRQUFRLENBQUM7QUFBQSxJQUNoQixTQUFTLFNBQVMsTUFBTTtBQUFBLElBRXhCLEtBQUssV0FBVyxNQUFNO0FBQUEsTUFDcEIsT0FBTztBQUFBLElBRVQsSUFBSSxTQUFTLGNBQWMsTUFBTTtBQUFBLElBRWpDLEtBQUs7QUFBQSxNQUNILE9BQU87QUFBQSxJQUVULElBQUksVUFBVSxlQUFlLE1BQU07QUFBQSxJQUNuQyxJQUFJLE9BQU8sUUFBUSxTQUFTLEtBQUs7QUFBQSxNQUMvQixVQUFVLEtBQUssTUFBTSxTQUFTLEtBQUssUUFBUTtBQUFBLElBRTdDLE9BQU87QUFBQSxNQUNMO0FBQUEsTUFDQTtBQUFBLE1BQ0EsV0FBVyxpQkFBaUIsTUFBTTtBQUFBLElBQ3BDO0FBQUE7QUFBQSxFQUdGLFNBQVMsWUFBWSxDQUFDLE1BQU07QUFBQSxJQUMxQixPQUFPLFFBQVEsQ0FBQztBQUFBLElBQ2hCLElBQUksY0FBYyxLQUFLLFVBQVEsS0FBSyxhQUFXLEtBQUs7QUFBQSxJQUNwRCxJQUFJLGVBQWUsSUFBSSxXQUFXLFdBQVc7QUFBQSxJQUM3QyxLQUFLLFdBQVc7QUFBQSxJQUNoQixLQUFLLFlBQVksS0FBSztBQUFBLElBQ3RCLEtBQUssV0FBVyxLQUFLO0FBQUEsSUFDckIsS0FBSyxTQUFTLEtBQUssWUFBWSxLQUFLLE1BQU07QUFBQSxJQUMxQyxLQUFLLFlBQVksSUFBSSxXQUFXLEtBQUssU0FBUztBQUFBLElBQzlDLEtBQUssT0FBTyxLQUFLLFNBQVMsUUFBUyxHQUFHO0FBQUEsTUFDcEMsS0FBSyxLQUFLLFVBQVUsWUFBWSxLQUFLO0FBQUEsUUFDbkMsS0FBSyxPQUFPO0FBQUEsTUFDZCxLQUFLLElBQUksQ0FBQztBQUFBLElBRVosS0FBSyxVQUFVLEtBQUssU0FBUyxRQUFTLEdBQUc7QUFBQSxNQUN2QyxLQUFLLEtBQUssT0FBTyxZQUFZLEtBQUs7QUFBQSxRQUNoQyxLQUFLLE9BQU87QUFBQSxNQUNkLEtBQUssSUFBSSxDQUFDO0FBQUE7QUFBQSxFQUVkLEtBQUssU0FBUyxjQUFjLE1BQU07QUFBQSxFQUNsQyxhQUFhLFVBQVUsU0FBUyxTQUFTLE1BQU0sR0FBRztBQUFBLElBQ2hELElBQUk7QUFBQSxNQUNGLElBQUksUUFBUSxVQUFVLEtBQUssVUFBVSxRQUFRLEtBQUssV0FBVyxLQUFLLElBQUksTUFBTTtBQUFBLE1BQzVFLElBQUksTUFBTSxVQUFVLEtBQUssVUFBVSxRQUFRLEtBQUssUUFBUTtBQUFBLE1BQ3hELEtBQUssS0FBSyxRQUFRLE9BQU8sR0FBRztBQUFBLE1BQzVCLEtBQUssS0FBSyxRQUFRLEtBQUs7QUFBQSxNQUN2QixLQUFLLEtBQUssS0FBSztBQUFBLE1BQ2YsS0FBSyxXQUFXO0FBQUEsTUFDaEIsT0FBTztBQUFBLE1BQ1AsT0FBTyxHQUFHO0FBQUEsTUFDVixLQUFLLFdBQVc7QUFBQSxNQUNoQixLQUFLLEtBQUssU0FBUyxDQUFDO0FBQUEsTUFDcEIsS0FBSyxLQUFLLE9BQU87QUFBQTtBQUFBO0FBQUEsRUFJckIsYUFBYSxTQUFTO0FBQUEsRUFDdEIsYUFBYSxVQUFVO0FBQUEsRUFDdkIsYUFBYSxTQUFTO0FBQUEsRUFFdEIsT0FBTyxVQUFVO0FBQUE7Ozs7RUN0SGpCLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUVKLElBQUksYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUFTO0FBQUEsSUFBUztBQUFBLElBQ2xCO0FBQUEsSUFBUztBQUFBLElBQVM7QUFBQSxJQUNsQjtBQUFBLElBQVM7QUFBQSxJQUFTO0FBQUEsSUFDbEI7QUFBQSxJQUFTO0FBQUEsSUFBUztBQUFBLEVBQ3BCO0FBQUEsRUFFUSxxQkFBYTtBQUFBLEVBQ2IsZUFBTyxXQUFXO0FBQUEsRUFDbEIsaUJBQVMsYUFBYTtBQUFBLEVBQ3RCLGlCQUFTLGFBQWE7QUFBQSxFQUN0QixrQkFBVSxhQUFhO0FBQUEsRUFDdkIscUJBQWEsU0FBUyxVQUFVLENBQUMsTUFBTTtBQUFBLElBQzdDLE9BQU8sSUFBSSxXQUFXLElBQUk7QUFBQTtBQUFBLEVBRXBCLHVCQUFlLFNBQVMsWUFBWSxDQUFDLE1BQU07QUFBQSxJQUNqRCxPQUFPLElBQUksYUFBYSxJQUFJO0FBQUE7QUFBQTs7OztFQ3BCOUIsSUFBSTtBQUFBLEVBRUosT0FBTyxVQUFVLFFBQVMsQ0FBQyxLQUFLLFVBQVM7QUFBQSxJQUN2QyxXQUFVLFlBQVcsQ0FBQztBQUFBLElBQ3RCLElBQUksVUFBVSxJQUFJLE9BQU8sS0FBSyxRQUFPO0FBQUEsSUFDckMsS0FBSyxTQUFTO0FBQUEsTUFBRSxPQUFPO0FBQUEsSUFBTTtBQUFBLElBQzdCLElBQUksVUFBVSxRQUFRO0FBQUEsSUFHdEIsSUFBRyxPQUFPLFlBQVksVUFBVTtBQUFBLE1BQzlCLElBQUk7QUFBQSxRQUNGLElBQUksTUFBTSxLQUFLLE1BQU0sT0FBTztBQUFBLFFBQzVCLElBQUcsUUFBUSxRQUFRLE9BQU8sUUFBUSxVQUFVO0FBQUEsVUFDMUMsVUFBVTtBQUFBLFFBQ1o7QUFBQSxRQUNBLE9BQU8sR0FBRztBQUFBLElBQ2Q7QUFBQSxJQUtBLElBQUksU0FBUSxhQUFhLE1BQU07QUFBQSxNQUM3QixPQUFPO0FBQUEsUUFDTCxRQUFRLFFBQVE7QUFBQSxRQUNoQjtBQUFBLFFBQ0EsV0FBVyxRQUFRO0FBQUEsTUFDckI7QUFBQSxJQUNGO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQTs7OztFQzVCVCxJQUFJLG9CQUFvQixRQUFTLENBQUMsU0FBUyxPQUFPO0FBQUEsSUFDaEQsTUFBTSxLQUFLLE1BQU0sT0FBTztBQUFBLElBQ3hCLElBQUcsTUFBTSxtQkFBbUI7QUFBQSxNQUMxQixNQUFNLGtCQUFrQixNQUFNLEtBQUssV0FBVztBQUFBLElBQ2hEO0FBQUEsSUFDQSxLQUFLLE9BQU87QUFBQSxJQUNaLEtBQUssVUFBVTtBQUFBLElBQ2YsSUFBSTtBQUFBLE1BQU8sS0FBSyxRQUFRO0FBQUE7QUFBQSxFQUcxQixrQkFBa0IsWUFBWSxPQUFPLE9BQU8sTUFBTSxTQUFTO0FBQUEsRUFDM0Qsa0JBQWtCLFVBQVUsY0FBYztBQUFBLEVBRTFDLE9BQU8sVUFBVTtBQUFBOzs7O0VDYmpCLElBQUk7QUFBQSxFQUVKLElBQUksaUJBQWlCLFFBQVMsQ0FBQyxTQUFTLE1BQU07QUFBQSxJQUM1QyxrQkFBa0IsS0FBSyxNQUFNLE9BQU87QUFBQSxJQUNwQyxLQUFLLE9BQU87QUFBQSxJQUNaLEtBQUssT0FBTztBQUFBO0FBQUEsRUFHZCxlQUFlLFlBQVksT0FBTyxPQUFPLGtCQUFrQixTQUFTO0FBQUEsRUFFcEUsZUFBZSxVQUFVLGNBQWM7QUFBQSxFQUV2QyxPQUFPLFVBQVU7QUFBQTs7OztFQ1pqQixJQUFJO0FBQUEsRUFFSixJQUFJLG9CQUFvQixRQUFTLENBQUMsU0FBUyxXQUFXO0FBQUEsSUFDcEQsa0JBQWtCLEtBQUssTUFBTSxPQUFPO0FBQUEsSUFDcEMsS0FBSyxPQUFPO0FBQUEsSUFDWixLQUFLLFlBQVk7QUFBQTtBQUFBLEVBR25CLGtCQUFrQixZQUFZLE9BQU8sT0FBTyxrQkFBa0IsU0FBUztBQUFBLEVBRXZFLGtCQUFrQixVQUFVLGNBQWM7QUFBQSxFQUUxQyxPQUFPLFVBQVU7QUFBQTs7OztFQ1JqQixJQUFJLElBQUk7QUFBQSxFQUNSLElBQUksSUFBSSxJQUFJO0FBQUEsRUFDWixJQUFJLElBQUksSUFBSTtBQUFBLEVBQ1osSUFBSSxJQUFJLElBQUk7QUFBQSxFQUNaLElBQUksSUFBSSxJQUFJO0FBQUEsRUFDWixJQUFJLElBQUksSUFBSTtBQUFBLEVBZ0JaLE9BQU8sVUFBVSxRQUFTLENBQUMsS0FBSyxVQUFTO0FBQUEsSUFDdkMsV0FBVSxZQUFXLENBQUM7QUFBQSxJQUN0QixJQUFJLE9BQU8sT0FBTztBQUFBLElBQ2xCLElBQUksU0FBUyxZQUFZLElBQUksU0FBUyxHQUFHO0FBQUEsTUFDdkMsT0FBTyxNQUFNLEdBQUc7QUFBQSxJQUNsQixFQUFPLFNBQUksU0FBUyxZQUFZLFNBQVMsR0FBRyxHQUFHO0FBQUEsTUFDN0MsT0FBTyxTQUFRLE9BQU8sUUFBUSxHQUFHLElBQUksU0FBUyxHQUFHO0FBQUEsSUFDbkQ7QUFBQSxJQUNBLE1BQU0sSUFBSSxNQUNSLDBEQUNFLEtBQUssVUFBVSxHQUFHLENBQ3RCO0FBQUE7QUFBQSxFQVdGLFNBQVMsS0FBSyxDQUFDLEtBQUs7QUFBQSxJQUNsQixNQUFNLE9BQU8sR0FBRztBQUFBLElBQ2hCLElBQUksSUFBSSxTQUFTLEtBQUs7QUFBQSxNQUNwQjtBQUFBLElBQ0Y7QUFBQSxJQUNBLElBQUksUUFBUSxtSUFBbUksS0FDN0ksR0FDRjtBQUFBLElBQ0EsS0FBSyxPQUFPO0FBQUEsTUFDVjtBQUFBLElBQ0Y7QUFBQSxJQUNBLElBQUksSUFBSSxXQUFXLE1BQU0sRUFBRTtBQUFBLElBQzNCLElBQUksUUFBUSxNQUFNLE1BQU0sTUFBTSxZQUFZO0FBQUEsSUFDMUMsUUFBUTtBQUFBLFdBQ0Q7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsUUFDSCxPQUFPLElBQUk7QUFBQSxXQUNSO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxRQUNILE9BQU8sSUFBSTtBQUFBLFdBQ1I7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFFBQ0gsT0FBTyxJQUFJO0FBQUEsV0FDUjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxRQUNILE9BQU8sSUFBSTtBQUFBLFdBQ1I7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsUUFDSCxPQUFPLElBQUk7QUFBQSxXQUNSO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFFBQ0gsT0FBTyxJQUFJO0FBQUEsV0FDUjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxRQUNILE9BQU87QUFBQTtBQUFBLFFBRVA7QUFBQTtBQUFBO0FBQUEsRUFZTixTQUFTLFFBQVEsQ0FBQyxJQUFJO0FBQUEsSUFDcEIsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFO0FBQUEsSUFDdkIsSUFBSSxTQUFTLEdBQUc7QUFBQSxNQUNkLE9BQU8sS0FBSyxNQUFNLEtBQUssQ0FBQyxJQUFJO0FBQUEsSUFDOUI7QUFBQSxJQUNBLElBQUksU0FBUyxHQUFHO0FBQUEsTUFDZCxPQUFPLEtBQUssTUFBTSxLQUFLLENBQUMsSUFBSTtBQUFBLElBQzlCO0FBQUEsSUFDQSxJQUFJLFNBQVMsR0FBRztBQUFBLE1BQ2QsT0FBTyxLQUFLLE1BQU0sS0FBSyxDQUFDLElBQUk7QUFBQSxJQUM5QjtBQUFBLElBQ0EsSUFBSSxTQUFTLEdBQUc7QUFBQSxNQUNkLE9BQU8sS0FBSyxNQUFNLEtBQUssQ0FBQyxJQUFJO0FBQUEsSUFDOUI7QUFBQSxJQUNBLE9BQU8sS0FBSztBQUFBO0FBQUEsRUFXZCxTQUFTLE9BQU8sQ0FBQyxJQUFJO0FBQUEsSUFDbkIsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFO0FBQUEsSUFDdkIsSUFBSSxTQUFTLEdBQUc7QUFBQSxNQUNkLE9BQU8sT0FBTyxJQUFJLE9BQU8sR0FBRyxLQUFLO0FBQUEsSUFDbkM7QUFBQSxJQUNBLElBQUksU0FBUyxHQUFHO0FBQUEsTUFDZCxPQUFPLE9BQU8sSUFBSSxPQUFPLEdBQUcsTUFBTTtBQUFBLElBQ3BDO0FBQUEsSUFDQSxJQUFJLFNBQVMsR0FBRztBQUFBLE1BQ2QsT0FBTyxPQUFPLElBQUksT0FBTyxHQUFHLFFBQVE7QUFBQSxJQUN0QztBQUFBLElBQ0EsSUFBSSxTQUFTLEdBQUc7QUFBQSxNQUNkLE9BQU8sT0FBTyxJQUFJLE9BQU8sR0FBRyxRQUFRO0FBQUEsSUFDdEM7QUFBQSxJQUNBLE9BQU8sS0FBSztBQUFBO0FBQUEsRUFPZCxTQUFTLE1BQU0sQ0FBQyxJQUFJLE9BQU8sR0FBRyxNQUFNO0FBQUEsSUFDbEMsSUFBSSxXQUFXLFNBQVMsSUFBSTtBQUFBLElBQzVCLE9BQU8sS0FBSyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sUUFBUSxXQUFXLE1BQU07QUFBQTtBQUFBOzs7O0VDaEs3RCxJQUFJO0FBQUEsRUFFSixPQUFPLFVBQVUsUUFBUyxDQUFDLE1BQU0sS0FBSztBQUFBLElBQ3BDLElBQUksWUFBWSxPQUFPLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxJQUFJO0FBQUEsSUFFbkQsSUFBSSxPQUFPLFNBQVMsVUFBVTtBQUFBLE1BQzVCLElBQUksZUFBZSxHQUFHLElBQUk7QUFBQSxNQUMxQixJQUFJLE9BQU8saUJBQWlCLGFBQWE7QUFBQSxRQUN2QztBQUFBLE1BQ0Y7QUFBQSxNQUNBLE9BQU8sS0FBSyxNQUFNLFlBQVksZUFBZSxJQUFJO0FBQUEsSUFDbkQsRUFBTyxTQUFJLE9BQU8sU0FBUyxVQUFVO0FBQUEsTUFDbkMsT0FBTyxZQUFZO0FBQUEsSUFDckIsRUFBTztBQUFBLE1BQ0w7QUFBQTtBQUFBO0FBQUE7Ozs7RUNWSixJQUFNLHNCQUFzQjtBQUFBLEVBRTVCLElBQU0sYUFBYTtBQUFBLEVBQ25CLElBQU0sbUJBQW1CLE9BQU8sb0JBQ0w7QUFBQSxFQUczQixJQUFNLDRCQUE0QjtBQUFBLEVBSWxDLElBQU0sd0JBQXdCLGFBQWE7QUFBQSxFQUUzQyxJQUFNLGdCQUFnQjtBQUFBLElBQ3BCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUFBLEVBRUEsT0FBTyxVQUFVO0FBQUEsSUFDZjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSx5QkFBeUI7QUFBQSxJQUN6QixZQUFZO0FBQUEsRUFDZDtBQUFBOzs7O0VDbENBLElBQU0sUUFDSixPQUFPLFlBQVksWUFDbkIsUUFBUSxPQUNSLFFBQVEsSUFBSSxjQUNaLGNBQWMsS0FBSyxRQUFRLElBQUksVUFBVSxJQUN2QyxJQUFJLFNBQVMsUUFBUSxNQUFNLFVBQVUsR0FBRyxJQUFJLElBQzVDLE1BQU07QUFBQSxFQUVWLE9BQU8sVUFBVTtBQUFBOzs7O0VDUmpCO0FBQUEsSUFDRTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUE7QUFBQSxFQUVGLElBQU07QUFBQSxFQUNOLFVBQVUsT0FBTyxVQUFVLENBQUM7QUFBQSxFQUc1QixJQUFNLEtBQUssUUFBUSxLQUFLLENBQUM7QUFBQSxFQUN6QixJQUFNLFNBQVMsUUFBUSxTQUFTLENBQUM7QUFBQSxFQUNqQyxJQUFNLE1BQU0sUUFBUSxNQUFNLENBQUM7QUFBQSxFQUMzQixJQUFNLFVBQVUsUUFBUSxVQUFVLENBQUM7QUFBQSxFQUNuQyxJQUFNLElBQUksUUFBUSxJQUFJLENBQUM7QUFBQSxFQUN2QixJQUFJLElBQUk7QUFBQSxFQUVSLElBQU0sbUJBQW1CO0FBQUEsRUFRekIsSUFBTSx3QkFBd0I7QUFBQSxJQUM1QixDQUFDLE9BQU8sQ0FBQztBQUFBLElBQ1QsQ0FBQyxPQUFPLFVBQVU7QUFBQSxJQUNsQixDQUFDLGtCQUFrQixxQkFBcUI7QUFBQSxFQUMxQztBQUFBLEVBRUEsSUFBTSxnQkFBZ0IsQ0FBQyxVQUFVO0FBQUEsSUFDL0IsWUFBWSxPQUFPLFFBQVEsdUJBQXVCO0FBQUEsTUFDaEQsUUFBUSxNQUNMLE1BQU0sR0FBRyxRQUFRLEVBQUUsS0FBSyxHQUFHLFdBQVcsTUFBTSxFQUM1QyxNQUFNLEdBQUcsUUFBUSxFQUFFLEtBQUssR0FBRyxXQUFXLE1BQU07QUFBQSxJQUNqRDtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFHVCxJQUFNLGNBQWMsQ0FBQyxNQUFNLE9BQU8sYUFBYTtBQUFBLElBQzdDLE1BQU0sT0FBTyxjQUFjLEtBQUs7QUFBQSxJQUNoQyxNQUFNLFNBQVE7QUFBQSxJQUNkLE1BQU0sTUFBTSxRQUFPLEtBQUs7QUFBQSxJQUN4QixFQUFFLFFBQVE7QUFBQSxJQUNWLElBQUksVUFBUztBQUFBLElBQ2IsUUFBUSxVQUFTO0FBQUEsSUFDakIsR0FBRyxVQUFTLElBQUksT0FBTyxPQUFPLFdBQVcsTUFBTSxTQUFTO0FBQUEsSUFDeEQsT0FBTyxVQUFTLElBQUksT0FBTyxNQUFNLFdBQVcsTUFBTSxTQUFTO0FBQUE7QUFBQSxFQVM3RCxZQUFZLHFCQUFxQixhQUFhO0FBQUEsRUFDOUMsWUFBWSwwQkFBMEIsTUFBTTtBQUFBLEVBTTVDLFlBQVksd0JBQXdCLGdCQUFnQixtQkFBbUI7QUFBQSxFQUt2RSxZQUFZLGVBQWUsSUFBSSxJQUFJLEVBQUUsMkJBQ2xCLElBQUksSUFBSSxFQUFFLDJCQUNWLElBQUksSUFBSSxFQUFFLHFCQUFxQjtBQUFBLEVBRWxELFlBQVksb0JBQW9CLElBQUksSUFBSSxFQUFFLGdDQUNsQixJQUFJLElBQUksRUFBRSxnQ0FDVixJQUFJLElBQUksRUFBRSwwQkFBMEI7QUFBQSxFQU81RCxZQUFZLHdCQUF3QixNQUFNLElBQUksRUFBRSx5QkFDNUMsSUFBSSxFQUFFLHFCQUFxQjtBQUFBLEVBRS9CLFlBQVksNkJBQTZCLE1BQU0sSUFBSSxFQUFFLHlCQUNqRCxJQUFJLEVBQUUsMEJBQTBCO0FBQUEsRUFNcEMsWUFBWSxjQUFjLFFBQVEsSUFBSSxFQUFFLDhCQUMvQixJQUFJLEVBQUUsMkJBQTJCO0FBQUEsRUFFMUMsWUFBWSxtQkFBbUIsU0FBUyxJQUFJLEVBQUUsbUNBQ3JDLElBQUksRUFBRSxnQ0FBZ0M7QUFBQSxFQUsvQyxZQUFZLG1CQUFtQixHQUFHLG1CQUFtQjtBQUFBLEVBTXJELFlBQVksU0FBUyxVQUFVLElBQUksRUFBRSx5QkFDNUIsSUFBSSxFQUFFLHNCQUFzQjtBQUFBLEVBV3JDLFlBQVksYUFBYSxLQUFLLElBQUksRUFBRSxlQUNqQyxJQUFJLEVBQUUsZUFDUCxJQUFJLEVBQUUsU0FBUztBQUFBLEVBRWpCLFlBQVksUUFBUSxJQUFJLElBQUksRUFBRSxhQUFhO0FBQUEsRUFLM0MsWUFBWSxjQUFjLFdBQVcsSUFBSSxFQUFFLG9CQUN4QyxJQUFJLEVBQUUsb0JBQ1AsSUFBSSxFQUFFLFNBQVM7QUFBQSxFQUVqQixZQUFZLFNBQVMsSUFBSSxJQUFJLEVBQUUsY0FBYztBQUFBLEVBRTdDLFlBQVksUUFBUSxjQUFjO0FBQUEsRUFLbEMsWUFBWSx5QkFBeUIsR0FBRyxJQUFJLEVBQUUsaUNBQWlDO0FBQUEsRUFDL0UsWUFBWSxvQkFBb0IsR0FBRyxJQUFJLEVBQUUsNEJBQTRCO0FBQUEsRUFFckUsWUFBWSxlQUFlLFlBQVksSUFBSSxFQUFFLHVCQUMxQixVQUFVLElBQUksRUFBRSx1QkFDaEIsVUFBVSxJQUFJLEVBQUUsdUJBQ2hCLE1BQU0sSUFBSSxFQUFFLGdCQUNWLElBQUksRUFBRSxZQUNSLE1BQU07QUFBQSxFQUV6QixZQUFZLG9CQUFvQixZQUFZLElBQUksRUFBRSw0QkFDMUIsVUFBVSxJQUFJLEVBQUUsNEJBQ2hCLFVBQVUsSUFBSSxFQUFFLDRCQUNoQixNQUFNLElBQUksRUFBRSxxQkFDVixJQUFJLEVBQUUsWUFDUixNQUFNO0FBQUEsRUFFOUIsWUFBWSxVQUFVLElBQUksSUFBSSxFQUFFLFlBQVksSUFBSSxFQUFFLGVBQWU7QUFBQSxFQUNqRSxZQUFZLGVBQWUsSUFBSSxJQUFJLEVBQUUsWUFBWSxJQUFJLEVBQUUsb0JBQW9CO0FBQUEsRUFJM0UsWUFBWSxlQUFlLEdBQUcsZUFDaEIsWUFBWSxnQ0FDWixnQkFBZ0Isa0NBQ2hCLGdCQUFnQiwrQkFBK0I7QUFBQSxFQUM3RCxZQUFZLFVBQVUsR0FBRyxJQUFJLEVBQUUsMEJBQTBCO0FBQUEsRUFDekQsWUFBWSxjQUFjLElBQUksRUFBRSxlQUNsQixNQUFNLElBQUksRUFBRSxrQkFDWixNQUFNLElBQUksRUFBRSxhQUNaLGNBQWM7QUFBQSxFQUM1QixZQUFZLGFBQWEsSUFBSSxFQUFFLFNBQVMsSUFBSTtBQUFBLEVBQzVDLFlBQVksaUJBQWlCLElBQUksRUFBRSxhQUFhLElBQUk7QUFBQSxFQUlwRCxZQUFZLGFBQWEsU0FBUztBQUFBLEVBRWxDLFlBQVksYUFBYSxTQUFTLElBQUksRUFBRSxrQkFBa0IsSUFBSTtBQUFBLEVBQzlELFFBQVEsbUJBQW1CO0FBQUEsRUFFM0IsWUFBWSxTQUFTLElBQUksSUFBSSxFQUFFLGFBQWEsSUFBSSxFQUFFLGVBQWU7QUFBQSxFQUNqRSxZQUFZLGNBQWMsSUFBSSxJQUFJLEVBQUUsYUFBYSxJQUFJLEVBQUUsb0JBQW9CO0FBQUEsRUFJM0UsWUFBWSxhQUFhLFNBQVM7QUFBQSxFQUVsQyxZQUFZLGFBQWEsU0FBUyxJQUFJLEVBQUUsa0JBQWtCLElBQUk7QUFBQSxFQUM5RCxRQUFRLG1CQUFtQjtBQUFBLEVBRTNCLFlBQVksU0FBUyxJQUFJLElBQUksRUFBRSxhQUFhLElBQUksRUFBRSxlQUFlO0FBQUEsRUFDakUsWUFBWSxjQUFjLElBQUksSUFBSSxFQUFFLGFBQWEsSUFBSSxFQUFFLG9CQUFvQjtBQUFBLEVBRzNFLFlBQVksbUJBQW1CLElBQUksSUFBSSxFQUFFLGFBQWEsSUFBSSxFQUFFLGtCQUFrQjtBQUFBLEVBQzlFLFlBQVksY0FBYyxJQUFJLElBQUksRUFBRSxhQUFhLElBQUksRUFBRSxpQkFBaUI7QUFBQSxFQUl4RSxZQUFZLGtCQUFrQixTQUFTLElBQUksRUFBRSxhQUNyQyxJQUFJLEVBQUUsZUFBZSxJQUFJLEVBQUUsaUJBQWlCLElBQUk7QUFBQSxFQUN4RCxRQUFRLHdCQUF3QjtBQUFBLEVBTWhDLFlBQVksZUFBZSxTQUFTLElBQUksRUFBRSxrQkFDdkIsY0FDQSxJQUFJLElBQUksRUFBRSxrQkFDVixPQUFPO0FBQUEsRUFFMUIsWUFBWSxvQkFBb0IsU0FBUyxJQUFJLEVBQUUsdUJBQ3ZCLGNBQ0EsSUFBSSxJQUFJLEVBQUUsdUJBQ1YsT0FBTztBQUFBLEVBRy9CLFlBQVksUUFBUSxpQkFBaUI7QUFBQSxFQUVyQyxZQUFZLFFBQVEsMkJBQTJCO0FBQUEsRUFDL0MsWUFBWSxXQUFXLDZCQUE2QjtBQUFBOzs7O0VDM05wRCxJQUFNLGNBQWMsT0FBTyxPQUFPLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFBQSxFQUNqRCxJQUFNLFlBQVksT0FBTyxPQUFPLENBQUUsQ0FBQztBQUFBLEVBQ25DLElBQU0sZUFBZSxjQUFXO0FBQUEsSUFDOUIsS0FBSyxVQUFTO0FBQUEsTUFDWixPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsSUFBSSxPQUFPLGFBQVksVUFBVTtBQUFBLE1BQy9CLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxPQUFPO0FBQUE7QUFBQSxFQUVULE9BQU8sVUFBVTtBQUFBOzs7O0VDZGpCLElBQU0sV0FBVTtBQUFBLEVBQ2hCLElBQU0scUJBQXFCLENBQUMsR0FBRyxNQUFNO0FBQUEsSUFDbkMsTUFBTSxPQUFPLFNBQVEsS0FBSyxDQUFDO0FBQUEsSUFDM0IsTUFBTSxPQUFPLFNBQVEsS0FBSyxDQUFDO0FBQUEsSUFFM0IsSUFBSSxRQUFRLE1BQU07QUFBQSxNQUNoQixLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsSUFDUDtBQUFBLElBRUEsT0FBTyxNQUFNLElBQUksSUFDWixTQUFTLE9BQVEsS0FDakIsU0FBUyxPQUFRLElBQ2xCLElBQUksSUFBSSxLQUNSO0FBQUE7QUFBQSxFQUdOLElBQU0sc0JBQXNCLENBQUMsR0FBRyxNQUFNLG1CQUFtQixHQUFHLENBQUM7QUFBQSxFQUU3RCxPQUFPLFVBQVU7QUFBQSxJQUNmO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFBQTs7OztFQ3RCQSxJQUFNO0FBQUEsRUFDTixNQUFRLFlBQVk7QUFBQSxFQUNwQixNQUFRLFFBQVEsSUFBSTtBQUFBLEVBRXBCLElBQU07QUFBQSxFQUNOLE1BQVE7QUFBQTtBQUFBLEVBQ1IsTUFBTSxPQUFPO0FBQUEsSUFDWCxXQUFZLENBQUMsVUFBUyxVQUFTO0FBQUEsTUFDN0IsV0FBVSxhQUFhLFFBQU87QUFBQSxNQUU5QixJQUFJLG9CQUFtQixRQUFRO0FBQUEsUUFDN0IsSUFBSSxTQUFRLFlBQVksU0FBUSxTQUM5QixTQUFRLHdCQUF3QixTQUFRLG1CQUFtQjtBQUFBLFVBQzNELE9BQU87QUFBQSxRQUNULEVBQU87QUFBQSxVQUNMLFdBQVUsU0FBUTtBQUFBO0FBQUEsTUFFdEIsRUFBTyxTQUFJLE9BQU8sYUFBWSxVQUFVO0FBQUEsUUFDdEMsTUFBTSxJQUFJLFVBQVUsZ0RBQWdELE9BQU8sWUFBVztBQUFBLE1BQ3hGO0FBQUEsTUFFQSxJQUFJLFNBQVEsU0FBUyxZQUFZO0FBQUEsUUFDL0IsTUFBTSxJQUFJLFVBQ1IsMEJBQTBCLHVCQUM1QjtBQUFBLE1BQ0Y7QUFBQSxNQUVBLE1BQU0sVUFBVSxVQUFTLFFBQU87QUFBQSxNQUNoQyxLQUFLLFVBQVU7QUFBQSxNQUNmLEtBQUssVUFBVSxTQUFRO0FBQUEsTUFHdkIsS0FBSyxzQkFBc0IsU0FBUTtBQUFBLE1BRW5DLE1BQU0sSUFBSSxTQUFRLEtBQUssRUFBRSxNQUFNLFNBQVEsUUFBUSxHQUFHLEVBQUUsU0FBUyxHQUFHLEVBQUUsS0FBSztBQUFBLE1BRXZFLEtBQUssR0FBRztBQUFBLFFBQ04sTUFBTSxJQUFJLFVBQVUsb0JBQW9CLFVBQVM7QUFBQSxNQUNuRDtBQUFBLE1BRUEsS0FBSyxNQUFNO0FBQUEsTUFHWCxLQUFLLFNBQVMsRUFBRTtBQUFBLE1BQ2hCLEtBQUssU0FBUyxFQUFFO0FBQUEsTUFDaEIsS0FBSyxTQUFTLEVBQUU7QUFBQSxNQUVoQixJQUFJLEtBQUssUUFBUSxvQkFBb0IsS0FBSyxRQUFRLEdBQUc7QUFBQSxRQUNuRCxNQUFNLElBQUksVUFBVSx1QkFBdUI7QUFBQSxNQUM3QztBQUFBLE1BRUEsSUFBSSxLQUFLLFFBQVEsb0JBQW9CLEtBQUssUUFBUSxHQUFHO0FBQUEsUUFDbkQsTUFBTSxJQUFJLFVBQVUsdUJBQXVCO0FBQUEsTUFDN0M7QUFBQSxNQUVBLElBQUksS0FBSyxRQUFRLG9CQUFvQixLQUFLLFFBQVEsR0FBRztBQUFBLFFBQ25ELE1BQU0sSUFBSSxVQUFVLHVCQUF1QjtBQUFBLE1BQzdDO0FBQUEsTUFHQSxLQUFLLEVBQUUsSUFBSTtBQUFBLFFBQ1QsS0FBSyxhQUFhLENBQUM7QUFBQSxNQUNyQixFQUFPO0FBQUEsUUFDTCxLQUFLLGFBQWEsRUFBRSxHQUFHLE1BQU0sR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPO0FBQUEsVUFDNUMsSUFBSSxXQUFXLEtBQUssRUFBRSxHQUFHO0FBQUEsWUFDdkIsTUFBTSxPQUFPO0FBQUEsWUFDYixJQUFJLE9BQU8sS0FBSyxNQUFNLGtCQUFrQjtBQUFBLGNBQ3RDLE9BQU87QUFBQSxZQUNUO0FBQUEsVUFDRjtBQUFBLFVBQ0EsT0FBTztBQUFBLFNBQ1I7QUFBQTtBQUFBLE1BR0gsS0FBSyxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQztBQUFBLE1BQ3ZDLEtBQUssT0FBTztBQUFBO0FBQUEsSUFHZCxNQUFPLEdBQUc7QUFBQSxNQUNSLEtBQUssVUFBVSxHQUFHLEtBQUssU0FBUyxLQUFLLFNBQVMsS0FBSztBQUFBLE1BQ25ELElBQUksS0FBSyxXQUFXLFFBQVE7QUFBQSxRQUMxQixLQUFLLFdBQVcsSUFBSSxLQUFLLFdBQVcsS0FBSyxHQUFHO0FBQUEsTUFDOUM7QUFBQSxNQUNBLE9BQU8sS0FBSztBQUFBO0FBQUEsSUFHZCxRQUFTLEdBQUc7QUFBQSxNQUNWLE9BQU8sS0FBSztBQUFBO0FBQUEsSUFHZCxPQUFRLENBQUMsT0FBTztBQUFBLE1BQ2QsTUFBTSxrQkFBa0IsS0FBSyxTQUFTLEtBQUssU0FBUyxLQUFLO0FBQUEsTUFDekQsTUFBTSxpQkFBaUIsU0FBUztBQUFBLFFBQzlCLElBQUksT0FBTyxVQUFVLFlBQVksVUFBVSxLQUFLLFNBQVM7QUFBQSxVQUN2RCxPQUFPO0FBQUEsUUFDVDtBQUFBLFFBQ0EsUUFBUSxJQUFJLE9BQU8sT0FBTyxLQUFLLE9BQU87QUFBQSxNQUN4QztBQUFBLE1BRUEsSUFBSSxNQUFNLFlBQVksS0FBSyxTQUFTO0FBQUEsUUFDbEMsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUVBLE9BQU8sS0FBSyxZQUFZLEtBQUssS0FBSyxLQUFLLFdBQVcsS0FBSztBQUFBO0FBQUEsSUFHekQsV0FBWSxDQUFDLE9BQU87QUFBQSxNQUNsQixNQUFNLGlCQUFpQixTQUFTO0FBQUEsUUFDOUIsUUFBUSxJQUFJLE9BQU8sT0FBTyxLQUFLLE9BQU87QUFBQSxNQUN4QztBQUFBLE1BRUEsT0FDRSxtQkFBbUIsS0FBSyxPQUFPLE1BQU0sS0FBSyxLQUMxQyxtQkFBbUIsS0FBSyxPQUFPLE1BQU0sS0FBSyxLQUMxQyxtQkFBbUIsS0FBSyxPQUFPLE1BQU0sS0FBSztBQUFBO0FBQUEsSUFJOUMsVUFBVyxDQUFDLE9BQU87QUFBQSxNQUNqQixNQUFNLGlCQUFpQixTQUFTO0FBQUEsUUFDOUIsUUFBUSxJQUFJLE9BQU8sT0FBTyxLQUFLLE9BQU87QUFBQSxNQUN4QztBQUFBLE1BR0EsSUFBSSxLQUFLLFdBQVcsV0FBVyxNQUFNLFdBQVcsUUFBUTtBQUFBLFFBQ3RELE9BQU87QUFBQSxNQUNULEVBQU8sVUFBSyxLQUFLLFdBQVcsVUFBVSxNQUFNLFdBQVcsUUFBUTtBQUFBLFFBQzdELE9BQU87QUFBQSxNQUNULEVBQU8sVUFBSyxLQUFLLFdBQVcsV0FBVyxNQUFNLFdBQVcsUUFBUTtBQUFBLFFBQzlELE9BQU87QUFBQSxNQUNUO0FBQUEsTUFFQSxJQUFJLElBQUk7QUFBQSxNQUNSLEdBQUc7QUFBQSxRQUNELE1BQU0sSUFBSSxLQUFLLFdBQVc7QUFBQSxRQUMxQixNQUFNLElBQUksTUFBTSxXQUFXO0FBQUEsUUFDM0IsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7QUFBQSxRQUNuQyxJQUFJLE1BQU0sYUFBYSxNQUFNLFdBQVc7QUFBQSxVQUN0QyxPQUFPO0FBQUEsUUFDVCxFQUFPLFNBQUksTUFBTSxXQUFXO0FBQUEsVUFDMUIsT0FBTztBQUFBLFFBQ1QsRUFBTyxTQUFJLE1BQU0sV0FBVztBQUFBLFVBQzFCLE9BQU87QUFBQSxRQUNULEVBQU8sU0FBSSxNQUFNLEdBQUc7QUFBQSxVQUNsQjtBQUFBLFFBQ0YsRUFBTztBQUFBLFVBQ0wsT0FBTyxtQkFBbUIsR0FBRyxDQUFDO0FBQUE7QUFBQSxNQUVsQyxXQUFXO0FBQUE7QUFBQSxJQUdiLFlBQWEsQ0FBQyxPQUFPO0FBQUEsTUFDbkIsTUFBTSxpQkFBaUIsU0FBUztBQUFBLFFBQzlCLFFBQVEsSUFBSSxPQUFPLE9BQU8sS0FBSyxPQUFPO0FBQUEsTUFDeEM7QUFBQSxNQUVBLElBQUksSUFBSTtBQUFBLE1BQ1IsR0FBRztBQUFBLFFBQ0QsTUFBTSxJQUFJLEtBQUssTUFBTTtBQUFBLFFBQ3JCLE1BQU0sSUFBSSxNQUFNLE1BQU07QUFBQSxRQUN0QixNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztBQUFBLFFBQzlCLElBQUksTUFBTSxhQUFhLE1BQU0sV0FBVztBQUFBLFVBQ3RDLE9BQU87QUFBQSxRQUNULEVBQU8sU0FBSSxNQUFNLFdBQVc7QUFBQSxVQUMxQixPQUFPO0FBQUEsUUFDVCxFQUFPLFNBQUksTUFBTSxXQUFXO0FBQUEsVUFDMUIsT0FBTztBQUFBLFFBQ1QsRUFBTyxTQUFJLE1BQU0sR0FBRztBQUFBLFVBQ2xCO0FBQUEsUUFDRixFQUFPO0FBQUEsVUFDTCxPQUFPLG1CQUFtQixHQUFHLENBQUM7QUFBQTtBQUFBLE1BRWxDLFdBQVc7QUFBQTtBQUFBLElBS2IsR0FBSSxDQUFDLFNBQVMsWUFBWSxnQkFBZ0I7QUFBQSxNQUN4QyxJQUFJLFFBQVEsV0FBVyxLQUFLLEdBQUc7QUFBQSxRQUM3QixLQUFLLGNBQWMsbUJBQW1CLE9BQU87QUFBQSxVQUMzQyxNQUFNLElBQUksTUFBTSxpREFBaUQ7QUFBQSxRQUNuRTtBQUFBLFFBRUEsSUFBSSxZQUFZO0FBQUEsVUFDZCxNQUFNLFFBQVEsSUFBSSxhQUFhLE1BQU0sS0FBSyxRQUFRLFFBQVEsR0FBRyxFQUFFLG1CQUFtQixHQUFHLEVBQUUsV0FBVztBQUFBLFVBQ2xHLEtBQUssU0FBUyxNQUFNLE9BQU8sWUFBWTtBQUFBLFlBQ3JDLE1BQU0sSUFBSSxNQUFNLHVCQUF1QixZQUFZO0FBQUEsVUFDckQ7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLE1BRUEsUUFBUTtBQUFBLGFBQ0Q7QUFBQSxVQUNILEtBQUssV0FBVyxTQUFTO0FBQUEsVUFDekIsS0FBSyxRQUFRO0FBQUEsVUFDYixLQUFLLFFBQVE7QUFBQSxVQUNiLEtBQUs7QUFBQSxVQUNMLEtBQUssSUFBSSxPQUFPLFlBQVksY0FBYztBQUFBLFVBQzFDO0FBQUEsYUFDRztBQUFBLFVBQ0gsS0FBSyxXQUFXLFNBQVM7QUFBQSxVQUN6QixLQUFLLFFBQVE7QUFBQSxVQUNiLEtBQUs7QUFBQSxVQUNMLEtBQUssSUFBSSxPQUFPLFlBQVksY0FBYztBQUFBLFVBQzFDO0FBQUEsYUFDRztBQUFBLFVBSUgsS0FBSyxXQUFXLFNBQVM7QUFBQSxVQUN6QixLQUFLLElBQUksU0FBUyxZQUFZLGNBQWM7QUFBQSxVQUM1QyxLQUFLLElBQUksT0FBTyxZQUFZLGNBQWM7QUFBQSxVQUMxQztBQUFBLGFBR0c7QUFBQSxVQUNILElBQUksS0FBSyxXQUFXLFdBQVcsR0FBRztBQUFBLFlBQ2hDLEtBQUssSUFBSSxTQUFTLFlBQVksY0FBYztBQUFBLFVBQzlDO0FBQUEsVUFDQSxLQUFLLElBQUksT0FBTyxZQUFZLGNBQWM7QUFBQSxVQUMxQztBQUFBLGFBQ0c7QUFBQSxVQUNILElBQUksS0FBSyxXQUFXLFdBQVcsR0FBRztBQUFBLFlBQ2hDLE1BQU0sSUFBSSxNQUFNLFdBQVcsS0FBSyx5QkFBeUI7QUFBQSxVQUMzRDtBQUFBLFVBQ0EsS0FBSyxXQUFXLFNBQVM7QUFBQSxVQUN6QjtBQUFBLGFBRUc7QUFBQSxVQUtILElBQ0UsS0FBSyxVQUFVLEtBQ2YsS0FBSyxVQUFVLEtBQ2YsS0FBSyxXQUFXLFdBQVcsR0FDM0I7QUFBQSxZQUNBLEtBQUs7QUFBQSxVQUNQO0FBQUEsVUFDQSxLQUFLLFFBQVE7QUFBQSxVQUNiLEtBQUssUUFBUTtBQUFBLFVBQ2IsS0FBSyxhQUFhLENBQUM7QUFBQSxVQUNuQjtBQUFBLGFBQ0c7QUFBQSxVQUtILElBQUksS0FBSyxVQUFVLEtBQUssS0FBSyxXQUFXLFdBQVcsR0FBRztBQUFBLFlBQ3BELEtBQUs7QUFBQSxVQUNQO0FBQUEsVUFDQSxLQUFLLFFBQVE7QUFBQSxVQUNiLEtBQUssYUFBYSxDQUFDO0FBQUEsVUFDbkI7QUFBQSxhQUNHO0FBQUEsVUFLSCxJQUFJLEtBQUssV0FBVyxXQUFXLEdBQUc7QUFBQSxZQUNoQyxLQUFLO0FBQUEsVUFDUDtBQUFBLFVBQ0EsS0FBSyxhQUFhLENBQUM7QUFBQSxVQUNuQjtBQUFBLGFBR0csT0FBTztBQUFBLFVBQ1YsTUFBTSxPQUFPLE9BQU8sY0FBYyxJQUFJLElBQUk7QUFBQSxVQUUxQyxJQUFJLEtBQUssV0FBVyxXQUFXLEdBQUc7QUFBQSxZQUNoQyxLQUFLLGFBQWEsQ0FBQyxJQUFJO0FBQUEsVUFDekIsRUFBTztBQUFBLFlBQ0wsSUFBSSxJQUFJLEtBQUssV0FBVztBQUFBLFlBQ3hCLFNBQVMsS0FBSyxHQUFHO0FBQUEsY0FDZixJQUFJLE9BQU8sS0FBSyxXQUFXLE9BQU8sVUFBVTtBQUFBLGdCQUMxQyxLQUFLLFdBQVc7QUFBQSxnQkFDaEIsSUFBSTtBQUFBLGNBQ047QUFBQSxZQUNGO0FBQUEsWUFDQSxJQUFJLE1BQU0sSUFBSTtBQUFBLGNBRVosSUFBSSxlQUFlLEtBQUssV0FBVyxLQUFLLEdBQUcsS0FBSyxtQkFBbUIsT0FBTztBQUFBLGdCQUN4RSxNQUFNLElBQUksTUFBTSx1REFBdUQ7QUFBQSxjQUN6RTtBQUFBLGNBQ0EsS0FBSyxXQUFXLEtBQUssSUFBSTtBQUFBLFlBQzNCO0FBQUE7QUFBQSxVQUVGLElBQUksWUFBWTtBQUFBLFlBR2QsSUFBSSxhQUFhLENBQUMsWUFBWSxJQUFJO0FBQUEsWUFDbEMsSUFBSSxtQkFBbUIsT0FBTztBQUFBLGNBQzVCLGFBQWEsQ0FBQyxVQUFVO0FBQUEsWUFDMUI7QUFBQSxZQUNBLElBQUksbUJBQW1CLEtBQUssV0FBVyxJQUFJLFVBQVUsTUFBTSxHQUFHO0FBQUEsY0FDNUQsSUFBSSxNQUFNLEtBQUssV0FBVyxFQUFFLEdBQUc7QUFBQSxnQkFDN0IsS0FBSyxhQUFhO0FBQUEsY0FDcEI7QUFBQSxZQUNGLEVBQU87QUFBQSxjQUNMLEtBQUssYUFBYTtBQUFBO0FBQUEsVUFFdEI7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBO0FBQUEsVUFFRSxNQUFNLElBQUksTUFBTSwrQkFBK0IsU0FBUztBQUFBO0FBQUEsTUFFNUQsS0FBSyxNQUFNLEtBQUssT0FBTztBQUFBLE1BQ3ZCLElBQUksS0FBSyxNQUFNLFFBQVE7QUFBQSxRQUNyQixLQUFLLE9BQU8sSUFBSSxLQUFLLE1BQU0sS0FBSyxHQUFHO0FBQUEsTUFDckM7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLEVBRVg7QUFBQSxFQUVBLE9BQU8sVUFBVTtBQUFBOzs7O0VDNVRqQixJQUFNO0FBQUEsRUFDTixJQUFNLFFBQVEsQ0FBQyxVQUFTLFVBQVMsY0FBYyxVQUFVO0FBQUEsSUFDdkQsSUFBSSxvQkFBbUIsUUFBUTtBQUFBLE1BQzdCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFJO0FBQUEsTUFDRixPQUFPLElBQUksT0FBTyxVQUFTLFFBQU87QUFBQSxNQUNsQyxPQUFPLElBQUk7QUFBQSxNQUNYLEtBQUssYUFBYTtBQUFBLFFBQ2hCLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFDQSxNQUFNO0FBQUE7QUFBQTtBQUFBLEVBSVYsT0FBTyxVQUFVO0FBQUE7Ozs7RUNmakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxRQUFRLENBQUMsVUFBUyxhQUFZO0FBQUEsSUFDbEMsTUFBTSxJQUFJLE1BQU0sVUFBUyxRQUFPO0FBQUEsSUFDaEMsT0FBTyxJQUFJLEVBQUUsVUFBVTtBQUFBO0FBQUEsRUFFekIsT0FBTyxVQUFVO0FBQUE7Ozs7RUNMakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxRQUFRLENBQUMsVUFBUyxhQUFZO0FBQUEsSUFDbEMsTUFBTSxJQUFJLE1BQU0sU0FBUSxLQUFLLEVBQUUsUUFBUSxVQUFVLEVBQUUsR0FBRyxRQUFPO0FBQUEsSUFDN0QsT0FBTyxJQUFJLEVBQUUsVUFBVTtBQUFBO0FBQUEsRUFFekIsT0FBTyxVQUFVO0FBQUE7Ozs7RUNMakIsSUFBTTtBQUFBLEVBRU4sSUFBTSxNQUFNLENBQUMsVUFBUyxTQUFTLFVBQVMsWUFBWSxtQkFBbUI7QUFBQSxJQUNyRSxJQUFJLE9BQVEsYUFBYSxVQUFVO0FBQUEsTUFDakMsaUJBQWlCO0FBQUEsTUFDakIsYUFBYTtBQUFBLE1BQ2IsV0FBVTtBQUFBLElBQ1o7QUFBQSxJQUVBLElBQUk7QUFBQSxNQUNGLE9BQU8sSUFBSSxPQUNULG9CQUFtQixTQUFTLFNBQVEsVUFBVSxVQUM5QyxRQUNGLEVBQUUsSUFBSSxTQUFTLFlBQVksY0FBYyxFQUFFO0FBQUEsTUFDM0MsT0FBTyxJQUFJO0FBQUEsTUFDWCxPQUFPO0FBQUE7QUFBQTtBQUFBLEVBR1gsT0FBTyxVQUFVO0FBQUE7Ozs7RUNsQmpCLElBQU07QUFBQSxFQUVOLElBQU0sT0FBTyxDQUFDLFVBQVUsYUFBYTtBQUFBLElBQ25DLE1BQU0sS0FBSyxNQUFNLFVBQVUsTUFBTSxJQUFJO0FBQUEsSUFDckMsTUFBTSxLQUFLLE1BQU0sVUFBVSxNQUFNLElBQUk7QUFBQSxJQUNyQyxNQUFNLGFBQWEsR0FBRyxRQUFRLEVBQUU7QUFBQSxJQUVoQyxJQUFJLGVBQWUsR0FBRztBQUFBLE1BQ3BCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxNQUFNLFdBQVcsYUFBYTtBQUFBLElBQzlCLE1BQU0sY0FBYyxXQUFXLEtBQUs7QUFBQSxJQUNwQyxNQUFNLGFBQWEsV0FBVyxLQUFLO0FBQUEsSUFDbkMsTUFBTSxlQUFlLFlBQVksV0FBVztBQUFBLElBQzVDLE1BQU0sY0FBYyxXQUFXLFdBQVc7QUFBQSxJQUUxQyxJQUFJLGNBQWMsWUFBWTtBQUFBLE1BUTVCLEtBQUssV0FBVyxVQUFVLFdBQVcsT0FBTztBQUFBLFFBQzFDLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFHQSxJQUFJLFdBQVcsWUFBWSxXQUFXLE1BQU0sR0FBRztBQUFBLFFBQzdDLElBQUksV0FBVyxVQUFVLFdBQVcsT0FBTztBQUFBLFVBQ3pDLE9BQU87QUFBQSxRQUNUO0FBQUEsUUFDQSxPQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFBQSxJQUdBLE1BQU0sU0FBUyxhQUFhLFFBQVE7QUFBQSxJQUVwQyxJQUFJLEdBQUcsVUFBVSxHQUFHLE9BQU87QUFBQSxNQUN6QixPQUFPLFNBQVM7QUFBQSxJQUNsQjtBQUFBLElBRUEsSUFBSSxHQUFHLFVBQVUsR0FBRyxPQUFPO0FBQUEsTUFDekIsT0FBTyxTQUFTO0FBQUEsSUFDbEI7QUFBQSxJQUVBLElBQUksR0FBRyxVQUFVLEdBQUcsT0FBTztBQUFBLE1BQ3pCLE9BQU8sU0FBUztBQUFBLElBQ2xCO0FBQUEsSUFHQSxPQUFPO0FBQUE7QUFBQSxFQUdULE9BQU8sVUFBVTtBQUFBOzs7O0VDekRqQixJQUFNO0FBQUEsRUFDTixJQUFNLFFBQVEsQ0FBQyxHQUFHLFVBQVUsSUFBSSxPQUFPLEdBQUcsS0FBSyxFQUFFO0FBQUEsRUFDakQsT0FBTyxVQUFVO0FBQUE7Ozs7RUNGakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxRQUFRLENBQUMsR0FBRyxVQUFVLElBQUksT0FBTyxHQUFHLEtBQUssRUFBRTtBQUFBLEVBQ2pELE9BQU8sVUFBVTtBQUFBOzs7O0VDRmpCLElBQU07QUFBQSxFQUNOLElBQU0sUUFBUSxDQUFDLEdBQUcsVUFBVSxJQUFJLE9BQU8sR0FBRyxLQUFLLEVBQUU7QUFBQSxFQUNqRCxPQUFPLFVBQVU7QUFBQTs7OztFQ0ZqQixJQUFNO0FBQUEsRUFDTixJQUFNLGFBQWEsQ0FBQyxVQUFTLGFBQVk7QUFBQSxJQUN2QyxNQUFNLFNBQVMsTUFBTSxVQUFTLFFBQU87QUFBQSxJQUNyQyxPQUFRLFVBQVUsT0FBTyxXQUFXLFNBQVUsT0FBTyxhQUFhO0FBQUE7QUFBQSxFQUVwRSxPQUFPLFVBQVU7QUFBQTs7OztFQ0xqQixJQUFNO0FBQUEsRUFDTixJQUFNLFVBQVUsQ0FBQyxHQUFHLEdBQUcsVUFDckIsSUFBSSxPQUFPLEdBQUcsS0FBSyxFQUFFLFFBQVEsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQUEsRUFFbkQsT0FBTyxVQUFVO0FBQUE7Ozs7RUNKakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxXQUFXLENBQUMsR0FBRyxHQUFHLFVBQVUsUUFBUSxHQUFHLEdBQUcsS0FBSztBQUFBLEVBQ3JELE9BQU8sVUFBVTtBQUFBOzs7O0VDRmpCLElBQU07QUFBQSxFQUNOLElBQU0sZUFBZSxDQUFDLEdBQUcsTUFBTSxRQUFRLEdBQUcsR0FBRyxJQUFJO0FBQUEsRUFDakQsT0FBTyxVQUFVO0FBQUE7Ozs7RUNGakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxlQUFlLENBQUMsR0FBRyxHQUFHLFVBQVU7QUFBQSxJQUNwQyxNQUFNLFdBQVcsSUFBSSxPQUFPLEdBQUcsS0FBSztBQUFBLElBQ3BDLE1BQU0sV0FBVyxJQUFJLE9BQU8sR0FBRyxLQUFLO0FBQUEsSUFDcEMsT0FBTyxTQUFTLFFBQVEsUUFBUSxLQUFLLFNBQVMsYUFBYSxRQUFRO0FBQUE7QUFBQSxFQUVyRSxPQUFPLFVBQVU7QUFBQTs7OztFQ05qQixJQUFNO0FBQUEsRUFDTixJQUFNLE9BQU8sQ0FBQyxNQUFNLFVBQVUsS0FBSyxLQUFLLENBQUMsR0FBRyxNQUFNLGFBQWEsR0FBRyxHQUFHLEtBQUssQ0FBQztBQUFBLEVBQzNFLE9BQU8sVUFBVTtBQUFBOzs7O0VDRmpCLElBQU07QUFBQSxFQUNOLElBQU0sUUFBUSxDQUFDLE1BQU0sVUFBVSxLQUFLLEtBQUssQ0FBQyxHQUFHLE1BQU0sYUFBYSxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQUEsRUFDNUUsT0FBTyxVQUFVO0FBQUE7Ozs7RUNGakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxNQUFLLENBQUMsR0FBRyxHQUFHLFVBQVUsUUFBUSxHQUFHLEdBQUcsS0FBSyxJQUFJO0FBQUEsRUFDbkQsT0FBTyxVQUFVO0FBQUE7Ozs7RUNGakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxNQUFLLENBQUMsR0FBRyxHQUFHLFVBQVUsUUFBUSxHQUFHLEdBQUcsS0FBSyxJQUFJO0FBQUEsRUFDbkQsT0FBTyxVQUFVO0FBQUE7Ozs7RUNGakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxNQUFLLENBQUMsR0FBRyxHQUFHLFVBQVUsUUFBUSxHQUFHLEdBQUcsS0FBSyxNQUFNO0FBQUEsRUFDckQsT0FBTyxVQUFVO0FBQUE7Ozs7RUNGakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxNQUFNLENBQUMsR0FBRyxHQUFHLFVBQVUsUUFBUSxHQUFHLEdBQUcsS0FBSyxNQUFNO0FBQUEsRUFDdEQsT0FBTyxVQUFVO0FBQUE7Ozs7RUNGakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxPQUFNLENBQUMsR0FBRyxHQUFHLFVBQVUsUUFBUSxHQUFHLEdBQUcsS0FBSyxLQUFLO0FBQUEsRUFDckQsT0FBTyxVQUFVO0FBQUE7Ozs7RUNGakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxPQUFNLENBQUMsR0FBRyxHQUFHLFVBQVUsUUFBUSxHQUFHLEdBQUcsS0FBSyxLQUFLO0FBQUEsRUFDckQsT0FBTyxVQUFVO0FBQUE7Ozs7RUNGakIsSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBRU4sSUFBTSxNQUFNLENBQUMsR0FBRyxJQUFJLEdBQUcsVUFBVTtBQUFBLElBQy9CLFFBQVE7QUFBQSxXQUNEO0FBQUEsUUFDSCxJQUFJLE9BQU8sTUFBTSxVQUFVO0FBQUEsVUFDekIsSUFBSSxFQUFFO0FBQUEsUUFDUjtBQUFBLFFBQ0EsSUFBSSxPQUFPLE1BQU0sVUFBVTtBQUFBLFVBQ3pCLElBQUksRUFBRTtBQUFBLFFBQ1I7QUFBQSxRQUNBLE9BQU8sTUFBTTtBQUFBLFdBRVY7QUFBQSxRQUNILElBQUksT0FBTyxNQUFNLFVBQVU7QUFBQSxVQUN6QixJQUFJLEVBQUU7QUFBQSxRQUNSO0FBQUEsUUFDQSxJQUFJLE9BQU8sTUFBTSxVQUFVO0FBQUEsVUFDekIsSUFBSSxFQUFFO0FBQUEsUUFDUjtBQUFBLFFBQ0EsT0FBTyxNQUFNO0FBQUEsV0FFVjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsUUFDSCxPQUFPLElBQUcsR0FBRyxHQUFHLEtBQUs7QUFBQSxXQUVsQjtBQUFBLFFBQ0gsT0FBTyxJQUFJLEdBQUcsR0FBRyxLQUFLO0FBQUEsV0FFbkI7QUFBQSxRQUNILE9BQU8sSUFBRyxHQUFHLEdBQUcsS0FBSztBQUFBLFdBRWxCO0FBQUEsUUFDSCxPQUFPLEtBQUksR0FBRyxHQUFHLEtBQUs7QUFBQSxXQUVuQjtBQUFBLFFBQ0gsT0FBTyxJQUFHLEdBQUcsR0FBRyxLQUFLO0FBQUEsV0FFbEI7QUFBQSxRQUNILE9BQU8sS0FBSSxHQUFHLEdBQUcsS0FBSztBQUFBO0FBQUEsUUFHdEIsTUFBTSxJQUFJLFVBQVUscUJBQXFCLElBQUk7QUFBQTtBQUFBO0FBQUEsRUFHbkQsT0FBTyxVQUFVO0FBQUE7Ozs7RUNuRGpCLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLE1BQVEsUUFBUSxJQUFJO0FBQUEsRUFFcEIsSUFBTSxTQUFTLENBQUMsVUFBUyxhQUFZO0FBQUEsSUFDbkMsSUFBSSxvQkFBbUIsUUFBUTtBQUFBLE1BQzdCLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxJQUFJLE9BQU8sYUFBWSxVQUFVO0FBQUEsTUFDL0IsV0FBVSxPQUFPLFFBQU87QUFBQSxJQUMxQjtBQUFBLElBRUEsSUFBSSxPQUFPLGFBQVksVUFBVTtBQUFBLE1BQy9CLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxXQUFVLFlBQVcsQ0FBQztBQUFBLElBRXRCLElBQUksUUFBUTtBQUFBLElBQ1osS0FBSyxTQUFRLEtBQUs7QUFBQSxNQUNoQixRQUFRLFNBQVEsTUFBTSxTQUFRLG9CQUFvQixHQUFHLEVBQUUsY0FBYyxHQUFHLEVBQUUsT0FBTztBQUFBLElBQ25GLEVBQU87QUFBQSxNQVVMLE1BQU0saUJBQWlCLFNBQVEsb0JBQW9CLEdBQUcsRUFBRSxpQkFBaUIsR0FBRyxFQUFFO0FBQUEsTUFDOUUsSUFBSTtBQUFBLE1BQ0osUUFBUSxPQUFPLGVBQWUsS0FBSyxRQUFPLFFBQ3BDLFNBQVMsTUFBTSxRQUFRLE1BQU0sR0FBRyxXQUFXLFNBQVEsU0FDdkQ7QUFBQSxRQUNBLEtBQUssU0FDQyxLQUFLLFFBQVEsS0FBSyxHQUFHLFdBQVcsTUFBTSxRQUFRLE1BQU0sR0FBRyxRQUFRO0FBQUEsVUFDbkUsUUFBUTtBQUFBLFFBQ1Y7QUFBQSxRQUNBLGVBQWUsWUFBWSxLQUFLLFFBQVEsS0FBSyxHQUFHLFNBQVMsS0FBSyxHQUFHO0FBQUEsTUFDbkU7QUFBQSxNQUVBLGVBQWUsWUFBWTtBQUFBO0FBQUEsSUFHN0IsSUFBSSxVQUFVLE1BQU07QUFBQSxNQUNsQixPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsTUFBTSxRQUFRLE1BQU07QUFBQSxJQUNwQixNQUFNLFFBQVEsTUFBTSxNQUFNO0FBQUEsSUFDMUIsTUFBTSxRQUFRLE1BQU0sTUFBTTtBQUFBLElBQzFCLE1BQU0sYUFBYSxTQUFRLHFCQUFxQixNQUFNLEtBQUssSUFBSSxNQUFNLE9BQU87QUFBQSxJQUM1RSxNQUFNLFFBQVEsU0FBUSxxQkFBcUIsTUFBTSxLQUFLLElBQUksTUFBTSxPQUFPO0FBQUEsSUFFdkUsT0FBTyxNQUFNLEdBQUcsU0FBUyxTQUFTLFFBQVEsYUFBYSxTQUFTLFFBQU87QUFBQTtBQUFBLEVBRXpFLE9BQU8sVUFBVTtBQUFBOzs7O0VDM0RqQixNQUFNLFNBQVM7QUFBQSxJQUNiLFdBQVksR0FBRztBQUFBLE1BQ2IsS0FBSyxNQUFNO0FBQUEsTUFDWCxLQUFLLE1BQU0sSUFBSTtBQUFBO0FBQUEsSUFHakIsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNSLE1BQU0sUUFBUSxLQUFLLElBQUksSUFBSSxHQUFHO0FBQUEsTUFDOUIsSUFBSSxVQUFVLFdBQVc7QUFBQSxRQUN2QjtBQUFBLE1BQ0YsRUFBTztBQUFBLFFBRUwsS0FBSyxJQUFJLE9BQU8sR0FBRztBQUFBLFFBQ25CLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSztBQUFBLFFBQ3ZCLE9BQU87QUFBQTtBQUFBO0FBQUEsSUFJWCxNQUFPLENBQUMsS0FBSztBQUFBLE1BQ1gsT0FBTyxLQUFLLElBQUksT0FBTyxHQUFHO0FBQUE7QUFBQSxJQUc1QixHQUFJLENBQUMsS0FBSyxPQUFPO0FBQUEsTUFDZixNQUFNLFVBQVUsS0FBSyxPQUFPLEdBQUc7QUFBQSxNQUUvQixLQUFLLFdBQVcsVUFBVSxXQUFXO0FBQUEsUUFFbkMsSUFBSSxLQUFLLElBQUksUUFBUSxLQUFLLEtBQUs7QUFBQSxVQUM3QixNQUFNLFdBQVcsS0FBSyxJQUFJLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFBQSxVQUN4QyxLQUFLLE9BQU8sUUFBUTtBQUFBLFFBQ3RCO0FBQUEsUUFFQSxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUs7QUFBQSxNQUN6QjtBQUFBLE1BRUEsT0FBTztBQUFBO0FBQUEsRUFFWDtBQUFBLEVBRUEsT0FBTyxVQUFVO0FBQUE7Ozs7RUN2Q2pCLElBQU0sbUJBQW1CO0FBQUE7QUFBQSxFQUd6QixNQUFNLE1BQU07QUFBQSxJQUNWLFdBQVksQ0FBQyxPQUFPLFVBQVM7QUFBQSxNQUMzQixXQUFVLGFBQWEsUUFBTztBQUFBLE1BRTlCLElBQUksaUJBQWlCLE9BQU87QUFBQSxRQUMxQixJQUNFLE1BQU0sWUFBWSxTQUFRLFNBQzFCLE1BQU0sd0JBQXdCLFNBQVEsbUJBQ3RDO0FBQUEsVUFDQSxPQUFPO0FBQUEsUUFDVCxFQUFPO0FBQUEsVUFDTCxPQUFPLElBQUksTUFBTSxNQUFNLEtBQUssUUFBTztBQUFBO0FBQUEsTUFFdkM7QUFBQSxNQUVBLElBQUksaUJBQWlCLFlBQVk7QUFBQSxRQUUvQixLQUFLLE1BQU0sTUFBTTtBQUFBLFFBQ2pCLEtBQUssTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQUEsUUFDbkIsS0FBSyxZQUFZO0FBQUEsUUFDakIsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUVBLEtBQUssVUFBVTtBQUFBLE1BQ2YsS0FBSyxVQUFVLFNBQVE7QUFBQSxNQUN2QixLQUFLLHNCQUFzQixTQUFRO0FBQUEsTUFLbkMsS0FBSyxNQUFNLE1BQU0sS0FBSyxFQUFFLFFBQVEsa0JBQWtCLEdBQUc7QUFBQSxNQUdyRCxLQUFLLE1BQU0sS0FBSyxJQUNiLE1BQU0sSUFBSSxFQUVWLElBQUksT0FBSyxLQUFLLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUlsQyxPQUFPLE9BQUssRUFBRSxNQUFNO0FBQUEsTUFFdkIsS0FBSyxLQUFLLElBQUksUUFBUTtBQUFBLFFBQ3BCLE1BQU0sSUFBSSxVQUFVLHlCQUF5QixLQUFLLEtBQUs7QUFBQSxNQUN6RDtBQUFBLE1BR0EsSUFBSSxLQUFLLElBQUksU0FBUyxHQUFHO0FBQUEsUUFFdkIsTUFBTSxRQUFRLEtBQUssSUFBSTtBQUFBLFFBQ3ZCLEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxRQUFNLFVBQVUsRUFBRSxFQUFFLENBQUM7QUFBQSxRQUNoRCxJQUFJLEtBQUssSUFBSSxXQUFXLEdBQUc7QUFBQSxVQUN6QixLQUFLLE1BQU0sQ0FBQyxLQUFLO0FBQUEsUUFDbkIsRUFBTyxTQUFJLEtBQUssSUFBSSxTQUFTLEdBQUc7QUFBQSxVQUU5QixXQUFXLEtBQUssS0FBSyxLQUFLO0FBQUEsWUFDeEIsSUFBSSxFQUFFLFdBQVcsS0FBSyxNQUFNLEVBQUUsRUFBRSxHQUFHO0FBQUEsY0FDakMsS0FBSyxNQUFNLENBQUMsQ0FBQztBQUFBLGNBQ2I7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsTUFFQSxLQUFLLFlBQVk7QUFBQTtBQUFBLFFBR2YsS0FBTSxHQUFHO0FBQUEsTUFDWCxJQUFJLEtBQUssY0FBYyxXQUFXO0FBQUEsUUFDaEMsS0FBSyxZQUFZO0FBQUEsUUFDakIsU0FBUyxJQUFJLEVBQUcsSUFBSSxLQUFLLElBQUksUUFBUSxLQUFLO0FBQUEsVUFDeEMsSUFBSSxJQUFJLEdBQUc7QUFBQSxZQUNULEtBQUssYUFBYTtBQUFBLFVBQ3BCO0FBQUEsVUFDQSxNQUFNLFFBQVEsS0FBSyxJQUFJO0FBQUEsVUFDdkIsU0FBUyxJQUFJLEVBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUFBLFlBQ3JDLElBQUksSUFBSSxHQUFHO0FBQUEsY0FDVCxLQUFLLGFBQWE7QUFBQSxZQUNwQjtBQUFBLFlBQ0EsS0FBSyxhQUFhLE1BQU0sR0FBRyxTQUFTLEVBQUUsS0FBSztBQUFBLFVBQzdDO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxNQUNBLE9BQU8sS0FBSztBQUFBO0FBQUEsSUFHZCxNQUFPLEdBQUc7QUFBQSxNQUNSLE9BQU8sS0FBSztBQUFBO0FBQUEsSUFHZCxRQUFTLEdBQUc7QUFBQSxNQUNWLE9BQU8sS0FBSztBQUFBO0FBQUEsSUFHZCxVQUFXLENBQUMsT0FBTztBQUFBLE1BR2pCLE1BQU0sWUFDSCxLQUFLLFFBQVEscUJBQXFCLDRCQUNsQyxLQUFLLFFBQVEsU0FBUztBQUFBLE1BQ3pCLE1BQU0sVUFBVSxXQUFXLE1BQU07QUFBQSxNQUNqQyxNQUFNLFNBQVMsTUFBTSxJQUFJLE9BQU87QUFBQSxNQUNoQyxJQUFJLFFBQVE7QUFBQSxRQUNWLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFFQSxNQUFNLFFBQVEsS0FBSyxRQUFRO0FBQUEsTUFFM0IsTUFBTSxLQUFLLFFBQVEsR0FBRyxFQUFFLG9CQUFvQixHQUFHLEVBQUU7QUFBQSxNQUNqRCxRQUFRLE1BQU0sUUFBUSxJQUFJLGNBQWMsS0FBSyxRQUFRLGlCQUFpQixDQUFDO0FBQUEsTUFDdkUsTUFBTSxrQkFBa0IsS0FBSztBQUFBLE1BRzdCLFFBQVEsTUFBTSxRQUFRLEdBQUcsRUFBRSxpQkFBaUIscUJBQXFCO0FBQUEsTUFDakUsTUFBTSxtQkFBbUIsS0FBSztBQUFBLE1BRzlCLFFBQVEsTUFBTSxRQUFRLEdBQUcsRUFBRSxZQUFZLGdCQUFnQjtBQUFBLE1BQ3ZELE1BQU0sY0FBYyxLQUFLO0FBQUEsTUFHekIsUUFBUSxNQUFNLFFBQVEsR0FBRyxFQUFFLFlBQVksZ0JBQWdCO0FBQUEsTUFDdkQsTUFBTSxjQUFjLEtBQUs7QUFBQSxNQUt6QixJQUFJLFlBQVksTUFDYixNQUFNLEdBQUcsRUFDVCxJQUFJLFVBQVEsZ0JBQWdCLE1BQU0sS0FBSyxPQUFPLENBQUMsRUFDL0MsS0FBSyxHQUFHLEVBQ1IsTUFBTSxLQUFLLEVBRVgsSUFBSSxVQUFRLFlBQVksTUFBTSxLQUFLLE9BQU8sQ0FBQztBQUFBLE1BRTlDLElBQUksT0FBTztBQUFBLFFBRVQsWUFBWSxVQUFVLE9BQU8sVUFBUTtBQUFBLFVBQ25DLE1BQU0sd0JBQXdCLE1BQU0sS0FBSyxPQUFPO0FBQUEsVUFDaEQsU0FBUyxLQUFLLE1BQU0sR0FBRyxFQUFFLGdCQUFnQjtBQUFBLFNBQzFDO0FBQUEsTUFDSDtBQUFBLE1BQ0EsTUFBTSxjQUFjLFNBQVM7QUFBQSxNQUs3QixNQUFNLFdBQVcsSUFBSTtBQUFBLE1BQ3JCLE1BQU0sY0FBYyxVQUFVLElBQUksVUFBUSxJQUFJLFdBQVcsTUFBTSxLQUFLLE9BQU8sQ0FBQztBQUFBLE1BQzVFLFdBQVcsUUFBUSxhQUFhO0FBQUEsUUFDOUIsSUFBSSxVQUFVLElBQUksR0FBRztBQUFBLFVBQ25CLE9BQU8sQ0FBQyxJQUFJO0FBQUEsUUFDZDtBQUFBLFFBQ0EsU0FBUyxJQUFJLEtBQUssT0FBTyxJQUFJO0FBQUEsTUFDL0I7QUFBQSxNQUNBLElBQUksU0FBUyxPQUFPLEtBQUssU0FBUyxJQUFJLEVBQUUsR0FBRztBQUFBLFFBQ3pDLFNBQVMsT0FBTyxFQUFFO0FBQUEsTUFDcEI7QUFBQSxNQUVBLE1BQU0sU0FBUyxDQUFDLEdBQUcsU0FBUyxPQUFPLENBQUM7QUFBQSxNQUNwQyxNQUFNLElBQUksU0FBUyxNQUFNO0FBQUEsTUFDekIsT0FBTztBQUFBO0FBQUEsSUFHVCxVQUFXLENBQUMsT0FBTyxVQUFTO0FBQUEsTUFDMUIsTUFBTSxpQkFBaUIsUUFBUTtBQUFBLFFBQzdCLE1BQU0sSUFBSSxVQUFVLHFCQUFxQjtBQUFBLE1BQzNDO0FBQUEsTUFFQSxPQUFPLEtBQUssSUFBSSxLQUFLLENBQUMsb0JBQW9CO0FBQUEsUUFDeEMsT0FDRSxjQUFjLGlCQUFpQixRQUFPLEtBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCO0FBQUEsVUFDbkMsT0FDRSxjQUFjLGtCQUFrQixRQUFPLEtBQ3ZDLGdCQUFnQixNQUFNLENBQUMsbUJBQW1CO0FBQUEsWUFDeEMsT0FBTyxpQkFBaUIsTUFBTSxDQUFDLG9CQUFvQjtBQUFBLGNBQ2pELE9BQU8sZUFBZSxXQUFXLGlCQUFpQixRQUFPO0FBQUEsYUFDMUQ7QUFBQSxXQUNGO0FBQUEsU0FFSjtBQUFBLE9BRUo7QUFBQTtBQUFBLElBSUgsSUFBSyxDQUFDLFVBQVM7QUFBQSxNQUNiLEtBQUssVUFBUztBQUFBLFFBQ1osT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUVBLElBQUksT0FBTyxhQUFZLFVBQVU7QUFBQSxRQUMvQixJQUFJO0FBQUEsVUFDRixXQUFVLElBQUksT0FBTyxVQUFTLEtBQUssT0FBTztBQUFBLFVBQzFDLE9BQU8sSUFBSTtBQUFBLFVBQ1gsT0FBTztBQUFBO0FBQUEsTUFFWDtBQUFBLE1BRUEsU0FBUyxJQUFJLEVBQUcsSUFBSSxLQUFLLElBQUksUUFBUSxLQUFLO0FBQUEsUUFDeEMsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLFVBQVMsS0FBSyxPQUFPLEdBQUc7QUFBQSxVQUMvQyxPQUFPO0FBQUEsUUFDVDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLEVBRVg7QUFBQSxFQUVBLE9BQU8sVUFBVTtBQUFBLEVBRWpCLElBQU07QUFBQSxFQUNOLElBQU0sUUFBUSxJQUFJO0FBQUEsRUFFbEIsSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ047QUFBQSxJQUNFLFFBQVE7QUFBQSxJQUNSO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUE7QUFBQSxFQUVGLE1BQVEseUJBQXlCO0FBQUEsRUFFakMsSUFBTSxZQUFZLE9BQUssRUFBRSxVQUFVO0FBQUEsRUFDbkMsSUFBTSxRQUFRLE9BQUssRUFBRSxVQUFVO0FBQUEsRUFJL0IsSUFBTSxnQkFBZ0IsQ0FBQyxhQUFhLGFBQVk7QUFBQSxJQUM5QyxJQUFJLFNBQVM7QUFBQSxJQUNiLE1BQU0sdUJBQXVCLFlBQVksTUFBTTtBQUFBLElBQy9DLElBQUksaUJBQWlCLHFCQUFxQixJQUFJO0FBQUEsSUFFOUMsT0FBTyxVQUFVLHFCQUFxQixRQUFRO0FBQUEsTUFDNUMsU0FBUyxxQkFBcUIsTUFBTSxDQUFDLG9CQUFvQjtBQUFBLFFBQ3ZELE9BQU8sZUFBZSxXQUFXLGlCQUFpQixRQUFPO0FBQUEsT0FDMUQ7QUFBQSxNQUVELGlCQUFpQixxQkFBcUIsSUFBSTtBQUFBLElBQzVDO0FBQUEsSUFFQSxPQUFPO0FBQUE7QUFBQSxFQU1ULElBQU0sa0JBQWtCLENBQUMsTUFBTSxhQUFZO0FBQUEsSUFDekMsTUFBTSxRQUFRLE1BQU0sUUFBTztBQUFBLElBQzNCLE9BQU8sY0FBYyxNQUFNLFFBQU87QUFBQSxJQUNsQyxNQUFNLFNBQVMsSUFBSTtBQUFBLElBQ25CLE9BQU8sY0FBYyxNQUFNLFFBQU87QUFBQSxJQUNsQyxNQUFNLFVBQVUsSUFBSTtBQUFBLElBQ3BCLE9BQU8sZUFBZSxNQUFNLFFBQU87QUFBQSxJQUNuQyxNQUFNLFVBQVUsSUFBSTtBQUFBLElBQ3BCLE9BQU8sYUFBYSxNQUFNLFFBQU87QUFBQSxJQUNqQyxNQUFNLFNBQVMsSUFBSTtBQUFBLElBQ25CLE9BQU87QUFBQTtBQUFBLEVBR1QsSUFBTSxNQUFNLFNBQU8sTUFBTSxHQUFHLFlBQVksTUFBTSxPQUFPLE9BQU87QUFBQSxFQVM1RCxJQUFNLGdCQUFnQixDQUFDLE1BQU0sYUFBWTtBQUFBLElBQ3ZDLE9BQU8sS0FDSixLQUFLLEVBQ0wsTUFBTSxLQUFLLEVBQ1gsSUFBSSxDQUFDLE1BQU0sYUFBYSxHQUFHLFFBQU8sQ0FBQyxFQUNuQyxLQUFLLEdBQUc7QUFBQTtBQUFBLEVBR2IsSUFBTSxlQUFlLENBQUMsTUFBTSxhQUFZO0FBQUEsSUFDdEMsTUFBTSxJQUFJLFNBQVEsUUFBUSxHQUFHLEVBQUUsY0FBYyxHQUFHLEVBQUU7QUFBQSxJQUNsRCxPQUFPLEtBQUssUUFBUSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxPQUFPO0FBQUEsTUFDekMsTUFBTSxTQUFTLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFO0FBQUEsTUFDbkMsSUFBSTtBQUFBLE1BRUosSUFBSSxJQUFJLENBQUMsR0FBRztBQUFBLFFBQ1YsTUFBTTtBQUFBLE1BQ1IsRUFBTyxTQUFJLElBQUksQ0FBQyxHQUFHO0FBQUEsUUFDakIsTUFBTSxLQUFLLFdBQVcsSUFBSTtBQUFBLE1BQzVCLEVBQU8sU0FBSSxJQUFJLENBQUMsR0FBRztBQUFBLFFBRWpCLE1BQU0sS0FBSyxLQUFLLFFBQVEsTUFBTSxJQUFJO0FBQUEsTUFDcEMsRUFBTyxTQUFJLElBQUk7QUFBQSxRQUNiLE1BQU0sbUJBQW1CLEVBQUU7QUFBQSxRQUMzQixNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssT0FDckIsTUFBTSxJQUFJO0FBQUEsTUFDakIsRUFBTztBQUFBLFFBRUwsTUFBTSxLQUFLLEtBQUssS0FBSyxNQUNoQixNQUFNLElBQUk7QUFBQTtBQUFBLE1BR2pCLE1BQU0sZ0JBQWdCLEdBQUc7QUFBQSxNQUN6QixPQUFPO0FBQUEsS0FDUjtBQUFBO0FBQUEsRUFXSCxJQUFNLGdCQUFnQixDQUFDLE1BQU0sYUFBWTtBQUFBLElBQ3ZDLE9BQU8sS0FDSixLQUFLLEVBQ0wsTUFBTSxLQUFLLEVBQ1gsSUFBSSxDQUFDLE1BQU0sYUFBYSxHQUFHLFFBQU8sQ0FBQyxFQUNuQyxLQUFLLEdBQUc7QUFBQTtBQUFBLEVBR2IsSUFBTSxlQUFlLENBQUMsTUFBTSxhQUFZO0FBQUEsSUFDdEMsTUFBTSxTQUFTLE1BQU0sUUFBTztBQUFBLElBQzVCLE1BQU0sSUFBSSxTQUFRLFFBQVEsR0FBRyxFQUFFLGNBQWMsR0FBRyxFQUFFO0FBQUEsSUFDbEQsTUFBTSxJQUFJLFNBQVEsb0JBQW9CLE9BQU87QUFBQSxJQUM3QyxPQUFPLEtBQUssUUFBUSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxPQUFPO0FBQUEsTUFDekMsTUFBTSxTQUFTLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFO0FBQUEsTUFDbkMsSUFBSTtBQUFBLE1BRUosSUFBSSxJQUFJLENBQUMsR0FBRztBQUFBLFFBQ1YsTUFBTTtBQUFBLE1BQ1IsRUFBTyxTQUFJLElBQUksQ0FBQyxHQUFHO0FBQUEsUUFDakIsTUFBTSxLQUFLLFFBQVEsT0FBTyxJQUFJO0FBQUEsTUFDaEMsRUFBTyxTQUFJLElBQUksQ0FBQyxHQUFHO0FBQUEsUUFDakIsSUFBSSxNQUFNLEtBQUs7QUFBQSxVQUNiLE1BQU0sS0FBSyxLQUFLLE1BQU0sTUFBTSxNQUFNLElBQUk7QUFBQSxRQUN4QyxFQUFPO0FBQUEsVUFDTCxNQUFNLEtBQUssS0FBSyxNQUFNLE9BQU8sSUFBSTtBQUFBO0FBQUEsTUFFckMsRUFBTyxTQUFJLElBQUk7QUFBQSxRQUNiLE1BQU0sbUJBQW1CLEVBQUU7QUFBQSxRQUMzQixJQUFJLE1BQU0sS0FBSztBQUFBLFVBQ2IsSUFBSSxNQUFNLEtBQUs7QUFBQSxZQUNiLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxPQUNyQixLQUFLLE1BQU0sSUFBSTtBQUFBLFVBQ3RCLEVBQU87QUFBQSxZQUNMLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxPQUNyQixNQUFNLElBQUk7QUFBQTtBQUFBLFFBRW5CLEVBQU87QUFBQSxVQUNMLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxRQUNwQixJQUFJO0FBQUE7QUFBQSxNQUVkLEVBQU87QUFBQSxRQUNMLE1BQU0sT0FBTztBQUFBLFFBQ2IsSUFBSSxNQUFNLEtBQUs7QUFBQSxVQUNiLElBQUksTUFBTSxLQUFLO0FBQUEsWUFDYixNQUFNLEtBQUssS0FBSyxLQUFLLElBQ2xCLE1BQU0sS0FBSyxNQUFNLElBQUk7QUFBQSxVQUMxQixFQUFPO0FBQUEsWUFDTCxNQUFNLEtBQUssS0FBSyxLQUFLLElBQ2xCLE1BQU0sTUFBTSxJQUFJO0FBQUE7QUFBQSxRQUV2QixFQUFPO0FBQUEsVUFDTCxNQUFNLEtBQUssS0FBSyxLQUFLLE9BQ2YsSUFBSTtBQUFBO0FBQUE7QUFBQSxNQUlkLE1BQU0sZ0JBQWdCLEdBQUc7QUFBQSxNQUN6QixPQUFPO0FBQUEsS0FDUjtBQUFBO0FBQUEsRUFHSCxJQUFNLGlCQUFpQixDQUFDLE1BQU0sYUFBWTtBQUFBLElBQ3hDLE1BQU0sa0JBQWtCLE1BQU0sUUFBTztBQUFBLElBQ3JDLE9BQU8sS0FDSixNQUFNLEtBQUssRUFDWCxJQUFJLENBQUMsTUFBTSxjQUFjLEdBQUcsUUFBTyxDQUFDLEVBQ3BDLEtBQUssR0FBRztBQUFBO0FBQUEsRUFHYixJQUFNLGdCQUFnQixDQUFDLE1BQU0sYUFBWTtBQUFBLElBQ3ZDLE9BQU8sS0FBSyxLQUFLO0FBQUEsSUFDakIsTUFBTSxJQUFJLFNBQVEsUUFBUSxHQUFHLEVBQUUsZUFBZSxHQUFHLEVBQUU7QUFBQSxJQUNuRCxPQUFPLEtBQUssUUFBUSxHQUFHLENBQUMsS0FBSyxNQUFNLEdBQUcsR0FBRyxHQUFHLE9BQU87QUFBQSxNQUNqRCxNQUFNLFVBQVUsTUFBTSxLQUFLLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRTtBQUFBLE1BQzVDLE1BQU0sS0FBSyxJQUFJLENBQUM7QUFBQSxNQUNoQixNQUFNLEtBQUssTUFBTSxJQUFJLENBQUM7QUFBQSxNQUN0QixNQUFNLEtBQUssTUFBTSxJQUFJLENBQUM7QUFBQSxNQUN0QixNQUFNLE9BQU87QUFBQSxNQUViLElBQUksU0FBUyxPQUFPLE1BQU07QUFBQSxRQUN4QixPQUFPO0FBQUEsTUFDVDtBQUFBLE1BSUEsS0FBSyxTQUFRLG9CQUFvQixPQUFPO0FBQUEsTUFFeEMsSUFBSSxJQUFJO0FBQUEsUUFDTixJQUFJLFNBQVMsT0FBTyxTQUFTLEtBQUs7QUFBQSxVQUVoQyxNQUFNO0FBQUEsUUFDUixFQUFPO0FBQUEsVUFFTCxNQUFNO0FBQUE7QUFBQSxNQUVWLEVBQU8sU0FBSSxRQUFRLE1BQU07QUFBQSxRQUd2QixJQUFJLElBQUk7QUFBQSxVQUNOLElBQUk7QUFBQSxRQUNOO0FBQUEsUUFDQSxJQUFJO0FBQUEsUUFFSixJQUFJLFNBQVMsS0FBSztBQUFBLFVBR2hCLE9BQU87QUFBQSxVQUNQLElBQUksSUFBSTtBQUFBLFlBQ04sS0FBSyxJQUFJO0FBQUEsWUFDVCxJQUFJO0FBQUEsWUFDSixJQUFJO0FBQUEsVUFDTixFQUFPO0FBQUEsWUFDTCxLQUFLLElBQUk7QUFBQSxZQUNULElBQUk7QUFBQTtBQUFBLFFBRVIsRUFBTyxTQUFJLFNBQVMsTUFBTTtBQUFBLFVBR3hCLE9BQU87QUFBQSxVQUNQLElBQUksSUFBSTtBQUFBLFlBQ04sS0FBSyxJQUFJO0FBQUEsVUFDWCxFQUFPO0FBQUEsWUFDTCxLQUFLLElBQUk7QUFBQTtBQUFBLFFBRWI7QUFBQSxRQUVBLElBQUksU0FBUyxLQUFLO0FBQUEsVUFDaEIsS0FBSztBQUFBLFFBQ1A7QUFBQSxRQUVBLE1BQU0sR0FBRyxPQUFPLEtBQUssS0FBSyxJQUFJO0FBQUEsTUFDaEMsRUFBTyxTQUFJLElBQUk7QUFBQSxRQUNiLE1BQU0sS0FBSyxRQUFRLFFBQVEsSUFBSTtBQUFBLE1BQ2pDLEVBQU8sU0FBSSxJQUFJO0FBQUEsUUFDYixNQUFNLEtBQUssS0FBSyxNQUFNLE9BQ2pCLE1BQU0sSUFBSTtBQUFBLE1BQ2pCO0FBQUEsTUFFQSxNQUFNLGlCQUFpQixHQUFHO0FBQUEsTUFFMUIsT0FBTztBQUFBLEtBQ1I7QUFBQTtBQUFBLEVBS0gsSUFBTSxlQUFlLENBQUMsTUFBTSxhQUFZO0FBQUEsSUFDdEMsTUFBTSxnQkFBZ0IsTUFBTSxRQUFPO0FBQUEsSUFFbkMsT0FBTyxLQUNKLEtBQUssRUFDTCxRQUFRLEdBQUcsRUFBRSxPQUFPLEVBQUU7QUFBQTtBQUFBLEVBRzNCLElBQU0sY0FBYyxDQUFDLE1BQU0sYUFBWTtBQUFBLElBQ3JDLE1BQU0sZUFBZSxNQUFNLFFBQU87QUFBQSxJQUNsQyxPQUFPLEtBQ0osS0FBSyxFQUNMLFFBQVEsR0FBRyxTQUFRLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUU7QUFBQTtBQUFBLEVBU25FLElBQU0sZ0JBQWdCLFdBQVMsQ0FBQyxJQUM5QixNQUFNLElBQUksSUFBSSxJQUFJLEtBQUssSUFDdkIsSUFBSSxJQUFJLElBQUksSUFBSSxRQUFRO0FBQUEsSUFDeEIsSUFBSSxJQUFJLEVBQUUsR0FBRztBQUFBLE1BQ1gsT0FBTztBQUFBLElBQ1QsRUFBTyxTQUFJLElBQUksRUFBRSxHQUFHO0FBQUEsTUFDbEIsT0FBTyxLQUFLLFNBQVMsUUFBUSxPQUFPO0FBQUEsSUFDdEMsRUFBTyxTQUFJLElBQUksRUFBRSxHQUFHO0FBQUEsTUFDbEIsT0FBTyxLQUFLLE1BQU0sT0FBTyxRQUFRLE9BQU87QUFBQSxJQUMxQyxFQUFPLFNBQUksS0FBSztBQUFBLE1BQ2QsT0FBTyxLQUFLO0FBQUEsSUFDZCxFQUFPO0FBQUEsTUFDTCxPQUFPLEtBQUssT0FBTyxRQUFRLE9BQU87QUFBQTtBQUFBLElBR3BDLElBQUksSUFBSSxFQUFFLEdBQUc7QUFBQSxNQUNYLEtBQUs7QUFBQSxJQUNQLEVBQU8sU0FBSSxJQUFJLEVBQUUsR0FBRztBQUFBLE1BQ2xCLEtBQUssS0FBSyxLQUFLO0FBQUEsSUFDakIsRUFBTyxTQUFJLElBQUksRUFBRSxHQUFHO0FBQUEsTUFDbEIsS0FBSyxJQUFJLE9BQU8sS0FBSztBQUFBLElBQ3ZCLEVBQU8sU0FBSSxLQUFLO0FBQUEsTUFDZCxLQUFLLEtBQUssTUFBTSxNQUFNLE1BQU07QUFBQSxJQUM5QixFQUFPLFNBQUksT0FBTztBQUFBLE1BQ2hCLEtBQUssSUFBSSxNQUFNLE9BQU8sS0FBSztBQUFBLElBQzdCLEVBQU87QUFBQSxNQUNMLEtBQUssS0FBSztBQUFBO0FBQUEsSUFHWixPQUFPLEdBQUcsUUFBUSxLQUFLLEtBQUs7QUFBQTtBQUFBLEVBRzlCLElBQU0sVUFBVSxDQUFDLEtBQUssVUFBUyxhQUFZO0FBQUEsSUFDekMsU0FBUyxJQUFJLEVBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSztBQUFBLE1BQ25DLEtBQUssSUFBSSxHQUFHLEtBQUssUUFBTyxHQUFHO0FBQUEsUUFDekIsT0FBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBQUEsSUFFQSxJQUFJLFNBQVEsV0FBVyxXQUFXLFNBQVEsbUJBQW1CO0FBQUEsTUFNM0QsU0FBUyxJQUFJLEVBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSztBQUFBLFFBQ25DLE1BQU0sSUFBSSxHQUFHLE1BQU07QUFBQSxRQUNuQixJQUFJLElBQUksR0FBRyxXQUFXLFdBQVcsS0FBSztBQUFBLFVBQ3BDO0FBQUEsUUFDRjtBQUFBLFFBRUEsSUFBSSxJQUFJLEdBQUcsT0FBTyxXQUFXLFNBQVMsR0FBRztBQUFBLFVBQ3ZDLE1BQU0sVUFBVSxJQUFJLEdBQUc7QUFBQSxVQUN2QixJQUFJLFFBQVEsVUFBVSxTQUFRLFNBQzFCLFFBQVEsVUFBVSxTQUFRLFNBQzFCLFFBQVEsVUFBVSxTQUFRLE9BQU87QUFBQSxZQUNuQyxPQUFPO0FBQUEsVUFDVDtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsTUFHQSxPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUE7Ozs7RUN4aUJULElBQU0sTUFBTSxPQUFPLFlBQVk7QUFBQTtBQUFBLEVBRS9CLE1BQU0sV0FBVztBQUFBLGVBQ0osR0FBSSxHQUFHO0FBQUEsTUFDaEIsT0FBTztBQUFBO0FBQUEsSUFHVCxXQUFZLENBQUMsTUFBTSxVQUFTO0FBQUEsTUFDMUIsV0FBVSxhQUFhLFFBQU87QUFBQSxNQUU5QixJQUFJLGdCQUFnQixZQUFZO0FBQUEsUUFDOUIsSUFBSSxLQUFLLFlBQVksU0FBUSxPQUFPO0FBQUEsVUFDbEMsT0FBTztBQUFBLFFBQ1QsRUFBTztBQUFBLFVBQ0wsT0FBTyxLQUFLO0FBQUE7QUFBQSxNQUVoQjtBQUFBLE1BRUEsT0FBTyxLQUFLLEtBQUssRUFBRSxNQUFNLEtBQUssRUFBRSxLQUFLLEdBQUc7QUFBQSxNQUN4QyxNQUFNLGNBQWMsTUFBTSxRQUFPO0FBQUEsTUFDakMsS0FBSyxVQUFVO0FBQUEsTUFDZixLQUFLLFVBQVUsU0FBUTtBQUFBLE1BQ3ZCLEtBQUssTUFBTSxJQUFJO0FBQUEsTUFFZixJQUFJLEtBQUssV0FBVyxLQUFLO0FBQUEsUUFDdkIsS0FBSyxRQUFRO0FBQUEsTUFDZixFQUFPO0FBQUEsUUFDTCxLQUFLLFFBQVEsS0FBSyxXQUFXLEtBQUssT0FBTztBQUFBO0FBQUEsTUFHM0MsTUFBTSxRQUFRLElBQUk7QUFBQTtBQUFBLElBR3BCLEtBQU0sQ0FBQyxNQUFNO0FBQUEsTUFDWCxNQUFNLElBQUksS0FBSyxRQUFRLFFBQVEsR0FBRyxFQUFFLG1CQUFtQixHQUFHLEVBQUU7QUFBQSxNQUM1RCxNQUFNLElBQUksS0FBSyxNQUFNLENBQUM7QUFBQSxNQUV0QixLQUFLLEdBQUc7QUFBQSxRQUNOLE1BQU0sSUFBSSxVQUFVLHVCQUF1QixNQUFNO0FBQUEsTUFDbkQ7QUFBQSxNQUVBLEtBQUssV0FBVyxFQUFFLE9BQU8sWUFBWSxFQUFFLEtBQUs7QUFBQSxNQUM1QyxJQUFJLEtBQUssYUFBYSxLQUFLO0FBQUEsUUFDekIsS0FBSyxXQUFXO0FBQUEsTUFDbEI7QUFBQSxNQUdBLEtBQUssRUFBRSxJQUFJO0FBQUEsUUFDVCxLQUFLLFNBQVM7QUFBQSxNQUNoQixFQUFPO0FBQUEsUUFDTCxLQUFLLFNBQVMsSUFBSSxPQUFPLEVBQUUsSUFBSSxLQUFLLFFBQVEsS0FBSztBQUFBO0FBQUE7QUFBQSxJQUlyRCxRQUFTLEdBQUc7QUFBQSxNQUNWLE9BQU8sS0FBSztBQUFBO0FBQUEsSUFHZCxJQUFLLENBQUMsVUFBUztBQUFBLE1BQ2IsTUFBTSxtQkFBbUIsVUFBUyxLQUFLLFFBQVEsS0FBSztBQUFBLE1BRXBELElBQUksS0FBSyxXQUFXLE9BQU8sYUFBWSxLQUFLO0FBQUEsUUFDMUMsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUVBLElBQUksT0FBTyxhQUFZLFVBQVU7QUFBQSxRQUMvQixJQUFJO0FBQUEsVUFDRixXQUFVLElBQUksT0FBTyxVQUFTLEtBQUssT0FBTztBQUFBLFVBQzFDLE9BQU8sSUFBSTtBQUFBLFVBQ1gsT0FBTztBQUFBO0FBQUEsTUFFWDtBQUFBLE1BRUEsT0FBTyxJQUFJLFVBQVMsS0FBSyxVQUFVLEtBQUssUUFBUSxLQUFLLE9BQU87QUFBQTtBQUFBLElBRzlELFVBQVcsQ0FBQyxNQUFNLFVBQVM7QUFBQSxNQUN6QixNQUFNLGdCQUFnQixhQUFhO0FBQUEsUUFDakMsTUFBTSxJQUFJLFVBQVUsMEJBQTBCO0FBQUEsTUFDaEQ7QUFBQSxNQUVBLElBQUksS0FBSyxhQUFhLElBQUk7QUFBQSxRQUN4QixJQUFJLEtBQUssVUFBVSxJQUFJO0FBQUEsVUFDckIsT0FBTztBQUFBLFFBQ1Q7QUFBQSxRQUNBLE9BQU8sSUFBSSxNQUFNLEtBQUssT0FBTyxRQUFPLEVBQUUsS0FBSyxLQUFLLEtBQUs7QUFBQSxNQUN2RCxFQUFPLFNBQUksS0FBSyxhQUFhLElBQUk7QUFBQSxRQUMvQixJQUFJLEtBQUssVUFBVSxJQUFJO0FBQUEsVUFDckIsT0FBTztBQUFBLFFBQ1Q7QUFBQSxRQUNBLE9BQU8sSUFBSSxNQUFNLEtBQUssT0FBTyxRQUFPLEVBQUUsS0FBSyxLQUFLLE1BQU07QUFBQSxNQUN4RDtBQUFBLE1BRUEsV0FBVSxhQUFhLFFBQU87QUFBQSxNQUc5QixJQUFJLFNBQVEsc0JBQ1QsS0FBSyxVQUFVLGNBQWMsS0FBSyxVQUFVLGFBQWE7QUFBQSxRQUMxRCxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BQ0EsS0FBSyxTQUFRLHNCQUNWLEtBQUssTUFBTSxXQUFXLFFBQVEsS0FBSyxLQUFLLE1BQU0sV0FBVyxRQUFRLElBQUk7QUFBQSxRQUN0RSxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BR0EsSUFBSSxLQUFLLFNBQVMsV0FBVyxHQUFHLEtBQUssS0FBSyxTQUFTLFdBQVcsR0FBRyxHQUFHO0FBQUEsUUFDbEUsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUVBLElBQUksS0FBSyxTQUFTLFdBQVcsR0FBRyxLQUFLLEtBQUssU0FBUyxXQUFXLEdBQUcsR0FBRztBQUFBLFFBQ2xFLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFFQSxJQUNHLEtBQUssT0FBTyxZQUFZLEtBQUssT0FBTyxXQUNyQyxLQUFLLFNBQVMsU0FBUyxHQUFHLEtBQUssS0FBSyxTQUFTLFNBQVMsR0FBRyxHQUFHO0FBQUEsUUFDNUQsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUVBLElBQUksSUFBSSxLQUFLLFFBQVEsS0FBSyxLQUFLLFFBQVEsUUFBTyxLQUM1QyxLQUFLLFNBQVMsV0FBVyxHQUFHLEtBQUssS0FBSyxTQUFTLFdBQVcsR0FBRyxHQUFHO0FBQUEsUUFDaEUsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUVBLElBQUksSUFBSSxLQUFLLFFBQVEsS0FBSyxLQUFLLFFBQVEsUUFBTyxLQUM1QyxLQUFLLFNBQVMsV0FBVyxHQUFHLEtBQUssS0FBSyxTQUFTLFdBQVcsR0FBRyxHQUFHO0FBQUEsUUFDaEUsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLEVBRVg7QUFBQSxFQUVBLE9BQU8sVUFBVTtBQUFBLEVBRWpCLElBQU07QUFBQSxFQUNOLE1BQVEsUUFBUSxJQUFJO0FBQUEsRUFDcEIsSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBOzs7O0VDNUlOLElBQU07QUFBQSxFQUNOLElBQU0sWUFBWSxDQUFDLFVBQVMsT0FBTyxhQUFZO0FBQUEsSUFDN0MsSUFBSTtBQUFBLE1BQ0YsUUFBUSxJQUFJLE1BQU0sT0FBTyxRQUFPO0FBQUEsTUFDaEMsT0FBTyxJQUFJO0FBQUEsTUFDWCxPQUFPO0FBQUE7QUFBQSxJQUVULE9BQU8sTUFBTSxLQUFLLFFBQU87QUFBQTtBQUFBLEVBRTNCLE9BQU8sVUFBVTtBQUFBOzs7O0VDVGpCLElBQU07QUFBQSxFQUdOLElBQU0sZ0JBQWdCLENBQUMsT0FBTyxhQUM1QixJQUFJLE1BQU0sT0FBTyxRQUFPLEVBQUUsSUFDdkIsSUFBSSxVQUFRLEtBQUssSUFBSSxPQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQztBQUFBLEVBRW5FLE9BQU8sVUFBVTtBQUFBOzs7O0VDUGpCLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUVOLElBQU0sZ0JBQWdCLENBQUMsVUFBVSxPQUFPLGFBQVk7QUFBQSxJQUNsRCxJQUFJLE1BQU07QUFBQSxJQUNWLElBQUksUUFBUTtBQUFBLElBQ1osSUFBSSxXQUFXO0FBQUEsSUFDZixJQUFJO0FBQUEsTUFDRixXQUFXLElBQUksTUFBTSxPQUFPLFFBQU87QUFBQSxNQUNuQyxPQUFPLElBQUk7QUFBQSxNQUNYLE9BQU87QUFBQTtBQUFBLElBRVQsU0FBUyxRQUFRLENBQUMsTUFBTTtBQUFBLE1BQ3RCLElBQUksU0FBUyxLQUFLLENBQUMsR0FBRztBQUFBLFFBRXBCLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQyxNQUFNLElBQUk7QUFBQSxVQUVuQyxNQUFNO0FBQUEsVUFDTixRQUFRLElBQUksT0FBTyxLQUFLLFFBQU87QUFBQSxRQUNqQztBQUFBLE1BQ0Y7QUFBQSxLQUNEO0FBQUEsSUFDRCxPQUFPO0FBQUE7QUFBQSxFQUVULE9BQU8sVUFBVTtBQUFBOzs7O0VDeEJqQixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNLGdCQUFnQixDQUFDLFVBQVUsT0FBTyxhQUFZO0FBQUEsSUFDbEQsSUFBSSxNQUFNO0FBQUEsSUFDVixJQUFJLFFBQVE7QUFBQSxJQUNaLElBQUksV0FBVztBQUFBLElBQ2YsSUFBSTtBQUFBLE1BQ0YsV0FBVyxJQUFJLE1BQU0sT0FBTyxRQUFPO0FBQUEsTUFDbkMsT0FBTyxJQUFJO0FBQUEsTUFDWCxPQUFPO0FBQUE7QUFBQSxJQUVULFNBQVMsUUFBUSxDQUFDLE1BQU07QUFBQSxNQUN0QixJQUFJLFNBQVMsS0FBSyxDQUFDLEdBQUc7QUFBQSxRQUVwQixLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUMsTUFBTSxHQUFHO0FBQUEsVUFFbEMsTUFBTTtBQUFBLFVBQ04sUUFBUSxJQUFJLE9BQU8sS0FBSyxRQUFPO0FBQUEsUUFDakM7QUFBQSxNQUNGO0FBQUEsS0FDRDtBQUFBLElBQ0QsT0FBTztBQUFBO0FBQUEsRUFFVCxPQUFPLFVBQVU7QUFBQTs7OztFQ3ZCakIsSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBRU4sSUFBTSxhQUFhLENBQUMsT0FBTyxVQUFVO0FBQUEsSUFDbkMsUUFBUSxJQUFJLE1BQU0sT0FBTyxLQUFLO0FBQUEsSUFFOUIsSUFBSSxTQUFTLElBQUksT0FBTyxPQUFPO0FBQUEsSUFDL0IsSUFBSSxNQUFNLEtBQUssTUFBTSxHQUFHO0FBQUEsTUFDdEIsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLFNBQVMsSUFBSSxPQUFPLFNBQVM7QUFBQSxJQUM3QixJQUFJLE1BQU0sS0FBSyxNQUFNLEdBQUc7QUFBQSxNQUN0QixPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsU0FBUztBQUFBLElBQ1QsU0FBUyxJQUFJLEVBQUcsSUFBSSxNQUFNLElBQUksVUFBVSxHQUFHO0FBQUEsTUFDekMsTUFBTSxjQUFjLE1BQU0sSUFBSTtBQUFBLE1BRTlCLElBQUksU0FBUztBQUFBLE1BQ2IsWUFBWSxRQUFRLENBQUMsZUFBZTtBQUFBLFFBRWxDLE1BQU0sVUFBVSxJQUFJLE9BQU8sV0FBVyxPQUFPLE9BQU87QUFBQSxRQUNwRCxRQUFRLFdBQVc7QUFBQSxlQUNaO0FBQUEsWUFDSCxJQUFJLFFBQVEsV0FBVyxXQUFXLEdBQUc7QUFBQSxjQUNuQyxRQUFRO0FBQUEsWUFDVixFQUFPO0FBQUEsY0FDTCxRQUFRLFdBQVcsS0FBSyxDQUFDO0FBQUE7QUFBQSxZQUUzQixRQUFRLE1BQU0sUUFBUSxPQUFPO0FBQUEsZUFFMUI7QUFBQSxlQUNBO0FBQUEsWUFDSCxLQUFLLFVBQVUsSUFBRyxTQUFTLE1BQU0sR0FBRztBQUFBLGNBQ2xDLFNBQVM7QUFBQSxZQUNYO0FBQUEsWUFDQTtBQUFBLGVBQ0c7QUFBQSxlQUNBO0FBQUEsWUFFSDtBQUFBO0FBQUEsWUFHQSxNQUFNLElBQUksTUFBTSx5QkFBeUIsV0FBVyxVQUFVO0FBQUE7QUFBQSxPQUVuRTtBQUFBLE1BQ0QsSUFBSSxZQUFZLFVBQVUsSUFBRyxRQUFRLE1BQU0sSUFBSTtBQUFBLFFBQzdDLFNBQVM7QUFBQSxNQUNYO0FBQUEsSUFDRjtBQUFBLElBRUEsSUFBSSxVQUFVLE1BQU0sS0FBSyxNQUFNLEdBQUc7QUFBQSxNQUNoQyxPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUEsRUFFVCxPQUFPLFVBQVU7QUFBQTs7OztFQzVEakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxhQUFhLENBQUMsT0FBTyxhQUFZO0FBQUEsSUFDckMsSUFBSTtBQUFBLE1BR0YsT0FBTyxJQUFJLE1BQU0sT0FBTyxRQUFPLEVBQUUsU0FBUztBQUFBLE1BQzFDLE9BQU8sSUFBSTtBQUFBLE1BQ1gsT0FBTztBQUFBO0FBQUE7QUFBQSxFQUdYLE9BQU8sVUFBVTtBQUFBOzs7O0VDVmpCLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLE1BQVEsUUFBUTtBQUFBLEVBQ2hCLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUVOLElBQU0sVUFBVSxDQUFDLFVBQVMsT0FBTyxNQUFNLGFBQVk7QUFBQSxJQUNqRCxXQUFVLElBQUksT0FBTyxVQUFTLFFBQU87QUFBQSxJQUNyQyxRQUFRLElBQUksTUFBTSxPQUFPLFFBQU87QUFBQSxJQUVoQyxJQUFJLE1BQU0sT0FBTyxNQUFNLE1BQU07QUFBQSxJQUM3QixRQUFRO0FBQUEsV0FDRDtBQUFBLFFBQ0gsT0FBTztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsT0FBTztBQUFBLFFBQ1AsT0FBTztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1I7QUFBQSxXQUNHO0FBQUEsUUFDSCxPQUFPO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUixPQUFPO0FBQUEsUUFDUCxPQUFPO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUjtBQUFBO0FBQUEsUUFFQSxNQUFNLElBQUksVUFBVSx1Q0FBdUM7QUFBQTtBQUFBLElBSS9ELElBQUksVUFBVSxVQUFTLE9BQU8sUUFBTyxHQUFHO0FBQUEsTUFDdEMsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUtBLFNBQVMsSUFBSSxFQUFHLElBQUksTUFBTSxJQUFJLFVBQVUsR0FBRztBQUFBLE1BQ3pDLE1BQU0sY0FBYyxNQUFNLElBQUk7QUFBQSxNQUU5QixJQUFJLE9BQU87QUFBQSxNQUNYLElBQUksTUFBTTtBQUFBLE1BRVYsWUFBWSxRQUFRLENBQUMsZUFBZTtBQUFBLFFBQ2xDLElBQUksV0FBVyxXQUFXLEtBQUs7QUFBQSxVQUM3QixhQUFhLElBQUksV0FBVyxTQUFTO0FBQUEsUUFDdkM7QUFBQSxRQUNBLE9BQU8sUUFBUTtBQUFBLFFBQ2YsTUFBTSxPQUFPO0FBQUEsUUFDYixJQUFJLEtBQUssV0FBVyxRQUFRLEtBQUssUUFBUSxRQUFPLEdBQUc7QUFBQSxVQUNqRCxPQUFPO0FBQUEsUUFDVCxFQUFPLFNBQUksS0FBSyxXQUFXLFFBQVEsSUFBSSxRQUFRLFFBQU8sR0FBRztBQUFBLFVBQ3ZELE1BQU07QUFBQSxRQUNSO0FBQUEsT0FDRDtBQUFBLE1BSUQsSUFBSSxLQUFLLGFBQWEsUUFBUSxLQUFLLGFBQWEsT0FBTztBQUFBLFFBQ3JELE9BQU87QUFBQSxNQUNUO0FBQUEsTUFJQSxNQUFNLElBQUksWUFBWSxJQUFJLGFBQWEsU0FDbkMsTUFBTSxVQUFTLElBQUksTUFBTSxHQUFHO0FBQUEsUUFDOUIsT0FBTztBQUFBLE1BQ1QsRUFBTyxTQUFJLElBQUksYUFBYSxTQUFTLEtBQUssVUFBUyxJQUFJLE1BQU0sR0FBRztBQUFBLFFBQzlELE9BQU87QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFHVCxPQUFPLFVBQVU7QUFBQTs7OztFQzlFakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxNQUFNLENBQUMsVUFBUyxPQUFPLGFBQVksUUFBUSxVQUFTLE9BQU8sS0FBSyxRQUFPO0FBQUEsRUFDN0UsT0FBTyxVQUFVO0FBQUE7Ozs7RUNIakIsSUFBTTtBQUFBLEVBRU4sSUFBTSxNQUFNLENBQUMsVUFBUyxPQUFPLGFBQVksUUFBUSxVQUFTLE9BQU8sS0FBSyxRQUFPO0FBQUEsRUFDN0UsT0FBTyxVQUFVO0FBQUE7Ozs7RUNIakIsSUFBTTtBQUFBLEVBQ04sSUFBTSxhQUFhLENBQUMsSUFBSSxJQUFJLGFBQVk7QUFBQSxJQUN0QyxLQUFLLElBQUksTUFBTSxJQUFJLFFBQU87QUFBQSxJQUMxQixLQUFLLElBQUksTUFBTSxJQUFJLFFBQU87QUFBQSxJQUMxQixPQUFPLEdBQUcsV0FBVyxJQUFJLFFBQU87QUFBQTtBQUFBLEVBRWxDLE9BQU8sVUFBVTtBQUFBOzs7O0VDSGpCLElBQU07QUFBQSxFQUNOLElBQU07QUFBQSxFQUNOLE9BQU8sVUFBVSxDQUFDLFVBQVUsT0FBTyxhQUFZO0FBQUEsSUFDN0MsTUFBTSxNQUFNLENBQUM7QUFBQSxJQUNiLElBQUksUUFBUTtBQUFBLElBQ1osSUFBSSxPQUFPO0FBQUEsSUFDWCxNQUFNLElBQUksU0FBUyxLQUFLLENBQUMsR0FBRyxNQUFNLFFBQVEsR0FBRyxHQUFHLFFBQU8sQ0FBQztBQUFBLElBQ3hELFdBQVcsWUFBVyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxXQUFXLFVBQVUsVUFBUyxPQUFPLFFBQU87QUFBQSxNQUNsRCxJQUFJLFVBQVU7QUFBQSxRQUNaLE9BQU87QUFBQSxRQUNQLEtBQUssT0FBTztBQUFBLFVBQ1YsUUFBUTtBQUFBLFFBQ1Y7QUFBQSxNQUNGLEVBQU87QUFBQSxRQUNMLElBQUksTUFBTTtBQUFBLFVBQ1IsSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUM7QUFBQSxRQUN4QjtBQUFBLFFBQ0EsT0FBTztBQUFBLFFBQ1AsUUFBUTtBQUFBO0FBQUEsSUFFWjtBQUFBLElBQ0EsSUFBSSxPQUFPO0FBQUEsTUFDVCxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQztBQUFBLElBQ3hCO0FBQUEsSUFFQSxNQUFNLFNBQVMsQ0FBQztBQUFBLElBQ2hCLFlBQVksS0FBSyxRQUFRLEtBQUs7QUFBQSxNQUM1QixJQUFJLFFBQVEsS0FBSztBQUFBLFFBQ2YsT0FBTyxLQUFLLEdBQUc7QUFBQSxNQUNqQixFQUFPLFVBQUssT0FBTyxRQUFRLEVBQUUsSUFBSTtBQUFBLFFBQy9CLE9BQU8sS0FBSyxHQUFHO0FBQUEsTUFDakIsRUFBTyxVQUFLLEtBQUs7QUFBQSxRQUNmLE9BQU8sS0FBSyxLQUFLLEtBQUs7QUFBQSxNQUN4QixFQUFPLFNBQUksUUFBUSxFQUFFLElBQUk7QUFBQSxRQUN2QixPQUFPLEtBQUssS0FBSyxLQUFLO0FBQUEsTUFDeEIsRUFBTztBQUFBLFFBQ0wsT0FBTyxLQUFLLEdBQUcsU0FBUyxLQUFLO0FBQUE7QUFBQSxJQUVqQztBQUFBLElBQ0EsTUFBTSxhQUFhLE9BQU8sS0FBSyxNQUFNO0FBQUEsSUFDckMsTUFBTSxXQUFXLE9BQU8sTUFBTSxRQUFRLFdBQVcsTUFBTSxNQUFNLE9BQU8sS0FBSztBQUFBLElBQ3pFLE9BQU8sV0FBVyxTQUFTLFNBQVMsU0FBUyxhQUFhO0FBQUE7QUFBQTs7OztFQzdDNUQsSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBQ04sTUFBUSxRQUFRO0FBQUEsRUFDaEIsSUFBTTtBQUFBLEVBQ04sSUFBTTtBQUFBLEVBc0NOLElBQU0sU0FBUyxDQUFDLEtBQUssS0FBSyxXQUFVLENBQUMsTUFBTTtBQUFBLElBQ3pDLElBQUksUUFBUSxLQUFLO0FBQUEsTUFDZixPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsTUFBTSxJQUFJLE1BQU0sS0FBSyxRQUFPO0FBQUEsSUFDNUIsTUFBTSxJQUFJLE1BQU0sS0FBSyxRQUFPO0FBQUEsSUFDNUIsSUFBSSxhQUFhO0FBQUEsSUFFakI7QUFBQSxNQUFPLFdBQVcsYUFBYSxJQUFJLEtBQUs7QUFBQSxRQUN0QyxXQUFXLGFBQWEsSUFBSSxLQUFLO0FBQUEsVUFDL0IsTUFBTSxRQUFRLGFBQWEsV0FBVyxXQUFXLFFBQU87QUFBQSxVQUN4RCxhQUFhLGNBQWMsVUFBVTtBQUFBLFVBQ3JDLElBQUksT0FBTztBQUFBLFlBQ1Q7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLFFBS0EsSUFBSSxZQUFZO0FBQUEsVUFDZCxPQUFPO0FBQUEsUUFDVDtBQUFBLE1BQ0Y7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLEVBR1QsSUFBTSwrQkFBK0IsQ0FBQyxJQUFJLFdBQVcsV0FBVyxDQUFDO0FBQUEsRUFDakUsSUFBTSxpQkFBaUIsQ0FBQyxJQUFJLFdBQVcsU0FBUyxDQUFDO0FBQUEsRUFFakQsSUFBTSxlQUFlLENBQUMsS0FBSyxLQUFLLGFBQVk7QUFBQSxJQUMxQyxJQUFJLFFBQVEsS0FBSztBQUFBLE1BQ2YsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLElBQUksSUFBSSxXQUFXLEtBQUssSUFBSSxHQUFHLFdBQVcsS0FBSztBQUFBLE1BQzdDLElBQUksSUFBSSxXQUFXLEtBQUssSUFBSSxHQUFHLFdBQVcsS0FBSztBQUFBLFFBQzdDLE9BQU87QUFBQSxNQUNULEVBQU8sU0FBSSxTQUFRLG1CQUFtQjtBQUFBLFFBQ3BDLE1BQU07QUFBQSxNQUNSLEVBQU87QUFBQSxRQUNMLE1BQU07QUFBQTtBQUFBLElBRVY7QUFBQSxJQUVBLElBQUksSUFBSSxXQUFXLEtBQUssSUFBSSxHQUFHLFdBQVcsS0FBSztBQUFBLE1BQzdDLElBQUksU0FBUSxtQkFBbUI7QUFBQSxRQUM3QixPQUFPO0FBQUEsTUFDVCxFQUFPO0FBQUEsUUFDTCxNQUFNO0FBQUE7QUFBQSxJQUVWO0FBQUEsSUFFQSxNQUFNLFFBQVEsSUFBSTtBQUFBLElBQ2xCLElBQUksS0FBSTtBQUFBLElBQ1IsV0FBVyxLQUFLLEtBQUs7QUFBQSxNQUNuQixJQUFJLEVBQUUsYUFBYSxPQUFPLEVBQUUsYUFBYSxNQUFNO0FBQUEsUUFDN0MsTUFBSyxTQUFTLEtBQUksR0FBRyxRQUFPO0FBQUEsTUFDOUIsRUFBTyxTQUFJLEVBQUUsYUFBYSxPQUFPLEVBQUUsYUFBYSxNQUFNO0FBQUEsUUFDcEQsTUFBSyxRQUFRLEtBQUksR0FBRyxRQUFPO0FBQUEsTUFDN0IsRUFBTztBQUFBLFFBQ0wsTUFBTSxJQUFJLEVBQUUsTUFBTTtBQUFBO0FBQUEsSUFFdEI7QUFBQSxJQUVBLElBQUksTUFBTSxPQUFPLEdBQUc7QUFBQSxNQUNsQixPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsSUFBSTtBQUFBLElBQ0osSUFBSSxPQUFNLEtBQUk7QUFBQSxNQUNaLFdBQVcsUUFBUSxJQUFHLFFBQVEsSUFBRyxRQUFRLFFBQU87QUFBQSxNQUNoRCxJQUFJLFdBQVcsR0FBRztBQUFBLFFBQ2hCLE9BQU87QUFBQSxNQUNULEVBQU8sU0FBSSxhQUFhLE1BQU0sSUFBRyxhQUFhLFFBQVEsSUFBRyxhQUFhLE9BQU87QUFBQSxRQUMzRSxPQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFBQSxJQUdBLFdBQVcsT0FBTSxPQUFPO0FBQUEsTUFDdEIsSUFBSSxRQUFPLFVBQVUsS0FBSSxPQUFPLEdBQUUsR0FBRyxRQUFPLEdBQUc7QUFBQSxRQUM3QyxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BRUEsSUFBSSxRQUFPLFVBQVUsS0FBSSxPQUFPLEdBQUUsR0FBRyxRQUFPLEdBQUc7QUFBQSxRQUM3QyxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BRUEsV0FBVyxLQUFLLEtBQUs7QUFBQSxRQUNuQixLQUFLLFVBQVUsS0FBSSxPQUFPLENBQUMsR0FBRyxRQUFPLEdBQUc7QUFBQSxVQUN0QyxPQUFPO0FBQUEsUUFDVDtBQUFBLE1BQ0Y7QUFBQSxNQUVBLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxJQUFJLFFBQVE7QUFBQSxJQUNaLElBQUksVUFBVTtBQUFBLElBR2QsSUFBSSxlQUFlLFFBQ2hCLFNBQVEscUJBQ1QsSUFBRyxPQUFPLFdBQVcsU0FBUyxJQUFHLFNBQVM7QUFBQSxJQUM1QyxJQUFJLGVBQWUsUUFDaEIsU0FBUSxxQkFDVCxJQUFHLE9BQU8sV0FBVyxTQUFTLElBQUcsU0FBUztBQUFBLElBRTVDLElBQUksZ0JBQWdCLGFBQWEsV0FBVyxXQUFXLEtBQ25ELElBQUcsYUFBYSxPQUFPLGFBQWEsV0FBVyxPQUFPLEdBQUc7QUFBQSxNQUMzRCxlQUFlO0FBQUEsSUFDakI7QUFBQSxJQUVBLFdBQVcsS0FBSyxLQUFLO0FBQUEsTUFDbkIsV0FBVyxZQUFZLEVBQUUsYUFBYSxPQUFPLEVBQUUsYUFBYTtBQUFBLE1BQzVELFdBQVcsWUFBWSxFQUFFLGFBQWEsT0FBTyxFQUFFLGFBQWE7QUFBQSxNQUM1RCxJQUFJLEtBQUk7QUFBQSxRQUNOLElBQUksY0FBYztBQUFBLFVBQ2hCLElBQUksRUFBRSxPQUFPLGNBQWMsRUFBRSxPQUFPLFdBQVcsVUFDM0MsRUFBRSxPQUFPLFVBQVUsYUFBYSxTQUNoQyxFQUFFLE9BQU8sVUFBVSxhQUFhLFNBQ2hDLEVBQUUsT0FBTyxVQUFVLGFBQWEsT0FBTztBQUFBLFlBQ3pDLGVBQWU7QUFBQSxVQUNqQjtBQUFBLFFBQ0Y7QUFBQSxRQUNBLElBQUksRUFBRSxhQUFhLE9BQU8sRUFBRSxhQUFhLE1BQU07QUFBQSxVQUM3QyxTQUFTLFNBQVMsS0FBSSxHQUFHLFFBQU87QUFBQSxVQUNoQyxJQUFJLFdBQVcsS0FBSyxXQUFXLEtBQUk7QUFBQSxZQUNqQyxPQUFPO0FBQUEsVUFDVDtBQUFBLFFBQ0YsRUFBTyxTQUFJLElBQUcsYUFBYSxTQUFTLFVBQVUsSUFBRyxRQUFRLE9BQU8sQ0FBQyxHQUFHLFFBQU8sR0FBRztBQUFBLFVBQzVFLE9BQU87QUFBQSxRQUNUO0FBQUEsTUFDRjtBQUFBLE1BQ0EsSUFBSSxLQUFJO0FBQUEsUUFDTixJQUFJLGNBQWM7QUFBQSxVQUNoQixJQUFJLEVBQUUsT0FBTyxjQUFjLEVBQUUsT0FBTyxXQUFXLFVBQzNDLEVBQUUsT0FBTyxVQUFVLGFBQWEsU0FDaEMsRUFBRSxPQUFPLFVBQVUsYUFBYSxTQUNoQyxFQUFFLE9BQU8sVUFBVSxhQUFhLE9BQU87QUFBQSxZQUN6QyxlQUFlO0FBQUEsVUFDakI7QUFBQSxRQUNGO0FBQUEsUUFDQSxJQUFJLEVBQUUsYUFBYSxPQUFPLEVBQUUsYUFBYSxNQUFNO0FBQUEsVUFDN0MsUUFBUSxRQUFRLEtBQUksR0FBRyxRQUFPO0FBQUEsVUFDOUIsSUFBSSxVQUFVLEtBQUssVUFBVSxLQUFJO0FBQUEsWUFDL0IsT0FBTztBQUFBLFVBQ1Q7QUFBQSxRQUNGLEVBQU8sU0FBSSxJQUFHLGFBQWEsU0FBUyxVQUFVLElBQUcsUUFBUSxPQUFPLENBQUMsR0FBRyxRQUFPLEdBQUc7QUFBQSxVQUM1RSxPQUFPO0FBQUEsUUFDVDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLEtBQUssRUFBRSxhQUFhLE9BQU0sUUFBTyxhQUFhLEdBQUc7QUFBQSxRQUMvQyxPQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFBQSxJQUtBLElBQUksT0FBTSxhQUFhLE9BQU0sYUFBYSxHQUFHO0FBQUEsTUFDM0MsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLElBQUksT0FBTSxhQUFhLE9BQU0sYUFBYSxHQUFHO0FBQUEsTUFDM0MsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUtBLElBQUksZ0JBQWdCLGNBQWM7QUFBQSxNQUNoQyxPQUFPO0FBQUEsSUFDVDtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUEsRUFJVCxJQUFNLFdBQVcsQ0FBQyxHQUFHLEdBQUcsYUFBWTtBQUFBLElBQ2xDLEtBQUssR0FBRztBQUFBLE1BQ04sT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLE1BQU0sT0FBTyxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsUUFBTztBQUFBLElBQ2hELE9BQU8sT0FBTyxJQUFJLElBQ2QsT0FBTyxJQUFJLElBQ1gsRUFBRSxhQUFhLE9BQU8sRUFBRSxhQUFhLE9BQU8sSUFDNUM7QUFBQTtBQUFBLEVBSU4sSUFBTSxVQUFVLENBQUMsR0FBRyxHQUFHLGFBQVk7QUFBQSxJQUNqQyxLQUFLLEdBQUc7QUFBQSxNQUNOLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxNQUFNLE9BQU8sUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLFFBQU87QUFBQSxJQUNoRCxPQUFPLE9BQU8sSUFBSSxJQUNkLE9BQU8sSUFBSSxJQUNYLEVBQUUsYUFBYSxPQUFPLEVBQUUsYUFBYSxPQUFPLElBQzVDO0FBQUE7QUFBQSxFQUdOLE9BQU8sVUFBVTtBQUFBOzs7O0VDclBqQixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixJQUFNO0FBQUEsRUFDTixPQUFPLFVBQVU7QUFBQSxJQUNmO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElB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QUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFFakIsSUFBSSxXQUFXLE1BQUssV0FBVyxJQUFJO0FBQUEsTUFDbkMsSUFBSSxTQUFTO0FBQUEsTUFFYixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksTUFBUSxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3JELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxPQUFPLE1BQU87QUFBQSxNQUNoRCxNQUFNO0FBQUEsTUFFTixLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxPQUFTLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDdEQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLFFBQVEsTUFBTztBQUFBLE1BQ2pELE9BQU87QUFBQSxNQUVQLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLElBQUksT0FBUyxJQUFJLEtBQU0sT0FBTyxNQUFNLFNBQVcsTUFBTztBQUFBLE1BQ3RELEtBQU8sTUFBTSxRQUFRLE1BQU8sTUFBTSxRQUFRLE1BQU87QUFBQSxNQUNqRCxPQUFPO0FBQUEsTUFFUCxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN4QixNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFN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QUFBQSxNQUNsQyxPQUFPLEtBQUssSUFBSSxHQUFHLE1BQU07QUFBQTtBQUFBLElBRzNCLEdBQUcsVUFBVSxPQUFPLFNBQVMsSUFBSyxDQUFDLEtBQUs7QUFBQSxNQUN0QyxPQUFPLEtBQUssS0FBSyxHQUFHLEtBQUs7QUFBQTtBQUFBLElBRzNCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxPQUFPLEtBQUssSUFBSSxHQUFHLEtBQUs7QUFBQTtBQUFBLElBRzFCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxPQUFPLEtBQUssS0FBSyxHQUFHLE1BQU07QUFBQTtBQUFBLElBRzVCLEdBQUcsVUFBVSxLQUFLLFNBQVMsRUFBRyxDQUFDLEtBQUs7QUFBQSxNQUNsQyxPQUFPLEtBQUssSUFBSSxHQUFHLE1BQU07QUFBQTtBQUFBLElBRzNCLEdBQUcsVUFBVSxPQUFPLFNBQVMsSUFBSyxDQUFDLEtBQUs7QUFBQSxNQUN0QyxPQUFPLEtBQUssS0FBSyxHQUFHLEtBQUs7QUFBQTtBQUFBLElBRzNCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxPQUFPLEtBQUssSUFBSSxHQUFHLEtBQUs7QUFBQTtBQUFBLElBRzFCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxPQUFPLEtBQUssS0FBSyxHQUFHLE1BQU07QUFBQTtBQUFBLElBRzVCLEdBQUcsVUFBVSxLQUFLLFNBQVMsRUFBRyxDQUFDLEtBQUs7QUFBQSxNQUNsQyxPQUFPLEtBQUssSUFBSSxHQUFHLE1BQU07QUFBQTtBQUFBLElBTzNCLEdBQUcsTUFBTSxTQUFTLEdBQUksQ0FBQyxLQUFLO0FBQUEsTUFDMUIsT0FBTyxJQUFJLElBQUksR0FBRztBQUFBO0FBQUEsSUFHcEIsR0FBRyxVQUFVLFFBQVEsU0FBUyxLQUFNLENBQUMsS0FBSztBQUFBLE1BQ3hDLFFBQVEsS0FBSyxLQUFLLHVDQUF1QztBQUFBLE1B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O0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElB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QUFBQSxJQUNsRDtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQ25EO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsRUFDcEQ7QUFBQSxFQUVBLElBQUksS0FBSztBQUFBLElBQ1A7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUNsRDtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQ25EO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDbEQ7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUNsRDtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLEVBQ3BEO0FBQUEsRUFFQSxJQUFJLElBQUk7QUFBQSxJQUNOO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDckQ7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUNwRDtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQ3JEO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDcEQ7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxFQUN2RDtBQUFBLEVBRUEsSUFBSSxLQUFLO0FBQUEsSUFDUDtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQ3JEO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFDcEQ7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUNyRDtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQ3JEO0FBQUEsSUFBRztBQUFBLElBQUc7QUFB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Q0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxLQUFLO0FBQUEsTUFDSCxLQUFLO0FBQUEsTUFDTCxRQUFRO0FBQUEsUUFDTjtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FB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QUFlLENBQUMsSUFBSTtBQUFBLEVBQ2xDLE9BQU8sTUFBTSxTQUFTLGNBQWMsS0FBSztBQUFBO0FBRTFDLGVBQWUsdUJBQXVCLENBQUMsSUFBSTtBQUFBLEVBQzFDLE9BQU8sTUFBTSxTQUFTLGNBQWMsa0JBQWtCO0FBQUE7QUFFdkQsZUFBZSxnQkFBZ0IsQ0FBQyxJQUFJO0FBQUEsRUFDbkMsT0FBTyxNQUFNLFNBQVMsY0FBYyxXQUFXO0FBQUE7OztBQ1JoRCxTQUFTLHNCQUFzQixDQUFDLFdBQVc7QUFBQSxFQUMxQyxLQUFLLGdCQUFnQixTQUFTLFdBQVcsK0JBQStCO0FBQUEsSUFBRyxPQUFPO0FBQUEsRUFDbEYsT0FBTyxTQUFTLGVBQWUsVUFBVSxvQkFBb0IsU0FBUztBQUFBO0FBTXZFLFNBQVMsMkJBQTJCLENBQUMsYUFBYTtBQUFBLEVBQ2pELE1BQU0seUJBQXlCLFlBQVksb0JBQW9CLFlBQVksa0JBQWtCLFlBQVk7QUFBQSxFQUN6RyxNQUFNLGlDQUFpQyxJQUFJLEtBQUssR0FBRyxRQUFRLElBQUksSUFBSSxLQUFLLFlBQVksVUFBVSxFQUFFLFFBQVEsTUFBTSxJQUFJLEtBQUssWUFBWSxXQUFXLEVBQUUsUUFBUSxJQUFJLElBQUksS0FBSyxZQUFZLFVBQVUsRUFBRSxRQUFRO0FBQUEsRUFDck0sT0FBTyx5QkFBeUIsSUFBSSx5QkFBeUI7QUFBQTs7O0FDYjlELGVBQXNCLEdBQUcsR0FBRyxPQUFPLFNBQVMsWUFBNEI7QUFBQSxFQUV0RSxNQUFNLFlBQVksT0FBUTtBQUFBLEVBQzFCLE1BQU0sY0FBYyxPQUFRO0FBQUEsRUFFNUIsTUFBTSxPQUFPLFdBQVcsZ0JBQWdCLFNBQVM7QUFBQSxFQUNqRCxNQUFNLFlBQVksZ0JBQWdCLG1CQUFtQixLQUFLLElBQUksT0FBTyxXQUFXLENBQUM7QUFBQSxFQUNqRixLQUFLLE1BQU07QUFBQSxJQUNULE1BQU0sSUFBSSxNQUFNLGlDQUFpQyxXQUFXO0FBQUEsRUFDOUQ7QUFBQSxFQUNBLEtBQUssV0FBVztBQUFBLElBQ2QsTUFBTSxJQUFJLE1BQU0saUNBQWlDLEtBQUssdUJBQXVCLGFBQWE7QUFBQSxFQUM1RjtBQUFBLEVBQ0EsTUFBTSxTQUFTLGdCQUFnQixVQUFVLFNBQVM7QUFBQSxFQUVsRCxNQUFNLFVBQW1CLE1BQU0sSUFBSSxTQUFTO0FBQUEsRUFDNUMsTUFBTSxXQUFXLE1BQU0sUUFBUSxTQUFTLFdBQVcsR0FBRyxNQUFNLENBQUM7QUFBQSxFQUM3RCxVQUFVLFVBQVUsYUFBYSxXQUFXLEtBQUssRUFBZTtBQUFBLEVBQ2hFLFVBQVUsVUFBVSxlQUFlLGFBQWEsS0FBSyxFQUFlO0FBQUEsRUFDcEUsT0FBTztBQUFBOyIsCiAgImRlYnVnSWQiOiAiRjVERTNCQjFENEIwQzUxMjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
diff --git a/packages/eve-web/build/api/auth/discordID/[discordID]/characterID/[characterID]/scopes/[scopes].js b/packages/eve-web/build/api/auth/discordID/[discordID]/characterID/[characterID]/scopes/[scopes].js
deleted file mode 100644
index 5199d58..0000000
--- a/packages/eve-web/build/api/auth/discordID/[discordID]/characterID/[characterID]/scopes/[scopes].js
+++ /dev/null
@@ -1,55 +0,0 @@
-// @bun
-var __create = Object.create;
-var __getProtoOf = Object.getPrototypeOf;
-var __defProp = Object.defineProperty;
-var __getOwnPropNames = Object.getOwnPropertyNames;
-var __hasOwnProp = Object.prototype.hasOwnProperty;
-var __toESM = (mod, isNodeMode, target) => {
- target = mod != null ? __create(__getProtoOf(mod)) : {};
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
- for (let key of __getOwnPropNames(mod))
- if (!__hasOwnProp.call(to, key))
- __defProp(to, key, {
- get: () => mod[key],
- enumerable: true
- });
- return to;
-};
-var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
-var __require = import.meta.require;
-
-// src/utils/cookies.ts
-function getCookies(headers) {
- if (!headers)
- return {};
- const cookieHeader = headers.get("Cookie");
- const cookies = {};
- if (cookieHeader === null)
- return {};
- for (const kv of cookieHeader.split(";")) {
- const [cookieKey, ...cookieVal] = kv.split("=");
- const key = cookieKey.trim();
- cookies[key] = cookieVal.join("=");
- }
- return cookies;
-}
-function setCookie(response, key, value, maxAge) {
- response.headers.append("Set-Cookie", `${key}=${value}${maxAge ? "; Path=/; Max-Age=" + maxAge : ""}`);
-}
-function removeCookie(response, key) {
- response.headers.append("Set-Cookie", `${key}=""; Path=/; Max-Age=-1;`);
-}
-// src/api/auth/discordID/[discordID]/characterID/[characterID]/scopes/[scopes].ts
-async function GET({ store, route: { params } }) {
- const eveauth = store.get("eveauth");
- const response = await eveauth.redirect(params["scopes"]);
- setCookie(response, "discordID", params["discordID"], 60 * 10);
- setCookie(response, "characterID", params["characterID"], 60 * 10);
- return response;
-}
-export {
- GET
-};
-
-//# debugId=AEE66F1C816CC1AD64756E2164756E21
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXHNyY1xcdXRpbHNcXGNvb2tpZXMudHMiLCAiLi5cXHNyY1xcYXBpXFxhdXRoXFxkaXNjb3JkSURcXFtkaXNjb3JkSURdXFxjaGFyYWN0ZXJJRFxcW2NoYXJhY3RlcklEXVxcc2NvcGVzXFxbc2NvcGVzXS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb29raWVzKGhlYWRlcnM6IEhlYWRlcnMpIHtcbiAgaWYgKCFoZWFkZXJzKSByZXR1cm4ge307XG4gIGNvbnN0IGNvb2tpZUhlYWRlciA9IGhlYWRlcnMuZ2V0KFwiQ29va2llXCIpO1xuICBjb25zdCBjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgaWYgKGNvb2tpZUhlYWRlciA9PT0gbnVsbCkgcmV0dXJuIHt9O1xuXG4gIGZvciAoY29uc3Qga3Ygb2YgY29va2llSGVhZGVyLnNwbGl0KFwiO1wiKSkge1xuICAgIGNvbnN0IFtjb29raWVLZXksIC4uLmNvb2tpZVZhbF0gPSBrdi5zcGxpdChcIj1cIik7XG4gICAgY29uc3Qga2V5ID0gY29va2llS2V5LnRyaW0oKTtcbiAgICBjb29raWVzW2tleV0gPSBjb29raWVWYWwuam9pbihcIj1cIik7XG4gIH1cblxuICByZXR1cm4gY29va2llcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENvb2tpZShyZXNwb25zZTogUmVzcG9uc2UsIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBtYXhBZ2U/OiBudW1iZXIpIHtcbiAgcmVzcG9uc2UuaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWUnLCBgJHtrZXl9PSR7dmFsdWV9JHttYXhBZ2UgPyAnOyBQYXRoPS87IE1heC1BZ2U9JyArIG1heEFnZSA6ICcnfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQ29va2llKHJlc3BvbnNlOiBSZXNwb25zZSwga2V5OiBzdHJpbmcpIHtcbiAgcmVzcG9uc2UuaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWUnLCBgJHtrZXl9PVwiXCI7IFBhdGg9LzsgTWF4LUFnZT0tMTtgKTtcbn0iLAogICAgImltcG9ydCB0eXBlIHsgRVZFQXV0aCB9IGZyb20gJ0AvbWlkZGxld2FyZSc7XG5pbXBvcnQgeyBzZXRDb29raWUgfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tICdicmlzYSc7XG5cbi8vIEdFVCAvYXBpL2F1dGgvZGlzY29yZElELzpkaXNjb3JkSUQvY2hhcmFjdGVySUQvOmNoYXJhY3RlcklEL3Njb3Blcy86c2NvcGVzXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gR0VUKHsgc3RvcmUsIHJvdXRlOiB7IHBhcmFtcyB9IH06IFJlcXVlc3RDb250ZXh0KSB7XG4gIC8vIHRoaXMgaXMgdXNlZCB0byBzZXQgdGhlIHNjb3BlcyB0aGF0IHdlcmUgc2VudCwgc28ganVzdCBwYXNzIHRoZW0gYWxvbmcgdG8gYXV0aCBkaXJlY3RseSBcbiAgLy8gd2l0aCB0aGUgcHJvdmlkZWQgc2NvcGVzXG4gIGNvbnN0IGV2ZWF1dGg6IEVWRUF1dGggPSBzdG9yZS5nZXQoJ2V2ZWF1dGgnKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBldmVhdXRoLnJlZGlyZWN0KHBhcmFtcyFbJ3Njb3BlcyddIGFzIHN0cmluZyk7XG4gIHNldENvb2tpZShyZXNwb25zZSwgJ2Rpc2NvcmRJRCcsIHBhcmFtcyFbJ2Rpc2NvcmRJRCddIGFzIHN0cmluZywgNjAgKiAxMCAvKiAxMCBtaW4gKi8pO1xuICBzZXRDb29raWUocmVzcG9uc2UsICdjaGFyYWN0ZXJJRCcsIHBhcmFtcyFbJ2NoYXJhY3RlcklEJ10gYXMgc3RyaW5nLCA2MCAqIDEwIC8qIDEwIG1pbiAqLyk7XG4gIHJldHVybiByZXNwb25zZTtcbn0iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDTyxTQUFTLFVBQVUsQ0FBQyxTQUFrQjtBQUFBLEVBQzNDLEtBQUs7QUFBQSxJQUFTLE9BQU8sQ0FBQztBQUFBLEVBQ3RCLE1BQU0sZUFBZSxRQUFRLElBQUksUUFBUTtBQUFBLEVBQ3pDLE1BQU0sVUFBa0MsQ0FBQztBQUFBLEVBRXpDLElBQUksaUJBQWlCO0FBQUEsSUFBTSxPQUFPLENBQUM7QUFBQSxFQUVuQyxXQUFXLE1BQU0sYUFBYSxNQUFNLEdBQUcsR0FBRztBQUFBLElBQ3hDLE9BQU8sY0FBYyxhQUFhLEdBQUcsTUFBTSxHQUFHO0FBQUEsSUFDOUMsTUFBTSxNQUFNLFVBQVUsS0FBSztBQUFBLElBQzNCLFFBQVEsT0FBTyxVQUFVLEtBQUssR0FBRztBQUFBLEVBQ25DO0FBQUEsRUFFQSxPQUFPO0FBQUE7QUFHRixTQUFTLFNBQVMsQ0FBQyxVQUFvQixLQUFhLE9BQWUsUUFBaUI7QUFBQSxFQUN6RixTQUFTLFFBQVEsT0FBTyxjQUFjLEdBQUcsT0FBTyxRQUFRLFNBQVMsdUJBQXVCLFNBQVMsSUFBSTtBQUFBO0FBR2hHLFNBQVMsWUFBWSxDQUFDLFVBQW9CLEtBQWE7QUFBQSxFQUM1RCxTQUFTLFFBQVEsT0FBTyxjQUFjLEdBQUcsNkJBQTZCO0FBQUE7O0FDakJ4RSxlQUFzQixHQUFHLEdBQUcsT0FBTyxTQUFTLFlBQTRCO0FBQUEsRUFHdEUsTUFBTSxVQUFtQixNQUFNLElBQUksU0FBUztBQUFBLEVBQzVDLE1BQU0sV0FBVyxNQUFNLFFBQVEsU0FBUyxPQUFRLFNBQW1CO0FBQUEsRUFDbkUsVUFBVSxVQUFVLGFBQWEsT0FBUSxjQUF3QixLQUFLLEVBQWU7QUFBQSxFQUNyRixVQUFVLFVBQVUsZUFBZSxPQUFRLGdCQUEwQixLQUFLLEVBQWU7QUFBQSxFQUN6RixPQUFPO0FBQUE7IiwKICAiZGVidWdJZCI6ICJBRUU2NkYxQzgxNkNDMUFENjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
diff --git a/packages/eve-web/build/api/auth/discordID/[discordID]/index.js b/packages/eve-web/build/api/auth/discordID/[discordID]/index.js
deleted file mode 100644
index d01cc57..0000000
--- a/packages/eve-web/build/api/auth/discordID/[discordID]/index.js
+++ /dev/null
@@ -1,54 +0,0 @@
-// @bun
-var __create = Object.create;
-var __getProtoOf = Object.getPrototypeOf;
-var __defProp = Object.defineProperty;
-var __getOwnPropNames = Object.getOwnPropertyNames;
-var __hasOwnProp = Object.prototype.hasOwnProperty;
-var __toESM = (mod, isNodeMode, target) => {
- target = mod != null ? __create(__getProtoOf(mod)) : {};
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
- for (let key of __getOwnPropNames(mod))
- if (!__hasOwnProp.call(to, key))
- __defProp(to, key, {
- get: () => mod[key],
- enumerable: true
- });
- return to;
-};
-var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
-var __require = import.meta.require;
-
-// src/utils/cookies.ts
-function getCookies(headers) {
- if (!headers)
- return {};
- const cookieHeader = headers.get("Cookie");
- const cookies = {};
- if (cookieHeader === null)
- return {};
- for (const kv of cookieHeader.split(";")) {
- const [cookieKey, ...cookieVal] = kv.split("=");
- const key = cookieKey.trim();
- cookies[key] = cookieVal.join("=");
- }
- return cookies;
-}
-function setCookie(response, key, value, maxAge) {
- response.headers.append("Set-Cookie", `${key}=${value}${maxAge ? "; Path=/; Max-Age=" + maxAge : ""}`);
-}
-function removeCookie(response, key) {
- response.headers.append("Set-Cookie", `${key}=""; Path=/; Max-Age=-1;`);
-}
-// src/api/auth/discordID/[discordID]/index.ts
-async function GET({ store, route: { params } }) {
- const eveauth = store.get("eveauth");
- const response = await eveauth.redirect("publicData");
- setCookie(response, "discordID", params["discordID"], 60 * 10);
- return response;
-}
-export {
- GET
-};
-
-//# debugId=7AF70B8658B4D3D064756E2164756E21
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXHNyY1xcdXRpbHNcXGNvb2tpZXMudHMiLCAiLi5cXHNyY1xcYXBpXFxhdXRoXFxkaXNjb3JkSURcXFtkaXNjb3JkSURdXFxpbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb29raWVzKGhlYWRlcnM6IEhlYWRlcnMpIHtcbiAgaWYgKCFoZWFkZXJzKSByZXR1cm4ge307XG4gIGNvbnN0IGNvb2tpZUhlYWRlciA9IGhlYWRlcnMuZ2V0KFwiQ29va2llXCIpO1xuICBjb25zdCBjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgaWYgKGNvb2tpZUhlYWRlciA9PT0gbnVsbCkgcmV0dXJuIHt9O1xuXG4gIGZvciAoY29uc3Qga3Ygb2YgY29va2llSGVhZGVyLnNwbGl0KFwiO1wiKSkge1xuICAgIGNvbnN0IFtjb29raWVLZXksIC4uLmNvb2tpZVZhbF0gPSBrdi5zcGxpdChcIj1cIik7XG4gICAgY29uc3Qga2V5ID0gY29va2llS2V5LnRyaW0oKTtcbiAgICBjb29raWVzW2tleV0gPSBjb29raWVWYWwuam9pbihcIj1cIik7XG4gIH1cblxuICByZXR1cm4gY29va2llcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENvb2tpZShyZXNwb25zZTogUmVzcG9uc2UsIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBtYXhBZ2U/OiBudW1iZXIpIHtcbiAgcmVzcG9uc2UuaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWUnLCBgJHtrZXl9PSR7dmFsdWV9JHttYXhBZ2UgPyAnOyBQYXRoPS87IE1heC1BZ2U9JyArIG1heEFnZSA6ICcnfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQ29va2llKHJlc3BvbnNlOiBSZXNwb25zZSwga2V5OiBzdHJpbmcpIHtcbiAgcmVzcG9uc2UuaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWUnLCBgJHtrZXl9PVwiXCI7IFBhdGg9LzsgTWF4LUFnZT0tMTtgKTtcbn0iLAogICAgImltcG9ydCB0eXBlIHsgRVZFQXV0aCB9IGZyb20gJ0AvbWlkZGxld2FyZSc7XG5pbXBvcnQgeyBzZXRDb29raWUgfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tICdicmlzYSc7XG5cbi8vIEdFVCAvYXBpL2F1dGgvZGlzY29yZElELzpkaXNjb3JkSURcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBHRVQoeyBzdG9yZSwgcm91dGU6IHsgcGFyYW1zIH19OiBSZXF1ZXN0Q29udGV4dCkge1xuICAvLyBjYWxsZWQgd2hlbiBhZGRpbmcgYSBuZXcgY2hhcmFjdGVyLCBzbyBqdXN0IHJlZGlyZWN0IHRvIGF1dGggYW5kIHNldCBjb29raWVzXG4gIGNvbnN0IGV2ZWF1dGg6IEVWRUF1dGggPSAgc3RvcmUuZ2V0KCdldmVhdXRoJyk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZXZlYXV0aC5yZWRpcmVjdCgncHVibGljRGF0YScpO1xuICBzZXRDb29raWUocmVzcG9uc2UsICdkaXNjb3JkSUQnLCBwYXJhbXMhWydkaXNjb3JkSUQnXSBhcyBzdHJpbmcsIDYwICogMTAgLyogMTAgbWluICovKTtcbiAgcmV0dXJuIHJlc3BvbnNlO1xufSIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNPLFNBQVMsVUFBVSxDQUFDLFNBQWtCO0FBQUEsRUFDM0MsS0FBSztBQUFBLElBQVMsT0FBTyxDQUFDO0FBQUEsRUFDdEIsTUFBTSxlQUFlLFFBQVEsSUFBSSxRQUFRO0FBQUEsRUFDekMsTUFBTSxVQUFrQyxDQUFDO0FBQUEsRUFFekMsSUFBSSxpQkFBaUI7QUFBQSxJQUFNLE9BQU8sQ0FBQztBQUFBLEVBRW5DLFdBQVcsTUFBTSxhQUFhLE1BQU0sR0FBRyxHQUFHO0FBQUEsSUFDeEMsT0FBTyxjQUFjLGFBQWEsR0FBRyxNQUFNLEdBQUc7QUFBQSxJQUM5QyxNQUFNLE1BQU0sVUFBVSxLQUFLO0FBQUEsSUFDM0IsUUFBUSxPQUFPLFVBQVUsS0FBSyxHQUFHO0FBQUEsRUFDbkM7QUFBQSxFQUVBLE9BQU87QUFBQTtBQUdGLFNBQVMsU0FBUyxDQUFDLFVBQW9CLEtBQWEsT0FBZSxRQUFpQjtBQUFBLEVBQ3pGLFNBQVMsUUFBUSxPQUFPLGNBQWMsR0FBRyxPQUFPLFFBQVEsU0FBUyx1QkFBdUIsU0FBUyxJQUFJO0FBQUE7QUFHaEcsU0FBUyxZQUFZLENBQUMsVUFBb0IsS0FBYTtBQUFBLEVBQzVELFNBQVMsUUFBUSxPQUFPLGNBQWMsR0FBRyw2QkFBNkI7QUFBQTs7QUNqQnhFLGVBQXNCLEdBQUcsR0FBRyxPQUFPLFNBQVMsWUFBMkI7QUFBQSxFQUVyRSxNQUFNLFVBQW9CLE1BQU0sSUFBSSxTQUFTO0FBQUEsRUFDN0MsTUFBTSxXQUFXLE1BQU0sUUFBUSxTQUFTLFlBQVk7QUFBQSxFQUNwRCxVQUFVLFVBQVUsYUFBYSxPQUFRLGNBQXdCLEtBQUssRUFBZTtBQUFBLEVBQ3JGLE9BQU87QUFBQTsiLAogICJkZWJ1Z0lkIjogIjdBRjcwQjg2NThCNEQzRDA2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
diff --git a/packages/eve-web/build/api/auth/discordID/[discordID]/removeScopes/characterID/[characterID]/scopes/[scopes].js b/packages/eve-web/build/api/auth/discordID/[discordID]/removeScopes/characterID/[characterID]/scopes/[scopes].js
deleted file mode 100644
index 2659c4f..0000000
--- a/packages/eve-web/build/api/auth/discordID/[discordID]/removeScopes/characterID/[characterID]/scopes/[scopes].js
+++ /dev/null
@@ -1,17861 +0,0 @@
-// @bun
-var __create = Object.create;
-var __getProtoOf = Object.getPrototypeOf;
-var __defProp = Object.defineProperty;
-var __getOwnPropNames = Object.getOwnPropertyNames;
-var __hasOwnProp = Object.prototype.hasOwnProperty;
-var __toESM = (mod, isNodeMode, target) => {
- target = mod != null ? __create(__getProtoOf(mod)) : {};
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
- for (let key of __getOwnPropNames(mod))
- if (!__hasOwnProp.call(to, key))
- __defProp(to, key, {
- get: () => mod[key],
- enumerable: true
- });
- return to;
-};
-var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
-var __require = import.meta.require;
-
-// ../eve/node_modules/safe-buffer/index.js
-var require_safe_buffer = __commonJS((exports, module) => {
- /*! safe-buffer. MIT License. Feross Aboukhadijeh */
- var buffer = __require("buffer");
- var Buffer2 = buffer.Buffer;
- function copyProps(src, dst) {
- for (var key in src) {
- dst[key] = src[key];
- }
- }
- if (Buffer2.from && Buffer2.alloc && Buffer2.allocUnsafe && Buffer2.allocUnsafeSlow) {
- module.exports = buffer;
- } else {
- copyProps(buffer, exports);
- exports.Buffer = SafeBuffer;
- }
- function SafeBuffer(arg, encodingOrOffset, length) {
- return Buffer2(arg, encodingOrOffset, length);
- }
- SafeBuffer.prototype = Object.create(Buffer2.prototype);
- copyProps(Buffer2, SafeBuffer);
- SafeBuffer.from = function(arg, encodingOrOffset, length) {
- if (typeof arg === "number") {
- throw new TypeError("Argument must not be a number");
- }
- return Buffer2(arg, encodingOrOffset, length);
- };
- SafeBuffer.alloc = function(size, fill, encoding) {
- if (typeof size !== "number") {
- throw new TypeError("Argument must be a number");
- }
- var buf = Buffer2(size);
- if (fill !== undefined) {
- if (typeof encoding === "string") {
- buf.fill(fill, encoding);
- } else {
- buf.fill(fill);
- }
- } else {
- buf.fill(0);
- }
- return buf;
- };
- SafeBuffer.allocUnsafe = function(size) {
- if (typeof size !== "number") {
- throw new TypeError("Argument must be a number");
- }
- return Buffer2(size);
- };
- SafeBuffer.allocUnsafeSlow = function(size) {
- if (typeof size !== "number") {
- throw new TypeError("Argument must be a number");
- }
- return buffer.SlowBuffer(size);
- };
-});
-
-// ../eve/node_modules/jws/lib/data-stream.js
-var require_data_stream = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var Stream = __require("stream");
- var util = __require("util");
- function DataStream(data) {
- this.buffer = null;
- this.writable = true;
- this.readable = true;
- if (!data) {
- this.buffer = Buffer2.alloc(0);
- return this;
- }
- if (typeof data.pipe === "function") {
- this.buffer = Buffer2.alloc(0);
- data.pipe(this);
- return this;
- }
- if (data.length || typeof data === "object") {
- this.buffer = data;
- this.writable = false;
- process.nextTick(function() {
- this.emit("end", data);
- this.readable = false;
- this.emit("close");
- }.bind(this));
- return this;
- }
- throw new TypeError("Unexpected data type (" + typeof data + ")");
- }
- util.inherits(DataStream, Stream);
- DataStream.prototype.write = function write(data) {
- this.buffer = Buffer2.concat([this.buffer, Buffer2.from(data)]);
- this.emit("data", data);
- };
- DataStream.prototype.end = function end(data) {
- if (data)
- this.write(data);
- this.emit("end", data);
- this.emit("close");
- this.writable = false;
- this.readable = false;
- };
- module.exports = DataStream;
-});
-
-// ../eve/node_modules/ecdsa-sig-formatter/src/param-bytes-for-alg.js
-var require_param_bytes_for_alg = __commonJS((exports, module) => {
- function getParamSize(keySize) {
- var result = (keySize / 8 | 0) + (keySize % 8 === 0 ? 0 : 1);
- return result;
- }
- var paramBytesForAlg = {
- ES256: getParamSize(256),
- ES384: getParamSize(384),
- ES512: getParamSize(521)
- };
- function getParamBytesForAlg(alg) {
- var paramBytes = paramBytesForAlg[alg];
- if (paramBytes) {
- return paramBytes;
- }
- throw new Error('Unknown algorithm "' + alg + '"');
- }
- module.exports = getParamBytesForAlg;
-});
-
-// ../eve/node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.js
-var require_ecdsa_sig_formatter = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var getParamBytesForAlg = require_param_bytes_for_alg();
- var MAX_OCTET = 128;
- var CLASS_UNIVERSAL = 0;
- var PRIMITIVE_BIT = 32;
- var TAG_SEQ = 16;
- var TAG_INT = 2;
- var ENCODED_TAG_SEQ = TAG_SEQ | PRIMITIVE_BIT | CLASS_UNIVERSAL << 6;
- var ENCODED_TAG_INT = TAG_INT | CLASS_UNIVERSAL << 6;
- function base64Url(base64) {
- return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
- }
- function signatureAsBuffer(signature) {
- if (Buffer2.isBuffer(signature)) {
- return signature;
- } else if (typeof signature === "string") {
- return Buffer2.from(signature, "base64");
- }
- throw new TypeError("ECDSA signature must be a Base64 string or a Buffer");
- }
- function derToJose(signature, alg) {
- signature = signatureAsBuffer(signature);
- var paramBytes = getParamBytesForAlg(alg);
- var maxEncodedParamLength = paramBytes + 1;
- var inputLength = signature.length;
- var offset = 0;
- if (signature[offset++] !== ENCODED_TAG_SEQ) {
- throw new Error('Could not find expected "seq"');
- }
- var seqLength = signature[offset++];
- if (seqLength === (MAX_OCTET | 1)) {
- seqLength = signature[offset++];
- }
- if (inputLength - offset < seqLength) {
- throw new Error('"seq" specified length of "' + seqLength + '", only "' + (inputLength - offset) + '" remaining');
- }
- if (signature[offset++] !== ENCODED_TAG_INT) {
- throw new Error('Could not find expected "int" for "r"');
- }
- var rLength = signature[offset++];
- if (inputLength - offset - 2 < rLength) {
- throw new Error('"r" specified length of "' + rLength + '", only "' + (inputLength - offset - 2) + '" available');
- }
- if (maxEncodedParamLength < rLength) {
- throw new Error('"r" specified length of "' + rLength + '", max of "' + maxEncodedParamLength + '" is acceptable');
- }
- var rOffset = offset;
- offset += rLength;
- if (signature[offset++] !== ENCODED_TAG_INT) {
- throw new Error('Could not find expected "int" for "s"');
- }
- var sLength = signature[offset++];
- if (inputLength - offset !== sLength) {
- throw new Error('"s" specified length of "' + sLength + '", expected "' + (inputLength - offset) + '"');
- }
- if (maxEncodedParamLength < sLength) {
- throw new Error('"s" specified length of "' + sLength + '", max of "' + maxEncodedParamLength + '" is acceptable');
- }
- var sOffset = offset;
- offset += sLength;
- if (offset !== inputLength) {
- throw new Error('Expected to consume entire buffer, but "' + (inputLength - offset) + '" bytes remain');
- }
- var rPadding = paramBytes - rLength, sPadding = paramBytes - sLength;
- var dst = Buffer2.allocUnsafe(rPadding + rLength + sPadding + sLength);
- for (offset = 0;offset < rPadding; ++offset) {
- dst[offset] = 0;
- }
- signature.copy(dst, offset, rOffset + Math.max(-rPadding, 0), rOffset + rLength);
- offset = paramBytes;
- for (var o = offset;offset < o + sPadding; ++offset) {
- dst[offset] = 0;
- }
- signature.copy(dst, offset, sOffset + Math.max(-sPadding, 0), sOffset + sLength);
- dst = dst.toString("base64");
- dst = base64Url(dst);
- return dst;
- }
- function countPadding(buf, start, stop) {
- var padding = 0;
- while (start + padding < stop && buf[start + padding] === 0) {
- ++padding;
- }
- var needsSign = buf[start + padding] >= MAX_OCTET;
- if (needsSign) {
- --padding;
- }
- return padding;
- }
- function joseToDer(signature, alg) {
- signature = signatureAsBuffer(signature);
- var paramBytes = getParamBytesForAlg(alg);
- var signatureBytes = signature.length;
- if (signatureBytes !== paramBytes * 2) {
- throw new TypeError('"' + alg + '" signatures must be "' + paramBytes * 2 + '" bytes, saw "' + signatureBytes + '"');
- }
- var rPadding = countPadding(signature, 0, paramBytes);
- var sPadding = countPadding(signature, paramBytes, signature.length);
- var rLength = paramBytes - rPadding;
- var sLength = paramBytes - sPadding;
- var rsBytes = 1 + 1 + rLength + 1 + 1 + sLength;
- var shortLength = rsBytes < MAX_OCTET;
- var dst = Buffer2.allocUnsafe((shortLength ? 2 : 3) + rsBytes);
- var offset = 0;
- dst[offset++] = ENCODED_TAG_SEQ;
- if (shortLength) {
- dst[offset++] = rsBytes;
- } else {
- dst[offset++] = MAX_OCTET | 1;
- dst[offset++] = rsBytes & 255;
- }
- dst[offset++] = ENCODED_TAG_INT;
- dst[offset++] = rLength;
- if (rPadding < 0) {
- dst[offset++] = 0;
- offset += signature.copy(dst, offset, 0, paramBytes);
- } else {
- offset += signature.copy(dst, offset, rPadding, paramBytes);
- }
- dst[offset++] = ENCODED_TAG_INT;
- dst[offset++] = sLength;
- if (sPadding < 0) {
- dst[offset++] = 0;
- signature.copy(dst, offset, paramBytes);
- } else {
- signature.copy(dst, offset, paramBytes + sPadding);
- }
- return dst;
- }
- module.exports = {
- derToJose,
- joseToDer
- };
-});
-
-// ../eve/node_modules/buffer-equal-constant-time/index.js
-var require_buffer_equal_constant_time = __commonJS((exports, module) => {
- var Buffer2 = __require("buffer").Buffer;
- var SlowBuffer = __require("buffer").SlowBuffer;
- module.exports = bufferEq;
- function bufferEq(a, b) {
- if (!Buffer2.isBuffer(a) || !Buffer2.isBuffer(b)) {
- return false;
- }
- if (a.length !== b.length) {
- return false;
- }
- var c = 0;
- for (var i = 0;i < a.length; i++) {
- c |= a[i] ^ b[i];
- }
- return c === 0;
- }
- bufferEq.install = function() {
- Buffer2.prototype.equal = SlowBuffer.prototype.equal = function equal(that) {
- return bufferEq(this, that);
- };
- };
- var origBufEqual = Buffer2.prototype.equal;
- var origSlowBufEqual = SlowBuffer.prototype.equal;
- bufferEq.restore = function() {
- Buffer2.prototype.equal = origBufEqual;
- SlowBuffer.prototype.equal = origSlowBufEqual;
- };
-});
-
-// ../eve/node_modules/jwa/index.js
-var require_jwa = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var crypto2 = __require("crypto");
- var formatEcdsa = require_ecdsa_sig_formatter();
- var util = __require("util");
- var MSG_INVALID_ALGORITHM = `"%s" is not a valid algorithm.
- Supported algorithms are:
- "HS256", "HS384", "HS512", "RS256", "RS384", "RS512", "PS256", "PS384", "PS512", "ES256", "ES384", "ES512" and "none".`;
- var MSG_INVALID_SECRET = "secret must be a string or buffer";
- var MSG_INVALID_VERIFIER_KEY = "key must be a string or a buffer";
- var MSG_INVALID_SIGNER_KEY = "key must be a string, a buffer or an object";
- var supportsKeyObjects = typeof crypto2.createPublicKey === "function";
- if (supportsKeyObjects) {
- MSG_INVALID_VERIFIER_KEY += " or a KeyObject";
- MSG_INVALID_SECRET += "or a KeyObject";
- }
- function checkIsPublicKey(key) {
- if (Buffer2.isBuffer(key)) {
- return;
- }
- if (typeof key === "string") {
- return;
- }
- if (!supportsKeyObjects) {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key !== "object") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key.type !== "string") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key.asymmetricKeyType !== "string") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- if (typeof key.export !== "function") {
- throw typeError(MSG_INVALID_VERIFIER_KEY);
- }
- }
- function checkIsPrivateKey(key) {
- if (Buffer2.isBuffer(key)) {
- return;
- }
- if (typeof key === "string") {
- return;
- }
- if (typeof key === "object") {
- return;
- }
- throw typeError(MSG_INVALID_SIGNER_KEY);
- }
- function checkIsSecretKey(key) {
- if (Buffer2.isBuffer(key)) {
- return;
- }
- if (typeof key === "string") {
- return key;
- }
- if (!supportsKeyObjects) {
- throw typeError(MSG_INVALID_SECRET);
- }
- if (typeof key !== "object") {
- throw typeError(MSG_INVALID_SECRET);
- }
- if (key.type !== "secret") {
- throw typeError(MSG_INVALID_SECRET);
- }
- if (typeof key.export !== "function") {
- throw typeError(MSG_INVALID_SECRET);
- }
- }
- function fromBase64(base64) {
- return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
- }
- function toBase64(base64url) {
- base64url = base64url.toString();
- var padding = 4 - base64url.length % 4;
- if (padding !== 4) {
- for (var i = 0;i < padding; ++i) {
- base64url += "=";
- }
- }
- return base64url.replace(/\-/g, "+").replace(/_/g, "/");
- }
- function typeError(template) {
- var args = [].slice.call(arguments, 1);
- var errMsg = util.format.bind(util, template).apply(null, args);
- return new TypeError(errMsg);
- }
- function bufferOrString(obj) {
- return Buffer2.isBuffer(obj) || typeof obj === "string";
- }
- function normalizeInput(thing) {
- if (!bufferOrString(thing))
- thing = JSON.stringify(thing);
- return thing;
- }
- function createHmacSigner(bits) {
- return function sign(thing, secret) {
- checkIsSecretKey(secret);
- thing = normalizeInput(thing);
- var hmac = crypto2.createHmac("sha" + bits, secret);
- var sig = (hmac.update(thing), hmac.digest("base64"));
- return fromBase64(sig);
- };
- }
- var bufferEqual;
- var timingSafeEqual = "timingSafeEqual" in crypto2 ? function timingSafeEqual(a, b) {
- if (a.byteLength !== b.byteLength) {
- return false;
- }
- return crypto2.timingSafeEqual(a, b);
- } : function timingSafeEqual(a, b) {
- if (!bufferEqual) {
- bufferEqual = require_buffer_equal_constant_time();
- }
- return bufferEqual(a, b);
- };
- function createHmacVerifier(bits) {
- return function verify(thing, signature, secret) {
- var computedSig = createHmacSigner(bits)(thing, secret);
- return timingSafeEqual(Buffer2.from(signature), Buffer2.from(computedSig));
- };
- }
- function createKeySigner(bits) {
- return function sign(thing, privateKey) {
- checkIsPrivateKey(privateKey);
- thing = normalizeInput(thing);
- var signer = crypto2.createSign("RSA-SHA" + bits);
- var sig = (signer.update(thing), signer.sign(privateKey, "base64"));
- return fromBase64(sig);
- };
- }
- function createKeyVerifier(bits) {
- return function verify(thing, signature, publicKey) {
- checkIsPublicKey(publicKey);
- thing = normalizeInput(thing);
- signature = toBase64(signature);
- var verifier = crypto2.createVerify("RSA-SHA" + bits);
- verifier.update(thing);
- return verifier.verify(publicKey, signature, "base64");
- };
- }
- function createPSSKeySigner(bits) {
- return function sign(thing, privateKey) {
- checkIsPrivateKey(privateKey);
- thing = normalizeInput(thing);
- var signer = crypto2.createSign("RSA-SHA" + bits);
- var sig = (signer.update(thing), signer.sign({
- key: privateKey,
- padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
- saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
- }, "base64"));
- return fromBase64(sig);
- };
- }
- function createPSSKeyVerifier(bits) {
- return function verify(thing, signature, publicKey) {
- checkIsPublicKey(publicKey);
- thing = normalizeInput(thing);
- signature = toBase64(signature);
- var verifier = crypto2.createVerify("RSA-SHA" + bits);
- verifier.update(thing);
- return verifier.verify({
- key: publicKey,
- padding: crypto2.constants.RSA_PKCS1_PSS_PADDING,
- saltLength: crypto2.constants.RSA_PSS_SALTLEN_DIGEST
- }, signature, "base64");
- };
- }
- function createECDSASigner(bits) {
- var inner = createKeySigner(bits);
- return function sign() {
- var signature = inner.apply(null, arguments);
- signature = formatEcdsa.derToJose(signature, "ES" + bits);
- return signature;
- };
- }
- function createECDSAVerifer(bits) {
- var inner = createKeyVerifier(bits);
- return function verify(thing, signature, publicKey) {
- signature = formatEcdsa.joseToDer(signature, "ES" + bits).toString("base64");
- var result = inner(thing, signature, publicKey);
- return result;
- };
- }
- function createNoneSigner() {
- return function sign() {
- return "";
- };
- }
- function createNoneVerifier() {
- return function verify(thing, signature) {
- return signature === "";
- };
- }
- module.exports = function jwa(algorithm) {
- var signerFactories = {
- hs: createHmacSigner,
- rs: createKeySigner,
- ps: createPSSKeySigner,
- es: createECDSASigner,
- none: createNoneSigner
- };
- var verifierFactories = {
- hs: createHmacVerifier,
- rs: createKeyVerifier,
- ps: createPSSKeyVerifier,
- es: createECDSAVerifer,
- none: createNoneVerifier
- };
- var match = algorithm.match(/^(RS|PS|ES|HS)(256|384|512)$|^(none)$/i);
- if (!match)
- throw typeError(MSG_INVALID_ALGORITHM, algorithm);
- var algo = (match[1] || match[3]).toLowerCase();
- var bits = match[2];
- return {
- sign: signerFactories[algo](bits),
- verify: verifierFactories[algo](bits)
- };
- };
-});
-
-// ../eve/node_modules/jws/lib/tostring.js
-var require_tostring = __commonJS((exports, module) => {
- var Buffer2 = __require("buffer").Buffer;
- module.exports = function toString(obj) {
- if (typeof obj === "string")
- return obj;
- if (typeof obj === "number" || Buffer2.isBuffer(obj))
- return obj.toString();
- return JSON.stringify(obj);
- };
-});
-
-// ../eve/node_modules/jws/lib/sign-stream.js
-var require_sign_stream = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var DataStream = require_data_stream();
- var jwa = require_jwa();
- var Stream = __require("stream");
- var toString = require_tostring();
- var util = __require("util");
- function base64url(string, encoding) {
- return Buffer2.from(string, encoding).toString("base64").replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
- }
- function jwsSecuredInput(header, payload, encoding) {
- encoding = encoding || "utf8";
- var encodedHeader = base64url(toString(header), "binary");
- var encodedPayload = base64url(toString(payload), encoding);
- return util.format("%s.%s", encodedHeader, encodedPayload);
- }
- function jwsSign(opts) {
- var header = opts.header;
- var payload = opts.payload;
- var secretOrKey = opts.secret || opts.privateKey;
- var encoding = opts.encoding;
- var algo = jwa(header.alg);
- var securedInput = jwsSecuredInput(header, payload, encoding);
- var signature = algo.sign(securedInput, secretOrKey);
- return util.format("%s.%s", securedInput, signature);
- }
- function SignStream(opts) {
- var secret = opts.secret || opts.privateKey || opts.key;
- var secretStream = new DataStream(secret);
- this.readable = true;
- this.header = opts.header;
- this.encoding = opts.encoding;
- this.secret = this.privateKey = this.key = secretStream;
- this.payload = new DataStream(opts.payload);
- this.secret.once("close", function() {
- if (!this.payload.writable && this.readable)
- this.sign();
- }.bind(this));
- this.payload.once("close", function() {
- if (!this.secret.writable && this.readable)
- this.sign();
- }.bind(this));
- }
- util.inherits(SignStream, Stream);
- SignStream.prototype.sign = function sign() {
- try {
- var signature = jwsSign({
- header: this.header,
- payload: this.payload.buffer,
- secret: this.secret.buffer,
- encoding: this.encoding
- });
- this.emit("done", signature);
- this.emit("data", signature);
- this.emit("end");
- this.readable = false;
- return signature;
- } catch (e) {
- this.readable = false;
- this.emit("error", e);
- this.emit("close");
- }
- };
- SignStream.sign = jwsSign;
- module.exports = SignStream;
-});
-
-// ../eve/node_modules/jws/lib/verify-stream.js
-var require_verify_stream = __commonJS((exports, module) => {
- var Buffer2 = require_safe_buffer().Buffer;
- var DataStream = require_data_stream();
- var jwa = require_jwa();
- var Stream = __require("stream");
- var toString = require_tostring();
- var util = __require("util");
- var JWS_REGEX = /^[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?\.([a-zA-Z0-9\-_]+)?$/;
- function isObject(thing) {
- return Object.prototype.toString.call(thing) === "[object Object]";
- }
- function safeJsonParse(thing) {
- if (isObject(thing))
- return thing;
- try {
- return JSON.parse(thing);
- } catch (e) {
- return;
- }
- }
- function headerFromJWS(jwsSig) {
- var encodedHeader = jwsSig.split(".", 1)[0];
- return safeJsonParse(Buffer2.from(encodedHeader, "base64").toString("binary"));
- }
- function securedInputFromJWS(jwsSig) {
- return jwsSig.split(".", 2).join(".");
- }
- function signatureFromJWS(jwsSig) {
- return jwsSig.split(".")[2];
- }
- function payloadFromJWS(jwsSig, encoding) {
- encoding = encoding || "utf8";
- var payload = jwsSig.split(".")[1];
- return Buffer2.from(payload, "base64").toString(encoding);
- }
- function isValidJws(string) {
- return JWS_REGEX.test(string) && !!headerFromJWS(string);
- }
- function jwsVerify(jwsSig, algorithm, secretOrKey) {
- if (!algorithm) {
- var err = new Error("Missing algorithm parameter for jws.verify");
- err.code = "MISSING_ALGORITHM";
- throw err;
- }
- jwsSig = toString(jwsSig);
- var signature = signatureFromJWS(jwsSig);
- var securedInput = securedInputFromJWS(jwsSig);
- var algo = jwa(algorithm);
- return algo.verify(securedInput, signature, secretOrKey);
- }
- function jwsDecode(jwsSig, opts) {
- opts = opts || {};
- jwsSig = toString(jwsSig);
- if (!isValidJws(jwsSig))
- return null;
- var header = headerFromJWS(jwsSig);
- if (!header)
- return null;
- var payload = payloadFromJWS(jwsSig);
- if (header.typ === "JWT" || opts.json)
- payload = JSON.parse(payload, opts.encoding);
- return {
- header,
- payload,
- signature: signatureFromJWS(jwsSig)
- };
- }
- function VerifyStream(opts) {
- opts = opts || {};
- var secretOrKey = opts.secret || opts.publicKey || opts.key;
- var secretStream = new DataStream(secretOrKey);
- this.readable = true;
- this.algorithm = opts.algorithm;
- this.encoding = opts.encoding;
- this.secret = this.publicKey = this.key = secretStream;
- this.signature = new DataStream(opts.signature);
- this.secret.once("close", function() {
- if (!this.signature.writable && this.readable)
- this.verify();
- }.bind(this));
- this.signature.once("close", function() {
- if (!this.secret.writable && this.readable)
- this.verify();
- }.bind(this));
- }
- util.inherits(VerifyStream, Stream);
- VerifyStream.prototype.verify = function verify() {
- try {
- var valid = jwsVerify(this.signature.buffer, this.algorithm, this.key.buffer);
- var obj = jwsDecode(this.signature.buffer, this.encoding);
- this.emit("done", valid, obj);
- this.emit("data", valid);
- this.emit("end");
- this.readable = false;
- return valid;
- } catch (e) {
- this.readable = false;
- this.emit("error", e);
- this.emit("close");
- }
- };
- VerifyStream.decode = jwsDecode;
- VerifyStream.isValid = isValidJws;
- VerifyStream.verify = jwsVerify;
- module.exports = VerifyStream;
-});
-
-// ../eve/node_modules/jws/index.js
-var require_jws = __commonJS((exports) => {
- var SignStream = require_sign_stream();
- var VerifyStream = require_verify_stream();
- var ALGORITHMS = [
- "HS256",
- "HS384",
- "HS512",
- "RS256",
- "RS384",
- "RS512",
- "PS256",
- "PS384",
- "PS512",
- "ES256",
- "ES384",
- "ES512"
- ];
- exports.ALGORITHMS = ALGORITHMS;
- exports.sign = SignStream.sign;
- exports.verify = VerifyStream.verify;
- exports.decode = VerifyStream.decode;
- exports.isValid = VerifyStream.isValid;
- exports.createSign = function createSign(opts) {
- return new SignStream(opts);
- };
- exports.createVerify = function createVerify(opts) {
- return new VerifyStream(opts);
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/decode.js
-var require_decode = __commonJS((exports, module) => {
- var jws = require_jws();
- module.exports = function(jwt, options2) {
- options2 = options2 || {};
- var decoded = jws.decode(jwt, options2);
- if (!decoded) {
- return null;
- }
- var payload = decoded.payload;
- if (typeof payload === "string") {
- try {
- var obj = JSON.parse(payload);
- if (obj !== null && typeof obj === "object") {
- payload = obj;
- }
- } catch (e) {}
- }
- if (options2.complete === true) {
- return {
- header: decoded.header,
- payload,
- signature: decoded.signature
- };
- }
- return payload;
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/JsonWebTokenError.js
-var require_JsonWebTokenError = __commonJS((exports, module) => {
- var JsonWebTokenError = function(message, error) {
- Error.call(this, message);
- if (Error.captureStackTrace) {
- Error.captureStackTrace(this, this.constructor);
- }
- this.name = "JsonWebTokenError";
- this.message = message;
- if (error)
- this.inner = error;
- };
- JsonWebTokenError.prototype = Object.create(Error.prototype);
- JsonWebTokenError.prototype.constructor = JsonWebTokenError;
- module.exports = JsonWebTokenError;
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/NotBeforeError.js
-var require_NotBeforeError = __commonJS((exports, module) => {
- var JsonWebTokenError = require_JsonWebTokenError();
- var NotBeforeError = function(message, date) {
- JsonWebTokenError.call(this, message);
- this.name = "NotBeforeError";
- this.date = date;
- };
- NotBeforeError.prototype = Object.create(JsonWebTokenError.prototype);
- NotBeforeError.prototype.constructor = NotBeforeError;
- module.exports = NotBeforeError;
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/TokenExpiredError.js
-var require_TokenExpiredError = __commonJS((exports, module) => {
- var JsonWebTokenError = require_JsonWebTokenError();
- var TokenExpiredError = function(message, expiredAt) {
- JsonWebTokenError.call(this, message);
- this.name = "TokenExpiredError";
- this.expiredAt = expiredAt;
- };
- TokenExpiredError.prototype = Object.create(JsonWebTokenError.prototype);
- TokenExpiredError.prototype.constructor = TokenExpiredError;
- module.exports = TokenExpiredError;
-});
-
-// ../eve/node_modules/ms/index.js
-var require_ms = __commonJS((exports, module) => {
- var s = 1000;
- var m = s * 60;
- var h = m * 60;
- var d = h * 24;
- var w = d * 7;
- var y = d * 365.25;
- module.exports = function(val, options2) {
- options2 = options2 || {};
- var type = typeof val;
- if (type === "string" && val.length > 0) {
- return parse(val);
- } else if (type === "number" && isFinite(val)) {
- return options2.long ? fmtLong(val) : fmtShort(val);
- }
- throw new Error("val is not a non-empty string or a valid number. val=" + JSON.stringify(val));
- };
- function parse(str) {
- str = String(str);
- if (str.length > 100) {
- return;
- }
- var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);
- if (!match) {
- return;
- }
- var n = parseFloat(match[1]);
- var type = (match[2] || "ms").toLowerCase();
- switch (type) {
- case "years":
- case "year":
- case "yrs":
- case "yr":
- case "y":
- return n * y;
- case "weeks":
- case "week":
- case "w":
- return n * w;
- case "days":
- case "day":
- case "d":
- return n * d;
- case "hours":
- case "hour":
- case "hrs":
- case "hr":
- case "h":
- return n * h;
- case "minutes":
- case "minute":
- case "mins":
- case "min":
- case "m":
- return n * m;
- case "seconds":
- case "second":
- case "secs":
- case "sec":
- case "s":
- return n * s;
- case "milliseconds":
- case "millisecond":
- case "msecs":
- case "msec":
- case "ms":
- return n;
- default:
- return;
- }
- }
- function fmtShort(ms) {
- var msAbs = Math.abs(ms);
- if (msAbs >= d) {
- return Math.round(ms / d) + "d";
- }
- if (msAbs >= h) {
- return Math.round(ms / h) + "h";
- }
- if (msAbs >= m) {
- return Math.round(ms / m) + "m";
- }
- if (msAbs >= s) {
- return Math.round(ms / s) + "s";
- }
- return ms + "ms";
- }
- function fmtLong(ms) {
- var msAbs = Math.abs(ms);
- if (msAbs >= d) {
- return plural(ms, msAbs, d, "day");
- }
- if (msAbs >= h) {
- return plural(ms, msAbs, h, "hour");
- }
- if (msAbs >= m) {
- return plural(ms, msAbs, m, "minute");
- }
- if (msAbs >= s) {
- return plural(ms, msAbs, s, "second");
- }
- return ms + " ms";
- }
- function plural(ms, msAbs, n, name) {
- var isPlural = msAbs >= n * 1.5;
- return Math.round(ms / n) + " " + name + (isPlural ? "s" : "");
- }
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/timespan.js
-var require_timespan = __commonJS((exports, module) => {
- var ms = require_ms();
- module.exports = function(time, iat) {
- var timestamp = iat || Math.floor(Date.now() / 1000);
- if (typeof time === "string") {
- var milliseconds = ms(time);
- if (typeof milliseconds === "undefined") {
- return;
- }
- return Math.floor(timestamp + milliseconds / 1000);
- } else if (typeof time === "number") {
- return timestamp + time;
- } else {
- return;
- }
- };
-});
-
-// ../eve/node_modules/semver/internal/constants.js
-var require_constants = __commonJS((exports, module) => {
- var SEMVER_SPEC_VERSION = "2.0.0";
- var MAX_LENGTH = 256;
- var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
- var MAX_SAFE_COMPONENT_LENGTH = 16;
- var MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6;
- var RELEASE_TYPES = [
- "major",
- "premajor",
- "minor",
- "preminor",
- "patch",
- "prepatch",
- "prerelease"
- ];
- module.exports = {
- MAX_LENGTH,
- MAX_SAFE_COMPONENT_LENGTH,
- MAX_SAFE_BUILD_LENGTH,
- MAX_SAFE_INTEGER,
- RELEASE_TYPES,
- SEMVER_SPEC_VERSION,
- FLAG_INCLUDE_PRERELEASE: 1,
- FLAG_LOOSE: 2
- };
-});
-
-// ../eve/node_modules/semver/internal/debug.js
-var require_debug = __commonJS((exports, module) => {
- var debug = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => {};
- module.exports = debug;
-});
-
-// ../eve/node_modules/semver/internal/re.js
-var require_re = __commonJS((exports, module) => {
- var {
- MAX_SAFE_COMPONENT_LENGTH,
- MAX_SAFE_BUILD_LENGTH,
- MAX_LENGTH
- } = require_constants();
- var debug = require_debug();
- exports = module.exports = {};
- var re = exports.re = [];
- var safeRe = exports.safeRe = [];
- var src = exports.src = [];
- var safeSrc = exports.safeSrc = [];
- var t = exports.t = {};
- var R = 0;
- var LETTERDASHNUMBER = "[a-zA-Z0-9-]";
- var safeRegexReplacements = [
- ["\\s", 1],
- ["\\d", MAX_LENGTH],
- [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH]
- ];
- var makeSafeRegex = (value) => {
- for (const [token, max] of safeRegexReplacements) {
- value = value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);
- }
- return value;
- };
- var createToken = (name, value, isGlobal) => {
- const safe = makeSafeRegex(value);
- const index2 = R++;
- debug(name, index2, value);
- t[name] = index2;
- src[index2] = value;
- safeSrc[index2] = safe;
- re[index2] = new RegExp(value, isGlobal ? "g" : undefined);
- safeRe[index2] = new RegExp(safe, isGlobal ? "g" : undefined);
- };
- createToken("NUMERICIDENTIFIER", "0|[1-9]\\d*");
- createToken("NUMERICIDENTIFIERLOOSE", "\\d+");
- createToken("NONNUMERICIDENTIFIER", `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);
- createToken("MAINVERSION", `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})\\.` + `(${src[t.NUMERICIDENTIFIER]})`);
- createToken("MAINVERSIONLOOSE", `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + `(${src[t.NUMERICIDENTIFIERLOOSE]})`);
- createToken("PRERELEASEIDENTIFIER", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIER]})`);
- createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIERLOOSE]})`);
- createToken("PRERELEASE", `(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);
- createToken("PRERELEASELOOSE", `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);
- createToken("BUILDIDENTIFIER", `${LETTERDASHNUMBER}+`);
- createToken("BUILD", `(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);
- createToken("FULLPLAIN", `v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);
- createToken("FULL", `^${src[t.FULLPLAIN]}$`);
- createToken("LOOSEPLAIN", `[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);
- createToken("LOOSE", `^${src[t.LOOSEPLAIN]}$`);
- createToken("GTLT", "((?:<|>)?=?)");
- createToken("XRANGEIDENTIFIERLOOSE", `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);
- createToken("XRANGEIDENTIFIER", `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);
- createToken("XRANGEPLAIN", `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + `(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?` + `)?)?`);
- createToken("XRANGEPLAINLOOSE", `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + `(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?` + `)?)?`);
- createToken("XRANGE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);
- createToken("XRANGELOOSE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);
- createToken("COERCEPLAIN", `${"(^|[^\\d])" + "(\\d{1,"}${MAX_SAFE_COMPONENT_LENGTH}})` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);
- createToken("COERCE", `${src[t.COERCEPLAIN]}(?:$|[^\\d])`);
- createToken("COERCEFULL", src[t.COERCEPLAIN] + `(?:${src[t.PRERELEASE]})?` + `(?:${src[t.BUILD]})?` + `(?:$|[^\\d])`);
- createToken("COERCERTL", src[t.COERCE], true);
- createToken("COERCERTLFULL", src[t.COERCEFULL], true);
- createToken("LONETILDE", "(?:~>?)");
- createToken("TILDETRIM", `(\\s*)${src[t.LONETILDE]}\\s+`, true);
- exports.tildeTrimReplace = "$1~";
- createToken("TILDE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);
- createToken("TILDELOOSE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);
- createToken("LONECARET", "(?:\\^)");
- createToken("CARETTRIM", `(\\s*)${src[t.LONECARET]}\\s+`, true);
- exports.caretTrimReplace = "$1^";
- createToken("CARET", `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);
- createToken("CARETLOOSE", `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);
- createToken("COMPARATORLOOSE", `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);
- createToken("COMPARATOR", `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);
- createToken("COMPARATORTRIM", `(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true);
- exports.comparatorTrimReplace = "$1$2$3";
- createToken("HYPHENRANGE", `^\\s*(${src[t.XRANGEPLAIN]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAIN]})` + `\\s*$`);
- createToken("HYPHENRANGELOOSE", `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + `\\s+-\\s+` + `(${src[t.XRANGEPLAINLOOSE]})` + `\\s*$`);
- createToken("STAR", "(<|>)?=?\\s*\\*");
- createToken("GTE0", "^\\s*>=\\s*0\\.0\\.0\\s*$");
- createToken("GTE0PRE", "^\\s*>=\\s*0\\.0\\.0-0\\s*$");
-});
-
-// ../eve/node_modules/semver/internal/parse-options.js
-var require_parse_options = __commonJS((exports, module) => {
- var looseOption = Object.freeze({ loose: true });
- var emptyOpts = Object.freeze({});
- var parseOptions = (options2) => {
- if (!options2) {
- return emptyOpts;
- }
- if (typeof options2 !== "object") {
- return looseOption;
- }
- return options2;
- };
- module.exports = parseOptions;
-});
-
-// ../eve/node_modules/semver/internal/identifiers.js
-var require_identifiers = __commonJS((exports, module) => {
- var numeric2 = /^[0-9]+$/;
- var compareIdentifiers = (a, b) => {
- const anum = numeric2.test(a);
- const bnum = numeric2.test(b);
- if (anum && bnum) {
- a = +a;
- b = +b;
- }
- return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;
- };
- var rcompareIdentifiers = (a, b) => compareIdentifiers(b, a);
- module.exports = {
- compareIdentifiers,
- rcompareIdentifiers
- };
-});
-
-// ../eve/node_modules/semver/classes/semver.js
-var require_semver = __commonJS((exports, module) => {
- var debug = require_debug();
- var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants();
- var { safeRe: re, t } = require_re();
- var parseOptions = require_parse_options();
- var { compareIdentifiers } = require_identifiers();
-
- class SemVer {
- constructor(version2, options2) {
- options2 = parseOptions(options2);
- if (version2 instanceof SemVer) {
- if (version2.loose === !!options2.loose && version2.includePrerelease === !!options2.includePrerelease) {
- return version2;
- } else {
- version2 = version2.version;
- }
- } else if (typeof version2 !== "string") {
- throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version2}".`);
- }
- if (version2.length > MAX_LENGTH) {
- throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);
- }
- debug("SemVer", version2, options2);
- this.options = options2;
- this.loose = !!options2.loose;
- this.includePrerelease = !!options2.includePrerelease;
- const m = version2.trim().match(options2.loose ? re[t.LOOSE] : re[t.FULL]);
- if (!m) {
- throw new TypeError(`Invalid Version: ${version2}`);
- }
- this.raw = version2;
- this.major = +m[1];
- this.minor = +m[2];
- this.patch = +m[3];
- if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
- throw new TypeError("Invalid major version");
- }
- if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
- throw new TypeError("Invalid minor version");
- }
- if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
- throw new TypeError("Invalid patch version");
- }
- if (!m[4]) {
- this.prerelease = [];
- } else {
- this.prerelease = m[4].split(".").map((id) => {
- if (/^[0-9]+$/.test(id)) {
- const num = +id;
- if (num >= 0 && num < MAX_SAFE_INTEGER) {
- return num;
- }
- }
- return id;
- });
- }
- this.build = m[5] ? m[5].split(".") : [];
- this.format();
- }
- format() {
- this.version = `${this.major}.${this.minor}.${this.patch}`;
- if (this.prerelease.length) {
- this.version += `-${this.prerelease.join(".")}`;
- }
- return this.version;
- }
- toString() {
- return this.version;
- }
- compare(other) {
- debug("SemVer.compare", this.version, this.options, other);
- if (!(other instanceof SemVer)) {
- if (typeof other === "string" && other === this.version) {
- return 0;
- }
- other = new SemVer(other, this.options);
- }
- if (other.version === this.version) {
- return 0;
- }
- return this.compareMain(other) || this.comparePre(other);
- }
- compareMain(other) {
- if (!(other instanceof SemVer)) {
- other = new SemVer(other, this.options);
- }
- return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch);
- }
- comparePre(other) {
- if (!(other instanceof SemVer)) {
- other = new SemVer(other, this.options);
- }
- if (this.prerelease.length && !other.prerelease.length) {
- return -1;
- } else if (!this.prerelease.length && other.prerelease.length) {
- return 1;
- } else if (!this.prerelease.length && !other.prerelease.length) {
- return 0;
- }
- let i = 0;
- do {
- const a = this.prerelease[i];
- const b = other.prerelease[i];
- debug("prerelease compare", i, a, b);
- if (a === undefined && b === undefined) {
- return 0;
- } else if (b === undefined) {
- return 1;
- } else if (a === undefined) {
- return -1;
- } else if (a === b) {
- continue;
- } else {
- return compareIdentifiers(a, b);
- }
- } while (++i);
- }
- compareBuild(other) {
- if (!(other instanceof SemVer)) {
- other = new SemVer(other, this.options);
- }
- let i = 0;
- do {
- const a = this.build[i];
- const b = other.build[i];
- debug("build compare", i, a, b);
- if (a === undefined && b === undefined) {
- return 0;
- } else if (b === undefined) {
- return 1;
- } else if (a === undefined) {
- return -1;
- } else if (a === b) {
- continue;
- } else {
- return compareIdentifiers(a, b);
- }
- } while (++i);
- }
- inc(release, identifier, identifierBase) {
- if (release.startsWith("pre")) {
- if (!identifier && identifierBase === false) {
- throw new Error("invalid increment argument: identifier is empty");
- }
- if (identifier) {
- const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]);
- if (!match || match[1] !== identifier) {
- throw new Error(`invalid identifier: ${identifier}`);
- }
- }
- }
- switch (release) {
- case "premajor":
- this.prerelease.length = 0;
- this.patch = 0;
- this.minor = 0;
- this.major++;
- this.inc("pre", identifier, identifierBase);
- break;
- case "preminor":
- this.prerelease.length = 0;
- this.patch = 0;
- this.minor++;
- this.inc("pre", identifier, identifierBase);
- break;
- case "prepatch":
- this.prerelease.length = 0;
- this.inc("patch", identifier, identifierBase);
- this.inc("pre", identifier, identifierBase);
- break;
- case "prerelease":
- if (this.prerelease.length === 0) {
- this.inc("patch", identifier, identifierBase);
- }
- this.inc("pre", identifier, identifierBase);
- break;
- case "release":
- if (this.prerelease.length === 0) {
- throw new Error(`version ${this.raw} is not a prerelease`);
- }
- this.prerelease.length = 0;
- break;
- case "major":
- if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) {
- this.major++;
- }
- this.minor = 0;
- this.patch = 0;
- this.prerelease = [];
- break;
- case "minor":
- if (this.patch !== 0 || this.prerelease.length === 0) {
- this.minor++;
- }
- this.patch = 0;
- this.prerelease = [];
- break;
- case "patch":
- if (this.prerelease.length === 0) {
- this.patch++;
- }
- this.prerelease = [];
- break;
- case "pre": {
- const base = Number(identifierBase) ? 1 : 0;
- if (this.prerelease.length === 0) {
- this.prerelease = [base];
- } else {
- let i = this.prerelease.length;
- while (--i >= 0) {
- if (typeof this.prerelease[i] === "number") {
- this.prerelease[i]++;
- i = -2;
- }
- }
- if (i === -1) {
- if (identifier === this.prerelease.join(".") && identifierBase === false) {
- throw new Error("invalid increment argument: identifier already exists");
- }
- this.prerelease.push(base);
- }
- }
- if (identifier) {
- let prerelease = [identifier, base];
- if (identifierBase === false) {
- prerelease = [identifier];
- }
- if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
- if (isNaN(this.prerelease[1])) {
- this.prerelease = prerelease;
- }
- } else {
- this.prerelease = prerelease;
- }
- }
- break;
- }
- default:
- throw new Error(`invalid increment argument: ${release}`);
- }
- this.raw = this.format();
- if (this.build.length) {
- this.raw += `+${this.build.join(".")}`;
- }
- return this;
- }
- }
- module.exports = SemVer;
-});
-
-// ../eve/node_modules/semver/functions/parse.js
-var require_parse = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var parse = (version2, options2, throwErrors = false) => {
- if (version2 instanceof SemVer) {
- return version2;
- }
- try {
- return new SemVer(version2, options2);
- } catch (er) {
- if (!throwErrors) {
- return null;
- }
- throw er;
- }
- };
- module.exports = parse;
-});
-
-// ../eve/node_modules/semver/functions/valid.js
-var require_valid = __commonJS((exports, module) => {
- var parse = require_parse();
- var valid = (version2, options2) => {
- const v = parse(version2, options2);
- return v ? v.version : null;
- };
- module.exports = valid;
-});
-
-// ../eve/node_modules/semver/functions/clean.js
-var require_clean = __commonJS((exports, module) => {
- var parse = require_parse();
- var clean = (version2, options2) => {
- const s = parse(version2.trim().replace(/^[=v]+/, ""), options2);
- return s ? s.version : null;
- };
- module.exports = clean;
-});
-
-// ../eve/node_modules/semver/functions/inc.js
-var require_inc = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var inc = (version2, release, options2, identifier, identifierBase) => {
- if (typeof options2 === "string") {
- identifierBase = identifier;
- identifier = options2;
- options2 = undefined;
- }
- try {
- return new SemVer(version2 instanceof SemVer ? version2.version : version2, options2).inc(release, identifier, identifierBase).version;
- } catch (er) {
- return null;
- }
- };
- module.exports = inc;
-});
-
-// ../eve/node_modules/semver/functions/diff.js
-var require_diff = __commonJS((exports, module) => {
- var parse = require_parse();
- var diff = (version1, version2) => {
- const v1 = parse(version1, null, true);
- const v2 = parse(version2, null, true);
- const comparison = v1.compare(v2);
- if (comparison === 0) {
- return null;
- }
- const v1Higher = comparison > 0;
- const highVersion = v1Higher ? v1 : v2;
- const lowVersion = v1Higher ? v2 : v1;
- const highHasPre = !!highVersion.prerelease.length;
- const lowHasPre = !!lowVersion.prerelease.length;
- if (lowHasPre && !highHasPre) {
- if (!lowVersion.patch && !lowVersion.minor) {
- return "major";
- }
- if (lowVersion.compareMain(highVersion) === 0) {
- if (lowVersion.minor && !lowVersion.patch) {
- return "minor";
- }
- return "patch";
- }
- }
- const prefix = highHasPre ? "pre" : "";
- if (v1.major !== v2.major) {
- return prefix + "major";
- }
- if (v1.minor !== v2.minor) {
- return prefix + "minor";
- }
- if (v1.patch !== v2.patch) {
- return prefix + "patch";
- }
- return "prerelease";
- };
- module.exports = diff;
-});
-
-// ../eve/node_modules/semver/functions/major.js
-var require_major = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var major = (a, loose) => new SemVer(a, loose).major;
- module.exports = major;
-});
-
-// ../eve/node_modules/semver/functions/minor.js
-var require_minor = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var minor = (a, loose) => new SemVer(a, loose).minor;
- module.exports = minor;
-});
-
-// ../eve/node_modules/semver/functions/patch.js
-var require_patch = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var patch = (a, loose) => new SemVer(a, loose).patch;
- module.exports = patch;
-});
-
-// ../eve/node_modules/semver/functions/prerelease.js
-var require_prerelease = __commonJS((exports, module) => {
- var parse = require_parse();
- var prerelease = (version2, options2) => {
- const parsed = parse(version2, options2);
- return parsed && parsed.prerelease.length ? parsed.prerelease : null;
- };
- module.exports = prerelease;
-});
-
-// ../eve/node_modules/semver/functions/compare.js
-var require_compare = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose));
- module.exports = compare;
-});
-
-// ../eve/node_modules/semver/functions/rcompare.js
-var require_rcompare = __commonJS((exports, module) => {
- var compare = require_compare();
- var rcompare = (a, b, loose) => compare(b, a, loose);
- module.exports = rcompare;
-});
-
-// ../eve/node_modules/semver/functions/compare-loose.js
-var require_compare_loose = __commonJS((exports, module) => {
- var compare = require_compare();
- var compareLoose = (a, b) => compare(a, b, true);
- module.exports = compareLoose;
-});
-
-// ../eve/node_modules/semver/functions/compare-build.js
-var require_compare_build = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var compareBuild = (a, b, loose) => {
- const versionA = new SemVer(a, loose);
- const versionB = new SemVer(b, loose);
- return versionA.compare(versionB) || versionA.compareBuild(versionB);
- };
- module.exports = compareBuild;
-});
-
-// ../eve/node_modules/semver/functions/sort.js
-var require_sort = __commonJS((exports, module) => {
- var compareBuild = require_compare_build();
- var sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose));
- module.exports = sort;
-});
-
-// ../eve/node_modules/semver/functions/rsort.js
-var require_rsort = __commonJS((exports, module) => {
- var compareBuild = require_compare_build();
- var rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose));
- module.exports = rsort;
-});
-
-// ../eve/node_modules/semver/functions/gt.js
-var require_gt = __commonJS((exports, module) => {
- var compare = require_compare();
- var gt2 = (a, b, loose) => compare(a, b, loose) > 0;
- module.exports = gt2;
-});
-
-// ../eve/node_modules/semver/functions/lt.js
-var require_lt = __commonJS((exports, module) => {
- var compare = require_compare();
- var lt2 = (a, b, loose) => compare(a, b, loose) < 0;
- module.exports = lt2;
-});
-
-// ../eve/node_modules/semver/functions/eq.js
-var require_eq = __commonJS((exports, module) => {
- var compare = require_compare();
- var eq2 = (a, b, loose) => compare(a, b, loose) === 0;
- module.exports = eq2;
-});
-
-// ../eve/node_modules/semver/functions/neq.js
-var require_neq = __commonJS((exports, module) => {
- var compare = require_compare();
- var neq = (a, b, loose) => compare(a, b, loose) !== 0;
- module.exports = neq;
-});
-
-// ../eve/node_modules/semver/functions/gte.js
-var require_gte = __commonJS((exports, module) => {
- var compare = require_compare();
- var gte2 = (a, b, loose) => compare(a, b, loose) >= 0;
- module.exports = gte2;
-});
-
-// ../eve/node_modules/semver/functions/lte.js
-var require_lte = __commonJS((exports, module) => {
- var compare = require_compare();
- var lte2 = (a, b, loose) => compare(a, b, loose) <= 0;
- module.exports = lte2;
-});
-
-// ../eve/node_modules/semver/functions/cmp.js
-var require_cmp = __commonJS((exports, module) => {
- var eq2 = require_eq();
- var neq = require_neq();
- var gt2 = require_gt();
- var gte2 = require_gte();
- var lt2 = require_lt();
- var lte2 = require_lte();
- var cmp = (a, op, b, loose) => {
- switch (op) {
- case "===":
- if (typeof a === "object") {
- a = a.version;
- }
- if (typeof b === "object") {
- b = b.version;
- }
- return a === b;
- case "!==":
- if (typeof a === "object") {
- a = a.version;
- }
- if (typeof b === "object") {
- b = b.version;
- }
- return a !== b;
- case "":
- case "=":
- case "==":
- return eq2(a, b, loose);
- case "!=":
- return neq(a, b, loose);
- case ">":
- return gt2(a, b, loose);
- case ">=":
- return gte2(a, b, loose);
- case "<":
- return lt2(a, b, loose);
- case "<=":
- return lte2(a, b, loose);
- default:
- throw new TypeError(`Invalid operator: ${op}`);
- }
- };
- module.exports = cmp;
-});
-
-// ../eve/node_modules/semver/functions/coerce.js
-var require_coerce = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var parse = require_parse();
- var { safeRe: re, t } = require_re();
- var coerce = (version2, options2) => {
- if (version2 instanceof SemVer) {
- return version2;
- }
- if (typeof version2 === "number") {
- version2 = String(version2);
- }
- if (typeof version2 !== "string") {
- return null;
- }
- options2 = options2 || {};
- let match = null;
- if (!options2.rtl) {
- match = version2.match(options2.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]);
- } else {
- const coerceRtlRegex = options2.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL];
- let next;
- while ((next = coerceRtlRegex.exec(version2)) && (!match || match.index + match[0].length !== version2.length)) {
- if (!match || next.index + next[0].length !== match.index + match[0].length) {
- match = next;
- }
- coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length;
- }
- coerceRtlRegex.lastIndex = -1;
- }
- if (match === null) {
- return null;
- }
- const major = match[2];
- const minor = match[3] || "0";
- const patch = match[4] || "0";
- const prerelease = options2.includePrerelease && match[5] ? `-${match[5]}` : "";
- const build = options2.includePrerelease && match[6] ? `+${match[6]}` : "";
- return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options2);
- };
- module.exports = coerce;
-});
-
-// ../eve/node_modules/semver/internal/lrucache.js
-var require_lrucache = __commonJS((exports, module) => {
- class LRUCache {
- constructor() {
- this.max = 1000;
- this.map = new Map;
- }
- get(key) {
- const value = this.map.get(key);
- if (value === undefined) {
- return;
- } else {
- this.map.delete(key);
- this.map.set(key, value);
- return value;
- }
- }
- delete(key) {
- return this.map.delete(key);
- }
- set(key, value) {
- const deleted = this.delete(key);
- if (!deleted && value !== undefined) {
- if (this.map.size >= this.max) {
- const firstKey = this.map.keys().next().value;
- this.delete(firstKey);
- }
- this.map.set(key, value);
- }
- return this;
- }
- }
- module.exports = LRUCache;
-});
-
-// ../eve/node_modules/semver/classes/range.js
-var require_range = __commonJS((exports, module) => {
- var SPACE_CHARACTERS = /\s+/g;
-
- class Range {
- constructor(range, options2) {
- options2 = parseOptions(options2);
- if (range instanceof Range) {
- if (range.loose === !!options2.loose && range.includePrerelease === !!options2.includePrerelease) {
- return range;
- } else {
- return new Range(range.raw, options2);
- }
- }
- if (range instanceof Comparator) {
- this.raw = range.value;
- this.set = [[range]];
- this.formatted = undefined;
- return this;
- }
- this.options = options2;
- this.loose = !!options2.loose;
- this.includePrerelease = !!options2.includePrerelease;
- this.raw = range.trim().replace(SPACE_CHARACTERS, " ");
- this.set = this.raw.split("||").map((r) => this.parseRange(r.trim())).filter((c) => c.length);
- if (!this.set.length) {
- throw new TypeError(`Invalid SemVer Range: ${this.raw}`);
- }
- if (this.set.length > 1) {
- const first = this.set[0];
- this.set = this.set.filter((c) => !isNullSet(c[0]));
- if (this.set.length === 0) {
- this.set = [first];
- } else if (this.set.length > 1) {
- for (const c of this.set) {
- if (c.length === 1 && isAny(c[0])) {
- this.set = [c];
- break;
- }
- }
- }
- }
- this.formatted = undefined;
- }
- get range() {
- if (this.formatted === undefined) {
- this.formatted = "";
- for (let i = 0;i < this.set.length; i++) {
- if (i > 0) {
- this.formatted += "||";
- }
- const comps = this.set[i];
- for (let k = 0;k < comps.length; k++) {
- if (k > 0) {
- this.formatted += " ";
- }
- this.formatted += comps[k].toString().trim();
- }
- }
- }
- return this.formatted;
- }
- format() {
- return this.range;
- }
- toString() {
- return this.range;
- }
- parseRange(range) {
- const memoOpts = (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | (this.options.loose && FLAG_LOOSE);
- const memoKey = memoOpts + ":" + range;
- const cached = cache.get(memoKey);
- if (cached) {
- return cached;
- }
- const loose = this.options.loose;
- const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE];
- range = range.replace(hr, hyphenReplace(this.options.includePrerelease));
- debug("hyphen replace", range);
- range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace);
- debug("comparator trim", range);
- range = range.replace(re[t.TILDETRIM], tildeTrimReplace);
- debug("tilde trim", range);
- range = range.replace(re[t.CARETTRIM], caretTrimReplace);
- debug("caret trim", range);
- let rangeList = range.split(" ").map((comp) => parseComparator(comp, this.options)).join(" ").split(/\s+/).map((comp) => replaceGTE0(comp, this.options));
- if (loose) {
- rangeList = rangeList.filter((comp) => {
- debug("loose invalid filter", comp, this.options);
- return !!comp.match(re[t.COMPARATORLOOSE]);
- });
- }
- debug("range list", rangeList);
- const rangeMap = new Map;
- const comparators = rangeList.map((comp) => new Comparator(comp, this.options));
- for (const comp of comparators) {
- if (isNullSet(comp)) {
- return [comp];
- }
- rangeMap.set(comp.value, comp);
- }
- if (rangeMap.size > 1 && rangeMap.has("")) {
- rangeMap.delete("");
- }
- const result = [...rangeMap.values()];
- cache.set(memoKey, result);
- return result;
- }
- intersects(range, options2) {
- if (!(range instanceof Range)) {
- throw new TypeError("a Range is required");
- }
- return this.set.some((thisComparators) => {
- return isSatisfiable(thisComparators, options2) && range.set.some((rangeComparators) => {
- return isSatisfiable(rangeComparators, options2) && thisComparators.every((thisComparator) => {
- return rangeComparators.every((rangeComparator) => {
- return thisComparator.intersects(rangeComparator, options2);
- });
- });
- });
- });
- }
- test(version2) {
- if (!version2) {
- return false;
- }
- if (typeof version2 === "string") {
- try {
- version2 = new SemVer(version2, this.options);
- } catch (er) {
- return false;
- }
- }
- for (let i = 0;i < this.set.length; i++) {
- if (testSet(this.set[i], version2, this.options)) {
- return true;
- }
- }
- return false;
- }
- }
- module.exports = Range;
- var LRU = require_lrucache();
- var cache = new LRU;
- var parseOptions = require_parse_options();
- var Comparator = require_comparator();
- var debug = require_debug();
- var SemVer = require_semver();
- var {
- safeRe: re,
- t,
- comparatorTrimReplace,
- tildeTrimReplace,
- caretTrimReplace
- } = require_re();
- var { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require_constants();
- var isNullSet = (c) => c.value === "<0.0.0-0";
- var isAny = (c) => c.value === "";
- var isSatisfiable = (comparators, options2) => {
- let result = true;
- const remainingComparators = comparators.slice();
- let testComparator = remainingComparators.pop();
- while (result && remainingComparators.length) {
- result = remainingComparators.every((otherComparator) => {
- return testComparator.intersects(otherComparator, options2);
- });
- testComparator = remainingComparators.pop();
- }
- return result;
- };
- var parseComparator = (comp, options2) => {
- debug("comp", comp, options2);
- comp = replaceCarets(comp, options2);
- debug("caret", comp);
- comp = replaceTildes(comp, options2);
- debug("tildes", comp);
- comp = replaceXRanges(comp, options2);
- debug("xrange", comp);
- comp = replaceStars(comp, options2);
- debug("stars", comp);
- return comp;
- };
- var isX = (id) => !id || id.toLowerCase() === "x" || id === "*";
- var replaceTildes = (comp, options2) => {
- return comp.trim().split(/\s+/).map((c) => replaceTilde(c, options2)).join(" ");
- };
- var replaceTilde = (comp, options2) => {
- const r = options2.loose ? re[t.TILDELOOSE] : re[t.TILDE];
- return comp.replace(r, (_, M, m, p, pr) => {
- debug("tilde", comp, _, M, m, p, pr);
- let ret;
- if (isX(M)) {
- ret = "";
- } else if (isX(m)) {
- ret = `>=${M}.0.0 <${+M + 1}.0.0-0`;
- } else if (isX(p)) {
- ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;
- } else if (pr) {
- debug("replaceTilde pr", pr);
- ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
- } else {
- ret = `>=${M}.${m}.${p} <${M}.${+m + 1}.0-0`;
- }
- debug("tilde return", ret);
- return ret;
- });
- };
- var replaceCarets = (comp, options2) => {
- return comp.trim().split(/\s+/).map((c) => replaceCaret(c, options2)).join(" ");
- };
- var replaceCaret = (comp, options2) => {
- debug("caret", comp, options2);
- const r = options2.loose ? re[t.CARETLOOSE] : re[t.CARET];
- const z = options2.includePrerelease ? "-0" : "";
- return comp.replace(r, (_, M, m, p, pr) => {
- debug("caret", comp, _, M, m, p, pr);
- let ret;
- if (isX(M)) {
- ret = "";
- } else if (isX(m)) {
- ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`;
- } else if (isX(p)) {
- if (M === "0") {
- ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`;
- } else {
- ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`;
- }
- } else if (pr) {
- debug("replaceCaret pr", pr);
- if (M === "0") {
- if (m === "0") {
- ret = `>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p + 1}-0`;
- } else {
- ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
- }
- } else {
- ret = `>=${M}.${m}.${p}-${pr} <${+M + 1}.0.0-0`;
- }
- } else {
- debug("no pr");
- if (M === "0") {
- if (m === "0") {
- ret = `>=${M}.${m}.${p}${z} <${M}.${m}.${+p + 1}-0`;
- } else {
- ret = `>=${M}.${m}.${p}${z} <${M}.${+m + 1}.0-0`;
- }
- } else {
- ret = `>=${M}.${m}.${p} <${+M + 1}.0.0-0`;
- }
- }
- debug("caret return", ret);
- return ret;
- });
- };
- var replaceXRanges = (comp, options2) => {
- debug("replaceXRanges", comp, options2);
- return comp.split(/\s+/).map((c) => replaceXRange(c, options2)).join(" ");
- };
- var replaceXRange = (comp, options2) => {
- comp = comp.trim();
- const r = options2.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];
- return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
- debug("xRange", comp, ret, gtlt, M, m, p, pr);
- const xM = isX(M);
- const xm = xM || isX(m);
- const xp = xm || isX(p);
- const anyX = xp;
- if (gtlt === "=" && anyX) {
- gtlt = "";
- }
- pr = options2.includePrerelease ? "-0" : "";
- if (xM) {
- if (gtlt === ">" || gtlt === "<") {
- ret = "<0.0.0-0";
- } else {
- ret = "*";
- }
- } else if (gtlt && anyX) {
- if (xm) {
- m = 0;
- }
- p = 0;
- if (gtlt === ">") {
- gtlt = ">=";
- if (xm) {
- M = +M + 1;
- m = 0;
- p = 0;
- } else {
- m = +m + 1;
- p = 0;
- }
- } else if (gtlt === "<=") {
- gtlt = "<";
- if (xm) {
- M = +M + 1;
- } else {
- m = +m + 1;
- }
- }
- if (gtlt === "<") {
- pr = "-0";
- }
- ret = `${gtlt + M}.${m}.${p}${pr}`;
- } else if (xm) {
- ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`;
- } else if (xp) {
- ret = `>=${M}.${m}.0${pr} <${M}.${+m + 1}.0-0`;
- }
- debug("xRange return", ret);
- return ret;
- });
- };
- var replaceStars = (comp, options2) => {
- debug("replaceStars", comp, options2);
- return comp.trim().replace(re[t.STAR], "");
- };
- var replaceGTE0 = (comp, options2) => {
- debug("replaceGTE0", comp, options2);
- return comp.trim().replace(re[options2.includePrerelease ? t.GTE0PRE : t.GTE0], "");
- };
- var hyphenReplace = (incPr) => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr) => {
- if (isX(fM)) {
- from = "";
- } else if (isX(fm)) {
- from = `>=${fM}.0.0${incPr ? "-0" : ""}`;
- } else if (isX(fp)) {
- from = `>=${fM}.${fm}.0${incPr ? "-0" : ""}`;
- } else if (fpr) {
- from = `>=${from}`;
- } else {
- from = `>=${from}${incPr ? "-0" : ""}`;
- }
- if (isX(tM)) {
- to = "";
- } else if (isX(tm)) {
- to = `<${+tM + 1}.0.0-0`;
- } else if (isX(tp)) {
- to = `<${tM}.${+tm + 1}.0-0`;
- } else if (tpr) {
- to = `<=${tM}.${tm}.${tp}-${tpr}`;
- } else if (incPr) {
- to = `<${tM}.${tm}.${+tp + 1}-0`;
- } else {
- to = `<=${to}`;
- }
- return `${from} ${to}`.trim();
- };
- var testSet = (set, version2, options2) => {
- for (let i = 0;i < set.length; i++) {
- if (!set[i].test(version2)) {
- return false;
- }
- }
- if (version2.prerelease.length && !options2.includePrerelease) {
- for (let i = 0;i < set.length; i++) {
- debug(set[i].semver);
- if (set[i].semver === Comparator.ANY) {
- continue;
- }
- if (set[i].semver.prerelease.length > 0) {
- const allowed = set[i].semver;
- if (allowed.major === version2.major && allowed.minor === version2.minor && allowed.patch === version2.patch) {
- return true;
- }
- }
- }
- return false;
- }
- return true;
- };
-});
-
-// ../eve/node_modules/semver/classes/comparator.js
-var require_comparator = __commonJS((exports, module) => {
- var ANY = Symbol("SemVer ANY");
-
- class Comparator {
- static get ANY() {
- return ANY;
- }
- constructor(comp, options2) {
- options2 = parseOptions(options2);
- if (comp instanceof Comparator) {
- if (comp.loose === !!options2.loose) {
- return comp;
- } else {
- comp = comp.value;
- }
- }
- comp = comp.trim().split(/\s+/).join(" ");
- debug("comparator", comp, options2);
- this.options = options2;
- this.loose = !!options2.loose;
- this.parse(comp);
- if (this.semver === ANY) {
- this.value = "";
- } else {
- this.value = this.operator + this.semver.version;
- }
- debug("comp", this);
- }
- parse(comp) {
- const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR];
- const m = comp.match(r);
- if (!m) {
- throw new TypeError(`Invalid comparator: ${comp}`);
- }
- this.operator = m[1] !== undefined ? m[1] : "";
- if (this.operator === "=") {
- this.operator = "";
- }
- if (!m[2]) {
- this.semver = ANY;
- } else {
- this.semver = new SemVer(m[2], this.options.loose);
- }
- }
- toString() {
- return this.value;
- }
- test(version2) {
- debug("Comparator.test", version2, this.options.loose);
- if (this.semver === ANY || version2 === ANY) {
- return true;
- }
- if (typeof version2 === "string") {
- try {
- version2 = new SemVer(version2, this.options);
- } catch (er) {
- return false;
- }
- }
- return cmp(version2, this.operator, this.semver, this.options);
- }
- intersects(comp, options2) {
- if (!(comp instanceof Comparator)) {
- throw new TypeError("a Comparator is required");
- }
- if (this.operator === "") {
- if (this.value === "") {
- return true;
- }
- return new Range(comp.value, options2).test(this.value);
- } else if (comp.operator === "") {
- if (comp.value === "") {
- return true;
- }
- return new Range(this.value, options2).test(comp.semver);
- }
- options2 = parseOptions(options2);
- if (options2.includePrerelease && (this.value === "<0.0.0-0" || comp.value === "<0.0.0-0")) {
- return false;
- }
- if (!options2.includePrerelease && (this.value.startsWith("<0.0.0") || comp.value.startsWith("<0.0.0"))) {
- return false;
- }
- if (this.operator.startsWith(">") && comp.operator.startsWith(">")) {
- return true;
- }
- if (this.operator.startsWith("<") && comp.operator.startsWith("<")) {
- return true;
- }
- if (this.semver.version === comp.semver.version && this.operator.includes("=") && comp.operator.includes("=")) {
- return true;
- }
- if (cmp(this.semver, "<", comp.semver, options2) && this.operator.startsWith(">") && comp.operator.startsWith("<")) {
- return true;
- }
- if (cmp(this.semver, ">", comp.semver, options2) && this.operator.startsWith("<") && comp.operator.startsWith(">")) {
- return true;
- }
- return false;
- }
- }
- module.exports = Comparator;
- var parseOptions = require_parse_options();
- var { safeRe: re, t } = require_re();
- var cmp = require_cmp();
- var debug = require_debug();
- var SemVer = require_semver();
- var Range = require_range();
-});
-
-// ../eve/node_modules/semver/functions/satisfies.js
-var require_satisfies = __commonJS((exports, module) => {
- var Range = require_range();
- var satisfies = (version2, range, options2) => {
- try {
- range = new Range(range, options2);
- } catch (er) {
- return false;
- }
- return range.test(version2);
- };
- module.exports = satisfies;
-});
-
-// ../eve/node_modules/semver/ranges/to-comparators.js
-var require_to_comparators = __commonJS((exports, module) => {
- var Range = require_range();
- var toComparators = (range, options2) => new Range(range, options2).set.map((comp) => comp.map((c) => c.value).join(" ").trim().split(" "));
- module.exports = toComparators;
-});
-
-// ../eve/node_modules/semver/ranges/max-satisfying.js
-var require_max_satisfying = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Range = require_range();
- var maxSatisfying = (versions, range, options2) => {
- let max = null;
- let maxSV = null;
- let rangeObj = null;
- try {
- rangeObj = new Range(range, options2);
- } catch (er) {
- return null;
- }
- versions.forEach((v) => {
- if (rangeObj.test(v)) {
- if (!max || maxSV.compare(v) === -1) {
- max = v;
- maxSV = new SemVer(max, options2);
- }
- }
- });
- return max;
- };
- module.exports = maxSatisfying;
-});
-
-// ../eve/node_modules/semver/ranges/min-satisfying.js
-var require_min_satisfying = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Range = require_range();
- var minSatisfying = (versions, range, options2) => {
- let min = null;
- let minSV = null;
- let rangeObj = null;
- try {
- rangeObj = new Range(range, options2);
- } catch (er) {
- return null;
- }
- versions.forEach((v) => {
- if (rangeObj.test(v)) {
- if (!min || minSV.compare(v) === 1) {
- min = v;
- minSV = new SemVer(min, options2);
- }
- }
- });
- return min;
- };
- module.exports = minSatisfying;
-});
-
-// ../eve/node_modules/semver/ranges/min-version.js
-var require_min_version = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Range = require_range();
- var gt2 = require_gt();
- var minVersion = (range, loose) => {
- range = new Range(range, loose);
- let minver = new SemVer("0.0.0");
- if (range.test(minver)) {
- return minver;
- }
- minver = new SemVer("0.0.0-0");
- if (range.test(minver)) {
- return minver;
- }
- minver = null;
- for (let i = 0;i < range.set.length; ++i) {
- const comparators = range.set[i];
- let setMin = null;
- comparators.forEach((comparator) => {
- const compver = new SemVer(comparator.semver.version);
- switch (comparator.operator) {
- case ">":
- if (compver.prerelease.length === 0) {
- compver.patch++;
- } else {
- compver.prerelease.push(0);
- }
- compver.raw = compver.format();
- case "":
- case ">=":
- if (!setMin || gt2(compver, setMin)) {
- setMin = compver;
- }
- break;
- case "<":
- case "<=":
- break;
- default:
- throw new Error(`Unexpected operation: ${comparator.operator}`);
- }
- });
- if (setMin && (!minver || gt2(minver, setMin))) {
- minver = setMin;
- }
- }
- if (minver && range.test(minver)) {
- return minver;
- }
- return null;
- };
- module.exports = minVersion;
-});
-
-// ../eve/node_modules/semver/ranges/valid.js
-var require_valid2 = __commonJS((exports, module) => {
- var Range = require_range();
- var validRange = (range, options2) => {
- try {
- return new Range(range, options2).range || "*";
- } catch (er) {
- return null;
- }
- };
- module.exports = validRange;
-});
-
-// ../eve/node_modules/semver/ranges/outside.js
-var require_outside = __commonJS((exports, module) => {
- var SemVer = require_semver();
- var Comparator = require_comparator();
- var { ANY } = Comparator;
- var Range = require_range();
- var satisfies = require_satisfies();
- var gt2 = require_gt();
- var lt2 = require_lt();
- var lte2 = require_lte();
- var gte2 = require_gte();
- var outside = (version2, range, hilo, options2) => {
- version2 = new SemVer(version2, options2);
- range = new Range(range, options2);
- let gtfn, ltefn, ltfn, comp, ecomp;
- switch (hilo) {
- case ">":
- gtfn = gt2;
- ltefn = lte2;
- ltfn = lt2;
- comp = ">";
- ecomp = ">=";
- break;
- case "<":
- gtfn = lt2;
- ltefn = gte2;
- ltfn = gt2;
- comp = "<";
- ecomp = "<=";
- break;
- default:
- throw new TypeError('Must provide a hilo val of "<" or ">"');
- }
- if (satisfies(version2, range, options2)) {
- return false;
- }
- for (let i = 0;i < range.set.length; ++i) {
- const comparators = range.set[i];
- let high = null;
- let low = null;
- comparators.forEach((comparator) => {
- if (comparator.semver === ANY) {
- comparator = new Comparator(">=0.0.0");
- }
- high = high || comparator;
- low = low || comparator;
- if (gtfn(comparator.semver, high.semver, options2)) {
- high = comparator;
- } else if (ltfn(comparator.semver, low.semver, options2)) {
- low = comparator;
- }
- });
- if (high.operator === comp || high.operator === ecomp) {
- return false;
- }
- if ((!low.operator || low.operator === comp) && ltefn(version2, low.semver)) {
- return false;
- } else if (low.operator === ecomp && ltfn(version2, low.semver)) {
- return false;
- }
- }
- return true;
- };
- module.exports = outside;
-});
-
-// ../eve/node_modules/semver/ranges/gtr.js
-var require_gtr = __commonJS((exports, module) => {
- var outside = require_outside();
- var gtr = (version2, range, options2) => outside(version2, range, ">", options2);
- module.exports = gtr;
-});
-
-// ../eve/node_modules/semver/ranges/ltr.js
-var require_ltr = __commonJS((exports, module) => {
- var outside = require_outside();
- var ltr = (version2, range, options2) => outside(version2, range, "<", options2);
- module.exports = ltr;
-});
-
-// ../eve/node_modules/semver/ranges/intersects.js
-var require_intersects = __commonJS((exports, module) => {
- var Range = require_range();
- var intersects = (r1, r2, options2) => {
- r1 = new Range(r1, options2);
- r2 = new Range(r2, options2);
- return r1.intersects(r2, options2);
- };
- module.exports = intersects;
-});
-
-// ../eve/node_modules/semver/ranges/simplify.js
-var require_simplify = __commonJS((exports, module) => {
- var satisfies = require_satisfies();
- var compare = require_compare();
- module.exports = (versions, range, options2) => {
- const set = [];
- let first = null;
- let prev = null;
- const v = versions.sort((a, b) => compare(a, b, options2));
- for (const version2 of v) {
- const included = satisfies(version2, range, options2);
- if (included) {
- prev = version2;
- if (!first) {
- first = version2;
- }
- } else {
- if (prev) {
- set.push([first, prev]);
- }
- prev = null;
- first = null;
- }
- }
- if (first) {
- set.push([first, null]);
- }
- const ranges = [];
- for (const [min, max] of set) {
- if (min === max) {
- ranges.push(min);
- } else if (!max && min === v[0]) {
- ranges.push("*");
- } else if (!max) {
- ranges.push(`>=${min}`);
- } else if (min === v[0]) {
- ranges.push(`<=${max}`);
- } else {
- ranges.push(`${min} - ${max}`);
- }
- }
- const simplified = ranges.join(" || ");
- const original = typeof range.raw === "string" ? range.raw : String(range);
- return simplified.length < original.length ? simplified : range;
- };
-});
-
-// ../eve/node_modules/semver/ranges/subset.js
-var require_subset = __commonJS((exports, module) => {
- var Range = require_range();
- var Comparator = require_comparator();
- var { ANY } = Comparator;
- var satisfies = require_satisfies();
- var compare = require_compare();
- var subset = (sub, dom, options2 = {}) => {
- if (sub === dom) {
- return true;
- }
- sub = new Range(sub, options2);
- dom = new Range(dom, options2);
- let sawNonNull = false;
- OUTER:
- for (const simpleSub of sub.set) {
- for (const simpleDom of dom.set) {
- const isSub = simpleSubset(simpleSub, simpleDom, options2);
- sawNonNull = sawNonNull || isSub !== null;
- if (isSub) {
- continue OUTER;
- }
- }
- if (sawNonNull) {
- return false;
- }
- }
- return true;
- };
- var minimumVersionWithPreRelease = [new Comparator(">=0.0.0-0")];
- var minimumVersion = [new Comparator(">=0.0.0")];
- var simpleSubset = (sub, dom, options2) => {
- if (sub === dom) {
- return true;
- }
- if (sub.length === 1 && sub[0].semver === ANY) {
- if (dom.length === 1 && dom[0].semver === ANY) {
- return true;
- } else if (options2.includePrerelease) {
- sub = minimumVersionWithPreRelease;
- } else {
- sub = minimumVersion;
- }
- }
- if (dom.length === 1 && dom[0].semver === ANY) {
- if (options2.includePrerelease) {
- return true;
- } else {
- dom = minimumVersion;
- }
- }
- const eqSet = new Set;
- let gt2, lt2;
- for (const c of sub) {
- if (c.operator === ">" || c.operator === ">=") {
- gt2 = higherGT(gt2, c, options2);
- } else if (c.operator === "<" || c.operator === "<=") {
- lt2 = lowerLT(lt2, c, options2);
- } else {
- eqSet.add(c.semver);
- }
- }
- if (eqSet.size > 1) {
- return null;
- }
- let gtltComp;
- if (gt2 && lt2) {
- gtltComp = compare(gt2.semver, lt2.semver, options2);
- if (gtltComp > 0) {
- return null;
- } else if (gtltComp === 0 && (gt2.operator !== ">=" || lt2.operator !== "<=")) {
- return null;
- }
- }
- for (const eq2 of eqSet) {
- if (gt2 && !satisfies(eq2, String(gt2), options2)) {
- return null;
- }
- if (lt2 && !satisfies(eq2, String(lt2), options2)) {
- return null;
- }
- for (const c of dom) {
- if (!satisfies(eq2, String(c), options2)) {
- return false;
- }
- }
- return true;
- }
- let higher, lower;
- let hasDomLT, hasDomGT;
- let needDomLTPre = lt2 && !options2.includePrerelease && lt2.semver.prerelease.length ? lt2.semver : false;
- let needDomGTPre = gt2 && !options2.includePrerelease && gt2.semver.prerelease.length ? gt2.semver : false;
- if (needDomLTPre && needDomLTPre.prerelease.length === 1 && lt2.operator === "<" && needDomLTPre.prerelease[0] === 0) {
- needDomLTPre = false;
- }
- for (const c of dom) {
- hasDomGT = hasDomGT || c.operator === ">" || c.operator === ">=";
- hasDomLT = hasDomLT || c.operator === "<" || c.operator === "<=";
- if (gt2) {
- if (needDomGTPre) {
- if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomGTPre.major && c.semver.minor === needDomGTPre.minor && c.semver.patch === needDomGTPre.patch) {
- needDomGTPre = false;
- }
- }
- if (c.operator === ">" || c.operator === ">=") {
- higher = higherGT(gt2, c, options2);
- if (higher === c && higher !== gt2) {
- return false;
- }
- } else if (gt2.operator === ">=" && !satisfies(gt2.semver, String(c), options2)) {
- return false;
- }
- }
- if (lt2) {
- if (needDomLTPre) {
- if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomLTPre.major && c.semver.minor === needDomLTPre.minor && c.semver.patch === needDomLTPre.patch) {
- needDomLTPre = false;
- }
- }
- if (c.operator === "<" || c.operator === "<=") {
- lower = lowerLT(lt2, c, options2);
- if (lower === c && lower !== lt2) {
- return false;
- }
- } else if (lt2.operator === "<=" && !satisfies(lt2.semver, String(c), options2)) {
- return false;
- }
- }
- if (!c.operator && (lt2 || gt2) && gtltComp !== 0) {
- return false;
- }
- }
- if (gt2 && hasDomLT && !lt2 && gtltComp !== 0) {
- return false;
- }
- if (lt2 && hasDomGT && !gt2 && gtltComp !== 0) {
- return false;
- }
- if (needDomGTPre || needDomLTPre) {
- return false;
- }
- return true;
- };
- var higherGT = (a, b, options2) => {
- if (!a) {
- return b;
- }
- const comp = compare(a.semver, b.semver, options2);
- return comp > 0 ? a : comp < 0 ? b : b.operator === ">" && a.operator === ">=" ? b : a;
- };
- var lowerLT = (a, b, options2) => {
- if (!a) {
- return b;
- }
- const comp = compare(a.semver, b.semver, options2);
- return comp < 0 ? a : comp > 0 ? b : b.operator === "<" && a.operator === "<=" ? b : a;
- };
- module.exports = subset;
-});
-
-// ../eve/node_modules/semver/index.js
-var require_semver2 = __commonJS((exports, module) => {
- var internalRe = require_re();
- var constants = require_constants();
- var SemVer = require_semver();
- var identifiers = require_identifiers();
- var parse = require_parse();
- var valid = require_valid();
- var clean = require_clean();
- var inc = require_inc();
- var diff = require_diff();
- var major = require_major();
- var minor = require_minor();
- var patch = require_patch();
- var prerelease = require_prerelease();
- var compare = require_compare();
- var rcompare = require_rcompare();
- var compareLoose = require_compare_loose();
- var compareBuild = require_compare_build();
- var sort = require_sort();
- var rsort = require_rsort();
- var gt2 = require_gt();
- var lt2 = require_lt();
- var eq2 = require_eq();
- var neq = require_neq();
- var gte2 = require_gte();
- var lte2 = require_lte();
- var cmp = require_cmp();
- var coerce = require_coerce();
- var Comparator = require_comparator();
- var Range = require_range();
- var satisfies = require_satisfies();
- var toComparators = require_to_comparators();
- var maxSatisfying = require_max_satisfying();
- var minSatisfying = require_min_satisfying();
- var minVersion = require_min_version();
- var validRange = require_valid2();
- var outside = require_outside();
- var gtr = require_gtr();
- var ltr = require_ltr();
- var intersects = require_intersects();
- var simplifyRange = require_simplify();
- var subset = require_subset();
- module.exports = {
- parse,
- valid,
- clean,
- inc,
- diff,
- major,
- minor,
- patch,
- prerelease,
- compare,
- rcompare,
- compareLoose,
- compareBuild,
- sort,
- rsort,
- gt: gt2,
- lt: lt2,
- eq: eq2,
- neq,
- gte: gte2,
- lte: lte2,
- cmp,
- coerce,
- Comparator,
- Range,
- satisfies,
- toComparators,
- maxSatisfying,
- minSatisfying,
- minVersion,
- validRange,
- outside,
- gtr,
- ltr,
- intersects,
- simplifyRange,
- subset,
- SemVer,
- re: internalRe.re,
- src: internalRe.src,
- tokens: internalRe.t,
- SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,
- RELEASE_TYPES: constants.RELEASE_TYPES,
- compareIdentifiers: identifiers.compareIdentifiers,
- rcompareIdentifiers: identifiers.rcompareIdentifiers
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/asymmetricKeyDetailsSupported.js
-var require_asymmetricKeyDetailsSupported = __commonJS((exports, module) => {
- var semver = require_semver2();
- module.exports = semver.satisfies(process.version, ">=15.7.0");
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/rsaPssKeyDetailsSupported.js
-var require_rsaPssKeyDetailsSupported = __commonJS((exports, module) => {
- var semver = require_semver2();
- module.exports = semver.satisfies(process.version, ">=16.9.0");
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/validateAsymmetricKey.js
-var require_validateAsymmetricKey = __commonJS((exports, module) => {
- var ASYMMETRIC_KEY_DETAILS_SUPPORTED = require_asymmetricKeyDetailsSupported();
- var RSA_PSS_KEY_DETAILS_SUPPORTED = require_rsaPssKeyDetailsSupported();
- var allowedAlgorithmsForKeys = {
- ec: ["ES256", "ES384", "ES512"],
- rsa: ["RS256", "PS256", "RS384", "PS384", "RS512", "PS512"],
- "rsa-pss": ["PS256", "PS384", "PS512"]
- };
- var allowedCurves = {
- ES256: "prime256v1",
- ES384: "secp384r1",
- ES512: "secp521r1"
- };
- module.exports = function(algorithm, key) {
- if (!algorithm || !key)
- return;
- const keyType = key.asymmetricKeyType;
- if (!keyType)
- return;
- const allowedAlgorithms = allowedAlgorithmsForKeys[keyType];
- if (!allowedAlgorithms) {
- throw new Error(`Unknown key type "${keyType}".`);
- }
- if (!allowedAlgorithms.includes(algorithm)) {
- throw new Error(`"alg" parameter for "${keyType}" key type must be one of: ${allowedAlgorithms.join(", ")}.`);
- }
- if (ASYMMETRIC_KEY_DETAILS_SUPPORTED) {
- switch (keyType) {
- case "ec":
- const keyCurve = key.asymmetricKeyDetails.namedCurve;
- const allowedCurve = allowedCurves[algorithm];
- if (keyCurve !== allowedCurve) {
- throw new Error(`"alg" parameter "${algorithm}" requires curve "${allowedCurve}".`);
- }
- break;
- case "rsa-pss":
- if (RSA_PSS_KEY_DETAILS_SUPPORTED) {
- const length = parseInt(algorithm.slice(-3), 10);
- const { hashAlgorithm, mgf1HashAlgorithm, saltLength } = key.asymmetricKeyDetails;
- if (hashAlgorithm !== `sha${length}` || mgf1HashAlgorithm !== hashAlgorithm) {
- throw new Error(`Invalid key for this operation, its RSA-PSS parameters do not meet the requirements of "alg" ${algorithm}.`);
- }
- if (saltLength !== undefined && saltLength > length >> 3) {
- throw new Error(`Invalid key for this operation, its RSA-PSS parameter saltLength does not meet the requirements of "alg" ${algorithm}.`);
- }
- }
- break;
- }
- }
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/lib/psSupported.js
-var require_psSupported = __commonJS((exports, module) => {
- var semver = require_semver2();
- module.exports = semver.satisfies(process.version, "^6.12.0 || >=8.0.0");
-});
-
-// ../eve/node_modules/jsonwebtoken/verify.js
-var require_verify = __commonJS((exports, module) => {
- var JsonWebTokenError = require_JsonWebTokenError();
- var NotBeforeError = require_NotBeforeError();
- var TokenExpiredError = require_TokenExpiredError();
- var decode = require_decode();
- var timespan = require_timespan();
- var validateAsymmetricKey = require_validateAsymmetricKey();
- var PS_SUPPORTED = require_psSupported();
- var jws = require_jws();
- var { KeyObject, createSecretKey, createPublicKey } = __require("crypto");
- var PUB_KEY_ALGS = ["RS256", "RS384", "RS512"];
- var EC_KEY_ALGS = ["ES256", "ES384", "ES512"];
- var RSA_KEY_ALGS = ["RS256", "RS384", "RS512"];
- var HS_ALGS = ["HS256", "HS384", "HS512"];
- if (PS_SUPPORTED) {
- PUB_KEY_ALGS.splice(PUB_KEY_ALGS.length, 0, "PS256", "PS384", "PS512");
- RSA_KEY_ALGS.splice(RSA_KEY_ALGS.length, 0, "PS256", "PS384", "PS512");
- }
- module.exports = function(jwtString, secretOrPublicKey, options2, callback) {
- if (typeof options2 === "function" && !callback) {
- callback = options2;
- options2 = {};
- }
- if (!options2) {
- options2 = {};
- }
- options2 = Object.assign({}, options2);
- let done;
- if (callback) {
- done = callback;
- } else {
- done = function(err, data) {
- if (err)
- throw err;
- return data;
- };
- }
- if (options2.clockTimestamp && typeof options2.clockTimestamp !== "number") {
- return done(new JsonWebTokenError("clockTimestamp must be a number"));
- }
- if (options2.nonce !== undefined && (typeof options2.nonce !== "string" || options2.nonce.trim() === "")) {
- return done(new JsonWebTokenError("nonce must be a non-empty string"));
- }
- if (options2.allowInvalidAsymmetricKeyTypes !== undefined && typeof options2.allowInvalidAsymmetricKeyTypes !== "boolean") {
- return done(new JsonWebTokenError("allowInvalidAsymmetricKeyTypes must be a boolean"));
- }
- const clockTimestamp = options2.clockTimestamp || Math.floor(Date.now() / 1000);
- if (!jwtString) {
- return done(new JsonWebTokenError("jwt must be provided"));
- }
- if (typeof jwtString !== "string") {
- return done(new JsonWebTokenError("jwt must be a string"));
- }
- const parts = jwtString.split(".");
- if (parts.length !== 3) {
- return done(new JsonWebTokenError("jwt malformed"));
- }
- let decodedToken;
- try {
- decodedToken = decode(jwtString, { complete: true });
- } catch (err) {
- return done(err);
- }
- if (!decodedToken) {
- return done(new JsonWebTokenError("invalid token"));
- }
- const header = decodedToken.header;
- let getSecret;
- if (typeof secretOrPublicKey === "function") {
- if (!callback) {
- return done(new JsonWebTokenError("verify must be called asynchronous if secret or public key is provided as a callback"));
- }
- getSecret = secretOrPublicKey;
- } else {
- getSecret = function(header2, secretCallback) {
- return secretCallback(null, secretOrPublicKey);
- };
- }
- return getSecret(header, function(err, secretOrPublicKey2) {
- if (err) {
- return done(new JsonWebTokenError("error in secret or public key callback: " + err.message));
- }
- const hasSignature = parts[2].trim() !== "";
- if (!hasSignature && secretOrPublicKey2) {
- return done(new JsonWebTokenError("jwt signature is required"));
- }
- if (hasSignature && !secretOrPublicKey2) {
- return done(new JsonWebTokenError("secret or public key must be provided"));
- }
- if (!hasSignature && !options2.algorithms) {
- return done(new JsonWebTokenError('please specify "none" in "algorithms" to verify unsigned tokens'));
- }
- if (secretOrPublicKey2 != null && !(secretOrPublicKey2 instanceof KeyObject)) {
- try {
- secretOrPublicKey2 = createPublicKey(secretOrPublicKey2);
- } catch (_) {
- try {
- secretOrPublicKey2 = createSecretKey(typeof secretOrPublicKey2 === "string" ? Buffer.from(secretOrPublicKey2) : secretOrPublicKey2);
- } catch (_2) {
- return done(new JsonWebTokenError("secretOrPublicKey is not valid key material"));
- }
- }
- }
- if (!options2.algorithms) {
- if (secretOrPublicKey2.type === "secret") {
- options2.algorithms = HS_ALGS;
- } else if (["rsa", "rsa-pss"].includes(secretOrPublicKey2.asymmetricKeyType)) {
- options2.algorithms = RSA_KEY_ALGS;
- } else if (secretOrPublicKey2.asymmetricKeyType === "ec") {
- options2.algorithms = EC_KEY_ALGS;
- } else {
- options2.algorithms = PUB_KEY_ALGS;
- }
- }
- if (options2.algorithms.indexOf(decodedToken.header.alg) === -1) {
- return done(new JsonWebTokenError("invalid algorithm"));
- }
- if (header.alg.startsWith("HS") && secretOrPublicKey2.type !== "secret") {
- return done(new JsonWebTokenError(`secretOrPublicKey must be a symmetric key when using ${header.alg}`));
- } else if (/^(?:RS|PS|ES)/.test(header.alg) && secretOrPublicKey2.type !== "public") {
- return done(new JsonWebTokenError(`secretOrPublicKey must be an asymmetric key when using ${header.alg}`));
- }
- if (!options2.allowInvalidAsymmetricKeyTypes) {
- try {
- validateAsymmetricKey(header.alg, secretOrPublicKey2);
- } catch (e) {
- return done(e);
- }
- }
- let valid;
- try {
- valid = jws.verify(jwtString, decodedToken.header.alg, secretOrPublicKey2);
- } catch (e) {
- return done(e);
- }
- if (!valid) {
- return done(new JsonWebTokenError("invalid signature"));
- }
- const payload = decodedToken.payload;
- if (typeof payload.nbf !== "undefined" && !options2.ignoreNotBefore) {
- if (typeof payload.nbf !== "number") {
- return done(new JsonWebTokenError("invalid nbf value"));
- }
- if (payload.nbf > clockTimestamp + (options2.clockTolerance || 0)) {
- return done(new NotBeforeError("jwt not active", new Date(payload.nbf * 1000)));
- }
- }
- if (typeof payload.exp !== "undefined" && !options2.ignoreExpiration) {
- if (typeof payload.exp !== "number") {
- return done(new JsonWebTokenError("invalid exp value"));
- }
- if (clockTimestamp >= payload.exp + (options2.clockTolerance || 0)) {
- return done(new TokenExpiredError("jwt expired", new Date(payload.exp * 1000)));
- }
- }
- if (options2.audience) {
- const audiences = Array.isArray(options2.audience) ? options2.audience : [options2.audience];
- const target = Array.isArray(payload.aud) ? payload.aud : [payload.aud];
- const match = target.some(function(targetAudience) {
- return audiences.some(function(audience) {
- return audience instanceof RegExp ? audience.test(targetAudience) : audience === targetAudience;
- });
- });
- if (!match) {
- return done(new JsonWebTokenError("jwt audience invalid. expected: " + audiences.join(" or ")));
- }
- }
- if (options2.issuer) {
- const invalid_issuer = typeof options2.issuer === "string" && payload.iss !== options2.issuer || Array.isArray(options2.issuer) && options2.issuer.indexOf(payload.iss) === -1;
- if (invalid_issuer) {
- return done(new JsonWebTokenError("jwt issuer invalid. expected: " + options2.issuer));
- }
- }
- if (options2.subject) {
- if (payload.sub !== options2.subject) {
- return done(new JsonWebTokenError("jwt subject invalid. expected: " + options2.subject));
- }
- }
- if (options2.jwtid) {
- if (payload.jti !== options2.jwtid) {
- return done(new JsonWebTokenError("jwt jwtid invalid. expected: " + options2.jwtid));
- }
- }
- if (options2.nonce) {
- if (payload.nonce !== options2.nonce) {
- return done(new JsonWebTokenError("jwt nonce invalid. expected: " + options2.nonce));
- }
- }
- if (options2.maxAge) {
- if (typeof payload.iat !== "number") {
- return done(new JsonWebTokenError("iat required when maxAge is specified"));
- }
- const maxAgeTimestamp = timespan(options2.maxAge, payload.iat);
- if (typeof maxAgeTimestamp === "undefined") {
- return done(new JsonWebTokenError('"maxAge" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
- }
- if (clockTimestamp >= maxAgeTimestamp + (options2.clockTolerance || 0)) {
- return done(new TokenExpiredError("maxAge exceeded", new Date(maxAgeTimestamp * 1000)));
- }
- }
- if (options2.complete === true) {
- const signature = decodedToken.signature;
- return done(null, {
- header,
- payload,
- signature
- });
- }
- return done(null, payload);
- });
- };
-});
-
-// ../eve/node_modules/lodash.includes/index.js
-var require_lodash = __commonJS((exports, module) => {
- var INFINITY = 1 / 0;
- var MAX_SAFE_INTEGER = 9007199254740991;
- var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
- var NAN = 0 / 0;
- var argsTag = "[object Arguments]";
- var funcTag = "[object Function]";
- var genTag = "[object GeneratorFunction]";
- var stringTag = "[object String]";
- var symbolTag = "[object Symbol]";
- var reTrim = /^\s+|\s+$/g;
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
- var reIsBinary = /^0b[01]+$/i;
- var reIsOctal = /^0o[0-7]+$/i;
- var reIsUint = /^(?:0|[1-9]\d*)$/;
- var freeParseInt = parseInt;
- function arrayMap(array, iteratee) {
- var index2 = -1, length = array ? array.length : 0, result = Array(length);
- while (++index2 < length) {
- result[index2] = iteratee(array[index2], index2, array);
- }
- return result;
- }
- function baseFindIndex(array, predicate, fromIndex, fromRight) {
- var length = array.length, index2 = fromIndex + (fromRight ? 1 : -1);
- while (fromRight ? index2-- : ++index2 < length) {
- if (predicate(array[index2], index2, array)) {
- return index2;
- }
- }
- return -1;
- }
- function baseIndexOf(array, value, fromIndex) {
- if (value !== value) {
- return baseFindIndex(array, baseIsNaN, fromIndex);
- }
- var index2 = fromIndex - 1, length = array.length;
- while (++index2 < length) {
- if (array[index2] === value) {
- return index2;
- }
- }
- return -1;
- }
- function baseIsNaN(value) {
- return value !== value;
- }
- function baseTimes(n, iteratee) {
- var index2 = -1, result = Array(n);
- while (++index2 < n) {
- result[index2] = iteratee(index2);
- }
- return result;
- }
- function baseValues(object, props) {
- return arrayMap(props, function(key) {
- return object[key];
- });
- }
- function overArg(func, transform) {
- return function(arg) {
- return func(transform(arg));
- };
- }
- var objectProto = Object.prototype;
- var hasOwnProperty = objectProto.hasOwnProperty;
- var objectToString = objectProto.toString;
- var propertyIsEnumerable = objectProto.propertyIsEnumerable;
- var nativeKeys = overArg(Object.keys, Object);
- var nativeMax = Math.max;
- function arrayLikeKeys(value, inherited) {
- var result = isArray(value) || isArguments(value) ? baseTimes(value.length, String) : [];
- var length = result.length, skipIndexes = !!length;
- for (var key in value) {
- if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && (key == "length" || isIndex(key, length)))) {
- result.push(key);
- }
- }
- return result;
- }
- function baseKeys(object) {
- if (!isPrototype(object)) {
- return nativeKeys(object);
- }
- var result = [];
- for (var key in Object(object)) {
- if (hasOwnProperty.call(object, key) && key != "constructor") {
- result.push(key);
- }
- }
- return result;
- }
- function isIndex(value, length) {
- length = length == null ? MAX_SAFE_INTEGER : length;
- return !!length && (typeof value == "number" || reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
- }
- function isPrototype(value) {
- var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto;
- return value === proto;
- }
- function includes(collection, value, fromIndex, guard) {
- collection = isArrayLike(collection) ? collection : values(collection);
- fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0;
- var length = collection.length;
- if (fromIndex < 0) {
- fromIndex = nativeMax(length + fromIndex, 0);
- }
- return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;
- }
- function isArguments(value) {
- return isArrayLikeObject(value) && hasOwnProperty.call(value, "callee") && (!propertyIsEnumerable.call(value, "callee") || objectToString.call(value) == argsTag);
- }
- var isArray = Array.isArray;
- function isArrayLike(value) {
- return value != null && isLength(value.length) && !isFunction(value);
- }
- function isArrayLikeObject(value) {
- return isObjectLike(value) && isArrayLike(value);
- }
- function isFunction(value) {
- var tag = isObject(value) ? objectToString.call(value) : "";
- return tag == funcTag || tag == genTag;
- }
- function isLength(value) {
- return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
- }
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == "object" || type == "function");
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isString(value) {
- return typeof value == "string" || !isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag;
- }
- function isSymbol(value) {
- return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
- }
- function toFinite(value) {
- if (!value) {
- return value === 0 ? value : 0;
- }
- value = toNumber(value);
- if (value === INFINITY || value === -INFINITY) {
- var sign = value < 0 ? -1 : 1;
- return sign * MAX_INTEGER;
- }
- return value === value ? value : 0;
- }
- function toInteger(value) {
- var result = toFinite(value), remainder = result % 1;
- return result === result ? remainder ? result - remainder : result : 0;
- }
- function toNumber(value) {
- if (typeof value == "number") {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == "function" ? value.valueOf() : value;
- value = isObject(other) ? other + "" : other;
- }
- if (typeof value != "string") {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, "");
- var isBinary = reIsBinary.test(value);
- return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
- }
- function keys(object) {
- return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
- }
- function values(object) {
- return object ? baseValues(object, keys(object)) : [];
- }
- module.exports = includes;
-});
-
-// ../eve/node_modules/lodash.isboolean/index.js
-var require_lodash2 = __commonJS((exports, module) => {
- var boolTag = "[object Boolean]";
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function isBoolean(value) {
- return value === true || value === false || isObjectLike(value) && objectToString.call(value) == boolTag;
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- module.exports = isBoolean;
-});
-
-// ../eve/node_modules/lodash.isinteger/index.js
-var require_lodash3 = __commonJS((exports, module) => {
- var INFINITY = 1 / 0;
- var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
- var NAN = 0 / 0;
- var symbolTag = "[object Symbol]";
- var reTrim = /^\s+|\s+$/g;
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
- var reIsBinary = /^0b[01]+$/i;
- var reIsOctal = /^0o[0-7]+$/i;
- var freeParseInt = parseInt;
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function isInteger(value) {
- return typeof value == "number" && value == toInteger(value);
- }
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == "object" || type == "function");
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isSymbol(value) {
- return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
- }
- function toFinite(value) {
- if (!value) {
- return value === 0 ? value : 0;
- }
- value = toNumber(value);
- if (value === INFINITY || value === -INFINITY) {
- var sign = value < 0 ? -1 : 1;
- return sign * MAX_INTEGER;
- }
- return value === value ? value : 0;
- }
- function toInteger(value) {
- var result = toFinite(value), remainder = result % 1;
- return result === result ? remainder ? result - remainder : result : 0;
- }
- function toNumber(value) {
- if (typeof value == "number") {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == "function" ? value.valueOf() : value;
- value = isObject(other) ? other + "" : other;
- }
- if (typeof value != "string") {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, "");
- var isBinary = reIsBinary.test(value);
- return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
- }
- module.exports = isInteger;
-});
-
-// ../eve/node_modules/lodash.isnumber/index.js
-var require_lodash4 = __commonJS((exports, module) => {
- var numberTag = "[object Number]";
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isNumber(value) {
- return typeof value == "number" || isObjectLike(value) && objectToString.call(value) == numberTag;
- }
- module.exports = isNumber;
-});
-
-// ../eve/node_modules/lodash.isplainobject/index.js
-var require_lodash5 = __commonJS((exports, module) => {
- var objectTag = "[object Object]";
- function isHostObject(value) {
- var result = false;
- if (value != null && typeof value.toString != "function") {
- try {
- result = !!(value + "");
- } catch (e) {}
- }
- return result;
- }
- function overArg(func, transform) {
- return function(arg) {
- return func(transform(arg));
- };
- }
- var funcProto = Function.prototype;
- var objectProto = Object.prototype;
- var funcToString = funcProto.toString;
- var hasOwnProperty = objectProto.hasOwnProperty;
- var objectCtorString = funcToString.call(Object);
- var objectToString = objectProto.toString;
- var getPrototype = overArg(Object.getPrototypeOf, Object);
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isPlainObject(value) {
- if (!isObjectLike(value) || objectToString.call(value) != objectTag || isHostObject(value)) {
- return false;
- }
- var proto = getPrototype(value);
- if (proto === null) {
- return true;
- }
- var Ctor = hasOwnProperty.call(proto, "constructor") && proto.constructor;
- return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
- }
- module.exports = isPlainObject;
-});
-
-// ../eve/node_modules/lodash.isstring/index.js
-var require_lodash6 = __commonJS((exports, module) => {
- var stringTag = "[object String]";
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- var isArray = Array.isArray;
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isString(value) {
- return typeof value == "string" || !isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag;
- }
- module.exports = isString;
-});
-
-// ../eve/node_modules/lodash.once/index.js
-var require_lodash7 = __commonJS((exports, module) => {
- var FUNC_ERROR_TEXT = "Expected a function";
- var INFINITY = 1 / 0;
- var MAX_INTEGER = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
- var NAN = 0 / 0;
- var symbolTag = "[object Symbol]";
- var reTrim = /^\s+|\s+$/g;
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
- var reIsBinary = /^0b[01]+$/i;
- var reIsOctal = /^0o[0-7]+$/i;
- var freeParseInt = parseInt;
- var objectProto = Object.prototype;
- var objectToString = objectProto.toString;
- function before(n, func) {
- var result;
- if (typeof func != "function") {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- n = toInteger(n);
- return function() {
- if (--n > 0) {
- result = func.apply(this, arguments);
- }
- if (n <= 1) {
- func = undefined;
- }
- return result;
- };
- }
- function once(func) {
- return before(2, func);
- }
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == "object" || type == "function");
- }
- function isObjectLike(value) {
- return !!value && typeof value == "object";
- }
- function isSymbol(value) {
- return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag;
- }
- function toFinite(value) {
- if (!value) {
- return value === 0 ? value : 0;
- }
- value = toNumber(value);
- if (value === INFINITY || value === -INFINITY) {
- var sign = value < 0 ? -1 : 1;
- return sign * MAX_INTEGER;
- }
- return value === value ? value : 0;
- }
- function toInteger(value) {
- var result = toFinite(value), remainder = result % 1;
- return result === result ? remainder ? result - remainder : result : 0;
- }
- function toNumber(value) {
- if (typeof value == "number") {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == "function" ? value.valueOf() : value;
- value = isObject(other) ? other + "" : other;
- }
- if (typeof value != "string") {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, "");
- var isBinary = reIsBinary.test(value);
- return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
- }
- module.exports = once;
-});
-
-// ../eve/node_modules/jsonwebtoken/sign.js
-var require_sign = __commonJS((exports, module) => {
- var timespan = require_timespan();
- var PS_SUPPORTED = require_psSupported();
- var validateAsymmetricKey = require_validateAsymmetricKey();
- var jws = require_jws();
- var includes = require_lodash();
- var isBoolean = require_lodash2();
- var isInteger = require_lodash3();
- var isNumber = require_lodash4();
- var isPlainObject = require_lodash5();
- var isString = require_lodash6();
- var once = require_lodash7();
- var { KeyObject, createSecretKey, createPrivateKey } = __require("crypto");
- var SUPPORTED_ALGS = ["RS256", "RS384", "RS512", "ES256", "ES384", "ES512", "HS256", "HS384", "HS512", "none"];
- if (PS_SUPPORTED) {
- SUPPORTED_ALGS.splice(3, 0, "PS256", "PS384", "PS512");
- }
- var sign_options_schema = {
- expiresIn: { isValid: function(value) {
- return isInteger(value) || isString(value) && value;
- }, message: '"expiresIn" should be a number of seconds or string representing a timespan' },
- notBefore: { isValid: function(value) {
- return isInteger(value) || isString(value) && value;
- }, message: '"notBefore" should be a number of seconds or string representing a timespan' },
- audience: { isValid: function(value) {
- return isString(value) || Array.isArray(value);
- }, message: '"audience" must be a string or array' },
- algorithm: { isValid: includes.bind(null, SUPPORTED_ALGS), message: '"algorithm" must be a valid string enum value' },
- header: { isValid: isPlainObject, message: '"header" must be an object' },
- encoding: { isValid: isString, message: '"encoding" must be a string' },
- issuer: { isValid: isString, message: '"issuer" must be a string' },
- subject: { isValid: isString, message: '"subject" must be a string' },
- jwtid: { isValid: isString, message: '"jwtid" must be a string' },
- noTimestamp: { isValid: isBoolean, message: '"noTimestamp" must be a boolean' },
- keyid: { isValid: isString, message: '"keyid" must be a string' },
- mutatePayload: { isValid: isBoolean, message: '"mutatePayload" must be a boolean' },
- allowInsecureKeySizes: { isValid: isBoolean, message: '"allowInsecureKeySizes" must be a boolean' },
- allowInvalidAsymmetricKeyTypes: { isValid: isBoolean, message: '"allowInvalidAsymmetricKeyTypes" must be a boolean' }
- };
- var registered_claims_schema = {
- iat: { isValid: isNumber, message: '"iat" should be a number of seconds' },
- exp: { isValid: isNumber, message: '"exp" should be a number of seconds' },
- nbf: { isValid: isNumber, message: '"nbf" should be a number of seconds' }
- };
- function validate(schema, allowUnknown, object, parameterName) {
- if (!isPlainObject(object)) {
- throw new Error('Expected "' + parameterName + '" to be a plain object.');
- }
- Object.keys(object).forEach(function(key) {
- const validator = schema[key];
- if (!validator) {
- if (!allowUnknown) {
- throw new Error('"' + key + '" is not allowed in "' + parameterName + '"');
- }
- return;
- }
- if (!validator.isValid(object[key])) {
- throw new Error(validator.message);
- }
- });
- }
- function validateOptions(options2) {
- return validate(sign_options_schema, false, options2, "options");
- }
- function validatePayload(payload) {
- return validate(registered_claims_schema, true, payload, "payload");
- }
- var options_to_payload = {
- audience: "aud",
- issuer: "iss",
- subject: "sub",
- jwtid: "jti"
- };
- var options_for_objects = [
- "expiresIn",
- "notBefore",
- "noTimestamp",
- "audience",
- "issuer",
- "subject",
- "jwtid"
- ];
- module.exports = function(payload, secretOrPrivateKey, options2, callback) {
- if (typeof options2 === "function") {
- callback = options2;
- options2 = {};
- } else {
- options2 = options2 || {};
- }
- const isObjectPayload = typeof payload === "object" && !Buffer.isBuffer(payload);
- const header = Object.assign({
- alg: options2.algorithm || "HS256",
- typ: isObjectPayload ? "JWT" : undefined,
- kid: options2.keyid
- }, options2.header);
- function failure(err) {
- if (callback) {
- return callback(err);
- }
- throw err;
- }
- if (!secretOrPrivateKey && options2.algorithm !== "none") {
- return failure(new Error("secretOrPrivateKey must have a value"));
- }
- if (secretOrPrivateKey != null && !(secretOrPrivateKey instanceof KeyObject)) {
- try {
- secretOrPrivateKey = createPrivateKey(secretOrPrivateKey);
- } catch (_) {
- try {
- secretOrPrivateKey = createSecretKey(typeof secretOrPrivateKey === "string" ? Buffer.from(secretOrPrivateKey) : secretOrPrivateKey);
- } catch (_2) {
- return failure(new Error("secretOrPrivateKey is not valid key material"));
- }
- }
- }
- if (header.alg.startsWith("HS") && secretOrPrivateKey.type !== "secret") {
- return failure(new Error(`secretOrPrivateKey must be a symmetric key when using ${header.alg}`));
- } else if (/^(?:RS|PS|ES)/.test(header.alg)) {
- if (secretOrPrivateKey.type !== "private") {
- return failure(new Error(`secretOrPrivateKey must be an asymmetric key when using ${header.alg}`));
- }
- if (!options2.allowInsecureKeySizes && !header.alg.startsWith("ES") && secretOrPrivateKey.asymmetricKeyDetails !== undefined && secretOrPrivateKey.asymmetricKeyDetails.modulusLength < 2048) {
- return failure(new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`));
- }
- }
- if (typeof payload === "undefined") {
- return failure(new Error("payload is required"));
- } else if (isObjectPayload) {
- try {
- validatePayload(payload);
- } catch (error) {
- return failure(error);
- }
- if (!options2.mutatePayload) {
- payload = Object.assign({}, payload);
- }
- } else {
- const invalid_options = options_for_objects.filter(function(opt) {
- return typeof options2[opt] !== "undefined";
- });
- if (invalid_options.length > 0) {
- return failure(new Error("invalid " + invalid_options.join(",") + " option for " + typeof payload + " payload"));
- }
- }
- if (typeof payload.exp !== "undefined" && typeof options2.expiresIn !== "undefined") {
- return failure(new Error('Bad "options.expiresIn" option the payload already has an "exp" property.'));
- }
- if (typeof payload.nbf !== "undefined" && typeof options2.notBefore !== "undefined") {
- return failure(new Error('Bad "options.notBefore" option the payload already has an "nbf" property.'));
- }
- try {
- validateOptions(options2);
- } catch (error) {
- return failure(error);
- }
- if (!options2.allowInvalidAsymmetricKeyTypes) {
- try {
- validateAsymmetricKey(header.alg, secretOrPrivateKey);
- } catch (error) {
- return failure(error);
- }
- }
- const timestamp = payload.iat || Math.floor(Date.now() / 1000);
- if (options2.noTimestamp) {
- delete payload.iat;
- } else if (isObjectPayload) {
- payload.iat = timestamp;
- }
- if (typeof options2.notBefore !== "undefined") {
- try {
- payload.nbf = timespan(options2.notBefore, timestamp);
- } catch (err) {
- return failure(err);
- }
- if (typeof payload.nbf === "undefined") {
- return failure(new Error('"notBefore" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
- }
- }
- if (typeof options2.expiresIn !== "undefined" && typeof payload === "object") {
- try {
- payload.exp = timespan(options2.expiresIn, timestamp);
- } catch (err) {
- return failure(err);
- }
- if (typeof payload.exp === "undefined") {
- return failure(new Error('"expiresIn" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
- }
- }
- Object.keys(options_to_payload).forEach(function(key) {
- const claim = options_to_payload[key];
- if (typeof options2[key] !== "undefined") {
- if (typeof payload[claim] !== "undefined") {
- return failure(new Error('Bad "options.' + key + '" option. The payload already has an "' + claim + '" property.'));
- }
- payload[claim] = options2[key];
- }
- });
- const encoding = options2.encoding || "utf8";
- if (typeof callback === "function") {
- callback = callback && once(callback);
- jws.createSign({
- header,
- privateKey: secretOrPrivateKey,
- payload,
- encoding
- }).once("error", callback).once("done", function(signature) {
- if (!options2.allowInsecureKeySizes && /^(?:RS|PS)/.test(header.alg) && signature.length < 256) {
- return callback(new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`));
- }
- callback(null, signature);
- });
- } else {
- let signature = jws.sign({ header, payload, secret: secretOrPrivateKey, encoding });
- if (!options2.allowInsecureKeySizes && /^(?:RS|PS)/.test(header.alg) && signature.length < 256) {
- throw new Error(`secretOrPrivateKey has a minimum key size of 2048 bits for ${header.alg}`);
- }
- return signature;
- }
- };
-});
-
-// ../eve/node_modules/jsonwebtoken/index.js
-var require_jsonwebtoken = __commonJS((exports, module) => {
- module.exports = {
- decode: require_decode(),
- verify: require_verify(),
- sign: require_sign(),
- JsonWebTokenError: require_JsonWebTokenError(),
- NotBeforeError: require_NotBeforeError(),
- TokenExpiredError: require_TokenExpiredError()
- };
-});
-
-// ../eve/node_modules/bn.js/lib/bn.js
-var require_bn = __commonJS((exports, module) => {
- (function(module2, exports2) {
- function assert(val, msg) {
- if (!val)
- throw new Error(msg || "Assertion failed");
- }
- function inherits(ctor, superCtor) {
- ctor.super_ = superCtor;
- var TempCtor = function() {};
- TempCtor.prototype = superCtor.prototype;
- ctor.prototype = new TempCtor;
- ctor.prototype.constructor = ctor;
- }
- function BN(number, base, endian) {
- if (BN.isBN(number)) {
- return number;
- }
- this.negative = 0;
- this.words = null;
- this.length = 0;
- this.red = null;
- if (number !== null) {
- if (base === "le" || base === "be") {
- endian = base;
- base = 10;
- }
- this._init(number || 0, base || 10, endian || "be");
- }
- }
- if (typeof module2 === "object") {
- module2.exports = BN;
- } else {
- exports2.BN = BN;
- }
- BN.BN = BN;
- BN.wordSize = 26;
- var Buffer2;
- try {
- if (typeof window !== "undefined" && typeof window.Buffer !== "undefined") {
- Buffer2 = window.Buffer;
- } else {
- Buffer2 = __require("buffer").Buffer;
- }
- } catch (e) {}
- BN.isBN = function isBN(num) {
- if (num instanceof BN) {
- return true;
- }
- return num !== null && typeof num === "object" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);
- };
- BN.max = function max(left, right) {
- if (left.cmp(right) > 0)
- return left;
- return right;
- };
- BN.min = function min(left, right) {
- if (left.cmp(right) < 0)
- return left;
- return right;
- };
- BN.prototype._init = function init(number, base, endian) {
- if (typeof number === "number") {
- return this._initNumber(number, base, endian);
- }
- if (typeof number === "object") {
- return this._initArray(number, base, endian);
- }
- if (base === "hex") {
- base = 16;
- }
- assert(base === (base | 0) && base >= 2 && base <= 36);
- number = number.toString().replace(/\s+/g, "");
- var start = 0;
- if (number[0] === "-") {
- start++;
- this.negative = 1;
- }
- if (start < number.length) {
- if (base === 16) {
- this._parseHex(number, start, endian);
- } else {
- this._parseBase(number, base, start);
- if (endian === "le") {
- this._initArray(this.toArray(), base, endian);
- }
- }
- }
- };
- BN.prototype._initNumber = function _initNumber(number, base, endian) {
- if (number < 0) {
- this.negative = 1;
- number = -number;
- }
- if (number < 67108864) {
- this.words = [number & 67108863];
- this.length = 1;
- } else if (number < 4503599627370496) {
- this.words = [
- number & 67108863,
- number / 67108864 & 67108863
- ];
- this.length = 2;
- } else {
- assert(number < 9007199254740992);
- this.words = [
- number & 67108863,
- number / 67108864 & 67108863,
- 1
- ];
- this.length = 3;
- }
- if (endian !== "le")
- return;
- this._initArray(this.toArray(), base, endian);
- };
- BN.prototype._initArray = function _initArray(number, base, endian) {
- assert(typeof number.length === "number");
- if (number.length <= 0) {
- this.words = [0];
- this.length = 1;
- return this;
- }
- this.length = Math.ceil(number.length / 3);
- this.words = new Array(this.length);
- for (var i = 0;i < this.length; i++) {
- this.words[i] = 0;
- }
- var j, w;
- var off = 0;
- if (endian === "be") {
- for (i = number.length - 1, j = 0;i >= 0; i -= 3) {
- w = number[i] | number[i - 1] << 8 | number[i - 2] << 16;
- this.words[j] |= w << off & 67108863;
- this.words[j + 1] = w >>> 26 - off & 67108863;
- off += 24;
- if (off >= 26) {
- off -= 26;
- j++;
- }
- }
- } else if (endian === "le") {
- for (i = 0, j = 0;i < number.length; i += 3) {
- w = number[i] | number[i + 1] << 8 | number[i + 2] << 16;
- this.words[j] |= w << off & 67108863;
- this.words[j + 1] = w >>> 26 - off & 67108863;
- off += 24;
- if (off >= 26) {
- off -= 26;
- j++;
- }
- }
- }
- return this.strip();
- };
- function parseHex4Bits(string, index2) {
- var c = string.charCodeAt(index2);
- if (c >= 65 && c <= 70) {
- return c - 55;
- } else if (c >= 97 && c <= 102) {
- return c - 87;
- } else {
- return c - 48 & 15;
- }
- }
- function parseHexByte(string, lowerBound, index2) {
- var r = parseHex4Bits(string, index2);
- if (index2 - 1 >= lowerBound) {
- r |= parseHex4Bits(string, index2 - 1) << 4;
- }
- return r;
- }
- BN.prototype._parseHex = function _parseHex(number, start, endian) {
- this.length = Math.ceil((number.length - start) / 6);
- this.words = new Array(this.length);
- for (var i = 0;i < this.length; i++) {
- this.words[i] = 0;
- }
- var off = 0;
- var j = 0;
- var w;
- if (endian === "be") {
- for (i = number.length - 1;i >= start; i -= 2) {
- w = parseHexByte(number, start, i) << off;
- this.words[j] |= w & 67108863;
- if (off >= 18) {
- off -= 18;
- j += 1;
- this.words[j] |= w >>> 26;
- } else {
- off += 8;
- }
- }
- } else {
- var parseLength = number.length - start;
- for (i = parseLength % 2 === 0 ? start + 1 : start;i < number.length; i += 2) {
- w = parseHexByte(number, start, i) << off;
- this.words[j] |= w & 67108863;
- if (off >= 18) {
- off -= 18;
- j += 1;
- this.words[j] |= w >>> 26;
- } else {
- off += 8;
- }
- }
- }
- this.strip();
- };
- function parseBase(str, start, end, mul) {
- var r = 0;
- var len = Math.min(str.length, end);
- for (var i = start;i < len; i++) {
- var c = str.charCodeAt(i) - 48;
- r *= mul;
- if (c >= 49) {
- r += c - 49 + 10;
- } else if (c >= 17) {
- r += c - 17 + 10;
- } else {
- r += c;
- }
- }
- return r;
- }
- BN.prototype._parseBase = function _parseBase(number, base, start) {
- this.words = [0];
- this.length = 1;
- for (var limbLen = 0, limbPow = 1;limbPow <= 67108863; limbPow *= base) {
- limbLen++;
- }
- limbLen--;
- limbPow = limbPow / base | 0;
- var total = number.length - start;
- var mod = total % limbLen;
- var end = Math.min(total, total - mod) + start;
- var word = 0;
- for (var i = start;i < end; i += limbLen) {
- word = parseBase(number, i, i + limbLen, base);
- this.imuln(limbPow);
- if (this.words[0] + word < 67108864) {
- this.words[0] += word;
- } else {
- this._iaddn(word);
- }
- }
- if (mod !== 0) {
- var pow = 1;
- word = parseBase(number, i, number.length, base);
- for (i = 0;i < mod; i++) {
- pow *= base;
- }
- this.imuln(pow);
- if (this.words[0] + word < 67108864) {
- this.words[0] += word;
- } else {
- this._iaddn(word);
- }
- }
- this.strip();
- };
- BN.prototype.copy = function copy(dest) {
- dest.words = new Array(this.length);
- for (var i = 0;i < this.length; i++) {
- dest.words[i] = this.words[i];
- }
- dest.length = this.length;
- dest.negative = this.negative;
- dest.red = this.red;
- };
- BN.prototype.clone = function clone() {
- var r = new BN(null);
- this.copy(r);
- return r;
- };
- BN.prototype._expand = function _expand(size) {
- while (this.length < size) {
- this.words[this.length++] = 0;
- }
- return this;
- };
- BN.prototype.strip = function strip() {
- while (this.length > 1 && this.words[this.length - 1] === 0) {
- this.length--;
- }
- return this._normSign();
- };
- BN.prototype._normSign = function _normSign() {
- if (this.length === 1 && this.words[0] === 0) {
- this.negative = 0;
- }
- return this;
- };
- BN.prototype.inspect = function inspect() {
- return (this.red ? "";
- };
- var zeros = [
- "",
- "0",
- "00",
- "000",
- "0000",
- "00000",
- "000000",
- "0000000",
- "00000000",
- "000000000",
- "0000000000",
- "00000000000",
- "000000000000",
- "0000000000000",
- "00000000000000",
- "000000000000000",
- "0000000000000000",
- "00000000000000000",
- "000000000000000000",
- "0000000000000000000",
- "00000000000000000000",
- "000000000000000000000",
- "0000000000000000000000",
- "00000000000000000000000",
- "000000000000000000000000",
- "0000000000000000000000000"
- ];
- var groupSizes = [
- 0,
- 0,
- 25,
- 16,
- 12,
- 11,
- 10,
- 9,
- 8,
- 8,
- 7,
- 7,
- 7,
- 7,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 6,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5,
- 5
- ];
- var groupBases = [
- 0,
- 0,
- 33554432,
- 43046721,
- 16777216,
- 48828125,
- 60466176,
- 40353607,
- 16777216,
- 43046721,
- 1e7,
- 19487171,
- 35831808,
- 62748517,
- 7529536,
- 11390625,
- 16777216,
- 24137569,
- 34012224,
- 47045881,
- 64000000,
- 4084101,
- 5153632,
- 6436343,
- 7962624,
- 9765625,
- 11881376,
- 14348907,
- 17210368,
- 20511149,
- 24300000,
- 28629151,
- 33554432,
- 39135393,
- 45435424,
- 52521875,
- 60466176
- ];
- BN.prototype.toString = function toString(base, padding) {
- base = base || 10;
- padding = padding | 0 || 1;
- var out;
- if (base === 16 || base === "hex") {
- out = "";
- var off = 0;
- var carry = 0;
- for (var i = 0;i < this.length; i++) {
- var w = this.words[i];
- var word = ((w << off | carry) & 16777215).toString(16);
- carry = w >>> 24 - off & 16777215;
- off += 2;
- if (off >= 26) {
- off -= 26;
- i--;
- }
- if (carry !== 0 || i !== this.length - 1) {
- out = zeros[6 - word.length] + word + out;
- } else {
- out = word + out;
- }
- }
- if (carry !== 0) {
- out = carry.toString(16) + out;
- }
- while (out.length % padding !== 0) {
- out = "0" + out;
- }
- if (this.negative !== 0) {
- out = "-" + out;
- }
- return out;
- }
- if (base === (base | 0) && base >= 2 && base <= 36) {
- var groupSize = groupSizes[base];
- var groupBase = groupBases[base];
- out = "";
- var c = this.clone();
- c.negative = 0;
- while (!c.isZero()) {
- var r = c.modn(groupBase).toString(base);
- c = c.idivn(groupBase);
- if (!c.isZero()) {
- out = zeros[groupSize - r.length] + r + out;
- } else {
- out = r + out;
- }
- }
- if (this.isZero()) {
- out = "0" + out;
- }
- while (out.length % padding !== 0) {
- out = "0" + out;
- }
- if (this.negative !== 0) {
- out = "-" + out;
- }
- return out;
- }
- assert(false, "Base should be between 2 and 36");
- };
- BN.prototype.toNumber = function toNumber() {
- var ret = this.words[0];
- if (this.length === 2) {
- ret += this.words[1] * 67108864;
- } else if (this.length === 3 && this.words[2] === 1) {
- ret += 4503599627370496 + this.words[1] * 67108864;
- } else if (this.length > 2) {
- assert(false, "Number can only safely store up to 53 bits");
- }
- return this.negative !== 0 ? -ret : ret;
- };
- BN.prototype.toJSON = function toJSON() {
- return this.toString(16);
- };
- BN.prototype.toBuffer = function toBuffer(endian, length) {
- assert(typeof Buffer2 !== "undefined");
- return this.toArrayLike(Buffer2, endian, length);
- };
- BN.prototype.toArray = function toArray(endian, length) {
- return this.toArrayLike(Array, endian, length);
- };
- BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) {
- var byteLength = this.byteLength();
- var reqLength = length || Math.max(1, byteLength);
- assert(byteLength <= reqLength, "byte array longer than desired length");
- assert(reqLength > 0, "Requested array length <= 0");
- this.strip();
- var littleEndian = endian === "le";
- var res = new ArrayType(reqLength);
- var b, i;
- var q = this.clone();
- if (!littleEndian) {
- for (i = 0;i < reqLength - byteLength; i++) {
- res[i] = 0;
- }
- for (i = 0;!q.isZero(); i++) {
- b = q.andln(255);
- q.iushrn(8);
- res[reqLength - i - 1] = b;
- }
- } else {
- for (i = 0;!q.isZero(); i++) {
- b = q.andln(255);
- q.iushrn(8);
- res[i] = b;
- }
- for (;i < reqLength; i++) {
- res[i] = 0;
- }
- }
- return res;
- };
- if (Math.clz32) {
- BN.prototype._countBits = function _countBits(w) {
- return 32 - Math.clz32(w);
- };
- } else {
- BN.prototype._countBits = function _countBits(w) {
- var t = w;
- var r = 0;
- if (t >= 4096) {
- r += 13;
- t >>>= 13;
- }
- if (t >= 64) {
- r += 7;
- t >>>= 7;
- }
- if (t >= 8) {
- r += 4;
- t >>>= 4;
- }
- if (t >= 2) {
- r += 2;
- t >>>= 2;
- }
- return r + t;
- };
- }
- BN.prototype._zeroBits = function _zeroBits(w) {
- if (w === 0)
- return 26;
- var t = w;
- var r = 0;
- if ((t & 8191) === 0) {
- r += 13;
- t >>>= 13;
- }
- if ((t & 127) === 0) {
- r += 7;
- t >>>= 7;
- }
- if ((t & 15) === 0) {
- r += 4;
- t >>>= 4;
- }
- if ((t & 3) === 0) {
- r += 2;
- t >>>= 2;
- }
- if ((t & 1) === 0) {
- r++;
- }
- return r;
- };
- BN.prototype.bitLength = function bitLength() {
- var w = this.words[this.length - 1];
- var hi = this._countBits(w);
- return (this.length - 1) * 26 + hi;
- };
- function toBitArray(num) {
- var w = new Array(num.bitLength());
- for (var bit = 0;bit < w.length; bit++) {
- var off = bit / 26 | 0;
- var wbit = bit % 26;
- w[bit] = (num.words[off] & 1 << wbit) >>> wbit;
- }
- return w;
- }
- BN.prototype.zeroBits = function zeroBits() {
- if (this.isZero())
- return 0;
- var r = 0;
- for (var i = 0;i < this.length; i++) {
- var b = this._zeroBits(this.words[i]);
- r += b;
- if (b !== 26)
- break;
- }
- return r;
- };
- BN.prototype.byteLength = function byteLength() {
- return Math.ceil(this.bitLength() / 8);
- };
- BN.prototype.toTwos = function toTwos(width) {
- if (this.negative !== 0) {
- return this.abs().inotn(width).iaddn(1);
- }
- return this.clone();
- };
- BN.prototype.fromTwos = function fromTwos(width) {
- if (this.testn(width - 1)) {
- return this.notn(width).iaddn(1).ineg();
- }
- return this.clone();
- };
- BN.prototype.isNeg = function isNeg() {
- return this.negative !== 0;
- };
- BN.prototype.neg = function neg() {
- return this.clone().ineg();
- };
- BN.prototype.ineg = function ineg() {
- if (!this.isZero()) {
- this.negative ^= 1;
- }
- return this;
- };
- BN.prototype.iuor = function iuor(num) {
- while (this.length < num.length) {
- this.words[this.length++] = 0;
- }
- for (var i = 0;i < num.length; i++) {
- this.words[i] = this.words[i] | num.words[i];
- }
- return this.strip();
- };
- BN.prototype.ior = function ior(num) {
- assert((this.negative | num.negative) === 0);
- return this.iuor(num);
- };
- BN.prototype.or = function or(num) {
- if (this.length > num.length)
- return this.clone().ior(num);
- return num.clone().ior(this);
- };
- BN.prototype.uor = function uor(num) {
- if (this.length > num.length)
- return this.clone().iuor(num);
- return num.clone().iuor(this);
- };
- BN.prototype.iuand = function iuand(num) {
- var b;
- if (this.length > num.length) {
- b = num;
- } else {
- b = this;
- }
- for (var i = 0;i < b.length; i++) {
- this.words[i] = this.words[i] & num.words[i];
- }
- this.length = b.length;
- return this.strip();
- };
- BN.prototype.iand = function iand(num) {
- assert((this.negative | num.negative) === 0);
- return this.iuand(num);
- };
- BN.prototype.and = function and(num) {
- if (this.length > num.length)
- return this.clone().iand(num);
- return num.clone().iand(this);
- };
- BN.prototype.uand = function uand(num) {
- if (this.length > num.length)
- return this.clone().iuand(num);
- return num.clone().iuand(this);
- };
- BN.prototype.iuxor = function iuxor(num) {
- var a;
- var b;
- if (this.length > num.length) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
- for (var i = 0;i < b.length; i++) {
- this.words[i] = a.words[i] ^ b.words[i];
- }
- if (this !== a) {
- for (;i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
- this.length = a.length;
- return this.strip();
- };
- BN.prototype.ixor = function ixor(num) {
- assert((this.negative | num.negative) === 0);
- return this.iuxor(num);
- };
- BN.prototype.xor = function xor(num) {
- if (this.length > num.length)
- return this.clone().ixor(num);
- return num.clone().ixor(this);
- };
- BN.prototype.uxor = function uxor(num) {
- if (this.length > num.length)
- return this.clone().iuxor(num);
- return num.clone().iuxor(this);
- };
- BN.prototype.inotn = function inotn(width) {
- assert(typeof width === "number" && width >= 0);
- var bytesNeeded = Math.ceil(width / 26) | 0;
- var bitsLeft = width % 26;
- this._expand(bytesNeeded);
- if (bitsLeft > 0) {
- bytesNeeded--;
- }
- for (var i = 0;i < bytesNeeded; i++) {
- this.words[i] = ~this.words[i] & 67108863;
- }
- if (bitsLeft > 0) {
- this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft;
- }
- return this.strip();
- };
- BN.prototype.notn = function notn(width) {
- return this.clone().inotn(width);
- };
- BN.prototype.setn = function setn(bit, val) {
- assert(typeof bit === "number" && bit >= 0);
- var off = bit / 26 | 0;
- var wbit = bit % 26;
- this._expand(off + 1);
- if (val) {
- this.words[off] = this.words[off] | 1 << wbit;
- } else {
- this.words[off] = this.words[off] & ~(1 << wbit);
- }
- return this.strip();
- };
- BN.prototype.iadd = function iadd(num) {
- var r;
- if (this.negative !== 0 && num.negative === 0) {
- this.negative = 0;
- r = this.isub(num);
- this.negative ^= 1;
- return this._normSign();
- } else if (this.negative === 0 && num.negative !== 0) {
- num.negative = 0;
- r = this.isub(num);
- num.negative = 1;
- return r._normSign();
- }
- var a, b;
- if (this.length > num.length) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
- var carry = 0;
- for (var i = 0;i < b.length; i++) {
- r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
- this.words[i] = r & 67108863;
- carry = r >>> 26;
- }
- for (;carry !== 0 && i < a.length; i++) {
- r = (a.words[i] | 0) + carry;
- this.words[i] = r & 67108863;
- carry = r >>> 26;
- }
- this.length = a.length;
- if (carry !== 0) {
- this.words[this.length] = carry;
- this.length++;
- } else if (a !== this) {
- for (;i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
- return this;
- };
- BN.prototype.add = function add(num) {
- var res;
- if (num.negative !== 0 && this.negative === 0) {
- num.negative = 0;
- res = this.sub(num);
- num.negative ^= 1;
- return res;
- } else if (num.negative === 0 && this.negative !== 0) {
- this.negative = 0;
- res = num.sub(this);
- this.negative = 1;
- return res;
- }
- if (this.length > num.length)
- return this.clone().iadd(num);
- return num.clone().iadd(this);
- };
- BN.prototype.isub = function isub(num) {
- if (num.negative !== 0) {
- num.negative = 0;
- var r = this.iadd(num);
- num.negative = 1;
- return r._normSign();
- } else if (this.negative !== 0) {
- this.negative = 0;
- this.iadd(num);
- this.negative = 1;
- return this._normSign();
- }
- var cmp = this.cmp(num);
- if (cmp === 0) {
- this.negative = 0;
- this.length = 1;
- this.words[0] = 0;
- return this;
- }
- var a, b;
- if (cmp > 0) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
- var carry = 0;
- for (var i = 0;i < b.length; i++) {
- r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
- carry = r >> 26;
- this.words[i] = r & 67108863;
- }
- for (;carry !== 0 && i < a.length; i++) {
- r = (a.words[i] | 0) + carry;
- carry = r >> 26;
- this.words[i] = r & 67108863;
- }
- if (carry === 0 && i < a.length && a !== this) {
- for (;i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
- this.length = Math.max(this.length, i);
- if (a !== this) {
- this.negative = 1;
- }
- return this.strip();
- };
- BN.prototype.sub = function sub(num) {
- return this.clone().isub(num);
- };
- function smallMulTo(self2, num, out) {
- out.negative = num.negative ^ self2.negative;
- var len = self2.length + num.length | 0;
- out.length = len;
- len = len - 1 | 0;
- var a = self2.words[0] | 0;
- var b = num.words[0] | 0;
- var r = a * b;
- var lo = r & 67108863;
- var carry = r / 67108864 | 0;
- out.words[0] = lo;
- for (var k = 1;k < len; k++) {
- var ncarry = carry >>> 26;
- var rword = carry & 67108863;
- var maxJ = Math.min(k, num.length - 1);
- for (var j = Math.max(0, k - self2.length + 1);j <= maxJ; j++) {
- var i = k - j | 0;
- a = self2.words[i] | 0;
- b = num.words[j] | 0;
- r = a * b + rword;
- ncarry += r / 67108864 | 0;
- rword = r & 67108863;
- }
- out.words[k] = rword | 0;
- carry = ncarry | 0;
- }
- if (carry !== 0) {
- out.words[k] = carry | 0;
- } else {
- out.length--;
- }
- return out.strip();
- }
- var comb10MulTo = function comb10MulTo(self2, num, out) {
- var a = self2.words;
- var b = num.words;
- var o = out.words;
- var c = 0;
- var lo;
- var mid;
- var hi;
- var a0 = a[0] | 0;
- var al0 = a0 & 8191;
- var ah0 = a0 >>> 13;
- var a1 = a[1] | 0;
- var al1 = a1 & 8191;
- var ah1 = a1 >>> 13;
- var a2 = a[2] | 0;
- var al2 = a2 & 8191;
- var ah2 = a2 >>> 13;
- var a3 = a[3] | 0;
- var al3 = a3 & 8191;
- var ah3 = a3 >>> 13;
- var a4 = a[4] | 0;
- var al4 = a4 & 8191;
- var ah4 = a4 >>> 13;
- var a5 = a[5] | 0;
- var al5 = a5 & 8191;
- var ah5 = a5 >>> 13;
- var a6 = a[6] | 0;
- var al6 = a6 & 8191;
- var ah6 = a6 >>> 13;
- var a7 = a[7] | 0;
- var al7 = a7 & 8191;
- var ah7 = a7 >>> 13;
- var a8 = a[8] | 0;
- var al8 = a8 & 8191;
- var ah8 = a8 >>> 13;
- var a9 = a[9] | 0;
- var al9 = a9 & 8191;
- var ah9 = a9 >>> 13;
- var b0 = b[0] | 0;
- var bl0 = b0 & 8191;
- var bh0 = b0 >>> 13;
- var b1 = b[1] | 0;
- var bl1 = b1 & 8191;
- var bh1 = b1 >>> 13;
- var b2 = b[2] | 0;
- var bl2 = b2 & 8191;
- var bh2 = b2 >>> 13;
- var b3 = b[3] | 0;
- var bl3 = b3 & 8191;
- var bh3 = b3 >>> 13;
- var b4 = b[4] | 0;
- var bl4 = b4 & 8191;
- var bh4 = b4 >>> 13;
- var b5 = b[5] | 0;
- var bl5 = b5 & 8191;
- var bh5 = b5 >>> 13;
- var b6 = b[6] | 0;
- var bl6 = b6 & 8191;
- var bh6 = b6 >>> 13;
- var b7 = b[7] | 0;
- var bl7 = b7 & 8191;
- var bh7 = b7 >>> 13;
- var b8 = b[8] | 0;
- var bl8 = b8 & 8191;
- var bh8 = b8 >>> 13;
- var b9 = b[9] | 0;
- var bl9 = b9 & 8191;
- var bh9 = b9 >>> 13;
- out.negative = self2.negative ^ num.negative;
- out.length = 19;
- lo = Math.imul(al0, bl0);
- mid = Math.imul(al0, bh0);
- mid = mid + Math.imul(ah0, bl0) | 0;
- hi = Math.imul(ah0, bh0);
- var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0;
- w0 &= 67108863;
- lo = Math.imul(al1, bl0);
- mid = Math.imul(al1, bh0);
- mid = mid + Math.imul(ah1, bl0) | 0;
- hi = Math.imul(ah1, bh0);
- lo = lo + Math.imul(al0, bl1) | 0;
- mid = mid + Math.imul(al0, bh1) | 0;
- mid = mid + Math.imul(ah0, bl1) | 0;
- hi = hi + Math.imul(ah0, bh1) | 0;
- var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0;
- w1 &= 67108863;
- lo = Math.imul(al2, bl0);
- mid = Math.imul(al2, bh0);
- mid = mid + Math.imul(ah2, bl0) | 0;
- hi = Math.imul(ah2, bh0);
- lo = lo + Math.imul(al1, bl1) | 0;
- mid = mid + Math.imul(al1, bh1) | 0;
- mid = mid + Math.imul(ah1, bl1) | 0;
- hi = hi + Math.imul(ah1, bh1) | 0;
- lo = lo + Math.imul(al0, bl2) | 0;
- mid = mid + Math.imul(al0, bh2) | 0;
- mid = mid + Math.imul(ah0, bl2) | 0;
- hi = hi + Math.imul(ah0, bh2) | 0;
- var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0;
- w2 &= 67108863;
- lo = Math.imul(al3, bl0);
- mid = Math.imul(al3, bh0);
- mid = mid + Math.imul(ah3, bl0) | 0;
- hi = Math.imul(ah3, bh0);
- lo = lo + Math.imul(al2, bl1) | 0;
- mid = mid + Math.imul(al2, bh1) | 0;
- mid = mid + Math.imul(ah2, bl1) | 0;
- hi = hi + Math.imul(ah2, bh1) | 0;
- lo = lo + Math.imul(al1, bl2) | 0;
- mid = mid + Math.imul(al1, bh2) | 0;
- mid = mid + Math.imul(ah1, bl2) | 0;
- hi = hi + Math.imul(ah1, bh2) | 0;
- lo = lo + Math.imul(al0, bl3) | 0;
- mid = mid + Math.imul(al0, bh3) | 0;
- mid = mid + Math.imul(ah0, bl3) | 0;
- hi = hi + Math.imul(ah0, bh3) | 0;
- var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0;
- w3 &= 67108863;
- lo = Math.imul(al4, bl0);
- mid = Math.imul(al4, bh0);
- mid = mid + Math.imul(ah4, bl0) | 0;
- hi = Math.imul(ah4, bh0);
- lo = lo + Math.imul(al3, bl1) | 0;
- mid = mid + Math.imul(al3, bh1) | 0;
- mid = mid + Math.imul(ah3, bl1) | 0;
- hi = hi + Math.imul(ah3, bh1) | 0;
- lo = lo + Math.imul(al2, bl2) | 0;
- mid = mid + Math.imul(al2, bh2) | 0;
- mid = mid + Math.imul(ah2, bl2) | 0;
- hi = hi + Math.imul(ah2, bh2) | 0;
- lo = lo + Math.imul(al1, bl3) | 0;
- mid = mid + Math.imul(al1, bh3) | 0;
- mid = mid + Math.imul(ah1, bl3) | 0;
- hi = hi + Math.imul(ah1, bh3) | 0;
- lo = lo + Math.imul(al0, bl4) | 0;
- mid = mid + Math.imul(al0, bh4) | 0;
- mid = mid + Math.imul(ah0, bl4) | 0;
- hi = hi + Math.imul(ah0, bh4) | 0;
- var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0;
- w4 &= 67108863;
- lo = Math.imul(al5, bl0);
- mid = Math.imul(al5, bh0);
- mid = mid + Math.imul(ah5, bl0) | 0;
- hi = Math.imul(ah5, bh0);
- lo = lo + Math.imul(al4, bl1) | 0;
- mid = mid + Math.imul(al4, bh1) | 0;
- mid = mid + Math.imul(ah4, bl1) | 0;
- hi = hi + Math.imul(ah4, bh1) | 0;
- lo = lo + Math.imul(al3, bl2) | 0;
- mid = mid + Math.imul(al3, bh2) | 0;
- mid = mid + Math.imul(ah3, bl2) | 0;
- hi = hi + Math.imul(ah3, bh2) | 0;
- lo = lo + Math.imul(al2, bl3) | 0;
- mid = mid + Math.imul(al2, bh3) | 0;
- mid = mid + Math.imul(ah2, bl3) | 0;
- hi = hi + Math.imul(ah2, bh3) | 0;
- lo = lo + Math.imul(al1, bl4) | 0;
- mid = mid + Math.imul(al1, bh4) | 0;
- mid = mid + Math.imul(ah1, bl4) | 0;
- hi = hi + Math.imul(ah1, bh4) | 0;
- lo = lo + Math.imul(al0, bl5) | 0;
- mid = mid + Math.imul(al0, bh5) | 0;
- mid = mid + Math.imul(ah0, bl5) | 0;
- hi = hi + Math.imul(ah0, bh5) | 0;
- var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0;
- w5 &= 67108863;
- lo = Math.imul(al6, bl0);
- mid = Math.imul(al6, bh0);
- mid = mid + Math.imul(ah6, bl0) | 0;
- hi = Math.imul(ah6, bh0);
- lo = lo + Math.imul(al5, bl1) | 0;
- mid = mid + Math.imul(al5, bh1) | 0;
- mid = mid + Math.imul(ah5, bl1) | 0;
- hi = hi + Math.imul(ah5, bh1) | 0;
- lo = lo + Math.imul(al4, bl2) | 0;
- mid = mid + Math.imul(al4, bh2) | 0;
- mid = mid + Math.imul(ah4, bl2) | 0;
- hi = hi + Math.imul(ah4, bh2) | 0;
- lo = lo + Math.imul(al3, bl3) | 0;
- mid = mid + Math.imul(al3, bh3) | 0;
- mid = mid + Math.imul(ah3, bl3) | 0;
- hi = hi + Math.imul(ah3, bh3) | 0;
- lo = lo + Math.imul(al2, bl4) | 0;
- mid = mid + Math.imul(al2, bh4) | 0;
- mid = mid + Math.imul(ah2, bl4) | 0;
- hi = hi + Math.imul(ah2, bh4) | 0;
- lo = lo + Math.imul(al1, bl5) | 0;
- mid = mid + Math.imul(al1, bh5) | 0;
- mid = mid + Math.imul(ah1, bl5) | 0;
- hi = hi + Math.imul(ah1, bh5) | 0;
- lo = lo + Math.imul(al0, bl6) | 0;
- mid = mid + Math.imul(al0, bh6) | 0;
- mid = mid + Math.imul(ah0, bl6) | 0;
- hi = hi + Math.imul(ah0, bh6) | 0;
- var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0;
- w6 &= 67108863;
- lo = Math.imul(al7, bl0);
- mid = Math.imul(al7, bh0);
- mid = mid + Math.imul(ah7, bl0) | 0;
- hi = Math.imul(ah7, bh0);
- lo = lo + Math.imul(al6, bl1) | 0;
- mid = mid + Math.imul(al6, bh1) | 0;
- mid = mid + Math.imul(ah6, bl1) | 0;
- hi = hi + Math.imul(ah6, bh1) | 0;
- lo = lo + Math.imul(al5, bl2) | 0;
- mid = mid + Math.imul(al5, bh2) | 0;
- mid = mid + Math.imul(ah5, bl2) | 0;
- hi = hi + Math.imul(ah5, bh2) | 0;
- lo = lo + Math.imul(al4, bl3) | 0;
- mid = mid + Math.imul(al4, bh3) | 0;
- mid = mid + Math.imul(ah4, bl3) | 0;
- hi = hi + Math.imul(ah4, bh3) | 0;
- lo = lo + Math.imul(al3, bl4) | 0;
- mid = mid + Math.imul(al3, bh4) | 0;
- mid = mid + Math.imul(ah3, bl4) | 0;
- hi = hi + Math.imul(ah3, bh4) | 0;
- lo = lo + Math.imul(al2, bl5) | 0;
- mid = mid + Math.imul(al2, bh5) | 0;
- mid = mid + Math.imul(ah2, bl5) | 0;
- hi = hi + Math.imul(ah2, bh5) | 0;
- lo = lo + Math.imul(al1, bl6) | 0;
- mid = mid + Math.imul(al1, bh6) | 0;
- mid = mid + Math.imul(ah1, bl6) | 0;
- hi = hi + Math.imul(ah1, bh6) | 0;
- lo = lo + Math.imul(al0, bl7) | 0;
- mid = mid + Math.imul(al0, bh7) | 0;
- mid = mid + Math.imul(ah0, bl7) | 0;
- hi = hi + Math.imul(ah0, bh7) | 0;
- var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0;
- w7 &= 67108863;
- lo = Math.imul(al8, bl0);
- mid = Math.imul(al8, bh0);
- mid = mid + Math.imul(ah8, bl0) | 0;
- hi = Math.imul(ah8, bh0);
- lo = lo + Math.imul(al7, bl1) | 0;
- mid = mid + Math.imul(al7, bh1) | 0;
- mid = mid + Math.imul(ah7, bl1) | 0;
- hi = hi + Math.imul(ah7, bh1) | 0;
- lo = lo + Math.imul(al6, bl2) | 0;
- mid = mid + Math.imul(al6, bh2) | 0;
- mid = mid + Math.imul(ah6, bl2) | 0;
- hi = hi + Math.imul(ah6, bh2) | 0;
- lo = lo + Math.imul(al5, bl3) | 0;
- mid = mid + Math.imul(al5, bh3) | 0;
- mid = mid + Math.imul(ah5, bl3) | 0;
- hi = hi + Math.imul(ah5, bh3) | 0;
- lo = lo + Math.imul(al4, bl4) | 0;
- mid = mid + Math.imul(al4, bh4) | 0;
- mid = mid + Math.imul(ah4, bl4) | 0;
- hi = hi + Math.imul(ah4, bh4) | 0;
- lo = lo + Math.imul(al3, bl5) | 0;
- mid = mid + Math.imul(al3, bh5) | 0;
- mid = mid + Math.imul(ah3, bl5) | 0;
- hi = hi + Math.imul(ah3, bh5) | 0;
- lo = lo + Math.imul(al2, bl6) | 0;
- mid = mid + Math.imul(al2, bh6) | 0;
- mid = mid + Math.imul(ah2, bl6) | 0;
- hi = hi + Math.imul(ah2, bh6) | 0;
- lo = lo + Math.imul(al1, bl7) | 0;
- mid = mid + Math.imul(al1, bh7) | 0;
- mid = mid + Math.imul(ah1, bl7) | 0;
- hi = hi + Math.imul(ah1, bh7) | 0;
- lo = lo + Math.imul(al0, bl8) | 0;
- mid = mid + Math.imul(al0, bh8) | 0;
- mid = mid + Math.imul(ah0, bl8) | 0;
- hi = hi + Math.imul(ah0, bh8) | 0;
- var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0;
- w8 &= 67108863;
- lo = Math.imul(al9, bl0);
- mid = Math.imul(al9, bh0);
- mid = mid + Math.imul(ah9, bl0) | 0;
- hi = Math.imul(ah9, bh0);
- lo = lo + Math.imul(al8, bl1) | 0;
- mid = mid + Math.imul(al8, bh1) | 0;
- mid = mid + Math.imul(ah8, bl1) | 0;
- hi = hi + Math.imul(ah8, bh1) | 0;
- lo = lo + Math.imul(al7, bl2) | 0;
- mid = mid + Math.imul(al7, bh2) | 0;
- mid = mid + Math.imul(ah7, bl2) | 0;
- hi = hi + Math.imul(ah7, bh2) | 0;
- lo = lo + Math.imul(al6, bl3) | 0;
- mid = mid + Math.imul(al6, bh3) | 0;
- mid = mid + Math.imul(ah6, bl3) | 0;
- hi = hi + Math.imul(ah6, bh3) | 0;
- lo = lo + Math.imul(al5, bl4) | 0;
- mid = mid + Math.imul(al5, bh4) | 0;
- mid = mid + Math.imul(ah5, bl4) | 0;
- hi = hi + Math.imul(ah5, bh4) | 0;
- lo = lo + Math.imul(al4, bl5) | 0;
- mid = mid + Math.imul(al4, bh5) | 0;
- mid = mid + Math.imul(ah4, bl5) | 0;
- hi = hi + Math.imul(ah4, bh5) | 0;
- lo = lo + Math.imul(al3, bl6) | 0;
- mid = mid + Math.imul(al3, bh6) | 0;
- mid = mid + Math.imul(ah3, bl6) | 0;
- hi = hi + Math.imul(ah3, bh6) | 0;
- lo = lo + Math.imul(al2, bl7) | 0;
- mid = mid + Math.imul(al2, bh7) | 0;
- mid = mid + Math.imul(ah2, bl7) | 0;
- hi = hi + Math.imul(ah2, bh7) | 0;
- lo = lo + Math.imul(al1, bl8) | 0;
- mid = mid + Math.imul(al1, bh8) | 0;
- mid = mid + Math.imul(ah1, bl8) | 0;
- hi = hi + Math.imul(ah1, bh8) | 0;
- lo = lo + Math.imul(al0, bl9) | 0;
- mid = mid + Math.imul(al0, bh9) | 0;
- mid = mid + Math.imul(ah0, bl9) | 0;
- hi = hi + Math.imul(ah0, bh9) | 0;
- var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0;
- w9 &= 67108863;
- lo = Math.imul(al9, bl1);
- mid = Math.imul(al9, bh1);
- mid = mid + Math.imul(ah9, bl1) | 0;
- hi = Math.imul(ah9, bh1);
- lo = lo + Math.imul(al8, bl2) | 0;
- mid = mid + Math.imul(al8, bh2) | 0;
- mid = mid + Math.imul(ah8, bl2) | 0;
- hi = hi + Math.imul(ah8, bh2) | 0;
- lo = lo + Math.imul(al7, bl3) | 0;
- mid = mid + Math.imul(al7, bh3) | 0;
- mid = mid + Math.imul(ah7, bl3) | 0;
- hi = hi + Math.imul(ah7, bh3) | 0;
- lo = lo + Math.imul(al6, bl4) | 0;
- mid = mid + Math.imul(al6, bh4) | 0;
- mid = mid + Math.imul(ah6, bl4) | 0;
- hi = hi + Math.imul(ah6, bh4) | 0;
- lo = lo + Math.imul(al5, bl5) | 0;
- mid = mid + Math.imul(al5, bh5) | 0;
- mid = mid + Math.imul(ah5, bl5) | 0;
- hi = hi + Math.imul(ah5, bh5) | 0;
- lo = lo + Math.imul(al4, bl6) | 0;
- mid = mid + Math.imul(al4, bh6) | 0;
- mid = mid + Math.imul(ah4, bl6) | 0;
- hi = hi + Math.imul(ah4, bh6) | 0;
- lo = lo + Math.imul(al3, bl7) | 0;
- mid = mid + Math.imul(al3, bh7) | 0;
- mid = mid + Math.imul(ah3, bl7) | 0;
- hi = hi + Math.imul(ah3, bh7) | 0;
- lo = lo + Math.imul(al2, bl8) | 0;
- mid = mid + Math.imul(al2, bh8) | 0;
- mid = mid + Math.imul(ah2, bl8) | 0;
- hi = hi + Math.imul(ah2, bh8) | 0;
- lo = lo + Math.imul(al1, bl9) | 0;
- mid = mid + Math.imul(al1, bh9) | 0;
- mid = mid + Math.imul(ah1, bl9) | 0;
- hi = hi + Math.imul(ah1, bh9) | 0;
- var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0;
- w10 &= 67108863;
- lo = Math.imul(al9, bl2);
- mid = Math.imul(al9, bh2);
- mid = mid + Math.imul(ah9, bl2) | 0;
- hi = Math.imul(ah9, bh2);
- lo = lo + Math.imul(al8, bl3) | 0;
- mid = mid + Math.imul(al8, bh3) | 0;
- mid = mid + Math.imul(ah8, bl3) | 0;
- hi = hi + Math.imul(ah8, bh3) | 0;
- lo = lo + Math.imul(al7, bl4) | 0;
- mid = mid + Math.imul(al7, bh4) | 0;
- mid = mid + Math.imul(ah7, bl4) | 0;
- hi = hi + Math.imul(ah7, bh4) | 0;
- lo = lo + Math.imul(al6, bl5) | 0;
- mid = mid + Math.imul(al6, bh5) | 0;
- mid = mid + Math.imul(ah6, bl5) | 0;
- hi = hi + Math.imul(ah6, bh5) | 0;
- lo = lo + Math.imul(al5, bl6) | 0;
- mid = mid + Math.imul(al5, bh6) | 0;
- mid = mid + Math.imul(ah5, bl6) | 0;
- hi = hi + Math.imul(ah5, bh6) | 0;
- lo = lo + Math.imul(al4, bl7) | 0;
- mid = mid + Math.imul(al4, bh7) | 0;
- mid = mid + Math.imul(ah4, bl7) | 0;
- hi = hi + Math.imul(ah4, bh7) | 0;
- lo = lo + Math.imul(al3, bl8) | 0;
- mid = mid + Math.imul(al3, bh8) | 0;
- mid = mid + Math.imul(ah3, bl8) | 0;
- hi = hi + Math.imul(ah3, bh8) | 0;
- lo = lo + Math.imul(al2, bl9) | 0;
- mid = mid + Math.imul(al2, bh9) | 0;
- mid = mid + Math.imul(ah2, bl9) | 0;
- hi = hi + Math.imul(ah2, bh9) | 0;
- var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0;
- w11 &= 67108863;
- lo = Math.imul(al9, bl3);
- mid = Math.imul(al9, bh3);
- mid = mid + Math.imul(ah9, bl3) | 0;
- hi = Math.imul(ah9, bh3);
- lo = lo + Math.imul(al8, bl4) | 0;
- mid = mid + Math.imul(al8, bh4) | 0;
- mid = mid + Math.imul(ah8, bl4) | 0;
- hi = hi + Math.imul(ah8, bh4) | 0;
- lo = lo + Math.imul(al7, bl5) | 0;
- mid = mid + Math.imul(al7, bh5) | 0;
- mid = mid + Math.imul(ah7, bl5) | 0;
- hi = hi + Math.imul(ah7, bh5) | 0;
- lo = lo + Math.imul(al6, bl6) | 0;
- mid = mid + Math.imul(al6, bh6) | 0;
- mid = mid + Math.imul(ah6, bl6) | 0;
- hi = hi + Math.imul(ah6, bh6) | 0;
- lo = lo + Math.imul(al5, bl7) | 0;
- mid = mid + Math.imul(al5, bh7) | 0;
- mid = mid + Math.imul(ah5, bl7) | 0;
- hi = hi + Math.imul(ah5, bh7) | 0;
- lo = lo + Math.imul(al4, bl8) | 0;
- mid = mid + Math.imul(al4, bh8) | 0;
- mid = mid + Math.imul(ah4, bl8) | 0;
- hi = hi + Math.imul(ah4, bh8) | 0;
- lo = lo + Math.imul(al3, bl9) | 0;
- mid = mid + Math.imul(al3, bh9) | 0;
- mid = mid + Math.imul(ah3, bl9) | 0;
- hi = hi + Math.imul(ah3, bh9) | 0;
- var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0;
- w12 &= 67108863;
- lo = Math.imul(al9, bl4);
- mid = Math.imul(al9, bh4);
- mid = mid + Math.imul(ah9, bl4) | 0;
- hi = Math.imul(ah9, bh4);
- lo = lo + Math.imul(al8, bl5) | 0;
- mid = mid + Math.imul(al8, bh5) | 0;
- mid = mid + Math.imul(ah8, bl5) | 0;
- hi = hi + Math.imul(ah8, bh5) | 0;
- lo = lo + Math.imul(al7, bl6) | 0;
- mid = mid + Math.imul(al7, bh6) | 0;
- mid = mid + Math.imul(ah7, bl6) | 0;
- hi = hi + Math.imul(ah7, bh6) | 0;
- lo = lo + Math.imul(al6, bl7) | 0;
- mid = mid + Math.imul(al6, bh7) | 0;
- mid = mid + Math.imul(ah6, bl7) | 0;
- hi = hi + Math.imul(ah6, bh7) | 0;
- lo = lo + Math.imul(al5, bl8) | 0;
- mid = mid + Math.imul(al5, bh8) | 0;
- mid = mid + Math.imul(ah5, bl8) | 0;
- hi = hi + Math.imul(ah5, bh8) | 0;
- lo = lo + Math.imul(al4, bl9) | 0;
- mid = mid + Math.imul(al4, bh9) | 0;
- mid = mid + Math.imul(ah4, bl9) | 0;
- hi = hi + Math.imul(ah4, bh9) | 0;
- var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0;
- w13 &= 67108863;
- lo = Math.imul(al9, bl5);
- mid = Math.imul(al9, bh5);
- mid = mid + Math.imul(ah9, bl5) | 0;
- hi = Math.imul(ah9, bh5);
- lo = lo + Math.imul(al8, bl6) | 0;
- mid = mid + Math.imul(al8, bh6) | 0;
- mid = mid + Math.imul(ah8, bl6) | 0;
- hi = hi + Math.imul(ah8, bh6) | 0;
- lo = lo + Math.imul(al7, bl7) | 0;
- mid = mid + Math.imul(al7, bh7) | 0;
- mid = mid + Math.imul(ah7, bl7) | 0;
- hi = hi + Math.imul(ah7, bh7) | 0;
- lo = lo + Math.imul(al6, bl8) | 0;
- mid = mid + Math.imul(al6, bh8) | 0;
- mid = mid + Math.imul(ah6, bl8) | 0;
- hi = hi + Math.imul(ah6, bh8) | 0;
- lo = lo + Math.imul(al5, bl9) | 0;
- mid = mid + Math.imul(al5, bh9) | 0;
- mid = mid + Math.imul(ah5, bl9) | 0;
- hi = hi + Math.imul(ah5, bh9) | 0;
- var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0;
- w14 &= 67108863;
- lo = Math.imul(al9, bl6);
- mid = Math.imul(al9, bh6);
- mid = mid + Math.imul(ah9, bl6) | 0;
- hi = Math.imul(ah9, bh6);
- lo = lo + Math.imul(al8, bl7) | 0;
- mid = mid + Math.imul(al8, bh7) | 0;
- mid = mid + Math.imul(ah8, bl7) | 0;
- hi = hi + Math.imul(ah8, bh7) | 0;
- lo = lo + Math.imul(al7, bl8) | 0;
- mid = mid + Math.imul(al7, bh8) | 0;
- mid = mid + Math.imul(ah7, bl8) | 0;
- hi = hi + Math.imul(ah7, bh8) | 0;
- lo = lo + Math.imul(al6, bl9) | 0;
- mid = mid + Math.imul(al6, bh9) | 0;
- mid = mid + Math.imul(ah6, bl9) | 0;
- hi = hi + Math.imul(ah6, bh9) | 0;
- var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0;
- w15 &= 67108863;
- lo = Math.imul(al9, bl7);
- mid = Math.imul(al9, bh7);
- mid = mid + Math.imul(ah9, bl7) | 0;
- hi = Math.imul(ah9, bh7);
- lo = lo + Math.imul(al8, bl8) | 0;
- mid = mid + Math.imul(al8, bh8) | 0;
- mid = mid + Math.imul(ah8, bl8) | 0;
- hi = hi + Math.imul(ah8, bh8) | 0;
- lo = lo + Math.imul(al7, bl9) | 0;
- mid = mid + Math.imul(al7, bh9) | 0;
- mid = mid + Math.imul(ah7, bl9) | 0;
- hi = hi + Math.imul(ah7, bh9) | 0;
- var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0;
- w16 &= 67108863;
- lo = Math.imul(al9, bl8);
- mid = Math.imul(al9, bh8);
- mid = mid + Math.imul(ah9, bl8) | 0;
- hi = Math.imul(ah9, bh8);
- lo = lo + Math.imul(al8, bl9) | 0;
- mid = mid + Math.imul(al8, bh9) | 0;
- mid = mid + Math.imul(ah8, bl9) | 0;
- hi = hi + Math.imul(ah8, bh9) | 0;
- var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0;
- w17 &= 67108863;
- lo = Math.imul(al9, bl9);
- mid = Math.imul(al9, bh9);
- mid = mid + Math.imul(ah9, bl9) | 0;
- hi = Math.imul(ah9, bh9);
- var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0;
- c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0;
- w18 &= 67108863;
- o[0] = w0;
- o[1] = w1;
- o[2] = w2;
- o[3] = w3;
- o[4] = w4;
- o[5] = w5;
- o[6] = w6;
- o[7] = w7;
- o[8] = w8;
- o[9] = w9;
- o[10] = w10;
- o[11] = w11;
- o[12] = w12;
- o[13] = w13;
- o[14] = w14;
- o[15] = w15;
- o[16] = w16;
- o[17] = w17;
- o[18] = w18;
- if (c !== 0) {
- o[19] = c;
- out.length++;
- }
- return out;
- };
- if (!Math.imul) {
- comb10MulTo = smallMulTo;
- }
- function bigMulTo(self2, num, out) {
- out.negative = num.negative ^ self2.negative;
- out.length = self2.length + num.length;
- var carry = 0;
- var hncarry = 0;
- for (var k = 0;k < out.length - 1; k++) {
- var ncarry = hncarry;
- hncarry = 0;
- var rword = carry & 67108863;
- var maxJ = Math.min(k, num.length - 1);
- for (var j = Math.max(0, k - self2.length + 1);j <= maxJ; j++) {
- var i = k - j;
- var a = self2.words[i] | 0;
- var b = num.words[j] | 0;
- var r = a * b;
- var lo = r & 67108863;
- ncarry = ncarry + (r / 67108864 | 0) | 0;
- lo = lo + rword | 0;
- rword = lo & 67108863;
- ncarry = ncarry + (lo >>> 26) | 0;
- hncarry += ncarry >>> 26;
- ncarry &= 67108863;
- }
- out.words[k] = rword;
- carry = ncarry;
- ncarry = hncarry;
- }
- if (carry !== 0) {
- out.words[k] = carry;
- } else {
- out.length--;
- }
- return out.strip();
- }
- function jumboMulTo(self2, num, out) {
- var fftm = new FFTM;
- return fftm.mulp(self2, num, out);
- }
- BN.prototype.mulTo = function mulTo(num, out) {
- var res;
- var len = this.length + num.length;
- if (this.length === 10 && num.length === 10) {
- res = comb10MulTo(this, num, out);
- } else if (len < 63) {
- res = smallMulTo(this, num, out);
- } else if (len < 1024) {
- res = bigMulTo(this, num, out);
- } else {
- res = jumboMulTo(this, num, out);
- }
- return res;
- };
- function FFTM(x, y) {
- this.x = x;
- this.y = y;
- }
- FFTM.prototype.makeRBT = function makeRBT(N) {
- var t = new Array(N);
- var l = BN.prototype._countBits(N) - 1;
- for (var i = 0;i < N; i++) {
- t[i] = this.revBin(i, l, N);
- }
- return t;
- };
- FFTM.prototype.revBin = function revBin(x, l, N) {
- if (x === 0 || x === N - 1)
- return x;
- var rb = 0;
- for (var i = 0;i < l; i++) {
- rb |= (x & 1) << l - i - 1;
- x >>= 1;
- }
- return rb;
- };
- FFTM.prototype.permute = function permute(rbt, rws, iws, rtws, itws, N) {
- for (var i = 0;i < N; i++) {
- rtws[i] = rws[rbt[i]];
- itws[i] = iws[rbt[i]];
- }
- };
- FFTM.prototype.transform = function transform(rws, iws, rtws, itws, N, rbt) {
- this.permute(rbt, rws, iws, rtws, itws, N);
- for (var s = 1;s < N; s <<= 1) {
- var l = s << 1;
- var rtwdf = Math.cos(2 * Math.PI / l);
- var itwdf = Math.sin(2 * Math.PI / l);
- for (var p = 0;p < N; p += l) {
- var rtwdf_ = rtwdf;
- var itwdf_ = itwdf;
- for (var j = 0;j < s; j++) {
- var re = rtws[p + j];
- var ie = itws[p + j];
- var ro = rtws[p + j + s];
- var io = itws[p + j + s];
- var rx = rtwdf_ * ro - itwdf_ * io;
- io = rtwdf_ * io + itwdf_ * ro;
- ro = rx;
- rtws[p + j] = re + ro;
- itws[p + j] = ie + io;
- rtws[p + j + s] = re - ro;
- itws[p + j + s] = ie - io;
- if (j !== l) {
- rx = rtwdf * rtwdf_ - itwdf * itwdf_;
- itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;
- rtwdf_ = rx;
- }
- }
- }
- }
- };
- FFTM.prototype.guessLen13b = function guessLen13b(n, m) {
- var N = Math.max(m, n) | 1;
- var odd = N & 1;
- var i = 0;
- for (N = N / 2 | 0;N; N = N >>> 1) {
- i++;
- }
- return 1 << i + 1 + odd;
- };
- FFTM.prototype.conjugate = function conjugate(rws, iws, N) {
- if (N <= 1)
- return;
- for (var i = 0;i < N / 2; i++) {
- var t = rws[i];
- rws[i] = rws[N - i - 1];
- rws[N - i - 1] = t;
- t = iws[i];
- iws[i] = -iws[N - i - 1];
- iws[N - i - 1] = -t;
- }
- };
- FFTM.prototype.normalize13b = function normalize13b(ws, N) {
- var carry = 0;
- for (var i = 0;i < N / 2; i++) {
- var w = Math.round(ws[2 * i + 1] / N) * 8192 + Math.round(ws[2 * i] / N) + carry;
- ws[i] = w & 67108863;
- if (w < 67108864) {
- carry = 0;
- } else {
- carry = w / 67108864 | 0;
- }
- }
- return ws;
- };
- FFTM.prototype.convert13b = function convert13b(ws, len, rws, N) {
- var carry = 0;
- for (var i = 0;i < len; i++) {
- carry = carry + (ws[i] | 0);
- rws[2 * i] = carry & 8191;
- carry = carry >>> 13;
- rws[2 * i + 1] = carry & 8191;
- carry = carry >>> 13;
- }
- for (i = 2 * len;i < N; ++i) {
- rws[i] = 0;
- }
- assert(carry === 0);
- assert((carry & ~8191) === 0);
- };
- FFTM.prototype.stub = function stub(N) {
- var ph = new Array(N);
- for (var i = 0;i < N; i++) {
- ph[i] = 0;
- }
- return ph;
- };
- FFTM.prototype.mulp = function mulp(x, y, out) {
- var N = 2 * this.guessLen13b(x.length, y.length);
- var rbt = this.makeRBT(N);
- var _ = this.stub(N);
- var rws = new Array(N);
- var rwst = new Array(N);
- var iwst = new Array(N);
- var nrws = new Array(N);
- var nrwst = new Array(N);
- var niwst = new Array(N);
- var rmws = out.words;
- rmws.length = N;
- this.convert13b(x.words, x.length, rws, N);
- this.convert13b(y.words, y.length, nrws, N);
- this.transform(rws, _, rwst, iwst, N, rbt);
- this.transform(nrws, _, nrwst, niwst, N, rbt);
- for (var i = 0;i < N; i++) {
- var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];
- iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];
- rwst[i] = rx;
- }
- this.conjugate(rwst, iwst, N);
- this.transform(rwst, iwst, rmws, _, N, rbt);
- this.conjugate(rmws, _, N);
- this.normalize13b(rmws, N);
- out.negative = x.negative ^ y.negative;
- out.length = x.length + y.length;
- return out.strip();
- };
- BN.prototype.mul = function mul(num) {
- var out = new BN(null);
- out.words = new Array(this.length + num.length);
- return this.mulTo(num, out);
- };
- BN.prototype.mulf = function mulf(num) {
- var out = new BN(null);
- out.words = new Array(this.length + num.length);
- return jumboMulTo(this, num, out);
- };
- BN.prototype.imul = function imul(num) {
- return this.clone().mulTo(num, this);
- };
- BN.prototype.imuln = function imuln(num) {
- assert(typeof num === "number");
- assert(num < 67108864);
- var carry = 0;
- for (var i = 0;i < this.length; i++) {
- var w = (this.words[i] | 0) * num;
- var lo = (w & 67108863) + (carry & 67108863);
- carry >>= 26;
- carry += w / 67108864 | 0;
- carry += lo >>> 26;
- this.words[i] = lo & 67108863;
- }
- if (carry !== 0) {
- this.words[i] = carry;
- this.length++;
- }
- this.length = num === 0 ? 1 : this.length;
- return this;
- };
- BN.prototype.muln = function muln(num) {
- return this.clone().imuln(num);
- };
- BN.prototype.sqr = function sqr() {
- return this.mul(this);
- };
- BN.prototype.isqr = function isqr() {
- return this.imul(this.clone());
- };
- BN.prototype.pow = function pow(num) {
- var w = toBitArray(num);
- if (w.length === 0)
- return new BN(1);
- var res = this;
- for (var i = 0;i < w.length; i++, res = res.sqr()) {
- if (w[i] !== 0)
- break;
- }
- if (++i < w.length) {
- for (var q = res.sqr();i < w.length; i++, q = q.sqr()) {
- if (w[i] === 0)
- continue;
- res = res.mul(q);
- }
- }
- return res;
- };
- BN.prototype.iushln = function iushln(bits) {
- assert(typeof bits === "number" && bits >= 0);
- var r = bits % 26;
- var s = (bits - r) / 26;
- var carryMask = 67108863 >>> 26 - r << 26 - r;
- var i;
- if (r !== 0) {
- var carry = 0;
- for (i = 0;i < this.length; i++) {
- var newCarry = this.words[i] & carryMask;
- var c = (this.words[i] | 0) - newCarry << r;
- this.words[i] = c | carry;
- carry = newCarry >>> 26 - r;
- }
- if (carry) {
- this.words[i] = carry;
- this.length++;
- }
- }
- if (s !== 0) {
- for (i = this.length - 1;i >= 0; i--) {
- this.words[i + s] = this.words[i];
- }
- for (i = 0;i < s; i++) {
- this.words[i] = 0;
- }
- this.length += s;
- }
- return this.strip();
- };
- BN.prototype.ishln = function ishln(bits) {
- assert(this.negative === 0);
- return this.iushln(bits);
- };
- BN.prototype.iushrn = function iushrn(bits, hint, extended) {
- assert(typeof bits === "number" && bits >= 0);
- var h;
- if (hint) {
- h = (hint - hint % 26) / 26;
- } else {
- h = 0;
- }
- var r = bits % 26;
- var s = Math.min((bits - r) / 26, this.length);
- var mask = 67108863 ^ 67108863 >>> r << r;
- var maskedWords = extended;
- h -= s;
- h = Math.max(0, h);
- if (maskedWords) {
- for (var i = 0;i < s; i++) {
- maskedWords.words[i] = this.words[i];
- }
- maskedWords.length = s;
- }
- if (s === 0) {} else if (this.length > s) {
- this.length -= s;
- for (i = 0;i < this.length; i++) {
- this.words[i] = this.words[i + s];
- }
- } else {
- this.words[0] = 0;
- this.length = 1;
- }
- var carry = 0;
- for (i = this.length - 1;i >= 0 && (carry !== 0 || i >= h); i--) {
- var word = this.words[i] | 0;
- this.words[i] = carry << 26 - r | word >>> r;
- carry = word & mask;
- }
- if (maskedWords && carry !== 0) {
- maskedWords.words[maskedWords.length++] = carry;
- }
- if (this.length === 0) {
- this.words[0] = 0;
- this.length = 1;
- }
- return this.strip();
- };
- BN.prototype.ishrn = function ishrn(bits, hint, extended) {
- assert(this.negative === 0);
- return this.iushrn(bits, hint, extended);
- };
- BN.prototype.shln = function shln(bits) {
- return this.clone().ishln(bits);
- };
- BN.prototype.ushln = function ushln(bits) {
- return this.clone().iushln(bits);
- };
- BN.prototype.shrn = function shrn(bits) {
- return this.clone().ishrn(bits);
- };
- BN.prototype.ushrn = function ushrn(bits) {
- return this.clone().iushrn(bits);
- };
- BN.prototype.testn = function testn(bit) {
- assert(typeof bit === "number" && bit >= 0);
- var r = bit % 26;
- var s = (bit - r) / 26;
- var q = 1 << r;
- if (this.length <= s)
- return false;
- var w = this.words[s];
- return !!(w & q);
- };
- BN.prototype.imaskn = function imaskn(bits) {
- assert(typeof bits === "number" && bits >= 0);
- var r = bits % 26;
- var s = (bits - r) / 26;
- assert(this.negative === 0, "imaskn works only with positive numbers");
- if (this.length <= s) {
- return this;
- }
- if (r !== 0) {
- s++;
- }
- this.length = Math.min(s, this.length);
- if (r !== 0) {
- var mask = 67108863 ^ 67108863 >>> r << r;
- this.words[this.length - 1] &= mask;
- }
- return this.strip();
- };
- BN.prototype.maskn = function maskn(bits) {
- return this.clone().imaskn(bits);
- };
- BN.prototype.iaddn = function iaddn(num) {
- assert(typeof num === "number");
- assert(num < 67108864);
- if (num < 0)
- return this.isubn(-num);
- if (this.negative !== 0) {
- if (this.length === 1 && (this.words[0] | 0) < num) {
- this.words[0] = num - (this.words[0] | 0);
- this.negative = 0;
- return this;
- }
- this.negative = 0;
- this.isubn(num);
- this.negative = 1;
- return this;
- }
- return this._iaddn(num);
- };
- BN.prototype._iaddn = function _iaddn(num) {
- this.words[0] += num;
- for (var i = 0;i < this.length && this.words[i] >= 67108864; i++) {
- this.words[i] -= 67108864;
- if (i === this.length - 1) {
- this.words[i + 1] = 1;
- } else {
- this.words[i + 1]++;
- }
- }
- this.length = Math.max(this.length, i + 1);
- return this;
- };
- BN.prototype.isubn = function isubn(num) {
- assert(typeof num === "number");
- assert(num < 67108864);
- if (num < 0)
- return this.iaddn(-num);
- if (this.negative !== 0) {
- this.negative = 0;
- this.iaddn(num);
- this.negative = 1;
- return this;
- }
- this.words[0] -= num;
- if (this.length === 1 && this.words[0] < 0) {
- this.words[0] = -this.words[0];
- this.negative = 1;
- } else {
- for (var i = 0;i < this.length && this.words[i] < 0; i++) {
- this.words[i] += 67108864;
- this.words[i + 1] -= 1;
- }
- }
- return this.strip();
- };
- BN.prototype.addn = function addn(num) {
- return this.clone().iaddn(num);
- };
- BN.prototype.subn = function subn(num) {
- return this.clone().isubn(num);
- };
- BN.prototype.iabs = function iabs() {
- this.negative = 0;
- return this;
- };
- BN.prototype.abs = function abs() {
- return this.clone().iabs();
- };
- BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) {
- var len = num.length + shift;
- var i;
- this._expand(len);
- var w;
- var carry = 0;
- for (i = 0;i < num.length; i++) {
- w = (this.words[i + shift] | 0) + carry;
- var right = (num.words[i] | 0) * mul;
- w -= right & 67108863;
- carry = (w >> 26) - (right / 67108864 | 0);
- this.words[i + shift] = w & 67108863;
- }
- for (;i < this.length - shift; i++) {
- w = (this.words[i + shift] | 0) + carry;
- carry = w >> 26;
- this.words[i + shift] = w & 67108863;
- }
- if (carry === 0)
- return this.strip();
- assert(carry === -1);
- carry = 0;
- for (i = 0;i < this.length; i++) {
- w = -(this.words[i] | 0) + carry;
- carry = w >> 26;
- this.words[i] = w & 67108863;
- }
- this.negative = 1;
- return this.strip();
- };
- BN.prototype._wordDiv = function _wordDiv(num, mode) {
- var shift = this.length - num.length;
- var a = this.clone();
- var b = num;
- var bhi = b.words[b.length - 1] | 0;
- var bhiBits = this._countBits(bhi);
- shift = 26 - bhiBits;
- if (shift !== 0) {
- b = b.ushln(shift);
- a.iushln(shift);
- bhi = b.words[b.length - 1] | 0;
- }
- var m = a.length - b.length;
- var q;
- if (mode !== "mod") {
- q = new BN(null);
- q.length = m + 1;
- q.words = new Array(q.length);
- for (var i = 0;i < q.length; i++) {
- q.words[i] = 0;
- }
- }
- var diff = a.clone()._ishlnsubmul(b, 1, m);
- if (diff.negative === 0) {
- a = diff;
- if (q) {
- q.words[m] = 1;
- }
- }
- for (var j = m - 1;j >= 0; j--) {
- var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0);
- qj = Math.min(qj / bhi | 0, 67108863);
- a._ishlnsubmul(b, qj, j);
- while (a.negative !== 0) {
- qj--;
- a.negative = 0;
- a._ishlnsubmul(b, 1, j);
- if (!a.isZero()) {
- a.negative ^= 1;
- }
- }
- if (q) {
- q.words[j] = qj;
- }
- }
- if (q) {
- q.strip();
- }
- a.strip();
- if (mode !== "div" && shift !== 0) {
- a.iushrn(shift);
- }
- return {
- div: q || null,
- mod: a
- };
- };
- BN.prototype.divmod = function divmod(num, mode, positive) {
- assert(!num.isZero());
- if (this.isZero()) {
- return {
- div: new BN(0),
- mod: new BN(0)
- };
- }
- var div, mod, res;
- if (this.negative !== 0 && num.negative === 0) {
- res = this.neg().divmod(num, mode);
- if (mode !== "mod") {
- div = res.div.neg();
- }
- if (mode !== "div") {
- mod = res.mod.neg();
- if (positive && mod.negative !== 0) {
- mod.iadd(num);
- }
- }
- return {
- div,
- mod
- };
- }
- if (this.negative === 0 && num.negative !== 0) {
- res = this.divmod(num.neg(), mode);
- if (mode !== "mod") {
- div = res.div.neg();
- }
- return {
- div,
- mod: res.mod
- };
- }
- if ((this.negative & num.negative) !== 0) {
- res = this.neg().divmod(num.neg(), mode);
- if (mode !== "div") {
- mod = res.mod.neg();
- if (positive && mod.negative !== 0) {
- mod.isub(num);
- }
- }
- return {
- div: res.div,
- mod
- };
- }
- if (num.length > this.length || this.cmp(num) < 0) {
- return {
- div: new BN(0),
- mod: this
- };
- }
- if (num.length === 1) {
- if (mode === "div") {
- return {
- div: this.divn(num.words[0]),
- mod: null
- };
- }
- if (mode === "mod") {
- return {
- div: null,
- mod: new BN(this.modn(num.words[0]))
- };
- }
- return {
- div: this.divn(num.words[0]),
- mod: new BN(this.modn(num.words[0]))
- };
- }
- return this._wordDiv(num, mode);
- };
- BN.prototype.div = function div(num) {
- return this.divmod(num, "div", false).div;
- };
- BN.prototype.mod = function mod(num) {
- return this.divmod(num, "mod", false).mod;
- };
- BN.prototype.umod = function umod(num) {
- return this.divmod(num, "mod", true).mod;
- };
- BN.prototype.divRound = function divRound(num) {
- var dm = this.divmod(num);
- if (dm.mod.isZero())
- return dm.div;
- var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;
- var half = num.ushrn(1);
- var r2 = num.andln(1);
- var cmp = mod.cmp(half);
- if (cmp < 0 || r2 === 1 && cmp === 0)
- return dm.div;
- return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
- };
- BN.prototype.modn = function modn(num) {
- assert(num <= 67108863);
- var p = (1 << 26) % num;
- var acc = 0;
- for (var i = this.length - 1;i >= 0; i--) {
- acc = (p * acc + (this.words[i] | 0)) % num;
- }
- return acc;
- };
- BN.prototype.idivn = function idivn(num) {
- assert(num <= 67108863);
- var carry = 0;
- for (var i = this.length - 1;i >= 0; i--) {
- var w = (this.words[i] | 0) + carry * 67108864;
- this.words[i] = w / num | 0;
- carry = w % num;
- }
- return this.strip();
- };
- BN.prototype.divn = function divn(num) {
- return this.clone().idivn(num);
- };
- BN.prototype.egcd = function egcd(p) {
- assert(p.negative === 0);
- assert(!p.isZero());
- var x = this;
- var y = p.clone();
- if (x.negative !== 0) {
- x = x.umod(p);
- } else {
- x = x.clone();
- }
- var A = new BN(1);
- var B = new BN(0);
- var C = new BN(0);
- var D = new BN(1);
- var g = 0;
- while (x.isEven() && y.isEven()) {
- x.iushrn(1);
- y.iushrn(1);
- ++g;
- }
- var yp = y.clone();
- var xp = x.clone();
- while (!x.isZero()) {
- for (var i = 0, im = 1;(x.words[0] & im) === 0 && i < 26; ++i, im <<= 1)
- ;
- if (i > 0) {
- x.iushrn(i);
- while (i-- > 0) {
- if (A.isOdd() || B.isOdd()) {
- A.iadd(yp);
- B.isub(xp);
- }
- A.iushrn(1);
- B.iushrn(1);
- }
- }
- for (var j = 0, jm = 1;(y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1)
- ;
- if (j > 0) {
- y.iushrn(j);
- while (j-- > 0) {
- if (C.isOdd() || D.isOdd()) {
- C.iadd(yp);
- D.isub(xp);
- }
- C.iushrn(1);
- D.iushrn(1);
- }
- }
- if (x.cmp(y) >= 0) {
- x.isub(y);
- A.isub(C);
- B.isub(D);
- } else {
- y.isub(x);
- C.isub(A);
- D.isub(B);
- }
- }
- return {
- a: C,
- b: D,
- gcd: y.iushln(g)
- };
- };
- BN.prototype._invmp = function _invmp(p) {
- assert(p.negative === 0);
- assert(!p.isZero());
- var a = this;
- var b = p.clone();
- if (a.negative !== 0) {
- a = a.umod(p);
- } else {
- a = a.clone();
- }
- var x1 = new BN(1);
- var x2 = new BN(0);
- var delta = b.clone();
- while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
- for (var i = 0, im = 1;(a.words[0] & im) === 0 && i < 26; ++i, im <<= 1)
- ;
- if (i > 0) {
- a.iushrn(i);
- while (i-- > 0) {
- if (x1.isOdd()) {
- x1.iadd(delta);
- }
- x1.iushrn(1);
- }
- }
- for (var j = 0, jm = 1;(b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1)
- ;
- if (j > 0) {
- b.iushrn(j);
- while (j-- > 0) {
- if (x2.isOdd()) {
- x2.iadd(delta);
- }
- x2.iushrn(1);
- }
- }
- if (a.cmp(b) >= 0) {
- a.isub(b);
- x1.isub(x2);
- } else {
- b.isub(a);
- x2.isub(x1);
- }
- }
- var res;
- if (a.cmpn(1) === 0) {
- res = x1;
- } else {
- res = x2;
- }
- if (res.cmpn(0) < 0) {
- res.iadd(p);
- }
- return res;
- };
- BN.prototype.gcd = function gcd(num) {
- if (this.isZero())
- return num.abs();
- if (num.isZero())
- return this.abs();
- var a = this.clone();
- var b = num.clone();
- a.negative = 0;
- b.negative = 0;
- for (var shift = 0;a.isEven() && b.isEven(); shift++) {
- a.iushrn(1);
- b.iushrn(1);
- }
- do {
- while (a.isEven()) {
- a.iushrn(1);
- }
- while (b.isEven()) {
- b.iushrn(1);
- }
- var r = a.cmp(b);
- if (r < 0) {
- var t = a;
- a = b;
- b = t;
- } else if (r === 0 || b.cmpn(1) === 0) {
- break;
- }
- a.isub(b);
- } while (true);
- return b.iushln(shift);
- };
- BN.prototype.invm = function invm(num) {
- return this.egcd(num).a.umod(num);
- };
- BN.prototype.isEven = function isEven() {
- return (this.words[0] & 1) === 0;
- };
- BN.prototype.isOdd = function isOdd() {
- return (this.words[0] & 1) === 1;
- };
- BN.prototype.andln = function andln(num) {
- return this.words[0] & num;
- };
- BN.prototype.bincn = function bincn(bit) {
- assert(typeof bit === "number");
- var r = bit % 26;
- var s = (bit - r) / 26;
- var q = 1 << r;
- if (this.length <= s) {
- this._expand(s + 1);
- this.words[s] |= q;
- return this;
- }
- var carry = q;
- for (var i = s;carry !== 0 && i < this.length; i++) {
- var w = this.words[i] | 0;
- w += carry;
- carry = w >>> 26;
- w &= 67108863;
- this.words[i] = w;
- }
- if (carry !== 0) {
- this.words[i] = carry;
- this.length++;
- }
- return this;
- };
- BN.prototype.isZero = function isZero() {
- return this.length === 1 && this.words[0] === 0;
- };
- BN.prototype.cmpn = function cmpn(num) {
- var negative = num < 0;
- if (this.negative !== 0 && !negative)
- return -1;
- if (this.negative === 0 && negative)
- return 1;
- this.strip();
- var res;
- if (this.length > 1) {
- res = 1;
- } else {
- if (negative) {
- num = -num;
- }
- assert(num <= 67108863, "Number is too big");
- var w = this.words[0] | 0;
- res = w === num ? 0 : w < num ? -1 : 1;
- }
- if (this.negative !== 0)
- return -res | 0;
- return res;
- };
- BN.prototype.cmp = function cmp(num) {
- if (this.negative !== 0 && num.negative === 0)
- return -1;
- if (this.negative === 0 && num.negative !== 0)
- return 1;
- var res = this.ucmp(num);
- if (this.negative !== 0)
- return -res | 0;
- return res;
- };
- BN.prototype.ucmp = function ucmp(num) {
- if (this.length > num.length)
- return 1;
- if (this.length < num.length)
- return -1;
- var res = 0;
- for (var i = this.length - 1;i >= 0; i--) {
- var a = this.words[i] | 0;
- var b = num.words[i] | 0;
- if (a === b)
- continue;
- if (a < b) {
- res = -1;
- } else if (a > b) {
- res = 1;
- }
- break;
- }
- return res;
- };
- BN.prototype.gtn = function gtn(num) {
- return this.cmpn(num) === 1;
- };
- BN.prototype.gt = function gt(num) {
- return this.cmp(num) === 1;
- };
- BN.prototype.gten = function gten(num) {
- return this.cmpn(num) >= 0;
- };
- BN.prototype.gte = function gte(num) {
- return this.cmp(num) >= 0;
- };
- BN.prototype.ltn = function ltn(num) {
- return this.cmpn(num) === -1;
- };
- BN.prototype.lt = function lt(num) {
- return this.cmp(num) === -1;
- };
- BN.prototype.lten = function lten(num) {
- return this.cmpn(num) <= 0;
- };
- BN.prototype.lte = function lte(num) {
- return this.cmp(num) <= 0;
- };
- BN.prototype.eqn = function eqn(num) {
- return this.cmpn(num) === 0;
- };
- BN.prototype.eq = function eq(num) {
- return this.cmp(num) === 0;
- };
- BN.red = function red(num) {
- return new Red(num);
- };
- BN.prototype.toRed = function toRed(ctx) {
- assert(!this.red, "Already a number in reduction context");
- assert(this.negative === 0, "red works only with positives");
- return ctx.convertTo(this)._forceRed(ctx);
- };
- BN.prototype.fromRed = function fromRed() {
- assert(this.red, "fromRed works only with numbers in reduction context");
- return this.red.convertFrom(this);
- };
- BN.prototype._forceRed = function _forceRed(ctx) {
- this.red = ctx;
- return this;
- };
- BN.prototype.forceRed = function forceRed(ctx) {
- assert(!this.red, "Already a number in reduction context");
- return this._forceRed(ctx);
- };
- BN.prototype.redAdd = function redAdd(num) {
- assert(this.red, "redAdd works only with red numbers");
- return this.red.add(this, num);
- };
- BN.prototype.redIAdd = function redIAdd(num) {
- assert(this.red, "redIAdd works only with red numbers");
- return this.red.iadd(this, num);
- };
- BN.prototype.redSub = function redSub(num) {
- assert(this.red, "redSub works only with red numbers");
- return this.red.sub(this, num);
- };
- BN.prototype.redISub = function redISub(num) {
- assert(this.red, "redISub works only with red numbers");
- return this.red.isub(this, num);
- };
- BN.prototype.redShl = function redShl(num) {
- assert(this.red, "redShl works only with red numbers");
- return this.red.shl(this, num);
- };
- BN.prototype.redMul = function redMul(num) {
- assert(this.red, "redMul works only with red numbers");
- this.red._verify2(this, num);
- return this.red.mul(this, num);
- };
- BN.prototype.redIMul = function redIMul(num) {
- assert(this.red, "redMul works only with red numbers");
- this.red._verify2(this, num);
- return this.red.imul(this, num);
- };
- BN.prototype.redSqr = function redSqr() {
- assert(this.red, "redSqr works only with red numbers");
- this.red._verify1(this);
- return this.red.sqr(this);
- };
- BN.prototype.redISqr = function redISqr() {
- assert(this.red, "redISqr works only with red numbers");
- this.red._verify1(this);
- return this.red.isqr(this);
- };
- BN.prototype.redSqrt = function redSqrt() {
- assert(this.red, "redSqrt works only with red numbers");
- this.red._verify1(this);
- return this.red.sqrt(this);
- };
- BN.prototype.redInvm = function redInvm() {
- assert(this.red, "redInvm works only with red numbers");
- this.red._verify1(this);
- return this.red.invm(this);
- };
- BN.prototype.redNeg = function redNeg() {
- assert(this.red, "redNeg works only with red numbers");
- this.red._verify1(this);
- return this.red.neg(this);
- };
- BN.prototype.redPow = function redPow(num) {
- assert(this.red && !num.red, "redPow(normalNum)");
- this.red._verify1(this);
- return this.red.pow(this, num);
- };
- var primes = {
- k256: null,
- p224: null,
- p192: null,
- p25519: null
- };
- function MPrime(name, p) {
- this.name = name;
- this.p = new BN(p, 16);
- this.n = this.p.bitLength();
- this.k = new BN(1).iushln(this.n).isub(this.p);
- this.tmp = this._tmp();
- }
- MPrime.prototype._tmp = function _tmp() {
- var tmp = new BN(null);
- tmp.words = new Array(Math.ceil(this.n / 13));
- return tmp;
- };
- MPrime.prototype.ireduce = function ireduce(num) {
- var r = num;
- var rlen;
- do {
- this.split(r, this.tmp);
- r = this.imulK(r);
- r = r.iadd(this.tmp);
- rlen = r.bitLength();
- } while (rlen > this.n);
- var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
- if (cmp === 0) {
- r.words[0] = 0;
- r.length = 1;
- } else if (cmp > 0) {
- r.isub(this.p);
- } else {
- if (r.strip !== undefined) {
- r.strip();
- } else {
- r._strip();
- }
- }
- return r;
- };
- MPrime.prototype.split = function split(input, out) {
- input.iushrn(this.n, 0, out);
- };
- MPrime.prototype.imulK = function imulK(num) {
- return num.imul(this.k);
- };
- function K256() {
- MPrime.call(this, "k256", "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f");
- }
- inherits(K256, MPrime);
- K256.prototype.split = function split(input, output) {
- var mask = 4194303;
- var outLen = Math.min(input.length, 9);
- for (var i = 0;i < outLen; i++) {
- output.words[i] = input.words[i];
- }
- output.length = outLen;
- if (input.length <= 9) {
- input.words[0] = 0;
- input.length = 1;
- return;
- }
- var prev = input.words[9];
- output.words[output.length++] = prev & mask;
- for (i = 10;i < input.length; i++) {
- var next = input.words[i] | 0;
- input.words[i - 10] = (next & mask) << 4 | prev >>> 22;
- prev = next;
- }
- prev >>>= 22;
- input.words[i - 10] = prev;
- if (prev === 0 && input.length > 10) {
- input.length -= 10;
- } else {
- input.length -= 9;
- }
- };
- K256.prototype.imulK = function imulK(num) {
- num.words[num.length] = 0;
- num.words[num.length + 1] = 0;
- num.length += 2;
- var lo = 0;
- for (var i = 0;i < num.length; i++) {
- var w = num.words[i] | 0;
- lo += w * 977;
- num.words[i] = lo & 67108863;
- lo = w * 64 + (lo / 67108864 | 0);
- }
- if (num.words[num.length - 1] === 0) {
- num.length--;
- if (num.words[num.length - 1] === 0) {
- num.length--;
- }
- }
- return num;
- };
- function P224() {
- MPrime.call(this, "p224", "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001");
- }
- inherits(P224, MPrime);
- function P192() {
- MPrime.call(this, "p192", "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff");
- }
- inherits(P192, MPrime);
- function P25519() {
- MPrime.call(this, "25519", "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed");
- }
- inherits(P25519, MPrime);
- P25519.prototype.imulK = function imulK(num) {
- var carry = 0;
- for (var i = 0;i < num.length; i++) {
- var hi = (num.words[i] | 0) * 19 + carry;
- var lo = hi & 67108863;
- hi >>>= 26;
- num.words[i] = lo;
- carry = hi;
- }
- if (carry !== 0) {
- num.words[num.length++] = carry;
- }
- return num;
- };
- BN._prime = function prime(name) {
- if (primes[name])
- return primes[name];
- var prime;
- if (name === "k256") {
- prime = new K256;
- } else if (name === "p224") {
- prime = new P224;
- } else if (name === "p192") {
- prime = new P192;
- } else if (name === "p25519") {
- prime = new P25519;
- } else {
- throw new Error("Unknown prime " + name);
- }
- primes[name] = prime;
- return prime;
- };
- function Red(m) {
- if (typeof m === "string") {
- var prime = BN._prime(m);
- this.m = prime.p;
- this.prime = prime;
- } else {
- assert(m.gtn(1), "modulus must be greater than 1");
- this.m = m;
- this.prime = null;
- }
- }
- Red.prototype._verify1 = function _verify1(a) {
- assert(a.negative === 0, "red works only with positives");
- assert(a.red, "red works only with red numbers");
- };
- Red.prototype._verify2 = function _verify2(a, b) {
- assert((a.negative | b.negative) === 0, "red works only with positives");
- assert(a.red && a.red === b.red, "red works only with red numbers");
- };
- Red.prototype.imod = function imod(a) {
- if (this.prime)
- return this.prime.ireduce(a)._forceRed(this);
- return a.umod(this.m)._forceRed(this);
- };
- Red.prototype.neg = function neg(a) {
- if (a.isZero()) {
- return a.clone();
- }
- return this.m.sub(a)._forceRed(this);
- };
- Red.prototype.add = function add(a, b) {
- this._verify2(a, b);
- var res = a.add(b);
- if (res.cmp(this.m) >= 0) {
- res.isub(this.m);
- }
- return res._forceRed(this);
- };
- Red.prototype.iadd = function iadd(a, b) {
- this._verify2(a, b);
- var res = a.iadd(b);
- if (res.cmp(this.m) >= 0) {
- res.isub(this.m);
- }
- return res;
- };
- Red.prototype.sub = function sub(a, b) {
- this._verify2(a, b);
- var res = a.sub(b);
- if (res.cmpn(0) < 0) {
- res.iadd(this.m);
- }
- return res._forceRed(this);
- };
- Red.prototype.isub = function isub(a, b) {
- this._verify2(a, b);
- var res = a.isub(b);
- if (res.cmpn(0) < 0) {
- res.iadd(this.m);
- }
- return res;
- };
- Red.prototype.shl = function shl(a, num) {
- this._verify1(a);
- return this.imod(a.ushln(num));
- };
- Red.prototype.imul = function imul(a, b) {
- this._verify2(a, b);
- return this.imod(a.imul(b));
- };
- Red.prototype.mul = function mul(a, b) {
- this._verify2(a, b);
- return this.imod(a.mul(b));
- };
- Red.prototype.isqr = function isqr(a) {
- return this.imul(a, a.clone());
- };
- Red.prototype.sqr = function sqr(a) {
- return this.mul(a, a);
- };
- Red.prototype.sqrt = function sqrt(a) {
- if (a.isZero())
- return a.clone();
- var mod3 = this.m.andln(3);
- assert(mod3 % 2 === 1);
- if (mod3 === 3) {
- var pow = this.m.add(new BN(1)).iushrn(2);
- return this.pow(a, pow);
- }
- var q = this.m.subn(1);
- var s = 0;
- while (!q.isZero() && q.andln(1) === 0) {
- s++;
- q.iushrn(1);
- }
- assert(!q.isZero());
- var one = new BN(1).toRed(this);
- var nOne = one.redNeg();
- var lpow = this.m.subn(1).iushrn(1);
- var z = this.m.bitLength();
- z = new BN(2 * z * z).toRed(this);
- while (this.pow(z, lpow).cmp(nOne) !== 0) {
- z.redIAdd(nOne);
- }
- var c = this.pow(z, q);
- var r = this.pow(a, q.addn(1).iushrn(1));
- var t = this.pow(a, q);
- var m = s;
- while (t.cmp(one) !== 0) {
- var tmp = t;
- for (var i = 0;tmp.cmp(one) !== 0; i++) {
- tmp = tmp.redSqr();
- }
- assert(i < m);
- var b = this.pow(c, new BN(1).iushln(m - i - 1));
- r = r.redMul(b);
- c = b.redSqr();
- t = t.redMul(c);
- m = i;
- }
- return r;
- };
- Red.prototype.invm = function invm(a) {
- var inv = a._invmp(this.m);
- if (inv.negative !== 0) {
- inv.negative = 0;
- return this.imod(inv).redNeg();
- } else {
- return this.imod(inv);
- }
- };
- Red.prototype.pow = function pow(a, num) {
- if (num.isZero())
- return new BN(1).toRed(this);
- if (num.cmpn(1) === 0)
- return a.clone();
- var windowSize = 4;
- var wnd = new Array(1 << windowSize);
- wnd[0] = new BN(1).toRed(this);
- wnd[1] = a;
- for (var i = 2;i < wnd.length; i++) {
- wnd[i] = this.mul(wnd[i - 1], a);
- }
- var res = wnd[0];
- var current = 0;
- var currentLen = 0;
- var start = num.bitLength() % 26;
- if (start === 0) {
- start = 26;
- }
- for (i = num.length - 1;i >= 0; i--) {
- var word = num.words[i];
- for (var j = start - 1;j >= 0; j--) {
- var bit = word >> j & 1;
- if (res !== wnd[0]) {
- res = this.sqr(res);
- }
- if (bit === 0 && current === 0) {
- currentLen = 0;
- continue;
- }
- current <<= 1;
- current |= bit;
- currentLen++;
- if (currentLen !== windowSize && (i !== 0 || j !== 0))
- continue;
- res = this.mul(res, wnd[current]);
- currentLen = 0;
- current = 0;
- }
- start = 26;
- }
- return res;
- };
- Red.prototype.convertTo = function convertTo(num) {
- var r = num.umod(this.m);
- return r === num ? r.clone() : r;
- };
- Red.prototype.convertFrom = function convertFrom(num) {
- var res = num.clone();
- res.red = null;
- return res;
- };
- BN.mont = function mont(num) {
- return new Mont(num);
- };
- function Mont(m) {
- Red.call(this, m);
- this.shift = this.m.bitLength();
- if (this.shift % 26 !== 0) {
- this.shift += 26 - this.shift % 26;
- }
- this.r = new BN(1).iushln(this.shift);
- this.r2 = this.imod(this.r.sqr());
- this.rinv = this.r._invmp(this.m);
- this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);
- this.minv = this.minv.umod(this.r);
- this.minv = this.r.sub(this.minv);
- }
- inherits(Mont, Red);
- Mont.prototype.convertTo = function convertTo(num) {
- return this.imod(num.ushln(this.shift));
- };
- Mont.prototype.convertFrom = function convertFrom(num) {
- var r = this.imod(num.mul(this.rinv));
- r.red = null;
- return r;
- };
- Mont.prototype.imul = function imul(a, b) {
- if (a.isZero() || b.isZero()) {
- a.words[0] = 0;
- a.length = 1;
- return a;
- }
- var t = a.imul(b);
- var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
- var u = t.isub(c).iushrn(this.shift);
- var res = u;
- if (u.cmp(this.m) >= 0) {
- res = u.isub(this.m);
- } else if (u.cmpn(0) < 0) {
- res = u.iadd(this.m);
- }
- return res._forceRed(this);
- };
- Mont.prototype.mul = function mul(a, b) {
- if (a.isZero() || b.isZero())
- return new BN(0)._forceRed(this);
- var t = a.mul(b);
- var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
- var u = t.isub(c).iushrn(this.shift);
- var res = u;
- if (u.cmp(this.m) >= 0) {
- res = u.isub(this.m);
- } else if (u.cmpn(0) < 0) {
- res = u.iadd(this.m);
- }
- return res._forceRed(this);
- };
- Mont.prototype.invm = function invm(a) {
- var res = this.imod(a._invmp(this.m).mul(this.r2));
- return res._forceRed(this);
- };
- })(typeof module === "undefined" || module, exports);
-});
-
-// ../eve/node_modules/inherits/inherits_browser.js
-var require_inherits_browser = __commonJS((exports, module) => {
- if (typeof Object.create === "function") {
- module.exports = function inherits(ctor, superCtor) {
- if (superCtor) {
- ctor.super_ = superCtor;
- ctor.prototype = Object.create(superCtor.prototype, {
- constructor: {
- value: ctor,
- enumerable: false,
- writable: true,
- configurable: true
- }
- });
- }
- };
- } else {
- module.exports = function inherits(ctor, superCtor) {
- if (superCtor) {
- ctor.super_ = superCtor;
- var TempCtor = function() {};
- TempCtor.prototype = superCtor.prototype;
- ctor.prototype = new TempCtor;
- ctor.prototype.constructor = ctor;
- }
- };
- }
-});
-
-// ../eve/node_modules/inherits/inherits.js
-var require_inherits = __commonJS((exports, module) => {
- try {
- util = __require("util");
- if (typeof util.inherits !== "function")
- throw "";
- module.exports = util.inherits;
- } catch (e) {
- module.exports = require_inherits_browser();
- }
- var util;
-});
-
-// ../eve/node_modules/safer-buffer/safer.js
-var require_safer = __commonJS((exports, module) => {
- var buffer = __require("buffer");
- var Buffer2 = buffer.Buffer;
- var safer = {};
- var key;
- for (key in buffer) {
- if (!buffer.hasOwnProperty(key))
- continue;
- if (key === "SlowBuffer" || key === "Buffer")
- continue;
- safer[key] = buffer[key];
- }
- var Safer = safer.Buffer = {};
- for (key in Buffer2) {
- if (!Buffer2.hasOwnProperty(key))
- continue;
- if (key === "allocUnsafe" || key === "allocUnsafeSlow")
- continue;
- Safer[key] = Buffer2[key];
- }
- safer.Buffer.prototype = Buffer2.prototype;
- if (!Safer.from || Safer.from === Uint8Array.from) {
- Safer.from = function(value, encodingOrOffset, length) {
- if (typeof value === "number") {
- throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value);
- }
- if (value && typeof value.length === "undefined") {
- throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value);
- }
- return Buffer2(value, encodingOrOffset, length);
- };
- }
- if (!Safer.alloc) {
- Safer.alloc = function(size, fill, encoding) {
- if (typeof size !== "number") {
- throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size);
- }
- if (size < 0 || size >= 2 * (1 << 30)) {
- throw new RangeError('The value "' + size + '" is invalid for option "size"');
- }
- var buf = Buffer2(size);
- if (!fill || fill.length === 0) {
- buf.fill(0);
- } else if (typeof encoding === "string") {
- buf.fill(fill, encoding);
- } else {
- buf.fill(fill);
- }
- return buf;
- };
- }
- if (!safer.kStringMaxLength) {
- try {
- safer.kStringMaxLength = process.binding("buffer").kStringMaxLength;
- } catch (e) {}
- }
- if (!safer.constants) {
- safer.constants = {
- MAX_LENGTH: safer.kMaxLength
- };
- if (safer.kStringMaxLength) {
- safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength;
- }
- }
- module.exports = safer;
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/reporter.js
-var require_reporter = __commonJS((exports) => {
- var inherits = require_inherits();
- function Reporter(options2) {
- this._reporterState = {
- obj: null,
- path: [],
- options: options2 || {},
- errors: []
- };
- }
- exports.Reporter = Reporter;
- Reporter.prototype.isError = function isError(obj) {
- return obj instanceof ReporterError;
- };
- Reporter.prototype.save = function save() {
- const state = this._reporterState;
- return { obj: state.obj, pathLen: state.path.length };
- };
- Reporter.prototype.restore = function restore(data) {
- const state = this._reporterState;
- state.obj = data.obj;
- state.path = state.path.slice(0, data.pathLen);
- };
- Reporter.prototype.enterKey = function enterKey(key) {
- return this._reporterState.path.push(key);
- };
- Reporter.prototype.exitKey = function exitKey(index2) {
- const state = this._reporterState;
- state.path = state.path.slice(0, index2 - 1);
- };
- Reporter.prototype.leaveKey = function leaveKey(index2, key, value) {
- const state = this._reporterState;
- this.exitKey(index2);
- if (state.obj !== null)
- state.obj[key] = value;
- };
- Reporter.prototype.path = function path() {
- return this._reporterState.path.join("/");
- };
- Reporter.prototype.enterObject = function enterObject() {
- const state = this._reporterState;
- const prev = state.obj;
- state.obj = {};
- return prev;
- };
- Reporter.prototype.leaveObject = function leaveObject(prev) {
- const state = this._reporterState;
- const now = state.obj;
- state.obj = prev;
- return now;
- };
- Reporter.prototype.error = function error(msg) {
- let err;
- const state = this._reporterState;
- const inherited = msg instanceof ReporterError;
- if (inherited) {
- err = msg;
- } else {
- err = new ReporterError(state.path.map(function(elem) {
- return "[" + JSON.stringify(elem) + "]";
- }).join(""), msg.message || msg, msg.stack);
- }
- if (!state.options.partial)
- throw err;
- if (!inherited)
- state.errors.push(err);
- return err;
- };
- Reporter.prototype.wrapResult = function wrapResult(result) {
- const state = this._reporterState;
- if (!state.options.partial)
- return result;
- return {
- result: this.isError(result) ? null : result,
- errors: state.errors
- };
- };
- function ReporterError(path, msg) {
- this.path = path;
- this.rethrow(msg);
- }
- inherits(ReporterError, Error);
- ReporterError.prototype.rethrow = function rethrow(msg) {
- this.message = msg + " at: " + (this.path || "(shallow)");
- if (Error.captureStackTrace)
- Error.captureStackTrace(this, ReporterError);
- if (!this.stack) {
- try {
- throw new Error(this.message);
- } catch (e) {
- this.stack = e.stack;
- }
- }
- return this;
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/buffer.js
-var require_buffer = __commonJS((exports) => {
- var inherits = require_inherits();
- var Reporter = require_reporter().Reporter;
- var Buffer2 = require_safer().Buffer;
- function DecoderBuffer(base, options2) {
- Reporter.call(this, options2);
- if (!Buffer2.isBuffer(base)) {
- this.error("Input not Buffer");
- return;
- }
- this.base = base;
- this.offset = 0;
- this.length = base.length;
- }
- inherits(DecoderBuffer, Reporter);
- exports.DecoderBuffer = DecoderBuffer;
- DecoderBuffer.isDecoderBuffer = function isDecoderBuffer(data) {
- if (data instanceof DecoderBuffer) {
- return true;
- }
- const isCompatible = typeof data === "object" && Buffer2.isBuffer(data.base) && data.constructor.name === "DecoderBuffer" && typeof data.offset === "number" && typeof data.length === "number" && typeof data.save === "function" && typeof data.restore === "function" && typeof data.isEmpty === "function" && typeof data.readUInt8 === "function" && typeof data.skip === "function" && typeof data.raw === "function";
- return isCompatible;
- };
- DecoderBuffer.prototype.save = function save() {
- return { offset: this.offset, reporter: Reporter.prototype.save.call(this) };
- };
- DecoderBuffer.prototype.restore = function restore(save) {
- const res = new DecoderBuffer(this.base);
- res.offset = save.offset;
- res.length = this.offset;
- this.offset = save.offset;
- Reporter.prototype.restore.call(this, save.reporter);
- return res;
- };
- DecoderBuffer.prototype.isEmpty = function isEmpty() {
- return this.offset === this.length;
- };
- DecoderBuffer.prototype.readUInt8 = function readUInt8(fail) {
- if (this.offset + 1 <= this.length)
- return this.base.readUInt8(this.offset++, true);
- else
- return this.error(fail || "DecoderBuffer overrun");
- };
- DecoderBuffer.prototype.skip = function skip(bytes, fail) {
- if (!(this.offset + bytes <= this.length))
- return this.error(fail || "DecoderBuffer overrun");
- const res = new DecoderBuffer(this.base);
- res._reporterState = this._reporterState;
- res.offset = this.offset;
- res.length = this.offset + bytes;
- this.offset += bytes;
- return res;
- };
- DecoderBuffer.prototype.raw = function raw(save) {
- return this.base.slice(save ? save.offset : this.offset, this.length);
- };
- function EncoderBuffer(value, reporter) {
- if (Array.isArray(value)) {
- this.length = 0;
- this.value = value.map(function(item) {
- if (!EncoderBuffer.isEncoderBuffer(item))
- item = new EncoderBuffer(item, reporter);
- this.length += item.length;
- return item;
- }, this);
- } else if (typeof value === "number") {
- if (!(0 <= value && value <= 255))
- return reporter.error("non-byte EncoderBuffer value");
- this.value = value;
- this.length = 1;
- } else if (typeof value === "string") {
- this.value = value;
- this.length = Buffer2.byteLength(value);
- } else if (Buffer2.isBuffer(value)) {
- this.value = value;
- this.length = value.length;
- } else {
- return reporter.error("Unsupported type: " + typeof value);
- }
- }
- exports.EncoderBuffer = EncoderBuffer;
- EncoderBuffer.isEncoderBuffer = function isEncoderBuffer(data) {
- if (data instanceof EncoderBuffer) {
- return true;
- }
- const isCompatible = typeof data === "object" && data.constructor.name === "EncoderBuffer" && typeof data.length === "number" && typeof data.join === "function";
- return isCompatible;
- };
- EncoderBuffer.prototype.join = function join(out, offset) {
- if (!out)
- out = Buffer2.alloc(this.length);
- if (!offset)
- offset = 0;
- if (this.length === 0)
- return out;
- if (Array.isArray(this.value)) {
- this.value.forEach(function(item) {
- item.join(out, offset);
- offset += item.length;
- });
- } else {
- if (typeof this.value === "number")
- out[offset] = this.value;
- else if (typeof this.value === "string")
- out.write(this.value, offset);
- else if (Buffer2.isBuffer(this.value))
- this.value.copy(out, offset);
- offset += this.length;
- }
- return out;
- };
-});
-
-// ../eve/node_modules/minimalistic-assert/index.js
-var require_minimalistic_assert = __commonJS((exports, module) => {
- module.exports = assert;
- function assert(val, msg) {
- if (!val)
- throw new Error(msg || "Assertion failed");
- }
- assert.equal = function assertEqual(l, r, msg) {
- if (l != r)
- throw new Error(msg || "Assertion failed: " + l + " != " + r);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/node.js
-var require_node = __commonJS((exports, module) => {
- var Reporter = require_reporter().Reporter;
- var EncoderBuffer = require_buffer().EncoderBuffer;
- var DecoderBuffer = require_buffer().DecoderBuffer;
- var assert = require_minimalistic_assert();
- var tags = [
- "seq",
- "seqof",
- "set",
- "setof",
- "objid",
- "bool",
- "gentime",
- "utctime",
- "null_",
- "enum",
- "int",
- "objDesc",
- "bitstr",
- "bmpstr",
- "charstr",
- "genstr",
- "graphstr",
- "ia5str",
- "iso646str",
- "numstr",
- "octstr",
- "printstr",
- "t61str",
- "unistr",
- "utf8str",
- "videostr"
- ];
- var methods = [
- "key",
- "obj",
- "use",
- "optional",
- "explicit",
- "implicit",
- "def",
- "choice",
- "any",
- "contains"
- ].concat(tags);
- var overrided = [
- "_peekTag",
- "_decodeTag",
- "_use",
- "_decodeStr",
- "_decodeObjid",
- "_decodeTime",
- "_decodeNull",
- "_decodeInt",
- "_decodeBool",
- "_decodeList",
- "_encodeComposite",
- "_encodeStr",
- "_encodeObjid",
- "_encodeTime",
- "_encodeNull",
- "_encodeInt",
- "_encodeBool"
- ];
- function Node(enc, parent, name) {
- const state = {};
- this._baseState = state;
- state.name = name;
- state.enc = enc;
- state.parent = parent || null;
- state.children = null;
- state.tag = null;
- state.args = null;
- state.reverseArgs = null;
- state.choice = null;
- state.optional = false;
- state.any = false;
- state.obj = false;
- state.use = null;
- state.useDecoder = null;
- state.key = null;
- state["default"] = null;
- state.explicit = null;
- state.implicit = null;
- state.contains = null;
- if (!state.parent) {
- state.children = [];
- this._wrap();
- }
- }
- module.exports = Node;
- var stateProps = [
- "enc",
- "parent",
- "children",
- "tag",
- "args",
- "reverseArgs",
- "choice",
- "optional",
- "any",
- "obj",
- "use",
- "alteredUse",
- "key",
- "default",
- "explicit",
- "implicit",
- "contains"
- ];
- Node.prototype.clone = function clone() {
- const state = this._baseState;
- const cstate = {};
- stateProps.forEach(function(prop) {
- cstate[prop] = state[prop];
- });
- const res = new this.constructor(cstate.parent);
- res._baseState = cstate;
- return res;
- };
- Node.prototype._wrap = function wrap() {
- const state = this._baseState;
- methods.forEach(function(method) {
- this[method] = function _wrappedMethod() {
- const clone = new this.constructor(this);
- state.children.push(clone);
- return clone[method].apply(clone, arguments);
- };
- }, this);
- };
- Node.prototype._init = function init(body) {
- const state = this._baseState;
- assert(state.parent === null);
- body.call(this);
- state.children = state.children.filter(function(child) {
- return child._baseState.parent === this;
- }, this);
- assert.equal(state.children.length, 1, "Root node can have only one child");
- };
- Node.prototype._useArgs = function useArgs(args) {
- const state = this._baseState;
- const children = args.filter(function(arg) {
- return arg instanceof this.constructor;
- }, this);
- args = args.filter(function(arg) {
- return !(arg instanceof this.constructor);
- }, this);
- if (children.length !== 0) {
- assert(state.children === null);
- state.children = children;
- children.forEach(function(child) {
- child._baseState.parent = this;
- }, this);
- }
- if (args.length !== 0) {
- assert(state.args === null);
- state.args = args;
- state.reverseArgs = args.map(function(arg) {
- if (typeof arg !== "object" || arg.constructor !== Object)
- return arg;
- const res = {};
- Object.keys(arg).forEach(function(key) {
- if (key == (key | 0))
- key |= 0;
- const value = arg[key];
- res[value] = key;
- });
- return res;
- });
- }
- };
- overrided.forEach(function(method) {
- Node.prototype[method] = function _overrided() {
- const state = this._baseState;
- throw new Error(method + " not implemented for encoding: " + state.enc);
- };
- });
- tags.forEach(function(tag) {
- Node.prototype[tag] = function _tagMethod() {
- const state = this._baseState;
- const args = Array.prototype.slice.call(arguments);
- assert(state.tag === null);
- state.tag = tag;
- this._useArgs(args);
- return this;
- };
- });
- Node.prototype.use = function use(item) {
- assert(item);
- const state = this._baseState;
- assert(state.use === null);
- state.use = item;
- return this;
- };
- Node.prototype.optional = function optional() {
- const state = this._baseState;
- state.optional = true;
- return this;
- };
- Node.prototype.def = function def(val) {
- const state = this._baseState;
- assert(state["default"] === null);
- state["default"] = val;
- state.optional = true;
- return this;
- };
- Node.prototype.explicit = function explicit(num) {
- const state = this._baseState;
- assert(state.explicit === null && state.implicit === null);
- state.explicit = num;
- return this;
- };
- Node.prototype.implicit = function implicit(num) {
- const state = this._baseState;
- assert(state.explicit === null && state.implicit === null);
- state.implicit = num;
- return this;
- };
- Node.prototype.obj = function obj() {
- const state = this._baseState;
- const args = Array.prototype.slice.call(arguments);
- state.obj = true;
- if (args.length !== 0)
- this._useArgs(args);
- return this;
- };
- Node.prototype.key = function key(newKey) {
- const state = this._baseState;
- assert(state.key === null);
- state.key = newKey;
- return this;
- };
- Node.prototype.any = function any() {
- const state = this._baseState;
- state.any = true;
- return this;
- };
- Node.prototype.choice = function choice(obj) {
- const state = this._baseState;
- assert(state.choice === null);
- state.choice = obj;
- this._useArgs(Object.keys(obj).map(function(key) {
- return obj[key];
- }));
- return this;
- };
- Node.prototype.contains = function contains(item) {
- const state = this._baseState;
- assert(state.use === null);
- state.contains = item;
- return this;
- };
- Node.prototype._decode = function decode(input, options2) {
- const state = this._baseState;
- if (state.parent === null)
- return input.wrapResult(state.children[0]._decode(input, options2));
- let result = state["default"];
- let present = true;
- let prevKey = null;
- if (state.key !== null)
- prevKey = input.enterKey(state.key);
- if (state.optional) {
- let tag = null;
- if (state.explicit !== null)
- tag = state.explicit;
- else if (state.implicit !== null)
- tag = state.implicit;
- else if (state.tag !== null)
- tag = state.tag;
- if (tag === null && !state.any) {
- const save = input.save();
- try {
- if (state.choice === null)
- this._decodeGeneric(state.tag, input, options2);
- else
- this._decodeChoice(input, options2);
- present = true;
- } catch (e) {
- present = false;
- }
- input.restore(save);
- } else {
- present = this._peekTag(input, tag, state.any);
- if (input.isError(present))
- return present;
- }
- }
- let prevObj;
- if (state.obj && present)
- prevObj = input.enterObject();
- if (present) {
- if (state.explicit !== null) {
- const explicit = this._decodeTag(input, state.explicit);
- if (input.isError(explicit))
- return explicit;
- input = explicit;
- }
- const start = input.offset;
- if (state.use === null && state.choice === null) {
- let save;
- if (state.any)
- save = input.save();
- const body = this._decodeTag(input, state.implicit !== null ? state.implicit : state.tag, state.any);
- if (input.isError(body))
- return body;
- if (state.any)
- result = input.raw(save);
- else
- input = body;
- }
- if (options2 && options2.track && state.tag !== null)
- options2.track(input.path(), start, input.length, "tagged");
- if (options2 && options2.track && state.tag !== null)
- options2.track(input.path(), input.offset, input.length, "content");
- if (state.any) {} else if (state.choice === null) {
- result = this._decodeGeneric(state.tag, input, options2);
- } else {
- result = this._decodeChoice(input, options2);
- }
- if (input.isError(result))
- return result;
- if (!state.any && state.choice === null && state.children !== null) {
- state.children.forEach(function decodeChildren(child) {
- child._decode(input, options2);
- });
- }
- if (state.contains && (state.tag === "octstr" || state.tag === "bitstr")) {
- const data = new DecoderBuffer(result);
- result = this._getUse(state.contains, input._reporterState.obj)._decode(data, options2);
- }
- }
- if (state.obj && present)
- result = input.leaveObject(prevObj);
- if (state.key !== null && (result !== null || present === true))
- input.leaveKey(prevKey, state.key, result);
- else if (prevKey !== null)
- input.exitKey(prevKey);
- return result;
- };
- Node.prototype._decodeGeneric = function decodeGeneric(tag, input, options2) {
- const state = this._baseState;
- if (tag === "seq" || tag === "set")
- return null;
- if (tag === "seqof" || tag === "setof")
- return this._decodeList(input, tag, state.args[0], options2);
- else if (/str$/.test(tag))
- return this._decodeStr(input, tag, options2);
- else if (tag === "objid" && state.args)
- return this._decodeObjid(input, state.args[0], state.args[1], options2);
- else if (tag === "objid")
- return this._decodeObjid(input, null, null, options2);
- else if (tag === "gentime" || tag === "utctime")
- return this._decodeTime(input, tag, options2);
- else if (tag === "null_")
- return this._decodeNull(input, options2);
- else if (tag === "bool")
- return this._decodeBool(input, options2);
- else if (tag === "objDesc")
- return this._decodeStr(input, tag, options2);
- else if (tag === "int" || tag === "enum")
- return this._decodeInt(input, state.args && state.args[0], options2);
- if (state.use !== null) {
- return this._getUse(state.use, input._reporterState.obj)._decode(input, options2);
- } else {
- return input.error("unknown tag: " + tag);
- }
- };
- Node.prototype._getUse = function _getUse(entity, obj) {
- const state = this._baseState;
- state.useDecoder = this._use(entity, obj);
- assert(state.useDecoder._baseState.parent === null);
- state.useDecoder = state.useDecoder._baseState.children[0];
- if (state.implicit !== state.useDecoder._baseState.implicit) {
- state.useDecoder = state.useDecoder.clone();
- state.useDecoder._baseState.implicit = state.implicit;
- }
- return state.useDecoder;
- };
- Node.prototype._decodeChoice = function decodeChoice(input, options2) {
- const state = this._baseState;
- let result = null;
- let match = false;
- Object.keys(state.choice).some(function(key) {
- const save = input.save();
- const node = state.choice[key];
- try {
- const value = node._decode(input, options2);
- if (input.isError(value))
- return false;
- result = { type: key, value };
- match = true;
- } catch (e) {
- input.restore(save);
- return false;
- }
- return true;
- }, this);
- if (!match)
- return input.error("Choice not matched");
- return result;
- };
- Node.prototype._createEncoderBuffer = function createEncoderBuffer(data) {
- return new EncoderBuffer(data, this.reporter);
- };
- Node.prototype._encode = function encode(data, reporter, parent) {
- const state = this._baseState;
- if (state["default"] !== null && state["default"] === data)
- return;
- const result = this._encodeValue(data, reporter, parent);
- if (result === undefined)
- return;
- if (this._skipDefault(result, reporter, parent))
- return;
- return result;
- };
- Node.prototype._encodeValue = function encode(data, reporter, parent) {
- const state = this._baseState;
- if (state.parent === null)
- return state.children[0]._encode(data, reporter || new Reporter);
- let result = null;
- this.reporter = reporter;
- if (state.optional && data === undefined) {
- if (state["default"] !== null)
- data = state["default"];
- else
- return;
- }
- let content = null;
- let primitive = false;
- if (state.any) {
- result = this._createEncoderBuffer(data);
- } else if (state.choice) {
- result = this._encodeChoice(data, reporter);
- } else if (state.contains) {
- content = this._getUse(state.contains, parent)._encode(data, reporter);
- primitive = true;
- } else if (state.children) {
- content = state.children.map(function(child) {
- if (child._baseState.tag === "null_")
- return child._encode(null, reporter, data);
- if (child._baseState.key === null)
- return reporter.error("Child should have a key");
- const prevKey = reporter.enterKey(child._baseState.key);
- if (typeof data !== "object")
- return reporter.error("Child expected, but input is not object");
- const res = child._encode(data[child._baseState.key], reporter, data);
- reporter.leaveKey(prevKey);
- return res;
- }, this).filter(function(child) {
- return child;
- });
- content = this._createEncoderBuffer(content);
- } else {
- if (state.tag === "seqof" || state.tag === "setof") {
- if (!(state.args && state.args.length === 1))
- return reporter.error("Too many args for : " + state.tag);
- if (!Array.isArray(data))
- return reporter.error("seqof/setof, but data is not Array");
- const child = this.clone();
- child._baseState.implicit = null;
- content = this._createEncoderBuffer(data.map(function(item) {
- const state2 = this._baseState;
- return this._getUse(state2.args[0], data)._encode(item, reporter);
- }, child));
- } else if (state.use !== null) {
- result = this._getUse(state.use, parent)._encode(data, reporter);
- } else {
- content = this._encodePrimitive(state.tag, data);
- primitive = true;
- }
- }
- if (!state.any && state.choice === null) {
- const tag = state.implicit !== null ? state.implicit : state.tag;
- const cls = state.implicit === null ? "universal" : "context";
- if (tag === null) {
- if (state.use === null)
- reporter.error("Tag could be omitted only for .use()");
- } else {
- if (state.use === null)
- result = this._encodeComposite(tag, primitive, cls, content);
- }
- }
- if (state.explicit !== null)
- result = this._encodeComposite(state.explicit, false, "context", result);
- return result;
- };
- Node.prototype._encodeChoice = function encodeChoice(data, reporter) {
- const state = this._baseState;
- const node = state.choice[data.type];
- if (!node) {
- assert(false, data.type + " not found in " + JSON.stringify(Object.keys(state.choice)));
- }
- return node._encode(data.value, reporter);
- };
- Node.prototype._encodePrimitive = function encodePrimitive(tag, data) {
- const state = this._baseState;
- if (/str$/.test(tag))
- return this._encodeStr(data, tag);
- else if (tag === "objid" && state.args)
- return this._encodeObjid(data, state.reverseArgs[0], state.args[1]);
- else if (tag === "objid")
- return this._encodeObjid(data, null, null);
- else if (tag === "gentime" || tag === "utctime")
- return this._encodeTime(data, tag);
- else if (tag === "null_")
- return this._encodeNull();
- else if (tag === "int" || tag === "enum")
- return this._encodeInt(data, state.args && state.reverseArgs[0]);
- else if (tag === "bool")
- return this._encodeBool(data);
- else if (tag === "objDesc")
- return this._encodeStr(data, tag);
- else
- throw new Error("Unsupported tag: " + tag);
- };
- Node.prototype._isNumstr = function isNumstr(str) {
- return /^[0-9 ]*$/.test(str);
- };
- Node.prototype._isPrintstr = function isPrintstr(str) {
- return /^[A-Za-z0-9 '()+,-./:=?]*$/.test(str);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/constants/der.js
-var require_der = __commonJS((exports) => {
- function reverse(map) {
- const res = {};
- Object.keys(map).forEach(function(key) {
- if ((key | 0) == key)
- key = key | 0;
- const value = map[key];
- res[value] = key;
- });
- return res;
- }
- exports.tagClass = {
- 0: "universal",
- 1: "application",
- 2: "context",
- 3: "private"
- };
- exports.tagClassByName = reverse(exports.tagClass);
- exports.tag = {
- 0: "end",
- 1: "bool",
- 2: "int",
- 3: "bitstr",
- 4: "octstr",
- 5: "null_",
- 6: "objid",
- 7: "objDesc",
- 8: "external",
- 9: "real",
- 10: "enum",
- 11: "embed",
- 12: "utf8str",
- 13: "relativeOid",
- 16: "seq",
- 17: "set",
- 18: "numstr",
- 19: "printstr",
- 20: "t61str",
- 21: "videostr",
- 22: "ia5str",
- 23: "utctime",
- 24: "gentime",
- 25: "graphstr",
- 26: "iso646str",
- 27: "genstr",
- 28: "unistr",
- 29: "charstr",
- 30: "bmpstr"
- };
- exports.tagByName = reverse(exports.tag);
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/encoders/der.js
-var require_der2 = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var Buffer2 = require_safer().Buffer;
- var Node = require_node();
- var der = require_der();
- function DEREncoder(entity) {
- this.enc = "der";
- this.name = entity.name;
- this.entity = entity;
- this.tree = new DERNode;
- this.tree._init(entity.body);
- }
- module.exports = DEREncoder;
- DEREncoder.prototype.encode = function encode(data, reporter) {
- return this.tree._encode(data, reporter).join();
- };
- function DERNode(parent) {
- Node.call(this, "der", parent);
- }
- inherits(DERNode, Node);
- DERNode.prototype._encodeComposite = function encodeComposite(tag, primitive, cls, content) {
- const encodedTag = encodeTag(tag, primitive, cls, this.reporter);
- if (content.length < 128) {
- const header2 = Buffer2.alloc(2);
- header2[0] = encodedTag;
- header2[1] = content.length;
- return this._createEncoderBuffer([header2, content]);
- }
- let lenOctets = 1;
- for (let i = content.length;i >= 256; i >>= 8)
- lenOctets++;
- const header = Buffer2.alloc(1 + 1 + lenOctets);
- header[0] = encodedTag;
- header[1] = 128 | lenOctets;
- for (let i = 1 + lenOctets, j = content.length;j > 0; i--, j >>= 8)
- header[i] = j & 255;
- return this._createEncoderBuffer([header, content]);
- };
- DERNode.prototype._encodeStr = function encodeStr(str, tag) {
- if (tag === "bitstr") {
- return this._createEncoderBuffer([str.unused | 0, str.data]);
- } else if (tag === "bmpstr") {
- const buf = Buffer2.alloc(str.length * 2);
- for (let i = 0;i < str.length; i++) {
- buf.writeUInt16BE(str.charCodeAt(i), i * 2);
- }
- return this._createEncoderBuffer(buf);
- } else if (tag === "numstr") {
- if (!this._isNumstr(str)) {
- return this.reporter.error("Encoding of string type: numstr supports " + "only digits and space");
- }
- return this._createEncoderBuffer(str);
- } else if (tag === "printstr") {
- if (!this._isPrintstr(str)) {
- return this.reporter.error("Encoding of string type: printstr supports " + "only latin upper and lower case letters, " + "digits, space, apostrophe, left and rigth " + "parenthesis, plus sign, comma, hyphen, " + "dot, slash, colon, equal sign, " + "question mark");
- }
- return this._createEncoderBuffer(str);
- } else if (/str$/.test(tag)) {
- return this._createEncoderBuffer(str);
- } else if (tag === "objDesc") {
- return this._createEncoderBuffer(str);
- } else {
- return this.reporter.error("Encoding of string type: " + tag + " unsupported");
- }
- };
- DERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) {
- if (typeof id === "string") {
- if (!values)
- return this.reporter.error("string objid given, but no values map found");
- if (!values.hasOwnProperty(id))
- return this.reporter.error("objid not found in values map");
- id = values[id].split(/[\s.]+/g);
- for (let i = 0;i < id.length; i++)
- id[i] |= 0;
- } else if (Array.isArray(id)) {
- id = id.slice();
- for (let i = 0;i < id.length; i++)
- id[i] |= 0;
- }
- if (!Array.isArray(id)) {
- return this.reporter.error("objid() should be either array or string, " + "got: " + JSON.stringify(id));
- }
- if (!relative) {
- if (id[1] >= 40)
- return this.reporter.error("Second objid identifier OOB");
- id.splice(0, 2, id[0] * 40 + id[1]);
- }
- let size = 0;
- for (let i = 0;i < id.length; i++) {
- let ident = id[i];
- for (size++;ident >= 128; ident >>= 7)
- size++;
- }
- const objid = Buffer2.alloc(size);
- let offset = objid.length - 1;
- for (let i = id.length - 1;i >= 0; i--) {
- let ident = id[i];
- objid[offset--] = ident & 127;
- while ((ident >>= 7) > 0)
- objid[offset--] = 128 | ident & 127;
- }
- return this._createEncoderBuffer(objid);
- };
- function two(num) {
- if (num < 10)
- return "0" + num;
- else
- return num;
- }
- DERNode.prototype._encodeTime = function encodeTime(time, tag) {
- let str;
- const date = new Date(time);
- if (tag === "gentime") {
- str = [
- two(date.getUTCFullYear()),
- two(date.getUTCMonth() + 1),
- two(date.getUTCDate()),
- two(date.getUTCHours()),
- two(date.getUTCMinutes()),
- two(date.getUTCSeconds()),
- "Z"
- ].join("");
- } else if (tag === "utctime") {
- str = [
- two(date.getUTCFullYear() % 100),
- two(date.getUTCMonth() + 1),
- two(date.getUTCDate()),
- two(date.getUTCHours()),
- two(date.getUTCMinutes()),
- two(date.getUTCSeconds()),
- "Z"
- ].join("");
- } else {
- this.reporter.error("Encoding " + tag + " time is not supported yet");
- }
- return this._encodeStr(str, "octstr");
- };
- DERNode.prototype._encodeNull = function encodeNull() {
- return this._createEncoderBuffer("");
- };
- DERNode.prototype._encodeInt = function encodeInt(num, values) {
- if (typeof num === "string") {
- if (!values)
- return this.reporter.error("String int or enum given, but no values map");
- if (!values.hasOwnProperty(num)) {
- return this.reporter.error("Values map doesn't contain: " + JSON.stringify(num));
- }
- num = values[num];
- }
- if (typeof num !== "number" && !Buffer2.isBuffer(num)) {
- const numArray = num.toArray();
- if (!num.sign && numArray[0] & 128) {
- numArray.unshift(0);
- }
- num = Buffer2.from(numArray);
- }
- if (Buffer2.isBuffer(num)) {
- let size2 = num.length;
- if (num.length === 0)
- size2++;
- const out2 = Buffer2.alloc(size2);
- num.copy(out2);
- if (num.length === 0)
- out2[0] = 0;
- return this._createEncoderBuffer(out2);
- }
- if (num < 128)
- return this._createEncoderBuffer(num);
- if (num < 256)
- return this._createEncoderBuffer([0, num]);
- let size = 1;
- for (let i = num;i >= 256; i >>= 8)
- size++;
- const out = new Array(size);
- for (let i = out.length - 1;i >= 0; i--) {
- out[i] = num & 255;
- num >>= 8;
- }
- if (out[0] & 128) {
- out.unshift(0);
- }
- return this._createEncoderBuffer(Buffer2.from(out));
- };
- DERNode.prototype._encodeBool = function encodeBool(value) {
- return this._createEncoderBuffer(value ? 255 : 0);
- };
- DERNode.prototype._use = function use(entity, obj) {
- if (typeof entity === "function")
- entity = entity(obj);
- return entity._getEncoder("der").tree;
- };
- DERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) {
- const state = this._baseState;
- let i;
- if (state["default"] === null)
- return false;
- const data = dataBuffer.join();
- if (state.defaultBuffer === undefined)
- state.defaultBuffer = this._encodeValue(state["default"], reporter, parent).join();
- if (data.length !== state.defaultBuffer.length)
- return false;
- for (i = 0;i < data.length; i++)
- if (data[i] !== state.defaultBuffer[i])
- return false;
- return true;
- };
- function encodeTag(tag, primitive, cls, reporter) {
- let res;
- if (tag === "seqof")
- tag = "seq";
- else if (tag === "setof")
- tag = "set";
- if (der.tagByName.hasOwnProperty(tag))
- res = der.tagByName[tag];
- else if (typeof tag === "number" && (tag | 0) === tag)
- res = tag;
- else
- return reporter.error("Unknown tag: " + tag);
- if (res >= 31)
- return reporter.error("Multi-octet tag encoding unsupported");
- if (!primitive)
- res |= 32;
- res |= der.tagClassByName[cls || "universal"] << 6;
- return res;
- }
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/encoders/pem.js
-var require_pem = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var DEREncoder = require_der2();
- function PEMEncoder(entity) {
- DEREncoder.call(this, entity);
- this.enc = "pem";
- }
- inherits(PEMEncoder, DEREncoder);
- module.exports = PEMEncoder;
- PEMEncoder.prototype.encode = function encode(data, options2) {
- const buf = DEREncoder.prototype.encode.call(this, data);
- const p = buf.toString("base64");
- const out = ["-----BEGIN " + options2.label + "-----"];
- for (let i = 0;i < p.length; i += 64)
- out.push(p.slice(i, i + 64));
- out.push("-----END " + options2.label + "-----");
- return out.join(`
-`);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/encoders/index.js
-var require_encoders = __commonJS((exports) => {
- var encoders = exports;
- encoders.der = require_der2();
- encoders.pem = require_pem();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/decoders/der.js
-var require_der3 = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var bignum = require_bn();
- var DecoderBuffer = require_buffer().DecoderBuffer;
- var Node = require_node();
- var der = require_der();
- function DERDecoder(entity) {
- this.enc = "der";
- this.name = entity.name;
- this.entity = entity;
- this.tree = new DERNode;
- this.tree._init(entity.body);
- }
- module.exports = DERDecoder;
- DERDecoder.prototype.decode = function decode(data, options2) {
- if (!DecoderBuffer.isDecoderBuffer(data)) {
- data = new DecoderBuffer(data, options2);
- }
- return this.tree._decode(data, options2);
- };
- function DERNode(parent) {
- Node.call(this, "der", parent);
- }
- inherits(DERNode, Node);
- DERNode.prototype._peekTag = function peekTag(buffer, tag, any) {
- if (buffer.isEmpty())
- return false;
- const state = buffer.save();
- const decodedTag = derDecodeTag(buffer, 'Failed to peek tag: "' + tag + '"');
- if (buffer.isError(decodedTag))
- return decodedTag;
- buffer.restore(state);
- return decodedTag.tag === tag || decodedTag.tagStr === tag || decodedTag.tagStr + "of" === tag || any;
- };
- DERNode.prototype._decodeTag = function decodeTag(buffer, tag, any) {
- const decodedTag = derDecodeTag(buffer, 'Failed to decode tag of "' + tag + '"');
- if (buffer.isError(decodedTag))
- return decodedTag;
- let len = derDecodeLen(buffer, decodedTag.primitive, 'Failed to get length of "' + tag + '"');
- if (buffer.isError(len))
- return len;
- if (!any && decodedTag.tag !== tag && decodedTag.tagStr !== tag && decodedTag.tagStr + "of" !== tag) {
- return buffer.error('Failed to match tag: "' + tag + '"');
- }
- if (decodedTag.primitive || len !== null)
- return buffer.skip(len, 'Failed to match body of: "' + tag + '"');
- const state = buffer.save();
- const res = this._skipUntilEnd(buffer, 'Failed to skip indefinite length body: "' + this.tag + '"');
- if (buffer.isError(res))
- return res;
- len = buffer.offset - state.offset;
- buffer.restore(state);
- return buffer.skip(len, 'Failed to match body of: "' + tag + '"');
- };
- DERNode.prototype._skipUntilEnd = function skipUntilEnd(buffer, fail) {
- for (;; ) {
- const tag = derDecodeTag(buffer, fail);
- if (buffer.isError(tag))
- return tag;
- const len = derDecodeLen(buffer, tag.primitive, fail);
- if (buffer.isError(len))
- return len;
- let res;
- if (tag.primitive || len !== null)
- res = buffer.skip(len);
- else
- res = this._skipUntilEnd(buffer, fail);
- if (buffer.isError(res))
- return res;
- if (tag.tagStr === "end")
- break;
- }
- };
- DERNode.prototype._decodeList = function decodeList(buffer, tag, decoder, options2) {
- const result = [];
- while (!buffer.isEmpty()) {
- const possibleEnd = this._peekTag(buffer, "end");
- if (buffer.isError(possibleEnd))
- return possibleEnd;
- const res = decoder.decode(buffer, "der", options2);
- if (buffer.isError(res) && possibleEnd)
- break;
- result.push(res);
- }
- return result;
- };
- DERNode.prototype._decodeStr = function decodeStr(buffer, tag) {
- if (tag === "bitstr") {
- const unused = buffer.readUInt8();
- if (buffer.isError(unused))
- return unused;
- return { unused, data: buffer.raw() };
- } else if (tag === "bmpstr") {
- const raw = buffer.raw();
- if (raw.length % 2 === 1)
- return buffer.error("Decoding of string type: bmpstr length mismatch");
- let str = "";
- for (let i = 0;i < raw.length / 2; i++) {
- str += String.fromCharCode(raw.readUInt16BE(i * 2));
- }
- return str;
- } else if (tag === "numstr") {
- const numstr = buffer.raw().toString("ascii");
- if (!this._isNumstr(numstr)) {
- return buffer.error("Decoding of string type: " + "numstr unsupported characters");
- }
- return numstr;
- } else if (tag === "octstr") {
- return buffer.raw();
- } else if (tag === "objDesc") {
- return buffer.raw();
- } else if (tag === "printstr") {
- const printstr = buffer.raw().toString("ascii");
- if (!this._isPrintstr(printstr)) {
- return buffer.error("Decoding of string type: " + "printstr unsupported characters");
- }
- return printstr;
- } else if (/str$/.test(tag)) {
- return buffer.raw().toString();
- } else {
- return buffer.error("Decoding of string type: " + tag + " unsupported");
- }
- };
- DERNode.prototype._decodeObjid = function decodeObjid(buffer, values, relative) {
- let result;
- const identifiers = [];
- let ident = 0;
- let subident = 0;
- while (!buffer.isEmpty()) {
- subident = buffer.readUInt8();
- ident <<= 7;
- ident |= subident & 127;
- if ((subident & 128) === 0) {
- identifiers.push(ident);
- ident = 0;
- }
- }
- if (subident & 128)
- identifiers.push(ident);
- const first = identifiers[0] / 40 | 0;
- const second = identifiers[0] % 40;
- if (relative)
- result = identifiers;
- else
- result = [first, second].concat(identifiers.slice(1));
- if (values) {
- let tmp = values[result.join(" ")];
- if (tmp === undefined)
- tmp = values[result.join(".")];
- if (tmp !== undefined)
- result = tmp;
- }
- return result;
- };
- DERNode.prototype._decodeTime = function decodeTime(buffer, tag) {
- const str = buffer.raw().toString();
- let year;
- let mon;
- let day;
- let hour;
- let min;
- let sec;
- if (tag === "gentime") {
- year = str.slice(0, 4) | 0;
- mon = str.slice(4, 6) | 0;
- day = str.slice(6, 8) | 0;
- hour = str.slice(8, 10) | 0;
- min = str.slice(10, 12) | 0;
- sec = str.slice(12, 14) | 0;
- } else if (tag === "utctime") {
- year = str.slice(0, 2) | 0;
- mon = str.slice(2, 4) | 0;
- day = str.slice(4, 6) | 0;
- hour = str.slice(6, 8) | 0;
- min = str.slice(8, 10) | 0;
- sec = str.slice(10, 12) | 0;
- if (year < 70)
- year = 2000 + year;
- else
- year = 1900 + year;
- } else {
- return buffer.error("Decoding " + tag + " time is not supported yet");
- }
- return Date.UTC(year, mon - 1, day, hour, min, sec, 0);
- };
- DERNode.prototype._decodeNull = function decodeNull() {
- return null;
- };
- DERNode.prototype._decodeBool = function decodeBool(buffer) {
- const res = buffer.readUInt8();
- if (buffer.isError(res))
- return res;
- else
- return res !== 0;
- };
- DERNode.prototype._decodeInt = function decodeInt(buffer, values) {
- const raw = buffer.raw();
- let res = new bignum(raw);
- if (values)
- res = values[res.toString(10)] || res;
- return res;
- };
- DERNode.prototype._use = function use(entity, obj) {
- if (typeof entity === "function")
- entity = entity(obj);
- return entity._getDecoder("der").tree;
- };
- function derDecodeTag(buf, fail) {
- let tag = buf.readUInt8(fail);
- if (buf.isError(tag))
- return tag;
- const cls = der.tagClass[tag >> 6];
- const primitive = (tag & 32) === 0;
- if ((tag & 31) === 31) {
- let oct = tag;
- tag = 0;
- while ((oct & 128) === 128) {
- oct = buf.readUInt8(fail);
- if (buf.isError(oct))
- return oct;
- tag <<= 7;
- tag |= oct & 127;
- }
- } else {
- tag &= 31;
- }
- const tagStr = der.tag[tag];
- return {
- cls,
- primitive,
- tag,
- tagStr
- };
- }
- function derDecodeLen(buf, primitive, fail) {
- let len = buf.readUInt8(fail);
- if (buf.isError(len))
- return len;
- if (!primitive && len === 128)
- return null;
- if ((len & 128) === 0) {
- return len;
- }
- const num = len & 127;
- if (num > 4)
- return buf.error("length octect is too long");
- len = 0;
- for (let i = 0;i < num; i++) {
- len <<= 8;
- const j = buf.readUInt8(fail);
- if (buf.isError(j))
- return j;
- len |= j;
- }
- return len;
- }
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/decoders/pem.js
-var require_pem2 = __commonJS((exports, module) => {
- var inherits = require_inherits();
- var Buffer2 = require_safer().Buffer;
- var DERDecoder = require_der3();
- function PEMDecoder(entity) {
- DERDecoder.call(this, entity);
- this.enc = "pem";
- }
- inherits(PEMDecoder, DERDecoder);
- module.exports = PEMDecoder;
- PEMDecoder.prototype.decode = function decode(data, options2) {
- const lines = data.toString().split(/[\r\n]+/g);
- const label = options2.label.toUpperCase();
- const re = /^-----(BEGIN|END) ([^-]+)-----$/;
- let start = -1;
- let end = -1;
- for (let i = 0;i < lines.length; i++) {
- const match = lines[i].match(re);
- if (match === null)
- continue;
- if (match[2] !== label)
- continue;
- if (start === -1) {
- if (match[1] !== "BEGIN")
- break;
- start = i;
- } else {
- if (match[1] !== "END")
- break;
- end = i;
- break;
- }
- }
- if (start === -1 || end === -1)
- throw new Error("PEM section not found for: " + label);
- const base64 = lines.slice(start + 1, end).join("");
- base64.replace(/[^a-z0-9+/=]+/gi, "");
- const input = Buffer2.from(base64, "base64");
- return DERDecoder.prototype.decode.call(this, input, options2);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/decoders/index.js
-var require_decoders = __commonJS((exports) => {
- var decoders = exports;
- decoders.der = require_der3();
- decoders.pem = require_pem2();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/api.js
-var require_api = __commonJS((exports) => {
- var encoders = require_encoders();
- var decoders = require_decoders();
- var inherits = require_inherits();
- var api = exports;
- api.define = function define(name, body) {
- return new Entity(name, body);
- };
- function Entity(name, body) {
- this.name = name;
- this.body = body;
- this.decoders = {};
- this.encoders = {};
- }
- Entity.prototype._createNamed = function createNamed(Base) {
- const name = this.name;
- function Generated(entity) {
- this._initNamed(entity, name);
- }
- inherits(Generated, Base);
- Generated.prototype._initNamed = function _initNamed(entity, name2) {
- Base.call(this, entity, name2);
- };
- return new Generated(this);
- };
- Entity.prototype._getDecoder = function _getDecoder(enc) {
- enc = enc || "der";
- if (!this.decoders.hasOwnProperty(enc))
- this.decoders[enc] = this._createNamed(decoders[enc]);
- return this.decoders[enc];
- };
- Entity.prototype.decode = function decode(data, enc, options2) {
- return this._getDecoder(enc).decode(data, options2);
- };
- Entity.prototype._getEncoder = function _getEncoder(enc) {
- enc = enc || "der";
- if (!this.encoders.hasOwnProperty(enc))
- this.encoders[enc] = this._createNamed(encoders[enc]);
- return this.encoders[enc];
- };
- Entity.prototype.encode = function encode(data, enc, reporter) {
- return this._getEncoder(enc).encode(data, reporter);
- };
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/base/index.js
-var require_base = __commonJS((exports) => {
- var base = exports;
- base.Reporter = require_reporter().Reporter;
- base.DecoderBuffer = require_buffer().DecoderBuffer;
- base.EncoderBuffer = require_buffer().EncoderBuffer;
- base.Node = require_node();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1/constants/index.js
-var require_constants2 = __commonJS((exports) => {
- var constants = exports;
- constants._reverse = function reverse(map) {
- const res = {};
- Object.keys(map).forEach(function(key) {
- if ((key | 0) == key)
- key = key | 0;
- const value = map[key];
- res[value] = key;
- });
- return res;
- };
- constants.der = require_der();
-});
-
-// ../eve/node_modules/asn1.js/lib/asn1.js
-var require_asn1 = __commonJS((exports) => {
- var asn1 = exports;
- asn1.bignum = require_bn();
- asn1.define = require_api().define;
- asn1.base = require_base();
- asn1.constants = require_constants2();
- asn1.decoders = require_decoders();
- asn1.encoders = require_encoders();
-});
-
-// ../eve/node_modules/elliptic/package.json
-var require_package = __commonJS((exports, module) => {
- module.exports = {
- name: "elliptic",
- version: "6.6.1",
- description: "EC cryptography",
- main: "lib/elliptic.js",
- files: [
- "lib"
- ],
- scripts: {
- lint: "eslint lib test",
- "lint:fix": "npm run lint -- --fix",
- unit: "istanbul test _mocha --reporter=spec test/index.js",
- test: "npm run lint && npm run unit",
- version: "grunt dist && git add dist/"
- },
- repository: {
- type: "git",
- url: "git@github.com:indutny/elliptic"
- },
- keywords: [
- "EC",
- "Elliptic",
- "curve",
- "Cryptography"
- ],
- author: "Fedor Indutny ",
- license: "MIT",
- bugs: {
- url: "https://github.com/indutny/elliptic/issues"
- },
- homepage: "https://github.com/indutny/elliptic",
- devDependencies: {
- brfs: "^2.0.2",
- coveralls: "^3.1.0",
- eslint: "^7.6.0",
- grunt: "^1.2.1",
- "grunt-browserify": "^5.3.0",
- "grunt-cli": "^1.3.2",
- "grunt-contrib-connect": "^3.0.0",
- "grunt-contrib-copy": "^1.0.0",
- "grunt-contrib-uglify": "^5.0.0",
- "grunt-mocha-istanbul": "^5.0.2",
- "grunt-saucelabs": "^9.0.1",
- istanbul: "^0.4.5",
- mocha: "^8.0.1"
- },
- dependencies: {
- "bn.js": "^4.11.9",
- brorand: "^1.1.0",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.1",
- inherits: "^2.0.4",
- "minimalistic-assert": "^1.0.1",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- };
-});
-
-// ../eve/node_modules/minimalistic-crypto-utils/lib/utils.js
-var require_utils = __commonJS((exports) => {
- var utils = exports;
- function toArray(msg, enc) {
- if (Array.isArray(msg))
- return msg.slice();
- if (!msg)
- return [];
- var res = [];
- if (typeof msg !== "string") {
- for (var i = 0;i < msg.length; i++)
- res[i] = msg[i] | 0;
- return res;
- }
- if (enc === "hex") {
- msg = msg.replace(/[^a-z0-9]+/ig, "");
- if (msg.length % 2 !== 0)
- msg = "0" + msg;
- for (var i = 0;i < msg.length; i += 2)
- res.push(parseInt(msg[i] + msg[i + 1], 16));
- } else {
- for (var i = 0;i < msg.length; i++) {
- var c = msg.charCodeAt(i);
- var hi = c >> 8;
- var lo = c & 255;
- if (hi)
- res.push(hi, lo);
- else
- res.push(lo);
- }
- }
- return res;
- }
- utils.toArray = toArray;
- function zero2(word) {
- if (word.length === 1)
- return "0" + word;
- else
- return word;
- }
- utils.zero2 = zero2;
- function toHex(msg) {
- var res = "";
- for (var i = 0;i < msg.length; i++)
- res += zero2(msg[i].toString(16));
- return res;
- }
- utils.toHex = toHex;
- utils.encode = function encode(arr, enc) {
- if (enc === "hex")
- return toHex(arr);
- else
- return arr;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/utils.js
-var require_utils2 = __commonJS((exports) => {
- var utils = exports;
- var BN = require_bn();
- var minAssert = require_minimalistic_assert();
- var minUtils = require_utils();
- utils.assert = minAssert;
- utils.toArray = minUtils.toArray;
- utils.zero2 = minUtils.zero2;
- utils.toHex = minUtils.toHex;
- utils.encode = minUtils.encode;
- function getNAF(num, w, bits) {
- var naf = new Array(Math.max(num.bitLength(), bits) + 1);
- var i;
- for (i = 0;i < naf.length; i += 1) {
- naf[i] = 0;
- }
- var ws = 1 << w + 1;
- var k = num.clone();
- for (i = 0;i < naf.length; i++) {
- var z;
- var mod = k.andln(ws - 1);
- if (k.isOdd()) {
- if (mod > (ws >> 1) - 1)
- z = (ws >> 1) - mod;
- else
- z = mod;
- k.isubn(z);
- } else {
- z = 0;
- }
- naf[i] = z;
- k.iushrn(1);
- }
- return naf;
- }
- utils.getNAF = getNAF;
- function getJSF(k1, k2) {
- var jsf = [
- [],
- []
- ];
- k1 = k1.clone();
- k2 = k2.clone();
- var d1 = 0;
- var d2 = 0;
- var m8;
- while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {
- var m14 = k1.andln(3) + d1 & 3;
- var m24 = k2.andln(3) + d2 & 3;
- if (m14 === 3)
- m14 = -1;
- if (m24 === 3)
- m24 = -1;
- var u1;
- if ((m14 & 1) === 0) {
- u1 = 0;
- } else {
- m8 = k1.andln(7) + d1 & 7;
- if ((m8 === 3 || m8 === 5) && m24 === 2)
- u1 = -m14;
- else
- u1 = m14;
- }
- jsf[0].push(u1);
- var u2;
- if ((m24 & 1) === 0) {
- u2 = 0;
- } else {
- m8 = k2.andln(7) + d2 & 7;
- if ((m8 === 3 || m8 === 5) && m14 === 2)
- u2 = -m24;
- else
- u2 = m24;
- }
- jsf[1].push(u2);
- if (2 * d1 === u1 + 1)
- d1 = 1 - d1;
- if (2 * d2 === u2 + 1)
- d2 = 1 - d2;
- k1.iushrn(1);
- k2.iushrn(1);
- }
- return jsf;
- }
- utils.getJSF = getJSF;
- function cachedProperty(obj, name, computer) {
- var key = "_" + name;
- obj.prototype[name] = function cachedProperty() {
- return this[key] !== undefined ? this[key] : this[key] = computer.call(this);
- };
- }
- utils.cachedProperty = cachedProperty;
- function parseBytes(bytes) {
- return typeof bytes === "string" ? utils.toArray(bytes, "hex") : bytes;
- }
- utils.parseBytes = parseBytes;
- function intFromLE(bytes) {
- return new BN(bytes, "hex", "le");
- }
- utils.intFromLE = intFromLE;
-});
-
-// ../eve/node_modules/brorand/index.js
-var require_brorand = __commonJS((exports, module) => {
- var r;
- module.exports = function rand(len) {
- if (!r)
- r = new Rand(null);
- return r.generate(len);
- };
- function Rand(rand) {
- this.rand = rand;
- }
- module.exports.Rand = Rand;
- Rand.prototype.generate = function generate(len) {
- return this._rand(len);
- };
- Rand.prototype._rand = function _rand(n) {
- if (this.rand.getBytes)
- return this.rand.getBytes(n);
- var res = new Uint8Array(n);
- for (var i = 0;i < res.length; i++)
- res[i] = this.rand.getByte();
- return res;
- };
- if (typeof self === "object") {
- if (self.crypto && self.crypto.getRandomValues) {
- Rand.prototype._rand = function _rand(n) {
- var arr = new Uint8Array(n);
- self.crypto.getRandomValues(arr);
- return arr;
- };
- } else if (self.msCrypto && self.msCrypto.getRandomValues) {
- Rand.prototype._rand = function _rand(n) {
- var arr = new Uint8Array(n);
- self.msCrypto.getRandomValues(arr);
- return arr;
- };
- } else if (typeof window === "object") {
- Rand.prototype._rand = function() {
- throw new Error("Not implemented yet");
- };
- }
- } else {
- try {
- crypto2 = __require("crypto");
- if (typeof crypto2.randomBytes !== "function")
- throw new Error("Not supported");
- Rand.prototype._rand = function _rand(n) {
- return crypto2.randomBytes(n);
- };
- } catch (e) {}
- }
- var crypto2;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/base.js
-var require_base2 = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var getNAF = utils.getNAF;
- var getJSF = utils.getJSF;
- var assert = utils.assert;
- function BaseCurve(type, conf) {
- this.type = type;
- this.p = new BN(conf.p, 16);
- this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p);
- this.zero = new BN(0).toRed(this.red);
- this.one = new BN(1).toRed(this.red);
- this.two = new BN(2).toRed(this.red);
- this.n = conf.n && new BN(conf.n, 16);
- this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed);
- this._wnafT1 = new Array(4);
- this._wnafT2 = new Array(4);
- this._wnafT3 = new Array(4);
- this._wnafT4 = new Array(4);
- this._bitLength = this.n ? this.n.bitLength() : 0;
- var adjustCount = this.n && this.p.div(this.n);
- if (!adjustCount || adjustCount.cmpn(100) > 0) {
- this.redN = null;
- } else {
- this._maxwellTrick = true;
- this.redN = this.n.toRed(this.red);
- }
- }
- module.exports = BaseCurve;
- BaseCurve.prototype.point = function point() {
- throw new Error("Not implemented");
- };
- BaseCurve.prototype.validate = function validate() {
- throw new Error("Not implemented");
- };
- BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) {
- assert(p.precomputed);
- var doubles = p._getDoubles();
- var naf = getNAF(k, 1, this._bitLength);
- var I = (1 << doubles.step + 1) - (doubles.step % 2 === 0 ? 2 : 1);
- I /= 3;
- var repr = [];
- var j;
- var nafW;
- for (j = 0;j < naf.length; j += doubles.step) {
- nafW = 0;
- for (var l = j + doubles.step - 1;l >= j; l--)
- nafW = (nafW << 1) + naf[l];
- repr.push(nafW);
- }
- var a = this.jpoint(null, null, null);
- var b = this.jpoint(null, null, null);
- for (var i = I;i > 0; i--) {
- for (j = 0;j < repr.length; j++) {
- nafW = repr[j];
- if (nafW === i)
- b = b.mixedAdd(doubles.points[j]);
- else if (nafW === -i)
- b = b.mixedAdd(doubles.points[j].neg());
- }
- a = a.add(b);
- }
- return a.toP();
- };
- BaseCurve.prototype._wnafMul = function _wnafMul(p, k) {
- var w = 4;
- var nafPoints = p._getNAFPoints(w);
- w = nafPoints.wnd;
- var wnd = nafPoints.points;
- var naf = getNAF(k, w, this._bitLength);
- var acc = this.jpoint(null, null, null);
- for (var i = naf.length - 1;i >= 0; i--) {
- for (var l = 0;i >= 0 && naf[i] === 0; i--)
- l++;
- if (i >= 0)
- l++;
- acc = acc.dblp(l);
- if (i < 0)
- break;
- var z = naf[i];
- assert(z !== 0);
- if (p.type === "affine") {
- if (z > 0)
- acc = acc.mixedAdd(wnd[z - 1 >> 1]);
- else
- acc = acc.mixedAdd(wnd[-z - 1 >> 1].neg());
- } else {
- if (z > 0)
- acc = acc.add(wnd[z - 1 >> 1]);
- else
- acc = acc.add(wnd[-z - 1 >> 1].neg());
- }
- }
- return p.type === "affine" ? acc.toP() : acc;
- };
- BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, points, coeffs, len, jacobianResult) {
- var wndWidth = this._wnafT1;
- var wnd = this._wnafT2;
- var naf = this._wnafT3;
- var max = 0;
- var i;
- var j;
- var p;
- for (i = 0;i < len; i++) {
- p = points[i];
- var nafPoints = p._getNAFPoints(defW);
- wndWidth[i] = nafPoints.wnd;
- wnd[i] = nafPoints.points;
- }
- for (i = len - 1;i >= 1; i -= 2) {
- var a = i - 1;
- var b = i;
- if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {
- naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength);
- naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength);
- max = Math.max(naf[a].length, max);
- max = Math.max(naf[b].length, max);
- continue;
- }
- var comb = [
- points[a],
- null,
- null,
- points[b]
- ];
- if (points[a].y.cmp(points[b].y) === 0) {
- comb[1] = points[a].add(points[b]);
- comb[2] = points[a].toJ().mixedAdd(points[b].neg());
- } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) {
- comb[1] = points[a].toJ().mixedAdd(points[b]);
- comb[2] = points[a].add(points[b].neg());
- } else {
- comb[1] = points[a].toJ().mixedAdd(points[b]);
- comb[2] = points[a].toJ().mixedAdd(points[b].neg());
- }
- var index2 = [
- -3,
- -1,
- -5,
- -7,
- 0,
- 7,
- 5,
- 1,
- 3
- ];
- var jsf = getJSF(coeffs[a], coeffs[b]);
- max = Math.max(jsf[0].length, max);
- naf[a] = new Array(max);
- naf[b] = new Array(max);
- for (j = 0;j < max; j++) {
- var ja = jsf[0][j] | 0;
- var jb = jsf[1][j] | 0;
- naf[a][j] = index2[(ja + 1) * 3 + (jb + 1)];
- naf[b][j] = 0;
- wnd[a] = comb;
- }
- }
- var acc = this.jpoint(null, null, null);
- var tmp = this._wnafT4;
- for (i = max;i >= 0; i--) {
- var k = 0;
- while (i >= 0) {
- var zero = true;
- for (j = 0;j < len; j++) {
- tmp[j] = naf[j][i] | 0;
- if (tmp[j] !== 0)
- zero = false;
- }
- if (!zero)
- break;
- k++;
- i--;
- }
- if (i >= 0)
- k++;
- acc = acc.dblp(k);
- if (i < 0)
- break;
- for (j = 0;j < len; j++) {
- var z = tmp[j];
- if (z === 0)
- continue;
- else if (z > 0)
- p = wnd[j][z - 1 >> 1];
- else if (z < 0)
- p = wnd[j][-z - 1 >> 1].neg();
- if (p.type === "affine")
- acc = acc.mixedAdd(p);
- else
- acc = acc.add(p);
- }
- }
- for (i = 0;i < len; i++)
- wnd[i] = null;
- if (jacobianResult)
- return acc;
- else
- return acc.toP();
- };
- function BasePoint(curve, type) {
- this.curve = curve;
- this.type = type;
- this.precomputed = null;
- }
- BaseCurve.BasePoint = BasePoint;
- BasePoint.prototype.eq = function eq() {
- throw new Error("Not implemented");
- };
- BasePoint.prototype.validate = function validate() {
- return this.curve.validate(this);
- };
- BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
- bytes = utils.toArray(bytes, enc);
- var len = this.p.byteLength();
- if ((bytes[0] === 4 || bytes[0] === 6 || bytes[0] === 7) && bytes.length - 1 === 2 * len) {
- if (bytes[0] === 6)
- assert(bytes[bytes.length - 1] % 2 === 0);
- else if (bytes[0] === 7)
- assert(bytes[bytes.length - 1] % 2 === 1);
- var res = this.point(bytes.slice(1, 1 + len), bytes.slice(1 + len, 1 + 2 * len));
- return res;
- } else if ((bytes[0] === 2 || bytes[0] === 3) && bytes.length - 1 === len) {
- return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 3);
- }
- throw new Error("Unknown point format");
- };
- BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) {
- return this.encode(enc, true);
- };
- BasePoint.prototype._encode = function _encode(compact) {
- var len = this.curve.p.byteLength();
- var x = this.getX().toArray("be", len);
- if (compact)
- return [this.getY().isEven() ? 2 : 3].concat(x);
- return [4].concat(x, this.getY().toArray("be", len));
- };
- BasePoint.prototype.encode = function encode(enc, compact) {
- return utils.encode(this._encode(compact), enc);
- };
- BasePoint.prototype.precompute = function precompute(power) {
- if (this.precomputed)
- return this;
- var precomputed = {
- doubles: null,
- naf: null,
- beta: null
- };
- precomputed.naf = this._getNAFPoints(8);
- precomputed.doubles = this._getDoubles(4, power);
- precomputed.beta = this._getBeta();
- this.precomputed = precomputed;
- return this;
- };
- BasePoint.prototype._hasDoubles = function _hasDoubles(k) {
- if (!this.precomputed)
- return false;
- var doubles = this.precomputed.doubles;
- if (!doubles)
- return false;
- return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step);
- };
- BasePoint.prototype._getDoubles = function _getDoubles(step, power) {
- if (this.precomputed && this.precomputed.doubles)
- return this.precomputed.doubles;
- var doubles = [this];
- var acc = this;
- for (var i = 0;i < power; i += step) {
- for (var j = 0;j < step; j++)
- acc = acc.dbl();
- doubles.push(acc);
- }
- return {
- step,
- points: doubles
- };
- };
- BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) {
- if (this.precomputed && this.precomputed.naf)
- return this.precomputed.naf;
- var res = [this];
- var max = (1 << wnd) - 1;
- var dbl = max === 1 ? null : this.dbl();
- for (var i = 1;i < max; i++)
- res[i] = res[i - 1].add(dbl);
- return {
- wnd,
- points: res
- };
- };
- BasePoint.prototype._getBeta = function _getBeta() {
- return null;
- };
- BasePoint.prototype.dblp = function dblp(k) {
- var r = this;
- for (var i = 0;i < k; i++)
- r = r.dbl();
- return r;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/short.js
-var require_short = __commonJS((exports, module) => {
- var utils = require_utils2();
- var BN = require_bn();
- var inherits = require_inherits();
- var Base = require_base2();
- var assert = utils.assert;
- function ShortCurve(conf) {
- Base.call(this, "short", conf);
- this.a = new BN(conf.a, 16).toRed(this.red);
- this.b = new BN(conf.b, 16).toRed(this.red);
- this.tinv = this.two.redInvm();
- this.zeroA = this.a.fromRed().cmpn(0) === 0;
- this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0;
- this.endo = this._getEndomorphism(conf);
- this._endoWnafT1 = new Array(4);
- this._endoWnafT2 = new Array(4);
- }
- inherits(ShortCurve, Base);
- module.exports = ShortCurve;
- ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) {
- if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1)
- return;
- var beta;
- var lambda;
- if (conf.beta) {
- beta = new BN(conf.beta, 16).toRed(this.red);
- } else {
- var betas = this._getEndoRoots(this.p);
- beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1];
- beta = beta.toRed(this.red);
- }
- if (conf.lambda) {
- lambda = new BN(conf.lambda, 16);
- } else {
- var lambdas = this._getEndoRoots(this.n);
- if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) {
- lambda = lambdas[0];
- } else {
- lambda = lambdas[1];
- assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0);
- }
- }
- var basis;
- if (conf.basis) {
- basis = conf.basis.map(function(vec) {
- return {
- a: new BN(vec.a, 16),
- b: new BN(vec.b, 16)
- };
- });
- } else {
- basis = this._getEndoBasis(lambda);
- }
- return {
- beta,
- lambda,
- basis
- };
- };
- ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) {
- var red = num === this.p ? this.red : BN.mont(num);
- var tinv = new BN(2).toRed(red).redInvm();
- var ntinv = tinv.redNeg();
- var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv);
- var l1 = ntinv.redAdd(s).fromRed();
- var l2 = ntinv.redSub(s).fromRed();
- return [l1, l2];
- };
- ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) {
- var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2));
- var u = lambda;
- var v = this.n.clone();
- var x1 = new BN(1);
- var y1 = new BN(0);
- var x2 = new BN(0);
- var y2 = new BN(1);
- var a0;
- var b0;
- var a1;
- var b1;
- var a2;
- var b2;
- var prevR;
- var i = 0;
- var r;
- var x;
- while (u.cmpn(0) !== 0) {
- var q = v.div(u);
- r = v.sub(q.mul(u));
- x = x2.sub(q.mul(x1));
- var y = y2.sub(q.mul(y1));
- if (!a1 && r.cmp(aprxSqrt) < 0) {
- a0 = prevR.neg();
- b0 = x1;
- a1 = r.neg();
- b1 = x;
- } else if (a1 && ++i === 2) {
- break;
- }
- prevR = r;
- v = u;
- u = r;
- x2 = x1;
- x1 = x;
- y2 = y1;
- y1 = y;
- }
- a2 = r.neg();
- b2 = x;
- var len1 = a1.sqr().add(b1.sqr());
- var len2 = a2.sqr().add(b2.sqr());
- if (len2.cmp(len1) >= 0) {
- a2 = a0;
- b2 = b0;
- }
- if (a1.negative) {
- a1 = a1.neg();
- b1 = b1.neg();
- }
- if (a2.negative) {
- a2 = a2.neg();
- b2 = b2.neg();
- }
- return [
- { a: a1, b: b1 },
- { a: a2, b: b2 }
- ];
- };
- ShortCurve.prototype._endoSplit = function _endoSplit(k) {
- var basis = this.endo.basis;
- var v1 = basis[0];
- var v2 = basis[1];
- var c1 = v2.b.mul(k).divRound(this.n);
- var c2 = v1.b.neg().mul(k).divRound(this.n);
- var p1 = c1.mul(v1.a);
- var p2 = c2.mul(v2.a);
- var q1 = c1.mul(v1.b);
- var q2 = c2.mul(v2.b);
- var k1 = k.sub(p1).sub(p2);
- var k2 = q1.add(q2).neg();
- return { k1, k2 };
- };
- ShortCurve.prototype.pointFromX = function pointFromX(x, odd) {
- x = new BN(x, 16);
- if (!x.red)
- x = x.toRed(this.red);
- var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b);
- var y = y2.redSqrt();
- if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
- throw new Error("invalid point");
- var isOdd = y.fromRed().isOdd();
- if (odd && !isOdd || !odd && isOdd)
- y = y.redNeg();
- return this.point(x, y);
- };
- ShortCurve.prototype.validate = function validate(point) {
- if (point.inf)
- return true;
- var x = point.x;
- var y = point.y;
- var ax = this.a.redMul(x);
- var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b);
- return y.redSqr().redISub(rhs).cmpn(0) === 0;
- };
- ShortCurve.prototype._endoWnafMulAdd = function _endoWnafMulAdd(points, coeffs, jacobianResult) {
- var npoints = this._endoWnafT1;
- var ncoeffs = this._endoWnafT2;
- for (var i = 0;i < points.length; i++) {
- var split = this._endoSplit(coeffs[i]);
- var p = points[i];
- var beta = p._getBeta();
- if (split.k1.negative) {
- split.k1.ineg();
- p = p.neg(true);
- }
- if (split.k2.negative) {
- split.k2.ineg();
- beta = beta.neg(true);
- }
- npoints[i * 2] = p;
- npoints[i * 2 + 1] = beta;
- ncoeffs[i * 2] = split.k1;
- ncoeffs[i * 2 + 1] = split.k2;
- }
- var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult);
- for (var j = 0;j < i * 2; j++) {
- npoints[j] = null;
- ncoeffs[j] = null;
- }
- return res;
- };
- function Point(curve, x, y, isRed) {
- Base.BasePoint.call(this, curve, "affine");
- if (x === null && y === null) {
- this.x = null;
- this.y = null;
- this.inf = true;
- } else {
- this.x = new BN(x, 16);
- this.y = new BN(y, 16);
- if (isRed) {
- this.x.forceRed(this.curve.red);
- this.y.forceRed(this.curve.red);
- }
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.y.red)
- this.y = this.y.toRed(this.curve.red);
- this.inf = false;
- }
- }
- inherits(Point, Base.BasePoint);
- ShortCurve.prototype.point = function point(x, y, isRed) {
- return new Point(this, x, y, isRed);
- };
- ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) {
- return Point.fromJSON(this, obj, red);
- };
- Point.prototype._getBeta = function _getBeta() {
- if (!this.curve.endo)
- return;
- var pre = this.precomputed;
- if (pre && pre.beta)
- return pre.beta;
- var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);
- if (pre) {
- var curve = this.curve;
- var endoMul = function(p) {
- return curve.point(p.x.redMul(curve.endo.beta), p.y);
- };
- pre.beta = beta;
- beta.precomputed = {
- beta: null,
- naf: pre.naf && {
- wnd: pre.naf.wnd,
- points: pre.naf.points.map(endoMul)
- },
- doubles: pre.doubles && {
- step: pre.doubles.step,
- points: pre.doubles.points.map(endoMul)
- }
- };
- }
- return beta;
- };
- Point.prototype.toJSON = function toJSON() {
- if (!this.precomputed)
- return [this.x, this.y];
- return [this.x, this.y, this.precomputed && {
- doubles: this.precomputed.doubles && {
- step: this.precomputed.doubles.step,
- points: this.precomputed.doubles.points.slice(1)
- },
- naf: this.precomputed.naf && {
- wnd: this.precomputed.naf.wnd,
- points: this.precomputed.naf.points.slice(1)
- }
- }];
- };
- Point.fromJSON = function fromJSON(curve, obj, red) {
- if (typeof obj === "string")
- obj = JSON.parse(obj);
- var res = curve.point(obj[0], obj[1], red);
- if (!obj[2])
- return res;
- function obj2point(obj2) {
- return curve.point(obj2[0], obj2[1], red);
- }
- var pre = obj[2];
- res.precomputed = {
- beta: null,
- doubles: pre.doubles && {
- step: pre.doubles.step,
- points: [res].concat(pre.doubles.points.map(obj2point))
- },
- naf: pre.naf && {
- wnd: pre.naf.wnd,
- points: [res].concat(pre.naf.points.map(obj2point))
- }
- };
- return res;
- };
- Point.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- Point.prototype.isInfinity = function isInfinity() {
- return this.inf;
- };
- Point.prototype.add = function add(p) {
- if (this.inf)
- return p;
- if (p.inf)
- return this;
- if (this.eq(p))
- return this.dbl();
- if (this.neg().eq(p))
- return this.curve.point(null, null);
- if (this.x.cmp(p.x) === 0)
- return this.curve.point(null, null);
- var c = this.y.redSub(p.y);
- if (c.cmpn(0) !== 0)
- c = c.redMul(this.x.redSub(p.x).redInvm());
- var nx = c.redSqr().redISub(this.x).redISub(p.x);
- var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
- return this.curve.point(nx, ny);
- };
- Point.prototype.dbl = function dbl() {
- if (this.inf)
- return this;
- var ys1 = this.y.redAdd(this.y);
- if (ys1.cmpn(0) === 0)
- return this.curve.point(null, null);
- var a = this.curve.a;
- var x2 = this.x.redSqr();
- var dyinv = ys1.redInvm();
- var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv);
- var nx = c.redSqr().redISub(this.x.redAdd(this.x));
- var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);
- return this.curve.point(nx, ny);
- };
- Point.prototype.getX = function getX() {
- return this.x.fromRed();
- };
- Point.prototype.getY = function getY() {
- return this.y.fromRed();
- };
- Point.prototype.mul = function mul(k) {
- k = new BN(k, 16);
- if (this.isInfinity())
- return this;
- else if (this._hasDoubles(k))
- return this.curve._fixedNafMul(this, k);
- else if (this.curve.endo)
- return this.curve._endoWnafMulAdd([this], [k]);
- else
- return this.curve._wnafMul(this, k);
- };
- Point.prototype.mulAdd = function mulAdd(k1, p2, k2) {
- var points = [this, p2];
- var coeffs = [k1, k2];
- if (this.curve.endo)
- return this.curve._endoWnafMulAdd(points, coeffs);
- else
- return this.curve._wnafMulAdd(1, points, coeffs, 2);
- };
- Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) {
- var points = [this, p2];
- var coeffs = [k1, k2];
- if (this.curve.endo)
- return this.curve._endoWnafMulAdd(points, coeffs, true);
- else
- return this.curve._wnafMulAdd(1, points, coeffs, 2, true);
- };
- Point.prototype.eq = function eq(p) {
- return this === p || this.inf === p.inf && (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0);
- };
- Point.prototype.neg = function neg(_precompute) {
- if (this.inf)
- return this;
- var res = this.curve.point(this.x, this.y.redNeg());
- if (_precompute && this.precomputed) {
- var pre = this.precomputed;
- var negate = function(p) {
- return p.neg();
- };
- res.precomputed = {
- naf: pre.naf && {
- wnd: pre.naf.wnd,
- points: pre.naf.points.map(negate)
- },
- doubles: pre.doubles && {
- step: pre.doubles.step,
- points: pre.doubles.points.map(negate)
- }
- };
- }
- return res;
- };
- Point.prototype.toJ = function toJ() {
- if (this.inf)
- return this.curve.jpoint(null, null, null);
- var res = this.curve.jpoint(this.x, this.y, this.curve.one);
- return res;
- };
- function JPoint(curve, x, y, z) {
- Base.BasePoint.call(this, curve, "jacobian");
- if (x === null && y === null && z === null) {
- this.x = this.curve.one;
- this.y = this.curve.one;
- this.z = new BN(0);
- } else {
- this.x = new BN(x, 16);
- this.y = new BN(y, 16);
- this.z = new BN(z, 16);
- }
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.y.red)
- this.y = this.y.toRed(this.curve.red);
- if (!this.z.red)
- this.z = this.z.toRed(this.curve.red);
- this.zOne = this.z === this.curve.one;
- }
- inherits(JPoint, Base.BasePoint);
- ShortCurve.prototype.jpoint = function jpoint(x, y, z) {
- return new JPoint(this, x, y, z);
- };
- JPoint.prototype.toP = function toP() {
- if (this.isInfinity())
- return this.curve.point(null, null);
- var zinv = this.z.redInvm();
- var zinv2 = zinv.redSqr();
- var ax = this.x.redMul(zinv2);
- var ay = this.y.redMul(zinv2).redMul(zinv);
- return this.curve.point(ax, ay);
- };
- JPoint.prototype.neg = function neg() {
- return this.curve.jpoint(this.x, this.y.redNeg(), this.z);
- };
- JPoint.prototype.add = function add(p) {
- if (this.isInfinity())
- return p;
- if (p.isInfinity())
- return this;
- var pz2 = p.z.redSqr();
- var z2 = this.z.redSqr();
- var u1 = this.x.redMul(pz2);
- var u2 = p.x.redMul(z2);
- var s1 = this.y.redMul(pz2.redMul(p.z));
- var s2 = p.y.redMul(z2.redMul(this.z));
- var h = u1.redSub(u2);
- var r = s1.redSub(s2);
- if (h.cmpn(0) === 0) {
- if (r.cmpn(0) !== 0)
- return this.curve.jpoint(null, null, null);
- else
- return this.dbl();
- }
- var h2 = h.redSqr();
- var h3 = h2.redMul(h);
- var v = u1.redMul(h2);
- var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
- var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
- var nz = this.z.redMul(p.z).redMul(h);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.mixedAdd = function mixedAdd(p) {
- if (this.isInfinity())
- return p.toJ();
- if (p.isInfinity())
- return this;
- var z2 = this.z.redSqr();
- var u1 = this.x;
- var u2 = p.x.redMul(z2);
- var s1 = this.y;
- var s2 = p.y.redMul(z2).redMul(this.z);
- var h = u1.redSub(u2);
- var r = s1.redSub(s2);
- if (h.cmpn(0) === 0) {
- if (r.cmpn(0) !== 0)
- return this.curve.jpoint(null, null, null);
- else
- return this.dbl();
- }
- var h2 = h.redSqr();
- var h3 = h2.redMul(h);
- var v = u1.redMul(h2);
- var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);
- var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));
- var nz = this.z.redMul(h);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.dblp = function dblp(pow) {
- if (pow === 0)
- return this;
- if (this.isInfinity())
- return this;
- if (!pow)
- return this.dbl();
- var i;
- if (this.curve.zeroA || this.curve.threeA) {
- var r = this;
- for (i = 0;i < pow; i++)
- r = r.dbl();
- return r;
- }
- var a = this.curve.a;
- var tinv = this.curve.tinv;
- var jx = this.x;
- var jy = this.y;
- var jz = this.z;
- var jz4 = jz.redSqr().redSqr();
- var jyd = jy.redAdd(jy);
- for (i = 0;i < pow; i++) {
- var jx2 = jx.redSqr();
- var jyd2 = jyd.redSqr();
- var jyd4 = jyd2.redSqr();
- var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));
- var t1 = jx.redMul(jyd2);
- var nx = c.redSqr().redISub(t1.redAdd(t1));
- var t2 = t1.redISub(nx);
- var dny = c.redMul(t2);
- dny = dny.redIAdd(dny).redISub(jyd4);
- var nz = jyd.redMul(jz);
- if (i + 1 < pow)
- jz4 = jz4.redMul(jyd4);
- jx = nx;
- jz = nz;
- jyd = dny;
- }
- return this.curve.jpoint(jx, jyd.redMul(tinv), jz);
- };
- JPoint.prototype.dbl = function dbl() {
- if (this.isInfinity())
- return this;
- if (this.curve.zeroA)
- return this._zeroDbl();
- else if (this.curve.threeA)
- return this._threeDbl();
- else
- return this._dbl();
- };
- JPoint.prototype._zeroDbl = function _zeroDbl() {
- var nx;
- var ny;
- var nz;
- if (this.zOne) {
- var xx = this.x.redSqr();
- var yy = this.y.redSqr();
- var yyyy = yy.redSqr();
- var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
- s = s.redIAdd(s);
- var m = xx.redAdd(xx).redIAdd(xx);
- var t = m.redSqr().redISub(s).redISub(s);
- var yyyy8 = yyyy.redIAdd(yyyy);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- nx = t;
- ny = m.redMul(s.redISub(t)).redISub(yyyy8);
- nz = this.y.redAdd(this.y);
- } else {
- var a = this.x.redSqr();
- var b = this.y.redSqr();
- var c = b.redSqr();
- var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c);
- d = d.redIAdd(d);
- var e = a.redAdd(a).redIAdd(a);
- var f = e.redSqr();
- var c8 = c.redIAdd(c);
- c8 = c8.redIAdd(c8);
- c8 = c8.redIAdd(c8);
- nx = f.redISub(d).redISub(d);
- ny = e.redMul(d.redISub(nx)).redISub(c8);
- nz = this.y.redMul(this.z);
- nz = nz.redIAdd(nz);
- }
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype._threeDbl = function _threeDbl() {
- var nx;
- var ny;
- var nz;
- if (this.zOne) {
- var xx = this.x.redSqr();
- var yy = this.y.redSqr();
- var yyyy = yy.redSqr();
- var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
- s = s.redIAdd(s);
- var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a);
- var t = m.redSqr().redISub(s).redISub(s);
- nx = t;
- var yyyy8 = yyyy.redIAdd(yyyy);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- yyyy8 = yyyy8.redIAdd(yyyy8);
- ny = m.redMul(s.redISub(t)).redISub(yyyy8);
- nz = this.y.redAdd(this.y);
- } else {
- var delta = this.z.redSqr();
- var gamma = this.y.redSqr();
- var beta = this.x.redMul(gamma);
- var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta));
- alpha = alpha.redAdd(alpha).redIAdd(alpha);
- var beta4 = beta.redIAdd(beta);
- beta4 = beta4.redIAdd(beta4);
- var beta8 = beta4.redAdd(beta4);
- nx = alpha.redSqr().redISub(beta8);
- nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta);
- var ggamma8 = gamma.redSqr();
- ggamma8 = ggamma8.redIAdd(ggamma8);
- ggamma8 = ggamma8.redIAdd(ggamma8);
- ggamma8 = ggamma8.redIAdd(ggamma8);
- ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8);
- }
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype._dbl = function _dbl() {
- var a = this.curve.a;
- var jx = this.x;
- var jy = this.y;
- var jz = this.z;
- var jz4 = jz.redSqr().redSqr();
- var jx2 = jx.redSqr();
- var jy2 = jy.redSqr();
- var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));
- var jxd4 = jx.redAdd(jx);
- jxd4 = jxd4.redIAdd(jxd4);
- var t1 = jxd4.redMul(jy2);
- var nx = c.redSqr().redISub(t1.redAdd(t1));
- var t2 = t1.redISub(nx);
- var jyd8 = jy2.redSqr();
- jyd8 = jyd8.redIAdd(jyd8);
- jyd8 = jyd8.redIAdd(jyd8);
- jyd8 = jyd8.redIAdd(jyd8);
- var ny = c.redMul(t2).redISub(jyd8);
- var nz = jy.redAdd(jy).redMul(jz);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.trpl = function trpl() {
- if (!this.curve.zeroA)
- return this.dbl().add(this);
- var xx = this.x.redSqr();
- var yy = this.y.redSqr();
- var zz = this.z.redSqr();
- var yyyy = yy.redSqr();
- var m = xx.redAdd(xx).redIAdd(xx);
- var mm = m.redSqr();
- var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);
- e = e.redIAdd(e);
- e = e.redAdd(e).redIAdd(e);
- e = e.redISub(mm);
- var ee = e.redSqr();
- var t = yyyy.redIAdd(yyyy);
- t = t.redIAdd(t);
- t = t.redIAdd(t);
- t = t.redIAdd(t);
- var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t);
- var yyu4 = yy.redMul(u);
- yyu4 = yyu4.redIAdd(yyu4);
- yyu4 = yyu4.redIAdd(yyu4);
- var nx = this.x.redMul(ee).redISub(yyu4);
- nx = nx.redIAdd(nx);
- nx = nx.redIAdd(nx);
- var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee)));
- ny = ny.redIAdd(ny);
- ny = ny.redIAdd(ny);
- ny = ny.redIAdd(ny);
- var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee);
- return this.curve.jpoint(nx, ny, nz);
- };
- JPoint.prototype.mul = function mul(k, kbase) {
- k = new BN(k, kbase);
- return this.curve._wnafMul(this, k);
- };
- JPoint.prototype.eq = function eq(p) {
- if (p.type === "affine")
- return this.eq(p.toJ());
- if (this === p)
- return true;
- var z2 = this.z.redSqr();
- var pz2 = p.z.redSqr();
- if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0)
- return false;
- var z3 = z2.redMul(this.z);
- var pz3 = pz2.redMul(p.z);
- return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0;
- };
- JPoint.prototype.eqXToP = function eqXToP(x) {
- var zs = this.z.redSqr();
- var rx = x.toRed(this.curve.red).redMul(zs);
- if (this.x.cmp(rx) === 0)
- return true;
- var xc = x.clone();
- var t = this.curve.redN.redMul(zs);
- for (;; ) {
- xc.iadd(this.curve.n);
- if (xc.cmp(this.curve.p) >= 0)
- return false;
- rx.redIAdd(t);
- if (this.x.cmp(rx) === 0)
- return true;
- }
- };
- JPoint.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- JPoint.prototype.isInfinity = function isInfinity() {
- return this.z.cmpn(0) === 0;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/mont.js
-var require_mont = __commonJS((exports, module) => {
- var BN = require_bn();
- var inherits = require_inherits();
- var Base = require_base2();
- var utils = require_utils2();
- function MontCurve(conf) {
- Base.call(this, "mont", conf);
- this.a = new BN(conf.a, 16).toRed(this.red);
- this.b = new BN(conf.b, 16).toRed(this.red);
- this.i4 = new BN(4).toRed(this.red).redInvm();
- this.two = new BN(2).toRed(this.red);
- this.a24 = this.i4.redMul(this.a.redAdd(this.two));
- }
- inherits(MontCurve, Base);
- module.exports = MontCurve;
- MontCurve.prototype.validate = function validate(point) {
- var x = point.normalize().x;
- var x2 = x.redSqr();
- var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x);
- var y = rhs.redSqrt();
- return y.redSqr().cmp(rhs) === 0;
- };
- function Point(curve, x, z) {
- Base.BasePoint.call(this, curve, "projective");
- if (x === null && z === null) {
- this.x = this.curve.one;
- this.z = this.curve.zero;
- } else {
- this.x = new BN(x, 16);
- this.z = new BN(z, 16);
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.z.red)
- this.z = this.z.toRed(this.curve.red);
- }
- }
- inherits(Point, Base.BasePoint);
- MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) {
- return this.point(utils.toArray(bytes, enc), 1);
- };
- MontCurve.prototype.point = function point(x, z) {
- return new Point(this, x, z);
- };
- MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
- return Point.fromJSON(this, obj);
- };
- Point.prototype.precompute = function precompute() {};
- Point.prototype._encode = function _encode() {
- return this.getX().toArray("be", this.curve.p.byteLength());
- };
- Point.fromJSON = function fromJSON(curve, obj) {
- return new Point(curve, obj[0], obj[1] || curve.one);
- };
- Point.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- Point.prototype.isInfinity = function isInfinity() {
- return this.z.cmpn(0) === 0;
- };
- Point.prototype.dbl = function dbl() {
- var a = this.x.redAdd(this.z);
- var aa = a.redSqr();
- var b = this.x.redSub(this.z);
- var bb = b.redSqr();
- var c = aa.redSub(bb);
- var nx = aa.redMul(bb);
- var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c)));
- return this.curve.point(nx, nz);
- };
- Point.prototype.add = function add() {
- throw new Error("Not supported on Montgomery curve");
- };
- Point.prototype.diffAdd = function diffAdd(p, diff) {
- var a = this.x.redAdd(this.z);
- var b = this.x.redSub(this.z);
- var c = p.x.redAdd(p.z);
- var d = p.x.redSub(p.z);
- var da = d.redMul(a);
- var cb = c.redMul(b);
- var nx = diff.z.redMul(da.redAdd(cb).redSqr());
- var nz = diff.x.redMul(da.redISub(cb).redSqr());
- return this.curve.point(nx, nz);
- };
- Point.prototype.mul = function mul(k) {
- var t = k.clone();
- var a = this;
- var b = this.curve.point(null, null);
- var c = this;
- for (var bits = [];t.cmpn(0) !== 0; t.iushrn(1))
- bits.push(t.andln(1));
- for (var i = bits.length - 1;i >= 0; i--) {
- if (bits[i] === 0) {
- a = a.diffAdd(b, c);
- b = b.dbl();
- } else {
- b = a.diffAdd(b, c);
- a = a.dbl();
- }
- }
- return b;
- };
- Point.prototype.mulAdd = function mulAdd() {
- throw new Error("Not supported on Montgomery curve");
- };
- Point.prototype.jumlAdd = function jumlAdd() {
- throw new Error("Not supported on Montgomery curve");
- };
- Point.prototype.eq = function eq(other) {
- return this.getX().cmp(other.getX()) === 0;
- };
- Point.prototype.normalize = function normalize() {
- this.x = this.x.redMul(this.z.redInvm());
- this.z = this.curve.one;
- return this;
- };
- Point.prototype.getX = function getX() {
- this.normalize();
- return this.x.fromRed();
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/edwards.js
-var require_edwards = __commonJS((exports, module) => {
- var utils = require_utils2();
- var BN = require_bn();
- var inherits = require_inherits();
- var Base = require_base2();
- var assert = utils.assert;
- function EdwardsCurve(conf) {
- this.twisted = (conf.a | 0) !== 1;
- this.mOneA = this.twisted && (conf.a | 0) === -1;
- this.extended = this.mOneA;
- Base.call(this, "edwards", conf);
- this.a = new BN(conf.a, 16).umod(this.red.m);
- this.a = this.a.toRed(this.red);
- this.c = new BN(conf.c, 16).toRed(this.red);
- this.c2 = this.c.redSqr();
- this.d = new BN(conf.d, 16).toRed(this.red);
- this.dd = this.d.redAdd(this.d);
- assert(!this.twisted || this.c.fromRed().cmpn(1) === 0);
- this.oneC = (conf.c | 0) === 1;
- }
- inherits(EdwardsCurve, Base);
- module.exports = EdwardsCurve;
- EdwardsCurve.prototype._mulA = function _mulA(num) {
- if (this.mOneA)
- return num.redNeg();
- else
- return this.a.redMul(num);
- };
- EdwardsCurve.prototype._mulC = function _mulC(num) {
- if (this.oneC)
- return num;
- else
- return this.c.redMul(num);
- };
- EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) {
- return this.point(x, y, z, t);
- };
- EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) {
- x = new BN(x, 16);
- if (!x.red)
- x = x.toRed(this.red);
- var x2 = x.redSqr();
- var rhs = this.c2.redSub(this.a.redMul(x2));
- var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2));
- var y2 = rhs.redMul(lhs.redInvm());
- var y = y2.redSqrt();
- if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)
- throw new Error("invalid point");
- var isOdd = y.fromRed().isOdd();
- if (odd && !isOdd || !odd && isOdd)
- y = y.redNeg();
- return this.point(x, y);
- };
- EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) {
- y = new BN(y, 16);
- if (!y.red)
- y = y.toRed(this.red);
- var y2 = y.redSqr();
- var lhs = y2.redSub(this.c2);
- var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a);
- var x2 = lhs.redMul(rhs.redInvm());
- if (x2.cmp(this.zero) === 0) {
- if (odd)
- throw new Error("invalid point");
- else
- return this.point(this.zero, y);
- }
- var x = x2.redSqrt();
- if (x.redSqr().redSub(x2).cmp(this.zero) !== 0)
- throw new Error("invalid point");
- if (x.fromRed().isOdd() !== odd)
- x = x.redNeg();
- return this.point(x, y);
- };
- EdwardsCurve.prototype.validate = function validate(point) {
- if (point.isInfinity())
- return true;
- point.normalize();
- var x2 = point.x.redSqr();
- var y2 = point.y.redSqr();
- var lhs = x2.redMul(this.a).redAdd(y2);
- var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2)));
- return lhs.cmp(rhs) === 0;
- };
- function Point(curve, x, y, z, t) {
- Base.BasePoint.call(this, curve, "projective");
- if (x === null && y === null && z === null) {
- this.x = this.curve.zero;
- this.y = this.curve.one;
- this.z = this.curve.one;
- this.t = this.curve.zero;
- this.zOne = true;
- } else {
- this.x = new BN(x, 16);
- this.y = new BN(y, 16);
- this.z = z ? new BN(z, 16) : this.curve.one;
- this.t = t && new BN(t, 16);
- if (!this.x.red)
- this.x = this.x.toRed(this.curve.red);
- if (!this.y.red)
- this.y = this.y.toRed(this.curve.red);
- if (!this.z.red)
- this.z = this.z.toRed(this.curve.red);
- if (this.t && !this.t.red)
- this.t = this.t.toRed(this.curve.red);
- this.zOne = this.z === this.curve.one;
- if (this.curve.extended && !this.t) {
- this.t = this.x.redMul(this.y);
- if (!this.zOne)
- this.t = this.t.redMul(this.z.redInvm());
- }
- }
- }
- inherits(Point, Base.BasePoint);
- EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) {
- return Point.fromJSON(this, obj);
- };
- EdwardsCurve.prototype.point = function point(x, y, z, t) {
- return new Point(this, x, y, z, t);
- };
- Point.fromJSON = function fromJSON(curve, obj) {
- return new Point(curve, obj[0], obj[1], obj[2]);
- };
- Point.prototype.inspect = function inspect() {
- if (this.isInfinity())
- return "";
- return "";
- };
- Point.prototype.isInfinity = function isInfinity() {
- return this.x.cmpn(0) === 0 && (this.y.cmp(this.z) === 0 || this.zOne && this.y.cmp(this.curve.c) === 0);
- };
- Point.prototype._extDbl = function _extDbl() {
- var a = this.x.redSqr();
- var b = this.y.redSqr();
- var c = this.z.redSqr();
- c = c.redIAdd(c);
- var d = this.curve._mulA(a);
- var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b);
- var g = d.redAdd(b);
- var f = g.redSub(c);
- var h = d.redSub(b);
- var nx = e.redMul(f);
- var ny = g.redMul(h);
- var nt = e.redMul(h);
- var nz = f.redMul(g);
- return this.curve.point(nx, ny, nz, nt);
- };
- Point.prototype._projDbl = function _projDbl() {
- var b = this.x.redAdd(this.y).redSqr();
- var c = this.x.redSqr();
- var d = this.y.redSqr();
- var nx;
- var ny;
- var nz;
- var e;
- var h;
- var j;
- if (this.curve.twisted) {
- e = this.curve._mulA(c);
- var f = e.redAdd(d);
- if (this.zOne) {
- nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two));
- ny = f.redMul(e.redSub(d));
- nz = f.redSqr().redSub(f).redSub(f);
- } else {
- h = this.z.redSqr();
- j = f.redSub(h).redISub(h);
- nx = b.redSub(c).redISub(d).redMul(j);
- ny = f.redMul(e.redSub(d));
- nz = f.redMul(j);
- }
- } else {
- e = c.redAdd(d);
- h = this.curve._mulC(this.z).redSqr();
- j = e.redSub(h).redSub(h);
- nx = this.curve._mulC(b.redISub(e)).redMul(j);
- ny = this.curve._mulC(e).redMul(c.redISub(d));
- nz = e.redMul(j);
- }
- return this.curve.point(nx, ny, nz);
- };
- Point.prototype.dbl = function dbl() {
- if (this.isInfinity())
- return this;
- if (this.curve.extended)
- return this._extDbl();
- else
- return this._projDbl();
- };
- Point.prototype._extAdd = function _extAdd(p) {
- var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x));
- var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x));
- var c = this.t.redMul(this.curve.dd).redMul(p.t);
- var d = this.z.redMul(p.z.redAdd(p.z));
- var e = b.redSub(a);
- var f = d.redSub(c);
- var g = d.redAdd(c);
- var h = b.redAdd(a);
- var nx = e.redMul(f);
- var ny = g.redMul(h);
- var nt = e.redMul(h);
- var nz = f.redMul(g);
- return this.curve.point(nx, ny, nz, nt);
- };
- Point.prototype._projAdd = function _projAdd(p) {
- var a = this.z.redMul(p.z);
- var b = a.redSqr();
- var c = this.x.redMul(p.x);
- var d = this.y.redMul(p.y);
- var e = this.curve.d.redMul(c).redMul(d);
- var f = b.redSub(e);
- var g = b.redAdd(e);
- var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d);
- var nx = a.redMul(f).redMul(tmp);
- var ny;
- var nz;
- if (this.curve.twisted) {
- ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c)));
- nz = f.redMul(g);
- } else {
- ny = a.redMul(g).redMul(d.redSub(c));
- nz = this.curve._mulC(f).redMul(g);
- }
- return this.curve.point(nx, ny, nz);
- };
- Point.prototype.add = function add(p) {
- if (this.isInfinity())
- return p;
- if (p.isInfinity())
- return this;
- if (this.curve.extended)
- return this._extAdd(p);
- else
- return this._projAdd(p);
- };
- Point.prototype.mul = function mul(k) {
- if (this._hasDoubles(k))
- return this.curve._fixedNafMul(this, k);
- else
- return this.curve._wnafMul(this, k);
- };
- Point.prototype.mulAdd = function mulAdd(k1, p, k2) {
- return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, false);
- };
- Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) {
- return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, true);
- };
- Point.prototype.normalize = function normalize() {
- if (this.zOne)
- return this;
- var zi = this.z.redInvm();
- this.x = this.x.redMul(zi);
- this.y = this.y.redMul(zi);
- if (this.t)
- this.t = this.t.redMul(zi);
- this.z = this.curve.one;
- this.zOne = true;
- return this;
- };
- Point.prototype.neg = function neg() {
- return this.curve.point(this.x.redNeg(), this.y, this.z, this.t && this.t.redNeg());
- };
- Point.prototype.getX = function getX() {
- this.normalize();
- return this.x.fromRed();
- };
- Point.prototype.getY = function getY() {
- this.normalize();
- return this.y.fromRed();
- };
- Point.prototype.eq = function eq(other) {
- return this === other || this.getX().cmp(other.getX()) === 0 && this.getY().cmp(other.getY()) === 0;
- };
- Point.prototype.eqXToP = function eqXToP(x) {
- var rx = x.toRed(this.curve.red).redMul(this.z);
- if (this.x.cmp(rx) === 0)
- return true;
- var xc = x.clone();
- var t = this.curve.redN.redMul(this.z);
- for (;; ) {
- xc.iadd(this.curve.n);
- if (xc.cmp(this.curve.p) >= 0)
- return false;
- rx.redIAdd(t);
- if (this.x.cmp(rx) === 0)
- return true;
- }
- };
- Point.prototype.toP = Point.prototype.normalize;
- Point.prototype.mixedAdd = Point.prototype.add;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curve/index.js
-var require_curve = __commonJS((exports) => {
- var curve = exports;
- curve.base = require_base2();
- curve.short = require_short();
- curve.mont = require_mont();
- curve.edwards = require_edwards();
-});
-
-// ../eve/node_modules/hash.js/lib/hash/utils.js
-var require_utils3 = __commonJS((exports) => {
- var assert = require_minimalistic_assert();
- var inherits = require_inherits();
- exports.inherits = inherits;
- function isSurrogatePair(msg, i) {
- if ((msg.charCodeAt(i) & 64512) !== 55296) {
- return false;
- }
- if (i < 0 || i + 1 >= msg.length) {
- return false;
- }
- return (msg.charCodeAt(i + 1) & 64512) === 56320;
- }
- function toArray(msg, enc) {
- if (Array.isArray(msg))
- return msg.slice();
- if (!msg)
- return [];
- var res = [];
- if (typeof msg === "string") {
- if (!enc) {
- var p = 0;
- for (var i = 0;i < msg.length; i++) {
- var c = msg.charCodeAt(i);
- if (c < 128) {
- res[p++] = c;
- } else if (c < 2048) {
- res[p++] = c >> 6 | 192;
- res[p++] = c & 63 | 128;
- } else if (isSurrogatePair(msg, i)) {
- c = 65536 + ((c & 1023) << 10) + (msg.charCodeAt(++i) & 1023);
- res[p++] = c >> 18 | 240;
- res[p++] = c >> 12 & 63 | 128;
- res[p++] = c >> 6 & 63 | 128;
- res[p++] = c & 63 | 128;
- } else {
- res[p++] = c >> 12 | 224;
- res[p++] = c >> 6 & 63 | 128;
- res[p++] = c & 63 | 128;
- }
- }
- } else if (enc === "hex") {
- msg = msg.replace(/[^a-z0-9]+/ig, "");
- if (msg.length % 2 !== 0)
- msg = "0" + msg;
- for (i = 0;i < msg.length; i += 2)
- res.push(parseInt(msg[i] + msg[i + 1], 16));
- }
- } else {
- for (i = 0;i < msg.length; i++)
- res[i] = msg[i] | 0;
- }
- return res;
- }
- exports.toArray = toArray;
- function toHex(msg) {
- var res = "";
- for (var i = 0;i < msg.length; i++)
- res += zero2(msg[i].toString(16));
- return res;
- }
- exports.toHex = toHex;
- function htonl(w) {
- var res = w >>> 24 | w >>> 8 & 65280 | w << 8 & 16711680 | (w & 255) << 24;
- return res >>> 0;
- }
- exports.htonl = htonl;
- function toHex32(msg, endian) {
- var res = "";
- for (var i = 0;i < msg.length; i++) {
- var w = msg[i];
- if (endian === "little")
- w = htonl(w);
- res += zero8(w.toString(16));
- }
- return res;
- }
- exports.toHex32 = toHex32;
- function zero2(word) {
- if (word.length === 1)
- return "0" + word;
- else
- return word;
- }
- exports.zero2 = zero2;
- function zero8(word) {
- if (word.length === 7)
- return "0" + word;
- else if (word.length === 6)
- return "00" + word;
- else if (word.length === 5)
- return "000" + word;
- else if (word.length === 4)
- return "0000" + word;
- else if (word.length === 3)
- return "00000" + word;
- else if (word.length === 2)
- return "000000" + word;
- else if (word.length === 1)
- return "0000000" + word;
- else
- return word;
- }
- exports.zero8 = zero8;
- function join32(msg, start, end, endian) {
- var len = end - start;
- assert(len % 4 === 0);
- var res = new Array(len / 4);
- for (var i = 0, k = start;i < res.length; i++, k += 4) {
- var w;
- if (endian === "big")
- w = msg[k] << 24 | msg[k + 1] << 16 | msg[k + 2] << 8 | msg[k + 3];
- else
- w = msg[k + 3] << 24 | msg[k + 2] << 16 | msg[k + 1] << 8 | msg[k];
- res[i] = w >>> 0;
- }
- return res;
- }
- exports.join32 = join32;
- function split32(msg, endian) {
- var res = new Array(msg.length * 4);
- for (var i = 0, k = 0;i < msg.length; i++, k += 4) {
- var m = msg[i];
- if (endian === "big") {
- res[k] = m >>> 24;
- res[k + 1] = m >>> 16 & 255;
- res[k + 2] = m >>> 8 & 255;
- res[k + 3] = m & 255;
- } else {
- res[k + 3] = m >>> 24;
- res[k + 2] = m >>> 16 & 255;
- res[k + 1] = m >>> 8 & 255;
- res[k] = m & 255;
- }
- }
- return res;
- }
- exports.split32 = split32;
- function rotr32(w, b) {
- return w >>> b | w << 32 - b;
- }
- exports.rotr32 = rotr32;
- function rotl32(w, b) {
- return w << b | w >>> 32 - b;
- }
- exports.rotl32 = rotl32;
- function sum32(a, b) {
- return a + b >>> 0;
- }
- exports.sum32 = sum32;
- function sum32_3(a, b, c) {
- return a + b + c >>> 0;
- }
- exports.sum32_3 = sum32_3;
- function sum32_4(a, b, c, d) {
- return a + b + c + d >>> 0;
- }
- exports.sum32_4 = sum32_4;
- function sum32_5(a, b, c, d, e) {
- return a + b + c + d + e >>> 0;
- }
- exports.sum32_5 = sum32_5;
- function sum64(buf, pos, ah, al) {
- var bh = buf[pos];
- var bl = buf[pos + 1];
- var lo = al + bl >>> 0;
- var hi = (lo < al ? 1 : 0) + ah + bh;
- buf[pos] = hi >>> 0;
- buf[pos + 1] = lo;
- }
- exports.sum64 = sum64;
- function sum64_hi(ah, al, bh, bl) {
- var lo = al + bl >>> 0;
- var hi = (lo < al ? 1 : 0) + ah + bh;
- return hi >>> 0;
- }
- exports.sum64_hi = sum64_hi;
- function sum64_lo(ah, al, bh, bl) {
- var lo = al + bl;
- return lo >>> 0;
- }
- exports.sum64_lo = sum64_lo;
- function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) {
- var carry = 0;
- var lo = al;
- lo = lo + bl >>> 0;
- carry += lo < al ? 1 : 0;
- lo = lo + cl >>> 0;
- carry += lo < cl ? 1 : 0;
- lo = lo + dl >>> 0;
- carry += lo < dl ? 1 : 0;
- var hi = ah + bh + ch + dh + carry;
- return hi >>> 0;
- }
- exports.sum64_4_hi = sum64_4_hi;
- function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) {
- var lo = al + bl + cl + dl;
- return lo >>> 0;
- }
- exports.sum64_4_lo = sum64_4_lo;
- function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
- var carry = 0;
- var lo = al;
- lo = lo + bl >>> 0;
- carry += lo < al ? 1 : 0;
- lo = lo + cl >>> 0;
- carry += lo < cl ? 1 : 0;
- lo = lo + dl >>> 0;
- carry += lo < dl ? 1 : 0;
- lo = lo + el >>> 0;
- carry += lo < el ? 1 : 0;
- var hi = ah + bh + ch + dh + eh + carry;
- return hi >>> 0;
- }
- exports.sum64_5_hi = sum64_5_hi;
- function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
- var lo = al + bl + cl + dl + el;
- return lo >>> 0;
- }
- exports.sum64_5_lo = sum64_5_lo;
- function rotr64_hi(ah, al, num) {
- var r = al << 32 - num | ah >>> num;
- return r >>> 0;
- }
- exports.rotr64_hi = rotr64_hi;
- function rotr64_lo(ah, al, num) {
- var r = ah << 32 - num | al >>> num;
- return r >>> 0;
- }
- exports.rotr64_lo = rotr64_lo;
- function shr64_hi(ah, al, num) {
- return ah >>> num;
- }
- exports.shr64_hi = shr64_hi;
- function shr64_lo(ah, al, num) {
- var r = ah << 32 - num | al >>> num;
- return r >>> 0;
- }
- exports.shr64_lo = shr64_lo;
-});
-
-// ../eve/node_modules/hash.js/lib/hash/common.js
-var require_common = __commonJS((exports) => {
- var utils = require_utils3();
- var assert = require_minimalistic_assert();
- function BlockHash() {
- this.pending = null;
- this.pendingTotal = 0;
- this.blockSize = this.constructor.blockSize;
- this.outSize = this.constructor.outSize;
- this.hmacStrength = this.constructor.hmacStrength;
- this.padLength = this.constructor.padLength / 8;
- this.endian = "big";
- this._delta8 = this.blockSize / 8;
- this._delta32 = this.blockSize / 32;
- }
- exports.BlockHash = BlockHash;
- BlockHash.prototype.update = function update(msg, enc) {
- msg = utils.toArray(msg, enc);
- if (!this.pending)
- this.pending = msg;
- else
- this.pending = this.pending.concat(msg);
- this.pendingTotal += msg.length;
- if (this.pending.length >= this._delta8) {
- msg = this.pending;
- var r = msg.length % this._delta8;
- this.pending = msg.slice(msg.length - r, msg.length);
- if (this.pending.length === 0)
- this.pending = null;
- msg = utils.join32(msg, 0, msg.length - r, this.endian);
- for (var i = 0;i < msg.length; i += this._delta32)
- this._update(msg, i, i + this._delta32);
- }
- return this;
- };
- BlockHash.prototype.digest = function digest(enc) {
- this.update(this._pad());
- assert(this.pending === null);
- return this._digest(enc);
- };
- BlockHash.prototype._pad = function pad() {
- var len = this.pendingTotal;
- var bytes = this._delta8;
- var k = bytes - (len + this.padLength) % bytes;
- var res = new Array(k + this.padLength);
- res[0] = 128;
- for (var i = 1;i < k; i++)
- res[i] = 0;
- len <<= 3;
- if (this.endian === "big") {
- for (var t = 8;t < this.padLength; t++)
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = len >>> 24 & 255;
- res[i++] = len >>> 16 & 255;
- res[i++] = len >>> 8 & 255;
- res[i++] = len & 255;
- } else {
- res[i++] = len & 255;
- res[i++] = len >>> 8 & 255;
- res[i++] = len >>> 16 & 255;
- res[i++] = len >>> 24 & 255;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- res[i++] = 0;
- for (t = 8;t < this.padLength; t++)
- res[i++] = 0;
- }
- return res;
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/common.js
-var require_common2 = __commonJS((exports) => {
- var utils = require_utils3();
- var rotr32 = utils.rotr32;
- function ft_1(s, x, y, z) {
- if (s === 0)
- return ch32(x, y, z);
- if (s === 1 || s === 3)
- return p32(x, y, z);
- if (s === 2)
- return maj32(x, y, z);
- }
- exports.ft_1 = ft_1;
- function ch32(x, y, z) {
- return x & y ^ ~x & z;
- }
- exports.ch32 = ch32;
- function maj32(x, y, z) {
- return x & y ^ x & z ^ y & z;
- }
- exports.maj32 = maj32;
- function p32(x, y, z) {
- return x ^ y ^ z;
- }
- exports.p32 = p32;
- function s0_256(x) {
- return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22);
- }
- exports.s0_256 = s0_256;
- function s1_256(x) {
- return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25);
- }
- exports.s1_256 = s1_256;
- function g0_256(x) {
- return rotr32(x, 7) ^ rotr32(x, 18) ^ x >>> 3;
- }
- exports.g0_256 = g0_256;
- function g1_256(x) {
- return rotr32(x, 17) ^ rotr32(x, 19) ^ x >>> 10;
- }
- exports.g1_256 = g1_256;
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/1.js
-var require_1 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var common = require_common();
- var shaCommon = require_common2();
- var rotl32 = utils.rotl32;
- var sum32 = utils.sum32;
- var sum32_5 = utils.sum32_5;
- var ft_1 = shaCommon.ft_1;
- var BlockHash = common.BlockHash;
- var sha1_K = [
- 1518500249,
- 1859775393,
- 2400959708,
- 3395469782
- ];
- function SHA1() {
- if (!(this instanceof SHA1))
- return new SHA1;
- BlockHash.call(this);
- this.h = [
- 1732584193,
- 4023233417,
- 2562383102,
- 271733878,
- 3285377520
- ];
- this.W = new Array(80);
- }
- utils.inherits(SHA1, BlockHash);
- module.exports = SHA1;
- SHA1.blockSize = 512;
- SHA1.outSize = 160;
- SHA1.hmacStrength = 80;
- SHA1.padLength = 64;
- SHA1.prototype._update = function _update(msg, start) {
- var W = this.W;
- for (var i = 0;i < 16; i++)
- W[i] = msg[start + i];
- for (;i < W.length; i++)
- W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
- var a = this.h[0];
- var b = this.h[1];
- var c = this.h[2];
- var d = this.h[3];
- var e = this.h[4];
- for (i = 0;i < W.length; i++) {
- var s = ~~(i / 20);
- var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]);
- e = d;
- d = c;
- c = rotl32(b, 30);
- b = a;
- a = t;
- }
- this.h[0] = sum32(this.h[0], a);
- this.h[1] = sum32(this.h[1], b);
- this.h[2] = sum32(this.h[2], c);
- this.h[3] = sum32(this.h[3], d);
- this.h[4] = sum32(this.h[4], e);
- };
- SHA1.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "big");
- else
- return utils.split32(this.h, "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/256.js
-var require_256 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var common = require_common();
- var shaCommon = require_common2();
- var assert = require_minimalistic_assert();
- var sum32 = utils.sum32;
- var sum32_4 = utils.sum32_4;
- var sum32_5 = utils.sum32_5;
- var ch32 = shaCommon.ch32;
- var maj32 = shaCommon.maj32;
- var s0_256 = shaCommon.s0_256;
- var s1_256 = shaCommon.s1_256;
- var g0_256 = shaCommon.g0_256;
- var g1_256 = shaCommon.g1_256;
- var BlockHash = common.BlockHash;
- var sha256_K = [
- 1116352408,
- 1899447441,
- 3049323471,
- 3921009573,
- 961987163,
- 1508970993,
- 2453635748,
- 2870763221,
- 3624381080,
- 310598401,
- 607225278,
- 1426881987,
- 1925078388,
- 2162078206,
- 2614888103,
- 3248222580,
- 3835390401,
- 4022224774,
- 264347078,
- 604807628,
- 770255983,
- 1249150122,
- 1555081692,
- 1996064986,
- 2554220882,
- 2821834349,
- 2952996808,
- 3210313671,
- 3336571891,
- 3584528711,
- 113926993,
- 338241895,
- 666307205,
- 773529912,
- 1294757372,
- 1396182291,
- 1695183700,
- 1986661051,
- 2177026350,
- 2456956037,
- 2730485921,
- 2820302411,
- 3259730800,
- 3345764771,
- 3516065817,
- 3600352804,
- 4094571909,
- 275423344,
- 430227734,
- 506948616,
- 659060556,
- 883997877,
- 958139571,
- 1322822218,
- 1537002063,
- 1747873779,
- 1955562222,
- 2024104815,
- 2227730452,
- 2361852424,
- 2428436474,
- 2756734187,
- 3204031479,
- 3329325298
- ];
- function SHA256() {
- if (!(this instanceof SHA256))
- return new SHA256;
- BlockHash.call(this);
- this.h = [
- 1779033703,
- 3144134277,
- 1013904242,
- 2773480762,
- 1359893119,
- 2600822924,
- 528734635,
- 1541459225
- ];
- this.k = sha256_K;
- this.W = new Array(64);
- }
- utils.inherits(SHA256, BlockHash);
- module.exports = SHA256;
- SHA256.blockSize = 512;
- SHA256.outSize = 256;
- SHA256.hmacStrength = 192;
- SHA256.padLength = 64;
- SHA256.prototype._update = function _update(msg, start) {
- var W = this.W;
- for (var i = 0;i < 16; i++)
- W[i] = msg[start + i];
- for (;i < W.length; i++)
- W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]);
- var a = this.h[0];
- var b = this.h[1];
- var c = this.h[2];
- var d = this.h[3];
- var e = this.h[4];
- var f = this.h[5];
- var g = this.h[6];
- var h = this.h[7];
- assert(this.k.length === W.length);
- for (i = 0;i < W.length; i++) {
- var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]);
- var T2 = sum32(s0_256(a), maj32(a, b, c));
- h = g;
- g = f;
- f = e;
- e = sum32(d, T1);
- d = c;
- c = b;
- b = a;
- a = sum32(T1, T2);
- }
- this.h[0] = sum32(this.h[0], a);
- this.h[1] = sum32(this.h[1], b);
- this.h[2] = sum32(this.h[2], c);
- this.h[3] = sum32(this.h[3], d);
- this.h[4] = sum32(this.h[4], e);
- this.h[5] = sum32(this.h[5], f);
- this.h[6] = sum32(this.h[6], g);
- this.h[7] = sum32(this.h[7], h);
- };
- SHA256.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "big");
- else
- return utils.split32(this.h, "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/224.js
-var require_224 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var SHA256 = require_256();
- function SHA224() {
- if (!(this instanceof SHA224))
- return new SHA224;
- SHA256.call(this);
- this.h = [
- 3238371032,
- 914150663,
- 812702999,
- 4144912697,
- 4290775857,
- 1750603025,
- 1694076839,
- 3204075428
- ];
- }
- utils.inherits(SHA224, SHA256);
- module.exports = SHA224;
- SHA224.blockSize = 512;
- SHA224.outSize = 224;
- SHA224.hmacStrength = 192;
- SHA224.padLength = 64;
- SHA224.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h.slice(0, 7), "big");
- else
- return utils.split32(this.h.slice(0, 7), "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/512.js
-var require_512 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var common = require_common();
- var assert = require_minimalistic_assert();
- var rotr64_hi = utils.rotr64_hi;
- var rotr64_lo = utils.rotr64_lo;
- var shr64_hi = utils.shr64_hi;
- var shr64_lo = utils.shr64_lo;
- var sum64 = utils.sum64;
- var sum64_hi = utils.sum64_hi;
- var sum64_lo = utils.sum64_lo;
- var sum64_4_hi = utils.sum64_4_hi;
- var sum64_4_lo = utils.sum64_4_lo;
- var sum64_5_hi = utils.sum64_5_hi;
- var sum64_5_lo = utils.sum64_5_lo;
- var BlockHash = common.BlockHash;
- var sha512_K = [
- 1116352408,
- 3609767458,
- 1899447441,
- 602891725,
- 3049323471,
- 3964484399,
- 3921009573,
- 2173295548,
- 961987163,
- 4081628472,
- 1508970993,
- 3053834265,
- 2453635748,
- 2937671579,
- 2870763221,
- 3664609560,
- 3624381080,
- 2734883394,
- 310598401,
- 1164996542,
- 607225278,
- 1323610764,
- 1426881987,
- 3590304994,
- 1925078388,
- 4068182383,
- 2162078206,
- 991336113,
- 2614888103,
- 633803317,
- 3248222580,
- 3479774868,
- 3835390401,
- 2666613458,
- 4022224774,
- 944711139,
- 264347078,
- 2341262773,
- 604807628,
- 2007800933,
- 770255983,
- 1495990901,
- 1249150122,
- 1856431235,
- 1555081692,
- 3175218132,
- 1996064986,
- 2198950837,
- 2554220882,
- 3999719339,
- 2821834349,
- 766784016,
- 2952996808,
- 2566594879,
- 3210313671,
- 3203337956,
- 3336571891,
- 1034457026,
- 3584528711,
- 2466948901,
- 113926993,
- 3758326383,
- 338241895,
- 168717936,
- 666307205,
- 1188179964,
- 773529912,
- 1546045734,
- 1294757372,
- 1522805485,
- 1396182291,
- 2643833823,
- 1695183700,
- 2343527390,
- 1986661051,
- 1014477480,
- 2177026350,
- 1206759142,
- 2456956037,
- 344077627,
- 2730485921,
- 1290863460,
- 2820302411,
- 3158454273,
- 3259730800,
- 3505952657,
- 3345764771,
- 106217008,
- 3516065817,
- 3606008344,
- 3600352804,
- 1432725776,
- 4094571909,
- 1467031594,
- 275423344,
- 851169720,
- 430227734,
- 3100823752,
- 506948616,
- 1363258195,
- 659060556,
- 3750685593,
- 883997877,
- 3785050280,
- 958139571,
- 3318307427,
- 1322822218,
- 3812723403,
- 1537002063,
- 2003034995,
- 1747873779,
- 3602036899,
- 1955562222,
- 1575990012,
- 2024104815,
- 1125592928,
- 2227730452,
- 2716904306,
- 2361852424,
- 442776044,
- 2428436474,
- 593698344,
- 2756734187,
- 3733110249,
- 3204031479,
- 2999351573,
- 3329325298,
- 3815920427,
- 3391569614,
- 3928383900,
- 3515267271,
- 566280711,
- 3940187606,
- 3454069534,
- 4118630271,
- 4000239992,
- 116418474,
- 1914138554,
- 174292421,
- 2731055270,
- 289380356,
- 3203993006,
- 460393269,
- 320620315,
- 685471733,
- 587496836,
- 852142971,
- 1086792851,
- 1017036298,
- 365543100,
- 1126000580,
- 2618297676,
- 1288033470,
- 3409855158,
- 1501505948,
- 4234509866,
- 1607167915,
- 987167468,
- 1816402316,
- 1246189591
- ];
- function SHA512() {
- if (!(this instanceof SHA512))
- return new SHA512;
- BlockHash.call(this);
- this.h = [
- 1779033703,
- 4089235720,
- 3144134277,
- 2227873595,
- 1013904242,
- 4271175723,
- 2773480762,
- 1595750129,
- 1359893119,
- 2917565137,
- 2600822924,
- 725511199,
- 528734635,
- 4215389547,
- 1541459225,
- 327033209
- ];
- this.k = sha512_K;
- this.W = new Array(160);
- }
- utils.inherits(SHA512, BlockHash);
- module.exports = SHA512;
- SHA512.blockSize = 1024;
- SHA512.outSize = 512;
- SHA512.hmacStrength = 192;
- SHA512.padLength = 128;
- SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) {
- var W = this.W;
- for (var i = 0;i < 32; i++)
- W[i] = msg[start + i];
- for (;i < W.length; i += 2) {
- var c0_hi = g1_512_hi(W[i - 4], W[i - 3]);
- var c0_lo = g1_512_lo(W[i - 4], W[i - 3]);
- var c1_hi = W[i - 14];
- var c1_lo = W[i - 13];
- var c2_hi = g0_512_hi(W[i - 30], W[i - 29]);
- var c2_lo = g0_512_lo(W[i - 30], W[i - 29]);
- var c3_hi = W[i - 32];
- var c3_lo = W[i - 31];
- W[i] = sum64_4_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo);
- W[i + 1] = sum64_4_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo);
- }
- };
- SHA512.prototype._update = function _update(msg, start) {
- this._prepareBlock(msg, start);
- var W = this.W;
- var ah = this.h[0];
- var al = this.h[1];
- var bh = this.h[2];
- var bl = this.h[3];
- var ch = this.h[4];
- var cl = this.h[5];
- var dh = this.h[6];
- var dl = this.h[7];
- var eh = this.h[8];
- var el = this.h[9];
- var fh = this.h[10];
- var fl = this.h[11];
- var gh = this.h[12];
- var gl = this.h[13];
- var hh = this.h[14];
- var hl = this.h[15];
- assert(this.k.length === W.length);
- for (var i = 0;i < W.length; i += 2) {
- var c0_hi = hh;
- var c0_lo = hl;
- var c1_hi = s1_512_hi(eh, el);
- var c1_lo = s1_512_lo(eh, el);
- var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl);
- var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl);
- var c3_hi = this.k[i];
- var c3_lo = this.k[i + 1];
- var c4_hi = W[i];
- var c4_lo = W[i + 1];
- var T1_hi = sum64_5_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo);
- var T1_lo = sum64_5_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo);
- c0_hi = s0_512_hi(ah, al);
- c0_lo = s0_512_lo(ah, al);
- c1_hi = maj64_hi(ah, al, bh, bl, ch, cl);
- c1_lo = maj64_lo(ah, al, bh, bl, ch, cl);
- var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo);
- var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo);
- hh = gh;
- hl = gl;
- gh = fh;
- gl = fl;
- fh = eh;
- fl = el;
- eh = sum64_hi(dh, dl, T1_hi, T1_lo);
- el = sum64_lo(dl, dl, T1_hi, T1_lo);
- dh = ch;
- dl = cl;
- ch = bh;
- cl = bl;
- bh = ah;
- bl = al;
- ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo);
- al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo);
- }
- sum64(this.h, 0, ah, al);
- sum64(this.h, 2, bh, bl);
- sum64(this.h, 4, ch, cl);
- sum64(this.h, 6, dh, dl);
- sum64(this.h, 8, eh, el);
- sum64(this.h, 10, fh, fl);
- sum64(this.h, 12, gh, gl);
- sum64(this.h, 14, hh, hl);
- };
- SHA512.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "big");
- else
- return utils.split32(this.h, "big");
- };
- function ch64_hi(xh, xl, yh, yl, zh) {
- var r = xh & yh ^ ~xh & zh;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function ch64_lo(xh, xl, yh, yl, zh, zl) {
- var r = xl & yl ^ ~xl & zl;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function maj64_hi(xh, xl, yh, yl, zh) {
- var r = xh & yh ^ xh & zh ^ yh & zh;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function maj64_lo(xh, xl, yh, yl, zh, zl) {
- var r = xl & yl ^ xl & zl ^ yl & zl;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s0_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 28);
- var c1_hi = rotr64_hi(xl, xh, 2);
- var c2_hi = rotr64_hi(xl, xh, 7);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s0_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 28);
- var c1_lo = rotr64_lo(xl, xh, 2);
- var c2_lo = rotr64_lo(xl, xh, 7);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s1_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 14);
- var c1_hi = rotr64_hi(xh, xl, 18);
- var c2_hi = rotr64_hi(xl, xh, 9);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function s1_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 14);
- var c1_lo = rotr64_lo(xh, xl, 18);
- var c2_lo = rotr64_lo(xl, xh, 9);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g0_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 1);
- var c1_hi = rotr64_hi(xh, xl, 8);
- var c2_hi = shr64_hi(xh, xl, 7);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g0_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 1);
- var c1_lo = rotr64_lo(xh, xl, 8);
- var c2_lo = shr64_lo(xh, xl, 7);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g1_512_hi(xh, xl) {
- var c0_hi = rotr64_hi(xh, xl, 19);
- var c1_hi = rotr64_hi(xl, xh, 29);
- var c2_hi = shr64_hi(xh, xl, 6);
- var r = c0_hi ^ c1_hi ^ c2_hi;
- if (r < 0)
- r += 4294967296;
- return r;
- }
- function g1_512_lo(xh, xl) {
- var c0_lo = rotr64_lo(xh, xl, 19);
- var c1_lo = rotr64_lo(xl, xh, 29);
- var c2_lo = shr64_lo(xh, xl, 6);
- var r = c0_lo ^ c1_lo ^ c2_lo;
- if (r < 0)
- r += 4294967296;
- return r;
- }
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha/384.js
-var require_384 = __commonJS((exports, module) => {
- var utils = require_utils3();
- var SHA512 = require_512();
- function SHA384() {
- if (!(this instanceof SHA384))
- return new SHA384;
- SHA512.call(this);
- this.h = [
- 3418070365,
- 3238371032,
- 1654270250,
- 914150663,
- 2438529370,
- 812702999,
- 355462360,
- 4144912697,
- 1731405415,
- 4290775857,
- 2394180231,
- 1750603025,
- 3675008525,
- 1694076839,
- 1203062813,
- 3204075428
- ];
- }
- utils.inherits(SHA384, SHA512);
- module.exports = SHA384;
- SHA384.blockSize = 1024;
- SHA384.outSize = 384;
- SHA384.hmacStrength = 192;
- SHA384.padLength = 128;
- SHA384.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h.slice(0, 12), "big");
- else
- return utils.split32(this.h.slice(0, 12), "big");
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash/sha.js
-var require_sha = __commonJS((exports) => {
- exports.sha1 = require_1();
- exports.sha224 = require_224();
- exports.sha256 = require_256();
- exports.sha384 = require_384();
- exports.sha512 = require_512();
-});
-
-// ../eve/node_modules/hash.js/lib/hash/ripemd.js
-var require_ripemd = __commonJS((exports) => {
- var utils = require_utils3();
- var common = require_common();
- var rotl32 = utils.rotl32;
- var sum32 = utils.sum32;
- var sum32_3 = utils.sum32_3;
- var sum32_4 = utils.sum32_4;
- var BlockHash = common.BlockHash;
- function RIPEMD160() {
- if (!(this instanceof RIPEMD160))
- return new RIPEMD160;
- BlockHash.call(this);
- this.h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];
- this.endian = "little";
- }
- utils.inherits(RIPEMD160, BlockHash);
- exports.ripemd160 = RIPEMD160;
- RIPEMD160.blockSize = 512;
- RIPEMD160.outSize = 160;
- RIPEMD160.hmacStrength = 192;
- RIPEMD160.padLength = 64;
- RIPEMD160.prototype._update = function update(msg, start) {
- var A = this.h[0];
- var B = this.h[1];
- var C = this.h[2];
- var D = this.h[3];
- var E = this.h[4];
- var Ah = A;
- var Bh = B;
- var Ch = C;
- var Dh = D;
- var Eh = E;
- for (var j = 0;j < 80; j++) {
- var T = sum32(rotl32(sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), s[j]), E);
- A = E;
- E = D;
- D = rotl32(C, 10);
- C = B;
- B = T;
- T = sum32(rotl32(sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), sh[j]), Eh);
- Ah = Eh;
- Eh = Dh;
- Dh = rotl32(Ch, 10);
- Ch = Bh;
- Bh = T;
- }
- T = sum32_3(this.h[1], C, Dh);
- this.h[1] = sum32_3(this.h[2], D, Eh);
- this.h[2] = sum32_3(this.h[3], E, Ah);
- this.h[3] = sum32_3(this.h[4], A, Bh);
- this.h[4] = sum32_3(this.h[0], B, Ch);
- this.h[0] = T;
- };
- RIPEMD160.prototype._digest = function digest(enc) {
- if (enc === "hex")
- return utils.toHex32(this.h, "little");
- else
- return utils.split32(this.h, "little");
- };
- function f(j, x, y, z) {
- if (j <= 15)
- return x ^ y ^ z;
- else if (j <= 31)
- return x & y | ~x & z;
- else if (j <= 47)
- return (x | ~y) ^ z;
- else if (j <= 63)
- return x & z | y & ~z;
- else
- return x ^ (y | ~z);
- }
- function K(j) {
- if (j <= 15)
- return 0;
- else if (j <= 31)
- return 1518500249;
- else if (j <= 47)
- return 1859775393;
- else if (j <= 63)
- return 2400959708;
- else
- return 2840853838;
- }
- function Kh(j) {
- if (j <= 15)
- return 1352829926;
- else if (j <= 31)
- return 1548603684;
- else if (j <= 47)
- return 1836072691;
- else if (j <= 63)
- return 2053994217;
- else
- return 0;
- }
- var r = [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 7,
- 4,
- 13,
- 1,
- 10,
- 6,
- 15,
- 3,
- 12,
- 0,
- 9,
- 5,
- 2,
- 14,
- 11,
- 8,
- 3,
- 10,
- 14,
- 4,
- 9,
- 15,
- 8,
- 1,
- 2,
- 7,
- 0,
- 6,
- 13,
- 11,
- 5,
- 12,
- 1,
- 9,
- 11,
- 10,
- 0,
- 8,
- 12,
- 4,
- 13,
- 3,
- 7,
- 15,
- 14,
- 5,
- 6,
- 2,
- 4,
- 0,
- 5,
- 9,
- 7,
- 12,
- 2,
- 10,
- 14,
- 1,
- 3,
- 8,
- 11,
- 6,
- 15,
- 13
- ];
- var rh = [
- 5,
- 14,
- 7,
- 0,
- 9,
- 2,
- 11,
- 4,
- 13,
- 6,
- 15,
- 8,
- 1,
- 10,
- 3,
- 12,
- 6,
- 11,
- 3,
- 7,
- 0,
- 13,
- 5,
- 10,
- 14,
- 15,
- 8,
- 12,
- 4,
- 9,
- 1,
- 2,
- 15,
- 5,
- 1,
- 3,
- 7,
- 14,
- 6,
- 9,
- 11,
- 8,
- 12,
- 2,
- 10,
- 0,
- 4,
- 13,
- 8,
- 6,
- 4,
- 1,
- 3,
- 11,
- 15,
- 0,
- 5,
- 12,
- 2,
- 13,
- 9,
- 7,
- 10,
- 14,
- 12,
- 15,
- 10,
- 4,
- 1,
- 5,
- 8,
- 7,
- 6,
- 2,
- 13,
- 14,
- 0,
- 3,
- 9,
- 11
- ];
- var s = [
- 11,
- 14,
- 15,
- 12,
- 5,
- 8,
- 7,
- 9,
- 11,
- 13,
- 14,
- 15,
- 6,
- 7,
- 9,
- 8,
- 7,
- 6,
- 8,
- 13,
- 11,
- 9,
- 7,
- 15,
- 7,
- 12,
- 15,
- 9,
- 11,
- 7,
- 13,
- 12,
- 11,
- 13,
- 6,
- 7,
- 14,
- 9,
- 13,
- 15,
- 14,
- 8,
- 13,
- 6,
- 5,
- 12,
- 7,
- 5,
- 11,
- 12,
- 14,
- 15,
- 14,
- 15,
- 9,
- 8,
- 9,
- 14,
- 5,
- 6,
- 8,
- 6,
- 5,
- 12,
- 9,
- 15,
- 5,
- 11,
- 6,
- 8,
- 13,
- 12,
- 5,
- 12,
- 13,
- 14,
- 11,
- 8,
- 5,
- 6
- ];
- var sh = [
- 8,
- 9,
- 9,
- 11,
- 13,
- 15,
- 15,
- 5,
- 7,
- 7,
- 8,
- 11,
- 14,
- 14,
- 12,
- 6,
- 9,
- 13,
- 15,
- 7,
- 12,
- 8,
- 9,
- 11,
- 7,
- 7,
- 12,
- 7,
- 6,
- 15,
- 13,
- 11,
- 9,
- 7,
- 15,
- 11,
- 8,
- 6,
- 6,
- 14,
- 12,
- 13,
- 5,
- 14,
- 13,
- 13,
- 7,
- 5,
- 15,
- 5,
- 8,
- 11,
- 14,
- 14,
- 6,
- 14,
- 6,
- 9,
- 12,
- 9,
- 12,
- 5,
- 15,
- 8,
- 8,
- 5,
- 12,
- 9,
- 12,
- 5,
- 14,
- 6,
- 8,
- 13,
- 6,
- 5,
- 15,
- 13,
- 11,
- 11
- ];
-});
-
-// ../eve/node_modules/hash.js/lib/hash/hmac.js
-var require_hmac = __commonJS((exports, module) => {
- var utils = require_utils3();
- var assert = require_minimalistic_assert();
- function Hmac(hash, key, enc) {
- if (!(this instanceof Hmac))
- return new Hmac(hash, key, enc);
- this.Hash = hash;
- this.blockSize = hash.blockSize / 8;
- this.outSize = hash.outSize / 8;
- this.inner = null;
- this.outer = null;
- this._init(utils.toArray(key, enc));
- }
- module.exports = Hmac;
- Hmac.prototype._init = function init(key) {
- if (key.length > this.blockSize)
- key = new this.Hash().update(key).digest();
- assert(key.length <= this.blockSize);
- for (var i = key.length;i < this.blockSize; i++)
- key.push(0);
- for (i = 0;i < key.length; i++)
- key[i] ^= 54;
- this.inner = new this.Hash().update(key);
- for (i = 0;i < key.length; i++)
- key[i] ^= 106;
- this.outer = new this.Hash().update(key);
- };
- Hmac.prototype.update = function update(msg, enc) {
- this.inner.update(msg, enc);
- return this;
- };
- Hmac.prototype.digest = function digest(enc) {
- this.outer.update(this.inner.digest());
- return this.outer.digest(enc);
- };
-});
-
-// ../eve/node_modules/hash.js/lib/hash.js
-var require_hash = __commonJS((exports) => {
- var hash = exports;
- hash.utils = require_utils3();
- hash.common = require_common();
- hash.sha = require_sha();
- hash.ripemd = require_ripemd();
- hash.hmac = require_hmac();
- hash.sha1 = hash.sha.sha1;
- hash.sha256 = hash.sha.sha256;
- hash.sha224 = hash.sha.sha224;
- hash.sha384 = hash.sha.sha384;
- hash.sha512 = hash.sha.sha512;
- hash.ripemd160 = hash.ripemd.ripemd160;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js
-var require_secp256k1 = __commonJS((exports, module) => {
- module.exports = {
- doubles: {
- step: 4,
- points: [
- [
- "e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a",
- "f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821"
- ],
- [
- "8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508",
- "11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf"
- ],
- [
- "175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739",
- "d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695"
- ],
- [
- "363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640",
- "4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9"
- ],
- [
- "8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c",
- "4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36"
- ],
- [
- "723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda",
- "96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f"
- ],
- [
- "eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa",
- "5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999"
- ],
- [
- "100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0",
- "cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09"
- ],
- [
- "e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d",
- "9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d"
- ],
- [
- "feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d",
- "e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088"
- ],
- [
- "da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1",
- "9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d"
- ],
- [
- "53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0",
- "5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8"
- ],
- [
- "8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047",
- "10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a"
- ],
- [
- "385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862",
- "283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453"
- ],
- [
- "6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7",
- "7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160"
- ],
- [
- "3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd",
- "56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0"
- ],
- [
- "85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83",
- "7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6"
- ],
- [
- "948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a",
- "53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589"
- ],
- [
- "6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8",
- "bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17"
- ],
- [
- "e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d",
- "4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda"
- ],
- [
- "e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725",
- "7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd"
- ],
- [
- "213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754",
- "4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2"
- ],
- [
- "4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c",
- "17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6"
- ],
- [
- "fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6",
- "6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f"
- ],
- [
- "76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39",
- "c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01"
- ],
- [
- "c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891",
- "893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3"
- ],
- [
- "d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b",
- "febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f"
- ],
- [
- "b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03",
- "2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7"
- ],
- [
- "e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d",
- "eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78"
- ],
- [
- "a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070",
- "7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1"
- ],
- [
- "90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4",
- "e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150"
- ],
- [
- "8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da",
- "662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82"
- ],
- [
- "e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11",
- "1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc"
- ],
- [
- "8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e",
- "efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b"
- ],
- [
- "e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41",
- "2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51"
- ],
- [
- "b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef",
- "67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45"
- ],
- [
- "d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8",
- "db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120"
- ],
- [
- "324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d",
- "648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84"
- ],
- [
- "4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96",
- "35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d"
- ],
- [
- "9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd",
- "ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d"
- ],
- [
- "6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5",
- "9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8"
- ],
- [
- "a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266",
- "40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8"
- ],
- [
- "7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71",
- "34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac"
- ],
- [
- "928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac",
- "c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f"
- ],
- [
- "85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751",
- "1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962"
- ],
- [
- "ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e",
- "493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907"
- ],
- [
- "827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241",
- "c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec"
- ],
- [
- "eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3",
- "be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d"
- ],
- [
- "e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f",
- "4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414"
- ],
- [
- "1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19",
- "aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd"
- ],
- [
- "146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be",
- "b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0"
- ],
- [
- "fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9",
- "6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811"
- ],
- [
- "da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2",
- "8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1"
- ],
- [
- "a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13",
- "7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c"
- ],
- [
- "174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c",
- "ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73"
- ],
- [
- "959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba",
- "2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd"
- ],
- [
- "d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151",
- "e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405"
- ],
- [
- "64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073",
- "d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589"
- ],
- [
- "8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458",
- "38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e"
- ],
- [
- "13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b",
- "69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27"
- ],
- [
- "bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366",
- "d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1"
- ],
- [
- "8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa",
- "40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482"
- ],
- [
- "8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0",
- "620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945"
- ],
- [
- "dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787",
- "7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573"
- ],
- [
- "f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e",
- "ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82"
- ]
- ]
- },
- naf: {
- wnd: 7,
- points: [
- [
- "f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9",
- "388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672"
- ],
- [
- "2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4",
- "d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6"
- ],
- [
- "5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc",
- "6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da"
- ],
- [
- "acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe",
- "cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37"
- ],
- [
- "774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb",
- "d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b"
- ],
- [
- "f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8",
- "ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81"
- ],
- [
- "d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e",
- "581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58"
- ],
- [
- "defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34",
- "4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77"
- ],
- [
- "2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c",
- "85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a"
- ],
- [
- "352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5",
- "321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c"
- ],
- [
- "2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f",
- "2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67"
- ],
- [
- "9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714",
- "73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402"
- ],
- [
- "daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729",
- "a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55"
- ],
- [
- "c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db",
- "2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482"
- ],
- [
- "6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4",
- "e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82"
- ],
- [
- "1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5",
- "b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396"
- ],
- [
- "605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479",
- "2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49"
- ],
- [
- "62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d",
- "80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf"
- ],
- [
- "80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f",
- "1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a"
- ],
- [
- "7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb",
- "d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7"
- ],
- [
- "d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9",
- "eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933"
- ],
- [
- "49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963",
- "758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a"
- ],
- [
- "77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74",
- "958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6"
- ],
- [
- "f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530",
- "e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37"
- ],
- [
- "463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b",
- "5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e"
- ],
- [
- "f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247",
- "cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6"
- ],
- [
- "caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1",
- "cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476"
- ],
- [
- "2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120",
- "4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40"
- ],
- [
- "7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435",
- "91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61"
- ],
- [
- "754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18",
- "673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683"
- ],
- [
- "e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8",
- "59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5"
- ],
- [
- "186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb",
- "3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b"
- ],
- [
- "df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f",
- "55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417"
- ],
- [
- "5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143",
- "efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868"
- ],
- [
- "290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba",
- "e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a"
- ],
- [
- "af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45",
- "f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6"
- ],
- [
- "766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a",
- "744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996"
- ],
- [
- "59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e",
- "c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e"
- ],
- [
- "f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8",
- "e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d"
- ],
- [
- "7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c",
- "30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2"
- ],
- [
- "948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519",
- "e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e"
- ],
- [
- "7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab",
- "100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437"
- ],
- [
- "3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca",
- "ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311"
- ],
- [
- "d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf",
- "8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4"
- ],
- [
- "1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610",
- "68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575"
- ],
- [
- "733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4",
- "f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d"
- ],
- [
- "15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c",
- "d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d"
- ],
- [
- "a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940",
- "edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629"
- ],
- [
- "e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980",
- "a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06"
- ],
- [
- "311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3",
- "66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374"
- ],
- [
- "34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf",
- "9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee"
- ],
- [
- "f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63",
- "4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1"
- ],
- [
- "d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448",
- "fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b"
- ],
- [
- "32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf",
- "5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661"
- ],
- [
- "7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5",
- "8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6"
- ],
- [
- "ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6",
- "8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e"
- ],
- [
- "16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5",
- "5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d"
- ],
- [
- "eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99",
- "f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc"
- ],
- [
- "78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51",
- "f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4"
- ],
- [
- "494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5",
- "42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c"
- ],
- [
- "a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5",
- "204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b"
- ],
- [
- "c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997",
- "4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913"
- ],
- [
- "841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881",
- "73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154"
- ],
- [
- "5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5",
- "39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865"
- ],
- [
- "36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66",
- "d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc"
- ],
- [
- "336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726",
- "ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224"
- ],
- [
- "8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede",
- "6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e"
- ],
- [
- "1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94",
- "60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6"
- ],
- [
- "85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31",
- "3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511"
- ],
- [
- "29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51",
- "b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b"
- ],
- [
- "a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252",
- "ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2"
- ],
- [
- "4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5",
- "cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c"
- ],
- [
- "d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b",
- "6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3"
- ],
- [
- "ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4",
- "322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d"
- ],
- [
- "af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f",
- "6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700"
- ],
- [
- "e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889",
- "2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4"
- ],
- [
- "591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246",
- "b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196"
- ],
- [
- "11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984",
- "998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4"
- ],
- [
- "3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a",
- "b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257"
- ],
- [
- "cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030",
- "bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13"
- ],
- [
- "c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197",
- "6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096"
- ],
- [
- "c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593",
- "c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38"
- ],
- [
- "a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef",
- "21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f"
- ],
- [
- "347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38",
- "60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448"
- ],
- [
- "da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a",
- "49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a"
- ],
- [
- "c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111",
- "5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4"
- ],
- [
- "4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502",
- "7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437"
- ],
- [
- "3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea",
- "be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7"
- ],
- [
- "cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26",
- "8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d"
- ],
- [
- "b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986",
- "39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a"
- ],
- [
- "d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e",
- "62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54"
- ],
- [
- "48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4",
- "25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77"
- ],
- [
- "dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda",
- "ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517"
- ],
- [
- "6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859",
- "cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10"
- ],
- [
- "e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f",
- "f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125"
- ],
- [
- "eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c",
- "6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e"
- ],
- [
- "13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942",
- "fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1"
- ],
- [
- "ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a",
- "1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2"
- ],
- [
- "b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80",
- "5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423"
- ],
- [
- "ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d",
- "438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8"
- ],
- [
- "8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1",
- "cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758"
- ],
- [
- "52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63",
- "c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375"
- ],
- [
- "e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352",
- "6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d"
- ],
- [
- "7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193",
- "ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec"
- ],
- [
- "5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00",
- "9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0"
- ],
- [
- "32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58",
- "ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c"
- ],
- [
- "e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7",
- "d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4"
- ],
- [
- "8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8",
- "c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f"
- ],
- [
- "4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e",
- "67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649"
- ],
- [
- "3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d",
- "cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826"
- ],
- [
- "674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b",
- "299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5"
- ],
- [
- "d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f",
- "f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87"
- ],
- [
- "30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6",
- "462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b"
- ],
- [
- "be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297",
- "62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc"
- ],
- [
- "93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a",
- "7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c"
- ],
- [
- "b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c",
- "ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f"
- ],
- [
- "d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52",
- "4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a"
- ],
- [
- "d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb",
- "bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46"
- ],
- [
- "463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065",
- "bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f"
- ],
- [
- "7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917",
- "603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03"
- ],
- [
- "74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9",
- "cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08"
- ],
- [
- "30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3",
- "553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8"
- ],
- [
- "9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57",
- "712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373"
- ],
- [
- "176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66",
- "ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3"
- ],
- [
- "75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8",
- "9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8"
- ],
- [
- "809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721",
- "9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1"
- ],
- [
- "1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180",
- "4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9"
- ]
- ]
- }
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/curves.js
-var require_curves = __commonJS((exports) => {
- var curves = exports;
- var hash = require_hash();
- var curve = require_curve();
- var utils = require_utils2();
- var assert = utils.assert;
- function PresetCurve(options2) {
- if (options2.type === "short")
- this.curve = new curve.short(options2);
- else if (options2.type === "edwards")
- this.curve = new curve.edwards(options2);
- else
- this.curve = new curve.mont(options2);
- this.g = this.curve.g;
- this.n = this.curve.n;
- this.hash = options2.hash;
- assert(this.g.validate(), "Invalid curve");
- assert(this.g.mul(this.n).isInfinity(), "Invalid curve, G*N != O");
- }
- curves.PresetCurve = PresetCurve;
- function defineCurve(name, options2) {
- Object.defineProperty(curves, name, {
- configurable: true,
- enumerable: true,
- get: function() {
- var curve2 = new PresetCurve(options2);
- Object.defineProperty(curves, name, {
- configurable: true,
- enumerable: true,
- value: curve2
- });
- return curve2;
- }
- });
- }
- defineCurve("p192", {
- type: "short",
- prime: "p192",
- p: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff",
- a: "ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc",
- b: "64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1",
- n: "ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831",
- hash: hash.sha256,
- gRed: false,
- g: [
- "188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012",
- "07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"
- ]
- });
- defineCurve("p224", {
- type: "short",
- prime: "p224",
- p: "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001",
- a: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe",
- b: "b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4",
- n: "ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d",
- hash: hash.sha256,
- gRed: false,
- g: [
- "b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21",
- "bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"
- ]
- });
- defineCurve("p256", {
- type: "short",
- prime: null,
- p: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff",
- a: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc",
- b: "5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b",
- n: "ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551",
- hash: hash.sha256,
- gRed: false,
- g: [
- "6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296",
- "4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"
- ]
- });
- defineCurve("p384", {
- type: "short",
- prime: null,
- p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "fffffffe ffffffff 00000000 00000000 ffffffff",
- a: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "fffffffe ffffffff 00000000 00000000 fffffffc",
- b: "b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f " + "5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef",
- n: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 " + "f4372ddf 581a0db2 48b0a77a ecec196a ccc52973",
- hash: hash.sha384,
- gRed: false,
- g: [
- "aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 " + "5502f25d bf55296c 3a545e38 72760ab7",
- "3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 " + "0a60b1ce 1d7e819d 7a431d7c 90ea0e5f"
- ]
- });
- defineCurve("p521", {
- type: "short",
- prime: null,
- p: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff",
- a: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff ffffffff ffffffff fffffffc",
- b: "00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b " + "99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd " + "3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00",
- n: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff " + "ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 " + "f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409",
- hash: hash.sha512,
- gRed: false,
- g: [
- "000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 " + "053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 " + "a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66",
- "00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 " + "579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 " + "3fad0761 353c7086 a272c240 88be9476 9fd16650"
- ]
- });
- defineCurve("curve25519", {
- type: "mont",
- prime: "p25519",
- p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",
- a: "76d06",
- b: "1",
- n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",
- hash: hash.sha256,
- gRed: false,
- g: [
- "9"
- ]
- });
- defineCurve("ed25519", {
- type: "edwards",
- prime: "p25519",
- p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",
- a: "-1",
- c: "1",
- d: "52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3",
- n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",
- hash: hash.sha256,
- gRed: false,
- g: [
- "216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a",
- "6666666666666666666666666666666666666666666666666666666666666658"
- ]
- });
- var pre;
- try {
- pre = require_secp256k1();
- } catch (e) {
- pre = undefined;
- }
- defineCurve("secp256k1", {
- type: "short",
- prime: "k256",
- p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f",
- a: "0",
- b: "7",
- n: "ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141",
- h: "1",
- hash: hash.sha256,
- beta: "7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee",
- lambda: "5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72",
- basis: [
- {
- a: "3086d221a7d46bcde86c90e49284eb15",
- b: "-e4437ed6010e88286f547fa90abfe4c3"
- },
- {
- a: "114ca50f7a8e2f3f657c1108d9d44cfd8",
- b: "3086d221a7d46bcde86c90e49284eb15"
- }
- ],
- gRed: false,
- g: [
- "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
- "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
- pre
- ]
- });
-});
-
-// ../eve/node_modules/hmac-drbg/lib/hmac-drbg.js
-var require_hmac_drbg = __commonJS((exports, module) => {
- var hash = require_hash();
- var utils = require_utils();
- var assert = require_minimalistic_assert();
- function HmacDRBG(options2) {
- if (!(this instanceof HmacDRBG))
- return new HmacDRBG(options2);
- this.hash = options2.hash;
- this.predResist = !!options2.predResist;
- this.outLen = this.hash.outSize;
- this.minEntropy = options2.minEntropy || this.hash.hmacStrength;
- this._reseed = null;
- this.reseedInterval = null;
- this.K = null;
- this.V = null;
- var entropy = utils.toArray(options2.entropy, options2.entropyEnc || "hex");
- var nonce = utils.toArray(options2.nonce, options2.nonceEnc || "hex");
- var pers = utils.toArray(options2.pers, options2.persEnc || "hex");
- assert(entropy.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits");
- this._init(entropy, nonce, pers);
- }
- module.exports = HmacDRBG;
- HmacDRBG.prototype._init = function init(entropy, nonce, pers) {
- var seed = entropy.concat(nonce).concat(pers);
- this.K = new Array(this.outLen / 8);
- this.V = new Array(this.outLen / 8);
- for (var i = 0;i < this.V.length; i++) {
- this.K[i] = 0;
- this.V[i] = 1;
- }
- this._update(seed);
- this._reseed = 1;
- this.reseedInterval = 281474976710656;
- };
- HmacDRBG.prototype._hmac = function hmac() {
- return new hash.hmac(this.hash, this.K);
- };
- HmacDRBG.prototype._update = function update(seed) {
- var kmac = this._hmac().update(this.V).update([0]);
- if (seed)
- kmac = kmac.update(seed);
- this.K = kmac.digest();
- this.V = this._hmac().update(this.V).digest();
- if (!seed)
- return;
- this.K = this._hmac().update(this.V).update([1]).update(seed).digest();
- this.V = this._hmac().update(this.V).digest();
- };
- HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) {
- if (typeof entropyEnc !== "string") {
- addEnc = add;
- add = entropyEnc;
- entropyEnc = null;
- }
- entropy = utils.toArray(entropy, entropyEnc);
- add = utils.toArray(add, addEnc);
- assert(entropy.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits");
- this._update(entropy.concat(add || []));
- this._reseed = 1;
- };
- HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) {
- if (this._reseed > this.reseedInterval)
- throw new Error("Reseed is required");
- if (typeof enc !== "string") {
- addEnc = add;
- add = enc;
- enc = null;
- }
- if (add) {
- add = utils.toArray(add, addEnc || "hex");
- this._update(add);
- }
- var temp = [];
- while (temp.length < len) {
- this.V = this._hmac().update(this.V).digest();
- temp = temp.concat(this.V);
- }
- var res = temp.slice(0, len);
- this._update(add);
- this._reseed++;
- return utils.encode(res, enc);
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/ec/key.js
-var require_key = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var assert = utils.assert;
- function KeyPair(ec, options2) {
- this.ec = ec;
- this.priv = null;
- this.pub = null;
- if (options2.priv)
- this._importPrivate(options2.priv, options2.privEnc);
- if (options2.pub)
- this._importPublic(options2.pub, options2.pubEnc);
- }
- module.exports = KeyPair;
- KeyPair.fromPublic = function fromPublic(ec, pub, enc) {
- if (pub instanceof KeyPair)
- return pub;
- return new KeyPair(ec, {
- pub,
- pubEnc: enc
- });
- };
- KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) {
- if (priv instanceof KeyPair)
- return priv;
- return new KeyPair(ec, {
- priv,
- privEnc: enc
- });
- };
- KeyPair.prototype.validate = function validate() {
- var pub = this.getPublic();
- if (pub.isInfinity())
- return { result: false, reason: "Invalid public key" };
- if (!pub.validate())
- return { result: false, reason: "Public key is not a point" };
- if (!pub.mul(this.ec.curve.n).isInfinity())
- return { result: false, reason: "Public key * N != O" };
- return { result: true, reason: null };
- };
- KeyPair.prototype.getPublic = function getPublic(compact, enc) {
- if (typeof compact === "string") {
- enc = compact;
- compact = null;
- }
- if (!this.pub)
- this.pub = this.ec.g.mul(this.priv);
- if (!enc)
- return this.pub;
- return this.pub.encode(enc, compact);
- };
- KeyPair.prototype.getPrivate = function getPrivate(enc) {
- if (enc === "hex")
- return this.priv.toString(16, 2);
- else
- return this.priv;
- };
- KeyPair.prototype._importPrivate = function _importPrivate(key, enc) {
- this.priv = new BN(key, enc || 16);
- this.priv = this.priv.umod(this.ec.curve.n);
- };
- KeyPair.prototype._importPublic = function _importPublic(key, enc) {
- if (key.x || key.y) {
- if (this.ec.curve.type === "mont") {
- assert(key.x, "Need x coordinate");
- } else if (this.ec.curve.type === "short" || this.ec.curve.type === "edwards") {
- assert(key.x && key.y, "Need both x and y coordinate");
- }
- this.pub = this.ec.curve.point(key.x, key.y);
- return;
- }
- this.pub = this.ec.curve.decodePoint(key, enc);
- };
- KeyPair.prototype.derive = function derive(pub) {
- if (!pub.validate()) {
- assert(pub.validate(), "public point not validated");
- }
- return pub.mul(this.priv).getX();
- };
- KeyPair.prototype.sign = function sign(msg, enc, options2) {
- return this.ec.sign(msg, this, enc, options2);
- };
- KeyPair.prototype.verify = function verify(msg, signature, options2) {
- return this.ec.verify(msg, signature, this, undefined, options2);
- };
- KeyPair.prototype.inspect = function inspect() {
- return "";
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/ec/signature.js
-var require_signature = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var assert = utils.assert;
- function Signature(options2, enc) {
- if (options2 instanceof Signature)
- return options2;
- if (this._importDER(options2, enc))
- return;
- assert(options2.r && options2.s, "Signature without r or s");
- this.r = new BN(options2.r, 16);
- this.s = new BN(options2.s, 16);
- if (options2.recoveryParam === undefined)
- this.recoveryParam = null;
- else
- this.recoveryParam = options2.recoveryParam;
- }
- module.exports = Signature;
- function Position() {
- this.place = 0;
- }
- function getLength(buf, p) {
- var initial = buf[p.place++];
- if (!(initial & 128)) {
- return initial;
- }
- var octetLen = initial & 15;
- if (octetLen === 0 || octetLen > 4) {
- return false;
- }
- if (buf[p.place] === 0) {
- return false;
- }
- var val = 0;
- for (var i = 0, off = p.place;i < octetLen; i++, off++) {
- val <<= 8;
- val |= buf[off];
- val >>>= 0;
- }
- if (val <= 127) {
- return false;
- }
- p.place = off;
- return val;
- }
- function rmPadding(buf) {
- var i = 0;
- var len = buf.length - 1;
- while (!buf[i] && !(buf[i + 1] & 128) && i < len) {
- i++;
- }
- if (i === 0) {
- return buf;
- }
- return buf.slice(i);
- }
- Signature.prototype._importDER = function _importDER(data, enc) {
- data = utils.toArray(data, enc);
- var p = new Position;
- if (data[p.place++] !== 48) {
- return false;
- }
- var len = getLength(data, p);
- if (len === false) {
- return false;
- }
- if (len + p.place !== data.length) {
- return false;
- }
- if (data[p.place++] !== 2) {
- return false;
- }
- var rlen = getLength(data, p);
- if (rlen === false) {
- return false;
- }
- if ((data[p.place] & 128) !== 0) {
- return false;
- }
- var r = data.slice(p.place, rlen + p.place);
- p.place += rlen;
- if (data[p.place++] !== 2) {
- return false;
- }
- var slen = getLength(data, p);
- if (slen === false) {
- return false;
- }
- if (data.length !== slen + p.place) {
- return false;
- }
- if ((data[p.place] & 128) !== 0) {
- return false;
- }
- var s = data.slice(p.place, slen + p.place);
- if (r[0] === 0) {
- if (r[1] & 128) {
- r = r.slice(1);
- } else {
- return false;
- }
- }
- if (s[0] === 0) {
- if (s[1] & 128) {
- s = s.slice(1);
- } else {
- return false;
- }
- }
- this.r = new BN(r);
- this.s = new BN(s);
- this.recoveryParam = null;
- return true;
- };
- function constructLength(arr, len) {
- if (len < 128) {
- arr.push(len);
- return;
- }
- var octets = 1 + (Math.log(len) / Math.LN2 >>> 3);
- arr.push(octets | 128);
- while (--octets) {
- arr.push(len >>> (octets << 3) & 255);
- }
- arr.push(len);
- }
- Signature.prototype.toDER = function toDER(enc) {
- var r = this.r.toArray();
- var s = this.s.toArray();
- if (r[0] & 128)
- r = [0].concat(r);
- if (s[0] & 128)
- s = [0].concat(s);
- r = rmPadding(r);
- s = rmPadding(s);
- while (!s[0] && !(s[1] & 128)) {
- s = s.slice(1);
- }
- var arr = [2];
- constructLength(arr, r.length);
- arr = arr.concat(r);
- arr.push(2);
- constructLength(arr, s.length);
- var backHalf = arr.concat(s);
- var res = [48];
- constructLength(res, backHalf.length);
- res = res.concat(backHalf);
- return utils.encode(res, enc);
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/ec/index.js
-var require_ec = __commonJS((exports, module) => {
- var BN = require_bn();
- var HmacDRBG = require_hmac_drbg();
- var utils = require_utils2();
- var curves = require_curves();
- var rand = require_brorand();
- var assert = utils.assert;
- var KeyPair = require_key();
- var Signature = require_signature();
- function EC(options2) {
- if (!(this instanceof EC))
- return new EC(options2);
- if (typeof options2 === "string") {
- assert(Object.prototype.hasOwnProperty.call(curves, options2), "Unknown curve " + options2);
- options2 = curves[options2];
- }
- if (options2 instanceof curves.PresetCurve)
- options2 = { curve: options2 };
- this.curve = options2.curve.curve;
- this.n = this.curve.n;
- this.nh = this.n.ushrn(1);
- this.g = this.curve.g;
- this.g = options2.curve.g;
- this.g.precompute(options2.curve.n.bitLength() + 1);
- this.hash = options2.hash || options2.curve.hash;
- }
- module.exports = EC;
- EC.prototype.keyPair = function keyPair(options2) {
- return new KeyPair(this, options2);
- };
- EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) {
- return KeyPair.fromPrivate(this, priv, enc);
- };
- EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) {
- return KeyPair.fromPublic(this, pub, enc);
- };
- EC.prototype.genKeyPair = function genKeyPair(options2) {
- if (!options2)
- options2 = {};
- var drbg = new HmacDRBG({
- hash: this.hash,
- pers: options2.pers,
- persEnc: options2.persEnc || "utf8",
- entropy: options2.entropy || rand(this.hash.hmacStrength),
- entropyEnc: options2.entropy && options2.entropyEnc || "utf8",
- nonce: this.n.toArray()
- });
- var bytes = this.n.byteLength();
- var ns2 = this.n.sub(new BN(2));
- for (;; ) {
- var priv = new BN(drbg.generate(bytes));
- if (priv.cmp(ns2) > 0)
- continue;
- priv.iaddn(1);
- return this.keyFromPrivate(priv);
- }
- };
- EC.prototype._truncateToN = function _truncateToN(msg, truncOnly, bitLength) {
- var byteLength;
- if (BN.isBN(msg) || typeof msg === "number") {
- msg = new BN(msg, 16);
- byteLength = msg.byteLength();
- } else if (typeof msg === "object") {
- byteLength = msg.length;
- msg = new BN(msg, 16);
- } else {
- var str = msg.toString();
- byteLength = str.length + 1 >>> 1;
- msg = new BN(str, 16);
- }
- if (typeof bitLength !== "number") {
- bitLength = byteLength * 8;
- }
- var delta = bitLength - this.n.bitLength();
- if (delta > 0)
- msg = msg.ushrn(delta);
- if (!truncOnly && msg.cmp(this.n) >= 0)
- return msg.sub(this.n);
- else
- return msg;
- };
- EC.prototype.sign = function sign(msg, key, enc, options2) {
- if (typeof enc === "object") {
- options2 = enc;
- enc = null;
- }
- if (!options2)
- options2 = {};
- if (typeof msg !== "string" && typeof msg !== "number" && !BN.isBN(msg)) {
- assert(typeof msg === "object" && msg && typeof msg.length === "number", "Expected message to be an array-like, a hex string, or a BN instance");
- assert(msg.length >>> 0 === msg.length);
- for (var i = 0;i < msg.length; i++)
- assert((msg[i] & 255) === msg[i]);
- }
- key = this.keyFromPrivate(key, enc);
- msg = this._truncateToN(msg, false, options2.msgBitLength);
- assert(!msg.isNeg(), "Can not sign a negative message");
- var bytes = this.n.byteLength();
- var bkey = key.getPrivate().toArray("be", bytes);
- var nonce = msg.toArray("be", bytes);
- assert(new BN(nonce).eq(msg), "Can not sign message");
- var drbg = new HmacDRBG({
- hash: this.hash,
- entropy: bkey,
- nonce,
- pers: options2.pers,
- persEnc: options2.persEnc || "utf8"
- });
- var ns1 = this.n.sub(new BN(1));
- for (var iter = 0;; iter++) {
- var k = options2.k ? options2.k(iter) : new BN(drbg.generate(this.n.byteLength()));
- k = this._truncateToN(k, true);
- if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0)
- continue;
- var kp = this.g.mul(k);
- if (kp.isInfinity())
- continue;
- var kpX = kp.getX();
- var r = kpX.umod(this.n);
- if (r.cmpn(0) === 0)
- continue;
- var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg));
- s = s.umod(this.n);
- if (s.cmpn(0) === 0)
- continue;
- var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | (kpX.cmp(r) !== 0 ? 2 : 0);
- if (options2.canonical && s.cmp(this.nh) > 0) {
- s = this.n.sub(s);
- recoveryParam ^= 1;
- }
- return new Signature({ r, s, recoveryParam });
- }
- };
- EC.prototype.verify = function verify(msg, signature, key, enc, options2) {
- if (!options2)
- options2 = {};
- msg = this._truncateToN(msg, false, options2.msgBitLength);
- key = this.keyFromPublic(key, enc);
- signature = new Signature(signature, "hex");
- var r = signature.r;
- var s = signature.s;
- if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0)
- return false;
- if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0)
- return false;
- var sinv = s.invm(this.n);
- var u1 = sinv.mul(msg).umod(this.n);
- var u2 = sinv.mul(r).umod(this.n);
- var p;
- if (!this.curve._maxwellTrick) {
- p = this.g.mulAdd(u1, key.getPublic(), u2);
- if (p.isInfinity())
- return false;
- return p.getX().umod(this.n).cmp(r) === 0;
- }
- p = this.g.jmulAdd(u1, key.getPublic(), u2);
- if (p.isInfinity())
- return false;
- return p.eqXToP(r);
- };
- EC.prototype.recoverPubKey = function(msg, signature, j, enc) {
- assert((3 & j) === j, "The recovery param is more than two bits");
- signature = new Signature(signature, enc);
- var n = this.n;
- var e = new BN(msg);
- var r = signature.r;
- var s = signature.s;
- var isYOdd = j & 1;
- var isSecondKey = j >> 1;
- if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey)
- throw new Error("Unable to find sencond key candinate");
- if (isSecondKey)
- r = this.curve.pointFromX(r.add(this.curve.n), isYOdd);
- else
- r = this.curve.pointFromX(r, isYOdd);
- var rInv = signature.r.invm(n);
- var s1 = n.sub(e).mul(rInv).umod(n);
- var s2 = s.mul(rInv).umod(n);
- return this.g.mulAdd(s1, r, s2);
- };
- EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) {
- signature = new Signature(signature, enc);
- if (signature.recoveryParam !== null)
- return signature.recoveryParam;
- for (var i = 0;i < 4; i++) {
- var Qprime;
- try {
- Qprime = this.recoverPubKey(e, signature, i);
- } catch (e2) {
- continue;
- }
- if (Qprime.eq(Q))
- return i;
- }
- throw new Error("Unable to find valid recovery factor");
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/eddsa/key.js
-var require_key2 = __commonJS((exports, module) => {
- var utils = require_utils2();
- var assert = utils.assert;
- var parseBytes = utils.parseBytes;
- var cachedProperty = utils.cachedProperty;
- function KeyPair(eddsa, params) {
- this.eddsa = eddsa;
- this._secret = parseBytes(params.secret);
- if (eddsa.isPoint(params.pub))
- this._pub = params.pub;
- else
- this._pubBytes = parseBytes(params.pub);
- }
- KeyPair.fromPublic = function fromPublic(eddsa, pub) {
- if (pub instanceof KeyPair)
- return pub;
- return new KeyPair(eddsa, { pub });
- };
- KeyPair.fromSecret = function fromSecret(eddsa, secret) {
- if (secret instanceof KeyPair)
- return secret;
- return new KeyPair(eddsa, { secret });
- };
- KeyPair.prototype.secret = function secret() {
- return this._secret;
- };
- cachedProperty(KeyPair, "pubBytes", function pubBytes() {
- return this.eddsa.encodePoint(this.pub());
- });
- cachedProperty(KeyPair, "pub", function pub() {
- if (this._pubBytes)
- return this.eddsa.decodePoint(this._pubBytes);
- return this.eddsa.g.mul(this.priv());
- });
- cachedProperty(KeyPair, "privBytes", function privBytes() {
- var eddsa = this.eddsa;
- var hash = this.hash();
- var lastIx = eddsa.encodingLength - 1;
- var a = hash.slice(0, eddsa.encodingLength);
- a[0] &= 248;
- a[lastIx] &= 127;
- a[lastIx] |= 64;
- return a;
- });
- cachedProperty(KeyPair, "priv", function priv() {
- return this.eddsa.decodeInt(this.privBytes());
- });
- cachedProperty(KeyPair, "hash", function hash() {
- return this.eddsa.hash().update(this.secret()).digest();
- });
- cachedProperty(KeyPair, "messagePrefix", function messagePrefix() {
- return this.hash().slice(this.eddsa.encodingLength);
- });
- KeyPair.prototype.sign = function sign(message) {
- assert(this._secret, "KeyPair can only verify");
- return this.eddsa.sign(message, this);
- };
- KeyPair.prototype.verify = function verify(message, sig) {
- return this.eddsa.verify(message, sig, this);
- };
- KeyPair.prototype.getSecret = function getSecret(enc) {
- assert(this._secret, "KeyPair is public only");
- return utils.encode(this.secret(), enc);
- };
- KeyPair.prototype.getPublic = function getPublic(enc) {
- return utils.encode(this.pubBytes(), enc);
- };
- module.exports = KeyPair;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/eddsa/signature.js
-var require_signature2 = __commonJS((exports, module) => {
- var BN = require_bn();
- var utils = require_utils2();
- var assert = utils.assert;
- var cachedProperty = utils.cachedProperty;
- var parseBytes = utils.parseBytes;
- function Signature(eddsa, sig) {
- this.eddsa = eddsa;
- if (typeof sig !== "object")
- sig = parseBytes(sig);
- if (Array.isArray(sig)) {
- assert(sig.length === eddsa.encodingLength * 2, "Signature has invalid size");
- sig = {
- R: sig.slice(0, eddsa.encodingLength),
- S: sig.slice(eddsa.encodingLength)
- };
- }
- assert(sig.R && sig.S, "Signature without R or S");
- if (eddsa.isPoint(sig.R))
- this._R = sig.R;
- if (sig.S instanceof BN)
- this._S = sig.S;
- this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded;
- this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded;
- }
- cachedProperty(Signature, "S", function S() {
- return this.eddsa.decodeInt(this.Sencoded());
- });
- cachedProperty(Signature, "R", function R() {
- return this.eddsa.decodePoint(this.Rencoded());
- });
- cachedProperty(Signature, "Rencoded", function Rencoded() {
- return this.eddsa.encodePoint(this.R());
- });
- cachedProperty(Signature, "Sencoded", function Sencoded() {
- return this.eddsa.encodeInt(this.S());
- });
- Signature.prototype.toBytes = function toBytes() {
- return this.Rencoded().concat(this.Sencoded());
- };
- Signature.prototype.toHex = function toHex() {
- return utils.encode(this.toBytes(), "hex").toUpperCase();
- };
- module.exports = Signature;
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic/eddsa/index.js
-var require_eddsa = __commonJS((exports, module) => {
- var hash = require_hash();
- var curves = require_curves();
- var utils = require_utils2();
- var assert = utils.assert;
- var parseBytes = utils.parseBytes;
- var KeyPair = require_key2();
- var Signature = require_signature2();
- function EDDSA(curve) {
- assert(curve === "ed25519", "only tested with ed25519 so far");
- if (!(this instanceof EDDSA))
- return new EDDSA(curve);
- curve = curves[curve].curve;
- this.curve = curve;
- this.g = curve.g;
- this.g.precompute(curve.n.bitLength() + 1);
- this.pointClass = curve.point().constructor;
- this.encodingLength = Math.ceil(curve.n.bitLength() / 8);
- this.hash = hash.sha512;
- }
- module.exports = EDDSA;
- EDDSA.prototype.sign = function sign(message, secret) {
- message = parseBytes(message);
- var key = this.keyFromSecret(secret);
- var r = this.hashInt(key.messagePrefix(), message);
- var R = this.g.mul(r);
- var Rencoded = this.encodePoint(R);
- var s_ = this.hashInt(Rencoded, key.pubBytes(), message).mul(key.priv());
- var S = r.add(s_).umod(this.curve.n);
- return this.makeSignature({ R, S, Rencoded });
- };
- EDDSA.prototype.verify = function verify(message, sig, pub) {
- message = parseBytes(message);
- sig = this.makeSignature(sig);
- if (sig.S().gte(sig.eddsa.curve.n) || sig.S().isNeg()) {
- return false;
- }
- var key = this.keyFromPublic(pub);
- var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message);
- var SG = this.g.mul(sig.S());
- var RplusAh = sig.R().add(key.pub().mul(h));
- return RplusAh.eq(SG);
- };
- EDDSA.prototype.hashInt = function hashInt() {
- var hash2 = this.hash();
- for (var i = 0;i < arguments.length; i++)
- hash2.update(arguments[i]);
- return utils.intFromLE(hash2.digest()).umod(this.curve.n);
- };
- EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) {
- return KeyPair.fromPublic(this, pub);
- };
- EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) {
- return KeyPair.fromSecret(this, secret);
- };
- EDDSA.prototype.makeSignature = function makeSignature(sig) {
- if (sig instanceof Signature)
- return sig;
- return new Signature(this, sig);
- };
- EDDSA.prototype.encodePoint = function encodePoint(point) {
- var enc = point.getY().toArray("le", this.encodingLength);
- enc[this.encodingLength - 1] |= point.getX().isOdd() ? 128 : 0;
- return enc;
- };
- EDDSA.prototype.decodePoint = function decodePoint(bytes) {
- bytes = utils.parseBytes(bytes);
- var lastIx = bytes.length - 1;
- var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~128);
- var xIsOdd = (bytes[lastIx] & 128) !== 0;
- var y = utils.intFromLE(normed);
- return this.curve.pointFromY(y, xIsOdd);
- };
- EDDSA.prototype.encodeInt = function encodeInt(num) {
- return num.toArray("le", this.encodingLength);
- };
- EDDSA.prototype.decodeInt = function decodeInt(bytes) {
- return utils.intFromLE(bytes);
- };
- EDDSA.prototype.isPoint = function isPoint(val) {
- return val instanceof this.pointClass;
- };
-});
-
-// ../eve/node_modules/elliptic/lib/elliptic.js
-var require_elliptic = __commonJS((exports) => {
- var elliptic = exports;
- elliptic.version = require_package().version;
- elliptic.utils = require_utils2();
- elliptic.rand = require_brorand();
- elliptic.curve = require_curve();
- elliptic.curves = require_curves();
- elliptic.ec = require_ec();
- elliptic.eddsa = require_eddsa();
-});
-
-// ../eve/node_modules/jwk-to-pem/src/b64-to-bn.js
-var require_b64_to_bn = __commonJS((exports, module) => {
- var BN = require_asn1().bignum;
- var Buffer2 = require_safe_buffer().Buffer;
- module.exports = function base64ToBigNum(val, zero) {
- var buf = Buffer2.from(val, "base64");
- var bn = val = new BN(buf, 10, "be").iabs();
- if (zero) {
- buf.fill(0);
- }
- return bn;
- };
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/algorithm-identifier.js
-var require_algorithm_identifier = __commonJS((exports, module) => {
- module.exports = require_asn1().define("AlgorithmIdentifer", function() {
- this.seq().obj(this.key("algorithm").objid(), this.key("parameters").optional().any());
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/public-key-info.js
-var require_public_key_info = __commonJS((exports, module) => {
- var AlgorithmIdentifier = require_algorithm_identifier();
- module.exports = require_asn1().define("PublicKeyInfo", function() {
- this.seq().obj(this.key("algorithm").use(AlgorithmIdentifier), this.key("PublicKey").bitstr());
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/version.js
-var require_version = __commonJS((exports, module) => {
- module.exports = require_asn1().define("Version", function() {
- this.int();
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/asn1/private-key-info.js
-var require_private_key_info = __commonJS((exports, module) => {
- var AlgorithmIdentifier = require_algorithm_identifier();
- var Version = require_version();
- module.exports = require_asn1().define("PrivateKeyInfo", function() {
- this.seq().obj(this.key("version").use(Version), this.key("privateKeyAlgorithm").use(AlgorithmIdentifier), this.key("privateKey").octstr(), this.key("attributes").optional().any());
- });
-});
-
-// ../eve/node_modules/jwk-to-pem/src/ec.js
-var require_ec2 = __commonJS((exports, module) => {
- var asn1 = require_asn1();
- var Buffer2 = require_safe_buffer().Buffer;
- var EC = require_elliptic().ec;
- var b64ToBn = require_b64_to_bn();
- var PublicKeyInfo = require_public_key_info();
- var PrivateKeyInfo = require_private_key_info();
- var Version = require_version();
- var ECParameters = asn1.define("ECParameters", function() {
- this.choice({
- namedCurve: this.objid()
- });
- });
- var ecPrivkeyVer1 = 1;
- var ECPrivateKey = asn1.define("ECPrivateKey", function() {
- this.seq().obj(this.key("version").use(Version), this.key("privateKey").octstr(), this.key("parameters").explicit(0).optional().any(), this.key("publicKey").explicit(1).optional().bitstr());
- });
- var curves = {
- "P-256": "p256",
- "P-384": "p384",
- "P-521": "p521"
- };
- var oids = {
- "P-256": [1, 2, 840, 10045, 3, 1, 7],
- "P-384": [1, 3, 132, 0, 34],
- "P-521": [1, 3, 132, 0, 35]
- };
- var parameters = {};
- var algorithms = {};
- Object.keys(oids).forEach(function(crv) {
- parameters[crv] = ECParameters.encode({
- type: "namedCurve",
- value: oids[crv]
- }, "der");
- algorithms[crv] = {
- algorithm: [1, 2, 840, 10045, 2, 1],
- parameters: parameters[crv]
- };
- });
- oids = null;
- function ecJwkToBuffer(jwk, opts) {
- if (typeof jwk.crv !== "string") {
- throw new TypeError('Expected "jwk.crv" to be a String');
- }
- var hasD = typeof jwk.d === "string";
- var xyTypes = hasD ? ["undefined", "string"] : ["string"];
- if (xyTypes.indexOf(typeof jwk.x) === -1) {
- throw new TypeError('Expected "jwk.x" to be a String');
- }
- if (xyTypes.indexOf(typeof jwk.y) === -1) {
- throw new TypeError('Expected "jwk.y" to be a String');
- }
- if (opts.private && !hasD) {
- throw new TypeError('Expected "jwk.d" to be a String');
- }
- var curveName = curves[jwk.crv];
- if (!curveName) {
- throw new Error('Unsupported curve "' + jwk.crv + '"');
- }
- var curve = new EC(curveName);
- var key = {};
- var hasPub = jwk.x && jwk.y;
- if (hasPub) {
- key.pub = {
- x: b64ToBn(jwk.x, false),
- y: b64ToBn(jwk.y, false)
- };
- }
- if (opts.private || !hasPub) {
- key.priv = b64ToBn(jwk.d, true);
- }
- key = curve.keyPair(key);
- var keyValidation = key.validate();
- if (!keyValidation.result) {
- throw new Error('Invalid key for curve: "' + keyValidation.reason + '"');
- }
- var result = keyToPem(jwk.crv, key, opts);
- return result;
- }
- function keyToPem(crv, key, opts) {
- var compact = false;
- var publicKey = key.getPublic(compact, "hex");
- publicKey = Buffer2.from(publicKey, "hex");
- publicKey = {
- unused: 0,
- data: publicKey
- };
- var result;
- if (opts.private) {
- var privateKey = key.getPrivate("hex");
- privateKey = Buffer2.from(privateKey, "hex");
- result = PrivateKeyInfo.encode({
- version: 0,
- privateKeyAlgorithm: algorithms[crv],
- privateKey: ECPrivateKey.encode({
- version: ecPrivkeyVer1,
- privateKey,
- parameters: parameters[crv],
- publicKey
- }, "der")
- }, "pem", {
- label: "PRIVATE KEY"
- });
- privateKey.fill(0);
- } else {
- result = PublicKeyInfo.encode({
- algorithm: algorithms[crv],
- PublicKey: publicKey
- }, "pem", {
- label: "PUBLIC KEY"
- });
- }
- if (result.slice(-1) !== `
-`) {
- result += `
-`;
- }
- return result;
- }
- module.exports = ecJwkToBuffer;
-});
-
-// ../eve/node_modules/jwk-to-pem/src/rsa.js
-var require_rsa = __commonJS((exports, module) => {
- var asn1 = require_asn1();
- var b64ToBn = require_b64_to_bn();
- var PublicKeyInfo = require_public_key_info();
- var PrivateKeyInfo = require_private_key_info();
- var Version = require_version();
- var RSAPrivateKey = asn1.define("RSAPrivateKey", function() {
- this.seq().obj(this.key("version").use(Version), this.key("modulus").int(), this.key("publicExponent").int(), this.key("privateExponent").int(), this.key("prime1").int(), this.key("prime2").int(), this.key("exponent1").int(), this.key("exponent2").int(), this.key("coefficient").int());
- });
- var RSAPublicKey = asn1.define("RSAPublicKey", function() {
- this.seq().obj(this.key("modulus").int(), this.key("publicExponent").int());
- });
- var algorithm = {
- algorithm: [1, 2, 840, 113549, 1, 1, 1],
- parameters: [5, 0]
- };
- function rsaJwkToBuffer(jwk, opts) {
- if (typeof jwk.e !== "string") {
- throw new TypeError('Expected "jwk.e" to be a String');
- }
- if (typeof jwk.n !== "string") {
- throw new TypeError('Expected "jwk.n" to be a String');
- }
- if (opts.private) {
- if (typeof jwk.d !== "string") {
- throw new TypeError('Expected "jwk.d" to be a String');
- }
- if (typeof jwk.p !== "string") {
- throw new TypeError('Expected "jwk.p" to be a String');
- }
- if (typeof jwk.q !== "string") {
- throw new TypeError('Expected "jwk.q" to be a String');
- }
- if (typeof jwk.dp !== "string") {
- throw new TypeError('Expected "jwk.dp" to be a String');
- }
- if (typeof jwk.dq !== "string") {
- throw new TypeError('Expected "jwk.dq" to be a String');
- }
- if (typeof jwk.qi !== "string") {
- throw new TypeError('Expected "jwk.qi" to be a String');
- }
- }
- var pem;
- if (opts.private) {
- pem = PrivateKeyInfo.encode({
- version: 0,
- privateKeyAlgorithm: algorithm,
- privateKey: RSAPrivateKey.encode({
- version: 0,
- modulus: b64ToBn(jwk.n, false),
- publicExponent: b64ToBn(jwk.e, false),
- privateExponent: b64ToBn(jwk.d, true),
- prime1: b64ToBn(jwk.p, true),
- prime2: b64ToBn(jwk.q, true),
- exponent1: b64ToBn(jwk.dp, true),
- exponent2: b64ToBn(jwk.dq, true),
- coefficient: b64ToBn(jwk.qi, true)
- }, "der")
- }, "pem", {
- label: "PRIVATE KEY"
- });
- } else {
- pem = PublicKeyInfo.encode({
- algorithm,
- PublicKey: {
- unused: 0,
- data: RSAPublicKey.encode({
- modulus: b64ToBn(jwk.n, false),
- publicExponent: b64ToBn(jwk.e, false)
- }, "der")
- }
- }, "pem", {
- label: "PUBLIC KEY"
- });
- }
- if (pem.slice(-1) !== `
-`) {
- pem += `
-`;
- }
- return pem;
- }
- module.exports = rsaJwkToBuffer;
-});
-
-// ../eve/node_modules/jwk-to-pem/src/jwk-to-pem.js
-var require_jwk_to_pem = __commonJS((exports, module) => {
- var ec = require_ec2();
- var rsa = require_rsa();
- function jwkToBuffer(jwk, opts) {
- if (typeof jwk !== "object" || jwk === null) {
- throw new TypeError('Expected "jwk" to be an Object');
- }
- var kty = jwk.kty;
- if (typeof kty !== "string") {
- throw new TypeError('Expected "jwk.kty" to be a String');
- }
- opts = opts || {};
- opts.private = opts.private === true;
- switch (kty) {
- case "EC": {
- return ec(jwk, opts);
- }
- case "RSA": {
- return rsa(jwk, opts);
- }
- default: {
- throw new Error('Unsupported key type "' + kty + '"');
- }
- }
- }
- module.exports = jwkToBuffer;
-});
-
-// src/utils/cookies.ts
-function getCookies(headers) {
- if (!headers)
- return {};
- const cookieHeader = headers.get("Cookie");
- const cookies = {};
- if (cookieHeader === null)
- return {};
- for (const kv of cookieHeader.split(";")) {
- const [cookieKey, ...cookieVal] = kv.split("=");
- const key = cookieKey.trim();
- cookies[key] = cookieVal.join("=");
- }
- return cookies;
-}
-function setCookie(response, key, value, maxAge) {
- response.headers.append("Set-Cookie", `${key}=${value}${maxAge ? "; Path=/; Max-Age=" + maxAge : ""}`);
-}
-function removeCookie(response, key) {
- response.headers.append("Set-Cookie", `${key}=""; Path=/; Max-Age=-1;`);
-}
-// ../eve/dist/_virtual/rolldown_runtime.js
-var __defProp2 = Object.defineProperty;
-var __export = (target, all) => {
- for (var name in all)
- __defProp2(target, name, {
- get: all[name],
- enumerable: true
- });
-};
-
-// ../eve/node_modules/drizzle-orm/entity.js
-var entityKind = Symbol.for("drizzle:entityKind");
-var hasOwnEntityKind = Symbol.for("drizzle:hasOwnEntityKind");
-function is(value, type) {
- if (!value || typeof value !== "object") {
- return false;
- }
- if (value instanceof type) {
- return true;
- }
- if (!Object.prototype.hasOwnProperty.call(type, entityKind)) {
- throw new Error(`Class "${type.name ?? ""}" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`);
- }
- let cls = Object.getPrototypeOf(value).constructor;
- if (cls) {
- while (cls) {
- if (entityKind in cls && cls[entityKind] === type[entityKind]) {
- return true;
- }
- cls = Object.getPrototypeOf(cls);
- }
- }
- return false;
-}
-
-// ../eve/node_modules/drizzle-orm/column.js
-class Column {
- constructor(table, config) {
- this.table = table;
- this.config = config;
- this.name = config.name;
- this.keyAsName = config.keyAsName;
- this.notNull = config.notNull;
- this.default = config.default;
- this.defaultFn = config.defaultFn;
- this.onUpdateFn = config.onUpdateFn;
- this.hasDefault = config.hasDefault;
- this.primary = config.primaryKey;
- this.isUnique = config.isUnique;
- this.uniqueName = config.uniqueName;
- this.uniqueType = config.uniqueType;
- this.dataType = config.dataType;
- this.columnType = config.columnType;
- this.generated = config.generated;
- this.generatedIdentity = config.generatedIdentity;
- }
- static [entityKind] = "Column";
- name;
- keyAsName;
- primary;
- notNull;
- default;
- defaultFn;
- onUpdateFn;
- hasDefault;
- isUnique;
- uniqueName;
- uniqueType;
- dataType;
- columnType;
- enumValues = undefined;
- generated = undefined;
- generatedIdentity = undefined;
- config;
- mapFromDriverValue(value) {
- return value;
- }
- mapToDriverValue(value) {
- return value;
- }
- shouldDisableInsert() {
- return this.config.generated !== undefined && this.config.generated.type !== "byDefault";
- }
-}
-
-// ../eve/node_modules/drizzle-orm/column-builder.js
-class ColumnBuilder {
- static [entityKind] = "ColumnBuilder";
- config;
- constructor(name, dataType, columnType) {
- this.config = {
- name,
- keyAsName: name === "",
- notNull: false,
- default: undefined,
- hasDefault: false,
- primaryKey: false,
- isUnique: false,
- uniqueName: undefined,
- uniqueType: undefined,
- dataType,
- columnType,
- generated: undefined
- };
- }
- $type() {
- return this;
- }
- notNull() {
- this.config.notNull = true;
- return this;
- }
- default(value) {
- this.config.default = value;
- this.config.hasDefault = true;
- return this;
- }
- $defaultFn(fn) {
- this.config.defaultFn = fn;
- this.config.hasDefault = true;
- return this;
- }
- $default = this.$defaultFn;
- $onUpdateFn(fn) {
- this.config.onUpdateFn = fn;
- this.config.hasDefault = true;
- return this;
- }
- $onUpdate = this.$onUpdateFn;
- primaryKey() {
- this.config.primaryKey = true;
- this.config.notNull = true;
- return this;
- }
- setName(name) {
- if (this.config.name !== "")
- return;
- this.config.name = name;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/table.utils.js
-var TableName = Symbol.for("drizzle:Name");
-
-// ../eve/node_modules/drizzle-orm/tracing-utils.js
-function iife(fn, ...args) {
- return fn(...args);
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/unique-constraint.js
-function uniqueKeyName(table, columns) {
- return `${table[TableName]}_${columns.join("_")}_unique`;
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/columns/common.js
-class PgColumn extends Column {
- constructor(table, config) {
- if (!config.uniqueName) {
- config.uniqueName = uniqueKeyName(table, [config.name]);
- }
- super(table, config);
- this.table = table;
- }
- static [entityKind] = "PgColumn";
-}
-
-class ExtraConfigColumn extends PgColumn {
- static [entityKind] = "ExtraConfigColumn";
- getSQLType() {
- return this.getSQLType();
- }
- indexConfig = {
- order: this.config.order ?? "asc",
- nulls: this.config.nulls ?? "last",
- opClass: this.config.opClass
- };
- defaultConfig = {
- order: "asc",
- nulls: "last",
- opClass: undefined
- };
- asc() {
- this.indexConfig.order = "asc";
- return this;
- }
- desc() {
- this.indexConfig.order = "desc";
- return this;
- }
- nullsFirst() {
- this.indexConfig.nulls = "first";
- return this;
- }
- nullsLast() {
- this.indexConfig.nulls = "last";
- return this;
- }
- op(opClass) {
- this.indexConfig.opClass = opClass;
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/columns/enum.js
-class PgEnumObjectColumn extends PgColumn {
- static [entityKind] = "PgEnumObjectColumn";
- enum;
- enumValues = this.config.enum.enumValues;
- constructor(table, config) {
- super(table, config);
- this.enum = config.enum;
- }
- getSQLType() {
- return this.enum.enumName;
- }
-}
-var isPgEnumSym = Symbol.for("drizzle:isPgEnum");
-function isPgEnum(obj) {
- return !!obj && typeof obj === "function" && isPgEnumSym in obj && obj[isPgEnumSym] === true;
-}
-class PgEnumColumn extends PgColumn {
- static [entityKind] = "PgEnumColumn";
- enum = this.config.enum;
- enumValues = this.config.enum.enumValues;
- constructor(table, config) {
- super(table, config);
- this.enum = config.enum;
- }
- getSQLType() {
- return this.enum.enumName;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/subquery.js
-class Subquery {
- static [entityKind] = "Subquery";
- constructor(sql, fields, alias, isWith = false, usedTables = []) {
- this._ = {
- brand: "Subquery",
- sql,
- selectedFields: fields,
- alias,
- isWith,
- usedTables
- };
- }
-}
-
-class WithSubquery extends Subquery {
- static [entityKind] = "WithSubquery";
-}
-
-// ../eve/node_modules/drizzle-orm/version.js
-var version = "0.44.5";
-
-// ../eve/node_modules/drizzle-orm/tracing.js
-var otel;
-var rawTracer;
-var tracer = {
- startActiveSpan(name, fn) {
- if (!otel) {
- return fn();
- }
- if (!rawTracer) {
- rawTracer = otel.trace.getTracer("drizzle-orm", version);
- }
- return iife((otel2, rawTracer2) => rawTracer2.startActiveSpan(name, (span) => {
- try {
- return fn(span);
- } catch (e) {
- span.setStatus({
- code: otel2.SpanStatusCode.ERROR,
- message: e instanceof Error ? e.message : "Unknown error"
- });
- throw e;
- } finally {
- span.end();
- }
- }), otel, rawTracer);
- }
-};
-
-// ../eve/node_modules/drizzle-orm/view-common.js
-var ViewBaseConfig = Symbol.for("drizzle:ViewBaseConfig");
-
-// ../eve/node_modules/drizzle-orm/table.js
-var Schema = Symbol.for("drizzle:Schema");
-var Columns = Symbol.for("drizzle:Columns");
-var ExtraConfigColumns = Symbol.for("drizzle:ExtraConfigColumns");
-var OriginalName = Symbol.for("drizzle:OriginalName");
-var BaseName = Symbol.for("drizzle:BaseName");
-var IsAlias = Symbol.for("drizzle:IsAlias");
-var ExtraConfigBuilder = Symbol.for("drizzle:ExtraConfigBuilder");
-var IsDrizzleTable = Symbol.for("drizzle:IsDrizzleTable");
-
-class Table {
- static [entityKind] = "Table";
- static Symbol = {
- Name: TableName,
- Schema,
- OriginalName,
- Columns,
- ExtraConfigColumns,
- BaseName,
- IsAlias,
- ExtraConfigBuilder
- };
- [TableName];
- [OriginalName];
- [Schema];
- [Columns];
- [ExtraConfigColumns];
- [BaseName];
- [IsAlias] = false;
- [IsDrizzleTable] = true;
- [ExtraConfigBuilder] = undefined;
- constructor(name, schema, baseName) {
- this[TableName] = this[OriginalName] = name;
- this[Schema] = schema;
- this[BaseName] = baseName;
- }
-}
-function getTableName(table) {
- return table[TableName];
-}
-function getTableUniqueName(table) {
- return `${table[Schema] ?? "public"}.${table[TableName]}`;
-}
-
-// ../eve/node_modules/drizzle-orm/sql/sql.js
-function isSQLWrapper(value) {
- return value !== null && value !== undefined && typeof value.getSQL === "function";
-}
-function mergeQueries(queries) {
- const result = { sql: "", params: [] };
- for (const query of queries) {
- result.sql += query.sql;
- result.params.push(...query.params);
- if (query.typings?.length) {
- if (!result.typings) {
- result.typings = [];
- }
- result.typings.push(...query.typings);
- }
- }
- return result;
-}
-
-class StringChunk {
- static [entityKind] = "StringChunk";
- value;
- constructor(value) {
- this.value = Array.isArray(value) ? value : [value];
- }
- getSQL() {
- return new SQL([this]);
- }
-}
-
-class SQL {
- constructor(queryChunks) {
- this.queryChunks = queryChunks;
- for (const chunk of queryChunks) {
- if (is(chunk, Table)) {
- const schemaName = chunk[Table.Symbol.Schema];
- this.usedTables.push(schemaName === undefined ? chunk[Table.Symbol.Name] : schemaName + "." + chunk[Table.Symbol.Name]);
- }
- }
- }
- static [entityKind] = "SQL";
- decoder = noopDecoder;
- shouldInlineParams = false;
- usedTables = [];
- append(query) {
- this.queryChunks.push(...query.queryChunks);
- return this;
- }
- toQuery(config) {
- return tracer.startActiveSpan("drizzle.buildSQL", (span) => {
- const query = this.buildQueryFromSourceParams(this.queryChunks, config);
- span?.setAttributes({
- "drizzle.query.text": query.sql,
- "drizzle.query.params": JSON.stringify(query.params)
- });
- return query;
- });
- }
- buildQueryFromSourceParams(chunks, _config) {
- const config = Object.assign({}, _config, {
- inlineParams: _config.inlineParams || this.shouldInlineParams,
- paramStartIndex: _config.paramStartIndex || { value: 0 }
- });
- const {
- casing,
- escapeName,
- escapeParam,
- prepareTyping,
- inlineParams,
- paramStartIndex
- } = config;
- return mergeQueries(chunks.map((chunk) => {
- if (is(chunk, StringChunk)) {
- return { sql: chunk.value.join(""), params: [] };
- }
- if (is(chunk, Name)) {
- return { sql: escapeName(chunk.value), params: [] };
- }
- if (chunk === undefined) {
- return { sql: "", params: [] };
- }
- if (Array.isArray(chunk)) {
- const result = [new StringChunk("(")];
- for (const [i, p] of chunk.entries()) {
- result.push(p);
- if (i < chunk.length - 1) {
- result.push(new StringChunk(", "));
- }
- }
- result.push(new StringChunk(")"));
- return this.buildQueryFromSourceParams(result, config);
- }
- if (is(chunk, SQL)) {
- return this.buildQueryFromSourceParams(chunk.queryChunks, {
- ...config,
- inlineParams: inlineParams || chunk.shouldInlineParams
- });
- }
- if (is(chunk, Table)) {
- const schemaName = chunk[Table.Symbol.Schema];
- const tableName = chunk[Table.Symbol.Name];
- return {
- sql: schemaName === undefined || chunk[IsAlias] ? escapeName(tableName) : escapeName(schemaName) + "." + escapeName(tableName),
- params: []
- };
- }
- if (is(chunk, Column)) {
- const columnName = casing.getColumnCasing(chunk);
- if (_config.invokeSource === "indexes") {
- return { sql: escapeName(columnName), params: [] };
- }
- const schemaName = chunk.table[Table.Symbol.Schema];
- return {
- sql: chunk.table[IsAlias] || schemaName === undefined ? escapeName(chunk.table[Table.Symbol.Name]) + "." + escapeName(columnName) : escapeName(schemaName) + "." + escapeName(chunk.table[Table.Symbol.Name]) + "." + escapeName(columnName),
- params: []
- };
- }
- if (is(chunk, View)) {
- const schemaName = chunk[ViewBaseConfig].schema;
- const viewName = chunk[ViewBaseConfig].name;
- return {
- sql: schemaName === undefined || chunk[ViewBaseConfig].isAlias ? escapeName(viewName) : escapeName(schemaName) + "." + escapeName(viewName),
- params: []
- };
- }
- if (is(chunk, Param)) {
- if (is(chunk.value, Placeholder)) {
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
- }
- const mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);
- if (is(mappedValue, SQL)) {
- return this.buildQueryFromSourceParams([mappedValue], config);
- }
- if (inlineParams) {
- return { sql: this.mapInlineParam(mappedValue, config), params: [] };
- }
- let typings = ["none"];
- if (prepareTyping) {
- typings = [prepareTyping(chunk.encoder)];
- }
- return { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };
- }
- if (is(chunk, Placeholder)) {
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
- }
- if (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {
- return { sql: escapeName(chunk.fieldAlias), params: [] };
- }
- if (is(chunk, Subquery)) {
- if (chunk._.isWith) {
- return { sql: escapeName(chunk._.alias), params: [] };
- }
- return this.buildQueryFromSourceParams([
- new StringChunk("("),
- chunk._.sql,
- new StringChunk(") "),
- new Name(chunk._.alias)
- ], config);
- }
- if (isPgEnum(chunk)) {
- if (chunk.schema) {
- return { sql: escapeName(chunk.schema) + "." + escapeName(chunk.enumName), params: [] };
- }
- return { sql: escapeName(chunk.enumName), params: [] };
- }
- if (isSQLWrapper(chunk)) {
- if (chunk.shouldOmitSQLParens?.()) {
- return this.buildQueryFromSourceParams([chunk.getSQL()], config);
- }
- return this.buildQueryFromSourceParams([
- new StringChunk("("),
- chunk.getSQL(),
- new StringChunk(")")
- ], config);
- }
- if (inlineParams) {
- return { sql: this.mapInlineParam(chunk, config), params: [] };
- }
- return { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ["none"] };
- }));
- }
- mapInlineParam(chunk, { escapeString }) {
- if (chunk === null) {
- return "null";
- }
- if (typeof chunk === "number" || typeof chunk === "boolean") {
- return chunk.toString();
- }
- if (typeof chunk === "string") {
- return escapeString(chunk);
- }
- if (typeof chunk === "object") {
- const mappedValueAsString = chunk.toString();
- if (mappedValueAsString === "[object Object]") {
- return escapeString(JSON.stringify(chunk));
- }
- return escapeString(mappedValueAsString);
- }
- throw new Error("Unexpected param value: " + chunk);
- }
- getSQL() {
- return this;
- }
- as(alias) {
- if (alias === undefined) {
- return this;
- }
- return new SQL.Aliased(this, alias);
- }
- mapWith(decoder) {
- this.decoder = typeof decoder === "function" ? { mapFromDriverValue: decoder } : decoder;
- return this;
- }
- inlineParams() {
- this.shouldInlineParams = true;
- return this;
- }
- if(condition) {
- return condition ? this : undefined;
- }
-}
-
-class Name {
- constructor(value) {
- this.value = value;
- }
- static [entityKind] = "Name";
- brand;
- getSQL() {
- return new SQL([this]);
- }
-}
-function isDriverValueEncoder(value) {
- return typeof value === "object" && value !== null && "mapToDriverValue" in value && typeof value.mapToDriverValue === "function";
-}
-var noopDecoder = {
- mapFromDriverValue: (value) => value
-};
-var noopEncoder = {
- mapToDriverValue: (value) => value
-};
-var noopMapper = {
- ...noopDecoder,
- ...noopEncoder
-};
-
-class Param {
- constructor(value, encoder = noopEncoder) {
- this.value = value;
- this.encoder = encoder;
- }
- static [entityKind] = "Param";
- brand;
- getSQL() {
- return new SQL([this]);
- }
-}
-function sql(strings, ...params) {
- const queryChunks = [];
- if (params.length > 0 || strings.length > 0 && strings[0] !== "") {
- queryChunks.push(new StringChunk(strings[0]));
- }
- for (const [paramIndex, param2] of params.entries()) {
- queryChunks.push(param2, new StringChunk(strings[paramIndex + 1]));
- }
- return new SQL(queryChunks);
-}
-((sql2) => {
- function empty() {
- return new SQL([]);
- }
- sql2.empty = empty;
- function fromList(list) {
- return new SQL(list);
- }
- sql2.fromList = fromList;
- function raw(str) {
- return new SQL([new StringChunk(str)]);
- }
- sql2.raw = raw;
- function join(chunks, separator) {
- const result = [];
- for (const [i, chunk] of chunks.entries()) {
- if (i > 0 && separator !== undefined) {
- result.push(separator);
- }
- result.push(chunk);
- }
- return new SQL(result);
- }
- sql2.join = join;
- function identifier(value) {
- return new Name(value);
- }
- sql2.identifier = identifier;
- function placeholder2(name2) {
- return new Placeholder(name2);
- }
- sql2.placeholder = placeholder2;
- function param2(value, encoder) {
- return new Param(value, encoder);
- }
- sql2.param = param2;
-})(sql || (sql = {}));
-((SQL2) => {
-
- class Aliased {
- constructor(sql2, fieldAlias) {
- this.sql = sql2;
- this.fieldAlias = fieldAlias;
- }
- static [entityKind] = "SQL.Aliased";
- isSelectionField = false;
- getSQL() {
- return this.sql;
- }
- clone() {
- return new Aliased(this.sql, this.fieldAlias);
- }
- }
- SQL2.Aliased = Aliased;
-})(SQL || (SQL = {}));
-
-class Placeholder {
- constructor(name2) {
- this.name = name2;
- }
- static [entityKind] = "Placeholder";
- getSQL() {
- return new SQL([this]);
- }
-}
-function fillPlaceholders(params, values) {
- return params.map((p) => {
- if (is(p, Placeholder)) {
- if (!(p.name in values)) {
- throw new Error(`No value for placeholder "${p.name}" was provided`);
- }
- return values[p.name];
- }
- if (is(p, Param) && is(p.value, Placeholder)) {
- if (!(p.value.name in values)) {
- throw new Error(`No value for placeholder "${p.value.name}" was provided`);
- }
- return p.encoder.mapToDriverValue(values[p.value.name]);
- }
- return p;
- });
-}
-var IsDrizzleView = Symbol.for("drizzle:IsDrizzleView");
-
-class View {
- static [entityKind] = "View";
- [ViewBaseConfig];
- [IsDrizzleView] = true;
- constructor({ name: name2, schema, selectedFields, query }) {
- this[ViewBaseConfig] = {
- name: name2,
- originalName: name2,
- schema,
- selectedFields,
- query,
- isExisting: !query,
- isAlias: false
- };
- }
- getSQL() {
- return new SQL([this]);
- }
-}
-Column.prototype.getSQL = function() {
- return new SQL([this]);
-};
-Table.prototype.getSQL = function() {
- return new SQL([this]);
-};
-Subquery.prototype.getSQL = function() {
- return new SQL([this]);
-};
-
-// ../eve/node_modules/drizzle-orm/alias.js
-class ColumnAliasProxyHandler {
- constructor(table) {
- this.table = table;
- }
- static [entityKind] = "ColumnAliasProxyHandler";
- get(columnObj, prop) {
- if (prop === "table") {
- return this.table;
- }
- return columnObj[prop];
- }
-}
-
-class TableAliasProxyHandler {
- constructor(alias, replaceOriginalName) {
- this.alias = alias;
- this.replaceOriginalName = replaceOriginalName;
- }
- static [entityKind] = "TableAliasProxyHandler";
- get(target, prop) {
- if (prop === Table.Symbol.IsAlias) {
- return true;
- }
- if (prop === Table.Symbol.Name) {
- return this.alias;
- }
- if (this.replaceOriginalName && prop === Table.Symbol.OriginalName) {
- return this.alias;
- }
- if (prop === ViewBaseConfig) {
- return {
- ...target[ViewBaseConfig],
- name: this.alias,
- isAlias: true
- };
- }
- if (prop === Table.Symbol.Columns) {
- const columns = target[Table.Symbol.Columns];
- if (!columns) {
- return columns;
- }
- const proxiedColumns = {};
- Object.keys(columns).map((key) => {
- proxiedColumns[key] = new Proxy(columns[key], new ColumnAliasProxyHandler(new Proxy(target, this)));
- });
- return proxiedColumns;
- }
- const value = target[prop];
- if (is(value, Column)) {
- return new Proxy(value, new ColumnAliasProxyHandler(new Proxy(target, this)));
- }
- return value;
- }
-}
-function aliasedTable(table, tableAlias) {
- return new Proxy(table, new TableAliasProxyHandler(tableAlias, false));
-}
-function aliasedTableColumn(column, tableAlias) {
- return new Proxy(column, new ColumnAliasProxyHandler(new Proxy(column.table, new TableAliasProxyHandler(tableAlias, false))));
-}
-function mapColumnsInAliasedSQLToAlias(query, alias) {
- return new SQL.Aliased(mapColumnsInSQLToAlias(query.sql, alias), query.fieldAlias);
-}
-function mapColumnsInSQLToAlias(query, alias) {
- return sql.join(query.queryChunks.map((c) => {
- if (is(c, Column)) {
- return aliasedTableColumn(c, alias);
- }
- if (is(c, SQL)) {
- return mapColumnsInSQLToAlias(c, alias);
- }
- if (is(c, SQL.Aliased)) {
- return mapColumnsInAliasedSQLToAlias(c, alias);
- }
- return c;
- }));
-}
-
-// ../eve/node_modules/drizzle-orm/utils.js
-function mapResultRow(columns, row, joinsNotNullableMap) {
- const nullifyMap = {};
- const result = columns.reduce((result2, { path, field }, columnIndex) => {
- let decoder;
- if (is(field, Column)) {
- decoder = field;
- } else if (is(field, SQL)) {
- decoder = field.decoder;
- } else {
- decoder = field.sql.decoder;
- }
- let node = result2;
- for (const [pathChunkIndex, pathChunk] of path.entries()) {
- if (pathChunkIndex < path.length - 1) {
- if (!(pathChunk in node)) {
- node[pathChunk] = {};
- }
- node = node[pathChunk];
- } else {
- const rawValue = row[columnIndex];
- const value = node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue);
- if (joinsNotNullableMap && is(field, Column) && path.length === 2) {
- const objectName = path[0];
- if (!(objectName in nullifyMap)) {
- nullifyMap[objectName] = value === null ? getTableName(field.table) : false;
- } else if (typeof nullifyMap[objectName] === "string" && nullifyMap[objectName] !== getTableName(field.table)) {
- nullifyMap[objectName] = false;
- }
- }
- }
- }
- return result2;
- }, {});
- if (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {
- for (const [objectName, tableName] of Object.entries(nullifyMap)) {
- if (typeof tableName === "string" && !joinsNotNullableMap[tableName]) {
- result[objectName] = null;
- }
- }
- }
- return result;
-}
-function orderSelectedFields(fields, pathPrefix) {
- return Object.entries(fields).reduce((result, [name, field]) => {
- if (typeof name !== "string") {
- return result;
- }
- const newPath = pathPrefix ? [...pathPrefix, name] : [name];
- if (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased)) {
- result.push({ path: newPath, field });
- } else if (is(field, Table)) {
- result.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath));
- } else {
- result.push(...orderSelectedFields(field, newPath));
- }
- return result;
- }, []);
-}
-function haveSameKeys(left, right) {
- const leftKeys = Object.keys(left);
- const rightKeys = Object.keys(right);
- if (leftKeys.length !== rightKeys.length) {
- return false;
- }
- for (const [index, key] of leftKeys.entries()) {
- if (key !== rightKeys[index]) {
- return false;
- }
- }
- return true;
-}
-function mapUpdateSet(table, values) {
- const entries = Object.entries(values).filter(([, value]) => value !== undefined).map(([key, value]) => {
- if (is(value, SQL) || is(value, Column)) {
- return [key, value];
- } else {
- return [key, new Param(value, table[Table.Symbol.Columns][key])];
- }
- });
- if (entries.length === 0) {
- throw new Error("No values to set");
- }
- return Object.fromEntries(entries);
-}
-function applyMixins(baseClass, extendedClasses) {
- for (const extendedClass of extendedClasses) {
- for (const name of Object.getOwnPropertyNames(extendedClass.prototype)) {
- if (name === "constructor")
- continue;
- Object.defineProperty(baseClass.prototype, name, Object.getOwnPropertyDescriptor(extendedClass.prototype, name) || /* @__PURE__ */ Object.create(null));
- }
- }
-}
-function getTableColumns(table) {
- return table[Table.Symbol.Columns];
-}
-function getTableLikeName(table) {
- return is(table, Subquery) ? table._.alias : is(table, View) ? table[ViewBaseConfig].name : is(table, SQL) ? undefined : table[Table.Symbol.IsAlias] ? table[Table.Symbol.Name] : table[Table.Symbol.BaseName];
-}
-function getColumnNameAndConfig(a, b) {
- return {
- name: typeof a === "string" && a.length > 0 ? a : "",
- config: typeof a === "object" ? a : b
- };
-}
-function isConfig(data) {
- if (typeof data !== "object" || data === null)
- return false;
- if (data.constructor.name !== "Object")
- return false;
- if ("logger" in data) {
- const type = typeof data["logger"];
- if (type !== "boolean" && (type !== "object" || typeof data["logger"]["logQuery"] !== "function") && type !== "undefined")
- return false;
- return true;
- }
- if ("schema" in data) {
- const type = typeof data["schema"];
- if (type !== "object" && type !== "undefined")
- return false;
- return true;
- }
- if ("casing" in data) {
- const type = typeof data["casing"];
- if (type !== "string" && type !== "undefined")
- return false;
- return true;
- }
- if ("mode" in data) {
- if (data["mode"] !== "default" || data["mode"] !== "planetscale" || data["mode"] !== undefined)
- return false;
- return true;
- }
- if ("connection" in data) {
- const type = typeof data["connection"];
- if (type !== "string" && type !== "object" && type !== "undefined")
- return false;
- return true;
- }
- if ("client" in data) {
- const type = typeof data["client"];
- if (type !== "object" && type !== "function" && type !== "undefined")
- return false;
- return true;
- }
- if (Object.keys(data).length === 0)
- return true;
- return false;
-}
-var textDecoder = typeof TextDecoder === "undefined" ? null : new TextDecoder;
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/foreign-keys.js
-class ForeignKeyBuilder {
- static [entityKind] = "SQLiteForeignKeyBuilder";
- reference;
- _onUpdate;
- _onDelete;
- constructor(config, actions) {
- this.reference = () => {
- const { name, columns, foreignColumns } = config();
- return { name, columns, foreignTable: foreignColumns[0].table, foreignColumns };
- };
- if (actions) {
- this._onUpdate = actions.onUpdate;
- this._onDelete = actions.onDelete;
- }
- }
- onUpdate(action) {
- this._onUpdate = action;
- return this;
- }
- onDelete(action) {
- this._onDelete = action;
- return this;
- }
- build(table) {
- return new ForeignKey(table, this);
- }
-}
-
-class ForeignKey {
- constructor(table, builder) {
- this.table = table;
- this.reference = builder.reference;
- this.onUpdate = builder._onUpdate;
- this.onDelete = builder._onDelete;
- }
- static [entityKind] = "SQLiteForeignKey";
- reference;
- onUpdate;
- onDelete;
- getName() {
- const { name, columns, foreignColumns } = this.reference();
- const columnNames = columns.map((column) => column.name);
- const foreignColumnNames = foreignColumns.map((column) => column.name);
- const chunks = [
- this.table[TableName],
- ...columnNames,
- foreignColumns[0].table[TableName],
- ...foreignColumnNames
- ];
- return name ?? `${chunks.join("_")}_fk`;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/unique-constraint.js
-function uniqueKeyName2(table, columns) {
- return `${table[TableName]}_${columns.join("_")}_unique`;
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/common.js
-class SQLiteColumnBuilder extends ColumnBuilder {
- static [entityKind] = "SQLiteColumnBuilder";
- foreignKeyConfigs = [];
- references(ref, actions = {}) {
- this.foreignKeyConfigs.push({ ref, actions });
- return this;
- }
- unique(name) {
- this.config.isUnique = true;
- this.config.uniqueName = name;
- return this;
- }
- generatedAlwaysAs(as, config) {
- this.config.generated = {
- as,
- type: "always",
- mode: config?.mode ?? "virtual"
- };
- return this;
- }
- buildForeignKeys(column, table) {
- return this.foreignKeyConfigs.map(({ ref, actions }) => {
- return ((ref2, actions2) => {
- const builder = new ForeignKeyBuilder(() => {
- const foreignColumn = ref2();
- return { columns: [column], foreignColumns: [foreignColumn] };
- });
- if (actions2.onUpdate) {
- builder.onUpdate(actions2.onUpdate);
- }
- if (actions2.onDelete) {
- builder.onDelete(actions2.onDelete);
- }
- return builder.build(table);
- })(ref, actions);
- });
- }
-}
-
-class SQLiteColumn extends Column {
- constructor(table, config) {
- if (!config.uniqueName) {
- config.uniqueName = uniqueKeyName2(table, [config.name]);
- }
- super(table, config);
- this.table = table;
- }
- static [entityKind] = "SQLiteColumn";
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/blob.js
-class SQLiteBigIntBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBigIntBuilder";
- constructor(name) {
- super(name, "bigint", "SQLiteBigInt");
- }
- build(table) {
- return new SQLiteBigInt(table, this.config);
- }
-}
-
-class SQLiteBigInt extends SQLiteColumn {
- static [entityKind] = "SQLiteBigInt";
- getSQLType() {
- return "blob";
- }
- mapFromDriverValue(value) {
- if (typeof Buffer !== "undefined" && Buffer.from) {
- const buf = Buffer.isBuffer(value) ? value : value instanceof ArrayBuffer ? Buffer.from(value) : value.buffer ? Buffer.from(value.buffer, value.byteOffset, value.byteLength) : Buffer.from(value);
- return BigInt(buf.toString("utf8"));
- }
- return BigInt(textDecoder.decode(value));
- }
- mapToDriverValue(value) {
- return Buffer.from(value.toString());
- }
-}
-
-class SQLiteBlobJsonBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBlobJsonBuilder";
- constructor(name) {
- super(name, "json", "SQLiteBlobJson");
- }
- build(table) {
- return new SQLiteBlobJson(table, this.config);
- }
-}
-
-class SQLiteBlobJson extends SQLiteColumn {
- static [entityKind] = "SQLiteBlobJson";
- getSQLType() {
- return "blob";
- }
- mapFromDriverValue(value) {
- if (typeof Buffer !== "undefined" && Buffer.from) {
- const buf = Buffer.isBuffer(value) ? value : value instanceof ArrayBuffer ? Buffer.from(value) : value.buffer ? Buffer.from(value.buffer, value.byteOffset, value.byteLength) : Buffer.from(value);
- return JSON.parse(buf.toString("utf8"));
- }
- return JSON.parse(textDecoder.decode(value));
- }
- mapToDriverValue(value) {
- return Buffer.from(JSON.stringify(value));
- }
-}
-
-class SQLiteBlobBufferBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBlobBufferBuilder";
- constructor(name) {
- super(name, "buffer", "SQLiteBlobBuffer");
- }
- build(table) {
- return new SQLiteBlobBuffer(table, this.config);
- }
-}
-
-class SQLiteBlobBuffer extends SQLiteColumn {
- static [entityKind] = "SQLiteBlobBuffer";
- mapFromDriverValue(value) {
- if (Buffer.isBuffer(value)) {
- return value;
- }
- return Buffer.from(value);
- }
- getSQLType() {
- return "blob";
- }
-}
-function blob(a, b) {
- const { name, config } = getColumnNameAndConfig(a, b);
- if (config?.mode === "json") {
- return new SQLiteBlobJsonBuilder(name);
- }
- if (config?.mode === "bigint") {
- return new SQLiteBigIntBuilder(name);
- }
- return new SQLiteBlobBufferBuilder(name);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/custom.js
-class SQLiteCustomColumnBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteCustomColumnBuilder";
- constructor(name, fieldConfig, customTypeParams) {
- super(name, "custom", "SQLiteCustomColumn");
- this.config.fieldConfig = fieldConfig;
- this.config.customTypeParams = customTypeParams;
- }
- build(table) {
- return new SQLiteCustomColumn(table, this.config);
- }
-}
-
-class SQLiteCustomColumn extends SQLiteColumn {
- static [entityKind] = "SQLiteCustomColumn";
- sqlName;
- mapTo;
- mapFrom;
- constructor(table, config) {
- super(table, config);
- this.sqlName = config.customTypeParams.dataType(config.fieldConfig);
- this.mapTo = config.customTypeParams.toDriver;
- this.mapFrom = config.customTypeParams.fromDriver;
- }
- getSQLType() {
- return this.sqlName;
- }
- mapFromDriverValue(value) {
- return typeof this.mapFrom === "function" ? this.mapFrom(value) : value;
- }
- mapToDriverValue(value) {
- return typeof this.mapTo === "function" ? this.mapTo(value) : value;
- }
-}
-function customType(customTypeParams) {
- return (a, b) => {
- const { name, config } = getColumnNameAndConfig(a, b);
- return new SQLiteCustomColumnBuilder(name, config, customTypeParams);
- };
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/integer.js
-class SQLiteBaseIntegerBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteBaseIntegerBuilder";
- constructor(name, dataType, columnType) {
- super(name, dataType, columnType);
- this.config.autoIncrement = false;
- }
- primaryKey(config) {
- if (config?.autoIncrement) {
- this.config.autoIncrement = true;
- }
- this.config.hasDefault = true;
- return super.primaryKey();
- }
-}
-
-class SQLiteBaseInteger extends SQLiteColumn {
- static [entityKind] = "SQLiteBaseInteger";
- autoIncrement = this.config.autoIncrement;
- getSQLType() {
- return "integer";
- }
-}
-
-class SQLiteIntegerBuilder extends SQLiteBaseIntegerBuilder {
- static [entityKind] = "SQLiteIntegerBuilder";
- constructor(name) {
- super(name, "number", "SQLiteInteger");
- }
- build(table) {
- return new SQLiteInteger(table, this.config);
- }
-}
-
-class SQLiteInteger extends SQLiteBaseInteger {
- static [entityKind] = "SQLiteInteger";
-}
-
-class SQLiteTimestampBuilder extends SQLiteBaseIntegerBuilder {
- static [entityKind] = "SQLiteTimestampBuilder";
- constructor(name, mode) {
- super(name, "date", "SQLiteTimestamp");
- this.config.mode = mode;
- }
- defaultNow() {
- return this.default(sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`);
- }
- build(table) {
- return new SQLiteTimestamp(table, this.config);
- }
-}
-
-class SQLiteTimestamp extends SQLiteBaseInteger {
- static [entityKind] = "SQLiteTimestamp";
- mode = this.config.mode;
- mapFromDriverValue(value) {
- if (this.config.mode === "timestamp") {
- return new Date(value * 1000);
- }
- return new Date(value);
- }
- mapToDriverValue(value) {
- const unix = value.getTime();
- if (this.config.mode === "timestamp") {
- return Math.floor(unix / 1000);
- }
- return unix;
- }
-}
-
-class SQLiteBooleanBuilder extends SQLiteBaseIntegerBuilder {
- static [entityKind] = "SQLiteBooleanBuilder";
- constructor(name, mode) {
- super(name, "boolean", "SQLiteBoolean");
- this.config.mode = mode;
- }
- build(table) {
- return new SQLiteBoolean(table, this.config);
- }
-}
-
-class SQLiteBoolean extends SQLiteBaseInteger {
- static [entityKind] = "SQLiteBoolean";
- mode = this.config.mode;
- mapFromDriverValue(value) {
- return Number(value) === 1;
- }
- mapToDriverValue(value) {
- return value ? 1 : 0;
- }
-}
-function integer(a, b) {
- const { name, config } = getColumnNameAndConfig(a, b);
- if (config?.mode === "timestamp" || config?.mode === "timestamp_ms") {
- return new SQLiteTimestampBuilder(name, config.mode);
- }
- if (config?.mode === "boolean") {
- return new SQLiteBooleanBuilder(name, config.mode);
- }
- return new SQLiteIntegerBuilder(name);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/numeric.js
-class SQLiteNumericBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteNumericBuilder";
- constructor(name) {
- super(name, "string", "SQLiteNumeric");
- }
- build(table) {
- return new SQLiteNumeric(table, this.config);
- }
-}
-
-class SQLiteNumeric extends SQLiteColumn {
- static [entityKind] = "SQLiteNumeric";
- mapFromDriverValue(value) {
- if (typeof value === "string")
- return value;
- return String(value);
- }
- getSQLType() {
- return "numeric";
- }
-}
-
-class SQLiteNumericNumberBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteNumericNumberBuilder";
- constructor(name) {
- super(name, "number", "SQLiteNumericNumber");
- }
- build(table) {
- return new SQLiteNumericNumber(table, this.config);
- }
-}
-
-class SQLiteNumericNumber extends SQLiteColumn {
- static [entityKind] = "SQLiteNumericNumber";
- mapFromDriverValue(value) {
- if (typeof value === "number")
- return value;
- return Number(value);
- }
- mapToDriverValue = String;
- getSQLType() {
- return "numeric";
- }
-}
-
-class SQLiteNumericBigIntBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteNumericBigIntBuilder";
- constructor(name) {
- super(name, "bigint", "SQLiteNumericBigInt");
- }
- build(table) {
- return new SQLiteNumericBigInt(table, this.config);
- }
-}
-
-class SQLiteNumericBigInt extends SQLiteColumn {
- static [entityKind] = "SQLiteNumericBigInt";
- mapFromDriverValue = BigInt;
- mapToDriverValue = String;
- getSQLType() {
- return "numeric";
- }
-}
-function numeric(a, b) {
- const { name, config } = getColumnNameAndConfig(a, b);
- const mode = config?.mode;
- return mode === "number" ? new SQLiteNumericNumberBuilder(name) : mode === "bigint" ? new SQLiteNumericBigIntBuilder(name) : new SQLiteNumericBuilder(name);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/real.js
-class SQLiteRealBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteRealBuilder";
- constructor(name) {
- super(name, "number", "SQLiteReal");
- }
- build(table) {
- return new SQLiteReal(table, this.config);
- }
-}
-
-class SQLiteReal extends SQLiteColumn {
- static [entityKind] = "SQLiteReal";
- getSQLType() {
- return "real";
- }
-}
-function real(name) {
- return new SQLiteRealBuilder(name ?? "");
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/text.js
-class SQLiteTextBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteTextBuilder";
- constructor(name, config) {
- super(name, "string", "SQLiteText");
- this.config.enumValues = config.enum;
- this.config.length = config.length;
- }
- build(table) {
- return new SQLiteText(table, this.config);
- }
-}
-
-class SQLiteText extends SQLiteColumn {
- static [entityKind] = "SQLiteText";
- enumValues = this.config.enumValues;
- length = this.config.length;
- constructor(table, config) {
- super(table, config);
- }
- getSQLType() {
- return `text${this.config.length ? `(${this.config.length})` : ""}`;
- }
-}
-
-class SQLiteTextJsonBuilder extends SQLiteColumnBuilder {
- static [entityKind] = "SQLiteTextJsonBuilder";
- constructor(name) {
- super(name, "json", "SQLiteTextJson");
- }
- build(table) {
- return new SQLiteTextJson(table, this.config);
- }
-}
-
-class SQLiteTextJson extends SQLiteColumn {
- static [entityKind] = "SQLiteTextJson";
- getSQLType() {
- return "text";
- }
- mapFromDriverValue(value) {
- return JSON.parse(value);
- }
- mapToDriverValue(value) {
- return JSON.stringify(value);
- }
-}
-function text(a, b = {}) {
- const { name, config } = getColumnNameAndConfig(a, b);
- if (config.mode === "json") {
- return new SQLiteTextJsonBuilder(name);
- }
- return new SQLiteTextBuilder(name, config);
-}
-
-// ../eve/node_modules/drizzle-orm/selection-proxy.js
-class SelectionProxyHandler {
- static [entityKind] = "SelectionProxyHandler";
- config;
- constructor(config) {
- this.config = { ...config };
- }
- get(subquery, prop) {
- if (prop === "_") {
- return {
- ...subquery["_"],
- selectedFields: new Proxy(subquery._.selectedFields, this)
- };
- }
- if (prop === ViewBaseConfig) {
- return {
- ...subquery[ViewBaseConfig],
- selectedFields: new Proxy(subquery[ViewBaseConfig].selectedFields, this)
- };
- }
- if (typeof prop === "symbol") {
- return subquery[prop];
- }
- const columns = is(subquery, Subquery) ? subquery._.selectedFields : is(subquery, View) ? subquery[ViewBaseConfig].selectedFields : subquery;
- const value = columns[prop];
- if (is(value, SQL.Aliased)) {
- if (this.config.sqlAliasedBehavior === "sql" && !value.isSelectionField) {
- return value.sql;
- }
- const newValue = value.clone();
- newValue.isSelectionField = true;
- return newValue;
- }
- if (is(value, SQL)) {
- if (this.config.sqlBehavior === "sql") {
- return value;
- }
- throw new Error(`You tried to reference "${prop}" field from a subquery, which is a raw SQL field, but it doesn't have an alias declared. Please add an alias to the field using ".as('alias')" method.`);
- }
- if (is(value, Column)) {
- if (this.config.alias) {
- return new Proxy(value, new ColumnAliasProxyHandler(new Proxy(value.table, new TableAliasProxyHandler(this.config.alias, this.config.replaceOriginalName ?? false))));
- }
- return value;
- }
- if (typeof value !== "object" || value === null) {
- return value;
- }
- return new Proxy(value, new SelectionProxyHandler(this.config));
- }
-}
-
-// ../eve/node_modules/drizzle-orm/query-promise.js
-class QueryPromise {
- static [entityKind] = "QueryPromise";
- [Symbol.toStringTag] = "QueryPromise";
- catch(onRejected) {
- return this.then(undefined, onRejected);
- }
- finally(onFinally) {
- return this.then((value) => {
- onFinally?.();
- return value;
- }, (reason) => {
- onFinally?.();
- throw reason;
- });
- }
- then(onFulfilled, onRejected) {
- return this.execute().then(onFulfilled, onRejected);
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/columns/all.js
-function getSQLiteColumnBuilders() {
- return {
- blob,
- customType,
- integer,
- numeric,
- real,
- text
- };
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/table.js
-var InlineForeignKeys = Symbol.for("drizzle:SQLiteInlineForeignKeys");
-
-class SQLiteTable extends Table {
- static [entityKind] = "SQLiteTable";
- static Symbol = Object.assign({}, Table.Symbol, {
- InlineForeignKeys
- });
- [Table.Symbol.Columns];
- [InlineForeignKeys] = [];
- [Table.Symbol.ExtraConfigBuilder] = undefined;
-}
-function sqliteTableBase(name, columns, extraConfig, schema, baseName = name) {
- const rawTable = new SQLiteTable(name, schema, baseName);
- const parsedColumns = typeof columns === "function" ? columns(getSQLiteColumnBuilders()) : columns;
- const builtColumns = Object.fromEntries(Object.entries(parsedColumns).map(([name2, colBuilderBase]) => {
- const colBuilder = colBuilderBase;
- colBuilder.setName(name2);
- const column = colBuilder.build(rawTable);
- rawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));
- return [name2, column];
- }));
- const table = Object.assign(rawTable, builtColumns);
- table[Table.Symbol.Columns] = builtColumns;
- table[Table.Symbol.ExtraConfigColumns] = builtColumns;
- if (extraConfig) {
- table[SQLiteTable.Symbol.ExtraConfigBuilder] = extraConfig;
- }
- return table;
-}
-var sqliteTable = (name, columns, extraConfig) => {
- return sqliteTableBase(name, columns, extraConfig);
-};
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/indexes.js
-class IndexBuilderOn {
- constructor(name, unique) {
- this.name = name;
- this.unique = unique;
- }
- static [entityKind] = "SQLiteIndexBuilderOn";
- on(...columns) {
- return new IndexBuilder(this.name, columns, this.unique);
- }
-}
-
-class IndexBuilder {
- static [entityKind] = "SQLiteIndexBuilder";
- config;
- constructor(name, columns, unique) {
- this.config = {
- name,
- columns,
- unique,
- where: undefined
- };
- }
- where(condition) {
- this.config.where = condition;
- return this;
- }
- build(table) {
- return new Index(this.config, table);
- }
-}
-
-class Index {
- static [entityKind] = "SQLiteIndex";
- config;
- constructor(config, table) {
- this.config = { ...config, table };
- }
-}
-function index(name) {
- return new IndexBuilderOn(name, false);
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/utils.js
-function extractUsedTable(table) {
- if (is(table, SQLiteTable)) {
- return [`${table[Table.Symbol.BaseName]}`];
- }
- if (is(table, Subquery)) {
- return table._.usedTables ?? [];
- }
- if (is(table, SQL)) {
- return table.usedTables ?? [];
- }
- return [];
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js
-class SQLiteDeleteBase extends QueryPromise {
- constructor(table, session, dialect, withList) {
- super();
- this.table = table;
- this.session = session;
- this.dialect = dialect;
- this.config = { table, withList };
- }
- static [entityKind] = "SQLiteDelete";
- config;
- where(where) {
- this.config.where = where;
- return this;
- }
- orderBy(...columns) {
- if (typeof columns[0] === "function") {
- const orderBy = columns[0](new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
- this.config.orderBy = orderByArray;
- } else {
- const orderByArray = columns;
- this.config.orderBy = orderByArray;
- }
- return this;
- }
- limit(limit) {
- this.config.limit = limit;
- return this;
- }
- returning(fields = this.table[SQLiteTable.Symbol.Columns]) {
- this.config.returning = orderSelectedFields(fields);
- return this;
- }
- getSQL() {
- return this.dialect.buildDeleteQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- _prepare(isOneTimeQuery = true) {
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
- type: "delete",
- tables: extractUsedTable(this.config.table)
- });
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute(placeholderValues) {
- return this._prepare().execute(placeholderValues);
- }
- $dynamic() {
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/casing.js
-function toSnakeCase(input) {
- const words = input.replace(/['\u2019]/g, "").match(/[\da-z]+|[A-Z]+(?![a-z])|[A-Z][\da-z]+/g) ?? [];
- return words.map((word) => word.toLowerCase()).join("_");
-}
-function toCamelCase(input) {
- const words = input.replace(/['\u2019]/g, "").match(/[\da-z]+|[A-Z]+(?![a-z])|[A-Z][\da-z]+/g) ?? [];
- return words.reduce((acc, word, i) => {
- const formattedWord = i === 0 ? word.toLowerCase() : `${word[0].toUpperCase()}${word.slice(1)}`;
- return acc + formattedWord;
- }, "");
-}
-function noopCase(input) {
- return input;
-}
-
-class CasingCache {
- static [entityKind] = "CasingCache";
- cache = {};
- cachedTables = {};
- convert;
- constructor(casing) {
- this.convert = casing === "snake_case" ? toSnakeCase : casing === "camelCase" ? toCamelCase : noopCase;
- }
- getColumnCasing(column) {
- if (!column.keyAsName)
- return column.name;
- const schema = column.table[Table.Symbol.Schema] ?? "public";
- const tableName = column.table[Table.Symbol.OriginalName];
- const key = `${schema}.${tableName}.${column.name}`;
- if (!this.cache[key]) {
- this.cacheTable(column.table);
- }
- return this.cache[key];
- }
- cacheTable(table) {
- const schema = table[Table.Symbol.Schema] ?? "public";
- const tableName = table[Table.Symbol.OriginalName];
- const tableKey = `${schema}.${tableName}`;
- if (!this.cachedTables[tableKey]) {
- for (const column of Object.values(table[Table.Symbol.Columns])) {
- const columnKey = `${tableKey}.${column.name}`;
- this.cache[columnKey] = this.convert(column.name);
- }
- this.cachedTables[tableKey] = true;
- }
- }
- clearCache() {
- this.cache = {};
- this.cachedTables = {};
- }
-}
-
-// ../eve/node_modules/drizzle-orm/errors.js
-class DrizzleError extends Error {
- static [entityKind] = "DrizzleError";
- constructor({ message, cause }) {
- super(message);
- this.name = "DrizzleError";
- this.cause = cause;
- }
-}
-
-class DrizzleQueryError extends Error {
- constructor(query, params, cause) {
- super(`Failed query: ${query}
-params: ${params}`);
- this.query = query;
- this.params = params;
- this.cause = cause;
- Error.captureStackTrace(this, DrizzleQueryError);
- if (cause)
- this.cause = cause;
- }
-}
-
-class TransactionRollbackError extends DrizzleError {
- static [entityKind] = "TransactionRollbackError";
- constructor() {
- super({ message: "Rollback" });
- }
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/table.js
-var InlineForeignKeys2 = Symbol.for("drizzle:PgInlineForeignKeys");
-var EnableRLS = Symbol.for("drizzle:EnableRLS");
-
-class PgTable extends Table {
- static [entityKind] = "PgTable";
- static Symbol = Object.assign({}, Table.Symbol, {
- InlineForeignKeys: InlineForeignKeys2,
- EnableRLS
- });
- [InlineForeignKeys2] = [];
- [EnableRLS] = false;
- [Table.Symbol.ExtraConfigBuilder] = undefined;
- [Table.Symbol.ExtraConfigColumns] = {};
-}
-
-// ../eve/node_modules/drizzle-orm/pg-core/primary-keys.js
-class PrimaryKeyBuilder {
- static [entityKind] = "PgPrimaryKeyBuilder";
- columns;
- name;
- constructor(columns, name) {
- this.columns = columns;
- this.name = name;
- }
- build(table) {
- return new PrimaryKey(table, this.columns, this.name);
- }
-}
-
-class PrimaryKey {
- constructor(table, columns, name) {
- this.table = table;
- this.columns = columns;
- this.name = name;
- }
- static [entityKind] = "PgPrimaryKey";
- columns;
- name;
- getName() {
- return this.name ?? `${this.table[PgTable.Symbol.Name]}_${this.columns.map((column) => column.name).join("_")}_pk`;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sql/expressions/conditions.js
-function bindIfParam(value, column) {
- if (isDriverValueEncoder(column) && !isSQLWrapper(value) && !is(value, Param) && !is(value, Placeholder) && !is(value, Column) && !is(value, Table) && !is(value, View)) {
- return new Param(value, column);
- }
- return value;
-}
-var eq = (left, right) => {
- return sql`${left} = ${bindIfParam(right, left)}`;
-};
-var ne = (left, right) => {
- return sql`${left} <> ${bindIfParam(right, left)}`;
-};
-function and(...unfilteredConditions) {
- const conditions = unfilteredConditions.filter((c) => c !== undefined);
- if (conditions.length === 0) {
- return;
- }
- if (conditions.length === 1) {
- return new SQL(conditions);
- }
- return new SQL([
- new StringChunk("("),
- sql.join(conditions, new StringChunk(" and ")),
- new StringChunk(")")
- ]);
-}
-function or(...unfilteredConditions) {
- const conditions = unfilteredConditions.filter((c) => c !== undefined);
- if (conditions.length === 0) {
- return;
- }
- if (conditions.length === 1) {
- return new SQL(conditions);
- }
- return new SQL([
- new StringChunk("("),
- sql.join(conditions, new StringChunk(" or ")),
- new StringChunk(")")
- ]);
-}
-function not(condition) {
- return sql`not ${condition}`;
-}
-var gt = (left, right) => {
- return sql`${left} > ${bindIfParam(right, left)}`;
-};
-var gte = (left, right) => {
- return sql`${left} >= ${bindIfParam(right, left)}`;
-};
-var lt = (left, right) => {
- return sql`${left} < ${bindIfParam(right, left)}`;
-};
-var lte = (left, right) => {
- return sql`${left} <= ${bindIfParam(right, left)}`;
-};
-function inArray(column, values) {
- if (Array.isArray(values)) {
- if (values.length === 0) {
- return sql`false`;
- }
- return sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;
- }
- return sql`${column} in ${bindIfParam(values, column)}`;
-}
-function notInArray(column, values) {
- if (Array.isArray(values)) {
- if (values.length === 0) {
- return sql`true`;
- }
- return sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;
- }
- return sql`${column} not in ${bindIfParam(values, column)}`;
-}
-function isNull(value) {
- return sql`${value} is null`;
-}
-function isNotNull(value) {
- return sql`${value} is not null`;
-}
-function exists(subquery) {
- return sql`exists ${subquery}`;
-}
-function notExists(subquery) {
- return sql`not exists ${subquery}`;
-}
-function between(column, min, max) {
- return sql`${column} between ${bindIfParam(min, column)} and ${bindIfParam(max, column)}`;
-}
-function notBetween(column, min, max) {
- return sql`${column} not between ${bindIfParam(min, column)} and ${bindIfParam(max, column)}`;
-}
-function like(column, value) {
- return sql`${column} like ${value}`;
-}
-function notLike(column, value) {
- return sql`${column} not like ${value}`;
-}
-function ilike(column, value) {
- return sql`${column} ilike ${value}`;
-}
-function notIlike(column, value) {
- return sql`${column} not ilike ${value}`;
-}
-
-// ../eve/node_modules/drizzle-orm/sql/expressions/select.js
-function asc(column) {
- return sql`${column} asc`;
-}
-function desc(column) {
- return sql`${column} desc`;
-}
-
-// ../eve/node_modules/drizzle-orm/relations.js
-class Relation {
- constructor(sourceTable, referencedTable, relationName) {
- this.sourceTable = sourceTable;
- this.referencedTable = referencedTable;
- this.relationName = relationName;
- this.referencedTableName = referencedTable[Table.Symbol.Name];
- }
- static [entityKind] = "Relation";
- referencedTableName;
- fieldName;
-}
-
-class Relations {
- constructor(table, config) {
- this.table = table;
- this.config = config;
- }
- static [entityKind] = "Relations";
-}
-
-class One extends Relation {
- constructor(sourceTable, referencedTable, config, isNullable) {
- super(sourceTable, referencedTable, config?.relationName);
- this.config = config;
- this.isNullable = isNullable;
- }
- static [entityKind] = "One";
- withFieldName(fieldName) {
- const relation = new One(this.sourceTable, this.referencedTable, this.config, this.isNullable);
- relation.fieldName = fieldName;
- return relation;
- }
-}
-
-class Many extends Relation {
- constructor(sourceTable, referencedTable, config) {
- super(sourceTable, referencedTable, config?.relationName);
- this.config = config;
- }
- static [entityKind] = "Many";
- withFieldName(fieldName) {
- const relation = new Many(this.sourceTable, this.referencedTable, this.config);
- relation.fieldName = fieldName;
- return relation;
- }
-}
-function getOperators() {
- return {
- and,
- between,
- eq,
- exists,
- gt,
- gte,
- ilike,
- inArray,
- isNull,
- isNotNull,
- like,
- lt,
- lte,
- ne,
- not,
- notBetween,
- notExists,
- notLike,
- notIlike,
- notInArray,
- or,
- sql
- };
-}
-function getOrderByOperators() {
- return {
- sql,
- asc,
- desc
- };
-}
-function extractTablesRelationalConfig(schema, configHelpers) {
- if (Object.keys(schema).length === 1 && "default" in schema && !is(schema["default"], Table)) {
- schema = schema["default"];
- }
- const tableNamesMap = {};
- const relationsBuffer = {};
- const tablesConfig = {};
- for (const [key, value] of Object.entries(schema)) {
- if (is(value, Table)) {
- const dbName = getTableUniqueName(value);
- const bufferedRelations = relationsBuffer[dbName];
- tableNamesMap[dbName] = key;
- tablesConfig[key] = {
- tsName: key,
- dbName: value[Table.Symbol.Name],
- schema: value[Table.Symbol.Schema],
- columns: value[Table.Symbol.Columns],
- relations: bufferedRelations?.relations ?? {},
- primaryKey: bufferedRelations?.primaryKey ?? []
- };
- for (const column of Object.values(value[Table.Symbol.Columns])) {
- if (column.primary) {
- tablesConfig[key].primaryKey.push(column);
- }
- }
- const extraConfig = value[Table.Symbol.ExtraConfigBuilder]?.(value[Table.Symbol.ExtraConfigColumns]);
- if (extraConfig) {
- for (const configEntry of Object.values(extraConfig)) {
- if (is(configEntry, PrimaryKeyBuilder)) {
- tablesConfig[key].primaryKey.push(...configEntry.columns);
- }
- }
- }
- } else if (is(value, Relations)) {
- const dbName = getTableUniqueName(value.table);
- const tableName = tableNamesMap[dbName];
- const relations2 = value.config(configHelpers(value.table));
- let primaryKey;
- for (const [relationName, relation] of Object.entries(relations2)) {
- if (tableName) {
- const tableConfig = tablesConfig[tableName];
- tableConfig.relations[relationName] = relation;
- if (primaryKey) {
- tableConfig.primaryKey.push(...primaryKey);
- }
- } else {
- if (!(dbName in relationsBuffer)) {
- relationsBuffer[dbName] = {
- relations: {},
- primaryKey
- };
- }
- relationsBuffer[dbName].relations[relationName] = relation;
- }
- }
- }
- }
- return { tables: tablesConfig, tableNamesMap };
-}
-function relations(table, relations2) {
- return new Relations(table, (helpers) => Object.fromEntries(Object.entries(relations2(helpers)).map(([key, value]) => [
- key,
- value.withFieldName(key)
- ])));
-}
-function createOne(sourceTable) {
- return function one(table, config) {
- return new One(sourceTable, table, config, config?.fields.reduce((res, f) => res && f.notNull, true) ?? false);
- };
-}
-function createMany(sourceTable) {
- return function many(referencedTable, config) {
- return new Many(sourceTable, referencedTable, config);
- };
-}
-function normalizeRelation(schema, tableNamesMap, relation) {
- if (is(relation, One) && relation.config) {
- return {
- fields: relation.config.fields,
- references: relation.config.references
- };
- }
- const referencedTableTsName = tableNamesMap[getTableUniqueName(relation.referencedTable)];
- if (!referencedTableTsName) {
- throw new Error(`Table "${relation.referencedTable[Table.Symbol.Name]}" not found in schema`);
- }
- const referencedTableConfig = schema[referencedTableTsName];
- if (!referencedTableConfig) {
- throw new Error(`Table "${referencedTableTsName}" not found in schema`);
- }
- const sourceTable = relation.sourceTable;
- const sourceTableTsName = tableNamesMap[getTableUniqueName(sourceTable)];
- if (!sourceTableTsName) {
- throw new Error(`Table "${sourceTable[Table.Symbol.Name]}" not found in schema`);
- }
- const reverseRelations = [];
- for (const referencedTableRelation of Object.values(referencedTableConfig.relations)) {
- if (relation.relationName && relation !== referencedTableRelation && referencedTableRelation.relationName === relation.relationName || !relation.relationName && referencedTableRelation.referencedTable === relation.sourceTable) {
- reverseRelations.push(referencedTableRelation);
- }
- }
- if (reverseRelations.length > 1) {
- throw relation.relationName ? new Error(`There are multiple relations with name "${relation.relationName}" in table "${referencedTableTsName}"`) : new Error(`There are multiple relations between "${referencedTableTsName}" and "${relation.sourceTable[Table.Symbol.Name]}". Please specify relation name`);
- }
- if (reverseRelations[0] && is(reverseRelations[0], One) && reverseRelations[0].config) {
- return {
- fields: reverseRelations[0].config.references,
- references: reverseRelations[0].config.fields
- };
- }
- throw new Error(`There is not enough information to infer relation "${sourceTableTsName}.${relation.fieldName}"`);
-}
-function createTableRelationsHelpers(sourceTable) {
- return {
- one: createOne(sourceTable),
- many: createMany(sourceTable)
- };
-}
-function mapRelationalRow(tablesConfig, tableConfig, row, buildQueryResultSelection, mapColumnValue = (value) => value) {
- const result = {};
- for (const [
- selectionItemIndex,
- selectionItem
- ] of buildQueryResultSelection.entries()) {
- if (selectionItem.isJson) {
- const relation = tableConfig.relations[selectionItem.tsKey];
- const rawSubRows = row[selectionItemIndex];
- const subRows = typeof rawSubRows === "string" ? JSON.parse(rawSubRows) : rawSubRows;
- result[selectionItem.tsKey] = is(relation, One) ? subRows && mapRelationalRow(tablesConfig, tablesConfig[selectionItem.relationTableTsKey], subRows, selectionItem.selection, mapColumnValue) : subRows.map((subRow) => mapRelationalRow(tablesConfig, tablesConfig[selectionItem.relationTableTsKey], subRow, selectionItem.selection, mapColumnValue));
- } else {
- const value = mapColumnValue(row[selectionItemIndex]);
- const field = selectionItem.field;
- let decoder;
- if (is(field, Column)) {
- decoder = field;
- } else if (is(field, SQL)) {
- decoder = field.decoder;
- } else {
- decoder = field.sql.decoder;
- }
- result[selectionItem.tsKey] = value === null ? null : decoder.mapFromDriverValue(value);
- }
- }
- return result;
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/view-base.js
-class SQLiteViewBase extends View {
- static [entityKind] = "SQLiteViewBase";
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/dialect.js
-class SQLiteDialect {
- static [entityKind] = "SQLiteDialect";
- casing;
- constructor(config) {
- this.casing = new CasingCache(config?.casing);
- }
- escapeName(name) {
- return `"${name}"`;
- }
- escapeParam(_num) {
- return "?";
- }
- escapeString(str) {
- return `'${str.replace(/'/g, "''")}'`;
- }
- buildWithCTE(queries) {
- if (!queries?.length)
- return;
- const withSqlChunks = [sql`with `];
- for (const [i, w] of queries.entries()) {
- withSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);
- if (i < queries.length - 1) {
- withSqlChunks.push(sql`, `);
- }
- }
- withSqlChunks.push(sql` `);
- return sql.join(withSqlChunks);
- }
- buildDeleteQuery({ table, where, returning, withList, limit, orderBy }) {
- const withSql = this.buildWithCTE(withList);
- const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
- const whereSql = where ? sql` where ${where}` : undefined;
- const orderBySql = this.buildOrderBy(orderBy);
- const limitSql = this.buildLimit(limit);
- return sql`${withSql}delete from ${table}${whereSql}${returningSql}${orderBySql}${limitSql}`;
- }
- buildUpdateSet(table, set) {
- const tableColumns = table[Table.Symbol.Columns];
- const columnNames = Object.keys(tableColumns).filter((colName) => set[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined);
- const setSize = columnNames.length;
- return sql.join(columnNames.flatMap((colName, i) => {
- const col = tableColumns[colName];
- const value = set[colName] ?? sql.param(col.onUpdateFn(), col);
- const res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;
- if (i < setSize - 1) {
- return [res, sql.raw(", ")];
- }
- return [res];
- }));
- }
- buildUpdateQuery({ table, set, where, returning, withList, joins, from, limit, orderBy }) {
- const withSql = this.buildWithCTE(withList);
- const setSql = this.buildUpdateSet(table, set);
- const fromSql = from && sql.join([sql.raw(" from "), this.buildFromTable(from)]);
- const joinsSql = this.buildJoins(joins);
- const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
- const whereSql = where ? sql` where ${where}` : undefined;
- const orderBySql = this.buildOrderBy(orderBy);
- const limitSql = this.buildLimit(limit);
- return sql`${withSql}update ${table} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}${orderBySql}${limitSql}`;
- }
- buildSelection(fields, { isSingleTable = false } = {}) {
- const columnsLen = fields.length;
- const chunks = fields.flatMap(({ field }, i) => {
- const chunk = [];
- if (is(field, SQL.Aliased) && field.isSelectionField) {
- chunk.push(sql.identifier(field.fieldAlias));
- } else if (is(field, SQL.Aliased) || is(field, SQL)) {
- const query = is(field, SQL.Aliased) ? field.sql : field;
- if (isSingleTable) {
- chunk.push(new SQL(query.queryChunks.map((c) => {
- if (is(c, Column)) {
- return sql.identifier(this.casing.getColumnCasing(c));
- }
- return c;
- })));
- } else {
- chunk.push(query);
- }
- if (is(field, SQL.Aliased)) {
- chunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);
- }
- } else if (is(field, Column)) {
- const tableName = field.table[Table.Symbol.Name];
- if (field.columnType === "SQLiteNumericBigInt") {
- if (isSingleTable) {
- chunk.push(sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`);
- } else {
- chunk.push(sql`cast(${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))} as text)`);
- }
- } else {
- if (isSingleTable) {
- chunk.push(sql.identifier(this.casing.getColumnCasing(field)));
- } else {
- chunk.push(sql`${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))}`);
- }
- }
- }
- if (i < columnsLen - 1) {
- chunk.push(sql`, `);
- }
- return chunk;
- });
- return sql.join(chunks);
- }
- buildJoins(joins) {
- if (!joins || joins.length === 0) {
- return;
- }
- const joinsArray = [];
- if (joins) {
- for (const [index2, joinMeta] of joins.entries()) {
- if (index2 === 0) {
- joinsArray.push(sql` `);
- }
- const table = joinMeta.table;
- const onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;
- if (is(table, SQLiteTable)) {
- const tableName = table[SQLiteTable.Symbol.Name];
- const tableSchema = table[SQLiteTable.Symbol.Schema];
- const origTableName = table[SQLiteTable.Symbol.OriginalName];
- const alias = tableName === origTableName ? undefined : joinMeta.alias;
- joinsArray.push(sql`${sql.raw(joinMeta.joinType)} join ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${sql.identifier(origTableName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`);
- } else {
- joinsArray.push(sql`${sql.raw(joinMeta.joinType)} join ${table}${onSql}`);
- }
- if (index2 < joins.length - 1) {
- joinsArray.push(sql` `);
- }
- }
- }
- return sql.join(joinsArray);
- }
- buildLimit(limit) {
- return typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : undefined;
- }
- buildOrderBy(orderBy) {
- const orderByList = [];
- if (orderBy) {
- for (const [index2, orderByValue] of orderBy.entries()) {
- orderByList.push(orderByValue);
- if (index2 < orderBy.length - 1) {
- orderByList.push(sql`, `);
- }
- }
- }
- return orderByList.length > 0 ? sql` order by ${sql.join(orderByList)}` : undefined;
- }
- buildFromTable(table) {
- if (is(table, Table) && table[Table.Symbol.IsAlias]) {
- return sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? "")}.`.if(table[Table.Symbol.Schema])}${sql.identifier(table[Table.Symbol.OriginalName])} ${sql.identifier(table[Table.Symbol.Name])}`;
- }
- return table;
- }
- buildSelectQuery({
- withList,
- fields,
- fieldsFlat,
- where,
- having,
- table,
- joins,
- orderBy,
- groupBy,
- limit,
- offset,
- distinct,
- setOperators
- }) {
- const fieldsList = fieldsFlat ?? orderSelectedFields(fields);
- for (const f of fieldsList) {
- if (is(f.field, Column) && getTableName(f.field.table) !== (is(table, Subquery) ? table._.alias : is(table, SQLiteViewBase) ? table[ViewBaseConfig].name : is(table, SQL) ? undefined : getTableName(table)) && !((table2) => joins?.some(({ alias }) => alias === (table2[Table.Symbol.IsAlias] ? getTableName(table2) : table2[Table.Symbol.BaseName])))(f.field.table)) {
- const tableName = getTableName(f.field.table);
- throw new Error(`Your "${f.path.join("->")}" field references a column "${tableName}"."${f.field.name}", but the table "${tableName}" is not part of the query! Did you forget to join it?`);
- }
- }
- const isSingleTable = !joins || joins.length === 0;
- const withSql = this.buildWithCTE(withList);
- const distinctSql = distinct ? sql` distinct` : undefined;
- const selection = this.buildSelection(fieldsList, { isSingleTable });
- const tableSql = this.buildFromTable(table);
- const joinsSql = this.buildJoins(joins);
- const whereSql = where ? sql` where ${where}` : undefined;
- const havingSql = having ? sql` having ${having}` : undefined;
- const groupByList = [];
- if (groupBy) {
- for (const [index2, groupByValue] of groupBy.entries()) {
- groupByList.push(groupByValue);
- if (index2 < groupBy.length - 1) {
- groupByList.push(sql`, `);
- }
- }
- }
- const groupBySql = groupByList.length > 0 ? sql` group by ${sql.join(groupByList)}` : undefined;
- const orderBySql = this.buildOrderBy(orderBy);
- const limitSql = this.buildLimit(limit);
- const offsetSql = offset ? sql` offset ${offset}` : undefined;
- const finalQuery = sql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}`;
- if (setOperators.length > 0) {
- return this.buildSetOperations(finalQuery, setOperators);
- }
- return finalQuery;
- }
- buildSetOperations(leftSelect, setOperators) {
- const [setOperator, ...rest] = setOperators;
- if (!setOperator) {
- throw new Error("Cannot pass undefined values to any set operator");
- }
- if (rest.length === 0) {
- return this.buildSetOperationQuery({ leftSelect, setOperator });
- }
- return this.buildSetOperations(this.buildSetOperationQuery({ leftSelect, setOperator }), rest);
- }
- buildSetOperationQuery({
- leftSelect,
- setOperator: { type, isAll, rightSelect, limit, orderBy, offset }
- }) {
- const leftChunk = sql`${leftSelect.getSQL()} `;
- const rightChunk = sql`${rightSelect.getSQL()}`;
- let orderBySql;
- if (orderBy && orderBy.length > 0) {
- const orderByValues = [];
- for (const singleOrderBy of orderBy) {
- if (is(singleOrderBy, SQLiteColumn)) {
- orderByValues.push(sql.identifier(singleOrderBy.name));
- } else if (is(singleOrderBy, SQL)) {
- for (let i = 0;i < singleOrderBy.queryChunks.length; i++) {
- const chunk = singleOrderBy.queryChunks[i];
- if (is(chunk, SQLiteColumn)) {
- singleOrderBy.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk));
- }
- }
- orderByValues.push(sql`${singleOrderBy}`);
- } else {
- orderByValues.push(sql`${singleOrderBy}`);
- }
- }
- orderBySql = sql` order by ${sql.join(orderByValues, sql`, `)}`;
- }
- const limitSql = typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : undefined;
- const operatorChunk = sql.raw(`${type} ${isAll ? "all " : ""}`);
- const offsetSql = offset ? sql` offset ${offset}` : undefined;
- return sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;
- }
- buildInsertQuery({ table, values: valuesOrSelect, onConflict, returning, withList, select }) {
- const valuesSqlList = [];
- const columns = table[Table.Symbol.Columns];
- const colEntries = Object.entries(columns).filter(([_, col]) => !col.shouldDisableInsert());
- const insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));
- if (select) {
- const select2 = valuesOrSelect;
- if (is(select2, SQL)) {
- valuesSqlList.push(select2);
- } else {
- valuesSqlList.push(select2.getSQL());
- }
- } else {
- const values = valuesOrSelect;
- valuesSqlList.push(sql.raw("values "));
- for (const [valueIndex, value] of values.entries()) {
- const valueList = [];
- for (const [fieldName, col] of colEntries) {
- const colValue = value[fieldName];
- if (colValue === undefined || is(colValue, Param) && colValue.value === undefined) {
- let defaultValue;
- if (col.default !== null && col.default !== undefined) {
- defaultValue = is(col.default, SQL) ? col.default : sql.param(col.default, col);
- } else if (col.defaultFn !== undefined) {
- const defaultFnResult = col.defaultFn();
- defaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);
- } else if (!col.default && col.onUpdateFn !== undefined) {
- const onUpdateFnResult = col.onUpdateFn();
- defaultValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);
- } else {
- defaultValue = sql`null`;
- }
- valueList.push(defaultValue);
- } else {
- valueList.push(colValue);
- }
- }
- valuesSqlList.push(valueList);
- if (valueIndex < values.length - 1) {
- valuesSqlList.push(sql`, `);
- }
- }
- }
- const withSql = this.buildWithCTE(withList);
- const valuesSql = sql.join(valuesSqlList);
- const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : undefined;
- const onConflictSql = onConflict?.length ? sql.join(onConflict) : undefined;
- return sql`${withSql}insert into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${returningSql}`;
- }
- sqlToQuery(sql2, invokeSource) {
- return sql2.toQuery({
- casing: this.casing,
- escapeName: this.escapeName,
- escapeParam: this.escapeParam,
- escapeString: this.escapeString,
- invokeSource
- });
- }
- buildRelationalQuery({
- fullSchema,
- schema,
- tableNamesMap,
- table,
- tableConfig,
- queryConfig: config,
- tableAlias,
- nestedQueryRelation,
- joinOn
- }) {
- let selection = [];
- let limit, offset, orderBy = [], where;
- const joins = [];
- if (config === true) {
- const selectionEntries = Object.entries(tableConfig.columns);
- selection = selectionEntries.map(([key, value]) => ({
- dbKey: value.name,
- tsKey: key,
- field: aliasedTableColumn(value, tableAlias),
- relationTableTsKey: undefined,
- isJson: false,
- selection: []
- }));
- } else {
- const aliasedColumns = Object.fromEntries(Object.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]));
- if (config.where) {
- const whereSql = typeof config.where === "function" ? config.where(aliasedColumns, getOperators()) : config.where;
- where = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);
- }
- const fieldsSelection = [];
- let selectedColumns = [];
- if (config.columns) {
- let isIncludeMode = false;
- for (const [field, value] of Object.entries(config.columns)) {
- if (value === undefined) {
- continue;
- }
- if (field in tableConfig.columns) {
- if (!isIncludeMode && value === true) {
- isIncludeMode = true;
- }
- selectedColumns.push(field);
- }
- }
- if (selectedColumns.length > 0) {
- selectedColumns = isIncludeMode ? selectedColumns.filter((c) => config.columns?.[c] === true) : Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));
- }
- } else {
- selectedColumns = Object.keys(tableConfig.columns);
- }
- for (const field of selectedColumns) {
- const column = tableConfig.columns[field];
- fieldsSelection.push({ tsKey: field, value: column });
- }
- let selectedRelations = [];
- if (config.with) {
- selectedRelations = Object.entries(config.with).filter((entry) => !!entry[1]).map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey] }));
- }
- let extras;
- if (config.extras) {
- extras = typeof config.extras === "function" ? config.extras(aliasedColumns, { sql }) : config.extras;
- for (const [tsKey, value] of Object.entries(extras)) {
- fieldsSelection.push({
- tsKey,
- value: mapColumnsInAliasedSQLToAlias(value, tableAlias)
- });
- }
- }
- for (const { tsKey, value } of fieldsSelection) {
- selection.push({
- dbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey].name,
- tsKey,
- field: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,
- relationTableTsKey: undefined,
- isJson: false,
- selection: []
- });
- }
- let orderByOrig = typeof config.orderBy === "function" ? config.orderBy(aliasedColumns, getOrderByOperators()) : config.orderBy ?? [];
- if (!Array.isArray(orderByOrig)) {
- orderByOrig = [orderByOrig];
- }
- orderBy = orderByOrig.map((orderByValue) => {
- if (is(orderByValue, Column)) {
- return aliasedTableColumn(orderByValue, tableAlias);
- }
- return mapColumnsInSQLToAlias(orderByValue, tableAlias);
- });
- limit = config.limit;
- offset = config.offset;
- for (const {
- tsKey: selectedRelationTsKey,
- queryConfig: selectedRelationConfigValue,
- relation
- } of selectedRelations) {
- const normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);
- const relationTableName = getTableUniqueName(relation.referencedTable);
- const relationTableTsName = tableNamesMap[relationTableName];
- const relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;
- const joinOn2 = and(...normalizedRelation.fields.map((field2, i) => eq(aliasedTableColumn(normalizedRelation.references[i], relationTableAlias), aliasedTableColumn(field2, tableAlias))));
- const builtRelation = this.buildRelationalQuery({
- fullSchema,
- schema,
- tableNamesMap,
- table: fullSchema[relationTableTsName],
- tableConfig: schema[relationTableTsName],
- queryConfig: is(relation, One) ? selectedRelationConfigValue === true ? { limit: 1 } : { ...selectedRelationConfigValue, limit: 1 } : selectedRelationConfigValue,
- tableAlias: relationTableAlias,
- joinOn: joinOn2,
- nestedQueryRelation: relation
- });
- const field = sql`(${builtRelation.sql})`.as(selectedRelationTsKey);
- selection.push({
- dbKey: selectedRelationTsKey,
- tsKey: selectedRelationTsKey,
- field,
- relationTableTsKey: relationTableTsName,
- isJson: true,
- selection: builtRelation.selection
- });
- }
- }
- if (selection.length === 0) {
- throw new DrizzleError({
- message: `No fields selected for table "${tableConfig.tsName}" ("${tableAlias}"). You need to have at least one item in "columns", "with" or "extras". If you need to select all columns, omit the "columns" key or set it to undefined.`
- });
- }
- let result;
- where = and(joinOn, where);
- if (nestedQueryRelation) {
- let field = sql`json_array(${sql.join(selection.map(({ field: field2 }) => is(field2, SQLiteColumn) ? sql.identifier(this.casing.getColumnCasing(field2)) : is(field2, SQL.Aliased) ? field2.sql : field2), sql`, `)})`;
- if (is(nestedQueryRelation, Many)) {
- field = sql`coalesce(json_group_array(${field}), json_array())`;
- }
- const nestedSelection = [{
- dbKey: "data",
- tsKey: "data",
- field: field.as("data"),
- isJson: true,
- relationTableTsKey: tableConfig.tsName,
- selection
- }];
- const needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;
- if (needsSubquery) {
- result = this.buildSelectQuery({
- table: aliasedTable(table, tableAlias),
- fields: {},
- fieldsFlat: [
- {
- path: [],
- field: sql.raw("*")
- }
- ],
- where,
- limit,
- offset,
- orderBy,
- setOperators: []
- });
- where = undefined;
- limit = undefined;
- offset = undefined;
- orderBy = undefined;
- } else {
- result = aliasedTable(table, tableAlias);
- }
- result = this.buildSelectQuery({
- table: is(result, SQLiteTable) ? result : new Subquery(result, {}, tableAlias),
- fields: {},
- fieldsFlat: nestedSelection.map(({ field: field2 }) => ({
- path: [],
- field: is(field2, Column) ? aliasedTableColumn(field2, tableAlias) : field2
- })),
- joins,
- where,
- limit,
- offset,
- orderBy,
- setOperators: []
- });
- } else {
- result = this.buildSelectQuery({
- table: aliasedTable(table, tableAlias),
- fields: {},
- fieldsFlat: selection.map(({ field }) => ({
- path: [],
- field: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field
- })),
- joins,
- where,
- limit,
- offset,
- orderBy,
- setOperators: []
- });
- }
- return {
- tableTsKey: tableConfig.tsName,
- sql: result,
- selection
- };
- }
-}
-
-class SQLiteSyncDialect extends SQLiteDialect {
- static [entityKind] = "SQLiteSyncDialect";
- migrate(migrations, session, config) {
- const migrationsTable = config === undefined ? "__drizzle_migrations" : typeof config === "string" ? "__drizzle_migrations" : config.migrationsTable ?? "__drizzle_migrations";
- const migrationTableCreate = sql`
- CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (
- id SERIAL PRIMARY KEY,
- hash text NOT NULL,
- created_at numeric
- )
- `;
- session.run(migrationTableCreate);
- const dbMigrations = session.values(sql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`);
- const lastDbMigration = dbMigrations[0] ?? undefined;
- session.run(sql`BEGIN`);
- try {
- for (const migration of migrations) {
- if (!lastDbMigration || Number(lastDbMigration[2]) < migration.folderMillis) {
- for (const stmt of migration.sql) {
- session.run(sql.raw(stmt));
- }
- session.run(sql`INSERT INTO ${sql.identifier(migrationsTable)} ("hash", "created_at") VALUES(${migration.hash}, ${migration.folderMillis})`);
- }
- }
- session.run(sql`COMMIT`);
- } catch (e) {
- session.run(sql`ROLLBACK`);
- throw e;
- }
- }
-}
-
-// ../eve/node_modules/drizzle-orm/query-builders/query-builder.js
-class TypedQueryBuilder {
- static [entityKind] = "TypedQueryBuilder";
- getSelectedFields() {
- return this._.selectedFields;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/select.js
-class SQLiteSelectBuilder {
- static [entityKind] = "SQLiteSelectBuilder";
- fields;
- session;
- dialect;
- withList;
- distinct;
- constructor(config) {
- this.fields = config.fields;
- this.session = config.session;
- this.dialect = config.dialect;
- this.withList = config.withList;
- this.distinct = config.distinct;
- }
- from(source) {
- const isPartialSelect = !!this.fields;
- let fields;
- if (this.fields) {
- fields = this.fields;
- } else if (is(source, Subquery)) {
- fields = Object.fromEntries(Object.keys(source._.selectedFields).map((key) => [key, source[key]]));
- } else if (is(source, SQLiteViewBase)) {
- fields = source[ViewBaseConfig].selectedFields;
- } else if (is(source, SQL)) {
- fields = {};
- } else {
- fields = getTableColumns(source);
- }
- return new SQLiteSelectBase({
- table: source,
- fields,
- isPartialSelect,
- session: this.session,
- dialect: this.dialect,
- withList: this.withList,
- distinct: this.distinct
- });
- }
-}
-
-class SQLiteSelectQueryBuilderBase extends TypedQueryBuilder {
- static [entityKind] = "SQLiteSelectQueryBuilder";
- _;
- config;
- joinsNotNullableMap;
- tableName;
- isPartialSelect;
- session;
- dialect;
- cacheConfig = undefined;
- usedTables = /* @__PURE__ */ new Set;
- constructor({ table, fields, isPartialSelect, session, dialect, withList, distinct }) {
- super();
- this.config = {
- withList,
- table,
- fields: { ...fields },
- distinct,
- setOperators: []
- };
- this.isPartialSelect = isPartialSelect;
- this.session = session;
- this.dialect = dialect;
- this._ = {
- selectedFields: fields,
- config: this.config
- };
- this.tableName = getTableLikeName(table);
- this.joinsNotNullableMap = typeof this.tableName === "string" ? { [this.tableName]: true } : {};
- for (const item of extractUsedTable(table))
- this.usedTables.add(item);
- }
- getUsedTables() {
- return [...this.usedTables];
- }
- createJoin(joinType) {
- return (table, on) => {
- const baseTableName = this.tableName;
- const tableName = getTableLikeName(table);
- for (const item of extractUsedTable(table))
- this.usedTables.add(item);
- if (typeof tableName === "string" && this.config.joins?.some((join) => join.alias === tableName)) {
- throw new Error(`Alias "${tableName}" is already used in this query`);
- }
- if (!this.isPartialSelect) {
- if (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === "string") {
- this.config.fields = {
- [baseTableName]: this.config.fields
- };
- }
- if (typeof tableName === "string" && !is(table, SQL)) {
- const selection = is(table, Subquery) ? table._.selectedFields : is(table, View) ? table[ViewBaseConfig].selectedFields : table[Table.Symbol.Columns];
- this.config.fields[tableName] = selection;
- }
- }
- if (typeof on === "function") {
- on = on(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- if (!this.config.joins) {
- this.config.joins = [];
- }
- this.config.joins.push({ on, table, joinType, alias: tableName });
- if (typeof tableName === "string") {
- switch (joinType) {
- case "left": {
- this.joinsNotNullableMap[tableName] = false;
- break;
- }
- case "right": {
- this.joinsNotNullableMap = Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([key]) => [key, false]));
- this.joinsNotNullableMap[tableName] = true;
- break;
- }
- case "cross":
- case "inner": {
- this.joinsNotNullableMap[tableName] = true;
- break;
- }
- case "full": {
- this.joinsNotNullableMap = Object.fromEntries(Object.entries(this.joinsNotNullableMap).map(([key]) => [key, false]));
- this.joinsNotNullableMap[tableName] = false;
- break;
- }
- }
- }
- return this;
- };
- }
- leftJoin = this.createJoin("left");
- rightJoin = this.createJoin("right");
- innerJoin = this.createJoin("inner");
- fullJoin = this.createJoin("full");
- crossJoin = this.createJoin("cross");
- createSetOperator(type, isAll) {
- return (rightSelection) => {
- const rightSelect = typeof rightSelection === "function" ? rightSelection(getSQLiteSetOperators()) : rightSelection;
- if (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) {
- throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");
- }
- this.config.setOperators.push({ type, isAll, rightSelect });
- return this;
- };
- }
- union = this.createSetOperator("union", false);
- unionAll = this.createSetOperator("union", true);
- intersect = this.createSetOperator("intersect", false);
- except = this.createSetOperator("except", false);
- addSetOperators(setOperators) {
- this.config.setOperators.push(...setOperators);
- return this;
- }
- where(where) {
- if (typeof where === "function") {
- where = where(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- this.config.where = where;
- return this;
- }
- having(having) {
- if (typeof having === "function") {
- having = having(new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- this.config.having = having;
- return this;
- }
- groupBy(...columns) {
- if (typeof columns[0] === "function") {
- const groupBy = columns[0](new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- this.config.groupBy = Array.isArray(groupBy) ? groupBy : [groupBy];
- } else {
- this.config.groupBy = columns;
- }
- return this;
- }
- orderBy(...columns) {
- if (typeof columns[0] === "function") {
- const orderBy = columns[0](new Proxy(this.config.fields, new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).orderBy = orderByArray;
- } else {
- this.config.orderBy = orderByArray;
- }
- } else {
- const orderByArray = columns;
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).orderBy = orderByArray;
- } else {
- this.config.orderBy = orderByArray;
- }
- }
- return this;
- }
- limit(limit) {
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).limit = limit;
- } else {
- this.config.limit = limit;
- }
- return this;
- }
- offset(offset) {
- if (this.config.setOperators.length > 0) {
- this.config.setOperators.at(-1).offset = offset;
- } else {
- this.config.offset = offset;
- }
- return this;
- }
- getSQL() {
- return this.dialect.buildSelectQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- as(alias) {
- const usedTables = [];
- usedTables.push(...extractUsedTable(this.config.table));
- if (this.config.joins) {
- for (const it of this.config.joins)
- usedTables.push(...extractUsedTable(it.table));
- }
- return new Proxy(new Subquery(this.getSQL(), this.config.fields, alias, false, [...new Set(usedTables)]), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- }
- getSelectedFields() {
- return new Proxy(this.config.fields, new SelectionProxyHandler({ alias: this.tableName, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- }
- $dynamic() {
- return this;
- }
-}
-
-class SQLiteSelectBase extends SQLiteSelectQueryBuilderBase {
- static [entityKind] = "SQLiteSelect";
- _prepare(isOneTimeQuery = true) {
- if (!this.session) {
- throw new Error("Cannot execute a query on a query builder. Please use a database instance instead.");
- }
- const fieldsList = orderSelectedFields(this.config.fields);
- const query = this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), fieldsList, "all", true, undefined, {
- type: "select",
- tables: [...this.usedTables]
- }, this.cacheConfig);
- query.joinsNotNullableMap = this.joinsNotNullableMap;
- return query;
- }
- $withCache(config) {
- this.cacheConfig = config === undefined ? { config: {}, enable: true, autoInvalidate: true } : config === false ? { enable: false } : { enable: true, autoInvalidate: true, ...config };
- return this;
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute() {
- return this.all();
- }
-}
-applyMixins(SQLiteSelectBase, [QueryPromise]);
-function createSetOperator(type, isAll) {
- return (leftSelect, rightSelect, ...restSelects) => {
- const setOperators = [rightSelect, ...restSelects].map((select) => ({
- type,
- isAll,
- rightSelect: select
- }));
- for (const setOperator of setOperators) {
- if (!haveSameKeys(leftSelect.getSelectedFields(), setOperator.rightSelect.getSelectedFields())) {
- throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order");
- }
- }
- return leftSelect.addSetOperators(setOperators);
- };
-}
-var getSQLiteSetOperators = () => ({
- union,
- unionAll,
- intersect,
- except
-});
-var union = createSetOperator("union", false);
-var unionAll = createSetOperator("union", true);
-var intersect = createSetOperator("intersect", false);
-var except = createSetOperator("except", false);
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.js
-class QueryBuilder {
- static [entityKind] = "SQLiteQueryBuilder";
- dialect;
- dialectConfig;
- constructor(dialect) {
- this.dialect = is(dialect, SQLiteDialect) ? dialect : undefined;
- this.dialectConfig = is(dialect, SQLiteDialect) ? undefined : dialect;
- }
- $with = (alias, selection) => {
- const queryBuilder = this;
- const as = (qb) => {
- if (typeof qb === "function") {
- qb = qb(queryBuilder);
- }
- return new Proxy(new WithSubquery(qb.getSQL(), selection ?? ("getSelectedFields" in qb ? qb.getSelectedFields() ?? {} : {}), alias, true), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- };
- return { as };
- };
- with(...queries) {
- const self2 = this;
- function select(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: undefined,
- dialect: self2.getDialect(),
- withList: queries
- });
- }
- function selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: undefined,
- dialect: self2.getDialect(),
- withList: queries,
- distinct: true
- });
- }
- return { select, selectDistinct };
- }
- select(fields) {
- return new SQLiteSelectBuilder({ fields: fields ?? undefined, session: undefined, dialect: this.getDialect() });
- }
- selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: undefined,
- dialect: this.getDialect(),
- distinct: true
- });
- }
- getDialect() {
- if (!this.dialect) {
- this.dialect = new SQLiteSyncDialect(this.dialectConfig);
- }
- return this.dialect;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/insert.js
-class SQLiteInsertBuilder {
- constructor(table, session, dialect, withList) {
- this.table = table;
- this.session = session;
- this.dialect = dialect;
- this.withList = withList;
- }
- static [entityKind] = "SQLiteInsertBuilder";
- values(values) {
- values = Array.isArray(values) ? values : [values];
- if (values.length === 0) {
- throw new Error("values() must be called with at least one value");
- }
- const mappedValues = values.map((entry) => {
- const result = {};
- const cols = this.table[Table.Symbol.Columns];
- for (const colKey of Object.keys(entry)) {
- const colValue = entry[colKey];
- result[colKey] = is(colValue, SQL) ? colValue : new Param(colValue, cols[colKey]);
- }
- return result;
- });
- return new SQLiteInsertBase(this.table, mappedValues, this.session, this.dialect, this.withList);
- }
- select(selectQuery) {
- const select = typeof selectQuery === "function" ? selectQuery(new QueryBuilder) : selectQuery;
- if (!is(select, SQL) && !haveSameKeys(this.table[Columns], select._.selectedFields)) {
- throw new Error("Insert select error: selected fields are not the same or are in a different order compared to the table definition");
- }
- return new SQLiteInsertBase(this.table, select, this.session, this.dialect, this.withList, true);
- }
-}
-
-class SQLiteInsertBase extends QueryPromise {
- constructor(table, values, session, dialect, withList, select) {
- super();
- this.session = session;
- this.dialect = dialect;
- this.config = { table, values, withList, select };
- }
- static [entityKind] = "SQLiteInsert";
- config;
- returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) {
- this.config.returning = orderSelectedFields(fields);
- return this;
- }
- onConflictDoNothing(config = {}) {
- if (!this.config.onConflict)
- this.config.onConflict = [];
- if (config.target === undefined) {
- this.config.onConflict.push(sql` on conflict do nothing`);
- } else {
- const targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;
- const whereSql = config.where ? sql` where ${config.where}` : sql``;
- this.config.onConflict.push(sql` on conflict ${targetSql} do nothing${whereSql}`);
- }
- return this;
- }
- onConflictDoUpdate(config) {
- if (config.where && (config.targetWhere || config.setWhere)) {
- throw new Error('You cannot use both "where" and "targetWhere"/"setWhere" at the same time - "where" is deprecated, use "targetWhere" or "setWhere" instead.');
- }
- if (!this.config.onConflict)
- this.config.onConflict = [];
- const whereSql = config.where ? sql` where ${config.where}` : undefined;
- const targetWhereSql = config.targetWhere ? sql` where ${config.targetWhere}` : undefined;
- const setWhereSql = config.setWhere ? sql` where ${config.setWhere}` : undefined;
- const targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;
- const setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));
- this.config.onConflict.push(sql` on conflict ${targetSql}${targetWhereSql} do update set ${setSql}${whereSql}${setWhereSql}`);
- return this;
- }
- getSQL() {
- return this.dialect.buildInsertQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- _prepare(isOneTimeQuery = true) {
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
- type: "insert",
- tables: extractUsedTable(this.config.table)
- });
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute() {
- return this.config.returning ? this.all() : this.run();
- }
- $dynamic() {
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/update.js
-class SQLiteUpdateBuilder {
- constructor(table, session, dialect, withList) {
- this.table = table;
- this.session = session;
- this.dialect = dialect;
- this.withList = withList;
- }
- static [entityKind] = "SQLiteUpdateBuilder";
- set(values) {
- return new SQLiteUpdateBase(this.table, mapUpdateSet(this.table, values), this.session, this.dialect, this.withList);
- }
-}
-
-class SQLiteUpdateBase extends QueryPromise {
- constructor(table, set, session, dialect, withList) {
- super();
- this.session = session;
- this.dialect = dialect;
- this.config = { set, table, withList, joins: [] };
- }
- static [entityKind] = "SQLiteUpdate";
- config;
- from(source) {
- this.config.from = source;
- return this;
- }
- createJoin(joinType) {
- return (table, on) => {
- const tableName = getTableLikeName(table);
- if (typeof tableName === "string" && this.config.joins.some((join) => join.alias === tableName)) {
- throw new Error(`Alias "${tableName}" is already used in this query`);
- }
- if (typeof on === "function") {
- const from = this.config.from ? is(table, SQLiteTable) ? table[Table.Symbol.Columns] : is(table, Subquery) ? table._.selectedFields : is(table, SQLiteViewBase) ? table[ViewBaseConfig].selectedFields : undefined : undefined;
- on = on(new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })), from && new Proxy(from, new SelectionProxyHandler({ sqlAliasedBehavior: "sql", sqlBehavior: "sql" })));
- }
- this.config.joins.push({ on, table, joinType, alias: tableName });
- return this;
- };
- }
- leftJoin = this.createJoin("left");
- rightJoin = this.createJoin("right");
- innerJoin = this.createJoin("inner");
- fullJoin = this.createJoin("full");
- where(where) {
- this.config.where = where;
- return this;
- }
- orderBy(...columns) {
- if (typeof columns[0] === "function") {
- const orderBy = columns[0](new Proxy(this.config.table[Table.Symbol.Columns], new SelectionProxyHandler({ sqlAliasedBehavior: "alias", sqlBehavior: "sql" })));
- const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
- this.config.orderBy = orderByArray;
- } else {
- const orderByArray = columns;
- this.config.orderBy = orderByArray;
- }
- return this;
- }
- limit(limit) {
- this.config.limit = limit;
- return this;
- }
- returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) {
- this.config.returning = orderSelectedFields(fields);
- return this;
- }
- getSQL() {
- return this.dialect.buildUpdateQuery(this.config);
- }
- toSQL() {
- const { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());
- return rest;
- }
- _prepare(isOneTimeQuery = true) {
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), this.config.returning, this.config.returning ? "all" : "run", true, undefined, {
- type: "insert",
- tables: extractUsedTable(this.config.table)
- });
- }
- prepare() {
- return this._prepare(false);
- }
- run = (placeholderValues) => {
- return this._prepare().run(placeholderValues);
- };
- all = (placeholderValues) => {
- return this._prepare().all(placeholderValues);
- };
- get = (placeholderValues) => {
- return this._prepare().get(placeholderValues);
- };
- values = (placeholderValues) => {
- return this._prepare().values(placeholderValues);
- };
- async execute() {
- return this.config.returning ? this.all() : this.run();
- }
- $dynamic() {
- return this;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/count.js
-class SQLiteCountBuilder extends SQL {
- constructor(params) {
- super(SQLiteCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);
- this.params = params;
- this.session = params.session;
- this.sql = SQLiteCountBuilder.buildCount(params.source, params.filters);
- }
- sql;
- static [entityKind] = "SQLiteCountBuilderAsync";
- [Symbol.toStringTag] = "SQLiteCountBuilderAsync";
- session;
- static buildEmbeddedCount(source, filters) {
- return sql`(select count(*) from ${source}${sql.raw(" where ").if(filters)}${filters})`;
- }
- static buildCount(source, filters) {
- return sql`select count(*) from ${source}${sql.raw(" where ").if(filters)}${filters}`;
- }
- then(onfulfilled, onrejected) {
- return Promise.resolve(this.session.count(this.sql)).then(onfulfilled, onrejected);
- }
- catch(onRejected) {
- return this.then(undefined, onRejected);
- }
- finally(onFinally) {
- return this.then((value) => {
- onFinally?.();
- return value;
- }, (reason) => {
- onFinally?.();
- throw reason;
- });
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/query.js
-class RelationalQueryBuilder {
- constructor(mode, fullSchema, schema, tableNamesMap, table, tableConfig, dialect, session) {
- this.mode = mode;
- this.fullSchema = fullSchema;
- this.schema = schema;
- this.tableNamesMap = tableNamesMap;
- this.table = table;
- this.tableConfig = tableConfig;
- this.dialect = dialect;
- this.session = session;
- }
- static [entityKind] = "SQLiteAsyncRelationalQueryBuilder";
- findMany(config) {
- return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? config : {}, "many") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? config : {}, "many");
- }
- findFirst(config) {
- return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? { ...config, limit: 1 } : { limit: 1 }, "first") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config ? { ...config, limit: 1 } : { limit: 1 }, "first");
- }
-}
-
-class SQLiteRelationalQuery extends QueryPromise {
- constructor(fullSchema, schema, tableNamesMap, table, tableConfig, dialect, session, config, mode) {
- super();
- this.fullSchema = fullSchema;
- this.schema = schema;
- this.tableNamesMap = tableNamesMap;
- this.table = table;
- this.tableConfig = tableConfig;
- this.dialect = dialect;
- this.session = session;
- this.config = config;
- this.mode = mode;
- }
- static [entityKind] = "SQLiteAsyncRelationalQuery";
- mode;
- getSQL() {
- return this.dialect.buildRelationalQuery({
- fullSchema: this.fullSchema,
- schema: this.schema,
- tableNamesMap: this.tableNamesMap,
- table: this.table,
- tableConfig: this.tableConfig,
- queryConfig: this.config,
- tableAlias: this.tableConfig.tsName
- }).sql;
- }
- _prepare(isOneTimeQuery = false) {
- const { query, builtQuery } = this._toSQL();
- return this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](builtQuery, undefined, this.mode === "first" ? "get" : "all", true, (rawRows, mapColumnValue) => {
- const rows = rawRows.map((row) => mapRelationalRow(this.schema, this.tableConfig, row, query.selection, mapColumnValue));
- if (this.mode === "first") {
- return rows[0];
- }
- return rows;
- });
- }
- prepare() {
- return this._prepare(false);
- }
- _toSQL() {
- const query = this.dialect.buildRelationalQuery({
- fullSchema: this.fullSchema,
- schema: this.schema,
- tableNamesMap: this.tableNamesMap,
- table: this.table,
- tableConfig: this.tableConfig,
- queryConfig: this.config,
- tableAlias: this.tableConfig.tsName
- });
- const builtQuery = this.dialect.sqlToQuery(query.sql);
- return { query, builtQuery };
- }
- toSQL() {
- return this._toSQL().builtQuery;
- }
- executeRaw() {
- if (this.mode === "first") {
- return this._prepare(false).get();
- }
- return this._prepare(false).all();
- }
- async execute() {
- return this.executeRaw();
- }
-}
-
-class SQLiteSyncRelationalQuery extends SQLiteRelationalQuery {
- static [entityKind] = "SQLiteSyncRelationalQuery";
- sync() {
- return this.executeRaw();
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/query-builders/raw.js
-class SQLiteRaw extends QueryPromise {
- constructor(execute, getSQL, action, dialect, mapBatchResult) {
- super();
- this.execute = execute;
- this.getSQL = getSQL;
- this.dialect = dialect;
- this.mapBatchResult = mapBatchResult;
- this.config = { action };
- }
- static [entityKind] = "SQLiteRaw";
- config;
- getQuery() {
- return { ...this.dialect.sqlToQuery(this.getSQL()), method: this.config.action };
- }
- mapResult(result, isFromBatch) {
- return isFromBatch ? this.mapBatchResult(result) : result;
- }
- _prepare() {
- return this;
- }
- isResponseInArrayMode() {
- return false;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/db.js
-class BaseSQLiteDatabase {
- constructor(resultKind, dialect, session, schema) {
- this.resultKind = resultKind;
- this.dialect = dialect;
- this.session = session;
- this._ = schema ? {
- schema: schema.schema,
- fullSchema: schema.fullSchema,
- tableNamesMap: schema.tableNamesMap
- } : {
- schema: undefined,
- fullSchema: {},
- tableNamesMap: {}
- };
- this.query = {};
- const query = this.query;
- if (this._.schema) {
- for (const [tableName, columns] of Object.entries(this._.schema)) {
- query[tableName] = new RelationalQueryBuilder(resultKind, schema.fullSchema, this._.schema, this._.tableNamesMap, schema.fullSchema[tableName], columns, dialect, session);
- }
- }
- this.$cache = { invalidate: async (_params) => {} };
- }
- static [entityKind] = "BaseSQLiteDatabase";
- query;
- $with = (alias, selection) => {
- const self2 = this;
- const as = (qb) => {
- if (typeof qb === "function") {
- qb = qb(new QueryBuilder(self2.dialect));
- }
- return new Proxy(new WithSubquery(qb.getSQL(), selection ?? ("getSelectedFields" in qb ? qb.getSelectedFields() ?? {} : {}), alias, true), new SelectionProxyHandler({ alias, sqlAliasedBehavior: "alias", sqlBehavior: "error" }));
- };
- return { as };
- };
- $count(source, filters) {
- return new SQLiteCountBuilder({ source, filters, session: this.session });
- }
- with(...queries) {
- const self2 = this;
- function select(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: self2.session,
- dialect: self2.dialect,
- withList: queries
- });
- }
- function selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: self2.session,
- dialect: self2.dialect,
- withList: queries,
- distinct: true
- });
- }
- function update(table) {
- return new SQLiteUpdateBuilder(table, self2.session, self2.dialect, queries);
- }
- function insert(into) {
- return new SQLiteInsertBuilder(into, self2.session, self2.dialect, queries);
- }
- function delete_(from) {
- return new SQLiteDeleteBase(from, self2.session, self2.dialect, queries);
- }
- return { select, selectDistinct, update, insert, delete: delete_ };
- }
- select(fields) {
- return new SQLiteSelectBuilder({ fields: fields ?? undefined, session: this.session, dialect: this.dialect });
- }
- selectDistinct(fields) {
- return new SQLiteSelectBuilder({
- fields: fields ?? undefined,
- session: this.session,
- dialect: this.dialect,
- distinct: true
- });
- }
- update(table) {
- return new SQLiteUpdateBuilder(table, this.session, this.dialect);
- }
- $cache;
- insert(into) {
- return new SQLiteInsertBuilder(into, this.session, this.dialect);
- }
- delete(from) {
- return new SQLiteDeleteBase(from, this.session, this.dialect);
- }
- run(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.run(sequel), () => sequel, "run", this.dialect, this.session.extractRawRunValueFromBatchResult.bind(this.session));
- }
- return this.session.run(sequel);
- }
- all(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.all(sequel), () => sequel, "all", this.dialect, this.session.extractRawAllValueFromBatchResult.bind(this.session));
- }
- return this.session.all(sequel);
- }
- get(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.get(sequel), () => sequel, "get", this.dialect, this.session.extractRawGetValueFromBatchResult.bind(this.session));
- }
- return this.session.get(sequel);
- }
- values(query) {
- const sequel = typeof query === "string" ? sql.raw(query) : query.getSQL();
- if (this.resultKind === "async") {
- return new SQLiteRaw(async () => this.session.values(sequel), () => sequel, "values", this.dialect, this.session.extractRawValuesValueFromBatchResult.bind(this.session));
- }
- return this.session.values(sequel);
- }
- transaction(transaction, config) {
- return this.session.transaction(transaction, config);
- }
-}
-
-// ../eve/node_modules/drizzle-orm/cache/core/cache.js
-class Cache {
- static [entityKind] = "Cache";
-}
-
-class NoopCache extends Cache {
- strategy() {
- return "all";
- }
- static [entityKind] = "NoopCache";
- async get(_key) {
- return;
- }
- async put(_hashedQuery, _response, _tables, _config) {}
- async onMutate(_params) {}
-}
-async function hashQuery(sql2, params) {
- const dataToHash = `${sql2}-${JSON.stringify(params)}`;
- const encoder = new TextEncoder;
- const data = encoder.encode(dataToHash);
- const hashBuffer = await crypto.subtle.digest("SHA-256", data);
- const hashArray = [...new Uint8Array(hashBuffer)];
- const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
- return hashHex;
-}
-
-// ../eve/node_modules/drizzle-orm/sqlite-core/session.js
-class ExecuteResultSync extends QueryPromise {
- constructor(resultCb) {
- super();
- this.resultCb = resultCb;
- }
- static [entityKind] = "ExecuteResultSync";
- async execute() {
- return this.resultCb();
- }
- sync() {
- return this.resultCb();
- }
-}
-
-class SQLitePreparedQuery {
- constructor(mode, executeMethod, query, cache, queryMetadata, cacheConfig) {
- this.mode = mode;
- this.executeMethod = executeMethod;
- this.query = query;
- this.cache = cache;
- this.queryMetadata = queryMetadata;
- this.cacheConfig = cacheConfig;
- if (cache && cache.strategy() === "all" && cacheConfig === undefined) {
- this.cacheConfig = { enable: true, autoInvalidate: true };
- }
- if (!this.cacheConfig?.enable) {
- this.cacheConfig = undefined;
- }
- }
- static [entityKind] = "PreparedQuery";
- joinsNotNullableMap;
- async queryWithCache(queryString, params, query) {
- if (this.cache === undefined || is(this.cache, NoopCache) || this.queryMetadata === undefined) {
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if (this.cacheConfig && !this.cacheConfig.enable) {
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if ((this.queryMetadata.type === "insert" || this.queryMetadata.type === "update" || this.queryMetadata.type === "delete") && this.queryMetadata.tables.length > 0) {
- try {
- const [res] = await Promise.all([
- query(),
- this.cache.onMutate({ tables: this.queryMetadata.tables })
- ]);
- return res;
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if (!this.cacheConfig) {
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- if (this.queryMetadata.type === "select") {
- const fromCache = await this.cache.get(this.cacheConfig.tag ?? await hashQuery(queryString, params), this.queryMetadata.tables, this.cacheConfig.tag !== undefined, this.cacheConfig.autoInvalidate);
- if (fromCache === undefined) {
- let result;
- try {
- result = await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- await this.cache.put(this.cacheConfig.tag ?? await hashQuery(queryString, params), result, this.cacheConfig.autoInvalidate ? this.queryMetadata.tables : [], this.cacheConfig.tag !== undefined, this.cacheConfig.config);
- return result;
- }
- return fromCache;
- }
- try {
- return await query();
- } catch (e) {
- throw new DrizzleQueryError(queryString, params, e);
- }
- }
- getQuery() {
- return this.query;
- }
- mapRunResult(result, _isFromBatch) {
- return result;
- }
- mapAllResult(_result, _isFromBatch) {
- throw new Error("Not implemented");
- }
- mapGetResult(_result, _isFromBatch) {
- throw new Error("Not implemented");
- }
- execute(placeholderValues) {
- if (this.mode === "async") {
- return this[this.executeMethod](placeholderValues);
- }
- return new ExecuteResultSync(() => this[this.executeMethod](placeholderValues));
- }
- mapResult(response, isFromBatch) {
- switch (this.executeMethod) {
- case "run": {
- return this.mapRunResult(response, isFromBatch);
- }
- case "all": {
- return this.mapAllResult(response, isFromBatch);
- }
- case "get": {
- return this.mapGetResult(response, isFromBatch);
- }
- }
- }
-}
-
-class SQLiteSession {
- constructor(dialect) {
- this.dialect = dialect;
- }
- static [entityKind] = "SQLiteSession";
- prepareOneTimeQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper, queryMetadata, cacheConfig) {
- return this.prepareQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper, queryMetadata, cacheConfig);
- }
- run(query) {
- const staticQuery = this.dialect.sqlToQuery(query);
- try {
- return this.prepareOneTimeQuery(staticQuery, undefined, "run", false).run();
- } catch (err) {
- throw new DrizzleError({ cause: err, message: `Failed to run the query '${staticQuery.sql}'` });
- }
- }
- extractRawRunValueFromBatchResult(result) {
- return result;
- }
- all(query) {
- return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).all();
- }
- extractRawAllValueFromBatchResult(_result) {
- throw new Error("Not implemented");
- }
- get(query) {
- return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).get();
- }
- extractRawGetValueFromBatchResult(_result) {
- throw new Error("Not implemented");
- }
- values(query) {
- return this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, "run", false).values();
- }
- async count(sql2) {
- const result = await this.values(sql2);
- return result[0][0];
- }
- extractRawValuesValueFromBatchResult(_result) {
- throw new Error("Not implemented");
- }
-}
-
-class SQLiteTransaction extends BaseSQLiteDatabase {
- constructor(resultType, dialect, session, schema, nestedIndex = 0) {
- super(resultType, dialect, session, schema);
- this.schema = schema;
- this.nestedIndex = nestedIndex;
- }
- static [entityKind] = "SQLiteTransaction";
- rollback() {
- throw new TransactionRollbackError;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/logger.js
-class ConsoleLogWriter {
- static [entityKind] = "ConsoleLogWriter";
- write(message) {
- console.log(message);
- }
-}
-
-class DefaultLogger {
- static [entityKind] = "DefaultLogger";
- writer;
- constructor(config) {
- this.writer = config?.writer ?? new ConsoleLogWriter;
- }
- logQuery(query, params) {
- const stringifiedParams = params.map((p) => {
- try {
- return JSON.stringify(p);
- } catch {
- return String(p);
- }
- });
- const paramsStr = stringifiedParams.length ? ` -- params: [${stringifiedParams.join(", ")}]` : "";
- this.writer.write(`Query: ${query}${paramsStr}`);
- }
-}
-
-class NoopLogger {
- static [entityKind] = "NoopLogger";
- logQuery() {}
-}
-
-// ../eve/dist/db/schema.js
-var schema_exports = {};
-__export(schema_exports, {
- characters: () => characters,
- charactersRelations: () => charactersRelations,
- miningFleetParticipants: () => miningFleetParticipants,
- miningFleetParticipantsRelations: () => miningFleetParticipantsRelations,
- miningFleets: () => miningFleets,
- miningFleetsRelations: () => miningFleetsRelations,
- resumeCommands: () => resumeCommands,
- shared: () => shared,
- users: () => users,
- usersRelations: () => usersRelations
-});
-var shared = {
- createdAt: integer("created_at").notNull(),
- updatedAt: integer("updated_at")
-};
-var users = sqliteTable("users", {
- id: integer().primaryKey().unique().notNull(),
- discordID: text("discord_id").unique().notNull(),
- mainCharacter: integer("main_character"),
- ...shared
-}, (table) => [index("idx_discord_id").on(table.discordID), index("idx_main_character").on(table.mainCharacter)]);
-var usersRelations = relations(users, ({ one, many }) => ({
- characters: many(characters),
- main: one(characters, {
- fields: [users.mainCharacter],
- references: [characters.id]
- })
-}));
-var characters = sqliteTable("characters", {
- id: integer("id").primaryKey({ autoIncrement: true }),
- eveID: integer("eve_id").notNull(),
- userID: integer("user_id").notNull(),
- name: text().notNull(),
- accessToken: text("access_token").notNull(),
- expiresAt: integer("expires_at").notNull(),
- refreshToken: text("refresh_token").notNull(),
- ...shared
-}, (table) => [index("idx_user_id").on(table.userID), index("idx_eve_id").on(table.eveID)]);
-var charactersRelations = relations(characters, ({ one }) => ({ user: one(users, {
- fields: [characters.userID],
- references: [users.id]
-}) }));
-var resumeCommands = sqliteTable("resumecommands", {
- id: text().primaryKey(),
- command: text().notNull(),
- params: text().notNull(),
- context: text().notNull(),
- ...shared
-});
-var miningFleets = sqliteTable("mining_fleets", {
- id: integer("id").primaryKey({ autoIncrement: true }),
- name: text("name").notNull(),
- description: text("description"),
- creatorDiscordId: text("creator_discord_id").notNull(),
- startTime: integer("start_time").notNull(),
- endTime: integer("end_time"),
- status: text("status", { enum: [
- "configuring",
- "active",
- "ended",
- "generating_report",
- "completed",
- "failed"
- ] }).notNull().default("configuring"),
- taxRate: real("tax_rate").notNull().default(0),
- publicMessageId: text("public_message_id").unique(),
- publicChannelId: text("public_channel_id"),
- reportData: text("report_data"),
- creatorEphemeralMessageId: text("creator_ephemeral_message_id"),
- ...shared
-}, (table) => [
- index("idx_fleet_creator_discord_id").on(table.creatorDiscordId),
- index("idx_fleet_status").on(table.status),
- index("idx_fleet_public_message_id").on(table.publicMessageId)
-]);
-var miningFleetParticipants = sqliteTable("mining_fleet_participants", {
- id: integer("id").primaryKey({ autoIncrement: true }),
- fleetId: integer("fleet_id").notNull().references(() => miningFleets.id, { onDelete: "cascade" }),
- characterId: integer("character_id").notNull().references(() => characters.id, { onDelete: "cascade" }),
- discordId: text("discord_id").notNull(),
- role: text("role", { enum: [
- "miner",
- "security",
- "hauler"
- ] }).notNull(),
- joinTime: integer("join_time").notNull(),
- ...shared
-}, (table) => [
- index("idx_participant_fleet_id").on(table.fleetId),
- index("idx_participant_character_id").on(table.characterId),
- index("idx_participant_discord_id").on(table.discordId)
-]);
-var miningFleetsRelations = relations(miningFleets, ({ many }) => ({ participants: many(miningFleetParticipants) }));
-var miningFleetParticipantsRelations = relations(miningFleetParticipants, ({ one }) => ({
- fleet: one(miningFleets, {
- fields: [miningFleetParticipants.fleetId],
- references: [miningFleets.id]
- }),
- character: one(characters, {
- fields: [miningFleetParticipants.characterId],
- references: [characters.id]
- })
-}));
-
-// ../eve/dist/esi/options.js
-var CLIENT_ID = process.env.EVE_CLIENT_ID || "";
-var CLIENT_SECRET = process.env.EVE_CLIENT_SECRET || "";
-var CALLBACK_URL = process.env.EVE_CALLBACK_URL || "";
-var USER_AGENT = process.env.ESI_USER_AGENT || "";
-var options = {
- client_id: CLIENT_ID,
- client_secret: CLIENT_SECRET,
- callback_url: CALLBACK_URL,
- user_agent: USER_AGENT
-};
-
-// ../eve/node_modules/jwt-decode/build/esm/index.js
-class InvalidTokenError extends Error {
-}
-InvalidTokenError.prototype.name = "InvalidTokenError";
-function b64DecodeUnicode(str) {
- return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {
- let code = p.charCodeAt(0).toString(16).toUpperCase();
- if (code.length < 2) {
- code = "0" + code;
- }
- return "%" + code;
- }));
-}
-function base64UrlDecode(str) {
- let output = str.replace(/-/g, "+").replace(/_/g, "/");
- switch (output.length % 4) {
- case 0:
- break;
- case 2:
- output += "==";
- break;
- case 3:
- output += "=";
- break;
- default:
- throw new Error("base64 string is not of the correct length");
- }
- try {
- return b64DecodeUnicode(output);
- } catch (err) {
- return atob(output);
- }
-}
-function jwtDecode(token, options2) {
- if (typeof token !== "string") {
- throw new InvalidTokenError("Invalid token specified: must be a string");
- }
- options2 || (options2 = {});
- const pos = options2.header === true ? 0 : 1;
- const part = token.split(".")[pos];
- if (typeof part !== "string") {
- throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);
- }
- let decoded;
- try {
- decoded = base64UrlDecode(part);
- } catch (e) {
- throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);
- }
- try {
- return JSON.parse(decoded);
- } catch (e) {
- throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);
- }
-}
-// ../eve/node_modules/@oslojs/encoding/dist/base32.js
-var EncodingPadding;
-(function(EncodingPadding2) {
- EncodingPadding2[EncodingPadding2["Include"] = 0] = "Include";
- EncodingPadding2[EncodingPadding2["None"] = 1] = "None";
-})(EncodingPadding || (EncodingPadding = {}));
-var DecodingPadding;
-(function(DecodingPadding2) {
- DecodingPadding2[DecodingPadding2["Required"] = 0] = "Required";
- DecodingPadding2[DecodingPadding2["Ignore"] = 1] = "Ignore";
-})(DecodingPadding || (DecodingPadding = {}));
-// ../eve/node_modules/@oslojs/encoding/dist/base64.js
-function encodeBase64urlNoPadding(bytes) {
- return encodeBase64_internal(bytes, base64urlAlphabet, EncodingPadding2.None);
-}
-function encodeBase64_internal(bytes, alphabet, padding) {
- let result = "";
- for (let i = 0;i < bytes.byteLength; i += 3) {
- let buffer = 0;
- let bufferBitSize = 0;
- for (let j = 0;j < 3 && i + j < bytes.byteLength; j++) {
- buffer = buffer << 8 | bytes[i + j];
- bufferBitSize += 8;
- }
- for (let j = 0;j < 4; j++) {
- if (bufferBitSize >= 6) {
- result += alphabet[buffer >> bufferBitSize - 6 & 63];
- bufferBitSize -= 6;
- } else if (bufferBitSize > 0) {
- result += alphabet[buffer << 6 - bufferBitSize & 63];
- bufferBitSize = 0;
- } else if (padding === EncodingPadding2.Include) {
- result += "=";
- }
- }
- }
- return result;
-}
-var base64urlAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
-var EncodingPadding2;
-(function(EncodingPadding3) {
- EncodingPadding3[EncodingPadding3["Include"] = 0] = "Include";
- EncodingPadding3[EncodingPadding3["None"] = 1] = "None";
-})(EncodingPadding2 || (EncodingPadding2 = {}));
-var DecodingPadding2;
-(function(DecodingPadding3) {
- DecodingPadding3[DecodingPadding3["Required"] = 0] = "Required";
- DecodingPadding3[DecodingPadding3["Ignore"] = 1] = "Ignore";
-})(DecodingPadding2 || (DecodingPadding2 = {}));
-// ../eve/dist/esi/auth.js
-var import_jsonwebtoken = __toESM(require_jsonwebtoken(), 1);
-var import_jwk_to_pem = __toESM(require_jwk_to_pem(), 1);
-var auth_exports = {};
-__export(auth_exports, {
- characterIdFromToken: () => characterIdFromToken,
- createAuthorizationURL: () => createAuthorizationURL,
- refresh: () => refresh,
- validateAuthorizationCode: () => validateAuthorizationCode,
- validateToken: () => validateToken
-});
-function generateState() {
- const randomValues = new Uint8Array(32);
- crypto.getRandomValues(randomValues);
- return encodeBase64urlNoPadding(randomValues);
-}
-async function createAuthorizationURL(scopes = "publicData") {
- const state = generateState();
- const url = new URL("https://login.eveonline.com/v2/oauth/authorize/");
- url.searchParams.set("response_type", "code");
- url.searchParams.set("redirect_uri", options.callback_url);
- url.searchParams.set("client_id", options.client_id);
- url.searchParams.set("state", state);
- url.searchParams.set("scope", Array.isArray(scopes) ? scopes.join(" ") : scopes);
- return {
- url,
- state
- };
-}
-async function validateAuthorizationCode(code) {
- try {
- const response = await fetch("https://login.eveonline.com/v2/oauth/token", {
- method: "POST",
- headers: {
- "Content-Type": "application/x-www-form-urlencoded",
- Authorization: `Basic ${Buffer.from(`${options.client_id}:${options.client_secret}`).toString("base64")}`
- },
- body: new URLSearchParams({
- grant_type: "authorization_code",
- code
- })
- });
- return await response.json();
- } catch (error) {
- console.error(`failed to validate EVE authorization code`, error);
- throw `${error}`;
- }
-}
-var eveAuthPublicKey;
-async function validateToken(token) {
- if (!eveAuthPublicKey)
- try {
- const eveJWKS = await (await fetch("https://login.eveonline.com/oauth/jwks")).json();
- eveAuthPublicKey = import_jwk_to_pem.default(eveJWKS.keys[0]);
- } catch (err) {
- console.error(`failed to get EVE Auth public keys`, err);
- }
- try {
- const decoded = import_jsonwebtoken.default.verify(token, eveAuthPublicKey);
- return decoded;
- } catch (err) {
- console.error(`failed to validate EVE token`, err);
- return null;
- }
-}
-async function refresh({ refresh_token }, scopes) {
- const params = {
- grant_type: "refresh_token",
- refresh_token,
- scope: ""
- };
- if (scopes)
- params["scope"] = Array.isArray(scopes) ? scopes.join(" ") : scopes;
- const response = await fetch("https://login.eveonline.com/v2/oauth/token", {
- method: "POST",
- headers: {
- "Content-Type": "application/x-www-form-urlencoded",
- Authorization: `Basic ${Buffer.from(`${options.client_id}:${options.client_secret}`).toString("base64")}`
- },
- body: new URLSearchParams(params)
- });
- return await response.json();
-}
-function characterIdFromToken(token) {
- const payload = jwtDecode(token);
- return parseInt(payload.sub.split(":")[2]);
-}
-
-// ../eve/dist/db/models/character.model.js
-var CharacterHelper = class CharacterHelper2 {
- static hasValidToken(character) {
- return /* @__PURE__ */ new Date < character.expiresAt;
- }
- static getScopes(character) {
- const decoded = jwtDecode(character.accessToken);
- return typeof decoded.scp === "string" ? [decoded.scp] : decoded.scp;
- }
- static hasOnlyPublicScope(character) {
- return this.getScopes(character).length === 1 && this.hasScope(character, "publicData");
- }
- static getTokens(character) {
- return {
- access_token: character.accessToken,
- refresh_token: character.refreshToken,
- expires_in: (character.expiresAt.getTime() - Date.now()) / 1000
- };
- }
- static hasScope(character, scope) {
- return this.getScopes(character).includes(scope);
- }
- static hasAllScopes(character, scopes) {
- const has = this.getScopes(character);
- return scopes.every((scope) => has.includes(scope));
- }
- static find(id) {
- const result = db.select().from(characters).where(eq(characters.id, id)).limit(1).get();
- const c = this.createCharacters(result);
- return c ? c[0] : undefined;
- }
- static findByUser(user) {
- const result = db.select().from(characters).where(eq(characters.userID, user.id)).all();
- return this.createCharacters(result);
- }
- static findByUserAndEveID(userID, eveID) {
- const result = db.select().from(characters).where(and(eq(characters.userID, userID), eq(characters.eveID, eveID))).limit(1).get();
- const c = this.createCharacters(result);
- return c ? c[0] : undefined;
- }
- static findByName(userID, name) {
- const result = db.select().from(characters).where(and(eq(characters.name, name), eq(characters.userID, userID))).limit(1).get();
- const c = this.createCharacters(result);
- return c ? c[0] : undefined;
- }
- static findAll() {
- const result = db.select().from(characters).all();
- return this.createCharacters(result);
- }
- static create(eveID, name, user, tokens) {
- return this.save({
- eveID,
- userID: user.id,
- accessToken: tokens.access_token,
- expiresAt: /* @__PURE__ */ new Date(tokens.expires_in * 1000),
- refreshToken: tokens.refresh_token,
- name,
- createdAt: /* @__PURE__ */ new Date
- });
- }
- static createCharacters(query) {
- if (!query)
- return [];
- if (Array.isArray(query))
- return query.map((character) => {
- return {
- id: character.id,
- eveID: character.eveID,
- userID: character.userID,
- accessToken: character.accessToken,
- expiresAt: new Date(character.expiresAt),
- refreshToken: character.refreshToken,
- name: character.name,
- createdAt: new Date(character.createdAt),
- updatedAt: new Date(character.updatedAt)
- };
- });
- else
- return [{
- id: query.id,
- eveID: query.eveID,
- userID: query.userID,
- accessToken: query.accessToken,
- expiresAt: new Date(query.expiresAt),
- refreshToken: query.refreshToken,
- name: query.name,
- createdAt: new Date(query.createdAt),
- updatedAt: new Date(query.updatedAt)
- }];
- }
- static save(character) {
- db.insert(characters).values({
- id: character.id,
- eveID: character.eveID,
- userID: character.userID,
- name: character.name,
- accessToken: character.accessToken,
- expiresAt: character.expiresAt.getTime(),
- refreshToken: character.refreshToken,
- createdAt: Date.now(),
- updatedAt: Date.now()
- }).onConflictDoUpdate({
- target: characters.id,
- set: {
- eveID: character.eveID,
- userID: character.userID,
- name: character.name,
- accessToken: character.accessToken,
- expiresAt: character.expiresAt.getTime(),
- refreshToken: character.refreshToken,
- updatedAt: Date.now()
- }
- }).run();
- return CharacterHelper2.findByUserAndEveID(character.userID, character.eveID);
- }
- static delete(character) {
- db.delete(characters).where(eq(characters.id, character.id)).run();
- }
- static async refreshTokens(character, scopes) {
- const tokens = await refresh({ refresh_token: character.refreshToken }, scopes);
- const decoded = await validateToken(tokens.access_token);
- if (!decoded) {
- console.error(`Failed to validate token for character ${character.eveID}`);
- return character;
- }
- character.accessToken = tokens.access_token;
- character.expiresAt = new Date(Date.now() + tokens.expires_in * 1000);
- character.refreshToken = tokens.refresh_token;
- this.save(character);
- return character;
- }
-};
-
-// ../eve/dist/db/models/user.model.js
-var UserHelper = class {
- static find(id) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).where(eq(users.id, id)).leftJoin(characters, eq(users.id, characters.userID)).get();
- return this.createFromQuery(result);
- }
- static findByDiscordId(id) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).where(eq(users.discordID, id)).leftJoin(characters, eq(users.id, characters.userID)).get();
- return this.createFromQuery(result);
- }
- static findAll() {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).leftJoin(characters, eq(users.id, characters.userID)).all();
- return this.createFromQuery(result);
- }
- static findByCharacterId(id) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).leftJoin(characters, eq(users.id, characters.userID)).where(eq(characters.id, id)).all();
- return this.createFromQuery(result);
- }
- static findByCharacterName(name) {
- const result = db.select({
- id: users.id,
- discordID: users.discordID,
- createdAt: users.createdAt,
- updatedAt: users.updatedAt,
- mainCharacterID: users.mainCharacter,
- characterIDsString: sql`json_group_array(characters.id)`
- }).from(users).leftJoin(characters, eq(users.id, characters.userID)).where(eq(characters.name, name)).all();
- return this.createFromQuery(result);
- }
- static createFromQuery(query) {
- if (!query)
- return [];
- if (Array.isArray(query))
- return query.map((user) => {
- return {
- id: user.id,
- discordID: user.discordID,
- createdAt: new Date(user.createdAt),
- updatedAt: new Date(user.updatedAt),
- characterIDs: user.characterIDsString ? JSON.parse(user.characterIDsString ?? "[]").map((s) => Number(s)).sort() : [],
- mainCharacterID: user.mainCharacterID
- };
- });
- else
- return {
- id: query.id,
- discordID: query.discordID,
- createdAt: new Date(query.createdAt),
- updatedAt: new Date(query.updatedAt),
- characterIDs: query.characterIDsString ? JSON.parse(query.characterIDsString ?? "[]").map((s) => Number(s)).sort() : [],
- mainCharacterID: query.mainCharacterID
- };
- }
- static create(discordID) {
- this.save({
- discordID,
- createdAt: /* @__PURE__ */ new Date,
- updatedAt: /* @__PURE__ */ new Date
- });
- return this.findByDiscordId(discordID);
- }
- static save(user) {
- db.insert(users).values({
- id: user.id,
- discordID: user.discordID,
- mainCharacter: user.mainCharacterID,
- createdAt: user.createdAt.getTime(),
- updatedAt: user.updatedAt.getTime()
- }).onConflictDoUpdate({
- target: users.id,
- set: {
- discordID: user.discordID,
- mainCharacter: user.mainCharacterID,
- updatedAt: user.updatedAt.getTime()
- }
- }).run();
- return user;
- }
- static delete(user) {
- db.delete(users).where(eq(users.id, user.id)).run();
- }
- static getCharacter(user, index2) {
- if (!user.characterIDs)
- return;
- if (index2 >= user.characterIDs.length)
- return;
- return CharacterHelper.find(user.characterIDs[index2]);
- }
-};
-
-// ../eve/dist/db/models/resume-command.model.js
-var ResumeCommand = class ResumeCommand2 {
- id;
- command;
- params;
- context;
- created = /* @__PURE__ */ new Date;
- constructor() {
- this.created = /* @__PURE__ */ new Date;
- }
- static find(messageId) {
- const result = db.select().from(resumeCommands).where(eq(resumeCommands.id, messageId)).get();
- return this.createFromQuery(result);
- }
- static create(messageId, command, params = {}, context = {}) {
- const resume = new ResumeCommand2;
- resume.id = messageId;
- resume.command = command;
- resume.params = JSON.stringify(params);
- resume.context = JSON.stringify(context);
- return resume;
- }
- static createFromQuery(query) {
- if (!query)
- return null;
- const resume = new ResumeCommand2;
- resume.id = query.id;
- resume.command = query.command;
- resume.params = query.params;
- resume.context = query.context;
- resume.created = query.created;
- return resume;
- }
- save() {
- db.insert(resumeCommands).values({
- id: this.id,
- command: this.command,
- params: this.params,
- context: this.context,
- createdAt: this.created.getTime()
- }).onConflictDoUpdate({
- target: resumeCommands.id,
- set: {
- command: this.command,
- params: this.params,
- context: this.context
- }
- }).run();
- return this;
- }
- delete() {
- db.delete(resumeCommands).where(eq(resumeCommands.id, this.id)).run();
- }
- static delete(messageId) {
- db.delete(resumeCommands).where(eq(resumeCommands.id, messageId)).run();
- }
-};
-
-// ../eve/dist/db/models/index.js
-var models_exports = {};
-__export(models_exports, {
- CharacterHelper: () => CharacterHelper,
- ResumeCommand: () => ResumeCommand,
- UserHelper: () => UserHelper
-});
-
-// ../eve/node_modules/drizzle-orm/bun-sqlite/driver.js
-import { Database } from "bun:sqlite";
-
-// ../eve/node_modules/drizzle-orm/bun-sqlite/session.js
-class SQLiteBunSession extends SQLiteSession {
- constructor(client, dialect, schema, options2 = {}) {
- super(dialect);
- this.client = client;
- this.schema = schema;
- this.logger = options2.logger ?? new NoopLogger;
- }
- static [entityKind] = "SQLiteBunSession";
- logger;
- exec(query) {
- this.client.exec(query);
- }
- prepareQuery(query, fields, executeMethod, isResponseInArrayMode, customResultMapper) {
- const stmt = this.client.prepare(query.sql);
- return new PreparedQuery(stmt, query, this.logger, fields, executeMethod, isResponseInArrayMode, customResultMapper);
- }
- transaction(transaction, config = {}) {
- const tx = new SQLiteBunTransaction("sync", this.dialect, this, this.schema);
- let result;
- const nativeTx = this.client.transaction(() => {
- result = transaction(tx);
- });
- nativeTx[config.behavior ?? "deferred"]();
- return result;
- }
-}
-
-class SQLiteBunTransaction extends SQLiteTransaction {
- static [entityKind] = "SQLiteBunTransaction";
- transaction(transaction) {
- const savepointName = `sp${this.nestedIndex}`;
- const tx = new SQLiteBunTransaction("sync", this.dialect, this.session, this.schema, this.nestedIndex + 1);
- this.session.run(sql.raw(`savepoint ${savepointName}`));
- try {
- const result = transaction(tx);
- this.session.run(sql.raw(`release savepoint ${savepointName}`));
- return result;
- } catch (err) {
- this.session.run(sql.raw(`rollback to savepoint ${savepointName}`));
- throw err;
- }
- }
-}
-
-class PreparedQuery extends SQLitePreparedQuery {
- constructor(stmt, query, logger, fields, executeMethod, _isResponseInArrayMode, customResultMapper) {
- super("sync", executeMethod, query);
- this.stmt = stmt;
- this.logger = logger;
- this.fields = fields;
- this._isResponseInArrayMode = _isResponseInArrayMode;
- this.customResultMapper = customResultMapper;
- }
- static [entityKind] = "SQLiteBunPreparedQuery";
- run(placeholderValues) {
- const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
- this.logger.logQuery(this.query.sql, params);
- return this.stmt.run(...params);
- }
- all(placeholderValues) {
- const { fields, query, logger, joinsNotNullableMap, stmt, customResultMapper } = this;
- if (!fields && !customResultMapper) {
- const params = fillPlaceholders(query.params, placeholderValues ?? {});
- logger.logQuery(query.sql, params);
- return stmt.all(...params);
- }
- const rows = this.values(placeholderValues);
- if (customResultMapper) {
- return customResultMapper(rows);
- }
- return rows.map((row) => mapResultRow(fields, row, joinsNotNullableMap));
- }
- get(placeholderValues) {
- const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
- this.logger.logQuery(this.query.sql, params);
- const row = this.stmt.values(...params)[0];
- if (!row) {
- return;
- }
- const { fields, joinsNotNullableMap, customResultMapper } = this;
- if (!fields && !customResultMapper) {
- return row;
- }
- if (customResultMapper) {
- return customResultMapper([row]);
- }
- return mapResultRow(fields, row, joinsNotNullableMap);
- }
- values(placeholderValues) {
- const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
- this.logger.logQuery(this.query.sql, params);
- return this.stmt.values(...params);
- }
- isResponseInArrayMode() {
- return this._isResponseInArrayMode;
- }
-}
-
-// ../eve/node_modules/drizzle-orm/bun-sqlite/driver.js
-class BunSQLiteDatabase extends BaseSQLiteDatabase {
- static [entityKind] = "BunSQLiteDatabase";
-}
-function construct(client, config = {}) {
- const dialect = new SQLiteSyncDialect({ casing: config.casing });
- let logger;
- if (config.logger === true) {
- logger = new DefaultLogger;
- } else if (config.logger !== false) {
- logger = config.logger;
- }
- let schema;
- if (config.schema) {
- const tablesConfig = extractTablesRelationalConfig(config.schema, createTableRelationsHelpers);
- schema = {
- fullSchema: config.schema,
- schema: tablesConfig.tables,
- tableNamesMap: tablesConfig.tableNamesMap
- };
- }
- const session = new SQLiteBunSession(client, dialect, schema, { logger });
- const db2 = new BunSQLiteDatabase("sync", dialect, session, schema);
- db2.$client = client;
- return db2;
-}
-function drizzle(...params) {
- if (params[0] === undefined || typeof params[0] === "string") {
- const instance = params[0] === undefined ? new Database : new Database(params[0]);
- return construct(instance, params[1]);
- }
- if (isConfig(params[0])) {
- const { connection, client, ...drizzleConfig } = params[0];
- if (client)
- return construct(client, drizzleConfig);
- if (typeof connection === "object") {
- const { source, ...opts } = connection;
- const options2 = Object.values(opts).filter((v) => v !== undefined).length ? opts : undefined;
- const instance2 = new Database(source, options2);
- return construct(instance2, drizzleConfig);
- }
- const instance = new Database(connection);
- return construct(instance, drizzleConfig);
- }
- return construct(params[0], params[1]);
-}
-((drizzle2) => {
- function mock(config) {
- return construct({}, config);
- }
- drizzle2.mock = mock;
-})(drizzle || (drizzle = {}));
-
-// ../eve/dist/db/index.js
-import { Database as Database2 } from "bun:sqlite";
-import { join } from "path";
-var DB_PATH = process.env.AUTH_DB_PATH || join(process.cwd(), "../../db/kitten.db");
-console.log("Using DB_PATH:", DB_PATH);
-var sqlite = new Database2(DB_PATH);
-var db = drizzle(sqlite, { schema: {
- users,
- characters,
- resumeCommands,
- miningFleets,
- miningFleetParticipants
-} });
-
-// src/api/auth/discordID/[discordID]/removeScopes/characterID/[characterID]/scopes/[scopes].ts
-function GET({ route: { params } }) {
- const discordID = params["discordID"];
- const characterID = params["characterID"];
- const removeScopes = params["scopes"].split(",");
- const user = UserHelper.findByDiscordId(discordID);
- const character = CharacterHelper.findByUserAndEveID(user.id, Number(characterID));
- if (!character) {
- throw new Error(`Character ${characterID} not found`);
- }
- const currentScopes = CharacterHelper.getScopes(character);
- const set = new Set(currentScopes);
- removeScopes.forEach((scope) => set.delete(scope));
- CharacterHelper.refreshTokens(character, Array.from(set).join(" "));
- const response = new Response("", { status: 302 });
- response.headers.set("location", "/auth/success");
- setCookie(response, "discordID", params["discordID"], 60 * 10);
- setCookie(response, "discordID", characterID, 60 * 10);
- return response;
-}
-export {
- GET
-};
-
-//# debugId=0B6EFADE67DD93C564756E2164756E21
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2FmZS1idWZmZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3c1xcbGliXFxkYXRhLXN0cmVhbS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlY2RzYS1zaWctZm9ybWF0dGVyXFxzcmNcXHBhcmFtLWJ5dGVzLWZvci1hbGcuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWNkc2Etc2lnLWZvcm1hdHRlclxcc3JjXFxlY2RzYS1zaWctZm9ybWF0dGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGJ1ZmZlci1lcXVhbC1jb25zdGFudC10aW1lXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd2FcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3c1xcbGliXFx0b3N0cmluZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd3NcXGxpYlxcc2lnbi1zdHJlYW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandzXFxsaWJcXHZlcmlmeS1zdHJlYW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGRlY29kZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxcSnNvbldlYlRva2VuRXJyb3IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcanNvbndlYnRva2VuXFxsaWJcXE5vdEJlZm9yZUVycm9yLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxUb2tlbkV4cGlyZWRFcnJvci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxtc1xcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcanNvbndlYnRva2VuXFxsaWJcXHRpbWVzcGFuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcaW50ZXJuYWxcXGNvbnN0YW50cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxkZWJ1Zy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxyZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGludGVybmFsXFxwYXJzZS1vcHRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcaW50ZXJuYWxcXGlkZW50aWZpZXJzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcY2xhc3Nlc1xcc2VtdmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxwYXJzZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcdmFsaWQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGNsZWFuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxpbmMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGRpZmYuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXG1ham9yLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxtaW5vci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xccGF0Y2guanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHByZXJlbGVhc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGNvbXBhcmUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHJjb21wYXJlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb21wYXJlLWxvb3NlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb21wYXJlLWJ1aWxkLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxzb3J0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxyc29ydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcZ3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGx0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxlcS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcbmVxLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxndGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXGx0ZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGZ1bmN0aW9uc1xcY21wLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxcZnVuY3Rpb25zXFxjb2VyY2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxpbnRlcm5hbFxcbHJ1Y2FjaGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxjbGFzc2VzXFxyYW5nZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGNsYXNzZXNcXGNvbXBhcmF0b3IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxmdW5jdGlvbnNcXHNhdGlzZmllcy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcdG8tY29tcGFyYXRvcnMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXG1heC1zYXRpc2Z5aW5nLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxtaW4tc2F0aXNmeWluZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcbWluLXZlcnNpb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXHZhbGlkLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxvdXRzaWRlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXHNlbXZlclxccmFuZ2VzXFxndHIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXGx0ci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcaW50ZXJzZWN0cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXHJhbmdlc1xcc2ltcGxpZnkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcc2VtdmVyXFxyYW5nZXNcXHN1YnNldC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzZW12ZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxhc3ltbWV0cmljS2V5RGV0YWlsc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxccnNhUHNzS2V5RGV0YWlsc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGxpYlxcdmFsaWRhdGVBc3ltbWV0cmljS2V5LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcbGliXFxwc1N1cHBvcnRlZC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXHZlcmlmeS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxsb2Rhc2guaW5jbHVkZXNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc2Jvb2xlYW5cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc2ludGVnZXJcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc251bWJlclxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbG9kYXNoLmlzcGxhaW5vYmplY3RcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGxvZGFzaC5pc3N0cmluZ1xcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbG9kYXNoLm9uY2VcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGpzb253ZWJ0b2tlblxcc2lnbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqc29ud2VidG9rZW5cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGJuLmpzXFxsaWJcXGJuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGluaGVyaXRzXFxpbmhlcml0c19icm93c2VyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGluaGVyaXRzXFxpbmhlcml0cy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxzYWZlci1idWZmZXJcXHNhZmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYmFzZVxccmVwb3J0ZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxiYXNlXFxidWZmZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcbWluaW1hbGlzdGljLWFzc2VydFxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxiYXNlXFxub2RlLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcY29uc3RhbnRzXFxkZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxlbmNvZGVyc1xcZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcZW5jb2RlcnNcXHBlbS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxhc24xLmpzXFxsaWJcXGFzbjFcXGVuY29kZXJzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxhc24xLmpzXFxsaWJcXGFzbjFcXGRlY29kZXJzXFxkZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxkZWNvZGVyc1xccGVtLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcZGVjb2RlcnNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYXBpLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMVxcYmFzZVxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcYXNuMS5qc1xcbGliXFxhc24xXFxjb25zdGFudHNcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGFzbjEuanNcXGxpYlxcYXNuMS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzXFxsaWJcXHV0aWxzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxicm9yYW5kXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVcXGJhc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGN1cnZlXFxzaG9ydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVcXG1vbnQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGN1cnZlXFxlZHdhcmRzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljXFxjdXJ2ZVxcaW5kZXguanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXGNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXHNoYVxcY29tbW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwxLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwyNTYuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxzaGFcXDIyNC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxoYXNoLmpzXFxsaWJcXGhhc2hcXHNoYVxcNTEyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaFxcc2hhXFwzODQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxzaGEuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxyaXBlbWQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcaGFzaC5qc1xcbGliXFxoYXNoXFxobWFjLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhhc2guanNcXGxpYlxcaGFzaC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xccHJlY29tcHV0ZWRcXHNlY3AyNTZrMS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcY3VydmVzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGhtYWMtZHJiZ1xcbGliXFxobWFjLWRyYmcuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxrZXkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxzaWduYXR1cmUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZWxsaXB0aWNcXGxpYlxcZWxsaXB0aWNcXGVjXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXGtleS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXHNpZ25hdHVyZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxlbGxpcHRpY1xcbGliXFxlbGxpcHRpY1xcZWRkc2FcXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGVsbGlwdGljXFxsaWJcXGVsbGlwdGljLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYjY0LXRvLWJuLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYXNuMVxcYWxnb3JpdGhtLWlkZW50aWZpZXIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandrLXRvLXBlbVxcc3JjXFxhc24xXFxwdWJsaWMta2V5LWluZm8uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcandrLXRvLXBlbVxcc3JjXFxhc24xXFx2ZXJzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcYXNuMVxccHJpdmF0ZS1rZXktaW5mby5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxqd2stdG8tcGVtXFxzcmNcXGVjLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xccnNhLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3ay10by1wZW1cXHNyY1xcandrLXRvLXBlbS5qcyIsICIuLlxcc3JjXFx1dGlsc1xcY29va2llcy50cyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcX3ZpcnR1YWxcXHJvbGxkb3duX3J1bnRpbWUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGVudGl0eS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcY29sdW1uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxjb2x1bW4tYnVpbGRlci5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdGFibGUudXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHRyYWNpbmctdXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHBnLWNvcmVcXHVuaXF1ZS1jb25zdHJhaW50LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxwZy1jb3JlXFxjb2x1bW5zXFxjb21tb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHBnLWNvcmVcXGNvbHVtbnNcXGVudW0uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHN1YnF1ZXJ5LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx2ZXJzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx0cmFjaW5nLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFx2aWV3LWNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdGFibGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbFxcc3FsLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxhbGlhcy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcdXRpbHMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxmb3JlaWduLWtleXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx1bmlxdWUtY29uc3RyYWludC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXGNvbW1vbi5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXGJsb2IuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxjdXN0b20uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxpbnRlZ2VyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxcY29sdW1uc1xcbnVtZXJpYy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGNvbHVtbnNcXHJlYWwuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFx0ZXh0LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzZWxlY3Rpb24tcHJveHkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHF1ZXJ5LXByb21pc2UuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxjb2x1bW5zXFxhbGwuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx0YWJsZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGluZGV4ZXMuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFx1dGlscy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFxkZWxldGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGNhc2luZy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcZXJyb3JzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxwZy1jb3JlXFx0YWJsZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxccGctY29yZVxccHJpbWFyeS1rZXlzLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxcXGV4cHJlc3Npb25zXFxjb25kaXRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxcXGV4cHJlc3Npb25zXFxzZWxlY3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHJlbGF0aW9ucy5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHZpZXctYmFzZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXGRpYWxlY3QuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHF1ZXJ5LWJ1aWxkZXJzXFxxdWVyeS1idWlsZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxccXVlcnktYnVpbGRlcnNcXHNlbGVjdC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFxxdWVyeS1idWlsZGVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxccXVlcnktYnVpbGRlcnNcXGluc2VydC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHF1ZXJ5LWJ1aWxkZXJzXFx1cGRhdGUuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xcY291bnQuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xccXVlcnkuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXHNxbGl0ZS1jb3JlXFxxdWVyeS1idWlsZGVyc1xccmF3LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxzcWxpdGUtY29yZVxcZGIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGNhY2hlXFxjb3JlXFxjYWNoZS5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcc3FsaXRlLWNvcmVcXHNlc3Npb24uanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcZHJpenpsZS1vcm1cXGxvZ2dlci5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZGJcXHNjaGVtYS5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxvcHRpb25zLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGp3dC1kZWNvZGVcXGJ1aWxkXFxlc21cXGluZGV4LmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXEBvc2xvanNcXGVuY29kaW5nXFxkaXN0XFxiYXNlMzIuanMiLCAiLi5cXC4uXFxldmVcXG5vZGVfbW9kdWxlc1xcQG9zbG9qc1xcZW5jb2RpbmdcXGRpc3RcXGJhc2U2NC5qcyIsICIuLlxcLi5cXGV2ZVxcZGlzdFxcZXNpXFxhdXRoLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxkYlxcbW9kZWxzXFxjaGFyYWN0ZXIubW9kZWwuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGRiXFxtb2RlbHNcXHVzZXIubW9kZWwuanMiLCAiLi5cXC4uXFxldmVcXGRpc3RcXGRiXFxtb2RlbHNcXHJlc3VtZS1jb21tYW5kLm1vZGVsLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxkYlxcbW9kZWxzXFxpbmRleC5qcyIsICIuLlxcLi5cXGV2ZVxcbm9kZV9tb2R1bGVzXFxkcml6emxlLW9ybVxcYnVuLXNxbGl0ZVxcZHJpdmVyLmpzIiwgIi4uXFwuLlxcZXZlXFxub2RlX21vZHVsZXNcXGRyaXp6bGUtb3JtXFxidW4tc3FsaXRlXFxzZXNzaW9uLmpzIiwgIi4uXFwuLlxcZXZlXFxkaXN0XFxkYlxcaW5kZXguanMiLCAiLi5cXHNyY1xcYXBpXFxhdXRoXFxkaXNjb3JkSURcXFtkaXNjb3JkSURdXFxyZW1vdmVTY29wZXNcXGNoYXJhY3RlcklEXFxbY2hhcmFjdGVySURdXFxzY29wZXNcXFtzY29wZXNdLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qISBzYWZlLWJ1ZmZlci4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm9kZS9uby1kZXByZWNhdGVkLWFwaSAqL1xudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpXG52YXIgQnVmZmVyID0gYnVmZmVyLkJ1ZmZlclxuXG4vLyBhbHRlcm5hdGl2ZSB0byB1c2luZyBPYmplY3Qua2V5cyBmb3Igb2xkIGJyb3dzZXJzXG5mdW5jdGlvbiBjb3B5UHJvcHMgKHNyYywgZHN0KSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICBkc3Rba2V5XSA9IHNyY1trZXldXG4gIH1cbn1cbmlmIChCdWZmZXIuZnJvbSAmJiBCdWZmZXIuYWxsb2MgJiYgQnVmZmVyLmFsbG9jVW5zYWZlICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBidWZmZXJcbn0gZWxzZSB7XG4gIC8vIENvcHkgcHJvcGVydGllcyBmcm9tIHJlcXVpcmUoJ2J1ZmZlcicpXG4gIGNvcHlQcm9wcyhidWZmZXIsIGV4cG9ydHMpXG4gIGV4cG9ydHMuQnVmZmVyID0gU2FmZUJ1ZmZlclxufVxuXG5mdW5jdGlvbiBTYWZlQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQnVmZmVyLnByb3RvdHlwZSlcblxuLy8gQ29weSBzdGF0aWMgbWV0aG9kcyBmcm9tIEJ1ZmZlclxuY29weVByb3BzKEJ1ZmZlciwgU2FmZUJ1ZmZlcilcblxuU2FmZUJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGJ1Zi5maWxsKDApXG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoc2l6ZSlcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5TbG93QnVmZmVyKHNpemUpXG59XG4iLAogICAgIi8qZ2xvYmFsIG1vZHVsZSwgcHJvY2VzcyovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuZnVuY3Rpb24gRGF0YVN0cmVhbShkYXRhKSB7XG4gIHRoaXMuYnVmZmVyID0gbnVsbDtcbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIE5vIGlucHV0XG4gIGlmICghZGF0YSkge1xuICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gU3RyZWFtXG4gIGlmICh0eXBlb2YgZGF0YS5waXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgZGF0YS5waXBlKHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gQnVmZmVyIG9yIFN0cmluZ1xuICAvLyBvciBPYmplY3QgKGFzc3VtZWRseSBhIHBhc3N3b3JkZWQga2V5KVxuICBpZiAoZGF0YS5sZW5ndGggfHwgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgdGhpcy5idWZmZXIgPSBkYXRhO1xuICAgIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuZW1pdCgnZW5kJywgZGF0YSk7XG4gICAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLmVtaXQoJ2Nsb3NlJyk7XG4gICAgfS5iaW5kKHRoaXMpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ1VuZXhwZWN0ZWQgZGF0YSB0eXBlICgnKyB0eXBlb2YgZGF0YSArICcpJyk7XG59XG51dGlsLmluaGVyaXRzKERhdGFTdHJlYW0sIFN0cmVhbSk7XG5cbkRhdGFTdHJlYW0ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUoZGF0YSkge1xuICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuYnVmZmVyLCBCdWZmZXIuZnJvbShkYXRhKV0pO1xuICB0aGlzLmVtaXQoJ2RhdGEnLCBkYXRhKTtcbn07XG5cbkRhdGFTdHJlYW0ucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIGVuZChkYXRhKSB7XG4gIGlmIChkYXRhKVxuICAgIHRoaXMud3JpdGUoZGF0YSk7XG4gIHRoaXMuZW1pdCgnZW5kJywgZGF0YSk7XG4gIHRoaXMuZW1pdCgnY2xvc2UnKTtcbiAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFTdHJlYW07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gZ2V0UGFyYW1TaXplKGtleVNpemUpIHtcblx0dmFyIHJlc3VsdCA9ICgoa2V5U2l6ZSAvIDgpIHwgMCkgKyAoa2V5U2l6ZSAlIDggPT09IDAgPyAwIDogMSk7XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbnZhciBwYXJhbUJ5dGVzRm9yQWxnID0ge1xuXHRFUzI1NjogZ2V0UGFyYW1TaXplKDI1NiksXG5cdEVTMzg0OiBnZXRQYXJhbVNpemUoMzg0KSxcblx0RVM1MTI6IGdldFBhcmFtU2l6ZSg1MjEpXG59O1xuXG5mdW5jdGlvbiBnZXRQYXJhbUJ5dGVzRm9yQWxnKGFsZykge1xuXHR2YXIgcGFyYW1CeXRlcyA9IHBhcmFtQnl0ZXNGb3JBbGdbYWxnXTtcblx0aWYgKHBhcmFtQnl0ZXMpIHtcblx0XHRyZXR1cm4gcGFyYW1CeXRlcztcblx0fVxuXG5cdHRocm93IG5ldyBFcnJvcignVW5rbm93biBhbGdvcml0aG0gXCInICsgYWxnICsgJ1wiJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0UGFyYW1CeXRlc0ZvckFsZztcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG5cbnZhciBnZXRQYXJhbUJ5dGVzRm9yQWxnID0gcmVxdWlyZSgnLi9wYXJhbS1ieXRlcy1mb3ItYWxnJyk7XG5cbnZhciBNQVhfT0NURVQgPSAweDgwLFxuXHRDTEFTU19VTklWRVJTQUwgPSAwLFxuXHRQUklNSVRJVkVfQklUID0gMHgyMCxcblx0VEFHX1NFUSA9IDB4MTAsXG5cdFRBR19JTlQgPSAweDAyLFxuXHRFTkNPREVEX1RBR19TRVEgPSAoVEFHX1NFUSB8IFBSSU1JVElWRV9CSVQpIHwgKENMQVNTX1VOSVZFUlNBTCA8PCA2KSxcblx0RU5DT0RFRF9UQUdfSU5UID0gVEFHX0lOVCB8IChDTEFTU19VTklWRVJTQUwgPDwgNik7XG5cbmZ1bmN0aW9uIGJhc2U2NFVybChiYXNlNjQpIHtcblx0cmV0dXJuIGJhc2U2NFxuXHRcdC5yZXBsYWNlKC89L2csICcnKVxuXHRcdC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuXHRcdC5yZXBsYWNlKC9cXC8vZywgJ18nKTtcbn1cblxuZnVuY3Rpb24gc2lnbmF0dXJlQXNCdWZmZXIoc2lnbmF0dXJlKSB7XG5cdGlmIChCdWZmZXIuaXNCdWZmZXIoc2lnbmF0dXJlKSkge1xuXHRcdHJldHVybiBzaWduYXR1cmU7XG5cdH0gZWxzZSBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiBzaWduYXR1cmUpIHtcblx0XHRyZXR1cm4gQnVmZmVyLmZyb20oc2lnbmF0dXJlLCAnYmFzZTY0Jyk7XG5cdH1cblxuXHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFQ0RTQSBzaWduYXR1cmUgbXVzdCBiZSBhIEJhc2U2NCBzdHJpbmcgb3IgYSBCdWZmZXInKTtcbn1cblxuZnVuY3Rpb24gZGVyVG9Kb3NlKHNpZ25hdHVyZSwgYWxnKSB7XG5cdHNpZ25hdHVyZSA9IHNpZ25hdHVyZUFzQnVmZmVyKHNpZ25hdHVyZSk7XG5cdHZhciBwYXJhbUJ5dGVzID0gZ2V0UGFyYW1CeXRlc0ZvckFsZyhhbGcpO1xuXG5cdC8vIHRoZSBERVIgZW5jb2RlZCBwYXJhbSBzaG91bGQgYXQgbW9zdCBiZSB0aGUgcGFyYW0gc2l6ZSwgcGx1cyBhIHBhZGRpbmdcblx0Ly8gemVybywgc2luY2UgZHVlIHRvIGJlaW5nIGEgc2lnbmVkIGludGVnZXJcblx0dmFyIG1heEVuY29kZWRQYXJhbUxlbmd0aCA9IHBhcmFtQnl0ZXMgKyAxO1xuXG5cdHZhciBpbnB1dExlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7XG5cblx0dmFyIG9mZnNldCA9IDA7XG5cdGlmIChzaWduYXR1cmVbb2Zmc2V0KytdICE9PSBFTkNPREVEX1RBR19TRVEpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIFwic2VxXCInKTtcblx0fVxuXG5cdHZhciBzZXFMZW5ndGggPSBzaWduYXR1cmVbb2Zmc2V0KytdO1xuXHRpZiAoc2VxTGVuZ3RoID09PSAoTUFYX09DVEVUIHwgMSkpIHtcblx0XHRzZXFMZW5ndGggPSBzaWduYXR1cmVbb2Zmc2V0KytdO1xuXHR9XG5cblx0aWYgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0IDwgc2VxTGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdcInNlcVwiIHNwZWNpZmllZCBsZW5ndGggb2YgXCInICsgc2VxTGVuZ3RoICsgJ1wiLCBvbmx5IFwiJyArIChpbnB1dExlbmd0aCAtIG9mZnNldCkgKyAnXCIgcmVtYWluaW5nJyk7XG5cdH1cblxuXHRpZiAoc2lnbmF0dXJlW29mZnNldCsrXSAhPT0gRU5DT0RFRF9UQUdfSU5UKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBleHBlY3RlZCBcImludFwiIGZvciBcInJcIicpO1xuXHR9XG5cblx0dmFyIHJMZW5ndGggPSBzaWduYXR1cmVbb2Zmc2V0KytdO1xuXG5cdGlmIChpbnB1dExlbmd0aCAtIG9mZnNldCAtIDIgPCByTGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdcInJcIiBzcGVjaWZpZWQgbGVuZ3RoIG9mIFwiJyArIHJMZW5ndGggKyAnXCIsIG9ubHkgXCInICsgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0IC0gMikgKyAnXCIgYXZhaWxhYmxlJyk7XG5cdH1cblxuXHRpZiAobWF4RW5jb2RlZFBhcmFtTGVuZ3RoIDwgckxlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJyXCIgc3BlY2lmaWVkIGxlbmd0aCBvZiBcIicgKyByTGVuZ3RoICsgJ1wiLCBtYXggb2YgXCInICsgbWF4RW5jb2RlZFBhcmFtTGVuZ3RoICsgJ1wiIGlzIGFjY2VwdGFibGUnKTtcblx0fVxuXG5cdHZhciByT2Zmc2V0ID0gb2Zmc2V0O1xuXHRvZmZzZXQgKz0gckxlbmd0aDtcblxuXHRpZiAoc2lnbmF0dXJlW29mZnNldCsrXSAhPT0gRU5DT0RFRF9UQUdfSU5UKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBleHBlY3RlZCBcImludFwiIGZvciBcInNcIicpO1xuXHR9XG5cblx0dmFyIHNMZW5ndGggPSBzaWduYXR1cmVbb2Zmc2V0KytdO1xuXG5cdGlmIChpbnB1dExlbmd0aCAtIG9mZnNldCAhPT0gc0xlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJzXCIgc3BlY2lmaWVkIGxlbmd0aCBvZiBcIicgKyBzTGVuZ3RoICsgJ1wiLCBleHBlY3RlZCBcIicgKyAoaW5wdXRMZW5ndGggLSBvZmZzZXQpICsgJ1wiJyk7XG5cdH1cblxuXHRpZiAobWF4RW5jb2RlZFBhcmFtTGVuZ3RoIDwgc0xlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignXCJzXCIgc3BlY2lmaWVkIGxlbmd0aCBvZiBcIicgKyBzTGVuZ3RoICsgJ1wiLCBtYXggb2YgXCInICsgbWF4RW5jb2RlZFBhcmFtTGVuZ3RoICsgJ1wiIGlzIGFjY2VwdGFibGUnKTtcblx0fVxuXG5cdHZhciBzT2Zmc2V0ID0gb2Zmc2V0O1xuXHRvZmZzZXQgKz0gc0xlbmd0aDtcblxuXHRpZiAob2Zmc2V0ICE9PSBpbnB1dExlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gY29uc3VtZSBlbnRpcmUgYnVmZmVyLCBidXQgXCInICsgKGlucHV0TGVuZ3RoIC0gb2Zmc2V0KSArICdcIiBieXRlcyByZW1haW4nKTtcblx0fVxuXG5cdHZhciByUGFkZGluZyA9IHBhcmFtQnl0ZXMgLSByTGVuZ3RoLFxuXHRcdHNQYWRkaW5nID0gcGFyYW1CeXRlcyAtIHNMZW5ndGg7XG5cblx0dmFyIGRzdCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShyUGFkZGluZyArIHJMZW5ndGggKyBzUGFkZGluZyArIHNMZW5ndGgpO1xuXG5cdGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgclBhZGRpbmc7ICsrb2Zmc2V0KSB7XG5cdFx0ZHN0W29mZnNldF0gPSAwO1xuXHR9XG5cdHNpZ25hdHVyZS5jb3B5KGRzdCwgb2Zmc2V0LCByT2Zmc2V0ICsgTWF0aC5tYXgoLXJQYWRkaW5nLCAwKSwgck9mZnNldCArIHJMZW5ndGgpO1xuXG5cdG9mZnNldCA9IHBhcmFtQnl0ZXM7XG5cblx0Zm9yICh2YXIgbyA9IG9mZnNldDsgb2Zmc2V0IDwgbyArIHNQYWRkaW5nOyArK29mZnNldCkge1xuXHRcdGRzdFtvZmZzZXRdID0gMDtcblx0fVxuXHRzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgc09mZnNldCArIE1hdGgubWF4KC1zUGFkZGluZywgMCksIHNPZmZzZXQgKyBzTGVuZ3RoKTtcblxuXHRkc3QgPSBkc3QudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXHRkc3QgPSBiYXNlNjRVcmwoZHN0KTtcblxuXHRyZXR1cm4gZHN0O1xufVxuXG5mdW5jdGlvbiBjb3VudFBhZGRpbmcoYnVmLCBzdGFydCwgc3RvcCkge1xuXHR2YXIgcGFkZGluZyA9IDA7XG5cdHdoaWxlIChzdGFydCArIHBhZGRpbmcgPCBzdG9wICYmIGJ1ZltzdGFydCArIHBhZGRpbmddID09PSAwKSB7XG5cdFx0KytwYWRkaW5nO1xuXHR9XG5cblx0dmFyIG5lZWRzU2lnbiA9IGJ1ZltzdGFydCArIHBhZGRpbmddID49IE1BWF9PQ1RFVDtcblx0aWYgKG5lZWRzU2lnbikge1xuXHRcdC0tcGFkZGluZztcblx0fVxuXG5cdHJldHVybiBwYWRkaW5nO1xufVxuXG5mdW5jdGlvbiBqb3NlVG9EZXIoc2lnbmF0dXJlLCBhbGcpIHtcblx0c2lnbmF0dXJlID0gc2lnbmF0dXJlQXNCdWZmZXIoc2lnbmF0dXJlKTtcblx0dmFyIHBhcmFtQnl0ZXMgPSBnZXRQYXJhbUJ5dGVzRm9yQWxnKGFsZyk7XG5cblx0dmFyIHNpZ25hdHVyZUJ5dGVzID0gc2lnbmF0dXJlLmxlbmd0aDtcblx0aWYgKHNpZ25hdHVyZUJ5dGVzICE9PSBwYXJhbUJ5dGVzICogMikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiJyArIGFsZyArICdcIiBzaWduYXR1cmVzIG11c3QgYmUgXCInICsgcGFyYW1CeXRlcyAqIDIgKyAnXCIgYnl0ZXMsIHNhdyBcIicgKyBzaWduYXR1cmVCeXRlcyArICdcIicpO1xuXHR9XG5cblx0dmFyIHJQYWRkaW5nID0gY291bnRQYWRkaW5nKHNpZ25hdHVyZSwgMCwgcGFyYW1CeXRlcyk7XG5cdHZhciBzUGFkZGluZyA9IGNvdW50UGFkZGluZyhzaWduYXR1cmUsIHBhcmFtQnl0ZXMsIHNpZ25hdHVyZS5sZW5ndGgpO1xuXHR2YXIgckxlbmd0aCA9IHBhcmFtQnl0ZXMgLSByUGFkZGluZztcblx0dmFyIHNMZW5ndGggPSBwYXJhbUJ5dGVzIC0gc1BhZGRpbmc7XG5cblx0dmFyIHJzQnl0ZXMgPSAxICsgMSArIHJMZW5ndGggKyAxICsgMSArIHNMZW5ndGg7XG5cblx0dmFyIHNob3J0TGVuZ3RoID0gcnNCeXRlcyA8IE1BWF9PQ1RFVDtcblxuXHR2YXIgZHN0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKChzaG9ydExlbmd0aCA/IDIgOiAzKSArIHJzQnl0ZXMpO1xuXG5cdHZhciBvZmZzZXQgPSAwO1xuXHRkc3Rbb2Zmc2V0KytdID0gRU5DT0RFRF9UQUdfU0VRO1xuXHRpZiAoc2hvcnRMZW5ndGgpIHtcblx0XHQvLyBCaXQgOCBoYXMgdmFsdWUgXCIwXCJcblx0XHQvLyBiaXRzIDctMSBnaXZlIHRoZSBsZW5ndGguXG5cdFx0ZHN0W29mZnNldCsrXSA9IHJzQnl0ZXM7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQml0IDggb2YgZmlyc3Qgb2N0ZXQgaGFzIHZhbHVlIFwiMVwiXG5cdFx0Ly8gYml0cyA3LTEgZ2l2ZSB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgbGVuZ3RoIG9jdGV0cy5cblx0XHRkc3Rbb2Zmc2V0KytdID0gTUFYX09DVEVUXHR8IDE7XG5cdFx0Ly8gbGVuZ3RoLCBiYXNlIDI1NlxuXHRcdGRzdFtvZmZzZXQrK10gPSByc0J5dGVzICYgMHhmZjtcblx0fVxuXHRkc3Rbb2Zmc2V0KytdID0gRU5DT0RFRF9UQUdfSU5UO1xuXHRkc3Rbb2Zmc2V0KytdID0gckxlbmd0aDtcblx0aWYgKHJQYWRkaW5nIDwgMCkge1xuXHRcdGRzdFtvZmZzZXQrK10gPSAwO1xuXHRcdG9mZnNldCArPSBzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgMCwgcGFyYW1CeXRlcyk7XG5cdH0gZWxzZSB7XG5cdFx0b2Zmc2V0ICs9IHNpZ25hdHVyZS5jb3B5KGRzdCwgb2Zmc2V0LCByUGFkZGluZywgcGFyYW1CeXRlcyk7XG5cdH1cblx0ZHN0W29mZnNldCsrXSA9IEVOQ09ERURfVEFHX0lOVDtcblx0ZHN0W29mZnNldCsrXSA9IHNMZW5ndGg7XG5cdGlmIChzUGFkZGluZyA8IDApIHtcblx0XHRkc3Rbb2Zmc2V0KytdID0gMDtcblx0XHRzaWduYXR1cmUuY29weShkc3QsIG9mZnNldCwgcGFyYW1CeXRlcyk7XG5cdH0gZWxzZSB7XG5cdFx0c2lnbmF0dXJlLmNvcHkoZHN0LCBvZmZzZXQsIHBhcmFtQnl0ZXMgKyBzUGFkZGluZyk7XG5cdH1cblxuXHRyZXR1cm4gZHN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0ZGVyVG9Kb3NlOiBkZXJUb0pvc2UsXG5cdGpvc2VUb0Rlcjogam9zZVRvRGVyXG59O1xuIiwKICAgICIvKmpzaGludCBub2RlOnRydWUgKi9cbid1c2Ugc3RyaWN0JztcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7IC8vIGJyb3dzZXJpZnlcbnZhciBTbG93QnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuU2xvd0J1ZmZlcjtcblxubW9kdWxlLmV4cG9ydHMgPSBidWZmZXJFcTtcblxuZnVuY3Rpb24gYnVmZmVyRXEoYSwgYikge1xuXG4gIC8vIHNob3J0Y3V0dGluZyBvbiB0eXBlIGlzIG5lY2Vzc2FyeSBmb3IgY29ycmVjdG5lc3NcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGJ1ZmZlciBzaXplcyBzaG91bGQgYmUgd2VsbC1rbm93biBpbmZvcm1hdGlvbiwgc28gZGVzcGl0ZSB0aGlzXG4gIC8vIHNob3J0Y3V0dGluZywgaXQgZG9lc24ndCBsZWFrIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgKmNvbnRlbnRzKiBvZiB0aGVcbiAgLy8gYnVmZmVycy5cbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBjID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgLypqc2hpbnQgYml0d2lzZTpmYWxzZSAqL1xuICAgIGMgfD0gYVtpXSBeIGJbaV07IC8vIFhPUlxuICB9XG4gIHJldHVybiBjID09PSAwO1xufVxuXG5idWZmZXJFcS5pbnN0YWxsID0gZnVuY3Rpb24oKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuZXF1YWwgPSBTbG93QnVmZmVyLnByb3RvdHlwZS5lcXVhbCA9IGZ1bmN0aW9uIGVxdWFsKHRoYXQpIHtcbiAgICByZXR1cm4gYnVmZmVyRXEodGhpcywgdGhhdCk7XG4gIH07XG59O1xuXG52YXIgb3JpZ0J1ZkVxdWFsID0gQnVmZmVyLnByb3RvdHlwZS5lcXVhbDtcbnZhciBvcmlnU2xvd0J1ZkVxdWFsID0gU2xvd0J1ZmZlci5wcm90b3R5cGUuZXF1YWw7XG5idWZmZXJFcS5yZXN0b3JlID0gZnVuY3Rpb24oKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuZXF1YWwgPSBvcmlnQnVmRXF1YWw7XG4gIFNsb3dCdWZmZXIucHJvdG90eXBlLmVxdWFsID0gb3JpZ1Nsb3dCdWZFcXVhbDtcbn07XG4iLAogICAgInZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbnZhciBmb3JtYXRFY2RzYSA9IHJlcXVpcmUoJ2VjZHNhLXNpZy1mb3JtYXR0ZXInKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG52YXIgTVNHX0lOVkFMSURfQUxHT1JJVEhNID0gJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCBhbGdvcml0aG0uXFxuICBTdXBwb3J0ZWQgYWxnb3JpdGhtcyBhcmU6XFxuICBcIkhTMjU2XCIsIFwiSFMzODRcIiwgXCJIUzUxMlwiLCBcIlJTMjU2XCIsIFwiUlMzODRcIiwgXCJSUzUxMlwiLCBcIlBTMjU2XCIsIFwiUFMzODRcIiwgXCJQUzUxMlwiLCBcIkVTMjU2XCIsIFwiRVMzODRcIiwgXCJFUzUxMlwiIGFuZCBcIm5vbmVcIi4nXG52YXIgTVNHX0lOVkFMSURfU0VDUkVUID0gJ3NlY3JldCBtdXN0IGJlIGEgc3RyaW5nIG9yIGJ1ZmZlcic7XG52YXIgTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZID0gJ2tleSBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgYnVmZmVyJztcbnZhciBNU0dfSU5WQUxJRF9TSUdORVJfS0VZID0gJ2tleSBtdXN0IGJlIGEgc3RyaW5nLCBhIGJ1ZmZlciBvciBhbiBvYmplY3QnO1xuXG52YXIgc3VwcG9ydHNLZXlPYmplY3RzID0gdHlwZW9mIGNyeXB0by5jcmVhdGVQdWJsaWNLZXkgPT09ICdmdW5jdGlvbic7XG5pZiAoc3VwcG9ydHNLZXlPYmplY3RzKSB7XG4gIE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSArPSAnIG9yIGEgS2V5T2JqZWN0JztcbiAgTVNHX0lOVkFMSURfU0VDUkVUICs9ICdvciBhIEtleU9iamVjdCc7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSXNQdWJsaWNLZXkoa2V5KSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghc3VwcG9ydHNLZXlPYmplY3RzKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleSAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5LnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1ZFUklGSUVSX0tFWSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleS5hc3ltbWV0cmljS2V5VHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfVkVSSUZJRVJfS0VZKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5LmV4cG9ydCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9WRVJJRklFUl9LRVkpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjaGVja0lzUHJpdmF0ZUtleShrZXkpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihrZXkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1NJR05FUl9LRVkpO1xufTtcblxuZnVuY3Rpb24gY2hlY2tJc1NlY3JldEtleShrZXkpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihrZXkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIGlmICghc3VwcG9ydHNLZXlPYmplY3RzKSB7XG4gICAgdGhyb3cgdHlwZUVycm9yKE1TR19JTlZBTElEX1NFQ1JFVCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGtleSAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfU0VDUkVUKTtcbiAgfVxuXG4gIGlmIChrZXkudHlwZSAhPT0gJ3NlY3JldCcpIHtcbiAgICB0aHJvdyB0eXBlRXJyb3IoTVNHX0lOVkFMSURfU0VDUkVUKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Yga2V5LmV4cG9ydCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9TRUNSRVQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZyb21CYXNlNjQoYmFzZTY0KSB7XG4gIHJldHVybiBiYXNlNjRcbiAgICAucmVwbGFjZSgvPS9nLCAnJylcbiAgICAucmVwbGFjZSgvXFwrL2csICctJylcbiAgICAucmVwbGFjZSgvXFwvL2csICdfJyk7XG59XG5cbmZ1bmN0aW9uIHRvQmFzZTY0KGJhc2U2NHVybCkge1xuICBiYXNlNjR1cmwgPSBiYXNlNjR1cmwudG9TdHJpbmcoKTtcblxuICB2YXIgcGFkZGluZyA9IDQgLSBiYXNlNjR1cmwubGVuZ3RoICUgNDtcbiAgaWYgKHBhZGRpbmcgIT09IDQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZGRpbmc7ICsraSkge1xuICAgICAgYmFzZTY0dXJsICs9ICc9JztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFzZTY0dXJsXG4gICAgLnJlcGxhY2UoL1xcLS9nLCAnKycpXG4gICAgLnJlcGxhY2UoL18vZywgJy8nKTtcbn1cblxuZnVuY3Rpb24gdHlwZUVycm9yKHRlbXBsYXRlKSB7XG4gIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB2YXIgZXJyTXNnID0gdXRpbC5mb3JtYXQuYmluZCh1dGlsLCB0ZW1wbGF0ZSkuYXBwbHkobnVsbCwgYXJncyk7XG4gIHJldHVybiBuZXcgVHlwZUVycm9yKGVyck1zZyk7XG59XG5cbmZ1bmN0aW9uIGJ1ZmZlck9yU3RyaW5nKG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaikgfHwgdHlwZW9mIG9iaiA9PT0gJ3N0cmluZyc7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUlucHV0KHRoaW5nKSB7XG4gIGlmICghYnVmZmVyT3JTdHJpbmcodGhpbmcpKVxuICAgIHRoaW5nID0gSlNPTi5zdHJpbmdpZnkodGhpbmcpO1xuICByZXR1cm4gdGhpbmc7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhtYWNTaWduZXIoYml0cykge1xuICByZXR1cm4gZnVuY3Rpb24gc2lnbih0aGluZywgc2VjcmV0KSB7XG4gICAgY2hlY2tJc1NlY3JldEtleShzZWNyZXQpO1xuICAgIHRoaW5nID0gbm9ybWFsaXplSW5wdXQodGhpbmcpO1xuICAgIHZhciBobWFjID0gY3J5cHRvLmNyZWF0ZUhtYWMoJ3NoYScgKyBiaXRzLCBzZWNyZXQpO1xuICAgIHZhciBzaWcgPSAoaG1hYy51cGRhdGUodGhpbmcpLCBobWFjLmRpZ2VzdCgnYmFzZTY0JykpXG4gICAgcmV0dXJuIGZyb21CYXNlNjQoc2lnKTtcbiAgfVxufVxuXG52YXIgYnVmZmVyRXF1YWw7XG52YXIgdGltaW5nU2FmZUVxdWFsID0gJ3RpbWluZ1NhZmVFcXVhbCcgaW4gY3J5cHRvID8gZnVuY3Rpb24gdGltaW5nU2FmZUVxdWFsKGEsIGIpIHtcbiAgaWYgKGEuYnl0ZUxlbmd0aCAhPT0gYi5ieXRlTGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGNyeXB0by50aW1pbmdTYWZlRXF1YWwoYSwgYilcbn0gOiBmdW5jdGlvbiB0aW1pbmdTYWZlRXF1YWwoYSwgYikge1xuICBpZiAoIWJ1ZmZlckVxdWFsKSB7XG4gICAgYnVmZmVyRXF1YWwgPSByZXF1aXJlKCdidWZmZXItZXF1YWwtY29uc3RhbnQtdGltZScpO1xuICB9XG5cbiAgcmV0dXJuIGJ1ZmZlckVxdWFsKGEsIGIpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhtYWNWZXJpZmllcihiaXRzKSB7XG4gIHJldHVybiBmdW5jdGlvbiB2ZXJpZnkodGhpbmcsIHNpZ25hdHVyZSwgc2VjcmV0KSB7XG4gICAgdmFyIGNvbXB1dGVkU2lnID0gY3JlYXRlSG1hY1NpZ25lcihiaXRzKSh0aGluZywgc2VjcmV0KTtcbiAgICByZXR1cm4gdGltaW5nU2FmZUVxdWFsKEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSksIEJ1ZmZlci5mcm9tKGNvbXB1dGVkU2lnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5U2lnbmVyKGJpdHMpIHtcbiByZXR1cm4gZnVuY3Rpb24gc2lnbih0aGluZywgcHJpdmF0ZUtleSkge1xuICAgIGNoZWNrSXNQcml2YXRlS2V5KHByaXZhdGVLZXkpO1xuICAgIHRoaW5nID0gbm9ybWFsaXplSW5wdXQodGhpbmcpO1xuICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGFyZSBzcGVjaWZ5aW5nIFwiUlNBXCIgaGVyZSwgdGhpcyB3b3JrcyB3aXRoIEVDRFNBXG4gICAgLy8ga2V5cyBhcyB3ZWxsLlxuICAgIHZhciBzaWduZXIgPSBjcnlwdG8uY3JlYXRlU2lnbignUlNBLVNIQScgKyBiaXRzKTtcbiAgICB2YXIgc2lnID0gKHNpZ25lci51cGRhdGUodGhpbmcpLCBzaWduZXIuc2lnbihwcml2YXRlS2V5LCAnYmFzZTY0JykpO1xuICAgIHJldHVybiBmcm9tQmFzZTY0KHNpZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5VmVyaWZpZXIoYml0cykge1xuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KHRoaW5nLCBzaWduYXR1cmUsIHB1YmxpY0tleSkge1xuICAgIGNoZWNrSXNQdWJsaWNLZXkocHVibGljS2V5KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICBzaWduYXR1cmUgPSB0b0Jhc2U2NChzaWduYXR1cmUpO1xuICAgIHZhciB2ZXJpZmllciA9IGNyeXB0by5jcmVhdGVWZXJpZnkoJ1JTQS1TSEEnICsgYml0cyk7XG4gICAgdmVyaWZpZXIudXBkYXRlKHRoaW5nKTtcbiAgICByZXR1cm4gdmVyaWZpZXIudmVyaWZ5KHB1YmxpY0tleSwgc2lnbmF0dXJlLCAnYmFzZTY0Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlUFNTS2V5U2lnbmVyKGJpdHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNpZ24odGhpbmcsIHByaXZhdGVLZXkpIHtcbiAgICBjaGVja0lzUHJpdmF0ZUtleShwcml2YXRlS2V5KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICB2YXIgc2lnbmVyID0gY3J5cHRvLmNyZWF0ZVNpZ24oJ1JTQS1TSEEnICsgYml0cyk7XG4gICAgdmFyIHNpZyA9IChzaWduZXIudXBkYXRlKHRoaW5nKSwgc2lnbmVyLnNpZ24oe1xuICAgICAga2V5OiBwcml2YXRlS2V5LFxuICAgICAgcGFkZGluZzogY3J5cHRvLmNvbnN0YW50cy5SU0FfUEtDUzFfUFNTX1BBRERJTkcsXG4gICAgICBzYWx0TGVuZ3RoOiBjcnlwdG8uY29uc3RhbnRzLlJTQV9QU1NfU0FMVExFTl9ESUdFU1RcbiAgICB9LCAnYmFzZTY0JykpO1xuICAgIHJldHVybiBmcm9tQmFzZTY0KHNpZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlUFNTS2V5VmVyaWZpZXIoYml0cykge1xuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KHRoaW5nLCBzaWduYXR1cmUsIHB1YmxpY0tleSkge1xuICAgIGNoZWNrSXNQdWJsaWNLZXkocHVibGljS2V5KTtcbiAgICB0aGluZyA9IG5vcm1hbGl6ZUlucHV0KHRoaW5nKTtcbiAgICBzaWduYXR1cmUgPSB0b0Jhc2U2NChzaWduYXR1cmUpO1xuICAgIHZhciB2ZXJpZmllciA9IGNyeXB0by5jcmVhdGVWZXJpZnkoJ1JTQS1TSEEnICsgYml0cyk7XG4gICAgdmVyaWZpZXIudXBkYXRlKHRoaW5nKTtcbiAgICByZXR1cm4gdmVyaWZpZXIudmVyaWZ5KHtcbiAgICAgIGtleTogcHVibGljS2V5LFxuICAgICAgcGFkZGluZzogY3J5cHRvLmNvbnN0YW50cy5SU0FfUEtDUzFfUFNTX1BBRERJTkcsXG4gICAgICBzYWx0TGVuZ3RoOiBjcnlwdG8uY29uc3RhbnRzLlJTQV9QU1NfU0FMVExFTl9ESUdFU1RcbiAgICB9LCBzaWduYXR1cmUsICdiYXNlNjQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFQ0RTQVNpZ25lcihiaXRzKSB7XG4gIHZhciBpbm5lciA9IGNyZWF0ZUtleVNpZ25lcihiaXRzKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNpZ24oKSB7XG4gICAgdmFyIHNpZ25hdHVyZSA9IGlubmVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgc2lnbmF0dXJlID0gZm9ybWF0RWNkc2EuZGVyVG9Kb3NlKHNpZ25hdHVyZSwgJ0VTJyArIGJpdHMpO1xuICAgIHJldHVybiBzaWduYXR1cmU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVDRFNBVmVyaWZlcihiaXRzKSB7XG4gIHZhciBpbm5lciA9IGNyZWF0ZUtleVZlcmlmaWVyKGJpdHMpO1xuICByZXR1cm4gZnVuY3Rpb24gdmVyaWZ5KHRoaW5nLCBzaWduYXR1cmUsIHB1YmxpY0tleSkge1xuICAgIHNpZ25hdHVyZSA9IGZvcm1hdEVjZHNhLmpvc2VUb0RlcihzaWduYXR1cmUsICdFUycgKyBiaXRzKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgdmFyIHJlc3VsdCA9IGlubmVyKHRoaW5nLCBzaWduYXR1cmUsIHB1YmxpY0tleSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTm9uZVNpZ25lcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNpZ24oKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5vbmVWZXJpZmllcigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHZlcmlmeSh0aGluZywgc2lnbmF0dXJlKSB7XG4gICAgcmV0dXJuIHNpZ25hdHVyZSA9PT0gJyc7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBqd2EoYWxnb3JpdGhtKSB7XG4gIHZhciBzaWduZXJGYWN0b3JpZXMgPSB7XG4gICAgaHM6IGNyZWF0ZUhtYWNTaWduZXIsXG4gICAgcnM6IGNyZWF0ZUtleVNpZ25lcixcbiAgICBwczogY3JlYXRlUFNTS2V5U2lnbmVyLFxuICAgIGVzOiBjcmVhdGVFQ0RTQVNpZ25lcixcbiAgICBub25lOiBjcmVhdGVOb25lU2lnbmVyLFxuICB9XG4gIHZhciB2ZXJpZmllckZhY3RvcmllcyA9IHtcbiAgICBoczogY3JlYXRlSG1hY1ZlcmlmaWVyLFxuICAgIHJzOiBjcmVhdGVLZXlWZXJpZmllcixcbiAgICBwczogY3JlYXRlUFNTS2V5VmVyaWZpZXIsXG4gICAgZXM6IGNyZWF0ZUVDRFNBVmVyaWZlcixcbiAgICBub25lOiBjcmVhdGVOb25lVmVyaWZpZXIsXG4gIH1cbiAgdmFyIG1hdGNoID0gYWxnb3JpdGhtLm1hdGNoKC9eKFJTfFBTfEVTfEhTKSgyNTZ8Mzg0fDUxMikkfF4obm9uZSkkL2kpO1xuICBpZiAoIW1hdGNoKVxuICAgIHRocm93IHR5cGVFcnJvcihNU0dfSU5WQUxJRF9BTEdPUklUSE0sIGFsZ29yaXRobSk7XG4gIHZhciBhbGdvID0gKG1hdGNoWzFdIHx8IG1hdGNoWzNdKS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgYml0cyA9IG1hdGNoWzJdO1xuXG4gIHJldHVybiB7XG4gICAgc2lnbjogc2lnbmVyRmFjdG9yaWVzW2FsZ29dKGJpdHMpLFxuICAgIHZlcmlmeTogdmVyaWZpZXJGYWN0b3JpZXNbYWxnb10oYml0cyksXG4gIH1cbn07XG4iLAogICAgIi8qZ2xvYmFsIG1vZHVsZSovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9iaikge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpXG4gICAgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdudW1iZXInIHx8IEJ1ZmZlci5pc0J1ZmZlcihvYmopKVxuICAgIHJldHVybiBvYmoudG9TdHJpbmcoKTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaik7XG59O1xuIiwKICAgICIvKmdsb2JhbCBtb2R1bGUqL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIERhdGFTdHJlYW0gPSByZXF1aXJlKCcuL2RhdGEtc3RyZWFtJyk7XG52YXIgandhID0gcmVxdWlyZSgnandhJyk7XG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3Rvc3RyaW5nJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuZnVuY3Rpb24gYmFzZTY0dXJsKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIEJ1ZmZlclxuICAgIC5mcm9tKHN0cmluZywgZW5jb2RpbmcpXG4gICAgLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIC5yZXBsYWNlKC89L2csICcnKVxuICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuICAgIC5yZXBsYWNlKC9cXC8vZywgJ18nKTtcbn1cblxuZnVuY3Rpb24gandzU2VjdXJlZElucHV0KGhlYWRlciwgcGF5bG9hZCwgZW5jb2RpbmcpIHtcbiAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCAndXRmOCc7XG4gIHZhciBlbmNvZGVkSGVhZGVyID0gYmFzZTY0dXJsKHRvU3RyaW5nKGhlYWRlciksICdiaW5hcnknKTtcbiAgdmFyIGVuY29kZWRQYXlsb2FkID0gYmFzZTY0dXJsKHRvU3RyaW5nKHBheWxvYWQpLCBlbmNvZGluZyk7XG4gIHJldHVybiB1dGlsLmZvcm1hdCgnJXMuJXMnLCBlbmNvZGVkSGVhZGVyLCBlbmNvZGVkUGF5bG9hZCk7XG59XG5cbmZ1bmN0aW9uIGp3c1NpZ24ob3B0cykge1xuICB2YXIgaGVhZGVyID0gb3B0cy5oZWFkZXI7XG4gIHZhciBwYXlsb2FkID0gb3B0cy5wYXlsb2FkO1xuICB2YXIgc2VjcmV0T3JLZXkgPSBvcHRzLnNlY3JldCB8fCBvcHRzLnByaXZhdGVLZXk7XG4gIHZhciBlbmNvZGluZyA9IG9wdHMuZW5jb2Rpbmc7XG4gIHZhciBhbGdvID0gandhKGhlYWRlci5hbGcpO1xuICB2YXIgc2VjdXJlZElucHV0ID0gandzU2VjdXJlZElucHV0KGhlYWRlciwgcGF5bG9hZCwgZW5jb2RpbmcpO1xuICB2YXIgc2lnbmF0dXJlID0gYWxnby5zaWduKHNlY3VyZWRJbnB1dCwgc2VjcmV0T3JLZXkpO1xuICByZXR1cm4gdXRpbC5mb3JtYXQoJyVzLiVzJywgc2VjdXJlZElucHV0LCBzaWduYXR1cmUpO1xufVxuXG5mdW5jdGlvbiBTaWduU3RyZWFtKG9wdHMpIHtcbiAgdmFyIHNlY3JldCA9IG9wdHMuc2VjcmV0fHxvcHRzLnByaXZhdGVLZXl8fG9wdHMua2V5O1xuICB2YXIgc2VjcmV0U3RyZWFtID0gbmV3IERhdGFTdHJlYW0oc2VjcmV0KTtcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG4gIHRoaXMuaGVhZGVyID0gb3B0cy5oZWFkZXI7XG4gIHRoaXMuZW5jb2RpbmcgPSBvcHRzLmVuY29kaW5nO1xuICB0aGlzLnNlY3JldCA9IHRoaXMucHJpdmF0ZUtleSA9IHRoaXMua2V5ID0gc2VjcmV0U3RyZWFtO1xuICB0aGlzLnBheWxvYWQgPSBuZXcgRGF0YVN0cmVhbShvcHRzLnBheWxvYWQpO1xuICB0aGlzLnNlY3JldC5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMucGF5bG9hZC53cml0YWJsZSAmJiB0aGlzLnJlYWRhYmxlKVxuICAgICAgdGhpcy5zaWduKCk7XG4gIH0uYmluZCh0aGlzKSk7XG5cbiAgdGhpcy5wYXlsb2FkLm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5zZWNyZXQud3JpdGFibGUgJiYgdGhpcy5yZWFkYWJsZSlcbiAgICAgIHRoaXMuc2lnbigpO1xuICB9LmJpbmQodGhpcykpO1xufVxudXRpbC5pbmhlcml0cyhTaWduU3RyZWFtLCBTdHJlYW0pO1xuXG5TaWduU3RyZWFtLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gc2lnbigpIHtcbiAgdHJ5IHtcbiAgICB2YXIgc2lnbmF0dXJlID0gandzU2lnbih7XG4gICAgICBoZWFkZXI6IHRoaXMuaGVhZGVyLFxuICAgICAgcGF5bG9hZDogdGhpcy5wYXlsb2FkLmJ1ZmZlcixcbiAgICAgIHNlY3JldDogdGhpcy5zZWNyZXQuYnVmZmVyLFxuICAgICAgZW5jb2Rpbmc6IHRoaXMuZW5jb2RpbmdcbiAgICB9KTtcbiAgICB0aGlzLmVtaXQoJ2RvbmUnLCBzaWduYXR1cmUpO1xuICAgIHRoaXMuZW1pdCgnZGF0YScsIHNpZ25hdHVyZSk7XG4gICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgcmV0dXJuIHNpZ25hdHVyZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgdGhpcy5lbWl0KCdjbG9zZScpO1xuICB9XG59O1xuXG5TaWduU3RyZWFtLnNpZ24gPSBqd3NTaWduO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNpZ25TdHJlYW07XG4iLAogICAgIi8qZ2xvYmFsIG1vZHVsZSovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG52YXIgRGF0YVN0cmVhbSA9IHJlcXVpcmUoJy4vZGF0YS1zdHJlYW0nKTtcbnZhciBqd2EgPSByZXF1aXJlKCdqd2EnKTtcbnZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4vdG9zdHJpbmcnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIEpXU19SRUdFWCA9IC9eW2EtekEtWjAtOVxcLV9dKz9cXC5bYS16QS1aMC05XFwtX10rP1xcLihbYS16QS1aMC05XFwtX10rKT8kLztcblxuZnVuY3Rpb24gaXNPYmplY3QodGhpbmcpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGluZykgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuXG5mdW5jdGlvbiBzYWZlSnNvblBhcnNlKHRoaW5nKSB7XG4gIGlmIChpc09iamVjdCh0aGluZykpXG4gICAgcmV0dXJuIHRoaW5nO1xuICB0cnkgeyByZXR1cm4gSlNPTi5wYXJzZSh0aGluZyk7IH1cbiAgY2F0Y2ggKGUpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxufVxuXG5mdW5jdGlvbiBoZWFkZXJGcm9tSldTKGp3c1NpZykge1xuICB2YXIgZW5jb2RlZEhlYWRlciA9IGp3c1NpZy5zcGxpdCgnLicsIDEpWzBdO1xuICByZXR1cm4gc2FmZUpzb25QYXJzZShCdWZmZXIuZnJvbShlbmNvZGVkSGVhZGVyLCAnYmFzZTY0JykudG9TdHJpbmcoJ2JpbmFyeScpKTtcbn1cblxuZnVuY3Rpb24gc2VjdXJlZElucHV0RnJvbUpXUyhqd3NTaWcpIHtcbiAgcmV0dXJuIGp3c1NpZy5zcGxpdCgnLicsIDIpLmpvaW4oJy4nKTtcbn1cblxuZnVuY3Rpb24gc2lnbmF0dXJlRnJvbUpXUyhqd3NTaWcpIHtcbiAgcmV0dXJuIGp3c1NpZy5zcGxpdCgnLicpWzJdO1xufVxuXG5mdW5jdGlvbiBwYXlsb2FkRnJvbUpXUyhqd3NTaWcsIGVuY29kaW5nKSB7XG4gIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0ZjgnO1xuICB2YXIgcGF5bG9hZCA9IGp3c1NpZy5zcGxpdCgnLicpWzFdO1xuICByZXR1cm4gQnVmZmVyLmZyb20ocGF5bG9hZCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKGVuY29kaW5nKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEp3cyhzdHJpbmcpIHtcbiAgcmV0dXJuIEpXU19SRUdFWC50ZXN0KHN0cmluZykgJiYgISFoZWFkZXJGcm9tSldTKHN0cmluZyk7XG59XG5cbmZ1bmN0aW9uIGp3c1ZlcmlmeShqd3NTaWcsIGFsZ29yaXRobSwgc2VjcmV0T3JLZXkpIHtcbiAgaWYgKCFhbGdvcml0aG0pIHtcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiTWlzc2luZyBhbGdvcml0aG0gcGFyYW1ldGVyIGZvciBqd3MudmVyaWZ5XCIpO1xuICAgIGVyci5jb2RlID0gXCJNSVNTSU5HX0FMR09SSVRITVwiO1xuICAgIHRocm93IGVycjtcbiAgfVxuICBqd3NTaWcgPSB0b1N0cmluZyhqd3NTaWcpO1xuICB2YXIgc2lnbmF0dXJlID0gc2lnbmF0dXJlRnJvbUpXUyhqd3NTaWcpO1xuICB2YXIgc2VjdXJlZElucHV0ID0gc2VjdXJlZElucHV0RnJvbUpXUyhqd3NTaWcpO1xuICB2YXIgYWxnbyA9IGp3YShhbGdvcml0aG0pO1xuICByZXR1cm4gYWxnby52ZXJpZnkoc2VjdXJlZElucHV0LCBzaWduYXR1cmUsIHNlY3JldE9yS2V5KTtcbn1cblxuZnVuY3Rpb24gandzRGVjb2RlKGp3c1NpZywgb3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgandzU2lnID0gdG9TdHJpbmcoandzU2lnKTtcblxuICBpZiAoIWlzVmFsaWRKd3MoandzU2lnKSlcbiAgICByZXR1cm4gbnVsbDtcblxuICB2YXIgaGVhZGVyID0gaGVhZGVyRnJvbUpXUyhqd3NTaWcpO1xuXG4gIGlmICghaGVhZGVyKVxuICAgIHJldHVybiBudWxsO1xuXG4gIHZhciBwYXlsb2FkID0gcGF5bG9hZEZyb21KV1MoandzU2lnKTtcbiAgaWYgKGhlYWRlci50eXAgPT09ICdKV1QnIHx8IG9wdHMuanNvbilcbiAgICBwYXlsb2FkID0gSlNPTi5wYXJzZShwYXlsb2FkLCBvcHRzLmVuY29kaW5nKTtcblxuICByZXR1cm4ge1xuICAgIGhlYWRlcjogaGVhZGVyLFxuICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgc2lnbmF0dXJlOiBzaWduYXR1cmVGcm9tSldTKGp3c1NpZylcbiAgfTtcbn1cblxuZnVuY3Rpb24gVmVyaWZ5U3RyZWFtKG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge307XG4gIHZhciBzZWNyZXRPcktleSA9IG9wdHMuc2VjcmV0fHxvcHRzLnB1YmxpY0tleXx8b3B0cy5rZXk7XG4gIHZhciBzZWNyZXRTdHJlYW0gPSBuZXcgRGF0YVN0cmVhbShzZWNyZXRPcktleSk7XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuICB0aGlzLmFsZ29yaXRobSA9IG9wdHMuYWxnb3JpdGhtO1xuICB0aGlzLmVuY29kaW5nID0gb3B0cy5lbmNvZGluZztcbiAgdGhpcy5zZWNyZXQgPSB0aGlzLnB1YmxpY0tleSA9IHRoaXMua2V5ID0gc2VjcmV0U3RyZWFtO1xuICB0aGlzLnNpZ25hdHVyZSA9IG5ldyBEYXRhU3RyZWFtKG9wdHMuc2lnbmF0dXJlKTtcbiAgdGhpcy5zZWNyZXQub25jZSgnY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLnNpZ25hdHVyZS53cml0YWJsZSAmJiB0aGlzLnJlYWRhYmxlKVxuICAgICAgdGhpcy52ZXJpZnkoKTtcbiAgfS5iaW5kKHRoaXMpKTtcblxuICB0aGlzLnNpZ25hdHVyZS5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuc2VjcmV0LndyaXRhYmxlICYmIHRoaXMucmVhZGFibGUpXG4gICAgICB0aGlzLnZlcmlmeSgpO1xuICB9LmJpbmQodGhpcykpO1xufVxudXRpbC5pbmhlcml0cyhWZXJpZnlTdHJlYW0sIFN0cmVhbSk7XG5WZXJpZnlTdHJlYW0ucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeSgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgdmFsaWQgPSBqd3NWZXJpZnkodGhpcy5zaWduYXR1cmUuYnVmZmVyLCB0aGlzLmFsZ29yaXRobSwgdGhpcy5rZXkuYnVmZmVyKTtcbiAgICB2YXIgb2JqID0gandzRGVjb2RlKHRoaXMuc2lnbmF0dXJlLmJ1ZmZlciwgdGhpcy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbWl0KCdkb25lJywgdmFsaWQsIG9iaik7XG4gICAgdGhpcy5lbWl0KCdkYXRhJywgdmFsaWQpO1xuICAgIHRoaXMuZW1pdCgnZW5kJyk7XG4gICAgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHJldHVybiB2YWxpZDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgdGhpcy5lbWl0KCdjbG9zZScpO1xuICB9XG59O1xuXG5WZXJpZnlTdHJlYW0uZGVjb2RlID0gandzRGVjb2RlO1xuVmVyaWZ5U3RyZWFtLmlzVmFsaWQgPSBpc1ZhbGlkSndzO1xuVmVyaWZ5U3RyZWFtLnZlcmlmeSA9IGp3c1ZlcmlmeTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZXJpZnlTdHJlYW07XG4iLAogICAgIi8qZ2xvYmFsIGV4cG9ydHMqL1xudmFyIFNpZ25TdHJlYW0gPSByZXF1aXJlKCcuL2xpYi9zaWduLXN0cmVhbScpO1xudmFyIFZlcmlmeVN0cmVhbSA9IHJlcXVpcmUoJy4vbGliL3ZlcmlmeS1zdHJlYW0nKTtcblxudmFyIEFMR09SSVRITVMgPSBbXG4gICdIUzI1NicsICdIUzM4NCcsICdIUzUxMicsXG4gICdSUzI1NicsICdSUzM4NCcsICdSUzUxMicsXG4gICdQUzI1NicsICdQUzM4NCcsICdQUzUxMicsXG4gICdFUzI1NicsICdFUzM4NCcsICdFUzUxMidcbl07XG5cbmV4cG9ydHMuQUxHT1JJVEhNUyA9IEFMR09SSVRITVM7XG5leHBvcnRzLnNpZ24gPSBTaWduU3RyZWFtLnNpZ247XG5leHBvcnRzLnZlcmlmeSA9IFZlcmlmeVN0cmVhbS52ZXJpZnk7XG5leHBvcnRzLmRlY29kZSA9IFZlcmlmeVN0cmVhbS5kZWNvZGU7XG5leHBvcnRzLmlzVmFsaWQgPSBWZXJpZnlTdHJlYW0uaXNWYWxpZDtcbmV4cG9ydHMuY3JlYXRlU2lnbiA9IGZ1bmN0aW9uIGNyZWF0ZVNpZ24ob3B0cykge1xuICByZXR1cm4gbmV3IFNpZ25TdHJlYW0ob3B0cyk7XG59O1xuZXhwb3J0cy5jcmVhdGVWZXJpZnkgPSBmdW5jdGlvbiBjcmVhdGVWZXJpZnkob3B0cykge1xuICByZXR1cm4gbmV3IFZlcmlmeVN0cmVhbShvcHRzKTtcbn07XG4iLAogICAgInZhciBqd3MgPSByZXF1aXJlKCdqd3MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoand0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgZGVjb2RlZCA9IGp3cy5kZWNvZGUoand0LCBvcHRpb25zKTtcbiAgaWYgKCFkZWNvZGVkKSB7IHJldHVybiBudWxsOyB9XG4gIHZhciBwYXlsb2FkID0gZGVjb2RlZC5wYXlsb2FkO1xuXG4gIC8vdHJ5IHBhcnNlIHRoZSBwYXlsb2FkXG4gIGlmKHR5cGVvZiBwYXlsb2FkID09PSAnc3RyaW5nJykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgb2JqID0gSlNPTi5wYXJzZShwYXlsb2FkKTtcbiAgICAgIGlmKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBwYXlsb2FkID0gb2JqO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgfVxuICB9XG5cbiAgLy9yZXR1cm4gaGVhZGVyIGlmIGBjb21wbGV0ZWAgb3B0aW9uIGlzIGVuYWJsZWQuICBoZWFkZXIgaW5jbHVkZXMgY2xhaW1zXG4gIC8vc3VjaCBhcyBga2lkYCBhbmQgYGFsZ2AgdXNlZCB0byBzZWxlY3QgdGhlIGtleSB3aXRoaW4gYSBKV0tTIG5lZWRlZCB0b1xuICAvL3ZlcmlmeSB0aGUgc2lnbmF0dXJlXG4gIGlmIChvcHRpb25zLmNvbXBsZXRlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWRlcjogZGVjb2RlZC5oZWFkZXIsXG4gICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgc2lnbmF0dXJlOiBkZWNvZGVkLnNpZ25hdHVyZVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHBheWxvYWQ7XG59O1xuIiwKICAgICJ2YXIgSnNvbldlYlRva2VuRXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSwgZXJyb3IpIHtcbiAgRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcbiAgaWYoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxuICB0aGlzLm5hbWUgPSAnSnNvbldlYlRva2VuRXJyb3InO1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICBpZiAoZXJyb3IpIHRoaXMuaW5uZXIgPSBlcnJvcjtcbn07XG5cbkpzb25XZWJUb2tlbkVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbkpzb25XZWJUb2tlbkVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEpzb25XZWJUb2tlbkVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEpzb25XZWJUb2tlbkVycm9yO1xuIiwKICAgICJ2YXIgSnNvbldlYlRva2VuRXJyb3IgPSByZXF1aXJlKCcuL0pzb25XZWJUb2tlbkVycm9yJyk7XG5cbnZhciBOb3RCZWZvcmVFcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBkYXRlKSB7XG4gIEpzb25XZWJUb2tlbkVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gIHRoaXMubmFtZSA9ICdOb3RCZWZvcmVFcnJvcic7XG4gIHRoaXMuZGF0ZSA9IGRhdGU7XG59O1xuXG5Ob3RCZWZvcmVFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEpzb25XZWJUb2tlbkVycm9yLnByb3RvdHlwZSk7XG5cbk5vdEJlZm9yZUVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE5vdEJlZm9yZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5vdEJlZm9yZUVycm9yOyIsCiAgICAidmFyIEpzb25XZWJUb2tlbkVycm9yID0gcmVxdWlyZSgnLi9Kc29uV2ViVG9rZW5FcnJvcicpO1xuXG52YXIgVG9rZW5FeHBpcmVkRXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSwgZXhwaXJlZEF0KSB7XG4gIEpzb25XZWJUb2tlbkVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gIHRoaXMubmFtZSA9ICdUb2tlbkV4cGlyZWRFcnJvcic7XG4gIHRoaXMuZXhwaXJlZEF0ID0gZXhwaXJlZEF0O1xufTtcblxuVG9rZW5FeHBpcmVkRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShKc29uV2ViVG9rZW5FcnJvci5wcm90b3R5cGUpO1xuXG5Ub2tlbkV4cGlyZWRFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb2tlbkV4cGlyZWRFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBUb2tlbkV4cGlyZWRFcnJvcjsiLAogICAgIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuICAgIHN0clxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICd3ZWVrcyc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgY2FzZSAndyc6XG4gICAgICByZXR1cm4gbiAqIHc7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgfVxuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBoLCAnaG91cicpO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gIH1cbiAgcmV0dXJuIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICB2YXIgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG4pICsgJyAnICsgbmFtZSArIChpc1BsdXJhbCA/ICdzJyA6ICcnKTtcbn1cbiIsCiAgICAidmFyIG1zID0gcmVxdWlyZSgnbXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGltZSwgaWF0KSB7XG4gIHZhciB0aW1lc3RhbXAgPSBpYXQgfHwgTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbiAgaWYgKHR5cGVvZiB0aW1lID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtaWxsaXNlY29uZHMgPSBtcyh0aW1lKTtcbiAgICBpZiAodHlwZW9mIG1pbGxpc2Vjb25kcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGguZmxvb3IodGltZXN0YW1wICsgbWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHRpbWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHRpbWVzdGFtcCArIHRpbWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbn07IiwKICAgICIndXNlIHN0cmljdCdcblxuLy8gTm90ZTogdGhpcyBpcyB0aGUgc2VtdmVyLm9yZyB2ZXJzaW9uIG9mIHRoZSBzcGVjIHRoYXQgaXQgaW1wbGVtZW50c1xuLy8gTm90IG5lY2Vzc2FyaWx5IHRoZSBwYWNrYWdlIHZlcnNpb24gb2YgdGhpcyBjb2RlLlxuY29uc3QgU0VNVkVSX1NQRUNfVkVSU0lPTiA9ICcyLjAuMCdcblxuY29uc3QgTUFYX0xFTkdUSCA9IDI1NlxuY29uc3QgTUFYX1NBRkVfSU5URUdFUiA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIHx8XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyA5MDA3MTk5MjU0NzQwOTkxXG5cbi8vIE1heCBzYWZlIHNlZ21lbnQgbGVuZ3RoIGZvciBjb2VyY2lvbi5cbmNvbnN0IE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEggPSAxNlxuXG4vLyBNYXggc2FmZSBsZW5ndGggZm9yIGEgYnVpbGQgaWRlbnRpZmllci4gVGhlIG1heCBsZW5ndGggbWludXMgNiBjaGFyYWN0ZXJzIGZvclxuLy8gdGhlIHNob3J0ZXN0IHZlcnNpb24gd2l0aCBhIGJ1aWxkIDAuMC4wK0JVSUxELlxuY29uc3QgTUFYX1NBRkVfQlVJTERfTEVOR1RIID0gTUFYX0xFTkdUSCAtIDZcblxuY29uc3QgUkVMRUFTRV9UWVBFUyA9IFtcbiAgJ21ham9yJyxcbiAgJ3ByZW1ham9yJyxcbiAgJ21pbm9yJyxcbiAgJ3ByZW1pbm9yJyxcbiAgJ3BhdGNoJyxcbiAgJ3ByZXBhdGNoJyxcbiAgJ3ByZXJlbGVhc2UnLFxuXVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTUFYX0xFTkdUSCxcbiAgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCxcbiAgTUFYX1NBRkVfQlVJTERfTEVOR1RILFxuICBNQVhfU0FGRV9JTlRFR0VSLFxuICBSRUxFQVNFX1RZUEVTLFxuICBTRU1WRVJfU1BFQ19WRVJTSU9OLFxuICBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRTogMGIwMDEsXG4gIEZMQUdfTE9PU0U6IDBiMDEwLFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgZGVidWcgPSAoXG4gIHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJlxuICBwcm9jZXNzLmVudiAmJlxuICBwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmXG4gIC9cXGJzZW12ZXJcXGIvaS50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcpXG4pID8gKC4uLmFyZ3MpID0+IGNvbnNvbGUuZXJyb3IoJ1NFTVZFUicsIC4uLmFyZ3MpXG4gIDogKCkgPT4ge31cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJ1Z1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RILFxuICBNQVhfU0FGRV9CVUlMRF9MRU5HVEgsXG4gIE1BWF9MRU5HVEgsXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuL2RlYnVnJylcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHt9XG5cbi8vIFRoZSBhY3R1YWwgcmVnZXhwcyBnbyBvbiBleHBvcnRzLnJlXG5jb25zdCByZSA9IGV4cG9ydHMucmUgPSBbXVxuY29uc3Qgc2FmZVJlID0gZXhwb3J0cy5zYWZlUmUgPSBbXVxuY29uc3Qgc3JjID0gZXhwb3J0cy5zcmMgPSBbXVxuY29uc3Qgc2FmZVNyYyA9IGV4cG9ydHMuc2FmZVNyYyA9IFtdXG5jb25zdCB0ID0gZXhwb3J0cy50ID0ge31cbmxldCBSID0gMFxuXG5jb25zdCBMRVRURVJEQVNITlVNQkVSID0gJ1thLXpBLVowLTktXSdcblxuLy8gUmVwbGFjZSBzb21lIGdyZWVkeSByZWdleCB0b2tlbnMgdG8gcHJldmVudCByZWdleCBkb3MgaXNzdWVzLiBUaGVzZSByZWdleCBhcmVcbi8vIHVzZWQgaW50ZXJuYWxseSB2aWEgdGhlIHNhZmVSZSBvYmplY3Qgc2luY2UgYWxsIGlucHV0cyBpbiB0aGlzIGxpYnJhcnkgZ2V0XG4vLyBub3JtYWxpemVkIGZpcnN0IHRvIHRyaW0gYW5kIGNvbGxhcHNlIGFsbCBleHRyYSB3aGl0ZXNwYWNlLiBUaGUgb3JpZ2luYWxcbi8vIHJlZ2V4ZXMgYXJlIGV4cG9ydGVkIGZvciB1c2VybGFuZCBjb25zdW1wdGlvbiBhbmQgbG93ZXIgbGV2ZWwgdXNhZ2UuIEFcbi8vIGZ1dHVyZSBicmVha2luZyBjaGFuZ2UgY291bGQgZXhwb3J0IHRoZSBzYWZlciByZWdleCBvbmx5IHdpdGggYSBub3RlIHRoYXRcbi8vIGFsbCBpbnB1dCBzaG91bGQgaGF2ZSBleHRyYSB3aGl0ZXNwYWNlIHJlbW92ZWQuXG5jb25zdCBzYWZlUmVnZXhSZXBsYWNlbWVudHMgPSBbXG4gIFsnXFxcXHMnLCAxXSxcbiAgWydcXFxcZCcsIE1BWF9MRU5HVEhdLFxuICBbTEVUVEVSREFTSE5VTUJFUiwgTUFYX1NBRkVfQlVJTERfTEVOR1RIXSxcbl1cblxuY29uc3QgbWFrZVNhZmVSZWdleCA9ICh2YWx1ZSkgPT4ge1xuICBmb3IgKGNvbnN0IFt0b2tlbiwgbWF4XSBvZiBzYWZlUmVnZXhSZXBsYWNlbWVudHMpIHtcbiAgICB2YWx1ZSA9IHZhbHVlXG4gICAgICAuc3BsaXQoYCR7dG9rZW59KmApLmpvaW4oYCR7dG9rZW59ezAsJHttYXh9fWApXG4gICAgICAuc3BsaXQoYCR7dG9rZW59K2ApLmpvaW4oYCR7dG9rZW59ezEsJHttYXh9fWApXG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbmNvbnN0IGNyZWF0ZVRva2VuID0gKG5hbWUsIHZhbHVlLCBpc0dsb2JhbCkgPT4ge1xuICBjb25zdCBzYWZlID0gbWFrZVNhZmVSZWdleCh2YWx1ZSlcbiAgY29uc3QgaW5kZXggPSBSKytcbiAgZGVidWcobmFtZSwgaW5kZXgsIHZhbHVlKVxuICB0W25hbWVdID0gaW5kZXhcbiAgc3JjW2luZGV4XSA9IHZhbHVlXG4gIHNhZmVTcmNbaW5kZXhdID0gc2FmZVxuICByZVtpbmRleF0gPSBuZXcgUmVnRXhwKHZhbHVlLCBpc0dsb2JhbCA/ICdnJyA6IHVuZGVmaW5lZClcbiAgc2FmZVJlW2luZGV4XSA9IG5ldyBSZWdFeHAoc2FmZSwgaXNHbG9iYWwgPyAnZycgOiB1bmRlZmluZWQpXG59XG5cbi8vIFRoZSBmb2xsb3dpbmcgUmVndWxhciBFeHByZXNzaW9ucyBjYW4gYmUgdXNlZCBmb3IgdG9rZW5pemluZyxcbi8vIHZhbGlkYXRpbmcsIGFuZCBwYXJzaW5nIFNlbVZlciB2ZXJzaW9uIHN0cmluZ3MuXG5cbi8vICMjIE51bWVyaWMgSWRlbnRpZmllclxuLy8gQSBzaW5nbGUgYDBgLCBvciBhIG5vbi16ZXJvIGRpZ2l0IGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBkaWdpdHMuXG5cbmNyZWF0ZVRva2VuKCdOVU1FUklDSURFTlRJRklFUicsICcwfFsxLTldXFxcXGQqJylcbmNyZWF0ZVRva2VuKCdOVU1FUklDSURFTlRJRklFUkxPT1NFJywgJ1xcXFxkKycpXG5cbi8vICMjIE5vbi1udW1lcmljIElkZW50aWZpZXJcbi8vIFplcm8gb3IgbW9yZSBkaWdpdHMsIGZvbGxvd2VkIGJ5IGEgbGV0dGVyIG9yIGh5cGhlbiwgYW5kIHRoZW4gemVybyBvclxuLy8gbW9yZSBsZXR0ZXJzLCBkaWdpdHMsIG9yIGh5cGhlbnMuXG5cbmNyZWF0ZVRva2VuKCdOT05OVU1FUklDSURFTlRJRklFUicsIGBcXFxcZCpbYS16QS1aLV0ke0xFVFRFUkRBU0hOVU1CRVJ9KmApXG5cbi8vICMjIE1haW4gVmVyc2lvblxuLy8gVGhyZWUgZG90LXNlcGFyYXRlZCBudW1lcmljIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignTUFJTlZFUlNJT04nLCBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pYClcblxuY3JlYXRlVG9rZW4oJ01BSU5WRVJTSU9OTE9PU0UnLCBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KWApXG5cbi8vICMjIFByZS1yZWxlYXNlIFZlcnNpb24gSWRlbnRpZmllclxuLy8gQSBudW1lcmljIGlkZW50aWZpZXIsIG9yIGEgbm9uLW51bWVyaWMgaWRlbnRpZmllci5cbi8vIE5vbi1udW1iZXJpYyBpZGVudGlmaWVycyBpbmNsdWRlIG51bWJlcmljIGlkZW50aWZpZXJzIGJ1dCBjYW4gYmUgbG9uZ2VyLlxuLy8gVGhlcmVmb3JlIG5vbi1udW1iZXJpYyBpZGVudGlmaWVycyBtdXN0IGdvIGZpcnN0LlxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRUlERU5USUZJRVInLCBgKD86JHtzcmNbdC5OT05OVU1FUklDSURFTlRJRklFUl1cbn18JHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KWApXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFJywgYCg/OiR7c3JjW3QuTk9OTlVNRVJJQ0lERU5USUZJRVJdXG59fCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KWApXG5cbi8vICMjIFByZS1yZWxlYXNlIFZlcnNpb25cbi8vIEh5cGhlbiwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZG90LXNlcGFyYXRlZCBwcmUtcmVsZWFzZSB2ZXJzaW9uXG4vLyBpZGVudGlmaWVycy5cblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0UnLCBgKD86LSgke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSXVxufSg/OlxcXFwuJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUl19KSopKWApXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFTE9PU0UnLCBgKD86LT8oJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFXVxufSg/OlxcXFwuJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFXX0pKikpYClcblxuLy8gIyMgQnVpbGQgTWV0YWRhdGEgSWRlbnRpZmllclxuLy8gQW55IGNvbWJpbmF0aW9uIG9mIGRpZ2l0cywgbGV0dGVycywgb3IgaHlwaGVucy5cblxuY3JlYXRlVG9rZW4oJ0JVSUxESURFTlRJRklFUicsIGAke0xFVFRFUkRBU0hOVU1CRVJ9K2ApXG5cbi8vICMjIEJ1aWxkIE1ldGFkYXRhXG4vLyBQbHVzIHNpZ24sIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBlcmlvZC1zZXBhcmF0ZWQgYnVpbGQgbWV0YWRhdGFcbi8vIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignQlVJTEQnLCBgKD86XFxcXCsoJHtzcmNbdC5CVUlMRElERU5USUZJRVJdXG59KD86XFxcXC4ke3NyY1t0LkJVSUxESURFTlRJRklFUl19KSopKWApXG5cbi8vICMjIEZ1bGwgVmVyc2lvbiBTdHJpbmdcbi8vIEEgbWFpbiB2ZXJzaW9uLCBmb2xsb3dlZCBvcHRpb25hbGx5IGJ5IGEgcHJlLXJlbGVhc2UgdmVyc2lvbiBhbmRcbi8vIGJ1aWxkIG1ldGFkYXRhLlxuXG4vLyBOb3RlIHRoYXQgdGhlIG9ubHkgbWFqb3IsIG1pbm9yLCBwYXRjaCwgYW5kIHByZS1yZWxlYXNlIHNlY3Rpb25zIG9mXG4vLyB0aGUgdmVyc2lvbiBzdHJpbmcgYXJlIGNhcHR1cmluZyBncm91cHMuICBUaGUgYnVpbGQgbWV0YWRhdGEgaXMgbm90IGFcbi8vIGNhcHR1cmluZyBncm91cCwgYmVjYXVzZSBpdCBzaG91bGQgbm90IGV2ZXIgYmUgdXNlZCBpbiB2ZXJzaW9uXG4vLyBjb21wYXJpc29uLlxuXG5jcmVhdGVUb2tlbignRlVMTFBMQUlOJywgYHY/JHtzcmNbdC5NQUlOVkVSU0lPTl1cbn0ke3NyY1t0LlBSRVJFTEVBU0VdfT8ke1xuICBzcmNbdC5CVUlMRF19P2ApXG5cbmNyZWF0ZVRva2VuKCdGVUxMJywgYF4ke3NyY1t0LkZVTExQTEFJTl19JGApXG5cbi8vIGxpa2UgZnVsbCwgYnV0IGFsbG93cyB2MS4yLjMgYW5kID0xLjIuMywgd2hpY2ggcGVvcGxlIGRvIHNvbWV0aW1lcy5cbi8vIGFsc28sIDEuMC4wYWxwaGExIChwcmVyZWxlYXNlIHdpdGhvdXQgdGhlIGh5cGhlbikgd2hpY2ggaXMgcHJldHR5XG4vLyBjb21tb24gaW4gdGhlIG5wbSByZWdpc3RyeS5cbmNyZWF0ZVRva2VuKCdMT09TRVBMQUlOJywgYFt2PVxcXFxzXSoke3NyY1t0Lk1BSU5WRVJTSU9OTE9PU0VdXG59JHtzcmNbdC5QUkVSRUxFQVNFTE9PU0VdfT8ke1xuICBzcmNbdC5CVUlMRF19P2ApXG5cbmNyZWF0ZVRva2VuKCdMT09TRScsIGBeJHtzcmNbdC5MT09TRVBMQUlOXX0kYClcblxuY3JlYXRlVG9rZW4oJ0dUTFQnLCAnKCg/Ojx8Pik/PT8pJylcblxuLy8gU29tZXRoaW5nIGxpa2UgXCIyLipcIiBvciBcIjEuMi54XCIuXG4vLyBOb3RlIHRoYXQgXCJ4LnhcIiBpcyBhIHZhbGlkIHhSYW5nZSBpZGVudGlmZXIsIG1lYW5pbmcgXCJhbnkgdmVyc2lvblwiXG4vLyBPbmx5IHRoZSBmaXJzdCBpdGVtIGlzIHN0cmljdGx5IHJlcXVpcmVkLlxuY3JlYXRlVG9rZW4oJ1hSQU5HRUlERU5USUZJRVJMT09TRScsIGAke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfXx4fFh8XFxcXCpgKVxuY3JlYXRlVG9rZW4oJ1hSQU5HRUlERU5USUZJRVInLCBgJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19fHh8WHxcXFxcKmApXG5cbmNyZWF0ZVRva2VuKCdYUkFOR0VQTEFJTicsIGBbdj1cXFxcc10qKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJdfSlgICtcbiAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuUFJFUkVMRUFTRV19KT8ke1xuICAgICAgICAgICAgICAgICAgICAgc3JjW3QuQlVJTERdfT9gICtcbiAgICAgICAgICAgICAgICAgICBgKT8pP2ApXG5cbmNyZWF0ZVRva2VuKCdYUkFOR0VQTEFJTkxPT1NFJywgYFt2PVxcXFxzXSooJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKD86JHtzcmNbdC5QUkVSRUxFQVNFTE9PU0VdfSk/JHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjW3QuQlVJTERdfT9gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGApPyk/YClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRScsIGBeJHtzcmNbdC5HVExUXX1cXFxccyoke3NyY1t0LlhSQU5HRVBMQUlOXX0kYClcbmNyZWF0ZVRva2VuKCdYUkFOR0VMT09TRScsIGBeJHtzcmNbdC5HVExUXX1cXFxccyoke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSRgKVxuXG4vLyBDb2VyY2lvbi5cbi8vIEV4dHJhY3QgYW55dGhpbmcgdGhhdCBjb3VsZCBjb25jZWl2YWJseSBiZSBhIHBhcnQgb2YgYSB2YWxpZCBzZW12ZXJcbmNyZWF0ZVRva2VuKCdDT0VSQ0VQTEFJTicsIGAkeycoXnxbXlxcXFxkXSknICtcbiAgICAgICAgICAgICAgJyhcXFxcZHsxLCd9JHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pYCArXG4gICAgICAgICAgICAgIGAoPzpcXFxcLihcXFxcZHsxLCR7TUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSH19KSk/YCArXG4gICAgICAgICAgICAgIGAoPzpcXFxcLihcXFxcZHsxLCR7TUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSH19KSk/YClcbmNyZWF0ZVRva2VuKCdDT0VSQ0UnLCBgJHtzcmNbdC5DT0VSQ0VQTEFJTl19KD86JHxbXlxcXFxkXSlgKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRUZVTEwnLCBzcmNbdC5DT0VSQ0VQTEFJTl0gK1xuICAgICAgICAgICAgICBgKD86JHtzcmNbdC5QUkVSRUxFQVNFXX0pP2AgK1xuICAgICAgICAgICAgICBgKD86JHtzcmNbdC5CVUlMRF19KT9gICtcbiAgICAgICAgICAgICAgYCg/OiR8W15cXFxcZF0pYClcbmNyZWF0ZVRva2VuKCdDT0VSQ0VSVEwnLCBzcmNbdC5DT0VSQ0VdLCB0cnVlKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRVJUTEZVTEwnLCBzcmNbdC5DT0VSQ0VGVUxMXSwgdHJ1ZSlcblxuLy8gVGlsZGUgcmFuZ2VzLlxuLy8gTWVhbmluZyBpcyBcInJlYXNvbmFibHkgYXQgb3IgZ3JlYXRlciB0aGFuXCJcbmNyZWF0ZVRva2VuKCdMT05FVElMREUnLCAnKD86fj4/KScpXG5cbmNyZWF0ZVRva2VuKCdUSUxERVRSSU0nLCBgKFxcXFxzKikke3NyY1t0LkxPTkVUSUxERV19XFxcXHMrYCwgdHJ1ZSlcbmV4cG9ydHMudGlsZGVUcmltUmVwbGFjZSA9ICckMX4nXG5cbmNyZWF0ZVRva2VuKCdUSUxERScsIGBeJHtzcmNbdC5MT05FVElMREVdfSR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ1RJTERFTE9PU0UnLCBgXiR7c3JjW3QuTE9ORVRJTERFXX0ke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSRgKVxuXG4vLyBDYXJldCByYW5nZXMuXG4vLyBNZWFuaW5nIGlzIFwiYXQgbGVhc3QgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGhcIlxuY3JlYXRlVG9rZW4oJ0xPTkVDQVJFVCcsICcoPzpcXFxcXiknKVxuXG5jcmVhdGVUb2tlbignQ0FSRVRUUklNJywgYChcXFxccyopJHtzcmNbdC5MT05FQ0FSRVRdfVxcXFxzK2AsIHRydWUpXG5leHBvcnRzLmNhcmV0VHJpbVJlcGxhY2UgPSAnJDFeJ1xuXG5jcmVhdGVUb2tlbignQ0FSRVQnLCBgXiR7c3JjW3QuTE9ORUNBUkVUXX0ke3NyY1t0LlhSQU5HRVBMQUlOXX0kYClcbmNyZWF0ZVRva2VuKCdDQVJFVExPT1NFJywgYF4ke3NyY1t0LkxPTkVDQVJFVF19JHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0kYClcblxuLy8gQSBzaW1wbGUgZ3QvbHQvZXEgdGhpbmcsIG9yIGp1c3QgXCJcIiB0byBpbmRpY2F0ZSBcImFueSB2ZXJzaW9uXCJcbmNyZWF0ZVRva2VuKCdDT01QQVJBVE9STE9PU0UnLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqKCR7c3JjW3QuTE9PU0VQTEFJTl19KSR8XiRgKVxuY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1InLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqKCR7c3JjW3QuRlVMTFBMQUlOXX0pJHxeJGApXG5cbi8vIEFuIGV4cHJlc3Npb24gdG8gc3RyaXAgYW55IHdoaXRlc3BhY2UgYmV0d2VlbiB0aGUgZ3RsdCBhbmQgdGhlIHRoaW5nXG4vLyBpdCBtb2RpZmllcywgc28gdGhhdCBgPiAxLjIuM2AgPT0+IGA+MS4yLjNgXG5jcmVhdGVUb2tlbignQ09NUEFSQVRPUlRSSU0nLCBgKFxcXFxzKikke3NyY1t0LkdUTFRdXG59XFxcXHMqKCR7c3JjW3QuTE9PU0VQTEFJTl19fCR7c3JjW3QuWFJBTkdFUExBSU5dfSlgLCB0cnVlKVxuZXhwb3J0cy5jb21wYXJhdG9yVHJpbVJlcGxhY2UgPSAnJDEkMiQzJ1xuXG4vLyBTb21ldGhpbmcgbGlrZSBgMS4yLjMgLSAxLjIuNGBcbi8vIE5vdGUgdGhhdCB0aGVzZSBhbGwgdXNlIHRoZSBsb29zZSBmb3JtLCBiZWNhdXNlIHRoZXknbGwgYmVcbi8vIGNoZWNrZWQgYWdhaW5zdCBlaXRoZXIgdGhlIHN0cmljdCBvciBsb29zZSBjb21wYXJhdG9yIGZvcm1cbi8vIGxhdGVyLlxuY3JlYXRlVG9rZW4oJ0hZUEhFTlJBTkdFJywgYF5cXFxccyooJHtzcmNbdC5YUkFOR0VQTEFJTl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGBcXFxccystXFxcXHMrYCArXG4gICAgICAgICAgICAgICAgICAgYCgke3NyY1t0LlhSQU5HRVBMQUlOXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYFxcXFxzKiRgKVxuXG5jcmVhdGVUb2tlbignSFlQSEVOUkFOR0VMT09TRScsIGBeXFxcXHMqKCR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYFxcXFxzKy1cXFxccytgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgXFxcXHMqJGApXG5cbi8vIFN0YXIgcmFuZ2VzIGJhc2ljYWxseSBqdXN0IGFsbG93IGFueXRoaW5nIGF0IGFsbC5cbmNyZWF0ZVRva2VuKCdTVEFSJywgJyg8fD4pPz0/XFxcXHMqXFxcXConKVxuLy8gPj0wLjAuMCBpcyBsaWtlIGEgc3RhclxuY3JlYXRlVG9rZW4oJ0dURTAnLCAnXlxcXFxzKj49XFxcXHMqMFxcXFwuMFxcXFwuMFxcXFxzKiQnKVxuY3JlYXRlVG9rZW4oJ0dURTBQUkUnLCAnXlxcXFxzKj49XFxcXHMqMFxcXFwuMFxcXFwuMC0wXFxcXHMqJCcpXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBwYXJzZSBvdXQganVzdCB0aGUgb3B0aW9ucyB3ZSBjYXJlIGFib3V0XG5jb25zdCBsb29zZU9wdGlvbiA9IE9iamVjdC5mcmVlemUoeyBsb29zZTogdHJ1ZSB9KVxuY29uc3QgZW1wdHlPcHRzID0gT2JqZWN0LmZyZWV6ZSh7IH0pXG5jb25zdCBwYXJzZU9wdGlvbnMgPSBvcHRpb25zID0+IHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgcmV0dXJuIGVtcHR5T3B0c1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBsb29zZU9wdGlvblxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnNcbn1cbm1vZHVsZS5leHBvcnRzID0gcGFyc2VPcHRpb25zXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBudW1lcmljID0gL15bMC05XSskL1xuY29uc3QgY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IHtcbiAgY29uc3QgYW51bSA9IG51bWVyaWMudGVzdChhKVxuICBjb25zdCBibnVtID0gbnVtZXJpYy50ZXN0KGIpXG5cbiAgaWYgKGFudW0gJiYgYm51bSkge1xuICAgIGEgPSArYVxuICAgIGIgPSArYlxuICB9XG5cbiAgcmV0dXJuIGEgPT09IGIgPyAwXG4gICAgOiAoYW51bSAmJiAhYm51bSkgPyAtMVxuICAgIDogKGJudW0gJiYgIWFudW0pID8gMVxuICAgIDogYSA8IGIgPyAtMVxuICAgIDogMVxufVxuXG5jb25zdCByY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IGNvbXBhcmVJZGVudGlmaWVycyhiLCBhKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29tcGFyZUlkZW50aWZpZXJzLFxuICByY29tcGFyZUlkZW50aWZpZXJzLFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9kZWJ1ZycpXG5jb25zdCB7IE1BWF9MRU5HVEgsIE1BWF9TQUZFX0lOVEVHRVIgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2NvbnN0YW50cycpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcblxuY29uc3QgcGFyc2VPcHRpb25zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcGFyc2Utb3B0aW9ucycpXG5jb25zdCB7IGNvbXBhcmVJZGVudGlmaWVycyB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvaWRlbnRpZmllcnMnKVxuY2xhc3MgU2VtVmVyIHtcbiAgY29uc3RydWN0b3IgKHZlcnNpb24sIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpXG5cbiAgICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcikge1xuICAgICAgaWYgKHZlcnNpb24ubG9vc2UgPT09ICEhb3B0aW9ucy5sb29zZSAmJlxuICAgICAgICB2ZXJzaW9uLmluY2x1ZGVQcmVyZWxlYXNlID09PSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAgICAgcmV0dXJuIHZlcnNpb25cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnZlcnNpb25cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCB2ZXJzaW9uLiBNdXN0IGJlIGEgc3RyaW5nLiBHb3QgdHlwZSBcIiR7dHlwZW9mIHZlcnNpb259XCIuYClcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbi5sZW5ndGggPiBNQVhfTEVOR1RIKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgdmVyc2lvbiBpcyBsb25nZXIgdGhhbiAke01BWF9MRU5HVEh9IGNoYXJhY3RlcnNgXG4gICAgICApXG4gICAgfVxuXG4gICAgZGVidWcoJ1NlbVZlcicsIHZlcnNpb24sIG9wdGlvbnMpXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIHRoaXMubG9vc2UgPSAhIW9wdGlvbnMubG9vc2VcbiAgICAvLyB0aGlzIGlzbid0IGFjdHVhbGx5IHJlbGV2YW50IGZvciB2ZXJzaW9ucywgYnV0IGtlZXAgaXQgc28gdGhhdCB3ZVxuICAgIC8vIGRvbid0IHJ1biBpbnRvIHRyb3VibGUgcGFzc2luZyB0aGlzLm9wdGlvbnMgYXJvdW5kLlxuICAgIHRoaXMuaW5jbHVkZVByZXJlbGVhc2UgPSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2VcblxuICAgIGNvbnN0IG0gPSB2ZXJzaW9uLnRyaW0oKS5tYXRjaChvcHRpb25zLmxvb3NlID8gcmVbdC5MT09TRV0gOiByZVt0LkZVTExdKVxuXG4gICAgaWYgKCFtKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIFZlcnNpb246ICR7dmVyc2lvbn1gKVxuICAgIH1cblxuICAgIHRoaXMucmF3ID0gdmVyc2lvblxuXG4gICAgLy8gdGhlc2UgYXJlIGFjdHVhbGx5IG51bWJlcnNcbiAgICB0aGlzLm1ham9yID0gK21bMV1cbiAgICB0aGlzLm1pbm9yID0gK21bMl1cbiAgICB0aGlzLnBhdGNoID0gK21bM11cblxuICAgIGlmICh0aGlzLm1ham9yID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLm1ham9yIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBtYWpvciB2ZXJzaW9uJylcbiAgICB9XG5cbiAgICBpZiAodGhpcy5taW5vciA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5taW5vciA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWlub3IgdmVyc2lvbicpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGF0Y2ggPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMucGF0Y2ggPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHBhdGNoIHZlcnNpb24nKVxuICAgIH1cblxuICAgIC8vIG51bWJlcmlmeSBhbnkgcHJlcmVsZWFzZSBudW1lcmljIGlkc1xuICAgIGlmICghbVs0XSkge1xuICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcmVyZWxlYXNlID0gbVs0XS5zcGxpdCgnLicpLm1hcCgoaWQpID0+IHtcbiAgICAgICAgaWYgKC9eWzAtOV0rJC8udGVzdChpZCkpIHtcbiAgICAgICAgICBjb25zdCBudW0gPSAraWRcbiAgICAgICAgICBpZiAobnVtID49IDAgJiYgbnVtIDwgTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICAgICAgcmV0dXJuIG51bVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWRcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5idWlsZCA9IG1bNV0gPyBtWzVdLnNwbGl0KCcuJykgOiBbXVxuICAgIHRoaXMuZm9ybWF0KClcbiAgfVxuXG4gIGZvcm1hdCAoKSB7XG4gICAgdGhpcy52ZXJzaW9uID0gYCR7dGhpcy5tYWpvcn0uJHt0aGlzLm1pbm9yfS4ke3RoaXMucGF0Y2h9YFxuICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICB0aGlzLnZlcnNpb24gKz0gYC0ke3RoaXMucHJlcmVsZWFzZS5qb2luKCcuJyl9YFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy52ZXJzaW9uXG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmVyc2lvblxuICB9XG5cbiAgY29tcGFyZSAob3RoZXIpIHtcbiAgICBkZWJ1ZygnU2VtVmVyLmNvbXBhcmUnLCB0aGlzLnZlcnNpb24sIHRoaXMub3B0aW9ucywgb3RoZXIpXG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBpZiAodHlwZW9mIG90aGVyID09PSAnc3RyaW5nJyAmJiBvdGhlciA9PT0gdGhpcy52ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICBpZiAob3RoZXIudmVyc2lvbiA9PT0gdGhpcy52ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbXBhcmVNYWluKG90aGVyKSB8fCB0aGlzLmNvbXBhcmVQcmUob3RoZXIpXG4gIH1cblxuICBjb21wYXJlTWFpbiAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5tYWpvciwgb3RoZXIubWFqb3IpIHx8XG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5taW5vciwgb3RoZXIubWlub3IpIHx8XG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5wYXRjaCwgb3RoZXIucGF0Y2gpXG4gICAgKVxuICB9XG5cbiAgY29tcGFyZVByZSAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIC8vIE5PVCBoYXZpbmcgYSBwcmVyZWxlYXNlIGlzID4gaGF2aW5nIG9uZVxuICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmICFvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfSBlbHNlIGlmICghdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiBvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIDFcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmICFvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG5cbiAgICBsZXQgaSA9IDBcbiAgICBkbyB7XG4gICAgICBjb25zdCBhID0gdGhpcy5wcmVyZWxlYXNlW2ldXG4gICAgICBjb25zdCBiID0gb3RoZXIucHJlcmVsZWFzZVtpXVxuICAgICAgZGVidWcoJ3ByZXJlbGVhc2UgY29tcGFyZScsIGksIGEsIGIpXG4gICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfSBlbHNlIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfSBlbHNlIGlmIChhID09PSBiKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzKGEsIGIpXG4gICAgICB9XG4gICAgfSB3aGlsZSAoKytpKVxuICB9XG5cbiAgY29tcGFyZUJ1aWxkIChvdGhlcikge1xuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgbGV0IGkgPSAwXG4gICAgZG8ge1xuICAgICAgY29uc3QgYSA9IHRoaXMuYnVpbGRbaV1cbiAgICAgIGNvbnN0IGIgPSBvdGhlci5idWlsZFtpXVxuICAgICAgZGVidWcoJ2J1aWxkIGNvbXBhcmUnLCBpLCBhLCBiKVxuICAgICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0gZWxzZSBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyhhLCBiKVxuICAgICAgfVxuICAgIH0gd2hpbGUgKCsraSlcbiAgfVxuXG4gIC8vIHByZW1pbm9yIHdpbGwgYnVtcCB0aGUgdmVyc2lvbiB1cCB0byB0aGUgbmV4dCBtaW5vciByZWxlYXNlLCBhbmQgaW1tZWRpYXRlbHlcbiAgLy8gZG93biB0byBwcmUtcmVsZWFzZS4gcHJlbWFqb3IgYW5kIHByZXBhdGNoIHdvcmsgdGhlIHNhbWUgd2F5LlxuICBpbmMgKHJlbGVhc2UsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKSB7XG4gICAgaWYgKHJlbGVhc2Uuc3RhcnRzV2l0aCgncHJlJykpIHtcbiAgICAgIGlmICghaWRlbnRpZmllciAmJiBpZGVudGlmaWVyQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogaWRlbnRpZmllciBpcyBlbXB0eScpXG4gICAgICB9XG4gICAgICAvLyBBdm9pZCBhbiBpbnZhbGlkIHNlbXZlciByZXN1bHRzXG4gICAgICBpZiAoaWRlbnRpZmllcikge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGAtJHtpZGVudGlmaWVyfWAubWF0Y2godGhpcy5vcHRpb25zLmxvb3NlID8gcmVbdC5QUkVSRUxFQVNFTE9PU0VdIDogcmVbdC5QUkVSRUxFQVNFXSlcbiAgICAgICAgaWYgKCFtYXRjaCB8fCBtYXRjaFsxXSAhPT0gaWRlbnRpZmllcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpZGVudGlmaWVyOiAke2lkZW50aWZpZXJ9YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAocmVsZWFzZSkge1xuICAgICAgY2FzZSAncHJlbWFqb3InOlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLm1pbm9yID0gMFxuICAgICAgICB0aGlzLm1ham9yKytcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncHJlbWlub3InOlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLm1pbm9yKytcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncHJlcGF0Y2gnOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGFscmVhZHkgYSBwcmVyZWxlYXNlLCBpdCB3aWxsIGJ1bXAgdG8gdGhlIG5leHQgdmVyc2lvblxuICAgICAgICAvLyBkcm9wIGFueSBwcmVyZWxlYXNlcyB0aGF0IG1pZ2h0IGFscmVhZHkgZXhpc3QsIHNpbmNlIHRoZXkgYXJlIG5vdFxuICAgICAgICAvLyByZWxldmFudCBhdCB0aGlzIHBvaW50LlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLmluYygncGF0Y2gnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIGEgbm9uLXByZXJlbGVhc2UgdmVyc2lvbiwgdGhpcyBhY3RzIHRoZSBzYW1lIGFzXG4gICAgICAvLyBwcmVwYXRjaC5cbiAgICAgIGNhc2UgJ3ByZXJlbGVhc2UnOlxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuaW5jKCdwYXRjaCcsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3JlbGVhc2UnOlxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdmVyc2lvbiAke3RoaXMucmF3fSBpcyBub3QgYSBwcmVyZWxlYXNlYClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlICdtYWpvcic6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmUtbWFqb3IgdmVyc2lvbiwgYnVtcCB1cCB0byB0aGUgc2FtZSBtYWpvciB2ZXJzaW9uLlxuICAgICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IG1ham9yLlxuICAgICAgICAvLyAxLjAuMC01IGJ1bXBzIHRvIDEuMC4wXG4gICAgICAgIC8vIDEuMS4wIGJ1bXBzIHRvIDIuMC4wXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLm1pbm9yICE9PSAwIHx8XG4gICAgICAgICAgdGhpcy5wYXRjaCAhPT0gMCB8fFxuICAgICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5tYWpvcisrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5taW5vciA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ21pbm9yJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZS1taW5vciB2ZXJzaW9uLCBidW1wIHVwIHRvIHRoZSBzYW1lIG1pbm9yIHZlcnNpb24uXG4gICAgICAgIC8vIE90aGVyd2lzZSBpbmNyZW1lbnQgbWlub3IuXG4gICAgICAgIC8vIDEuMi4wLTUgYnVtcHMgdG8gMS4yLjBcbiAgICAgICAgLy8gMS4yLjEgYnVtcHMgdG8gMS4zLjBcbiAgICAgICAgaWYgKHRoaXMucGF0Y2ggIT09IDAgfHwgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMubWlub3IrK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwYXRjaCc6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgcHJlLXJlbGVhc2UgdmVyc2lvbiwgaXQgd2lsbCBpbmNyZW1lbnQgdGhlIHBhdGNoLlxuICAgICAgICAvLyBJZiBpdCBpcyBhIHByZS1yZWxlYXNlIGl0IHdpbGwgYnVtcCB1cCB0byB0aGUgc2FtZSBwYXRjaCB2ZXJzaW9uLlxuICAgICAgICAvLyAxLjIuMC01IHBhdGNoZXMgdG8gMS4yLjBcbiAgICAgICAgLy8gMS4yLjAgcGF0Y2hlcyB0byAxLjIuMVxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMucGF0Y2grK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICAvLyBUaGlzIHByb2JhYmx5IHNob3VsZG4ndCBiZSB1c2VkIHB1YmxpY2x5LlxuICAgICAgLy8gMS4wLjAgJ3ByZScgd291bGQgYmVjb21lIDEuMC4wLTAgd2hpY2ggaXMgdGhlIHdyb25nIGRpcmVjdGlvbi5cbiAgICAgIGNhc2UgJ3ByZSc6IHtcbiAgICAgICAgY29uc3QgYmFzZSA9IE51bWJlcihpZGVudGlmaWVyQmFzZSkgPyAxIDogMFxuXG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW2Jhc2VdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGkgPSB0aGlzLnByZXJlbGVhc2UubGVuZ3RoXG4gICAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJlcmVsZWFzZVtpXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlW2ldKytcbiAgICAgICAgICAgICAgaSA9IC0yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpID09PSAtMSkge1xuICAgICAgICAgICAgLy8gZGlkbid0IGluY3JlbWVudCBhbnl0aGluZ1xuICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIgPT09IHRoaXMucHJlcmVsZWFzZS5qb2luKCcuJykgJiYgaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6IGlkZW50aWZpZXIgYWxyZWFkeSBleGlzdHMnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlLnB1c2goYmFzZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkZW50aWZpZXIpIHtcbiAgICAgICAgICAvLyAxLjIuMC1iZXRhLjEgYnVtcHMgdG8gMS4yLjAtYmV0YS4yLFxuICAgICAgICAgIC8vIDEuMi4wLWJldGEuZm9vYmx6IG9yIDEuMi4wLWJldGEgYnVtcHMgdG8gMS4yLjAtYmV0YS4wXG4gICAgICAgICAgbGV0IHByZXJlbGVhc2UgPSBbaWRlbnRpZmllciwgYmFzZV1cbiAgICAgICAgICBpZiAoaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBwcmVyZWxlYXNlID0gW2lkZW50aWZpZXJdXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb21wYXJlSWRlbnRpZmllcnModGhpcy5wcmVyZWxlYXNlWzBdLCBpZGVudGlmaWVyKSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGlzTmFOKHRoaXMucHJlcmVsZWFzZVsxXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gcHJlcmVsZWFzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBwcmVyZWxlYXNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiAke3JlbGVhc2V9YClcbiAgICB9XG4gICAgdGhpcy5yYXcgPSB0aGlzLmZvcm1hdCgpXG4gICAgaWYgKHRoaXMuYnVpbGQubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJhdyArPSBgKyR7dGhpcy5idWlsZC5qb2luKCcuJyl9YFxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2VtVmVyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBwYXJzZSA9ICh2ZXJzaW9uLCBvcHRpb25zLCB0aHJvd0Vycm9ycyA9IGZhbHNlKSA9PiB7XG4gIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgcmV0dXJuIHZlcnNpb25cbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBuZXcgU2VtVmVyKHZlcnNpb24sIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgaWYgKCF0aHJvd0Vycm9ycykge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgdGhyb3cgZXJcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgdmFsaWQgPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB2ID0gcGFyc2UodmVyc2lvbiwgb3B0aW9ucylcbiAgcmV0dXJuIHYgPyB2LnZlcnNpb24gOiBudWxsXG59XG5tb2R1bGUuZXhwb3J0cyA9IHZhbGlkXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgY2xlYW4gPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBzID0gcGFyc2UodmVyc2lvbi50cmltKCkucmVwbGFjZSgvXls9dl0rLywgJycpLCBvcHRpb25zKVxuICByZXR1cm4gcyA/IHMudmVyc2lvbiA6IG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gY2xlYW5cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcblxuY29uc3QgaW5jID0gKHZlcnNpb24sIHJlbGVhc2UsIG9wdGlvbnMsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKSA9PiB7XG4gIGlmICh0eXBlb2YgKG9wdGlvbnMpID09PSAnc3RyaW5nJykge1xuICAgIGlkZW50aWZpZXJCYXNlID0gaWRlbnRpZmllclxuICAgIGlkZW50aWZpZXIgPSBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZFxuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFNlbVZlcihcbiAgICAgIHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIgPyB2ZXJzaW9uLnZlcnNpb24gOiB2ZXJzaW9uLFxuICAgICAgb3B0aW9uc1xuICAgICkuaW5jKHJlbGVhc2UsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKS52ZXJzaW9uXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBpbmNcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZS5qcycpXG5cbmNvbnN0IGRpZmYgPSAodmVyc2lvbjEsIHZlcnNpb24yKSA9PiB7XG4gIGNvbnN0IHYxID0gcGFyc2UodmVyc2lvbjEsIG51bGwsIHRydWUpXG4gIGNvbnN0IHYyID0gcGFyc2UodmVyc2lvbjIsIG51bGwsIHRydWUpXG4gIGNvbnN0IGNvbXBhcmlzb24gPSB2MS5jb21wYXJlKHYyKVxuXG4gIGlmIChjb21wYXJpc29uID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IHYxSGlnaGVyID0gY29tcGFyaXNvbiA+IDBcbiAgY29uc3QgaGlnaFZlcnNpb24gPSB2MUhpZ2hlciA/IHYxIDogdjJcbiAgY29uc3QgbG93VmVyc2lvbiA9IHYxSGlnaGVyID8gdjIgOiB2MVxuICBjb25zdCBoaWdoSGFzUHJlID0gISFoaWdoVmVyc2lvbi5wcmVyZWxlYXNlLmxlbmd0aFxuICBjb25zdCBsb3dIYXNQcmUgPSAhIWxvd1ZlcnNpb24ucHJlcmVsZWFzZS5sZW5ndGhcblxuICBpZiAobG93SGFzUHJlICYmICFoaWdoSGFzUHJlKSB7XG4gICAgLy8gR29pbmcgZnJvbSBwcmVyZWxlYXNlIC0+IG5vIHByZXJlbGVhc2UgcmVxdWlyZXMgc29tZSBzcGVjaWFsIGNhc2luZ1xuXG4gICAgLy8gSWYgdGhlIGxvdyB2ZXJzaW9uIGhhcyBvbmx5IGEgbWFqb3IsIHRoZW4gaXQgd2lsbCBhbHdheXMgYmUgYSBtYWpvclxuICAgIC8vIFNvbWUgZXhhbXBsZXM6XG4gICAgLy8gMS4wLjAtMSAtPiAxLjAuMFxuICAgIC8vIDEuMC4wLTEgLT4gMS4xLjFcbiAgICAvLyAxLjAuMC0xIC0+IDIuMC4wXG4gICAgaWYgKCFsb3dWZXJzaW9uLnBhdGNoICYmICFsb3dWZXJzaW9uLm1pbm9yKSB7XG4gICAgICByZXR1cm4gJ21ham9yJ1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBtYWluIHBhcnQgaGFzIG5vIGRpZmZlcmVuY2VcbiAgICBpZiAobG93VmVyc2lvbi5jb21wYXJlTWFpbihoaWdoVmVyc2lvbikgPT09IDApIHtcbiAgICAgIGlmIChsb3dWZXJzaW9uLm1pbm9yICYmICFsb3dWZXJzaW9uLnBhdGNoKSB7XG4gICAgICAgIHJldHVybiAnbWlub3InXG4gICAgICB9XG4gICAgICByZXR1cm4gJ3BhdGNoJ1xuICAgIH1cbiAgfVxuXG4gIC8vIGFkZCB0aGUgYHByZWAgcHJlZml4IGlmIHdlIGFyZSBnb2luZyB0byBhIHByZXJlbGVhc2UgdmVyc2lvblxuICBjb25zdCBwcmVmaXggPSBoaWdoSGFzUHJlID8gJ3ByZScgOiAnJ1xuXG4gIGlmICh2MS5tYWpvciAhPT0gdjIubWFqb3IpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgJ21ham9yJ1xuICB9XG5cbiAgaWYgKHYxLm1pbm9yICE9PSB2Mi5taW5vcikge1xuICAgIHJldHVybiBwcmVmaXggKyAnbWlub3InXG4gIH1cblxuICBpZiAodjEucGF0Y2ggIT09IHYyLnBhdGNoKSB7XG4gICAgcmV0dXJuIHByZWZpeCArICdwYXRjaCdcbiAgfVxuXG4gIC8vIGhpZ2ggYW5kIGxvdyBhcmUgcHJlbGVhc2VzXG4gIHJldHVybiAncHJlcmVsZWFzZSdcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkaWZmXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBtYWpvciA9IChhLCBsb29zZSkgPT4gbmV3IFNlbVZlcihhLCBsb29zZSkubWFqb3Jcbm1vZHVsZS5leHBvcnRzID0gbWFqb3JcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IG1pbm9yID0gKGEsIGxvb3NlKSA9PiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5taW5vclxubW9kdWxlLmV4cG9ydHMgPSBtaW5vclxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgcGF0Y2ggPSAoYSwgbG9vc2UpID0+IG5ldyBTZW1WZXIoYSwgbG9vc2UpLnBhdGNoXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgcHJlcmVsZWFzZSA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJldHVybiAocGFyc2VkICYmIHBhcnNlZC5wcmVyZWxlYXNlLmxlbmd0aCkgPyBwYXJzZWQucHJlcmVsZWFzZSA6IG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gcHJlcmVsZWFzZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgY29tcGFyZSA9IChhLCBiLCBsb29zZSkgPT5cbiAgbmV3IFNlbVZlcihhLCBsb29zZSkuY29tcGFyZShuZXcgU2VtVmVyKGIsIGxvb3NlKSlcblxubW9kdWxlLmV4cG9ydHMgPSBjb21wYXJlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IHJjb21wYXJlID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGIsIGEsIGxvb3NlKVxubW9kdWxlLmV4cG9ydHMgPSByY29tcGFyZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBjb21wYXJlTG9vc2UgPSAoYSwgYikgPT4gY29tcGFyZShhLCBiLCB0cnVlKVxubW9kdWxlLmV4cG9ydHMgPSBjb21wYXJlTG9vc2VcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGNvbXBhcmVCdWlsZCA9IChhLCBiLCBsb29zZSkgPT4ge1xuICBjb25zdCB2ZXJzaW9uQSA9IG5ldyBTZW1WZXIoYSwgbG9vc2UpXG4gIGNvbnN0IHZlcnNpb25CID0gbmV3IFNlbVZlcihiLCBsb29zZSlcbiAgcmV0dXJuIHZlcnNpb25BLmNvbXBhcmUodmVyc2lvbkIpIHx8IHZlcnNpb25BLmNvbXBhcmVCdWlsZCh2ZXJzaW9uQilcbn1cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZUJ1aWxkXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlQnVpbGQgPSByZXF1aXJlKCcuL2NvbXBhcmUtYnVpbGQnKVxuY29uc3Qgc29ydCA9IChsaXN0LCBsb29zZSkgPT4gbGlzdC5zb3J0KChhLCBiKSA9PiBjb21wYXJlQnVpbGQoYSwgYiwgbG9vc2UpKVxubW9kdWxlLmV4cG9ydHMgPSBzb3J0XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlQnVpbGQgPSByZXF1aXJlKCcuL2NvbXBhcmUtYnVpbGQnKVxuY29uc3QgcnNvcnQgPSAobGlzdCwgbG9vc2UpID0+IGxpc3Quc29ydCgoYSwgYikgPT4gY29tcGFyZUJ1aWxkKGIsIGEsIGxvb3NlKSlcbm1vZHVsZS5leHBvcnRzID0gcnNvcnRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgZ3QgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpID4gMFxubW9kdWxlLmV4cG9ydHMgPSBndFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBsdCA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPCAwXG5tb2R1bGUuZXhwb3J0cyA9IGx0XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGVxID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA9PT0gMFxubW9kdWxlLmV4cG9ydHMgPSBlcVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBuZXEgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpICE9PSAwXG5tb2R1bGUuZXhwb3J0cyA9IG5lcVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBndGUgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpID49IDBcbm1vZHVsZS5leHBvcnRzID0gZ3RlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGx0ZSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPD0gMFxubW9kdWxlLmV4cG9ydHMgPSBsdGVcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGVxID0gcmVxdWlyZSgnLi9lcScpXG5jb25zdCBuZXEgPSByZXF1aXJlKCcuL25lcScpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4vZ3QnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi9ndGUnKVxuY29uc3QgbHQgPSByZXF1aXJlKCcuL2x0JylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4vbHRlJylcblxuY29uc3QgY21wID0gKGEsIG9wLCBiLCBsb29zZSkgPT4ge1xuICBzd2l0Y2ggKG9wKSB7XG4gICAgY2FzZSAnPT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSA9PT0gYlxuXG4gICAgY2FzZSAnIT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSAhPT0gYlxuXG4gICAgY2FzZSAnJzpcbiAgICBjYXNlICc9JzpcbiAgICBjYXNlICc9PSc6XG4gICAgICByZXR1cm4gZXEoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICchPSc6XG4gICAgICByZXR1cm4gbmVxKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPic6XG4gICAgICByZXR1cm4gZ3QoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc+PSc6XG4gICAgICByZXR1cm4gZ3RlKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPCc6XG4gICAgICByZXR1cm4gbHQoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc8PSc6XG4gICAgICByZXR1cm4gbHRlKGEsIGIsIGxvb3NlKVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgb3BlcmF0b3I6ICR7b3B9YClcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBjbXBcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcblxuY29uc3QgY29lcmNlID0gKHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICByZXR1cm4gdmVyc2lvblxuICB9XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnbnVtYmVyJykge1xuICAgIHZlcnNpb24gPSBTdHJpbmcodmVyc2lvbilcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICBsZXQgbWF0Y2ggPSBudWxsXG4gIGlmICghb3B0aW9ucy5ydGwpIHtcbiAgICBtYXRjaCA9IHZlcnNpb24ubWF0Y2gob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHJlW3QuQ09FUkNFRlVMTF0gOiByZVt0LkNPRVJDRV0pXG4gIH0gZWxzZSB7XG4gICAgLy8gRmluZCB0aGUgcmlnaHQtbW9zdCBjb2VyY2libGUgc3RyaW5nIHRoYXQgZG9lcyBub3Qgc2hhcmVcbiAgICAvLyBhIHRlcm1pbnVzIHdpdGggYSBtb3JlIGxlZnQtd2FyZCBjb2VyY2libGUgc3RyaW5nLlxuICAgIC8vIEVnLCAnMS4yLjMuNCcgd2FudHMgdG8gY29lcmNlICcyLjMuNCcsIG5vdCAnMy40JyBvciAnNCdcbiAgICAvLyBXaXRoIGluY2x1ZGVQcmVyZWxlYXNlIG9wdGlvbiBzZXQsICcxLjIuMy40LXJjJyB3YW50cyB0byBjb2VyY2UgJzIuMy40LXJjJywgbm90ICcyLjMuNCdcbiAgICAvL1xuICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgc3RyaW5nIGNoZWNraW5nIHdpdGggYSAvZyByZWdleHBcbiAgICAvLyBNYW51YWxseSBzZXQgdGhlIGluZGV4IHNvIGFzIHRvIHBpY2sgdXAgb3ZlcmxhcHBpbmcgbWF0Y2hlcy5cbiAgICAvLyBTdG9wIHdoZW4gd2UgZ2V0IGEgbWF0Y2ggdGhhdCBlbmRzIGF0IHRoZSBzdHJpbmcgZW5kLCBzaW5jZSBub1xuICAgIC8vIGNvZXJjaWJsZSBzdHJpbmcgY2FuIGJlIG1vcmUgcmlnaHQtd2FyZCB3aXRob3V0IHRoZSBzYW1lIHRlcm1pbnVzLlxuICAgIGNvbnN0IGNvZXJjZVJ0bFJlZ2V4ID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHJlW3QuQ09FUkNFUlRMRlVMTF0gOiByZVt0LkNPRVJDRVJUTF1cbiAgICBsZXQgbmV4dFxuICAgIHdoaWxlICgobmV4dCA9IGNvZXJjZVJ0bFJlZ2V4LmV4ZWModmVyc2lvbikpICYmXG4gICAgICAgICghbWF0Y2ggfHwgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggIT09IHZlcnNpb24ubGVuZ3RoKVxuICAgICkge1xuICAgICAgaWYgKCFtYXRjaCB8fFxuICAgICAgICAgICAgbmV4dC5pbmRleCArIG5leHRbMF0ubGVuZ3RoICE9PSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCkge1xuICAgICAgICBtYXRjaCA9IG5leHRcbiAgICAgIH1cbiAgICAgIGNvZXJjZVJ0bFJlZ2V4Lmxhc3RJbmRleCA9IG5leHQuaW5kZXggKyBuZXh0WzFdLmxlbmd0aCArIG5leHRbMl0ubGVuZ3RoXG4gICAgfVxuICAgIC8vIGxlYXZlIGl0IGluIGEgY2xlYW4gc3RhdGVcbiAgICBjb2VyY2VSdGxSZWdleC5sYXN0SW5kZXggPSAtMVxuICB9XG5cbiAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IG1ham9yID0gbWF0Y2hbMl1cbiAgY29uc3QgbWlub3IgPSBtYXRjaFszXSB8fCAnMCdcbiAgY29uc3QgcGF0Y2ggPSBtYXRjaFs0XSB8fCAnMCdcbiAgY29uc3QgcHJlcmVsZWFzZSA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiYgbWF0Y2hbNV0gPyBgLSR7bWF0Y2hbNV19YCA6ICcnXG4gIGNvbnN0IGJ1aWxkID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBtYXRjaFs2XSA/IGArJHttYXRjaFs2XX1gIDogJydcblxuICByZXR1cm4gcGFyc2UoYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2h9JHtwcmVyZWxlYXNlfSR7YnVpbGR9YCwgb3B0aW9ucylcbn1cbm1vZHVsZS5leHBvcnRzID0gY29lcmNlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jbGFzcyBMUlVDYWNoZSB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICB0aGlzLm1heCA9IDEwMDBcbiAgICB0aGlzLm1hcCA9IG5ldyBNYXAoKVxuICB9XG5cbiAgZ2V0IChrZXkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubWFwLmdldChrZXkpXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBrZXkgZnJvbSB0aGUgbWFwIGFuZCBhZGQgaXQgdG8gdGhlIGVuZFxuICAgICAgdGhpcy5tYXAuZGVsZXRlKGtleSlcbiAgICAgIHRoaXMubWFwLnNldChrZXksIHZhbHVlKVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuICB9XG5cbiAgZGVsZXRlIChrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZGVsZXRlKGtleSlcbiAgfVxuXG4gIHNldCAoa2V5LCB2YWx1ZSkge1xuICAgIGNvbnN0IGRlbGV0ZWQgPSB0aGlzLmRlbGV0ZShrZXkpXG5cbiAgICBpZiAoIWRlbGV0ZWQgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gSWYgY2FjaGUgaXMgZnVsbCwgZGVsZXRlIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGl0ZW1cbiAgICAgIGlmICh0aGlzLm1hcC5zaXplID49IHRoaXMubWF4KSB7XG4gICAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5tYXAua2V5cygpLm5leHQoKS52YWx1ZVxuICAgICAgICB0aGlzLmRlbGV0ZShmaXJzdEtleSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYXAuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IExSVUNhY2hlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTUEFDRV9DSEFSQUNURVJTID0gL1xccysvZ1xuXG4vLyBob2lzdGVkIGNsYXNzIGZvciBjeWNsaWMgZGVwZW5kZW5jeVxuY2xhc3MgUmFuZ2Uge1xuICBjb25zdHJ1Y3RvciAocmFuZ2UsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpXG5cbiAgICBpZiAocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkge1xuICAgICAgaWYgKFxuICAgICAgICByYW5nZS5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlICYmXG4gICAgICAgIHJhbmdlLmluY2x1ZGVQcmVyZWxlYXNlID09PSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gcmFuZ2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2UocmFuZ2UucmF3LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyYW5nZSBpbnN0YW5jZW9mIENvbXBhcmF0b3IpIHtcbiAgICAgIC8vIGp1c3QgcHV0IGl0IGluIHRoZSBzZXQgYW5kIHJldHVyblxuICAgICAgdGhpcy5yYXcgPSByYW5nZS52YWx1ZVxuICAgICAgdGhpcy5zZXQgPSBbW3JhbmdlXV1cbiAgICAgIHRoaXMuZm9ybWF0dGVkID0gdW5kZWZpbmVkXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgdGhpcy5pbmNsdWRlUHJlcmVsZWFzZSA9ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZVxuXG4gICAgLy8gRmlyc3QgcmVkdWNlIGFsbCB3aGl0ZXNwYWNlIGFzIG11Y2ggYXMgcG9zc2libGUgc28gd2UgZG8gbm90IGhhdmUgdG8gcmVseVxuICAgIC8vIG9uIHBvdGVudGlhbGx5IHNsb3cgcmVnZXhlcyBsaWtlIFxccyouIFRoaXMgaXMgdGhlbiBzdG9yZWQgYW5kIHVzZWQgZm9yXG4gICAgLy8gZnV0dXJlIGVycm9yIG1lc3NhZ2VzIGFzIHdlbGwuXG4gICAgdGhpcy5yYXcgPSByYW5nZS50cmltKCkucmVwbGFjZShTUEFDRV9DSEFSQUNURVJTLCAnICcpXG5cbiAgICAvLyBGaXJzdCwgc3BsaXQgb24gfHxcbiAgICB0aGlzLnNldCA9IHRoaXMucmF3XG4gICAgICAuc3BsaXQoJ3x8JylcbiAgICAgIC8vIG1hcCB0aGUgcmFuZ2UgdG8gYSAyZCBhcnJheSBvZiBjb21wYXJhdG9yc1xuICAgICAgLm1hcChyID0+IHRoaXMucGFyc2VSYW5nZShyLnRyaW0oKSkpXG4gICAgICAvLyB0aHJvdyBvdXQgYW55IGNvbXBhcmF0b3IgbGlzdHMgdGhhdCBhcmUgZW1wdHlcbiAgICAgIC8vIHRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgaXQgd2FzIG5vdCBhIHZhbGlkIHJhbmdlLCB3aGljaCBpcyBhbGxvd2VkXG4gICAgICAvLyBpbiBsb29zZSBtb2RlLCBidXQgd2lsbCBzdGlsbCB0aHJvdyBpZiB0aGUgV0hPTEUgcmFuZ2UgaXMgaW52YWxpZC5cbiAgICAgIC5maWx0ZXIoYyA9PiBjLmxlbmd0aClcblxuICAgIGlmICghdGhpcy5zZXQubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIFNlbVZlciBSYW5nZTogJHt0aGlzLnJhd31gKVxuICAgIH1cblxuICAgIC8vIGlmIHdlIGhhdmUgYW55IHRoYXQgYXJlIG5vdCB0aGUgbnVsbCBzZXQsIHRocm93IG91dCBudWxsIHNldHMuXG4gICAgaWYgKHRoaXMuc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIGtlZXAgdGhlIGZpcnN0IG9uZSwgaW4gY2FzZSB0aGV5J3JlIGFsbCBudWxsIHNldHNcbiAgICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5zZXRbMF1cbiAgICAgIHRoaXMuc2V0ID0gdGhpcy5zZXQuZmlsdGVyKGMgPT4gIWlzTnVsbFNldChjWzBdKSlcbiAgICAgIGlmICh0aGlzLnNldC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zZXQgPSBbZmlyc3RdXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbnkgdGhhdCBhcmUgKiwgdGhlbiB0aGUgcmFuZ2UgaXMganVzdCAqXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLnNldCkge1xuICAgICAgICAgIGlmIChjLmxlbmd0aCA9PT0gMSAmJiBpc0FueShjWzBdKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQgPSBbY11cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtYXR0ZWQgPSB1bmRlZmluZWRcbiAgfVxuXG4gIGdldCByYW5nZSAoKSB7XG4gICAgaWYgKHRoaXMuZm9ybWF0dGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZm9ybWF0dGVkID0gJydcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgdGhpcy5mb3JtYXR0ZWQgKz0gJ3x8J1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBzID0gdGhpcy5zZXRbaV1cbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb21wcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgIGlmIChrID4gMCkge1xuICAgICAgICAgICAgdGhpcy5mb3JtYXR0ZWQgKz0gJyAnXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZm9ybWF0dGVkICs9IGNvbXBzW2tdLnRvU3RyaW5nKCkudHJpbSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVkXG4gIH1cblxuICBmb3JtYXQgKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmdlXG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2VcbiAgfVxuXG4gIHBhcnNlUmFuZ2UgKHJhbmdlKSB7XG4gICAgLy8gbWVtb2l6ZSByYW5nZSBwYXJzaW5nIGZvciBwZXJmb3JtYW5jZS5cbiAgICAvLyB0aGlzIGlzIGEgdmVyeSBob3QgcGF0aCwgYW5kIGZ1bGx5IGRldGVybWluaXN0aWMuXG4gICAgY29uc3QgbWVtb09wdHMgPVxuICAgICAgKHRoaXMub3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRSkgfFxuICAgICAgKHRoaXMub3B0aW9ucy5sb29zZSAmJiBGTEFHX0xPT1NFKVxuICAgIGNvbnN0IG1lbW9LZXkgPSBtZW1vT3B0cyArICc6JyArIHJhbmdlXG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KG1lbW9LZXkpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFxuICAgIH1cblxuICAgIGNvbnN0IGxvb3NlID0gdGhpcy5vcHRpb25zLmxvb3NlXG4gICAgLy8gYDEuMi4zIC0gMS4yLjRgID0+IGA+PTEuMi4zIDw9MS4yLjRgXG4gICAgY29uc3QgaHIgPSBsb29zZSA/IHJlW3QuSFlQSEVOUkFOR0VMT09TRV0gOiByZVt0LkhZUEhFTlJBTkdFXVxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShociwgaHlwaGVuUmVwbGFjZSh0aGlzLm9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpKVxuICAgIGRlYnVnKCdoeXBoZW4gcmVwbGFjZScsIHJhbmdlKVxuXG4gICAgLy8gYD4gMS4yLjMgPCAxLjIuNWAgPT4gYD4xLjIuMyA8MS4yLjVgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuQ09NUEFSQVRPUlRSSU1dLCBjb21wYXJhdG9yVHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ2NvbXBhcmF0b3IgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gYH4gMS4yLjNgID0+IGB+MS4yLjNgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuVElMREVUUklNXSwgdGlsZGVUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygndGlsZGUgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gYF4gMS4yLjNgID0+IGBeMS4yLjNgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuQ0FSRVRUUklNXSwgY2FyZXRUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygnY2FyZXQgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIHJhbmdlIGlzIGNvbXBsZXRlbHkgdHJpbW1lZCBhbmRcbiAgICAvLyByZWFkeSB0byBiZSBzcGxpdCBpbnRvIGNvbXBhcmF0b3JzLlxuXG4gICAgbGV0IHJhbmdlTGlzdCA9IHJhbmdlXG4gICAgICAuc3BsaXQoJyAnKVxuICAgICAgLm1hcChjb21wID0+IHBhcnNlQ29tcGFyYXRvcihjb21wLCB0aGlzLm9wdGlvbnMpKVxuICAgICAgLmpvaW4oJyAnKVxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC8vID49MC4wLjAgaXMgZXF1aXZhbGVudCB0byAqXG4gICAgICAubWFwKGNvbXAgPT4gcmVwbGFjZUdURTAoY29tcCwgdGhpcy5vcHRpb25zKSlcblxuICAgIGlmIChsb29zZSkge1xuICAgICAgLy8gaW4gbG9vc2UgbW9kZSwgdGhyb3cgb3V0IGFueSB0aGF0IGFyZSBub3QgdmFsaWQgY29tcGFyYXRvcnNcbiAgICAgIHJhbmdlTGlzdCA9IHJhbmdlTGlzdC5maWx0ZXIoY29tcCA9PiB7XG4gICAgICAgIGRlYnVnKCdsb29zZSBpbnZhbGlkIGZpbHRlcicsIGNvbXAsIHRoaXMub3B0aW9ucylcbiAgICAgICAgcmV0dXJuICEhY29tcC5tYXRjaChyZVt0LkNPTVBBUkFUT1JMT09TRV0pXG4gICAgICB9KVxuICAgIH1cbiAgICBkZWJ1ZygncmFuZ2UgbGlzdCcsIHJhbmdlTGlzdClcblxuICAgIC8vIGlmIGFueSBjb21wYXJhdG9ycyBhcmUgdGhlIG51bGwgc2V0LCB0aGVuIHJlcGxhY2Ugd2l0aCBKVVNUIG51bGwgc2V0XG4gICAgLy8gaWYgbW9yZSB0aGFuIG9uZSBjb21wYXJhdG9yLCByZW1vdmUgYW55ICogY29tcGFyYXRvcnNcbiAgICAvLyBhbHNvLCBkb24ndCBpbmNsdWRlIHRoZSBzYW1lIGNvbXBhcmF0b3IgbW9yZSB0aGFuIG9uY2VcbiAgICBjb25zdCByYW5nZU1hcCA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IGNvbXBhcmF0b3JzID0gcmFuZ2VMaXN0Lm1hcChjb21wID0+IG5ldyBDb21wYXJhdG9yKGNvbXAsIHRoaXMub3B0aW9ucykpXG4gICAgZm9yIChjb25zdCBjb21wIG9mIGNvbXBhcmF0b3JzKSB7XG4gICAgICBpZiAoaXNOdWxsU2V0KGNvbXApKSB7XG4gICAgICAgIHJldHVybiBbY29tcF1cbiAgICAgIH1cbiAgICAgIHJhbmdlTWFwLnNldChjb21wLnZhbHVlLCBjb21wKVxuICAgIH1cbiAgICBpZiAocmFuZ2VNYXAuc2l6ZSA+IDEgJiYgcmFuZ2VNYXAuaGFzKCcnKSkge1xuICAgICAgcmFuZ2VNYXAuZGVsZXRlKCcnKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5yYW5nZU1hcC52YWx1ZXMoKV1cbiAgICBjYWNoZS5zZXQobWVtb0tleSwgcmVzdWx0KVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGludGVyc2VjdHMgKHJhbmdlLCBvcHRpb25zKSB7XG4gICAgaWYgKCEocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgUmFuZ2UgaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldC5zb21lKCh0aGlzQ29tcGFyYXRvcnMpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGlzU2F0aXNmaWFibGUodGhpc0NvbXBhcmF0b3JzLCBvcHRpb25zKSAmJlxuICAgICAgICByYW5nZS5zZXQuc29tZSgocmFuZ2VDb21wYXJhdG9ycykgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpc1NhdGlzZmlhYmxlKHJhbmdlQ29tcGFyYXRvcnMsIG9wdGlvbnMpICYmXG4gICAgICAgICAgICB0aGlzQ29tcGFyYXRvcnMuZXZlcnkoKHRoaXNDb21wYXJhdG9yKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiByYW5nZUNvbXBhcmF0b3JzLmV2ZXJ5KChyYW5nZUNvbXBhcmF0b3IpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc0NvbXBhcmF0b3IuaW50ZXJzZWN0cyhyYW5nZUNvbXBhcmF0b3IsIG9wdGlvbnMpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9KVxuICB9XG5cbiAgLy8gaWYgQU5ZIG9mIHRoZSBzZXRzIG1hdGNoIEFMTCBvZiBpdHMgY29tcGFyYXRvcnMsIHRoZW4gcGFzc1xuICB0ZXN0ICh2ZXJzaW9uKSB7XG4gICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCB0aGlzLm9wdGlvbnMpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGVzdFNldCh0aGlzLnNldFtpXSwgdmVyc2lvbiwgdGhpcy5vcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmdlXG5cbmNvbnN0IExSVSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2xydWNhY2hlJylcbmNvbnN0IGNhY2hlID0gbmV3IExSVSgpXG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3BhcnNlLW9wdGlvbnMnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4vY29tcGFyYXRvcicpXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vc2VtdmVyJylcbmNvbnN0IHtcbiAgc2FmZVJlOiByZSxcbiAgdCxcbiAgY29tcGFyYXRvclRyaW1SZXBsYWNlLFxuICB0aWxkZVRyaW1SZXBsYWNlLFxuICBjYXJldFRyaW1SZXBsYWNlLFxufSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcbmNvbnN0IHsgRkxBR19JTkNMVURFX1BSRVJFTEVBU0UsIEZMQUdfTE9PU0UgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2NvbnN0YW50cycpXG5cbmNvbnN0IGlzTnVsbFNldCA9IGMgPT4gYy52YWx1ZSA9PT0gJzwwLjAuMC0wJ1xuY29uc3QgaXNBbnkgPSBjID0+IGMudmFsdWUgPT09ICcnXG5cbi8vIHRha2UgYSBzZXQgb2YgY29tcGFyYXRvcnMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZXJlXG4vLyBleGlzdHMgYSB2ZXJzaW9uIHdoaWNoIGNhbiBzYXRpc2Z5IGl0XG5jb25zdCBpc1NhdGlzZmlhYmxlID0gKGNvbXBhcmF0b3JzLCBvcHRpb25zKSA9PiB7XG4gIGxldCByZXN1bHQgPSB0cnVlXG4gIGNvbnN0IHJlbWFpbmluZ0NvbXBhcmF0b3JzID0gY29tcGFyYXRvcnMuc2xpY2UoKVxuICBsZXQgdGVzdENvbXBhcmF0b3IgPSByZW1haW5pbmdDb21wYXJhdG9ycy5wb3AoKVxuXG4gIHdoaWxlIChyZXN1bHQgJiYgcmVtYWluaW5nQ29tcGFyYXRvcnMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ID0gcmVtYWluaW5nQ29tcGFyYXRvcnMuZXZlcnkoKG90aGVyQ29tcGFyYXRvcikgPT4ge1xuICAgICAgcmV0dXJuIHRlc3RDb21wYXJhdG9yLmludGVyc2VjdHMob3RoZXJDb21wYXJhdG9yLCBvcHRpb25zKVxuICAgIH0pXG5cbiAgICB0ZXN0Q29tcGFyYXRvciA9IHJlbWFpbmluZ0NvbXBhcmF0b3JzLnBvcCgpXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIGNvbXByaXNlZCBvZiB4cmFuZ2VzLCB0aWxkZXMsIHN0YXJzLCBhbmQgZ3RsdCdzIGF0IHRoaXMgcG9pbnQuXG4vLyBhbHJlYWR5IHJlcGxhY2VkIHRoZSBoeXBoZW4gcmFuZ2VzXG4vLyB0dXJuIGludG8gYSBzZXQgb2YgSlVTVCBjb21wYXJhdG9ycy5cbmNvbnN0IHBhcnNlQ29tcGFyYXRvciA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdjb21wJywgY29tcCwgb3B0aW9ucylcbiAgY29tcCA9IHJlcGxhY2VDYXJldHMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ2NhcmV0JywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VUaWxkZXMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ3RpbGRlcycsIGNvbXApXG4gIGNvbXAgPSByZXBsYWNlWFJhbmdlcyhjb21wLCBvcHRpb25zKVxuICBkZWJ1ZygneHJhbmdlJywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VTdGFycyhjb21wLCBvcHRpb25zKVxuICBkZWJ1Zygnc3RhcnMnLCBjb21wKVxuICByZXR1cm4gY29tcFxufVxuXG5jb25zdCBpc1ggPSBpZCA9PiAhaWQgfHwgaWQudG9Mb3dlckNhc2UoKSA9PT0gJ3gnIHx8IGlkID09PSAnKidcblxuLy8gfiwgfj4gLS0+ICogKGFueSwga2luZGEgc2lsbHkpXG4vLyB+MiwgfjIueCwgfjIueC54LCB+PjIsIH4+Mi54IH4+Mi54LnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIH4yLjAsIH4yLjAueCwgfj4yLjAsIH4+Mi4wLnggLS0+ID49Mi4wLjAgPDIuMS4wLTBcbi8vIH4xLjIsIH4xLjIueCwgfj4xLjIsIH4+MS4yLnggLS0+ID49MS4yLjAgPDEuMy4wLTBcbi8vIH4xLjIuMywgfj4xLjIuMyAtLT4gPj0xLjIuMyA8MS4zLjAtMFxuLy8gfjEuMi4wLCB+PjEuMi4wIC0tPiA+PTEuMi4wIDwxLjMuMC0wXG4vLyB+MC4wLjEgLS0+ID49MC4wLjEgPDAuMS4wLTBcbmNvbnN0IHJlcGxhY2VUaWxkZXMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VUaWxkZShjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VUaWxkZSA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5USUxERUxPT1NFXSA6IHJlW3QuVElMREVdXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKF8sIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ3RpbGRlJywgY29tcCwgXywgTSwgbSwgcCwgcHIpXG4gICAgbGV0IHJldFxuXG4gICAgaWYgKGlzWChNKSkge1xuICAgICAgcmV0ID0gJydcbiAgICB9IGVsc2UgaWYgKGlzWChtKSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAgPCR7K00gKyAxfS4wLjAtMGBcbiAgICB9IGVsc2UgaWYgKGlzWChwKSkge1xuICAgICAgLy8gfjEuMiA9PSA+PTEuMi4wIDwxLjMuMC0wXG4gICAgICByZXQgPSBgPj0ke019LiR7bX0uMCA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH0gZWxzZSBpZiAocHIpIHtcbiAgICAgIGRlYnVnKCdyZXBsYWNlVGlsZGUgcHInLCBwcilcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gfjEuMi4zID09ID49MS4yLjMgPDEuMy4wLTBcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9XG5cbiAgICBkZWJ1ZygndGlsZGUgcmV0dXJuJywgcmV0KVxuICAgIHJldHVybiByZXRcbiAgfSlcbn1cblxuLy8gXiAtLT4gKiAoYW55LCBraW5kYSBzaWxseSlcbi8vIF4yLCBeMi54LCBeMi54LnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIF4yLjAsIF4yLjAueCAtLT4gPj0yLjAuMCA8My4wLjAtMFxuLy8gXjEuMiwgXjEuMi54IC0tPiA+PTEuMi4wIDwyLjAuMC0wXG4vLyBeMS4yLjMgLS0+ID49MS4yLjMgPDIuMC4wLTBcbi8vIF4xLjIuMCAtLT4gPj0xLjIuMCA8Mi4wLjAtMFxuLy8gXjAuMC4xIC0tPiA+PTAuMC4xIDwwLjAuMi0wXG4vLyBeMC4xLjAgLS0+ID49MC4xLjAgPDAuMi4wLTBcbmNvbnN0IHJlcGxhY2VDYXJldHMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VDYXJldChjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VDYXJldCA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdjYXJldCcsIGNvbXAsIG9wdGlvbnMpXG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5DQVJFVExPT1NFXSA6IHJlW3QuQ0FSRVRdXG4gIGNvbnN0IHogPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gJy0wJyA6ICcnXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKF8sIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ2NhcmV0JywgY29tcCwgXywgTSwgbSwgcCwgcHIpXG4gICAgbGV0IHJldFxuXG4gICAgaWYgKGlzWChNKSkge1xuICAgICAgcmV0ID0gJydcbiAgICB9IGVsc2UgaWYgKGlzWChtKSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAke3p9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgfSBlbHNlIGlmIChpc1gocCkpIHtcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAke3p9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uMCR7en0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByKSB7XG4gICAgICBkZWJ1ZygncmVwbGFjZUNhcmV0IHByJywgcHIpXG4gICAgICBpZiAoTSA9PT0gJzAnKSB7XG4gICAgICAgIGlmIChtID09PSAnMCcpIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwfS0ke3ByXG4gICAgICAgICAgfSA8JHtNfS4ke219LiR7K3AgKyAxfS0wYFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Zygnbm8gcHInKVxuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICBpZiAobSA9PT0gJzAnKSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICAgIH0ke3p9IDwke019LiR7bX0uJHsrcCArIDF9LTBgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICAgIH0ke3p9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgICAgfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH1cblxuICAgIGRlYnVnKCdjYXJldCByZXR1cm4nLCByZXQpXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG5jb25zdCByZXBsYWNlWFJhbmdlcyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdyZXBsYWNlWFJhbmdlcycsIGNvbXAsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChjKSA9PiByZXBsYWNlWFJhbmdlKGMsIG9wdGlvbnMpKVxuICAgIC5qb2luKCcgJylcbn1cblxuY29uc3QgcmVwbGFjZVhSYW5nZSA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGNvbXAgPSBjb21wLnRyaW0oKVxuICBjb25zdCByID0gb3B0aW9ucy5sb29zZSA/IHJlW3QuWFJBTkdFTE9PU0VdIDogcmVbdC5YUkFOR0VdXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKHJldCwgZ3RsdCwgTSwgbSwgcCwgcHIpID0+IHtcbiAgICBkZWJ1ZygneFJhbmdlJywgY29tcCwgcmV0LCBndGx0LCBNLCBtLCBwLCBwcilcbiAgICBjb25zdCB4TSA9IGlzWChNKVxuICAgIGNvbnN0IHhtID0geE0gfHwgaXNYKG0pXG4gICAgY29uc3QgeHAgPSB4bSB8fCBpc1gocClcbiAgICBjb25zdCBhbnlYID0geHBcblxuICAgIGlmIChndGx0ID09PSAnPScgJiYgYW55WCkge1xuICAgICAgZ3RsdCA9ICcnXG4gICAgfVxuXG4gICAgLy8gaWYgd2UncmUgaW5jbHVkaW5nIHByZXJlbGVhc2VzIGluIHRoZSBtYXRjaCwgdGhlbiB3ZSBuZWVkXG4gICAgLy8gdG8gZml4IHRoaXMgdG8gLTAsIHRoZSBsb3dlc3QgcG9zc2libGUgcHJlcmVsZWFzZSB2YWx1ZVxuICAgIHByID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/ICctMCcgOiAnJ1xuXG4gICAgaWYgKHhNKSB7XG4gICAgICBpZiAoZ3RsdCA9PT0gJz4nIHx8IGd0bHQgPT09ICc8Jykge1xuICAgICAgICAvLyBub3RoaW5nIGlzIGFsbG93ZWRcbiAgICAgICAgcmV0ID0gJzwwLjAuMC0wJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm90aGluZyBpcyBmb3JiaWRkZW5cbiAgICAgICAgcmV0ID0gJyonXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChndGx0ICYmIGFueVgpIHtcbiAgICAgIC8vIHdlIGtub3cgcGF0Y2ggaXMgYW4geCwgYmVjYXVzZSB3ZSBoYXZlIGFueSB4IGF0IGFsbC5cbiAgICAgIC8vIHJlcGxhY2UgWCB3aXRoIDBcbiAgICAgIGlmICh4bSkge1xuICAgICAgICBtID0gMFxuICAgICAgfVxuICAgICAgcCA9IDBcblxuICAgICAgaWYgKGd0bHQgPT09ICc+Jykge1xuICAgICAgICAvLyA+MSA9PiA+PTIuMC4wXG4gICAgICAgIC8vID4xLjIgPT4gPj0xLjMuMFxuICAgICAgICBndGx0ID0gJz49J1xuICAgICAgICBpZiAoeG0pIHtcbiAgICAgICAgICBNID0gK00gKyAxXG4gICAgICAgICAgbSA9IDBcbiAgICAgICAgICBwID0gMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0gPSArbSArIDFcbiAgICAgICAgICBwID0gMFxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGd0bHQgPT09ICc8PScpIHtcbiAgICAgICAgLy8gPD0wLjcueCBpcyBhY3R1YWxseSA8MC44LjAsIHNpbmNlIGFueSAwLjcueCBzaG91bGRcbiAgICAgICAgLy8gcGFzcy4gIFNpbWlsYXJseSwgPD03LnggaXMgYWN0dWFsbHkgPDguMC4wLCBldGMuXG4gICAgICAgIGd0bHQgPSAnPCdcbiAgICAgICAgaWYgKHhtKSB7XG4gICAgICAgICAgTSA9ICtNICsgMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0gPSArbSArIDFcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZ3RsdCA9PT0gJzwnKSB7XG4gICAgICAgIHByID0gJy0wJ1xuICAgICAgfVxuXG4gICAgICByZXQgPSBgJHtndGx0ICsgTX0uJHttfS4ke3B9JHtwcn1gXG4gICAgfSBlbHNlIGlmICh4bSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAke3ByfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgIH0gZWxzZSBpZiAoeHApIHtcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wJHtwclxuICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH1cblxuICAgIGRlYnVnKCd4UmFuZ2UgcmV0dXJuJywgcmV0KVxuXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG4vLyBCZWNhdXNlICogaXMgQU5ELWVkIHdpdGggZXZlcnl0aGluZyBlbHNlIGluIHRoZSBjb21wYXJhdG9yLFxuLy8gYW5kICcnIG1lYW5zIFwiYW55IHZlcnNpb25cIiwganVzdCByZW1vdmUgdGhlICpzIGVudGlyZWx5LlxuY29uc3QgcmVwbGFjZVN0YXJzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ3JlcGxhY2VTdGFycycsIGNvbXAsIG9wdGlvbnMpXG4gIC8vIExvb3NlbmVzcyBpcyBpZ25vcmVkIGhlcmUuICBzdGFyIGlzIGFsd2F5cyBhcyBsb29zZSBhcyBpdCBnZXRzIVxuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAucmVwbGFjZShyZVt0LlNUQVJdLCAnJylcbn1cblxuY29uc3QgcmVwbGFjZUdURTAgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygncmVwbGFjZUdURTAnLCBjb21wLCBvcHRpb25zKVxuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAucmVwbGFjZShyZVtvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gdC5HVEUwUFJFIDogdC5HVEUwXSwgJycpXG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHN0cmluZy5yZXBsYWNlKHJlW3QuSFlQSEVOUkFOR0VdKVxuLy8gTSwgbSwgcGF0Y2gsIHByZXJlbGVhc2UsIGJ1aWxkXG4vLyAxLjIgLSAzLjQuNSA9PiA+PTEuMi4wIDw9My40LjVcbi8vIDEuMi4zIC0gMy40ID0+ID49MS4yLjAgPDMuNS4wLTAgQW55IDMuNC54IHdpbGwgZG9cbi8vIDEuMiAtIDMuNCA9PiA+PTEuMi4wIDwzLjUuMC0wXG4vLyBUT0RPIGJ1aWxkP1xuY29uc3QgaHlwaGVuUmVwbGFjZSA9IGluY1ByID0+ICgkMCxcbiAgZnJvbSwgZk0sIGZtLCBmcCwgZnByLCBmYixcbiAgdG8sIHRNLCB0bSwgdHAsIHRwcikgPT4ge1xuICBpZiAoaXNYKGZNKSkge1xuICAgIGZyb20gPSAnJ1xuICB9IGVsc2UgaWYgKGlzWChmbSkpIHtcbiAgICBmcm9tID0gYD49JHtmTX0uMC4wJHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH0gZWxzZSBpZiAoaXNYKGZwKSkge1xuICAgIGZyb20gPSBgPj0ke2ZNfS4ke2ZtfS4wJHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH0gZWxzZSBpZiAoZnByKSB7XG4gICAgZnJvbSA9IGA+PSR7ZnJvbX1gXG4gIH0gZWxzZSB7XG4gICAgZnJvbSA9IGA+PSR7ZnJvbX0ke2luY1ByID8gJy0wJyA6ICcnfWBcbiAgfVxuXG4gIGlmIChpc1godE0pKSB7XG4gICAgdG8gPSAnJ1xuICB9IGVsc2UgaWYgKGlzWCh0bSkpIHtcbiAgICB0byA9IGA8JHsrdE0gKyAxfS4wLjAtMGBcbiAgfSBlbHNlIGlmIChpc1godHApKSB7XG4gICAgdG8gPSBgPCR7dE19LiR7K3RtICsgMX0uMC0wYFxuICB9IGVsc2UgaWYgKHRwcikge1xuICAgIHRvID0gYDw9JHt0TX0uJHt0bX0uJHt0cH0tJHt0cHJ9YFxuICB9IGVsc2UgaWYgKGluY1ByKSB7XG4gICAgdG8gPSBgPCR7dE19LiR7dG19LiR7K3RwICsgMX0tMGBcbiAgfSBlbHNlIHtcbiAgICB0byA9IGA8PSR7dG99YFxuICB9XG5cbiAgcmV0dXJuIGAke2Zyb219ICR7dG99YC50cmltKClcbn1cblxuY29uc3QgdGVzdFNldCA9IChzZXQsIHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIXNldFtpXS50ZXN0KHZlcnNpb24pKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBpZiAodmVyc2lvbi5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgIC8vIEZpbmQgdGhlIHNldCBvZiB2ZXJzaW9ucyB0aGF0IGFyZSBhbGxvd2VkIHRvIGhhdmUgcHJlcmVsZWFzZXNcbiAgICAvLyBGb3IgZXhhbXBsZSwgXjEuMi4zLXByLjEgZGVzdWdhcnMgdG8gPj0xLjIuMy1wci4xIDwyLjAuMFxuICAgIC8vIFRoYXQgc2hvdWxkIGFsbG93IGAxLjIuMy1wci4yYCB0byBwYXNzLlxuICAgIC8vIEhvd2V2ZXIsIGAxLjIuNC1hbHBoYS5ub3RyZWFkeWAgc2hvdWxkIE5PVCBiZSBhbGxvd2VkLFxuICAgIC8vIGV2ZW4gdGhvdWdoIGl0J3Mgd2l0aGluIHRoZSByYW5nZSBzZXQgYnkgdGhlIGNvbXBhcmF0b3JzLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWJ1ZyhzZXRbaV0uc2VtdmVyKVxuICAgICAgaWYgKHNldFtpXS5zZW12ZXIgPT09IENvbXBhcmF0b3IuQU5ZKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChzZXRbaV0uc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBhbGxvd2VkID0gc2V0W2ldLnNlbXZlclxuICAgICAgICBpZiAoYWxsb3dlZC5tYWpvciA9PT0gdmVyc2lvbi5tYWpvciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5taW5vciA9PT0gdmVyc2lvbi5taW5vciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5wYXRjaCA9PT0gdmVyc2lvbi5wYXRjaCkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWZXJzaW9uIGhhcyBhIC1wcmUsIGJ1dCBpdCdzIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2UgbGlrZS5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBBTlkgPSBTeW1ib2woJ1NlbVZlciBBTlknKVxuLy8gaG9pc3RlZCBjbGFzcyBmb3IgY3ljbGljIGRlcGVuZGVuY3lcbmNsYXNzIENvbXBhcmF0b3Ige1xuICBzdGF0aWMgZ2V0IEFOWSAoKSB7XG4gICAgcmV0dXJuIEFOWVxuICB9XG5cbiAgY29uc3RydWN0b3IgKGNvbXAsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpXG5cbiAgICBpZiAoY29tcCBpbnN0YW5jZW9mIENvbXBhcmF0b3IpIHtcbiAgICAgIGlmIChjb21wLmxvb3NlID09PSAhIW9wdGlvbnMubG9vc2UpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXAgPSBjb21wLnZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcCA9IGNvbXAudHJpbSgpLnNwbGl0KC9cXHMrLykuam9pbignICcpXG4gICAgZGVidWcoJ2NvbXBhcmF0b3InLCBjb21wLCBvcHRpb25zKVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgdGhpcy5wYXJzZShjb21wKVxuXG4gICAgaWYgKHRoaXMuc2VtdmVyID09PSBBTlkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSAnJ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5vcGVyYXRvciArIHRoaXMuc2VtdmVyLnZlcnNpb25cbiAgICB9XG5cbiAgICBkZWJ1ZygnY29tcCcsIHRoaXMpXG4gIH1cblxuICBwYXJzZSAoY29tcCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLm9wdGlvbnMubG9vc2UgPyByZVt0LkNPTVBBUkFUT1JMT09TRV0gOiByZVt0LkNPTVBBUkFUT1JdXG4gICAgY29uc3QgbSA9IGNvbXAubWF0Y2gocilcblxuICAgIGlmICghbSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBjb21wYXJhdG9yOiAke2NvbXB9YClcbiAgICB9XG5cbiAgICB0aGlzLm9wZXJhdG9yID0gbVsxXSAhPT0gdW5kZWZpbmVkID8gbVsxXSA6ICcnXG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICc9Jykge1xuICAgICAgdGhpcy5vcGVyYXRvciA9ICcnXG4gICAgfVxuXG4gICAgLy8gaWYgaXQgbGl0ZXJhbGx5IGlzIGp1c3QgJz4nIG9yICcnIHRoZW4gYWxsb3cgYW55dGhpbmcuXG4gICAgaWYgKCFtWzJdKSB7XG4gICAgICB0aGlzLnNlbXZlciA9IEFOWVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbXZlciA9IG5ldyBTZW1WZXIobVsyXSwgdGhpcy5vcHRpb25zLmxvb3NlKVxuICAgIH1cbiAgfVxuXG4gIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZVxuICB9XG5cbiAgdGVzdCAodmVyc2lvbikge1xuICAgIGRlYnVnKCdDb21wYXJhdG9yLnRlc3QnLCB2ZXJzaW9uLCB0aGlzLm9wdGlvbnMubG9vc2UpXG5cbiAgICBpZiAodGhpcy5zZW12ZXIgPT09IEFOWSB8fCB2ZXJzaW9uID09PSBBTlkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgdGhpcy5vcHRpb25zKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNtcCh2ZXJzaW9uLCB0aGlzLm9wZXJhdG9yLCB0aGlzLnNlbXZlciwgdGhpcy5vcHRpb25zKVxuICB9XG5cbiAgaW50ZXJzZWN0cyAoY29tcCwgb3B0aW9ucykge1xuICAgIGlmICghKGNvbXAgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYSBDb21wYXJhdG9yIGlzIHJlcXVpcmVkJylcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJycpIHtcbiAgICAgIGlmICh0aGlzLnZhbHVlID09PSAnJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSYW5nZShjb21wLnZhbHVlLCBvcHRpb25zKS50ZXN0KHRoaXMudmFsdWUpXG4gICAgfSBlbHNlIGlmIChjb21wLm9wZXJhdG9yID09PSAnJykge1xuICAgICAgaWYgKGNvbXAudmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJhbmdlKHRoaXMudmFsdWUsIG9wdGlvbnMpLnRlc3QoY29tcC5zZW12ZXIpXG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgLy8gU3BlY2lhbCBjYXNlcyB3aGVyZSBub3RoaW5nIGNhbiBwb3NzaWJseSBiZSBsb3dlclxuICAgIGlmIChvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmXG4gICAgICAodGhpcy52YWx1ZSA9PT0gJzwwLjAuMC0wJyB8fCBjb21wLnZhbHVlID09PSAnPDAuMC4wLTAnKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgICAgKHRoaXMudmFsdWUuc3RhcnRzV2l0aCgnPDAuMC4wJykgfHwgY29tcC52YWx1ZS5zdGFydHNXaXRoKCc8MC4wLjAnKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIFNhbWUgZGlyZWN0aW9uIGluY3JlYXNpbmcgKD4gb3IgPj0pXG4gICAgaWYgKHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBTYW1lIGRpcmVjdGlvbiBkZWNyZWFzaW5nICg8IG9yIDw9KVxuICAgIGlmICh0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJzwnKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJzwnKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gc2FtZSBTZW1WZXIgYW5kIGJvdGggc2lkZXMgYXJlIGluY2x1c2l2ZSAoPD0gb3IgPj0pXG4gICAgaWYgKFxuICAgICAgKHRoaXMuc2VtdmVyLnZlcnNpb24gPT09IGNvbXAuc2VtdmVyLnZlcnNpb24pICYmXG4gICAgICB0aGlzLm9wZXJhdG9yLmluY2x1ZGVzKCc9JykgJiYgY29tcC5vcGVyYXRvci5pbmNsdWRlcygnPScpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBvcHBvc2l0ZSBkaXJlY3Rpb25zIGxlc3MgdGhhblxuICAgIGlmIChjbXAodGhpcy5zZW12ZXIsICc8JywgY29tcC5zZW12ZXIsIG9wdGlvbnMpICYmXG4gICAgICB0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJzwnKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gb3Bwb3NpdGUgZGlyZWN0aW9ucyBncmVhdGVyIHRoYW5cbiAgICBpZiAoY21wKHRoaXMuc2VtdmVyLCAnPicsIGNvbXAuc2VtdmVyLCBvcHRpb25zKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29tcGFyYXRvclxuXG5jb25zdCBwYXJzZU9wdGlvbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9wYXJzZS1vcHRpb25zJylcbmNvbnN0IHsgc2FmZVJlOiByZSwgdCB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuY29uc3QgY21wID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2NtcCcpXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi9yYW5nZScpXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3Qgc2F0aXNmaWVzID0gKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIHRyeSB7XG4gICAgcmFuZ2UgPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHJhbmdlLnRlc3QodmVyc2lvbilcbn1cbm1vZHVsZS5leHBvcnRzID0gc2F0aXNmaWVzXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuXG4vLyBNb3N0bHkganVzdCBmb3IgdGVzdGluZyBhbmQgbGVnYWN5IEFQSSByZWFzb25zXG5jb25zdCB0b0NvbXBhcmF0b3JzID0gKHJhbmdlLCBvcHRpb25zKSA9PlxuICBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpLnNldFxuICAgIC5tYXAoY29tcCA9PiBjb21wLm1hcChjID0+IGMudmFsdWUpLmpvaW4oJyAnKS50cmltKCkuc3BsaXQoJyAnKSlcblxubW9kdWxlLmV4cG9ydHMgPSB0b0NvbXBhcmF0b3JzXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuXG5jb25zdCBtYXhTYXRpc2Z5aW5nID0gKHZlcnNpb25zLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICBsZXQgbWF4ID0gbnVsbFxuICBsZXQgbWF4U1YgPSBudWxsXG4gIGxldCByYW5nZU9iaiA9IG51bGxcbiAgdHJ5IHtcbiAgICByYW5nZU9iaiA9IG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHZlcnNpb25zLmZvckVhY2goKHYpID0+IHtcbiAgICBpZiAocmFuZ2VPYmoudGVzdCh2KSkge1xuICAgICAgLy8gc2F0aXNmaWVzKHYsIHJhbmdlLCBvcHRpb25zKVxuICAgICAgaWYgKCFtYXggfHwgbWF4U1YuY29tcGFyZSh2KSA9PT0gLTEpIHtcbiAgICAgICAgLy8gY29tcGFyZShtYXgsIHYsIHRydWUpXG4gICAgICAgIG1heCA9IHZcbiAgICAgICAgbWF4U1YgPSBuZXcgU2VtVmVyKG1heCwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiBtYXhcbn1cbm1vZHVsZS5leHBvcnRzID0gbWF4U2F0aXNmeWluZ1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IG1pblNhdGlzZnlpbmcgPSAodmVyc2lvbnMsIHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIGxldCBtaW4gPSBudWxsXG4gIGxldCBtaW5TViA9IG51bGxcbiAgbGV0IHJhbmdlT2JqID0gbnVsbFxuICB0cnkge1xuICAgIHJhbmdlT2JqID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgdmVyc2lvbnMuZm9yRWFjaCgodikgPT4ge1xuICAgIGlmIChyYW5nZU9iai50ZXN0KHYpKSB7XG4gICAgICAvLyBzYXRpc2ZpZXModiwgcmFuZ2UsIG9wdGlvbnMpXG4gICAgICBpZiAoIW1pbiB8fCBtaW5TVi5jb21wYXJlKHYpID09PSAxKSB7XG4gICAgICAgIC8vIGNvbXBhcmUobWluLCB2LCB0cnVlKVxuICAgICAgICBtaW4gPSB2XG4gICAgICAgIG1pblNWID0gbmV3IFNlbVZlcihtaW4sIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gbWluXG59XG5tb2R1bGUuZXhwb3J0cyA9IG1pblNhdGlzZnlpbmdcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndCcpXG5cbmNvbnN0IG1pblZlcnNpb24gPSAocmFuZ2UsIGxvb3NlKSA9PiB7XG4gIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSlcblxuICBsZXQgbWludmVyID0gbmV3IFNlbVZlcignMC4wLjAnKVxuICBpZiAocmFuZ2UudGVzdChtaW52ZXIpKSB7XG4gICAgcmV0dXJuIG1pbnZlclxuICB9XG5cbiAgbWludmVyID0gbmV3IFNlbVZlcignMC4wLjAtMCcpXG4gIGlmIChyYW5nZS50ZXN0KG1pbnZlcikpIHtcbiAgICByZXR1cm4gbWludmVyXG4gIH1cblxuICBtaW52ZXIgPSBudWxsXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2Uuc2V0Lmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSByYW5nZS5zZXRbaV1cblxuICAgIGxldCBzZXRNaW4gPSBudWxsXG4gICAgY29tcGFyYXRvcnMuZm9yRWFjaCgoY29tcGFyYXRvcikgPT4ge1xuICAgICAgLy8gQ2xvbmUgdG8gYXZvaWQgbWFuaXB1bGF0aW5nIHRoZSBjb21wYXJhdG9yJ3Mgc2VtdmVyIG9iamVjdC5cbiAgICAgIGNvbnN0IGNvbXB2ZXIgPSBuZXcgU2VtVmVyKGNvbXBhcmF0b3Iuc2VtdmVyLnZlcnNpb24pXG4gICAgICBzd2l0Y2ggKGNvbXBhcmF0b3Iub3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgaWYgKGNvbXB2ZXIucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbXB2ZXIucGF0Y2grK1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21wdmVyLnByZXJlbGVhc2UucHVzaCgwKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb21wdmVyLnJhdyA9IGNvbXB2ZXIuZm9ybWF0KClcbiAgICAgICAgICAvKiBmYWxsdGhyb3VnaCAqL1xuICAgICAgICBjYXNlICcnOlxuICAgICAgICBjYXNlICc+PSc6XG4gICAgICAgICAgaWYgKCFzZXRNaW4gfHwgZ3QoY29tcHZlciwgc2V0TWluKSkge1xuICAgICAgICAgICAgc2V0TWluID0gY29tcHZlclxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgY2FzZSAnPD0nOlxuICAgICAgICAgIC8qIElnbm9yZSBtYXhpbXVtIHZlcnNpb25zICovXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgb3BlcmF0aW9uOiAke2NvbXBhcmF0b3Iub3BlcmF0b3J9YClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChzZXRNaW4gJiYgKCFtaW52ZXIgfHwgZ3QobWludmVyLCBzZXRNaW4pKSkge1xuICAgICAgbWludmVyID0gc2V0TWluXG4gICAgfVxuICB9XG5cbiAgaWYgKG1pbnZlciAmJiByYW5nZS50ZXN0KG1pbnZlcikpIHtcbiAgICByZXR1cm4gbWludmVyXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxubW9kdWxlLmV4cG9ydHMgPSBtaW5WZXJzaW9uXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgdmFsaWRSYW5nZSA9IChyYW5nZSwgb3B0aW9ucykgPT4ge1xuICB0cnkge1xuICAgIC8vIFJldHVybiAnKicgaW5zdGVhZCBvZiAnJyBzbyB0aGF0IHRydXRoaW5lc3Mgd29ya3MuXG4gICAgLy8gVGhpcyB3aWxsIHRocm93IGlmIGl0J3MgaW52YWxpZCBhbnl3YXlcbiAgICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKS5yYW5nZSB8fCAnKidcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHZhbGlkUmFuZ2VcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IENvbXBhcmF0b3IgPSByZXF1aXJlKCcuLi9jbGFzc2VzL2NvbXBhcmF0b3InKVxuY29uc3QgeyBBTlkgfSA9IENvbXBhcmF0b3JcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvc2F0aXNmaWVzJylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2d0JylcbmNvbnN0IGx0ID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2x0JylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9sdGUnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2d0ZScpXG5cbmNvbnN0IG91dHNpZGUgPSAodmVyc2lvbiwgcmFuZ2UsIGhpbG8sIG9wdGlvbnMpID0+IHtcbiAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgb3B0aW9ucylcbiAgcmFuZ2UgPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG5cbiAgbGV0IGd0Zm4sIGx0ZWZuLCBsdGZuLCBjb21wLCBlY29tcFxuICBzd2l0Y2ggKGhpbG8pIHtcbiAgICBjYXNlICc+JzpcbiAgICAgIGd0Zm4gPSBndFxuICAgICAgbHRlZm4gPSBsdGVcbiAgICAgIGx0Zm4gPSBsdFxuICAgICAgY29tcCA9ICc+J1xuICAgICAgZWNvbXAgPSAnPj0nXG4gICAgICBicmVha1xuICAgIGNhc2UgJzwnOlxuICAgICAgZ3RmbiA9IGx0XG4gICAgICBsdGVmbiA9IGd0ZVxuICAgICAgbHRmbiA9IGd0XG4gICAgICBjb21wID0gJzwnXG4gICAgICBlY29tcCA9ICc8PSdcbiAgICAgIGJyZWFrXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ011c3QgcHJvdmlkZSBhIGhpbG8gdmFsIG9mIFwiPFwiIG9yIFwiPlwiJylcbiAgfVxuXG4gIC8vIElmIGl0IHNhdGlzZmllcyB0aGUgcmFuZ2UgaXQgaXMgbm90IG91dHNpZGVcbiAgaWYgKHNhdGlzZmllcyh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIEZyb20gbm93IG9uLCB2YXJpYWJsZSB0ZXJtcyBhcmUgYXMgaWYgd2UncmUgaW4gXCJndHJcIiBtb2RlLlxuICAvLyBidXQgbm90ZSB0aGF0IGV2ZXJ5dGhpbmcgaXMgZmxpcHBlZCBmb3IgdGhlIFwibHRyXCIgZnVuY3Rpb24uXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZS5zZXQubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjb21wYXJhdG9ycyA9IHJhbmdlLnNldFtpXVxuXG4gICAgbGV0IGhpZ2ggPSBudWxsXG4gICAgbGV0IGxvdyA9IG51bGxcblxuICAgIGNvbXBhcmF0b3JzLmZvckVhY2goKGNvbXBhcmF0b3IpID0+IHtcbiAgICAgIGlmIChjb21wYXJhdG9yLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICAgIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcignPj0wLjAuMCcpXG4gICAgICB9XG4gICAgICBoaWdoID0gaGlnaCB8fCBjb21wYXJhdG9yXG4gICAgICBsb3cgPSBsb3cgfHwgY29tcGFyYXRvclxuICAgICAgaWYgKGd0Zm4oY29tcGFyYXRvci5zZW12ZXIsIGhpZ2guc2VtdmVyLCBvcHRpb25zKSkge1xuICAgICAgICBoaWdoID0gY29tcGFyYXRvclxuICAgICAgfSBlbHNlIGlmIChsdGZuKGNvbXBhcmF0b3Iuc2VtdmVyLCBsb3cuc2VtdmVyLCBvcHRpb25zKSkge1xuICAgICAgICBsb3cgPSBjb21wYXJhdG9yXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIElmIHRoZSBlZGdlIHZlcnNpb24gY29tcGFyYXRvciBoYXMgYSBvcGVyYXRvciB0aGVuIG91ciB2ZXJzaW9uXG4gICAgLy8gaXNuJ3Qgb3V0c2lkZSBpdFxuICAgIGlmIChoaWdoLm9wZXJhdG9yID09PSBjb21wIHx8IGhpZ2gub3BlcmF0b3IgPT09IGVjb21wKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbG93ZXN0IHZlcnNpb24gY29tcGFyYXRvciBoYXMgYW4gb3BlcmF0b3IgYW5kIG91ciB2ZXJzaW9uXG4gICAgLy8gaXMgbGVzcyB0aGFuIGl0IHRoZW4gaXQgaXNuJ3QgaGlnaGVyIHRoYW4gdGhlIHJhbmdlXG4gICAgaWYgKCghbG93Lm9wZXJhdG9yIHx8IGxvdy5vcGVyYXRvciA9PT0gY29tcCkgJiZcbiAgICAgICAgbHRlZm4odmVyc2lvbiwgbG93LnNlbXZlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSBpZiAobG93Lm9wZXJhdG9yID09PSBlY29tcCAmJiBsdGZuKHZlcnNpb24sIGxvdy5zZW12ZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdXRzaWRlXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBEZXRlcm1pbmUgaWYgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gYWxsIHRoZSB2ZXJzaW9ucyBwb3NzaWJsZSBpbiB0aGUgcmFuZ2UuXG5jb25zdCBvdXRzaWRlID0gcmVxdWlyZSgnLi9vdXRzaWRlJylcbmNvbnN0IGd0ciA9ICh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykgPT4gb3V0c2lkZSh2ZXJzaW9uLCByYW5nZSwgJz4nLCBvcHRpb25zKVxubW9kdWxlLmV4cG9ydHMgPSBndHJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IG91dHNpZGUgPSByZXF1aXJlKCcuL291dHNpZGUnKVxuLy8gRGV0ZXJtaW5lIGlmIHZlcnNpb24gaXMgbGVzcyB0aGFuIGFsbCB0aGUgdmVyc2lvbnMgcG9zc2libGUgaW4gdGhlIHJhbmdlXG5jb25zdCBsdHIgPSAodmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IG91dHNpZGUodmVyc2lvbiwgcmFuZ2UsICc8Jywgb3B0aW9ucylcbm1vZHVsZS5leHBvcnRzID0gbHRyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgaW50ZXJzZWN0cyA9IChyMSwgcjIsIG9wdGlvbnMpID0+IHtcbiAgcjEgPSBuZXcgUmFuZ2UocjEsIG9wdGlvbnMpXG4gIHIyID0gbmV3IFJhbmdlKHIyLCBvcHRpb25zKVxuICByZXR1cm4gcjEuaW50ZXJzZWN0cyhyMiwgb3B0aW9ucylcbn1cbm1vZHVsZS5leHBvcnRzID0gaW50ZXJzZWN0c1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuLy8gZ2l2ZW4gYSBzZXQgb2YgdmVyc2lvbnMgYW5kIGEgcmFuZ2UsIGNyZWF0ZSBhIFwic2ltcGxpZmllZFwiIHJhbmdlXG4vLyB0aGF0IGluY2x1ZGVzIHRoZSBzYW1lIHZlcnNpb25zIHRoYXQgdGhlIG9yaWdpbmFsIHJhbmdlIGRvZXNcbi8vIElmIHRoZSBvcmlnaW5hbCByYW5nZSBpcyBzaG9ydGVyIHRoYW4gdGhlIHNpbXBsaWZpZWQgb25lLCByZXR1cm4gdGhhdC5cbmNvbnN0IHNhdGlzZmllcyA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9zYXRpc2ZpZXMuanMnKVxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9jb21wYXJlLmpzJylcbm1vZHVsZS5leHBvcnRzID0gKHZlcnNpb25zLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBzZXQgPSBbXVxuICBsZXQgZmlyc3QgPSBudWxsXG4gIGxldCBwcmV2ID0gbnVsbFxuICBjb25zdCB2ID0gdmVyc2lvbnMuc29ydCgoYSwgYikgPT4gY29tcGFyZShhLCBiLCBvcHRpb25zKSlcbiAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIHYpIHtcbiAgICBjb25zdCBpbmNsdWRlZCA9IHNhdGlzZmllcyh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucylcbiAgICBpZiAoaW5jbHVkZWQpIHtcbiAgICAgIHByZXYgPSB2ZXJzaW9uXG4gICAgICBpZiAoIWZpcnN0KSB7XG4gICAgICAgIGZpcnN0ID0gdmVyc2lvblxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJldikge1xuICAgICAgICBzZXQucHVzaChbZmlyc3QsIHByZXZdKVxuICAgICAgfVxuICAgICAgcHJldiA9IG51bGxcbiAgICAgIGZpcnN0ID0gbnVsbFxuICAgIH1cbiAgfVxuICBpZiAoZmlyc3QpIHtcbiAgICBzZXQucHVzaChbZmlyc3QsIG51bGxdKVxuICB9XG5cbiAgY29uc3QgcmFuZ2VzID0gW11cbiAgZm9yIChjb25zdCBbbWluLCBtYXhdIG9mIHNldCkge1xuICAgIGlmIChtaW4gPT09IG1heCkge1xuICAgICAgcmFuZ2VzLnB1c2gobWluKVxuICAgIH0gZWxzZSBpZiAoIW1heCAmJiBtaW4gPT09IHZbMF0pIHtcbiAgICAgIHJhbmdlcy5wdXNoKCcqJylcbiAgICB9IGVsc2UgaWYgKCFtYXgpIHtcbiAgICAgIHJhbmdlcy5wdXNoKGA+PSR7bWlufWApXG4gICAgfSBlbHNlIGlmIChtaW4gPT09IHZbMF0pIHtcbiAgICAgIHJhbmdlcy5wdXNoKGA8PSR7bWF4fWApXG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlcy5wdXNoKGAke21pbn0gLSAke21heH1gKVxuICAgIH1cbiAgfVxuICBjb25zdCBzaW1wbGlmaWVkID0gcmFuZ2VzLmpvaW4oJyB8fCAnKVxuICBjb25zdCBvcmlnaW5hbCA9IHR5cGVvZiByYW5nZS5yYXcgPT09ICdzdHJpbmcnID8gcmFuZ2UucmF3IDogU3RyaW5nKHJhbmdlKVxuICByZXR1cm4gc2ltcGxpZmllZC5sZW5ndGggPCBvcmlnaW5hbC5sZW5ndGggPyBzaW1wbGlmaWVkIDogcmFuZ2Vcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZS5qcycpXG5jb25zdCBDb21wYXJhdG9yID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9jb21wYXJhdG9yLmpzJylcbmNvbnN0IHsgQU5ZIH0gPSBDb21wYXJhdG9yXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvc2F0aXNmaWVzLmpzJylcbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvY29tcGFyZS5qcycpXG5cbi8vIENvbXBsZXggcmFuZ2UgYHIxIHx8IHIyIHx8IC4uLmAgaXMgYSBzdWJzZXQgb2YgYFIxIHx8IFIyIHx8IC4uLmAgaWZmOlxuLy8gLSBFdmVyeSBzaW1wbGUgcmFuZ2UgYHIxLCByMiwgLi4uYCBpcyBhIG51bGwgc2V0LCBPUlxuLy8gLSBFdmVyeSBzaW1wbGUgcmFuZ2UgYHIxLCByMiwgLi4uYCB3aGljaCBpcyBub3QgYSBudWxsIHNldCBpcyBhIHN1YnNldCBvZlxuLy8gICBzb21lIGBSMSwgUjIsIC4uLmBcbi8vXG4vLyBTaW1wbGUgcmFuZ2UgYGMxIGMyIC4uLmAgaXMgYSBzdWJzZXQgb2Ygc2ltcGxlIHJhbmdlIGBDMSBDMiAuLi5gIGlmZjpcbi8vIC0gSWYgYyBpcyBvbmx5IHRoZSBBTlkgY29tcGFyYXRvclxuLy8gICAtIElmIEMgaXMgb25seSB0aGUgQU5ZIGNvbXBhcmF0b3IsIHJldHVybiB0cnVlXG4vLyAgIC0gRWxzZSBpZiBpbiBwcmVyZWxlYXNlIG1vZGUsIHJldHVybiBmYWxzZVxuLy8gICAtIGVsc2UgcmVwbGFjZSBjIHdpdGggYFs+PTAuMC4wXWBcbi8vIC0gSWYgQyBpcyBvbmx5IHRoZSBBTlkgY29tcGFyYXRvclxuLy8gICAtIGlmIGluIHByZXJlbGVhc2UgbW9kZSwgcmV0dXJuIHRydWVcbi8vICAgLSBlbHNlIHJlcGxhY2UgQyB3aXRoIGBbPj0wLjAuMF1gXG4vLyAtIExldCBFUSBiZSB0aGUgc2V0IG9mID0gY29tcGFyYXRvcnMgaW4gY1xuLy8gLSBJZiBFUSBpcyBtb3JlIHRoYW4gb25lLCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAtIExldCBHVCBiZSB0aGUgaGlnaGVzdCA+IG9yID49IGNvbXBhcmF0b3IgaW4gY1xuLy8gLSBMZXQgTFQgYmUgdGhlIGxvd2VzdCA8IG9yIDw9IGNvbXBhcmF0b3IgaW4gY1xuLy8gLSBJZiBHVCBhbmQgTFQsIGFuZCBHVC5zZW12ZXIgPiBMVC5zZW12ZXIsIHJldHVybiB0cnVlIChudWxsIHNldClcbi8vIC0gSWYgYW55IEMgaXMgYSA9IHJhbmdlLCBhbmQgR1Qgb3IgTFQgYXJlIHNldCwgcmV0dXJuIGZhbHNlXG4vLyAtIElmIEVRXG4vLyAgIC0gSWYgR1QsIGFuZCBFUSBkb2VzIG5vdCBzYXRpc2Z5IEdULCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAgIC0gSWYgTFQsIGFuZCBFUSBkb2VzIG5vdCBzYXRpc2Z5IExULCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAgIC0gSWYgRVEgc2F0aXNmaWVzIGV2ZXJ5IEMsIHJldHVybiB0cnVlXG4vLyAgIC0gRWxzZSByZXR1cm4gZmFsc2Vcbi8vIC0gSWYgR1Rcbi8vICAgLSBJZiBHVC5zZW12ZXIgaXMgbG93ZXIgdGhhbiBhbnkgPiBvciA+PSBjb21wIGluIEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIEdUIGlzID49LCBhbmQgR1Quc2VtdmVyIGRvZXMgbm90IHNhdGlzZnkgZXZlcnkgQywgcmV0dXJuIGZhbHNlXG4vLyAgIC0gSWYgR1Quc2VtdmVyIGhhcyBhIHByZXJlbGVhc2UsIGFuZCBub3QgaW4gcHJlcmVsZWFzZSBtb2RlXG4vLyAgICAgLSBJZiBubyBDIGhhcyBhIHByZXJlbGVhc2UgYW5kIHRoZSBHVC5zZW12ZXIgdHVwbGUsIHJldHVybiBmYWxzZVxuLy8gLSBJZiBMVFxuLy8gICAtIElmIExULnNlbXZlciBpcyBncmVhdGVyIHRoYW4gYW55IDwgb3IgPD0gY29tcCBpbiBDLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBJZiBMVCBpcyA8PSwgYW5kIExULnNlbXZlciBkb2VzIG5vdCBzYXRpc2Z5IGV2ZXJ5IEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIEdULnNlbXZlciBoYXMgYSBwcmVyZWxlYXNlLCBhbmQgbm90IGluIHByZXJlbGVhc2UgbW9kZVxuLy8gICAgIC0gSWYgbm8gQyBoYXMgYSBwcmVyZWxlYXNlIGFuZCB0aGUgTFQuc2VtdmVyIHR1cGxlLCByZXR1cm4gZmFsc2Vcbi8vIC0gRWxzZSByZXR1cm4gdHJ1ZVxuXG5jb25zdCBzdWJzZXQgPSAoc3ViLCBkb20sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAoc3ViID09PSBkb20pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgc3ViID0gbmV3IFJhbmdlKHN1Yiwgb3B0aW9ucylcbiAgZG9tID0gbmV3IFJhbmdlKGRvbSwgb3B0aW9ucylcbiAgbGV0IHNhd05vbk51bGwgPSBmYWxzZVxuXG4gIE9VVEVSOiBmb3IgKGNvbnN0IHNpbXBsZVN1YiBvZiBzdWIuc2V0KSB7XG4gICAgZm9yIChjb25zdCBzaW1wbGVEb20gb2YgZG9tLnNldCkge1xuICAgICAgY29uc3QgaXNTdWIgPSBzaW1wbGVTdWJzZXQoc2ltcGxlU3ViLCBzaW1wbGVEb20sIG9wdGlvbnMpXG4gICAgICBzYXdOb25OdWxsID0gc2F3Tm9uTnVsbCB8fCBpc1N1YiAhPT0gbnVsbFxuICAgICAgaWYgKGlzU3ViKSB7XG4gICAgICAgIGNvbnRpbnVlIE9VVEVSXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHRoZSBudWxsIHNldCBpcyBhIHN1YnNldCBvZiBldmVyeXRoaW5nLCBidXQgbnVsbCBzaW1wbGUgcmFuZ2VzIGluXG4gICAgLy8gYSBjb21wbGV4IHJhbmdlIHNob3VsZCBiZSBpZ25vcmVkLiAgc28gaWYgd2Ugc2F3IGEgbm9uLW51bGwgcmFuZ2UsXG4gICAgLy8gdGhlbiB3ZSBrbm93IHRoaXMgaXNuJ3QgYSBzdWJzZXQsIGJ1dCBpZiBFVkVSWSBzaW1wbGUgcmFuZ2Ugd2FzIG51bGwsXG4gICAgLy8gdGhlbiBpdCBpcyBhIHN1YnNldC5cbiAgICBpZiAoc2F3Tm9uTnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbmNvbnN0IG1pbmltdW1WZXJzaW9uV2l0aFByZVJlbGVhc2UgPSBbbmV3IENvbXBhcmF0b3IoJz49MC4wLjAtMCcpXVxuY29uc3QgbWluaW11bVZlcnNpb24gPSBbbmV3IENvbXBhcmF0b3IoJz49MC4wLjAnKV1cblxuY29uc3Qgc2ltcGxlU3Vic2V0ID0gKHN1YiwgZG9tLCBvcHRpb25zKSA9PiB7XG4gIGlmIChzdWIgPT09IGRvbSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoc3ViLmxlbmd0aCA9PT0gMSAmJiBzdWJbMF0uc2VtdmVyID09PSBBTlkpIHtcbiAgICBpZiAoZG9tLmxlbmd0aCA9PT0gMSAmJiBkb21bMF0uc2VtdmVyID09PSBBTlkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICBzdWIgPSBtaW5pbXVtVmVyc2lvbldpdGhQcmVSZWxlYXNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHN1YiA9IG1pbmltdW1WZXJzaW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKGRvbS5sZW5ndGggPT09IDEgJiYgZG9tWzBdLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvbSA9IG1pbmltdW1WZXJzaW9uXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXFTZXQgPSBuZXcgU2V0KClcbiAgbGV0IGd0LCBsdFxuICBmb3IgKGNvbnN0IGMgb2Ygc3ViKSB7XG4gICAgaWYgKGMub3BlcmF0b3IgPT09ICc+JyB8fCBjLm9wZXJhdG9yID09PSAnPj0nKSB7XG4gICAgICBndCA9IGhpZ2hlckdUKGd0LCBjLCBvcHRpb25zKVxuICAgIH0gZWxzZSBpZiAoYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PScpIHtcbiAgICAgIGx0ID0gbG93ZXJMVChsdCwgYywgb3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgZXFTZXQuYWRkKGMuc2VtdmVyKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlcVNldC5zaXplID4gMSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBsZXQgZ3RsdENvbXBcbiAgaWYgKGd0ICYmIGx0KSB7XG4gICAgZ3RsdENvbXAgPSBjb21wYXJlKGd0LnNlbXZlciwgbHQuc2VtdmVyLCBvcHRpb25zKVxuICAgIGlmIChndGx0Q29tcCA+IDApIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfSBlbHNlIGlmIChndGx0Q29tcCA9PT0gMCAmJiAoZ3Qub3BlcmF0b3IgIT09ICc+PScgfHwgbHQub3BlcmF0b3IgIT09ICc8PScpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8vIHdpbGwgaXRlcmF0ZSBvbmUgb3IgemVybyB0aW1lc1xuICBmb3IgKGNvbnN0IGVxIG9mIGVxU2V0KSB7XG4gICAgaWYgKGd0ICYmICFzYXRpc2ZpZXMoZXEsIFN0cmluZyhndCksIG9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGlmIChsdCAmJiAhc2F0aXNmaWVzKGVxLCBTdHJpbmcobHQpLCBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGMgb2YgZG9tKSB7XG4gICAgICBpZiAoIXNhdGlzZmllcyhlcSwgU3RyaW5nKGMpLCBvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgbGV0IGhpZ2hlciwgbG93ZXJcbiAgbGV0IGhhc0RvbUxULCBoYXNEb21HVFxuICAvLyBpZiB0aGUgc3Vic2V0IGhhcyBhIHByZXJlbGVhc2UsIHdlIG5lZWQgYSBjb21wYXJhdG9yIGluIHRoZSBzdXBlcnNldFxuICAvLyB3aXRoIHRoZSBzYW1lIHR1cGxlIGFuZCBhIHByZXJlbGVhc2UsIG9yIGl0J3Mgbm90IGEgc3Vic2V0XG4gIGxldCBuZWVkRG9tTFRQcmUgPSBsdCAmJlxuICAgICFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmXG4gICAgbHQuc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID8gbHQuc2VtdmVyIDogZmFsc2VcbiAgbGV0IG5lZWREb21HVFByZSA9IGd0ICYmXG4gICAgIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICBndC5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggPyBndC5zZW12ZXIgOiBmYWxzZVxuICAvLyBleGNlcHRpb246IDwxLjIuMy0wIGlzIHRoZSBzYW1lIGFzIDwxLjIuM1xuICBpZiAobmVlZERvbUxUUHJlICYmIG5lZWREb21MVFByZS5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgbHQub3BlcmF0b3IgPT09ICc8JyAmJiBuZWVkRG9tTFRQcmUucHJlcmVsZWFzZVswXSA9PT0gMCkge1xuICAgIG5lZWREb21MVFByZSA9IGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IGMgb2YgZG9tKSB7XG4gICAgaGFzRG9tR1QgPSBoYXNEb21HVCB8fCBjLm9wZXJhdG9yID09PSAnPicgfHwgYy5vcGVyYXRvciA9PT0gJz49J1xuICAgIGhhc0RvbUxUID0gaGFzRG9tTFQgfHwgYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PSdcbiAgICBpZiAoZ3QpIHtcbiAgICAgIGlmIChuZWVkRG9tR1RQcmUpIHtcbiAgICAgICAgaWYgKGMuc2VtdmVyLnByZXJlbGVhc2UgJiYgYy5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1ham9yID09PSBuZWVkRG9tR1RQcmUubWFqb3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1pbm9yID09PSBuZWVkRG9tR1RQcmUubWlub3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLnBhdGNoID09PSBuZWVkRG9tR1RQcmUucGF0Y2gpIHtcbiAgICAgICAgICBuZWVkRG9tR1RQcmUgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYy5vcGVyYXRvciA9PT0gJz4nIHx8IGMub3BlcmF0b3IgPT09ICc+PScpIHtcbiAgICAgICAgaGlnaGVyID0gaGlnaGVyR1QoZ3QsIGMsIG9wdGlvbnMpXG4gICAgICAgIGlmIChoaWdoZXIgPT09IGMgJiYgaGlnaGVyICE9PSBndCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGd0Lm9wZXJhdG9yID09PSAnPj0nICYmICFzYXRpc2ZpZXMoZ3Quc2VtdmVyLCBTdHJpbmcoYyksIG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobHQpIHtcbiAgICAgIGlmIChuZWVkRG9tTFRQcmUpIHtcbiAgICAgICAgaWYgKGMuc2VtdmVyLnByZXJlbGVhc2UgJiYgYy5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1ham9yID09PSBuZWVkRG9tTFRQcmUubWFqb3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1pbm9yID09PSBuZWVkRG9tTFRQcmUubWlub3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLnBhdGNoID09PSBuZWVkRG9tTFRQcmUucGF0Y2gpIHtcbiAgICAgICAgICBuZWVkRG9tTFRQcmUgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PScpIHtcbiAgICAgICAgbG93ZXIgPSBsb3dlckxUKGx0LCBjLCBvcHRpb25zKVxuICAgICAgICBpZiAobG93ZXIgPT09IGMgJiYgbG93ZXIgIT09IGx0KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobHQub3BlcmF0b3IgPT09ICc8PScgJiYgIXNhdGlzZmllcyhsdC5zZW12ZXIsIFN0cmluZyhjKSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghYy5vcGVyYXRvciAmJiAobHQgfHwgZ3QpICYmIGd0bHRDb21wICE9PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGVyZSB3YXMgYSA8IG9yID4sIGFuZCBub3RoaW5nIGluIHRoZSBkb20sIHRoZW4gbXVzdCBiZSBmYWxzZVxuICAvLyBVTkxFU1MgaXQgd2FzIGxpbWl0ZWQgYnkgYW5vdGhlciByYW5nZSBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLlxuICAvLyBFZywgPjEuMC4wIDwxLjAuMSBpcyBzdGlsbCBhIHN1YnNldCBvZiA8Mi4wLjBcbiAgaWYgKGd0ICYmIGhhc0RvbUxUICYmICFsdCAmJiBndGx0Q29tcCAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKGx0ICYmIGhhc0RvbUdUICYmICFndCAmJiBndGx0Q29tcCAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gd2UgbmVlZGVkIGEgcHJlcmVsZWFzZSByYW5nZSBpbiBhIHNwZWNpZmljIHR1cGxlLCBidXQgZGlkbid0IGdldCBvbmVcbiAgLy8gdGhlbiB0aGlzIGlzbid0IGEgc3Vic2V0LiAgZWcgPj0xLjIuMy1wcmUgaXMgbm90IGEgc3Vic2V0IG9mID49MS4wLjAsXG4gIC8vIGJlY2F1c2UgaXQgaW5jbHVkZXMgcHJlcmVsZWFzZXMgaW4gdGhlIDEuMi4zIHR1cGxlXG4gIGlmIChuZWVkRG9tR1RQcmUgfHwgbmVlZERvbUxUUHJlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vLyA+PTEuMi4zIGlzIGxvd2VyIHRoYW4gPjEuMi4zXG5jb25zdCBoaWdoZXJHVCA9IChhLCBiLCBvcHRpb25zKSA9PiB7XG4gIGlmICghYSkge1xuICAgIHJldHVybiBiXG4gIH1cbiAgY29uc3QgY29tcCA9IGNvbXBhcmUoYS5zZW12ZXIsIGIuc2VtdmVyLCBvcHRpb25zKVxuICByZXR1cm4gY29tcCA+IDAgPyBhXG4gICAgOiBjb21wIDwgMCA/IGJcbiAgICA6IGIub3BlcmF0b3IgPT09ICc+JyAmJiBhLm9wZXJhdG9yID09PSAnPj0nID8gYlxuICAgIDogYVxufVxuXG4vLyA8PTEuMi4zIGlzIGhpZ2hlciB0aGFuIDwxLjIuM1xuY29uc3QgbG93ZXJMVCA9IChhLCBiLCBvcHRpb25zKSA9PiB7XG4gIGlmICghYSkge1xuICAgIHJldHVybiBiXG4gIH1cbiAgY29uc3QgY29tcCA9IGNvbXBhcmUoYS5zZW12ZXIsIGIuc2VtdmVyLCBvcHRpb25zKVxuICByZXR1cm4gY29tcCA8IDAgPyBhXG4gICAgOiBjb21wID4gMCA/IGJcbiAgICA6IGIub3BlcmF0b3IgPT09ICc8JyAmJiBhLm9wZXJhdG9yID09PSAnPD0nID8gYlxuICAgIDogYVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN1YnNldFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuLy8ganVzdCBwcmUtbG9hZCBhbGwgdGhlIHN0dWZmIHRoYXQgaW5kZXguanMgbGF6aWx5IGV4cG9ydHNcbmNvbnN0IGludGVybmFsUmUgPSByZXF1aXJlKCcuL2ludGVybmFsL3JlJylcbmNvbnN0IGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvY29uc3RhbnRzJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgaWRlbnRpZmllcnMgPSByZXF1aXJlKCcuL2ludGVybmFsL2lkZW50aWZpZXJzJylcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcGFyc2UnKVxuY29uc3QgdmFsaWQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy92YWxpZCcpXG5jb25zdCBjbGVhbiA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NsZWFuJylcbmNvbnN0IGluYyA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2luYycpXG5jb25zdCBkaWZmID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZGlmZicpXG5jb25zdCBtYWpvciA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL21ham9yJylcbmNvbnN0IG1pbm9yID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbWlub3InKVxuY29uc3QgcGF0Y2ggPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9wYXRjaCcpXG5jb25zdCBwcmVyZWxlYXNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcHJlcmVsZWFzZScpXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29tcGFyZScpXG5jb25zdCByY29tcGFyZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3Jjb21wYXJlJylcbmNvbnN0IGNvbXBhcmVMb29zZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvbXBhcmUtbG9vc2UnKVxuY29uc3QgY29tcGFyZUJ1aWxkID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29tcGFyZS1idWlsZCcpXG5jb25zdCBzb3J0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvc29ydCcpXG5jb25zdCByc29ydCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3Jzb3J0JylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZ3QnKVxuY29uc3QgbHQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9sdCcpXG5jb25zdCBlcSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2VxJylcbmNvbnN0IG5lcSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL25lcScpXG5jb25zdCBndGUgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9ndGUnKVxuY29uc3QgbHRlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbHRlJylcbmNvbnN0IGNtcCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NtcCcpXG5jb25zdCBjb2VyY2UgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jb2VyY2UnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9jb21wYXJhdG9yJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHNhdGlzZmllcyA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3NhdGlzZmllcycpXG5jb25zdCB0b0NvbXBhcmF0b3JzID0gcmVxdWlyZSgnLi9yYW5nZXMvdG8tY29tcGFyYXRvcnMnKVxuY29uc3QgbWF4U2F0aXNmeWluZyA9IHJlcXVpcmUoJy4vcmFuZ2VzL21heC1zYXRpc2Z5aW5nJylcbmNvbnN0IG1pblNhdGlzZnlpbmcgPSByZXF1aXJlKCcuL3Jhbmdlcy9taW4tc2F0aXNmeWluZycpXG5jb25zdCBtaW5WZXJzaW9uID0gcmVxdWlyZSgnLi9yYW5nZXMvbWluLXZlcnNpb24nKVxuY29uc3QgdmFsaWRSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2VzL3ZhbGlkJylcbmNvbnN0IG91dHNpZGUgPSByZXF1aXJlKCcuL3Jhbmdlcy9vdXRzaWRlJylcbmNvbnN0IGd0ciA9IHJlcXVpcmUoJy4vcmFuZ2VzL2d0cicpXG5jb25zdCBsdHIgPSByZXF1aXJlKCcuL3Jhbmdlcy9sdHInKVxuY29uc3QgaW50ZXJzZWN0cyA9IHJlcXVpcmUoJy4vcmFuZ2VzL2ludGVyc2VjdHMnKVxuY29uc3Qgc2ltcGxpZnlSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2VzL3NpbXBsaWZ5JylcbmNvbnN0IHN1YnNldCA9IHJlcXVpcmUoJy4vcmFuZ2VzL3N1YnNldCcpXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGFyc2UsXG4gIHZhbGlkLFxuICBjbGVhbixcbiAgaW5jLFxuICBkaWZmLFxuICBtYWpvcixcbiAgbWlub3IsXG4gIHBhdGNoLFxuICBwcmVyZWxlYXNlLFxuICBjb21wYXJlLFxuICByY29tcGFyZSxcbiAgY29tcGFyZUxvb3NlLFxuICBjb21wYXJlQnVpbGQsXG4gIHNvcnQsXG4gIHJzb3J0LFxuICBndCxcbiAgbHQsXG4gIGVxLFxuICBuZXEsXG4gIGd0ZSxcbiAgbHRlLFxuICBjbXAsXG4gIGNvZXJjZSxcbiAgQ29tcGFyYXRvcixcbiAgUmFuZ2UsXG4gIHNhdGlzZmllcyxcbiAgdG9Db21wYXJhdG9ycyxcbiAgbWF4U2F0aXNmeWluZyxcbiAgbWluU2F0aXNmeWluZyxcbiAgbWluVmVyc2lvbixcbiAgdmFsaWRSYW5nZSxcbiAgb3V0c2lkZSxcbiAgZ3RyLFxuICBsdHIsXG4gIGludGVyc2VjdHMsXG4gIHNpbXBsaWZ5UmFuZ2UsXG4gIHN1YnNldCxcbiAgU2VtVmVyLFxuICByZTogaW50ZXJuYWxSZS5yZSxcbiAgc3JjOiBpbnRlcm5hbFJlLnNyYyxcbiAgdG9rZW5zOiBpbnRlcm5hbFJlLnQsXG4gIFNFTVZFUl9TUEVDX1ZFUlNJT046IGNvbnN0YW50cy5TRU1WRVJfU1BFQ19WRVJTSU9OLFxuICBSRUxFQVNFX1RZUEVTOiBjb25zdGFudHMuUkVMRUFTRV9UWVBFUyxcbiAgY29tcGFyZUlkZW50aWZpZXJzOiBpZGVudGlmaWVycy5jb21wYXJlSWRlbnRpZmllcnMsXG4gIHJjb21wYXJlSWRlbnRpZmllcnM6IGlkZW50aWZpZXJzLnJjb21wYXJlSWRlbnRpZmllcnMsXG59XG4iLAogICAgImNvbnN0IHNlbXZlciA9IHJlcXVpcmUoJ3NlbXZlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbXZlci5zYXRpc2ZpZXMocHJvY2Vzcy52ZXJzaW9uLCAnPj0xNS43LjAnKTtcbiIsCiAgICAiY29uc3Qgc2VtdmVyID0gcmVxdWlyZSgnc2VtdmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2VtdmVyLnNhdGlzZmllcyhwcm9jZXNzLnZlcnNpb24sICc+PTE2LjkuMCcpO1xuIiwKICAgICJjb25zdCBBU1lNTUVUUklDX0tFWV9ERVRBSUxTX1NVUFBPUlRFRCA9IHJlcXVpcmUoJy4vYXN5bW1ldHJpY0tleURldGFpbHNTdXBwb3J0ZWQnKTtcbmNvbnN0IFJTQV9QU1NfS0VZX0RFVEFJTFNfU1VQUE9SVEVEID0gcmVxdWlyZSgnLi9yc2FQc3NLZXlEZXRhaWxzU3VwcG9ydGVkJyk7XG5cbmNvbnN0IGFsbG93ZWRBbGdvcml0aG1zRm9yS2V5cyA9IHtcbiAgJ2VjJzogWydFUzI1NicsICdFUzM4NCcsICdFUzUxMiddLFxuICAncnNhJzogWydSUzI1NicsICdQUzI1NicsICdSUzM4NCcsICdQUzM4NCcsICdSUzUxMicsICdQUzUxMiddLFxuICAncnNhLXBzcyc6IFsnUFMyNTYnLCAnUFMzODQnLCAnUFM1MTInXVxufTtcblxuY29uc3QgYWxsb3dlZEN1cnZlcyA9IHtcbiAgRVMyNTY6ICdwcmltZTI1NnYxJyxcbiAgRVMzODQ6ICdzZWNwMzg0cjEnLFxuICBFUzUxMjogJ3NlY3A1MjFyMScsXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGFsZ29yaXRobSwga2V5KSB7XG4gIGlmICghYWxnb3JpdGhtIHx8ICFrZXkpIHJldHVybjtcblxuICBjb25zdCBrZXlUeXBlID0ga2V5LmFzeW1tZXRyaWNLZXlUeXBlO1xuICBpZiAoIWtleVR5cGUpIHJldHVybjtcblxuICBjb25zdCBhbGxvd2VkQWxnb3JpdGhtcyA9IGFsbG93ZWRBbGdvcml0aG1zRm9yS2V5c1trZXlUeXBlXTtcblxuICBpZiAoIWFsbG93ZWRBbGdvcml0aG1zKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGtleSB0eXBlIFwiJHtrZXlUeXBlfVwiLmApO1xuICB9XG5cbiAgaWYgKCFhbGxvd2VkQWxnb3JpdGhtcy5pbmNsdWRlcyhhbGdvcml0aG0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBcImFsZ1wiIHBhcmFtZXRlciBmb3IgXCIke2tleVR5cGV9XCIga2V5IHR5cGUgbXVzdCBiZSBvbmUgb2Y6ICR7YWxsb3dlZEFsZ29yaXRobXMuam9pbignLCAnKX0uYClcbiAgfVxuXG4gIC8qXG4gICAqIElnbm9yZSB0aGUgbmV4dCBibG9jayBmcm9tIHRlc3QgY292ZXJhZ2UgYmVjYXVzZSBpdCBnZXRzIGV4ZWN1dGVkXG4gICAqIGNvbmRpdGlvbmFsbHkgZGVwZW5kaW5nIG9uIHRoZSBOb2RlIHZlcnNpb24uIE5vdCBpZ25vcmluZyBpdCB3b3VsZFxuICAgKiBwcmV2ZW50IHVzIGZyb20gcmVhY2hpbmcgdGhlIHRhcmdldCAlIG9mIGNvdmVyYWdlIGZvciB2ZXJzaW9ucyBvZlxuICAgKiBOb2RlIHVuZGVyIDE1LjcuMC5cbiAgICovXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChBU1lNTUVUUklDX0tFWV9ERVRBSUxTX1NVUFBPUlRFRCkge1xuICAgIHN3aXRjaCAoa2V5VHlwZSkge1xuICAgIGNhc2UgJ2VjJzpcbiAgICAgIGNvbnN0IGtleUN1cnZlID0ga2V5LmFzeW1tZXRyaWNLZXlEZXRhaWxzLm5hbWVkQ3VydmU7XG4gICAgICBjb25zdCBhbGxvd2VkQ3VydmUgPSBhbGxvd2VkQ3VydmVzW2FsZ29yaXRobV07XG5cbiAgICAgIGlmIChrZXlDdXJ2ZSAhPT0gYWxsb3dlZEN1cnZlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCJhbGdcIiBwYXJhbWV0ZXIgXCIke2FsZ29yaXRobX1cIiByZXF1aXJlcyBjdXJ2ZSBcIiR7YWxsb3dlZEN1cnZlfVwiLmApO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdyc2EtcHNzJzpcbiAgICAgIGlmIChSU0FfUFNTX0tFWV9ERVRBSUxTX1NVUFBPUlRFRCkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChhbGdvcml0aG0uc2xpY2UoLTMpLCAxMCk7XG4gICAgICAgIGNvbnN0IHsgaGFzaEFsZ29yaXRobSwgbWdmMUhhc2hBbGdvcml0aG0sIHNhbHRMZW5ndGggfSA9IGtleS5hc3ltbWV0cmljS2V5RGV0YWlscztcblxuICAgICAgICBpZiAoaGFzaEFsZ29yaXRobSAhPT0gYHNoYSR7bGVuZ3RofWAgfHwgbWdmMUhhc2hBbGdvcml0aG0gIT09IGhhc2hBbGdvcml0aG0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5IGZvciB0aGlzIG9wZXJhdGlvbiwgaXRzIFJTQS1QU1MgcGFyYW1ldGVycyBkbyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIG9mIFwiYWxnXCIgJHthbGdvcml0aG19LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNhbHRMZW5ndGggIT09IHVuZGVmaW5lZCAmJiBzYWx0TGVuZ3RoID4gbGVuZ3RoID4+IDMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5IGZvciB0aGlzIG9wZXJhdGlvbiwgaXRzIFJTQS1QU1MgcGFyYW1ldGVyIHNhbHRMZW5ndGggZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIG9mIFwiYWxnXCIgJHthbGdvcml0aG19LmApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuIiwKICAgICJ2YXIgc2VtdmVyID0gcmVxdWlyZSgnc2VtdmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2VtdmVyLnNhdGlzZmllcyhwcm9jZXNzLnZlcnNpb24sICdeNi4xMi4wIHx8ID49OC4wLjAnKTtcbiIsCiAgICAiY29uc3QgSnNvbldlYlRva2VuRXJyb3IgPSByZXF1aXJlKCcuL2xpYi9Kc29uV2ViVG9rZW5FcnJvcicpO1xuY29uc3QgTm90QmVmb3JlRXJyb3IgPSByZXF1aXJlKCcuL2xpYi9Ob3RCZWZvcmVFcnJvcicpO1xuY29uc3QgVG9rZW5FeHBpcmVkRXJyb3IgPSByZXF1aXJlKCcuL2xpYi9Ub2tlbkV4cGlyZWRFcnJvcicpO1xuY29uc3QgZGVjb2RlID0gcmVxdWlyZSgnLi9kZWNvZGUnKTtcbmNvbnN0IHRpbWVzcGFuID0gcmVxdWlyZSgnLi9saWIvdGltZXNwYW4nKTtcbmNvbnN0IHZhbGlkYXRlQXN5bW1ldHJpY0tleSA9IHJlcXVpcmUoJy4vbGliL3ZhbGlkYXRlQXN5bW1ldHJpY0tleScpO1xuY29uc3QgUFNfU1VQUE9SVEVEID0gcmVxdWlyZSgnLi9saWIvcHNTdXBwb3J0ZWQnKTtcbmNvbnN0IGp3cyA9IHJlcXVpcmUoJ2p3cycpO1xuY29uc3Qge0tleU9iamVjdCwgY3JlYXRlU2VjcmV0S2V5LCBjcmVhdGVQdWJsaWNLZXl9ID0gcmVxdWlyZShcImNyeXB0b1wiKTtcblxuY29uc3QgUFVCX0tFWV9BTEdTID0gWydSUzI1NicsICdSUzM4NCcsICdSUzUxMiddO1xuY29uc3QgRUNfS0VZX0FMR1MgPSBbJ0VTMjU2JywgJ0VTMzg0JywgJ0VTNTEyJ107XG5jb25zdCBSU0FfS0VZX0FMR1MgPSBbJ1JTMjU2JywgJ1JTMzg0JywgJ1JTNTEyJ107XG5jb25zdCBIU19BTEdTID0gWydIUzI1NicsICdIUzM4NCcsICdIUzUxMiddO1xuXG5pZiAoUFNfU1VQUE9SVEVEKSB7XG4gIFBVQl9LRVlfQUxHUy5zcGxpY2UoUFVCX0tFWV9BTEdTLmxlbmd0aCwgMCwgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJyk7XG4gIFJTQV9LRVlfQUxHUy5zcGxpY2UoUlNBX0tFWV9BTEdTLmxlbmd0aCwgMCwgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGp3dFN0cmluZywgc2VjcmV0T3JQdWJsaWNLZXksIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmICgodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpICYmICFjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICAvL2Nsb25lIHRoaXMgb2JqZWN0IHNpbmNlIHdlIGFyZSBnb2luZyB0byBtdXRhdGUgaXQuXG4gIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcblxuICBsZXQgZG9uZTtcblxuICBpZiAoY2FsbGJhY2spIHtcbiAgICBkb25lID0gY2FsbGJhY2s7XG4gIH0gZWxzZSB7XG4gICAgZG9uZSA9IGZ1bmN0aW9uKGVyciwgZGF0YSkge1xuICAgICAgaWYgKGVycikgdGhyb3cgZXJyO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmNsb2NrVGltZXN0YW1wICYmIHR5cGVvZiBvcHRpb25zLmNsb2NrVGltZXN0YW1wICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignY2xvY2tUaW1lc3RhbXAgbXVzdCBiZSBhIG51bWJlcicpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLm5vbmNlICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBvcHRpb25zLm5vbmNlICE9PSAnc3RyaW5nJyB8fCBvcHRpb25zLm5vbmNlLnRyaW0oKSA9PT0gJycpKSB7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdub25jZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlcyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdhbGxvd0ludmFsaWRBc3ltbWV0cmljS2V5VHlwZXMgbXVzdCBiZSBhIGJvb2xlYW4nKSk7XG4gIH1cblxuICBjb25zdCBjbG9ja1RpbWVzdGFtcCA9IG9wdGlvbnMuY2xvY2tUaW1lc3RhbXAgfHwgTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbiAgaWYgKCFqd3RTdHJpbmcpe1xuICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IG11c3QgYmUgcHJvdmlkZWQnKSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGp3dFN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBtdXN0IGJlIGEgc3RyaW5nJykpO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBqd3RTdHJpbmcuc3BsaXQoJy4nKTtcblxuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKXtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBtYWxmb3JtZWQnKSk7XG4gIH1cblxuICBsZXQgZGVjb2RlZFRva2VuO1xuXG4gIHRyeSB7XG4gICAgZGVjb2RlZFRva2VuID0gZGVjb2RlKGp3dFN0cmluZywgeyBjb21wbGV0ZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaChlcnIpIHtcbiAgICByZXR1cm4gZG9uZShlcnIpO1xuICB9XG5cbiAgaWYgKCFkZWNvZGVkVG9rZW4pIHtcbiAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2ludmFsaWQgdG9rZW4nKSk7XG4gIH1cblxuICBjb25zdCBoZWFkZXIgPSBkZWNvZGVkVG9rZW4uaGVhZGVyO1xuICBsZXQgZ2V0U2VjcmV0O1xuXG4gIGlmKHR5cGVvZiBzZWNyZXRPclB1YmxpY0tleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmKCFjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCd2ZXJpZnkgbXVzdCBiZSBjYWxsZWQgYXN5bmNocm9ub3VzIGlmIHNlY3JldCBvciBwdWJsaWMga2V5IGlzIHByb3ZpZGVkIGFzIGEgY2FsbGJhY2snKSk7XG4gICAgfVxuXG4gICAgZ2V0U2VjcmV0ID0gc2VjcmV0T3JQdWJsaWNLZXk7XG4gIH1cbiAgZWxzZSB7XG4gICAgZ2V0U2VjcmV0ID0gZnVuY3Rpb24oaGVhZGVyLCBzZWNyZXRDYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHNlY3JldENhbGxiYWNrKG51bGwsIHNlY3JldE9yUHVibGljS2V5KTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGdldFNlY3JldChoZWFkZXIsIGZ1bmN0aW9uKGVyciwgc2VjcmV0T3JQdWJsaWNLZXkpIHtcbiAgICBpZihlcnIpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignZXJyb3IgaW4gc2VjcmV0IG9yIHB1YmxpYyBrZXkgY2FsbGJhY2s6ICcgKyBlcnIubWVzc2FnZSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc1NpZ25hdHVyZSA9IHBhcnRzWzJdLnRyaW0oKSAhPT0gJyc7XG5cbiAgICBpZiAoIWhhc1NpZ25hdHVyZSAmJiBzZWNyZXRPclB1YmxpY0tleSl7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBzaWduYXR1cmUgaXMgcmVxdWlyZWQnKSk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1NpZ25hdHVyZSAmJiAhc2VjcmV0T3JQdWJsaWNLZXkpIHtcbiAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignc2VjcmV0IG9yIHB1YmxpYyBrZXkgbXVzdCBiZSBwcm92aWRlZCcpKTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc1NpZ25hdHVyZSAmJiAhb3B0aW9ucy5hbGdvcml0aG1zKSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ3BsZWFzZSBzcGVjaWZ5IFwibm9uZVwiIGluIFwiYWxnb3JpdGhtc1wiIHRvIHZlcmlmeSB1bnNpZ25lZCB0b2tlbnMnKSk7XG4gICAgfVxuXG4gICAgaWYgKHNlY3JldE9yUHVibGljS2V5ICE9IG51bGwgJiYgIShzZWNyZXRPclB1YmxpY0tleSBpbnN0YW5jZW9mIEtleU9iamVjdCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlY3JldE9yUHVibGljS2V5ID0gY3JlYXRlUHVibGljS2V5KHNlY3JldE9yUHVibGljS2V5KTtcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzZWNyZXRPclB1YmxpY0tleSA9IGNyZWF0ZVNlY3JldEtleSh0eXBlb2Ygc2VjcmV0T3JQdWJsaWNLZXkgPT09ICdzdHJpbmcnID8gQnVmZmVyLmZyb20oc2VjcmV0T3JQdWJsaWNLZXkpIDogc2VjcmV0T3JQdWJsaWNLZXkpO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdzZWNyZXRPclB1YmxpY0tleSBpcyBub3QgdmFsaWQga2V5IG1hdGVyaWFsJykpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuYWxnb3JpdGhtcykge1xuICAgICAgaWYgKHNlY3JldE9yUHVibGljS2V5LnR5cGUgPT09ICdzZWNyZXQnKSB7XG4gICAgICAgIG9wdGlvbnMuYWxnb3JpdGhtcyA9IEhTX0FMR1M7XG4gICAgICB9IGVsc2UgaWYgKFsncnNhJywgJ3JzYS1wc3MnXS5pbmNsdWRlcyhzZWNyZXRPclB1YmxpY0tleS5hc3ltbWV0cmljS2V5VHlwZSkpIHtcbiAgICAgICAgb3B0aW9ucy5hbGdvcml0aG1zID0gUlNBX0tFWV9BTEdTXG4gICAgICB9IGVsc2UgaWYgKHNlY3JldE9yUHVibGljS2V5LmFzeW1tZXRyaWNLZXlUeXBlID09PSAnZWMnKSB7XG4gICAgICAgIG9wdGlvbnMuYWxnb3JpdGhtcyA9IEVDX0tFWV9BTEdTXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zLmFsZ29yaXRobXMgPSBQVUJfS0VZX0FMR1NcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hbGdvcml0aG1zLmluZGV4T2YoZGVjb2RlZFRva2VuLmhlYWRlci5hbGcpID09PSAtMSkge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpbnZhbGlkIGFsZ29yaXRobScpKTtcbiAgICB9XG5cbiAgICBpZiAoaGVhZGVyLmFsZy5zdGFydHNXaXRoKCdIUycpICYmIHNlY3JldE9yUHVibGljS2V5LnR5cGUgIT09ICdzZWNyZXQnKSB7XG4gICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoKGBzZWNyZXRPclB1YmxpY0tleSBtdXN0IGJlIGEgc3ltbWV0cmljIGtleSB3aGVuIHVzaW5nICR7aGVhZGVyLmFsZ31gKSkpXG4gICAgfSBlbHNlIGlmICgvXig/OlJTfFBTfEVTKS8udGVzdChoZWFkZXIuYWxnKSAmJiBzZWNyZXRPclB1YmxpY0tleS50eXBlICE9PSAncHVibGljJykge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKChgc2VjcmV0T3JQdWJsaWNLZXkgbXVzdCBiZSBhbiBhc3ltbWV0cmljIGtleSB3aGVuIHVzaW5nICR7aGVhZGVyLmFsZ31gKSkpXG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsaWRhdGVBc3ltbWV0cmljS2V5KGhlYWRlci5hbGcsIHNlY3JldE9yUHVibGljS2V5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHZhbGlkO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkID0gandzLnZlcmlmeShqd3RTdHJpbmcsIGRlY29kZWRUb2tlbi5oZWFkZXIuYWxnLCBzZWNyZXRPclB1YmxpY0tleSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGRvbmUoZSk7XG4gICAgfVxuXG4gICAgaWYgKCF2YWxpZCkge1xuICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpbnZhbGlkIHNpZ25hdHVyZScpKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkID0gZGVjb2RlZFRva2VuLnBheWxvYWQ7XG5cbiAgICBpZiAodHlwZW9mIHBheWxvYWQubmJmICE9PSAndW5kZWZpbmVkJyAmJiAhb3B0aW9ucy5pZ25vcmVOb3RCZWZvcmUpIHtcbiAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC5uYmYgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignaW52YWxpZCBuYmYgdmFsdWUnKSk7XG4gICAgICB9XG4gICAgICBpZiAocGF5bG9hZC5uYmYgPiBjbG9ja1RpbWVzdGFtcCArIChvcHRpb25zLmNsb2NrVG9sZXJhbmNlIHx8IDApKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBOb3RCZWZvcmVFcnJvcignand0IG5vdCBhY3RpdmUnLCBuZXcgRGF0ZShwYXlsb2FkLm5iZiAqIDEwMDApKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkLmV4cCAhPT0gJ3VuZGVmaW5lZCcgJiYgIW9wdGlvbnMuaWdub3JlRXhwaXJhdGlvbikge1xuICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLmV4cCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpbnZhbGlkIGV4cCB2YWx1ZScpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9ja1RpbWVzdGFtcCA+PSBwYXlsb2FkLmV4cCArIChvcHRpb25zLmNsb2NrVG9sZXJhbmNlIHx8IDApKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBUb2tlbkV4cGlyZWRFcnJvcignand0IGV4cGlyZWQnLCBuZXcgRGF0ZShwYXlsb2FkLmV4cCAqIDEwMDApKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXVkaWVuY2UpIHtcbiAgICAgIGNvbnN0IGF1ZGllbmNlcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5hdWRpZW5jZSkgPyBvcHRpb25zLmF1ZGllbmNlIDogW29wdGlvbnMuYXVkaWVuY2VdO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gQXJyYXkuaXNBcnJheShwYXlsb2FkLmF1ZCkgPyBwYXlsb2FkLmF1ZCA6IFtwYXlsb2FkLmF1ZF07XG5cbiAgICAgIGNvbnN0IG1hdGNoID0gdGFyZ2V0LnNvbWUoZnVuY3Rpb24gKHRhcmdldEF1ZGllbmNlKSB7XG4gICAgICAgIHJldHVybiBhdWRpZW5jZXMuc29tZShmdW5jdGlvbiAoYXVkaWVuY2UpIHtcbiAgICAgICAgICByZXR1cm4gYXVkaWVuY2UgaW5zdGFuY2VvZiBSZWdFeHAgPyBhdWRpZW5jZS50ZXN0KHRhcmdldEF1ZGllbmNlKSA6IGF1ZGllbmNlID09PSB0YXJnZXRBdWRpZW5jZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4gZG9uZShuZXcgSnNvbldlYlRva2VuRXJyb3IoJ2p3dCBhdWRpZW5jZSBpbnZhbGlkLiBleHBlY3RlZDogJyArIGF1ZGllbmNlcy5qb2luKCcgb3IgJykpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pc3N1ZXIpIHtcbiAgICAgIGNvbnN0IGludmFsaWRfaXNzdWVyID1cbiAgICAgICAgICAgICAgKHR5cGVvZiBvcHRpb25zLmlzc3VlciA9PT0gJ3N0cmluZycgJiYgcGF5bG9hZC5pc3MgIT09IG9wdGlvbnMuaXNzdWVyKSB8fFxuICAgICAgICAgICAgICAoQXJyYXkuaXNBcnJheShvcHRpb25zLmlzc3VlcikgJiYgb3B0aW9ucy5pc3N1ZXIuaW5kZXhPZihwYXlsb2FkLmlzcykgPT09IC0xKTtcblxuICAgICAgaWYgKGludmFsaWRfaXNzdWVyKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IGlzc3VlciBpbnZhbGlkLiBleHBlY3RlZDogJyArIG9wdGlvbnMuaXNzdWVyKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc3ViamVjdCkge1xuICAgICAgaWYgKHBheWxvYWQuc3ViICE9PSBvcHRpb25zLnN1YmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3Qgc3ViamVjdCBpbnZhbGlkLiBleHBlY3RlZDogJyArIG9wdGlvbnMuc3ViamVjdCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmp3dGlkKSB7XG4gICAgICBpZiAocGF5bG9hZC5qdGkgIT09IG9wdGlvbnMuand0aWQpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdqd3Qgand0aWQgaW52YWxpZC4gZXhwZWN0ZWQ6ICcgKyBvcHRpb25zLmp3dGlkKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubm9uY2UpIHtcbiAgICAgIGlmIChwYXlsb2FkLm5vbmNlICE9PSBvcHRpb25zLm5vbmNlKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignand0IG5vbmNlIGludmFsaWQuIGV4cGVjdGVkOiAnICsgb3B0aW9ucy5ub25jZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1heEFnZSkge1xuICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLmlhdCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEpzb25XZWJUb2tlbkVycm9yKCdpYXQgcmVxdWlyZWQgd2hlbiBtYXhBZ2UgaXMgc3BlY2lmaWVkJykpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXhBZ2VUaW1lc3RhbXAgPSB0aW1lc3BhbihvcHRpb25zLm1heEFnZSwgcGF5bG9hZC5pYXQpO1xuICAgICAgaWYgKHR5cGVvZiBtYXhBZ2VUaW1lc3RhbXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBkb25lKG5ldyBKc29uV2ViVG9rZW5FcnJvcignXCJtYXhBZ2VcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcyBvciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgdGltZXNwYW4gZWc6IFwiMWRcIiwgXCIyMGhcIiwgNjAnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY2xvY2tUaW1lc3RhbXAgPj0gbWF4QWdlVGltZXN0YW1wICsgKG9wdGlvbnMuY2xvY2tUb2xlcmFuY2UgfHwgMCkpIHtcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IFRva2VuRXhwaXJlZEVycm9yKCdtYXhBZ2UgZXhjZWVkZWQnLCBuZXcgRGF0ZShtYXhBZ2VUaW1lc3RhbXAgKiAxMDAwKSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmNvbXBsZXRlID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBkZWNvZGVkVG9rZW4uc2lnbmF0dXJlO1xuXG4gICAgICByZXR1cm4gZG9uZShudWxsLCB7XG4gICAgICAgIGhlYWRlcjogaGVhZGVyLFxuICAgICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgICBzaWduYXR1cmU6IHNpZ25hdHVyZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvbmUobnVsbCwgcGF5bG9hZCk7XG4gIH0pO1xufTtcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTEsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgaWYgKHZhbHVlICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG4gIH1cbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy52YWx1ZXNgIGFuZCBgXy52YWx1ZXNJbmAgd2hpY2ggY3JlYXRlcyBhblxuICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gKiBvZiBgcHJvcHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykge1xuICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICB9O1xufVxuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpLFxuICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgLy8gU2FmYXJpIDguMSBtYWtlcyBgYXJndW1lbnRzLmNhbGxlZWAgZW51bWVyYWJsZSBpbiBzdHJpY3QgbW9kZS5cbiAgLy8gU2FmYXJpIDkgbWFrZXMgYGFyZ3VtZW50cy5sZW5ndGhgIGVudW1lcmFibGUgaW4gc3RyaWN0IG1vZGUuXG4gIHZhciByZXN1bHQgPSAoaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKVxuICAgID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKVxuICAgIDogW107XG5cbiAgdmFyIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGgsXG4gICAgICBza2lwSW5kZXhlcyA9ICEhbGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKGtleSA9PSAnbGVuZ3RoJyB8fCBpc0luZGV4KGtleSwgbGVuZ3RoKSkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNgIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XG4gIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fCByZUlzVWludC50ZXN0KHZhbHVlKSkgJiZcbiAgICAodmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8IGxlbmd0aCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiBgY29sbGVjdGlvbmAuIElmIGBjb2xsZWN0aW9uYCBpcyBhIHN0cmluZywgaXQnc1xuICogY2hlY2tlZCBmb3IgYSBzdWJzdHJpbmcgb2YgYHZhbHVlYCwgb3RoZXJ3aXNlXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogaXMgdXNlZCBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXNcbiAqIHRoZSBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBjb2xsZWN0aW9uYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gIGNvbGxlY3Rpb24gPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24gOiB2YWx1ZXMoY29sbGVjdGlvbik7XG4gIGZyb21JbmRleCA9IChmcm9tSW5kZXggJiYgIWd1YXJkKSA/IHRvSW50ZWdlcihmcm9tSW5kZXgpIDogMDtcblxuICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgZnJvbUluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGZyb21JbmRleCwgMCk7XG4gIH1cbiAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pXG4gICAgPyAoZnJvbUluZGV4IDw9IGxlbmd0aCAmJiBjb2xsZWN0aW9uLmluZGV4T2YodmFsdWUsIGZyb21JbmRleCkgPiAtMSlcbiAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcbiAgLy8gU2FmYXJpIDguMSBtYWtlcyBgYXJndW1lbnRzLmNhbGxlZWAgZW51bWVyYWJsZSBpbiBzdHJpY3QgbW9kZS5cbiAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgJiZcbiAgICAoIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKSB8fCBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBhcmdzVGFnKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvclxuICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWBcbiAqIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOC05IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5IGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBpc09iamVjdCh2YWx1ZSkgPyBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3RyaW5nKDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9JbnRlZ2VyKDMuMik7XG4gKiAvLyA9PiAzXG4gKlxuICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiAwXG4gKlxuICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZVxuICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogXy5rZXlzKCdoaScpO1xuICogLy8gPT4gWycwJywgJzEnXVxuICovXG5mdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy52YWx1ZXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbMSwgMl0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiBfLnZhbHVlcygnaGknKTtcbiAqIC8vID0+IFsnaCcsICdpJ11cbiAqL1xuZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0ID8gYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSkgOiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbmNsdWRlcztcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggMy4wLjMgKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCAyMDEyLTIwMTYgVGhlIERvam8gRm91bmRhdGlvbiA8aHR0cDovL2Rvam9mb3VuZGF0aW9uLm9yZy8+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IDIwMDktMjAxNiBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICogQXZhaWxhYmxlIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqL1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYm9vbGVhbiBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQm9vbGVhbihmYWxzZSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Jvb2xlYW4obnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IGJvb2xUYWcpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNCb29sZWFuO1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMCxcbiAgICBNQVhfSU5URUdFUiA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4LFxuICAgIE5BTiA9IDAgLyAwO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAqIFtgTnVtYmVyLmlzSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc0ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0ludGVnZXIoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNJbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0ludGVnZXIoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09IHRvSW50ZWdlcih2YWx1ZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNJbnRlZ2VyO1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCAzLjAuMyAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IDIwMTItMjAxNiBUaGUgRG9qbyBGb3VuZGF0aW9uIDxodHRwOi8vZG9qb2ZvdW5kYXRpb24ub3JnLz5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgMjAwOS0yMDE2IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKiBBdmFpbGFibGUgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICovXG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTnVtYmVyYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqICoqTm90ZToqKiBUbyBleGNsdWRlIGBJbmZpbml0eWAsIGAtSW5maW5pdHlgLCBhbmQgYE5hTmAsIHdoaWNoIGFyZSBjbGFzc2lmaWVkXG4gKiBhcyBudW1iZXJzLCB1c2UgdGhlIGBfLmlzRmluaXRlYCBtZXRob2QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNOdW1iZXIoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTnVtYmVyKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gbnVtYmVyVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc051bWJlcjtcbiIsCiAgICAiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0IGluIElFIDwgOS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGhvc3Qgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSG9zdE9iamVjdCh2YWx1ZSkge1xuICAvLyBNYW55IGhvc3Qgb2JqZWN0cyBhcmUgYE9iamVjdGAgb2JqZWN0cyB0aGF0IGNhbiBjb2VyY2UgdG8gc3RyaW5nc1xuICAvLyBkZXNwaXRlIGhhdmluZyBpbXByb3Blcmx5IGRlZmluZWQgYHRvU3RyaW5nYCBtZXRob2RzLlxuICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9ICEhKHZhbHVlICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC44LjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqIH1cbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8XG4gICAgICBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSAhPSBvYmplY3RUYWcgfHwgaXNIb3N0T2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiZcbiAgICBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJiBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1BsYWluT2JqZWN0O1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCA0LjAuMSAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IDIwMTItMjAxNiBUaGUgRG9qbyBGb3VuZGF0aW9uIDxodHRwOi8vZG9qb2ZvdW5kYXRpb24ub3JnLz5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgMjAwOS0yMDE2IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKiBBdmFpbGFibGUgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICovXG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAdHlwZSBGdW5jdGlvblxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3RyaW5nKDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaW5nO1xuIiwKICAgICIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzXG4gKiBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hpbGUgaXQncyBjYWxsZWQgbGVzcyB0aGFuIGBuYCB0aW1lcy4gU3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGF0IHdoaWNoIGBmdW5jYCBpcyBubyBsb25nZXIgaW52b2tlZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uYmVmb3JlKDUsIGFkZENvbnRhY3RUb0xpc3QpKTtcbiAqIC8vID0+IEFsbG93cyBhZGRpbmcgdXAgdG8gNCBjb250YWN0cyB0byB0aGUgbGlzdC5cbiAqL1xuZnVuY3Rpb24gYmVmb3JlKG4sIGZ1bmMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgbiA9IHRvSW50ZWdlcihuKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGlmICgtLW4gPiAwKSB7XG4gICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICAgIGlmIChuIDw9IDEpIHtcbiAgICAgIGZ1bmMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBpbnZva2luZyBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzXG4gKiB0byB0aGUgZnVuY3Rpb24gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbi4gVGhlIGBmdW5jYCBpc1xuICogaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgaW5pdGlhbGl6ZSA9IF8ub25jZShjcmVhdGVBcHBsaWNhdGlvbik7XG4gKiBpbml0aWFsaXplKCk7XG4gKiBpbml0aWFsaXplKCk7XG4gKiAvLyA9PiBgY3JlYXRlQXBwbGljYXRpb25gIGlzIGludm9rZWQgb25jZVxuICovXG5mdW5jdGlvbiBvbmNlKGZ1bmMpIHtcbiAgcmV0dXJuIGJlZm9yZSgyLCBmdW5jKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9JbnRlZ2VyKDMuMik7XG4gKiAvLyA9PiAzXG4gKlxuICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiAwXG4gKlxuICogXy50b0ludGVnZXIoSW5maW5pdHkpO1xuICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAqXG4gKiBfLnRvSW50ZWdlcignMy4yJyk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICByZXR1cm4gcmVzdWx0ID09PSByZXN1bHQgPyAocmVtYWluZGVyID8gcmVzdWx0IC0gcmVtYWluZGVyIDogcmVzdWx0KSA6IDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvbmNlO1xuIiwKICAgICJjb25zdCB0aW1lc3BhbiA9IHJlcXVpcmUoJy4vbGliL3RpbWVzcGFuJyk7XG5jb25zdCBQU19TVVBQT1JURUQgPSByZXF1aXJlKCcuL2xpYi9wc1N1cHBvcnRlZCcpO1xuY29uc3QgdmFsaWRhdGVBc3ltbWV0cmljS2V5ID0gcmVxdWlyZSgnLi9saWIvdmFsaWRhdGVBc3ltbWV0cmljS2V5Jyk7XG5jb25zdCBqd3MgPSByZXF1aXJlKCdqd3MnKTtcbmNvbnN0IGluY2x1ZGVzID0gcmVxdWlyZSgnbG9kYXNoLmluY2x1ZGVzJyk7XG5jb25zdCBpc0Jvb2xlYW4gPSByZXF1aXJlKCdsb2Rhc2guaXNib29sZWFuJyk7XG5jb25zdCBpc0ludGVnZXIgPSByZXF1aXJlKCdsb2Rhc2guaXNpbnRlZ2VyJyk7XG5jb25zdCBpc051bWJlciA9IHJlcXVpcmUoJ2xvZGFzaC5pc251bWJlcicpO1xuY29uc3QgaXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJ2xvZGFzaC5pc3BsYWlub2JqZWN0Jyk7XG5jb25zdCBpc1N0cmluZyA9IHJlcXVpcmUoJ2xvZGFzaC5pc3N0cmluZycpO1xuY29uc3Qgb25jZSA9IHJlcXVpcmUoJ2xvZGFzaC5vbmNlJyk7XG5jb25zdCB7IEtleU9iamVjdCwgY3JlYXRlU2VjcmV0S2V5LCBjcmVhdGVQcml2YXRlS2V5IH0gPSByZXF1aXJlKCdjcnlwdG8nKVxuXG5jb25zdCBTVVBQT1JURURfQUxHUyA9IFsnUlMyNTYnLCAnUlMzODQnLCAnUlM1MTInLCAnRVMyNTYnLCAnRVMzODQnLCAnRVM1MTInLCAnSFMyNTYnLCAnSFMzODQnLCAnSFM1MTInLCAnbm9uZSddO1xuaWYgKFBTX1NVUFBPUlRFRCkge1xuICBTVVBQT1JURURfQUxHUy5zcGxpY2UoMywgMCwgJ1BTMjU2JywgJ1BTMzg0JywgJ1BTNTEyJyk7XG59XG5cbmNvbnN0IHNpZ25fb3B0aW9uc19zY2hlbWEgPSB7XG4gIGV4cGlyZXNJbjogeyBpc1ZhbGlkOiBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSB8fCAoaXNTdHJpbmcodmFsdWUpICYmIHZhbHVlKTsgfSwgbWVzc2FnZTogJ1wiZXhwaXJlc0luXCIgc2hvdWxkIGJlIGEgbnVtYmVyIG9mIHNlY29uZHMgb3Igc3RyaW5nIHJlcHJlc2VudGluZyBhIHRpbWVzcGFuJyB9LFxuICBub3RCZWZvcmU6IHsgaXNWYWxpZDogZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIGlzSW50ZWdlcih2YWx1ZSkgfHwgKGlzU3RyaW5nKHZhbHVlKSAmJiB2YWx1ZSk7IH0sIG1lc3NhZ2U6ICdcIm5vdEJlZm9yZVwiIHNob3VsZCBiZSBhIG51bWJlciBvZiBzZWNvbmRzIG9yIHN0cmluZyByZXByZXNlbnRpbmcgYSB0aW1lc3BhbicgfSxcbiAgYXVkaWVuY2U6IHsgaXNWYWxpZDogZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIGlzU3RyaW5nKHZhbHVlKSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKTsgfSwgbWVzc2FnZTogJ1wiYXVkaWVuY2VcIiBtdXN0IGJlIGEgc3RyaW5nIG9yIGFycmF5JyB9LFxuICBhbGdvcml0aG06IHsgaXNWYWxpZDogaW5jbHVkZXMuYmluZChudWxsLCBTVVBQT1JURURfQUxHUyksIG1lc3NhZ2U6ICdcImFsZ29yaXRobVwiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW51bSB2YWx1ZScgfSxcbiAgaGVhZGVyOiB7IGlzVmFsaWQ6IGlzUGxhaW5PYmplY3QsIG1lc3NhZ2U6ICdcImhlYWRlclwiIG11c3QgYmUgYW4gb2JqZWN0JyB9LFxuICBlbmNvZGluZzogeyBpc1ZhbGlkOiBpc1N0cmluZywgbWVzc2FnZTogJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBpc3N1ZXI6IHsgaXNWYWxpZDogaXNTdHJpbmcsIG1lc3NhZ2U6ICdcImlzc3VlclwiIG11c3QgYmUgYSBzdHJpbmcnIH0sXG4gIHN1YmplY3Q6IHsgaXNWYWxpZDogaXNTdHJpbmcsIG1lc3NhZ2U6ICdcInN1YmplY3RcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBqd3RpZDogeyBpc1ZhbGlkOiBpc1N0cmluZywgbWVzc2FnZTogJ1wiand0aWRcIiBtdXN0IGJlIGEgc3RyaW5nJyB9LFxuICBub1RpbWVzdGFtcDogeyBpc1ZhbGlkOiBpc0Jvb2xlYW4sIG1lc3NhZ2U6ICdcIm5vVGltZXN0YW1wXCIgbXVzdCBiZSBhIGJvb2xlYW4nIH0sXG4gIGtleWlkOiB7IGlzVmFsaWQ6IGlzU3RyaW5nLCBtZXNzYWdlOiAnXCJrZXlpZFwiIG11c3QgYmUgYSBzdHJpbmcnIH0sXG4gIG11dGF0ZVBheWxvYWQ6IHsgaXNWYWxpZDogaXNCb29sZWFuLCBtZXNzYWdlOiAnXCJtdXRhdGVQYXlsb2FkXCIgbXVzdCBiZSBhIGJvb2xlYW4nIH0sXG4gIGFsbG93SW5zZWN1cmVLZXlTaXplczogeyBpc1ZhbGlkOiBpc0Jvb2xlYW4sIG1lc3NhZ2U6ICdcImFsbG93SW5zZWN1cmVLZXlTaXplc1wiIG11c3QgYmUgYSBib29sZWFuJ30sXG4gIGFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlczogeyBpc1ZhbGlkOiBpc0Jvb2xlYW4sIG1lc3NhZ2U6ICdcImFsbG93SW52YWxpZEFzeW1tZXRyaWNLZXlUeXBlc1wiIG11c3QgYmUgYSBib29sZWFuJ31cbn07XG5cbmNvbnN0IHJlZ2lzdGVyZWRfY2xhaW1zX3NjaGVtYSA9IHtcbiAgaWF0OiB7IGlzVmFsaWQ6IGlzTnVtYmVyLCBtZXNzYWdlOiAnXCJpYXRcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcycgfSxcbiAgZXhwOiB7IGlzVmFsaWQ6IGlzTnVtYmVyLCBtZXNzYWdlOiAnXCJleHBcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcycgfSxcbiAgbmJmOiB7IGlzVmFsaWQ6IGlzTnVtYmVyLCBtZXNzYWdlOiAnXCJuYmZcIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcycgfVxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGUoc2NoZW1hLCBhbGxvd1Vua25vd24sIG9iamVjdCwgcGFyYW1ldGVyTmFtZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3Qob2JqZWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgXCInICsgcGFyYW1ldGVyTmFtZSArICdcIiB0byBiZSBhIHBsYWluIG9iamVjdC4nKTtcbiAgfVxuICBPYmplY3Qua2V5cyhvYmplY3QpXG4gICAgLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSBzY2hlbWFba2V5XTtcbiAgICAgIGlmICghdmFsaWRhdG9yKSB7XG4gICAgICAgIGlmICghYWxsb3dVbmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBrZXkgKyAnXCIgaXMgbm90IGFsbG93ZWQgaW4gXCInICsgcGFyYW1ldGVyTmFtZSArICdcIicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghdmFsaWRhdG9yLmlzVmFsaWQob2JqZWN0W2tleV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih2YWxpZGF0b3IubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKSB7XG4gIHJldHVybiB2YWxpZGF0ZShzaWduX29wdGlvbnNfc2NoZW1hLCBmYWxzZSwgb3B0aW9ucywgJ29wdGlvbnMnKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQYXlsb2FkKHBheWxvYWQpIHtcbiAgcmV0dXJuIHZhbGlkYXRlKHJlZ2lzdGVyZWRfY2xhaW1zX3NjaGVtYSwgdHJ1ZSwgcGF5bG9hZCwgJ3BheWxvYWQnKTtcbn1cblxuY29uc3Qgb3B0aW9uc190b19wYXlsb2FkID0ge1xuICAnYXVkaWVuY2UnOiAnYXVkJyxcbiAgJ2lzc3Vlcic6ICdpc3MnLFxuICAnc3ViamVjdCc6ICdzdWInLFxuICAnand0aWQnOiAnanRpJ1xufTtcblxuY29uc3Qgb3B0aW9uc19mb3Jfb2JqZWN0cyA9IFtcbiAgJ2V4cGlyZXNJbicsXG4gICdub3RCZWZvcmUnLFxuICAnbm9UaW1lc3RhbXAnLFxuICAnYXVkaWVuY2UnLFxuICAnaXNzdWVyJyxcbiAgJ3N1YmplY3QnLFxuICAnand0aWQnLFxuXTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocGF5bG9hZCwgc2VjcmV0T3JQcml2YXRlS2V5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB9XG5cbiAgY29uc3QgaXNPYmplY3RQYXlsb2FkID0gdHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhQnVmZmVyLmlzQnVmZmVyKHBheWxvYWQpO1xuXG4gIGNvbnN0IGhlYWRlciA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGFsZzogb3B0aW9ucy5hbGdvcml0aG0gfHwgJ0hTMjU2JyxcbiAgICB0eXA6IGlzT2JqZWN0UGF5bG9hZCA/ICdKV1QnIDogdW5kZWZpbmVkLFxuICAgIGtpZDogb3B0aW9ucy5rZXlpZFxuICB9LCBvcHRpb25zLmhlYWRlcik7XG5cbiAgZnVuY3Rpb24gZmFpbHVyZShlcnIpIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBpZiAoIXNlY3JldE9yUHJpdmF0ZUtleSAmJiBvcHRpb25zLmFsZ29yaXRobSAhPT0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdzZWNyZXRPclByaXZhdGVLZXkgbXVzdCBoYXZlIGEgdmFsdWUnKSk7XG4gIH1cblxuICBpZiAoc2VjcmV0T3JQcml2YXRlS2V5ICE9IG51bGwgJiYgIShzZWNyZXRPclByaXZhdGVLZXkgaW5zdGFuY2VvZiBLZXlPYmplY3QpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHNlY3JldE9yUHJpdmF0ZUtleSA9IGNyZWF0ZVByaXZhdGVLZXkoc2VjcmV0T3JQcml2YXRlS2V5KVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlY3JldE9yUHJpdmF0ZUtleSA9IGNyZWF0ZVNlY3JldEtleSh0eXBlb2Ygc2VjcmV0T3JQcml2YXRlS2V5ID09PSAnc3RyaW5nJyA/IEJ1ZmZlci5mcm9tKHNlY3JldE9yUHJpdmF0ZUtleSkgOiBzZWNyZXRPclByaXZhdGVLZXkpXG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignc2VjcmV0T3JQcml2YXRlS2V5IGlzIG5vdCB2YWxpZCBrZXkgbWF0ZXJpYWwnKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGhlYWRlci5hbGcuc3RhcnRzV2l0aCgnSFMnKSAmJiBzZWNyZXRPclByaXZhdGVLZXkudHlwZSAhPT0gJ3NlY3JldCcpIHtcbiAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoKGBzZWNyZXRPclByaXZhdGVLZXkgbXVzdCBiZSBhIHN5bW1ldHJpYyBrZXkgd2hlbiB1c2luZyAke2hlYWRlci5hbGd9YCkpKVxuICB9IGVsc2UgaWYgKC9eKD86UlN8UFN8RVMpLy50ZXN0KGhlYWRlci5hbGcpKSB7XG4gICAgaWYgKHNlY3JldE9yUHJpdmF0ZUtleS50eXBlICE9PSAncHJpdmF0ZScpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcigoYHNlY3JldE9yUHJpdmF0ZUtleSBtdXN0IGJlIGFuIGFzeW1tZXRyaWMga2V5IHdoZW4gdXNpbmcgJHtoZWFkZXIuYWxnfWApKSlcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmFsbG93SW5zZWN1cmVLZXlTaXplcyAmJlxuICAgICAgIWhlYWRlci5hbGcuc3RhcnRzV2l0aCgnRVMnKSAmJlxuICAgICAgc2VjcmV0T3JQcml2YXRlS2V5LmFzeW1tZXRyaWNLZXlEZXRhaWxzICE9PSB1bmRlZmluZWQgJiYgLy9LZXlPYmplY3QuYXN5bW1ldHJpY0tleURldGFpbHMgaXMgc3VwcG9ydGVkIGluIE5vZGUgMTUrXG4gICAgICBzZWNyZXRPclByaXZhdGVLZXkuYXN5bW1ldHJpY0tleURldGFpbHMubW9kdWx1c0xlbmd0aCA8IDIwNDgpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcihgc2VjcmV0T3JQcml2YXRlS2V5IGhhcyBhIG1pbmltdW0ga2V5IHNpemUgb2YgMjA0OCBiaXRzIGZvciAke2hlYWRlci5hbGd9YCkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ3BheWxvYWQgaXMgcmVxdWlyZWQnKSk7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3RQYXlsb2FkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlUGF5bG9hZChwYXlsb2FkKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShlcnJvcik7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5tdXRhdGVQYXlsb2FkKSB7XG4gICAgICBwYXlsb2FkID0gT2JqZWN0LmFzc2lnbih7fSxwYXlsb2FkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaW52YWxpZF9vcHRpb25zID0gb3B0aW9uc19mb3Jfb2JqZWN0cy5maWx0ZXIoZnVuY3Rpb24gKG9wdCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvcHRpb25zW29wdF0gIT09ICd1bmRlZmluZWQnO1xuICAgIH0pO1xuXG4gICAgaWYgKGludmFsaWRfb3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ2ludmFsaWQgJyArIGludmFsaWRfb3B0aW9ucy5qb2luKCcsJykgKyAnIG9wdGlvbiBmb3IgJyArICh0eXBlb2YgcGF5bG9hZCApICsgJyBwYXlsb2FkJykpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF5bG9hZC5leHAgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBvcHRpb25zLmV4cGlyZXNJbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFpbHVyZShuZXcgRXJyb3IoJ0JhZCBcIm9wdGlvbnMuZXhwaXJlc0luXCIgb3B0aW9uIHRoZSBwYXlsb2FkIGFscmVhZHkgaGFzIGFuIFwiZXhwXCIgcHJvcGVydHkuJykpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwYXlsb2FkLm5iZiAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdGlvbnMubm90QmVmb3JlICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignQmFkIFwib3B0aW9ucy5ub3RCZWZvcmVcIiBvcHRpb24gdGhlIHBheWxvYWQgYWxyZWFkeSBoYXMgYW4gXCJuYmZcIiBwcm9wZXJ0eS4nKSk7XG4gIH1cblxuICB0cnkge1xuICAgIHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFpbHVyZShlcnJvcik7XG4gIH1cblxuICBpZiAoIW9wdGlvbnMuYWxsb3dJbnZhbGlkQXN5bW1ldHJpY0tleVR5cGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlQXN5bW1ldHJpY0tleShoZWFkZXIuYWxnLCBzZWNyZXRPclByaXZhdGVLZXkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdGltZXN0YW1wID0gcGF5bG9hZC5pYXQgfHwgTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG5cbiAgaWYgKG9wdGlvbnMubm9UaW1lc3RhbXApIHtcbiAgICBkZWxldGUgcGF5bG9hZC5pYXQ7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3RQYXlsb2FkKSB7XG4gICAgcGF5bG9hZC5pYXQgPSB0aW1lc3RhbXA7XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMubm90QmVmb3JlICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRyeSB7XG4gICAgICBwYXlsb2FkLm5iZiA9IHRpbWVzcGFuKG9wdGlvbnMubm90QmVmb3JlLCB0aW1lc3RhbXApO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gZmFpbHVyZShlcnIpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBheWxvYWQubmJmID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdcIm5vdEJlZm9yZVwiIHNob3VsZCBiZSBhIG51bWJlciBvZiBzZWNvbmRzIG9yIHN0cmluZyByZXByZXNlbnRpbmcgYSB0aW1lc3BhbiBlZzogXCIxZFwiLCBcIjIwaFwiLCA2MCcpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMuZXhwaXJlc0luICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcpIHtcbiAgICB0cnkge1xuICAgICAgcGF5bG9hZC5leHAgPSB0aW1lc3BhbihvcHRpb25zLmV4cGlyZXNJbiwgdGltZXN0YW1wKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIGZhaWx1cmUoZXJyKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkLmV4cCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmYWlsdXJlKG5ldyBFcnJvcignXCJleHBpcmVzSW5cIiBzaG91bGQgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcyBvciBzdHJpbmcgcmVwcmVzZW50aW5nIGEgdGltZXNwYW4gZWc6IFwiMWRcIiwgXCIyMGhcIiwgNjAnKSk7XG4gICAgfVxuICB9XG5cbiAgT2JqZWN0LmtleXMob3B0aW9uc190b19wYXlsb2FkKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBjb25zdCBjbGFpbSA9IG9wdGlvbnNfdG9fcGF5bG9hZFtrZXldO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uc1trZXldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkW2NsYWltXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIGZhaWx1cmUobmV3IEVycm9yKCdCYWQgXCJvcHRpb25zLicgKyBrZXkgKyAnXCIgb3B0aW9uLiBUaGUgcGF5bG9hZCBhbHJlYWR5IGhhcyBhbiBcIicgKyBjbGFpbSArICdcIiBwcm9wZXJ0eS4nKSk7XG4gICAgICB9XG4gICAgICBwYXlsb2FkW2NsYWltXSA9IG9wdGlvbnNba2V5XTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgJiYgb25jZShjYWxsYmFjayk7XG5cbiAgICBqd3MuY3JlYXRlU2lnbih7XG4gICAgICBoZWFkZXI6IGhlYWRlcixcbiAgICAgIHByaXZhdGVLZXk6IHNlY3JldE9yUHJpdmF0ZUtleSxcbiAgICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgICBlbmNvZGluZzogZW5jb2RpbmdcbiAgICB9KS5vbmNlKCdlcnJvcicsIGNhbGxiYWNrKVxuICAgICAgLm9uY2UoJ2RvbmUnLCBmdW5jdGlvbiAoc2lnbmF0dXJlKSB7XG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBpbiBmYXZvciBvZiB0aGUgbW9kdWx1cyBsZW5ndGggY2hlY2sgYmVmb3JlIHNpZ25pbmcgb25jZSBub2RlIDE1KyBpcyB0aGUgbWluaW11bSBzdXBwb3J0ZWQgdmVyc2lvblxuICAgICAgICBpZighb3B0aW9ucy5hbGxvd0luc2VjdXJlS2V5U2l6ZXMgJiYgL14oPzpSU3xQUykvLnRlc3QoaGVhZGVyLmFsZykgJiYgc2lnbmF0dXJlLmxlbmd0aCA8IDI1Nikge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYHNlY3JldE9yUHJpdmF0ZUtleSBoYXMgYSBtaW5pbXVtIGtleSBzaXplIG9mIDIwNDggYml0cyBmb3IgJHtoZWFkZXIuYWxnfWApKVxuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHNpZ25hdHVyZSk7XG4gICAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgc2lnbmF0dXJlID0gandzLnNpZ24oe2hlYWRlcjogaGVhZGVyLCBwYXlsb2FkOiBwYXlsb2FkLCBzZWNyZXQ6IHNlY3JldE9yUHJpdmF0ZUtleSwgZW5jb2Rpbmc6IGVuY29kaW5nfSk7XG4gICAgLy8gVE9ETzogUmVtb3ZlIGluIGZhdm9yIG9mIHRoZSBtb2R1bHVzIGxlbmd0aCBjaGVjayBiZWZvcmUgc2lnbmluZyBvbmNlIG5vZGUgMTUrIGlzIHRoZSBtaW5pbXVtIHN1cHBvcnRlZCB2ZXJzaW9uXG4gICAgaWYoIW9wdGlvbnMuYWxsb3dJbnNlY3VyZUtleVNpemVzICYmIC9eKD86UlN8UFMpLy50ZXN0KGhlYWRlci5hbGcpICYmIHNpZ25hdHVyZS5sZW5ndGggPCAyNTYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgc2VjcmV0T3JQcml2YXRlS2V5IGhhcyBhIG1pbmltdW0ga2V5IHNpemUgb2YgMjA0OCBiaXRzIGZvciAke2hlYWRlci5hbGd9YClcbiAgICB9XG4gICAgcmV0dXJuIHNpZ25hdHVyZVxuICB9XG59O1xuIiwKICAgICJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgZGVjb2RlOiByZXF1aXJlKCcuL2RlY29kZScpLFxuICB2ZXJpZnk6IHJlcXVpcmUoJy4vdmVyaWZ5JyksXG4gIHNpZ246IHJlcXVpcmUoJy4vc2lnbicpLFxuICBKc29uV2ViVG9rZW5FcnJvcjogcmVxdWlyZSgnLi9saWIvSnNvbldlYlRva2VuRXJyb3InKSxcbiAgTm90QmVmb3JlRXJyb3I6IHJlcXVpcmUoJy4vbGliL05vdEJlZm9yZUVycm9yJyksXG4gIFRva2VuRXhwaXJlZEVycm9yOiByZXF1aXJlKCcuL2xpYi9Ub2tlbkV4cGlyZWRFcnJvcicpLFxufTtcbiIsCiAgICAiKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIFV0aWxzXG4gIGZ1bmN0aW9uIGFzc2VydCAodmFsLCBtc2cpIHtcbiAgICBpZiAoIXZhbCkgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCAnQXNzZXJ0aW9uIGZhaWxlZCcpO1xuICB9XG5cbiAgLy8gQ291bGQgdXNlIGBpbmhlcml0c2AgbW9kdWxlLCBidXQgZG9uJ3Qgd2FudCB0byBtb3ZlIGZyb20gc2luZ2xlIGZpbGVcbiAgLy8gYXJjaGl0ZWN0dXJlIHlldC5cbiAgZnVuY3Rpb24gaW5oZXJpdHMgKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yO1xuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGU7XG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKTtcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7XG4gIH1cblxuICAvLyBCTlxuXG4gIGZ1bmN0aW9uIEJOIChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIGlmIChCTi5pc0JOKG51bWJlcikpIHtcbiAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuXG4gICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgdGhpcy53b3JkcyA9IG51bGw7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuXG4gICAgLy8gUmVkdWN0aW9uIGNvbnRleHRcbiAgICB0aGlzLnJlZCA9IG51bGw7XG5cbiAgICBpZiAobnVtYmVyICE9PSBudWxsKSB7XG4gICAgICBpZiAoYmFzZSA9PT0gJ2xlJyB8fCBiYXNlID09PSAnYmUnKSB7XG4gICAgICAgIGVuZGlhbiA9IGJhc2U7XG4gICAgICAgIGJhc2UgPSAxMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faW5pdChudW1iZXIgfHwgMCwgYmFzZSB8fCAxMCwgZW5kaWFuIHx8ICdiZScpO1xuICAgIH1cbiAgfVxuICBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEJOO1xuICB9IGVsc2Uge1xuICAgIGV4cG9ydHMuQk4gPSBCTjtcbiAgfVxuXG4gIEJOLkJOID0gQk47XG4gIEJOLndvcmRTaXplID0gMjY7XG5cbiAgdmFyIEJ1ZmZlcjtcbiAgdHJ5IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5CdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBCdWZmZXIgPSB3aW5kb3cuQnVmZmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gIH1cblxuICBCTi5pc0JOID0gZnVuY3Rpb24gaXNCTiAobnVtKSB7XG4gICAgaWYgKG51bSBpbnN0YW5jZW9mIEJOKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVtICE9PSBudWxsICYmIHR5cGVvZiBudW0gPT09ICdvYmplY3QnICYmXG4gICAgICBudW0uY29uc3RydWN0b3Iud29yZFNpemUgPT09IEJOLndvcmRTaXplICYmIEFycmF5LmlzQXJyYXkobnVtLndvcmRzKTtcbiAgfTtcblxuICBCTi5tYXggPSBmdW5jdGlvbiBtYXggKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKGxlZnQuY21wKHJpZ2h0KSA+IDApIHJldHVybiBsZWZ0O1xuICAgIHJldHVybiByaWdodDtcbiAgfTtcblxuICBCTi5taW4gPSBmdW5jdGlvbiBtaW4gKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKGxlZnQuY21wKHJpZ2h0KSA8IDApIHJldHVybiBsZWZ0O1xuICAgIHJldHVybiByaWdodDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0IChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIGlmICh0eXBlb2YgbnVtYmVyID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHRoaXMuX2luaXROdW1iZXIobnVtYmVyLCBiYXNlLCBlbmRpYW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbnVtYmVyID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuX2luaXRBcnJheShudW1iZXIsIGJhc2UsIGVuZGlhbik7XG4gICAgfVxuXG4gICAgaWYgKGJhc2UgPT09ICdoZXgnKSB7XG4gICAgICBiYXNlID0gMTY7XG4gICAgfVxuICAgIGFzc2VydChiYXNlID09PSAoYmFzZSB8IDApICYmIGJhc2UgPj0gMiAmJiBiYXNlIDw9IDM2KTtcblxuICAgIG51bWJlciA9IG51bWJlci50b1N0cmluZygpLnJlcGxhY2UoL1xccysvZywgJycpO1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgaWYgKG51bWJlclswXSA9PT0gJy0nKSB7XG4gICAgICBzdGFydCsrO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0IDwgbnVtYmVyLmxlbmd0aCkge1xuICAgICAgaWYgKGJhc2UgPT09IDE2KSB7XG4gICAgICAgIHRoaXMuX3BhcnNlSGV4KG51bWJlciwgc3RhcnQsIGVuZGlhbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9wYXJzZUJhc2UobnVtYmVyLCBiYXNlLCBzdGFydCk7XG4gICAgICAgIGlmIChlbmRpYW4gPT09ICdsZScpIHtcbiAgICAgICAgICB0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksIGJhc2UsIGVuZGlhbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0TnVtYmVyID0gZnVuY3Rpb24gX2luaXROdW1iZXIgKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgbnVtYmVyID0gLW51bWJlcjtcbiAgICB9XG4gICAgaWYgKG51bWJlciA8IDB4NDAwMDAwMCkge1xuICAgICAgdGhpcy53b3JkcyA9IFsgbnVtYmVyICYgMHgzZmZmZmZmIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgfSBlbHNlIGlmIChudW1iZXIgPCAweDEwMDAwMDAwMDAwMDAwKSB7XG4gICAgICB0aGlzLndvcmRzID0gW1xuICAgICAgICBudW1iZXIgJiAweDNmZmZmZmYsXG4gICAgICAgIChudW1iZXIgLyAweDQwMDAwMDApICYgMHgzZmZmZmZmXG4gICAgICBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQobnVtYmVyIDwgMHgyMDAwMDAwMDAwMDAwMCk7IC8vIDIgXiA1MyAodW5zYWZlKVxuICAgICAgdGhpcy53b3JkcyA9IFtcbiAgICAgICAgbnVtYmVyICYgMHgzZmZmZmZmLFxuICAgICAgICAobnVtYmVyIC8gMHg0MDAwMDAwKSAmIDB4M2ZmZmZmZixcbiAgICAgICAgMVxuICAgICAgXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMztcbiAgICB9XG5cbiAgICBpZiAoZW5kaWFuICE9PSAnbGUnKSByZXR1cm47XG5cbiAgICAvLyBSZXZlcnNlIHRoZSBieXRlc1xuICAgIHRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSwgYmFzZSwgZW5kaWFuKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2luaXRBcnJheSA9IGZ1bmN0aW9uIF9pbml0QXJyYXkgKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgLy8gUGVyaGFwcyBhIFVpbnQ4QXJyYXlcbiAgICBhc3NlcnQodHlwZW9mIG51bWJlci5sZW5ndGggPT09ICdudW1iZXInKTtcbiAgICBpZiAobnVtYmVyLmxlbmd0aCA8PSAwKSB7XG4gICAgICB0aGlzLndvcmRzID0gWyAwIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbChudW1iZXIubGVuZ3RoIC8gMyk7XG4gICAgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gMDtcbiAgICB9XG5cbiAgICB2YXIgaiwgdztcbiAgICB2YXIgb2ZmID0gMDtcbiAgICBpZiAoZW5kaWFuID09PSAnYmUnKSB7XG4gICAgICBmb3IgKGkgPSBudW1iZXIubGVuZ3RoIC0gMSwgaiA9IDA7IGkgPj0gMDsgaSAtPSAzKSB7XG4gICAgICAgIHcgPSBudW1iZXJbaV0gfCAobnVtYmVyW2kgLSAxXSA8PCA4KSB8IChudW1iZXJbaSAtIDJdIDw8IDE2KTtcbiAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSAodyA8PCBvZmYpICYgMHgzZmZmZmZmO1xuICAgICAgICB0aGlzLndvcmRzW2ogKyAxXSA9ICh3ID4+PiAoMjYgLSBvZmYpKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgb2ZmICs9IDI0O1xuICAgICAgICBpZiAob2ZmID49IDI2KSB7XG4gICAgICAgICAgb2ZmIC09IDI2O1xuICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5kaWFuID09PSAnbGUnKSB7XG4gICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IG51bWJlci5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICB3ID0gbnVtYmVyW2ldIHwgKG51bWJlcltpICsgMV0gPDwgOCkgfCAobnVtYmVyW2kgKyAyXSA8PCAxNik7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gKHcgPDwgb2ZmKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgdGhpcy53b3Jkc1tqICsgMV0gPSAodyA+Pj4gKDI2IC0gb2ZmKSkgJiAweDNmZmZmZmY7XG4gICAgICAgIG9mZiArPSAyNDtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBmdW5jdGlvbiBwYXJzZUhleDRCaXRzIChzdHJpbmcsIGluZGV4KSB7XG4gICAgdmFyIGMgPSBzdHJpbmcuY2hhckNvZGVBdChpbmRleCk7XG4gICAgLy8gJ0EnIC0gJ0YnXG4gICAgaWYgKGMgPj0gNjUgJiYgYyA8PSA3MCkge1xuICAgICAgcmV0dXJuIGMgLSA1NTtcbiAgICAvLyAnYScgLSAnZidcbiAgICB9IGVsc2UgaWYgKGMgPj0gOTcgJiYgYyA8PSAxMDIpIHtcbiAgICAgIHJldHVybiBjIC0gODc7XG4gICAgLy8gJzAnIC0gJzknXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoYyAtIDQ4KSAmIDB4ZjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUhleEJ5dGUgKHN0cmluZywgbG93ZXJCb3VuZCwgaW5kZXgpIHtcbiAgICB2YXIgciA9IHBhcnNlSGV4NEJpdHMoc3RyaW5nLCBpbmRleCk7XG4gICAgaWYgKGluZGV4IC0gMSA+PSBsb3dlckJvdW5kKSB7XG4gICAgICByIHw9IHBhcnNlSGV4NEJpdHMoc3RyaW5nLCBpbmRleCAtIDEpIDw8IDQ7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl9wYXJzZUhleCA9IGZ1bmN0aW9uIF9wYXJzZUhleCAobnVtYmVyLCBzdGFydCwgZW5kaWFuKSB7XG4gICAgLy8gQ3JlYXRlIHBvc3NpYmx5IGJpZ2dlciBhcnJheSB0byBlbnN1cmUgdGhhdCBpdCBmaXRzIHRoZSBudW1iZXJcbiAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbCgobnVtYmVyLmxlbmd0aCAtIHN0YXJ0KSAvIDYpO1xuICAgIHRoaXMud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IDA7XG4gICAgfVxuXG4gICAgLy8gMjQtYml0cyBjaHVua3NcbiAgICB2YXIgb2ZmID0gMDtcbiAgICB2YXIgaiA9IDA7XG5cbiAgICB2YXIgdztcbiAgICBpZiAoZW5kaWFuID09PSAnYmUnKSB7XG4gICAgICBmb3IgKGkgPSBudW1iZXIubGVuZ3RoIC0gMTsgaSA+PSBzdGFydDsgaSAtPSAyKSB7XG4gICAgICAgIHcgPSBwYXJzZUhleEJ5dGUobnVtYmVyLCBzdGFydCwgaSkgPDwgb2ZmO1xuICAgICAgICB0aGlzLndvcmRzW2pdIHw9IHcgJiAweDNmZmZmZmY7XG4gICAgICAgIGlmIChvZmYgPj0gMTgpIHtcbiAgICAgICAgICBvZmYgLT0gMTg7XG4gICAgICAgICAgaiArPSAxO1xuICAgICAgICAgIHRoaXMud29yZHNbal0gfD0gdyA+Pj4gMjY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2ZmICs9IDg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHBhcnNlTGVuZ3RoID0gbnVtYmVyLmxlbmd0aCAtIHN0YXJ0O1xuICAgICAgZm9yIChpID0gcGFyc2VMZW5ndGggJSAyID09PSAwID8gc3RhcnQgKyAxIDogc3RhcnQ7IGkgPCBudW1iZXIubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgdyA9IHBhcnNlSGV4Qnl0ZShudW1iZXIsIHN0YXJ0LCBpKSA8PCBvZmY7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gdyAmIDB4M2ZmZmZmZjtcbiAgICAgICAgaWYgKG9mZiA+PSAxOCkge1xuICAgICAgICAgIG9mZiAtPSAxODtcbiAgICAgICAgICBqICs9IDE7XG4gICAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSB3ID4+PiAyNjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmYgKz0gODtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBmdW5jdGlvbiBwYXJzZUJhc2UgKHN0ciwgc3RhcnQsIGVuZCwgbXVsKSB7XG4gICAgdmFyIHIgPSAwO1xuICAgIHZhciBsZW4gPSBNYXRoLm1pbihzdHIubGVuZ3RoLCBlbmQpO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgYyA9IHN0ci5jaGFyQ29kZUF0KGkpIC0gNDg7XG5cbiAgICAgIHIgKj0gbXVsO1xuXG4gICAgICAvLyAnYSdcbiAgICAgIGlmIChjID49IDQ5KSB7XG4gICAgICAgIHIgKz0gYyAtIDQ5ICsgMHhhO1xuXG4gICAgICAvLyAnQSdcbiAgICAgIH0gZWxzZSBpZiAoYyA+PSAxNykge1xuICAgICAgICByICs9IGMgLSAxNyArIDB4YTtcblxuICAgICAgLy8gJzAnIC0gJzknXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByICs9IGM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl9wYXJzZUJhc2UgPSBmdW5jdGlvbiBfcGFyc2VCYXNlIChudW1iZXIsIGJhc2UsIHN0YXJ0KSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBhcyB6ZXJvXG4gICAgdGhpcy53b3JkcyA9IFsgMCBdO1xuICAgIHRoaXMubGVuZ3RoID0gMTtcblxuICAgIC8vIEZpbmQgbGVuZ3RoIG9mIGxpbWIgaW4gYmFzZVxuICAgIGZvciAodmFyIGxpbWJMZW4gPSAwLCBsaW1iUG93ID0gMTsgbGltYlBvdyA8PSAweDNmZmZmZmY7IGxpbWJQb3cgKj0gYmFzZSkge1xuICAgICAgbGltYkxlbisrO1xuICAgIH1cbiAgICBsaW1iTGVuLS07XG4gICAgbGltYlBvdyA9IChsaW1iUG93IC8gYmFzZSkgfCAwO1xuXG4gICAgdmFyIHRvdGFsID0gbnVtYmVyLmxlbmd0aCAtIHN0YXJ0O1xuICAgIHZhciBtb2QgPSB0b3RhbCAlIGxpbWJMZW47XG4gICAgdmFyIGVuZCA9IE1hdGgubWluKHRvdGFsLCB0b3RhbCAtIG1vZCkgKyBzdGFydDtcblxuICAgIHZhciB3b3JkID0gMDtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gbGltYkxlbikge1xuICAgICAgd29yZCA9IHBhcnNlQmFzZShudW1iZXIsIGksIGkgKyBsaW1iTGVuLCBiYXNlKTtcblxuICAgICAgdGhpcy5pbXVsbihsaW1iUG93KTtcbiAgICAgIGlmICh0aGlzLndvcmRzWzBdICsgd29yZCA8IDB4NDAwMDAwMCkge1xuICAgICAgICB0aGlzLndvcmRzWzBdICs9IHdvcmQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pYWRkbih3b3JkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9kICE9PSAwKSB7XG4gICAgICB2YXIgcG93ID0gMTtcbiAgICAgIHdvcmQgPSBwYXJzZUJhc2UobnVtYmVyLCBpLCBudW1iZXIubGVuZ3RoLCBiYXNlKTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IG1vZDsgaSsrKSB7XG4gICAgICAgIHBvdyAqPSBiYXNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmltdWxuKHBvdyk7XG4gICAgICBpZiAodGhpcy53b3Jkc1swXSArIHdvcmQgPCAweDQwMDAwMDApIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSArPSB3b3JkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faWFkZG4od29yZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAoZGVzdCkge1xuICAgIGRlc3Qud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgZGVzdC53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV07XG4gICAgfVxuICAgIGRlc3QubGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgZGVzdC5uZWdhdGl2ZSA9IHRoaXMubmVnYXRpdmU7XG4gICAgZGVzdC5yZWQgPSB0aGlzLnJlZDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiBjbG9uZSAoKSB7XG4gICAgdmFyIHIgPSBuZXcgQk4obnVsbCk7XG4gICAgdGhpcy5jb3B5KHIpO1xuICAgIHJldHVybiByO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fZXhwYW5kID0gZnVuY3Rpb24gX2V4cGFuZCAoc2l6ZSkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA8IHNpemUpIHtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGgrK10gPSAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBSZW1vdmUgbGVhZGluZyBgMGAgZnJvbSBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnN0cmlwID0gZnVuY3Rpb24gc3RyaXAgKCkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA+IDEgJiYgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdID09PSAwKSB7XG4gICAgICB0aGlzLmxlbmd0aC0tO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX25vcm1TaWduID0gZnVuY3Rpb24gX25vcm1TaWduICgpIHtcbiAgICAvLyAtMCA9IDBcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA9PT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLnJlZCA/ICc8Qk4tUjogJyA6ICc8Qk46ICcpICsgdGhpcy50b1N0cmluZygxNikgKyAnPic7XG4gIH07XG5cbiAgLypcblxuICB2YXIgemVyb3MgPSBbXTtcbiAgdmFyIGdyb3VwU2l6ZXMgPSBbXTtcbiAgdmFyIGdyb3VwQmFzZXMgPSBbXTtcblxuICB2YXIgcyA9ICcnO1xuICB2YXIgaSA9IC0xO1xuICB3aGlsZSAoKytpIDwgQk4ud29yZFNpemUpIHtcbiAgICB6ZXJvc1tpXSA9IHM7XG4gICAgcyArPSAnMCc7XG4gIH1cbiAgZ3JvdXBTaXplc1swXSA9IDA7XG4gIGdyb3VwU2l6ZXNbMV0gPSAwO1xuICBncm91cEJhc2VzWzBdID0gMDtcbiAgZ3JvdXBCYXNlc1sxXSA9IDA7XG4gIHZhciBiYXNlID0gMiAtIDE7XG4gIHdoaWxlICgrK2Jhc2UgPCAzNiArIDEpIHtcbiAgICB2YXIgZ3JvdXBTaXplID0gMDtcbiAgICB2YXIgZ3JvdXBCYXNlID0gMTtcbiAgICB3aGlsZSAoZ3JvdXBCYXNlIDwgKDEgPDwgQk4ud29yZFNpemUpIC8gYmFzZSkge1xuICAgICAgZ3JvdXBCYXNlICo9IGJhc2U7XG4gICAgICBncm91cFNpemUgKz0gMTtcbiAgICB9XG4gICAgZ3JvdXBTaXplc1tiYXNlXSA9IGdyb3VwU2l6ZTtcbiAgICBncm91cEJhc2VzW2Jhc2VdID0gZ3JvdXBCYXNlO1xuICB9XG5cbiAgKi9cblxuICB2YXIgemVyb3MgPSBbXG4gICAgJycsXG4gICAgJzAnLFxuICAgICcwMCcsXG4gICAgJzAwMCcsXG4gICAgJzAwMDAnLFxuICAgICcwMDAwMCcsXG4gICAgJzAwMDAwMCcsXG4gICAgJzAwMDAwMDAnLFxuICAgICcwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnXG4gIF07XG5cbiAgdmFyIGdyb3VwU2l6ZXMgPSBbXG4gICAgMCwgMCxcbiAgICAyNSwgMTYsIDEyLCAxMSwgMTAsIDksIDgsXG4gICAgOCwgNywgNywgNywgNywgNiwgNixcbiAgICA2LCA2LCA2LCA2LCA2LCA1LCA1LFxuICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNVxuICBdO1xuXG4gIHZhciBncm91cEJhc2VzID0gW1xuICAgIDAsIDAsXG4gICAgMzM1NTQ0MzIsIDQzMDQ2NzIxLCAxNjc3NzIxNiwgNDg4MjgxMjUsIDYwNDY2MTc2LCA0MDM1MzYwNywgMTY3NzcyMTYsXG4gICAgNDMwNDY3MjEsIDEwMDAwMDAwLCAxOTQ4NzE3MSwgMzU4MzE4MDgsIDYyNzQ4NTE3LCA3NTI5NTM2LCAxMTM5MDYyNSxcbiAgICAxNjc3NzIxNiwgMjQxMzc1NjksIDM0MDEyMjI0LCA0NzA0NTg4MSwgNjQwMDAwMDAsIDQwODQxMDEsIDUxNTM2MzIsXG4gICAgNjQzNjM0MywgNzk2MjYyNCwgOTc2NTYyNSwgMTE4ODEzNzYsIDE0MzQ4OTA3LCAxNzIxMDM2OCwgMjA1MTExNDksXG4gICAgMjQzMDAwMDAsIDI4NjI5MTUxLCAzMzU1NDQzMiwgMzkxMzUzOTMsIDQ1NDM1NDI0LCA1MjUyMTg3NSwgNjA0NjYxNzZcbiAgXTtcblxuICBCTi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoYmFzZSwgcGFkZGluZykge1xuICAgIGJhc2UgPSBiYXNlIHx8IDEwO1xuICAgIHBhZGRpbmcgPSBwYWRkaW5nIHwgMCB8fCAxO1xuXG4gICAgdmFyIG91dDtcbiAgICBpZiAoYmFzZSA9PT0gMTYgfHwgYmFzZSA9PT0gJ2hleCcpIHtcbiAgICAgIG91dCA9ICcnO1xuICAgICAgdmFyIG9mZiA9IDA7XG4gICAgICB2YXIgY2FycnkgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgICAgdmFyIHdvcmQgPSAoKCh3IDw8IG9mZikgfCBjYXJyeSkgJiAweGZmZmZmZikudG9TdHJpbmcoMTYpO1xuICAgICAgICBjYXJyeSA9ICh3ID4+PiAoMjQgLSBvZmYpKSAmIDB4ZmZmZmZmO1xuICAgICAgICBvZmYgKz0gMjtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBpLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhcnJ5ICE9PSAwIHx8IGkgIT09IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIG91dCA9IHplcm9zWzYgLSB3b3JkLmxlbmd0aF0gKyB3b3JkICsgb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCA9IHdvcmQgKyBvdXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgICBvdXQgPSBjYXJyeS50b1N0cmluZygxNikgKyBvdXQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAob3V0Lmxlbmd0aCAlIHBhZGRpbmcgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJzAnICsgb3V0O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJy0nICsgb3V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBpZiAoYmFzZSA9PT0gKGJhc2UgfCAwKSAmJiBiYXNlID49IDIgJiYgYmFzZSA8PSAzNikge1xuICAgICAgLy8gdmFyIGdyb3VwU2l6ZSA9IE1hdGguZmxvb3IoQk4ud29yZFNpemUgKiBNYXRoLkxOMiAvIE1hdGgubG9nKGJhc2UpKTtcbiAgICAgIHZhciBncm91cFNpemUgPSBncm91cFNpemVzW2Jhc2VdO1xuICAgICAgLy8gdmFyIGdyb3VwQmFzZSA9IE1hdGgucG93KGJhc2UsIGdyb3VwU2l6ZSk7XG4gICAgICB2YXIgZ3JvdXBCYXNlID0gZ3JvdXBCYXNlc1tiYXNlXTtcbiAgICAgIG91dCA9ICcnO1xuICAgICAgdmFyIGMgPSB0aGlzLmNsb25lKCk7XG4gICAgICBjLm5lZ2F0aXZlID0gMDtcbiAgICAgIHdoaWxlICghYy5pc1plcm8oKSkge1xuICAgICAgICB2YXIgciA9IGMubW9kbihncm91cEJhc2UpLnRvU3RyaW5nKGJhc2UpO1xuICAgICAgICBjID0gYy5pZGl2bihncm91cEJhc2UpO1xuXG4gICAgICAgIGlmICghYy5pc1plcm8oKSkge1xuICAgICAgICAgIG91dCA9IHplcm9zW2dyb3VwU2l6ZSAtIHIubGVuZ3RoXSArIHIgKyBvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0ID0gciArIG91dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNaZXJvKCkpIHtcbiAgICAgICAgb3V0ID0gJzAnICsgb3V0O1xuICAgICAgfVxuICAgICAgd2hpbGUgKG91dC5sZW5ndGggJSBwYWRkaW5nICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICcwJyArIG91dDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgIG91dCA9ICctJyArIG91dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgYXNzZXJ0KGZhbHNlLCAnQmFzZSBzaG91bGQgYmUgYmV0d2VlbiAyIGFuZCAzNicpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyICgpIHtcbiAgICB2YXIgcmV0ID0gdGhpcy53b3Jkc1swXTtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHJldCArPSB0aGlzLndvcmRzWzFdICogMHg0MDAwMDAwO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sZW5ndGggPT09IDMgJiYgdGhpcy53b3Jkc1syXSA9PT0gMHgwMSkge1xuICAgICAgLy8gTk9URTogYXQgdGhpcyBzdGFnZSBpdCBpcyBrbm93biB0aGF0IHRoZSB0b3AgYml0IGlzIHNldFxuICAgICAgcmV0ICs9IDB4MTAwMDAwMDAwMDAwMDAgKyAodGhpcy53b3Jkc1sxXSAqIDB4NDAwMDAwMCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxlbmd0aCA+IDIpIHtcbiAgICAgIGFzc2VydChmYWxzZSwgJ051bWJlciBjYW4gb25seSBzYWZlbHkgc3RvcmUgdXAgdG8gNTMgYml0cycpO1xuICAgIH1cbiAgICByZXR1cm4gKHRoaXMubmVnYXRpdmUgIT09IDApID8gLXJldCA6IHJldDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgICByZXR1cm4gdGhpcy50b1N0cmluZygxNik7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvQnVmZmVyID0gZnVuY3Rpb24gdG9CdWZmZXIgKGVuZGlhbiwgbGVuZ3RoKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKTtcbiAgICByZXR1cm4gdGhpcy50b0FycmF5TGlrZShCdWZmZXIsIGVuZGlhbiwgbGVuZ3RoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uIHRvQXJyYXkgKGVuZGlhbiwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9BcnJheUxpa2UoQXJyYXksIGVuZGlhbiwgbGVuZ3RoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9BcnJheUxpa2UgPSBmdW5jdGlvbiB0b0FycmF5TGlrZSAoQXJyYXlUeXBlLCBlbmRpYW4sIGxlbmd0aCkge1xuICAgIHZhciBieXRlTGVuZ3RoID0gdGhpcy5ieXRlTGVuZ3RoKCk7XG4gICAgdmFyIHJlcUxlbmd0aCA9IGxlbmd0aCB8fCBNYXRoLm1heCgxLCBieXRlTGVuZ3RoKTtcbiAgICBhc3NlcnQoYnl0ZUxlbmd0aCA8PSByZXFMZW5ndGgsICdieXRlIGFycmF5IGxvbmdlciB0aGFuIGRlc2lyZWQgbGVuZ3RoJyk7XG4gICAgYXNzZXJ0KHJlcUxlbmd0aCA+IDAsICdSZXF1ZXN0ZWQgYXJyYXkgbGVuZ3RoIDw9IDAnKTtcblxuICAgIHRoaXMuc3RyaXAoKTtcbiAgICB2YXIgbGl0dGxlRW5kaWFuID0gZW5kaWFuID09PSAnbGUnO1xuICAgIHZhciByZXMgPSBuZXcgQXJyYXlUeXBlKHJlcUxlbmd0aCk7XG5cbiAgICB2YXIgYiwgaTtcbiAgICB2YXIgcSA9IHRoaXMuY2xvbmUoKTtcbiAgICBpZiAoIWxpdHRsZUVuZGlhbikge1xuICAgICAgLy8gQXNzdW1lIGJpZy1lbmRpYW5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCByZXFMZW5ndGggLSBieXRlTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzW2ldID0gMDtcbiAgICAgIH1cblxuICAgICAgZm9yIChpID0gMDsgIXEuaXNaZXJvKCk7IGkrKykge1xuICAgICAgICBiID0gcS5hbmRsbigweGZmKTtcbiAgICAgICAgcS5pdXNocm4oOCk7XG5cbiAgICAgICAgcmVzW3JlcUxlbmd0aCAtIGkgLSAxXSA9IGI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSA9IDA7ICFxLmlzWmVybygpOyBpKyspIHtcbiAgICAgICAgYiA9IHEuYW5kbG4oMHhmZik7XG4gICAgICAgIHEuaXVzaHJuKDgpO1xuXG4gICAgICAgIHJlc1tpXSA9IGI7XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBpIDwgcmVxTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzW2ldID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIGlmIChNYXRoLmNsejMyKSB7XG4gICAgQk4ucHJvdG90eXBlLl9jb3VudEJpdHMgPSBmdW5jdGlvbiBfY291bnRCaXRzICh3KSB7XG4gICAgICByZXR1cm4gMzIgLSBNYXRoLmNsejMyKHcpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgQk4ucHJvdG90eXBlLl9jb3VudEJpdHMgPSBmdW5jdGlvbiBfY291bnRCaXRzICh3KSB7XG4gICAgICB2YXIgdCA9IHc7XG4gICAgICB2YXIgciA9IDA7XG4gICAgICBpZiAodCA+PSAweDEwMDApIHtcbiAgICAgICAgciArPSAxMztcbiAgICAgICAgdCA+Pj49IDEzO1xuICAgICAgfVxuICAgICAgaWYgKHQgPj0gMHg0MCkge1xuICAgICAgICByICs9IDc7XG4gICAgICAgIHQgPj4+PSA3O1xuICAgICAgfVxuICAgICAgaWYgKHQgPj0gMHg4KSB7XG4gICAgICAgIHIgKz0gNDtcbiAgICAgICAgdCA+Pj49IDQ7XG4gICAgICB9XG4gICAgICBpZiAodCA+PSAweDAyKSB7XG4gICAgICAgIHIgKz0gMjtcbiAgICAgICAgdCA+Pj49IDI7XG4gICAgICB9XG4gICAgICByZXR1cm4gciArIHQ7XG4gICAgfTtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5femVyb0JpdHMgPSBmdW5jdGlvbiBfemVyb0JpdHMgKHcpIHtcbiAgICAvLyBTaG9ydC1jdXRcbiAgICBpZiAodyA9PT0gMCkgcmV0dXJuIDI2O1xuXG4gICAgdmFyIHQgPSB3O1xuICAgIHZhciByID0gMDtcbiAgICBpZiAoKHQgJiAweDFmZmYpID09PSAwKSB7XG4gICAgICByICs9IDEzO1xuICAgICAgdCA+Pj49IDEzO1xuICAgIH1cbiAgICBpZiAoKHQgJiAweDdmKSA9PT0gMCkge1xuICAgICAgciArPSA3O1xuICAgICAgdCA+Pj49IDc7XG4gICAgfVxuICAgIGlmICgodCAmIDB4ZikgPT09IDApIHtcbiAgICAgIHIgKz0gNDtcbiAgICAgIHQgPj4+PSA0O1xuICAgIH1cbiAgICBpZiAoKHQgJiAweDMpID09PSAwKSB7XG4gICAgICByICs9IDI7XG4gICAgICB0ID4+Pj0gMjtcbiAgICB9XG4gICAgaWYgKCh0ICYgMHgxKSA9PT0gMCkge1xuICAgICAgcisrO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICAvLyBSZXR1cm4gbnVtYmVyIG9mIHVzZWQgYml0cyBpbiBhIEJOXG4gIEJOLnByb3RvdHlwZS5iaXRMZW5ndGggPSBmdW5jdGlvbiBiaXRMZW5ndGggKCkge1xuICAgIHZhciB3ID0gdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdO1xuICAgIHZhciBoaSA9IHRoaXMuX2NvdW50Qml0cyh3KTtcbiAgICByZXR1cm4gKHRoaXMubGVuZ3RoIC0gMSkgKiAyNiArIGhpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHRvQml0QXJyYXkgKG51bSkge1xuICAgIHZhciB3ID0gbmV3IEFycmF5KG51bS5iaXRMZW5ndGgoKSk7XG5cbiAgICBmb3IgKHZhciBiaXQgPSAwOyBiaXQgPCB3Lmxlbmd0aDsgYml0KyspIHtcbiAgICAgIHZhciBvZmYgPSAoYml0IC8gMjYpIHwgMDtcbiAgICAgIHZhciB3Yml0ID0gYml0ICUgMjY7XG5cbiAgICAgIHdbYml0XSA9IChudW0ud29yZHNbb2ZmXSAmICgxIDw8IHdiaXQpKSA+Pj4gd2JpdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdztcbiAgfVxuXG4gIC8vIE51bWJlciBvZiB0cmFpbGluZyB6ZXJvIGJpdHNcbiAgQk4ucHJvdG90eXBlLnplcm9CaXRzID0gZnVuY3Rpb24gemVyb0JpdHMgKCkge1xuICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gMDtcblxuICAgIHZhciByID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBiID0gdGhpcy5femVyb0JpdHModGhpcy53b3Jkc1tpXSk7XG4gICAgICByICs9IGI7XG4gICAgICBpZiAoYiAhPT0gMjYpIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuYnl0ZUxlbmd0aCA9IGZ1bmN0aW9uIGJ5dGVMZW5ndGggKCkge1xuICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy5iaXRMZW5ndGgoKSAvIDgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b1R3b3MgPSBmdW5jdGlvbiB0b1R3b3MgKHdpZHRoKSB7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmFicygpLmlub3RuKHdpZHRoKS5pYWRkbigxKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZnJvbVR3b3MgPSBmdW5jdGlvbiBmcm9tVHdvcyAod2lkdGgpIHtcbiAgICBpZiAodGhpcy50ZXN0bih3aWR0aCAtIDEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub3RuKHdpZHRoKS5pYWRkbigxKS5pbmVnKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb25lKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzTmVnID0gZnVuY3Rpb24gaXNOZWcgKCkge1xuICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwO1xuICB9O1xuXG4gIC8vIFJldHVybiBuZWdhdGl2ZSBjbG9uZSBvZiBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbmVnKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmluZWcgPSBmdW5jdGlvbiBpbmVnICgpIHtcbiAgICBpZiAoIXRoaXMuaXNaZXJvKCkpIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgXj0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBPciBgbnVtYCB3aXRoIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXVvciA9IGZ1bmN0aW9uIGl1b3IgKG51bSkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA8IG51bS5sZW5ndGgpIHtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGgrK10gPSAwO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXSB8IG51bS53b3Jkc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pb3IgPSBmdW5jdGlvbiBpb3IgKG51bSkge1xuICAgIGFzc2VydCgodGhpcy5uZWdhdGl2ZSB8IG51bS5uZWdhdGl2ZSkgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1b3IobnVtKTtcbiAgfTtcblxuICAvLyBPciBgbnVtYCB3aXRoIGB0aGlzYFxuICBCTi5wcm90b3R5cGUub3IgPSBmdW5jdGlvbiBvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pb3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaW9yKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51b3IgPSBmdW5jdGlvbiB1b3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXVvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pdW9yKHRoaXMpO1xuICB9O1xuXG4gIC8vIEFuZCBgbnVtYCB3aXRoIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXVhbmQgPSBmdW5jdGlvbiBpdWFuZCAobnVtKSB7XG4gICAgLy8gYiA9IG1pbi1sZW5ndGgobnVtLCB0aGlzKVxuICAgIHZhciBiO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHtcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHRoaXMud29yZHNbaV0gJiBudW0ud29yZHNbaV07XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBiLmxlbmd0aDtcblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlhbmQgPSBmdW5jdGlvbiBpYW5kIChudW0pIHtcbiAgICBhc3NlcnQoKHRoaXMubmVnYXRpdmUgfCBudW0ubmVnYXRpdmUpID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdWFuZChudW0pO1xuICB9O1xuXG4gIC8vIEFuZCBgbnVtYCB3aXRoIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuYW5kID0gZnVuY3Rpb24gYW5kIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLmlhbmQobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaWFuZCh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudWFuZCA9IGZ1bmN0aW9uIHVhbmQgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXVhbmQobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXVhbmQodGhpcyk7XG4gIH07XG5cbiAgLy8gWG9yIGBudW1gIHdpdGggYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdXhvciA9IGZ1bmN0aW9uIGl1eG9yIChudW0pIHtcbiAgICAvLyBhLmxlbmd0aCA+IGIubGVuZ3RoXG4gICAgdmFyIGE7XG4gICAgdmFyIGI7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkge1xuICAgICAgYSA9IHRoaXM7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gbnVtO1xuICAgICAgYiA9IHRoaXM7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXSBeIGIud29yZHNbaV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMgIT09IGEpIHtcbiAgICAgIGZvciAoOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IGEubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXhvciA9IGZ1bmN0aW9uIGl4b3IgKG51bSkge1xuICAgIGFzc2VydCgodGhpcy5uZWdhdGl2ZSB8IG51bS5uZWdhdGl2ZSkgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1eG9yKG51bSk7XG4gIH07XG5cbiAgLy8gWG9yIGBudW1gIHdpdGggYHRoaXNgXG4gIEJOLnByb3RvdHlwZS54b3IgPSBmdW5jdGlvbiB4b3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXhvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5peG9yKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51eG9yID0gZnVuY3Rpb24gdXhvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXhvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pdXhvcih0aGlzKTtcbiAgfTtcblxuICAvLyBOb3QgYGB0aGlzYGAgd2l0aCBgYHdpZHRoYGAgYml0d2lkdGhcbiAgQk4ucHJvdG90eXBlLmlub3RuID0gZnVuY3Rpb24gaW5vdG4gKHdpZHRoKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiB3aWR0aCA9PT0gJ251bWJlcicgJiYgd2lkdGggPj0gMCk7XG5cbiAgICB2YXIgYnl0ZXNOZWVkZWQgPSBNYXRoLmNlaWwod2lkdGggLyAyNikgfCAwO1xuICAgIHZhciBiaXRzTGVmdCA9IHdpZHRoICUgMjY7XG5cbiAgICAvLyBFeHRlbmQgdGhlIGJ1ZmZlciB3aXRoIGxlYWRpbmcgemVyb2VzXG4gICAgdGhpcy5fZXhwYW5kKGJ5dGVzTmVlZGVkKTtcblxuICAgIGlmIChiaXRzTGVmdCA+IDApIHtcbiAgICAgIGJ5dGVzTmVlZGVkLS07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGNvbXBsZXRlIHdvcmRzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlc05lZWRlZDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gfnRoaXMud29yZHNbaV0gJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHRoZSByZXNpZHVlXG4gICAgaWYgKGJpdHNMZWZ0ID4gMCkge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IH50aGlzLndvcmRzW2ldICYgKDB4M2ZmZmZmZiA+PiAoMjYgLSBiaXRzTGVmdCkpO1xuICAgIH1cblxuICAgIC8vIEFuZCByZW1vdmUgbGVhZGluZyB6ZXJvZXNcbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ub3RuID0gZnVuY3Rpb24gbm90biAod2lkdGgpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlub3RuKHdpZHRoKTtcbiAgfTtcblxuICAvLyBTZXQgYGJpdGAgb2YgYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zZXRuID0gZnVuY3Rpb24gc2V0biAoYml0LCB2YWwpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdCA9PT0gJ251bWJlcicgJiYgYml0ID49IDApO1xuXG4gICAgdmFyIG9mZiA9IChiaXQgLyAyNikgfCAwO1xuICAgIHZhciB3Yml0ID0gYml0ICUgMjY7XG5cbiAgICB0aGlzLl9leHBhbmQob2ZmICsgMSk7XG5cbiAgICBpZiAodmFsKSB7XG4gICAgICB0aGlzLndvcmRzW29mZl0gPSB0aGlzLndvcmRzW29mZl0gfCAoMSA8PCB3Yml0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53b3Jkc1tvZmZdID0gdGhpcy53b3Jkc1tvZmZdICYgfigxIDw8IHdiaXQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gQWRkIGBudW1gIHRvIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaWFkZCA9IGZ1bmN0aW9uIGlhZGQgKG51bSkge1xuICAgIHZhciByO1xuXG4gICAgLy8gbmVnYXRpdmUgKyBwb3NpdGl2ZVxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIG51bS5uZWdhdGl2ZSA9PT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICByID0gdGhpcy5pc3ViKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlIF49IDE7XG4gICAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcblxuICAgIC8vIHBvc2l0aXZlICsgbmVnYXRpdmVcbiAgICB9IGVsc2UgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbnVtLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBudW0ubmVnYXRpdmUgPSAwO1xuICAgICAgciA9IHRoaXMuaXN1YihudW0pO1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiByLl9ub3JtU2lnbigpO1xuICAgIH1cblxuICAgIC8vIGEubGVuZ3RoID4gYi5sZW5ndGhcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSB7XG4gICAgICBhID0gdGhpcztcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBudW07XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgKyAoYi53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICAgIGNhcnJ5ID0gciA+Pj4gMjY7XG4gICAgfVxuICAgIGZvciAoOyBjYXJyeSAhPT0gMCAmJiBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgICAgY2FycnkgPSByID4+PiAyNjtcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IGEubGVuZ3RoO1xuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aF0gPSBjYXJyeTtcbiAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgLy8gQ29weSB0aGUgcmVzdCBvZiB0aGUgd29yZHNcbiAgICB9IGVsc2UgaWYgKGEgIT09IHRoaXMpIHtcbiAgICAgIGZvciAoOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYS53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBBZGQgYG51bWAgdG8gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKG51bSkge1xuICAgIHZhciByZXM7XG4gICAgaWYgKG51bS5uZWdhdGl2ZSAhPT0gMCAmJiB0aGlzLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICBudW0ubmVnYXRpdmUgPSAwO1xuICAgICAgcmVzID0gdGhpcy5zdWIobnVtKTtcbiAgICAgIG51bS5uZWdhdGl2ZSBePSAxO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGVsc2UgaWYgKG51bS5uZWdhdGl2ZSA9PT0gMCAmJiB0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHJlcyA9IG51bS5zdWIodGhpcyk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkKG51bSk7XG5cbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaWFkZCh0aGlzKTtcbiAgfTtcblxuICAvLyBTdWJ0cmFjdCBgbnVtYCBmcm9tIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXN1YiA9IGZ1bmN0aW9uIGlzdWIgKG51bSkge1xuICAgIC8vIHRoaXMgLSAoLW51bSkgPSB0aGlzICsgbnVtXG4gICAgaWYgKG51bS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgbnVtLm5lZ2F0aXZlID0gMDtcbiAgICAgIHZhciByID0gdGhpcy5pYWRkKG51bSk7XG4gICAgICBudW0ubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHIuX25vcm1TaWduKCk7XG5cbiAgICAvLyAtdGhpcyAtIG51bSA9IC0odGhpcyArIG51bSlcbiAgICB9IGVsc2UgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5pYWRkKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiB0aGlzLl9ub3JtU2lnbigpO1xuICAgIH1cblxuICAgIC8vIEF0IHRoaXMgcG9pbnQgYm90aCBudW1iZXJzIGFyZSBwb3NpdGl2ZVxuICAgIHZhciBjbXAgPSB0aGlzLmNtcChudW0pO1xuXG4gICAgLy8gT3B0aW1pemF0aW9uIC0gemVyb2lmeVxuICAgIGlmIChjbXAgPT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgICAgdGhpcy53b3Jkc1swXSA9IDA7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBhID4gYlxuICAgIHZhciBhLCBiO1xuICAgIGlmIChjbXAgPiAwKSB7XG4gICAgICBhID0gdGhpcztcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBudW07XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuICAgICAgciA9IChhLndvcmRzW2ldIHwgMCkgLSAoYi53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHIgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICB9XG4gICAgZm9yICg7IGNhcnJ5ICE9PSAwICYmIGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgY2FycnkgPSByID4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgLy8gQ29weSByZXN0IG9mIHRoZSB3b3Jkc1xuICAgIGlmIChjYXJyeSA9PT0gMCAmJiBpIDwgYS5sZW5ndGggJiYgYSAhPT0gdGhpcykge1xuICAgICAgZm9yICg7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5sZW5ndGgsIGkpO1xuXG4gICAgaWYgKGEgIT09IHRoaXMpIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgLy8gU3VidHJhY3QgYG51bWAgZnJvbSBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uIHN1YiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc3ViKG51bSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gc21hbGxNdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICBvdXQubmVnYXRpdmUgPSBudW0ubmVnYXRpdmUgXiBzZWxmLm5lZ2F0aXZlO1xuICAgIHZhciBsZW4gPSAoc2VsZi5sZW5ndGggKyBudW0ubGVuZ3RoKSB8IDA7XG4gICAgb3V0Lmxlbmd0aCA9IGxlbjtcbiAgICBsZW4gPSAobGVuIC0gMSkgfCAwO1xuXG4gICAgLy8gUGVlbCBvbmUgaXRlcmF0aW9uIChjb21waWxlciBjYW4ndCBkbyBpdCwgYmVjYXVzZSBvZiBjb2RlIGNvbXBsZXhpdHkpXG4gICAgdmFyIGEgPSBzZWxmLndvcmRzWzBdIHwgMDtcbiAgICB2YXIgYiA9IG51bS53b3Jkc1swXSB8IDA7XG4gICAgdmFyIHIgPSBhICogYjtcblxuICAgIHZhciBsbyA9IHIgJiAweDNmZmZmZmY7XG4gICAgdmFyIGNhcnJ5ID0gKHIgLyAweDQwMDAwMDApIHwgMDtcbiAgICBvdXQud29yZHNbMF0gPSBsbztcblxuICAgIGZvciAodmFyIGsgPSAxOyBrIDwgbGVuOyBrKyspIHtcbiAgICAgIC8vIFN1bSBhbGwgd29yZHMgd2l0aCB0aGUgc2FtZSBgaSArIGogPSBrYCBhbmQgYWNjdW11bGF0ZSBgbmNhcnJ5YCxcbiAgICAgIC8vIG5vdGUgdGhhdCBuY2FycnkgY291bGQgYmUgPj0gMHgzZmZmZmZmXG4gICAgICB2YXIgbmNhcnJ5ID0gY2FycnkgPj4+IDI2O1xuICAgICAgdmFyIHJ3b3JkID0gY2FycnkgJiAweDNmZmZmZmY7XG4gICAgICB2YXIgbWF4SiA9IE1hdGgubWluKGssIG51bS5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGogPSBNYXRoLm1heCgwLCBrIC0gc2VsZi5sZW5ndGggKyAxKTsgaiA8PSBtYXhKOyBqKyspIHtcbiAgICAgICAgdmFyIGkgPSAoayAtIGopIHwgMDtcbiAgICAgICAgYSA9IHNlbGYud29yZHNbaV0gfCAwO1xuICAgICAgICBiID0gbnVtLndvcmRzW2pdIHwgMDtcbiAgICAgICAgciA9IGEgKiBiICsgcndvcmQ7XG4gICAgICAgIG5jYXJyeSArPSAociAvIDB4NDAwMDAwMCkgfCAwO1xuICAgICAgICByd29yZCA9IHIgJiAweDNmZmZmZmY7XG4gICAgICB9XG4gICAgICBvdXQud29yZHNba10gPSByd29yZCB8IDA7XG4gICAgICBjYXJyeSA9IG5jYXJyeSB8IDA7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgb3V0LndvcmRzW2tdID0gY2FycnkgfCAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQubGVuZ3RoLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dC5zdHJpcCgpO1xuICB9XG5cbiAgLy8gVE9ETyhpbmR1dG55KTogaXQgbWF5IGJlIHJlYXNvbmFibGUgdG8gb21pdCBpdCBmb3IgdXNlcnMgd2hvIGRvbid0IG5lZWRcbiAgLy8gdG8gd29yayB3aXRoIDI1Ni1iaXQgbnVtYmVycywgb3RoZXJ3aXNlIGl0IGdpdmVzIDIwJSBpbXByb3ZlbWVudCBmb3IgMjU2LWJpdFxuICAvLyBtdWx0aXBsaWNhdGlvbiAobGlrZSBlbGxpcHRpYyBzZWNwMjU2azEpLlxuICB2YXIgY29tYjEwTXVsVG8gPSBmdW5jdGlvbiBjb21iMTBNdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICB2YXIgYSA9IHNlbGYud29yZHM7XG4gICAgdmFyIGIgPSBudW0ud29yZHM7XG4gICAgdmFyIG8gPSBvdXQud29yZHM7XG4gICAgdmFyIGMgPSAwO1xuICAgIHZhciBsbztcbiAgICB2YXIgbWlkO1xuICAgIHZhciBoaTtcbiAgICB2YXIgYTAgPSBhWzBdIHwgMDtcbiAgICB2YXIgYWwwID0gYTAgJiAweDFmZmY7XG4gICAgdmFyIGFoMCA9IGEwID4+PiAxMztcbiAgICB2YXIgYTEgPSBhWzFdIHwgMDtcbiAgICB2YXIgYWwxID0gYTEgJiAweDFmZmY7XG4gICAgdmFyIGFoMSA9IGExID4+PiAxMztcbiAgICB2YXIgYTIgPSBhWzJdIHwgMDtcbiAgICB2YXIgYWwyID0gYTIgJiAweDFmZmY7XG4gICAgdmFyIGFoMiA9IGEyID4+PiAxMztcbiAgICB2YXIgYTMgPSBhWzNdIHwgMDtcbiAgICB2YXIgYWwzID0gYTMgJiAweDFmZmY7XG4gICAgdmFyIGFoMyA9IGEzID4+PiAxMztcbiAgICB2YXIgYTQgPSBhWzRdIHwgMDtcbiAgICB2YXIgYWw0ID0gYTQgJiAweDFmZmY7XG4gICAgdmFyIGFoNCA9IGE0ID4+PiAxMztcbiAgICB2YXIgYTUgPSBhWzVdIHwgMDtcbiAgICB2YXIgYWw1ID0gYTUgJiAweDFmZmY7XG4gICAgdmFyIGFoNSA9IGE1ID4+PiAxMztcbiAgICB2YXIgYTYgPSBhWzZdIHwgMDtcbiAgICB2YXIgYWw2ID0gYTYgJiAweDFmZmY7XG4gICAgdmFyIGFoNiA9IGE2ID4+PiAxMztcbiAgICB2YXIgYTcgPSBhWzddIHwgMDtcbiAgICB2YXIgYWw3ID0gYTcgJiAweDFmZmY7XG4gICAgdmFyIGFoNyA9IGE3ID4+PiAxMztcbiAgICB2YXIgYTggPSBhWzhdIHwgMDtcbiAgICB2YXIgYWw4ID0gYTggJiAweDFmZmY7XG4gICAgdmFyIGFoOCA9IGE4ID4+PiAxMztcbiAgICB2YXIgYTkgPSBhWzldIHwgMDtcbiAgICB2YXIgYWw5ID0gYTkgJiAweDFmZmY7XG4gICAgdmFyIGFoOSA9IGE5ID4+PiAxMztcbiAgICB2YXIgYjAgPSBiWzBdIHwgMDtcbiAgICB2YXIgYmwwID0gYjAgJiAweDFmZmY7XG4gICAgdmFyIGJoMCA9IGIwID4+PiAxMztcbiAgICB2YXIgYjEgPSBiWzFdIHwgMDtcbiAgICB2YXIgYmwxID0gYjEgJiAweDFmZmY7XG4gICAgdmFyIGJoMSA9IGIxID4+PiAxMztcbiAgICB2YXIgYjIgPSBiWzJdIHwgMDtcbiAgICB2YXIgYmwyID0gYjIgJiAweDFmZmY7XG4gICAgdmFyIGJoMiA9IGIyID4+PiAxMztcbiAgICB2YXIgYjMgPSBiWzNdIHwgMDtcbiAgICB2YXIgYmwzID0gYjMgJiAweDFmZmY7XG4gICAgdmFyIGJoMyA9IGIzID4+PiAxMztcbiAgICB2YXIgYjQgPSBiWzRdIHwgMDtcbiAgICB2YXIgYmw0ID0gYjQgJiAweDFmZmY7XG4gICAgdmFyIGJoNCA9IGI0ID4+PiAxMztcbiAgICB2YXIgYjUgPSBiWzVdIHwgMDtcbiAgICB2YXIgYmw1ID0gYjUgJiAweDFmZmY7XG4gICAgdmFyIGJoNSA9IGI1ID4+PiAxMztcbiAgICB2YXIgYjYgPSBiWzZdIHwgMDtcbiAgICB2YXIgYmw2ID0gYjYgJiAweDFmZmY7XG4gICAgdmFyIGJoNiA9IGI2ID4+PiAxMztcbiAgICB2YXIgYjcgPSBiWzddIHwgMDtcbiAgICB2YXIgYmw3ID0gYjcgJiAweDFmZmY7XG4gICAgdmFyIGJoNyA9IGI3ID4+PiAxMztcbiAgICB2YXIgYjggPSBiWzhdIHwgMDtcbiAgICB2YXIgYmw4ID0gYjggJiAweDFmZmY7XG4gICAgdmFyIGJoOCA9IGI4ID4+PiAxMztcbiAgICB2YXIgYjkgPSBiWzldIHwgMDtcbiAgICB2YXIgYmw5ID0gYjkgJiAweDFmZmY7XG4gICAgdmFyIGJoOSA9IGI5ID4+PiAxMztcblxuICAgIG91dC5uZWdhdGl2ZSA9IHNlbGYubmVnYXRpdmUgXiBudW0ubmVnYXRpdmU7XG4gICAgb3V0Lmxlbmd0aCA9IDE5O1xuICAgIC8qIGsgPSAwICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwwLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDAsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDAsIGJoMCk7XG4gICAgdmFyIHcwID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MCA+Pj4gMjYpKSB8IDA7XG4gICAgdzAgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwxLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDEsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDEsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmgxKSkgfCAwO1xuICAgIHZhciB3MSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzEgPj4+IDI2KSkgfCAwO1xuICAgIHcxICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMiwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwyLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgyLCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDIpKSB8IDA7XG4gICAgdmFyIHcyID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MiA+Pj4gMjYpKSB8IDA7XG4gICAgdzIgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAzICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwzLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDMsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDMsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDMpKSB8IDA7XG4gICAgdmFyIHczID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MyA+Pj4gMjYpKSB8IDA7XG4gICAgdzMgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA0ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw0LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDQsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDQsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg0KSkgfCAwO1xuICAgIHZhciB3NCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzQgPj4+IDI2KSkgfCAwO1xuICAgIHc0ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNSwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw1LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg1LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDUpKSB8IDA7XG4gICAgdmFyIHc1ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3NSA+Pj4gMjYpKSB8IDA7XG4gICAgdzUgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA2ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw2LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDYsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDYsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDYpKSB8IDA7XG4gICAgdmFyIHc2ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3NiA+Pj4gMjYpKSB8IDA7XG4gICAgdzYgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA3ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw3LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDcsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDcsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg3KSkgfCAwO1xuICAgIHZhciB3NyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzcgPj4+IDI2KSkgfCAwO1xuICAgIHc3ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gOCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOCwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw4LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg4LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDgpKSB8IDA7XG4gICAgdmFyIHc4ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3OCA+Pj4gMjYpKSB8IDA7XG4gICAgdzggJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA5ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDkpKSB8IDA7XG4gICAgdmFyIHc5ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3OSA+Pj4gMjYpKSB8IDA7XG4gICAgdzkgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwxKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDEpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDEpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDEpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxMCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzEwID4+PiAyNikpIHwgMDtcbiAgICB3MTAgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwyKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDIpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDIpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDIpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzExID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTEgPj4+IDI2KSkgfCAwO1xuICAgIHcxMSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDEyICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDMpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMyk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsMykpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoMyk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxMiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzEyID4+PiAyNikpIHwgMDtcbiAgICB3MTIgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw0KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDQpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDQpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDQpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxMyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzEzID4+PiAyNikpIHwgMDtcbiAgICB3MTMgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw1KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDUpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDUpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDUpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzE0ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTQgPj4+IDI2KSkgfCAwO1xuICAgIHcxNCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE1ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDYpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoNik7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsNikpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoNik7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE1ID4+PiAyNikpIHwgMDtcbiAgICB3MTUgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw3KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDcpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDcpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDcpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE2ID4+PiAyNikpIHwgMDtcbiAgICB3MTYgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw4KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDgpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDgpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDgpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzE3ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTcgPj4+IDI2KSkgfCAwO1xuICAgIHcxNyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE4ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDkpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoOSk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsOSkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoOSk7XG4gICAgdmFyIHcxOCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE4ID4+PiAyNikpIHwgMDtcbiAgICB3MTggJj0gMHgzZmZmZmZmO1xuICAgIG9bMF0gPSB3MDtcbiAgICBvWzFdID0gdzE7XG4gICAgb1syXSA9IHcyO1xuICAgIG9bM10gPSB3MztcbiAgICBvWzRdID0gdzQ7XG4gICAgb1s1XSA9IHc1O1xuICAgIG9bNl0gPSB3NjtcbiAgICBvWzddID0gdzc7XG4gICAgb1s4XSA9IHc4O1xuICAgIG9bOV0gPSB3OTtcbiAgICBvWzEwXSA9IHcxMDtcbiAgICBvWzExXSA9IHcxMTtcbiAgICBvWzEyXSA9IHcxMjtcbiAgICBvWzEzXSA9IHcxMztcbiAgICBvWzE0XSA9IHcxNDtcbiAgICBvWzE1XSA9IHcxNTtcbiAgICBvWzE2XSA9IHcxNjtcbiAgICBvWzE3XSA9IHcxNztcbiAgICBvWzE4XSA9IHcxODtcbiAgICBpZiAoYyAhPT0gMCkge1xuICAgICAgb1sxOV0gPSBjO1xuICAgICAgb3V0Lmxlbmd0aCsrO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9O1xuXG4gIC8vIFBvbHlmaWxsIGNvbWJcbiAgaWYgKCFNYXRoLmltdWwpIHtcbiAgICBjb21iMTBNdWxUbyA9IHNtYWxsTXVsVG87XG4gIH1cblxuICBmdW5jdGlvbiBiaWdNdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICBvdXQubmVnYXRpdmUgPSBudW0ubmVnYXRpdmUgXiBzZWxmLm5lZ2F0aXZlO1xuICAgIG91dC5sZW5ndGggPSBzZWxmLmxlbmd0aCArIG51bS5sZW5ndGg7XG5cbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIHZhciBobmNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IG91dC5sZW5ndGggLSAxOyBrKyspIHtcbiAgICAgIC8vIFN1bSBhbGwgd29yZHMgd2l0aCB0aGUgc2FtZSBgaSArIGogPSBrYCBhbmQgYWNjdW11bGF0ZSBgbmNhcnJ5YCxcbiAgICAgIC8vIG5vdGUgdGhhdCBuY2FycnkgY291bGQgYmUgPj0gMHgzZmZmZmZmXG4gICAgICB2YXIgbmNhcnJ5ID0gaG5jYXJyeTtcbiAgICAgIGhuY2FycnkgPSAwO1xuICAgICAgdmFyIHJ3b3JkID0gY2FycnkgJiAweDNmZmZmZmY7XG4gICAgICB2YXIgbWF4SiA9IE1hdGgubWluKGssIG51bS5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGogPSBNYXRoLm1heCgwLCBrIC0gc2VsZi5sZW5ndGggKyAxKTsgaiA8PSBtYXhKOyBqKyspIHtcbiAgICAgICAgdmFyIGkgPSBrIC0gajtcbiAgICAgICAgdmFyIGEgPSBzZWxmLndvcmRzW2ldIHwgMDtcbiAgICAgICAgdmFyIGIgPSBudW0ud29yZHNbal0gfCAwO1xuICAgICAgICB2YXIgciA9IGEgKiBiO1xuXG4gICAgICAgIHZhciBsbyA9IHIgJiAweDNmZmZmZmY7XG4gICAgICAgIG5jYXJyeSA9IChuY2FycnkgKyAoKHIgLyAweDQwMDAwMDApIHwgMCkpIHwgMDtcbiAgICAgICAgbG8gPSAobG8gKyByd29yZCkgfCAwO1xuICAgICAgICByd29yZCA9IGxvICYgMHgzZmZmZmZmO1xuICAgICAgICBuY2FycnkgPSAobmNhcnJ5ICsgKGxvID4+PiAyNikpIHwgMDtcblxuICAgICAgICBobmNhcnJ5ICs9IG5jYXJyeSA+Pj4gMjY7XG4gICAgICAgIG5jYXJyeSAmPSAweDNmZmZmZmY7XG4gICAgICB9XG4gICAgICBvdXQud29yZHNba10gPSByd29yZDtcbiAgICAgIGNhcnJ5ID0gbmNhcnJ5O1xuICAgICAgbmNhcnJ5ID0gaG5jYXJyeTtcbiAgICB9XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICBvdXQud29yZHNba10gPSBjYXJyeTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0Lmxlbmd0aC0tO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQuc3RyaXAoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGp1bWJvTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgdmFyIGZmdG0gPSBuZXcgRkZUTSgpO1xuICAgIHJldHVybiBmZnRtLm11bHAoc2VsZiwgbnVtLCBvdXQpO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLm11bFRvID0gZnVuY3Rpb24gbXVsVG8gKG51bSwgb3V0KSB7XG4gICAgdmFyIHJlcztcbiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGggKyBudW0ubGVuZ3RoO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMTAgJiYgbnVtLmxlbmd0aCA9PT0gMTApIHtcbiAgICAgIHJlcyA9IGNvbWIxME11bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9IGVsc2UgaWYgKGxlbiA8IDYzKSB7XG4gICAgICByZXMgPSBzbWFsbE11bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9IGVsc2UgaWYgKGxlbiA8IDEwMjQpIHtcbiAgICAgIHJlcyA9IGJpZ011bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0ganVtYm9NdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBDb29sZXktVHVrZXkgYWxnb3JpdGhtIGZvciBGRlRcbiAgLy8gc2xpZ2h0bHkgcmV2aXNpdGVkIHRvIHJlbHkgb24gbG9vcGluZyBpbnN0ZWFkIG9mIHJlY3Vyc2lvblxuXG4gIGZ1bmN0aW9uIEZGVE0gKHgsIHkpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gIH1cblxuICBGRlRNLnByb3RvdHlwZS5tYWtlUkJUID0gZnVuY3Rpb24gbWFrZVJCVCAoTikge1xuICAgIHZhciB0ID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBsID0gQk4ucHJvdG90eXBlLl9jb3VudEJpdHMoTikgLSAxO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICB0W2ldID0gdGhpcy5yZXZCaW4oaSwgbCwgTik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHQ7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBiaW5hcnktcmV2ZXJzZWQgcmVwcmVzZW50YXRpb24gb2YgYHhgXG4gIEZGVE0ucHJvdG90eXBlLnJldkJpbiA9IGZ1bmN0aW9uIHJldkJpbiAoeCwgbCwgTikge1xuICAgIGlmICh4ID09PSAwIHx8IHggPT09IE4gLSAxKSByZXR1cm4geDtcblxuICAgIHZhciByYiA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgIHJiIHw9ICh4ICYgMSkgPDwgKGwgLSBpIC0gMSk7XG4gICAgICB4ID4+PSAxO1xuICAgIH1cblxuICAgIHJldHVybiByYjtcbiAgfTtcblxuICAvLyBQZXJmb3JtcyBcInR3ZWVkbGluZ1wiIHBoYXNlLCB0aGVyZWZvcmUgJ2VtdWxhdGluZydcbiAgLy8gYmVoYXZpb3VyIG9mIHRoZSByZWN1cnNpdmUgYWxnb3JpdGhtXG4gIEZGVE0ucHJvdG90eXBlLnBlcm11dGUgPSBmdW5jdGlvbiBwZXJtdXRlIChyYnQsIHJ3cywgaXdzLCBydHdzLCBpdHdzLCBOKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHJ0d3NbaV0gPSByd3NbcmJ0W2ldXTtcbiAgICAgIGl0d3NbaV0gPSBpd3NbcmJ0W2ldXTtcbiAgICB9XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gdHJhbnNmb3JtIChyd3MsIGl3cywgcnR3cywgaXR3cywgTiwgcmJ0KSB7XG4gICAgdGhpcy5wZXJtdXRlKHJidCwgcndzLCBpd3MsIHJ0d3MsIGl0d3MsIE4pO1xuXG4gICAgZm9yICh2YXIgcyA9IDE7IHMgPCBOOyBzIDw8PSAxKSB7XG4gICAgICB2YXIgbCA9IHMgPDwgMTtcblxuICAgICAgdmFyIHJ0d2RmID0gTWF0aC5jb3MoMiAqIE1hdGguUEkgLyBsKTtcbiAgICAgIHZhciBpdHdkZiA9IE1hdGguc2luKDIgKiBNYXRoLlBJIC8gbCk7XG5cbiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgTjsgcCArPSBsKSB7XG4gICAgICAgIHZhciBydHdkZl8gPSBydHdkZjtcbiAgICAgICAgdmFyIGl0d2RmXyA9IGl0d2RmO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgczsgaisrKSB7XG4gICAgICAgICAgdmFyIHJlID0gcnR3c1twICsgal07XG4gICAgICAgICAgdmFyIGllID0gaXR3c1twICsgal07XG5cbiAgICAgICAgICB2YXIgcm8gPSBydHdzW3AgKyBqICsgc107XG4gICAgICAgICAgdmFyIGlvID0gaXR3c1twICsgaiArIHNdO1xuXG4gICAgICAgICAgdmFyIHJ4ID0gcnR3ZGZfICogcm8gLSBpdHdkZl8gKiBpbztcblxuICAgICAgICAgIGlvID0gcnR3ZGZfICogaW8gKyBpdHdkZl8gKiBybztcbiAgICAgICAgICBybyA9IHJ4O1xuXG4gICAgICAgICAgcnR3c1twICsgal0gPSByZSArIHJvO1xuICAgICAgICAgIGl0d3NbcCArIGpdID0gaWUgKyBpbztcblxuICAgICAgICAgIHJ0d3NbcCArIGogKyBzXSA9IHJlIC0gcm87XG4gICAgICAgICAgaXR3c1twICsgaiArIHNdID0gaWUgLSBpbztcblxuICAgICAgICAgIC8qIGpzaGludCBtYXhkZXB0aCA6IGZhbHNlICovXG4gICAgICAgICAgaWYgKGogIT09IGwpIHtcbiAgICAgICAgICAgIHJ4ID0gcnR3ZGYgKiBydHdkZl8gLSBpdHdkZiAqIGl0d2RmXztcblxuICAgICAgICAgICAgaXR3ZGZfID0gcnR3ZGYgKiBpdHdkZl8gKyBpdHdkZiAqIHJ0d2RmXztcbiAgICAgICAgICAgIHJ0d2RmXyA9IHJ4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5ndWVzc0xlbjEzYiA9IGZ1bmN0aW9uIGd1ZXNzTGVuMTNiIChuLCBtKSB7XG4gICAgdmFyIE4gPSBNYXRoLm1heChtLCBuKSB8IDE7XG4gICAgdmFyIG9kZCA9IE4gJiAxO1xuICAgIHZhciBpID0gMDtcbiAgICBmb3IgKE4gPSBOIC8gMiB8IDA7IE47IE4gPSBOID4+PiAxKSB7XG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIDEgPDwgaSArIDEgKyBvZGQ7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuY29uanVnYXRlID0gZnVuY3Rpb24gY29uanVnYXRlIChyd3MsIGl3cywgTikge1xuICAgIGlmIChOIDw9IDEpIHJldHVybjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTiAvIDI7IGkrKykge1xuICAgICAgdmFyIHQgPSByd3NbaV07XG5cbiAgICAgIHJ3c1tpXSA9IHJ3c1tOIC0gaSAtIDFdO1xuICAgICAgcndzW04gLSBpIC0gMV0gPSB0O1xuXG4gICAgICB0ID0gaXdzW2ldO1xuXG4gICAgICBpd3NbaV0gPSAtaXdzW04gLSBpIC0gMV07XG4gICAgICBpd3NbTiAtIGkgLSAxXSA9IC10O1xuICAgIH1cbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5ub3JtYWxpemUxM2IgPSBmdW5jdGlvbiBub3JtYWxpemUxM2IgKHdzLCBOKSB7XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE4gLyAyOyBpKyspIHtcbiAgICAgIHZhciB3ID0gTWF0aC5yb3VuZCh3c1syICogaSArIDFdIC8gTikgKiAweDIwMDAgK1xuICAgICAgICBNYXRoLnJvdW5kKHdzWzIgKiBpXSAvIE4pICtcbiAgICAgICAgY2Fycnk7XG5cbiAgICAgIHdzW2ldID0gdyAmIDB4M2ZmZmZmZjtcblxuICAgICAgaWYgKHcgPCAweDQwMDAwMDApIHtcbiAgICAgICAgY2FycnkgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FycnkgPSB3IC8gMHg0MDAwMDAwIHwgMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gd3M7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuY29udmVydDEzYiA9IGZ1bmN0aW9uIGNvbnZlcnQxM2IgKHdzLCBsZW4sIHJ3cywgTikge1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY2FycnkgPSBjYXJyeSArICh3c1tpXSB8IDApO1xuXG4gICAgICByd3NbMiAqIGldID0gY2FycnkgJiAweDFmZmY7IGNhcnJ5ID0gY2FycnkgPj4+IDEzO1xuICAgICAgcndzWzIgKiBpICsgMV0gPSBjYXJyeSAmIDB4MWZmZjsgY2FycnkgPSBjYXJyeSA+Pj4gMTM7XG4gICAgfVxuXG4gICAgLy8gUGFkIHdpdGggemVyb2VzXG4gICAgZm9yIChpID0gMiAqIGxlbjsgaSA8IE47ICsraSkge1xuICAgICAgcndzW2ldID0gMDtcbiAgICB9XG5cbiAgICBhc3NlcnQoY2FycnkgPT09IDApO1xuICAgIGFzc2VydCgoY2FycnkgJiB+MHgxZmZmKSA9PT0gMCk7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuc3R1YiA9IGZ1bmN0aW9uIHN0dWIgKE4pIHtcbiAgICB2YXIgcGggPSBuZXcgQXJyYXkoTik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHBoW2ldID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gcGg7XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUubXVscCA9IGZ1bmN0aW9uIG11bHAgKHgsIHksIG91dCkge1xuICAgIHZhciBOID0gMiAqIHRoaXMuZ3Vlc3NMZW4xM2IoeC5sZW5ndGgsIHkubGVuZ3RoKTtcblxuICAgIHZhciByYnQgPSB0aGlzLm1ha2VSQlQoTik7XG5cbiAgICB2YXIgXyA9IHRoaXMuc3R1YihOKTtcblxuICAgIHZhciByd3MgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIHJ3c3QgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIGl3c3QgPSBuZXcgQXJyYXkoTik7XG5cbiAgICB2YXIgbnJ3cyA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgbnJ3c3QgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIG5pd3N0ID0gbmV3IEFycmF5KE4pO1xuXG4gICAgdmFyIHJtd3MgPSBvdXQud29yZHM7XG4gICAgcm13cy5sZW5ndGggPSBOO1xuXG4gICAgdGhpcy5jb252ZXJ0MTNiKHgud29yZHMsIHgubGVuZ3RoLCByd3MsIE4pO1xuICAgIHRoaXMuY29udmVydDEzYih5LndvcmRzLCB5Lmxlbmd0aCwgbnJ3cywgTik7XG5cbiAgICB0aGlzLnRyYW5zZm9ybShyd3MsIF8sIHJ3c3QsIGl3c3QsIE4sIHJidCk7XG4gICAgdGhpcy50cmFuc2Zvcm0obnJ3cywgXywgbnJ3c3QsIG5pd3N0LCBOLCByYnQpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHZhciByeCA9IHJ3c3RbaV0gKiBucndzdFtpXSAtIGl3c3RbaV0gKiBuaXdzdFtpXTtcbiAgICAgIGl3c3RbaV0gPSByd3N0W2ldICogbml3c3RbaV0gKyBpd3N0W2ldICogbnJ3c3RbaV07XG4gICAgICByd3N0W2ldID0gcng7XG4gICAgfVxuXG4gICAgdGhpcy5jb25qdWdhdGUocndzdCwgaXdzdCwgTik7XG4gICAgdGhpcy50cmFuc2Zvcm0ocndzdCwgaXdzdCwgcm13cywgXywgTiwgcmJ0KTtcbiAgICB0aGlzLmNvbmp1Z2F0ZShybXdzLCBfLCBOKTtcbiAgICB0aGlzLm5vcm1hbGl6ZTEzYihybXdzLCBOKTtcblxuICAgIG91dC5uZWdhdGl2ZSA9IHgubmVnYXRpdmUgXiB5Lm5lZ2F0aXZlO1xuICAgIG91dC5sZW5ndGggPSB4Lmxlbmd0aCArIHkubGVuZ3RoO1xuICAgIHJldHVybiBvdXQuc3RyaXAoKTtcbiAgfTtcblxuICAvLyBNdWx0aXBseSBgdGhpc2AgYnkgYG51bWBcbiAgQk4ucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bCAobnVtKSB7XG4gICAgdmFyIG91dCA9IG5ldyBCTihudWxsKTtcbiAgICBvdXQud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGggKyBudW0ubGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpcy5tdWxUbyhudW0sIG91dCk7XG4gIH07XG5cbiAgLy8gTXVsdGlwbHkgZW1wbG95aW5nIEZGVFxuICBCTi5wcm90b3R5cGUubXVsZiA9IGZ1bmN0aW9uIG11bGYgKG51bSkge1xuICAgIHZhciBvdXQgPSBuZXcgQk4obnVsbCk7XG4gICAgb3V0LndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoICsgbnVtLmxlbmd0aCk7XG4gICAgcmV0dXJuIGp1bWJvTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICB9O1xuXG4gIC8vIEluLXBsYWNlIE11bHRpcGxpY2F0aW9uXG4gIEJOLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24gaW11bCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5tdWxUbyhudW0sIHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pbXVsbiA9IGZ1bmN0aW9uIGltdWxuIChudW0pIHtcbiAgICBhc3NlcnQodHlwZW9mIG51bSA9PT0gJ251bWJlcicpO1xuICAgIGFzc2VydChudW0gPCAweDQwMDAwMDApO1xuXG4gICAgLy8gQ2FycnlcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHcgPSAodGhpcy53b3Jkc1tpXSB8IDApICogbnVtO1xuICAgICAgdmFyIGxvID0gKHcgJiAweDNmZmZmZmYpICsgKGNhcnJ5ICYgMHgzZmZmZmZmKTtcbiAgICAgIGNhcnJ5ID4+PSAyNjtcbiAgICAgIGNhcnJ5ICs9ICh3IC8gMHg0MDAwMDAwKSB8IDA7XG4gICAgICAvLyBOT1RFOiBsbyBpcyAyN2JpdCBtYXhpbXVtXG4gICAgICBjYXJyeSArPSBsbyA+Pj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gbG8gJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gY2Fycnk7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IG51bSA9PT0gMCA/IDEgOiB0aGlzLmxlbmd0aDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5tdWxuID0gZnVuY3Rpb24gbXVsbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbihudW0pO1xuICB9O1xuXG4gIC8vIGB0aGlzYCAqIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuc3FyID0gZnVuY3Rpb24gc3FyICgpIHtcbiAgICByZXR1cm4gdGhpcy5tdWwodGhpcyk7XG4gIH07XG5cbiAgLy8gYHRoaXNgICogYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pc3FyID0gZnVuY3Rpb24gaXNxciAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW11bCh0aGlzLmNsb25lKCkpO1xuICB9O1xuXG4gIC8vIE1hdGgucG93KGB0aGlzYCwgYG51bWApXG4gIEJOLnByb3RvdHlwZS5wb3cgPSBmdW5jdGlvbiBwb3cgKG51bSkge1xuICAgIHZhciB3ID0gdG9CaXRBcnJheShudW0pO1xuICAgIGlmICh3Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ldyBCTigxKTtcblxuICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXNcbiAgICB2YXIgcmVzID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHcubGVuZ3RoOyBpKyssIHJlcyA9IHJlcy5zcXIoKSkge1xuICAgICAgaWYgKHdbaV0gIT09IDApIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICgrK2kgPCB3Lmxlbmd0aCkge1xuICAgICAgZm9yICh2YXIgcSA9IHJlcy5zcXIoKTsgaSA8IHcubGVuZ3RoOyBpKyssIHEgPSBxLnNxcigpKSB7XG4gICAgICAgIGlmICh3W2ldID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICByZXMgPSByZXMubXVsKHEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gU2hpZnQtbGVmdCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXVzaGxuID0gZnVuY3Rpb24gaXVzaGxuIChiaXRzKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXRzID09PSAnbnVtYmVyJyAmJiBiaXRzID49IDApO1xuICAgIHZhciByID0gYml0cyAlIDI2O1xuICAgIHZhciBzID0gKGJpdHMgLSByKSAvIDI2O1xuICAgIHZhciBjYXJyeU1hc2sgPSAoMHgzZmZmZmZmID4+PiAoMjYgLSByKSkgPDwgKDI2IC0gcik7XG4gICAgdmFyIGk7XG5cbiAgICBpZiAociAhPT0gMCkge1xuICAgICAgdmFyIGNhcnJ5ID0gMDtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5ld0NhcnJ5ID0gdGhpcy53b3Jkc1tpXSAmIGNhcnJ5TWFzaztcbiAgICAgICAgdmFyIGMgPSAoKHRoaXMud29yZHNbaV0gfCAwKSAtIG5ld0NhcnJ5KSA8PCByO1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gYyB8IGNhcnJ5O1xuICAgICAgICBjYXJyeSA9IG5ld0NhcnJ5ID4+PiAoMjYgLSByKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhcnJ5KSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBjYXJyeTtcbiAgICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocyAhPT0gMCkge1xuICAgICAgZm9yIChpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB0aGlzLndvcmRzW2kgKyBzXSA9IHRoaXMud29yZHNbaV07XG4gICAgICB9XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IDA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGVuZ3RoICs9IHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNobG4gPSBmdW5jdGlvbiBpc2hsbiAoYml0cykge1xuICAgIC8vIFRPRE8oaW5kdXRueSk6IGltcGxlbWVudCBtZVxuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdXNobG4oYml0cyk7XG4gIH07XG5cbiAgLy8gU2hpZnQtcmlnaHQgaW4tcGxhY2VcbiAgLy8gTk9URTogYGhpbnRgIGlzIGEgbG93ZXN0IGJpdCBiZWZvcmUgdHJhaWxpbmcgemVyb2VzXG4gIC8vIE5PVEU6IGlmIGBleHRlbmRlZGAgaXMgcHJlc2VudCAtIGl0IHdpbGwgYmUgZmlsbGVkIHdpdGggZGVzdHJveWVkIGJpdHNcbiAgQk4ucHJvdG90eXBlLml1c2hybiA9IGZ1bmN0aW9uIGl1c2hybiAoYml0cywgaGludCwgZXh0ZW5kZWQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdHMgPT09ICdudW1iZXInICYmIGJpdHMgPj0gMCk7XG4gICAgdmFyIGg7XG4gICAgaWYgKGhpbnQpIHtcbiAgICAgIGggPSAoaGludCAtIChoaW50ICUgMjYpKSAvIDI2O1xuICAgIH0gZWxzZSB7XG4gICAgICBoID0gMDtcbiAgICB9XG5cbiAgICB2YXIgciA9IGJpdHMgJSAyNjtcbiAgICB2YXIgcyA9IE1hdGgubWluKChiaXRzIC0gcikgLyAyNiwgdGhpcy5sZW5ndGgpO1xuICAgIHZhciBtYXNrID0gMHgzZmZmZmZmIF4gKCgweDNmZmZmZmYgPj4+IHIpIDw8IHIpO1xuICAgIHZhciBtYXNrZWRXb3JkcyA9IGV4dGVuZGVkO1xuXG4gICAgaCAtPSBzO1xuICAgIGggPSBNYXRoLm1heCgwLCBoKTtcblxuICAgIC8vIEV4dGVuZGVkIG1vZGUsIGNvcHkgbWFza2VkIHBhcnRcbiAgICBpZiAobWFza2VkV29yZHMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgICAgIG1hc2tlZFdvcmRzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICAgIG1hc2tlZFdvcmRzLmxlbmd0aCA9IHM7XG4gICAgfVxuXG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgIC8vIE5vLW9wLCB3ZSBzaG91bGQgbm90IG1vdmUgYW55dGhpbmcgYXQgYWxsXG4gICAgfSBlbHNlIGlmICh0aGlzLmxlbmd0aCA+IHMpIHtcbiAgICAgIHRoaXMubGVuZ3RoIC09IHM7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpICsgc107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAwO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgIH1cblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yIChpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDAgJiYgKGNhcnJ5ICE9PSAwIHx8IGkgPj0gaCk7IGktLSkge1xuICAgICAgdmFyIHdvcmQgPSB0aGlzLndvcmRzW2ldIHwgMDtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAoY2FycnkgPDwgKDI2IC0gcikpIHwgKHdvcmQgPj4+IHIpO1xuICAgICAgY2FycnkgPSB3b3JkICYgbWFzaztcbiAgICB9XG5cbiAgICAvLyBQdXNoIGNhcnJpZWQgYml0cyBhcyBhIG1hc2tcbiAgICBpZiAobWFza2VkV29yZHMgJiYgY2FycnkgIT09IDApIHtcbiAgICAgIG1hc2tlZFdvcmRzLndvcmRzW21hc2tlZFdvcmRzLmxlbmd0aCsrXSA9IGNhcnJ5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1swXSA9IDA7XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNocm4gPSBmdW5jdGlvbiBpc2hybiAoYml0cywgaGludCwgZXh0ZW5kZWQpIHtcbiAgICAvLyBUT0RPKGluZHV0bnkpOiBpbXBsZW1lbnQgbWVcbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXVzaHJuKGJpdHMsIGhpbnQsIGV4dGVuZGVkKTtcbiAgfTtcblxuICAvLyBTaGlmdC1sZWZ0XG4gIEJOLnByb3RvdHlwZS5zaGxuID0gZnVuY3Rpb24gc2hsbiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXNobG4oYml0cyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVzaGxuID0gZnVuY3Rpb24gdXNobG4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hsbihiaXRzKTtcbiAgfTtcblxuICAvLyBTaGlmdC1yaWdodFxuICBCTi5wcm90b3R5cGUuc2hybiA9IGZ1bmN0aW9uIHNocm4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaHJuKGJpdHMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51c2hybiA9IGZ1bmN0aW9uIHVzaHJuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNocm4oYml0cyk7XG4gIH07XG5cbiAgLy8gVGVzdCBpZiBuIGJpdCBpcyBzZXRcbiAgQk4ucHJvdG90eXBlLnRlc3RuID0gZnVuY3Rpb24gdGVzdG4gKGJpdCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0ID09PSAnbnVtYmVyJyAmJiBiaXQgPj0gMCk7XG4gICAgdmFyIHIgPSBiaXQgJSAyNjtcbiAgICB2YXIgcyA9IChiaXQgLSByKSAvIDI2O1xuICAgIHZhciBxID0gMSA8PCByO1xuXG4gICAgLy8gRmFzdCBjYXNlOiBiaXQgaXMgbXVjaCBoaWdoZXIgdGhhbiBhbGwgZXhpc3Rpbmcgd29yZHNcbiAgICBpZiAodGhpcy5sZW5ndGggPD0gcykgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gQ2hlY2sgYml0IGFuZCByZXR1cm5cbiAgICB2YXIgdyA9IHRoaXMud29yZHNbc107XG5cbiAgICByZXR1cm4gISEodyAmIHEpO1xuICB9O1xuXG4gIC8vIFJldHVybiBvbmx5IGxvd2VycyBiaXRzIG9mIG51bWJlciAoaW4tcGxhY2UpXG4gIEJOLnByb3RvdHlwZS5pbWFza24gPSBmdW5jdGlvbiBpbWFza24gKGJpdHMpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdHMgPT09ICdudW1iZXInICYmIGJpdHMgPj0gMCk7XG4gICAgdmFyIHIgPSBiaXRzICUgMjY7XG4gICAgdmFyIHMgPSAoYml0cyAtIHIpIC8gMjY7XG5cbiAgICBhc3NlcnQodGhpcy5uZWdhdGl2ZSA9PT0gMCwgJ2ltYXNrbiB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmUgbnVtYmVycycpO1xuXG4gICAgaWYgKHRoaXMubGVuZ3RoIDw9IHMpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmIChyICE9PSAwKSB7XG4gICAgICBzKys7XG4gICAgfVxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5taW4ocywgdGhpcy5sZW5ndGgpO1xuXG4gICAgaWYgKHIgIT09IDApIHtcbiAgICAgIHZhciBtYXNrID0gMHgzZmZmZmZmIF4gKCgweDNmZmZmZmYgPj4+IHIpIDw8IHIpO1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdICY9IG1hc2s7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gb25seSBsb3dlcnMgYml0cyBvZiBudW1iZXJcbiAgQk4ucHJvdG90eXBlLm1hc2tuID0gZnVuY3Rpb24gbWFza24gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmltYXNrbihiaXRzKTtcbiAgfTtcblxuICAvLyBBZGQgcGxhaW4gbnVtYmVyIGBudW1gIHRvIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuaWFkZG4gPSBmdW5jdGlvbiBpYWRkbiAobnVtKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBudW0gPT09ICdudW1iZXInKTtcbiAgICBhc3NlcnQobnVtIDwgMHg0MDAwMDAwKTtcbiAgICBpZiAobnVtIDwgMCkgcmV0dXJuIHRoaXMuaXN1Ym4oLW51bSk7XG5cbiAgICAvLyBQb3NzaWJsZSBzaWduIGNoYW5nZVxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBpZiAodGhpcy5sZW5ndGggPT09IDEgJiYgKHRoaXMud29yZHNbMF0gfCAwKSA8IG51bSkge1xuICAgICAgICB0aGlzLndvcmRzWzBdID0gbnVtIC0gKHRoaXMud29yZHNbMF0gfCAwKTtcbiAgICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHRoaXMuaXN1Ym4obnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIHdpdGhvdXQgY2hlY2tzXG4gICAgcmV0dXJuIHRoaXMuX2lhZGRuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pYWRkbiA9IGZ1bmN0aW9uIF9pYWRkbiAobnVtKSB7XG4gICAgdGhpcy53b3Jkc1swXSArPSBudW07XG5cbiAgICAvLyBDYXJyeVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGggJiYgdGhpcy53b3Jkc1tpXSA+PSAweDQwMDAwMDA7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSAtPSAweDQwMDAwMDA7XG4gICAgICBpZiAoaSA9PT0gdGhpcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHRoaXMud29yZHNbaSArIDFdID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMud29yZHNbaSArIDFdKys7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5sZW5ndGgsIGkgKyAxKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIFN1YnRyYWN0IHBsYWluIG51bWJlciBgbnVtYCBmcm9tIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuaXN1Ym4gPSBmdW5jdGlvbiBpc3VibiAobnVtKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBudW0gPT09ICdudW1iZXInKTtcbiAgICBhc3NlcnQobnVtIDwgMHg0MDAwMDAwKTtcbiAgICBpZiAobnVtIDwgMCkgcmV0dXJuIHRoaXMuaWFkZG4oLW51bSk7XG5cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmlhZGRuKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMud29yZHNbMF0gLT0gbnVtO1xuXG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPCAwKSB7XG4gICAgICB0aGlzLndvcmRzWzBdID0gLXRoaXMud29yZHNbMF07XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FycnlcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGggJiYgdGhpcy53b3Jkc1tpXSA8IDA7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldICs9IDB4NDAwMDAwMDtcbiAgICAgICAgdGhpcy53b3Jkc1tpICsgMV0gLT0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5hZGRuID0gZnVuY3Rpb24gYWRkbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkbihudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5zdWJuID0gZnVuY3Rpb24gc3VibiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc3VibihudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pYWJzID0gZnVuY3Rpb24gaWFicyAoKSB7XG4gICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuYWJzID0gZnVuY3Rpb24gYWJzICgpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlhYnMoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2lzaGxuc3VibXVsID0gZnVuY3Rpb24gX2lzaGxuc3VibXVsIChudW0sIG11bCwgc2hpZnQpIHtcbiAgICB2YXIgbGVuID0gbnVtLmxlbmd0aCArIHNoaWZ0O1xuICAgIHZhciBpO1xuXG4gICAgdGhpcy5fZXhwYW5kKGxlbik7XG5cbiAgICB2YXIgdztcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHcgPSAodGhpcy53b3Jkc1tpICsgc2hpZnRdIHwgMCkgKyBjYXJyeTtcbiAgICAgIHZhciByaWdodCA9IChudW0ud29yZHNbaV0gfCAwKSAqIG11bDtcbiAgICAgIHcgLT0gcmlnaHQgJiAweDNmZmZmZmY7XG4gICAgICBjYXJyeSA9ICh3ID4+IDI2KSAtICgocmlnaHQgLyAweDQwMDAwMDApIHwgMCk7XG4gICAgICB0aGlzLndvcmRzW2kgKyBzaGlmdF0gPSB3ICYgMHgzZmZmZmZmO1xuICAgIH1cbiAgICBmb3IgKDsgaSA8IHRoaXMubGVuZ3RoIC0gc2hpZnQ7IGkrKykge1xuICAgICAgdyA9ICh0aGlzLndvcmRzW2kgKyBzaGlmdF0gfCAwKSArIGNhcnJ5O1xuICAgICAgY2FycnkgPSB3ID4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpICsgc2hpZnRdID0gdyAmIDB4M2ZmZmZmZjtcbiAgICB9XG5cbiAgICBpZiAoY2FycnkgPT09IDApIHJldHVybiB0aGlzLnN0cmlwKCk7XG5cbiAgICAvLyBTdWJ0cmFjdGlvbiBvdmVyZmxvd1xuICAgIGFzc2VydChjYXJyeSA9PT0gLTEpO1xuICAgIGNhcnJ5ID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdyA9IC0odGhpcy53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHcgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdyAmIDB4M2ZmZmZmZjtcbiAgICB9XG4gICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fd29yZERpdiA9IGZ1bmN0aW9uIF93b3JkRGl2IChudW0sIG1vZGUpIHtcbiAgICB2YXIgc2hpZnQgPSB0aGlzLmxlbmd0aCAtIG51bS5sZW5ndGg7XG5cbiAgICB2YXIgYSA9IHRoaXMuY2xvbmUoKTtcbiAgICB2YXIgYiA9IG51bTtcblxuICAgIC8vIE5vcm1hbGl6ZVxuICAgIHZhciBiaGkgPSBiLndvcmRzW2IubGVuZ3RoIC0gMV0gfCAwO1xuICAgIHZhciBiaGlCaXRzID0gdGhpcy5fY291bnRCaXRzKGJoaSk7XG4gICAgc2hpZnQgPSAyNiAtIGJoaUJpdHM7XG4gICAgaWYgKHNoaWZ0ICE9PSAwKSB7XG4gICAgICBiID0gYi51c2hsbihzaGlmdCk7XG4gICAgICBhLml1c2hsbihzaGlmdCk7XG4gICAgICBiaGkgPSBiLndvcmRzW2IubGVuZ3RoIC0gMV0gfCAwO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgcXVvdGllbnRcbiAgICB2YXIgbSA9IGEubGVuZ3RoIC0gYi5sZW5ndGg7XG4gICAgdmFyIHE7XG5cbiAgICBpZiAobW9kZSAhPT0gJ21vZCcpIHtcbiAgICAgIHEgPSBuZXcgQk4obnVsbCk7XG4gICAgICBxLmxlbmd0aCA9IG0gKyAxO1xuICAgICAgcS53b3JkcyA9IG5ldyBBcnJheShxLmxlbmd0aCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcS53b3Jkc1tpXSA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRpZmYgPSBhLmNsb25lKCkuX2lzaGxuc3VibXVsKGIsIDEsIG0pO1xuICAgIGlmIChkaWZmLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICBhID0gZGlmZjtcbiAgICAgIGlmIChxKSB7XG4gICAgICAgIHEud29yZHNbbV0gPSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGogPSBtIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgIHZhciBxaiA9IChhLndvcmRzW2IubGVuZ3RoICsgal0gfCAwKSAqIDB4NDAwMDAwMCArXG4gICAgICAgIChhLndvcmRzW2IubGVuZ3RoICsgaiAtIDFdIHwgMCk7XG5cbiAgICAgIC8vIE5PVEU6IChxaiAvIGJoaSkgaXMgKDB4M2ZmZmZmZiAqIDB4NDAwMDAwMCArIDB4M2ZmZmZmZikgLyAweDIwMDAwMDAgbWF4XG4gICAgICAvLyAoMHg3ZmZmZmZmKVxuICAgICAgcWogPSBNYXRoLm1pbigocWogLyBiaGkpIHwgMCwgMHgzZmZmZmZmKTtcblxuICAgICAgYS5faXNobG5zdWJtdWwoYiwgcWosIGopO1xuICAgICAgd2hpbGUgKGEubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgcWotLTtcbiAgICAgICAgYS5uZWdhdGl2ZSA9IDA7XG4gICAgICAgIGEuX2lzaGxuc3VibXVsKGIsIDEsIGopO1xuICAgICAgICBpZiAoIWEuaXNaZXJvKCkpIHtcbiAgICAgICAgICBhLm5lZ2F0aXZlIF49IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChxKSB7XG4gICAgICAgIHEud29yZHNbal0gPSBxajtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHEpIHtcbiAgICAgIHEuc3RyaXAoKTtcbiAgICB9XG4gICAgYS5zdHJpcCgpO1xuXG4gICAgLy8gRGVub3JtYWxpemVcbiAgICBpZiAobW9kZSAhPT0gJ2RpdicgJiYgc2hpZnQgIT09IDApIHtcbiAgICAgIGEuaXVzaHJuKHNoaWZ0KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGl2OiBxIHx8IG51bGwsXG4gICAgICBtb2Q6IGFcbiAgICB9O1xuICB9O1xuXG4gIC8vIE5PVEU6IDEpIGBtb2RlYCBjYW4gYmUgc2V0IHRvIGBtb2RgIHRvIHJlcXVlc3QgbW9kIG9ubHksXG4gIC8vICAgICAgIHRvIGBkaXZgIHRvIHJlcXVlc3QgZGl2IG9ubHksIG9yIGJlIGFic2VudCB0b1xuICAvLyAgICAgICByZXF1ZXN0IGJvdGggZGl2ICYgbW9kXG4gIC8vICAgICAgIDIpIGBwb3NpdGl2ZWAgaXMgdHJ1ZSBpZiB1bnNpZ25lZCBtb2QgaXMgcmVxdWVzdGVkXG4gIEJOLnByb3RvdHlwZS5kaXZtb2QgPSBmdW5jdGlvbiBkaXZtb2QgKG51bSwgbW9kZSwgcG9zaXRpdmUpIHtcbiAgICBhc3NlcnQoIW51bS5pc1plcm8oKSk7XG5cbiAgICBpZiAodGhpcy5pc1plcm8oKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiBuZXcgQk4oMCksXG4gICAgICAgIG1vZDogbmV3IEJOKDApXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBkaXYsIG1vZCwgcmVzO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIG51bS5uZWdhdGl2ZSA9PT0gMCkge1xuICAgICAgcmVzID0gdGhpcy5uZWcoKS5kaXZtb2QobnVtLCBtb2RlKTtcblxuICAgICAgaWYgKG1vZGUgIT09ICdtb2QnKSB7XG4gICAgICAgIGRpdiA9IHJlcy5kaXYubmVnKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb2RlICE9PSAnZGl2Jykge1xuICAgICAgICBtb2QgPSByZXMubW9kLm5lZygpO1xuICAgICAgICBpZiAocG9zaXRpdmUgJiYgbW9kLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgICAgbW9kLmlhZGQobnVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IGRpdixcbiAgICAgICAgbW9kOiBtb2RcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbnVtLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICByZXMgPSB0aGlzLmRpdm1vZChudW0ubmVnKCksIG1vZGUpO1xuXG4gICAgICBpZiAobW9kZSAhPT0gJ21vZCcpIHtcbiAgICAgICAgZGl2ID0gcmVzLmRpdi5uZWcoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiBkaXYsXG4gICAgICAgIG1vZDogcmVzLm1vZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoKHRoaXMubmVnYXRpdmUgJiBudW0ubmVnYXRpdmUpICE9PSAwKSB7XG4gICAgICByZXMgPSB0aGlzLm5lZygpLmRpdm1vZChudW0ubmVnKCksIG1vZGUpO1xuXG4gICAgICBpZiAobW9kZSAhPT0gJ2RpdicpIHtcbiAgICAgICAgbW9kID0gcmVzLm1vZC5uZWcoKTtcbiAgICAgICAgaWYgKHBvc2l0aXZlICYmIG1vZC5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICAgIG1vZC5pc3ViKG51bSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiByZXMuZGl2LFxuICAgICAgICBtb2Q6IG1vZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBCb3RoIG51bWJlcnMgYXJlIHBvc2l0aXZlIGF0IHRoaXMgcG9pbnRcblxuICAgIC8vIFN0cmlwIGJvdGggbnVtYmVycyB0byBhcHByb3hpbWF0ZSBzaGlmdCB2YWx1ZVxuICAgIGlmIChudW0ubGVuZ3RoID4gdGhpcy5sZW5ndGggfHwgdGhpcy5jbXAobnVtKSA8IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogbmV3IEJOKDApLFxuICAgICAgICBtb2Q6IHRoaXNcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVmVyeSBzaG9ydCByZWR1Y3Rpb25cbiAgICBpZiAobnVtLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKG1vZGUgPT09ICdkaXYnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGl2OiB0aGlzLmRpdm4obnVtLndvcmRzWzBdKSxcbiAgICAgICAgICBtb2Q6IG51bGxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGUgPT09ICdtb2QnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGl2OiBudWxsLFxuICAgICAgICAgIG1vZDogbmV3IEJOKHRoaXMubW9kbihudW0ud29yZHNbMF0pKVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IHRoaXMuZGl2bihudW0ud29yZHNbMF0pLFxuICAgICAgICBtb2Q6IG5ldyBCTih0aGlzLm1vZG4obnVtLndvcmRzWzBdKSlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3dvcmREaXYobnVtLCBtb2RlKTtcbiAgfTtcblxuICAvLyBGaW5kIGB0aGlzYCAvIGBudW1gXG4gIEJOLnByb3RvdHlwZS5kaXYgPSBmdW5jdGlvbiBkaXYgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmRpdm1vZChudW0sICdkaXYnLCBmYWxzZSkuZGl2O1xuICB9O1xuXG4gIC8vIEZpbmQgYHRoaXNgICUgYG51bWBcbiAgQk4ucHJvdG90eXBlLm1vZCA9IGZ1bmN0aW9uIG1vZCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2bW9kKG51bSwgJ21vZCcsIGZhbHNlKS5tb2Q7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVtb2QgPSBmdW5jdGlvbiB1bW9kIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5kaXZtb2QobnVtLCAnbW9kJywgdHJ1ZSkubW9kO1xuICB9O1xuXG4gIC8vIEZpbmQgUm91bmQoYHRoaXNgIC8gYG51bWApXG4gIEJOLnByb3RvdHlwZS5kaXZSb3VuZCA9IGZ1bmN0aW9uIGRpdlJvdW5kIChudW0pIHtcbiAgICB2YXIgZG0gPSB0aGlzLmRpdm1vZChudW0pO1xuXG4gICAgLy8gRmFzdCBjYXNlIC0gZXhhY3QgZGl2aXNpb25cbiAgICBpZiAoZG0ubW9kLmlzWmVybygpKSByZXR1cm4gZG0uZGl2O1xuXG4gICAgdmFyIG1vZCA9IGRtLmRpdi5uZWdhdGl2ZSAhPT0gMCA/IGRtLm1vZC5pc3ViKG51bSkgOiBkbS5tb2Q7XG5cbiAgICB2YXIgaGFsZiA9IG51bS51c2hybigxKTtcbiAgICB2YXIgcjIgPSBudW0uYW5kbG4oMSk7XG4gICAgdmFyIGNtcCA9IG1vZC5jbXAoaGFsZik7XG5cbiAgICAvLyBSb3VuZCBkb3duXG4gICAgaWYgKGNtcCA8IDAgfHwgcjIgPT09IDEgJiYgY21wID09PSAwKSByZXR1cm4gZG0uZGl2O1xuXG4gICAgLy8gUm91bmQgdXBcbiAgICByZXR1cm4gZG0uZGl2Lm5lZ2F0aXZlICE9PSAwID8gZG0uZGl2LmlzdWJuKDEpIDogZG0uZGl2LmlhZGRuKDEpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5tb2RuID0gZnVuY3Rpb24gbW9kbiAobnVtKSB7XG4gICAgYXNzZXJ0KG51bSA8PSAweDNmZmZmZmYpO1xuICAgIHZhciBwID0gKDEgPDwgMjYpICUgbnVtO1xuXG4gICAgdmFyIGFjYyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGFjYyA9IChwICogYWNjICsgKHRoaXMud29yZHNbaV0gfCAwKSkgJSBudW07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcbiAgfTtcblxuICAvLyBJbi1wbGFjZSBkaXZpc2lvbiBieSBudW1iZXJcbiAgQk4ucHJvdG90eXBlLmlkaXZuID0gZnVuY3Rpb24gaWRpdm4gKG51bSkge1xuICAgIGFzc2VydChudW0gPD0gMHgzZmZmZmZmKTtcblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciB3ID0gKHRoaXMud29yZHNbaV0gfCAwKSArIGNhcnJ5ICogMHg0MDAwMDAwO1xuICAgICAgdGhpcy53b3Jkc1tpXSA9ICh3IC8gbnVtKSB8IDA7XG4gICAgICBjYXJyeSA9IHcgJSBudW07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZGl2biA9IGZ1bmN0aW9uIGRpdm4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWRpdm4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZWdjZCA9IGZ1bmN0aW9uIGVnY2QgKHApIHtcbiAgICBhc3NlcnQocC5uZWdhdGl2ZSA9PT0gMCk7XG4gICAgYXNzZXJ0KCFwLmlzWmVybygpKTtcblxuICAgIHZhciB4ID0gdGhpcztcbiAgICB2YXIgeSA9IHAuY2xvbmUoKTtcblxuICAgIGlmICh4Lm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICB4ID0geC51bW9kKHApO1xuICAgIH0gZWxzZSB7XG4gICAgICB4ID0geC5jbG9uZSgpO1xuICAgIH1cblxuICAgIC8vIEEgKiB4ICsgQiAqIHkgPSB4XG4gICAgdmFyIEEgPSBuZXcgQk4oMSk7XG4gICAgdmFyIEIgPSBuZXcgQk4oMCk7XG5cbiAgICAvLyBDICogeCArIEQgKiB5ID0geVxuICAgIHZhciBDID0gbmV3IEJOKDApO1xuICAgIHZhciBEID0gbmV3IEJOKDEpO1xuXG4gICAgdmFyIGcgPSAwO1xuXG4gICAgd2hpbGUgKHguaXNFdmVuKCkgJiYgeS5pc0V2ZW4oKSkge1xuICAgICAgeC5pdXNocm4oMSk7XG4gICAgICB5Lml1c2hybigxKTtcbiAgICAgICsrZztcbiAgICB9XG5cbiAgICB2YXIgeXAgPSB5LmNsb25lKCk7XG4gICAgdmFyIHhwID0geC5jbG9uZSgpO1xuXG4gICAgd2hpbGUgKCF4LmlzWmVybygpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaW0gPSAxOyAoeC53b3Jkc1swXSAmIGltKSA9PT0gMCAmJiBpIDwgMjY7ICsraSwgaW0gPDw9IDEpO1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIHguaXVzaHJuKGkpO1xuICAgICAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgICAgIGlmIChBLmlzT2RkKCkgfHwgQi5pc09kZCgpKSB7XG4gICAgICAgICAgICBBLmlhZGQoeXApO1xuICAgICAgICAgICAgQi5pc3ViKHhwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBBLml1c2hybigxKTtcbiAgICAgICAgICBCLml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBqID0gMCwgam0gPSAxOyAoeS53b3Jkc1swXSAmIGptKSA9PT0gMCAmJiBqIDwgMjY7ICsraiwgam0gPDw9IDEpO1xuICAgICAgaWYgKGogPiAwKSB7XG4gICAgICAgIHkuaXVzaHJuKGopO1xuICAgICAgICB3aGlsZSAoai0tID4gMCkge1xuICAgICAgICAgIGlmIChDLmlzT2RkKCkgfHwgRC5pc09kZCgpKSB7XG4gICAgICAgICAgICBDLmlhZGQoeXApO1xuICAgICAgICAgICAgRC5pc3ViKHhwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBDLml1c2hybigxKTtcbiAgICAgICAgICBELml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoeC5jbXAoeSkgPj0gMCkge1xuICAgICAgICB4LmlzdWIoeSk7XG4gICAgICAgIEEuaXN1YihDKTtcbiAgICAgICAgQi5pc3ViKEQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeS5pc3ViKHgpO1xuICAgICAgICBDLmlzdWIoQSk7XG4gICAgICAgIEQuaXN1YihCKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYTogQyxcbiAgICAgIGI6IEQsXG4gICAgICBnY2Q6IHkuaXVzaGxuKGcpXG4gICAgfTtcbiAgfTtcblxuICAvLyBUaGlzIGlzIHJlZHVjZWQgaW5jYXJuYXRpb24gb2YgdGhlIGJpbmFyeSBFRUFcbiAgLy8gYWJvdmUsIGRlc2lnbmF0ZWQgdG8gaW52ZXJ0IG1lbWJlcnMgb2YgdGhlXG4gIC8vIF9wcmltZV8gZmllbGRzIEYocCkgYXQgYSBtYXhpbWFsIHNwZWVkXG4gIEJOLnByb3RvdHlwZS5faW52bXAgPSBmdW5jdGlvbiBfaW52bXAgKHApIHtcbiAgICBhc3NlcnQocC5uZWdhdGl2ZSA9PT0gMCk7XG4gICAgYXNzZXJ0KCFwLmlzWmVybygpKTtcblxuICAgIHZhciBhID0gdGhpcztcbiAgICB2YXIgYiA9IHAuY2xvbmUoKTtcblxuICAgIGlmIChhLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBhID0gYS51bW9kKHApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhID0gYS5jbG9uZSgpO1xuICAgIH1cblxuICAgIHZhciB4MSA9IG5ldyBCTigxKTtcbiAgICB2YXIgeDIgPSBuZXcgQk4oMCk7XG5cbiAgICB2YXIgZGVsdGEgPSBiLmNsb25lKCk7XG5cbiAgICB3aGlsZSAoYS5jbXBuKDEpID4gMCAmJiBiLmNtcG4oMSkgPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaW0gPSAxOyAoYS53b3Jkc1swXSAmIGltKSA9PT0gMCAmJiBpIDwgMjY7ICsraSwgaW0gPDw9IDEpO1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGEuaXVzaHJuKGkpO1xuICAgICAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgICAgIGlmICh4MS5pc09kZCgpKSB7XG4gICAgICAgICAgICB4MS5pYWRkKGRlbHRhKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB4MS5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaiA9IDAsIGptID0gMTsgKGIud29yZHNbMF0gJiBqbSkgPT09IDAgJiYgaiA8IDI2OyArK2osIGptIDw8PSAxKTtcbiAgICAgIGlmIChqID4gMCkge1xuICAgICAgICBiLml1c2hybihqKTtcbiAgICAgICAgd2hpbGUgKGotLSA+IDApIHtcbiAgICAgICAgICBpZiAoeDIuaXNPZGQoKSkge1xuICAgICAgICAgICAgeDIuaWFkZChkZWx0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgeDIuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhLmNtcChiKSA+PSAwKSB7XG4gICAgICAgIGEuaXN1YihiKTtcbiAgICAgICAgeDEuaXN1Yih4Mik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiLmlzdWIoYSk7XG4gICAgICAgIHgyLmlzdWIoeDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZXM7XG4gICAgaWYgKGEuY21wbigxKSA9PT0gMCkge1xuICAgICAgcmVzID0geDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IHgyO1xuICAgIH1cblxuICAgIGlmIChyZXMuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcy5pYWRkKHApO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmdjZCA9IGZ1bmN0aW9uIGdjZCAobnVtKSB7XG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpIHJldHVybiBudW0uYWJzKCk7XG4gICAgaWYgKG51bS5pc1plcm8oKSkgcmV0dXJuIHRoaXMuYWJzKCk7XG5cbiAgICB2YXIgYSA9IHRoaXMuY2xvbmUoKTtcbiAgICB2YXIgYiA9IG51bS5jbG9uZSgpO1xuICAgIGEubmVnYXRpdmUgPSAwO1xuICAgIGIubmVnYXRpdmUgPSAwO1xuXG4gICAgLy8gUmVtb3ZlIGNvbW1vbiBmYWN0b3Igb2YgdHdvXG4gICAgZm9yICh2YXIgc2hpZnQgPSAwOyBhLmlzRXZlbigpICYmIGIuaXNFdmVuKCk7IHNoaWZ0KyspIHtcbiAgICAgIGEuaXVzaHJuKDEpO1xuICAgICAgYi5pdXNocm4oMSk7XG4gICAgfVxuXG4gICAgZG8ge1xuICAgICAgd2hpbGUgKGEuaXNFdmVuKCkpIHtcbiAgICAgICAgYS5pdXNocm4oMSk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoYi5pc0V2ZW4oKSkge1xuICAgICAgICBiLml1c2hybigxKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHIgPSBhLmNtcChiKTtcbiAgICAgIGlmIChyIDwgMCkge1xuICAgICAgICAvLyBTd2FwIGBhYCBhbmQgYGJgIHRvIG1ha2UgYGFgIGFsd2F5cyBiaWdnZXIgdGhhbiBgYmBcbiAgICAgICAgdmFyIHQgPSBhO1xuICAgICAgICBhID0gYjtcbiAgICAgICAgYiA9IHQ7XG4gICAgICB9IGVsc2UgaWYgKHIgPT09IDAgfHwgYi5jbXBuKDEpID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBhLmlzdWIoYik7XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgICByZXR1cm4gYi5pdXNobG4oc2hpZnQpO1xuICB9O1xuXG4gIC8vIEludmVydCBudW1iZXIgaW4gdGhlIGZpZWxkIEYobnVtKVxuICBCTi5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uIGludm0gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmVnY2QobnVtKS5hLnVtb2QobnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNFdmVuID0gZnVuY3Rpb24gaXNFdmVuICgpIHtcbiAgICByZXR1cm4gKHRoaXMud29yZHNbMF0gJiAxKSA9PT0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNPZGQgPSBmdW5jdGlvbiBpc09kZCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLndvcmRzWzBdICYgMSkgPT09IDE7XG4gIH07XG5cbiAgLy8gQW5kIGZpcnN0IHdvcmQgYW5kIG51bVxuICBCTi5wcm90b3R5cGUuYW5kbG4gPSBmdW5jdGlvbiBhbmRsbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMud29yZHNbMF0gJiBudW07XG4gIH07XG5cbiAgLy8gSW5jcmVtZW50IGF0IHRoZSBiaXQgcG9zaXRpb24gaW4tbGluZVxuICBCTi5wcm90b3R5cGUuYmluY24gPSBmdW5jdGlvbiBiaW5jbiAoYml0KSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXQgPT09ICdudW1iZXInKTtcbiAgICB2YXIgciA9IGJpdCAlIDI2O1xuICAgIHZhciBzID0gKGJpdCAtIHIpIC8gMjY7XG4gICAgdmFyIHEgPSAxIDw8IHI7XG5cbiAgICAvLyBGYXN0IGNhc2U6IGJpdCBpcyBtdWNoIGhpZ2hlciB0aGFuIGFsbCBleGlzdGluZyB3b3Jkc1xuICAgIGlmICh0aGlzLmxlbmd0aCA8PSBzKSB7XG4gICAgICB0aGlzLl9leHBhbmQocyArIDEpO1xuICAgICAgdGhpcy53b3Jkc1tzXSB8PSBxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIGJpdCBhbmQgcHJvcGFnYXRlLCBpZiBuZWVkZWRcbiAgICB2YXIgY2FycnkgPSBxO1xuICAgIGZvciAodmFyIGkgPSBzOyBjYXJyeSAhPT0gMCAmJiBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHcgPSB0aGlzLndvcmRzW2ldIHwgMDtcbiAgICAgIHcgKz0gY2Fycnk7XG4gICAgICBjYXJyeSA9IHcgPj4+IDI2O1xuICAgICAgdyAmPSAweDNmZmZmZmY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdztcbiAgICB9XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gY2Fycnk7XG4gICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNaZXJvID0gZnVuY3Rpb24gaXNaZXJvICgpIHtcbiAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA9PT0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuY21wbiA9IGZ1bmN0aW9uIGNtcG4gKG51bSkge1xuICAgIHZhciBuZWdhdGl2ZSA9IG51bSA8IDA7XG5cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiAhbmVnYXRpdmUpIHJldHVybiAtMTtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBuZWdhdGl2ZSkgcmV0dXJuIDE7XG5cbiAgICB0aGlzLnN0cmlwKCk7XG5cbiAgICB2YXIgcmVzO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJlcyA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZWdhdGl2ZSkge1xuICAgICAgICBudW0gPSAtbnVtO1xuICAgICAgfVxuXG4gICAgICBhc3NlcnQobnVtIDw9IDB4M2ZmZmZmZiwgJ051bWJlciBpcyB0b28gYmlnJyk7XG5cbiAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1swXSB8IDA7XG4gICAgICByZXMgPSB3ID09PSBudW0gPyAwIDogdyA8IG51bSA/IC0xIDogMTtcbiAgICB9XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHJldHVybiAtcmVzIHwgMDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIENvbXBhcmUgdHdvIG51bWJlcnMgYW5kIHJldHVybjpcbiAgLy8gMSAtIGlmIGB0aGlzYCA+IGBudW1gXG4gIC8vIDAgLSBpZiBgdGhpc2AgPT0gYG51bWBcbiAgLy8gLTEgLSBpZiBgdGhpc2AgPCBgbnVtYFxuICBCTi5wcm90b3R5cGUuY21wID0gZnVuY3Rpb24gY21wIChudW0pIHtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBudW0ubmVnYXRpdmUgPT09IDApIHJldHVybiAtMTtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBudW0ubmVnYXRpdmUgIT09IDApIHJldHVybiAxO1xuXG4gICAgdmFyIHJlcyA9IHRoaXMudWNtcChudW0pO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSByZXR1cm4gLXJlcyB8IDA7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBVbnNpZ25lZCBjb21wYXJpc29uXG4gIEJOLnByb3RvdHlwZS51Y21wID0gZnVuY3Rpb24gdWNtcCAobnVtKSB7XG4gICAgLy8gQXQgdGhpcyBwb2ludCBib3RoIG51bWJlcnMgaGF2ZSB0aGUgc2FtZSBzaWduXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIDE7XG4gICAgaWYgKHRoaXMubGVuZ3RoIDwgbnVtLmxlbmd0aCkgcmV0dXJuIC0xO1xuXG4gICAgdmFyIHJlcyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBhID0gdGhpcy53b3Jkc1tpXSB8IDA7XG4gICAgICB2YXIgYiA9IG51bS53b3Jkc1tpXSB8IDA7XG5cbiAgICAgIGlmIChhID09PSBiKSBjb250aW51ZTtcbiAgICAgIGlmIChhIDwgYikge1xuICAgICAgICByZXMgPSAtMTtcbiAgICAgIH0gZWxzZSBpZiAoYSA+IGIpIHtcbiAgICAgICAgcmVzID0gMTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndG4gPSBmdW5jdGlvbiBndG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA9PT0gMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3QgPSBmdW5jdGlvbiBndCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPT09IDE7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0ZW4gPSBmdW5jdGlvbiBndGVuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPj0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3RlID0gZnVuY3Rpb24gZ3RlIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA+PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdG4gPSBmdW5jdGlvbiBsdG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA9PT0gLTE7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0ID0gZnVuY3Rpb24gbHQgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID09PSAtMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHRlbiA9IGZ1bmN0aW9uIGx0ZW4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA8PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdGUgPSBmdW5jdGlvbiBsdGUgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pIDw9IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmVxbiA9IGZ1bmN0aW9uIGVxbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID09PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA9PT0gMDtcbiAgfTtcblxuICAvL1xuICAvLyBBIHJlZHVjZSBjb250ZXh0LCBjb3VsZCBiZSB1c2luZyBtb250Z29tZXJ5IG9yIHNvbWV0aGluZyBiZXR0ZXIsIGRlcGVuZGluZ1xuICAvLyBvbiB0aGUgYG1gIGl0c2VsZi5cbiAgLy9cbiAgQk4ucmVkID0gZnVuY3Rpb24gcmVkIChudW0pIHtcbiAgICByZXR1cm4gbmV3IFJlZChudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b1JlZCA9IGZ1bmN0aW9uIHRvUmVkIChjdHgpIHtcbiAgICBhc3NlcnQoIXRoaXMucmVkLCAnQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCcpO1xuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwLCAncmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMnKTtcbiAgICByZXR1cm4gY3R4LmNvbnZlcnRUbyh0aGlzKS5fZm9yY2VSZWQoY3R4KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZnJvbVJlZCA9IGZ1bmN0aW9uIGZyb21SZWQgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ2Zyb21SZWQgd29ya3Mgb25seSB3aXRoIG51bWJlcnMgaW4gcmVkdWN0aW9uIGNvbnRleHQnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuY29udmVydEZyb20odGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9mb3JjZVJlZCA9IGZ1bmN0aW9uIF9mb3JjZVJlZCAoY3R4KSB7XG4gICAgdGhpcy5yZWQgPSBjdHg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmZvcmNlUmVkID0gZnVuY3Rpb24gZm9yY2VSZWQgKGN0eCkge1xuICAgIGFzc2VydCghdGhpcy5yZWQsICdBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0Jyk7XG4gICAgcmV0dXJuIHRoaXMuX2ZvcmNlUmVkKGN0eCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZEFkZCA9IGZ1bmN0aW9uIHJlZEFkZCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5hZGQodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSUFkZCA9IGZ1bmN0aW9uIHJlZElBZGQgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZElBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmlhZGQodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkU3ViID0gZnVuY3Rpb24gcmVkU3ViIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnN1Yih0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJU3ViID0gZnVuY3Rpb24gcmVkSVN1YiAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSVN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaXN1Yih0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRTaGwgPSBmdW5jdGlvbiByZWRTaGwgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFNobCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc2hsKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZE11bCA9IGZ1bmN0aW9uIHJlZE11bCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsIG51bSk7XG4gICAgcmV0dXJuIHRoaXMucmVkLm11bCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJTXVsID0gZnVuY3Rpb24gcmVkSU11bCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsIG51bSk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmltdWwodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkU3FyID0gZnVuY3Rpb24gcmVkU3FyICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnNxcih0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSVNxciA9IGZ1bmN0aW9uIHJlZElTcXIgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZElTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmlzcXIodGhpcyk7XG4gIH07XG5cbiAgLy8gU3F1YXJlIHJvb3Qgb3ZlciBwXG4gIEJOLnByb3RvdHlwZS5yZWRTcXJ0ID0gZnVuY3Rpb24gcmVkU3FydCAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU3FydCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc3FydCh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkSW52bSA9IGZ1bmN0aW9uIHJlZEludm0gKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZEludm0gd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmludm0odGhpcyk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG5lZ2F0aXZlIGNsb25lIG9mIGB0aGlzYCAlIGByZWQgbW9kdWxvYFxuICBCTi5wcm90b3R5cGUucmVkTmVnID0gZnVuY3Rpb24gcmVkTmVnICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWROZWcgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLm5lZyh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkUG93ID0gZnVuY3Rpb24gcmVkUG93IChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQgJiYgIW51bS5yZWQsICdyZWRQb3cobm9ybWFsTnVtKScpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5wb3codGhpcywgbnVtKTtcbiAgfTtcblxuICAvLyBQcmltZSBudW1iZXJzIHdpdGggZWZmaWNpZW50IHJlZHVjdGlvblxuICB2YXIgcHJpbWVzID0ge1xuICAgIGsyNTY6IG51bGwsXG4gICAgcDIyNDogbnVsbCxcbiAgICBwMTkyOiBudWxsLFxuICAgIHAyNTUxOTogbnVsbFxuICB9O1xuXG4gIC8vIFBzZXVkby1NZXJzZW5uZSBwcmltZVxuICBmdW5jdGlvbiBNUHJpbWUgKG5hbWUsIHApIHtcbiAgICAvLyBQID0gMiBeIE4gLSBLXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnAgPSBuZXcgQk4ocCwgMTYpO1xuICAgIHRoaXMubiA9IHRoaXMucC5iaXRMZW5ndGgoKTtcbiAgICB0aGlzLmsgPSBuZXcgQk4oMSkuaXVzaGxuKHRoaXMubikuaXN1Yih0aGlzLnApO1xuXG4gICAgdGhpcy50bXAgPSB0aGlzLl90bXAoKTtcbiAgfVxuXG4gIE1QcmltZS5wcm90b3R5cGUuX3RtcCA9IGZ1bmN0aW9uIF90bXAgKCkge1xuICAgIHZhciB0bXAgPSBuZXcgQk4obnVsbCk7XG4gICAgdG1wLndvcmRzID0gbmV3IEFycmF5KE1hdGguY2VpbCh0aGlzLm4gLyAxMykpO1xuICAgIHJldHVybiB0bXA7XG4gIH07XG5cbiAgTVByaW1lLnByb3RvdHlwZS5pcmVkdWNlID0gZnVuY3Rpb24gaXJlZHVjZSAobnVtKSB7XG4gICAgLy8gQXNzdW1lcyB0aGF0IGBudW1gIGlzIGxlc3MgdGhhbiBgUF4yYFxuICAgIC8vIG51bSA9IEhJICogKDIgXiBOIC0gSykgKyBISSAqIEsgKyBMTyA9IEhJICogSyArIExPIChtb2QgUClcbiAgICB2YXIgciA9IG51bTtcbiAgICB2YXIgcmxlbjtcblxuICAgIGRvIHtcbiAgICAgIHRoaXMuc3BsaXQociwgdGhpcy50bXApO1xuICAgICAgciA9IHRoaXMuaW11bEsocik7XG4gICAgICByID0gci5pYWRkKHRoaXMudG1wKTtcbiAgICAgIHJsZW4gPSByLmJpdExlbmd0aCgpO1xuICAgIH0gd2hpbGUgKHJsZW4gPiB0aGlzLm4pO1xuXG4gICAgdmFyIGNtcCA9IHJsZW4gPCB0aGlzLm4gPyAtMSA6IHIudWNtcCh0aGlzLnApO1xuICAgIGlmIChjbXAgPT09IDApIHtcbiAgICAgIHIud29yZHNbMF0gPSAwO1xuICAgICAgci5sZW5ndGggPSAxO1xuICAgIH0gZWxzZSBpZiAoY21wID4gMCkge1xuICAgICAgci5pc3ViKHRoaXMucCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyLnN0cmlwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gciBpcyBCTiB2NCBpbnN0YW5jZVxuICAgICAgICByLnN0cmlwKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByIGlzIEJOIHY1IGluc3RhbmNlXG4gICAgICAgIHIuX3N0cmlwKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgTVByaW1lLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uIHNwbGl0IChpbnB1dCwgb3V0KSB7XG4gICAgaW5wdXQuaXVzaHJuKHRoaXMubiwgMCwgb3V0KTtcbiAgfTtcblxuICBNUHJpbWUucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24gaW11bEsgKG51bSkge1xuICAgIHJldHVybiBudW0uaW11bCh0aGlzLmspO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEsyNTYgKCkge1xuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICdrMjU2JyxcbiAgICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZicpO1xuICB9XG4gIGluaGVyaXRzKEsyNTYsIE1QcmltZSk7XG5cbiAgSzI1Ni5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbiBzcGxpdCAoaW5wdXQsIG91dHB1dCkge1xuICAgIC8vIDI1NiA9IDkgKiAyNiArIDIyXG4gICAgdmFyIG1hc2sgPSAweDNmZmZmZjtcblxuICAgIHZhciBvdXRMZW4gPSBNYXRoLm1pbihpbnB1dC5sZW5ndGgsIDkpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3V0TGVuOyBpKyspIHtcbiAgICAgIG91dHB1dC53b3Jkc1tpXSA9IGlucHV0LndvcmRzW2ldO1xuICAgIH1cbiAgICBvdXRwdXQubGVuZ3RoID0gb3V0TGVuO1xuXG4gICAgaWYgKGlucHV0Lmxlbmd0aCA8PSA5KSB7XG4gICAgICBpbnB1dC53b3Jkc1swXSA9IDA7XG4gICAgICBpbnB1dC5sZW5ndGggPSAxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNoaWZ0IGJ5IDkgbGltYnNcbiAgICB2YXIgcHJldiA9IGlucHV0LndvcmRzWzldO1xuICAgIG91dHB1dC53b3Jkc1tvdXRwdXQubGVuZ3RoKytdID0gcHJldiAmIG1hc2s7XG5cbiAgICBmb3IgKGkgPSAxMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmV4dCA9IGlucHV0LndvcmRzW2ldIHwgMDtcbiAgICAgIGlucHV0LndvcmRzW2kgLSAxMF0gPSAoKG5leHQgJiBtYXNrKSA8PCA0KSB8IChwcmV2ID4+PiAyMik7XG4gICAgICBwcmV2ID0gbmV4dDtcbiAgICB9XG4gICAgcHJldiA+Pj49IDIyO1xuICAgIGlucHV0LndvcmRzW2kgLSAxMF0gPSBwcmV2O1xuICAgIGlmIChwcmV2ID09PSAwICYmIGlucHV0Lmxlbmd0aCA+IDEwKSB7XG4gICAgICBpbnB1dC5sZW5ndGggLT0gMTA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucHV0Lmxlbmd0aCAtPSA5O1xuICAgIH1cbiAgfTtcblxuICBLMjU2LnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uIGltdWxLIChudW0pIHtcbiAgICAvLyBLID0gMHgxMDAwMDAzZDEgPSBbIDB4NDAsIDB4M2QxIF1cbiAgICBudW0ud29yZHNbbnVtLmxlbmd0aF0gPSAwO1xuICAgIG51bS53b3Jkc1tudW0ubGVuZ3RoICsgMV0gPSAwO1xuICAgIG51bS5sZW5ndGggKz0gMjtcblxuICAgIC8vIGJvdW5kZWQgYXQ6IDB4NDAgKiAweDNmZmZmZmYgKyAweDNkMCA9IDB4MTAwMDAwMzkwXG4gICAgdmFyIGxvID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHcgPSBudW0ud29yZHNbaV0gfCAwO1xuICAgICAgbG8gKz0gdyAqIDB4M2QxO1xuICAgICAgbnVtLndvcmRzW2ldID0gbG8gJiAweDNmZmZmZmY7XG4gICAgICBsbyA9IHcgKiAweDQwICsgKChsbyAvIDB4NDAwMDAwMCkgfCAwKTtcbiAgICB9XG5cbiAgICAvLyBGYXN0IGxlbmd0aCByZWR1Y3Rpb25cbiAgICBpZiAobnVtLndvcmRzW251bS5sZW5ndGggLSAxXSA9PT0gMCkge1xuICAgICAgbnVtLmxlbmd0aC0tO1xuICAgICAgaWYgKG51bS53b3Jkc1tudW0ubGVuZ3RoIC0gMV0gPT09IDApIHtcbiAgICAgICAgbnVtLmxlbmd0aC0tO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVtO1xuICB9O1xuXG4gIGZ1bmN0aW9uIFAyMjQgKCkge1xuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICdwMjI0JyxcbiAgICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMScpO1xuICB9XG4gIGluaGVyaXRzKFAyMjQsIE1QcmltZSk7XG5cbiAgZnVuY3Rpb24gUDE5MiAoKSB7XG4gICAgTVByaW1lLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgJ3AxOTInLFxuICAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmJyk7XG4gIH1cbiAgaW5oZXJpdHMoUDE5MiwgTVByaW1lKTtcblxuICBmdW5jdGlvbiBQMjU1MTkgKCkge1xuICAgIC8vIDIgXiAyNTUgLSAxOVxuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICcyNTUxOScsXG4gICAgICAnN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCcpO1xuICB9XG4gIGluaGVyaXRzKFAyNTUxOSwgTVByaW1lKTtcblxuICBQMjU1MTkucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24gaW11bEsgKG51bSkge1xuICAgIC8vIEsgPSAweDEzXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhpID0gKG51bS53b3Jkc1tpXSB8IDApICogMHgxMyArIGNhcnJ5O1xuICAgICAgdmFyIGxvID0gaGkgJiAweDNmZmZmZmY7XG4gICAgICBoaSA+Pj49IDI2O1xuXG4gICAgICBudW0ud29yZHNbaV0gPSBsbztcbiAgICAgIGNhcnJ5ID0gaGk7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgbnVtLndvcmRzW251bS5sZW5ndGgrK10gPSBjYXJyeTtcbiAgICB9XG4gICAgcmV0dXJuIG51bTtcbiAgfTtcblxuICAvLyBFeHBvcnRlZCBtb3N0bHkgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHVzZSBwbGFpbiBuYW1lIGluc3RlYWRcbiAgQk4uX3ByaW1lID0gZnVuY3Rpb24gcHJpbWUgKG5hbWUpIHtcbiAgICAvLyBDYWNoZWQgdmVyc2lvbiBvZiBwcmltZVxuICAgIGlmIChwcmltZXNbbmFtZV0pIHJldHVybiBwcmltZXNbbmFtZV07XG5cbiAgICB2YXIgcHJpbWU7XG4gICAgaWYgKG5hbWUgPT09ICdrMjU2Jykge1xuICAgICAgcHJpbWUgPSBuZXcgSzI1NigpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3AyMjQnKSB7XG4gICAgICBwcmltZSA9IG5ldyBQMjI0KCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAncDE5MicpIHtcbiAgICAgIHByaW1lID0gbmV3IFAxOTIoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdwMjU1MTknKSB7XG4gICAgICBwcmltZSA9IG5ldyBQMjU1MTkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHByaW1lICcgKyBuYW1lKTtcbiAgICB9XG4gICAgcHJpbWVzW25hbWVdID0gcHJpbWU7XG5cbiAgICByZXR1cm4gcHJpbWU7XG4gIH07XG5cbiAgLy9cbiAgLy8gQmFzZSByZWR1Y3Rpb24gZW5naW5lXG4gIC8vXG4gIGZ1bmN0aW9uIFJlZCAobSkge1xuICAgIGlmICh0eXBlb2YgbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBwcmltZSA9IEJOLl9wcmltZShtKTtcbiAgICAgIHRoaXMubSA9IHByaW1lLnA7XG4gICAgICB0aGlzLnByaW1lID0gcHJpbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChtLmd0bigxKSwgJ21vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMScpO1xuICAgICAgdGhpcy5tID0gbTtcbiAgICAgIHRoaXMucHJpbWUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIFJlZC5wcm90b3R5cGUuX3ZlcmlmeTEgPSBmdW5jdGlvbiBfdmVyaWZ5MSAoYSkge1xuICAgIGFzc2VydChhLm5lZ2F0aXZlID09PSAwLCAncmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMnKTtcbiAgICBhc3NlcnQoYS5yZWQsICdyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5fdmVyaWZ5MiA9IGZ1bmN0aW9uIF92ZXJpZnkyIChhLCBiKSB7XG4gICAgYXNzZXJ0KChhLm5lZ2F0aXZlIHwgYi5uZWdhdGl2ZSkgPT09IDAsICdyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcycpO1xuICAgIGFzc2VydChhLnJlZCAmJiBhLnJlZCA9PT0gYi5yZWQsXG4gICAgICAncmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW1vZCA9IGZ1bmN0aW9uIGltb2QgKGEpIHtcbiAgICBpZiAodGhpcy5wcmltZSkgcmV0dXJuIHRoaXMucHJpbWUuaXJlZHVjZShhKS5fZm9yY2VSZWQodGhpcyk7XG4gICAgcmV0dXJuIGEudW1vZCh0aGlzLm0pLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZyAoYSkge1xuICAgIGlmIChhLmlzWmVybygpKSB7XG4gICAgICByZXR1cm4gYS5jbG9uZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm0uc3ViKGEpLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5hZGQoYik7XG4gICAgaWYgKHJlcy5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMuaXN1Yih0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlhZGQgPSBmdW5jdGlvbiBpYWRkIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLmlhZGQoYik7XG4gICAgaWYgKHJlcy5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMuaXN1Yih0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24gc3ViIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLnN1YihiKTtcbiAgICBpZiAocmVzLmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMuaWFkZCh0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlzdWIgPSBmdW5jdGlvbiBpc3ViIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLmlzdWIoYik7XG4gICAgaWYgKHJlcy5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzLmlhZGQodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNobCA9IGZ1bmN0aW9uIHNobCAoYSwgbnVtKSB7XG4gICAgdGhpcy5fdmVyaWZ5MShhKTtcbiAgICByZXR1cm4gdGhpcy5pbW9kKGEudXNobG4obnVtKSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24gaW11bCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLmltdWwoYikpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcbiAgICByZXR1cm4gdGhpcy5pbW9kKGEubXVsKGIpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbiBpc3FyIChhKSB7XG4gICAgcmV0dXJuIHRoaXMuaW11bChhLCBhLmNsb25lKCkpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3FyID0gZnVuY3Rpb24gc3FyIChhKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsKGEsIGEpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc3FydCA9IGZ1bmN0aW9uIHNxcnQgKGEpIHtcbiAgICBpZiAoYS5pc1plcm8oKSkgcmV0dXJuIGEuY2xvbmUoKTtcblxuICAgIHZhciBtb2QzID0gdGhpcy5tLmFuZGxuKDMpO1xuICAgIGFzc2VydChtb2QzICUgMiA9PT0gMSk7XG5cbiAgICAvLyBGYXN0IGNhc2VcbiAgICBpZiAobW9kMyA9PT0gMykge1xuICAgICAgdmFyIHBvdyA9IHRoaXMubS5hZGQobmV3IEJOKDEpKS5pdXNocm4oMik7XG4gICAgICByZXR1cm4gdGhpcy5wb3coYSwgcG93KTtcbiAgICB9XG5cbiAgICAvLyBUb25lbGxpLVNoYW5rcyBhbGdvcml0aG0gKFRvdGFsbHkgdW5vcHRpbWl6ZWQgYW5kIHNsb3cpXG4gICAgLy9cbiAgICAvLyBGaW5kIFEgYW5kIFMsIHRoYXQgUSAqIDIgXiBTID0gKFAgLSAxKVxuICAgIHZhciBxID0gdGhpcy5tLnN1Ym4oMSk7XG4gICAgdmFyIHMgPSAwO1xuICAgIHdoaWxlICghcS5pc1plcm8oKSAmJiBxLmFuZGxuKDEpID09PSAwKSB7XG4gICAgICBzKys7XG4gICAgICBxLml1c2hybigxKTtcbiAgICB9XG4gICAgYXNzZXJ0KCFxLmlzWmVybygpKTtcblxuICAgIHZhciBvbmUgPSBuZXcgQk4oMSkudG9SZWQodGhpcyk7XG4gICAgdmFyIG5PbmUgPSBvbmUucmVkTmVnKCk7XG5cbiAgICAvLyBGaW5kIHF1YWRyYXRpYyBub24tcmVzaWR1ZVxuICAgIC8vIE5PVEU6IE1heCBpcyBzdWNoIGJlY2F1c2Ugb2YgZ2VuZXJhbGl6ZWQgUmllbWFubiBoeXBvdGhlc2lzLlxuICAgIHZhciBscG93ID0gdGhpcy5tLnN1Ym4oMSkuaXVzaHJuKDEpO1xuICAgIHZhciB6ID0gdGhpcy5tLmJpdExlbmd0aCgpO1xuICAgIHogPSBuZXcgQk4oMiAqIHogKiB6KS50b1JlZCh0aGlzKTtcblxuICAgIHdoaWxlICh0aGlzLnBvdyh6LCBscG93KS5jbXAobk9uZSkgIT09IDApIHtcbiAgICAgIHoucmVkSUFkZChuT25lKTtcbiAgICB9XG5cbiAgICB2YXIgYyA9IHRoaXMucG93KHosIHEpO1xuICAgIHZhciByID0gdGhpcy5wb3coYSwgcS5hZGRuKDEpLml1c2hybigxKSk7XG4gICAgdmFyIHQgPSB0aGlzLnBvdyhhLCBxKTtcbiAgICB2YXIgbSA9IHM7XG4gICAgd2hpbGUgKHQuY21wKG9uZSkgIT09IDApIHtcbiAgICAgIHZhciB0bXAgPSB0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IHRtcC5jbXAob25lKSAhPT0gMDsgaSsrKSB7XG4gICAgICAgIHRtcCA9IHRtcC5yZWRTcXIoKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChpIDwgbSk7XG4gICAgICB2YXIgYiA9IHRoaXMucG93KGMsIG5ldyBCTigxKS5pdXNobG4obSAtIGkgLSAxKSk7XG5cbiAgICAgIHIgPSByLnJlZE11bChiKTtcbiAgICAgIGMgPSBiLnJlZFNxcigpO1xuICAgICAgdCA9IHQucmVkTXVsKGMpO1xuICAgICAgbSA9IGk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24gaW52bSAoYSkge1xuICAgIHZhciBpbnYgPSBhLl9pbnZtcCh0aGlzLm0pO1xuICAgIGlmIChpbnYubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIGludi5uZWdhdGl2ZSA9IDA7XG4gICAgICByZXR1cm4gdGhpcy5pbW9kKGludikucmVkTmVnKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmltb2QoaW52KTtcbiAgICB9XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5wb3cgPSBmdW5jdGlvbiBwb3cgKGEsIG51bSkge1xuICAgIGlmIChudW0uaXNaZXJvKCkpIHJldHVybiBuZXcgQk4oMSkudG9SZWQodGhpcyk7XG4gICAgaWYgKG51bS5jbXBuKDEpID09PSAwKSByZXR1cm4gYS5jbG9uZSgpO1xuXG4gICAgdmFyIHdpbmRvd1NpemUgPSA0O1xuICAgIHZhciB3bmQgPSBuZXcgQXJyYXkoMSA8PCB3aW5kb3dTaXplKTtcbiAgICB3bmRbMF0gPSBuZXcgQk4oMSkudG9SZWQodGhpcyk7XG4gICAgd25kWzFdID0gYTtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IHduZC5sZW5ndGg7IGkrKykge1xuICAgICAgd25kW2ldID0gdGhpcy5tdWwod25kW2kgLSAxXSwgYSk7XG4gICAgfVxuXG4gICAgdmFyIHJlcyA9IHduZFswXTtcbiAgICB2YXIgY3VycmVudCA9IDA7XG4gICAgdmFyIGN1cnJlbnRMZW4gPSAwO1xuICAgIHZhciBzdGFydCA9IG51bS5iaXRMZW5ndGgoKSAlIDI2O1xuICAgIGlmIChzdGFydCA9PT0gMCkge1xuICAgICAgc3RhcnQgPSAyNjtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBudW0ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciB3b3JkID0gbnVtLndvcmRzW2ldO1xuICAgICAgZm9yICh2YXIgaiA9IHN0YXJ0IC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgdmFyIGJpdCA9ICh3b3JkID4+IGopICYgMTtcbiAgICAgICAgaWYgKHJlcyAhPT0gd25kWzBdKSB7XG4gICAgICAgICAgcmVzID0gdGhpcy5zcXIocmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiaXQgPT09IDAgJiYgY3VycmVudCA9PT0gMCkge1xuICAgICAgICAgIGN1cnJlbnRMZW4gPSAwO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudCA8PD0gMTtcbiAgICAgICAgY3VycmVudCB8PSBiaXQ7XG4gICAgICAgIGN1cnJlbnRMZW4rKztcbiAgICAgICAgaWYgKGN1cnJlbnRMZW4gIT09IHdpbmRvd1NpemUgJiYgKGkgIT09IDAgfHwgaiAhPT0gMCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIHJlcyA9IHRoaXMubXVsKHJlcywgd25kW2N1cnJlbnRdKTtcbiAgICAgICAgY3VycmVudExlbiA9IDA7XG4gICAgICAgIGN1cnJlbnQgPSAwO1xuICAgICAgfVxuICAgICAgc3RhcnQgPSAyNjtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24gY29udmVydFRvIChudW0pIHtcbiAgICB2YXIgciA9IG51bS51bW9kKHRoaXMubSk7XG5cbiAgICByZXR1cm4gciA9PT0gbnVtID8gci5jbG9uZSgpIDogcjtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmNvbnZlcnRGcm9tID0gZnVuY3Rpb24gY29udmVydEZyb20gKG51bSkge1xuICAgIHZhciByZXMgPSBudW0uY2xvbmUoKTtcbiAgICByZXMucmVkID0gbnVsbDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vXG4gIC8vIE1vbnRnb21lcnkgbWV0aG9kIGVuZ2luZVxuICAvL1xuXG4gIEJOLm1vbnQgPSBmdW5jdGlvbiBtb250IChudW0pIHtcbiAgICByZXR1cm4gbmV3IE1vbnQobnVtKTtcbiAgfTtcblxuICBmdW5jdGlvbiBNb250IChtKSB7XG4gICAgUmVkLmNhbGwodGhpcywgbSk7XG5cbiAgICB0aGlzLnNoaWZ0ID0gdGhpcy5tLmJpdExlbmd0aCgpO1xuICAgIGlmICh0aGlzLnNoaWZ0ICUgMjYgIT09IDApIHtcbiAgICAgIHRoaXMuc2hpZnQgKz0gMjYgLSAodGhpcy5zaGlmdCAlIDI2KTtcbiAgICB9XG5cbiAgICB0aGlzLnIgPSBuZXcgQk4oMSkuaXVzaGxuKHRoaXMuc2hpZnQpO1xuICAgIHRoaXMucjIgPSB0aGlzLmltb2QodGhpcy5yLnNxcigpKTtcbiAgICB0aGlzLnJpbnYgPSB0aGlzLnIuX2ludm1wKHRoaXMubSk7XG5cbiAgICB0aGlzLm1pbnYgPSB0aGlzLnJpbnYubXVsKHRoaXMucikuaXN1Ym4oMSkuZGl2KHRoaXMubSk7XG4gICAgdGhpcy5taW52ID0gdGhpcy5taW52LnVtb2QodGhpcy5yKTtcbiAgICB0aGlzLm1pbnYgPSB0aGlzLnIuc3ViKHRoaXMubWludik7XG4gIH1cbiAgaW5oZXJpdHMoTW9udCwgUmVkKTtcblxuICBNb250LnByb3RvdHlwZS5jb252ZXJ0VG8gPSBmdW5jdGlvbiBjb252ZXJ0VG8gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmltb2QobnVtLnVzaGxuKHRoaXMuc2hpZnQpKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uIGNvbnZlcnRGcm9tIChudW0pIHtcbiAgICB2YXIgciA9IHRoaXMuaW1vZChudW0ubXVsKHRoaXMucmludikpO1xuICAgIHIucmVkID0gbnVsbDtcbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24gaW11bCAoYSwgYikge1xuICAgIGlmIChhLmlzWmVybygpIHx8IGIuaXNaZXJvKCkpIHtcbiAgICAgIGEud29yZHNbMF0gPSAwO1xuICAgICAgYS5sZW5ndGggPSAxO1xuICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgdmFyIHQgPSBhLmltdWwoYik7XG4gICAgdmFyIGMgPSB0Lm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKTtcbiAgICB2YXIgdSA9IHQuaXN1YihjKS5pdXNocm4odGhpcy5zaGlmdCk7XG4gICAgdmFyIHJlcyA9IHU7XG5cbiAgICBpZiAodS5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMgPSB1LmlzdWIodGhpcy5tKTtcbiAgICB9IGVsc2UgaWYgKHUuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcyA9IHUuaWFkZCh0aGlzLm0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIE1vbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bCAoYSwgYikge1xuICAgIGlmIChhLmlzWmVybygpIHx8IGIuaXNaZXJvKCkpIHJldHVybiBuZXcgQk4oMCkuX2ZvcmNlUmVkKHRoaXMpO1xuXG4gICAgdmFyIHQgPSBhLm11bChiKTtcbiAgICB2YXIgYyA9IHQubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pO1xuICAgIHZhciB1ID0gdC5pc3ViKGMpLml1c2hybih0aGlzLnNoaWZ0KTtcbiAgICB2YXIgcmVzID0gdTtcbiAgICBpZiAodS5jbXAodGhpcy5tKSA+PSAwKSB7XG4gICAgICByZXMgPSB1LmlzdWIodGhpcy5tKTtcbiAgICB9IGVsc2UgaWYgKHUuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcyA9IHUuaWFkZCh0aGlzLm0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIE1vbnQucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbiBpbnZtIChhKSB7XG4gICAgLy8gKEFSKV4tMSAqIFJeMiA9IChBXi0xICogUl4tMSkgKiBSXjIgPSBBXi0xICogUlxuICAgIHZhciByZXMgPSB0aGlzLmltb2QoYS5faW52bXAodGhpcy5tKS5tdWwodGhpcy5yMikpO1xuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xufSkodHlwZW9mIG1vZHVsZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbW9kdWxlLCB0aGlzKTtcbiIsCiAgICAiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICAgIH1cbiAgfVxufVxuIiwKICAgICJ0cnkge1xuICB2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKHR5cGVvZiB1dGlsLmluaGVyaXRzICE9PSAnZnVuY3Rpb24nKSB0aHJvdyAnJztcbiAgbW9kdWxlLmV4cG9ydHMgPSB1dGlsLmluaGVyaXRzO1xufSBjYXRjaCAoZSkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vaW5oZXJpdHNfYnJvd3Nlci5qcycpO1xufVxuIiwKICAgICIvKiBlc2xpbnQtZGlzYWJsZSBub2RlL25vLWRlcHJlY2F0ZWQtYXBpICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJylcbnZhciBCdWZmZXIgPSBidWZmZXIuQnVmZmVyXG5cbnZhciBzYWZlciA9IHt9XG5cbnZhciBrZXlcblxuZm9yIChrZXkgaW4gYnVmZmVyKSB7XG4gIGlmICghYnVmZmVyLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlXG4gIGlmIChrZXkgPT09ICdTbG93QnVmZmVyJyB8fCBrZXkgPT09ICdCdWZmZXInKSBjb250aW51ZVxuICBzYWZlcltrZXldID0gYnVmZmVyW2tleV1cbn1cblxudmFyIFNhZmVyID0gc2FmZXIuQnVmZmVyID0ge31cbmZvciAoa2V5IGluIEJ1ZmZlcikge1xuICBpZiAoIUJ1ZmZlci5oYXNPd25Qcm9wZXJ0eShrZXkpKSBjb250aW51ZVxuICBpZiAoa2V5ID09PSAnYWxsb2NVbnNhZmUnIHx8IGtleSA9PT0gJ2FsbG9jVW5zYWZlU2xvdycpIGNvbnRpbnVlXG4gIFNhZmVyW2tleV0gPSBCdWZmZXJba2V5XVxufVxuXG5zYWZlci5CdWZmZXIucHJvdG90eXBlID0gQnVmZmVyLnByb3RvdHlwZVxuXG5pZiAoIVNhZmVyLmZyb20gfHwgU2FmZXIuZnJvbSA9PT0gVWludDhBcnJheS5mcm9tKSB7XG4gIFNhZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgdmFsdWUpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiB2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIEJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG59XG5cbmlmICghU2FmZXIuYWxsb2MpIHtcbiAgU2FmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHNpemUpXG4gICAgfVxuICAgIGlmIChzaXplIDwgMCB8fCBzaXplID49IDIgKiAoMSA8PCAzMCkpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgc2l6ZSArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICAgIH1cbiAgICB2YXIgYnVmID0gQnVmZmVyKHNpemUpXG4gICAgaWYgKCFmaWxsIHx8IGZpbGwubGVuZ3RoID09PSAwKSB7XG4gICAgICBidWYuZmlsbCgwKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpXG4gICAgfVxuICAgIHJldHVybiBidWZcbiAgfVxufVxuXG5pZiAoIXNhZmVyLmtTdHJpbmdNYXhMZW5ndGgpIHtcbiAgdHJ5IHtcbiAgICBzYWZlci5rU3RyaW5nTWF4TGVuZ3RoID0gcHJvY2Vzcy5iaW5kaW5nKCdidWZmZXInKS5rU3RyaW5nTWF4TGVuZ3RoXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyB3ZSBjYW4ndCBkZXRlcm1pbmUga1N0cmluZ01heExlbmd0aCBpbiBlbnZpcm9ubWVudHMgd2hlcmUgcHJvY2Vzcy5iaW5kaW5nXG4gICAgLy8gaXMgdW5zdXBwb3J0ZWQsIHNvIGxldCdzIG5vdCBzZXQgaXRcbiAgfVxufVxuXG5pZiAoIXNhZmVyLmNvbnN0YW50cykge1xuICBzYWZlci5jb25zdGFudHMgPSB7XG4gICAgTUFYX0xFTkdUSDogc2FmZXIua01heExlbmd0aFxuICB9XG4gIGlmIChzYWZlci5rU3RyaW5nTWF4TGVuZ3RoKSB7XG4gICAgc2FmZXIuY29uc3RhbnRzLk1BWF9TVFJJTkdfTEVOR1RIID0gc2FmZXIua1N0cmluZ01heExlbmd0aFxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2FmZXJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmZ1bmN0aW9uIFJlcG9ydGVyKG9wdGlvbnMpIHtcbiAgdGhpcy5fcmVwb3J0ZXJTdGF0ZSA9IHtcbiAgICBvYmo6IG51bGwsXG4gICAgcGF0aDogW10sXG4gICAgb3B0aW9uczogb3B0aW9ucyB8fCB7fSxcbiAgICBlcnJvcnM6IFtdXG4gIH07XG59XG5leHBvcnRzLlJlcG9ydGVyID0gUmVwb3J0ZXI7XG5cblJlcG9ydGVyLnByb3RvdHlwZS5pc0Vycm9yID0gZnVuY3Rpb24gaXNFcnJvcihvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJlcG9ydGVyRXJyb3I7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uIHNhdmUoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICByZXR1cm4geyBvYmo6IHN0YXRlLm9iaiwgcGF0aExlbjogc3RhdGUucGF0aC5sZW5ndGggfTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5yZXN0b3JlID0gZnVuY3Rpb24gcmVzdG9yZShkYXRhKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBzdGF0ZS5vYmogPSBkYXRhLm9iajtcbiAgc3RhdGUucGF0aCA9IHN0YXRlLnBhdGguc2xpY2UoMCwgZGF0YS5wYXRoTGVuKTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5lbnRlcktleSA9IGZ1bmN0aW9uIGVudGVyS2V5KGtleSkge1xuICByZXR1cm4gdGhpcy5fcmVwb3J0ZXJTdGF0ZS5wYXRoLnB1c2goa2V5KTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5leGl0S2V5ID0gZnVuY3Rpb24gZXhpdEtleShpbmRleCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG5cbiAgc3RhdGUucGF0aCA9IHN0YXRlLnBhdGguc2xpY2UoMCwgaW5kZXggLSAxKTtcbn07XG5cblJlcG9ydGVyLnByb3RvdHlwZS5sZWF2ZUtleSA9IGZ1bmN0aW9uIGxlYXZlS2V5KGluZGV4LCBrZXksIHZhbHVlKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICB0aGlzLmV4aXRLZXkoaW5kZXgpO1xuICBpZiAoc3RhdGUub2JqICE9PSBudWxsKVxuICAgIHN0YXRlLm9ialtrZXldID0gdmFsdWU7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUucGF0aCA9IGZ1bmN0aW9uIHBhdGgoKSB7XG4gIHJldHVybiB0aGlzLl9yZXBvcnRlclN0YXRlLnBhdGguam9pbignLycpO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLmVudGVyT2JqZWN0ID0gZnVuY3Rpb24gZW50ZXJPYmplY3QoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBjb25zdCBwcmV2ID0gc3RhdGUub2JqO1xuICBzdGF0ZS5vYmogPSB7fTtcbiAgcmV0dXJuIHByZXY7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUubGVhdmVPYmplY3QgPSBmdW5jdGlvbiBsZWF2ZU9iamVjdChwcmV2KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICBjb25zdCBub3cgPSBzdGF0ZS5vYmo7XG4gIHN0YXRlLm9iaiA9IHByZXY7XG4gIHJldHVybiBub3c7XG59O1xuXG5SZXBvcnRlci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiBlcnJvcihtc2cpIHtcbiAgbGV0IGVycjtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZXBvcnRlclN0YXRlO1xuXG4gIGNvbnN0IGluaGVyaXRlZCA9IG1zZyBpbnN0YW5jZW9mIFJlcG9ydGVyRXJyb3I7XG4gIGlmIChpbmhlcml0ZWQpIHtcbiAgICBlcnIgPSBtc2c7XG4gIH0gZWxzZSB7XG4gICAgZXJyID0gbmV3IFJlcG9ydGVyRXJyb3Ioc3RhdGUucGF0aC5tYXAoZnVuY3Rpb24oZWxlbSkge1xuICAgICAgcmV0dXJuICdbJyArIEpTT04uc3RyaW5naWZ5KGVsZW0pICsgJ10nO1xuICAgIH0pLmpvaW4oJycpLCBtc2cubWVzc2FnZSB8fCBtc2csIG1zZy5zdGFjayk7XG4gIH1cblxuICBpZiAoIXN0YXRlLm9wdGlvbnMucGFydGlhbClcbiAgICB0aHJvdyBlcnI7XG5cbiAgaWYgKCFpbmhlcml0ZWQpXG4gICAgc3RhdGUuZXJyb3JzLnB1c2goZXJyKTtcblxuICByZXR1cm4gZXJyO1xufTtcblxuUmVwb3J0ZXIucHJvdG90eXBlLndyYXBSZXN1bHQgPSBmdW5jdGlvbiB3cmFwUmVzdWx0KHJlc3VsdCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlcG9ydGVyU3RhdGU7XG4gIGlmICghc3RhdGUub3B0aW9ucy5wYXJ0aWFsKVxuICAgIHJldHVybiByZXN1bHQ7XG5cbiAgcmV0dXJuIHtcbiAgICByZXN1bHQ6IHRoaXMuaXNFcnJvcihyZXN1bHQpID8gbnVsbCA6IHJlc3VsdCxcbiAgICBlcnJvcnM6IHN0YXRlLmVycm9yc1xuICB9O1xufTtcblxuZnVuY3Rpb24gUmVwb3J0ZXJFcnJvcihwYXRoLCBtc2cpIHtcbiAgdGhpcy5wYXRoID0gcGF0aDtcbiAgdGhpcy5yZXRocm93KG1zZyk7XG59XG5pbmhlcml0cyhSZXBvcnRlckVycm9yLCBFcnJvcik7XG5cblJlcG9ydGVyRXJyb3IucHJvdG90eXBlLnJldGhyb3cgPSBmdW5jdGlvbiByZXRocm93KG1zZykge1xuICB0aGlzLm1lc3NhZ2UgPSBtc2cgKyAnIGF0OiAnICsgKHRoaXMucGF0aCB8fCAnKHNoYWxsb3cpJyk7XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXBvcnRlckVycm9yKTtcblxuICBpZiAoIXRoaXMuc3RhY2spIHtcbiAgICB0cnkge1xuICAgICAgLy8gSUUgb25seSBhZGRzIHN0YWNrIHdoZW4gdGhyb3duXG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5tZXNzYWdlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLnN0YWNrID0gZS5zdGFjaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbmNvbnN0IFJlcG9ydGVyID0gcmVxdWlyZSgnLi4vYmFzZS9yZXBvcnRlcicpLlJlcG9ydGVyO1xuY29uc3QgQnVmZmVyID0gcmVxdWlyZSgnc2FmZXItYnVmZmVyJykuQnVmZmVyO1xuXG5mdW5jdGlvbiBEZWNvZGVyQnVmZmVyKGJhc2UsIG9wdGlvbnMpIHtcbiAgUmVwb3J0ZXIuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYmFzZSkpIHtcbiAgICB0aGlzLmVycm9yKCdJbnB1dCBub3QgQnVmZmVyJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5iYXNlID0gYmFzZTtcbiAgdGhpcy5vZmZzZXQgPSAwO1xuICB0aGlzLmxlbmd0aCA9IGJhc2UubGVuZ3RoO1xufVxuaW5oZXJpdHMoRGVjb2RlckJ1ZmZlciwgUmVwb3J0ZXIpO1xuZXhwb3J0cy5EZWNvZGVyQnVmZmVyID0gRGVjb2RlckJ1ZmZlcjtcblxuRGVjb2RlckJ1ZmZlci5pc0RlY29kZXJCdWZmZXIgPSBmdW5jdGlvbiBpc0RlY29kZXJCdWZmZXIoZGF0YSkge1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIERlY29kZXJCdWZmZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIE9yIGFjY2VwdCBjb21wYXRpYmxlIEFQSVxuICBjb25zdCBpc0NvbXBhdGlibGUgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICBCdWZmZXIuaXNCdWZmZXIoZGF0YS5iYXNlKSAmJlxuICAgIGRhdGEuY29uc3RydWN0b3IubmFtZSA9PT0gJ0RlY29kZXJCdWZmZXInICYmXG4gICAgdHlwZW9mIGRhdGEub2Zmc2V0ID09PSAnbnVtYmVyJyAmJlxuICAgIHR5cGVvZiBkYXRhLmxlbmd0aCA9PT0gJ251bWJlcicgJiZcbiAgICB0eXBlb2YgZGF0YS5zYXZlID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIGRhdGEucmVzdG9yZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBkYXRhLmlzRW1wdHkgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZGF0YS5yZWFkVUludDggPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgZGF0YS5za2lwID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIGRhdGEucmF3ID09PSAnZnVuY3Rpb24nO1xuXG4gIHJldHVybiBpc0NvbXBhdGlibGU7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24gc2F2ZSgpIHtcbiAgcmV0dXJuIHsgb2Zmc2V0OiB0aGlzLm9mZnNldCwgcmVwb3J0ZXI6IFJlcG9ydGVyLnByb3RvdHlwZS5zYXZlLmNhbGwodGhpcykgfTtcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnJlc3RvcmUgPSBmdW5jdGlvbiByZXN0b3JlKHNhdmUpIHtcbiAgLy8gUmV0dXJuIHNraXBwZWQgZGF0YVxuICBjb25zdCByZXMgPSBuZXcgRGVjb2RlckJ1ZmZlcih0aGlzLmJhc2UpO1xuICByZXMub2Zmc2V0ID0gc2F2ZS5vZmZzZXQ7XG4gIHJlcy5sZW5ndGggPSB0aGlzLm9mZnNldDtcblxuICB0aGlzLm9mZnNldCA9IHNhdmUub2Zmc2V0O1xuICBSZXBvcnRlci5wcm90b3R5cGUucmVzdG9yZS5jYWxsKHRoaXMsIHNhdmUucmVwb3J0ZXIpO1xuXG4gIHJldHVybiByZXM7XG59O1xuXG5EZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgcmV0dXJuIHRoaXMub2Zmc2V0ID09PSB0aGlzLmxlbmd0aDtcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OChmYWlsKSB7XG4gIGlmICh0aGlzLm9mZnNldCArIDEgPD0gdGhpcy5sZW5ndGgpXG4gICAgcmV0dXJuIHRoaXMuYmFzZS5yZWFkVUludDgodGhpcy5vZmZzZXQrKywgdHJ1ZSk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5lcnJvcihmYWlsIHx8ICdEZWNvZGVyQnVmZmVyIG92ZXJydW4nKTtcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbiBza2lwKGJ5dGVzLCBmYWlsKSB7XG4gIGlmICghKHRoaXMub2Zmc2V0ICsgYnl0ZXMgPD0gdGhpcy5sZW5ndGgpKVxuICAgIHJldHVybiB0aGlzLmVycm9yKGZhaWwgfHwgJ0RlY29kZXJCdWZmZXIgb3ZlcnJ1bicpO1xuXG4gIGNvbnN0IHJlcyA9IG5ldyBEZWNvZGVyQnVmZmVyKHRoaXMuYmFzZSk7XG5cbiAgLy8gU2hhcmUgcmVwb3J0ZXIgc3RhdGVcbiAgcmVzLl9yZXBvcnRlclN0YXRlID0gdGhpcy5fcmVwb3J0ZXJTdGF0ZTtcblxuICByZXMub2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gIHJlcy5sZW5ndGggPSB0aGlzLm9mZnNldCArIGJ5dGVzO1xuICB0aGlzLm9mZnNldCArPSBieXRlcztcbiAgcmV0dXJuIHJlcztcbn07XG5cbkRlY29kZXJCdWZmZXIucHJvdG90eXBlLnJhdyA9IGZ1bmN0aW9uIHJhdyhzYXZlKSB7XG4gIHJldHVybiB0aGlzLmJhc2Uuc2xpY2Uoc2F2ZSA/IHNhdmUub2Zmc2V0IDogdGhpcy5vZmZzZXQsIHRoaXMubGVuZ3RoKTtcbn07XG5cbmZ1bmN0aW9uIEVuY29kZXJCdWZmZXIodmFsdWUsIHJlcG9ydGVyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWUubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgIGlmICghRW5jb2RlckJ1ZmZlci5pc0VuY29kZXJCdWZmZXIoaXRlbSkpXG4gICAgICAgIGl0ZW0gPSBuZXcgRW5jb2RlckJ1ZmZlcihpdGVtLCByZXBvcnRlcik7XG4gICAgICB0aGlzLmxlbmd0aCArPSBpdGVtLmxlbmd0aDtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0sIHRoaXMpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoISgwIDw9IHZhbHVlICYmIHZhbHVlIDw9IDB4ZmYpKVxuICAgICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdub24tYnl0ZSBFbmNvZGVyQnVmZmVyIHZhbHVlJyk7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgodmFsdWUpO1xuICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5sZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdVbnN1cHBvcnRlZCB0eXBlOiAnICsgdHlwZW9mIHZhbHVlKTtcbiAgfVxufVxuZXhwb3J0cy5FbmNvZGVyQnVmZmVyID0gRW5jb2RlckJ1ZmZlcjtcblxuRW5jb2RlckJ1ZmZlci5pc0VuY29kZXJCdWZmZXIgPSBmdW5jdGlvbiBpc0VuY29kZXJCdWZmZXIoZGF0YSkge1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIEVuY29kZXJCdWZmZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIE9yIGFjY2VwdCBjb21wYXRpYmxlIEFQSVxuICBjb25zdCBpc0NvbXBhdGlibGUgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICBkYXRhLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdFbmNvZGVyQnVmZmVyJyAmJlxuICAgIHR5cGVvZiBkYXRhLmxlbmd0aCA9PT0gJ251bWJlcicgJiZcbiAgICB0eXBlb2YgZGF0YS5qb2luID09PSAnZnVuY3Rpb24nO1xuXG4gIHJldHVybiBpc0NvbXBhdGlibGU7XG59O1xuXG5FbmNvZGVyQnVmZmVyLnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gam9pbihvdXQsIG9mZnNldCkge1xuICBpZiAoIW91dClcbiAgICBvdXQgPSBCdWZmZXIuYWxsb2ModGhpcy5sZW5ndGgpO1xuICBpZiAoIW9mZnNldClcbiAgICBvZmZzZXQgPSAwO1xuXG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gb3V0O1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgdGhpcy52YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgIGl0ZW0uam9pbihvdXQsIG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gaXRlbS5sZW5ndGg7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnZhbHVlID09PSAnbnVtYmVyJylcbiAgICAgIG91dFtvZmZzZXRdID0gdGhpcy52YWx1ZTtcbiAgICBlbHNlIGlmICh0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ3N0cmluZycpXG4gICAgICBvdXQud3JpdGUodGhpcy52YWx1ZSwgb2Zmc2V0KTtcbiAgICBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIodGhpcy52YWx1ZSkpXG4gICAgICB0aGlzLnZhbHVlLmNvcHkob3V0LCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSB0aGlzLmxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59O1xuIiwKICAgICJtb2R1bGUuZXhwb3J0cyA9IGFzc2VydDtcblxuZnVuY3Rpb24gYXNzZXJ0KHZhbCwgbXNnKSB7XG4gIGlmICghdmFsKVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cgfHwgJ0Fzc2VydGlvbiBmYWlsZWQnKTtcbn1cblxuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gYXNzZXJ0RXF1YWwobCwgciwgbXNnKSB7XG4gIGlmIChsICE9IHIpXG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCAoJ0Fzc2VydGlvbiBmYWlsZWQ6ICcgKyBsICsgJyAhPSAnICsgcikpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBSZXBvcnRlciA9IHJlcXVpcmUoJy4uL2Jhc2UvcmVwb3J0ZXInKS5SZXBvcnRlcjtcbmNvbnN0IEVuY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuLi9iYXNlL2J1ZmZlcicpLkVuY29kZXJCdWZmZXI7XG5jb25zdCBEZWNvZGVyQnVmZmVyID0gcmVxdWlyZSgnLi4vYmFzZS9idWZmZXInKS5EZWNvZGVyQnVmZmVyO1xuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG4vLyBTdXBwb3J0ZWQgdGFnc1xuY29uc3QgdGFncyA9IFtcbiAgJ3NlcScsICdzZXFvZicsICdzZXQnLCAnc2V0b2YnLCAnb2JqaWQnLCAnYm9vbCcsXG4gICdnZW50aW1lJywgJ3V0Y3RpbWUnLCAnbnVsbF8nLCAnZW51bScsICdpbnQnLCAnb2JqRGVzYycsXG4gICdiaXRzdHInLCAnYm1wc3RyJywgJ2NoYXJzdHInLCAnZ2Vuc3RyJywgJ2dyYXBoc3RyJywgJ2lhNXN0cicsICdpc282NDZzdHInLFxuICAnbnVtc3RyJywgJ29jdHN0cicsICdwcmludHN0cicsICd0NjFzdHInLCAndW5pc3RyJywgJ3V0ZjhzdHInLCAndmlkZW9zdHInXG5dO1xuXG4vLyBQdWJsaWMgbWV0aG9kcyBsaXN0XG5jb25zdCBtZXRob2RzID0gW1xuICAna2V5JywgJ29iaicsICd1c2UnLCAnb3B0aW9uYWwnLCAnZXhwbGljaXQnLCAnaW1wbGljaXQnLCAnZGVmJywgJ2Nob2ljZScsXG4gICdhbnknLCAnY29udGFpbnMnXG5dLmNvbmNhdCh0YWdzKTtcblxuLy8gT3ZlcnJpZGVkIG1ldGhvZHMgbGlzdFxuY29uc3Qgb3ZlcnJpZGVkID0gW1xuICAnX3BlZWtUYWcnLCAnX2RlY29kZVRhZycsICdfdXNlJyxcbiAgJ19kZWNvZGVTdHInLCAnX2RlY29kZU9iamlkJywgJ19kZWNvZGVUaW1lJyxcbiAgJ19kZWNvZGVOdWxsJywgJ19kZWNvZGVJbnQnLCAnX2RlY29kZUJvb2wnLCAnX2RlY29kZUxpc3QnLFxuXG4gICdfZW5jb2RlQ29tcG9zaXRlJywgJ19lbmNvZGVTdHInLCAnX2VuY29kZU9iamlkJywgJ19lbmNvZGVUaW1lJyxcbiAgJ19lbmNvZGVOdWxsJywgJ19lbmNvZGVJbnQnLCAnX2VuY29kZUJvb2wnXG5dO1xuXG5mdW5jdGlvbiBOb2RlKGVuYywgcGFyZW50LCBuYW1lKSB7XG4gIGNvbnN0IHN0YXRlID0ge307XG4gIHRoaXMuX2Jhc2VTdGF0ZSA9IHN0YXRlO1xuXG4gIHN0YXRlLm5hbWUgPSBuYW1lO1xuICBzdGF0ZS5lbmMgPSBlbmM7XG5cbiAgc3RhdGUucGFyZW50ID0gcGFyZW50IHx8IG51bGw7XG4gIHN0YXRlLmNoaWxkcmVuID0gbnVsbDtcblxuICAvLyBTdGF0ZVxuICBzdGF0ZS50YWcgPSBudWxsO1xuICBzdGF0ZS5hcmdzID0gbnVsbDtcbiAgc3RhdGUucmV2ZXJzZUFyZ3MgPSBudWxsO1xuICBzdGF0ZS5jaG9pY2UgPSBudWxsO1xuICBzdGF0ZS5vcHRpb25hbCA9IGZhbHNlO1xuICBzdGF0ZS5hbnkgPSBmYWxzZTtcbiAgc3RhdGUub2JqID0gZmFsc2U7XG4gIHN0YXRlLnVzZSA9IG51bGw7XG4gIHN0YXRlLnVzZURlY29kZXIgPSBudWxsO1xuICBzdGF0ZS5rZXkgPSBudWxsO1xuICBzdGF0ZVsnZGVmYXVsdCddID0gbnVsbDtcbiAgc3RhdGUuZXhwbGljaXQgPSBudWxsO1xuICBzdGF0ZS5pbXBsaWNpdCA9IG51bGw7XG4gIHN0YXRlLmNvbnRhaW5zID0gbnVsbDtcblxuICAvLyBTaG91bGQgY3JlYXRlIG5ldyBpbnN0YW5jZSBvbiBlYWNoIG1ldGhvZFxuICBpZiAoIXN0YXRlLnBhcmVudCkge1xuICAgIHN0YXRlLmNoaWxkcmVuID0gW107XG4gICAgdGhpcy5fd3JhcCgpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IE5vZGU7XG5cbmNvbnN0IHN0YXRlUHJvcHMgPSBbXG4gICdlbmMnLCAncGFyZW50JywgJ2NoaWxkcmVuJywgJ3RhZycsICdhcmdzJywgJ3JldmVyc2VBcmdzJywgJ2Nob2ljZScsXG4gICdvcHRpb25hbCcsICdhbnknLCAnb2JqJywgJ3VzZScsICdhbHRlcmVkVXNlJywgJ2tleScsICdkZWZhdWx0JywgJ2V4cGxpY2l0JyxcbiAgJ2ltcGxpY2l0JywgJ2NvbnRhaW5zJ1xuXTtcblxuTm9kZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIGNvbnN0IGNzdGF0ZSA9IHt9O1xuICBzdGF0ZVByb3BzLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgIGNzdGF0ZVtwcm9wXSA9IHN0YXRlW3Byb3BdO1xuICB9KTtcbiAgY29uc3QgcmVzID0gbmV3IHRoaXMuY29uc3RydWN0b3IoY3N0YXRlLnBhcmVudCk7XG4gIHJlcy5fYmFzZVN0YXRlID0gY3N0YXRlO1xuICByZXR1cm4gcmVzO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX3dyYXAgPSBmdW5jdGlvbiB3cmFwKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgbWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgIHRoaXNbbWV0aG9kXSA9IGZ1bmN0aW9uIF93cmFwcGVkTWV0aG9kKCkge1xuICAgICAgY29uc3QgY2xvbmUgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKTtcbiAgICAgIHN0YXRlLmNoaWxkcmVuLnB1c2goY2xvbmUpO1xuICAgICAgcmV0dXJuIGNsb25lW21ldGhvZF0uYXBwbHkoY2xvbmUsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfSwgdGhpcyk7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIGluaXQoYm9keSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUucGFyZW50ID09PSBudWxsKTtcbiAgYm9keS5jYWxsKHRoaXMpO1xuXG4gIC8vIEZpbHRlciBjaGlsZHJlblxuICBzdGF0ZS5jaGlsZHJlbiA9IHN0YXRlLmNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbihjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZC5fYmFzZVN0YXRlLnBhcmVudCA9PT0gdGhpcztcbiAgfSwgdGhpcyk7XG4gIGFzc2VydC5lcXVhbChzdGF0ZS5jaGlsZHJlbi5sZW5ndGgsIDEsICdSb290IG5vZGUgY2FuIGhhdmUgb25seSBvbmUgY2hpbGQnKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl91c2VBcmdzID0gZnVuY3Rpb24gdXNlQXJncyhhcmdzKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIC8vIEZpbHRlciBjaGlsZHJlbiBhbmQgYXJnc1xuICBjb25zdCBjaGlsZHJlbiA9IGFyZ3MuZmlsdGVyKGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBhcmcgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yO1xuICB9LCB0aGlzKTtcbiAgYXJncyA9IGFyZ3MuZmlsdGVyKGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiAhKGFyZyBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IpO1xuICB9LCB0aGlzKTtcblxuICBpZiAoY2hpbGRyZW4ubGVuZ3RoICE9PSAwKSB7XG4gICAgYXNzZXJ0KHN0YXRlLmNoaWxkcmVuID09PSBudWxsKTtcbiAgICBzdGF0ZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgLy8gUmVwbGFjZSBwYXJlbnQgdG8gbWFpbnRhaW4gYmFja3dhcmQgbGlua1xuICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLl9iYXNlU3RhdGUucGFyZW50ID0gdGhpcztcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBpZiAoYXJncy5sZW5ndGggIT09IDApIHtcbiAgICBhc3NlcnQoc3RhdGUuYXJncyA9PT0gbnVsbCk7XG4gICAgc3RhdGUuYXJncyA9IGFyZ3M7XG4gICAgc3RhdGUucmV2ZXJzZUFyZ3MgPSBhcmdzLm1hcChmdW5jdGlvbihhcmcpIHtcbiAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAnb2JqZWN0JyB8fCBhcmcuY29uc3RydWN0b3IgIT09IE9iamVjdClcbiAgICAgICAgcmV0dXJuIGFyZztcblxuICAgICAgY29uc3QgcmVzID0ge307XG4gICAgICBPYmplY3Qua2V5cyhhcmcpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT0gKGtleSB8IDApKVxuICAgICAgICAgIGtleSB8PSAwO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZ1trZXldO1xuICAgICAgICByZXNbdmFsdWVdID0ga2V5O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICB9XG59O1xuXG4vL1xuLy8gT3ZlcnJpZGVkIG1ldGhvZHNcbi8vXG5cbm92ZXJyaWRlZC5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICBOb2RlLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gX292ZXJyaWRlZCgpIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWV0aG9kICsgJyBub3QgaW1wbGVtZW50ZWQgZm9yIGVuY29kaW5nOiAnICsgc3RhdGUuZW5jKTtcbiAgfTtcbn0pO1xuXG4vL1xuLy8gUHVibGljIG1ldGhvZHNcbi8vXG5cbnRhZ3MuZm9yRWFjaChmdW5jdGlvbih0YWcpIHtcbiAgTm9kZS5wcm90b3R5cGVbdGFnXSA9IGZ1bmN0aW9uIF90YWdNZXRob2QoKSB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgICBhc3NlcnQoc3RhdGUudGFnID09PSBudWxsKTtcbiAgICBzdGF0ZS50YWcgPSB0YWc7XG5cbiAgICB0aGlzLl91c2VBcmdzKGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59KTtcblxuTm9kZS5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gdXNlKGl0ZW0pIHtcbiAgYXNzZXJ0KGl0ZW0pO1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUudXNlID09PSBudWxsKTtcbiAgc3RhdGUudXNlID0gaXRlbTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLm9wdGlvbmFsID0gZnVuY3Rpb24gb3B0aW9uYWwoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIHN0YXRlLm9wdGlvbmFsID0gdHJ1ZTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmRlZiA9IGZ1bmN0aW9uIGRlZih2YWwpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlWydkZWZhdWx0J10gPT09IG51bGwpO1xuICBzdGF0ZVsnZGVmYXVsdCddID0gdmFsO1xuICBzdGF0ZS5vcHRpb25hbCA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5leHBsaWNpdCA9IGZ1bmN0aW9uIGV4cGxpY2l0KG51bSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUuZXhwbGljaXQgPT09IG51bGwgJiYgc3RhdGUuaW1wbGljaXQgPT09IG51bGwpO1xuICBzdGF0ZS5leHBsaWNpdCA9IG51bTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmltcGxpY2l0ID0gZnVuY3Rpb24gaW1wbGljaXQobnVtKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGFzc2VydChzdGF0ZS5leHBsaWNpdCA9PT0gbnVsbCAmJiBzdGF0ZS5pbXBsaWNpdCA9PT0gbnVsbCk7XG4gIHN0YXRlLmltcGxpY2l0ID0gbnVtO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTm9kZS5wcm90b3R5cGUub2JqID0gZnVuY3Rpb24gb2JqKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcbiAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cbiAgc3RhdGUub2JqID0gdHJ1ZTtcblxuICBpZiAoYXJncy5sZW5ndGggIT09IDApXG4gICAgdGhpcy5fdXNlQXJncyhhcmdzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmtleSA9IGZ1bmN0aW9uIGtleShuZXdLZXkpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLmtleSA9PT0gbnVsbCk7XG4gIHN0YXRlLmtleSA9IG5ld0tleTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmFueSA9IGZ1bmN0aW9uIGFueSgpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgc3RhdGUuYW55ID0gdHJ1ZTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmNob2ljZSA9IGZ1bmN0aW9uIGNob2ljZShvYmopIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG5cbiAgYXNzZXJ0KHN0YXRlLmNob2ljZSA9PT0gbnVsbCk7XG4gIHN0YXRlLmNob2ljZSA9IG9iajtcbiAgdGhpcy5fdXNlQXJncyhPYmplY3Qua2V5cyhvYmopLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH0pKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk5vZGUucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gY29udGFpbnMoaXRlbSkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICBhc3NlcnQoc3RhdGUudXNlID09PSBudWxsKTtcbiAgc3RhdGUuY29udGFpbnMgPSBpdGVtO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy9cbi8vIERlY29kaW5nXG4vL1xuXG5Ob2RlLnByb3RvdHlwZS5fZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGlucHV0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIC8vIERlY29kZSByb290IG5vZGVcbiAgaWYgKHN0YXRlLnBhcmVudCA9PT0gbnVsbClcbiAgICByZXR1cm4gaW5wdXQud3JhcFJlc3VsdChzdGF0ZS5jaGlsZHJlblswXS5fZGVjb2RlKGlucHV0LCBvcHRpb25zKSk7XG5cbiAgbGV0IHJlc3VsdCA9IHN0YXRlWydkZWZhdWx0J107XG4gIGxldCBwcmVzZW50ID0gdHJ1ZTtcblxuICBsZXQgcHJldktleSA9IG51bGw7XG4gIGlmIChzdGF0ZS5rZXkgIT09IG51bGwpXG4gICAgcHJldktleSA9IGlucHV0LmVudGVyS2V5KHN0YXRlLmtleSk7XG5cbiAgLy8gQ2hlY2sgaWYgdGFnIGlzIHRoZXJlXG4gIGlmIChzdGF0ZS5vcHRpb25hbCkge1xuICAgIGxldCB0YWcgPSBudWxsO1xuICAgIGlmIChzdGF0ZS5leHBsaWNpdCAhPT0gbnVsbClcbiAgICAgIHRhZyA9IHN0YXRlLmV4cGxpY2l0O1xuICAgIGVsc2UgaWYgKHN0YXRlLmltcGxpY2l0ICE9PSBudWxsKVxuICAgICAgdGFnID0gc3RhdGUuaW1wbGljaXQ7XG4gICAgZWxzZSBpZiAoc3RhdGUudGFnICE9PSBudWxsKVxuICAgICAgdGFnID0gc3RhdGUudGFnO1xuXG4gICAgaWYgKHRhZyA9PT0gbnVsbCAmJiAhc3RhdGUuYW55KSB7XG4gICAgICAvLyBUcmlhbCBhbmQgRXJyb3JcbiAgICAgIGNvbnN0IHNhdmUgPSBpbnB1dC5zYXZlKCk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoc3RhdGUuY2hvaWNlID09PSBudWxsKVxuICAgICAgICAgIHRoaXMuX2RlY29kZUdlbmVyaWMoc3RhdGUudGFnLCBpbnB1dCwgb3B0aW9ucyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aGlzLl9kZWNvZGVDaG9pY2UoaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgICBwcmVzZW50ID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcHJlc2VudCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaW5wdXQucmVzdG9yZShzYXZlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlc2VudCA9IHRoaXMuX3BlZWtUYWcoaW5wdXQsIHRhZywgc3RhdGUuYW55KTtcblxuICAgICAgaWYgKGlucHV0LmlzRXJyb3IocHJlc2VudCkpXG4gICAgICAgIHJldHVybiBwcmVzZW50O1xuICAgIH1cbiAgfVxuXG4gIC8vIFB1c2ggb2JqZWN0IG9uIHN0YWNrXG4gIGxldCBwcmV2T2JqO1xuICBpZiAoc3RhdGUub2JqICYmIHByZXNlbnQpXG4gICAgcHJldk9iaiA9IGlucHV0LmVudGVyT2JqZWN0KCk7XG5cbiAgaWYgKHByZXNlbnQpIHtcbiAgICAvLyBVbndyYXAgZXhwbGljaXQgdmFsdWVzXG4gICAgaWYgKHN0YXRlLmV4cGxpY2l0ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBleHBsaWNpdCA9IHRoaXMuX2RlY29kZVRhZyhpbnB1dCwgc3RhdGUuZXhwbGljaXQpO1xuICAgICAgaWYgKGlucHV0LmlzRXJyb3IoZXhwbGljaXQpKVxuICAgICAgICByZXR1cm4gZXhwbGljaXQ7XG4gICAgICBpbnB1dCA9IGV4cGxpY2l0O1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gaW5wdXQub2Zmc2V0O1xuXG4gICAgLy8gVW53cmFwIGltcGxpY2l0IGFuZCBub3JtYWwgdmFsdWVzXG4gICAgaWYgKHN0YXRlLnVzZSA9PT0gbnVsbCAmJiBzdGF0ZS5jaG9pY2UgPT09IG51bGwpIHtcbiAgICAgIGxldCBzYXZlO1xuICAgICAgaWYgKHN0YXRlLmFueSlcbiAgICAgICAgc2F2ZSA9IGlucHV0LnNhdmUoKTtcbiAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLl9kZWNvZGVUYWcoXG4gICAgICAgIGlucHV0LFxuICAgICAgICBzdGF0ZS5pbXBsaWNpdCAhPT0gbnVsbCA/IHN0YXRlLmltcGxpY2l0IDogc3RhdGUudGFnLFxuICAgICAgICBzdGF0ZS5hbnlcbiAgICAgICk7XG4gICAgICBpZiAoaW5wdXQuaXNFcnJvcihib2R5KSlcbiAgICAgICAgcmV0dXJuIGJvZHk7XG5cbiAgICAgIGlmIChzdGF0ZS5hbnkpXG4gICAgICAgIHJlc3VsdCA9IGlucHV0LnJhdyhzYXZlKTtcbiAgICAgIGVsc2VcbiAgICAgICAgaW5wdXQgPSBib2R5O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudHJhY2sgJiYgc3RhdGUudGFnICE9PSBudWxsKVxuICAgICAgb3B0aW9ucy50cmFjayhpbnB1dC5wYXRoKCksIHN0YXJ0LCBpbnB1dC5sZW5ndGgsICd0YWdnZWQnKTtcblxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudHJhY2sgJiYgc3RhdGUudGFnICE9PSBudWxsKVxuICAgICAgb3B0aW9ucy50cmFjayhpbnB1dC5wYXRoKCksIGlucHV0Lm9mZnNldCwgaW5wdXQubGVuZ3RoLCAnY29udGVudCcpO1xuXG4gICAgLy8gU2VsZWN0IHByb3BlciBtZXRob2QgZm9yIHRhZ1xuICAgIGlmIChzdGF0ZS5hbnkpIHtcbiAgICAgIC8vIG5vLW9wXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5jaG9pY2UgPT09IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2RlY29kZUdlbmVyaWMoc3RhdGUudGFnLCBpbnB1dCwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2RlY29kZUNob2ljZShpbnB1dCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0LmlzRXJyb3IocmVzdWx0KSlcbiAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAvLyBEZWNvZGUgY2hpbGRyZW5cbiAgICBpZiAoIXN0YXRlLmFueSAmJiBzdGF0ZS5jaG9pY2UgPT09IG51bGwgJiYgc3RhdGUuY2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgIHN0YXRlLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gZGVjb2RlQ2hpbGRyZW4oY2hpbGQpIHtcbiAgICAgICAgLy8gTk9URTogV2UgYXJlIGlnbm9yaW5nIGVycm9ycyBoZXJlLCB0byBsZXQgcGFyc2VyIGNvbnRpbnVlIHdpdGggb3RoZXJcbiAgICAgICAgLy8gcGFydHMgb2YgZW5jb2RlZCBkYXRhXG4gICAgICAgIGNoaWxkLl9kZWNvZGUoaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRGVjb2RlIGNvbnRhaW5lZC9lbmNvZGVkIGJ5IHNjaGVtYSwgb25seSBpbiBiaXQgb3Igb2N0ZXQgc3RyaW5nc1xuICAgIGlmIChzdGF0ZS5jb250YWlucyAmJiAoc3RhdGUudGFnID09PSAnb2N0c3RyJyB8fCBzdGF0ZS50YWcgPT09ICdiaXRzdHInKSkge1xuICAgICAgY29uc3QgZGF0YSA9IG5ldyBEZWNvZGVyQnVmZmVyKHJlc3VsdCk7XG4gICAgICByZXN1bHQgPSB0aGlzLl9nZXRVc2Uoc3RhdGUuY29udGFpbnMsIGlucHV0Ll9yZXBvcnRlclN0YXRlLm9iailcbiAgICAgICAgLl9kZWNvZGUoZGF0YSwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLy8gUG9wIG9iamVjdFxuICBpZiAoc3RhdGUub2JqICYmIHByZXNlbnQpXG4gICAgcmVzdWx0ID0gaW5wdXQubGVhdmVPYmplY3QocHJldk9iaik7XG5cbiAgLy8gU2V0IGtleVxuICBpZiAoc3RhdGUua2V5ICE9PSBudWxsICYmIChyZXN1bHQgIT09IG51bGwgfHwgcHJlc2VudCA9PT0gdHJ1ZSkpXG4gICAgaW5wdXQubGVhdmVLZXkocHJldktleSwgc3RhdGUua2V5LCByZXN1bHQpO1xuICBlbHNlIGlmIChwcmV2S2V5ICE9PSBudWxsKVxuICAgIGlucHV0LmV4aXRLZXkocHJldktleSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9kZWNvZGVHZW5lcmljID0gZnVuY3Rpb24gZGVjb2RlR2VuZXJpYyh0YWcsIGlucHV0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGlmICh0YWcgPT09ICdzZXEnIHx8IHRhZyA9PT0gJ3NldCcpXG4gICAgcmV0dXJuIG51bGw7XG4gIGlmICh0YWcgPT09ICdzZXFvZicgfHwgdGFnID09PSAnc2V0b2YnKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVMaXN0KGlucHV0LCB0YWcsIHN0YXRlLmFyZ3NbMF0sIG9wdGlvbnMpO1xuICBlbHNlIGlmICgvc3RyJC8udGVzdCh0YWcpKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVTdHIoaW5wdXQsIHRhZywgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJyAmJiBzdGF0ZS5hcmdzKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVPYmppZChpbnB1dCwgc3RhdGUuYXJnc1swXSwgc3RhdGUuYXJnc1sxXSwgb3B0aW9ucyk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iamlkJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlT2JqaWQoaW5wdXQsIG51bGwsIG51bGwsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdnZW50aW1lJyB8fCB0YWcgPT09ICd1dGN0aW1lJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlVGltZShpbnB1dCwgdGFnLCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnbnVsbF8nKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVOdWxsKGlucHV0LCBvcHRpb25zKTtcbiAgZWxzZSBpZiAodGFnID09PSAnYm9vbCcpXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZUJvb2woaW5wdXQsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdvYmpEZXNjJylcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlU3RyKGlucHV0LCB0YWcsIG9wdGlvbnMpO1xuICBlbHNlIGlmICh0YWcgPT09ICdpbnQnIHx8IHRhZyA9PT0gJ2VudW0nKVxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVJbnQoaW5wdXQsIHN0YXRlLmFyZ3MgJiYgc3RhdGUuYXJnc1swXSwgb3B0aW9ucyk7XG5cbiAgaWYgKHN0YXRlLnVzZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRVc2Uoc3RhdGUudXNlLCBpbnB1dC5fcmVwb3J0ZXJTdGF0ZS5vYmopXG4gICAgICAuX2RlY29kZShpbnB1dCwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGlucHV0LmVycm9yKCd1bmtub3duIHRhZzogJyArIHRhZyk7XG4gIH1cbn07XG5cbk5vZGUucHJvdG90eXBlLl9nZXRVc2UgPSBmdW5jdGlvbiBfZ2V0VXNlKGVudGl0eSwgb2JqKSB7XG5cbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIC8vIENyZWF0ZSBhbHRlcmVkIHVzZSBkZWNvZGVyIGlmIGltcGxpY2l0IGlzIHNldFxuICBzdGF0ZS51c2VEZWNvZGVyID0gdGhpcy5fdXNlKGVudGl0eSwgb2JqKTtcbiAgYXNzZXJ0KHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5wYXJlbnQgPT09IG51bGwpO1xuICBzdGF0ZS51c2VEZWNvZGVyID0gc3RhdGUudXNlRGVjb2Rlci5fYmFzZVN0YXRlLmNoaWxkcmVuWzBdO1xuICBpZiAoc3RhdGUuaW1wbGljaXQgIT09IHN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5pbXBsaWNpdCkge1xuICAgIHN0YXRlLnVzZURlY29kZXIgPSBzdGF0ZS51c2VEZWNvZGVyLmNsb25lKCk7XG4gICAgc3RhdGUudXNlRGVjb2Rlci5fYmFzZVN0YXRlLmltcGxpY2l0ID0gc3RhdGUuaW1wbGljaXQ7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLnVzZURlY29kZXI7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZGVjb2RlQ2hvaWNlID0gZnVuY3Rpb24gZGVjb2RlQ2hvaWNlKGlucHV0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgbGV0IG1hdGNoID0gZmFsc2U7XG5cbiAgT2JqZWN0LmtleXMoc3RhdGUuY2hvaWNlKS5zb21lKGZ1bmN0aW9uKGtleSkge1xuICAgIGNvbnN0IHNhdmUgPSBpbnB1dC5zYXZlKCk7XG4gICAgY29uc3Qgbm9kZSA9IHN0YXRlLmNob2ljZVtrZXldO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG5vZGUuX2RlY29kZShpbnB1dCwgb3B0aW9ucyk7XG4gICAgICBpZiAoaW5wdXQuaXNFcnJvcih2YWx1ZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgcmVzdWx0ID0geyB0eXBlOiBrZXksIHZhbHVlOiB2YWx1ZSB9O1xuICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlucHV0LnJlc3RvcmUoc2F2ZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LCB0aGlzKTtcblxuICBpZiAoIW1hdGNoKVxuICAgIHJldHVybiBpbnB1dC5lcnJvcignQ2hvaWNlIG5vdCBtYXRjaGVkJyk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vXG4vLyBFbmNvZGluZ1xuLy9cblxuTm9kZS5wcm90b3R5cGUuX2NyZWF0ZUVuY29kZXJCdWZmZXIgPSBmdW5jdGlvbiBjcmVhdGVFbmNvZGVyQnVmZmVyKGRhdGEpIHtcbiAgcmV0dXJuIG5ldyBFbmNvZGVyQnVmZmVyKGRhdGEsIHRoaXMucmVwb3J0ZXIpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2VuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCByZXBvcnRlciwgcGFyZW50KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuICBpZiAoc3RhdGVbJ2RlZmF1bHQnXSAhPT0gbnVsbCAmJiBzdGF0ZVsnZGVmYXVsdCddID09PSBkYXRhKVxuICAgIHJldHVybjtcblxuICBjb25zdCByZXN1bHQgPSB0aGlzLl9lbmNvZGVWYWx1ZShkYXRhLCByZXBvcnRlciwgcGFyZW50KTtcbiAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybjtcblxuICBpZiAodGhpcy5fc2tpcERlZmF1bHQocmVzdWx0LCByZXBvcnRlciwgcGFyZW50KSlcbiAgICByZXR1cm47XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9lbmNvZGVWYWx1ZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCByZXBvcnRlciwgcGFyZW50KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIC8vIERlY29kZSByb290IG5vZGVcbiAgaWYgKHN0YXRlLnBhcmVudCA9PT0gbnVsbClcbiAgICByZXR1cm4gc3RhdGUuY2hpbGRyZW5bMF0uX2VuY29kZShkYXRhLCByZXBvcnRlciB8fCBuZXcgUmVwb3J0ZXIoKSk7XG5cbiAgbGV0IHJlc3VsdCA9IG51bGw7XG5cbiAgLy8gU2V0IHJlcG9ydGVyIHRvIHNoYXJlIGl0IHdpdGggYSBjaGlsZCBjbGFzc1xuICB0aGlzLnJlcG9ydGVyID0gcmVwb3J0ZXI7XG5cbiAgLy8gQ2hlY2sgaWYgZGF0YSBpcyB0aGVyZVxuICBpZiAoc3RhdGUub3B0aW9uYWwgJiYgZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHN0YXRlWydkZWZhdWx0J10gIT09IG51bGwpXG4gICAgICBkYXRhID0gc3RhdGVbJ2RlZmF1bHQnXTtcbiAgICBlbHNlXG4gICAgICByZXR1cm47XG4gIH1cblxuICAvLyBFbmNvZGUgY2hpbGRyZW4gZmlyc3RcbiAgbGV0IGNvbnRlbnQgPSBudWxsO1xuICBsZXQgcHJpbWl0aXZlID0gZmFsc2U7XG4gIGlmIChzdGF0ZS5hbnkpIHtcbiAgICAvLyBBbnl0aGluZyB0aGF0IHdhcyBnaXZlbiBpcyB0cmFuc2xhdGVkIHRvIGJ1ZmZlclxuICAgIHJlc3VsdCA9IHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoZGF0YSk7XG4gIH0gZWxzZSBpZiAoc3RhdGUuY2hvaWNlKSB7XG4gICAgcmVzdWx0ID0gdGhpcy5fZW5jb2RlQ2hvaWNlKGRhdGEsIHJlcG9ydGVyKTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5jb250YWlucykge1xuICAgIGNvbnRlbnQgPSB0aGlzLl9nZXRVc2Uoc3RhdGUuY29udGFpbnMsIHBhcmVudCkuX2VuY29kZShkYXRhLCByZXBvcnRlcik7XG4gICAgcHJpbWl0aXZlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5jaGlsZHJlbikge1xuICAgIGNvbnRlbnQgPSBzdGF0ZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZC5fYmFzZVN0YXRlLnRhZyA9PT0gJ251bGxfJylcbiAgICAgICAgcmV0dXJuIGNoaWxkLl9lbmNvZGUobnVsbCwgcmVwb3J0ZXIsIGRhdGEpO1xuXG4gICAgICBpZiAoY2hpbGQuX2Jhc2VTdGF0ZS5rZXkgPT09IG51bGwpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignQ2hpbGQgc2hvdWxkIGhhdmUgYSBrZXknKTtcbiAgICAgIGNvbnN0IHByZXZLZXkgPSByZXBvcnRlci5lbnRlcktleShjaGlsZC5fYmFzZVN0YXRlLmtleSk7XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignQ2hpbGQgZXhwZWN0ZWQsIGJ1dCBpbnB1dCBpcyBub3Qgb2JqZWN0Jyk7XG5cbiAgICAgIGNvbnN0IHJlcyA9IGNoaWxkLl9lbmNvZGUoZGF0YVtjaGlsZC5fYmFzZVN0YXRlLmtleV0sIHJlcG9ydGVyLCBkYXRhKTtcbiAgICAgIHJlcG9ydGVyLmxlYXZlS2V5KHByZXZLZXkpO1xuXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0sIHRoaXMpLmZpbHRlcihmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH0pO1xuICAgIGNvbnRlbnQgPSB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGNvbnRlbnQpO1xuICB9IGVsc2Uge1xuICAgIGlmIChzdGF0ZS50YWcgPT09ICdzZXFvZicgfHwgc3RhdGUudGFnID09PSAnc2V0b2YnKSB7XG4gICAgICAvLyBUT0RPKGluZHV0bnkpOiB0aGlzIHNob3VsZCBiZSB0aHJvd24gb24gRFNMIGxldmVsXG4gICAgICBpZiAoIShzdGF0ZS5hcmdzICYmIHN0YXRlLmFyZ3MubGVuZ3RoID09PSAxKSlcbiAgICAgICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdUb28gbWFueSBhcmdzIGZvciA6ICcgKyBzdGF0ZS50YWcpO1xuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpXG4gICAgICAgIHJldHVybiByZXBvcnRlci5lcnJvcignc2Vxb2Yvc2V0b2YsIGJ1dCBkYXRhIGlzIG5vdCBBcnJheScpO1xuXG4gICAgICBjb25zdCBjaGlsZCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgIGNoaWxkLl9iYXNlU3RhdGUuaW1wbGljaXQgPSBudWxsO1xuICAgICAgY29udGVudCA9IHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoZGF0YS5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2Jhc2VTdGF0ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0VXNlKHN0YXRlLmFyZ3NbMF0sIGRhdGEpLl9lbmNvZGUoaXRlbSwgcmVwb3J0ZXIpO1xuICAgICAgfSwgY2hpbGQpKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLnVzZSAhPT0gbnVsbCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5fZ2V0VXNlKHN0YXRlLnVzZSwgcGFyZW50KS5fZW5jb2RlKGRhdGEsIHJlcG9ydGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudCA9IHRoaXMuX2VuY29kZVByaW1pdGl2ZShzdGF0ZS50YWcsIGRhdGEpO1xuICAgICAgcHJpbWl0aXZlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBFbmNvZGUgZGF0YSBpdHNlbGZcbiAgaWYgKCFzdGF0ZS5hbnkgJiYgc3RhdGUuY2hvaWNlID09PSBudWxsKSB7XG4gICAgY29uc3QgdGFnID0gc3RhdGUuaW1wbGljaXQgIT09IG51bGwgPyBzdGF0ZS5pbXBsaWNpdCA6IHN0YXRlLnRhZztcbiAgICBjb25zdCBjbHMgPSBzdGF0ZS5pbXBsaWNpdCA9PT0gbnVsbCA/ICd1bml2ZXJzYWwnIDogJ2NvbnRleHQnO1xuXG4gICAgaWYgKHRhZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKHN0YXRlLnVzZSA9PT0gbnVsbClcbiAgICAgICAgcmVwb3J0ZXIuZXJyb3IoJ1RhZyBjb3VsZCBiZSBvbWl0dGVkIG9ubHkgZm9yIC51c2UoKScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdGUudXNlID09PSBudWxsKVxuICAgICAgICByZXN1bHQgPSB0aGlzLl9lbmNvZGVDb21wb3NpdGUodGFnLCBwcmltaXRpdmUsIGNscywgY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgLy8gV3JhcCBpbiBleHBsaWNpdFxuICBpZiAoc3RhdGUuZXhwbGljaXQgIT09IG51bGwpXG4gICAgcmVzdWx0ID0gdGhpcy5fZW5jb2RlQ29tcG9zaXRlKHN0YXRlLmV4cGxpY2l0LCBmYWxzZSwgJ2NvbnRleHQnLCByZXN1bHQpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5fZW5jb2RlQ2hvaWNlID0gZnVuY3Rpb24gZW5jb2RlQ2hvaWNlKGRhdGEsIHJlcG9ydGVyKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGNvbnN0IG5vZGUgPSBzdGF0ZS5jaG9pY2VbZGF0YS50eXBlXTtcbiAgaWYgKCFub2RlKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgZmFsc2UsXG4gICAgICBkYXRhLnR5cGUgKyAnIG5vdCBmb3VuZCBpbiAnICtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHN0YXRlLmNob2ljZSkpKTtcbiAgfVxuICByZXR1cm4gbm9kZS5fZW5jb2RlKGRhdGEudmFsdWUsIHJlcG9ydGVyKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9lbmNvZGVQcmltaXRpdmUgPSBmdW5jdGlvbiBlbmNvZGVQcmltaXRpdmUodGFnLCBkYXRhKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fYmFzZVN0YXRlO1xuXG4gIGlmICgvc3RyJC8udGVzdCh0YWcpKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVTdHIoZGF0YSwgdGFnKTtcbiAgZWxzZSBpZiAodGFnID09PSAnb2JqaWQnICYmIHN0YXRlLmFyZ3MpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZU9iamlkKGRhdGEsIHN0YXRlLnJldmVyc2VBcmdzWzBdLCBzdGF0ZS5hcmdzWzFdKTtcbiAgZWxzZSBpZiAodGFnID09PSAnb2JqaWQnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVPYmppZChkYXRhLCBudWxsLCBudWxsKTtcbiAgZWxzZSBpZiAodGFnID09PSAnZ2VudGltZScgfHwgdGFnID09PSAndXRjdGltZScpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZVRpbWUoZGF0YSwgdGFnKTtcbiAgZWxzZSBpZiAodGFnID09PSAnbnVsbF8nKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVOdWxsKCk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ2ludCcgfHwgdGFnID09PSAnZW51bScpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZUludChkYXRhLCBzdGF0ZS5hcmdzICYmIHN0YXRlLnJldmVyc2VBcmdzWzBdKTtcbiAgZWxzZSBpZiAodGFnID09PSAnYm9vbCcpXG4gICAgcmV0dXJuIHRoaXMuX2VuY29kZUJvb2woZGF0YSk7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ29iakRlc2MnKVxuICAgIHJldHVybiB0aGlzLl9lbmNvZGVTdHIoZGF0YSwgdGFnKTtcbiAgZWxzZVxuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdGFnOiAnICsgdGFnKTtcbn07XG5cbk5vZGUucHJvdG90eXBlLl9pc051bXN0ciA9IGZ1bmN0aW9uIGlzTnVtc3RyKHN0cikge1xuICByZXR1cm4gL15bMC05IF0qJC8udGVzdChzdHIpO1xufTtcblxuTm9kZS5wcm90b3R5cGUuX2lzUHJpbnRzdHIgPSBmdW5jdGlvbiBpc1ByaW50c3RyKHN0cikge1xuICByZXR1cm4gL15bQS1aYS16MC05ICcoKSssLS4vOj0/XSokLy50ZXN0KHN0cik7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbi8vIEhlbHBlclxuZnVuY3Rpb24gcmV2ZXJzZShtYXApIHtcbiAgY29uc3QgcmVzID0ge307XG5cbiAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIC8vIENvbnZlcnQga2V5IHRvIGludGVnZXIgaWYgaXQgaXMgc3RyaW5naWZpZWRcbiAgICBpZiAoKGtleSB8IDApID09IGtleSlcbiAgICAgIGtleSA9IGtleSB8IDA7XG5cbiAgICBjb25zdCB2YWx1ZSA9IG1hcFtrZXldO1xuICAgIHJlc1t2YWx1ZV0gPSBrZXk7XG4gIH0pO1xuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydHMudGFnQ2xhc3MgPSB7XG4gIDA6ICd1bml2ZXJzYWwnLFxuICAxOiAnYXBwbGljYXRpb24nLFxuICAyOiAnY29udGV4dCcsXG4gIDM6ICdwcml2YXRlJ1xufTtcbmV4cG9ydHMudGFnQ2xhc3NCeU5hbWUgPSByZXZlcnNlKGV4cG9ydHMudGFnQ2xhc3MpO1xuXG5leHBvcnRzLnRhZyA9IHtcbiAgMHgwMDogJ2VuZCcsXG4gIDB4MDE6ICdib29sJyxcbiAgMHgwMjogJ2ludCcsXG4gIDB4MDM6ICdiaXRzdHInLFxuICAweDA0OiAnb2N0c3RyJyxcbiAgMHgwNTogJ251bGxfJyxcbiAgMHgwNjogJ29iamlkJyxcbiAgMHgwNzogJ29iakRlc2MnLFxuICAweDA4OiAnZXh0ZXJuYWwnLFxuICAweDA5OiAncmVhbCcsXG4gIDB4MGE6ICdlbnVtJyxcbiAgMHgwYjogJ2VtYmVkJyxcbiAgMHgwYzogJ3V0ZjhzdHInLFxuICAweDBkOiAncmVsYXRpdmVPaWQnLFxuICAweDEwOiAnc2VxJyxcbiAgMHgxMTogJ3NldCcsXG4gIDB4MTI6ICdudW1zdHInLFxuICAweDEzOiAncHJpbnRzdHInLFxuICAweDE0OiAndDYxc3RyJyxcbiAgMHgxNTogJ3ZpZGVvc3RyJyxcbiAgMHgxNjogJ2lhNXN0cicsXG4gIDB4MTc6ICd1dGN0aW1lJyxcbiAgMHgxODogJ2dlbnRpbWUnLFxuICAweDE5OiAnZ3JhcGhzdHInLFxuICAweDFhOiAnaXNvNjQ2c3RyJyxcbiAgMHgxYjogJ2dlbnN0cicsXG4gIDB4MWM6ICd1bmlzdHInLFxuICAweDFkOiAnY2hhcnN0cicsXG4gIDB4MWU6ICdibXBzdHInXG59O1xuZXhwb3J0cy50YWdCeU5hbWUgPSByZXZlcnNlKGV4cG9ydHMudGFnKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5jb25zdCBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG5jb25zdCBOb2RlID0gcmVxdWlyZSgnLi4vYmFzZS9ub2RlJyk7XG5cbi8vIEltcG9ydCBERVIgY29uc3RhbnRzXG5jb25zdCBkZXIgPSByZXF1aXJlKCcuLi9jb25zdGFudHMvZGVyJyk7XG5cbmZ1bmN0aW9uIERFUkVuY29kZXIoZW50aXR5KSB7XG4gIHRoaXMuZW5jID0gJ2Rlcic7XG4gIHRoaXMubmFtZSA9IGVudGl0eS5uYW1lO1xuICB0aGlzLmVudGl0eSA9IGVudGl0eTtcblxuICAvLyBDb25zdHJ1Y3QgYmFzZSB0cmVlXG4gIHRoaXMudHJlZSA9IG5ldyBERVJOb2RlKCk7XG4gIHRoaXMudHJlZS5faW5pdChlbnRpdHkuYm9keSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IERFUkVuY29kZXI7XG5cbkRFUkVuY29kZXIucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCByZXBvcnRlcikge1xuICByZXR1cm4gdGhpcy50cmVlLl9lbmNvZGUoZGF0YSwgcmVwb3J0ZXIpLmpvaW4oKTtcbn07XG5cbi8vIFRyZWUgbWV0aG9kc1xuXG5mdW5jdGlvbiBERVJOb2RlKHBhcmVudCkge1xuICBOb2RlLmNhbGwodGhpcywgJ2RlcicsIHBhcmVudCk7XG59XG5pbmhlcml0cyhERVJOb2RlLCBOb2RlKTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZUNvbXBvc2l0ZSA9IGZ1bmN0aW9uIGVuY29kZUNvbXBvc2l0ZSh0YWcsXG4gIHByaW1pdGl2ZSxcbiAgY2xzLFxuICBjb250ZW50KSB7XG4gIGNvbnN0IGVuY29kZWRUYWcgPSBlbmNvZGVUYWcodGFnLCBwcmltaXRpdmUsIGNscywgdGhpcy5yZXBvcnRlcik7XG5cbiAgLy8gU2hvcnQgZm9ybVxuICBpZiAoY29udGVudC5sZW5ndGggPCAweDgwKSB7XG4gICAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIpO1xuICAgIGhlYWRlclswXSA9IGVuY29kZWRUYWc7XG4gICAgaGVhZGVyWzFdID0gY29udGVudC5sZW5ndGg7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoWyBoZWFkZXIsIGNvbnRlbnQgXSk7XG4gIH1cblxuICAvLyBMb25nIGZvcm1cbiAgLy8gQ291bnQgb2N0ZXRzIHJlcXVpcmVkIHRvIHN0b3JlIGxlbmd0aFxuICBsZXQgbGVuT2N0ZXRzID0gMTtcbiAgZm9yIChsZXQgaSA9IGNvbnRlbnQubGVuZ3RoOyBpID49IDB4MTAwOyBpID4+PSA4KVxuICAgIGxlbk9jdGV0cysrO1xuXG4gIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYygxICsgMSArIGxlbk9jdGV0cyk7XG4gIGhlYWRlclswXSA9IGVuY29kZWRUYWc7XG4gIGhlYWRlclsxXSA9IDB4ODAgfCBsZW5PY3RldHM7XG5cbiAgZm9yIChsZXQgaSA9IDEgKyBsZW5PY3RldHMsIGogPSBjb250ZW50Lmxlbmd0aDsgaiA+IDA7IGktLSwgaiA+Pj0gOClcbiAgICBoZWFkZXJbaV0gPSBqICYgMHhmZjtcblxuICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbIGhlYWRlciwgY29udGVudCBdKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVTdHIgPSBmdW5jdGlvbiBlbmNvZGVTdHIoc3RyLCB0YWcpIHtcbiAgaWYgKHRhZyA9PT0gJ2JpdHN0cicpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbIHN0ci51bnVzZWQgfCAwLCBzdHIuZGF0YSBdKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdibXBzdHInKSB7XG4gICAgY29uc3QgYnVmID0gQnVmZmVyLmFsbG9jKHN0ci5sZW5ndGggKiAyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgYnVmLndyaXRlVUludDE2QkUoc3RyLmNoYXJDb2RlQXQoaSksIGkgKiAyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoYnVmKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdudW1zdHInKSB7XG4gICAgaWYgKCF0aGlzLl9pc051bXN0cihzdHIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignRW5jb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IG51bXN0ciBzdXBwb3J0cyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbmx5IGRpZ2l0cyBhbmQgc3BhY2UnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoc3RyKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdwcmludHN0cicpIHtcbiAgICBpZiAoIXRoaXMuX2lzUHJpbnRzdHIoc3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ0VuY29kaW5nIG9mIHN0cmluZyB0eXBlOiBwcmludHN0ciBzdXBwb3J0cyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbmx5IGxhdGluIHVwcGVyIGFuZCBsb3dlciBjYXNlIGxldHRlcnMsICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpZ2l0cywgc3BhY2UsIGFwb3N0cm9waGUsIGxlZnQgYW5kIHJpZ3RoICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhcmVudGhlc2lzLCBwbHVzIHNpZ24sIGNvbW1hLCBoeXBoZW4sICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RvdCwgc2xhc2gsIGNvbG9uLCBlcXVhbCBzaWduLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxdWVzdGlvbiBtYXJrJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik7XG4gIH0gZWxzZSBpZiAoL3N0ciQvLnRlc3QodGFnKSkge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik7XG4gIH0gZWxzZSBpZiAodGFnID09PSAnb2JqRGVzYycpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzdHIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdFbmNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArIHRhZyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyB1bnN1cHBvcnRlZCcpO1xuICB9XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlT2JqaWQgPSBmdW5jdGlvbiBlbmNvZGVPYmppZChpZCwgdmFsdWVzLCByZWxhdGl2ZSkge1xuICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgIGlmICghdmFsdWVzKVxuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ3N0cmluZyBvYmppZCBnaXZlbiwgYnV0IG5vIHZhbHVlcyBtYXAgZm91bmQnKTtcbiAgICBpZiAoIXZhbHVlcy5oYXNPd25Qcm9wZXJ0eShpZCkpXG4gICAgICByZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcignb2JqaWQgbm90IGZvdW5kIGluIHZhbHVlcyBtYXAnKTtcbiAgICBpZCA9IHZhbHVlc1tpZF0uc3BsaXQoL1tcXHMuXSsvZyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZC5sZW5ndGg7IGkrKylcbiAgICAgIGlkW2ldIHw9IDA7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICBpZCA9IGlkLnNsaWNlKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZC5sZW5ndGg7IGkrKylcbiAgICAgIGlkW2ldIHw9IDA7XG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkoaWQpKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ29iamlkKCkgc2hvdWxkIGJlIGVpdGhlciBhcnJheSBvciBzdHJpbmcsICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnb3Q6ICcgKyBKU09OLnN0cmluZ2lmeShpZCkpO1xuICB9XG5cbiAgaWYgKCFyZWxhdGl2ZSkge1xuICAgIGlmIChpZFsxXSA+PSA0MClcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdTZWNvbmQgb2JqaWQgaWRlbnRpZmllciBPT0InKTtcbiAgICBpZC5zcGxpY2UoMCwgMiwgaWRbMF0gKiA0MCArIGlkWzFdKTtcbiAgfVxuXG4gIC8vIENvdW50IG51bWJlciBvZiBvY3RldHNcbiAgbGV0IHNpemUgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGlkLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGlkZW50ID0gaWRbaV07XG4gICAgZm9yIChzaXplKys7IGlkZW50ID49IDB4ODA7IGlkZW50ID4+PSA3KVxuICAgICAgc2l6ZSsrO1xuICB9XG5cbiAgY29uc3Qgb2JqaWQgPSBCdWZmZXIuYWxsb2Moc2l6ZSk7XG4gIGxldCBvZmZzZXQgPSBvYmppZC5sZW5ndGggLSAxO1xuICBmb3IgKGxldCBpID0gaWQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBsZXQgaWRlbnQgPSBpZFtpXTtcbiAgICBvYmppZFtvZmZzZXQtLV0gPSBpZGVudCAmIDB4N2Y7XG4gICAgd2hpbGUgKChpZGVudCA+Pj0gNykgPiAwKVxuICAgICAgb2JqaWRbb2Zmc2V0LS1dID0gMHg4MCB8IChpZGVudCAmIDB4N2YpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIob2JqaWQpO1xufTtcblxuZnVuY3Rpb24gdHdvKG51bSkge1xuICBpZiAobnVtIDwgMTApXG4gICAgcmV0dXJuICcwJyArIG51bTtcbiAgZWxzZVxuICAgIHJldHVybiBudW07XG59XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVUaW1lID0gZnVuY3Rpb24gZW5jb2RlVGltZSh0aW1lLCB0YWcpIHtcbiAgbGV0IHN0cjtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRpbWUpO1xuXG4gIGlmICh0YWcgPT09ICdnZW50aW1lJykge1xuICAgIHN0ciA9IFtcbiAgICAgIHR3byhkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDRGF0ZSgpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ0hvdXJzKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDTWludXRlcygpKSxcbiAgICAgIHR3byhkYXRlLmdldFVUQ1NlY29uZHMoKSksXG4gICAgICAnWidcbiAgICBdLmpvaW4oJycpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3V0Y3RpbWUnKSB7XG4gICAgc3RyID0gW1xuICAgICAgdHdvKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSAlIDEwMCksXG4gICAgICB0d28oZGF0ZS5nZXRVVENNb250aCgpICsgMSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENEYXRlKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDSG91cnMoKSksXG4gICAgICB0d28oZGF0ZS5nZXRVVENNaW51dGVzKCkpLFxuICAgICAgdHdvKGRhdGUuZ2V0VVRDU2Vjb25kcygpKSxcbiAgICAgICdaJ1xuICAgIF0uam9pbignJyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5yZXBvcnRlci5lcnJvcignRW5jb2RpbmcgJyArIHRhZyArICcgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldCcpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2VuY29kZVN0cihzdHIsICdvY3RzdHInKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVOdWxsID0gZnVuY3Rpb24gZW5jb2RlTnVsbCgpIHtcbiAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoJycpO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZUludCA9IGZ1bmN0aW9uIGVuY29kZUludChudW0sIHZhbHVlcykge1xuICBpZiAodHlwZW9mIG51bSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIXZhbHVlcylcbiAgICAgIHJldHVybiB0aGlzLnJlcG9ydGVyLmVycm9yKCdTdHJpbmcgaW50IG9yIGVudW0gZ2l2ZW4sIGJ1dCBubyB2YWx1ZXMgbWFwJyk7XG4gICAgaWYgKCF2YWx1ZXMuaGFzT3duUHJvcGVydHkobnVtKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoJ1ZhbHVlcyBtYXAgZG9lc25cXCd0IGNvbnRhaW46ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobnVtKSk7XG4gICAgfVxuICAgIG51bSA9IHZhbHVlc1tudW1dO1xuICB9XG5cbiAgLy8gQmlnbnVtLCBhc3N1bWUgYmlnIGVuZGlhblxuICBpZiAodHlwZW9mIG51bSAhPT0gJ251bWJlcicgJiYgIUJ1ZmZlci5pc0J1ZmZlcihudW0pKSB7XG4gICAgY29uc3QgbnVtQXJyYXkgPSBudW0udG9BcnJheSgpO1xuICAgIGlmICghbnVtLnNpZ24gJiYgbnVtQXJyYXlbMF0gJiAweDgwKSB7XG4gICAgICBudW1BcnJheS51bnNoaWZ0KDApO1xuICAgIH1cbiAgICBudW0gPSBCdWZmZXIuZnJvbShudW1BcnJheSk7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG51bSkpIHtcbiAgICBsZXQgc2l6ZSA9IG51bS5sZW5ndGg7XG4gICAgaWYgKG51bS5sZW5ndGggPT09IDApXG4gICAgICBzaXplKys7XG5cbiAgICBjb25zdCBvdXQgPSBCdWZmZXIuYWxsb2Moc2l6ZSk7XG4gICAgbnVtLmNvcHkob3V0KTtcbiAgICBpZiAobnVtLmxlbmd0aCA9PT0gMClcbiAgICAgIG91dFswXSA9IDA7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIob3V0KTtcbiAgfVxuXG4gIGlmIChudW0gPCAweDgwKVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG51bSk7XG5cbiAgaWYgKG51bSA8IDB4MTAwKVxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFswLCBudW1dKTtcblxuICBsZXQgc2l6ZSA9IDE7XG4gIGZvciAobGV0IGkgPSBudW07IGkgPj0gMHgxMDA7IGkgPj49IDgpXG4gICAgc2l6ZSsrO1xuXG4gIGNvbnN0IG91dCA9IG5ldyBBcnJheShzaXplKTtcbiAgZm9yIChsZXQgaSA9IG91dC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIG91dFtpXSA9IG51bSAmIDB4ZmY7XG4gICAgbnVtID4+PSA4O1xuICB9XG4gIGlmKG91dFswXSAmIDB4ODApIHtcbiAgICBvdXQudW5zaGlmdCgwKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKEJ1ZmZlci5mcm9tKG91dCkpO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZUJvb2wgPSBmdW5jdGlvbiBlbmNvZGVCb29sKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHZhbHVlID8gMHhmZiA6IDApO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX3VzZSA9IGZ1bmN0aW9uIHVzZShlbnRpdHksIG9iaikge1xuICBpZiAodHlwZW9mIGVudGl0eSA9PT0gJ2Z1bmN0aW9uJylcbiAgICBlbnRpdHkgPSBlbnRpdHkob2JqKTtcbiAgcmV0dXJuIGVudGl0eS5fZ2V0RW5jb2RlcignZGVyJykudHJlZTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9za2lwRGVmYXVsdCA9IGZ1bmN0aW9uIHNraXBEZWZhdWx0KGRhdGFCdWZmZXIsIHJlcG9ydGVyLCBwYXJlbnQpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9iYXNlU3RhdGU7XG4gIGxldCBpO1xuICBpZiAoc3RhdGVbJ2RlZmF1bHQnXSA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZGF0YSA9IGRhdGFCdWZmZXIuam9pbigpO1xuICBpZiAoc3RhdGUuZGVmYXVsdEJ1ZmZlciA9PT0gdW5kZWZpbmVkKVxuICAgIHN0YXRlLmRlZmF1bHRCdWZmZXIgPSB0aGlzLl9lbmNvZGVWYWx1ZShzdGF0ZVsnZGVmYXVsdCddLCByZXBvcnRlciwgcGFyZW50KS5qb2luKCk7XG5cbiAgaWYgKGRhdGEubGVuZ3RoICE9PSBzdGF0ZS5kZWZhdWx0QnVmZmVyLmxlbmd0aClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgZm9yIChpPTA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKVxuICAgIGlmIChkYXRhW2ldICE9PSBzdGF0ZS5kZWZhdWx0QnVmZmVyW2ldKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLy8gVXRpbGl0eSBtZXRob2RzXG5cbmZ1bmN0aW9uIGVuY29kZVRhZyh0YWcsIHByaW1pdGl2ZSwgY2xzLCByZXBvcnRlcikge1xuICBsZXQgcmVzO1xuXG4gIGlmICh0YWcgPT09ICdzZXFvZicpXG4gICAgdGFnID0gJ3NlcSc7XG4gIGVsc2UgaWYgKHRhZyA9PT0gJ3NldG9mJylcbiAgICB0YWcgPSAnc2V0JztcblxuICBpZiAoZGVyLnRhZ0J5TmFtZS5oYXNPd25Qcm9wZXJ0eSh0YWcpKVxuICAgIHJlcyA9IGRlci50YWdCeU5hbWVbdGFnXTtcbiAgZWxzZSBpZiAodHlwZW9mIHRhZyA9PT0gJ251bWJlcicgJiYgKHRhZyB8IDApID09PSB0YWcpXG4gICAgcmVzID0gdGFnO1xuICBlbHNlXG4gICAgcmV0dXJuIHJlcG9ydGVyLmVycm9yKCdVbmtub3duIHRhZzogJyArIHRhZyk7XG5cbiAgaWYgKHJlcyA+PSAweDFmKVxuICAgIHJldHVybiByZXBvcnRlci5lcnJvcignTXVsdGktb2N0ZXQgdGFnIGVuY29kaW5nIHVuc3VwcG9ydGVkJyk7XG5cbiAgaWYgKCFwcmltaXRpdmUpXG4gICAgcmVzIHw9IDB4MjA7XG5cbiAgcmVzIHw9IChkZXIudGFnQ2xhc3NCeU5hbWVbY2xzIHx8ICd1bml2ZXJzYWwnXSA8PCA2KTtcblxuICByZXR1cm4gcmVzO1xufVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuY29uc3QgREVSRW5jb2RlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG5cbmZ1bmN0aW9uIFBFTUVuY29kZXIoZW50aXR5KSB7XG4gIERFUkVuY29kZXIuY2FsbCh0aGlzLCBlbnRpdHkpO1xuICB0aGlzLmVuYyA9ICdwZW0nO1xufVxuaW5oZXJpdHMoUEVNRW5jb2RlciwgREVSRW5jb2Rlcik7XG5tb2R1bGUuZXhwb3J0cyA9IFBFTUVuY29kZXI7XG5cblBFTUVuY29kZXIucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShkYXRhLCBvcHRpb25zKSB7XG4gIGNvbnN0IGJ1ZiA9IERFUkVuY29kZXIucHJvdG90eXBlLmVuY29kZS5jYWxsKHRoaXMsIGRhdGEpO1xuXG4gIGNvbnN0IHAgPSBidWYudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICBjb25zdCBvdXQgPSBbICctLS0tLUJFR0lOICcgKyBvcHRpb25zLmxhYmVsICsgJy0tLS0tJyBdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHAubGVuZ3RoOyBpICs9IDY0KVxuICAgIG91dC5wdXNoKHAuc2xpY2UoaSwgaSArIDY0KSk7XG4gIG91dC5wdXNoKCctLS0tLUVORCAnICsgb3B0aW9ucy5sYWJlbCArICctLS0tLScpO1xuICByZXR1cm4gb3V0LmpvaW4oJ1xcbicpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBlbmNvZGVycyA9IGV4cG9ydHM7XG5cbmVuY29kZXJzLmRlciA9IHJlcXVpcmUoJy4vZGVyJyk7XG5lbmNvZGVycy5wZW0gPSByZXF1aXJlKCcuL3BlbScpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuY29uc3QgYmlnbnVtID0gcmVxdWlyZSgnYm4uanMnKTtcbmNvbnN0IERlY29kZXJCdWZmZXIgPSByZXF1aXJlKCcuLi9iYXNlL2J1ZmZlcicpLkRlY29kZXJCdWZmZXI7XG5jb25zdCBOb2RlID0gcmVxdWlyZSgnLi4vYmFzZS9ub2RlJyk7XG5cbi8vIEltcG9ydCBERVIgY29uc3RhbnRzXG5jb25zdCBkZXIgPSByZXF1aXJlKCcuLi9jb25zdGFudHMvZGVyJyk7XG5cbmZ1bmN0aW9uIERFUkRlY29kZXIoZW50aXR5KSB7XG4gIHRoaXMuZW5jID0gJ2Rlcic7XG4gIHRoaXMubmFtZSA9IGVudGl0eS5uYW1lO1xuICB0aGlzLmVudGl0eSA9IGVudGl0eTtcblxuICAvLyBDb25zdHJ1Y3QgYmFzZSB0cmVlXG4gIHRoaXMudHJlZSA9IG5ldyBERVJOb2RlKCk7XG4gIHRoaXMudHJlZS5faW5pdChlbnRpdHkuYm9keSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IERFUkRlY29kZXI7XG5cbkRFUkRlY29kZXIucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShkYXRhLCBvcHRpb25zKSB7XG4gIGlmICghRGVjb2RlckJ1ZmZlci5pc0RlY29kZXJCdWZmZXIoZGF0YSkpIHtcbiAgICBkYXRhID0gbmV3IERlY29kZXJCdWZmZXIoZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICByZXR1cm4gdGhpcy50cmVlLl9kZWNvZGUoZGF0YSwgb3B0aW9ucyk7XG59O1xuXG4vLyBUcmVlIG1ldGhvZHNcblxuZnVuY3Rpb24gREVSTm9kZShwYXJlbnQpIHtcbiAgTm9kZS5jYWxsKHRoaXMsICdkZXInLCBwYXJlbnQpO1xufVxuaW5oZXJpdHMoREVSTm9kZSwgTm9kZSk7XG5cbkRFUk5vZGUucHJvdG90eXBlLl9wZWVrVGFnID0gZnVuY3Rpb24gcGVla1RhZyhidWZmZXIsIHRhZywgYW55KSB7XG4gIGlmIChidWZmZXIuaXNFbXB0eSgpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBzdGF0ZSA9IGJ1ZmZlci5zYXZlKCk7XG4gIGNvbnN0IGRlY29kZWRUYWcgPSBkZXJEZWNvZGVUYWcoYnVmZmVyLCAnRmFpbGVkIHRvIHBlZWsgdGFnOiBcIicgKyB0YWcgKyAnXCInKTtcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKGRlY29kZWRUYWcpKVxuICAgIHJldHVybiBkZWNvZGVkVGFnO1xuXG4gIGJ1ZmZlci5yZXN0b3JlKHN0YXRlKTtcblxuICByZXR1cm4gZGVjb2RlZFRhZy50YWcgPT09IHRhZyB8fCBkZWNvZGVkVGFnLnRhZ1N0ciA9PT0gdGFnIHx8XG4gICAgKGRlY29kZWRUYWcudGFnU3RyICsgJ29mJykgPT09IHRhZyB8fCBhbnk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlVGFnID0gZnVuY3Rpb24gZGVjb2RlVGFnKGJ1ZmZlciwgdGFnLCBhbnkpIHtcbiAgY29uc3QgZGVjb2RlZFRhZyA9IGRlckRlY29kZVRhZyhidWZmZXIsXG4gICAgJ0ZhaWxlZCB0byBkZWNvZGUgdGFnIG9mIFwiJyArIHRhZyArICdcIicpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IoZGVjb2RlZFRhZykpXG4gICAgcmV0dXJuIGRlY29kZWRUYWc7XG5cbiAgbGV0IGxlbiA9IGRlckRlY29kZUxlbihidWZmZXIsXG4gICAgZGVjb2RlZFRhZy5wcmltaXRpdmUsXG4gICAgJ0ZhaWxlZCB0byBnZXQgbGVuZ3RoIG9mIFwiJyArIHRhZyArICdcIicpO1xuXG4gIC8vIEZhaWx1cmVcbiAgaWYgKGJ1ZmZlci5pc0Vycm9yKGxlbikpXG4gICAgcmV0dXJuIGxlbjtcblxuICBpZiAoIWFueSAmJlxuICAgICAgZGVjb2RlZFRhZy50YWcgIT09IHRhZyAmJlxuICAgICAgZGVjb2RlZFRhZy50YWdTdHIgIT09IHRhZyAmJlxuICAgICAgZGVjb2RlZFRhZy50YWdTdHIgKyAnb2YnICE9PSB0YWcpIHtcbiAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdGYWlsZWQgdG8gbWF0Y2ggdGFnOiBcIicgKyB0YWcgKyAnXCInKTtcbiAgfVxuXG4gIGlmIChkZWNvZGVkVGFnLnByaW1pdGl2ZSB8fCBsZW4gIT09IG51bGwpXG4gICAgcmV0dXJuIGJ1ZmZlci5za2lwKGxlbiwgJ0ZhaWxlZCB0byBtYXRjaCBib2R5IG9mOiBcIicgKyB0YWcgKyAnXCInKTtcblxuICAvLyBJbmRlZmluaXRlIGxlbmd0aC4uLiBmaW5kIEVORCB0YWdcbiAgY29uc3Qgc3RhdGUgPSBidWZmZXIuc2F2ZSgpO1xuICBjb25zdCByZXMgPSB0aGlzLl9za2lwVW50aWxFbmQoXG4gICAgYnVmZmVyLFxuICAgICdGYWlsZWQgdG8gc2tpcCBpbmRlZmluaXRlIGxlbmd0aCBib2R5OiBcIicgKyB0aGlzLnRhZyArICdcIicpO1xuICBpZiAoYnVmZmVyLmlzRXJyb3IocmVzKSlcbiAgICByZXR1cm4gcmVzO1xuXG4gIGxlbiA9IGJ1ZmZlci5vZmZzZXQgLSBzdGF0ZS5vZmZzZXQ7XG4gIGJ1ZmZlci5yZXN0b3JlKHN0YXRlKTtcbiAgcmV0dXJuIGJ1ZmZlci5za2lwKGxlbiwgJ0ZhaWxlZCB0byBtYXRjaCBib2R5IG9mOiBcIicgKyB0YWcgKyAnXCInKTtcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl9za2lwVW50aWxFbmQgPSBmdW5jdGlvbiBza2lwVW50aWxFbmQoYnVmZmVyLCBmYWlsKSB7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB0YWcgPSBkZXJEZWNvZGVUYWcoYnVmZmVyLCBmYWlsKTtcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IodGFnKSlcbiAgICAgIHJldHVybiB0YWc7XG4gICAgY29uc3QgbGVuID0gZGVyRGVjb2RlTGVuKGJ1ZmZlciwgdGFnLnByaW1pdGl2ZSwgZmFpbCk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKGxlbikpXG4gICAgICByZXR1cm4gbGVuO1xuXG4gICAgbGV0IHJlcztcbiAgICBpZiAodGFnLnByaW1pdGl2ZSB8fCBsZW4gIT09IG51bGwpXG4gICAgICByZXMgPSBidWZmZXIuc2tpcChsZW4pO1xuICAgIGVsc2VcbiAgICAgIHJlcyA9IHRoaXMuX3NraXBVbnRpbEVuZChidWZmZXIsIGZhaWwpO1xuXG4gICAgLy8gRmFpbHVyZVxuICAgIGlmIChidWZmZXIuaXNFcnJvcihyZXMpKVxuICAgICAgcmV0dXJuIHJlcztcblxuICAgIGlmICh0YWcudGFnU3RyID09PSAnZW5kJylcbiAgICAgIGJyZWFrO1xuICB9XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlTGlzdCA9IGZ1bmN0aW9uIGRlY29kZUxpc3QoYnVmZmVyLCB0YWcsIGRlY29kZXIsXG4gIG9wdGlvbnMpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIHdoaWxlICghYnVmZmVyLmlzRW1wdHkoKSkge1xuICAgIGNvbnN0IHBvc3NpYmxlRW5kID0gdGhpcy5fcGVla1RhZyhidWZmZXIsICdlbmQnKTtcbiAgICBpZiAoYnVmZmVyLmlzRXJyb3IocG9zc2libGVFbmQpKVxuICAgICAgcmV0dXJuIHBvc3NpYmxlRW5kO1xuXG4gICAgY29uc3QgcmVzID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLCAnZGVyJywgb3B0aW9ucyk7XG4gICAgaWYgKGJ1ZmZlci5pc0Vycm9yKHJlcykgJiYgcG9zc2libGVFbmQpXG4gICAgICBicmVhaztcbiAgICByZXN1bHQucHVzaChyZXMpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlU3RyID0gZnVuY3Rpb24gZGVjb2RlU3RyKGJ1ZmZlciwgdGFnKSB7XG4gIGlmICh0YWcgPT09ICdiaXRzdHInKSB7XG4gICAgY29uc3QgdW51c2VkID0gYnVmZmVyLnJlYWRVSW50OCgpO1xuICAgIGlmIChidWZmZXIuaXNFcnJvcih1bnVzZWQpKVxuICAgICAgcmV0dXJuIHVudXNlZDtcbiAgICByZXR1cm4geyB1bnVzZWQ6IHVudXNlZCwgZGF0YTogYnVmZmVyLnJhdygpIH07XG4gIH0gZWxzZSBpZiAodGFnID09PSAnYm1wc3RyJykge1xuICAgIGNvbnN0IHJhdyA9IGJ1ZmZlci5yYXcoKTtcbiAgICBpZiAocmF3Lmxlbmd0aCAlIDIgPT09IDEpXG4gICAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogYm1wc3RyIGxlbmd0aCBtaXNtYXRjaCcpO1xuXG4gICAgbGV0IHN0ciA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3Lmxlbmd0aCAvIDI7IGkrKykge1xuICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocmF3LnJlYWRVSW50MTZCRShpICogMikpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ251bXN0cicpIHtcbiAgICBjb25zdCBudW1zdHIgPSBidWZmZXIucmF3KCkudG9TdHJpbmcoJ2FzY2lpJyk7XG4gICAgaWYgKCF0aGlzLl9pc051bXN0cihudW1zdHIpKSB7XG4gICAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdudW1zdHIgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgICByZXR1cm4gbnVtc3RyO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ29jdHN0cicpIHtcbiAgICByZXR1cm4gYnVmZmVyLnJhdygpO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ29iakRlc2MnKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5yYXcoKTtcbiAgfSBlbHNlIGlmICh0YWcgPT09ICdwcmludHN0cicpIHtcbiAgICBjb25zdCBwcmludHN0ciA9IGJ1ZmZlci5yYXcoKS50b1N0cmluZygnYXNjaWknKTtcbiAgICBpZiAoIXRoaXMuX2lzUHJpbnRzdHIocHJpbnRzdHIpKSB7XG4gICAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdwcmludHN0ciB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICAgIHJldHVybiBwcmludHN0cjtcbiAgfSBlbHNlIGlmICgvc3RyJC8udGVzdCh0YWcpKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5yYXcoKS50b1N0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBidWZmZXIuZXJyb3IoJ0RlY29kaW5nIG9mIHN0cmluZyB0eXBlOiAnICsgdGFnICsgJyB1bnN1cHBvcnRlZCcpO1xuICB9XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlT2JqaWQgPSBmdW5jdGlvbiBkZWNvZGVPYmppZChidWZmZXIsIHZhbHVlcywgcmVsYXRpdmUpIHtcbiAgbGV0IHJlc3VsdDtcbiAgY29uc3QgaWRlbnRpZmllcnMgPSBbXTtcbiAgbGV0IGlkZW50ID0gMDtcbiAgbGV0IHN1YmlkZW50ID0gMDtcbiAgd2hpbGUgKCFidWZmZXIuaXNFbXB0eSgpKSB7XG4gICAgc3ViaWRlbnQgPSBidWZmZXIucmVhZFVJbnQ4KCk7XG4gICAgaWRlbnQgPDw9IDc7XG4gICAgaWRlbnQgfD0gc3ViaWRlbnQgJiAweDdmO1xuICAgIGlmICgoc3ViaWRlbnQgJiAweDgwKSA9PT0gMCkge1xuICAgICAgaWRlbnRpZmllcnMucHVzaChpZGVudCk7XG4gICAgICBpZGVudCA9IDA7XG4gICAgfVxuICB9XG4gIGlmIChzdWJpZGVudCAmIDB4ODApXG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudCk7XG5cbiAgY29uc3QgZmlyc3QgPSAoaWRlbnRpZmllcnNbMF0gLyA0MCkgfCAwO1xuICBjb25zdCBzZWNvbmQgPSBpZGVudGlmaWVyc1swXSAlIDQwO1xuXG4gIGlmIChyZWxhdGl2ZSlcbiAgICByZXN1bHQgPSBpZGVudGlmaWVycztcbiAgZWxzZVxuICAgIHJlc3VsdCA9IFtmaXJzdCwgc2Vjb25kXS5jb25jYXQoaWRlbnRpZmllcnMuc2xpY2UoMSkpO1xuXG4gIGlmICh2YWx1ZXMpIHtcbiAgICBsZXQgdG1wID0gdmFsdWVzW3Jlc3VsdC5qb2luKCcgJyldO1xuICAgIGlmICh0bXAgPT09IHVuZGVmaW5lZClcbiAgICAgIHRtcCA9IHZhbHVlc1tyZXN1bHQuam9pbignLicpXTtcbiAgICBpZiAodG1wICE9PSB1bmRlZmluZWQpXG4gICAgICByZXN1bHQgPSB0bXA7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZVRpbWUgPSBmdW5jdGlvbiBkZWNvZGVUaW1lKGJ1ZmZlciwgdGFnKSB7XG4gIGNvbnN0IHN0ciA9IGJ1ZmZlci5yYXcoKS50b1N0cmluZygpO1xuXG4gIGxldCB5ZWFyO1xuICBsZXQgbW9uO1xuICBsZXQgZGF5O1xuICBsZXQgaG91cjtcbiAgbGV0IG1pbjtcbiAgbGV0IHNlYztcbiAgaWYgKHRhZyA9PT0gJ2dlbnRpbWUnKSB7XG4gICAgeWVhciA9IHN0ci5zbGljZSgwLCA0KSB8IDA7XG4gICAgbW9uID0gc3RyLnNsaWNlKDQsIDYpIHwgMDtcbiAgICBkYXkgPSBzdHIuc2xpY2UoNiwgOCkgfCAwO1xuICAgIGhvdXIgPSBzdHIuc2xpY2UoOCwgMTApIHwgMDtcbiAgICBtaW4gPSBzdHIuc2xpY2UoMTAsIDEyKSB8IDA7XG4gICAgc2VjID0gc3RyLnNsaWNlKDEyLCAxNCkgfCAwO1xuICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3V0Y3RpbWUnKSB7XG4gICAgeWVhciA9IHN0ci5zbGljZSgwLCAyKSB8IDA7XG4gICAgbW9uID0gc3RyLnNsaWNlKDIsIDQpIHwgMDtcbiAgICBkYXkgPSBzdHIuc2xpY2UoNCwgNikgfCAwO1xuICAgIGhvdXIgPSBzdHIuc2xpY2UoNiwgOCkgfCAwO1xuICAgIG1pbiA9IHN0ci5zbGljZSg4LCAxMCkgfCAwO1xuICAgIHNlYyA9IHN0ci5zbGljZSgxMCwgMTIpIHwgMDtcbiAgICBpZiAoeWVhciA8IDcwKVxuICAgICAgeWVhciA9IDIwMDAgKyB5ZWFyO1xuICAgIGVsc2VcbiAgICAgIHllYXIgPSAxOTAwICsgeWVhcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYnVmZmVyLmVycm9yKCdEZWNvZGluZyAnICsgdGFnICsgJyB0aW1lIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Jyk7XG4gIH1cblxuICByZXR1cm4gRGF0ZS5VVEMoeWVhciwgbW9uIC0gMSwgZGF5LCBob3VyLCBtaW4sIHNlYywgMCk7XG59O1xuXG5ERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlTnVsbCA9IGZ1bmN0aW9uIGRlY29kZU51bGwoKSB7XG4gIHJldHVybiBudWxsO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZUJvb2wgPSBmdW5jdGlvbiBkZWNvZGVCb29sKGJ1ZmZlcikge1xuICBjb25zdCByZXMgPSBidWZmZXIucmVhZFVJbnQ4KCk7XG4gIGlmIChidWZmZXIuaXNFcnJvcihyZXMpKVxuICAgIHJldHVybiByZXM7XG4gIGVsc2VcbiAgICByZXR1cm4gcmVzICE9PSAwO1xufTtcblxuREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZUludCA9IGZ1bmN0aW9uIGRlY29kZUludChidWZmZXIsIHZhbHVlcykge1xuICAvLyBCaWdpbnQsIHJldHVybiBhcyBpdCBpcyAoYXNzdW1lIGJpZyBlbmRpYW4pXG4gIGNvbnN0IHJhdyA9IGJ1ZmZlci5yYXcoKTtcbiAgbGV0IHJlcyA9IG5ldyBiaWdudW0ocmF3KTtcblxuICBpZiAodmFsdWVzKVxuICAgIHJlcyA9IHZhbHVlc1tyZXMudG9TdHJpbmcoMTApXSB8fCByZXM7XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbkRFUk5vZGUucHJvdG90eXBlLl91c2UgPSBmdW5jdGlvbiB1c2UoZW50aXR5LCBvYmopIHtcbiAgaWYgKHR5cGVvZiBlbnRpdHkgPT09ICdmdW5jdGlvbicpXG4gICAgZW50aXR5ID0gZW50aXR5KG9iaik7XG4gIHJldHVybiBlbnRpdHkuX2dldERlY29kZXIoJ2RlcicpLnRyZWU7XG59O1xuXG4vLyBVdGlsaXR5IG1ldGhvZHNcblxuZnVuY3Rpb24gZGVyRGVjb2RlVGFnKGJ1ZiwgZmFpbCkge1xuICBsZXQgdGFnID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgaWYgKGJ1Zi5pc0Vycm9yKHRhZykpXG4gICAgcmV0dXJuIHRhZztcblxuICBjb25zdCBjbHMgPSBkZXIudGFnQ2xhc3NbdGFnID4+IDZdO1xuICBjb25zdCBwcmltaXRpdmUgPSAodGFnICYgMHgyMCkgPT09IDA7XG5cbiAgLy8gTXVsdGktb2N0ZXQgdGFnIC0gbG9hZFxuICBpZiAoKHRhZyAmIDB4MWYpID09PSAweDFmKSB7XG4gICAgbGV0IG9jdCA9IHRhZztcbiAgICB0YWcgPSAwO1xuICAgIHdoaWxlICgob2N0ICYgMHg4MCkgPT09IDB4ODApIHtcbiAgICAgIG9jdCA9IGJ1Zi5yZWFkVUludDgoZmFpbCk7XG4gICAgICBpZiAoYnVmLmlzRXJyb3Iob2N0KSlcbiAgICAgICAgcmV0dXJuIG9jdDtcblxuICAgICAgdGFnIDw8PSA3O1xuICAgICAgdGFnIHw9IG9jdCAmIDB4N2Y7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRhZyAmPSAweDFmO1xuICB9XG4gIGNvbnN0IHRhZ1N0ciA9IGRlci50YWdbdGFnXTtcblxuICByZXR1cm4ge1xuICAgIGNsczogY2xzLFxuICAgIHByaW1pdGl2ZTogcHJpbWl0aXZlLFxuICAgIHRhZzogdGFnLFxuICAgIHRhZ1N0cjogdGFnU3RyXG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlckRlY29kZUxlbihidWYsIHByaW1pdGl2ZSwgZmFpbCkge1xuICBsZXQgbGVuID0gYnVmLnJlYWRVSW50OChmYWlsKTtcbiAgaWYgKGJ1Zi5pc0Vycm9yKGxlbikpXG4gICAgcmV0dXJuIGxlbjtcblxuICAvLyBJbmRlZmluaXRlIGZvcm1cbiAgaWYgKCFwcmltaXRpdmUgJiYgbGVuID09PSAweDgwKVxuICAgIHJldHVybiBudWxsO1xuXG4gIC8vIERlZmluaXRlIGZvcm1cbiAgaWYgKChsZW4gJiAweDgwKSA9PT0gMCkge1xuICAgIC8vIFNob3J0IGZvcm1cbiAgICByZXR1cm4gbGVuO1xuICB9XG5cbiAgLy8gTG9uZyBmb3JtXG4gIGNvbnN0IG51bSA9IGxlbiAmIDB4N2Y7XG4gIGlmIChudW0gPiA0KVxuICAgIHJldHVybiBidWYuZXJyb3IoJ2xlbmd0aCBvY3RlY3QgaXMgdG9vIGxvbmcnKTtcblxuICBsZW4gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bTsgaSsrKSB7XG4gICAgbGVuIDw8PSA4O1xuICAgIGNvbnN0IGogPSBidWYucmVhZFVJbnQ4KGZhaWwpO1xuICAgIGlmIChidWYuaXNFcnJvcihqKSlcbiAgICAgIHJldHVybiBqO1xuICAgIGxlbiB8PSBqO1xuICB9XG5cbiAgcmV0dXJuIGxlbjtcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5jb25zdCBCdWZmZXIgPSByZXF1aXJlKCdzYWZlci1idWZmZXInKS5CdWZmZXI7XG5cbmNvbnN0IERFUkRlY29kZXIgPSByZXF1aXJlKCcuL2RlcicpO1xuXG5mdW5jdGlvbiBQRU1EZWNvZGVyKGVudGl0eSkge1xuICBERVJEZWNvZGVyLmNhbGwodGhpcywgZW50aXR5KTtcbiAgdGhpcy5lbmMgPSAncGVtJztcbn1cbmluaGVyaXRzKFBFTURlY29kZXIsIERFUkRlY29kZXIpO1xubW9kdWxlLmV4cG9ydHMgPSBQRU1EZWNvZGVyO1xuXG5QRU1EZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoZGF0YSwgb3B0aW9ucykge1xuICBjb25zdCBsaW5lcyA9IGRhdGEudG9TdHJpbmcoKS5zcGxpdCgvW1xcclxcbl0rL2cpO1xuXG4gIGNvbnN0IGxhYmVsID0gb3B0aW9ucy5sYWJlbC50b1VwcGVyQ2FzZSgpO1xuXG4gIGNvbnN0IHJlID0gL14tLS0tLShCRUdJTnxFTkQpIChbXi1dKyktLS0tLSQvO1xuICBsZXQgc3RhcnQgPSAtMTtcbiAgbGV0IGVuZCA9IC0xO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBsaW5lc1tpXS5tYXRjaChyZSk7XG4gICAgaWYgKG1hdGNoID09PSBudWxsKVxuICAgICAgY29udGludWU7XG5cbiAgICBpZiAobWF0Y2hbMl0gIT09IGxhYmVsKVxuICAgICAgY29udGludWU7XG5cbiAgICBpZiAoc3RhcnQgPT09IC0xKSB7XG4gICAgICBpZiAobWF0Y2hbMV0gIT09ICdCRUdJTicpXG4gICAgICAgIGJyZWFrO1xuICAgICAgc3RhcnQgPSBpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobWF0Y2hbMV0gIT09ICdFTkQnKVxuICAgICAgICBicmVhaztcbiAgICAgIGVuZCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKHN0YXJ0ID09PSAtMSB8fCBlbmQgPT09IC0xKVxuICAgIHRocm93IG5ldyBFcnJvcignUEVNIHNlY3Rpb24gbm90IGZvdW5kIGZvcjogJyArIGxhYmVsKTtcblxuICBjb25zdCBiYXNlNjQgPSBsaW5lcy5zbGljZShzdGFydCArIDEsIGVuZCkuam9pbignJyk7XG4gIC8vIFJlbW92ZSBleGNlc3NpdmUgc3ltYm9sc1xuICBiYXNlNjQucmVwbGFjZSgvW15hLXowLTkrLz1dKy9naSwgJycpO1xuXG4gIGNvbnN0IGlucHV0ID0gQnVmZmVyLmZyb20oYmFzZTY0LCAnYmFzZTY0Jyk7XG4gIHJldHVybiBERVJEZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUuY2FsbCh0aGlzLCBpbnB1dCwgb3B0aW9ucyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGRlY29kZXJzID0gZXhwb3J0cztcblxuZGVjb2RlcnMuZGVyID0gcmVxdWlyZSgnLi9kZXInKTtcbmRlY29kZXJzLnBlbSA9IHJlcXVpcmUoJy4vcGVtJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZW5jb2RlcnMgPSByZXF1aXJlKCcuL2VuY29kZXJzJyk7XG5jb25zdCBkZWNvZGVycyA9IHJlcXVpcmUoJy4vZGVjb2RlcnMnKTtcbmNvbnN0IGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuY29uc3QgYXBpID0gZXhwb3J0cztcblxuYXBpLmRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZShuYW1lLCBib2R5KSB7XG4gIHJldHVybiBuZXcgRW50aXR5KG5hbWUsIGJvZHkpO1xufTtcblxuZnVuY3Rpb24gRW50aXR5KG5hbWUsIGJvZHkpIHtcbiAgdGhpcy5uYW1lID0gbmFtZTtcbiAgdGhpcy5ib2R5ID0gYm9keTtcblxuICB0aGlzLmRlY29kZXJzID0ge307XG4gIHRoaXMuZW5jb2RlcnMgPSB7fTtcbn1cblxuRW50aXR5LnByb3RvdHlwZS5fY3JlYXRlTmFtZWQgPSBmdW5jdGlvbiBjcmVhdGVOYW1lZChCYXNlKSB7XG4gIGNvbnN0IG5hbWUgPSB0aGlzLm5hbWU7XG5cbiAgZnVuY3Rpb24gR2VuZXJhdGVkKGVudGl0eSkge1xuICAgIHRoaXMuX2luaXROYW1lZChlbnRpdHksIG5hbWUpO1xuICB9XG4gIGluaGVyaXRzKEdlbmVyYXRlZCwgQmFzZSk7XG4gIEdlbmVyYXRlZC5wcm90b3R5cGUuX2luaXROYW1lZCA9IGZ1bmN0aW9uIF9pbml0TmFtZWQoZW50aXR5LCBuYW1lKSB7XG4gICAgQmFzZS5jYWxsKHRoaXMsIGVudGl0eSwgbmFtZSk7XG4gIH07XG5cbiAgcmV0dXJuIG5ldyBHZW5lcmF0ZWQodGhpcyk7XG59O1xuXG5FbnRpdHkucHJvdG90eXBlLl9nZXREZWNvZGVyID0gZnVuY3Rpb24gX2dldERlY29kZXIoZW5jKSB7XG4gIGVuYyA9IGVuYyB8fCAnZGVyJztcbiAgLy8gTGF6aWx5IGNyZWF0ZSBkZWNvZGVyXG4gIGlmICghdGhpcy5kZWNvZGVycy5oYXNPd25Qcm9wZXJ0eShlbmMpKVxuICAgIHRoaXMuZGVjb2RlcnNbZW5jXSA9IHRoaXMuX2NyZWF0ZU5hbWVkKGRlY29kZXJzW2VuY10pO1xuICByZXR1cm4gdGhpcy5kZWNvZGVyc1tlbmNdO1xufTtcblxuRW50aXR5LnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoZGF0YSwgZW5jLCBvcHRpb25zKSB7XG4gIHJldHVybiB0aGlzLl9nZXREZWNvZGVyKGVuYykuZGVjb2RlKGRhdGEsIG9wdGlvbnMpO1xufTtcblxuRW50aXR5LnByb3RvdHlwZS5fZ2V0RW5jb2RlciA9IGZ1bmN0aW9uIF9nZXRFbmNvZGVyKGVuYykge1xuICBlbmMgPSBlbmMgfHwgJ2Rlcic7XG4gIC8vIExhemlseSBjcmVhdGUgZW5jb2RlclxuICBpZiAoIXRoaXMuZW5jb2RlcnMuaGFzT3duUHJvcGVydHkoZW5jKSlcbiAgICB0aGlzLmVuY29kZXJzW2VuY10gPSB0aGlzLl9jcmVhdGVOYW1lZChlbmNvZGVyc1tlbmNdKTtcbiAgcmV0dXJuIHRoaXMuZW5jb2RlcnNbZW5jXTtcbn07XG5cbkVudGl0eS5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGRhdGEsIGVuYywgLyogaW50ZXJuYWwgKi8gcmVwb3J0ZXIpIHtcbiAgcmV0dXJuIHRoaXMuX2dldEVuY29kZXIoZW5jKS5lbmNvZGUoZGF0YSwgcmVwb3J0ZXIpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBiYXNlID0gZXhwb3J0cztcblxuYmFzZS5SZXBvcnRlciA9IHJlcXVpcmUoJy4vcmVwb3J0ZXInKS5SZXBvcnRlcjtcbmJhc2UuRGVjb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJykuRGVjb2RlckJ1ZmZlcjtcbmJhc2UuRW5jb2RlckJ1ZmZlciA9IHJlcXVpcmUoJy4vYnVmZmVyJykuRW5jb2RlckJ1ZmZlcjtcbmJhc2UuTm9kZSA9IHJlcXVpcmUoJy4vbm9kZScpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGNvbnN0YW50cyA9IGV4cG9ydHM7XG5cbi8vIEhlbHBlclxuY29uc3RhbnRzLl9yZXZlcnNlID0gZnVuY3Rpb24gcmV2ZXJzZShtYXApIHtcbiAgY29uc3QgcmVzID0ge307XG5cbiAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIC8vIENvbnZlcnQga2V5IHRvIGludGVnZXIgaWYgaXQgaXMgc3RyaW5naWZpZWRcbiAgICBpZiAoKGtleSB8IDApID09IGtleSlcbiAgICAgIGtleSA9IGtleSB8IDA7XG5cbiAgICBjb25zdCB2YWx1ZSA9IG1hcFtrZXldO1xuICAgIHJlc1t2YWx1ZV0gPSBrZXk7XG4gIH0pO1xuXG4gIHJldHVybiByZXM7XG59O1xuXG5jb25zdGFudHMuZGVyID0gcmVxdWlyZSgnLi9kZXInKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBhc24xID0gZXhwb3J0cztcblxuYXNuMS5iaWdudW0gPSByZXF1aXJlKCdibi5qcycpO1xuXG5hc24xLmRlZmluZSA9IHJlcXVpcmUoJy4vYXNuMS9hcGknKS5kZWZpbmU7XG5hc24xLmJhc2UgPSByZXF1aXJlKCcuL2FzbjEvYmFzZScpO1xuYXNuMS5jb25zdGFudHMgPSByZXF1aXJlKCcuL2FzbjEvY29uc3RhbnRzJyk7XG5hc24xLmRlY29kZXJzID0gcmVxdWlyZSgnLi9hc24xL2RlY29kZXJzJyk7XG5hc24xLmVuY29kZXJzID0gcmVxdWlyZSgnLi9hc24xL2VuY29kZXJzJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gZXhwb3J0cztcblxuZnVuY3Rpb24gdG9BcnJheShtc2csIGVuYykge1xuICBpZiAoQXJyYXkuaXNBcnJheShtc2cpKVxuICAgIHJldHVybiBtc2cuc2xpY2UoKTtcbiAgaWYgKCFtc2cpXG4gICAgcmV0dXJuIFtdO1xuICB2YXIgcmVzID0gW107XG4gIGlmICh0eXBlb2YgbXNnICE9PSAnc3RyaW5nJykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgICAgcmVzW2ldID0gbXNnW2ldIHwgMDtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIGlmIChlbmMgPT09ICdoZXgnKSB7XG4gICAgbXNnID0gbXNnLnJlcGxhY2UoL1teYS16MC05XSsvaWcsICcnKTtcbiAgICBpZiAobXNnLmxlbmd0aCAlIDIgIT09IDApXG4gICAgICBtc2cgPSAnMCcgKyBtc2c7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpICs9IDIpXG4gICAgICByZXMucHVzaChwYXJzZUludChtc2dbaV0gKyBtc2dbaSArIDFdLCAxNikpO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYyA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgdmFyIGhpID0gYyA+PiA4O1xuICAgICAgdmFyIGxvID0gYyAmIDB4ZmY7XG4gICAgICBpZiAoaGkpXG4gICAgICAgIHJlcy5wdXNoKGhpLCBsbyk7XG4gICAgICBlbHNlXG4gICAgICAgIHJlcy5wdXNoKGxvKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbnV0aWxzLnRvQXJyYXkgPSB0b0FycmF5O1xuXG5mdW5jdGlvbiB6ZXJvMih3b3JkKSB7XG4gIGlmICh3b3JkLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gJzAnICsgd29yZDtcbiAgZWxzZVxuICAgIHJldHVybiB3b3JkO1xufVxudXRpbHMuemVybzIgPSB6ZXJvMjtcblxuZnVuY3Rpb24gdG9IZXgobXNnKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgcmVzICs9IHplcm8yKG1zZ1tpXS50b1N0cmluZygxNikpO1xuICByZXR1cm4gcmVzO1xufVxudXRpbHMudG9IZXggPSB0b0hleDtcblxudXRpbHMuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKGFyciwgZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB0b0hleChhcnIpO1xuICBlbHNlXG4gICAgcmV0dXJuIGFycjtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gZXhwb3J0cztcbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgbWluQXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xudmFyIG1pblV0aWxzID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWNyeXB0by11dGlscycpO1xuXG51dGlscy5hc3NlcnQgPSBtaW5Bc3NlcnQ7XG51dGlscy50b0FycmF5ID0gbWluVXRpbHMudG9BcnJheTtcbnV0aWxzLnplcm8yID0gbWluVXRpbHMuemVybzI7XG51dGlscy50b0hleCA9IG1pblV0aWxzLnRvSGV4O1xudXRpbHMuZW5jb2RlID0gbWluVXRpbHMuZW5jb2RlO1xuXG4vLyBSZXByZXNlbnQgbnVtIGluIGEgdy1OQUYgZm9ybVxuZnVuY3Rpb24gZ2V0TkFGKG51bSwgdywgYml0cykge1xuICB2YXIgbmFmID0gbmV3IEFycmF5KE1hdGgubWF4KG51bS5iaXRMZW5ndGgoKSwgYml0cykgKyAxKTtcbiAgdmFyIGk7XG4gIGZvciAoaSA9IDA7IGkgPCBuYWYubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBuYWZbaV0gPSAwO1xuICB9XG5cbiAgdmFyIHdzID0gMSA8PCAodyArIDEpO1xuICB2YXIgayA9IG51bS5jbG9uZSgpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBuYWYubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgejtcbiAgICB2YXIgbW9kID0gay5hbmRsbih3cyAtIDEpO1xuICAgIGlmIChrLmlzT2RkKCkpIHtcbiAgICAgIGlmIChtb2QgPiAod3MgPj4gMSkgLSAxKVxuICAgICAgICB6ID0gKHdzID4+IDEpIC0gbW9kO1xuICAgICAgZWxzZVxuICAgICAgICB6ID0gbW9kO1xuICAgICAgay5pc3Vibih6KTtcbiAgICB9IGVsc2Uge1xuICAgICAgeiA9IDA7XG4gICAgfVxuXG4gICAgbmFmW2ldID0gejtcbiAgICBrLml1c2hybigxKTtcbiAgfVxuXG4gIHJldHVybiBuYWY7XG59XG51dGlscy5nZXROQUYgPSBnZXROQUY7XG5cbi8vIFJlcHJlc2VudCBrMSwgazIgaW4gYSBKb2ludCBTcGFyc2UgRm9ybVxuZnVuY3Rpb24gZ2V0SlNGKGsxLCBrMikge1xuICB2YXIganNmID0gW1xuICAgIFtdLFxuICAgIFtdLFxuICBdO1xuXG4gIGsxID0gazEuY2xvbmUoKTtcbiAgazIgPSBrMi5jbG9uZSgpO1xuICB2YXIgZDEgPSAwO1xuICB2YXIgZDIgPSAwO1xuICB2YXIgbTg7XG4gIHdoaWxlIChrMS5jbXBuKC1kMSkgPiAwIHx8IGsyLmNtcG4oLWQyKSA+IDApIHtcbiAgICAvLyBGaXJzdCBwaGFzZVxuICAgIHZhciBtMTQgPSAoazEuYW5kbG4oMykgKyBkMSkgJiAzO1xuICAgIHZhciBtMjQgPSAoazIuYW5kbG4oMykgKyBkMikgJiAzO1xuICAgIGlmIChtMTQgPT09IDMpXG4gICAgICBtMTQgPSAtMTtcbiAgICBpZiAobTI0ID09PSAzKVxuICAgICAgbTI0ID0gLTE7XG4gICAgdmFyIHUxO1xuICAgIGlmICgobTE0ICYgMSkgPT09IDApIHtcbiAgICAgIHUxID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgbTggPSAoazEuYW5kbG4oNykgKyBkMSkgJiA3O1xuICAgICAgaWYgKChtOCA9PT0gMyB8fCBtOCA9PT0gNSkgJiYgbTI0ID09PSAyKVxuICAgICAgICB1MSA9IC1tMTQ7XG4gICAgICBlbHNlXG4gICAgICAgIHUxID0gbTE0O1xuICAgIH1cbiAgICBqc2ZbMF0ucHVzaCh1MSk7XG5cbiAgICB2YXIgdTI7XG4gICAgaWYgKChtMjQgJiAxKSA9PT0gMCkge1xuICAgICAgdTIgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBtOCA9IChrMi5hbmRsbig3KSArIGQyKSAmIDc7XG4gICAgICBpZiAoKG04ID09PSAzIHx8IG04ID09PSA1KSAmJiBtMTQgPT09IDIpXG4gICAgICAgIHUyID0gLW0yNDtcbiAgICAgIGVsc2VcbiAgICAgICAgdTIgPSBtMjQ7XG4gICAgfVxuICAgIGpzZlsxXS5wdXNoKHUyKTtcblxuICAgIC8vIFNlY29uZCBwaGFzZVxuICAgIGlmICgyICogZDEgPT09IHUxICsgMSlcbiAgICAgIGQxID0gMSAtIGQxO1xuICAgIGlmICgyICogZDIgPT09IHUyICsgMSlcbiAgICAgIGQyID0gMSAtIGQyO1xuICAgIGsxLml1c2hybigxKTtcbiAgICBrMi5pdXNocm4oMSk7XG4gIH1cblxuICByZXR1cm4ganNmO1xufVxudXRpbHMuZ2V0SlNGID0gZ2V0SlNGO1xuXG5mdW5jdGlvbiBjYWNoZWRQcm9wZXJ0eShvYmosIG5hbWUsIGNvbXB1dGVyKSB7XG4gIHZhciBrZXkgPSAnXycgKyBuYW1lO1xuICBvYmoucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24gY2FjaGVkUHJvcGVydHkoKSB7XG4gICAgcmV0dXJuIHRoaXNba2V5XSAhPT0gdW5kZWZpbmVkID8gdGhpc1trZXldIDpcbiAgICAgIHRoaXNba2V5XSA9IGNvbXB1dGVyLmNhbGwodGhpcyk7XG4gIH07XG59XG51dGlscy5jYWNoZWRQcm9wZXJ0eSA9IGNhY2hlZFByb3BlcnR5O1xuXG5mdW5jdGlvbiBwYXJzZUJ5dGVzKGJ5dGVzKSB7XG4gIHJldHVybiB0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnID8gdXRpbHMudG9BcnJheShieXRlcywgJ2hleCcpIDpcbiAgICBieXRlcztcbn1cbnV0aWxzLnBhcnNlQnl0ZXMgPSBwYXJzZUJ5dGVzO1xuXG5mdW5jdGlvbiBpbnRGcm9tTEUoYnl0ZXMpIHtcbiAgcmV0dXJuIG5ldyBCTihieXRlcywgJ2hleCcsICdsZScpO1xufVxudXRpbHMuaW50RnJvbUxFID0gaW50RnJvbUxFO1xuXG4iLAogICAgInZhciByO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJhbmQobGVuKSB7XG4gIGlmICghcilcbiAgICByID0gbmV3IFJhbmQobnVsbCk7XG5cbiAgcmV0dXJuIHIuZ2VuZXJhdGUobGVuKTtcbn07XG5cbmZ1bmN0aW9uIFJhbmQocmFuZCkge1xuICB0aGlzLnJhbmQgPSByYW5kO1xufVxubW9kdWxlLmV4cG9ydHMuUmFuZCA9IFJhbmQ7XG5cblJhbmQucHJvdG90eXBlLmdlbmVyYXRlID0gZnVuY3Rpb24gZ2VuZXJhdGUobGVuKSB7XG4gIHJldHVybiB0aGlzLl9yYW5kKGxlbik7XG59O1xuXG4vLyBFbXVsYXRlIGNyeXB0byBBUEkgdXNpbmcgcmFuZHlcblJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICBpZiAodGhpcy5yYW5kLmdldEJ5dGVzKVxuICAgIHJldHVybiB0aGlzLnJhbmQuZ2V0Qnl0ZXMobik7XG5cbiAgdmFyIHJlcyA9IG5ldyBVaW50OEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcy5sZW5ndGg7IGkrKylcbiAgICByZXNbaV0gPSB0aGlzLnJhbmQuZ2V0Qnl0ZSgpO1xuICByZXR1cm4gcmVzO1xufTtcblxuaWYgKHR5cGVvZiBzZWxmID09PSAnb2JqZWN0Jykge1xuICBpZiAoc2VsZi5jcnlwdG8gJiYgc2VsZi5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gTW9kZXJuIGJyb3dzZXJzXG4gICAgUmFuZC5wcm90b3R5cGUuX3JhbmQgPSBmdW5jdGlvbiBfcmFuZChuKSB7XG4gICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gICAgICBzZWxmLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyKTtcbiAgICAgIHJldHVybiBhcnI7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChzZWxmLm1zQ3J5cHRvICYmIHNlbGYubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gSUVcbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uIF9yYW5kKG4pIHtcbiAgICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheShuKTtcbiAgICAgIHNlbGYubXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycik7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH07XG5cbiAgLy8gU2FmYXJpJ3MgV2ViV29ya2VycyBkbyBub3QgaGF2ZSBgY3J5cHRvYFxuICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gT2xkIGp1bmtcbiAgICBSYW5kLnByb3RvdHlwZS5fcmFuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgfTtcbiAgfVxufSBlbHNlIHtcbiAgLy8gTm9kZS5qcyBvciBXZWIgd29ya2VyIHdpdGggbm8gY3J5cHRvIHN1cHBvcnRcbiAgdHJ5IHtcbiAgICB2YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG4gICAgaWYgKHR5cGVvZiBjcnlwdG8ucmFuZG9tQnl0ZXMgIT09ICdmdW5jdGlvbicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQnKTtcblxuICAgIFJhbmQucHJvdG90eXBlLl9yYW5kID0gZnVuY3Rpb24gX3JhbmQobikge1xuICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21CeXRlcyhuKTtcbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBnZXROQUYgPSB1dGlscy5nZXROQUY7XG52YXIgZ2V0SlNGID0gdXRpbHMuZ2V0SlNGO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gQmFzZUN1cnZlKHR5cGUsIGNvbmYpIHtcbiAgdGhpcy50eXBlID0gdHlwZTtcbiAgdGhpcy5wID0gbmV3IEJOKGNvbmYucCwgMTYpO1xuXG4gIC8vIFVzZSBNb250Z29tZXJ5LCB3aGVuIHRoZXJlIGlzIG5vIGZhc3QgcmVkdWN0aW9uIGZvciB0aGUgcHJpbWVcbiAgdGhpcy5yZWQgPSBjb25mLnByaW1lID8gQk4ucmVkKGNvbmYucHJpbWUpIDogQk4ubW9udCh0aGlzLnApO1xuXG4gIC8vIFVzZWZ1bCBmb3IgbWFueSBjdXJ2ZXNcbiAgdGhpcy56ZXJvID0gbmV3IEJOKDApLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5vbmUgPSBuZXcgQk4oMSkudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLnR3byA9IG5ldyBCTigyKS50b1JlZCh0aGlzLnJlZCk7XG5cbiAgLy8gQ3VydmUgY29uZmlndXJhdGlvbiwgb3B0aW9uYWxcbiAgdGhpcy5uID0gY29uZi5uICYmIG5ldyBCTihjb25mLm4sIDE2KTtcbiAgdGhpcy5nID0gY29uZi5nICYmIHRoaXMucG9pbnRGcm9tSlNPTihjb25mLmcsIGNvbmYuZ1JlZCk7XG5cbiAgLy8gVGVtcG9yYXJ5IGFycmF5c1xuICB0aGlzLl93bmFmVDEgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX3duYWZUMiA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fd25hZlQzID0gbmV3IEFycmF5KDQpO1xuICB0aGlzLl93bmFmVDQgPSBuZXcgQXJyYXkoNCk7XG5cbiAgdGhpcy5fYml0TGVuZ3RoID0gdGhpcy5uID8gdGhpcy5uLmJpdExlbmd0aCgpIDogMDtcblxuICAvLyBHZW5lcmFsaXplZCBHcmVnIE1heHdlbGwncyB0cmlja1xuICB2YXIgYWRqdXN0Q291bnQgPSB0aGlzLm4gJiYgdGhpcy5wLmRpdih0aGlzLm4pO1xuICBpZiAoIWFkanVzdENvdW50IHx8IGFkanVzdENvdW50LmNtcG4oMTAwKSA+IDApIHtcbiAgICB0aGlzLnJlZE4gPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX21heHdlbGxUcmljayA9IHRydWU7XG4gICAgdGhpcy5yZWROID0gdGhpcy5uLnRvUmVkKHRoaXMucmVkKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBCYXNlQ3VydmU7XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbiBwb2ludCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUuX2ZpeGVkTmFmTXVsID0gZnVuY3Rpb24gX2ZpeGVkTmFmTXVsKHAsIGspIHtcbiAgYXNzZXJ0KHAucHJlY29tcHV0ZWQpO1xuICB2YXIgZG91YmxlcyA9IHAuX2dldERvdWJsZXMoKTtcblxuICB2YXIgbmFmID0gZ2V0TkFGKGssIDEsIHRoaXMuX2JpdExlbmd0aCk7XG4gIHZhciBJID0gKDEgPDwgKGRvdWJsZXMuc3RlcCArIDEpKSAtIChkb3VibGVzLnN0ZXAgJSAyID09PSAwID8gMiA6IDEpO1xuICBJIC89IDM7XG5cbiAgLy8gVHJhbnNsYXRlIGludG8gbW9yZSB3aW5kb3dlZCBmb3JtXG4gIHZhciByZXByID0gW107XG4gIHZhciBqO1xuICB2YXIgbmFmVztcbiAgZm9yIChqID0gMDsgaiA8IG5hZi5sZW5ndGg7IGogKz0gZG91Ymxlcy5zdGVwKSB7XG4gICAgbmFmVyA9IDA7XG4gICAgZm9yICh2YXIgbCA9IGogKyBkb3VibGVzLnN0ZXAgLSAxOyBsID49IGo7IGwtLSlcbiAgICAgIG5hZlcgPSAobmFmVyA8PCAxKSArIG5hZltsXTtcbiAgICByZXByLnB1c2gobmFmVyk7XG4gIH1cblxuICB2YXIgYSA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICB2YXIgYiA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICBmb3IgKHZhciBpID0gSTsgaSA+IDA7IGktLSkge1xuICAgIGZvciAoaiA9IDA7IGogPCByZXByLmxlbmd0aDsgaisrKSB7XG4gICAgICBuYWZXID0gcmVwcltqXTtcbiAgICAgIGlmIChuYWZXID09PSBpKVxuICAgICAgICBiID0gYi5taXhlZEFkZChkb3VibGVzLnBvaW50c1tqXSk7XG4gICAgICBlbHNlIGlmIChuYWZXID09PSAtaSlcbiAgICAgICAgYiA9IGIubWl4ZWRBZGQoZG91Ymxlcy5wb2ludHNbal0ubmVnKCkpO1xuICAgIH1cbiAgICBhID0gYS5hZGQoYik7XG4gIH1cbiAgcmV0dXJuIGEudG9QKCk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLl93bmFmTXVsID0gZnVuY3Rpb24gX3duYWZNdWwocCwgaykge1xuICB2YXIgdyA9IDQ7XG5cbiAgLy8gUHJlY29tcHV0ZSB3aW5kb3dcbiAgdmFyIG5hZlBvaW50cyA9IHAuX2dldE5BRlBvaW50cyh3KTtcbiAgdyA9IG5hZlBvaW50cy53bmQ7XG4gIHZhciB3bmQgPSBuYWZQb2ludHMucG9pbnRzO1xuXG4gIC8vIEdldCBOQUYgZm9ybVxuICB2YXIgbmFmID0gZ2V0TkFGKGssIHcsIHRoaXMuX2JpdExlbmd0aCk7XG5cbiAgLy8gQWRkIGB0aGlzYCooTisxKSBmb3IgZXZlcnkgdy1OQUYgaW5kZXhcbiAgdmFyIGFjYyA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICBmb3IgKHZhciBpID0gbmFmLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgLy8gQ291bnQgemVyb2VzXG4gICAgZm9yICh2YXIgbCA9IDA7IGkgPj0gMCAmJiBuYWZbaV0gPT09IDA7IGktLSlcbiAgICAgIGwrKztcbiAgICBpZiAoaSA+PSAwKVxuICAgICAgbCsrO1xuICAgIGFjYyA9IGFjYy5kYmxwKGwpO1xuXG4gICAgaWYgKGkgPCAwKVxuICAgICAgYnJlYWs7XG4gICAgdmFyIHogPSBuYWZbaV07XG4gICAgYXNzZXJ0KHogIT09IDApO1xuICAgIGlmIChwLnR5cGUgPT09ICdhZmZpbmUnKSB7XG4gICAgICAvLyBKICstIFBcbiAgICAgIGlmICh6ID4gMClcbiAgICAgICAgYWNjID0gYWNjLm1peGVkQWRkKHduZFsoeiAtIDEpID4+IDFdKTtcbiAgICAgIGVsc2VcbiAgICAgICAgYWNjID0gYWNjLm1peGVkQWRkKHduZFsoLXogLSAxKSA+PiAxXS5uZWcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEogKy0gSlxuICAgICAgaWYgKHogPiAwKVxuICAgICAgICBhY2MgPSBhY2MuYWRkKHduZFsoeiAtIDEpID4+IDFdKTtcbiAgICAgIGVsc2VcbiAgICAgICAgYWNjID0gYWNjLmFkZCh3bmRbKC16IC0gMSkgPj4gMV0ubmVnKCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcC50eXBlID09PSAnYWZmaW5lJyA/IGFjYy50b1AoKSA6IGFjYztcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUuX3duYWZNdWxBZGQgPSBmdW5jdGlvbiBfd25hZk11bEFkZChkZWZXLFxuICBwb2ludHMsXG4gIGNvZWZmcyxcbiAgbGVuLFxuICBqYWNvYmlhblJlc3VsdCkge1xuICB2YXIgd25kV2lkdGggPSB0aGlzLl93bmFmVDE7XG4gIHZhciB3bmQgPSB0aGlzLl93bmFmVDI7XG4gIHZhciBuYWYgPSB0aGlzLl93bmFmVDM7XG5cbiAgLy8gRmlsbCBhbGwgYXJyYXlzXG4gIHZhciBtYXggPSAwO1xuICB2YXIgaTtcbiAgdmFyIGo7XG4gIHZhciBwO1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBwID0gcG9pbnRzW2ldO1xuICAgIHZhciBuYWZQb2ludHMgPSBwLl9nZXROQUZQb2ludHMoZGVmVyk7XG4gICAgd25kV2lkdGhbaV0gPSBuYWZQb2ludHMud25kO1xuICAgIHduZFtpXSA9IG5hZlBvaW50cy5wb2ludHM7XG4gIH1cblxuICAvLyBDb21iIHNtYWxsIHdpbmRvdyBOQUZzXG4gIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMTsgaSAtPSAyKSB7XG4gICAgdmFyIGEgPSBpIC0gMTtcbiAgICB2YXIgYiA9IGk7XG4gICAgaWYgKHduZFdpZHRoW2FdICE9PSAxIHx8IHduZFdpZHRoW2JdICE9PSAxKSB7XG4gICAgICBuYWZbYV0gPSBnZXROQUYoY29lZmZzW2FdLCB3bmRXaWR0aFthXSwgdGhpcy5fYml0TGVuZ3RoKTtcbiAgICAgIG5hZltiXSA9IGdldE5BRihjb2VmZnNbYl0sIHduZFdpZHRoW2JdLCB0aGlzLl9iaXRMZW5ndGgpO1xuICAgICAgbWF4ID0gTWF0aC5tYXgobmFmW2FdLmxlbmd0aCwgbWF4KTtcbiAgICAgIG1heCA9IE1hdGgubWF4KG5hZltiXS5sZW5ndGgsIG1heCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgY29tYiA9IFtcbiAgICAgIHBvaW50c1thXSwgLyogMSAqL1xuICAgICAgbnVsbCwgLyogMyAqL1xuICAgICAgbnVsbCwgLyogNSAqL1xuICAgICAgcG9pbnRzW2JdLCAvKiA3ICovXG4gICAgXTtcblxuICAgIC8vIFRyeSB0byBhdm9pZCBQcm9qZWN0aXZlIHBvaW50cywgaWYgcG9zc2libGVcbiAgICBpZiAocG9pbnRzW2FdLnkuY21wKHBvaW50c1tiXS55KSA9PT0gMCkge1xuICAgICAgY29tYlsxXSA9IHBvaW50c1thXS5hZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdLm5lZygpKTtcbiAgICB9IGVsc2UgaWYgKHBvaW50c1thXS55LmNtcChwb2ludHNbYl0ueS5yZWROZWcoKSkgPT09IDApIHtcbiAgICAgIGNvbWJbMV0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0uYWRkKHBvaW50c1tiXS5uZWcoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbWJbMV0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdKTtcbiAgICAgIGNvbWJbMl0gPSBwb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdLm5lZygpKTtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSBbXG4gICAgICAtMywgLyogLTEgLTEgKi9cbiAgICAgIC0xLCAvKiAtMSAwICovXG4gICAgICAtNSwgLyogLTEgMSAqL1xuICAgICAgLTcsIC8qIDAgLTEgKi9cbiAgICAgIDAsIC8qIDAgMCAqL1xuICAgICAgNywgLyogMCAxICovXG4gICAgICA1LCAvKiAxIC0xICovXG4gICAgICAxLCAvKiAxIDAgKi9cbiAgICAgIDMsICAvKiAxIDEgKi9cbiAgICBdO1xuXG4gICAgdmFyIGpzZiA9IGdldEpTRihjb2VmZnNbYV0sIGNvZWZmc1tiXSk7XG4gICAgbWF4ID0gTWF0aC5tYXgoanNmWzBdLmxlbmd0aCwgbWF4KTtcbiAgICBuYWZbYV0gPSBuZXcgQXJyYXkobWF4KTtcbiAgICBuYWZbYl0gPSBuZXcgQXJyYXkobWF4KTtcbiAgICBmb3IgKGogPSAwOyBqIDwgbWF4OyBqKyspIHtcbiAgICAgIHZhciBqYSA9IGpzZlswXVtqXSB8IDA7XG4gICAgICB2YXIgamIgPSBqc2ZbMV1bal0gfCAwO1xuXG4gICAgICBuYWZbYV1bal0gPSBpbmRleFsoamEgKyAxKSAqIDMgKyAoamIgKyAxKV07XG4gICAgICBuYWZbYl1bal0gPSAwO1xuICAgICAgd25kW2FdID0gY29tYjtcbiAgICB9XG4gIH1cblxuICB2YXIgYWNjID0gdGhpcy5qcG9pbnQobnVsbCwgbnVsbCwgbnVsbCk7XG4gIHZhciB0bXAgPSB0aGlzLl93bmFmVDQ7XG4gIGZvciAoaSA9IG1heDsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgayA9IDA7XG5cbiAgICB3aGlsZSAoaSA+PSAwKSB7XG4gICAgICB2YXIgemVybyA9IHRydWU7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgdG1wW2pdID0gbmFmW2pdW2ldIHwgMDtcbiAgICAgICAgaWYgKHRtcFtqXSAhPT0gMClcbiAgICAgICAgICB6ZXJvID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIXplcm8pXG4gICAgICAgIGJyZWFrO1xuICAgICAgaysrO1xuICAgICAgaS0tO1xuICAgIH1cbiAgICBpZiAoaSA+PSAwKVxuICAgICAgaysrO1xuICAgIGFjYyA9IGFjYy5kYmxwKGspO1xuICAgIGlmIChpIDwgMClcbiAgICAgIGJyZWFrO1xuXG4gICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICB2YXIgeiA9IHRtcFtqXTtcbiAgICAgIHA7XG4gICAgICBpZiAoeiA9PT0gMClcbiAgICAgICAgY29udGludWU7XG4gICAgICBlbHNlIGlmICh6ID4gMClcbiAgICAgICAgcCA9IHduZFtqXVsoeiAtIDEpID4+IDFdO1xuICAgICAgZWxzZSBpZiAoeiA8IDApXG4gICAgICAgIHAgPSB3bmRbal1bKC16IC0gMSkgPj4gMV0ubmVnKCk7XG5cbiAgICAgIGlmIChwLnR5cGUgPT09ICdhZmZpbmUnKVxuICAgICAgICBhY2MgPSBhY2MubWl4ZWRBZGQocCk7XG4gICAgICBlbHNlXG4gICAgICAgIGFjYyA9IGFjYy5hZGQocCk7XG4gICAgfVxuICB9XG4gIC8vIFplcm9pZnkgcmVmZXJlbmNlc1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgd25kW2ldID0gbnVsbDtcblxuICBpZiAoamFjb2JpYW5SZXN1bHQpXG4gICAgcmV0dXJuIGFjYztcbiAgZWxzZVxuICAgIHJldHVybiBhY2MudG9QKCk7XG59O1xuXG5mdW5jdGlvbiBCYXNlUG9pbnQoY3VydmUsIHR5cGUpIHtcbiAgdGhpcy5jdXJ2ZSA9IGN1cnZlO1xuICB0aGlzLnR5cGUgPSB0eXBlO1xuICB0aGlzLnByZWNvbXB1dGVkID0gbnVsbDtcbn1cbkJhc2VDdXJ2ZS5CYXNlUG9pbnQgPSBCYXNlUG9pbnQ7XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcSgvKm90aGVyKi8pIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUudmFsaWRhdGUodGhpcyk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLmRlY29kZVBvaW50ID0gZnVuY3Rpb24gZGVjb2RlUG9pbnQoYnl0ZXMsIGVuYykge1xuICBieXRlcyA9IHV0aWxzLnRvQXJyYXkoYnl0ZXMsIGVuYyk7XG5cbiAgdmFyIGxlbiA9IHRoaXMucC5ieXRlTGVuZ3RoKCk7XG5cbiAgLy8gdW5jb21wcmVzc2VkLCBoeWJyaWQtb2RkLCBoeWJyaWQtZXZlblxuICBpZiAoKGJ5dGVzWzBdID09PSAweDA0IHx8IGJ5dGVzWzBdID09PSAweDA2IHx8IGJ5dGVzWzBdID09PSAweDA3KSAmJlxuICAgICAgYnl0ZXMubGVuZ3RoIC0gMSA9PT0gMiAqIGxlbikge1xuICAgIGlmIChieXRlc1swXSA9PT0gMHgwNilcbiAgICAgIGFzc2VydChieXRlc1tieXRlcy5sZW5ndGggLSAxXSAlIDIgPT09IDApO1xuICAgIGVsc2UgaWYgKGJ5dGVzWzBdID09PSAweDA3KVxuICAgICAgYXNzZXJ0KGJ5dGVzW2J5dGVzLmxlbmd0aCAtIDFdICUgMiA9PT0gMSk7XG5cbiAgICB2YXIgcmVzID0gIHRoaXMucG9pbnQoYnl0ZXMuc2xpY2UoMSwgMSArIGxlbiksXG4gICAgICBieXRlcy5zbGljZSgxICsgbGVuLCAxICsgMiAqIGxlbikpO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfSBlbHNlIGlmICgoYnl0ZXNbMF0gPT09IDB4MDIgfHwgYnl0ZXNbMF0gPT09IDB4MDMpICYmXG4gICAgICAgICAgICAgIGJ5dGVzLmxlbmd0aCAtIDEgPT09IGxlbikge1xuICAgIHJldHVybiB0aGlzLnBvaW50RnJvbVgoYnl0ZXMuc2xpY2UoMSwgMSArIGxlbiksIGJ5dGVzWzBdID09PSAweDAzKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gcG9pbnQgZm9ybWF0Jyk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmVuY29kZUNvbXByZXNzZWQgPSBmdW5jdGlvbiBlbmNvZGVDb21wcmVzc2VkKGVuYykge1xuICByZXR1cm4gdGhpcy5lbmNvZGUoZW5jLCB0cnVlKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2VuY29kZSA9IGZ1bmN0aW9uIF9lbmNvZGUoY29tcGFjdCkge1xuICB2YXIgbGVuID0gdGhpcy5jdXJ2ZS5wLmJ5dGVMZW5ndGgoKTtcbiAgdmFyIHggPSB0aGlzLmdldFgoKS50b0FycmF5KCdiZScsIGxlbik7XG5cbiAgaWYgKGNvbXBhY3QpXG4gICAgcmV0dXJuIFsgdGhpcy5nZXRZKCkuaXNFdmVuKCkgPyAweDAyIDogMHgwMyBdLmNvbmNhdCh4KTtcblxuICByZXR1cm4gWyAweDA0IF0uY29uY2F0KHgsIHRoaXMuZ2V0WSgpLnRvQXJyYXkoJ2JlJywgbGVuKSk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShlbmMsIGNvbXBhY3QpIHtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZSh0aGlzLl9lbmNvZGUoY29tcGFjdCksIGVuYyk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLnByZWNvbXB1dGUgPSBmdW5jdGlvbiBwcmVjb21wdXRlKHBvd2VyKSB7XG4gIGlmICh0aGlzLnByZWNvbXB1dGVkKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIHZhciBwcmVjb21wdXRlZCA9IHtcbiAgICBkb3VibGVzOiBudWxsLFxuICAgIG5hZjogbnVsbCxcbiAgICBiZXRhOiBudWxsLFxuICB9O1xuICBwcmVjb21wdXRlZC5uYWYgPSB0aGlzLl9nZXROQUZQb2ludHMoOCk7XG4gIHByZWNvbXB1dGVkLmRvdWJsZXMgPSB0aGlzLl9nZXREb3VibGVzKDQsIHBvd2VyKTtcbiAgcHJlY29tcHV0ZWQuYmV0YSA9IHRoaXMuX2dldEJldGEoKTtcbiAgdGhpcy5wcmVjb21wdXRlZCA9IHByZWNvbXB1dGVkO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5faGFzRG91YmxlcyA9IGZ1bmN0aW9uIF9oYXNEb3VibGVzKGspIHtcbiAgaWYgKCF0aGlzLnByZWNvbXB1dGVkKVxuICAgIHJldHVybiBmYWxzZTtcblxuICB2YXIgZG91YmxlcyA9IHRoaXMucHJlY29tcHV0ZWQuZG91YmxlcztcbiAgaWYgKCFkb3VibGVzKVxuICAgIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gZG91Ymxlcy5wb2ludHMubGVuZ3RoID49IE1hdGguY2VpbCgoay5iaXRMZW5ndGgoKSArIDEpIC8gZG91Ymxlcy5zdGVwKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2dldERvdWJsZXMgPSBmdW5jdGlvbiBfZ2V0RG91YmxlcyhzdGVwLCBwb3dlcikge1xuICBpZiAodGhpcy5wcmVjb21wdXRlZCAmJiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMpXG4gICAgcmV0dXJuIHRoaXMucHJlY29tcHV0ZWQuZG91YmxlcztcblxuICB2YXIgZG91YmxlcyA9IFsgdGhpcyBdO1xuICB2YXIgYWNjID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3dlcjsgaSArPSBzdGVwKSB7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzdGVwOyBqKyspXG4gICAgICBhY2MgPSBhY2MuZGJsKCk7XG4gICAgZG91Ymxlcy5wdXNoKGFjYyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzdGVwOiBzdGVwLFxuICAgIHBvaW50czogZG91YmxlcyxcbiAgfTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2dldE5BRlBvaW50cyA9IGZ1bmN0aW9uIF9nZXROQUZQb2ludHMod25kKSB7XG4gIGlmICh0aGlzLnByZWNvbXB1dGVkICYmIHRoaXMucHJlY29tcHV0ZWQubmFmKVxuICAgIHJldHVybiB0aGlzLnByZWNvbXB1dGVkLm5hZjtcblxuICB2YXIgcmVzID0gWyB0aGlzIF07XG4gIHZhciBtYXggPSAoMSA8PCB3bmQpIC0gMTtcbiAgdmFyIGRibCA9IG1heCA9PT0gMSA/IG51bGwgOiB0aGlzLmRibCgpO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IG1heDsgaSsrKVxuICAgIHJlc1tpXSA9IHJlc1tpIC0gMV0uYWRkKGRibCk7XG4gIHJldHVybiB7XG4gICAgd25kOiB3bmQsXG4gICAgcG9pbnRzOiByZXMsXG4gIH07XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9nZXRCZXRhID0gZnVuY3Rpb24gX2dldEJldGEoKSB7XG4gIHJldHVybiBudWxsO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5kYmxwID0gZnVuY3Rpb24gZGJscChrKSB7XG4gIHZhciByID0gdGhpcztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrOyBpKyspXG4gICAgciA9IHIuZGJsKCk7XG4gIHJldHVybiByO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG52YXIgQmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xuXG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xuXG5mdW5jdGlvbiBTaG9ydEN1cnZlKGNvbmYpIHtcbiAgQmFzZS5jYWxsKHRoaXMsICdzaG9ydCcsIGNvbmYpO1xuXG4gIHRoaXMuYSA9IG5ldyBCTihjb25mLmEsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYiA9IG5ldyBCTihjb25mLmIsIDE2KS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMudGludiA9IHRoaXMudHdvLnJlZEludm0oKTtcblxuICB0aGlzLnplcm9BID0gdGhpcy5hLmZyb21SZWQoKS5jbXBuKDApID09PSAwO1xuICB0aGlzLnRocmVlQSA9IHRoaXMuYS5mcm9tUmVkKCkuc3ViKHRoaXMucCkuY21wbigtMykgPT09IDA7XG5cbiAgLy8gSWYgdGhlIGN1cnZlIGlzIGVuZG9tb3JwaGljLCBwcmVjYWxjdWxhdGUgYmV0YSBhbmQgbGFtYmRhXG4gIHRoaXMuZW5kbyA9IHRoaXMuX2dldEVuZG9tb3JwaGlzbShjb25mKTtcbiAgdGhpcy5fZW5kb1duYWZUMSA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fZW5kb1duYWZUMiA9IG5ldyBBcnJheSg0KTtcbn1cbmluaGVyaXRzKFNob3J0Q3VydmUsIEJhc2UpO1xubW9kdWxlLmV4cG9ydHMgPSBTaG9ydEN1cnZlO1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZ2V0RW5kb21vcnBoaXNtID0gZnVuY3Rpb24gX2dldEVuZG9tb3JwaGlzbShjb25mKSB7XG4gIC8vIE5vIGVmZmljaWVudCBlbmRvbW9ycGhpc21cbiAgaWYgKCF0aGlzLnplcm9BIHx8ICF0aGlzLmcgfHwgIXRoaXMubiB8fCB0aGlzLnAubW9kbigzKSAhPT0gMSlcbiAgICByZXR1cm47XG5cbiAgLy8gQ29tcHV0ZSBiZXRhIGFuZCBsYW1iZGEsIHRoYXQgbGFtYmRhICogUCA9IChiZXRhICogUHg7IFB5KVxuICB2YXIgYmV0YTtcbiAgdmFyIGxhbWJkYTtcbiAgaWYgKGNvbmYuYmV0YSkge1xuICAgIGJldGEgPSBuZXcgQk4oY29uZi5iZXRhLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB9IGVsc2Uge1xuICAgIHZhciBiZXRhcyA9IHRoaXMuX2dldEVuZG9Sb290cyh0aGlzLnApO1xuICAgIC8vIENob29zZSB0aGUgc21hbGxlc3QgYmV0YVxuICAgIGJldGEgPSBiZXRhc1swXS5jbXAoYmV0YXNbMV0pIDwgMCA/IGJldGFzWzBdIDogYmV0YXNbMV07XG4gICAgYmV0YSA9IGJldGEudG9SZWQodGhpcy5yZWQpO1xuICB9XG4gIGlmIChjb25mLmxhbWJkYSkge1xuICAgIGxhbWJkYSA9IG5ldyBCTihjb25mLmxhbWJkYSwgMTYpO1xuICB9IGVsc2Uge1xuICAgIC8vIENob29zZSB0aGUgbGFtYmRhIHRoYXQgaXMgbWF0Y2hpbmcgc2VsZWN0ZWQgYmV0YVxuICAgIHZhciBsYW1iZGFzID0gdGhpcy5fZ2V0RW5kb1Jvb3RzKHRoaXMubik7XG4gICAgaWYgKHRoaXMuZy5tdWwobGFtYmRhc1swXSkueC5jbXAodGhpcy5nLngucmVkTXVsKGJldGEpKSA9PT0gMCkge1xuICAgICAgbGFtYmRhID0gbGFtYmRhc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFtYmRhID0gbGFtYmRhc1sxXTtcbiAgICAgIGFzc2VydCh0aGlzLmcubXVsKGxhbWJkYSkueC5jbXAodGhpcy5nLngucmVkTXVsKGJldGEpKSA9PT0gMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gR2V0IGJhc2lzIHZlY3RvcnMsIHVzZWQgZm9yIGJhbGFuY2VkIGxlbmd0aC10d28gcmVwcmVzZW50YXRpb25cbiAgdmFyIGJhc2lzO1xuICBpZiAoY29uZi5iYXNpcykge1xuICAgIGJhc2lzID0gY29uZi5iYXNpcy5tYXAoZnVuY3Rpb24odmVjKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhOiBuZXcgQk4odmVjLmEsIDE2KSxcbiAgICAgICAgYjogbmV3IEJOKHZlYy5iLCAxNiksXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGJhc2lzID0gdGhpcy5fZ2V0RW5kb0Jhc2lzKGxhbWJkYSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJldGE6IGJldGEsXG4gICAgbGFtYmRhOiBsYW1iZGEsXG4gICAgYmFzaXM6IGJhc2lzLFxuICB9O1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2dldEVuZG9Sb290cyA9IGZ1bmN0aW9uIF9nZXRFbmRvUm9vdHMobnVtKSB7XG4gIC8vIEZpbmQgcm9vdHMgb2YgZm9yIHheMiArIHggKyAxIGluIEZcbiAgLy8gUm9vdCA9ICgtMSArLSBTcXJ0KC0zKSkgLyAyXG4gIC8vXG4gIHZhciByZWQgPSBudW0gPT09IHRoaXMucCA/IHRoaXMucmVkIDogQk4ubW9udChudW0pO1xuICB2YXIgdGludiA9IG5ldyBCTigyKS50b1JlZChyZWQpLnJlZEludm0oKTtcbiAgdmFyIG50aW52ID0gdGludi5yZWROZWcoKTtcblxuICB2YXIgcyA9IG5ldyBCTigzKS50b1JlZChyZWQpLnJlZE5lZygpLnJlZFNxcnQoKS5yZWRNdWwodGludik7XG5cbiAgdmFyIGwxID0gbnRpbnYucmVkQWRkKHMpLmZyb21SZWQoKTtcbiAgdmFyIGwyID0gbnRpbnYucmVkU3ViKHMpLmZyb21SZWQoKTtcbiAgcmV0dXJuIFsgbDEsIGwyIF07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZ2V0RW5kb0Jhc2lzID0gZnVuY3Rpb24gX2dldEVuZG9CYXNpcyhsYW1iZGEpIHtcbiAgLy8gYXByeFNxcnQgPj0gc3FydCh0aGlzLm4pXG4gIHZhciBhcHJ4U3FydCA9IHRoaXMubi51c2hybihNYXRoLmZsb29yKHRoaXMubi5iaXRMZW5ndGgoKSAvIDIpKTtcblxuICAvLyAzLjc0XG4gIC8vIFJ1biBFR0NELCB1bnRpbCByKEwgKyAxKSA8IGFwcnhTcXJ0XG4gIHZhciB1ID0gbGFtYmRhO1xuICB2YXIgdiA9IHRoaXMubi5jbG9uZSgpO1xuICB2YXIgeDEgPSBuZXcgQk4oMSk7XG4gIHZhciB5MSA9IG5ldyBCTigwKTtcbiAgdmFyIHgyID0gbmV3IEJOKDApO1xuICB2YXIgeTIgPSBuZXcgQk4oMSk7XG5cbiAgLy8gTk9URTogYWxsIHZlY3RvcnMgYXJlIHJvb3RzIG9mOiBhICsgYiAqIGxhbWJkYSA9IDAgKG1vZCBuKVxuICB2YXIgYTA7XG4gIHZhciBiMDtcbiAgLy8gRmlyc3QgdmVjdG9yXG4gIHZhciBhMTtcbiAgdmFyIGIxO1xuICAvLyBTZWNvbmQgdmVjdG9yXG4gIHZhciBhMjtcbiAgdmFyIGIyO1xuXG4gIHZhciBwcmV2UjtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcjtcbiAgdmFyIHg7XG4gIHdoaWxlICh1LmNtcG4oMCkgIT09IDApIHtcbiAgICB2YXIgcSA9IHYuZGl2KHUpO1xuICAgIHIgPSB2LnN1YihxLm11bCh1KSk7XG4gICAgeCA9IHgyLnN1YihxLm11bCh4MSkpO1xuICAgIHZhciB5ID0geTIuc3ViKHEubXVsKHkxKSk7XG5cbiAgICBpZiAoIWExICYmIHIuY21wKGFwcnhTcXJ0KSA8IDApIHtcbiAgICAgIGEwID0gcHJldlIubmVnKCk7XG4gICAgICBiMCA9IHgxO1xuICAgICAgYTEgPSByLm5lZygpO1xuICAgICAgYjEgPSB4O1xuICAgIH0gZWxzZSBpZiAoYTEgJiYgKytpID09PSAyKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcHJldlIgPSByO1xuXG4gICAgdiA9IHU7XG4gICAgdSA9IHI7XG4gICAgeDIgPSB4MTtcbiAgICB4MSA9IHg7XG4gICAgeTIgPSB5MTtcbiAgICB5MSA9IHk7XG4gIH1cbiAgYTIgPSByLm5lZygpO1xuICBiMiA9IHg7XG5cbiAgdmFyIGxlbjEgPSBhMS5zcXIoKS5hZGQoYjEuc3FyKCkpO1xuICB2YXIgbGVuMiA9IGEyLnNxcigpLmFkZChiMi5zcXIoKSk7XG4gIGlmIChsZW4yLmNtcChsZW4xKSA+PSAwKSB7XG4gICAgYTIgPSBhMDtcbiAgICBiMiA9IGIwO1xuICB9XG5cbiAgLy8gTm9ybWFsaXplIHNpZ25zXG4gIGlmIChhMS5uZWdhdGl2ZSkge1xuICAgIGExID0gYTEubmVnKCk7XG4gICAgYjEgPSBiMS5uZWcoKTtcbiAgfVxuICBpZiAoYTIubmVnYXRpdmUpIHtcbiAgICBhMiA9IGEyLm5lZygpO1xuICAgIGIyID0gYjIubmVnKCk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIHsgYTogYTEsIGI6IGIxIH0sXG4gICAgeyBhOiBhMiwgYjogYjIgfSxcbiAgXTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9lbmRvU3BsaXQgPSBmdW5jdGlvbiBfZW5kb1NwbGl0KGspIHtcbiAgdmFyIGJhc2lzID0gdGhpcy5lbmRvLmJhc2lzO1xuICB2YXIgdjEgPSBiYXNpc1swXTtcbiAgdmFyIHYyID0gYmFzaXNbMV07XG5cbiAgdmFyIGMxID0gdjIuYi5tdWwoaykuZGl2Um91bmQodGhpcy5uKTtcbiAgdmFyIGMyID0gdjEuYi5uZWcoKS5tdWwoaykuZGl2Um91bmQodGhpcy5uKTtcblxuICB2YXIgcDEgPSBjMS5tdWwodjEuYSk7XG4gIHZhciBwMiA9IGMyLm11bCh2Mi5hKTtcbiAgdmFyIHExID0gYzEubXVsKHYxLmIpO1xuICB2YXIgcTIgPSBjMi5tdWwodjIuYik7XG5cbiAgLy8gQ2FsY3VsYXRlIGFuc3dlclxuICB2YXIgazEgPSBrLnN1YihwMSkuc3ViKHAyKTtcbiAgdmFyIGsyID0gcTEuYWRkKHEyKS5uZWcoKTtcbiAgcmV0dXJuIHsgazE6IGsxLCBrMjogazIgfTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnBvaW50RnJvbVggPSBmdW5jdGlvbiBwb2ludEZyb21YKHgsIG9kZCkge1xuICB4ID0gbmV3IEJOKHgsIDE2KTtcbiAgaWYgKCF4LnJlZClcbiAgICB4ID0geC50b1JlZCh0aGlzLnJlZCk7XG5cbiAgdmFyIHkyID0geC5yZWRTcXIoKS5yZWRNdWwoeCkucmVkSUFkZCh4LnJlZE11bCh0aGlzLmEpKS5yZWRJQWRkKHRoaXMuYik7XG4gIHZhciB5ID0geTIucmVkU3FydCgpO1xuICBpZiAoeS5yZWRTcXIoKS5yZWRTdWIoeTIpLmNtcCh0aGlzLnplcm8pICE9PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuXG4gIC8vIFhYWCBJcyB0aGVyZSBhbnkgd2F5IHRvIHRlbGwgaWYgdGhlIG51bWJlciBpcyBvZGQgd2l0aG91dCBjb252ZXJ0aW5nIGl0XG4gIC8vIHRvIG5vbi1yZWQgZm9ybT9cbiAgdmFyIGlzT2RkID0geS5mcm9tUmVkKCkuaXNPZGQoKTtcbiAgaWYgKG9kZCAmJiAhaXNPZGQgfHwgIW9kZCAmJiBpc09kZClcbiAgICB5ID0geS5yZWROZWcoKTtcblxuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5KTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpIHtcbiAgaWYgKHBvaW50LmluZilcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB2YXIgeCA9IHBvaW50Lng7XG4gIHZhciB5ID0gcG9pbnQueTtcblxuICB2YXIgYXggPSB0aGlzLmEucmVkTXVsKHgpO1xuICB2YXIgcmhzID0geC5yZWRTcXIoKS5yZWRNdWwoeCkucmVkSUFkZChheCkucmVkSUFkZCh0aGlzLmIpO1xuICByZXR1cm4geS5yZWRTcXIoKS5yZWRJU3ViKHJocykuY21wbigwKSA9PT0gMDtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9lbmRvV25hZk11bEFkZCA9XG4gICAgZnVuY3Rpb24gX2VuZG9XbmFmTXVsQWRkKHBvaW50cywgY29lZmZzLCBqYWNvYmlhblJlc3VsdCkge1xuICAgICAgdmFyIG5wb2ludHMgPSB0aGlzLl9lbmRvV25hZlQxO1xuICAgICAgdmFyIG5jb2VmZnMgPSB0aGlzLl9lbmRvV25hZlQyO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNwbGl0ID0gdGhpcy5fZW5kb1NwbGl0KGNvZWZmc1tpXSk7XG4gICAgICAgIHZhciBwID0gcG9pbnRzW2ldO1xuICAgICAgICB2YXIgYmV0YSA9IHAuX2dldEJldGEoKTtcblxuICAgICAgICBpZiAoc3BsaXQuazEubmVnYXRpdmUpIHtcbiAgICAgICAgICBzcGxpdC5rMS5pbmVnKCk7XG4gICAgICAgICAgcCA9IHAubmVnKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGxpdC5rMi5uZWdhdGl2ZSkge1xuICAgICAgICAgIHNwbGl0LmsyLmluZWcoKTtcbiAgICAgICAgICBiZXRhID0gYmV0YS5uZWcodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBucG9pbnRzW2kgKiAyXSA9IHA7XG4gICAgICAgIG5wb2ludHNbaSAqIDIgKyAxXSA9IGJldGE7XG4gICAgICAgIG5jb2VmZnNbaSAqIDJdID0gc3BsaXQuazE7XG4gICAgICAgIG5jb2VmZnNbaSAqIDIgKyAxXSA9IHNwbGl0LmsyO1xuICAgICAgfVxuICAgICAgdmFyIHJlcyA9IHRoaXMuX3duYWZNdWxBZGQoMSwgbnBvaW50cywgbmNvZWZmcywgaSAqIDIsIGphY29iaWFuUmVzdWx0KTtcblxuICAgICAgLy8gQ2xlYW4tdXAgcmVmZXJlbmNlcyB0byBwb2ludHMgYW5kIGNvZWZmaWNpZW50c1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpICogMjsgaisrKSB7XG4gICAgICAgIG5wb2ludHNbal0gPSBudWxsO1xuICAgICAgICBuY29lZmZzW2pdID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcblxuZnVuY3Rpb24gUG9pbnQoY3VydmUsIHgsIHksIGlzUmVkKSB7XG4gIEJhc2UuQmFzZVBvaW50LmNhbGwodGhpcywgY3VydmUsICdhZmZpbmUnKTtcbiAgaWYgKHggPT09IG51bGwgJiYgeSA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IG51bGw7XG4gICAgdGhpcy55ID0gbnVsbDtcbiAgICB0aGlzLmluZiA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0gbmV3IEJOKHgsIDE2KTtcbiAgICB0aGlzLnkgPSBuZXcgQk4oeSwgMTYpO1xuICAgIC8vIEZvcmNlIHJlZGdvbWVyeSByZXByZXNlbnRhdGlvbiB3aGVuIGxvYWRpbmcgZnJvbSBKU09OXG4gICAgaWYgKGlzUmVkKSB7XG4gICAgICB0aGlzLnguZm9yY2VSZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgICAgdGhpcy55LmZvcmNlUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLngucmVkKVxuICAgICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMueS5yZWQpXG4gICAgICB0aGlzLnkgPSB0aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIHRoaXMuaW5mID0gZmFsc2U7XG4gIH1cbn1cbmluaGVyaXRzKFBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24gcG9pbnQoeCwgeSwgaXNSZWQpIHtcbiAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLCB4LCB5LCBpc1JlZCk7XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5wb2ludEZyb21KU09OID0gZnVuY3Rpb24gcG9pbnRGcm9tSlNPTihvYmosIHJlZCkge1xuICByZXR1cm4gUG9pbnQuZnJvbUpTT04odGhpcywgb2JqLCByZWQpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9nZXRCZXRhID0gZnVuY3Rpb24gX2dldEJldGEoKSB7XG4gIGlmICghdGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybjtcblxuICB2YXIgcHJlID0gdGhpcy5wcmVjb21wdXRlZDtcbiAgaWYgKHByZSAmJiBwcmUuYmV0YSlcbiAgICByZXR1cm4gcHJlLmJldGE7XG5cbiAgdmFyIGJldGEgPSB0aGlzLmN1cnZlLnBvaW50KHRoaXMueC5yZWRNdWwodGhpcy5jdXJ2ZS5lbmRvLmJldGEpLCB0aGlzLnkpO1xuICBpZiAocHJlKSB7XG4gICAgdmFyIGN1cnZlID0gdGhpcy5jdXJ2ZTtcbiAgICB2YXIgZW5kb011bCA9IGZ1bmN0aW9uKHApIHtcbiAgICAgIHJldHVybiBjdXJ2ZS5wb2ludChwLngucmVkTXVsKGN1cnZlLmVuZG8uYmV0YSksIHAueSk7XG4gICAgfTtcbiAgICBwcmUuYmV0YSA9IGJldGE7XG4gICAgYmV0YS5wcmVjb21wdXRlZCA9IHtcbiAgICAgIGJldGE6IG51bGwsXG4gICAgICBuYWY6IHByZS5uYWYgJiYge1xuICAgICAgICB3bmQ6IHByZS5uYWYud25kLFxuICAgICAgICBwb2ludHM6IHByZS5uYWYucG9pbnRzLm1hcChlbmRvTXVsKSxcbiAgICAgIH0sXG4gICAgICBkb3VibGVzOiBwcmUuZG91YmxlcyAmJiB7XG4gICAgICAgIHN0ZXA6IHByZS5kb3VibGVzLnN0ZXAsXG4gICAgICAgIHBvaW50czogcHJlLmRvdWJsZXMucG9pbnRzLm1hcChlbmRvTXVsKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4gYmV0YTtcbn07XG5cblBvaW50LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7XG4gIGlmICghdGhpcy5wcmVjb21wdXRlZClcbiAgICByZXR1cm4gWyB0aGlzLngsIHRoaXMueSBdO1xuXG4gIHJldHVybiBbIHRoaXMueCwgdGhpcy55LCB0aGlzLnByZWNvbXB1dGVkICYmIHtcbiAgICBkb3VibGVzOiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMgJiYge1xuICAgICAgc3RlcDogdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzLnN0ZXAsXG4gICAgICBwb2ludHM6IHRoaXMucHJlY29tcHV0ZWQuZG91Ymxlcy5wb2ludHMuc2xpY2UoMSksXG4gICAgfSxcbiAgICBuYWY6IHRoaXMucHJlY29tcHV0ZWQubmFmICYmIHtcbiAgICAgIHduZDogdGhpcy5wcmVjb21wdXRlZC5uYWYud25kLFxuICAgICAgcG9pbnRzOiB0aGlzLnByZWNvbXB1dGVkLm5hZi5wb2ludHMuc2xpY2UoMSksXG4gICAgfSxcbiAgfSBdO1xufTtcblxuUG9pbnQuZnJvbUpTT04gPSBmdW5jdGlvbiBmcm9tSlNPTihjdXJ2ZSwgb2JqLCByZWQpIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKVxuICAgIG9iaiA9IEpTT04ucGFyc2Uob2JqKTtcbiAgdmFyIHJlcyA9IGN1cnZlLnBvaW50KG9ialswXSwgb2JqWzFdLCByZWQpO1xuICBpZiAoIW9ialsyXSlcbiAgICByZXR1cm4gcmVzO1xuXG4gIGZ1bmN0aW9uIG9iajJwb2ludChvYmopIHtcbiAgICByZXR1cm4gY3VydmUucG9pbnQob2JqWzBdLCBvYmpbMV0sIHJlZCk7XG4gIH1cblxuICB2YXIgcHJlID0gb2JqWzJdO1xuICByZXMucHJlY29tcHV0ZWQgPSB7XG4gICAgYmV0YTogbnVsbCxcbiAgICBkb3VibGVzOiBwcmUuZG91YmxlcyAmJiB7XG4gICAgICBzdGVwOiBwcmUuZG91Ymxlcy5zdGVwLFxuICAgICAgcG9pbnRzOiBbIHJlcyBdLmNvbmNhdChwcmUuZG91Ymxlcy5wb2ludHMubWFwKG9iajJwb2ludCkpLFxuICAgIH0sXG4gICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgIHduZDogcHJlLm5hZi53bmQsXG4gICAgICBwb2ludHM6IFsgcmVzIF0uY29uY2F0KHByZS5uYWYucG9pbnRzLm1hcChvYmoycG9pbnQpKSxcbiAgICB9LFxuICB9O1xuICByZXR1cm4gcmVzO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgUG9pbnQgSW5maW5pdHk+JztcbiAgcmV0dXJuICc8RUMgUG9pbnQgeDogJyArIHRoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgeTogJyArIHRoaXMueS5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICByZXR1cm4gdGhpcy5pbmY7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKHApIHtcbiAgLy8gTyArIFAgPSBQXG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gcDtcblxuICAvLyBQICsgTyA9IFBcbiAgaWYgKHAuaW5mKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIFAgKyBQID0gMlBcbiAgaWYgKHRoaXMuZXEocCkpXG4gICAgcmV0dXJuIHRoaXMuZGJsKCk7XG5cbiAgLy8gUCArICgtUCkgPSBPXG4gIGlmICh0aGlzLm5lZygpLmVxKHApKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIC8vIFAgKyBRID0gT1xuICBpZiAodGhpcy54LmNtcChwLngpID09PSAwKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIHZhciBjID0gdGhpcy55LnJlZFN1YihwLnkpO1xuICBpZiAoYy5jbXBuKDApICE9PSAwKVxuICAgIGMgPSBjLnJlZE11bCh0aGlzLngucmVkU3ViKHAueCkucmVkSW52bSgpKTtcbiAgdmFyIG54ID0gYy5yZWRTcXIoKS5yZWRJU3ViKHRoaXMueCkucmVkSVN1YihwLngpO1xuICB2YXIgbnkgPSBjLnJlZE11bCh0aGlzLngucmVkU3ViKG54KSkucmVkSVN1Yih0aGlzLnkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgaWYgKHRoaXMuaW5mKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIDJQID0gT1xuICB2YXIgeXMxID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICBpZiAoeXMxLmNtcG4oMCkgPT09IDApXG4gICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7XG5cbiAgdmFyIGEgPSB0aGlzLmN1cnZlLmE7XG5cbiAgdmFyIHgyID0gdGhpcy54LnJlZFNxcigpO1xuICB2YXIgZHlpbnYgPSB5czEucmVkSW52bSgpO1xuICB2YXIgYyA9IHgyLnJlZEFkZCh4MikucmVkSUFkZCh4MikucmVkSUFkZChhKS5yZWRNdWwoZHlpbnYpO1xuXG4gIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0aGlzLngucmVkQWRkKHRoaXMueCkpO1xuICB2YXIgbnkgPSBjLnJlZE11bCh0aGlzLngucmVkU3ViKG54KSkucmVkSVN1Yih0aGlzLnkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbiBnZXRYKCkge1xuICByZXR1cm4gdGhpcy54LmZyb21SZWQoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRZID0gZnVuY3Rpb24gZ2V0WSgpIHtcbiAgcmV0dXJuIHRoaXMueS5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsKGspIHtcbiAgayA9IG5ldyBCTihrLCAxNik7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcbiAgZWxzZSBpZiAodGhpcy5faGFzRG91YmxlcyhrKSlcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZml4ZWROYWZNdWwodGhpcywgayk7XG4gIGVsc2UgaWYgKHRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQoWyB0aGlzIF0sIFsgayBdKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uIG11bEFkZChrMSwgcDIsIGsyKSB7XG4gIHZhciBwb2ludHMgPSBbIHRoaXMsIHAyIF07XG4gIHZhciBjb2VmZnMgPSBbIGsxLCBrMiBdO1xuICBpZiAodGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChwb2ludHMsIGNvZWZmcyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLCBwb2ludHMsIGNvZWZmcywgMik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuam11bEFkZCA9IGZ1bmN0aW9uIGptdWxBZGQoazEsIHAyLCBrMikge1xuICB2YXIgcG9pbnRzID0gWyB0aGlzLCBwMiBdO1xuICB2YXIgY29lZmZzID0gWyBrMSwgazIgXTtcbiAgaWYgKHRoaXMuY3VydmUuZW5kbylcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQocG9pbnRzLCBjb2VmZnMsIHRydWUpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSwgcG9pbnRzLCBjb2VmZnMsIDIsIHRydWUpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEocCkge1xuICByZXR1cm4gdGhpcyA9PT0gcCB8fFxuICAgICAgICAgdGhpcy5pbmYgPT09IHAuaW5mICYmXG4gICAgICAgICAgICAgKHRoaXMuaW5mIHx8IHRoaXMueC5jbXAocC54KSA9PT0gMCAmJiB0aGlzLnkuY21wKHAueSkgPT09IDApO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZyhfcHJlY29tcHV0ZSkge1xuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgdmFyIHJlcyA9IHRoaXMuY3VydmUucG9pbnQodGhpcy54LCB0aGlzLnkucmVkTmVnKCkpO1xuICBpZiAoX3ByZWNvbXB1dGUgJiYgdGhpcy5wcmVjb21wdXRlZCkge1xuICAgIHZhciBwcmUgPSB0aGlzLnByZWNvbXB1dGVkO1xuICAgIHZhciBuZWdhdGUgPSBmdW5jdGlvbihwKSB7XG4gICAgICByZXR1cm4gcC5uZWcoKTtcbiAgICB9O1xuICAgIHJlcy5wcmVjb21wdXRlZCA9IHtcbiAgICAgIG5hZjogcHJlLm5hZiAmJiB7XG4gICAgICAgIHduZDogcHJlLm5hZi53bmQsXG4gICAgICAgIHBvaW50czogcHJlLm5hZi5wb2ludHMubWFwKG5lZ2F0ZSksXG4gICAgICB9LFxuICAgICAgZG91YmxlczogcHJlLmRvdWJsZXMgJiYge1xuICAgICAgICBzdGVwOiBwcmUuZG91Ymxlcy5zdGVwLFxuICAgICAgICBwb2ludHM6IHByZS5kb3VibGVzLnBvaW50cy5tYXAobmVnYXRlKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnRvSiA9IGZ1bmN0aW9uIHRvSigpIHtcbiAgaWYgKHRoaXMuaW5mKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcblxuICB2YXIgcmVzID0gdGhpcy5jdXJ2ZS5qcG9pbnQodGhpcy54LCB0aGlzLnksIHRoaXMuY3VydmUub25lKTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIEpQb2ludChjdXJ2ZSwgeCwgeSwgeikge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAnamFjb2JpYW4nKTtcbiAgaWYgKHggPT09IG51bGwgJiYgeSA9PT0gbnVsbCAmJiB6ID09PSBudWxsKSB7XG4gICAgdGhpcy54ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy55ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy56ID0gbmV3IEJOKDApO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IG5ldyBCTih4LCAxNik7XG4gICAgdGhpcy55ID0gbmV3IEJOKHksIDE2KTtcbiAgICB0aGlzLnogPSBuZXcgQk4oeiwgMTYpO1xuICB9XG4gIGlmICghdGhpcy54LnJlZClcbiAgICB0aGlzLnggPSB0aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICBpZiAoIXRoaXMueS5yZWQpXG4gICAgdGhpcy55ID0gdGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgaWYgKCF0aGlzLnoucmVkKVxuICAgIHRoaXMueiA9IHRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG5cbiAgdGhpcy56T25lID0gdGhpcy56ID09PSB0aGlzLmN1cnZlLm9uZTtcbn1cbmluaGVyaXRzKEpQb2ludCwgQmFzZS5CYXNlUG9pbnQpO1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5qcG9pbnQgPSBmdW5jdGlvbiBqcG9pbnQoeCwgeSwgeikge1xuICByZXR1cm4gbmV3IEpQb2ludCh0aGlzLCB4LCB5LCB6KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUudG9QID0gZnVuY3Rpb24gdG9QKCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7XG5cbiAgdmFyIHppbnYgPSB0aGlzLnoucmVkSW52bSgpO1xuICB2YXIgemludjIgPSB6aW52LnJlZFNxcigpO1xuICB2YXIgYXggPSB0aGlzLngucmVkTXVsKHppbnYyKTtcbiAgdmFyIGF5ID0gdGhpcy55LnJlZE11bCh6aW52MikucmVkTXVsKHppbnYpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KGF4LCBheSk7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZygpIHtcbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KHRoaXMueCwgdGhpcy55LnJlZE5lZygpLCB0aGlzLnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQocCkge1xuICAvLyBPICsgUCA9IFBcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBwO1xuXG4gIC8vIFAgKyBPID0gUFxuICBpZiAocC5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gMTJNICsgNFMgKyA3QVxuICB2YXIgcHoyID0gcC56LnJlZFNxcigpO1xuICB2YXIgejIgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciB1MSA9IHRoaXMueC5yZWRNdWwocHoyKTtcbiAgdmFyIHUyID0gcC54LnJlZE11bCh6Mik7XG4gIHZhciBzMSA9IHRoaXMueS5yZWRNdWwocHoyLnJlZE11bChwLnopKTtcbiAgdmFyIHMyID0gcC55LnJlZE11bCh6Mi5yZWRNdWwodGhpcy56KSk7XG5cbiAgdmFyIGggPSB1MS5yZWRTdWIodTIpO1xuICB2YXIgciA9IHMxLnJlZFN1YihzMik7XG4gIGlmIChoLmNtcG4oMCkgPT09IDApIHtcbiAgICBpZiAoci5jbXBuKDApICE9PSAwKVxuICAgICAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiB0aGlzLmRibCgpO1xuICB9XG5cbiAgdmFyIGgyID0gaC5yZWRTcXIoKTtcbiAgdmFyIGgzID0gaDIucmVkTXVsKGgpO1xuICB2YXIgdiA9IHUxLnJlZE11bChoMik7XG5cbiAgdmFyIG54ID0gci5yZWRTcXIoKS5yZWRJQWRkKGgzKS5yZWRJU3ViKHYpLnJlZElTdWIodik7XG4gIHZhciBueSA9IHIucmVkTXVsKHYucmVkSVN1YihueCkpLnJlZElTdWIoczEucmVkTXVsKGgzKSk7XG4gIHZhciBueiA9IHRoaXMuei5yZWRNdWwocC56KS5yZWRNdWwoaCk7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5taXhlZEFkZCA9IGZ1bmN0aW9uIG1peGVkQWRkKHApIHtcbiAgLy8gTyArIFAgPSBQXG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gcC50b0ooKTtcblxuICAvLyBQICsgTyA9IFBcbiAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIDhNICsgM1MgKyA3QVxuICB2YXIgejIgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciB1MSA9IHRoaXMueDtcbiAgdmFyIHUyID0gcC54LnJlZE11bCh6Mik7XG4gIHZhciBzMSA9IHRoaXMueTtcbiAgdmFyIHMyID0gcC55LnJlZE11bCh6MikucmVkTXVsKHRoaXMueik7XG5cbiAgdmFyIGggPSB1MS5yZWRTdWIodTIpO1xuICB2YXIgciA9IHMxLnJlZFN1YihzMik7XG4gIGlmIChoLmNtcG4oMCkgPT09IDApIHtcbiAgICBpZiAoci5jbXBuKDApICE9PSAwKVxuICAgICAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICAgIGVsc2VcbiAgICAgIHJldHVybiB0aGlzLmRibCgpO1xuICB9XG5cbiAgdmFyIGgyID0gaC5yZWRTcXIoKTtcbiAgdmFyIGgzID0gaDIucmVkTXVsKGgpO1xuICB2YXIgdiA9IHUxLnJlZE11bChoMik7XG5cbiAgdmFyIG54ID0gci5yZWRTcXIoKS5yZWRJQWRkKGgzKS5yZWRJU3ViKHYpLnJlZElTdWIodik7XG4gIHZhciBueSA9IHIucmVkTXVsKHYucmVkSVN1YihueCkpLnJlZElTdWIoczEucmVkTXVsKGgzKSk7XG4gIHZhciBueiA9IHRoaXMuei5yZWRNdWwoaCk7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5kYmxwID0gZnVuY3Rpb24gZGJscChwb3cpIHtcbiAgaWYgKHBvdyA9PT0gMClcbiAgICByZXR1cm4gdGhpcztcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuICBpZiAoIXBvdylcbiAgICByZXR1cm4gdGhpcy5kYmwoKTtcblxuICB2YXIgaTtcbiAgaWYgKHRoaXMuY3VydmUuemVyb0EgfHwgdGhpcy5jdXJ2ZS50aHJlZUEpIHtcbiAgICB2YXIgciA9IHRoaXM7XG4gICAgZm9yIChpID0gMDsgaSA8IHBvdzsgaSsrKVxuICAgICAgciA9IHIuZGJsKCk7XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvLyAxTSArIDJTICsgMUEgKyBOICogKDRTICsgNU0gKyA4QSlcbiAgLy8gTiA9IDEgPT4gNk0gKyA2UyArIDlBXG4gIHZhciBhID0gdGhpcy5jdXJ2ZS5hO1xuICB2YXIgdGludiA9IHRoaXMuY3VydmUudGludjtcblxuICB2YXIganggPSB0aGlzLng7XG4gIHZhciBqeSA9IHRoaXMueTtcbiAgdmFyIGp6ID0gdGhpcy56O1xuICB2YXIgano0ID0ganoucmVkU3FyKCkucmVkU3FyKCk7XG5cbiAgLy8gUmV1c2UgcmVzdWx0c1xuICB2YXIganlkID0gankucmVkQWRkKGp5KTtcbiAgZm9yIChpID0gMDsgaSA8IHBvdzsgaSsrKSB7XG4gICAgdmFyIGp4MiA9IGp4LnJlZFNxcigpO1xuICAgIHZhciBqeWQyID0ganlkLnJlZFNxcigpO1xuICAgIHZhciBqeWQ0ID0ganlkMi5yZWRTcXIoKTtcbiAgICB2YXIgYyA9IGp4Mi5yZWRBZGQoangyKS5yZWRJQWRkKGp4MikucmVkSUFkZChhLnJlZE11bChqejQpKTtcblxuICAgIHZhciB0MSA9IGp4LnJlZE11bChqeWQyKTtcbiAgICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodDEucmVkQWRkKHQxKSk7XG4gICAgdmFyIHQyID0gdDEucmVkSVN1YihueCk7XG4gICAgdmFyIGRueSA9IGMucmVkTXVsKHQyKTtcbiAgICBkbnkgPSBkbnkucmVkSUFkZChkbnkpLnJlZElTdWIoanlkNCk7XG4gICAgdmFyIG56ID0ganlkLnJlZE11bChqeik7XG4gICAgaWYgKGkgKyAxIDwgcG93KVxuICAgICAgano0ID0gano0LnJlZE11bChqeWQ0KTtcblxuICAgIGp4ID0gbng7XG4gICAganogPSBuejtcbiAgICBqeWQgPSBkbnk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQoangsIGp5ZC5yZWRNdWwodGludiksIGp6KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24gZGJsKCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgaWYgKHRoaXMuY3VydmUuemVyb0EpXG4gICAgcmV0dXJuIHRoaXMuX3plcm9EYmwoKTtcbiAgZWxzZSBpZiAodGhpcy5jdXJ2ZS50aHJlZUEpXG4gICAgcmV0dXJuIHRoaXMuX3RocmVlRGJsKCk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5fZGJsKCk7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl96ZXJvRGJsID0gZnVuY3Rpb24gX3plcm9EYmwoKSB7XG4gIHZhciBueDtcbiAgdmFyIG55O1xuICB2YXIgbno7XG4gIC8vIFogPSAxXG4gIGlmICh0aGlzLnpPbmUpIHtcbiAgICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbFxuICAgIC8vICAgICAjZG91YmxpbmctbWRibC0yMDA3LWJsXG4gICAgLy8gMU0gKyA1UyArIDE0QVxuXG4gICAgLy8gWFggPSBYMV4yXG4gICAgdmFyIHh4ID0gdGhpcy54LnJlZFNxcigpO1xuICAgIC8vIFlZID0gWTFeMlxuICAgIHZhciB5eSA9IHRoaXMueS5yZWRTcXIoKTtcbiAgICAvLyBZWVlZID0gWVleMlxuICAgIHZhciB5eXl5ID0geXkucmVkU3FyKCk7XG4gICAgLy8gUyA9IDIgKiAoKFgxICsgWVkpXjIgLSBYWCAtIFlZWVkpXG4gICAgdmFyIHMgPSB0aGlzLngucmVkQWRkKHl5KS5yZWRTcXIoKS5yZWRJU3ViKHh4KS5yZWRJU3ViKHl5eXkpO1xuICAgIHMgPSBzLnJlZElBZGQocyk7XG4gICAgLy8gTSA9IDMgKiBYWCArIGE7IGEgPSAwXG4gICAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpO1xuICAgIC8vIFQgPSBNIF4gMiAtIDIqU1xuICAgIHZhciB0ID0gbS5yZWRTcXIoKS5yZWRJU3ViKHMpLnJlZElTdWIocyk7XG5cbiAgICAvLyA4ICogWVlZWVxuICAgIHZhciB5eXl5OCA9IHl5eXkucmVkSUFkZCh5eXl5KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuICAgIHl5eXk4ID0geXl5eTgucmVkSUFkZCh5eXl5OCk7XG5cbiAgICAvLyBYMyA9IFRcbiAgICBueCA9IHQ7XG4gICAgLy8gWTMgPSBNICogKFMgLSBUKSAtIDggKiBZWVlZXG4gICAgbnkgPSBtLnJlZE11bChzLnJlZElTdWIodCkpLnJlZElTdWIoeXl5eTgpO1xuICAgIC8vIFozID0gMipZMVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICB9IGVsc2Uge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMC5odG1sXG4gICAgLy8gICAgICNkb3VibGluZy1kYmwtMjAwOS1sXG4gICAgLy8gMk0gKyA1UyArIDEzQVxuXG4gICAgLy8gQSA9IFgxXjJcbiAgICB2YXIgYSA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBCID0gWTFeMlxuICAgIHZhciBiID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIEMgPSBCXjJcbiAgICB2YXIgYyA9IGIucmVkU3FyKCk7XG4gICAgLy8gRCA9IDIgKiAoKFgxICsgQileMiAtIEEgLSBDKVxuICAgIHZhciBkID0gdGhpcy54LnJlZEFkZChiKS5yZWRTcXIoKS5yZWRJU3ViKGEpLnJlZElTdWIoYyk7XG4gICAgZCA9IGQucmVkSUFkZChkKTtcbiAgICAvLyBFID0gMyAqIEFcbiAgICB2YXIgZSA9IGEucmVkQWRkKGEpLnJlZElBZGQoYSk7XG4gICAgLy8gRiA9IEVeMlxuICAgIHZhciBmID0gZS5yZWRTcXIoKTtcblxuICAgIC8vIDggKiBDXG4gICAgdmFyIGM4ID0gYy5yZWRJQWRkKGMpO1xuICAgIGM4ID0gYzgucmVkSUFkZChjOCk7XG4gICAgYzggPSBjOC5yZWRJQWRkKGM4KTtcblxuICAgIC8vIFgzID0gRiAtIDIgKiBEXG4gICAgbnggPSBmLnJlZElTdWIoZCkucmVkSVN1YihkKTtcbiAgICAvLyBZMyA9IEUgKiAoRCAtIFgzKSAtIDggKiBDXG4gICAgbnkgPSBlLnJlZE11bChkLnJlZElTdWIobngpKS5yZWRJU3ViKGM4KTtcbiAgICAvLyBaMyA9IDIgKiBZMSAqIFoxXG4gICAgbnogPSB0aGlzLnkucmVkTXVsKHRoaXMueik7XG4gICAgbnogPSBuei5yZWRJQWRkKG56KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuX3RocmVlRGJsID0gZnVuY3Rpb24gX3RocmVlRGJsKCkge1xuICB2YXIgbng7XG4gIHZhciBueTtcbiAgdmFyIG56O1xuICAvLyBaID0gMVxuICBpZiAodGhpcy56T25lKSB7XG4gICAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0zLmh0bWxcbiAgICAvLyAgICAgI2RvdWJsaW5nLW1kYmwtMjAwNy1ibFxuICAgIC8vIDFNICsgNVMgKyAxNUFcblxuICAgIC8vIFhYID0gWDFeMlxuICAgIHZhciB4eCA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBZWSA9IFkxXjJcbiAgICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gICAgLy8gWVlZWSA9IFlZXjJcbiAgICB2YXIgeXl5eSA9IHl5LnJlZFNxcigpO1xuICAgIC8vIFMgPSAyICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKVxuICAgIHZhciBzID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgICBzID0gcy5yZWRJQWRkKHMpO1xuICAgIC8vIE0gPSAzICogWFggKyBhXG4gICAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpLnJlZElBZGQodGhpcy5jdXJ2ZS5hKTtcbiAgICAvLyBUID0gTV4yIC0gMiAqIFNcbiAgICB2YXIgdCA9IG0ucmVkU3FyKCkucmVkSVN1YihzKS5yZWRJU3ViKHMpO1xuICAgIC8vIFgzID0gVFxuICAgIG54ID0gdDtcbiAgICAvLyBZMyA9IE0gKiAoUyAtIFQpIC0gOCAqIFlZWVlcbiAgICB2YXIgeXl5eTggPSB5eXl5LnJlZElBZGQoeXl5eSk7XG4gICAgeXl5eTggPSB5eXl5OC5yZWRJQWRkKHl5eXk4KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuICAgIG55ID0gbS5yZWRNdWwocy5yZWRJU3ViKHQpKS5yZWRJU3ViKHl5eXk4KTtcbiAgICAvLyBaMyA9IDIgKiBZMVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnkpO1xuICB9IGVsc2Uge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMy5odG1sI2RvdWJsaW5nLWRibC0yMDAxLWJcbiAgICAvLyAzTSArIDVTXG5cbiAgICAvLyBkZWx0YSA9IFoxXjJcbiAgICB2YXIgZGVsdGEgPSB0aGlzLnoucmVkU3FyKCk7XG4gICAgLy8gZ2FtbWEgPSBZMV4yXG4gICAgdmFyIGdhbW1hID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIGJldGEgPSBYMSAqIGdhbW1hXG4gICAgdmFyIGJldGEgPSB0aGlzLngucmVkTXVsKGdhbW1hKTtcbiAgICAvLyBhbHBoYSA9IDMgKiAoWDEgLSBkZWx0YSkgKiAoWDEgKyBkZWx0YSlcbiAgICB2YXIgYWxwaGEgPSB0aGlzLngucmVkU3ViKGRlbHRhKS5yZWRNdWwodGhpcy54LnJlZEFkZChkZWx0YSkpO1xuICAgIGFscGhhID0gYWxwaGEucmVkQWRkKGFscGhhKS5yZWRJQWRkKGFscGhhKTtcbiAgICAvLyBYMyA9IGFscGhhXjIgLSA4ICogYmV0YVxuICAgIHZhciBiZXRhNCA9IGJldGEucmVkSUFkZChiZXRhKTtcbiAgICBiZXRhNCA9IGJldGE0LnJlZElBZGQoYmV0YTQpO1xuICAgIHZhciBiZXRhOCA9IGJldGE0LnJlZEFkZChiZXRhNCk7XG4gICAgbnggPSBhbHBoYS5yZWRTcXIoKS5yZWRJU3ViKGJldGE4KTtcbiAgICAvLyBaMyA9IChZMSArIFoxKV4yIC0gZ2FtbWEgLSBkZWx0YVxuICAgIG56ID0gdGhpcy55LnJlZEFkZCh0aGlzLnopLnJlZFNxcigpLnJlZElTdWIoZ2FtbWEpLnJlZElTdWIoZGVsdGEpO1xuICAgIC8vIFkzID0gYWxwaGEgKiAoNCAqIGJldGEgLSBYMykgLSA4ICogZ2FtbWFeMlxuICAgIHZhciBnZ2FtbWE4ID0gZ2FtbWEucmVkU3FyKCk7XG4gICAgZ2dhbW1hOCA9IGdnYW1tYTgucmVkSUFkZChnZ2FtbWE4KTtcbiAgICBnZ2FtbWE4ID0gZ2dhbW1hOC5yZWRJQWRkKGdnYW1tYTgpO1xuICAgIGdnYW1tYTggPSBnZ2FtbWE4LnJlZElBZGQoZ2dhbW1hOCk7XG4gICAgbnkgPSBhbHBoYS5yZWRNdWwoYmV0YTQucmVkSVN1YihueCkpLnJlZElTdWIoZ2dhbW1hOCk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl9kYmwgPSBmdW5jdGlvbiBfZGJsKCkge1xuICB2YXIgYSA9IHRoaXMuY3VydmUuYTtcblxuICAvLyA0TSArIDZTICsgMTBBXG4gIHZhciBqeCA9IHRoaXMueDtcbiAgdmFyIGp5ID0gdGhpcy55O1xuICB2YXIganogPSB0aGlzLno7XG4gIHZhciBqejQgPSBqei5yZWRTcXIoKS5yZWRTcXIoKTtcblxuICB2YXIgangyID0gangucmVkU3FyKCk7XG4gIHZhciBqeTIgPSBqeS5yZWRTcXIoKTtcblxuICB2YXIgYyA9IGp4Mi5yZWRBZGQoangyKS5yZWRJQWRkKGp4MikucmVkSUFkZChhLnJlZE11bChqejQpKTtcblxuICB2YXIganhkNCA9IGp4LnJlZEFkZChqeCk7XG4gIGp4ZDQgPSBqeGQ0LnJlZElBZGQoanhkNCk7XG4gIHZhciB0MSA9IGp4ZDQucmVkTXVsKGp5Mik7XG4gIHZhciBueCA9IGMucmVkU3FyKCkucmVkSVN1Yih0MS5yZWRBZGQodDEpKTtcbiAgdmFyIHQyID0gdDEucmVkSVN1YihueCk7XG5cbiAgdmFyIGp5ZDggPSBqeTIucmVkU3FyKCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIGp5ZDggPSBqeWQ4LnJlZElBZGQoanlkOCk7XG4gIHZhciBueSA9IGMucmVkTXVsKHQyKS5yZWRJU3ViKGp5ZDgpO1xuICB2YXIgbnogPSBqeS5yZWRBZGQoankpLnJlZE11bChqeik7XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS50cnBsID0gZnVuY3Rpb24gdHJwbCgpIHtcbiAgaWYgKCF0aGlzLmN1cnZlLnplcm9BKVxuICAgIHJldHVybiB0aGlzLmRibCgpLmFkZCh0aGlzKTtcblxuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbCN0cmlwbGluZy10cGwtMjAwNy1ibFxuICAvLyA1TSArIDEwUyArIC4uLlxuXG4gIC8vIFhYID0gWDFeMlxuICB2YXIgeHggPSB0aGlzLngucmVkU3FyKCk7XG4gIC8vIFlZID0gWTFeMlxuICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gIC8vIFpaID0gWjFeMlxuICB2YXIgenogPSB0aGlzLnoucmVkU3FyKCk7XG4gIC8vIFlZWVkgPSBZWV4yXG4gIHZhciB5eXl5ID0geXkucmVkU3FyKCk7XG4gIC8vIE0gPSAzICogWFggKyBhICogWloyOyBhID0gMFxuICB2YXIgbSA9IHh4LnJlZEFkZCh4eCkucmVkSUFkZCh4eCk7XG4gIC8vIE1NID0gTV4yXG4gIHZhciBtbSA9IG0ucmVkU3FyKCk7XG4gIC8vIEUgPSA2ICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKSAtIE1NXG4gIHZhciBlID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgZSA9IGUucmVkSUFkZChlKTtcbiAgZSA9IGUucmVkQWRkKGUpLnJlZElBZGQoZSk7XG4gIGUgPSBlLnJlZElTdWIobW0pO1xuICAvLyBFRSA9IEVeMlxuICB2YXIgZWUgPSBlLnJlZFNxcigpO1xuICAvLyBUID0gMTYqWVlZWVxuICB2YXIgdCA9IHl5eXkucmVkSUFkZCh5eXl5KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgdCA9IHQucmVkSUFkZCh0KTtcbiAgLy8gVSA9IChNICsgRSleMiAtIE1NIC0gRUUgLSBUXG4gIHZhciB1ID0gbS5yZWRJQWRkKGUpLnJlZFNxcigpLnJlZElTdWIobW0pLnJlZElTdWIoZWUpLnJlZElTdWIodCk7XG4gIC8vIFgzID0gNCAqIChYMSAqIEVFIC0gNCAqIFlZICogVSlcbiAgdmFyIHl5dTQgPSB5eS5yZWRNdWwodSk7XG4gIHl5dTQgPSB5eXU0LnJlZElBZGQoeXl1NCk7XG4gIHl5dTQgPSB5eXU0LnJlZElBZGQoeXl1NCk7XG4gIHZhciBueCA9IHRoaXMueC5yZWRNdWwoZWUpLnJlZElTdWIoeXl1NCk7XG4gIG54ID0gbngucmVkSUFkZChueCk7XG4gIG54ID0gbngucmVkSUFkZChueCk7XG4gIC8vIFkzID0gOCAqIFkxICogKFUgKiAoVCAtIFUpIC0gRSAqIEVFKVxuICB2YXIgbnkgPSB0aGlzLnkucmVkTXVsKHUucmVkTXVsKHQucmVkSVN1Yih1KSkucmVkSVN1YihlLnJlZE11bChlZSkpKTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgbnkgPSBueS5yZWRJQWRkKG55KTtcbiAgLy8gWjMgPSAoWjEgKyBFKV4yIC0gWlogLSBFRVxuICB2YXIgbnogPSB0aGlzLnoucmVkQWRkKGUpLnJlZFNxcigpLnJlZElTdWIoenopLnJlZElTdWIoZWUpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsKGssIGtiYXNlKSB7XG4gIGsgPSBuZXcgQk4oaywga2Jhc2UpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsIGspO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKHApIHtcbiAgaWYgKHAudHlwZSA9PT0gJ2FmZmluZScpXG4gICAgcmV0dXJuIHRoaXMuZXEocC50b0ooKSk7XG5cbiAgaWYgKHRoaXMgPT09IHApXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgLy8geDEgKiB6Ml4yID09IHgyICogejFeMlxuICB2YXIgejIgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciBwejIgPSBwLnoucmVkU3FyKCk7XG4gIGlmICh0aGlzLngucmVkTXVsKHB6MikucmVkSVN1YihwLngucmVkTXVsKHoyKSkuY21wbigwKSAhPT0gMClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8geTEgKiB6Ml4zID09IHkyICogejFeM1xuICB2YXIgejMgPSB6Mi5yZWRNdWwodGhpcy56KTtcbiAgdmFyIHB6MyA9IHB6Mi5yZWRNdWwocC56KTtcbiAgcmV0dXJuIHRoaXMueS5yZWRNdWwocHozKS5yZWRJU3ViKHAueS5yZWRNdWwoejMpKS5jbXBuKDApID09PSAwO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5lcVhUb1AgPSBmdW5jdGlvbiBlcVhUb1AoeCkge1xuICB2YXIgenMgPSB0aGlzLnoucmVkU3FyKCk7XG4gIHZhciByeCA9IHgudG9SZWQodGhpcy5jdXJ2ZS5yZWQpLnJlZE11bCh6cyk7XG4gIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB2YXIgeGMgPSB4LmNsb25lKCk7XG4gIHZhciB0ID0gdGhpcy5jdXJ2ZS5yZWROLnJlZE11bCh6cyk7XG4gIGZvciAoOzspIHtcbiAgICB4Yy5pYWRkKHRoaXMuY3VydmUubik7XG4gICAgaWYgKHhjLmNtcCh0aGlzLmN1cnZlLnApID49IDApXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICByeC5yZWRJQWRkKHQpO1xuICAgIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgSlBvaW50IEluZmluaXR5Pic7XG4gIHJldHVybiAnPEVDIEpQb2ludCB4OiAnICsgdGhpcy54LnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHk6ICcgKyB0aGlzLnkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgejogJyArIHRoaXMuei50b1N0cmluZygxNiwgMikgKyAnPic7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICAvLyBYWFggVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB6ZXJvIGlzIGFsd2F5cyB6ZXJvIGluIHJlZFxuICByZXR1cm4gdGhpcy56LmNtcG4oMCkgPT09IDA7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xudmFyIEJhc2UgPSByZXF1aXJlKCcuL2Jhc2UnKTtcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gTW9udEN1cnZlKGNvbmYpIHtcbiAgQmFzZS5jYWxsKHRoaXMsICdtb250JywgY29uZik7XG5cbiAgdGhpcy5hID0gbmV3IEJOKGNvbmYuYSwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5iID0gbmV3IEJOKGNvbmYuYiwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5pNCA9IG5ldyBCTig0KS50b1JlZCh0aGlzLnJlZCkucmVkSW52bSgpO1xuICB0aGlzLnR3byA9IG5ldyBCTigyKS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMuYTI0ID0gdGhpcy5pNC5yZWRNdWwodGhpcy5hLnJlZEFkZCh0aGlzLnR3bykpO1xufVxuaW5oZXJpdHMoTW9udEN1cnZlLCBCYXNlKTtcbm1vZHVsZS5leHBvcnRzID0gTW9udEN1cnZlO1xuXG5Nb250Q3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpIHtcbiAgdmFyIHggPSBwb2ludC5ub3JtYWxpemUoKS54O1xuICB2YXIgeDIgPSB4LnJlZFNxcigpO1xuICB2YXIgcmhzID0geDIucmVkTXVsKHgpLnJlZEFkZCh4Mi5yZWRNdWwodGhpcy5hKSkucmVkQWRkKHgpO1xuICB2YXIgeSA9IHJocy5yZWRTcXJ0KCk7XG5cbiAgcmV0dXJuIHkucmVkU3FyKCkuY21wKHJocykgPT09IDA7XG59O1xuXG5mdW5jdGlvbiBQb2ludChjdXJ2ZSwgeCwgeikge1xuICBCYXNlLkJhc2VQb2ludC5jYWxsKHRoaXMsIGN1cnZlLCAncHJvamVjdGl2ZScpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB6ID09PSBudWxsKSB7XG4gICAgdGhpcy54ID0gdGhpcy5jdXJ2ZS5vbmU7XG4gICAgdGhpcy56ID0gdGhpcy5jdXJ2ZS56ZXJvO1xuICB9IGVsc2Uge1xuICAgIHRoaXMueCA9IG5ldyBCTih4LCAxNik7XG4gICAgdGhpcy56ID0gbmV3IEJOKHosIDE2KTtcbiAgICBpZiAoIXRoaXMueC5yZWQpXG4gICAgICB0aGlzLnggPSB0aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICghdGhpcy56LnJlZClcbiAgICAgIHRoaXMueiA9IHRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gIH1cbn1cbmluaGVyaXRzKFBvaW50LCBCYXNlLkJhc2VQb2ludCk7XG5cbk1vbnRDdXJ2ZS5wcm90b3R5cGUuZGVjb2RlUG9pbnQgPSBmdW5jdGlvbiBkZWNvZGVQb2ludChieXRlcywgZW5jKSB7XG4gIHJldHVybiB0aGlzLnBvaW50KHV0aWxzLnRvQXJyYXkoYnl0ZXMsIGVuYyksIDEpO1xufTtcblxuTW9udEN1cnZlLnByb3RvdHlwZS5wb2ludCA9IGZ1bmN0aW9uIHBvaW50KHgsIHopIHtcbiAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLCB4LCB6KTtcbn07XG5cbk1vbnRDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTiA9IGZ1bmN0aW9uIHBvaW50RnJvbUpTT04ob2JqKSB7XG4gIHJldHVybiBQb2ludC5mcm9tSlNPTih0aGlzLCBvYmopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnByZWNvbXB1dGUgPSBmdW5jdGlvbiBwcmVjb21wdXRlKCkge1xuICAvLyBOby1vcFxufTtcblxuUG9pbnQucHJvdG90eXBlLl9lbmNvZGUgPSBmdW5jdGlvbiBfZW5jb2RlKCkge1xuICByZXR1cm4gdGhpcy5nZXRYKCkudG9BcnJheSgnYmUnLCB0aGlzLmN1cnZlLnAuYnl0ZUxlbmd0aCgpKTtcbn07XG5cblBvaW50LmZyb21KU09OID0gZnVuY3Rpb24gZnJvbUpTT04oY3VydmUsIG9iaikge1xuICByZXR1cm4gbmV3IFBvaW50KGN1cnZlLCBvYmpbMF0sIG9ialsxXSB8fCBjdXJ2ZS5vbmUpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgUG9pbnQgSW5maW5pdHk+JztcbiAgcmV0dXJuICc8RUMgUG9pbnQgeDogJyArIHRoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgejogJyArIHRoaXMuei5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICAvLyBYWFggVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB6ZXJvIGlzIGFsd2F5cyB6ZXJvIGluIHJlZFxuICByZXR1cm4gdGhpcy56LmNtcG4oMCkgPT09IDA7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24gZGJsKCkge1xuICAvLyBodHRwOi8vaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLW1vbnRnb20teHouaHRtbCNkb3VibGluZy1kYmwtMTk4Ny1tLTNcbiAgLy8gMk0gKyAyUyArIDRBXG5cbiAgLy8gQSA9IFgxICsgWjFcbiAgdmFyIGEgPSB0aGlzLngucmVkQWRkKHRoaXMueik7XG4gIC8vIEFBID0gQV4yXG4gIHZhciBhYSA9IGEucmVkU3FyKCk7XG4gIC8vIEIgPSBYMSAtIFoxXG4gIHZhciBiID0gdGhpcy54LnJlZFN1Yih0aGlzLnopO1xuICAvLyBCQiA9IEJeMlxuICB2YXIgYmIgPSBiLnJlZFNxcigpO1xuICAvLyBDID0gQUEgLSBCQlxuICB2YXIgYyA9IGFhLnJlZFN1YihiYik7XG4gIC8vIFgzID0gQUEgKiBCQlxuICB2YXIgbnggPSBhYS5yZWRNdWwoYmIpO1xuICAvLyBaMyA9IEMgKiAoQkIgKyBBMjQgKiBDKVxuICB2YXIgbnogPSBjLnJlZE11bChiYi5yZWRBZGQodGhpcy5jdXJ2ZS5hMjQucmVkTXVsKGMpKSk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueik7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQgb24gTW9udGdvbWVyeSBjdXJ2ZScpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRpZmZBZGQgPSBmdW5jdGlvbiBkaWZmQWRkKHAsIGRpZmYpIHtcbiAgLy8gaHR0cDovL2h5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1tb250Z29tLXh6Lmh0bWwjZGlmZmFkZC1kYWRkLTE5ODctbS0zXG4gIC8vIDRNICsgMlMgKyA2QVxuXG4gIC8vIEEgPSBYMiArIFoyXG4gIHZhciBhID0gdGhpcy54LnJlZEFkZCh0aGlzLnopO1xuICAvLyBCID0gWDIgLSBaMlxuICB2YXIgYiA9IHRoaXMueC5yZWRTdWIodGhpcy56KTtcbiAgLy8gQyA9IFgzICsgWjNcbiAgdmFyIGMgPSBwLngucmVkQWRkKHAueik7XG4gIC8vIEQgPSBYMyAtIFozXG4gIHZhciBkID0gcC54LnJlZFN1YihwLnopO1xuICAvLyBEQSA9IEQgKiBBXG4gIHZhciBkYSA9IGQucmVkTXVsKGEpO1xuICAvLyBDQiA9IEMgKiBCXG4gIHZhciBjYiA9IGMucmVkTXVsKGIpO1xuICAvLyBYNSA9IFoxICogKERBICsgQ0IpXjJcbiAgdmFyIG54ID0gZGlmZi56LnJlZE11bChkYS5yZWRBZGQoY2IpLnJlZFNxcigpKTtcbiAgLy8gWjUgPSBYMSAqIChEQSAtIENCKV4yXG4gIHZhciBueiA9IGRpZmYueC5yZWRNdWwoZGEucmVkSVN1YihjYikucmVkU3FyKCkpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrKSB7XG4gIHZhciB0ID0gay5jbG9uZSgpO1xuICB2YXIgYSA9IHRoaXM7IC8vIChOIC8gMikgKiBRICsgUVxuICB2YXIgYiA9IHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7IC8vIChOIC8gMikgKiBRXG4gIHZhciBjID0gdGhpczsgLy8gUVxuXG4gIGZvciAodmFyIGJpdHMgPSBbXTsgdC5jbXBuKDApICE9PSAwOyB0Lml1c2hybigxKSlcbiAgICBiaXRzLnB1c2godC5hbmRsbigxKSk7XG5cbiAgZm9yICh2YXIgaSA9IGJpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoYml0c1tpXSA9PT0gMCkge1xuICAgICAgLy8gTiAqIFEgKyBRID0gKChOIC8gMikgKiBRICsgUSkpICsgKE4gLyAyKSAqIFFcbiAgICAgIGEgPSBhLmRpZmZBZGQoYiwgYyk7XG4gICAgICAvLyBOICogUSA9IDIgKiAoKE4gLyAyKSAqIFEgKyBRKSlcbiAgICAgIGIgPSBiLmRibCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOICogUSA9ICgoTiAvIDIpICogUSArIFEpICsgKChOIC8gMikgKiBRKVxuICAgICAgYiA9IGEuZGlmZkFkZChiLCBjKTtcbiAgICAgIC8vIE4gKiBRICsgUSA9IDIgKiAoKE4gLyAyKSAqIFEgKyBRKVxuICAgICAgYSA9IGEuZGJsKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBiO1xufTtcblxuUG9pbnQucHJvdG90eXBlLm11bEFkZCA9IGZ1bmN0aW9uIG11bEFkZCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUnKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5qdW1sQWRkID0gZnVuY3Rpb24ganVtbEFkZCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUnKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLmdldFgoKS5jbXAob3RoZXIuZ2V0WCgpKSA9PT0gMDtcbn07XG5cblBvaW50LnByb3RvdHlwZS5ub3JtYWxpemUgPSBmdW5jdGlvbiBub3JtYWxpemUoKSB7XG4gIHRoaXMueCA9IHRoaXMueC5yZWRNdWwodGhpcy56LnJlZEludm0oKSk7XG4gIHRoaXMueiA9IHRoaXMuY3VydmUub25lO1xuICByZXR1cm4gdGhpcztcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gZ2V0WCgpIHtcbiAgLy8gTm9ybWFsaXplIGNvb3JkaW5hdGVzXG4gIHRoaXMubm9ybWFsaXplKCk7XG5cbiAgcmV0dXJuIHRoaXMueC5mcm9tUmVkKCk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgQk4gPSByZXF1aXJlKCdibi5qcycpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbnZhciBCYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG5cbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIEVkd2FyZHNDdXJ2ZShjb25mKSB7XG4gIC8vIE5PVEU6IEltcG9ydGFudCBhcyB3ZSBhcmUgY3JlYXRpbmcgcG9pbnQgaW4gQmFzZS5jYWxsKClcbiAgdGhpcy50d2lzdGVkID0gKGNvbmYuYSB8IDApICE9PSAxO1xuICB0aGlzLm1PbmVBID0gdGhpcy50d2lzdGVkICYmIChjb25mLmEgfCAwKSA9PT0gLTE7XG4gIHRoaXMuZXh0ZW5kZWQgPSB0aGlzLm1PbmVBO1xuXG4gIEJhc2UuY2FsbCh0aGlzLCAnZWR3YXJkcycsIGNvbmYpO1xuXG4gIHRoaXMuYSA9IG5ldyBCTihjb25mLmEsIDE2KS51bW9kKHRoaXMucmVkLm0pO1xuICB0aGlzLmEgPSB0aGlzLmEudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmMgPSBuZXcgQk4oY29uZi5jLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmMyID0gdGhpcy5jLnJlZFNxcigpO1xuICB0aGlzLmQgPSBuZXcgQk4oY29uZi5kLCAxNikudG9SZWQodGhpcy5yZWQpO1xuICB0aGlzLmRkID0gdGhpcy5kLnJlZEFkZCh0aGlzLmQpO1xuXG4gIGFzc2VydCghdGhpcy50d2lzdGVkIHx8IHRoaXMuYy5mcm9tUmVkKCkuY21wbigxKSA9PT0gMCk7XG4gIHRoaXMub25lQyA9IChjb25mLmMgfCAwKSA9PT0gMTtcbn1cbmluaGVyaXRzKEVkd2FyZHNDdXJ2ZSwgQmFzZSk7XG5tb2R1bGUuZXhwb3J0cyA9IEVkd2FyZHNDdXJ2ZTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5fbXVsQSA9IGZ1bmN0aW9uIF9tdWxBKG51bSkge1xuICBpZiAodGhpcy5tT25lQSlcbiAgICByZXR1cm4gbnVtLnJlZE5lZygpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuYS5yZWRNdWwobnVtKTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuX211bEMgPSBmdW5jdGlvbiBfbXVsQyhudW0pIHtcbiAgaWYgKHRoaXMub25lQylcbiAgICByZXR1cm4gbnVtO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuYy5yZWRNdWwobnVtKTtcbn07XG5cbi8vIEp1c3QgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTaG9ydCBjdXJ2ZVxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5qcG9pbnQgPSBmdW5jdGlvbiBqcG9pbnQoeCwgeSwgeiwgdCkge1xuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5LCB6LCB0KTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tWCA9IGZ1bmN0aW9uIHBvaW50RnJvbVgoeCwgb2RkKSB7XG4gIHggPSBuZXcgQk4oeCwgMTYpO1xuICBpZiAoIXgucmVkKVxuICAgIHggPSB4LnRvUmVkKHRoaXMucmVkKTtcblxuICB2YXIgeDIgPSB4LnJlZFNxcigpO1xuICB2YXIgcmhzID0gdGhpcy5jMi5yZWRTdWIodGhpcy5hLnJlZE11bCh4MikpO1xuICB2YXIgbGhzID0gdGhpcy5vbmUucmVkU3ViKHRoaXMuYzIucmVkTXVsKHRoaXMuZCkucmVkTXVsKHgyKSk7XG5cbiAgdmFyIHkyID0gcmhzLnJlZE11bChsaHMucmVkSW52bSgpKTtcbiAgdmFyIHkgPSB5Mi5yZWRTcXJ0KCk7XG4gIGlmICh5LnJlZFNxcigpLnJlZFN1Yih5MikuY21wKHRoaXMuemVybykgIT09IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBvaW50Jyk7XG5cbiAgdmFyIGlzT2RkID0geS5mcm9tUmVkKCkuaXNPZGQoKTtcbiAgaWYgKG9kZCAmJiAhaXNPZGQgfHwgIW9kZCAmJiBpc09kZClcbiAgICB5ID0geS5yZWROZWcoKTtcblxuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5KTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tWSA9IGZ1bmN0aW9uIHBvaW50RnJvbVkoeSwgb2RkKSB7XG4gIHkgPSBuZXcgQk4oeSwgMTYpO1xuICBpZiAoIXkucmVkKVxuICAgIHkgPSB5LnRvUmVkKHRoaXMucmVkKTtcblxuICAvLyB4XjIgPSAoeV4yIC0gY14yKSAvIChjXjIgZCB5XjIgLSBhKVxuICB2YXIgeTIgPSB5LnJlZFNxcigpO1xuICB2YXIgbGhzID0geTIucmVkU3ViKHRoaXMuYzIpO1xuICB2YXIgcmhzID0geTIucmVkTXVsKHRoaXMuZCkucmVkTXVsKHRoaXMuYzIpLnJlZFN1Yih0aGlzLmEpO1xuICB2YXIgeDIgPSBsaHMucmVkTXVsKHJocy5yZWRJbnZtKCkpO1xuXG4gIGlmICh4Mi5jbXAodGhpcy56ZXJvKSA9PT0gMCkge1xuICAgIGlmIChvZGQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcG9pbnQnKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5wb2ludCh0aGlzLnplcm8sIHkpO1xuICB9XG5cbiAgdmFyIHggPSB4Mi5yZWRTcXJ0KCk7XG4gIGlmICh4LnJlZFNxcigpLnJlZFN1Yih4MikuY21wKHRoaXMuemVybykgIT09IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBvaW50Jyk7XG5cbiAgaWYgKHguZnJvbVJlZCgpLmlzT2RkKCkgIT09IG9kZClcbiAgICB4ID0geC5yZWROZWcoKTtcblxuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5KTtcbn07XG5cbkVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZShwb2ludCkge1xuICBpZiAocG9pbnQuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0cnVlO1xuXG4gIC8vIEN1cnZlOiBBICogWF4yICsgWV4yID0gQ14yICogKDEgKyBEICogWF4yICogWV4yKVxuICBwb2ludC5ub3JtYWxpemUoKTtcblxuICB2YXIgeDIgPSBwb2ludC54LnJlZFNxcigpO1xuICB2YXIgeTIgPSBwb2ludC55LnJlZFNxcigpO1xuICB2YXIgbGhzID0geDIucmVkTXVsKHRoaXMuYSkucmVkQWRkKHkyKTtcbiAgdmFyIHJocyA9IHRoaXMuYzIucmVkTXVsKHRoaXMub25lLnJlZEFkZCh0aGlzLmQucmVkTXVsKHgyKS5yZWRNdWwoeTIpKSk7XG5cbiAgcmV0dXJuIGxocy5jbXAocmhzKSA9PT0gMDtcbn07XG5cbmZ1bmN0aW9uIFBvaW50KGN1cnZlLCB4LCB5LCB6LCB0KSB7XG4gIEJhc2UuQmFzZVBvaW50LmNhbGwodGhpcywgY3VydmUsICdwcm9qZWN0aXZlJyk7XG4gIGlmICh4ID09PSBudWxsICYmIHkgPT09IG51bGwgJiYgeiA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IHRoaXMuY3VydmUuemVybztcbiAgICB0aGlzLnkgPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnogPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnQgPSB0aGlzLmN1cnZlLnplcm87XG4gICAgdGhpcy56T25lID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnggPSBuZXcgQk4oeCwgMTYpO1xuICAgIHRoaXMueSA9IG5ldyBCTih5LCAxNik7XG4gICAgdGhpcy56ID0geiA/IG5ldyBCTih6LCAxNikgOiB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnQgPSB0ICYmIG5ldyBCTih0LCAxNik7XG4gICAgaWYgKCF0aGlzLngucmVkKVxuICAgICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMueS5yZWQpXG4gICAgICB0aGlzLnkgPSB0aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIGlmICghdGhpcy56LnJlZClcbiAgICAgIHRoaXMueiA9IHRoaXMuei50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgaWYgKHRoaXMudCAmJiAhdGhpcy50LnJlZClcbiAgICAgIHRoaXMudCA9IHRoaXMudC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gICAgdGhpcy56T25lID0gdGhpcy56ID09PSB0aGlzLmN1cnZlLm9uZTtcblxuICAgIC8vIFVzZSBleHRlbmRlZCBjb29yZGluYXRlc1xuICAgIGlmICh0aGlzLmN1cnZlLmV4dGVuZGVkICYmICF0aGlzLnQpIHtcbiAgICAgIHRoaXMudCA9IHRoaXMueC5yZWRNdWwodGhpcy55KTtcbiAgICAgIGlmICghdGhpcy56T25lKVxuICAgICAgICB0aGlzLnQgPSB0aGlzLnQucmVkTXVsKHRoaXMuei5yZWRJbnZtKCkpO1xuICAgIH1cbiAgfVxufVxuaW5oZXJpdHMoUG9pbnQsIEJhc2UuQmFzZVBvaW50KTtcblxuRWR3YXJkc0N1cnZlLnByb3RvdHlwZS5wb2ludEZyb21KU09OID0gZnVuY3Rpb24gcG9pbnRGcm9tSlNPTihvYmopIHtcbiAgcmV0dXJuIFBvaW50LmZyb21KU09OKHRoaXMsIG9iaik7XG59O1xuXG5FZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24gcG9pbnQoeCwgeSwgeiwgdCkge1xuICByZXR1cm4gbmV3IFBvaW50KHRoaXMsIHgsIHksIHosIHQpO1xufTtcblxuUG9pbnQuZnJvbUpTT04gPSBmdW5jdGlvbiBmcm9tSlNPTihjdXJ2ZSwgb2JqKSB7XG4gIHJldHVybiBuZXcgUG9pbnQoY3VydmUsIG9ialswXSwgb2JqWzFdLCBvYmpbMl0pO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuICc8RUMgUG9pbnQgSW5maW5pdHk+JztcbiAgcmV0dXJuICc8RUMgUG9pbnQgeDogJyArIHRoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgeTogJyArIHRoaXMueS5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICtcbiAgICAgICcgejogJyArIHRoaXMuei5mcm9tUmVkKCkudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHkgPSBmdW5jdGlvbiBpc0luZmluaXR5KCkge1xuICAvLyBYWFggVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB6ZXJvIGlzIGFsd2F5cyB6ZXJvIGluIHJlZFxuICByZXR1cm4gdGhpcy54LmNtcG4oMCkgPT09IDAgJiZcbiAgICAodGhpcy55LmNtcCh0aGlzLnopID09PSAwIHx8XG4gICAgKHRoaXMuek9uZSAmJiB0aGlzLnkuY21wKHRoaXMuY3VydmUuYykgPT09IDApKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5fZXh0RGJsID0gZnVuY3Rpb24gX2V4dERibCgpIHtcbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQtMS5odG1sXG4gIC8vICAgICAjZG91YmxpbmctZGJsLTIwMDgtaHdjZFxuICAvLyA0TSArIDRTXG5cbiAgLy8gQSA9IFgxXjJcbiAgdmFyIGEgPSB0aGlzLngucmVkU3FyKCk7XG4gIC8vIEIgPSBZMV4yXG4gIHZhciBiID0gdGhpcy55LnJlZFNxcigpO1xuICAvLyBDID0gMiAqIFoxXjJcbiAgdmFyIGMgPSB0aGlzLnoucmVkU3FyKCk7XG4gIGMgPSBjLnJlZElBZGQoYyk7XG4gIC8vIEQgPSBhICogQVxuICB2YXIgZCA9IHRoaXMuY3VydmUuX211bEEoYSk7XG4gIC8vIEUgPSAoWDEgKyBZMSleMiAtIEEgLSBCXG4gIHZhciBlID0gdGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZFNxcigpLnJlZElTdWIoYSkucmVkSVN1YihiKTtcbiAgLy8gRyA9IEQgKyBCXG4gIHZhciBnID0gZC5yZWRBZGQoYik7XG4gIC8vIEYgPSBHIC0gQ1xuICB2YXIgZiA9IGcucmVkU3ViKGMpO1xuICAvLyBIID0gRCAtIEJcbiAgdmFyIGggPSBkLnJlZFN1YihiKTtcbiAgLy8gWDMgPSBFICogRlxuICB2YXIgbnggPSBlLnJlZE11bChmKTtcbiAgLy8gWTMgPSBHICogSFxuICB2YXIgbnkgPSBnLnJlZE11bChoKTtcbiAgLy8gVDMgPSBFICogSFxuICB2YXIgbnQgPSBlLnJlZE11bChoKTtcbiAgLy8gWjMgPSBGICogR1xuICB2YXIgbnogPSBmLnJlZE11bChnKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55LCBueiwgbnQpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9wcm9qRGJsID0gZnVuY3Rpb24gX3Byb2pEYmwoKSB7XG4gIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLXByb2plY3RpdmUuaHRtbFxuICAvLyAgICAgI2RvdWJsaW5nLWRibC0yMDA4LWJiamxwXG4gIC8vICAgICAjZG91YmxpbmctZGJsLTIwMDctYmxcbiAgLy8gYW5kIG90aGVyc1xuICAvLyBHZW5lcmFsbHkgM00gKyA0UyBvciAyTSArIDRTXG5cbiAgLy8gQiA9IChYMSArIFkxKV4yXG4gIHZhciBiID0gdGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZFNxcigpO1xuICAvLyBDID0gWDFeMlxuICB2YXIgYyA9IHRoaXMueC5yZWRTcXIoKTtcbiAgLy8gRCA9IFkxXjJcbiAgdmFyIGQgPSB0aGlzLnkucmVkU3FyKCk7XG5cbiAgdmFyIG54O1xuICB2YXIgbnk7XG4gIHZhciBuejtcbiAgdmFyIGU7XG4gIHZhciBoO1xuICB2YXIgajtcbiAgaWYgKHRoaXMuY3VydmUudHdpc3RlZCkge1xuICAgIC8vIEUgPSBhICogQ1xuICAgIGUgPSB0aGlzLmN1cnZlLl9tdWxBKGMpO1xuICAgIC8vIEYgPSBFICsgRFxuICAgIHZhciBmID0gZS5yZWRBZGQoZCk7XG4gICAgaWYgKHRoaXMuek9uZSkge1xuICAgICAgLy8gWDMgPSAoQiAtIEMgLSBEKSAqIChGIC0gMilcbiAgICAgIG54ID0gYi5yZWRTdWIoYykucmVkU3ViKGQpLnJlZE11bChmLnJlZFN1Yih0aGlzLmN1cnZlLnR3bykpO1xuICAgICAgLy8gWTMgPSBGICogKEUgLSBEKVxuICAgICAgbnkgPSBmLnJlZE11bChlLnJlZFN1YihkKSk7XG4gICAgICAvLyBaMyA9IEZeMiAtIDIgKiBGXG4gICAgICBueiA9IGYucmVkU3FyKCkucmVkU3ViKGYpLnJlZFN1YihmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSCA9IFoxXjJcbiAgICAgIGggPSB0aGlzLnoucmVkU3FyKCk7XG4gICAgICAvLyBKID0gRiAtIDIgKiBIXG4gICAgICBqID0gZi5yZWRTdWIoaCkucmVkSVN1YihoKTtcbiAgICAgIC8vIFgzID0gKEItQy1EKSpKXG4gICAgICBueCA9IGIucmVkU3ViKGMpLnJlZElTdWIoZCkucmVkTXVsKGopO1xuICAgICAgLy8gWTMgPSBGICogKEUgLSBEKVxuICAgICAgbnkgPSBmLnJlZE11bChlLnJlZFN1YihkKSk7XG4gICAgICAvLyBaMyA9IEYgKiBKXG4gICAgICBueiA9IGYucmVkTXVsKGopO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBFID0gQyArIERcbiAgICBlID0gYy5yZWRBZGQoZCk7XG4gICAgLy8gSCA9IChjICogWjEpXjJcbiAgICBoID0gdGhpcy5jdXJ2ZS5fbXVsQyh0aGlzLnopLnJlZFNxcigpO1xuICAgIC8vIEogPSBFIC0gMiAqIEhcbiAgICBqID0gZS5yZWRTdWIoaCkucmVkU3ViKGgpO1xuICAgIC8vIFgzID0gYyAqIChCIC0gRSkgKiBKXG4gICAgbnggPSB0aGlzLmN1cnZlLl9tdWxDKGIucmVkSVN1YihlKSkucmVkTXVsKGopO1xuICAgIC8vIFkzID0gYyAqIEUgKiAoQyAtIEQpXG4gICAgbnkgPSB0aGlzLmN1cnZlLl9tdWxDKGUpLnJlZE11bChjLnJlZElTdWIoZCkpO1xuICAgIC8vIFozID0gRSAqIEpcbiAgICBueiA9IGUucmVkTXVsKGopO1xuICB9XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSwgbnopO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIERvdWJsZSBpbiBleHRlbmRlZCBjb29yZGluYXRlc1xuICBpZiAodGhpcy5jdXJ2ZS5leHRlbmRlZClcbiAgICByZXR1cm4gdGhpcy5fZXh0RGJsKCk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5fcHJvakRibCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9leHRBZGQgPSBmdW5jdGlvbiBfZXh0QWRkKHApIHtcbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQtMS5odG1sXG4gIC8vICAgICAjYWRkaXRpb24tYWRkLTIwMDgtaHdjZC0zXG4gIC8vIDhNXG5cbiAgLy8gQSA9IChZMSAtIFgxKSAqIChZMiAtIFgyKVxuICB2YXIgYSA9IHRoaXMueS5yZWRTdWIodGhpcy54KS5yZWRNdWwocC55LnJlZFN1YihwLngpKTtcbiAgLy8gQiA9IChZMSArIFgxKSAqIChZMiArIFgyKVxuICB2YXIgYiA9IHRoaXMueS5yZWRBZGQodGhpcy54KS5yZWRNdWwocC55LnJlZEFkZChwLngpKTtcbiAgLy8gQyA9IFQxICogayAqIFQyXG4gIHZhciBjID0gdGhpcy50LnJlZE11bCh0aGlzLmN1cnZlLmRkKS5yZWRNdWwocC50KTtcbiAgLy8gRCA9IFoxICogMiAqIFoyXG4gIHZhciBkID0gdGhpcy56LnJlZE11bChwLnoucmVkQWRkKHAueikpO1xuICAvLyBFID0gQiAtIEFcbiAgdmFyIGUgPSBiLnJlZFN1YihhKTtcbiAgLy8gRiA9IEQgLSBDXG4gIHZhciBmID0gZC5yZWRTdWIoYyk7XG4gIC8vIEcgPSBEICsgQ1xuICB2YXIgZyA9IGQucmVkQWRkKGMpO1xuICAvLyBIID0gQiArIEFcbiAgdmFyIGggPSBiLnJlZEFkZChhKTtcbiAgLy8gWDMgPSBFICogRlxuICB2YXIgbnggPSBlLnJlZE11bChmKTtcbiAgLy8gWTMgPSBHICogSFxuICB2YXIgbnkgPSBnLnJlZE11bChoKTtcbiAgLy8gVDMgPSBFICogSFxuICB2YXIgbnQgPSBlLnJlZE11bChoKTtcbiAgLy8gWjMgPSBGICogR1xuICB2YXIgbnogPSBmLnJlZE11bChnKTtcbiAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsIG55LCBueiwgbnQpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLl9wcm9qQWRkID0gZnVuY3Rpb24gX3Byb2pBZGQocCkge1xuICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tdHdpc3RlZC1wcm9qZWN0aXZlLmh0bWxcbiAgLy8gICAgICNhZGRpdGlvbi1hZGQtMjAwOC1iYmpscFxuICAvLyAgICAgI2FkZGl0aW9uLWFkZC0yMDA3LWJsXG4gIC8vIDEwTSArIDFTXG5cbiAgLy8gQSA9IFoxICogWjJcbiAgdmFyIGEgPSB0aGlzLnoucmVkTXVsKHAueik7XG4gIC8vIEIgPSBBXjJcbiAgdmFyIGIgPSBhLnJlZFNxcigpO1xuICAvLyBDID0gWDEgKiBYMlxuICB2YXIgYyA9IHRoaXMueC5yZWRNdWwocC54KTtcbiAgLy8gRCA9IFkxICogWTJcbiAgdmFyIGQgPSB0aGlzLnkucmVkTXVsKHAueSk7XG4gIC8vIEUgPSBkICogQyAqIERcbiAgdmFyIGUgPSB0aGlzLmN1cnZlLmQucmVkTXVsKGMpLnJlZE11bChkKTtcbiAgLy8gRiA9IEIgLSBFXG4gIHZhciBmID0gYi5yZWRTdWIoZSk7XG4gIC8vIEcgPSBCICsgRVxuICB2YXIgZyA9IGIucmVkQWRkKGUpO1xuICAvLyBYMyA9IEEgKiBGICogKChYMSArIFkxKSAqIChYMiArIFkyKSAtIEMgLSBEKVxuICB2YXIgdG1wID0gdGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZE11bChwLngucmVkQWRkKHAueSkpLnJlZElTdWIoYykucmVkSVN1YihkKTtcbiAgdmFyIG54ID0gYS5yZWRNdWwoZikucmVkTXVsKHRtcCk7XG4gIHZhciBueTtcbiAgdmFyIG56O1xuICBpZiAodGhpcy5jdXJ2ZS50d2lzdGVkKSB7XG4gICAgLy8gWTMgPSBBICogRyAqIChEIC0gYSAqIEMpXG4gICAgbnkgPSBhLnJlZE11bChnKS5yZWRNdWwoZC5yZWRTdWIodGhpcy5jdXJ2ZS5fbXVsQShjKSkpO1xuICAgIC8vIFozID0gRiAqIEdcbiAgICBueiA9IGYucmVkTXVsKGcpO1xuICB9IGVsc2Uge1xuICAgIC8vIFkzID0gQSAqIEcgKiAoRCAtIEMpXG4gICAgbnkgPSBhLnJlZE11bChnKS5yZWRNdWwoZC5yZWRTdWIoYykpO1xuICAgIC8vIFozID0gYyAqIEYgKiBHXG4gICAgbnogPSB0aGlzLmN1cnZlLl9tdWxDKGYpLnJlZE11bChnKTtcbiAgfVxuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCwgbnksIG56KTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQocCkge1xuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHA7XG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICBpZiAodGhpcy5jdXJ2ZS5leHRlbmRlZClcbiAgICByZXR1cm4gdGhpcy5fZXh0QWRkKHApO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuX3Byb2pBZGQocCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsKGspIHtcbiAgaWYgKHRoaXMuX2hhc0RvdWJsZXMoaykpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2ZpeGVkTmFmTXVsKHRoaXMsIGspO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWwodGhpcywgayk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsQWRkID0gZnVuY3Rpb24gbXVsQWRkKGsxLCBwLCBrMikge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLCBbIHRoaXMsIHAgXSwgWyBrMSwgazIgXSwgMiwgZmFsc2UpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmptdWxBZGQgPSBmdW5jdGlvbiBqbXVsQWRkKGsxLCBwLCBrMikge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLCBbIHRoaXMsIHAgXSwgWyBrMSwgazIgXSwgMiwgdHJ1ZSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKCkge1xuICBpZiAodGhpcy56T25lKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIE5vcm1hbGl6ZSBjb29yZGluYXRlc1xuICB2YXIgemkgPSB0aGlzLnoucmVkSW52bSgpO1xuICB0aGlzLnggPSB0aGlzLngucmVkTXVsKHppKTtcbiAgdGhpcy55ID0gdGhpcy55LnJlZE11bCh6aSk7XG4gIGlmICh0aGlzLnQpXG4gICAgdGhpcy50ID0gdGhpcy50LnJlZE11bCh6aSk7XG4gIHRoaXMueiA9IHRoaXMuY3VydmUub25lO1xuICB0aGlzLnpPbmUgPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn07XG5cblBvaW50LnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcoKSB7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KHRoaXMueC5yZWROZWcoKSxcbiAgICB0aGlzLnksXG4gICAgdGhpcy56LFxuICAgIHRoaXMudCAmJiB0aGlzLnQucmVkTmVnKCkpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFggPSBmdW5jdGlvbiBnZXRYKCkge1xuICB0aGlzLm5vcm1hbGl6ZSgpO1xuICByZXR1cm4gdGhpcy54LmZyb21SZWQoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5nZXRZID0gZnVuY3Rpb24gZ2V0WSgpIHtcbiAgdGhpcy5ub3JtYWxpemUoKTtcbiAgcmV0dXJuIHRoaXMueS5mcm9tUmVkKCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShvdGhlcikge1xuICByZXR1cm4gdGhpcyA9PT0gb3RoZXIgfHxcbiAgICAgICAgIHRoaXMuZ2V0WCgpLmNtcChvdGhlci5nZXRYKCkpID09PSAwICYmXG4gICAgICAgICB0aGlzLmdldFkoKS5jbXAob3RoZXIuZ2V0WSgpKSA9PT0gMDtcbn07XG5cblBvaW50LnByb3RvdHlwZS5lcVhUb1AgPSBmdW5jdGlvbiBlcVhUb1AoeCkge1xuICB2YXIgcnggPSB4LnRvUmVkKHRoaXMuY3VydmUucmVkKS5yZWRNdWwodGhpcy56KTtcbiAgaWYgKHRoaXMueC5jbXAocngpID09PSAwKVxuICAgIHJldHVybiB0cnVlO1xuXG4gIHZhciB4YyA9IHguY2xvbmUoKTtcbiAgdmFyIHQgPSB0aGlzLmN1cnZlLnJlZE4ucmVkTXVsKHRoaXMueik7XG4gIGZvciAoOzspIHtcbiAgICB4Yy5pYWRkKHRoaXMuY3VydmUubik7XG4gICAgaWYgKHhjLmNtcCh0aGlzLmN1cnZlLnApID49IDApXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICByeC5yZWRJQWRkKHQpO1xuICAgIGlmICh0aGlzLnguY21wKHJ4KSA9PT0gMClcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG4vLyBDb21wYXRpYmlsaXR5IHdpdGggQmFzZUN1cnZlXG5Qb2ludC5wcm90b3R5cGUudG9QID0gUG9pbnQucHJvdG90eXBlLm5vcm1hbGl6ZTtcblBvaW50LnByb3RvdHlwZS5taXhlZEFkZCA9IFBvaW50LnByb3RvdHlwZS5hZGQ7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGN1cnZlID0gZXhwb3J0cztcblxuY3VydmUuYmFzZSA9IHJlcXVpcmUoJy4vYmFzZScpO1xuY3VydmUuc2hvcnQgPSByZXF1aXJlKCcuL3Nob3J0Jyk7XG5jdXJ2ZS5tb250ID0gcmVxdWlyZSgnLi9tb250Jyk7XG5jdXJ2ZS5lZHdhcmRzID0gcmVxdWlyZSgnLi9lZHdhcmRzJyk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuaW5oZXJpdHMgPSBpbmhlcml0cztcblxuZnVuY3Rpb24gaXNTdXJyb2dhdGVQYWlyKG1zZywgaSkge1xuICBpZiAoKG1zZy5jaGFyQ29kZUF0KGkpICYgMHhGQzAwKSAhPT0gMHhEODAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChpIDwgMCB8fCBpICsgMSA+PSBtc2cubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAobXNnLmNoYXJDb2RlQXQoaSArIDEpICYgMHhGQzAwKSA9PT0gMHhEQzAwO1xufVxuXG5mdW5jdGlvbiB0b0FycmF5KG1zZywgZW5jKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG1zZykpXG4gICAgcmV0dXJuIG1zZy5zbGljZSgpO1xuICBpZiAoIW1zZylcbiAgICByZXR1cm4gW107XG4gIHZhciByZXMgPSBbXTtcbiAgaWYgKHR5cGVvZiBtc2cgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFlbmMpIHtcbiAgICAgIC8vIEluc3BpcmVkIGJ5IHN0cmluZ1RvVXRmOEJ5dGVBcnJheSgpIGluIGNsb3N1cmUtbGlicmFyeSBieSBHb29nbGVcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1saWJyYXJ5L2Jsb2IvODU5OGQ4NzI0MmFmNTlhYWMyMzMyNzA3NDJjODk4NGUyYjJiZGJlMC9jbG9zdXJlL2dvb2cvY3J5cHQvY3J5cHQuanMjTDExNy1MMTQzXG4gICAgICAvLyBBcGFjaGUgTGljZW5zZSAyLjBcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1saWJyYXJ5L2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAgICAgIHZhciBwID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjID0gbXNnLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjIDwgMTI4KSB7XG4gICAgICAgICAgcmVzW3ArK10gPSBjO1xuICAgICAgICB9IGVsc2UgaWYgKGMgPCAyMDQ4KSB7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyA+PiA2KSB8IDE5MjtcbiAgICAgICAgICByZXNbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xuICAgICAgICB9IGVsc2UgaWYgKGlzU3Vycm9nYXRlUGFpcihtc2csIGkpKSB7XG4gICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgJiAweDAzRkYpIDw8IDEwKSArIChtc2cuY2hhckNvZGVBdCgrK2kpICYgMHgwM0ZGKTtcbiAgICAgICAgICByZXNbcCsrXSA9IChjID4+IDE4KSB8IDI0MDtcbiAgICAgICAgICByZXNbcCsrXSA9ICgoYyA+PiAxMikgJiA2MykgfCAxMjg7XG4gICAgICAgICAgcmVzW3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyAmIDYzKSB8IDEyODtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNbcCsrXSA9IChjID4+IDEyKSB8IDIyNDtcbiAgICAgICAgICByZXNbcCsrXSA9ICgoYyA+PiA2KSAmIDYzKSB8IDEyODtcbiAgICAgICAgICByZXNbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbmMgPT09ICdoZXgnKSB7XG4gICAgICBtc2cgPSBtc2cucmVwbGFjZSgvW15hLXowLTldKy9pZywgJycpO1xuICAgICAgaWYgKG1zZy5sZW5ndGggJSAyICE9PSAwKVxuICAgICAgICBtc2cgPSAnMCcgKyBtc2c7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICByZXMucHVzaChwYXJzZUludChtc2dbaV0gKyBtc2dbaSArIDFdLCAxNikpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgICAgcmVzW2ldID0gbXNnW2ldIHwgMDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy50b0FycmF5ID0gdG9BcnJheTtcblxuZnVuY3Rpb24gdG9IZXgobXNnKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgcmVzICs9IHplcm8yKG1zZ1tpXS50b1N0cmluZygxNikpO1xuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy50b0hleCA9IHRvSGV4O1xuXG5mdW5jdGlvbiBodG9ubCh3KSB7XG4gIHZhciByZXMgPSAodyA+Pj4gMjQpIHxcbiAgICAgICAgICAgICgodyA+Pj4gOCkgJiAweGZmMDApIHxcbiAgICAgICAgICAgICgodyA8PCA4KSAmIDB4ZmYwMDAwKSB8XG4gICAgICAgICAgICAoKHcgJiAweGZmKSA8PCAyNCk7XG4gIHJldHVybiByZXMgPj4+IDA7XG59XG5leHBvcnRzLmh0b25sID0gaHRvbmw7XG5cbmZ1bmN0aW9uIHRvSGV4MzIobXNnLCBlbmRpYW4pIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB3ID0gbXNnW2ldO1xuICAgIGlmIChlbmRpYW4gPT09ICdsaXR0bGUnKVxuICAgICAgdyA9IGh0b25sKHcpO1xuICAgIHJlcyArPSB6ZXJvOCh3LnRvU3RyaW5nKDE2KSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudG9IZXgzMiA9IHRvSGV4MzI7XG5cbmZ1bmN0aW9uIHplcm8yKHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG5leHBvcnRzLnplcm8yID0gemVybzI7XG5cbmZ1bmN0aW9uIHplcm84KHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSA3KVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNilcbiAgICByZXR1cm4gJzAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA1KVxuICAgIHJldHVybiAnMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA0KVxuICAgIHJldHVybiAnMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMylcbiAgICByZXR1cm4gJzAwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAyKVxuICAgIHJldHVybiAnMDAwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMDAwMDAwMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG5leHBvcnRzLnplcm84ID0gemVybzg7XG5cbmZ1bmN0aW9uIGpvaW4zMihtc2csIHN0YXJ0LCBlbmQsIGVuZGlhbikge1xuICB2YXIgbGVuID0gZW5kIC0gc3RhcnQ7XG4gIGFzc2VydChsZW4gJSA0ID09PSAwKTtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheShsZW4gLyA0KTtcbiAgZm9yICh2YXIgaSA9IDAsIGsgPSBzdGFydDsgaSA8IHJlcy5sZW5ndGg7IGkrKywgayArPSA0KSB7XG4gICAgdmFyIHc7XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2JpZycpXG4gICAgICB3ID0gKG1zZ1trXSA8PCAyNCkgfCAobXNnW2sgKyAxXSA8PCAxNikgfCAobXNnW2sgKyAyXSA8PCA4KSB8IG1zZ1trICsgM107XG4gICAgZWxzZVxuICAgICAgdyA9IChtc2dbayArIDNdIDw8IDI0KSB8IChtc2dbayArIDJdIDw8IDE2KSB8IChtc2dbayArIDFdIDw8IDgpIHwgbXNnW2tdO1xuICAgIHJlc1tpXSA9IHcgPj4+IDA7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMuam9pbjMyID0gam9pbjMyO1xuXG5mdW5jdGlvbiBzcGxpdDMyKG1zZywgZW5kaWFuKSB7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkobXNnLmxlbmd0aCAqIDQpO1xuICBmb3IgKHZhciBpID0gMCwgayA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyssIGsgKz0gNCkge1xuICAgIHZhciBtID0gbXNnW2ldO1xuICAgIGlmIChlbmRpYW4gPT09ICdiaWcnKSB7XG4gICAgICByZXNba10gPSBtID4+PiAyNDtcbiAgICAgIHJlc1trICsgMV0gPSAobSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgIHJlc1trICsgMl0gPSAobSA+Pj4gOCkgJiAweGZmO1xuICAgICAgcmVzW2sgKyAzXSA9IG0gJiAweGZmO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNbayArIDNdID0gbSA+Pj4gMjQ7XG4gICAgICByZXNbayArIDJdID0gKG0gPj4+IDE2KSAmIDB4ZmY7XG4gICAgICByZXNbayArIDFdID0gKG0gPj4+IDgpICYgMHhmZjtcbiAgICAgIHJlc1trXSA9IG0gJiAweGZmO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy5zcGxpdDMyID0gc3BsaXQzMjtcblxuZnVuY3Rpb24gcm90cjMyKHcsIGIpIHtcbiAgcmV0dXJuICh3ID4+PiBiKSB8ICh3IDw8ICgzMiAtIGIpKTtcbn1cbmV4cG9ydHMucm90cjMyID0gcm90cjMyO1xuXG5mdW5jdGlvbiByb3RsMzIodywgYikge1xuICByZXR1cm4gKHcgPDwgYikgfCAodyA+Pj4gKDMyIC0gYikpO1xufVxuZXhwb3J0cy5yb3RsMzIgPSByb3RsMzI7XG5cbmZ1bmN0aW9uIHN1bTMyKGEsIGIpIHtcbiAgcmV0dXJuIChhICsgYikgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyID0gc3VtMzI7XG5cbmZ1bmN0aW9uIHN1bTMyXzMoYSwgYiwgYykge1xuICByZXR1cm4gKGEgKyBiICsgYykgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyXzMgPSBzdW0zMl8zO1xuXG5mdW5jdGlvbiBzdW0zMl80KGEsIGIsIGMsIGQpIHtcbiAgcmV0dXJuIChhICsgYiArIGMgKyBkKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzJfNCA9IHN1bTMyXzQ7XG5cbmZ1bmN0aW9uIHN1bTMyXzUoYSwgYiwgYywgZCwgZSkge1xuICByZXR1cm4gKGEgKyBiICsgYyArIGQgKyBlKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzJfNSA9IHN1bTMyXzU7XG5cbmZ1bmN0aW9uIHN1bTY0KGJ1ZiwgcG9zLCBhaCwgYWwpIHtcbiAgdmFyIGJoID0gYnVmW3Bvc107XG4gIHZhciBibCA9IGJ1Zltwb3MgKyAxXTtcblxuICB2YXIgbG8gPSAoYWwgKyBibCkgPj4+IDA7XG4gIHZhciBoaSA9IChsbyA8IGFsID8gMSA6IDApICsgYWggKyBiaDtcbiAgYnVmW3Bvc10gPSBoaSA+Pj4gMDtcbiAgYnVmW3BvcyArIDFdID0gbG87XG59XG5leHBvcnRzLnN1bTY0ID0gc3VtNjQ7XG5cbmZ1bmN0aW9uIHN1bTY0X2hpKGFoLCBhbCwgYmgsIGJsKSB7XG4gIHZhciBsbyA9IChhbCArIGJsKSA+Pj4gMDtcbiAgdmFyIGhpID0gKGxvIDwgYWwgPyAxIDogMCkgKyBhaCArIGJoO1xuICByZXR1cm4gaGkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0X2hpID0gc3VtNjRfaGk7XG5cbmZ1bmN0aW9uIHN1bTY0X2xvKGFoLCBhbCwgYmgsIGJsKSB7XG4gIHZhciBsbyA9IGFsICsgYmw7XG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfbG8gPSBzdW02NF9sbztcblxuZnVuY3Rpb24gc3VtNjRfNF9oaShhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgdmFyIGxvID0gYWw7XG4gIGxvID0gKGxvICsgYmwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGFsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgY2wpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGNsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZGwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGRsID8gMSA6IDA7XG5cbiAgdmFyIGhpID0gYWggKyBiaCArIGNoICsgZGggKyBjYXJyeTtcbiAgcmV0dXJuIGhpID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF80X2hpID0gc3VtNjRfNF9oaTtcblxuZnVuY3Rpb24gc3VtNjRfNF9sbyhhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwpIHtcbiAgdmFyIGxvID0gYWwgKyBibCArIGNsICsgZGw7XG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfNF9sbyA9IHN1bTY0XzRfbG87XG5cbmZ1bmN0aW9uIHN1bTY0XzVfaGkoYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsLCBlaCwgZWwpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgdmFyIGxvID0gYWw7XG4gIGxvID0gKGxvICsgYmwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGFsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgY2wpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGNsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZGwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGRsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZWwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGVsID8gMSA6IDA7XG5cbiAgdmFyIGhpID0gYWggKyBiaCArIGNoICsgZGggKyBlaCArIGNhcnJ5O1xuICByZXR1cm4gaGkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0XzVfaGkgPSBzdW02NF81X2hpO1xuXG5mdW5jdGlvbiBzdW02NF81X2xvKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCwgZWgsIGVsKSB7XG4gIHZhciBsbyA9IGFsICsgYmwgKyBjbCArIGRsICsgZWw7XG5cbiAgcmV0dXJuIGxvID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF81X2xvID0gc3VtNjRfNV9sbztcblxuZnVuY3Rpb24gcm90cjY0X2hpKGFoLCBhbCwgbnVtKSB7XG4gIHZhciByID0gKGFsIDw8ICgzMiAtIG51bSkpIHwgKGFoID4+PiBudW0pO1xuICByZXR1cm4gciA+Pj4gMDtcbn1cbmV4cG9ydHMucm90cjY0X2hpID0gcm90cjY0X2hpO1xuXG5mdW5jdGlvbiByb3RyNjRfbG8oYWgsIGFsLCBudW0pIHtcbiAgdmFyIHIgPSAoYWggPDwgKDMyIC0gbnVtKSkgfCAoYWwgPj4+IG51bSk7XG4gIHJldHVybiByID4+PiAwO1xufVxuZXhwb3J0cy5yb3RyNjRfbG8gPSByb3RyNjRfbG87XG5cbmZ1bmN0aW9uIHNocjY0X2hpKGFoLCBhbCwgbnVtKSB7XG4gIHJldHVybiBhaCA+Pj4gbnVtO1xufVxuZXhwb3J0cy5zaHI2NF9oaSA9IHNocjY0X2hpO1xuXG5mdW5jdGlvbiBzaHI2NF9sbyhhaCwgYWwsIG51bSkge1xuICB2YXIgciA9IChhaCA8PCAoMzIgLSBudW0pKSB8IChhbCA+Pj4gbnVtKTtcbiAgcmV0dXJuIHIgPj4+IDA7XG59XG5leHBvcnRzLnNocjY0X2xvID0gc2hyNjRfbG87XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuZnVuY3Rpb24gQmxvY2tIYXNoKCkge1xuICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuICB0aGlzLnBlbmRpbmdUb3RhbCA9IDA7XG4gIHRoaXMuYmxvY2tTaXplID0gdGhpcy5jb25zdHJ1Y3Rvci5ibG9ja1NpemU7XG4gIHRoaXMub3V0U2l6ZSA9IHRoaXMuY29uc3RydWN0b3Iub3V0U2l6ZTtcbiAgdGhpcy5obWFjU3RyZW5ndGggPSB0aGlzLmNvbnN0cnVjdG9yLmhtYWNTdHJlbmd0aDtcbiAgdGhpcy5wYWRMZW5ndGggPSB0aGlzLmNvbnN0cnVjdG9yLnBhZExlbmd0aCAvIDg7XG4gIHRoaXMuZW5kaWFuID0gJ2JpZyc7XG5cbiAgdGhpcy5fZGVsdGE4ID0gdGhpcy5ibG9ja1NpemUgLyA4O1xuICB0aGlzLl9kZWx0YTMyID0gdGhpcy5ibG9ja1NpemUgLyAzMjtcbn1cbmV4cG9ydHMuQmxvY2tIYXNoID0gQmxvY2tIYXNoO1xuXG5CbG9ja0hhc2gucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIGVuYykge1xuICAvLyBDb252ZXJ0IG1lc3NhZ2UgdG8gYXJyYXksIHBhZCBpdCwgYW5kIGpvaW4gaW50byAzMmJpdCBibG9ja3NcbiAgbXNnID0gdXRpbHMudG9BcnJheShtc2csIGVuYyk7XG4gIGlmICghdGhpcy5wZW5kaW5nKVxuICAgIHRoaXMucGVuZGluZyA9IG1zZztcbiAgZWxzZVxuICAgIHRoaXMucGVuZGluZyA9IHRoaXMucGVuZGluZy5jb25jYXQobXNnKTtcbiAgdGhpcy5wZW5kaW5nVG90YWwgKz0gbXNnLmxlbmd0aDtcblxuICAvLyBFbm91Z2ggZGF0YSwgdHJ5IHVwZGF0aW5nXG4gIGlmICh0aGlzLnBlbmRpbmcubGVuZ3RoID49IHRoaXMuX2RlbHRhOCkge1xuICAgIG1zZyA9IHRoaXMucGVuZGluZztcblxuICAgIC8vIFByb2Nlc3MgcGVuZGluZyBkYXRhIGluIGJsb2Nrc1xuICAgIHZhciByID0gbXNnLmxlbmd0aCAlIHRoaXMuX2RlbHRhODtcbiAgICB0aGlzLnBlbmRpbmcgPSBtc2cuc2xpY2UobXNnLmxlbmd0aCAtIHIsIG1zZy5sZW5ndGgpO1xuICAgIGlmICh0aGlzLnBlbmRpbmcubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5wZW5kaW5nID0gbnVsbDtcblxuICAgIG1zZyA9IHV0aWxzLmpvaW4zMihtc2csIDAsIG1zZy5sZW5ndGggLSByLCB0aGlzLmVuZGlhbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpICs9IHRoaXMuX2RlbHRhMzIpXG4gICAgICB0aGlzLl91cGRhdGUobXNnLCBpLCBpICsgdGhpcy5fZGVsdGEzMik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkJsb2NrSGFzaC5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICB0aGlzLnVwZGF0ZSh0aGlzLl9wYWQoKSk7XG4gIGFzc2VydCh0aGlzLnBlbmRpbmcgPT09IG51bGwpO1xuXG4gIHJldHVybiB0aGlzLl9kaWdlc3QoZW5jKTtcbn07XG5cbkJsb2NrSGFzaC5wcm90b3R5cGUuX3BhZCA9IGZ1bmN0aW9uIHBhZCgpIHtcbiAgdmFyIGxlbiA9IHRoaXMucGVuZGluZ1RvdGFsO1xuICB2YXIgYnl0ZXMgPSB0aGlzLl9kZWx0YTg7XG4gIHZhciBrID0gYnl0ZXMgLSAoKGxlbiArIHRoaXMucGFkTGVuZ3RoKSAlIGJ5dGVzKTtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheShrICsgdGhpcy5wYWRMZW5ndGgpO1xuICByZXNbMF0gPSAweDgwO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGs7IGkrKylcbiAgICByZXNbaV0gPSAwO1xuXG4gIC8vIEFwcGVuZCBsZW5ndGhcbiAgbGVuIDw8PSAzO1xuICBpZiAodGhpcy5lbmRpYW4gPT09ICdiaWcnKSB7XG4gICAgZm9yICh2YXIgdCA9IDg7IHQgPCB0aGlzLnBhZExlbmd0aDsgdCsrKVxuICAgICAgcmVzW2krK10gPSAwO1xuXG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMjQpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDE2KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiA4KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSBsZW4gJiAweGZmO1xuICB9IGVsc2Uge1xuICAgIHJlc1tpKytdID0gbGVuICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDgpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDE2KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAyNCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcblxuICAgIGZvciAodCA9IDg7IHQgPCB0aGlzLnBhZExlbmd0aDsgdCsrKVxuICAgICAgcmVzW2krK10gPSAwO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciByb3RyMzIgPSB1dGlscy5yb3RyMzI7XG5cbmZ1bmN0aW9uIGZ0XzEocywgeCwgeSwgeikge1xuICBpZiAocyA9PT0gMClcbiAgICByZXR1cm4gY2gzMih4LCB5LCB6KTtcbiAgaWYgKHMgPT09IDEgfHwgcyA9PT0gMylcbiAgICByZXR1cm4gcDMyKHgsIHksIHopO1xuICBpZiAocyA9PT0gMilcbiAgICByZXR1cm4gbWFqMzIoeCwgeSwgeik7XG59XG5leHBvcnRzLmZ0XzEgPSBmdF8xO1xuXG5mdW5jdGlvbiBjaDMyKHgsIHksIHopIHtcbiAgcmV0dXJuICh4ICYgeSkgXiAoKH54KSAmIHopO1xufVxuZXhwb3J0cy5jaDMyID0gY2gzMjtcblxuZnVuY3Rpb24gbWFqMzIoeCwgeSwgeikge1xuICByZXR1cm4gKHggJiB5KSBeICh4ICYgeikgXiAoeSAmIHopO1xufVxuZXhwb3J0cy5tYWozMiA9IG1hajMyO1xuXG5mdW5jdGlvbiBwMzIoeCwgeSwgeikge1xuICByZXR1cm4geCBeIHkgXiB6O1xufVxuZXhwb3J0cy5wMzIgPSBwMzI7XG5cbmZ1bmN0aW9uIHMwXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgMikgXiByb3RyMzIoeCwgMTMpIF4gcm90cjMyKHgsIDIyKTtcbn1cbmV4cG9ydHMuczBfMjU2ID0gczBfMjU2O1xuXG5mdW5jdGlvbiBzMV8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDYpIF4gcm90cjMyKHgsIDExKSBeIHJvdHIzMih4LCAyNSk7XG59XG5leHBvcnRzLnMxXzI1NiA9IHMxXzI1NjtcblxuZnVuY3Rpb24gZzBfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCA3KSBeIHJvdHIzMih4LCAxOCkgXiAoeCA+Pj4gMyk7XG59XG5leHBvcnRzLmcwXzI1NiA9IGcwXzI1NjtcblxuZnVuY3Rpb24gZzFfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCAxNykgXiByb3RyMzIoeCwgMTkpIF4gKHggPj4+IDEwKTtcbn1cbmV4cG9ydHMuZzFfMjU2ID0gZzFfMjU2O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG52YXIgc2hhQ29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxudmFyIHJvdGwzMiA9IHV0aWxzLnJvdGwzMjtcbnZhciBzdW0zMiA9IHV0aWxzLnN1bTMyO1xudmFyIHN1bTMyXzUgPSB1dGlscy5zdW0zMl81O1xudmFyIGZ0XzEgPSBzaGFDb21tb24uZnRfMTtcbnZhciBCbG9ja0hhc2ggPSBjb21tb24uQmxvY2tIYXNoO1xuXG52YXIgc2hhMV9LID0gW1xuICAweDVBODI3OTk5LCAweDZFRDlFQkExLFxuICAweDhGMUJCQ0RDLCAweENBNjJDMUQ2XG5dO1xuXG5mdW5jdGlvbiBTSEExKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBMSkpXG4gICAgcmV0dXJuIG5ldyBTSEExKCk7XG5cbiAgQmxvY2tIYXNoLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweDY3NDUyMzAxLCAweGVmY2RhYjg5LCAweDk4YmFkY2ZlLFxuICAgIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjAgXTtcbiAgdGhpcy5XID0gbmV3IEFycmF5KDgwKTtcbn1cblxudXRpbHMuaW5oZXJpdHMoU0hBMSwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMTtcblxuU0hBMS5ibG9ja1NpemUgPSA1MTI7XG5TSEExLm91dFNpemUgPSAxNjA7XG5TSEExLmhtYWNTdHJlbmd0aCA9IDgwO1xuU0hBMS5wYWRMZW5ndGggPSA2NDtcblxuU0hBMS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIF91cGRhdGUobXNnLCBzdGFydCkge1xuICB2YXIgVyA9IHRoaXMuVztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspXG4gICAgV1tpXSA9IG1zZ1tzdGFydCArIGldO1xuXG4gIGZvcig7IGkgPCBXLmxlbmd0aDsgaSsrKVxuICAgIFdbaV0gPSByb3RsMzIoV1tpIC0gM10gXiBXW2kgLSA4XSBeIFdbaSAtIDE0XSBeIFdbaSAtIDE2XSwgMSk7XG5cbiAgdmFyIGEgPSB0aGlzLmhbMF07XG4gIHZhciBiID0gdGhpcy5oWzFdO1xuICB2YXIgYyA9IHRoaXMuaFsyXTtcbiAgdmFyIGQgPSB0aGlzLmhbM107XG4gIHZhciBlID0gdGhpcy5oWzRdO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBXLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHMgPSB+fihpIC8gMjApO1xuICAgIHZhciB0ID0gc3VtMzJfNShyb3RsMzIoYSwgNSksIGZ0XzEocywgYiwgYywgZCksIGUsIFdbaV0sIHNoYTFfS1tzXSk7XG4gICAgZSA9IGQ7XG4gICAgZCA9IGM7XG4gICAgYyA9IHJvdGwzMihiLCAzMCk7XG4gICAgYiA9IGE7XG4gICAgYSA9IHQ7XG4gIH1cblxuICB0aGlzLmhbMF0gPSBzdW0zMih0aGlzLmhbMF0sIGEpO1xuICB0aGlzLmhbMV0gPSBzdW0zMih0aGlzLmhbMV0sIGIpO1xuICB0aGlzLmhbMl0gPSBzdW0zMih0aGlzLmhbMl0sIGMpO1xuICB0aGlzLmhbM10gPSBzdW0zMih0aGlzLmhbM10sIGQpO1xuICB0aGlzLmhbNF0gPSBzdW0zMih0aGlzLmhbNF0sIGUpO1xufTtcblxuU0hBMS5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdiaWcnKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBzaGFDb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxudmFyIHN1bTMyID0gdXRpbHMuc3VtMzI7XG52YXIgc3VtMzJfNCA9IHV0aWxzLnN1bTMyXzQ7XG52YXIgc3VtMzJfNSA9IHV0aWxzLnN1bTMyXzU7XG52YXIgY2gzMiA9IHNoYUNvbW1vbi5jaDMyO1xudmFyIG1hajMyID0gc2hhQ29tbW9uLm1hajMyO1xudmFyIHMwXzI1NiA9IHNoYUNvbW1vbi5zMF8yNTY7XG52YXIgczFfMjU2ID0gc2hhQ29tbW9uLnMxXzI1NjtcbnZhciBnMF8yNTYgPSBzaGFDb21tb24uZzBfMjU2O1xudmFyIGcxXzI1NiA9IHNoYUNvbW1vbi5nMV8yNTY7XG5cbnZhciBCbG9ja0hhc2ggPSBjb21tb24uQmxvY2tIYXNoO1xuXG52YXIgc2hhMjU2X0sgPSBbXG4gIDB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsXG4gIDB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsIDB4OTIzZjgyYTQsIDB4YWIxYzVlZDUsXG4gIDB4ZDgwN2FhOTgsIDB4MTI4MzViMDEsIDB4MjQzMTg1YmUsIDB4NTUwYzdkYzMsXG4gIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsXG4gIDB4ZTQ5YjY5YzEsIDB4ZWZiZTQ3ODYsIDB4MGZjMTlkYzYsIDB4MjQwY2ExY2MsXG4gIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsXG4gIDB4OTgzZTUxNTIsIDB4YTgzMWM2NmQsIDB4YjAwMzI3YzgsIDB4YmY1OTdmYzcsXG4gIDB4YzZlMDBiZjMsIDB4ZDVhNzkxNDcsIDB4MDZjYTYzNTEsIDB4MTQyOTI5NjcsXG4gIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsXG4gIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsXG4gIDB4YTJiZmU4YTEsIDB4YTgxYTY2NGIsIDB4YzI0YjhiNzAsIDB4Yzc2YzUxYTMsXG4gIDB4ZDE5MmU4MTksIDB4ZDY5OTA2MjQsIDB4ZjQwZTM1ODUsIDB4MTA2YWEwNzAsXG4gIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsXG4gIDB4MzkxYzBjYjMsIDB4NGVkOGFhNGEsIDB4NWI5Y2NhNGYsIDB4NjgyZTZmZjMsXG4gIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsXG4gIDB4OTBiZWZmZmEsIDB4YTQ1MDZjZWIsIDB4YmVmOWEzZjcsIDB4YzY3MTc4ZjJcbl07XG5cbmZ1bmN0aW9uIFNIQTI1NigpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTI1NikpXG4gICAgcmV0dXJuIG5ldyBTSEEyNTYoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4NmEwOWU2NjcsIDB4YmI2N2FlODUsIDB4M2M2ZWYzNzIsIDB4YTU0ZmY1M2EsXG4gICAgMHg1MTBlNTI3ZiwgMHg5YjA1Njg4YywgMHgxZjgzZDlhYiwgMHg1YmUwY2QxOVxuICBdO1xuICB0aGlzLmsgPSBzaGEyNTZfSztcbiAgdGhpcy5XID0gbmV3IEFycmF5KDY0KTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTI1NiwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMjU2O1xuXG5TSEEyNTYuYmxvY2tTaXplID0gNTEyO1xuU0hBMjU2Lm91dFNpemUgPSAyNTY7XG5TSEEyNTYuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBMjU2LnBhZExlbmd0aCA9IDY0O1xuXG5TSEEyNTYucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcbiAgZm9yICg7IGkgPCBXLmxlbmd0aDsgaSsrKVxuICAgIFdbaV0gPSBzdW0zMl80KGcxXzI1NihXW2kgLSAyXSksIFdbaSAtIDddLCBnMF8yNTYoV1tpIC0gMTVdKSwgV1tpIC0gMTZdKTtcblxuICB2YXIgYSA9IHRoaXMuaFswXTtcbiAgdmFyIGIgPSB0aGlzLmhbMV07XG4gIHZhciBjID0gdGhpcy5oWzJdO1xuICB2YXIgZCA9IHRoaXMuaFszXTtcbiAgdmFyIGUgPSB0aGlzLmhbNF07XG4gIHZhciBmID0gdGhpcy5oWzVdO1xuICB2YXIgZyA9IHRoaXMuaFs2XTtcbiAgdmFyIGggPSB0aGlzLmhbN107XG5cbiAgYXNzZXJ0KHRoaXMuay5sZW5ndGggPT09IFcubGVuZ3RoKTtcbiAgZm9yIChpID0gMDsgaSA8IFcubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgVDEgPSBzdW0zMl81KGgsIHMxXzI1NihlKSwgY2gzMihlLCBmLCBnKSwgdGhpcy5rW2ldLCBXW2ldKTtcbiAgICB2YXIgVDIgPSBzdW0zMihzMF8yNTYoYSksIG1hajMyKGEsIGIsIGMpKTtcbiAgICBoID0gZztcbiAgICBnID0gZjtcbiAgICBmID0gZTtcbiAgICBlID0gc3VtMzIoZCwgVDEpO1xuICAgIGQgPSBjO1xuICAgIGMgPSBiO1xuICAgIGIgPSBhO1xuICAgIGEgPSBzdW0zMihUMSwgVDIpO1xuICB9XG5cbiAgdGhpcy5oWzBdID0gc3VtMzIodGhpcy5oWzBdLCBhKTtcbiAgdGhpcy5oWzFdID0gc3VtMzIodGhpcy5oWzFdLCBiKTtcbiAgdGhpcy5oWzJdID0gc3VtMzIodGhpcy5oWzJdLCBjKTtcbiAgdGhpcy5oWzNdID0gc3VtMzIodGhpcy5oWzNdLCBkKTtcbiAgdGhpcy5oWzRdID0gc3VtMzIodGhpcy5oWzRdLCBlKTtcbiAgdGhpcy5oWzVdID0gc3VtMzIodGhpcy5oWzVdLCBmKTtcbiAgdGhpcy5oWzZdID0gc3VtMzIodGhpcy5oWzZdLCBnKTtcbiAgdGhpcy5oWzddID0gc3VtMzIodGhpcy5oWzddLCBoKTtcbn07XG5cblNIQTI1Ni5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdiaWcnKTtcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBTSEEyNTYgPSByZXF1aXJlKCcuLzI1NicpO1xuXG5mdW5jdGlvbiBTSEEyMjQoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEyMjQpKVxuICAgIHJldHVybiBuZXcgU0hBMjI0KCk7XG5cbiAgU0hBMjU2LmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweGMxMDU5ZWQ4LCAweDM2N2NkNTA3LCAweDMwNzBkZDE3LCAweGY3MGU1OTM5LFxuICAgIDB4ZmZjMDBiMzEsIDB4Njg1ODE1MTEsIDB4NjRmOThmYTcsIDB4YmVmYTRmYTQgXTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTIyNCwgU0hBMjU2KTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMjI0O1xuXG5TSEEyMjQuYmxvY2tTaXplID0gNTEyO1xuU0hBMjI0Lm91dFNpemUgPSAyMjQ7XG5TSEEyMjQuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBMjI0LnBhZExlbmd0aCA9IDY0O1xuXG5TSEEyMjQucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIC8vIEp1c3QgdHJ1bmNhdGUgb3V0cHV0XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaC5zbGljZSgwLCA3KSwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsIDcpLCAnYmlnJyk7XG59O1xuXG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbnZhciByb3RyNjRfaGkgPSB1dGlscy5yb3RyNjRfaGk7XG52YXIgcm90cjY0X2xvID0gdXRpbHMucm90cjY0X2xvO1xudmFyIHNocjY0X2hpID0gdXRpbHMuc2hyNjRfaGk7XG52YXIgc2hyNjRfbG8gPSB1dGlscy5zaHI2NF9sbztcbnZhciBzdW02NCA9IHV0aWxzLnN1bTY0O1xudmFyIHN1bTY0X2hpID0gdXRpbHMuc3VtNjRfaGk7XG52YXIgc3VtNjRfbG8gPSB1dGlscy5zdW02NF9sbztcbnZhciBzdW02NF80X2hpID0gdXRpbHMuc3VtNjRfNF9oaTtcbnZhciBzdW02NF80X2xvID0gdXRpbHMuc3VtNjRfNF9sbztcbnZhciBzdW02NF81X2hpID0gdXRpbHMuc3VtNjRfNV9oaTtcbnZhciBzdW02NF81X2xvID0gdXRpbHMuc3VtNjRfNV9sbztcblxudmFyIEJsb2NrSGFzaCA9IGNvbW1vbi5CbG9ja0hhc2g7XG5cbnZhciBzaGE1MTJfSyA9IFtcbiAgMHg0MjhhMmY5OCwgMHhkNzI4YWUyMiwgMHg3MTM3NDQ5MSwgMHgyM2VmNjVjZCxcbiAgMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiwgMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyxcbiAgMHgzOTU2YzI1YiwgMHhmMzQ4YjUzOCwgMHg1OWYxMTFmMSwgMHhiNjA1ZDAxOSxcbiAgMHg5MjNmODJhNCwgMHhhZjE5NGY5YiwgMHhhYjFjNWVkNSwgMHhkYTZkODExOCxcbiAgMHhkODA3YWE5OCwgMHhhMzAzMDI0MiwgMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSxcbiAgMHgyNDMxODViZSwgMHg0ZWU0YjI4YywgMHg1NTBjN2RjMywgMHhkNWZmYjRlMixcbiAgMHg3MmJlNWQ3NCwgMHhmMjdiODk2ZiwgMHg4MGRlYjFmZSwgMHgzYjE2OTZiMSxcbiAgMHg5YmRjMDZhNywgMHgyNWM3MTIzNSwgMHhjMTliZjE3NCwgMHhjZjY5MjY5NCxcbiAgMHhlNDliNjljMSwgMHg5ZWYxNGFkMiwgMHhlZmJlNDc4NiwgMHgzODRmMjVlMyxcbiAgMHgwZmMxOWRjNiwgMHg4YjhjZDViNSwgMHgyNDBjYTFjYywgMHg3N2FjOWM2NSxcbiAgMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSwgMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyxcbiAgMHg1Y2IwYTlkYywgMHhiZDQxZmJkNCwgMHg3NmY5ODhkYSwgMHg4MzExNTNiNSxcbiAgMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiwgMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCxcbiAgMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiwgMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCxcbiAgMHhjNmUwMGJmMywgMHgzZGE4OGZjMiwgMHhkNWE3OTE0NywgMHg5MzBhYTcyNSxcbiAgMHgwNmNhNjM1MSwgMHhlMDAzODI2ZiwgMHgxNDI5Mjk2NywgMHgwYTBlNmU3MCxcbiAgMHgyN2I3MGE4NSwgMHg0NmQyMmZmYywgMHgyZTFiMjEzOCwgMHg1YzI2YzkyNixcbiAgMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCwgMHg1MzM4MGQxMywgMHg5ZDk1YjNkZixcbiAgMHg2NTBhNzM1NCwgMHg4YmFmNjNkZSwgMHg3NjZhMGFiYiwgMHgzYzc3YjJhOCxcbiAgMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiwgMHg5MjcyMmM4NSwgMHgxNDgyMzUzYixcbiAgMHhhMmJmZThhMSwgMHg0Y2YxMDM2NCwgMHhhODFhNjY0YiwgMHhiYzQyMzAwMSxcbiAgMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSwgMHhjNzZjNTFhMywgMHgwNjU0YmUzMCxcbiAgMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCwgMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCxcbiAgMHhmNDBlMzU4NSwgMHg1NzcxMjAyYSwgMHgxMDZhYTA3MCwgMHgzMmJiZDFiOCxcbiAgMHgxOWE0YzExNiwgMHhiOGQyZDBjOCwgMHgxZTM3NmMwOCwgMHg1MTQxYWI1MyxcbiAgMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSwgMHgzNGIwYmNiNSwgMHhlMTliNDhhOCxcbiAgMHgzOTFjMGNiMywgMHhjNWM5NWE2MywgMHg0ZWQ4YWE0YSwgMHhlMzQxOGFjYixcbiAgMHg1YjljY2E0ZiwgMHg3NzYzZTM3MywgMHg2ODJlNmZmMywgMHhkNmIyYjhhMyxcbiAgMHg3NDhmODJlZSwgMHg1ZGVmYjJmYywgMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCxcbiAgMHg4NGM4NzgxNCwgMHhhMWYwYWI3MiwgMHg4Y2M3MDIwOCwgMHgxYTY0MzllYyxcbiAgMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCwgMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSxcbiAgMHhiZWY5YTNmNywgMHhiMmM2NzkxNSwgMHhjNjcxNzhmMiwgMHhlMzcyNTMyYixcbiAgMHhjYTI3M2VjZSwgMHhlYTI2NjE5YywgMHhkMTg2YjhjNywgMHgyMWMwYzIwNyxcbiAgMHhlYWRhN2RkNiwgMHhjZGUwZWIxZSwgMHhmNTdkNGY3ZiwgMHhlZTZlZDE3OCxcbiAgMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSwgMHgwYTYzN2RjNSwgMHhhMmM4OThhNixcbiAgMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSwgMHgxYjcxMGIzNSwgMHgxMzFjNDcxYixcbiAgMHgyOGRiNzdmNSwgMHgyMzA0N2Q4NCwgMHgzMmNhYWI3YiwgMHg0MGM3MjQ5MyxcbiAgMHgzYzllYmUwYSwgMHgxNWM5YmViYywgMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyxcbiAgMHg0Y2M1ZDRiZSwgMHhjYjNlNDJiNiwgMHg1OTdmMjk5YywgMHhmYzY1N2UyYSxcbiAgMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYywgMHg2YzQ0MTk4YywgMHg0YTQ3NTgxN1xuXTtcblxuZnVuY3Rpb24gU0hBNTEyKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBNTEyKSlcbiAgICByZXR1cm4gbmV3IFNIQTUxMigpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHg2YTA5ZTY2NywgMHhmM2JjYzkwOCxcbiAgICAweGJiNjdhZTg1LCAweDg0Y2FhNzNiLFxuICAgIDB4M2M2ZWYzNzIsIDB4ZmU5NGY4MmIsXG4gICAgMHhhNTRmZjUzYSwgMHg1ZjFkMzZmMSxcbiAgICAweDUxMGU1MjdmLCAweGFkZTY4MmQxLFxuICAgIDB4OWIwNTY4OGMsIDB4MmIzZTZjMWYsXG4gICAgMHgxZjgzZDlhYiwgMHhmYjQxYmQ2YixcbiAgICAweDViZTBjZDE5LCAweDEzN2UyMTc5IF07XG4gIHRoaXMuayA9IHNoYTUxMl9LO1xuICB0aGlzLlcgPSBuZXcgQXJyYXkoMTYwKTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTUxMiwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBNTEyO1xuXG5TSEE1MTIuYmxvY2tTaXplID0gMTAyNDtcblNIQTUxMi5vdXRTaXplID0gNTEyO1xuU0hBNTEyLmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTUxMi5wYWRMZW5ndGggPSAxMjg7XG5cblNIQTUxMi5wcm90b3R5cGUuX3ByZXBhcmVCbG9jayA9IGZ1bmN0aW9uIF9wcmVwYXJlQmxvY2sobXNnLCBzdGFydCkge1xuICB2YXIgVyA9IHRoaXMuVztcblxuICAvLyAzMiB4IDMyYml0IHdvcmRzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzI7IGkrKylcbiAgICBXW2ldID0gbXNnW3N0YXJ0ICsgaV07XG4gIGZvciAoOyBpIDwgVy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBjMF9oaSA9IGcxXzUxMl9oaShXW2kgLSA0XSwgV1tpIC0gM10pOyAgLy8gaSAtIDJcbiAgICB2YXIgYzBfbG8gPSBnMV81MTJfbG8oV1tpIC0gNF0sIFdbaSAtIDNdKTtcbiAgICB2YXIgYzFfaGkgPSBXW2kgLSAxNF07ICAvLyBpIC0gN1xuICAgIHZhciBjMV9sbyA9IFdbaSAtIDEzXTtcbiAgICB2YXIgYzJfaGkgPSBnMF81MTJfaGkoV1tpIC0gMzBdLCBXW2kgLSAyOV0pOyAgLy8gaSAtIDE1XG4gICAgdmFyIGMyX2xvID0gZzBfNTEyX2xvKFdbaSAtIDMwXSwgV1tpIC0gMjldKTtcbiAgICB2YXIgYzNfaGkgPSBXW2kgLSAzMl07ICAvLyBpIC0gMTZcbiAgICB2YXIgYzNfbG8gPSBXW2kgLSAzMV07XG5cbiAgICBXW2ldID0gc3VtNjRfNF9oaShcbiAgICAgIGMwX2hpLCBjMF9sbyxcbiAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgIGMzX2hpLCBjM19sbyk7XG4gICAgV1tpICsgMV0gPSBzdW02NF80X2xvKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvKTtcbiAgfVxufTtcblxuU0hBNTEyLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gX3VwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHRoaXMuX3ByZXBhcmVCbG9jayhtc2csIHN0YXJ0KTtcblxuICB2YXIgVyA9IHRoaXMuVztcblxuICB2YXIgYWggPSB0aGlzLmhbMF07XG4gIHZhciBhbCA9IHRoaXMuaFsxXTtcbiAgdmFyIGJoID0gdGhpcy5oWzJdO1xuICB2YXIgYmwgPSB0aGlzLmhbM107XG4gIHZhciBjaCA9IHRoaXMuaFs0XTtcbiAgdmFyIGNsID0gdGhpcy5oWzVdO1xuICB2YXIgZGggPSB0aGlzLmhbNl07XG4gIHZhciBkbCA9IHRoaXMuaFs3XTtcbiAgdmFyIGVoID0gdGhpcy5oWzhdO1xuICB2YXIgZWwgPSB0aGlzLmhbOV07XG4gIHZhciBmaCA9IHRoaXMuaFsxMF07XG4gIHZhciBmbCA9IHRoaXMuaFsxMV07XG4gIHZhciBnaCA9IHRoaXMuaFsxMl07XG4gIHZhciBnbCA9IHRoaXMuaFsxM107XG4gIHZhciBoaCA9IHRoaXMuaFsxNF07XG4gIHZhciBobCA9IHRoaXMuaFsxNV07XG5cbiAgYXNzZXJ0KHRoaXMuay5sZW5ndGggPT09IFcubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBXLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGMwX2hpID0gaGg7XG4gICAgdmFyIGMwX2xvID0gaGw7XG4gICAgdmFyIGMxX2hpID0gczFfNTEyX2hpKGVoLCBlbCk7XG4gICAgdmFyIGMxX2xvID0gczFfNTEyX2xvKGVoLCBlbCk7XG4gICAgdmFyIGMyX2hpID0gY2g2NF9oaShlaCwgZWwsIGZoLCBmbCwgZ2gsIGdsKTtcbiAgICB2YXIgYzJfbG8gPSBjaDY0X2xvKGVoLCBlbCwgZmgsIGZsLCBnaCwgZ2wpO1xuICAgIHZhciBjM19oaSA9IHRoaXMua1tpXTtcbiAgICB2YXIgYzNfbG8gPSB0aGlzLmtbaSArIDFdO1xuICAgIHZhciBjNF9oaSA9IFdbaV07XG4gICAgdmFyIGM0X2xvID0gV1tpICsgMV07XG5cbiAgICB2YXIgVDFfaGkgPSBzdW02NF81X2hpKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvLFxuICAgICAgYzRfaGksIGM0X2xvKTtcbiAgICB2YXIgVDFfbG8gPSBzdW02NF81X2xvKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvLFxuICAgICAgYzRfaGksIGM0X2xvKTtcblxuICAgIGMwX2hpID0gczBfNTEyX2hpKGFoLCBhbCk7XG4gICAgYzBfbG8gPSBzMF81MTJfbG8oYWgsIGFsKTtcbiAgICBjMV9oaSA9IG1hajY0X2hpKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wpO1xuICAgIGMxX2xvID0gbWFqNjRfbG8oYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCk7XG5cbiAgICB2YXIgVDJfaGkgPSBzdW02NF9oaShjMF9oaSwgYzBfbG8sIGMxX2hpLCBjMV9sbyk7XG4gICAgdmFyIFQyX2xvID0gc3VtNjRfbG8oYzBfaGksIGMwX2xvLCBjMV9oaSwgYzFfbG8pO1xuXG4gICAgaGggPSBnaDtcbiAgICBobCA9IGdsO1xuXG4gICAgZ2ggPSBmaDtcbiAgICBnbCA9IGZsO1xuXG4gICAgZmggPSBlaDtcbiAgICBmbCA9IGVsO1xuXG4gICAgZWggPSBzdW02NF9oaShkaCwgZGwsIFQxX2hpLCBUMV9sbyk7XG4gICAgZWwgPSBzdW02NF9sbyhkbCwgZGwsIFQxX2hpLCBUMV9sbyk7XG5cbiAgICBkaCA9IGNoO1xuICAgIGRsID0gY2w7XG5cbiAgICBjaCA9IGJoO1xuICAgIGNsID0gYmw7XG5cbiAgICBiaCA9IGFoO1xuICAgIGJsID0gYWw7XG5cbiAgICBhaCA9IHN1bTY0X2hpKFQxX2hpLCBUMV9sbywgVDJfaGksIFQyX2xvKTtcbiAgICBhbCA9IHN1bTY0X2xvKFQxX2hpLCBUMV9sbywgVDJfaGksIFQyX2xvKTtcbiAgfVxuXG4gIHN1bTY0KHRoaXMuaCwgMCwgYWgsIGFsKTtcbiAgc3VtNjQodGhpcy5oLCAyLCBiaCwgYmwpO1xuICBzdW02NCh0aGlzLmgsIDQsIGNoLCBjbCk7XG4gIHN1bTY0KHRoaXMuaCwgNiwgZGgsIGRsKTtcbiAgc3VtNjQodGhpcy5oLCA4LCBlaCwgZWwpO1xuICBzdW02NCh0aGlzLmgsIDEwLCBmaCwgZmwpO1xuICBzdW02NCh0aGlzLmgsIDEyLCBnaCwgZ2wpO1xuICBzdW02NCh0aGlzLmgsIDE0LCBoaCwgaGwpO1xufTtcblxuU0hBNTEyLnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmgsICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaCwgJ2JpZycpO1xufTtcblxuZnVuY3Rpb24gY2g2NF9oaSh4aCwgeGwsIHloLCB5bCwgemgpIHtcbiAgdmFyIHIgPSAoeGggJiB5aCkgXiAoKH54aCkgJiB6aCk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gY2g2NF9sbyh4aCwgeGwsIHloLCB5bCwgemgsIHpsKSB7XG4gIHZhciByID0gKHhsICYgeWwpIF4gKCh+eGwpICYgemwpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIG1hajY0X2hpKHhoLCB4bCwgeWgsIHlsLCB6aCkge1xuICB2YXIgciA9ICh4aCAmIHloKSBeICh4aCAmIHpoKSBeICh5aCAmIHpoKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBtYWo2NF9sbyh4aCwgeGwsIHloLCB5bCwgemgsIHpsKSB7XG4gIHZhciByID0gKHhsICYgeWwpIF4gKHhsICYgemwpIF4gKHlsICYgemwpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMwXzUxMl9oaSh4aCwgeGwpIHtcbiAgdmFyIGMwX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMjgpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGwsIHhoLCAyKTsgIC8vIDM0XG4gIHZhciBjMl9oaSA9IHJvdHI2NF9oaSh4bCwgeGgsIDcpOyAgLy8gMzlcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBzMF81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDI4KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgMik7ICAvLyAzNFxuICB2YXIgYzJfbG8gPSByb3RyNjRfbG8oeGwsIHhoLCA3KTsgIC8vIDM5XG5cbiAgdmFyIHIgPSBjMF9sbyBeIGMxX2xvIF4gYzJfbG87XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gczFfNTEyX2hpKHhoLCB4bCkge1xuICB2YXIgYzBfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAxNCk7XG4gIHZhciBjMV9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE4KTtcbiAgdmFyIGMyX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgOSk7ICAvLyA0MVxuXG4gIHZhciByID0gYzBfaGkgXiBjMV9oaSBeIGMyX2hpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMxXzUxMl9sbyh4aCwgeGwpIHtcbiAgdmFyIGMwX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMTQpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAxOCk7XG4gIHZhciBjMl9sbyA9IHJvdHI2NF9sbyh4bCwgeGgsIDkpOyAgLy8gNDFcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMF81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDEpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCA4KTtcbiAgdmFyIGMyX2hpID0gc2hyNjRfaGkoeGgsIHhsLCA3KTtcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMF81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDEpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCA4KTtcbiAgdmFyIGMyX2xvID0gc2hyNjRfbG8oeGgsIHhsLCA3KTtcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMV81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE5KTtcbiAgdmFyIGMxX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgMjkpOyAgLy8gNjFcbiAgdmFyIGMyX2hpID0gc2hyNjRfaGkoeGgsIHhsLCA2KTtcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMV81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDE5KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgMjkpOyAgLy8gNjFcbiAgdmFyIGMyX2xvID0gc2hyNjRfbG8oeGgsIHhsLCA2KTtcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbnZhciBTSEE1MTIgPSByZXF1aXJlKCcuLzUxMicpO1xuXG5mdW5jdGlvbiBTSEEzODQoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEzODQpKVxuICAgIHJldHVybiBuZXcgU0hBMzg0KCk7XG5cbiAgU0hBNTEyLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweGNiYmI5ZDVkLCAweGMxMDU5ZWQ4LFxuICAgIDB4NjI5YTI5MmEsIDB4MzY3Y2Q1MDcsXG4gICAgMHg5MTU5MDE1YSwgMHgzMDcwZGQxNyxcbiAgICAweDE1MmZlY2Q4LCAweGY3MGU1OTM5LFxuICAgIDB4NjczMzI2NjcsIDB4ZmZjMDBiMzEsXG4gICAgMHg4ZWI0NGE4NywgMHg2ODU4MTUxMSxcbiAgICAweGRiMGMyZTBkLCAweDY0Zjk4ZmE3LFxuICAgIDB4NDdiNTQ4MWQsIDB4YmVmYTRmYTQgXTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTM4NCwgU0hBNTEyKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMzg0O1xuXG5TSEEzODQuYmxvY2tTaXplID0gMTAyNDtcblNIQTM4NC5vdXRTaXplID0gMzg0O1xuU0hBMzg0LmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTM4NC5wYWRMZW5ndGggPSAxMjg7XG5cblNIQTM4NC5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLnNsaWNlKDAsIDEyKSwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsIDEyKSwgJ2JpZycpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnNoYTEgPSByZXF1aXJlKCcuL3NoYS8xJyk7XG5leHBvcnRzLnNoYTIyNCA9IHJlcXVpcmUoJy4vc2hhLzIyNCcpO1xuZXhwb3J0cy5zaGEyNTYgPSByZXF1aXJlKCcuL3NoYS8yNTYnKTtcbmV4cG9ydHMuc2hhMzg0ID0gcmVxdWlyZSgnLi9zaGEvMzg0Jyk7XG5leHBvcnRzLnNoYTUxMiA9IHJlcXVpcmUoJy4vc2hhLzUxMicpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG52YXIgcm90bDMyID0gdXRpbHMucm90bDMyO1xudmFyIHN1bTMyID0gdXRpbHMuc3VtMzI7XG52YXIgc3VtMzJfMyA9IHV0aWxzLnN1bTMyXzM7XG52YXIgc3VtMzJfNCA9IHV0aWxzLnN1bTMyXzQ7XG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxuZnVuY3Rpb24gUklQRU1EMTYwKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUklQRU1EMTYwKSlcbiAgICByZXR1cm4gbmV3IFJJUEVNRDE2MCgpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuXG4gIHRoaXMuaCA9IFsgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMCBdO1xuICB0aGlzLmVuZGlhbiA9ICdsaXR0bGUnO1xufVxudXRpbHMuaW5oZXJpdHMoUklQRU1EMTYwLCBCbG9ja0hhc2gpO1xuZXhwb3J0cy5yaXBlbWQxNjAgPSBSSVBFTUQxNjA7XG5cblJJUEVNRDE2MC5ibG9ja1NpemUgPSA1MTI7XG5SSVBFTUQxNjAub3V0U2l6ZSA9IDE2MDtcblJJUEVNRDE2MC5obWFjU3RyZW5ndGggPSAxOTI7XG5SSVBFTUQxNjAucGFkTGVuZ3RoID0gNjQ7XG5cblJJUEVNRDE2MC5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHZhciBBID0gdGhpcy5oWzBdO1xuICB2YXIgQiA9IHRoaXMuaFsxXTtcbiAgdmFyIEMgPSB0aGlzLmhbMl07XG4gIHZhciBEID0gdGhpcy5oWzNdO1xuICB2YXIgRSA9IHRoaXMuaFs0XTtcbiAgdmFyIEFoID0gQTtcbiAgdmFyIEJoID0gQjtcbiAgdmFyIENoID0gQztcbiAgdmFyIERoID0gRDtcbiAgdmFyIEVoID0gRTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4MDsgaisrKSB7XG4gICAgdmFyIFQgPSBzdW0zMihcbiAgICAgIHJvdGwzMihcbiAgICAgICAgc3VtMzJfNChBLCBmKGosIEIsIEMsIEQpLCBtc2dbcltqXSArIHN0YXJ0XSwgSyhqKSksXG4gICAgICAgIHNbal0pLFxuICAgICAgRSk7XG4gICAgQSA9IEU7XG4gICAgRSA9IEQ7XG4gICAgRCA9IHJvdGwzMihDLCAxMCk7XG4gICAgQyA9IEI7XG4gICAgQiA9IFQ7XG4gICAgVCA9IHN1bTMyKFxuICAgICAgcm90bDMyKFxuICAgICAgICBzdW0zMl80KEFoLCBmKDc5IC0gaiwgQmgsIENoLCBEaCksIG1zZ1tyaFtqXSArIHN0YXJ0XSwgS2goaikpLFxuICAgICAgICBzaFtqXSksXG4gICAgICBFaCk7XG4gICAgQWggPSBFaDtcbiAgICBFaCA9IERoO1xuICAgIERoID0gcm90bDMyKENoLCAxMCk7XG4gICAgQ2ggPSBCaDtcbiAgICBCaCA9IFQ7XG4gIH1cbiAgVCA9IHN1bTMyXzModGhpcy5oWzFdLCBDLCBEaCk7XG4gIHRoaXMuaFsxXSA9IHN1bTMyXzModGhpcy5oWzJdLCBELCBFaCk7XG4gIHRoaXMuaFsyXSA9IHN1bTMyXzModGhpcy5oWzNdLCBFLCBBaCk7XG4gIHRoaXMuaFszXSA9IHN1bTMyXzModGhpcy5oWzRdLCBBLCBCaCk7XG4gIHRoaXMuaFs0XSA9IHN1bTMyXzModGhpcy5oWzBdLCBCLCBDaCk7XG4gIHRoaXMuaFswXSA9IFQ7XG59O1xuXG5SSVBFTUQxNjAucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2xpdHRsZScpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnbGl0dGxlJyk7XG59O1xuXG5mdW5jdGlvbiBmKGosIHgsIHksIHopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIHggXiB5IF4gejtcbiAgZWxzZSBpZiAoaiA8PSAzMSlcbiAgICByZXR1cm4gKHggJiB5KSB8ICgofngpICYgeik7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuICh4IHwgKH55KSkgXiB6O1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAoeCAmIHopIHwgKHkgJiAofnopKTtcbiAgZWxzZVxuICAgIHJldHVybiB4IF4gKHkgfCAofnopKTtcbn1cblxuZnVuY3Rpb24gSyhqKSB7XG4gIGlmIChqIDw9IDE1KVxuICAgIHJldHVybiAweDAwMDAwMDAwO1xuICBlbHNlIGlmIChqIDw9IDMxKVxuICAgIHJldHVybiAweDVhODI3OTk5O1xuICBlbHNlIGlmIChqIDw9IDQ3KVxuICAgIHJldHVybiAweDZlZDllYmExO1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAweDhmMWJiY2RjO1xuICBlbHNlXG4gICAgcmV0dXJuIDB4YTk1M2ZkNGU7XG59XG5cbmZ1bmN0aW9uIEtoKGopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIDB4NTBhMjhiZTY7XG4gIGVsc2UgaWYgKGogPD0gMzEpXG4gICAgcmV0dXJuIDB4NWM0ZGQxMjQ7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuIDB4NmQ3MDNlZjM7XG4gIGVsc2UgaWYgKGogPD0gNjMpXG4gICAgcmV0dXJuIDB4N2E2ZDc2ZTk7XG4gIGVsc2VcbiAgICByZXR1cm4gMHgwMDAwMDAwMDtcbn1cblxudmFyIHIgPSBbXG4gIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsXG4gIDcsIDQsIDEzLCAxLCAxMCwgNiwgMTUsIDMsIDEyLCAwLCA5LCA1LCAyLCAxNCwgMTEsIDgsXG4gIDMsIDEwLCAxNCwgNCwgOSwgMTUsIDgsIDEsIDIsIDcsIDAsIDYsIDEzLCAxMSwgNSwgMTIsXG4gIDEsIDksIDExLCAxMCwgMCwgOCwgMTIsIDQsIDEzLCAzLCA3LCAxNSwgMTQsIDUsIDYsIDIsXG4gIDQsIDAsIDUsIDksIDcsIDEyLCAyLCAxMCwgMTQsIDEsIDMsIDgsIDExLCA2LCAxNSwgMTNcbl07XG5cbnZhciByaCA9IFtcbiAgNSwgMTQsIDcsIDAsIDksIDIsIDExLCA0LCAxMywgNiwgMTUsIDgsIDEsIDEwLCAzLCAxMixcbiAgNiwgMTEsIDMsIDcsIDAsIDEzLCA1LCAxMCwgMTQsIDE1LCA4LCAxMiwgNCwgOSwgMSwgMixcbiAgMTUsIDUsIDEsIDMsIDcsIDE0LCA2LCA5LCAxMSwgOCwgMTIsIDIsIDEwLCAwLCA0LCAxMyxcbiAgOCwgNiwgNCwgMSwgMywgMTEsIDE1LCAwLCA1LCAxMiwgMiwgMTMsIDksIDcsIDEwLCAxNCxcbiAgMTIsIDE1LCAxMCwgNCwgMSwgNSwgOCwgNywgNiwgMiwgMTMsIDE0LCAwLCAzLCA5LCAxMVxuXTtcblxudmFyIHMgPSBbXG4gIDExLCAxNCwgMTUsIDEyLCA1LCA4LCA3LCA5LCAxMSwgMTMsIDE0LCAxNSwgNiwgNywgOSwgOCxcbiAgNywgNiwgOCwgMTMsIDExLCA5LCA3LCAxNSwgNywgMTIsIDE1LCA5LCAxMSwgNywgMTMsIDEyLFxuICAxMSwgMTMsIDYsIDcsIDE0LCA5LCAxMywgMTUsIDE0LCA4LCAxMywgNiwgNSwgMTIsIDcsIDUsXG4gIDExLCAxMiwgMTQsIDE1LCAxNCwgMTUsIDksIDgsIDksIDE0LCA1LCA2LCA4LCA2LCA1LCAxMixcbiAgOSwgMTUsIDUsIDExLCA2LCA4LCAxMywgMTIsIDUsIDEyLCAxMywgMTQsIDExLCA4LCA1LCA2XG5dO1xuXG52YXIgc2ggPSBbXG4gIDgsIDksIDksIDExLCAxMywgMTUsIDE1LCA1LCA3LCA3LCA4LCAxMSwgMTQsIDE0LCAxMiwgNixcbiAgOSwgMTMsIDE1LCA3LCAxMiwgOCwgOSwgMTEsIDcsIDcsIDEyLCA3LCA2LCAxNSwgMTMsIDExLFxuICA5LCA3LCAxNSwgMTEsIDgsIDYsIDYsIDE0LCAxMiwgMTMsIDUsIDE0LCAxMywgMTMsIDcsIDUsXG4gIDE1LCA1LCA4LCAxMSwgMTQsIDE0LCA2LCAxNCwgNiwgOSwgMTIsIDksIDEyLCA1LCAxNSwgOCxcbiAgOCwgNSwgMTIsIDksIDEyLCA1LCAxNCwgNiwgOCwgMTMsIDYsIDUsIDE1LCAxMywgMTEsIDExXG5dO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbmZ1bmN0aW9uIEhtYWMoaGFzaCwga2V5LCBlbmMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEhtYWMpKVxuICAgIHJldHVybiBuZXcgSG1hYyhoYXNoLCBrZXksIGVuYyk7XG4gIHRoaXMuSGFzaCA9IGhhc2g7XG4gIHRoaXMuYmxvY2tTaXplID0gaGFzaC5ibG9ja1NpemUgLyA4O1xuICB0aGlzLm91dFNpemUgPSBoYXNoLm91dFNpemUgLyA4O1xuICB0aGlzLmlubmVyID0gbnVsbDtcbiAgdGhpcy5vdXRlciA9IG51bGw7XG5cbiAgdGhpcy5faW5pdCh1dGlscy50b0FycmF5KGtleSwgZW5jKSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEhtYWM7XG5cbkhtYWMucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gaW5pdChrZXkpIHtcbiAgLy8gU2hvcnRlbiBrZXksIGlmIG5lZWRlZFxuICBpZiAoa2V5Lmxlbmd0aCA+IHRoaXMuYmxvY2tTaXplKVxuICAgIGtleSA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoa2V5KS5kaWdlc3QoKTtcbiAgYXNzZXJ0KGtleS5sZW5ndGggPD0gdGhpcy5ibG9ja1NpemUpO1xuXG4gIC8vIEFkZCBwYWRkaW5nIHRvIGtleVxuICBmb3IgKHZhciBpID0ga2V5Lmxlbmd0aDsgaSA8IHRoaXMuYmxvY2tTaXplOyBpKyspXG4gICAga2V5LnB1c2goMCk7XG5cbiAgZm9yIChpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcbiAgICBrZXlbaV0gXj0gMHgzNjtcbiAgdGhpcy5pbm5lciA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoa2V5KTtcblxuICAvLyAweDM2IF4gMHg1YyA9IDB4NmFcbiAgZm9yIChpID0gMDsgaSA8IGtleS5sZW5ndGg7IGkrKylcbiAgICBrZXlbaV0gXj0gMHg2YTtcbiAgdGhpcy5vdXRlciA9IG5ldyB0aGlzLkhhc2goKS51cGRhdGUoa2V5KTtcbn07XG5cbkhtYWMucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIGVuYykge1xuICB0aGlzLmlubmVyLnVwZGF0ZShtc2csIGVuYyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuSG1hYy5wcm90b3R5cGUuZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICB0aGlzLm91dGVyLnVwZGF0ZSh0aGlzLmlubmVyLmRpZ2VzdCgpKTtcbiAgcmV0dXJuIHRoaXMub3V0ZXIuZGlnZXN0KGVuYyk7XG59O1xuIiwKICAgICJ2YXIgaGFzaCA9IGV4cG9ydHM7XG5cbmhhc2gudXRpbHMgPSByZXF1aXJlKCcuL2hhc2gvdXRpbHMnKTtcbmhhc2guY29tbW9uID0gcmVxdWlyZSgnLi9oYXNoL2NvbW1vbicpO1xuaGFzaC5zaGEgPSByZXF1aXJlKCcuL2hhc2gvc2hhJyk7XG5oYXNoLnJpcGVtZCA9IHJlcXVpcmUoJy4vaGFzaC9yaXBlbWQnKTtcbmhhc2guaG1hYyA9IHJlcXVpcmUoJy4vaGFzaC9obWFjJyk7XG5cbi8vIFByb3h5IGhhc2ggZnVuY3Rpb25zIHRvIHRoZSBtYWluIG9iamVjdFxuaGFzaC5zaGExID0gaGFzaC5zaGEuc2hhMTtcbmhhc2guc2hhMjU2ID0gaGFzaC5zaGEuc2hhMjU2O1xuaGFzaC5zaGEyMjQgPSBoYXNoLnNoYS5zaGEyMjQ7XG5oYXNoLnNoYTM4NCA9IGhhc2guc2hhLnNoYTM4NDtcbmhhc2guc2hhNTEyID0gaGFzaC5zaGEuc2hhNTEyO1xuaGFzaC5yaXBlbWQxNjAgPSBoYXNoLnJpcGVtZC5yaXBlbWQxNjA7XG4iLAogICAgIm1vZHVsZS5leHBvcnRzID0ge1xuICBkb3VibGVzOiB7XG4gICAgc3RlcDogNCxcbiAgICBwb2ludHM6IFtcbiAgICAgIFtcbiAgICAgICAgJ2U2MGZjZTkzYjU5ZTllYzUzMDExYWFiYzIxYzIzZTk3YjJhMzEzNjliODdhNWFlOWM0NGVlODllMmE2ZGVjMGEnLFxuICAgICAgICAnZjdlMzUwNzM5OWU1OTU5MjlkYjk5ZjM0ZjU3OTM3MTAxMjk2ODkxZTQ0ZDIzZjBiZTFmMzJjY2U2OTYxNjgyMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODI4MjI2MzIxMmM2MDlkOWVhMmE2ZTNlMTcyZGUyMzhkOGMzOWNhYmQ1YWMxY2ExMDY0NmUyM2ZkNWY1MTUwOCcsXG4gICAgICAgICcxMWY4YTgwOTg1NTdkZmU0NWU4MjU2ZTgzMGI2MGFjZTYyZDYxM2FjMmY3YjE3YmVkMzFiNmVhZmY2ZTI2Y2FmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNzVlMTU5ZjcyOGI4NjVhNzJmOTljYzZjNmZjODQ2ZGUwYjkzODMzZmQyMjIyZWQ3M2ZjZTViNTUxZTViNzM5JyxcbiAgICAgICAgJ2QzNTA2ZTBkOWUzYzc5ZWJhNGVmOTdhNTFmZjcxZjVlYWNiNTk1NWFkZDI0MzQ1YzZlZmE2ZmZlZTlmZWQ2OTUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM2M2Q5MGQ0NDdiMDBjOWM5OWNlYWMwNWI2MjYyZWUwNTM0NDFjN2U1NTU1MmZmZTUyNmJhZDhmODNmZjQ2NDAnLFxuICAgICAgICAnNGUyNzNhZGZjNzMyMjIxOTUzYjQ0NTM5N2YzMzYzMTQ1YjlhODkwMDgxOTllY2I2MjAwM2M3ZjNiZWU5ZGU5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4YjRiNWYxNjVkZjNjMmJlOGM2MjQ0YjViNzQ1NjM4ODQzZTRhNzgxYTE1YmNkMWI2OWY3OWE1NWRmZmRmODBjJyxcbiAgICAgICAgJzRhYWQwYTZmNjhkMzA4YjRiM2ZiZDc4MTNhYjBkYTA0ZjllMzM2NTQ2MTYyZWU1NmIzZWZmMGM2NWZkNGZkMzYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzcyM2NiYWE2ZTVkYjk5NmQ2YmY3NzFjMDBiZDU0OGM3YjcwMGRiZmZhNmMwZTc3YmNiNjExNTkyNTIzMmZjZGEnLFxuICAgICAgICAnOTZlODY3YjU1OTVjYzQ5OGE5MjExMzc0ODg4MjRkNmUyNjYwYTA2NTM3Nzk0OTQ4MDFkYzA2OWQ5ZWIzOWY1ZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWViZmE0ZDQ5M2JlYmY5OGJhNWZlZWM4MTJjMmQzYjUwOTQ3OTYxMjM3YTkxOTgzOWE1MzNlY2EwZTdkZDdmYScsXG4gICAgICAgICc1ZDlhOGNhMzk3MGVmMGYyNjllZTdlZGFmMTc4MDg5ZDlhZTRjZGMzYTcxMWY3MTJkZGZkNGZkYWUxZGU4OTk5JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxMDBmNDRkYTY5NmU3MTY3Mjc5MWQwYTA5YjdiZGU0NTlmMTIxNWEyOWIzYzAzYmZlZmQ3ODM1YjM5YTQ4ZGIwJyxcbiAgICAgICAgJ2NkZDllMTMxOTJhMDBiNzcyZWM4ZjMzMDBjMDkwNjY2YjdmZjRhMThmZjUxOTVhYzBmYmQ1Y2Q2MmJjNjVhMDknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UxMDMxYmUyNjJjN2VkMWIxZGM5MjI3YTRhMDRjMDE3YTc3ZjhkNDQ2NGYzYjM4NTJjOGFjZGU2ZTUzNGZkMmQnLFxuICAgICAgICAnOWQ3MDYxOTI4OTQwNDA1ZTZiYjZhNDE3NjU5NzUzNWFmMjkyZGQ0MTllMWNlZDc5YTQ0ZjE4ZjI5NDU2YTAwZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmVlYTZjYWU0NmQ1NWI1MzBhYzI4MzlmMTQzYmQ3ZWM1Y2Y4YjI2NmE0MWQ2YWY1MmQ1ZTY4OGQ5MDk0Njk2ZCcsXG4gICAgICAgICdlNTdjNmI2Yzk3ZGNlMWJhYjA2ZTRlMTJiZjNlY2Q1Yzk4MWM4OTU3Y2M0MTQ0MmQzMTU1ZGViZjE4MDkwMDg4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkYTY3YTkxZDkxMDQ5Y2RjYjM2N2JlNGJlNmZmY2EzY2ZlZWQ2NTdkODA4NTgzZGUzM2ZhOTc4YmMxZWM2Y2IxJyxcbiAgICAgICAgJzliYWNhYTM1NDgxNjQyYmM0MWY0NjNmN2VjOTc4MGU1ZGVjN2FkYzUwOGY3NDBhMTdlOWVhOGUyN2E2OGJlMWQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzUzOTA0ZmFhMGIzMzRjZGRhNmUwMDA5MzVlZjIyMTUxZWMwOGQwZjdiYjExMDY5ZjU3NTQ1Y2NjMWEzN2I3YzAnLFxuICAgICAgICAnNWJjMDg3ZDBiYzgwMTA2ZDg4YzllY2NhYzIwZDNjMWMxMzk5OTk4MWUxNDQzNDY5OWRjYjA5NmIwMjI3NzFjOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGU3YmNkMGJkMzU5ODNhNzcxOWNjYTc3NjRjYTkwNjc3OWI1M2EwNDNhOWI4YmNhZWZmOTU5ZjQzYWQ4NjA0NycsXG4gICAgICAgICcxMGI3NzcwYjJhM2RhNGIzOTQwMzEwNDIwY2E5NTE0NTc5ZTg4ZTJlNDdmZDY4YjNlYTEwMDQ3ZTg0NjAzNzJhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczODVlZWQzNGMxY2RmZjIxZTZkMDgxODY4OWI4MWJkZTcxYTdmNGYxODM5N2U2NjkwYTg0MWUxNTk5YzQzODYyJyxcbiAgICAgICAgJzI4M2JlYmMzZThlYTIzZjU2NzAxZGUxOWU5ZWJmNDU3NmIzMDRlZWMyMDg2ZGM4Y2MwNDU4ZmU1NTQyZTU0NTMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzZmOWQ5YjgwM2VjZjE5MTYzN2M3M2E0NDEzZGZhMTgwZmRkZjg0YTU5NDdmYmM5YzYwNmVkODZjM2ZhYzNhNycsXG4gICAgICAgICc3YzgwYzY4ZTYwMzA1OWJhNjliOGUyYTMwZTQ1YzRkNDdlYTRkZDJmNWMyODEwMDJkODY4OTA2MDNhODQyMTYwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMzIyZDQwMTI0M2M0ZTI1ODJhMjE0N2MxMDRkNmVjYmY3NzRkMTYzZGIwZjVlNTMxM2I3ZTBlNzQyZDBlNmJkJyxcbiAgICAgICAgJzU2ZTcwNzk3ZTk2NjRlZjViZmIwMTliYzRkZGFmOWI3MjgwNWY2M2VhMjg3M2FmNjI0ZjNhMmU5NmMyOGIyYTAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg1NjcyYzdkMmRlMGI3ZGEyYmQxNzcwZDg5NjY1ODY4NzQxYjNmOWFmNzY0MzM5NzcyMWQ3NGQyODEzNGFiODMnLFxuICAgICAgICAnN2M0ODFiOWI1YjQzYjJlYjYzNzQwNDliZmE2MmMyZTVlNzdmMTdmY2M1Mjk4ZjQ0YzhlMzA5NGY3OTAzMTNhNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTQ4YmY4MDliMTk4OGE0NmIwNmM5ZjE5MTk0MTNiMTBmOTIyNmM2MGY2Njg4MzJmZmQ5NTlhZjYwYzgyYTBhJyxcbiAgICAgICAgJzUzYTU2Mjg1NmRjYjY2NDZkYzZiNzRjNWQxYzM0MThjNmQ0ZGZmMDhjOTdjZDJiZWQ0Y2I3Zjg4ZDhjOGU1ODknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzYyNjBjZTdmNDYxODAxYzM0ZjA2N2NlMGYwMjg3M2E4ZjFiMGU0NGRmYzY5NzUyYWNjZWNkODE5ZjM4ZmQ4ZTgnLFxuICAgICAgICAnYmMyZGE4MmI2ZmE1YjU3MWE3ZjA5MDQ5Nzc2YTFlZjdlY2QyOTIyMzgwNTFjMTk4YzFhODRlOTViMmI0YWUxNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTUwMzdkZTBhZmMxZDhkNDNkODM0ODQxNGJiZjQxMDMwNDNlYzhmNTc1YmZkYzQzMjk1M2NjOGQyMDM3ZmEyZCcsXG4gICAgICAgICc0NTcxNTM0YmFhOTRkM2I1ZjlmOThkMDlmYjk5MGJkZGJkNWY1YjAzZWM0ODFmMTBlMGU1ZGM4NDFkNzU1YmRhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlMDYzNzJiMGY0YTIwN2FkZjVlYTkwNWU4ZjE3NzFiNGU3ZThkYmQxYzZhNmM1YjcyNTg2NmEwYWU0ZmNlNzI1JyxcbiAgICAgICAgJzdhOTA4OTc0YmNlMThjZmUxMmEyN2JiMmFkNWE0ODhjZDc0ODRhNzc4NzEwNDg3MGIyNzAzNGY5NGVlZTMxZGQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzIxM2M3YTcxNWNkNWQ0NTM1OGQwYmJmOWRjMGNlMDIyMDRiMTBiZGRlMmEzZjU4NTQwYWQ2OTA4ZDA1NTk3NTQnLFxuICAgICAgICAnNGI2ZGFkMGI1YWU0NjI1MDcwMTNhZDA2MjQ1YmExOTBiYjQ4NTBmNWYzNmE3ZWVkZGZmMmMyNzUzNGI0NThmMicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNGU3YzI3MmE3YWY0YjM0ZThkYmI5MzUyYTU0MTlhODdlMjgzOGM3MGFkYzYyY2RkZjBjYzNhM2IwOGZiZDUzYycsXG4gICAgICAgICcxNzc0OWM3NjZjOWQwYjE4ZTE2ZmQwOWY2ZGVmNjgxYjUzMGI5NjE0YmZmN2RkMzNlMGIzOTQxODE3ZGNhYWU2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmZWE3NGUzZGJlNzc4YjFiMTBmMjM4YWQ2MTY4NmFhNWM3NmUzZGIyYmU0MzA1NzYzMjQyN2UyODQwZmIyN2I2JyxcbiAgICAgICAgJzZlMDU2OGRiOWIwYjEzMjk3Y2Y2NzRkZWNjYjZhZjkzMTI2YjU5NmI5NzNmN2I3NzcwMWQzZGI3ZjIzY2I5NmYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc2ZTY0MTEzZjY3N2NmMGUxMGEyNTcwZDU5OTk2OGQzMTU0NGUxNzliNzYwNDMyOTUyYzAyYTQ0MTdiZGRlMzknLFxuICAgICAgICAnYzkwZGRmOGRlZTRlOTVjZjU3NzA2NmQ3MDY4MWYwZDM1ZTJhMzNkMmI1NmQyMDMyYjRiMTc1MmQxOTAxYWMwMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzczOGM1NmIwM2IyYWJlMWU4MjgxYmFhNzQzZjhmOWE4ZjdjYzY0M2RmMjZjYmVlM2FiMTUwMjQyYmNiYjg5MScsXG4gICAgICAgICc4OTNmYjU3ODk1MWFkMjUzN2Y3MThmMmVhY2JmYmJiYjgyMzE0ZWVmNzg4MGNmZTkxN2U3MzVkOTY5OWE4NGMzJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkODk1NjI2NTQ4YjY1YjgxZTI2NGM3NjM3Yzk3Mjg3N2QxZDcyZTVmM2E5MjUwMTQzNzJlOWY2NTg4ZjZjMTRiJyxcbiAgICAgICAgJ2ZlYmZhYTM4ZjJiYzdlYWU3MjhlYzYwODE4YzM0MGViMDM0MjhkNjMyYmIwNjdlMTc5MzYzZWQ3NWQ3ZDk5MWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2I4ZGE5NDAzMmE5NTc1MThlYjBmNjQzMzU3MWU4NzYxY2VmZmM3MzY5M2U4NGVkZDQ5MTUwYTU2NGY2NzZlMDMnLFxuICAgICAgICAnMjgwNGRmYTQ0ODA1YTFlNGQ3Yzk5Y2M5NzYyODA4YjA5MmNjNTg0ZDk1ZmYzYjUxMTQ4OGU0ZTc0ZWZkZjZlNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTgwZmVhMTQ0NDFmYjMzYTdkOGFkYWI5NDc1ZDdmYWIyMDE5ZWZmYjUxNTZhNzkyZjFhMTE3NzhlM2MwZGY1ZCcsXG4gICAgICAgICdlZWQxZGU3ZjYzOGUwMDc3MWU4OTc2OGNhM2NhOTQ0NzJkMTU1ZTgwYWYzMjJlYTlmY2I0MjkxYjZhYzllYzc4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhMzAxNjk3YmRmY2Q3MDQzMTNiYTQ4ZTUxZDU2NzU0M2YyYTE4MjAzMWVmZDY5MTVkZGMwN2JiY2M0ZTE2MDcwJyxcbiAgICAgICAgJzczNzBmOTFjZmI2N2U0ZjUwODE4MDlmYTI1ZDQwZjliMTczNWRiZjdjMGExMWExMzBjMGQxYTA0MWUxNzdlYTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkwYWQ4NWIzODlkNmI5MzY0NjNmOWQwNTEyNjc4ZGUyMDhjYzMzMGIxMTMwN2ZmZmFiN2FjNjNlM2ZiMDRlZDQnLFxuICAgICAgICAnZTUwN2EzNjIwYTM4MjYxYWZmZGNiZDk0MjcyMjJiODM5YWVmYWJlMTU4Mjg5NGQ5OTFkNGQ0OGNiNmVmMTUwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4ZjY4YjlkMmY2M2I1ZjMzOTIzOWMxYWQ5ODFmMTYyZWU4OGM1Njc4NzIzZWEzMzUxYjdiNDQ0YzllYzRjMGRhJyxcbiAgICAgICAgJzY2MmE5ZjJkYmEwNjM5ODZkZTFkOTBjMmI2YmUyMTVkYmJlYTJjZmU5NTUxMGJmZGYyM2NiZjc5NTAxZmZmODInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2U0ZjNmYjAxNzZhZjg1ZDY1ZmY5OWZmOTE5OGMzNjA5MWY0OGU4NjUwMzY4MWUzZTY2ODZmZDUwNTMyMzFlMTEnLFxuICAgICAgICAnMWU2MzYzM2FkMGVmNGYxYzE2NjFhNmQwZWEwMmI3Mjg2Y2M3ZTc0ZWM5NTFkMWM5ODIyYzM4NTc2ZmViNzNiYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGMwMGZhOWIxOGViZjMzMWViOTYxNTM3YTQ1YTQyNjZjNzAzNGYyZjBkNGUxZDA3MTZmYjZlYWUyMGVhZTI5ZScsXG4gICAgICAgICdlZmE0NzI2N2ZlYTUyMWExYTlkYzM0M2EzNzM2Yzk3NGMyZmFkYWZhODFlMzZjNTRlN2QyYTRjNjY3MDI0MTRiJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlN2EyNmNlNjlkZDQ4MjlmM2UxMGNlYzBhOWU5OGVkMzE0M2QwODRmMzA4YjkyYzA5OTdmZGRmYzYwY2IzZTQxJyxcbiAgICAgICAgJzJhNzU4ZTMwMGZhNzk4NGI0NzFiMDA2YTFhYWZiYjE4ZDBhNmIyYzA0MjBlODNlMjBlOGE5NDIxY2YyY2ZkNTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2I2NDU5ZTBlZTM2NjJlYzhkMjM1NDBjMjIzYmNiZGM1NzFjYmNiOTY3ZDc5NDI0ZjNjZjI5ZWIzZGU2YjgwZWYnLFxuICAgICAgICAnNjdjODc2ZDA2ZjNlMDZkZTFkYWRmMTZlNTY2MWRiM2M0YjNhZTZkNDhlMzViMmZmMzBiZjBiNjFhNzFiYTQ1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNjhhODBjODI4MGJiODQwNzkzMjM0YWExMThmMDYyMzFkNmYxZmM2N2U3M2M1YTVkZWRhMGY1YjQ5Njk0M2U4JyxcbiAgICAgICAgJ2RiOGJhOWZmZjRiNTg2ZDAwYzRiMWY5MTc3YjBlMjhiNWIwZTdiOGY3ODQ1Mjk1YTI5NGM4NDI2NmIxMzMxMjAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMyNGFlZDdkZjY1YzgwNDI1MmRjMDI3MDkwN2EzMGIwOTYxMmFlYjk3MzQ0OWNlYTQwOTU5ODBmYzI4ZDNkNWQnLFxuICAgICAgICAnNjQ4YTM2NTc3NGI2MWYyZmYxMzBjMGMzNWFlYzFmNGYxOTIxM2IwYzdlMzMyODQzOTY3MjI0YWY5NmFiN2M4NCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNGRmOWMxNDkxOWNkZTYxZjZkNTFkZmRiZTVmZWU1ZGNlZWM0MTQzYmE4ZDFjYTg4OGU4YmQzNzNmZDA1NGM5NicsXG4gICAgICAgICczNWVjNTEwOTJkODcyODA1MDk3NGMyM2ExZDg1ZDRiNWQ1MDZjZGMyODg0OTAxOTJlYmFjMDZjYWQxMGQ1ZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOWMzOTE5YTg0YTQ3NDg3MGZhZWQ4YTljMWNjNjYwMjE1MjM0ODkwNTRkN2YwMzA4Y2JmYzk5YzhhYzFmOThjZCcsXG4gICAgICAgICdkZGI4NGYwZjRhNGRkZDU3NTg0ZjA0NGJmMjYwZTY0MTkwNTMyNmY3NmM2NGM4ZTZiZTdlNWUwM2Q0ZmM1OTlkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2MDU3MTcwYjFkZDEyZmRmOGRlMDVmMjgxZDhlMDZiYjkxZTE0OTNhOGI5MWQ0Y2M1YTIxMzgyMTIwYTk1OWU1JyxcbiAgICAgICAgJzlhMWFmMGIyNmE2YTQ4MDdhZGQ5YTJkYWY3MWRmMjYyNDY1MTUyYmMzZWUyNGM2NWU4OTliZTkzMjM4NWEyYTgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E1NzZkZjhlMjNhMDg0MTE0MjE0MzlhNDUxOGRhMzE4ODBjZWYwZmJhN2Q0ZGYxMmIxYTY5NzNlZWNiOTQyNjYnLFxuICAgICAgICAnNDBhNmJmMjBlNzY2NDBiMmM5MmI5N2FmZTU4Y2Q4MmM0MzJlMTBhN2Y1MTRkOWYzZWU4YmUxMWFlMWIyOGVjOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzc3OGE3OGMyOGRlYzNlMzBhMDVmZTk2MjlkZThjMzhiYjMwZDFmNWNmOWEzYTIwOGY3NjM4ODliZTU4YWQ3MScsXG4gICAgICAgICczNDYyNmQ5YWI1YTViMjJmZjcwOThlMTJmMmZmNTgwMDg3YjM4NDExZmYyNGFjNTYzYjUxM2ZjMWZkOWY0M2FjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc5Mjg5NTVlZTYzN2E4NDQ2MzcyOWZkMzBlN2FmZDJlZDVmOTYyNzRlNWFkN2U1Y2IwOWVkYTljMDZkOTAzYWMnLFxuICAgICAgICAnYzI1NjIxMDAzZDNmNDJhODI3Yjc4YTEzMDkzYTk1ZWVhYzNkMjZlZmE4YThkODNmYzUxODBlOTM1YmNkMDkxZicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODVkMGZlZjNlYzZkYjEwOTM5OTA2NGYzYTBlM2IyODU1NjQ1YjRhOTA3YWQzNTQ1MjdhYWU3NTE2M2Q4Mjc1MScsXG4gICAgICAgICcxZjAzNjQ4NDEzYTM4YzBiZTI5ZDQ5NmU1ODJjZjU2NjNlODc1MWU5Njg3NzMzMTU4MmMyMzdhMjRlYjFmOTYyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmZjJiMGRjZTk3ZWVjZTk3YzFjOWI2MDQxNzk4Yjg1ZGZkZmI2ZDg4ODJkYTIwMzA4ZjU0MDQ4MjQ1MjYwODdlJyxcbiAgICAgICAgJzQ5M2QxM2ZlZjUyNGJhMTg4YWY0YzRkYzU0ZDA3OTM2YzdiN2VkNmZiOTBlMmNlYjJjOTUxZTAxZjBjMjk5MDcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzgyN2ZiYmU0YjFlODgwZWE5ZWQyYjJlNjMwMWIyMTJiNTdmMWVlMTQ4Y2Q2ZGQyODc4MGU1ZTJjZjg1NmUyNDEnLFxuICAgICAgICAnYzYwZjljOTIzYzcyN2IwYjcxYmVmMmM2N2QxZDEyNjg3ZmY3YTYzMTg2OTAzMTY2ZDYwNWI2OGJhZWMyOTNlYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWFhNjQ5ZjIxZjUxYmRiYWU3YmU0YWUzNGNlNmU1MjE3YTU4ZmRjZTdmNDdmOWFhN2YzYjU4ZmEyMTIwZTJiMycsXG4gICAgICAgICdiZTMyNzllZDViYmJiMDNhYzY5YTgwZjg5ODc5YWE1YTAxYTZiOTY1ZjEzZjdlNTlkNDdhNTMwNWJhNWFkOTNkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNGE0MmQ0M2M1Y2YxNjlkOTM5MWRmNmRlY2Y0MmVlNTQxYjZkOGYwYzlhMTM3NDAxZTIzNjMyZGRhMzRkMjRmJyxcbiAgICAgICAgJzRkOWY5MmU3MTZkMWM3MzUyNmZjOTljY2ZiOGFkMzRjZTg4NmVlZGZhOGQ4ZTRmMTNhN2Y3MTMxZGViYTk0MTQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzFlYzgwZmVmMzYwY2JkZDk1NDE2MGZhZGFiMzUyYjZiOTJiNTM1NzZhODhmZWE0OTQ3MTczYjlkNDMwMGJmMTknLFxuICAgICAgICAnYWVlZmU5Mzc1NmI1MzQwZDJmM2E0OTU4YTdhYmJmNWUwMTQ2ZTc3ZjYyOTVhMDdiNjcxY2RjMWNjMTA3Y2VmZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTQ2YTc3OGMwNDY3MGMyZjkxYjAwYWY0NjgwZGZhOGJjZTM0OTA3MTdkNThiYTg4OWRkYjU5MjgzNjY2NDJiZScsXG4gICAgICAgICdiMzE4ZTBlYzMzNTQwMjhhZGQ2Njk4MjdmOWQ0YjI4NzBhYWE5NzFkMmY3ZTVlZDFkMGIyOTc0ODNkODNlZmQwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmYTUwYzBmNjFkMjJlNWYwN2UzYWNlYmIxYWEwN2IxMjhkMDAxMjIwOWEyOGI5Nzc2ZDc2YTg3OTMxODBlZWY5JyxcbiAgICAgICAgJzZiODRjNjkyMjM5N2ViYTliNzJjZDI4NzIyODFhNjhhNWU2ODMyOTNhNTdhMjEzYjM4Y2Q4ZDdkM2Y0ZjI4MTEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RhMWQ2MWQwY2E3MjFhMTFiMWE1YmY2YjdkODhlODQyMWEyODhhYjVkNWJiYTUyMjBlNTNkMzJiNWYwNjdlYzInLFxuICAgICAgICAnODE1N2Y1NWE3Yzk5MzA2Yzc5YzA3NjYxNjFjOTFlMjk2NmE3Mzg5OWQyNzliNDhhNjU1ZmJhMGYxYWQ4MzZmMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYThlMjgyZmYwYzk3MDY5MDcyMTVmZjk4ZThmZDQxNjYxNTMxMWRlMDQ0NmYxZTA2MmE3M2IwNjEwZDA2NGUxMycsXG4gICAgICAgICc3Zjk3MzU1YjhkYjgxYzA5YWJmYjdmM2M1YjI1MTU4ODhiNjc5YTNlNTBkZDZiZDZjZWY3YzczMTExZjRjYzBjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNzRhNTNiOWM5YTI4NTg3MmQzOWU1NmU2OTEzY2FiMTVkNTliMWZhNTEyNTA4YzAyMmYzODJkZTgzMTk0OTdjJyxcbiAgICAgICAgJ2NjYzlkYzM3YWJmYzljMTY1N2I0MTU1ZjJjNDdmOWU2NjQ2YjNhMWQ4Y2I5ODU0MzgzZGExM2FjMDc5YWZhNzMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzk1OTM5Njk4MTk0Mzc4NWMzZDNlNTdlZGY1MDE4Y2RiZTAzOWU3MzBlNDkxOGIzZDg4NGZkZmYwOTQ3NWI3YmEnLFxuICAgICAgICAnMmU3ZTU1Mjg4OGMzMzFkZDhiYTAzODZhNGI5Y2Q2ODQ5YzY1M2Y2NGM4NzA5Mzg1ZTliOGFiZjg3NTI0ZjJmZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDJhNjNhNTBhZTQwMWU1NmQ2NDVhMTE1M2IxMDlhOGZjY2EwYTQzZDU2MWZiYTJkYmI1MTM0MGM5ZDgyYjE1MScsXG4gICAgICAgICdlODJkODZmYjY0NDNmY2I3NTY1YWVlNThiMjk0ODIyMGE3MGY3NTBhZjQ4NGNhNTJkNDE0MjE3NGRjZjg5NDA1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2NDU4N2UyMzM1NDcxZWI4OTBlZTc4OTZkN2NmZGM4NjZiYWNiZGJkMzgzOTMxN2IzNDM2ZjliNDU2MTdlMDczJyxcbiAgICAgICAgJ2Q5OWZjZGQ1YmY2OTAyZTJhZTk2ZGQ2NDQ3YzI5OWExODViOTBhMzkxMzNhZWFiMzU4Mjk5ZTVlOWZhZjY1ODknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg0ODFiZGUwZTRlNGQ4ODViM2E1NDZkM2U1NDlkZTA0MmYwYWE2Y2VhMjUwZTdmZDM1OGQ2Yzg2ZGQ0NWU0NTgnLFxuICAgICAgICAnMzhlZTdiOGNiYTU0MDRkZDg0YTI1YmYzOWNlY2IyY2E5MDBhNzljNDJiMjYyZTU1NmQ2NGIxYjU5Nzc5MDU3ZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTM0NjRhNTdhNzgxMDJhYTYyYjY5NzlhZTgxN2Y0NjM3ZmZjZmVkM2M0YjFjZTMwYmNkNjMwM2Y2Y2FmNjY2YicsXG4gICAgICAgICc2OWJlMTU5MDA0NjE0NTgwZWY3ZTQzMzQ1M2NjYjBjYTQ4ZjMwMGE4MWQwOTQyZTEzZjQ5NWE5MDdmNmVjYzI3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiYzRhOWRmNWI3MTNmZTJlOWFlZjQzMGJjYzFkYzk3YTBjZDljY2VkZTJmMjg1ODhjYWRhM2EwZDJkODNmMzY2JyxcbiAgICAgICAgJ2QzYTgxY2E2ZTc4NWMwNjM4MzkzN2FkZjRiNzk4Y2FhNmU4YTlmYmZhNTQ3YjE2ZDc1OGQ2NjY1ODFmMzNjMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOGMyOGE5N2JmODI5OGJjMGQyM2Q4Yzc0OTQ1MmEzMmU2OTRiNjVlMzBhOTQ3MmEzOTU0YWIzMGZlNTMyNGNhYScsXG4gICAgICAgICc0MGEzMDQ2M2EzMzA1MTkzMzc4ZmVkZjMxZjdjYzBlYjdhZTc4NGYwNDUxY2I5NDU5ZTcxZGM3M2NiZWY5NDgyJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4ZWE5NjY2MTM5NTI3YThjMWRkOTRjZTRmMDcxZmQyM2M4YjM1MGM1YTRiYjMzNzQ4YzRiYTExMWZhY2NhZTAnLFxuICAgICAgICAnNjIwZWZhYmJjOGVlMjc4MmUyNGU3YzBjZmI5NWM1ZDczNWI3ODNiZTljZjBmOGU5NTVhZjM0YTMwZTYyYjk0NScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGQzNjI1ZmFlZjViYTA2MDc0NjY5NzE2YmJkMzc4OGQ4OWJkZGU4MTU5NTk5NjgwOTJmNzZjYzRlYjlhOTc4NycsXG4gICAgICAgICc3YTE4OGZhMzUyMGUzMGQ0NjFkYTI1MDEwNDU3MzFjYTk0MTQ2MTk4Mjg4MzM5NTkzN2Y2OGQwMGM2NDRhNTczJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmNzEwZDc5ZDllYjk2MjI5N2U0ZjYyMzJiNDBlOGY3ZmViMmJjNjM4MTQ2MTRkNjkyYzEyZGU3NTI0MDgyMjFlJyxcbiAgICAgICAgJ2VhOThlNjcyMzJkM2IzMjk1ZDNiNTM1NTMyMTE1Y2NhYzg2MTJjNzIxODUxNjE3NTI2YWU0N2E5Yzc3YmZjODInLFxuICAgICAgXSxcbiAgICBdLFxuICB9LFxuICBuYWY6IHtcbiAgICB3bmQ6IDcsXG4gICAgcG9pbnRzOiBbXG4gICAgICBbXG4gICAgICAgICdmOTMwOGEwMTkyNThjMzEwNDkzNDRmODVmODlkNTIyOWI1MzFjODQ1ODM2Zjk5YjA4NjAxZjExM2JjZTAzNmY5JyxcbiAgICAgICAgJzM4OGY3YjBmNjMyZGU4MTQwZmUzMzdlNjJhMzdmMzU2NjUwMGE5OTkzNGMyMjMxYjZjYjlmZDc1ODRiOGU2NzInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzJmOGJkZTRkMWEwNzIwOTM1NWI0YTcyNTBhNWM1MTI4ZTg4Yjg0YmRkYzYxOWFiN2NiYThkNTY5YjI0MGVmZTQnLFxuICAgICAgICAnZDhhYzIyMjYzNmU1ZTNkNmQ0ZGJhOWRkYTZjOWM0MjZmNzg4MjcxYmFiMGQ2ODQwZGNhODdkM2FhNmFjNjJkNicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNWNiZGYwNjQ2ZTVkYjRlYWEzOThmMzY1ZjJlYTdhMGUzZDQxOWI3ZTAzMzBlMzljZTkyYmRkZWRjYWM0ZjliYycsXG4gICAgICAgICc2YWViY2E0MGJhMjU1OTYwYTMxNzhkNmQ4NjFhNTRkYmE4MTNkMGI4MTNmZGU3YjVhNTA4MjYyODA4NzI2NGRhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhY2Q0ODRlMmYwYzdmNjUzMDlhZDE3OGE5ZjU1OWFiZGUwOTc5Njk3NGM1N2U3MTRjMzVmMTEwZGZjMjdjY2JlJyxcbiAgICAgICAgJ2NjMzM4OTIxYjBhN2Q5ZmQ2NDM4MDk3MTc2M2I2MWU5YWRkODg4YTQzNzVmOGUwZjA1Y2MyNjJhYzY0ZjljMzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3NGFlN2Y4NThhOTQxMWU1ZWY0MjQ2YjcwYzY1YWFjNTY0OTk4MGJlNWMxNzg5MWJiZWMxNzg5NWRhMDA4Y2InLFxuICAgICAgICAnZDk4NGEwMzJlYjZiNWUxOTAyNDNkZDU2ZDdiN2IzNjUzNzJkYjFlMmRmZjlkNmE4MzAxZDc0YzljOTUzYzYxYicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZjI4NzczYzJkOTc1Mjg4YmM3ZDFkMjA1YzM3NDg2NTFiMDc1ZmJjNjYxMGU1OGNkZGVlZGRmOGYxOTQwNWFhOCcsXG4gICAgICAgICdhYjA5MDJlOGQ4ODBhODk3NTgyMTJlYjY1Y2RhZjQ3M2ExYTA2ZGE1MjFmYTkxZjI5YjVjYjUyZGIwM2VkODEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q3OTI0ZDRmN2Q0M2VhOTY1YTQ2NWFlMzA5NWZmNDExMzFlNTk0NmYzYzg1Zjc5ZTQ0YWRiY2Y4ZTI3ZTA4MGUnLFxuICAgICAgICAnNTgxZTI4NzJhODZjNzJhNjgzODQyZWMyMjhjYzZkZWZlYTQwYWYyYmQ4OTZkM2E1YzUwNGRjOWZmNmEyNmI1OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGVmZGVhNGNkYjY3Nzc1MGE0MjBmZWU4MDdlYWNmMjFlYjk4OThhZTc5Yjk3Njg3NjZlNGZhYTA0YTJkNGEzNCcsXG4gICAgICAgICc0MjExYWIwNjk0NjM1MTY4ZTk5N2IwZWFkMmE5M2RhZWNlZDFmNGEwNGE5NWMwZjZjZmIxOTlmNjllNTZlYjc3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcyYjRlYTBhNzk3YTQ0M2QyOTNlZjVjZmY0NDRmNDk3OWYwNmFjZmViZDdlODZkMjc3NDc1NjU2MTM4Mzg1YjZjJyxcbiAgICAgICAgJzg1ZTg5YmMwMzc5NDVkOTNiMzQzMDgzYjVhMWM4NjEzMWEwMWY2MGM1MDI2OTc2M2I1NzBjODU0ZTVjMDliN2EnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM1MmJiZjRhNGNkZDEyNTY0ZjkzZmEzMzJjZTMzMzMwMWQ5YWQ0MDI3MWY4MTA3MTgxMzQwYWVmMjViZTU5ZDUnLFxuICAgICAgICAnMzIxZWI0MDc1MzQ4ZjUzNGQ1OWMxODI1OWRkYTNlMWY0YTFiM2IyZTcxYjEwMzljNjdiZDNkOGJjZjgxOTk4YycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMmZhMjEwNGQ2YjM4ZDExYjAyMzAwMTA1NTk4NzkxMjRlNDJhYjhkZmVmZjVmZjI5ZGM5Y2RhZGQ0ZWNhY2MzZicsXG4gICAgICAgICcyZGUxMDY4Mjk1ZGQ4NjViNjQ1NjkzMzViZDVkZDgwMTgxZDcwZWNmYzg4MjY0ODQyM2JhNzZiNTMyYjdkNjcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzkyNDgyNzliMDliNGQ2OGRhYjIxYTliMDY2ZWRkYTgzMjYzYzNkODRlMDk1NzJlMjY5Y2EwY2Q3ZjU0NTM3MTQnLFxuICAgICAgICAnNzMwMTZmN2JmMjM0YWFkZTVkMWFhNzFiZGVhMmIxZmYzZmMwZGUyYTg4NzkxMmZmZTU0YTMyY2U5N2NiMzQwMicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGFlZDRmMmJlM2E4YmYyNzhlNzAxMzJmYjBiZWI3NTIyZjU3MGUxNDRiZjYxNWMwN2U5OTZkNDQzZGVlODcyOScsXG4gICAgICAgICdhNjlkY2U0YTdkNmM5OGU4ZDRhMWFjYTg3ZWY4ZDcwMDNmODNjMjMwZjNhZmE3MjZhYjQwZTUyMjkwYmUxYzU1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjNDRkMTJjNzA2NWQ4MTJlOGFjZjI4ZDdjYmIxOWY5MDExZWNkOWU5ZmRmMjgxYjBlNmEzYjVlODdkMjJlN2RiJyxcbiAgICAgICAgJzIxMTlhNDYwY2UzMjZjZGM3NmM0NTkyNmM5ODJmZGFjMGUxMDZlODYxZWRmNjFjNWEwMzkwNjNmMGUwZTY0ODInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzZhMjQ1YmY2ZGM2OTg1MDRjODlhMjBjZmRlZDYwODUzMTUyYjY5NTMzNmMyODA2M2I2MWM2NWNiZDI2OWU2YjQnLFxuICAgICAgICAnZTAyMmNmNDJjMmJkNGE3MDhiM2Y1MTI2ZjE2YTI0YWQ4YjMzYmE0OGQwNDIzYjZlZmQ1ZTYzNDgxMDBkOGE4MicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTY5N2ZmYTZmZDlkZTYyN2MwNzdlM2QyZmU1NDEwODRjZTEzMzAwYjBiZWMxMTQ2Zjk1YWU1N2YwZDBiZDZhNScsXG4gICAgICAgICdiOWMzOThmMTg2ODA2ZjVkMjc1NjE1MDZlNDU1NzQzM2EyY2YxNTAwOWU0OThhZTdhZGVlOWQ2M2QwMWIyMzk2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc2MDViZGIwMTk5ODE3MThiOTg2ZDBmMDdlODM0Y2IwZDlkZWI4MzYwZmZiN2Y2MWRmOTgyMzQ1ZWYyN2E3NDc5JyxcbiAgICAgICAgJzI5NzJkMmRlNGY4ZDIwNjgxYTc4ZDkzZWM5NmZlMjNjMjZiZmFlODRmYjE0ZGI0M2IwMWUxZTkwNTZiOGM0OScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNjJkMTRkYWI0MTUwYmY0OTc0MDJmZGM0NWEyMTVlMTBkY2IwMWMzNTQ5NTliMTBjZmUzMWM3ZTlkODdmZjMzZCcsXG4gICAgICAgICc4MGZjMDZiZDhjYzViMDEwOTgwODhhMTk1MGVlZDBkYjAxYWExMzI5NjdhYjQ3MjIzNWY1NjQyNDgzYjI1ZWFmJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4MGM2MGFkMDA0MGYyN2RhZGU1YjRiMDZjNDA4ZTU2YjJjNTBlOWY1NmI5YjhiNDI1ZTU1NWMyZjg2MzA4YjZmJyxcbiAgICAgICAgJzFjMzgzMDNmMWNjNWMzMGYyNmU2NmJhZDdmZTcyZjcwYTY1ZWVkNGNiZTcwMjRlYjFhYTAxZjU2NDMwYmQ1N2EnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzdhOTM3NWFkNjE2N2FkNTRhYTc0YzYzNDhjYzU0ZDM0NGNjNWRjOTQ4N2Q4NDcwNDlkNWVhYmIwZmEwM2M4ZmInLFxuICAgICAgICAnZDBlM2ZhOWVjYTg3MjY5MDk1NTllMGQ3OTI2OTA0NmJkYzU5ZWExMGM3MGNlMmIwMmQ0OTllYzIyNGRjN2Y3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkNTI4ZWNkOWI2OTZiNTRjOTA3YTllZDA0NTQ0N2E3OWJiNDA4ZWMzOWI2OGRmNTA0YmI1MWY0NTliYzNmZmM5JyxcbiAgICAgICAgJ2VlY2Y0MTI1MzEzNmU1Zjk5OTY2ZjIxODgxZmQ2NTZlYmM0MzQ1NDA1YzUyMGRiYzA2MzQ2NWI1MjE0MDk5MzMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQ5MzcwYTRiNWY0MzQxMmVhMjVmNTE0ZThlY2RhZDA1MjY2MTE1ZTRhN2VjYjEzODcyMzE4MDhmOGI0NTk2MycsXG4gICAgICAgICc3NThmM2Y0MWFmZDZlZDQyOGIzMDgxYjA1MTJmZDYyYTU0YzNmM2FmYmI1YjY3NjRiNjUzMDUyYTEyOTQ5YzlhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3N2YyMzA5MzZlZTg4Y2JiZDczZGY5MzBkNjQ3MDJlZjg4MWQ4MTFlMGUxNDk4ZTJmMWMxM2ViMWZjMzQ1ZDc0JyxcbiAgICAgICAgJzk1OGVmNDJhNzg4NmI2NDAwYTA4MjY2ZTliYTFiMzc4OTZjOTUzMzBkOTcwNzdjYmJlOGViM2M3NjcxYzYwZDYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2YyZGFjOTkxY2M0Y2U0YjllYTQ0ODg3ZTVjN2MwYmNlNThjODAwNzRhYjlkNGRiYWViMjg1MzFiNzczOWY1MzAnLFxuICAgICAgICAnZTBkZWRjOWIzYjJmOGRhZDRkYTFmMzJkZWMyNTMxZGY5ZWI1ZmJlYjA1OThlNGZkMWExMTdkYmE3MDNhM2MzNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNDYzYjNkOWY2NjI2MjFmYjFiNGJlOGZiYmUyNTIwMTI1YTIxNmNkZmM5ZGFlM2RlYmNiYTQ4NTBjNjkwZDQ1YicsXG4gICAgICAgICc1ZWQ0MzBkNzhjMjk2YzM1NDMxMTQzMDZkZDg2MjJkN2M2MjJlMjdjOTcwYTFkZTMxY2IzNzdiMDFhZjczMDdlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMTZmODA0MjQ0ZTQ2ZTJhMDkyMzJkNGFmZjNiNTk5NzZiOThmYWMxNDMyOGEyZDFhMzI0OTZiNDk5OThmMjQ3JyxcbiAgICAgICAgJ2NlZGFiZDliODIyMDNmN2UxM2QyMDZmY2RmNGUzM2Q5MmE2YzUzYzI2ZTVjY2UyNmQ2NTc5OTYyYzRlMzFkZjYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2NhZjc1NDI3MmRjODQ1NjNiMDM1MmI3YTE0MzExYWY1NWQyNDUzMTVhY2UyN2M2NTM2OWUxNWY3MTUxZDQxZDEnLFxuICAgICAgICAnY2I0NzQ2NjBlZjM1ZjVmMmE0MWI2NDNmYTVlNDYwNTc1ZjRmYTliNzk2MjIzMmE1YzMyZjkwODMxOGEwNDQ3NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMjYwMGNhNGIyODJjYjk4NmY4NWQwZjE3MDk5NzlkOGI0NGEwOWMwN2NiODZkN2MxMjQ0OTdiYzg2ZjA4MjEyMCcsXG4gICAgICAgICc0MTE5Yjg4NzUzYzE1YmQ2YTY5M2IwM2ZjZGRiYjQ1ZDVhYzZiZTc0YWI1ZjBlZjQ0YjBiZTk0NzVhN2U0YjQwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NjM1Y2E3MmQ3ZTg0MzJjMzM4ZWM1M2NkMTIyMjBiYzAxYzQ4Njg1ZTI0ZjdkYzhjNjAyYTc3NDY5OThlNDM1JyxcbiAgICAgICAgJzkxYjY0OTYwOTQ4OWQ2MTNkMWQ1ZTU5MGY3OGU2ZDc0ZWNmYzA2MWQ1NzA0OGJhZDllNzZmMzAyYzViOWM2MScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzU0ZTMyMzlmMzI1NTcwY2RiYmY0YTg3ZGVlZThhNjZiN2YyYjMzNDc5ZDQ2OGZiYzFhNTA3NDNiZjU2Y2MxOCcsXG4gICAgICAgICc2NzNmYjg2ZTViZGEzMGZiM2NkMGVkMzA0ZWE0OWEwMjNlZTMzZDAxOTdhNjk1ZDBjNWQ5ODA5M2M1MzY2ODMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UzZTZiZDEwNzFhMWU5NmFmZjU3ODU5YzgyZDU3MGYwMzMwODAwNjYxZDFjOTUyZjlmZTI2OTQ2OTFkOWI5ZTgnLFxuICAgICAgICAnNTljOWUwYmJhMzk0ZTc2ZjQwYzBhYTU4Mzc5YTNjYjZhNWEyMjgzOTkzZTkwYzQxNjcwMDJhZjQ5MjBlMzdmNScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTg2YjQ4M2QwNTZhMDMzODI2YWU3M2Q4OGY3MzI5ODVjNGNjYjFmMzJiYTM1ZjRiNGNjNDdmZGNmMDRhYTZlYicsXG4gICAgICAgICczYjk1MmQzMmM2N2NmNzdlMmUxNzQ0NmUyMDQxODBhYjIxZmI4MDkwODk1MTM4YjRhNGE3OTdmODZlODA4ODhiJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdkZjlkNzBhNmI5ODc2Y2U1NDRjOTg1NjFmNGJlNGY3MjU0NDJlNmQyYjczN2Q5YzkxYTgzMjE3MjRjZTA5NjNmJyxcbiAgICAgICAgJzU1ZWIyZGFmZDg0ZDZjY2Q1Zjg2MmI3ODVkYzM5ZDRhYjE1NzIyMjcyMGVmOWRhMjE3YjhjNDVjZjJiYTI0MTcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzVlZGQ1Y2MyM2M1MWU4N2E0OTdjYTgxNWQ1ZGNlMGY4YWI1MjU1NGY4NDllZDg5OTVkZTY0YzVmMzRjZTcxNDMnLFxuICAgICAgICAnZWZhZTljOGRiYzE0MTMwNjYxZThjZWMwMzBjODlhZDBjMTNjNjZjMGQxN2EyOTA1Y2RjNzA2YWI3Mzk5YTg2OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMjkwNzk4YzJiNjQ3NjgzMGRhMTJmZTAyMjg3ZTllNzc3YWEzZmJhMWMzNTViMTdhNzIyZDM2MmY4NDYxNGZiYScsXG4gICAgICAgICdlMzhkYTc2ZGNkNDQwNjIxOTg4ZDAwYmNmNzlhZjI1ZDViMjljMDk0ZGIyYTIzMTQ2ZDAwM2FmZDQxOTQzZTdhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhZjNjNDIzYTk1ZDlmNWIzMDU0NzU0ZWZhMTUwYWMzOWNkMjk1NTJmZTM2MDI1NzM2MmRmZGVjZWY0MDUzYjQ1JyxcbiAgICAgICAgJ2Y5OGEzZmQ4MzFlYjJiNzQ5YTkzYjBlNmYzNWNmYjQwYzhjZDVhYTY2N2ExNTU4MWJjMmZlZGVkNDk4ZmQ5YzYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc2NmRiYjI0ZDEzNGU3NDVjY2NhYTI4Yzk5YmYyNzQ5MDZiYjY2YjI2ZGNmOThkZjhkMmZlZDUwZDg4NDI0OWEnLFxuICAgICAgICAnNzQ0YjExNTJlYWNiZTVlMzhkY2M4ODc5ODBkYTM4Yjg5NzU4NGE2NWZhMDZjZWRkMmM5MjRmOTdjYmFjNTk5NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNTlkYmY0NmY4Yzk0NzU5YmEyMTI3N2MzMzc4NGY0MTY0NWY3YjQ0ZjZjNTk2YTU4Y2U5MmU2NjYxOTFhYmUzZScsXG4gICAgICAgICdjNTM0YWQ0NDE3NWZiYzMwMGY0ZWE2Y2U2NDgzMDlhMDQyY2U3MzlhNzkxOTc5OGNkODVlMjE2YzRhMzA3ZjZlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMTNhZGE5NTEwM2M0NTM3MzA1ZTY5MWU3NGU5YTRhOGRkNjQ3ZTcxMWE5NWU3M2NiNjJkYzYwMThjZmQ4N2I4JyxcbiAgICAgICAgJ2UxMzgxN2I0NGVlMTRkZTY2M2JmNGJjODA4MzQxZjMyNjk0OWUyMWE2YTc1YzI1NzA3Nzg0MTliZGFmNTczM2QnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc3NTRiNGZhMGU4YWNlZDA2ZDQxNjdhMmM1OWNjYTRjZGExODY5YzA2ZWJhZGZiNjQ4ODU1MDAxNWE4ODUyMmMnLFxuICAgICAgICAnMzBlOTNlODY0ZTY2OWQ4MjIyNGI5NjdjMzAyMGI4ZmE4ZDFlNGUzNTBiNmNiY2M1MzdhNDhiNTc4NDExNjNhMicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTQ4ZGNhZGY1OTkwZTA0OGFhMzg3NGQ0NmFiZWY5ZDcwMTg1OGY5NWRlODA0MWQyYTY4MjhjOTllMjI2MjUxOScsXG4gICAgICAgICdlNDkxYTQyNTM3ZjZlNTk3ZDVkMjhhMzIyNGIxYmMyNWRmOTE1NGVmYmQyZWYxZDJjYmJhMmNhZTUzNDdkNTdlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3OTYyNDE0NDUwYzc2YzE2ODljN2I0OGY4MjAyZWMzN2ZiMjI0Y2Y1YWMwYmZhMTU3MDMyOGE4YTNkN2M3N2FiJyxcbiAgICAgICAgJzEwMGI2MTBlYzRmZmI0NzYwZDVjMWZjMTMzZWY2ZjZiMTI1MDdhMDUxZjA0YWM1NzYwYWZhNWIyOWRiODM0MzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM1MTQwODc4MzQ5NjRiNTRiMTViMTYwNjQ0ZDkxNTQ4NWExNjk3NzIyNWI4ODQ3YmIwZGQwODUxMzdlYzQ3Y2EnLFxuICAgICAgICAnZWYwYWZiYjIwNTYyMDU0NDhlMTY1MmM0OGU4MTI3ZmM2MDM5ZTc3YzE1YzIzNzhiN2U3ZDE1YTBkZTI5MzMxMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDNjYzMwYWQ2YjQ4M2U0YmM3OWNlMmM5ZGQ4YmM1NDk5M2U5NDdlYjhkZjc4N2I0NDI5NDNkM2Y3YjUyN2VhZicsXG4gICAgICAgICc4YjM3OGEyMmQ4MjcyNzhkODljNWU5YmU4Zjk1MDhhZTNjMmFkNDYyOTAzNTg2MzBhZmIzNGRiMDRlZWRlMGE0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNjI0ZDg0NzgwNzMyODYwY2UxYzc4ZmNiZmVmZTA4YjJiMjk4MjNkYjkxM2Y2NDkzOTc1YmEwZmY0ODQ3NjEwJyxcbiAgICAgICAgJzY4NjUxY2Y5YjZkYTkwM2UwOTE0NDQ4YzZjZDlkNGNhODk2ODc4ZjUyODJiZTRjOGNjMDZlMmE0MDQwNzg1NzUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzczM2NlODBkYTk1NWE4YTI2OTAyYzk1NjMzZTYyYTk4NTE5MjQ3NGI1YWYyMDdkYTZkZjdiNGZkNWZjNjFjZDQnLFxuICAgICAgICAnZjU0MzVhMmJkMmJhZGY3ZDQ4NWE0ZDhiOGRiOWZjY2UzZTFlZjhlMDIwMWU0NTc4YzU0NjczYmMxZGM1ZWExZCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTVkOTQ0MTI1NDk0NTA2NGNmMWExYzMzYmJkM2I0OWY4OTY2YzUwOTIxNzFlNjk5ZWYyNThkZmFiODFjMDQ1YycsXG4gICAgICAgICdkNTZlYjMwYjY5NDYzZTcyMzRmNTEzN2I3M2I4NDE3NzQzNDgwMGJhY2ViZmM2ODVmYzM3YmJlOWVmZTQwNzBkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhMWQwZmNmMmVjOWRlNjc1YjYxMjEzNmU1Y2U3MGQyNzFjMjE0MTdjOWQyYjhhYWFhYzEzODU5OWQwNzE3OTQwJyxcbiAgICAgICAgJ2VkZDc3ZjUwYmNiNWEzY2FiMmU5MDczNzMwOTY2N2YyNjQxNDYyYTU0MDcwZjNkNTE5MjEyZDM5YzE5N2E2MjknLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UyMmZiZTE1YzBhZjhjY2M1NzgwYzA3MzVmODRkYmU5YTc5MGJhZGVlODI0NWMwNmM3Y2EzNzMzMWNiMzY5ODAnLFxuICAgICAgICAnYTg1NWJhYmFkNWNkNjBjODhiNDMwYTY5ZjUzYTFhN2EzODI4OTE1NDk2NDc5OWJlNDNkMDZkNzdkMzFkYTA2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMTEwOTFkZDk4NjBlOGUyMGVlMTM0NzNjMTE1NWY1ZjY5NjM1ZTM5NDcwNGVhYTc0MDA5NDUyMjQ2Y2ZhOWIzJyxcbiAgICAgICAgJzY2ZGI2NTZmODdkMWYwNGZmZmQxZjA0Nzg4YzA2ODMwODcxZWM1YTY0ZmVlZTY4NWJkODBmMGIxMjg2ZDgzNzQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM0YzFmZDA0ZDMwMWJlODliMzFjMDQ0MmQzZTZhYzI0ODgzOTI4YjQ1YTkzNDA3ODE4NjdkNDIzMmVjMmRiZGYnLFxuICAgICAgICAnOTQxNDY4NWU5N2IxYjU5NTRiZDQ2ZjczMDE3NDEzNmQ1N2YxY2VlYjQ4NzQ0M2RjNTMyMTg1N2JhNzNhYmVlJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdmMjE5ZWE1ZDZiNTQ3MDFjMWMxNGRlNWI1NTdlYjQyYThkMTNmM2FiYmNkMDhhZmZjYzJhNWU2YjA0OWI4ZDYzJyxcbiAgICAgICAgJzRjYjk1OTU3ZTgzZDQwYjBmNzNhZjQ1NDRjY2NmNmIxZjRiMDhkM2MwN2IyN2ZiOGQ4YzI5NjJhNDAwNzY2ZDEnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q3Yjg3NDBmNzRhOGZiYWFiMWY2ODNkYjhmNDVkZTI2NTQzYTU0OTBiY2E2MjcwODcyMzY5MTI0NjlhMGI0NDgnLFxuICAgICAgICAnZmE3Nzk2ODEyOGQ5YzkyZWUxMDEwZjMzN2FkNDcxN2VmZjE1ZGI1ZWQzYzA0OWIzNDExZTAzMTVlYWE0NTkzYicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzJkMzFjMjIyZjhmNmYwZWY4NmY3Yzk4ZDNhMzMzNWVhZDViY2QzMmFiZGQ5NDI4OWZlNGQzMDkxYWE4MjRiZicsXG4gICAgICAgICc1ZjMwMzJmNTg5MjE1NmUzOWNjZDNkNzkxNWI5ZTFkYTJlNmRhYzllNmYyNmU5NjExMThkMTRiODQ2MmUxNjYxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc3NDYxZjM3MTkxNGFiMzI2NzEwNDVhMTU1ZDk4MzFlYTg3OTNkNzdjZDU5NTkyYzQzNDBmODZjYmMxODM0N2I1JyxcbiAgICAgICAgJzhlYzBiYTIzOGI5NmJlYzBjYmRkZGNhZTBhYTQ0MjU0MmVlZTFmZjUwYzk4NmVhNmIzOTg0N2IzY2MwOTJmZjYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2VlMDc5YWRiMWRmMTg2MDA3NDM1NmEyNWFhMzgyMDZhNmQ3MTZiMmMzZTY3NDUzZDI4NzY5OGJhZDdiMmIyZDYnLFxuICAgICAgICAnOGRjMjQxMmFhZmUzYmU1YzRjNWYzN2UwZWNjNWY5ZjZhNDQ2OTg5YWYwNGM0ZTI1ZWJhYWM0NzllYzFjOGMxZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTZlYzkzZTQ0N2VjODNmMDQ2N2IxODMwMmVlNjIwZjdlNjVkZTMzMTg3NGM5ZGM3MmJmZDg2MTZiYTlkYTZiNScsXG4gICAgICAgICc1ZTQ2MzExNTBlNjJmYjQwZDBlOGMyYTdjYTU4MDRhMzlkNTgxODZhNTBlNDk3MTM5NjI2Nzc4ZTI1YjA2NzRkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlYWE1Zjk4MGMyNDVmNmYwMzg5NzgyOTBhZmE3MGI2YmQ4ODU1ODk3Zjk4YjZhYTQ4NWI5NjA2NWQ1MzdiZDk5JyxcbiAgICAgICAgJ2Y2NWY1ZDNlMjkyYzJlMDgxOWE1MjgzOTFjOTk0NjI0ZDc4NDg2OWQ3ZTZlYTY3ZmIxODA0MTAyNGVkYzA3ZGMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc4Yzk0MDc1NDRhYzEzMjY5MmVlMTkxMGEwMjQzOTk1OGFlMDQ4NzcxNTEzNDJlYTk2YzRiNmIzNWE0OWY1MScsXG4gICAgICAgICdmM2UwMzE5MTY5ZWI5Yjg1ZDU0MDQ3OTU1MzlhNWU2OGZhMWZiZDU4M2MwNjRkMjQ2MmI2NzVmMTk0YTNkZGI0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0OTRmNGJlMjE5YTFhNzcwMTZkY2Q4Mzg0MzFhZWEwMDAxY2RjOGFlN2E2ZmM2ODg3MjY1NzhkOTcwMjg1N2E1JyxcbiAgICAgICAgJzQyMjQyYTk2OTI4M2E1ZjMzOWJhN2YwNzVlMzZiYTJhZjkyNWNlMzBkNzY3ZWQ2ZTU1ZjRiMDMxODgwZDU2MmMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2E1OThhODAzMGRhNmQ4NmM2YmM3ZjJmNTE0NGVhNTQ5ZDI4MjExZWE1OGZhYTcwZWJmNGMxZTY2NWMxZmU5YjUnLFxuICAgICAgICAnMjA0YjVkNmY4NDgyMmMzMDdlNGI0YTcxNDA3MzdhZWMyM2ZjNjNiNjViMzVmODZhMTAwMjZkYmQyZDg2NGU2YicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzQxOTE2MzY1YWJiMmI1ZDA5MTkyZjVmMmRiZWFmZWMyMDhmMDIwZjEyNTcwYTE4NGRiYWRjM2U1ODU5NTk5NycsXG4gICAgICAgICc0ZjE0MzUxZDAwODdlZmE0OWQyNDViMzI4OTg0OTg5ZDVjYWY5NDUwZjM0YmZjMGVkMTZlOTZiNThmYTk5MTMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg0MWQ2MDYzYTU4NmZhNDc1YTcyNDYwNGRhMDNiYzViOTJhMmUwZDJlMGEzNmFjZmU0YzczYTU1MTQ3NDI4ODEnLFxuICAgICAgICAnNzM4NjdmNTljMDY1OWU4MTkwNGY5YTFjNzU0MzY5OGU2MjU2MmQ2NzQ0YzE2OWNlN2EzNmRlMDFhOGQ2MTU0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc1ZTk1YmIzOTlhNjk3MWQzNzYwMjY5NDdmODliZGUyZjI4MmIzMzgxMDkyOGJlNGRlZDExMmFjNGQ3MGUyMGQ1JyxcbiAgICAgICAgJzM5ZjIzZjM2NjgwOTA4NWJlZWJmYzcxMTgxMzEzNzc1YTk5YzlhZWQ3ZDhiYTM4YjE2MTM4NGM3NDYwMTI4NjUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM2ZTQ2NDFhNTM5NDhmZDQ3NmMzOWY4YTk5ZmQ5NzRlNWVjMDc1NjRiNTMxNWQ4YmY5OTQ3MWJjYTBlZjJmNjYnLFxuICAgICAgICAnZDI0MjRiMWIxYWJlNGViODE2NDIyN2IwODVjOWFhOTQ1NmVhMTM0OTNmZDU2M2UwNmZkNTFjZjU2OTRjNzhmYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzM2NTgxZWE3YmZiYmIyOTBjMTkxYTJmNTA3YTQxY2Y1NjQzODQyMTcwZTkxNGZhZWFiMjdjMmM1NzlmNzI2JyxcbiAgICAgICAgJ2VhZDEyMTY4NTk1ZmUxYmU5OTI1MjEyOWI2ZTU2YjMzOTFmN2FiMTQxMGNkMWUwZWYzZGNkY2FiZDJmZGEyMjQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzhhYjg5ODE2ZGFkZmQ2YjZhMWYyNjM0ZmNmMDBlYzg0MDM3ODEwMjVlZDY4OTBjNDg0OTc0MjcwNmJkNDNlZGUnLFxuICAgICAgICAnNmZkY2VmMDlmMmY2ZDBhMDQ0ZTY1NGFlZjYyNDEzNmY1MDNkNDU5YzNlODk4NDU4NThhNDdhOTEyOWNkZDI0ZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMWUzM2YxYTc0NmM5YzU3NzgxMzMzNDRkOTI5OWZjYWEyMGIwOTM4ZThhY2ZmMjU0NGJiNDAyODRiOGM1ZmI5NCcsXG4gICAgICAgICc2MDY2MDI1N2RkMTFiM2FhOWM4ZWQ2MThkMjRlZGZmMjMwNmQzMjBmMWQwMzAxMGUzM2E3ZDIwNTdmM2IzYjYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzg1YjdjMWRjYjNjZWMxYjdlZTdmMzBkZWQ3OWRkMjBhMGVkMWY0Y2MxOGNiY2ZjZmE0MTAzNjFmZDhmMDhmMzEnLFxuICAgICAgICAnM2Q5OGE5Y2RkMDI2ZGQ0M2YzOTA0OGYyNWE4ODQ3ZjRmY2FmYWQxODk1ZDdhNjMzYzZmZWQzYzM1ZTk5OTUxMScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMjlkZjlmYmQ4ZDllNDY1MDkyNzVmNGIxMjVkNmQ0NWQ3ZmJlOWEzYjg3OGE3YWY4NzJhMjgwMDY2MWFjNWY1MScsXG4gICAgICAgICdiNGM0ZmU5OWM3NzVhNjA2ZTJkODg2MjE3OTEzOWZmZGE2MWRjODYxYzAxOWU1NWNkMjg3NmViMmEyN2Q4NGInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2EwYjFjYWUwNmIwYTg0N2EzZmVhNmU2NzFhYWY4YWRmZGZlNThjYTJmNzY4MTA1YzgwODJiMmU0NDlmY2UyNTInLFxuICAgICAgICAnYWU0MzQxMDJlZGRlMDk1OGVjNGIxOWQ5MTdhNmEyOGU2YjcyZGExODM0YWZmMGU2NTBmMDQ5NTAzYTI5NmNmMicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNGU4Y2VhZmI5YjNlOWExMzZkYzdmZjY3ZTg0MDI5NWI0OTlkZmIzYjIxMzNlNGJhMTEzZjJlNGMwZTEyMWU1JyxcbiAgICAgICAgJ2NmMjE3NDExOGM4YjZkN2E0YjQ4ZjZkNTM0Y2U1Yzc5NDIyYzA4NmE2MzQ2MDUwMmI4MjdjZTYyYTMyNjY4M2MnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2QyNGE0NGUwNDdlMTliNmY1YWZiODFjN2NhMmY2OTA4MGE1MDc2Njg5YTAxMDkxOWY0MjcyNWMyYjc4OWEzM2InLFxuICAgICAgICAnNmZiOGQ1NTkxYjQ2NmY4ZmM2M2RiNTBmMWMwZjFjNjkwMTNmOTk2ODg3YjgyNDRkMmNkZWM0MTdhZmVhOGZhMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZWEwMTYwNmE3YTZjOWNkZDI0OWZkZmNmYWNiOTk1ODQwMDFlZGQyOGFiYmFiNzdiNTEwNGU5OGU4ZTNiMzVkNCcsXG4gICAgICAgICczMjJhZjQ5MDhjNzMxMmIwY2ZiZmUzNjlmN2E3YjNjZGI3ZDQ0OTRiYzI4MjM3MDBjZmQ2NTIxODhhM2VhOThkJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdhZjhhZGRiZjJiNjYxYzhhNmM2MzI4NjU1ZWI5NjY1MTI1MjAwN2Q4YzVlYTMxYmU0YWQxOTZkZThjZTIxMzFmJyxcbiAgICAgICAgJzY3NDllNjdjMDI5Yjg1ZjUyYTAzNGVhZmQwOTY4MzZiMjUyMDgxODY4MGUyNmFjOGYzZGZiY2RiNzE3NDk3MDAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2UzYWUxOTc0NTY2Y2EwNmNjNTE2ZDQ3ZTBmYjE2NWE2NzRhM2RhYmNmY2ExNWU3MjJmMGUzNDUwZjQ1ODg5JyxcbiAgICAgICAgJzJhZWFiZTdlNDUzMTUxMDExNjIxN2YwN2JmNGQwNzMwMGRlOTdlNDg3NGY4MWY1MzM0MjBhNzJlZWIwYmQ2YTQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzU5MWVlMzU1MzEzZDk5NzIxY2Y2OTkzZmZlZDFlM2UzMDE5OTNmZjNlZDI1ODgwMjA3NWVhOGNlZDM5N2UyNDYnLFxuICAgICAgICAnYjBlYTU1OGExMTNjMzBiZWE2MGZjNDc3NTQ2MGM3OTAxZmYwYjA1M2QyNWNhMmJkZWVlOThmMWE0YmU1ZDE5NicsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTEzOTZkNTVmZGE1NGM0OWYxOWFhOTczMThkOGRhNjFmYTg1ODRlNDdiMDg0OTQ1MDc3Y2YwMzI1NWI1Mjk4NCcsXG4gICAgICAgICc5OThjNzRhOGNkNDVhYzAxMjg5ZDU4MzNhN2JlYjQ3NDRmZjUzNmIwMWIyNTdiZTRjNTc2N2JlYTkzZWE1N2E0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczYzVkMmExYmEzOWM1YTE3OTAwMDA3MzhjOWUwYzQwYjhkY2RmZDU0Njg3NTRiNjQwNTU0MDE1N2UwMTdhYTdhJyxcbiAgICAgICAgJ2IyMjg0Mjc5OTk1YTM0ZTJmOWQ0ZGU3Mzk2ZmMxOGI4MGY5YjhiOWZkZDI3MGY2NjYxZjc5Y2E0YzgxYmQyNTcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2NjODcwNGI4YTYwYTBkZWZhM2E5OWE3Mjk5ZjJlOWMzZmJjMzk1YWZiMDRhYzA3ODQyNWVmOGExNzkzY2MwMzAnLFxuICAgICAgICAnYmRkNDYwMzlmZWVkMTc4ODFkMWUwODYyZGIzNDdmOGNmMzk1Yjc0ZmM0YmNkYzRlOTQwYjc0ZTNhYzFmMWIxMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYzUzM2U0ZjdlYTg1NTVhYWNkOTc3N2FjNWNhZDI5Yjk3ZGQ0ZGVmY2NjNTNlZTdlYTIwNDExOWIyODg5YjE5NycsXG4gICAgICAgICc2ZjBhMjU2YmM1ZWZkZjQyOWEyZmI2MjQyZjFhNDNhMmQ5YjkyNWJiNGE0YjNhMjZiYjhlMGY0NWViNTk2MDk2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjMTRmOGYyY2NiMjdkNmYxMDlmNmQwOGQwM2NjOTZhNjliYThjMzRlZWMwN2JiY2Y1NjZkNDhlMzNkYTY1OTMnLFxuICAgICAgICAnYzM1OWQ2OTIzYmIzOThmN2ZkNDQ3M2UxNmZlMWMyODQ3NWI3NDBkZDA5ODA3NWU2YzBlODY0OTExM2RjM2EzOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnYTZjYmMzMDQ2YmM2YTQ1MGJhYzI0Nzg5ZmExNzExNWE0Yzk3MzllZDc1ZjhmMjFjZTQ0MWY3MmUwYjkwZTZlZicsXG4gICAgICAgICcyMWFlN2Y0NjgwZTg4OWJiMTMwNjE5ZTJjMGY5NWEzNjBjZWI1NzNjNzA2MDMxMzk4NjJhZmQ2MTdmYTliOWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzM0N2Q2ZDlhMDJjNDg5MjdlYmZiODZjMTM1OWIxY2FmMTMwYTNjMDI2N2QxMWNlNjM0NGIzOWY5OWQ0M2NjMzgnLFxuICAgICAgICAnNjBlYTdmNjFhMzUzNTI0ZDFjOTg3ZjZlY2VjOTJmMDg2ZDU2NWFiNjg3ODcwY2IxMjY4OWZmMWUzMWM3NDQ0OCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZGE2NTQ1ZDIxODFkYjhkOTgzZjdkY2IzNzVlZjU4NjZkNDdjNjdiMWJmMzFjOGNmODU1ZWY3NDM3YjcyNjU2YScsXG4gICAgICAgICc0OWI5NjcxNWFiNjg3OGE3OWU3OGYwN2NlNTY4MGM1ZDY2NzMwNTFiNDkzNWJkODk3ZmVhODI0Yjc3ZGMyMDhhJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjNDA3NDdjYzlkMDEyY2IxYTEzYjgxNDgzMDljNmRlN2VjMjVkNjk0NWQ2NTcxNDZiOWQ1OTk0YjhmZWIxMTExJyxcbiAgICAgICAgJzVjYTU2MDc1M2JlMmExMmZjNmRlNmNhZjJjYjQ4OTU2NWRiOTM2MTU2Yjk1MTRlMWJiNWU4MzAzN2UwZmEyZDQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzRlNDJjOGVjODJjOTk3OThjY2YzYTYxMGJlODcwZTc4MzM4YzdmNzEzMzQ4YmQzNGM4MjAzZWY0MDM3ZjM1MDInLFxuICAgICAgICAnNzU3MWQ3NGVlNWUwZmI5MmE3YThiMzNhMDc3ODMzNDFhNTQ5MjE0NGNjNTRiY2M0MGE5NDQ3MzY5MzYwNjQzNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMzc3NWFiNzA4OWJjNmFmODIzYWJhMmUxYWY3MGIyMzZkMjUxY2FkYjBjODY3NDMyODc1MjJhMWIzYjBkZWRlYScsXG4gICAgICAgICdiZTUyZDEwN2JjZmEwOWQ4YmNiOTczNmE4MjhjZmE3ZmFjOGRiMTdiZjdhNzZhMmM0MmFkOTYxNDA5MDE4Y2Y3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdjZWUzMWNiZjdlMzRlYzM3OWQ5NGZiODE0ZDNkNzc1YWQ5NTQ1OTVkMTMxNGJhODg0Njk1OWUzZTgyZjc0ZTI2JyxcbiAgICAgICAgJzhmZDY0YTE0YzA2YjU4OWMyNmI5NDdhZTJiY2Y2YmZhMDE0OWVmMGJlMTRlZDRkODBmNDQ4YTAxYzQzYjFjNmQnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2I0ZjllYWVhMDliNjkxNzYxOWY2ZWE2YTRlYjU0NjRlZmRkYjU4ZmQ0NWIxZWJlZmNkYzFhMDFkMDhiNDc5ODYnLFxuICAgICAgICAnMzllNWM5OTI1YjVhNTRiMDc0MzNhNGYxOGM2MTcyNmY4YmIxMzFjMDEyY2E1NDJlYjI0YThhYzA3MjAwNjgyYScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDQyNjNkZmMzZDJkZjkyM2EwMTc5YTQ4OTY2ZDMwY2U4NGUyNTE1YWZjM2RjY2MxYjc3OTA3NzkyZWJjYzYwZScsXG4gICAgICAgICc2MmRmYWYwN2EwZjc4ZmViMzBlMzBkNjI5NTg1M2NlMTg5ZTEyNzc2MGFkNmNmN2ZhZTE2NGUxMjJhMjA4ZDU0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0ODQ1NzUyNDgyMGZhNjVhNGY4ZDM1ZWI2OTMwODU3YzAwMzJhY2MwYTRhMmRlNDIyMjMzZWVkYTg5NzYxMmM0JyxcbiAgICAgICAgJzI1YTc0OGFiMzY3OTc5ZDk4NzMzYzM4YTFmYTFjMmU3ZGM2Y2MwN2RiMmQ2MGE5YWU3YTc2YWFhNDliZDBmNzcnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2RmZWVlZjE4ODExMDFmMmNiMTE2NDRmM2EyYWZkZmMyMDQ1ZTE5OTE5MTUyOTIzZjM2N2ExNzY3YzExY2NlZGEnLFxuICAgICAgICAnZWNmYjcwNTZjZjFkZTA0MmY5NDIwYmFiMzk2NzkzYzBjMzkwYmRlNzRiNGJiZGZmMTZhODNhZTA5YTlhNzUxNycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNmQ3ZWY2YjE3NTQzZjgzNzNjNTczZjQ0ZTFmMzg5ODM1ZDg5YmNiYzYwNjJjZWQzNmM4MmRmODNiOGZhZTg1OScsXG4gICAgICAgICdjZDQ1MGVjMzM1NDM4OTg2ZGZlZmExMGM1N2ZlYTliY2M1MjFhMDk1OWIyZDgwYmJmNzRiMTkwZGNhNzEyZDEwJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNzU2MDVkNTkxMDJhNWEyNjg0NTAwZDNiOTkxZjJlM2YzYzg4YjkzMjI1NTQ3MDM1YWYyNWFmNjZlMDQ1NDFmJyxcbiAgICAgICAgJ2Y1YzU0NzU0YThmNzFlZTU0MGI5YjQ4NzI4NDczZTMxNGY3MjlhYzUzMDhiMDY5MzgzNjA5OTBlMmJmYWQxMjUnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2ViOTg2NjBmNGM0ZGZhYTA2YTJiZTQ1M2Q1MDIwYmM5OWEwYzJlNjBhYmUzODg0NTdkZDQzZmVmYjFlZDYyMGMnLFxuICAgICAgICAnNmNiOWE4ODc2ZDljYjg1MjA2MDlhZjNhZGQyNmNkMjBhMGE3Y2Q4YTk0MTExMzFjZTg1ZjQ0MTAwMDk5MjIzZScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnMTNlODdiMDI3ZDg1MTRkMzU5MzlmMmU2ODkyYjE5OTIyMTU0NTk2OTQxODg4MzM2ZGMzNTYzZTNiOGRiYTk0MicsXG4gICAgICAgICdmZWY1YTNjNjgwNTlhNmRlYzVkNjI0MTE0YmYxZTkxYWFjMmI5ZGE1NjhkNmFiZWIyNTcwZDU1NjQ2YjhhZGYxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlZTE2MzAyNmU5ZmQ2ZmUwMTdjMzhmMDZhNWJlNmZjMTI1NDI0YjM3MWNlMjcwOGU3YmY0NDkxNjkxZTU3NjRhJyxcbiAgICAgICAgJzFhY2IyNTBmMjU1ZGQ2MWM0M2Q5NGNjYzY3MGQwZjU4ZjQ5YWUzZmExNWI5NjYyM2U1NDMwZGEwYWQ2YzYyYjInLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2IyNjhmNWVmOWFkNTFlNGQ3OGRlM2E3NTBjMmRjODliMWU2MjZkNDM1MDU4Njc5OTk5MzJlNWRiMzNhZjNkODAnLFxuICAgICAgICAnNWYzMTBkNGIzYzk5YjllYmIxOWY3N2Q0MWMxZGVlMDE4Y2YwZDM0ZmQ0MTkxNjE0MDAzZTk0NWExMjE2ZTQyMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZmYwN2YzMTE4YTlkZjAzNWU5ZmFkODVlYjZjN2JmZTQyYjAyZjAxY2E5OWNlZWEzYmY3ZmZkYmE5M2M0NzUwZCcsXG4gICAgICAgICc0MzgxMzZkNjAzZTg1OGEzYTVjNDQwYzM4ZWNjYmFkZGMxZDI5NDIxMTRlMmVkZGQ0NzQwZDA5OGNlZDFmMGQ4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4ZDhiOTg1NWM3YzA1MmEzNDE0NmZkMjBmZmI2NThiZWE0YjlmNjllMGQ4MjVlYmVjMTZlOGMzY2UyYjUyNmExJyxcbiAgICAgICAgJ2NkYjU1OWVlZGMyZDc5ZjkyNmJhZjQ0ZmI4NGVhNGQ0NGJjZjUwZmVlNTFkN2NlYjMwZTJlN2Y0NjMwMzY3NTgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzUyZGIwYjUzODRkZmJmMDViZmE5ZDQ3MmQ3YWUyNmRmZTRiODUxY2VjYTkxYjFlYmE1NDI2MzE4MGRhMzJiNjMnLFxuICAgICAgICAnYzNiOTk3ZDA1MGVlNWQ0MjNlYmFmNjZhNmRiOWY1N2IzMTgwYzkwMjg3NTY3OWRlOTI0YjY5ZDg0YTdiMzc1JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdlNjJmOTQ5MGQzZDUxZGE2Mzk1ZWZkMjRlODA5MTljYzdkMGYyOWMzZjNmYTQ4YzZmZmY1NDNiZWNiZDQzMzUyJyxcbiAgICAgICAgJzZkODlhZDdiYTQ4NzZiMGIyMmMyY2EyODBjNjgyODYyZjM0MmM4NTkxZjFkYWY1MTcwZTA3YmZkOWNjYWZhN2QnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzdmMzBlYTI0NzZiMzk5YjQ5NTc1MDljODhmNzdkMDE5MWFmYTJmZjVjYjdiMTRmZDZkOGU3ZDY1YWFhYjExOTMnLFxuICAgICAgICAnY2E1ZWY3ZDRiMjMxYzk0YzNiMTUzODlhNWY2MzExZTlkYWZmN2JiNjdiMTAzZTk4ODBlZjRiZmY2MzdhY2FlYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNTA5OGZmMWUxZDlmMTRmYjQ2YTIxMGZhZGE2YzkwM2ZlZjBmYjdiNGExZGQxZDlhYzYwYTAzNjE4MDBiN2EwMCcsXG4gICAgICAgICc5NzMxMTQxZDgxZmM4ZjgwODRkMzdjNmU3NTQyMDA2YjNlZTFiNDBkNjBkZmU1MzYyYTViMTMyZmQxN2RkYzAnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzMyYjc4YzdkZTllZTUxMmE3Mjg5NWJlNmI5Y2JlZmE2ZTJmM2M0Y2NjZTQ0NWM5NmI5ZjJjODFlMjc3OGFkNTgnLFxuICAgICAgICAnZWUxODQ5ZjUxM2RmNzFlMzJlZmMzODk2ZWUyODI2MGM3M2JiODA1NDdhZTIyNzViYTQ5NzIzNzc5NGM4NzUzYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZTJjYjc0ZmRkYzhlOWZiY2QwNzZlZWYyYTdjNzJiMGNlMzdkNTBmMDgyNjlkZmMwNzRiNTgxNTUwNTQ3YTRmNycsXG4gICAgICAgICdkM2FhMmVkNzFjOWRkMjI0N2E2MmRmMDYyNzM2ZWIwYmFkZGVhOWUzNjEyMmQyYmU4NjQxYWJjYjAwNWNjNGE0JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc4NDM4NDQ3NTY2ZDRkN2JlZGFkYzI5OTQ5NmFiMzU3NDI2MDA5YTM1ZjIzNWNiMTQxYmUwZDk5Y2QxMGFlM2E4JyxcbiAgICAgICAgJ2M0ZTEwMjA5MTY5ODBhNGRhNWQwMWFjNWU2YWQzMzA3MzRlZjBkNzkwNjYzMWM0ZjIzOTA0MjZiMmVkZDc5MWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzQxNjJkNDg4Yjg5NDAyMDM5YjU4NGM2ZmM2YzMwODg3MDU4N2Q5YzQ2ZjY2MGI4NzhhYjY1YzgyYzcxMWQ2N2UnLFxuICAgICAgICAnNjcxNjNlOTAzMjM2Mjg5Zjc3NmYyMmMyNWZiOGEzYWZjMTczMmYyYjg0YjRlOTVkYmRhNDdhZTVhMDg1MjY0OScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnM2ZhZDNmYTg0Y2FmMGYzNGYwZjg5YmZkMmRjZjU0ZmMxNzVkNzY3YWVjM2U1MDY4NGYzYmE0YTRiZjVmNjgzZCcsXG4gICAgICAgICdjZDFiYzdjYjZjYzQwN2JiMmYwY2E2NDdjNzE4YTczMGNmNzE4NzJlN2QwZDJhNTNmYTIwZWZjZGZlNjE4MjYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzY3NGYyNjAwYTMwMDdhMDA1NjhjMWE3Y2UwNWQwODE2YzFmYjg0YmYxMzcwNzk4ZjFjNjk1MzJmYWViMWE4NmInLFxuICAgICAgICAnMjk5ZDIxZjk0MTNmMzNiM2VkZjQzYjI1NzAwNDU4MGI3MGRiNTdkYTBiMTgyMjU5ZTA5ZWVjYzY5ZTBkMzhhNScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDMyZjRkYTU0YWRlNzRhYmI4MWI4MTVhZDFmYjNiMjYzZDgyZDZjNjkyNzE0YmNmZjg3ZDI5YmQ1ZWU5ZjA4ZicsXG4gICAgICAgICdmOTQyOWU3MzhiOGU1M2I5NjhlOTkwMTZjMDU5NzA3NzgyZTE0ZjQ1MzUzNTlkNTgyZmM0MTY5MTBiM2VlYTg3JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMGU0ZTY3MDQzNTM4NTU1NmU1OTM2NTcxMzU4NDVkMzZmYmI2OTMxZjcyYjA4Y2IxZWQ5NTRmMWUzY2UzZmY2JyxcbiAgICAgICAgJzQ2MmY5YmNlNjE5ODk4NjM4NDk5MzUwMTEzYmJjOWIxMGE4NzhkMzVkYTcwNzQwZGM2OTVhNTU5ZWI4OGRiN2InLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2JlMjA2MjAwM2M1MWNjMzAwNDY4MjkwNDMzMGU0ZGVlN2YzZGNkMTBiMDFlNTgwYmYxOTcxYjA0ZDRjYWQyOTcnLFxuICAgICAgICAnNjIxODhiYzQ5ZDYxZTU0Mjg1NzNkNDhhNzRlMWM2NTViMWM2MTA5MDkwNTY4MmEwZDU1NThlZDcyZGNjYjliYycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnOTMxNDQ0MjNhY2UzNDUxZWQyOWUwZmI5YWMyYWYyMTFjYjZlODRhNjAxZGY1OTkzYzQxOTg1OWZmZjVkZjA0YScsXG4gICAgICAgICc3YzEwZGZiMTY0YzM0MjVmNWM3MWEzZjlkNzk5MjAzOGYxMDY1MjI0ZjcyYmI5ZDFkOTAyYTZkMTMwMzdiNDdjJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICdiMDE1ZjgwNDRmNWZjYmRjZjIxY2EyNmQ2YzM0ZmI4MTk3ODI5MjA1YzdiN2QyYTdjYjY2NDE4YzE1N2IxMTJjJyxcbiAgICAgICAgJ2FiOGMxZTA4NmQwNGU4MTM3NDRhNjU1YjJkZjhkNWY4M2IzY2RjNmZhYTMwODhjMWQzYWVhMTQ1NGUzYTFkNWYnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJ2Q1ZTllMWRhNjQ5ZDk3ZDg5ZTQ4NjgxMTdhNDY1YTNhNGY4YTE4ZGU1N2ExNDBkMzZiM2YyYWYzNDFhMjFiNTInLFxuICAgICAgICAnNGNiMDQ0MzdmMzkxZWQ3MzExMWExM2NjMWQ0ZGQwZGIxNjkzNDY1YzIyNDA0ODBkODk1NWU4NTkyZjI3NDQ3YScsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnZDNhZTQxMDQ3ZGQ3Y2EwNjVkYmY4ZWQ3N2I5OTI0Mzk5ODMwMDVjZDcyZTE2ZDZmOTk2YTUzMTZkMzY5NjZiYicsXG4gICAgICAgICdiZDFhZWIyMWFkMjJlYmIyMmExMGYwMzAzNDE3YzZkOTY0ZjhjZGQ3ZGYwYWNhNjE0YjEwZGMxNGQxMjVhYzQ2JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICc0NjNlMjc2M2Q4ODVmOTU4ZmM2NmNkZDIyODAwZjBhNDg3MTk3ZDBhODJlMzc3YjQ5ZjgwYWY4N2M4OTdiMDY1JyxcbiAgICAgICAgJ2JmZWZhY2RiMGU1ZDBmZDdkZjNhMzExYTk0ZGUwNjJiMjZiODBjNjFmYmM5NzUwOGI3OTk5MjY3MWVmN2NhN2YnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc5ODVmZGZkMTI3YzA1NjdjNmY1M2VjMWJiNjNlYzMxNThlNTk3YzQwYmZlNzQ3YzgzY2RkZmM5MTA2NDE5MTcnLFxuICAgICAgICAnNjAzYzEyZGFmM2Q5ODYyZWYyYjI1ZmUxZGUyODlhZWQyNGVkMjkxZTBlYzY3MDg3MDNhNWJkNTY3ZjMyZWQwMycsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnNzRhMWFkNmI1Zjc2ZTM5ZGIyZGQyNDk0MTBlYWM3Zjk5ZTc0YzU5Y2I4M2QyZDBlZDVmZjE1NDNkYTc3MDNlOScsXG4gICAgICAgICdjYzYxNTdlZjE4YzljNjNjZDYxOTNkODM2MzFiYmVhMDA5M2UwOTY4OTQyZThjMzNkNTczN2ZkNzkwZTBkYjA4JyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICczMDY4MmE1MDcwMzM3NWY2MDJkNDE2NjY0YmExOWI3ZmM5YmFiNDJjNzI3NDc0NjNhNzFkMDg5NmIyMmY2ZGEzJyxcbiAgICAgICAgJzU1M2UwNGY2YjAxOGI0ZmE2YzhmMzllN2YzMTFkMzE3NjI5MGQwZTBmMTljYTczZjE3NzE0ZDk5NzdhMjJmZjgnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzllMjE1OGYwZDdjMGQ1ZjI2YzM3OTFlZmVmYTc5NTk3NjU0ZTdhMmIyNDY0ZjUyYjFlZTZjMTM0Nzc2OWVmNTcnLFxuICAgICAgICAnNzEyZmNkZDFiOTA1M2YwOTAwM2EzNDgxZmE3NzYyZTlmZmQ3YzhlZjM1YTM4NTA5ZTJmYmYyNjI5MDA4MzczJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxNzZlMjY5ODlhNDNjOWNmZWJhNDAyOWMyMDI1MzhjMjgxNzJlNTY2ZTNjNGZjZTczMjI4NTdmM2JlMzI3ZDY2JyxcbiAgICAgICAgJ2VkOGNjOWQwNGIyOWViODc3ZDI3MGI0ODc4ZGM0M2MxOWFlZmQzMWY0ZWVlMDllZTdiNDc4MzRjMWZhNGIxYzMnLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgJzc1ZDQ2ZWZlYTM3NzFlNmU2OGFiYjg5YTEzYWQ3NDdlY2YxODkyMzkzZGZjNGYxYjcwMDQ3ODhjNTAzNzRkYTgnLFxuICAgICAgICAnOTg1MjM5MGE5OTUwNzY3OWZkMGI4NmZkMmIzOWE4NjhkN2VmYzIyMTUxMzQ2ZTFhM2NhNDcyNjU4NmE2YmVkOCcsXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICAnODA5YTIwYzY3ZDY0OTAwZmZiNjk4YzRjODI1ZjZkNWYyMzEwZmIwNDUxYzg2OTM0NWI3MzE5ZjY0NTYwNTcyMScsXG4gICAgICAgICc5ZTk5NDk4MGQ5OTE3ZTIyYjc2YjA2MTkyN2ZhMDQxNDNkMDk2Y2NjNTQ5NjNlNmE1ZWJmYTVmM2Y4ZTI4NmMxJyxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgICcxYjM4OTAzYTQzZjdmMTE0ZWQ0NTAwYjRlYWM3MDgzZmRlZmVjZTFjZjI5YzYzNTI4ZDU2MzQ0NmY5NzJjMTgwJyxcbiAgICAgICAgJzQwMzZlZGM5MzFhNjBhZTg4OTM1M2Y3N2ZkNTNkZTRhMjcwOGIyNmI2ZjVkYTcyYWQzMzk0MTE5ZGFmNDA4ZjknLFxuICAgICAgXSxcbiAgICBdLFxuICB9LFxufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VydmVzID0gZXhwb3J0cztcblxudmFyIGhhc2ggPSByZXF1aXJlKCdoYXNoLmpzJyk7XG52YXIgY3VydmUgPSByZXF1aXJlKCcuL2N1cnZlJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIFByZXNldEN1cnZlKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMudHlwZSA9PT0gJ3Nob3J0JylcbiAgICB0aGlzLmN1cnZlID0gbmV3IGN1cnZlLnNob3J0KG9wdGlvbnMpO1xuICBlbHNlIGlmIChvcHRpb25zLnR5cGUgPT09ICdlZHdhcmRzJylcbiAgICB0aGlzLmN1cnZlID0gbmV3IGN1cnZlLmVkd2FyZHMob3B0aW9ucyk7XG4gIGVsc2VcbiAgICB0aGlzLmN1cnZlID0gbmV3IGN1cnZlLm1vbnQob3B0aW9ucyk7XG4gIHRoaXMuZyA9IHRoaXMuY3VydmUuZztcbiAgdGhpcy5uID0gdGhpcy5jdXJ2ZS5uO1xuICB0aGlzLmhhc2ggPSBvcHRpb25zLmhhc2g7XG5cbiAgYXNzZXJ0KHRoaXMuZy52YWxpZGF0ZSgpLCAnSW52YWxpZCBjdXJ2ZScpO1xuICBhc3NlcnQodGhpcy5nLm11bCh0aGlzLm4pLmlzSW5maW5pdHkoKSwgJ0ludmFsaWQgY3VydmUsIEcqTiAhPSBPJyk7XG59XG5jdXJ2ZXMuUHJlc2V0Q3VydmUgPSBQcmVzZXRDdXJ2ZTtcblxuZnVuY3Rpb24gZGVmaW5lQ3VydmUobmFtZSwgb3B0aW9ucykge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VydmVzLCBuYW1lLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjdXJ2ZSA9IG5ldyBQcmVzZXRDdXJ2ZShvcHRpb25zKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdXJ2ZXMsIG5hbWUsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogY3VydmUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjdXJ2ZTtcbiAgICB9LFxuICB9KTtcbn1cblxuZGVmaW5lQ3VydmUoJ3AxOTInLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiAncDE5MicsXG4gIHA6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZicsXG4gIGE6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmYycsXG4gIGI6ICc2NDIxMDUxOSBlNTljODBlNyAwZmE3ZTlhYiA3MjI0MzA0OSBmZWI4ZGVlYyBjMTQ2YjliMScsXG4gIG46ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiA5OWRlZjgzNiAxNDZiYzliMSBiNGQyMjgzMScsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICcxODhkYTgwZSBiMDMwOTBmNiA3Y2JmMjBlYiA0M2ExODgwMCBmNGZmMGFmZCA4MmZmMTAxMicsXG4gICAgJzA3MTkyYjk1IGZmYzhkYTc4IDYzMTAxMWVkIDZiMjRjZGQ1IDczZjk3N2ExIDFlNzk0ODExJyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDIyNCcsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6ICdwMjI0JyxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxJyxcbiAgYTogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlJyxcbiAgYjogJ2I0MDUwYTg1IDBjMDRiM2FiIGY1NDEzMjU2IDUwNDRiMGI3IGQ3YmZkOGJhIDI3MGIzOTQzIDIzNTVmZmI0JyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmYxNmEyIGUwYjhmMDNlIDEzZGQyOTQ1IDVjNWMyYTNkJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJ2I3MGUwY2JkIDZiYjRiZjdmIDMyMTM5MGI5IDRhMDNjMWQzIDU2YzIxMTIyIDM0MzI4MGQ2IDExNWMxZDIxJyxcbiAgICAnYmQzNzYzODggYjVmNzIzZmIgNGMyMmRmZTYgY2Q0Mzc1YTAgNWEwNzQ3NjQgNDRkNTgxOTkgODUwMDdlMzQnLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdwMjU2Jywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogbnVsbCxcbiAgcDogJ2ZmZmZmZmZmIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmJyxcbiAgYTogJ2ZmZmZmZmZmIDAwMDAwMDAxIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZjJyxcbiAgYjogJzVhYzYzNWQ4IGFhM2E5M2U3IGIzZWJiZDU1IDc2OTg4NmJjIDY1MWQwNmIwIGNjNTNiMGY2IDNiY2UzYzNlIDI3ZDI2MDRiJyxcbiAgbjogJ2ZmZmZmZmZmIDAwMDAwMDAwIGZmZmZmZmZmIGZmZmZmZmZmIGJjZTZmYWFkIGE3MTc5ZTg0IGYzYjljYWMyIGZjNjMyNTUxJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzZiMTdkMWYyIGUxMmM0MjQ3IGY4YmNlNmU1IDYzYTQ0MGYyIDc3MDM3ZDgxIDJkZWIzM2EwIGY0YTEzOTQ1IGQ4OThjMjk2JyxcbiAgICAnNGZlMzQyZTIgZmUxYTdmOWIgOGVlN2ViNGEgN2MwZjllMTYgMmJjZTMzNTcgNmIzMTVlY2UgY2JiNjQwNjggMzdiZjUxZjUnLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdwMzg0Jywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogbnVsbCxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmUgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmYnLFxuICBhOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZSBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmYycsXG4gIGI6ICdiMzMxMmZhNyBlMjNlZTdlNCA5ODhlMDU2YiBlM2Y4MmQxOSAxODFkOWM2ZSBmZTgxNDExMiAwMzE0MDg4ZiAnICtcbiAgICAgJzUwMTM4NzVhIGM2NTYzOThkIDhhMmVkMTlkIDJhODVjOGVkIGQzZWMyYWVmJyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGM3NjM0ZDgxICcgK1xuICAgICAnZjQzNzJkZGYgNTgxYTBkYjIgNDhiMGE3N2EgZWNlYzE5NmEgY2NjNTI5NzMnLFxuICBoYXNoOiBoYXNoLnNoYTM4NCxcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnYWE4N2NhMjIgYmU4YjA1MzcgOGViMWM3MWUgZjMyMGFkNzQgNmUxZDNiNjIgOGJhNzliOTggNTlmNzQxZTAgODI1NDJhMzggJyArXG4gICAgJzU1MDJmMjVkIGJmNTUyOTZjIDNhNTQ1ZTM4IDcyNzYwYWI3JyxcbiAgICAnMzYxN2RlNGEgOTYyNjJjNmYgNWQ5ZTk4YmYgOTI5MmRjMjkgZjhmNDFkYmQgMjg5YTE0N2MgZTlkYTMxMTMgYjVmMGI4YzAgJyArXG4gICAgJzBhNjBiMWNlIDFkN2U4MTlkIDdhNDMxZDdjIDkwZWEwZTVmJyxcbiAgXSxcbn0pO1xuXG5kZWZpbmVDdXJ2ZSgncDUyMScsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6IG51bGwsXG4gIHA6ICcwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYnLFxuICBhOiAnMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZjJyxcbiAgYjogJzAwMDAwMDUxIDk1M2ViOTYxIDhlMWM5YTFmIDkyOWEyMWEwIGI2ODU0MGVlIGEyZGE3MjViICcgK1xuICAgICAnOTliMzE1ZjMgYjhiNDg5OTEgOGVmMTA5ZTEgNTYxOTM5NTEgZWM3ZTkzN2IgMTY1MmMwYmQgJyArXG4gICAgICczYmIxYmYwNyAzNTczZGY4OCAzZDJjMzRmMSBlZjQ1MWZkNCA2YjUwM2YwMCcsXG4gIG46ICcwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZhIDUxODY4NzgzIGJmMmY5NjZiIDdmY2MwMTQ4ICcgK1xuICAgICAnZjcwOWE1ZDAgM2JiNWM5YjggODk5YzQ3YWUgYmI2ZmI3MWUgOTEzODY0MDknLFxuICBoYXNoOiBoYXNoLnNoYTUxMixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnMDAwMDAwYzYgODU4ZTA2YjcgMDQwNGU5Y2QgOWUzZWNiNjYgMjM5NWI0NDIgOWM2NDgxMzkgJyArXG4gICAgJzA1M2ZiNTIxIGY4MjhhZjYwIDZiNGQzZGJhIGExNGI1ZTc3IGVmZTc1OTI4IGZlMWRjMTI3ICcgK1xuICAgICdhMmZmYThkZSAzMzQ4YjNjMSA4NTZhNDI5YiBmOTdlN2UzMSBjMmU1YmQ2NicsXG4gICAgJzAwMDAwMTE4IDM5Mjk2YTc4IDlhM2JjMDA0IDVjOGE1ZmI0IDJjN2QxYmQ5IDk4ZjU0NDQ5ICcgK1xuICAgICc1NzliNDQ2OCAxN2FmYmQxNyAyNzNlNjYyYyA5N2VlNzI5OSA1ZWY0MjY0MCBjNTUwYjkwMSAnICtcbiAgICAnM2ZhZDA3NjEgMzUzYzcwODYgYTI3MmMyNDAgODhiZTk0NzYgOWZkMTY2NTAnLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdjdXJ2ZTI1NTE5Jywge1xuICB0eXBlOiAnbW9udCcsXG4gIHByaW1lOiAncDI1NTE5JyxcbiAgcDogJzdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQnLFxuICBhOiAnNzZkMDYnLFxuICBiOiAnMScsXG4gIG46ICcxMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgMTRkZWY5ZGVhMmY3OWNkNiA1ODEyNjMxYTVjZjVkM2VkJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzknLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdlZDI1NTE5Jywge1xuICB0eXBlOiAnZWR3YXJkcycsXG4gIHByaW1lOiAncDI1NTE5JyxcbiAgcDogJzdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQnLFxuICBhOiAnLTEnLFxuICBjOiAnMScsXG4gIC8vIC0xMjE2NjUgKiAoMTIxNjY2XigtMSkpIChtb2QgUClcbiAgZDogJzUyMDM2Y2VlMmI2ZmZlNzMgOGNjNzQwNzk3Nzc5ZTg5OCAwMDcwMGE0ZDQxNDFkOGFiIDc1ZWI0ZGNhMTM1OTc4YTMnLFxuICBuOiAnMTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIDE0ZGVmOWRlYTJmNzljZDYgNTgxMjYzMWE1Y2Y1ZDNlZCcsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICcyMTY5MzZkM2NkNmU1M2ZlYzBhNGUyMzFmZGQ2ZGM1YzY5MmNjNzYwOTUyNWE3YjJjOTU2MmQ2MDhmMjVkNTFhJyxcblxuICAgIC8vIDQvNVxuICAgICc2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjU4JyxcbiAgXSxcbn0pO1xuXG52YXIgcHJlO1xudHJ5IHtcbiAgcHJlID0gcmVxdWlyZSgnLi9wcmVjb21wdXRlZC9zZWNwMjU2azEnKTtcbn0gY2F0Y2ggKGUpIHtcbiAgcHJlID0gdW5kZWZpbmVkO1xufVxuXG5kZWZpbmVDdXJ2ZSgnc2VjcDI1NmsxJywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogJ2syNTYnLFxuICBwOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZjMmYnLFxuICBhOiAnMCcsXG4gIGI6ICc3JyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGJhYWVkY2U2IGFmNDhhMDNiIGJmZDI1ZThjIGQwMzY0MTQxJyxcbiAgaDogJzEnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcblxuICAvLyBQcmVjb21wdXRlZCBlbmRvbW9ycGhpc21cbiAgYmV0YTogJzdhZTk2YTJiNjU3YzA3MTA2ZTY0NDc5ZWFjMzQzNGU5OWNmMDQ5NzUxMmY1ODk5NWMxMzk2YzI4NzE5NTAxZWUnLFxuICBsYW1iZGE6ICc1MzYzYWQ0Y2MwNWMzMGUwYTUyNjFjMDI4ODEyNjQ1YTEyMmUyMmVhMjA4MTY2NzhkZjAyOTY3YzFiMjNiZDcyJyxcbiAgYmFzaXM6IFtcbiAgICB7XG4gICAgICBhOiAnMzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTUnLFxuICAgICAgYjogJy1lNDQzN2VkNjAxMGU4ODI4NmY1NDdmYTkwYWJmZTRjMycsXG4gICAgfSxcbiAgICB7XG4gICAgICBhOiAnMTE0Y2E1MGY3YThlMmYzZjY1N2MxMTA4ZDlkNDRjZmQ4JyxcbiAgICAgIGI6ICczMDg2ZDIyMWE3ZDQ2YmNkZTg2YzkwZTQ5Mjg0ZWIxNScsXG4gICAgfSxcbiAgXSxcblxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICc3OWJlNjY3ZWY5ZGNiYmFjNTVhMDYyOTVjZTg3MGIwNzAyOWJmY2RiMmRjZTI4ZDk1OWYyODE1YjE2ZjgxNzk4JyxcbiAgICAnNDgzYWRhNzcyNmEzYzQ2NTVkYTRmYmZjMGUxMTA4YThmZDE3YjQ0OGE2ODU1NDE5OWM0N2QwOGZmYjEwZDRiOCcsXG4gICAgcHJlLFxuICBdLFxufSk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc2ggPSByZXF1aXJlKCdoYXNoLmpzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG5mdW5jdGlvbiBIbWFjRFJCRyhvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBIbWFjRFJCRykpXG4gICAgcmV0dXJuIG5ldyBIbWFjRFJCRyhvcHRpb25zKTtcbiAgdGhpcy5oYXNoID0gb3B0aW9ucy5oYXNoO1xuICB0aGlzLnByZWRSZXNpc3QgPSAhIW9wdGlvbnMucHJlZFJlc2lzdDtcblxuICB0aGlzLm91dExlbiA9IHRoaXMuaGFzaC5vdXRTaXplO1xuICB0aGlzLm1pbkVudHJvcHkgPSBvcHRpb25zLm1pbkVudHJvcHkgfHwgdGhpcy5oYXNoLmhtYWNTdHJlbmd0aDtcblxuICB0aGlzLl9yZXNlZWQgPSBudWxsO1xuICB0aGlzLnJlc2VlZEludGVydmFsID0gbnVsbDtcbiAgdGhpcy5LID0gbnVsbDtcbiAgdGhpcy5WID0gbnVsbDtcblxuICB2YXIgZW50cm9weSA9IHV0aWxzLnRvQXJyYXkob3B0aW9ucy5lbnRyb3B5LCBvcHRpb25zLmVudHJvcHlFbmMgfHwgJ2hleCcpO1xuICB2YXIgbm9uY2UgPSB1dGlscy50b0FycmF5KG9wdGlvbnMubm9uY2UsIG9wdGlvbnMubm9uY2VFbmMgfHwgJ2hleCcpO1xuICB2YXIgcGVycyA9IHV0aWxzLnRvQXJyYXkob3B0aW9ucy5wZXJzLCBvcHRpb25zLnBlcnNFbmMgfHwgJ2hleCcpO1xuICBhc3NlcnQoZW50cm9weS5sZW5ndGggPj0gKHRoaXMubWluRW50cm9weSAvIDgpLFxuICAgICAgICAgJ05vdCBlbm91Z2ggZW50cm9weS4gTWluaW11bSBpczogJyArIHRoaXMubWluRW50cm9weSArICcgYml0cycpO1xuICB0aGlzLl9pbml0KGVudHJvcHksIG5vbmNlLCBwZXJzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gSG1hY0RSQkc7XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIGluaXQoZW50cm9weSwgbm9uY2UsIHBlcnMpIHtcbiAgdmFyIHNlZWQgPSBlbnRyb3B5LmNvbmNhdChub25jZSkuY29uY2F0KHBlcnMpO1xuXG4gIHRoaXMuSyA9IG5ldyBBcnJheSh0aGlzLm91dExlbiAvIDgpO1xuICB0aGlzLlYgPSBuZXcgQXJyYXkodGhpcy5vdXRMZW4gLyA4KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLlYubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLktbaV0gPSAweDAwO1xuICAgIHRoaXMuVltpXSA9IDB4MDE7XG4gIH1cblxuICB0aGlzLl91cGRhdGUoc2VlZCk7XG4gIHRoaXMuX3Jlc2VlZCA9IDE7XG4gIHRoaXMucmVzZWVkSW50ZXJ2YWwgPSAweDEwMDAwMDAwMDAwMDA7ICAvLyAyXjQ4XG59O1xuXG5IbWFjRFJCRy5wcm90b3R5cGUuX2htYWMgPSBmdW5jdGlvbiBobWFjKCkge1xuICByZXR1cm4gbmV3IGhhc2guaG1hYyh0aGlzLmhhc2gsIHRoaXMuSyk7XG59O1xuXG5IbWFjRFJCRy5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShzZWVkKSB7XG4gIHZhciBrbWFjID0gdGhpcy5faG1hYygpXG4gICAgICAgICAgICAgICAgIC51cGRhdGUodGhpcy5WKVxuICAgICAgICAgICAgICAgICAudXBkYXRlKFsgMHgwMCBdKTtcbiAgaWYgKHNlZWQpXG4gICAga21hYyA9IGttYWMudXBkYXRlKHNlZWQpO1xuICB0aGlzLksgPSBrbWFjLmRpZ2VzdCgpO1xuICB0aGlzLlYgPSB0aGlzLl9obWFjKCkudXBkYXRlKHRoaXMuVikuZGlnZXN0KCk7XG4gIGlmICghc2VlZClcbiAgICByZXR1cm47XG5cbiAgdGhpcy5LID0gdGhpcy5faG1hYygpXG4gICAgICAgICAgICAgICAudXBkYXRlKHRoaXMuVilcbiAgICAgICAgICAgICAgIC51cGRhdGUoWyAweDAxIF0pXG4gICAgICAgICAgICAgICAudXBkYXRlKHNlZWQpXG4gICAgICAgICAgICAgICAuZGlnZXN0KCk7XG4gIHRoaXMuViA9IHRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKTtcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5yZXNlZWQgPSBmdW5jdGlvbiByZXNlZWQoZW50cm9weSwgZW50cm9weUVuYywgYWRkLCBhZGRFbmMpIHtcbiAgLy8gT3B0aW9uYWwgZW50cm9weSBlbmNcbiAgaWYgKHR5cGVvZiBlbnRyb3B5RW5jICE9PSAnc3RyaW5nJykge1xuICAgIGFkZEVuYyA9IGFkZDtcbiAgICBhZGQgPSBlbnRyb3B5RW5jO1xuICAgIGVudHJvcHlFbmMgPSBudWxsO1xuICB9XG5cbiAgZW50cm9weSA9IHV0aWxzLnRvQXJyYXkoZW50cm9weSwgZW50cm9weUVuYyk7XG4gIGFkZCA9IHV0aWxzLnRvQXJyYXkoYWRkLCBhZGRFbmMpO1xuXG4gIGFzc2VydChlbnRyb3B5Lmxlbmd0aCA+PSAodGhpcy5taW5FbnRyb3B5IC8gOCksXG4gICAgICAgICAnTm90IGVub3VnaCBlbnRyb3B5LiBNaW5pbXVtIGlzOiAnICsgdGhpcy5taW5FbnRyb3B5ICsgJyBiaXRzJyk7XG5cbiAgdGhpcy5fdXBkYXRlKGVudHJvcHkuY29uY2F0KGFkZCB8fCBbXSkpO1xuICB0aGlzLl9yZXNlZWQgPSAxO1xufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLmdlbmVyYXRlID0gZnVuY3Rpb24gZ2VuZXJhdGUobGVuLCBlbmMsIGFkZCwgYWRkRW5jKSB7XG4gIGlmICh0aGlzLl9yZXNlZWQgPiB0aGlzLnJlc2VlZEludGVydmFsKVxuICAgIHRocm93IG5ldyBFcnJvcignUmVzZWVkIGlzIHJlcXVpcmVkJyk7XG5cbiAgLy8gT3B0aW9uYWwgZW5jb2RpbmdcbiAgaWYgKHR5cGVvZiBlbmMgIT09ICdzdHJpbmcnKSB7XG4gICAgYWRkRW5jID0gYWRkO1xuICAgIGFkZCA9IGVuYztcbiAgICBlbmMgPSBudWxsO1xuICB9XG5cbiAgLy8gT3B0aW9uYWwgYWRkaXRpb25hbCBkYXRhXG4gIGlmIChhZGQpIHtcbiAgICBhZGQgPSB1dGlscy50b0FycmF5KGFkZCwgYWRkRW5jIHx8ICdoZXgnKTtcbiAgICB0aGlzLl91cGRhdGUoYWRkKTtcbiAgfVxuXG4gIHZhciB0ZW1wID0gW107XG4gIHdoaWxlICh0ZW1wLmxlbmd0aCA8IGxlbikge1xuICAgIHRoaXMuViA9IHRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKTtcbiAgICB0ZW1wID0gdGVtcC5jb25jYXQodGhpcy5WKTtcbiAgfVxuXG4gIHZhciByZXMgPSB0ZW1wLnNsaWNlKDAsIGxlbik7XG4gIHRoaXMuX3VwZGF0ZShhZGQpO1xuICB0aGlzLl9yZXNlZWQrKztcbiAgcmV0dXJuIHV0aWxzLmVuY29kZShyZXMsIGVuYyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcblxuZnVuY3Rpb24gS2V5UGFpcihlYywgb3B0aW9ucykge1xuICB0aGlzLmVjID0gZWM7XG4gIHRoaXMucHJpdiA9IG51bGw7XG4gIHRoaXMucHViID0gbnVsbDtcblxuICAvLyBLZXlQYWlyKGVjLCB7IHByaXY6IC4uLiwgcHViOiAuLi4gfSlcbiAgaWYgKG9wdGlvbnMucHJpdilcbiAgICB0aGlzLl9pbXBvcnRQcml2YXRlKG9wdGlvbnMucHJpdiwgb3B0aW9ucy5wcml2RW5jKTtcbiAgaWYgKG9wdGlvbnMucHViKVxuICAgIHRoaXMuX2ltcG9ydFB1YmxpYyhvcHRpb25zLnB1Yiwgb3B0aW9ucy5wdWJFbmMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBLZXlQYWlyO1xuXG5LZXlQYWlyLmZyb21QdWJsaWMgPSBmdW5jdGlvbiBmcm9tUHVibGljKGVjLCBwdWIsIGVuYykge1xuICBpZiAocHViIGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gcHViO1xuXG4gIHJldHVybiBuZXcgS2V5UGFpcihlYywge1xuICAgIHB1YjogcHViLFxuICAgIHB1YkVuYzogZW5jLFxuICB9KTtcbn07XG5cbktleVBhaXIuZnJvbVByaXZhdGUgPSBmdW5jdGlvbiBmcm9tUHJpdmF0ZShlYywgcHJpdiwgZW5jKSB7XG4gIGlmIChwcml2IGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gcHJpdjtcblxuICByZXR1cm4gbmV3IEtleVBhaXIoZWMsIHtcbiAgICBwcml2OiBwcml2LFxuICAgIHByaXZFbmM6IGVuYyxcbiAgfSk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICB2YXIgcHViID0gdGhpcy5nZXRQdWJsaWMoKTtcblxuICBpZiAocHViLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCByZWFzb246ICdJbnZhbGlkIHB1YmxpYyBrZXknIH07XG4gIGlmICghcHViLnZhbGlkYXRlKCkpXG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgcmVhc29uOiAnUHVibGljIGtleSBpcyBub3QgYSBwb2ludCcgfTtcbiAgaWYgKCFwdWIubXVsKHRoaXMuZWMuY3VydmUubikuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIHJlYXNvbjogJ1B1YmxpYyBrZXkgKiBOICE9IE8nIH07XG5cbiAgcmV0dXJuIHsgcmVzdWx0OiB0cnVlLCByZWFzb246IG51bGwgfTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFB1YmxpYyA9IGZ1bmN0aW9uIGdldFB1YmxpYyhjb21wYWN0LCBlbmMpIHtcbiAgLy8gY29tcGFjdCBpcyBvcHRpb25hbCBhcmd1bWVudFxuICBpZiAodHlwZW9mIGNvbXBhY3QgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jID0gY29tcGFjdDtcbiAgICBjb21wYWN0ID0gbnVsbDtcbiAgfVxuXG4gIGlmICghdGhpcy5wdWIpXG4gICAgdGhpcy5wdWIgPSB0aGlzLmVjLmcubXVsKHRoaXMucHJpdik7XG5cbiAgaWYgKCFlbmMpXG4gICAgcmV0dXJuIHRoaXMucHViO1xuXG4gIHJldHVybiB0aGlzLnB1Yi5lbmNvZGUoZW5jLCBjb21wYWN0KTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFByaXZhdGUgPSBmdW5jdGlvbiBnZXRQcml2YXRlKGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdGhpcy5wcml2LnRvU3RyaW5nKDE2LCAyKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLnByaXY7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5faW1wb3J0UHJpdmF0ZSA9IGZ1bmN0aW9uIF9pbXBvcnRQcml2YXRlKGtleSwgZW5jKSB7XG4gIHRoaXMucHJpdiA9IG5ldyBCTihrZXksIGVuYyB8fCAxNik7XG5cbiAgLy8gRW5zdXJlIHRoYXQgdGhlIHByaXYgd29uJ3QgYmUgYmlnZ2VyIHRoYW4gbiwgb3RoZXJ3aXNlIHdlIG1heSBmYWlsXG4gIC8vIGluIGZpeGVkIG11bHRpcGxpY2F0aW9uIG1ldGhvZFxuICB0aGlzLnByaXYgPSB0aGlzLnByaXYudW1vZCh0aGlzLmVjLmN1cnZlLm4pO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuX2ltcG9ydFB1YmxpYyA9IGZ1bmN0aW9uIF9pbXBvcnRQdWJsaWMoa2V5LCBlbmMpIHtcbiAgaWYgKGtleS54IHx8IGtleS55KSB7XG4gICAgLy8gTW9udGdvbWVyeSBwb2ludHMgb25seSBoYXZlIGFuIGB4YCBjb29yZGluYXRlLlxuICAgIC8vIFdlaWVyc3RyYXNzL0Vkd2FyZHMgcG9pbnRzIG9uIHRoZSBvdGhlciBoYW5kIGhhdmUgYm90aCBgeGAgYW5kXG4gICAgLy8gYHlgIGNvb3JkaW5hdGVzLlxuICAgIGlmICh0aGlzLmVjLmN1cnZlLnR5cGUgPT09ICdtb250Jykge1xuICAgICAgYXNzZXJ0KGtleS54LCAnTmVlZCB4IGNvb3JkaW5hdGUnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZWMuY3VydmUudHlwZSA9PT0gJ3Nob3J0JyB8fFxuICAgICAgICAgICAgICAgdGhpcy5lYy5jdXJ2ZS50eXBlID09PSAnZWR3YXJkcycpIHtcbiAgICAgIGFzc2VydChrZXkueCAmJiBrZXkueSwgJ05lZWQgYm90aCB4IGFuZCB5IGNvb3JkaW5hdGUnKTtcbiAgICB9XG4gICAgdGhpcy5wdWIgPSB0aGlzLmVjLmN1cnZlLnBvaW50KGtleS54LCBrZXkueSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMucHViID0gdGhpcy5lYy5jdXJ2ZS5kZWNvZGVQb2ludChrZXksIGVuYyk7XG59O1xuXG4vLyBFQ0RIXG5LZXlQYWlyLnByb3RvdHlwZS5kZXJpdmUgPSBmdW5jdGlvbiBkZXJpdmUocHViKSB7XG4gIGlmKCFwdWIudmFsaWRhdGUoKSkge1xuICAgIGFzc2VydChwdWIudmFsaWRhdGUoKSwgJ3B1YmxpYyBwb2ludCBub3QgdmFsaWRhdGVkJyk7XG4gIH1cbiAgcmV0dXJuIHB1Yi5tdWwodGhpcy5wcml2KS5nZXRYKCk7XG59O1xuXG4vLyBFQ0RTQVxuS2V5UGFpci5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obXNnLCBlbmMsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRoaXMuZWMuc2lnbihtc2csIHRoaXMsIGVuYywgb3B0aW9ucyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkobXNnLCBzaWduYXR1cmUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRoaXMuZWMudmVyaWZ5KG1zZywgc2lnbmF0dXJlLCB0aGlzLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gIHJldHVybiAnPEtleSBwcml2OiAnICsgKHRoaXMucHJpdiAmJiB0aGlzLnByaXYudG9TdHJpbmcoMTYsIDIpKSArXG4gICAgICAgICAnIHB1YjogJyArICh0aGlzLnB1YiAmJiB0aGlzLnB1Yi5pbnNwZWN0KCkpICsgJyA+Jztcbn07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbmZ1bmN0aW9uIFNpZ25hdHVyZShvcHRpb25zLCBlbmMpIHtcbiAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBTaWduYXR1cmUpXG4gICAgcmV0dXJuIG9wdGlvbnM7XG5cbiAgaWYgKHRoaXMuX2ltcG9ydERFUihvcHRpb25zLCBlbmMpKVxuICAgIHJldHVybjtcblxuICBhc3NlcnQob3B0aW9ucy5yICYmIG9wdGlvbnMucywgJ1NpZ25hdHVyZSB3aXRob3V0IHIgb3IgcycpO1xuICB0aGlzLnIgPSBuZXcgQk4ob3B0aW9ucy5yLCAxNik7XG4gIHRoaXMucyA9IG5ldyBCTihvcHRpb25zLnMsIDE2KTtcbiAgaWYgKG9wdGlvbnMucmVjb3ZlcnlQYXJhbSA9PT0gdW5kZWZpbmVkKVxuICAgIHRoaXMucmVjb3ZlcnlQYXJhbSA9IG51bGw7XG4gIGVsc2VcbiAgICB0aGlzLnJlY292ZXJ5UGFyYW0gPSBvcHRpb25zLnJlY292ZXJ5UGFyYW07XG59XG5tb2R1bGUuZXhwb3J0cyA9IFNpZ25hdHVyZTtcblxuZnVuY3Rpb24gUG9zaXRpb24oKSB7XG4gIHRoaXMucGxhY2UgPSAwO1xufVxuXG5mdW5jdGlvbiBnZXRMZW5ndGgoYnVmLCBwKSB7XG4gIHZhciBpbml0aWFsID0gYnVmW3AucGxhY2UrK107XG4gIGlmICghKGluaXRpYWwgJiAweDgwKSkge1xuICAgIHJldHVybiBpbml0aWFsO1xuICB9XG4gIHZhciBvY3RldExlbiA9IGluaXRpYWwgJiAweGY7XG5cbiAgLy8gSW5kZWZpbml0ZSBsZW5ndGggb3Igb3ZlcmZsb3dcbiAgaWYgKG9jdGV0TGVuID09PSAwIHx8IG9jdGV0TGVuID4gNCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmKGJ1ZltwLnBsYWNlXSA9PT0gMHgwMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB2YWwgPSAwO1xuICBmb3IgKHZhciBpID0gMCwgb2ZmID0gcC5wbGFjZTsgaSA8IG9jdGV0TGVuOyBpKyssIG9mZisrKSB7XG4gICAgdmFsIDw8PSA4O1xuICAgIHZhbCB8PSBidWZbb2ZmXTtcbiAgICB2YWwgPj4+PSAwO1xuICB9XG5cbiAgLy8gTGVhZGluZyB6ZXJvZXNcbiAgaWYgKHZhbCA8PSAweDdmKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcC5wbGFjZSA9IG9mZjtcbiAgcmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gcm1QYWRkaW5nKGJ1Zikge1xuICB2YXIgaSA9IDA7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoIC0gMTtcbiAgd2hpbGUgKCFidWZbaV0gJiYgIShidWZbaSArIDFdICYgMHg4MCkgJiYgaSA8IGxlbikge1xuICAgIGkrKztcbiAgfVxuICBpZiAoaSA9PT0gMCkge1xuICAgIHJldHVybiBidWY7XG4gIH1cbiAgcmV0dXJuIGJ1Zi5zbGljZShpKTtcbn1cblxuU2lnbmF0dXJlLnByb3RvdHlwZS5faW1wb3J0REVSID0gZnVuY3Rpb24gX2ltcG9ydERFUihkYXRhLCBlbmMpIHtcbiAgZGF0YSA9IHV0aWxzLnRvQXJyYXkoZGF0YSwgZW5jKTtcbiAgdmFyIHAgPSBuZXcgUG9zaXRpb24oKTtcbiAgaWYgKGRhdGFbcC5wbGFjZSsrXSAhPT0gMHgzMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGVuID0gZ2V0TGVuZ3RoKGRhdGEsIHApO1xuICBpZiAobGVuID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoKGxlbiArIHAucGxhY2UpICE9PSBkYXRhLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZGF0YVtwLnBsYWNlKytdICE9PSAweDAyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBybGVuID0gZ2V0TGVuZ3RoKGRhdGEsIHApO1xuICBpZiAocmxlbiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKChkYXRhW3AucGxhY2VdICYgMTI4KSAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgciA9IGRhdGEuc2xpY2UocC5wbGFjZSwgcmxlbiArIHAucGxhY2UpO1xuICBwLnBsYWNlICs9IHJsZW47XG4gIGlmIChkYXRhW3AucGxhY2UrK10gIT09IDB4MDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHNsZW4gPSBnZXRMZW5ndGgoZGF0YSwgcCk7XG4gIGlmIChzbGVuID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZGF0YS5sZW5ndGggIT09IHNsZW4gKyBwLnBsYWNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICgoZGF0YVtwLnBsYWNlXSAmIDEyOCkgIT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHMgPSBkYXRhLnNsaWNlKHAucGxhY2UsIHNsZW4gKyBwLnBsYWNlKTtcbiAgaWYgKHJbMF0gPT09IDApIHtcbiAgICBpZiAoclsxXSAmIDB4ODApIHtcbiAgICAgIHIgPSByLnNsaWNlKDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMZWFkaW5nIHplcm9lc1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoc1swXSA9PT0gMCkge1xuICAgIGlmIChzWzFdICYgMHg4MCkge1xuICAgICAgcyA9IHMuc2xpY2UoMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExlYWRpbmcgemVyb2VzXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5yID0gbmV3IEJOKHIpO1xuICB0aGlzLnMgPSBuZXcgQk4ocyk7XG4gIHRoaXMucmVjb3ZlcnlQYXJhbSA9IG51bGw7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBjb25zdHJ1Y3RMZW5ndGgoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA8IDB4ODApIHtcbiAgICBhcnIucHVzaChsZW4pO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgb2N0ZXRzID0gMSArIChNYXRoLmxvZyhsZW4pIC8gTWF0aC5MTjIgPj4+IDMpO1xuICBhcnIucHVzaChvY3RldHMgfCAweDgwKTtcbiAgd2hpbGUgKC0tb2N0ZXRzKSB7XG4gICAgYXJyLnB1c2goKGxlbiA+Pj4gKG9jdGV0cyA8PCAzKSkgJiAweGZmKTtcbiAgfVxuICBhcnIucHVzaChsZW4pO1xufVxuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvREVSID0gZnVuY3Rpb24gdG9ERVIoZW5jKSB7XG4gIHZhciByID0gdGhpcy5yLnRvQXJyYXkoKTtcbiAgdmFyIHMgPSB0aGlzLnMudG9BcnJheSgpO1xuXG4gIC8vIFBhZCB2YWx1ZXNcbiAgaWYgKHJbMF0gJiAweDgwKVxuICAgIHIgPSBbIDAgXS5jb25jYXQocik7XG4gIC8vIFBhZCB2YWx1ZXNcbiAgaWYgKHNbMF0gJiAweDgwKVxuICAgIHMgPSBbIDAgXS5jb25jYXQocyk7XG5cbiAgciA9IHJtUGFkZGluZyhyKTtcbiAgcyA9IHJtUGFkZGluZyhzKTtcblxuICB3aGlsZSAoIXNbMF0gJiYgIShzWzFdICYgMHg4MCkpIHtcbiAgICBzID0gcy5zbGljZSgxKTtcbiAgfVxuICB2YXIgYXJyID0gWyAweDAyIF07XG4gIGNvbnN0cnVjdExlbmd0aChhcnIsIHIubGVuZ3RoKTtcbiAgYXJyID0gYXJyLmNvbmNhdChyKTtcbiAgYXJyLnB1c2goMHgwMik7XG4gIGNvbnN0cnVjdExlbmd0aChhcnIsIHMubGVuZ3RoKTtcbiAgdmFyIGJhY2tIYWxmID0gYXJyLmNvbmNhdChzKTtcbiAgdmFyIHJlcyA9IFsgMHgzMCBdO1xuICBjb25zdHJ1Y3RMZW5ndGgocmVzLCBiYWNrSGFsZi5sZW5ndGgpO1xuICByZXMgPSByZXMuY29uY2F0KGJhY2tIYWxmKTtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZShyZXMsIGVuYyk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2JuLmpzJyk7XG52YXIgSG1hY0RSQkcgPSByZXF1aXJlKCdobWFjLWRyYmcnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgY3VydmVzID0gcmVxdWlyZSgnLi4vY3VydmVzJyk7XG52YXIgcmFuZCA9IHJlcXVpcmUoJ2Jyb3JhbmQnKTtcbnZhciBhc3NlcnQgPSB1dGlscy5hc3NlcnQ7XG5cbnZhciBLZXlQYWlyID0gcmVxdWlyZSgnLi9rZXknKTtcbnZhciBTaWduYXR1cmUgPSByZXF1aXJlKCcuL3NpZ25hdHVyZScpO1xuXG5mdW5jdGlvbiBFQyhvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBFQykpXG4gICAgcmV0dXJuIG5ldyBFQyhvcHRpb25zKTtcblxuICAvLyBTaG9ydGN1dCBgZWxsaXB0aWMuZWMoY3VydmUtbmFtZSlgXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICBhc3NlcnQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnZlcywgb3B0aW9ucyksXG4gICAgICAnVW5rbm93biBjdXJ2ZSAnICsgb3B0aW9ucyk7XG5cbiAgICBvcHRpb25zID0gY3VydmVzW29wdGlvbnNdO1xuICB9XG5cbiAgLy8gU2hvcnRjdXQgZm9yIGBlbGxpcHRpYy5lYyhlbGxpcHRpYy5jdXJ2ZXMuY3VydmVOYW1lKWBcbiAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBjdXJ2ZXMuUHJlc2V0Q3VydmUpXG4gICAgb3B0aW9ucyA9IHsgY3VydmU6IG9wdGlvbnMgfTtcblxuICB0aGlzLmN1cnZlID0gb3B0aW9ucy5jdXJ2ZS5jdXJ2ZTtcbiAgdGhpcy5uID0gdGhpcy5jdXJ2ZS5uO1xuICB0aGlzLm5oID0gdGhpcy5uLnVzaHJuKDEpO1xuICB0aGlzLmcgPSB0aGlzLmN1cnZlLmc7XG5cbiAgLy8gUG9pbnQgb24gY3VydmVcbiAgdGhpcy5nID0gb3B0aW9ucy5jdXJ2ZS5nO1xuICB0aGlzLmcucHJlY29tcHV0ZShvcHRpb25zLmN1cnZlLm4uYml0TGVuZ3RoKCkgKyAxKTtcblxuICAvLyBIYXNoIGZvciBmdW5jdGlvbiBmb3IgRFJCR1xuICB0aGlzLmhhc2ggPSBvcHRpb25zLmhhc2ggfHwgb3B0aW9ucy5jdXJ2ZS5oYXNoO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFQztcblxuRUMucHJvdG90eXBlLmtleVBhaXIgPSBmdW5jdGlvbiBrZXlQYWlyKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBLZXlQYWlyKHRoaXMsIG9wdGlvbnMpO1xufTtcblxuRUMucHJvdG90eXBlLmtleUZyb21Qcml2YXRlID0gZnVuY3Rpb24ga2V5RnJvbVByaXZhdGUocHJpdiwgZW5jKSB7XG4gIHJldHVybiBLZXlQYWlyLmZyb21Qcml2YXRlKHRoaXMsIHByaXYsIGVuYyk7XG59O1xuXG5FQy5wcm90b3R5cGUua2V5RnJvbVB1YmxpYyA9IGZ1bmN0aW9uIGtleUZyb21QdWJsaWMocHViLCBlbmMpIHtcbiAgcmV0dXJuIEtleVBhaXIuZnJvbVB1YmxpYyh0aGlzLCBwdWIsIGVuYyk7XG59O1xuXG5FQy5wcm90b3R5cGUuZ2VuS2V5UGFpciA9IGZ1bmN0aW9uIGdlbktleVBhaXIob3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpXG4gICAgb3B0aW9ucyA9IHt9O1xuXG4gIC8vIEluc3RhbnRpYXRlIEhtYWNfRFJCR1xuICB2YXIgZHJiZyA9IG5ldyBIbWFjRFJCRyh7XG4gICAgaGFzaDogdGhpcy5oYXNoLFxuICAgIHBlcnM6IG9wdGlvbnMucGVycyxcbiAgICBwZXJzRW5jOiBvcHRpb25zLnBlcnNFbmMgfHwgJ3V0ZjgnLFxuICAgIGVudHJvcHk6IG9wdGlvbnMuZW50cm9weSB8fCByYW5kKHRoaXMuaGFzaC5obWFjU3RyZW5ndGgpLFxuICAgIGVudHJvcHlFbmM6IG9wdGlvbnMuZW50cm9weSAmJiBvcHRpb25zLmVudHJvcHlFbmMgfHwgJ3V0ZjgnLFxuICAgIG5vbmNlOiB0aGlzLm4udG9BcnJheSgpLFxuICB9KTtcblxuICB2YXIgYnl0ZXMgPSB0aGlzLm4uYnl0ZUxlbmd0aCgpO1xuICB2YXIgbnMyID0gdGhpcy5uLnN1YihuZXcgQk4oMikpO1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIHByaXYgPSBuZXcgQk4oZHJiZy5nZW5lcmF0ZShieXRlcykpO1xuICAgIGlmIChwcml2LmNtcChuczIpID4gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgcHJpdi5pYWRkbigxKTtcbiAgICByZXR1cm4gdGhpcy5rZXlGcm9tUHJpdmF0ZShwcml2KTtcbiAgfVxufTtcblxuRUMucHJvdG90eXBlLl90cnVuY2F0ZVRvTiA9IGZ1bmN0aW9uIF90cnVuY2F0ZVRvTihtc2csIHRydW5jT25seSwgYml0TGVuZ3RoKSB7XG4gIHZhciBieXRlTGVuZ3RoO1xuICBpZiAoQk4uaXNCTihtc2cpIHx8IHR5cGVvZiBtc2cgPT09ICdudW1iZXInKSB7XG4gICAgbXNnID0gbmV3IEJOKG1zZywgMTYpO1xuICAgIGJ5dGVMZW5ndGggPSBtc2cuYnl0ZUxlbmd0aCgpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtc2cgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gQk4gYXNzdW1lcyBhbiBhcnJheS1saWtlIGlucHV0IGFuZCBhc3NlcnRzIGxlbmd0aFxuICAgIGJ5dGVMZW5ndGggPSBtc2cubGVuZ3RoO1xuICAgIG1zZyA9IG5ldyBCTihtc2csIDE2KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBCTiBjb252ZXJ0cyB0aGUgdmFsdWUgdG8gc3RyaW5nXG4gICAgdmFyIHN0ciA9IG1zZy50b1N0cmluZygpO1xuICAgIC8vIEhFWCBlbmNvZGluZ1xuICAgIGJ5dGVMZW5ndGggPSAoc3RyLmxlbmd0aCArIDEpID4+PiAxO1xuICAgIG1zZyA9IG5ldyBCTihzdHIsIDE2KTtcbiAgfVxuICAvLyBBbGxvdyBvdmVycmlkaW5nXG4gIGlmICh0eXBlb2YgYml0TGVuZ3RoICE9PSAnbnVtYmVyJykge1xuICAgIGJpdExlbmd0aCA9IGJ5dGVMZW5ndGggKiA4O1xuICB9XG4gIHZhciBkZWx0YSA9IGJpdExlbmd0aCAtIHRoaXMubi5iaXRMZW5ndGgoKTtcbiAgaWYgKGRlbHRhID4gMClcbiAgICBtc2cgPSBtc2cudXNocm4oZGVsdGEpO1xuICBpZiAoIXRydW5jT25seSAmJiBtc2cuY21wKHRoaXMubikgPj0gMClcbiAgICByZXR1cm4gbXNnLnN1Yih0aGlzLm4pO1xuICBlbHNlXG4gICAgcmV0dXJuIG1zZztcbn07XG5cbkVDLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gc2lnbihtc2csIGtleSwgZW5jLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZW5jID09PSAnb2JqZWN0Jykge1xuICAgIG9wdGlvbnMgPSBlbmM7XG4gICAgZW5jID0gbnVsbDtcbiAgfVxuICBpZiAoIW9wdGlvbnMpXG4gICAgb3B0aW9ucyA9IHt9O1xuXG4gIGlmICh0eXBlb2YgbXNnICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgbXNnICE9PSAnbnVtYmVyJyAmJiAhQk4uaXNCTihtc2cpKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBtc2cgPT09ICdvYmplY3QnICYmIG1zZyAmJiB0eXBlb2YgbXNnLmxlbmd0aCA9PT0gJ251bWJlcicsXG4gICAgICAnRXhwZWN0ZWQgbWVzc2FnZSB0byBiZSBhbiBhcnJheS1saWtlLCBhIGhleCBzdHJpbmcsIG9yIGEgQk4gaW5zdGFuY2UnKTtcbiAgICBhc3NlcnQoKG1zZy5sZW5ndGggPj4+IDApID09PSBtc2cubGVuZ3RoKTsgLy8gbm9uLW5lZ2F0aXZlIDMyLWJpdCBpbnRlZ2VyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIGFzc2VydCgobXNnW2ldICYgMjU1KSA9PT0gbXNnW2ldKTtcbiAgfVxuXG4gIGtleSA9IHRoaXMua2V5RnJvbVByaXZhdGUoa2V5LCBlbmMpO1xuICBtc2cgPSB0aGlzLl90cnVuY2F0ZVRvTihtc2csIGZhbHNlLCBvcHRpb25zLm1zZ0JpdExlbmd0aCk7XG5cbiAgLy8gV291bGQgZmFpbCBmdXJ0aGVyIGNoZWNrcywgYnV0IGxldCdzIG1ha2UgdGhlIGVycm9yIG1lc3NhZ2UgY2xlYXJcbiAgYXNzZXJ0KCFtc2cuaXNOZWcoKSwgJ0NhbiBub3Qgc2lnbiBhIG5lZ2F0aXZlIG1lc3NhZ2UnKTtcblxuICAvLyBaZXJvLWV4dGVuZCBrZXkgdG8gcHJvdmlkZSBlbm91Z2ggZW50cm9weVxuICB2YXIgYnl0ZXMgPSB0aGlzLm4uYnl0ZUxlbmd0aCgpO1xuICB2YXIgYmtleSA9IGtleS5nZXRQcml2YXRlKCkudG9BcnJheSgnYmUnLCBieXRlcyk7XG5cbiAgLy8gWmVyby1leHRlbmQgbm9uY2UgdG8gaGF2ZSB0aGUgc2FtZSBieXRlIHNpemUgYXMgTlxuICB2YXIgbm9uY2UgPSBtc2cudG9BcnJheSgnYmUnLCBieXRlcyk7XG5cbiAgLy8gUmVjaGVjayBub25jZSB0byBiZSBiaWplY3RpdmUgdG8gbXNnXG4gIGFzc2VydCgobmV3IEJOKG5vbmNlKSkuZXEobXNnKSwgJ0NhbiBub3Qgc2lnbiBtZXNzYWdlJyk7XG5cbiAgLy8gSW5zdGFudGlhdGUgSG1hY19EUkJHXG4gIHZhciBkcmJnID0gbmV3IEhtYWNEUkJHKHtcbiAgICBoYXNoOiB0aGlzLmhhc2gsXG4gICAgZW50cm9weTogYmtleSxcbiAgICBub25jZTogbm9uY2UsXG4gICAgcGVyczogb3B0aW9ucy5wZXJzLFxuICAgIHBlcnNFbmM6IG9wdGlvbnMucGVyc0VuYyB8fCAndXRmOCcsXG4gIH0pO1xuXG4gIC8vIE51bWJlciBvZiBieXRlcyB0byBnZW5lcmF0ZVxuICB2YXIgbnMxID0gdGhpcy5uLnN1YihuZXcgQk4oMSkpO1xuXG4gIGZvciAodmFyIGl0ZXIgPSAwOyA7IGl0ZXIrKykge1xuICAgIHZhciBrID0gb3B0aW9ucy5rID9cbiAgICAgIG9wdGlvbnMuayhpdGVyKSA6XG4gICAgICBuZXcgQk4oZHJiZy5nZW5lcmF0ZSh0aGlzLm4uYnl0ZUxlbmd0aCgpKSk7XG4gICAgayA9IHRoaXMuX3RydW5jYXRlVG9OKGssIHRydWUpO1xuICAgIGlmIChrLmNtcG4oMSkgPD0gMCB8fCBrLmNtcChuczEpID49IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBrcCA9IHRoaXMuZy5tdWwoayk7XG4gICAgaWYgKGtwLmlzSW5maW5pdHkoKSlcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgdmFyIGtwWCA9IGtwLmdldFgoKTtcbiAgICB2YXIgciA9IGtwWC51bW9kKHRoaXMubik7XG4gICAgaWYgKHIuY21wbigwKSA9PT0gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgdmFyIHMgPSBrLmludm0odGhpcy5uKS5tdWwoci5tdWwoa2V5LmdldFByaXZhdGUoKSkuaWFkZChtc2cpKTtcbiAgICBzID0gcy51bW9kKHRoaXMubik7XG4gICAgaWYgKHMuY21wbigwKSA9PT0gMClcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgdmFyIHJlY292ZXJ5UGFyYW0gPSAoa3AuZ2V0WSgpLmlzT2RkKCkgPyAxIDogMCkgfFxuICAgICAgICAgICAgICAgICAgICAgICAgKGtwWC5jbXAocikgIT09IDAgPyAyIDogMCk7XG5cbiAgICAvLyBVc2UgY29tcGxlbWVudCBvZiBgc2AsIGlmIGl0IGlzID4gYG4gLyAyYFxuICAgIGlmIChvcHRpb25zLmNhbm9uaWNhbCAmJiBzLmNtcCh0aGlzLm5oKSA+IDApIHtcbiAgICAgIHMgPSB0aGlzLm4uc3ViKHMpO1xuICAgICAgcmVjb3ZlcnlQYXJhbSBePSAxO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKHsgcjogciwgczogcywgcmVjb3ZlcnlQYXJhbTogcmVjb3ZlcnlQYXJhbSB9KTtcbiAgfVxufTtcblxuRUMucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtc2csIHNpZ25hdHVyZSwga2V5LCBlbmMsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKVxuICAgIG9wdGlvbnMgPSB7fTtcblxuICBtc2cgPSB0aGlzLl90cnVuY2F0ZVRvTihtc2csIGZhbHNlLCBvcHRpb25zLm1zZ0JpdExlbmd0aCk7XG4gIGtleSA9IHRoaXMua2V5RnJvbVB1YmxpYyhrZXksIGVuYyk7XG4gIHNpZ25hdHVyZSA9IG5ldyBTaWduYXR1cmUoc2lnbmF0dXJlLCAnaGV4Jyk7XG5cbiAgLy8gUGVyZm9ybSBwcmltaXRpdmUgdmFsdWVzIHZhbGlkYXRpb25cbiAgdmFyIHIgPSBzaWduYXR1cmUucjtcbiAgdmFyIHMgPSBzaWduYXR1cmUucztcbiAgaWYgKHIuY21wbigxKSA8IDAgfHwgci5jbXAodGhpcy5uKSA+PSAwKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKHMuY21wbigxKSA8IDAgfHwgcy5jbXAodGhpcy5uKSA+PSAwKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBWYWxpZGF0ZSBzaWduYXR1cmVcbiAgdmFyIHNpbnYgPSBzLmludm0odGhpcy5uKTtcbiAgdmFyIHUxID0gc2ludi5tdWwobXNnKS51bW9kKHRoaXMubik7XG4gIHZhciB1MiA9IHNpbnYubXVsKHIpLnVtb2QodGhpcy5uKTtcbiAgdmFyIHA7XG5cbiAgaWYgKCF0aGlzLmN1cnZlLl9tYXh3ZWxsVHJpY2spIHtcbiAgICBwID0gdGhpcy5nLm11bEFkZCh1MSwga2V5LmdldFB1YmxpYygpLCB1Mik7XG4gICAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIHAuZ2V0WCgpLnVtb2QodGhpcy5uKS5jbXAocikgPT09IDA7XG4gIH1cblxuICAvLyBOT1RFOiBHcmVnIE1heHdlbGwncyB0cmljaywgaW5zcGlyZWQgYnk6XG4gIC8vIGh0dHBzOi8vZ2l0LmlvL3ZhZDNLXG5cbiAgcCA9IHRoaXMuZy5qbXVsQWRkKHUxLCBrZXkuZ2V0UHVibGljKCksIHUyKTtcbiAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBDb21wYXJlIGBwLnhgIG9mIEphY29iaWFuIHBvaW50IHdpdGggYHJgLFxuICAvLyB0aGlzIHdpbGwgZG8gYHAueCA9PSByICogcC56XjJgIGluc3RlYWQgb2YgbXVsdGlwbHlpbmcgYHAueGAgYnkgdGhlXG4gIC8vIGludmVyc2Ugb2YgYHAuel4yYFxuICByZXR1cm4gcC5lcVhUb1Aocik7XG59O1xuXG5FQy5wcm90b3R5cGUucmVjb3ZlclB1YktleSA9IGZ1bmN0aW9uKG1zZywgc2lnbmF0dXJlLCBqLCBlbmMpIHtcbiAgYXNzZXJ0KCgzICYgaikgPT09IGosICdUaGUgcmVjb3ZlcnkgcGFyYW0gaXMgbW9yZSB0aGFuIHR3byBiaXRzJyk7XG4gIHNpZ25hdHVyZSA9IG5ldyBTaWduYXR1cmUoc2lnbmF0dXJlLCBlbmMpO1xuXG4gIHZhciBuID0gdGhpcy5uO1xuICB2YXIgZSA9IG5ldyBCTihtc2cpO1xuICB2YXIgciA9IHNpZ25hdHVyZS5yO1xuICB2YXIgcyA9IHNpZ25hdHVyZS5zO1xuXG4gIC8vIEEgc2V0IExTQiBzaWduaWZpZXMgdGhhdCB0aGUgeS1jb29yZGluYXRlIGlzIG9kZFxuICB2YXIgaXNZT2RkID0gaiAmIDE7XG4gIHZhciBpc1NlY29uZEtleSA9IGogPj4gMTtcbiAgaWYgKHIuY21wKHRoaXMuY3VydmUucC51bW9kKHRoaXMuY3VydmUubikpID49IDAgJiYgaXNTZWNvbmRLZXkpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBzZW5jb25kIGtleSBjYW5kaW5hdGUnKTtcblxuICAvLyAxLjEuIExldCB4ID0gciArIGpuLlxuICBpZiAoaXNTZWNvbmRLZXkpXG4gICAgciA9IHRoaXMuY3VydmUucG9pbnRGcm9tWChyLmFkZCh0aGlzLmN1cnZlLm4pLCBpc1lPZGQpO1xuICBlbHNlXG4gICAgciA9IHRoaXMuY3VydmUucG9pbnRGcm9tWChyLCBpc1lPZGQpO1xuXG4gIHZhciBySW52ID0gc2lnbmF0dXJlLnIuaW52bShuKTtcbiAgdmFyIHMxID0gbi5zdWIoZSkubXVsKHJJbnYpLnVtb2Qobik7XG4gIHZhciBzMiA9IHMubXVsKHJJbnYpLnVtb2Qobik7XG5cbiAgLy8gMS42LjEgQ29tcHV0ZSBRID0gcl4tMSAoc1IgLSAgZUcpXG4gIC8vICAgICAgICAgICAgICAgUSA9IHJeLTEgKHNSICsgLWVHKVxuICByZXR1cm4gdGhpcy5nLm11bEFkZChzMSwgciwgczIpO1xufTtcblxuRUMucHJvdG90eXBlLmdldEtleVJlY292ZXJ5UGFyYW0gPSBmdW5jdGlvbihlLCBzaWduYXR1cmUsIFEsIGVuYykge1xuICBzaWduYXR1cmUgPSBuZXcgU2lnbmF0dXJlKHNpZ25hdHVyZSwgZW5jKTtcbiAgaWYgKHNpZ25hdHVyZS5yZWNvdmVyeVBhcmFtICE9PSBudWxsKVxuICAgIHJldHVybiBzaWduYXR1cmUucmVjb3ZlcnlQYXJhbTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgIHZhciBRcHJpbWU7XG4gICAgdHJ5IHtcbiAgICAgIFFwcmltZSA9IHRoaXMucmVjb3ZlclB1YktleShlLCBzaWduYXR1cmUsIGkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChRcHJpbWUuZXEoUSkpXG4gICAgICByZXR1cm4gaTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIHZhbGlkIHJlY292ZXJ5IGZhY3RvcicpO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcbnZhciBwYXJzZUJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcztcbnZhciBjYWNoZWRQcm9wZXJ0eSA9IHV0aWxzLmNhY2hlZFByb3BlcnR5O1xuXG4vKipcbiogQHBhcmFtIHtFRERTQX0gZWRkc2EgLSBpbnN0YW5jZVxuKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcHVibGljL3ByaXZhdGUga2V5IHBhcmFtZXRlcnNcbipcbiogQHBhcmFtIHtBcnJheTxCeXRlPn0gW3BhcmFtcy5zZWNyZXRdIC0gc2VjcmV0IHNlZWQgYnl0ZXNcbiogQHBhcmFtIHtQb2ludH0gW3BhcmFtcy5wdWJdIC0gcHVibGljIGtleSBwb2ludCAoYWthIGBBYCBpbiBlZGRzYSB0ZXJtcylcbiogQHBhcmFtIHtBcnJheTxCeXRlPn0gW3BhcmFtcy5wdWJdIC0gcHVibGljIGtleSBwb2ludCBlbmNvZGVkIGFzIGJ5dGVzXG4qXG4qL1xuZnVuY3Rpb24gS2V5UGFpcihlZGRzYSwgcGFyYW1zKSB7XG4gIHRoaXMuZWRkc2EgPSBlZGRzYTtcbiAgdGhpcy5fc2VjcmV0ID0gcGFyc2VCeXRlcyhwYXJhbXMuc2VjcmV0KTtcbiAgaWYgKGVkZHNhLmlzUG9pbnQocGFyYW1zLnB1YikpXG4gICAgdGhpcy5fcHViID0gcGFyYW1zLnB1YjtcbiAgZWxzZVxuICAgIHRoaXMuX3B1YkJ5dGVzID0gcGFyc2VCeXRlcyhwYXJhbXMucHViKTtcbn1cblxuS2V5UGFpci5mcm9tUHVibGljID0gZnVuY3Rpb24gZnJvbVB1YmxpYyhlZGRzYSwgcHViKSB7XG4gIGlmIChwdWIgaW5zdGFuY2VvZiBLZXlQYWlyKVxuICAgIHJldHVybiBwdWI7XG4gIHJldHVybiBuZXcgS2V5UGFpcihlZGRzYSwgeyBwdWI6IHB1YiB9KTtcbn07XG5cbktleVBhaXIuZnJvbVNlY3JldCA9IGZ1bmN0aW9uIGZyb21TZWNyZXQoZWRkc2EsIHNlY3JldCkge1xuICBpZiAoc2VjcmV0IGluc3RhbmNlb2YgS2V5UGFpcilcbiAgICByZXR1cm4gc2VjcmV0O1xuICByZXR1cm4gbmV3IEtleVBhaXIoZWRkc2EsIHsgc2VjcmV0OiBzZWNyZXQgfSk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5zZWNyZXQgPSBmdW5jdGlvbiBzZWNyZXQoKSB7XG4gIHJldHVybiB0aGlzLl9zZWNyZXQ7XG59O1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAncHViQnl0ZXMnLCBmdW5jdGlvbiBwdWJCeXRlcygpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZW5jb2RlUG9pbnQodGhpcy5wdWIoKSk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ3B1YicsIGZ1bmN0aW9uIHB1YigpIHtcbiAgaWYgKHRoaXMuX3B1YkJ5dGVzKVxuICAgIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZVBvaW50KHRoaXMuX3B1YkJ5dGVzKTtcbiAgcmV0dXJuIHRoaXMuZWRkc2EuZy5tdWwodGhpcy5wcml2KCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KEtleVBhaXIsICdwcml2Qnl0ZXMnLCBmdW5jdGlvbiBwcml2Qnl0ZXMoKSB7XG4gIHZhciBlZGRzYSA9IHRoaXMuZWRkc2E7XG4gIHZhciBoYXNoID0gdGhpcy5oYXNoKCk7XG4gIHZhciBsYXN0SXggPSBlZGRzYS5lbmNvZGluZ0xlbmd0aCAtIDE7XG5cbiAgdmFyIGEgPSBoYXNoLnNsaWNlKDAsIGVkZHNhLmVuY29kaW5nTGVuZ3RoKTtcbiAgYVswXSAmPSAyNDg7XG4gIGFbbGFzdEl4XSAmPSAxMjc7XG4gIGFbbGFzdEl4XSB8PSA2NDtcblxuICByZXR1cm4gYTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAncHJpdicsIGZ1bmN0aW9uIHByaXYoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZUludCh0aGlzLnByaXZCeXRlcygpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCAnaGFzaCcsIGZ1bmN0aW9uIGhhc2goKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmhhc2goKS51cGRhdGUodGhpcy5zZWNyZXQoKSkuZGlnZXN0KCk7XG59KTtcblxuY2FjaGVkUHJvcGVydHkoS2V5UGFpciwgJ21lc3NhZ2VQcmVmaXgnLCBmdW5jdGlvbiBtZXNzYWdlUHJlZml4KCkge1xuICByZXR1cm4gdGhpcy5oYXNoKCkuc2xpY2UodGhpcy5lZGRzYS5lbmNvZGluZ0xlbmd0aCk7XG59KTtcblxuS2V5UGFpci5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obWVzc2FnZSkge1xuICBhc3NlcnQodGhpcy5fc2VjcmV0LCAnS2V5UGFpciBjYW4gb25seSB2ZXJpZnknKTtcbiAgcmV0dXJuIHRoaXMuZWRkc2Euc2lnbihtZXNzYWdlLCB0aGlzKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtZXNzYWdlLCBzaWcpIHtcbiAgcmV0dXJuIHRoaXMuZWRkc2EudmVyaWZ5KG1lc3NhZ2UsIHNpZywgdGhpcyk7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5nZXRTZWNyZXQgPSBmdW5jdGlvbiBnZXRTZWNyZXQoZW5jKSB7XG4gIGFzc2VydCh0aGlzLl9zZWNyZXQsICdLZXlQYWlyIGlzIHB1YmxpYyBvbmx5Jyk7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy5zZWNyZXQoKSwgZW5jKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLmdldFB1YmxpYyA9IGZ1bmN0aW9uIGdldFB1YmxpYyhlbmMpIHtcbiAgcmV0dXJuIHV0aWxzLmVuY29kZSh0aGlzLnB1YkJ5dGVzKCksIGVuYyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEtleVBhaXI7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEJOID0gcmVxdWlyZSgnYm4uanMnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gdXRpbHMuYXNzZXJ0O1xudmFyIGNhY2hlZFByb3BlcnR5ID0gdXRpbHMuY2FjaGVkUHJvcGVydHk7XG52YXIgcGFyc2VCeXRlcyA9IHV0aWxzLnBhcnNlQnl0ZXM7XG5cbi8qKlxuKiBAcGFyYW0ge0VERFNBfSBlZGRzYSAtIGVkZHNhIGluc3RhbmNlXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fE9iamVjdH0gc2lnIC1cbiogQHBhcmFtIHtBcnJheTxCeXRlcz58UG9pbnR9IFtzaWcuUl0gLSBSIHBvaW50IGFzIFBvaW50IG9yIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fGJufSBbc2lnLlNdIC0gUyBzY2FsYXIgYXMgYm4gb3IgYnl0ZXNcbiogQHBhcmFtIHtBcnJheTxCeXRlcz59IFtzaWcuUmVuY29kZWRdIC0gUiBwb2ludCBlbmNvZGVkXG4qIEBwYXJhbSB7QXJyYXk8Qnl0ZXM+fSBbc2lnLlNlbmNvZGVkXSAtIFMgc2NhbGFyIGVuY29kZWRcbiovXG5mdW5jdGlvbiBTaWduYXR1cmUoZWRkc2EsIHNpZykge1xuICB0aGlzLmVkZHNhID0gZWRkc2E7XG5cbiAgaWYgKHR5cGVvZiBzaWcgIT09ICdvYmplY3QnKVxuICAgIHNpZyA9IHBhcnNlQnl0ZXMoc2lnKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShzaWcpKSB7XG4gICAgYXNzZXJ0KHNpZy5sZW5ndGggPT09IGVkZHNhLmVuY29kaW5nTGVuZ3RoICogMiwgJ1NpZ25hdHVyZSBoYXMgaW52YWxpZCBzaXplJyk7XG4gICAgc2lnID0ge1xuICAgICAgUjogc2lnLnNsaWNlKDAsIGVkZHNhLmVuY29kaW5nTGVuZ3RoKSxcbiAgICAgIFM6IHNpZy5zbGljZShlZGRzYS5lbmNvZGluZ0xlbmd0aCksXG4gICAgfTtcbiAgfVxuXG4gIGFzc2VydChzaWcuUiAmJiBzaWcuUywgJ1NpZ25hdHVyZSB3aXRob3V0IFIgb3IgUycpO1xuXG4gIGlmIChlZGRzYS5pc1BvaW50KHNpZy5SKSlcbiAgICB0aGlzLl9SID0gc2lnLlI7XG4gIGlmIChzaWcuUyBpbnN0YW5jZW9mIEJOKVxuICAgIHRoaXMuX1MgPSBzaWcuUztcblxuICB0aGlzLl9SZW5jb2RlZCA9IEFycmF5LmlzQXJyYXkoc2lnLlIpID8gc2lnLlIgOiBzaWcuUmVuY29kZWQ7XG4gIHRoaXMuX1NlbmNvZGVkID0gQXJyYXkuaXNBcnJheShzaWcuUykgPyBzaWcuUyA6IHNpZy5TZW5jb2RlZDtcbn1cblxuY2FjaGVkUHJvcGVydHkoU2lnbmF0dXJlLCAnUycsIGZ1bmN0aW9uIFMoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmRlY29kZUludCh0aGlzLlNlbmNvZGVkKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwgJ1InLCBmdW5jdGlvbiBSKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5kZWNvZGVQb2ludCh0aGlzLlJlbmNvZGVkKCkpO1xufSk7XG5cbmNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwgJ1JlbmNvZGVkJywgZnVuY3Rpb24gUmVuY29kZWQoKSB7XG4gIHJldHVybiB0aGlzLmVkZHNhLmVuY29kZVBvaW50KHRoaXMuUigpKTtcbn0pO1xuXG5jYWNoZWRQcm9wZXJ0eShTaWduYXR1cmUsICdTZW5jb2RlZCcsIGZ1bmN0aW9uIFNlbmNvZGVkKCkge1xuICByZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVJbnQodGhpcy5TKCkpO1xufSk7XG5cblNpZ25hdHVyZS5wcm90b3R5cGUudG9CeXRlcyA9IGZ1bmN0aW9uIHRvQnl0ZXMoKSB7XG4gIHJldHVybiB0aGlzLlJlbmNvZGVkKCkuY29uY2F0KHRoaXMuU2VuY29kZWQoKSk7XG59O1xuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvSGV4ID0gZnVuY3Rpb24gdG9IZXgoKSB7XG4gIHJldHVybiB1dGlscy5lbmNvZGUodGhpcy50b0J5dGVzKCksICdoZXgnKS50b1VwcGVyQ2FzZSgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBTaWduYXR1cmU7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhc2ggPSByZXF1aXJlKCdoYXNoLmpzJyk7XG52YXIgY3VydmVzID0gcmVxdWlyZSgnLi4vY3VydmVzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGFzc2VydCA9IHV0aWxzLmFzc2VydDtcbnZhciBwYXJzZUJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcztcbnZhciBLZXlQYWlyID0gcmVxdWlyZSgnLi9rZXknKTtcbnZhciBTaWduYXR1cmUgPSByZXF1aXJlKCcuL3NpZ25hdHVyZScpO1xuXG5mdW5jdGlvbiBFRERTQShjdXJ2ZSkge1xuICBhc3NlcnQoY3VydmUgPT09ICdlZDI1NTE5JywgJ29ubHkgdGVzdGVkIHdpdGggZWQyNTUxOSBzbyBmYXInKTtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRUREU0EpKVxuICAgIHJldHVybiBuZXcgRUREU0EoY3VydmUpO1xuXG4gIGN1cnZlID0gY3VydmVzW2N1cnZlXS5jdXJ2ZTtcbiAgdGhpcy5jdXJ2ZSA9IGN1cnZlO1xuICB0aGlzLmcgPSBjdXJ2ZS5nO1xuICB0aGlzLmcucHJlY29tcHV0ZShjdXJ2ZS5uLmJpdExlbmd0aCgpICsgMSk7XG5cbiAgdGhpcy5wb2ludENsYXNzID0gY3VydmUucG9pbnQoKS5jb25zdHJ1Y3RvcjtcbiAgdGhpcy5lbmNvZGluZ0xlbmd0aCA9IE1hdGguY2VpbChjdXJ2ZS5uLmJpdExlbmd0aCgpIC8gOCk7XG4gIHRoaXMuaGFzaCA9IGhhc2guc2hhNTEyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEVERFNBO1xuXG4vKipcbiogQHBhcmFtIHtBcnJheXxTdHJpbmd9IG1lc3NhZ2UgLSBtZXNzYWdlIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfEtleVBhaXJ9IHNlY3JldCAtIHNlY3JldCBieXRlcyBvciBhIGtleXBhaXJcbiogQHJldHVybnMge1NpZ25hdHVyZX0gLSBzaWduYXR1cmVcbiovXG5FRERTQS5wcm90b3R5cGUuc2lnbiA9IGZ1bmN0aW9uIHNpZ24obWVzc2FnZSwgc2VjcmV0KSB7XG4gIG1lc3NhZ2UgPSBwYXJzZUJ5dGVzKG1lc3NhZ2UpO1xuICB2YXIga2V5ID0gdGhpcy5rZXlGcm9tU2VjcmV0KHNlY3JldCk7XG4gIHZhciByID0gdGhpcy5oYXNoSW50KGtleS5tZXNzYWdlUHJlZml4KCksIG1lc3NhZ2UpO1xuICB2YXIgUiA9IHRoaXMuZy5tdWwocik7XG4gIHZhciBSZW5jb2RlZCA9IHRoaXMuZW5jb2RlUG9pbnQoUik7XG4gIHZhciBzXyA9IHRoaXMuaGFzaEludChSZW5jb2RlZCwga2V5LnB1YkJ5dGVzKCksIG1lc3NhZ2UpXG4gICAgLm11bChrZXkucHJpdigpKTtcbiAgdmFyIFMgPSByLmFkZChzXykudW1vZCh0aGlzLmN1cnZlLm4pO1xuICByZXR1cm4gdGhpcy5tYWtlU2lnbmF0dXJlKHsgUjogUiwgUzogUywgUmVuY29kZWQ6IFJlbmNvZGVkIH0pO1xufTtcblxuLyoqXG4qIEBwYXJhbSB7QXJyYXl9IG1lc3NhZ2UgLSBtZXNzYWdlIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfFNpZ25hdHVyZX0gc2lnIC0gc2lnIGJ5dGVzXG4qIEBwYXJhbSB7QXJyYXl8U3RyaW5nfFBvaW50fEtleVBhaXJ9IHB1YiAtIHB1YmxpYyBrZXlcbiogQHJldHVybnMge0Jvb2xlYW59IC0gdHJ1ZSBpZiBwdWJsaWMga2V5IG1hdGNoZXMgc2lnIG9mIG1lc3NhZ2VcbiovXG5FRERTQS5wcm90b3R5cGUudmVyaWZ5ID0gZnVuY3Rpb24gdmVyaWZ5KG1lc3NhZ2UsIHNpZywgcHViKSB7XG4gIG1lc3NhZ2UgPSBwYXJzZUJ5dGVzKG1lc3NhZ2UpO1xuICBzaWcgPSB0aGlzLm1ha2VTaWduYXR1cmUoc2lnKTtcbiAgaWYgKHNpZy5TKCkuZ3RlKHNpZy5lZGRzYS5jdXJ2ZS5uKSB8fCBzaWcuUygpLmlzTmVnKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGtleSA9IHRoaXMua2V5RnJvbVB1YmxpYyhwdWIpO1xuICB2YXIgaCA9IHRoaXMuaGFzaEludChzaWcuUmVuY29kZWQoKSwga2V5LnB1YkJ5dGVzKCksIG1lc3NhZ2UpO1xuICB2YXIgU0cgPSB0aGlzLmcubXVsKHNpZy5TKCkpO1xuICB2YXIgUnBsdXNBaCA9IHNpZy5SKCkuYWRkKGtleS5wdWIoKS5tdWwoaCkpO1xuICByZXR1cm4gUnBsdXNBaC5lcShTRyk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuaGFzaEludCA9IGZ1bmN0aW9uIGhhc2hJbnQoKSB7XG4gIHZhciBoYXNoID0gdGhpcy5oYXNoKCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgIGhhc2gudXBkYXRlKGFyZ3VtZW50c1tpXSk7XG4gIHJldHVybiB1dGlscy5pbnRGcm9tTEUoaGFzaC5kaWdlc3QoKSkudW1vZCh0aGlzLmN1cnZlLm4pO1xufTtcblxuRUREU0EucHJvdG90eXBlLmtleUZyb21QdWJsaWMgPSBmdW5jdGlvbiBrZXlGcm9tUHVibGljKHB1Yikge1xuICByZXR1cm4gS2V5UGFpci5mcm9tUHVibGljKHRoaXMsIHB1Yik7XG59O1xuXG5FRERTQS5wcm90b3R5cGUua2V5RnJvbVNlY3JldCA9IGZ1bmN0aW9uIGtleUZyb21TZWNyZXQoc2VjcmV0KSB7XG4gIHJldHVybiBLZXlQYWlyLmZyb21TZWNyZXQodGhpcywgc2VjcmV0KTtcbn07XG5cbkVERFNBLnByb3RvdHlwZS5tYWtlU2lnbmF0dXJlID0gZnVuY3Rpb24gbWFrZVNpZ25hdHVyZShzaWcpIHtcbiAgaWYgKHNpZyBpbnN0YW5jZW9mIFNpZ25hdHVyZSlcbiAgICByZXR1cm4gc2lnO1xuICByZXR1cm4gbmV3IFNpZ25hdHVyZSh0aGlzLCBzaWcpO1xufTtcblxuLyoqXG4qICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWpvc2Vmc3Nvbi1lZGRzYS1lZDI1NTE5LTAzI3NlY3Rpb24tNS4yXG4qXG4qIEVERFNBIGRlZmluZXMgbWV0aG9kcyBmb3IgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHBvaW50cyBhbmQgaW50ZWdlcnMuIFRoZXNlIGFyZVxuKiBoZWxwZXIgY29udmVuaWVuY2UgbWV0aG9kcywgdGhhdCBwYXNzIGFsb25nIHRvIHV0aWxpdHkgZnVuY3Rpb25zIGltcGxpZWRcbiogcGFyYW1ldGVycy5cbipcbiovXG5FRERTQS5wcm90b3R5cGUuZW5jb2RlUG9pbnQgPSBmdW5jdGlvbiBlbmNvZGVQb2ludChwb2ludCkge1xuICB2YXIgZW5jID0gcG9pbnQuZ2V0WSgpLnRvQXJyYXkoJ2xlJywgdGhpcy5lbmNvZGluZ0xlbmd0aCk7XG4gIGVuY1t0aGlzLmVuY29kaW5nTGVuZ3RoIC0gMV0gfD0gcG9pbnQuZ2V0WCgpLmlzT2RkKCkgPyAweDgwIDogMDtcbiAgcmV0dXJuIGVuYztcbn07XG5cbkVERFNBLnByb3RvdHlwZS5kZWNvZGVQb2ludCA9IGZ1bmN0aW9uIGRlY29kZVBvaW50KGJ5dGVzKSB7XG4gIGJ5dGVzID0gdXRpbHMucGFyc2VCeXRlcyhieXRlcyk7XG5cbiAgdmFyIGxhc3RJeCA9IGJ5dGVzLmxlbmd0aCAtIDE7XG4gIHZhciBub3JtZWQgPSBieXRlcy5zbGljZSgwLCBsYXN0SXgpLmNvbmNhdChieXRlc1tsYXN0SXhdICYgfjB4ODApO1xuICB2YXIgeElzT2RkID0gKGJ5dGVzW2xhc3RJeF0gJiAweDgwKSAhPT0gMDtcblxuICB2YXIgeSA9IHV0aWxzLmludEZyb21MRShub3JtZWQpO1xuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludEZyb21ZKHksIHhJc09kZCk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuZW5jb2RlSW50ID0gZnVuY3Rpb24gZW5jb2RlSW50KG51bSkge1xuICByZXR1cm4gbnVtLnRvQXJyYXkoJ2xlJywgdGhpcy5lbmNvZGluZ0xlbmd0aCk7XG59O1xuXG5FRERTQS5wcm90b3R5cGUuZGVjb2RlSW50ID0gZnVuY3Rpb24gZGVjb2RlSW50KGJ5dGVzKSB7XG4gIHJldHVybiB1dGlscy5pbnRGcm9tTEUoYnl0ZXMpO1xufTtcblxuRUREU0EucHJvdG90eXBlLmlzUG9pbnQgPSBmdW5jdGlvbiBpc1BvaW50KHZhbCkge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgdGhpcy5wb2ludENsYXNzO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZWxsaXB0aWMgPSBleHBvcnRzO1xuXG5lbGxpcHRpYy52ZXJzaW9uID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcbmVsbGlwdGljLnV0aWxzID0gcmVxdWlyZSgnLi9lbGxpcHRpYy91dGlscycpO1xuZWxsaXB0aWMucmFuZCA9IHJlcXVpcmUoJ2Jyb3JhbmQnKTtcbmVsbGlwdGljLmN1cnZlID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9jdXJ2ZScpO1xuZWxsaXB0aWMuY3VydmVzID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9jdXJ2ZXMnKTtcblxuLy8gUHJvdG9jb2xzXG5lbGxpcHRpYy5lYyA9IHJlcXVpcmUoJy4vZWxsaXB0aWMvZWMnKTtcbmVsbGlwdGljLmVkZHNhID0gcmVxdWlyZSgnLi9lbGxpcHRpYy9lZGRzYScpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBCTiA9IHJlcXVpcmUoJ2FzbjEuanMnKS5iaWdudW0sXG5cdEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJhc2U2NFRvQmlnTnVtKHZhbCwgemVybykge1xuXHR2YXIgYnVmID0gQnVmZmVyLmZyb20odmFsLCAnYmFzZTY0Jyk7XG5cdHZhciBibiA9IHZhbCA9IG5ldyBCTihidWYsIDEwLCAnYmUnKS5pYWJzKCk7XG5cdGlmICh6ZXJvKSB7XG5cdFx0YnVmLmZpbGwoMCk7XG5cdH1cblx0cmV0dXJuIGJuO1xufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2FzbjEuanMnKS5kZWZpbmUoJ0FsZ29yaXRobUlkZW50aWZlcicsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLnNlcSgpLm9iaihcblx0XHR0aGlzLmtleSgnYWxnb3JpdGhtJykub2JqaWQoKSxcblx0XHR0aGlzLmtleSgncGFyYW1ldGVycycpLm9wdGlvbmFsKCkuYW55KClcblx0KTtcbn0pO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBBbGdvcml0aG1JZGVudGlmaWVyID0gcmVxdWlyZSgnLi9hbGdvcml0aG0taWRlbnRpZmllcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2FzbjEuanMnKS5kZWZpbmUoJ1B1YmxpY0tleUluZm8nLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5zZXEoKS5vYmooXG5cdFx0dGhpcy5rZXkoJ2FsZ29yaXRobScpLnVzZShBbGdvcml0aG1JZGVudGlmaWVyKSxcblx0XHR0aGlzLmtleSgnUHVibGljS2V5JykuYml0c3RyKClcblx0KTtcbn0pO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnYXNuMS5qcycpLmRlZmluZSgnVmVyc2lvbicsIC8qIEB0aGlzICovIGZ1bmN0aW9uKCkge1xuXHR0aGlzLmludCgpO1xufSk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIEFsZ29yaXRobUlkZW50aWZpZXIgPSByZXF1aXJlKCcuL2FsZ29yaXRobS1pZGVudGlmaWVyJyk7XG52YXIgVmVyc2lvbiA9IHJlcXVpcmUoJy4vdmVyc2lvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2FzbjEuanMnKS5kZWZpbmUoJ1ByaXZhdGVLZXlJbmZvJywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCd2ZXJzaW9uJykudXNlKFZlcnNpb24pLFxuXHRcdHRoaXMua2V5KCdwcml2YXRlS2V5QWxnb3JpdGhtJykudXNlKEFsZ29yaXRobUlkZW50aWZpZXIpLFxuXHRcdHRoaXMua2V5KCdwcml2YXRlS2V5Jykub2N0c3RyKCksXG5cdFx0dGhpcy5rZXkoJ2F0dHJpYnV0ZXMnKS5vcHRpb25hbCgpLmFueSgpXG5cdCk7XG59KTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNuMSA9IHJlcXVpcmUoJ2FzbjEuanMnKSxcblx0QnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXIsXG5cdEVDID0gcmVxdWlyZSgnZWxsaXB0aWMnKS5lYztcblxudmFyIGI2NFRvQm4gPSByZXF1aXJlKCcuL2I2NC10by1ibicpO1xuXG52YXIgUHVibGljS2V5SW5mbyA9IHJlcXVpcmUoJy4vYXNuMS9wdWJsaWMta2V5LWluZm8nKSxcblx0UHJpdmF0ZUtleUluZm8gPSByZXF1aXJlKCcuL2FzbjEvcHJpdmF0ZS1rZXktaW5mbycpLFxuXHRWZXJzaW9uID0gcmVxdWlyZSgnLi9hc24xL3ZlcnNpb24nKTtcblxudmFyIEVDUGFyYW1ldGVycyA9IGFzbjEuZGVmaW5lKCdFQ1BhcmFtZXRlcnMnLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5jaG9pY2Uoe1xuXHRcdG5hbWVkQ3VydmU6IHRoaXMub2JqaWQoKVxuXHR9KTtcbn0pO1xuXG52YXIgZWNQcml2a2V5VmVyMSA9IDE7XG5cbnZhciBFQ1ByaXZhdGVLZXkgPSBhc24xLmRlZmluZSgnRUNQcml2YXRlS2V5JywgLyogQHRoaXMgKi8gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc2VxKCkub2JqKFxuXHRcdHRoaXMua2V5KCd2ZXJzaW9uJykudXNlKFZlcnNpb24pLFxuXHRcdHRoaXMua2V5KCdwcml2YXRlS2V5Jykub2N0c3RyKCksXG5cdFx0dGhpcy5rZXkoJ3BhcmFtZXRlcnMnKS5leHBsaWNpdCgwKS5vcHRpb25hbCgpLmFueSgpLFxuXHRcdHRoaXMua2V5KCdwdWJsaWNLZXknKS5leHBsaWNpdCgxKS5vcHRpb25hbCgpLmJpdHN0cigpXG5cdCk7XG59KTtcblxudmFyIGN1cnZlcyA9IHtcblx0J1AtMjU2JzogJ3AyNTYnLFxuXHQnUC0zODQnOiAncDM4NCcsXG5cdCdQLTUyMSc6ICdwNTIxJ1xufTtcblxudmFyIG9pZHMgPSB7XG5cdCdQLTI1Nic6IFsxLCAyLCA4NDAsIDEwMDQ1LCAzLCAxLCA3XSxcblx0J1AtMzg0JzogWzEsIDMsIDEzMiwgMCwgMzRdLFxuXHQnUC01MjEnOiBbMSwgMywgMTMyLCAwLCAzNV1cbn07XG52YXIgcGFyYW1ldGVycyA9IHt9O1xudmFyIGFsZ29yaXRobXMgPSB7fTtcbk9iamVjdC5rZXlzKG9pZHMpLmZvckVhY2goZnVuY3Rpb24oY3J2KSB7XG5cdHBhcmFtZXRlcnNbY3J2XSA9IEVDUGFyYW1ldGVycy5lbmNvZGUoe1xuXHRcdHR5cGU6ICduYW1lZEN1cnZlJyxcblx0XHR2YWx1ZTogb2lkc1tjcnZdXG5cdH0sICdkZXInKTtcblx0YWxnb3JpdGhtc1tjcnZdID0ge1xuXHRcdGFsZ29yaXRobTogIFsxLCAyLCA4NDAsIDEwMDQ1LCAyLCAxXSxcblx0XHRwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzW2Nydl1cblx0fTtcbn0pO1xub2lkcyA9IG51bGw7XG5cbmZ1bmN0aW9uIGVjSndrVG9CdWZmZXIoandrLCBvcHRzKSB7XG5cdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5jcnYpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5jcnZcIiB0byBiZSBhIFN0cmluZycpO1xuXHR9XG5cblx0dmFyIGhhc0QgPSAnc3RyaW5nJyA9PT0gdHlwZW9mIGp3ay5kO1xuXHR2YXIgeHlUeXBlcyA9IGhhc0Rcblx0XHQ/IFsndW5kZWZpbmVkJywgJ3N0cmluZyddXG5cdFx0OiBbJ3N0cmluZyddO1xuXG5cdGlmICgtMSA9PT0geHlUeXBlcy5pbmRleE9mKHR5cGVvZiBqd2sueCkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay54XCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdGlmICgtMSA9PT0geHlUeXBlcy5pbmRleE9mKHR5cGVvZiBqd2sueSkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay55XCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdGlmIChvcHRzLnByaXZhdGUgJiYgIWhhc0QpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5kXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdHZhciBjdXJ2ZU5hbWUgPSBjdXJ2ZXNbandrLmNydl07XG5cdGlmICghY3VydmVOYW1lKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBjdXJ2ZSBcIicgKyBqd2suY3J2ICsgJ1wiJyk7XG5cdH1cblxuXHR2YXIgY3VydmUgPSBuZXcgRUMoY3VydmVOYW1lKTtcblxuXHR2YXIga2V5ID0ge307XG5cblx0dmFyIGhhc1B1YiA9IGp3ay54ICYmIGp3ay55O1xuXHRpZiAoaGFzUHViKSB7XG5cdFx0a2V5LnB1YiA9IHtcblx0XHRcdHg6IGI2NFRvQm4oandrLngsIGZhbHNlKSxcblx0XHRcdHk6IGI2NFRvQm4oandrLnksIGZhbHNlKVxuXHRcdH07XG5cdH1cblxuXHRpZiAob3B0cy5wcml2YXRlIHx8ICFoYXNQdWIpIHtcblx0XHRrZXkucHJpdiA9IGI2NFRvQm4oandrLmQsIHRydWUpO1xuXHR9XG5cblx0a2V5ID0gY3VydmUua2V5UGFpcihrZXkpO1xuXG5cdHZhciBrZXlWYWxpZGF0aW9uID0ga2V5LnZhbGlkYXRlKCk7XG5cdGlmICgha2V5VmFsaWRhdGlvbi5yZXN1bHQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQga2V5IGZvciBjdXJ2ZTogXCInICsga2V5VmFsaWRhdGlvbi5yZWFzb24gKyAnXCInKTtcblx0fVxuXG5cdHZhciByZXN1bHQgPSBrZXlUb1BlbShqd2suY3J2LCBrZXksIG9wdHMpO1xuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGtleVRvUGVtKGNydiwga2V5LCBvcHRzKSB7XG5cdHZhciBjb21wYWN0ID0gZmFsc2U7XG5cdHZhciBwdWJsaWNLZXkgPSBrZXkuZ2V0UHVibGljKGNvbXBhY3QsICdoZXgnKTtcblx0cHVibGljS2V5ID0gQnVmZmVyLmZyb20ocHVibGljS2V5LCAnaGV4Jyk7XG5cdHB1YmxpY0tleSA9IHtcblx0XHR1bnVzZWQ6IDAsXG5cdFx0ZGF0YTogcHVibGljS2V5XG5cdH07XG5cblx0dmFyIHJlc3VsdDtcblx0aWYgKG9wdHMucHJpdmF0ZSkge1xuXHRcdHZhciBwcml2YXRlS2V5ID0ga2V5LmdldFByaXZhdGUoJ2hleCcpO1xuXHRcdHByaXZhdGVLZXkgPSBCdWZmZXIuZnJvbShwcml2YXRlS2V5LCAnaGV4Jyk7XG5cblx0XHRyZXN1bHQgPSBQcml2YXRlS2V5SW5mby5lbmNvZGUoe1xuXHRcdFx0dmVyc2lvbjogMCxcblx0XHRcdHByaXZhdGVLZXlBbGdvcml0aG06IGFsZ29yaXRobXNbY3J2XSxcblx0XHRcdHByaXZhdGVLZXk6IEVDUHJpdmF0ZUtleS5lbmNvZGUoe1xuXHRcdFx0XHR2ZXJzaW9uOiBlY1ByaXZrZXlWZXIxLFxuXHRcdFx0XHRwcml2YXRlS2V5OiBwcml2YXRlS2V5LFxuXHRcdFx0XHRwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzW2Nydl0sXG5cdFx0XHRcdHB1YmxpY0tleTogcHVibGljS2V5XG5cdFx0XHR9LCAnZGVyJylcblx0XHR9LCAncGVtJywge1xuXHRcdFx0bGFiZWw6ICdQUklWQVRFIEtFWSdcblx0XHR9KTtcblxuXHRcdHByaXZhdGVLZXkuZmlsbCgwKTtcblx0fSBlbHNlIHtcblx0XHRyZXN1bHQgPSBQdWJsaWNLZXlJbmZvLmVuY29kZSh7XG5cdFx0XHRhbGdvcml0aG06IGFsZ29yaXRobXNbY3J2XSxcblx0XHRcdFB1YmxpY0tleTogcHVibGljS2V5XG5cdFx0fSwgJ3BlbScsIHtcblx0XHRcdGxhYmVsOiAnUFVCTElDIEtFWSdcblx0XHR9KTtcblx0fVxuXG5cdC8vIFRoaXMgaXMgaW4gYW4gaWYgaW5jYXNlIGFzbjEuanMgYWRkcyBhIHRyYWlsaW5nIFxcblxuXHQvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuXHRpZiAoJ1xcbicgIT09IHJlc3VsdC5zbGljZSgtMSkpIHtcblx0XHRyZXN1bHQgKz0gJ1xcbic7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVjSndrVG9CdWZmZXI7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGFzbjEgPSByZXF1aXJlKCdhc24xLmpzJyk7XG5cbnZhciBiNjRUb0JuID0gcmVxdWlyZSgnLi9iNjQtdG8tYm4nKTtcblxudmFyIFB1YmxpY0tleUluZm8gPSByZXF1aXJlKCcuL2FzbjEvcHVibGljLWtleS1pbmZvJyksXG5cdFByaXZhdGVLZXlJbmZvID0gcmVxdWlyZSgnLi9hc24xL3ByaXZhdGUta2V5LWluZm8nKSxcblx0VmVyc2lvbiA9IHJlcXVpcmUoJy4vYXNuMS92ZXJzaW9uJyk7XG5cbnZhciBSU0FQcml2YXRlS2V5ID0gYXNuMS5kZWZpbmUoJ1JTQVByaXZhdGVLZXknLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5zZXEoKS5vYmooXG5cdFx0dGhpcy5rZXkoJ3ZlcnNpb24nKS51c2UoVmVyc2lvbiksXG5cdFx0dGhpcy5rZXkoJ21vZHVsdXMnKS5pbnQoKSxcblx0XHR0aGlzLmtleSgncHVibGljRXhwb25lbnQnKS5pbnQoKSxcblx0XHR0aGlzLmtleSgncHJpdmF0ZUV4cG9uZW50JykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ3ByaW1lMScpLmludCgpLFxuXHRcdHRoaXMua2V5KCdwcmltZTInKS5pbnQoKSxcblx0XHR0aGlzLmtleSgnZXhwb25lbnQxJykuaW50KCksXG5cdFx0dGhpcy5rZXkoJ2V4cG9uZW50MicpLmludCgpLFxuXHRcdHRoaXMua2V5KCdjb2VmZmljaWVudCcpLmludCgpXG5cdCk7XG59KTtcblxudmFyIFJTQVB1YmxpY0tleSA9IGFzbjEuZGVmaW5lKCdSU0FQdWJsaWNLZXknLCAvKiBAdGhpcyAqLyBmdW5jdGlvbigpIHtcblx0dGhpcy5zZXEoKS5vYmooXG5cdFx0dGhpcy5rZXkoJ21vZHVsdXMnKS5pbnQoKSxcblx0XHR0aGlzLmtleSgncHVibGljRXhwb25lbnQnKS5pbnQoKVxuXHQpO1xufSk7XG5cbnZhciBhbGdvcml0aG0gPSB7XG5cdGFsZ29yaXRobTogWzEsIDIsIDg0MCwgMTEzNTQ5LCAxLCAxLCAxXSxcblx0cGFyYW1ldGVyczogWzUsIDBdXG59O1xuXG5mdW5jdGlvbiByc2FKd2tUb0J1ZmZlcihqd2ssIG9wdHMpIHtcblx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLmUpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5lXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0fVxuXG5cdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5uKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sublwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdH1cblxuXHRpZiAob3B0cy5wcml2YXRlKSB7XG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLmQpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiandrLmRcIiB0byBiZSBhIFN0cmluZycpO1xuXHRcdH1cblxuXHRcdGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGp3ay5wKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5wXCIgdG8gYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cblx0XHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBqd2sucSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2sucVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLmRwKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5kcFwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLmRxKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5kcVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgandrLnFpKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5xaVwiIHRvIGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXHR9XG5cblx0dmFyIHBlbTtcblx0aWYgKG9wdHMucHJpdmF0ZSkge1xuXHRcdHBlbSA9IFByaXZhdGVLZXlJbmZvLmVuY29kZSh7XG5cdFx0XHR2ZXJzaW9uOiAwLFxuXHRcdFx0cHJpdmF0ZUtleUFsZ29yaXRobTogYWxnb3JpdGhtLFxuXHRcdFx0cHJpdmF0ZUtleTogUlNBUHJpdmF0ZUtleS5lbmNvZGUoe1xuXHRcdFx0XHR2ZXJzaW9uOiAwLFxuXHRcdFx0XHRtb2R1bHVzOiBiNjRUb0JuKGp3ay5uLCBmYWxzZSksXG5cdFx0XHRcdHB1YmxpY0V4cG9uZW50OiBiNjRUb0JuKGp3ay5lLCBmYWxzZSksXG5cdFx0XHRcdHByaXZhdGVFeHBvbmVudDogYjY0VG9Cbihqd2suZCwgdHJ1ZSksXG5cdFx0XHRcdHByaW1lMTogYjY0VG9Cbihqd2sucCwgdHJ1ZSksXG5cdFx0XHRcdHByaW1lMjogYjY0VG9Cbihqd2sucSwgdHJ1ZSksXG5cdFx0XHRcdGV4cG9uZW50MTogYjY0VG9Cbihqd2suZHAsIHRydWUpLFxuXHRcdFx0XHRleHBvbmVudDI6IGI2NFRvQm4oandrLmRxLCB0cnVlKSxcblx0XHRcdFx0Y29lZmZpY2llbnQ6IGI2NFRvQm4oandrLnFpLCB0cnVlKVxuXHRcdFx0fSwgJ2RlcicpXG5cdFx0fSwgJ3BlbScsIHtcblx0XHRcdGxhYmVsOiAnUFJJVkFURSBLRVknXG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0cGVtID0gUHVibGljS2V5SW5mby5lbmNvZGUoe1xuXHRcdFx0YWxnb3JpdGhtOiBhbGdvcml0aG0sXG5cdFx0XHRQdWJsaWNLZXk6IHtcblx0XHRcdFx0dW51c2VkOiAwLFxuXHRcdFx0XHRkYXRhOiBSU0FQdWJsaWNLZXkuZW5jb2RlKHtcblx0XHRcdFx0XHRtb2R1bHVzOiBiNjRUb0JuKGp3ay5uLCBmYWxzZSksXG5cdFx0XHRcdFx0cHVibGljRXhwb25lbnQ6IGI2NFRvQm4oandrLmUsIGZhbHNlKVxuXHRcdFx0XHR9LCAnZGVyJylcblx0XHRcdH1cblx0XHR9LCAncGVtJywge1xuXHRcdFx0bGFiZWw6ICdQVUJMSUMgS0VZJ1xuXHRcdH0pO1xuXHR9XG5cblx0Ly8gVGhpcyBpcyBpbiBhbiBpZiBpbmNhc2UgYXNuMS5qcyBhZGRzIGEgdHJhaWxpbmcgXFxuXG5cdC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlXG5cdGlmICgnXFxuJyAhPT0gcGVtLnNsaWNlKC0xKSkge1xuXHRcdHBlbSArPSAnXFxuJztcblx0fVxuXG5cdHJldHVybiBwZW07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcnNhSndrVG9CdWZmZXI7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGVjID0gcmVxdWlyZSgnLi9lYycpLFxuXHRyc2EgPSByZXF1aXJlKCcuL3JzYScpO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3trdHk6J0VDJywgY3J2OnN0cmluZywgZDpzdHJpbmcsIHg/OnN0cmluZywgeT86c3RyaW5nfSB8IHtrdHk6J0VDJywgY3J2OnN0cmluZywgeDpzdHJpbmcsIHk6c3RyaW5nfSB8IHtrdHk6J1JTQScsIGU6c3RyaW5nLCBuOnN0cmluZywgZD86c3RyaW5nLCBwPzpzdHJpbmcsIHE/OnN0cmluZywgZHA/OnN0cmluZywgZHE/OnN0cmluZywgcWk/OnN0cmluZ319IGp3a1xuICogQHBhcmFtIHt7cHJpdmF0ZTpib29sZWFufT19IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGp3a1RvQnVmZmVyKGp3aywgb3B0cykge1xuXHRpZiAoJ29iamVjdCcgIT09IHR5cGVvZiBqd2sgfHwgbnVsbCA9PT0gandrKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCJqd2tcIiB0byBiZSBhbiBPYmplY3QnKTtcblx0fVxuXG5cdHZhciBrdHkgPSBqd2sua3R5O1xuXHRpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBrdHkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcImp3ay5rdHlcIiB0byBiZSBhIFN0cmluZycpO1xuXHR9XG5cblx0b3B0cyA9IG9wdHMgfHwge307XG5cdG9wdHMucHJpdmF0ZSA9IG9wdHMucHJpdmF0ZSA9PT0gdHJ1ZTtcblxuXHRzd2l0Y2ggKGt0eSkge1xuXHRcdGNhc2UgJ0VDJzoge1xuXHRcdFx0cmV0dXJuIGVjKGp3aywgb3B0cyk7XG5cdFx0fVxuXHRcdGNhc2UgJ1JTQSc6IHtcblx0XHRcdHJldHVybiByc2EoandrLCBvcHRzKTtcblx0XHR9XG5cdFx0ZGVmYXVsdDoge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBrZXkgdHlwZSBcIicgKyBrdHkgKyAnXCInKTtcblx0XHR9XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBqd2tUb0J1ZmZlcjtcbiIsCiAgICAiXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29va2llcyhoZWFkZXJzOiBIZWFkZXJzKSB7XG4gIGlmICghaGVhZGVycykgcmV0dXJuIHt9O1xuICBjb25zdCBjb29raWVIZWFkZXIgPSBoZWFkZXJzLmdldChcIkNvb2tpZVwiKTtcbiAgY29uc3QgY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGlmIChjb29raWVIZWFkZXIgPT09IG51bGwpIHJldHVybiB7fTtcblxuICBmb3IgKGNvbnN0IGt2IG9mIGNvb2tpZUhlYWRlci5zcGxpdChcIjtcIikpIHtcbiAgICBjb25zdCBbY29va2llS2V5LCAuLi5jb29raWVWYWxdID0ga3Yuc3BsaXQoXCI9XCIpO1xuICAgIGNvbnN0IGtleSA9IGNvb2tpZUtleS50cmltKCk7XG4gICAgY29va2llc1trZXldID0gY29va2llVmFsLmpvaW4oXCI9XCIpO1xuICB9XG5cbiAgcmV0dXJuIGNvb2tpZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb29raWUocmVzcG9uc2U6IFJlc3BvbnNlLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgbWF4QWdlPzogbnVtYmVyKSB7XG4gIHJlc3BvbnNlLmhlYWRlcnMuYXBwZW5kKCdTZXQtQ29va2llJywgYCR7a2V5fT0ke3ZhbHVlfSR7bWF4QWdlID8gJzsgUGF0aD0vOyBNYXgtQWdlPScgKyBtYXhBZ2UgOiAnJ31gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUNvb2tpZShyZXNwb25zZTogUmVzcG9uc2UsIGtleTogc3RyaW5nKSB7XG4gIHJlc3BvbnNlLmhlYWRlcnMuYXBwZW5kKCdTZXQtQ29va2llJywgYCR7a2V5fT1cIlwiOyBQYXRoPS87IE1heC1BZ2U9LTE7YCk7XG59IiwKICAgICIvLyNyZWdpb24gcm9sbGRvd246cnVudGltZVxudmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2V4cG9ydCA9ICh0YXJnZXQsIGFsbCkgPT4ge1xuXHRmb3IgKHZhciBuYW1lIGluIGFsbCkgX19kZWZQcm9wKHRhcmdldCwgbmFtZSwge1xuXHRcdGdldDogYWxsW25hbWVdLFxuXHRcdGVudW1lcmFibGU6IHRydWVcblx0fSk7XG59O1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IF9fZXhwb3J0IH07IiwKICAgICJjb25zdCBlbnRpdHlLaW5kID0gU3ltYm9sLmZvcihcImRyaXp6bGU6ZW50aXR5S2luZFwiKTtcbmNvbnN0IGhhc093bkVudGl0eUtpbmQgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpoYXNPd25FbnRpdHlLaW5kXCIpO1xuZnVuY3Rpb24gaXModmFsdWUsIHR5cGUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgdHlwZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHR5cGUsIGVudGl0eUtpbmQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENsYXNzIFwiJHt0eXBlLm5hbWUgPz8gXCI8dW5rbm93bj5cIn1cIiBkb2Vzbid0IGxvb2sgbGlrZSBhIERyaXp6bGUgZW50aXR5LiBJZiB0aGlzIGlzIGluY29ycmVjdCBhbmQgdGhlIGNsYXNzIGlzIHByb3ZpZGVkIGJ5IERyaXp6bGUsIHBsZWFzZSByZXBvcnQgdGhpcyBhcyBhIGJ1Zy5gXG4gICAgKTtcbiAgfVxuICBsZXQgY2xzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKS5jb25zdHJ1Y3RvcjtcbiAgaWYgKGNscykge1xuICAgIHdoaWxlIChjbHMpIHtcbiAgICAgIGlmIChlbnRpdHlLaW5kIGluIGNscyAmJiBjbHNbZW50aXR5S2luZF0gPT09IHR5cGVbZW50aXR5S2luZF0pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjbHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2xzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IHtcbiAgZW50aXR5S2luZCxcbiAgaGFzT3duRW50aXR5S2luZCxcbiAgaXNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbnRpdHkuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5jbGFzcyBDb2x1bW4ge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMubmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgIHRoaXMua2V5QXNOYW1lID0gY29uZmlnLmtleUFzTmFtZTtcbiAgICB0aGlzLm5vdE51bGwgPSBjb25maWcubm90TnVsbDtcbiAgICB0aGlzLmRlZmF1bHQgPSBjb25maWcuZGVmYXVsdDtcbiAgICB0aGlzLmRlZmF1bHRGbiA9IGNvbmZpZy5kZWZhdWx0Rm47XG4gICAgdGhpcy5vblVwZGF0ZUZuID0gY29uZmlnLm9uVXBkYXRlRm47XG4gICAgdGhpcy5oYXNEZWZhdWx0ID0gY29uZmlnLmhhc0RlZmF1bHQ7XG4gICAgdGhpcy5wcmltYXJ5ID0gY29uZmlnLnByaW1hcnlLZXk7XG4gICAgdGhpcy5pc1VuaXF1ZSA9IGNvbmZpZy5pc1VuaXF1ZTtcbiAgICB0aGlzLnVuaXF1ZU5hbWUgPSBjb25maWcudW5pcXVlTmFtZTtcbiAgICB0aGlzLnVuaXF1ZVR5cGUgPSBjb25maWcudW5pcXVlVHlwZTtcbiAgICB0aGlzLmRhdGFUeXBlID0gY29uZmlnLmRhdGFUeXBlO1xuICAgIHRoaXMuY29sdW1uVHlwZSA9IGNvbmZpZy5jb2x1bW5UeXBlO1xuICAgIHRoaXMuZ2VuZXJhdGVkID0gY29uZmlnLmdlbmVyYXRlZDtcbiAgICB0aGlzLmdlbmVyYXRlZElkZW50aXR5ID0gY29uZmlnLmdlbmVyYXRlZElkZW50aXR5O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkNvbHVtblwiO1xuICBuYW1lO1xuICBrZXlBc05hbWU7XG4gIHByaW1hcnk7XG4gIG5vdE51bGw7XG4gIGRlZmF1bHQ7XG4gIGRlZmF1bHRGbjtcbiAgb25VcGRhdGVGbjtcbiAgaGFzRGVmYXVsdDtcbiAgaXNVbmlxdWU7XG4gIHVuaXF1ZU5hbWU7XG4gIHVuaXF1ZVR5cGU7XG4gIGRhdGFUeXBlO1xuICBjb2x1bW5UeXBlO1xuICBlbnVtVmFsdWVzID0gdm9pZCAwO1xuICBnZW5lcmF0ZWQgPSB2b2lkIDA7XG4gIGdlbmVyYXRlZElkZW50aXR5ID0gdm9pZCAwO1xuICBjb25maWc7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIC8vICoqIEBpbnRlcm5hbCAqL1xuICBzaG91bGREaXNhYmxlSW5zZXJ0KCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQgIT09IHZvaWQgMCAmJiB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQudHlwZSAhPT0gXCJieURlZmF1bHRcIjtcbiAgfVxufVxuZXhwb3J0IHtcbiAgQ29sdW1uXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29sdW1uLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuY2xhc3MgQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkNvbHVtbkJ1aWxkZXJcIjtcbiAgY29uZmlnO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBkYXRhVHlwZSwgY29sdW1uVHlwZSkge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGtleUFzTmFtZTogbmFtZSA9PT0gXCJcIixcbiAgICAgIG5vdE51bGw6IGZhbHNlLFxuICAgICAgZGVmYXVsdDogdm9pZCAwLFxuICAgICAgaGFzRGVmYXVsdDogZmFsc2UsXG4gICAgICBwcmltYXJ5S2V5OiBmYWxzZSxcbiAgICAgIGlzVW5pcXVlOiBmYWxzZSxcbiAgICAgIHVuaXF1ZU5hbWU6IHZvaWQgMCxcbiAgICAgIHVuaXF1ZVR5cGU6IHZvaWQgMCxcbiAgICAgIGRhdGFUeXBlLFxuICAgICAgY29sdW1uVHlwZSxcbiAgICAgIGdlbmVyYXRlZDogdm9pZCAwXG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogQ2hhbmdlcyB0aGUgZGF0YSB0eXBlIG9mIHRoZSBjb2x1bW4uIENvbW1vbmx5IHVzZWQgd2l0aCBganNvbmAgY29sdW1ucy4gQWxzbywgdXNlZnVsIGZvciBicmFuZGVkIHR5cGVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBjb25zdCB1c2VycyA9IHBnVGFibGUoJ3VzZXJzJywge1xuICAgKiBcdGlkOiBpbnRlZ2VyKCdpZCcpLiR0eXBlPFVzZXJJZD4oKS5wcmltYXJ5S2V5KCksXG4gICAqIFx0ZGV0YWlsczoganNvbignZGV0YWlscycpLiR0eXBlPFVzZXJEZXRhaWxzPigpLm5vdE51bGwoKSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgJHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBgbm90IG51bGxgIGNsYXVzZSB0byB0aGUgY29sdW1uIGRlZmluaXRpb24uXG4gICAqXG4gICAqIEFmZmVjdHMgdGhlIGBzZWxlY3RgIG1vZGVsIG9mIHRoZSB0YWJsZSAtIGNvbHVtbnMgKndpdGhvdXQqIGBub3QgbnVsbGAgd2lsbCBiZSBudWxsYWJsZSBvbiBzZWxlY3QuXG4gICAqL1xuICBub3ROdWxsKCkge1xuICAgIHRoaXMuY29uZmlnLm5vdE51bGwgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgYGRlZmF1bHQgPHZhbHVlPmAgY2xhdXNlIHRvIHRoZSBjb2x1bW4gZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQWZmZWN0cyB0aGUgYGluc2VydGAgbW9kZWwgb2YgdGhlIHRhYmxlIC0gY29sdW1ucyAqd2l0aCogYGRlZmF1bHRgIGFyZSBvcHRpb25hbCBvbiBpbnNlcnQuXG4gICAqXG4gICAqIElmIHlvdSBuZWVkIHRvIHNldCBhIGR5bmFtaWMgZGVmYXVsdCB2YWx1ZSwgdXNlIHtAbGluayAkZGVmYXVsdEZufSBpbnN0ZWFkLlxuICAgKi9cbiAgZGVmYXVsdCh2YWx1ZSkge1xuICAgIHRoaXMuY29uZmlnLmRlZmF1bHQgPSB2YWx1ZTtcbiAgICB0aGlzLmNvbmZpZy5oYXNEZWZhdWx0ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGR5bmFtaWMgZGVmYXVsdCB2YWx1ZSB0byB0aGUgY29sdW1uLlxuICAgKiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgcm93IGlzIGluc2VydGVkLCBhbmQgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgY29sdW1uIHZhbHVlLlxuICAgKlxuICAgKiAqKk5vdGU6KiogVGhpcyB2YWx1ZSBkb2VzIG5vdCBhZmZlY3QgdGhlIGBkcml6emxlLWtpdGAgYmVoYXZpb3IsIGl0IGlzIG9ubHkgdXNlZCBhdCBydW50aW1lIGluIGBkcml6emxlLW9ybWAuXG4gICAqL1xuICAkZGVmYXVsdEZuKGZuKSB7XG4gICAgdGhpcy5jb25maWcuZGVmYXVsdEZuID0gZm47XG4gICAgdGhpcy5jb25maWcuaGFzRGVmYXVsdCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFsaWFzIGZvciB7QGxpbmsgJGRlZmF1bHRGbn0uXG4gICAqL1xuICAkZGVmYXVsdCA9IHRoaXMuJGRlZmF1bHRGbjtcbiAgLyoqXG4gICAqIEFkZHMgYSBkeW5hbWljIHVwZGF0ZSB2YWx1ZSB0byB0aGUgY29sdW1uLlxuICAgKiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgcm93IGlzIHVwZGF0ZWQsIGFuZCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIHRoZSBjb2x1bW4gdmFsdWUgaWYgbm9uZSBpcyBwcm92aWRlZC5cbiAgICogSWYgbm8gYGRlZmF1bHRgIChvciBgJGRlZmF1bHRGbmApIHZhbHVlIGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgcm93IGlzIGluc2VydGVkIGFzIHdlbGwsIGFuZCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIHRoZSBjb2x1bW4gdmFsdWUuXG4gICAqXG4gICAqICoqTm90ZToqKiBUaGlzIHZhbHVlIGRvZXMgbm90IGFmZmVjdCB0aGUgYGRyaXp6bGUta2l0YCBiZWhhdmlvciwgaXQgaXMgb25seSB1c2VkIGF0IHJ1bnRpbWUgaW4gYGRyaXp6bGUtb3JtYC5cbiAgICovXG4gICRvblVwZGF0ZUZuKGZuKSB7XG4gICAgdGhpcy5jb25maWcub25VcGRhdGVGbiA9IGZuO1xuICAgIHRoaXMuY29uZmlnLmhhc0RlZmF1bHQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBbGlhcyBmb3Ige0BsaW5rICRvblVwZGF0ZUZufS5cbiAgICovXG4gICRvblVwZGF0ZSA9IHRoaXMuJG9uVXBkYXRlRm47XG4gIC8qKlxuICAgKiBBZGRzIGEgYHByaW1hcnkga2V5YCBjbGF1c2UgdG8gdGhlIGNvbHVtbiBkZWZpbml0aW9uLiBUaGlzIGltcGxpY2l0bHkgbWFrZXMgdGhlIGNvbHVtbiBgbm90IG51bGxgLlxuICAgKlxuICAgKiBJbiBTUUxpdGUsIGBpbnRlZ2VyIHByaW1hcnkga2V5YCBpbXBsaWNpdGx5IG1ha2VzIHRoZSBjb2x1bW4gYXV0by1pbmNyZW1lbnRpbmcuXG4gICAqL1xuICBwcmltYXJ5S2V5KCkge1xuICAgIHRoaXMuY29uZmlnLnByaW1hcnlLZXkgPSB0cnVlO1xuICAgIHRoaXMuY29uZmlnLm5vdE51bGwgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgU2V0cyB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHRoZSBrZXkgd2l0aGluIHRoZSB0YWJsZSBkZWZpbml0aW9uIGlmIGEgbmFtZSB3YXMgbm90IGdpdmVuLiAqL1xuICBzZXROYW1lKG5hbWUpIHtcbiAgICBpZiAodGhpcy5jb25maWcubmFtZSAhPT0gXCJcIikgcmV0dXJuO1xuICAgIHRoaXMuY29uZmlnLm5hbWUgPSBuYW1lO1xuICB9XG59XG5leHBvcnQge1xuICBDb2x1bW5CdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29sdW1uLWJ1aWxkZXIuanMubWFwIiwKICAgICJjb25zdCBUYWJsZU5hbWUgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpOYW1lXCIpO1xuZXhwb3J0IHtcbiAgVGFibGVOYW1lXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFibGUudXRpbHMuanMubWFwIiwKICAgICJmdW5jdGlvbiBpaWZlKGZuLCAuLi5hcmdzKSB7XG4gIHJldHVybiBmbiguLi5hcmdzKTtcbn1cbmV4cG9ydCB7XG4gIGlpZmVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjaW5nLXV0aWxzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlTmFtZSB9IGZyb20gXCIuLi90YWJsZS51dGlscy5qc1wiO1xuZnVuY3Rpb24gdW5pcXVlKG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyKG5hbWUpO1xufVxuZnVuY3Rpb24gdW5pcXVlS2V5TmFtZSh0YWJsZSwgY29sdW1ucykge1xuICByZXR1cm4gYCR7dGFibGVbVGFibGVOYW1lXX1fJHtjb2x1bW5zLmpvaW4oXCJfXCIpfV91bmlxdWVgO1xufVxuY2xhc3MgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIge1xuICBjb25zdHJ1Y3Rvcihjb2x1bW5zLCBuYW1lKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnVW5pcXVlQ29uc3RyYWludEJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb2x1bW5zO1xuICAvKiogQGludGVybmFsICovXG4gIG51bGxzTm90RGlzdGluY3RDb25maWcgPSBmYWxzZTtcbiAgbnVsbHNOb3REaXN0aW5jdCgpIHtcbiAgICB0aGlzLm51bGxzTm90RGlzdGluY3RDb25maWcgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnQodGFibGUsIHRoaXMuY29sdW1ucywgdGhpcy5udWxsc05vdERpc3RpbmN0Q29uZmlnLCB0aGlzLm5hbWUpO1xuICB9XG59XG5jbGFzcyBVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdVbmlxdWVPbkNvbnN0cmFpbnRCdWlsZGVyXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbmFtZTtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cbiAgb24oLi4uY29sdW1ucykge1xuICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIoY29sdW1ucywgdGhpcy5uYW1lKTtcbiAgfVxufVxuY2xhc3MgVW5pcXVlQ29uc3RyYWludCB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb2x1bW5zLCBudWxsc05vdERpc3RpbmN0LCBuYW1lKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gICAgdGhpcy5uYW1lID0gbmFtZSA/PyB1bmlxdWVLZXlOYW1lKHRoaXMudGFibGUsIHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm5hbWUpKTtcbiAgICB0aGlzLm51bGxzTm90RGlzdGluY3QgPSBudWxsc05vdERpc3RpbmN0O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnVW5pcXVlQ29uc3RyYWludFwiO1xuICBjb2x1bW5zO1xuICBuYW1lO1xuICBudWxsc05vdERpc3RpbmN0ID0gZmFsc2U7XG4gIGdldE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgVW5pcXVlQ29uc3RyYWludCxcbiAgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIsXG4gIFVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXIsXG4gIHVuaXF1ZSxcbiAgdW5pcXVlS2V5TmFtZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuaXF1ZS1jb25zdHJhaW50LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuLi8uLi9jb2x1bW4tYnVpbGRlci5qc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4uLy4uL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBGb3JlaWduS2V5QnVpbGRlciB9IGZyb20gXCIuLi9mb3JlaWduLWtleXMuanNcIjtcbmltcG9ydCB7IGlpZmUgfSBmcm9tIFwiLi4vLi4vdHJhY2luZy11dGlscy5qc1wiO1xuaW1wb3J0IHsgdW5pcXVlS2V5TmFtZSB9IGZyb20gXCIuLi91bmlxdWUtY29uc3RyYWludC5qc1wiO1xuaW1wb3J0IHsgbWFrZVBnQXJyYXksIHBhcnNlUGdBcnJheSB9IGZyb20gXCIuLi91dGlscy9hcnJheS5qc1wiO1xuY2xhc3MgUGdDb2x1bW5CdWlsZGVyIGV4dGVuZHMgQ29sdW1uQnVpbGRlciB7XG4gIGZvcmVpZ25LZXlDb25maWdzID0gW107XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnQ29sdW1uQnVpbGRlclwiO1xuICBhcnJheShzaXplKSB7XG4gICAgcmV0dXJuIG5ldyBQZ0FycmF5QnVpbGRlcih0aGlzLmNvbmZpZy5uYW1lLCB0aGlzLCBzaXplKTtcbiAgfVxuICByZWZlcmVuY2VzKHJlZiwgYWN0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5mb3JlaWduS2V5Q29uZmlncy5wdXNoKHsgcmVmLCBhY3Rpb25zIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHVuaXF1ZShuYW1lLCBjb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZy5pc1VuaXF1ZSA9IHRydWU7XG4gICAgdGhpcy5jb25maWcudW5pcXVlTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5jb25maWcudW5pcXVlVHlwZSA9IGNvbmZpZz8ubnVsbHM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2VuZXJhdGVkQWx3YXlzQXMoYXMpIHtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQgPSB7XG4gICAgICBhcyxcbiAgICAgIHR5cGU6IFwiYWx3YXlzXCIsXG4gICAgICBtb2RlOiBcInN0b3JlZFwiXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkRm9yZWlnbktleXMoY29sdW1uLCB0YWJsZSkge1xuICAgIHJldHVybiB0aGlzLmZvcmVpZ25LZXlDb25maWdzLm1hcCgoeyByZWYsIGFjdGlvbnMgfSkgPT4ge1xuICAgICAgcmV0dXJuIGlpZmUoXG4gICAgICAgIChyZWYyLCBhY3Rpb25zMikgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgRm9yZWlnbktleUJ1aWxkZXIoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9yZWlnbkNvbHVtbiA9IHJlZjIoKTtcbiAgICAgICAgICAgIHJldHVybiB7IGNvbHVtbnM6IFtjb2x1bW5dLCBmb3JlaWduQ29sdW1uczogW2ZvcmVpZ25Db2x1bW5dIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGFjdGlvbnMyLm9uVXBkYXRlKSB7XG4gICAgICAgICAgICBidWlsZGVyLm9uVXBkYXRlKGFjdGlvbnMyLm9uVXBkYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGFjdGlvbnMyLm9uRGVsZXRlKSB7XG4gICAgICAgICAgICBidWlsZGVyLm9uRGVsZXRlKGFjdGlvbnMyLm9uRGVsZXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQodGFibGUpO1xuICAgICAgICB9LFxuICAgICAgICByZWYsXG4gICAgICAgIGFjdGlvbnNcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZEV4dHJhQ29uZmlnQ29sdW1uKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBFeHRyYUNvbmZpZ0NvbHVtbih0YWJsZSwgdGhpcy5jb25maWcpO1xuICB9XG59XG5jbGFzcyBQZ0NvbHVtbiBleHRlbmRzIENvbHVtbiB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICBpZiAoIWNvbmZpZy51bmlxdWVOYW1lKSB7XG4gICAgICBjb25maWcudW5pcXVlTmFtZSA9IHVuaXF1ZUtleU5hbWUodGFibGUsIFtjb25maWcubmFtZV0pO1xuICAgIH1cbiAgICBzdXBlcih0YWJsZSwgY29uZmlnKTtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdDb2x1bW5cIjtcbn1cbmNsYXNzIEV4dHJhQ29uZmlnQ29sdW1uIGV4dGVuZHMgUGdDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJFeHRyYUNvbmZpZ0NvbHVtblwiO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFNRTFR5cGUoKTtcbiAgfVxuICBpbmRleENvbmZpZyA9IHtcbiAgICBvcmRlcjogdGhpcy5jb25maWcub3JkZXIgPz8gXCJhc2NcIixcbiAgICBudWxsczogdGhpcy5jb25maWcubnVsbHMgPz8gXCJsYXN0XCIsXG4gICAgb3BDbGFzczogdGhpcy5jb25maWcub3BDbGFzc1xuICB9O1xuICBkZWZhdWx0Q29uZmlnID0ge1xuICAgIG9yZGVyOiBcImFzY1wiLFxuICAgIG51bGxzOiBcImxhc3RcIixcbiAgICBvcENsYXNzOiB2b2lkIDBcbiAgfTtcbiAgYXNjKCkge1xuICAgIHRoaXMuaW5kZXhDb25maWcub3JkZXIgPSBcImFzY1wiO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGRlc2MoKSB7XG4gICAgdGhpcy5pbmRleENvbmZpZy5vcmRlciA9IFwiZGVzY1wiO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG51bGxzRmlyc3QoKSB7XG4gICAgdGhpcy5pbmRleENvbmZpZy5udWxscyA9IFwiZmlyc3RcIjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBudWxsc0xhc3QoKSB7XG4gICAgdGhpcy5pbmRleENvbmZpZy5udWxscyA9IFwibGFzdFwiO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiAjIyMgUG9zdGdyZVNRTCBkb2N1bWVudGF0aW9uIHF1b3RlXG4gICAqXG4gICAqID4gQW4gb3BlcmF0b3IgY2xhc3Mgd2l0aCBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGVhY2ggY29sdW1uIG9mIGFuIGluZGV4LlxuICAgKiBUaGUgb3BlcmF0b3IgY2xhc3MgaWRlbnRpZmllcyB0aGUgb3BlcmF0b3JzIHRvIGJlIHVzZWQgYnkgdGhlIGluZGV4IGZvciB0aGF0IGNvbHVtbi5cbiAgICogRm9yIGV4YW1wbGUsIGEgQi10cmVlIGluZGV4IG9uIGZvdXItYnl0ZSBpbnRlZ2VycyB3b3VsZCB1c2UgdGhlIGludDRfb3BzIGNsYXNzO1xuICAgKiB0aGlzIG9wZXJhdG9yIGNsYXNzIGluY2x1ZGVzIGNvbXBhcmlzb24gZnVuY3Rpb25zIGZvciBmb3VyLWJ5dGUgaW50ZWdlcnMuXG4gICAqIEluIHByYWN0aWNlIHRoZSBkZWZhdWx0IG9wZXJhdG9yIGNsYXNzIGZvciB0aGUgY29sdW1uJ3MgZGF0YSB0eXBlIGlzIHVzdWFsbHkgc3VmZmljaWVudC5cbiAgICogVGhlIG1haW4gcG9pbnQgb2YgaGF2aW5nIG9wZXJhdG9yIGNsYXNzZXMgaXMgdGhhdCBmb3Igc29tZSBkYXRhIHR5cGVzLCB0aGVyZSBjb3VsZCBiZSBtb3JlIHRoYW4gb25lIG1lYW5pbmdmdWwgb3JkZXJpbmcuXG4gICAqIEZvciBleGFtcGxlLCB3ZSBtaWdodCB3YW50IHRvIHNvcnQgYSBjb21wbGV4LW51bWJlciBkYXRhIHR5cGUgZWl0aGVyIGJ5IGFic29sdXRlIHZhbHVlIG9yIGJ5IHJlYWwgcGFydC5cbiAgICogV2UgY291bGQgZG8gdGhpcyBieSBkZWZpbmluZyB0d28gb3BlcmF0b3IgY2xhc3NlcyBmb3IgdGhlIGRhdGEgdHlwZSBhbmQgdGhlbiBzZWxlY3RpbmcgdGhlIHByb3BlciBjbGFzcyB3aGVuIGNyZWF0aW5nIGFuIGluZGV4LlxuICAgKiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IG9wZXJhdG9yIGNsYXNzZXMgY2hlY2s6XG4gICAqXG4gICAqICMjIyBVc2VmdWwgbGlua3NcbiAgICogaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvZG9jcy9jdXJyZW50L3NxbC1jcmVhdGVpbmRleC5odG1sXG4gICAqXG4gICAqIGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvY3VycmVudC9pbmRleGVzLW9wY2xhc3MuaHRtbFxuICAgKlxuICAgKiBodHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzL2N1cnJlbnQveGluZGV4Lmh0bWxcbiAgICpcbiAgICogIyMjIEFkZGl0aW9uYWwgdHlwZXNcbiAgICogSWYgeW91IGhhdmUgdGhlIGBwZ192ZWN0b3JgIGV4dGVuc2lvbiBpbnN0YWxsZWQgaW4geW91ciBkYXRhYmFzZSwgeW91IGNhbiB1c2UgdGhlXG4gICAqIGB2ZWN0b3JfbDJfb3BzYCwgYHZlY3Rvcl9pcF9vcHNgLCBgdmVjdG9yX2Nvc2luZV9vcHNgLCBgdmVjdG9yX2wxX29wc2AsIGBiaXRfaGFtbWluZ19vcHNgLCBgYml0X2phY2NhcmRfb3BzYCwgYGhhbGZ2ZWNfbDJfb3BzYCwgYHNwYXJzZXZlY19sMl9vcHNgIG9wdGlvbnMsIHdoaWNoIGFyZSBwcmVkZWZpbmVkIHR5cGVzLlxuICAgKlxuICAgKiAqKllvdSBjYW4gYWx3YXlzIHNwZWNpZnkgYW55IHN0cmluZyB5b3Ugd2FudCBpbiB0aGUgb3BlcmF0b3IgY2xhc3MsIGluIGNhc2UgRHJpenpsZSBkb2Vzbid0IGhhdmUgaXQgbmF0aXZlbHkgaW4gaXRzIHR5cGVzKipcbiAgICpcbiAgICogQHBhcmFtIG9wQ2xhc3NcbiAgICogQHJldHVybnNcbiAgICovXG4gIG9wKG9wQ2xhc3MpIHtcbiAgICB0aGlzLmluZGV4Q29uZmlnLm9wQ2xhc3MgPSBvcENsYXNzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5jbGFzcyBJbmRleGVkQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiSW5kZXhlZENvbHVtblwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBrZXlBc05hbWUsIHR5cGUsIGluZGV4Q29uZmlnKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmtleUFzTmFtZSA9IGtleUFzTmFtZTtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuaW5kZXhDb25maWcgPSBpbmRleENvbmZpZztcbiAgfVxuICBuYW1lO1xuICBrZXlBc05hbWU7XG4gIHR5cGU7XG4gIGluZGV4Q29uZmlnO1xufVxuY2xhc3MgUGdBcnJheUJ1aWxkZXIgZXh0ZW5kcyBQZ0NvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0FycmF5QnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBiYXNlQnVpbGRlciwgc2l6ZSkge1xuICAgIHN1cGVyKG5hbWUsIFwiYXJyYXlcIiwgXCJQZ0FycmF5XCIpO1xuICAgIHRoaXMuY29uZmlnLmJhc2VCdWlsZGVyID0gYmFzZUJ1aWxkZXI7XG4gICAgdGhpcy5jb25maWcuc2l6ZSA9IHNpemU7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIGNvbnN0IGJhc2VDb2x1bW4gPSB0aGlzLmNvbmZpZy5iYXNlQnVpbGRlci5idWlsZCh0YWJsZSk7XG4gICAgcmV0dXJuIG5ldyBQZ0FycmF5KFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZyxcbiAgICAgIGJhc2VDb2x1bW5cbiAgICApO1xuICB9XG59XG5jbGFzcyBQZ0FycmF5IGV4dGVuZHMgUGdDb2x1bW4ge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnLCBiYXNlQ29sdW1uLCByYW5nZSkge1xuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICAgIHRoaXMuYmFzZUNvbHVtbiA9IGJhc2VDb2x1bW47XG4gICAgdGhpcy5yYW5nZSA9IHJhbmdlO1xuICAgIHRoaXMuc2l6ZSA9IGNvbmZpZy5zaXplO1xuICB9XG4gIHNpemU7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnQXJyYXlcIjtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5iYXNlQ29sdW1uLmdldFNRTFR5cGUoKX1bJHt0eXBlb2YgdGhpcy5zaXplID09PSBcIm51bWJlclwiID8gdGhpcy5zaXplIDogXCJcIn1dYDtcbiAgfVxuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2YWx1ZSA9IHBhcnNlUGdBcnJheSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS5tYXAoKHYpID0+IHRoaXMuYmFzZUNvbHVtbi5tYXBGcm9tRHJpdmVyVmFsdWUodikpO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUsIGlzTmVzdGVkQXJyYXkgPSBmYWxzZSkge1xuICAgIGNvbnN0IGEgPSB2YWx1ZS5tYXAoXG4gICAgICAodikgPT4gdiA9PT0gbnVsbCA/IG51bGwgOiBpcyh0aGlzLmJhc2VDb2x1bW4sIFBnQXJyYXkpID8gdGhpcy5iYXNlQ29sdW1uLm1hcFRvRHJpdmVyVmFsdWUodiwgdHJ1ZSkgOiB0aGlzLmJhc2VDb2x1bW4ubWFwVG9Ecml2ZXJWYWx1ZSh2KVxuICAgICk7XG4gICAgaWYgKGlzTmVzdGVkQXJyYXkpIHJldHVybiBhO1xuICAgIHJldHVybiBtYWtlUGdBcnJheShhKTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgRXh0cmFDb25maWdDb2x1bW4sXG4gIEluZGV4ZWRDb2x1bW4sXG4gIFBnQXJyYXksXG4gIFBnQXJyYXlCdWlsZGVyLFxuICBQZ0NvbHVtbixcbiAgUGdDb2x1bW5CdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbW9uLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFBnQ29sdW1uLCBQZ0NvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFBnRW51bU9iamVjdENvbHVtbkJ1aWxkZXIgZXh0ZW5kcyBQZ0NvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0VudW1PYmplY3RDb2x1bW5CdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGVudW1JbnN0YW5jZSkge1xuICAgIHN1cGVyKG5hbWUsIFwic3RyaW5nXCIsIFwiUGdFbnVtT2JqZWN0Q29sdW1uXCIpO1xuICAgIHRoaXMuY29uZmlnLmVudW0gPSBlbnVtSW5zdGFuY2U7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgUGdFbnVtT2JqZWN0Q29sdW1uKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFBnRW51bU9iamVjdENvbHVtbiBleHRlbmRzIFBnQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdFbnVtT2JqZWN0Q29sdW1uXCI7XG4gIGVudW07XG4gIGVudW1WYWx1ZXMgPSB0aGlzLmNvbmZpZy5lbnVtLmVudW1WYWx1ZXM7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICBzdXBlcih0YWJsZSwgY29uZmlnKTtcbiAgICB0aGlzLmVudW0gPSBjb25maWcuZW51bTtcbiAgfVxuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmVudW0uZW51bU5hbWU7XG4gIH1cbn1cbmNvbnN0IGlzUGdFbnVtU3ltID0gU3ltYm9sLmZvcihcImRyaXp6bGU6aXNQZ0VudW1cIik7XG5mdW5jdGlvbiBpc1BnRW51bShvYmopIHtcbiAgcmV0dXJuICEhb2JqICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiAmJiBpc1BnRW51bVN5bSBpbiBvYmogJiYgb2JqW2lzUGdFbnVtU3ltXSA9PT0gdHJ1ZTtcbn1cbmNsYXNzIFBnRW51bUNvbHVtbkJ1aWxkZXIgZXh0ZW5kcyBQZ0NvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ0VudW1Db2x1bW5CdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGVudW1JbnN0YW5jZSkge1xuICAgIHN1cGVyKG5hbWUsIFwic3RyaW5nXCIsIFwiUGdFbnVtQ29sdW1uXCIpO1xuICAgIHRoaXMuY29uZmlnLmVudW0gPSBlbnVtSW5zdGFuY2U7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgUGdFbnVtQ29sdW1uKFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFBnRW51bUNvbHVtbiBleHRlbmRzIFBnQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGdFbnVtQ29sdW1uXCI7XG4gIGVudW0gPSB0aGlzLmNvbmZpZy5lbnVtO1xuICBlbnVtVmFsdWVzID0gdGhpcy5jb25maWcuZW51bS5lbnVtVmFsdWVzO1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgY29uZmlnKSB7XG4gICAgc3VwZXIodGFibGUsIGNvbmZpZyk7XG4gICAgdGhpcy5lbnVtID0gY29uZmlnLmVudW07XG4gIH1cbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbnVtLmVudW1OYW1lO1xuICB9XG59XG5mdW5jdGlvbiBwZ0VudW0oZW51bU5hbWUsIGlucHV0KSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSA/IHBnRW51bVdpdGhTY2hlbWEoZW51bU5hbWUsIFsuLi5pbnB1dF0sIHZvaWQgMCkgOiBwZ0VudW1PYmplY3RXaXRoU2NoZW1hKGVudW1OYW1lLCBpbnB1dCwgdm9pZCAwKTtcbn1cbmZ1bmN0aW9uIHBnRW51bVdpdGhTY2hlbWEoZW51bU5hbWUsIHZhbHVlcywgc2NoZW1hKSB7XG4gIGNvbnN0IGVudW1JbnN0YW5jZSA9IE9iamVjdC5hc3NpZ24oXG4gICAgKG5hbWUpID0+IG5ldyBQZ0VudW1Db2x1bW5CdWlsZGVyKG5hbWUgPz8gXCJcIiwgZW51bUluc3RhbmNlKSxcbiAgICB7XG4gICAgICBlbnVtTmFtZSxcbiAgICAgIGVudW1WYWx1ZXM6IHZhbHVlcyxcbiAgICAgIHNjaGVtYSxcbiAgICAgIFtpc1BnRW51bVN5bV06IHRydWVcbiAgICB9XG4gICk7XG4gIHJldHVybiBlbnVtSW5zdGFuY2U7XG59XG5mdW5jdGlvbiBwZ0VudW1PYmplY3RXaXRoU2NoZW1hKGVudW1OYW1lLCB2YWx1ZXMsIHNjaGVtYSkge1xuICBjb25zdCBlbnVtSW5zdGFuY2UgPSBPYmplY3QuYXNzaWduKFxuICAgIChuYW1lKSA9PiBuZXcgUGdFbnVtT2JqZWN0Q29sdW1uQnVpbGRlcihuYW1lID8/IFwiXCIsIGVudW1JbnN0YW5jZSksXG4gICAge1xuICAgICAgZW51bU5hbWUsXG4gICAgICBlbnVtVmFsdWVzOiBPYmplY3QudmFsdWVzKHZhbHVlcyksXG4gICAgICBzY2hlbWEsXG4gICAgICBbaXNQZ0VudW1TeW1dOiB0cnVlXG4gICAgfVxuICApO1xuICByZXR1cm4gZW51bUluc3RhbmNlO1xufVxuZXhwb3J0IHtcbiAgUGdFbnVtQ29sdW1uLFxuICBQZ0VudW1Db2x1bW5CdWlsZGVyLFxuICBQZ0VudW1PYmplY3RDb2x1bW4sXG4gIFBnRW51bU9iamVjdENvbHVtbkJ1aWxkZXIsXG4gIGlzUGdFbnVtLFxuICBwZ0VudW0sXG4gIHBnRW51bU9iamVjdFdpdGhTY2hlbWEsXG4gIHBnRW51bVdpdGhTY2hlbWFcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbnVtLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuY2xhc3MgU3VicXVlcnkge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTdWJxdWVyeVwiO1xuICBjb25zdHJ1Y3RvcihzcWwsIGZpZWxkcywgYWxpYXMsIGlzV2l0aCA9IGZhbHNlLCB1c2VkVGFibGVzID0gW10pIHtcbiAgICB0aGlzLl8gPSB7XG4gICAgICBicmFuZDogXCJTdWJxdWVyeVwiLFxuICAgICAgc3FsLFxuICAgICAgc2VsZWN0ZWRGaWVsZHM6IGZpZWxkcyxcbiAgICAgIGFsaWFzLFxuICAgICAgaXNXaXRoLFxuICAgICAgdXNlZFRhYmxlc1xuICAgIH07XG4gIH1cbiAgLy8gZ2V0U1FMKCk6IFNRTDx1bmtub3duPiB7XG4gIC8vIFx0cmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbiAgLy8gfVxufVxuY2xhc3MgV2l0aFN1YnF1ZXJ5IGV4dGVuZHMgU3VicXVlcnkge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJXaXRoU3VicXVlcnlcIjtcbn1cbmV4cG9ydCB7XG4gIFN1YnF1ZXJ5LFxuICBXaXRoU3VicXVlcnlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdWJxdWVyeS5qcy5tYXAiLAogICAgIi8vIHBhY2thZ2UuanNvblxudmFyIHZlcnNpb24gPSBcIjAuNDQuNVwiO1xuXG4vLyBzcmMvdmVyc2lvbi50c1xudmFyIGNvbXBhdGliaWxpdHlWZXJzaW9uID0gMTA7XG5leHBvcnQge1xuICBjb21wYXRpYmlsaXR5VmVyc2lvbixcbiAgdmVyc2lvbiBhcyBucG1WZXJzaW9uXG59O1xuIiwKICAgICJpbXBvcnQgeyBpaWZlIH0gZnJvbSBcIi4vdHJhY2luZy11dGlscy5qc1wiO1xuaW1wb3J0IHsgbnBtVmVyc2lvbiB9IGZyb20gXCIuL3ZlcnNpb24uanNcIjtcbmxldCBvdGVsO1xubGV0IHJhd1RyYWNlcjtcbmNvbnN0IHRyYWNlciA9IHtcbiAgc3RhcnRBY3RpdmVTcGFuKG5hbWUsIGZuKSB7XG4gICAgaWYgKCFvdGVsKSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9XG4gICAgaWYgKCFyYXdUcmFjZXIpIHtcbiAgICAgIHJhd1RyYWNlciA9IG90ZWwudHJhY2UuZ2V0VHJhY2VyKFwiZHJpenpsZS1vcm1cIiwgbnBtVmVyc2lvbik7XG4gICAgfVxuICAgIHJldHVybiBpaWZlKFxuICAgICAgKG90ZWwyLCByYXdUcmFjZXIyKSA9PiByYXdUcmFjZXIyLnN0YXJ0QWN0aXZlU3BhbihcbiAgICAgICAgbmFtZSxcbiAgICAgICAgKHNwYW4pID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGZuKHNwYW4pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICAgICAgY29kZTogb3RlbDIuU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFwiVW5rbm93biBlcnJvclwiXG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8taW5zdGFuY2VvZi9uby1pbnN0YW5jZW9mXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNwYW4uZW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApLFxuICAgICAgb3RlbCxcbiAgICAgIHJhd1RyYWNlclxuICAgICk7XG4gIH1cbn07XG5leHBvcnQge1xuICB0cmFjZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjaW5nLmpzLm1hcCIsCiAgICAiY29uc3QgVmlld0Jhc2VDb25maWcgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpWaWV3QmFzZUNvbmZpZ1wiKTtcbmV4cG9ydCB7XG4gIFZpZXdCYXNlQ29uZmlnXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmlldy1jb21tb24uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZU5hbWUgfSBmcm9tIFwiLi90YWJsZS51dGlscy5qc1wiO1xuY29uc3QgU2NoZW1hID0gU3ltYm9sLmZvcihcImRyaXp6bGU6U2NoZW1hXCIpO1xuY29uc3QgQ29sdW1ucyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOkNvbHVtbnNcIik7XG5jb25zdCBFeHRyYUNvbmZpZ0NvbHVtbnMgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpFeHRyYUNvbmZpZ0NvbHVtbnNcIik7XG5jb25zdCBPcmlnaW5hbE5hbWUgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpPcmlnaW5hbE5hbWVcIik7XG5jb25zdCBCYXNlTmFtZSA9IFN5bWJvbC5mb3IoXCJkcml6emxlOkJhc2VOYW1lXCIpO1xuY29uc3QgSXNBbGlhcyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOklzQWxpYXNcIik7XG5jb25zdCBFeHRyYUNvbmZpZ0J1aWxkZXIgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpFeHRyYUNvbmZpZ0J1aWxkZXJcIik7XG5jb25zdCBJc0RyaXp6bGVUYWJsZSA9IFN5bWJvbC5mb3IoXCJkcml6emxlOklzRHJpenpsZVRhYmxlXCIpO1xuY2xhc3MgVGFibGUge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJUYWJsZVwiO1xuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBTeW1ib2wgPSB7XG4gICAgTmFtZTogVGFibGVOYW1lLFxuICAgIFNjaGVtYSxcbiAgICBPcmlnaW5hbE5hbWUsXG4gICAgQ29sdW1ucyxcbiAgICBFeHRyYUNvbmZpZ0NvbHVtbnMsXG4gICAgQmFzZU5hbWUsXG4gICAgSXNBbGlhcyxcbiAgICBFeHRyYUNvbmZpZ0J1aWxkZXJcbiAgfTtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBDYW4gYmUgY2hhbmdlZCBpZiB0aGUgdGFibGUgaXMgYWxpYXNlZC5cbiAgICovXG4gIFtUYWJsZU5hbWVdO1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIFVzZWQgdG8gc3RvcmUgdGhlIG9yaWdpbmFsIG5hbWUgb2YgdGhlIHRhYmxlLCBiZWZvcmUgYW55IGFsaWFzaW5nLlxuICAgKi9cbiAgW09yaWdpbmFsTmFtZV07XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW1NjaGVtYV07XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0NvbHVtbnNdO1xuICAvKiogQGludGVybmFsICovXG4gIFtFeHRyYUNvbmZpZ0NvbHVtbnNdO1xuICAvKipcbiAgICogIEBpbnRlcm5hbFxuICAgKiBVc2VkIHRvIHN0b3JlIHRoZSB0YWJsZSBuYW1lIGJlZm9yZSB0aGUgdHJhbnNmb3JtYXRpb24gdmlhIHRoZSBgdGFibGVDcmVhdG9yYCBmdW5jdGlvbnMuXG4gICAqL1xuICBbQmFzZU5hbWVdO1xuICAvKiogQGludGVybmFsICovXG4gIFtJc0FsaWFzXSA9IGZhbHNlO1xuICAvKiogQGludGVybmFsICovXG4gIFtJc0RyaXp6bGVUYWJsZV0gPSB0cnVlO1xuICAvKiogQGludGVybmFsICovXG4gIFtFeHRyYUNvbmZpZ0J1aWxkZXJdID0gdm9pZCAwO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBzY2hlbWEsIGJhc2VOYW1lKSB7XG4gICAgdGhpc1tUYWJsZU5hbWVdID0gdGhpc1tPcmlnaW5hbE5hbWVdID0gbmFtZTtcbiAgICB0aGlzW1NjaGVtYV0gPSBzY2hlbWE7XG4gICAgdGhpc1tCYXNlTmFtZV0gPSBiYXNlTmFtZTtcbiAgfVxufVxuZnVuY3Rpb24gaXNUYWJsZSh0YWJsZSkge1xuICByZXR1cm4gdHlwZW9mIHRhYmxlID09PSBcIm9iamVjdFwiICYmIHRhYmxlICE9PSBudWxsICYmIElzRHJpenpsZVRhYmxlIGluIHRhYmxlO1xufVxuZnVuY3Rpb24gZ2V0VGFibGVOYW1lKHRhYmxlKSB7XG4gIHJldHVybiB0YWJsZVtUYWJsZU5hbWVdO1xufVxuZnVuY3Rpb24gZ2V0VGFibGVVbmlxdWVOYW1lKHRhYmxlKSB7XG4gIHJldHVybiBgJHt0YWJsZVtTY2hlbWFdID8/IFwicHVibGljXCJ9LiR7dGFibGVbVGFibGVOYW1lXX1gO1xufVxuZXhwb3J0IHtcbiAgQmFzZU5hbWUsXG4gIENvbHVtbnMsXG4gIEV4dHJhQ29uZmlnQnVpbGRlcixcbiAgRXh0cmFDb25maWdDb2x1bW5zLFxuICBJc0FsaWFzLFxuICBPcmlnaW5hbE5hbWUsXG4gIFNjaGVtYSxcbiAgVGFibGUsXG4gIGdldFRhYmxlTmFtZSxcbiAgZ2V0VGFibGVVbmlxdWVOYW1lLFxuICBpc1RhYmxlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFibGUuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IGlzUGdFbnVtIH0gZnJvbSBcIi4uL3BnLWNvcmUvY29sdW1ucy9lbnVtLmpzXCI7XG5pbXBvcnQgeyBTdWJxdWVyeSB9IGZyb20gXCIuLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgdHJhY2VyIH0gZnJvbSBcIi4uL3RyYWNpbmcuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4uL3ZpZXctY29tbW9uLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBJc0FsaWFzLCBUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuY2xhc3MgRmFrZVByaW1pdGl2ZVBhcmFtIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiRmFrZVByaW1pdGl2ZVBhcmFtXCI7XG59XG5mdW5jdGlvbiBpc1NRTFdyYXBwZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDAgJiYgdHlwZW9mIHZhbHVlLmdldFNRTCA9PT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24gbWVyZ2VRdWVyaWVzKHF1ZXJpZXMpIHtcbiAgY29uc3QgcmVzdWx0ID0geyBzcWw6IFwiXCIsIHBhcmFtczogW10gfTtcbiAgZm9yIChjb25zdCBxdWVyeSBvZiBxdWVyaWVzKSB7XG4gICAgcmVzdWx0LnNxbCArPSBxdWVyeS5zcWw7XG4gICAgcmVzdWx0LnBhcmFtcy5wdXNoKC4uLnF1ZXJ5LnBhcmFtcyk7XG4gICAgaWYgKHF1ZXJ5LnR5cGluZ3M/Lmxlbmd0aCkge1xuICAgICAgaWYgKCFyZXN1bHQudHlwaW5ncykge1xuICAgICAgICByZXN1bHQudHlwaW5ncyA9IFtdO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnR5cGluZ3MucHVzaCguLi5xdWVyeS50eXBpbmdzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmNsYXNzIFN0cmluZ0NodW5rIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU3RyaW5nQ2h1bmtcIjtcbiAgdmFsdWU7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICB9XG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xuICB9XG59XG5jbGFzcyBTUUwge1xuICBjb25zdHJ1Y3RvcihxdWVyeUNodW5rcykge1xuICAgIHRoaXMucXVlcnlDaHVua3MgPSBxdWVyeUNodW5rcztcbiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIHF1ZXJ5Q2h1bmtzKSB7XG4gICAgICBpZiAoaXMoY2h1bmssIFRhYmxlKSkge1xuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gY2h1bmtbVGFibGUuU3ltYm9sLlNjaGVtYV07XG4gICAgICAgIHRoaXMudXNlZFRhYmxlcy5wdXNoKFxuICAgICAgICAgIHNjaGVtYU5hbWUgPT09IHZvaWQgMCA/IGNodW5rW1RhYmxlLlN5bWJvbC5OYW1lXSA6IHNjaGVtYU5hbWUgKyBcIi5cIiArIGNodW5rW1RhYmxlLlN5bWJvbC5OYW1lXVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBkZWNvZGVyID0gbm9vcERlY29kZXI7XG4gIHNob3VsZElubGluZVBhcmFtcyA9IGZhbHNlO1xuICAvKiogQGludGVybmFsICovXG4gIHVzZWRUYWJsZXMgPSBbXTtcbiAgYXBwZW5kKHF1ZXJ5KSB7XG4gICAgdGhpcy5xdWVyeUNodW5rcy5wdXNoKC4uLnF1ZXJ5LnF1ZXJ5Q2h1bmtzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB0b1F1ZXJ5KGNvbmZpZykge1xuICAgIHJldHVybiB0cmFjZXIuc3RhcnRBY3RpdmVTcGFuKFwiZHJpenpsZS5idWlsZFNRTFwiLCAoc3BhbikgPT4ge1xuICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKHRoaXMucXVlcnlDaHVua3MsIGNvbmZpZyk7XG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgXCJkcml6emxlLnF1ZXJ5LnRleHRcIjogcXVlcnkuc3FsLFxuICAgICAgICBcImRyaXp6bGUucXVlcnkucGFyYW1zXCI6IEpTT04uc3RyaW5naWZ5KHF1ZXJ5LnBhcmFtcylcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgIH0pO1xuICB9XG4gIGJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKGNodW5rcywgX2NvbmZpZykge1xuICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIF9jb25maWcsIHtcbiAgICAgIGlubGluZVBhcmFtczogX2NvbmZpZy5pbmxpbmVQYXJhbXMgfHwgdGhpcy5zaG91bGRJbmxpbmVQYXJhbXMsXG4gICAgICBwYXJhbVN0YXJ0SW5kZXg6IF9jb25maWcucGFyYW1TdGFydEluZGV4IHx8IHsgdmFsdWU6IDAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHtcbiAgICAgIGNhc2luZyxcbiAgICAgIGVzY2FwZU5hbWUsXG4gICAgICBlc2NhcGVQYXJhbSxcbiAgICAgIHByZXBhcmVUeXBpbmcsXG4gICAgICBpbmxpbmVQYXJhbXMsXG4gICAgICBwYXJhbVN0YXJ0SW5kZXhcbiAgICB9ID0gY29uZmlnO1xuICAgIHJldHVybiBtZXJnZVF1ZXJpZXMoY2h1bmtzLm1hcCgoY2h1bmspID0+IHtcbiAgICAgIGlmIChpcyhjaHVuaywgU3RyaW5nQ2h1bmspKSB7XG4gICAgICAgIHJldHVybiB7IHNxbDogY2h1bmsudmFsdWUuam9pbihcIlwiKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBOYW1lKSkge1xuICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZU5hbWUoY2h1bmsudmFsdWUpLCBwYXJhbXM6IFtdIH07XG4gICAgICB9XG4gICAgICBpZiAoY2h1bmsgPT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4geyBzcWw6IFwiXCIsIHBhcmFtczogW10gfTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNodW5rKSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbbmV3IFN0cmluZ0NodW5rKFwiKFwiKV07XG4gICAgICAgIGZvciAoY29uc3QgW2ksIHBdIG9mIGNodW5rLmVudHJpZXMoKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHApO1xuICAgICAgICAgIGlmIChpIDwgY2h1bmsubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IFN0cmluZ0NodW5rKFwiLCBcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaChuZXcgU3RyaW5nQ2h1bmsoXCIpXCIpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMocmVzdWx0LCBjb25maWcpO1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBTUUwpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUXVlcnlGcm9tU291cmNlUGFyYW1zKGNodW5rLnF1ZXJ5Q2h1bmtzLCB7XG4gICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgIGlubGluZVBhcmFtczogaW5saW5lUGFyYW1zIHx8IGNodW5rLnNob3VsZElubGluZVBhcmFtc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgVGFibGUpKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBjaHVua1tUYWJsZS5TeW1ib2wuU2NoZW1hXTtcbiAgICAgICAgY29uc3QgdGFibGVOYW1lID0gY2h1bmtbVGFibGUuU3ltYm9sLk5hbWVdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNxbDogc2NoZW1hTmFtZSA9PT0gdm9pZCAwIHx8IGNodW5rW0lzQWxpYXNdID8gZXNjYXBlTmFtZSh0YWJsZU5hbWUpIDogZXNjYXBlTmFtZShzY2hlbWFOYW1lKSArIFwiLlwiICsgZXNjYXBlTmFtZSh0YWJsZU5hbWUpLFxuICAgICAgICAgIHBhcmFtczogW11cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgQ29sdW1uKSkge1xuICAgICAgICBjb25zdCBjb2x1bW5OYW1lID0gY2FzaW5nLmdldENvbHVtbkNhc2luZyhjaHVuayk7XG4gICAgICAgIGlmIChfY29uZmlnLmludm9rZVNvdXJjZSA9PT0gXCJpbmRleGVzXCIpIHtcbiAgICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZU5hbWUoY29sdW1uTmFtZSksIHBhcmFtczogW10gfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gY2h1bmsudGFibGVbVGFibGUuU3ltYm9sLlNjaGVtYV07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3FsOiBjaHVuay50YWJsZVtJc0FsaWFzXSB8fCBzY2hlbWFOYW1lID09PSB2b2lkIDAgPyBlc2NhcGVOYW1lKGNodW5rLnRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXSkgKyBcIi5cIiArIGVzY2FwZU5hbWUoY29sdW1uTmFtZSkgOiBlc2NhcGVOYW1lKHNjaGVtYU5hbWUpICsgXCIuXCIgKyBlc2NhcGVOYW1lKGNodW5rLnRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXSkgKyBcIi5cIiArIGVzY2FwZU5hbWUoY29sdW1uTmFtZSksXG4gICAgICAgICAgcGFyYW1zOiBbXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBWaWV3KSkge1xuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gY2h1bmtbVmlld0Jhc2VDb25maWddLnNjaGVtYTtcbiAgICAgICAgY29uc3Qgdmlld05hbWUgPSBjaHVua1tWaWV3QmFzZUNvbmZpZ10ubmFtZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzcWw6IHNjaGVtYU5hbWUgPT09IHZvaWQgMCB8fCBjaHVua1tWaWV3QmFzZUNvbmZpZ10uaXNBbGlhcyA/IGVzY2FwZU5hbWUodmlld05hbWUpIDogZXNjYXBlTmFtZShzY2hlbWFOYW1lKSArIFwiLlwiICsgZXNjYXBlTmFtZSh2aWV3TmFtZSksXG4gICAgICAgICAgcGFyYW1zOiBbXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzKGNodW5rLCBQYXJhbSkpIHtcbiAgICAgICAgaWYgKGlzKGNodW5rLnZhbHVlLCBQbGFjZWhvbGRlcikpIHtcbiAgICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZVBhcmFtKHBhcmFtU3RhcnRJbmRleC52YWx1ZSsrLCBjaHVuayksIHBhcmFtczogW2NodW5rXSwgdHlwaW5nczogW1wibm9uZVwiXSB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1hcHBlZFZhbHVlID0gY2h1bmsudmFsdWUgPT09IG51bGwgPyBudWxsIDogY2h1bmsuZW5jb2Rlci5tYXBUb0RyaXZlclZhbHVlKGNodW5rLnZhbHVlKTtcbiAgICAgICAgaWYgKGlzKG1hcHBlZFZhbHVlLCBTUUwpKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMoW21hcHBlZFZhbHVlXSwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5saW5lUGFyYW1zKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3FsOiB0aGlzLm1hcElubGluZVBhcmFtKG1hcHBlZFZhbHVlLCBjb25maWcpLCBwYXJhbXM6IFtdIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHR5cGluZ3MgPSBbXCJub25lXCJdO1xuICAgICAgICBpZiAocHJlcGFyZVR5cGluZykge1xuICAgICAgICAgIHR5cGluZ3MgPSBbcHJlcGFyZVR5cGluZyhjaHVuay5lbmNvZGVyKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVQYXJhbShwYXJhbVN0YXJ0SW5kZXgudmFsdWUrKywgbWFwcGVkVmFsdWUpLCBwYXJhbXM6IFttYXBwZWRWYWx1ZV0sIHR5cGluZ3MgfTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyhjaHVuaywgUGxhY2Vob2xkZXIpKSB7XG4gICAgICAgIHJldHVybiB7IHNxbDogZXNjYXBlUGFyYW0ocGFyYW1TdGFydEluZGV4LnZhbHVlKyssIGNodW5rKSwgcGFyYW1zOiBbY2h1bmtdLCB0eXBpbmdzOiBbXCJub25lXCJdIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFNRTC5BbGlhc2VkKSAmJiBjaHVuay5maWVsZEFsaWFzICE9PSB2b2lkIDApIHtcbiAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVOYW1lKGNodW5rLmZpZWxkQWxpYXMpLCBwYXJhbXM6IFtdIH07XG4gICAgICB9XG4gICAgICBpZiAoaXMoY2h1bmssIFN1YnF1ZXJ5KSkge1xuICAgICAgICBpZiAoY2h1bmsuXy5pc1dpdGgpIHtcbiAgICAgICAgICByZXR1cm4geyBzcWw6IGVzY2FwZU5hbWUoY2h1bmsuXy5hbGlhcyksIHBhcmFtczogW10gfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhbXG4gICAgICAgICAgbmV3IFN0cmluZ0NodW5rKFwiKFwiKSxcbiAgICAgICAgICBjaHVuay5fLnNxbCxcbiAgICAgICAgICBuZXcgU3RyaW5nQ2h1bmsoXCIpIFwiKSxcbiAgICAgICAgICBuZXcgTmFtZShjaHVuay5fLmFsaWFzKVxuICAgICAgICBdLCBjb25maWcpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUGdFbnVtKGNodW5rKSkge1xuICAgICAgICBpZiAoY2h1bmsuc2NoZW1hKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVOYW1lKGNodW5rLnNjaGVtYSkgKyBcIi5cIiArIGVzY2FwZU5hbWUoY2h1bmsuZW51bU5hbWUpLCBwYXJhbXM6IFtdIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVOYW1lKGNodW5rLmVudW1OYW1lKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzU1FMV3JhcHBlcihjaHVuaykpIHtcbiAgICAgICAgaWYgKGNodW5rLnNob3VsZE9taXRTUUxQYXJlbnM/LigpKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRRdWVyeUZyb21Tb3VyY2VQYXJhbXMoW2NodW5rLmdldFNRTCgpXSwgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFF1ZXJ5RnJvbVNvdXJjZVBhcmFtcyhbXG4gICAgICAgICAgbmV3IFN0cmluZ0NodW5rKFwiKFwiKSxcbiAgICAgICAgICBjaHVuay5nZXRTUUwoKSxcbiAgICAgICAgICBuZXcgU3RyaW5nQ2h1bmsoXCIpXCIpXG4gICAgICAgIF0sIGNvbmZpZyk7XG4gICAgICB9XG4gICAgICBpZiAoaW5saW5lUGFyYW1zKSB7XG4gICAgICAgIHJldHVybiB7IHNxbDogdGhpcy5tYXBJbmxpbmVQYXJhbShjaHVuaywgY29uZmlnKSwgcGFyYW1zOiBbXSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgc3FsOiBlc2NhcGVQYXJhbShwYXJhbVN0YXJ0SW5kZXgudmFsdWUrKywgY2h1bmspLCBwYXJhbXM6IFtjaHVua10sIHR5cGluZ3M6IFtcIm5vbmVcIl0gfTtcbiAgICB9KSk7XG4gIH1cbiAgbWFwSW5saW5lUGFyYW0oY2h1bmssIHsgZXNjYXBlU3RyaW5nIH0pIHtcbiAgICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgY2h1bmsgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gY2h1bmsudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIGVzY2FwZVN0cmluZyhjaHVuayk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IG1hcHBlZFZhbHVlQXNTdHJpbmcgPSBjaHVuay50b1N0cmluZygpO1xuICAgICAgaWYgKG1hcHBlZFZhbHVlQXNTdHJpbmcgPT09IFwiW29iamVjdCBPYmplY3RdXCIpIHtcbiAgICAgICAgcmV0dXJuIGVzY2FwZVN0cmluZyhKU09OLnN0cmluZ2lmeShjaHVuaykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVzY2FwZVN0cmluZyhtYXBwZWRWYWx1ZUFzU3RyaW5nKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBwYXJhbSB2YWx1ZTogXCIgKyBjaHVuayk7XG4gIH1cbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGFzKGFsaWFzKSB7XG4gICAgaWYgKGFsaWFzID09PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNRTC5BbGlhc2VkKHRoaXMsIGFsaWFzKTtcbiAgfVxuICBtYXBXaXRoKGRlY29kZXIpIHtcbiAgICB0aGlzLmRlY29kZXIgPSB0eXBlb2YgZGVjb2RlciA9PT0gXCJmdW5jdGlvblwiID8geyBtYXBGcm9tRHJpdmVyVmFsdWU6IGRlY29kZXIgfSA6IGRlY29kZXI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgaW5saW5lUGFyYW1zKCkge1xuICAgIHRoaXMuc2hvdWxkSW5saW5lUGFyYW1zID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBjb25kaXRpb25hbGx5IGluY2x1ZGUgYSBwYXJ0IG9mIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQHBhcmFtIGNvbmRpdGlvbiAtIENvbmRpdGlvbiB0byBjaGVja1xuICAgKiBAcmV0dXJucyBpdHNlbGYgaWYgdGhlIGNvbmRpdGlvbiBpcyBgdHJ1ZWAsIG90aGVyd2lzZSBgdW5kZWZpbmVkYFxuICAgKi9cbiAgaWYoY29uZGl0aW9uKSB7XG4gICAgcmV0dXJuIGNvbmRpdGlvbiA/IHRoaXMgOiB2b2lkIDA7XG4gIH1cbn1cbmNsYXNzIE5hbWUge1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJOYW1lXCI7XG4gIGJyYW5kO1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbiAgfVxufVxuZnVuY3Rpb24gbmFtZSh2YWx1ZSkge1xuICByZXR1cm4gbmV3IE5hbWUodmFsdWUpO1xufVxuZnVuY3Rpb24gaXNEcml2ZXJWYWx1ZUVuY29kZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBcIm1hcFRvRHJpdmVyVmFsdWVcIiBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUubWFwVG9Ecml2ZXJWYWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xufVxuY29uc3Qgbm9vcERlY29kZXIgPSB7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZTogKHZhbHVlKSA9PiB2YWx1ZVxufTtcbmNvbnN0IG5vb3BFbmNvZGVyID0ge1xuICBtYXBUb0RyaXZlclZhbHVlOiAodmFsdWUpID0+IHZhbHVlXG59O1xuY29uc3Qgbm9vcE1hcHBlciA9IHtcbiAgLi4ubm9vcERlY29kZXIsXG4gIC4uLm5vb3BFbmNvZGVyXG59O1xuY2xhc3MgUGFyYW0ge1xuICAvKipcbiAgICogQHBhcmFtIHZhbHVlIC0gUGFyYW1ldGVyIHZhbHVlXG4gICAqIEBwYXJhbSBlbmNvZGVyIC0gRW5jb2RlciB0byBjb252ZXJ0IHRoZSB2YWx1ZSB0byBhIGRyaXZlciBwYXJhbWV0ZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKHZhbHVlLCBlbmNvZGVyID0gbm9vcEVuY29kZXIpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5lbmNvZGVyID0gZW5jb2RlcjtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQYXJhbVwiO1xuICBicmFuZDtcbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBhcmFtKHZhbHVlLCBlbmNvZGVyKSB7XG4gIHJldHVybiBuZXcgUGFyYW0odmFsdWUsIGVuY29kZXIpO1xufVxuZnVuY3Rpb24gc3FsKHN0cmluZ3MsIC4uLnBhcmFtcykge1xuICBjb25zdCBxdWVyeUNodW5rcyA9IFtdO1xuICBpZiAocGFyYW1zLmxlbmd0aCA+IDAgfHwgc3RyaW5ncy5sZW5ndGggPiAwICYmIHN0cmluZ3NbMF0gIT09IFwiXCIpIHtcbiAgICBxdWVyeUNodW5rcy5wdXNoKG5ldyBTdHJpbmdDaHVuayhzdHJpbmdzWzBdKSk7XG4gIH1cbiAgZm9yIChjb25zdCBbcGFyYW1JbmRleCwgcGFyYW0yXSBvZiBwYXJhbXMuZW50cmllcygpKSB7XG4gICAgcXVlcnlDaHVua3MucHVzaChwYXJhbTIsIG5ldyBTdHJpbmdDaHVuayhzdHJpbmdzW3BhcmFtSW5kZXggKyAxXSkpO1xuICB9XG4gIHJldHVybiBuZXcgU1FMKHF1ZXJ5Q2h1bmtzKTtcbn1cbigoc3FsMikgPT4ge1xuICBmdW5jdGlvbiBlbXB0eSgpIHtcbiAgICByZXR1cm4gbmV3IFNRTChbXSk7XG4gIH1cbiAgc3FsMi5lbXB0eSA9IGVtcHR5O1xuICBmdW5jdGlvbiBmcm9tTGlzdChsaXN0KSB7XG4gICAgcmV0dXJuIG5ldyBTUUwobGlzdCk7XG4gIH1cbiAgc3FsMi5mcm9tTGlzdCA9IGZyb21MaXN0O1xuICBmdW5jdGlvbiByYXcoc3RyKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW25ldyBTdHJpbmdDaHVuayhzdHIpXSk7XG4gIH1cbiAgc3FsMi5yYXcgPSByYXc7XG4gIGZ1bmN0aW9uIGpvaW4oY2h1bmtzLCBzZXBhcmF0b3IpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtpLCBjaHVua10gb2YgY2h1bmtzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGkgPiAwICYmIHNlcGFyYXRvciAhPT0gdm9pZCAwKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHNlcGFyYXRvcik7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaChjaHVuayk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU1FMKHJlc3VsdCk7XG4gIH1cbiAgc3FsMi5qb2luID0gam9pbjtcbiAgZnVuY3Rpb24gaWRlbnRpZmllcih2YWx1ZSkge1xuICAgIHJldHVybiBuZXcgTmFtZSh2YWx1ZSk7XG4gIH1cbiAgc3FsMi5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcbiAgZnVuY3Rpb24gcGxhY2Vob2xkZXIyKG5hbWUyKSB7XG4gICAgcmV0dXJuIG5ldyBQbGFjZWhvbGRlcihuYW1lMik7XG4gIH1cbiAgc3FsMi5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyMjtcbiAgZnVuY3Rpb24gcGFyYW0yKHZhbHVlLCBlbmNvZGVyKSB7XG4gICAgcmV0dXJuIG5ldyBQYXJhbSh2YWx1ZSwgZW5jb2Rlcik7XG4gIH1cbiAgc3FsMi5wYXJhbSA9IHBhcmFtMjtcbn0pKHNxbCB8fCAoc3FsID0ge30pKTtcbigoU1FMMikgPT4ge1xuICBjbGFzcyBBbGlhc2VkIHtcbiAgICBjb25zdHJ1Y3RvcihzcWwyLCBmaWVsZEFsaWFzKSB7XG4gICAgICB0aGlzLnNxbCA9IHNxbDI7XG4gICAgICB0aGlzLmZpZWxkQWxpYXMgPSBmaWVsZEFsaWFzO1xuICAgIH1cbiAgICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUwuQWxpYXNlZFwiO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBpc1NlbGVjdGlvbkZpZWxkID0gZmFsc2U7XG4gICAgZ2V0U1FMKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3FsO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgY2xvbmUoKSB7XG4gICAgICByZXR1cm4gbmV3IEFsaWFzZWQodGhpcy5zcWwsIHRoaXMuZmllbGRBbGlhcyk7XG4gICAgfVxuICB9XG4gIFNRTDIuQWxpYXNlZCA9IEFsaWFzZWQ7XG59KShTUUwgfHwgKFNRTCA9IHt9KSk7XG5jbGFzcyBQbGFjZWhvbGRlciB7XG4gIGNvbnN0cnVjdG9yKG5hbWUyKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTI7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUGxhY2Vob2xkZXJcIjtcbiAgZ2V0U1FMKCkge1xuICAgIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBsYWNlaG9sZGVyKG5hbWUyKSB7XG4gIHJldHVybiBuZXcgUGxhY2Vob2xkZXIobmFtZTIpO1xufVxuZnVuY3Rpb24gZmlsbFBsYWNlaG9sZGVycyhwYXJhbXMsIHZhbHVlcykge1xuICByZXR1cm4gcGFyYW1zLm1hcCgocCkgPT4ge1xuICAgIGlmIChpcyhwLCBQbGFjZWhvbGRlcikpIHtcbiAgICAgIGlmICghKHAubmFtZSBpbiB2YWx1ZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdmFsdWUgZm9yIHBsYWNlaG9sZGVyIFwiJHtwLm5hbWV9XCIgd2FzIHByb3ZpZGVkYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVzW3AubmFtZV07XG4gICAgfVxuICAgIGlmIChpcyhwLCBQYXJhbSkgJiYgaXMocC52YWx1ZSwgUGxhY2Vob2xkZXIpKSB7XG4gICAgICBpZiAoIShwLnZhbHVlLm5hbWUgaW4gdmFsdWVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHZhbHVlIGZvciBwbGFjZWhvbGRlciBcIiR7cC52YWx1ZS5uYW1lfVwiIHdhcyBwcm92aWRlZGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHAuZW5jb2Rlci5tYXBUb0RyaXZlclZhbHVlKHZhbHVlc1twLnZhbHVlLm5hbWVdKTtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH0pO1xufVxuY29uc3QgSXNEcml6emxlVmlldyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOklzRHJpenpsZVZpZXdcIik7XG5jbGFzcyBWaWV3IHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiVmlld1wiO1xuICAvKiogQGludGVybmFsICovXG4gIFtWaWV3QmFzZUNvbmZpZ107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW0lzRHJpenpsZVZpZXddID0gdHJ1ZTtcbiAgY29uc3RydWN0b3IoeyBuYW1lOiBuYW1lMiwgc2NoZW1hLCBzZWxlY3RlZEZpZWxkcywgcXVlcnkgfSkge1xuICAgIHRoaXNbVmlld0Jhc2VDb25maWddID0ge1xuICAgICAgbmFtZTogbmFtZTIsXG4gICAgICBvcmlnaW5hbE5hbWU6IG5hbWUyLFxuICAgICAgc2NoZW1hLFxuICAgICAgc2VsZWN0ZWRGaWVsZHMsXG4gICAgICBxdWVyeSxcbiAgICAgIGlzRXhpc3Rpbmc6ICFxdWVyeSxcbiAgICAgIGlzQWxpYXM6IGZhbHNlXG4gICAgfTtcbiAgfVxuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbiAgfVxufVxuZnVuY3Rpb24gaXNWaWV3KHZpZXcpIHtcbiAgcmV0dXJuIHR5cGVvZiB2aWV3ID09PSBcIm9iamVjdFwiICYmIHZpZXcgIT09IG51bGwgJiYgSXNEcml6emxlVmlldyBpbiB2aWV3O1xufVxuZnVuY3Rpb24gZ2V0Vmlld05hbWUodmlldykge1xuICByZXR1cm4gdmlld1tWaWV3QmFzZUNvbmZpZ10ubmFtZTtcbn1cbkNvbHVtbi5wcm90b3R5cGUuZ2V0U1FMID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU1FMKFt0aGlzXSk7XG59O1xuVGFibGUucHJvdG90eXBlLmdldFNRTCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNRTChbdGhpc10pO1xufTtcblN1YnF1ZXJ5LnByb3RvdHlwZS5nZXRTUUwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTUUwoW3RoaXNdKTtcbn07XG5leHBvcnQge1xuICBGYWtlUHJpbWl0aXZlUGFyYW0sXG4gIE5hbWUsXG4gIFBhcmFtLFxuICBQbGFjZWhvbGRlcixcbiAgU1FMLFxuICBTdHJpbmdDaHVuayxcbiAgVmlldyxcbiAgZmlsbFBsYWNlaG9sZGVycyxcbiAgZ2V0Vmlld05hbWUsXG4gIGlzRHJpdmVyVmFsdWVFbmNvZGVyLFxuICBpc1NRTFdyYXBwZXIsXG4gIGlzVmlldyxcbiAgbmFtZSxcbiAgbm9vcERlY29kZXIsXG4gIG5vb3BFbmNvZGVyLFxuICBub29wTWFwcGVyLFxuICBwYXJhbSxcbiAgcGxhY2Vob2xkZXIsXG4gIHNxbFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNxbC5qcy5tYXAiLAogICAgImltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNRTCwgc3FsIH0gZnJvbSBcIi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi92aWV3LWNvbW1vbi5qc1wiO1xuY2xhc3MgQ29sdW1uQWxpYXNQcm94eUhhbmRsZXIge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJDb2x1bW5BbGlhc1Byb3h5SGFuZGxlclwiO1xuICBnZXQoY29sdW1uT2JqLCBwcm9wKSB7XG4gICAgaWYgKHByb3AgPT09IFwidGFibGVcIikge1xuICAgICAgcmV0dXJuIHRoaXMudGFibGU7XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW5PYmpbcHJvcF07XG4gIH1cbn1cbmNsYXNzIFRhYmxlQWxpYXNQcm94eUhhbmRsZXIge1xuICBjb25zdHJ1Y3RvcihhbGlhcywgcmVwbGFjZU9yaWdpbmFsTmFtZSkge1xuICAgIHRoaXMuYWxpYXMgPSBhbGlhcztcbiAgICB0aGlzLnJlcGxhY2VPcmlnaW5hbE5hbWUgPSByZXBsYWNlT3JpZ2luYWxOYW1lO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlRhYmxlQWxpYXNQcm94eUhhbmRsZXJcIjtcbiAgZ2V0KHRhcmdldCwgcHJvcCkge1xuICAgIGlmIChwcm9wID09PSBUYWJsZS5TeW1ib2wuSXNBbGlhcykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChwcm9wID09PSBUYWJsZS5TeW1ib2wuTmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuYWxpYXM7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlcGxhY2VPcmlnaW5hbE5hbWUgJiYgcHJvcCA9PT0gVGFibGUuU3ltYm9sLk9yaWdpbmFsTmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuYWxpYXM7XG4gICAgfVxuICAgIGlmIChwcm9wID09PSBWaWV3QmFzZUNvbmZpZykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udGFyZ2V0W1ZpZXdCYXNlQ29uZmlnXSxcbiAgICAgICAgbmFtZTogdGhpcy5hbGlhcyxcbiAgICAgICAgaXNBbGlhczogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHByb3AgPT09IFRhYmxlLlN5bWJvbC5Db2x1bW5zKSB7XG4gICAgICBjb25zdCBjb2x1bW5zID0gdGFyZ2V0W1RhYmxlLlN5bWJvbC5Db2x1bW5zXTtcbiAgICAgIGlmICghY29sdW1ucykge1xuICAgICAgICByZXR1cm4gY29sdW1ucztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb3hpZWRDb2x1bW5zID0ge307XG4gICAgICBPYmplY3Qua2V5cyhjb2x1bW5zKS5tYXAoKGtleSkgPT4ge1xuICAgICAgICBwcm94aWVkQ29sdW1uc1trZXldID0gbmV3IFByb3h5KFxuICAgICAgICAgIGNvbHVtbnNba2V5XSxcbiAgICAgICAgICBuZXcgQ29sdW1uQWxpYXNQcm94eUhhbmRsZXIobmV3IFByb3h5KHRhcmdldCwgdGhpcykpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwcm94aWVkQ29sdW1ucztcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSB0YXJnZXRbcHJvcF07XG4gICAgaWYgKGlzKHZhbHVlLCBDb2x1bW4pKSB7XG4gICAgICByZXR1cm4gbmV3IFByb3h5KHZhbHVlLCBuZXcgQ29sdW1uQWxpYXNQcm94eUhhbmRsZXIobmV3IFByb3h5KHRhcmdldCwgdGhpcykpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5jbGFzcyBSZWxhdGlvblRhYmxlQWxpYXNQcm94eUhhbmRsZXIge1xuICBjb25zdHJ1Y3RvcihhbGlhcykge1xuICAgIHRoaXMuYWxpYXMgPSBhbGlhcztcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJSZWxhdGlvblRhYmxlQWxpYXNQcm94eUhhbmRsZXJcIjtcbiAgZ2V0KHRhcmdldCwgcHJvcCkge1xuICAgIGlmIChwcm9wID09PSBcInNvdXJjZVRhYmxlXCIpIHtcbiAgICAgIHJldHVybiBhbGlhc2VkVGFibGUodGFyZ2V0LnNvdXJjZVRhYmxlLCB0aGlzLmFsaWFzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgfVxufVxuZnVuY3Rpb24gYWxpYXNlZFRhYmxlKHRhYmxlLCB0YWJsZUFsaWFzKSB7XG4gIHJldHVybiBuZXcgUHJveHkodGFibGUsIG5ldyBUYWJsZUFsaWFzUHJveHlIYW5kbGVyKHRhYmxlQWxpYXMsIGZhbHNlKSk7XG59XG5mdW5jdGlvbiBhbGlhc2VkUmVsYXRpb24ocmVsYXRpb24sIHRhYmxlQWxpYXMpIHtcbiAgcmV0dXJuIG5ldyBQcm94eShyZWxhdGlvbiwgbmV3IFJlbGF0aW9uVGFibGVBbGlhc1Byb3h5SGFuZGxlcih0YWJsZUFsaWFzKSk7XG59XG5mdW5jdGlvbiBhbGlhc2VkVGFibGVDb2x1bW4oY29sdW1uLCB0YWJsZUFsaWFzKSB7XG4gIHJldHVybiBuZXcgUHJveHkoXG4gICAgY29sdW1uLFxuICAgIG5ldyBDb2x1bW5BbGlhc1Byb3h5SGFuZGxlcihuZXcgUHJveHkoY29sdW1uLnRhYmxlLCBuZXcgVGFibGVBbGlhc1Byb3h5SGFuZGxlcih0YWJsZUFsaWFzLCBmYWxzZSkpKVxuICApO1xufVxuZnVuY3Rpb24gbWFwQ29sdW1uc0luQWxpYXNlZFNRTFRvQWxpYXMocXVlcnksIGFsaWFzKSB7XG4gIHJldHVybiBuZXcgU1FMLkFsaWFzZWQobWFwQ29sdW1uc0luU1FMVG9BbGlhcyhxdWVyeS5zcWwsIGFsaWFzKSwgcXVlcnkuZmllbGRBbGlhcyk7XG59XG5mdW5jdGlvbiBtYXBDb2x1bW5zSW5TUUxUb0FsaWFzKHF1ZXJ5LCBhbGlhcykge1xuICByZXR1cm4gc3FsLmpvaW4ocXVlcnkucXVlcnlDaHVua3MubWFwKChjKSA9PiB7XG4gICAgaWYgKGlzKGMsIENvbHVtbikpIHtcbiAgICAgIHJldHVybiBhbGlhc2VkVGFibGVDb2x1bW4oYywgYWxpYXMpO1xuICAgIH1cbiAgICBpZiAoaXMoYywgU1FMKSkge1xuICAgICAgcmV0dXJuIG1hcENvbHVtbnNJblNRTFRvQWxpYXMoYywgYWxpYXMpO1xuICAgIH1cbiAgICBpZiAoaXMoYywgU1FMLkFsaWFzZWQpKSB7XG4gICAgICByZXR1cm4gbWFwQ29sdW1uc0luQWxpYXNlZFNRTFRvQWxpYXMoYywgYWxpYXMpO1xuICAgIH1cbiAgICByZXR1cm4gYztcbiAgfSkpO1xufVxuZXhwb3J0IHtcbiAgQ29sdW1uQWxpYXNQcm94eUhhbmRsZXIsXG4gIFJlbGF0aW9uVGFibGVBbGlhc1Byb3h5SGFuZGxlcixcbiAgVGFibGVBbGlhc1Byb3h5SGFuZGxlcixcbiAgYWxpYXNlZFJlbGF0aW9uLFxuICBhbGlhc2VkVGFibGUsXG4gIGFsaWFzZWRUYWJsZUNvbHVtbixcbiAgbWFwQ29sdW1uc0luQWxpYXNlZFNRTFRvQWxpYXMsXG4gIG1hcENvbHVtbnNJblNRTFRvQWxpYXNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbGlhcy5qcy5tYXAiLAogICAgImltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgaXMgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFBhcmFtLCBTUUwsIFZpZXcgfSBmcm9tIFwiLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTdWJxdWVyeSB9IGZyb20gXCIuL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBnZXRUYWJsZU5hbWUsIFRhYmxlIH0gZnJvbSBcIi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4vdmlldy1jb21tb24uanNcIjtcbmZ1bmN0aW9uIG1hcFJlc3VsdFJvdyhjb2x1bW5zLCByb3csIGpvaW5zTm90TnVsbGFibGVNYXApIHtcbiAgY29uc3QgbnVsbGlmeU1hcCA9IHt9O1xuICBjb25zdCByZXN1bHQgPSBjb2x1bW5zLnJlZHVjZShcbiAgICAocmVzdWx0MiwgeyBwYXRoLCBmaWVsZCB9LCBjb2x1bW5JbmRleCkgPT4ge1xuICAgICAgbGV0IGRlY29kZXI7XG4gICAgICBpZiAoaXMoZmllbGQsIENvbHVtbikpIHtcbiAgICAgICAgZGVjb2RlciA9IGZpZWxkO1xuICAgICAgfSBlbHNlIGlmIChpcyhmaWVsZCwgU1FMKSkge1xuICAgICAgICBkZWNvZGVyID0gZmllbGQuZGVjb2RlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlY29kZXIgPSBmaWVsZC5zcWwuZGVjb2RlcjtcbiAgICAgIH1cbiAgICAgIGxldCBub2RlID0gcmVzdWx0MjtcbiAgICAgIGZvciAoY29uc3QgW3BhdGhDaHVua0luZGV4LCBwYXRoQ2h1bmtdIG9mIHBhdGguZW50cmllcygpKSB7XG4gICAgICAgIGlmIChwYXRoQ2h1bmtJbmRleCA8IHBhdGgubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGlmICghKHBhdGhDaHVuayBpbiBub2RlKSkge1xuICAgICAgICAgICAgbm9kZVtwYXRoQ2h1bmtdID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGUgPSBub2RlW3BhdGhDaHVua107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSByb3dbY29sdW1uSW5kZXhdO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gbm9kZVtwYXRoQ2h1bmtdID0gcmF3VmFsdWUgPT09IG51bGwgPyBudWxsIDogZGVjb2Rlci5tYXBGcm9tRHJpdmVyVmFsdWUocmF3VmFsdWUpO1xuICAgICAgICAgIGlmIChqb2luc05vdE51bGxhYmxlTWFwICYmIGlzKGZpZWxkLCBDb2x1bW4pICYmIHBhdGgubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBjb25zdCBvYmplY3ROYW1lID0gcGF0aFswXTtcbiAgICAgICAgICAgIGlmICghKG9iamVjdE5hbWUgaW4gbnVsbGlmeU1hcCkpIHtcbiAgICAgICAgICAgICAgbnVsbGlmeU1hcFtvYmplY3ROYW1lXSA9IHZhbHVlID09PSBudWxsID8gZ2V0VGFibGVOYW1lKGZpZWxkLnRhYmxlKSA6IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbnVsbGlmeU1hcFtvYmplY3ROYW1lXSA9PT0gXCJzdHJpbmdcIiAmJiBudWxsaWZ5TWFwW29iamVjdE5hbWVdICE9PSBnZXRUYWJsZU5hbWUoZmllbGQudGFibGUpKSB7XG4gICAgICAgICAgICAgIG51bGxpZnlNYXBbb2JqZWN0TmFtZV0gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQyO1xuICAgIH0sXG4gICAge31cbiAgKTtcbiAgaWYgKGpvaW5zTm90TnVsbGFibGVNYXAgJiYgT2JqZWN0LmtleXMobnVsbGlmeU1hcCkubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgW29iamVjdE5hbWUsIHRhYmxlTmFtZV0gb2YgT2JqZWN0LmVudHJpZXMobnVsbGlmeU1hcCkpIHtcbiAgICAgIGlmICh0eXBlb2YgdGFibGVOYW1lID09PSBcInN0cmluZ1wiICYmICFqb2luc05vdE51bGxhYmxlTWFwW3RhYmxlTmFtZV0pIHtcbiAgICAgICAgcmVzdWx0W29iamVjdE5hbWVdID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG9yZGVyU2VsZWN0ZWRGaWVsZHMoZmllbGRzLCBwYXRoUHJlZml4KSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhmaWVsZHMpLnJlZHVjZSgocmVzdWx0LCBbbmFtZSwgZmllbGRdKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjb25zdCBuZXdQYXRoID0gcGF0aFByZWZpeCA/IFsuLi5wYXRoUHJlZml4LCBuYW1lXSA6IFtuYW1lXTtcbiAgICBpZiAoaXMoZmllbGQsIENvbHVtbikgfHwgaXMoZmllbGQsIFNRTCkgfHwgaXMoZmllbGQsIFNRTC5BbGlhc2VkKSkge1xuICAgICAgcmVzdWx0LnB1c2goeyBwYXRoOiBuZXdQYXRoLCBmaWVsZCB9KTtcbiAgICB9IGVsc2UgaWYgKGlzKGZpZWxkLCBUYWJsZSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLm9yZGVyU2VsZWN0ZWRGaWVsZHMoZmllbGRbVGFibGUuU3ltYm9sLkNvbHVtbnNdLCBuZXdQYXRoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLm9yZGVyU2VsZWN0ZWRGaWVsZHMoZmllbGQsIG5ld1BhdGgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgW10pO1xufVxuZnVuY3Rpb24gaGF2ZVNhbWVLZXlzKGxlZnQsIHJpZ2h0KSB7XG4gIGNvbnN0IGxlZnRLZXlzID0gT2JqZWN0LmtleXMobGVmdCk7XG4gIGNvbnN0IHJpZ2h0S2V5cyA9IE9iamVjdC5rZXlzKHJpZ2h0KTtcbiAgaWYgKGxlZnRLZXlzLmxlbmd0aCAhPT0gcmlnaHRLZXlzLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtpbmRleCwga2V5XSBvZiBsZWZ0S2V5cy5lbnRyaWVzKCkpIHtcbiAgICBpZiAoa2V5ICE9PSByaWdodEtleXNbaW5kZXhdKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gbWFwVXBkYXRlU2V0KHRhYmxlLCB2YWx1ZXMpIHtcbiAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHZhbHVlcykuZmlsdGVyKChbLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB2b2lkIDApLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgaWYgKGlzKHZhbHVlLCBTUUwpIHx8IGlzKHZhbHVlLCBDb2x1bW4pKSB7XG4gICAgICByZXR1cm4gW2tleSwgdmFsdWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW2tleSwgbmV3IFBhcmFtKHZhbHVlLCB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc11ba2V5XSldO1xuICAgIH1cbiAgfSk7XG4gIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHZhbHVlcyB0byBzZXRcIik7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKTtcbn1cbmZ1bmN0aW9uIGFwcGx5TWl4aW5zKGJhc2VDbGFzcywgZXh0ZW5kZWRDbGFzc2VzKSB7XG4gIGZvciAoY29uc3QgZXh0ZW5kZWRDbGFzcyBvZiBleHRlbmRlZENsYXNzZXMpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZXh0ZW5kZWRDbGFzcy5wcm90b3R5cGUpKSB7XG4gICAgICBpZiAobmFtZSA9PT0gXCJjb25zdHJ1Y3RvclwiKSBjb250aW51ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgYmFzZUNsYXNzLnByb3RvdHlwZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihleHRlbmRlZENsYXNzLnByb3RvdHlwZSwgbmFtZSkgfHwgLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbClcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBnZXRUYWJsZUNvbHVtbnModGFibGUpIHtcbiAgcmV0dXJuIHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXTtcbn1cbmZ1bmN0aW9uIGdldFZpZXdTZWxlY3RlZEZpZWxkcyh2aWV3KSB7XG4gIHJldHVybiB2aWV3W1ZpZXdCYXNlQ29uZmlnXS5zZWxlY3RlZEZpZWxkcztcbn1cbmZ1bmN0aW9uIGdldFRhYmxlTGlrZU5hbWUodGFibGUpIHtcbiAgcmV0dXJuIGlzKHRhYmxlLCBTdWJxdWVyeSkgPyB0YWJsZS5fLmFsaWFzIDogaXModGFibGUsIFZpZXcpID8gdGFibGVbVmlld0Jhc2VDb25maWddLm5hbWUgOiBpcyh0YWJsZSwgU1FMKSA/IHZvaWQgMCA6IHRhYmxlW1RhYmxlLlN5bWJvbC5Jc0FsaWFzXSA/IHRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXSA6IHRhYmxlW1RhYmxlLlN5bWJvbC5CYXNlTmFtZV07XG59XG5mdW5jdGlvbiBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnKGEsIGIpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiB0eXBlb2YgYSA9PT0gXCJzdHJpbmdcIiAmJiBhLmxlbmd0aCA+IDAgPyBhIDogXCJcIixcbiAgICBjb25maWc6IHR5cGVvZiBhID09PSBcIm9iamVjdFwiID8gYSA6IGJcbiAgfTtcbn1cbmNvbnN0IF8gPSB7fTtcbmNvbnN0IF9fID0ge307XG5mdW5jdGlvbiBpc0NvbmZpZyhkYXRhKSB7XG4gIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGlmIChkYXRhLmNvbnN0cnVjdG9yLm5hbWUgIT09IFwiT2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgaWYgKFwibG9nZ2VyXCIgaW4gZGF0YSkge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgZGF0YVtcImxvZ2dlclwiXTtcbiAgICBpZiAodHlwZSAhPT0gXCJib29sZWFuXCIgJiYgKHR5cGUgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGRhdGFbXCJsb2dnZXJcIl1bXCJsb2dRdWVyeVwiXSAhPT0gXCJmdW5jdGlvblwiKSAmJiB0eXBlICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKFwic2NoZW1hXCIgaW4gZGF0YSkge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgZGF0YVtcInNjaGVtYVwiXTtcbiAgICBpZiAodHlwZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKFwiY2FzaW5nXCIgaW4gZGF0YSkge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgZGF0YVtcImNhc2luZ1wiXTtcbiAgICBpZiAodHlwZSAhPT0gXCJzdHJpbmdcIiAmJiB0eXBlICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKFwibW9kZVwiIGluIGRhdGEpIHtcbiAgICBpZiAoZGF0YVtcIm1vZGVcIl0gIT09IFwiZGVmYXVsdFwiIHx8IGRhdGFbXCJtb2RlXCJdICE9PSBcInBsYW5ldHNjYWxlXCIgfHwgZGF0YVtcIm1vZGVcIl0gIT09IHZvaWQgMCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChcImNvbm5lY3Rpb25cIiBpbiBkYXRhKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBkYXRhW1wiY29ubmVjdGlvblwiXTtcbiAgICBpZiAodHlwZSAhPT0gXCJzdHJpbmdcIiAmJiB0eXBlICE9PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoXCJjbGllbnRcIiBpbiBkYXRhKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBkYXRhW1wiY2xpZW50XCJdO1xuICAgIGlmICh0eXBlICE9PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cbmNvbnN0IHRleHREZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyID09PSBcInVuZGVmaW5lZFwiID8gbnVsbCA6IG5ldyBUZXh0RGVjb2RlcigpO1xuZXhwb3J0IHtcbiAgYXBwbHlNaXhpbnMsXG4gIGdldENvbHVtbk5hbWVBbmRDb25maWcsXG4gIGdldFRhYmxlQ29sdW1ucyxcbiAgZ2V0VGFibGVMaWtlTmFtZSxcbiAgZ2V0Vmlld1NlbGVjdGVkRmllbGRzLFxuICBoYXZlU2FtZUtleXMsXG4gIGlzQ29uZmlnLFxuICBtYXBSZXN1bHRSb3csXG4gIG1hcFVwZGF0ZVNldCxcbiAgb3JkZXJTZWxlY3RlZEZpZWxkcyxcbiAgdGV4dERlY29kZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZU5hbWUgfSBmcm9tIFwiLi4vdGFibGUudXRpbHMuanNcIjtcbmNsYXNzIEZvcmVpZ25LZXlCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlRm9yZWlnbktleUJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICByZWZlcmVuY2U7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX29uVXBkYXRlO1xuICAvKiogQGludGVybmFsICovXG4gIF9vbkRlbGV0ZTtcbiAgY29uc3RydWN0b3IoY29uZmlnLCBhY3Rpb25zKSB7XG4gICAgdGhpcy5yZWZlcmVuY2UgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IG5hbWUsIGNvbHVtbnMsIGZvcmVpZ25Db2x1bW5zIH0gPSBjb25maWcoKTtcbiAgICAgIHJldHVybiB7IG5hbWUsIGNvbHVtbnMsIGZvcmVpZ25UYWJsZTogZm9yZWlnbkNvbHVtbnNbMF0udGFibGUsIGZvcmVpZ25Db2x1bW5zIH07XG4gICAgfTtcbiAgICBpZiAoYWN0aW9ucykge1xuICAgICAgdGhpcy5fb25VcGRhdGUgPSBhY3Rpb25zLm9uVXBkYXRlO1xuICAgICAgdGhpcy5fb25EZWxldGUgPSBhY3Rpb25zLm9uRGVsZXRlO1xuICAgIH1cbiAgfVxuICBvblVwZGF0ZShhY3Rpb24pIHtcbiAgICB0aGlzLl9vblVwZGF0ZSA9IGFjdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvbkRlbGV0ZShhY3Rpb24pIHtcbiAgICB0aGlzLl9vbkRlbGV0ZSA9IGFjdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBGb3JlaWduS2V5KHRhYmxlLCB0aGlzKTtcbiAgfVxufVxuY2xhc3MgRm9yZWlnbktleSB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBidWlsZGVyKSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMucmVmZXJlbmNlID0gYnVpbGRlci5yZWZlcmVuY2U7XG4gICAgdGhpcy5vblVwZGF0ZSA9IGJ1aWxkZXIuX29uVXBkYXRlO1xuICAgIHRoaXMub25EZWxldGUgPSBidWlsZGVyLl9vbkRlbGV0ZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVGb3JlaWduS2V5XCI7XG4gIHJlZmVyZW5jZTtcbiAgb25VcGRhdGU7XG4gIG9uRGVsZXRlO1xuICBnZXROYW1lKCkge1xuICAgIGNvbnN0IHsgbmFtZSwgY29sdW1ucywgZm9yZWlnbkNvbHVtbnMgfSA9IHRoaXMucmVmZXJlbmNlKCk7XG4gICAgY29uc3QgY29sdW1uTmFtZXMgPSBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSk7XG4gICAgY29uc3QgZm9yZWlnbkNvbHVtbk5hbWVzID0gZm9yZWlnbkNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKTtcbiAgICBjb25zdCBjaHVua3MgPSBbXG4gICAgICB0aGlzLnRhYmxlW1RhYmxlTmFtZV0sXG4gICAgICAuLi5jb2x1bW5OYW1lcyxcbiAgICAgIGZvcmVpZ25Db2x1bW5zWzBdLnRhYmxlW1RhYmxlTmFtZV0sXG4gICAgICAuLi5mb3JlaWduQ29sdW1uTmFtZXNcbiAgICBdO1xuICAgIHJldHVybiBuYW1lID8/IGAke2NodW5rcy5qb2luKFwiX1wiKX1fZmtgO1xuICB9XG59XG5mdW5jdGlvbiBmb3JlaWduS2V5KGNvbmZpZykge1xuICBmdW5jdGlvbiBtYXBwZWRDb25maWcoKSB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3QgeyBuYW1lLCBjb2x1bW5zLCBmb3JlaWduQ29sdW1ucyB9ID0gY29uZmlnKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBjb2x1bW5zLFxuICAgICAgICBmb3JlaWduQ29sdW1uc1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuICByZXR1cm4gbmV3IEZvcmVpZ25LZXlCdWlsZGVyKG1hcHBlZENvbmZpZyk7XG59XG5leHBvcnQge1xuICBGb3JlaWduS2V5LFxuICBGb3JlaWduS2V5QnVpbGRlcixcbiAgZm9yZWlnbktleVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvcmVpZ24ta2V5cy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZU5hbWUgfSBmcm9tIFwiLi4vdGFibGUudXRpbHMuanNcIjtcbmZ1bmN0aW9uIHVuaXF1ZUtleU5hbWUodGFibGUsIGNvbHVtbnMpIHtcbiAgcmV0dXJuIGAke3RhYmxlW1RhYmxlTmFtZV19XyR7Y29sdW1ucy5qb2luKFwiX1wiKX1fdW5pcXVlYDtcbn1cbmZ1bmN0aW9uIHVuaXF1ZShuYW1lKSB7XG4gIHJldHVybiBuZXcgVW5pcXVlT25Db25zdHJhaW50QnVpbGRlcihuYW1lKTtcbn1cbmNsYXNzIFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoY29sdW1ucywgbmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVVbmlxdWVDb25zdHJhaW50QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbHVtbnM7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnQodGFibGUsIHRoaXMuY29sdW1ucywgdGhpcy5uYW1lKTtcbiAgfVxufVxuY2xhc3MgVW5pcXVlT25Db25zdHJhaW50QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVVuaXF1ZU9uQ29uc3RyYWludEJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBuYW1lO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuICBvbiguLi5jb2x1bW5zKSB7XG4gICAgcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50QnVpbGRlcihjb2x1bW5zLCB0aGlzLm5hbWUpO1xuICB9XG59XG5jbGFzcyBVbmlxdWVDb25zdHJhaW50IHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbHVtbnMsIG5hbWUpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgICB0aGlzLm5hbWUgPSBuYW1lID8/IHVuaXF1ZUtleU5hbWUodGhpcy50YWJsZSwgdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSkpO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVVuaXF1ZUNvbnN0cmFpbnRcIjtcbiAgY29sdW1ucztcbiAgbmFtZTtcbiAgZ2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG59XG5leHBvcnQge1xuICBVbmlxdWVDb25zdHJhaW50LFxuICBVbmlxdWVDb25zdHJhaW50QnVpbGRlcixcbiAgVW5pcXVlT25Db25zdHJhaW50QnVpbGRlcixcbiAgdW5pcXVlLFxuICB1bmlxdWVLZXlOYW1lXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5pcXVlLWNvbnN0cmFpbnQuanMubWFwIiwKICAgICJpbXBvcnQgeyBDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4uLy4uL2NvbHVtbi1idWlsZGVyLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi4vLi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgRm9yZWlnbktleUJ1aWxkZXIgfSBmcm9tIFwiLi4vZm9yZWlnbi1rZXlzLmpzXCI7XG5pbXBvcnQgeyB1bmlxdWVLZXlOYW1lIH0gZnJvbSBcIi4uL3VuaXF1ZS1jb25zdHJhaW50LmpzXCI7XG5jbGFzcyBTUUxpdGVDb2x1bW5CdWlsZGVyIGV4dGVuZHMgQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUNvbHVtbkJ1aWxkZXJcIjtcbiAgZm9yZWlnbktleUNvbmZpZ3MgPSBbXTtcbiAgcmVmZXJlbmNlcyhyZWYsIGFjdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuZm9yZWlnbktleUNvbmZpZ3MucHVzaCh7IHJlZiwgYWN0aW9ucyB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB1bmlxdWUobmFtZSkge1xuICAgIHRoaXMuY29uZmlnLmlzVW5pcXVlID0gdHJ1ZTtcbiAgICB0aGlzLmNvbmZpZy51bmlxdWVOYW1lID0gbmFtZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZW5lcmF0ZWRBbHdheXNBcyhhcywgY29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkID0ge1xuICAgICAgYXMsXG4gICAgICB0eXBlOiBcImFsd2F5c1wiLFxuICAgICAgbW9kZTogY29uZmlnPy5tb2RlID8/IFwidmlydHVhbFwiXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkRm9yZWlnbktleXMoY29sdW1uLCB0YWJsZSkge1xuICAgIHJldHVybiB0aGlzLmZvcmVpZ25LZXlDb25maWdzLm1hcCgoeyByZWYsIGFjdGlvbnMgfSkgPT4ge1xuICAgICAgcmV0dXJuICgocmVmMiwgYWN0aW9uczIpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBGb3JlaWduS2V5QnVpbGRlcigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZm9yZWlnbkNvbHVtbiA9IHJlZjIoKTtcbiAgICAgICAgICByZXR1cm4geyBjb2x1bW5zOiBbY29sdW1uXSwgZm9yZWlnbkNvbHVtbnM6IFtmb3JlaWduQ29sdW1uXSB9O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGFjdGlvbnMyLm9uVXBkYXRlKSB7XG4gICAgICAgICAgYnVpbGRlci5vblVwZGF0ZShhY3Rpb25zMi5vblVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvbnMyLm9uRGVsZXRlKSB7XG4gICAgICAgICAgYnVpbGRlci5vbkRlbGV0ZShhY3Rpb25zMi5vbkRlbGV0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQodGFibGUpO1xuICAgICAgfSkocmVmLCBhY3Rpb25zKTtcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQ29sdW1uIGV4dGVuZHMgQ29sdW1uIHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbmZpZykge1xuICAgIGlmICghY29uZmlnLnVuaXF1ZU5hbWUpIHtcbiAgICAgIGNvbmZpZy51bmlxdWVOYW1lID0gdW5pcXVlS2V5TmFtZSh0YWJsZSwgW2NvbmZpZy5uYW1lXSk7XG4gICAgfVxuICAgIHN1cGVyKHRhYmxlLCBjb25maWcpO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVDb2x1bW5cIjtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZUNvbHVtbixcbiAgU1FMaXRlQ29sdW1uQnVpbGRlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbW1vbi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnLCB0ZXh0RGVjb2RlciB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uLCBTUUxpdGVDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBTUUxpdGVCaWdJbnRCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJpZ0ludEJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwiYmlnaW50XCIsIFwiU1FMaXRlQmlnSW50XCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJpZ0ludCh0YWJsZSwgdGhpcy5jb25maWcpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVCaWdJbnQgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCaWdJbnRcIjtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJibG9iXCI7XG4gIH1cbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgQnVmZmVyLmZyb20pIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBCdWZmZXIuZnJvbSh2YWx1ZSkgOiB2YWx1ZS5idWZmZXIgPyBCdWZmZXIuZnJvbSh2YWx1ZS5idWZmZXIsIHZhbHVlLmJ5dGVPZmZzZXQsIHZhbHVlLmJ5dGVMZW5ndGgpIDogQnVmZmVyLmZyb20odmFsdWUpO1xuICAgICAgcmV0dXJuIEJpZ0ludChidWYudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIEJpZ0ludCh0ZXh0RGVjb2Rlci5kZWNvZGUodmFsdWUpKTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlLnRvU3RyaW5nKCkpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVCbG9iSnNvbkJ1aWxkZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW5CdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmxvYkpzb25CdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcImpzb25cIiwgXCJTUUxpdGVCbG9iSnNvblwiKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCbG9iSnNvbihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVCbG9iSnNvbiBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJsb2JKc29uXCI7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwiYmxvYlwiO1xuICB9XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiICYmIEJ1ZmZlci5mcm9tKSB7XG4gICAgICBjb25zdCBidWYgPSBCdWZmZXIuaXNCdWZmZXIodmFsdWUpID8gdmFsdWUgOiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyID8gQnVmZmVyLmZyb20odmFsdWUpIDogdmFsdWUuYnVmZmVyID8gQnVmZmVyLmZyb20odmFsdWUuYnVmZmVyLCB2YWx1ZS5ieXRlT2Zmc2V0LCB2YWx1ZS5ieXRlTGVuZ3RoKSA6IEJ1ZmZlci5mcm9tKHZhbHVlKTtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGJ1Zi50b1N0cmluZyhcInV0ZjhcIikpO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0RGVjb2Rlci5kZWNvZGUodmFsdWUpKTtcbiAgfVxuICBtYXBUb0RyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJsb2JCdWZmZXJCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJsb2JCdWZmZXJCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcImJ1ZmZlclwiLCBcIlNRTGl0ZUJsb2JCdWZmZXJcIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQmxvYkJ1ZmZlcih0YWJsZSwgdGhpcy5jb25maWcpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVCbG9iQnVmZmVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQmxvYkJ1ZmZlclwiO1xuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUpO1xuICB9XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwiYmxvYlwiO1xuICB9XG59XG5mdW5jdGlvbiBibG9iKGEsIGIpIHtcbiAgY29uc3QgeyBuYW1lLCBjb25maWcgfSA9IGdldENvbHVtbk5hbWVBbmRDb25maWcoYSwgYik7XG4gIGlmIChjb25maWc/Lm1vZGUgPT09IFwianNvblwiKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVCbG9iSnNvbkJ1aWxkZXIobmFtZSk7XG4gIH1cbiAgaWYgKGNvbmZpZz8ubW9kZSA9PT0gXCJiaWdpbnRcIikge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQmlnSW50QnVpbGRlcihuYW1lKTtcbiAgfVxuICByZXR1cm4gbmV3IFNRTGl0ZUJsb2JCdWZmZXJCdWlsZGVyKG5hbWUpO1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlQmlnSW50LFxuICBTUUxpdGVCaWdJbnRCdWlsZGVyLFxuICBTUUxpdGVCbG9iQnVmZmVyLFxuICBTUUxpdGVCbG9iQnVmZmVyQnVpbGRlcixcbiAgU1FMaXRlQmxvYkpzb24sXG4gIFNRTGl0ZUJsb2JKc29uQnVpbGRlcixcbiAgYmxvYlxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJsb2IuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uLCBTUUxpdGVDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBTUUxpdGVDdXN0b21Db2x1bW5CdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUN1c3RvbUNvbHVtbkJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgZmllbGRDb25maWcsIGN1c3RvbVR5cGVQYXJhbXMpIHtcbiAgICBzdXBlcihuYW1lLCBcImN1c3RvbVwiLCBcIlNRTGl0ZUN1c3RvbUNvbHVtblwiKTtcbiAgICB0aGlzLmNvbmZpZy5maWVsZENvbmZpZyA9IGZpZWxkQ29uZmlnO1xuICAgIHRoaXMuY29uZmlnLmN1c3RvbVR5cGVQYXJhbXMgPSBjdXN0b21UeXBlUGFyYW1zO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUN1c3RvbUNvbHVtbihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVDdXN0b21Db2x1bW4gZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVDdXN0b21Db2x1bW5cIjtcbiAgc3FsTmFtZTtcbiAgbWFwVG87XG4gIG1hcEZyb207XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICBzdXBlcih0YWJsZSwgY29uZmlnKTtcbiAgICB0aGlzLnNxbE5hbWUgPSBjb25maWcuY3VzdG9tVHlwZVBhcmFtcy5kYXRhVHlwZShjb25maWcuZmllbGRDb25maWcpO1xuICAgIHRoaXMubWFwVG8gPSBjb25maWcuY3VzdG9tVHlwZVBhcmFtcy50b0RyaXZlcjtcbiAgICB0aGlzLm1hcEZyb20gPSBjb25maWcuY3VzdG9tVHlwZVBhcmFtcy5mcm9tRHJpdmVyO1xuICB9XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3FsTmFtZTtcbiAgfVxuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMubWFwRnJvbSA9PT0gXCJmdW5jdGlvblwiID8gdGhpcy5tYXBGcm9tKHZhbHVlKSA6IHZhbHVlO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMubWFwVG8gPT09IFwiZnVuY3Rpb25cIiA/IHRoaXMubWFwVG8odmFsdWUpIDogdmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGN1c3RvbVR5cGUoY3VzdG9tVHlwZVBhcmFtcykge1xuICByZXR1cm4gKGEsIGIpID0+IHtcbiAgICBjb25zdCB7IG5hbWUsIGNvbmZpZyB9ID0gZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyhhLCBiKTtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUN1c3RvbUNvbHVtbkJ1aWxkZXIoXG4gICAgICBuYW1lLFxuICAgICAgY29uZmlnLFxuICAgICAgY3VzdG9tVHlwZVBhcmFtc1xuICAgICk7XG4gIH07XG59XG5leHBvcnQge1xuICBTUUxpdGVDdXN0b21Db2x1bW4sXG4gIFNRTGl0ZUN1c3RvbUNvbHVtbkJ1aWxkZXIsXG4gIGN1c3RvbVR5cGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jdXN0b20uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgc3FsIH0gZnJvbSBcIi4uLy4uL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IGdldENvbHVtbk5hbWVBbmRDb25maWcgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiwgU1FMaXRlQ29sdW1uQnVpbGRlciB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuY2xhc3MgU1FMaXRlQmFzZUludGVnZXJCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUJhc2VJbnRlZ2VyQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBkYXRhVHlwZSwgY29sdW1uVHlwZSkge1xuICAgIHN1cGVyKG5hbWUsIGRhdGFUeXBlLCBjb2x1bW5UeXBlKTtcbiAgICB0aGlzLmNvbmZpZy5hdXRvSW5jcmVtZW50ID0gZmFsc2U7XG4gIH1cbiAgcHJpbWFyeUtleShjb25maWcpIHtcbiAgICBpZiAoY29uZmlnPy5hdXRvSW5jcmVtZW50KSB7XG4gICAgICB0aGlzLmNvbmZpZy5hdXRvSW5jcmVtZW50ID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5jb25maWcuaGFzRGVmYXVsdCA9IHRydWU7XG4gICAgcmV0dXJuIHN1cGVyLnByaW1hcnlLZXkoKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQmFzZUludGVnZXIgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCYXNlSW50ZWdlclwiO1xuICBhdXRvSW5jcmVtZW50ID0gdGhpcy5jb25maWcuYXV0b0luY3JlbWVudDtcbiAgZ2V0U1FMVHlwZSgpIHtcbiAgICByZXR1cm4gXCJpbnRlZ2VyXCI7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUludGVnZXJCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQmFzZUludGVnZXJCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW50ZWdlckJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSkge1xuICAgIHN1cGVyKG5hbWUsIFwibnVtYmVyXCIsIFwiU1FMaXRlSW50ZWdlclwiKTtcbiAgfVxuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlSW50ZWdlcihcbiAgICAgIHRhYmxlLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59XG5jbGFzcyBTUUxpdGVJbnRlZ2VyIGV4dGVuZHMgU1FMaXRlQmFzZUludGVnZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVJbnRlZ2VyXCI7XG59XG5jbGFzcyBTUUxpdGVUaW1lc3RhbXBCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQmFzZUludGVnZXJCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGltZXN0YW1wQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lLCBtb2RlKSB7XG4gICAgc3VwZXIobmFtZSwgXCJkYXRlXCIsIFwiU1FMaXRlVGltZXN0YW1wXCIpO1xuICAgIHRoaXMuY29uZmlnLm1vZGUgPSBtb2RlO1xuICB9XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGRlZmF1bHQoKWAgd2l0aCB5b3VyIG93biBleHByZXNzaW9uIGluc3RlYWQuXG4gICAqXG4gICAqIEFkZHMgYERFRkFVTFQgKGNhc3QoKGp1bGlhbmRheSgnbm93JykgLSAyNDQwNTg3LjUpKjg2NDAwMDAwIGFzIGludGVnZXIpKWAgdG8gdGhlIGNvbHVtbiwgd2hpY2ggaXMgdGhlIGN1cnJlbnQgZXBvY2ggdGltZXN0YW1wIGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIGRlZmF1bHROb3coKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdChzcWxgKGNhc3QoKGp1bGlhbmRheSgnbm93JykgLSAyNDQwNTg3LjUpKjg2NDAwMDAwIGFzIGludGVnZXIpKWApO1xuICB9XG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVUaW1lc3RhbXAoXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlVGltZXN0YW1wIGV4dGVuZHMgU1FMaXRlQmFzZUludGVnZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUaW1lc3RhbXBcIjtcbiAgbW9kZSA9IHRoaXMuY29uZmlnLm1vZGU7XG4gIG1hcEZyb21Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5tb2RlID09PSBcInRpbWVzdGFtcFwiKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUgKiAxZTMpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICBjb25zdCB1bml4ID0gdmFsdWUuZ2V0VGltZSgpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5tb2RlID09PSBcInRpbWVzdGFtcFwiKSB7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcih1bml4IC8gMWUzKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuaXg7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZUJvb2xlYW5CdWlsZGVyIGV4dGVuZHMgU1FMaXRlQmFzZUludGVnZXJCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQm9vbGVhbkJ1aWxkZXJcIjtcbiAgY29uc3RydWN0b3IobmFtZSwgbW9kZSkge1xuICAgIHN1cGVyKG5hbWUsIFwiYm9vbGVhblwiLCBcIlNRTGl0ZUJvb2xlYW5cIik7XG4gICAgdGhpcy5jb25maWcubW9kZSA9IG1vZGU7XG4gIH1cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZUJvb2xlYW4oXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlQm9vbGVhbiBleHRlbmRzIFNRTGl0ZUJhc2VJbnRlZ2VyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQm9vbGVhblwiO1xuICBtb2RlID0gdGhpcy5jb25maWcubW9kZTtcbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSkgPT09IDE7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA/IDEgOiAwO1xuICB9XG59XG5mdW5jdGlvbiBpbnRlZ2VyKGEsIGIpIHtcbiAgY29uc3QgeyBuYW1lLCBjb25maWcgfSA9IGdldENvbHVtbk5hbWVBbmRDb25maWcoYSwgYik7XG4gIGlmIChjb25maWc/Lm1vZGUgPT09IFwidGltZXN0YW1wXCIgfHwgY29uZmlnPy5tb2RlID09PSBcInRpbWVzdGFtcF9tc1wiKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVUaW1lc3RhbXBCdWlsZGVyKG5hbWUsIGNvbmZpZy5tb2RlKTtcbiAgfVxuICBpZiAoY29uZmlnPy5tb2RlID09PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQm9vbGVhbkJ1aWxkZXIobmFtZSwgY29uZmlnLm1vZGUpO1xuICB9XG4gIHJldHVybiBuZXcgU1FMaXRlSW50ZWdlckJ1aWxkZXIobmFtZSk7XG59XG5jb25zdCBpbnQgPSBpbnRlZ2VyO1xuZXhwb3J0IHtcbiAgU1FMaXRlQmFzZUludGVnZXIsXG4gIFNRTGl0ZUJhc2VJbnRlZ2VyQnVpbGRlcixcbiAgU1FMaXRlQm9vbGVhbixcbiAgU1FMaXRlQm9vbGVhbkJ1aWxkZXIsXG4gIFNRTGl0ZUludGVnZXIsXG4gIFNRTGl0ZUludGVnZXJCdWlsZGVyLFxuICBTUUxpdGVUaW1lc3RhbXAsXG4gIFNRTGl0ZVRpbWVzdGFtcEJ1aWxkZXIsXG4gIGludCxcbiAgaW50ZWdlclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWludGVnZXIuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29sdW1uTmFtZUFuZENvbmZpZyB9IGZyb20gXCIuLi8uLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlQ29sdW1uLCBTUUxpdGVDb2x1bW5CdWlsZGVyIH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5jbGFzcyBTUUxpdGVOdW1lcmljQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVOdW1lcmljQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJzdHJpbmdcIiwgXCJTUUxpdGVOdW1lcmljXCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZU51bWVyaWMoXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlTnVtZXJpYyBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZU51bWVyaWNcIjtcbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbHVlO1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwibnVtZXJpY1wiO1xuICB9XG59XG5jbGFzcyBTUUxpdGVOdW1lcmljTnVtYmVyQnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVOdW1lcmljTnVtYmVyQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJudW1iZXJcIiwgXCJTUUxpdGVOdW1lcmljTnVtYmVyXCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZU51bWVyaWNOdW1iZXIoXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlTnVtZXJpY051bWJlciBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZU51bWVyaWNOdW1iZXJcIjtcbiAgbWFwRnJvbURyaXZlclZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHZhbHVlO1xuICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICB9XG4gIG1hcFRvRHJpdmVyVmFsdWUgPSBTdHJpbmc7XG4gIGdldFNRTFR5cGUoKSB7XG4gICAgcmV0dXJuIFwibnVtZXJpY1wiO1xuICB9XG59XG5jbGFzcyBTUUxpdGVOdW1lcmljQmlnSW50QnVpbGRlciBleHRlbmRzIFNRTGl0ZUNvbHVtbkJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVOdW1lcmljQmlnSW50QnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJiaWdpbnRcIiwgXCJTUUxpdGVOdW1lcmljQmlnSW50XCIpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYnVpbGQodGFibGUpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZU51bWVyaWNCaWdJbnQoXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlTnVtZXJpY0JpZ0ludCBleHRlbmRzIFNRTGl0ZUNvbHVtbiB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZU51bWVyaWNCaWdJbnRcIjtcbiAgbWFwRnJvbURyaXZlclZhbHVlID0gQmlnSW50O1xuICBtYXBUb0RyaXZlclZhbHVlID0gU3RyaW5nO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcIm51bWVyaWNcIjtcbiAgfVxufVxuZnVuY3Rpb24gbnVtZXJpYyhhLCBiKSB7XG4gIGNvbnN0IHsgbmFtZSwgY29uZmlnIH0gPSBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnKGEsIGIpO1xuICBjb25zdCBtb2RlID0gY29uZmlnPy5tb2RlO1xuICByZXR1cm4gbW9kZSA9PT0gXCJudW1iZXJcIiA/IG5ldyBTUUxpdGVOdW1lcmljTnVtYmVyQnVpbGRlcihuYW1lKSA6IG1vZGUgPT09IFwiYmlnaW50XCIgPyBuZXcgU1FMaXRlTnVtZXJpY0JpZ0ludEJ1aWxkZXIobmFtZSkgOiBuZXcgU1FMaXRlTnVtZXJpY0J1aWxkZXIobmFtZSk7XG59XG5leHBvcnQge1xuICBTUUxpdGVOdW1lcmljLFxuICBTUUxpdGVOdW1lcmljQmlnSW50LFxuICBTUUxpdGVOdW1lcmljQmlnSW50QnVpbGRlcixcbiAgU1FMaXRlTnVtZXJpY0J1aWxkZXIsXG4gIFNRTGl0ZU51bWVyaWNOdW1iZXIsXG4gIFNRTGl0ZU51bWVyaWNOdW1iZXJCdWlsZGVyLFxuICBudW1lcmljXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bnVtZXJpYy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4sIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFNRTGl0ZVJlYWxCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVJlYWxCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcihuYW1lLCBcIm51bWJlclwiLCBcIlNRTGl0ZVJlYWxcIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlUmVhbCh0YWJsZSwgdGhpcy5jb25maWcpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVSZWFsIGV4dGVuZHMgU1FMaXRlQ29sdW1uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlUmVhbFwiO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcInJlYWxcIjtcbiAgfVxufVxuZnVuY3Rpb24gcmVhbChuYW1lKSB7XG4gIHJldHVybiBuZXcgU1FMaXRlUmVhbEJ1aWxkZXIobmFtZSA/PyBcIlwiKTtcbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZVJlYWwsXG4gIFNRTGl0ZVJlYWxCdWlsZGVyLFxuICByZWFsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVhbC5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb2x1bW4sIFNRTGl0ZUNvbHVtbkJ1aWxkZXIgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmNsYXNzIFNRTGl0ZVRleHRCdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRleHRCdWlsZGVyXCI7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGNvbmZpZykge1xuICAgIHN1cGVyKG5hbWUsIFwic3RyaW5nXCIsIFwiU1FMaXRlVGV4dFwiKTtcbiAgICB0aGlzLmNvbmZpZy5lbnVtVmFsdWVzID0gY29uZmlnLmVudW07XG4gICAgdGhpcy5jb25maWcubGVuZ3RoID0gY29uZmlnLmxlbmd0aDtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGJ1aWxkKHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVUZXh0KFxuICAgICAgdGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVRleHQgZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUZXh0XCI7XG4gIGVudW1WYWx1ZXMgPSB0aGlzLmNvbmZpZy5lbnVtVmFsdWVzO1xuICBsZW5ndGggPSB0aGlzLmNvbmZpZy5sZW5ndGg7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICBzdXBlcih0YWJsZSwgY29uZmlnKTtcbiAgfVxuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBgdGV4dCR7dGhpcy5jb25maWcubGVuZ3RoID8gYCgke3RoaXMuY29uZmlnLmxlbmd0aH0pYCA6IFwiXCJ9YDtcbiAgfVxufVxuY2xhc3MgU1FMaXRlVGV4dEpzb25CdWlsZGVyIGV4dGVuZHMgU1FMaXRlQ29sdW1uQnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVRleHRKc29uQnVpbGRlclwiO1xuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIobmFtZSwgXCJqc29uXCIsIFwiU1FMaXRlVGV4dEpzb25cIik7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVGV4dEpzb24oXG4gICAgICB0YWJsZSxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlVGV4dEpzb24gZXh0ZW5kcyBTUUxpdGVDb2x1bW4ge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUZXh0SnNvblwiO1xuICBnZXRTUUxUeXBlKCkge1xuICAgIHJldHVybiBcInRleHRcIjtcbiAgfVxuICBtYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gIH1cbiAgbWFwVG9Ecml2ZXJWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHRleHQoYSwgYiA9IHt9KSB7XG4gIGNvbnN0IHsgbmFtZSwgY29uZmlnIH0gPSBnZXRDb2x1bW5OYW1lQW5kQ29uZmlnKGEsIGIpO1xuICBpZiAoY29uZmlnLm1vZGUgPT09IFwianNvblwiKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVUZXh0SnNvbkJ1aWxkZXIobmFtZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTUUxpdGVUZXh0QnVpbGRlcihuYW1lLCBjb25maWcpO1xufVxuZXhwb3J0IHtcbiAgU1FMaXRlVGV4dCxcbiAgU1FMaXRlVGV4dEJ1aWxkZXIsXG4gIFNRTGl0ZVRleHRKc29uLFxuICBTUUxpdGVUZXh0SnNvbkJ1aWxkZXIsXG4gIHRleHRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZXh0LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgQ29sdW1uQWxpYXNQcm94eUhhbmRsZXIsIFRhYmxlQWxpYXNQcm94eUhhbmRsZXIgfSBmcm9tIFwiLi9hbGlhcy5qc1wiO1xuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSBcIi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU1FMLCBWaWV3IH0gZnJvbSBcIi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgVmlld0Jhc2VDb25maWcgfSBmcm9tIFwiLi92aWV3LWNvbW1vbi5qc1wiO1xuY2xhc3MgU2VsZWN0aW9uUHJveHlIYW5kbGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU2VsZWN0aW9uUHJveHlIYW5kbGVyXCI7XG4gIGNvbmZpZztcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSB7IC4uLmNvbmZpZyB9O1xuICB9XG4gIGdldChzdWJxdWVyeSwgcHJvcCkge1xuICAgIGlmIChwcm9wID09PSBcIl9cIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3VicXVlcnlbXCJfXCJdLFxuICAgICAgICBzZWxlY3RlZEZpZWxkczogbmV3IFByb3h5KFxuICAgICAgICAgIHN1YnF1ZXJ5Ll8uc2VsZWN0ZWRGaWVsZHMsXG4gICAgICAgICAgdGhpc1xuICAgICAgICApXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAocHJvcCA9PT0gVmlld0Jhc2VDb25maWcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN1YnF1ZXJ5W1ZpZXdCYXNlQ29uZmlnXSxcbiAgICAgICAgc2VsZWN0ZWRGaWVsZHM6IG5ldyBQcm94eShcbiAgICAgICAgICBzdWJxdWVyeVtWaWV3QmFzZUNvbmZpZ10uc2VsZWN0ZWRGaWVsZHMsXG4gICAgICAgICAgdGhpc1xuICAgICAgICApXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHByb3AgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgIHJldHVybiBzdWJxdWVyeVtwcm9wXTtcbiAgICB9XG4gICAgY29uc3QgY29sdW1ucyA9IGlzKHN1YnF1ZXJ5LCBTdWJxdWVyeSkgPyBzdWJxdWVyeS5fLnNlbGVjdGVkRmllbGRzIDogaXMoc3VicXVlcnksIFZpZXcpID8gc3VicXVlcnlbVmlld0Jhc2VDb25maWddLnNlbGVjdGVkRmllbGRzIDogc3VicXVlcnk7XG4gICAgY29uc3QgdmFsdWUgPSBjb2x1bW5zW3Byb3BdO1xuICAgIGlmIChpcyh2YWx1ZSwgU1FMLkFsaWFzZWQpKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcuc3FsQWxpYXNlZEJlaGF2aW9yID09PSBcInNxbFwiICYmICF2YWx1ZS5pc1NlbGVjdGlvbkZpZWxkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zcWw7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHZhbHVlLmNsb25lKCk7XG4gICAgICBuZXdWYWx1ZS5pc1NlbGVjdGlvbkZpZWxkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzKHZhbHVlLCBTUUwpKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcuc3FsQmVoYXZpb3IgPT09IFwic3FsXCIpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgWW91IHRyaWVkIHRvIHJlZmVyZW5jZSBcIiR7cHJvcH1cIiBmaWVsZCBmcm9tIGEgc3VicXVlcnksIHdoaWNoIGlzIGEgcmF3IFNRTCBmaWVsZCwgYnV0IGl0IGRvZXNuJ3QgaGF2ZSBhbiBhbGlhcyBkZWNsYXJlZC4gUGxlYXNlIGFkZCBhbiBhbGlhcyB0byB0aGUgZmllbGQgdXNpbmcgXCIuYXMoJ2FsaWFzJylcIiBtZXRob2QuYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGlzKHZhbHVlLCBDb2x1bW4pKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcuYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eShcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBuZXcgQ29sdW1uQWxpYXNQcm94eUhhbmRsZXIoXG4gICAgICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgICAgIHZhbHVlLnRhYmxlLFxuICAgICAgICAgICAgICBuZXcgVGFibGVBbGlhc1Byb3h5SGFuZGxlcih0aGlzLmNvbmZpZy5hbGlhcywgdGhpcy5jb25maWcucmVwbGFjZU9yaWdpbmFsTmFtZSA/PyBmYWxzZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm94eSh2YWx1ZSwgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih0aGlzLmNvbmZpZykpO1xuICB9XG59XG5leHBvcnQge1xuICBTZWxlY3Rpb25Qcm94eUhhbmRsZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWxlY3Rpb24tcHJveHkuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5jbGFzcyBRdWVyeVByb21pc2Uge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJRdWVyeVByb21pc2VcIjtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ10gPSBcIlF1ZXJ5UHJvbWlzZVwiO1xuICBjYXRjaChvblJlamVjdGVkKSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbih2b2lkIDAsIG9uUmVqZWN0ZWQpO1xuICB9XG4gIGZpbmFsbHkob25GaW5hbGx5KSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICBvbkZpbmFsbHk/LigpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9LFxuICAgICAgKHJlYXNvbikgPT4ge1xuICAgICAgICBvbkZpbmFsbHk/LigpO1xuICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSgpLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpO1xuICB9XG59XG5leHBvcnQge1xuICBRdWVyeVByb21pc2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1xdWVyeS1wcm9taXNlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgYmxvYiB9IGZyb20gXCIuL2Jsb2IuanNcIjtcbmltcG9ydCB7IGN1c3RvbVR5cGUgfSBmcm9tIFwiLi9jdXN0b20uanNcIjtcbmltcG9ydCB7IGludGVnZXIgfSBmcm9tIFwiLi9pbnRlZ2VyLmpzXCI7XG5pbXBvcnQgeyBudW1lcmljIH0gZnJvbSBcIi4vbnVtZXJpYy5qc1wiO1xuaW1wb3J0IHsgcmVhbCB9IGZyb20gXCIuL3JlYWwuanNcIjtcbmltcG9ydCB7IHRleHQgfSBmcm9tIFwiLi90ZXh0LmpzXCI7XG5mdW5jdGlvbiBnZXRTUUxpdGVDb2x1bW5CdWlsZGVycygpIHtcbiAgcmV0dXJuIHtcbiAgICBibG9iLFxuICAgIGN1c3RvbVR5cGUsXG4gICAgaW50ZWdlcixcbiAgICBudW1lcmljLFxuICAgIHJlYWwsXG4gICAgdGV4dFxuICB9O1xufVxuZXhwb3J0IHtcbiAgZ2V0U1FMaXRlQ29sdW1uQnVpbGRlcnNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbGwuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IGdldFNRTGl0ZUNvbHVtbkJ1aWxkZXJzIH0gZnJvbSBcIi4vY29sdW1ucy9hbGwuanNcIjtcbmNvbnN0IElubGluZUZvcmVpZ25LZXlzID0gU3ltYm9sLmZvcihcImRyaXp6bGU6U1FMaXRlSW5saW5lRm9yZWlnbktleXNcIik7XG5jbGFzcyBTUUxpdGVUYWJsZSBleHRlbmRzIFRhYmxlIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVGFibGVcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgU3ltYm9sID0gT2JqZWN0LmFzc2lnbih7fSwgVGFibGUuU3ltYm9sLCB7XG4gICAgSW5saW5lRm9yZWlnbktleXNcbiAgfSk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW1RhYmxlLlN5bWJvbC5Db2x1bW5zXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbSW5saW5lRm9yZWlnbktleXNdID0gW107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0J1aWxkZXJdID0gdm9pZCAwO1xufVxuZnVuY3Rpb24gc3FsaXRlVGFibGVCYXNlKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnLCBzY2hlbWEsIGJhc2VOYW1lID0gbmFtZSkge1xuICBjb25zdCByYXdUYWJsZSA9IG5ldyBTUUxpdGVUYWJsZShuYW1lLCBzY2hlbWEsIGJhc2VOYW1lKTtcbiAgY29uc3QgcGFyc2VkQ29sdW1ucyA9IHR5cGVvZiBjb2x1bW5zID09PSBcImZ1bmN0aW9uXCIgPyBjb2x1bW5zKGdldFNRTGl0ZUNvbHVtbkJ1aWxkZXJzKCkpIDogY29sdW1ucztcbiAgY29uc3QgYnVpbHRDb2x1bW5zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHBhcnNlZENvbHVtbnMpLm1hcCgoW25hbWUyLCBjb2xCdWlsZGVyQmFzZV0pID0+IHtcbiAgICAgIGNvbnN0IGNvbEJ1aWxkZXIgPSBjb2xCdWlsZGVyQmFzZTtcbiAgICAgIGNvbEJ1aWxkZXIuc2V0TmFtZShuYW1lMik7XG4gICAgICBjb25zdCBjb2x1bW4gPSBjb2xCdWlsZGVyLmJ1aWxkKHJhd1RhYmxlKTtcbiAgICAgIHJhd1RhYmxlW0lubGluZUZvcmVpZ25LZXlzXS5wdXNoKC4uLmNvbEJ1aWxkZXIuYnVpbGRGb3JlaWduS2V5cyhjb2x1bW4sIHJhd1RhYmxlKSk7XG4gICAgICByZXR1cm4gW25hbWUyLCBjb2x1bW5dO1xuICAgIH0pXG4gICk7XG4gIGNvbnN0IHRhYmxlID0gT2JqZWN0LmFzc2lnbihyYXdUYWJsZSwgYnVpbHRDb2x1bW5zKTtcbiAgdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdID0gYnVpbHRDb2x1bW5zO1xuICB0YWJsZVtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdDb2x1bW5zXSA9IGJ1aWx0Q29sdW1ucztcbiAgaWYgKGV4dHJhQ29uZmlnKSB7XG4gICAgdGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQnVpbGRlcl0gPSBleHRyYUNvbmZpZztcbiAgfVxuICByZXR1cm4gdGFibGU7XG59XG5jb25zdCBzcWxpdGVUYWJsZSA9IChuYW1lLCBjb2x1bW5zLCBleHRyYUNvbmZpZykgPT4ge1xuICByZXR1cm4gc3FsaXRlVGFibGVCYXNlKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnKTtcbn07XG5mdW5jdGlvbiBzcWxpdGVUYWJsZUNyZWF0b3IoY3VzdG9taXplVGFibGVOYW1lKSB7XG4gIHJldHVybiAobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcpID0+IHtcbiAgICByZXR1cm4gc3FsaXRlVGFibGVCYXNlKGN1c3RvbWl6ZVRhYmxlTmFtZShuYW1lKSwgY29sdW1ucywgZXh0cmFDb25maWcsIHZvaWQgMCwgbmFtZSk7XG4gIH07XG59XG5leHBvcnQge1xuICBJbmxpbmVGb3JlaWduS2V5cyxcbiAgU1FMaXRlVGFibGUsXG4gIHNxbGl0ZVRhYmxlLFxuICBzcWxpdGVUYWJsZUNyZWF0b3Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YWJsZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5jbGFzcyBJbmRleEJ1aWxkZXJPbiB7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIHVuaXF1ZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy51bmlxdWUgPSB1bmlxdWU7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlSW5kZXhCdWlsZGVyT25cIjtcbiAgb24oLi4uY29sdW1ucykge1xuICAgIHJldHVybiBuZXcgSW5kZXhCdWlsZGVyKHRoaXMubmFtZSwgY29sdW1ucywgdGhpcy51bmlxdWUpO1xuICB9XG59XG5jbGFzcyBJbmRleEJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVJbmRleEJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25maWc7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGNvbHVtbnMsIHVuaXF1ZSkge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGNvbHVtbnMsXG4gICAgICB1bmlxdWUsXG4gICAgICB3aGVyZTogdm9pZCAwXG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogQ29uZGl0aW9uIGZvciBwYXJ0aWFsIGluZGV4LlxuICAgKi9cbiAgd2hlcmUoY29uZGl0aW9uKSB7XG4gICAgdGhpcy5jb25maWcud2hlcmUgPSBjb25kaXRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgSW5kZXgodGhpcy5jb25maWcsIHRhYmxlKTtcbiAgfVxufVxuY2xhc3MgSW5kZXgge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVJbmRleFwiO1xuICBjb25maWc7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZywgdGFibGUpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uY29uZmlnLCB0YWJsZSB9O1xuICB9XG59XG5mdW5jdGlvbiBpbmRleChuYW1lKSB7XG4gIHJldHVybiBuZXcgSW5kZXhCdWlsZGVyT24obmFtZSwgZmFsc2UpO1xufVxuZnVuY3Rpb24gdW5pcXVlSW5kZXgobmFtZSkge1xuICByZXR1cm4gbmV3IEluZGV4QnVpbGRlck9uKG5hbWUsIHRydWUpO1xufVxuZXhwb3J0IHtcbiAgSW5kZXgsXG4gIEluZGV4QnVpbGRlcixcbiAgSW5kZXhCdWlsZGVyT24sXG4gIGluZGV4LFxuICB1bmlxdWVJbmRleFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4ZXMuanMubWFwIiwKICAgICJpbXBvcnQgeyBpcyB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFNRTCB9IGZyb20gXCIuLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTdWJxdWVyeSB9IGZyb20gXCIuLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4uL3ZpZXctY29tbW9uLmpzXCI7XG5pbXBvcnQgeyBDaGVja0J1aWxkZXIgfSBmcm9tIFwiLi9jaGVja3MuanNcIjtcbmltcG9ydCB7IEZvcmVpZ25LZXlCdWlsZGVyIH0gZnJvbSBcIi4vZm9yZWlnbi1rZXlzLmpzXCI7XG5pbXBvcnQgeyBJbmRleEJ1aWxkZXIgfSBmcm9tIFwiLi9pbmRleGVzLmpzXCI7XG5pbXBvcnQgeyBQcmltYXJ5S2V5QnVpbGRlciB9IGZyb20gXCIuL3ByaW1hcnkta2V5cy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVGFibGUgfSBmcm9tIFwiLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgVW5pcXVlQ29uc3RyYWludEJ1aWxkZXIgfSBmcm9tIFwiLi91bmlxdWUtY29uc3RyYWludC5qc1wiO1xuZnVuY3Rpb24gZ2V0VGFibGVDb25maWcodGFibGUpIHtcbiAgY29uc3QgY29sdW1ucyA9IE9iamVjdC52YWx1ZXModGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkNvbHVtbnNdKTtcbiAgY29uc3QgaW5kZXhlcyA9IFtdO1xuICBjb25zdCBjaGVja3MgPSBbXTtcbiAgY29uc3QgcHJpbWFyeUtleXMgPSBbXTtcbiAgY29uc3QgdW5pcXVlQ29uc3RyYWludHMgPSBbXTtcbiAgY29uc3QgZm9yZWlnbktleXMgPSBPYmplY3QudmFsdWVzKHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5JbmxpbmVGb3JlaWduS2V5c10pO1xuICBjb25zdCBuYW1lID0gdGFibGVbVGFibGUuU3ltYm9sLk5hbWVdO1xuICBjb25zdCBleHRyYUNvbmZpZ0J1aWxkZXIgPSB0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdCdWlsZGVyXTtcbiAgaWYgKGV4dHJhQ29uZmlnQnVpbGRlciAhPT0gdm9pZCAwKSB7XG4gICAgY29uc3QgZXh0cmFDb25maWcgPSBleHRyYUNvbmZpZ0J1aWxkZXIodGFibGVbU1FMaXRlVGFibGUuU3ltYm9sLkNvbHVtbnNdKTtcbiAgICBjb25zdCBleHRyYVZhbHVlcyA9IEFycmF5LmlzQXJyYXkoZXh0cmFDb25maWcpID8gZXh0cmFDb25maWcuZmxhdCgxKSA6IE9iamVjdC52YWx1ZXMoZXh0cmFDb25maWcpO1xuICAgIGZvciAoY29uc3QgYnVpbGRlciBvZiBPYmplY3QudmFsdWVzKGV4dHJhVmFsdWVzKSkge1xuICAgICAgaWYgKGlzKGJ1aWxkZXIsIEluZGV4QnVpbGRlcikpIHtcbiAgICAgICAgaW5kZXhlcy5wdXNoKGJ1aWxkZXIuYnVpbGQodGFibGUpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXMoYnVpbGRlciwgQ2hlY2tCdWlsZGVyKSkge1xuICAgICAgICBjaGVja3MucHVzaChidWlsZGVyLmJ1aWxkKHRhYmxlKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzKGJ1aWxkZXIsIFVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyKSkge1xuICAgICAgICB1bmlxdWVDb25zdHJhaW50cy5wdXNoKGJ1aWxkZXIuYnVpbGQodGFibGUpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXMoYnVpbGRlciwgUHJpbWFyeUtleUJ1aWxkZXIpKSB7XG4gICAgICAgIHByaW1hcnlLZXlzLnB1c2goYnVpbGRlci5idWlsZCh0YWJsZSkpO1xuICAgICAgfSBlbHNlIGlmIChpcyhidWlsZGVyLCBGb3JlaWduS2V5QnVpbGRlcikpIHtcbiAgICAgICAgZm9yZWlnbktleXMucHVzaChidWlsZGVyLmJ1aWxkKHRhYmxlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgY29sdW1ucyxcbiAgICBpbmRleGVzLFxuICAgIGZvcmVpZ25LZXlzLFxuICAgIGNoZWNrcyxcbiAgICBwcmltYXJ5S2V5cyxcbiAgICB1bmlxdWVDb25zdHJhaW50cyxcbiAgICBuYW1lXG4gIH07XG59XG5mdW5jdGlvbiBleHRyYWN0VXNlZFRhYmxlKHRhYmxlKSB7XG4gIGlmIChpcyh0YWJsZSwgU1FMaXRlVGFibGUpKSB7XG4gICAgcmV0dXJuIFtgJHt0YWJsZVtUYWJsZS5TeW1ib2wuQmFzZU5hbWVdfWBdO1xuICB9XG4gIGlmIChpcyh0YWJsZSwgU3VicXVlcnkpKSB7XG4gICAgcmV0dXJuIHRhYmxlLl8udXNlZFRhYmxlcyA/PyBbXTtcbiAgfVxuICBpZiAoaXModGFibGUsIFNRTCkpIHtcbiAgICByZXR1cm4gdGFibGUudXNlZFRhYmxlcyA/PyBbXTtcbiAgfVxuICByZXR1cm4gW107XG59XG5mdW5jdGlvbiBnZXRWaWV3Q29uZmlnKHZpZXcpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi52aWV3W1ZpZXdCYXNlQ29uZmlnXVxuICAgIC8vIC4uLnZpZXdbU1FMaXRlVmlld0NvbmZpZ10sXG4gIH07XG59XG5leHBvcnQge1xuICBleHRyYWN0VXNlZFRhYmxlLFxuICBnZXRUYWJsZUNvbmZpZyxcbiAgZ2V0Vmlld0NvbmZpZ1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi8uLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5pbXBvcnQgeyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vc2VsZWN0aW9uLXByb3h5LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IG9yZGVyU2VsZWN0ZWRGaWVsZHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IGV4dHJhY3RVc2VkVGFibGUgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmNsYXNzIFNRTGl0ZURlbGV0ZUJhc2UgZXh0ZW5kcyBRdWVyeVByb21pc2Uge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgc2Vzc2lvbiwgZGlhbGVjdCwgd2l0aExpc3QpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5jb25maWcgPSB7IHRhYmxlLCB3aXRoTGlzdCB9O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZURlbGV0ZVwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbmZpZztcbiAgLyoqXG4gICAqIEFkZHMgYSBgd2hlcmVgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBkZWxldGUgb25seSB0aG9zZSByb3dzIHRoYXQgZnVsZmlsbCBhIHNwZWNpZmllZCBjb25kaXRpb24uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvZGVsZXRlfVxuICAgKlxuICAgKiBAcGFyYW0gd2hlcmUgdGhlIGB3aGVyZWAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBZb3UgY2FuIHVzZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgYW5kIGBzcWwgZnVuY3Rpb25gIHRvIGZpbHRlciB0aGUgcm93cyB0byBiZSBkZWxldGVkLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBEZWxldGUgYWxsIGNhcnMgd2l0aCBncmVlbiBjb2xvclxuICAgKiBkYi5kZWxldGUoY2Fycykud2hlcmUoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJykpO1xuICAgKiAvLyBvclxuICAgKiBkYi5kZWxldGUoY2Fycykud2hlcmUoc3FsYCR7Y2Fycy5jb2xvcn0gPSAnZ3JlZW4nYClcbiAgICogYGBgXG4gICAqXG4gICAqIFlvdSBjYW4gbG9naWNhbGx5IGNvbWJpbmUgY29uZGl0aW9uYWwgb3BlcmF0b3JzIHdpdGggYGFuZCgpYCBhbmQgYG9yKClgIG9wZXJhdG9yczpcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gRGVsZXRlIGFsbCBCTVcgY2FycyB3aXRoIGEgZ3JlZW4gY29sb3JcbiAgICogZGIuZGVsZXRlKGNhcnMpLndoZXJlKGFuZChlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSwgZXEoY2Fycy5icmFuZCwgJ0JNVycpKSk7XG4gICAqXG4gICAqIC8vIERlbGV0ZSBhbGwgY2FycyB3aXRoIHRoZSBncmVlbiBvciBibHVlIGNvbG9yXG4gICAqIGRiLmRlbGV0ZShjYXJzKS53aGVyZShvcihlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSwgZXEoY2Fycy5jb2xvciwgJ2JsdWUnKSkpO1xuICAgKiBgYGBcbiAgICovXG4gIHdoZXJlKHdoZXJlKSB7XG4gICAgdGhpcy5jb25maWcud2hlcmUgPSB3aGVyZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcmRlckJ5KC4uLmNvbHVtbnMpIHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbnNbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3Qgb3JkZXJCeSA9IGNvbHVtbnNbMF0oXG4gICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICB0aGlzLmNvbmZpZy50YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10sXG4gICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgY29uc3Qgb3JkZXJCeUFycmF5ID0gQXJyYXkuaXNBcnJheShvcmRlckJ5KSA/IG9yZGVyQnkgOiBbb3JkZXJCeV07XG4gICAgICB0aGlzLmNvbmZpZy5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcmRlckJ5QXJyYXkgPSBjb2x1bW5zO1xuICAgICAgdGhpcy5jb25maWcub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgbGltaXQobGltaXQpIHtcbiAgICB0aGlzLmNvbmZpZy5saW1pdCA9IGxpbWl0O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHJldHVybmluZyhmaWVsZHMgPSB0aGlzLnRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5Db2x1bW5zXSkge1xuICAgIHRoaXMuY29uZmlnLnJldHVybmluZyA9IG9yZGVyU2VsZWN0ZWRGaWVsZHMoZmllbGRzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsZWN0LmJ1aWxkRGVsZXRlUXVlcnkodGhpcy5jb25maWcpO1xuICB9XG4gIHRvU1FMKCkge1xuICAgIGNvbnN0IHsgdHlwaW5nczogX3R5cGluZ3MsIC4uLnJlc3QgfSA9IHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpO1xuICAgIHJldHVybiByZXN0O1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ByZXBhcmUoaXNPbmVUaW1lUXVlcnkgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbltpc09uZVRpbWVRdWVyeSA/IFwicHJlcGFyZU9uZVRpbWVRdWVyeVwiIDogXCJwcmVwYXJlUXVlcnlcIl0oXG4gICAgICB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKSxcbiAgICAgIHRoaXMuY29uZmlnLnJldHVybmluZyxcbiAgICAgIHRoaXMuY29uZmlnLnJldHVybmluZyA/IFwiYWxsXCIgOiBcInJ1blwiLFxuICAgICAgdHJ1ZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJkZWxldGVcIixcbiAgICAgICAgdGFibGVzOiBleHRyYWN0VXNlZFRhYmxlKHRoaXMuY29uZmlnLnRhYmxlKVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJlcGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSk7XG4gIH1cbiAgcnVuID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5ydW4ocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhbGwgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmFsbChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGdldCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuZ2V0KHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgdmFsdWVzID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS52YWx1ZXMocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhc3luYyBleGVjdXRlKHBsYWNlaG9sZGVyVmFsdWVzKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5leGVjdXRlKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfVxuICAkZHluYW1pYygpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuZXhwb3J0IHtcbiAgU1FMaXRlRGVsZXRlQmFzZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlbGV0ZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4vdGFibGUuanNcIjtcbmZ1bmN0aW9uIHRvU25ha2VDYXNlKGlucHV0KSB7XG4gIGNvbnN0IHdvcmRzID0gaW5wdXQucmVwbGFjZSgvWydcXHUyMDE5XS9nLCBcIlwiKS5tYXRjaCgvW1xcZGEtel0rfFtBLVpdKyg/IVthLXpdKXxbQS1aXVtcXGRhLXpdKy9nKSA/PyBbXTtcbiAgcmV0dXJuIHdvcmRzLm1hcCgod29yZCkgPT4gd29yZC50b0xvd2VyQ2FzZSgpKS5qb2luKFwiX1wiKTtcbn1cbmZ1bmN0aW9uIHRvQ2FtZWxDYXNlKGlucHV0KSB7XG4gIGNvbnN0IHdvcmRzID0gaW5wdXQucmVwbGFjZSgvWydcXHUyMDE5XS9nLCBcIlwiKS5tYXRjaCgvW1xcZGEtel0rfFtBLVpdKyg/IVthLXpdKXxbQS1aXVtcXGRhLXpdKy9nKSA/PyBbXTtcbiAgcmV0dXJuIHdvcmRzLnJlZHVjZSgoYWNjLCB3b3JkLCBpKSA9PiB7XG4gICAgY29uc3QgZm9ybWF0dGVkV29yZCA9IGkgPT09IDAgPyB3b3JkLnRvTG93ZXJDYXNlKCkgOiBgJHt3b3JkWzBdLnRvVXBwZXJDYXNlKCl9JHt3b3JkLnNsaWNlKDEpfWA7XG4gICAgcmV0dXJuIGFjYyArIGZvcm1hdHRlZFdvcmQ7XG4gIH0sIFwiXCIpO1xufVxuZnVuY3Rpb24gbm9vcENhc2UoaW5wdXQpIHtcbiAgcmV0dXJuIGlucHV0O1xufVxuY2xhc3MgQ2FzaW5nQ2FjaGUge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJDYXNpbmdDYWNoZVwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNhY2hlID0ge307XG4gIGNhY2hlZFRhYmxlcyA9IHt9O1xuICBjb252ZXJ0O1xuICBjb25zdHJ1Y3RvcihjYXNpbmcpIHtcbiAgICB0aGlzLmNvbnZlcnQgPSBjYXNpbmcgPT09IFwic25ha2VfY2FzZVwiID8gdG9TbmFrZUNhc2UgOiBjYXNpbmcgPT09IFwiY2FtZWxDYXNlXCIgPyB0b0NhbWVsQ2FzZSA6IG5vb3BDYXNlO1xuICB9XG4gIGdldENvbHVtbkNhc2luZyhjb2x1bW4pIHtcbiAgICBpZiAoIWNvbHVtbi5rZXlBc05hbWUpIHJldHVybiBjb2x1bW4ubmFtZTtcbiAgICBjb25zdCBzY2hlbWEgPSBjb2x1bW4udGFibGVbVGFibGUuU3ltYm9sLlNjaGVtYV0gPz8gXCJwdWJsaWNcIjtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBjb2x1bW4udGFibGVbVGFibGUuU3ltYm9sLk9yaWdpbmFsTmFtZV07XG4gICAgY29uc3Qga2V5ID0gYCR7c2NoZW1hfS4ke3RhYmxlTmFtZX0uJHtjb2x1bW4ubmFtZX1gO1xuICAgIGlmICghdGhpcy5jYWNoZVtrZXldKSB7XG4gICAgICB0aGlzLmNhY2hlVGFibGUoY29sdW1uLnRhYmxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVba2V5XTtcbiAgfVxuICBjYWNoZVRhYmxlKHRhYmxlKSB7XG4gICAgY29uc3Qgc2NoZW1hID0gdGFibGVbVGFibGUuU3ltYm9sLlNjaGVtYV0gPz8gXCJwdWJsaWNcIjtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSB0YWJsZVtUYWJsZS5TeW1ib2wuT3JpZ2luYWxOYW1lXTtcbiAgICBjb25zdCB0YWJsZUtleSA9IGAke3NjaGVtYX0uJHt0YWJsZU5hbWV9YDtcbiAgICBpZiAoIXRoaXMuY2FjaGVkVGFibGVzW3RhYmxlS2V5XSkge1xuICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgT2JqZWN0LnZhbHVlcyh0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10pKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbktleSA9IGAke3RhYmxlS2V5fS4ke2NvbHVtbi5uYW1lfWA7XG4gICAgICAgIHRoaXMuY2FjaGVbY29sdW1uS2V5XSA9IHRoaXMuY29udmVydChjb2x1bW4ubmFtZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNhY2hlZFRhYmxlc1t0YWJsZUtleV0gPSB0cnVlO1xuICAgIH1cbiAgfVxuICBjbGVhckNhY2hlKCkge1xuICAgIHRoaXMuY2FjaGUgPSB7fTtcbiAgICB0aGlzLmNhY2hlZFRhYmxlcyA9IHt9O1xuICB9XG59XG5leHBvcnQge1xuICBDYXNpbmdDYWNoZSxcbiAgdG9DYW1lbENhc2UsXG4gIHRvU25ha2VDYXNlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2FzaW5nLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuL2VudGl0eS5qc1wiO1xuY2xhc3MgRHJpenpsZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJEcml6emxlRXJyb3JcIjtcbiAgY29uc3RydWN0b3IoeyBtZXNzYWdlLCBjYXVzZSB9KSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gXCJEcml6emxlRXJyb3JcIjtcbiAgICB0aGlzLmNhdXNlID0gY2F1c2U7XG4gIH1cbn1cbmNsYXNzIERyaXp6bGVRdWVyeUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihxdWVyeSwgcGFyYW1zLCBjYXVzZSkge1xuICAgIHN1cGVyKGBGYWlsZWQgcXVlcnk6ICR7cXVlcnl9XG5wYXJhbXM6ICR7cGFyYW1zfWApO1xuICAgIHRoaXMucXVlcnkgPSBxdWVyeTtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLmNhdXNlID0gY2F1c2U7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgRHJpenpsZVF1ZXJ5RXJyb3IpO1xuICAgIGlmIChjYXVzZSkgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICB9XG59XG5jbGFzcyBUcmFuc2FjdGlvblJvbGxiYWNrRXJyb3IgZXh0ZW5kcyBEcml6emxlRXJyb3Ige1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJUcmFuc2FjdGlvblJvbGxiYWNrRXJyb3JcIjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoeyBtZXNzYWdlOiBcIlJvbGxiYWNrXCIgfSk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIERyaXp6bGVFcnJvcixcbiAgRHJpenpsZVF1ZXJ5RXJyb3IsXG4gIFRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvclxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVycm9ycy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgZ2V0UGdDb2x1bW5CdWlsZGVycyB9IGZyb20gXCIuL2NvbHVtbnMvYWxsLmpzXCI7XG5jb25zdCBJbmxpbmVGb3JlaWduS2V5cyA9IFN5bWJvbC5mb3IoXCJkcml6emxlOlBnSW5saW5lRm9yZWlnbktleXNcIik7XG5jb25zdCBFbmFibGVSTFMgPSBTeW1ib2wuZm9yKFwiZHJpenpsZTpFbmFibGVSTFNcIik7XG5jbGFzcyBQZ1RhYmxlIGV4dGVuZHMgVGFibGUge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJQZ1RhYmxlXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIFN5bWJvbCA9IE9iamVjdC5hc3NpZ24oe30sIFRhYmxlLlN5bWJvbCwge1xuICAgIElubGluZUZvcmVpZ25LZXlzLFxuICAgIEVuYWJsZVJMU1xuICB9KTtcbiAgLyoqQGludGVybmFsICovXG4gIFtJbmxpbmVGb3JlaWduS2V5c10gPSBbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbRW5hYmxlUkxTXSA9IGZhbHNlO1xuICAvKiogQGludGVybmFsICovXG4gIFtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdCdWlsZGVyXSA9IHZvaWQgMDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQ29sdW1uc10gPSB7fTtcbn1cbmZ1bmN0aW9uIHBnVGFibGVXaXRoU2NoZW1hKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnLCBzY2hlbWEsIGJhc2VOYW1lID0gbmFtZSkge1xuICBjb25zdCByYXdUYWJsZSA9IG5ldyBQZ1RhYmxlKG5hbWUsIHNjaGVtYSwgYmFzZU5hbWUpO1xuICBjb25zdCBwYXJzZWRDb2x1bW5zID0gdHlwZW9mIGNvbHVtbnMgPT09IFwiZnVuY3Rpb25cIiA/IGNvbHVtbnMoZ2V0UGdDb2x1bW5CdWlsZGVycygpKSA6IGNvbHVtbnM7XG4gIGNvbnN0IGJ1aWx0Q29sdW1ucyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhwYXJzZWRDb2x1bW5zKS5tYXAoKFtuYW1lMiwgY29sQnVpbGRlckJhc2VdKSA9PiB7XG4gICAgICBjb25zdCBjb2xCdWlsZGVyID0gY29sQnVpbGRlckJhc2U7XG4gICAgICBjb2xCdWlsZGVyLnNldE5hbWUobmFtZTIpO1xuICAgICAgY29uc3QgY29sdW1uID0gY29sQnVpbGRlci5idWlsZChyYXdUYWJsZSk7XG4gICAgICByYXdUYWJsZVtJbmxpbmVGb3JlaWduS2V5c10ucHVzaCguLi5jb2xCdWlsZGVyLmJ1aWxkRm9yZWlnbktleXMoY29sdW1uLCByYXdUYWJsZSkpO1xuICAgICAgcmV0dXJuIFtuYW1lMiwgY29sdW1uXTtcbiAgICB9KVxuICApO1xuICBjb25zdCBidWlsdENvbHVtbnNGb3JFeHRyYUNvbmZpZyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhwYXJzZWRDb2x1bW5zKS5tYXAoKFtuYW1lMiwgY29sQnVpbGRlckJhc2VdKSA9PiB7XG4gICAgICBjb25zdCBjb2xCdWlsZGVyID0gY29sQnVpbGRlckJhc2U7XG4gICAgICBjb2xCdWlsZGVyLnNldE5hbWUobmFtZTIpO1xuICAgICAgY29uc3QgY29sdW1uID0gY29sQnVpbGRlci5idWlsZEV4dHJhQ29uZmlnQ29sdW1uKHJhd1RhYmxlKTtcbiAgICAgIHJldHVybiBbbmFtZTIsIGNvbHVtbl07XG4gICAgfSlcbiAgKTtcbiAgY29uc3QgdGFibGUgPSBPYmplY3QuYXNzaWduKHJhd1RhYmxlLCBidWlsdENvbHVtbnMpO1xuICB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10gPSBidWlsdENvbHVtbnM7XG4gIHRhYmxlW1RhYmxlLlN5bWJvbC5FeHRyYUNvbmZpZ0NvbHVtbnNdID0gYnVpbHRDb2x1bW5zRm9yRXh0cmFDb25maWc7XG4gIGlmIChleHRyYUNvbmZpZykge1xuICAgIHRhYmxlW1BnVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQnVpbGRlcl0gPSBleHRyYUNvbmZpZztcbiAgfVxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih0YWJsZSwge1xuICAgIGVuYWJsZVJMUzogKCkgPT4ge1xuICAgICAgdGFibGVbUGdUYWJsZS5TeW1ib2wuRW5hYmxlUkxTXSA9IHRydWU7XG4gICAgICByZXR1cm4gdGFibGU7XG4gICAgfVxuICB9KTtcbn1cbmNvbnN0IHBnVGFibGUgPSAobmFtZSwgY29sdW1ucywgZXh0cmFDb25maWcpID0+IHtcbiAgcmV0dXJuIHBnVGFibGVXaXRoU2NoZW1hKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnLCB2b2lkIDApO1xufTtcbmZ1bmN0aW9uIHBnVGFibGVDcmVhdG9yKGN1c3RvbWl6ZVRhYmxlTmFtZSkge1xuICByZXR1cm4gKG5hbWUsIGNvbHVtbnMsIGV4dHJhQ29uZmlnKSA9PiB7XG4gICAgcmV0dXJuIHBnVGFibGVXaXRoU2NoZW1hKGN1c3RvbWl6ZVRhYmxlTmFtZShuYW1lKSwgY29sdW1ucywgZXh0cmFDb25maWcsIHZvaWQgMCwgbmFtZSk7XG4gIH07XG59XG5leHBvcnQge1xuICBFbmFibGVSTFMsXG4gIElubGluZUZvcmVpZ25LZXlzLFxuICBQZ1RhYmxlLFxuICBwZ1RhYmxlLFxuICBwZ1RhYmxlQ3JlYXRvcixcbiAgcGdUYWJsZVdpdGhTY2hlbWFcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YWJsZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBQZ1RhYmxlIH0gZnJvbSBcIi4vdGFibGUuanNcIjtcbmZ1bmN0aW9uIHByaW1hcnlLZXkoLi4uY29uZmlnKSB7XG4gIGlmIChjb25maWdbMF0uY29sdW1ucykge1xuICAgIHJldHVybiBuZXcgUHJpbWFyeUtleUJ1aWxkZXIoY29uZmlnWzBdLmNvbHVtbnMsIGNvbmZpZ1swXS5uYW1lKTtcbiAgfVxuICByZXR1cm4gbmV3IFByaW1hcnlLZXlCdWlsZGVyKGNvbmZpZyk7XG59XG5jbGFzcyBQcmltYXJ5S2V5QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnUHJpbWFyeUtleUJ1aWxkZXJcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb2x1bW5zO1xuICAvKiogQGludGVybmFsICovXG4gIG5hbWU7XG4gIGNvbnN0cnVjdG9yKGNvbHVtbnMsIG5hbWUpIHtcbiAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZCh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgUHJpbWFyeUtleSh0YWJsZSwgdGhpcy5jb2x1bW5zLCB0aGlzLm5hbWUpO1xuICB9XG59XG5jbGFzcyBQcmltYXJ5S2V5IHtcbiAgY29uc3RydWN0b3IodGFibGUsIGNvbHVtbnMsIG5hbWUpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlBnUHJpbWFyeUtleVwiO1xuICBjb2x1bW5zO1xuICBuYW1lO1xuICBnZXROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWUgPz8gYCR7dGhpcy50YWJsZVtQZ1RhYmxlLlN5bWJvbC5OYW1lXX1fJHt0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKS5qb2luKFwiX1wiKX1fcGtgO1xuICB9XG59XG5leHBvcnQge1xuICBQcmltYXJ5S2V5LFxuICBQcmltYXJ5S2V5QnVpbGRlcixcbiAgcHJpbWFyeUtleVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByaW1hcnkta2V5cy5qcy5tYXAiLAogICAgImltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuLi8uLi9jb2x1bW4uanNcIjtcbmltcG9ydCB7IGlzIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUuanNcIjtcbmltcG9ydCB7XG4gIGlzRHJpdmVyVmFsdWVFbmNvZGVyLFxuICBpc1NRTFdyYXBwZXIsXG4gIFBhcmFtLFxuICBQbGFjZWhvbGRlcixcbiAgU1FMLFxuICBzcWwsXG4gIFN0cmluZ0NodW5rLFxuICBWaWV3XG59IGZyb20gXCIuLi9zcWwuanNcIjtcbmZ1bmN0aW9uIGJpbmRJZlBhcmFtKHZhbHVlLCBjb2x1bW4pIHtcbiAgaWYgKGlzRHJpdmVyVmFsdWVFbmNvZGVyKGNvbHVtbikgJiYgIWlzU1FMV3JhcHBlcih2YWx1ZSkgJiYgIWlzKHZhbHVlLCBQYXJhbSkgJiYgIWlzKHZhbHVlLCBQbGFjZWhvbGRlcikgJiYgIWlzKHZhbHVlLCBDb2x1bW4pICYmICFpcyh2YWx1ZSwgVGFibGUpICYmICFpcyh2YWx1ZSwgVmlldykpIHtcbiAgICByZXR1cm4gbmV3IFBhcmFtKHZhbHVlLCBjb2x1bW4pO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbmNvbnN0IGVxID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIHJldHVybiBzcWxgJHtsZWZ0fSA9ICR7YmluZElmUGFyYW0ocmlnaHQsIGxlZnQpfWA7XG59O1xuY29uc3QgbmUgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgcmV0dXJuIHNxbGAke2xlZnR9IDw+ICR7YmluZElmUGFyYW0ocmlnaHQsIGxlZnQpfWA7XG59O1xuZnVuY3Rpb24gYW5kKC4uLnVuZmlsdGVyZWRDb25kaXRpb25zKSB7XG4gIGNvbnN0IGNvbmRpdGlvbnMgPSB1bmZpbHRlcmVkQ29uZGl0aW9ucy5maWx0ZXIoXG4gICAgKGMpID0+IGMgIT09IHZvaWQgMFxuICApO1xuICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBuZXcgU1FMKGNvbmRpdGlvbnMpO1xuICB9XG4gIHJldHVybiBuZXcgU1FMKFtcbiAgICBuZXcgU3RyaW5nQ2h1bmsoXCIoXCIpLFxuICAgIHNxbC5qb2luKGNvbmRpdGlvbnMsIG5ldyBTdHJpbmdDaHVuayhcIiBhbmQgXCIpKSxcbiAgICBuZXcgU3RyaW5nQ2h1bmsoXCIpXCIpXG4gIF0pO1xufVxuZnVuY3Rpb24gb3IoLi4udW5maWx0ZXJlZENvbmRpdGlvbnMpIHtcbiAgY29uc3QgY29uZGl0aW9ucyA9IHVuZmlsdGVyZWRDb25kaXRpb25zLmZpbHRlcihcbiAgICAoYykgPT4gYyAhPT0gdm9pZCAwXG4gICk7XG4gIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIG5ldyBTUUwoY29uZGl0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTUUwoW1xuICAgIG5ldyBTdHJpbmdDaHVuayhcIihcIiksXG4gICAgc3FsLmpvaW4oY29uZGl0aW9ucywgbmV3IFN0cmluZ0NodW5rKFwiIG9yIFwiKSksXG4gICAgbmV3IFN0cmluZ0NodW5rKFwiKVwiKVxuICBdKTtcbn1cbmZ1bmN0aW9uIG5vdChjb25kaXRpb24pIHtcbiAgcmV0dXJuIHNxbGBub3QgJHtjb25kaXRpb259YDtcbn1cbmNvbnN0IGd0ID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIHJldHVybiBzcWxgJHtsZWZ0fSA+ICR7YmluZElmUGFyYW0ocmlnaHQsIGxlZnQpfWA7XG59O1xuY29uc3QgZ3RlID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIHJldHVybiBzcWxgJHtsZWZ0fSA+PSAke2JpbmRJZlBhcmFtKHJpZ2h0LCBsZWZ0KX1gO1xufTtcbmNvbnN0IGx0ID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIHJldHVybiBzcWxgJHtsZWZ0fSA8ICR7YmluZElmUGFyYW0ocmlnaHQsIGxlZnQpfWA7XG59O1xuY29uc3QgbHRlID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIHJldHVybiBzcWxgJHtsZWZ0fSA8PSAke2JpbmRJZlBhcmFtKHJpZ2h0LCBsZWZ0KX1gO1xufTtcbmZ1bmN0aW9uIGluQXJyYXkoY29sdW1uLCB2YWx1ZXMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gc3FsYGZhbHNlYDtcbiAgICB9XG4gICAgcmV0dXJuIHNxbGAke2NvbHVtbn0gaW4gJHt2YWx1ZXMubWFwKCh2KSA9PiBiaW5kSWZQYXJhbSh2LCBjb2x1bW4pKX1gO1xuICB9XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IGluICR7YmluZElmUGFyYW0odmFsdWVzLCBjb2x1bW4pfWA7XG59XG5mdW5jdGlvbiBub3RJbkFycmF5KGNvbHVtbiwgdmFsdWVzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHNxbGB0cnVlYDtcbiAgICB9XG4gICAgcmV0dXJuIHNxbGAke2NvbHVtbn0gbm90IGluICR7dmFsdWVzLm1hcCgodikgPT4gYmluZElmUGFyYW0odiwgY29sdW1uKSl9YDtcbiAgfVxuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBub3QgaW4gJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbn1cbmZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSkge1xuICByZXR1cm4gc3FsYCR7dmFsdWV9IGlzIG51bGxgO1xufVxuZnVuY3Rpb24gaXNOb3ROdWxsKHZhbHVlKSB7XG4gIHJldHVybiBzcWxgJHt2YWx1ZX0gaXMgbm90IG51bGxgO1xufVxuZnVuY3Rpb24gZXhpc3RzKHN1YnF1ZXJ5KSB7XG4gIHJldHVybiBzcWxgZXhpc3RzICR7c3VicXVlcnl9YDtcbn1cbmZ1bmN0aW9uIG5vdEV4aXN0cyhzdWJxdWVyeSkge1xuICByZXR1cm4gc3FsYG5vdCBleGlzdHMgJHtzdWJxdWVyeX1gO1xufVxuZnVuY3Rpb24gYmV0d2Vlbihjb2x1bW4sIG1pbiwgbWF4KSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IGJldHdlZW4gJHtiaW5kSWZQYXJhbShtaW4sIGNvbHVtbil9IGFuZCAke2JpbmRJZlBhcmFtKFxuICAgIG1heCxcbiAgICBjb2x1bW5cbiAgKX1gO1xufVxuZnVuY3Rpb24gbm90QmV0d2Vlbihjb2x1bW4sIG1pbiwgbWF4KSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IG5vdCBiZXR3ZWVuICR7YmluZElmUGFyYW0oXG4gICAgbWluLFxuICAgIGNvbHVtblxuICApfSBhbmQgJHtiaW5kSWZQYXJhbShtYXgsIGNvbHVtbil9YDtcbn1cbmZ1bmN0aW9uIGxpa2UoY29sdW1uLCB2YWx1ZSkge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBsaWtlICR7dmFsdWV9YDtcbn1cbmZ1bmN0aW9uIG5vdExpa2UoY29sdW1uLCB2YWx1ZSkge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBub3QgbGlrZSAke3ZhbHVlfWA7XG59XG5mdW5jdGlvbiBpbGlrZShjb2x1bW4sIHZhbHVlKSB7XG4gIHJldHVybiBzcWxgJHtjb2x1bW59IGlsaWtlICR7dmFsdWV9YDtcbn1cbmZ1bmN0aW9uIG5vdElsaWtlKGNvbHVtbiwgdmFsdWUpIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gbm90IGlsaWtlICR7dmFsdWV9YDtcbn1cbmZ1bmN0aW9uIGFycmF5Q29udGFpbnMoY29sdW1uLCB2YWx1ZXMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhcnJheUNvbnRhaW5zIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSB2YWx1ZVwiKTtcbiAgICB9XG4gICAgY29uc3QgYXJyYXkgPSBzcWxgJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbiAgICByZXR1cm4gc3FsYCR7Y29sdW1ufSBAPiAke2FycmF5fWA7XG4gIH1cbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gQD4gJHtiaW5kSWZQYXJhbSh2YWx1ZXMsIGNvbHVtbil9YDtcbn1cbmZ1bmN0aW9uIGFycmF5Q29udGFpbmVkKGNvbHVtbiwgdmFsdWVzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXJyYXlDb250YWluZWQgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHZhbHVlXCIpO1xuICAgIH1cbiAgICBjb25zdCBhcnJheSA9IHNxbGAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xuICAgIHJldHVybiBzcWxgJHtjb2x1bW59IDxAICR7YXJyYXl9YDtcbiAgfVxuICByZXR1cm4gc3FsYCR7Y29sdW1ufSA8QCAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xufVxuZnVuY3Rpb24gYXJyYXlPdmVybGFwcyhjb2x1bW4sIHZhbHVlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFycmF5T3ZlcmxhcHMgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHZhbHVlXCIpO1xuICAgIH1cbiAgICBjb25zdCBhcnJheSA9IHNxbGAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xuICAgIHJldHVybiBzcWxgJHtjb2x1bW59ICYmICR7YXJyYXl9YDtcbiAgfVxuICByZXR1cm4gc3FsYCR7Y29sdW1ufSAmJiAke2JpbmRJZlBhcmFtKHZhbHVlcywgY29sdW1uKX1gO1xufVxuZXhwb3J0IHtcbiAgYW5kLFxuICBhcnJheUNvbnRhaW5lZCxcbiAgYXJyYXlDb250YWlucyxcbiAgYXJyYXlPdmVybGFwcyxcbiAgYmV0d2VlbixcbiAgYmluZElmUGFyYW0sXG4gIGVxLFxuICBleGlzdHMsXG4gIGd0LFxuICBndGUsXG4gIGlsaWtlLFxuICBpbkFycmF5LFxuICBpc05vdE51bGwsXG4gIGlzTnVsbCxcbiAgbGlrZSxcbiAgbHQsXG4gIGx0ZSxcbiAgbmUsXG4gIG5vdCxcbiAgbm90QmV0d2VlbixcbiAgbm90RXhpc3RzLFxuICBub3RJbGlrZSxcbiAgbm90SW5BcnJheSxcbiAgbm90TGlrZSxcbiAgb3Jcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25kaXRpb25zLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgc3FsIH0gZnJvbSBcIi4uL3NxbC5qc1wiO1xuZnVuY3Rpb24gYXNjKGNvbHVtbikge1xuICByZXR1cm4gc3FsYCR7Y29sdW1ufSBhc2NgO1xufVxuZnVuY3Rpb24gZGVzYyhjb2x1bW4pIHtcbiAgcmV0dXJuIHNxbGAke2NvbHVtbn0gZGVzY2A7XG59XG5leHBvcnQge1xuICBhc2MsXG4gIGRlc2Ncbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWxlY3QuanMubWFwIiwKICAgICJpbXBvcnQgeyBnZXRUYWJsZVVuaXF1ZU5hbWUsIFRhYmxlIH0gZnJvbSBcIi4vdGFibGUuanNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuL2NvbHVtbi5qc1wiO1xuaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFByaW1hcnlLZXlCdWlsZGVyIH0gZnJvbSBcIi4vcGctY29yZS9wcmltYXJ5LWtleXMuanNcIjtcbmltcG9ydCB7XG4gIGFuZCxcbiAgYXNjLFxuICBiZXR3ZWVuLFxuICBkZXNjLFxuICBlcSxcbiAgZXhpc3RzLFxuICBndCxcbiAgZ3RlLFxuICBpbGlrZSxcbiAgaW5BcnJheSxcbiAgaXNOb3ROdWxsLFxuICBpc051bGwsXG4gIGxpa2UsXG4gIGx0LFxuICBsdGUsXG4gIG5lLFxuICBub3QsXG4gIG5vdEJldHdlZW4sXG4gIG5vdEV4aXN0cyxcbiAgbm90SWxpa2UsXG4gIG5vdEluQXJyYXksXG4gIG5vdExpa2UsXG4gIG9yXG59IGZyb20gXCIuL3NxbC9leHByZXNzaW9ucy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU1FMLCBzcWwgfSBmcm9tIFwiLi9zcWwvc3FsLmpzXCI7XG5jbGFzcyBSZWxhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZVRhYmxlLCByZWZlcmVuY2VkVGFibGUsIHJlbGF0aW9uTmFtZSkge1xuICAgIHRoaXMuc291cmNlVGFibGUgPSBzb3VyY2VUYWJsZTtcbiAgICB0aGlzLnJlZmVyZW5jZWRUYWJsZSA9IHJlZmVyZW5jZWRUYWJsZTtcbiAgICB0aGlzLnJlbGF0aW9uTmFtZSA9IHJlbGF0aW9uTmFtZTtcbiAgICB0aGlzLnJlZmVyZW5jZWRUYWJsZU5hbWUgPSByZWZlcmVuY2VkVGFibGVbVGFibGUuU3ltYm9sLk5hbWVdO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlJlbGF0aW9uXCI7XG4gIHJlZmVyZW5jZWRUYWJsZU5hbWU7XG4gIGZpZWxkTmFtZTtcbn1cbmNsYXNzIFJlbGF0aW9ucyB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCBjb25maWcpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiUmVsYXRpb25zXCI7XG59XG5jbGFzcyBPbmUgZXh0ZW5kcyBSZWxhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZVRhYmxlLCByZWZlcmVuY2VkVGFibGUsIGNvbmZpZywgaXNOdWxsYWJsZSkge1xuICAgIHN1cGVyKHNvdXJjZVRhYmxlLCByZWZlcmVuY2VkVGFibGUsIGNvbmZpZz8ucmVsYXRpb25OYW1lKTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmlzTnVsbGFibGUgPSBpc051bGxhYmxlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIk9uZVwiO1xuICB3aXRoRmllbGROYW1lKGZpZWxkTmFtZSkge1xuICAgIGNvbnN0IHJlbGF0aW9uID0gbmV3IE9uZShcbiAgICAgIHRoaXMuc291cmNlVGFibGUsXG4gICAgICB0aGlzLnJlZmVyZW5jZWRUYWJsZSxcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgdGhpcy5pc051bGxhYmxlXG4gICAgKTtcbiAgICByZWxhdGlvbi5maWVsZE5hbWUgPSBmaWVsZE5hbWU7XG4gICAgcmV0dXJuIHJlbGF0aW9uO1xuICB9XG59XG5jbGFzcyBNYW55IGV4dGVuZHMgUmVsYXRpb24ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2VUYWJsZSwgcmVmZXJlbmNlZFRhYmxlLCBjb25maWcpIHtcbiAgICBzdXBlcihzb3VyY2VUYWJsZSwgcmVmZXJlbmNlZFRhYmxlLCBjb25maWc/LnJlbGF0aW9uTmFtZSk7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiTWFueVwiO1xuICB3aXRoRmllbGROYW1lKGZpZWxkTmFtZSkge1xuICAgIGNvbnN0IHJlbGF0aW9uID0gbmV3IE1hbnkoXG4gICAgICB0aGlzLnNvdXJjZVRhYmxlLFxuICAgICAgdGhpcy5yZWZlcmVuY2VkVGFibGUsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gICAgcmVsYXRpb24uZmllbGROYW1lID0gZmllbGROYW1lO1xuICAgIHJldHVybiByZWxhdGlvbjtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0T3BlcmF0b3JzKCkge1xuICByZXR1cm4ge1xuICAgIGFuZCxcbiAgICBiZXR3ZWVuLFxuICAgIGVxLFxuICAgIGV4aXN0cyxcbiAgICBndCxcbiAgICBndGUsXG4gICAgaWxpa2UsXG4gICAgaW5BcnJheSxcbiAgICBpc051bGwsXG4gICAgaXNOb3ROdWxsLFxuICAgIGxpa2UsXG4gICAgbHQsXG4gICAgbHRlLFxuICAgIG5lLFxuICAgIG5vdCxcbiAgICBub3RCZXR3ZWVuLFxuICAgIG5vdEV4aXN0cyxcbiAgICBub3RMaWtlLFxuICAgIG5vdElsaWtlLFxuICAgIG5vdEluQXJyYXksXG4gICAgb3IsXG4gICAgc3FsXG4gIH07XG59XG5mdW5jdGlvbiBnZXRPcmRlckJ5T3BlcmF0b3JzKCkge1xuICByZXR1cm4ge1xuICAgIHNxbCxcbiAgICBhc2MsXG4gICAgZGVzY1xuICB9O1xufVxuZnVuY3Rpb24gZXh0cmFjdFRhYmxlc1JlbGF0aW9uYWxDb25maWcoc2NoZW1hLCBjb25maWdIZWxwZXJzKSB7XG4gIGlmIChPYmplY3Qua2V5cyhzY2hlbWEpLmxlbmd0aCA9PT0gMSAmJiBcImRlZmF1bHRcIiBpbiBzY2hlbWEgJiYgIWlzKHNjaGVtYVtcImRlZmF1bHRcIl0sIFRhYmxlKSkge1xuICAgIHNjaGVtYSA9IHNjaGVtYVtcImRlZmF1bHRcIl07XG4gIH1cbiAgY29uc3QgdGFibGVOYW1lc01hcCA9IHt9O1xuICBjb25zdCByZWxhdGlvbnNCdWZmZXIgPSB7fTtcbiAgY29uc3QgdGFibGVzQ29uZmlnID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYSkpIHtcbiAgICBpZiAoaXModmFsdWUsIFRhYmxlKSkge1xuICAgICAgY29uc3QgZGJOYW1lID0gZ2V0VGFibGVVbmlxdWVOYW1lKHZhbHVlKTtcbiAgICAgIGNvbnN0IGJ1ZmZlcmVkUmVsYXRpb25zID0gcmVsYXRpb25zQnVmZmVyW2RiTmFtZV07XG4gICAgICB0YWJsZU5hbWVzTWFwW2RiTmFtZV0gPSBrZXk7XG4gICAgICB0YWJsZXNDb25maWdba2V5XSA9IHtcbiAgICAgICAgdHNOYW1lOiBrZXksXG4gICAgICAgIGRiTmFtZTogdmFsdWVbVGFibGUuU3ltYm9sLk5hbWVdLFxuICAgICAgICBzY2hlbWE6IHZhbHVlW1RhYmxlLlN5bWJvbC5TY2hlbWFdLFxuICAgICAgICBjb2x1bW5zOiB2YWx1ZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10sXG4gICAgICAgIHJlbGF0aW9uczogYnVmZmVyZWRSZWxhdGlvbnM/LnJlbGF0aW9ucyA/PyB7fSxcbiAgICAgICAgcHJpbWFyeUtleTogYnVmZmVyZWRSZWxhdGlvbnM/LnByaW1hcnlLZXkgPz8gW11cbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBPYmplY3QudmFsdWVzKFxuICAgICAgICB2YWx1ZVtUYWJsZS5TeW1ib2wuQ29sdW1uc11cbiAgICAgICkpIHtcbiAgICAgICAgaWYgKGNvbHVtbi5wcmltYXJ5KSB7XG4gICAgICAgICAgdGFibGVzQ29uZmlnW2tleV0ucHJpbWFyeUtleS5wdXNoKGNvbHVtbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4dHJhQ29uZmlnID0gdmFsdWVbVGFibGUuU3ltYm9sLkV4dHJhQ29uZmlnQnVpbGRlcl0/Lih2YWx1ZVtUYWJsZS5TeW1ib2wuRXh0cmFDb25maWdDb2x1bW5zXSk7XG4gICAgICBpZiAoZXh0cmFDb25maWcpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb25maWdFbnRyeSBvZiBPYmplY3QudmFsdWVzKGV4dHJhQ29uZmlnKSkge1xuICAgICAgICAgIGlmIChpcyhjb25maWdFbnRyeSwgUHJpbWFyeUtleUJ1aWxkZXIpKSB7XG4gICAgICAgICAgICB0YWJsZXNDb25maWdba2V5XS5wcmltYXJ5S2V5LnB1c2goLi4uY29uZmlnRW50cnkuY29sdW1ucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpcyh2YWx1ZSwgUmVsYXRpb25zKSkge1xuICAgICAgY29uc3QgZGJOYW1lID0gZ2V0VGFibGVVbmlxdWVOYW1lKHZhbHVlLnRhYmxlKTtcbiAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRhYmxlTmFtZXNNYXBbZGJOYW1lXTtcbiAgICAgIGNvbnN0IHJlbGF0aW9uczIgPSB2YWx1ZS5jb25maWcoXG4gICAgICAgIGNvbmZpZ0hlbHBlcnModmFsdWUudGFibGUpXG4gICAgICApO1xuICAgICAgbGV0IHByaW1hcnlLZXk7XG4gICAgICBmb3IgKGNvbnN0IFtyZWxhdGlvbk5hbWUsIHJlbGF0aW9uXSBvZiBPYmplY3QuZW50cmllcyhyZWxhdGlvbnMyKSkge1xuICAgICAgICBpZiAodGFibGVOYW1lKSB7XG4gICAgICAgICAgY29uc3QgdGFibGVDb25maWcgPSB0YWJsZXNDb25maWdbdGFibGVOYW1lXTtcbiAgICAgICAgICB0YWJsZUNvbmZpZy5yZWxhdGlvbnNbcmVsYXRpb25OYW1lXSA9IHJlbGF0aW9uO1xuICAgICAgICAgIGlmIChwcmltYXJ5S2V5KSB7XG4gICAgICAgICAgICB0YWJsZUNvbmZpZy5wcmltYXJ5S2V5LnB1c2goLi4ucHJpbWFyeUtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghKGRiTmFtZSBpbiByZWxhdGlvbnNCdWZmZXIpKSB7XG4gICAgICAgICAgICByZWxhdGlvbnNCdWZmZXJbZGJOYW1lXSA9IHtcbiAgICAgICAgICAgICAgcmVsYXRpb25zOiB7fSxcbiAgICAgICAgICAgICAgcHJpbWFyeUtleVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVsYXRpb25zQnVmZmVyW2RiTmFtZV0ucmVsYXRpb25zW3JlbGF0aW9uTmFtZV0gPSByZWxhdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyB0YWJsZXM6IHRhYmxlc0NvbmZpZywgdGFibGVOYW1lc01hcCB9O1xufVxuZnVuY3Rpb24gcmVsYXRpb25zKHRhYmxlLCByZWxhdGlvbnMyKSB7XG4gIHJldHVybiBuZXcgUmVsYXRpb25zKFxuICAgIHRhYmxlLFxuICAgIChoZWxwZXJzKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhyZWxhdGlvbnMyKGhlbHBlcnMpKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW1xuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlLndpdGhGaWVsZE5hbWUoa2V5KVxuICAgICAgXSlcbiAgICApXG4gICk7XG59XG5mdW5jdGlvbiBjcmVhdGVPbmUoc291cmNlVGFibGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG9uZSh0YWJsZSwgY29uZmlnKSB7XG4gICAgcmV0dXJuIG5ldyBPbmUoXG4gICAgICBzb3VyY2VUYWJsZSxcbiAgICAgIHRhYmxlLFxuICAgICAgY29uZmlnLFxuICAgICAgY29uZmlnPy5maWVsZHMucmVkdWNlKChyZXMsIGYpID0+IHJlcyAmJiBmLm5vdE51bGwsIHRydWUpID8/IGZhbHNlXG4gICAgKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZU1hbnkoc291cmNlVGFibGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG1hbnkocmVmZXJlbmNlZFRhYmxlLCBjb25maWcpIHtcbiAgICByZXR1cm4gbmV3IE1hbnkoc291cmNlVGFibGUsIHJlZmVyZW5jZWRUYWJsZSwgY29uZmlnKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlbGF0aW9uKHNjaGVtYSwgdGFibGVOYW1lc01hcCwgcmVsYXRpb24pIHtcbiAgaWYgKGlzKHJlbGF0aW9uLCBPbmUpICYmIHJlbGF0aW9uLmNvbmZpZykge1xuICAgIHJldHVybiB7XG4gICAgICBmaWVsZHM6IHJlbGF0aW9uLmNvbmZpZy5maWVsZHMsXG4gICAgICByZWZlcmVuY2VzOiByZWxhdGlvbi5jb25maWcucmVmZXJlbmNlc1xuICAgIH07XG4gIH1cbiAgY29uc3QgcmVmZXJlbmNlZFRhYmxlVHNOYW1lID0gdGFibGVOYW1lc01hcFtnZXRUYWJsZVVuaXF1ZU5hbWUocmVsYXRpb24ucmVmZXJlbmNlZFRhYmxlKV07XG4gIGlmICghcmVmZXJlbmNlZFRhYmxlVHNOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRhYmxlIFwiJHtyZWxhdGlvbi5yZWZlcmVuY2VkVGFibGVbVGFibGUuU3ltYm9sLk5hbWVdfVwiIG5vdCBmb3VuZCBpbiBzY2hlbWFgXG4gICAgKTtcbiAgfVxuICBjb25zdCByZWZlcmVuY2VkVGFibGVDb25maWcgPSBzY2hlbWFbcmVmZXJlbmNlZFRhYmxlVHNOYW1lXTtcbiAgaWYgKCFyZWZlcmVuY2VkVGFibGVDb25maWcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHtyZWZlcmVuY2VkVGFibGVUc05hbWV9XCIgbm90IGZvdW5kIGluIHNjaGVtYWApO1xuICB9XG4gIGNvbnN0IHNvdXJjZVRhYmxlID0gcmVsYXRpb24uc291cmNlVGFibGU7XG4gIGNvbnN0IHNvdXJjZVRhYmxlVHNOYW1lID0gdGFibGVOYW1lc01hcFtnZXRUYWJsZVVuaXF1ZU5hbWUoc291cmNlVGFibGUpXTtcbiAgaWYgKCFzb3VyY2VUYWJsZVRzTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUYWJsZSBcIiR7c291cmNlVGFibGVbVGFibGUuU3ltYm9sLk5hbWVdfVwiIG5vdCBmb3VuZCBpbiBzY2hlbWFgXG4gICAgKTtcbiAgfVxuICBjb25zdCByZXZlcnNlUmVsYXRpb25zID0gW107XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlZFRhYmxlUmVsYXRpb24gb2YgT2JqZWN0LnZhbHVlcyhcbiAgICByZWZlcmVuY2VkVGFibGVDb25maWcucmVsYXRpb25zXG4gICkpIHtcbiAgICBpZiAocmVsYXRpb24ucmVsYXRpb25OYW1lICYmIHJlbGF0aW9uICE9PSByZWZlcmVuY2VkVGFibGVSZWxhdGlvbiAmJiByZWZlcmVuY2VkVGFibGVSZWxhdGlvbi5yZWxhdGlvbk5hbWUgPT09IHJlbGF0aW9uLnJlbGF0aW9uTmFtZSB8fCAhcmVsYXRpb24ucmVsYXRpb25OYW1lICYmIHJlZmVyZW5jZWRUYWJsZVJlbGF0aW9uLnJlZmVyZW5jZWRUYWJsZSA9PT0gcmVsYXRpb24uc291cmNlVGFibGUpIHtcbiAgICAgIHJldmVyc2VSZWxhdGlvbnMucHVzaChyZWZlcmVuY2VkVGFibGVSZWxhdGlvbik7XG4gICAgfVxuICB9XG4gIGlmIChyZXZlcnNlUmVsYXRpb25zLmxlbmd0aCA+IDEpIHtcbiAgICB0aHJvdyByZWxhdGlvbi5yZWxhdGlvbk5hbWUgPyBuZXcgRXJyb3IoXG4gICAgICBgVGhlcmUgYXJlIG11bHRpcGxlIHJlbGF0aW9ucyB3aXRoIG5hbWUgXCIke3JlbGF0aW9uLnJlbGF0aW9uTmFtZX1cIiBpbiB0YWJsZSBcIiR7cmVmZXJlbmNlZFRhYmxlVHNOYW1lfVwiYFxuICAgICkgOiBuZXcgRXJyb3IoXG4gICAgICBgVGhlcmUgYXJlIG11bHRpcGxlIHJlbGF0aW9ucyBiZXR3ZWVuIFwiJHtyZWZlcmVuY2VkVGFibGVUc05hbWV9XCIgYW5kIFwiJHtyZWxhdGlvbi5zb3VyY2VUYWJsZVtUYWJsZS5TeW1ib2wuTmFtZV19XCIuIFBsZWFzZSBzcGVjaWZ5IHJlbGF0aW9uIG5hbWVgXG4gICAgKTtcbiAgfVxuICBpZiAocmV2ZXJzZVJlbGF0aW9uc1swXSAmJiBpcyhyZXZlcnNlUmVsYXRpb25zWzBdLCBPbmUpICYmIHJldmVyc2VSZWxhdGlvbnNbMF0uY29uZmlnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpZWxkczogcmV2ZXJzZVJlbGF0aW9uc1swXS5jb25maWcucmVmZXJlbmNlcyxcbiAgICAgIHJlZmVyZW5jZXM6IHJldmVyc2VSZWxhdGlvbnNbMF0uY29uZmlnLmZpZWxkc1xuICAgIH07XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBUaGVyZSBpcyBub3QgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGluZmVyIHJlbGF0aW9uIFwiJHtzb3VyY2VUYWJsZVRzTmFtZX0uJHtyZWxhdGlvbi5maWVsZE5hbWV9XCJgXG4gICk7XG59XG5mdW5jdGlvbiBjcmVhdGVUYWJsZVJlbGF0aW9uc0hlbHBlcnMoc291cmNlVGFibGUpIHtcbiAgcmV0dXJuIHtcbiAgICBvbmU6IGNyZWF0ZU9uZShzb3VyY2VUYWJsZSksXG4gICAgbWFueTogY3JlYXRlTWFueShzb3VyY2VUYWJsZSlcbiAgfTtcbn1cbmZ1bmN0aW9uIG1hcFJlbGF0aW9uYWxSb3codGFibGVzQ29uZmlnLCB0YWJsZUNvbmZpZywgcm93LCBidWlsZFF1ZXJ5UmVzdWx0U2VsZWN0aW9uLCBtYXBDb2x1bW5WYWx1ZSA9ICh2YWx1ZSkgPT4gdmFsdWUpIHtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGZvciAoY29uc3QgW1xuICAgIHNlbGVjdGlvbkl0ZW1JbmRleCxcbiAgICBzZWxlY3Rpb25JdGVtXG4gIF0gb2YgYnVpbGRRdWVyeVJlc3VsdFNlbGVjdGlvbi5lbnRyaWVzKCkpIHtcbiAgICBpZiAoc2VsZWN0aW9uSXRlbS5pc0pzb24pIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uID0gdGFibGVDb25maWcucmVsYXRpb25zW3NlbGVjdGlvbkl0ZW0udHNLZXldO1xuICAgICAgY29uc3QgcmF3U3ViUm93cyA9IHJvd1tzZWxlY3Rpb25JdGVtSW5kZXhdO1xuICAgICAgY29uc3Qgc3ViUm93cyA9IHR5cGVvZiByYXdTdWJSb3dzID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShyYXdTdWJSb3dzKSA6IHJhd1N1YlJvd3M7XG4gICAgICByZXN1bHRbc2VsZWN0aW9uSXRlbS50c0tleV0gPSBpcyhyZWxhdGlvbiwgT25lKSA/IHN1YlJvd3MgJiYgbWFwUmVsYXRpb25hbFJvdyhcbiAgICAgICAgdGFibGVzQ29uZmlnLFxuICAgICAgICB0YWJsZXNDb25maWdbc2VsZWN0aW9uSXRlbS5yZWxhdGlvblRhYmxlVHNLZXldLFxuICAgICAgICBzdWJSb3dzLFxuICAgICAgICBzZWxlY3Rpb25JdGVtLnNlbGVjdGlvbixcbiAgICAgICAgbWFwQ29sdW1uVmFsdWVcbiAgICAgICkgOiBzdWJSb3dzLm1hcChcbiAgICAgICAgKHN1YlJvdykgPT4gbWFwUmVsYXRpb25hbFJvdyhcbiAgICAgICAgICB0YWJsZXNDb25maWcsXG4gICAgICAgICAgdGFibGVzQ29uZmlnW3NlbGVjdGlvbkl0ZW0ucmVsYXRpb25UYWJsZVRzS2V5XSxcbiAgICAgICAgICBzdWJSb3csXG4gICAgICAgICAgc2VsZWN0aW9uSXRlbS5zZWxlY3Rpb24sXG4gICAgICAgICAgbWFwQ29sdW1uVmFsdWVcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdmFsdWUgPSBtYXBDb2x1bW5WYWx1ZShyb3dbc2VsZWN0aW9uSXRlbUluZGV4XSk7XG4gICAgICBjb25zdCBmaWVsZCA9IHNlbGVjdGlvbkl0ZW0uZmllbGQ7XG4gICAgICBsZXQgZGVjb2RlcjtcbiAgICAgIGlmIChpcyhmaWVsZCwgQ29sdW1uKSkge1xuICAgICAgICBkZWNvZGVyID0gZmllbGQ7XG4gICAgICB9IGVsc2UgaWYgKGlzKGZpZWxkLCBTUUwpKSB7XG4gICAgICAgIGRlY29kZXIgPSBmaWVsZC5kZWNvZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb2RlciA9IGZpZWxkLnNxbC5kZWNvZGVyO1xuICAgICAgfVxuICAgICAgcmVzdWx0W3NlbGVjdGlvbkl0ZW0udHNLZXldID0gdmFsdWUgPT09IG51bGwgPyBudWxsIDogZGVjb2Rlci5tYXBGcm9tRHJpdmVyVmFsdWUodmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IHtcbiAgTWFueSxcbiAgT25lLFxuICBSZWxhdGlvbixcbiAgUmVsYXRpb25zLFxuICBjcmVhdGVNYW55LFxuICBjcmVhdGVPbmUsXG4gIGNyZWF0ZVRhYmxlUmVsYXRpb25zSGVscGVycyxcbiAgZXh0cmFjdFRhYmxlc1JlbGF0aW9uYWxDb25maWcsXG4gIGdldE9wZXJhdG9ycyxcbiAgZ2V0T3JkZXJCeU9wZXJhdG9ycyxcbiAgbWFwUmVsYXRpb25hbFJvdyxcbiAgbm9ybWFsaXplUmVsYXRpb24sXG4gIHJlbGF0aW9uc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlbGF0aW9ucy5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBWaWV3IH0gZnJvbSBcIi4uL3NxbC9zcWwuanNcIjtcbmNsYXNzIFNRTGl0ZVZpZXdCYXNlIGV4dGVuZHMgVmlldyB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVZpZXdCYXNlXCI7XG59XG5leHBvcnQge1xuICBTUUxpdGVWaWV3QmFzZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZpZXctYmFzZS5qcy5tYXAiLAogICAgImltcG9ydCB7IGFsaWFzZWRUYWJsZSwgYWxpYXNlZFRhYmxlQ29sdW1uLCBtYXBDb2x1bW5zSW5BbGlhc2VkU1FMVG9BbGlhcywgbWFwQ29sdW1uc0luU1FMVG9BbGlhcyB9IGZyb20gXCIuLi9hbGlhcy5qc1wiO1xuaW1wb3J0IHsgQ2FzaW5nQ2FjaGUgfSBmcm9tIFwiLi4vY2FzaW5nLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi4vY29sdW1uLmpzXCI7XG5pbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IERyaXp6bGVFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMuanNcIjtcbmltcG9ydCB7XG4gIGdldE9wZXJhdG9ycyxcbiAgZ2V0T3JkZXJCeU9wZXJhdG9ycyxcbiAgTWFueSxcbiAgbm9ybWFsaXplUmVsYXRpb24sXG4gIE9uZVxufSBmcm9tIFwiLi4vcmVsYXRpb25zLmpzXCI7XG5pbXBvcnQgeyBhbmQsIGVxIH0gZnJvbSBcIi4uL3NxbC9pbmRleC5qc1wiO1xuaW1wb3J0IHsgUGFyYW0sIFNRTCwgc3FsIH0gZnJvbSBcIi4uL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFNRTGl0ZUNvbHVtbiB9IGZyb20gXCIuL2NvbHVtbnMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNRTGl0ZVRhYmxlIH0gZnJvbSBcIi4vdGFibGUuanNcIjtcbmltcG9ydCB7IFN1YnF1ZXJ5IH0gZnJvbSBcIi4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBnZXRUYWJsZU5hbWUsIGdldFRhYmxlVW5pcXVlTmFtZSwgVGFibGUgfSBmcm9tIFwiLi4vdGFibGUuanNcIjtcbmltcG9ydCB7IG9yZGVyU2VsZWN0ZWRGaWVsZHMgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4uL3ZpZXctY29tbW9uLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVWaWV3QmFzZSB9IGZyb20gXCIuL3ZpZXctYmFzZS5qc1wiO1xuY2xhc3MgU1FMaXRlRGlhbGVjdCB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZURpYWxlY3RcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjYXNpbmc7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHRoaXMuY2FzaW5nID0gbmV3IENhc2luZ0NhY2hlKGNvbmZpZz8uY2FzaW5nKTtcbiAgfVxuICBlc2NhcGVOYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gYFwiJHtuYW1lfVwiYDtcbiAgfVxuICBlc2NhcGVQYXJhbShfbnVtKSB7XG4gICAgcmV0dXJuIFwiP1wiO1xuICB9XG4gIGVzY2FwZVN0cmluZyhzdHIpIHtcbiAgICByZXR1cm4gYCcke3N0ci5yZXBsYWNlKC8nL2csIFwiJydcIil9J2A7XG4gIH1cbiAgYnVpbGRXaXRoQ1RFKHF1ZXJpZXMpIHtcbiAgICBpZiAoIXF1ZXJpZXM/Lmxlbmd0aCkgcmV0dXJuIHZvaWQgMDtcbiAgICBjb25zdCB3aXRoU3FsQ2h1bmtzID0gW3NxbGB3aXRoIGBdO1xuICAgIGZvciAoY29uc3QgW2ksIHddIG9mIHF1ZXJpZXMuZW50cmllcygpKSB7XG4gICAgICB3aXRoU3FsQ2h1bmtzLnB1c2goc3FsYCR7c3FsLmlkZW50aWZpZXIody5fLmFsaWFzKX0gYXMgKCR7dy5fLnNxbH0pYCk7XG4gICAgICBpZiAoaSA8IHF1ZXJpZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICB3aXRoU3FsQ2h1bmtzLnB1c2goc3FsYCwgYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHdpdGhTcWxDaHVua3MucHVzaChzcWxgIGApO1xuICAgIHJldHVybiBzcWwuam9pbih3aXRoU3FsQ2h1bmtzKTtcbiAgfVxuICBidWlsZERlbGV0ZVF1ZXJ5KHsgdGFibGUsIHdoZXJlLCByZXR1cm5pbmcsIHdpdGhMaXN0LCBsaW1pdCwgb3JkZXJCeSB9KSB7XG4gICAgY29uc3Qgd2l0aFNxbCA9IHRoaXMuYnVpbGRXaXRoQ1RFKHdpdGhMaXN0KTtcbiAgICBjb25zdCByZXR1cm5pbmdTcWwgPSByZXR1cm5pbmcgPyBzcWxgIHJldHVybmluZyAke3RoaXMuYnVpbGRTZWxlY3Rpb24ocmV0dXJuaW5nLCB7IGlzU2luZ2xlVGFibGU6IHRydWUgfSl9YCA6IHZvaWQgMDtcbiAgICBjb25zdCB3aGVyZVNxbCA9IHdoZXJlID8gc3FsYCB3aGVyZSAke3doZXJlfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgb3JkZXJCeVNxbCA9IHRoaXMuYnVpbGRPcmRlckJ5KG9yZGVyQnkpO1xuICAgIGNvbnN0IGxpbWl0U3FsID0gdGhpcy5idWlsZExpbWl0KGxpbWl0KTtcbiAgICByZXR1cm4gc3FsYCR7d2l0aFNxbH1kZWxldGUgZnJvbSAke3RhYmxlfSR7d2hlcmVTcWx9JHtyZXR1cm5pbmdTcWx9JHtvcmRlckJ5U3FsfSR7bGltaXRTcWx9YDtcbiAgfVxuICBidWlsZFVwZGF0ZVNldCh0YWJsZSwgc2V0KSB7XG4gICAgY29uc3QgdGFibGVDb2x1bW5zID0gdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdO1xuICAgIGNvbnN0IGNvbHVtbk5hbWVzID0gT2JqZWN0LmtleXModGFibGVDb2x1bW5zKS5maWx0ZXIoXG4gICAgICAoY29sTmFtZSkgPT4gc2V0W2NvbE5hbWVdICE9PSB2b2lkIDAgfHwgdGFibGVDb2x1bW5zW2NvbE5hbWVdPy5vblVwZGF0ZUZuICE9PSB2b2lkIDBcbiAgICApO1xuICAgIGNvbnN0IHNldFNpemUgPSBjb2x1bW5OYW1lcy5sZW5ndGg7XG4gICAgcmV0dXJuIHNxbC5qb2luKGNvbHVtbk5hbWVzLmZsYXRNYXAoKGNvbE5hbWUsIGkpID0+IHtcbiAgICAgIGNvbnN0IGNvbCA9IHRhYmxlQ29sdW1uc1tjb2xOYW1lXTtcbiAgICAgIGNvbnN0IHZhbHVlID0gc2V0W2NvbE5hbWVdID8/IHNxbC5wYXJhbShjb2wub25VcGRhdGVGbigpLCBjb2wpO1xuICAgICAgY29uc3QgcmVzID0gc3FsYCR7c3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGNvbCkpfSA9ICR7dmFsdWV9YDtcbiAgICAgIGlmIChpIDwgc2V0U2l6ZSAtIDEpIHtcbiAgICAgICAgcmV0dXJuIFtyZXMsIHNxbC5yYXcoXCIsIFwiKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gW3Jlc107XG4gICAgfSkpO1xuICB9XG4gIGJ1aWxkVXBkYXRlUXVlcnkoeyB0YWJsZSwgc2V0LCB3aGVyZSwgcmV0dXJuaW5nLCB3aXRoTGlzdCwgam9pbnMsIGZyb20sIGxpbWl0LCBvcmRlckJ5IH0pIHtcbiAgICBjb25zdCB3aXRoU3FsID0gdGhpcy5idWlsZFdpdGhDVEUod2l0aExpc3QpO1xuICAgIGNvbnN0IHNldFNxbCA9IHRoaXMuYnVpbGRVcGRhdGVTZXQodGFibGUsIHNldCk7XG4gICAgY29uc3QgZnJvbVNxbCA9IGZyb20gJiYgc3FsLmpvaW4oW3NxbC5yYXcoXCIgZnJvbSBcIiksIHRoaXMuYnVpbGRGcm9tVGFibGUoZnJvbSldKTtcbiAgICBjb25zdCBqb2luc1NxbCA9IHRoaXMuYnVpbGRKb2lucyhqb2lucyk7XG4gICAgY29uc3QgcmV0dXJuaW5nU3FsID0gcmV0dXJuaW5nID8gc3FsYCByZXR1cm5pbmcgJHt0aGlzLmJ1aWxkU2VsZWN0aW9uKHJldHVybmluZywgeyBpc1NpbmdsZVRhYmxlOiB0cnVlIH0pfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgd2hlcmVTcWwgPSB3aGVyZSA/IHNxbGAgd2hlcmUgJHt3aGVyZX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IG9yZGVyQnlTcWwgPSB0aGlzLmJ1aWxkT3JkZXJCeShvcmRlckJ5KTtcbiAgICBjb25zdCBsaW1pdFNxbCA9IHRoaXMuYnVpbGRMaW1pdChsaW1pdCk7XG4gICAgcmV0dXJuIHNxbGAke3dpdGhTcWx9dXBkYXRlICR7dGFibGV9IHNldCAke3NldFNxbH0ke2Zyb21TcWx9JHtqb2luc1NxbH0ke3doZXJlU3FsfSR7cmV0dXJuaW5nU3FsfSR7b3JkZXJCeVNxbH0ke2xpbWl0U3FsfWA7XG4gIH1cbiAgLyoqXG4gICAqIEJ1aWxkcyBzZWxlY3Rpb24gU1FMIHdpdGggcHJvdmlkZWQgZmllbGRzL2V4cHJlc3Npb25zXG4gICAqXG4gICAqIEV4YW1wbGVzOlxuICAgKlxuICAgKiBgc2VsZWN0IDxzZWxlY3Rpb24+IGZyb21gXG4gICAqXG4gICAqIGBpbnNlcnQgLi4uIHJldHVybmluZyA8c2VsZWN0aW9uPmBcbiAgICpcbiAgICogSWYgYGlzU2luZ2xlVGFibGVgIGlzIHRydWUsIHRoZW4gY29sdW1ucyB3b24ndCBiZSBwcmVmaXhlZCB3aXRoIHRhYmxlIG5hbWVcbiAgICovXG4gIGJ1aWxkU2VsZWN0aW9uKGZpZWxkcywgeyBpc1NpbmdsZVRhYmxlID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgY29uc3QgY29sdW1uc0xlbiA9IGZpZWxkcy5sZW5ndGg7XG4gICAgY29uc3QgY2h1bmtzID0gZmllbGRzLmZsYXRNYXAoKHsgZmllbGQgfSwgaSkgPT4ge1xuICAgICAgY29uc3QgY2h1bmsgPSBbXTtcbiAgICAgIGlmIChpcyhmaWVsZCwgU1FMLkFsaWFzZWQpICYmIGZpZWxkLmlzU2VsZWN0aW9uRmllbGQpIHtcbiAgICAgICAgY2h1bmsucHVzaChzcWwuaWRlbnRpZmllcihmaWVsZC5maWVsZEFsaWFzKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzKGZpZWxkLCBTUUwuQWxpYXNlZCkgfHwgaXMoZmllbGQsIFNRTCkpIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpcyhmaWVsZCwgU1FMLkFsaWFzZWQpID8gZmllbGQuc3FsIDogZmllbGQ7XG4gICAgICAgIGlmIChpc1NpbmdsZVRhYmxlKSB7XG4gICAgICAgICAgY2h1bmsucHVzaChcbiAgICAgICAgICAgIG5ldyBTUUwoXG4gICAgICAgICAgICAgIHF1ZXJ5LnF1ZXJ5Q2h1bmtzLm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpcyhjLCBDb2x1bW4pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gc3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaHVuay5wdXNoKHF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXMoZmllbGQsIFNRTC5BbGlhc2VkKSkge1xuICAgICAgICAgIGNodW5rLnB1c2goc3FsYCBhcyAke3NxbC5pZGVudGlmaWVyKGZpZWxkLmZpZWxkQWxpYXMpfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzKGZpZWxkLCBDb2x1bW4pKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGZpZWxkLnRhYmxlW1RhYmxlLlN5bWJvbC5OYW1lXTtcbiAgICAgICAgaWYgKGZpZWxkLmNvbHVtblR5cGUgPT09IFwiU1FMaXRlTnVtZXJpY0JpZ0ludFwiKSB7XG4gICAgICAgICAgaWYgKGlzU2luZ2xlVGFibGUpIHtcbiAgICAgICAgICAgIGNodW5rLnB1c2goc3FsYGNhc3QoJHtzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoZmllbGQpKX0gYXMgdGV4dClgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2h1bmsucHVzaChcbiAgICAgICAgICAgICAgc3FsYGNhc3QoJHtzcWwuaWRlbnRpZmllcih0YWJsZU5hbWUpfS4ke3NxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhmaWVsZCkpfSBhcyB0ZXh0KWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpc1NpbmdsZVRhYmxlKSB7XG4gICAgICAgICAgICBjaHVuay5wdXNoKHNxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhmaWVsZCkpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2h1bmsucHVzaChzcWxgJHtzcWwuaWRlbnRpZmllcih0YWJsZU5hbWUpfS4ke3NxbC5pZGVudGlmaWVyKHRoaXMuY2FzaW5nLmdldENvbHVtbkNhc2luZyhmaWVsZCkpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPCBjb2x1bW5zTGVuIC0gMSkge1xuICAgICAgICBjaHVuay5wdXNoKHNxbGAsIGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNodW5rO1xuICAgIH0pO1xuICAgIHJldHVybiBzcWwuam9pbihjaHVua3MpO1xuICB9XG4gIGJ1aWxkSm9pbnMoam9pbnMpIHtcbiAgICBpZiAoIWpvaW5zIHx8IGpvaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG4gICAgY29uc3Qgam9pbnNBcnJheSA9IFtdO1xuICAgIGlmIChqb2lucykge1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGpvaW5NZXRhXSBvZiBqb2lucy5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgam9pbnNBcnJheS5wdXNoKHNxbGAgYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFibGUgPSBqb2luTWV0YS50YWJsZTtcbiAgICAgICAgY29uc3Qgb25TcWwgPSBqb2luTWV0YS5vbiA/IHNxbGAgb24gJHtqb2luTWV0YS5vbn1gIDogdm9pZCAwO1xuICAgICAgICBpZiAoaXModGFibGUsIFNRTGl0ZVRhYmxlKSkge1xuICAgICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5OYW1lXTtcbiAgICAgICAgICBjb25zdCB0YWJsZVNjaGVtYSA9IHRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5TY2hlbWFdO1xuICAgICAgICAgIGNvbnN0IG9yaWdUYWJsZU5hbWUgPSB0YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuT3JpZ2luYWxOYW1lXTtcbiAgICAgICAgICBjb25zdCBhbGlhcyA9IHRhYmxlTmFtZSA9PT0gb3JpZ1RhYmxlTmFtZSA/IHZvaWQgMCA6IGpvaW5NZXRhLmFsaWFzO1xuICAgICAgICAgIGpvaW5zQXJyYXkucHVzaChcbiAgICAgICAgICAgIHNxbGAke3NxbC5yYXcoam9pbk1ldGEuam9pblR5cGUpfSBqb2luICR7dGFibGVTY2hlbWEgPyBzcWxgJHtzcWwuaWRlbnRpZmllcih0YWJsZVNjaGVtYSl9LmAgOiB2b2lkIDB9JHtzcWwuaWRlbnRpZmllcihvcmlnVGFibGVOYW1lKX0ke2FsaWFzICYmIHNxbGAgJHtzcWwuaWRlbnRpZmllcihhbGlhcyl9YH0ke29uU3FsfWBcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpvaW5zQXJyYXkucHVzaChcbiAgICAgICAgICAgIHNxbGAke3NxbC5yYXcoam9pbk1ldGEuam9pblR5cGUpfSBqb2luICR7dGFibGV9JHtvblNxbH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggPCBqb2lucy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgam9pbnNBcnJheS5wdXNoKHNxbGAgYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNxbC5qb2luKGpvaW5zQXJyYXkpO1xuICB9XG4gIGJ1aWxkTGltaXQobGltaXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIGxpbWl0ID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBsaW1pdCA9PT0gXCJudW1iZXJcIiAmJiBsaW1pdCA+PSAwID8gc3FsYCBsaW1pdCAke2xpbWl0fWAgOiB2b2lkIDA7XG4gIH1cbiAgYnVpbGRPcmRlckJ5KG9yZGVyQnkpIHtcbiAgICBjb25zdCBvcmRlckJ5TGlzdCA9IFtdO1xuICAgIGlmIChvcmRlckJ5KSB7XG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgb3JkZXJCeVZhbHVlXSBvZiBvcmRlckJ5LmVudHJpZXMoKSkge1xuICAgICAgICBvcmRlckJ5TGlzdC5wdXNoKG9yZGVyQnlWYWx1ZSk7XG4gICAgICAgIGlmIChpbmRleCA8IG9yZGVyQnkubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIG9yZGVyQnlMaXN0LnB1c2goc3FsYCwgYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9yZGVyQnlMaXN0Lmxlbmd0aCA+IDAgPyBzcWxgIG9yZGVyIGJ5ICR7c3FsLmpvaW4ob3JkZXJCeUxpc3QpfWAgOiB2b2lkIDA7XG4gIH1cbiAgYnVpbGRGcm9tVGFibGUodGFibGUpIHtcbiAgICBpZiAoaXModGFibGUsIFRhYmxlKSAmJiB0YWJsZVtUYWJsZS5TeW1ib2wuSXNBbGlhc10pIHtcbiAgICAgIHJldHVybiBzcWxgJHtzcWxgJHtzcWwuaWRlbnRpZmllcih0YWJsZVtUYWJsZS5TeW1ib2wuU2NoZW1hXSA/PyBcIlwiKX0uYC5pZih0YWJsZVtUYWJsZS5TeW1ib2wuU2NoZW1hXSl9JHtzcWwuaWRlbnRpZmllcih0YWJsZVtUYWJsZS5TeW1ib2wuT3JpZ2luYWxOYW1lXSl9ICR7c3FsLmlkZW50aWZpZXIodGFibGVbVGFibGUuU3ltYm9sLk5hbWVdKX1gO1xuICAgIH1cbiAgICByZXR1cm4gdGFibGU7XG4gIH1cbiAgYnVpbGRTZWxlY3RRdWVyeSh7XG4gICAgd2l0aExpc3QsXG4gICAgZmllbGRzLFxuICAgIGZpZWxkc0ZsYXQsXG4gICAgd2hlcmUsXG4gICAgaGF2aW5nLFxuICAgIHRhYmxlLFxuICAgIGpvaW5zLFxuICAgIG9yZGVyQnksXG4gICAgZ3JvdXBCeSxcbiAgICBsaW1pdCxcbiAgICBvZmZzZXQsXG4gICAgZGlzdGluY3QsXG4gICAgc2V0T3BlcmF0b3JzXG4gIH0pIHtcbiAgICBjb25zdCBmaWVsZHNMaXN0ID0gZmllbGRzRmxhdCA/PyBvcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkcyk7XG4gICAgZm9yIChjb25zdCBmIG9mIGZpZWxkc0xpc3QpIHtcbiAgICAgIGlmIChpcyhmLmZpZWxkLCBDb2x1bW4pICYmIGdldFRhYmxlTmFtZShmLmZpZWxkLnRhYmxlKSAhPT0gKGlzKHRhYmxlLCBTdWJxdWVyeSkgPyB0YWJsZS5fLmFsaWFzIDogaXModGFibGUsIFNRTGl0ZVZpZXdCYXNlKSA/IHRhYmxlW1ZpZXdCYXNlQ29uZmlnXS5uYW1lIDogaXModGFibGUsIFNRTCkgPyB2b2lkIDAgOiBnZXRUYWJsZU5hbWUodGFibGUpKSAmJiAhKCh0YWJsZTIpID0+IGpvaW5zPy5zb21lKFxuICAgICAgICAoeyBhbGlhcyB9KSA9PiBhbGlhcyA9PT0gKHRhYmxlMltUYWJsZS5TeW1ib2wuSXNBbGlhc10gPyBnZXRUYWJsZU5hbWUodGFibGUyKSA6IHRhYmxlMltUYWJsZS5TeW1ib2wuQmFzZU5hbWVdKVxuICAgICAgKSkoZi5maWVsZC50YWJsZSkpIHtcbiAgICAgICAgY29uc3QgdGFibGVOYW1lID0gZ2V0VGFibGVOYW1lKGYuZmllbGQudGFibGUpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFlvdXIgXCIke2YucGF0aC5qb2luKFwiLT5cIil9XCIgZmllbGQgcmVmZXJlbmNlcyBhIGNvbHVtbiBcIiR7dGFibGVOYW1lfVwiLlwiJHtmLmZpZWxkLm5hbWV9XCIsIGJ1dCB0aGUgdGFibGUgXCIke3RhYmxlTmFtZX1cIiBpcyBub3QgcGFydCBvZiB0aGUgcXVlcnkhIERpZCB5b3UgZm9yZ2V0IHRvIGpvaW4gaXQ/YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpc1NpbmdsZVRhYmxlID0gIWpvaW5zIHx8IGpvaW5zLmxlbmd0aCA9PT0gMDtcbiAgICBjb25zdCB3aXRoU3FsID0gdGhpcy5idWlsZFdpdGhDVEUod2l0aExpc3QpO1xuICAgIGNvbnN0IGRpc3RpbmN0U3FsID0gZGlzdGluY3QgPyBzcWxgIGRpc3RpbmN0YCA6IHZvaWQgMDtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmJ1aWxkU2VsZWN0aW9uKGZpZWxkc0xpc3QsIHsgaXNTaW5nbGVUYWJsZSB9KTtcbiAgICBjb25zdCB0YWJsZVNxbCA9IHRoaXMuYnVpbGRGcm9tVGFibGUodGFibGUpO1xuICAgIGNvbnN0IGpvaW5zU3FsID0gdGhpcy5idWlsZEpvaW5zKGpvaW5zKTtcbiAgICBjb25zdCB3aGVyZVNxbCA9IHdoZXJlID8gc3FsYCB3aGVyZSAke3doZXJlfWAgOiB2b2lkIDA7XG4gICAgY29uc3QgaGF2aW5nU3FsID0gaGF2aW5nID8gc3FsYCBoYXZpbmcgJHtoYXZpbmd9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBncm91cEJ5TGlzdCA9IFtdO1xuICAgIGlmIChncm91cEJ5KSB7XG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgZ3JvdXBCeVZhbHVlXSBvZiBncm91cEJ5LmVudHJpZXMoKSkge1xuICAgICAgICBncm91cEJ5TGlzdC5wdXNoKGdyb3VwQnlWYWx1ZSk7XG4gICAgICAgIGlmIChpbmRleCA8IGdyb3VwQnkubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGdyb3VwQnlMaXN0LnB1c2goc3FsYCwgYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZ3JvdXBCeVNxbCA9IGdyb3VwQnlMaXN0Lmxlbmd0aCA+IDAgPyBzcWxgIGdyb3VwIGJ5ICR7c3FsLmpvaW4oZ3JvdXBCeUxpc3QpfWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgb3JkZXJCeVNxbCA9IHRoaXMuYnVpbGRPcmRlckJ5KG9yZGVyQnkpO1xuICAgIGNvbnN0IGxpbWl0U3FsID0gdGhpcy5idWlsZExpbWl0KGxpbWl0KTtcbiAgICBjb25zdCBvZmZzZXRTcWwgPSBvZmZzZXQgPyBzcWxgIG9mZnNldCAke29mZnNldH1gIDogdm9pZCAwO1xuICAgIGNvbnN0IGZpbmFsUXVlcnkgPSBzcWxgJHt3aXRoU3FsfXNlbGVjdCR7ZGlzdGluY3RTcWx9ICR7c2VsZWN0aW9ufSBmcm9tICR7dGFibGVTcWx9JHtqb2luc1NxbH0ke3doZXJlU3FsfSR7Z3JvdXBCeVNxbH0ke2hhdmluZ1NxbH0ke29yZGVyQnlTcWx9JHtsaW1pdFNxbH0ke29mZnNldFNxbH1gO1xuICAgIGlmIChzZXRPcGVyYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRTZXRPcGVyYXRpb25zKGZpbmFsUXVlcnksIHNldE9wZXJhdG9ycyk7XG4gICAgfVxuICAgIHJldHVybiBmaW5hbFF1ZXJ5O1xuICB9XG4gIGJ1aWxkU2V0T3BlcmF0aW9ucyhsZWZ0U2VsZWN0LCBzZXRPcGVyYXRvcnMpIHtcbiAgICBjb25zdCBbc2V0T3BlcmF0b3IsIC4uLnJlc3RdID0gc2V0T3BlcmF0b3JzO1xuICAgIGlmICghc2V0T3BlcmF0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBwYXNzIHVuZGVmaW5lZCB2YWx1ZXMgdG8gYW55IHNldCBvcGVyYXRvclwiKTtcbiAgICB9XG4gICAgaWYgKHJlc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZFNldE9wZXJhdGlvblF1ZXJ5KHsgbGVmdFNlbGVjdCwgc2V0T3BlcmF0b3IgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJ1aWxkU2V0T3BlcmF0aW9ucyhcbiAgICAgIHRoaXMuYnVpbGRTZXRPcGVyYXRpb25RdWVyeSh7IGxlZnRTZWxlY3QsIHNldE9wZXJhdG9yIH0pLFxuICAgICAgcmVzdFxuICAgICk7XG4gIH1cbiAgYnVpbGRTZXRPcGVyYXRpb25RdWVyeSh7XG4gICAgbGVmdFNlbGVjdCxcbiAgICBzZXRPcGVyYXRvcjogeyB0eXBlLCBpc0FsbCwgcmlnaHRTZWxlY3QsIGxpbWl0LCBvcmRlckJ5LCBvZmZzZXQgfVxuICB9KSB7XG4gICAgY29uc3QgbGVmdENodW5rID0gc3FsYCR7bGVmdFNlbGVjdC5nZXRTUUwoKX0gYDtcbiAgICBjb25zdCByaWdodENodW5rID0gc3FsYCR7cmlnaHRTZWxlY3QuZ2V0U1FMKCl9YDtcbiAgICBsZXQgb3JkZXJCeVNxbDtcbiAgICBpZiAob3JkZXJCeSAmJiBvcmRlckJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG9yZGVyQnlWYWx1ZXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3Qgc2luZ2xlT3JkZXJCeSBvZiBvcmRlckJ5KSB7XG4gICAgICAgIGlmIChpcyhzaW5nbGVPcmRlckJ5LCBTUUxpdGVDb2x1bW4pKSB7XG4gICAgICAgICAgb3JkZXJCeVZhbHVlcy5wdXNoKHNxbC5pZGVudGlmaWVyKHNpbmdsZU9yZGVyQnkubmFtZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzKHNpbmdsZU9yZGVyQnksIFNRTCkpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpbmdsZU9yZGVyQnkucXVlcnlDaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNodW5rID0gc2luZ2xlT3JkZXJCeS5xdWVyeUNodW5rc1tpXTtcbiAgICAgICAgICAgIGlmIChpcyhjaHVuaywgU1FMaXRlQ29sdW1uKSkge1xuICAgICAgICAgICAgICBzaW5nbGVPcmRlckJ5LnF1ZXJ5Q2h1bmtzW2ldID0gc3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGNodW5rKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG9yZGVyQnlWYWx1ZXMucHVzaChzcWxgJHtzaW5nbGVPcmRlckJ5fWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9yZGVyQnlWYWx1ZXMucHVzaChzcWxgJHtzaW5nbGVPcmRlckJ5fWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvcmRlckJ5U3FsID0gc3FsYCBvcmRlciBieSAke3NxbC5qb2luKG9yZGVyQnlWYWx1ZXMsIHNxbGAsIGApfWA7XG4gICAgfVxuICAgIGNvbnN0IGxpbWl0U3FsID0gdHlwZW9mIGxpbWl0ID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBsaW1pdCA9PT0gXCJudW1iZXJcIiAmJiBsaW1pdCA+PSAwID8gc3FsYCBsaW1pdCAke2xpbWl0fWAgOiB2b2lkIDA7XG4gICAgY29uc3Qgb3BlcmF0b3JDaHVuayA9IHNxbC5yYXcoYCR7dHlwZX0gJHtpc0FsbCA/IFwiYWxsIFwiIDogXCJcIn1gKTtcbiAgICBjb25zdCBvZmZzZXRTcWwgPSBvZmZzZXQgPyBzcWxgIG9mZnNldCAke29mZnNldH1gIDogdm9pZCAwO1xuICAgIHJldHVybiBzcWxgJHtsZWZ0Q2h1bmt9JHtvcGVyYXRvckNodW5rfSR7cmlnaHRDaHVua30ke29yZGVyQnlTcWx9JHtsaW1pdFNxbH0ke29mZnNldFNxbH1gO1xuICB9XG4gIGJ1aWxkSW5zZXJ0UXVlcnkoeyB0YWJsZSwgdmFsdWVzOiB2YWx1ZXNPclNlbGVjdCwgb25Db25mbGljdCwgcmV0dXJuaW5nLCB3aXRoTGlzdCwgc2VsZWN0IH0pIHtcbiAgICBjb25zdCB2YWx1ZXNTcWxMaXN0ID0gW107XG4gICAgY29uc3QgY29sdW1ucyA9IHRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXTtcbiAgICBjb25zdCBjb2xFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoY29sdW1ucykuZmlsdGVyKFxuICAgICAgKFtfLCBjb2xdKSA9PiAhY29sLnNob3VsZERpc2FibGVJbnNlcnQoKVxuICAgICk7XG4gICAgY29uc3QgaW5zZXJ0T3JkZXIgPSBjb2xFbnRyaWVzLm1hcCgoWywgY29sdW1uXSkgPT4gc3FsLmlkZW50aWZpZXIodGhpcy5jYXNpbmcuZ2V0Q29sdW1uQ2FzaW5nKGNvbHVtbikpKTtcbiAgICBpZiAoc2VsZWN0KSB7XG4gICAgICBjb25zdCBzZWxlY3QyID0gdmFsdWVzT3JTZWxlY3Q7XG4gICAgICBpZiAoaXMoc2VsZWN0MiwgU1FMKSkge1xuICAgICAgICB2YWx1ZXNTcWxMaXN0LnB1c2goc2VsZWN0Mik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXNTcWxMaXN0LnB1c2goc2VsZWN0Mi5nZXRTUUwoKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHZhbHVlc09yU2VsZWN0O1xuICAgICAgdmFsdWVzU3FsTGlzdC5wdXNoKHNxbC5yYXcoXCJ2YWx1ZXMgXCIpKTtcbiAgICAgIGZvciAoY29uc3QgW3ZhbHVlSW5kZXgsIHZhbHVlXSBvZiB2YWx1ZXMuZW50cmllcygpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlTGlzdCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIGNvbF0gb2YgY29sRW50cmllcykge1xuICAgICAgICAgIGNvbnN0IGNvbFZhbHVlID0gdmFsdWVbZmllbGROYW1lXTtcbiAgICAgICAgICBpZiAoY29sVmFsdWUgPT09IHZvaWQgMCB8fCBpcyhjb2xWYWx1ZSwgUGFyYW0pICYmIGNvbFZhbHVlLnZhbHVlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGxldCBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICBpZiAoY29sLmRlZmF1bHQgIT09IG51bGwgJiYgY29sLmRlZmF1bHQgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBpcyhjb2wuZGVmYXVsdCwgU1FMKSA/IGNvbC5kZWZhdWx0IDogc3FsLnBhcmFtKGNvbC5kZWZhdWx0LCBjb2wpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2wuZGVmYXVsdEZuICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdEZuUmVzdWx0ID0gY29sLmRlZmF1bHRGbigpO1xuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBpcyhkZWZhdWx0Rm5SZXN1bHQsIFNRTCkgPyBkZWZhdWx0Rm5SZXN1bHQgOiBzcWwucGFyYW0oZGVmYXVsdEZuUmVzdWx0LCBjb2wpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghY29sLmRlZmF1bHQgJiYgY29sLm9uVXBkYXRlRm4gIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICBjb25zdCBvblVwZGF0ZUZuUmVzdWx0ID0gY29sLm9uVXBkYXRlRm4oKTtcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gaXMob25VcGRhdGVGblJlc3VsdCwgU1FMKSA/IG9uVXBkYXRlRm5SZXN1bHQgOiBzcWwucGFyYW0ob25VcGRhdGVGblJlc3VsdCwgY29sKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IHNxbGBudWxsYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlTGlzdC5wdXNoKGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlTGlzdC5wdXNoKGNvbFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWVzU3FsTGlzdC5wdXNoKHZhbHVlTGlzdCk7XG4gICAgICAgIGlmICh2YWx1ZUluZGV4IDwgdmFsdWVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICB2YWx1ZXNTcWxMaXN0LnB1c2goc3FsYCwgYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgd2l0aFNxbCA9IHRoaXMuYnVpbGRXaXRoQ1RFKHdpdGhMaXN0KTtcbiAgICBjb25zdCB2YWx1ZXNTcWwgPSBzcWwuam9pbih2YWx1ZXNTcWxMaXN0KTtcbiAgICBjb25zdCByZXR1cm5pbmdTcWwgPSByZXR1cm5pbmcgPyBzcWxgIHJldHVybmluZyAke3RoaXMuYnVpbGRTZWxlY3Rpb24ocmV0dXJuaW5nLCB7IGlzU2luZ2xlVGFibGU6IHRydWUgfSl9YCA6IHZvaWQgMDtcbiAgICBjb25zdCBvbkNvbmZsaWN0U3FsID0gb25Db25mbGljdD8ubGVuZ3RoID8gc3FsLmpvaW4ob25Db25mbGljdCkgOiB2b2lkIDA7XG4gICAgcmV0dXJuIHNxbGAke3dpdGhTcWx9aW5zZXJ0IGludG8gJHt0YWJsZX0gJHtpbnNlcnRPcmRlcn0gJHt2YWx1ZXNTcWx9JHtvbkNvbmZsaWN0U3FsfSR7cmV0dXJuaW5nU3FsfWA7XG4gIH1cbiAgc3FsVG9RdWVyeShzcWwyLCBpbnZva2VTb3VyY2UpIHtcbiAgICByZXR1cm4gc3FsMi50b1F1ZXJ5KHtcbiAgICAgIGNhc2luZzogdGhpcy5jYXNpbmcsXG4gICAgICBlc2NhcGVOYW1lOiB0aGlzLmVzY2FwZU5hbWUsXG4gICAgICBlc2NhcGVQYXJhbTogdGhpcy5lc2NhcGVQYXJhbSxcbiAgICAgIGVzY2FwZVN0cmluZzogdGhpcy5lc2NhcGVTdHJpbmcsXG4gICAgICBpbnZva2VTb3VyY2VcbiAgICB9KTtcbiAgfVxuICBidWlsZFJlbGF0aW9uYWxRdWVyeSh7XG4gICAgZnVsbFNjaGVtYSxcbiAgICBzY2hlbWEsXG4gICAgdGFibGVOYW1lc01hcCxcbiAgICB0YWJsZSxcbiAgICB0YWJsZUNvbmZpZyxcbiAgICBxdWVyeUNvbmZpZzogY29uZmlnLFxuICAgIHRhYmxlQWxpYXMsXG4gICAgbmVzdGVkUXVlcnlSZWxhdGlvbixcbiAgICBqb2luT25cbiAgfSkge1xuICAgIGxldCBzZWxlY3Rpb24gPSBbXTtcbiAgICBsZXQgbGltaXQsIG9mZnNldCwgb3JkZXJCeSA9IFtdLCB3aGVyZTtcbiAgICBjb25zdCBqb2lucyA9IFtdO1xuICAgIGlmIChjb25maWcgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGlvbkVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0YWJsZUNvbmZpZy5jb2x1bW5zKTtcbiAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbkVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgIGRiS2V5OiB2YWx1ZS5uYW1lLFxuICAgICAgICB0c0tleToga2V5LFxuICAgICAgICBmaWVsZDogYWxpYXNlZFRhYmxlQ29sdW1uKHZhbHVlLCB0YWJsZUFsaWFzKSxcbiAgICAgICAgcmVsYXRpb25UYWJsZVRzS2V5OiB2b2lkIDAsXG4gICAgICAgIGlzSnNvbjogZmFsc2UsXG4gICAgICAgIHNlbGVjdGlvbjogW11cbiAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYWxpYXNlZENvbHVtbnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHRhYmxlQ29uZmlnLmNvbHVtbnMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBhbGlhc2VkVGFibGVDb2x1bW4odmFsdWUsIHRhYmxlQWxpYXMpXSlcbiAgICAgICk7XG4gICAgICBpZiAoY29uZmlnLndoZXJlKSB7XG4gICAgICAgIGNvbnN0IHdoZXJlU3FsID0gdHlwZW9mIGNvbmZpZy53aGVyZSA9PT0gXCJmdW5jdGlvblwiID8gY29uZmlnLndoZXJlKGFsaWFzZWRDb2x1bW5zLCBnZXRPcGVyYXRvcnMoKSkgOiBjb25maWcud2hlcmU7XG4gICAgICAgIHdoZXJlID0gd2hlcmVTcWwgJiYgbWFwQ29sdW1uc0luU1FMVG9BbGlhcyh3aGVyZVNxbCwgdGFibGVBbGlhcyk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWVsZHNTZWxlY3Rpb24gPSBbXTtcbiAgICAgIGxldCBzZWxlY3RlZENvbHVtbnMgPSBbXTtcbiAgICAgIGlmIChjb25maWcuY29sdW1ucykge1xuICAgICAgICBsZXQgaXNJbmNsdWRlTW9kZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IFtmaWVsZCwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5jb2x1bW5zKSkge1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZpZWxkIGluIHRhYmxlQ29uZmlnLmNvbHVtbnMpIHtcbiAgICAgICAgICAgIGlmICghaXNJbmNsdWRlTW9kZSAmJiB2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBpc0luY2x1ZGVNb2RlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGVjdGVkQ29sdW1ucy5wdXNoKGZpZWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2VsZWN0ZWRDb2x1bW5zID0gaXNJbmNsdWRlTW9kZSA/IHNlbGVjdGVkQ29sdW1ucy5maWx0ZXIoKGMpID0+IGNvbmZpZy5jb2x1bW5zPy5bY10gPT09IHRydWUpIDogT2JqZWN0LmtleXModGFibGVDb25maWcuY29sdW1ucykuZmlsdGVyKChrZXkpID0+ICFzZWxlY3RlZENvbHVtbnMuaW5jbHVkZXMoa2V5KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdGVkQ29sdW1ucyA9IE9iamVjdC5rZXlzKHRhYmxlQ29uZmlnLmNvbHVtbnMpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBzZWxlY3RlZENvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGFibGVDb25maWcuY29sdW1uc1tmaWVsZF07XG4gICAgICAgIGZpZWxkc1NlbGVjdGlvbi5wdXNoKHsgdHNLZXk6IGZpZWxkLCB2YWx1ZTogY29sdW1uIH0pO1xuICAgICAgfVxuICAgICAgbGV0IHNlbGVjdGVkUmVsYXRpb25zID0gW107XG4gICAgICBpZiAoY29uZmlnLndpdGgpIHtcbiAgICAgICAgc2VsZWN0ZWRSZWxhdGlvbnMgPSBPYmplY3QuZW50cmllcyhjb25maWcud2l0aCkuZmlsdGVyKChlbnRyeSkgPT4gISFlbnRyeVsxXSkubWFwKChbdHNLZXksIHF1ZXJ5Q29uZmlnXSkgPT4gKHsgdHNLZXksIHF1ZXJ5Q29uZmlnLCByZWxhdGlvbjogdGFibGVDb25maWcucmVsYXRpb25zW3RzS2V5XSB9KSk7XG4gICAgICB9XG4gICAgICBsZXQgZXh0cmFzO1xuICAgICAgaWYgKGNvbmZpZy5leHRyYXMpIHtcbiAgICAgICAgZXh0cmFzID0gdHlwZW9mIGNvbmZpZy5leHRyYXMgPT09IFwiZnVuY3Rpb25cIiA/IGNvbmZpZy5leHRyYXMoYWxpYXNlZENvbHVtbnMsIHsgc3FsIH0pIDogY29uZmlnLmV4dHJhcztcbiAgICAgICAgZm9yIChjb25zdCBbdHNLZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhleHRyYXMpKSB7XG4gICAgICAgICAgZmllbGRzU2VsZWN0aW9uLnB1c2goe1xuICAgICAgICAgICAgdHNLZXksXG4gICAgICAgICAgICB2YWx1ZTogbWFwQ29sdW1uc0luQWxpYXNlZFNRTFRvQWxpYXModmFsdWUsIHRhYmxlQWxpYXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgeyB0c0tleSwgdmFsdWUgfSBvZiBmaWVsZHNTZWxlY3Rpb24pIHtcbiAgICAgICAgc2VsZWN0aW9uLnB1c2goe1xuICAgICAgICAgIGRiS2V5OiBpcyh2YWx1ZSwgU1FMLkFsaWFzZWQpID8gdmFsdWUuZmllbGRBbGlhcyA6IHRhYmxlQ29uZmlnLmNvbHVtbnNbdHNLZXldLm5hbWUsXG4gICAgICAgICAgdHNLZXksXG4gICAgICAgICAgZmllbGQ6IGlzKHZhbHVlLCBDb2x1bW4pID8gYWxpYXNlZFRhYmxlQ29sdW1uKHZhbHVlLCB0YWJsZUFsaWFzKSA6IHZhbHVlLFxuICAgICAgICAgIHJlbGF0aW9uVGFibGVUc0tleTogdm9pZCAwLFxuICAgICAgICAgIGlzSnNvbjogZmFsc2UsXG4gICAgICAgICAgc2VsZWN0aW9uOiBbXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGxldCBvcmRlckJ5T3JpZyA9IHR5cGVvZiBjb25maWcub3JkZXJCeSA9PT0gXCJmdW5jdGlvblwiID8gY29uZmlnLm9yZGVyQnkoYWxpYXNlZENvbHVtbnMsIGdldE9yZGVyQnlPcGVyYXRvcnMoKSkgOiBjb25maWcub3JkZXJCeSA/PyBbXTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShvcmRlckJ5T3JpZykpIHtcbiAgICAgICAgb3JkZXJCeU9yaWcgPSBbb3JkZXJCeU9yaWddO1xuICAgICAgfVxuICAgICAgb3JkZXJCeSA9IG9yZGVyQnlPcmlnLm1hcCgob3JkZXJCeVZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChpcyhvcmRlckJ5VmFsdWUsIENvbHVtbikpIHtcbiAgICAgICAgICByZXR1cm4gYWxpYXNlZFRhYmxlQ29sdW1uKG9yZGVyQnlWYWx1ZSwgdGFibGVBbGlhcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcENvbHVtbnNJblNRTFRvQWxpYXMob3JkZXJCeVZhbHVlLCB0YWJsZUFsaWFzKTtcbiAgICAgIH0pO1xuICAgICAgbGltaXQgPSBjb25maWcubGltaXQ7XG4gICAgICBvZmZzZXQgPSBjb25maWcub2Zmc2V0O1xuICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgIHRzS2V5OiBzZWxlY3RlZFJlbGF0aW9uVHNLZXksXG4gICAgICAgIHF1ZXJ5Q29uZmlnOiBzZWxlY3RlZFJlbGF0aW9uQ29uZmlnVmFsdWUsXG4gICAgICAgIHJlbGF0aW9uXG4gICAgICB9IG9mIHNlbGVjdGVkUmVsYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZWxhdGlvbiA9IG5vcm1hbGl6ZVJlbGF0aW9uKHNjaGVtYSwgdGFibGVOYW1lc01hcCwgcmVsYXRpb24pO1xuICAgICAgICBjb25zdCByZWxhdGlvblRhYmxlTmFtZSA9IGdldFRhYmxlVW5pcXVlTmFtZShyZWxhdGlvbi5yZWZlcmVuY2VkVGFibGUpO1xuICAgICAgICBjb25zdCByZWxhdGlvblRhYmxlVHNOYW1lID0gdGFibGVOYW1lc01hcFtyZWxhdGlvblRhYmxlTmFtZV07XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uVGFibGVBbGlhcyA9IGAke3RhYmxlQWxpYXN9XyR7c2VsZWN0ZWRSZWxhdGlvblRzS2V5fWA7XG4gICAgICAgIGNvbnN0IGpvaW5PbjIgPSBhbmQoXG4gICAgICAgICAgLi4ubm9ybWFsaXplZFJlbGF0aW9uLmZpZWxkcy5tYXAoXG4gICAgICAgICAgICAoZmllbGQyLCBpKSA9PiBlcShcbiAgICAgICAgICAgICAgYWxpYXNlZFRhYmxlQ29sdW1uKG5vcm1hbGl6ZWRSZWxhdGlvbi5yZWZlcmVuY2VzW2ldLCByZWxhdGlvblRhYmxlQWxpYXMpLFxuICAgICAgICAgICAgICBhbGlhc2VkVGFibGVDb2x1bW4oZmllbGQyLCB0YWJsZUFsaWFzKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYnVpbHRSZWxhdGlvbiA9IHRoaXMuYnVpbGRSZWxhdGlvbmFsUXVlcnkoe1xuICAgICAgICAgIGZ1bGxTY2hlbWEsXG4gICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgIHRhYmxlTmFtZXNNYXAsXG4gICAgICAgICAgdGFibGU6IGZ1bGxTY2hlbWFbcmVsYXRpb25UYWJsZVRzTmFtZV0sXG4gICAgICAgICAgdGFibGVDb25maWc6IHNjaGVtYVtyZWxhdGlvblRhYmxlVHNOYW1lXSxcbiAgICAgICAgICBxdWVyeUNvbmZpZzogaXMocmVsYXRpb24sIE9uZSkgPyBzZWxlY3RlZFJlbGF0aW9uQ29uZmlnVmFsdWUgPT09IHRydWUgPyB7IGxpbWl0OiAxIH0gOiB7IC4uLnNlbGVjdGVkUmVsYXRpb25Db25maWdWYWx1ZSwgbGltaXQ6IDEgfSA6IHNlbGVjdGVkUmVsYXRpb25Db25maWdWYWx1ZSxcbiAgICAgICAgICB0YWJsZUFsaWFzOiByZWxhdGlvblRhYmxlQWxpYXMsXG4gICAgICAgICAgam9pbk9uOiBqb2luT24yLFxuICAgICAgICAgIG5lc3RlZFF1ZXJ5UmVsYXRpb246IHJlbGF0aW9uXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBmaWVsZCA9IHNxbGAoJHtidWlsdFJlbGF0aW9uLnNxbH0pYC5hcyhzZWxlY3RlZFJlbGF0aW9uVHNLZXkpO1xuICAgICAgICBzZWxlY3Rpb24ucHVzaCh7XG4gICAgICAgICAgZGJLZXk6IHNlbGVjdGVkUmVsYXRpb25Uc0tleSxcbiAgICAgICAgICB0c0tleTogc2VsZWN0ZWRSZWxhdGlvblRzS2V5LFxuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIHJlbGF0aW9uVGFibGVUc0tleTogcmVsYXRpb25UYWJsZVRzTmFtZSxcbiAgICAgICAgICBpc0pzb246IHRydWUsXG4gICAgICAgICAgc2VsZWN0aW9uOiBidWlsdFJlbGF0aW9uLnNlbGVjdGlvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBEcml6emxlRXJyb3Ioe1xuICAgICAgICBtZXNzYWdlOiBgTm8gZmllbGRzIHNlbGVjdGVkIGZvciB0YWJsZSBcIiR7dGFibGVDb25maWcudHNOYW1lfVwiIChcIiR7dGFibGVBbGlhc31cIikuIFlvdSBuZWVkIHRvIGhhdmUgYXQgbGVhc3Qgb25lIGl0ZW0gaW4gXCJjb2x1bW5zXCIsIFwid2l0aFwiIG9yIFwiZXh0cmFzXCIuIElmIHlvdSBuZWVkIHRvIHNlbGVjdCBhbGwgY29sdW1ucywgb21pdCB0aGUgXCJjb2x1bW5zXCIga2V5IG9yIHNldCBpdCB0byB1bmRlZmluZWQuYFxuICAgICAgfSk7XG4gICAgfVxuICAgIGxldCByZXN1bHQ7XG4gICAgd2hlcmUgPSBhbmQoam9pbk9uLCB3aGVyZSk7XG4gICAgaWYgKG5lc3RlZFF1ZXJ5UmVsYXRpb24pIHtcbiAgICAgIGxldCBmaWVsZCA9IHNxbGBqc29uX2FycmF5KCR7c3FsLmpvaW4oXG4gICAgICAgIHNlbGVjdGlvbi5tYXAoXG4gICAgICAgICAgKHsgZmllbGQ6IGZpZWxkMiB9KSA9PiBpcyhmaWVsZDIsIFNRTGl0ZUNvbHVtbikgPyBzcWwuaWRlbnRpZmllcih0aGlzLmNhc2luZy5nZXRDb2x1bW5DYXNpbmcoZmllbGQyKSkgOiBpcyhmaWVsZDIsIFNRTC5BbGlhc2VkKSA/IGZpZWxkMi5zcWwgOiBmaWVsZDJcbiAgICAgICAgKSxcbiAgICAgICAgc3FsYCwgYFxuICAgICAgKX0pYDtcbiAgICAgIGlmIChpcyhuZXN0ZWRRdWVyeVJlbGF0aW9uLCBNYW55KSkge1xuICAgICAgICBmaWVsZCA9IHNxbGBjb2FsZXNjZShqc29uX2dyb3VwX2FycmF5KCR7ZmllbGR9KSwganNvbl9hcnJheSgpKWA7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXN0ZWRTZWxlY3Rpb24gPSBbe1xuICAgICAgICBkYktleTogXCJkYXRhXCIsXG4gICAgICAgIHRzS2V5OiBcImRhdGFcIixcbiAgICAgICAgZmllbGQ6IGZpZWxkLmFzKFwiZGF0YVwiKSxcbiAgICAgICAgaXNKc29uOiB0cnVlLFxuICAgICAgICByZWxhdGlvblRhYmxlVHNLZXk6IHRhYmxlQ29uZmlnLnRzTmFtZSxcbiAgICAgICAgc2VsZWN0aW9uXG4gICAgICB9XTtcbiAgICAgIGNvbnN0IG5lZWRzU3VicXVlcnkgPSBsaW1pdCAhPT0gdm9pZCAwIHx8IG9mZnNldCAhPT0gdm9pZCAwIHx8IG9yZGVyQnkubGVuZ3RoID4gMDtcbiAgICAgIGlmIChuZWVkc1N1YnF1ZXJ5KSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuYnVpbGRTZWxlY3RRdWVyeSh7XG4gICAgICAgICAgdGFibGU6IGFsaWFzZWRUYWJsZSh0YWJsZSwgdGFibGVBbGlhcyksXG4gICAgICAgICAgZmllbGRzOiB7fSxcbiAgICAgICAgICBmaWVsZHNGbGF0OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHBhdGg6IFtdLFxuICAgICAgICAgICAgICBmaWVsZDogc3FsLnJhdyhcIipcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIHdoZXJlLFxuICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICBvcmRlckJ5LFxuICAgICAgICAgIHNldE9wZXJhdG9yczogW11cbiAgICAgICAgfSk7XG4gICAgICAgIHdoZXJlID0gdm9pZCAwO1xuICAgICAgICBsaW1pdCA9IHZvaWQgMDtcbiAgICAgICAgb2Zmc2V0ID0gdm9pZCAwO1xuICAgICAgICBvcmRlckJ5ID0gdm9pZCAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gYWxpYXNlZFRhYmxlKHRhYmxlLCB0YWJsZUFsaWFzKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IHRoaXMuYnVpbGRTZWxlY3RRdWVyeSh7XG4gICAgICAgIHRhYmxlOiBpcyhyZXN1bHQsIFNRTGl0ZVRhYmxlKSA/IHJlc3VsdCA6IG5ldyBTdWJxdWVyeShyZXN1bHQsIHt9LCB0YWJsZUFsaWFzKSxcbiAgICAgICAgZmllbGRzOiB7fSxcbiAgICAgICAgZmllbGRzRmxhdDogbmVzdGVkU2VsZWN0aW9uLm1hcCgoeyBmaWVsZDogZmllbGQyIH0pID0+ICh7XG4gICAgICAgICAgcGF0aDogW10sXG4gICAgICAgICAgZmllbGQ6IGlzKGZpZWxkMiwgQ29sdW1uKSA/IGFsaWFzZWRUYWJsZUNvbHVtbihmaWVsZDIsIHRhYmxlQWxpYXMpIDogZmllbGQyXG4gICAgICAgIH0pKSxcbiAgICAgICAgam9pbnMsXG4gICAgICAgIHdoZXJlLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICBvcmRlckJ5LFxuICAgICAgICBzZXRPcGVyYXRvcnM6IFtdXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gdGhpcy5idWlsZFNlbGVjdFF1ZXJ5KHtcbiAgICAgICAgdGFibGU6IGFsaWFzZWRUYWJsZSh0YWJsZSwgdGFibGVBbGlhcyksXG4gICAgICAgIGZpZWxkczoge30sXG4gICAgICAgIGZpZWxkc0ZsYXQ6IHNlbGVjdGlvbi5tYXAoKHsgZmllbGQgfSkgPT4gKHtcbiAgICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgICBmaWVsZDogaXMoZmllbGQsIENvbHVtbikgPyBhbGlhc2VkVGFibGVDb2x1bW4oZmllbGQsIHRhYmxlQWxpYXMpIDogZmllbGRcbiAgICAgICAgfSkpLFxuICAgICAgICBqb2lucyxcbiAgICAgICAgd2hlcmUsXG4gICAgICAgIGxpbWl0LFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIG9yZGVyQnksXG4gICAgICAgIHNldE9wZXJhdG9yczogW11cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdGFibGVUc0tleTogdGFibGVDb25maWcudHNOYW1lLFxuICAgICAgc3FsOiByZXN1bHQsXG4gICAgICBzZWxlY3Rpb25cbiAgICB9O1xuICB9XG59XG5jbGFzcyBTUUxpdGVTeW5jRGlhbGVjdCBleHRlbmRzIFNRTGl0ZURpYWxlY3Qge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVTeW5jRGlhbGVjdFwiO1xuICBtaWdyYXRlKG1pZ3JhdGlvbnMsIHNlc3Npb24sIGNvbmZpZykge1xuICAgIGNvbnN0IG1pZ3JhdGlvbnNUYWJsZSA9IGNvbmZpZyA9PT0gdm9pZCAwID8gXCJfX2RyaXp6bGVfbWlncmF0aW9uc1wiIDogdHlwZW9mIGNvbmZpZyA9PT0gXCJzdHJpbmdcIiA/IFwiX19kcml6emxlX21pZ3JhdGlvbnNcIiA6IGNvbmZpZy5taWdyYXRpb25zVGFibGUgPz8gXCJfX2RyaXp6bGVfbWlncmF0aW9uc1wiO1xuICAgIGNvbnN0IG1pZ3JhdGlvblRhYmxlQ3JlYXRlID0gc3FsYFxuXHRcdFx0Q1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJHtzcWwuaWRlbnRpZmllcihtaWdyYXRpb25zVGFibGUpfSAoXG5cdFx0XHRcdGlkIFNFUklBTCBQUklNQVJZIEtFWSxcblx0XHRcdFx0aGFzaCB0ZXh0IE5PVCBOVUxMLFxuXHRcdFx0XHRjcmVhdGVkX2F0IG51bWVyaWNcblx0XHRcdClcblx0XHRgO1xuICAgIHNlc3Npb24ucnVuKG1pZ3JhdGlvblRhYmxlQ3JlYXRlKTtcbiAgICBjb25zdCBkYk1pZ3JhdGlvbnMgPSBzZXNzaW9uLnZhbHVlcyhcbiAgICAgIHNxbGBTRUxFQ1QgaWQsIGhhc2gsIGNyZWF0ZWRfYXQgRlJPTSAke3NxbC5pZGVudGlmaWVyKG1pZ3JhdGlvbnNUYWJsZSl9IE9SREVSIEJZIGNyZWF0ZWRfYXQgREVTQyBMSU1JVCAxYFxuICAgICk7XG4gICAgY29uc3QgbGFzdERiTWlncmF0aW9uID0gZGJNaWdyYXRpb25zWzBdID8/IHZvaWQgMDtcbiAgICBzZXNzaW9uLnJ1bihzcWxgQkVHSU5gKTtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBtaWdyYXRpb24gb2YgbWlncmF0aW9ucykge1xuICAgICAgICBpZiAoIWxhc3REYk1pZ3JhdGlvbiB8fCBOdW1iZXIobGFzdERiTWlncmF0aW9uWzJdKSA8IG1pZ3JhdGlvbi5mb2xkZXJNaWxsaXMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN0bXQgb2YgbWlncmF0aW9uLnNxbCkge1xuICAgICAgICAgICAgc2Vzc2lvbi5ydW4oc3FsLnJhdyhzdG10KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlc3Npb24ucnVuKFxuICAgICAgICAgICAgc3FsYElOU0VSVCBJTlRPICR7c3FsLmlkZW50aWZpZXIobWlncmF0aW9uc1RhYmxlKX0gKFwiaGFzaFwiLCBcImNyZWF0ZWRfYXRcIikgVkFMVUVTKCR7bWlncmF0aW9uLmhhc2h9LCAke21pZ3JhdGlvbi5mb2xkZXJNaWxsaXN9KWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXNzaW9uLnJ1bihzcWxgQ09NTUlUYCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2Vzc2lvbi5ydW4oc3FsYFJPTExCQUNLYCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgU1FMaXRlQXN5bmNEaWFsZWN0IGV4dGVuZHMgU1FMaXRlRGlhbGVjdCB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUFzeW5jRGlhbGVjdFwiO1xuICBhc3luYyBtaWdyYXRlKG1pZ3JhdGlvbnMsIHNlc3Npb24sIGNvbmZpZykge1xuICAgIGNvbnN0IG1pZ3JhdGlvbnNUYWJsZSA9IGNvbmZpZyA9PT0gdm9pZCAwID8gXCJfX2RyaXp6bGVfbWlncmF0aW9uc1wiIDogdHlwZW9mIGNvbmZpZyA9PT0gXCJzdHJpbmdcIiA/IFwiX19kcml6emxlX21pZ3JhdGlvbnNcIiA6IGNvbmZpZy5taWdyYXRpb25zVGFibGUgPz8gXCJfX2RyaXp6bGVfbWlncmF0aW9uc1wiO1xuICAgIGNvbnN0IG1pZ3JhdGlvblRhYmxlQ3JlYXRlID0gc3FsYFxuXHRcdFx0Q1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJHtzcWwuaWRlbnRpZmllcihtaWdyYXRpb25zVGFibGUpfSAoXG5cdFx0XHRcdGlkIFNFUklBTCBQUklNQVJZIEtFWSxcblx0XHRcdFx0aGFzaCB0ZXh0IE5PVCBOVUxMLFxuXHRcdFx0XHRjcmVhdGVkX2F0IG51bWVyaWNcblx0XHRcdClcblx0XHRgO1xuICAgIGF3YWl0IHNlc3Npb24ucnVuKG1pZ3JhdGlvblRhYmxlQ3JlYXRlKTtcbiAgICBjb25zdCBkYk1pZ3JhdGlvbnMgPSBhd2FpdCBzZXNzaW9uLnZhbHVlcyhcbiAgICAgIHNxbGBTRUxFQ1QgaWQsIGhhc2gsIGNyZWF0ZWRfYXQgRlJPTSAke3NxbC5pZGVudGlmaWVyKG1pZ3JhdGlvbnNUYWJsZSl9IE9SREVSIEJZIGNyZWF0ZWRfYXQgREVTQyBMSU1JVCAxYFxuICAgICk7XG4gICAgY29uc3QgbGFzdERiTWlncmF0aW9uID0gZGJNaWdyYXRpb25zWzBdID8/IHZvaWQgMDtcbiAgICBhd2FpdCBzZXNzaW9uLnRyYW5zYWN0aW9uKGFzeW5jICh0eCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBtaWdyYXRpb24gb2YgbWlncmF0aW9ucykge1xuICAgICAgICBpZiAoIWxhc3REYk1pZ3JhdGlvbiB8fCBOdW1iZXIobGFzdERiTWlncmF0aW9uWzJdKSA8IG1pZ3JhdGlvbi5mb2xkZXJNaWxsaXMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN0bXQgb2YgbWlncmF0aW9uLnNxbCkge1xuICAgICAgICAgICAgYXdhaXQgdHgucnVuKHNxbC5yYXcoc3RtdCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCB0eC5ydW4oXG4gICAgICAgICAgICBzcWxgSU5TRVJUIElOVE8gJHtzcWwuaWRlbnRpZmllcihtaWdyYXRpb25zVGFibGUpfSAoXCJoYXNoXCIsIFwiY3JlYXRlZF9hdFwiKSBWQUxVRVMoJHttaWdyYXRpb24uaGFzaH0sICR7bWlncmF0aW9uLmZvbGRlck1pbGxpc30pYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgU1FMaXRlQXN5bmNEaWFsZWN0LFxuICBTUUxpdGVEaWFsZWN0LFxuICBTUUxpdGVTeW5jRGlhbGVjdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpYWxlY3QuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuY2xhc3MgVHlwZWRRdWVyeUJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJUeXBlZFF1ZXJ5QnVpbGRlclwiO1xuICAvKiogQGludGVybmFsICovXG4gIGdldFNlbGVjdGVkRmllbGRzKCkge1xuICAgIHJldHVybiB0aGlzLl8uc2VsZWN0ZWRGaWVsZHM7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFR5cGVkUXVlcnlCdWlsZGVyXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnktYnVpbGRlci5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQsIGlzIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgVHlwZWRRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi4vLi4vcXVlcnktYnVpbGRlcnMvcXVlcnktYnVpbGRlci5qc1wiO1xuaW1wb3J0IHsgUXVlcnlQcm9taXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXByb21pc2UuanNcIjtcbmltcG9ydCB7IFNlbGVjdGlvblByb3h5SGFuZGxlciB9IGZyb20gXCIuLi8uLi9zZWxlY3Rpb24tcHJveHkuanNcIjtcbmltcG9ydCB7IFNRTCwgVmlldyB9IGZyb20gXCIuLi8uLi9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgeyBTdWJxdWVyeSB9IGZyb20gXCIuLi8uLi9zdWJxdWVyeS5qc1wiO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tIFwiLi4vLi4vdGFibGUuanNcIjtcbmltcG9ydCB7XG4gIGFwcGx5TWl4aW5zLFxuICBnZXRUYWJsZUNvbHVtbnMsXG4gIGdldFRhYmxlTGlrZU5hbWUsXG4gIGhhdmVTYW1lS2V5cyxcbiAgb3JkZXJTZWxlY3RlZEZpZWxkc1xufSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFZpZXdCYXNlQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3ZpZXctY29tbW9uLmpzXCI7XG5pbXBvcnQgeyBleHRyYWN0VXNlZFRhYmxlIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVWaWV3QmFzZSB9IGZyb20gXCIuLi92aWV3LWJhc2UuanNcIjtcbmNsYXNzIFNRTGl0ZVNlbGVjdEJ1aWxkZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVTZWxlY3RCdWlsZGVyXCI7XG4gIGZpZWxkcztcbiAgc2Vzc2lvbjtcbiAgZGlhbGVjdDtcbiAgd2l0aExpc3Q7XG4gIGRpc3RpbmN0O1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICB0aGlzLmZpZWxkcyA9IGNvbmZpZy5maWVsZHM7XG4gICAgdGhpcy5zZXNzaW9uID0gY29uZmlnLnNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gY29uZmlnLmRpYWxlY3Q7XG4gICAgdGhpcy53aXRoTGlzdCA9IGNvbmZpZy53aXRoTGlzdDtcbiAgICB0aGlzLmRpc3RpbmN0ID0gY29uZmlnLmRpc3RpbmN0O1xuICB9XG4gIGZyb20oc291cmNlKSB7XG4gICAgY29uc3QgaXNQYXJ0aWFsU2VsZWN0ID0gISF0aGlzLmZpZWxkcztcbiAgICBsZXQgZmllbGRzO1xuICAgIGlmICh0aGlzLmZpZWxkcykge1xuICAgICAgZmllbGRzID0gdGhpcy5maWVsZHM7XG4gICAgfSBlbHNlIGlmIChpcyhzb3VyY2UsIFN1YnF1ZXJ5KSkge1xuICAgICAgZmllbGRzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3Qua2V5cyhzb3VyY2UuXy5zZWxlY3RlZEZpZWxkcykubWFwKChrZXkpID0+IFtrZXksIHNvdXJjZVtrZXldXSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChpcyhzb3VyY2UsIFNRTGl0ZVZpZXdCYXNlKSkge1xuICAgICAgZmllbGRzID0gc291cmNlW1ZpZXdCYXNlQ29uZmlnXS5zZWxlY3RlZEZpZWxkcztcbiAgICB9IGVsc2UgaWYgKGlzKHNvdXJjZSwgU1FMKSkge1xuICAgICAgZmllbGRzID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpZWxkcyA9IGdldFRhYmxlQ29sdW1ucyhzb3VyY2UpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJhc2Uoe1xuICAgICAgdGFibGU6IHNvdXJjZSxcbiAgICAgIGZpZWxkcyxcbiAgICAgIGlzUGFydGlhbFNlbGVjdCxcbiAgICAgIHNlc3Npb246IHRoaXMuc2Vzc2lvbixcbiAgICAgIGRpYWxlY3Q6IHRoaXMuZGlhbGVjdCxcbiAgICAgIHdpdGhMaXN0OiB0aGlzLndpdGhMaXN0LFxuICAgICAgZGlzdGluY3Q6IHRoaXMuZGlzdGluY3RcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlU2VsZWN0UXVlcnlCdWlsZGVyQmFzZSBleHRlbmRzIFR5cGVkUXVlcnlCdWlsZGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlU2VsZWN0UXVlcnlCdWlsZGVyXCI7XG4gIF87XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uZmlnO1xuICBqb2luc05vdE51bGxhYmxlTWFwO1xuICB0YWJsZU5hbWU7XG4gIGlzUGFydGlhbFNlbGVjdDtcbiAgc2Vzc2lvbjtcbiAgZGlhbGVjdDtcbiAgY2FjaGVDb25maWcgPSB2b2lkIDA7XG4gIHVzZWRUYWJsZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBjb25zdHJ1Y3Rvcih7IHRhYmxlLCBmaWVsZHMsIGlzUGFydGlhbFNlbGVjdCwgc2Vzc2lvbiwgZGlhbGVjdCwgd2l0aExpc3QsIGRpc3RpbmN0IH0pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgd2l0aExpc3QsXG4gICAgICB0YWJsZSxcbiAgICAgIGZpZWxkczogeyAuLi5maWVsZHMgfSxcbiAgICAgIGRpc3RpbmN0LFxuICAgICAgc2V0T3BlcmF0b3JzOiBbXVxuICAgIH07XG4gICAgdGhpcy5pc1BhcnRpYWxTZWxlY3QgPSBpc1BhcnRpYWxTZWxlY3Q7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuXyA9IHtcbiAgICAgIHNlbGVjdGVkRmllbGRzOiBmaWVsZHMsXG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnXG4gICAgfTtcbiAgICB0aGlzLnRhYmxlTmFtZSA9IGdldFRhYmxlTGlrZU5hbWUodGFibGUpO1xuICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcCA9IHR5cGVvZiB0aGlzLnRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIiA/IHsgW3RoaXMudGFibGVOYW1lXTogdHJ1ZSB9IDoge307XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGV4dHJhY3RVc2VkVGFibGUodGFibGUpKSB0aGlzLnVzZWRUYWJsZXMuYWRkKGl0ZW0pO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0VXNlZFRhYmxlcygpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMudXNlZFRhYmxlc107XG4gIH1cbiAgY3JlYXRlSm9pbihqb2luVHlwZSkge1xuICAgIHJldHVybiAodGFibGUsIG9uKSA9PiB7XG4gICAgICBjb25zdCBiYXNlVGFibGVOYW1lID0gdGhpcy50YWJsZU5hbWU7XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSBnZXRUYWJsZUxpa2VOYW1lKHRhYmxlKTtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBleHRyYWN0VXNlZFRhYmxlKHRhYmxlKSkgdGhpcy51c2VkVGFibGVzLmFkZChpdGVtKTtcbiAgICAgIGlmICh0eXBlb2YgdGFibGVOYW1lID09PSBcInN0cmluZ1wiICYmIHRoaXMuY29uZmlnLmpvaW5zPy5zb21lKChqb2luKSA9PiBqb2luLmFsaWFzID09PSB0YWJsZU5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQWxpYXMgXCIke3RhYmxlTmFtZX1cIiBpcyBhbHJlYWR5IHVzZWQgaW4gdGhpcyBxdWVyeWApO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzUGFydGlhbFNlbGVjdCkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5qb2luc05vdE51bGxhYmxlTWFwKS5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGJhc2VUYWJsZU5hbWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMgPSB7XG4gICAgICAgICAgICBbYmFzZVRhYmxlTmFtZV06IHRoaXMuY29uZmlnLmZpZWxkc1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YWJsZU5hbWUgPT09IFwic3RyaW5nXCIgJiYgIWlzKHRhYmxlLCBTUUwpKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gaXModGFibGUsIFN1YnF1ZXJ5KSA/IHRhYmxlLl8uc2VsZWN0ZWRGaWVsZHMgOiBpcyh0YWJsZSwgVmlldykgPyB0YWJsZVtWaWV3QmFzZUNvbmZpZ10uc2VsZWN0ZWRGaWVsZHMgOiB0YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc107XG4gICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzW3RhYmxlTmFtZV0gPSBzZWxlY3Rpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBvbiA9IG9uKFxuICAgICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmZpZWxkcyxcbiAgICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwic3FsXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmNvbmZpZy5qb2lucykge1xuICAgICAgICB0aGlzLmNvbmZpZy5qb2lucyA9IFtdO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25maWcuam9pbnMucHVzaCh7IG9uLCB0YWJsZSwgam9pblR5cGUsIGFsaWFzOiB0YWJsZU5hbWUgfSk7XG4gICAgICBpZiAodHlwZW9mIHRhYmxlTmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBzd2l0Y2ggKGpvaW5UeXBlKSB7XG4gICAgICAgICAgY2FzZSBcImxlZnRcIjoge1xuICAgICAgICAgICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwW3RhYmxlTmFtZV0gPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwicmlnaHRcIjoge1xuICAgICAgICAgICAgdGhpcy5qb2luc05vdE51bGxhYmxlTWFwID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLmpvaW5zTm90TnVsbGFibGVNYXApLm1hcCgoW2tleV0pID0+IFtrZXksIGZhbHNlXSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXBbdGFibGVOYW1lXSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImNyb3NzXCI6XG4gICAgICAgICAgY2FzZSBcImlubmVyXCI6IHtcbiAgICAgICAgICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcFt0YWJsZU5hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiZnVsbFwiOiB7XG4gICAgICAgICAgICB0aGlzLmpvaW5zTm90TnVsbGFibGVNYXAgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcCkubWFwKChba2V5XSkgPT4gW2tleSwgZmFsc2VdKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcFt0YWJsZU5hbWVdID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgYGxlZnQgam9pbmAgb3BlcmF0aW9uIGJ5IGFkZGluZyBhbm90aGVyIHRhYmxlIHRvIHRoZSBjdXJyZW50IHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGFzc29jaWF0ZXMgZWFjaCByb3cgb2YgdGhlIHRhYmxlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcm93IGZyb20gdGhlIGpvaW5lZCB0YWJsZSwgaWYgYSBtYXRjaCBpcyBmb3VuZC4gSWYgbm8gbWF0Y2hpbmcgcm93IGV4aXN0cywgaXQgc2V0cyBhbGwgY29sdW1ucyBvZiB0aGUgam9pbmVkIHRhYmxlIHRvIG51bGwuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvam9pbnMjbGVmdC1qb2lufVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRvIGpvaW4uXG4gICAqIEBwYXJhbSBvbiB0aGUgYG9uYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdXNlcnMgYW5kIHRoZWlyIHBldHNcbiAgICogY29uc3QgdXNlcnNXaXRoUGV0czogeyB1c2VyOiBVc2VyOyBwZXRzOiBQZXQgfCBudWxsOyB9W10gPSBhd2FpdCBkYi5zZWxlY3QoKVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5sZWZ0Sm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICpcbiAgICogLy8gU2VsZWN0IHVzZXJJZCBhbmQgcGV0SWRcbiAgICogY29uc3QgdXNlcnNJZHNBbmRQZXRJZHM6IHsgdXNlcklkOiBudW1iZXI7IHBldElkOiBudW1iZXIgfCBudWxsOyB9W10gPSBhd2FpdCBkYi5zZWxlY3Qoe1xuICAgKiAgIHVzZXJJZDogdXNlcnMuaWQsXG4gICAqICAgcGV0SWQ6IHBldHMuaWQsXG4gICAqIH0pXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmxlZnRKb2luKHBldHMsIGVxKHVzZXJzLmlkLCBwZXRzLm93bmVySWQpKVxuICAgKiBgYGBcbiAgICovXG4gIGxlZnRKb2luID0gdGhpcy5jcmVhdGVKb2luKFwibGVmdFwiKTtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgYHJpZ2h0IGpvaW5gIG9wZXJhdGlvbiBieSBhZGRpbmcgYW5vdGhlciB0YWJsZSB0byB0aGUgY3VycmVudCBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBhc3NvY2lhdGVzIGVhY2ggcm93IG9mIHRoZSBqb2luZWQgdGFibGUgd2l0aCB0aGUgY29ycmVzcG9uZGluZyByb3cgZnJvbSB0aGUgbWFpbiB0YWJsZSwgaWYgYSBtYXRjaCBpcyBmb3VuZC4gSWYgbm8gbWF0Y2hpbmcgcm93IGV4aXN0cywgaXQgc2V0cyBhbGwgY29sdW1ucyBvZiB0aGUgbWFpbiB0YWJsZSB0byBudWxsLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2pvaW5zI3JpZ2h0LWpvaW59XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSB0aGUgdGFibGUgdG8gam9pbi5cbiAgICogQHBhcmFtIG9uIHRoZSBgb25gIGNsYXVzZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB1c2VycyBhbmQgdGhlaXIgcGV0c1xuICAgKiBjb25zdCB1c2Vyc1dpdGhQZXRzOiB7IHVzZXI6IFVzZXIgfCBudWxsOyBwZXRzOiBQZXQ7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCgpXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLnJpZ2h0Sm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICpcbiAgICogLy8gU2VsZWN0IHVzZXJJZCBhbmQgcGV0SWRcbiAgICogY29uc3QgdXNlcnNJZHNBbmRQZXRJZHM6IHsgdXNlcklkOiBudW1iZXIgfCBudWxsOyBwZXRJZDogbnVtYmVyOyB9W10gPSBhd2FpdCBkYi5zZWxlY3Qoe1xuICAgKiAgIHVzZXJJZDogdXNlcnMuaWQsXG4gICAqICAgcGV0SWQ6IHBldHMuaWQsXG4gICAqIH0pXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLnJpZ2h0Sm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICogYGBgXG4gICAqL1xuICByaWdodEpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJyaWdodFwiKTtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGFuIGBpbm5lciBqb2luYCBvcGVyYXRpb24sIGNyZWF0aW5nIGEgbmV3IHRhYmxlIGJ5IGNvbWJpbmluZyByb3dzIGZyb20gdHdvIHRhYmxlcyB0aGF0IGhhdmUgbWF0Y2hpbmcgdmFsdWVzLlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHJldHJpZXZlcyByb3dzIHRoYXQgaGF2ZSBjb3JyZXNwb25kaW5nIGVudHJpZXMgaW4gYm90aCBqb2luZWQgdGFibGVzLiBSb3dzIHdpdGhvdXQgbWF0Y2hpbmcgZW50cmllcyBpbiBlaXRoZXIgdGFibGUgYXJlIGV4Y2x1ZGVkLCByZXN1bHRpbmcgaW4gYSB0YWJsZSB0aGF0IGluY2x1ZGVzIG9ubHkgbWF0Y2hpbmcgcGFpcnMuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvam9pbnMjaW5uZXItam9pbn1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBqb2luLlxuICAgKiBAcGFyYW0gb24gdGhlIGBvbmAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHVzZXJzIGFuZCB0aGVpciBwZXRzXG4gICAqIGNvbnN0IHVzZXJzV2l0aFBldHM6IHsgdXNlcjogVXNlcjsgcGV0czogUGV0OyB9W10gPSBhd2FpdCBkYi5zZWxlY3QoKVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5pbm5lckpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqXG4gICAqIC8vIFNlbGVjdCB1c2VySWQgYW5kIHBldElkXG4gICAqIGNvbnN0IHVzZXJzSWRzQW5kUGV0SWRzOiB7IHVzZXJJZDogbnVtYmVyOyBwZXRJZDogbnVtYmVyOyB9W10gPSBhd2FpdCBkYi5zZWxlY3Qoe1xuICAgKiAgIHVzZXJJZDogdXNlcnMuaWQsXG4gICAqICAgcGV0SWQ6IHBldHMuaWQsXG4gICAqIH0pXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmlubmVySm9pbihwZXRzLCBlcSh1c2Vycy5pZCwgcGV0cy5vd25lcklkKSlcbiAgICogYGBgXG4gICAqL1xuICBpbm5lckpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJpbm5lclwiKTtcbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgYGZ1bGwgam9pbmAgb3BlcmF0aW9uIGJ5IGNvbWJpbmluZyByb3dzIGZyb20gdHdvIHRhYmxlcyBpbnRvIGEgbmV3IHRhYmxlLlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHJldHJpZXZlcyBhbGwgcm93cyBmcm9tIGJvdGggbWFpbiBhbmQgam9pbmVkIHRhYmxlcywgbWVyZ2luZyByb3dzIHdpdGggbWF0Y2hpbmcgdmFsdWVzIGFuZCBmaWxsaW5nIGluIGBudWxsYCBmb3Igbm9uLW1hdGNoaW5nIGNvbHVtbnMuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvam9pbnMjZnVsbC1qb2lufVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgdGhlIHRhYmxlIHRvIGpvaW4uXG4gICAqIEBwYXJhbSBvbiB0aGUgYG9uYCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgdXNlcnMgYW5kIHRoZWlyIHBldHNcbiAgICogY29uc3QgdXNlcnNXaXRoUGV0czogeyB1c2VyOiBVc2VyIHwgbnVsbDsgcGV0czogUGV0IHwgbnVsbDsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KClcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAuZnVsbEpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqXG4gICAqIC8vIFNlbGVjdCB1c2VySWQgYW5kIHBldElkXG4gICAqIGNvbnN0IHVzZXJzSWRzQW5kUGV0SWRzOiB7IHVzZXJJZDogbnVtYmVyIHwgbnVsbDsgcGV0SWQ6IG51bWJlciB8IG51bGw7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCh7XG4gICAqICAgdXNlcklkOiB1c2Vycy5pZCxcbiAgICogICBwZXRJZDogcGV0cy5pZCxcbiAgICogfSlcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAuZnVsbEpvaW4ocGV0cywgZXEodXNlcnMuaWQsIHBldHMub3duZXJJZCkpXG4gICAqIGBgYFxuICAgKi9cbiAgZnVsbEpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJmdWxsXCIpO1xuICAvKipcbiAgICogRXhlY3V0ZXMgYSBgY3Jvc3Mgam9pbmAgb3BlcmF0aW9uIGJ5IGNvbWJpbmluZyByb3dzIGZyb20gdHdvIHRhYmxlcyBpbnRvIGEgbmV3IHRhYmxlLlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHJldHJpZXZlcyBhbGwgcm93cyBmcm9tIGJvdGggbWFpbiBhbmQgam9pbmVkIHRhYmxlcywgbWVyZ2luZyBhbGwgcm93cyBmcm9tIGVhY2ggdGFibGUuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvam9pbnMjY3Jvc3Mtam9pbn1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBqb2luLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHVzZXJzLCBlYWNoIHVzZXIgd2l0aCBldmVyeSBwZXRcbiAgICogY29uc3QgdXNlcnNXaXRoUGV0czogeyB1c2VyOiBVc2VyOyBwZXRzOiBQZXQ7IH1bXSA9IGF3YWl0IGRiLnNlbGVjdCgpXG4gICAqICAgLmZyb20odXNlcnMpXG4gICAqICAgLmNyb3NzSm9pbihwZXRzKVxuICAgKlxuICAgKiAvLyBTZWxlY3QgdXNlcklkIGFuZCBwZXRJZFxuICAgKiBjb25zdCB1c2Vyc0lkc0FuZFBldElkczogeyB1c2VySWQ6IG51bWJlcjsgcGV0SWQ6IG51bWJlcjsgfVtdID0gYXdhaXQgZGIuc2VsZWN0KHtcbiAgICogICB1c2VySWQ6IHVzZXJzLmlkLFxuICAgKiAgIHBldElkOiBwZXRzLmlkLFxuICAgKiB9KVxuICAgKiAgIC5mcm9tKHVzZXJzKVxuICAgKiAgIC5jcm9zc0pvaW4ocGV0cylcbiAgICogYGBgXG4gICAqL1xuICBjcm9zc0pvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJjcm9zc1wiKTtcbiAgY3JlYXRlU2V0T3BlcmF0b3IodHlwZSwgaXNBbGwpIHtcbiAgICByZXR1cm4gKHJpZ2h0U2VsZWN0aW9uKSA9PiB7XG4gICAgICBjb25zdCByaWdodFNlbGVjdCA9IHR5cGVvZiByaWdodFNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiID8gcmlnaHRTZWxlY3Rpb24oZ2V0U1FMaXRlU2V0T3BlcmF0b3JzKCkpIDogcmlnaHRTZWxlY3Rpb247XG4gICAgICBpZiAoIWhhdmVTYW1lS2V5cyh0aGlzLmdldFNlbGVjdGVkRmllbGRzKCksIHJpZ2h0U2VsZWN0LmdldFNlbGVjdGVkRmllbGRzKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIlNldCBvcGVyYXRvciBlcnJvciAodW5pb24gLyBpbnRlcnNlY3QgLyBleGNlcHQpOiBzZWxlY3RlZCBmaWVsZHMgYXJlIG5vdCB0aGUgc2FtZSBvciBhcmUgaW4gYSBkaWZmZXJlbnQgb3JkZXJcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLnB1c2goeyB0eXBlLCBpc0FsbCwgcmlnaHRTZWxlY3QgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGB1bmlvbmAgc2V0IG9wZXJhdG9yIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGNvbWJpbmUgdGhlIHJlc3VsdCBzZXRzIG9mIHRoZSBgc2VsZWN0YCBzdGF0ZW1lbnRzIGFuZCByZW1vdmUgYW55IGR1cGxpY2F0ZSByb3dzIHRoYXQgYXBwZWFyIGFjcm9zcyB0aGVtLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NldC1vcGVyYXRpb25zI3VuaW9ufVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIHVuaXF1ZSBuYW1lcyBmcm9tIGN1c3RvbWVycyBhbmQgdXNlcnMgdGFibGVzXG4gICAqIGF3YWl0IGRiLnNlbGVjdCh7IG5hbWU6IHVzZXJzLm5hbWUgfSlcbiAgICogICAuZnJvbSh1c2VycylcbiAgICogICAudW5pb24oXG4gICAqICAgICBkYi5zZWxlY3QoeyBuYW1lOiBjdXN0b21lcnMubmFtZSB9KS5mcm9tKGN1c3RvbWVycylcbiAgICogICApO1xuICAgKiAvLyBvclxuICAgKiBpbXBvcnQgeyB1bmlvbiB9IGZyb20gJ2RyaXp6bGUtb3JtL3NxbGl0ZS1jb3JlJ1xuICAgKlxuICAgKiBhd2FpdCB1bmlvbihcbiAgICogICBkYi5zZWxlY3QoeyBuYW1lOiB1c2Vycy5uYW1lIH0pLmZyb20odXNlcnMpLFxuICAgKiAgIGRiLnNlbGVjdCh7IG5hbWU6IGN1c3RvbWVycy5uYW1lIH0pLmZyb20oY3VzdG9tZXJzKVxuICAgKiApO1xuICAgKiBgYGBcbiAgICovXG4gIHVuaW9uID0gdGhpcy5jcmVhdGVTZXRPcGVyYXRvcihcInVuaW9uXCIsIGZhbHNlKTtcbiAgLyoqXG4gICAqIEFkZHMgYHVuaW9uIGFsbGAgc2V0IG9wZXJhdG9yIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGNvbWJpbmUgdGhlIHJlc3VsdC1zZXQgb2YgdGhlIGBzZWxlY3RgIHN0YXRlbWVudHMgYW5kIGtlZXAgYWxsIGR1cGxpY2F0ZSByb3dzIHRoYXQgYXBwZWFyIGFjcm9zcyB0aGVtLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NldC1vcGVyYXRpb25zI3VuaW9uLWFsbH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCB0cmFuc2FjdGlvbiBpZHMgZnJvbSBib3RoIG9ubGluZSBhbmQgaW4tc3RvcmUgc2FsZXNcbiAgICogYXdhaXQgZGIuc2VsZWN0KHsgdHJhbnNhY3Rpb246IG9ubGluZVNhbGVzLnRyYW5zYWN0aW9uSWQgfSlcbiAgICogICAuZnJvbShvbmxpbmVTYWxlcylcbiAgICogICAudW5pb25BbGwoXG4gICAqICAgICBkYi5zZWxlY3QoeyB0cmFuc2FjdGlvbjogaW5TdG9yZVNhbGVzLnRyYW5zYWN0aW9uSWQgfSkuZnJvbShpblN0b3JlU2FsZXMpXG4gICAqICAgKTtcbiAgICogLy8gb3JcbiAgICogaW1wb3J0IHsgdW5pb25BbGwgfSBmcm9tICdkcml6emxlLW9ybS9zcWxpdGUtY29yZSdcbiAgICpcbiAgICogYXdhaXQgdW5pb25BbGwoXG4gICAqICAgZGIuc2VsZWN0KHsgdHJhbnNhY3Rpb246IG9ubGluZVNhbGVzLnRyYW5zYWN0aW9uSWQgfSkuZnJvbShvbmxpbmVTYWxlcyksXG4gICAqICAgZGIuc2VsZWN0KHsgdHJhbnNhY3Rpb246IGluU3RvcmVTYWxlcy50cmFuc2FjdGlvbklkIH0pLmZyb20oaW5TdG9yZVNhbGVzKVxuICAgKiApO1xuICAgKiBgYGBcbiAgICovXG4gIHVuaW9uQWxsID0gdGhpcy5jcmVhdGVTZXRPcGVyYXRvcihcInVuaW9uXCIsIHRydWUpO1xuICAvKipcbiAgICogQWRkcyBgaW50ZXJzZWN0YCBzZXQgb3BlcmF0b3IgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgcmV0YWluIG9ubHkgdGhlIHJvd3MgdGhhdCBhcmUgcHJlc2VudCBpbiBib3RoIHJlc3VsdCBzZXRzIGFuZCBlbGltaW5hdGUgZHVwbGljYXRlcy5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZXQtb3BlcmF0aW9ucyNpbnRlcnNlY3R9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBjb3Vyc2UgbmFtZXMgdGhhdCBhcmUgb2ZmZXJlZCBpbiBib3RoIGRlcGFydG1lbnRzIEEgYW5kIEJcbiAgICogYXdhaXQgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQS5jb3Vyc2VOYW1lIH0pXG4gICAqICAgLmZyb20oZGVwQSlcbiAgICogICAuaW50ZXJzZWN0KFxuICAgKiAgICAgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQi5jb3Vyc2VOYW1lIH0pLmZyb20oZGVwQilcbiAgICogICApO1xuICAgKiAvLyBvclxuICAgKiBpbXBvcnQgeyBpbnRlcnNlY3QgfSBmcm9tICdkcml6emxlLW9ybS9zcWxpdGUtY29yZSdcbiAgICpcbiAgICogYXdhaXQgaW50ZXJzZWN0KFxuICAgKiAgIGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEEuY291cnNlTmFtZSB9KS5mcm9tKGRlcEEpLFxuICAgKiAgIGRiLnNlbGVjdCh7IGNvdXJzZU5hbWU6IGRlcEIuY291cnNlTmFtZSB9KS5mcm9tKGRlcEIpXG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgaW50ZXJzZWN0ID0gdGhpcy5jcmVhdGVTZXRPcGVyYXRvcihcImludGVyc2VjdFwiLCBmYWxzZSk7XG4gIC8qKlxuICAgKiBBZGRzIGBleGNlcHRgIHNldCBvcGVyYXRvciB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCByZXRyaWV2ZSBhbGwgdW5pcXVlIHJvd3MgZnJvbSB0aGUgbGVmdCBxdWVyeSwgZXhjZXB0IGZvciB0aGUgcm93cyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSByZXN1bHQgc2V0IG9mIHRoZSByaWdodCBxdWVyeS5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZXQtb3BlcmF0aW9ucyNleGNlcHR9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbGwgY291cnNlcyBvZmZlcmVkIGluIGRlcGFydG1lbnQgQSBidXQgbm90IGluIGRlcGFydG1lbnQgQlxuICAgKiBhd2FpdCBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBBLmNvdXJzZU5hbWUgfSlcbiAgICogICAuZnJvbShkZXBBKVxuICAgKiAgIC5leGNlcHQoXG4gICAqICAgICBkYi5zZWxlY3QoeyBjb3Vyc2VOYW1lOiBkZXBCLmNvdXJzZU5hbWUgfSkuZnJvbShkZXBCKVxuICAgKiAgICk7XG4gICAqIC8vIG9yXG4gICAqIGltcG9ydCB7IGV4Y2VwdCB9IGZyb20gJ2RyaXp6bGUtb3JtL3NxbGl0ZS1jb3JlJ1xuICAgKlxuICAgKiBhd2FpdCBleGNlcHQoXG4gICAqICAgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQS5jb3Vyc2VOYW1lIH0pLmZyb20oZGVwQSksXG4gICAqICAgZGIuc2VsZWN0KHsgY291cnNlTmFtZTogZGVwQi5jb3Vyc2VOYW1lIH0pLmZyb20oZGVwQilcbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBleGNlcHQgPSB0aGlzLmNyZWF0ZVNldE9wZXJhdG9yKFwiZXhjZXB0XCIsIGZhbHNlKTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBhZGRTZXRPcGVyYXRvcnMoc2V0T3BlcmF0b3JzKSB7XG4gICAgdGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLnB1c2goLi4uc2V0T3BlcmF0b3JzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGB3aGVyZWAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHNlbGVjdCBvbmx5IHRob3NlIHJvd3MgdGhhdCBmdWxmaWxsIGEgc3BlY2lmaWVkIGNvbmRpdGlvbi5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZWxlY3QjZmlsdGVyaW5nfVxuICAgKlxuICAgKiBAcGFyYW0gd2hlcmUgdGhlIGB3aGVyZWAgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBZb3UgY2FuIHVzZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgYW5kIGBzcWwgZnVuY3Rpb25gIHRvIGZpbHRlciB0aGUgcm93cyB0byBiZSBzZWxlY3RlZC5cbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCBjYXJzIHdpdGggZ3JlZW4gY29sb3JcbiAgICogYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShjYXJzKS53aGVyZShlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSk7XG4gICAqIC8vIG9yXG4gICAqIGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oY2Fycykud2hlcmUoc3FsYCR7Y2Fycy5jb2xvcn0gPSAnZ3JlZW4nYClcbiAgICogYGBgXG4gICAqXG4gICAqIFlvdSBjYW4gbG9naWNhbGx5IGNvbWJpbmUgY29uZGl0aW9uYWwgb3BlcmF0b3JzIHdpdGggYGFuZCgpYCBhbmQgYG9yKClgIG9wZXJhdG9yczpcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gU2VsZWN0IGFsbCBCTVcgY2FycyB3aXRoIGEgZ3JlZW4gY29sb3JcbiAgICogYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShjYXJzKS53aGVyZShhbmQoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJyksIGVxKGNhcnMuYnJhbmQsICdCTVcnKSkpO1xuICAgKlxuICAgKiAvLyBTZWxlY3QgYWxsIGNhcnMgd2l0aCB0aGUgZ3JlZW4gb3IgYmx1ZSBjb2xvclxuICAgKiBhd2FpdCBkYi5zZWxlY3QoKS5mcm9tKGNhcnMpLndoZXJlKG9yKGVxKGNhcnMuY29sb3IsICdncmVlbicpLCBlcShjYXJzLmNvbG9yLCAnYmx1ZScpKSk7XG4gICAqIGBgYFxuICAgKi9cbiAgd2hlcmUod2hlcmUpIHtcbiAgICBpZiAodHlwZW9mIHdoZXJlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHdoZXJlID0gd2hlcmUoXG4gICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMsXG4gICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJzcWxcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5jb25maWcud2hlcmUgPSB3aGVyZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGBoYXZpbmdgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBzZWxlY3Qgb25seSB0aG9zZSByb3dzIHRoYXQgZnVsZmlsbCBhIHNwZWNpZmllZCBjb25kaXRpb24uIEl0IGlzIHR5cGljYWxseSB1c2VkIHdpdGggYWdncmVnYXRlIGZ1bmN0aW9ucyB0byBmaWx0ZXIgdGhlIGFnZ3JlZ2F0ZWQgZGF0YSBiYXNlZCBvbiBhIHNwZWNpZmllZCBjb25kaXRpb24uXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2VsZWN0I2FnZ3JlZ2F0aW9uc31cbiAgICpcbiAgICogQHBhcmFtIGhhdmluZyB0aGUgYGhhdmluZ2AgY2xhdXNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBTZWxlY3QgYWxsIGJyYW5kcyB3aXRoIG1vcmUgdGhhbiBvbmUgY2FyXG4gICAqIGF3YWl0IGRiLnNlbGVjdCh7XG4gICAqIFx0YnJhbmQ6IGNhcnMuYnJhbmQsXG4gICAqIFx0Y291bnQ6IHNxbDxudW1iZXI+YGNhc3QoY291bnQoJHtjYXJzLmlkfSkgYXMgaW50KWAsXG4gICAqIH0pXG4gICAqICAgLmZyb20oY2FycylcbiAgICogICAuZ3JvdXBCeShjYXJzLmJyYW5kKVxuICAgKiAgIC5oYXZpbmcoKHsgY291bnQgfSkgPT4gZ3QoY291bnQsIDEpKTtcbiAgICogYGBgXG4gICAqL1xuICBoYXZpbmcoaGF2aW5nKSB7XG4gICAgaWYgKHR5cGVvZiBoYXZpbmcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgaGF2aW5nID0gaGF2aW5nKFxuICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzLFxuICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwic3FsXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLmhhdmluZyA9IGhhdmluZztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBncm91cEJ5KC4uLmNvbHVtbnMpIHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbnNbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3QgZ3JvdXBCeSA9IGNvbHVtbnNbMF0oXG4gICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICB0aGlzLmNvbmZpZy5maWVsZHMsXG4gICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcuZ3JvdXBCeSA9IEFycmF5LmlzQXJyYXkoZ3JvdXBCeSkgPyBncm91cEJ5IDogW2dyb3VwQnldO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbmZpZy5ncm91cEJ5ID0gY29sdW1ucztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb3JkZXJCeSguLi5jb2x1bW5zKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW5zWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IG9yZGVyQnkgPSBjb2x1bW5zWzBdKFxuICAgICAgICBuZXcgUHJveHkoXG4gICAgICAgICAgdGhpcy5jb25maWcuZmllbGRzLFxuICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwic3FsXCIgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG9yZGVyQnlBcnJheSA9IEFycmF5LmlzQXJyYXkob3JkZXJCeSkgPyBvcmRlckJ5IDogW29yZGVyQnldO1xuICAgICAgaWYgKHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5hdCgtMSkub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9yZGVyQnkgPSBvcmRlckJ5QXJyYXk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9yZGVyQnlBcnJheSA9IGNvbHVtbnM7XG4gICAgICBpZiAodGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmF0KC0xKS5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25maWcub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBgbGltaXRgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoaXMgcXVlcnkuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2VsZWN0I2xpbWl0LS1vZmZzZXR9XG4gICAqXG4gICAqIEBwYXJhbSBsaW1pdCB0aGUgYGxpbWl0YCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIEdldCB0aGUgZmlyc3QgMTAgcGVvcGxlIGZyb20gdGhpcyBxdWVyeS5cbiAgICogYXdhaXQgZGIuc2VsZWN0KCkuZnJvbShwZW9wbGUpLmxpbWl0KDEwKTtcbiAgICogYGBgXG4gICAqL1xuICBsaW1pdChsaW1pdCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb25maWcuc2V0T3BlcmF0b3JzLmF0KC0xKS5saW1pdCA9IGxpbWl0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbmZpZy5saW1pdCA9IGxpbWl0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhbiBgb2Zmc2V0YCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgc2tpcCBhIG51bWJlciBvZiByb3dzIHdoZW4gcmV0dXJuaW5nIHJlc3VsdHMgZnJvbSB0aGlzIHF1ZXJ5LlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL3NlbGVjdCNsaW1pdC0tb2Zmc2V0fVxuICAgKlxuICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBgb2Zmc2V0YCBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIEdldCB0aGUgMTB0aC0yMHRoIHBlb3BsZSBmcm9tIHRoaXMgcXVlcnkuXG4gICAqIGF3YWl0IGRiLnNlbGVjdCgpLmZyb20ocGVvcGxlKS5vZmZzZXQoMTApLmxpbWl0KDEwKTtcbiAgICogYGBgXG4gICAqL1xuICBvZmZzZXQob2Zmc2V0KSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLnNldE9wZXJhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNvbmZpZy5zZXRPcGVyYXRvcnMuYXQoLTEpLm9mZnNldCA9IG9mZnNldDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWcub2Zmc2V0ID0gb2Zmc2V0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGdldFNRTCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaWFsZWN0LmJ1aWxkU2VsZWN0UXVlcnkodGhpcy5jb25maWcpO1xuICB9XG4gIHRvU1FMKCkge1xuICAgIGNvbnN0IHsgdHlwaW5nczogX3R5cGluZ3MsIC4uLnJlc3QgfSA9IHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpO1xuICAgIHJldHVybiByZXN0O1xuICB9XG4gIGFzKGFsaWFzKSB7XG4gICAgY29uc3QgdXNlZFRhYmxlcyA9IFtdO1xuICAgIHVzZWRUYWJsZXMucHVzaCguLi5leHRyYWN0VXNlZFRhYmxlKHRoaXMuY29uZmlnLnRhYmxlKSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLmpvaW5zKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0IG9mIHRoaXMuY29uZmlnLmpvaW5zKSB1c2VkVGFibGVzLnB1c2goLi4uZXh0cmFjdFVzZWRUYWJsZShpdC50YWJsZSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb3h5KFxuICAgICAgbmV3IFN1YnF1ZXJ5KHRoaXMuZ2V0U1FMKCksIHRoaXMuY29uZmlnLmZpZWxkcywgYWxpYXMsIGZhbHNlLCBbLi4ubmV3IFNldCh1c2VkVGFibGVzKV0pLFxuICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IGFsaWFzLCBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwiZXJyb3JcIiB9KVxuICAgICk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTZWxlY3RlZEZpZWxkcygpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KFxuICAgICAgdGhpcy5jb25maWcuZmllbGRzLFxuICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IGFsaWFzOiB0aGlzLnRhYmxlTmFtZSwgc3FsQWxpYXNlZEJlaGF2aW9yOiBcImFsaWFzXCIsIHNxbEJlaGF2aW9yOiBcImVycm9yXCIgfSlcbiAgICApO1xuICB9XG4gICRkeW5hbWljKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5jbGFzcyBTUUxpdGVTZWxlY3RCYXNlIGV4dGVuZHMgU1FMaXRlU2VsZWN0UXVlcnlCdWlsZGVyQmFzZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVNlbGVjdFwiO1xuICAvKiogQGludGVybmFsICovXG4gIF9wcmVwYXJlKGlzT25lVGltZVF1ZXJ5ID0gdHJ1ZSkge1xuICAgIGlmICghdGhpcy5zZXNzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZXhlY3V0ZSBhIHF1ZXJ5IG9uIGEgcXVlcnkgYnVpbGRlci4gUGxlYXNlIHVzZSBhIGRhdGFiYXNlIGluc3RhbmNlIGluc3RlYWQuXCIpO1xuICAgIH1cbiAgICBjb25zdCBmaWVsZHNMaXN0ID0gb3JkZXJTZWxlY3RlZEZpZWxkcyh0aGlzLmNvbmZpZy5maWVsZHMpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zZXNzaW9uW2lzT25lVGltZVF1ZXJ5ID8gXCJwcmVwYXJlT25lVGltZVF1ZXJ5XCIgOiBcInByZXBhcmVRdWVyeVwiXShcbiAgICAgIHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHRoaXMuZ2V0U1FMKCkpLFxuICAgICAgZmllbGRzTGlzdCxcbiAgICAgIFwiYWxsXCIsXG4gICAgICB0cnVlLFxuICAgICAgdm9pZCAwLFxuICAgICAge1xuICAgICAgICB0eXBlOiBcInNlbGVjdFwiLFxuICAgICAgICB0YWJsZXM6IFsuLi50aGlzLnVzZWRUYWJsZXNdXG4gICAgICB9LFxuICAgICAgdGhpcy5jYWNoZUNvbmZpZ1xuICAgICk7XG4gICAgcXVlcnkuam9pbnNOb3ROdWxsYWJsZU1hcCA9IHRoaXMuam9pbnNOb3ROdWxsYWJsZU1hcDtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cbiAgJHdpdGhDYWNoZShjb25maWcpIHtcbiAgICB0aGlzLmNhY2hlQ29uZmlnID0gY29uZmlnID09PSB2b2lkIDAgPyB7IGNvbmZpZzoge30sIGVuYWJsZTogdHJ1ZSwgYXV0b0ludmFsaWRhdGU6IHRydWUgfSA6IGNvbmZpZyA9PT0gZmFsc2UgPyB7IGVuYWJsZTogZmFsc2UgfSA6IHsgZW5hYmxlOiB0cnVlLCBhdXRvSW52YWxpZGF0ZTogdHJ1ZSwgLi4uY29uZmlnIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgcHJlcGFyZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSk7XG4gIH1cbiAgcnVuID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5ydW4ocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhbGwgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmFsbChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIGdldCA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkuZ2V0KHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgdmFsdWVzID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS52YWx1ZXMocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIHJldHVybiB0aGlzLmFsbCgpO1xuICB9XG59XG5hcHBseU1peGlucyhTUUxpdGVTZWxlY3RCYXNlLCBbUXVlcnlQcm9taXNlXSk7XG5mdW5jdGlvbiBjcmVhdGVTZXRPcGVyYXRvcih0eXBlLCBpc0FsbCkge1xuICByZXR1cm4gKGxlZnRTZWxlY3QsIHJpZ2h0U2VsZWN0LCAuLi5yZXN0U2VsZWN0cykgPT4ge1xuICAgIGNvbnN0IHNldE9wZXJhdG9ycyA9IFtyaWdodFNlbGVjdCwgLi4ucmVzdFNlbGVjdHNdLm1hcCgoc2VsZWN0KSA9PiAoe1xuICAgICAgdHlwZSxcbiAgICAgIGlzQWxsLFxuICAgICAgcmlnaHRTZWxlY3Q6IHNlbGVjdFxuICAgIH0pKTtcbiAgICBmb3IgKGNvbnN0IHNldE9wZXJhdG9yIG9mIHNldE9wZXJhdG9ycykge1xuICAgICAgaWYgKCFoYXZlU2FtZUtleXMobGVmdFNlbGVjdC5nZXRTZWxlY3RlZEZpZWxkcygpLCBzZXRPcGVyYXRvci5yaWdodFNlbGVjdC5nZXRTZWxlY3RlZEZpZWxkcygpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJTZXQgb3BlcmF0b3IgZXJyb3IgKHVuaW9uIC8gaW50ZXJzZWN0IC8gZXhjZXB0KTogc2VsZWN0ZWQgZmllbGRzIGFyZSBub3QgdGhlIHNhbWUgb3IgYXJlIGluIGEgZGlmZmVyZW50IG9yZGVyXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxlZnRTZWxlY3QuYWRkU2V0T3BlcmF0b3JzKHNldE9wZXJhdG9ycyk7XG4gIH07XG59XG5jb25zdCBnZXRTUUxpdGVTZXRPcGVyYXRvcnMgPSAoKSA9PiAoe1xuICB1bmlvbixcbiAgdW5pb25BbGwsXG4gIGludGVyc2VjdCxcbiAgZXhjZXB0XG59KTtcbmNvbnN0IHVuaW9uID0gY3JlYXRlU2V0T3BlcmF0b3IoXCJ1bmlvblwiLCBmYWxzZSk7XG5jb25zdCB1bmlvbkFsbCA9IGNyZWF0ZVNldE9wZXJhdG9yKFwidW5pb25cIiwgdHJ1ZSk7XG5jb25zdCBpbnRlcnNlY3QgPSBjcmVhdGVTZXRPcGVyYXRvcihcImludGVyc2VjdFwiLCBmYWxzZSk7XG5jb25zdCBleGNlcHQgPSBjcmVhdGVTZXRPcGVyYXRvcihcImV4Y2VwdFwiLCBmYWxzZSk7XG5leHBvcnQge1xuICBTUUxpdGVTZWxlY3RCYXNlLFxuICBTUUxpdGVTZWxlY3RCdWlsZGVyLFxuICBTUUxpdGVTZWxlY3RRdWVyeUJ1aWxkZXJCYXNlLFxuICBleGNlcHQsXG4gIGludGVyc2VjdCxcbiAgdW5pb24sXG4gIHVuaW9uQWxsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VsZWN0LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vc2VsZWN0aW9uLXByb3h5LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVEaWFsZWN0LCBTUUxpdGVTeW5jRGlhbGVjdCB9IGZyb20gXCIuLi9kaWFsZWN0LmpzXCI7XG5pbXBvcnQgeyBXaXRoU3VicXVlcnkgfSBmcm9tIFwiLi4vLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVNlbGVjdEJ1aWxkZXIgfSBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmNsYXNzIFF1ZXJ5QnVpbGRlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVF1ZXJ5QnVpbGRlclwiO1xuICBkaWFsZWN0O1xuICBkaWFsZWN0Q29uZmlnO1xuICBjb25zdHJ1Y3RvcihkaWFsZWN0KSB7XG4gICAgdGhpcy5kaWFsZWN0ID0gaXMoZGlhbGVjdCwgU1FMaXRlRGlhbGVjdCkgPyBkaWFsZWN0IDogdm9pZCAwO1xuICAgIHRoaXMuZGlhbGVjdENvbmZpZyA9IGlzKGRpYWxlY3QsIFNRTGl0ZURpYWxlY3QpID8gdm9pZCAwIDogZGlhbGVjdDtcbiAgfVxuICAkd2l0aCA9IChhbGlhcywgc2VsZWN0aW9uKSA9PiB7XG4gICAgY29uc3QgcXVlcnlCdWlsZGVyID0gdGhpcztcbiAgICBjb25zdCBhcyA9IChxYikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBxYiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHFiID0gcWIocXVlcnlCdWlsZGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUHJveHkoXG4gICAgICAgIG5ldyBXaXRoU3VicXVlcnkoXG4gICAgICAgICAgcWIuZ2V0U1FMKCksXG4gICAgICAgICAgc2VsZWN0aW9uID8/IChcImdldFNlbGVjdGVkRmllbGRzXCIgaW4gcWIgPyBxYi5nZXRTZWxlY3RlZEZpZWxkcygpID8/IHt9IDoge30pLFxuICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKSxcbiAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IGFsaWFzLCBzcWxBbGlhc2VkQmVoYXZpb3I6IFwiYWxpYXNcIiwgc3FsQmVoYXZpb3I6IFwiZXJyb3JcIiB9KVxuICAgICAgKTtcbiAgICB9O1xuICAgIHJldHVybiB7IGFzIH07XG4gIH07XG4gIHdpdGgoLi4ucXVlcmllcykge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGZ1bmN0aW9uIHNlbGVjdChmaWVsZHMpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7XG4gICAgICAgIGZpZWxkczogZmllbGRzID8/IHZvaWQgMCxcbiAgICAgICAgc2Vzc2lvbjogdm9pZCAwLFxuICAgICAgICBkaWFsZWN0OiBzZWxmLmdldERpYWxlY3QoKSxcbiAgICAgICAgd2l0aExpc3Q6IHF1ZXJpZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZWxlY3REaXN0aW5jdChmaWVsZHMpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7XG4gICAgICAgIGZpZWxkczogZmllbGRzID8/IHZvaWQgMCxcbiAgICAgICAgc2Vzc2lvbjogdm9pZCAwLFxuICAgICAgICBkaWFsZWN0OiBzZWxmLmdldERpYWxlY3QoKSxcbiAgICAgICAgd2l0aExpc3Q6IHF1ZXJpZXMsXG4gICAgICAgIGRpc3RpbmN0OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc2VsZWN0LCBzZWxlY3REaXN0aW5jdCB9O1xuICB9XG4gIHNlbGVjdChmaWVsZHMpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoeyBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsIHNlc3Npb246IHZvaWQgMCwgZGlhbGVjdDogdGhpcy5nZXREaWFsZWN0KCkgfSk7XG4gIH1cbiAgc2VsZWN0RGlzdGluY3QoZmllbGRzKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHtcbiAgICAgIGZpZWxkczogZmllbGRzID8/IHZvaWQgMCxcbiAgICAgIHNlc3Npb246IHZvaWQgMCxcbiAgICAgIGRpYWxlY3Q6IHRoaXMuZ2V0RGlhbGVjdCgpLFxuICAgICAgZGlzdGluY3Q6IHRydWVcbiAgICB9KTtcbiAgfVxuICAvLyBMYXp5IGxvYWQgZGlhbGVjdCB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5XG4gIGdldERpYWxlY3QoKSB7XG4gICAgaWYgKCF0aGlzLmRpYWxlY3QpIHtcbiAgICAgIHRoaXMuZGlhbGVjdCA9IG5ldyBTUUxpdGVTeW5jRGlhbGVjdCh0aGlzLmRpYWxlY3RDb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaWFsZWN0O1xuICB9XG59XG5leHBvcnQge1xuICBRdWVyeUJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1xdWVyeS1idWlsZGVyLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuaW1wb3J0IHsgUGFyYW0sIFNRTCwgc3FsIH0gZnJvbSBcIi4uLy4uL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVRhYmxlIH0gZnJvbSBcIi4uL3RhYmxlLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW5zLCBUYWJsZSB9IGZyb20gXCIuLi8uLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgaGF2ZVNhbWVLZXlzLCBtYXBVcGRhdGVTZXQsIG9yZGVyU2VsZWN0ZWRGaWVsZHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IGV4dHJhY3RVc2VkVGFibGUgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IFF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXIuanNcIjtcbmNsYXNzIFNRTGl0ZUluc2VydEJ1aWxkZXIge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgc2Vzc2lvbiwgZGlhbGVjdCwgd2l0aExpc3QpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMud2l0aExpc3QgPSB3aXRoTGlzdDtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVJbnNlcnRCdWlsZGVyXCI7XG4gIHZhbHVlcyh2YWx1ZXMpIHtcbiAgICB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlcykgPyB2YWx1ZXMgOiBbdmFsdWVzXTtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidmFsdWVzKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBhdCBsZWFzdCBvbmUgdmFsdWVcIik7XG4gICAgfVxuICAgIGNvbnN0IG1hcHBlZFZhbHVlcyA9IHZhbHVlcy5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLnRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXTtcbiAgICAgIGZvciAoY29uc3QgY29sS2V5IG9mIE9iamVjdC5rZXlzKGVudHJ5KSkge1xuICAgICAgICBjb25zdCBjb2xWYWx1ZSA9IGVudHJ5W2NvbEtleV07XG4gICAgICAgIHJlc3VsdFtjb2xLZXldID0gaXMoY29sVmFsdWUsIFNRTCkgPyBjb2xWYWx1ZSA6IG5ldyBQYXJhbShjb2xWYWx1ZSwgY29sc1tjb2xLZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVJbnNlcnRCYXNlKHRoaXMudGFibGUsIG1hcHBlZFZhbHVlcywgdGhpcy5zZXNzaW9uLCB0aGlzLmRpYWxlY3QsIHRoaXMud2l0aExpc3QpO1xuICB9XG4gIHNlbGVjdChzZWxlY3RRdWVyeSkge1xuICAgIGNvbnN0IHNlbGVjdCA9IHR5cGVvZiBzZWxlY3RRdWVyeSA9PT0gXCJmdW5jdGlvblwiID8gc2VsZWN0UXVlcnkobmV3IFF1ZXJ5QnVpbGRlcigpKSA6IHNlbGVjdFF1ZXJ5O1xuICAgIGlmICghaXMoc2VsZWN0LCBTUUwpICYmICFoYXZlU2FtZUtleXModGhpcy50YWJsZVtDb2x1bW5zXSwgc2VsZWN0Ll8uc2VsZWN0ZWRGaWVsZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiSW5zZXJ0IHNlbGVjdCBlcnJvcjogc2VsZWN0ZWQgZmllbGRzIGFyZSBub3QgdGhlIHNhbWUgb3IgYXJlIGluIGEgZGlmZmVyZW50IG9yZGVyIGNvbXBhcmVkIHRvIHRoZSB0YWJsZSBkZWZpbml0aW9uXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU1FMaXRlSW5zZXJ0QmFzZSh0aGlzLnRhYmxlLCBzZWxlY3QsIHRoaXMuc2Vzc2lvbiwgdGhpcy5kaWFsZWN0LCB0aGlzLndpdGhMaXN0LCB0cnVlKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlSW5zZXJ0QmFzZSBleHRlbmRzIFF1ZXJ5UHJvbWlzZSB7XG4gIGNvbnN0cnVjdG9yKHRhYmxlLCB2YWx1ZXMsIHNlc3Npb24sIGRpYWxlY3QsIHdpdGhMaXN0LCBzZWxlY3QpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLmNvbmZpZyA9IHsgdGFibGUsIHZhbHVlcywgd2l0aExpc3QsIHNlbGVjdCB9O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUluc2VydFwiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbmZpZztcbiAgcmV0dXJuaW5nKGZpZWxkcyA9IHRoaXMuY29uZmlnLnRhYmxlW1NRTGl0ZVRhYmxlLlN5bWJvbC5Db2x1bW5zXSkge1xuICAgIHRoaXMuY29uZmlnLnJldHVybmluZyA9IG9yZGVyU2VsZWN0ZWRGaWVsZHMoZmllbGRzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkcyBhbiBgb24gY29uZmxpY3QgZG8gbm90aGluZ2AgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBzaW1wbHkgYXZvaWRzIGluc2VydGluZyBhIHJvdyBhcyBpdHMgYWx0ZXJuYXRpdmUgYWN0aW9uLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2luc2VydCNvbi1jb25mbGljdC1kby1ub3RoaW5nfVxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIFRoZSBgdGFyZ2V0YCBhbmQgYHdoZXJlYCBjbGF1c2VzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiAvLyBJbnNlcnQgb25lIHJvdyBhbmQgY2FuY2VsIHRoZSBpbnNlcnQgaWYgdGhlcmUncyBhIGNvbmZsaWN0XG4gICAqIGF3YWl0IGRiLmluc2VydChjYXJzKVxuICAgKiAgIC52YWx1ZXMoeyBpZDogMSwgYnJhbmQ6ICdCTVcnIH0pXG4gICAqICAgLm9uQ29uZmxpY3REb05vdGhpbmcoKTtcbiAgICpcbiAgICogLy8gRXhwbGljaXRseSBzcGVjaWZ5IGNvbmZsaWN0IHRhcmdldFxuICAgKiBhd2FpdCBkYi5pbnNlcnQoY2FycylcbiAgICogICAudmFsdWVzKHsgaWQ6IDEsIGJyYW5kOiAnQk1XJyB9KVxuICAgKiAgIC5vbkNvbmZsaWN0RG9Ob3RoaW5nKHsgdGFyZ2V0OiBjYXJzLmlkIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIG9uQ29uZmxpY3REb05vdGhpbmcoY29uZmlnID0ge30pIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLm9uQ29uZmxpY3QpIHRoaXMuY29uZmlnLm9uQ29uZmxpY3QgPSBbXTtcbiAgICBpZiAoY29uZmlnLnRhcmdldCA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLmNvbmZpZy5vbkNvbmZsaWN0LnB1c2goc3FsYCBvbiBjb25mbGljdCBkbyBub3RoaW5nYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhcmdldFNxbCA9IEFycmF5LmlzQXJyYXkoY29uZmlnLnRhcmdldCkgPyBzcWxgJHtjb25maWcudGFyZ2V0fWAgOiBzcWxgJHtbY29uZmlnLnRhcmdldF19YDtcbiAgICAgIGNvbnN0IHdoZXJlU3FsID0gY29uZmlnLndoZXJlID8gc3FsYCB3aGVyZSAke2NvbmZpZy53aGVyZX1gIDogc3FsYGA7XG4gICAgICB0aGlzLmNvbmZpZy5vbkNvbmZsaWN0LnB1c2goc3FsYCBvbiBjb25mbGljdCAke3RhcmdldFNxbH0gZG8gbm90aGluZyR7d2hlcmVTcWx9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGFuIGBvbiBjb25mbGljdCBkbyB1cGRhdGVgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIGV4aXN0aW5nIHJvdyB0aGF0IGNvbmZsaWN0cyB3aXRoIHRoZSByb3cgcHJvcG9zZWQgZm9yIGluc2VydGlvbiBhcyBpdHMgYWx0ZXJuYXRpdmUgYWN0aW9uLlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2luc2VydCN1cHNlcnRzLWFuZC1jb25mbGljdHN9XG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgVGhlIGB0YXJnZXRgLCBgc2V0YCBhbmQgYHdoZXJlYCBjbGF1c2VzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiAvLyBVcGRhdGUgdGhlIHJvdyBpZiB0aGVyZSdzIGEgY29uZmxpY3RcbiAgICogYXdhaXQgZGIuaW5zZXJ0KGNhcnMpXG4gICAqICAgLnZhbHVlcyh7IGlkOiAxLCBicmFuZDogJ0JNVycgfSlcbiAgICogICAub25Db25mbGljdERvVXBkYXRlKHtcbiAgICogICAgIHRhcmdldDogY2Fycy5pZCxcbiAgICogICAgIHNldDogeyBicmFuZDogJ1BvcnNjaGUnIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogLy8gVXBzZXJ0IHdpdGggJ3doZXJlJyBjbGF1c2VcbiAgICogYXdhaXQgZGIuaW5zZXJ0KGNhcnMpXG4gICAqICAgLnZhbHVlcyh7IGlkOiAxLCBicmFuZDogJ0JNVycgfSlcbiAgICogICAub25Db25mbGljdERvVXBkYXRlKHtcbiAgICogICAgIHRhcmdldDogY2Fycy5pZCxcbiAgICogICAgIHNldDogeyBicmFuZDogJ25ld0JNVycgfSxcbiAgICogICAgIHdoZXJlOiBzcWxgJHtjYXJzLmNyZWF0ZWRBdH0gPiAnMjAyMy0wMS0wMSc6OmRhdGVgLFxuICAgKiAgIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIG9uQ29uZmxpY3REb1VwZGF0ZShjb25maWcpIHtcbiAgICBpZiAoY29uZmlnLndoZXJlICYmIChjb25maWcudGFyZ2V0V2hlcmUgfHwgY29uZmlnLnNldFdoZXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnWW91IGNhbm5vdCB1c2UgYm90aCBcIndoZXJlXCIgYW5kIFwidGFyZ2V0V2hlcmVcIi9cInNldFdoZXJlXCIgYXQgdGhlIHNhbWUgdGltZSAtIFwid2hlcmVcIiBpcyBkZXByZWNhdGVkLCB1c2UgXCJ0YXJnZXRXaGVyZVwiIG9yIFwic2V0V2hlcmVcIiBpbnN0ZWFkLidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghdGhpcy5jb25maWcub25Db25mbGljdCkgdGhpcy5jb25maWcub25Db25mbGljdCA9IFtdO1xuICAgIGNvbnN0IHdoZXJlU3FsID0gY29uZmlnLndoZXJlID8gc3FsYCB3aGVyZSAke2NvbmZpZy53aGVyZX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IHRhcmdldFdoZXJlU3FsID0gY29uZmlnLnRhcmdldFdoZXJlID8gc3FsYCB3aGVyZSAke2NvbmZpZy50YXJnZXRXaGVyZX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IHNldFdoZXJlU3FsID0gY29uZmlnLnNldFdoZXJlID8gc3FsYCB3aGVyZSAke2NvbmZpZy5zZXRXaGVyZX1gIDogdm9pZCAwO1xuICAgIGNvbnN0IHRhcmdldFNxbCA9IEFycmF5LmlzQXJyYXkoY29uZmlnLnRhcmdldCkgPyBzcWxgJHtjb25maWcudGFyZ2V0fWAgOiBzcWxgJHtbY29uZmlnLnRhcmdldF19YDtcbiAgICBjb25zdCBzZXRTcWwgPSB0aGlzLmRpYWxlY3QuYnVpbGRVcGRhdGVTZXQodGhpcy5jb25maWcudGFibGUsIG1hcFVwZGF0ZVNldCh0aGlzLmNvbmZpZy50YWJsZSwgY29uZmlnLnNldCkpO1xuICAgIHRoaXMuY29uZmlnLm9uQ29uZmxpY3QucHVzaChcbiAgICAgIHNxbGAgb24gY29uZmxpY3QgJHt0YXJnZXRTcWx9JHt0YXJnZXRXaGVyZVNxbH0gZG8gdXBkYXRlIHNldCAke3NldFNxbH0ke3doZXJlU3FsfSR7c2V0V2hlcmVTcWx9YFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbGVjdC5idWlsZEluc2VydFF1ZXJ5KHRoaXMuY29uZmlnKTtcbiAgfVxuICB0b1NRTCgpIHtcbiAgICBjb25zdCB7IHR5cGluZ3M6IF90eXBpbmdzLCAuLi5yZXN0IH0gPSB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKTtcbiAgICByZXR1cm4gcmVzdDtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9wcmVwYXJlKGlzT25lVGltZVF1ZXJ5ID0gdHJ1ZSkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25baXNPbmVUaW1lUXVlcnkgPyBcInByZXBhcmVPbmVUaW1lUXVlcnlcIiA6IFwicHJlcGFyZVF1ZXJ5XCJdKFxuICAgICAgdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSksXG4gICAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcsXG4gICAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPyBcImFsbFwiIDogXCJydW5cIixcbiAgICAgIHRydWUsXG4gICAgICB2b2lkIDAsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiaW5zZXJ0XCIsXG4gICAgICAgIHRhYmxlczogZXh0cmFjdFVzZWRUYWJsZSh0aGlzLmNvbmZpZy50YWJsZSlcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByZXBhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpO1xuICB9XG4gIHJ1biA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkucnVuKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYWxsID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5hbGwocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBnZXQgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmdldChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIHZhbHVlcyA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkudmFsdWVzKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucmV0dXJuaW5nID8gdGhpcy5hbGwoKSA6IHRoaXMucnVuKCk7XG4gIH1cbiAgJGR5bmFtaWMoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZUluc2VydEJhc2UsXG4gIFNRTGl0ZUluc2VydEJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnNlcnQuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kLCBpcyB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi8uLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5pbXBvcnQgeyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vc2VsZWN0aW9uLXByb3h5LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVUYWJsZSB9IGZyb20gXCIuLi90YWJsZS5qc1wiO1xuaW1wb3J0IHsgU3VicXVlcnkgfSBmcm9tIFwiLi4vLi4vc3VicXVlcnkuanNcIjtcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlLmpzXCI7XG5pbXBvcnQge1xuICBnZXRUYWJsZUxpa2VOYW1lLFxuICBtYXBVcGRhdGVTZXQsXG4gIG9yZGVyU2VsZWN0ZWRGaWVsZHNcbn0gZnJvbSBcIi4uLy4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBWaWV3QmFzZUNvbmZpZyB9IGZyb20gXCIuLi8uLi92aWV3LWNvbW1vbi5qc1wiO1xuaW1wb3J0IHsgZXh0cmFjdFVzZWRUYWJsZSB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVmlld0Jhc2UgfSBmcm9tIFwiLi4vdmlldy1iYXNlLmpzXCI7XG5jbGFzcyBTUUxpdGVVcGRhdGVCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IodGFibGUsIHNlc3Npb24sIGRpYWxlY3QsIHdpdGhMaXN0KSB7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLndpdGhMaXN0ID0gd2l0aExpc3Q7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVXBkYXRlQnVpbGRlclwiO1xuICBzZXQodmFsdWVzKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVVcGRhdGVCYXNlKFxuICAgICAgdGhpcy50YWJsZSxcbiAgICAgIG1hcFVwZGF0ZVNldCh0aGlzLnRhYmxlLCB2YWx1ZXMpLFxuICAgICAgdGhpcy5zZXNzaW9uLFxuICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgdGhpcy53aXRoTGlzdFxuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVVwZGF0ZUJhc2UgZXh0ZW5kcyBRdWVyeVByb21pc2Uge1xuICBjb25zdHJ1Y3Rvcih0YWJsZSwgc2V0LCBzZXNzaW9uLCBkaWFsZWN0LCB3aXRoTGlzdCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLmRpYWxlY3QgPSBkaWFsZWN0O1xuICAgIHRoaXMuY29uZmlnID0geyBzZXQsIHRhYmxlLCB3aXRoTGlzdCwgam9pbnM6IFtdIH07XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlVXBkYXRlXCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uZmlnO1xuICBmcm9tKHNvdXJjZSkge1xuICAgIHRoaXMuY29uZmlnLmZyb20gPSBzb3VyY2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgY3JlYXRlSm9pbihqb2luVHlwZSkge1xuICAgIHJldHVybiAodGFibGUsIG9uKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSBnZXRUYWJsZUxpa2VOYW1lKHRhYmxlKTtcbiAgICAgIGlmICh0eXBlb2YgdGFibGVOYW1lID09PSBcInN0cmluZ1wiICYmIHRoaXMuY29uZmlnLmpvaW5zLnNvbWUoKGpvaW4pID0+IGpvaW4uYWxpYXMgPT09IHRhYmxlTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbGlhcyBcIiR7dGFibGVOYW1lfVwiIGlzIGFscmVhZHkgdXNlZCBpbiB0aGlzIHF1ZXJ5YCk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgZnJvbSA9IHRoaXMuY29uZmlnLmZyb20gPyBpcyh0YWJsZSwgU1FMaXRlVGFibGUpID8gdGFibGVbVGFibGUuU3ltYm9sLkNvbHVtbnNdIDogaXModGFibGUsIFN1YnF1ZXJ5KSA/IHRhYmxlLl8uc2VsZWN0ZWRGaWVsZHMgOiBpcyh0YWJsZSwgU1FMaXRlVmlld0Jhc2UpID8gdGFibGVbVmlld0Jhc2VDb25maWddLnNlbGVjdGVkRmllbGRzIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgICBvbiA9IG9uKFxuICAgICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnRhYmxlW1RhYmxlLlN5bWJvbC5Db2x1bW5zXSxcbiAgICAgICAgICAgIG5ldyBTZWxlY3Rpb25Qcm94eUhhbmRsZXIoeyBzcWxBbGlhc2VkQmVoYXZpb3I6IFwic3FsXCIsIHNxbEJlaGF2aW9yOiBcInNxbFwiIH0pXG4gICAgICAgICAgKSxcbiAgICAgICAgICBmcm9tICYmIG5ldyBQcm94eShcbiAgICAgICAgICAgIGZyb20sXG4gICAgICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgc3FsQWxpYXNlZEJlaGF2aW9yOiBcInNxbFwiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29uZmlnLmpvaW5zLnB1c2goeyBvbiwgdGFibGUsIGpvaW5UeXBlLCBhbGlhczogdGFibGVOYW1lIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfVxuICBsZWZ0Sm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcImxlZnRcIik7XG4gIHJpZ2h0Sm9pbiA9IHRoaXMuY3JlYXRlSm9pbihcInJpZ2h0XCIpO1xuICBpbm5lckpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJpbm5lclwiKTtcbiAgZnVsbEpvaW4gPSB0aGlzLmNyZWF0ZUpvaW4oXCJmdWxsXCIpO1xuICAvKipcbiAgICogQWRkcyBhICd3aGVyZScgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSBvbmx5IHRob3NlIHJvd3MgdGhhdCBmdWxmaWxsIGEgc3BlY2lmaWVkIGNvbmRpdGlvbi5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy91cGRhdGV9XG4gICAqXG4gICAqIEBwYXJhbSB3aGVyZSB0aGUgJ3doZXJlJyBjbGF1c2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFlvdSBjYW4gdXNlIGNvbmRpdGlvbmFsIG9wZXJhdG9ycyBhbmQgYHNxbCBmdW5jdGlvbmAgdG8gZmlsdGVyIHRoZSByb3dzIHRvIGJlIHVwZGF0ZWQuXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFVwZGF0ZSBhbGwgY2FycyB3aXRoIGdyZWVuIGNvbG9yXG4gICAqIGRiLnVwZGF0ZShjYXJzKS5zZXQoeyBjb2xvcjogJ3JlZCcgfSlcbiAgICogICAud2hlcmUoZXEoY2Fycy5jb2xvciwgJ2dyZWVuJykpO1xuICAgKiAvLyBvclxuICAgKiBkYi51cGRhdGUoY2Fycykuc2V0KHsgY29sb3I6ICdyZWQnIH0pXG4gICAqICAgLndoZXJlKHNxbGAke2NhcnMuY29sb3J9ID0gJ2dyZWVuJ2ApXG4gICAqIGBgYFxuICAgKlxuICAgKiBZb3UgY2FuIGxvZ2ljYWxseSBjb21iaW5lIGNvbmRpdGlvbmFsIG9wZXJhdG9ycyB3aXRoIGBhbmQoKWAgYW5kIGBvcigpYCBvcGVyYXRvcnM6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFVwZGF0ZSBhbGwgQk1XIGNhcnMgd2l0aCBhIGdyZWVuIGNvbG9yXG4gICAqIGRiLnVwZGF0ZShjYXJzKS5zZXQoeyBjb2xvcjogJ3JlZCcgfSlcbiAgICogICAud2hlcmUoYW5kKGVxKGNhcnMuY29sb3IsICdncmVlbicpLCBlcShjYXJzLmJyYW5kLCAnQk1XJykpKTtcbiAgICpcbiAgICogLy8gVXBkYXRlIGFsbCBjYXJzIHdpdGggdGhlIGdyZWVuIG9yIGJsdWUgY29sb3JcbiAgICogZGIudXBkYXRlKGNhcnMpLnNldCh7IGNvbG9yOiAncmVkJyB9KVxuICAgKiAgIC53aGVyZShvcihlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSwgZXEoY2Fycy5jb2xvciwgJ2JsdWUnKSkpO1xuICAgKiBgYGBcbiAgICovXG4gIHdoZXJlKHdoZXJlKSB7XG4gICAgdGhpcy5jb25maWcud2hlcmUgPSB3aGVyZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcmRlckJ5KC4uLmNvbHVtbnMpIHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbnNbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3Qgb3JkZXJCeSA9IGNvbHVtbnNbMF0oXG4gICAgICAgIG5ldyBQcm94eShcbiAgICAgICAgICB0aGlzLmNvbmZpZy50YWJsZVtUYWJsZS5TeW1ib2wuQ29sdW1uc10sXG4gICAgICAgICAgbmV3IFNlbGVjdGlvblByb3h5SGFuZGxlcih7IHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJzcWxcIiB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgY29uc3Qgb3JkZXJCeUFycmF5ID0gQXJyYXkuaXNBcnJheShvcmRlckJ5KSA/IG9yZGVyQnkgOiBbb3JkZXJCeV07XG4gICAgICB0aGlzLmNvbmZpZy5vcmRlckJ5ID0gb3JkZXJCeUFycmF5O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcmRlckJ5QXJyYXkgPSBjb2x1bW5zO1xuICAgICAgdGhpcy5jb25maWcub3JkZXJCeSA9IG9yZGVyQnlBcnJheTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgbGltaXQobGltaXQpIHtcbiAgICB0aGlzLmNvbmZpZy5saW1pdCA9IGxpbWl0O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHJldHVybmluZyhmaWVsZHMgPSB0aGlzLmNvbmZpZy50YWJsZVtTUUxpdGVUYWJsZS5TeW1ib2wuQ29sdW1uc10pIHtcbiAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPSBvcmRlclNlbGVjdGVkRmllbGRzKGZpZWxkcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbGVjdC5idWlsZFVwZGF0ZVF1ZXJ5KHRoaXMuY29uZmlnKTtcbiAgfVxuICB0b1NRTCgpIHtcbiAgICBjb25zdCB7IHR5cGluZ3M6IF90eXBpbmdzLCAuLi5yZXN0IH0gPSB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeSh0aGlzLmdldFNRTCgpKTtcbiAgICByZXR1cm4gcmVzdDtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9wcmVwYXJlKGlzT25lVGltZVF1ZXJ5ID0gdHJ1ZSkge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25baXNPbmVUaW1lUXVlcnkgPyBcInByZXBhcmVPbmVUaW1lUXVlcnlcIiA6IFwicHJlcGFyZVF1ZXJ5XCJdKFxuICAgICAgdGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSksXG4gICAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcsXG4gICAgICB0aGlzLmNvbmZpZy5yZXR1cm5pbmcgPyBcImFsbFwiIDogXCJydW5cIixcbiAgICAgIHRydWUsXG4gICAgICB2b2lkIDAsXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiaW5zZXJ0XCIsXG4gICAgICAgIHRhYmxlczogZXh0cmFjdFVzZWRUYWJsZSh0aGlzLmNvbmZpZy50YWJsZSlcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByZXBhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoZmFsc2UpO1xuICB9XG4gIHJ1biA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkucnVuKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYWxsID0gKHBsYWNlaG9sZGVyVmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmUoKS5hbGwocGxhY2Vob2xkZXJWYWx1ZXMpO1xuICB9O1xuICBnZXQgPSAocGxhY2Vob2xkZXJWYWx1ZXMpID0+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZSgpLmdldChwbGFjZWhvbGRlclZhbHVlcyk7XG4gIH07XG4gIHZhbHVlcyA9IChwbGFjZWhvbGRlclZhbHVlcykgPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKCkudmFsdWVzKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgfTtcbiAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucmV0dXJuaW5nID8gdGhpcy5hbGwoKSA6IHRoaXMucnVuKCk7XG4gIH1cbiAgJGR5bmFtaWMoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFNRTGl0ZVVwZGF0ZUJhc2UsXG4gIFNRTGl0ZVVwZGF0ZUJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11cGRhdGUuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uLy4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU1FMLCBzcWwgfSBmcm9tIFwiLi4vLi4vc3FsL3NxbC5qc1wiO1xuY2xhc3MgU1FMaXRlQ291bnRCdWlsZGVyIGV4dGVuZHMgU1FMIHtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoU1FMaXRlQ291bnRCdWlsZGVyLmJ1aWxkRW1iZWRkZWRDb3VudChwYXJhbXMuc291cmNlLCBwYXJhbXMuZmlsdGVycykucXVlcnlDaHVua3MpO1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMuc2Vzc2lvbiA9IHBhcmFtcy5zZXNzaW9uO1xuICAgIHRoaXMuc3FsID0gU1FMaXRlQ291bnRCdWlsZGVyLmJ1aWxkQ291bnQoXG4gICAgICBwYXJhbXMuc291cmNlLFxuICAgICAgcGFyYW1zLmZpbHRlcnNcbiAgICApO1xuICB9XG4gIHNxbDtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQ291bnRCdWlsZGVyQXN5bmNcIjtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ10gPSBcIlNRTGl0ZUNvdW50QnVpbGRlckFzeW5jXCI7XG4gIHNlc3Npb247XG4gIHN0YXRpYyBidWlsZEVtYmVkZGVkQ291bnQoc291cmNlLCBmaWx0ZXJzKSB7XG4gICAgcmV0dXJuIHNxbGAoc2VsZWN0IGNvdW50KCopIGZyb20gJHtzb3VyY2V9JHtzcWwucmF3KFwiIHdoZXJlIFwiKS5pZihmaWx0ZXJzKX0ke2ZpbHRlcnN9KWA7XG4gIH1cbiAgc3RhdGljIGJ1aWxkQ291bnQoc291cmNlLCBmaWx0ZXJzKSB7XG4gICAgcmV0dXJuIHNxbGBzZWxlY3QgY291bnQoKikgZnJvbSAke3NvdXJjZX0ke3NxbC5yYXcoXCIgd2hlcmUgXCIpLmlmKGZpbHRlcnMpfSR7ZmlsdGVyc31gO1xuICB9XG4gIHRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuc2Vzc2lvbi5jb3VudCh0aGlzLnNxbCkpLnRoZW4oXG4gICAgICBvbmZ1bGZpbGxlZCxcbiAgICAgIG9ucmVqZWN0ZWRcbiAgICApO1xuICB9XG4gIGNhdGNoKG9uUmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKHZvaWQgMCwgb25SZWplY3RlZCk7XG4gIH1cbiAgZmluYWxseShvbkZpbmFsbHkpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKFxuICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgIG9uRmluYWxseT8uKCk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICAocmVhc29uKSA9PiB7XG4gICAgICAgIG9uRmluYWxseT8uKCk7XG4gICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5leHBvcnQge1xuICBTUUxpdGVDb3VudEJ1aWxkZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb3VudC5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuaW1wb3J0IHtcbiAgbWFwUmVsYXRpb25hbFJvd1xufSBmcm9tIFwiLi4vLi4vcmVsYXRpb25zLmpzXCI7XG5jbGFzcyBSZWxhdGlvbmFsUXVlcnlCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IobW9kZSwgZnVsbFNjaGVtYSwgc2NoZW1hLCB0YWJsZU5hbWVzTWFwLCB0YWJsZSwgdGFibGVDb25maWcsIGRpYWxlY3QsIHNlc3Npb24pIHtcbiAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgIHRoaXMuZnVsbFNjaGVtYSA9IGZ1bGxTY2hlbWE7XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy50YWJsZU5hbWVzTWFwID0gdGFibGVOYW1lc01hcDtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy50YWJsZUNvbmZpZyA9IHRhYmxlQ29uZmlnO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVBc3luY1JlbGF0aW9uYWxRdWVyeUJ1aWxkZXJcIjtcbiAgZmluZE1hbnkoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gXCJzeW5jXCIgPyBuZXcgU1FMaXRlU3luY1JlbGF0aW9uYWxRdWVyeShcbiAgICAgIHRoaXMuZnVsbFNjaGVtYSxcbiAgICAgIHRoaXMuc2NoZW1hLFxuICAgICAgdGhpcy50YWJsZU5hbWVzTWFwLFxuICAgICAgdGhpcy50YWJsZSxcbiAgICAgIHRoaXMudGFibGVDb25maWcsXG4gICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICB0aGlzLnNlc3Npb24sXG4gICAgICBjb25maWcgPyBjb25maWcgOiB7fSxcbiAgICAgIFwibWFueVwiXG4gICAgKSA6IG5ldyBTUUxpdGVSZWxhdGlvbmFsUXVlcnkoXG4gICAgICB0aGlzLmZ1bGxTY2hlbWEsXG4gICAgICB0aGlzLnNjaGVtYSxcbiAgICAgIHRoaXMudGFibGVOYW1lc01hcCxcbiAgICAgIHRoaXMudGFibGUsXG4gICAgICB0aGlzLnRhYmxlQ29uZmlnLFxuICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgdGhpcy5zZXNzaW9uLFxuICAgICAgY29uZmlnID8gY29uZmlnIDoge30sXG4gICAgICBcIm1hbnlcIlxuICAgICk7XG4gIH1cbiAgZmluZEZpcnN0KGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09IFwic3luY1wiID8gbmV3IFNRTGl0ZVN5bmNSZWxhdGlvbmFsUXVlcnkoXG4gICAgICB0aGlzLmZ1bGxTY2hlbWEsXG4gICAgICB0aGlzLnNjaGVtYSxcbiAgICAgIHRoaXMudGFibGVOYW1lc01hcCxcbiAgICAgIHRoaXMudGFibGUsXG4gICAgICB0aGlzLnRhYmxlQ29uZmlnLFxuICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgdGhpcy5zZXNzaW9uLFxuICAgICAgY29uZmlnID8geyAuLi5jb25maWcsIGxpbWl0OiAxIH0gOiB7IGxpbWl0OiAxIH0sXG4gICAgICBcImZpcnN0XCJcbiAgICApIDogbmV3IFNRTGl0ZVJlbGF0aW9uYWxRdWVyeShcbiAgICAgIHRoaXMuZnVsbFNjaGVtYSxcbiAgICAgIHRoaXMuc2NoZW1hLFxuICAgICAgdGhpcy50YWJsZU5hbWVzTWFwLFxuICAgICAgdGhpcy50YWJsZSxcbiAgICAgIHRoaXMudGFibGVDb25maWcsXG4gICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICB0aGlzLnNlc3Npb24sXG4gICAgICBjb25maWcgPyB7IC4uLmNvbmZpZywgbGltaXQ6IDEgfSA6IHsgbGltaXQ6IDEgfSxcbiAgICAgIFwiZmlyc3RcIlxuICAgICk7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVJlbGF0aW9uYWxRdWVyeSBleHRlbmRzIFF1ZXJ5UHJvbWlzZSB7XG4gIGNvbnN0cnVjdG9yKGZ1bGxTY2hlbWEsIHNjaGVtYSwgdGFibGVOYW1lc01hcCwgdGFibGUsIHRhYmxlQ29uZmlnLCBkaWFsZWN0LCBzZXNzaW9uLCBjb25maWcsIG1vZGUpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZnVsbFNjaGVtYSA9IGZ1bGxTY2hlbWE7XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy50YWJsZU5hbWVzTWFwID0gdGFibGVOYW1lc01hcDtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy50YWJsZUNvbmZpZyA9IHRhYmxlQ29uZmlnO1xuICAgIHRoaXMuZGlhbGVjdCA9IGRpYWxlY3Q7XG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZUFzeW5jUmVsYXRpb25hbFF1ZXJ5XCI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbW9kZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTUUwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlhbGVjdC5idWlsZFJlbGF0aW9uYWxRdWVyeSh7XG4gICAgICBmdWxsU2NoZW1hOiB0aGlzLmZ1bGxTY2hlbWEsXG4gICAgICBzY2hlbWE6IHRoaXMuc2NoZW1hLFxuICAgICAgdGFibGVOYW1lc01hcDogdGhpcy50YWJsZU5hbWVzTWFwLFxuICAgICAgdGFibGU6IHRoaXMudGFibGUsXG4gICAgICB0YWJsZUNvbmZpZzogdGhpcy50YWJsZUNvbmZpZyxcbiAgICAgIHF1ZXJ5Q29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIHRhYmxlQWxpYXM6IHRoaXMudGFibGVDb25maWcudHNOYW1lXG4gICAgfSkuc3FsO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ByZXBhcmUoaXNPbmVUaW1lUXVlcnkgPSBmYWxzZSkge1xuICAgIGNvbnN0IHsgcXVlcnksIGJ1aWx0UXVlcnkgfSA9IHRoaXMuX3RvU1FMKCk7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbltpc09uZVRpbWVRdWVyeSA/IFwicHJlcGFyZU9uZVRpbWVRdWVyeVwiIDogXCJwcmVwYXJlUXVlcnlcIl0oXG4gICAgICBidWlsdFF1ZXJ5LFxuICAgICAgdm9pZCAwLFxuICAgICAgdGhpcy5tb2RlID09PSBcImZpcnN0XCIgPyBcImdldFwiIDogXCJhbGxcIixcbiAgICAgIHRydWUsXG4gICAgICAocmF3Um93cywgbWFwQ29sdW1uVmFsdWUpID0+IHtcbiAgICAgICAgY29uc3Qgcm93cyA9IHJhd1Jvd3MubWFwKFxuICAgICAgICAgIChyb3cpID0+IG1hcFJlbGF0aW9uYWxSb3codGhpcy5zY2hlbWEsIHRoaXMudGFibGVDb25maWcsIHJvdywgcXVlcnkuc2VsZWN0aW9uLCBtYXBDb2x1bW5WYWx1ZSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gXCJmaXJzdFwiKSB7XG4gICAgICAgICAgcmV0dXJuIHJvd3NbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3M7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwcmVwYXJlKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKTtcbiAgfVxuICBfdG9TUUwoKSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLmRpYWxlY3QuYnVpbGRSZWxhdGlvbmFsUXVlcnkoe1xuICAgICAgZnVsbFNjaGVtYTogdGhpcy5mdWxsU2NoZW1hLFxuICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgIHRhYmxlTmFtZXNNYXA6IHRoaXMudGFibGVOYW1lc01hcCxcbiAgICAgIHRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgdGFibGVDb25maWc6IHRoaXMudGFibGVDb25maWcsXG4gICAgICBxdWVyeUNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICB0YWJsZUFsaWFzOiB0aGlzLnRhYmxlQ29uZmlnLnRzTmFtZVxuICAgIH0pO1xuICAgIGNvbnN0IGJ1aWx0UXVlcnkgPSB0aGlzLmRpYWxlY3Quc3FsVG9RdWVyeShxdWVyeS5zcWwpO1xuICAgIHJldHVybiB7IHF1ZXJ5LCBidWlsdFF1ZXJ5IH07XG4gIH1cbiAgdG9TUUwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RvU1FMKCkuYnVpbHRRdWVyeTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIGV4ZWN1dGVSYXcoKSB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gXCJmaXJzdFwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJlcGFyZShmYWxzZSkuZ2V0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wcmVwYXJlKGZhbHNlKS5hbGwoKTtcbiAgfVxuICBhc3luYyBleGVjdXRlKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVSYXcoKTtcbiAgfVxufVxuY2xhc3MgU1FMaXRlU3luY1JlbGF0aW9uYWxRdWVyeSBleHRlbmRzIFNRTGl0ZVJlbGF0aW9uYWxRdWVyeSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVN5bmNSZWxhdGlvbmFsUXVlcnlcIjtcbiAgc3luYygpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmF3KCk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIFJlbGF0aW9uYWxRdWVyeUJ1aWxkZXIsXG4gIFNRTGl0ZVJlbGF0aW9uYWxRdWVyeSxcbiAgU1FMaXRlU3luY1JlbGF0aW9uYWxRdWVyeVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1ZXJ5LmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IFF1ZXJ5UHJvbWlzZSB9IGZyb20gXCIuLi8uLi9xdWVyeS1wcm9taXNlLmpzXCI7XG5jbGFzcyBTUUxpdGVSYXcgZXh0ZW5kcyBRdWVyeVByb21pc2Uge1xuICBjb25zdHJ1Y3RvcihleGVjdXRlLCBnZXRTUUwsIGFjdGlvbiwgZGlhbGVjdCwgbWFwQmF0Y2hSZXN1bHQpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZXhlY3V0ZSA9IGV4ZWN1dGU7XG4gICAgdGhpcy5nZXRTUUwgPSBnZXRTUUw7XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLm1hcEJhdGNoUmVzdWx0ID0gbWFwQmF0Y2hSZXN1bHQ7XG4gICAgdGhpcy5jb25maWcgPSB7IGFjdGlvbiB9O1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlNRTGl0ZVJhd1wiO1xuICAvKiogQGludGVybmFsICovXG4gIGNvbmZpZztcbiAgZ2V0UXVlcnkoKSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5kaWFsZWN0LnNxbFRvUXVlcnkodGhpcy5nZXRTUUwoKSksIG1ldGhvZDogdGhpcy5jb25maWcuYWN0aW9uIH07XG4gIH1cbiAgbWFwUmVzdWx0KHJlc3VsdCwgaXNGcm9tQmF0Y2gpIHtcbiAgICByZXR1cm4gaXNGcm9tQmF0Y2ggPyB0aGlzLm1hcEJhdGNoUmVzdWx0KHJlc3VsdCkgOiByZXN1bHQ7XG4gIH1cbiAgX3ByZXBhcmUoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBpc1Jlc3BvbnNlSW5BcnJheU1vZGUoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5leHBvcnQge1xuICBTUUxpdGVSYXdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYXcuanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4uL2VudGl0eS5qc1wiO1xuaW1wb3J0IHsgU2VsZWN0aW9uUHJveHlIYW5kbGVyIH0gZnJvbSBcIi4uL3NlbGVjdGlvbi1wcm94eS5qc1wiO1xuaW1wb3J0IHsgc3FsIH0gZnJvbSBcIi4uL3NxbC9zcWwuanNcIjtcbmltcG9ydCB7XG4gIFF1ZXJ5QnVpbGRlcixcbiAgU1FMaXRlRGVsZXRlQmFzZSxcbiAgU1FMaXRlSW5zZXJ0QnVpbGRlcixcbiAgU1FMaXRlU2VsZWN0QnVpbGRlcixcbiAgU1FMaXRlVXBkYXRlQnVpbGRlclxufSBmcm9tIFwiLi9xdWVyeS1idWlsZGVycy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgV2l0aFN1YnF1ZXJ5IH0gZnJvbSBcIi4uL3N1YnF1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVDb3VudEJ1aWxkZXIgfSBmcm9tIFwiLi9xdWVyeS1idWlsZGVycy9jb3VudC5qc1wiO1xuaW1wb3J0IHsgUmVsYXRpb25hbFF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXJzL3F1ZXJ5LmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVSYXcgfSBmcm9tIFwiLi9xdWVyeS1idWlsZGVycy9yYXcuanNcIjtcbmNsYXNzIEJhc2VTUUxpdGVEYXRhYmFzZSB7XG4gIGNvbnN0cnVjdG9yKHJlc3VsdEtpbmQsIGRpYWxlY3QsIHNlc3Npb24sIHNjaGVtYSkge1xuICAgIHRoaXMucmVzdWx0S2luZCA9IHJlc3VsdEtpbmQ7XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHRoaXMuXyA9IHNjaGVtYSA/IHtcbiAgICAgIHNjaGVtYTogc2NoZW1hLnNjaGVtYSxcbiAgICAgIGZ1bGxTY2hlbWE6IHNjaGVtYS5mdWxsU2NoZW1hLFxuICAgICAgdGFibGVOYW1lc01hcDogc2NoZW1hLnRhYmxlTmFtZXNNYXBcbiAgICB9IDoge1xuICAgICAgc2NoZW1hOiB2b2lkIDAsXG4gICAgICBmdWxsU2NoZW1hOiB7fSxcbiAgICAgIHRhYmxlTmFtZXNNYXA6IHt9XG4gICAgfTtcbiAgICB0aGlzLnF1ZXJ5ID0ge307XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnF1ZXJ5O1xuICAgIGlmICh0aGlzLl8uc2NoZW1hKSB7XG4gICAgICBmb3IgKGNvbnN0IFt0YWJsZU5hbWUsIGNvbHVtbnNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuXy5zY2hlbWEpKSB7XG4gICAgICAgIHF1ZXJ5W3RhYmxlTmFtZV0gPSBuZXcgUmVsYXRpb25hbFF1ZXJ5QnVpbGRlcihcbiAgICAgICAgICByZXN1bHRLaW5kLFxuICAgICAgICAgIHNjaGVtYS5mdWxsU2NoZW1hLFxuICAgICAgICAgIHRoaXMuXy5zY2hlbWEsXG4gICAgICAgICAgdGhpcy5fLnRhYmxlTmFtZXNNYXAsXG4gICAgICAgICAgc2NoZW1hLmZ1bGxTY2hlbWFbdGFibGVOYW1lXSxcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGRpYWxlY3QsXG4gICAgICAgICAgc2Vzc2lvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiRjYWNoZSA9IHsgaW52YWxpZGF0ZTogYXN5bmMgKF9wYXJhbXMpID0+IHtcbiAgICB9IH07XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQmFzZVNRTGl0ZURhdGFiYXNlXCI7XG4gIHF1ZXJ5O1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHN1YnF1ZXJ5IHRoYXQgZGVmaW5lcyBhIHRlbXBvcmFyeSBuYW1lZCByZXN1bHQgc2V0IGFzIGEgQ1RFLlxuICAgKlxuICAgKiBJdCBpcyB1c2VmdWwgZm9yIGJyZWFraW5nIGRvd24gY29tcGxleCBxdWVyaWVzIGludG8gc2ltcGxlciBwYXJ0cyBhbmQgZm9yIHJldXNpbmcgdGhlIHJlc3VsdCBzZXQgaW4gc3Vic2VxdWVudCBwYXJ0cyBvZiB0aGUgcXVlcnkuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3Mvc2VsZWN0I3dpdGgtY2xhdXNlfVxuICAgKlxuICAgKiBAcGFyYW0gYWxpYXMgVGhlIGFsaWFzIGZvciB0aGUgc3VicXVlcnkuXG4gICAqXG4gICAqIEZhaWx1cmUgdG8gcHJvdmlkZSBhbiBhbGlhcyB3aWxsIHJlc3VsdCBpbiBhIERyaXp6bGVUeXBlRXJyb3IsIHByZXZlbnRpbmcgdGhlIHN1YnF1ZXJ5IGZyb20gYmVpbmcgcmVmZXJlbmNlZCBpbiBvdGhlciBxdWVyaWVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBDcmVhdGUgYSBzdWJxdWVyeSB3aXRoIGFsaWFzICdzcScgYW5kIHVzZSBpdCBpbiB0aGUgc2VsZWN0IHF1ZXJ5XG4gICAqIGNvbnN0IHNxID0gZGIuJHdpdGgoJ3NxJykuYXMoZGIuc2VsZWN0KCkuZnJvbSh1c2Vycykud2hlcmUoZXEodXNlcnMuaWQsIDQyKSkpO1xuICAgKlxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi53aXRoKHNxKS5zZWxlY3QoKS5mcm9tKHNxKTtcbiAgICogYGBgXG4gICAqXG4gICAqIFRvIHNlbGVjdCBhcmJpdHJhcnkgU1FMIHZhbHVlcyBhcyBmaWVsZHMgaW4gYSBDVEUgYW5kIHJlZmVyZW5jZSB0aGVtIGluIG90aGVyIENURXMgb3IgaW4gdGhlIG1haW4gcXVlcnksIHlvdSBuZWVkIHRvIGFkZCBhbGlhc2VzIHRvIHRoZW06XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIFNlbGVjdCBhbiBhcmJpdHJhcnkgU1FMIHZhbHVlIGFzIGEgZmllbGQgaW4gYSBDVEUgYW5kIHJlZmVyZW5jZSBpdCBpbiB0aGUgbWFpbiBxdWVyeVxuICAgKiBjb25zdCBzcSA9IGRiLiR3aXRoKCdzcScpLmFzKGRiLnNlbGVjdCh7XG4gICAqICAgbmFtZTogc3FsPHN0cmluZz5gdXBwZXIoJHt1c2Vycy5uYW1lfSlgLmFzKCduYW1lJyksXG4gICAqIH0pXG4gICAqIC5mcm9tKHVzZXJzKSk7XG4gICAqXG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLndpdGgoc3EpLnNlbGVjdCh7IG5hbWU6IHNxLm5hbWUgfSkuZnJvbShzcSk7XG4gICAqIGBgYFxuICAgKi9cbiAgJHdpdGggPSAoYWxpYXMsIHNlbGVjdGlvbikgPT4ge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGFzID0gKHFiKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHFiID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcWIgPSBxYihuZXcgUXVlcnlCdWlsZGVyKHNlbGYuZGlhbGVjdCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQcm94eShcbiAgICAgICAgbmV3IFdpdGhTdWJxdWVyeShcbiAgICAgICAgICBxYi5nZXRTUUwoKSxcbiAgICAgICAgICBzZWxlY3Rpb24gPz8gKFwiZ2V0U2VsZWN0ZWRGaWVsZHNcIiBpbiBxYiA/IHFiLmdldFNlbGVjdGVkRmllbGRzKCkgPz8ge30gOiB7fSksXG4gICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApLFxuICAgICAgICBuZXcgU2VsZWN0aW9uUHJveHlIYW5kbGVyKHsgYWxpYXMsIHNxbEFsaWFzZWRCZWhhdmlvcjogXCJhbGlhc1wiLCBzcWxCZWhhdmlvcjogXCJlcnJvclwiIH0pXG4gICAgICApO1xuICAgIH07XG4gICAgcmV0dXJuIHsgYXMgfTtcbiAgfTtcbiAgJGNvdW50KHNvdXJjZSwgZmlsdGVycykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlQ291bnRCdWlsZGVyKHsgc291cmNlLCBmaWx0ZXJzLCBzZXNzaW9uOiB0aGlzLnNlc3Npb24gfSk7XG4gIH1cbiAgLyoqXG4gICAqIEluY29ycG9yYXRlcyBhIHByZXZpb3VzbHkgZGVmaW5lZCBDVEUgKHVzaW5nIGAkd2l0aGApIGludG8gdGhlIG1haW4gcXVlcnkuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyB0aGUgbWFpbiBxdWVyeSB0byByZWZlcmVuY2UgYSB0ZW1wb3JhcnkgbmFtZWQgcmVzdWx0IHNldC5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9zZWxlY3Qjd2l0aC1jbGF1c2V9XG4gICAqXG4gICAqIEBwYXJhbSBxdWVyaWVzIFRoZSBDVEVzIHRvIGluY29ycG9yYXRlIGludG8gdGhlIG1haW4gcXVlcnkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIERlZmluZSBhIHN1YnF1ZXJ5ICdzcScgYXMgYSBDVEUgdXNpbmcgJHdpdGhcbiAgICogY29uc3Qgc3EgPSBkYi4kd2l0aCgnc3EnKS5hcyhkYi5zZWxlY3QoKS5mcm9tKHVzZXJzKS53aGVyZShlcSh1c2Vycy5pZCwgNDIpKSk7XG4gICAqXG4gICAqIC8vIEluY29ycG9yYXRlIHRoZSBDVEUgJ3NxJyBpbnRvIHRoZSBtYWluIHF1ZXJ5IGFuZCBzZWxlY3QgZnJvbSBpdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi53aXRoKHNxKS5zZWxlY3QoKS5mcm9tKHNxKTtcbiAgICogYGBgXG4gICAqL1xuICB3aXRoKC4uLnF1ZXJpZXMpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBmdW5jdGlvbiBzZWxlY3QoZmllbGRzKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoe1xuICAgICAgICBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsXG4gICAgICAgIHNlc3Npb246IHNlbGYuc2Vzc2lvbixcbiAgICAgICAgZGlhbGVjdDogc2VsZi5kaWFsZWN0LFxuICAgICAgICB3aXRoTGlzdDogcXVlcmllc1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNlbGVjdERpc3RpbmN0KGZpZWxkcykge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVTZWxlY3RCdWlsZGVyKHtcbiAgICAgICAgZmllbGRzOiBmaWVsZHMgPz8gdm9pZCAwLFxuICAgICAgICBzZXNzaW9uOiBzZWxmLnNlc3Npb24sXG4gICAgICAgIGRpYWxlY3Q6IHNlbGYuZGlhbGVjdCxcbiAgICAgICAgd2l0aExpc3Q6IHF1ZXJpZXMsXG4gICAgICAgIGRpc3RpbmN0OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlKHRhYmxlKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVVwZGF0ZUJ1aWxkZXIodGFibGUsIHNlbGYuc2Vzc2lvbiwgc2VsZi5kaWFsZWN0LCBxdWVyaWVzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW5zZXJ0KGludG8pIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlSW5zZXJ0QnVpbGRlcihpbnRvLCBzZWxmLnNlc3Npb24sIHNlbGYuZGlhbGVjdCwgcXVlcmllcyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlbGV0ZV8oZnJvbSkge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVEZWxldGVCYXNlKGZyb20sIHNlbGYuc2Vzc2lvbiwgc2VsZi5kaWFsZWN0LCBxdWVyaWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc2VsZWN0LCBzZWxlY3REaXN0aW5jdCwgdXBkYXRlLCBpbnNlcnQsIGRlbGV0ZTogZGVsZXRlXyB9O1xuICB9XG4gIHNlbGVjdChmaWVsZHMpIHtcbiAgICByZXR1cm4gbmV3IFNRTGl0ZVNlbGVjdEJ1aWxkZXIoeyBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsIHNlc3Npb246IHRoaXMuc2Vzc2lvbiwgZGlhbGVjdDogdGhpcy5kaWFsZWN0IH0pO1xuICB9XG4gIHNlbGVjdERpc3RpbmN0KGZpZWxkcykge1xuICAgIHJldHVybiBuZXcgU1FMaXRlU2VsZWN0QnVpbGRlcih7XG4gICAgICBmaWVsZHM6IGZpZWxkcyA/PyB2b2lkIDAsXG4gICAgICBzZXNzaW9uOiB0aGlzLnNlc3Npb24sXG4gICAgICBkaWFsZWN0OiB0aGlzLmRpYWxlY3QsXG4gICAgICBkaXN0aW5jdDogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIHVwZGF0ZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRob3V0IGAud2hlcmUoKWAgY2xhdXNlIHdpbGwgdXBkYXRlIGFsbCByb3dzIGluIGEgdGFibGUuIFRoZSBgLndoZXJlKClgIGNsYXVzZSBzcGVjaWZpZXMgd2hpY2ggcm93cyBzaG91bGQgYmUgdXBkYXRlZC5cbiAgICpcbiAgICogVXNlIGAuc2V0KClgIG1ldGhvZCB0byBzcGVjaWZ5IHdoaWNoIHZhbHVlcyB0byB1cGRhdGUuXG4gICAqXG4gICAqIFNlZSBkb2NzOiB7QGxpbmsgaHR0cHM6Ly9vcm0uZHJpenpsZS50ZWFtL2RvY3MvdXBkYXRlfVxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgVGhlIHRhYmxlIHRvIHVwZGF0ZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gVXBkYXRlIGFsbCByb3dzIGluIHRoZSAnY2FycycgdGFibGVcbiAgICogYXdhaXQgZGIudXBkYXRlKGNhcnMpLnNldCh7IGNvbG9yOiAncmVkJyB9KTtcbiAgICpcbiAgICogLy8gVXBkYXRlIHJvd3Mgd2l0aCBmaWx0ZXJzIGFuZCBjb25kaXRpb25zXG4gICAqIGF3YWl0IGRiLnVwZGF0ZShjYXJzKS5zZXQoeyBjb2xvcjogJ3JlZCcgfSkud2hlcmUoZXEoY2Fycy5icmFuZCwgJ0JNVycpKTtcbiAgICpcbiAgICogLy8gVXBkYXRlIHdpdGggcmV0dXJuaW5nIGNsYXVzZVxuICAgKiBjb25zdCB1cGRhdGVkQ2FyOiBDYXJbXSA9IGF3YWl0IGRiLnVwZGF0ZShjYXJzKVxuICAgKiAgIC5zZXQoeyBjb2xvcjogJ3JlZCcgfSlcbiAgICogICAud2hlcmUoZXEoY2Fycy5pZCwgMSkpXG4gICAqICAgLnJldHVybmluZygpO1xuICAgKiBgYGBcbiAgICovXG4gIHVwZGF0ZSh0YWJsZSkge1xuICAgIHJldHVybiBuZXcgU1FMaXRlVXBkYXRlQnVpbGRlcih0YWJsZSwgdGhpcy5zZXNzaW9uLCB0aGlzLmRpYWxlY3QpO1xuICB9XG4gICRjYWNoZTtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zZXJ0IHF1ZXJ5LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgY3JlYXRlIG5ldyByb3dzIGluIGEgdGFibGUuIFVzZSBgLnZhbHVlcygpYCBtZXRob2QgdG8gc3BlY2lmeSB3aGljaCB2YWx1ZXMgdG8gaW5zZXJ0LlxuICAgKlxuICAgKiBTZWUgZG9jczoge0BsaW5rIGh0dHBzOi8vb3JtLmRyaXp6bGUudGVhbS9kb2NzL2luc2VydH1cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB0byBpbnNlcnQgaW50by5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gSW5zZXJ0IG9uZSByb3dcbiAgICogYXdhaXQgZGIuaW5zZXJ0KGNhcnMpLnZhbHVlcyh7IGJyYW5kOiAnQk1XJyB9KTtcbiAgICpcbiAgICogLy8gSW5zZXJ0IG11bHRpcGxlIHJvd3NcbiAgICogYXdhaXQgZGIuaW5zZXJ0KGNhcnMpLnZhbHVlcyhbeyBicmFuZDogJ0JNVycgfSwgeyBicmFuZDogJ1BvcnNjaGUnIH1dKTtcbiAgICpcbiAgICogLy8gSW5zZXJ0IHdpdGggcmV0dXJuaW5nIGNsYXVzZVxuICAgKiBjb25zdCBpbnNlcnRlZENhcjogQ2FyW10gPSBhd2FpdCBkYi5pbnNlcnQoY2FycylcbiAgICogICAudmFsdWVzKHsgYnJhbmQ6ICdCTVcnIH0pXG4gICAqICAgLnJldHVybmluZygpO1xuICAgKiBgYGBcbiAgICovXG4gIGluc2VydChpbnRvKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVJbnNlcnRCdWlsZGVyKGludG8sIHRoaXMuc2Vzc2lvbiwgdGhpcy5kaWFsZWN0KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhIGRlbGV0ZSBxdWVyeS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRob3V0IGAud2hlcmUoKWAgY2xhdXNlIHdpbGwgZGVsZXRlIGFsbCByb3dzIGluIGEgdGFibGUuIFRoZSBgLndoZXJlKClgIGNsYXVzZSBzcGVjaWZpZXMgd2hpY2ggcm93cyBzaG91bGQgYmUgZGVsZXRlZC5cbiAgICpcbiAgICogU2VlIGRvY3M6IHtAbGluayBodHRwczovL29ybS5kcml6emxlLnRlYW0vZG9jcy9kZWxldGV9XG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgdG8gZGVsZXRlIGZyb20uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIERlbGV0ZSBhbGwgcm93cyBpbiB0aGUgJ2NhcnMnIHRhYmxlXG4gICAqIGF3YWl0IGRiLmRlbGV0ZShjYXJzKTtcbiAgICpcbiAgICogLy8gRGVsZXRlIHJvd3Mgd2l0aCBmaWx0ZXJzIGFuZCBjb25kaXRpb25zXG4gICAqIGF3YWl0IGRiLmRlbGV0ZShjYXJzKS53aGVyZShlcShjYXJzLmNvbG9yLCAnZ3JlZW4nKSk7XG4gICAqXG4gICAqIC8vIERlbGV0ZSB3aXRoIHJldHVybmluZyBjbGF1c2VcbiAgICogY29uc3QgZGVsZXRlZENhcjogQ2FyW10gPSBhd2FpdCBkYi5kZWxldGUoY2FycylcbiAgICogICAud2hlcmUoZXEoY2Fycy5pZCwgMSkpXG4gICAqICAgLnJldHVybmluZygpO1xuICAgKiBgYGBcbiAgICovXG4gIGRlbGV0ZShmcm9tKSB7XG4gICAgcmV0dXJuIG5ldyBTUUxpdGVEZWxldGVCYXNlKGZyb20sIHRoaXMuc2Vzc2lvbiwgdGhpcy5kaWFsZWN0KTtcbiAgfVxuICBydW4ocXVlcnkpIHtcbiAgICBjb25zdCBzZXF1ZWwgPSB0eXBlb2YgcXVlcnkgPT09IFwic3RyaW5nXCIgPyBzcWwucmF3KHF1ZXJ5KSA6IHF1ZXJ5LmdldFNRTCgpO1xuICAgIGlmICh0aGlzLnJlc3VsdEtpbmQgPT09IFwiYXN5bmNcIikge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVSYXcoXG4gICAgICAgIGFzeW5jICgpID0+IHRoaXMuc2Vzc2lvbi5ydW4oc2VxdWVsKSxcbiAgICAgICAgKCkgPT4gc2VxdWVsLFxuICAgICAgICBcInJ1blwiLFxuICAgICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICAgIHRoaXMuc2Vzc2lvbi5leHRyYWN0UmF3UnVuVmFsdWVGcm9tQmF0Y2hSZXN1bHQuYmluZCh0aGlzLnNlc3Npb24pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnJ1bihzZXF1ZWwpO1xuICB9XG4gIGFsbChxdWVyeSkge1xuICAgIGNvbnN0IHNlcXVlbCA9IHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiA/IHNxbC5yYXcocXVlcnkpIDogcXVlcnkuZ2V0U1FMKCk7XG4gICAgaWYgKHRoaXMucmVzdWx0S2luZCA9PT0gXCJhc3luY1wiKSB7XG4gICAgICByZXR1cm4gbmV3IFNRTGl0ZVJhdyhcbiAgICAgICAgYXN5bmMgKCkgPT4gdGhpcy5zZXNzaW9uLmFsbChzZXF1ZWwpLFxuICAgICAgICAoKSA9PiBzZXF1ZWwsXG4gICAgICAgIFwiYWxsXCIsXG4gICAgICAgIHRoaXMuZGlhbGVjdCxcbiAgICAgICAgdGhpcy5zZXNzaW9uLmV4dHJhY3RSYXdBbGxWYWx1ZUZyb21CYXRjaFJlc3VsdC5iaW5kKHRoaXMuc2Vzc2lvbilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlc3Npb24uYWxsKHNlcXVlbCk7XG4gIH1cbiAgZ2V0KHF1ZXJ5KSB7XG4gICAgY29uc3Qgc2VxdWVsID0gdHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiID8gc3FsLnJhdyhxdWVyeSkgOiBxdWVyeS5nZXRTUUwoKTtcbiAgICBpZiAodGhpcy5yZXN1bHRLaW5kID09PSBcImFzeW5jXCIpIHtcbiAgICAgIHJldHVybiBuZXcgU1FMaXRlUmF3KFxuICAgICAgICBhc3luYyAoKSA9PiB0aGlzLnNlc3Npb24uZ2V0KHNlcXVlbCksXG4gICAgICAgICgpID0+IHNlcXVlbCxcbiAgICAgICAgXCJnZXRcIixcbiAgICAgICAgdGhpcy5kaWFsZWN0LFxuICAgICAgICB0aGlzLnNlc3Npb24uZXh0cmFjdFJhd0dldFZhbHVlRnJvbUJhdGNoUmVzdWx0LmJpbmQodGhpcy5zZXNzaW9uKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXQoc2VxdWVsKTtcbiAgfVxuICB2YWx1ZXMocXVlcnkpIHtcbiAgICBjb25zdCBzZXF1ZWwgPSB0eXBlb2YgcXVlcnkgPT09IFwic3RyaW5nXCIgPyBzcWwucmF3KHF1ZXJ5KSA6IHF1ZXJ5LmdldFNRTCgpO1xuICAgIGlmICh0aGlzLnJlc3VsdEtpbmQgPT09IFwiYXN5bmNcIikge1xuICAgICAgcmV0dXJuIG5ldyBTUUxpdGVSYXcoXG4gICAgICAgIGFzeW5jICgpID0+IHRoaXMuc2Vzc2lvbi52YWx1ZXMoc2VxdWVsKSxcbiAgICAgICAgKCkgPT4gc2VxdWVsLFxuICAgICAgICBcInZhbHVlc1wiLFxuICAgICAgICB0aGlzLmRpYWxlY3QsXG4gICAgICAgIHRoaXMuc2Vzc2lvbi5leHRyYWN0UmF3VmFsdWVzVmFsdWVGcm9tQmF0Y2hSZXN1bHQuYmluZCh0aGlzLnNlc3Npb24pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnZhbHVlcyhzZXF1ZWwpO1xuICB9XG4gIHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uLCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uLCBjb25maWcpO1xuICB9XG59XG5jb25zdCB3aXRoUmVwbGljYXMgPSAocHJpbWFyeSwgcmVwbGljYXMsIGdldFJlcGxpY2EgPSAoKSA9PiByZXBsaWNhc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiByZXBsaWNhcy5sZW5ndGgpXSkgPT4ge1xuICBjb25zdCBzZWxlY3QgPSAoLi4uYXJncykgPT4gZ2V0UmVwbGljYShyZXBsaWNhcykuc2VsZWN0KC4uLmFyZ3MpO1xuICBjb25zdCBzZWxlY3REaXN0aW5jdCA9ICguLi5hcmdzKSA9PiBnZXRSZXBsaWNhKHJlcGxpY2FzKS5zZWxlY3REaXN0aW5jdCguLi5hcmdzKTtcbiAgY29uc3QgJGNvdW50ID0gKC4uLmFyZ3MpID0+IGdldFJlcGxpY2EocmVwbGljYXMpLiRjb3VudCguLi5hcmdzKTtcbiAgY29uc3QgJHdpdGggPSAoLi4uYXJncykgPT4gZ2V0UmVwbGljYShyZXBsaWNhcykud2l0aCguLi5hcmdzKTtcbiAgY29uc3QgdXBkYXRlID0gKC4uLmFyZ3MpID0+IHByaW1hcnkudXBkYXRlKC4uLmFyZ3MpO1xuICBjb25zdCBpbnNlcnQgPSAoLi4uYXJncykgPT4gcHJpbWFyeS5pbnNlcnQoLi4uYXJncyk7XG4gIGNvbnN0ICRkZWxldGUgPSAoLi4uYXJncykgPT4gcHJpbWFyeS5kZWxldGUoLi4uYXJncyk7XG4gIGNvbnN0IHJ1biA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LnJ1biguLi5hcmdzKTtcbiAgY29uc3QgYWxsID0gKC4uLmFyZ3MpID0+IHByaW1hcnkuYWxsKC4uLmFyZ3MpO1xuICBjb25zdCBnZXQgPSAoLi4uYXJncykgPT4gcHJpbWFyeS5nZXQoLi4uYXJncyk7XG4gIGNvbnN0IHZhbHVlcyA9ICguLi5hcmdzKSA9PiBwcmltYXJ5LnZhbHVlcyguLi5hcmdzKTtcbiAgY29uc3QgdHJhbnNhY3Rpb24gPSAoLi4uYXJncykgPT4gcHJpbWFyeS50cmFuc2FjdGlvbiguLi5hcmdzKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5wcmltYXJ5LFxuICAgIHVwZGF0ZSxcbiAgICBpbnNlcnQsXG4gICAgZGVsZXRlOiAkZGVsZXRlLFxuICAgIHJ1bixcbiAgICBhbGwsXG4gICAgZ2V0LFxuICAgIHZhbHVlcyxcbiAgICB0cmFuc2FjdGlvbixcbiAgICAkcHJpbWFyeTogcHJpbWFyeSxcbiAgICBzZWxlY3QsXG4gICAgc2VsZWN0RGlzdGluY3QsXG4gICAgJGNvdW50LFxuICAgIHdpdGg6ICR3aXRoLFxuICAgIGdldCBxdWVyeSgpIHtcbiAgICAgIHJldHVybiBnZXRSZXBsaWNhKHJlcGxpY2FzKS5xdWVyeTtcbiAgICB9XG4gIH07XG59O1xuZXhwb3J0IHtcbiAgQmFzZVNRTGl0ZURhdGFiYXNlLFxuICB3aXRoUmVwbGljYXNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYi5qcy5tYXAiLAogICAgImltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5LmpzXCI7XG5jbGFzcyBDYWNoZSB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIkNhY2hlXCI7XG59XG5jbGFzcyBOb29wQ2FjaGUgZXh0ZW5kcyBDYWNoZSB7XG4gIHN0cmF0ZWd5KCkge1xuICAgIHJldHVybiBcImFsbFwiO1xuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIk5vb3BDYWNoZVwiO1xuICBhc3luYyBnZXQoX2tleSkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgYXN5bmMgcHV0KF9oYXNoZWRRdWVyeSwgX3Jlc3BvbnNlLCBfdGFibGVzLCBfY29uZmlnKSB7XG4gIH1cbiAgYXN5bmMgb25NdXRhdGUoX3BhcmFtcykge1xuICB9XG59XG5hc3luYyBmdW5jdGlvbiBoYXNoUXVlcnkoc3FsLCBwYXJhbXMpIHtcbiAgY29uc3QgZGF0YVRvSGFzaCA9IGAke3NxbH0tJHtKU09OLnN0cmluZ2lmeShwYXJhbXMpfWA7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgY29uc3QgZGF0YSA9IGVuY29kZXIuZW5jb2RlKGRhdGFUb0hhc2gpO1xuICBjb25zdCBoYXNoQnVmZmVyID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoXCJTSEEtMjU2XCIsIGRhdGEpO1xuICBjb25zdCBoYXNoQXJyYXkgPSBbLi4ubmV3IFVpbnQ4QXJyYXkoaGFzaEJ1ZmZlcildO1xuICBjb25zdCBoYXNoSGV4ID0gaGFzaEFycmF5Lm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKS5qb2luKFwiXCIpO1xuICByZXR1cm4gaGFzaEhleDtcbn1cbmV4cG9ydCB7XG4gIENhY2hlLFxuICBOb29wQ2FjaGUsXG4gIGhhc2hRdWVyeVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNhY2hlLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgaGFzaFF1ZXJ5LCBOb29wQ2FjaGUgfSBmcm9tIFwiLi4vY2FjaGUvY29yZS9jYWNoZS5qc1wiO1xuaW1wb3J0IHsgZW50aXR5S2luZCwgaXMgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBEcml6emxlRXJyb3IsIERyaXp6bGVRdWVyeUVycm9yLCBUcmFuc2FjdGlvblJvbGxiYWNrRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgeyBRdWVyeVByb21pc2UgfSBmcm9tIFwiLi4vcXVlcnktcHJvbWlzZS5qc1wiO1xuaW1wb3J0IHsgQmFzZVNRTGl0ZURhdGFiYXNlIH0gZnJvbSBcIi4vZGIuanNcIjtcbmNsYXNzIEV4ZWN1dGVSZXN1bHRTeW5jIGV4dGVuZHMgUXVlcnlQcm9taXNlIHtcbiAgY29uc3RydWN0b3IocmVzdWx0Q2IpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVzdWx0Q2IgPSByZXN1bHRDYjtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJFeGVjdXRlUmVzdWx0U3luY1wiO1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIHJldHVybiB0aGlzLnJlc3VsdENiKCk7XG4gIH1cbiAgc3luYygpIHtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHRDYigpO1xuICB9XG59XG5jbGFzcyBTUUxpdGVQcmVwYXJlZFF1ZXJ5IHtcbiAgY29uc3RydWN0b3IobW9kZSwgZXhlY3V0ZU1ldGhvZCwgcXVlcnksIGNhY2hlLCBxdWVyeU1ldGFkYXRhLCBjYWNoZUNvbmZpZykge1xuICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgdGhpcy5leGVjdXRlTWV0aG9kID0gZXhlY3V0ZU1ldGhvZDtcbiAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7XG4gICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xuICAgIHRoaXMucXVlcnlNZXRhZGF0YSA9IHF1ZXJ5TWV0YWRhdGE7XG4gICAgdGhpcy5jYWNoZUNvbmZpZyA9IGNhY2hlQ29uZmlnO1xuICAgIGlmIChjYWNoZSAmJiBjYWNoZS5zdHJhdGVneSgpID09PSBcImFsbFwiICYmIGNhY2hlQ29uZmlnID09PSB2b2lkIDApIHtcbiAgICAgIHRoaXMuY2FjaGVDb25maWcgPSB7IGVuYWJsZTogdHJ1ZSwgYXV0b0ludmFsaWRhdGU6IHRydWUgfTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNhY2hlQ29uZmlnPy5lbmFibGUpIHtcbiAgICAgIHRoaXMuY2FjaGVDb25maWcgPSB2b2lkIDA7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIlByZXBhcmVkUXVlcnlcIjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBqb2luc05vdE51bGxhYmxlTWFwO1xuICAvKiogQGludGVybmFsICovXG4gIGFzeW5jIHF1ZXJ5V2l0aENhY2hlKHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIHF1ZXJ5KSB7XG4gICAgaWYgKHRoaXMuY2FjaGUgPT09IHZvaWQgMCB8fCBpcyh0aGlzLmNhY2hlLCBOb29wQ2FjaGUpIHx8IHRoaXMucXVlcnlNZXRhZGF0YSA9PT0gdm9pZCAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcXVlcnkoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IERyaXp6bGVRdWVyeUVycm9yKHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jYWNoZUNvbmZpZyAmJiAhdGhpcy5jYWNoZUNvbmZpZy5lbmFibGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBxdWVyeSgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRHJpenpsZVF1ZXJ5RXJyb3IocXVlcnlTdHJpbmcsIHBhcmFtcywgZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgodGhpcy5xdWVyeU1ldGFkYXRhLnR5cGUgPT09IFwiaW5zZXJ0XCIgfHwgdGhpcy5xdWVyeU1ldGFkYXRhLnR5cGUgPT09IFwidXBkYXRlXCIgfHwgdGhpcy5xdWVyeU1ldGFkYXRhLnR5cGUgPT09IFwiZGVsZXRlXCIpICYmIHRoaXMucXVlcnlNZXRhZGF0YS50YWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgW3Jlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgcXVlcnkoKSxcbiAgICAgICAgICB0aGlzLmNhY2hlLm9uTXV0YXRlKHsgdGFibGVzOiB0aGlzLnF1ZXJ5TWV0YWRhdGEudGFibGVzIH0pXG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRHJpenpsZVF1ZXJ5RXJyb3IocXVlcnlTdHJpbmcsIHBhcmFtcywgZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5jYWNoZUNvbmZpZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBEcml6emxlUXVlcnlFcnJvcihxdWVyeVN0cmluZywgcGFyYW1zLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMucXVlcnlNZXRhZGF0YS50eXBlID09PSBcInNlbGVjdFwiKSB7XG4gICAgICBjb25zdCBmcm9tQ2FjaGUgPSBhd2FpdCB0aGlzLmNhY2hlLmdldChcbiAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy50YWcgPz8gKGF3YWl0IGhhc2hRdWVyeShxdWVyeVN0cmluZywgcGFyYW1zKSksXG4gICAgICAgIHRoaXMucXVlcnlNZXRhZGF0YS50YWJsZXMsXG4gICAgICAgIHRoaXMuY2FjaGVDb25maWcudGFnICE9PSB2b2lkIDAsXG4gICAgICAgIHRoaXMuY2FjaGVDb25maWcuYXV0b0ludmFsaWRhdGVcbiAgICAgICk7XG4gICAgICBpZiAoZnJvbUNhY2hlID09PSB2b2lkIDApIHtcbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCBxdWVyeSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IERyaXp6bGVRdWVyeUVycm9yKHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIGUpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuY2FjaGUucHV0KFxuICAgICAgICAgIHRoaXMuY2FjaGVDb25maWcudGFnID8/IChhd2FpdCBoYXNoUXVlcnkocXVlcnlTdHJpbmcsIHBhcmFtcykpLFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAvLyBtYWtlIHN1cmUgd2Ugc2VuZCB0YWJsZXMgdGhhdCB3ZXJlIHVzZWQgaW4gYSBxdWVyeSBvbmx5IGlmIHVzZXIgd2FudHMgdG8gaW52YWxpZGF0ZSBpdCBvbiBlYWNoIHdyaXRlXG4gICAgICAgICAgdGhpcy5jYWNoZUNvbmZpZy5hdXRvSW52YWxpZGF0ZSA/IHRoaXMucXVlcnlNZXRhZGF0YS50YWJsZXMgOiBbXSxcbiAgICAgICAgICB0aGlzLmNhY2hlQ29uZmlnLnRhZyAhPT0gdm9pZCAwLFxuICAgICAgICAgIHRoaXMuY2FjaGVDb25maWcuY29uZmlnXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUNhY2hlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5KCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IERyaXp6bGVRdWVyeUVycm9yKHF1ZXJ5U3RyaW5nLCBwYXJhbXMsIGUpO1xuICAgIH1cbiAgfVxuICBnZXRRdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeTtcbiAgfVxuICBtYXBSdW5SZXN1bHQocmVzdWx0LCBfaXNGcm9tQmF0Y2gpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIG1hcEFsbFJlc3VsdChfcmVzdWx0LCBfaXNGcm9tQmF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgbWFwR2V0UmVzdWx0KF9yZXN1bHQsIF9pc0Zyb21CYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICBleGVjdXRlKHBsYWNlaG9sZGVyVmFsdWVzKSB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gXCJhc3luY1wiKSB7XG4gICAgICByZXR1cm4gdGhpc1t0aGlzLmV4ZWN1dGVNZXRob2RdKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBFeGVjdXRlUmVzdWx0U3luYygoKSA9PiB0aGlzW3RoaXMuZXhlY3V0ZU1ldGhvZF0ocGxhY2Vob2xkZXJWYWx1ZXMpKTtcbiAgfVxuICBtYXBSZXN1bHQocmVzcG9uc2UsIGlzRnJvbUJhdGNoKSB7XG4gICAgc3dpdGNoICh0aGlzLmV4ZWN1dGVNZXRob2QpIHtcbiAgICAgIGNhc2UgXCJydW5cIjoge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXBSdW5SZXN1bHQocmVzcG9uc2UsIGlzRnJvbUJhdGNoKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJhbGxcIjoge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXBBbGxSZXN1bHQocmVzcG9uc2UsIGlzRnJvbUJhdGNoKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJnZXRcIjoge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXBHZXRSZXN1bHQocmVzcG9uc2UsIGlzRnJvbUJhdGNoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVNlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihkaWFsZWN0KSB7XG4gICAgdGhpcy5kaWFsZWN0ID0gZGlhbGVjdDtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVTZXNzaW9uXCI7XG4gIHByZXBhcmVPbmVUaW1lUXVlcnkocXVlcnksIGZpZWxkcywgZXhlY3V0ZU1ldGhvZCwgaXNSZXNwb25zZUluQXJyYXlNb2RlLCBjdXN0b21SZXN1bHRNYXBwZXIsIHF1ZXJ5TWV0YWRhdGEsIGNhY2hlQ29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZVF1ZXJ5KFxuICAgICAgcXVlcnksXG4gICAgICBmaWVsZHMsXG4gICAgICBleGVjdXRlTWV0aG9kLFxuICAgICAgaXNSZXNwb25zZUluQXJyYXlNb2RlLFxuICAgICAgY3VzdG9tUmVzdWx0TWFwcGVyLFxuICAgICAgcXVlcnlNZXRhZGF0YSxcbiAgICAgIGNhY2hlQ29uZmlnXG4gICAgKTtcbiAgfVxuICBydW4ocXVlcnkpIHtcbiAgICBjb25zdCBzdGF0aWNRdWVyeSA9IHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHF1ZXJ5KTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZU9uZVRpbWVRdWVyeShzdGF0aWNRdWVyeSwgdm9pZCAwLCBcInJ1blwiLCBmYWxzZSkucnVuKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRHJpenpsZUVycm9yKHsgY2F1c2U6IGVyciwgbWVzc2FnZTogYEZhaWxlZCB0byBydW4gdGhlIHF1ZXJ5ICcke3N0YXRpY1F1ZXJ5LnNxbH0nYCB9KTtcbiAgICB9XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBleHRyYWN0UmF3UnVuVmFsdWVGcm9tQmF0Y2hSZXN1bHQocmVzdWx0KSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBhbGwocXVlcnkpIHtcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlT25lVGltZVF1ZXJ5KHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHF1ZXJ5KSwgdm9pZCAwLCBcInJ1blwiLCBmYWxzZSkuYWxsKCk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBleHRyYWN0UmF3QWxsVmFsdWVGcm9tQmF0Y2hSZXN1bHQoX3Jlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICBnZXQocXVlcnkpIHtcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlT25lVGltZVF1ZXJ5KHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHF1ZXJ5KSwgdm9pZCAwLCBcInJ1blwiLCBmYWxzZSkuZ2V0KCk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBleHRyYWN0UmF3R2V0VmFsdWVGcm9tQmF0Y2hSZXN1bHQoX3Jlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICB2YWx1ZXMocXVlcnkpIHtcbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlT25lVGltZVF1ZXJ5KHRoaXMuZGlhbGVjdC5zcWxUb1F1ZXJ5KHF1ZXJ5KSwgdm9pZCAwLCBcInJ1blwiLCBmYWxzZSkudmFsdWVzKCk7XG4gIH1cbiAgYXN5bmMgY291bnQoc3FsKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy52YWx1ZXMoc3FsKTtcbiAgICByZXR1cm4gcmVzdWx0WzBdWzBdO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZXh0cmFjdFJhd1ZhbHVlc1ZhbHVlRnJvbUJhdGNoUmVzdWx0KF9yZXN1bHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbn1cbmNsYXNzIFNRTGl0ZVRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVNRTGl0ZURhdGFiYXNlIHtcbiAgY29uc3RydWN0b3IocmVzdWx0VHlwZSwgZGlhbGVjdCwgc2Vzc2lvbiwgc2NoZW1hLCBuZXN0ZWRJbmRleCA9IDApIHtcbiAgICBzdXBlcihyZXN1bHRUeXBlLCBkaWFsZWN0LCBzZXNzaW9uLCBzY2hlbWEpO1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMubmVzdGVkSW5kZXggPSBuZXN0ZWRJbmRleDtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVUcmFuc2FjdGlvblwiO1xuICByb2xsYmFjaygpIHtcbiAgICB0aHJvdyBuZXcgVHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yKCk7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIEV4ZWN1dGVSZXN1bHRTeW5jLFxuICBTUUxpdGVQcmVwYXJlZFF1ZXJ5LFxuICBTUUxpdGVTZXNzaW9uLFxuICBTUUxpdGVUcmFuc2FjdGlvblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlc3Npb24uanMubWFwIiwKICAgICJpbXBvcnQgeyBlbnRpdHlLaW5kIH0gZnJvbSBcIi4vZW50aXR5LmpzXCI7XG5jbGFzcyBDb25zb2xlTG9nV3JpdGVyIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiQ29uc29sZUxvZ1dyaXRlclwiO1xuICB3cml0ZShtZXNzYWdlKSB7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG4gIH1cbn1cbmNsYXNzIERlZmF1bHRMb2dnZXIge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJEZWZhdWx0TG9nZ2VyXCI7XG4gIHdyaXRlcjtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy53cml0ZXIgPSBjb25maWc/LndyaXRlciA/PyBuZXcgQ29uc29sZUxvZ1dyaXRlcigpO1xuICB9XG4gIGxvZ1F1ZXJ5KHF1ZXJ5LCBwYXJhbXMpIHtcbiAgICBjb25zdCBzdHJpbmdpZmllZFBhcmFtcyA9IHBhcmFtcy5tYXAoKHApID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHBhcmFtc1N0ciA9IHN0cmluZ2lmaWVkUGFyYW1zLmxlbmd0aCA/IGAgLS0gcGFyYW1zOiBbJHtzdHJpbmdpZmllZFBhcmFtcy5qb2luKFwiLCBcIil9XWAgOiBcIlwiO1xuICAgIHRoaXMud3JpdGVyLndyaXRlKGBRdWVyeTogJHtxdWVyeX0ke3BhcmFtc1N0cn1gKTtcbiAgfVxufVxuY2xhc3MgTm9vcExvZ2dlciB7XG4gIHN0YXRpYyBbZW50aXR5S2luZF0gPSBcIk5vb3BMb2dnZXJcIjtcbiAgbG9nUXVlcnkoKSB7XG4gIH1cbn1cbmV4cG9ydCB7XG4gIENvbnNvbGVMb2dXcml0ZXIsXG4gIERlZmF1bHRMb2dnZXIsXG4gIE5vb3BMb2dnZXJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dnZXIuanMubWFwIiwKICAgICJpbXBvcnQgeyBfX2V4cG9ydCB9IGZyb20gXCIuLi9fdmlydHVhbC9yb2xsZG93bl9ydW50aW1lLmpzXCI7XG5pbXBvcnQgeyBpbmRleCwgaW50ZWdlciwgcmVhbCwgc3FsaXRlVGFibGUsIHRleHQgfSBmcm9tIFwiZHJpenpsZS1vcm0vc3FsaXRlLWNvcmVcIjtcbmltcG9ydCB7IHJlbGF0aW9ucyB9IGZyb20gXCJkcml6emxlLW9ybVwiO1xuXG4vLyNyZWdpb24gc3JjL2RiL3NjaGVtYS50c1xudmFyIHNjaGVtYV9leHBvcnRzID0ge307XG5fX2V4cG9ydChzY2hlbWFfZXhwb3J0cywge1xuXHRjaGFyYWN0ZXJzOiAoKSA9PiBjaGFyYWN0ZXJzLFxuXHRjaGFyYWN0ZXJzUmVsYXRpb25zOiAoKSA9PiBjaGFyYWN0ZXJzUmVsYXRpb25zLFxuXHRtaW5pbmdGbGVldFBhcnRpY2lwYW50czogKCkgPT4gbWluaW5nRmxlZXRQYXJ0aWNpcGFudHMsXG5cdG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzUmVsYXRpb25zOiAoKSA9PiBtaW5pbmdGbGVldFBhcnRpY2lwYW50c1JlbGF0aW9ucyxcblx0bWluaW5nRmxlZXRzOiAoKSA9PiBtaW5pbmdGbGVldHMsXG5cdG1pbmluZ0ZsZWV0c1JlbGF0aW9uczogKCkgPT4gbWluaW5nRmxlZXRzUmVsYXRpb25zLFxuXHRyZXN1bWVDb21tYW5kczogKCkgPT4gcmVzdW1lQ29tbWFuZHMsXG5cdHNoYXJlZDogKCkgPT4gc2hhcmVkLFxuXHR1c2VyczogKCkgPT4gdXNlcnMsXG5cdHVzZXJzUmVsYXRpb25zOiAoKSA9PiB1c2Vyc1JlbGF0aW9uc1xufSk7XG5jb25zdCBzaGFyZWQgPSB7XG5cdGNyZWF0ZWRBdDogaW50ZWdlcihcImNyZWF0ZWRfYXRcIikubm90TnVsbCgpLFxuXHR1cGRhdGVkQXQ6IGludGVnZXIoXCJ1cGRhdGVkX2F0XCIpXG59O1xuY29uc3QgdXNlcnMgPSBzcWxpdGVUYWJsZShcInVzZXJzXCIsIHtcblx0aWQ6IGludGVnZXIoKS5wcmltYXJ5S2V5KCkudW5pcXVlKCkubm90TnVsbCgpLFxuXHRkaXNjb3JkSUQ6IHRleHQoXCJkaXNjb3JkX2lkXCIpLnVuaXF1ZSgpLm5vdE51bGwoKSxcblx0bWFpbkNoYXJhY3RlcjogaW50ZWdlcihcIm1haW5fY2hhcmFjdGVyXCIpLFxuXHQuLi5zaGFyZWRcbn0sICh0YWJsZSkgPT4gW2luZGV4KFwiaWR4X2Rpc2NvcmRfaWRcIikub24odGFibGUuZGlzY29yZElEKSwgaW5kZXgoXCJpZHhfbWFpbl9jaGFyYWN0ZXJcIikub24odGFibGUubWFpbkNoYXJhY3RlcildKTtcbmNvbnN0IHVzZXJzUmVsYXRpb25zID0gcmVsYXRpb25zKHVzZXJzLCAoeyBvbmUsIG1hbnkgfSkgPT4gKHtcblx0Y2hhcmFjdGVyczogbWFueShjaGFyYWN0ZXJzKSxcblx0bWFpbjogb25lKGNoYXJhY3RlcnMsIHtcblx0XHRmaWVsZHM6IFt1c2Vycy5tYWluQ2hhcmFjdGVyXSxcblx0XHRyZWZlcmVuY2VzOiBbY2hhcmFjdGVycy5pZF1cblx0fSlcbn0pKTtcbmNvbnN0IGNoYXJhY3RlcnMgPSBzcWxpdGVUYWJsZShcImNoYXJhY3RlcnNcIiwge1xuXHRpZDogaW50ZWdlcihcImlkXCIpLnByaW1hcnlLZXkoeyBhdXRvSW5jcmVtZW50OiB0cnVlIH0pLFxuXHRldmVJRDogaW50ZWdlcihcImV2ZV9pZFwiKS5ub3ROdWxsKCksXG5cdHVzZXJJRDogaW50ZWdlcihcInVzZXJfaWRcIikubm90TnVsbCgpLFxuXHRuYW1lOiB0ZXh0KCkubm90TnVsbCgpLFxuXHRhY2Nlc3NUb2tlbjogdGV4dChcImFjY2Vzc190b2tlblwiKS5ub3ROdWxsKCksXG5cdGV4cGlyZXNBdDogaW50ZWdlcihcImV4cGlyZXNfYXRcIikubm90TnVsbCgpLFxuXHRyZWZyZXNoVG9rZW46IHRleHQoXCJyZWZyZXNoX3Rva2VuXCIpLm5vdE51bGwoKSxcblx0Li4uc2hhcmVkXG59LCAodGFibGUpID0+IFtpbmRleChcImlkeF91c2VyX2lkXCIpLm9uKHRhYmxlLnVzZXJJRCksIGluZGV4KFwiaWR4X2V2ZV9pZFwiKS5vbih0YWJsZS5ldmVJRCldKTtcbmNvbnN0IGNoYXJhY3RlcnNSZWxhdGlvbnMgPSByZWxhdGlvbnMoY2hhcmFjdGVycywgKHsgb25lIH0pID0+ICh7IHVzZXI6IG9uZSh1c2Vycywge1xuXHRmaWVsZHM6IFtjaGFyYWN0ZXJzLnVzZXJJRF0sXG5cdHJlZmVyZW5jZXM6IFt1c2Vycy5pZF1cbn0pIH0pKTtcbmNvbnN0IHJlc3VtZUNvbW1hbmRzID0gc3FsaXRlVGFibGUoXCJyZXN1bWVjb21tYW5kc1wiLCB7XG5cdGlkOiB0ZXh0KCkucHJpbWFyeUtleSgpLFxuXHRjb21tYW5kOiB0ZXh0KCkubm90TnVsbCgpLFxuXHRwYXJhbXM6IHRleHQoKS5ub3ROdWxsKCksXG5cdGNvbnRleHQ6IHRleHQoKS5ub3ROdWxsKCksXG5cdC4uLnNoYXJlZFxufSk7XG5jb25zdCBtaW5pbmdGbGVldHMgPSBzcWxpdGVUYWJsZShcIm1pbmluZ19mbGVldHNcIiwge1xuXHRpZDogaW50ZWdlcihcImlkXCIpLnByaW1hcnlLZXkoeyBhdXRvSW5jcmVtZW50OiB0cnVlIH0pLFxuXHRuYW1lOiB0ZXh0KFwibmFtZVwiKS5ub3ROdWxsKCksXG5cdGRlc2NyaXB0aW9uOiB0ZXh0KFwiZGVzY3JpcHRpb25cIiksXG5cdGNyZWF0b3JEaXNjb3JkSWQ6IHRleHQoXCJjcmVhdG9yX2Rpc2NvcmRfaWRcIikubm90TnVsbCgpLFxuXHRzdGFydFRpbWU6IGludGVnZXIoXCJzdGFydF90aW1lXCIpLm5vdE51bGwoKSxcblx0ZW5kVGltZTogaW50ZWdlcihcImVuZF90aW1lXCIpLFxuXHRzdGF0dXM6IHRleHQoXCJzdGF0dXNcIiwgeyBlbnVtOiBbXG5cdFx0XCJjb25maWd1cmluZ1wiLFxuXHRcdFwiYWN0aXZlXCIsXG5cdFx0XCJlbmRlZFwiLFxuXHRcdFwiZ2VuZXJhdGluZ19yZXBvcnRcIixcblx0XHRcImNvbXBsZXRlZFwiLFxuXHRcdFwiZmFpbGVkXCJcblx0XSB9KS5ub3ROdWxsKCkuZGVmYXVsdChcImNvbmZpZ3VyaW5nXCIpLFxuXHR0YXhSYXRlOiByZWFsKFwidGF4X3JhdGVcIikubm90TnVsbCgpLmRlZmF1bHQoMCksXG5cdHB1YmxpY01lc3NhZ2VJZDogdGV4dChcInB1YmxpY19tZXNzYWdlX2lkXCIpLnVuaXF1ZSgpLFxuXHRwdWJsaWNDaGFubmVsSWQ6IHRleHQoXCJwdWJsaWNfY2hhbm5lbF9pZFwiKSxcblx0cmVwb3J0RGF0YTogdGV4dChcInJlcG9ydF9kYXRhXCIpLFxuXHRjcmVhdG9yRXBoZW1lcmFsTWVzc2FnZUlkOiB0ZXh0KFwiY3JlYXRvcl9lcGhlbWVyYWxfbWVzc2FnZV9pZFwiKSxcblx0Li4uc2hhcmVkXG59LCAodGFibGUpID0+IFtcblx0aW5kZXgoXCJpZHhfZmxlZXRfY3JlYXRvcl9kaXNjb3JkX2lkXCIpLm9uKHRhYmxlLmNyZWF0b3JEaXNjb3JkSWQpLFxuXHRpbmRleChcImlkeF9mbGVldF9zdGF0dXNcIikub24odGFibGUuc3RhdHVzKSxcblx0aW5kZXgoXCJpZHhfZmxlZXRfcHVibGljX21lc3NhZ2VfaWRcIikub24odGFibGUucHVibGljTWVzc2FnZUlkKVxuXSk7XG5jb25zdCBtaW5pbmdGbGVldFBhcnRpY2lwYW50cyA9IHNxbGl0ZVRhYmxlKFwibWluaW5nX2ZsZWV0X3BhcnRpY2lwYW50c1wiLCB7XG5cdGlkOiBpbnRlZ2VyKFwiaWRcIikucHJpbWFyeUtleSh7IGF1dG9JbmNyZW1lbnQ6IHRydWUgfSksXG5cdGZsZWV0SWQ6IGludGVnZXIoXCJmbGVldF9pZFwiKS5ub3ROdWxsKCkucmVmZXJlbmNlcygoKSA9PiBtaW5pbmdGbGVldHMuaWQsIHsgb25EZWxldGU6IFwiY2FzY2FkZVwiIH0pLFxuXHRjaGFyYWN0ZXJJZDogaW50ZWdlcihcImNoYXJhY3Rlcl9pZFwiKS5ub3ROdWxsKCkucmVmZXJlbmNlcygoKSA9PiBjaGFyYWN0ZXJzLmlkLCB7IG9uRGVsZXRlOiBcImNhc2NhZGVcIiB9KSxcblx0ZGlzY29yZElkOiB0ZXh0KFwiZGlzY29yZF9pZFwiKS5ub3ROdWxsKCksXG5cdHJvbGU6IHRleHQoXCJyb2xlXCIsIHsgZW51bTogW1xuXHRcdFwibWluZXJcIixcblx0XHRcInNlY3VyaXR5XCIsXG5cdFx0XCJoYXVsZXJcIlxuXHRdIH0pLm5vdE51bGwoKSxcblx0am9pblRpbWU6IGludGVnZXIoXCJqb2luX3RpbWVcIikubm90TnVsbCgpLFxuXHQuLi5zaGFyZWRcbn0sICh0YWJsZSkgPT4gW1xuXHRpbmRleChcImlkeF9wYXJ0aWNpcGFudF9mbGVldF9pZFwiKS5vbih0YWJsZS5mbGVldElkKSxcblx0aW5kZXgoXCJpZHhfcGFydGljaXBhbnRfY2hhcmFjdGVyX2lkXCIpLm9uKHRhYmxlLmNoYXJhY3RlcklkKSxcblx0aW5kZXgoXCJpZHhfcGFydGljaXBhbnRfZGlzY29yZF9pZFwiKS5vbih0YWJsZS5kaXNjb3JkSWQpXG5dKTtcbmNvbnN0IG1pbmluZ0ZsZWV0c1JlbGF0aW9ucyA9IHJlbGF0aW9ucyhtaW5pbmdGbGVldHMsICh7IG1hbnkgfSkgPT4gKHsgcGFydGljaXBhbnRzOiBtYW55KG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzKSB9KSk7XG5jb25zdCBtaW5pbmdGbGVldFBhcnRpY2lwYW50c1JlbGF0aW9ucyA9IHJlbGF0aW9ucyhtaW5pbmdGbGVldFBhcnRpY2lwYW50cywgKHsgb25lIH0pID0+ICh7XG5cdGZsZWV0OiBvbmUobWluaW5nRmxlZXRzLCB7XG5cdFx0ZmllbGRzOiBbbWluaW5nRmxlZXRQYXJ0aWNpcGFudHMuZmxlZXRJZF0sXG5cdFx0cmVmZXJlbmNlczogW21pbmluZ0ZsZWV0cy5pZF1cblx0fSksXG5cdGNoYXJhY3Rlcjogb25lKGNoYXJhY3RlcnMsIHtcblx0XHRmaWVsZHM6IFttaW5pbmdGbGVldFBhcnRpY2lwYW50cy5jaGFyYWN0ZXJJZF0sXG5cdFx0cmVmZXJlbmNlczogW2NoYXJhY3RlcnMuaWRdXG5cdH0pXG59KSk7XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgY2hhcmFjdGVycywgbWluaW5nRmxlZXRQYXJ0aWNpcGFudHMsIG1pbmluZ0ZsZWV0cywgcmVzdW1lQ29tbWFuZHMsIHNjaGVtYV9leHBvcnRzLCB1c2VycyB9OyIsCiAgICAiLy8jcmVnaW9uIHNyYy9lc2kvb3B0aW9ucy50c1xuY29uc3QgQ0xJRU5UX0lEID0gcHJvY2Vzcy5lbnYuRVZFX0NMSUVOVF9JRCB8fCBcIlwiO1xuY29uc3QgQ0xJRU5UX1NFQ1JFVCA9IHByb2Nlc3MuZW52LkVWRV9DTElFTlRfU0VDUkVUIHx8IFwiXCI7XG5jb25zdCBDQUxMQkFDS19VUkwgPSBwcm9jZXNzLmVudi5FVkVfQ0FMTEJBQ0tfVVJMIHx8IFwiXCI7XG5jb25zdCBVU0VSX0FHRU5UID0gcHJvY2Vzcy5lbnYuRVNJX1VTRVJfQUdFTlQgfHwgXCJcIjtcbmNvbnN0IG9wdGlvbnMgPSB7XG5cdGNsaWVudF9pZDogQ0xJRU5UX0lELFxuXHRjbGllbnRfc2VjcmV0OiBDTElFTlRfU0VDUkVULFxuXHRjYWxsYmFja191cmw6IENBTExCQUNLX1VSTCxcblx0dXNlcl9hZ2VudDogVVNFUl9BR0VOVFxufTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBvcHRpb25zIH07IiwKICAgICJleHBvcnQgY2xhc3MgSW52YWxpZFRva2VuRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG5JbnZhbGlkVG9rZW5FcnJvci5wcm90b3R5cGUubmFtZSA9IFwiSW52YWxpZFRva2VuRXJyb3JcIjtcbmZ1bmN0aW9uIGI2NERlY29kZVVuaWNvZGUoc3RyKSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChhdG9iKHN0cikucmVwbGFjZSgvKC4pL2csIChtLCBwKSA9PiB7XG4gICAgICAgIGxldCBjb2RlID0gcC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBpZiAoY29kZS5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICBjb2RlID0gXCIwXCIgKyBjb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIiVcIiArIGNvZGU7XG4gICAgfSkpO1xufVxuZnVuY3Rpb24gYmFzZTY0VXJsRGVjb2RlKHN0cikge1xuICAgIGxldCBvdXRwdXQgPSBzdHIucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIik7XG4gICAgc3dpdGNoIChvdXRwdXQubGVuZ3RoICUgNCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgb3V0cHV0ICs9IFwiPT1cIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBvdXRwdXQgKz0gXCI9XCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImJhc2U2NCBzdHJpbmcgaXMgbm90IG9mIHRoZSBjb3JyZWN0IGxlbmd0aFwiKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGI2NERlY29kZVVuaWNvZGUob3V0cHV0KTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gYXRvYihvdXRwdXQpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBqd3REZWNvZGUodG9rZW4sIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHRva2VuICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FcnJvcihcIkludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBtdXN0IGJlIGEgc3RyaW5nXCIpO1xuICAgIH1cbiAgICBvcHRpb25zIHx8IChvcHRpb25zID0ge30pO1xuICAgIGNvbnN0IHBvcyA9IG9wdGlvbnMuaGVhZGVyID09PSB0cnVlID8gMCA6IDE7XG4gICAgY29uc3QgcGFydCA9IHRva2VuLnNwbGl0KFwiLlwiKVtwb3NdO1xuICAgIGlmICh0eXBlb2YgcGFydCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXJyb3IoYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBtaXNzaW5nIHBhcnQgIyR7cG9zICsgMX1gKTtcbiAgICB9XG4gICAgbGV0IGRlY29kZWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgZGVjb2RlZCA9IGJhc2U2NFVybERlY29kZShwYXJ0KTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbkVycm9yKGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogaW52YWxpZCBiYXNlNjQgZm9yIHBhcnQgIyR7cG9zICsgMX0gKCR7ZS5tZXNzYWdlfSlgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FcnJvcihgSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IGludmFsaWQganNvbiBmb3IgcGFydCAjJHtwb3MgKyAxfSAoJHtlLm1lc3NhZ2V9KWApO1xuICAgIH1cbn1cbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMlVwcGVyQ2FzZShieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJfaW50ZXJuYWwoYnl0ZXMsIGJhc2UzMlVwcGVyQ2FzZUFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTMyVXBwZXJDYXNlTm9QYWRkaW5nKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2UzMl9pbnRlcm5hbChieXRlcywgYmFzZTMyVXBwZXJDYXNlQWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5Ob25lKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlMzJMb3dlckNhc2UoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTMyX2ludGVybmFsKGJ5dGVzLCBiYXNlMzJMb3dlckNhc2VBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLkluY2x1ZGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMkxvd2VyQ2FzZU5vUGFkZGluZyhieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJfaW50ZXJuYWwoYnl0ZXMsIGJhc2UzMkxvd2VyQ2FzZUFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuTm9uZSk7XG59XG4vKiogUmVwbGFjZWQ6IFVzZSBlbmNvZGVCYXNlMzJVcHBlckNhc2UoKSBpbnN0ZWFkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2UzMihieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlMzJVcHBlckNhc2UoYnl0ZXMpO1xufVxuLyoqIFJlcGxhY2VkOiBVc2UgZW5jb2RlQmFzZTMyVXBwZXJDYXNlTm9QYWRkaW5nKCkgaW5zdGVhZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlMzJOb1BhZGRpbmcoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTMyVXBwZXJDYXNlTm9QYWRkaW5nKGJ5dGVzKTtcbn1cbmZ1bmN0aW9uIGVuY29kZUJhc2UzMl9pbnRlcm5hbChieXRlcywgYWxwaGFiZXQsIHBhZGRpbmcpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmJ5dGVMZW5ndGg7IGkgKz0gNSkge1xuICAgICAgICBsZXQgYnVmZmVyID0gMG47XG4gICAgICAgIGxldCBidWZmZXJCaXRTaXplID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA1ICYmIGkgKyBqIDwgYnl0ZXMuYnl0ZUxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBidWZmZXIgPSAoYnVmZmVyIDw8IDhuKSB8IEJpZ0ludChieXRlc1tpICsgal0pO1xuICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChidWZmZXJCaXRTaXplICUgNSAhPT0gMCkge1xuICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyIDw8IEJpZ0ludCg1IC0gKGJ1ZmZlckJpdFNpemUgJSA1KSk7XG4gICAgICAgICAgICBidWZmZXJCaXRTaXplICs9IDUgLSAoYnVmZmVyQml0U2l6ZSAlIDUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgODsgaisrKSB7XG4gICAgICAgICAgICBpZiAoYnVmZmVyQml0U2l6ZSA+PSA1KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFscGhhYmV0W051bWJlcigoYnVmZmVyID4+IEJpZ0ludChidWZmZXJCaXRTaXplIC0gNSkpICYgMHgxZm4pXTtcbiAgICAgICAgICAgICAgICBidWZmZXJCaXRTaXplIC09IDU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChidWZmZXJCaXRTaXplID4gMCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhbHBoYWJldFtOdW1iZXIoKGJ1ZmZlciA8PCBCaWdJbnQoNiAtIGJ1ZmZlckJpdFNpemUpKSAmIDB4M2ZuKV07XG4gICAgICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYWRkaW5nID09PSBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIj1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2UzMihlbmNvZGVkKSB7XG4gICAgcmV0dXJuIGRlY29kZUJhc2UzMl9pbnRlcm5hbChlbmNvZGVkLCBiYXNlMzJEZWNvZGVNYXAsIERlY29kaW5nUGFkZGluZy5SZXF1aXJlZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTMySWdub3JlUGFkZGluZyhlbmNvZGVkKSB7XG4gICAgcmV0dXJuIGRlY29kZUJhc2UzMl9pbnRlcm5hbChlbmNvZGVkLCBiYXNlMzJEZWNvZGVNYXAsIERlY29kaW5nUGFkZGluZy5JZ25vcmUpO1xufVxuZnVuY3Rpb24gZGVjb2RlQmFzZTMyX2ludGVybmFsKGVuY29kZWQsIGRlY29kZU1hcCwgcGFkZGluZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KE1hdGguY2VpbChlbmNvZGVkLmxlbmd0aCAvIDgpICogNSk7XG4gICAgbGV0IHRvdGFsQnl0ZXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RlZC5sZW5ndGg7IGkgKz0gOCkge1xuICAgICAgICBsZXQgY2h1bmsgPSAwbjtcbiAgICAgICAgbGV0IGJpdHNSZWFkID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA4OyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYWRkaW5nID09PSBEZWNvZGluZ1BhZGRpbmcuUmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW5jb2RlZFtpICsgal0gPT09IFwiPVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSArIGogPj0gZW5jb2RlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWRkaW5nID09PSBEZWNvZGluZ1BhZGRpbmcuSWdub3JlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgKyBqID49IGVuY29kZWQubGVuZ3RoIHx8IGVuY29kZWRbaSArIGpdID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaiA+IDAgJiYgZW5jb2RlZFtpICsgaiAtIDFdID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKGVuY29kZWRbaSArIGpdIGluIGRlY29kZU1hcCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNoYXJhY3RlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNodW5rIHw9IEJpZ0ludChkZWNvZGVNYXBbZW5jb2RlZFtpICsgal1dKSA8PCBCaWdJbnQoKDcgLSBqKSAqIDUpO1xuICAgICAgICAgICAgYml0c1JlYWQgKz0gNTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYml0c1JlYWQgPCA0MCkge1xuICAgICAgICAgICAgbGV0IHVudXNlZDtcbiAgICAgICAgICAgIGlmIChiaXRzUmVhZCA9PT0gMTApIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmZmZmZmZmZuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYml0c1JlYWQgPT09IDIwKSB7XG4gICAgICAgICAgICAgICAgdW51c2VkID0gY2h1bmsgJiAweGZmZmZmZm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaXRzUmVhZCA9PT0gMjUpIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmZmZm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaXRzUmVhZCA9PT0gMzUpIHtcbiAgICAgICAgICAgICAgICB1bnVzZWQgPSBjaHVuayAmIDB4ZmZuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVudXNlZCAhPT0gMG4pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnl0ZUxlbmd0aCA9IE1hdGguZmxvb3IoYml0c1JlYWQgLyA4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdFt0b3RhbEJ5dGVzXSA9IE51bWJlcigoY2h1bmsgPj4gQmlnSW50KDMyIC0gaSAqIDgpKSAmIDB4ZmZuKTtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LnNsaWNlKDAsIHRvdGFsQnl0ZXMpO1xufVxuY29uc3QgYmFzZTMyVXBwZXJDYXNlQWxwaGFiZXQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMjM0NTY3XCI7XG5jb25zdCBiYXNlMzJMb3dlckNhc2VBbHBoYWJldCA9IFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoyMzQ1NjdcIjtcbmNvbnN0IGJhc2UzMkRlY29kZU1hcCA9IHtcbiAgICBBOiAwLFxuICAgIEI6IDEsXG4gICAgQzogMixcbiAgICBEOiAzLFxuICAgIEU6IDQsXG4gICAgRjogNSxcbiAgICBHOiA2LFxuICAgIEg6IDcsXG4gICAgSTogOCxcbiAgICBKOiA5LFxuICAgIEs6IDEwLFxuICAgIEw6IDExLFxuICAgIE06IDEyLFxuICAgIE46IDEzLFxuICAgIE86IDE0LFxuICAgIFA6IDE1LFxuICAgIFE6IDE2LFxuICAgIFI6IDE3LFxuICAgIFM6IDE4LFxuICAgIFQ6IDE5LFxuICAgIFU6IDIwLFxuICAgIFY6IDIxLFxuICAgIFc6IDIyLFxuICAgIFg6IDIzLFxuICAgIFk6IDI0LFxuICAgIFo6IDI1LFxuICAgIGE6IDAsXG4gICAgYjogMSxcbiAgICBjOiAyLFxuICAgIGQ6IDMsXG4gICAgZTogNCxcbiAgICBmOiA1LFxuICAgIGc6IDYsXG4gICAgaDogNyxcbiAgICBpOiA4LFxuICAgIGo6IDksXG4gICAgazogMTAsXG4gICAgbDogMTEsXG4gICAgbTogMTIsXG4gICAgbjogMTMsXG4gICAgbzogMTQsXG4gICAgcDogMTUsXG4gICAgcTogMTYsXG4gICAgcjogMTcsXG4gICAgczogMTgsXG4gICAgdDogMTksXG4gICAgdTogMjAsXG4gICAgdjogMjEsXG4gICAgdzogMjIsXG4gICAgeDogMjMsXG4gICAgeTogMjQsXG4gICAgejogMjUsXG4gICAgXCIyXCI6IDI2LFxuICAgIFwiM1wiOiAyNyxcbiAgICBcIjRcIjogMjgsXG4gICAgXCI1XCI6IDI5LFxuICAgIFwiNlwiOiAzMCxcbiAgICBcIjdcIjogMzFcbn07XG52YXIgRW5jb2RpbmdQYWRkaW5nO1xuKGZ1bmN0aW9uIChFbmNvZGluZ1BhZGRpbmcpIHtcbiAgICBFbmNvZGluZ1BhZGRpbmdbRW5jb2RpbmdQYWRkaW5nW1wiSW5jbHVkZVwiXSA9IDBdID0gXCJJbmNsdWRlXCI7XG4gICAgRW5jb2RpbmdQYWRkaW5nW0VuY29kaW5nUGFkZGluZ1tcIk5vbmVcIl0gPSAxXSA9IFwiTm9uZVwiO1xufSkoRW5jb2RpbmdQYWRkaW5nIHx8IChFbmNvZGluZ1BhZGRpbmcgPSB7fSkpO1xudmFyIERlY29kaW5nUGFkZGluZztcbihmdW5jdGlvbiAoRGVjb2RpbmdQYWRkaW5nKSB7XG4gICAgRGVjb2RpbmdQYWRkaW5nW0RlY29kaW5nUGFkZGluZ1tcIlJlcXVpcmVkXCJdID0gMF0gPSBcIlJlcXVpcmVkXCI7XG4gICAgRGVjb2RpbmdQYWRkaW5nW0RlY29kaW5nUGFkZGluZ1tcIklnbm9yZVwiXSA9IDFdID0gXCJJZ25vcmVcIjtcbn0pKERlY29kaW5nUGFkZGluZyB8fCAoRGVjb2RpbmdQYWRkaW5nID0ge30pKTtcbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2U2NChieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlNjRfaW50ZXJuYWwoYnl0ZXMsIGJhc2U2NEFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlQmFzZTY0Tm9QYWRkaW5nKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGVuY29kZUJhc2U2NF9pbnRlcm5hbChieXRlcywgYmFzZTY0QWxwaGFiZXQsIEVuY29kaW5nUGFkZGluZy5Ob25lKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVCYXNlNjR1cmwoYnl0ZXMpIHtcbiAgICByZXR1cm4gZW5jb2RlQmFzZTY0X2ludGVybmFsKGJ5dGVzLCBiYXNlNjR1cmxBbHBoYWJldCwgRW5jb2RpbmdQYWRkaW5nLkluY2x1ZGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUJhc2U2NHVybE5vUGFkZGluZyhieXRlcykge1xuICAgIHJldHVybiBlbmNvZGVCYXNlNjRfaW50ZXJuYWwoYnl0ZXMsIGJhc2U2NHVybEFscGhhYmV0LCBFbmNvZGluZ1BhZGRpbmcuTm9uZSk7XG59XG5mdW5jdGlvbiBlbmNvZGVCYXNlNjRfaW50ZXJuYWwoYnl0ZXMsIGFscGhhYmV0LCBwYWRkaW5nKSB7XG4gICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5ieXRlTGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgbGV0IGJ1ZmZlciA9IDA7XG4gICAgICAgIGxldCBidWZmZXJCaXRTaXplID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAzICYmIGkgKyBqIDwgYnl0ZXMuYnl0ZUxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBidWZmZXIgPSAoYnVmZmVyIDw8IDgpIHwgYnl0ZXNbaSArIGpdO1xuICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoYnVmZmVyQml0U2l6ZSA+PSA2KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFscGhhYmV0WyhidWZmZXIgPj4gKGJ1ZmZlckJpdFNpemUgLSA2KSkgJiAweDNmXTtcbiAgICAgICAgICAgICAgICBidWZmZXJCaXRTaXplIC09IDY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChidWZmZXJCaXRTaXplID4gMCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhbHBoYWJldFsoYnVmZmVyIDw8ICg2IC0gYnVmZmVyQml0U2l6ZSkpICYgMHgzZl07XG4gICAgICAgICAgICAgICAgYnVmZmVyQml0U2l6ZSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYWRkaW5nID09PSBFbmNvZGluZ1BhZGRpbmcuSW5jbHVkZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIj1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgYmFzZTY0QWxwaGFiZXQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9cIjtcbmNvbnN0IGJhc2U2NHVybEFscGhhYmV0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fXCI7XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTY0KGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGJhc2U2NERlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLlJlcXVpcmVkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlNjRJZ25vcmVQYWRkaW5nKGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGJhc2U2NERlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLklnbm9yZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQmFzZTY0dXJsKGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGJhc2U2NHVybERlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLlJlcXVpcmVkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlNjR1cmxJZ25vcmVQYWRkaW5nKGVuY29kZWQpIHtcbiAgICByZXR1cm4gZGVjb2RlQmFzZTY0X2ludGVybmFsKGVuY29kZWQsIGJhc2U2NHVybERlY29kZU1hcCwgRGVjb2RpbmdQYWRkaW5nLklnbm9yZSk7XG59XG5mdW5jdGlvbiBkZWNvZGVCYXNlNjRfaW50ZXJuYWwoZW5jb2RlZCwgZGVjb2RlTWFwLCBwYWRkaW5nKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKGVuY29kZWQubGVuZ3RoIC8gNCkgKiAzKTtcbiAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbmNvZGVkLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGxldCBjaHVuayA9IDA7XG4gICAgICAgIGxldCBiaXRzUmVhZCA9IDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNDsgaisrKSB7XG4gICAgICAgICAgICBpZiAocGFkZGluZyA9PT0gRGVjb2RpbmdQYWRkaW5nLlJlcXVpcmVkICYmIGVuY29kZWRbaSArIGpdID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhZGRpbmcgPT09IERlY29kaW5nUGFkZGluZy5JZ25vcmUgJiZcbiAgICAgICAgICAgICAgICAoaSArIGogPj0gZW5jb2RlZC5sZW5ndGggfHwgZW5jb2RlZFtpICsgal0gPT09IFwiPVwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGogPiAwICYmIGVuY29kZWRbaSArIGogLSAxXSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZGRpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShlbmNvZGVkW2kgKyBqXSBpbiBkZWNvZGVNYXApKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjaGFyYWN0ZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVuayB8PSBkZWNvZGVNYXBbZW5jb2RlZFtpICsgal1dIDw8ICgoMyAtIGopICogNik7XG4gICAgICAgICAgICBiaXRzUmVhZCArPSA2O1xuICAgICAgICB9XG4gICAgICAgIGlmIChiaXRzUmVhZCA8IDI0KSB7XG4gICAgICAgICAgICBsZXQgdW51c2VkO1xuICAgICAgICAgICAgaWYgKGJpdHNSZWFkID09PSAxMikge1xuICAgICAgICAgICAgICAgIHVudXNlZCA9IGNodW5rICYgMHhmZmZmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYml0c1JlYWQgPT09IDE4KSB7XG4gICAgICAgICAgICAgICAgdW51c2VkID0gY2h1bmsgJiAweGZmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWRkaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVudXNlZCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFkZGluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBieXRlTGVuZ3RoID0gTWF0aC5mbG9vcihiaXRzUmVhZCAvIDgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0W3RvdGFsQnl0ZXNdID0gKGNodW5rID4+ICgxNiAtIGkgKiA4KSkgJiAweGZmO1xuICAgICAgICAgICAgdG90YWxCeXRlcysrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuc2xpY2UoMCwgdG90YWxCeXRlcyk7XG59XG52YXIgRW5jb2RpbmdQYWRkaW5nO1xuKGZ1bmN0aW9uIChFbmNvZGluZ1BhZGRpbmcpIHtcbiAgICBFbmNvZGluZ1BhZGRpbmdbRW5jb2RpbmdQYWRkaW5nW1wiSW5jbHVkZVwiXSA9IDBdID0gXCJJbmNsdWRlXCI7XG4gICAgRW5jb2RpbmdQYWRkaW5nW0VuY29kaW5nUGFkZGluZ1tcIk5vbmVcIl0gPSAxXSA9IFwiTm9uZVwiO1xufSkoRW5jb2RpbmdQYWRkaW5nIHx8IChFbmNvZGluZ1BhZGRpbmcgPSB7fSkpO1xudmFyIERlY29kaW5nUGFkZGluZztcbihmdW5jdGlvbiAoRGVjb2RpbmdQYWRkaW5nKSB7XG4gICAgRGVjb2RpbmdQYWRkaW5nW0RlY29kaW5nUGFkZGluZ1tcIlJlcXVpcmVkXCJdID0gMF0gPSBcIlJlcXVpcmVkXCI7XG4gICAgRGVjb2RpbmdQYWRkaW5nW0RlY29kaW5nUGFkZGluZ1tcIklnbm9yZVwiXSA9IDFdID0gXCJJZ25vcmVcIjtcbn0pKERlY29kaW5nUGFkZGluZyB8fCAoRGVjb2RpbmdQYWRkaW5nID0ge30pKTtcbmNvbnN0IGJhc2U2NERlY29kZU1hcCA9IHtcbiAgICBcIjBcIjogNTIsXG4gICAgXCIxXCI6IDUzLFxuICAgIFwiMlwiOiA1NCxcbiAgICBcIjNcIjogNTUsXG4gICAgXCI0XCI6IDU2LFxuICAgIFwiNVwiOiA1NyxcbiAgICBcIjZcIjogNTgsXG4gICAgXCI3XCI6IDU5LFxuICAgIFwiOFwiOiA2MCxcbiAgICBcIjlcIjogNjEsXG4gICAgQTogMCxcbiAgICBCOiAxLFxuICAgIEM6IDIsXG4gICAgRDogMyxcbiAgICBFOiA0LFxuICAgIEY6IDUsXG4gICAgRzogNixcbiAgICBIOiA3LFxuICAgIEk6IDgsXG4gICAgSjogOSxcbiAgICBLOiAxMCxcbiAgICBMOiAxMSxcbiAgICBNOiAxMixcbiAgICBOOiAxMyxcbiAgICBPOiAxNCxcbiAgICBQOiAxNSxcbiAgICBROiAxNixcbiAgICBSOiAxNyxcbiAgICBTOiAxOCxcbiAgICBUOiAxOSxcbiAgICBVOiAyMCxcbiAgICBWOiAyMSxcbiAgICBXOiAyMixcbiAgICBYOiAyMyxcbiAgICBZOiAyNCxcbiAgICBaOiAyNSxcbiAgICBhOiAyNixcbiAgICBiOiAyNyxcbiAgICBjOiAyOCxcbiAgICBkOiAyOSxcbiAgICBlOiAzMCxcbiAgICBmOiAzMSxcbiAgICBnOiAzMixcbiAgICBoOiAzMyxcbiAgICBpOiAzNCxcbiAgICBqOiAzNSxcbiAgICBrOiAzNixcbiAgICBsOiAzNyxcbiAgICBtOiAzOCxcbiAgICBuOiAzOSxcbiAgICBvOiA0MCxcbiAgICBwOiA0MSxcbiAgICBxOiA0MixcbiAgICByOiA0MyxcbiAgICBzOiA0NCxcbiAgICB0OiA0NSxcbiAgICB1OiA0NixcbiAgICB2OiA0NyxcbiAgICB3OiA0OCxcbiAgICB4OiA0OSxcbiAgICB5OiA1MCxcbiAgICB6OiA1MSxcbiAgICBcIitcIjogNjIsXG4gICAgXCIvXCI6IDYzXG59O1xuY29uc3QgYmFzZTY0dXJsRGVjb2RlTWFwID0ge1xuICAgIFwiMFwiOiA1MixcbiAgICBcIjFcIjogNTMsXG4gICAgXCIyXCI6IDU0LFxuICAgIFwiM1wiOiA1NSxcbiAgICBcIjRcIjogNTYsXG4gICAgXCI1XCI6IDU3LFxuICAgIFwiNlwiOiA1OCxcbiAgICBcIjdcIjogNTksXG4gICAgXCI4XCI6IDYwLFxuICAgIFwiOVwiOiA2MSxcbiAgICBBOiAwLFxuICAgIEI6IDEsXG4gICAgQzogMixcbiAgICBEOiAzLFxuICAgIEU6IDQsXG4gICAgRjogNSxcbiAgICBHOiA2LFxuICAgIEg6IDcsXG4gICAgSTogOCxcbiAgICBKOiA5LFxuICAgIEs6IDEwLFxuICAgIEw6IDExLFxuICAgIE06IDEyLFxuICAgIE46IDEzLFxuICAgIE86IDE0LFxuICAgIFA6IDE1LFxuICAgIFE6IDE2LFxuICAgIFI6IDE3LFxuICAgIFM6IDE4LFxuICAgIFQ6IDE5LFxuICAgIFU6IDIwLFxuICAgIFY6IDIxLFxuICAgIFc6IDIyLFxuICAgIFg6IDIzLFxuICAgIFk6IDI0LFxuICAgIFo6IDI1LFxuICAgIGE6IDI2LFxuICAgIGI6IDI3LFxuICAgIGM6IDI4LFxuICAgIGQ6IDI5LFxuICAgIGU6IDMwLFxuICAgIGY6IDMxLFxuICAgIGc6IDMyLFxuICAgIGg6IDMzLFxuICAgIGk6IDM0LFxuICAgIGo6IDM1LFxuICAgIGs6IDM2LFxuICAgIGw6IDM3LFxuICAgIG06IDM4LFxuICAgIG46IDM5LFxuICAgIG86IDQwLFxuICAgIHA6IDQxLFxuICAgIHE6IDQyLFxuICAgIHI6IDQzLFxuICAgIHM6IDQ0LFxuICAgIHQ6IDQ1LFxuICAgIHU6IDQ2LFxuICAgIHY6IDQ3LFxuICAgIHc6IDQ4LFxuICAgIHg6IDQ5LFxuICAgIHk6IDUwLFxuICAgIHo6IDUxLFxuICAgIFwiLVwiOiA2MixcbiAgICBfOiA2M1xufTtcbiIsCiAgICAiaW1wb3J0IHsgX19leHBvcnQgfSBmcm9tIFwiLi4vX3ZpcnR1YWwvcm9sbGRvd25fcnVudGltZS5qc1wiO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gXCIuL29wdGlvbnMuanNcIjtcbmltcG9ydCB7IGp3dERlY29kZSB9IGZyb20gXCJqd3QtZGVjb2RlXCI7XG5pbXBvcnQgeyBlbmNvZGVCYXNlNjR1cmxOb1BhZGRpbmcgfSBmcm9tIFwiQG9zbG9qcy9lbmNvZGluZ1wiO1xuaW1wb3J0IGp3dCBmcm9tIFwianNvbndlYnRva2VuXCI7XG5pbXBvcnQgandrVG9QZW0gZnJvbSBcImp3ay10by1wZW1cIjtcblxuLy8jcmVnaW9uIHNyYy9lc2kvYXV0aC50c1xudmFyIGF1dGhfZXhwb3J0cyA9IHt9O1xuX19leHBvcnQoYXV0aF9leHBvcnRzLCB7XG5cdGNoYXJhY3RlcklkRnJvbVRva2VuOiAoKSA9PiBjaGFyYWN0ZXJJZEZyb21Ub2tlbixcblx0Y3JlYXRlQXV0aG9yaXphdGlvblVSTDogKCkgPT4gY3JlYXRlQXV0aG9yaXphdGlvblVSTCxcblx0cmVmcmVzaDogKCkgPT4gcmVmcmVzaCxcblx0dmFsaWRhdGVBdXRob3JpemF0aW9uQ29kZTogKCkgPT4gdmFsaWRhdGVBdXRob3JpemF0aW9uQ29kZSxcblx0dmFsaWRhdGVUb2tlbjogKCkgPT4gdmFsaWRhdGVUb2tlblxufSk7XG5mdW5jdGlvbiBnZW5lcmF0ZVN0YXRlKCkge1xuXHRjb25zdCByYW5kb21WYWx1ZXMgPSBuZXcgVWludDhBcnJheSgzMik7XG5cdGNyeXB0by5nZXRSYW5kb21WYWx1ZXMocmFuZG9tVmFsdWVzKTtcblx0cmV0dXJuIGVuY29kZUJhc2U2NHVybE5vUGFkZGluZyhyYW5kb21WYWx1ZXMpO1xufVxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXV0aG9yaXphdGlvblVSTChzY29wZXMgPSBcInB1YmxpY0RhdGFcIikge1xuXHRjb25zdCBzdGF0ZSA9IGdlbmVyYXRlU3RhdGUoKTtcblx0Y29uc3QgdXJsID0gbmV3IFVSTChcImh0dHBzOi8vbG9naW4uZXZlb25saW5lLmNvbS92Mi9vYXV0aC9hdXRob3JpemUvXCIpO1xuXHR1cmwuc2VhcmNoUGFyYW1zLnNldChcInJlc3BvbnNlX3R5cGVcIiwgXCJjb2RlXCIpO1xuXHR1cmwuc2VhcmNoUGFyYW1zLnNldChcInJlZGlyZWN0X3VyaVwiLCBvcHRpb25zLmNhbGxiYWNrX3VybCk7XG5cdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiY2xpZW50X2lkXCIsIG9wdGlvbnMuY2xpZW50X2lkKTtcblx0dXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJzdGF0ZVwiLCBzdGF0ZSk7XG5cdHVybC5zZWFyY2hQYXJhbXMuc2V0KFwic2NvcGVcIiwgQXJyYXkuaXNBcnJheShzY29wZXMpID8gc2NvcGVzLmpvaW4oXCIgXCIpIDogc2NvcGVzKTtcblx0cmV0dXJuIHtcblx0XHR1cmwsXG5cdFx0c3RhdGVcblx0fTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQXV0aG9yaXphdGlvbkNvZGUoY29kZSkge1xuXHR0cnkge1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCJodHRwczovL2xvZ2luLmV2ZW9ubGluZS5jb20vdjIvb2F1dGgvdG9rZW5cIiwge1xuXHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0XCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIixcblx0XHRcdFx0QXV0aG9yaXphdGlvbjogYEJhc2ljICR7QnVmZmVyLmZyb20oYCR7b3B0aW9ucy5jbGllbnRfaWR9OiR7b3B0aW9ucy5jbGllbnRfc2VjcmV0fWApLnRvU3RyaW5nKFwiYmFzZTY0XCIpfWBcblx0XHRcdH0sXG5cdFx0XHRib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcblx0XHRcdFx0Z3JhbnRfdHlwZTogXCJhdXRob3JpemF0aW9uX2NvZGVcIixcblx0XHRcdFx0Y29kZVxuXHRcdFx0fSlcblx0XHR9KTtcblx0XHRyZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdGNvbnNvbGUuZXJyb3IoYGZhaWxlZCB0byB2YWxpZGF0ZSBFVkUgYXV0aG9yaXphdGlvbiBjb2RlYCwgZXJyb3IpO1xuXHRcdHRocm93IGAke2Vycm9yfWA7XG5cdH1cbn1cbmxldCBldmVBdXRoUHVibGljS2V5O1xuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVUb2tlbih0b2tlbikge1xuXHRpZiAoIWV2ZUF1dGhQdWJsaWNLZXkpIHRyeSB7XG5cdFx0Y29uc3QgZXZlSldLUyA9IGF3YWl0IChhd2FpdCBmZXRjaChcImh0dHBzOi8vbG9naW4uZXZlb25saW5lLmNvbS9vYXV0aC9qd2tzXCIpKS5qc29uKCk7XG5cdFx0ZXZlQXV0aFB1YmxpY0tleSA9IGp3a1RvUGVtKGV2ZUpXS1Mua2V5c1swXSk7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGNvbnNvbGUuZXJyb3IoYGZhaWxlZCB0byBnZXQgRVZFIEF1dGggcHVibGljIGtleXNgLCBlcnIpO1xuXHR9XG5cdHRyeSB7XG5cdFx0Y29uc3QgZGVjb2RlZCA9IGp3dC52ZXJpZnkodG9rZW4sIGV2ZUF1dGhQdWJsaWNLZXkpO1xuXHRcdHJldHVybiBkZWNvZGVkO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRjb25zb2xlLmVycm9yKGBmYWlsZWQgdG8gdmFsaWRhdGUgRVZFIHRva2VuYCwgZXJyKTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxufVxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaCh7IHJlZnJlc2hfdG9rZW4gfSwgc2NvcGVzKSB7XG5cdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRncmFudF90eXBlOiBcInJlZnJlc2hfdG9rZW5cIixcblx0XHRyZWZyZXNoX3Rva2VuLFxuXHRcdHNjb3BlOiBcIlwiXG5cdH07XG5cdGlmIChzY29wZXMpIHBhcmFtc1tcInNjb3BlXCJdID0gQXJyYXkuaXNBcnJheShzY29wZXMpID8gc2NvcGVzLmpvaW4oXCIgXCIpIDogc2NvcGVzO1xuXHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9sb2dpbi5ldmVvbmxpbmUuY29tL3YyL29hdXRoL3Rva2VuXCIsIHtcblx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdGhlYWRlcnM6IHtcblx0XHRcdFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIsXG5cdFx0XHRBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtvcHRpb25zLmNsaWVudF9pZH06JHtvcHRpb25zLmNsaWVudF9zZWNyZXR9YCkudG9TdHJpbmcoXCJiYXNlNjRcIil9YFxuXHRcdH0sXG5cdFx0Ym9keTogbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpXG5cdH0pO1xuXHRyZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xufVxuZnVuY3Rpb24gY2hhcmFjdGVySWRGcm9tVG9rZW4odG9rZW4pIHtcblx0Y29uc3QgcGF5bG9hZCA9IGp3dERlY29kZSh0b2tlbik7XG5cdHJldHVybiBwYXJzZUludChwYXlsb2FkLnN1Yi5zcGxpdChcIjpcIilbMl0pO1xufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGF1dGhfZXhwb3J0cywgY2hhcmFjdGVySWRGcm9tVG9rZW4sIGNyZWF0ZUF1dGhvcml6YXRpb25VUkwsIHJlZnJlc2gsIHZhbGlkYXRlQXV0aG9yaXphdGlvbkNvZGUsIHZhbGlkYXRlVG9rZW4gfTsiLAogICAgImltcG9ydCB7IGNoYXJhY3RlcnMgfSBmcm9tIFwiLi4vc2NoZW1hLmpzXCI7XG5pbXBvcnQgeyByZWZyZXNoLCB2YWxpZGF0ZVRva2VuIH0gZnJvbSBcIi4uLy4uL2VzaS9hdXRoLmpzXCI7XG5pbXBvcnQgeyBkYiB9IGZyb20gXCIuLi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgYW5kLCBlcSB9IGZyb20gXCJkcml6emxlLW9ybVwiO1xuaW1wb3J0IHsgand0RGVjb2RlIH0gZnJvbSBcImp3dC1kZWNvZGVcIjtcblxuLy8jcmVnaW9uIHNyYy9kYi9tb2RlbHMvY2hhcmFjdGVyLm1vZGVsLnRzXG52YXIgQ2hhcmFjdGVySGVscGVyID0gY2xhc3MgQ2hhcmFjdGVySGVscGVyIHtcblx0c3RhdGljIGhhc1ZhbGlkVG9rZW4oY2hhcmFjdGVyKSB7XG5cdFx0cmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpIDwgY2hhcmFjdGVyLmV4cGlyZXNBdDtcblx0fVxuXHRzdGF0aWMgZ2V0U2NvcGVzKGNoYXJhY3Rlcikge1xuXHRcdGNvbnN0IGRlY29kZWQgPSBqd3REZWNvZGUoY2hhcmFjdGVyLmFjY2Vzc1Rva2VuKTtcblx0XHRyZXR1cm4gdHlwZW9mIGRlY29kZWQuc2NwID09PSBcInN0cmluZ1wiID8gW2RlY29kZWQuc2NwXSA6IGRlY29kZWQuc2NwO1xuXHR9XG5cdHN0YXRpYyBoYXNPbmx5UHVibGljU2NvcGUoY2hhcmFjdGVyKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2NvcGVzKGNoYXJhY3RlcikubGVuZ3RoID09PSAxICYmIHRoaXMuaGFzU2NvcGUoY2hhcmFjdGVyLCBcInB1YmxpY0RhdGFcIik7XG5cdH1cblx0c3RhdGljIGdldFRva2VucyhjaGFyYWN0ZXIpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0YWNjZXNzX3Rva2VuOiBjaGFyYWN0ZXIuYWNjZXNzVG9rZW4sXG5cdFx0XHRyZWZyZXNoX3Rva2VuOiBjaGFyYWN0ZXIucmVmcmVzaFRva2VuLFxuXHRcdFx0ZXhwaXJlc19pbjogKGNoYXJhY3Rlci5leHBpcmVzQXQuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAxZTNcblx0XHR9O1xuXHR9XG5cdHN0YXRpYyBoYXNTY29wZShjaGFyYWN0ZXIsIHNjb3BlKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2NvcGVzKGNoYXJhY3RlcikuaW5jbHVkZXMoc2NvcGUpO1xuXHR9XG5cdHN0YXRpYyBoYXNBbGxTY29wZXMoY2hhcmFjdGVyLCBzY29wZXMpIHtcblx0XHRjb25zdCBoYXMgPSB0aGlzLmdldFNjb3BlcyhjaGFyYWN0ZXIpO1xuXHRcdHJldHVybiBzY29wZXMuZXZlcnkoKHNjb3BlKSA9PiBoYXMuaW5jbHVkZXMoc2NvcGUpKTtcblx0fVxuXHRzdGF0aWMgZmluZChpZCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20oY2hhcmFjdGVycykud2hlcmUoZXEoY2hhcmFjdGVycy5pZCwgaWQpKS5saW1pdCgxKS5nZXQoKTtcblx0XHRjb25zdCBjID0gdGhpcy5jcmVhdGVDaGFyYWN0ZXJzKHJlc3VsdCk7XG5cdFx0cmV0dXJuIGMgPyBjWzBdIDogdm9pZCAwO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlVc2VyKHVzZXIpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3QoKS5mcm9tKGNoYXJhY3RlcnMpLndoZXJlKGVxKGNoYXJhY3RlcnMudXNlcklELCB1c2VyLmlkKSkuYWxsKCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ2hhcmFjdGVycyhyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlVc2VyQW5kRXZlSUQodXNlcklELCBldmVJRCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20oY2hhcmFjdGVycykud2hlcmUoYW5kKGVxKGNoYXJhY3RlcnMudXNlcklELCB1c2VySUQpLCBlcShjaGFyYWN0ZXJzLmV2ZUlELCBldmVJRCkpKS5saW1pdCgxKS5nZXQoKTtcblx0XHRjb25zdCBjID0gdGhpcy5jcmVhdGVDaGFyYWN0ZXJzKHJlc3VsdCk7XG5cdFx0cmV0dXJuIGMgPyBjWzBdIDogdm9pZCAwO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlOYW1lKHVzZXJJRCwgbmFtZSkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCgpLmZyb20oY2hhcmFjdGVycykud2hlcmUoYW5kKGVxKGNoYXJhY3RlcnMubmFtZSwgbmFtZSksIGVxKGNoYXJhY3RlcnMudXNlcklELCB1c2VySUQpKSkubGltaXQoMSkuZ2V0KCk7XG5cdFx0Y29uc3QgYyA9IHRoaXMuY3JlYXRlQ2hhcmFjdGVycyhyZXN1bHQpO1xuXHRcdHJldHVybiBjID8gY1swXSA6IHZvaWQgMDtcblx0fVxuXHRzdGF0aWMgZmluZEFsbCgpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3QoKS5mcm9tKGNoYXJhY3RlcnMpLmFsbCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUNoYXJhY3RlcnMocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlKGV2ZUlELCBuYW1lLCB1c2VyLCB0b2tlbnMpIHtcblx0XHRyZXR1cm4gdGhpcy5zYXZlKHtcblx0XHRcdGV2ZUlELFxuXHRcdFx0dXNlcklEOiB1c2VyLmlkLFxuXHRcdFx0YWNjZXNzVG9rZW46IHRva2Vucy5hY2Nlc3NfdG9rZW4sXG5cdFx0XHRleHBpcmVzQXQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSh0b2tlbnMuZXhwaXJlc19pbiAqIDFlMyksXG5cdFx0XHRyZWZyZXNoVG9rZW46IHRva2Vucy5yZWZyZXNoX3Rva2VuLFxuXHRcdFx0bmFtZSxcblx0XHRcdGNyZWF0ZWRBdDogLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKClcblx0XHR9KTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlQ2hhcmFjdGVycyhxdWVyeSkge1xuXHRcdGlmICghcXVlcnkpIHJldHVybiBbXTtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShxdWVyeSkpIHJldHVybiBxdWVyeS5tYXAoKGNoYXJhY3RlcikgPT4ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aWQ6IGNoYXJhY3Rlci5pZCxcblx0XHRcdFx0ZXZlSUQ6IGNoYXJhY3Rlci5ldmVJRCxcblx0XHRcdFx0dXNlcklEOiBjaGFyYWN0ZXIudXNlcklELFxuXHRcdFx0XHRhY2Nlc3NUb2tlbjogY2hhcmFjdGVyLmFjY2Vzc1Rva2VuLFxuXHRcdFx0XHRleHBpcmVzQXQ6IG5ldyBEYXRlKGNoYXJhY3Rlci5leHBpcmVzQXQpLFxuXHRcdFx0XHRyZWZyZXNoVG9rZW46IGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4sXG5cdFx0XHRcdG5hbWU6IGNoYXJhY3Rlci5uYW1lLFxuXHRcdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKGNoYXJhY3Rlci5jcmVhdGVkQXQpLFxuXHRcdFx0XHR1cGRhdGVkQXQ6IG5ldyBEYXRlKGNoYXJhY3Rlci51cGRhdGVkQXQpXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHRcdGVsc2UgcmV0dXJuIFt7XG5cdFx0XHRpZDogcXVlcnkuaWQsXG5cdFx0XHRldmVJRDogcXVlcnkuZXZlSUQsXG5cdFx0XHR1c2VySUQ6IHF1ZXJ5LnVzZXJJRCxcblx0XHRcdGFjY2Vzc1Rva2VuOiBxdWVyeS5hY2Nlc3NUb2tlbixcblx0XHRcdGV4cGlyZXNBdDogbmV3IERhdGUocXVlcnkuZXhwaXJlc0F0KSxcblx0XHRcdHJlZnJlc2hUb2tlbjogcXVlcnkucmVmcmVzaFRva2VuLFxuXHRcdFx0bmFtZTogcXVlcnkubmFtZSxcblx0XHRcdGNyZWF0ZWRBdDogbmV3IERhdGUocXVlcnkuY3JlYXRlZEF0KSxcblx0XHRcdHVwZGF0ZWRBdDogbmV3IERhdGUocXVlcnkudXBkYXRlZEF0KVxuXHRcdH1dO1xuXHR9XG5cdHN0YXRpYyBzYXZlKGNoYXJhY3Rlcikge1xuXHRcdGRiLmluc2VydChjaGFyYWN0ZXJzKS52YWx1ZXMoe1xuXHRcdFx0aWQ6IGNoYXJhY3Rlci5pZCxcblx0XHRcdGV2ZUlEOiBjaGFyYWN0ZXIuZXZlSUQsXG5cdFx0XHR1c2VySUQ6IGNoYXJhY3Rlci51c2VySUQsXG5cdFx0XHRuYW1lOiBjaGFyYWN0ZXIubmFtZSxcblx0XHRcdGFjY2Vzc1Rva2VuOiBjaGFyYWN0ZXIuYWNjZXNzVG9rZW4sXG5cdFx0XHRleHBpcmVzQXQ6IGNoYXJhY3Rlci5leHBpcmVzQXQuZ2V0VGltZSgpLFxuXHRcdFx0cmVmcmVzaFRva2VuOiBjaGFyYWN0ZXIucmVmcmVzaFRva2VuLFxuXHRcdFx0Y3JlYXRlZEF0OiBEYXRlLm5vdygpLFxuXHRcdFx0dXBkYXRlZEF0OiBEYXRlLm5vdygpXG5cdFx0fSkub25Db25mbGljdERvVXBkYXRlKHtcblx0XHRcdHRhcmdldDogY2hhcmFjdGVycy5pZCxcblx0XHRcdHNldDoge1xuXHRcdFx0XHRldmVJRDogY2hhcmFjdGVyLmV2ZUlELFxuXHRcdFx0XHR1c2VySUQ6IGNoYXJhY3Rlci51c2VySUQsXG5cdFx0XHRcdG5hbWU6IGNoYXJhY3Rlci5uYW1lLFxuXHRcdFx0XHRhY2Nlc3NUb2tlbjogY2hhcmFjdGVyLmFjY2Vzc1Rva2VuLFxuXHRcdFx0XHRleHBpcmVzQXQ6IGNoYXJhY3Rlci5leHBpcmVzQXQuZ2V0VGltZSgpLFxuXHRcdFx0XHRyZWZyZXNoVG9rZW46IGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4sXG5cdFx0XHRcdHVwZGF0ZWRBdDogRGF0ZS5ub3coKVxuXHRcdFx0fVxuXHRcdH0pLnJ1bigpO1xuXHRcdHJldHVybiBDaGFyYWN0ZXJIZWxwZXIuZmluZEJ5VXNlckFuZEV2ZUlEKGNoYXJhY3Rlci51c2VySUQsIGNoYXJhY3Rlci5ldmVJRCk7XG5cdH1cblx0c3RhdGljIGRlbGV0ZShjaGFyYWN0ZXIpIHtcblx0XHRkYi5kZWxldGUoY2hhcmFjdGVycykud2hlcmUoZXEoY2hhcmFjdGVycy5pZCwgY2hhcmFjdGVyLmlkKSkucnVuKCk7XG5cdH1cblx0c3RhdGljIGFzeW5jIHJlZnJlc2hUb2tlbnMoY2hhcmFjdGVyLCBzY29wZXMpIHtcblx0XHRjb25zdCB0b2tlbnMgPSBhd2FpdCByZWZyZXNoKHsgcmVmcmVzaF90b2tlbjogY2hhcmFjdGVyLnJlZnJlc2hUb2tlbiB9LCBzY29wZXMpO1xuXHRcdGNvbnN0IGRlY29kZWQgPSBhd2FpdCB2YWxpZGF0ZVRva2VuKHRva2Vucy5hY2Nlc3NfdG9rZW4pO1xuXHRcdGlmICghZGVjb2RlZCkge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHZhbGlkYXRlIHRva2VuIGZvciBjaGFyYWN0ZXIgJHtjaGFyYWN0ZXIuZXZlSUR9YCk7XG5cdFx0XHRyZXR1cm4gY2hhcmFjdGVyO1xuXHRcdH1cblx0XHRjaGFyYWN0ZXIuYWNjZXNzVG9rZW4gPSB0b2tlbnMuYWNjZXNzX3Rva2VuO1xuXHRcdGNoYXJhY3Rlci5leHBpcmVzQXQgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgdG9rZW5zLmV4cGlyZXNfaW4gKiAxZTMpO1xuXHRcdGNoYXJhY3Rlci5yZWZyZXNoVG9rZW4gPSB0b2tlbnMucmVmcmVzaF90b2tlbjtcblx0XHR0aGlzLnNhdmUoY2hhcmFjdGVyKTtcblx0XHRyZXR1cm4gY2hhcmFjdGVyO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IENoYXJhY3RlckhlbHBlciB9OyIsCiAgICAiaW1wb3J0IHsgY2hhcmFjdGVycywgdXNlcnMgfSBmcm9tIFwiLi4vc2NoZW1hLmpzXCI7XG5pbXBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIgfSBmcm9tIFwiLi9jaGFyYWN0ZXIubW9kZWwuanNcIjtcbmltcG9ydCB7IGRiIH0gZnJvbSBcIi4uL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBlcSwgc3FsIH0gZnJvbSBcImRyaXp6bGUtb3JtXCI7XG5cbi8vI3JlZ2lvbiBzcmMvZGIvbW9kZWxzL3VzZXIubW9kZWwudHNcbnZhciBVc2VySGVscGVyID0gY2xhc3Mge1xuXHRzdGF0aWMgZmluZChpZCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGRiLnNlbGVjdCh7XG5cdFx0XHRpZDogdXNlcnMuaWQsXG5cdFx0XHRkaXNjb3JkSUQ6IHVzZXJzLmRpc2NvcmRJRCxcblx0XHRcdGNyZWF0ZWRBdDogdXNlcnMuY3JlYXRlZEF0LFxuXHRcdFx0dXBkYXRlZEF0OiB1c2Vycy51cGRhdGVkQXQsXG5cdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHVzZXJzLm1haW5DaGFyYWN0ZXIsXG5cdFx0XHRjaGFyYWN0ZXJJRHNTdHJpbmc6IHNxbGBqc29uX2dyb3VwX2FycmF5KGNoYXJhY3RlcnMuaWQpYFxuXHRcdH0pLmZyb20odXNlcnMpLndoZXJlKGVxKHVzZXJzLmlkLCBpZCkpLmxlZnRKb2luKGNoYXJhY3RlcnMsIGVxKHVzZXJzLmlkLCBjaGFyYWN0ZXJzLnVzZXJJRCkpLmdldCgpO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUZyb21RdWVyeShyZXN1bHQpO1xuXHR9XG5cdHN0YXRpYyBmaW5kQnlEaXNjb3JkSWQoaWQpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3Qoe1xuXHRcdFx0aWQ6IHVzZXJzLmlkLFxuXHRcdFx0ZGlzY29yZElEOiB1c2Vycy5kaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IHVzZXJzLmNyZWF0ZWRBdCxcblx0XHRcdHVwZGF0ZWRBdDogdXNlcnMudXBkYXRlZEF0LFxuXHRcdFx0bWFpbkNoYXJhY3RlcklEOiB1c2Vycy5tYWluQ2hhcmFjdGVyLFxuXHRcdFx0Y2hhcmFjdGVySURzU3RyaW5nOiBzcWxganNvbl9ncm91cF9hcnJheShjaGFyYWN0ZXJzLmlkKWBcblx0XHR9KS5mcm9tKHVzZXJzKS53aGVyZShlcSh1c2Vycy5kaXNjb3JkSUQsIGlkKSkubGVmdEpvaW4oY2hhcmFjdGVycywgZXEodXNlcnMuaWQsIGNoYXJhY3RlcnMudXNlcklEKSkuZ2V0KCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRnJvbVF1ZXJ5KHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGZpbmRBbGwoKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KHtcblx0XHRcdGlkOiB1c2Vycy5pZCxcblx0XHRcdGRpc2NvcmRJRDogdXNlcnMuZGlzY29yZElELFxuXHRcdFx0Y3JlYXRlZEF0OiB1c2Vycy5jcmVhdGVkQXQsXG5cdFx0XHR1cGRhdGVkQXQ6IHVzZXJzLnVwZGF0ZWRBdCxcblx0XHRcdG1haW5DaGFyYWN0ZXJJRDogdXNlcnMubWFpbkNoYXJhY3Rlcixcblx0XHRcdGNoYXJhY3RlcklEc1N0cmluZzogc3FsYGpzb25fZ3JvdXBfYXJyYXkoY2hhcmFjdGVycy5pZClgXG5cdFx0fSkuZnJvbSh1c2VycykubGVmdEpvaW4oY2hhcmFjdGVycywgZXEodXNlcnMuaWQsIGNoYXJhY3RlcnMudXNlcklEKSkuYWxsKCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRnJvbVF1ZXJ5KHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGZpbmRCeUNoYXJhY3RlcklkKGlkKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KHtcblx0XHRcdGlkOiB1c2Vycy5pZCxcblx0XHRcdGRpc2NvcmRJRDogdXNlcnMuZGlzY29yZElELFxuXHRcdFx0Y3JlYXRlZEF0OiB1c2Vycy5jcmVhdGVkQXQsXG5cdFx0XHR1cGRhdGVkQXQ6IHVzZXJzLnVwZGF0ZWRBdCxcblx0XHRcdG1haW5DaGFyYWN0ZXJJRDogdXNlcnMubWFpbkNoYXJhY3Rlcixcblx0XHRcdGNoYXJhY3RlcklEc1N0cmluZzogc3FsYGpzb25fZ3JvdXBfYXJyYXkoY2hhcmFjdGVycy5pZClgXG5cdFx0fSkuZnJvbSh1c2VycykubGVmdEpvaW4oY2hhcmFjdGVycywgZXEodXNlcnMuaWQsIGNoYXJhY3RlcnMudXNlcklEKSkud2hlcmUoZXEoY2hhcmFjdGVycy5pZCwgaWQpKS5hbGwoKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVGcm9tUXVlcnkocmVzdWx0KTtcblx0fVxuXHRzdGF0aWMgZmluZEJ5Q2hhcmFjdGVyTmFtZShuYW1lKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZGIuc2VsZWN0KHtcblx0XHRcdGlkOiB1c2Vycy5pZCxcblx0XHRcdGRpc2NvcmRJRDogdXNlcnMuZGlzY29yZElELFxuXHRcdFx0Y3JlYXRlZEF0OiB1c2Vycy5jcmVhdGVkQXQsXG5cdFx0XHR1cGRhdGVkQXQ6IHVzZXJzLnVwZGF0ZWRBdCxcblx0XHRcdG1haW5DaGFyYWN0ZXJJRDogdXNlcnMubWFpbkNoYXJhY3Rlcixcblx0XHRcdGNoYXJhY3RlcklEc1N0cmluZzogc3FsYGpzb25fZ3JvdXBfYXJyYXkoY2hhcmFjdGVycy5pZClgXG5cdFx0fSkuZnJvbSh1c2VycykubGVmdEpvaW4oY2hhcmFjdGVycywgZXEodXNlcnMuaWQsIGNoYXJhY3RlcnMudXNlcklEKSkud2hlcmUoZXEoY2hhcmFjdGVycy5uYW1lLCBuYW1lKSkuYWxsKCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRnJvbVF1ZXJ5KHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGNyZWF0ZUZyb21RdWVyeShxdWVyeSkge1xuXHRcdGlmICghcXVlcnkpIHJldHVybiBbXTtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShxdWVyeSkpIHJldHVybiBxdWVyeS5tYXAoKHVzZXIpID0+IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGlkOiB1c2VyLmlkLFxuXHRcdFx0XHRkaXNjb3JkSUQ6IHVzZXIuZGlzY29yZElELFxuXHRcdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKHVzZXIuY3JlYXRlZEF0KSxcblx0XHRcdFx0dXBkYXRlZEF0OiBuZXcgRGF0ZSh1c2VyLnVwZGF0ZWRBdCksXG5cdFx0XHRcdGNoYXJhY3RlcklEczogdXNlci5jaGFyYWN0ZXJJRHNTdHJpbmcgPyBKU09OLnBhcnNlKHVzZXIuY2hhcmFjdGVySURzU3RyaW5nID8/IFwiW11cIikubWFwKChzKSA9PiBOdW1iZXIocykpLnNvcnQoKSA6IFtdLFxuXHRcdFx0XHRtYWluQ2hhcmFjdGVySUQ6IHVzZXIubWFpbkNoYXJhY3RlcklEXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHRcdGVsc2UgcmV0dXJuIHtcblx0XHRcdGlkOiBxdWVyeS5pZCxcblx0XHRcdGRpc2NvcmRJRDogcXVlcnkuZGlzY29yZElELFxuXHRcdFx0Y3JlYXRlZEF0OiBuZXcgRGF0ZShxdWVyeS5jcmVhdGVkQXQpLFxuXHRcdFx0dXBkYXRlZEF0OiBuZXcgRGF0ZShxdWVyeS51cGRhdGVkQXQpLFxuXHRcdFx0Y2hhcmFjdGVySURzOiBxdWVyeS5jaGFyYWN0ZXJJRHNTdHJpbmcgPyBKU09OLnBhcnNlKHF1ZXJ5LmNoYXJhY3RlcklEc1N0cmluZyA/PyBcIltdXCIpLm1hcCgocykgPT4gTnVtYmVyKHMpKS5zb3J0KCkgOiBbXSxcblx0XHRcdG1haW5DaGFyYWN0ZXJJRDogcXVlcnkubWFpbkNoYXJhY3RlcklEXG5cdFx0fTtcblx0fVxuXHRzdGF0aWMgY3JlYXRlKGRpc2NvcmRJRCkge1xuXHRcdHRoaXMuc2F2ZSh7XG5cdFx0XHRkaXNjb3JkSUQsXG5cdFx0XHRjcmVhdGVkQXQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpLFxuXHRcdFx0dXBkYXRlZEF0OiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKVxuXHRcdH0pO1xuXHRcdHJldHVybiB0aGlzLmZpbmRCeURpc2NvcmRJZChkaXNjb3JkSUQpO1xuXHR9XG5cdHN0YXRpYyBzYXZlKHVzZXIpIHtcblx0XHRkYi5pbnNlcnQodXNlcnMpLnZhbHVlcyh7XG5cdFx0XHRpZDogdXNlci5pZCxcblx0XHRcdGRpc2NvcmRJRDogdXNlci5kaXNjb3JkSUQsXG5cdFx0XHRtYWluQ2hhcmFjdGVyOiB1c2VyLm1haW5DaGFyYWN0ZXJJRCxcblx0XHRcdGNyZWF0ZWRBdDogdXNlci5jcmVhdGVkQXQuZ2V0VGltZSgpLFxuXHRcdFx0dXBkYXRlZEF0OiB1c2VyLnVwZGF0ZWRBdC5nZXRUaW1lKClcblx0XHR9KS5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuXHRcdFx0dGFyZ2V0OiB1c2Vycy5pZCxcblx0XHRcdHNldDoge1xuXHRcdFx0XHRkaXNjb3JkSUQ6IHVzZXIuZGlzY29yZElELFxuXHRcdFx0XHRtYWluQ2hhcmFjdGVyOiB1c2VyLm1haW5DaGFyYWN0ZXJJRCxcblx0XHRcdFx0dXBkYXRlZEF0OiB1c2VyLnVwZGF0ZWRBdC5nZXRUaW1lKClcblx0XHRcdH1cblx0XHR9KS5ydW4oKTtcblx0XHRyZXR1cm4gdXNlcjtcblx0fVxuXHRzdGF0aWMgZGVsZXRlKHVzZXIpIHtcblx0XHRkYi5kZWxldGUodXNlcnMpLndoZXJlKGVxKHVzZXJzLmlkLCB1c2VyLmlkKSkucnVuKCk7XG5cdH1cblx0c3RhdGljIGdldENoYXJhY3Rlcih1c2VyLCBpbmRleCkge1xuXHRcdGlmICghdXNlci5jaGFyYWN0ZXJJRHMpIHJldHVybiB2b2lkIDA7XG5cdFx0aWYgKGluZGV4ID49IHVzZXIuY2hhcmFjdGVySURzLmxlbmd0aCkgcmV0dXJuIHZvaWQgMDtcblx0XHRyZXR1cm4gQ2hhcmFjdGVySGVscGVyLmZpbmQodXNlci5jaGFyYWN0ZXJJRHNbaW5kZXhdKTtcblx0fVxufTtcblxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBVc2VySGVscGVyIH07IiwKICAgICJpbXBvcnQgeyByZXN1bWVDb21tYW5kcyB9IGZyb20gXCIuLi9zY2hlbWEuanNcIjtcbmltcG9ydCB7IGRiIH0gZnJvbSBcIi4uL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBlcSB9IGZyb20gXCJkcml6emxlLW9ybVwiO1xuXG4vLyNyZWdpb24gc3JjL2RiL21vZGVscy9yZXN1bWUtY29tbWFuZC5tb2RlbC50c1xudmFyIFJlc3VtZUNvbW1hbmQgPSBjbGFzcyBSZXN1bWVDb21tYW5kIHtcblx0aWQ7XG5cdGNvbW1hbmQ7XG5cdHBhcmFtcztcblx0Y29udGV4dDtcblx0Y3JlYXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpO1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLmNyZWF0ZWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTtcblx0fVxuXHRzdGF0aWMgZmluZChtZXNzYWdlSWQpIHtcblx0XHRjb25zdCByZXN1bHQgPSBkYi5zZWxlY3QoKS5mcm9tKHJlc3VtZUNvbW1hbmRzKS53aGVyZShlcShyZXN1bWVDb21tYW5kcy5pZCwgbWVzc2FnZUlkKSkuZ2V0KCk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRnJvbVF1ZXJ5KHJlc3VsdCk7XG5cdH1cblx0c3RhdGljIGNyZWF0ZShtZXNzYWdlSWQsIGNvbW1hbmQsIHBhcmFtcyA9IHt9LCBjb250ZXh0ID0ge30pIHtcblx0XHRjb25zdCByZXN1bWUgPSBuZXcgUmVzdW1lQ29tbWFuZCgpO1xuXHRcdHJlc3VtZS5pZCA9IG1lc3NhZ2VJZDtcblx0XHRyZXN1bWUuY29tbWFuZCA9IGNvbW1hbmQ7XG5cdFx0cmVzdW1lLnBhcmFtcyA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcyk7XG5cdFx0cmVzdW1lLmNvbnRleHQgPSBKU09OLnN0cmluZ2lmeShjb250ZXh0KTtcblx0XHRyZXR1cm4gcmVzdW1lO1xuXHR9XG5cdHN0YXRpYyBjcmVhdGVGcm9tUXVlcnkocXVlcnkpIHtcblx0XHRpZiAoIXF1ZXJ5KSByZXR1cm4gbnVsbDtcblx0XHRjb25zdCByZXN1bWUgPSBuZXcgUmVzdW1lQ29tbWFuZCgpO1xuXHRcdHJlc3VtZS5pZCA9IHF1ZXJ5LmlkO1xuXHRcdHJlc3VtZS5jb21tYW5kID0gcXVlcnkuY29tbWFuZDtcblx0XHRyZXN1bWUucGFyYW1zID0gcXVlcnkucGFyYW1zO1xuXHRcdHJlc3VtZS5jb250ZXh0ID0gcXVlcnkuY29udGV4dDtcblx0XHRyZXN1bWUuY3JlYXRlZCA9IHF1ZXJ5LmNyZWF0ZWQ7XG5cdFx0cmV0dXJuIHJlc3VtZTtcblx0fVxuXHRzYXZlKCkge1xuXHRcdGRiLmluc2VydChyZXN1bWVDb21tYW5kcykudmFsdWVzKHtcblx0XHRcdGlkOiB0aGlzLmlkLFxuXHRcdFx0Y29tbWFuZDogdGhpcy5jb21tYW5kLFxuXHRcdFx0cGFyYW1zOiB0aGlzLnBhcmFtcyxcblx0XHRcdGNvbnRleHQ6IHRoaXMuY29udGV4dCxcblx0XHRcdGNyZWF0ZWRBdDogdGhpcy5jcmVhdGVkLmdldFRpbWUoKVxuXHRcdH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG5cdFx0XHR0YXJnZXQ6IHJlc3VtZUNvbW1hbmRzLmlkLFxuXHRcdFx0c2V0OiB7XG5cdFx0XHRcdGNvbW1hbmQ6IHRoaXMuY29tbWFuZCxcblx0XHRcdFx0cGFyYW1zOiB0aGlzLnBhcmFtcyxcblx0XHRcdFx0Y29udGV4dDogdGhpcy5jb250ZXh0XG5cdFx0XHR9XG5cdFx0fSkucnVuKCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0ZGVsZXRlKCkge1xuXHRcdGRiLmRlbGV0ZShyZXN1bWVDb21tYW5kcykud2hlcmUoZXEocmVzdW1lQ29tbWFuZHMuaWQsIHRoaXMuaWQpKS5ydW4oKTtcblx0fVxuXHRzdGF0aWMgZGVsZXRlKG1lc3NhZ2VJZCkge1xuXHRcdGRiLmRlbGV0ZShyZXN1bWVDb21tYW5kcykud2hlcmUoZXEocmVzdW1lQ29tbWFuZHMuaWQsIG1lc3NhZ2VJZCkpLnJ1bigpO1xuXHR9XG59O1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IFJlc3VtZUNvbW1hbmQgfTsiLAogICAgImltcG9ydCB7IF9fZXhwb3J0IH0gZnJvbSBcIi4uLy4uL192aXJ0dWFsL3JvbGxkb3duX3J1bnRpbWUuanNcIjtcbmltcG9ydCB7IENoYXJhY3RlckhlbHBlciB9IGZyb20gXCIuL2NoYXJhY3Rlci5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgVXNlckhlbHBlciB9IGZyb20gXCIuL3VzZXIubW9kZWwuanNcIjtcbmltcG9ydCB7IFJlc3VtZUNvbW1hbmQgfSBmcm9tIFwiLi9yZXN1bWUtY29tbWFuZC5tb2RlbC5qc1wiO1xuXG4vLyNyZWdpb24gc3JjL2RiL21vZGVscy9pbmRleC50c1xudmFyIG1vZGVsc19leHBvcnRzID0ge307XG5fX2V4cG9ydChtb2RlbHNfZXhwb3J0cywge1xuXHRDaGFyYWN0ZXJIZWxwZXI6ICgpID0+IENoYXJhY3RlckhlbHBlcixcblx0UmVzdW1lQ29tbWFuZDogKCkgPT4gUmVzdW1lQ29tbWFuZCxcblx0VXNlckhlbHBlcjogKCkgPT4gVXNlckhlbHBlclxufSk7XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgbW9kZWxzX2V4cG9ydHMgfTsiLAogICAgImltcG9ydCB7IERhdGFiYXNlIH0gZnJvbSBcImJ1bjpzcWxpdGVcIjtcbmltcG9ydCB7IGVudGl0eUtpbmQgfSBmcm9tIFwiLi4vZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBEZWZhdWx0TG9nZ2VyIH0gZnJvbSBcIi4uL2xvZ2dlci5qc1wiO1xuaW1wb3J0IHtcbiAgY3JlYXRlVGFibGVSZWxhdGlvbnNIZWxwZXJzLFxuICBleHRyYWN0VGFibGVzUmVsYXRpb25hbENvbmZpZ1xufSBmcm9tIFwiLi4vcmVsYXRpb25zLmpzXCI7XG5pbXBvcnQgeyBCYXNlU1FMaXRlRGF0YWJhc2UgfSBmcm9tIFwiLi4vc3FsaXRlLWNvcmUvZGIuanNcIjtcbmltcG9ydCB7IFNRTGl0ZVN5bmNEaWFsZWN0IH0gZnJvbSBcIi4uL3NxbGl0ZS1jb3JlL2RpYWxlY3QuanNcIjtcbmltcG9ydCB7IGlzQ29uZmlnIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTUUxpdGVCdW5TZXNzaW9uIH0gZnJvbSBcIi4vc2Vzc2lvbi5qc1wiO1xuY2xhc3MgQnVuU1FMaXRlRGF0YWJhc2UgZXh0ZW5kcyBCYXNlU1FMaXRlRGF0YWJhc2Uge1xuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJCdW5TUUxpdGVEYXRhYmFzZVwiO1xufVxuZnVuY3Rpb24gY29uc3RydWN0KGNsaWVudCwgY29uZmlnID0ge30pIHtcbiAgY29uc3QgZGlhbGVjdCA9IG5ldyBTUUxpdGVTeW5jRGlhbGVjdCh7IGNhc2luZzogY29uZmlnLmNhc2luZyB9KTtcbiAgbGV0IGxvZ2dlcjtcbiAgaWYgKGNvbmZpZy5sb2dnZXIgPT09IHRydWUpIHtcbiAgICBsb2dnZXIgPSBuZXcgRGVmYXVsdExvZ2dlcigpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5sb2dnZXIgIT09IGZhbHNlKSB7XG4gICAgbG9nZ2VyID0gY29uZmlnLmxvZ2dlcjtcbiAgfVxuICBsZXQgc2NoZW1hO1xuICBpZiAoY29uZmlnLnNjaGVtYSkge1xuICAgIGNvbnN0IHRhYmxlc0NvbmZpZyA9IGV4dHJhY3RUYWJsZXNSZWxhdGlvbmFsQ29uZmlnKFxuICAgICAgY29uZmlnLnNjaGVtYSxcbiAgICAgIGNyZWF0ZVRhYmxlUmVsYXRpb25zSGVscGVyc1xuICAgICk7XG4gICAgc2NoZW1hID0ge1xuICAgICAgZnVsbFNjaGVtYTogY29uZmlnLnNjaGVtYSxcbiAgICAgIHNjaGVtYTogdGFibGVzQ29uZmlnLnRhYmxlcyxcbiAgICAgIHRhYmxlTmFtZXNNYXA6IHRhYmxlc0NvbmZpZy50YWJsZU5hbWVzTWFwXG4gICAgfTtcbiAgfVxuICBjb25zdCBzZXNzaW9uID0gbmV3IFNRTGl0ZUJ1blNlc3Npb24oY2xpZW50LCBkaWFsZWN0LCBzY2hlbWEsIHsgbG9nZ2VyIH0pO1xuICBjb25zdCBkYiA9IG5ldyBCdW5TUUxpdGVEYXRhYmFzZShcInN5bmNcIiwgZGlhbGVjdCwgc2Vzc2lvbiwgc2NoZW1hKTtcbiAgZGIuJGNsaWVudCA9IGNsaWVudDtcbiAgcmV0dXJuIGRiO1xufVxuZnVuY3Rpb24gZHJpenpsZSguLi5wYXJhbXMpIHtcbiAgaWYgKHBhcmFtc1swXSA9PT0gdm9pZCAwIHx8IHR5cGVvZiBwYXJhbXNbMF0gPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IHBhcmFtc1swXSA9PT0gdm9pZCAwID8gbmV3IERhdGFiYXNlKCkgOiBuZXcgRGF0YWJhc2UocGFyYW1zWzBdKTtcbiAgICByZXR1cm4gY29uc3RydWN0KGluc3RhbmNlLCBwYXJhbXNbMV0pO1xuICB9XG4gIGlmIChpc0NvbmZpZyhwYXJhbXNbMF0pKSB7XG4gICAgY29uc3QgeyBjb25uZWN0aW9uLCBjbGllbnQsIC4uLmRyaXp6bGVDb25maWcgfSA9IHBhcmFtc1swXTtcbiAgICBpZiAoY2xpZW50KSByZXR1cm4gY29uc3RydWN0KGNsaWVudCwgZHJpenpsZUNvbmZpZyk7XG4gICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCB7IHNvdXJjZSwgLi4ub3B0cyB9ID0gY29ubmVjdGlvbjtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBPYmplY3QudmFsdWVzKG9wdHMpLmZpbHRlcigodikgPT4gdiAhPT0gdm9pZCAwKS5sZW5ndGggPyBvcHRzIDogdm9pZCAwO1xuICAgICAgY29uc3QgaW5zdGFuY2UyID0gbmV3IERhdGFiYXNlKHNvdXJjZSwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gY29uc3RydWN0KGluc3RhbmNlMiwgZHJpenpsZUNvbmZpZyk7XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERhdGFiYXNlKGNvbm5lY3Rpb24pO1xuICAgIHJldHVybiBjb25zdHJ1Y3QoaW5zdGFuY2UsIGRyaXp6bGVDb25maWcpO1xuICB9XG4gIHJldHVybiBjb25zdHJ1Y3QocGFyYW1zWzBdLCBwYXJhbXNbMV0pO1xufVxuKChkcml6emxlMikgPT4ge1xuICBmdW5jdGlvbiBtb2NrKGNvbmZpZykge1xuICAgIHJldHVybiBjb25zdHJ1Y3Qoe30sIGNvbmZpZyk7XG4gIH1cbiAgZHJpenpsZTIubW9jayA9IG1vY2s7XG59KShkcml6emxlIHx8IChkcml6emxlID0ge30pKTtcbmV4cG9ydCB7XG4gIEJ1blNRTGl0ZURhdGFiYXNlLFxuICBkcml6emxlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZHJpdmVyLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgZW50aXR5S2luZCB9IGZyb20gXCIuLi9lbnRpdHkuanNcIjtcbmltcG9ydCB7IE5vb3BMb2dnZXIgfSBmcm9tIFwiLi4vbG9nZ2VyLmpzXCI7XG5pbXBvcnQgeyBmaWxsUGxhY2Vob2xkZXJzLCBzcWwgfSBmcm9tIFwiLi4vc3FsL3NxbC5qc1wiO1xuaW1wb3J0IHsgU1FMaXRlVHJhbnNhY3Rpb24gfSBmcm9tIFwiLi4vc3FsaXRlLWNvcmUvaW5kZXguanNcIjtcbmltcG9ydCB7IFNRTGl0ZVByZXBhcmVkUXVlcnkgYXMgUHJlcGFyZWRRdWVyeUJhc2UsIFNRTGl0ZVNlc3Npb24gfSBmcm9tIFwiLi4vc3FsaXRlLWNvcmUvc2Vzc2lvbi5qc1wiO1xuaW1wb3J0IHsgbWFwUmVzdWx0Um93IH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5jbGFzcyBTUUxpdGVCdW5TZXNzaW9uIGV4dGVuZHMgU1FMaXRlU2Vzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKGNsaWVudCwgZGlhbGVjdCwgc2NoZW1hLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihkaWFsZWN0KTtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyID8/IG5ldyBOb29wTG9nZ2VyKCk7XG4gIH1cbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQnVuU2Vzc2lvblwiO1xuICBsb2dnZXI7XG4gIGV4ZWMocXVlcnkpIHtcbiAgICB0aGlzLmNsaWVudC5leGVjKHF1ZXJ5KTtcbiAgfVxuICBwcmVwYXJlUXVlcnkocXVlcnksIGZpZWxkcywgZXhlY3V0ZU1ldGhvZCwgaXNSZXNwb25zZUluQXJyYXlNb2RlLCBjdXN0b21SZXN1bHRNYXBwZXIpIHtcbiAgICBjb25zdCBzdG10ID0gdGhpcy5jbGllbnQucHJlcGFyZShxdWVyeS5zcWwpO1xuICAgIHJldHVybiBuZXcgUHJlcGFyZWRRdWVyeShcbiAgICAgIHN0bXQsXG4gICAgICBxdWVyeSxcbiAgICAgIHRoaXMubG9nZ2VyLFxuICAgICAgZmllbGRzLFxuICAgICAgZXhlY3V0ZU1ldGhvZCxcbiAgICAgIGlzUmVzcG9uc2VJbkFycmF5TW9kZSxcbiAgICAgIGN1c3RvbVJlc3VsdE1hcHBlclxuICAgICk7XG4gIH1cbiAgdHJhbnNhY3Rpb24odHJhbnNhY3Rpb24sIGNvbmZpZyA9IHt9KSB7XG4gICAgY29uc3QgdHggPSBuZXcgU1FMaXRlQnVuVHJhbnNhY3Rpb24oXCJzeW5jXCIsIHRoaXMuZGlhbGVjdCwgdGhpcywgdGhpcy5zY2hlbWEpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgY29uc3QgbmF0aXZlVHggPSB0aGlzLmNsaWVudC50cmFuc2FjdGlvbigoKSA9PiB7XG4gICAgICByZXN1bHQgPSB0cmFuc2FjdGlvbih0eCk7XG4gICAgfSk7XG4gICAgbmF0aXZlVHhbY29uZmlnLmJlaGF2aW9yID8/IFwiZGVmZXJyZWRcIl0oKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5jbGFzcyBTUUxpdGVCdW5UcmFuc2FjdGlvbiBleHRlbmRzIFNRTGl0ZVRyYW5zYWN0aW9uIHtcbiAgc3RhdGljIFtlbnRpdHlLaW5kXSA9IFwiU1FMaXRlQnVuVHJhbnNhY3Rpb25cIjtcbiAgdHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgICBjb25zdCBzYXZlcG9pbnROYW1lID0gYHNwJHt0aGlzLm5lc3RlZEluZGV4fWA7XG4gICAgY29uc3QgdHggPSBuZXcgU1FMaXRlQnVuVHJhbnNhY3Rpb24oXCJzeW5jXCIsIHRoaXMuZGlhbGVjdCwgdGhpcy5zZXNzaW9uLCB0aGlzLnNjaGVtYSwgdGhpcy5uZXN0ZWRJbmRleCArIDEpO1xuICAgIHRoaXMuc2Vzc2lvbi5ydW4oc3FsLnJhdyhgc2F2ZXBvaW50ICR7c2F2ZXBvaW50TmFtZX1gKSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRyYW5zYWN0aW9uKHR4KTtcbiAgICAgIHRoaXMuc2Vzc2lvbi5ydW4oc3FsLnJhdyhgcmVsZWFzZSBzYXZlcG9pbnQgJHtzYXZlcG9pbnROYW1lfWApKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLnNlc3Npb24ucnVuKHNxbC5yYXcoYHJvbGxiYWNrIHRvIHNhdmVwb2ludCAke3NhdmVwb2ludE5hbWV9YCkpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgUHJlcGFyZWRRdWVyeSBleHRlbmRzIFByZXBhcmVkUXVlcnlCYXNlIHtcbiAgY29uc3RydWN0b3Ioc3RtdCwgcXVlcnksIGxvZ2dlciwgZmllbGRzLCBleGVjdXRlTWV0aG9kLCBfaXNSZXNwb25zZUluQXJyYXlNb2RlLCBjdXN0b21SZXN1bHRNYXBwZXIpIHtcbiAgICBzdXBlcihcInN5bmNcIiwgZXhlY3V0ZU1ldGhvZCwgcXVlcnkpO1xuICAgIHRoaXMuc3RtdCA9IHN0bXQ7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XG4gICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7XG4gICAgdGhpcy5faXNSZXNwb25zZUluQXJyYXlNb2RlID0gX2lzUmVzcG9uc2VJbkFycmF5TW9kZTtcbiAgICB0aGlzLmN1c3RvbVJlc3VsdE1hcHBlciA9IGN1c3RvbVJlc3VsdE1hcHBlcjtcbiAgfVxuICBzdGF0aWMgW2VudGl0eUtpbmRdID0gXCJTUUxpdGVCdW5QcmVwYXJlZFF1ZXJ5XCI7XG4gIHJ1bihwbGFjZWhvbGRlclZhbHVlcykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGZpbGxQbGFjZWhvbGRlcnModGhpcy5xdWVyeS5wYXJhbXMsIHBsYWNlaG9sZGVyVmFsdWVzID8/IHt9KTtcbiAgICB0aGlzLmxvZ2dlci5sb2dRdWVyeSh0aGlzLnF1ZXJ5LnNxbCwgcGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcy5zdG10LnJ1biguLi5wYXJhbXMpO1xuICB9XG4gIGFsbChwbGFjZWhvbGRlclZhbHVlcykge1xuICAgIGNvbnN0IHsgZmllbGRzLCBxdWVyeSwgbG9nZ2VyLCBqb2luc05vdE51bGxhYmxlTWFwLCBzdG10LCBjdXN0b21SZXN1bHRNYXBwZXIgfSA9IHRoaXM7XG4gICAgaWYgKCFmaWVsZHMgJiYgIWN1c3RvbVJlc3VsdE1hcHBlcikge1xuICAgICAgY29uc3QgcGFyYW1zID0gZmlsbFBsYWNlaG9sZGVycyhxdWVyeS5wYXJhbXMsIHBsYWNlaG9sZGVyVmFsdWVzID8/IHt9KTtcbiAgICAgIGxvZ2dlci5sb2dRdWVyeShxdWVyeS5zcWwsIHBhcmFtcyk7XG4gICAgICByZXR1cm4gc3RtdC5hbGwoLi4ucGFyYW1zKTtcbiAgICB9XG4gICAgY29uc3Qgcm93cyA9IHRoaXMudmFsdWVzKHBsYWNlaG9sZGVyVmFsdWVzKTtcbiAgICBpZiAoY3VzdG9tUmVzdWx0TWFwcGVyKSB7XG4gICAgICByZXR1cm4gY3VzdG9tUmVzdWx0TWFwcGVyKHJvd3MpO1xuICAgIH1cbiAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gbWFwUmVzdWx0Um93KGZpZWxkcywgcm93LCBqb2luc05vdE51bGxhYmxlTWFwKSk7XG4gIH1cbiAgZ2V0KHBsYWNlaG9sZGVyVmFsdWVzKSB7XG4gICAgY29uc3QgcGFyYW1zID0gZmlsbFBsYWNlaG9sZGVycyh0aGlzLnF1ZXJ5LnBhcmFtcywgcGxhY2Vob2xkZXJWYWx1ZXMgPz8ge30pO1xuICAgIHRoaXMubG9nZ2VyLmxvZ1F1ZXJ5KHRoaXMucXVlcnkuc3FsLCBwYXJhbXMpO1xuICAgIGNvbnN0IHJvdyA9IHRoaXMuc3RtdC52YWx1ZXMoLi4ucGFyYW1zKVswXTtcbiAgICBpZiAoIXJvdykge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG4gICAgY29uc3QgeyBmaWVsZHMsIGpvaW5zTm90TnVsbGFibGVNYXAsIGN1c3RvbVJlc3VsdE1hcHBlciB9ID0gdGhpcztcbiAgICBpZiAoIWZpZWxkcyAmJiAhY3VzdG9tUmVzdWx0TWFwcGVyKSB7XG4gICAgICByZXR1cm4gcm93O1xuICAgIH1cbiAgICBpZiAoY3VzdG9tUmVzdWx0TWFwcGVyKSB7XG4gICAgICByZXR1cm4gY3VzdG9tUmVzdWx0TWFwcGVyKFtyb3ddKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcFJlc3VsdFJvdyhmaWVsZHMsIHJvdywgam9pbnNOb3ROdWxsYWJsZU1hcCk7XG4gIH1cbiAgdmFsdWVzKHBsYWNlaG9sZGVyVmFsdWVzKSB7XG4gICAgY29uc3QgcGFyYW1zID0gZmlsbFBsYWNlaG9sZGVycyh0aGlzLnF1ZXJ5LnBhcmFtcywgcGxhY2Vob2xkZXJWYWx1ZXMgPz8ge30pO1xuICAgIHRoaXMubG9nZ2VyLmxvZ1F1ZXJ5KHRoaXMucXVlcnkuc3FsLCBwYXJhbXMpO1xuICAgIHJldHVybiB0aGlzLnN0bXQudmFsdWVzKC4uLnBhcmFtcyk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBpc1Jlc3BvbnNlSW5BcnJheU1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmVzcG9uc2VJbkFycmF5TW9kZTtcbiAgfVxufVxuZXhwb3J0IHtcbiAgUHJlcGFyZWRRdWVyeSxcbiAgU1FMaXRlQnVuU2Vzc2lvbixcbiAgU1FMaXRlQnVuVHJhbnNhY3Rpb25cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXNzaW9uLmpzLm1hcCIsCiAgICAiaW1wb3J0IHsgY2hhcmFjdGVycywgbWluaW5nRmxlZXRQYXJ0aWNpcGFudHMsIG1pbmluZ0ZsZWV0cywgcmVzdW1lQ29tbWFuZHMsIHNjaGVtYV9leHBvcnRzLCB1c2VycyB9IGZyb20gXCIuL3NjaGVtYS5qc1wiO1xuaW1wb3J0IHsgQ2hhcmFjdGVySGVscGVyIH0gZnJvbSBcIi4vbW9kZWxzL2NoYXJhY3Rlci5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgVXNlckhlbHBlciB9IGZyb20gXCIuL21vZGVscy91c2VyLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBSZXN1bWVDb21tYW5kIH0gZnJvbSBcIi4vbW9kZWxzL3Jlc3VtZS1jb21tYW5kLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBtb2RlbHNfZXhwb3J0cyB9IGZyb20gXCIuL21vZGVscy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZHJpenpsZSB9IGZyb20gXCJkcml6emxlLW9ybS9idW4tc3FsaXRlXCI7XG5pbXBvcnQgeyBEYXRhYmFzZSB9IGZyb20gXCJidW46c3FsaXRlXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG4vLyNyZWdpb24gc3JjL2RiL2luZGV4LnRzXG5jb25zdCBEQl9QQVRIID0gcHJvY2Vzcy5lbnYuQVVUSF9EQl9QQVRIIHx8IGpvaW4ocHJvY2Vzcy5jd2QoKSwgXCIuLi8uLi9kYi9raXR0ZW4uZGJcIik7XG5jb25zb2xlLmxvZyhcIlVzaW5nIERCX1BBVEg6XCIsIERCX1BBVEgpO1xuY29uc3Qgc3FsaXRlID0gbmV3IERhdGFiYXNlKERCX1BBVEgpO1xuY29uc3QgZGIgPSBkcml6emxlKHNxbGl0ZSwgeyBzY2hlbWE6IHtcblx0dXNlcnMsXG5cdGNoYXJhY3RlcnMsXG5cdHJlc3VtZUNvbW1hbmRzLFxuXHRtaW5pbmdGbGVldHMsXG5cdG1pbmluZ0ZsZWV0UGFydGljaXBhbnRzXG59IH0pO1xuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IENoYXJhY3RlckhlbHBlciwgREJfUEFUSCwgUmVzdW1lQ29tbWFuZCwgVXNlckhlbHBlciwgZGIsIG1vZGVsc19leHBvcnRzIGFzIG1vZGVscywgc2NoZW1hX2V4cG9ydHMgYXMgc2NoZW1hIH07IiwKICAgICJpbXBvcnQgeyBzZXRDb29raWUgfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tICdicmlzYSc7XG5pbXBvcnQgeyBDaGFyYWN0ZXJIZWxwZXIsIFVzZXJIZWxwZXIgfSBmcm9tICdAc3Rhci1raXR0ZW4vZXZlL2RiJ1xuXG4vLyBHRVQgL2FwaS9hdXRoL2Rpc2NvcmRJRC86ZGlzY29yZElEL3JlbW92ZVNjb3Blcy9jaGFyYWN0ZXJJRC86Y2hhcmFjdGVySUQvc2NvcGVzLzpzY29wZXNcbmV4cG9ydCBmdW5jdGlvbiBHRVQoeyByb3V0ZTogeyBwYXJhbXMgfSB9OiBSZXF1ZXN0Q29udGV4dCkge1xuICBjb25zdCBkaXNjb3JkSUQgPSBwYXJhbXMhWydkaXNjb3JkSUQnXSBhcyBzdHJpbmc7XG4gIGNvbnN0IGNoYXJhY3RlcklEID0gcGFyYW1zIVsnY2hhcmFjdGVySUQnXSBhcyBzdHJpbmc7XG4gIGNvbnN0IHJlbW92ZVNjb3BlcyA9IChwYXJhbXMhWydzY29wZXMnXSBhcyBzdHJpbmcpLnNwbGl0KCcsJyk7XG5cbiAgY29uc3QgdXNlciA9IFVzZXJIZWxwZXIuZmluZEJ5RGlzY29yZElkKGRpc2NvcmRJRCk7XG4gIGNvbnN0IGNoYXJhY3RlciA9IENoYXJhY3RlckhlbHBlci5maW5kQnlVc2VyQW5kRXZlSUQodXNlci5pZCwgTnVtYmVyKGNoYXJhY3RlcklEKSk7XG4gIGlmICghY2hhcmFjdGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDaGFyYWN0ZXIgJHtjaGFyYWN0ZXJJRH0gbm90IGZvdW5kYCk7XG4gIH1cbiAgY29uc3QgY3VycmVudFNjb3BlcyA9IENoYXJhY3RlckhlbHBlci5nZXRTY29wZXMoY2hhcmFjdGVyKTtcbiAgY29uc3Qgc2V0ID0gbmV3IFNldChjdXJyZW50U2NvcGVzKTtcbiAgcmVtb3ZlU2NvcGVzLmZvckVhY2goKHNjb3BlKSA9PiBzZXQuZGVsZXRlKHNjb3BlKSk7XG5cbiAgLy8gQXMgdGhpcyBpcyByZW1vdmluZyBzY29wZXMsIHdlIGNhbiBkbyB0aGlzIHdpdGhvdXQgdXNlciBpbnRlcmFjdGlvblxuICBDaGFyYWN0ZXJIZWxwZXIucmVmcmVzaFRva2VucyhjaGFyYWN0ZXIsIEFycmF5LmZyb20oc2V0KS5qb2luKCcgJykpO1xuXG4gIC8vIHJlZGlyZWN0IHRvIHN1Y2Nlc3MgcGFnZVxuICBjb25zdCByZXNwb25zZSA9IG5ldyBSZXNwb25zZSgnJywgeyBzdGF0dXM6IDMwMiB9KTtcbiAgcmVzcG9uc2UuaGVhZGVycy5zZXQoJ2xvY2F0aW9uJywgJy9hdXRoL3N1Y2Nlc3MnKTtcbiAgc2V0Q29va2llKHJlc3BvbnNlLCAnZGlzY29yZElEJywgcGFyYW1zIVsnZGlzY29yZElEJ10gYXMgc3RyaW5nLCA2MCAqIDEwIC8qIDEwIG1pbiAqLyk7XG4gIHNldENvb2tpZShyZXNwb25zZSwgJ2Rpc2NvcmRJRCcsIGNoYXJhY3RlcklELCA2MCAqIDEwIC8qIDEwIG1pbiAqLyk7XG4gIHJldHVybiByZXNwb25zZTtcbn0iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUVBLElBQUk7QUFBQSxFQUNKLElBQUksVUFBUyxPQUFPO0FBQUEsRUFHcEIsU0FBUyxTQUFVLENBQUMsS0FBSyxLQUFLO0FBQUEsSUFDNUIsU0FBUyxPQUFPLEtBQUs7QUFBQSxNQUNuQixJQUFJLE9BQU8sSUFBSTtBQUFBLElBQ2pCO0FBQUE7QUFBQSxFQUVGLElBQUksUUFBTyxRQUFRLFFBQU8sU0FBUyxRQUFPLGVBQWUsUUFBTyxpQkFBaUI7QUFBQSxJQUMvRSxPQUFPLFVBQVU7QUFBQSxFQUNuQixFQUFPO0FBQUEsSUFFTCxVQUFVLFFBQVEsT0FBTztBQUFBLElB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QUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLElBRUEsSUFBSSxhQUFhO0FBQUEsTUFDZjtBQUFBLE1BQUc7QUFBQSxNQUNIO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFJO0FBQUEsTUFBSTtBQUFBLE1BQUk7QUFBQSxNQUFHO0FBQUEsTUFDdkI7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUNsQjtBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQ2xCO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFDbEI7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxJQUNwQjtBQUFBLElBRUEsSUFBSSxhQUFhO0FBQUEsTUFDZjtBQUFBLE1BQUc7QUFBQSxNQUNIO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFDNUQ7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVM7QUFBQSxNQUMzRDtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBUztBQUFBLE1BQzNEO0FBQUEsTUFBUztBQUFBLE1BQVM7QUFBQSxNQUFTO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFDekQ7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxNQUFVO0FBQUEsTUFBVTtBQUFBLE1BQVU7QUFBQSxJQUM5RDtBQUFBLElBRUEsR0FBRyxVQUFVLFdBQVcsU0FBUyxRQUFTLENBQUMsTUFBTSxTQUFTO0FBQUEsTUFDeEQsT0FBTyxRQUFRO0FBQUEsTUFDZixVQUFVLFVBQVUsS0FBSztBQUFBLE1BRXpCLElBQUk7QUFBQSxNQUNKLElBQUksU0FBUyxNQUFNLFNBQVMsT0FBTztBQUFBLFFBQ2pDLE1BQU07QUFBQSxRQUNOLElBQUksTUFBTTtBQUFBLFFBQ1YsSUFBSSxRQUFRO0FBQUEsUUFDWixTQUFTLElBQUksRUFBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQUEsVUFDcEMsSUFBSSxJQUFJLEtBQUssTUFBTTtBQUFBLFVBQ25CLElBQUksU0FBVSxLQUFLLE1BQU8sU0FBUyxVQUFVLFNBQVMsRUFBRTtBQUFBLFVBQ3hELFFBQVMsTUFBTyxLQUFLLE1BQVE7QUFBQSxVQUM3QixPQUFPO0FBQUEsVUFDUCxJQUFJLE9BQU8sSUFBSTtBQUFBLFlBQ2IsT0FBTztBQUFBLFlBQ1A7QUFBQSxVQUNGO0FBQUEsVUFDQSxJQUFJLFVBQVUsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHO0FBQUEsWUFDeEMsTUFBTSxNQUFNLElBQUksS0FBSyxVQUFVLE9BQU87QUFBQSxVQUN4QyxFQUFPO0FBQUEsWUFDTCxNQUFNLE9BQU87QUFBQTtBQUFBLFFBRWpCO0FBQUEsUUFDQSxJQUFJLFVBQVUsR0FBRztBQUFBLFVBQ2YsTUFBTSxNQUFNLFNBQVMsRUFBRSxJQUFJO0FBQUEsUUFDN0I7QUFBQSxRQUNBLE9BQU8sSUFBSSxTQUFTLFlBQVksR0FBRztBQUFBLFVBQ2pDLE1BQU0sTUFBTTtBQUFBLFFBQ2Q7QUFBQSxRQUNBLElBQUksS0FBSyxhQUFhLEdBQUc7QUFBQSxVQUN2QixNQUFNLE1BQU07QUFBQSxRQUNkO0FBQUEsUUFDQSxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BRUEsSUFBSSxVQUFVLE9BQU8sTUFBTSxRQUFRLEtBQUssUUFBUSxJQUFJO0FBQUEsUUFFbEQsSUFBSSxZQUFZLFdBQVc7QUFBQSxRQUUzQixJQUFJLFlBQVksV0FBVztBQUFBLFFBQzNCLE1BQU07QUFBQSxRQUNOLElBQUksSUFBSSxLQUFLLE1BQU07QUFBQSxRQUNuQixFQUFFLFdBQVc7QUFBQSxRQUNiLFFBQVEsRUFBRSxPQUFPLEdBQUc7QUFBQSxVQUNsQixJQUFJLElBQUksRUFBRSxLQUFLLFNBQVMsRUFBRSxTQUFTLElBQUk7QUFBQSxVQUN2QyxJQUFJLEVBQUUsTUFBTSxTQUFTO0FBQUEsVUFFckIsS0FBSyxFQUFFLE9BQU8sR0FBRztBQUFBLFlBQ2YsTUFBTSxNQUFNLFlBQVksRUFBRSxVQUFVLElBQUk7QUFBQSxVQUMxQyxFQUFPO0FBQUEsWUFDTCxNQUFNLElBQUk7QUFBQTtBQUFBLFFBRWQ7QUFBQSxRQUNBLElBQUksS0FBSyxPQUFPLEdBQUc7QUFBQSxVQUNqQixNQUFNLE1BQU07QUFBQSxRQUNkO0FBQUEsUUFDQSxPQUFPLElBQUksU0FBUyxZQUFZLEdBQUc7QUFBQSxVQUNqQyxNQUFNLE1BQU07QUFBQSxRQUNkO0FBQUEsUUFDQSxJQUFJLEtBQUssYUFBYSxHQUFHO0FBQUEsVUFDdkIsTUFBTSxNQUFNO0FBQUEsUUFDZDtBQUFBLFFBQ0EsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUVBLE9BQU8sT0FBTyxpQ0FBaUM7QUFBQTtBQUFBLElBR2pELEdBQUcsVUFBVSxXQUFXLFNBQVMsUUFBUyxHQUFHO0FBQUEsTUFDM0MsSUFBSSxNQUFNLEtBQUssTUFBTTtBQUFBLE1BQ3JCLElBQUksS0FBSyxXQUFXLEdBQUc7QUFBQSxRQUNyQixPQUFPLEtBQUssTUFBTSxLQUFLO0FBQUEsTUFDekIsRUFBTyxTQUFJLEtBQUssV0FBVyxLQUFLLEtBQUssTUFBTSxPQUFPLEdBQU07QUFBQSxRQUV0RCxPQUFPLG1CQUFvQixLQUFLLE1BQU0sS0FBSztBQUFBLE1BQzdDLEVBQU8sU0FBSSxLQUFLLFNBQVMsR0FBRztBQUFBLFFBQzFCLE9BQU8sT0FBTyw0Q0FBNEM7QUFBQSxNQUM1RDtBQUFBLE1BQ0EsT0FBUSxLQUFLLGFBQWEsS0FBTSxNQUFNO0FBQUE7QUFBQSxJQUd4QyxHQUFHLFVBQVUsU0FBUyxTQUFTLE1BQU8sR0FBRztBQUFBLE1BQ3ZDLE9BQU8sS0FBSyxTQUFTLEVBQUU7QUFBQTtBQUFBLElBR3pCLEdBQUcsVUFBVSxXQUFXLFNBQVMsUUFBUyxDQUFDLFFBQVEsUUFBUTtBQUFBLE1BQ3pELE9BQU8sT0FBTyxZQUFXLFdBQVc7QUFBQSxNQUNwQyxPQUFPLEtBQUssWUFBWSxTQUFRLFFBQVEsTUFBTTtBQUFBO0FBQUEsSUFHaEQsR0FBRyxVQUFVLFVBQVUsU0FBUyxPQUFRLENBQUMsUUFBUSxRQUFRO0FBQUEsTUFDdkQsT0FBTyxLQUFLLFlBQVksT0FBTyxRQUFRLE1BQU07QUFBQTtBQUFBLElBRy9DLEdBQUcsVUFBVSxjQUFjLFNBQVMsV0FBWSxDQUFDLFdBQVcsUUFBUSxRQUFRO0FBQUEsTUFDMUUsSUFBSSxhQUFhLEtBQUssV0FBVztBQUFBLE1BQ2pDLElBQUksWUFBWSxVQUFVLEtBQUssSUFBSSxHQUFHLFVBQVU7QUFBQSxNQUNoRCxPQUFPLGNBQWMsV0FBVyx1Q0FBdUM7QUFBQSxNQUN2RSxPQUFPLFlBQVksR0FBRyw2QkFBNkI7QUFBQSxNQUVuRCxLQUFLLE1BQU07QUFBQSxNQUNYLElBQUksZUFBZSxXQUFXO0FBQUEsTUFDOUIsSUFBSSxNQUFNLElBQUksVUFBVSxTQUFTO0FBQUEsTUFFakMsSUFBSSxHQUFHO0FBQUEsTUFDUCxJQUFJLElBQUksS0FBSyxNQUFNO0FBQUEsTUFDbkIsS0FBSyxjQUFjO0FBQUEsUUFFakIsS0FBSyxJQUFJLEVBQUcsSUFBSSxZQUFZLFlBQVksS0FBSztBQUFBLFVBQzNDLElBQUksS0FBSztBQUFBLFFBQ1g7QUFBQSxRQUVBLEtBQUssSUFBSSxHQUFJLEVBQUUsT0FBTyxHQUFHLEtBQUs7QUFBQSxVQUM1QixJQUFJLEVBQUUsTUFBTSxHQUFJO0FBQUEsVUFDaEIsRUFBRSxPQUFPLENBQUM7QUFBQSxVQUVWLElBQUksWUFBWSxJQUFJLEtBQUs7QUFBQSxRQUMzQjtBQUFBLE1BQ0YsRUFBTztBQUFBLFFBQ0wsS0FBSyxJQUFJLEdBQUksRUFBRSxPQUFPLEdBQUcsS0FBSztBQUFBLFVBQzVCLElBQUksRUFBRSxNQUFNLEdBQUk7QUFBQSxVQUNoQixFQUFFLE9BQU8sQ0FBQztBQUFBLFVBRVYsSUFBSSxLQUFLO0FBQUEsUUFDWDtBQUFBLFFBRUEsTUFBTyxJQUFJLFdBQVcsS0FBSztBQUFBLFVBQ3pCLElBQUksS0FBSztBQUFBLFFBQ1g7QUFBQTtBQUFBLE1BR0YsT0FBTztBQUFBO0FBQUEsSUFHVCxJQUFJLEtBQUssT0FBTztBQUFBLE1BQ2QsR0FBRyxVQUFVLGFBQWEsU0FBUyxVQUFXLENBQUMsR0FBRztBQUFBLFFBQ2hELE9BQU8sS0FBSyxLQUFLLE1BQU0sQ0FBQztBQUFBO0FBQUEsSUFFNUIsRUFBTztBQUFBLE1BQ0wsR0FBRyxVQUFVLGFBQWEsU0FBUyxVQUFXLENBQUMsR0FBRztBQUFBLFFBQ2hELElBQUksSUFBSTtBQUFBLFFBQ1IsSUFBSSxJQUFJO0FBQUEsUUFDUixJQUFJLEtBQUssTUFBUTtBQUFBLFVBQ2YsS0FBSztBQUFBLFVBQ0wsT0FBTztBQUFBLFFBQ1Q7QUFBQSxRQUNBLElBQUksS0FBSyxJQUFNO0FBQUEsVUFDYixLQUFLO0FBQUEsVUFDTCxPQUFPO0FBQUEsUUFDVDtBQUFBLFFBQ0EsSUFBSSxLQUFLLEdBQUs7QUFBQSxVQUNaLEtBQUs7QUFBQSxVQUNMLE9BQU87QUFBQSxRQUNUO0FBQUEsUUFDQSxJQUFJLEtBQUssR0FBTTtBQUFBLFVBQ2IsS0FBSztBQUFBLFVBQ0wsT0FBTztBQUFBLFFBQ1Q7QUFBQSxRQUNBLE9BQU8sSUFBSTtBQUFBO0FBQUE7QUFBQSxJQUlmLEdBQUcsVUFBVSxZQUFZLFNBQVMsU0FBVSxDQUFDLEdBQUc7QUFBQSxNQUU5QyxJQUFJLE1BQU07QUFBQSxRQUFHLE9BQU87QUFBQSxNQUVwQixJQUFJLElBQUk7QUFBQSxNQUNSLElBQUksSUFBSTtBQUFBLE1BQ1IsS0FBSyxJQUFJLFVBQVksR0FBRztBQUFBLFFBQ3RCLEtBQUs7QUFBQSxRQUNMLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFDQSxLQUFLLElBQUksU0FBVSxHQUFHO0FBQUEsUUFDcEIsS0FBSztBQUFBLFFBQ0wsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUNBLEtBQUssSUFBSSxRQUFTLEdBQUc7QUFBQSxRQUNuQixLQUFLO0FBQUEsUUFDTCxPQUFPO0FBQUEsTUFDVDtBQUFBLE1BQ0EsS0FBSyxJQUFJLE9BQVMsR0FBRztBQUFBLFFBQ25CLEtBQUs7QUFBQSxRQUNMLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFDQSxLQUFLLElBQUksT0FBUyxHQUFHO0FBQUEsUUFDbkI7QUFBQSxNQUNGO0FBQUEsTUFDQSxPQUFPO0FBQUE7QUFBQSxJQUlULEdBQUcsVUFBVSxZQUFZLFNBQVMsU0FBVSxHQUFHO0FBQUEsTUFDN0MsSUFBSSxJQUFJLEtBQUssTUFBTSxLQUFLLFNBQVM7QUFBQSxNQUNqQyxJQUFJLEtBQUssS0FBSyxXQUFXLENBQUM7QUFBQSxNQUMxQixRQUFRLEtBQUssU0FBUyxLQUFLLEtBQUs7QUFBQTtBQUFBLElBR2xDLFNBQVMsVUFBVyxDQUFDLEtBQUs7QUFBQSxNQUN4QixJQUFJLElBQUksSUFBSSxNQUFNLElBQUksVUFBVSxDQUFDO0FBQUEsTUFFakMsU0FBUyxNQUFNLEVBQUcsTUFBTSxFQUFFLFFBQVEsT0FBTztBQUFBLFFBQ3ZDLElBQUksTUFBTyxNQUFNLEtBQU07QUFBQSxRQUN2QixJQUFJLE9BQU8sTUFBTTtBQUFBLFFBRWpCLEVBQUUsUUFBUSxJQUFJLE1BQU0sT0FBUSxLQUFLLFVBQVc7QUFBQSxNQUM5QztBQUFBLE1BRUEsT0FBTztBQUFBO0FBQUEsSUFJVCxHQUFHLFVBQVUsV0FBVyxTQUFTLFFBQVMsR0FBRztBQUFBLE1BQzNDLElBQUksS0FBSyxPQUFPO0FBQUEsUUFBRyxPQUFPO0FBQUEsTUFFMUIsSUFBSSxJQUFJO0FBQUEsTUFDUixTQUFTLElBQUksRUFBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQUEsUUFDcEMsSUFBSSxJQUFJLEtBQUssVUFBVSxLQUFLLE1BQU0sRUFBRTtBQUFBLFFBQ3BDLEtBQUs7QUFBQSxRQUNMLElBQUksTUFBTTtBQUFBLFVBQUk7QUFBQSxNQUNoQjtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUEsSUFHVCxHQUFHLFVBQVUsYUFBYSxTQUFTLFVBQVcsR0FBRztBQUFBLE1BQy9DLE9BQU8sS0FBSyxLQUFLLEtBQUssVUFBVSxJQUFJLENBQUM7QUFBQTtBQUFBLElBR3ZDLEdBQUcsVUFBVSxTQUFTLFNBQVMsTUFBTyxDQUFDLE9BQU87QUFBQSxNQUM1QyxJQUFJLEtBQUssYUFBYSxHQUFHO0FBQUEsUUFDdkIsT0FBTyxLQUFLLElBQUksRUFBRSxNQUFNLEtBQUssRUFBRSxNQUFNLENBQUM7QUFBQSxNQUN4QztBQUFBLE1BQ0EsT0FBTyxLQUFLLE1BQU07QUFBQTtBQUFBLElBR3BCLEdBQUcsVUFBVSxXQUFXLFNBQVMsUUFBUyxDQUFDLE9BQU87QUFBQSxNQUNoRCxJQUFJLEtBQUssTUFBTSxRQUFRLENBQUMsR0FBRztBQUFBLFFBQ3pCLE9BQU8sS0FBSyxLQUFLLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxLQUFLO0FBQUEsTUFDeEM7QUFBQSxNQUNBLE9BQU8sS0FBSyxNQUFNO0FBQUE7QUFBQSxJQUdwQixHQUFHLFVBQVUsUUFBUSxTQUFTLEtBQU0sR0FBRztBQUFBLE1BQ3JDLE9BQU8sS0FBSyxhQUFhO0FBQUE7QUFBQSxJQUkzQixHQUFHLFVBQVUsTUFBTSxTQUFTLEdBQUksR0FBRztBQUFBLE1BQ2pDLE9BQU8sS0FBSyxNQUFNLEVBQUUsS0FBSztBQUFBO0FBQUEsSUFHM0IsR0FBRyxVQUFVLE9BQU8sU0FBUyxJQUFLLEdBQUc7QUFBQSxNQUNuQyxLQUFLLEtBQUssT0FBTyxHQUFHO0FBQUEsUUFDbEIsS0FBSyxZQUFZO0FBQUEsTUFDbkI7QUFBQSxNQUVBLE9BQU87QUFBQTtBQUFBLElBSVQsR0FBRyxVQUFVLE9BQU8sU0FBUyxJQUFLLENBQUMsS0FBSztBQUFBLE1BQ3RDLE9BQU8sS0FBSyxTQUFTLElBQUksUUFBUTtBQUFBLFFBQy9CLEtBQUssTUFBTSxLQUFLLFlBQVk7QUFBQSxNQUM5QjtBQUFBLE1BRUEsU0FBUyxJQUFJLEVBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSztBQUFBLFFBQ25DLEtBQUssTUFBTSxLQUFLLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTTtBQUFBLE1BQzVDO0FBQUEsTUFFQSxPQUFPLEtBQUssTUFBTTtBQUFBO0FBQUEsSUFHcEIsR0FBRyxVQUFVLE1BQU0sU0FBUyxHQUFJLENBQUMsS0FBSztBQUFBLE1BQ3BDLFFBQVEsS0FBSyxXQUFXLElBQUksY0FBYyxDQUFDO0FBQUEsTUFDM0MsT0FBTyxLQUFLLEtBQUssR0FBRztBQUFBO0FBQUEsSUFJdEIsR0FBRyxVQUFVLEtBQUssU0FBUyxFQUFHLENBQUMsS0FBSztBQUFBLE1BQ2xDLElBQUksS0FBSyxTQUFTLElBQUk7QUFBQSxRQUFRLE9BQU8sS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHO0FBQUEsTUFDekQsT0FBTyxJQUFJLE1BQU0sRUFBRSxJQUFJLElBQUk7QUFBQTtBQUFBLElBRzdCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxJQUFJLEtBQUssU0FBUyxJQUFJO0FBQUEsUUFBUSxPQUFPLEtBQUssTUFBTSxFQUFFLEtBQUssR0FBRztBQUFBLE1BQzFELE9BQU8sSUFBSSxNQUFNLEVBQUUsS0FBSyxJQUFJO0FBQUE7QUFBQSxJQUk5QixHQUFHLFVBQVUsUUFBUSxTQUFTLEtBQU0sQ0FBQyxLQUFLO0FBQUEsTUFFeEMsSUFBSTtBQUFBLE1BQ0osSUFBSSxLQUFLLFNBQVMsSUFBSSxRQUFRO0FBQUEsUUFDNUIsSUFBSTtBQUFBLE1BQ04sRUFBTztBQUFBLFFBQ0wsSUFBSTtBQUFBO0FBQUEsTUFHTixTQUFTLElBQUksRUFBRyxJQUFJLEVBQUUsUUFBUSxLQUFLO0FBQUEsUUFDakMsS0FBSyxNQUFNLEtBQUssS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNO0FBQUEsTUFDNUM7QUFBQSxNQUVBLEtBQUssU0FBUyxFQUFFO0FBQUEsTUFFaEIsT0FBTyxLQUFLLE1BQU07QUFBQTtBQUFBLElBR3BCLEdBQUcsVUFBVSxPQUFPLFNBQVMsSUFBSyxDQUFDLEtBQUs7QUFBQSxNQUN0QyxRQUFRLEtBQUssV0FBVyxJQUFJLGNBQWMsQ0FBQztBQUFBLE1BQzNDLE9BQU8sS0FBSyxNQUFNLEdBQUc7QUFBQTtBQUFBLElBSXZCLEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxJQUFJLEtBQUssU0FBUyxJQUFJO0FBQUEsUUFBUSxPQUFPLEtBQUssTUFBTSxFQUFFLEtBQUssR0FBRztBQUFBLE1BQzFELE9BQU8sSUFBSSxNQUFNLEVBQUUsS0FBSyxJQUFJO0FBQUE7QUFBQSxJQUc5QixHQUFHLFVBQVUsT0FBTyxTQUFTLElBQUssQ0FBQyxLQUFLO0FBQUEsTUFDdEMsSUFBSSxLQUFLLFNBQVMsSUFBSTtBQUFBLFFBQVEsT0FBTyxLQUFLLE1BQU0sRUFBRSxNQUFNLEdBQUc7QUFBQSxNQUMzRCxPQUFPLElBQUksTUFBTSxFQUFFLE1BQU0sSUFBSTtBQUFBO0FBQUEsSUFJL0IsR0FBRyxVQUFVLFFBQVEsU0FBUyxLQUFNLENBQUMsS0FBSztBQUFBLE1BRXhDLElBQUk7QUFBQSxNQUNKLElBQUk7QUFBQSxNQUNKLElBQUksS0FBSyxTQUFTLElBQUksUUFBUTtBQUFBLFFBQzVCLElBQUk7QUFBQSxRQUNKLElBQUk7QUFBQSxNQUNOLEVBQU87QUFBQSxRQUNMLElBQUk7QUFBQSxRQUNKLElBQUk7QUFBQTtBQUFBLE1BR04sU0FBUyxJQUFJLEVBQUcsSUFBSSxFQUFFLFFBQVEsS0FBSztBQUFBLFFBQ2pDLEtBQUssTUFBTSxLQUFLLEVBQUUsTUFBTSxLQUFLLEVBQUUsTUFBTTtBQUFBLE1BQ3ZDO0FBQUEsTUFFQSxJQUFJLFNBQVMsR0FBRztBQUFBLFFBQ2QsTUFBTyxJQUFJLEVBQUUsUUFBUSxLQUFLO0FBQUEsVUFDeEIsS0FBSyxNQUFNLEtBQUssRUFBRSxNQUFNO0FBQUEsUUFDMUI7QUFBQSxNQUNGO0FBQUEsTUFFQSxLQUFLLFNBQVMsRUFBRTtBQUFBLE1BRWhCLE9BQU8sS0FBSyxNQUFNO0FBQUE7QUFBQSxJQUdwQixHQUFHLFVBQVUsT0FBTyxTQUFTLElBQUssQ0FBQyxLQUFLO0FBQUEsTUFDdEMsUUFBUSxLQUFLLFdBQVcsSUFBSSxjQUFjLENBQUM7QUFBQSxNQUMzQyxPQUFPLEtBQUssTUFBTSxHQUFHO0FBQUE7QUFBQSxJQUl2QixHQUFHLFVBQVUsTUFBTSxTQUFTLEdBQUksQ0FBQyxLQUFLO0FBQUEsTUFDcEMsSUFBSSxLQUFLLFNBQVMsSUFBSTtBQUFBLFFBQVEsT0FBTyxLQUFLLE1BQU0sRUFBRSxLQUFLLEdBQUc7QUFBQSxNQUMxRCxPQUFPLElBQUksTUFBTSxFQUFFLEtBQUssSUFBSTtBQUFBO0FBQUEsSUFHOUIsR0FBRyxVQUFVLE9BQU8sU0FBUyxJQUFLLENBQUMsS0FBSztBQUFBLE1BQ3RDLElBQUksS0FBSyxTQUFTLElBQUk7QUFBQSxRQUFRLE9BQU8sS0FBSyxNQUFNLEVBQUUsTUFBTSxHQUFHO0FBQUEsTUFDM0QsT0FBTyxJQUFJLE1BQU0sRUFBRSxNQUFNLElBQUk7QUFBQTtBQUFBLElBSS9CLEdBQUcsVUFBVSxRQUFRLFNBQVMsS0FBTSxDQUFDLE9BQU87QUFBQSxNQUMxQyxPQUFPLE9BQU8sVUFBVSxZQUFZLFNBQVMsQ0FBQztBQUFBLE1BRTlDLElBQUksY0FBYyxLQUFLLEtBQUssUUFBUSxFQUFFLElBQUk7QUFBQSxNQUMxQyxJQUFJLFdBQVcsUUFBUTtBQUFBLE1BR3ZCLEtBQUssUUFBUSxXQUFXO0FBQUEsTUFFeEIsSUFBSSxXQUFXLEdBQUc7QUFBQSxRQUNoQjtBQUFBLE1BQ0Y7QUFBQSxNQUdBLFNBQVMsSUFBSSxFQUFHLElBQUksYUFBYSxLQUFLO0FBQUEsUUFDcEMsS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLEtBQUs7QUFBQSxNQUNuQztBQUFBLE1BR0EsSUFBSSxXQUFXLEdBQUc7QUFBQSxRQUNoQixLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sS0FBTSxZQUFjLEtBQUs7QUFBQSxNQUN2RDtBQUFBLE1BR0EsT0FBTyxLQUFLLE1BQU07QUFBQTtBQUFBLElBR3BCLEdBQUcsVUFBVSxPQUFPLFNBQVMsSUFBSyxDQUFDLE9BQU87QUFBQSxNQUN4QyxPQUFPLEtBQUssTUFBTSxFQUFFLE1BQU0sS0FBSztBQUFBO0FBQUEsSUFJakMsR0FBRyxVQUFVLE9BQU8sU0FBUyxJQUFLLENBQUMsS0FBSyxLQUFLO0FBQUEsTUFDM0MsT0FBTyxPQUFPLFFBQVEsWUFBWSxPQUFPLENBQUM7QUFBQSxNQUUxQyxJQUFJLE1BQU8sTUFBTSxLQUFNO0FBQUEsTUFDdkIsSUFBSSxPQUFPLE1BQU07QUFBQSxNQUVqQixLQUFLLFFBQVEsTUFBTSxDQUFDO0FBQUEsTUFFcEIsSUFBSSxLQUFLO0FBQUEsUUFDUCxLQUFLLE1BQU0sT0FBTyxLQUFLLE1BQU0sT0FBUSxLQUFLO0FBQUEsTUFDNUMsRUFBTztBQUFBLFFBQ0wsS0FBSyxNQUFNLE9BQU8sS0FBSyxNQUFNLFNBQVMsS0FBSztBQUFBO0FBQUEsTUFHN0MsT0FBTyxLQUFLLE1BQU07QUFBQTtBQUFBLElBSXBCLEdBQUcsVUFBVSxPQUFPLFNBQVMsSUFBSyxDQUFDLEtBQUs7QUFBQSxNQUN0QyxJQUFJO0FBQUEsTUFHSixJQUFJLEtBQUssYUFBYSxLQUFLLElBQUksYUFBYSxHQUFHO0FBQUEsUUFDN0MsS0FBSyxXQUFXO0FBQUEsUUFDaEIsSUFBSSxLQUFLLEtBQUssR0FBRztBQUFBLFFBQ2pCLEtBQUssWUFBWTtBQUFBLFFBQ2pCLE9BQU8sS0FBSyxVQUFVO0FBQUEsTUFHeEIsRUFBTyxTQUFJLEtBQUssYUFBYSxLQUFLLElBQUksYUFBYSxHQUFHO0FBQUEsUUFDcEQsSUFBSSxXQUFXO0FBQUEsUUFDZixJQUFJLEtBQUssS0FBSyxHQUFHO0FBQUEsUUFDakIsSUFBSSxXQUFXO0FBQUEsUUFDZixPQUFPLEVBQUUsVUFBVTtBQUFBLE1BQ3JCO0FBQUEsTUFHQSxJQUFJLEdBQUc7QUFBQSxNQUNQLElBQUksS0FBSyxTQUFTLElBQUksUUFBUTtBQUFBLFFBQzVCLElBQUk7QUFBQSxRQUNKLElBQUk7QUFBQSxNQUNOLEVBQU87QUFBQSxRQUNMLElBQUk7QUFBQSxRQUNKLElBQUk7QUFBQTtBQUFBLE1BR04sSUFBSSxRQUFRO0FBQUEsTUFDWixTQUFTLElBQUksRUFBRyxJQUFJLEVBQUUsUUFBUSxLQUFLO0FBQUEsUUFDakMsS0FBSyxFQUFFLE1BQU0sS0FBSyxNQUFNLEVBQUUsTUFBTSxLQUFLLEtBQUs7QUFBQSxRQUMxQyxLQUFLLE1BQU0sS0FBSyxJQUFJO0FBQUEsUUFDcEIsUUFBUSxNQUFNO0FBQUEsTUFDaEI7QUFBQSxNQUNBLE1BQU8sVUFBVSxLQUFLLElBQUksRUFBRSxRQUFRLEtBQUs7QUFBQSxRQUN2QyxLQUFLLEVBQUUsTUFBTSxLQUFLLEtBQUs7QUFBQSxRQUN2QixLQUFLLE1BQU0sS0FBSyxJQUFJO0FBQUEsUUFDcEIsUUFBUSxNQUFNO0FBQUEsTUFDaEI7QUFBQSxNQUVBLEtBQUssU0FBUyxFQUFFO0FBQUEsTUFDaEIsSUFBSSxVQUFVLEdBQUc7QUFBQSxRQUNmLEtBQUssTUFBTSxLQUFLLFVBQVU7QUFBQSxRQUMxQixLQUFLO0FBQUEsTUFFUCxFQUFPLFNBQUksTUFBTSxNQUFNO0FBQUEsUUFDckIsTUFBTyxJQUFJLEVBQUUsUUFBUSxLQUFLO0FBQUEsVUFDeEIsS0FBSyxNQUFNLEtBQUssRUFBRSxNQUFNO0FBQUEsUUFDMUI7QUFBQSxNQUNGO0FBQUEsTUFFQSxPQUFPO0FBQUE7QUFBQSxJQUlULEdBQUcsVUFBVSxNQUFNLFNBQVMsR0FBSSxDQUFDLEtBQUs7QUFBQSxNQUNwQyxJQUFJO0FBQUEsTUFDSixJQUFJLElBQUksYUFBYSxLQUFLLEtBQUssYUFBYSxHQUFHO0FBQUEsUUFDN0MsSUFBSSxXQUFXO0FBQUEsUUFDZixNQUFNLEtBQUssSUFBSSxHQUFHO0FBQUEsUUFDbEIsSUFBSSxZQUFZO0FBQUEsUUFDaEIsT0FBTztBQUFBLE1BQ1QsRUFBTyxTQUFJLElBQUksYUFBYSxLQUFLLEtBQUssYUFBYSxHQUFHO0FBQUEsUUFDcEQsS0FBSyxXQUFXO0FBQUEsUUFDaEIsTUFBTSxJQUFJLElBQUksSUFBSTtBQUFBLFFBQ2xCLEtBQUssV0FBVztBQUFBLFFBQ2hCLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFFQSxJQUFJLEtBQUssU0FBUyxJQUFJO0FBQUEsUUFBUSxPQUFPLEtBQUssTUFBTSxFQUFFLEtBQUssR0FBRztBQUFBLE1BRTFELE9BQU8sSUFBSSxNQUFNLEVBQUUsS0FBSyxJQUFJO0FBQUE7QUFBQSxJQUk5QixHQUFHLFVBQVUsT0FBTyxTQUFTLElBQUssQ0FBQyxLQUFLO0FBQUEsTUFFdEMsSUFBSSxJQUFJLGFBQWEsR0FBRztBQUFBLFFBQ3RCLElBQUksV0FBVztBQUFBLFFBQ2YsSUFBSSxJQUFJLEtBQUssS0FBSyxHQUFHO0FBQUEsUUFDckIsSUFBSSxXQUFXO0FBQUEsUUFDZixPQUFPLEVBQUUsVUFBVTtBQUFBLE1BR3JCLEVBQU8sU0FBSSxLQUFLLGFBQWEsR0FBRztBQUFBLFFBQzlCLEtBQUssV0FBVztBQUFBLFFBQ2hCLEtBQUssS0FBSyxHQUFHO0FBQUEsUUFDYixLQUFLLFdBQVc7QUFBQSxRQUNoQixPQUFPLEtBQUssVUFBVTtBQUFBLE1BQ3hCO0FBQUEsTUFHQSxJQUFJLE1BQU0sS0FBSyxJQUFJLEdBQUc7QUFBQSxNQUd0QixJQUFJLFFBQVEsR0FBRztBQUFBLFFBQ2IsS0FBSyxXQUFXO0FBQUEsUUFDaEIsS0FBSyxTQUFTO0FBQUEsUUFDZCxLQUFLLE1BQU0sS0FBSztBQUFBLFFBQ2hCLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFHQSxJQUFJLEdBQUc7QUFBQSxNQUNQLElBQUksTUFBTSxHQUFHO0FBQUEsUUFDWCxJQUFJO0FBQUEsUUFDSixJQUFJO0FBQUEsTUFDTixFQUFPO0FBQUEsUUFDTCxJQUFJO0FBQUEsUUFDSixJQUFJO0FBQUE7QUFBQSxNQUdOLElBQUksUUFBUTtBQUFBLE1BQ1osU0FBUyxJQUFJLEVBQUcsSUFBSSxFQUFFLFFBQVEsS0FBSztBQUFBLFFBQ2pDLEtBQUssRUFBRSxNQUFNLEtBQUssTUFBTSxFQUFFLE1BQU0sS0FBSyxLQUFLO0FBQUEsUUFDMUMsUUFBUSxLQUFLO0FBQUEsUUFDYixLQUFLLE1BQU0sS0FBSyxJQUFJO0FBQUEsTUFDdEI7QUFBQSxNQUNBLE1BQU8sVUFBVSxLQUFLLElBQUksRUFBRSxRQUFRLEtBQUs7QUFBQSxRQUN2QyxLQUFLLEVBQUUsTUFBTSxLQUFLLEtBQUs7QUFBQSxRQUN2QixRQUFRLEtBQUs7QUFBQSxRQUNiLEtBQUssTUFBTSxLQUFLLElBQUk7QUFBQSxNQUN0QjtBQUFBLE1BR0EsSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFLFVBQVUsTUFBTSxNQUFNO0FBQUEsUUFDN0MsTUFBTyxJQUFJLEVBQUUsUUFBUSxLQUFLO0FBQUEsVUFDeEIsS0FBSyxNQUFNLEtBQUssRUFBRSxNQUFNO0FBQUEsUUFDMUI7QUFBQSxNQUNGO0FBQUEsTUFFQSxLQUFLLFNBQVMsS0FBSyxJQUFJLEtBQUssUUFBUSxDQUFDO0FBQUEsTUFFckMsSUFBSSxNQUFNLE1BQU07QUFBQSxRQUNkLEtBQUssV0FBVztBQUFBLE1BQ2xCO0FBQUEsTUFFQSxPQUFPLEtBQUssTUFBTTtBQUFBO0FBQUEsSUFJcEIsR0FBRyxVQUFVLE1BQU0sU0FBUyxHQUFJLENBQUMsS0FBSztBQUFBLE1BQ3BDLE9BQU8sS0FBSyxNQUFNLEVBQUUsS0FBSyxHQUFHO0FBQUE7QUFBQSxJQUc5QixTQUFTLFVBQVcsQ0FBQyxPQUFNLEtBQUssS0FBSztBQUFBLE1BQ25DLElBQUksV0FBVyxJQUFJLFdBQVcsTUFBSztBQUFBLE1BQ25DLElBQUksTUFBTyxNQUFLLFNBQVMsSUFBSSxTQUFVO0FBQUEsTUFDdkMsSUFBSSxTQUFTO0FBQUEsTUFDYixNQUFPLE1BQU0sSUFBSztBQUFBLE1BR2xCLElBQUksSUFBSSxNQUFLLE1BQU0sS0FBSztBQUFBLE1BQ3hCLElBQUksSUFBSSxJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ3ZCLElBQUksSUFBSSxJQUFJO0FBQUEsTUFFWixJQUFJLEtBQUssSUFBSTtBQUFBLE1BQ2IsSUFBSSxRQUFTLElBQUksV0FBYTtBQUFBLE1BQzlCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFFZixTQUFTLElBQUksRUFBRyxJQUFJLEtBQUssS0FBSztBQUFBLFFBRzVCLElBQUksU0FBUyxVQUFVO0FBQUEsUUFDdkIsSUFBSSxRQUFRLFFBQVE7QUFBQSxRQUNwQixJQUFJLE9BQU8sS0FBSyxJQUFJLEdBQUcsSUFBSSxTQUFTLENBQUM7QUFBQSxRQUNyQyxTQUFTLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxNQUFLLFNBQVMsQ0FBQyxFQUFHLEtBQUssTUFBTSxLQUFLO0FBQUEsVUFDN0QsSUFBSSxJQUFLLElBQUksSUFBSztBQUFBLFVBQ2xCLElBQUksTUFBSyxNQUFNLEtBQUs7QUFBQSxVQUNwQixJQUFJLElBQUksTUFBTSxLQUFLO0FBQUEsVUFDbkIsSUFBSSxJQUFJLElBQUk7QUFBQSxVQUNaLFVBQVcsSUFBSSxXQUFhO0FBQUEsVUFDNUIsUUFBUSxJQUFJO0FBQUEsUUFDZDtBQUFBLFFBQ0EsSUFBSSxNQUFNLEtBQUssUUFBUTtBQUFBLFFBQ3ZCLFFBQVEsU0FBUztBQUFBLE1BQ25CO0FBQUEsTUFDQSxJQUFJLFVBQVUsR0FBRztBQUFBLFFBQ2YsSUFBSSxNQUFNLEtBQUssUUFBUTtBQUFBLE1BQ3pCLEVBQU87QUFBQSxRQUNMLElBQUk7QUFBQTtBQUFBLE1BR04sT0FBTyxJQUFJLE1BQU07QUFBQTtBQUFBLElBTW5CLElBQUksY0FBYyxTQUFTLFdBQVksQ0FBQyxPQUFNLEtBQUssS0FBSztBQUFBLE1BQ3RELElBQUksSUFBSSxNQUFLO0FBQUEsTUFDYixJQUFJLElBQUksSUFBSTtBQUFBLE1BQ1osSUFBSSxJQUFJLElBQUk7QUFBQSxNQUNaLElBQUksSUFBSTtBQUFBLE1BQ1IsSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFBLE1BQ2YsSUFBSSxNQUFNLE9BQU87QUFBQSxNQUNqQixJQUFJLEtBQUssRUFBRSxLQUFLO0FBQUEsTUFDaEIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUNmLElBQUksTUFBTSxPQUFPO0FBQUEsTUFDakIsSUFBSSxLQUFLLEVBQUUsS0FBSztBQUFBLE1BQ2hCLElBQUksTUFBTSxLQUFLO0FBQUEsTUFDZixJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ2pCLElBQUksS0FBSyxFQUFFLEtBQUs7QUFBQSxNQUNoQixJQUFJLE1BQU0sS0FBSztBQUFB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QUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtB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RyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE1BQVEsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUNyRCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sT0FBTyxNQUFPO0FBQUEsTUFDaEQsTUFBTTtBQUFBLE1BRU4sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE1BQVEsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUNyRCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sT0FBTyxNQUFPO0FBQUEsTUFDaEQsTUFBTTtBQUFBLE1BRU4sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxNQUFRLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDckQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLE9BQU8sTUFBTztBQUFBLE1BQ2hELE1BQU07QUFBQSxNQUVOLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxJQUFJLE1BQVEsSUFBSSxLQUFNLE9BQU8sTUFBTSxTQUFXLE1BQU87QUFBQSxNQUNyRCxLQUFPLE1BQU0sUUFBUSxNQUFPLE1BQU0sT0FBTyxNQUFPO0FBQUEsTUFDaEQsTUFBTTtBQUFBLE1BRU4sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDdkIsTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHO0FBQUEsTUFDeEIsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxPQUFTLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDdEQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLFFBQVEsTUFBTztBQUFBLE1BQ2pELE9BQU87QUFBQSxNQUVQLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsSUFBSSxPQUFTLElBQUksS0FBTSxPQUFPLE1BQU0sU0FBVyxNQUFPO0FBQUEsTUFDdEQsS0FBTyxNQUFNLFFBQVEsTUFBTyxNQUFNLFFBQVEsTUFBTztBQUFBLE1BQ2pELE9BQU87QUFBQSxNQUVQLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3ZCLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3hCLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUN2QixLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsTUFBTyxNQUFNLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ3BDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxLQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDbEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLE1BQU8sTUFBTSxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNwQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtBQUssR0FBRyxJQUFLO0FBQUEsTUFDcEMsS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsSUFBSztBQUFBLE1BQ2xDLEtBQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHLElBQUs7QUFBQSxNQUNsQyxNQUFPLE1BQU0sS0FBSyxLQUFLLEtB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QUFBLFVBQ1QsTUFBTTtBQUFBLFFBQ1IsRUFBTyxTQUFJLElBQUksR0FBRztBQUFBLFVBQ2hCLE1BQU07QUFBQSxRQUNSO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLElBR1QsR0FBRyxVQUFVLE1BQU0sU0FBUyxHQUFJLENBQUMsS0FBSztBQUFBLE1BQ3BDLE9BQU8sS0FBSyxLQUFLLEdBQUcsTUFBTTtBQUFBO0FBQUEsSUFHNUIsR0FBRyxVQUFVLEtBQUssU0FBUyxFQUFHLENBQUMsS0FBSztBQUFBLE1BQ2xDLE9BQU8sS0FBSyxJQUFJLEdBQUcsTUFBTTtBQUFBO0FBQUEsSUFHM0IsR0FBRyxVQUFVLE9BQU8sU0FBUyxJQUFLLENBQUMsS0FBSztBQUFBLE1BQ3RDLE9BQU8sS0FBSyxLQUFLLEdBQUcsS0FBSztBQUFBO0FBQUEsSUFHM0IsR0FBRyxVQUFVLE1BQU0sU0FBUyxHQUFJLENBQUMsS0FBSztBQUFBLE1BQ3BDLE9BQU8sS0FBSyxJQUFJLEdBQUcsS0FBSztBQUFBO0FBQUEsSUFHMUIsR0FBRyxVQUFVLE1BQU0sU0FBUyxHQUFJLENBQUMsS0FBSztBQUFBLE1BQ3BDLE9BQU8sS0FBSyxLQUFLLEdBQUcsTUFBTTtBQUFBO0FBQUEsSUFHNUIsR0FBRyxVQUFVLEtBQUssU0FBUyxFQUFHLENBQUMsS0FBSztBQUFBLE1BQ2xDLE9BQU8sS0FBSyxJQUFJLEdBQUcsTUFBTTtBQUFBO0FBQUEsSUFHM0IsR0FBRyxVQUFVLE9BQU8sU0FBUyxJQUFLLENBQUMsS0FBSztBQUFBLE1BQ3RDLE9BQU8sS0FBSyxLQUFLLEdBQUcsS0FBSztBQUFBO0FBQUEsSUFHM0IsR0FBRyxVQUFVLE1BQU0sU0FBUyxHQUFJLENBQUMsS0FBSztBQUFBLE1BQ3BDLE9BQU8sS0FBSyxJQUFJLEdBQUcsS0FBSztBQUFBO0FBQUEsSUFHMUIsR0FBRyxVQUFVLE1BQU0sU0FBUyxHQUFJLENBQUMsS0FBSztBQUFBLE1BQ3BDLE9BQU8sS0FBSyxLQUFLLEdBQUcsTUFBTTtBQUFBO0FBQUEsSUFH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LEtBQUssRUFBRSxPQUFPO0FBQUEsTUFFdkIsSUFBSSxLQUFLLEtBQUssRUFBRSxPQUFPO0FBQUEsTUFFdkIsSUFBSSxPQUFPLEdBQUcsT0FBTztBQUFBLE1BRXJCLElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLFFBQVEsSUFBSTtBQUFBLE1BQzNELElBQUksRUFBRSxRQUFRLENBQUM7QUFBQSxNQUVmLElBQUksSUFBSSxHQUFHLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLFFBQVEsS0FBSyxNQUFNLENBQUM7QUFBQSxNQUV0RCxJQUFJLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDO0FBQUEsTUFFdkMsS0FBSztBQUFBLE1BRUwsSUFBSSxRQUFRLEtBQUssUUFBUSxJQUFJO0FBQUEsTUFDN0IsUUFBUSxNQUFNLFFBQVEsS0FBSztBQUFBLE1BQzNCLFFBQVEsTUFBTSxRQUFRLEtBQUs7QUFBQSxNQUMzQixLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxLQUFLO0FBQUEsTUFFekMsS0FBSyxLQUFLLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFBQSxJQUMzQixFQUFPO0FBQUEsTUFLTCxJQUFJLFFBQVEsS0FBSyxFQUFFLE9BQU87QUFBQSxNQUUxQixJQUFJLFFBQVEsS0FBSyxFQUFFLE9BQU87QUFBQSxNQUUxQixJQUFJLE9BQU8sS0FBSyxFQUFFLE9BQU8sS0FBSztBQUFBLE1BRTlCLElBQUksUUFBUSxLQUFLLEVBQUUsT0FBTyxLQUFLLEVBQUUsT0FBTyxLQUFLLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFBQSxNQUM1RCxRQUFRLE1BQU0sT0FBTyxLQUFLLEVBQUUsUUFBUSxLQUFLO0FBQUEsTUFFekMsSUFBSSxRQUFRLEtBQUssUUFBUSxJQUFJO0FBQUEsTUFDN0IsUUFBUSxNQUFNLFFBQVEsS0FBSztBQUFBLE1BQzNCLElBQUksUUFBUSxNQUFNLE9BQU8sS0FBSztB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LElBQUksS0FBSyxNQUFNLENBQUMsTUFBTTtBQUFBO0FBQUEsRUFHL0MsTUFBTSxVQUFVLFVBQVUsU0FBUyxPQUFPLEdBQUc7QUFBQSxJQU0zQyxJQUFJLElBQUksS0FBSyxFQUFFLE9BQU87QUFBQSxJQUV0QixJQUFJLElBQUksS0FBSyxFQUFFLE9BQU87QUFBQSxJQUV0QixJQUFJLElBQUksS0FBSyxFQUFFLE9BQU87QUFBQSxJQUN0QixJQUFJLEVBQUUsUUFBUSxDQUFDO0FBQUEsSUFFZixJQUFJLElBQUksS0FBSyxNQUFNLE1BQU0sQ0FBQztBQUFBLElBRTFCLElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDO0FBQUEsSUFFM0QsSUFBSSxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFFbEIsSUFBSSxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFFbEIsSUFBSSxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFFbEIsSUFBSSxLQUFLLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFFbkIsSUFBSSxLQUFLLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFFbkIsSUFBSSxLQUFLLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFFbkIsSUFBSSxLQUFLLEVBQUUsT0FBTyxDQUFDO0FBQUEsSUFDbkIsT0FBTyxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksSUFBSSxFQUFFO0FBQUE7QUFBQSxFQUd4QyxNQUFNLFVBQVUsV0FBVyxTQUFTLFFBQVEsR0FBRztBQUFBLElBUTdDLElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTyxLQUFLLENBQUMsRUFBRSxPQUFPO0FBQUEsSUFFckMsSUFBSSxJQUFJLEtBQUssRUFBRSxPQUFPO0FBQUEsSUFFdEIsSUFBSSxJQUFJLEtBQUssRUFBRSxPQUFPO0FBQUEsSUFFdEIsSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osSUFBSSxLQUFLLE1BQU0sU0FBUztBQUFBLE1BRXRCLElBQUksS0FBSyxNQUFNLE1BQU0sQ0FBQztBQUFBLE1BRXRCLElBQUksSUFBSSxFQUFFLE9BQU8sQ0FBQztBQUFBLE1BQ2xCLElBQUksS0FBSyxNQUFNO0FBQUEsUUFFYixLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sS0FBSyxNQUFNLEdBQUcsQ0FBQztBQUFBLFFBRTFELEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFBQSxRQUV6QixLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQztBQUFBLE1BQ3BDLEVBQU87QUFBQSxRQUVMLElBQUksS0FBSyxFQUFFLE9BQU87QUFBQSxRQUVsQixJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQUUsUUFBUSxDQUFDO0FBQUEsUUFFekIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQztBQUFBLFFBRXBDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFBQSxRQUV6QixLQUFLLEVBQUUsT0FBTyxDQUFDO0FBQUE7QUFBQSxJQUVuQixFQUFPO0FBQUEsTUFFTCxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQUEsTUFFZCxJQUFJLEtBQUssTUFBTSxNQUFNLEtBQUssQ0FBQyxFQUFFLE9BQU87QUFBQSxNQUVwQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDO0FBQUEsTUFFeEIsS0FBSyxLQUFLLE1BQU0sTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO0FBQUEsTUFFNUMsS0FBSyxLQUFLLE1BQU0sTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQUEsTUFFNUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztBQUFBO0FBQUEsSUFFakIsT0FBTyxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksRUFBRTtBQUFBO0FBQUEsRUFHcEMsTUFBTSxVQUFVLE1BQU0sU0FBUyxHQUFHLEdBQUc7QUFBQSxJQUNuQyxJQUFJLEtBQUssV0FBVztBQUFBLE1BQ2xCLE9BQU87QUFBQSxJQUdULElBQUksS0FBSyxNQUFNO0FBQUEsTUFDYixPQUFPLEtBQUssUUFBUTtBQUFBLElBRXBCO0FBQUEsYUFBTyxLQUFLLFNBQVM7QUFBQTtBQUFBLEVBR3pCLE1BQU0sVUFBVSxVQUFVLFNBQVMsT0FBTyxDQUFDLEdBQUc7QUFBQSxJQU01QyxJQUFJLElBQUksS0FBSyxFQUFFLE9BQU8sS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUFBLElBRXBELElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQUEsSUFFcEQsSUFBSSxJQUFJLEtBQUssRUFBRSxPQUFPLEtBQUssTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFBQSxJQUUvQyxJQUFJLElBQUksS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFBQSxJQUVyQyxJQUFJLElBQUksRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVsQixJQUFJLElBQUksRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVsQixJQUFJLElBQUksRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVsQixJQUFJLElBQUksRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVsQixJQUFJLEtBQUssRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVuQixJQUFJLEtBQUssRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVuQixJQUFJLEtBQUssRUFBRSxPQUFPLENBQUM7QUFBQSxJQUVuQixJQUFJLEtBQUssRUFBRSxPQUFPLENBQUM7QUFBQSxJQUNuQixPQUFPLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxJQUFJLEVBQUU7QUFBQTtBQUFBLEVBR3hDLE1BQU0sVUFBVSxXQUFXLFNBQVMsUUFBUSxDQUFDLEdBQUc7QUFBQSxJQU85QyxJQUFJLElBQUksS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQUEsSUFFekIsSUFBSSxJQUFJLEVBQUUsT0FBTztBQUFBLElBRWpCLElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFBQSxJQUV6QixJQUFJLElBQUksS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQUEsSUFFekIsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQztBQUFBLElBRXZDLElBQUksSUFBSSxFQUFFLE9BQU8sQ0FBQztBQUFBLElBRWxCLElBQUksSUFBSSxFQUFFLE9BQU8sQ0FBQztBQUFBLElBRWxCLElBQUksTUFBTSxLQUFLLEVBQUUsT0FBTyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDO0FBQUEsSUFDNUUsSUFBSSxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxHQUFHO0FBQUEsSUFDL0IsSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osSUFBSSxLQUFLLE1BQU0sU0FBUztBQUFBLE1BRXRCLEtBQUssRUFBRSxPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxLQUFLLE1BQU0sTUFBTSxDQUFDLENBQUMsQ0FBQztBQUFBLE1BRXJELEtBQUssRUFBRSxPQUFPLENBQUM7QUFBQSxJQUNqQixFQUFPO0FBQUEsTUFFTCxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQUEsTUFFbkMsS0FBSyxLQUFLLE1BQU0sTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDO0FBQUE7QUFBQSxJQUVuQyxPQUFPLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxFQUFFO0FBQUE7QUFBQSxFQUdwQyxNQUFNLFVBQVUsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHO0FBQUEsSUFDcEMsSUFBSSxLQUFLLFdBQVc7QUFBQSxNQUNsQixPQUFPO0FBQUEsSUFDVCxJQUFJLEVBQUUsV0FBVztBQUFBLE1BQ2YsT0FBTztBQUFBLElBRVQsSUFBSSxLQUFLLE1BQU07QUFBQSxNQUNiLE9BQU8sS0FBSyxRQUFRLENBQUM7QUFBQSxJQUVyQjtBQUFBLGFBQU8sS0FBSyxTQUFTLENBQUM7QUFBQTtBQUFBLEVBRzFCLE1BQU0sVUFBVSxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUc7QUFBQSxJQUNwQyxJQUFJLEtBQUssWUFBWSxDQUFDO0FBQUEsTUFDcEIsT0FBTyxLQUFLLE1BQU0sYUFBYSxNQUFNLENBQUM7QUFBQSxJQUV0QztBQUFBLGFBQU8sS0FBSyxNQUFNLFNBQVMsTUFBTSxDQUFDO0FBQUE7QUFBQSxFQUd0QyxNQUFNLFVBQVUsU0FBUyxTQUFTLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSTtBQUFBLElBQ2xELE9BQU8sS0FBSyxNQUFNLFlBQVksR0FBRyxDQUFFLE1BQU0sQ0FBRSxHQUFHLENBQUUsSUFBSSxFQUFHLEdBQUcsR0FBRyxLQUFLO0FBQUE7QUFBQSxFQUdwRSxNQUFNLFVBQVUsVUFBVSxTQUFTLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSTtBQUFBLElBQ3BELE9BQU8sS0FBSyxNQUFNLFlBQVksR0FBRyxDQUFFLE1BQU0sQ0FBRSxHQUFHLENBQUUsSUFBSSxFQUFHLEdBQUcsR0FBRyxJQUFJO0FBQUE7QUFBQSxFQUduRSxNQUFNLFVBQVUsWUFBWSxTQUFTLFNBQVMsR0FBRztBQUFBLElBQy9DLElBQUksS0FBSztBQUFBLE1BQ1AsT0FBTztBQUFBLElBR1QsSUFBSSxLQUFLLEtBQUssRUFBRSxRQUFRO0FBQUEsSUFDeEIsS0FBSyxJQUFJLEtBQUssRUFBRSxPQUFPLEVBQUU7QUFBQSxJQUN6QixLQUFLLElBQUksS0FBSyxFQUFFLE9BQU8sRUFBRTtBQUFBLElBQ3pCLElBQUksS0FBSztBQUFBLE1BQ1AsS0FBSyxJQUFJLEtBQUssRUFBRSxPQUFPLEVBQUU7QUFBQSxJQUMzQixLQUFLLElBQUksS0FBSyxNQUFNO0FBQUEsSUFDcEIsS0FBSyxPQUFPO0FBQUEsSUFDWixPQUFPO0FBQUE7QUFBQSxFQUdULE1BQU0sVUFBVSxNQUFNLFNBQVMsR0FBRyxHQUFHO0FBQUEsSUFDbkMsT0FBTyxLQUFLLE1BQU0sTUFBTSxLQUFLLEVBQUUsT0FBTyxHQUNwQyxLQUFLLEdBQ0wsS0FBSyxHQUNMLEtBQUssS0FBSyxLQUFLLEVBQUUsT0FBTyxDQUFDO0FBQUE7QUFBQSxFQUc3QixNQUFNLFVBQVUsT0FBTyxTQUFTLElBQUksR0FBRztBQUFBLElBQ3JDLEtBQUssVUFBVTtBQUFBLElBQ2YsT0FBTyxLQUFLLEVBQUUsUUFBUTtBQUFBO0FBQUEsRUFHeEIsTUFBTSxVQUFVLE9BQU8sU0FBUyxJQUFJLEdBQUc7QUFBQSxJQUNyQyxLQUFLLFVBQVU7QUFBQSxJQUNmLE9BQU8sS0FBSyxFQUFFLFFBQVE7QUFBQTtBQUFBLEVBR3hCLE1BQU0sVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDLE9BQU87QUFBQSxJQUN0QyxPQUFPLFNBQVMsU0FDVCxLQUFLLEtBQUssRUFBRSxJQUFJLE1BQU0sS0FBSyxDQUFDLE1BQU0sS0FDbEMsS0FBSyxLQUFLLEVBQUUsSUFBSSxNQUFNLEtBQUssQ0FBQyxNQUFNO0FBQUE7QUFBQSxFQUczQyxNQUFNLFVBQVUsU0FBUyxTQUFTLE1BQU0sQ0FBQyxHQUFHO0FBQUEsSUFDMUMsSUFBSSxLQUFLLEVBQUUsTUFBTSxLQUFLLE1BQU0sR0FBRyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQUEsSUFDOUMsSUFBSSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU07QUFBQSxNQUNyQixPQUFPO0FBQUEsSUFFVCxJQUFJLEtBQUssRUFBRSxNQUFNO0FBQUEsSUFDakIsSUFBSSxJQUFJLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxDQUFDO0FBQUEsSUFDckMsVUFBUztBQUFBLE1BQ1AsR0FBRyxLQUFLLEtBQUssTUFBTSxDQUFDO0FBQUEsTUFDcEIsSUFBSSxHQUFHLElBQUksS0FBSyxNQUFNLENBQUMsS0FBSztBQUFBLFFBQzFCLE9BQU87QUFBQSxNQUVULEdBQUcsUUFBUSxDQUFDO0FBQUEsTUFDWixJQUFJLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTTtBQUFBLFFBQ3JCLE9BQU87QUFBQSxJQUNYO0FBQUE7QUFBQSxFQUlGLE1BQU0sVUFBVSxNQUFNLE1BQU0sVUFBVTtBQUFBLEVBQ3RDLE1BQU0sVUFBVSxXQUFXLE1BQU0sVUFBVTtBQUFBOzs7O0VDaGIzQyxJQUFJLFFBQVE7QUFBQSxFQUVaLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQTs7OztFQ0xOLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUVJLG1CQUFXO0FBQUEsRUFFbkIsU0FBUyxlQUFlLENBQUMsS0FBSyxHQUFHO0FBQUEsSUFDL0IsS0FBSyxJQUFJLFdBQVcsQ0FBQyxJQUFJLFdBQVksT0FBUTtBQUFBLE1BQzNDLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxJQUFJLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxRQUFRO0FBQUEsTUFDaEMsT0FBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLFFBQVEsSUFBSSxXQUFXLElBQUksQ0FBQyxJQUFJLFdBQVk7QUFBQTtBQUFBLEVBRzlDLFNBQVMsT0FBTyxDQUFDLEtBQUssS0FBSztBQUFBLElBQ3pCLElBQUksTUFBTSxRQUFRLEdBQUc7QUFBQSxNQUNuQixPQUFPLElBQUksTUFBTTtBQUFBLElBQ25CLEtBQUs7QUFBQSxNQUNILE9BQU8sQ0FBQztBQUFBLElBQ1YsSUFBSSxNQUFNLENBQUM7QUFBQSxJQUNYLElBQUksT0FBTyxRQUFRLFVBQVU7QUFBQSxNQUMzQixLQUFLLEtBQUs7QUFBQSxRQUtSLElBQUksSUFBSTtBQUFBLFFBQ1IsU0FBUyxJQUFJLEVBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSztBQUFBLFVBQ25DLElBQUksSUFBSSxJQUFJLFdBQVcsQ0FBQztBQUFBLFVBQ3hCLElBQUksSUFBSSxLQUFLO0FBQUEsWUFDWCxJQUFJLE9BQU87QUFBQSxVQUNiLEVBQU8sU0FBSSxJQUFJLE1BQU07QUFBQSxZQUNuQixJQUFJLE9BQVEsS0FBSyxJQUFLO0FBQUEsWUFDdEIsSUFBSSxPQUFRLElBQUksS0FBTTtBQUFBLFVBQ3hCLEVBQU8sU0FBSSxnQkFBZ0IsS0FBSyxDQUFDLEdBQUc7QUFBQSxZQUNsQyxJQUFJLFVBQVksSUFBSSxTQUFXLE9BQU8sSUFBSSxhQUFhLENBQUMsSUFBSTtBQUFBLFlBQzVELElBQUksT0FBUSxLQUFLLEtBQU07QUFBQSxZQUN2QixJQUFJLE9BQVMsS0FBSyxLQUFNLEtBQU07QUFBQSxZQUM5QixJQUFJLE9BQVMsS0FBSyxJQUFLLEtBQU07QUFBQSxZQUM3QixJQUFJLE9BQVEsSUFBSSxLQUFNO0FBQUEsVUFDeEIsRUFBTztBQUFBLFlBQ0wsSUFBSSxPQUFRLEtBQUssS0FBTTtBQUFBLFlBQ3ZCLElBQUksT0FBUyxLQUFLLElBQUssS0FBTTtBQUFBLFlBQzdCLElBQUksT0FBUSxJQUFJLEtBQU07QUFBQTtBQUFBLFFBRTFCO0FBQUEsTUFDRixFQUFPLFNBQUksUUFBUSxPQUFPO0FBQUEsUUFDeEIsTUFBTSxJQUFJLFFBQVEsZ0JBQWdCLEVBQUU7QUFBQSxRQUNwQyxJQUFJLElBQUksU0FBUyxNQUFNO0FBQUEsVUFDckIsTUFBTSxNQUFNO0FBQUEsUUFDZCxLQUFLLElBQUksRUFBRyxJQUFJLElBQUksUUFBUSxLQUFLO0FBQUEsVUFDL0IsSUFBSSxLQUFLLFNBQVMsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUFBLE1BQzlDO0FBQUEsSUFDRixFQUFPO0FBQUEsTUFDTCxLQUFLLElBQUksRUFBRyxJQUFJLElBQUksUUFBUTtBQUFBLFFBQzFCLElBQUksS0FBSyxJQUFJLEtBQUs7QUFBQTtBQUFBLElBRXRCLE9BQU87QUFBQTtBQUFBLEVBRUQsa0JBQVU7QUFBQSxFQUVsQixTQUFTLEtBQUssQ0FBQyxLQUFLO0FBQUEsSUFDbEIsSUFBSSxNQUFNO0FBQUEsSUFDVixTQUFTLElBQUksRUFBRyxJQUFJLElBQUksUUFBUTtBQUFBLE1BQzlCLE9BQU8sTUFBTSxJQUFJLEdBQUcsU0FBUyxFQUFFLENBQUM7QUFBQSxJQUNsQyxPQUFPO0FBQUE7QUFBQSxFQUVELGdCQUFRO0FBQUEsRUFFaEIsU0FBUyxLQUFLLENBQUMsR0FBRztBQUFBLElBQ2hCLElBQUksTUFBTyxNQUFNLEtBQ0wsTUFBTSxJQUFLLFFBQ1gsS0FBSyxJQUFLLFlBQ1YsSUFBSSxRQUFTO0FBQUEsSUFDekIsT0FBTyxRQUFRO0FBQUE7QUFBQSxFQUVULGdCQUFRO0FBQUEsRUFFaEIsU0FBUyxPQUFPLENBQUMsS0FBSyxRQUFRO0FBQUEsSUFDNUIsSUFBSSxNQUFNO0FBQUEsSUFDVixTQUFTLElBQUksRUFBRyxJQUFJLElBQUksUUFBUSxLQUFLO0FBQUEsTUFDbkMsSUFBSSxJQUFJLElBQUk7QUFBQSxNQUNaLElBQUksV0FBVztBQUFBLFFBQ2IsSUFBSSxNQUFNLENBQUM7QUFBQSxNQUNiLE9BQU8sTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBQUEsSUFDN0I7QUFBQSxJQUNBLE9BQU87QUFBQTtBQUFBLEVBRUQsa0JBQVU7QUFBQSxFQUVsQixTQUFTLEtBQUssQ0FBQyxNQUFNO0FBQUEsSUFDbkIsSUFBSSxLQUFLLFdBQVc7QUFBQSxNQUNsQixPQUFPLE1BQU07QUFBQSxJQUViO0FBQUEsYUFBTztBQUFBO0FBQUEsRUFFSCxnQkFBUTtBQUFBLEVBRWhCLFNBQVMsS0FBSyxDQUFDLE1BQU07QUFBQSxJQUNuQixJQUFJLEtBQUssV0FBVztBQUFBLE1BQ2xCLE9BQU8sTUFBTTtBQUFBLElBQ1YsU0FBSSxLQUFLLFdBQVc7QUFBQSxNQUN2QixPQUFPLE9BQU87QUFBQSxJQUNYLFNBQUksS0FBSyxXQUFXO0FBQUEsTUFDdkIsT0FBTyxRQUFRO0FBQUEsSUFDWixTQUFJLEtBQUssV0FBVztBQUFBLE1BQ3ZCLE9BQU8sU0FBUztBQUFBLElBQ2IsU0FBSSxLQUFLLFdBQVc7QUFBQSxNQUN2QixPQUFPLFVBQVU7QUFBQSxJQUNkLFNBQUksS0FBSyxXQUFXO0FBQUEsTUFDdkIsT0FBTyxXQUFXO0FBQUEsSUFDZixTQUFJLEtBQUssV0FBVztBQUFBLE1BQ3ZCLE9BQU8sWUFBWTtBQUFBLElBRW5CO0FBQUEsYUFBTztBQUFBO0FBQUEsRUFFSCxnQkFBUTtBQUFBLEVBRWhCLFNBQVMsTUFBTSxDQUFDLEtBQUssT0FBTyxLQUFLLFFBQVE7QUFBQSxJQUN2QyxJQUFJLE1BQU0sTUFBTTtBQUFBLElBQ2hCLE9BQU8sTUFBTSxNQUFNLENBQUM7QUFBQSxJQUNwQixJQUFJLE1BQU0sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUFBLElBQzNCLFNBQVMsSUFBSSxHQUFHLElBQUksTUFBTyxJQUFJLElBQUksUUFBUSxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ3RELElBQUk7QUFBQSxNQUNKLElBQUksV0FBVztBQUFBLFFBQ2IsSUFBSyxJQUFJLE1BQU0sS0FBTyxJQUFJLElBQUksTUFBTSxLQUFPLElBQUksSUFBSSxNQUFNLElBQUssSUFBSSxJQUFJO0FBQUEsTUFFdEU7QUFBQSxZQUFLLElBQUksSUFBSSxNQUFNLEtBQU8sSUFBSSxJQUFJLE1BQU0sS0FBTyxJQUFJLElBQUksTUFBTSxJQUFLLElBQUk7QUFBQSxNQUN4RSxJQUFJLEtBQUssTUFBTTtBQUFBLElBQ2pCO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxFQUVELGlCQUFTO0FBQUEsRUFFakIsU0FBUyxPQUFPLENBQUMsS0FBSyxRQUFRO0FBQUEsSUFDNUIsSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUFBLElBQ2xDLFNBQVMsSUFBSSxHQUFHLElBQUksRUFBRyxJQUFJLElBQUksUUFBUSxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ2xELElBQUksSUFBSSxJQUFJO0FBQUEsTUFDWixJQUFJLFdBQVcsT0FBTztBQUFBLFFBQ3BCLElBQUksS0FBSyxNQUFNO0FBQUEsUUFDZixJQUFJLElBQUksS0FBTSxNQUFNLEtBQU07QUFBQSxRQUMxQixJQUFJLElBQUksS0FBTSxNQUFNLElBQUs7QUFBQSxRQUN6QixJQUFJLElBQUksS0FBSyxJQUFJO0FBQUEsTUFDbkIsRUFBTztBQUFBLFFBQ0wsSUFBSSxJQUFJLEtBQUssTUFBTTtBQUFBLFFBQ25CLElBQUksSUFBSSxLQUFNLE1BQU0sS0FBTTtBQUFBLFFBQzFCLElBQUksSUFBSSxLQUFNLE1BQU0sSUFBSztBQUFBLFFBQ3pCLElBQUksS0FBSyxJQUFJO0FBQUE7QUFBQSxJQUVqQjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFFRCxrQkFBVTtBQUFBLEVBRWxCLFNBQVMsTUFBTSxDQUFDLEdBQUcsR0FBRztBQUFBLElBQ3BCLE9BQVEsTUFBTSxJQUFNLEtBQU0sS0FBSztBQUFBO0FBQUEsRUFFekIsaUJBQVM7QUFBQSxFQUVqQixTQUFTLE1BQU0sQ0FBQyxHQUFHLEdBQUc7QUFBQSxJQUNwQixPQUFRLEtBQUssSUFBTSxNQUFPLEtBQUs7QUFBQTtBQUFBLEVBRXpCLGlCQUFTO0FBQUEsRUFFakIsU0FBUyxLQUFLLENBQUMsR0FBRyxHQUFHO0FBQUEsSUFDbkIsT0FBUSxJQUFJLE1BQU87QUFBQTtBQUFBLEVBRWIsZ0JBQVE7QUFBQSxFQUVoQixTQUFTLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRztBQUFBLElBQ3hCLE9BQVEsSUFBSSxJQUFJLE1BQU87QUFBQTtBQUFBLEVBRWpCLGtCQUFVO0FBQUEsRUFFbEIsU0FBUyxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRztBQUFBLElBQzNCLE9BQVEsSUFBSSxJQUFJLElBQUksTUFBTztBQUFBO0FBQUEsRUFFckIsa0JBQVU7QUFBQSxFQUVsQixTQUFTLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFBQSxJQUM5QixPQUFRLElBQUksSUFBSSxJQUFJLElBQUksTUFBTztBQUFBO0FBQUEsRUFFekIsa0JBQVU7QUFBQSxFQUVsQixTQUFTLEtBQUssQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJO0FBQUEsSUFDL0IsSUFBSSxLQUFLLElBQUk7QUFBQSxJQUNiLElBQUksS0FBSyxJQUFJLE1BQU07QUFBQSxJQUVuQixJQUFJLEtBQU0sS0FBSyxPQUFRO0FBQUEsSUFDdkIsSUFBSSxNQUFNLEtBQUssS0FBSyxJQUFJLEtBQUssS0FBSztBQUFBLElBQ2xDLElBQUksT0FBTyxPQUFPO0FBQUEsSUFDbEIsSUFBSSxNQUFNLEtBQUs7QUFBQTtBQUFBLEVBRVQsZ0JBQVE7QUFBQSxFQUVoQixTQUFTLFFBQVEsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJO0FBQUEsSUFDaEMsSUFBSSxLQUFNLEtBQUssT0FBUTtBQUFBLElBQ3ZCLElBQUksTUFBTSxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUs7QUFBQSxJQUNsQyxPQUFPLE9BQU87QUFBQTtBQUFBLEVBRVIsbUJBQVc7QUFBQSxFQUVuQixTQUFTLFFBQVEsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJO0FBQUEsSUFDaEMsSUFBSSxLQUFLLEtBQUs7QUFBQSxJQUNkLE9BQU8sT0FBTztBQUFBO0FBQUEsRUFFUixtQkFBVztBQUFBLEVBRW5CLFNBQVMsVUFBVSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSTtBQUFBLElBQ2xELElBQUksUUFBUTtBQUFBLElBQ1osSUFBSSxLQUFLO0FBQUEsSUFDVCxLQUFNLEtBQUssT0FBUTtBQUFBLElBQ25CLFNBQVMsS0FBSyxLQUFLLElBQUk7QUFBQSxJQUN2QixLQUFNLEtBQUssT0FBUTtBQUFBLElBQ25CLFNBQVMsS0FBSyxLQUFLLElBQUk7QUFBQSxJQUN2QixLQUFNLEtBQUssT0FBUTtBQUFBLElBQ25CLFNBQVMsS0FBSyxLQUFLLElBQUk7QUFBQSxJQUV2QixJQUFJLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSztBQUFBLElBQzdCLE9BQU8sT0FBTztBQUFBO0FBQUEsRUFFUixxQkFBYTtBQUFBLEVBRXJCLFNBQVMsVUFBVSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSTtBQUFBLElBQ2xELElBQUksS0FBSyxLQUFLLEtBQUssS0FBSztBQUFBLElBQ3hCLE9BQU8sT0FBTztBQUFBO0FBQUEsRUFFUixxQkFBYTtBQUFBLEVBRXJCLFNBQVMsVUFBVSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUk7QUFBQSxJQUMxRCxJQUFJLFFBQVE7QUFBQSxJQUNaLElBQUksS0FBSztBQUFBLElBQ1QsS0FBTSxLQUFLLE9BQVE7QUFBQSxJQUNuQixTQUFTLEtBQUssS0FBSyxJQUFJO0FBQUEsSUFDdkIsS0FBTSxLQUFLLE9BQVE7QUFBQSxJQUNuQixTQUFTLEtBQUssS0FBSyxJQUFJO0FBQUEsSUFDdkIsS0FBTSxLQUFLLE9BQVE7QUFBQSxJQUNuQixTQUFTLEtBQUssS0FBSyxJQUFJO0FBQUEsSUFDdkIsS0FBTSxLQUFLLE9BQVE7QUFBQSxJQUNuQixTQUFTLEtBQUssS0FBSyxJQUFJO0FBQUEsSUFFdkIsSUFBSSxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSztBQUFBLElBQ2xDLE9BQU8sT0FBTztBQUFBO0FBQUEsRUFFUixxQkFBYTtBQUFBLEVBRXJCLFNBQVMsVUFBVSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUk7QUFBQSxJQUMxRCxJQUFJLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSztBQUFBLElBRTdCLE9BQU8sT0FBTztBQUFBO0FBQUEsRUFFUixxQkFBYTtBQUFBLEVBRXJCLFNBQVMsU0FBUyxDQUFDLElBQUksSUFBSSxLQUFLO0FBQUEsSUFDOUIsSUFBSSxJQUFLLE1BQU8sS0FBSyxNQUFTLE9BQU87QUFBQSxJQUNyQyxPQUFPLE1BQU07QUFBQTtBQUFBLEVBRVAsb0JBQVk7QUFBQSxFQUVwQixTQUFTLFNBQVMsQ0FBQyxJQUFJLElBQUksS0FBSztBQUFBLElBQzlCLElBQUksSUFBSyxNQUFPLEtBQUssTUFBUyxPQUFPO0FBQUEsSUFDckMsT0FBTyxNQUFNO0FBQUE7QUFBQSxFQUVQLG9CQUFZO0FBQUEsRUFFcEIsU0FBUyxRQUFRLENBQUMsSUFBSSxJQUFJLEtBQUs7QUFBQSxJQUM3QixPQUFPLE9BQU87QUFBQTtBQUFBLEVBRVIsbUJBQVc7QUFBQSxFQUVuQixTQUFTLFFBQVEsQ0FBQyxJQUFJLElBQUksS0FBSztBQUFBLElBQzdCLElBQUksSUFBSyxNQUFPLEtBQUssTUFBUyxPQUFPO0FBQUEsSUFDckMsT0FBTyxNQUFNO0FBQUE7QUFBQSxFQUVQLG1CQUFXO0FBQUE7Ozs7RUNuUm5CLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUVKLFNBQVMsU0FBUyxHQUFHO0FBQUEsSUFDbkIsS0FBSyxVQUFVO0FBQUEsSUFDZixLQUFLLGVBQWU7QUFBQSxJQUNwQixLQUFLLFlBQVksS0FBSyxZQUFZO0FBQUEsSUFDbEMsS0FBSyxVQUFVLEtBQUssWUFBWTtBQUFBLElBQ2hDLEtBQUssZUFBZSxLQUFLLFlBQVk7QUFBQSxJQUNyQyxLQUFLLFlBQVksS0FBSyxZQUFZLFlBQVk7QUFBQSxJQUM5QyxLQUFLLFNBQVM7QUFBQSxJQUVkLEtBQUssVUFBVSxLQUFLLFlBQVk7QUFBQSxJQUNoQyxLQUFLLFdBQVcsS0FBSyxZQUFZO0FBQUE7QUFBQSxFQUUzQixvQkFBWTtBQUFBLEVBRXBCLFVBQVUsVUFBVSxTQUFTLFNBQVMsTUFBTSxDQUFDLEtBQUssS0FBSztBQUFBLElBRXJELE1BQU0sTUFBTSxRQUFRLEtBQUssR0FBRztBQUFBLElBQzVCLEtBQUssS0FBSztBQUFBLE1BQ1IsS0FBSyxVQUFVO0FBQUEsSUFFZjtBQUFBLFdBQUssVUFBVSxLQUFLLFFBQVEsT0FBTyxHQUFHO0FBQUEsSUFDeEMsS0FBSyxnQkFBZ0IsSUFBSTtBQUFBLElBR3pCLElBQUksS0FBSyxRQUFRLFVBQVUsS0FBSyxTQUFTO0FBQUEsTUFDdkMsTUFBTSxLQUFLO0FBQUEsTUFHWCxJQUFJLElBQUksSUFBSSxTQUFTLEtBQUs7QUFBQSxNQUMxQixLQUFLLFVBQVUsSUFBSSxNQUFNLElBQUksU0FBUyxHQUFHLElBQUksTUFBTTtBQUFBLE1BQ25ELElBQUksS0FBSyxRQUFRLFdBQVc7QUFBQSxRQUMxQixLQUFLLFVBQVU7QUFBQSxNQUVqQixNQUFNLE1BQU0sT0FBTyxLQUFLLEdBQUcsSUFBSSxTQUFTLEdBQUcsS0FBSyxNQUFNO0FBQUEsTUFDdEQsU0FBUyxJQUFJLEVBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSyxLQUFLO0FBQUEsUUFDeEMsS0FBSyxRQUFRLEtBQUssR0FBRyxJQUFJLEtBQUssUUFBUTtBQUFBLElBQzFDO0FBQUEsSUFFQSxPQUFPO0FBQUE7QUFBQSxFQUdULFVBQVUsVUFBVSxTQUFTLFNBQVMsTUFBTSxDQUFDLEtBQUs7QUFBQSxJQUNoRCxLQUFLLE9BQU8sS0FBSyxLQUFLLENBQUM7QUFBQSxJQUN2QixPQUFPLEtBQUssWUFBWSxJQUFJO0FBQUEsSUFFNUIsT0FBTyxLQUFLLFFBQVEsR0FBRztBQUFBO0FBQUEsRUFHekIsVUFBVSxVQUFVLE9BQU8sU0FBUyxHQUFHLEdBQUc7QUFBQSxJQUN4QyxJQUFJLE1BQU0sS0FBSztBQUFBLElBQ2YsSUFBSSxRQUFRLEtBQUs7QUFBQSxJQUNqQixJQUFJLElBQUksU0FBVSxNQUFNLEtBQUssYUFBYTtBQUFBLElBQzFDLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxLQUFLLFNBQVM7QUFBQSxJQUN0QyxJQUFJLEtBQUs7QUFBQSxJQUNULFNBQVMsSUFBSSxFQUFHLElBQUksR0FBRztBQUFBLE1BQ3JCLElBQUksS0FBSztBQUFBLElBR1gsUUFBUTtBQUFBLElBQ1IsSUFBSSxLQUFLLFdBQVcsT0FBTztBQUFBLE1BQ3pCLFNBQVMsSUFBSSxFQUFHLElBQUksS0FBSyxXQUFXO0FBQUEsUUFDbEMsSUFBSSxPQUFPO0FBQUEsTUFFYixJQUFJLE9BQU87QUFBQSxNQUNYLElBQUksT0FBTztBQUFBLE1BQ1gsSUFBSSxPQUFPO0FBQUEsTUFDWCxJQUFJLE9BQU87QUFBQSxNQUNYLElBQUksT0FBUSxRQUFRLEtBQU07QUFBQSxNQUMxQixJQUFJLE9BQVEsUUFBUSxLQUFNO0FBQUEsTUFDMUIsSUFBSSxPQUFRLFFBQVEsSUFBSztBQUFBLE1BQ3pCLElBQUksT0FBTyxNQUFNO0FBQUEsSUFDbkIsRUFBTztBQUFBLE1BQ0wsSUFBSSxPQUFPLE1BQU07QUFBQSxNQUNqQixJQUFJLE9BQVEsUUFBUSxJQUFLO0FBQUEsTUFDekIsSUFBSSxPQUFRLFFBQVEsS0FBTTtBQUFBLE1BQzFCLElBQUksT0FBUSxRQUFRLEtBQU07QUFBQSxNQUMxQixJQUFJLE9BQU87QUFBQSxNQUNYLElBQUksT0FBTztBQUFBLE1BQ1gsSUFBSSxPQUFPO0FBQUEsTUFDWCxJQUFJLE9BQU87QUFBQSxNQUVYLEtBQUssSUFBSSxFQUFHLElBQUksS0FBSyxXQUFXO0FBQUEsUUFDOUIsSUFBSSxPQUFPO0FBQUE7QUFBQSxJQUdmLE9BQU87QUFBQTtBQUFBOzs7O0VDeEZULElBQUk7QUFBQSxFQUNKLElBQUksU0FBUyxNQUFNO0FBQUEsRUFFbkIsU0FBUyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRztBQUFBLElBQ3hCLElBQUksTUFBTTtBQUFBLE1BQ1IsT0FBTyxLQUFLLEdBQUcsR0FBRyxDQUFDO0FBQUEsSUFDckIsSUFBSSxNQUFNLEtBQUssTUFBTTtBQUFBLE1BQ25CLE9BQU8sSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUFBLElBQ3BCLElBQUksTUFBTTtBQUFBLE1BQ1IsT0FBTyxNQUFNLEdBQUcsR0FBRyxDQUFDO0FBQUE7QUFBQSxFQUVoQixlQUFPO0FBQUEsRUFFZixTQUFTLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRztBQUFBLElBQ3JCLE9BQVEsSUFBSSxLQUFRLElBQUs7QUFBQTtBQUFBLEVBRW5CLGVBQU87QUFBQSxFQUVmLFNBQVMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHO0FBQUEsSUFDdEIsT0FBUSxJQUFJLElBQU0sSUFBSSxJQUFNLElBQUk7QUFBQTtBQUFBLEVBRTFCLGdCQUFRO0FBQUEsRUFFaEIsU0FBUyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUc7QUFBQSxJQUNwQixPQUFPLElBQUksSUFBSTtBQUFBO0FBQUEsRUFFVCxjQUFNO0FBQUEsRUFFZCxTQUFTLE1BQU0sQ0FBQyxHQUFHO0FBQUEsSUFDakIsT0FBTyxPQUFPLEdBQUcsQ0FBQyxJQUFJLE9BQU8sR0FBRyxFQUFFLElBQUksT0FBTyxHQUFHLEVBQUU7QUFBQTtBQUFBLEVBRTVDLGlCQUFTO0FBQUEsRUFFakIsU0FBUyxNQUFNLENBQUMsR0FBRztBQUFBLElBQ2pCLE9BQU8sT0FBTyxHQUFHLENBQUMsSUFBSSxPQUFPLEdBQUcsRUFBRSxJQUFJLE9BQU8sR0FBRyxFQUFFO0FBQUE7QUFBQSxFQUU1QyxpQkFBUztBQUFBLEVBRWpCLFNBQVMsTUFBTSxDQUFDLEdBQUc7QUFBQSxJQUNqQixPQUFPLE9BQU8sR0FBRyxDQUFDLElBQUksT0FBTyxHQUFHLEVBQUUsSUFBSyxNQUFNO0FBQUE7QUFBQSxFQUV2QyxpQkFBUztBQUFBLEVBRWpCLFNBQVMsTUFBTSxDQUFDLEdBQUc7QUFBQSxJQUNqQixPQUFPLE9BQU8sR0FBRyxFQUFFLElBQUksT0FBTyxHQUFHLEVBQUUsSUFBSyxNQUFNO0FBQUE7QUFBQSxFQUV4QyxpQkFBUztBQUFBOzs7O0VDOUNqQixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFFSixJQUFJLFNBQVMsTUFBTTtBQUFBLEVBQ25CLElBQUksUUFBUSxNQUFNO0FBQUEsRUFDbEIsSUFBSSxVQUFVLE1BQU07QUFBQSxFQUNwQixJQUFJLE9BQU8sVUFBVTtBQUFBLEVBQ3JCLElBQUksWUFBWSxPQUFPO0FBQUEsRUFFdkIsSUFBSSxTQUFTO0FBQUEsSUFDWDtBQUFBLElBQVk7QUFBQSxJQUNaO0FBQUEsSUFBWTtBQUFBLEVBQ2Q7QUFBQSxFQUVBLFNBQVMsSUFBSSxHQUFHO0FBQUEsSUFDZCxNQUFNLGdCQUFnQjtBQUFBLE1BQ3BCLE9BQU8sSUFBSTtBQUFBLElBRWIsVUFBVSxLQUFLLElBQUk7QUFBQSxJQUNuQixLQUFLLElBQUk7QUFBQSxNQUNQO0FBQUEsTUFBWTtBQUFBLE1BQVk7QUFBQSxNQUN4QjtBQUFBLE1BQVk7QUFBQSxJQUFXO0FBQUEsSUFDekIsS0FBSyxJQUFJLElBQUksTUFBTSxFQUFFO0FBQUE7QUFBQSxFQUd2QixNQUFNLFNBQVMsTUFBTSxTQUFTO0FBQUEsRUFDOUIsT0FBTyxVQUFVO0FBQUEsRUFFakIsS0FBSyxZQUFZO0FBQUEsRUFDakIsS0FBSyxVQUFVO0FBQUEsRUFDZixLQUFLLGVBQWU7QUFBQSxFQUNwQixLQUFLLFlBQVk7QUFBQSxFQUVqQixLQUFLLFVBQVUsVUFBVSxTQUFTLE9BQU8sQ0FBQyxLQUFLLE9BQU87QUFBQSxJQUNwRCxJQUFJLElBQUksS0FBSztBQUFBLElBRWIsU0FBUyxJQUFJLEVBQUcsSUFBSSxJQUFJO0FBQUEsTUFDdEIsRUFBRSxLQUFLLElBQUksUUFBUTtBQUFBLElBRXJCLE1BQU0sSUFBSSxFQUFFLFFBQVE7QUFBQSxNQUNsQixFQUFFLEtBQUssT0FBTyxFQUFFLElBQUksS0FBSyxFQUFFLElBQUksS0FBSyxFQUFFLElBQUksTUFBTSxFQUFFLElBQUksS0FBSyxDQUFDO0FBQUEsSUFFOUQsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBQ2YsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBQ2YsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBQ2YsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBQ2YsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBRWYsS0FBSyxJQUFJLEVBQUcsSUFBSSxFQUFFLFFBQVEsS0FBSztBQUFBLE1BQzdCLElBQUksT0FBTyxJQUFJO0FBQUEsTUFDZixJQUFJLElBQUksUUFBUSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLE9BQU8sRUFBRTtBQUFBLE1BQ2xFLElBQUk7QUFBQSxNQUNKLElBQUk7QUFBQSxNQUNKLElBQUksT0FBTyxHQUFHLEVBQUU7QUFBQSxNQUNoQixJQUFJO0FBQUEsTUFDSixJQUFJO0FBQUEsSUFDTjtBQUFBLElBRUEsS0FBSyxFQUFFLEtBQUssTUFBTSxLQUFLLEVBQUUsSUFBSSxDQUFDO0FBQUEsSUFDOUIsS0FBSyxFQUFFLEtBQUssTUFBTSxLQUFLLEVBQUUsSUFBSSxDQUFDO0FBQUEsSUFDOUIsS0FBSyxFQUFFLEtBQUssTUFBTSxLQUFLLEVBQUUsSUFBSSxDQUFDO0FBQUEsSUFDOUIsS0FBSyxFQUFFLEtBQUssTUFBTSxLQUFLLEVBQUUsSUFBSSxDQUFDO0FBQUEsSUFDOUIsS0FBSyxFQUFFLEtBQUssTUFBTSxLQUFLLEVBQUUsSUFBSSxDQUFDO0FBQUE7QUFBQSxFQUdoQyxLQUFLLFVBQVUsVUFBVSxTQUFTLE1BQU0sQ0FBQyxLQUFLO0FBQUEsSUFDNUMsSUFBSSxRQUFRO0FBQUEsTUFDVixPQUFPLE1BQU0sUUFBUSxLQUFLLEdBQUcsS0FBSztBQUFBLElBRWxDO0FBQUEsYUFBTyxNQUFNLFFBQVEsS0FBSyxHQUFHLEtBQUs7QUFBQTtBQUFBOzs7O0VDdEV0QyxJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFFSixJQUFJLFFBQVEsTUFBTTtBQUFBLEVBQ2xCLElBQUksVUFBVSxNQUFNO0FBQUEsRUFDcEIsSUFBSSxVQUFVLE1BQU07QUFBQSxFQUNwQixJQUFJLE9BQU8sVUFBVTtBQUFBLEVBQ3JCLElBQUksUUFBUSxVQUFVO0FBQUEsRUFDdEIsSUFBSSxTQUFTLFVBQVU7QUFBQSxFQUN2QixJQUFJLFNBQVMsVUFBVTtBQUFBLEVBQ3ZCLElBQUksU0FBUyxVQUFVO0FBQUEsRUFDdkIsSUFBSSxTQUFTLFVBQVU7QUFBQSxFQUV2QixJQUFJLFlBQVksT0FBTztBQUFBLEVBRXZCLElBQUksV0FBVztBQUFBLElBQ2I7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxFQUN0QztBQUFBLEVBRUEsU0FBUyxNQUFNLEdBQUc7QUFBQSxJQUNoQixNQUFNLGdCQUFnQjtBQUFBLE1BQ3BCLE9BQU8sSUFBSTtBQUFBLElBRWIsVUFBVSxLQUFLLElBQUk7QUFBQSxJQUNuQixLQUFLLElBQUk7QUFBQSxNQUNQO0FBQUEsTUFBWTtBQUFBLE1BQVk7QUFBQSxNQUFZO0FBQUEsTUFDcEM7QUFBQSxNQUFZO0FBQUEsTUFBWTtBQUFBLE1BQVk7QUFBQSxJQUN0QztBQUFBLElBQ0EsS0FBSyxJQUFJO0FBQUEsSUFDVCxLQUFLLElBQUksSUFBSSxNQUFNLEVBQUU7QUFBQTtBQUFBLEVBRXZCLE1BQU0sU0FBUyxRQUFRLFNBQVM7QUFBQSxFQUNoQyxPQUFPLFVBQVU7QUFBQSxFQUVqQixPQUFPLFlBQVk7QUFBQSxFQUNuQixPQUFPLFVBQVU7QUFBQSxFQUNqQixPQUFPLGVBQWU7QUFBQSxFQUN0QixPQUFPLFlBQVk7QUFBQSxFQUVuQixPQUFPLFVBQVUsVUFBVSxTQUFTLE9BQU8sQ0FBQyxLQUFLLE9BQU87QUFBQSxJQUN0RCxJQUFJLElBQUksS0FBSztBQUFBLElBRWIsU0FBUyxJQUFJLEVBQUcsSUFBSSxJQUFJO0FBQUEsTUFDdEIsRUFBRSxLQUFLLElBQUksUUFBUTtBQUFBLElBQ3JCLE1BQU8sSUFBSSxFQUFFLFFBQVE7QUFBQSxNQUNuQixFQUFFLEtBQUssUUFBUSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLElBQUksT0FBTyxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHO0FBQUEsSUFFekUsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBQ2YsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBQ2YsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBQ2YsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBQ2YsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBQ2YsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBQ2YsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBQ2YsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBRWYsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU07QUFBQSxJQUNqQyxLQUFLLElBQUksRUFBRyxJQUFJLEVBQUUsUUFBUSxLQUFLO0FBQUEsTUFDN0IsSUFBSSxLQUFLLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO0FBQUEsTUFDN0QsSUFBSSxLQUFLLE1BQU0sT0FBTyxDQUFDLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQUEsTUFDeEMsSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSSxNQUFNLEdBQUcsRUFBRTtBQUFBLE1BQ2YsSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSSxNQUFNLElBQUksRUFBRTtBQUFBLElBQ2xCO0FBQUEsSUFFQSxLQUFLLEVBQUUsS0FBSyxNQUFNLEtBQUssRUFBRSxJQUFJLENBQUM7QUFBQSxJQUM5QixLQUFLLEVBQUUsS0FBSyxNQUFNLEtBQUssRUFBRSxJQUFJLENBQUM7QUFBQSxJQUM5QixLQUFLLEVBQUUsS0FBSyxNQUFNLEtBQUssRUFBRSxJQUFJLENBQUM7QUFBQSxJQUM5QixLQUFLLEVBQUUsS0FBSyxNQUFNLEtBQUssRUFBRSxJQUFJLENBQUM7QUFBQSxJQUM5QixLQUFLLEVBQUUsS0FBSyxNQUFNLEtBQUssRUFBRSxJQUFJLENBQUM7QUFBQSxJQUM5QixLQUFLLEVBQUUsS0FBSyxNQUFNLEtBQUssRUFBRSxJQUFJLENBQUM7QUFBQSxJQUM5QixLQUFLLEVBQUUsS0FBSyxNQUFNLEtBQUssRUFBRSxJQUFJLENBQUM7QUFBQSxJQUM5QixLQUFLLEVBQUUsS0FBSyxNQUFNLEtBQUssRUFBRSxJQUFJLENBQUM7QUFBQTtBQUFBLEVBR2hDLE9BQU8sVUFBVSxVQUFVLFNBQVMsTUFBTSxDQUFDLEtBQUs7QUFBQSxJQUM5QyxJQUFJLFFBQVE7QUFBQSxNQUNWLE9BQU8sTUFBTSxRQUFRLEtBQUssR0FBRyxLQUFLO0FBQUEsSUFFbEM7QUFBQSxhQUFPLE1BQU0sUUFBUSxLQUFLLEdBQUcsS0FBSztBQUFBO0FBQUE7Ozs7RUNyR3RDLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUVKLFNBQVMsTUFBTSxHQUFHO0FBQUEsSUFDaEIsTUFBTSxnQkFBZ0I7QUFBQSxNQUNwQixPQUFPLElBQUk7QUFBQSxJQUViLE9BQU8sS0FBSyxJQUFJO0FBQUEsSUFDaEIsS0FBSyxJQUFJO0FBQUEsTUFDUDtBQUFBLE1BQVk7QUFBQSxNQUFZO0FBQUEsTUFBWTtBQUFBLE1BQ3BDO0FBQUEsTUFBWTtBQUFBLE1BQVk7QUFBQSxNQUFZO0FBQUEsSUFBVztBQUFBO0FBQUEsRUFFbkQsTUFBTSxTQUFTLFFBQVEsTUFBTTtBQUFBLEVBQzdCLE9BQU8sVUFBVTtBQUFBLEVBRWpCLE9BQU8sWUFBWTtBQUFBLEVBQ25CLE9BQU8sVUFBVTtBQUFBLEVBQ2pCLE9BQU8sZUFBZTtBQUFBLEVBQ3RCLE9BQU8sWUFBWTtBQUFBLEVBRW5CLE9BQU8sVUFBVSxVQUFVLFNBQVMsTUFBTSxDQUFDLEtBQUs7QUFBQSxJQUU5QyxJQUFJLFFBQVE7QUFBQSxNQUNWLE9BQU8sTUFBTSxRQUFRLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEtBQUs7QUFBQSxJQUU5QztBQUFBLGFBQU8sTUFBTSxRQUFRLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEtBQUs7QUFBQTtBQUFBOzs7O0VDekJsRCxJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFFSixJQUFJLFlBQVksTUFBTTtBQUFBLEVBQ3RCLElBQUksWUFBWSxNQUFNO0FBQUEsRUFDdEIsSUFBSSxXQUFXLE1BQU07QUFBQSxFQUNyQixJQUFJLFdBQVcsTUFBTTtBQUFBLEVBQ3JCLElBQUksUUFBUSxNQUFNO0FBQUEsRUFDbEIsSUFBSSxXQUFXLE1BQU07QUFBQSxFQUNyQixJQUFJLFdBQVcsTUFBTTtBQUFBLEVBQ3JCLElBQUksYUFBYSxNQUFNO0FBQUEsRUFDdkIsSUFBSSxhQUFhLE1BQU07QUFBQSxFQUN2QixJQUFJLGFBQWEsTUFBTTtBQUFBLEVBQ3ZCLElBQUksYUFBYSxNQUFNO0FBQUEsRUFFdkIsSUFBSSxZQUFZLE9BQU87QUFBQSxFQUV2QixJQUFJLFdBQVc7QUFBQSxJQUNiO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFDcEM7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUNwQztBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsSUFBWTtBQUFBLElBQ3BDO0FBQUEsSUFBWTtBQUFBLElBQVk7QUFBQSxJQUFZO0FBQUEsRUFDdEM7QUFBQSxFQUVBLFNBQVMsTUFBTSxHQUFHO0FBQUEsSUFDaEIsTUFBTSxnQkFBZ0I7QUFBQSxNQUNwQixPQUFPLElBQUk7QUFBQSxJQUViLFVBQVUsS0FBSyxJQUFJO0FBQUEsSUFDbkIsS0FBSyxJQUFJO0FBQUEsTUFDUDtBQUFBLE1BQVk7QUFBQSxNQUNaO0FBQUEsTUFBWTtBQUFBLE1BQ1o7QUFBQSxNQUFZO0FBQUEsTUFDWjtBQUFBLE1BQVk7QUFBQSxNQUNaO0FBQUEsTUFBWTtBQUFBLE1BQ1o7QUFBQSxNQUFZO0FBQUEsTUFDWjtBQUFBLE1BQVk7QUFBQSxNQUNaO0FBQUEsTUFBWTtBQUFBLElBQVc7QUFBQSxJQUN6QixLQUFLLElBQUk7QUFBQSxJQUNULEtBQUssSUFBSSxJQUFJLE1BQU0sR0FBRztBQUFBO0FBQUEsRUFFeEIsTUFBTSxTQUFTLFFBQVEsU0FBUztBQUFBLEVBQ2hDLE9BQU8sVUFBVTtBQUFBLEVBRWpCLE9BQU8sWUFBWTtBQUFBLEVBQ25CLE9BQU8sVUFBVTtBQUFBLEVBQ2pCLE9BQU8sZUFBZTtBQUFBLEVBQ3RCLE9BQU8sWUFBWTtBQUFBLEVBRW5CLE9BQU8sVUFBVSxnQkFBZ0IsU0FBUyxhQUFhLENBQUMsS0FBSyxPQUFPO0FBQUEsSUFDbEUsSUFBSSxJQUFJLEtBQUs7QUFBQSxJQUdiLFNBQVMsSUFBSSxFQUFHLElBQUksSUFBSTtBQUFBLE1BQ3RCLEVBQUUsS0FBSyxJQUFJLFFBQVE7QUFBQSxJQUNyQixNQUFPLElBQUksRUFBRSxRQUFRLEtBQUssR0FBRztBQUFBLE1BQzNCLElBQUksUUFBUSxVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFO0FBQUEsTUFDeEMsSUFBSSxRQUFRLFVBQVUsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUU7QUFBQSxNQUN4QyxJQUFJLFFBQVEsRUFBRSxJQUFJO0FBQUEsTUFDbEIsSUFBSSxRQUFRLEVBQUUsSUFBSTtBQUFBLE1BQ2xCLElBQUksUUFBUSxVQUFVLEVBQUUsSUFBSSxLQUFLLEVBQUUsSUFBSSxHQUFHO0FBQUEsTUFDMUMsSUFBSSxRQUFRLFVBQVUsRUFBRSxJQUFJLEtBQUssRUFBRSxJQUFJLEdBQUc7QUFBQSxNQUMxQyxJQUFJLFFBQVEsRUFBRSxJQUFJO0FBQUEsTUFDbEIsSUFBSSxRQUFRLEVBQUUsSUFBSTtBQUFBLE1BRWxCLEVBQUUsS0FBSyxXQUNMLE9BQU8sT0FDUCxPQUFPLE9BQ1AsT0FBTyxPQUNQLE9BQU8sS0FBSztBQUFBLE1BQ2QsRUFBRSxJQUFJLEtBQUssV0FDVCxPQUFPLE9BQ1AsT0FBTyxPQUNQLE9BQU8sT0FDUCxPQUFPLEtBQUs7QUFBQSxJQUNoQjtBQUFBO0FBQUEsRUFHRixPQUFPLFVBQVUsVUFBVSxTQUFTLE9BQU8sQ0FBQyxLQUFLLE9BQU87QUFBQSxJQUN0RCxLQUFLLGNBQWMsS0FBSyxLQUFLO0FBQUEsSUFFN0IsSUFBSSxJQUFJLEtBQUs7QUFBQSxJQUViLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNoQixJQUFJLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDaEIsSUFBSSxLQUFLLEtBQUssRUFBRTtBQUFBLElBQ2hCLElBQUksS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUVoQixPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTTtBQUFBLElBQ2pDLFNBQVMsSUFBSSxFQUFHLElBQUksRUFBRSxRQUFRLEtBQUssR0FBRztBQUFBLE1BQ3BDLElBQUksUUFBUTtBQUFBLE1BQ1osSUFBSSxRQUFRO0FBQUEsTUFDWixJQUFJLFFBQVEsVUFBVSxJQUFJLEVBQUU7QUFBQSxNQUM1QixJQUFJLFFBQVEsVUFBVSxJQUFJLEVBQUU7QUFBQSxNQUM1QixJQUFJLFFBQVEsUUFBUSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtBQUFBLE1BQzFDLElBQUksUUFBUSxRQUFRLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO0FBQUEsTUFDMUMsSUFBSSxRQUFRLEtBQUssRUFBRTtBQUFBLE1BQ25CLElBQUksUUFBUSxLQUFLLEVBQUUsSUFBSTtBQUFBLE1BQ3ZCLElBQUksUUFBUSxFQUFFO0FBQUEsTUFDZCxJQUFJLFFBQVEsRUFBRSxJQUFJO0FBQUEsTUFFbEIsSUFBSSxRQUFRLFdBQ1YsT0FBTyxPQUNQLE9BQU8sT0FDUCxPQUFPLE9BQ1AsT0FBTyxPQUNQLE9BQU8sS0FBSztBQUFBLE1BQ2QsSUFBSSxRQUFRLFdBQ1YsT0FBTyxPQUNQLE9BQU8sT0FDUCxPQUFPLE9BQ1AsT0FBTyxPQUNQLE9BQU8sS0FBSztBQUFBLE1BRWQsUUFBUSxVQUFVLElBQUksRUFBRTtBQUFBLE1BQ3hCLFFBQVEsVUFBVSxJQUFJLEVBQUU7QUFBQSxNQUN4QixRQUFRLFNBQVMsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7QUFBQSxNQUN2QyxRQUFRLFNBQVMsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7QUFBQSxNQUV2QyxJQUFJLFFBQVEsU0FBUyxPQUFPLE9BQU8sT0FBTyxLQUFLO0FBQUEsTUFDL0MsSUFBSSxRQUFRLFNBQVMsT0FBTyxPQUFPLE9BQU8sS0FBSztBQUFBLE1BRS9DLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUVMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUVMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUVMLEtBQUssU0FBUyxJQUFJLElBQUksT0FBTyxLQUFLO0FBQUEsTUFDbEMsS0FBSyxTQUFTLElBQUksSUFBSSxPQUFPLEtBQUs7QUFBQSxNQUVsQyxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFFTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFFTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFFTCxLQUFLLFNBQVMsT0FBTyxPQUFPLE9BQU8sS0FBSztBQUFBLE1BQ3hDLEtBQUssU0FBUyxPQUFPLE9BQU8sT0FBTyxLQUFLO0FBQUEsSUFDMUM7QUFBQSxJQUVBLE1BQU0sS0FBSyxHQUFHLEdBQUcsSUFBSSxFQUFFO0FBQUEsSUFDdkIsTUFBTSxLQUFLLEdBQUcsR0FBRyxJQUFJLEVBQUU7QUFBQSxJQUN2QixNQUFNLEtBQUssR0FBRyxHQUFHLElBQUksRUFBRTtBQUFBLElBQ3ZCLE1BQU0sS0FBSyxHQUFHLEdBQUcsSUFBSSxFQUFFO0FBQUEsSUFDdkIsTUFBTSxLQUFLLEdBQUcsR0FBRyxJQUFJLEVBQUU7QUFBQSxJQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRTtBQUFBLElBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFO0FBQUEsSUFDeEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFBQTtBQUFBLEVBRzFCLE9BQU8sVUFBVSxVQUFVLFNBQVMsTUFBTSxDQUFDLEtBQUs7QUFBQSxJQUM5QyxJQUFJLFFBQVE7QUFBQSxNQUNWLE9BQU8sTUFBTSxRQUFRLEtBQUssR0FBRyxLQUFLO0FBQUEsSUFFbEM7QUFBQSxhQUFPLE1BQU0sUUFBUSxLQUFLLEdBQUcsS0FBSztBQUFBO0FBQUEsRUFHdEMsU0FBUyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJO0FBQUEsSUFDbkMsSUFBSSxJQUFLLEtBQUssTUFBUyxLQUFNO0FBQUEsSUFDN0IsSUFBSSxJQUFJO0FBQUEsTUFDTixLQUFLO0FBQUEsSUFDUCxPQUFPO0FBQUE7QUFBQSxFQUdULFNBQVMsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJO0FBQUEsSUFDdkMsSUFBSSxJQUFLLEtBQUssTUFBUyxLQUFNO0FBQUEsSUFDN0IsSUFBSSxJQUFJO0FBQUEsTUFDTixLQUFLO0FBQUEsSUFDUCxPQUFPO0FBQUE7QUFBQSxFQUdULFNBQVMsUUFBUSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSTtBQUFBLElBQ3BDLElBQUksSUFBSyxLQUFLLEtBQU8sS0FBSyxLQUFPLEtBQUs7QUFBQSxJQUN0QyxJQUFJLElBQUk7QUFBQSxNQUNOLEtBQUs7QUFBQSxJQUNQLE9BQU87QUFBQTtBQUFBLEVBR1QsU0FBUyxRQUFRLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUk7QUFBQSxJQUN4QyxJQUFJLElBQUssS0FBSyxLQUFPLEtBQUssS0FBTyxLQUFLO0FBQUEsSUFDdEMsSUFBSSxJQUFJO0FBQUEsTUFDTixLQUFLO0FBQUEsSUFDUCxPQUFPO0FBQUE7QUFBQSxFQUdULFNBQVMsU0FBUyxDQUFDLElBQUksSUFBSTtBQUFBLElBQ3pCLElBQUksUUFBUSxVQUFVLElBQUksSUFBSSxFQUFFO0FBQUEsSUFDaEMsSUFBSSxRQUFRLFVBQVUsSUFBSSxJQUFJLENBQUM7QUFBQSxJQUMvQixJQUFJLFFBQVEsVUFBVSxJQUFJLElBQUksQ0FBQztBQUFBLElBRS9CLElBQUksSUFBSSxRQUFRLFFBQVE7QUFBQSxJQUN4QixJQUFJLElBQUk7QUFBQSxNQUNOLEtBQUs7QUFBQSxJQUNQLE9BQU87QUFBQTtBQUFBLEVBR1QsU0FBUyxTQUFTLENBQUMsSUFBSSxJQUFJO0FBQUEsSUFDekIsSUFBSSxRQUFRLFVBQVUsSUFBSSxJQUFJLEVBQUU7QUFBQSxJQUNoQyxJQUFJLFFBQVEsVUFBVSxJQUFJLElBQUksQ0FBQztBQUFBLElBQy9CLElBQUksUUFBUSxVQUFVLElBQUksSUFBSSxDQUFDO0FBQUEsSUFFL0IsSUFBSSxJQUFJLFFBQVEsUUFBUTtBQUFBLElBQ3hCLElBQUksSUFBSTtBQUFBLE1BQ04sS0FBSztBQUFBLElBQ1AsT0FBTztBQUFBO0FBQUEsRUFHVCxTQUFTLFNBQVMsQ0FBQyxJQUFJLElBQUk7QUFBQSxJQUN6QixJQUFJLFFBQVEsVUFBVSxJQUFJLElBQUksRUFBRTtBQUFBLElBQ2hDLElBQUksUUFBUSxVQUFVLElBQUksSUFBSSxFQUFFO0FBQUEsSUFDaEMsSUFBSSxRQUFRLFVBQVUsSUFBSSxJQUFJLENBQUM7QUFBQSxJQUUvQixJQUFJLElBQUksUUFBUSxRQUFRO0FBQUEsSUFDeEIsSUFBSSxJQUFJO0FBQUEsTUFDTixLQUFLO0FBQUEsSUFDUCxPQUFPO0FBQUE7QUFBQSxFQUdULFNBQVMsU0FBUyxDQUFDLElBQUksSUFBSTtBQUFBLElBQ3pCLElBQUksUUFBUSxVQUFVLElBQUksSUFBSSxFQUFFO0FBQUEsSUFDaEMsSUFBSSxRQUFRLFVBQVUsSUFBSSxJQUFJLEVBQUU7QUFBQSxJQUNoQyxJQUFJLFFBQVEsVUFBVSxJQUFJLElBQUksQ0FBQztBQUFBLElBRS9CLElBQUksSUFBSSxRQUFRLFFBQVE7QUFBQSxJQUN4QixJQUFJLElBQUk7QUFBQSxNQUNOLEtBQUs7QUFBQSxJQUNQLE9BQU87QUFBQTtBQUFBLEVBR1QsU0FBUyxTQUFTLENBQUMsSUFBSSxJQUFJO0FBQUEsSUFDekIsSUFBSSxRQUFRLFVBQVUsSUFBSSxJQUFJLENBQUM7QUFBQSxJQUMvQixJQUFJLFFBQVEsVUFBVSxJQUFJLElBQUksQ0FBQztBQUFBLElBQy9CLElBQUksUUFBUSxTQUFTLElBQUksSUFBSSxDQUFDO0FBQUEsSUFFOUIsSUFBSSxJQUFJLFFBQVEsUUFBUTtBQUFBLElBQ3hCLElBQUksSUFBSTtBQUFBLE1BQ04sS0FBSztBQUFBLElBQ1AsT0FBTztBQUFBO0FBQUEsRUFHVCxTQUFTLFNBQVMsQ0FBQyxJQUFJLElBQUk7QUFBQSxJQUN6QixJQUFJLFFBQVEsVUFBVSxJQUFJLElBQUksQ0FBQztBQUFBLElBQy9CLElBQUksUUFBUSxVQUFVLElBQUksSUFBSSxDQUFDO0FBQUEsSUFDL0IsSUFBSSxRQUFRLFNBQVMsSUFBSSxJQUFJLENBQUM7QUFBQSxJQUU5QixJQUFJLElBQUksUUFBUSxRQUFRO0FBQUEsSUFDeEIsSUFBSSxJQUFJO0FBQUEsTUFDTixLQUFLO0FBQUEsSUFDUCxPQUFPO0FBQUE7QUFBQSxFQUdULFNBQVMsU0FBUyxDQUFDLElBQUksSUFBSTtBQUFBLElBQ3pCLElBQUksUUFBUSxVQUFVLElBQUksSUFBSSxFQUFFO0FBQUEsSUFDaEMsSUFBSSxRQUFRLFVBQVUsSUFBSSxJQUFJLEVBQUU7QUFBQSxJQUNoQyxJQUFJLFFBQVEsU0FBUyxJQUFJLElBQUksQ0FBQztBQUFBLElBRTlCLElBQUksSUFBSSxRQUFRLFFBQVE7QUFBQSxJQUN4QixJQUFJLElBQUk7QUFBQSxNQUNOLEtBQUs7QUFBQSxJQUNQLE9BQU87QUFBQTtBQUFBLEVBR1QsU0FBUyxTQUFTLENBQUMsSUFBSSxJQUFJO0FBQUEsSUFDekIsSUFBSSxRQUFRLFVBQVUsSUFBSSxJQUFJLEVBQUU7QUFBQSxJQUNoQyxJQUFJLFFBQVEsVUFBVSxJQUFJLElBQUksRUFBRTtBQUFBLElBQ2hDLElBQUksUUFBUSxTQUFTLElBQUksSUFBSSxDQUFDO0FBQUEsSUFFOUIsSUFBSSxJQUFJLFFBQVEsUUFBUTtBQUFBLElBQ3hCLElBQUksSUFBSTtBQUFBLE1BQ04sS0FBSztBQUFBLElBQ1AsT0FBTztBQUFBO0FBQUE7Ozs7RUN0VVQsSUFBSTtBQUFBLEVBRUosSUFBSTtBQUFBLEVBRUosU0FBUyxNQUFNLEdBQUc7QUFBQSxJQUNoQixNQUFNLGdCQUFnQjtBQUFBLE1BQ3BCLE9BQU8sSUFBSTtBQUFBLElBRWIsT0FBTyxLQUFLLElBQUk7QUFBQSxJQUNoQixLQUFLLElBQUk7QUFBQSxNQUNQO0FBQUEsTUFBWTtBQUFBLE1BQ1o7QUFBQSxNQUFZO0FBQUEsTUFDWjtBQUFBLE1BQVk7QUFBQSxNQUNaO0FBQUEsTUFBWTtBQUFBLE1BQ1o7QUFBQSxNQUFZO0FBQUEsTUFDWjtBQUFBLE1BQVk7QUFBQSxNQUNaO0FBQUEsTUFBWTtBQUFBLE1BQ1o7QUFBQSxNQUFZO0FBQUEsSUFBVztBQUFBO0FBQUEsRUFFM0IsTUFBTSxTQUFTLFFBQVEsTUFBTTtBQUFBLEVBQzdCLE9BQU8sVUFBVTtBQUFBLEVBRWpCLE9BQU8sWUFBWTtBQUFBLEVBQ25CLE9BQU8sVUFBVTtBQUFBLEVBQ2pCLE9BQU8sZUFBZTtBQUFBLEVBQ3RCLE9BQU8sWUFBWTtBQUFBLEVBRW5CLE9BQU8sVUFBVSxVQUFVLFNBQVMsTUFBTSxDQUFDLEtBQUs7QUFBQSxJQUM5QyxJQUFJLFFBQVE7QUFBQSxNQUNWLE9BQU8sTUFBTSxRQUFRLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxHQUFHLEtBQUs7QUFBQSxJQUUvQztBQUFBLGFBQU8sTUFBTSxRQUFRLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxHQUFHLEtBQUs7QUFBQTtBQUFBOzs7O0VDL0IzQztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTs7OztFQ0pSLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUVKLElBQUksU0FBUyxNQUFNO0FBQUEsRUFDbkIsSUFBSSxRQUFRLE1BQU07QUFBQSxFQUNsQixJQUFJLFVBQVUsTUFBTTtBQUFBLEVBQ3BCLElBQUksVUFBVSxNQUFNO0FBQUEsRUFDcEIsSUFBSSxZQUFZLE9BQU87QUFBQSxFQUV2QixTQUFTLFNBQVMsR0FBRztBQUFBLElBQ25CLE1BQU0sZ0JBQWdCO0FBQUEsTUFDcEIsT0FBTyxJQUFJO0FBQUEsSUFFYixVQUFVLEtBQUssSUFBSTtBQUFBLElBRW5CLEtBQUssSUFBSSxDQUFFLFlBQVksWUFBWSxZQUFZLFdBQVksVUFBVztBQUFBLElBQ3RFLEtBQUssU0FBUztBQUFBO0FBQUEsRUFFaEIsTUFBTSxTQUFTLFdBQVcsU0FBUztBQUFBLEVBQzNCLG9CQUFZO0FBQUEsRUFFcEIsVUFBVSxZQUFZO0FBQUEsRUFDdEIsVUFBVSxVQUFVO0FBQUEsRUFDcEIsVUFBVSxlQUFlO0FBQUEsRUFDekIsVUFBVSxZQUFZO0FBQUEsRUFFdEIsVUFBVSxVQUFVLFVBQVUsU0FBUyxNQUFNLENBQUMsS0FBSyxPQUFPO0FBQUEsSUFDeEQsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBQ2YsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBQ2YsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBQ2YsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBQ2YsSUFBSSxJQUFJLEtBQUssRUFBRTtBQUFBLElBQ2YsSUFBSSxLQUFLO0FBQUEsSUFDVCxJQUFJLEtBQUs7QUFBQSxJQUNULElBQUksS0FBSztBQUFBLElBQ1QsSUFBSSxLQUFLO0FBQUEsSUFDVCxJQUFJLEtBQUs7QUFBQSxJQUNULFNBQVMsSUFBSSxFQUFHLElBQUksSUFBSSxLQUFLO0FBQUEsTUFDM0IsSUFBSSxJQUFJLE1BQ04sT0FDRSxRQUFRLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLEtBQUssUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUNqRCxFQUFFLEVBQUUsR0FDTixDQUFDO0FBQUEsTUFDSCxJQUFJO0FBQUEsTUFDSixJQUFJO0FBQUEsTUFDSixJQUFJLE9BQU8sR0FBRyxFQUFFO0FBQUEsTUFDaEIsSUFBSTtBQUFBLE1BQ0osSUFBSTtBQUFBLE1BQ0osSUFBSSxNQUNGLE9BQ0UsUUFBUSxJQUFJLEVBQUUsS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLEdBQUcsSUFBSSxHQUFHLEtBQUssUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUM1RCxHQUFHLEVBQUUsR0FDUCxFQUFFO0FBQUEsTUFDSixLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLLE9BQU8sSUFBSSxFQUFFO0FBQUEsTUFDbEIsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLElBQ1A7QUFBQSxJQUNBLElBQUksUUFBUSxLQUFLLEVBQUUsSUFBSSxHQUFHLEVBQUU7QUFBQSxJQUM1QixLQUFLLEVBQUUsS0FBSyxRQUFRLEtBQUssRUFBRSxJQUFJLEdBQUcsRUFBRTtBQUFBLElBQ3BDLEtBQUssRUFBRSxLQUFLLFFBQVEsS0FBSyxFQUFFLElBQUksR0FBRyxFQUFFO0FBQUEsSUFDcEMsS0FBSyxFQUFFLEtBQUssUUFBUSxLQUFLLEVBQUUsSUFBSSxHQUFHLEVBQUU7QUFBQSxJQUNwQyxLQUFLLEVBQUUsS0FBSyxRQUFRLEtBQUssRUFBRSxJQUFJLEdBQUcsRUFBRTtBQUFBLElBQ3BDLEtBQUssRUFBRSxLQUFLO0FBQUE7QUFBQSxFQUdkLFVBQVUsVUFBVSxVQUFVLFNBQVMsTUFBTSxDQUFDLEtBQUs7QUFBQSxJQUNqRCxJQUFJLFFBQVE7QUFBQSxNQUNWLE9BQU8sTUFBTSxRQUFRLEtBQUssR0FBRyxRQUFRO0FBQUEsSUFFckM7QUFBQSxhQUFPLE1BQU0sUUFBUSxLQUFLLEdBQUcsUUFBUTtBQUFBO0FBQUEsRUFHekMsU0FBUyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRztBQUFBLElBQ3JCLElBQUksS0FBSztBQUFBLE1BQ1AsT0FBTyxJQUFJLElBQUk7QUFBQSxJQUNaLFNBQUksS0FBSztBQUFBLE1BQ1osT0FBUSxJQUFJLEtBQVEsSUFBSztBQUFBLElBQ3RCLFNBQUksS0FBSztBQUFBLE1BQ1osUUFBUSxLQUFNLEtBQU07QUFBQSxJQUNqQixTQUFJLEtBQUs7QUFBQSxNQUNaLE9BQVEsSUFBSSxJQUFNLEtBQU07QUFBQSxJQUV4QjtBQUFBLGFBQU8sS0FBSyxLQUFNO0FBQUE7QUFBQSxFQUd0QixTQUFTLENBQUMsQ0FBQyxHQUFHO0FBQUEsSUFDWixJQUFJLEtBQUs7QUFBQSxNQUNQLE9BQU87QUFBQSxJQUNKLFNBQUksS0FBSztBQUFBLE1BQ1osT0FBTztBQUFBLElBQ0osU0FBSSxLQUFLO0FBQUEsTUFDWixPQUFPO0FBQUEsSUFDSixTQUFJLEtBQUs7QUFBQSxNQUNaLE9BQU87QUFBQSxJQUVQO0FBQUEsYUFBTztBQUFBO0FBQUEsRUFHWCxTQUFTLEVBQUUsQ0FBQyxHQUFHO0FBQUEsSUFDYixJQUFJLEtBQUs7QUFBQSxNQUNQLE9BQU87QUFBQSxJQUNKLFNBQUksS0FBSztBQUFBLE1BQ1osT0FBTztBQUFBLElBQ0osU0FBSSxLQUFLO0FBQUEsTUFDWixPQUFPO0FBQUEsSUFDSixTQUFJLEtBQUs7QUFBQSxNQUNaLE9BQU87QUFBQSxJQUVQO0FBQUEsYUFBTztBQUFBO0FBQUEsRUFHWCxJQUFJLElBQUk7QUFBQSxJQUNOO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFDbEQ7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUNuRDtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQ2xEO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDbkQ7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxFQUNwRDtBQUFBLEVBRUEsSUFBSSxLQUFLO0FBQUEsSUFDUDtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQ2xEO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDbkQ7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUNsRDtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQ2xEO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsRUFDcEQ7QUFBQSxFQUVBLElBQUksSUFBSTtBQUFBLElBQ047QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUNyRDtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQ3BEO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFDckQ7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUNwRDtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLEVBQ3ZEO0FBQUEsRUFFQSxJQUFJLEtBQUs7QUFBQSxJQUNQO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFDckQ7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUNwRDtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQ3JEO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFDckQ7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUk7QUFBQSxJQUFHO0FBQUEsSUFBSTtBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFJO0FBQUEsSUFBSTtBQUFBLElBQUk7QUFBQSxFQUN0RDtBQUFBOzs7O0VDL0lBLElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUVKLFNBQVMsSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLO0FBQUEsSUFDNUIsTUFBTSxnQkFBZ0I7QUFBQSxNQUNwQixPQUFPLElBQUksS0FBSyxNQUFNLEtBQUssR0FBRztBQUFBLElBQ2hDLEtBQUssT0FBTztBQUFBLElBQ1osS0FBSyxZQUFZLEtBQUssWUFBWTtBQUFBLElBQ2xDLEtBQUssVUFBVSxLQUFLLFVBQVU7QUFBQSxJQUM5QixLQUFLLFFBQVE7QUFBQSxJQUNiLEtBQUssUUFBUTtBQUFBLElBRWIsS0FBSyxNQUFNLE1BQU0sUUFBUSxLQUFLLEdBQUcsQ0FBQztBQUFBO0FBQUEsRUFFcEMsT0FBTyxVQUFVO0FBQUEsRUFFakIsS0FBSyxVQUFVLFFBQVEsU0FBUyxJQUFJLENBQUMsS0FBSztBQUFBLElBRXhDLElBQUksSUFBSSxTQUFTLEtBQUs7QUFBQSxNQUNwQixNQUFNLElBQUksS0FBSyxLQUFLLEVBQUUsT0FBTyxHQUFHLEVBQUUsT0FBTztBQUFBLElBQzNDLE9BQU8sSUFBSSxVQUFVLEtBQUssU0FBUztBQUFBLElBR25DLFNBQVMsSUFBSSxJQUFJLE9BQVEsSUFBSSxLQUFLLFdBQVc7QUFBQSxNQUMzQyxJQUFJLEtBQUssQ0FBQztBQUFBLElBRVosS0FBSyxJQUFJLEVBQUcsSUFBSSxJQUFJLFFBQVE7QUFBQSxNQUMxQixJQUFJLE1BQU07QUFBQSxJQUNaLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxFQUFFLE9BQU8sR0FBRztBQUFBLElBR3ZDLEtBQUssSUFBSSxFQUFHLElBQUksSUFBSSxRQUFRO0FBQUEsTUFDMUIsSUFBSSxNQUFNO0FBQUEsSUFDWixLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssRUFBRSxPQUFPLEdBQUc7QUFBQTtBQUFBLEVBR3pDLEtBQUssVUFBVSxTQUFTLFNBQVMsTUFBTSxDQUFDLEtBQUssS0FBSztBQUFBLElBQ2hELEtBQUssTUFBTSxPQUFPLEtBQUssR0FBRztBQUFBLElBQzFCLE9BQU87QUFBQTtBQUFBLEVBR1QsS0FBSyxVQUFVLFNBQVMsU0FBUyxNQUFNLENBQUMsS0FBSztBQUFBLElBQzNDLEtBQUssTUFBTSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFBQSxJQUNyQyxPQUFPLEtBQUssTUFBTSxPQUFPLEdBQUc7QUFBQTtBQUFBOzs7O0VDN0M5QixJQUFJLE9BQU87QUFBQSxFQUVYLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUdMLEtBQUssT0FBTyxLQUFLLElBQUk7QUFBQSxFQUNyQixLQUFLLFNBQVMsS0FBSyxJQUFJO0FBQUEsRUFDdkIsS0FBSyxTQUFTLEtBQUssSUFBSTtBQUFBLEVBQ3ZCLEtBQUssU0FBUyxLQUFLLElBQUk7QUFBQSxFQUN2QixLQUFLLFNBQVMsS0FBSyxJQUFJO0FBQUEsRUFDdkIsS0FBSyxZQUFZLEtBQUssT0FBTztBQUFBOzs7O0VDZDdCLE9BQU8sVUFBVTtBQUFBLElBQ2YsU0FBUztBQUFBLE1BQ1AsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLFFBQ047QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUs7QUFBQSxNQUNILEtBQUs7QUFBQSxNQUNMLFFBQVE7QUFBQSxRQUNOO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsUUFDQTtBQUFBLFVBQ0U7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7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
diff --git a/packages/eve-web/build/api/auth/index.js b/packages/eve-web/build/api/auth/index.js
deleted file mode 100644
index c89c2f8..0000000
--- a/packages/eve-web/build/api/auth/index.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// @bun
-var __create = Object.create;
-var __getProtoOf = Object.getPrototypeOf;
-var __defProp = Object.defineProperty;
-var __getOwnPropNames = Object.getOwnPropertyNames;
-var __hasOwnProp = Object.prototype.hasOwnProperty;
-var __toESM = (mod, isNodeMode, target) => {
- target = mod != null ? __create(__getProtoOf(mod)) : {};
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
- for (let key of __getOwnPropNames(mod))
- if (!__hasOwnProp.call(to, key))
- __defProp(to, key, {
- get: () => mod[key],
- enumerable: true
- });
- return to;
-};
-var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
-var __require = import.meta.require;
-
-// src/api/auth/index.ts
-function GET(request) {
- const eveauth = request.store.get("eveauth");
- return eveauth.redirect();
-}
-export {
- GET
-};
-
-//# debugId=2B9DFE71D16A520B64756E2164756E21
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXHNyY1xcYXBpXFxhdXRoXFxpbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSAnYnJpc2EnO1xuaW1wb3J0IHR5cGUgeyBFVkVBdXRoIH0gZnJvbSAnQC9taWRkbGV3YXJlJztcblxuLy8gR0VUIC9hcGkvYXV0aC9cbmV4cG9ydCBmdW5jdGlvbiBHRVQocmVxdWVzdDogUmVxdWVzdENvbnRleHQpIHtcbiAgY29uc3QgZXZlYXV0aDogRVZFQXV0aCA9ICByZXF1ZXN0LnN0b3JlLmdldCgnZXZlYXV0aCcpO1xuICByZXR1cm4gZXZlYXV0aC5yZWRpcmVjdCgpO1xufSIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlPLFNBQVMsR0FBRyxDQUFDLFNBQXlCO0FBQUEsRUFDM0MsTUFBTSxVQUFvQixRQUFRLE1BQU0sSUFBSSxTQUFTO0FBQUEsRUFDckQsT0FBTyxRQUFRLFNBQVM7QUFBQTsiLAogICJkZWJ1Z0lkIjogIjJCOURGRTcxRDE2QTUyMEI2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
diff --git a/packages/eve-web/build/css-files.js b/packages/eve-web/build/css-files.js
deleted file mode 100644
index 266ddcf..0000000
--- a/packages/eve-web/build/css-files.js
+++ /dev/null
@@ -1 +0,0 @@
-export default ["style-4253422825010316650.css","style-4799912372787954844.css","style-16814944961881043919.css"]
\ No newline at end of file
diff --git a/packages/eve-web/build/layout/index.js b/packages/eve-web/build/layout/index.js
deleted file mode 100644
index 44aee51..0000000
--- a/packages/eve-web/build/layout/index.js
+++ /dev/null
@@ -1,18297 +0,0 @@
-// @bun
-var __create = Object.create;
-var __getProtoOf = Object.getPrototypeOf;
-var __defProp = Object.defineProperty;
-var __getOwnPropNames = Object.getOwnPropertyNames;
-var __hasOwnProp = Object.prototype.hasOwnProperty;
-var __toESM = (mod, isNodeMode, target) => {
- target = mod != null ? __create(__getProtoOf(mod)) : {};
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
- for (let key of __getOwnPropNames(mod))
- if (!__hasOwnProp.call(to, key))
- __defProp(to, key, {
- get: () => mod[key],
- enumerable: true
- });
- return to;
-};
-var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
-var __require = import.meta.require;
-
-// ../eve/node_modules/safe-buffer/index.js
-var require_safe_buffer = __commonJS((exports, module) => {
- /*! safe-buffer. MIT License. Feross Aboukhadijeh